From 153d10194f536ba2d7725100094d3594454460a6 Mon Sep 17 00:00:00 2001 From: "vincent@cubedesigners.com" Date: Wed, 14 Oct 2020 16:32:24 +0000 Subject: [PATCH] wip #3931 @3 --- .../tools/swftools-special-swfdump/AUTHORS | 24 - .../tools/swftools-special-swfdump/COPYING | 340 - .../tools/swftools-special-swfdump/ChangeLog | 296 - .../tools/swftools-special-swfdump/INSTALL | 180 - .../tools/swftools-special-swfdump/Makefile | 41 - .../swftools-special-swfdump/Makefile.common | 88 - .../Makefile.common.in | 88 - .../swftools-special-swfdump/Makefile.in | 41 - .../tools/swftools-special-swfdump/_pypath.py | 4 - .../swftools-special-swfdump/_pypath.txt | 1 - .../swftools-special-swfdump/avi2swf/Makefile | 1 - .../avi2swf/Makefile.in | 41 - .../avi2swf/avi2swf.1 | 59 - .../avi2swf/avi2swf.cc | 347 - .../swftools-special-swfdump/avi2swf/v2swf.c | 1080 - .../swftools-special-swfdump/avi2swf/v2swf.h | 46 - .../avi2swf/videoreader.h | 34 - .../avi2swf/videoreader_avifile.cc | 354 - .../avi2swf/videoreader_avifile.hh | 29 - .../avi2swf/videoreader_vfw.cc | 401 - .../avi2swf/videoreader_vfw.hh | 29 - .../swftools-special-swfdump/config.guess | 1545 - .../tools/swftools-special-swfdump/config.h | 299 - .../swftools-special-swfdump/config.h.in | 298 - .../tools/swftools-special-swfdump/config.log | 2805 -- .../swftools-special-swfdump/config.status | 1121 - .../tools/swftools-special-swfdump/config.sub | 1676 - .../tools/swftools-special-swfdump/configure | 8672 ----- .../swftools-special-swfdump/configure.in | 631 - .../doc/fileformat.sc | 393 - .../tools/swftools-special-swfdump/install-sh | 251 - .../swftools-special-swfdump/lib/Makefile | 201 - .../swftools-special-swfdump/lib/Makefile.in | 201 - .../lib/action/Makefile | 95 - .../lib/action/Makefile.in | 95 - .../lib/action/action.h | 119 - .../lib/action/actioncompiler.c | 102 - .../lib/action/actioncompiler.h | 7 - .../lib/action/assembler.c | 131 - .../lib/action/assembler.h | 21 - .../lib/action/blocks/error.h | 0 .../lib/action/compile.c | 786 - .../lib/action/compile.h | 163 - .../lib/action/lex.swf4.c | 2828 -- .../lib/action/lex.swf5.c | 3203 -- .../lib/action/libming.c | 9 - .../lib/action/libming.h | 15 - .../lib/action/listaction.c | 557 - .../lib/action/ming.h | 1 - .../lib/action/swf4compiler.flex | 403 - .../lib/action/swf4compiler.tab.c | 3431 -- .../lib/action/swf4compiler.tab.h | 136 - .../lib/action/swf4compiler.y | 1039 - .../lib/action/swf5compiler.flex | 467 - .../lib/action/swf5compiler.tab.c | 5695 ---- .../lib/action/swf5compiler.tab.h | 344 - .../lib/action/swf5compiler.y | 1698 - .../tools/swftools-special-swfdump/lib/args.h | 250 - .../swftools-special-swfdump/lib/as3/abc.c | 1347 - .../swftools-special-swfdump/lib/as3/abc.h | 229 - .../swftools-special-swfdump/lib/as3/assets.c | 216 - .../swftools-special-swfdump/lib/as3/assets.h | 18 - .../lib/as3/builtin.c | 8951 ------ .../lib/as3/builtin.h | 33 - .../swftools-special-swfdump/lib/as3/code.c | 1289 - .../swftools-special-swfdump/lib/as3/code.h | 109 - .../swftools-special-swfdump/lib/as3/common.c | 85 - .../swftools-special-swfdump/lib/as3/common.h | 39 - .../lib/as3/compiler.c | 369 - .../lib/as3/compiler.h | 48 - .../swftools-special-swfdump/lib/as3/expr.c | 2904 -- .../swftools-special-swfdump/lib/as3/expr.h | 149 - .../swftools-special-swfdump/lib/as3/files.c | 327 - .../swftools-special-swfdump/lib/as3/files.h | 48 - .../swftools-special-swfdump/lib/as3/import.c | 458 - .../swftools-special-swfdump/lib/as3/import.h | 30 - .../lib/as3/initcode.c | 271 - .../lib/as3/initcode.h | 44 - .../lib/as3/opcodes.c | 1008 - .../lib/as3/opcodes.h | 531 - .../swftools-special-swfdump/lib/as3/parser.h | 36 - .../lib/as3/parser.tab.c | 7539 ----- .../lib/as3/parser.tab.h | 208 - .../lib/as3/parser_help.c | 1435 - .../lib/as3/parser_help.h | 132 - .../swftools-special-swfdump/lib/as3/pool.c | 1403 - .../swftools-special-swfdump/lib/as3/pool.h | 217 - .../lib/as3/registry.c | 596 - .../lib/as3/registry.h | 231 - .../lib/as3/scripts.c | 299 - .../lib/as3/scripts.h | 30 - .../swftools-special-swfdump/lib/as3/state.c | 95 - .../swftools-special-swfdump/lib/as3/state.h | 108 - .../lib/as3/tokenizer.h | 98 - .../lib/as3/tokenizer.yy.c | 4232 --- .../swftools-special-swfdump/lib/base64.c | 65 - .../swftools-special-swfdump/lib/base64.h | 25 - .../swftools-special-swfdump/lib/bitio.c | 871 - .../swftools-special-swfdump/lib/bitio.h | 120 - .../lib/devices/bbox.c | 178 - .../lib/devices/bbox.h | 38 - .../lib/devices/dummy.c | 157 - .../lib/devices/dummy.h | 37 - .../lib/devices/file.c | 251 - .../lib/devices/file.h | 38 - .../lib/devices/ocr.c | 262 - .../lib/devices/ocr.h | 37 - .../lib/devices/opengl.c | 626 - .../lib/devices/opengl.h | 38 - .../lib/devices/ops.c | 195 - .../lib/devices/ops.h | 38 - .../lib/devices/pdf.c | 597 - .../lib/devices/pdf.h | 37 - .../lib/devices/polyops.c | 443 - .../lib/devices/polyops.h | 40 - .../lib/devices/record.c | 1016 - .../lib/devices/record.h | 45 - .../lib/devices/render.c | 1084 - .../lib/devices/render.h | 39 - .../lib/devices/rescale.c | 340 - .../lib/devices/rescale.h | 47 - .../lib/devices/swf.c | 3178 -- .../lib/devices/swf.h | 37 - .../lib/devices/text.c | 255 - .../lib/devices/text.h | 37 - .../swftools-special-swfdump/lib/drawer.c | 390 - .../swftools-special-swfdump/lib/drawer.h | 52 - .../lib/filters/alpha.c | 117 - .../lib/filters/one_big_font.c | 117 - .../lib/filters/remove_font_transforms.c | 326 - .../lib/filters/vectors_to_glyphs.c | 165 - .../swftools-special-swfdump/lib/gfxdevice.h | 139 - .../swftools-special-swfdump/lib/gfxfilter.c | 442 - .../swftools-special-swfdump/lib/gfxfilter.h | 107 - .../swftools-special-swfdump/lib/gfxfont.c | 770 - .../swftools-special-swfdump/lib/gfxfont.h | 46 - .../swftools-special-swfdump/lib/gfximage.c | 502 - .../swftools-special-swfdump/lib/gfximage.h | 15 - .../swftools-special-swfdump/lib/gfxpoly.c | 1174 - .../swftools-special-swfdump/lib/gfxpoly.h | 64 - .../lib/gfxpoly/active.c | 693 - .../lib/gfxpoly/active.h | 30 - .../lib/gfxpoly/convert.c | 550 - .../lib/gfxpoly/convert.h | 30 - .../lib/gfxpoly/heap.h | 74 - .../lib/gfxpoly/poly.c | 1608 - .../lib/gfxpoly/poly.h | 114 - .../lib/gfxpoly/renderpoly.c | 400 - .../lib/gfxpoly/renderpoly.h | 24 - .../lib/gfxpoly/stroke.c | 233 - .../lib/gfxpoly/stroke.h | 7 - .../lib/gfxpoly/wind.c | 138 - .../lib/gfxpoly/wind.h | 41 - .../lib/gfxpoly/xrow.c | 101 - .../lib/gfxpoly/xrow.h | 25 - .../swftools-special-swfdump/lib/gfxsource.h | 71 - .../swftools-special-swfdump/lib/gfxtools.c | 1274 - .../swftools-special-swfdump/lib/gfxtools.h | 124 - .../swftools-special-swfdump/lib/gocr/box.c | 369 - .../lib/gocr/database.c | 451 - .../lib/gocr/detect.c | 943 - .../swftools-special-swfdump/lib/gocr/gocr.h | 286 - .../swftools-special-swfdump/lib/gocr/job.c | 86 - .../swftools-special-swfdump/lib/gocr/lines.c | 348 - .../swftools-special-swfdump/lib/gocr/list.c | 334 - .../swftools-special-swfdump/lib/gocr/list.h | 90 - .../swftools-special-swfdump/lib/gocr/ocr0.c | 6591 ---- .../swftools-special-swfdump/lib/gocr/ocr0.h | 63 - .../swftools-special-swfdump/lib/gocr/ocr0n.c | 1254 - .../swftools-special-swfdump/lib/gocr/ocr1.c | 84 - .../swftools-special-swfdump/lib/gocr/ocr1.h | 3 - .../swftools-special-swfdump/lib/gocr/otsu.c | 284 - .../swftools-special-swfdump/lib/gocr/otsu.h | 23 - .../lib/gocr/output.c | 193 - .../lib/gocr/output.h | 36 - .../lib/gocr/pgm2asc.c | 2875 -- .../lib/gocr/pgm2asc.h | 106 - .../swftools-special-swfdump/lib/gocr/pixel.c | 537 - .../swftools-special-swfdump/lib/gocr/pnm.h | 24 - .../lib/gocr/progress.c | 87 - .../lib/gocr/progress.h | 42 - .../lib/gocr/remove.c | 687 - .../lib/gocr/unicode.c | 1314 - .../lib/gocr/unicode.h | 1257 - .../swftools-special-swfdump/lib/graphcut.c | 679 - .../swftools-special-swfdump/lib/graphcut.h | 60 - .../swftools-special-swfdump/lib/h.263/dct.c | 199 - .../swftools-special-swfdump/lib/h.263/dct.h | 31 - .../lib/h.263/h263tables.c | 308 - .../lib/h.263/h263tables.h | 59 - .../lib/h.263/swfvideo.c | 1645 - .../tools/swftools-special-swfdump/lib/jpeg.c | 485 - .../tools/swftools-special-swfdump/lib/jpeg.h | 22 - .../swftools-special-swfdump/lib/kdtree.c | 507 - .../swftools-special-swfdump/lib/kdtree.h | 98 - .../tools/swftools-special-swfdump/lib/log.c | 221 - .../tools/swftools-special-swfdump/lib/log.h | 62 - .../tools/swftools-special-swfdump/lib/mem.c | 99 - .../tools/swftools-special-swfdump/lib/mem.h | 27 - .../lib/modules/swfaction.c | 1137 - .../lib/modules/swfalignzones.c | 366 - .../lib/modules/swfbits.c | 1266 - .../lib/modules/swfbutton.c | 148 - .../lib/modules/swfcgi.c | 193 - .../lib/modules/swfdraw.c | 221 - .../lib/modules/swfdump.c | 275 - .../lib/modules/swffilter.c | 170 - .../lib/modules/swffont.c | 605 - .../lib/modules/swfobject.c | 221 - .../lib/modules/swfrender.c | 1352 - .../lib/modules/swfshape.c | 1124 - .../lib/modules/swfsound.c | 333 - .../lib/modules/swftext.c | 2162 -- .../lib/modules/swftools.c | 1388 - .../tools/swftools-special-swfdump/lib/mp3.c | 236 - .../tools/swftools-special-swfdump/lib/mp3.h | 19 - .../swftools-special-swfdump/lib/old_rfxswf.h | 41 - .../tools/swftools-special-swfdump/lib/os.c | 325 - .../tools/swftools-special-swfdump/lib/os.h | 59 - .../lib/pdf/BitmapOutputDev.cc | 2071 -- .../lib/pdf/BitmapOutputDev.h | 236 - .../lib/pdf/CharOutputDev.cc | 1305 - .../lib/pdf/CharOutputDev.h | 118 - .../lib/pdf/CommonOutputDev.cc | 153 - .../lib/pdf/CommonOutputDev.h | 109 - .../lib/pdf/FullBitmapOutputDev.cc | 575 - .../lib/pdf/FullBitmapOutputDev.h | 187 - .../lib/pdf/InfoOutputDev.cc | 965 - .../lib/pdf/InfoOutputDev.h | 203 - .../swftools-special-swfdump/lib/pdf/Makefile | 217 - .../lib/pdf/Makefile.in | 217 - .../lib/pdf/VectorGraphicOutputDev.cc | 1730 - .../lib/pdf/VectorGraphicOutputDev.h | 219 - .../lib/pdf/XMLOutputDev.cc | 160 - .../lib/pdf/XMLOutputDev.h | 35 - .../swftools-special-swfdump/lib/pdf/aconf.h | 28 - .../swftools-special-swfdump/lib/pdf/bbox.c | 481 - .../swftools-special-swfdump/lib/pdf/bbox.h | 23 - .../swftools-special-swfdump/lib/pdf/cmyk.cc | 661 - .../swftools-special-swfdump/lib/pdf/cmyk.h | 4 - .../swftools-special-swfdump/lib/pdf/fonts.c | 26585 ---------------- .../swftools-special-swfdump/lib/pdf/fonts.h | 69 - .../swftools-special-swfdump/lib/pdf/pdf.cc | 606 - .../swftools-special-swfdump/lib/pdf/pdf.h | 37 - .../lib/pdf/pdf2jpeg.c | 163 - .../lib/pdf/popplercompat.cc | 52 - .../lib/pdf/popplercompat.h | 69 - .../lib/pdf/xpdf/Annot.cc | 1556 - .../lib/pdf/xpdf/Annot.h | 142 - .../lib/pdf/xpdf/Array.cc | 73 - .../lib/pdf/xpdf/Array.h | 58 - .../lib/pdf/xpdf/BuiltinFont.cc | 65 - .../lib/pdf/xpdf/BuiltinFont.h | 57 - .../lib/pdf/xpdf/BuiltinFontTables.cc | 4284 --- .../lib/pdf/xpdf/BuiltinFontTables.h | 23 - .../lib/pdf/xpdf/CMap.cc | 408 - .../lib/pdf/xpdf/CMap.h | 102 - .../lib/pdf/xpdf/Catalog.cc | 374 - .../lib/pdf/xpdf/Catalog.h | 97 - .../lib/pdf/xpdf/CharCodeToUnicode.cc | 553 - .../lib/pdf/xpdf/CharCodeToUnicode.h | 117 - .../lib/pdf/xpdf/CharTypes.h | 24 - .../lib/pdf/xpdf/Decrypt.cc | 777 - .../lib/pdf/xpdf/Decrypt.h | 95 - .../lib/pdf/xpdf/Dict.cc | 95 - .../lib/pdf/xpdf/Dict.h | 77 - .../lib/pdf/xpdf/Error.cc | 38 - .../lib/pdf/xpdf/Error.h | 23 - .../lib/pdf/xpdf/ErrorCodes.h | 36 - .../lib/pdf/xpdf/FoFiBase.cc | 156 - .../lib/pdf/xpdf/FoFiBase.h | 57 - .../lib/pdf/xpdf/FoFiEncodings.cc | 994 - .../lib/pdf/xpdf/FoFiEncodings.h | 36 - .../lib/pdf/xpdf/FoFiTrueType.cc | 2027 -- .../lib/pdf/xpdf/FoFiTrueType.h | 174 - .../lib/pdf/xpdf/FoFiType1.cc | 252 - .../lib/pdf/xpdf/FoFiType1.h | 59 - .../lib/pdf/xpdf/FoFiType1C.cc | 2603 -- .../lib/pdf/xpdf/FoFiType1C.h | 233 - .../lib/pdf/xpdf/FontEncodingTables.cc | 1824 -- .../lib/pdf/xpdf/FontEncodingTables.h | 20 - .../lib/pdf/xpdf/Function.cc | 1573 - .../lib/pdf/xpdf/Function.h | 229 - .../lib/pdf/xpdf/GHash.cc | 380 - .../lib/pdf/xpdf/GHash.h | 78 - .../lib/pdf/xpdf/GList.cc | 97 - .../lib/pdf/xpdf/GList.h | 96 - .../lib/pdf/xpdf/GMutex.h | 49 - .../lib/pdf/xpdf/GString.cc | 718 - .../lib/pdf/xpdf/GString.h | 136 - .../lib/pdf/xpdf/Gfx.cc | 4197 --- .../lib/pdf/xpdf/Gfx.h | 312 - .../lib/pdf/xpdf/GfxFont.cc | 1576 - .../lib/pdf/xpdf/GfxFont.h | 323 - .../lib/pdf/xpdf/GfxState.cc | 4172 --- .../lib/pdf/xpdf/GfxState.h | 1257 - .../lib/pdf/xpdf/GlobalParams.cc | 2980 -- .../lib/pdf/xpdf/GlobalParams.h | 467 - .../lib/pdf/xpdf/JArithmeticDecoder.cc | 322 - .../lib/pdf/xpdf/JArithmeticDecoder.h | 109 - .../lib/pdf/xpdf/JBIG2Stream.cc | 3726 --- .../lib/pdf/xpdf/JBIG2Stream.h | 149 - .../lib/pdf/xpdf/JPXStream.cc | 3154 -- .../lib/pdf/xpdf/JPXStream.h | 351 - .../lib/pdf/xpdf/Lexer.cc | 493 - .../lib/pdf/xpdf/Lexer.h | 80 - .../lib/pdf/xpdf/Link.cc | 782 - .../lib/pdf/xpdf/Link.h | 369 - .../lib/pdf/xpdf/NameToCharCode.cc | 116 - .../lib/pdf/xpdf/NameToCharCode.h | 42 - .../lib/pdf/xpdf/NameToUnicodeTable.h | 1097 - .../lib/pdf/xpdf/Object.cc | 231 - .../lib/pdf/xpdf/Object.h | 303 - .../lib/pdf/xpdf/Outline.cc | 151 - .../lib/pdf/xpdf/Outline.h | 76 - .../lib/pdf/xpdf/OutputDev.cc | 131 - .../lib/pdf/xpdf/OutputDev.h | 251 - .../lib/pdf/xpdf/PDFDoc.cc | 402 - .../lib/pdf/xpdf/PDFDoc.h | 183 - .../lib/pdf/xpdf/PDFDocEncoding.cc | 44 - .../lib/pdf/xpdf/PDFDocEncoding.h | 16 - .../lib/pdf/xpdf/PSTokenizer.cc | 135 - .../lib/pdf/xpdf/PSTokenizer.h | 41 - .../lib/pdf/xpdf/Page.cc | 441 - .../lib/pdf/xpdf/Page.h | 187 - .../lib/pdf/xpdf/Parser.cc | 227 - .../lib/pdf/xpdf/Parser.h | 59 - .../lib/pdf/xpdf/SecurityHandler.cc | 390 - .../lib/pdf/xpdf/SecurityHandler.h | 160 - .../lib/pdf/xpdf/Splash.cc | 3310 -- .../lib/pdf/xpdf/Splash.h | 293 - .../lib/pdf/xpdf/SplashBitmap.cc | 188 - .../lib/pdf/xpdf/SplashBitmap.h | 61 - .../lib/pdf/xpdf/SplashClip.cc | 382 - .../lib/pdf/xpdf/SplashClip.h | 107 - .../lib/pdf/xpdf/SplashErrorCodes.h | 32 - .../lib/pdf/xpdf/SplashFTFont.cc | 379 - .../lib/pdf/xpdf/SplashFTFont.h | 61 - .../lib/pdf/xpdf/SplashFTFontEngine.cc | 177 - .../lib/pdf/xpdf/SplashFTFontEngine.h | 65 - .../lib/pdf/xpdf/SplashFTFontFile.cc | 114 - .../lib/pdf/xpdf/SplashFTFontFile.h | 73 - .../lib/pdf/xpdf/SplashFont.cc | 184 - .../lib/pdf/xpdf/SplashFont.h | 110 - .../lib/pdf/xpdf/SplashFontEngine.cc | 317 - .../lib/pdf/xpdf/SplashFontEngine.h | 91 - .../lib/pdf/xpdf/SplashFontFile.cc | 53 - .../lib/pdf/xpdf/SplashFontFile.h | 60 - .../lib/pdf/xpdf/SplashFontFileID.cc | 23 - .../lib/pdf/xpdf/SplashFontFileID.h | 30 - .../lib/pdf/xpdf/SplashGlyphBitmap.h | 26 - .../lib/pdf/xpdf/SplashMath.h | 89 - .../lib/pdf/xpdf/SplashOutputDev.cc | 2846 -- .../lib/pdf/xpdf/SplashOutputDev.h | 248 - .../lib/pdf/xpdf/SplashPath.cc | 184 - .../lib/pdf/xpdf/SplashPath.h | 121 - .../lib/pdf/xpdf/SplashPattern.cc | 40 - .../lib/pdf/xpdf/SplashPattern.h | 65 - .../lib/pdf/xpdf/SplashScreen.cc | 385 - .../lib/pdf/xpdf/SplashScreen.h | 56 - .../lib/pdf/xpdf/SplashState.cc | 165 - .../lib/pdf/xpdf/SplashState.h | 103 - .../lib/pdf/xpdf/SplashT1Font.cc | 287 - .../lib/pdf/xpdf/SplashT1Font.h | 57 - .../lib/pdf/xpdf/SplashT1FontEngine.cc | 124 - .../lib/pdf/xpdf/SplashT1FontEngine.h | 53 - .../lib/pdf/xpdf/SplashT1FontFile.cc | 97 - .../lib/pdf/xpdf/SplashT1FontFile.h | 58 - .../lib/pdf/xpdf/SplashTypes.h | 132 - .../lib/pdf/xpdf/SplashXPath.cc | 438 - .../lib/pdf/xpdf/SplashXPath.h | 100 - .../lib/pdf/xpdf/SplashXPathScanner.cc | 428 - .../lib/pdf/xpdf/SplashXPathScanner.h | 87 - .../lib/pdf/xpdf/Stream-CCITT.h | 459 - .../lib/pdf/xpdf/Stream.cc | 4703 --- .../lib/pdf/xpdf/Stream.h | 861 - .../lib/pdf/xpdf/TextOutputDev.cc | 4090 --- .../lib/pdf/xpdf/TextOutputDev.h | 662 - .../lib/pdf/xpdf/UTF8.h | 56 - .../lib/pdf/xpdf/UnicodeMap.cc | 293 - .../lib/pdf/xpdf/UnicodeMap.h | 123 - .../lib/pdf/xpdf/UnicodeMapTables.h | 361 - .../lib/pdf/xpdf/UnicodeTypeTable.cc | 949 - .../lib/pdf/xpdf/UnicodeTypeTable.h | 20 - .../lib/pdf/xpdf/XRef.cc | 896 - .../lib/pdf/xpdf/XRef.h | 133 - .../lib/pdf/xpdf/config.h | 112 - .../lib/pdf/xpdf/gfile.cc | 777 - .../lib/pdf/xpdf/gfile.h | 141 - .../lib/pdf/xpdf/gmem.cc | 348 - .../lib/pdf/xpdf/gmem.h | 83 - .../lib/pdf/xpdf/gtypes.h | 29 - .../tools/swftools-special-swfdump/lib/png.c | 1711 - .../tools/swftools-special-swfdump/lib/png.h | 43 - .../lib/python/Makefile | 81 - .../lib/python/Makefile.in | 81 - .../swftools-special-swfdump/lib/python/SWF.c | 465 - .../lib/python/action.c | 115 - .../lib/python/action.h | 35 - .../swftools-special-swfdump/lib/python/gfx.c | 2016 -- .../lib/python/image.c | 160 - .../lib/python/image.h | 36 - .../lib/python/primitives.c | 655 - .../lib/python/primitives.h | 64 - .../lib/python/pyutils.c | 85 - .../lib/python/pyutils.h | 22 - .../swftools-special-swfdump/lib/python/tag.c | 390 - .../swftools-special-swfdump/lib/python/tag.h | 57 - .../lib/python/taglist.c | 332 - .../lib/python/taglist.h | 44 - .../lib/python/tagmap.c | 165 - .../lib/python/tagmap.h | 39 - .../lib/python/tags.c | 1229 - .../lib/python/tags.h | 32 - .../tools/swftools-special-swfdump/lib/q.c | 1689 - .../tools/swftools-special-swfdump/lib/q.h | 310 - .../lib/readers/Makefile | 25 - .../lib/readers/Makefile.in | 25 - .../lib/readers/image.c | 160 - .../lib/readers/image.h | 22 - .../lib/readers/swf.c | 770 - .../lib/readers/swf.h | 41 - .../swftools-special-swfdump/lib/rfxswf.c | 1937 -- .../swftools-special-swfdump/lib/rfxswf.h | 1209 - .../tools/swftools-special-swfdump/lib/ttf.c | 2470 -- .../tools/swftools-special-swfdump/lib/ttf.h | 214 - .../swftools-special-swfdump/lib/types.h | 68 - .../tools/swftools-special-swfdump/lib/utf8.c | 68 - .../tools/swftools-special-swfdump/lib/utf8.h | 15 - .../tools/swftools-special-swfdump/lib/wav.c | 293 - .../tools/swftools-special-swfdump/lib/wav.h | 26 - .../tools/swftools-special-swfdump/lib/xml.c | 382 - .../tools/swftools-special-swfdump/lib/xml.h | 42 - .../tools/swftools-special-swfdump/ltmain.sh | 6975 ---- .../swftools-special-swfdump/m4/Makefile | 24 - .../swftools-special-swfdump/m4/avi2swf.m4 | 124 - .../swftools-special-swfdump/m4/backticks.m4 | 30 - .../swftools-special-swfdump/m4/byteorder.m4 | 47 - .../swftools-special-swfdump/m4/fontconfig.m4 | 102 - .../swftools-special-swfdump/m4/freetype.m4 | 147 - .../swftools-special-swfdump/m4/gcc.2.95.m4 | 30 - .../swftools-special-swfdump/m4/mingw.m4 | 55 - .../swftools-special-swfdump/m4/python.m4 | 173 - .../tools/swftools-special-swfdump/m4/test.c | 0 .../tools/swftools-special-swfdump/missing | 198 - .../swftools-special-swfdump/mkinstalldirs | 40 - .../tools/swftools-special-swfdump/setup.py | 338 - .../swftools-special-swfdump/src/Makefile | 164 - .../swftools-special-swfdump/src/Makefile.in | 164 - .../swftools-special-swfdump/src/as3compile | Bin 813707 -> 0 bytes .../swftools-special-swfdump/src/as3compile.1 | 91 - .../swftools-special-swfdump/src/as3compile.c | 277 - .../swftools-special-swfdump/src/font2swf | Bin 819938 -> 0 bytes .../swftools-special-swfdump/src/font2swf.1 | 33 - .../swftools-special-swfdump/src/font2swf.c | 137 - .../swftools-special-swfdump/src/gif2swf.1 | 42 - .../swftools-special-swfdump/src/gif2swf.c | 702 - .../swftools-special-swfdump/src/jpeg2swf | Bin 147702 -> 0 bytes .../swftools-special-swfdump/src/jpeg2swf.1 | 62 - .../swftools-special-swfdump/src/jpeg2swf.c | 646 - .../swftools-special-swfdump/src/parser.h | 46 - .../swftools-special-swfdump/src/parser.lex | 332 - .../swftools-special-swfdump/src/parser.yy.c | 2287 -- .../swftools-special-swfdump/src/pdf2pdf.1 | 40 - .../swftools-special-swfdump/src/pdf2pdf.c | 267 - .../swftools-special-swfdump/src/pdf2swf | Bin 3422392 -> 0 bytes .../swftools-special-swfdump/src/pdf2swf.1 | 87 - .../swftools-special-swfdump/src/pdf2swf.c | 924 - .../swftools-special-swfdump/src/png2swf | Bin 144618 -> 0 bytes .../swftools-special-swfdump/src/png2swf.1 | 58 - .../swftools-special-swfdump/src/png2swf.c | 824 - .../swftools-special-swfdump/src/swfbbox | Bin 799921 -> 0 bytes .../swftools-special-swfdump/src/swfbbox.1 | 47 - .../swftools-special-swfdump/src/swfbbox.c | 702 - .../swftools-special-swfdump/src/swfbytes | Bin 83921 -> 0 bytes .../swftools-special-swfdump/src/swfbytes.1 | 26 - .../swftools-special-swfdump/src/swfbytes.c | 385 - .../tools/swftools-special-swfdump/src/swfc | Bin 1182650 -> 0 bytes .../src/swfc-feedback.c | 48 - .../src/swfc-feedback.h | 33 - .../src/swfc-history.c | 1162 - .../src/swfc-history.h | 138 - .../src/swfc-interpolation.c | 302 - .../src/swfc-interpolation.h | 114 - .../tools/swftools-special-swfdump/src/swfc.1 | 31 - .../tools/swftools-special-swfdump/src/swfc.c | 4592 --- .../swftools-special-swfdump/src/swfcombine | Bin 121674 -> 0 bytes .../swftools-special-swfdump/src/swfcombine.1 | 130 - .../swftools-special-swfdump/src/swfcombine.c | 1396 - .../swftools-special-swfdump/src/swfdump | Bin 816122 -> 0 bytes .../swftools-special-swfdump/src/swfdump.1 | 72 - .../swftools-special-swfdump/src/swfdump.c | 1621 - .../swftools-special-swfdump/src/swfextract | Bin 846175 -> 0 bytes .../swftools-special-swfdump/src/swfextract.1 | 61 - .../swftools-special-swfdump/src/swfextract.c | 1403 - .../swftools-special-swfdump/src/swfrender | Bin 956014 -> 0 bytes .../swftools-special-swfdump/src/swfrender.1 | 0 .../swftools-special-swfdump/src/swfrender.c | 199 - .../swftools-special-swfdump/src/swfstrings | Bin 790078 -> 0 bytes .../swftools-special-swfdump/src/swfstrings.1 | 35 - .../swftools-special-swfdump/src/swfstrings.c | 246 - .../swftools-special-swfdump/src/ttftool | Bin 76931 -> 0 bytes .../swftools-special-swfdump/src/ttftool.c | 92 - .../swftools-special-swfdump/src/wav2swf | Bin 243546 -> 0 bytes .../swftools-special-swfdump/src/wav2swf.1 | 53 - .../swftools-special-swfdump/src/wav2swf.c | 376 - .../swftools-special-swfdump/swfs/Makefile | 64 - .../swftools-special-swfdump/swfs/Makefile.in | 64 - .../swfs/PreLoaderTemplate | Bin 223815 -> 0 bytes .../swfs/PreLoaderTemplate.c | 113 - .../swfs/PreLoaderTemplate.sc | 19 - .../swfs/PreLoaderTemplate.swf | Bin 121 -> 0 bytes .../swfs/keyboard_viewer | Bin 784844 -> 0 bytes .../swfs/keyboard_viewer.c | 214 - .../swfs/keyboard_viewer.swf | Bin 366 -> 0 bytes .../swftools-special-swfdump/swfs/rfxview.sc | 683 - .../swftools-special-swfdump/swfs/rfxview.swf | Bin 4857 -> 0 bytes .../swfs/simple_viewer | Bin 789155 -> 0 bytes .../swfs/simple_viewer.c | 282 - .../swfs/simple_viewer.swf | Bin 505 -> 0 bytes .../swfs/swft_loader.swf | Bin 12080 -> 0 bytes .../swfs/tessel_loader.swf | Bin 11244 -> 0 bytes inc/ws/Controlleur/class.ws.flash.php | 1 - inc/ws/Controlleur/class.ws.url.php | 190 - inc/ws/Metier/class.ws.book.php | 1 - inc/ws/Metier/class.ws.document.php | 412 +- inc/ws/Util/_common.php | 7 - inc/ws/Util/class.ws.pdf.convert.php | 2 +- inc/ws/Util/class.ws.secure.swf.php | 97 - inc/ws/Util/class.ws.swf2html.php | 205 - 530 files changed, 45 insertions(+), 296720 deletions(-) delete mode 100644 fluidbook/tools/swftools-special-swfdump/AUTHORS delete mode 100644 fluidbook/tools/swftools-special-swfdump/COPYING delete mode 100644 fluidbook/tools/swftools-special-swfdump/ChangeLog delete mode 100644 fluidbook/tools/swftools-special-swfdump/INSTALL delete mode 100644 fluidbook/tools/swftools-special-swfdump/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/Makefile.common delete mode 100644 fluidbook/tools/swftools-special-swfdump/Makefile.common.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/Makefile.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/_pypath.py delete mode 100644 fluidbook/tools/swftools-special-swfdump/_pypath.txt delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/v2swf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/v2swf.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.hh delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.hh delete mode 100644 fluidbook/tools/swftools-special-swfdump/config.guess delete mode 100644 fluidbook/tools/swftools-special-swfdump/config.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/config.h.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/config.log delete mode 100644 fluidbook/tools/swftools-special-swfdump/config.status delete mode 100644 fluidbook/tools/swftools-special-swfdump/config.sub delete mode 100644 fluidbook/tools/swftools-special-swfdump/configure delete mode 100644 fluidbook/tools/swftools-special-swfdump/configure.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/doc/fileformat.sc delete mode 100644 fluidbook/tools/swftools-special-swfdump/install-sh delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/Makefile.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/Makefile.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/action.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/assembler.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/assembler.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/blocks/error.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/compile.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/compile.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/lex.swf4.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/lex.swf5.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/libming.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/libming.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/listaction.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/ming.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.flex delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.tab.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.tab.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.y delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.flex delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.tab.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.tab.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.y delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/args.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/abc.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/abc.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/assets.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/assets.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/code.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/code.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/common.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/common.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/expr.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/expr.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/files.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/files.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/import.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/import.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/parser.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/pool.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/pool.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/registry.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/registry.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/state.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/state.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.yy.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/base64.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/base64.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/bitio.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/bitio.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/file.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/file.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/ops.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/ops.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/record.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/record.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/render.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/render.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/swf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/swf.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/text.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/devices/text.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/drawer.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/drawer.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/filters/alpha.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/filters/one_big_font.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/filters/remove_font_transforms.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/filters/vectors_to_glyphs.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxdevice.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxfont.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxfont.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfximage.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfximage.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/heap.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxsource.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxtools.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gfxtools.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/box.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/database.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/detect.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/gocr.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/job.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/lines.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/list.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/list.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0n.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr1.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr1.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/otsu.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/otsu.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/output.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/output.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/pixel.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/pnm.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/remove.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/graphcut.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/graphcut.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/h.263/swfvideo.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/jpeg.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/jpeg.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/kdtree.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/kdtree.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/log.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/log.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/mem.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/mem.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfaction.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfalignzones.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfbits.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfbutton.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfcgi.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfdraw.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfdump.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swffilter.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swffont.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfobject.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfrender.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfshape.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swfsound.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swftext.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/modules/swftools.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/mp3.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/mp3.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/old_rfxswf.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/os.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/os.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/aconf.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf2jpeg.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharTypes.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/ErrorCodes.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GMutex.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToUnicodeTable.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashErrorCodes.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashGlyphBitmap.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashMath.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashTypes.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream-CCITT.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UTF8.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMapTables.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/config.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.cc delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gtypes.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/png.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/png.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/Makefile.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/SWF.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/action.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/action.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/gfx.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/image.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/image.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/primitives.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/primitives.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/pyutils.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/pyutils.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/tag.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/tag.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/taglist.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/taglist.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/tags.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/python/tags.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/q.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/q.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/readers/image.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/readers/image.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/readers/swf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/readers/swf.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/rfxswf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/rfxswf.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/ttf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/ttf.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/types.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/utf8.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/utf8.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/wav.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/wav.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/xml.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/lib/xml.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/ltmain.sh delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/avi2swf.m4 delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/backticks.m4 delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/byteorder.m4 delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/fontconfig.m4 delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/freetype.m4 delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/gcc.2.95.m4 delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/mingw.m4 delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/python.m4 delete mode 100644 fluidbook/tools/swftools-special-swfdump/m4/test.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/missing delete mode 100644 fluidbook/tools/swftools-special-swfdump/mkinstalldirs delete mode 100644 fluidbook/tools/swftools-special-swfdump/setup.py delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/Makefile.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/as3compile delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/as3compile.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/as3compile.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/font2swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/font2swf.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/font2swf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/gif2swf.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/gif2swf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/jpeg2swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/parser.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/parser.lex delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/parser.yy.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/pdf2pdf.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/pdf2pdf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/pdf2swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/pdf2swf.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/pdf2swf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/png2swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/png2swf.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/png2swf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfbbox delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfbbox.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfbbox.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfbytes delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfbytes.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfbytes.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfc delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfc-history.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfc-history.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.h delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfc.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfc.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfcombine delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfcombine.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfcombine.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfdump delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfdump.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfdump.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfextract delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfextract.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfextract.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfrender delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfrender.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfrender.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfstrings delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfstrings.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/swfstrings.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/ttftool delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/ttftool.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/wav2swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/wav2swf.1 delete mode 100644 fluidbook/tools/swftools-special-swfdump/src/wav2swf.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/Makefile delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/Makefile.in delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.sc delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/rfxview.sc delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/rfxview.swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.c delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/swft_loader.swf delete mode 100644 fluidbook/tools/swftools-special-swfdump/swfs/tessel_loader.swf delete mode 100644 inc/ws/Util/class.ws.secure.swf.php delete mode 100644 inc/ws/Util/class.ws.swf2html.php diff --git a/fluidbook/tools/swftools-special-swfdump/AUTHORS b/fluidbook/tools/swftools-special-swfdump/AUTHORS deleted file mode 100644 index 645fb1d3d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/AUTHORS +++ /dev/null @@ -1,24 +0,0 @@ -SWFTools authors ----------------- - -Maintainer, librfxswf(-python), pdf2swf, avi2swf, png2swf, swfcombine, swfextract, swfdump, swfc: - Matthias Kramm - -librfxswf, jpeg2swf, swfstrings: - Rainer Böhme - -swifty, help with swfc, swfc documentation: - De Clarke - -Contact -------- - -There's a mailing-list, swftools-common@nongnu.org, which is the right place -for anything related to SWFTools (questions, bug reports, feature requests, etc.). - -Go to - - http://mail.nongnu.org/mailman/listinfo/swftools-common - -to subscribe. - diff --git a/fluidbook/tools/swftools-special-swfdump/COPYING b/fluidbook/tools/swftools-special-swfdump/COPYING deleted file mode 100644 index d60c31a97..000000000 --- a/fluidbook/tools/swftools-special-swfdump/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library General -Public License instead of this License. diff --git a/fluidbook/tools/swftools-special-swfdump/ChangeLog b/fluidbook/tools/swftools-special-swfdump/ChangeLog deleted file mode 100644 index 15876db9b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/ChangeLog +++ /dev/null @@ -1,296 +0,0 @@ -0.0.1: initial release -0.0.2: - * pdf2swf: Added support for pdf bitmaps, clipping, state saving/restoring, colors, - solid fill and line width. The output SWF files are now much smaller. - * swfcombine: Added stacking option (-t) - * swfcombine: Small bugfixes with the command line options - * rfxswf-lib: some bugfixes concerning sprites, cgi, shapes, jpegs. - * swfstrings: New: Allows extraction of text from swf files - * swfdump: New: Dumps swf file information. (And does some error checking on the SWF) - * jpeg2swf: New: Converts one or more jpegs to a swf movie. - -0.1.0: - * configure: Now works without automake, automatically disables - jpeg2swf and pdf2swf if jpeglib is not found (disable - both) or t1lib is not found (disable pdf2swf) - * swfcombine: bugfix: DEFINETEXT tags didn't get relocated right - * swfcombine: bugfix: no longer builds "unstreamable" SWFs - * rfxswf-lib: actionscript - * rfxswf-lib: lossless image formats - * pdf2swf: conversion of lossless image formats - * pdf2swf: picture cache to prevent images getting stored more than once - * pdf2swf: conversion of (hyper)links - * swfdump: -a, -e and -XY options - * lib/example/zlibtest: new file, demonstrates using lossless images with rfxswf-lib - * lib/example/dumpfont: utility for dumping fonts out of swf (and generate c sourcecode for creating them) - * lib/example/demofont: example font, generated with lib/example/dumpfont. - -0.1.1: - * swfcombine: Wasn't able to handle converted pdfs with links. Fixed. - * swfcombine: Introduce --dummy, -X,-Y,-r options - * swfdump: new: -r option - * pdf2swf: small bugfixes - * HOWTO_pdf2swf: added section about correcting size and framerate - -0.1.2: - * swfdump: can dump all actionscript flavours (button, button2, standalone) now - * rfxswf-lib: improved font handling - * lib/example/makefonts.cc: new file, converts the standard fonts to swf - * lib/example/glyphshape.c: new file, demonstrates using font characters as shapes - * pdfswf: many bugfixes. The "pdfscreen" manual now get's converted correctly - * rfxswf-lib: bugfix: Couldn't handle jpeg grayscale images - -0.2.0: - * pdf2swf: TrueType support added. (using ttf2pt1) - * rfxswf-lib: performs conversion of jpeg colorspaces now. (Makes pdf2swf cope - with more types of jpegs) - * swfextract: new tool, allows to extract single objects, frames etc. from movieclips - * swfcombine: allows ids instead of names, now, too. - * swfdump: added text displaying functionality. (like swfstrings) - * swfdump: now dumps also the undocumented placeobject2 actioncode. - * lib/example/avi2swf.cc: For now, converts small (!) avi movie files to swf. (using - libavifile) - -0.2.1: - * configure: Does checking for byte order and command substitution capability now. - * rfxswf: Applied Anjo Krank's patch for MacOS X. - * pdf2swf: Fixed font transformation matrix - * swfcombine: new options: --cat, --stack1, --merge, --frame - * swfs/: new directory, holds some standard SWFs primarily used for pdf2swf - installs into ${DATADIR}/swftools/swfs - * pdf2swf: New options --viewer, --preloader, -b, -l - * pdf2swf: Fonts are now in ${DATADIR}/swftools/fonts - -0.2.2: - * swfs/: Added/Wrote sources for some of the swf files - * swfdump: Major bugfix in placeobject2, hex output function - * swfextract: Can now extract png, jpeg and mp3. - * swfcombine: big endian fixes - * swfextract: big endian fixes - * pdf2swf: Changed from 100dpi to 72dpi conversion - * pdf2swf: Some optimizations, fix the zero string problem. - * lib/: Added Bladeenc 0.94.1 for mp3 compression - * lib/example/avi2swf.cc: Can now handle big files. Slightly better compression ratio. Sound. - * lib/example/sound.c: New file, demonstrates use of the sound module in librfxswf. - -0.2.3: - * pdf2swf: New option --fontdir, can now handle external fonts. - * lib/modules/swftext.c: Several font-extraction bugfixes - * src/swfdump: Bugfixes, ids and depths are now in decimal - * src/swfcombine: Bugfixes. - * configure.in: Cleaned up. - -0.3.0: - * pdf2swf: The --ignore option now actually makes the pdf files smaller. - * rfxswf: Can now write DefineFont2 tags - * swfextract/swfcombine: Bugfixes (DefineEditText) - * swfdump: New option --used, prints out referred IDs of each tag. - * rfxswf: Can now read and write Flash 6 (MX) compressed SWFs. (SWCs) - * pdf2swf: Added compression flag (-z) - * swfcombine: Added compression flag (-z) - * configure.in: zlib is now required. - * src/png2swf: New tool. - * swfdump: Prints some image infos now. - * pdf2swf: Fixed Image handling - * avi2swf/: Is part of the main distribution now - * src/wav2swf: New tool. - -0.3.1: - * configure: Didn't create all Makefiles when t1lib or jpeglib were absent. Fixed. - * swfs/Makefile: FreeBSD fixes. - -0.4.0: - * pdf2swf/xpdf: Upgraded PDF Parser to Version 1.01. - * pdf2swf: Can now handle Type 3 Fonts. (As Bitmaps) - * src/swfcombine: Completely rewritten, using the rfxswf routines - * configure: Check for libtool - * lib/rfxswf: Fixed some parsing bugs (swffont, swfdump) - * pdf2swf: Added antialiasing capabilities for Type 3 Fonts - * lib/examples/makefonts: Fonts: Bounding boxes are now handled correctly - * png2swf: Support for more image types - * pdf2swf: New option -t (--stop) - -0.4.1: - * src/swfcombine: Bugfix with -x option - * lib/Makefile: MacOSX fixes - * pdf2swf/SWFOutput.cc: fixed undefined sqrt() - * src/png2swf: Support for transparency - * pdf2swf: Support for CID Fonts - * src/swfcombine: Bugfixes - * lib/rfxswf: Added Sprite Unfolding routines - -0.4.2: - * src/Makefile: OpenBSD fixes - * lib/lame: Removed *.o files from archive - * avi2swf: Implemented --flip option - * pdf2swf: Implemented --flashversion option - * pdf2swf: Implemented Viewer gadgets- it's now possible to call Flash functions via hyperlink - -0.4.3: - * src/jpeg2swf: Grayscale fix - * lib/rfxswf: Improved MX support - * pdf2swf: Command line fixes - * swfdump: Added -f (--frames) option - * png2swf: Added support for mode 6 images - * swfs: Support for print protection in simple_viewer - * swfs: added keyboard_viewer - * swfcombine: Bugfixes - * swfdump: Shows frame position now. - * swfdump: Some definesound infos added - * wav2swf: added support for definesound, looping and framerate - * pdf2swf: Calling Actionscript Functions can now also be done via http: hyperlink, - e.g.: http://pdf2swf:call:_root.myFunction:parameter - * ./*/Makefile: all Makefiles rewritten. - -0.4.4: - * src/swfextract: output file name handling fix - * lib/rfxswf: better sprite fold/unfold support - * src/swfdump: new option -p (--placements), support for exportassets, namecharacter - * src/swfextract: support for font extraction - * pdf2swf/font2swf: new tool, for converting Type1 fonts to SWF - * lib/rfxswf: font routines fixed - * lib/rfxswf: support for definejpegbits3 - * src/png2swf: better support for 32 bit images with transparency - * pdf2swf/pdf2swf: slightly better TTF support, some fixes - * pdf2swf/pdf2swf: Output filename is no longer mandatory - * lib/rfxswf: added workaround for the 63-byte BMF_32 bug in the Flash Player - * lib/rfxswf: fix for ratios in swfobject.c - * src/swfdump: shows some info about video tags now - * pdf2swf/pdf2swf: greatly improved spline conversion - * pdf2swf/: Fix for t1lib-5.0.0 - * src/wav2swf: streaming sound now works for all framerates < 35. - -0.5.0: - * pdf2swf: added support for capline-styles - * avi2swf: added h.263 support - * avi2swf: improved sound support - * Makefiles: added MingW/Cygwin support - * pdf2swf/ttf2pt1: upgraded to ttf2pt1 3.4.3. - * lib/: changed logf to msg (support for gcc 3.2) - * src/jpeg2swf: Added support for H.263 compression (for correlated images). - * swfc: New tool, allow compilation of .sc files to swf - * swfbbox: New Tool, allows several bounding box operations on SWFs - * wav2swf: added support for samplerate 44100 (Marcus Doemling) - * avi2swf: added -r (--mp3-samplerate) parameter (Marcus Doemling) - * lib/action: Integrated Ming Actioncompiler - * lib/modules/swffont.c: New module, allows creation of SWF fonts from Type1 and TTF - * lib/modules/swfshape.c: Support for gradients - * lib/rfxswf.h: Support for MD5 encrypted passwords (PROTECT tags) - -0.5.1: - * png2swf: fixed a bug for 8 bit indexed images - * lib/rfxswf.h: fixed a bug- could previously only be compiled with either t1lib or freetype - * configure: newer avifile versions (>= 0.7.38) now also work. - -0.6.0: - * configure: added check for broken freetype- disable freetype in some cases - * swfbbox: Added support for text boxes - * png2swf: Fixed alpha conversion (removed definejpeg3 workaround) - * swfc: added buttons, edittext fields - * rfxswf: fixed font advance parameters (editboxes with custom font now work) - * swfextract: Is able to extract alpha channels out of DEFINEBITS2 now. - * pdf2swf: Made MingW compatible. There's now a Win32 version. - * pdf2swf: Reworked font routines - * swfcombine: Some fixes for clipping depths - * swfextract: Reworked object listing output - * lib/rfxswf: New method swf_FontPrepareForEditText() - * lib/lame: Removed lame library source, it's now linked dynamically - * lib/python: Added python interface - -0.6.1: - * swfc: Fixed .(edit)text- this was broken due to rfxswf font changes - * pdf2swf: Fixed font matrix handling - * pdf2swf: Fixed "highest charcode not displayed" bug - * pdf2swf: Bounding boxes are now of the right size - * pdf2swf: Fixed Windows crash in 4 bit palette images - * pdf2swf: Fixed another variant of "Didn't find glyph xxx in font" bug - -0.6.2: - * swfbbox: Calculates the complete movie's bounding box now. New -e,-b,-B options. - * pdf2swf: New "-s minlinewidth" option - * swfdump: Fixed handling of PLACEOBJECT - * lib/modules/swffont.c: Added support for new-style freetype headers - * configure: Improved freetype and python detection, added fontconfig detection - * swfdump: Support for shapes added - * swfdump: several bugfixes from simon-swf@munton.demon.co.uk - * pdf2swf: Added fontconfig font replacement - * lib/h.263: added better support for custom frames - * avi2swf: Is now ported to Win32, too. - * pdf2swf: Upgraded to xpdf 3.00 - -0.6.3: - * lib/modules/swfrender.c: New module, for shape->bitmap conversion - * lib/rfxswf.c: Several small bugfixes - * lib/modules/swftools.c: New function swf_Optimize() - * src/swfc.c: .outline and .textshape support line drawings now, too - * src/swfc.c: added -O option - * src/swfc.c: added support for including actionscript (.action filename=) - * src/swfc.c: frames now start at 1 - * src/swfextract.c: Objects extracted with -i are now scaled to width 512 - * src/swfextract.c: Fixed jpeg extraction bug - * src/wav2swf.c: Big endian fixes - * lib/modules/swfshape.c: too long lines are now split automatically - * configure: Several Mac OS X fixes - * pdf2swf/SWFOutputDev: refactored interface to pdf2swf.cc - * src/png2swf.c: added -z option - * src/jpeg2swf.c: added -z option - * m4/python.m4: Python MacOS X fixes - * src/gif2swf.c: New tool, for converting (animated) gifs to swf (Daichi Shinozaki) - -0.7.0: - * swfdump: Fixed bit overflow bug - * lib/gfxdevice.h: Started implementation of graphic layer abstraction - * pdf2swf: Fixed Type 3 color bug - * pdf2swf: Fixed a rare rendering bug caused by the float conversion in moveTo - * pdf2swf: Fixed CMYK conversion - * pdf2swf: added support for joinstyles - * pdf2swf: capstyles don't require clipping anymore - * pdf2swf: added support for dashed/dotted lines - * pdf2swf: Images are now stored as either jpeg or zlib, whatever is smaller. - * pdf2swf: Fixed Type0C handling - * swfcombine: Fixed jpeg table conversion - * lib/rfxswf.c: added support for definejpeg3 extraction - * pdf2swf: New option -s bboxvars - * pdf2swf: Added support for stroke/clip text rendering - * swfbbox: Default behaviour has been fixed - * pdf2swf: fix for non-closed shapes - * pdf2swf: Font quality is now determined by the used font sizes - * pdf2swf: Shapes are now all starting at (0,0), and then explizitly placed at their - actual starting positions (useful with zlib) - * pdf2swf: Default Flash version is now 6 - -0.8.0: - * lib/modules/swfsound.c: Fixed compile problem if the lame library is present - * pdf2swf: Bugfix: -s flashversion was broken - * pdf2swf: -b and -l now also work on Windows - * swfbbox: The -c option is now documented - * swfdump: Added support for flash 8 - * librfxswf: Added support for flash 8 filters and blend modes - * src/swfc: Added support for flash 8 filters and blend modes - * pdf2swf: upgraded to xpdf 3.01 - * swfcombine: new -w (--scalex) -h (--scaley) options - -0.8.1: - * pdf2swf: Upgraded to xpdf 3.02 - * lib/modules/swftools: Fixed several bugs in Flash8 parsing - * src/swfrender: Added --ng switch - * lib/swf/: New gfxdevice - -0.9.0: - * pdf2swf: Added support for Flash 8 Flashtype - * pdf2swf: numerous bugfixes - * pdf2swf: support for gradients - * pdf2swf: support for different optimization levels (-O1, -O2, --flatten) - * src/swfdump: Flash 8/9 support - * pdf2swf: Common fonts are now linked directly into the executable - * setup.py: added Python setup script - * lib/python/gfx: New python module for accessing pdf2swf functionality - * as3compile: New tool, for compiling ActionScript 3.0 - * swfc: added AS3.0 support - -0.9.1: - * pdf2swf: bugfixes, speedups - * pdf2swf: improved font quality (FlashType) - * librfxswf: support for fontalignzones - * gpdf2swf: completely reworked pdf2swf GUI (Ricardo Pedroso) - * as3compile: many bugfixes, support for swc libraries diff --git a/fluidbook/tools/swftools-special-swfdump/INSTALL b/fluidbook/tools/swftools-special-swfdump/INSTALL deleted file mode 100644 index 11b821531..000000000 --- a/fluidbook/tools/swftools-special-swfdump/INSTALL +++ /dev/null @@ -1,180 +0,0 @@ -Basic Installation -================== - - These are generic installation instructions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). - - 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 `AUTHORS' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. - - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' 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. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -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 supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. - -Installation Names -================== - - By default, `make install' will install the package's files in -`/usr/local/bin', `/usr/local/man', etc. You can specify an -installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). - - 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' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: - CPU-COMPANY-SYSTEM - -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. - - If you are building compiler tools for cross-compiling, you can also -use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. - -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. - -Operation Controls -================== - - `configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--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. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. diff --git a/fluidbook/tools/swftools-special-swfdump/Makefile b/fluidbook/tools/swftools-special-swfdump/Makefile deleted file mode 100644 index 0b9851f52..000000000 --- a/fluidbook/tools/swftools-special-swfdump/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -top_builddir = .. -srcdir = . -top_srcdir = . -include ./Makefile.common - -all install uninstall clean: - @echo making $@ in m4... - cd m4;$(MAKE) $@ - @echo making $@ in lib... - cd lib;$(MAKE) $@ - @echo making $@ in lib/pdf... - cd lib/pdf;$(MAKE) $@ - @echo making $@ in lib... - cd lib;$(MAKE) $@ - @echo making $@ in lib/python... - cd lib/python;$(MAKE) $@ - @echo making $@ in lib/ruby... - cd src;$(MAKE) $@ - @echo making $@ in avi2swf... - cd avi2swf;$(MAKE) $@ - @echo making $@ in swfs... - cd swfs;$(MAKE) $@ - @$(MAKE) $@-local - -distclean: - $(MAKE) clean - rm -f config.status config.cache config.h Makefile Makefile.common libtool - rm -f lib/lame/Makefile lib/python/Makefile lib/Makefile src/Makefile avi2swf/Makefile pdf2swf/fonts/Makefile - -clean-local: - rm -f config.cache gmon.out - -uninstall-local: - rm -rf $(pkgdatadir) - -all-local: - @true -install-local: - @true - -.PHONY: all install uninstall clean distclean clean-local uninstall-local all-local install-local diff --git a/fluidbook/tools/swftools-special-swfdump/Makefile.common b/fluidbook/tools/swftools-special-swfdump/Makefile.common deleted file mode 100644 index eafdcc142..000000000 --- a/fluidbook/tools/swftools-special-swfdump/Makefile.common +++ /dev/null @@ -1,88 +0,0 @@ -# --------------------- init -------------------------- - -# shells, skripts, tools etc. -SHELL = /bin/sh -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs - - -# compiling -DEFS=-DHAVE_CONFIG_H -INCLUDES= -DEP=gcc -MM $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -C=gcc -c $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -CC=g++ -c $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -L=gcc $(DEFS) -LL=g++ $(DEFS) -AR=ar -LIBTOOL=@LIBTOOL@ -SC=$(LIBTOOL) gcc -c $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -SCC=$(LIBTOOL) g++ -c $(DEFS) $(INCLUDES) -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -SL=$(LIBTOOL) --mode=link gcc $(DEFS) -rpath $(libdir) -SLL=$(LIBTOOL) --mode=link g++ $(DEFS) -rpath $(libdir) -LIBS= -L/usr/local/lib -L${exec_prefix}/lib -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype -CXXLIBS=-lstdc++ -transform = s,x,x, -CPPFLAGS= -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig - -PYTHON_LIB=-lpython2.5 -PYTHON_INCLUDES=-I/usr/include/python2.5 -PYTHON_INSTALL_PATH=/usr/lib/python2.5/site-packages -PYTHON_EXECUTABLE=python2.5 - -RUBY_CPPFLAGS= -RUBY_LDFLAGS= -RUBY_LIBS= -RUBY_INSTALLDIR= - -# libtool stuff -OBJEXT=o -EXEEXT= -AREXT=.a -SHARED=-shared -E=$(EXEEXT) -O=$(OBJEXT) -A=$(AREXT) -SLEXT=so -ECHO=@ECHO@ -RANLIB=ranlib -STRIP=@echo debug enabled, not stripping - -# installing -LN_S = ln -s -PACKAGE = swftools -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -UNINSTALL_DATA = rm -f -INSTALL_PROGRAM = ${INSTALL} -prefix = /usr/local/swftools/special-swfdump -exec_prefix = ${prefix} -bindir = ${exec_prefix}/bin -datadir = ${prefix}/share -libdir = ${exec_prefix}/lib -includedir = ${prefix}/include -sysconfdir = ${prefix}/etc -pkgdatadir = $(datadir)/swftools - -# man pages -mandir = ${prefix}/share/man -man1dir = $(mandir)/man1 - -# ------------------- defines ------------------------- - -INSTALL_BIN = echo installing $$file to $(bindir);$(INSTALL_PROGRAM) $$file $(bindir)/`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'` -UNINSTALL_BIN = ff=`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`;echo rm -f $(bindir)/$$ff;rm -f $(bindir)/$$ff -INSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "$(INSTALL_DATA) $$ff $(man1dir)/$$inst"; $(INSTALL_DATA) $$ff $(man1dir)/$$inst -UNINSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "rm -f $(man1dir)/$$inst"; rm -f $(man1dir)/$$inst - -#%.o: %.c -# $(C) $< -o $@ - -#%: %.o -# $(L) $< -o $@ ../lib/librfxswf.a $(LIBS) - -#%.o: %.cc -# $(CC) -DDATADIR=\"$(pkgdatadir)\" -I../lib -Ittf2pt1 -Ixpdf $< -o $@ - -# GNU Makefile stuff - -.SUFFIXES: diff --git a/fluidbook/tools/swftools-special-swfdump/Makefile.common.in b/fluidbook/tools/swftools-special-swfdump/Makefile.common.in deleted file mode 100644 index fa119e3c7..000000000 --- a/fluidbook/tools/swftools-special-swfdump/Makefile.common.in +++ /dev/null @@ -1,88 +0,0 @@ -# --------------------- init -------------------------- - -# shells, skripts, tools etc. -SHELL = @SHELL@ -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -@SET_MAKE@ - -# compiling -DEFS=@DEFS@ -INCLUDES= -DEP=@CC@ -MM $(DEFS) $(INCLUDES) @CPPFLAGS@ -C=@CC@ -c $(DEFS) $(INCLUDES) @CPPFLAGS@ @CFLAGS@ -CC=@CXX@ -c $(DEFS) $(INCLUDES) @CPPFLAGS@ @CXXFLAGS@ -L=@CC@ $(DEFS) -LL=@CXX@ $(DEFS) -AR=@AR@ -LIBTOOL=@LIBTOOL@ -SC=$(LIBTOOL) @CC@ -c $(DEFS) $(INCLUDES) @CPPFLAGS@ @CFLAGS@ -SCC=$(LIBTOOL) @CXX@ -c $(DEFS) $(INCLUDES) @CPPFLAGS@ @CXXFLAGS@ -SL=$(LIBTOOL) --mode=link @CC@ $(DEFS) -rpath $(libdir) -SLL=$(LIBTOOL) --mode=link @CXX@ $(DEFS) -rpath $(libdir) -LIBS= @LDFLAGS@ @LIBS@ -CXXLIBS=@CXXLIBS@ -transform = @program_transform_name@ -CPPFLAGS=@CPPFLAGS@ - -PYTHON_LIB=@PYTHON_LIB@ -PYTHON_INCLUDES=@PYTHON_INCLUDES@ -PYTHON_INSTALL_PATH=@PYTHON_INSTALL_PATH@ -PYTHON_EXECUTABLE=@PYTHON_EXECUTABLE@ - -RUBY_CPPFLAGS=@RUBY_CPPFLAGS@ -RUBY_LDFLAGS=@RUBY_LDFLAGS@ -RUBY_LIBS=@RUBY_LIBS@ -RUBY_INSTALLDIR=@RUBY_INSTALLDIR@ - -# libtool stuff -OBJEXT=@OBJEXT@ -EXEEXT=@EXEEXT@ -AREXT=@AREXT@ -SHARED=@SHARED@ -E=$(EXEEXT) -O=$(OBJEXT) -A=$(AREXT) -SLEXT=@SLEXT@ -ECHO=@ECHO@ -RANLIB=@RANLIB@ -STRIP=@STRIP@ - -# installing -LN_S = @LN_S@ -PACKAGE = @PACKAGE@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -UNINSTALL_DATA = rm -f -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ -bindir = @bindir@ -datadir = @datadir@ -libdir = @libdir@ -includedir = @includedir@ -sysconfdir = @sysconfdir@ -pkgdatadir = $(datadir)/@PACKAGE@ - -# man pages -mandir = @mandir@ -man1dir = $(mandir)/man1 - -# ------------------- defines ------------------------- - -INSTALL_BIN = echo installing $$file to $(bindir);$(INSTALL_PROGRAM) $$file $(bindir)/`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'` -UNINSTALL_BIN = ff=`echo $$file|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`;echo rm -f $(bindir)/$$ff;rm -f $(bindir)/$$ff -INSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "$(INSTALL_DATA) $$ff $(man1dir)/$$inst"; $(INSTALL_DATA) $$ff $(man1dir)/$$inst -UNINSTALL_MAN1 = ff=$(srcdir)/$$file.1; inst=`echo $$file | sed '$(transform)'`.1; echo "rm -f $(man1dir)/$$inst"; rm -f $(man1dir)/$$inst - -#%.o: %.c -# $(C) $< -o $@ - -#%: %.o -# $(L) $< -o $@ ../lib/librfxswf.a $(LIBS) - -#%.o: %.cc -# $(CC) -DDATADIR=\"$(pkgdatadir)\" -I../lib -Ittf2pt1 -Ixpdf $< -o $@ - -# GNU Makefile stuff - -.SUFFIXES: diff --git a/fluidbook/tools/swftools-special-swfdump/Makefile.in b/fluidbook/tools/swftools-special-swfdump/Makefile.in deleted file mode 100644 index e1a07f63f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/Makefile.in +++ /dev/null @@ -1,41 +0,0 @@ -top_builddir = .. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -include ./Makefile.common - -all install uninstall clean: - @echo making $@ in m4... - cd m4;$(MAKE) $@ - @echo making $@ in lib... - cd lib;$(MAKE) $@ - @echo making $@ in lib/pdf... - cd lib/pdf;$(MAKE) $@ - @echo making $@ in lib... - cd lib;$(MAKE) $@ - @echo making $@ in lib/python... - cd lib/python;$(MAKE) $@ - @echo making $@ in lib/ruby... - cd src;$(MAKE) $@ - @echo making $@ in avi2swf... - cd avi2swf;$(MAKE) $@ - @echo making $@ in swfs... - cd swfs;$(MAKE) $@ - @$(MAKE) $@-local - -distclean: - $(MAKE) clean - rm -f config.status config.cache config.h Makefile Makefile.common libtool - rm -f lib/lame/Makefile lib/python/Makefile lib/Makefile src/Makefile avi2swf/Makefile pdf2swf/fonts/Makefile - -clean-local: - rm -f config.cache gmon.out - -uninstall-local: - rm -rf $(pkgdatadir) - -all-local: - @true -install-local: - @true - -.PHONY: all install uninstall clean distclean clean-local uninstall-local all-local install-local diff --git a/fluidbook/tools/swftools-special-swfdump/_pypath.py b/fluidbook/tools/swftools-special-swfdump/_pypath.py deleted file mode 100644 index 5a67638a4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/_pypath.py +++ /dev/null @@ -1,4 +0,0 @@ -import distutils -import distutils.sysconfig -import sys -sys.stdout.write(distutils.sysconfig.get_python_lib(plat_specific=0,standard_lib=0)) diff --git a/fluidbook/tools/swftools-special-swfdump/_pypath.txt b/fluidbook/tools/swftools-special-swfdump/_pypath.txt deleted file mode 100644 index 25d73bb4f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/_pypath.txt +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python2.5/site-packages \ No newline at end of file diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile b/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile deleted file mode 100644 index 51a6f753a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile +++ /dev/null @@ -1 +0,0 @@ -all install uninstall clean: diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile.in b/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile.in deleted file mode 100644 index ac40d4b52..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/Makefile.in +++ /dev/null @@ -1,41 +0,0 @@ -top_builddir = .. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -include ../Makefile.common - -VIDEO_LIBS=@VIDEO_LIBS@ -VIDEO_CFLAGS=@VIDEO_CFLAGS@ - -all: avi2swf$(E) - -videoreader_avifile.$(O): videoreader_avifile.cc videoreader_avifile.hh - $(CC) $(VIDEO_CFLAGS) $< -o $@ - -videoreader_vfw.$(O): videoreader_vfw.cc videoreader_vfw.hh - $(CC) $(VIDEO_CFLAGS) $< -o $@ - -avi2swf.$(O): avi2swf.cc videoreader_vfw.hh videoreader_avifile.hh - $(CC) $< -o $@ - -v2swf.$(O): v2swf.c ../lib/q.h - $(C) $< -o $@ - -avi2swf$(E): avi2swf.$(O) v2swf.$(O) videoreader_avifile.$(O) videoreader_vfw.$(O) ../lib/libbase$(A) - $(LL) avi2swf.$(O) v2swf.$(O) videoreader_avifile.$(O) videoreader_vfw.$(O) -o avi2swf$(E) ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) $(VIDEO_LIBS) - $(STRIP) avi2swf$(E) - -install: - $(mkinstalldirs) $(bindir) - $(mkinstalldirs) $(man1dir) - @file=avi2swf;$(INSTALL_BIN);$(INSTALL_MAN1) - -uninstall: - @file=avi2swf;$(UNINSTALL_BIN);$(UNINSTALL_MAN1) - -clean: - rm -f *.o *.obj *.lo *.a *.lib *.la avi2swf avi2swf.exe gmon.out - -doc: - perl ../parsedoc.pl avi2swf.doc - -.PHONY: all doc clean install uninstall diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.1 b/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.1 deleted file mode 100644 index ff6495e7a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.1 +++ /dev/null @@ -1,59 +0,0 @@ -.TH avi2swf "1" "February 2006" "avi2swf" "swftools" -.SH NAME -avi2swf - Converts an avi video file to SWF. - -.SH Synopsis -.B avi2swf file.avi [-o output.swf] - -.SH DESCRIPTION -Converts an AVI video file to SWF. -.PP -From Version 6 on, SWF supports h.263 video rendering. This tool generates, -among some other formats (see below), SWF movies which contain such h.263 video -from AVI files. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR - Print help and exit -.TP -\fB\-o\fR, \fB\-\-output\fR filename - Specify output filename -.TP -\fB\-A\fR, \fB\-\-adjust\fR seconds - Audio adjust: Shift sound -seconds to the future or +seconds into the past. -.TP -\fB\-n\fR, \fB\-\-num\fR frames - Number of frames to encode -.TP -\fB\-m\fR, \fB\-\-mp3-bitrate\fR \fIkbps\fR - Set the mp3 bitrate to encode audio with -.TP -\fB\-r\fR, \fB\-\-mp3-samplerate\fR \fIhz\fR - Set the mp3 samplerate to encode audio with (default: 11025) -.TP -\fB\-s\fR, \fB\-\-scale\fR \fIval\fR - Scale down to factor \fIval\fR. (in %, e.g. 100 = original size) -.TP -\fB\-S\fR, \fB\-\-skipframes\fR \fInum\fR - Skip \fInum\fR frames before starting the conversion. -.TP -\fB\-p\fR, \fB\-\-flip\fR - Turn movie upside down -.TP -\fB\-q\fR, \fB\-\-quality\fR \fIval\fR - Set the quality to \fIval\fR. (0-100, 0=worst, 100=best, default:80) -.TP -\fB\-k\fR, \fB\-\-keyframe\fR - Set the number of intermediate frames between keyframes. -.TP -\fB\-x\fR, \fB\-\-extragood\fR - Enable some \fIvery\fR expensive compression strategies. You may - want to let this run overnight. -.TP -\fB\-T\fR, \fB\-\-flashversion\fR \fIn\fR - Set output flash version to \fIn\fR. Notice: H.263 compression will only be - used for n >= 6. -.TP -\fB\-V\fR, \fB\-\-version\fR - Print program version and exit diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.cc b/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.cc deleted file mode 100644 index c68fedbbc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/avi2swf.cc +++ /dev/null @@ -1,347 +0,0 @@ -/* avi2swf.cc - Convert avi movie files into swf. - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include - -#include "../config.h" - -#include "../lib/args.h" -#include "v2swf.h" -#ifdef WIN32 -#include "videoreader_vfw.hh" -#else -#include "videoreader_avifile.hh" -#endif - -static char * filename = 0; -static char * outputfilename = "output.swf"; -int verbose = 0; - -static int quality = 80; -static double scale = 1.0; -static int flip = 0; -static int expensive = 0; -static int flashversion = 6; -static int keyframe_interval = -1; -static int skip = 0; -static float audio_adjust = 0; -static int mp3_bitrate = 32; -static int samplerate = 11025; -static int numframes = 0; -static char* skipframes = 0; - -static struct options_t options[] = { -{"h", "help"}, -{"o", "output"}, -{"A", "adjust"}, -{"n", "num"}, -{"m", "mp3-bitrate"}, -{"r", "mp3-samplerate"}, -{"s", "scale"}, -{"S", "skipframes"}, -{"p", "flip"}, -{"q", "quality"}, -{"k", "keyframe"}, -{"x", "extragood"}, -{"T", "flashversion"}, -{"V", "version"}, -{0,0} -}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("avi2swf-ng - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else if(!strcmp(name, "o")) { - outputfilename = val; - return 1; - } - else if(!strcmp(name, "n")) { - numframes = atoi(val); - return 1; - } - else if(!strcmp(name, "d")) { - scale = atof(val); - return 1; - } - else if(!strcmp(name, "q")) { - quality = atoi(val); - if(quality<0) - quality = 0; - if(quality>100) - quality = 100; - return 1; - } - else if(!strcmp(name, "p")) { - flip = 1; - return 0; - } - else if(!strcmp(name, "k")) { - keyframe_interval = atoi(val); - return 1; - } - else if(!strcmp(name, "A")) { - audio_adjust = atof(val); - return 1; - } - else if(!strcmp(name, "v")) { - verbose = 1; - return 0; - } - else if(!strcmp(name, "T")) { - flashversion = atoi(val); - return 1; - } - else if(!strcmp(name, "x")) { - expensive = 1; - return 0; - } - else if(!strcmp(name, "m")) { - mp3_bitrate = atoi(val); - return 1; - } - else if(!strcmp(name, "r")) { - samplerate = atoi(val); - if(samplerate >= 11000 && samplerate <= 12000) - samplerate = 11025; - else if(samplerate >= 22000 && samplerate <= 23000) - samplerate = 22050; - else if(samplerate >= 44000 && samplerate <= 45000) - samplerate = 44100; - else { - fprintf(stderr, "Invalid samplerate: %d\n", samplerate); - fprintf(stderr, "Allowed values: 11025, 22050, 44100\n", samplerate); - exit(1); - } - return 1; - } - else if(!strcmp(name, "S")) { - skip = atoi(val); - return 1; - } - else if(!strcmp(name, "C")) { - skipframes = strdup(val); - return 1; - } - else if(!strcmp(name, "s")) { - scale = atoi(val)/100.0; - if(scale>1.0 || scale<=0) { - fprintf(stderr, "Scale must be in the range 1-100!\n"); - exit(1); - } - return 1; - } - fprintf(stderr, "Unknown option: -%s\n", name); - exit(1); -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s file.avi [-o output.swf]\n", name); - printf("\n"); - printf("-h , --help Print help and exit\n"); - printf("-o , --output filename Specify output filename\n"); - printf("-A , --adjust seconds Audio adjust: Shift sound -seconds to the future or +seconds into the past.\n"); - printf("-n , --num frames Number of frames to encode\n"); - printf("-m , --mp3-bitrate Set the mp3 bitrate to encode audio with\n"); - printf("-r , --mp3-samplerate Set the mp3 samplerate to encode audio with (default: 11025)\n"); - printf("-s , --scale Scale down to factor . (in %, e.g. 100 = original size)\n"); - printf("-S , --skipframes Skip frames before starting the conversion.\n"); - printf("-p , --flip Turn movie upside down\n"); - printf("-q , --quality Set the quality to . (0-100, 0=worst, 100=best, default:80)\n"); - printf("-k , --keyframe Set the number of intermediate frames between keyframes.\n"); - printf("-x , --extragood Enable some *very* expensive compression strategies.\n"); - printf("-T , --flashversion Set output flash version to .\n"); - printf("-V , --version Print program version and exit\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", - filename, name); - } - filename = name; - return 0; -} - -static char toabuf[128]; -static char*ftoa(double a) -{ - sprintf(toabuf, "%f", a); - return toabuf; -} -static char*itoa(int a) -{ - sprintf(toabuf, "%d", a); - return toabuf; -} - -#ifdef DO_SIGNALS -pthread_t main_thread; -static void sigterm(int sig) -{ - if(pthread_equal (pthread_self(), main_thread)) - { - if(frameno>0 && !shutdown_avi2swf) { - if(verbose) - printf("Thread [%08x] got sigterm %d\n", pthread_self(), sig); - shutdown_avi2swf++; - } else { - exit(1); - } - } -} -#endif - -int main (int argc,char ** argv) -{ - videoreader_t video; - v2swf_t v2swf; - int ret; - FILE*fi; - -#ifdef DO_SIGNALS - signal(SIGTERM, sigterm); - signal(SIGINT , sigterm); - signal(SIGQUIT, sigterm); - main_thread = pthread_self(); -#endif - - processargs(argc, argv); - if(!filename) { - fprintf(stderr, "You must supply a filename"); - exit(0); - } - if(keyframe_interval<0) { - if(flashversion>=6) - keyframe_interval=20; - else - keyframe_interval=5; - } - - fi = fopen(outputfilename, "wb"); - if(!fi) { - fflush(stdout); fflush(stderr); - fprintf(stderr, "Couldn't open %s\n", outputfilename); - exit(1); - } - -#ifdef WIN32 - ret = videoreader_vfw_open(&video, filename); -#else - ret = videoreader_avifile_open(&video, filename); -#endif - - if(ret<0) { - fprintf(stderr, "Error opening %s\n", filename); - exit(1); - } - - if(verbose) { - printf("| video framerate: %f\n", video.fps); - printf("| video size: %dx%d\n", video.width, video.height); - printf("| audio rate: %d\n", video.samplerate); - printf("| audio channels: %d\n", video.channels); - } - - ret = v2swf_init(&v2swf, &video); - if(verbose) - v2swf_setparameter(&v2swf, "verbose", "1"); - if(numframes) - v2swf_setparameter(&v2swf, "numframes", itoa(numframes)); - v2swf_setparameter(&v2swf, "quality", itoa(quality)); - v2swf_setparameter(&v2swf, "blockdiff", "0"); - v2swf_setparameter(&v2swf, "blockdiff_mode", "exact"); - v2swf_setparameter(&v2swf, "mp3_bitrate", itoa(mp3_bitrate)); - v2swf_setparameter(&v2swf, "samplerate", itoa(samplerate)); - //v2swf_setparameter(&v2swf, "fixheader", "1"); - //v2swf_setparameter(&v2swf, "framerate", "15"); - v2swf_setparameter(&v2swf, "scale", ftoa(scale)); - v2swf_setparameter(&v2swf, "prescale", "1"); - v2swf_setparameter(&v2swf, "flash_version", itoa(flashversion)); - v2swf_setparameter(&v2swf, "keyframe_interval", itoa(keyframe_interval)); - if(skipframes) - v2swf_setparameter(&v2swf, "skipframes", skipframes); - if(expensive) - v2swf_setparameter(&v2swf, "motioncompensation", "1"); - if(flip) - video.setparameter(&video, "flip", "1"); - if(verbose) - video.setparameter(&video, "verbose", "1"); - - if(!verbose) - printf("\n"); - - if(audio_adjust>0) { - int num = ((int)(audio_adjust*video.samplerate))*video.channels*2; - void*buf = malloc(num); - video.getsamples(&video, buf, num); - free(buf); - } else if(audio_adjust<0) { - int num = (int)(-audio_adjust*video.fps); - void*buf = malloc(video.width*video.height*4); - int t; - for(t=0;t - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "v2swf.h" -#include "../lib/rfxswf.h" -#include "../lib/q.h" - -typedef struct _v2swf_internal_t -{ - TAG*tag; - - int filesize; - int headersize; - int frames; - - int myframes; - - writer_t out; - writer_t out2; - - ringbuffer_t r; - videoreader_t* video; - double video_fps; - - int width; - int height; - - int video_eof; - int audio_eof; - - unsigned char* vrbuffer; - unsigned char* buffer; - unsigned char* lastbitmap; - - int id; - int lastid; - - int quality; - int blockdiff; - int keyframe_interval; - int diffmode; - - float framerate; - float fpsratio; - float fpspos; - - int bitrate; - int samplerate; - - int finished; - int keyframe; - int showframe; - - int skipframes; - - float samplepos; - float framesamplepos; - int samplewritepos; - double soundframepos; - int soundstreamhead; - int seek; - - int numframes; - - double audio_fix; - int fixheader; - int prescale; - - int scale; - - int add_cut; - - int domotion; - - int head_done; - - int version; - - VIDEOSTREAM stream; - -} v2swf_internal_t; - -static int verbose = 0; -static int filelog = 0; - -static void msg(char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - if(!verbose) - return; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - if(filelog) - { - FILE*fi = fopen("debug.log", "ab+"); - fprintf(fi, "(v2swf) %s\n", buf); - fflush(fi); - fclose(fi); - } - - printf("(v2swf) %s\n", buf); - fflush(stdout); -} - -extern int swf_mp3_in_samplerate; -extern int swf_mp3_out_samplerate; -extern int swf_mp3_channels; -extern int swf_mp3_bitrate; - - -static void writeShape(v2swf_internal_t*i, int id, int gfxid, int width, int height) -{ - RGBA rgb; - MATRIX m; - SHAPE*shape; - SRECT r; - int lines = 0; - int ls,fs; - swf_ResetTag(i->tag, ST_DEFINESHAPE); - swf_ShapeNew(&shape); - rgb.b = rgb.g = rgb.r = 0xff; - if(lines) - ls = swf_ShapeAddLineStyle(shape,20,&rgb); - swf_GetMatrix(NULL,&m); - m.sx = 20*65536; - m.sy = 20*65536; - - fs = swf_ShapeAddBitmapFillStyle(shape,&m,gfxid,0); - swf_SetU16(i->tag,id); // ID - r.xmin = 0; - r.ymin = 0; - r.xmax = width*20; - r.ymax = height*20; - swf_SetRect(i->tag,&r); - - swf_SetShapeStyles(i->tag,shape); - swf_ShapeCountBits(shape,NULL,NULL); - swf_SetShapeBits(i->tag,shape); - - swf_ShapeSetAll(i->tag,shape,0,0,lines?ls:0,fs,0); - - swf_ShapeSetLine(i->tag,shape,width*20,0); - swf_ShapeSetLine(i->tag,shape,0,height*20); - swf_ShapeSetLine(i->tag,shape,-width*20,0); - swf_ShapeSetLine(i->tag,shape,0,-height*20); - swf_ShapeSetEnd(i->tag); - i->filesize += swf_WriteTag2(&i->out, i->tag); - swf_ShapeFree(shape); -} - -/* returns 0 on partial read */ -static int getSamples(videoreader_t*video, S16*data, int len, double speedup) -{ - double pos = 0; - double ratio = (double) video->samplerate * speedup / swf_mp3_in_samplerate; - int rlen = (int)(len * ratio); - int t; - S16 tmp[576*32]; - int r = /*resampled len */ rlen * - /* s16_le */ 2 * - video->channels; - int l = 0; - memset(tmp, 0, sizeof(tmp)); - if(r>0) - l = videoreader_getsamples(video, tmp, r); - if(l <= 0) { - return 0; - } - msg("%d samples read", l); - - /* convert to 1 channel */ - for(t=0;tchannels;s++) - a += tmp[t*video->channels+s]; - tmp[t] = a/video->channels; - } - - /* down/up-sample to the desired input samplerate (swf_mp3_in_samplerate) */ - for(t=0;taudio_fix; - int num = 0; - int pos = 0; - S16 block1[576*4 * 2]; - - msg("writeAudioForOneFrame()"); - - if(i->audio_eof || i->video->channels<=0 || i->video->samplerate<=0) { - i->audio_eof = 1; - return; /* no sound in video */ - } - - blocksize = (i->samplerate > 22050) ? 1152 : 576; - blockspersecond = ((double)i->samplerate)/blocksize; - - /* notice: for framerates greater than about 35, audio starts getting choppy. */ - framespersecond = i->framerate; - - framesperblock = framespersecond / blockspersecond; - samplesperframe = (blocksize * blockspersecond) / framespersecond; /* 11khz-samples per frame */ - samplesperblock = samplesperframe * framesperblock; - - msg("samplesperblock: %f", samplesperblock); - - if(!i->soundstreamhead) { - swf_mp3_out_samplerate = i->samplerate; - /* The pre-processing of sound samples in getSamples(..) above - re-samples the sound to swf_mp3_in_samplerate. It is best to - simply make it the original samplerate: */ - swf_mp3_in_samplerate = i->video->samplerate; - - /* first run - initialize */ - swf_mp3_channels = 1;//i->video->channels; - swf_mp3_bitrate = i->bitrate; - swf_ResetTag(i->tag, ST_SOUNDSTREAMHEAD); - /* samplesperframe overrides the movie framerate: */ - msg("swf_SetSoundStreamHead(): %08x %d", i->tag, samplesperframe); - swf_SetSoundStreamHead(i->tag, samplesperframe); - msg("swf_SetSoundStreamHead() done"); - i->filesize += swf_WriteTag2(&i->out, i->tag); - i->soundstreamhead = 1; - } - - /* for framerates greater than 19.14, every now and then a frame - hasn't a soundstreamblock. Determine whether this is the case. - */ - msg("SOUND: frame:%d soundframepos:%f samplewritepos:%d samplepos:%f\n", i->frames, i->soundframepos, i->samplewritepos, i->samplepos); - if(i->frames < i->soundframepos) { - msg("SOUND: block skipped\n"); - i->samplepos += samplesperframe; - return; - } - - seek = i->seek; - - //while(i->samplewritepos + num * blocksize < i->samplepos + blocksize) { - do { - i->samplewritepos += blocksize; - i->soundframepos += framesperblock; - num++; - } - while(i->samplewritepos < i->samplepos); - - msg("SOUND: number of blocks: %d", num); - - /* write num frames, max 1 block */ - for(pos=0;posvideo, block1, blocksize * (double)swf_mp3_in_samplerate/swf_mp3_out_samplerate, speedup)) { - i->audio_eof = 1; i->video->samplerate = i->video->channels = 0; //end of soundtrack - /* fall through, this probably was a partial read. (We did, after all, - come to this point, so i->audio_eof must have been false so far) */ - } - if(!pos) { - swf_ResetTag(i->tag, ST_SOUNDSTREAMBLOCK); - swf_SetSoundStreamBlock(i->tag, block1, seek, num); - } else { - swf_SetSoundStreamBlock(i->tag, block1, seek, 0); - } - } - i->filesize += swf_WriteTag2(&i->out, i->tag); - - i->seek = blocksize - (i->samplewritepos - i->samplepos); - i->samplepos += samplesperframe; -} - -static void writeShowFrame(v2swf_internal_t* i) -{ - do { - writeAudioForOneFrame(i); - - swf_ResetTag(i->tag, ST_SHOWFRAME); - i->filesize += swf_WriteTag2(&i->out, i->tag); - - i->fpspos -= 1.0; - i->frames ++; - } - while(i->fpspos >= 1.0); - i->showframe = 0; -} - -static void writeShowTags(v2swf_internal_t* i, int shapeid, int bmid, int width, int height) -{ - writeShape(i, shapeid, bmid, width, height); - - swf_ResetTag(i->tag, ST_PLACEOBJECT2); - if(!i->prescale) { - MATRIX m; - swf_GetMatrix(0, &m); - m.sx = m.sy = i->scale; - swf_ObjectPlace(i->tag,shapeid,shapeid,&m,0,0); - } else { - swf_ObjectPlace(i->tag,shapeid,shapeid,0,0,0); - } - i->filesize += swf_WriteTag2(&i->out, i->tag); - - i->showframe = 1; -} - -static int wwrite(writer_t*w, void*data, int len) -{ - v2swf_internal_t* i = (v2swf_internal_t*)w->internal; - ringbuffer_put(&i->r, data, len); - return len; -} - -static void wfinish(writer_t*w) -{ - v2swf_internal_t* i = (v2swf_internal_t*)w->internal; -} - -static void writehead(v2swf_internal_t*i) -{ - char header[]="FWS\6\0\0\0\4"; - SWF swf; - int ret; - int id; - - header[3] = i->version; - if(i->version >= 6) { //MX - header[0] = 'C'; - - i->out2.write = wwrite; - i->out2.finish = wfinish; - i->out2.internal = i; - i->out2.type = 77; - i->out2.bitpos = 0; - i->out2.mybyte = 0; - i->out2.pos = 0; - writer_init_zlibdeflate(&i->out, &i->out2); - } else { - i->out.write = wwrite; - i->out.finish = wfinish; - i->out.internal = i; - i->out.type = 77; - i->out.bitpos = 0; - i->out.mybyte = 0; - i->out.pos = 0; - i->out2 = i->out; - } - - if(i->prescale) { - i->width = (int)(i->video->width*(i->scale/65536.0)); - i->height = (int)(i->video->height*(i->scale/65536.0)); - } else { - i->width = i->video->width; - i->height = i->video->height; - } - if(!i->width) - i->width = 1; - if(!i->height) - i->height = 1; - i->buffer = (unsigned char*)malloc(i->width*i->height*4); - i->vrbuffer = (unsigned char*)malloc(i->video->width*i->video->height*4); - - memset(&swf, 0, sizeof(SWF)); - swf.fileVersion=i->version; - swf.fileSize = 0; - swf.frameCount = 65535; - swf.movieSize.xmax=i->width*20; - swf.movieSize.ymax=i->height*20; - swf.compressed = 8; /* 8 = compression done by caller (us) */ - swf.frameRate = (int)(i->framerate*0x100);//25*0x100; - - /* write the first 8 bytes to out */ - i->out2.write(&i->out2, header, 8); - - i->filesize += swf_WriteHeader2(&i->out, &swf); - i->headersize = i->filesize; - - i->tag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); - swf_SetU8(i->tag, 0); //black - swf_SetU8(i->tag, 0); - swf_SetU8(i->tag, 0); - i->filesize += swf_WriteTag2(&i->out, i->tag); -} - -static void finish(v2swf_internal_t*i) -{ - msg("finish(): i->finished=%d\n", i->finished); - if(!i->finished) { - msg("write endtag\n", i->finished); - - if(i->add_cut) { - swf_ResetTag(i->tag, ST_SHOWFRAME); - i->filesize += swf_WriteTag2(&i->out, i->tag); - - swf_ResetTag(i->tag, ST_REMOVEOBJECT2); - swf_SetU16(i->tag, 1); //depth - i->filesize += swf_WriteTag2(&i->out, i->tag); - - swf_ResetTag(i->tag, ST_DOACTION); - swf_SetU16(i->tag, 0x0007); - i->filesize += swf_WriteTag2(&i->out, i->tag); - } - - swf_ResetTag(i->tag, ST_END); - i->filesize += swf_WriteTag2(&i->out, i->tag); - - i->out.finish(&i->out); - - if(i->version>=6) { - swf_VideoStreamClear(&i->stream); - } - if(i->buffer) { - free(i->buffer);i->buffer = 0; - } - if(i->vrbuffer) { - free(i->vrbuffer);i->vrbuffer = 0; - } - if(i->lastbitmap) { - free(i->lastbitmap);i->lastbitmap = 0; - } - - /* FIXME: we shouldn't be doing this. the caller should */ - msg("call videoreader_close(%08x)\n", i->video); - videoreader_close(i->video); - - i->finished = 1; - } - msg("finishing done\n"); -} -static void cleanup(v2swf_internal_t*i) -{ - int t; - for(t=i->lastid;tid;t++) { - if(!(t&1)) { - swf_ResetTag(i->tag, ST_REMOVEOBJECT2); - swf_SetU16(i->tag, t); - i->filesize += swf_WriteTag2(&i->out, i->tag); - } - swf_ResetTag(i->tag, ST_FREECHARACTER); - swf_SetU16(i->tag, t); - i->filesize += swf_WriteTag2(&i->out, i->tag); - } - i->lastid = i->id; -} - -#define DIFFMODE_MAX 1 -#define DIFFMODE_MEAN 2 -#define DIFFMODE_EXACT 3 -#define DIFFMODE_QMEAN 4 - -static int blockdiff_max(U8*d1,U8*d2,int yadd, int maxdiff, int xl, int yl) -{ - int x,y; - for(y=0;ymaxdiff) - return 1; - - d1+=4; d2+=4; - } - d1 += yadd; d2 += yadd; - } - return 0; -} - -static int blockdiff_mean(U8*d1,U8*d2,int yadd, int maxdiff, int xl, int yl) -{ - int mean = 0; - int x,y; - for(y=0;y maxdiff) - return 1; - return 0; -} - -static int blockdiff_qmean(U8*d1,U8*d2,int yadd, int maxdiff, int xl, int yl) -{ - int mean = 0; - int x,y; - for(y=0;y maxdiff*maxdiff) - return 1; - return 0; -} - -static int blockdiff_exact(U8*d1,U8*d2,int yadd, int xl, int yl) -{ - int x,y; - for(y=0;yhead_done) { - writehead(i); - if(i->version>=6) { - swf_ResetTag(i->tag, ST_DEFINEVIDEOSTREAM); - swf_SetU16(i->tag, 99); - swf_SetVideoStreamDefine(i->tag, &i->stream, 65535, i->width, i->height); - i->filesize += swf_WriteTag2(&i->out, i->tag); - if(i->domotion) { - i->stream.do_motion = 1; - } - } - i->head_done = 1; - } -} - -static void scaleimage(v2swf_internal_t*i) -{ - int x,y; - int xv,yv; - int xm = (i->video->width*65536)/i->width; - int ym = (i->video->height*65536)/i->height; - msg("scaling from %dx%d to %dx%d\n", - i->video->width, i->video->height, - i->width, i->height - ); - - memset(i->buffer, 255, i->width*i->height*4); - for(y=0,yv=0;yheight;y++,yv+=ym) { - int*src = &((int*)i->vrbuffer)[(yv>>16)*i->video->width]; - int*dest = &((int*)i->buffer)[y*i->width]; - for(x=0,xv=0;xwidth;x++,xv+=xm) { - dest[x] = src[xv>>16]; - } - } - //memcpy(i->buffer, i->vrbuffer, i->width*i->height*4); -} - -static int writeAudioOnly(v2swf_internal_t*i) -{ - if(i->showframe) { - i->fpspos += i->fpsratio; - /* skip frames */ - if(i->fpspos<1.0) { - return 0; - } - writeShowFrame(i); - } - i->showframe = 1; - return 1; -} - -static int getframe(v2swf_internal_t*i) -{ - if(!i->skipframes) - return videoreader_getimage(i->video, i->vrbuffer); - else { - int t; - for(t=0;tskipframes;t++) { - int ret = videoreader_getimage(i->video, i->vrbuffer); - if(!ret) - return 0; - } - return 1; - } -} - -static int encodeoneframe(v2swf_internal_t*i) -{ - videoreader_t*video = i->video; - int ret; - - checkInit(i); - - if(i->video_eof && i->audio_eof) { - if(!i->finished) - finish(i); - return 0; - } - - if(!i->audio_eof && i->video_eof) { - return writeAudioOnly(i); - } - - if(!getframe(i) || (i->numframes && i->frames==i->numframes)) - { - i->video_eof = 1; - msg("videoreader returned eof\n"); - if(i->audio_eof || (i->numframes && i->frames==i->numframes)) { - finish(i); - return 0; - } else { - return writeAudioOnly(i); - } - } - - msg("encoding image for frame %d\n", i->frames); - if(i->showframe) { - i->fpspos += i->fpsratio; - /* skip frames */ - if(i->fpspos<1.0) { - return 0; - } - writeShowFrame(i); - } - - scaleimage(i); - - msg("version is %d\n", i->version); - - if(i->version <= 4) { - - int bmid = i->id++; - int shapeid = i->id++; - int width2 = i->width * 4; - - if(i->id>=4) { - swf_ResetTag(i->tag, ST_REMOVEOBJECT2); - swf_SetU16(i->tag, i->id-3); - i->filesize += swf_WriteTag2(&i->out, i->tag); - swf_ResetTag(i->tag, ST_FREECHARACTER); - swf_SetU16(i->tag, i->id-4); - i->filesize += swf_WriteTag2(&i->out, i->tag); - } - - swf_ResetTag(i->tag, ST_DEFINEBITSJPEG2); - swf_SetU16(i->tag, bmid); - swf_SetJPEGBits2(i->tag, i->width, i->height, (RGBA*)i->buffer, i->quality); - i->filesize += swf_WriteTag2(&i->out, i->tag); - - writeShowTags(i, shapeid, bmid, i->width, i->height); - - } else if(i->version == 5) { - int width2 = i->width * 4; - int width8 = (i->width+7)/8; - int height8 = (i->height+7)/8; - - /* the idea is here to only update those jpeg 8x8 blocks - which actually have changed. This means that we have to keep - the bitmap from the last frame for the comparison. */ - - (i->keyframe)--; - if(!i->lastbitmap || !i->keyframe) { - int t, bmid,shapeid; - cleanup(i); - - if(!i->lastbitmap) { - msg("Creating bitmap buffer for %dx%d (%dx%d), (%dx%d)\n", i->width, i->height, width2, i->height, width8, height8); - i->lastbitmap = (U8*)malloc(width2*i->height); - } - memcpy(i->lastbitmap, i->buffer, width2*i->height); - - i->keyframe = i->keyframe_interval; - - bmid = i->id++; - shapeid = i->id++; - width2 = i->width * 4; - swf_ResetTag(i->tag, ST_DEFINEBITSJPEG2); - swf_SetU16(i->tag, bmid); - swf_SetJPEGBits2(i->tag, i->width, i->height, (RGBA*)i->buffer, i->quality); - i->filesize += swf_WriteTag2(&i->out, i->tag); - - writeShowTags(i, shapeid, bmid, i->width, i->height); - return 1; - } else { - /* The following looks so ugly because it's somewhat optimized. - What it does is walk through all the 8x8 blocks, find those - which have changed too much and set all others to (R,G,B,A)=(0,0,0,0). - It also set's alpha to 255 in those who haven't changed, and - copies them to lastbitmap. - */ - - int x8, y8; - //int maxdiff = ((100 - i->quality)*256)/100; - int maxdiff = i->blockdiff*3; - for(y8=0;y8 i->width) - xl = i->width - x8*8; - if(y8*8+yl > i->height) - yl = i->height - y8*8; - d1 = &i->buffer[width2*y8*8+x8*8*4]; - d1b = d1; - d2 = &i->lastbitmap[width2*y8*8+x8*8*4]; - d2b = d2; - yadd = width2 - (xl*4); - - if(i->diffmode == DIFFMODE_MAX) { - if(blockdiff_max(d1, d2, yadd, maxdiff, xl, yl)) - goto differ; - } else if(i->diffmode == DIFFMODE_MEAN) { - if(blockdiff_mean(d1, d2, yadd, maxdiff, xl, yl)) - goto differ; - } else if(i->diffmode == DIFFMODE_EXACT) { - if(blockdiff_exact(d1, d2, yadd, xl, yl)) - goto differ; - } else if(i->diffmode == DIFFMODE_QMEAN) { - if(blockdiff_qmean(d1, d2, yadd, maxdiff, xl, yl)) - goto differ; - } - - for(y=0;yid++; - int shapeid = i->id++; - - swf_ResetTag(i->tag, ST_DEFINEBITSJPEG3); - swf_SetU16(i->tag, bmid); - swf_SetJPEGBits3(i->tag, i->width, i->height, (RGBA*)i->buffer, i->quality); - i->filesize += swf_WriteTag2(&i->out, i->tag); - - writeShowTags(i, shapeid, bmid, i->width, i->height); - } - } else { - int quant = 1+(30-(30*i->quality)/100); - SWFPLACEOBJECT obj; - - swf_GetPlaceObject(0, &obj); - if(!i->prescale) { - obj.matrix.sx = obj.matrix.sy = i->scale; - } - - if(i->stream.frame==0) { - obj.depth = 1; - obj.id = 99; - } else { - obj.move = 1; - obj.depth = 1; - obj.ratio = i->stream.frame; - } - - swf_ResetTag(i->tag, ST_VIDEOFRAME); - swf_SetU16(i->tag, 99); - if(!(--i->keyframe)) { - msg("setting video I-frame, ratio=%d\n", i->stream.frame); - swf_SetVideoStreamIFrame(i->tag, &i->stream, (RGBA*)i->buffer, quant); - i->keyframe = i->keyframe_interval; - } else { - msg("setting video P-frame, ratio=%d\n", i->stream.frame); - swf_SetVideoStreamPFrame(i->tag, &i->stream, (RGBA*)i->buffer, quant); - } - i->filesize += swf_WriteTag2(&i->out, i->tag); - - swf_ResetTag(i->tag, ST_PLACEOBJECT2); - swf_SetPlaceObject(i->tag,&obj); - i->filesize += swf_WriteTag2(&i->out, i->tag); - i->showframe = 1; - } - return 1; -} - -static void init_fps(v2swf_internal_t*i) -{ - int oldframerate = i->framerate; - i->framerate = i->video->fps / i->skipframes; - i->video_fps = ((int)(i->framerate*256))/256.0; - if(oldframerate) - msg("setting new framerate to %f\n", i->framerate); -} - -int v2swf_init(v2swf_t*v2swf, videoreader_t * video) -{ - int ret = 0; - int t=0; - v2swf_internal_t* i; - msg("v2swf_init()\n"); - memset(v2swf, 0, sizeof(v2swf_t)); - i = (v2swf_internal_t*)malloc(sizeof(v2swf_internal_t)); - memset(i, 0, sizeof(v2swf_internal_t)); - v2swf->internal = i; - - ringbuffer_init(&i->r); - - i->skipframes = 1; - i->framerate = 0; - i->video = video; - init_fps(i); - - msg("video: %dx%d, fps %f\n", video->width, video->height, video->fps); - - i->blockdiff = 64; - i->keyframe_interval = 8; - i->quality = 20; - i->scale = 65536; - i->add_cut = 1; - i->samplerate = 11025; - i->prescale = 0; - i->numframes= 0; - i->skipframes = 0; - i->head_done = 0; - i->diffmode = DIFFMODE_QMEAN; - i->audio_fix = 1.0; - i->fixheader = 0; - i->fpsratio = 1.00000000000; - i->fpspos = 0.0; - i->bitrate = 32; - i->version = 6; - i->buffer = 0; - i->lastbitmap = 0; - i->filesize = 8; - i->frames = 0; - i->id = 1; - i->lastid = 1; - i->keyframe = 1; - i->showframe = 0; - - memset(&i->out, 0, sizeof(writer_t)); - memset(&i->out2, 0, sizeof(writer_t)); - - return 0; -} -int v2swf_read(v2swf_t*v2swf, void*buffer, int len) -{ - v2swf_internal_t* i; - int l; - msg("v2swf_read(%d)\n", len); - i = (v2swf_internal_t*)v2swf->internal; - - while(!i->finished && i->r.available < len) { - if(!encodeoneframe(i)) { - break; - } - } - msg("v2swf_read() done: %d bytes available in ringbuffer\n", i->r.available); - l = ringbuffer_read(&i->r, buffer, len); - - return l; -} -void v2swf_close(v2swf_t*v2swf) -{ - v2swf_internal_t* i = (v2swf_internal_t*)v2swf->internal; - msg("close(): i->finished=%d\n", i->finished); - - /* needed only if aborting: */ - finish(i); - - msg("freeing memory\n"); - free(v2swf->internal); - memset(v2swf, 0, sizeof(v2swf_t)); - msg("close() done\n"); -} - -static int mp3_bitrates[] = -{ 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0}; - -void v2swf_setparameter(v2swf_t*v2swf, char*name, char*value) -{ - v2swf_internal_t* i; - - msg("set parameters %s to %s\n", name, value); - - if(!strcmp(name, "verbose")) { - verbose = 1; - msg("set parameters %s to %s\n", name, value); - return; - } - - if(!v2swf || !v2swf->internal) { - printf("error- couldn't set parameter %s: not initialized yet\n", name);fflush(stdout); - return; - } - i = (v2swf_internal_t*)v2swf->internal; - - if(!strcmp(name, "flash_version")) { - i->version = atoi(value); - } else if(!strcmp(name, "audiosync")) { - i->audio_fix = (int)(atof(value)); - } else if(!strcmp(name, "addcut")) { - i->add_cut = atoi(value); - } else if(!strcmp(name, "scale")) { - i->scale = (int)(atof(value)*65536); - } else if(!strcmp(name, "scale65536")) { - i->scale = atoi(value); - } else if(!strcmp(name, "quality")) { - i->quality = atoi(value); - } else if(!strcmp(name, "skipframes")) { - i->skipframes = atoi(value); - init_fps(i); - } else if(!strcmp(name, "numframes")) { - i->numframes = atoi(value); - } else if(!strcmp(name, "motioncompensation")) { - i->domotion = atoi(value); - } else if(!strcmp(name, "prescale")) { - i->prescale = atoi(value); - } else if(!strcmp(name, "blockdiff")) { - i->blockdiff = atoi(value); - } else if(!strcmp(name, "fixheader")) { - i->fixheader = atoi(value); - } else if(!strcmp(name, "samplerate")) { - i->samplerate = atoi(value); - } else if(!strcmp(name, "framerate")) { - i->framerate = atof(value); - i->fpsratio = i->framerate / i->video_fps; - } - else if(!strcmp(name, "mp3_bitrate")) { - int t=0,o; - i->bitrate = o = atoi(value); - if(i->bitrate>160) - i->bitrate = 160; - while(mp3_bitrates[t]) { - if(i->bitrate <= mp3_bitrates[t]) { - i->bitrate = mp3_bitrates[t]; - break; - } - t++; - } - msg("bitrate %d requested, setting to %d", o, i->bitrate); - } - else if(!strcmp(name, "blockdiff_mode")) { - if(!strcmp(value, "max")) i->diffmode = DIFFMODE_MAX; - else if(!strcmp(value, "mean")) i->diffmode = DIFFMODE_MEAN; - else if(!strcmp(value, "qmean")) i->diffmode = DIFFMODE_QMEAN; - else if(!strcmp(value, "exact")) i->diffmode = DIFFMODE_EXACT; - else { - printf("diffmode %s not recognized\n", value); - printf("valid diffmodes are: %s\n", "max, mean, qmean, exact"); - } - } - else if(!strcmp(name, "keyframe_interval") - || !strcmp(name, "keyframe")) { - int k = atoi(value);if(k<=0) k=1; - i->keyframe_interval = k; - } - else { - printf("Setting encoder.%s not recognized!\n", name);fflush(stdout); - return; - } -} -void v2swf_backpatch(v2swf_t*v2swf, char*filename) -{ - FILE* fi; - unsigned char f; - v2swf_internal_t* i = (v2swf_internal_t*)v2swf->internal; - msg("v2swf_backpatch %s\n", filename); - if(!i) { - printf("call backpatch before close\n");fflush(stdout); - } - fi = fopen(filename, "rb+"); - if(!fi) { - printf("can't open %s\n", filename); - exit(1); - } - fseek(fi, 4, SEEK_SET); - f = i->filesize ;fwrite(&f,1,1,fi); - f = i->filesize >> 8 ;fwrite(&f,1,1,fi); - f = i->filesize >> 16;fwrite(&f,1,1,fi); - f = i->filesize >> 24;fwrite(&f,1,1,fi); - if(i->version<6) { - /* no compression- we can backpatch the frames too */ - fseek(fi, i->headersize-2, SEEK_SET); - f = i->frames ;fwrite(&f,1,1,fi); - f = i->frames >> 8 ;fwrite(&f,1,1,fi); - } - fclose(fi); - if(i->fixheader) { - SWF tmp; - int fi; - msg("v2swf_backpatch %s - fix header\n", filename); - memset(&tmp, 0, sizeof(tmp)); - fi = open(filename, O_RDONLY|O_BINARY); - if(fi>=0) { - if(swf_ReadSWF(fi, &tmp)>=0) { - close(fi); - fi = open(filename, O_WRONLY|O_BINARY|O_TRUNC|O_CREAT, 0666); - if(fi>=0) { - swf_WriteSWF(fi, &tmp); - close(fi); - msg("v2swf_backpatch %s - fix header: success\n", filename); - } - } - } - } -} - -void v2swf_setvideoparameter(videoreader_t*v, char*name, char*value) -{ - msg("v2swf_setvideoparameter()"); - videoreader_setparameter(v, name, value); -} diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/v2swf.h b/fluidbook/tools/swftools-special-swfdump/avi2swf/v2swf.h deleted file mode 100644 index 56f2c97a3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/v2swf.h +++ /dev/null @@ -1,46 +0,0 @@ -/* v2swf.h - header file for v2swf.h - part of SWFTools - - Copyright (C) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __video_h__ -#define __video_h__ - -#ifdef __cplusplus -extern "C" { -#else -typedef unsigned char bool; -#endif - -#include "videoreader.h" - -typedef struct _v2swf_t -{ - void*internal; -} v2swf_t; - -int v2swf_init(v2swf_t*v2swf, videoreader_t * video); -int v2swf_read(v2swf_t*v2swf, void*buffer, int len); -void v2swf_setparameter(v2swf_t*v2swf, char*name, char*value); -void v2swf_close(v2swf_t*v2swf); -void v2swf_backpatch(v2swf_t*v2swf, char*filename); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader.h b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader.h deleted file mode 100644 index 9392d8ca7..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef __videoreader_t__ -#define __videoreader_t__ - -#define videoreader_getsamples(v, buffer, num) ((v)->getsamples((v),(buffer),(num))) -#define videoreader_getimage(v, buffer) ((v)->getimage((v),(buffer))) -#define videoreader_eof(v) ((v)->eof(v)) -#define videoreader_setparameter(v,name,value) ((v)->setparameter((v),(name),(value))) -#define videoreader_close(v) ((v)->close(v)) - -typedef struct _videoreader_t -{ - void*internal; - - /* video */ - int width; - int height; - double fps; - - /* audio */ - int channels; - int samplerate; - - /* progress */ - int frame; - - void (*setparameter) (struct _videoreader_t*, char*name, char*value); - int (*getsamples) (struct _videoreader_t*, void*buffer, int num); - int (*getimage) (struct _videoreader_t*, void*buffer); // buffer must hold width*height*4 bytes - void (*close) (struct _videoreader_t*); - -} videoreader_t; - - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.cc b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.cc deleted file mode 100644 index 371835d84..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.cc +++ /dev/null @@ -1,354 +0,0 @@ -/* videoreader_avifile.cc - Read avi files using the avifile library. - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../config.h" -#include "videoreader.h" - -#ifdef HAVE_AVIFILE - -#undef HAVE_CONFIG_H - -#ifdef HAVE_VERSION_H - #include -#endif -#ifdef HAVE_AVIFILE_VERSION_H - #include -#endif - -#if (AVIFILE_MAJOR_VERSION == 0) && (AVIFILE_MINOR_VERSION>=6) - #include - #include - #include - #include - #include - #define VERSION6 -#else - #include - #include - #include - #define Width width - #define Height height - #define Data data - #define Bpp bpp -#endif - -#ifdef HAVE_SIGNAL_H -#ifdef HAVE_PTHREAD_H -#include -#include -#define DO_SIGNALS -#endif -#endif - -#include "../lib/q.h" - -static int verbose = 0; - -typedef struct _videoreader_avifile_internal -{ - IAviReadFile* player; - IAviReadStream* astream; - IAviReadStream* vstream; - int do_audio; - int do_video; - int video_eof; - int audio_eof; - int flip; - int frame; - int soundbits; - ringbuffer_t audio_buffer; -} videoreader_avifile_internal; - -static int readSamples(videoreader_avifile_internal*i, void*buffer, int buffer_size, int numsamples) -{ - int ret; - while(i->audio_buffer.available < buffer_size) { - unsigned int samples_read = 0, bytes_read = 0; - ret = i->astream->ReadFrames(buffer, buffer_size, numsamples, samples_read, bytes_read); - if(ret!=0) { - if(verbose) { - printf("ReadFrames() returns %d\n", ret);fflush(stdout); - } - } - if(samples_read<=0) { - int l = i->audio_buffer.available; - ringbuffer_read(&i->audio_buffer, buffer, l); - return l; - } - ringbuffer_put(&i->audio_buffer, buffer, bytes_read); - } - ringbuffer_read(&i->audio_buffer, buffer, buffer_size); - return buffer_size; -} -static int videoreader_avifile_getsamples(videoreader_t* v, void*buffer, int num) -{ - videoreader_avifile_internal*i = (videoreader_avifile_internal*)v->internal; - if(verbose) { - printf("videoreader_getsamples(%d)\n", num);fflush(stdout); - } - if(i->audio_eof) - return 0; - if(i->soundbits == 8) { - int num_read = readSamples(i, buffer, num/2, num/(v->channels*2))*2; - unsigned char*b = (unsigned char*)buffer; - int t; - for(t=num_read-2;t>=0;t-=2) { - unsigned char x = b[t/2]; - b[t] = 0; - b[t+1] = x-128; - } - if(!num_read) { - if(verbose) { - printf("end of audio\n");fflush(stdout); - } - i->audio_eof=1; - } - return num_read; - } - if(i->soundbits == 16) { - int num_read = readSamples(i, buffer, num, num/(v->channels*2)); - if(!num_read) { - if(verbose) { - printf("end of audio\n");fflush(stdout); - } - i->audio_eof=1; - } - return num_read; - } - return 0; -} -static int videoreader_avifile_getimage(videoreader_t* v, void*buffer) -{ - videoreader_avifile_internal*i = (videoreader_avifile_internal*)v->internal; - if(verbose) { - printf("videoreader_getimage()\n");fflush(stdout); - } - - if(i->video_eof) - return 0; - - if(i->vstream->ReadFrame() < 0) { - if(verbose) printf("vstream->ReadFrame() returned value < 0, shutting down...\n"); - i->video_eof = 1; - return 0; - } - CImage*img2 = 0; - CImage*img = i->vstream->GetFrame(); - if(!img) { - if(verbose) printf("vstream->GetFrame() returned NULL, shutting down...\n"); - i->video_eof = 1; - return 0; - } - /* we convert the image to YUV first, because we can convert to RGB from YUV only */ - img->ToYUV(); - img->ToRGB(); - if(img->Bpp() != 3) { - if(verbose) printf("Warning: converthing from bpp %d to bpp 3, this fails on older avifile versions...\n", img->Bpp()); - BitmapInfo tmp(v->width, v->height, 24); - img2 = new CImage(img, &tmp); - img = img2; - } - - v->frame++; - i->frame++; - unsigned char*data = img->Data(); - int bpp = img->Bpp(); - if(bpp == 3) { - int x,y; - for(y=0;yheight;y++) { - unsigned char*from,*to; - to = &((unsigned char*)buffer)[y*v->width*4]; - if(i->flip) - from = img->At(v->height-y-1); - else - from = img->At(y); - for(x=0;xwidth;x++) { - to[x*4+0] = 0; - to[x*4+1] = from[x*3+2]; - to[x*4+2] = from[x*3+1]; - to[x*4+3] = from[x*3+0]; - } - } - if(img2) delete img2; - return v->width*v->height*4; - } else { - if(img2) delete img2; - if(verbose) printf("Can't handle bpp %d, shutting down...\n", bpp); - i->video_eof = 1; - return 0; - } -} -static void videoreader_avifile_close(videoreader_t* v) -{ - videoreader_avifile_internal*i = (videoreader_avifile_internal*)v->internal; - if(verbose) { - printf("videoreader_close()\n");fflush(stdout); - } - if(i->do_audio) { - ringbuffer_clear(&i->audio_buffer); - } -} -static void videoreader_avifile_setparameter(videoreader_t*v, char*name, char*value) -{ - videoreader_avifile_internal*i = (videoreader_avifile_internal*)v->internal; - if(!strcmp(name, "verbose")) { - verbose = atoi(value); - } - if(!strcmp(name, "flip")) { - i->flip = atoi(value); - } - if(verbose) { - printf("videoreader_setparameter(%s, %s)\n", name, value);fflush(stdout); - } -} - -int videoreader_avifile_open(videoreader_t* v, char* filename) -{ - if(!filename) { - /* codec query */ - return 0; - } - videoreader_avifile_internal* i; - i = (videoreader_avifile_internal*)malloc(sizeof(videoreader_avifile_internal)); - memset(i, 0, sizeof(videoreader_avifile_internal)); - memset(v, 0, sizeof(videoreader_t)); - v->getsamples = videoreader_avifile_getsamples; - v->close = videoreader_avifile_close; - v->getimage = videoreader_avifile_getimage; - v->getsamples = videoreader_avifile_getsamples; - v->setparameter = videoreader_avifile_setparameter; - v->internal = i; - v->frame = 0; - - i->do_video = 1; - i->do_audio = 1; - - i->player = CreateIAviReadFile(filename); - if(verbose) { - printf("%d streams (%d video, %d audio)\n", - i->player->StreamCount(), - i->player->VideoStreamCount(), - i->player->AudioStreamCount()); - } - i->astream = i->player->GetStream(0, AviStream::Audio); - i->vstream = i->player->GetStream(0, AviStream::Video); - if(!i->vstream) { - printf("Couldn't open video stream\n"); - i->do_video = 0; - } - if(!i->astream) { - printf("Couldn't open video stream\n"); - i->do_audio = 0; - } -#ifdef NO_MP3 - if(i->do_audio) { - printf(stderr, "MP3 support has been disabled at compile time, not converting soundtrack"); - i->do_audio = 0; - } -#endif - - if(!i->do_video && !i->do_audio) { - printf("File has neither audio nor video streams.(?)\n"); - return -1; - } - -#ifndef VERSION6 - MainAVIHeader head; - int dwMicroSecPerFrame = 0; - player->GetFileHeader(&head); - printf("fps: %d\n", 1000000/head.dwMicroSecPerFrame); - printf("frames: %d\n", head.dwTotalFrames); - printf("streams: %d\n", head.dwStreams); - printf("width: %d\n", abs(head.dwWidth)); - printf("height: %d\n", abs(head.dwHeight)); - printf("sound: %u samples (%f seconds)\n", i->astream->GetEndPos(), i->astream->GetEndTime()); - v->width = abs(head.dwWidth); - v->height = abs(head.dwHeight); - dwMicroSecPerFrame = head.dwMicroSecPerFrame; - samplesperframe = astream->GetEndPos()/astream->GetEndTime()*head.dwMicroSecPerFrame/1000000; - v->samplerate = (int)(astream->GetEndPos()/astream->GetEndTime()); - v->fps = 1000000.0/dwMicroSecPerFrame; - i->soundbits = 16; -#else - if(i->do_video) - { - StreamInfo*videoinfo; - videoinfo = i->vstream->GetStreamInfo(); - v->width = abs(videoinfo->GetVideoWidth()); - v->height = abs(videoinfo->GetVideoHeight()); - v->fps = (double)(videoinfo->GetFps()); - } - if(i->do_audio) - { - WAVEFORMATEX wave; - StreamInfo*audioinfo; - - i->astream->GetAudioFormatInfo(&wave,0); - audioinfo = i->astream->GetStreamInfo(); - - v->channels = wave.nChannels; - v->samplerate = wave.nSamplesPerSec; - i->soundbits = wave.wBitsPerSample; - - if(v->channels==0 || v->samplerate==0 || i->soundbits==0 || wave.wFormatTag!=1) { - v->samplerate = audioinfo->GetAudioSamplesPerSec(); - v->channels = audioinfo->GetAudioChannels(); - i->soundbits = audioinfo->GetAudioBitsPerSample(); - } - - if(verbose) { - printf("formatinfo: format %d, %d channels, %d bits/sample, rate %d, blockalign %d\n", wave.wFormatTag, wave.nChannels, wave.wBitsPerSample, wave.nSamplesPerSec, wave.nBlockAlign); - printf("audioinfo: %d channels, %d bits/sample, rate %d\n", audioinfo->GetAudioChannels(), audioinfo->GetAudioBitsPerSample(), audioinfo->GetAudioSamplesPerSec()); - } - if(i->soundbits != 8 && i->soundbits != 16) { - printf("Can't handle %d bit audio, disabling sound\n", wave.wBitsPerSample); - i->do_audio = 0; - i->soundbits = 0; - v->channels = 0; - v->samplerate = 0; - } - } -#endif - i->vstream -> StartStreaming(); - if(i->do_audio) { - i->astream -> StartStreaming(); - ringbuffer_init(&i->audio_buffer); -#ifdef VERSION6 - WAVEFORMATEX wave; - i->astream -> GetOutputFormat(&wave, sizeof(wave)); - printf("formatinfo: format %d, %d channels, %d bits/sample, rate %d, blockalign %d\n", wave.wFormatTag, wave.nChannels, wave.wBitsPerSample, wave.nSamplesPerSec, wave.nBlockAlign); -#endif - } - - return 0; -} - -#else //HAVE_AVIFILE - -int videoreader_avifile_open(videoreader_t* v, char* filename) -{ - return -1; -} - -#endif //HAVE_AVIFILE diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.hh b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.hh deleted file mode 100644 index 4486536d8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_avifile.hh +++ /dev/null @@ -1,29 +0,0 @@ -/* videoreader_avifile.hh - Read avi files using the avifile library. - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __videoreader_avifile_h__ -#define __videoreader_avifile_h__ - -#include "videoreader.h" - -int videoreader_avifile_open(videoreader_t* v, char* filename); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.cc b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.cc deleted file mode 100644 index ca8a6b72f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.cc +++ /dev/null @@ -1,401 +0,0 @@ -/* videoreader_vfw.cc - Read avi files using Video For Windows (vfw). - - Part of the swftools package. - - Copyright (c) 2004 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "videoreader.h" -#ifdef WIN32 -#include -#include -#include -#include - -typedef struct _videoreader_vfw_internal { - //video: - PAVISTREAM vs; - //audio: - PAVISTREAM as; - - PGETFRAME getframe; - IAVIFile* avifile; - BITMAPINFOHEADER bitmap; - WAVEFORMATEX waveformat; - - int audio_eof; - int video_eof; - - int video_pos; - int video_end; - - int audio_pos; - int audio_end; - - float fps; - int width,height; - - int samplerate; - int channels; - - int flip; -} videoreader_vfw_internal_t; - -static int avifile_initialized = 0; -static int verbose; - -#define _TRACE_ {printf("vfw: %s: %d (%s)\n",__FILE__,__LINE__,__func__);fflush(stdout);} - -static int bitmap_to_rgba(BITMAPINFOHEADER*bi, void*buffer, const int dest_width, const int dest_height, int flip) -{ - UCHAR*data = (UCHAR*)(bi+1); // actual bitmap data starts after the header - - if(bi->biPlanes!=1 || bi->biCompression!=0 || bi->biBitCount%4!=0) { - /* unsupported format */ - fprintf(stderr, "bitmap_to_rgba: unsupported format: biPlanes=%d, biCompression=%d biBitCount=%d\n", - bi->biPlanes, bi->biCompression, bi->biBitCount); - return 0; - } - - ULONG*dest = (ULONG*)buffer; - - int width = abs(bi->biWidth); - int height = abs(bi->biHeight); - if(dest_width != width || dest_height != height) { - /* TODO: size conversion */ - fprintf(stderr, "size mismatch: %dx%d != %dx%d\n", width, height, dest_width, dest_height); - return 0; - } - - /* convert the various image types to RGBA- - TODO: is there some way to let the Windows API do this? */ - int bytesperpixel = ((bi->biWidth*bi->biBitCount)+7)&~7; - int linex = ((bytesperpixel/8)+3)&~3; - memset(dest, 255, dest_width*dest_height*4);//pre-fill alpha channel - - const int starty = flip? 0 : dest_height-1; - const int endy = flip? dest_height : -1; - const int yinc = flip? 1 : -1; - - if(verbose) { - printf("vfw: Convering scanlines %d to %d from bpp %d, %d stepping, flip=%d\n", starty, endy, bi->biBitCount, yinc, flip); - } - - if(bi->biBitCount==1) { - UCHAR*img = data; - int y; - for(y=starty;y!=endy;y+=yinc) { - UCHAR*line = &img[linex*y]; - int x; - for(x=0;x>(x&7))&1); - } - } - } else if(bi->biBitCount==4) { - UCHAR*img = &data[bi->biClrUsed*4]; - UCHAR*pal = data; - int y; - for(y=starty;y!=endy;y+=yinc) { - UCHAR*line = &img[linex*y]; - int x; - for(x=0;x>4)<<2|0]<<8|pal[(line[0]>>4)<<2|1]<<16|pal[(line[0]>>4)<<2|2]<<24; - *dest++ = 255|pal[(line[0]&0x0f)<<2|0]<<8|pal[(line[0]&0x0f)<<2|1]<<16|pal[(line[0]&0x0f)<<2|2]<<24; - line++; - } - } - } else if(bi->biBitCount==8) { - UCHAR*img = &data[bi->biClrUsed*4]; - UCHAR*pal = data; - int y; - for(y=starty;y!=endy;y+=yinc) { - UCHAR*line = &img[linex*y]; - int x; - for(x=0;xbiBitCount==16) { - UCHAR*img = data; - int y; - for(y=starty;y!=endy;y+=yinc) { - UCHAR*line = &img[linex*y]; - int x; - for(x=0;x>5&0x1f)<<(16+3)|(c>>10&0x1f)<<(8+3); - line+=2; - } - } - } else if(bi->biBitCount==24) { - UCHAR*img = data; - int y; - for(y=starty;y!=endy;y+=yinc) { - UCHAR*line = &img[linex*y]; - int x; - for(x=0;xbiBitCount==32) { - UCHAR*img = data; - int y; - for(y=starty;y!=endy;y+=yinc) { - UCHAR*line = &img[linex*y]; - int x; - for(x=0;xbiBitCount); - return 0; - } - return 1; -} - -static int videoreader_vfw_getimage(videoreader_t* vr, void*buffer) -{ - videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal; - - if (i->video_pos >= i->video_end) - i->video_eof = 1; - - if(i->video_eof) - return 0; - - LPBITMAPINFOHEADER bi; - bi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(i->getframe, i->video_pos); - - i->video_pos++; - vr->frame++; - - if(!bi) { - fprintf(stderr, "AVIStreamGetFrame failed\n"); - return 0; - } - - if(!bitmap_to_rgba(bi, buffer, i->width, i->height, i->flip)) { - fprintf(stderr, "couldn't convert bitmap to RGBA.\n"); - return 0; - } - return i->width*i->height*4; -} - -static int readAudioBlock(videoreader_vfw_internal_t* i, void*buf, int len) -{ - LONG bytes; - LONG samples; - AVIStreamRead(i->as, i->audio_pos, len/(2*i->waveformat.nChannels), buf, len, &bytes, &samples); - i->audio_pos += samples; - return bytes; -} - -static int videoreader_vfw_getsamples(videoreader_t* vr, void*buf, int num) -{ - videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal; - - if(i->audio_eof) - return 0; - - switch(i->waveformat.wBitsPerSample) { - case 1: { - int len = readAudioBlock(i, buf, num); - int t = len-1; - do { - ((SHORT*)buf)[t] = ((((BYTE*)buf)[t>>3])>>(t&7))<<15; - } while(--t>=0); - if(!len) i->audio_eof = 1; - return len*8; - } - case 8: { - int len = readAudioBlock(i, buf, num); - int t = len-1; - do { - ((SHORT*)buf)[t] = (((BYTE*)buf)[t]<<8)^0x8000; - } while(--t>=0); - if(!len) i->audio_eof = 1; - return len*2; - } - case 16: { - int len = readAudioBlock(i, buf, num); - if(!len) i->audio_eof = 1; - return len; - } - default: { - return 0; - } - } -} - -static void videoreader_vfw_close(videoreader_t* vr) -{ - videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal; - - AVIStreamGetFrameClose(i->getframe); - if(i->vs) { - AVIStreamRelease(i->vs); i->vs = 0; - } - if(i->as) { - AVIStreamRelease(i->as); i->vs = 0; - } - AVIFileRelease(i->avifile); i->avifile = 0; - - AVIFileExit(); avifile_initialized=0; - - free(vr->internal); vr->internal = 0; -} - -static void videoreader_vfw_setparameter(videoreader_t*vr, char*name, char*value) -{ - videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)vr->internal; - if(!strcmp(name, "flip")) { - i->flip = atoi(value); - } else if(!strcmp(name, "verbose")) { - verbose = atoi(value); - } -} - -int videoreader_vfw_open(videoreader_t* vr, char* filename) -{ - memset(vr, 0, sizeof(videoreader_t)); - if(!filename) { - /* codec query */ - return 1; - } - - videoreader_vfw_internal_t* i = (videoreader_vfw_internal_t*)malloc(sizeof(videoreader_vfw_internal_t)); - memset(i, 0, sizeof(videoreader_vfw_internal_t)); - - vr->internal = i; - vr->getimage = videoreader_vfw_getimage; - vr->getsamples = videoreader_vfw_getsamples; - vr->close = videoreader_vfw_close; - vr->setparameter = videoreader_vfw_setparameter; - - if(!avifile_initialized) { - AVIFileInit(); - } - if(AVIFileOpen(&i->avifile, filename, OF_SHARE_DENY_WRITE, 0)) { - fprintf(stderr, "Couldn't open %s\n", filename); - return -1; - } - AVIFILEINFO info; - AVIFileInfo(i->avifile, &info, sizeof(info)); - - /* calculate framerate */ - i->fps = (double)info.dwRate/(double)info.dwScale; - - if(verbose) { - printf("vfw: file %s has %f fps, and %d streams\n", i->fps, info.dwStreams); - } - - unsigned int t=0; - while(tavifile, &stream, streamtypeANY, t) != AVIERR_OK || !stream) - break; //video_end of (working) streams - - AVISTREAMINFO streaminfo; - AVIStreamInfo(stream, &streaminfo, sizeof(streaminfo)); - - if (streaminfo.fccType == streamtypeVIDEO) { - /* video stream */ - - BITMAPINFOHEADER bitmap; - LONG size = sizeof(bitmap); - AVIStreamReadFormat(stream, 0, &bitmap, &size); - - if(1) { - i->bitmap = bitmap; - i->vs = stream; - i->width = abs(bitmap.biWidth); - i->height = abs(bitmap.biHeight); - } else { - fprintf(stderr, "Ignoring video stream: %dx%d compression=%d planes=%d\n", - abs(bitmap.biWidth), abs(bitmap.biHeight), - bitmap.biCompression,bitmap.biPlanes); - } - } - else if (streaminfo.fccType == streamtypeAUDIO) { - /* audio stream */ - - WAVEFORMATEX waveformat; - LONG size = sizeof(waveformat); - AVIStreamReadFormat(stream, 0, &waveformat, &size); - - if(waveformat.wBitsPerSample == 16 || - waveformat.wBitsPerSample == 8 || - waveformat.wBitsPerSample == 1 - ) { - i->waveformat = waveformat; - i->as = stream; - i->channels = waveformat.nChannels; - i->samplerate = waveformat.nSamplesPerSec; - } else { - fprintf(stderr, "Ignoring audio stream: bitspersample=%d\n", waveformat.wBitsPerSample); - } - } - t++; - } - - if(i->vs) { - if(verbose) { - printf("vfw: video stream: %dx%d, %.2f\n", i->width, i->height, i->fps); - } - vr->width = i->width; - vr->height = i->height; - vr->fps = i->fps; - } else { - fprintf(stderr, "AVIReader: Warning: No video stream\n"); - } - if(i->as) { - if(verbose) { - printf("vfw: audio stream: %d channels, %d samples/sec", i->channels, i->samplerate); - } - vr->channels = i->channels; - vr->samplerate = i->samplerate; - } else { - fprintf(stderr, "AVIReader: Warning: No audio stream\n"); - } - - i->getframe = AVIStreamGetFrameOpen(i->vs, 0); - if(!i->getframe) { - fprintf(stderr, "Couldn't initialize AVIStream for %s- codec missing?\n", filename); - return -1; - } - - i->video_pos = AVIStreamStart(i->vs); - i->video_end = AVIStreamEnd(i->vs); - i->audio_pos = 0; - i->audio_end = 0x7fffffff; - - return 0; -} - -#else //WIN32 - -int videoreader_vfw_open(videoreader_t* vr, char* filename) -{ - return -1; -} - -#endif //WIN32 - diff --git a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.hh b/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.hh deleted file mode 100644 index 71b0a404b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/avi2swf/videoreader_vfw.hh +++ /dev/null @@ -1,29 +0,0 @@ -/* videoreader_vfw.hh - Read avi files using video for windows (vfw). - - Part of the swftools package. - - Copyright (c) 2004 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __videoreader_vfw_h__ -#define __videoreader_vfw_h__ - -#include "videoreader.h" - -int videoreader_vfw_open(videoreader_t* v, char* filename); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/config.guess b/fluidbook/tools/swftools-special-swfdump/config.guess deleted file mode 100644 index 2313a174e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/config.guess +++ /dev/null @@ -1,1545 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 -# Free Software Foundation, Inc. - -timestamp='2008-01-23' - -# 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 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. -# -# 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 Per Bothner . -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -if [ "${UNAME_SYSTEM}" = "Linux" ] ; then - eval $set_cc_for_build - cat << EOF > $dummy.c - #include - #ifdef __UCLIBC__ - # ifdef __UCLIBC_CONFIG_VERSION__ - LIBC=uclibc __UCLIBC_CONFIG_VERSION__ - # else - LIBC=uclibc - # endif - #else - LIBC=gnu - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'` -fi - -# 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 tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null - 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 - # 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/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[456]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep __LP64__ >/dev/null - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:[3456]*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - EM64T | authenticamd) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - else - echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-${LIBC} - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-${LIBC} - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-${LIBC} - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - mips:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips - #undef mipsel - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mipsel - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } - ;; - mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips64 - #undef mips64el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mips64el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips64 - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-${LIBC} - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-${LIBC} - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-${LIBC} - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; - PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; - *) echo hppa-unknown-linux-${LIBC} ;; - esac - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-${LIBC} - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-${LIBC} - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-${LIBC} - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}" - ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout" - exit ;; - coff-i386) - echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff" - exit ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld" - exit ;; - esac - # This should get integrated into the C code below, but now we hack - if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^LIBC/{ - s: ::g - p - }'`" - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } - ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -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 (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#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 - printf ("vax-dec-ultrix\n"); exit (0); -# 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; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/fluidbook/tools/swftools-special-swfdump/config.h b/fluidbook/tools/swftools-special-swfdump/config.h deleted file mode 100644 index 4992fa7ce..000000000 --- a/fluidbook/tools/swftools-special-swfdump/config.h +++ /dev/null @@ -1,299 +0,0 @@ -/* config.h. Generated from config.h.in by configure. */ -#ifndef __config_h__ -#define __config_h__ - -/* Define to empty if the keyword does not work. */ -/* #undef const */ - -/* Define as __inline if that's what the C compiler calls it. */ -/* #undef inline */ - -/* Define to `long' if doesn't define. */ -/* #undef off_t */ - -/* Define to `unsigned' if doesn't define. */ -/* #undef size_t */ - -#define SIZEOF_SIGNED_CHAR 1 -#define SIZEOF_SIGNED_SHORT 2 -#define SIZEOF_SIGNED 4 -#define SIZEOF_SIGNED_LONG_LONG 8 -#define SIZEOF_VOIDP 8 - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define if your declares struct tm. */ -/* #undef TM_IN_SYS_TIME */ - -/* Define if you have the time() function */ -#define HAVE_TIME 1 - -/* Define if you have the time.h header file */ -#define HAVE_TIME_H 1 - -/* Define if you have the sys/time.h header file */ -#define HAVE_SYS_TIME_H 1 - -/* Define if you have the sys/resource.h header file */ -#define HAVE_SYS_RESOURCE_H 1 - -/* Define if you have the malloc.h header file */ -/* #undef HAVE_MALLOC_H */ - -/* Define if you have the getrusage function */ -#define HAVE_GETRUSAGE 1 - -/* Define if you have the mallinfo function */ -#define HAVE_MALLINFO 1 - - -/* Define if you have the unistd.h header file */ -#define HAVE_UNISTD_H 1 - -/* for gocr */ -#define HAVE_WCHAR_H 1 -#define HAVE_WCSCHR 1 -#define HAVE_WCSDUP 1 - -/* Define if you have the open64 function. */ -#define HAVE_OPEN64 1 - -/* Define if you have the lrand48 function. */ -#define HAVE_LRAND48 1 - -/* Define if you have the mkstemp function. */ -#define HAVE_MKSTEMP 1 - -/* Define if you have the popen function. */ -#define HAVE_POPEN 1 - -/* Define if you have the bcopy function. */ -#define HAVE_BCOPY 1 - -/* Define if you have the bzero function. */ -#define HAVE_BZERO 1 - -/* Define if you have the rand function. */ -#define HAVE_RAND 1 - -/* Define if you have the srand function. */ -#define HAVE_SRAND 1 - -/* Define if you have the srand48 function. */ -#define HAVE_SRAND48 1 - -/* Define if you have the calloc function. */ -#define HAVE_CALLOC 1 - -/* Define if you have the stat function. */ -#define HAVE_STAT 1 - -/* Define if you have the mmap function. */ -#define HAVE_MMAP 1 - -/* Define if you have the header file. */ -#define HAVE_DIRENT_H 1 - -/* Define if you have the header file. */ -#define HAVE_ASSERT_H 1 - -/* Define if you have the header file. */ -#define HAVE_SIGNAL_H 1 - -/* Define if you have the header file. */ -#define HAVE_PTHREAD_H 1 - -/* Define if you have the header file. */ -#define HAVE_JPEGLIB_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_NDIR_H */ - -/* Define if you have the header file. */ -#define HAVE_SYS_DIR_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_NDIR_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_IO_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_BSDTYPES_H */ - -/* Define if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define if you have the header file. */ -#define HAVE_SYS_MMAN_H 1 - -/* Define if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_T1LIB_H */ - -/* Define if you have the header file. */ -#define HAVE_ZLIB_H 1 - -/* Define if you have the header file. */ -#define HAVE_ZZIP_LIB_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_PDFLIB_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_AVIFILE_VERSION_H */ - -/* Define if you have the header file. */ -#define HAVE_FT2BUILD_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_VERSION_H */ - -/* Define if you have the OpenGL header files */ -/* #undef HAVE_GL_GL_H */ -/* #undef HAVE_GL_GLUT_H */ - -/* Define if you have the OpenGL libraries */ -/* #undef HAVE_LIBGL */ -/* #undef HAVE_LIBGLU */ -/* #undef HAVE_LIBGLUT */ - -/* Define if OpenGL seems to work */ -/* #undef HAVE_OPENGL */ - -/* Define if you use poppler */ -/* #undef HAVE_POPPLER */ - -/* Define to 1 if you have the `poppler' library (-lpoppler). */ -/* #undef HAVE_LIBPOPPLER */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_OUTPUTDEV_H */ - -/* Define if you have the jpeg library (-ljpeg). */ -#define HAVE_LIBJPEG 1 - -/* Define if you have the pdf library (-lpdf). */ -/* #undef HAVE_LIBPDF */ - -/* Define if you have the zzip library (-lzzip). */ -#define HAVE_LIBZZIP 1 - -/* Define if you have the m library (-lm). */ -#define HAVE_LIBM 1 - -/* Define if you have the t1 library (-lt1). */ -/* #undef HAVE_LIBT1 */ - -/* Define if you have the z library (-lz). */ -#define HAVE_LIBZ 1 - -/* Name of package */ -#define PACKAGE "swftools" - -/* Version number of package */ -#define VERSION "2011-01-23-1815" - -/* Typedefs */ -#define boolean int - -/* use gzip/uncompress */ -#define USE_GZIP 1 - -/* let ttf2pt1 use libfreetype */ -#define USE_FREETYPE 1 - -/* have/use freetype library */ -#define HAVE_FREETYPE 1 -#define HAVE_FREETYPE_FREETYPE_H 1 - -/* have/use freetype library */ -/* #undef HAVE_AVIFILE */ - -#define HAVE_FONTCONFIG_H 1 -#define HAVE_FONTCONFIG 1 - -/* #undef HAVE_FFTW3_H */ - -/* #undef HAVE_FFTW3 */ - -/* have/use internal l.a.m.e. mp3 library */ -/* #undef HAVE_LAME */ - -/* whether python-imaging was found */ -/* #undef HAVE_PYTHON_IMAGING */ - -/* system() can handle command substitution */ -#define SYSTEM_BACKTICKS 1 - -/* Define to 1 if this machine has network byte order*/ -/* #undef WORDS_BIGENDIAN */ - -/* #undef LOWERCASE_UPPERCASE */ - -/* Define to 0 on non-windows systems */ -#define O_BINARY 0 - -#ifdef HAVE_ZLIB_H -#ifdef HAVE_LIBZ -#define HAVE_ZLIB -#endif -#endif - -#ifdef HAVE_JPEGLIB_H -#ifdef HAVE_LIBJPEG -#define HAVE_JPEGLIB -#endif -#endif - -#ifdef HAVE_FT2BUILD_H -#define HAVE_FREETYPE_H 1 -#endif - -/* #ifdef HAVE_T1LIB_H */ -/* #ifdef HAVE_LIBT1 */ -/* #define HAVE_T1LIB */ -/* #endif */ -/* #endif */ - -#ifdef HAVE_GL_GL_H -#ifdef HAVE_GL_GLUT_H -#ifdef HAVE_OPENGL -#define USE_OPENGL -#endif -#endif -#endif - -#ifdef HAVE_POPPLER -#define GString GooString -#define GHash GooHash -#endif - -#ifdef HAVE_ZZIP_LIB_H -#ifdef HAVE_LIBZZIP -#define HAVE_ZZIP 1 -#endif -#endif - -#ifndef WIN32 -#define CHECKS -#endif - -// supply a substitute calloc function if necessary -#ifndef HAVE_CALLOC -#define calloc rfx_calloc_replacement -#endif - -//#ifdef HAVE_BUILTIN_EXPECT -#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) -# define likely(x) __builtin_expect((x), 1) -# define unlikely(x) __builtin_expect((x), 0) -#else -# define likely(x) (x) -# define unlikely(x) (x) -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/config.h.in b/fluidbook/tools/swftools-special-swfdump/config.h.in deleted file mode 100644 index 60bf3227f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/config.h.in +++ /dev/null @@ -1,298 +0,0 @@ -#ifndef __config_h__ -#define __config_h__ - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define as __inline if that's what the C compiler calls it. */ -#undef inline - -/* Define to `long' if doesn't define. */ -#undef off_t - -/* Define to `unsigned' if doesn't define. */ -#undef size_t - -#undef SIZEOF_SIGNED_CHAR -#undef SIZEOF_SIGNED_SHORT -#undef SIZEOF_SIGNED -#undef SIZEOF_SIGNED_LONG_LONG -#undef SIZEOF_VOIDP - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if your declares struct tm. */ -#undef TM_IN_SYS_TIME - -/* Define if you have the time() function */ -#undef HAVE_TIME - -/* Define if you have the time.h header file */ -#undef HAVE_TIME_H - -/* Define if you have the sys/time.h header file */ -#undef HAVE_SYS_TIME_H - -/* Define if you have the sys/resource.h header file */ -#undef HAVE_SYS_RESOURCE_H - -/* Define if you have the malloc.h header file */ -#undef HAVE_MALLOC_H - -/* Define if you have the getrusage function */ -#undef HAVE_GETRUSAGE - -/* Define if you have the mallinfo function */ -#undef HAVE_MALLINFO - - -/* Define if you have the unistd.h header file */ -#undef HAVE_UNISTD_H - -/* for gocr */ -#undef HAVE_WCHAR_H -#undef HAVE_WCSCHR -#undef HAVE_WCSDUP - -/* Define if you have the open64 function. */ -#undef HAVE_OPEN64 - -/* Define if you have the lrand48 function. */ -#undef HAVE_LRAND48 - -/* Define if you have the mkstemp function. */ -#undef HAVE_MKSTEMP - -/* Define if you have the popen function. */ -#undef HAVE_POPEN - -/* Define if you have the bcopy function. */ -#undef HAVE_BCOPY - -/* Define if you have the bzero function. */ -#undef HAVE_BZERO - -/* Define if you have the rand function. */ -#undef HAVE_RAND - -/* Define if you have the srand function. */ -#undef HAVE_SRAND - -/* Define if you have the srand48 function. */ -#undef HAVE_SRAND48 - -/* Define if you have the calloc function. */ -#undef HAVE_CALLOC - -/* Define if you have the stat function. */ -#undef HAVE_STAT - -/* Define if you have the mmap function. */ -#undef HAVE_MMAP - -/* Define if you have the header file. */ -#undef HAVE_DIRENT_H - -/* Define if you have the header file. */ -#undef HAVE_ASSERT_H - -/* Define if you have the header file. */ -#undef HAVE_SIGNAL_H - -/* Define if you have the header file. */ -#undef HAVE_PTHREAD_H - -/* Define if you have the header file. */ -#undef HAVE_JPEGLIB_H - -/* Define if you have the header file. */ -#undef HAVE_NDIR_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_DIR_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_NDIR_H - -/* Define if you have the header file. */ -#undef HAVE_IO_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_BSDTYPES_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_MMAN_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define if you have the header file. */ -/* #undef HAVE_T1LIB_H */ - -/* Define if you have the header file. */ -#undef HAVE_ZLIB_H - -/* Define if you have the header file. */ -#undef HAVE_ZZIP_LIB_H - -/* Define if you have the header file. */ -#undef HAVE_PDFLIB_H - -/* Define if you have the header file. */ -#undef HAVE_AVIFILE_VERSION_H - -/* Define if you have the header file. */ -#undef HAVE_FT2BUILD_H - -/* Define if you have the header file. */ -#undef HAVE_VERSION_H - -/* Define if you have the OpenGL header files */ -#undef HAVE_GL_GL_H -#undef HAVE_GL_GLUT_H - -/* Define if you have the OpenGL libraries */ -#undef HAVE_LIBGL -#undef HAVE_LIBGLU -#undef HAVE_LIBGLUT - -/* Define if OpenGL seems to work */ -#undef HAVE_OPENGL - -/* Define if you use poppler */ -#undef HAVE_POPPLER - -/* Define to 1 if you have the `poppler' library (-lpoppler). */ -#undef HAVE_LIBPOPPLER - -/* Define to 1 if you have the header file. */ -#undef HAVE_OUTPUTDEV_H - -/* Define if you have the jpeg library (-ljpeg). */ -#undef HAVE_LIBJPEG - -/* Define if you have the pdf library (-lpdf). */ -#undef HAVE_LIBPDF - -/* Define if you have the zzip library (-lzzip). */ -#undef HAVE_LIBZZIP - -/* Define if you have the m library (-lm). */ -#undef HAVE_LIBM - -/* Define if you have the t1 library (-lt1). */ -/* #undef HAVE_LIBT1 */ - -/* Define if you have the z library (-lz). */ -#undef HAVE_LIBZ - -/* Name of package */ -#undef PACKAGE - -/* Version number of package */ -#undef VERSION - -/* Typedefs */ -#undef boolean - -/* use gzip/uncompress */ -#undef USE_GZIP - -/* let ttf2pt1 use libfreetype */ -#undef USE_FREETYPE - -/* have/use freetype library */ -#undef HAVE_FREETYPE -#undef HAVE_FREETYPE_FREETYPE_H - -/* have/use freetype library */ -#undef HAVE_AVIFILE - -#undef HAVE_FONTCONFIG_H -#undef HAVE_FONTCONFIG - -#undef HAVE_FFTW3_H - -#undef HAVE_FFTW3 - -/* have/use internal l.a.m.e. mp3 library */ -#undef HAVE_LAME - -/* whether python-imaging was found */ -#undef HAVE_PYTHON_IMAGING - -/* system() can handle command substitution */ -#undef SYSTEM_BACKTICKS - -/* Define to 1 if this machine has network byte order*/ -#undef WORDS_BIGENDIAN - -#undef LOWERCASE_UPPERCASE - -/* Define to 0 on non-windows systems */ -#undef O_BINARY - -#ifdef HAVE_ZLIB_H -#ifdef HAVE_LIBZ -#define HAVE_ZLIB -#endif -#endif - -#ifdef HAVE_JPEGLIB_H -#ifdef HAVE_LIBJPEG -#define HAVE_JPEGLIB -#endif -#endif - -#ifdef HAVE_FT2BUILD_H -#define HAVE_FREETYPE_H 1 -#endif - -/* #ifdef HAVE_T1LIB_H */ -/* #ifdef HAVE_LIBT1 */ -/* #define HAVE_T1LIB */ -/* #endif */ -/* #endif */ - -#ifdef HAVE_GL_GL_H -#ifdef HAVE_GL_GLUT_H -#ifdef HAVE_OPENGL -#define USE_OPENGL -#endif -#endif -#endif - -#ifdef HAVE_POPPLER -#define GString GooString -#define GHash GooHash -#endif - -#ifdef HAVE_ZZIP_LIB_H -#ifdef HAVE_LIBZZIP -#define HAVE_ZZIP 1 -#endif -#endif - -#ifndef WIN32 -#define CHECKS -#endif - -// supply a substitute calloc function if necessary -#ifndef HAVE_CALLOC -#define calloc rfx_calloc_replacement -#endif - -//#ifdef HAVE_BUILTIN_EXPECT -#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) -# define likely(x) __builtin_expect((x), 1) -# define unlikely(x) __builtin_expect((x), 0) -#else -# define likely(x) (x) -# define unlikely(x) (x) -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/config.log b/fluidbook/tools/swftools-special-swfdump/config.log deleted file mode 100644 index 1d33930f0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/config.log +++ /dev/null @@ -1,2805 +0,0 @@ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by configure, which was -generated by GNU Autoconf 2.68. Invocation command line was - - $ ./configure --prefix=/usr/local/swftools/special-swfdump - -## --------- ## -## Platform. ## -## --------- ## - -hostname = ks308520.kimsufi.com -uname -m = x86_64 -uname -r = 2.6.31.5-grsec-xxxx-grs-ipv4-64 -uname -s = Linux -uname -v = #2 SMP Thu Nov 5 12:36:20 UTC 2009 - -/usr/bin/uname -p = Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz -/bin/uname -X = unknown - -/bin/arch = x86_64 -/usr/bin/arch -k = x86_64 -/usr/convex/getsysinfo = unknown -/usr/bin/hostinfo = unknown -/bin/machine = unknown -/usr/bin/oslevel = unknown -/bin/universe = unknown - -PATH: /usr/local/sbin -PATH: /usr/local/bin -PATH: /usr/sbin -PATH: /usr/bin -PATH: /sbin -PATH: /bin -PATH: /opt/bin -PATH: /usr/x86_64-pc-linux-gnu/mingw32/gcc-bin/4.4.2 -PATH: /usr/x86_64-pc-linux-gnu/gcc-bin/3.4.6 - - -## ----------- ## -## Core tests. ## -## ----------- ## - -configure:2735: checking build system type -configure:2749: result: x86_64-unknown-linux-gnu -configure:2769: checking host system type -configure:2782: result: x86_64-unknown-linux-gnu -configure:2875: checking for gcc -configure:2891: found /usr/bin/gcc -configure:2902: result: gcc -configure:3131: checking for C compiler version -configure:3140: gcc --version >&5 -gcc (GCC) 3.4.6 (Gentoo 3.4.6-r2 p1.6, ssp-3.4.6-1.0, pie-8.7.10) -Copyright (C) 2006 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. - -configure:3151: $? = 0 -configure:3140: gcc -v >&5 -Reading specs from /usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/specs -Configured with: /home/var/tmp/portage/sys-devel/gcc-3.4.6-r2/work/gcc-3.4.6/configure --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/3.4.6 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/include/g++-v3 --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-multilib --enable-languages=c,c++,java,treelang,f77 --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu -Thread model: posix -gcc version 3.4.6 (Gentoo 3.4.6-r2 p1.6, ssp-3.4.6-1.0, pie-8.7.10) -configure:3151: $? = 0 -configure:3140: gcc -V >&5 -gcc: `-V' option must have argument -configure:3151: $? = 1 -configure:3140: gcc -qversion >&5 -gcc: unrecognized option `-qversion' -gcc: no input files -configure:3151: $? = 1 -configure:3171: checking whether the C compiler works -configure:3193: gcc -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 -configure:3197: $? = 0 -configure:3245: result: yes -configure:3248: checking for C compiler default output file name -configure:3250: result: a.out -configure:3256: checking for suffix of executables -configure:3263: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 -configure:3267: $? = 0 -configure:3289: result: -configure:3311: checking whether we are cross compiling -configure:3319: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 -configure:3323: $? = 0 -configure:3330: ./conftest -configure:3334: $? = 0 -configure:3349: result: no -configure:3354: checking for suffix of object files -configure:3376: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 -configure:3380: $? = 0 -configure:3401: result: o -configure:3405: checking whether we are using the GNU C compiler -configure:3424: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 -configure:3424: $? = 0 -configure:3433: result: yes -configure:3442: checking whether gcc accepts -g -configure:3462: gcc -c -g conftest.c >&5 -configure:3462: $? = 0 -configure:3503: result: yes -configure:3520: checking for gcc option to accept ISO C89 -configure:3584: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c >&5 -configure:3584: $? = 0 -configure:3597: result: none needed -configure:3675: checking for g++ -configure:3691: found /usr/bin/g++ -configure:3702: result: g++ -configure:3729: checking for C++ compiler version -configure:3738: g++ --version >&5 -g++ (GCC) 3.4.6 (Gentoo 3.4.6-r2 p1.6, ssp-3.4.6-1.0, pie-8.7.10) -Copyright (C) 2006 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. - -configure:3749: $? = 0 -configure:3738: g++ -v >&5 -Reading specs from /usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/specs -Configured with: /home/var/tmp/portage/sys-devel/gcc-3.4.6-r2/work/gcc-3.4.6/configure --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/3.4.6 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/3.4.6/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/include/g++-v3 --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-multilib --enable-languages=c,c++,java,treelang,f77 --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu -Thread model: posix -gcc version 3.4.6 (Gentoo 3.4.6-r2 p1.6, ssp-3.4.6-1.0, pie-8.7.10) -configure:3749: $? = 0 -configure:3738: g++ -V >&5 -g++: `-V' option must have argument -configure:3749: $? = 1 -configure:3738: g++ -qversion >&5 -g++: unrecognized option `-qversion' -g++: no input files -configure:3749: $? = 1 -configure:3753: checking whether we are using the GNU C++ compiler -configure:3772: g++ -c -fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.cpp >&5 -configure:3772: $? = 0 -configure:3781: result: yes -configure:3790: checking whether g++ accepts -g -configure:3810: g++ -c -g conftest.cpp >&5 -configure:3810: $? = 0 -configure:3851: result: yes -configure:3877: checking whether gcc supports lazy variable declaration -gcc.2.95.m4:19: gcc -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -o conftest -configure:3896: result: yes -configure:3936: checking how to run the C preprocessor -configure:3967: gcc -E conftest.c -configure:3967: $? = 0 -configure:3981: gcc -E conftest.c -conftest.c:9:28: ac_nonexistent.h: No such file or directory -configure:3981: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| /* end confdefs.h. */ -| #include -configure:4006: result: gcc -E -configure:4026: gcc -E conftest.c -configure:4026: $? = 0 -configure:4040: gcc -E conftest.c -conftest.c:9:28: ac_nonexistent.h: No such file or directory -configure:4040: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| /* end confdefs.h. */ -| #include -configure:4112: checking for ranlib -configure:4128: found /usr/bin/ranlib -configure:4139: result: ranlib -configure:4161: checking whether make sets $(MAKE) -configure:4183: result: yes -configure:4206: checking for a BSD-compatible install -configure:4274: result: /usr/bin/install -c -configure:4285: checking whether ln -s works -configure:4289: result: yes -configure:4300: checking for gzip -configure:4316: found /bin/gzip -configure:4327: result: gzip -configure:4358: checking for target system -configure:4414: result: -configure:4472: checking for sin in -lm -configure:4497: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lm >&5 -conftest.c:18: warning: conflicting types for built-in function 'sin' -configure:4497: $? = 0 -configure:4506: result: yes -configure:4521: checking for deflate in -lz -configure:4546: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lz -lm >&5 -configure:4546: $? = 0 -configure:4555: result: yes -configure:4577: checking for PDF_open_file in -lpdf -configure:4602: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lpdf -lz -lm >&5 -/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lpdf -collect2: ld returned 1 exit status -configure:4602: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| /* end confdefs.h. */ -| -| /* Override any GCC internal prototype to avoid an error. -| Use char because int might match the return type of a GCC -| builtin and then its argument prototype would still apply. */ -| #ifdef __cplusplus -| extern "C" -| #endif -| char PDF_open_file (); -| int -| main () -| { -| return PDF_open_file (); -| ; -| return 0; -| } -configure:4611: result: no -configure:4624: checking for jpeg_write_raw_data in -ljpeg -configure:4649: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -ljpeg -lz -lm >&5 -configure:4649: $? = 0 -configure:4658: result: yes -configure:4671: checking for DGifOpen in -lungif -configure:4696: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lungif -ljpeg -lz -lm >&5 -/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lungif -collect2: ld returned 1 exit status -configure:4696: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| /* end confdefs.h. */ -| -| /* Override any GCC internal prototype to avoid an error. -| Use char because int might match the return type of a GCC -| builtin and then its argument prototype would still apply. */ -| #ifdef __cplusplus -| extern "C" -| #endif -| char DGifOpen (); -| int -| main () -| { -| return DGifOpen (); -| ; -| return 0; -| } -configure:4705: result: no -configure:4720: checking for DGifOpen in -lgif -configure:4745: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lgif -ljpeg -lz -lm >&5 -/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgif -collect2: ld returned 1 exit status -configure:4745: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| /* end confdefs.h. */ -| -| /* Override any GCC internal prototype to avoid an error. -| Use char because int might match the return type of a GCC -| builtin and then its argument prototype would still apply. */ -| #ifdef __cplusplus -| extern "C" -| #endif -| char DGifOpen (); -| int -| main () -| { -| return DGifOpen (); -| ; -| return 0; -| } -configure:4754: result: no -configure:4768: checking for zzip_file_open in -lzzip -configure:4793: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:4793: $? = 0 -configure:4802: result: yes -configure:4816: checking target system type -configure:4829: result: x86_64-unknown-linux-gnu -configure:4856: checking for byte order -configure:4871: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:4871: $? = 0 -configure:4871: ./conftest -configure:4871: $? = 1 -configure: program exited with status 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| /* end confdefs.h. */ -| -| int main (int argc, char *argv[]) -| { -| int i = 1; -| return *(char*)&i; -| } -| -configure:4900: result: little endian -configure:4924: checking whether system() can handle command substitution -configure:4939: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:4939: $? = 0 -configure:4939: ./conftest -configure:4939: $? = 0 -configure:4956: result: yes -configure:4986: checking for dirent.h that defines DIR -configure:5005: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5005: $? = 0 -configure:5013: result: yes -configure:5026: checking for library containing opendir -configure:5057: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5057: $? = 0 -configure:5074: result: none required -configure:5142: checking for grep that handles long lines and -e -configure:5200: result: /bin/grep -configure:5205: checking for egrep -configure:5267: result: /bin/grep -E -configure:5272: checking for ANSI C header files -configure:5292: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5292: $? = 0 -configure:5365: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5365: $? = 0 -configure:5365: ./conftest -configure:5365: $? = 0 -configure:5376: result: yes -configure:5390: checking for sys/types.h -configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5390: $? = 0 -configure:5390: result: yes -configure:5390: checking for sys/stat.h -configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5390: $? = 0 -configure:5390: result: yes -configure:5390: checking for stdlib.h -configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5390: $? = 0 -configure:5390: result: yes -configure:5390: checking for string.h -configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5390: $? = 0 -configure:5390: result: yes -configure:5390: checking for memory.h -configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5390: $? = 0 -configure:5390: result: yes -configure:5390: checking for strings.h -configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5390: $? = 0 -configure:5390: result: yes -configure:5390: checking for inttypes.h -configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5390: $? = 0 -configure:5390: result: yes -configure:5390: checking for stdint.h -configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5390: $? = 0 -configure:5390: result: yes -configure:5390: checking for unistd.h -configure:5390: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5390: $? = 0 -configure:5390: result: yes -configure:5405: checking zlib.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking zlib.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for zlib.h -configure:5405: result: yes -configure:5405: checking gif_lib.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -conftest.c:61:21: gif_lib.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| #include -configure:5405: result: no -configure:5405: checking gif_lib.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -conftest.c:28:21: gif_lib.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| /* end confdefs.h. */ -| #include -configure:5405: result: no -configure:5405: checking for gif_lib.h -configure:5405: result: no -configure:5405: checking io.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -conftest.c:61:16: io.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| #include -configure:5405: result: no -configure:5405: checking io.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -conftest.c:28:16: io.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| /* end confdefs.h. */ -| #include -configure:5405: result: no -configure:5405: checking for io.h -configure:5405: result: no -configure:5405: checking wchar.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking wchar.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for wchar.h -configure:5405: result: yes -configure:5405: checking jpeglib.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking jpeglib.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for jpeglib.h -configure:5405: result: yes -configure:5405: checking assert.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking assert.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for assert.h -configure:5405: result: yes -configure:5405: checking signal.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking signal.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for signal.h -configure:5405: result: yes -configure:5405: checking pthread.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking pthread.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for pthread.h -configure:5405: result: yes -configure:5405: checking for sys/stat.h -configure:5405: result: yes -configure:5405: checking sys/mman.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking sys/mman.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for sys/mman.h -configure:5405: result: yes -configure:5405: checking for sys/types.h -configure:5405: result: yes -configure:5405: checking dirent.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking dirent.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for dirent.h -configure:5405: result: yes -configure:5405: checking sys/bsdtypes.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -conftest.c:70:26: sys/bsdtypes.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| #include -configure:5405: result: no -configure:5405: checking sys/bsdtypes.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -conftest.c:37:26: sys/bsdtypes.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| /* end confdefs.h. */ -| #include -configure:5405: result: no -configure:5405: checking for sys/bsdtypes.h -configure:5405: result: no -configure:5405: checking sys/ndir.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -conftest.c:70:22: sys/ndir.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| #include -configure:5405: result: no -configure:5405: checking sys/ndir.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -conftest.c:37:22: sys/ndir.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| /* end confdefs.h. */ -| #include -configure:5405: result: no -configure:5405: checking for sys/ndir.h -configure:5405: result: no -configure:5405: checking sys/dir.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking sys/dir.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for sys/dir.h -configure:5405: result: yes -configure:5405: checking ndir.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -conftest.c:71:18: ndir.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| #include -configure:5405: result: no -configure:5405: checking ndir.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -conftest.c:38:18: ndir.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| /* end confdefs.h. */ -| #include -configure:5405: result: no -configure:5405: checking for ndir.h -configure:5405: result: no -configure:5405: checking time.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking time.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for time.h -configure:5405: result: yes -configure:5405: checking sys/time.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking sys/time.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for sys/time.h -configure:5405: result: yes -configure:5405: checking sys/resource.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking sys/resource.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for sys/resource.h -configure:5405: result: yes -configure:5405: checking pdflib.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -conftest.c:74:20: pdflib.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| #include -configure:5405: result: no -configure:5405: checking pdflib.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -conftest.c:41:20: pdflib.h: No such file or directory -configure:5405: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| /* end confdefs.h. */ -| #include -configure:5405: result: no -configure:5405: checking for pdflib.h -configure:5405: result: no -configure:5405: checking zzip/lib.h usability -configure:5405: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking zzip/lib.h presence -configure:5405: gcc -E -I${prefix}/include conftest.c -configure:5405: $? = 0 -configure:5405: result: yes -configure:5405: checking for zzip/lib.h -configure:5405: result: yes -configure:5432: checking for an ANSI C-conforming const -configure:5497: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5497: $? = 0 -configure:5504: result: yes -configure:5512: checking for inline -configure:5528: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5528: $? = 0 -configure:5536: result: inline -configure:5554: checking for off_t -configure:5554: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5554: $? = 0 -configure:5554: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -conftest.c: In function `main': -conftest.c:80: error: syntax error before ')' token -configure:5554: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| int -| main () -| { -| if (sizeof ((off_t))) -| return 0; -| ; -| return 0; -| } -configure:5554: result: yes -configure:5565: checking for size_t -configure:5565: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5565: $? = 0 -configure:5565: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -conftest.c: In function `main': -conftest.c:80: error: syntax error before ')' token -configure:5565: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| int -| main () -| { -| if (sizeof ((size_t))) -| return 0; -| ; -| return 0; -| } -configure:5565: result: yes -configure:5576: checking whether struct tm is in sys/time.h or time.h -configure:5596: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -configure:5596: $? = 0 -configure:5603: result: time.h -configure:5611: checking for boolean -configure:5611: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include conftest.c >&5 -conftest.c: In function `main': -conftest.c:80: error: `boolean' undeclared (first use in this function) -conftest.c:80: error: (Each undeclared identifier is reported only once -conftest.c:80: error: for each function it appears in.) -configure:5611: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| int -| main () -| { -| if (sizeof (boolean)) -| return 0; -| ; -| return 0; -| } -configure:5611: result: no -configure:5625: checking for popen -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for wcschr -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for wcsdup -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for mkstemp -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for stat -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for mmap -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for lrand48 -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for rand -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for srand48 -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for srand -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for bcopy -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -conftest.c:78: warning: conflicting types for built-in function 'bcopy' -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for bzero -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -conftest.c:79: warning: conflicting types for built-in function 'bzero' -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for time -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for getrusage -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for mallinfo -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for open64 -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5625: $? = 0 -configure:5625: result: yes -configure:5625: checking for calloc -configure:5625: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -conftest.c:84: warning: conflicting types for built-in function 'calloc' -configure:5625: $? = 0 -configure:5625: result: yes -configure:5639: checking size of signed char -configure:5644: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5644: $? = 0 -configure:5644: ./conftest -configure:5644: $? = 0 -configure:5658: result: 1 -configure:5672: checking size of signed short -configure:5677: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5677: $? = 0 -configure:5677: ./conftest -configure:5677: $? = 0 -configure:5691: result: 2 -configure:5705: checking size of signed -configure:5710: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5710: $? = 0 -configure:5710: ./conftest -configure:5710: $? = 0 -configure:5724: result: 4 -configure:5738: checking size of signed long long -configure:5743: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5743: $? = 0 -configure:5743: ./conftest -configure:5743: $? = 0 -configure:5757: result: 8 -configure:5771: checking size of void* -configure:5776: gcc -o conftest -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -L/usr/local/lib -L${exec_prefix}/lib conftest.c -lzzip -ljpeg -lz -lm >&5 -configure:5776: $? = 0 -configure:5776: ./conftest -configure:5776: $? = 0 -configure:5790: result: 8 -configure:5805: checking for freetype-config -configure:5824: found /usr/local/bin/freetype-config -configure:5836: result: /usr/local/bin/freetype-config -configure:5905: checking ft2build.h usability -configure:5905: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include conftest.c >&5 -configure:5905: $? = 0 -configure:5905: result: yes -configure:5905: checking ft2build.h presence -configure:5905: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include conftest.c -configure:5905: $? = 0 -configure:5905: result: yes -configure:5905: checking for ft2build.h -configure:5905: result: yes -configure:5951: checking whether we can compile the freetype test program -freetype.m4:71: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lzzip -ljpeg -lz -lm -L/usr/local/lib -lfreetype -lz -o conftest -configure:6012: result: yes -configure:6048: checking for FcInit in -lfontconfig -configure:6073: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lfontconfig -lzzip -ljpeg -lz -lm -L/usr/local/lib -lfreetype -lz -o conftest -configure:6073: $? = 0 -configure:6082: result: yes -configure:6090: checking fontconfig.h usability -configure:6090: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c >&5 -configure:6090: $? = 0 -configure:6090: result: yes -configure:6090: checking fontconfig.h presence -configure:6090: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c -configure:6090: $? = 0 -configure:6090: result: yes -configure:6090: checking for fontconfig.h -configure:6090: result: yes -configure:6109: checking whether we can compile the fontconfig test program -freetype.m4:71: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype -o conftest -conftest.c: In function `main': -conftest.c:28: warning: passing arg 4 of `FcPatternGetBool' from incompatible pointer type -configure:6157: result: yes -configure:6183: checking for fftwf_plan_dft_r2c_2d in -lfftw3f -configure:6208: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lfftw3f -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype -o conftest -/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lfftw3f -collect2: ld returned 1 exit status -configure:6208: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| #define boolean int -| #define HAVE_POPEN 1 -| #define HAVE_WCSCHR 1 -| #define HAVE_WCSDUP 1 -| #define HAVE_MKSTEMP 1 -| #define HAVE_STAT 1 -| #define HAVE_MMAP 1 -| #define HAVE_LRAND48 1 -| #define HAVE_RAND 1 -| #define HAVE_SRAND48 1 -| #define HAVE_SRAND 1 -| #define HAVE_BCOPY 1 -| #define HAVE_BZERO 1 -| #define HAVE_TIME 1 -| #define HAVE_GETRUSAGE 1 -| #define HAVE_MALLINFO 1 -| #define HAVE_OPEN64 1 -| #define HAVE_CALLOC 1 -| #define SIZEOF_SIGNED_CHAR 1 -| #define SIZEOF_SIGNED_SHORT 2 -| #define SIZEOF_SIGNED 4 -| #define SIZEOF_SIGNED_LONG_LONG 8 -| #define SIZEOF_VOIDP 8 -| #define HAVE_FT2BUILD_H 1 -| #define HAVE_FREETYPE 1 -| #define HAVE_FREETYPE_FREETYPE_H 1 -| #define USE_FREETYPE 1 -| #define HAVE_FONTCONFIG_H 1 -| #define HAVE_FONTCONFIG 1 -| /* end confdefs.h. */ -| -| /* Override any GCC internal prototype to avoid an error. -| Use char because int might match the return type of a GCC -| builtin and then its argument prototype would still apply. */ -| #ifdef __cplusplus -| extern "C" -| #endif -| char fftwf_plan_dft_r2c_2d (); -| int -| main () -| { -| return fftwf_plan_dft_r2c_2d (); -| ; -| return 0; -| } -configure:6217: result: no -configure:6225: checking fftw3.h usability -configure:6225: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c >&5 -conftest.c:106:19: fftw3.h: No such file or directory -configure:6225: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| #define boolean int -| #define HAVE_POPEN 1 -| #define HAVE_WCSCHR 1 -| #define HAVE_WCSDUP 1 -| #define HAVE_MKSTEMP 1 -| #define HAVE_STAT 1 -| #define HAVE_MMAP 1 -| #define HAVE_LRAND48 1 -| #define HAVE_RAND 1 -| #define HAVE_SRAND48 1 -| #define HAVE_SRAND 1 -| #define HAVE_BCOPY 1 -| #define HAVE_BZERO 1 -| #define HAVE_TIME 1 -| #define HAVE_GETRUSAGE 1 -| #define HAVE_MALLINFO 1 -| #define HAVE_OPEN64 1 -| #define HAVE_CALLOC 1 -| #define SIZEOF_SIGNED_CHAR 1 -| #define SIZEOF_SIGNED_SHORT 2 -| #define SIZEOF_SIGNED 4 -| #define SIZEOF_SIGNED_LONG_LONG 8 -| #define SIZEOF_VOIDP 8 -| #define HAVE_FT2BUILD_H 1 -| #define HAVE_FREETYPE 1 -| #define HAVE_FREETYPE_FREETYPE_H 1 -| #define USE_FREETYPE 1 -| #define HAVE_FONTCONFIG_H 1 -| #define HAVE_FONTCONFIG 1 -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| #include -configure:6225: result: no -configure:6225: checking fftw3.h presence -configure:6225: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c -conftest.c:73:19: fftw3.h: No such file or directory -configure:6225: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| #define boolean int -| #define HAVE_POPEN 1 -| #define HAVE_WCSCHR 1 -| #define HAVE_WCSDUP 1 -| #define HAVE_MKSTEMP 1 -| #define HAVE_STAT 1 -| #define HAVE_MMAP 1 -| #define HAVE_LRAND48 1 -| #define HAVE_RAND 1 -| #define HAVE_SRAND48 1 -| #define HAVE_SRAND 1 -| #define HAVE_BCOPY 1 -| #define HAVE_BZERO 1 -| #define HAVE_TIME 1 -| #define HAVE_GETRUSAGE 1 -| #define HAVE_MALLINFO 1 -| #define HAVE_OPEN64 1 -| #define HAVE_CALLOC 1 -| #define SIZEOF_SIGNED_CHAR 1 -| #define SIZEOF_SIGNED_SHORT 2 -| #define SIZEOF_SIGNED 4 -| #define SIZEOF_SIGNED_LONG_LONG 8 -| #define SIZEOF_VOIDP 8 -| #define HAVE_FT2BUILD_H 1 -| #define HAVE_FREETYPE 1 -| #define HAVE_FREETYPE_FREETYPE_H 1 -| #define USE_FREETYPE 1 -| #define HAVE_FONTCONFIG_H 1 -| #define HAVE_FONTCONFIG 1 -| /* end confdefs.h. */ -| #include -configure:6225: result: no -configure:6225: checking for fftw3.h -configure:6225: result: no -configure:6313: checking for lame_init in -lmp3lame -configure:6338: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lmp3lame -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype -o conftest -/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lmp3lame -collect2: ld returned 1 exit status -configure:6338: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| #define boolean int -| #define HAVE_POPEN 1 -| #define HAVE_WCSCHR 1 -| #define HAVE_WCSDUP 1 -| #define HAVE_MKSTEMP 1 -| #define HAVE_STAT 1 -| #define HAVE_MMAP 1 -| #define HAVE_LRAND48 1 -| #define HAVE_RAND 1 -| #define HAVE_SRAND48 1 -| #define HAVE_SRAND 1 -| #define HAVE_BCOPY 1 -| #define HAVE_BZERO 1 -| #define HAVE_TIME 1 -| #define HAVE_GETRUSAGE 1 -| #define HAVE_MALLINFO 1 -| #define HAVE_OPEN64 1 -| #define HAVE_CALLOC 1 -| #define SIZEOF_SIGNED_CHAR 1 -| #define SIZEOF_SIGNED_SHORT 2 -| #define SIZEOF_SIGNED 4 -| #define SIZEOF_SIGNED_LONG_LONG 8 -| #define SIZEOF_VOIDP 8 -| #define HAVE_FT2BUILD_H 1 -| #define HAVE_FREETYPE 1 -| #define HAVE_FREETYPE_FREETYPE_H 1 -| #define USE_FREETYPE 1 -| #define HAVE_FONTCONFIG_H 1 -| #define HAVE_FONTCONFIG 1 -| /* end confdefs.h. */ -| -| /* Override any GCC internal prototype to avoid an error. -| Use char because int might match the return type of a GCC -| builtin and then its argument prototype would still apply. */ -| #ifdef __cplusplus -| extern "C" -| #endif -| char lame_init (); -| int -| main () -| { -| return lame_init (); -| ; -| return 0; -| } -configure:6347: result: no -configure:6363: checking lame.h usability -configure:6363: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c >&5 -conftest.c:106:18: lame.h: No such file or directory -configure:6363: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| #define boolean int -| #define HAVE_POPEN 1 -| #define HAVE_WCSCHR 1 -| #define HAVE_WCSDUP 1 -| #define HAVE_MKSTEMP 1 -| #define HAVE_STAT 1 -| #define HAVE_MMAP 1 -| #define HAVE_LRAND48 1 -| #define HAVE_RAND 1 -| #define HAVE_SRAND48 1 -| #define HAVE_SRAND 1 -| #define HAVE_BCOPY 1 -| #define HAVE_BZERO 1 -| #define HAVE_TIME 1 -| #define HAVE_GETRUSAGE 1 -| #define HAVE_MALLINFO 1 -| #define HAVE_OPEN64 1 -| #define HAVE_CALLOC 1 -| #define SIZEOF_SIGNED_CHAR 1 -| #define SIZEOF_SIGNED_SHORT 2 -| #define SIZEOF_SIGNED 4 -| #define SIZEOF_SIGNED_LONG_LONG 8 -| #define SIZEOF_VOIDP 8 -| #define HAVE_FT2BUILD_H 1 -| #define HAVE_FREETYPE 1 -| #define HAVE_FREETYPE_FREETYPE_H 1 -| #define USE_FREETYPE 1 -| #define HAVE_FONTCONFIG_H 1 -| #define HAVE_FONTCONFIG 1 -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| #include -configure:6363: result: no -configure:6363: checking lame.h presence -configure:6363: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c -conftest.c:73:18: lame.h: No such file or directory -configure:6363: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| #define boolean int -| #define HAVE_POPEN 1 -| #define HAVE_WCSCHR 1 -| #define HAVE_WCSDUP 1 -| #define HAVE_MKSTEMP 1 -| #define HAVE_STAT 1 -| #define HAVE_MMAP 1 -| #define HAVE_LRAND48 1 -| #define HAVE_RAND 1 -| #define HAVE_SRAND48 1 -| #define HAVE_SRAND 1 -| #define HAVE_BCOPY 1 -| #define HAVE_BZERO 1 -| #define HAVE_TIME 1 -| #define HAVE_GETRUSAGE 1 -| #define HAVE_MALLINFO 1 -| #define HAVE_OPEN64 1 -| #define HAVE_CALLOC 1 -| #define SIZEOF_SIGNED_CHAR 1 -| #define SIZEOF_SIGNED_SHORT 2 -| #define SIZEOF_SIGNED 4 -| #define SIZEOF_SIGNED_LONG_LONG 8 -| #define SIZEOF_VOIDP 8 -| #define HAVE_FT2BUILD_H 1 -| #define HAVE_FREETYPE 1 -| #define HAVE_FREETYPE_FREETYPE_H 1 -| #define USE_FREETYPE 1 -| #define HAVE_FONTCONFIG_H 1 -| #define HAVE_FONTCONFIG 1 -| /* end confdefs.h. */ -| #include -configure:6363: result: no -configure:6363: checking for lame.h -configure:6363: result: no -configure:6611: checking whether the filesystem normalizes file names -configure:6623: result: no -configure:6636: checking for avifile-config -configure:6666: result: no -configure:6696: checking whether we can compile the avifile test program -configure:6805: result: no -configure:6843: checking for ruby -configure:6876: result: no -configure:6888: checking for ruby's include directory -configure:6925: result: 'unknown' -configure:6938: checking ruby.h usability -configure:6938: gcc -c -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c >&5 -conftest.c:107:18: ruby.h: No such file or directory -configure:6938: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| #define boolean int -| #define HAVE_POPEN 1 -| #define HAVE_WCSCHR 1 -| #define HAVE_WCSDUP 1 -| #define HAVE_MKSTEMP 1 -| #define HAVE_STAT 1 -| #define HAVE_MMAP 1 -| #define HAVE_LRAND48 1 -| #define HAVE_RAND 1 -| #define HAVE_SRAND48 1 -| #define HAVE_SRAND 1 -| #define HAVE_BCOPY 1 -| #define HAVE_BZERO 1 -| #define HAVE_TIME 1 -| #define HAVE_GETRUSAGE 1 -| #define HAVE_MALLINFO 1 -| #define HAVE_OPEN64 1 -| #define HAVE_CALLOC 1 -| #define SIZEOF_SIGNED_CHAR 1 -| #define SIZEOF_SIGNED_SHORT 2 -| #define SIZEOF_SIGNED 4 -| #define SIZEOF_SIGNED_LONG_LONG 8 -| #define SIZEOF_VOIDP 8 -| #define HAVE_FT2BUILD_H 1 -| #define HAVE_FREETYPE 1 -| #define HAVE_FREETYPE_FREETYPE_H 1 -| #define USE_FREETYPE 1 -| #define HAVE_FONTCONFIG_H 1 -| #define HAVE_FONTCONFIG 1 -| #define USE_GZIP 1 -| /* end confdefs.h. */ -| #include -| #ifdef HAVE_SYS_TYPES_H -| # include -| #endif -| #ifdef HAVE_SYS_STAT_H -| # include -| #endif -| #ifdef STDC_HEADERS -| # include -| # include -| #else -| # ifdef HAVE_STDLIB_H -| # include -| # endif -| #endif -| #ifdef HAVE_STRING_H -| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H -| # include -| # endif -| # include -| #endif -| #ifdef HAVE_STRINGS_H -| # include -| #endif -| #ifdef HAVE_INTTYPES_H -| # include -| #endif -| #ifdef HAVE_STDINT_H -| # include -| #endif -| #ifdef HAVE_UNISTD_H -| # include -| #endif -| #include -configure:6938: result: no -configure:6938: checking ruby.h presence -configure:6938: gcc -E -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig conftest.c -conftest.c:74:18: ruby.h: No such file or directory -configure:6938: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "" -| #define PACKAGE_TARNAME "" -| #define PACKAGE_VERSION "" -| #define PACKAGE_STRING "" -| #define PACKAGE_BUGREPORT "" -| #define PACKAGE_URL "" -| #define LINUX 1 -| #define O_BINARY 0 -| #define HAVE_LIBM 1 -| #define HAVE_LIBZ 1 -| #define HAVE_LIBJPEG 1 -| #define HAVE_LIBZZIP 1 -| #define SYSTEM_BACKTICKS 1 -| #define HAVE_DIRENT_H 1 -| #define STDC_HEADERS 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_STDLIB_H 1 -| #define HAVE_STRING_H 1 -| #define HAVE_MEMORY_H 1 -| #define HAVE_STRINGS_H 1 -| #define HAVE_INTTYPES_H 1 -| #define HAVE_STDINT_H 1 -| #define HAVE_UNISTD_H 1 -| #define HAVE_ZLIB_H 1 -| #define HAVE_WCHAR_H 1 -| #define HAVE_JPEGLIB_H 1 -| #define HAVE_ASSERT_H 1 -| #define HAVE_SIGNAL_H 1 -| #define HAVE_PTHREAD_H 1 -| #define HAVE_SYS_STAT_H 1 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_SYS_TYPES_H 1 -| #define HAVE_DIRENT_H 1 -| #define HAVE_SYS_DIR_H 1 -| #define HAVE_TIME_H 1 -| #define HAVE_SYS_TIME_H 1 -| #define HAVE_SYS_RESOURCE_H 1 -| #define HAVE_ZZIP_LIB_H 1 -| #define PACKAGE "swftools" -| #define VERSION "2011-01-23-1815" -| #define boolean int -| #define HAVE_POPEN 1 -| #define HAVE_WCSCHR 1 -| #define HAVE_WCSDUP 1 -| #define HAVE_MKSTEMP 1 -| #define HAVE_STAT 1 -| #define HAVE_MMAP 1 -| #define HAVE_LRAND48 1 -| #define HAVE_RAND 1 -| #define HAVE_SRAND48 1 -| #define HAVE_SRAND 1 -| #define HAVE_BCOPY 1 -| #define HAVE_BZERO 1 -| #define HAVE_TIME 1 -| #define HAVE_GETRUSAGE 1 -| #define HAVE_MALLINFO 1 -| #define HAVE_OPEN64 1 -| #define HAVE_CALLOC 1 -| #define SIZEOF_SIGNED_CHAR 1 -| #define SIZEOF_SIGNED_SHORT 2 -| #define SIZEOF_SIGNED 4 -| #define SIZEOF_SIGNED_LONG_LONG 8 -| #define SIZEOF_VOIDP 8 -| #define HAVE_FT2BUILD_H 1 -| #define HAVE_FREETYPE 1 -| #define HAVE_FREETYPE_FREETYPE_H 1 -| #define USE_FREETYPE 1 -| #define HAVE_FONTCONFIG_H 1 -| #define HAVE_FONTCONFIG 1 -| #define USE_GZIP 1 -| /* end confdefs.h. */ -| #include -configure:6938: result: no -configure:6938: checking for ruby.h -configure:6938: result: no -configure:6950: checking whether we should compile the ruby module -configure:6988: result: no -configure:7011: checking for missing libraries -configure:7068: result: ungif gif_lib.h -configure:7074: checking for Python version -configure:7153: result: 2.5 -configure:7157: checking for Python executable -Python 2.5.4 -configure:7162: result: python2.5 -configure:7174: checking whether we can compile the Python test program -python.m4: gcc -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer -I/usr/include/python2.5 conftest.c -L/usr/local/lib -L${exec_prefix}/lib -lpython2.5 -lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype -o conftest -configure:7191: result: yes -configure:7202: checking for Python install path -python2.5 _pypath.py -configure:7214: result: /usr/lib/python2.5/site-packages -configure:7223: checking for Python-Imaging -(didn't find the Python-Imaging libraries) -configure:7255: result: no -configure:7473: creating ./config.status - -## ---------------------- ## -## Running config.status. ## -## ---------------------- ## - -This file was extended by config.status, which was -generated by GNU Autoconf 2.68. Invocation command line was - - CONFIG_FILES = - CONFIG_HEADERS = - CONFIG_LINKS = - CONFIG_COMMANDS = - $ ./config.status - -on ks308520.kimsufi.com - -config.status:926: creating Makefile.common -config.status:1029: WARNING: 'Makefile.common.in' seems to ignore the --datarootdir setting -config.status:926: creating Makefile -config.status:926: creating lib/Makefile -config.status:926: creating lib/action/Makefile -config.status:926: creating src/Makefile -config.status:926: creating lib/pdf/Makefile -config.status:926: creating swfs/Makefile -config.status:926: creating lib/python/Makefile -config.status:926: creating lib/readers/Makefile -config.status:926: creating config.h -config.status:1101: config.h is unchanged - -## ---------------- ## -## Cache variables. ## -## ---------------- ## - -ac_cv_build=x86_64-unknown-linux-gnu -ac_cv_c_compiler_gnu=yes -ac_cv_c_const=yes -ac_cv_c_inline=inline -ac_cv_cxx_compiler_gnu=yes -ac_cv_env_CCC_set= -ac_cv_env_CCC_value= -ac_cv_env_CC_set= -ac_cv_env_CC_value= -ac_cv_env_CFLAGS_set= -ac_cv_env_CFLAGS_value= -ac_cv_env_CPPFLAGS_set= -ac_cv_env_CPPFLAGS_value= -ac_cv_env_CPP_set= -ac_cv_env_CPP_value= -ac_cv_env_CXXCPP_set= -ac_cv_env_CXXCPP_value= -ac_cv_env_CXXFLAGS_set= -ac_cv_env_CXXFLAGS_value= -ac_cv_env_CXX_set= -ac_cv_env_CXX_value= -ac_cv_env_LDFLAGS_set= -ac_cv_env_LDFLAGS_value= -ac_cv_env_LIBS_set= -ac_cv_env_LIBS_value= -ac_cv_env_build_alias_set= -ac_cv_env_build_alias_value= -ac_cv_env_host_alias_set= -ac_cv_env_host_alias_value= -ac_cv_env_target_alias_set= -ac_cv_env_target_alias_value= -ac_cv_func_bcopy=yes -ac_cv_func_bzero=yes -ac_cv_func_calloc=yes -ac_cv_func_getrusage=yes -ac_cv_func_lrand48=yes -ac_cv_func_mallinfo=yes -ac_cv_func_mkstemp=yes -ac_cv_func_mmap=yes -ac_cv_func_open64=yes -ac_cv_func_popen=yes -ac_cv_func_rand=yes -ac_cv_func_srand48=yes -ac_cv_func_srand=yes -ac_cv_func_stat=yes -ac_cv_func_time=yes -ac_cv_func_wcschr=yes -ac_cv_func_wcsdup=yes -ac_cv_header_assert_h=yes -ac_cv_header_dirent_dirent_h=yes -ac_cv_header_dirent_h=yes -ac_cv_header_fftw3_h=no -ac_cv_header_fontconfig_h=yes -ac_cv_header_ft2build_h=yes -ac_cv_header_gif_lib_h=no -ac_cv_header_inttypes_h=yes -ac_cv_header_io_h=no -ac_cv_header_jpeglib_h=yes -ac_cv_header_lame_h=no -ac_cv_header_memory_h=yes -ac_cv_header_ndir_h=no -ac_cv_header_pdflib_h=no -ac_cv_header_pthread_h=yes -ac_cv_header_ruby_h=no -ac_cv_header_signal_h=yes -ac_cv_header_stdc=yes -ac_cv_header_stdint_h=yes -ac_cv_header_stdlib_h=yes -ac_cv_header_string_h=yes -ac_cv_header_strings_h=yes -ac_cv_header_sys_bsdtypes_h=no -ac_cv_header_sys_dir_h=yes -ac_cv_header_sys_mman_h=yes -ac_cv_header_sys_ndir_h=no -ac_cv_header_sys_resource_h=yes -ac_cv_header_sys_stat_h=yes -ac_cv_header_sys_time_h=yes -ac_cv_header_sys_types_h=yes -ac_cv_header_time_h=yes -ac_cv_header_unistd_h=yes -ac_cv_header_wchar_h=yes -ac_cv_header_zlib_h=yes -ac_cv_header_zzip_lib_h=yes -ac_cv_host=x86_64-unknown-linux-gnu -ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d=no -ac_cv_lib_fontconfig_FcInit=yes -ac_cv_lib_gif_DGifOpen=no -ac_cv_lib_jpeg_jpeg_write_raw_data=yes -ac_cv_lib_m_sin=yes -ac_cv_lib_mp3lame_lame_init=no -ac_cv_lib_pdf_PDF_open_file=no -ac_cv_lib_ungif_DGifOpen=no -ac_cv_lib_z_deflate=yes -ac_cv_lib_zzip_zzip_file_open=yes -ac_cv_objext=o -ac_cv_path_EGREP='/bin/grep -E' -ac_cv_path_FREETYPE_CONFIG=/usr/local/bin/freetype-config -ac_cv_path_GREP=/bin/grep -ac_cv_path_install='/usr/bin/install -c' -ac_cv_prog_CPP='gcc -E' -ac_cv_prog_UNCOMPRESS=gzip -ac_cv_prog_ac_ct_CC=gcc -ac_cv_prog_ac_ct_CXX=g++ -ac_cv_prog_ac_ct_RANLIB=ranlib -ac_cv_prog_cc_c89= -ac_cv_prog_cc_g=yes -ac_cv_prog_cxx_g=yes -ac_cv_prog_make_make_set=yes -ac_cv_search_opendir='none required' -ac_cv_sizeof_signed=4 -ac_cv_sizeof_signed_char=1 -ac_cv_sizeof_signed_long_long=8 -ac_cv_sizeof_signed_short=2 -ac_cv_sizeof_voidp=8 -ac_cv_struct_tm=time.h -ac_cv_target=x86_64-unknown-linux-gnu -ac_cv_type_boolean=no -ac_cv_type_off_t=yes -ac_cv_type_size_t=yes - -## ----------------- ## -## Output variables. ## -## ----------------- ## - -AR='ar' -AREXT='.a' -AVIFILE_CONFIG='' -CC='gcc' -CFLAGS='-fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer ' -CPP='gcc -E' -CPPFLAGS=' -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig' -CXX='g++' -CXXCPP='' -CXXFLAGS='-fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer ' -CXXLIBS='-lstdc++' -DEFS='-DHAVE_CONFIG_H' -DEVICE_OPENGL='' -DEVICE_PDF='' -ECHO_C='' -ECHO_N='-n' -ECHO_T='' -EGREP='/bin/grep -E' -EXEEXT='' -FREETYPE_CONFIG='/usr/local/bin/freetype-config' -GIF2SWF='' -GREP='/bin/grep' -HAVE_PYTHON_IMAGING='' -HAVE_UNISTD_H='' -INSTALL_DATA='${INSTALL} -m 644' -INSTALL_PROGRAM='${INSTALL}' -INSTALL_SCRIPT='${INSTALL}' -JPEG2SWF='jpeg2swf$(E)' -LDFLAGS=' -L/usr/local/lib -L${exec_prefix}/lib' -LIBOBJS='' -LIBPDF='libpdf$(A)' -LIBS='-lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype' -LN_S='ln -s' -LTLIBOBJS='' -OBJEXT='o' -PACKAGE='swftools' -PACKAGE_BUGREPORT='' -PACKAGE_NAME='' -PACKAGE_STRING='' -PACKAGE_TARNAME='' -PACKAGE_URL='' -PACKAGE_VERSION='' -PATH_SEPARATOR=':' -PDF2PDF='' -PDF2SWF='pdf2swf$(E)' -PNG2SWF='png2swf$(E)' -PYTHON_EXECUTABLE='python2.5' -PYTHON_INCLUDES='-I/usr/include/python2.5' -PYTHON_INSTALL_PATH='/usr/lib/python2.5/site-packages' -PYTHON_LIB='-lpython2.5' -RANLIB='ranlib' -RUBY='' -RUBY_CPPFLAGS='' -RUBY_INSTALLDIR='' -RUBY_LDFLAGS='' -RUBY_LIBS='' -SET_MAKE='' -SHARED='-shared' -SHELL='/bin/sh' -SLEXT='so' -STRIP='@echo debug enabled, not stripping ' -SYSTEM_BACKTICKS='1' -UNCOMPRESS='gzip' -USE_GZIP='' -VERSION='2011-01-23-1815' -VIDEO_CFLAGS='' -VIDEO_LIBS='' -WORDS_BIGENDIAN='' -ac_ct_CC='gcc' -ac_ct_CXX='g++' -bindir='${exec_prefix}/bin' -build='x86_64-unknown-linux-gnu' -build_alias='' -build_cpu='x86_64' -build_os='linux-gnu' -build_vendor='unknown' -datadir='${datarootdir}' -datarootdir='${prefix}/share' -docdir='${datarootdir}/doc/${PACKAGE}' -dvidir='${docdir}' -exec_prefix='${prefix}' -host='x86_64-unknown-linux-gnu' -host_alias='' -host_cpu='x86_64' -host_os='linux-gnu' -host_vendor='unknown' -htmldir='${docdir}' -includedir='${prefix}/include' -infodir='${datarootdir}/info' -lame_in_source='' -libdir='${exec_prefix}/lib' -libexecdir='${exec_prefix}/libexec' -localedir='${datarootdir}/locale' -localstatedir='${prefix}/var' -mandir='${datarootdir}/man' -oldincludedir='/usr/include' -pdfdir='${docdir}' -prefix='/usr/local/swftools/special-swfdump' -program_transform_name='s,x,x,' -psdir='${docdir}' -sbindir='${exec_prefix}/sbin' -sharedstatedir='${prefix}/com' -splash_in_source='$(splash_objects)' -sysconfdir='${prefix}/etc' -target='x86_64-unknown-linux-gnu' -target_alias='' -target_cpu='x86_64' -target_os='linux-gnu' -target_vendor='unknown' -xpdf_in_source='$(xpdf_objects)' -xpdf_include=' -I xpdf ' - -## ----------- ## -## confdefs.h. ## -## ----------- ## - -/* confdefs.h */ -#define PACKAGE_NAME "" -#define PACKAGE_TARNAME "" -#define PACKAGE_VERSION "" -#define PACKAGE_STRING "" -#define PACKAGE_BUGREPORT "" -#define PACKAGE_URL "" -#define LINUX 1 -#define O_BINARY 0 -#define HAVE_LIBM 1 -#define HAVE_LIBZ 1 -#define HAVE_LIBJPEG 1 -#define HAVE_LIBZZIP 1 -#define SYSTEM_BACKTICKS 1 -#define HAVE_DIRENT_H 1 -#define STDC_HEADERS 1 -#define HAVE_SYS_TYPES_H 1 -#define HAVE_SYS_STAT_H 1 -#define HAVE_STDLIB_H 1 -#define HAVE_STRING_H 1 -#define HAVE_MEMORY_H 1 -#define HAVE_STRINGS_H 1 -#define HAVE_INTTYPES_H 1 -#define HAVE_STDINT_H 1 -#define HAVE_UNISTD_H 1 -#define HAVE_ZLIB_H 1 -#define HAVE_WCHAR_H 1 -#define HAVE_JPEGLIB_H 1 -#define HAVE_ASSERT_H 1 -#define HAVE_SIGNAL_H 1 -#define HAVE_PTHREAD_H 1 -#define HAVE_SYS_STAT_H 1 -#define HAVE_SYS_MMAN_H 1 -#define HAVE_SYS_TYPES_H 1 -#define HAVE_DIRENT_H 1 -#define HAVE_SYS_DIR_H 1 -#define HAVE_TIME_H 1 -#define HAVE_SYS_TIME_H 1 -#define HAVE_SYS_RESOURCE_H 1 -#define HAVE_ZZIP_LIB_H 1 -#define PACKAGE "swftools" -#define VERSION "2011-01-23-1815" -#define boolean int -#define HAVE_POPEN 1 -#define HAVE_WCSCHR 1 -#define HAVE_WCSDUP 1 -#define HAVE_MKSTEMP 1 -#define HAVE_STAT 1 -#define HAVE_MMAP 1 -#define HAVE_LRAND48 1 -#define HAVE_RAND 1 -#define HAVE_SRAND48 1 -#define HAVE_SRAND 1 -#define HAVE_BCOPY 1 -#define HAVE_BZERO 1 -#define HAVE_TIME 1 -#define HAVE_GETRUSAGE 1 -#define HAVE_MALLINFO 1 -#define HAVE_OPEN64 1 -#define HAVE_CALLOC 1 -#define SIZEOF_SIGNED_CHAR 1 -#define SIZEOF_SIGNED_SHORT 2 -#define SIZEOF_SIGNED 4 -#define SIZEOF_SIGNED_LONG_LONG 8 -#define SIZEOF_VOIDP 8 -#define HAVE_FT2BUILD_H 1 -#define HAVE_FREETYPE 1 -#define HAVE_FREETYPE_FREETYPE_H 1 -#define USE_FREETYPE 1 -#define HAVE_FONTCONFIG_H 1 -#define HAVE_FONTCONFIG 1 -#define USE_GZIP 1 - -configure: exit 0 diff --git a/fluidbook/tools/swftools-special-swfdump/config.status b/fluidbook/tools/swftools-special-swfdump/config.status deleted file mode 100644 index afe0e1bb1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/config.status +++ /dev/null @@ -1,1121 +0,0 @@ -#! /bin/sh -# Generated by configure. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by $as_me, which was -generated by GNU Autoconf 2.68. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -# Files that config.status was made for. -config_files=" Makefile.common Makefile lib/Makefile lib/action/Makefile src/Makefile lib/pdf/Makefile swfs/Makefile lib/python/Makefile lib/readers/Makefile" -config_headers=" config.h" - -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Report bugs to the package provider." - -ac_cs_config="'--prefix=/usr/local/swftools/special-swfdump'" -ac_cs_version="\ -config.status -configured by ./configure, generated by GNU Autoconf 2.68, - with options \"$ac_cs_config\" - -Copyright (C) 2010 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='/root/swftools-special-swfdump' -srcdir='.' -INSTALL='/usr/bin/install -c' -test -n "$AWK" || AWK=awk -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -if $ac_cs_recheck; then - set X '/bin/sh' './configure' '--prefix=/usr/local/swftools/special-swfdump' $ac_configure_extra_args --no-create --no-recursion - shift - $as_echo "running CONFIG_SHELL=/bin/sh $*" >&6 - CONFIG_SHELL='/bin/sh' - export CONFIG_SHELL - exec "$@" -fi - -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "${FILES}") CONFIG_FILES="$CONFIG_FILES ${FILES}" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && -S["LTLIBOBJS"]="" -S["LIBOBJS"]="" -S["PNG2SWF"]="png2swf$(E)" -S["GIF2SWF"]="" -S["JPEG2SWF"]="jpeg2swf$(E)" -S["PDF2PDF"]="" -S["DEVICE_PDF"]="" -S["LIBPDF"]="libpdf$(A)" -S["PDF2SWF"]="pdf2swf$(E)" -S["HAVE_PYTHON_IMAGING"]="" -S["PYTHON_INSTALL_PATH"]="/usr/lib/python2.5/site-packages" -S["PYTHON_INCLUDES"]="-I/usr/include/python2.5" -S["PYTHON_LIB"]="-lpython2.5" -S["PYTHON_EXECUTABLE"]="python2.5" -S["RUBY_INSTALLDIR"]="" -S["RUBY_LDFLAGS"]="" -S["RUBY_CPPFLAGS"]="" -S["RUBY_LIBS"]="" -S["RUBY"]="" -S["USE_GZIP"]="" -S["VIDEO_CFLAGS"]="" -S["VIDEO_LIBS"]="" -S["AVIFILE_CONFIG"]="" -S["xpdf_include"]=" -I xpdf " -S["splash_in_source"]="$(splash_objects)" -S["xpdf_in_source"]="$(xpdf_objects)" -S["CXXCPP"]="" -S["lame_in_source"]="" -S["DEVICE_OPENGL"]="" -S["FREETYPE_CONFIG"]="/usr/local/bin/freetype-config" -S["HAVE_UNISTD_H"]="" -S["VERSION"]="2011-01-23-1815" -S["PACKAGE"]="swftools" -S["EGREP"]="/bin/grep -E" -S["GREP"]="/bin/grep" -S["SYSTEM_BACKTICKS"]="1" -S["WORDS_BIGENDIAN"]="" -S["target_os"]="linux-gnu" -S["target_vendor"]="unknown" -S["target_cpu"]="x86_64" -S["target"]="x86_64-unknown-linux-gnu" -S["STRIP"]="@echo debug enabled, not stripping " -S["CXXLIBS"]="-lstdc++" -S["SLEXT"]="so" -S["AR"]="ar" -S["AREXT"]=".a" -S["UNCOMPRESS"]="gzip" -S["LN_S"]="ln -s" -S["INSTALL_DATA"]="${INSTALL} -m 644" -S["INSTALL_SCRIPT"]="${INSTALL}" -S["INSTALL_PROGRAM"]="${INSTALL}" -S["SET_MAKE"]="" -S["RANLIB"]="ranlib" -S["CPP"]="gcc -E" -S["ac_ct_CXX"]="g++" -S["CXXFLAGS"]="-fPIC -fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer " -S["CXX"]="g++" -S["OBJEXT"]="o" -S["EXEEXT"]="" -S["ac_ct_CC"]="gcc" -S["CPPFLAGS"]=" -I${prefix}/include -I/usr/local/include/freetype2 -I/usr/local/include -I/usr/include/fontconfig" -S["LDFLAGS"]=" -L/usr/local/lib -L${exec_prefix}/lib" -S["CFLAGS"]="-fPIC -Wimplicit -Wreturn-type -Wno-write-strings -Wformat -O -fomit-frame-pointer " -S["CC"]="gcc" -S["SHARED"]="-shared" -S["host_os"]="linux-gnu" -S["host_vendor"]="unknown" -S["host_cpu"]="x86_64" -S["host"]="x86_64-unknown-linux-gnu" -S["build_os"]="linux-gnu" -S["build_vendor"]="unknown" -S["build_cpu"]="x86_64" -S["build"]="x86_64-unknown-linux-gnu" -S["target_alias"]="" -S["host_alias"]="" -S["build_alias"]="" -S["LIBS"]="-lzzip -ljpeg -lz -lm -L/usr/local/lib -lz -lfontconfig -lfreetype" -S["ECHO_T"]="" -S["ECHO_N"]="-n" -S["ECHO_C"]="" -S["DEFS"]="-DHAVE_CONFIG_H" -S["mandir"]="${datarootdir}/man" -S["localedir"]="${datarootdir}/locale" -S["libdir"]="${exec_prefix}/lib" -S["psdir"]="${docdir}" -S["pdfdir"]="${docdir}" -S["dvidir"]="${docdir}" -S["htmldir"]="${docdir}" -S["infodir"]="${datarootdir}/info" -S["docdir"]="${datarootdir}/doc/${PACKAGE}" -S["oldincludedir"]="/usr/include" -S["includedir"]="${prefix}/include" -S["localstatedir"]="${prefix}/var" -S["sharedstatedir"]="${prefix}/com" -S["sysconfdir"]="${prefix}/etc" -S["datadir"]="${datarootdir}" -S["datarootdir"]="${prefix}/share" -S["libexecdir"]="${exec_prefix}/libexec" -S["sbindir"]="${exec_prefix}/sbin" -S["bindir"]="${exec_prefix}/bin" -S["program_transform_name"]="s,x,x," -S["prefix"]="/usr/local/swftools/special-swfdump" -S["exec_prefix"]="${prefix}" -S["PACKAGE_URL"]="" -S["PACKAGE_BUGREPORT"]="" -S["PACKAGE_STRING"]="" -S["PACKAGE_VERSION"]="" -S["PACKAGE_TARNAME"]="" -S["PACKAGE_NAME"]="" -S["PATH_SEPARATOR"]=":" -S["SHELL"]="/bin/sh" -_ACAWK -cat >>"$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -D["PACKAGE_NAME"]=" \"\"" -D["PACKAGE_TARNAME"]=" \"\"" -D["PACKAGE_VERSION"]=" \"\"" -D["PACKAGE_STRING"]=" \"\"" -D["PACKAGE_BUGREPORT"]=" \"\"" -D["PACKAGE_URL"]=" \"\"" -D["LINUX"]=" 1" -D["O_BINARY"]=" 0" -D["HAVE_LIBM"]=" 1" -D["HAVE_LIBZ"]=" 1" -D["HAVE_LIBJPEG"]=" 1" -D["HAVE_LIBZZIP"]=" 1" -D["SYSTEM_BACKTICKS"]=" 1" -D["HAVE_DIRENT_H"]=" 1" -D["STDC_HEADERS"]=" 1" -D["HAVE_SYS_TYPES_H"]=" 1" -D["HAVE_SYS_STAT_H"]=" 1" -D["HAVE_STDLIB_H"]=" 1" -D["HAVE_STRING_H"]=" 1" -D["HAVE_MEMORY_H"]=" 1" -D["HAVE_STRINGS_H"]=" 1" -D["HAVE_INTTYPES_H"]=" 1" -D["HAVE_STDINT_H"]=" 1" -D["HAVE_UNISTD_H"]=" 1" -D["HAVE_ZLIB_H"]=" 1" -D["HAVE_WCHAR_H"]=" 1" -D["HAVE_JPEGLIB_H"]=" 1" -D["HAVE_ASSERT_H"]=" 1" -D["HAVE_SIGNAL_H"]=" 1" -D["HAVE_PTHREAD_H"]=" 1" -D["HAVE_SYS_STAT_H"]=" 1" -D["HAVE_SYS_MMAN_H"]=" 1" -D["HAVE_SYS_TYPES_H"]=" 1" -D["HAVE_DIRENT_H"]=" 1" -D["HAVE_SYS_DIR_H"]=" 1" -D["HAVE_TIME_H"]=" 1" -D["HAVE_SYS_TIME_H"]=" 1" -D["HAVE_SYS_RESOURCE_H"]=" 1" -D["HAVE_ZZIP_LIB_H"]=" 1" -D["PACKAGE"]=" \"swftools\"" -D["VERSION"]=" \"2011-01-23-1815\"" -D["boolean"]=" int" -D["HAVE_POPEN"]=" 1" -D["HAVE_WCSCHR"]=" 1" -D["HAVE_WCSDUP"]=" 1" -D["HAVE_MKSTEMP"]=" 1" -D["HAVE_STAT"]=" 1" -D["HAVE_MMAP"]=" 1" -D["HAVE_LRAND48"]=" 1" -D["HAVE_RAND"]=" 1" -D["HAVE_SRAND48"]=" 1" -D["HAVE_SRAND"]=" 1" -D["HAVE_BCOPY"]=" 1" -D["HAVE_BZERO"]=" 1" -D["HAVE_TIME"]=" 1" -D["HAVE_GETRUSAGE"]=" 1" -D["HAVE_MALLINFO"]=" 1" -D["HAVE_OPEN64"]=" 1" -D["HAVE_CALLOC"]=" 1" -D["SIZEOF_SIGNED_CHAR"]=" 1" -D["SIZEOF_SIGNED_SHORT"]=" 2" -D["SIZEOF_SIGNED"]=" 4" -D["SIZEOF_SIGNED_LONG_LONG"]=" 8" -D["SIZEOF_VOIDP"]=" 8" -D["HAVE_FT2BUILD_H"]=" 1" -D["HAVE_FREETYPE"]=" 1" -D["HAVE_FREETYPE_FREETYPE_H"]=" 1" -D["USE_FREETYPE"]=" 1" -D["HAVE_FONTCONFIG_H"]=" 1" -D["HAVE_FONTCONFIG"]=" 1" -D["USE_GZIP"]=" 1" - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ { - line = $ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} - ac_datarootdir_hack=' - s&@datadir@&${datarootdir}&g - s&@docdir@&${datarootdir}/doc/${PACKAGE}&g - s&@infodir@&${datarootdir}/info&g - s&@localedir@&${datarootdir}/locale&g - s&@mandir@&${datarootdir}/man&g - s&\${datarootdir}&${prefix}/share&g' ;; -esac -ac_sed_extra="/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -} - -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi - ;; - - - esac - -done # for ac_tag - - -as_fn_exit 0 diff --git a/fluidbook/tools/swftools-special-swfdump/config.sub b/fluidbook/tools/swftools-special-swfdump/config.sub deleted file mode 100644 index ba16ebf55..000000000 --- a/fluidbook/tools/swftools-special-swfdump/config.sub +++ /dev/null @@ -1,1676 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 -# Free Software Foundation, Inc. - -timestamp='2008-01-16' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# 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 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. -# -# 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. - - -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. -# -# 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. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ - uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) - os= - basic_machine=$1 - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx | dvp \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64vr | mips64vrel \ - | mips64orion | mips64orionel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | mt \ - | msp430 \ - | nios | nios2 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]a*eb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tron-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mipsEE* | ee | ps2) - basic_machine=mips64r5900el-scei - case $os in - -linux*) - ;; - *) - os=-elf - ;; - esac - ;; - iop) - basic_machine=mipsel-scei - os=-irx - ;; - dvp) - basic_machine=dvp-scei - os=-elf - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; - tile*) - basic_machine=tile-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -irx*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/fluidbook/tools/swftools-special-swfdump/configure b/fluidbook/tools/swftools-special-swfdump/configure deleted file mode 100644 index 59ffec68e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/configure +++ /dev/null @@ -1,8672 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68. -# -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -# Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - # Preserve -v and -x to the replacement shell. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; - esac - exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, -$0: including any error possibly output before this -$0: message. Then install a modern shell, or manually run -$0: the script under such a shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME= -PACKAGE_TARNAME= -PACKAGE_VERSION= -PACKAGE_STRING= -PACKAGE_BUGREPORT= -PACKAGE_URL= - -ac_unique_file="src/" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='LTLIBOBJS -LIBOBJS -PNG2SWF -GIF2SWF -JPEG2SWF -PDF2PDF -DEVICE_PDF -LIBPDF -PDF2SWF -HAVE_PYTHON_IMAGING -PYTHON_INSTALL_PATH -PYTHON_INCLUDES -PYTHON_LIB -PYTHON_EXECUTABLE -RUBY_INSTALLDIR -RUBY_LDFLAGS -RUBY_CPPFLAGS -RUBY_LIBS -RUBY -USE_GZIP -VIDEO_CFLAGS -VIDEO_LIBS -AVIFILE_CONFIG -xpdf_include -splash_in_source -xpdf_in_source -CXXCPP -lame_in_source -DEVICE_OPENGL -FREETYPE_CONFIG -HAVE_UNISTD_H -VERSION -PACKAGE -EGREP -GREP -SYSTEM_BACKTICKS -WORDS_BIGENDIAN -target_os -target_vendor -target_cpu -target -STRIP -CXXLIBS -SLEXT -AR -AREXT -UNCOMPRESS -LN_S -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -SET_MAKE -RANLIB -CPP -ac_ct_CXX -CXXFLAGS -CXX -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -SHARED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_checkmem -enable_debug -enable_profiling -enable_warnings -enable_optimizations -enable_poppler -enable_lame -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CXX -CXXFLAGS -CCC -CPP -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used" >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures this package to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] - --target=TARGET configure for building compilers for TARGET [HOST] -_ACEOF -fi - -if test -n "$ac_init_help"; then - - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-checkmem turn on ccmalloc debugging - --enable-debug turn on debugging - --enable-profiling turn on profiling - --enable-warnings turn on compiler warnings - --enable-optimizations turn on compiler optimizations (recommended for avi2swf) - --enable-poppler link againist libpoppler - --disable-lame "don't compile any L.A.M.E. mp3 encoding code in" - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CPP C preprocessor - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to the package provider. -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -configure -generated by GNU Autoconf 2.68 - -Copyright (C) 2010 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_cxx_try_compile LINENO -# ---------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func - -# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES -# -------------------------------------------- -# Tries to find the compile-time value of EXPR in a program that includes -# INCLUDES, setting VAR accordingly. Returns whether the value could be -# computed -ac_fn_c_compute_int () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=0 ac_mid=0 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid; break -else - as_fn_arith $ac_mid + 1 && ac_lo=$as_val - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=-1 ac_mid=-1 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=$ac_mid; break -else - as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - ac_lo= ac_hi= -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid -else - as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in #(( -?*) eval "$3=\$ac_lo"; ac_retval=0 ;; -'') ac_retval=1 ;; -esac - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (($2) < 0) - { - long int i = longval (); - if (i != ($2)) - return 1; - fprintf (f, "%ld", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ($2)) - return 1; - fprintf (f, "%lu", i); - } - /* Do not output a trailing newline, as this causes \r\n confusion - on some platforms. */ - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - echo >>conftest.val; read $3 &5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_cpp - -# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES -# --------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_cxx_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_cxx_check_header_mongrel - -# ac_fn_cxx_try_link LINENO -# ------------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_cxx_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_cxx_try_link -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by $as_me, which was -generated by GNU Autoconf 2.68. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - -# ------------------- option parsing ------------------------------- - -DEBUG= -CHECKMEM= -PROFILING= -ENABLE_WARNINGS= -OPTIMIZE= -USE_POPPLER= -DISABLE_LAME= - -# Check whether --enable-checkmem was given. -if test "${enable_checkmem+set}" = set; then : - enableval=$enable_checkmem; CHECKMEM=true -fi - -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; DEBUG=true -fi - -# Check whether --enable-profiling was given. -if test "${enable_profiling+set}" = set; then : - enableval=$enable_profiling; PROFILING=true -fi - -# Check whether --enable-warnings was given. -if test "${enable_warnings+set}" = set; then : - enableval=$enable_warnings; ENABLE_WARNINGS=true -fi - -# Check whether --enable-optimizations was given. -if test "${enable_optimizations+set}" = set; then : - enableval=$enable_optimizations; OPTIMIZE=true -fi - -# Check whether --enable-poppler was given. -if test "${enable_poppler+set}" = set; then : - enableval=$enable_poppler; USE_POPPLER=true -fi - -# Check whether --enable-lame was given. -if test "${enable_lame+set}" = set; then : - enableval=$enable_lame; if test "x$enable_lame" = "xno";then - DISABLE_LAME=yes -fi -else - DISABLE_LAME= -fi - - -PACKAGE=swftools -VERSION=2011-01-23-1815 - -# ------------------------------------------------------------------ - -if test "x${srcdir}" != "x."; then - echo "--srcdir is not supported" - exit 1 -fi - -WARNINGS="-Wimplicit -Wreturn-type -Wno-write-strings -Wformat" -if test "x$ENABLE_WARNINGS" '!=' "x";then - WARNINGS="-Wall -Wno-unused -Wno-format -Wno-redundant-decls -Wno-write-strings -D_FORTIFY_SOURCE=2 " -fi - -if test "x$CHECKMEM" '!=' "x";then - DEBUG=yes -fi -if test "x$PROFILING" '!=' "x";then - DEBUG=yes -fi -if test "x$DEBUG" '!=' "x";then - if test "x$PROFILING" = "x";then - CFLAGS="$WARNINGS -O2 -g $CFLAGS" - CXXFLAGS="$WARNINGS -O2 -g $CXXFLAGS" - LDFLAGS="-g $LDFLAGS" - else - CFLAGS="$WARNINGS -O2 -g -pg $CFLAGS" - CXXFLAGS="$WARNINGS -O2 -g -pg $CXXFLAGS" - LDFLAGS="-g -pg $LDFLAGS" - fi -else if test "x$OPTIMIZE" '!=' "x"; then - CFLAGS="$WARNINGS -O3 -fomit-frame-pointer -Winline $CFLAGS" - CXXFLAGS="$WARNINGS -O3 -fomit-frame-pointer -Winline $CXXFLAGS" -else - CFLAGS="$WARNINGS -O -fomit-frame-pointer $CFLAGS" - CXXFLAGS="$WARNINGS -O -fomit-frame-pointer $CXXFLAGS" -fi -fi - -CFLAGS="-fPIC $CFLAGS" -CXXFLAGS="-fPIC $CFLAGS" - -#OLDGCC=1 -#if test "x$OLDGCC" '!=' "x";then -# #CFLAGS="$CFLAGS --std=c89 -ansi -pendantic" -# #CXXFLAGS="$CXXFLAGS --std=c89 -ansi -pendantic" -# CFLAGS="$CFLAGS -ansi -pendantic" -# CXXFLAGS="$CXXFLAGS -ansi -pendantic" -#fi - -export PACKAGE VERSION CFLAGS CXXFLAGS - - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - - -SLEXT="so" -SHARED="-shared" -MACOSX= -case $host_os in - *darwin* ) - MACOSX=yes - CFLAGS="$CFLAGS" - CXXFLAGS="$CXXFLAGS -fno-rtti" - SHARED="-bundle" - SLEXT="bundle" - if test -d /opt/local/include && test -d /opt/local/lib; then - CPPFLAGS="${CPPFLAGS} -I/opt/local/include" - LDFLAGS="${LDFLAGS} -L/opt/local/lib" - fi - # Use fink packages if available. - #if test -d /sw/include && test -d /sw/lib; then - # CPPFLAGS="${CPPFLAGS} -I/sw/include" - # LDFLAGS="${LDFLAGS} -L/sw/lib" - #fi - ;; -esac - - - - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 -$as_echo "$CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CXX+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 -$as_echo "$ac_ct_CXX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 -$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } -if ${ac_cv_cxx_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 -$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GXX=yes -else - GXX= -fi -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 -$as_echo_n "checking whether $CXX accepts -g... " >&6; } -if ${ac_cv_prog_cxx_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -else - CXXFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - ac_cv_prog_cxx_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 -$as_echo "$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc supports lazy variable declaration" >&5 -$as_echo_n "checking whether gcc supports lazy variable declaration... " >&6; } - -cat > conftest.c << EOF -#include -#include - -int main (int argc, char*argv) -{ - int a,b; - b=3; - int c; - c=4; - return 0; -} -EOF - -testprog_link='$CC $CPPFLAGS $CFLAGS conftest.c -o conftest${ac_exeext}' -if { (eval echo gcc.2.95.m4:19: \"$testprog_link\") 1>&5; (eval $testprog_link) 2>&5; } && test -s conftest${ac_exeext}; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - GCC_IS_OK=true - export GCC_IS_OK -else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -rm -f conftest* - - -if test "x$GCC_IS_OK" '=' "x";then - echo "***************************************************" - echo "* Your gcc is too old to compile this!" - echo "* " - echo "* The last version compileable by this compiler is " - echo "* swftools 0.7.0, which you can download from " - echo "* http://www.swftools.org/swftools-0.7.0.tar.gz " - echo "* ." - echo "* Newer versions require at least gcc 3.0.0 " - echo "***************************************************" - exit 1 -fi - -if test "x$CHECKMEM" '!=' "x";then - CC="ccmalloc $CC" - CXX="ccmalloc $CXX" - #echo running again - #unset ac_cv_prog_CC - #unset ac_cv_prog_CXX - #AC_PROG_CC - #AC_PROG_CXX -fi - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - - # Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - - for ac_prog in gzip uncompress compress -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_UNCOMPRESS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$UNCOMPRESS"; then - ac_cv_prog_UNCOMPRESS="$UNCOMPRESS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_UNCOMPRESS="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -UNCOMPRESS=$ac_cv_prog_UNCOMPRESS -if test -n "$UNCOMPRESS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNCOMPRESS" >&5 -$as_echo "$UNCOMPRESS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$UNCOMPRESS" && break -done - - - -OBJEXT="o" -AREXT=".a" -CXXLIBS="-lstdc++" - - - -if test "x$EXEEXT" = "x.exe";then - OBJEXT="obj" - AREXT=".lib" - CXXLIBS="" -fi - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for target system" >&5 -$as_echo_n "checking for target system... " >&6; } -CYGWIN= -MINGW= -case $host_os in - *cygwin* ) CYGWIN=yes;; - *mingw* ) MINGW=yes;; -esac - -AR=ar -if test "x$MINGW" = "xyes"; then - #fix for the debian distribution of mingw - if test -x "/usr/i586-mingw32msvc/bin/ar";then - AR="/usr/i586-mingw32msvc/bin/ar" - fi - if test -x "/usr/i586-mingw32msvc/bin/ranlib";then - RANLIB="/usr/i586-mingw32msvc/bin/ranlib" - fi - #fix for the gentoo distribution of mingw - if test -x "/opt/xmingw/bin/i386-mingw32msvc-ar";then - AR="/opt/xmingw/bin/i386-mingw32msvc-ar" - fi - if test -x "/opt/xmingw/bin/i386-mingw32msvc-ranlib";then - RANLIB="/opt/xmingw/bin/i386-mingw32msvc-ranlib" - fi - if test -x "/opt/xmingw/bin/i386-mingw32msvc-strip";then - STRIP="/opt/xmingw/bin/i386-mingw32msvc-strip" - fi -fi - - - -if test "x${CYGWIN}" = "xyes"; then - -$as_echo "#define CYGWIN 1" >>confdefs.h - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: cygwin" >&5 -$as_echo "cygwin" >&6; } -else - if test "x${MINGW}" = "xyes"; then - -$as_echo "#define MINGW 1" >>confdefs.h - - WIN32=1 - -$as_echo "#define WIN32 1" >>confdefs.h - - LIBS="$LIBS -lws2_32 -lgdi32" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: mingw" >&5 -$as_echo "mingw" >&6; } - else - LINUX=1 - export LINUX - -$as_echo "#define LINUX 1" >>confdefs.h - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 -$as_echo "" >&6; } - fi -fi - - -if test "x${MINGW}" != "xyes"; then - # no mingW - -$as_echo "#define O_BINARY 0" >>confdefs.h - -else - # mingW - SLEXT="dll" - CXXLIBS="" -fi -export SLEXT - - - -# The following tries to make use of includes and libraries in -# /usr/local, too. Notice: A -I/usr/local/include might break -# things (MingW, cross-compiling etc.) in the same way as -I/usr/include, -# especially on systems which link /usr/local to /usr, so it has yet -# to be seen how useful this is. -if test -d /usr/local/lib; then - LDFLAGS="$LDFLAGS -L/usr/local/lib" -fi -if test -d /usr/local/include; then -# Leave that alone. It's causing trouble e.g. with gcc 3.2 on gentoo. -# CPPFLAGS="$CPPFLAGS -I/usr/local/include" - echo > /dev/null -fi -if test "$prefix" != "NONE" -a "$prefix" != "/usr/local" -a "$prefix" != "/usr/local/"; then - # if the user has a special prefix (like /opt), there might also be $prefix/lib - # and $prefix/include, which should be included in our search paths for libraries - # and includes. - LDFLAGS="$LDFLAGS -L${libdir}" - CPPFLAGS="$CPPFLAGS -I${includedir}" - # TODO- test whether gcc still works after this -fi - -#Mac OS: -#LDFLAGS "-L/sw/lib" ; CPPFLAGS "-I/sw/include -I/sw/include/lame" - - -# this must be done after (I believe) AC_PROG_MAKE_SET -if test "x$DEBUG" '!=' "x" -o "x$STRIP" = "x";then - if test "$MACOSX";then - STRIP=dsymutil - else - STRIP="@echo debug enabled, not stripping " - fi - export STRIP - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 -$as_echo_n "checking for sin in -lm... " >&6; } -if ${ac_cv_lib_m_sin+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lm $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char sin (); -int -main () -{ -return sin (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_m_sin=yes -else - ac_cv_lib_m_sin=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5 -$as_echo "$ac_cv_lib_m_sin" >&6; } -if test "x$ac_cv_lib_m_sin" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBM 1 -_ACEOF - - LIBS="-lm $LIBS" - -else - echo "Error: Math library not found."; - exit; - -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5 -$as_echo_n "checking for deflate in -lz... " >&6; } -if ${ac_cv_lib_z_deflate+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lz $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char deflate (); -int -main () -{ -return deflate (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_z_deflate=yes -else - ac_cv_lib_z_deflate=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflate" >&5 -$as_echo "$ac_cv_lib_z_deflate" >&6; } -if test "x$ac_cv_lib_z_deflate" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBZ 1 -_ACEOF - - LIBS="-lz $LIBS" - -else - ZLIBMISSING=true -fi - - -if test "x$ZLIBMISSING" = "xtrue";then - echo - echo "ERROR:" - echo "You need zlib to compile swftools" - echo - exit -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PDF_open_file in -lpdf" >&5 -$as_echo_n "checking for PDF_open_file in -lpdf... " >&6; } -if ${ac_cv_lib_pdf_PDF_open_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpdf $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char PDF_open_file (); -int -main () -{ -return PDF_open_file (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pdf_PDF_open_file=yes -else - ac_cv_lib_pdf_PDF_open_file=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pdf_PDF_open_file" >&5 -$as_echo "$ac_cv_lib_pdf_PDF_open_file" >&6; } -if test "x$ac_cv_lib_pdf_PDF_open_file" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPDF 1 -_ACEOF - - LIBS="-lpdf $LIBS" - -else - PDFLIBMISSING=true -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_write_raw_data in -ljpeg" >&5 -$as_echo_n "checking for jpeg_write_raw_data in -ljpeg... " >&6; } -if ${ac_cv_lib_jpeg_jpeg_write_raw_data+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ljpeg $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char jpeg_write_raw_data (); -int -main () -{ -return jpeg_write_raw_data (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_jpeg_jpeg_write_raw_data=yes -else - ac_cv_lib_jpeg_jpeg_write_raw_data=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_write_raw_data" >&5 -$as_echo "$ac_cv_lib_jpeg_jpeg_write_raw_data" >&6; } -if test "x$ac_cv_lib_jpeg_jpeg_write_raw_data" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBJPEG 1 -_ACEOF - - LIBS="-ljpeg $LIBS" - -else - JPEGLIBMISSING=true -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DGifOpen in -lungif" >&5 -$as_echo_n "checking for DGifOpen in -lungif... " >&6; } -if ${ac_cv_lib_ungif_DGifOpen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lungif $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char DGifOpen (); -int -main () -{ -return DGifOpen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ungif_DGifOpen=yes -else - ac_cv_lib_ungif_DGifOpen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ungif_DGifOpen" >&5 -$as_echo "$ac_cv_lib_ungif_DGifOpen" >&6; } -if test "x$ac_cv_lib_ungif_DGifOpen" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBUNGIF 1 -_ACEOF - - LIBS="-lungif $LIBS" - -else - UNGIFMISSING=true -fi - -if test "$UNGIFMISSING";then - UNGIFMISSING= - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DGifOpen in -lgif" >&5 -$as_echo_n "checking for DGifOpen in -lgif... " >&6; } -if ${ac_cv_lib_gif_DGifOpen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lgif $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char DGifOpen (); -int -main () -{ -return DGifOpen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_gif_DGifOpen=yes -else - ac_cv_lib_gif_DGifOpen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gif_DGifOpen" >&5 -$as_echo "$ac_cv_lib_gif_DGifOpen" >&6; } -if test "x$ac_cv_lib_gif_DGifOpen" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBGIF 1 -_ACEOF - - LIBS="-lgif $LIBS" - -else - UNGIFMISSING=true -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for zzip_file_open in -lzzip" >&5 -$as_echo_n "checking for zzip_file_open in -lzzip... " >&6; } -if ${ac_cv_lib_zzip_zzip_file_open+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lzzip $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char zzip_file_open (); -int -main () -{ -return zzip_file_open (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_zzip_zzip_file_open=yes -else - ac_cv_lib_zzip_zzip_file_open=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zzip_zzip_file_open" >&5 -$as_echo "$ac_cv_lib_zzip_zzip_file_open" >&6; } -if test "x$ac_cv_lib_zzip_zzip_file_open" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBZZIP 1 -_ACEOF - - LIBS="-lzzip $LIBS" - -else - ZZIPMISSING=true -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 -$as_echo_n "checking target system type... " >&6; } -if ${ac_cv_target+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$target_alias" = x; then - ac_cv_target=$ac_cv_host -else - ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 -$as_echo "$ac_cv_target" >&6; } -case $ac_cv_target in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; -esac -target=$ac_cv_target -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_target -shift -target_cpu=$1 -target_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -target_os=$* -IFS=$ac_save_IFS -case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac - - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -test -n "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for byte order" >&5 -$as_echo_n "checking for byte order... " >&6; } -if test "$cross_compiling" = yes; then : - CROSSCOMPILE=1 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int main (int argc, char *argv[]) -{ - int i = 1; - return *(char*)&i; -} - -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - BIGENDIAN=1 -else - LITTLEENDIAN=1 -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -export CROSSCOMPILE - -if test "x${CROSSCOMPILE}" = "x1"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: we are cross compiling- trying to guess from system type" >&5 -$as_echo "we are cross compiling- trying to guess from system type" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for byte order, try 2" >&5 -$as_echo_n "checking for byte order, try 2... " >&6; } - case "${target}" in - *86* | *-pc-* ) - LITTLEENDIAN=1 - ;; - *sparc* | *68* | *88k* | *mac* | *Mac* | *sun* | *Sun* | *Amiga* | *amiga* ) - BIGENDIAN=1 - ;; - esac -fi - -export LITTLEENDIAN -if test "x${LITTLEENDIAN}" = "x1"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: little endian" >&5 -$as_echo "little endian" >&6; } -BYTEORDERCHECKOK=1 -fi -export BIGENDIAN -if test "x${BIGENDIAN}" = "x1"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: big endian" >&5 -$as_echo "big endian" >&6; } -BYTEORDERCHECKOK=1 -WORDS_BIGENDIAN=1 -export WORDS_BIGENDIAN - -$as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h - -fi -if test "x${BYTEORDERCHECKOK}" != "x1"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 -$as_echo "unknown" >&6; } -echo Byte order could not determined. -exit 1 -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system() can handle command substitution" >&5 -$as_echo_n "checking whether system() can handle command substitution... " >&6; } -if test "$cross_compiling" = yes; then : - CROSSCOMPILE=1 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include "stdlib.h" -int main (int argc, char*argv[]) -{ - return system("test `touch config.tmp2`"); -} - -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - OK=OK -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - -if test "x${OK}" = "xOK";then - test -f config.tmp2 || OK= -fi - -if test "x${CROSSCOMPILE}" = "x1";then - OK=no; -fi -if test "x${OK}" = "xOK";then -rm -f config.tmp2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -SYSTEM_BACKTICKS=1 -export SYSTEM_BACKTICKS - -$as_echo "#define SYSTEM_BACKTICKS 1" >>confdefs.h - -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - - - ac_config_headers="$ac_config_headers config.h" - - ac_header_dirent=no -for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do - as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 -$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } -if eval \${$as_ac_Header+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include <$ac_hdr> - -int -main () -{ -if ((DIR *) 0) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$as_ac_Header=yes" -else - eval "$as_ac_Header=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$as_ac_Header - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 -_ACEOF - -ac_header_dirent=$ac_hdr; break -fi - -done -# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. -if test $ac_header_dirent = dirent.h; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 -$as_echo_n "checking for library containing opendir... " >&6; } -if ${ac_cv_search_opendir+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char opendir (); -int -main () -{ -return opendir (); - ; - return 0; -} -_ACEOF -for ac_lib in '' dir; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_opendir=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search_opendir+:} false; then : - break -fi -done -if ${ac_cv_search_opendir+:} false; then : - -else - ac_cv_search_opendir=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 -$as_echo "$ac_cv_search_opendir" >&6; } -ac_res=$ac_cv_search_opendir -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 -$as_echo_n "checking for library containing opendir... " >&6; } -if ${ac_cv_search_opendir+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char opendir (); -int -main () -{ -return opendir (); - ; - return 0; -} -_ACEOF -for ac_lib in '' x; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_opendir=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search_opendir+:} false; then : - break -fi -done -if ${ac_cv_search_opendir+:} false; then : - -else - ac_cv_search_opendir=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 -$as_echo "$ac_cv_search_opendir" >&6; } -ac_res=$ac_cv_search_opendir -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - - - # On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in zlib.h gif_lib.h io.h wchar.h jpeglib.h assert.h signal.h pthread.h sys/stat.h sys/mman.h sys/types.h dirent.h sys/bsdtypes.h sys/ndir.h sys/dir.h ndir.h time.h sys/time.h sys/resource.h pdflib.h zzip/lib.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset cs; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "#define const /**/" >>confdefs.h - -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - - ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define off_t long int -_ACEOF - -fi - - ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF - -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 -$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } -if ${ac_cv_struct_tm+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include - -int -main () -{ -struct tm tm; - int *p = &tm.tm_sec; - return !p; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_struct_tm=time.h -else - ac_cv_struct_tm=sys/time.h -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 -$as_echo "$ac_cv_struct_tm" >&6; } -if test $ac_cv_struct_tm = sys/time.h; then - -$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h - -fi - - ac_fn_c_check_type "$LINENO" "boolean" "ac_cv_type_boolean" "$ac_includes_default" -if test "x$ac_cv_type_boolean" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define boolean int -_ACEOF - -fi - #needed for jpeglib - for ac_func in popen wcschr wcsdup mkstemp stat mmap lrand48 rand srand48 srand bcopy bzero time getrusage mallinfo open64 calloc -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed char" >&5 -$as_echo_n "checking size of signed char... " >&6; } -if ${ac_cv_sizeof_signed_char+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed char))" "ac_cv_sizeof_signed_char" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_signed_char" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (signed char) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_signed_char=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_char" >&5 -$as_echo "$ac_cv_sizeof_signed_char" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SIGNED_CHAR $ac_cv_sizeof_signed_char -_ACEOF - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed short" >&5 -$as_echo_n "checking size of signed short... " >&6; } -if ${ac_cv_sizeof_signed_short+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed short))" "ac_cv_sizeof_signed_short" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_signed_short" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (signed short) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_signed_short=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_short" >&5 -$as_echo "$ac_cv_sizeof_signed_short" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SIGNED_SHORT $ac_cv_sizeof_signed_short -_ACEOF - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed" >&5 -$as_echo_n "checking size of signed... " >&6; } -if ${ac_cv_sizeof_signed+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed))" "ac_cv_sizeof_signed" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_signed" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (signed) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_signed=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed" >&5 -$as_echo "$ac_cv_sizeof_signed" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SIGNED $ac_cv_sizeof_signed -_ACEOF - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed long long" >&5 -$as_echo_n "checking size of signed long long... " >&6; } -if ${ac_cv_sizeof_signed_long_long+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed long long))" "ac_cv_sizeof_signed_long_long" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_signed_long_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (signed long long) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_signed_long_long=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_long_long" >&5 -$as_echo "$ac_cv_sizeof_signed_long_long" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SIGNED_LONG_LONG $ac_cv_sizeof_signed_long_long -_ACEOF - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 -$as_echo_n "checking size of void*... " >&6; } -if ${ac_cv_sizeof_voidp+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_voidp" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (void*) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_voidp=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 -$as_echo "$ac_cv_sizeof_voidp" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_VOIDP $ac_cv_sizeof_voidp -_ACEOF - - - - - -# Extract the first word of "freetype-config", so it can be a program name with args. -set dummy freetype-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_FREETYPE_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $FREETYPE_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_dummy=""$PATH:/usr/local/bin:/sw/bin:/opt/local/bin"" -for as_dir in $as_dummy -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG -if test -n "$FREETYPE_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5 -$as_echo "$FREETYPE_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -OLDCPPFLAGS="${CPPFLAGS}" -OLDLIBS="${LIBS}" -if test "x${FREETYPE_CONFIG}" '!=' "x"; then - CPPFLAGS="$CPPFLAGS "`$FREETYPE_CONFIG --cflags` -else if test -d /usr/include/freetype2; then - CPPFLAGS="$CPPFLAGS -I/usr/include/freetype2" -else if test -d /usr/local/include/freetype2; then - CPPFLAGS="$CPPFLAGS -I/usr/local/include/freetype2" -fi -fi -fi - -if test "x${FREETYPE_CONFIG}" '=' "x";then - # if we didn't find the freetype-config program, we won't - # know where the libs are expected to be. So just blindly - # try to link against them. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT_Init_FreeType in -lfreetype" >&5 -$as_echo_n "checking for FT_Init_FreeType in -lfreetype... " >&6; } -if ${ac_cv_lib_freetype_FT_Init_FreeType+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lfreetype $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char FT_Init_FreeType (); -int -main () -{ -return FT_Init_FreeType (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_freetype_FT_Init_FreeType=yes -else - ac_cv_lib_freetype_FT_Init_FreeType=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freetype_FT_Init_FreeType" >&5 -$as_echo "$ac_cv_lib_freetype_FT_Init_FreeType" >&6; } -if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = xyes; then : - HAVE_LIB_FREETYPE=1 -fi - -fi - -for ac_header in ft2build.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "ft2build.h" "ac_cv_header_ft2build_h" "$ac_includes_default" -if test "x$ac_cv_header_ft2build_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_FT2BUILD_H 1 -_ACEOF - HAVE_FT2BUILD_H=1 -fi - -done - -if test "x${HAVE_FT2BUILD_H}" '=' "x";then - for ac_header in freetype/freetype.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "freetype/freetype.h" "ac_cv_header_freetype_freetype_h" "$ac_includes_default" -if test "x$ac_cv_header_freetype_freetype_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_FREETYPE_FREETYPE_H 1 -_ACEOF - HAVE_FREETYPE_FREETYPE_H=1 -fi - -done - -fi - -if test "x${HAVE_LIB_FREETYPE}" '!=' "x" -o \ - "x${FREETYPE_CONFIG}" '!=' "x";then - if test "x${HAVE_FREETYPE_FREETYPE_H}" '!=' "x";then - HAVE_FREETYPE=1 - fi - if test "x${HAVE_FT2BUILD_H}" '!=' "x";then - HAVE_FREETYPE=1 - fi -fi - -if test "x${HAVE_FREETYPE}" = "x1"; then - if test "x${FREETYPE_CONFIG}" '!=' "x"; then - LIBS="$LIBS "`$FREETYPE_CONFIG --libs` - else - LIBS="$LIBS -lfreetype" - fi - - if test "x${HAVE_FT2BUILD_H}" = "x1"; then - HAVE_FT2BUILD_H_DEFINE='#define HAVE_FT2BUILD_H' - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the freetype test program" >&5 -$as_echo_n "checking whether we can compile the freetype test program... " >&6; } - - cat > conftest.c << EOF -$HAVE_FT2BUILD_H_DEFINE - -#ifdef HAVE_FT2BUILD_H -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H -#include FT_SIZES_H -#include FT_SFNT_NAMES_H -#include FT_TRUETYPE_IDS_H -#include FT_OUTLINE_H -#else -#include -#include -#include -#include -#include -#include -#endif - -int main() -{ - FT_Library ftlibrary; - FT_Face face; - FT_Error error; - FT_ULong charcode; - FT_UInt gindex; - FT_Glyph glyph; - FT_BBox bbox; - FT_Matrix matrix; - FT_UInt i; - char* name = 0; - char italic, bold; - - FT_Init_FreeType(&ftlibrary); - FT_New_Face(ftlibrary, "filename", 0, &face); - i = face->num_glyphs - 1; - italic = face->style_flags&FT_STYLE_FLAG_ITALIC; - bold = face->style_flags&FT_STYLE_FLAG_BOLD; - FT_Get_Postscript_Name(face); - FT_Get_Char_Index(face, 33); - FT_Get_First_Char(face, &i); - FT_Get_Next_Char(face, 33, &i); - if(FT_HAS_GLYPH_NAMES(face)) { - FT_Get_Glyph_Name(face, 33, name, 127); - } - FT_Load_Glyph(face, 33, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE); - FT_Get_Glyph(face->glyph, &glyph); - FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_unscaled, &bbox); - FT_Done_Glyph(glyph); - FT_Done_Face(face); - FT_Done_FreeType(ftlibrary); - return 0; -} -EOF - - ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' - if { (eval echo freetype.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -$as_echo "#define HAVE_FREETYPE 1" >>confdefs.h - - -$as_echo "#define HAVE_FREETYPE_FREETYPE_H 1" >>confdefs.h - - -$as_echo "#define USE_FREETYPE 1" >>confdefs.h - # for ttf2tp1 - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - HAVE_FREETYPE=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - rm -f conftest* -fi - -# if the above didn't work out, reset all changes to the compiler variables. -if test "x${HAVE_FREETYPE}" '!=' "x1"; then - CPPFLAGS=$OLDCPPFLAGS - LIBS=$OLDLIBS -fi - - - -OLDCPPFLAGS="${CPPFLAGS}" -OLDLIBS="${LIBS}" - -if test -d /usr/include/fontconfig; then - CPPFLAGS="$CPPFLAGS -I/usr/include/fontconfig" -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FcInit in -lfontconfig" >&5 -$as_echo_n "checking for FcInit in -lfontconfig... " >&6; } -if ${ac_cv_lib_fontconfig_FcInit+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lfontconfig $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char FcInit (); -int -main () -{ -return FcInit (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_fontconfig_FcInit=yes -else - ac_cv_lib_fontconfig_FcInit=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fontconfig_FcInit" >&5 -$as_echo "$ac_cv_lib_fontconfig_FcInit" >&6; } -if test "x$ac_cv_lib_fontconfig_FcInit" = xyes; then : - HAVE_LIB_FONTCONFIG=1 -fi - -for ac_header in fontconfig.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "fontconfig.h" "ac_cv_header_fontconfig_h" "$ac_includes_default" -if test "x$ac_cv_header_fontconfig_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_FONTCONFIG_H 1 -_ACEOF - HAVE_FONTCONFIG_H=1 -fi - -done - - -if test "x${HAVE_LIB_FONTCONFIG}" != "x";then -if test "x${HAVE_FONTCONFIG_H}" != "x";then - HAVE_FONTCONFIG=1 -fi -fi - -if test "x${HAVE_FONTCONFIG}" = "x1"; then - LIBS="$LIBS -lfontconfig" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the fontconfig test program" >&5 -$as_echo_n "checking whether we can compile the fontconfig test program... " >&6; } - -if (echo $LIBS | grep lfreetype >/dev/null 2>&1); then - #move freetype library to the end of libraries, otherwise fontconfig - #won't compile. - LIBS=`echo $LIBS | sed -e 's/-lfreetype//g' -e 's/$/ -lfreetype/'` -fi - -cat > conftest.c << EOF -#include -#include - -int main() -{ - FcPattern *pattern, *match; - FcResult result; - FcChar8 *v; - char*s1="abc",*s2="ABC"; - strcasecmp(s1,s2); - FcInit(); - pattern = FcPatternBuild(0, FC_FAMILY, FcTypeString, "", 0); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); - FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); - - FcConfig*c = FcConfigCreate(); - FcConfigParseAndLoad(c, (FcChar8*)"", 1); - FcConfigBuildFonts(c); - FcConfigSetCurrent(c); - - FcFontSet * set = FcConfigGetFonts(c, FcSetSystem); - FcFontSetDestroy(set); - - FcConfigSubstitute(0, pattern, FcMatchPattern); - FcDefaultSubstitute(pattern); - match = FcFontMatch(0, pattern, &result); - FcPatternGetString(match, "family", 0, &v) == FcResultMatch; - FcPatternGetBool(match, "family", 0, &v) == FcResultMatch; - FcPatternPrint(pattern); - FcPatternDestroy(pattern); - FcPatternDestroy(match); - FcFini(); - return 0; -} -EOF - - ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' - if { (eval echo freetype.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -$as_echo "#define HAVE_FONTCONFIG 1" >>confdefs.h - - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - HAVE_FONTCONFIG=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - rm -f conftest* -fi - -# if the above didn't work out, reset all changes to the compiler variables. -if test "x${HAVE_FONTCONFIG}" "!=" "x1"; then - CPPFLAGS=$OLDCPPFLAGS - LIBS=$OLDLIBS -fi - - - - OLDCPPFLAGS="${CPPFLAGS}" - OLDLIBS="${LIBS}" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftwf_plan_dft_r2c_2d in -lfftw3f" >&5 -$as_echo_n "checking for fftwf_plan_dft_r2c_2d in -lfftw3f... " >&6; } -if ${ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lfftw3f $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char fftwf_plan_dft_r2c_2d (); -int -main () -{ -return fftwf_plan_dft_r2c_2d (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d=yes -else - ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d" >&5 -$as_echo "$ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d" >&6; } -if test "x$ac_cv_lib_fftw3f_fftwf_plan_dft_r2c_2d" = xyes; then : - HAVE_LIBFFTW3=1 -fi - - for ac_header in fftw3.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "fftw3.h" "ac_cv_header_fftw3_h" "$ac_includes_default" -if test "x$ac_cv_header_fftw3_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_FFTW3_H 1 -_ACEOF - HAVE_FFTW3_H=1 -fi - -done - - - if test "x${HAVE_LIBFFTW3}" != "x";then - if test "x${HAVE_FFTW3_H}" != "x";then - HAVE_FFTW3=1 - fi - fi - - if test "x${HAVE_FFTW3}" = "x1"; then - LIBS="$LIBS -lfftw3f" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the fftw3 test program" >&5 -$as_echo_n "checking whether we can compile the fftw3 test program... " >&6; } - - cat > conftest.c << EOF - #include - - int main() - { - char*data = fftw_malloc(sizeof(fftwf_complex)*600*800); - fftwf_plan plan = fftwf_plan_dft_2d(600, 800, (fftwf_complex*)data, (fftwf_complex*)data, FFTW_FORWARD, FFTW_ESTIMATE); - plan = fftwf_plan_dft_r2c_2d(600, 800, (float*)data, (fftwf_complex*)data, FFTW_ESTIMATE); - plan = fftwf_plan_dft_c2r_2d(600, 800, (fftwf_complex*)data, (float*)data, FFTW_ESTIMATE); - fftwf_execute(plan); - fftwf_destroy_plan(plan); - } -EOF - - ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' - if { (eval echo fftw3.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -$as_echo "#define HAVE_FFTW3 1" >>confdefs.h - - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - HAVE_FFTW3=0 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - rm -f conftest* - fi - - # if the above didn't work out, reset all changes to the compiler variables. - if test "x${HAVE_FFTW3}" "!=" "x1"; then - CPPFLAGS=$OLDCPPFLAGS - LIBS=$OLDLIBS - fi - - -# RFX_CHECK_OPENGL -# if test "$HAVE_OPENGL";then -# DEVICE_OPENGL='devices/opengl.$(O)' -# AC_SUBST(DEVICE_OPENGL) -# fi - - -lame_in_source= -lame_makefile= -if test "x${DISABLE_LAME}" = "xtrue"; then - echo "*" Disabling lame support... -else - # old lame code at lib/lame - if test -f lib/lame/Makefile.in; then - lame_in_source='$(lame_objects)' - lame_makefile="lib/lame/Makefile" - CPPFLAGS="$CPPFLAGS -Ilame -Ilib/lame" - -$as_echo "#define HAVE_LAME 1" >>confdefs.h - - else - if test -d /usr/include/lame; then - CPPFLAGS="$CPPFLAGS -I /usr/include/lame" - else - if test -d /usr/local/include/lame; then - CPPFLAGS="$CPPFLAGS -I /usr/local/include/lame" - fi - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lame_init in -lmp3lame" >&5 -$as_echo_n "checking for lame_init in -lmp3lame... " >&6; } -if ${ac_cv_lib_mp3lame_lame_init+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lmp3lame $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char lame_init (); -int -main () -{ -return lame_init (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_mp3lame_lame_init=yes -else - ac_cv_lib_mp3lame_lame_init=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mp3lame_lame_init" >&5 -$as_echo "$ac_cv_lib_mp3lame_lame_init" >&6; } -if test "x$ac_cv_lib_mp3lame_lame_init" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBMP3LAME 1 -_ACEOF - - LIBS="-lmp3lame $LIBS" - -else - NO_LIBMP3LAME=1 -fi - - HASLAMEHEADER= - for ac_header in lame.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "lame.h" "ac_cv_header_lame_h" "$ac_includes_default" -if test "x$ac_cv_header_lame_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LAME_H 1 -_ACEOF - HASLAMEHEADER=1 -fi - -done - - if test "x$NO_LIBMP3LAME" "!=" "x1" -a "x$HASLAMEHEADER" '!=' "x";then - $as_echo "#define HAVE_LAME 1" >>confdefs.h - - fi - fi -fi - - -xpdf_in_source= -splash_in_source= -xpdf_include= - -if test "x$USE_POPPLER" = "xtrue"; then - -$as_echo "#define HAVE_POPPLER 1" >>confdefs.h - - #PKG_CHECK_MODULES([POPPLER],[poppler poppler-splash],,[poppler_pkgconfig=no]) - if test "x$poppler_pkgconfig" = "xno"; then - ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 -$as_echo_n "checking how to run the C++ preprocessor... " >&6; } -if test -z "$CXXCPP"; then - if ${ac_cv_prog_CXXCPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 -$as_echo "$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_cxx_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - -for ac_header in OutputDev.h -do : - ac_fn_cxx_check_header_mongrel "$LINENO" "OutputDev.h" "ac_cv_header_OutputDev_h" "$ac_includes_default" -if test "x$ac_cv_header_OutputDev_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_OUTPUTDEV_H 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lpoppler" >&5 -$as_echo_n "checking for main in -lpoppler... " >&6; } -if ${ac_cv_lib_poppler_main+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpoppler $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - -int -main () -{ -return main (); - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - ac_cv_lib_poppler_main=yes -else - ac_cv_lib_poppler_main=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_poppler_main" >&5 -$as_echo "$ac_cv_lib_poppler_main" >&6; } -if test "x$ac_cv_lib_poppler_main" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBPOPPLER 1 -_ACEOF - - LIBS="-lpoppler $LIBS" - -fi - - -else - as_fn_error $? "No poppler library found. This library is required." "$LINENO" 5 -fi - -done - - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - else - CPPFLAGS="$CPPFLAGS $POPPLER_CFLAGS" - LIBS="$LIBS $POPPLER_LIBS" - $as_echo "#define HAVE_POPPLER 1" >>confdefs.h - - fi -else - splash_in_source='$(splash_objects)' - xpdf_in_source='$(xpdf_objects)' - xpdf_include=' -I xpdf ' -fi - - - - - -# ------------------------------------------------------------------ - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the filesystem normalizes file names" >&5 -$as_echo_n "checking whether the filesystem normalizes file names... " >&6; } - -echo test1 > __abcdefghijklmnopqrstuvwxyz.txt -echo test2 > __ABCDEFGHIJKLMNOPQRSTUVWXYZ.txt -if test `cat __abcdefghijklmnopqrstuvwxyz.txt` = "test2";then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -$as_echo "#define LOWERCASE_UPPERCASE 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - -rm -f __abcdefghijklmnopqrstuvwxyz.txt -rm -f __ABCDEFGHIJKLMNOPQRSTUVWXYZ.txt - - - -for ac_prog in avifile-config -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AVIFILE_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AVIFILE_CONFIG"; then - ac_cv_prog_AVIFILE_CONFIG="$AVIFILE_CONFIG" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AVIFILE_CONFIG="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AVIFILE_CONFIG=$ac_cv_prog_AVIFILE_CONFIG -if test -n "$AVIFILE_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AVIFILE_CONFIG" >&5 -$as_echo "$AVIFILE_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AVIFILE_CONFIG" && break -done - - -if test "x$AVIFILE_CONFIG" '!=' "x";then - OLDCPPFLAGS="$CPPFLAGS" - # temporarily add avifile paths to CPPFLAGS... - CPPFLAGS="$CPPFLAGS $CXXFLAGS "`$AVIFILE_CONFIG --cflags` - for ac_header in avifile/version.h version.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - # ... and reset - CPPFLAGS="$OLDCPPFLAGS" -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the avifile test program" >&5 -$as_echo_n "checking whether we can compile the avifile test program... " >&6; } - -if test "x${ac_cv_header_version_h}" '=' "xyes";then - HAVE_VERSION_H_DEFINE='#define HAVE_VERSION_H' -fi -if test "x${ac_cv_header_avifile_version_h}" '=' "xyes";then - HAVE_AVIFILE_VERSION_H_DEFINE='#define HAVE_AVIFILE_VERSION_H' -fi - -cat > conftest.cpp << EOF - -// hack- we can't yet access the variables in config.h (because it hasn't been generated yet), -// so we have to introduce them this way -$HAVE_VERSION_H_DEFINE -$HAVE_AVIFILE_VERSION_H_DEFINE - -#ifdef HAVE_VERSION_H - #include -#endif -#ifdef HAVE_AVIFILE_VERSION_H - #include -#endif - -#if (AVIFILE_MAJOR_VERSION == 0) && (AVIFILE_MINOR_VERSION>=6) - #include - #include - #include - #include - #include - #define VERSION6 -#else - #include - #include - #include - #define Width width - #define Height height - #define Data data - #define Bpp bpp -#endif - -void test() -{ - IAviReadFile* player; - IAviReadStream* astream; - IAviReadStream* vstream; - player = CreateIAviReadFile(0); - astream = player->GetStream(0, AviStream::Audio); - vstream = player->GetStream(0, AviStream::Video); - vstream -> StartStreaming(); - astream -> StartStreaming(); -#ifndef VERSION6 - MainAVIHeader head; - player->GetFileHeader(&head); - head.dwMicroSecPerFrame; - head.dwTotalFrames; - head.dwStreams; - head.dwWidth; - head.dwHeight; - head.dwMicroSecPerFrame; - astream->GetEndPos(), - astream->GetEndTime()); - player->StreamCount(); -#else - StreamInfo*audioinfo; - StreamInfo*videoinfo; - audioinfo = astream->GetStreamInfo(); - videoinfo = vstream->GetStreamInfo(); - videoinfo->GetVideoWidth(); - videoinfo->GetVideoHeight(); - audioinfo->GetAudioSamplesPerSec(); - videoinfo->GetFps(); -#endif - CImage*img = vstream->GetFrame(); - img->ToRGB(); - img->Data(); - img->Bpp(); - img->Width(); - img->Height(); - WAVEFORMATEX wave; - astream->GetAudioFormatInfo(&wave,0); - uint_t a,b; - astream->ReadFrames(0,0,0,a,b); -} -int main (int argc, char*argv) -{ - return 0; -} -EOF - -if test "x$AVIFILE_CONFIG" '!=' "x";then - AVIFILE_LIBS=`$AVIFILE_CONFIG --libs` - AVIFILE_CFLAGS=`$AVIFILE_CONFIG --cflags` - avifile_link='$CXX $CPPFLAGS $CXXFLAGS $AVIFILE_CFLAGS conftest.cpp $AVIFILE_LIBS -o conftest${ac_exeext}' - if { (eval echo avi2swf.m4:71: \"$avifile_link\") 1>&5; (eval $avifile_link) 2>&5; } && test -s conftest${ac_exeext} && ./conftest${ac_exeext}; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - AVIFILE=true - export AVIFILE - -$as_echo "#define AVIFILE true" >>confdefs.h - - else - echo "configure: failed program was:" >&5 - cat conftest.cpp >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -rm -f conftest* - -if test "x${AVIFILE}" = "xtrue"; then - VIDEO_LIBS="$VIDEO_LIBS $AVIFILE_LIBS" - VIDEO_CFLAGS="$VIDEO_CFLAGS $AVIFILE_CFLAGS" - -$as_echo "#define HAVE_AVIFILE 1" >>confdefs.h - -fi - -if test "x${WIN32}" != "x"; then - #AC_CHECK_LIB(avifil32, AVIFileInit,AVIFIL32=true) - #if test "x${AVIFIL32}" != "x"; then - # VIDEO_LIBS="$VIDEO_LIBS -lavifil32" - #fi - VIDEO_LIBS="$VIDEO_LIBS -lavifil32" - AVIFIL32=true -fi - - - -# ------------------------------------------------------------------ - -if test "x${UNCOMPRESS}" = "xgzip"; then - -$as_echo "#define USE_GZIP 1" >>confdefs.h - -fi - - -# ------------------------------------------------------------------ - - -# Extract the first word of "ruby", so it can be a program name with args. -set dummy ruby; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_RUBY+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $RUBY in - [\\/]* | ?:[\\/]*) - ac_cv_path_RUBY="$RUBY" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_RUBY="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -RUBY=$ac_cv_path_RUBY -if test -n "$RUBY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBY" >&5 -$as_echo "$RUBY" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -RUBY_CPPFLAGS="" -RUBY_LDFLAGS="" -RUBY_LIBS="" - -rubylib=ruby18 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ruby's include directory" >&5 -$as_echo_n "checking for ruby's include directory... " >&6; } -if test "x$RUBY" '!=' "x";then - rubyinc=`$RUBY -e 'require "rbconfig";puts Config::expand(Config::CONFIG.send("\x5b\x5d", "archdir"))' 2>/dev/null` - if test -d $rubyinc;then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rubyinc" >&5 -$as_echo "$rubyinc" >&6; } - - # If we got a sensible archdir, we also ask ruby to supply us with CPPFLAGS - # and LDFLAGS. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ruby's cpp flags" >&5 -$as_echo_n "checking for ruby's cpp flags... " >&6; } - rubycpp=`$RUBY -e 'require "rbconfig";puts Config::expand(Config::CONFIG.send("\x5b\x5d", "CPPFLAGS"))' 2>/dev/null` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rubycpp" >&5 -$as_echo "$rubycpp" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ruby's ld flags" >&5 -$as_echo_n "checking for ruby's ld flags... " >&6; } - rubyld=`$RUBY -e 'require "rbconfig";puts Config::expand(Config::CONFIG.send("\x5b\x5d", "LIBRUBYARG_SHARED"))' 2>/dev/null` - rubyld2=`$RUBY -e 'require "rbconfig";v=Config::expand(Config::CONFIG.send("\x5b\x5d", "LIBRUBY_LDSHARED"));puts v.gsub(/^g?cc/,"")' 2>/dev/null` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$rubyld $rubyld2\"" >&5 -$as_echo "\"$rubyld $rubyld2\"" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ruby library name" >&5 -$as_echo_n "checking for ruby library name... " >&6; } - rubylib=`$RUBY -e 'require "rbconfig";puts Config::expand(Config::CONFIG.send("\x5b\x5d", "RUBY_SO_NAME"))' 2>/dev/null` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rubylib" >&5 -$as_echo "$rubylib" >&6; } - - RUBY_CPPFLAGS="$rubycpp -I$rubyinc $RUBY_CPPFLAGS" - RUBY_LDFLAGS="$rubyld $rubyld2 $RUBY_LDFLAGS" - RUBY_INSTALLDIR="$rubyinc" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: 'unknown'" >&5 -$as_echo "'unknown'" >&6; } - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: 'unknown'" >&5 -$as_echo "'unknown'" >&6; } -fi - -#OLDLDFLAGS="$LDFLAGS" -#LDFLAGS="$LDFLAGS $RUBY_LDFLAGS" -#AC_CHECK_LIB($rubylib, rb_define_method, HAVE_RUBY_LIB=1,) -#LDFLAGS="$OLDLDFLAGS" - -OLDCPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CPPFLAGS $RUBY_CPPFLAGS" -for ac_header in ruby.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "ruby.h" "ac_cv_header_ruby_h" "$ac_includes_default" -if test "x$ac_cv_header_ruby_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_RUBY_H 1 -_ACEOF - HAVE_RUBY_H=1 -fi - -done - -CPPFLAGS="$OLDCPPFLAGS" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we should compile the ruby module" >&5 -$as_echo_n "checking whether we should compile the ruby module... " >&6; } -if test "x${HAVE_RUBY_H}" '!=' "x";then - #RUBY_LIBS="$RUBY_LIBS -l$rubylib" - - cat > conftest.c << EOF -#include -static VALUE foobar; -VALUE foobar_set_foo(VALUE module, VALUE _key, VALUE _value) -{ - return Qnil; -} -int Init_foobar() -{ - foobar = rb_define_module("foobar"); - rb_define_module_function(foobar, "set_foo", foobar_set_foo, 2); - return 0; -} -int main() {return 0;} -EOF - ac_link='$CC $SHARED $CPPFLAGS $RUBY_CPPFLAGS $CFLAGS conftest.c $LDFLAGS $RUBY_LDFLAGS $LIBS $RUBY_LIBS -o conftest${SLEXT}' - if { (eval echo ruby.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${SLEXT}; then - RUBY_OK=yes - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - fi - rm -f conftest* -fi - -if test "x${RUBY_OK}" '=' "xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - - - - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - RUBY_CPPFLAGS="" - RUBY_LDFLAGS="" - RUBY_LIBS="" - RUBY_INSTALLDIR="" -fi - - -if test "x$RUBY_OK" '!=' "xyes";then - if test -d "lib/ruby/";then - echo all install uninstall clean: > lib/ruby/Makefile - fi - # fail silently- the most users won't have any need for the - # ruby interface anyway -else - if test -f "lib/ruby/Makefile.in";then - rubygfx="lib/ruby/Makefile" - fi -fi - -# ------------------------------------------------------------------ - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for missing libraries" >&5 -$as_echo_n "checking for missing libraries... " >&6; } - -if test "x$ZLIBMISSING" = "xtrue";then - MISSINGLIBS="${MISSINGLIBS} zlib" - DISABLEPNG2SWF=true - PARTIAL=true -fi -if test "x$JPEGLIBMISSING" = "xtrue";then - MISSINGLIBS="${MISSINGLIBS} jpeglib" - DISABLEPDF2SWF=true - DISABLEJPEG2SWF=true - PARTIAL=true -fi -if test "x$PDFLIBMISSING" = "xtrue";then - DISABLEPDF2PDF=true; -fi -#if test "x$T1LIBMISSING" = "xtrue";then -# MISSINGLIBS="${MISSINGLIBS} t1lib" -#fi -if test "x$UNGIFMISSING" = "xtrue";then - DISABLEGIF2SWF=true - MISSINGLIBS="${MISSINGLIBS} ungif" - PARTIAL=true -fi - -if test "x${ac_cv_header_pdflib_h}" '!=' "xyes";then - DISABLEPDF2PDF=true; -fi -if test "x${ac_cv_header_jpeglib_h}" '!=' "xyes"; then - DISABLEPDF2SWF=true; - DISABLEJPEG2SWF=true; - MISSINGLIBS="${MISSINGLIBS} jpeglib.h" - PARTIAL=true -fi -if test "x$HAVE_FREETYPE" '!=' "x1"; then - DISABLEPDF2SWF=true; - MISSINGLIBS="${MISSINGLIBS} freetype" - PARTIAL=true -fi -#if test "x${ac_cv_header_t1lib_h}" '!=' "xyes"; then -# MISSINGLIBS="${MISSINGLIBS} t1lib.h" -#fi -if test "x${ac_cv_header_gif_lib_h}" '!=' "xyes"; then - DISABLEGIF2SWF=true - MISSINGLIBS="${MISSINGLIBS} gif_lib.h" - PARTIAL=true -fi -if test "x${ac_cv_header_zlib_h}" '!=' "xyes"; then - DISABLEPNG2SWF=true; - MISSINGLIBS="${MISSINGLIBS} zlib.h" - PARTIAL=true -fi -#if test "x${AVIFILE}" '!=' "xtrue" -a "x${AVIFIL32}" '!=' "xtrue"; then -# MISSINGLIBS="${MISSINGLIBS} avifile" -#fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${MISSINGLIBS}" >&5 -$as_echo "${MISSINGLIBS}" >&6; } - -# ------------------------------------------------------------------ - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python version" >&5 -$as_echo_n "checking for Python version... " >&6; } - -if test "x$PYTHON_LIB" '!=' "x" -a "x$PYTHON_INCLUDES" '!=' "x";then - # you can override the python detection by putting PYTHON_LIB - # and PYTHON_INCLUDES into the environment - case "$PYTHON_INCLUDES" in - *python2.4*) PY_VERSION=2.4 - ;; - *python2.5*) PY_VERSION=2.5 - ;; - *python2.6*) PY_VERSION=2.6 - ;; - *python2.7*) PY_VERSION=2.7 - ;; - *python3.0*) PY_VERSION=3.0 - ;; - *python3.1*) PY_VERSION=3.1 - ;; - *python3.2*) PY_VERSION=3.2 - ;; - *python3.3*) PY_VERSION=3.3 - ;; - *) PY_VERSION=unknown - ;; - esac -else - if test "x$PYTHON_LIB" '!=' "x" -o "x$PYTHON_INCLUDES" '!=' "x";then - echo "Set both PYTHON_LIB and PYTHON_INCLUDES, or none at all" - fi - # iterate through version 2.4 to 3.3 - VERSIONS="2.4 2.5 2.6 2.7 3.0 3.1 3.2 3.3" - case "$PYTHON" in - 2*) VERSIONS="2.4 2.5 2.6 2.7 $PYTHON" - ;; - 3*) VERSIONS="3.0 3.1 3.2 3.3 $PYTHON" - ;; - esac - for v in $VERSIONS; do - # Linux - if test -f "/usr/include/python$v/Python.h";then - PY_VERSION=$v - PYTHON_LIB="-lpython$PY_VERSION" - if test -f "/usr/lib/python$v/site-packages/PIL/_imaging.so";then - PYTHON_LIB2="$PYTHON_LIB /usr/lib/python$v/site-packages/PIL/_imaging.so" - HAVE_PYTHON_IMAGING_LIB=1 - else - PYTHON_LIB2="$PYTHON_LIB" - fi - PYTHON_INCLUDES="-I/usr/include/python$PY_VERSION" - # Mac OS X - elif test -f "/Library/Frameworks/Python.framework/Versions/$v/include/python$v/Python.h";then - PY_VERSION=$v - PYTHON_LIB="-framework Python" - if test -f "/Library/Frameworks/Python.framework/Versions/$v/site-packages/PIL/_imaging.so";then - PYTHON_LIB2="$PYTHON_LIB /Library/Python/$v/PIL/_imaging.so" - HAVE_PYTHON_IMAGING_LIB=1 - else - PYTHON_LIB2="$PYTHON_LIB" - fi - PYTHON_INCLUDES="-I/Library/Frameworks/Python.framework/Versions/$v/include/python$v/" - # Mac OS X [Fink]: - elif test "(" -f "/sw/lib/python$v/config/libpython$v.dylib" \ - -o -f "/sw/lib/python$v/config/libpython$v.a" \ - -o -f "/sw/lib/python$v/config/libpython$v.so" \ - ")" \ - -a -f "/sw/include/python$v/Python.h"; then - PY_VERSION=$v - PYTHON_LIB="-L /sw/lib/python$v/config/ -lpython$PY_VERSION /sw/lib/python$v/site-packages/PIL/_imaging.so" - if test -f "/sw/lib/python$v/site-packages/PIL/_imaging.so";then - PYTHON_LIB2="$PYTHON_LIB /sw/lib/python$v/site-packages/PIL/_imaging.so" - HAVE_PYTHON_IMAGING_LIB=1 - else - PYTHON_LIB2="$PYTHON_LIB" - fi - PYTHON_INCLUDES="-I /sw/include/python$v/" - fi - done -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY_VERSION" >&5 -$as_echo "$PY_VERSION" >&6; } - -if test "x$PY_VERSION" "!=" "x"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python executable" >&5 -$as_echo_n "checking for Python executable... " >&6; } - if python$PY_VERSION -V 2>&5;then - PYTHON_EXECUTABLE=python$PY_VERSION - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXECUTABLE" >&5 -$as_echo "$PYTHON_EXECUTABLE" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } - fi -fi - -if test "x$PY_VERSION" "!=" "x" -a "x$PYTHON_EXECUTABLE" "!=" "x"; then - export PYTHON_INCLUDES PYTHON_LIB - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the Python test program" >&5 -$as_echo_n "checking whether we can compile the Python test program... " >&6; } - - cat > conftest.c << EOF -# include - - int main() - { - int ret; - ret = Py_Main(0, 0); - int x; // check also for gcc 2.95.x incompatibilities - return ret; - } -EOF - - ac_link='$CC $CPPFLAGS $CFLAGS $PYTHON_INCLUDES conftest.c $LDFLAGS $PYTHON_LIB $LIBS -o conftest${ac_exeext}' - if { (eval echo python.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - PYTHON_OK=yes - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - rm -f conftest* - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python install path" >&5 -$as_echo_n "checking for Python install path... " >&6; } -cat > _pypath.py << EOF -import distutils -import distutils.sysconfig -import sys -sys.stdout.write(distutils.sysconfig.get_python_lib(plat_specific=0,standard_lib=0)) -EOF - echo $PYTHON_EXECUTABLE _pypath.py 1>&5 - if $PYTHON_EXECUTABLE _pypath.py >_pypath.txt 2>&5;then - PYTHON_INSTALL_PATH=`cat _pypath.txt` - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_INSTALL_PATH" >&5 -$as_echo "$PYTHON_INSTALL_PATH" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } - fi - #rm -f _pypath.txt _pypath.py - - if test "x$PYTHON_OK" = "xyes";then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python-Imaging" >&5 -$as_echo_n "checking for Python-Imaging... " >&6; } - cat > conftest.c << EOF -# include -# include - - int main() - { - Py_Main(0, 0); - return 0; - } -EOF - if test "$HAVE_PYTHON_IMAGING_LIB"; then - ac_link='$CC $CPPFLAGS $CFLAGS $PYTHON_INCLUDES conftest.c $LDFLAGS ${PYTHON_LIB2} $LIBS -o conftest${ac_exeext}' - if { (eval echo python.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - PYTHON_LIB="${PYTHON_LIB2}" - -$as_echo "#define HAVE_PYTHON_IMAGING 1" >>confdefs.h - - HAVE_PYTHON_IMAGING=yes - export HAVE_PYTHON_IMAGING - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - else - echo "(didn't find the Python-Imaging libraries)" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - fi - rm -f conftest* -fi - - -if test "x$PYTHON_OK" '!=' "xyes" -o "$DISABLEPDF2SWF";then - echo all install uninstall clean: > lib/python/Makefile - # fail silently- the most users won't have any need for the - # python interface anyway -else - pythongfx="lib/python/Makefile" -fi - -# ------------------------------------------------------------------ - -if test "x${MISSINGLIBS}" '!=' "x"; then - echo "***************************************************" - echo "* The following headers/libraries are missing: " ${MISSINGLIBS} -fi - -avi2swf="avi2swf/Makefile" -if test "x${AVIFILE}" '!=' "xtrue" -a "x${AVIFIL32}" '!=' "xtrue"; then - #don't whine, avi2swf is outdated anyway - #echo "* Disabling avi2swf tool..." - echo all install uninstall clean: > avi2swf/Makefile - avi2swf= -fi - -pdf2swf_makefile="lib/pdf/Makefile" -PDF2SWF='pdf2swf$(E)' -LIBPDF='libpdf$(A)' - -if test "x${DISABLEPDF2SWF}" = "xtrue"; then - echo "* Disabling pdf2swf tool..." - rm -f lib/pdf/Makefile - echo all install uninstall clean libpdf libgfxpdf: > lib/pdf/Makefile - pdf2swf_makefile="" - PDF2SWF= - LIBPDF= -fi - - - -PDF2PDF='pdf2pdf$(E)' -DEVICE_PDF='devices/pdf.$(O)' -if test "x${DISABLEPDF2PDF}" = "xtrue"; then - #echo "* Disabling pdf2pdf tool..." - PDF2PDF= - DEVICE_PDF= -fi - - - -if test "x${ZLIBMISSING}" = "xtrue"; then - echo - echo "* Warning! Without zlib, you will not be able to read" - echo "* or write compressed Flash MX files!" -fi - -JPEG2SWF='jpeg2swf$(E)' -if test "x${DISABLEJPEG2SWF}" = "xtrue"; then - echo "* Disabling jpeg2swf tool..." - JPEG2SWF= -fi -export JPEG2SWF - - -GIF2SWF='gif2swf$(E)' -if test "x${DISABLEGIF2SWF}" = "xtrue"; then - echo "* Disabling gif2swf tool..." - GIF2SWF= -fi -export GIF2SWF - - -PNG2SWF='png2swf$(E)' -if test "x${DISABLEPNG2SWF}" = "xtrue"; then - echo "* Disabling png2swf tool..." - PNG2SWF= -fi -export PNG2SWF - - -if test "x${MISSINGLIBS}" '!=' "x"; then - if test "x${PARTIAL}" '=' "x"; then - echo "* (never mind)" - fi - echo "***************************************************" -fi - -# ------------------------------------------------------------------ - - - - - -if test -f "release.in"; then release_in="./release"; fi -if test -f "Makefile.new.in"; then mk_in="./Makefile.new"; fi -FILES="$release_in $mk_in Makefile.common ${avi2swf} Makefile lib/Makefile lib/action/Makefile src/Makefile ${pdf2swf_makefile} swfs/Makefile ${pythongfx} ${rubygfx} ${lame_makefile} lib/readers/Makefile" -ac_config_files="$ac_config_files ${FILES}" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -p' - fi -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by $as_me, which was -generated by GNU Autoconf 2.68. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Report bugs to the package provider." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -config.status -configured by $0, generated by GNU Autoconf 2.68, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2010 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "${FILES}") CONFIG_FILES="$CONFIG_FILES ${FILES}" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' >$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi - ;; - - - esac - -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - - - -# -# On development trees, create snapshots of config.status -# -if test -f snapshot -a "x$CHECKMEM" = "x" -a "x$PROFILING" = "x";then - if test "x${MINGW}" = "xyes"; then - echo cp config.status config.status.win32 - cp config.status config.status.win32 - else - if test "x$DEBUG" '=' "x" -a "x$OPTIMIZE" '=' "x";then - echo cp config.status config.status.linux - cp config.status config.status.linux - fi - if test "x$DEBUG" '!=' "x" -a "x$OPTIMIZE" '=' "x";then - echo cp config.status config.status.debug - cp config.status config.status.debug - fi - if test "x$DEBUG" = "x" -a "x$OPTIMIZE" '!=' "x"; then - echo cp config.status config.status.optimize - cp config.status config.status.optimize - fi - fi -fi diff --git a/fluidbook/tools/swftools-special-swfdump/configure.in b/fluidbook/tools/swftools-special-swfdump/configure.in deleted file mode 100644 index c0737510f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/configure.in +++ /dev/null @@ -1,631 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. - -dnl old autoconf -AC_INIT(src/) - -dnl new autoconf -dnl AC_INIT -dnl AC_CONFIG_SRCDIR([src/]) - -# ------------------- option parsing ------------------------------- - -DEBUG= -CHECKMEM= -PROFILING= -ENABLE_WARNINGS= -OPTIMIZE= -USE_POPPLER= -DISABLE_LAME= - -AC_ARG_ENABLE(checkmem, -[ --enable-checkmem turn on ccmalloc debugging], CHECKMEM=true) -AC_ARG_ENABLE(debug, -[ --enable-debug turn on debugging], DEBUG=true) -AC_ARG_ENABLE(profiling, -[ --enable-profiling turn on profiling], PROFILING=true) -AC_ARG_ENABLE(warnings, -[ --enable-warnings turn on compiler warnings], ENABLE_WARNINGS=true) -AC_ARG_ENABLE(optimizations, -[ --enable-optimizations turn on compiler optimizations (recommended for avi2swf)], OPTIMIZE=true) -AC_ARG_ENABLE(poppler, -[ --enable-poppler link againist libpoppler], USE_POPPLER=true) -AC_ARG_ENABLE(lame, -[ --disable-lame "don't compile any L.A.M.E. mp3 encoding code in"], - -if test "x$enable_lame" = "xno";then - DISABLE_LAME=yes -fi,DISABLE_LAME=) - -PACKAGE=swftools -VERSION=2011-01-23-1815 - -# ------------------------------------------------------------------ - -if test "x${srcdir}" != "x."; then - echo "--srcdir is not supported" - exit 1 -fi - -WARNINGS="-Wimplicit -Wreturn-type -Wno-write-strings -Wformat" -if test "x$ENABLE_WARNINGS" '!=' "x";then - WARNINGS="-Wall -Wno-unused -Wno-format -Wno-redundant-decls -Wno-write-strings -D_FORTIFY_SOURCE=2 " -fi - -if test "x$CHECKMEM" '!=' "x";then - DEBUG=yes -fi -if test "x$PROFILING" '!=' "x";then - DEBUG=yes -fi -if test "x$DEBUG" '!=' "x";then - if test "x$PROFILING" = "x";then - CFLAGS="$WARNINGS -O2 -g $CFLAGS" - CXXFLAGS="$WARNINGS -O2 -g $CXXFLAGS" - LDFLAGS="-g $LDFLAGS" - else - CFLAGS="$WARNINGS -O2 -g -pg $CFLAGS" - CXXFLAGS="$WARNINGS -O2 -g -pg $CXXFLAGS" - LDFLAGS="-g -pg $LDFLAGS" - fi -else if test "x$OPTIMIZE" '!=' "x"; then - CFLAGS="$WARNINGS -O3 -fomit-frame-pointer -Winline $CFLAGS" - CXXFLAGS="$WARNINGS -O3 -fomit-frame-pointer -Winline $CXXFLAGS" -else - CFLAGS="$WARNINGS -O -fomit-frame-pointer $CFLAGS" - CXXFLAGS="$WARNINGS -O -fomit-frame-pointer $CXXFLAGS" -fi -fi - -CFLAGS="-fPIC $CFLAGS" -CXXFLAGS="-fPIC $CFLAGS" - -#OLDGCC=1 -#if test "x$OLDGCC" '!=' "x";then -# #CFLAGS="$CFLAGS --std=c89 -ansi -pendantic" -# #CXXFLAGS="$CXXFLAGS --std=c89 -ansi -pendantic" -# CFLAGS="$CFLAGS -ansi -pendantic" -# CXXFLAGS="$CXXFLAGS -ansi -pendantic" -#fi - -export PACKAGE VERSION CFLAGS CXXFLAGS - -dnl Checks for programs. - -AC_CANONICAL_HOST - -SLEXT="so" -SHARED="-shared" -MACOSX= -case $host_os in - *darwin* ) - MACOSX=yes - CFLAGS="$CFLAGS" - CXXFLAGS="$CXXFLAGS -fno-rtti" - SHARED="-bundle" - SLEXT="bundle" - if test -d /opt/local/include && test -d /opt/local/lib; then - CPPFLAGS="${CPPFLAGS} -I/opt/local/include" - LDFLAGS="${LDFLAGS} -L/opt/local/lib" - fi - # Use fink packages if available. - #if test -d /sw/include && test -d /sw/lib; then - # CPPFLAGS="${CPPFLAGS} -I/sw/include" - # LDFLAGS="${LDFLAGS} -L/sw/lib" - #fi - ;; -esac - -AC_SUBST(SHARED) - -dnl Checks for programs. - AC_PROG_CC - AC_PROG_CXX - - -RFX_CHECK_OLDGCC - -if test "x$GCC_IS_OK" '=' "x";then - echo "***************************************************" - echo "* Your gcc is too old to compile this!" - echo "* " - echo "* The last version compileable by this compiler is " - echo "* swftools 0.7.0, which you can download from " - echo "* http://www.swftools.org/swftools-0.7.0.tar.gz " - echo "* ." - echo "* Newer versions require at least gcc 3.0.0 " - echo "***************************************************" - exit 1 -fi - -if test "x$CHECKMEM" '!=' "x";then - CC="ccmalloc $CC" - CXX="ccmalloc $CXX" - #echo running again - #unset ac_cv_prog_CC - #unset ac_cv_prog_CXX - #AC_PROG_CC - #AC_PROG_CXX -fi - AC_PROG_CPP - - AC_PROG_RANLIB - AC_PROG_MAKE_SET - AC_PROG_INSTALL - AC_PROG_LN_S - AC_CHECK_PROGS(UNCOMPRESS, gzip uncompress compress, ) - -dnl PKG_PROG_PKG_CONFIG - -dnl Checks for system services -OBJEXT="o" -AREXT=".a" -CXXLIBS="-lstdc++" - -AC_EXEEXT - -if test "x$EXEEXT" = "x.exe";then - OBJEXT="obj" - AREXT=".lib" - CXXLIBS="" -fi -AC_SUBST(OBJEXT) -AC_SUBST(AREXT) - -RFX_CHECK_MING - -if test "x${MINGW}" != "xyes"; then - # no mingW - AC_DEFINE([O_BINARY], [0], [Not defined on mingw]) -else - # mingW - SLEXT="dll" - CXXLIBS="" -fi -export SLEXT -AC_SUBST(SLEXT) -AC_SUBST(CXXLIBS) - -# The following tries to make use of includes and libraries in -# /usr/local, too. Notice: A -I/usr/local/include might break -# things (MingW, cross-compiling etc.) in the same way as -I/usr/include, -# especially on systems which link /usr/local to /usr, so it has yet -# to be seen how useful this is. -if test -d /usr/local/lib; then - LDFLAGS="$LDFLAGS -L/usr/local/lib" -fi -if test -d /usr/local/include; then -# Leave that alone. It's causing trouble e.g. with gcc 3.2 on gentoo. -# CPPFLAGS="$CPPFLAGS -I/usr/local/include" - echo > /dev/null -fi -if test "$prefix" != "NONE" -a "$prefix" != "/usr/local" -a "$prefix" != "/usr/local/"; then - # if the user has a special prefix (like /opt), there might also be $prefix/lib - # and $prefix/include, which should be included in our search paths for libraries - # and includes. - LDFLAGS="$LDFLAGS -L${libdir}" - CPPFLAGS="$CPPFLAGS -I${includedir}" - # TODO- test whether gcc still works after this -fi - -#Mac OS: -#LDFLAGS "-L/sw/lib" ; CPPFLAGS "-I/sw/include -I/sw/include/lame" - - -# this must be done after (I believe) AC_PROG_MAKE_SET -if test "x$DEBUG" '!=' "x" -o "x$STRIP" = "x";then - if test "$MACOSX";then - STRIP=dsymutil - else - STRIP="@echo debug enabled, not stripping " - fi - export STRIP - AC_SUBST(STRIP) -fi - -dnl Checks for libraries. - AC_CHECK_LIB(m, sin,, - echo "Error: Math library not found."; - exit; - ) - AC_CHECK_LIB(z, deflate,, ZLIBMISSING=true) - -if test "x$ZLIBMISSING" = "xtrue";then - echo - echo "ERROR:" - echo "You need zlib to compile swftools" - echo - exit -fi - -AC_CHECK_LIB(pdf, PDF_open_file,, PDFLIBMISSING=true) -AC_CHECK_LIB(jpeg, jpeg_write_raw_data,, JPEGLIBMISSING=true) -AC_CHECK_LIB(ungif, DGifOpen,, UNGIFMISSING=true) -if test "$UNGIFMISSING";then - UNGIFMISSING= - AC_CHECK_LIB(gif, DGifOpen,, UNGIFMISSING=true) -fi -AC_CHECK_LIB(zzip, zzip_file_open,, ZZIPMISSING=true) - -RFX_CHECK_BYTEORDER -AC_SUBST(WORDS_BIGENDIAN) -RFX_CHECK_SYSTEM_BACKTICKS -AC_SUBST(SYSTEM_BACKTICKS) - -AC_ARG_PROGRAM - -dnl Checks for header files. - AC_CONFIG_HEADER(config.h) - AC_HEADER_DIRENT - AC_HEADER_STDC - - AC_CHECK_HEADERS(zlib.h gif_lib.h io.h wchar.h jpeglib.h assert.h signal.h pthread.h sys/stat.h sys/mman.h sys/types.h dirent.h sys/bsdtypes.h sys/ndir.h sys/dir.h ndir.h time.h sys/time.h sys/resource.h pdflib.h zzip/lib.h) - -AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) -AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package]) -AC_SUBST(PACKAGE) -AC_SUBST(VERSION) - -AC_SUBST(HAVE_UNISTD_H) -AC_SUBST(EXEEXT) - -dnl Checks for typedefs, structures, and compiler characteristics. - AC_C_CONST - AC_C_INLINE - AC_TYPE_OFF_T - AC_TYPE_SIZE_T - AC_STRUCT_TM - AC_CHECK_TYPE(boolean,int) #needed for jpeglib - AC_CHECK_FUNCS(popen wcschr wcsdup mkstemp stat mmap lrand48 rand srand48 srand bcopy bzero time getrusage mallinfo open64 calloc) - -AC_CHECK_SIZEOF([signed char]) -AC_CHECK_SIZEOF([signed short]) -AC_CHECK_SIZEOF([signed]) -AC_CHECK_SIZEOF([signed long long]) -AC_CHECK_SIZEOF([void*]) - -RFX_CHECK_FREETYPE - -RFX_CHECK_FONTCONFIG - -RFX_CHECK_FFTW - -# RFX_CHECK_OPENGL -# if test "$HAVE_OPENGL";then -# DEVICE_OPENGL='devices/opengl.$(O)' -# AC_SUBST(DEVICE_OPENGL) -# fi -AC_SUBST(DEVICE_OPENGL) - -lame_in_source= -lame_makefile= -if test "x${DISABLE_LAME}" = "xtrue"; then - echo "*" Disabling lame support... -else - # old lame code at lib/lame - if test -f lib/lame/Makefile.in; then - lame_in_source='$(lame_objects)' - lame_makefile="lib/lame/Makefile" - CPPFLAGS="$CPPFLAGS -Ilame -Ilib/lame" - AC_DEFINE([HAVE_LAME], [1], [have/use internal l.a.m.e. mp3 library]) - else - if test -d /usr/include/lame; then - CPPFLAGS="$CPPFLAGS -I /usr/include/lame" - else - if test -d /usr/local/include/lame; then - CPPFLAGS="$CPPFLAGS -I /usr/local/include/lame" - fi - fi - AC_CHECK_LIB(mp3lame, lame_init,, NO_LIBMP3LAME=1) - HASLAMEHEADER= - AC_CHECK_HEADERS(lame.h,HASLAMEHEADER=1) - if test "x$NO_LIBMP3LAME" "!=" "x1" -a "x$HASLAMEHEADER" '!=' "x";then - AC_DEFINE([HAVE_LAME], [1]) - fi - fi -fi -AC_SUBST(lame_in_source) - -xpdf_in_source= -splash_in_source= -xpdf_include= - -if test "x$USE_POPPLER" = "xtrue"; then - AC_DEFINE([HAVE_POPPLER],[1],[use poppler]) - #PKG_CHECK_MODULES([POPPLER],[poppler poppler-splash],,[poppler_pkgconfig=no]) - if test "x$poppler_pkgconfig" = "xno"; then - AC_LANG_PUSH([C++]) - AC_CHECK_HEADERS([OutputDev.h],[ - AC_CHECK_LIB([poppler],[main],,[]) - ],[AC_MSG_ERROR([No poppler library found. This library is required.])]) - AC_LANG_POP - else - CPPFLAGS="$CPPFLAGS $POPPLER_CFLAGS" - LIBS="$LIBS $POPPLER_LIBS" - AC_DEFINE([HAVE_POPPLER], [1]) - fi -else - splash_in_source='$(splash_objects)' - xpdf_in_source='$(xpdf_objects)' - xpdf_include=' -I xpdf ' -fi - -AC_SUBST([xpdf_in_source]) -AC_SUBST([splash_in_source]) -AC_SUBST([xpdf_include]) - -# ------------------------------------------------------------------ - -RFX_CHECK_LOWERCASE_UPPERCASE -RFX_CHECK_AVI2SWF -if test "x${AVIFILE}" = "xtrue"; then - VIDEO_LIBS="$VIDEO_LIBS $AVIFILE_LIBS" - VIDEO_CFLAGS="$VIDEO_CFLAGS $AVIFILE_CFLAGS" - AC_DEFINE([HAVE_AVIFILE], [1], [Define if avifile is present]) -fi - -if test "x${WIN32}" != "x"; then - #AC_CHECK_LIB(avifil32, AVIFileInit,AVIFIL32=true) - #if test "x${AVIFIL32}" != "x"; then - # VIDEO_LIBS="$VIDEO_LIBS -lavifil32" - #fi - VIDEO_LIBS="$VIDEO_LIBS -lavifil32" - AVIFIL32=true -fi - -AC_SUBST(VIDEO_LIBS) -AC_SUBST(VIDEO_CFLAGS) -# ------------------------------------------------------------------ - -if test "x${UNCOMPRESS}" = "xgzip"; then - AC_DEFINE([USE_GZIP], [1], [Define if gzip is present]) -fi -AC_SUBST(USE_GZIP) - -# ------------------------------------------------------------------ - -RFX_CHECK_RUBY - -if test "x$RUBY_OK" '!=' "xyes";then - if test -d "lib/ruby/";then - echo all install uninstall clean: > lib/ruby/Makefile - fi - # fail silently- the most users won't have any need for the - # ruby interface anyway -else - if test -f "lib/ruby/Makefile.in";then - rubygfx="lib/ruby/Makefile" - fi -fi - -# ------------------------------------------------------------------ - -AC_MSG_CHECKING([for missing libraries]) - -if test "x$ZLIBMISSING" = "xtrue";then - MISSINGLIBS="${MISSINGLIBS} zlib" - DISABLEPNG2SWF=true - PARTIAL=true -fi -if test "x$JPEGLIBMISSING" = "xtrue";then - MISSINGLIBS="${MISSINGLIBS} jpeglib" - DISABLEPDF2SWF=true - DISABLEJPEG2SWF=true - PARTIAL=true -fi -if test "x$PDFLIBMISSING" = "xtrue";then - DISABLEPDF2PDF=true; -fi -#if test "x$T1LIBMISSING" = "xtrue";then -# MISSINGLIBS="${MISSINGLIBS} t1lib" -#fi -if test "x$UNGIFMISSING" = "xtrue";then - DISABLEGIF2SWF=true - MISSINGLIBS="${MISSINGLIBS} ungif" - PARTIAL=true -fi - -if test "x${ac_cv_header_pdflib_h}" '!=' "xyes";then - DISABLEPDF2PDF=true; -fi -if test "x${ac_cv_header_jpeglib_h}" '!=' "xyes"; then - DISABLEPDF2SWF=true; - DISABLEJPEG2SWF=true; - MISSINGLIBS="${MISSINGLIBS} jpeglib.h" - PARTIAL=true -fi -if test "x$HAVE_FREETYPE" '!=' "x1"; then - DISABLEPDF2SWF=true; - MISSINGLIBS="${MISSINGLIBS} freetype" - PARTIAL=true -fi -#if test "x${ac_cv_header_t1lib_h}" '!=' "xyes"; then -# MISSINGLIBS="${MISSINGLIBS} t1lib.h" -#fi -if test "x${ac_cv_header_gif_lib_h}" '!=' "xyes"; then - DISABLEGIF2SWF=true - MISSINGLIBS="${MISSINGLIBS} gif_lib.h" - PARTIAL=true -fi -if test "x${ac_cv_header_zlib_h}" '!=' "xyes"; then - DISABLEPNG2SWF=true; - MISSINGLIBS="${MISSINGLIBS} zlib.h" - PARTIAL=true -fi -#if test "x${AVIFILE}" '!=' "xtrue" -a "x${AVIFIL32}" '!=' "xtrue"; then -# MISSINGLIBS="${MISSINGLIBS} avifile" -#fi - -AC_MSG_RESULT(${MISSINGLIBS}) - -# ------------------------------------------------------------------ - -RFX_CHECK_PYTHON - -if test "x$PYTHON_OK" '!=' "xyes" -o "$DISABLEPDF2SWF";then - echo all install uninstall clean: > lib/python/Makefile - # fail silently- the most users won't have any need for the - # python interface anyway -else - pythongfx="lib/python/Makefile" -fi - -# ------------------------------------------------------------------ - -if test "x${MISSINGLIBS}" '!=' "x"; then - echo "***************************************************" - echo "* The following headers/libraries are missing: " ${MISSINGLIBS} -fi - -avi2swf="avi2swf/Makefile" -if test "x${AVIFILE}" '!=' "xtrue" -a "x${AVIFIL32}" '!=' "xtrue"; then - #don't whine, avi2swf is outdated anyway - #echo "* Disabling avi2swf tool..." - echo all install uninstall clean: > avi2swf/Makefile - avi2swf= -fi - -pdf2swf_makefile="lib/pdf/Makefile" -PDF2SWF='pdf2swf$(E)' -LIBPDF='libpdf$(A)' - -if test "x${DISABLEPDF2SWF}" = "xtrue"; then - echo "* Disabling pdf2swf tool..." - rm -f lib/pdf/Makefile - echo all install uninstall clean libpdf libgfxpdf: > lib/pdf/Makefile - pdf2swf_makefile="" - PDF2SWF= - LIBPDF= -fi -AC_SUBST(PDF2SWF) -AC_SUBST(LIBPDF) - -PDF2PDF='pdf2pdf$(E)' -DEVICE_PDF='devices/pdf.$(O)' -if test "x${DISABLEPDF2PDF}" = "xtrue"; then - #echo "* Disabling pdf2pdf tool..." - PDF2PDF= - DEVICE_PDF= -fi -AC_SUBST(DEVICE_PDF) -AC_SUBST(PDF2PDF) - -if test "x${ZLIBMISSING}" = "xtrue"; then - echo - echo "* Warning! Without zlib, you will not be able to read" - echo "* or write compressed Flash MX files!" -fi - -JPEG2SWF='jpeg2swf$(E)' -if test "x${DISABLEJPEG2SWF}" = "xtrue"; then - echo "* Disabling jpeg2swf tool..." - JPEG2SWF= -fi -export JPEG2SWF -AC_SUBST(JPEG2SWF) - -GIF2SWF='gif2swf$(E)' -if test "x${DISABLEGIF2SWF}" = "xtrue"; then - echo "* Disabling gif2swf tool..." - GIF2SWF= -fi -export GIF2SWF -AC_SUBST(GIF2SWF) - -PNG2SWF='png2swf$(E)' -if test "x${DISABLEPNG2SWF}" = "xtrue"; then - echo "* Disabling png2swf tool..." - PNG2SWF= -fi -export PNG2SWF -AC_SUBST(PNG2SWF) - -if test "x${MISSINGLIBS}" '!=' "x"; then - if test "x${PARTIAL}" '=' "x"; then - echo "* (never mind)" - fi - echo "***************************************************" -fi - -# ------------------------------------------------------------------ - -AH_TOP([ -#ifndef __config_h__ -#define __config_h__ -]) - -AH_BOTTOM([ -#ifdef HAVE_ZLIB_H -#ifdef HAVE_LIBZ -#define HAVE_ZLIB -#endif -#endif - -#ifdef HAVE_JPEGLIB_H -#ifdef HAVE_LIBJPEG -#define HAVE_JPEGLIB -#endif -#endif - -#ifdef HAVE_FT2BUILD_H -#define HAVE_FREETYPE_H 1 -#endif - -#ifdef HAVE_GL_GL_H -#ifdef HAVE_GL_GLUT_H -#ifdef HAVE_OPENGL -#define USE_OPENGL -#endif -#endif -#endif - -#ifdef HAVE_POPPLER -#define GString GooString -#define GHash GooHash -#define GHashIter GooHashIter -#endif - -#ifdef HAVE_ZZIP_LIB_H -#ifdef HAVE_LIBZZIP -#define HAVE_ZZIP 1 -#endif -#endif - -// supply a substitute calloc function if necessary -#ifndef HAVE_CALLOC -#define calloc rfx_calloc_replacement -#endif - -#endif // __config_h__ -]) - -if test -f "release.in"; then release_in="./release"; fi -if test -f "Makefile.new.in"; then mk_in="./Makefile.new"; fi -FILES="$release_in $mk_in Makefile.common ${avi2swf} Makefile lib/Makefile lib/action/Makefile src/Makefile ${pdf2swf_makefile} swfs/Makefile ${pythongfx} ${rubygfx} ${lame_makefile} lib/readers/Makefile" -AC_OUTPUT(${FILES}) - -dnl new autoconf -dnl AC_CONFIG_FILES([${FILES}]) -dnl AC_OUTPUT - -# -# On development trees, create snapshots of config.status -# -if test -f snapshot -a "x$CHECKMEM" = "x" -a "x$PROFILING" = "x";then - if test "x${MINGW}" = "xyes"; then - echo cp config.status config.status.win32 - cp config.status config.status.win32 - else - if test "x$DEBUG" '=' "x" -a "x$OPTIMIZE" '=' "x";then - echo cp config.status config.status.linux - cp config.status config.status.linux - fi - if test "x$DEBUG" '!=' "x" -a "x$OPTIMIZE" '=' "x";then - echo cp config.status config.status.debug - cp config.status config.status.debug - fi - if test "x$DEBUG" = "x" -a "x$OPTIMIZE" '!=' "x"; then - echo cp config.status config.status.optimize - cp config.status config.status.optimize - fi - fi -fi diff --git a/fluidbook/tools/swftools-special-swfdump/doc/fileformat.sc b/fluidbook/tools/swftools-special-swfdump/doc/fileformat.sc deleted file mode 100644 index 075538fb8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/doc/fileformat.sc +++ /dev/null @@ -1,393 +0,0 @@ -# =========================================================================== -# -# swfc(1) File format specification -# -# Warning: not all of this is actually implemented yet- if there's a -# "TODO" behind a command, it has yet to be integrated into swfc. -# -# =========================================================================== - -# File header -# ----------- - -.flash bbox=200x200 version=6 fps=50 name="spec.swf" compress - -# bbox=200x200 : set bounding box to 200x200 -# bbox=200x200:100:100 : set bounding box to (100,100)-(300,300) -# bbox=autocrop : (default) - make bbox just big enough so that nothing ever get's clipped -# -# all coordinates are in pixels, not in twips. fixed point values like 1.25, 333.40 are allowed. -# -# version=6 : generate flash mx movie -# fps=50 : set framerate to 50 frames/second -# name="..." : save result to spec.flash. (Default: input file with extension -# changed to .flash, or the value of the -o command line -# parameter if given) - -# inherit swf movies: -# --------------------- - -.swf mymovie1 "choo1.swf" -.swf mymovie2 filename="choo1.swf" # long form -.swf mymovie3 filename=choo1.swf # long form, without quotes -.swf mymovie4 choo1.swf # short form, without quotes - -# Notice: An embedded animation can't have a different framerate than -# the frame rate from the surrounding animation. - -#TODO: Those files currently come from the current directory- they should come from the script directory. - -# load an image: -# -------------- - -.jpeg background "panorama.jpg" -.jpeg background2 "panorama.jpg" quality=30% #reduces jpeg quality - -.png background3 "choochoo.png" #TODO - -# (you can put this directly (generating a shape), or insert it into a shape via the fill= argument - -# define a texture from an image: -# ------------------------------- - -.texture text1=background scale=50% rotate=45 - -# define a gradient -# ----------------- - -.gradient mygradient: - 0% red - 50% green - 75% aquamarine - 100% #ffffff -.end - -# with a hard edge: - -.gradient mygradient: - 0% red - 50% green - 50% red - 75% aquamarine - 100% #ffffff -.end - -# with alpha: - -.gradient mygradient: - 0% #00000000 - 50% #0000ff40 - 75% #0000ff80 - 100% #0000ffc0 -.end - -# define a texture from a gradient: -# --------------------------------- - -.texture grad2=mygradient x=0 y=0 width=125 height=200 rotate=45 - -# Create simple objects: -# ---------------------- - -.box mybox1 width=100 height=50 color=black fill=none #unfilled rectangle (just the lines) -.box mybox2 width=100 height=50 color=black #same as above -.box mybox3 width=100 height=50 color=black fill #filled black rectangle -.box mybox4 width=100 height=50 color=red line=2 fill=blue #blue rectangle with red edges -.box mybox5 width=100 height=50 color=red line=2 fill=background #filled with image "background", with red edges - -.circle mycircle1 r=50 color=#aa33ff fill=mygradient # filled with gradient (defined above) -.circle mycircle1 r=50 color=#aa33ff fill=grad2 # filled with gradient texture - -# Sounds: -# ------- - -.sound sound1 "LocoStart.wav" - -.frame 16 - .play sound1 loop=1 #other arguments supported: nomultiple (don't start if already playing) -.frame 55 - .stop sound1 - -.frame 66 - # this starts a synchronized soundtrack at this frame position. The command - # expects a filename, not a sound object, as it would be duplicating the - # sound object otherwise, and I'd rather have that done explicitly. - .soundtrack "LocoStart.wav" # TODO - -# Elements of the movie should be animated by various means -# moving (x,y and zoom) -# --------------------- - -.box obj1 width=200.0 height=100.0 - -.frame 100 - .put obj1 x=0 y=0 #object starts at (0,0) - -.frame 140 - .change obj1 x+=100 y=0 scale=120% # smoothly move obj1 100 pixels to the right over 40 frames, - # scaling it to 120% of it's original size -.frame 170 - .jump obj1 x=200 y=200 # make object to suddenly change to 200,200 at frame 70. - -.frame 190 - .qchange obj1 x=300 y=200 # TODO # make obj1 move towards 300,200... -.frame 210 - .qchange obj1 x=300 y=300 # TODO # ... and then smoothly over to 300,300 using bspline interpolation - -#.frame 220 #TODO -# .jump obj1 x=reset y=reset - -.frame 230 - .del obj1 #Remove object again - -# morphing -# -------- - -.outline shape1: - #define shape 1 -.end -.outline shape2: - #define shape 2 -.end -.morphshape morphthing start=shape1 end=shape2 -.frame 250 - .put morphthing ratio=0% -.frame 270 - .change morphthing ratio=100% - -# interpolation between crude manual animation frames -# --------------------------------------------------- - -.circle ball r=50 color=blue fill=violet - -# now draw two balls, which fly around each other. - -.frame 300 -.put myball1=ball x=0 y=100 blue=0 -.put myball2=ball x=100 y=100 red=0 - -.frame 310 -# the .qchange means, "interpolate to this position and frame, using quadratic splines". - .qchange myball1 x=50 y=0 #TODO - .qchange myball2 x=50 y=100 #TODO - -.frame 320 -# We could also use coordinates relative to start position: .change myball1 x+=100 y+=0 - .qchange myball1 x=100 y=100 #TODO - .qchange myball2 x=0 y=100 #TODO - -.frame 330 - .qchange myball1 x=50 y=100 #TODO - .qchange myball2 x=50 y=0 #TODO - -.frame 340 -# Hmmm. This frame is the same as frame 0. How to prevent duplicating that one? - .qchange myball1 x=0 y=100 #TODO - .qchange myball2 x=100 y=100 #TODO - -# color transforms (fading) -# ------------------------- - -# .put, .change, .qchange, .jump all support params which result in color transform. -# Everything up to the + is multiplicated, the rest summed. - -.put obj1 blue=50% #(scale blue color component to 50%) -.change obj1 blue=128 #(same as above) -.change obj1 red=+25% #(shift blue color component by 25%) -.change obj1 red=+64 #(same as above) -.change obj1 green=50%+50% #(scale green color component to 50% and then shift it by 50%) -.change obj1 green=128+128 #(same as above) -.change obj1 green=-1+255 #(invert green color component) -.change obj1 green=2-128 #(reduce spectrum for green to the upper 50%) -.change obj1 luminance=50% #(fade all color components 50% to black, same as red=50% green=50% blue=50%) -.change obj1 alpha=50% #(make object 50% transparent) - -# scaling -# ------- - -.change obj1 scale=50% # change an object to 50% of it's size -.change obj1 scaley=50% # flatten object to 50% of it's height -.change obj1 scaley=110% scalex=75% #(funhouse mirror!) - -# rotating -# -------- - -.change obj1 rotate=45 # tilt object, counterclockwise - -# shearing -# -------- - -.change obj1 shear=100% # shear object - -# sprites (a.k.a. movieClips) -# ------- - -.sprite spr1 - .frame 1 .put ball1=ball 0 0 - .frame 2 .change ball1 100 100 -.end - -.sprite spr2 - .frame 1 .put ball2=ball 100 0 - .frame 7 .change ball2 0 100 -.end - -.frame 400 - .put spr1 - .put spr2 - -# so spr1 has three frames, spr2 has seven. The whole animation loops after 21 frames. - -# multi-level nesting: (sprites can be nested to any depth) - -.sprite mspr1 - .sprite mspr2 - .sprite spr3 - .put ball 100 0 - .end - .end -.end - -# clipping an animation inside a star-shaped sprite: - -.swf mystar1 "star.swf" -.swf anim1 "penguins.swf" - -.sprite cspr1 - .startclip mystar1 - .put anim1 - .end -.end -.frame 401 - .put cspr1 rotate=0 -.frame 402 - .change cspr1 rotate=360 - -# buttons -# ------- - -.png play "Play.png" #TODO -.png play_pressed "Play_pressed.png" #TODO -.png stoplogo "Stop.png" #TODO - -.button playbutton - .show play as=idle - .show play as=area - .show play_pressed as=pressed - .show play_pressed as=hover -.end - -.button playbutton2 - .show play as=idle - .on_press inside - .on_release inside - .on_release outside - .on_move_in pressed - .on_move_out pressed - .on_move_in - .on_move_out - .on_key "a": - # actionscript... - .end -.end - -.button mybutton - .show play as=idle - .show obj1 x=300 y=400 scale=110% pivot=center - as=pressed -.end - -.box blueshape 10 10 -.box greenshape 10 10 -.box whiteshape 10 10 -.box activearea 10 10 -.box emtpyshape 10 10 -.box window1 10 10 -# button which is blue, get's green when the mouse hovers over it, and -# white when it is pressed: -.button b1 - .show blueshape as=idle - .show greenshape as=hower - .show whiteshape as=press -.end - -# button where the button position is not identical to the active area: -.button b2 - .show activearea as=area - .show blueshape as=idle - .show greenshape as=hower - .show whiteshape as=press -.end - -# (if area is not set, it's the same as shape) - -# the above put into use: pop up a window if the mouse cursor enters a certain -# area: -.button b3 - .show activearea as=area - .show emtpyshape as=idle - .show window1 as=hower -.end - -# fonts -# ----- -.font font1 "myfont.swf" -.font font1 "myfont.ttf" -.font font1 "myfont.pfa" - -# text fields -# ----------- -.text mytext1 font=font1 text="I am a happy little scroll message" color=blue size=100% - -# edittext -# -------- -#(field where the flash animation can get input from the user) - -.font helvetica "helvetica-bold.swf" -.edittext edittext1 text="Type something here" color=blue maxlength=200 font=helvetica size=24 width=320 height=200 #TODO -# width/height: dimensions of the box -# text: The text which appears initally in the box, and can be overwritten by the user -# maxlength: max. length of the text the user can type -# color/font/size: Font appeareance -# variable: Name of the actionscript variable the text is stored in -# The following boolean options are also supported: -# password (show input only as stars), wordwrap, multiline, html, noselect, readonly - -# actionscript -# ------------ - -.action: - _root.play(); -.end - -# depth control -# ------------------- -# .put, .change, .qchange, .jump, .startclip take before and after parameters, -# which can be used to specify the depth of an object - -.put o1=obj1 #TODO -.put o2=obj1 below=o1 x=50 #TODO -.frame -.change o1 #TODO -.change o2 above=o1 x=50 #TODO - -# newline conventions -# ------------------- - -# All Newlines are treated as normal whitespace. Therefore, splitting -# commands over several lines, like -.put obj2=obj1 x=300 - y=300 - red=100% - green=50% - blue=50% -# is allowed. - -# Furthermore, having more than one command in one line is also possible: - -.frame 600 .change obj1 x+=700 .change obj2 x+=300 -.frame 601 .change obj1 x+=500 .change obj2 x+=500 -.frame 602 .change obj1 x+=300 .change obj2 x+=700 - -.end # end of first file - diff --git a/fluidbook/tools/swftools-special-swfdump/install-sh b/fluidbook/tools/swftools-special-swfdump/install-sh deleted file mode 100644 index e9de23842..000000000 --- a/fluidbook/tools/swftools-special-swfdump/install-sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# 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. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - chmodcmd="" - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/fluidbook/tools/swftools-special-swfdump/lib/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/Makefile deleted file mode 100644 index a57327736..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/Makefile +++ /dev/null @@ -1,201 +0,0 @@ -top_builddir = .. -srcdir = . -top_srcdir = .. -include ../Makefile.common - -all: librfxswf$(A) libgfxpdf$(A) libbase$(A) libgfx$(A) libgfxswf$(A) libocr$(A) - -lame_objects = lame/psymodel.$(O) lame/fft.$(O) lame/newmdct.$(O) lame/quantize.$(O) lame/takehiro.$(O) lame/reservoir.$(O) lame/quantize_pvt.$(O) lame/vbrquantize.$(O) lame/encoder.$(O) lame/id3tag.$(O) lame/version.$(O) lame/tables.$(O) lame/util.$(O) lame/bitstream.$(O) lame/set_get.$(O) lame/VbrTag.$(O) lame/lame.$(O) -lame_in_source = - -h263_objects = h.263/dct.$(O) h.263/h263tables.$(O) h.263/swfvideo.$(O) - -as12compiler_objects = action/assembler.$(O) action/compile.$(O) action/lex.swf4.$(O) action/lex.swf5.$(O) action/libming.$(O) action/swf4compiler.tab.$(O) action/swf5compiler.tab.$(O) action/actioncompiler.$(O) -as12compiler_in_source = $(as12compiler_objects) - -as3compiler_objects = as3/abc.$(O) as3/pool.$(O) as3/files.$(O) as3/opcodes.$(O) as3/code.$(O) as3/registry.$(O) as3/builtin.$(O) as3/tokenizer.yy.$(O) as3/parser.tab.$(O) as3/scripts.$(O) as3/compiler.$(O) as3/import.$(O) as3/expr.$(O) as3/parser_help.$(O) as3/state.$(O) as3/common.$(O) as3/initcode.$(O) as3/assets.$(O) -gfxpoly_objects = gfxpoly/active.$(O) gfxpoly/convert.$(O) gfxpoly/poly.$(O) gfxpoly/renderpoly.$(O) gfxpoly/stroke.$(O) gfxpoly/wind.$(O) gfxpoly/xrow.$(O) - -rfxswf_modules = modules/swfbits.c modules/swfaction.c modules/swfdump.c modules/swfcgi.c modules/swfbutton.c modules/swftext.c modules/swffont.c modules/swftools.c modules/swfsound.c modules/swfshape.c modules/swfobject.c modules/swfdraw.c modules/swffilter.c modules/swfrender.c h.263/swfvideo.c modules/swfalignzones.c - -base_objects=q.$(O) base64.$(O) utf8.$(O) png.$(O) jpeg.$(O) wav.$(O) mp3.$(O) os.$(O) bitio.$(O) log.$(O) mem.$(O) xml.$(O) ttf.$(O) kdtree.$(O) graphcut.$(O) -devices=devices/dummy.$(O) devices/file.$(O) devices/render.$(O) devices/text.$(O) devices/record.$(O) devices/ops.$(O) devices/polyops.$(O) devices/bbox.$(O) devices/rescale.$(O) -filters=filters/alpha.$(O) filters/remove_font_transforms.$(O) filters/one_big_font.$(O) filters/vectors_to_glyphs.$(O) -gfx_objects=gfximage.$(O) gfxtools.$(O) gfxfont.$(O) gfxfilter.$(O) $(devices) $(filters) - -rfxswf_objects=modules/swfaction.$(O) modules/swfbits.$(O) modules/swfbutton.$(O) modules/swfcgi.$(O) modules/swfdraw.$(O) modules/swfdump.$(O) modules/swffilter.$(O) modules/swffont.$(O) modules/swfobject.$(O) modules/swfrender.$(O) modules/swfshape.$(O) modules/swfsound.$(O) modules/swftext.$(O) modules/swftools.$(O) modules/swfalignzones.$(O) -ocr_objects=gocr/box.$(O) gocr/database.$(O) gocr/detect.$(O) gocr/job.$(O) gocr/lines.$(O) gocr/list.$(O) gocr/ocr0.$(O) gocr/ocr0n.$(O) gocr/ocr1.$(O) gocr/otsu.$(O) gocr/output.$(O) gocr/pgm2asc.$(O) gocr/pixel.$(O) gocr/progress.$(O) gocr/remove.$(O) gocr/unicode.$(O) - -%.$(O): %.c - $(C) $< -o $@ -lame/%.$(O): lame/%.c - $(C) $< -o $@ -action/%.$(O): action/%.c - $(C) $< -o $@ -as3/%.$(O): as3/%.c - $(C) $< -o $@ -gfxpoly/%.$(O): gfxpoly/%.c - $(C) $< -o $@ - -bitio.$(O): bitio.c bitio.h - $(C) bitio.c -o $@ -drawer.$(O): drawer.c drawer.h - $(C) drawer.c -o $@ -q.$(O): q.c q.h $(top_builddir)/config.h - $(C) q.c -o $@ -utf8.$(O): utf8.c utf8.h $(top_builddir)/config.h - $(C) utf8.c -o $@ -mem.$(O): mem.c mem.h $(top_builddir)/config.h - $(C) mem.c -o $@ -png.$(O): png.c png.h $(top_builddir)/config.h - $(C) png.c -o $@ -jpeg.$(O): jpeg.c jpeg.h $(top_builddir)/config.h - $(C) jpeg.c -o $@ -mp3.$(O): mp3.c mp3.h $(top_builddir)/config.h - $(C) mp3.c -o $@ -wav.$(O): wav.c wav.h $(top_builddir)/config.h - $(C) wav.c -o $@ -xml.$(O): xml.c xml.h bitio.h - $(C) xml.c -o $@ -graphcut.$(O): graphcut.c graphcut.h - $(C) graphcut.c -o $@ -ttf.$(O): ttf.c ttf.h - $(C) ttf.c -o $@ -os.$(O): os.c os.h $(top_builddir)/config.h - $(C) -DSWFTOOLS_DATADIR=\"$(pkgdatadir)\" os.c -o $@ -modules/swfaction.$(O): modules/swfaction.c rfxswf.h - $(C) modules/swfaction.c -o $@ -modules/swfbits.$(O): modules/swfbits.c rfxswf.h - $(C) modules/swfbits.c -o $@ -modules/swfbutton.$(O): modules/swfbutton.c rfxswf.h - $(C) modules/swfbutton.c -o $@ -modules/swfcgi.$(O): modules/swfcgi.c rfxswf.h - $(C) modules/swfcgi.c -o $@ -modules/swfdraw.$(O): modules/swfdraw.c rfxswf.h - $(C) modules/swfdraw.c -o $@ -modules/swfdump.$(O): modules/swfdump.c rfxswf.h - $(C) modules/swfdump.c -o $@ -modules/swffilter.$(O): modules/swffilter.c rfxswf.h - $(C) modules/swffilter.c -o $@ -modules/swfalignzones.$(O): modules/swfalignzones.c rfxswf.h - $(C) modules/swfalignzones.c -o $@ -modules/swffont.$(O): modules/swffont.c rfxswf.h - $(C) modules/swffont.c -o $@ -modules/swfobject.$(O): modules/swfobject.c rfxswf.h - $(C) modules/swfobject.c -o $@ -modules/swfrender.$(O): modules/swfrender.c rfxswf.h - $(C) modules/swfrender.c -o $@ -modules/swfshape.$(O): modules/swfshape.c rfxswf.h - $(C) modules/swfshape.c -o $@ -modules/swfsound.$(O): modules/swfsound.c rfxswf.h - $(C) modules/swfsound.c -o $@ -modules/swftext.$(O): modules/swftext.c rfxswf.h - $(C) modules/swftext.c -o $@ -modules/swftools.$(O): modules/swftools.c rfxswf.h - $(C) modules/swftools.c -o $@ -gfximage.$(O): gfximage.c gfximage.h gfxdevice.h $(top_builddir)/config.h - $(C) gfximage.c -o $@ -gfxtools.$(O): gfxtools.c gfxtools.h $(top_builddir)/config.h - $(C) gfxtools.c -o $@ -gfxfont.$(O): gfxfont.c gfxfont.h ttf.h $(top_builddir)/config.h - $(C) gfxfont.c -o $@ -gfxfilter.$(O): gfxfilter.c gfxfilter.h ttf.h $(top_builddir)/config.h - $(C) gfxfilter.c -o $@ -gfxwindow.$(O): gfxwindow_win32.c gfxwindow_unix.c gfxwindow.c gfxwindow.h - $(C) gfxwindow.c -o $@ - -log.$(O): log.c log.h - $(C) log.c -o $@ - -rfxswf.$(O): rfxswf.c rfxswf.h drawer.h bitio.h log.h $(top_builddir)/config.h - $(C) rfxswf.c -o $@ - -#$(as12compiler_objects): -# cd action;$(MAKE) all;cd .. - -h.263/dct.$(O): h.263/dct.c h.263/dct.h - $(C) h.263/dct.c -o h.263/dct.$(O) -h.263/h263tables.$(O): h.263/h263tables.c h.263/h263tables.h - $(C) h.263/h263tables.c -o h.263/h263tables.$(O) -h.263/swfvideo.$(O): h.263/swfvideo.c h.263/h263tables.h h.263/dct.h - $(C) h.263/swfvideo.c -o h.263/swfvideo.$(O) - -devices/swf.$(O): devices/swf.c devices/swf.h - $(C) devices/swf.c -o devices/swf.$(O) -devices/file.$(O): devices/file.c devices/file.h - $(C) devices/file.c -o devices/file.$(O) -devices/dummy.$(O): devices/dummy.c devices/dummy.h - $(C) devices/dummy.c -o devices/dummy.$(O) -devices/render.$(O): devices/render.c devices/render.h - $(C) devices/render.c -o devices/render.$(O) -devices/opengl.$(O): devices/opengl.c devices/opengl.h - $(C) devices/opengl.c -o devices/opengl.$(O) -devices/polyops.$(O): devices/polyops.c devices/polyops.h gfxpoly.h - $(C) devices/polyops.c -o devices/polyops.$(O) -devices/record.$(O): devices/record.c devices/record.h - $(C) devices/record.c -o devices/record.$(O) -devices/text.$(O): devices/text.c devices/text.h - $(C) devices/text.c -o devices/text.$(O) -devices/ops.$(O): devices/ops.c devices/ops.h - $(C) devices/ops.c -o devices/ops.$(O) -devices/rescale.$(O): devices/rescale.c devices/rescale.h - $(C) devices/rescale.c -o devices/rescale.$(O) -devices/bbox.$(O): devices/bbox.c devices/bbox.h - $(C) devices/bbox.c -o devices/bbox.$(O) -devices/lrf.$(O): devices/lrf.c devices/lrf.h - $(C) devices/lrf.c -o devices/lrf.$(O) -devices/ocr.$(O): devices/ocr.c devices/ocr.h gocr/gocr.h - $(C) devices/ocr.c -o devices/ocr.$(O) - -filters/alpha.$(O): filters/alpha.c gfxfilter.h - $(C) filters/alpha.c -o filters/alpha.$(O) -filters/remove_font_transform.$(O): filters/remove_font_transform.c gfxfilter.h - $(C) filters/remove_font_transform.c -o filters/remove_font_transform.$(O) - -readers/swf2.$(O): readers/swf.c readers/swf.h - $(C) readers/swf.c -o readers/swf2.$(O) -readers/image.$(O): readers/image.c readers/image.h - $(C) readers/image.c -o readers/image.$(O) - -libocr$(A): $(ocr_objects) devices/ocr.$(O) - rm -f libocr$(A) - $(AR) r libocr$(A) $(ocr_objects) devices/ocr.$(O) - $(RANLIB) libocr$(A) - -libbase$(A): $(base_objects) Makefile - rm -f libbase$(A) - $(AR) r libbase$(A) $(base_objects) - $(RANLIB) libbase$(A) - -libgfxswf$(A): devices/swf.$(O) readers/swf2.$(O) readers/image.$(O) - rm -f libgfxswf$(A) - $(AR) r libgfxswf$(A) devices/swf.$(O) readers/swf2.$(O) readers/image.$(O) - $(RANLIB) libgfxswf$(A) - -libgfx$(A): $(gfx_objects) $(gfxpoly_objects) Makefile - rm -f libgfx$(A) - $(AR) r libgfx$(A) $(gfx_objects) $(gfxpoly_objects) - $(RANLIB) libgfx$(A) - -librfxswf$(A): Makefile $(rfxswf_objects) rfxswf.$(O) drawer.$(O) $(lame_in_source) $(h263_objects) $(as12compiler_in_source) $(as3compiler_objects) Makefile - rm -f librfxswf$(A) - $(AR) r librfxswf$(A) $(rfxswf_objects) rfxswf.$(O) drawer.$(O) $(lame_in_source) $(h263_objects) $(as12compiler_in_source) $(as3compiler_objects) - $(RANLIB) librfxswf$(A) - -libgfxpdf$(A): pdf/VectorGraphicOutputDev.cc pdf/VectorGraphicOutputDev.h pdf/pdf.cc pdf/pdf.h - cd pdf;$(MAKE) libgfxpdf - -tests: png.test.c - $(L) png.test.c -o png.test $(LIBS) - -install: -uninstall: - -clean: - rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out - for dir in modules filters devices swf as3 readers art gocr h.263 gfxpoly;do rm -f $$dir/*.o $$dir/*.obj $$dir/*.lo $$dir/*.a $$dir/*.lib $$dir/*.la $$dir/gmon.out;done - cd lame && $(MAKE) clean && cd .. || true - cd action && $(MAKE) clean && cd .. - cd python && $(MAKE) clean && cd .. - cd pdf && $(MAKE) clean && cd .. - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/Makefile.in deleted file mode 100644 index 3d2c8ba7d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/Makefile.in +++ /dev/null @@ -1,201 +0,0 @@ -top_builddir = .. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -include ../Makefile.common - -all: librfxswf$(A) libgfxpdf$(A) libbase$(A) libgfx$(A) libgfxswf$(A) libocr$(A) - -lame_objects = lame/psymodel.$(O) lame/fft.$(O) lame/newmdct.$(O) lame/quantize.$(O) lame/takehiro.$(O) lame/reservoir.$(O) lame/quantize_pvt.$(O) lame/vbrquantize.$(O) lame/encoder.$(O) lame/id3tag.$(O) lame/version.$(O) lame/tables.$(O) lame/util.$(O) lame/bitstream.$(O) lame/set_get.$(O) lame/VbrTag.$(O) lame/lame.$(O) -lame_in_source = @lame_in_source@ - -h263_objects = h.263/dct.$(O) h.263/h263tables.$(O) h.263/swfvideo.$(O) - -as12compiler_objects = action/assembler.$(O) action/compile.$(O) action/lex.swf4.$(O) action/lex.swf5.$(O) action/libming.$(O) action/swf4compiler.tab.$(O) action/swf5compiler.tab.$(O) action/actioncompiler.$(O) -as12compiler_in_source = $(as12compiler_objects) - -as3compiler_objects = as3/abc.$(O) as3/pool.$(O) as3/files.$(O) as3/opcodes.$(O) as3/code.$(O) as3/registry.$(O) as3/builtin.$(O) as3/tokenizer.yy.$(O) as3/parser.tab.$(O) as3/scripts.$(O) as3/compiler.$(O) as3/import.$(O) as3/expr.$(O) as3/parser_help.$(O) as3/state.$(O) as3/common.$(O) as3/initcode.$(O) as3/assets.$(O) -gfxpoly_objects = gfxpoly/active.$(O) gfxpoly/convert.$(O) gfxpoly/poly.$(O) gfxpoly/renderpoly.$(O) gfxpoly/stroke.$(O) gfxpoly/wind.$(O) gfxpoly/xrow.$(O) - -rfxswf_modules = modules/swfbits.c modules/swfaction.c modules/swfdump.c modules/swfcgi.c modules/swfbutton.c modules/swftext.c modules/swffont.c modules/swftools.c modules/swfsound.c modules/swfshape.c modules/swfobject.c modules/swfdraw.c modules/swffilter.c modules/swfrender.c h.263/swfvideo.c modules/swfalignzones.c - -base_objects=q.$(O) base64.$(O) utf8.$(O) png.$(O) jpeg.$(O) wav.$(O) mp3.$(O) os.$(O) bitio.$(O) log.$(O) mem.$(O) xml.$(O) ttf.$(O) kdtree.$(O) graphcut.$(O) -devices=devices/dummy.$(O) devices/file.$(O) devices/render.$(O) devices/text.$(O) devices/record.$(O) devices/ops.$(O) devices/polyops.$(O) devices/bbox.$(O) devices/rescale.$(O) @DEVICE_OPENGL@ @DEVICE_PDF@ -filters=filters/alpha.$(O) filters/remove_font_transforms.$(O) filters/one_big_font.$(O) filters/vectors_to_glyphs.$(O) -gfx_objects=gfximage.$(O) gfxtools.$(O) gfxfont.$(O) gfxfilter.$(O) $(devices) $(filters) - -rfxswf_objects=modules/swfaction.$(O) modules/swfbits.$(O) modules/swfbutton.$(O) modules/swfcgi.$(O) modules/swfdraw.$(O) modules/swfdump.$(O) modules/swffilter.$(O) modules/swffont.$(O) modules/swfobject.$(O) modules/swfrender.$(O) modules/swfshape.$(O) modules/swfsound.$(O) modules/swftext.$(O) modules/swftools.$(O) modules/swfalignzones.$(O) -ocr_objects=gocr/box.$(O) gocr/database.$(O) gocr/detect.$(O) gocr/job.$(O) gocr/lines.$(O) gocr/list.$(O) gocr/ocr0.$(O) gocr/ocr0n.$(O) gocr/ocr1.$(O) gocr/otsu.$(O) gocr/output.$(O) gocr/pgm2asc.$(O) gocr/pixel.$(O) gocr/progress.$(O) gocr/remove.$(O) gocr/unicode.$(O) - -%.$(O): %.c - $(C) $< -o $@ -lame/%.$(O): lame/%.c - $(C) $< -o $@ -action/%.$(O): action/%.c - $(C) $< -o $@ -as3/%.$(O): as3/%.c - $(C) $< -o $@ -gfxpoly/%.$(O): gfxpoly/%.c - $(C) $< -o $@ - -bitio.$(O): bitio.c bitio.h - $(C) bitio.c -o $@ -drawer.$(O): drawer.c drawer.h - $(C) drawer.c -o $@ -q.$(O): q.c q.h $(top_builddir)/config.h - $(C) q.c -o $@ -utf8.$(O): utf8.c utf8.h $(top_builddir)/config.h - $(C) utf8.c -o $@ -mem.$(O): mem.c mem.h $(top_builddir)/config.h - $(C) mem.c -o $@ -png.$(O): png.c png.h $(top_builddir)/config.h - $(C) png.c -o $@ -jpeg.$(O): jpeg.c jpeg.h $(top_builddir)/config.h - $(C) jpeg.c -o $@ -mp3.$(O): mp3.c mp3.h $(top_builddir)/config.h - $(C) mp3.c -o $@ -wav.$(O): wav.c wav.h $(top_builddir)/config.h - $(C) wav.c -o $@ -xml.$(O): xml.c xml.h bitio.h - $(C) xml.c -o $@ -graphcut.$(O): graphcut.c graphcut.h - $(C) graphcut.c -o $@ -ttf.$(O): ttf.c ttf.h - $(C) ttf.c -o $@ -os.$(O): os.c os.h $(top_builddir)/config.h - $(C) -DSWFTOOLS_DATADIR=\"$(pkgdatadir)\" os.c -o $@ -modules/swfaction.$(O): modules/swfaction.c rfxswf.h - $(C) modules/swfaction.c -o $@ -modules/swfbits.$(O): modules/swfbits.c rfxswf.h - $(C) modules/swfbits.c -o $@ -modules/swfbutton.$(O): modules/swfbutton.c rfxswf.h - $(C) modules/swfbutton.c -o $@ -modules/swfcgi.$(O): modules/swfcgi.c rfxswf.h - $(C) modules/swfcgi.c -o $@ -modules/swfdraw.$(O): modules/swfdraw.c rfxswf.h - $(C) modules/swfdraw.c -o $@ -modules/swfdump.$(O): modules/swfdump.c rfxswf.h - $(C) modules/swfdump.c -o $@ -modules/swffilter.$(O): modules/swffilter.c rfxswf.h - $(C) modules/swffilter.c -o $@ -modules/swfalignzones.$(O): modules/swfalignzones.c rfxswf.h - $(C) modules/swfalignzones.c -o $@ -modules/swffont.$(O): modules/swffont.c rfxswf.h - $(C) modules/swffont.c -o $@ -modules/swfobject.$(O): modules/swfobject.c rfxswf.h - $(C) modules/swfobject.c -o $@ -modules/swfrender.$(O): modules/swfrender.c rfxswf.h - $(C) modules/swfrender.c -o $@ -modules/swfshape.$(O): modules/swfshape.c rfxswf.h - $(C) modules/swfshape.c -o $@ -modules/swfsound.$(O): modules/swfsound.c rfxswf.h - $(C) modules/swfsound.c -o $@ -modules/swftext.$(O): modules/swftext.c rfxswf.h - $(C) modules/swftext.c -o $@ -modules/swftools.$(O): modules/swftools.c rfxswf.h - $(C) modules/swftools.c -o $@ -gfximage.$(O): gfximage.c gfximage.h gfxdevice.h $(top_builddir)/config.h - $(C) gfximage.c -o $@ -gfxtools.$(O): gfxtools.c gfxtools.h $(top_builddir)/config.h - $(C) gfxtools.c -o $@ -gfxfont.$(O): gfxfont.c gfxfont.h ttf.h $(top_builddir)/config.h - $(C) gfxfont.c -o $@ -gfxfilter.$(O): gfxfilter.c gfxfilter.h ttf.h $(top_builddir)/config.h - $(C) gfxfilter.c -o $@ -gfxwindow.$(O): gfxwindow_win32.c gfxwindow_unix.c gfxwindow.c gfxwindow.h - $(C) gfxwindow.c -o $@ - -log.$(O): log.c log.h - $(C) log.c -o $@ - -rfxswf.$(O): rfxswf.c rfxswf.h drawer.h bitio.h log.h $(top_builddir)/config.h - $(C) rfxswf.c -o $@ - -#$(as12compiler_objects): -# cd action;$(MAKE) all;cd .. - -h.263/dct.$(O): h.263/dct.c h.263/dct.h - $(C) h.263/dct.c -o h.263/dct.$(O) -h.263/h263tables.$(O): h.263/h263tables.c h.263/h263tables.h - $(C) h.263/h263tables.c -o h.263/h263tables.$(O) -h.263/swfvideo.$(O): h.263/swfvideo.c h.263/h263tables.h h.263/dct.h - $(C) h.263/swfvideo.c -o h.263/swfvideo.$(O) - -devices/swf.$(O): devices/swf.c devices/swf.h - $(C) devices/swf.c -o devices/swf.$(O) -devices/file.$(O): devices/file.c devices/file.h - $(C) devices/file.c -o devices/file.$(O) -devices/dummy.$(O): devices/dummy.c devices/dummy.h - $(C) devices/dummy.c -o devices/dummy.$(O) -devices/render.$(O): devices/render.c devices/render.h - $(C) devices/render.c -o devices/render.$(O) -devices/opengl.$(O): devices/opengl.c devices/opengl.h - $(C) devices/opengl.c -o devices/opengl.$(O) -devices/polyops.$(O): devices/polyops.c devices/polyops.h gfxpoly.h - $(C) devices/polyops.c -o devices/polyops.$(O) -devices/record.$(O): devices/record.c devices/record.h - $(C) devices/record.c -o devices/record.$(O) -devices/text.$(O): devices/text.c devices/text.h - $(C) devices/text.c -o devices/text.$(O) -devices/ops.$(O): devices/ops.c devices/ops.h - $(C) devices/ops.c -o devices/ops.$(O) -devices/rescale.$(O): devices/rescale.c devices/rescale.h - $(C) devices/rescale.c -o devices/rescale.$(O) -devices/bbox.$(O): devices/bbox.c devices/bbox.h - $(C) devices/bbox.c -o devices/bbox.$(O) -devices/lrf.$(O): devices/lrf.c devices/lrf.h - $(C) devices/lrf.c -o devices/lrf.$(O) -devices/ocr.$(O): devices/ocr.c devices/ocr.h gocr/gocr.h - $(C) devices/ocr.c -o devices/ocr.$(O) - -filters/alpha.$(O): filters/alpha.c gfxfilter.h - $(C) filters/alpha.c -o filters/alpha.$(O) -filters/remove_font_transform.$(O): filters/remove_font_transform.c gfxfilter.h - $(C) filters/remove_font_transform.c -o filters/remove_font_transform.$(O) - -readers/swf2.$(O): readers/swf.c readers/swf.h - $(C) readers/swf.c -o readers/swf2.$(O) -readers/image.$(O): readers/image.c readers/image.h - $(C) readers/image.c -o readers/image.$(O) - -libocr$(A): $(ocr_objects) devices/ocr.$(O) - rm -f libocr$(A) - $(AR) r libocr$(A) $(ocr_objects) devices/ocr.$(O) - $(RANLIB) libocr$(A) - -libbase$(A): $(base_objects) Makefile - rm -f libbase$(A) - $(AR) r libbase$(A) $(base_objects) - $(RANLIB) libbase$(A) - -libgfxswf$(A): devices/swf.$(O) readers/swf2.$(O) readers/image.$(O) - rm -f libgfxswf$(A) - $(AR) r libgfxswf$(A) devices/swf.$(O) readers/swf2.$(O) readers/image.$(O) - $(RANLIB) libgfxswf$(A) - -libgfx$(A): $(gfx_objects) $(gfxpoly_objects) Makefile - rm -f libgfx$(A) - $(AR) r libgfx$(A) $(gfx_objects) $(gfxpoly_objects) - $(RANLIB) libgfx$(A) - -librfxswf$(A): Makefile $(rfxswf_objects) rfxswf.$(O) drawer.$(O) $(lame_in_source) $(h263_objects) $(as12compiler_in_source) $(as3compiler_objects) Makefile - rm -f librfxswf$(A) - $(AR) r librfxswf$(A) $(rfxswf_objects) rfxswf.$(O) drawer.$(O) $(lame_in_source) $(h263_objects) $(as12compiler_in_source) $(as3compiler_objects) - $(RANLIB) librfxswf$(A) - -libgfxpdf$(A): pdf/VectorGraphicOutputDev.cc pdf/VectorGraphicOutputDev.h pdf/pdf.cc pdf/pdf.h - cd pdf;$(MAKE) libgfxpdf - -tests: png.test.c - $(L) png.test.c -o png.test $(LIBS) - -install: -uninstall: - -clean: - rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out - for dir in modules filters devices swf as3 readers art gocr h.263 gfxpoly;do rm -f $$dir/*.o $$dir/*.obj $$dir/*.lo $$dir/*.a $$dir/*.lib $$dir/*.la $$dir/gmon.out;done - cd lame && $(MAKE) clean && cd .. || true - cd action && $(MAKE) clean && cd .. - cd python && $(MAKE) clean && cd .. - cd pdf && $(MAKE) clean && cd .. - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile deleted file mode 100644 index 3b13ab651..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile +++ /dev/null @@ -1,95 +0,0 @@ -top_builddir = ../.. -srcdir = . -top_srcdir = ../.. -include ../../Makefile.common - -# in case we need to get more information out of bison -#BISONDEBUG = --debug -# In case we need to get more information out of flex -#FLEXDEBUG = -d - -OBJECTS = compile.$(O) \ - lex.swf4.$(O) lex.swf5.$(O) swf5compiler.tab.$(O) swf4compiler.tab.$(O) \ - assembler.$(O) libming.$(O) actioncompiler.$(O) - -COMPILER_FILES = action.h assembler.c assembler.h compile.c compile.h \ - listaction.c swf4compiler.flex swf4compiler.y swf5compiler.flex swf5compiler.y - -GENERATED = lex.swf4.c lex.swf5.c swf5compiler.tab.c swf4compiler.tab.c - -all: $(OBJECTS) -generated: $(GENERATED) - -# === GENERATED FILES === - -swf5compiler.tab.c: swf5compiler.y - bison -p swf5 swf5compiler.y - -swf5compiler.tab.h: swf5compiler.y - bison --defines $(BISONDEBUG) -p swf5 swf5compiler.y - -swf4compiler.tab.c: swf4compiler.y - bison -p swf4 swf4compiler.y - -swf4compiler.tab.h: swf4compiler.y - bison --defines $(BISONDEBUG) -p swf4 swf4compiler.y - -lex.swf4.c: swf4compiler.flex swf4compiler.tab.h - flex $(FLEXDEBUG) -i -Pswf4 swf4compiler.flex - -lex.swf5.c: swf5compiler.flex swf5compiler.tab.h - flex $(FLEXDEBUG) -i -Pswf5 swf5compiler.flex - -# === OBJECTS === - -lex.swf4.$(O): lex.swf4.c - $(C) lex.swf4.c -o lex.swf4.$(O) - -lex.swf5.$(O): lex.swf5.c - $(C) lex.swf5.c -o lex.swf5.$(O) - -compile.$(O): compile.c compile.h libming.h action.h blocks/error.h - $(C) compile.c -o compile.$(O) - -listaction.$(O): listaction.c action.h compile.h - $(C) listaction.c -o listaction.$(O) - -actioncompiler.$(O): actioncompiler.c compile.h action.h libming.h - $(C) actioncompiler.c -o actioncompiler.$(O) - -assembler.$(O): assembler.c compile.h action.h assembler.h - $(C) assembler.c -o assembler.$(O) - -swf4compiler.tab.$(O): swf4compiler.tab.c compile.h action.h assembler.h - $(C) swf4compiler.tab.c -o swf4compiler.tab.$(O) - -swf5compiler.tab.$(O): swf5compiler.tab.c compile.h action.h assembler.h - $(C) swf5compiler.tab.c -o swf5compiler.tab.$(O) - -libming.$(O): libming.c libming.h - $(C) libming.c -o libming.$(O) - -# === TESTING === - -test.$(O): test.c actioncompiler.h - $(C) test.c -o test.$(O) - -main.$(O): main.c - $(C) main.c -o main.$(O) - -OBJS = compile.$(O) listaction.$(O) lex.swf4.$(O) lex.swf5.$(O) swf5compiler.tab.$(O) swf4compiler.tab.$(O) assembler.$(O) actioncompiler.$(O) -main: main.$(O) $(OBJS) - $(L) -o main main.$(O) $(OBJS) $(LIBS) - -test: test.$(O) $(OBJECTS) - $(L) -o test $(OBJECTS) test.$(O) ../librfxswf$(A) -lm -ljpeg -lz -lt1 -lfreetype - -# === CLEANING === - -clean: - rm -f $(OBJECTS) compiler compiler.exe core test main main.$(O) *~ gmon.out - -distclean: clean - rm -f $(GENERATED) swf*compiler.tab.* lex*.c - -.PHONY: clean,distclean,all,generated diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile.in deleted file mode 100644 index 9ff5c9b61..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/Makefile.in +++ /dev/null @@ -1,95 +0,0 @@ -top_builddir = ../.. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -include ../../Makefile.common - -# in case we need to get more information out of bison -#BISONDEBUG = --debug -# In case we need to get more information out of flex -#FLEXDEBUG = -d - -OBJECTS = compile.$(O) \ - lex.swf4.$(O) lex.swf5.$(O) swf5compiler.tab.$(O) swf4compiler.tab.$(O) \ - assembler.$(O) libming.$(O) actioncompiler.$(O) - -COMPILER_FILES = action.h assembler.c assembler.h compile.c compile.h \ - listaction.c swf4compiler.flex swf4compiler.y swf5compiler.flex swf5compiler.y - -GENERATED = lex.swf4.c lex.swf5.c swf5compiler.tab.c swf4compiler.tab.c - -all: $(OBJECTS) -generated: $(GENERATED) - -# === GENERATED FILES === - -swf5compiler.tab.c: swf5compiler.y - bison -p swf5 swf5compiler.y - -swf5compiler.tab.h: swf5compiler.y - bison --defines $(BISONDEBUG) -p swf5 swf5compiler.y - -swf4compiler.tab.c: swf4compiler.y - bison -p swf4 swf4compiler.y - -swf4compiler.tab.h: swf4compiler.y - bison --defines $(BISONDEBUG) -p swf4 swf4compiler.y - -lex.swf4.c: swf4compiler.flex swf4compiler.tab.h - flex $(FLEXDEBUG) -i -Pswf4 swf4compiler.flex - -lex.swf5.c: swf5compiler.flex swf5compiler.tab.h - flex $(FLEXDEBUG) -i -Pswf5 swf5compiler.flex - -# === OBJECTS === - -lex.swf4.$(O): lex.swf4.c - $(C) lex.swf4.c -o lex.swf4.$(O) - -lex.swf5.$(O): lex.swf5.c - $(C) lex.swf5.c -o lex.swf5.$(O) - -compile.$(O): compile.c compile.h libming.h action.h blocks/error.h - $(C) compile.c -o compile.$(O) - -listaction.$(O): listaction.c action.h compile.h - $(C) listaction.c -o listaction.$(O) - -actioncompiler.$(O): actioncompiler.c compile.h action.h libming.h - $(C) actioncompiler.c -o actioncompiler.$(O) - -assembler.$(O): assembler.c compile.h action.h assembler.h - $(C) assembler.c -o assembler.$(O) - -swf4compiler.tab.$(O): swf4compiler.tab.c compile.h action.h assembler.h - $(C) swf4compiler.tab.c -o swf4compiler.tab.$(O) - -swf5compiler.tab.$(O): swf5compiler.tab.c compile.h action.h assembler.h - $(C) swf5compiler.tab.c -o swf5compiler.tab.$(O) - -libming.$(O): libming.c libming.h - $(C) libming.c -o libming.$(O) - -# === TESTING === - -test.$(O): test.c actioncompiler.h - $(C) test.c -o test.$(O) - -main.$(O): main.c - $(C) main.c -o main.$(O) - -OBJS = compile.$(O) listaction.$(O) lex.swf4.$(O) lex.swf5.$(O) swf5compiler.tab.$(O) swf4compiler.tab.$(O) assembler.$(O) actioncompiler.$(O) -main: main.$(O) $(OBJS) - $(L) -o main main.$(O) $(OBJS) $(LIBS) - -test: test.$(O) $(OBJECTS) - $(L) -o test $(OBJECTS) test.$(O) ../librfxswf$(A) -lm -ljpeg -lz -lt1 -lfreetype - -# === CLEANING === - -clean: - rm -f $(OBJECTS) compiler compiler.exe core test main main.$(O) *~ gmon.out - -distclean: clean - rm -f $(GENERATED) swf*compiler.tab.* lex*.c - -.PHONY: clean,distclean,all,generated diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/action.h b/fluidbook/tools/swftools-special-swfdump/lib/action/action.h deleted file mode 100644 index 8b844ef16..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/action.h +++ /dev/null @@ -1,119 +0,0 @@ -/* action.h - * - * $Id: action.h,v 1.1 2004/05/08 17:09:35 kramm Exp $ - * - * Notice: This header file contains declarations of functions and types that - * are just used internally. All library functions and types that are supposed - * to be publicly accessable are defined in ./src/ming.h. - */ - -#ifndef SWF_COMPILER_ACTION_H_INCLUDED -#define SWF_COMPILER_ACTION_H_INCLUDED - -#include "ming.h" - -enum -{ - SWFACTION_END = 0x00, - -/* v3 actions */ - SWFACTION_NEXTFRAME = 0x04, - SWFACTION_PREVFRAME = 0x05, - SWFACTION_PLAY = 0x06, - SWFACTION_STOP = 0x07, - SWFACTION_TOGGLEQUALITY = 0x08, - SWFACTION_STOPSOUNDS = 0x09, - SWFACTION_GOTOFRAME = 0x81, /* >= 0x80 means record has args */ - SWFACTION_GETURL = 0x83, - SWFACTION_WAITFORFRAME = 0x8A, - SWFACTION_SETTARGET = 0x8B, - SWFACTION_GOTOLABEL = 0x8C, - -/* v4 actions */ - SWFACTION_ADD = 0x0A, - SWFACTION_SUBTRACT = 0x0B, - SWFACTION_MULTIPLY = 0x0C, - SWFACTION_DIVIDE = 0x0D, - SWFACTION_EQUAL = 0x0E, - SWFACTION_LESSTHAN = 0x0F, - SWFACTION_LOGICALAND = 0x10, - SWFACTION_LOGICALOR = 0x11, - SWFACTION_LOGICALNOT = 0x12, - SWFACTION_STRINGEQ = 0x13, - SWFACTION_STRINGLENGTH = 0x14, - SWFACTION_SUBSTRING = 0x15, - SWFACTION_POP = 0x17, - SWFACTION_INT = 0x18, - SWFACTION_GETVARIABLE = 0x1C, - SWFACTION_SETVARIABLE = 0x1D, - SWFACTION_SETTARGETEXPRESSION = 0x20, - SWFACTION_STRINGCONCAT = 0x21, - SWFACTION_GETPROPERTY = 0x22, - SWFACTION_SETPROPERTY = 0x23, - SWFACTION_DUPLICATECLIP = 0x24, - SWFACTION_REMOVECLIP = 0x25, - SWFACTION_TRACE = 0x26, - SWFACTION_STARTDRAGMOVIE = 0x27, - SWFACTION_STOPDRAGMOVIE = 0x28, - SWFACTION_STRINGCOMPARE = 0x29, - SWFACTION_RANDOM = 0x30, - SWFACTION_MBLENGTH = 0x31, - SWFACTION_ORD = 0x32, - SWFACTION_CHR = 0x33, - SWFACTION_GETTIMER = 0x34, - SWFACTION_MBSUBSTRING = 0x35, - SWFACTION_MBORD = 0x36, - SWFACTION_MBCHR = 0x37, - - SWFACTION_WAITFORFRAMEEXPRESSION = 0x8D, - SWFACTION_PUSHDATA = 0x96, - SWFACTION_BRANCHALWAYS = 0x99, - SWFACTION_GETURL2 = 0x9A, - SWFACTION_BRANCHIFTRUE = 0x9D, - SWFACTION_CALLFRAME = 0x9E, - SWFACTION_GOTOEXPRESSION = 0x9F, - -/* v5 actions */ - SWFACTION_DELETEVAR = 0x3A,/*not used yet*/ - SWFACTION_DELETE = 0x3B, - SWFACTION_VAREQUALS = 0x3C, - SWFACTION_CALLFUNCTION = 0x3D, - SWFACTION_RETURN = 0x3E, - SWFACTION_MODULO = 0x3F, - SWFACTION_NEW = 0x40, - SWFACTION_VAR = 0x41, - SWFACTION_INITARRAY = 0x42, - SWFACTION_INITOBJECT = 0x43, - SWFACTION_TYPEOF = 0x44, - SWFACTION_TARGETPATH = 0x45, - SWFACTION_ENUMERATE = 0x46, - SWFACTION_NEWADD = 0x47, - SWFACTION_NEWLESSTHAN = 0x48, - SWFACTION_NEWEQUALS = 0x49, - SWFACTION_TONUMBER = 0x4A, - SWFACTION_TOSTRING = 0x4B, - SWFACTION_DUP = 0x4C, - SWFACTION_SWAP = 0x4D, - SWFACTION_GETMEMBER = 0x4E, - SWFACTION_SETMEMBER = 0x4F, - SWFACTION_INCREMENT = 0x50, - SWFACTION_DECREMENT = 0x51, - SWFACTION_CALLMETHOD = 0x52, - SWFACTION_NEWMETHOD = 0x53,/*not used yet*/ - SWFACTION_INSTANCEOF = 0x54, - SWFACTION_ENUM2 = 0x55,/*not used yet*/ - SWFACTION_BITWISEAND = 0x60, - SWFACTION_BITWISEOR = 0x61, - SWFACTION_BITWISEXOR = 0x62, - SWFACTION_SHIFTLEFT = 0x63, - SWFACTION_SHIFTRIGHT = 0x64, - SWFACTION_SHIFTRIGHT2 = 0x65, - SWFACTION_STRICTEQ = 0x66, - SWFACTION_CONSTANTPOOL = 0x88, - SWFACTION_WITH = 0x94, - SWFACTION_DEFINEFUNCTION = 0x9B, - - SWFACTION_SETREGISTER = 0x87 -}; - -#endif /* SWF_COMPILER_ACTION_H_INCLUDED */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.c b/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.c deleted file mode 100644 index 9edc59046..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - Ming, an SWF output library - Copyright (C) 2002 Opaque Industries - http://www.opaque.net/ - - 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 2.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include -#include -#include -#include - -#include "libming.h" -#include "compile.h" -#include "action.h" - -#include "actioncompiler.h" - -static void print_error(const char*format,...) -{ - char buf[1024]; - int len; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - - len = strlen(buf); - while(len>0 && buf[len-1]=='\n') len--; - buf[len] = '\n'; - buf[len+1] = 0; - fprintf(stderr, "error: %s", buf); -} - -static void print_warn(const char*format,...) -{ - char buf[1024]; - int len; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - - len = strlen(buf); - while(len>0 && buf[len-1]=='\n') len--; - buf[len] = '\n'; - buf[len+1] = 0; - printf("%s", buf); - fprintf(stderr, "warning: %s", buf); -} - -int compileSWFActionCode(const char *script, int version, void**data, int*len) -{ - Buffer b; - - *data = 0; - *len = 0; - - SWF_versionNum = version; - if(!SWF_error) - SWF_error = print_error; - if(!SWF_warn) - SWF_warn = print_warn; - - /* yydebug = 1; */ - - if(version == 4) - { - swf4ParseInit(script, 0); - - if(swf4parse((void *)&b) != 0) - return 0; - } - else - { - swf5ParseInit(script, 0); - - if(swf5parse((void *)&b) != 0) - return 0; - } - - *data = b->buffer; - *len = bufferLength(b); - - //destroyBuffer(b); - free(b); - - return 1; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.h b/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.h deleted file mode 100644 index 30da45f11..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/actioncompiler.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __actioncompiler_h__ -#define __actioncompiler_h__ - -int compileSWFActionCode(const char *script, int version, void**data, int*len); - -#endif - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.c b/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.c deleted file mode 100644 index 8526e9990..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - Ming, an SWF output library - Copyright (C) 2002 Opaque Industries - http://www.opaque.net/ - - 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 2.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include -#include -#include -#include "assembler.h" -#include "compile.h" -#include "action.h" - - -int len; -Buffer asmBuffer; -int nLabels; - -struct label -{ - char *name; - int offset; -}; - -struct label labels[256]; - - -static int -findLabel(char *label) -{ - int i; - - for ( i=0; ibuffer; - - while ( i < len ) - { - if ( output[i] & 0x80 ) /* then it's a multibyte instruction */ - { - if ( output[i] == SWFACTION_BRANCHALWAYS || - output[i] == SWFACTION_BRANCHIFTRUE ) - { - int target, offset; - - i += 3; /* plus instruction plus two-byte length */ - - target = output[i]; - offset = labels[target].offset - (i+2); - output[i] = offset & 0xff; - output[++i] = (offset>>8) & 0xff; - ++i; - } - else - { - ++i; - l = output[i]; - ++i; - l += output[i]<<8; - - i += l+1; - } - } - else - ++i; - } -} - - -/* - * Local variables: - * tab-width: 2 - * c-basic-offset: 2 - * End: - */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.h b/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.h deleted file mode 100644 index e1fdd2a67..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/assembler.h +++ /dev/null @@ -1,21 +0,0 @@ -/* assembler.h - * - * $Id: assembler.h,v 1.1 2004/05/08 17:11:33 kramm Exp $ - * - * Notice: This header file contains declarations of functions and types that - * are just used internally. All library functions and types that are supposed - * to be publicly accessable are defined in ./src/ming.h. - */ - -#ifndef SWF_ASSEMBLER_H_INCLUDED -#define SWF_ASSEMBLER_H_INCLUDED - -#include "ming.h" -#include "compile.h" - -extern Buffer asmBuffer; - -void bufferPatchLength(Buffer buffer, int len); -int bufferBranchTarget(Buffer buffer, char *label); - -#endif /* SWF_ASSEMBLER_H_INCLUDED */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/blocks/error.h b/fluidbook/tools/swftools-special-swfdump/lib/action/blocks/error.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/compile.c b/fluidbook/tools/swftools-special-swfdump/lib/action/compile.c deleted file mode 100644 index b658dd2ee..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/compile.c +++ /dev/null @@ -1,786 +0,0 @@ -/* - Ming, an SWF output library - Copyright (C) 2002 Opaque Industries - http://www.opaque.net/ - - 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 2.1 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef WIN32 - #include -#endif - -#include -#include -#include -#include - -#include "libming.h" -#include "compile.h" -#include "action.h" -#include "blocks/error.h" - - -static int nConstants = {0}, maxConstants = {0}, sizeConstants = {0}; -static char **constants; - -/* XXX - temp hack until we check at compile time */ - -enum -{ - SWF_BIG_ENDIAN, - SWF_LITTLE_ENDIAN -}; - -static int byteorder; - -void checkByteOrder() -{ - unsigned int x; - unsigned char *p; - - x = 0x01020304; - p = (unsigned char *)&x; - - if(*p == 1) - byteorder = SWF_BIG_ENDIAN; - else - byteorder = SWF_LITTLE_ENDIAN; -} - - -char *stringConcat(char *a, char *b) -{ - if ( a != NULL ) - { - if ( b != NULL ) - { - a = (char*)realloc(a, strlen(a)+strlen(b)+1); - strcat(a, b); - free(b); - } - - return a; - } - else - return b; -} - -void bufferPatchLength(Buffer buffer, int back) -{ - unsigned char *output = buffer->buffer; - int len = bufferLength(buffer); - - output[len-back-1] = (back>>8) & 0xff; - output[len-back-2] = back & 0xff; -} - - -/* add len more bytes to length of the pushdata opcode pointed to by - buffer->pushloc */ - -void bufferPatchPushLength(Buffer buffer, int len) -{ - int oldsize; - - if(buffer->pushloc != NULL) - { - oldsize = (buffer->pushloc[0] & 0xff) | ((buffer->pushloc[1] & 0xff) << 8); - oldsize += len; - buffer->pushloc[0] = oldsize & 0xff; - buffer->pushloc[1] = (oldsize >> 8) & 0xff; - } - else - SWF_error("problem with bufferPatchPushLength\n"); -} - - -static int useConstants = 1; -void Ming_useConstants(int flag) -{ useConstants = flag; -} - - -int addConstant(const char *s) -{ - int i; - - for(i=0; i MAXCONSTANTPOOLSIZE ) return -1; - - if(nConstants == maxConstants) - constants = (char **) realloc(constants, (maxConstants += 64) * sizeof(char *)); - constants[nConstants] = strdup(s); - sizeConstants += (strlen(s)+1); - return nConstants++; -} - -int bufferWriteConstants(Buffer out) -{ - int i, len=2; - - if(nConstants == 0) - return 0; - - bufferWriteU8(out, SWFACTION_CONSTANTPOOL); - bufferWriteS16(out, 0); /* length */ - bufferWriteS16(out, nConstants); - - for(i=0; ibuffer = (byte*)malloc(BUFFER_INCREMENT); - out->pos = out->buffer; - *(out->pos) = 0; - out->buffersize = out->free = BUFFER_INCREMENT; - out->pushloc = NULL; - - return out; -} - -void destroyBuffer(Buffer out) -{ - free(out->buffer); - free(out); -} - -int bufferLength(Buffer out) -{ - if(out) - return (out->pos)-(out->buffer); - else - return 0; -} - -/* make sure there's enough space for bytes bytes */ -void bufferCheckSize(Buffer out, int bytes) -{ - if(bytes > out->free) - { - int New = BUFFER_INCREMENT * ((bytes-out->free-1)/BUFFER_INCREMENT + 1); - - int num = bufferLength(out); /* in case buffer gets displaced.. */ - unsigned char *newbuf = (unsigned char*)realloc(out->buffer, out->buffersize+New); - - if(newbuf != out->buffer) - { - int pushd; - - if(out->pushloc) - pushd = out->pos - out->pushloc; - - out->pos = newbuf+num; - - if(out->pushloc) - out->pushloc = out->pos - pushd; - } - - out->buffer = newbuf; - out->buffersize += New; - out->free += New; - } -} - -int bufferWriteData(Buffer b, const byte *data, int length) -{ - int i; - - bufferCheckSize(b, length); - - for(i=0; ibuffer, bufferLength(b)); - - return 0; -} - -/* if a's last op and b's first op are both PUSHDATA, concat into one op */ - -int bufferWriteDataAndPush(Buffer a, Buffer b) -{ - int i, pushd; - - byte *data = b->buffer; - int length = b->pos - b->buffer; - - if(a->pushloc && (b->buffer[0] == SWFACTION_PUSHDATA) && SWF_versionNum > 4) - { - pushd = (b->buffer[1] & 0xff) | ((b->buffer[2] & 0xff) << 8); - bufferPatchPushLength(a, pushd); - data += 3; - length -= 3; - } - - if(b->pushloc) - pushd = b->pos - b->pushloc; - - bufferCheckSize(a, length); - - for(i=0; ipushloc && - (b->buffer[0] == SWFACTION_PUSHDATA) && (b->pushloc == b->buffer+1)) - ; /* b is just one pushdata, so do nothing.. */ - else if(b->pushloc) - a->pushloc = a->pos - pushd; - else - a->pushloc = 0; - - return length; -} - -int bufferConcat(Buffer a, Buffer b) -{ - int len; - - if(!a) - return 0; - - if(b) - { len = bufferWriteDataAndPush(a, b); - destroyBuffer(b); - } - - return len; -} - -int bufferWriteOp(Buffer out, int data) -{ - bufferWriteU8(out, data); - out->pushloc = NULL; - - return 1; -} - -int bufferWritePushOp(Buffer out) -{ - bufferWriteU8(out, SWFACTION_PUSHDATA); - out->pushloc = out->pos; - - return 1; -} - -int bufferWriteU8(Buffer out, int data) -{ - bufferCheckSize(out, 1); - *(out->pos) = data; - out->pos++; - out->free--; - - return 1; -} - -int bufferWriteS16(Buffer out, int data) -{ - if(data < 0) - data = (1<<16)+data; - - bufferWriteU8(out, data%256); - data >>= 8; - bufferWriteU8(out, data%256); - - return 2; -} - -int bufferWriteHardString(Buffer out, byte *string, int length) -{ - int i; - - for(i=0; ipushloc == NULL) - { - bufferWritePushOp(out); - bufferWriteS16(out, 0); - } - - l = bufferWriteConstantString(out, string, length); - - bufferPatchPushLength(out, l); - return l; - } -} - -int bufferWriteInt(Buffer out, int i) -{ - int len = 0; - unsigned char *p = (unsigned char *)&i; - - if(out->pushloc == NULL || SWF_versionNum < 5) - { - len = 3; - bufferWritePushOp(out); - bufferWriteS16(out, 5); - } - else - bufferPatchPushLength(out, 5); - - bufferWriteU8(out, PUSH_INT); - - if(byteorder == SWF_LITTLE_ENDIAN) - { - bufferWriteU8(out, p[0]); - bufferWriteU8(out, p[1]); - bufferWriteU8(out, p[2]); - bufferWriteU8(out, p[3]); - } - else - { - bufferWriteU8(out, p[3]); - bufferWriteU8(out, p[2]); - bufferWriteU8(out, p[1]); - bufferWriteU8(out, p[0]); - } - - return len + 5; -} - -int bufferWriteDouble(Buffer out, double d) -{ - int len = 0; - unsigned char *p = (unsigned char *)&d; - - if(out->pushloc == NULL || SWF_versionNum < 5) - { - len = 3; - bufferWritePushOp(out); - bufferWriteS16(out, 9); - } - else - bufferPatchPushLength(out, 5); - - bufferWriteU8(out, PUSH_DOUBLE); - - if(byteorder == SWF_LITTLE_ENDIAN) - { - bufferWriteU8(out, p[4]); - bufferWriteU8(out, p[5]); - bufferWriteU8(out, p[6]); - bufferWriteU8(out, p[7]); - bufferWriteU8(out, p[0]); - bufferWriteU8(out, p[1]); - bufferWriteU8(out, p[2]); - bufferWriteU8(out, p[3]); - } - else - { - bufferWriteU8(out, p[3]); - bufferWriteU8(out, p[2]); - bufferWriteU8(out, p[1]); - bufferWriteU8(out, p[0]); - bufferWriteU8(out, p[7]); - bufferWriteU8(out, p[6]); - bufferWriteU8(out, p[5]); - bufferWriteU8(out, p[4]); - } - - return len + 9; -} - -int bufferWriteNull(Buffer out) -{ - int len = 0; - - if(out->pushloc == NULL || SWF_versionNum < 5) - { - len = 3; - bufferWritePushOp(out); - bufferWriteS16(out, 1); - } - else - bufferPatchPushLength(out, 1); - - bufferWriteU8(out, PUSH_NULL); - - return len + 1; -} - -int bufferWriteBoolean(Buffer out, int val) -{ - int len = 0; - - if(out->pushloc == NULL || SWF_versionNum < 5) - { - len = 3; - bufferWritePushOp(out); - bufferWriteS16(out, 2); - } - else - bufferPatchPushLength(out, 2); - - bufferWriteU8(out, PUSH_BOOLEAN); - bufferWriteU8(out, val ? 1 : 0); - - return len + 2; -} - -int bufferWriteRegister(Buffer out, int num) -{ - int len = 0; - - if(out->pushloc == NULL || SWF_versionNum < 5) - { - len = 3; - bufferWritePushOp(out); - bufferWriteS16(out, 2); - } - else - bufferPatchPushLength(out, 2); - - bufferWriteU8(out, PUSH_REGISTER); - bufferWriteU8(out, num); - - return len + 2; -} - -int bufferWriteSetRegister(Buffer out, int num) -{ - bufferWriteU8(out, SWFACTION_SETREGISTER); - bufferWriteS16(out, 1); - bufferWriteU8(out, num); - return 4; -} - -void lower(char *s) -{ - while(*s) - { - *s = tolower(*s); - ++s; - } -} - -/* this code will eventually help to pop extra values off the - stack and make sure that continue and break address the proper - context - */ -static enum ctx *ctx_stack = {0}; -static int ctx_count = {0}, ctx_len = {0}; -void addctx(enum ctx val) -{ if(ctx_count >= ctx_len) - ctx_stack = (enum ctx*) realloc(ctx_stack, (ctx_len += 10) * sizeof(enum ctx)); - ctx_stack[ctx_count++] = val; -} -void delctx(enum ctx val) -{ if(ctx_count <= 0 || ctx_stack[--ctx_count] != val) - SWF_error("consistency check in delctx"); -} - -int chkctx(enum ctx val) -{ int n, ret = 0; - switch(val) - { case CTX_FUNCTION: - for(n = ctx_count ; --n >= 0 ; ) - switch(ctx_stack[n]) - { case CTX_SWITCH: - case CTX_FOR_IN: - ret++; - break; - case CTX_FUNCTION: - return ret; - default: ; /* computers are stupid */ - } - return -1; - case CTX_BREAK: - for(n = ctx_count ; --n >= 0 ; ) - switch(ctx_stack[n]) - { case CTX_SWITCH: - case CTX_LOOP: - return 0; - case CTX_FOR_IN: - return 1; - case CTX_FUNCTION: - return -1; - default: ; /* computers are stupid */ - } - case CTX_CONTINUE: - for(n = ctx_count ; --n >= 0 ; ) - switch(ctx_stack[n]) - { case CTX_LOOP: - case CTX_FOR_IN: - return 0; - case CTX_FUNCTION: - return -1; - default: ; /* computers are stupid */ - } - default: ; /* computers are stupid */ - } - return 0; -} - -/* replace MAGIC_CONTINUE_NUMBER and MAGIC_BREAK_NUMBER with jumps to - head or tail, respectively */ -/* jump offset is relative to end of jump instruction */ -/* I can't believe this actually worked */ - -void bufferResolveJumps(Buffer out) -{ - byte *p = out->buffer; - int l, target; - - while(p < out->pos) - { - if(*p & 0x80) /* then it's a multibyte instruction */ - { - if(*p == SWFACTION_BRANCHALWAYS) - { - p += 3; /* plus instruction plus two-byte length */ - - if(*p == MAGIC_CONTINUE_NUMBER_LO && - *(p+1) == MAGIC_CONTINUE_NUMBER_HI) - { - target = out->buffer - (p+2); - *p = target & 0xff; - *(p+1) = (target>>8) & 0xff; - } - else if(*p == MAGIC_BREAK_NUMBER_LO && - *(p+1) == MAGIC_BREAK_NUMBER_HI) - { - target = out->pos - (p+2); - *p = target & 0xff; - *(p+1) = (target>>8) & 0xff; - } - - p += 2; - } - else - { - ++p; - l = *p; - ++p; - l += *p<<8; - ++p; - - p += l; - } - } - else - ++p; - } -} - -// handle SWITCH statement - -void bufferResolveSwitch(Buffer buffer, struct switchcases *slp) -{ struct switchcase *scp; - int n, len; - unsigned char *output; - - len = bufferLength(buffer); - for(n = 0, scp = slp->list ; n < slp->count ; n++, scp++) - { scp->actlen = bufferLength(scp->action); - if((n < slp->count-1)) - scp->actlen += 5; - if(scp->cond) - { scp->condlen = bufferLength(scp->cond) + 8; - bufferWriteOp(buffer, SWFACTION_DUP); - bufferConcat(buffer, scp->cond); - bufferWriteOp(buffer, SWFACTION_NEWEQUALS); - bufferWriteOp(buffer, SWFACTION_LOGICALNOT); - bufferWriteOp(buffer, SWFACTION_BRANCHIFTRUE); - bufferWriteS16(buffer, 2); - bufferWriteS16(buffer, scp->actlen); - } - else - scp->condlen = 0; - bufferConcat(buffer, scp->action); - bufferWriteOp(buffer, SWFACTION_BRANCHALWAYS); - bufferWriteS16(buffer, 2); - bufferWriteS16(buffer, scp->isbreak ? MAGIC_BREAK_NUMBER : 0); - if(!scp->cond) - { slp->count = n+1; - break; - } - } - for(n = 0, scp = slp->list ; n < slp->count ; n++, scp++) - { len += scp->condlen; - output = buffer->buffer + len; - if((n < slp->count-1) && !scp->isbreak) - { output[scp->actlen-2] = (scp+1)->condlen & 0xff; - output[scp->actlen-1] = (scp+1)->condlen >> 8; - } - len += scp->actlen; - } -} - -int lookupSetProperty(char *string) -{ - lower(string); - - if(strcmp(string,"x")==0) return 0x0000; - if(strcmp(string,"y")==0) return 0x3f80; - if(strcmp(string,"xscale")==0) return 0x4000; - if(strcmp(string,"yscale")==0) return 0x4040; - if(strcmp(string,"alpha")==0) return 0x40c0; - if(strcmp(string,"visible")==0) return 0x40e0; - if(strcmp(string,"rotation")==0) return 0x4120; - if(strcmp(string,"name")==0) return 0x4140; - if(strcmp(string,"quality")==0) return 0x4180; - if(strcmp(string,"focusrect")==0) return 0x4188; - if(strcmp(string,"soundbuftime")==0) return 0x4190; - - SWF_error("No such property: %s\n", string); - return -1; -} - -int bufferWriteSetProperty(Buffer out, char *string) -{ - int property = lookupSetProperty(string); - - bufferWriteU8(out, SWFACTION_PUSHDATA); - bufferWriteS16(out, 5); - bufferWriteU8(out, PUSH_PROPERTY); - bufferWriteS16(out, 0); - bufferWriteS16(out, property); - - return 8; -} - -int bufferWriteWTHITProperty(Buffer out) -{ - bufferWriteU8(out, SWFACTION_PUSHDATA); - bufferWriteS16(out, 5); - bufferWriteU8(out, PUSH_PROPERTY); - bufferWriteS16(out, 0); - bufferWriteS16(out, 0x4680); - - return 8; -} - -const char *lookupGetProperty(char *string) -{ - lower(string); - - if(strcmp(string,"x")==0) return "0"; - if(strcmp(string,"y")==0) return "1"; - if(strcmp(string,"xscale")==0) return "2"; - if(strcmp(string,"yscale")==0) return "3"; - if(strcmp(string,"currentframe")==0) return "4"; - if(strcmp(string,"totalframes")==0) return "5"; - if(strcmp(string,"alpha")==0) return "6"; - if(strcmp(string,"visible")==0) return "7"; - if(strcmp(string,"width")==0) return "8"; - if(strcmp(string,"height")==0) return "9"; - if(strcmp(string,"rotation")==0) return "10"; - if(strcmp(string,"target")==0) return "11"; - if(strcmp(string,"framesloaded")==0) return "12"; - if(strcmp(string,"name")==0) return "13"; - if(strcmp(string,"droptarget")==0) return "14"; - if(strcmp(string,"url")==0) return "15"; - if(strcmp(string,"quality")==0) return "16"; - if(strcmp(string,"focusrect")==0) return "17"; - if(strcmp(string,"soundbuftime")==0) return "18"; - - SWF_error("No such property: %s\n", string); - return ""; -} - -int bufferWriteGetProperty(Buffer out, char *string) -{ - const char *property = lookupGetProperty(string); - - bufferWriteU8(out, SWFACTION_PUSHDATA); - bufferWriteS16(out, strlen(property)+2); - bufferWriteU8(out, PUSH_STRING); - - return 4 + bufferWriteData(out, (byte*) property, strlen(property)+1); -} - - -/* - * Local variables: - * tab-width: 2 - * c-basic-offset: 2 - * End: - */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/compile.h b/fluidbook/tools/swftools-special-swfdump/lib/action/compile.h deleted file mode 100644 index 3f3f1d441..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/compile.h +++ /dev/null @@ -1,163 +0,0 @@ -/* compile.h - * - * $Id: compile.h,v 1.1 2004/05/08 17:14:20 kramm Exp $ - * - * Notice: This header file contains declarations of functions and types that - * are just used internally. All library functions and types that are supposed - * to be publicly accessable are defined in ./src/ming.h. - */ - -#ifndef SWF_COMPILE_H_INCLUDED -#define SWF_COMPILE_H_INCLUDED - -#include "ming.h" - -typedef struct _buffer *Buffer; - -/* shut up bison.simple */ -void yyerror(char *msg); -int yylex(); - -#ifndef max - #define max(x,y) (((x)>(y))?(x):(y)) -#endif - -enum -{ - PUSH_STRING = 0, - PUSH_PROPERTY = 1, - PUSH_NULL = 2, - PUSH_UNDEF = 3, - PUSH_REGISTER = 4, - PUSH_BOOLEAN = 5, - PUSH_DOUBLE = 6, - PUSH_INT = 7, - PUSH_CONSTANT = 8, - PUSH_CONSTANT16 = 9 -}; - -typedef enum -{ - FUNCTION_RANDOM, - FUNCTION_LENGTH, - FUNCTION_TIME, - FUNCTION_INT, - FUNCTION_CONCAT, - FUNCTION_DUPLICATECLIP -} SWFActionFunction; - -typedef enum -{ - GETURL_METHOD_NOSEND = 0, - GETURL_METHOD_GET = 1, - GETURL_METHOD_POST = 2 -} SWFGetUrl2Method; - -#define GETURL_LOADMOVIE 0x40 -#define GETURL_LOADVARIABLES 0x80 - -#define MAGIC_CONTINUE_NUMBER 0x7FFE -#define MAGIC_BREAK_NUMBER 0x7FFF - -#define MAGIC_CONTINUE_NUMBER_LO 0xFE -#define MAGIC_CONTINUE_NUMBER_HI 0x7F -#define MAGIC_BREAK_NUMBER_LO 0xFF -#define MAGIC_BREAK_NUMBER_HI 0x7F - -#define BUFFER_INCREMENT 128 - -struct _buffer -{ - byte *buffer; - byte *pos; - int buffersize; - int free; - byte *pushloc; -}; - -#define BUFFER_SIZE sizeof(struct _buffer) - -struct switchcase -{ Buffer cond, action; - int condlen, actlen, isbreak; -}; - -struct switchcases -{ - struct switchcase *list; - int count; -}; - -enum ctx -{ - CTX_FUNCTION = 1, - CTX_LOOP, - CTX_FOR_IN, - CTX_SWITCH, - - CTX_BREAK, - CTX_CONTINUE -}; - -void addctx(enum ctx val); -void delctx(enum ctx val); -int chkctx(enum ctx val); - -void checkByteOrder(); - -/* create/destroy buffer object */ -Buffer newBuffer(); -void destroyBuffer(Buffer out); -int bufferConcat(Buffer a, Buffer b); /* destroys b. */ -int bufferWriteBuffer(Buffer a, Buffer b); /* doesn't. */ - -/* utilities for writing */ -void bufferGrow(Buffer out); -void bufferCheckSize(Buffer out, int bytes); - -int bufferLength(Buffer out); - -/* constant pool stuff */ -int addConstant(const char *s); -int bufferWriteConstants(Buffer out); -#define MAXCONSTANTPOOLSIZE 65533 - -/* write data to buffer */ -int bufferWriteOp(Buffer out, int data); -int bufferWritePushOp(Buffer out); -int bufferWriteU8(Buffer out, int data); -int bufferWriteS16(Buffer out, int data); -int bufferWriteData(Buffer out, const byte *buffer, int bytes); -int bufferWriteHardString(Buffer out, byte *string, int length); -int bufferWriteConstantString(Buffer out, byte *string, int length); -int bufferWriteString(Buffer out, byte *string, int length); -#ifdef __cplusplus -/* helper function to avoid many casts */ -inline int bufferWriteString(Buffer out, char *string, int length) { - return bufferWriteString(out,(byte*) string, length); } -#endif -int bufferWriteInt(Buffer out, int i); -int bufferWriteDouble(Buffer out, double d); -int bufferWriteNull(Buffer out); -int bufferWriteBoolean(Buffer out, int val); -int bufferWriteRegister(Buffer out, int num); -int bufferWriteSetRegister(Buffer out, int num); -int bufferWriteGetProperty(Buffer out, char *string); -int bufferWriteSetProperty(Buffer out, char *string); -int bufferWriteWTHITProperty(Buffer out); - -/* concat b to a, destroy b */ -char *stringConcat(char *a, char *b); - -/* resolve magic number standins to relative offsets */ -void bufferResolveJumps(Buffer out); -void bufferResolveSwitch(Buffer buffer, struct switchcases *slp); - -/* rather than setting globals... */ -void swf4ParseInit(const char *string, int debug); -void swf5ParseInit(const char *string, int debug); - -int swf4parse(void *b); -int swf5parse(void *b); - -#endif /* SWF_COMPILE_H_INCLUDED */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/lex.swf4.c b/fluidbook/tools/swftools-special-swfdump/lib/action/lex.swf4.c deleted file mode 100644 index 4eb81d8db..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/lex.swf4.c +++ /dev/null @@ -1,2828 +0,0 @@ - -#line 3 "lex.swf4.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define yy_create_buffer swf4_create_buffer -#define yy_delete_buffer swf4_delete_buffer -#define yy_flex_debug swf4_flex_debug -#define yy_init_buffer swf4_init_buffer -#define yy_flush_buffer swf4_flush_buffer -#define yy_load_buffer_state swf4_load_buffer_state -#define yy_switch_to_buffer swf4_switch_to_buffer -#define yyin swf4in -#define yyleng swf4leng -#define yylex swf4lex -#define yylineno swf4lineno -#define yyout swf4out -#define yyrestart swf4restart -#define yytext swf4text -#define yywrap swf4wrap -#define yyalloc swf4alloc -#define yyrealloc swf4realloc -#define yyfree swf4free - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* 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; -#endif /* ! C99 */ - -/* 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 - -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* 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 swf4restart(swf4in ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#define YY_BUF_SIZE 16384 -#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 - -extern int swf4leng; - -extern FILE *swf4in, *swf4out; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up swf4text. */ \ - 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 swf4text again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, (yytext_ptr) ) - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - 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. - */ - yy_size_t 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 swf4restart()), so that the user can continue scanning by - * just pointing swf4in at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* 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 = 0; /**< Stack as an array. */ - -/* 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)] - -/* yy_hold_char holds the character lost when swf4text is formed. */ -static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int swf4leng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow swf4wrap()'s to do buffer switches - * instead of setting up a fresh swf4in. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void swf4restart (FILE *input_file ); -void swf4_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE swf4_create_buffer (FILE *file,int size ); -void swf4_delete_buffer (YY_BUFFER_STATE b ); -void swf4_flush_buffer (YY_BUFFER_STATE b ); -void swf4push_buffer_state (YY_BUFFER_STATE new_buffer ); -void swf4pop_buffer_state (void ); - -static void swf4ensure_buffer_stack (void ); -static void swf4_load_buffer_state (void ); -static void swf4_init_buffer (YY_BUFFER_STATE b,FILE *file ); - -#define YY_FLUSH_BUFFER swf4_flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE swf4_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE swf4_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE swf4_scan_bytes (yyconst char *bytes,int len ); - -void *swf4alloc (yy_size_t ); -void *swf4realloc (void *,yy_size_t ); -void swf4free (void * ); - -#define yy_new_buffer swf4_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - swf4ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - swf4_create_buffer(swf4in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - swf4ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - swf4_create_buffer(swf4in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -typedef unsigned char YY_CHAR; - -FILE *swf4in = (FILE *) 0, *swf4out = (FILE *) 0; - -typedef int yy_state_type; - -extern int swf4lineno; - -int swf4lineno = 1; - -extern char *swf4text; -#define yytext_ptr swf4text - -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 yy_fatal_error (yyconst char msg[] ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up swf4text. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - swf4leng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 95 -#define YY_END_OF_BUFFER 96 -/* 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 yyconst flex_int16_t yy_accept[320] = - { 0, - 0, 0, 96, 94, 56, 93, 94, 82, 94, 79, - 94, 83, 84, 80, 77, 89, 78, 90, 81, 1, - 92, 75, 59, 76, 60, 91, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 85, 86, 87, 94, 88, 93, 64, - 0, 52, 50, 0, 65, 0, 53, 51, 0, 67, - 57, 69, 58, 70, 74, 0, 54, 48, 55, 68, - 48, 2, 1, 61, 63, 62, 0, 47, 47, 47, - 47, 47, 11, 47, 47, 47, 47, 47, 47, 47, - 9, 47, 47, 47, 47, 47, 47, 47, 47, 47, - - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 66, 72, 48, 48, 2, 73, 71, 49, - 49, 47, 47, 24, 47, 47, 47, 47, 8, 47, - 33, 47, 16, 47, 47, 47, 47, 23, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 49, 49, 47, 47, 47, - 47, 47, 7, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 37, 32, 47, 47, 47, 47, 47, 38, - 47, 47, 46, 14, 47, 47, 3, 47, 47, 5, - 47, 47, 47, 47, 4, 47, 47, 47, 47, 47, - - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 20, 47, 10, 47, 17, - 47, 47, 47, 47, 26, 47, 47, 15, 47, 47, - 47, 34, 47, 13, 47, 47, 47, 47, 47, 30, - 47, 47, 47, 47, 47, 47, 47, 47, 27, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 12, 47, 6, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 22, 47, 47, - 47, 25, 47, 47, 47, 47, 41, 28, 47, 35, - 36, 47, 44, 21, 47, 47, 47, 47, 47, 47, - - 47, 47, 19, 40, 45, 47, 47, 43, 31, 42, - 47, 47, 47, 47, 47, 18, 29, 39, 0 - } ; - -static yyconst flex_int32_t yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 5, 6, 1, 1, 1, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 17, - 17, 17, 17, 17, 17, 17, 17, 19, 20, 21, - 22, 23, 24, 1, 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, 34, - 50, 51, 52, 1, 34, 1, 53, 54, 55, 56, - - 57, 58, 59, 60, 61, 34, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 34, 77, 78, 79, 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, 1 - } ; - -static yyconst flex_int32_t yy_meta[80] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 1, 1, 1, 3, 4, 5, 5, 1, 1, - 1, 2, 1, 1, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, - 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 1, 1, 1 - } ; - -static yyconst flex_int16_t yy_base[327] = - { 0, - 0, 0, 878, 879, 879, 879, 874, 854, 77, 868, - 78, 879, 879, 852, 70, 879, 71, 72, 79, 81, - 879, 879, 851, 850, 849, 879, 854, 68, 81, 73, - 75, 91, 86, 84, 107, 111, 89, 139, 137, 138, - 164, 110, 116, 879, 879, 879, 791, 879, 879, 846, - 118, 153, 879, 864, 879, 100, 162, 879, 863, 879, - 879, 879, 879, 879, 849, 176, 879, 156, 879, 879, - 844, 167, 171, 836, 828, 879, 817, 815, 183, 184, - 185, 191, 814, 195, 198, 200, 201, 206, 202, 207, - 811, 216, 199, 223, 210, 212, 233, 228, 222, 250, - - 229, 234, 253, 261, 226, 259, 241, 256, 272, 280, - 274, 268, 879, 879, 809, 807, 291, 879, 879, 296, - 806, 288, 283, 805, 290, 299, 307, 300, 803, 302, - 310, 305, 800, 316, 312, 314, 322, 798, 332, 340, - 326, 337, 341, 343, 344, 333, 347, 338, 351, 362, - 367, 376, 373, 360, 379, 797, 796, 381, 380, 393, - 390, 396, 795, 404, 406, 408, 411, 409, 412, 428, - 424, 420, 794, 793, 429, 425, 432, 444, 431, 456, - 450, 452, 788, 779, 454, 457, 778, 477, 479, 776, - 473, 460, 433, 484, 773, 491, 493, 494, 487, 502, - - 503, 504, 463, 506, 512, 508, 521, 517, 513, 525, - 522, 533, 531, 535, 540, 769, 545, 753, 551, 712, - 549, 562, 550, 546, 101, 564, 577, 676, 563, 580, - 582, 675, 585, 670, 579, 574, 587, 592, 567, 648, - 598, 602, 607, 609, 603, 608, 625, 615, 645, 626, - 610, 635, 638, 611, 639, 641, 653, 637, 664, 643, - 667, 642, 612, 668, 529, 672, 678, 647, 669, 684, - 686, 693, 691, 695, 703, 696, 706, 497, 705, 701, - 719, 465, 711, 726, 715, 729, 439, 436, 723, 421, - 388, 731, 372, 353, 735, 737, 734, 740, 746, 741, - - 744, 752, 275, 267, 218, 763, 768, 203, 163, 158, - 771, 747, 759, 764, 757, 145, 93, 88, 879, 834, - 840, 845, 848, 851, 855, 858 - } ; - -static yyconst flex_int16_t yy_def[327] = - { 0, - 319, 1, 319, 319, 319, 319, 319, 319, 320, 319, - 321, 319, 319, 319, 319, 319, 319, 319, 322, 319, - 319, 319, 319, 319, 319, 319, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 319, 319, 319, 319, 319, 319, 319, - 320, 320, 319, 320, 319, 321, 321, 319, 321, 319, - 319, 319, 319, 319, 319, 322, 319, 319, 319, 319, - 324, 319, 319, 319, 319, 319, 325, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 319, 319, 319, 324, 319, 319, 319, 319, - 326, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 319, 326, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - - 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, 0, 319, - 319, 319, 319, 319, 319, 319 - } ; - -static yyconst flex_int16_t yy_nxt[959] = - { 0, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 27, 34, 27, 27, 35, 27, 36, 37, 38, - 27, 39, 40, 41, 27, 42, 43, 27, 27, 44, - 4, 45, 27, 28, 29, 30, 31, 32, 33, 27, - 34, 27, 35, 27, 36, 37, 38, 27, 39, 40, - 41, 27, 42, 43, 27, 27, 46, 47, 48, 52, - 57, 61, 53, 77, 63, 58, 65, 66, 77, 67, - 77, 62, 64, 68, 69, 72, 77, 73, 73, 77, - - 70, 77, 57, 77, 77, 80, 77, 58, 77, 79, - 85, 83, 81, 91, 89, 86, 77, 84, 249, 82, - 52, 92, 77, 53, 90, 77, 77, 54, 59, 87, - 97, 77, 88, 80, 111, 93, 79, 85, 83, 95, - 81, 91, 89, 86, 84, 94, 82, 112, 92, 96, - 59, 90, 77, 77, 77, 52, 87, 97, 53, 88, - 77, 101, 111, 93, 57, 102, 103, 95, 54, 58, - 115, 66, 94, 77, 98, 112, 96, 99, 77, 77, - 100, 104, 105, 117, 117, 72, 319, 73, 73, 101, - 68, 319, 106, 102, 103, 107, 108, 319, 77, 77, - - 77, 98, 109, 54, 99, 110, 77, 100, 104, 105, - 77, 122, 59, 77, 77, 77, 77, 77, 77, 123, - 106, 77, 77, 107, 108, 77, 124, 77, 125, 109, - 130, 77, 110, 77, 126, 128, 134, 77, 77, 122, - 127, 77, 129, 77, 77, 131, 123, 135, 77, 77, - 132, 147, 139, 124, 137, 125, 77, 136, 130, 133, - 138, 126, 128, 134, 140, 77, 142, 127, 77, 129, - 143, 77, 131, 149, 77, 135, 77, 132, 141, 147, - 139, 137, 77, 77, 136, 145, 133, 77, 138, 77, - 77, 140, 150, 142, 148, 77, 144, 143, 77, 146, - - 155, 149, 151, 77, 152, 77, 141, 117, 117, 154, - 156, 77, 158, 145, 77, 77, 160, 77, 159, 150, - 77, 148, 77, 144, 153, 77, 146, 77, 155, 77, - 151, 77, 152, 161, 162, 163, 154, 77, 165, 170, - 158, 77, 164, 168, 160, 159, 169, 77, 77, 166, - 172, 153, 77, 77, 167, 77, 77, 171, 77, 77, - 161, 162, 77, 163, 176, 165, 77, 170, 77, 164, - 168, 175, 180, 182, 169, 77, 166, 77, 172, 177, - 173, 167, 77, 174, 171, 179, 178, 77, 77, 181, - 184, 77, 176, 183, 77, 77, 77, 185, 175, 180, - - 182, 187, 186, 77, 188, 77, 177, 173, 77, 191, - 174, 77, 179, 178, 189, 190, 181, 192, 184, 77, - 183, 77, 193, 77, 77, 185, 77, 77, 194, 187, - 186, 188, 195, 199, 196, 77, 77, 191, 200, 77, - 77, 189, 190, 77, 77, 192, 77, 77, 77, 197, - 193, 77, 198, 204, 77, 201, 194, 205, 206, 77, - 195, 199, 196, 207, 202, 77, 200, 77, 209, 77, - 221, 77, 77, 203, 210, 77, 197, 208, 77, 198, - 77, 204, 201, 211, 205, 216, 206, 230, 77, 215, - 207, 202, 77, 213, 77, 214, 209, 221, 212, 77, - - 203, 210, 77, 220, 208, 217, 77, 218, 77, 77, - 222, 211, 77, 216, 219, 230, 215, 77, 77, 77, - 213, 77, 214, 77, 226, 212, 223, 77, 77, 225, - 220, 224, 77, 217, 228, 218, 77, 77, 222, 232, - 77, 219, 229, 227, 77, 235, 77, 231, 77, 233, - 77, 226, 237, 223, 236, 77, 225, 234, 224, 241, - 77, 77, 228, 238, 77, 77, 77, 232, 242, 229, - 227, 239, 240, 235, 231, 244, 233, 77, 77, 77, - 237, 236, 77, 243, 234, 248, 246, 241, 247, 77, - 238, 250, 77, 245, 77, 77, 242, 77, 239, 240, - - 77, 251, 77, 244, 257, 256, 254, 77, 252, 255, - 243, 260, 248, 77, 246, 247, 259, 77, 77, 250, - 245, 253, 77, 77, 77, 77, 77, 77, 258, 251, - 77, 265, 257, 256, 254, 252, 263, 255, 260, 261, - 77, 77, 262, 268, 259, 264, 270, 273, 253, 267, - 77, 266, 77, 77, 77, 258, 77, 77, 77, 265, - 77, 277, 77, 77, 263, 269, 261, 271, 77, 262, - 272, 268, 264, 270, 273, 274, 275, 267, 266, 77, - 279, 276, 77, 77, 77, 77, 281, 77, 285, 277, - 77, 77, 269, 77, 278, 271, 282, 280, 272, 77, - - 283, 77, 274, 275, 286, 284, 77, 279, 77, 276, - 77, 77, 287, 281, 288, 285, 77, 289, 77, 290, - 77, 77, 278, 291, 282, 280, 77, 77, 283, 296, - 77, 286, 295, 284, 77, 292, 294, 298, 77, 293, - 287, 77, 288, 297, 77, 289, 77, 290, 302, 77, - 77, 291, 77, 301, 299, 77, 77, 296, 300, 77, - 295, 77, 77, 292, 294, 298, 293, 77, 77, 306, - 303, 297, 77, 308, 77, 307, 302, 304, 77, 77, - 305, 301, 299, 77, 77, 300, 77, 311, 77, 309, - 315, 77, 310, 77, 77, 312, 306, 303, 316, 314, - - 313, 308, 307, 77, 304, 318, 317, 305, 77, 77, - 77, 77, 77, 77, 311, 77, 309, 315, 77, 310, - 77, 77, 66, 312, 66, 316, 77, 314, 313, 77, - 77, 120, 318, 317, 51, 51, 51, 51, 51, 51, - 56, 56, 56, 56, 56, 56, 71, 71, 71, 119, - 71, 78, 78, 78, 116, 116, 116, 121, 118, 66, - 121, 157, 157, 157, 66, 319, 319, 114, 113, 77, - 76, 75, 74, 60, 55, 50, 49, 319, 3, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319 - } ; - -static yyconst flex_int16_t yy_chk[959] = - { 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, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, - 11, 15, 9, 28, 17, 11, 18, 18, 30, 19, - 31, 15, 17, 19, 19, 20, 29, 20, 20, 34, - - 19, 33, 56, 318, 37, 29, 32, 56, 317, 28, - 31, 30, 29, 34, 33, 32, 225, 30, 225, 29, - 51, 34, 35, 51, 33, 42, 36, 9, 11, 32, - 37, 43, 32, 29, 42, 35, 28, 31, 30, 36, - 29, 34, 33, 32, 30, 35, 29, 43, 34, 36, - 56, 33, 39, 40, 38, 52, 32, 37, 52, 32, - 316, 39, 42, 35, 57, 39, 40, 36, 51, 57, - 68, 68, 35, 310, 38, 43, 36, 38, 309, 41, - 38, 40, 40, 72, 72, 73, 66, 73, 73, 39, - 66, 66, 41, 39, 40, 41, 41, 66, 79, 80, - - 81, 38, 41, 52, 38, 41, 82, 38, 40, 40, - 84, 79, 57, 85, 93, 86, 87, 89, 308, 80, - 41, 88, 90, 41, 41, 95, 81, 96, 82, 41, - 88, 92, 41, 305, 84, 86, 93, 99, 94, 79, - 85, 105, 87, 98, 101, 89, 80, 94, 97, 102, - 90, 105, 98, 81, 96, 82, 107, 95, 88, 92, - 97, 84, 86, 93, 99, 100, 101, 85, 103, 87, - 102, 108, 89, 107, 106, 94, 104, 90, 100, 105, - 98, 96, 304, 112, 95, 104, 92, 109, 97, 111, - 303, 99, 108, 101, 106, 110, 103, 102, 123, 104, - - 112, 107, 109, 122, 110, 125, 100, 117, 117, 111, - 120, 120, 122, 104, 126, 128, 125, 130, 123, 108, - 132, 106, 127, 103, 110, 131, 104, 135, 112, 136, - 109, 134, 110, 125, 126, 127, 111, 137, 130, 135, - 122, 141, 128, 132, 125, 123, 134, 139, 146, 131, - 137, 110, 142, 148, 131, 140, 143, 136, 144, 145, - 125, 126, 147, 127, 142, 130, 149, 135, 294, 128, - 132, 141, 146, 148, 134, 154, 131, 150, 137, 143, - 139, 131, 151, 140, 136, 145, 144, 293, 153, 147, - 150, 152, 142, 149, 155, 159, 158, 151, 141, 146, - - 148, 153, 152, 291, 154, 161, 143, 139, 160, 159, - 140, 162, 145, 144, 155, 158, 147, 160, 150, 164, - 149, 165, 161, 166, 168, 151, 167, 169, 162, 153, - 152, 154, 164, 168, 165, 172, 290, 159, 168, 171, - 176, 155, 158, 170, 175, 160, 179, 177, 193, 166, - 161, 288, 167, 171, 287, 169, 162, 172, 175, 178, - 164, 168, 165, 176, 170, 181, 168, 182, 178, 185, - 193, 180, 186, 170, 179, 192, 166, 177, 203, 167, - 282, 171, 169, 180, 172, 186, 175, 203, 191, 185, - 176, 170, 188, 181, 189, 182, 178, 193, 180, 194, - - 170, 179, 199, 192, 177, 188, 196, 189, 197, 198, - 194, 180, 278, 186, 191, 203, 185, 200, 201, 202, - 181, 204, 182, 206, 199, 180, 196, 205, 209, 198, - 192, 197, 208, 188, 201, 189, 207, 211, 194, 205, - 210, 191, 202, 200, 265, 208, 213, 204, 212, 206, - 214, 199, 210, 196, 209, 215, 198, 207, 197, 214, - 217, 224, 201, 211, 221, 223, 219, 205, 215, 202, - 200, 212, 213, 208, 204, 219, 206, 222, 229, 226, - 210, 209, 239, 217, 207, 224, 222, 214, 223, 236, - 211, 226, 227, 221, 235, 230, 215, 231, 212, 213, - - 233, 227, 237, 219, 236, 235, 231, 238, 229, 233, - 217, 239, 224, 241, 222, 223, 238, 242, 245, 226, - 221, 230, 243, 246, 244, 251, 254, 263, 237, 227, - 248, 245, 236, 235, 231, 229, 243, 233, 239, 241, - 247, 250, 242, 248, 238, 244, 251, 254, 230, 247, - 252, 246, 258, 253, 255, 237, 256, 262, 260, 245, - 249, 258, 268, 240, 243, 250, 241, 252, 257, 242, - 253, 248, 244, 251, 254, 255, 256, 247, 246, 259, - 260, 257, 261, 264, 269, 234, 262, 266, 268, 258, - 232, 228, 250, 267, 259, 252, 264, 261, 253, 270, - - 266, 271, 255, 256, 269, 267, 273, 260, 272, 257, - 274, 276, 270, 262, 271, 268, 280, 272, 275, 273, - 279, 277, 259, 274, 264, 261, 283, 220, 266, 280, - 285, 269, 279, 267, 281, 275, 277, 283, 289, 276, - 270, 284, 271, 281, 286, 272, 292, 273, 289, 297, - 295, 274, 296, 286, 284, 298, 300, 280, 285, 301, - 279, 299, 312, 275, 277, 283, 276, 302, 218, 297, - 292, 281, 315, 299, 313, 298, 289, 295, 306, 314, - 296, 286, 284, 307, 216, 285, 311, 302, 195, 300, - 312, 190, 301, 187, 184, 306, 297, 292, 313, 311, - - 307, 299, 298, 183, 295, 315, 314, 296, 174, 173, - 163, 157, 156, 138, 302, 133, 300, 312, 129, 301, - 124, 121, 116, 306, 115, 313, 91, 311, 307, 83, - 78, 77, 315, 314, 320, 320, 320, 320, 320, 320, - 321, 321, 321, 321, 321, 321, 322, 322, 322, 75, - 322, 323, 323, 323, 324, 324, 324, 325, 74, 71, - 325, 326, 326, 326, 65, 59, 54, 50, 47, 27, - 25, 24, 23, 14, 10, 8, 7, 3, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int swf4_flex_debug; -int swf4_flex_debug = 0; - -/* 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 *swf4text; -#line 1 "swf4compiler.flex" -#line 2 "swf4compiler.flex" - -#include -#include - -#include "compile.h" -#include "action.h" -#include "blocks/error.h" -#include "swf4compiler.tab.h" /* defines token types */ - -static int swf4debug; - -static const char *lexBuffer = NULL; -static int lexBufferLen = 0; - -static int sLineNumber = 0; -static char szLine[1024]; -static char msgbufs[2][1024] = { {0}, {0} }, *msgline = {0}; -static int column = 0; - -static void comment(); -static void comment1(); -static void count(); -static void warning(char *msg); - -#define YY_INPUT(buf,result,max_size) result=lexBufferInput(buf, max_size) - -/* thanks to the prolific and brilliant Raff: */ -static int lexBufferInput(char *buf, int max_size) -{ - int l = lexBufferLen > max_size ? max_size : lexBufferLen; - - if (lexBufferLen <= 0) - return YY_NULL; - - memcpy(buf, lexBuffer, l); - lexBuffer += l; - lexBufferLen -= l; - return l; -} - - /* very inefficient method of unescaping strings */ -static void unescape(char *buf) -{ - char *p, *p1; - - for (p1=buf; (p=strchr(p1, '\\')) != 0; p1 = p+1) { - switch(p[1]) - { - case 'b' : p[1] = '\b'; break; - case 'f' : p[1] = '\f'; break; - case 'n' : p[1] = '\n'; break; - case 'r' : p[1] = '\r'; break; - case 't' : p[1] = '\t'; break; - case 'x' : - case 'u' : warning("unsupported escape sequence"); - } - strcpy(p, p+1); - } -} - -void swf4ParseInit(const char *script, int debug) -{ - checkByteOrder(); - swf4restart(NULL); - - swf4debug = debug; - - lexBuffer = script; - lexBufferLen = strlen(script); - sLineNumber = 0; - column = 0; - msgline = msgbufs[0]; -} - -#line 79 "swf4compiler.flex" - // forward declaration needed by the following function -#ifndef YY_PROTO -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif -#endif - static void yyunput YY_PROTO(( int c, char *buf_ptr )); - - void do_unput4(const char c) { unput(c); } -#line 874 "lex.swf4.c" - -#define INITIAL 0 - -#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. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -static int yy_init_globals (void ); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int swf4lex_destroy (void ); - -int swf4get_debug (void ); - -void swf4set_debug (int debug_flag ); - -YY_EXTRA_TYPE swf4get_extra (void ); - -void swf4set_extra (YY_EXTRA_TYPE user_defined ); - -FILE *swf4get_in (void ); - -void swf4set_in (FILE * in_str ); - -FILE *swf4get_out (void ); - -void swf4set_out (FILE * out_str ); - -int swf4get_leng (void ); - -char *swf4get_text (void ); - -int swf4get_lineno (void ); - -void swf4set_lineno (int line_number ); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int swf4wrap (void ); -#else -extern int swf4wrap (void ); -#endif -#endif - - static void yyunput (int c,char *buf_ptr ); - -#ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); -#endif - -#ifndef YY_NO_INPUT - -#ifdef __cplusplus -static int yyinput (void ); -#else -static int input (void ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO fwrite( swf4text, swf4leng, 1, swf4out ) -#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) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - int n; \ - for ( n = 0; n < max_size && \ - (c = getc( swf4in )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( swf4in ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, swf4in))==0 && ferror(swf4in)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(swf4in); \ - } \ - }\ -\ - -#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 -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int swf4lex (void); - -#define YY_DECL int swf4lex (void) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after swf4text and swf4leng - * 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 break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 96 "swf4compiler.flex" - - -#line 1059 "lex.swf4.c" - - if ( !(yy_init) ) - { - (yy_init) = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! swf4in ) - swf4in = stdin; - - if ( ! swf4out ) - swf4out = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - swf4ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - swf4_create_buffer(swf4in,YY_BUF_SIZE ); - } - - swf4_load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of swf4text. */ - *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; - - yy_current_state = (yy_start); -yy_match: - do - { - register 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 >= 320 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 879 ); - -yy_find_action: - 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; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - 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 98 "swf4compiler.flex" -{ count(); swf4lval.str = strdup(swf4text); - return NUMBER; } - YY_BREAK -case 2: -YY_RULE_SETUP -#line 100 "swf4compiler.flex" -{ count(); swf4lval.str = strdup(swf4text); - return NUMBER; } - YY_BREAK -case 3: -YY_RULE_SETUP -#line 102 "swf4compiler.flex" -{ count(); swf4lval.str = strdup("1"); - return NUMBER; } - YY_BREAK -case 4: -YY_RULE_SETUP -#line 104 "swf4compiler.flex" -{ count(); swf4lval.str = strdup("0"); - return NUMBER; } - YY_BREAK -case 5: -YY_RULE_SETUP -#line 106 "swf4compiler.flex" -{ count(); return BREAK; } - YY_BREAK -case 6: -YY_RULE_SETUP -#line 107 "swf4compiler.flex" -{ count(); return CONTINUE; } - YY_BREAK -case 7: -YY_RULE_SETUP -#line 108 "swf4compiler.flex" -{ count(); return ELSE; } - YY_BREAK -case 8: -YY_RULE_SETUP -#line 109 "swf4compiler.flex" -{ count(); return FOR; } - YY_BREAK -case 9: -YY_RULE_SETUP -#line 110 "swf4compiler.flex" -{ count(); return IF; } - YY_BREAK -case 10: -YY_RULE_SETUP -#line 111 "swf4compiler.flex" -{ count(); return WHILE; } - YY_BREAK -case 11: -YY_RULE_SETUP -#line 112 "swf4compiler.flex" -{ count(); return DO; } - YY_BREAK -case 12: -YY_RULE_SETUP -#line 113 "swf4compiler.flex" -{ count(); return EVAL; } - YY_BREAK -/* functions */ -case 13: -YY_RULE_SETUP -#line 116 "swf4compiler.flex" -{ count(); return RANDOM; } - YY_BREAK -case 14: -YY_RULE_SETUP -#line 117 "swf4compiler.flex" -{ count(); return TIME; } - YY_BREAK -case 15: -YY_RULE_SETUP -#line 118 "swf4compiler.flex" -{ count(); return LENGTH; } - YY_BREAK -case 16: -YY_RULE_SETUP -#line 119 "swf4compiler.flex" -{ count(); return INT; } - YY_BREAK -case 17: -YY_RULE_SETUP -#line 120 "swf4compiler.flex" -{ count(); return CONCAT; } - YY_BREAK -case 18: -YY_RULE_SETUP -#line 121 "swf4compiler.flex" -{ count(); return DUPLICATECLIP; } - YY_BREAK -case 19: -YY_RULE_SETUP -#line 122 "swf4compiler.flex" -{ count(); return REMOVECLIP; } - YY_BREAK -case 20: -YY_RULE_SETUP -#line 123 "swf4compiler.flex" -{ count(); return TRACE; } - YY_BREAK -case 21: -YY_RULE_SETUP -#line 124 "swf4compiler.flex" -{ count(); return STARTDRAG; } - YY_BREAK -case 22: -YY_RULE_SETUP -#line 125 "swf4compiler.flex" -{ count(); return STOPDRAG; } - YY_BREAK -case 23: -YY_RULE_SETUP -#line 126 "swf4compiler.flex" -{ count(); return ORD; } - YY_BREAK -case 24: -YY_RULE_SETUP -#line 127 "swf4compiler.flex" -{ count(); return CHR; } - YY_BREAK -case 25: -YY_RULE_SETUP -#line 128 "swf4compiler.flex" -{ count(); return CALLFRAME; } - YY_BREAK -case 26: -YY_RULE_SETUP -#line 129 "swf4compiler.flex" -{ count(); return GETURL; } - YY_BREAK -case 27: -YY_RULE_SETUP -#line 130 "swf4compiler.flex" -{ count(); return GETURL1; } - YY_BREAK -case 28: -YY_RULE_SETUP -#line 131 "swf4compiler.flex" -{ count(); return LOADMOVIE; } - YY_BREAK -case 29: -YY_RULE_SETUP -#line 132 "swf4compiler.flex" -{ count(); return LOADVARIABLES; } - YY_BREAK -case 30: -YY_RULE_SETUP -#line 133 "swf4compiler.flex" -{ count(); return SUBSTR; } - YY_BREAK -case 31: -YY_RULE_SETUP -#line 135 "swf4compiler.flex" -{ count(); return GETPROPERTY; } - YY_BREAK -/* getURL2 methods */ -case 32: -YY_RULE_SETUP -#line 138 "swf4compiler.flex" -{ count(); swf4lval.getURLMethod = GETURL_METHOD_POST; - return GETURL_METHOD; } - YY_BREAK -case 33: -YY_RULE_SETUP -#line 140 "swf4compiler.flex" -{ count(); swf4lval.getURLMethod = GETURL_METHOD_GET; - return GETURL_METHOD; } - YY_BREAK -case 34: -YY_RULE_SETUP -#line 142 "swf4compiler.flex" -{ count(); swf4lval.getURLMethod = GETURL_METHOD_NOSEND; - return GETURL_METHOD; } - YY_BREAK -/* v3 functions */ -case 35: -YY_RULE_SETUP -#line 147 "swf4compiler.flex" -{ count(); return NEXTFRAME; } - YY_BREAK -case 36: -YY_RULE_SETUP -#line 148 "swf4compiler.flex" -{ count(); return PREVFRAME; } - YY_BREAK -case 37: -YY_RULE_SETUP -#line 149 "swf4compiler.flex" -{ count(); return PLAY; } - YY_BREAK -case 38: -YY_RULE_SETUP -#line 150 "swf4compiler.flex" -{ count(); return STOP; } - YY_BREAK -case 39: -YY_RULE_SETUP -#line 151 "swf4compiler.flex" -{ count(); return TOGGLEQUALITY; } - YY_BREAK -case 40: -YY_RULE_SETUP -#line 152 "swf4compiler.flex" -{ count(); return STOPSOUNDS; } - YY_BREAK -case 41: -YY_RULE_SETUP -#line 153 "swf4compiler.flex" -{ count(); return GOTOFRAME; } - YY_BREAK -case 42: -YY_RULE_SETUP -#line 154 "swf4compiler.flex" -{ count(); return GOTOANDPLAY; } - YY_BREAK -case 43: -YY_RULE_SETUP -#line 155 "swf4compiler.flex" -{ count(); return FRAMELOADED; } - YY_BREAK -case 44: -YY_RULE_SETUP -#line 156 "swf4compiler.flex" -{ count(); return SETTARGET; } - YY_BREAK -/* high level functions */ -case 45: -YY_RULE_SETUP -#line 159 "swf4compiler.flex" -{ count(); return TELLTARGET; } - YY_BREAK -case 46: -YY_RULE_SETUP -#line 162 "swf4compiler.flex" -{ count(); return THIS; } - YY_BREAK -case 47: -YY_RULE_SETUP -#line 164 "swf4compiler.flex" -{ count(); swf4lval.str = strdup(swf4text); - return IDENTIFIER; } - YY_BREAK -case 48: -YY_RULE_SETUP -#line 167 "swf4compiler.flex" -{ count(); swf4lval.str = strdup(swf4text); - return PATH; } - YY_BREAK -case 49: -YY_RULE_SETUP -#line 170 "swf4compiler.flex" -{ count(); swf4lval.str = strdup(swf4text); - return PATH; } - YY_BREAK -case 50: -/* rule 50 can match eol */ -YY_RULE_SETUP -#line 173 "swf4compiler.flex" -{ count(); swf4lval.str = strdup(swf4text+1); - swf4lval.str[strlen(swf4lval.str)-1]=0; - unescape(swf4lval.str); - return STRING; } - YY_BREAK -case 51: -/* rule 51 can match eol */ -YY_RULE_SETUP -#line 178 "swf4compiler.flex" -{ count(); swf4lval.str = strdup(swf4text+1); - swf4lval.str[strlen(swf4lval.str)-1]=0; - unescape(swf4lval.str); - return STRING; } - YY_BREAK -case 52: -/* rule 52 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up swf4text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up swf4text again */ -YY_RULE_SETUP -#line 183 "swf4compiler.flex" -{ count(); swf4lval.str = strdup(""); - warning("Unterminated string!"); - return STRING; } - YY_BREAK -case 53: -/* rule 53 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up swf4text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up swf4text again */ -YY_RULE_SETUP -#line 187 "swf4compiler.flex" -{ count(); swf4lval.str = strdup(""); - warning("Unterminated string!"); - return STRING; } - YY_BREAK -case 54: -YY_RULE_SETUP -#line 191 "swf4compiler.flex" -{ count(); comment(); } - YY_BREAK -case 55: -YY_RULE_SETUP -#line 192 "swf4compiler.flex" -{ count(); comment1(); } - YY_BREAK -case 56: -YY_RULE_SETUP -#line 193 "swf4compiler.flex" -{ count(); } - YY_BREAK -case 57: -YY_RULE_SETUP -#line 195 "swf4compiler.flex" -{ count(); return INC; } - YY_BREAK -case 58: -YY_RULE_SETUP -#line 196 "swf4compiler.flex" -{ count(); return DEC; } - YY_BREAK -case 59: -YY_RULE_SETUP -#line 197 "swf4compiler.flex" -{ count(); return '<'; } - YY_BREAK -case 60: -YY_RULE_SETUP -#line 198 "swf4compiler.flex" -{ count(); return '>'; } - YY_BREAK -case 61: -YY_RULE_SETUP -#line 199 "swf4compiler.flex" -{ count(); return LE; } - YY_BREAK -case 62: -YY_RULE_SETUP -#line 200 "swf4compiler.flex" -{ count(); return GE; } - YY_BREAK -case 63: -YY_RULE_SETUP -#line 201 "swf4compiler.flex" -{ count(); return EQ; } - YY_BREAK -case 64: -YY_RULE_SETUP -#line 202 "swf4compiler.flex" -{ count(); return NE; } - YY_BREAK -case 65: -YY_RULE_SETUP -#line 203 "swf4compiler.flex" -{ count(); return LAN; } - YY_BREAK -case 66: -YY_RULE_SETUP -#line 204 "swf4compiler.flex" -{ count(); return LOR; } - YY_BREAK -case 67: -YY_RULE_SETUP -#line 205 "swf4compiler.flex" -{ count(); return MEQ; } - YY_BREAK -case 68: -YY_RULE_SETUP -#line 206 "swf4compiler.flex" -{ count(); return DEQ; } - YY_BREAK -case 69: -YY_RULE_SETUP -#line 207 "swf4compiler.flex" -{ count(); return IEQ; } - YY_BREAK -case 70: -YY_RULE_SETUP -#line 208 "swf4compiler.flex" -{ count(); return SEQ; } - YY_BREAK -case 71: -YY_RULE_SETUP -#line 209 "swf4compiler.flex" -{ count(); return STREQ; } - YY_BREAK -case 72: -YY_RULE_SETUP -#line 210 "swf4compiler.flex" -{ count(); return STRNE; } - YY_BREAK -case 73: -YY_RULE_SETUP -#line 211 "swf4compiler.flex" -{ count(); return STRCMP; } - YY_BREAK -case 74: -YY_RULE_SETUP -#line 212 "swf4compiler.flex" -{ count(); return PARENT; } - YY_BREAK -case 75: -YY_RULE_SETUP -#line 214 "swf4compiler.flex" -{ count(); return ';'; } - YY_BREAK -case 76: -YY_RULE_SETUP -#line 215 "swf4compiler.flex" -{ count(); return '='; } - YY_BREAK -case 77: -YY_RULE_SETUP -#line 216 "swf4compiler.flex" -{ count(); return '+'; } - YY_BREAK -case 78: -YY_RULE_SETUP -#line 217 "swf4compiler.flex" -{ count(); return '-'; } - YY_BREAK -case 79: -YY_RULE_SETUP -#line 218 "swf4compiler.flex" -{ count(); return '&'; } - YY_BREAK -case 80: -YY_RULE_SETUP -#line 219 "swf4compiler.flex" -{ count(); return '*'; } - YY_BREAK -case 81: -YY_RULE_SETUP -#line 220 "swf4compiler.flex" -{ count(); return '/'; } - YY_BREAK -case 82: -YY_RULE_SETUP -#line 221 "swf4compiler.flex" -{ count(); return '!'; } - YY_BREAK -case 83: -YY_RULE_SETUP -#line 222 "swf4compiler.flex" -{ count(); return '('; } - YY_BREAK -case 84: -YY_RULE_SETUP -#line 223 "swf4compiler.flex" -{ count(); return ')'; } - YY_BREAK -case 85: -YY_RULE_SETUP -#line 224 "swf4compiler.flex" -{ count(); return '['; } - YY_BREAK -case 86: -YY_RULE_SETUP -#line 225 "swf4compiler.flex" -{ count(); return ']'; } - YY_BREAK -case 87: -YY_RULE_SETUP -#line 226 "swf4compiler.flex" -{ count(); return '{'; } - YY_BREAK -case 88: -YY_RULE_SETUP -#line 227 "swf4compiler.flex" -{ count(); return '}'; } - YY_BREAK -case 89: -YY_RULE_SETUP -#line 228 "swf4compiler.flex" -{ count(); return ','; } - YY_BREAK -case 90: -YY_RULE_SETUP -#line 229 "swf4compiler.flex" -{ count(); return '.'; } - YY_BREAK -case 91: -YY_RULE_SETUP -#line 230 "swf4compiler.flex" -{ count(); return '?'; } - YY_BREAK -case 92: -YY_RULE_SETUP -#line 231 "swf4compiler.flex" -{ count(); return ':'; } - YY_BREAK -case 93: -/* rule 93 can match eol */ -YY_RULE_SETUP -#line 233 "swf4compiler.flex" -{ count(); column = 0; - strcpy(szLine, swf4text + 1); - ++sLineNumber; yyless(1); } - YY_BREAK -case 94: -YY_RULE_SETUP -#line 237 "swf4compiler.flex" -printf( "Unrecognized character: %s\n", swf4text ); - YY_BREAK -case 95: -YY_RULE_SETUP -#line 239 "swf4compiler.flex" -ECHO; - YY_BREAK -#line 1654 "lex.swf4.c" -case YY_STATE_EOF(INITIAL): - yyterminate(); - - 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 swf4in at a new source and called - * swf4lex(). 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; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = swf4in; - 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 - { - 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 ( swf4wrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * swf4text, 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 swf4lex */ - -/* 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 - */ -static int yy_get_next_buffer (void) -{ - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register 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; - - 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. */ - swf4realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - 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), (size_t) 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; - swf4restart(swf4in ); - } - - 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_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) swf4realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } - - (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 */ - - static yy_state_type yy_get_previous_state (void) -{ - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = (yy_start); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - register 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 >= 320 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) 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 ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -{ - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); - - register 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 >= 320 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 319); - - return yy_is_jam ? 0 : yy_current_state; -} - - static void yyunput (int c, register char * yy_bp ) -{ - register char *yy_cp; - - yy_cp = (yy_c_buf_p); - - /* undo effects of setting up swf4text */ - *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. */ - register int number_to_move = (yy_n_chars) + 2; - register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - register 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) = 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; - - (yytext_ptr) = yy_bp; - (yy_hold_char) = *yy_cp; - (yy_c_buf_p) = yy_cp; -} - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) -#else - static int input (void) -#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 = (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. */ - swf4restart(swf4in ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( swf4wrap( ) ) - return EOF; - - 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 swf4text */ - (yy_hold_char) = *++(yy_c_buf_p); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** 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 . - */ - void swf4restart (FILE * input_file ) -{ - - if ( ! YY_CURRENT_BUFFER ){ - swf4ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - swf4_create_buffer(swf4in,YY_BUF_SIZE ); - } - - swf4_init_buffer(YY_CURRENT_BUFFER,input_file ); - swf4_load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ - void swf4_switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - - /* TODO. We should be able to replace this entire function body - * with - * swf4pop_buffer_state(); - * swf4push_buffer_state(new_buffer); - */ - swf4ensure_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; - swf4_load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (swf4wrap()) processing, but the only time this flag - * is looked at is after swf4wrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; -} - -static void swf4_load_buffer_state (void) -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - swf4in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (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. - */ - YY_BUFFER_STATE swf4_create_buffer (FILE * file, int size ) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) swf4alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in swf4_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 *) swf4alloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in swf4_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - swf4_init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with swf4_create_buffer() - * - */ - void swf4_delete_buffer (YY_BUFFER_STATE b ) -{ - - 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 ) - swf4free((void *) b->yy_ch_buf ); - - swf4free((void *) b ); -} - -#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __THROW /* this is a gnuism */ -extern int isatty (int ) __THROW; -#else -extern int isatty (int ); -#endif -#ifdef __cplusplus -} -#endif -#endif - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a swf4restart() or at EOF. - */ - static void swf4_init_buffer (YY_BUFFER_STATE b, FILE * file ) - -{ - int oerrno = errno; - - swf4_flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then swf4_init_buffer was _probably_ - * called from swf4restart() 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; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - 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. - * - */ - void swf4_flush_buffer (YY_BUFFER_STATE b ) -{ - 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 ) - swf4_load_buffer_state( ); -} - -/** 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. - * - */ -void swf4push_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - if (new_buffer == NULL) - return; - - swf4ensure_buffer_stack(); - - /* This block is copied from swf4_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 swf4_switch_to_buffer. */ - swf4_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void swf4pop_buffer_state (void) -{ - if (!YY_CURRENT_BUFFER) - return; - - swf4_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - swf4_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void swf4ensure_buffer_stack (void) -{ - int 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; - (yy_buffer_stack) = (struct yy_buffer_state**)swf4alloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in swf4ensure_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. */ - int grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)swf4realloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in swf4ensure_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; - } -} - -/** 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 swf4_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 0; - - b = (YY_BUFFER_STATE) swf4alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in swf4_scan_buffer()" ); - - b->yy_buf_size = 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 = 0; - 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; - - swf4_switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to swf4lex() 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 - * swf4_scan_bytes() instead. - */ -YY_BUFFER_STATE swf4_scan_string (yyconst char * yystr ) -{ - - return swf4_scan_bytes(yystr,strlen(yystr) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to swf4lex() will - * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE swf4_scan_bytes (yyconst 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 = _yybytes_len + 2; - buf = (char *) swf4alloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in swf4_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 = swf4_scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in swf4_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; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up swf4text. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - swf4text[swf4leng] = (yy_hold_char); \ - (yy_c_buf_p) = swf4text + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - swf4leng = yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - * - */ -int swf4get_lineno (void) -{ - - return swf4lineno; -} - -/** Get the input stream. - * - */ -FILE *swf4get_in (void) -{ - return swf4in; -} - -/** Get the output stream. - * - */ -FILE *swf4get_out (void) -{ - return swf4out; -} - -/** Get the length of the current token. - * - */ -int swf4get_leng (void) -{ - return swf4leng; -} - -/** Get the current token. - * - */ - -char *swf4get_text (void) -{ - return swf4text; -} - -/** Set the current line number. - * @param line_number - * - */ -void swf4set_lineno (int line_number ) -{ - - swf4lineno = line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param in_str A readable stream. - * - * @see swf4_switch_to_buffer - */ -void swf4set_in (FILE * in_str ) -{ - swf4in = in_str ; -} - -void swf4set_out (FILE * out_str ) -{ - swf4out = out_str ; -} - -int swf4get_debug (void) -{ - return swf4_flex_debug; -} - -void swf4set_debug (int bdebug ) -{ - swf4_flex_debug = bdebug ; -} - -static int yy_init_globals (void) -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from swf4lex_destroy(), so don't allocate here. - */ - - (yy_buffer_stack) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - swf4in = stdin; - swf4out = stdout; -#else - swf4in = (FILE *) 0; - swf4out = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * swf4lex_init() - */ - return 0; -} - -/* swf4lex_destroy is for both reentrant and non-reentrant scanners. */ -int swf4lex_destroy (void) -{ - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - swf4_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - swf4pop_buffer_state(); - } - - /* Destroy the stack itself. */ - swf4free((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * swf4lex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *swf4alloc (yy_size_t size ) -{ - return (void *) malloc( size ); -} - -void *swf4realloc (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 (void *) realloc( (char *) ptr, size ); -} - -void swf4free (void * ptr ) -{ - free( (char *) ptr ); /* see swf4realloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 239 "swf4compiler.flex" - - -static int getinput() { -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif -} - -int swf4wrap() -{ - return 1; -} - -static void countline() -{ - if(sLineNumber != 0) - msgline[column] = 0; - - ++sLineNumber; - column = 0; - msgline = msgbufs[sLineNumber & 1]; -} - -static int LineNumber(void) -{ - return (sLineNumber + 1); -} - -static int ColumnNumber(void) -{ - return column; -} - -static char *LineText(void) -{ - msgline[column] = 0; - return msgline; -} - -static void comment(void) -{ - // Handle block comments - - int c, c1; - -loop: - // We have the start of a comment so look skip everything up to the - // end of the comment character - while ((c = getinput()) != '*' && c != EOF) - { - if(column < 1023) - msgline[column] = c; - - ++column; - - // keep the line number in synch - if (c == '\n') - { - // start the output (matches the algorithim in the lexx above) - countline(); - } - - if (swf4debug) putchar(c); - } - - // is this the end of comment character - if ((c1 = getinput()) != '/' && c != EOF) - { - // false start as this was no end of comment - do_unput4(c1); - goto loop; - } - - // write out the start of the end of comment - if (c != EOF) - if (swf4debug) putchar(c); - - // write out the end of the end of comment - if (c1 != EOF) - if (swf4debug) putchar(c1); -} - -static void comment1(void) -{ - // Handle comment of type 1 (ie '//') - - int c; - - // this is a line comment - while ((c = getinput()) != '\n' && c != EOF) - { - if (swf4debug) putchar(c); - - if(column < 1023) - msgline[column] = c; - - ++column; - }; - - // keep the line number in synch - if (c == '\n') - { - if (swf4debug) putchar(c); - - countline(); - } -} - -static void count(void) -{ - int n; - - // Count the characters to maintain the current column position - if (swf4text[0] == '\n') - { - if (swf4debug) printf("\n"); - } - else - { - if (swf4debug) printf("%s", swf4text); - - for(n=0; n 0 -#define FLEX_BETA -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if __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; -#endif /* ! C99 */ - -/* 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 - -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* 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 swf5restart(swf5in ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#define YY_BUF_SIZE 16384 -#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 - -extern int swf5leng; - -extern FILE *swf5in, *swf5out; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up swf5text. */ \ - 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 swf5text again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, (yytext_ptr) ) - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef unsigned int yy_size_t; -#endif - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - 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. - */ - yy_size_t 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 swf5restart()), so that the user can continue scanning by - * just pointing swf5in at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* 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 = 0; /**< Stack as an array. */ - -/* 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)] - -/* yy_hold_char holds the character lost when swf5text is formed. */ -static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int swf5leng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow swf5wrap()'s to do buffer switches - * instead of setting up a fresh swf5in. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void swf5restart (FILE *input_file ); -void swf5_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE swf5_create_buffer (FILE *file,int size ); -void swf5_delete_buffer (YY_BUFFER_STATE b ); -void swf5_flush_buffer (YY_BUFFER_STATE b ); -void swf5push_buffer_state (YY_BUFFER_STATE new_buffer ); -void swf5pop_buffer_state (void ); - -static void swf5ensure_buffer_stack (void ); -static void swf5_load_buffer_state (void ); -static void swf5_init_buffer (YY_BUFFER_STATE b,FILE *file ); - -#define YY_FLUSH_BUFFER swf5_flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE swf5_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE swf5_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE swf5_scan_bytes (yyconst char *bytes,int len ); - -void *swf5alloc (yy_size_t ); -void *swf5realloc (void *,yy_size_t ); -void swf5free (void * ); - -#define yy_new_buffer swf5_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - swf5ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - swf5_create_buffer(swf5in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - swf5ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - swf5_create_buffer(swf5in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -typedef unsigned char YY_CHAR; - -FILE *swf5in = (FILE *) 0, *swf5out = (FILE *) 0; - -typedef int yy_state_type; - -extern int swf5lineno; - -int swf5lineno = 1; - -extern char *swf5text; -#define yytext_ptr swf5text - -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 yy_fatal_error (yyconst char msg[] ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up swf5text. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - swf5leng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 166 -#define YY_END_OF_BUFFER 167 -/* 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 yyconst flex_int16_t yy_accept[650] = - { 0, - 0, 0, 0, 0, 167, 165, 119, 164, 165, 152, - 165, 151, 146, 165, 153, 154, 149, 144, 159, 145, - 160, 150, 3, 3, 162, 142, 140, 143, 141, 161, - 155, 156, 148, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 157, 147, 158, 163, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 164, 125, 0, 115, 113, 0, 126, 132, 0, 116, - 114, 0, 128, 120, 130, 121, 131, 117, 118, 129, - 4, 2, 3, 0, 134, 122, 124, 123, 135, 112, - - 112, 112, 112, 112, 112, 112, 19, 112, 112, 112, - 112, 112, 112, 112, 112, 17, 16, 112, 112, 112, - 112, 112, 112, 112, 0, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 133, 127, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 16, - 112, 112, 112, 112, 112, 112, 112, 112, 63, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 4, 1, - 137, 138, 136, 25, 112, 112, 112, 37, 112, 112, - 112, 112, 112, 112, 112, 15, 112, 112, 112, 112, - 35, 112, 112, 21, 112, 112, 36, 112, 112, 111, - - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 20, 112, 112, 66, 62, 112, 112, 73, 112, - 55, 110, 112, 112, 109, 72, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 21, 91, 112, 57, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 20, 64, - 139, 112, 112, 13, 112, 112, 112, 112, 112, 11, - 26, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 7, 42, 112, 112, 112, 112, 112, 43, 112, 112, - 112, 112, 5, 112, 112, 24, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - - 112, 112, 112, 112, 112, 112, 112, 112, 108, 58, - 112, 112, 112, 112, 112, 112, 43, 112, 112, 112, - 56, 112, 8, 112, 112, 112, 112, 112, 112, 6, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 34, 112, - 18, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 104, 112, 103, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 32, 112, 112, - 22, 112, 112, 112, 38, 112, 112, 31, 112, 112, - - 112, 112, 29, 112, 23, 112, 112, 33, 12, 112, - 27, 105, 112, 112, 86, 112, 70, 112, 112, 112, - 112, 112, 112, 112, 112, 65, 112, 67, 112, 112, - 83, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 33, 112, 112, 112, 112, 14, 112, 112, - 112, 39, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 9, 112, 10, 30, 112, 112, - - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 68, 112, 112, - 101, 112, 85, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 99, 92, 112, 112, 84, 112, - 46, 112, 47, 112, 50, 112, 40, 41, 112, 48, - 112, 112, 112, 112, 112, 112, 74, 77, 112, 76, - 112, 112, 90, 112, 71, 112, 87, 112, 78, 112, - 48, 112, 79, 112, 98, 112, 112, 94, 82, 112, - 28, 112, 112, 112, 45, 112, 112, 112, 112, 61, - 112, 75, 89, 112, 112, 112, 112, 112, 112, 80, - - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 95, 102, 69, 88, 59, 112, 96, 81, 112, 112, - 112, 52, 112, 112, 112, 106, 107, 60, 112, 93, - 112, 112, 49, 112, 44, 97, 112, 112, 112, 112, - 100, 112, 112, 54, 112, 51, 112, 53, 0 - } ; - -static yyconst flex_int32_t yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 5, 6, 1, 1, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 21, 21, 21, 21, 22, 22, 23, 24, 25, - 26, 27, 28, 1, 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, 33, - 29, 30, 31, 32, 33, 1, 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, 33, 59, 60, 61, 62, 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 yyconst flex_int32_t yy_meta[63] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 2, 2, 2, 2, 2, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, - 1, 1 - } ; - -static yyconst flex_int16_t yy_base[654] = - { 0, - 0, 0, 29, 0, 741, 742, 742, 742, 737, 713, - 67, 742, 64, 76, 742, 742, 712, 67, 742, 68, - 742, 70, 82, 89, 742, 742, 63, 711, 65, 742, - 742, 742, 742, 0, 684, 684, 78, 75, 69, 82, - 77, 81, 79, 80, 683, 86, 109, 95, 87, 699, - 80, 742, 114, 742, 742, 105, 681, 112, 116, 116, - 117, 120, 124, 121, 130, 99, 128, 139, 697, 682, - 742, 742, 180, 182, 742, 726, 742, 742, 178, 187, - 742, 725, 742, 742, 742, 742, 742, 742, 742, 742, - 179, 200, 207, 0, 701, 742, 742, 742, 176, 0, - - 680, 687, 159, 673, 676, 168, 0, 673, 669, 686, - 674, 667, 670, 663, 662, 0, 153, 667, 679, 158, - 667, 674, 676, 671, 212, 661, 189, 654, 658, 670, - 662, 663, 155, 653, 650, 658, 646, 742, 742, 661, - 660, 61, 191, 201, 641, 646, 187, 640, 640, 202, - 198, 213, 212, 655, 646, 195, 637, 652, 651, 142, - 635, 633, 643, 215, 649, 225, 632, 631, 250, 0, - 742, 742, 655, 0, 646, 634, 640, 0, 203, 643, - 638, 630, 636, 628, 620, 0, 635, 208, 622, 616, - 0, 628, 630, 0, 613, 620, 0, 606, 608, 255, - - 625, 613, 606, 606, 609, 605, 603, 615, 618, 615, - 614, 0, 606, 609, 0, 0, 602, 603, 0, 605, - 601, 0, 599, 610, 232, 0, 590, 590, 599, 599, - 601, 587, 583, 582, 582, 245, 0, 246, 0, 581, - 592, 242, 593, 580, 581, 587, 229, 579, 589, 0, - 742, 582, 586, 0, 590, 581, 568, 568, 578, 0, - 0, 581, 565, 575, 565, 576, 580, 560, 243, 573, - 0, 0, 572, 562, 554, 557, 573, 554, 552, 568, - 558, 564, 0, 553, 562, 0, 563, 219, 561, 559, - 551, 557, 560, 258, 540, 556, 540, 543, 552, 553, - - 542, 544, 548, 534, 545, 545, 531, 542, 0, 0, - 541, 540, 543, 542, 522, 521, 257, 526, 519, 520, - 0, 520, 0, 518, 515, 520, 521, 527, 528, 0, - 521, 516, 516, 509, 512, 517, 509, 522, 504, 503, - 507, 514, 504, 499, 501, 497, 506, 508, 0, 506, - 0, 503, 245, 505, 504, 490, 488, 493, 487, 486, - 501, 494, 500, 0, 493, 0, 480, 483, 481, 492, - 474, 475, 489, 471, 472, 477, 482, 470, 469, 256, - 482, 467, 477, 465, 481, 460, 479, 0, 458, 458, - 0, 476, 461, 470, 488, 472, 469, 0, 449, 452, - - 468, 467, 0, 454, 0, 459, 444, 0, 0, 447, - 0, 266, 449, 442, 0, 460, 0, 458, 450, 440, - 447, 455, 443, 434, 433, 0, 440, 0, 450, 431, - 0, 448, 429, 445, 437, 438, 435, 438, 433, 423, - 439, 265, 430, 435, 436, 423, 430, 0, 414, 419, - 414, 0, 418, 425, 420, 419, 414, 413, 410, 419, - 409, 401, 409, 414, 416, 410, 397, 411, 414, 413, - 408, 398, 268, 403, 392, 384, 396, 387, 394, 385, - 399, 384, 397, 400, 394, 392, 397, 390, 379, 390, - 380, 373, 380, 386, 0, 385, 0, 0, 384, 373, - - 382, 385, 380, 379, 361, 362, 377, 379, 356, 358, - 357, 361, 370, 356, 371, 347, 368, 0, 356, 351, - 0, 359, 0, 348, 358, 346, 356, 345, 342, 341, - 358, 339, 350, 350, 0, 0, 265, 349, 0, 336, - 0, 341, 0, 347, 338, 349, 0, 0, 341, 0, - 330, 336, 346, 328, 336, 340, 0, 0, 331, 0, - 322, 337, 0, 326, 0, 338, 0, 337, 0, 332, - 331, 323, 0, 314, 0, 326, 313, 0, 0, 316, - 0, 309, 317, 323, 0, 318, 301, 304, 309, 0, - 318, 0, 0, 315, 307, 306, 301, 294, 312, 329, - - 295, 294, 291, 299, 306, 307, 289, 289, 302, 292, - 0, 0, 0, 0, 0, 289, 0, 0, 296, 295, - 293, 0, 282, 288, 274, 0, 0, 0, 280, 0, - 296, 291, 281, 285, 0, 0, 279, 279, 260, 264, - 0, 266, 259, 0, 262, 0, 92, 0, 742, 317, - 320, 322, 66 - } ; - -static yyconst flex_int16_t yy_def[654] = - { 0, - 649, 1, 1, 3, 649, 649, 649, 649, 649, 649, - 650, 649, 649, 651, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 649, 649, 649, 649, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 649, 649, 650, 650, 649, 650, 649, 649, 651, 651, - 649, 651, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 653, 649, 649, 649, 649, 649, 652, - - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 649, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 649, 649, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 649, 653, - 649, 649, 649, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 649, - - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 649, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, - 652, 652, 652, 652, 652, 652, 652, 652, 0, 649, - 649, 649, 649 - } ; - -static yyconst flex_int16_t yy_nxt[805] = - { 0, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, - 24, 24, 25, 26, 27, 28, 29, 30, 31, 6, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 34, 42, 34, 34, 43, 34, 44, 45, 46, 34, - 47, 48, 49, 34, 50, 51, 34, 34, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 170, 61, 74, - 62, 77, 75, 63, 64, 65, 66, 67, 80, 84, - 68, 88, 86, 69, 81, 70, 89, 95, 96, 78, - 98, 99, 85, 87, 217, 90, 76, 91, 175, 92, - - 92, 92, 92, 93, 91, 82, 93, 93, 93, 93, - 93, 103, 106, 109, 114, 111, 118, 120, 104, 116, - 136, 137, 107, 110, 115, 105, 119, 117, 108, 112, - 123, 125, 128, 121, 132, 113, 124, 133, 94, 138, - 648, 140, 126, 158, 134, 143, 127, 129, 130, 159, - 131, 141, 104, 144, 149, 153, 101, 145, 116, 105, - 109, 151, 147, 107, 115, 148, 150, 156, 154, 146, - 110, 152, 123, 139, 155, 160, 162, 157, 124, 163, - 80, 161, 74, 121, 74, 75, 81, 75, 209, 80, - 239, 164, 165, 240, 166, 81, 169, 169, 169, 169, - - 169, 172, 173, 176, 190, 191, 180, 82, 210, 76, - 177, 76, 181, 194, 195, 91, 82, 92, 92, 92, - 92, 93, 91, 222, 93, 93, 93, 93, 93, 200, - 200, 200, 200, 200, 202, 218, 219, 226, 255, 180, - 223, 203, 177, 227, 192, 181, 193, 230, 244, 228, - 236, 195, 229, 190, 191, 256, 231, 353, 248, 232, - 264, 265, 245, 233, 354, 246, 207, 169, 169, 169, - 169, 169, 200, 200, 200, 200, 200, 292, 303, 306, - 319, 320, 304, 307, 264, 265, 293, 311, 337, 305, - 308, 360, 312, 382, 313, 387, 314, 338, 413, 463, - - 438, 519, 489, 647, 646, 361, 439, 464, 345, 490, - 645, 576, 644, 643, 642, 520, 577, 73, 73, 73, - 79, 79, 79, 100, 100, 641, 640, 639, 638, 637, - 636, 635, 634, 633, 632, 631, 630, 629, 628, 627, - 626, 625, 624, 623, 622, 621, 620, 619, 618, 617, - 616, 615, 614, 613, 612, 611, 610, 609, 608, 607, - 606, 605, 604, 603, 602, 601, 600, 599, 598, 597, - 596, 595, 594, 593, 592, 591, 590, 589, 588, 587, - 586, 585, 584, 583, 582, 581, 580, 579, 578, 575, - 574, 573, 572, 571, 570, 569, 568, 567, 566, 565, - - 564, 563, 562, 561, 560, 559, 558, 557, 556, 555, - 554, 553, 552, 551, 550, 549, 548, 547, 546, 545, - 544, 543, 542, 541, 540, 539, 538, 537, 536, 535, - 534, 533, 532, 531, 530, 529, 528, 527, 526, 525, - 524, 523, 522, 521, 518, 517, 516, 515, 514, 513, - 512, 511, 510, 509, 508, 507, 506, 505, 504, 503, - 502, 501, 500, 499, 498, 497, 496, 495, 494, 493, - 492, 491, 488, 487, 486, 485, 484, 483, 482, 481, - 480, 479, 478, 477, 476, 475, 474, 473, 472, 471, - 470, 469, 468, 467, 466, 465, 462, 461, 460, 459, - - 458, 457, 456, 455, 454, 453, 452, 451, 450, 449, - 448, 447, 446, 445, 444, 443, 442, 441, 440, 437, - 436, 435, 434, 433, 432, 431, 430, 429, 428, 427, - 426, 425, 424, 423, 422, 421, 420, 419, 418, 417, - 416, 415, 414, 412, 411, 410, 409, 408, 407, 406, - 405, 404, 403, 402, 401, 400, 399, 398, 397, 396, - 395, 394, 393, 392, 391, 390, 389, 388, 387, 386, - 385, 384, 383, 381, 380, 379, 378, 377, 376, 375, - 374, 373, 372, 371, 370, 369, 368, 367, 366, 365, - 364, 363, 362, 359, 358, 357, 356, 355, 352, 351, - - 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, - 340, 339, 336, 335, 334, 333, 332, 331, 330, 329, - 328, 327, 326, 325, 324, 323, 322, 321, 318, 317, - 316, 315, 310, 309, 302, 301, 300, 299, 298, 297, - 296, 295, 294, 291, 290, 259, 289, 288, 287, 286, - 285, 284, 283, 282, 281, 280, 279, 278, 277, 276, - 275, 274, 273, 272, 271, 270, 269, 268, 267, 266, - 263, 262, 261, 260, 259, 258, 257, 254, 253, 252, - 251, 250, 249, 247, 243, 242, 241, 197, 238, 237, - 235, 234, 225, 224, 221, 220, 216, 215, 214, 213, - - 212, 211, 208, 207, 206, 205, 204, 201, 199, 198, - 197, 196, 193, 192, 189, 188, 187, 186, 185, 184, - 183, 182, 179, 178, 175, 174, 171, 649, 649, 168, - 167, 142, 135, 122, 102, 101, 97, 83, 72, 71, - 649, 5, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - - 649, 649, 649, 649 - } ; - -static yyconst flex_int16_t yy_chk[805] = - { 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, 3, 3, 3, 3, 3, 653, 3, 11, - 3, 13, 11, 3, 3, 3, 3, 3, 14, 18, - 3, 22, 20, 3, 14, 3, 22, 27, 27, 13, - 29, 29, 18, 20, 142, 22, 11, 23, 142, 23, - - 23, 23, 23, 23, 24, 14, 24, 24, 24, 24, - 24, 37, 38, 39, 41, 40, 43, 44, 37, 42, - 51, 51, 38, 39, 41, 37, 43, 42, 38, 40, - 46, 47, 48, 44, 49, 40, 46, 49, 23, 53, - 647, 56, 47, 66, 49, 58, 47, 48, 48, 66, - 48, 56, 58, 59, 61, 64, 56, 59, 62, 58, - 60, 63, 60, 59, 61, 60, 62, 65, 64, 59, - 60, 63, 67, 53, 64, 67, 68, 65, 67, 68, - 79, 67, 73, 65, 74, 73, 79, 74, 133, 80, - 160, 68, 68, 160, 68, 80, 91, 91, 91, 91, - - 91, 99, 99, 103, 117, 117, 106, 79, 133, 73, - 103, 74, 106, 120, 120, 92, 80, 92, 92, 92, - 92, 92, 93, 147, 93, 93, 93, 93, 93, 125, - 125, 125, 125, 125, 127, 143, 144, 150, 179, 144, - 147, 127, 143, 150, 151, 144, 152, 153, 164, 151, - 156, 156, 152, 150, 150, 179, 153, 288, 166, 153, - 188, 188, 164, 153, 288, 164, 166, 169, 169, 169, - 169, 169, 200, 200, 200, 200, 200, 225, 236, 238, - 247, 247, 236, 238, 225, 225, 225, 242, 269, 236, - 238, 294, 242, 317, 242, 353, 242, 269, 353, 412, - - 380, 473, 442, 645, 643, 294, 380, 412, 317, 442, - 642, 537, 640, 639, 638, 473, 537, 650, 650, 650, - 651, 651, 651, 652, 652, 637, 634, 633, 632, 631, - 629, 625, 624, 623, 621, 620, 619, 616, 610, 609, - 608, 607, 606, 605, 604, 603, 602, 601, 600, 599, - 598, 597, 596, 595, 594, 591, 589, 588, 587, 586, - 584, 583, 582, 580, 577, 576, 574, 572, 571, 570, - 568, 566, 564, 562, 561, 559, 556, 555, 554, 553, - 552, 551, 549, 546, 545, 544, 542, 540, 538, 534, - 533, 532, 531, 530, 529, 528, 527, 526, 525, 524, - - 522, 520, 519, 517, 516, 515, 514, 513, 512, 511, - 510, 509, 508, 507, 506, 505, 504, 503, 502, 501, - 500, 499, 496, 494, 493, 492, 491, 490, 489, 488, - 487, 486, 485, 484, 483, 482, 481, 480, 479, 478, - 477, 476, 475, 474, 472, 471, 470, 469, 468, 467, - 466, 465, 464, 463, 462, 461, 460, 459, 458, 457, - 456, 455, 454, 453, 451, 450, 449, 447, 446, 445, - 444, 443, 441, 440, 439, 438, 437, 436, 435, 434, - 433, 432, 430, 429, 427, 425, 424, 423, 422, 421, - 420, 419, 418, 416, 414, 413, 410, 407, 406, 404, - - 402, 401, 400, 399, 397, 396, 395, 394, 393, 392, - 390, 389, 387, 386, 385, 384, 383, 382, 381, 379, - 378, 377, 376, 375, 374, 373, 372, 371, 370, 369, - 368, 367, 365, 363, 362, 361, 360, 359, 358, 357, - 356, 355, 354, 352, 350, 348, 347, 346, 345, 344, - 343, 342, 341, 340, 339, 338, 337, 336, 335, 334, - 333, 332, 331, 329, 328, 327, 326, 325, 324, 322, - 320, 319, 318, 316, 315, 314, 313, 312, 311, 308, - 307, 306, 305, 304, 303, 302, 301, 300, 299, 298, - 297, 296, 295, 293, 292, 291, 290, 289, 287, 285, - - 284, 282, 281, 280, 279, 278, 277, 276, 275, 274, - 273, 270, 268, 267, 266, 265, 264, 263, 262, 259, - 258, 257, 256, 255, 253, 252, 249, 248, 246, 245, - 244, 243, 241, 240, 235, 234, 233, 232, 231, 230, - 229, 228, 227, 224, 223, 221, 220, 218, 217, 214, - 213, 211, 210, 209, 208, 207, 206, 205, 204, 203, - 202, 201, 199, 198, 196, 195, 193, 192, 190, 189, - 187, 185, 184, 183, 182, 181, 180, 177, 176, 175, - 173, 168, 167, 165, 163, 162, 161, 159, 158, 157, - 155, 154, 149, 148, 146, 145, 141, 140, 137, 136, - - 135, 134, 132, 131, 130, 129, 128, 126, 124, 123, - 122, 121, 119, 118, 115, 114, 113, 112, 111, 110, - 109, 108, 105, 104, 102, 101, 95, 82, 76, 70, - 69, 57, 50, 45, 36, 35, 28, 17, 10, 9, - 5, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, - - 649, 649, 649, 649 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int swf5_flex_debug; -int swf5_flex_debug = 0; - -/* 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 *swf5text; -#line 1 "swf5compiler.flex" -#line 2 "swf5compiler.flex" - -#include -#include - -#include "compile.h" -#include "action.h" -#include "blocks/error.h" -#include "swf5compiler.tab.h" /* defines token types */ - -static int swf5debug; - -static const char *lexBuffer = NULL; -static int lexBufferLen = 0; - -static int sLineNumber = 0; -static char szLine[1024]; -static char msgbufs[2][1024] = { {0}, {0} }, *msgline = {0}; -static int column = 0; - -static void comment(); -static void comment1(); -static void count(); -static void countline(); -static void warning(char *msg); - -#define YY_INPUT(buf,result,max_size) result=lexBufferInput(buf, max_size) - -/* thanks to the prolific and brilliant Raff: */ -static int lexBufferInput(char *buf, int max_size) -{ - int l = lexBufferLen > max_size ? max_size : lexBufferLen; - - if (lexBufferLen <= 0) - return YY_NULL; - - memcpy(buf, lexBuffer, l); - lexBuffer += l; - lexBufferLen -= l; - return l; -} - - /* very inefficient method of unescaping strings */ -static void unescape(char *buf) -{ - char *p, *p1; - - for (p1=buf; (p=strchr(p1, '\\')) != 0; p1 = p+1) { - switch(p[1]) - { - case 'b' : p[1] = '\b'; break; - case 'f' : p[1] = '\f'; break; - case 'n' : p[1] = '\n'; break; - case 'r' : p[1] = '\r'; break; - case 't' : p[1] = '\t'; break; - case 'x' : - case 'u' : warning("unsupported escape sequence"); - } - strcpy(p, p+1); - } -} - -void swf5ParseInit(const char *script, int debug) -{ - checkByteOrder(); - swf5restart(NULL); - - swf5debug = debug; - - lexBuffer = script; - lexBufferLen = strlen(script); - sLineNumber = 0; - column = 0; - msgline = msgbufs[0]; -} - - -#line 82 "swf5compiler.flex" - // forward declaration needed by the following function -#ifndef YY_PROTO -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif -#endif - static void yyunput YY_PROTO(( int c, char *buf_ptr )); - - void do_unput5(const char c) { unput(c); } -#line 936 "lex.swf5.c" - -#define INITIAL 0 -#define asm 1 - -#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. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -static int yy_init_globals (void ); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int swf5wrap (void ); -#else -extern int swf5wrap (void ); -#endif -#endif - - static void yyunput (int c,char *buf_ptr ); - -#ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); -#endif - -#ifndef YY_NO_INPUT - -#ifdef __cplusplus -static int yyinput (void ); -#else -static int input (void ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( swf5text, swf5leng, 1, swf5out ) -#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) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - size_t n; \ - for ( n = 0; n < max_size && \ - (c = getc( swf5in )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( swf5in ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, swf5in))==0 && ferror(swf5in)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(swf5in); \ - } \ - }\ -\ - -#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 -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int swf5lex (void); - -#define YY_DECL int swf5lex (void) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after swf5text and swf5leng - * 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 break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 98 "swf5compiler.flex" - - -#line 1093 "lex.swf5.c" - - if ( !(yy_init) ) - { - (yy_init) = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! swf5in ) - swf5in = stdin; - - if ( ! swf5out ) - swf5out = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - swf5ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - swf5_create_buffer(swf5in,YY_BUF_SIZE ); - } - - swf5_load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of swf5text. */ - *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; - - yy_current_state = (yy_start); -yy_match: - do - { - register 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 >= 650 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 742 ); - -yy_find_action: - 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; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - 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 100 "swf5compiler.flex" -{ count(); swf5lval.intVal = strtoul(swf5text, NULL, 0); - return INTEGER; } - YY_BREAK -case 2: -YY_RULE_SETUP -#line 102 "swf5compiler.flex" -{ count(); swf5lval.intVal = strtoul(swf5text, NULL, 0); - return INTEGER; } - YY_BREAK -case 3: -YY_RULE_SETUP -#line 104 "swf5compiler.flex" -{ count(); swf5lval.intVal = atoi(swf5text); - return INTEGER; } - YY_BREAK -case 4: -YY_RULE_SETUP -#line 106 "swf5compiler.flex" -{ count(); swf5lval.doubleVal = atof(swf5text); - return DOUBLE; } - YY_BREAK -case 5: -YY_RULE_SETUP -#line 108 "swf5compiler.flex" -{ count(); swf5lval.intVal = 1; - return BOOLEAN; } - YY_BREAK -case 6: -YY_RULE_SETUP -#line 110 "swf5compiler.flex" -{ count(); swf5lval.intVal = 0; - return BOOLEAN; } - YY_BREAK -case 7: -YY_RULE_SETUP -#line 112 "swf5compiler.flex" -{ count(); return NULLVAL; } - YY_BREAK -case 8: -YY_RULE_SETUP -#line 113 "swf5compiler.flex" -{ count(); return BREAK; } - YY_BREAK -case 9: -YY_RULE_SETUP -#line 114 "swf5compiler.flex" -{ count(); return CONTINUE; } - YY_BREAK -case 10: -YY_RULE_SETUP -#line 115 "swf5compiler.flex" -{ count(); return FUNCTION; } - YY_BREAK -case 11: -YY_RULE_SETUP -#line 116 "swf5compiler.flex" -{ count(); return ELSE; } - YY_BREAK -case 12: -YY_RULE_SETUP -#line 117 "swf5compiler.flex" -{ count(); return SWITCH; } - YY_BREAK -case 13: -YY_RULE_SETUP -#line 118 "swf5compiler.flex" -{ count(); return CASE; } - YY_BREAK -case 14: -YY_RULE_SETUP -#line 119 "swf5compiler.flex" -{ count(); return DEFAULT; } - YY_BREAK -case 15: -YY_RULE_SETUP -#line 120 "swf5compiler.flex" -{ count(); return FOR; } - YY_BREAK -case 16: -YY_RULE_SETUP -#line 121 "swf5compiler.flex" -{ count(); return IN; } - YY_BREAK -case 17: -YY_RULE_SETUP -#line 122 "swf5compiler.flex" -{ count(); return IF; } - YY_BREAK -case 18: -YY_RULE_SETUP -#line 123 "swf5compiler.flex" -{ count(); return WHILE; } - YY_BREAK -case 19: -YY_RULE_SETUP -#line 124 "swf5compiler.flex" -{ count(); return DO; } - YY_BREAK -case 20: -YY_RULE_SETUP -#line 125 "swf5compiler.flex" -{ count(); return VAR; } - YY_BREAK -case 21: -YY_RULE_SETUP -#line 126 "swf5compiler.flex" -{ count(); return NEW; } - YY_BREAK -case 22: -YY_RULE_SETUP -#line 127 "swf5compiler.flex" -{ count(); return DELETE; } - YY_BREAK -case 23: -YY_RULE_SETUP -#line 128 "swf5compiler.flex" -{ count(); return RETURN; } - YY_BREAK -case 24: -YY_RULE_SETUP -#line 129 "swf5compiler.flex" -{ count(); return WITH; } - YY_BREAK -case 25: -YY_RULE_SETUP -#line 130 "swf5compiler.flex" -{ count(); BEGIN(asm); return ASM; } - YY_BREAK -case 26: -YY_RULE_SETUP -#line 131 "swf5compiler.flex" -{ count(); return EVAL; } - YY_BREAK -case 27: -YY_RULE_SETUP -#line 132 "swf5compiler.flex" -{ count(); return TYPEOF; } - YY_BREAK -case 28: -YY_RULE_SETUP -#line 133 "swf5compiler.flex" -{ count(); return INSTANCEOF; } - YY_BREAK -/* legacy functions */ -case 29: -YY_RULE_SETUP -#line 136 "swf5compiler.flex" -{ count(); return RANDOM; } - YY_BREAK -case 30: -YY_RULE_SETUP -#line 137 "swf5compiler.flex" -{ count(); return GETTIMER; } - YY_BREAK -case 31: -YY_RULE_SETUP -#line 138 "swf5compiler.flex" -{ count(); return LENGTH; } - YY_BREAK -case 32: -YY_RULE_SETUP -#line 139 "swf5compiler.flex" -{ count(); return CONCAT; } - YY_BREAK -case 33: -YY_RULE_SETUP -#line 140 "swf5compiler.flex" -{ count(); return SUBSTR; } - YY_BREAK -case 34: -YY_RULE_SETUP -#line 141 "swf5compiler.flex" -{ count(); return TRACE; } - YY_BREAK -case 35: -YY_RULE_SETUP -#line 142 "swf5compiler.flex" -{ count(); return INT; } - YY_BREAK -case 36: -YY_RULE_SETUP -#line 143 "swf5compiler.flex" -{ count(); return ORD; } - YY_BREAK -case 37: -YY_RULE_SETUP -#line 144 "swf5compiler.flex" -{ count(); return CHR; } - YY_BREAK -case 38: -YY_RULE_SETUP -#line 145 "swf5compiler.flex" -{ count(); return GETURL; } - YY_BREAK -case 39: -YY_RULE_SETUP -#line 146 "swf5compiler.flex" -{ count(); return GETURL1; } - YY_BREAK -case 40: -YY_RULE_SETUP -#line 147 "swf5compiler.flex" -{ count(); return NEXTFRAME; } - YY_BREAK -case 41: -YY_RULE_SETUP -#line 148 "swf5compiler.flex" -{ count(); return PREVFRAME; } - YY_BREAK -case 42: -YY_RULE_SETUP -#line 149 "swf5compiler.flex" -{ count(); return PLAY; } - YY_BREAK -case 43: -YY_RULE_SETUP -#line 150 "swf5compiler.flex" -{ count(); return STOP; } - YY_BREAK -case 44: -YY_RULE_SETUP -#line 151 "swf5compiler.flex" -{ count(); return TOGGLEQUALITY; } - YY_BREAK -case 45: -YY_RULE_SETUP -#line 152 "swf5compiler.flex" -{ count(); return STOPSOUNDS; } - YY_BREAK -case 46: -YY_RULE_SETUP -#line 153 "swf5compiler.flex" -{ count(); return CALLFRAME; } - YY_BREAK -case 47: -YY_RULE_SETUP -#line 154 "swf5compiler.flex" -{ count(); return GOTOFRAME; } - YY_BREAK -case 48: -YY_RULE_SETUP -#line 155 "swf5compiler.flex" -{ count(); return SETTARGET; } - YY_BREAK -case 49: -YY_RULE_SETUP -#line 156 "swf5compiler.flex" -{ count(); return LOADVARIABLES; } - YY_BREAK -case 50: -YY_RULE_SETUP -#line 157 "swf5compiler.flex" -{ count(); return LOADMOVIE; } - YY_BREAK -case 51: -YY_RULE_SETUP -#line 158 "swf5compiler.flex" -{ count(); return LOADVARIABLESNUM; } - YY_BREAK -case 52: -YY_RULE_SETUP -#line 159 "swf5compiler.flex" -{ count(); return LOADMOVIENUM; } - YY_BREAK -case 53: -YY_RULE_SETUP -#line 160 "swf5compiler.flex" -{ count(); return DUPLICATEMOVIECLIP; } - YY_BREAK -case 54: -YY_RULE_SETUP -#line 161 "swf5compiler.flex" -{ count(); return REMOVEMOVIECLIP; } - YY_BREAK -/* assembler ops */ - -case 55: -YY_RULE_SETUP -#line 165 "swf5compiler.flex" -{ count(); return DUP; } - YY_BREAK -case 56: -YY_RULE_SETUP -#line 166 "swf5compiler.flex" -{ count(); return SWAP; } - YY_BREAK -case 57: -YY_RULE_SETUP -#line 167 "swf5compiler.flex" -{ count(); return POP; } - YY_BREAK -case 58: -YY_RULE_SETUP -#line 168 "swf5compiler.flex" -{ count(); return PUSH; } - YY_BREAK -case 59: -YY_RULE_SETUP -#line 169 "swf5compiler.flex" -{ count(); return SETREGISTER; } - YY_BREAK -case 60: -YY_RULE_SETUP -#line 170 "swf5compiler.flex" -{ count(); return CALLFUNCTION; } - YY_BREAK -case 61: -YY_RULE_SETUP -#line 171 "swf5compiler.flex" -{ count(); return CALLMETHOD; } - YY_BREAK -case 62: -YY_RULE_SETUP -#line 172 "swf5compiler.flex" -{ count(); return AND; } - YY_BREAK -case 63: -YY_RULE_SETUP -#line 173 "swf5compiler.flex" -{ count(); return OR; } - YY_BREAK -case 64: -YY_RULE_SETUP -#line 174 "swf5compiler.flex" -{ count(); return XOR; } - YY_BREAK -case 65: -YY_RULE_SETUP -#line 175 "swf5compiler.flex" -{ count(); return MODULO; } - YY_BREAK -case 66: -YY_RULE_SETUP -#line 176 "swf5compiler.flex" -{ count(); return ADD; } - YY_BREAK -case 67: -YY_RULE_SETUP -#line 177 "swf5compiler.flex" -{ count(); return ADD; } - YY_BREAK -case 68: -YY_RULE_SETUP -#line 178 "swf5compiler.flex" -{ count(); return LESSTHAN; } - YY_BREAK -case 69: -YY_RULE_SETUP -#line 179 "swf5compiler.flex" -{ count(); return LESSTHAN; } - YY_BREAK -case 70: -YY_RULE_SETUP -#line 180 "swf5compiler.flex" -{ count(); return EQUALS; } - YY_BREAK -case 71: -YY_RULE_SETUP -#line 181 "swf5compiler.flex" -{ count(); return EQUALS; } - YY_BREAK -case 72: -YY_RULE_SETUP -#line 182 "swf5compiler.flex" -{ count(); return INC; } - YY_BREAK -case 73: -YY_RULE_SETUP -#line 183 "swf5compiler.flex" -{ count(); return DEC; } - YY_BREAK -case 74: -YY_RULE_SETUP -#line 184 "swf5compiler.flex" -{ count(); return ENUMERATE; } - YY_BREAK -case 75: -YY_RULE_SETUP -#line 185 "swf5compiler.flex" -{ count(); return INITOBJECT; } - YY_BREAK -case 76: -YY_RULE_SETUP -#line 186 "swf5compiler.flex" -{ count(); return INITARRAY; } - YY_BREAK -case 77: -YY_RULE_SETUP -#line 187 "swf5compiler.flex" -{ count(); return GETMEMBER; } - YY_BREAK -case 78: -YY_RULE_SETUP -#line 188 "swf5compiler.flex" -{ count(); return SETMEMBER; } - YY_BREAK -case 79: -YY_RULE_SETUP -#line 189 "swf5compiler.flex" -{ count(); return SHIFTLEFT; } - YY_BREAK -case 80: -YY_RULE_SETUP -#line 190 "swf5compiler.flex" -{ count(); return SHIFTRIGHT; } - YY_BREAK -case 81: -YY_RULE_SETUP -#line 191 "swf5compiler.flex" -{ count(); return SHIFTRIGHT2; } - YY_BREAK -case 82: -YY_RULE_SETUP -#line 192 "swf5compiler.flex" -{ count(); return VAREQUALS; } - YY_BREAK -case 83: -YY_RULE_SETUP -#line 193 "swf5compiler.flex" -{ count(); return OLDADD; } - YY_BREAK -case 84: -YY_RULE_SETUP -#line 194 "swf5compiler.flex" -{ count(); return SUBTRACT; } - YY_BREAK -case 85: -YY_RULE_SETUP -#line 195 "swf5compiler.flex" -{ count(); return MULTIPLY; } - YY_BREAK -case 86: -YY_RULE_SETUP -#line 196 "swf5compiler.flex" -{ count(); return DIVIDE; } - YY_BREAK -case 87: -YY_RULE_SETUP -#line 197 "swf5compiler.flex" -{ count(); return OLDEQUALS; } - YY_BREAK -case 88: -YY_RULE_SETUP -#line 198 "swf5compiler.flex" -{ count(); return OLDLESSTHAN; } - YY_BREAK -case 89: -YY_RULE_SETUP -#line 199 "swf5compiler.flex" -{ count(); return LOGICALAND; } - YY_BREAK -case 90: -YY_RULE_SETUP -#line 200 "swf5compiler.flex" -{ count(); return LOGICALOR; } - YY_BREAK -case 91: -YY_RULE_SETUP -#line 201 "swf5compiler.flex" -{ count(); return NOT; } - YY_BREAK -case 92: -YY_RULE_SETUP -#line 202 "swf5compiler.flex" -{ count(); return STRINGEQ; } - YY_BREAK -case 93: -YY_RULE_SETUP -#line 203 "swf5compiler.flex" -{ count(); return STRINGLENGTH; } - YY_BREAK -case 94: -YY_RULE_SETUP -#line 204 "swf5compiler.flex" -{ count(); return SUBSTRING; } - YY_BREAK -case 95: -YY_RULE_SETUP -#line 205 "swf5compiler.flex" -{ count(); return GETVARIABLE; } - YY_BREAK -case 96: -YY_RULE_SETUP -#line 206 "swf5compiler.flex" -{ count(); return SETVARIABLE; } - YY_BREAK -case 97: -YY_RULE_SETUP -#line 207 "swf5compiler.flex" -{ count(); return SETTARGETEXPRESSION; } - YY_BREAK -case 98: -YY_RULE_SETUP -#line 208 "swf5compiler.flex" -{ count(); return STARTDRAG; } - YY_BREAK -case 99: -YY_RULE_SETUP -#line 209 "swf5compiler.flex" -{ count(); return STOPDRAG; } - YY_BREAK -case 100: -YY_RULE_SETUP -#line 210 "swf5compiler.flex" -{ count(); return STRINGLESSTHAN; } - YY_BREAK -case 101: -YY_RULE_SETUP -#line 211 "swf5compiler.flex" -{ count(); return MBLENGTH; } - YY_BREAK -case 102: -YY_RULE_SETUP -#line 212 "swf5compiler.flex" -{ count(); return MBSUBSTRING; } - YY_BREAK -case 103: -YY_RULE_SETUP -#line 213 "swf5compiler.flex" -{ count(); return MBORD; } - YY_BREAK -case 104: -YY_RULE_SETUP -#line 214 "swf5compiler.flex" -{ count(); return MBCHR; } - YY_BREAK -case 105: -YY_RULE_SETUP -#line 215 "swf5compiler.flex" -{ count(); return BRANCHALWAYS; } - YY_BREAK -case 106: -YY_RULE_SETUP -#line 216 "swf5compiler.flex" -{ count(); return BRANCHALWAYS; } - YY_BREAK -case 107: -YY_RULE_SETUP -#line 217 "swf5compiler.flex" -{ count(); return BRANCHIFTRUE; } - YY_BREAK -case 108: -YY_RULE_SETUP -#line 218 "swf5compiler.flex" -{ count(); return POST; } - YY_BREAK -case 109: -YY_RULE_SETUP -#line 219 "swf5compiler.flex" -{ count(); return GET; } - YY_BREAK -case 110: -YY_RULE_SETUP -#line 220 "swf5compiler.flex" -{ count(); return END; } - YY_BREAK - -case 111: -YY_RULE_SETUP -#line 223 "swf5compiler.flex" -{ count(); swf5lval.str = strdup(swf5text+2); - return REGISTER; } - YY_BREAK -case 112: -YY_RULE_SETUP -#line 227 "swf5compiler.flex" -{ count(); swf5lval.str = strdup(swf5text); - return IDENTIFIER; } - YY_BREAK -case 113: -/* rule 113 can match eol */ -YY_RULE_SETUP -#line 230 "swf5compiler.flex" -{ count(); swf5lval.str = strdup(swf5text+1); - swf5lval.str[strlen(swf5lval.str)-1]=0; - unescape(swf5lval.str); - return STRING; } - YY_BREAK -case 114: -/* rule 114 can match eol */ -YY_RULE_SETUP -#line 235 "swf5compiler.flex" -{ count(); swf5lval.str = strdup(swf5text+1); - swf5lval.str[strlen(swf5lval.str)-1]=0; - unescape(swf5lval.str); - return STRING; } - YY_BREAK -case 115: -/* rule 115 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up swf5text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up swf5text again */ -YY_RULE_SETUP -#line 240 "swf5compiler.flex" -{ count(); swf5lval.str = strdup(""); - warning("Unterminated string!"); - return STRING; } - YY_BREAK -case 116: -/* rule 116 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up swf5text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up swf5text again */ -YY_RULE_SETUP -#line 244 "swf5compiler.flex" -{ count(); swf5lval.str = strdup(""); - warning("Unterminated string!"); - return STRING; } - YY_BREAK -case 117: -YY_RULE_SETUP -#line 248 "swf5compiler.flex" -{ count(); comment(); } - YY_BREAK -case 118: -YY_RULE_SETUP -#line 249 "swf5compiler.flex" -{ count(); comment1(); } - YY_BREAK -case 119: -YY_RULE_SETUP -#line 250 "swf5compiler.flex" -{ count(); } - YY_BREAK -case 120: -YY_RULE_SETUP -#line 252 "swf5compiler.flex" -{ count(); return INCR; } - YY_BREAK -case 121: -YY_RULE_SETUP -#line 253 "swf5compiler.flex" -{ count(); return DECR; } - YY_BREAK -case 122: -YY_RULE_SETUP -#line 254 "swf5compiler.flex" -{ count(); return LE; } - YY_BREAK -case 123: -YY_RULE_SETUP -#line 255 "swf5compiler.flex" -{ count(); return GE; } - YY_BREAK -case 124: -YY_RULE_SETUP -#line 256 "swf5compiler.flex" -{ count(); return EQ; } - YY_BREAK -case 125: -YY_RULE_SETUP -#line 257 "swf5compiler.flex" -{ count(); return NE; } - YY_BREAK -case 126: -YY_RULE_SETUP -#line 258 "swf5compiler.flex" -{ count(); return LAN; } - YY_BREAK -case 127: -YY_RULE_SETUP -#line 259 "swf5compiler.flex" -{ count(); return LOR; } - YY_BREAK -case 128: -YY_RULE_SETUP -#line 260 "swf5compiler.flex" -{ count(); return MEQ; } - YY_BREAK -case 129: -YY_RULE_SETUP -#line 261 "swf5compiler.flex" -{ count(); return DEQ; } - YY_BREAK -case 130: -YY_RULE_SETUP -#line 262 "swf5compiler.flex" -{ count(); return IEQ; } - YY_BREAK -case 131: -YY_RULE_SETUP -#line 263 "swf5compiler.flex" -{ count(); return SEQ; } - YY_BREAK -case 132: -YY_RULE_SETUP -#line 264 "swf5compiler.flex" -{ count(); return AEQ; } - YY_BREAK -case 133: -YY_RULE_SETUP -#line 265 "swf5compiler.flex" -{ count(); return OEQ; } - YY_BREAK -case 134: -YY_RULE_SETUP -#line 266 "swf5compiler.flex" -{ count(); return SHL; } - YY_BREAK -case 135: -YY_RULE_SETUP -#line 267 "swf5compiler.flex" -{ count(); return SHR; } - YY_BREAK -case 136: -YY_RULE_SETUP -#line 268 "swf5compiler.flex" -{ count(); return SHR2; } - YY_BREAK -case 137: -YY_RULE_SETUP -#line 269 "swf5compiler.flex" -{ count(); return SHLEQ; } - YY_BREAK -case 138: -YY_RULE_SETUP -#line 270 "swf5compiler.flex" -{ count(); return SHREQ; } - YY_BREAK -case 139: -YY_RULE_SETUP -#line 271 "swf5compiler.flex" -{ count(); return SHR2EQ; } - YY_BREAK -case 140: -YY_RULE_SETUP -#line 273 "swf5compiler.flex" -{ count(); return '<'; } - YY_BREAK -case 141: -YY_RULE_SETUP -#line 274 "swf5compiler.flex" -{ count(); return '>'; } - YY_BREAK -case 142: -YY_RULE_SETUP -#line 275 "swf5compiler.flex" -{ count(); return ';'; } - YY_BREAK -case 143: -YY_RULE_SETUP -#line 276 "swf5compiler.flex" -{ count(); return '='; } - YY_BREAK -case 144: -YY_RULE_SETUP -#line 277 "swf5compiler.flex" -{ count(); return '+'; } - YY_BREAK -case 145: -YY_RULE_SETUP -#line 278 "swf5compiler.flex" -{ count(); return '-'; } - YY_BREAK -case 146: -YY_RULE_SETUP -#line 279 "swf5compiler.flex" -{ count(); return '&'; } - YY_BREAK -case 147: -YY_RULE_SETUP -#line 280 "swf5compiler.flex" -{ count(); return '|'; } - YY_BREAK -case 148: -YY_RULE_SETUP -#line 281 "swf5compiler.flex" -{ count(); return '^'; } - YY_BREAK -case 149: -YY_RULE_SETUP -#line 282 "swf5compiler.flex" -{ count(); return '*'; } - YY_BREAK -case 150: -YY_RULE_SETUP -#line 283 "swf5compiler.flex" -{ count(); return '/'; } - YY_BREAK -case 151: -YY_RULE_SETUP -#line 284 "swf5compiler.flex" -{ count(); return '%'; } - YY_BREAK -case 152: -YY_RULE_SETUP -#line 285 "swf5compiler.flex" -{ count(); return '!'; } - YY_BREAK -case 153: -YY_RULE_SETUP -#line 286 "swf5compiler.flex" -{ count(); return '('; } - YY_BREAK -case 154: -YY_RULE_SETUP -#line 287 "swf5compiler.flex" -{ count(); return ')'; } - YY_BREAK -case 155: -YY_RULE_SETUP -#line 288 "swf5compiler.flex" -{ count(); return '['; } - YY_BREAK -case 156: -YY_RULE_SETUP -#line 289 "swf5compiler.flex" -{ count(); return ']'; } - YY_BREAK -case 157: -YY_RULE_SETUP -#line 290 "swf5compiler.flex" -{ count(); return '{'; } - YY_BREAK -case 158: -YY_RULE_SETUP -#line 291 "swf5compiler.flex" -{ count(); BEGIN(0); return '}'; } - YY_BREAK -case 159: -YY_RULE_SETUP -#line 292 "swf5compiler.flex" -{ count(); return ','; } - YY_BREAK -case 160: -YY_RULE_SETUP -#line 293 "swf5compiler.flex" -{ count(); return '.'; } - YY_BREAK -case 161: -YY_RULE_SETUP -#line 294 "swf5compiler.flex" -{ count(); return '?'; } - YY_BREAK -case 162: -YY_RULE_SETUP -#line 295 "swf5compiler.flex" -{ count(); return ':'; } - YY_BREAK -case 163: -YY_RULE_SETUP -#line 296 "swf5compiler.flex" -{ count(); return '~'; } - YY_BREAK -case 164: -/* rule 164 can match eol */ -YY_RULE_SETUP -#line 298 "swf5compiler.flex" -{ count(); strcpy(szLine, swf5text + 1); - countline(); yyless(1); } - YY_BREAK -case 165: -YY_RULE_SETUP -#line 301 "swf5compiler.flex" -SWF_error("Unrecognized character: %s\n", swf5text); - YY_BREAK -case 166: -YY_RULE_SETUP -#line 303 "swf5compiler.flex" -ECHO; - YY_BREAK -#line 2040 "lex.swf5.c" -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(asm): - yyterminate(); - - 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 swf5in at a new source and called - * swf5lex(). 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; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = swf5in; - 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 - { - 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 ( swf5wrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * swf5text, 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 swf5lex */ - -/* 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 - */ -static int yy_get_next_buffer (void) -{ - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register 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; - - 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. */ - swf5realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - 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; - swf5restart(swf5in ); - } - - 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; - - (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 */ - - static yy_state_type yy_get_previous_state (void) -{ - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = (yy_start); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - register 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 >= 650 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) 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 ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -{ - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); - - register 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 >= 650 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 649); - - return yy_is_jam ? 0 : yy_current_state; -} - - static void yyunput (int c, register char * yy_bp ) -{ - register char *yy_cp; - - yy_cp = (yy_c_buf_p); - - /* undo effects of setting up swf5text */ - *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. */ - register int number_to_move = (yy_n_chars) + 2; - register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - register 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) = 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; - - (yytext_ptr) = yy_bp; - (yy_hold_char) = *yy_cp; - (yy_c_buf_p) = yy_cp; -} - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) -#else - static int input (void) -#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 = (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. */ - swf5restart(swf5in ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( swf5wrap( ) ) - return EOF; - - 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 swf5text */ - (yy_hold_char) = *++(yy_c_buf_p); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** 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 . - */ - void swf5restart (FILE * input_file ) -{ - - if ( ! YY_CURRENT_BUFFER ){ - swf5ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - swf5_create_buffer(swf5in,YY_BUF_SIZE ); - } - - swf5_init_buffer(YY_CURRENT_BUFFER,input_file ); - swf5_load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ - void swf5_switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - - /* TODO. We should be able to replace this entire function body - * with - * swf5pop_buffer_state(); - * swf5push_buffer_state(new_buffer); - */ - swf5ensure_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; - swf5_load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (swf5wrap()) processing, but the only time this flag - * is looked at is after swf5wrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; -} - -static void swf5_load_buffer_state (void) -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - swf5in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (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. - */ - YY_BUFFER_STATE swf5_create_buffer (FILE * file, int size ) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) swf5alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in swf5_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 *) swf5alloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in swf5_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - swf5_init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with swf5_create_buffer() - * - */ - void swf5_delete_buffer (YY_BUFFER_STATE b ) -{ - - 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 ) - swf5free((void *) b->yy_ch_buf ); - - swf5free((void *) b ); -} - -#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __THROW /* this is a gnuism */ -extern int isatty (int ) __THROW; -#else -extern int isatty (int ); -#endif -#ifdef __cplusplus -} -#endif -#endif - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a swf5restart() or at EOF. - */ - static void swf5_init_buffer (YY_BUFFER_STATE b, FILE * file ) - -{ - int oerrno = errno; - - swf5_flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then swf5_init_buffer was _probably_ - * called from swf5restart() 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; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - 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. - * - */ - void swf5_flush_buffer (YY_BUFFER_STATE b ) -{ - 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 ) - swf5_load_buffer_state( ); -} - -/** 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. - * - */ -void swf5push_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - if (new_buffer == NULL) - return; - - swf5ensure_buffer_stack(); - - /* This block is copied from swf5_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 swf5_switch_to_buffer. */ - swf5_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void swf5pop_buffer_state (void) -{ - if (!YY_CURRENT_BUFFER) - return; - - swf5_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - swf5_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void swf5ensure_buffer_stack (void) -{ - int 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; - (yy_buffer_stack) = (struct yy_buffer_state**)swf5alloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - - 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. */ - int grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)swf5realloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - - /* 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; - } -} - -/** 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 swf5_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 0; - - b = (YY_BUFFER_STATE) swf5alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in swf5_scan_buffer()" ); - - b->yy_buf_size = 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 = 0; - 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; - - swf5_switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to swf5lex() will - * scan from a @e copy of @a str. - * @param str 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 - * swf5_scan_bytes() instead. - */ -YY_BUFFER_STATE swf5_scan_string (yyconst char * yystr ) -{ - - return swf5_scan_bytes(yystr,strlen(yystr) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to swf5lex() will - * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE swf5_scan_bytes (yyconst 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 = _yybytes_len + 2; - buf = (char *) swf5alloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in swf5_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 = swf5_scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in swf5_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; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up swf5text. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - swf5text[swf5leng] = (yy_hold_char); \ - (yy_c_buf_p) = swf5text + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - swf5leng = yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - * - */ -int swf5get_lineno (void) -{ - - return swf5lineno; -} - -/** Get the input stream. - * - */ -FILE *swf5get_in (void) -{ - return swf5in; -} - -/** Get the output stream. - * - */ -FILE *swf5get_out (void) -{ - return swf5out; -} - -/** Get the length of the current token. - * - */ -int swf5get_leng (void) -{ - return swf5leng; -} - -/** Get the current token. - * - */ - -char *swf5get_text (void) -{ - return swf5text; -} - -/** Set the current line number. - * @param line_number - * - */ -void swf5set_lineno (int line_number ) -{ - - swf5lineno = line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param in_str A readable stream. - * - * @see swf5_switch_to_buffer - */ -void swf5set_in (FILE * in_str ) -{ - swf5in = in_str ; -} - -void swf5set_out (FILE * out_str ) -{ - swf5out = out_str ; -} - -int swf5get_debug (void) -{ - return swf5_flex_debug; -} - -void swf5set_debug (int bdebug ) -{ - swf5_flex_debug = bdebug ; -} - -static int yy_init_globals (void) -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from swf5lex_destroy(), so don't allocate here. - */ - - (yy_buffer_stack) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - swf5in = stdin; - swf5out = stdout; -#else - swf5in = (FILE *) 0; - swf5out = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * swf5lex_init() - */ - return 0; -} - -/* swf5lex_destroy is for both reentrant and non-reentrant scanners. */ -int swf5lex_destroy (void) -{ - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - swf5_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - swf5pop_buffer_state(); - } - - /* Destroy the stack itself. */ - swf5free((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * swf5lex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *swf5alloc (yy_size_t size ) -{ - return (void *) malloc( size ); -} - -void *swf5realloc (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 (void *) realloc( (char *) ptr, size ); -} - -void swf5free (void * ptr ) -{ - free( (char *) ptr ); /* see swf5realloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 303 "swf5compiler.flex" - - -static int getinput() { -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif -} - -int swf5wrap() -{ - return 1; -} - -static void countline() -{ - if(sLineNumber != 0) - msgline[column] = 0; - - ++sLineNumber; - column = 0; - msgline = msgbufs[sLineNumber & 1]; -} - -static int LineNumber(void) -{ - return (sLineNumber + 1); -} - -static int ColumnNumber(void) -{ - return column; -} - -static char *LineText(void) -{ - msgline[column] = 0; - return msgline; -} - -static void comment() -{ - // Handle block comments - - int c, c1; - -loop: - // We have the start of a comment so look skip everything up to the - // end of the comment character - while ((c = getinput()) != '*' && c != EOF) - { - if(column < 1023) - msgline[column] = c; - - ++column; - - // keep the line number in synch - if (c == '\n') - { - // start the output (matches the algorithim in the lexx above) - countline(); - } - - if (swf5debug) putchar(c); - } - - // is this the end of comment character - if ((c1 = getinput()) != '/' && c != EOF) - { - // false start as this was no end of comment - do_unput5(c1); - goto loop; - } - - // write out the start of the end of comment - if (c != EOF) - if (swf5debug) putchar(c); - - // write out the end of the end of comment - if (c1 != EOF) - if (swf5debug) putchar(c1); -} - -static void comment1() -{ - // Handle comment of type 1 (ie '//') - - int c; - - // this is a line comment - while ((c = getinput()) != '\n' && c != EOF) - { - if (swf5debug) putchar(c); - - if(column < 1023) - msgline[column] = c; - - ++column; - }; - - // keep the line number in synch - if (c == '\n') - { - if (swf5debug) putchar(c); - - countline(); - } -} - -static void count(void) -{ - int n; - - // Count the characters to maintain the current column position - if (swf5text[0] == '\n') - { - if (swf5debug) printf("\n"); - } - else - { - if (swf5debug) printf("%s", swf5text); - - for(n=0; n -#include -#include "libming.h" - -int SWF_versionNum = 7; - -void (*SWF_error)(const char *msg, ...) = 0; -void (*SWF_warn)(const char *msg, ...) = 0; - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/libming.h b/fluidbook/tools/swftools-special-swfdump/lib/action/libming.h deleted file mode 100644 index 2ea6a9b7f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/libming.h +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include -#include - -#ifndef __libming_h__ -#define __libming_h__ - -typedef unsigned char byte; - -extern void (*SWF_error)(const char *msg, ...); -extern void (*SWF_warn)(const char *msg, ...); - -extern int SWF_versionNum; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/listaction.c b/fluidbook/tools/swftools-special-swfdump/lib/action/listaction.c deleted file mode 100644 index b3309cec9..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/listaction.c +++ /dev/null @@ -1,557 +0,0 @@ -#include -#include -#include -#include "action.h" -#include "compile.h" - - -#define print(x) {fputs(x,stdout);} - -int gIndent; -#define INDENT_LEVEL 2 - -void println(const char *s, ...) -{ - va_list ap; - int n = gIndent*INDENT_LEVEL; - - while(n-- > 0) - putchar(' '); - - va_start(ap, s); - vprintf(s, ap); - va_end(ap); - - putchar('\n'); -} - -int fileOffset = 0; - -int readUInt8(Buffer f) -{ - return f->buffer[fileOffset++]; -} - -int readSInt8(Buffer f) -{ - return (signed char)readUInt8(f); -} - -int readSInt16(Buffer f) -{ - return readUInt8(f) + readSInt8(f)*256; -} - -int readUInt16(Buffer f) -{ - return readUInt8(f) + (readUInt8(f)<<8); -} - -long readSInt32(Buffer f) -{ - return (long)readUInt8(f) + (readUInt8(f)<<8) + (readUInt8(f)<<16) + (readUInt8(f)<<24); -} - -unsigned long readUInt32(Buffer f) -{ - return (unsigned long)(readUInt8(f) + (readUInt8(f)<<8) + (readUInt8(f)<<16) + (readUInt8(f)<<24)); -} - -double readDouble(Buffer f) -{ - double d; - unsigned char *p = (unsigned char *)&d; - - p[4] = readUInt8(f); - p[5] = readUInt8(f); - p[6] = readUInt8(f); - p[7] = readUInt8(f); - p[0] = readUInt8(f); - p[1] = readUInt8(f); - p[2] = readUInt8(f); - p[3] = readUInt8(f); - - return d; -} - -char *readString(Buffer f) -{ - int len = 0, buflen = 256; - char c, *buf, *p; - - buf = (char *)malloc(sizeof(char)*256); - p = buf; - - while((c=(char)readUInt8(f)) != '\0') - { - if(len==buflen) - { - buf = (char *)realloc(buf, sizeof(char)*(buflen+256)); - buflen += 256; - p = buf+len; - } - - *(p++) = c; - ++len; - } - - *p = 0; - - return buf; -} - -void dumpBytes(Buffer f, int length) -{ - int j=0, i, k; - unsigned char buf[16]; - - if(length==0) - return; - - for(;;) - { - for(i=0; i<16; ++i) - { - printf("%02x ", buf[i] = readUInt8(f)); - ++j; - - if(j==length) - break; - } - - if(j==length) - { - for(k=i+1; k<16; ++k) - print(" "); - - ++i; - } - - print(" "); - - for(k=0; k 31) && (buf[k] < 128)) - putchar(buf[k]); - else - putchar('.'); - - putchar('\n'); - - if(j==length) - break; - } - putchar('\n'); - putchar('\n'); -} - -void printDoAction(Buffer f, int length); - -char *dictionary[256]; - -int printActionRecord(Buffer f) -{ - int length = 0, type; - - printf("(%i)\t", fileOffset); - - type = readUInt8(f); - - if((type&0x80) == 0x80) - length = readUInt16(f); - - switch(type) - { - case SWFACTION_ADD: - println("Add"); - break; - case SWFACTION_SUBTRACT: - println("Subtract"); - break; - case SWFACTION_MULTIPLY: - println("Multiply"); - break; - case SWFACTION_DIVIDE: - println("Divide"); - break; - case SWFACTION_EQUAL: - println("Equals"); - break; - case SWFACTION_LESSTHAN: - println("Less Than"); - break; - case SWFACTION_LOGICALAND: - println("And"); - break; - case SWFACTION_LOGICALOR: - println("Or"); - break; - case SWFACTION_LOGICALNOT: - println("Not"); - break; - case SWFACTION_STRINGEQ: - println("String eq"); - break; - case SWFACTION_STRINGLENGTH: - println("String Length"); - break; - case SWFACTION_SUBSTRING: - println("Substring"); - break; - case SWFACTION_POP: - println("Pop"); - break; - case SWFACTION_INT: - println("Int"); - break; - case SWFACTION_GETVARIABLE: - println("Get Variable"); - break; - case SWFACTION_SETVARIABLE: - println("Set Variable"); - break; - case SWFACTION_SETTARGETEXPRESSION: - println("Set Target Expression"); - break; - case SWFACTION_STRINGCONCAT: - println("String Concat"); - break; - case SWFACTION_GETPROPERTY: - println("Get Property"); - break; - case SWFACTION_SETPROPERTY: - println("Set Property"); - break; - case SWFACTION_DUPLICATECLIP: - println("Duplicate Clip"); - break; - case SWFACTION_REMOVECLIP: - println("Remove Clip"); - break; - case SWFACTION_TRACE: - println("Trace"); - break; - case SWFACTION_STARTDRAGMOVIE: - println("Start Drag Movie"); - break; - case SWFACTION_STOPDRAGMOVIE: - println("Stop Drag Movie"); - break; - case SWFACTION_STRINGCOMPARE: - println("String Compare"); - break; - case SWFACTION_RANDOM: - println("Random"); - break; - case SWFACTION_MBLENGTH: - println("String MB Length"); - break; - case SWFACTION_ORD: - println("Ord"); - break; - case SWFACTION_CHR: - println("Chr"); - break; - case SWFACTION_GETTIMER: - println("Get Timer"); - break; - case SWFACTION_MBSUBSTRING: - println("MB Substring"); - break; - case SWFACTION_MBORD: - println("MB Ord"); - break; - case SWFACTION_MBCHR: - println("MB Chr"); - break; - case SWFACTION_NEXTFRAME: - println("Next Frame"); - break; - case SWFACTION_PREVFRAME: - println("Previous Frame"); - break; - case SWFACTION_PLAY: - println("Play"); - break; - case SWFACTION_STOP: - println("Stop"); - break; - case SWFACTION_TOGGLEQUALITY: - println("Toggle Quality"); - break; - case SWFACTION_STOPSOUNDS: - println("Stop Sounds"); - break; - - /* ops with args */ - case SWFACTION_PUSHDATA: - { - int type; - int start = fileOffset; - - while(fileOffset < start+length) - { - switch(type = readUInt8(f)) - { - case 0: /* string */ - println("Push String: %s", readString(f)); - break; - case 1: /* property */ - readUInt16(f); /* always 0? */ - println("Push Property: %04x", readUInt16(f)); - break; - case 2: /* null */ - println("Push NULL"); - break; - case 3: /* ??? */ - println("Push type 3- ??"); - break; - case 4: - println("Push register %i", readUInt8(f)); - break; - case 5: - if(readUInt8(f)) - println("Push true"); - else - println("Push false"); - break; - case 6: /* double */ - println("Push %f", readDouble(f)); - break; - case 7: /* int */ - println("Push %i", readSInt32(f)); - break; - case 8: /* dictionary */ - println("Push \"%s\"", dictionary[readUInt8(f)]); - break; - case 9: /* dictionary */ - println("Push \"%s\"", dictionary[readSInt16(f)]); - default: - println("unknown push type: %i", type); - } - } - break; - } - case SWFACTION_GOTOFRAME: - println("Goto Frame %i", readUInt16(f)); - break; - case SWFACTION_GETURL: - { - char *url = readString(f); - println("Get URL \"%s\" target \"%s\"", url, readString(f)); - break; - } - case SWFACTION_WAITFORFRAMEEXPRESSION: - println("Wait For Frame Expression, skip %i\n", readUInt8(f)); - break; - case SWFACTION_BRANCHALWAYS: - println("Branch Always %i", readSInt16(f)); - break; - case SWFACTION_GETURL2: - { - int flags = readUInt8(f); - - const char *op = (flags & 0x80) ? "Get URL2 (loadvariables)" : "Get URL2"; - const char *tgt = (flags & 0x40) ? " into target" : ""; - - switch(flags & 0x03) - { - case 0: println("%s%s (Don't send)", op, tgt); break; - case 1: println("%s%s (GET)", op, tgt); break; - case 2: println("%s%s (POST)", op, tgt); break; - } - } - break; - case SWFACTION_BRANCHIFTRUE: - println("Branch If True %i", readSInt16(f)); - break; - case SWFACTION_CALLFRAME: - println("Call Frame"); - dumpBytes(f, length); - break; - case SWFACTION_GOTOEXPRESSION: - print("Goto Expression"); - if(readUInt8(f) == 1) - printf(" and Play\n"); - else - printf(" and Stop\n"); - break; - case SWFACTION_WAITFORFRAME: - { - int frame = readUInt16(f); - println("Wait for frame %i else skip %i", frame, readUInt8(f)); - break; - } - case SWFACTION_SETTARGET: - println("Set Target %s", readString(f)); - break; - case SWFACTION_GOTOLABEL: - println("Goto Label %s", readString(f)); - break; - case SWFACTION_END: - return 0; - break; - - /* f5 ops */ - case SWFACTION_DELETE: - println("Delete"); - break; - case SWFACTION_VAR: - println("Var"); - break; - case SWFACTION_VAREQUALS: - println("Var assign"); - break; - case SWFACTION_INITARRAY: - println("Init array"); - break; - case SWFACTION_INITOBJECT: - println("Init object"); - break; - case SWFACTION_CALLFUNCTION: - println("call function"); - break; - case SWFACTION_RETURN: - println("return"); - break; - case SWFACTION_MODULO: - println("modulo"); - break; - case SWFACTION_NEW: - println("new"); - break; - case SWFACTION_TYPEOF: - println("typeof"); - break; - case SWFACTION_NEWADD: - println("new add"); - break; - case SWFACTION_NEWLESSTHAN: - println("new less than"); - break; - case SWFACTION_NEWEQUALS: - println("new equals"); - break; - case SWFACTION_DUP: - println("dup"); - break; - case SWFACTION_SWAP: - println("swap"); - break; - case SWFACTION_GETMEMBER: - println("get member"); - break; - case SWFACTION_SETMEMBER: - println("set member"); - break; - case SWFACTION_INCREMENT: - println("increment"); - break; - case SWFACTION_CALLMETHOD: - println("call method"); - break; - case SWFACTION_BITWISEAND: - println("bitwise and"); - break; - case SWFACTION_BITWISEOR: - println("bitwise or"); - break; - case SWFACTION_BITWISEXOR: - println("bitwise xor"); - break; - case SWFACTION_SHIFTLEFT: - println("shift left"); - break; - case SWFACTION_SHIFTRIGHT: - println("shift right"); - break; - case SWFACTION_SHIFTRIGHT2: - println("shift right 2"); - break; - - case SWFACTION_CONSTANTPOOL: - { - int i, n = readUInt16(f); - print("declare dictionary:"); - - for(i=0; i 0) - { - printf("%s", readString(f)); - --n; - } - - for(; n>0; --n) - printf(", %s", readString(f)); - - putchar(')'); - putchar('\n'); - - ++gIndent; - printDoAction(f, readUInt16(f)); - --gIndent; - - break; - } - - case SWFACTION_ENUMERATE: - println("enumerate"); - break; - - case SWFACTION_SETREGISTER: - println("set register %i", readUInt8(f)); - break; - -/* f6 actions */ - case SWFACTION_INSTANCEOF: - println("instanceof"); - break; - case SWFACTION_STRICTEQ: - println("strict_equals"); - break; - case SWFACTION_ENUM2: - println("enum2"); - break; - - default: - println("Unknown Action: %02X", type); - dumpBytes(f, length); - } - - return 1; -} - -void printDoAction(Buffer f, int length) -{ - int end; - - if(!f) - return; - - end = fileOffset + length; - - while(fileOffset < end && printActionRecord(f)) - ; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/ming.h b/fluidbook/tools/swftools-special-swfdump/lib/action/ming.h deleted file mode 100644 index cbe4428af..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/ming.h +++ /dev/null @@ -1 +0,0 @@ -#include "libming.h" diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.flex b/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.flex deleted file mode 100644 index 6a6dddde7..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.flex +++ /dev/null @@ -1,403 +0,0 @@ -%{ - -#include -#include - -#include "compile.h" -#include "action.h" -#include "blocks/error.h" -#include "swf4compiler.tab.h" /* defines token types */ - -static int swf4debug; - -static const char *lexBuffer = NULL; -static int lexBufferLen = 0; - -static int sLineNumber = 0; -static char szLine[1024]; -static char msgbufs[2][1024] = { {0}, {0} }, *msgline = {0}; -static int column = 0; - -static void comment(); -static void comment1(); -static void count(); -static void warning(char *msg); - -#define YY_INPUT(buf,result,max_size) result=lexBufferInput(buf, max_size) - -/* thanks to the prolific and brilliant Raff: */ -static int lexBufferInput(char *buf, int max_size) -{ - int l = lexBufferLen > max_size ? max_size : lexBufferLen; - - if (lexBufferLen <= 0) - return YY_NULL; - - memcpy(buf, lexBuffer, l); - lexBuffer += l; - lexBufferLen -= l; - return l; -} - - /* very inefficient method of unescaping strings */ -static void unescape(char *buf) -{ - char *p, *p1; - - for (p1=buf; (p=strchr(p1, '\\')) != 0; p1 = p+1) { - switch(p[1]) - { - case 'b' : p[1] = '\b'; break; - case 'f' : p[1] = '\f'; break; - case 'n' : p[1] = '\n'; break; - case 'r' : p[1] = '\r'; break; - case 't' : p[1] = '\t'; break; - case 'x' : - case 'u' : warning("unsupported escape sequence"); - } - strcpy(p, p+1); - } -} - -void swf4ParseInit(const char *script, int debug) -{ - checkByteOrder(); - yyrestart(NULL); - - swf4debug = debug; - - lexBuffer = script; - lexBufferLen = strlen(script); - sLineNumber = 0; - column = 0; - msgline = msgbufs[0]; -} - -%} - -%{ - // forward declaration needed by the following function -#ifndef YY_PROTO -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif -#endif - static void yyunput YY_PROTO(( int c, char *buf_ptr )); - - void do_unput4(const char c) { unput(c); } -%} - -DIGIT [0-9] -ID [a-zA-Z_][a-zA-Z0-9_]* -LEVEL \.\.? - -%% - -{DIGIT}+ { count(); swf4lval.str = strdup(yytext); - return NUMBER; } -{DIGIT}+"."{DIGIT}* { count(); swf4lval.str = strdup(yytext); - return NUMBER; } -true { count(); swf4lval.str = strdup("1"); - return NUMBER; } -false { count(); swf4lval.str = strdup("0"); - return NUMBER; } -break { count(); return BREAK; } -continue { count(); return CONTINUE; } -else { count(); return ELSE; } -for { count(); return FOR; } -if { count(); return IF; } -while { count(); return WHILE; } -do { count(); return DO; } -valueOf { count(); return EVAL; } - - /* functions */ -random { count(); return RANDOM; } -time { count(); return TIME; } -length { count(); return LENGTH; } -int { count(); return INT; } -concat { count(); return CONCAT; } -duplicateClip { count(); return DUPLICATECLIP; } -removeClip { count(); return REMOVECLIP; } -trace { count(); return TRACE; } -startDrag { count(); return STARTDRAG; } -stopDrag { count(); return STOPDRAG; } -ord { count(); return ORD; } -chr { count(); return CHR; } -callFrame { count(); return CALLFRAME; } -getURL { count(); return GETURL; } -getURL1 { count(); return GETURL1; } -loadMovie { count(); return LOADMOVIE; } -loadVariables { count(); return LOADVARIABLES; } -substr { count(); return SUBSTR; } - -getProperty { count(); return GETPROPERTY; } - - /* getURL2 methods */ -post { count(); swf4lval.getURLMethod = GETURL_METHOD_POST; - return GETURL_METHOD; } -get { count(); swf4lval.getURLMethod = GETURL_METHOD_GET; - return GETURL_METHOD; } -nosend { count(); swf4lval.getURLMethod = GETURL_METHOD_NOSEND; - return GETURL_METHOD; } - - - /* v3 functions */ -nextFrame { count(); return NEXTFRAME; } -prevFrame { count(); return PREVFRAME; } -play { count(); return PLAY; } -stop { count(); return STOP; } -toggleQuality { count(); return TOGGLEQUALITY; } -stopSounds { count(); return STOPSOUNDS; } -gotoFrame { count(); return GOTOFRAME; } -gotoAndPlay { count(); return GOTOANDPLAY; } -frameLoaded { count(); return FRAMELOADED; } -setTarget { count(); return SETTARGET; } - - /* high level functions */ -tellTarget { count(); return TELLTARGET; } - - -this { count(); return THIS; } - -{ID} { count(); swf4lval.str = strdup(yytext); - return IDENTIFIER; } - -{LEVEL}?("/"({ID}|{LEVEL}))+ { count(); swf4lval.str = strdup(yytext); - return PATH; } - -{ID}("/"({ID}|{LEVEL}))+ { count(); swf4lval.str = strdup(yytext); - return PATH; } - -\"(\\.|[^\\"])*\" { count(); swf4lval.str = strdup(yytext+1); - swf4lval.str[strlen(swf4lval.str)-1]=0; - unescape(swf4lval.str); - return STRING; } - -\'(\\.|[^\\'])*\' { count(); swf4lval.str = strdup(yytext+1); - swf4lval.str[strlen(swf4lval.str)-1]=0; - unescape(swf4lval.str); - return STRING; } - -\"(\\.|[^\\"])*$ { count(); swf4lval.str = strdup(""); - warning("Unterminated string!"); - return STRING; } - -\'(\\.|[^\\'])*$ { count(); swf4lval.str = strdup(""); - warning("Unterminated string!"); - return STRING; } - -"/*" { count(); comment(); } -"//" { count(); comment1(); } -[ \t\v\f] { count(); } - -"++" { count(); return INC; } -"--" { count(); return DEC; } -"<" { count(); return '<'; } -">" { count(); return '>'; } -"<=" { count(); return LE; } -">=" { count(); return GE; } -"==" { count(); return EQ; } -"!=" { count(); return NE; } -"&&" { count(); return LAN; } -"||" { count(); return LOR; } -"*=" { count(); return MEQ; } -"/=" { count(); return DEQ; } -"+=" { count(); return IEQ; } -"-=" { count(); return SEQ; } -"===" { count(); return STREQ; } -"!==" { count(); return STRNE; } -"<=>" { count(); return STRCMP; } -".." { count(); return PARENT; } - -";" { count(); return ';'; } -"=" { count(); return '='; } -"+" { count(); return '+'; } -"-" { count(); return '-'; } -"&" { count(); return '&'; } -"*" { count(); return '*'; } -"/" { count(); return '/'; } -"!" { count(); return '!'; } -"(" { count(); return '('; } -")" { count(); return ')'; } -"[" { count(); return '['; } -"]" { count(); return ']'; } -"{" { count(); return '{'; } -"}" { count(); return '}'; } -"," { count(); return ','; } -"." { count(); return '.'; } -"?" { count(); return '?'; } -":" { count(); return ':'; } - -\r?\n { count(); column = 0; - strcpy(szLine, yytext + 1); - ++sLineNumber; yyless(1); } - -. printf( "Unrecognized character: %s\n", yytext ); - -%% -static int getinput() { -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif -} - -int swf4wrap() -{ - return 1; -} - -static void countline() -{ - if(sLineNumber != 0) - msgline[column] = 0; - - ++sLineNumber; - column = 0; - msgline = msgbufs[sLineNumber & 1]; -} - -static int LineNumber(void) -{ - return (sLineNumber + 1); -} - -static int ColumnNumber(void) -{ - return column; -} - -static char *LineText(void) -{ - msgline[column] = 0; - return msgline; -} - -static void comment(void) -{ - // Handle block comments - - int c, c1; - -loop: - // We have the start of a comment so look skip everything up to the - // end of the comment character - while ((c = getinput()) != '*' && c != EOF) - { - if(column < 1023) - msgline[column] = c; - - ++column; - - // keep the line number in synch - if (c == '\n') - { - // start the output (matches the algorithim in the lexx above) - countline(); - } - - if (swf4debug) putchar(c); - } - - // is this the end of comment character - if ((c1 = getinput()) != '/' && c != EOF) - { - // false start as this was no end of comment - do_unput4(c1); - goto loop; - } - - // write out the start of the end of comment - if (c != EOF) - if (swf4debug) putchar(c); - - // write out the end of the end of comment - if (c1 != EOF) - if (swf4debug) putchar(c1); -} - -static void comment1(void) -{ - // Handle comment of type 1 (ie '//') - - int c; - - // this is a line comment - while ((c = getinput()) != '\n' && c != EOF) - { - if (swf4debug) putchar(c); - - if(column < 1023) - msgline[column] = c; - - ++column; - }; - - // keep the line number in synch - if (c == '\n') - { - if (swf4debug) putchar(c); - - countline(); - } -} - -static void count(void) -{ - int n; - - // Count the characters to maintain the current column position - if (yytext[0] == '\n') - { - if (swf4debug) printf("\n"); - } - else - { - if (swf4debug) printf("%s", yytext); - - for(n=0; n. */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.4" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - -/* Using locations. */ -#define YYLSP_NEEDED 0 - -/* Substitute the variable and function names. */ -#define yyparse swf4parse -#define yylex swf4lex -#define yyerror swf4error -#define yylval swf4lval -#define yychar swf4char -#define yydebug swf4debug -#define yynerrs swf4nerrs - - -/* Copy the first part of user declarations. */ - -/* Line 189 of yacc.c */ -#line 5 "swf4compiler.y" - - -#include -#include -#include -#include "compile.h" -#include "action.h" - -#define YYPARSE_PARAM buffer - - - -/* Line 189 of yacc.c */ -#line 94 "swf4compiler.tab.c" - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - BREAK = 258, - FOR = 259, - CONTINUE = 260, - IF = 261, - ELSE = 262, - DO = 263, - WHILE = 264, - THIS = 265, - EVAL = 266, - TIME = 267, - RANDOM = 268, - LENGTH = 269, - INT = 270, - CONCAT = 271, - DUPLICATECLIP = 272, - REMOVECLIP = 273, - TRACE = 274, - STARTDRAG = 275, - STOPDRAG = 276, - ORD = 277, - CHR = 278, - CALLFRAME = 279, - GETURL = 280, - GETURL1 = 281, - LOADMOVIE = 282, - LOADVARIABLES = 283, - POSTURL = 284, - SUBSTR = 285, - GETPROPERTY = 286, - NEXTFRAME = 287, - PREVFRAME = 288, - PLAY = 289, - STOP = 290, - TOGGLEQUALITY = 291, - STOPSOUNDS = 292, - GOTOFRAME = 293, - GOTOANDPLAY = 294, - FRAMELOADED = 295, - SETTARGET = 296, - TELLTARGET = 297, - STRING = 298, - NUMBER = 299, - IDENTIFIER = 300, - PATH = 301, - GETURL_METHOD = 302, - EQ = 303, - LE = 304, - GE = 305, - NE = 306, - LAN = 307, - LOR = 308, - INC = 309, - DEC = 310, - IEQ = 311, - DEQ = 312, - MEQ = 313, - SEQ = 314, - STREQ = 315, - STRNE = 316, - STRCMP = 317, - PARENT = 318, - END = 319, - UMINUS = 320, - POSTFIX = 321, - NEGATE = 322 - }; -#endif - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -{ - -/* Line 214 of yacc.c */ -#line 17 "swf4compiler.y" - - Buffer action; - char *str; - SWFActionFunction function; - SWFGetUrl2Method getURLMethod; - - - -/* Line 214 of yacc.c */ -#line 206 "swf4compiler.tab.c" -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - - -/* Copy the second part of user declarations. */ - - -/* Line 264 of yacc.c */ -#line 218 "swf4compiler.tab.c" - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if 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 - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int yyi) -#else -static int -YYID (yyi) - int yyi; -#endif -{ - return yyi; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (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 _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) - -#endif - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 108 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 1341 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 86 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 22 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 137 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 369 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 322 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 76, 2, 2, 2, 2, 71, 2, - 83, 84, 74, 72, 65, 73, 85, 75, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 68, 82, - 69, 66, 70, 67, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 80, 2, 81, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 77, 78, 79 -}; - -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 5, 7, 10, 12, 15, 19, 21, - 24, 26, 28, 30, 32, 34, 38, 39, 41, 44, - 55, 64, 74, 85, 94, 104, 112, 118, 119, 121, - 131, 137, 144, 154, 155, 157, 160, 163, 167, 172, - 177, 182, 187, 194, 203, 210, 217, 226, 233, 242, - 249, 264, 273, 277, 281, 285, 289, 293, 297, 302, - 307, 312, 317, 322, 327, 333, 339, 344, 348, 353, - 358, 363, 368, 373, 380, 389, 396, 399, 402, 404, - 408, 410, 413, 415, 417, 419, 423, 428, 431, 436, - 439, 442, 445, 449, 453, 457, 461, 465, 469, 473, - 477, 481, 485, 489, 493, 497, 501, 505, 509, 513, - 519, 521, 525, 527, 529, 531, 533, 535, 537, 539, - 541, 545, 547, 549, 552, 555, 560, 565, 569, 573, - 577, 581, 585, 591, 597, 603, 609, 615 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 87, 0, -1, 88, -1, 89, -1, 88, 89, -1, - 90, -1, 80, 81, -1, 80, 92, 81, -1, 82, - -1, 106, 82, -1, 93, -1, 95, -1, 97, -1, - 98, -1, 106, -1, 91, 65, 106, -1, -1, 90, - -1, 92, 90, -1, 6, 83, 40, 83, 44, 84, - 84, 90, 7, 90, -1, 6, 83, 40, 83, 44, - 84, 84, 90, -1, 6, 83, 76, 40, 83, 44, - 84, 84, 90, -1, 6, 83, 40, 83, 107, 84, - 84, 90, 7, 90, -1, 6, 83, 40, 83, 107, - 84, 84, 90, -1, 6, 83, 76, 40, 83, 107, - 84, 84, 90, -1, 6, 83, 107, 84, 90, 7, - 90, -1, 6, 83, 107, 84, 90, -1, -1, 107, - -1, 9, 83, 76, 40, 83, 44, 84, 84, 90, - -1, 9, 83, 107, 84, 90, -1, 8, 90, 9, - 83, 107, 84, -1, 4, 83, 96, 82, 94, 82, - 96, 84, 90, -1, -1, 91, -1, 5, 82, -1, - 3, 82, -1, 21, 83, 84, -1, 24, 83, 103, - 84, -1, 24, 83, 43, 84, -1, 18, 83, 107, - 84, -1, 19, 83, 107, 84, -1, 25, 83, 107, - 65, 107, 84, -1, 25, 83, 107, 65, 107, 65, - 47, 84, -1, 26, 83, 43, 65, 43, 84, -1, - 27, 83, 107, 65, 107, 84, -1, 27, 83, 107, - 65, 107, 65, 47, 84, -1, 28, 83, 107, 65, - 107, 84, -1, 28, 83, 107, 65, 107, 65, 47, - 84, -1, 20, 83, 107, 65, 107, 84, -1, 20, - 83, 107, 65, 107, 65, 107, 65, 107, 65, 107, - 65, 107, 84, -1, 17, 83, 107, 65, 107, 65, - 107, 84, -1, 32, 83, 84, -1, 33, 83, 84, - -1, 34, 83, 84, -1, 35, 83, 84, -1, 36, - 83, 84, -1, 37, 83, 84, -1, 38, 83, 44, - 84, -1, 38, 83, 43, 84, -1, 38, 83, 107, - 84, -1, 39, 83, 107, 84, -1, 41, 83, 43, - 84, -1, 41, 83, 107, 84, -1, 42, 83, 43, - 84, 90, -1, 42, 83, 107, 84, 90, -1, 11, - 83, 107, 84, -1, 12, 83, 84, -1, 13, 83, - 107, 84, -1, 14, 83, 107, 84, -1, 15, 83, - 107, 84, -1, 22, 83, 107, 84, -1, 23, 83, - 107, 84, -1, 16, 83, 107, 65, 107, 84, -1, - 30, 83, 107, 65, 107, 65, 107, 84, -1, 31, - 83, 107, 65, 43, 84, -1, 105, 54, -1, 105, - 55, -1, 100, -1, 83, 102, 84, -1, 44, -1, - 73, 44, -1, 43, -1, 103, -1, 104, -1, 104, - 85, 45, -1, 54, 104, 85, 45, -1, 54, 105, - -1, 55, 104, 85, 45, -1, 55, 105, -1, 73, - 102, -1, 76, 102, -1, 105, 66, 102, -1, 102, - 74, 102, -1, 102, 75, 102, -1, 102, 72, 102, - -1, 102, 73, 102, -1, 102, 71, 102, -1, 102, - 69, 102, -1, 102, 70, 102, -1, 102, 49, 102, - -1, 102, 50, 102, -1, 102, 61, 102, -1, 102, - 60, 102, -1, 102, 62, 102, -1, 102, 48, 102, - -1, 102, 51, 102, -1, 102, 52, 102, -1, 102, - 53, 102, -1, 102, 67, 102, 68, 102, -1, 45, - -1, 104, 68, 45, -1, 10, -1, 85, -1, 75, - -1, 63, -1, 45, -1, 46, -1, 103, -1, 43, - -1, 83, 102, 84, -1, 101, -1, 99, -1, 54, - 105, -1, 55, 105, -1, 54, 104, 85, 45, -1, - 55, 104, 85, 45, -1, 105, 66, 102, -1, 105, - 58, 102, -1, 105, 57, 102, -1, 105, 56, 102, - -1, 105, 59, 102, -1, 104, 85, 45, 66, 102, - -1, 104, 85, 45, 58, 102, -1, 104, 85, 45, - 57, 102, -1, 104, 85, 45, 56, 102, -1, 104, - 85, 45, 59, 102, -1, 102, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 144, 144, 150, 151, 156, 160, 161, 162, 163, - 164, 165, 166, 167, 171, 172, 176, 177, 178, 185, - 201, 217, 229, 243, 257, 267, 278, 288, 289, 313, - 328, 340, 348, 370, 371, 375, 383, 391, 395, 402, - 409, 413, 418, 425, 432, 441, 448, 455, 462, 470, - 477, 489, 498, 502, 506, 510, 514, 518, 522, 529, - 536, 542, 548, 555, 559, 573, 586, 590, 594, 598, - 602, 606, 610, 614, 619, 625, 634, 645, 659, 661, - 664, 669, 675, 680, 686, 691, 699, 714, 724, 739, - 749, 754, 758, 764, 769, 774, 779, 784, 789, 794, - 799, 805, 810, 815, 819, 823, 827, 832, 836, 840, - 852, 854, 861, 864, 867, 870, 873, 876, 881, 886, - 891, 895, 897, 899, 907, 915, 928, 941, 945, 952, - 959, 966, 973, 982, 995, 1008, 1021, 1036 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "BREAK", "FOR", "CONTINUE", "IF", "ELSE", - "DO", "WHILE", "THIS", "EVAL", "TIME", "RANDOM", "LENGTH", "INT", - "CONCAT", "DUPLICATECLIP", "REMOVECLIP", "TRACE", "STARTDRAG", - "STOPDRAG", "ORD", "CHR", "CALLFRAME", "GETURL", "GETURL1", "LOADMOVIE", - "LOADVARIABLES", "POSTURL", "SUBSTR", "GETPROPERTY", "NEXTFRAME", - "PREVFRAME", "PLAY", "STOP", "TOGGLEQUALITY", "STOPSOUNDS", "GOTOFRAME", - "GOTOANDPLAY", "FRAMELOADED", "SETTARGET", "TELLTARGET", "STRING", - "NUMBER", "IDENTIFIER", "PATH", "GETURL_METHOD", "\"==\"", "\"<=\"", - "\">=\"", "\"!=\"", "\"&&\"", "\"||\"", "\"++\"", "\"--\"", "\"+=\"", - "\"/=\"", "\"*=\"", "\"-=\"", "\"===\"", "\"!==\"", "\"<=>\"", "\"..\"", - "\"end\"", "','", "'='", "'?'", "':'", "'<'", "'>'", "'&'", "'+'", "'-'", - "'*'", "'/'", "'!'", "UMINUS", "POSTFIX", "NEGATE", "'{'", "'}'", "';'", - "'('", "')'", "'.'", "$accept", "program", "elems", "elem", "stmt", - "assign_stmts", "statements", "if_stmt", "expr_opt", "iter_stmt", - "assign_stmts_opt", "cont_stmt", "break_stmt", "void_function_call", - "function_call", "pf_expr", "rhs_expr", "variable", "sprite", "lhs_expr", - "assign_stmt", "expr", 0 -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 44, 61, 63, 58, 60, - 62, 38, 43, 45, 42, 47, 33, 320, 321, 322, - 123, 125, 59, 40, 41, 46 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 86, 87, 88, 88, 89, 90, 90, 90, 90, - 90, 90, 90, 90, 91, 91, 92, 92, 92, 93, - 93, 93, 93, 93, 93, 93, 93, 94, 94, 95, - 95, 95, 95, 96, 96, 97, 98, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, - 100, 100, 100, 100, 100, 100, 101, 101, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 103, 103, 104, 104, 104, 104, 104, 104, 105, 105, - 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 107 -}; - -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 1, 1, 2, 1, 2, 3, 1, 2, - 1, 1, 1, 1, 1, 3, 0, 1, 2, 10, - 8, 9, 10, 8, 9, 7, 5, 0, 1, 9, - 5, 6, 9, 0, 1, 2, 2, 3, 4, 4, - 4, 4, 6, 8, 6, 6, 8, 6, 8, 6, - 14, 8, 3, 3, 3, 3, 3, 3, 4, 4, - 4, 4, 4, 4, 5, 5, 4, 3, 4, 4, - 4, 4, 4, 6, 8, 6, 2, 2, 1, 3, - 1, 2, 1, 1, 1, 3, 4, 2, 4, 2, - 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 2, 2, 4, 4, 3, 3, 3, - 3, 3, 5, 5, 5, 5, 5, 1 -}; - -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 119, 110, - 117, 0, 0, 115, 114, 0, 8, 0, 113, 0, - 2, 3, 5, 10, 11, 12, 13, 122, 121, 118, - 0, 0, 0, 36, 33, 35, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 123, 0, 124, 6, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 80, 0, 0, - 0, 0, 0, 78, 0, 83, 84, 0, 1, 4, - 0, 0, 76, 77, 0, 0, 0, 0, 0, 9, - 34, 0, 14, 0, 0, 137, 0, 0, 0, 0, - 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, - 0, 0, 52, 53, 54, 55, 56, 57, 82, 80, - 0, 0, 82, 0, 82, 0, 0, 0, 7, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 87, 0, 89, 80, 90, 91, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 120, 0, 0, 111, 0, - 130, 129, 128, 131, 127, 0, 27, 0, 0, 0, - 0, 0, 0, 0, 40, 41, 0, 39, 38, 0, - 0, 0, 0, 59, 58, 60, 61, 62, 63, 0, - 0, 125, 126, 0, 67, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 79, 105, 100, 101, 106, - 107, 108, 103, 102, 104, 0, 98, 99, 97, 95, - 96, 93, 94, 85, 92, 0, 0, 0, 0, 0, - 15, 0, 28, 80, 0, 0, 26, 0, 0, 30, - 0, 0, 0, 0, 0, 0, 64, 65, 66, 68, - 69, 70, 0, 71, 72, 0, 0, 86, 88, 0, - 135, 134, 133, 136, 132, 33, 0, 0, 80, 0, - 0, 31, 0, 0, 0, 49, 0, 42, 44, 0, - 45, 0, 47, 0, 0, 0, 109, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, 0, 73, - 0, 75, 0, 20, 23, 0, 0, 0, 51, 0, - 43, 46, 48, 0, 32, 0, 0, 21, 24, 29, - 0, 74, 19, 22, 0, 0, 0, 0, 50 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 39, 40, 41, 42, 120, 85, 43, 271, 44, - 121, 45, 46, 47, 103, 48, 125, 105, 106, 107, - 52, 126 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -70 -static const yytype_int16 yypact[] = -{ - 780, -69, -64, -60, -49, 780, -28, -70, -22, -14, - -2, 3, 4, 11, 13, 17, 19, 20, 23, 25, - 26, 29, 30, 31, 33, 47, 54, 56, -70, 16, - -70, 32, 32, -70, -70, 614, -70, 422, -70, 72, - 780, -70, -70, -70, -70, -70, -70, -70, -70, -70, - -12, 65, 1, -70, 108, -70, 826, 80, 994, 422, - 422, 422, 422, 64, 5, 422, 118, 422, 422, 81, - 82, 86, 88, 89, 104, 1020, 422, 1076, 1102, -11, - -70, -9, -70, -70, -70, 697, 106, 109, 117, 119, - 120, 121, 123, 125, 127, 130, 98, -70, 32, 32, - 1158, 422, 422, -70, 516, 135, -6, 141, -70, -70, - 145, 169, -70, -70, 422, 422, 422, 422, 422, -70, - 151, 137, -70, 139, 882, 613, 136, 140, 938, 142, - 160, 143, 144, 166, -70, 148, 149, 170, 172, 174, - 175, 178, -70, -70, -70, -70, -70, -70, -48, 150, - 161, 162, -21, 163, -13, 164, 199, 204, -70, -70, - 422, 167, 422, 422, 422, 422, 422, 422, 422, 422, - -3, -70, -1, -70, -70, -70, -70, 1257, 422, 422, - 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, - 422, 422, 422, 422, 422, -70, 205, 422, -70, 128, - 613, 613, 613, 613, 613, 108, 422, 1184, 171, 780, - 422, 173, 780, 422, -70, -70, 422, -70, -70, 422, - 210, 422, 422, -70, -70, -70, -70, -70, -70, 780, - 780, -70, -70, 176, -70, 177, 179, 180, 190, 182, - 188, 192, 193, 214, 228, 212, -46, 124, 124, -46, - 696, 696, -46, -46, 124, 107, 124, 124, -65, 18, - 18, -70, -70, -70, 613, 422, 422, 422, 422, 422, - -70, 197, -70, 191, 196, 1240, 274, 206, 244, -70, - 224, -63, -51, 207, -45, -35, -70, -70, -70, -70, - -70, -70, 422, -70, -70, 422, 249, -70, -70, 422, - 613, 613, 613, 613, 613, 108, 211, 213, 215, 216, - 780, -70, 217, 422, 422, -70, 246, -70, -70, 247, - -70, 251, -70, 218, 231, 219, 613, 220, 780, 780, - 222, 223, -70, 225, 229, 243, 230, 234, 235, -70, - 422, -70, 780, 305, 308, 780, 780, 780, -70, 422, - -70, -70, -70, 236, -70, 780, 780, -70, -70, -70, - 256, -70, -70, -70, 422, 258, 422, 240, -70 -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -70, -70, -70, 285, 53, -70, -70, -70, -70, -70, - 21, -70, -70, -70, -70, -70, 346, 0, 6, 12, - -53, 209 -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -121 -static const yytype_int16 yytable[] = -{ - 49, 122, 314, 179, 180, 49, 50, 191, 192, 193, - 194, 50, 51, 53, 316, 7, 186, 51, -119, 54, - 319, 315, 55, 188, 189, 190, 191, 192, 193, 194, - 321, 49, 49, 317, 56, 49, 223, 79, 81, 320, - 49, 50, 7, 80, 82, -119, 50, 51, 135, 322, - 29, 30, 51, -119, 49, 58, 110, 110, 57, 110, - 50, 59, 110, 227, 136, 110, 51, 110, 33, 60, - 137, 229, 108, 111, 156, 28, 157, 29, 30, 196, - 34, 61, 243, 119, 244, 49, 62, 63, 84, 127, - 38, 50, 193, 194, 64, 33, 65, 51, 49, 49, - 66, -116, 67, 68, 170, 172, 69, 34, 70, 71, - 171, 173, 72, 73, 74, 37, 75, 38, 7, 112, - 113, 114, 115, 116, 117, 8, 9, 10, 11, 12, - 76, 118, 13, 14, 15, 16, 17, 77, 159, 78, - 18, 19, 20, 21, 22, 23, 24, 25, 134, 26, - 27, 28, 270, 29, 30, 178, 179, 180, 181, 182, - 183, 139, 31, 32, -119, 142, 143, 184, 185, 186, - 144, 33, 145, 146, 187, 299, 188, 189, 190, 191, - 192, 193, 194, 34, 265, 266, 267, 268, 147, 160, - 198, 37, 161, 38, 269, 190, 191, 192, 193, 194, - 162, -118, 163, 164, 165, 49, 166, 197, 167, 49, - 168, 50, 49, 169, 199, 50, 205, 51, 50, 206, - 209, 51, 207, 210, 51, 213, 212, 214, 215, 49, - 49, 216, 217, 218, 224, 50, 50, 219, 110, 220, - 221, 51, 51, 222, 231, 225, 226, 228, 230, 232, - 263, 234, 122, 283, 275, 292, 278, 295, 296, 297, - 288, 289, 276, 290, 291, 279, 293, 129, 130, 131, - 132, 133, 294, 298, 138, 306, 140, 141, -120, 305, - 307, 310, 286, 287, 150, 151, 153, 155, 312, 313, - 311, 318, 325, 336, 337, 328, 340, 329, 338, 330, - 331, 333, 339, 341, 342, 49, 345, 346, 349, 347, - 49, 50, 355, 348, 350, 356, 50, 51, 351, 352, - 361, 364, 51, 366, 368, 109, 327, 0, 49, 49, - 0, 0, 0, 0, 50, 50, 0, 0, 0, 0, - 51, 51, 49, 0, 0, 49, 49, 49, 50, 0, - 0, 50, 50, 50, 51, 49, 49, 51, 51, 51, - 0, 50, 50, 332, 0, 0, 0, 51, 51, 233, - 0, 235, 236, 237, 238, 239, 240, 241, 242, 0, - 0, 343, 344, 104, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 354, 0, 0, 357, 358, - 359, 0, 0, 0, 0, 0, 0, 0, 362, 363, - 0, 0, 0, 0, 0, 272, 274, 0, 0, 277, - 0, 0, 280, 0, 0, 281, 0, 0, 282, 0, - 284, 285, 7, 86, 87, 88, 89, 90, 91, 0, - 0, 0, 0, 0, 92, 93, 175, 176, 177, 0, - 0, 0, 94, 95, 0, 0, 0, 0, 0, 0, - 200, 201, 202, 203, 204, 96, 97, 29, 30, 0, - 176, 0, 0, 0, 176, 0, 98, 99, 0, 0, - 0, 0, 0, 0, 309, 33, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 100, 0, 34, 101, 0, - 0, 323, 0, 0, 324, 102, 0, 38, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 334, 335, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 0, 0, 264, 0, 0, 0, 0, 0, 353, - 0, 0, 0, 0, 0, 0, 0, 0, 360, 0, - 0, 0, 0, 0, 178, 179, 180, 181, 182, 183, - 0, 0, 0, 365, 0, 367, 184, 185, 186, 0, - 0, 0, 0, 187, 0, 188, 189, 190, 191, 192, - 193, 194, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 300, 301, 302, 303, 304, 0, 1, 2, 3, - 4, 0, 5, 6, 7, 0, 0, 0, 0, 0, - 0, 8, 9, 10, 11, 12, 0, 0, 13, 14, - 15, 16, 17, 0, 0, 326, 18, 19, 20, 21, - 22, 23, 24, 25, 0, 26, 27, 28, 0, 29, - 30, 178, 179, 180, 181, 182, 183, 0, 31, 32, - 0, 0, 0, 184, 185, 186, 0, 33, 0, 0, - 187, 0, 188, 189, 190, 191, 192, 193, 194, 34, - 0, 0, 0, 0, 35, 83, 36, 37, 0, 38, - 1, 2, 3, 4, 0, 5, 6, 7, 0, 0, - 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, - 0, 13, 14, 15, 16, 17, 0, 0, 0, 18, - 19, 20, 21, 22, 23, 24, 25, 0, 26, 27, - 28, 0, 29, 30, 178, 179, 180, 181, 0, 0, - 0, 31, 32, 0, 0, 0, 184, 185, 186, 0, - 33, 0, 0, 0, 0, 188, 189, 190, 191, 192, - 193, 194, 34, 0, 0, 0, 0, 35, 158, 36, - 37, 0, 38, 1, 2, 3, 4, 0, 5, 6, - 7, 0, 0, 0, 0, 0, 0, 8, 9, 10, - 11, 12, 0, 0, 13, 14, 15, 16, 17, 0, - 0, 0, 18, 19, 20, 21, 22, 23, 24, 25, - 0, 26, 27, 28, 0, 29, 30, 0, 0, 0, - 0, 0, 0, 0, 31, 32, 7, 86, 87, 88, - 89, 90, 91, 33, 0, 0, 0, 0, 92, 93, - 0, 0, 0, 0, 0, 34, 94, 95, 0, 0, - 35, 0, 36, 37, 0, 38, 123, 0, 0, 96, - 97, 29, 30, 0, 0, 0, 0, 0, 0, 0, - 98, 99, 0, 0, 0, 0, 0, 0, 0, 33, - 0, 0, 7, 86, 87, 88, 89, 90, 91, 100, - 0, 34, 124, 0, 92, 93, 0, 0, 0, 102, - 0, 38, 94, 95, 0, 0, 0, 0, 0, 0, - 0, 0, 208, 0, 0, 96, 97, 29, 30, 0, - 0, 0, 0, 0, 0, 0, 98, 99, 0, 0, - 0, 0, 0, 0, 0, 33, 0, 0, 7, 86, - 87, 88, 89, 90, 91, 100, 0, 34, 101, 0, - 92, 93, 0, 0, 0, 102, 0, 38, 94, 95, - 0, 0, 0, 0, 0, 0, 0, 0, 211, 0, - 0, 96, 97, 29, 30, 0, 0, 0, 0, 0, - 0, 0, 98, 99, 0, 0, 0, 0, 0, 0, - 0, 33, 0, 0, 7, 86, 87, 88, 89, 90, - 91, 100, 0, 34, 101, 0, 92, 93, 0, 0, - 0, 102, 0, 38, 94, 95, 0, 0, 0, 0, - 7, 86, 87, 88, 89, 90, 91, 96, 97, 29, - 30, 0, 92, 93, 0, 0, 0, 0, 98, 99, - 94, 95, 0, 0, 0, 0, 0, 33, 0, 0, - 0, 0, 0, 148, 149, 29, 30, 100, 0, 34, - 128, 0, 0, 0, 98, 99, 0, 102, 0, 38, - 0, 0, 0, 33, 0, 0, 7, 86, 87, 88, - 89, 90, 91, 100, 0, 34, 101, 0, 92, 93, - 0, 0, 0, 102, 0, 38, 94, 95, 0, 0, - 0, 0, 7, 86, 87, 88, 89, 90, 91, 152, - 97, 29, 30, 0, 92, 93, 0, 0, 0, 0, - 98, 99, 94, 95, 0, 0, 0, 0, 0, 33, - 0, 0, 0, 0, 0, 154, 97, 29, 30, 100, - 0, 34, 101, 0, 0, 0, 98, 99, 0, 102, - 0, 38, 0, 0, 0, 33, 0, 0, 7, 86, - 87, 88, 89, 90, 91, 100, 0, 34, 101, 0, - 92, 93, 0, 0, 0, 102, 0, 38, 94, 95, - 0, 0, 0, 0, 7, 86, 87, 88, 89, 90, - 91, 96, 174, 29, 30, 0, 92, 93, 0, 0, - 0, 0, 98, 99, 94, 95, 0, 0, 0, 0, - 0, 33, 0, 0, 0, 0, 0, 96, 273, 29, - 30, 100, 0, 34, 101, 0, 0, 0, 98, 99, - 0, 102, 0, 38, 0, 0, 0, 33, 0, 0, - 7, 86, 87, 88, 89, 90, 91, 100, 0, 34, - 101, 0, 92, 93, 0, 0, 0, 102, 0, 38, - 94, 95, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 96, 308, 29, 30, 0, 0, 0, - 0, 0, 0, 0, 98, 99, 0, 0, 0, 0, - 0, 0, 0, 33, 0, 178, 179, 180, 181, 182, - 183, 0, 0, 100, 0, 34, 101, 184, 185, 186, - 0, 0, 0, 102, 187, 38, 188, 189, 190, 191, - 192, 193, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 245 -}; - -static const yytype_int16 yycheck[] = -{ - 0, 54, 65, 49, 50, 5, 0, 72, 73, 74, - 75, 5, 0, 82, 65, 10, 62, 5, 66, 83, - 65, 84, 82, 69, 70, 71, 72, 73, 74, 75, - 65, 31, 32, 84, 83, 35, 84, 31, 32, 84, - 40, 35, 10, 31, 32, 66, 40, 35, 43, 84, - 45, 46, 40, 66, 54, 83, 68, 68, 5, 68, - 54, 83, 68, 84, 64, 68, 54, 68, 63, 83, - 64, 84, 0, 85, 85, 43, 85, 45, 46, 85, - 75, 83, 85, 82, 85, 85, 83, 83, 35, 9, - 85, 85, 74, 75, 83, 63, 83, 85, 98, 99, - 83, 85, 83, 83, 98, 99, 83, 75, 83, 83, - 98, 99, 83, 83, 83, 83, 83, 85, 10, 54, - 55, 56, 57, 58, 59, 17, 18, 19, 20, 21, - 83, 66, 24, 25, 26, 27, 28, 83, 85, 83, - 32, 33, 34, 35, 36, 37, 38, 39, 84, 41, - 42, 43, 205, 45, 46, 48, 49, 50, 51, 52, - 53, 43, 54, 55, 66, 84, 84, 60, 61, 62, - 84, 63, 84, 84, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 75, 56, 57, 58, 59, 84, 83, - 45, 83, 83, 85, 66, 71, 72, 73, 74, 75, - 83, 66, 83, 83, 83, 205, 83, 66, 83, 209, - 83, 205, 212, 83, 45, 209, 65, 205, 212, 82, - 84, 209, 83, 83, 212, 65, 84, 84, 84, 229, - 230, 65, 84, 84, 84, 229, 230, 65, 68, 65, - 65, 229, 230, 65, 45, 84, 84, 84, 84, 45, - 45, 84, 305, 43, 83, 65, 83, 65, 65, 45, - 84, 84, 209, 84, 84, 212, 84, 58, 59, 60, - 61, 62, 84, 45, 65, 84, 67, 68, 66, 82, - 84, 7, 229, 230, 75, 76, 77, 78, 44, 65, - 84, 84, 43, 47, 47, 84, 65, 84, 47, 84, - 84, 84, 84, 84, 84, 305, 84, 84, 65, 84, - 310, 305, 7, 84, 84, 7, 310, 305, 84, 84, - 84, 65, 310, 65, 84, 40, 305, -1, 328, 329, - -1, -1, -1, -1, 328, 329, -1, -1, -1, -1, - 328, 329, 342, -1, -1, 345, 346, 347, 342, -1, - -1, 345, 346, 347, 342, 355, 356, 345, 346, 347, - -1, 355, 356, 310, -1, -1, -1, 355, 356, 160, - -1, 162, 163, 164, 165, 166, 167, 168, 169, -1, - -1, 328, 329, 37, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 342, -1, -1, 345, 346, - 347, -1, -1, -1, -1, -1, -1, -1, 355, 356, - -1, -1, -1, -1, -1, 206, 207, -1, -1, 210, - -1, -1, 213, -1, -1, 216, -1, -1, 219, -1, - 221, 222, 10, 11, 12, 13, 14, 15, 16, -1, - -1, -1, -1, -1, 22, 23, 100, 101, 102, -1, - -1, -1, 30, 31, -1, -1, -1, -1, -1, -1, - 114, 115, 116, 117, 118, 43, 44, 45, 46, -1, - 124, -1, -1, -1, 128, -1, 54, 55, -1, -1, - -1, -1, -1, -1, 275, 63, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 73, -1, 75, 76, -1, - -1, 292, -1, -1, 295, 83, -1, 85, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 313, 314, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, -1, -1, 197, -1, -1, -1, -1, -1, 340, - -1, -1, -1, -1, -1, -1, -1, -1, 349, -1, - -1, -1, -1, -1, 48, 49, 50, 51, 52, 53, - -1, -1, -1, 364, -1, 366, 60, 61, 62, -1, - -1, -1, -1, 67, -1, 69, 70, 71, 72, 73, - 74, 75, -1, -1, -1, -1, -1, -1, -1, -1, - 84, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 265, 266, 267, 268, 269, -1, 3, 4, 5, - 6, -1, 8, 9, 10, -1, -1, -1, -1, -1, - -1, 17, 18, 19, 20, 21, -1, -1, 24, 25, - 26, 27, 28, -1, -1, 299, 32, 33, 34, 35, - 36, 37, 38, 39, -1, 41, 42, 43, -1, 45, - 46, 48, 49, 50, 51, 52, 53, -1, 54, 55, - -1, -1, -1, 60, 61, 62, -1, 63, -1, -1, - 67, -1, 69, 70, 71, 72, 73, 74, 75, 75, - -1, -1, -1, -1, 80, 81, 82, 83, -1, 85, - 3, 4, 5, 6, -1, 8, 9, 10, -1, -1, - -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, - -1, 24, 25, 26, 27, 28, -1, -1, -1, 32, - 33, 34, 35, 36, 37, 38, 39, -1, 41, 42, - 43, -1, 45, 46, 48, 49, 50, 51, -1, -1, - -1, 54, 55, -1, -1, -1, 60, 61, 62, -1, - 63, -1, -1, -1, -1, 69, 70, 71, 72, 73, - 74, 75, 75, -1, -1, -1, -1, 80, 81, 82, - 83, -1, 85, 3, 4, 5, 6, -1, 8, 9, - 10, -1, -1, -1, -1, -1, -1, 17, 18, 19, - 20, 21, -1, -1, 24, 25, 26, 27, 28, -1, - -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, - -1, 41, 42, 43, -1, 45, 46, -1, -1, -1, - -1, -1, -1, -1, 54, 55, 10, 11, 12, 13, - 14, 15, 16, 63, -1, -1, -1, -1, 22, 23, - -1, -1, -1, -1, -1, 75, 30, 31, -1, -1, - 80, -1, 82, 83, -1, 85, 40, -1, -1, 43, - 44, 45, 46, -1, -1, -1, -1, -1, -1, -1, - 54, 55, -1, -1, -1, -1, -1, -1, -1, 63, - -1, -1, 10, 11, 12, 13, 14, 15, 16, 73, - -1, 75, 76, -1, 22, 23, -1, -1, -1, 83, - -1, 85, 30, 31, -1, -1, -1, -1, -1, -1, - -1, -1, 40, -1, -1, 43, 44, 45, 46, -1, - -1, -1, -1, -1, -1, -1, 54, 55, -1, -1, - -1, -1, -1, -1, -1, 63, -1, -1, 10, 11, - 12, 13, 14, 15, 16, 73, -1, 75, 76, -1, - 22, 23, -1, -1, -1, 83, -1, 85, 30, 31, - -1, -1, -1, -1, -1, -1, -1, -1, 40, -1, - -1, 43, 44, 45, 46, -1, -1, -1, -1, -1, - -1, -1, 54, 55, -1, -1, -1, -1, -1, -1, - -1, 63, -1, -1, 10, 11, 12, 13, 14, 15, - 16, 73, -1, 75, 76, -1, 22, 23, -1, -1, - -1, 83, -1, 85, 30, 31, -1, -1, -1, -1, - 10, 11, 12, 13, 14, 15, 16, 43, 44, 45, - 46, -1, 22, 23, -1, -1, -1, -1, 54, 55, - 30, 31, -1, -1, -1, -1, -1, 63, -1, -1, - -1, -1, -1, 43, 44, 45, 46, 73, -1, 75, - 76, -1, -1, -1, 54, 55, -1, 83, -1, 85, - -1, -1, -1, 63, -1, -1, 10, 11, 12, 13, - 14, 15, 16, 73, -1, 75, 76, -1, 22, 23, - -1, -1, -1, 83, -1, 85, 30, 31, -1, -1, - -1, -1, 10, 11, 12, 13, 14, 15, 16, 43, - 44, 45, 46, -1, 22, 23, -1, -1, -1, -1, - 54, 55, 30, 31, -1, -1, -1, -1, -1, 63, - -1, -1, -1, -1, -1, 43, 44, 45, 46, 73, - -1, 75, 76, -1, -1, -1, 54, 55, -1, 83, - -1, 85, -1, -1, -1, 63, -1, -1, 10, 11, - 12, 13, 14, 15, 16, 73, -1, 75, 76, -1, - 22, 23, -1, -1, -1, 83, -1, 85, 30, 31, - -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, - 16, 43, 44, 45, 46, -1, 22, 23, -1, -1, - -1, -1, 54, 55, 30, 31, -1, -1, -1, -1, - -1, 63, -1, -1, -1, -1, -1, 43, 44, 45, - 46, 73, -1, 75, 76, -1, -1, -1, 54, 55, - -1, 83, -1, 85, -1, -1, -1, 63, -1, -1, - 10, 11, 12, 13, 14, 15, 16, 73, -1, 75, - 76, -1, 22, 23, -1, -1, -1, 83, -1, 85, - 30, 31, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 43, 44, 45, 46, -1, -1, -1, - -1, -1, -1, -1, 54, 55, -1, -1, -1, -1, - -1, -1, -1, 63, -1, 48, 49, 50, 51, 52, - 53, -1, -1, 73, -1, 75, 76, 60, 61, 62, - -1, -1, -1, 83, 67, 85, 69, 70, 71, 72, - 73, 74, 75, -1, -1, -1, -1, -1, -1, -1, - -1, 84 -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 3, 4, 5, 6, 8, 9, 10, 17, 18, - 19, 20, 21, 24, 25, 26, 27, 28, 32, 33, - 34, 35, 36, 37, 38, 39, 41, 42, 43, 45, - 46, 54, 55, 63, 75, 80, 82, 83, 85, 87, - 88, 89, 90, 93, 95, 97, 98, 99, 101, 103, - 104, 105, 106, 82, 83, 82, 83, 90, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 104, - 105, 104, 105, 81, 90, 92, 11, 12, 13, 14, - 15, 16, 22, 23, 30, 31, 43, 44, 54, 55, - 73, 76, 83, 100, 102, 103, 104, 105, 0, 89, - 68, 85, 54, 55, 56, 57, 58, 59, 66, 82, - 91, 96, 106, 40, 76, 102, 107, 9, 76, 107, - 107, 107, 107, 107, 84, 43, 103, 104, 107, 43, - 107, 107, 84, 84, 84, 84, 84, 84, 43, 44, - 107, 107, 43, 107, 43, 107, 85, 85, 81, 90, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 104, 105, 104, 105, 44, 102, 102, 102, 48, 49, - 50, 51, 52, 53, 60, 61, 62, 67, 69, 70, - 71, 72, 73, 74, 75, 84, 85, 66, 45, 45, - 102, 102, 102, 102, 102, 65, 82, 83, 40, 84, - 83, 40, 84, 65, 84, 84, 65, 84, 84, 65, - 65, 65, 65, 84, 84, 84, 84, 84, 84, 84, - 84, 45, 45, 107, 84, 107, 107, 107, 107, 107, - 107, 107, 107, 85, 85, 84, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 45, 102, 56, 57, 58, 59, 66, - 106, 94, 107, 44, 107, 83, 90, 107, 83, 90, - 107, 107, 107, 43, 107, 107, 90, 90, 84, 84, - 84, 84, 65, 84, 84, 65, 65, 45, 45, 68, - 102, 102, 102, 102, 102, 82, 84, 84, 44, 107, - 7, 84, 44, 65, 65, 84, 65, 84, 84, 65, - 84, 65, 84, 107, 107, 43, 102, 96, 84, 84, - 84, 84, 90, 84, 107, 107, 47, 47, 47, 84, - 65, 84, 84, 90, 90, 84, 84, 84, 84, 65, - 84, 84, 84, 107, 90, 7, 7, 90, 90, 90, - 107, 84, 90, 90, 65, 107, 65, 107, 84 -}; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif - -/* 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 (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -#else -static void -yy_stack_print (yybottom, yytop) - yytype_int16 *yybottom; - yytype_int16 *yytop; -#endif -{ - 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 (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} - -/* Prevent warnings from -Wmissing-prototypes. */ -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; - -/* Number of syntax errors so far. */ -int yynerrs; - - - -/*-------------------------. -| yyparse or yypush_parse. | -`-------------------------*/ - -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () - -#endif -#endif -{ - - - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - `yyss': related to states. - `yyvs': related to semantic values. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yytoken = 0; - yyss = yyssa; - yyvs = yyvsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - yyssp = yyss; - yyvsp = yyvs; - - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - - yystate = yyn; - *++yyvsp = yylval; - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 2: - -/* Line 1455 of yacc.c */ -#line 145 "swf4compiler.y" - { *((Buffer *)buffer) = (yyvsp[(1) - (1)].action); ;} - break; - - case 4: - -/* Line 1455 of yacc.c */ -#line 152 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (2)].action), (yyvsp[(2) - (2)].action)); ;} - break; - - case 6: - -/* Line 1455 of yacc.c */ -#line 160 "swf4compiler.y" - { (yyval.action) = NULL; ;} - break; - - case 7: - -/* Line 1455 of yacc.c */ -#line 161 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (3)].action); ;} - break; - - case 8: - -/* Line 1455 of yacc.c */ -#line 162 "swf4compiler.y" - { (yyval.action) = NULL; ;} - break; - - case 15: - -/* Line 1455 of yacc.c */ -#line 172 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); ;} - break; - - case 16: - -/* Line 1455 of yacc.c */ -#line 176 "swf4compiler.y" - { (yyval.action) = NULL; ;} - break; - - case 18: - -/* Line 1455 of yacc.c */ -#line 179 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (2)].action), (yyvsp[(2) - (2)].action)); ;} - break; - - case 19: - -/* Line 1455 of yacc.c */ -#line 186 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAME); - bufferWriteS16((yyval.action), 3); - bufferWriteS16((yyval.action), atoi((yyvsp[(5) - (10)].str))); - free((yyvsp[(5) - (10)].str)); - bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(10) - (10)].action))+5); - bufferConcat((yyval.action), (yyvsp[(10) - (10)].action)); /* ..here */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(8) - (10)].action))); - bufferConcat((yyval.action), (yyvsp[(8) - (10)].action)); ;} - break; - - case 20: - -/* Line 1455 of yacc.c */ -#line 202 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAME); - bufferWriteS16((yyval.action), 3); - bufferWriteS16((yyval.action), atoi((yyvsp[(5) - (8)].str))); - free((yyvsp[(5) - (8)].str)); - bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), 5); - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); /* ..here */ - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(8) - (8)].action))); /* ..and then out */ - bufferConcat((yyval.action), (yyvsp[(8) - (8)].action)); ;} - break; - - case 21: - -/* Line 1455 of yacc.c */ -#line 218 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAME); - bufferWriteS16((yyval.action), 3); - bufferWriteS16((yyval.action), atoi((yyvsp[(6) - (9)].str))); - free((yyvsp[(6) - (9)].str)); - bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(9) - (9)].action))); - bufferConcat((yyval.action), (yyvsp[(9) - (9)].action)); ;} - break; - - case 22: - -/* Line 1455 of yacc.c */ -#line 230 "swf4compiler.y" - { (yyval.action) = (yyvsp[(5) - (10)].action); - bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAMEEXPRESSION); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(10) - (10)].action))+5); - bufferConcat((yyval.action), (yyvsp[(10) - (10)].action)); /* ..here */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(8) - (10)].action))); - bufferConcat((yyval.action), (yyvsp[(8) - (10)].action)); ;} - break; - - case 23: - -/* Line 1455 of yacc.c */ -#line 244 "swf4compiler.y" - { (yyval.action) = (yyvsp[(5) - (8)].action); - bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAMEEXPRESSION); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), 5); - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); /* ..here */ - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(8) - (8)].action))); /* ..and then out */ - bufferConcat((yyval.action), (yyvsp[(8) - (8)].action)); ;} - break; - - case 24: - -/* Line 1455 of yacc.c */ -#line 258 "swf4compiler.y" - { (yyval.action) = (yyvsp[(6) - (9)].action); - bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAMEEXPRESSION); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(9) - (9)].action))); - bufferConcat((yyval.action), (yyvsp[(9) - (9)].action)); ;} - break; - - case 25: - -/* Line 1455 of yacc.c */ -#line 268 "swf4compiler.y" - { bufferWriteU8((yyvsp[(3) - (7)].action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyvsp[(3) - (7)].action), 2); - bufferWriteS16((yyvsp[(3) - (7)].action), bufferLength((yyvsp[(7) - (7)].action))+5); - bufferConcat((yyvsp[(3) - (7)].action), (yyvsp[(7) - (7)].action)); - bufferWriteU8((yyvsp[(3) - (7)].action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyvsp[(3) - (7)].action), 2); - bufferWriteS16((yyvsp[(3) - (7)].action), bufferLength((yyvsp[(5) - (7)].action))); - bufferConcat((yyvsp[(3) - (7)].action), (yyvsp[(5) - (7)].action)); - (yyval.action) = (yyvsp[(3) - (7)].action); ;} - break; - - case 26: - -/* Line 1455 of yacc.c */ -#line 279 "swf4compiler.y" - { bufferWriteU8((yyvsp[(3) - (5)].action), SWFACTION_LOGICALNOT); - bufferWriteU8((yyvsp[(3) - (5)].action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyvsp[(3) - (5)].action), 2); - bufferWriteS16((yyvsp[(3) - (5)].action), bufferLength((yyvsp[(5) - (5)].action))); - bufferConcat((yyvsp[(3) - (5)].action), (yyvsp[(5) - (5)].action)); - (yyval.action) = (yyvsp[(3) - (5)].action); ;} - break; - - case 27: - -/* Line 1455 of yacc.c */ -#line 288 "swf4compiler.y" - { (yyval.action) = NULL; ;} - break; - - case 28: - -/* Line 1455 of yacc.c */ -#line 289 "swf4compiler.y" - { (yyval.action) = (yyvsp[(1) - (1)].action); ;} - break; - - case 29: - -/* Line 1455 of yacc.c */ -#line 314 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_WAITFORFRAME); - bufferWriteS16((yyval.action), 3); - bufferWriteS16((yyval.action), atoi((yyvsp[(6) - (9)].str))); - free((yyvsp[(6) - (9)].str)); - bufferWriteU8((yyval.action), 1); /* if not loaded, jump to.. */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(9) - (9)].action))+5); - bufferConcat((yyval.action), (yyvsp[(9) - (9)].action)); /* ..here */ - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); ;} - break; - - case 30: - -/* Line 1455 of yacc.c */ -#line 329 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (5)].action); - bufferWriteU8((yyval.action), SWFACTION_LOGICALNOT); - bufferWriteU8((yyval.action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (5)].action))+5); - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); - bufferResolveJumps((yyval.action)); ;} - break; - - case 31: - -/* Line 1455 of yacc.c */ -#line 341 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (6)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); - bufferWriteU8((yyval.action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); - bufferResolveJumps((yyval.action)); ;} - break; - - case 32: - -/* Line 1455 of yacc.c */ -#line 349 "swf4compiler.y" - { if (!(yyvsp[(5) - (9)].action)) - (yyvsp[(5) - (9)].action) = newBuffer(); - else { - bufferWriteU8((yyvsp[(5) - (9)].action), SWFACTION_LOGICALNOT); - bufferWriteU8((yyvsp[(5) - (9)].action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyvsp[(5) - (9)].action), 2); - bufferWriteS16((yyvsp[(5) - (9)].action), bufferLength((yyvsp[(9) - (9)].action))+bufferLength((yyvsp[(7) - (9)].action))+5); - } - bufferConcat((yyvsp[(5) - (9)].action), (yyvsp[(9) - (9)].action)); - bufferConcat((yyvsp[(5) - (9)].action), (yyvsp[(7) - (9)].action)); - bufferWriteU8((yyvsp[(5) - (9)].action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyvsp[(5) - (9)].action), 2); - bufferWriteS16((yyvsp[(5) - (9)].action), -(bufferLength((yyvsp[(5) - (9)].action))+2)); - bufferResolveJumps((yyvsp[(5) - (9)].action)); - (yyval.action) = (yyvsp[(3) - (9)].action); - if(!(yyval.action)) (yyval.action) = newBuffer(); - bufferConcat((yyval.action), (yyvsp[(5) - (9)].action)); - ;} - break; - - case 33: - -/* Line 1455 of yacc.c */ -#line 370 "swf4compiler.y" - { (yyval.action) = NULL; ;} - break; - - case 35: - -/* Line 1455 of yacc.c */ -#line 376 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), MAGIC_CONTINUE_NUMBER); ;} - break; - - case 36: - -/* Line 1455 of yacc.c */ -#line 384 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), MAGIC_BREAK_NUMBER); ;} - break; - - case 37: - -/* Line 1455 of yacc.c */ -#line 392 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_STOPDRAGMOVIE); ;} - break; - - case 38: - -/* Line 1455 of yacc.c */ -#line 396 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); - bufferWriteU8((yyval.action), SWFACTION_CALLFRAME); - bufferWriteS16((yyval.action), 0); - free((yyvsp[(3) - (4)].str)); ;} - break; - - case 39: - -/* Line 1455 of yacc.c */ -#line 403 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); - bufferWriteU8((yyval.action), SWFACTION_CALLFRAME); - bufferWriteS16((yyval.action), 0); - free((yyvsp[(3) - (4)].str)); ;} - break; - - case 40: - -/* Line 1455 of yacc.c */ -#line 410 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_REMOVECLIP); ;} - break; - - case 41: - -/* Line 1455 of yacc.c */ -#line 414 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_TRACE); ;} - break; - - case 42: - -/* Line 1455 of yacc.c */ -#line 419 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (6)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), GETURL_METHOD_NOSEND); ;} - break; - - case 43: - -/* Line 1455 of yacc.c */ -#line 426 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (8)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), (yyvsp[(7) - (8)].getURLMethod)); ;} - break; - - case 44: - -/* Line 1455 of yacc.c */ -#line 433 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_GETURL); - bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (6)].str)) + strlen((yyvsp[(5) - (6)].str)) + 2); - bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (6)].str), strlen((yyvsp[(3) - (6)].str))); - bufferWriteU8((yyval.action), 0); - bufferWriteHardString((yyval.action), (byte*)(yyvsp[(5) - (6)].str), strlen((yyvsp[(5) - (6)].str))); - bufferWriteU8((yyval.action), 0); ;} - break; - - case 45: - -/* Line 1455 of yacc.c */ -#line 442 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (6)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), GETURL_METHOD_NOSEND | GETURL_LOADMOVIE); ;} - break; - - case 46: - -/* Line 1455 of yacc.c */ -#line 449 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (8)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), (yyvsp[(7) - (8)].getURLMethod) | GETURL_LOADMOVIE); ;} - break; - - case 47: - -/* Line 1455 of yacc.c */ -#line 456 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (6)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), GETURL_METHOD_NOSEND | GETURL_LOADVARIABLES); ;} - break; - - case 48: - -/* Line 1455 of yacc.c */ -#line 463 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (8)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), (yyvsp[(7) - (8)].getURLMethod) | GETURL_LOADVARIABLES); ;} - break; - - case 49: - -/* Line 1455 of yacc.c */ -#line 471 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), "0", 2); /* no constraint */ - bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); - bufferConcat((yyval.action), (yyvsp[(3) - (6)].action)); - bufferWriteU8((yyval.action), SWFACTION_STARTDRAGMOVIE); ;} - break; - - case 50: - -/* Line 1455 of yacc.c */ -#line 478 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferConcat((yyval.action), (yyvsp[(7) - (14)].action)); - bufferConcat((yyval.action), (yyvsp[(11) - (14)].action)); - bufferConcat((yyval.action), (yyvsp[(9) - (14)].action)); - bufferConcat((yyval.action), (yyvsp[(13) - (14)].action)); - bufferWriteString((yyval.action), "1", 2); /* has constraint */ - bufferConcat((yyval.action), (yyvsp[(5) - (14)].action)); - bufferConcat((yyval.action), (yyvsp[(3) - (14)].action)); - bufferWriteU8((yyval.action), SWFACTION_STARTDRAGMOVIE); ;} - break; - - case 51: - -/* Line 1455 of yacc.c */ -#line 490 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (8)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); - bufferConcat((yyval.action), (yyvsp[(7) - (8)].action)); - bufferWriteWTHITProperty((yyval.action)); - bufferWriteU8((yyval.action), SWFACTION_ADD); /* see docs for explanation */ - bufferWriteU8((yyval.action), SWFACTION_DUPLICATECLIP); ;} - break; - - case 52: - -/* Line 1455 of yacc.c */ -#line 499 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_NEXTFRAME); ;} - break; - - case 53: - -/* Line 1455 of yacc.c */ -#line 503 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_PREVFRAME); ;} - break; - - case 54: - -/* Line 1455 of yacc.c */ -#line 507 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_PLAY); ;} - break; - - case 55: - -/* Line 1455 of yacc.c */ -#line 511 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_STOP); ;} - break; - - case 56: - -/* Line 1455 of yacc.c */ -#line 515 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_TOGGLEQUALITY); ;} - break; - - case 57: - -/* Line 1455 of yacc.c */ -#line 519 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_STOPSOUNDS); ;} - break; - - case 58: - -/* Line 1455 of yacc.c */ -#line 523 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_GOTOFRAME); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), atoi((yyvsp[(3) - (4)].str))); - free((yyvsp[(3) - (4)].str)); ;} - break; - - case 59: - -/* Line 1455 of yacc.c */ -#line 530 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_GOTOLABEL); - bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (4)].str))+1); - bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); - free((yyvsp[(3) - (4)].str)); ;} - break; - - case 60: - -/* Line 1455 of yacc.c */ -#line 537 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_GOTOEXPRESSION); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 0); ;} - break; - - case 61: - -/* Line 1455 of yacc.c */ -#line 543 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_GOTOEXPRESSION); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 1); ;} - break; - - case 62: - -/* Line 1455 of yacc.c */ -#line 549 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_SETTARGET); - bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (4)].str))+1); - bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); - free((yyvsp[(3) - (4)].str)); ;} - break; - - case 63: - -/* Line 1455 of yacc.c */ -#line 556 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_SETTARGETEXPRESSION); ;} - break; - - case 64: - -/* Line 1455 of yacc.c */ -#line 560 "swf4compiler.y" - { (yyval.action) = newBuffer(); - /* SetTarget(STRING) */ - bufferWriteU8((yyval.action), SWFACTION_SETTARGET); - bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (5)].str))+1); - bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (5)].str), strlen((yyvsp[(3) - (5)].str))+1); - /* stmt */ - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); - /* SetTarget('') */ - bufferWriteU8((yyval.action), SWFACTION_SETTARGET); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 0); - free((yyvsp[(3) - (5)].str)); ;} - break; - - case 65: - -/* Line 1455 of yacc.c */ -#line 574 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (5)].action); - /* SetTarget(expr) */ - bufferWriteU8((yyval.action), SWFACTION_SETTARGETEXPRESSION); - /* stmt */ - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); - /* SetTarget('') */ - bufferWriteU8((yyval.action), SWFACTION_SETTARGET); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 0); ;} - break; - - case 66: - -/* Line 1455 of yacc.c */ -#line 587 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); ;} - break; - - case 67: - -/* Line 1455 of yacc.c */ -#line 591 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteU8((yyval.action), SWFACTION_GETTIMER); ;} - break; - - case 68: - -/* Line 1455 of yacc.c */ -#line 595 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_RANDOM); ;} - break; - - case 69: - -/* Line 1455 of yacc.c */ -#line 599 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_STRINGLENGTH); ;} - break; - - case 70: - -/* Line 1455 of yacc.c */ -#line 603 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_INT); ;} - break; - - case 71: - -/* Line 1455 of yacc.c */ -#line 607 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_ORD); ;} - break; - - case 72: - -/* Line 1455 of yacc.c */ -#line 611 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteU8((yyval.action), SWFACTION_CHR); ;} - break; - - case 73: - -/* Line 1455 of yacc.c */ -#line 615 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (6)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); - bufferWriteU8((yyval.action), SWFACTION_STRINGCONCAT); ;} - break; - - case 74: - -/* Line 1455 of yacc.c */ -#line 620 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (8)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); - bufferConcat((yyval.action), (yyvsp[(7) - (8)].action)); - bufferWriteU8((yyval.action), SWFACTION_SUBSTRING); ;} - break; - - case 75: - -/* Line 1455 of yacc.c */ -#line 626 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferConcat((yyval.action), (yyvsp[(3) - (6)].action)); - bufferWriteGetProperty((yyval.action), (yyvsp[(5) - (6)].str)); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - free((yyvsp[(5) - (6)].str)); ;} - break; - - case 76: - -/* Line 1455 of yacc.c */ -#line 635 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].action)); - bufferConcat((yyval.action), (yyvsp[(1) - (2)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_ADD); - bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} - break; - - case 77: - -/* Line 1455 of yacc.c */ -#line 646 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].action)); - bufferConcat((yyval.action), (yyvsp[(1) - (2)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); - bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} - break; - - case 79: - -/* Line 1455 of yacc.c */ -#line 662 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (3)].action); ;} - break; - - case 80: - -/* Line 1455 of yacc.c */ -#line 665 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - free((yyvsp[(1) - (1)].str)); ;} - break; - - case 81: - -/* Line 1455 of yacc.c */ -#line 670 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), "-", 2); - bufferWriteString((yyval.action), (yyvsp[(2) - (2)].str), strlen((yyvsp[(2) - (2)].str))+1); - free((yyvsp[(2) - (2)].str)); ;} - break; - - case 82: - -/* Line 1455 of yacc.c */ -#line 676 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - free((yyvsp[(1) - (1)].str)); ;} - break; - - case 83: - -/* Line 1455 of yacc.c */ -#line 681 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); - free((yyvsp[(1) - (1)].str)); ;} - break; - - case 84: - -/* Line 1455 of yacc.c */ -#line 687 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - free((yyvsp[(1) - (1)].str)); ;} - break; - - case 85: - -/* Line 1455 of yacc.c */ -#line 692 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (3)].str), strlen((yyvsp[(1) - (3)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (3)].str)); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - free((yyvsp[(3) - (3)].str)); - free((yyvsp[(1) - (3)].str)); ;} - break; - - case 86: - -/* Line 1455 of yacc.c */ -#line 700 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteSetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_ADD); - bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - free((yyvsp[(2) - (4)].str)); - free((yyvsp[(4) - (4)].str)); ;} - break; - - case 87: - -/* Line 1455 of yacc.c */ -#line 715 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); - bufferWriteU8((yyval.action), SWFACTION_DUP); - bufferWriteU8((yyval.action), SWFACTION_DUP); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_ADD); - bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); ;} - break; - - case 88: - -/* Line 1455 of yacc.c */ -#line 725 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteSetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_ADD); - bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - free((yyvsp[(2) - (4)].str)); - free((yyvsp[(4) - (4)].str)); ;} - break; - - case 89: - -/* Line 1455 of yacc.c */ -#line 740 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); - bufferWriteU8((yyval.action), SWFACTION_DUP); - bufferWriteU8((yyval.action), SWFACTION_DUP); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); - bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); ;} - break; - - case 90: - -/* Line 1455 of yacc.c */ -#line 750 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); - bufferWriteString((yyvsp[(2) - (2)].action), "-1", 3); - bufferWriteU8((yyvsp[(2) - (2)].action), SWFACTION_MULTIPLY); ;} - break; - - case 91: - -/* Line 1455 of yacc.c */ -#line 755 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); - bufferWriteU8((yyvsp[(2) - (2)].action), SWFACTION_LOGICALNOT); ;} - break; - - case 92: - -/* Line 1455 of yacc.c */ -#line 759 "swf4compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyval.action), SWFACTION_DUP); - bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} - break; - - case 93: - -/* Line 1455 of yacc.c */ -#line 765 "swf4compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyval.action), SWFACTION_MULTIPLY); ;} - break; - - case 94: - -/* Line 1455 of yacc.c */ -#line 770 "swf4compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyval.action), SWFACTION_DIVIDE); ;} - break; - - case 95: - -/* Line 1455 of yacc.c */ -#line 775 "swf4compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyval.action), SWFACTION_ADD); ;} - break; - - case 96: - -/* Line 1455 of yacc.c */ -#line 780 "swf4compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); ;} - break; - - case 97: - -/* Line 1455 of yacc.c */ -#line 785 "swf4compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyval.action), SWFACTION_STRINGCONCAT); ;} - break; - - case 98: - -/* Line 1455 of yacc.c */ -#line 790 "swf4compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyval.action), SWFACTION_LESSTHAN); ;} - break; - - case 99: - -/* Line 1455 of yacc.c */ -#line 795 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(1) - (3)].action)); - bufferWriteU8((yyval.action), SWFACTION_LESSTHAN); ;} - break; - - case 100: - -/* Line 1455 of yacc.c */ -#line 800 "swf4compiler.y" - { (yyval.action) = (yyvsp[(3) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(1) - (3)].action)); - bufferWriteU8((yyval.action), SWFACTION_LESSTHAN); - bufferWriteU8((yyval.action), SWFACTION_LOGICALNOT); ;} - break; - - case 101: - -/* Line 1455 of yacc.c */ -#line 806 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LESSTHAN); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} - break; - - case 102: - -/* Line 1455 of yacc.c */ -#line 811 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_STRINGEQ); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} - break; - - case 103: - -/* Line 1455 of yacc.c */ -#line 816 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_STRINGEQ); ;} - break; - - case 104: - -/* Line 1455 of yacc.c */ -#line 820 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_STRINGCOMPARE); ;} - break; - - case 105: - -/* Line 1455 of yacc.c */ -#line 824 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_EQUAL); ;} - break; - - case 106: - -/* Line 1455 of yacc.c */ -#line 828 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_EQUAL); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} - break; - - case 107: - -/* Line 1455 of yacc.c */ -#line 833 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALAND); ;} - break; - - case 108: - -/* Line 1455 of yacc.c */ -#line 837 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_LOGICALOR); ;} - break; - - case 109: - -/* Line 1455 of yacc.c */ -#line 841 "swf4compiler.y" - { bufferWriteU8((yyvsp[(1) - (5)].action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyvsp[(1) - (5)].action), 2); - bufferWriteS16((yyvsp[(1) - (5)].action), bufferLength((yyvsp[(5) - (5)].action))+5); - bufferConcat((yyvsp[(1) - (5)].action), (yyvsp[(5) - (5)].action)); - bufferWriteU8((yyvsp[(1) - (5)].action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyvsp[(1) - (5)].action), 2); - bufferWriteS16((yyvsp[(1) - (5)].action), bufferLength((yyvsp[(3) - (5)].action))); - bufferConcat((yyvsp[(1) - (5)].action), (yyvsp[(3) - (5)].action)); ;} - break; - - case 111: - -/* Line 1455 of yacc.c */ -#line 855 "swf4compiler.y" - { (yyval.str) = (yyvsp[(1) - (3)].str); - (yyval.str) = stringConcat((yyval.str), strdup(":")); - (yyval.str) = stringConcat((yyval.str), (yyvsp[(3) - (3)].str)); ;} - break; - - case 112: - -/* Line 1455 of yacc.c */ -#line 862 "swf4compiler.y" - { (yyval.str) = strdup(""); ;} - break; - - case 113: - -/* Line 1455 of yacc.c */ -#line 865 "swf4compiler.y" - { (yyval.str) = strdup(""); ;} - break; - - case 114: - -/* Line 1455 of yacc.c */ -#line 868 "swf4compiler.y" - { (yyval.str) = strdup("/"); ;} - break; - - case 115: - -/* Line 1455 of yacc.c */ -#line 871 "swf4compiler.y" - { (yyval.str) = strdup(".."); ;} - break; - - case 116: - -/* Line 1455 of yacc.c */ -#line 874 "swf4compiler.y" - { (yyval.str) = (yyvsp[(1) - (1)].str); ;} - break; - - case 117: - -/* Line 1455 of yacc.c */ -#line 877 "swf4compiler.y" - { (yyval.str) = (yyvsp[(1) - (1)].str); ;} - break; - - case 118: - -/* Line 1455 of yacc.c */ -#line 882 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - free((yyvsp[(1) - (1)].str)); ;} - break; - - case 119: - -/* Line 1455 of yacc.c */ -#line 887 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - free((yyvsp[(1) - (1)].str)); ;} - break; - - case 120: - -/* Line 1455 of yacc.c */ -#line 891 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (3)].action); ;} - break; - - case 123: - -/* Line 1455 of yacc.c */ -#line 900 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); - bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_ADD); - bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} - break; - - case 124: - -/* Line 1455 of yacc.c */ -#line 908 "swf4compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); - bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].action)); - bufferWriteU8((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); - bufferWriteU8((yyval.action), SWFACTION_SETVARIABLE); ;} - break; - - case 125: - -/* Line 1455 of yacc.c */ -#line 916 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_ADD); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteSetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); - free((yyvsp[(2) - (4)].str)); - free((yyvsp[(4) - (4)].str)); ;} - break; - - case 126: - -/* Line 1455 of yacc.c */ -#line 929 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - bufferWriteString((yyval.action), "1", 2); - bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); - bufferWriteString((yyval.action), (yyvsp[(2) - (4)].str), strlen((yyvsp[(2) - (4)].str))+1); - bufferWriteSetProperty((yyval.action), (yyvsp[(4) - (4)].str)); - bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); - free((yyvsp[(2) - (4)].str)); - free((yyvsp[(4) - (4)].str)); ;} - break; - - case 127: - -/* Line 1455 of yacc.c */ -#line 942 "swf4compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} - break; - - case 128: - -/* Line 1455 of yacc.c */ -#line 946 "swf4compiler.y" - { bufferWriteBuffer((yyvsp[(1) - (3)].action), (yyvsp[(1) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_GETVARIABLE); - bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_MULTIPLY); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} - break; - - case 129: - -/* Line 1455 of yacc.c */ -#line 953 "swf4compiler.y" - { bufferWriteBuffer((yyvsp[(1) - (3)].action), (yyvsp[(1) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_GETVARIABLE); - bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_DIVIDE); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} - break; - - case 130: - -/* Line 1455 of yacc.c */ -#line 960 "swf4compiler.y" - { bufferWriteBuffer((yyvsp[(1) - (3)].action), (yyvsp[(1) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_GETVARIABLE); - bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_ADD); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} - break; - - case 131: - -/* Line 1455 of yacc.c */ -#line 967 "swf4compiler.y" - { bufferWriteBuffer((yyvsp[(1) - (3)].action), (yyvsp[(1) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_GETVARIABLE); - bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SUBTRACT); - bufferWriteU8((yyvsp[(1) - (3)].action), SWFACTION_SETVARIABLE); ;} - break; - - case 132: - -/* Line 1455 of yacc.c */ -#line 974 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); - bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); - bufferConcat((yyval.action),(yyvsp[(5) - (5)].action)); - bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); - free((yyvsp[(1) - (5)].str)); - free((yyvsp[(3) - (5)].str)); ;} - break; - - case 133: - -/* Line 1455 of yacc.c */ -#line 983 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); - bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); - bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (5)].str)); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); - bufferWriteU8((yyval.action), SWFACTION_MULTIPLY); - bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); - free((yyvsp[(1) - (5)].str)); - free((yyvsp[(3) - (5)].str)); ;} - break; - - case 134: - -/* Line 1455 of yacc.c */ -#line 996 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); - bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); - bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (5)].str)); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); - bufferWriteU8((yyval.action), SWFACTION_DIVIDE); - bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); - free((yyvsp[(1) - (5)].str)); - free((yyvsp[(3) - (5)].str)); ;} - break; - - case 135: - -/* Line 1455 of yacc.c */ -#line 1009 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); - bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); - bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (5)].str)); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); - bufferWriteU8((yyval.action), SWFACTION_ADD); - bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); - free((yyvsp[(1) - (5)].str)); - free((yyvsp[(3) - (5)].str)); ;} - break; - - case 136: - -/* Line 1455 of yacc.c */ -#line 1022 "swf4compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); - bufferWriteSetProperty((yyval.action), (yyvsp[(3) - (5)].str)); - bufferWriteString((yyval.action), (yyvsp[(1) - (5)].str), strlen((yyvsp[(1) - (5)].str))+1); - bufferWriteGetProperty((yyval.action), (yyvsp[(3) - (5)].str)); - bufferWriteU8((yyval.action), SWFACTION_GETPROPERTY); - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); - bufferWriteU8((yyval.action), SWFACTION_SUBTRACT); - bufferWriteU8((yyval.action), SWFACTION_SETPROPERTY); - free((yyvsp[(1) - (5)].str)); - free((yyvsp[(3) - (5)].str)); ;} - break; - - - -/* Line 1455 of yacc.c */ -#line 3218 "swf4compiler.tab.c" - default: break; - } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - *++yyvsp = yylval; - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#if !defined(yyoverflow) || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} - - - -/* Line 1675 of yacc.c */ -#line 1039 "swf4compiler.y" - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.tab.h b/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.tab.h deleted file mode 100644 index f13648bbe..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.tab.h +++ /dev/null @@ -1,136 +0,0 @@ - -/* A Bison parser, made by GNU Bison 2.4. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 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. */ - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - BREAK = 258, - FOR = 259, - CONTINUE = 260, - IF = 261, - ELSE = 262, - DO = 263, - WHILE = 264, - THIS = 265, - EVAL = 266, - TIME = 267, - RANDOM = 268, - LENGTH = 269, - INT = 270, - CONCAT = 271, - DUPLICATECLIP = 272, - REMOVECLIP = 273, - TRACE = 274, - STARTDRAG = 275, - STOPDRAG = 276, - ORD = 277, - CHR = 278, - CALLFRAME = 279, - GETURL = 280, - GETURL1 = 281, - LOADMOVIE = 282, - LOADVARIABLES = 283, - POSTURL = 284, - SUBSTR = 285, - GETPROPERTY = 286, - NEXTFRAME = 287, - PREVFRAME = 288, - PLAY = 289, - STOP = 290, - TOGGLEQUALITY = 291, - STOPSOUNDS = 292, - GOTOFRAME = 293, - GOTOANDPLAY = 294, - FRAMELOADED = 295, - SETTARGET = 296, - TELLTARGET = 297, - STRING = 298, - NUMBER = 299, - IDENTIFIER = 300, - PATH = 301, - GETURL_METHOD = 302, - EQ = 303, - LE = 304, - GE = 305, - NE = 306, - LAN = 307, - LOR = 308, - INC = 309, - DEC = 310, - IEQ = 311, - DEQ = 312, - MEQ = 313, - SEQ = 314, - STREQ = 315, - STRNE = 316, - STRCMP = 317, - PARENT = 318, - END = 319, - UMINUS = 320, - POSTFIX = 321, - NEGATE = 322 - }; -#endif - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -{ - -/* Line 1676 of yacc.c */ -#line 17 "swf4compiler.y" - - Buffer action; - char *str; - SWFActionFunction function; - SWFGetUrl2Method getURLMethod; - - - -/* Line 1676 of yacc.c */ -#line 128 "swf4compiler.tab.h" -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - -extern YYSTYPE swf4lval; - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.y b/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.y deleted file mode 100644 index 2ecd42a81..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/swf4compiler.y +++ /dev/null @@ -1,1039 +0,0 @@ -/* $Id: swf4compiler.y,v 1.1 2004/05/08 17:17:35 kramm Exp $ */ - -%start program - -%{ - -#include -#include -#include -#include "compile.h" -#include "action.h" - -#define YYPARSE_PARAM buffer - -%} - -%union { - Buffer action; - char *str; - SWFActionFunction function; - SWFGetUrl2Method getURLMethod; -} - -/* tokens etc. */ -%token BREAK -%token FOR -%token CONTINUE -%token IF -%token ELSE -%token DO -%token WHILE - -%token THIS - -/* functions */ -%token EVAL -%token TIME -%token RANDOM -%token LENGTH -%token INT -%token CONCAT -%token DUPLICATECLIP -%token REMOVECLIP -%token TRACE -%token STARTDRAG -%token STOPDRAG -%token ORD -%token CHR -%token CALLFRAME -%token GETURL -%token GETURL1 -%token LOADMOVIE -%token LOADVARIABLES -%token POSTURL -%token SUBSTR - -%token GETPROPERTY - -/* v3 functions */ -%token NEXTFRAME -%token PREVFRAME -%token PLAY -%token STOP -%token TOGGLEQUALITY -%token STOPSOUNDS -%token GOTOFRAME -%token GOTOANDPLAY -%token FRAMELOADED -%token SETTARGET - -/* high level functions */ -%token TELLTARGET - -/* these three are strdup'ed in compiler.flex, so free them here */ -%token STRING -%token NUMBER -%token IDENTIFIER -%token PATH - -%token GETURL_METHOD - -%token EQ "==" -%token LE "<=" -%token GE ">=" -%token NE "!=" -%token LAN "&&" -%token LOR "||" -%token INC "++" -%token DEC "--" -%token IEQ "+=" -%token DEQ "/=" -%token MEQ "*=" -%token SEQ "-=" -%token STREQ "===" -%token STRNE "!==" -%token STRCMP "<=>" -%token PARENT ".." - -%token END "end" - -/* ascending order of ops ..? */ -%left ',' -%right '=' "*=" "/=" "+=" "-=" -%right '?' ':' -%left "&&" "||" -%left "==" "!=" "===" "!==" -%left '<' '>' "<=" ">=" "<=>" -%left '&' -%left '+' '-' -%left '*' '/' -%right "++" "--" UMINUS '!' -%right POSTFIX -%right NEGATE - -%type elem -%type elems -%type stmt -%type statements -%type if_stmt -%type iter_stmt -%type cont_stmt -%type break_stmt -%type expr_opt -%type void_function_call -%type function_call -%type lhs_expr -%type pf_expr -%type rhs_expr -%type assign_stmt -%type assign_stmts -%type assign_stmts_opt -%type expr -%type program - -/* make sure to free these, too! */ -%type sprite -%type variable - -%% - -/* rules */ - -program - : elems - { *((Buffer *)buffer) = $1; } - - ; - -elems - : elem - | elems elem - { bufferConcat($1, $2); } - ; - -elem - : stmt - ; - -stmt - : '{' '}' { $$ = NULL; } - | '{' statements '}' { $$ = $2; } - | ';' { $$ = NULL; } - | assign_stmt ';' - | if_stmt - | iter_stmt - | cont_stmt - | break_stmt - ; - -assign_stmts - : assign_stmt - | assign_stmts ',' assign_stmt { bufferConcat($1, $3); } - ; - -statements - : /* empty */ { $$ = NULL; } - | stmt - | statements stmt - { bufferConcat($1, $2); } - ; - -if_stmt - /* XXX- I haven't tested the frameloaded() stuff yet.. */ - - : IF '(' FRAMELOADED '(' NUMBER ')' ')' stmt ELSE stmt - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_WAITFORFRAME); - bufferWriteS16($$, 3); - bufferWriteS16($$, atoi($5)); - free($5); - bufferWriteU8($$, 1); /* if not loaded, jump to.. */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($10)+5); - bufferConcat($$, $10); /* ..here */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($8)); - bufferConcat($$, $8); } - - | IF '(' FRAMELOADED '(' NUMBER ')' ')' stmt - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_WAITFORFRAME); - bufferWriteS16($$, 3); - bufferWriteS16($$, atoi($5)); - free($5); - bufferWriteU8($$, 1); /* if not loaded, jump to.. */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, 5); - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); /* ..here */ - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($8)); /* ..and then out */ - bufferConcat($$, $8); } - - /* make this case cleaner.. */ - | IF '(' '!' FRAMELOADED '(' NUMBER ')' ')' stmt - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_WAITFORFRAME); - bufferWriteS16($$, 3); - bufferWriteS16($$, atoi($6)); - free($6); - bufferWriteU8($$, 1); /* if not loaded, jump to.. */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($9)); - bufferConcat($$, $9); } /* ..here */ - - | IF '(' FRAMELOADED '(' expr ')' ')' stmt ELSE stmt - { $$ = $5; - bufferWriteU8($$, SWFACTION_WAITFORFRAMEEXPRESSION); - bufferWriteS16($$, 1); - bufferWriteU8($$, 1); /* if not loaded, jump to.. */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($10)+5); - bufferConcat($$, $10); /* ..here */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($8)); - bufferConcat($$, $8); } - - | IF '(' FRAMELOADED '(' expr ')' ')' stmt - { $$ = $5; - bufferWriteU8($$, SWFACTION_WAITFORFRAMEEXPRESSION); - bufferWriteS16($$, 1); - bufferWriteU8($$, 1); /* if not loaded, jump to.. */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, 5); - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); /* ..here */ - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($8)); /* ..and then out */ - bufferConcat($$, $8); } - - /* make this case cleaner.. */ - | IF '(' '!' FRAMELOADED '(' expr ')' ')' stmt - { $$ = $6; - bufferWriteU8($$, SWFACTION_WAITFORFRAMEEXPRESSION); - bufferWriteS16($$, 1); - bufferWriteU8($$, 1); /* if not loaded, jump to.. */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($9)); - bufferConcat($$, $9); } /* ..here */ - - | IF '(' expr ')' stmt ELSE stmt - { bufferWriteU8($3, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($3, 2); - bufferWriteS16($3, bufferLength($7)+5); - bufferConcat($3, $7); - bufferWriteU8($3, SWFACTION_BRANCHALWAYS); - bufferWriteS16($3, 2); - bufferWriteS16($3, bufferLength($5)); - bufferConcat($3, $5); - $$ = $3; } - - | IF '(' expr ')' stmt - { bufferWriteU8($3, SWFACTION_LOGICALNOT); - bufferWriteU8($3, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($3, 2); - bufferWriteS16($3, bufferLength($5)); - bufferConcat($3, $5); - $$ = $3; } - ; - -expr_opt - : /* empty */ { $$ = NULL; } - | expr { $$ = $1; } - ; - -/* not thought out yet.. -switch_stmt - : SWITCH '(' expr ')' '{' - { $$ = $3; - pushLoop(); } - switch_cases '}' - { bufferConcat($$, $7); } - ; - -switch_cases - : switch_cases switch_case - | switch_case - ; - -switch_case - : CASE INTEGER ':' stmt - { $$ = newBuffer(); } - ; -*/ - -iter_stmt - : WHILE '(' '!' FRAMELOADED '(' NUMBER ')' ')' stmt - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_WAITFORFRAME); - bufferWriteS16($$, 3); - bufferWriteS16($$, atoi($6)); - free($6); - bufferWriteU8($$, 1); /* if not loaded, jump to.. */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($9)+5); - bufferConcat($$, $9); /* ..here */ - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, -(bufferLength($$)+2)); } - - | WHILE '(' expr ')' stmt - { $$ = $3; - bufferWriteU8($$, SWFACTION_LOGICALNOT); - bufferWriteU8($$, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($5)+5); - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, -(bufferLength($$)+2)); - bufferResolveJumps($$); } - - | DO stmt WHILE '(' expr ')' - { $$ = $2; - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($$, 2); - bufferWriteS16($$, -(bufferLength($$)+2)); - bufferResolveJumps($$); } - - | FOR '(' assign_stmts_opt ';' expr_opt ';' assign_stmts_opt ')' stmt - { if (!$5) - $5 = newBuffer(); - else { - bufferWriteU8($5, SWFACTION_LOGICALNOT); - bufferWriteU8($5, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($5, 2); - bufferWriteS16($5, bufferLength($9)+bufferLength($7)+5); - } - bufferConcat($5, $9); - bufferConcat($5, $7); - bufferWriteU8($5, SWFACTION_BRANCHALWAYS); - bufferWriteS16($5, 2); - bufferWriteS16($5, -(bufferLength($5)+2)); - bufferResolveJumps($5); - $$ = $3; - if(!$$) $$ = newBuffer(); - bufferConcat($$, $5); - } - ; - -assign_stmts_opt - : /* empty */ { $$ = NULL; } - | assign_stmts - ; - -cont_stmt - : CONTINUE ';' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, MAGIC_CONTINUE_NUMBER); } - ; - -break_stmt - : BREAK ';' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, MAGIC_BREAK_NUMBER); } - ; - -void_function_call - : STOPDRAG '(' ')' /* no args */ - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_STOPDRAGMOVIE); } - - | CALLFRAME '(' variable ')' - { $$ = newBuffer(); - bufferWriteString($$, $3, strlen($3)+1); - bufferWriteU8($$, SWFACTION_CALLFRAME); - bufferWriteS16($$, 0); - free($3); } - - | CALLFRAME '(' STRING ')' - { $$ = newBuffer(); - bufferWriteString($$, $3, strlen($3)+1); - bufferWriteU8($$, SWFACTION_CALLFRAME); - bufferWriteS16($$, 0); - free($3); } - - | REMOVECLIP '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_REMOVECLIP); } - - | TRACE '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_TRACE); } - - /* getURL2(url, window, [method]) */ - | GETURL '(' expr ',' expr ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, GETURL_METHOD_NOSEND); } - - | GETURL '(' expr ',' expr ',' GETURL_METHOD ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, $7); } - - | GETURL1 '(' STRING ',' STRING ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_GETURL); - bufferWriteS16($$, strlen($3) + strlen($5) + 2); - bufferWriteHardString($$, (byte*)$3, strlen($3)); - bufferWriteU8($$, 0); - bufferWriteHardString($$, (byte*)$5, strlen($5)); - bufferWriteU8($$, 0); } - - | LOADMOVIE '(' expr ',' expr ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, GETURL_METHOD_NOSEND | GETURL_LOADMOVIE); } - - | LOADMOVIE '(' expr ',' expr ',' GETURL_METHOD ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, $7 | GETURL_LOADMOVIE); } - - | LOADVARIABLES '(' expr ',' expr ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, GETURL_METHOD_NOSEND | GETURL_LOADVARIABLES); } - - | LOADVARIABLES '(' expr ',' expr ',' GETURL_METHOD ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, $7 | GETURL_LOADVARIABLES); } - - /* startDrag(target, lock, [left, right, top, bottom]) */ - | STARTDRAG '(' expr ',' expr ')' - { $$ = newBuffer(); - bufferWriteString($$, "0", 2); /* no constraint */ - bufferConcat($$, $5); - bufferConcat($$, $3); - bufferWriteU8($$, SWFACTION_STARTDRAGMOVIE); } - - | STARTDRAG '(' expr ',' expr ',' expr ',' expr ',' expr ',' expr ')' - { $$ = newBuffer(); - bufferConcat($$, $7); - bufferConcat($$, $11); - bufferConcat($$, $9); - bufferConcat($$, $13); - bufferWriteString($$, "1", 2); /* has constraint */ - bufferConcat($$, $5); - bufferConcat($$, $3); - bufferWriteU8($$, SWFACTION_STARTDRAGMOVIE); } - - /* duplicateClip(target, new, depth) */ - | DUPLICATECLIP '(' expr ',' expr ',' expr ')' - { $$ = $3; - bufferConcat($$, $5); - bufferConcat($$, $7); - bufferWriteWTHITProperty($$); - bufferWriteU8($$, SWFACTION_ADD); /* see docs for explanation */ - bufferWriteU8($$, SWFACTION_DUPLICATECLIP); } - - /* v3 actions */ - | NEXTFRAME '(' ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_NEXTFRAME); } - - | PREVFRAME '(' ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_PREVFRAME); } - - | PLAY '(' ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_PLAY); } - - | STOP '(' ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_STOP); } - - | TOGGLEQUALITY '(' ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_TOGGLEQUALITY); } - - | STOPSOUNDS '(' ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_STOPSOUNDS); } - - | GOTOFRAME '(' NUMBER ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_GOTOFRAME); - bufferWriteS16($$, 2); - bufferWriteS16($$, atoi($3)); - free($3); } - - | GOTOFRAME '(' STRING ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_GOTOLABEL); - bufferWriteS16($$, strlen($3)+1); - bufferWriteHardString($$, (byte*)$3, strlen($3)+1); - free($3); } - - | GOTOFRAME '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_GOTOEXPRESSION); - bufferWriteS16($$, 1); - bufferWriteU8($$, 0); } /* XXX - and stop */ - - | GOTOANDPLAY '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_GOTOEXPRESSION); - bufferWriteS16($$, 1); - bufferWriteU8($$, 1); } /* XXX - and play */ - - | SETTARGET '(' STRING ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_SETTARGET); - bufferWriteS16($$, strlen($3)+1); - bufferWriteHardString($$, (byte*)$3, strlen($3)+1); - free($3); } - - | SETTARGET '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_SETTARGETEXPRESSION); } - - | TELLTARGET '(' STRING ')' stmt - { $$ = newBuffer(); - /* SetTarget(STRING) */ - bufferWriteU8($$, SWFACTION_SETTARGET); - bufferWriteS16($$, strlen($3)+1); - bufferWriteHardString($$, (byte*)$3, strlen($3)+1); - /* stmt */ - bufferConcat($$, $5); - /* SetTarget('') */ - bufferWriteU8($$, SWFACTION_SETTARGET); - bufferWriteS16($$, 1); - bufferWriteU8($$, 0); - free($3); } - - | TELLTARGET '(' expr ')' stmt - { $$ = $3; - /* SetTarget(expr) */ - bufferWriteU8($$, SWFACTION_SETTARGETEXPRESSION); - /* stmt */ - bufferConcat($$, $5); - /* SetTarget('') */ - bufferWriteU8($$, SWFACTION_SETTARGET); - bufferWriteS16($$, 1); - bufferWriteU8($$, 0); } - ; - -function_call - : EVAL '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_GETVARIABLE); } - - | TIME '(' ')' - { $$ = newBuffer(); - bufferWriteU8($$, SWFACTION_GETTIMER); } - - | RANDOM '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_RANDOM); } - - | LENGTH '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_STRINGLENGTH); } - - | INT '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_INT); } - - | ORD '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_ORD); } - - | CHR '(' expr ')' - { $$ = $3; - bufferWriteU8($$, SWFACTION_CHR); } - - | CONCAT '(' expr ',' expr ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_STRINGCONCAT); } - - | SUBSTR '(' expr ',' expr ',' expr ')' - { $$ = $3; - bufferConcat($$, $5); - bufferConcat($$, $7); - bufferWriteU8($$, SWFACTION_SUBSTRING); } - - | GETPROPERTY '(' expr ',' STRING ')' - { $$ = newBuffer(); - bufferConcat($$, $3); - bufferWriteGetProperty($$, $5); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - free($5); } - ; - -pf_expr - : lhs_expr "++" %prec POSTFIX - { $$ = newBuffer(); - bufferWriteBuffer($$, $1); - bufferWriteU8($$, SWFACTION_GETVARIABLE); - bufferWriteBuffer($$, $1); - bufferConcat($$, $1); - bufferWriteU8($$, SWFACTION_GETVARIABLE); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_ADD); - bufferWriteU8($$, SWFACTION_SETVARIABLE); } - - | lhs_expr "--" %prec POSTFIX - { $$ = newBuffer(); - bufferWriteBuffer($$, $1); - bufferWriteU8($$, SWFACTION_GETVARIABLE); - bufferWriteBuffer($$, $1); - bufferConcat($$, $1); - bufferWriteU8($$, SWFACTION_GETVARIABLE); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_SUBTRACT); - bufferWriteU8($$, SWFACTION_SETVARIABLE); } - ; - -/* these leave a value on the stack */ -rhs_expr - : function_call - - | '(' rhs_expr ')' - { $$ = $2; } - - | NUMBER - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - free($1); } - - | '-' NUMBER %prec NEGATE - { $$ = newBuffer(); - bufferWriteString($$, "-", 2); - bufferWriteString($$, $2, strlen($2)+1); - free($2); } - - | STRING - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - free($1); } - - | variable - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteU8($$, SWFACTION_GETVARIABLE); - free($1); } - - | sprite - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - free($1); } - - | sprite '.' IDENTIFIER - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteGetProperty($$, $3); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - free($3); - free($1); } - - | "++" sprite '.' IDENTIFIER - { $$ = newBuffer(); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteGetProperty($$, $4); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteSetProperty($$, $4); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteGetProperty($$, $4); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_ADD); - bufferWriteU8($$, SWFACTION_SETPROPERTY); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - free($2); - free($4); } - - | "++" lhs_expr - { $$ = $2; - bufferWriteU8($$, SWFACTION_DUP); - bufferWriteU8($$, SWFACTION_DUP); - bufferWriteU8($$, SWFACTION_GETVARIABLE); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_ADD); - bufferWriteU8($$, SWFACTION_SETVARIABLE); - bufferWriteU8($$, SWFACTION_GETVARIABLE); } - - | "--" sprite '.' IDENTIFIER - { $$ = newBuffer(); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteGetProperty($$, $4); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteSetProperty($$, $4); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteGetProperty($$, $4); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_ADD); - bufferWriteU8($$, SWFACTION_SETPROPERTY); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - free($2); - free($4); } - - | "--" lhs_expr - { $$ = $2; - bufferWriteU8($$, SWFACTION_DUP); - bufferWriteU8($$, SWFACTION_DUP); - bufferWriteU8($$, SWFACTION_GETVARIABLE); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_SUBTRACT); - bufferWriteU8($$, SWFACTION_SETVARIABLE); - bufferWriteU8($$, SWFACTION_GETVARIABLE); } - - | '-' rhs_expr %prec UMINUS - { $$ = $2; - bufferWriteString($2, "-1", 3); - bufferWriteU8($2, SWFACTION_MULTIPLY); } - - | '!' rhs_expr - { $$ = $2; - bufferWriteU8($2, SWFACTION_LOGICALNOT); } - - | lhs_expr '=' rhs_expr /* assign and leave copy on stack */ - { $$ = $1; - bufferConcat($$, $3); - bufferWriteU8($$, SWFACTION_DUP); - bufferWriteU8($$, SWFACTION_SETVARIABLE); } - - | rhs_expr '*' rhs_expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteU8($$, SWFACTION_MULTIPLY); } - - | rhs_expr '/' rhs_expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteU8($$, SWFACTION_DIVIDE); } - - | rhs_expr '+' rhs_expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteU8($$, SWFACTION_ADD); } - - | rhs_expr '-' rhs_expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteU8($$, SWFACTION_SUBTRACT); } - - | rhs_expr '&' rhs_expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteU8($$, SWFACTION_STRINGCONCAT); } - - | rhs_expr '<' rhs_expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteU8($$, SWFACTION_LESSTHAN); } - - | rhs_expr '>' rhs_expr - { $$ = $3; - bufferConcat($$, $1); - bufferWriteU8($$, SWFACTION_LESSTHAN); } - - | rhs_expr "<=" rhs_expr - { $$ = $3; - bufferConcat($$, $1); - bufferWriteU8($$, SWFACTION_LESSTHAN); - bufferWriteU8($$, SWFACTION_LOGICALNOT); } - - | rhs_expr ">=" rhs_expr - { bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_LESSTHAN); - bufferWriteU8($1, SWFACTION_LOGICALNOT); } - - | rhs_expr "!==" rhs_expr - { bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_STRINGEQ); - bufferWriteU8($1, SWFACTION_LOGICALNOT); } - - | rhs_expr "===" rhs_expr - { bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_STRINGEQ); } - - | rhs_expr "<=>" rhs_expr - { bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_STRINGCOMPARE); } - - | rhs_expr "==" rhs_expr - { bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_EQUAL); } - - | rhs_expr "!=" rhs_expr - { bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_EQUAL); - bufferWriteU8($1, SWFACTION_LOGICALNOT); } - - | rhs_expr "&&" rhs_expr - { bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_LOGICALAND); } - - | rhs_expr "||" rhs_expr - { bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_LOGICALOR); } - - | rhs_expr '?' rhs_expr ':' rhs_expr - { bufferWriteU8($1, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($1, 2); - bufferWriteS16($1, bufferLength($5)+5); - bufferConcat($1, $5); - bufferWriteU8($1, SWFACTION_BRANCHALWAYS); - bufferWriteS16($1, 2); - bufferWriteS16($1, bufferLength($3)); - bufferConcat($1, $3); } - ; - -variable - : IDENTIFIER - - | sprite ':' IDENTIFIER - { $$ = $1; - $$ = stringConcat($$, strdup(":")); - $$ = stringConcat($$, $3); } - ; - -sprite - : THIS - { $$ = strdup(""); } - - | '.' - { $$ = strdup(""); } - - | '/' - { $$ = strdup("/"); } - - | PARENT - { $$ = strdup(".."); } - - | IDENTIFIER - { $$ = $1; } - - | PATH - { $$ = $1; } - ; - -lhs_expr - : variable - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - free($1); } - - | STRING - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - free($1); } - - | '(' rhs_expr ')' { $$ = $2; } - ; - -assign_stmt - : pf_expr - - | void_function_call - - | "++" lhs_expr - { $$ = $2; - bufferWriteBuffer($$, $2); - bufferWriteU8($$, SWFACTION_GETVARIABLE); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_ADD); - bufferWriteU8($$, SWFACTION_SETVARIABLE); } - - | "--" lhs_expr - { $$ = $2; - bufferWriteBuffer($$, $2); - bufferWriteU8($$, SWFACTION_GETVARIABLE); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_SUBTRACT); - bufferWriteU8($$, SWFACTION_SETVARIABLE); } - - | "++" sprite '.' IDENTIFIER - { $$ = newBuffer(); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteGetProperty($$, $4); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_ADD); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteSetProperty($$, $4); - bufferWriteU8($$, SWFACTION_SETPROPERTY); - free($2); - free($4); } - - | "--" sprite '.' IDENTIFIER - { $$ = newBuffer(); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteGetProperty($$, $4); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - bufferWriteString($$, "1", 2); - bufferWriteU8($$, SWFACTION_SUBTRACT); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteSetProperty($$, $4); - bufferWriteU8($$, SWFACTION_SETPROPERTY); - free($2); - free($4); } - - | lhs_expr '=' rhs_expr - { bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_SETVARIABLE); } - - | lhs_expr "*=" rhs_expr - { bufferWriteBuffer($1, $1); - bufferWriteU8($1, SWFACTION_GETVARIABLE); - bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_MULTIPLY); - bufferWriteU8($1, SWFACTION_SETVARIABLE); } - - | lhs_expr "/=" rhs_expr - { bufferWriteBuffer($1, $1); - bufferWriteU8($1, SWFACTION_GETVARIABLE); - bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_DIVIDE); - bufferWriteU8($1, SWFACTION_SETVARIABLE); } - - | lhs_expr "+=" rhs_expr - { bufferWriteBuffer($1, $1); - bufferWriteU8($1, SWFACTION_GETVARIABLE); - bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_ADD); - bufferWriteU8($1, SWFACTION_SETVARIABLE); } - - | lhs_expr "-=" rhs_expr - { bufferWriteBuffer($1, $1); - bufferWriteU8($1, SWFACTION_GETVARIABLE); - bufferConcat($1, $3); - bufferWriteU8($1, SWFACTION_SUBTRACT); - bufferWriteU8($1, SWFACTION_SETVARIABLE); } - - | sprite '.' IDENTIFIER '=' rhs_expr - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteSetProperty($$, $3); - bufferConcat($$,$5); - bufferWriteU8($$, SWFACTION_SETPROPERTY); - free($1); - free($3); } - - | sprite '.' IDENTIFIER "*=" rhs_expr - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteSetProperty($$, $3); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteGetProperty($$, $3); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_MULTIPLY); - bufferWriteU8($$, SWFACTION_SETPROPERTY); - free($1); - free($3); } - - | sprite '.' IDENTIFIER "/=" rhs_expr - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteSetProperty($$, $3); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteGetProperty($$, $3); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_DIVIDE); - bufferWriteU8($$, SWFACTION_SETPROPERTY); - free($1); - free($3); } - - | sprite '.' IDENTIFIER "+=" rhs_expr - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteSetProperty($$, $3); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteGetProperty($$, $3); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_ADD); - bufferWriteU8($$, SWFACTION_SETPROPERTY); - free($1); - free($3); } - - | sprite '.' IDENTIFIER "-=" rhs_expr - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteSetProperty($$, $3); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteGetProperty($$, $3); - bufferWriteU8($$, SWFACTION_GETPROPERTY); - bufferConcat($$, $5); - bufferWriteU8($$, SWFACTION_SUBTRACT); - bufferWriteU8($$, SWFACTION_SETPROPERTY); - free($1); - free($3); } - ; - -expr - : rhs_expr - ; - -%% diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.flex b/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.flex deleted file mode 100644 index 86a74a3cf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.flex +++ /dev/null @@ -1,467 +0,0 @@ -%{ - -#include -#include - -#include "compile.h" -#include "action.h" -#include "blocks/error.h" -#include "swf5compiler.tab.h" /* defines token types */ - -static int swf5debug; - -static const char *lexBuffer = NULL; -static int lexBufferLen = 0; - -static int sLineNumber = 0; -static char szLine[1024]; -static char msgbufs[2][1024] = { {0}, {0} }, *msgline = {0}; -static int column = 0; - -static void comment(); -static void comment1(); -static void count(); -static void countline(); -static void warning(char *msg); - -#define YY_INPUT(buf,result,max_size) result=lexBufferInput(buf, max_size) - -/* thanks to the prolific and brilliant Raff: */ -static int lexBufferInput(char *buf, int max_size) -{ - int l = lexBufferLen > max_size ? max_size : lexBufferLen; - - if (lexBufferLen <= 0) - return YY_NULL; - - memcpy(buf, lexBuffer, l); - lexBuffer += l; - lexBufferLen -= l; - return l; -} - - /* very inefficient method of unescaping strings */ -static void unescape(char *buf) -{ - char *p, *p1; - - for (p1=buf; (p=strchr(p1, '\\')) != 0; p1 = p+1) { - switch(p[1]) - { - case 'b' : p[1] = '\b'; break; - case 'f' : p[1] = '\f'; break; - case 'n' : p[1] = '\n'; break; - case 'r' : p[1] = '\r'; break; - case 't' : p[1] = '\t'; break; - case 'x' : - case 'u' : warning("unsupported escape sequence"); - } - strcpy(p, p+1); - } -} - -void swf5ParseInit(const char *script, int debug) -{ - checkByteOrder(); - yyrestart(NULL); - - swf5debug = debug; - - lexBuffer = script; - lexBufferLen = strlen(script); - sLineNumber = 0; - column = 0; - msgline = msgbufs[0]; -} - -%} - -%s asm - -%{ - // forward declaration needed by the following function -#ifndef YY_PROTO -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif -#endif - static void yyunput YY_PROTO(( int c, char *buf_ptr )); - - void do_unput5(const char c) { unput(c); } -%} - -DIGIT [0-9] -ID [a-zA-Z_][a-zA-Z0-9_]* - -%% - -0x[0-9a-fA-F]+ { count(); swf5lval.intVal = strtoul(yytext, NULL, 0); - return INTEGER; } -0[0-7]+ { count(); swf5lval.intVal = strtoul(yytext, NULL, 0); - return INTEGER; } -{DIGIT}+ { count(); swf5lval.intVal = atoi(yytext); - return INTEGER; } -{DIGIT}+"."{DIGIT}* { count(); swf5lval.doubleVal = atof(yytext); - return DOUBLE; } -true { count(); swf5lval.intVal = 1; - return BOOLEAN; } -false { count(); swf5lval.intVal = 0; - return BOOLEAN; } -null { count(); return NULLVAL; } -break { count(); return BREAK; } -continue { count(); return CONTINUE; } -function { count(); return FUNCTION; } -else { count(); return ELSE; } -switch { count(); return SWITCH; } -case { count(); return CASE; } -default { count(); return DEFAULT; } -for { count(); return FOR; } -in { count(); return IN; } -if { count(); return IF; } -while { count(); return WHILE; } -do { count(); return DO; } -var { count(); return VAR; } -new { count(); return NEW; } -delete { count(); return DELETE; } -return { count(); return RETURN; } -with { count(); return WITH; } -asm { count(); BEGIN(asm); return ASM; } -eval { count(); return EVAL; } -typeof { count(); return TYPEOF; } -instanceof { count(); return INSTANCEOF; } - - /* legacy functions */ -random { count(); return RANDOM; } -getTimer { count(); return GETTIMER; } -length { count(); return LENGTH; } -concat { count(); return CONCAT; } -substr { count(); return SUBSTR; } -trace { count(); return TRACE; } -int { count(); return INT; } -ord { count(); return ORD; } -chr { count(); return CHR; } -getURL { count(); return GETURL; } -getURL1 { count(); return GETURL1; } -nextFrame { count(); return NEXTFRAME; } -prevFrame { count(); return PREVFRAME; } -play { count(); return PLAY; } -stop { count(); return STOP; } -toggleQuality { count(); return TOGGLEQUALITY; } -stopSounds { count(); return STOPSOUNDS; } -callFrame { count(); return CALLFRAME; } -gotoFrame { count(); return GOTOFRAME; } -setTarget { count(); return SETTARGET; } -loadVariables { count(); return LOADVARIABLES; } -loadMovie { count(); return LOADMOVIE; } -loadVariablesNum { count(); return LOADVARIABLESNUM; } -loadMovieNum { count(); return LOADMOVIENUM; } -duplicateMovieClip { count(); return DUPLICATEMOVIECLIP; } -removeMovieClip { count(); return REMOVEMOVIECLIP; } - - /* assembler ops */ -{ -dup { count(); return DUP; } -swap { count(); return SWAP; } -pop { count(); return POP; } -push { count(); return PUSH; } -setregister { count(); return SETREGISTER; } -callfunction { count(); return CALLFUNCTION; } -callmethod { count(); return CALLMETHOD; } -and { count(); return AND; } -or { count(); return OR; } -xor { count(); return XOR; } -modulo { count(); return MODULO; } -add { count(); return ADD; } -newadd { count(); return ADD; } -lessthan { count(); return LESSTHAN; } -newlessthan { count(); return LESSTHAN; } -equals { count(); return EQUALS; } -newequals { count(); return EQUALS; } -inc { count(); return INC; } -dec { count(); return DEC; } -enumerate { count(); return ENUMERATE; } -initobject { count(); return INITOBJECT; } -initarray { count(); return INITARRAY; } -getmember { count(); return GETMEMBER; } -setmember { count(); return SETMEMBER; } -shiftleft { count(); return SHIFTLEFT; } -shiftright { count(); return SHIFTRIGHT; } -shiftright2 { count(); return SHIFTRIGHT2; } -varequals { count(); return VAREQUALS; } -oldadd { count(); return OLDADD; } -subtract { count(); return SUBTRACT; } -multiply { count(); return MULTIPLY; } -divide { count(); return DIVIDE; } -oldequals { count(); return OLDEQUALS; } -oldlessthan { count(); return OLDLESSTHAN; } -logicaland { count(); return LOGICALAND; } -logicalor { count(); return LOGICALOR; } -not { count(); return NOT; } -stringeq { count(); return STRINGEQ; } -stringlength { count(); return STRINGLENGTH; } -substring { count(); return SUBSTRING; } -getvariable { count(); return GETVARIABLE; } -setvariable { count(); return SETVARIABLE; } -settargetexpr { count(); return SETTARGETEXPRESSION; } -startdrag { count(); return STARTDRAG; } -stopdrag { count(); return STOPDRAG; } -stringlessthan { count(); return STRINGLESSTHAN; } -mblength { count(); return MBLENGTH; } -mbsubstring { count(); return MBSUBSTRING; } -mbord { count(); return MBORD; } -mbchr { count(); return MBCHR; } -branch { count(); return BRANCHALWAYS; } -branchalways { count(); return BRANCHALWAYS; } -branchiftrue { count(); return BRANCHIFTRUE; } -post { count(); return POST; } -get { count(); return GET; } -end { count(); return END; } -} - -r\:{DIGIT}+ { count(); swf5lval.str = strdup(yytext+2); - return REGISTER; } - - -{ID} { count(); swf5lval.str = strdup(yytext); - return IDENTIFIER; } - -\"(\\.|[^\\"])*\" { count(); swf5lval.str = strdup(yytext+1); - swf5lval.str[strlen(swf5lval.str)-1]=0; - unescape(swf5lval.str); - return STRING; } - -\'(\\.|[^\\'])*\' { count(); swf5lval.str = strdup(yytext+1); - swf5lval.str[strlen(swf5lval.str)-1]=0; - unescape(swf5lval.str); - return STRING; } - -\"(\\.|[^\\"])*$ { count(); swf5lval.str = strdup(""); - warning("Unterminated string!"); - return STRING; } - -\'(\\.|[^\\'])*$ { count(); swf5lval.str = strdup(""); - warning("Unterminated string!"); - return STRING; } - -"/*" { count(); comment(); } -"//" { count(); comment1(); } -[ \t\v\f] { count(); } - -"++" { count(); return INCR; } -"--" { count(); return DECR; } -"<=" { count(); return LE; } -">=" { count(); return GE; } -"==" { count(); return EQ; } -"!=" { count(); return NE; } -"&&" { count(); return LAN; } -"||" { count(); return LOR; } -"*=" { count(); return MEQ; } -"/=" { count(); return DEQ; } -"+=" { count(); return IEQ; } -"-=" { count(); return SEQ; } -"&=" { count(); return AEQ; } -"|=" { count(); return OEQ; } -"<<" { count(); return SHL; } -">>" { count(); return SHR; } -">>>" { count(); return SHR2; } -"<<=" { count(); return SHLEQ; } -">>=" { count(); return SHREQ; } -">>>=" { count(); return SHR2EQ; } - -"<" { count(); return '<'; } -">" { count(); return '>'; } -";" { count(); return ';'; } -"=" { count(); return '='; } -"+" { count(); return '+'; } -"-" { count(); return '-'; } -"&" { count(); return '&'; } -"|" { count(); return '|'; } -"^" { count(); return '^'; } -"*" { count(); return '*'; } -"/" { count(); return '/'; } -"%" { count(); return '%'; } -"!" { count(); return '!'; } -"(" { count(); return '('; } -")" { count(); return ')'; } -"[" { count(); return '['; } -"]" { count(); return ']'; } -"{" { count(); return '{'; } -"}" { count(); BEGIN(0); return '}'; } -"," { count(); return ','; } -"." { count(); return '.'; } -"?" { count(); return '?'; } -":" { count(); return ':'; } -"~" { count(); return '~'; } - -\r?\n { count(); strcpy(szLine, yytext + 1); - countline(); yyless(1); } - -. SWF_error("Unrecognized character: %s\n", yytext); - -%% -static int getinput() { -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif -} - -int swf5wrap() -{ - return 1; -} - -static void countline() -{ - if(sLineNumber != 0) - msgline[column] = 0; - - ++sLineNumber; - column = 0; - msgline = msgbufs[sLineNumber & 1]; -} - -static int LineNumber(void) -{ - return (sLineNumber + 1); -} - -static int ColumnNumber(void) -{ - return column; -} - -static char *LineText(void) -{ - msgline[column] = 0; - return msgline; -} - -static void comment() -{ - // Handle block comments - - int c, c1; - -loop: - // We have the start of a comment so look skip everything up to the - // end of the comment character - while ((c = getinput()) != '*' && c != EOF) - { - if(column < 1023) - msgline[column] = c; - - ++column; - - // keep the line number in synch - if (c == '\n') - { - // start the output (matches the algorithim in the lexx above) - countline(); - } - - if (swf5debug) putchar(c); - } - - // is this the end of comment character - if ((c1 = getinput()) != '/' && c != EOF) - { - // false start as this was no end of comment - do_unput5(c1); - goto loop; - } - - // write out the start of the end of comment - if (c != EOF) - if (swf5debug) putchar(c); - - // write out the end of the end of comment - if (c1 != EOF) - if (swf5debug) putchar(c1); -} - -static void comment1() -{ - // Handle comment of type 1 (ie '//') - - int c; - - // this is a line comment - while ((c = getinput()) != '\n' && c != EOF) - { - if (swf5debug) putchar(c); - - if(column < 1023) - msgline[column] = c; - - ++column; - }; - - // keep the line number in synch - if (c == '\n') - { - if (swf5debug) putchar(c); - - countline(); - } -} - -static void count(void) -{ - int n; - - // Count the characters to maintain the current column position - if (yytext[0] == '\n') - { - if (swf5debug) printf("\n"); - } - else - { - if (swf5debug) printf("%s", yytext); - - for(n=0; n -#include -#include -#include "compile.h" -#include "action.h" -#include "assembler.h" - -#define YYPARSE_PARAM buffer - -Buffer bf, bc; - - - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 21 "swf5compiler.y" -{ - Buffer action; - char *str; - SWFGetUrl2Method getURLMethod; - int op; - int intVal; - int len; - double doubleVal; - - struct - { - Buffer buffer; - int count; - } exprlist; - struct switchcase switchcase; - struct switchcases switchcases; - struct - { - Buffer obj, ident, memexpr; - } lval; -} -/* Line 187 of yacc.c. */ -#line 407 "swf5compiler.tab.c" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif - - - -/* Copy the second part of user declarations. */ - - -/* Line 216 of yacc.c. */ -#line 420 "swf5compiler.tab.c" - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if 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 - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int i) -#else -static int -YYID (i) - int i; -#endif -{ - return i; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (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 _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss; - YYSTYPE yyvs; - }; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* 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) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) - -#endif - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 3 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 5253 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 159 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 57 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 348 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 616 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 389 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 147, 2, 2, 2, 146, 139, 2, - 157, 158, 144, 142, 132, 143, 151, 145, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 136, 156, - 137, 133, 138, 135, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 152, 2, 153, 141, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 154, 140, 155, 148, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 134, 149, 150 -}; - -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 4, 7, 8, 10, 13, 15, 17, - 19, 22, 25, 27, 31, 33, 36, 38, 40, 42, - 44, 46, 48, 50, 58, 61, 65, 67, 71, 79, - 85, 86, 88, 90, 98, 99, 102, 109, 114, 118, - 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, - 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, - 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, - 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, - 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, - 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, - 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, - 260, 262, 264, 266, 268, 270, 272, 274, 275, 277, - 281, 283, 290, 292, 296, 301, 303, 305, 307, 309, - 310, 311, 317, 324, 335, 344, 354, 355, 357, 360, - 363, 364, 367, 370, 373, 375, 377, 382, 385, 390, - 396, 401, 409, 417, 425, 433, 441, 446, 453, 468, - 472, 481, 486, 493, 497, 501, 505, 509, 513, 517, - 522, 527, 532, 537, 542, 547, 552, 556, 561, 566, - 571, 576, 581, 588, 597, 602, 603, 605, 609, 615, - 622, 630, 634, 636, 640, 642, 644, 646, 648, 650, - 652, 654, 656, 658, 660, 662, 664, 666, 668, 670, - 672, 674, 678, 683, 685, 688, 691, 694, 698, 702, - 706, 710, 714, 718, 722, 726, 730, 734, 738, 742, - 746, 750, 754, 758, 762, 766, 770, 776, 780, 784, - 786, 789, 795, 799, 801, 805, 807, 809, 811, 813, - 816, 819, 823, 826, 828, 831, 833, 835, 837, 839, - 841, 845, 849, 851, 852, 858, 861, 863, 865, 867, - 870, 873, 877, 881, 883, 886, 887, 892, 894, 896, - 898, 900, 902, 904, 906, 910, 911, 915, 917, 920, - 922, 924, 926, 928, 930, 932, 934, 936, 938, 940, - 942, 944, 946, 948, 950, 952, 954, 956, 958, 960, - 962, 964, 966, 968, 970, 972, 974, 976, 978, 980, - 982, 984, 986, 988, 990, 992, 994, 996, 998, 1000, - 1002, 1004, 1006, 1008, 1010, 1012, 1014, 1016, 1018, 1020, - 1022, 1024, 1026, 1028, 1030, 1032, 1034, 1036, 1039 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int16 yyrhs[] = -{ - 160, 0, -1, -1, 161, 162, -1, -1, 163, -1, - 162, 163, -1, 166, -1, 179, -1, 166, -1, 164, - 166, -1, 154, 155, -1, 165, -1, 154, 164, 155, - -1, 156, -1, 207, 156, -1, 170, -1, 185, -1, - 187, -1, 188, -1, 173, -1, 168, -1, 167, -1, - 20, 157, 202, 158, 154, 164, 155, -1, 18, 156, - -1, 18, 203, 156, -1, 207, -1, 169, 132, 207, - -1, 12, 157, 202, 158, 166, 6, 166, -1, 12, - 157, 202, 158, 166, -1, -1, 202, -1, 7, -1, - 172, 157, 202, 158, 154, 174, 155, -1, -1, 174, - 175, -1, 8, 202, 136, 164, 3, 156, -1, 8, - 202, 136, 164, -1, 9, 136, 164, -1, 109, -1, - 16, -1, 17, -1, 23, -1, 24, -1, 25, -1, - 26, -1, 27, -1, 28, -1, 29, -1, 30, -1, - 31, -1, 32, -1, 33, -1, 34, -1, 35, -1, - 36, -1, 37, -1, 38, -1, 39, -1, 40, -1, - 41, -1, 42, -1, 43, -1, 44, -1, 45, -1, - 46, -1, 47, -1, 48, -1, 49, -1, 50, -1, - 51, -1, 52, -1, 53, -1, 54, -1, 55, -1, - 56, -1, 57, -1, 58, -1, 59, -1, 60, -1, - 61, -1, 62, -1, 63, -1, 64, -1, 65, -1, - 66, -1, 67, -1, 68, -1, 69, -1, 70, -1, - 71, -1, 72, -1, 73, -1, 74, -1, 75, -1, - 76, -1, 77, -1, 78, -1, 79, -1, 80, -1, - 81, -1, 82, -1, 83, -1, 99, -1, 100, -1, - 84, -1, 85, -1, 86, -1, 87, -1, 88, -1, - 89, -1, 90, -1, 91, -1, 92, -1, 93, -1, - 94, -1, 95, -1, -1, 176, -1, 177, 132, 176, - -1, 5, -1, 178, 176, 157, 177, 158, 166, -1, - 176, -1, 202, 151, 176, -1, 202, 152, 202, 153, - -1, 192, -1, 195, -1, 13, -1, 14, -1, -1, - -1, 181, 157, 202, 158, 166, -1, 182, 166, 13, - 157, 202, 158, -1, 10, 157, 186, 156, 171, 156, - 186, 158, 183, 166, -1, 10, 157, 176, 11, 180, - 158, 184, 166, -1, 10, 157, 15, 176, 11, 180, - 158, 184, 166, -1, -1, 169, -1, 4, 156, -1, - 3, 156, -1, -1, 132, 93, -1, 132, 92, -1, - 132, 108, -1, 104, -1, 202, -1, 109, 157, 193, - 158, -1, 17, 109, -1, 17, 200, 151, 109, -1, - 17, 200, 152, 202, 153, -1, 28, 157, 203, 158, - -1, 32, 157, 202, 132, 202, 189, 158, -1, 94, - 157, 202, 132, 202, 189, 158, -1, 96, 157, 202, - 132, 190, 189, 158, -1, 95, 157, 202, 132, 202, - 189, 158, -1, 97, 157, 202, 132, 190, 189, 158, - -1, 98, 157, 202, 158, -1, 99, 157, 202, 132, - 202, 158, -1, 99, 157, 202, 132, 202, 132, 202, - 132, 202, 132, 202, 132, 202, 158, -1, 100, 157, - 158, -1, 82, 157, 202, 132, 202, 132, 202, 158, - -1, 83, 157, 202, 158, -1, 33, 157, 108, 132, - 108, 158, -1, 34, 157, 158, -1, 35, 157, 158, - -1, 36, 157, 158, -1, 37, 157, 158, -1, 39, - 157, 158, -1, 38, 157, 158, -1, 101, 157, 104, - 158, -1, 101, 157, 108, 158, -1, 101, 157, 202, - 158, -1, 102, 157, 108, 158, -1, 102, 157, 202, - 158, -1, 109, 157, 193, 158, -1, 22, 157, 202, - 158, -1, 24, 157, 158, -1, 23, 157, 202, 158, - -1, 25, 157, 203, 158, -1, 29, 157, 202, 158, - -1, 30, 157, 202, 158, -1, 31, 157, 202, 158, - -1, 26, 157, 202, 132, 202, 158, -1, 78, 157, - 202, 132, 202, 132, 202, 158, -1, 56, 157, 203, - 158, -1, -1, 203, -1, 193, 132, 203, -1, 178, - 157, 177, 158, 166, -1, 200, 151, 176, 157, 193, - 158, -1, 200, 152, 202, 153, 157, 193, 158, -1, - 176, 136, 203, -1, 196, -1, 197, 132, 196, -1, - 118, -1, 121, -1, 120, -1, 119, -1, 122, -1, - 123, -1, 124, -1, 134, -1, 128, -1, 129, -1, - 130, -1, 116, -1, 117, -1, 201, -1, 192, -1, - 195, -1, 176, -1, 200, 151, 176, -1, 200, 152, - 202, 153, -1, 204, -1, 143, 202, -1, 148, 202, - -1, 147, 202, -1, 202, 115, 202, -1, 202, 114, - 202, -1, 202, 144, 202, -1, 202, 145, 202, -1, - 202, 146, 202, -1, 202, 142, 202, -1, 202, 143, - 202, -1, 202, 139, 202, -1, 202, 140, 202, -1, - 202, 141, 202, -1, 202, 137, 202, -1, 202, 138, - 202, -1, 202, 111, 202, -1, 202, 112, 202, -1, - 202, 110, 202, -1, 202, 113, 202, -1, 202, 125, - 202, -1, 202, 126, 202, -1, 202, 127, 202, -1, - 202, 135, 202, 136, 202, -1, 201, 133, 203, -1, - 202, 57, 200, -1, 202, -1, 16, 176, -1, 16, - 176, 157, 193, 158, -1, 152, 193, 153, -1, 165, - -1, 154, 197, 155, -1, 192, -1, 194, -1, 195, - -1, 200, -1, 199, 201, -1, 201, 199, -1, 157, - 202, 158, -1, 143, 104, -1, 104, -1, 143, 105, - -1, 105, -1, 106, -1, 103, -1, 108, -1, 206, - -1, 205, 132, 206, -1, 176, 133, 203, -1, 176, - -1, -1, 21, 154, 208, 209, 155, -1, 15, 205, - -1, 191, -1, 192, -1, 195, -1, 199, 201, -1, - 201, 199, -1, 201, 133, 203, -1, 201, 198, 202, - -1, 214, -1, 209, 214, -1, -1, 20, 211, 209, - 19, -1, 108, -1, 104, -1, 105, -1, 106, -1, - 103, -1, 107, -1, 212, -1, 213, 132, 212, -1, - -1, 43, 215, 213, -1, 210, -1, 44, 107, -1, - 45, -1, 18, -1, 46, -1, 47, -1, 48, -1, - 49, -1, 50, -1, 51, -1, 52, -1, 53, -1, - 54, -1, 55, -1, 56, -1, 57, -1, 58, -1, - 17, -1, 16, -1, 60, -1, 59, -1, 61, -1, - 62, -1, 63, -1, 64, -1, 65, -1, 15, -1, - 66, -1, 67, -1, 68, -1, 69, -1, 70, -1, - 71, -1, 72, -1, 73, -1, 74, -1, 75, -1, - 76, -1, 77, -1, 78, -1, 29, -1, 40, -1, - 41, -1, 42, -1, 79, -1, 80, -1, 81, -1, - 26, -1, 82, -1, 83, -1, 28, -1, 84, -1, - 23, -1, 85, -1, 30, -1, 31, -1, 24, -1, - 86, -1, 87, -1, 88, -1, 89, 108, -1, 90, - 108, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 152, 152, 152, 160, 164, 165, 169, 171, 176, - 179, 185, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 203, 214, 224, 236, 237, 241, 252, - 262, 263, 267, 272, 286, 289, 297, 302, 307, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 399, 402, 407, - 414, 419, 433, 438, 444, 449, 451, 455, 460, 466, - 471, 475, 488, 501, 536, 569, 603, 604, 610, 621, - 634, 636, 638, 640, 647, 654, 662, 670, 676, 683, - 690, 694, 701, 708, 715, 722, 729, 735, 742, 753, - 758, 766, 770, 780, 784, 788, 792, 796, 800, 804, - 810, 817, 823, 830, 839, 846, 850, 854, 858, 862, - 866, 870, 874, 879, 885, 894, 897, 902, 911, 924, - 932, 941, 948, 952, 958, 959, 960, 961, 962, 963, - 964, 965, 966, 967, 968, 972, 973, 991, 1009, 1010, - 1015, 1022, 1028, 1037, 1039, 1044, 1049, 1053, 1062, 1072, - 1077, 1082, 1087, 1092, 1097, 1102, 1107, 1112, 1117, 1122, - 1128, 1133, 1137, 1142, 1146, 1150, 1154, 1164, 1191, 1199, - 1201, 1207, 1213, 1218, 1223, 1231, 1233, 1235, 1237, 1239, - 1284, 1329, 1332, 1336, 1340, 1344, 1348, 1352, 1356, 1363, - 1365, 1371, 1377, 1385, 1384, 1389, 1392, 1394, 1398, 1402, - 1441, 1480, 1501, 1546, 1547, 1552, 1551, 1559, 1562, 1565, - 1568, 1571, 1573, 1580, 1581, 1585, 1585, 1591, 1593, 1600, - 1602, 1604, 1606, 1608, 1610, 1612, 1614, 1616, 1618, 1620, - 1622, 1624, 1626, 1628, 1630, 1632, 1634, 1636, 1638, 1640, - 1642, 1644, 1646, 1648, 1650, 1654, 1655, 1656, 1657, 1658, - 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, - 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, - 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1688, 1692 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "BREAK", "CONTINUE", "FUNCTION", "ELSE", - "SWITCH", "CASE", "DEFAULT", "FOR", "IN", "IF", "WHILE", "DO", "VAR", - "NEW", "DELETE", "RETURN", "END", "WITH", "ASM", "EVAL", "RANDOM", - "GETTIMER", "LENGTH", "CONCAT", "SUBSTR", "TRACE", "INT", "ORD", "CHR", - "GETURL", "GETURL1", "NEXTFRAME", "PREVFRAME", "PLAY", "STOP", - "TOGGLEQUALITY", "STOPSOUNDS", "DUP", "SWAP", "POP", "PUSH", - "SETREGISTER", "CALLFUNCTION", "CALLMETHOD", "AND", "OR", "XOR", - "MODULO", "ADD", "LESSTHAN", "EQUALS", "INC", "DEC", "TYPEOF", - "INSTANCEOF", "ENUMERATE", "INITOBJECT", "INITARRAY", "GETMEMBER", - "SETMEMBER", "SHIFTLEFT", "SHIFTRIGHT", "SHIFTRIGHT2", "VAREQUALS", - "OLDADD", "SUBTRACT", "MULTIPLY", "DIVIDE", "OLDEQUALS", "OLDLESSTHAN", - "LOGICALAND", "LOGICALOR", "NOT", "STRINGEQ", "STRINGLENGTH", - "SUBSTRING", "GETVARIABLE", "SETVARIABLE", "SETTARGETEXPRESSION", - "DUPLICATEMOVIECLIP", "REMOVEMOVIECLIP", "STRINGLESSTHAN", "MBLENGTH", - "MBSUBSTRING", "MBORD", "MBCHR", "BRANCHALWAYS", "BRANCHIFTRUE", - "GETURL2", "POST", "GET", "LOADVARIABLES", "LOADMOVIE", - "LOADVARIABLESNUM", "LOADMOVIENUM", "CALLFRAME", "STARTDRAG", "STOPDRAG", - "GOTOFRAME", "SETTARGET", "NULLVAL", "INTEGER", "DOUBLE", "BOOLEAN", - "REGISTER", "STRING", "IDENTIFIER", "\"==\"", "\"<=\"", "\">=\"", - "\"!=\"", "\"&&\"", "\"||\"", "\"++\"", "\"--\"", "\"+=\"", "\"/=\"", - "\"*=\"", "\"-=\"", "\"%=\"", "\"&=\"", "\"|=\"", "\"<<\"", "\">>\"", - "\">>>\"", "\"<<=\"", "\">>=\"", "\">>>=\"", "NOELSE", "','", "'='", - "\"^=\"", "'?'", "':'", "'<'", "'>'", "'&'", "'|'", "'^'", "'+'", "'-'", - "'*'", "'/'", "'%'", "'!'", "'~'", "UMINUS", "POSTFIX", "'.'", "'['", - "']'", "'{'", "'}'", "';'", "'('", "')'", "$accept", "program", "@1", - "code", "anycode", "stmts", "emptybraces", "stmt", "with_stmt", - "return_stmt", "assign_stmts", "if_stmt", "expr_opt", "switch_init", - "switch_stmt", "switch_cases", "switch_case", "identifier", - "formals_list", "function_init", "function_decl", "obj_ref", - "while_init", "do_init", "for_init", "for_in_init", "iter_stmt", - "assign_stmts_opt", "cont_stmt", "break_stmt", "urlmethod", "level", - "void_function_call", "function_call", "expr_list", "anon_function_decl", - "method_call", "objexpr", "objexpr_list", "assignop", "incdecop", - "lvalue_expr", "lvalue", "expr", "expr_or_obj", "primary", "init_vars", - "init_var", "assign_stmt", "@2", "opcode_list", "with", "@3", - "push_item", "push_list", "opcode", "@4", 0 -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 44, 61, 387, 63, 58, 60, 62, 38, - 124, 94, 43, 45, 42, 47, 37, 33, 126, 388, - 389, 46, 91, 93, 123, 125, 59, 40, 41 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 159, 161, 160, 160, 162, 162, 163, 163, 164, - 164, 165, 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 167, 168, 168, 169, 169, 170, 170, - 171, 171, 172, 173, 174, 174, 175, 175, 175, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, - 178, 179, 180, 180, 180, 180, 180, 181, 182, 183, - 184, 185, 185, 185, 185, 185, 186, 186, 187, 188, - 189, 189, 189, 189, 190, 190, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 192, 192, 192, 192, 192, 192, - 192, 192, 192, 192, 192, 193, 193, 193, 194, 195, - 195, 196, 197, 197, 198, 198, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 199, 199, 200, 200, 200, - 201, 201, 201, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 203, - 203, 203, 203, 203, 203, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 204, 205, - 205, 206, 206, 208, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 209, 209, 211, 210, 212, 212, 212, - 212, 212, 212, 213, 213, 215, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 214, 214 -}; - -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 0, 2, 0, 1, 2, 1, 1, 1, - 2, 2, 1, 3, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 7, 2, 3, 1, 3, 7, 5, - 0, 1, 1, 7, 0, 2, 6, 4, 3, 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, 0, 1, 3, - 1, 6, 1, 3, 4, 1, 1, 1, 1, 0, - 0, 5, 6, 10, 8, 9, 0, 1, 2, 2, - 0, 2, 2, 2, 1, 1, 4, 2, 4, 5, - 4, 7, 7, 7, 7, 7, 4, 6, 14, 3, - 8, 4, 6, 3, 3, 3, 3, 3, 3, 4, - 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, - 4, 4, 6, 8, 4, 0, 1, 3, 5, 6, - 7, 3, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 4, 1, 2, 2, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 3, 3, 1, - 2, 5, 3, 1, 3, 1, 1, 1, 1, 2, - 2, 3, 2, 1, 2, 1, 1, 1, 1, 1, - 3, 3, 1, 0, 5, 2, 1, 1, 1, 2, - 2, 3, 3, 1, 2, 0, 4, 1, 1, 1, - 1, 1, 1, 1, 3, 0, 3, 1, 2, 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, 2, 2 -}; - -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint16 yydefact[] = -{ - 2, 0, 0, 1, 0, 0, 120, 32, 0, 0, - 127, 128, 0, 40, 41, 0, 0, 0, 0, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 0, 0, 0, 103, 104, 0, 0, 39, - 205, 206, 0, 14, 3, 5, 12, 7, 22, 21, - 16, 0, 20, 210, 0, 8, 0, 0, 17, 18, - 19, 266, 267, 268, 0, 0, 207, 0, 139, 138, - 136, 0, 41, 42, 43, 44, 45, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 75, - 97, 101, 102, 115, 116, 103, 104, 39, 262, 265, - 259, 147, 208, 209, 0, 207, 40, 257, 253, 255, - 256, 258, 39, 0, 0, 0, 185, 0, 24, 0, - 243, 0, 208, 246, 209, 0, 248, 207, 239, 0, - 213, 0, 263, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 185, 11, 0, 9, 6, 0, 0, - 0, 0, 269, 0, 0, 194, 197, 196, 195, 198, - 199, 200, 202, 203, 204, 0, 201, 0, 270, 15, - 0, 137, 210, 0, 26, 0, 0, 0, 185, 0, - 0, 240, 252, 254, 214, 216, 215, 0, 186, 0, - 192, 0, 0, 117, 249, 0, 250, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, - 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, - 0, 0, 163, 164, 165, 166, 168, 167, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 159, 253, - 258, 0, 258, 0, 0, 13, 10, 0, 117, 0, - 0, 211, 0, 271, 272, 262, 0, 0, 30, 0, - 261, 260, 0, 39, 0, 185, 0, 242, 0, 0, - 244, 251, 118, 0, 237, 238, 231, 229, 230, 232, - 218, 217, 233, 234, 235, 0, 227, 228, 224, 225, - 226, 222, 223, 219, 220, 221, 0, 313, 305, 304, - 290, 275, 339, 343, 334, 337, 327, 341, 342, 328, - 329, 330, 285, 0, 289, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 307, 306, - 308, 309, 310, 311, 312, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 331, 332, - 333, 335, 336, 338, 340, 344, 345, 346, 0, 0, - 0, 287, 273, 175, 177, 178, 0, 150, 179, 180, - 181, 0, 0, 184, 0, 0, 161, 0, 0, 0, - 0, 156, 0, 169, 170, 171, 172, 173, 146, 0, - 0, 0, 0, 185, 212, 0, 27, 210, 0, 208, - 209, 0, 0, 31, 29, 174, 149, 0, 187, 191, - 193, 0, 0, 0, 0, 0, 0, 288, 347, 348, - 264, 274, 0, 140, 0, 0, 0, 140, 140, 253, - 140, 145, 140, 0, 34, 0, 131, 0, 0, 185, - 0, 130, 0, 0, 136, 0, 241, 119, 188, 236, - 0, 0, 281, 278, 279, 280, 282, 277, 283, 286, - 182, 0, 0, 162, 0, 0, 0, 0, 0, 0, - 0, 157, 0, 121, 132, 189, 0, 130, 0, 123, - 0, 0, 28, 23, 276, 0, 142, 141, 143, 151, - 0, 0, 152, 154, 153, 155, 0, 0, 0, 33, - 35, 190, 0, 134, 124, 129, 284, 183, 160, 0, - 0, 0, 135, 0, 0, 0, 38, 133, 0, 37, - 0, 0, 0, 139, 0, 158 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 1, 2, 104, 105, 225, 106, 226, 108, 109, - 251, 110, 492, 111, 112, 562, 590, 113, 363, 181, - 115, 488, 116, 117, 603, 568, 118, 253, 119, 120, - 552, 520, 121, 182, 267, 183, 184, 270, 271, 247, - 185, 186, 187, 188, 268, 190, 159, 160, 127, 300, - 450, 451, 505, 548, 549, 452, 506 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -496 -static const yytype_int16 yypact[] = -{ - 17, 30, 908, -496, -136, -123, -496, -496, -126, -105, - -496, -496, 4178, -496, 4003, 1907, -101, -120, -88, -80, - -75, -72, -65, -496, -62, -50, -43, -40, -38, -31, - -30, -28, -27, -25, -24, -21, -496, -496, -496, -496, - -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, - -496, -496, -20, -496, -496, -496, -496, -496, -496, -496, - -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, - -496, -496, -496, -496, -18, -496, -496, -496, -17, -16, - -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, - -15, -11, -8, -5, 5, 6, 7, 8, 9, 22, - -496, -496, 1165, -496, 908, -496, -496, -496, -496, -496, - -496, 23, -496, -496, 4178, -496, 24, 1627, -496, -496, - -496, -496, -125, -97, 4091, -78, -58, -57, -496, -496, - 3137, 2190, -496, -496, -496, -496, -496, -496, -496, -496, - -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, - -496, -496, -496, -496, -496, -496, -496, -496, 49, -96, - -496, -71, -496, -496, -64, -496, 4178, -496, -496, -496, - -496, -496, 27, 2326, 2190, 2190, 2051, 3002, -496, 2190, - -496, 37, -496, -496, -496, 4091, -78, -49, 4896, -47, - -496, 2190, -496, 2190, 2190, -3, 2051, 2190, 2051, 2190, - 2190, 2190, 2190, 45, 40, 42, 47, 48, 51, 52, - 2051, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 53, 2462, 2598, 2051, -496, 1319, -496, -496, 2190, 39, - 2190, 143, -54, 4178, 2190, -496, -496, -496, -496, -496, - -496, -496, -496, -496, -496, 2051, -496, 2190, -496, -496, - 4178, 69, 174, 46, -496, 331, 2051, 4178, 2051, 4265, - 2190, 50, -496, -496, 146, 146, 146, -103, -496, 76, - -496, -113, 576, 4178, -54, 2051, -496, 4091, 2190, 2190, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, -496, 750, - 5163, 962, 999, -496, 55, 688, 56, 2850, 3280, 3317, - 4304, 86, -496, -496, -496, -496, -496, -496, 58, 4341, - 4378, 3354, 4415, 4452, 4489, 4526, 3391, 4563, -496, 61, - 62, 3428, 64, 3465, -119, -496, -496, 3502, 4178, 3539, - 68, 70, 3761, -496, 4896, -9, 3234, 2190, 2190, 1627, - -496, -496, -118, -121, 3798, 2051, 2051, -496, 2051, 4178, - -496, -496, -496, -117, -496, -78, 4955, 192, 192, 4955, - 4933, 4933, 26, 26, 26, 4600, 192, 192, 32, 32, - 32, -33, -33, 146, 146, 146, 75, -496, -496, -496, - -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, - -496, -496, -496, 123, -496, -496, -496, -496, -496, -496, - -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, - -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, - -496, -496, -496, -496, -496, -496, -496, -496, -496, -496, - -496, -496, -496, -496, -496, -496, -496, -496, 124, 125, - 2869, -496, -496, -496, -496, -496, 2190, -496, -496, -496, - -496, 2190, 127, -496, 2190, 2190, -496, 2190, 2190, 2734, - 2734, -496, 2190, -496, -496, -496, -496, -496, -48, 77, - -114, 1627, 2190, 2051, 80, 2190, -496, 82, 83, 88, - 89, 3872, 94, 4896, 236, -496, -61, -111, -496, -496, - -496, 4178, 1627, 2190, 1627, 5163, 84, -496, -496, -496, - -496, -496, 3576, 4637, 96, 4674, 4711, 4637, 4637, -110, - 112, 4896, 112, 289, -496, 1627, -496, 3613, -109, 2051, - 97, -496, 4178, 2190, 3234, 1627, -496, -496, -496, 4896, - 1473, 5087, -496, -496, -496, -496, -496, -496, -496, 120, - -496, -14, 98, -496, 2190, 2190, 99, 101, 102, 103, - 2190, -496, -4, -496, -496, -496, -107, -496, 1627, -496, - 3835, 104, -496, -496, -496, 84, -496, -496, -496, -496, - 3650, 3687, -496, -496, -496, -496, 4748, 2190, 128, -496, - -496, -496, 1627, -496, -496, -496, -496, -496, -496, 2190, - 4785, 1627, -496, 1627, 4822, 1627, 1627, -496, 2190, 1772, - 4859, 109, 2190, -1, 3724, -496 -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -496, -496, -496, -496, 162, -495, 28, 44, -496, -496, - -496, -496, -496, -496, -496, -496, -496, 20, -66, 4, - -496, -211, -496, -496, -496, -289, -496, -254, -496, -496, - -397, -189, -496, -2, -220, -496, 14, -77, -496, -496, - 141, 43, 91, 562, 38, -496, -496, 31, -129, -496, - -218, -496, -496, -290, -496, -440, -496 -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -213 -static const yytype_int16 yytable[] = -{ - 122, 254, 485, 334, 587, 588, 114, -36, -36, 540, - 511, -148, 162, 356, 356, 501, 123, -4, 501, 359, - 128, 356, -144, 356, 277, 356, -208, -208, 163, 356, - 3, 130, 158, 129, 192, -148, 257, -148, 352, 478, - 495, 502, 360, 180, 525, 125, 107, 536, -144, 565, - 357, 591, 131, 189, -209, -209, 191, 164, 100, 101, - 235, 236, 237, 238, 239, 240, 241, 100, 101, 193, - 242, 243, 244, 233, 234, 245, 246, 194, 576, 577, - -39, -39, 195, 277, 275, 196, 258, 259, 260, 277, - -212, -212, 197, 126, 578, 198, 529, -207, -207, 249, - 122, 511, 122, -174, -174, 165, 606, 199, 114, 298, - 609, 295, 296, 297, 200, 122, 123, 201, 123, 202, - 556, 557, 162, 558, 256, 559, 203, 204, 122, 205, - 206, 123, 207, 208, 229, 497, 209, 210, 163, 211, - 212, 213, 214, 124, 123, 125, 215, 125, 107, 216, - 252, 589, 217, 311, -36, 303, 340, 284, 285, 286, - 125, 231, 218, 219, 220, 221, 222, 125, 293, 294, - 295, 296, 297, 125, 293, 294, 295, 296, 297, 223, - 228, 230, 256, 162, 258, 347, 261, 542, 543, 544, - 545, 546, 547, 126, 273, 126, 338, 269, 312, 163, - 313, 346, 348, 277, 180, 314, 315, 355, 126, 316, - 317, 328, 358, 455, 457, 232, 463, 486, 462, 473, - 474, 126, 476, 122, 180, 482, 180, 483, 125, 504, - 507, 524, 508, 509, 304, 514, 306, 529, 180, 123, - -122, 531, 535, 124, 551, 124, -125, -126, 318, 277, - 534, 180, 575, 341, 553, 567, 579, 582, 124, 583, - 584, 585, 595, 528, 601, 613, 227, 248, 125, 336, - 345, 124, 480, 180, 530, 162, 274, 158, 592, 341, - 571, 522, 500, 343, 180, 596, 180, 541, 351, 0, - 0, 163, 0, 362, 350, 0, 0, 0, 0, 0, - 0, 0, 0, 180, 0, 0, 0, 0, 0, 566, - 0, 0, 0, 364, 0, 0, 126, 284, 285, 286, - 365, 0, 0, 0, 0, 0, 0, 0, 276, 0, - 0, 290, 291, 292, 293, 294, 295, 296, 297, 0, - 0, 0, 0, 0, 122, 489, 277, 122, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, - 123, 490, 0, 123, 0, 0, 124, 487, 165, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, - 0, 0, 0, 180, 180, 0, 180, 0, 277, 125, - 0, 0, 125, 494, 498, 0, 499, 0, 0, 278, - 279, 280, 281, 282, 283, 254, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 285, 286, 0, 0, 0, - 0, 560, 0, 0, 287, 0, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 0, 126, 0, 0, - 126, 278, 279, 280, 281, 282, 283, 561, 0, 0, - 0, 0, 0, 0, 0, 0, 284, 285, 286, 0, - 0, 0, 0, 0, 0, 0, 287, 0, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 0, 122, - 0, 0, 0, 489, 0, 0, 0, 124, 0, 349, - 124, 0, 0, 0, 0, 123, 0, 0, 0, 490, - 122, 0, 122, 0, 0, 487, 0, 0, 0, 0, - 0, 180, 0, 0, 0, 0, 123, 0, 123, 0, - 0, 537, 0, 122, 125, 526, 0, 0, 0, 0, - 0, 0, 122, 122, 0, 0, 0, 0, 122, 123, - 0, 0, 0, 0, 0, 125, 538, 125, 123, 123, - 0, 0, 569, 0, 123, 0, 0, 180, 0, 0, - 0, 0, 0, 0, 0, 0, 122, 0, 125, 563, - 0, 0, 126, 0, 0, 0, 0, 125, 125, 572, - 0, 0, 123, 125, 336, 0, 0, 0, 0, 0, - 122, 0, 0, 126, 0, 126, 0, 0, 0, 122, - 0, 122, 0, 122, 122, 0, 123, 122, 0, 0, - 0, 125, 593, 0, 0, 123, 126, 123, 0, 123, - 123, 0, 124, 123, 0, 126, 126, 0, 0, 0, - 0, 126, 0, 277, 0, 125, 602, 0, 0, 0, - 0, 0, 0, 124, 125, 124, 125, 607, 125, 125, - 336, 0, 125, 336, 0, 0, 0, 0, 0, 126, - 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, - 0, 0, 0, 0, 0, 124, 124, 0, 0, 0, - 0, 124, 0, 126, 0, 0, 278, 279, 280, 281, - 282, 283, 126, 255, 126, 0, 126, 126, 0, 0, - 126, 284, 285, 286, 0, 0, 0, 0, 0, 124, - 0, 287, 0, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 124, 361, 264, 265, 266, 0, 0, - 0, 272, 124, 0, 124, 277, 124, 124, 0, 0, - 124, 0, 0, 299, 0, 301, 302, 0, 0, 305, - 0, 307, 308, 309, 310, 0, 0, 0, 0, 0, - 0, 0, 0, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 0, 331, 333, 0, 0, 0, 0, 0, - 337, 0, 339, 0, 0, 0, 342, 0, 278, 279, - 280, 281, 282, 283, 0, 0, 0, 277, 0, 344, - 0, 0, 0, 284, 285, 286, 0, 0, 0, 0, - 456, 0, 354, 287, 0, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 0, 0, 0, 0, 0, - 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 386, 491, - 493, 4, 5, 6, 0, 7, 0, 0, 8, 0, - 9, 10, 11, 12, 13, 14, 15, 0, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 0, 0, 0, 0, 0, 0, 99, 512, 277, - 0, 0, 0, 513, 100, 101, 515, 516, 0, 517, - 518, 521, 521, 0, 523, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 527, 0, 0, 491, 0, 0, - 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, - 0, 0, 102, 0, 103, 539, 0, 0, 0, 0, - 0, 0, 278, 279, 280, 281, 282, 283, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, - 0, 0, 0, 0, 0, 570, 0, 287, 0, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 278, - 279, 280, 281, 282, 283, 0, 580, 581, 0, 0, - 453, 0, 586, 0, 284, 285, 286, 0, 0, 0, - 0, 0, 0, 0, 287, 0, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 0, 0, 0, 600, - 0, 0, 0, 0, 0, 0, 0, 454, 0, 0, - 0, 604, 0, 0, 0, 0, 0, 0, 4, 5, - 610, 0, 7, 0, 614, 8, 0, 9, 10, 11, - 12, 13, 14, 15, 0, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 0, 0, - 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, - 0, 100, 101, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, - 224, 103, 4, 5, 0, 0, 7, 0, 0, 8, - 0, 9, 10, 11, 12, 13, 14, 15, 0, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 0, 0, 0, 0, 0, 0, 99, 0, - 0, 0, 0, 0, 0, 100, 101, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 102, 335, 103, 4, 5, 0, 0, - 7, 0, 0, 8, 0, 9, 10, 11, 12, 13, - 14, 15, 0, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 0, 0, 0, 0, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 100, - 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 102, 573, 103, - 4, 5, 0, 0, 7, 0, 0, 8, 0, 9, - 10, 11, 12, 13, 14, 15, 0, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, - 0, 0, 0, 100, 101, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 611, 5, 0, 0, 7, - 0, 102, 8, 103, 9, 10, 11, 12, 13, 14, - 15, 0, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 0, 0, 0, 0, 0, - 0, 99, 0, 0, 0, 0, 0, 0, 100, 101, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 166, 132, 0, 102, 0, 103, 18, - 19, 20, 21, 22, 23, 137, 25, 26, 27, 141, - 142, 143, 144, 145, 146, 147, 148, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 151, - 152, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 153, 154, 0, 0, 0, 155, 156, 0, 0, - 167, 168, 169, 170, 0, 171, 172, 0, 0, 0, - 0, 0, 0, 100, 101, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 173, 0, 0, 0, 174, 175, 6, 0, 0, 176, - 0, 177, 0, 178, 179, 0, 0, 166, 132, 0, - 0, 0, 0, 18, 19, 20, 21, 22, 23, 137, - 25, 26, 27, 141, 142, 143, 144, 145, 146, 147, - 148, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 151, 152, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 153, 154, 0, 0, 0, - 155, 156, 0, 0, 167, 168, 169, 170, 0, 171, - 172, 0, 0, 0, 0, 0, 0, 100, 101, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 173, 6, 0, 0, 174, 175, - 0, 0, 0, 176, 0, 177, 13, 132, 179, 0, - 0, 0, 18, 19, 20, 21, 22, 23, 137, 25, - 26, 27, 141, 142, 143, 144, 145, 146, 147, 148, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 151, 152, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 153, 154, 0, 0, 0, 155, - 156, 0, 0, 167, 168, 169, 170, 0, 171, 172, - 0, 0, 0, 0, 0, 0, 100, 101, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, 173, 0, 0, 0, 174, 175, 0, - 0, 0, 13, 132, 0, 0, 0, 179, 18, 19, - 20, 21, 22, 23, 137, 25, 26, 27, 141, 142, - 143, 144, 145, 146, 147, 148, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 151, 152, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 153, 154, 0, 0, 0, 155, 156, 0, 0, 167, - 262, 263, 170, 0, 171, 172, 0, 0, 0, 0, - 0, 0, 100, 101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 0, 173, - 0, 0, 0, 174, 175, 0, 0, 0, 13, 132, - 0, 0, 0, 179, 18, 19, 20, 21, 22, 23, - 137, 25, 26, 27, 141, 142, 143, 144, 145, 146, - 147, 148, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 151, 152, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 153, 154, 0, 0, - 0, 155, 156, 0, 0, 167, 329, 169, 170, 0, - 330, 172, 0, 0, 0, 0, 0, 0, 100, 101, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 173, 0, 0, 0, 174, - 175, 0, 0, 0, 13, 132, 0, 0, 0, 179, - 18, 19, 20, 21, 22, 23, 137, 25, 26, 27, - 141, 142, 143, 144, 145, 146, 147, 148, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 151, 152, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 153, 154, 0, 0, 0, 155, 156, 0, - 0, 167, 168, 169, 170, 0, 332, 172, 0, 0, - 0, 0, 0, 0, 100, 101, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 0, 173, 0, 0, 0, 174, 175, 0, 0, 0, - 13, 132, 0, 0, 0, 179, 18, 19, 20, 21, - 22, 23, 137, 25, 26, 27, 141, 142, 143, 144, - 145, 146, 147, 148, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 151, 152, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 153, 154, - 0, 0, 0, 155, 156, 0, 0, 167, 519, 169, - 170, 0, 171, 172, 0, 0, 0, 0, 0, 0, - 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, - 0, 174, 175, 0, 387, 388, 389, 390, 0, 391, - 0, 179, 392, 393, 0, 394, 0, 395, 396, 397, - 398, 0, 0, 0, 0, 0, 0, 277, 0, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 458, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 13, 132, - 0, 0, 0, 0, 510, 133, 134, 135, 136, 23, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 149, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 150, 75, 76, 77, 151, 152, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 153, 154, 0, 0, - 0, 155, 156, 0, 0, 0, 0, 0, 0, 0, - 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 250, 13, 14, 0, 0, 224, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 0, 0, 0, 0, 0, 0, 99, 0, 0, 12, - 13, 14, 0, 100, 101, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 277, 0, 0, - 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, - 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, - 0, 277, 0, 0, 0, 287, 0, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 278, 279, 280, - 281, 282, 283, 0, 0, 0, 0, 0, 459, 0, - 0, 0, 284, 285, 286, 0, 0, 0, 277, 0, - 0, 0, 287, 0, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 278, 279, 280, 281, 282, 283, - 0, 0, 0, 0, 0, 460, 0, 0, 0, 284, - 285, 286, 0, 0, 0, 277, 0, 0, 0, 287, - 0, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 278, 279, 280, 281, 282, 283, 0, 0, 0, - 0, 0, 466, 0, 0, 0, 284, 285, 286, 0, - 0, 0, 277, 0, 0, 0, 287, 0, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 278, 279, - 280, 281, 282, 283, 0, 0, 0, 0, 0, 471, - 0, 0, 0, 284, 285, 286, 0, 0, 0, 277, - 0, 0, 0, 287, 0, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 278, 279, 280, 281, 282, - 283, 0, 0, 0, 0, 0, 475, 0, 0, 0, - 284, 285, 286, 0, 0, 0, 277, 0, 0, 0, - 287, 0, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 278, 279, 280, 281, 282, 283, 0, 0, - 0, 0, 0, 477, 0, 0, 0, 284, 285, 286, - 0, 0, 0, 277, 0, 0, 0, 287, 0, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 278, - 279, 280, 281, 282, 283, 0, 0, 0, 0, 0, - 479, 0, 0, 0, 284, 285, 286, 0, 0, 0, - 277, 0, 0, 0, 287, 0, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 278, 279, 280, 281, - 282, 283, 0, 0, 0, 0, 0, 481, 0, 0, - 0, 284, 285, 286, 0, 0, 0, 277, 0, 0, - 0, 287, 0, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 278, 279, 280, 281, 282, 283, 0, - 0, 0, 0, 0, 550, 0, 0, 0, 284, 285, - 286, 0, 0, 0, 277, 0, 0, 0, 287, 0, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, - 0, 564, 0, 0, 0, 284, 285, 286, 0, 0, - 0, 277, 0, 0, 0, 287, 0, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 278, 279, 280, - 281, 282, 283, 0, 0, 0, 0, 0, 597, 0, - 0, 0, 284, 285, 286, 0, 0, 0, 277, 0, - 0, 0, 287, 0, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 278, 279, 280, 281, 282, 283, - 0, 0, 0, 0, 0, 598, 0, 0, 0, 284, - 285, 286, 0, 0, 0, 277, 0, 0, 0, 287, - 0, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 278, 279, 280, 281, 282, 283, 0, 0, 0, - 0, 0, 615, 0, 0, 0, 284, 285, 286, 0, - 0, 0, 277, 0, 0, 0, 287, 0, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 278, 279, - 280, 281, 282, 283, 484, 0, 0, 0, 0, 0, - 0, 0, 0, 284, 285, 286, 0, 0, 0, 277, - 0, 0, 0, 287, 0, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 278, 279, 280, 281, 282, - 283, 496, 0, 0, 0, 0, 0, 0, 0, 0, - 284, 285, 286, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 278, 279, 280, 281, 282, 283, 594, 0, - 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, - 0, 0, 0, 0, 0, 0, 0, 287, 0, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 13, - 132, 0, 0, 532, 533, 18, 19, 20, 21, 22, - 23, 137, 25, 26, 27, 141, 142, 143, 144, 145, - 146, 147, 148, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 151, 152, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 153, 154, 0, - 0, 0, 155, 156, 0, 0, 0, 13, 132, 0, - 0, 0, 161, 18, 19, 20, 21, 22, 23, 137, - 25, 26, 27, 141, 142, 143, 144, 145, 146, 147, - 148, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 151, 152, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 153, 154, 0, 0, 0, - 155, 156, 0, 0, 13, 132, 0, 0, 0, 0, - 172, 133, 134, 135, 136, 23, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 149, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 150, 75, 76, 77, - 151, 152, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 153, 154, 0, 0, 0, 155, 156, 0, - 0, 13, 132, 0, 0, 0, 0, 157, 133, 134, - 135, 136, 23, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 149, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 150, 75, 76, 77, 151, 152, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 153, - 154, 277, 0, 0, 155, 156, 0, 0, 0, 0, - 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 279, 280, 281, 282, 283, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 285, 286, 0, 0, 0, 277, 461, 0, 0, 287, - 0, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 278, 279, 280, 281, 282, 283, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 284, 285, 286, 0, - 0, 0, 277, 464, 0, 0, 287, 0, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 278, 279, - 280, 281, 282, 283, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 284, 285, 286, 0, 0, 0, 277, - 465, 0, 0, 287, 0, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 278, 279, 280, 281, 282, - 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 284, 285, 286, 0, 0, 0, 277, 467, 0, 0, - 287, 0, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 278, 279, 280, 281, 282, 283, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, - 0, 0, 0, 277, 468, 0, 0, 287, 0, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 278, - 279, 280, 281, 282, 283, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 285, 286, 0, 0, 0, - 277, 469, 0, 0, 287, 0, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 278, 279, 280, 281, - 282, 283, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 284, 285, 286, 0, 0, 0, 277, 470, 0, - 0, 287, 0, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 278, 279, 280, 281, 282, 283, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 284, 285, - 286, 0, 0, 0, 277, 472, 0, 0, 287, 0, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 278, 279, 280, 281, 282, 283, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, - 0, 277, 0, 0, 0, 287, 503, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 278, 279, 280, - 281, 282, 283, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 284, 285, 286, 0, 0, 0, 277, 551, - 0, 0, 287, 0, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 278, 279, 280, 281, 282, 283, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, - 285, 286, 0, 0, 0, 277, 554, 0, 0, 287, - 0, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 278, 279, 280, 281, 282, 283, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 284, 285, 286, 0, - 0, 0, 277, 555, 0, 0, 287, 0, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 278, 279, - 280, 281, 282, 283, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 284, 285, 286, 0, 0, 0, 277, - 599, 0, 0, 287, 0, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 278, 279, 280, 281, 282, - 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 284, 285, 286, 0, 0, 0, 277, 0, 0, 0, - 287, 605, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 278, 279, 280, 281, 282, 283, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, - 0, 0, 0, 277, 608, 0, 0, 287, 0, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 278, - 279, 280, 281, 282, 283, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 284, 285, 286, 0, 0, 0, - 277, 612, 0, 0, 287, 0, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 278, 279, 280, 281, - 282, 283, 277, 0, 0, 0, 0, 0, 0, 0, - 0, 284, 285, 286, 0, 0, 0, 0, 0, 0, - 0, 287, 0, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 278, 279, 280, 281, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 284, 285, - 286, 0, 0, 0, 0, 0, 279, 280, 0, 0, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 284, 285, 286, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 387, 388, 389, 390, 574, 391, 0, 0, - 392, 393, 0, 394, 0, 395, 396, 397, 398, 0, - 0, 0, 0, 0, 0, 0, 0, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 445, 446, 447, 448, 449, 387, 388, - 389, 390, 0, 391, 0, 0, 392, 393, 0, 394, - 0, 395, 396, 397, 398, 0, 0, 0, 0, 0, - 0, 0, 0, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 449 -}; - -static const yytype_int16 yycheck[] = -{ - 2, 130, 11, 223, 8, 9, 2, 8, 9, 504, - 450, 132, 14, 132, 132, 132, 2, 0, 132, 132, - 156, 132, 132, 132, 57, 132, 151, 152, 14, 132, - 0, 157, 12, 156, 154, 156, 132, 158, 258, 158, - 158, 158, 155, 15, 158, 2, 2, 158, 158, 158, - 153, 158, 157, 15, 151, 152, 157, 14, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 116, 117, 157, - 128, 129, 130, 151, 152, 133, 134, 157, 92, 93, - 151, 152, 157, 57, 133, 157, 157, 151, 152, 57, - 151, 152, 157, 2, 108, 157, 157, 151, 152, 156, - 102, 541, 104, 151, 152, 14, 601, 157, 104, 156, - 605, 144, 145, 146, 157, 117, 102, 157, 104, 157, - 517, 518, 124, 520, 133, 522, 157, 157, 130, 157, - 157, 117, 157, 157, 114, 355, 157, 157, 124, 157, - 157, 157, 157, 2, 130, 102, 157, 104, 104, 157, - 130, 155, 157, 108, 155, 158, 13, 125, 126, 127, - 117, 117, 157, 157, 157, 157, 157, 124, 142, 143, - 144, 145, 146, 130, 142, 143, 144, 145, 146, 157, - 157, 157, 133, 185, 157, 11, 166, 103, 104, 105, - 106, 107, 108, 102, 157, 104, 157, 177, 158, 185, - 158, 132, 156, 57, 176, 158, 158, 157, 117, 158, - 158, 158, 136, 158, 158, 124, 158, 346, 132, 158, - 158, 130, 158, 225, 196, 157, 198, 157, 185, 154, - 107, 154, 108, 108, 196, 108, 198, 157, 210, 225, - 158, 158, 6, 102, 132, 104, 158, 158, 210, 57, - 156, 223, 132, 233, 158, 158, 158, 158, 117, 158, - 158, 158, 158, 483, 136, 156, 104, 126, 225, 225, - 250, 130, 338, 245, 485, 277, 185, 257, 567, 259, - 534, 470, 359, 245, 256, 575, 258, 505, 257, -1, - -1, 277, -1, 273, 256, -1, -1, -1, -1, -1, - -1, -1, -1, 275, -1, -1, -1, -1, -1, 529, - -1, -1, -1, 275, -1, -1, 225, 125, 126, 127, - 277, -1, -1, -1, -1, -1, -1, -1, 187, -1, - -1, 139, 140, 141, 142, 143, 144, 145, 146, -1, - -1, -1, -1, -1, 346, 347, 57, 349, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 338, -1, - 346, 347, -1, 349, -1, -1, 225, 347, 277, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 359, - -1, -1, -1, 355, 356, -1, 358, -1, 57, 346, - -1, -1, 349, 349, 356, -1, 358, -1, -1, 110, - 111, 112, 113, 114, 115, 534, -1, -1, -1, -1, - -1, -1, -1, -1, 125, 126, 127, -1, -1, -1, - -1, 132, -1, -1, 135, -1, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, -1, 346, -1, -1, - 349, 110, 111, 112, 113, 114, 115, 158, -1, -1, - -1, -1, -1, -1, -1, -1, 125, 126, 127, -1, - -1, -1, -1, -1, -1, -1, 135, -1, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, -1, 481, - -1, -1, -1, 485, -1, -1, -1, 346, -1, 158, - 349, -1, -1, -1, -1, 481, -1, -1, -1, 485, - 502, -1, 504, -1, -1, 485, -1, -1, -1, -1, - -1, 483, -1, -1, -1, -1, 502, -1, 504, -1, - -1, 501, -1, 525, 481, 481, -1, -1, -1, -1, - -1, -1, 534, 535, -1, -1, -1, -1, 540, 525, - -1, -1, -1, -1, -1, 502, 502, 504, 534, 535, - -1, -1, 532, -1, 540, -1, -1, 529, -1, -1, - -1, -1, -1, -1, -1, -1, 568, -1, 525, 525, - -1, -1, 481, -1, -1, -1, -1, 534, 535, 535, - -1, -1, 568, 540, 540, -1, -1, -1, -1, -1, - 592, -1, -1, 502, -1, 504, -1, -1, -1, 601, - -1, 603, -1, 605, 606, -1, 592, 609, -1, -1, - -1, 568, 568, -1, -1, 601, 525, 603, -1, 605, - 606, -1, 481, 609, -1, 534, 535, -1, -1, -1, - -1, 540, -1, 57, -1, 592, 592, -1, -1, -1, - -1, -1, -1, 502, 601, 504, 603, 603, 605, 606, - 606, -1, 609, 609, -1, -1, -1, -1, -1, 568, - -1, -1, -1, -1, -1, -1, 525, -1, -1, -1, - -1, -1, -1, -1, -1, 534, 535, -1, -1, -1, - -1, 540, -1, 592, -1, -1, 110, 111, 112, 113, - 114, 115, 601, 131, 603, -1, 605, 606, -1, -1, - 609, 125, 126, 127, -1, -1, -1, -1, -1, 568, - -1, 135, -1, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 592, 158, 173, 174, 175, -1, -1, - -1, 179, 601, -1, 603, 57, 605, 606, -1, -1, - 609, -1, -1, 191, -1, 193, 194, -1, -1, 197, - -1, 199, 200, 201, 202, -1, -1, -1, -1, -1, - -1, -1, -1, 211, 212, 213, 214, 215, 216, 217, - 218, 219, -1, 221, 222, -1, -1, -1, -1, -1, - 228, -1, 230, -1, -1, -1, 234, -1, 110, 111, - 112, 113, 114, 115, -1, -1, -1, 57, -1, 247, - -1, -1, -1, 125, 126, 127, -1, -1, -1, -1, - 132, -1, 260, 135, -1, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, -1, -1, -1, -1, -1, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, 126, 127, -1, -1, - -1, -1, -1, -1, -1, 135, -1, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 158, 347, - 348, 3, 4, 5, -1, 7, -1, -1, 10, -1, - 12, 13, 14, 15, 16, 17, 18, -1, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, -1, -1, -1, -1, -1, -1, 109, 456, 57, - -1, -1, -1, 461, 116, 117, 464, 465, -1, 467, - 468, 469, 470, -1, 472, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 482, -1, -1, 485, -1, -1, - -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, - -1, -1, 154, -1, 156, 503, -1, -1, -1, -1, - -1, -1, 110, 111, 112, 113, 114, 115, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, 126, 127, - -1, -1, -1, -1, -1, 533, -1, 135, -1, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 110, - 111, 112, 113, 114, 115, -1, 554, 555, -1, -1, - 158, -1, 560, -1, 125, 126, 127, -1, -1, -1, - -1, -1, -1, -1, 135, -1, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, -1, -1, -1, 587, - -1, -1, -1, -1, -1, -1, -1, 158, -1, -1, - -1, 599, -1, -1, -1, -1, -1, -1, 3, 4, - 608, -1, 7, -1, 612, 10, -1, 12, 13, 14, - 15, 16, 17, 18, -1, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, -1, -1, - -1, -1, -1, -1, 109, -1, -1, -1, -1, -1, - -1, 116, 117, -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, 154, - 155, 156, 3, 4, -1, -1, 7, -1, -1, 10, - -1, 12, 13, 14, 15, 16, 17, 18, -1, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, -1, -1, -1, -1, -1, -1, 109, -1, - -1, -1, -1, -1, -1, 116, 117, -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, 154, 155, 156, 3, 4, -1, -1, - 7, -1, -1, 10, -1, 12, 13, 14, 15, 16, - 17, 18, -1, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, -1, -1, -1, -1, - -1, -1, 109, -1, -1, -1, -1, -1, -1, 116, - 117, -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, 154, 155, 156, - 3, 4, -1, -1, 7, -1, -1, 10, -1, 12, - 13, 14, 15, 16, 17, 18, -1, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - -1, -1, -1, -1, -1, -1, 109, -1, -1, -1, - -1, -1, -1, 116, 117, -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, 4, -1, -1, 7, - -1, 154, 10, 156, 12, 13, 14, 15, 16, 17, - 18, -1, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, -1, -1, -1, -1, -1, - -1, 109, -1, -1, -1, -1, -1, -1, 116, 117, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 16, 17, -1, 154, -1, 156, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, -1, -1, -1, 99, 100, -1, -1, - 103, 104, 105, 106, -1, 108, 109, -1, -1, -1, - -1, -1, -1, 116, 117, -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, - 143, -1, -1, -1, 147, 148, 5, -1, -1, 152, - -1, 154, -1, 156, 157, -1, -1, 16, 17, -1, - -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, -1, -1, -1, - 99, 100, -1, -1, 103, 104, 105, 106, -1, 108, - 109, -1, -1, -1, -1, -1, -1, 116, 117, -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, 143, 5, -1, -1, 147, 148, - -1, -1, -1, 152, -1, 154, 16, 17, 157, -1, - -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, -1, -1, -1, 99, - 100, -1, -1, 103, 104, 105, 106, -1, 108, 109, - -1, -1, -1, -1, -1, -1, 116, 117, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 5, -1, 143, -1, -1, -1, 147, 148, -1, - -1, -1, 16, 17, -1, -1, -1, 157, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, -1, -1, -1, 99, 100, -1, -1, 103, - 104, 105, 106, -1, 108, 109, -1, -1, -1, -1, - -1, -1, 116, 117, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 5, -1, 143, - -1, -1, -1, 147, 148, -1, -1, -1, 16, 17, - -1, -1, -1, 157, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, -1, -1, - -1, 99, 100, -1, -1, 103, 104, 105, 106, -1, - 108, 109, -1, -1, -1, -1, -1, -1, 116, 117, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 5, -1, 143, -1, -1, -1, 147, - 148, -1, -1, -1, 16, 17, -1, -1, -1, 157, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, -1, -1, -1, 99, 100, -1, - -1, 103, 104, 105, 106, -1, 108, 109, -1, -1, - -1, -1, -1, -1, 116, 117, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, - -1, 143, -1, -1, -1, 147, 148, -1, -1, -1, - 16, 17, -1, -1, -1, 157, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - -1, -1, -1, 99, 100, -1, -1, 103, 104, 105, - 106, -1, 108, 109, -1, -1, -1, -1, -1, -1, - 116, 117, -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, 143, -1, -1, - -1, 147, 148, -1, 15, 16, 17, 18, -1, 20, - -1, 157, 23, 24, -1, 26, -1, 28, 29, 30, - 31, -1, -1, -1, -1, -1, -1, 57, -1, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, 126, 127, -1, -1, - -1, -1, -1, -1, -1, 135, -1, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 158, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 16, 17, - -1, -1, -1, -1, 155, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, -1, -1, - -1, 99, 100, -1, -1, -1, -1, -1, -1, -1, - -1, 109, -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, 15, 16, 17, -1, -1, 155, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - -1, -1, -1, -1, -1, -1, 109, -1, -1, 15, - 16, 17, -1, 116, 117, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 57, -1, -1, - -1, -1, -1, 109, -1, -1, -1, -1, -1, -1, - 116, 117, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, 126, 127, -1, -1, - -1, 57, -1, -1, -1, 135, -1, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 110, 111, 112, - 113, 114, 115, -1, -1, -1, -1, -1, 158, -1, - -1, -1, 125, 126, 127, -1, -1, -1, 57, -1, - -1, -1, 135, -1, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 110, 111, 112, 113, 114, 115, - -1, -1, -1, -1, -1, 158, -1, -1, -1, 125, - 126, 127, -1, -1, -1, 57, -1, -1, -1, 135, - -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 110, 111, 112, 113, 114, 115, -1, -1, -1, - -1, -1, 158, -1, -1, -1, 125, 126, 127, -1, - -1, -1, 57, -1, -1, -1, 135, -1, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 110, 111, - 112, 113, 114, 115, -1, -1, -1, -1, -1, 158, - -1, -1, -1, 125, 126, 127, -1, -1, -1, 57, - -1, -1, -1, 135, -1, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 110, 111, 112, 113, 114, - 115, -1, -1, -1, -1, -1, 158, -1, -1, -1, - 125, 126, 127, -1, -1, -1, 57, -1, -1, -1, - 135, -1, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 110, 111, 112, 113, 114, 115, -1, -1, - -1, -1, -1, 158, -1, -1, -1, 125, 126, 127, - -1, -1, -1, 57, -1, -1, -1, 135, -1, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 110, - 111, 112, 113, 114, 115, -1, -1, -1, -1, -1, - 158, -1, -1, -1, 125, 126, 127, -1, -1, -1, - 57, -1, -1, -1, 135, -1, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 110, 111, 112, 113, - 114, 115, -1, -1, -1, -1, -1, 158, -1, -1, - -1, 125, 126, 127, -1, -1, -1, 57, -1, -1, - -1, 135, -1, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 110, 111, 112, 113, 114, 115, -1, - -1, -1, -1, -1, 158, -1, -1, -1, 125, 126, - 127, -1, -1, -1, 57, -1, -1, -1, 135, -1, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, - -1, 158, -1, -1, -1, 125, 126, 127, -1, -1, - -1, 57, -1, -1, -1, 135, -1, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 110, 111, 112, - 113, 114, 115, -1, -1, -1, -1, -1, 158, -1, - -1, -1, 125, 126, 127, -1, -1, -1, 57, -1, - -1, -1, 135, -1, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 110, 111, 112, 113, 114, 115, - -1, -1, -1, -1, -1, 158, -1, -1, -1, 125, - 126, 127, -1, -1, -1, 57, -1, -1, -1, 135, - -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 110, 111, 112, 113, 114, 115, -1, -1, -1, - -1, -1, 158, -1, -1, -1, 125, 126, 127, -1, - -1, -1, 57, -1, -1, -1, 135, -1, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 110, 111, - 112, 113, 114, 115, 153, -1, -1, -1, -1, -1, - -1, -1, -1, 125, 126, 127, -1, -1, -1, 57, - -1, -1, -1, 135, -1, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 110, 111, 112, 113, 114, - 115, 153, -1, -1, -1, -1, -1, -1, -1, -1, - 125, 126, 127, -1, -1, -1, -1, -1, -1, -1, - 135, -1, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 110, 111, 112, 113, 114, 115, 153, -1, - -1, -1, -1, -1, -1, -1, -1, 125, 126, 127, - -1, -1, -1, -1, -1, -1, -1, 135, -1, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 16, - 17, -1, -1, 151, 152, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, -1, - -1, -1, 99, 100, -1, -1, -1, 16, 17, -1, - -1, -1, 109, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, -1, -1, -1, - 99, 100, -1, -1, 16, 17, -1, -1, -1, -1, - 109, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, -1, -1, -1, 99, 100, -1, - -1, 16, 17, -1, -1, -1, -1, 109, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 57, -1, -1, 99, 100, -1, -1, -1, -1, - -1, -1, -1, -1, 109, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 110, 111, 112, 113, 114, 115, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, - 126, 127, -1, -1, -1, 57, 132, -1, -1, 135, - -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 110, 111, 112, 113, 114, 115, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 125, 126, 127, -1, - -1, -1, 57, 132, -1, -1, 135, -1, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 110, 111, - 112, 113, 114, 115, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, 126, 127, -1, -1, -1, 57, - 132, -1, -1, 135, -1, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 110, 111, 112, 113, 114, - 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 125, 126, 127, -1, -1, -1, 57, 132, -1, -1, - 135, -1, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 110, 111, 112, 113, 114, 115, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, 126, 127, - -1, -1, -1, 57, 132, -1, -1, 135, -1, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 110, - 111, 112, 113, 114, 115, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 125, 126, 127, -1, -1, -1, - 57, 132, -1, -1, 135, -1, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 110, 111, 112, 113, - 114, 115, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 125, 126, 127, -1, -1, -1, 57, 132, -1, - -1, 135, -1, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 110, 111, 112, 113, 114, 115, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 125, 126, - 127, -1, -1, -1, 57, 132, -1, -1, 135, -1, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 110, 111, 112, 113, 114, 115, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, 126, 127, -1, -1, - -1, 57, -1, -1, -1, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 110, 111, 112, - 113, 114, 115, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 125, 126, 127, -1, -1, -1, 57, 132, - -1, -1, 135, -1, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 110, 111, 112, 113, 114, 115, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, - 126, 127, -1, -1, -1, 57, 132, -1, -1, 135, - -1, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 110, 111, 112, 113, 114, 115, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 125, 126, 127, -1, - -1, -1, 57, 132, -1, -1, 135, -1, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 110, 111, - 112, 113, 114, 115, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, 126, 127, -1, -1, -1, 57, - 132, -1, -1, 135, -1, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 110, 111, 112, 113, 114, - 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 125, 126, 127, -1, -1, -1, 57, -1, -1, -1, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 110, 111, 112, 113, 114, 115, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, 126, 127, - -1, -1, -1, 57, 132, -1, -1, 135, -1, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 110, - 111, 112, 113, 114, 115, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 125, 126, 127, -1, -1, -1, - 57, 132, -1, -1, 135, -1, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 110, 111, 112, 113, - 114, 115, 57, -1, -1, -1, -1, -1, -1, -1, - -1, 125, 126, 127, -1, -1, -1, -1, -1, -1, - -1, 135, -1, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 110, 111, 112, 113, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 125, 126, - 127, -1, -1, -1, -1, -1, 111, 112, -1, -1, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 125, 126, 127, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 15, 16, 17, 18, 19, 20, -1, -1, - 23, 24, -1, 26, -1, 28, 29, 30, 31, -1, - -1, -1, -1, -1, -1, -1, -1, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 15, 16, - 17, 18, -1, 20, -1, -1, 23, 24, -1, 26, - -1, 28, 29, 30, 31, -1, -1, -1, -1, -1, - -1, -1, -1, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90 -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 160, 161, 0, 3, 4, 5, 7, 10, 12, - 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 109, - 116, 117, 154, 156, 162, 163, 165, 166, 167, 168, - 170, 172, 173, 176, 178, 179, 181, 182, 185, 187, - 188, 191, 192, 195, 199, 200, 201, 207, 156, 156, - 157, 157, 17, 23, 24, 25, 26, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 56, - 78, 82, 83, 94, 95, 99, 100, 109, 176, 205, - 206, 109, 192, 195, 200, 201, 16, 103, 104, 105, - 106, 108, 109, 143, 147, 148, 152, 154, 156, 157, - 165, 178, 192, 194, 195, 199, 200, 201, 202, 203, - 204, 157, 154, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 155, 164, 166, 163, 157, 176, - 157, 166, 201, 151, 152, 118, 119, 120, 121, 122, - 123, 124, 128, 129, 130, 133, 134, 198, 199, 156, - 15, 169, 176, 186, 207, 202, 133, 132, 157, 151, - 152, 176, 104, 105, 202, 202, 202, 193, 203, 176, - 196, 197, 202, 157, 201, 133, 199, 57, 110, 111, - 112, 113, 114, 115, 125, 126, 127, 135, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 156, 202, - 208, 202, 202, 158, 203, 202, 203, 202, 202, 202, - 202, 108, 158, 158, 158, 158, 158, 158, 203, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 158, 104, - 108, 202, 108, 202, 193, 155, 166, 202, 157, 202, - 13, 176, 202, 203, 202, 176, 132, 11, 156, 158, - 203, 206, 193, 109, 202, 157, 132, 153, 136, 132, - 155, 158, 176, 177, 203, 200, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 158, 15, 16, 17, - 18, 20, 23, 24, 26, 28, 29, 30, 31, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 209, 210, 214, 158, 158, 158, 132, 158, 158, 158, - 158, 132, 132, 158, 132, 132, 158, 132, 132, 132, - 132, 158, 132, 158, 158, 158, 158, 158, 158, 158, - 177, 158, 157, 157, 153, 11, 207, 176, 180, 192, - 195, 202, 171, 202, 166, 158, 153, 193, 203, 203, - 196, 132, 158, 136, 154, 211, 215, 107, 108, 108, - 155, 214, 202, 202, 108, 202, 202, 202, 202, 104, - 190, 202, 190, 202, 154, 158, 166, 202, 193, 157, - 180, 158, 151, 152, 156, 6, 158, 176, 166, 202, - 164, 209, 103, 104, 105, 106, 107, 108, 212, 213, - 158, 132, 189, 158, 132, 132, 189, 189, 189, 189, - 132, 158, 174, 166, 158, 158, 193, 158, 184, 176, - 202, 186, 166, 155, 19, 132, 92, 93, 108, 158, - 202, 202, 158, 158, 158, 158, 202, 8, 9, 155, - 175, 158, 184, 166, 153, 158, 212, 158, 158, 132, - 202, 136, 166, 183, 202, 136, 164, 166, 132, 164, - 202, 3, 132, 156, 202, 158 -}; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif - -/* 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 (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) -#else -static void -yy_stack_print (bottom, top) - yytype_int16 *bottom; - yytype_int16 *top; -#endif -{ - YYFPRINTF (stderr, "Stack now"); - for (; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - fprintf (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - fprintf (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} - - -/* Prevent warnings from -Wmissing-prototypes. */ - -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - - -/* The look-ahead symbol. */ -int yychar; - -/* The semantic value of the look-ahead symbol. */ -YYSTYPE yylval; - -/* Number of syntax errors so far. */ -int yynerrs; - - - -/*----------. -| yyparse. | -`----------*/ - -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () - -#endif -#endif -{ - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss = yyssa; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; - - - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - YYSIZE_T yystacksize = YYINITDEPTH; - - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - - - /* 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")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss; - yyvsp = yyvs; - - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - look-ahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to look-ahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; - - /* Not known => get a look-ahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - if (yyn == YYFINAL) - YYACCEPT; - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the look-ahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - yystate = yyn; - *++yyvsp = yylval; - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 2: -#line 152 "swf5compiler.y" - { bf = newBuffer(); - bc = newBuffer(); - ;} - break; - - case 3: -#line 155 "swf5compiler.y" - { Buffer b = newBuffer(); - bufferWriteConstants(b); - bufferConcat(b, bf); - bufferConcat(b, bc); - *((Buffer *)buffer) = b; ;} - break; - - case 4: -#line 160 "swf5compiler.y" - { Buffer b = newBuffer(); *((Buffer *)buffer) = b; ;} - break; - - case 7: -#line 170 "swf5compiler.y" - { bufferConcat(bc, (yyvsp[(1) - (1)].action)); ;} - break; - - case 8: -#line 172 "swf5compiler.y" - { bufferConcat(bf, (yyvsp[(1) - (1)].action)); ;} - break; - - case 9: -#line 177 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (1)].action); ;} - break; - - case 10: -#line 180 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (2)].action); - bufferConcat((yyval.action), (yyvsp[(2) - (2)].action)); ;} - break; - - case 11: -#line 185 "swf5compiler.y" - { ;} - break; - - case 12: -#line 189 "swf5compiler.y" - { (yyval.action) = NULL; ;} - break; - - case 13: -#line 190 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (3)].action); ;} - break; - - case 14: -#line 191 "swf5compiler.y" - { (yyval.action) = NULL; ;} - break; - - case 15: -#line 192 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (2)].action); ;} - break; - - case 23: -#line 204 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (7)].action); - bufferWriteOp((yyval.action), SWFACTION_WITH); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(6) - (7)].action))); - bufferConcat((yyval.action), (yyvsp[(6) - (7)].action)); ;} - break; - - case 24: -#line 215 "swf5compiler.y" - { int tmp = chkctx(CTX_FUNCTION); - if(tmp < 0) - swf5error("return outside function"); - (yyval.action) = newBuffer(); - while(--tmp >= 0) - bufferWriteOp((yyval.action), SWFACTION_POP); - bufferWriteNull((yyval.action)); - bufferWriteOp((yyval.action), SWFACTION_RETURN); ;} - break; - - case 25: -#line 225 "swf5compiler.y" - { int tmp = chkctx(CTX_FUNCTION); - if(tmp < 0) - swf5error("return outside function"); - (yyval.action) = newBuffer(); - while(--tmp >= 0) - bufferWriteOp((yyval.action), SWFACTION_POP); - bufferConcat((yyval.action), (yyvsp[(2) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_RETURN); ;} - break; - - case 27: -#line 237 "swf5compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); ;} - break; - - case 28: -#line 242 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (7)].action); - bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(7) - (7)].action))+5); - bufferConcat((yyval.action), (yyvsp[(7) - (7)].action)); - bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (7)].action))); - bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); ;} - break; - - case 29: -#line 253 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (5)].action); - bufferWriteOp((yyval.action), SWFACTION_LOGICALNOT); - bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (5)].action))); - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); ;} - break; - - case 30: -#line 262 "swf5compiler.y" - { (yyval.action) = NULL; ;} - break; - - case 31: -#line 263 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (1)].action); ;} - break; - - case 32: -#line 268 "swf5compiler.y" - { addctx(CTX_SWITCH); ;} - break; - - case 33: -#line 274 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (7)].action); - bufferResolveSwitch((yyval.action), &(yyvsp[(6) - (7)].switchcases)); - bufferResolveJumps((yyval.action)); - bufferWriteOp((yyval.action), SWFACTION_POP); - delctx(CTX_SWITCH); - /* FIXME: continue in switch continues surrounding loop, if any */ - ;} - break; - - case 34: -#line 286 "swf5compiler.y" - { (yyval.switchcases).count = 0; - (yyval.switchcases).list = 0; ;} - break; - - case 35: -#line 290 "swf5compiler.y" - { (yyval.switchcases) = (yyvsp[(1) - (2)].switchcases); - (yyval.switchcases).list = (struct switchcase*) realloc((yyval.switchcases).list, ((yyval.switchcases).count+1) * sizeof(struct switchcase)); - (yyval.switchcases).list[(yyval.switchcases).count] = (yyvsp[(2) - (2)].switchcase); - (yyval.switchcases).count++; ;} - break; - - case 36: -#line 298 "swf5compiler.y" - { (yyval.switchcase).cond = (yyvsp[(2) - (6)].action); - (yyval.switchcase).action = (yyvsp[(4) - (6)].action); - (yyval.switchcase).isbreak = 1; ;} - break; - - case 37: -#line 303 "swf5compiler.y" - { (yyval.switchcase).cond = (yyvsp[(2) - (4)].action); - (yyval.switchcase).action = (yyvsp[(4) - (4)].action); - (yyval.switchcase).isbreak = 0; ;} - break; - - case 38: -#line 308 "swf5compiler.y" - { (yyval.switchcase).cond = NULL; - (yyval.switchcase).action = (yyvsp[(3) - (3)].action); - (yyval.switchcase).isbreak = 0; ;} - break; - - case 40: -#line 318 "swf5compiler.y" - { (yyval.str) = strdup("new"); ;} - break; - - case 41: -#line 319 "swf5compiler.y" - { (yyval.str) = strdup("delete"); ;} - break; - - case 42: -#line 320 "swf5compiler.y" - { (yyval.str) = strdup("random"); ;} - break; - - case 43: -#line 321 "swf5compiler.y" - { (yyval.str) = strdup("getTimer"); ;} - break; - - case 44: -#line 322 "swf5compiler.y" - { (yyval.str) = strdup("length"); ;} - break; - - case 45: -#line 323 "swf5compiler.y" - { (yyval.str) = strdup("concat"); ;} - break; - - case 46: -#line 324 "swf5compiler.y" - { (yyval.str) = strdup("substr"); ;} - break; - - case 47: -#line 325 "swf5compiler.y" - { (yyval.str) = strdup("trace"); ;} - break; - - case 48: -#line 326 "swf5compiler.y" - { (yyval.str) = strdup("int"); ;} - break; - - case 49: -#line 327 "swf5compiler.y" - { (yyval.str) = strdup("ord"); ;} - break; - - case 50: -#line 328 "swf5compiler.y" - { (yyval.str) = strdup("chr"); ;} - break; - - case 51: -#line 329 "swf5compiler.y" - { (yyval.str) = strdup("getURL"); ;} - break; - - case 52: -#line 330 "swf5compiler.y" - { (yyval.str) = strdup("getURL1"); ;} - break; - - case 53: -#line 331 "swf5compiler.y" - { (yyval.str) = strdup("nextFrame"); ;} - break; - - case 54: -#line 332 "swf5compiler.y" - { (yyval.str) = strdup("prevFrame"); ;} - break; - - case 55: -#line 333 "swf5compiler.y" - { (yyval.str) = strdup("play"); ;} - break; - - case 56: -#line 334 "swf5compiler.y" - { (yyval.str) = strdup("stop"); ;} - break; - - case 57: -#line 335 "swf5compiler.y" - { (yyval.str) = strdup("toggleQuality"); ;} - break; - - case 58: -#line 336 "swf5compiler.y" - { (yyval.str) = strdup("stopSounds"); ;} - break; - - case 59: -#line 337 "swf5compiler.y" - { (yyval.str) = strdup("dup"); ;} - break; - - case 60: -#line 338 "swf5compiler.y" - { (yyval.str) = strdup("swap"); ;} - break; - - case 61: -#line 339 "swf5compiler.y" - { (yyval.str) = strdup("pop"); ;} - break; - - case 62: -#line 340 "swf5compiler.y" - { (yyval.str) = strdup("push"); ;} - break; - - case 63: -#line 341 "swf5compiler.y" - { (yyval.str) = strdup("setRegister"); ;} - break; - - case 64: -#line 342 "swf5compiler.y" - { (yyval.str) = strdup("callFunction"); ;} - break; - - case 65: -#line 343 "swf5compiler.y" - { (yyval.str) = strdup("callMethod"); ;} - break; - - case 66: -#line 344 "swf5compiler.y" - { (yyval.str) = strdup("and"); ;} - break; - - case 67: -#line 345 "swf5compiler.y" - { (yyval.str) = strdup("or"); ;} - break; - - case 68: -#line 346 "swf5compiler.y" - { (yyval.str) = strdup("xor"); ;} - break; - - case 69: -#line 347 "swf5compiler.y" - { (yyval.str) = strdup("modulo"); ;} - break; - - case 70: -#line 348 "swf5compiler.y" - { (yyval.str) = strdup("add"); ;} - break; - - case 71: -#line 349 "swf5compiler.y" - { (yyval.str) = strdup("lessThan"); ;} - break; - - case 72: -#line 350 "swf5compiler.y" - { (yyval.str) = strdup("equals"); ;} - break; - - case 73: -#line 351 "swf5compiler.y" - { (yyval.str) = strdup("inc"); ;} - break; - - case 74: -#line 352 "swf5compiler.y" - { (yyval.str) = strdup("dec"); ;} - break; - - case 75: -#line 353 "swf5compiler.y" - { (yyval.str) = strdup("typeof"); ;} - break; - - case 76: -#line 354 "swf5compiler.y" - { (yyval.str) = strdup("instanceof"); ;} - break; - - case 77: -#line 355 "swf5compiler.y" - { (yyval.str) = strdup("enumerate"); ;} - break; - - case 78: -#line 356 "swf5compiler.y" - { (yyval.str) = strdup("initobject"); ;} - break; - - case 79: -#line 357 "swf5compiler.y" - { (yyval.str) = strdup("initarray"); ;} - break; - - case 80: -#line 358 "swf5compiler.y" - { (yyval.str) = strdup("getmember"); ;} - break; - - case 81: -#line 359 "swf5compiler.y" - { (yyval.str) = strdup("setmember"); ;} - break; - - case 82: -#line 360 "swf5compiler.y" - { (yyval.str) = strdup("shiftleft"); ;} - break; - - case 83: -#line 361 "swf5compiler.y" - { (yyval.str) = strdup("shiftright"); ;} - break; - - case 84: -#line 362 "swf5compiler.y" - { (yyval.str) = strdup("shiftright2"); ;} - break; - - case 85: -#line 363 "swf5compiler.y" - { (yyval.str) = strdup("varequals"); ;} - break; - - case 86: -#line 364 "swf5compiler.y" - { (yyval.str) = strdup("oldAdd"); ;} - break; - - case 87: -#line 365 "swf5compiler.y" - { (yyval.str) = strdup("subtract"); ;} - break; - - case 88: -#line 366 "swf5compiler.y" - { (yyval.str) = strdup("multiply"); ;} - break; - - case 89: -#line 367 "swf5compiler.y" - { (yyval.str) = strdup("divide"); ;} - break; - - case 90: -#line 368 "swf5compiler.y" - { (yyval.str) = strdup("oldequals"); ;} - break; - - case 91: -#line 369 "swf5compiler.y" - { (yyval.str) = strdup("oldlessthan"); ;} - break; - - case 92: -#line 370 "swf5compiler.y" - { (yyval.str) = strdup("logicaland"); ;} - break; - - case 93: -#line 371 "swf5compiler.y" - { (yyval.str) = strdup("logicalor"); ;} - break; - - case 94: -#line 372 "swf5compiler.y" - { (yyval.str) = strdup("not"); ;} - break; - - case 95: -#line 373 "swf5compiler.y" - { (yyval.str) = strdup("stringeq"); ;} - break; - - case 96: -#line 374 "swf5compiler.y" - { (yyval.str) = strdup("stringlength"); ;} - break; - - case 97: -#line 375 "swf5compiler.y" - { (yyval.str) = strdup("substring"); ;} - break; - - case 98: -#line 376 "swf5compiler.y" - { (yyval.str) = strdup("getvariable"); ;} - break; - - case 99: -#line 377 "swf5compiler.y" - { (yyval.str) = strdup("setvariable"); ;} - break; - - case 100: -#line 378 "swf5compiler.y" - { (yyval.str) = strdup("settargetexpression"); ;} - break; - - case 101: -#line 379 "swf5compiler.y" - { (yyval.str) = strdup("duplicatemovieclip"); ;} - break; - - case 102: -#line 380 "swf5compiler.y" - { (yyval.str) = strdup("removemovieclip"); ;} - break; - - case 103: -#line 381 "swf5compiler.y" - { (yyval.str) = strdup("startdrag"); ;} - break; - - case 104: -#line 382 "swf5compiler.y" - { (yyval.str) = strdup("stopdrag"); ;} - break; - - case 105: -#line 383 "swf5compiler.y" - { (yyval.str) = strdup("stringlessthan"); ;} - break; - - case 106: -#line 384 "swf5compiler.y" - { (yyval.str) = strdup("mblength"); ;} - break; - - case 107: -#line 385 "swf5compiler.y" - { (yyval.str) = strdup("mbsubstring"); ;} - break; - - case 108: -#line 386 "swf5compiler.y" - { (yyval.str) = strdup("mbord"); ;} - break; - - case 109: -#line 387 "swf5compiler.y" - { (yyval.str) = strdup("mbchr"); ;} - break; - - case 110: -#line 388 "swf5compiler.y" - { (yyval.str) = strdup("branchalways"); ;} - break; - - case 111: -#line 389 "swf5compiler.y" - { (yyval.str) = strdup("branchiftrue"); ;} - break; - - case 112: -#line 390 "swf5compiler.y" - { (yyval.str) = strdup("getURL2"); ;} - break; - - case 113: -#line 391 "swf5compiler.y" - { (yyval.str) = strdup("post"); ;} - break; - - case 114: -#line 392 "swf5compiler.y" - { (yyval.str) = strdup("get"); ;} - break; - - case 115: -#line 393 "swf5compiler.y" - { (yyval.str) = strdup("loadvariables"); ;} - break; - - case 116: -#line 394 "swf5compiler.y" - { (yyval.str) = strdup("loadMovie"); ;} - break; - - case 117: -#line 399 "swf5compiler.y" - { (yyval.exprlist).buffer = newBuffer(); - (yyval.exprlist).count = 0; ;} - break; - - case 118: -#line 403 "swf5compiler.y" - { (yyval.exprlist).buffer = newBuffer(); - bufferWriteHardString((yyval.exprlist).buffer, (byte*)(yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - (yyval.exprlist).count = 1; ;} - break; - - case 119: -#line 408 "swf5compiler.y" - { (yyval.exprlist) = (yyvsp[(1) - (3)].exprlist); - bufferWriteHardString((yyval.exprlist).buffer, (byte*)(yyvsp[(3) - (3)].str), strlen((yyvsp[(3) - (3)].str))+1); - ++(yyval.exprlist).count; ;} - break; - - case 120: -#line 415 "swf5compiler.y" - { addctx(CTX_FUNCTION); ;} - break; - - case 121: -#line 420 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_DEFINEFUNCTION); - bufferWriteS16((yyval.action), strlen((yyvsp[(2) - (6)].str)) + - bufferLength((yyvsp[(4) - (6)].exprlist).buffer) + 5); - bufferWriteHardString((yyval.action), (byte*) (yyvsp[(2) - (6)].str), strlen((yyvsp[(2) - (6)].str))+1); - bufferWriteS16((yyval.action), (yyvsp[(4) - (6)].exprlist).count); - bufferConcat((yyval.action), (yyvsp[(4) - (6)].exprlist).buffer); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(6) - (6)].action))); - bufferConcat((yyval.action), (yyvsp[(6) - (6)].action)); - delctx(CTX_FUNCTION); ;} - break; - - case 122: -#line 434 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - free((yyvsp[(1) - (1)].str)); ;} - break; - - case 123: -#line 439 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferWriteString((yyval.action), (yyvsp[(3) - (3)].str), strlen((yyvsp[(3) - (3)].str))+1); - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); - free((yyvsp[(3) - (3)].str)); ;} - break; - - case 124: -#line 445 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (4)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (4)].action)); - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); ;} - break; - - case 127: -#line 456 "swf5compiler.y" - { addctx(CTX_LOOP); ;} - break; - - case 128: -#line 461 "swf5compiler.y" - { addctx(CTX_LOOP); ;} - break; - - case 129: -#line 466 "swf5compiler.y" - { addctx(CTX_LOOP); ;} - break; - - case 130: -#line 471 "swf5compiler.y" - { addctx(CTX_FOR_IN); ;} - break; - - case 131: -#line 476 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (5)].action); - bufferWriteOp((yyval.action), SWFACTION_LOGICALNOT); - bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (5)].action))+5); - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); - bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); - bufferResolveJumps((yyval.action)); - delctx(CTX_LOOP); ;} - break; - - case 132: -#line 489 "swf5compiler.y" - { if((yyvsp[(2) - (6)].action)) - { (yyval.action) = (yyvsp[(2) - (6)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); - } - else - (yyval.action) = (yyvsp[(5) - (6)].action); - bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), -(bufferLength((yyval.action))+2)); - bufferResolveJumps((yyval.action)); - delctx(CTX_LOOP); ;} - break; - - case 133: -#line 502 "swf5compiler.y" - { - if((yyvsp[(3) - (10)].action)) - (yyval.action) = (yyvsp[(3) - (10)].action); - else - (yyval.action) = newBuffer(); - - if((yyvsp[(7) - (10)].action)) - { - bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(7) - (10)].action))); - } - else - (yyvsp[(7) - (10)].action) = newBuffer(); - - if((yyvsp[(5) - (10)].action)) - { - bufferConcat((yyvsp[(7) - (10)].action), (yyvsp[(5) - (10)].action)); - bufferWriteOp((yyvsp[(7) - (10)].action), SWFACTION_LOGICALNOT); - bufferWriteOp((yyvsp[(7) - (10)].action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyvsp[(7) - (10)].action), 2); - bufferWriteS16((yyvsp[(7) - (10)].action), bufferLength((yyvsp[(10) - (10)].action))+5); - } - - bufferConcat((yyvsp[(7) - (10)].action), (yyvsp[(10) - (10)].action)); - bufferWriteOp((yyvsp[(7) - (10)].action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyvsp[(7) - (10)].action), 2); - bufferWriteS16((yyvsp[(7) - (10)].action), -(bufferLength((yyvsp[(7) - (10)].action))+2)); - bufferResolveJumps((yyvsp[(7) - (10)].action)); - - bufferConcat((yyval.action), (yyvsp[(7) - (10)].action)); - delctx(CTX_LOOP); - ;} - break; - - case 134: -#line 537 "swf5compiler.y" - { Buffer b2, b3; - int tmp; - - (yyval.action) = (yyvsp[(5) - (8)].action); - bufferWriteOp((yyval.action), SWFACTION_ENUMERATE); - - b2 = newBuffer(); - bufferWriteSetRegister(b2, 0); - bufferWriteOp(b2, SWFACTION_PUSHDATA); - bufferWriteS16(b2, 1); - bufferWriteU8(b2, 2); - bufferWriteOp(b2, SWFACTION_NEWEQUALS); - bufferWriteOp(b2, SWFACTION_BRANCHIFTRUE); - bufferWriteS16(b2, 2); - - b3 = newBuffer(); -/* basically a lvalue could be used here rather than an ident !!! */ -/* probably by using reg1 for the test rather than reg0 */ - bufferWriteString(b3, (yyvsp[(3) - (8)].str), strlen((yyvsp[(3) - (8)].str))+1); - bufferWriteRegister(b3, 0); - bufferWriteOp(b3, SWFACTION_SETVARIABLE); - bufferConcat(b3, (yyvsp[(8) - (8)].action)); - bufferWriteS16(b2, bufferLength(b3) + 5); - tmp = bufferLength(b2) + bufferLength(b3) + 5; - bufferConcat((yyval.action), b2); - bufferWriteOp(b3, SWFACTION_BRANCHALWAYS); - bufferWriteS16(b3, 2); - bufferWriteS16(b3, -tmp); - bufferResolveJumps(b3); - bufferConcat((yyval.action), b3); - delctx(CTX_FOR_IN); ;} - break; - - case 135: -#line 570 "swf5compiler.y" - { Buffer b2, b3; - int tmp; - - (yyval.action) = (yyvsp[(6) - (9)].action); - bufferWriteOp((yyval.action), SWFACTION_ENUMERATE); - - b2 = newBuffer(); - bufferWriteSetRegister(b2, 0); - bufferWriteOp(b2, SWFACTION_PUSHDATA); - bufferWriteS16(b2, 1); - bufferWriteU8(b2, 2); - bufferWriteOp(b2, SWFACTION_NEWEQUALS); - bufferWriteOp(b2, SWFACTION_BRANCHIFTRUE); - bufferWriteS16(b2, 2); - // add size later - - b3 = newBuffer(); - bufferWriteString(b3, (yyvsp[(4) - (9)].str), strlen((yyvsp[(4) - (9)].str))+1); - bufferWriteRegister(b3, 0); - bufferWriteOp(b3, SWFACTION_VAREQUALS); - bufferConcat(b3, (yyvsp[(9) - (9)].action)); - bufferWriteS16(b2, bufferLength(b3) + 5); - tmp = bufferLength(b2) + bufferLength(b3) + 5; - bufferConcat((yyval.action), b2); - bufferWriteOp(b3, SWFACTION_BRANCHALWAYS); - bufferWriteS16(b3, 2); - bufferWriteS16(b3, -tmp); - bufferResolveJumps(b3); - bufferConcat((yyval.action), b3); - delctx(CTX_FOR_IN); ;} - break; - - case 136: -#line 603 "swf5compiler.y" - { (yyval.action) = NULL; ;} - break; - - case 138: -#line 611 "swf5compiler.y" - { if(chkctx(CTX_CONTINUE) < 0) - swf5error("continue outside loop"); - (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), MAGIC_CONTINUE_NUMBER); ;} - break; - - case 139: -#line 622 "swf5compiler.y" - { int tmp = chkctx(CTX_BREAK); - if(tmp < 0) - swf5error("break outside switch / loop"); - (yyval.action) = newBuffer(); - if(tmp) /* break out of a for .. in */ - bufferWriteOp((yyval.action), SWFACTION_POP); - bufferWriteOp((yyval.action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), MAGIC_BREAK_NUMBER); ;} - break; - - case 140: -#line 634 "swf5compiler.y" - { (yyval.getURLMethod) = GETURL_METHOD_NOSEND; ;} - break; - - case 141: -#line 636 "swf5compiler.y" - { (yyval.getURLMethod) = GETURL_METHOD_GET; ;} - break; - - case 142: -#line 638 "swf5compiler.y" - { (yyval.getURLMethod) = GETURL_METHOD_POST; ;} - break; - - case 143: -#line 640 "swf5compiler.y" - { if(strcmp((yyvsp[(2) - (2)].str), "GET") == 0) - (yyval.getURLMethod) = GETURL_METHOD_GET; - else if(strcmp((yyvsp[(2) - (2)].str), "POST") == 0) - (yyval.getURLMethod) = GETURL_METHOD_POST; ;} - break; - - case 144: -#line 648 "swf5compiler.y" - { char *lvlstring = (char*) malloc(12*sizeof(char)); - sprintf(lvlstring, "_level%d", (yyvsp[(1) - (1)].intVal)); - (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), lvlstring, strlen(lvlstring)+1); - free(lvlstring); ;} - break; - - case 145: -#line 655 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), "_level", 7); - bufferConcat((yyval.action), (yyvsp[(1) - (1)].action)); - bufferWriteOp((yyval.action), SWFACTION_STRINGCONCAT); ;} - break; - - case 146: -#line 663 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].exprlist).buffer; - bufferWriteInt((yyval.action), (yyvsp[(3) - (4)].exprlist).count); - bufferWriteString((yyval.action), (yyvsp[(1) - (4)].str), strlen((yyvsp[(1) - (4)].str))+1); - bufferWriteOp((yyval.action), SWFACTION_CALLFUNCTION); - bufferWriteOp((yyval.action), SWFACTION_POP); - free((yyvsp[(1) - (4)].str)); ;} - break; - - case 147: -#line 671 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(2) - (2)].str), strlen((yyvsp[(2) - (2)].str))+1); - free((yyvsp[(2) - (2)].str)); - bufferWriteOp((yyval.action), SWFACTION_DELETE); ;} - break; - - case 148: -#line 677 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (4)].action); - // bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferWriteString((yyval.action), (yyvsp[(4) - (4)].str), strlen((yyvsp[(4) - (4)].str))+1); - free((yyvsp[(4) - (4)].str)); - bufferWriteOp((yyval.action), SWFACTION_DELETEVAR); ;} - break; - - case 149: -#line 684 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (5)].action); - // bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferConcat((yyval.action), (yyvsp[(4) - (5)].action)); - // bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferWriteOp((yyval.action), SWFACTION_DELETEVAR); ;} - break; - - case 150: -#line 691 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_TRACE); ;} - break; - - case 151: -#line 695 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (7)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); - bufferWriteOp((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), (yyvsp[(6) - (7)].getURLMethod)); ;} - break; - - case 152: -#line 702 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (7)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); - bufferWriteOp((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 0xc0+(yyvsp[(6) - (7)].getURLMethod)); ;} - break; - - case 153: -#line 709 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (7)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); - bufferWriteOp((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 0x80+(yyvsp[(6) - (7)].getURLMethod)); ;} - break; - - case 154: -#line 716 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (7)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); - bufferWriteOp((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 0x40+(yyvsp[(6) - (7)].getURLMethod)); ;} - break; - - case 155: -#line 723 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (7)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (7)].action)); - bufferWriteOp((yyval.action), SWFACTION_GETURL2); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), (yyvsp[(6) - (7)].getURLMethod)); ;} - break; - - case 156: -#line 730 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_CALLFRAME); - bufferWriteS16((yyval.action), 0); ;} - break; - - case 157: -#line 736 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), "0", 2); /* no constraint */ - bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); - bufferConcat((yyval.action), (yyvsp[(3) - (6)].action)); - bufferWriteOp((yyval.action), SWFACTION_STARTDRAGMOVIE); ;} - break; - - case 158: -#line 743 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferConcat((yyval.action), (yyvsp[(7) - (14)].action)); - bufferConcat((yyval.action), (yyvsp[(11) - (14)].action)); - bufferConcat((yyval.action), (yyvsp[(9) - (14)].action)); - bufferConcat((yyval.action), (yyvsp[(13) - (14)].action)); - bufferWriteString((yyval.action), "1", 2); /* has constraint */ - bufferConcat((yyval.action), (yyvsp[(5) - (14)].action)); - bufferConcat((yyval.action), (yyvsp[(3) - (14)].action)); - bufferWriteOp((yyval.action), SWFACTION_STARTDRAGMOVIE); ;} - break; - - case 159: -#line 754 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_STOPDRAGMOVIE); ;} - break; - - case 160: -#line 759 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (8)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); - bufferConcat((yyval.action), (yyvsp[(7) - (8)].action)); - bufferWriteInt((yyval.action), 16384); /* magic number */ - bufferWriteOp((yyval.action), SWFACTION_ADD); - bufferWriteOp((yyval.action), SWFACTION_DUPLICATECLIP); ;} - break; - - case 161: -#line 767 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_REMOVECLIP); ;} - break; - - case 162: -#line 771 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_GETURL); - bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (6)].str)) + strlen((yyvsp[(5) - (6)].str)) + 2); - bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (6)].str), strlen((yyvsp[(3) - (6)].str))); - bufferWriteU8((yyval.action), 0); - bufferWriteHardString((yyval.action), (byte*)(yyvsp[(5) - (6)].str), strlen((yyvsp[(5) - (6)].str))); - bufferWriteU8((yyval.action), 0); ;} - break; - - case 163: -#line 781 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_NEXTFRAME); ;} - break; - - case 164: -#line 785 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_PREVFRAME); ;} - break; - - case 165: -#line 789 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_PLAY); ;} - break; - - case 166: -#line 793 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_STOP); ;} - break; - - case 167: -#line 797 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_STOPSOUNDS); ;} - break; - - case 168: -#line 801 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_TOGGLEQUALITY); ;} - break; - - case 169: -#line 805 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_GOTOFRAME); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), (yyvsp[(3) - (4)].intVal)); ;} - break; - - case 170: -#line 811 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_GOTOLABEL); - bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (4)].str))+1); - bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); - free((yyvsp[(3) - (4)].str)); ;} - break; - - case 171: -#line 818 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_GOTOEXPRESSION); - bufferWriteS16((yyval.action), 1); - bufferWriteU8((yyval.action), 0); ;} - break; - - case 172: -#line 824 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_SETTARGET); - bufferWriteS16((yyval.action), strlen((yyvsp[(3) - (4)].str))+1); - bufferWriteHardString((yyval.action), (byte*)(yyvsp[(3) - (4)].str), strlen((yyvsp[(3) - (4)].str))+1); - free((yyvsp[(3) - (4)].str)); ;} - break; - - case 173: -#line 831 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_SETTARGETEXPRESSION); ;} - break; - - case 174: -#line 840 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].exprlist).buffer; - bufferWriteInt((yyval.action), (yyvsp[(3) - (4)].exprlist).count); - bufferWriteString((yyval.action), (yyvsp[(1) - (4)].str), strlen((yyvsp[(1) - (4)].str))+1); - bufferWriteOp((yyval.action), SWFACTION_CALLFUNCTION); - free((yyvsp[(1) - (4)].str)); ;} - break; - - case 175: -#line 847 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); ;} - break; - - case 176: -#line 851 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_GETTIMER); ;} - break; - - case 177: -#line 855 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_RANDOM); ;} - break; - - case 178: -#line 859 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_STRINGLENGTH); ;} - break; - - case 179: -#line 863 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_INT); ;} - break; - - case 180: -#line 867 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_ORD); ;} - break; - - case 181: -#line 871 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_CHR); ;} - break; - - case 182: -#line 875 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (6)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (6)].action)); - bufferWriteOp((yyval.action), SWFACTION_STRINGCONCAT); ;} - break; - - case 183: -#line 880 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (8)].action); - bufferConcat((yyval.action), (yyvsp[(5) - (8)].action)); - bufferConcat((yyval.action), (yyvsp[(7) - (8)].action)); - bufferWriteOp((yyval.action), SWFACTION_SUBSTRING); ;} - break; - - case 184: -#line 886 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (4)].action); - bufferWriteOp((yyval.action), SWFACTION_TYPEOF); ;} - break; - - case 185: -#line 894 "swf5compiler.y" - { (yyval.exprlist).buffer = newBuffer(); - (yyval.exprlist).count = 0; ;} - break; - - case 186: -#line 898 "swf5compiler.y" - { (yyval.exprlist).buffer = (yyvsp[(1) - (1)].action); - (yyval.exprlist).count = 1; ;} - break; - - case 187: -#line 903 "swf5compiler.y" - { Buffer tmp = newBuffer(); - bufferConcat(tmp, (yyvsp[(3) - (3)].action)); - bufferConcat(tmp, (yyval.exprlist).buffer); - (yyval.exprlist).buffer = tmp; - ++(yyval.exprlist).count; ;} - break; - - case 188: -#line 912 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteOp((yyval.action), SWFACTION_DEFINEFUNCTION); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(3) - (5)].exprlist).buffer) + 5); - bufferWriteU8((yyval.action), 0); /* empty function name */ - bufferWriteS16((yyval.action), (yyvsp[(3) - (5)].exprlist).count); - bufferConcat((yyval.action), (yyvsp[(3) - (5)].exprlist).buffer); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(5) - (5)].action))); - bufferConcat((yyval.action), (yyvsp[(5) - (5)].action)); - delctx(CTX_FUNCTION); ;} - break; - - case 189: -#line 925 "swf5compiler.y" - { (yyval.action) = (yyvsp[(5) - (6)].exprlist).buffer; - bufferWriteInt((yyval.action), (yyvsp[(5) - (6)].exprlist).count); - bufferConcat((yyval.action), (yyvsp[(1) - (6)].action)); - bufferWriteString((yyval.action), (yyvsp[(3) - (6)].str), strlen((yyvsp[(3) - (6)].str))+1); - bufferWriteOp((yyval.action), SWFACTION_CALLMETHOD); - free((yyvsp[(3) - (6)].str)); ;} - break; - - case 190: -#line 933 "swf5compiler.y" - { (yyval.action) = (yyvsp[(6) - (7)].exprlist).buffer; - bufferWriteInt((yyval.action), (yyvsp[(6) - (7)].exprlist).count); - bufferConcat((yyval.action), (yyvsp[(1) - (7)].action)); - bufferConcat((yyval.action), (yyvsp[(3) - (7)].action)); - bufferWriteOp((yyval.action), SWFACTION_CALLMETHOD); ;} - break; - - case 191: -#line 942 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (3)].str), strlen((yyvsp[(1) - (3)].str))+1); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); ;} - break; - - case 192: -#line 949 "swf5compiler.y" - { (yyval.exprlist).buffer = (yyvsp[(1) - (1)].action); - (yyval.exprlist).count = 1; ;} - break; - - case 193: -#line 953 "swf5compiler.y" - { bufferConcat((yyval.exprlist).buffer, (yyvsp[(3) - (3)].action)); - ++(yyval.exprlist).count; ;} - break; - - case 194: -#line 958 "swf5compiler.y" - { (yyval.op) = SWFACTION_NEWADD; ;} - break; - - case 195: -#line 959 "swf5compiler.y" - { (yyval.op) = SWFACTION_SUBTRACT; ;} - break; - - case 196: -#line 960 "swf5compiler.y" - { (yyval.op) = SWFACTION_MULTIPLY; ;} - break; - - case 197: -#line 961 "swf5compiler.y" - { (yyval.op) = SWFACTION_DIVIDE; ;} - break; - - case 198: -#line 962 "swf5compiler.y" - { (yyval.op) = SWFACTION_MODULO; ;} - break; - - case 199: -#line 963 "swf5compiler.y" - { (yyval.op) = SWFACTION_BITWISEAND; ;} - break; - - case 200: -#line 964 "swf5compiler.y" - { (yyval.op) = SWFACTION_BITWISEOR; ;} - break; - - case 201: -#line 965 "swf5compiler.y" - { (yyval.op) = SWFACTION_BITWISEXOR; ;} - break; - - case 202: -#line 966 "swf5compiler.y" - { (yyval.op) = SWFACTION_SHIFTLEFT; ;} - break; - - case 203: -#line 967 "swf5compiler.y" - { (yyval.op) = SWFACTION_SHIFTRIGHT; ;} - break; - - case 204: -#line 968 "swf5compiler.y" - { (yyval.op) = SWFACTION_SHIFTRIGHT2; ;} - break; - - case 205: -#line 972 "swf5compiler.y" - { (yyval.op) = SWFACTION_INCREMENT; ;} - break; - - case 206: -#line 973 "swf5compiler.y" - { (yyval.op) = SWFACTION_DECREMENT; ;} - break; - - case 207: -#line 992 "swf5compiler.y" - { if((yyvsp[(1) - (1)].lval).obj) - { - (yyval.action) = (yyvsp[(1) - (1)].lval).obj; - - if((yyvsp[(1) - (1)].lval).ident) - bufferConcat((yyval.action), (yyvsp[(1) - (1)].lval).ident); - else - bufferConcat((yyval.action), (yyvsp[(1) - (1)].lval).memexpr); - - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); - } - else - { - (yyval.action) = (yyvsp[(1) - (1)].lval).ident; - bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); - } - ;} - break; - - case 210: -#line 1016 "swf5compiler.y" - { (yyval.lval).ident = newBuffer(); - bufferWriteString((yyval.lval).ident, (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - free((yyvsp[(1) - (1)].str)); - (yyval.lval).obj = 0; - (yyval.lval).memexpr = 0; ;} - break; - - case 211: -#line 1023 "swf5compiler.y" - { (yyval.lval).obj = (yyvsp[(1) - (3)].action); - (yyval.lval).ident = newBuffer(); - bufferWriteString((yyval.lval).ident, (yyvsp[(3) - (3)].str), strlen((yyvsp[(3) - (3)].str))+1); - (yyval.lval).memexpr = 0; ;} - break; - - case 212: -#line 1029 "swf5compiler.y" - { (yyval.lval).obj = (yyvsp[(1) - (4)].action); - (yyval.lval).memexpr = (yyvsp[(3) - (4)].action); - (yyval.lval).ident = 0; ;} - break; - - case 214: -#line 1040 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); - bufferWriteInt((yyvsp[(2) - (2)].action), -1); - bufferWriteOp((yyvsp[(2) - (2)].action), SWFACTION_MULTIPLY); ;} - break; - - case 215: -#line 1045 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); - bufferWriteInt((yyvsp[(2) - (2)].action), 0xffffffff); - bufferWriteOp((yyvsp[(2) - (2)].action), SWFACTION_BITWISEXOR); ;} - break; - - case 216: -#line 1050 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); - bufferWriteOp((yyvsp[(2) - (2)].action), SWFACTION_LOGICALNOT); ;} - break; - - case 217: -#line 1054 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferWriteOp((yyval.action), SWFACTION_DUP); - bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(3) - (3)].action))+1); - bufferWriteOp((yyval.action), SWFACTION_POP); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); ;} - break; - - case 218: -#line 1063 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferWriteOp((yyval.action), SWFACTION_DUP); - bufferWriteOp((yyval.action), SWFACTION_LOGICALNOT); - bufferWriteOp((yyval.action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyval.action), 2); - bufferWriteS16((yyval.action), bufferLength((yyvsp[(3) - (3)].action))+1); - bufferWriteOp((yyval.action), SWFACTION_POP); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); ;} - break; - - case 219: -#line 1073 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_MULTIPLY); ;} - break; - - case 220: -#line 1078 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_DIVIDE); ;} - break; - - case 221: -#line 1083 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_MODULO); ;} - break; - - case 222: -#line 1088 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_NEWADD); ;} - break; - - case 223: -#line 1093 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_SUBTRACT); ;} - break; - - case 224: -#line 1098 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_BITWISEAND); ;} - break; - - case 225: -#line 1103 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_BITWISEOR); ;} - break; - - case 226: -#line 1108 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_BITWISEXOR); ;} - break; - - case 227: -#line 1113 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_NEWLESSTHAN); ;} - break; - - case 228: -#line 1118 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(1) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_NEWLESSTHAN); ;} - break; - - case 229: -#line 1123 "swf5compiler.y" - { (yyval.action) = (yyvsp[(3) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(1) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_NEWLESSTHAN); - bufferWriteOp((yyval.action), SWFACTION_LOGICALNOT); ;} - break; - - case 230: -#line 1129 "swf5compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_NEWLESSTHAN); - bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} - break; - - case 231: -#line 1134 "swf5compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_NEWEQUALS); ;} - break; - - case 232: -#line 1138 "swf5compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_NEWEQUALS); - bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_LOGICALNOT); ;} - break; - - case 233: -#line 1143 "swf5compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_SHIFTLEFT); ;} - break; - - case 234: -#line 1147 "swf5compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_SHIFTRIGHT); ;} - break; - - case 235: -#line 1151 "swf5compiler.y" - { bufferConcat((yyvsp[(1) - (3)].action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyvsp[(1) - (3)].action), SWFACTION_SHIFTRIGHT2); ;} - break; - - case 236: -#line 1155 "swf5compiler.y" - { bufferWriteOp((yyvsp[(1) - (5)].action), SWFACTION_BRANCHIFTRUE); - bufferWriteS16((yyvsp[(1) - (5)].action), 2); - bufferWriteS16((yyvsp[(1) - (5)].action), bufferLength((yyvsp[(5) - (5)].action))+5); - bufferConcat((yyvsp[(1) - (5)].action), (yyvsp[(5) - (5)].action)); - bufferWriteOp((yyvsp[(1) - (5)].action), SWFACTION_BRANCHALWAYS); - bufferWriteS16((yyvsp[(1) - (5)].action), 2); - bufferWriteS16((yyvsp[(1) - (5)].action), bufferLength((yyvsp[(3) - (5)].action))); - bufferConcat((yyvsp[(1) - (5)].action), (yyvsp[(3) - (5)].action)); ;} - break; - - case 237: -#line 1165 "swf5compiler.y" - { if((yyvsp[(1) - (3)].lval).obj) /* obj[memexpr] or obj.ident */ - { - (yyval.action) = (yyvsp[(1) - (3)].lval).obj; - - if((yyvsp[(1) - (3)].lval).ident) - bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).ident); - else - bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).memexpr); - - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteSetRegister((yyval.action), 0); - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); - bufferWriteRegister((yyval.action), 0); - } - else /* just ident */ - { - (yyval.action) = (yyvsp[(3) - (3)].action); - bufferWriteOp((yyval.action), SWFACTION_DUP); - bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).ident); - bufferWriteOp((yyval.action), SWFACTION_SWAP); - bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); - } -/* tricky case missing here: lvalue ASSIGN expr */ -/* like in x = y += z; */ - ;} - break; - - case 238: -#line 1192 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_INSTANCEOF); ;} - break; - - case 240: -#line 1202 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteInt((yyval.action), 0); - bufferWriteString((yyval.action), (yyvsp[(2) - (2)].str), strlen((yyvsp[(2) - (2)].str))+1); - bufferWriteOp((yyval.action), SWFACTION_NEW); ;} - break; - - case 241: -#line 1208 "swf5compiler.y" - { (yyval.action) = (yyvsp[(4) - (5)].exprlist).buffer; - bufferWriteInt((yyval.action), (yyvsp[(4) - (5)].exprlist).count); - bufferWriteString((yyval.action), (yyvsp[(2) - (5)].str), strlen((yyvsp[(2) - (5)].str))+1); - bufferWriteOp((yyval.action), SWFACTION_NEW); ;} - break; - - case 242: -#line 1214 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (3)].exprlist).buffer; - bufferWriteInt((yyval.action), (yyvsp[(2) - (3)].exprlist).count); - bufferWriteOp((yyval.action), SWFACTION_INITARRAY); ;} - break; - - case 243: -#line 1219 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteInt((yyval.action), 0); - bufferWriteOp((yyval.action), SWFACTION_INITOBJECT); ;} - break; - - case 244: -#line 1224 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (3)].exprlist).buffer; - bufferWriteInt((yyval.action), (yyvsp[(2) - (3)].exprlist).count); - bufferWriteOp((yyval.action), SWFACTION_INITOBJECT); ;} - break; - - case 249: -#line 1240 "swf5compiler.y" - { if((yyvsp[(2) - (2)].lval).obj) - { - if((yyvsp[(2) - (2)].lval).ident) // expr . identifier - { - (yyval.action) = (yyvsp[(2) - (2)].lval).obj; - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ - bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].lval).ident); /* a, a, i */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a */ - bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).ident); /* a, i, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); - bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); - bufferWriteSetRegister((yyval.action), 0); - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a.i = a.i+1 */ - bufferWriteRegister((yyval.action), 0); /* a.i+1 */ - } - else // expr [ expr ] - { - (yyval.action) = (yyvsp[(2) - (2)].lval).memexpr; /* i */ - bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).obj); /* i, a */ - bufferWriteSetRegister((yyval.action), 0); /* ($2.memexpr can use reg0) */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); /* a, i, a[i]+1 */ - bufferWriteSetRegister((yyval.action), 0); - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ - bufferWriteRegister((yyval.action), 0); /* a[i]+1 */ - } - } - else // identifier - { - (yyval.action) = newBuffer(); - bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].lval).ident); - bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); - bufferWriteOp((yyval.action), SWFACTION_DUP); - bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).ident); - bufferWriteOp((yyval.action), SWFACTION_SWAP); - bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); - } - ;} - break; - - case 250: -#line 1285 "swf5compiler.y" - { if((yyvsp[(1) - (2)].lval).obj) - { - if((yyvsp[(1) - (2)].lval).ident) - { - (yyval.action) = (yyvsp[(1) - (2)].lval).obj; /* a */ - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ - bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].lval).ident); /* a, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, a.i */ - bufferWriteSetRegister((yyval.action), 0); - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a.i, a */ - bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).ident); /* a.i, a, i */ - bufferWriteRegister((yyval.action), 0); /* a.i, a, i, a.i */ - bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); /* a.i, a, i, a.i+1 */ - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); - } - else - { - (yyval.action) = (yyvsp[(1) - (2)].lval).memexpr; - bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).obj); /* i, a */ - bufferWriteSetRegister((yyval.action), 0); - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferWriteSetRegister((yyval.action), 0); - bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); /* a, i, a[i]+1 */ - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); - bufferWriteRegister((yyval.action), 0); /* a[i] */ - } - } - else - { - (yyval.action) = newBuffer(); - bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].lval).ident); - bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteOp((yyval.action), SWFACTION_DUP); - bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); - bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).ident); - bufferWriteOp((yyval.action), SWFACTION_SWAP); - bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); - } - ;} - break; - - case 251: -#line 1330 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (3)].action); ;} - break; - - case 252: -#line 1333 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteInt((yyval.action), -(yyvsp[(2) - (2)].intVal)); ;} - break; - - case 253: -#line 1337 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteInt((yyval.action), (yyvsp[(1) - (1)].intVal)); ;} - break; - - case 254: -#line 1341 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteDouble((yyval.action), -(yyvsp[(2) - (2)].doubleVal)); ;} - break; - - case 255: -#line 1345 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteDouble((yyval.action), (yyvsp[(1) - (1)].doubleVal)); ;} - break; - - case 256: -#line 1349 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteBoolean((yyval.action), (yyvsp[(1) - (1)].intVal)); ;} - break; - - case 257: -#line 1353 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteNull((yyval.action)); ;} - break; - - case 258: -#line 1357 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - free((yyvsp[(1) - (1)].str)); ;} - break; - - case 260: -#line 1366 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (3)].action); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); ;} - break; - - case 261: -#line 1372 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (3)].str), strlen((yyvsp[(1) - (3)].str))+1); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_VAREQUALS); ;} - break; - - case 262: -#line 1378 "swf5compiler.y" - { (yyval.action) = newBuffer(); - bufferWriteString((yyval.action), (yyvsp[(1) - (1)].str), strlen((yyvsp[(1) - (1)].str))+1); - bufferWriteOp((yyval.action), SWFACTION_VAR); ;} - break; - - case 263: -#line 1385 "swf5compiler.y" - { asmBuffer = newBuffer(); ;} - break; - - case 264: -#line 1387 "swf5compiler.y" - { (yyval.action) = asmBuffer; ;} - break; - - case 265: -#line 1390 "swf5compiler.y" - { (yyval.action) = (yyvsp[(2) - (2)].action); ;} - break; - - case 267: -#line 1395 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (1)].action); - bufferWriteOp((yyval.action), SWFACTION_POP); ;} - break; - - case 268: -#line 1399 "swf5compiler.y" - { (yyval.action) = (yyvsp[(1) - (1)].action); - bufferWriteOp((yyval.action), SWFACTION_POP); ;} - break; - - case 269: -#line 1403 "swf5compiler.y" - { if((yyvsp[(2) - (2)].lval).obj) - { - if((yyvsp[(2) - (2)].lval).ident) - { - (yyval.action) = (yyvsp[(2) - (2)].lval).obj; /* a */ - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ - bufferWriteBuffer((yyval.action), (yyvsp[(2) - (2)].lval).ident); /* a, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, a.i */ - bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); /* a, a.i+1 */ - bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).ident); /* a, a.i+1, i */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a.i+1 */ - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a.i = a.i+1 */ - } - else - { - /* weird contortions so that $2.memexpr can use reg 0 */ - (yyval.action) = (yyvsp[(2) - (2)].lval).memexpr; /* i */ - bufferConcat((yyval.action), (yyvsp[(2) - (2)].lval).obj); /* i, a */ - bufferWriteSetRegister((yyval.action), 0); - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); /* a, i, a[i]+1 */ - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ - } - } - else - { - (yyval.action) = (yyvsp[(2) - (2)].lval).ident; - bufferWriteOp((yyval.action), SWFACTION_DUP); - bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteOp((yyval.action), (yyvsp[(1) - (2)].op)); - bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); - } - ;} - break; - - case 270: -#line 1442 "swf5compiler.y" - { if((yyvsp[(1) - (2)].lval).obj) - { - if((yyvsp[(1) - (2)].lval).ident) - { - (yyval.action) = (yyvsp[(1) - (2)].lval).obj; /* a */ - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ - bufferWriteBuffer((yyval.action), (yyvsp[(1) - (2)].lval).ident); /* a, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, a.i */ - bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); /* a, a.i+1 */ - bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).ident); /* a, a.i+1, i */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a.i+1 */ - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a.i = a.i+1 */ - } - else - { - /* weird contortions so that $1.memexpr can use reg 0 */ - (yyval.action) = (yyvsp[(1) - (2)].lval).memexpr; /* i */ - bufferConcat((yyval.action), (yyvsp[(1) - (2)].lval).obj); /* i, a */ - bufferWriteSetRegister((yyval.action), 0); - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); /* a, i, a[i]+1 */ - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ - } - } - else - { - (yyval.action) = (yyvsp[(1) - (2)].lval).ident; - bufferWriteOp((yyval.action), SWFACTION_DUP); - bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); - bufferWriteOp((yyval.action), (yyvsp[(2) - (2)].op)); - bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); - } - ;} - break; - - case 271: -#line 1481 "swf5compiler.y" - { if((yyvsp[(1) - (3)].lval).obj) - { - (yyval.action) = (yyvsp[(1) - (3)].lval).obj; - - if((yyvsp[(1) - (3)].lval).ident) - bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).ident); - else - bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).memexpr); - - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); - } - else - { - (yyval.action) = (yyvsp[(1) - (3)].lval).ident; - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); - } - ;} - break; - - case 272: -#line 1502 "swf5compiler.y" - { if((yyvsp[(1) - (3)].lval).obj) - { - if((yyvsp[(1) - (3)].lval).ident) - { - (yyval.action) = (yyvsp[(1) - (3)].lval).obj; /* a */ - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, a */ - bufferWriteBuffer((yyval.action), (yyvsp[(1) - (3)].lval).ident); /* a, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, a.i */ - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); /* a, a.i, v */ - bufferWriteOp((yyval.action), (yyvsp[(2) - (3)].op)); /* a, a.i+v */ - bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).ident); /* a, a.i+v, i */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a.i+v */ - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a.i = a.i+v */ - } - else - { - (yyval.action) = (yyvsp[(1) - (3)].lval).memexpr; /* i */ - bufferConcat((yyval.action), (yyvsp[(1) - (3)].lval).obj); /* i, a */ - bufferWriteSetRegister((yyval.action), 0); - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i */ - bufferWriteOp((yyval.action), SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister((yyval.action), 0); /* a, i, i, a */ - bufferWriteOp((yyval.action), SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp((yyval.action), SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); /* a, i, a[i], v */ - bufferWriteOp((yyval.action), (yyvsp[(2) - (3)].op)); /* a, i, a[i]+v */ - bufferWriteOp((yyval.action), SWFACTION_SETMEMBER); /* a[i] = a[i]+v */ - } - } - else - { - (yyval.action) = (yyvsp[(1) - (3)].lval).ident; - bufferWriteOp((yyval.action), SWFACTION_DUP); - bufferWriteOp((yyval.action), SWFACTION_GETVARIABLE); - bufferConcat((yyval.action), (yyvsp[(3) - (3)].action)); - bufferWriteOp((yyval.action), (yyvsp[(2) - (3)].op)); - bufferWriteOp((yyval.action), SWFACTION_SETVARIABLE); - } - ;} - break; - - case 274: -#line 1547 "swf5compiler.y" - { (yyval.len) = (yyvsp[(1) - (2)].len) + (yyvsp[(2) - (2)].len); ;} - break; - - case 275: -#line 1552 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_WITH); ;} - break; - - case 276: -#line 1554 "swf5compiler.y" - { (yyval.len) = (yyvsp[(2) - (4)].len) + (yyvsp[(3) - (4)].len); - bufferPatchLength(asmBuffer, (yyvsp[(3) - (4)].len)); ;} - break; - - case 277: -#line 1559 "swf5compiler.y" - { (yyval.len) = bufferWriteConstantString(asmBuffer,(byte*) (yyvsp[(1) - (1)].str), - strlen((yyvsp[(1) - (1)].str))+1); ;} - break; - - case 278: -#line 1562 "swf5compiler.y" - { bufferWriteU8(asmBuffer, PUSH_INT); - (yyval.len) = bufferWriteInt(asmBuffer, (yyvsp[(1) - (1)].intVal))+1; ;} - break; - - case 279: -#line 1565 "swf5compiler.y" - { bufferWriteU8(asmBuffer, PUSH_DOUBLE); - (yyval.len) = bufferWriteDouble(asmBuffer, (yyvsp[(1) - (1)].doubleVal))+1; ;} - break; - - case 280: -#line 1568 "swf5compiler.y" - { bufferWriteU8(asmBuffer, PUSH_BOOLEAN); - (yyval.len) = bufferWriteU8(asmBuffer, (yyvsp[(1) - (1)].intVal))+1; ;} - break; - - case 281: -#line 1571 "swf5compiler.y" - { (yyval.len) = bufferWriteU8(asmBuffer, PUSH_NULL); ;} - break; - - case 282: -#line 1573 "swf5compiler.y" - { bufferWriteU8(asmBuffer, PUSH_REGISTER); - (yyval.len) = bufferWriteU8(asmBuffer, - (char)atoi((yyvsp[(1) - (1)].str)))+1; ;} - break; - - case 283: -#line 1580 "swf5compiler.y" - { (yyval.len) = (yyvsp[(1) - (1)].len); ;} - break; - - case 284: -#line 1581 "swf5compiler.y" - { (yyval.len) += (yyvsp[(3) - (3)].len); ;} - break; - - case 285: -#line 1585 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_PUSHDATA); - (yyval.len) += bufferWriteS16(asmBuffer, 0); ;} - break; - - case 286: -#line 1588 "swf5compiler.y" - { (yyval.len) = (yyvsp[(2) - (3)].len) + (yyvsp[(3) - (3)].len); - bufferPatchLength(asmBuffer, (yyvsp[(3) - (3)].len)); ;} - break; - - case 288: -#line 1594 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_SETREGISTER); - (yyval.len) += bufferWriteS16(asmBuffer, 1); - (yyval.len) += bufferWriteU8(asmBuffer, - (char)atoi((yyvsp[(2) - (2)].str))); ;} - break; - - case 289: -#line 1600 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_CALLFUNCTION); ;} - break; - - case 290: -#line 1602 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_RETURN); ;} - break; - - case 291: -#line 1604 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_CALLMETHOD); ;} - break; - - case 292: -#line 1606 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_BITWISEAND); ;} - break; - - case 293: -#line 1608 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_BITWISEOR); ;} - break; - - case 294: -#line 1610 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_BITWISEXOR); ;} - break; - - case 295: -#line 1612 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_MODULO); ;} - break; - - case 296: -#line 1614 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_NEWADD); ;} - break; - - case 297: -#line 1616 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_NEWLESSTHAN); ;} - break; - - case 298: -#line 1618 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_NEWEQUALS); ;} - break; - - case 299: -#line 1620 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_INCREMENT); ;} - break; - - case 300: -#line 1622 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_DECREMENT); ;} - break; - - case 301: -#line 1624 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_TYPEOF); ;} - break; - - case 302: -#line 1626 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_INSTANCEOF); ;} - break; - - case 303: -#line 1628 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_ENUMERATE); ;} - break; - - case 304: -#line 1630 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_DELETE); ;} - break; - - case 305: -#line 1632 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_NEW); ;} - break; - - case 306: -#line 1634 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_INITARRAY); ;} - break; - - case 307: -#line 1636 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_INITOBJECT); ;} - break; - - case 308: -#line 1638 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_GETMEMBER); ;} - break; - - case 309: -#line 1640 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_SETMEMBER); ;} - break; - - case 310: -#line 1642 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_SHIFTLEFT); ;} - break; - - case 311: -#line 1644 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_SHIFTRIGHT); ;} - break; - - case 312: -#line 1646 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_SHIFTRIGHT2); ;} - break; - - case 313: -#line 1648 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_VAR); ;} - break; - - case 314: -#line 1650 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, - SWFACTION_VAREQUALS); ;} - break; - - case 315: -#line 1654 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_ADD); ;} - break; - - case 316: -#line 1655 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SUBTRACT); ;} - break; - - case 317: -#line 1656 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MULTIPLY); ;} - break; - - case 318: -#line 1657 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_DIVIDE); ;} - break; - - case 319: -#line 1658 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_EQUAL); ;} - break; - - case 320: -#line 1659 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_LESSTHAN); ;} - break; - - case 321: -#line 1660 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_LOGICALAND); ;} - break; - - case 322: -#line 1661 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_LOGICALOR); ;} - break; - - case 323: -#line 1662 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_LOGICALNOT); ;} - break; - - case 324: -#line 1663 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_STRINGEQ); ;} - break; - - case 325: -#line 1664 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_STRINGLENGTH); ;} - break; - - case 326: -#line 1665 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SUBSTRING); ;} - break; - - case 327: -#line 1666 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_INT); ;} - break; - - case 328: -#line 1667 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_DUP); ;} - break; - - case 329: -#line 1668 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SWAP); ;} - break; - - case 330: -#line 1669 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_POP); ;} - break; - - case 331: -#line 1670 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_GETVARIABLE); ;} - break; - - case 332: -#line 1671 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SETVARIABLE); ;} - break; - - case 333: -#line 1672 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_SETTARGETEXPRESSION); ;} - break; - - case 334: -#line 1673 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_STRINGCONCAT); ;} - break; - - case 335: -#line 1674 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_DUPLICATECLIP); ;} - break; - - case 336: -#line 1675 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_REMOVECLIP); ;} - break; - - case 337: -#line 1676 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_TRACE); ;} - break; - - case 338: -#line 1677 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_STRINGCOMPARE); ;} - break; - - case 339: -#line 1678 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_RANDOM); ;} - break; - - case 340: -#line 1679 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MBLENGTH); ;} - break; - - case 341: -#line 1680 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_ORD); ;} - break; - - case 342: -#line 1681 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_CHR); ;} - break; - - case 343: -#line 1682 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_GETTIMER); ;} - break; - - case 344: -#line 1683 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MBSUBSTRING); ;} - break; - - case 345: -#line 1684 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MBORD); ;} - break; - - case 346: -#line 1685 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_MBCHR); ;} - break; - - case 347: -#line 1688 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_BRANCHALWAYS); - (yyval.len) += bufferWriteS16(asmBuffer, 2); - (yyval.len) += bufferBranchTarget(asmBuffer, (yyvsp[(2) - (2)].str)); ;} - break; - - case 348: -#line 1692 "swf5compiler.y" - { (yyval.len) = bufferWriteOp(asmBuffer, SWFACTION_BRANCHIFTRUE); - (yyval.len) += bufferWriteS16(asmBuffer, 2); - (yyval.len) += bufferBranchTarget(asmBuffer, (yyvsp[(2) - (2)].str)); ;} - break; - - -/* Line 1267 of yacc.c. */ -#line 5479 "swf5compiler.tab.c" - default: break; - } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse look-ahead 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 look-ahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - if (yyn == YYFINAL) - YYACCEPT; - - *++yyvsp = yylval; - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} - - -#line 1697 "swf5compiler.y" - - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.tab.h b/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.tab.h deleted file mode 100644 index 389d16914..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.tab.h +++ /dev/null @@ -1,344 +0,0 @@ -/* A Bison parser, made by GNU Bison 2.3. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -/* 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. */ - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - BREAK = 258, - CONTINUE = 259, - FUNCTION = 260, - ELSE = 261, - SWITCH = 262, - CASE = 263, - DEFAULT = 264, - FOR = 265, - IN = 266, - IF = 267, - WHILE = 268, - DO = 269, - VAR = 270, - NEW = 271, - DELETE = 272, - RETURN = 273, - END = 274, - WITH = 275, - ASM = 276, - EVAL = 277, - RANDOM = 278, - GETTIMER = 279, - LENGTH = 280, - CONCAT = 281, - SUBSTR = 282, - TRACE = 283, - INT = 284, - ORD = 285, - CHR = 286, - GETURL = 287, - GETURL1 = 288, - NEXTFRAME = 289, - PREVFRAME = 290, - PLAY = 291, - STOP = 292, - TOGGLEQUALITY = 293, - STOPSOUNDS = 294, - DUP = 295, - SWAP = 296, - POP = 297, - PUSH = 298, - SETREGISTER = 299, - CALLFUNCTION = 300, - CALLMETHOD = 301, - AND = 302, - OR = 303, - XOR = 304, - MODULO = 305, - ADD = 306, - LESSTHAN = 307, - EQUALS = 308, - INC = 309, - DEC = 310, - TYPEOF = 311, - INSTANCEOF = 312, - ENUMERATE = 313, - INITOBJECT = 314, - INITARRAY = 315, - GETMEMBER = 316, - SETMEMBER = 317, - SHIFTLEFT = 318, - SHIFTRIGHT = 319, - SHIFTRIGHT2 = 320, - VAREQUALS = 321, - OLDADD = 322, - SUBTRACT = 323, - MULTIPLY = 324, - DIVIDE = 325, - OLDEQUALS = 326, - OLDLESSTHAN = 327, - LOGICALAND = 328, - LOGICALOR = 329, - NOT = 330, - STRINGEQ = 331, - STRINGLENGTH = 332, - SUBSTRING = 333, - GETVARIABLE = 334, - SETVARIABLE = 335, - SETTARGETEXPRESSION = 336, - DUPLICATEMOVIECLIP = 337, - REMOVEMOVIECLIP = 338, - STRINGLESSTHAN = 339, - MBLENGTH = 340, - MBSUBSTRING = 341, - MBORD = 342, - MBCHR = 343, - BRANCHALWAYS = 344, - BRANCHIFTRUE = 345, - GETURL2 = 346, - POST = 347, - GET = 348, - LOADVARIABLES = 349, - LOADMOVIE = 350, - LOADVARIABLESNUM = 351, - LOADMOVIENUM = 352, - CALLFRAME = 353, - STARTDRAG = 354, - STOPDRAG = 355, - GOTOFRAME = 356, - SETTARGET = 357, - NULLVAL = 358, - INTEGER = 359, - DOUBLE = 360, - BOOLEAN = 361, - REGISTER = 362, - STRING = 363, - IDENTIFIER = 364, - EQ = 365, - LE = 366, - GE = 367, - NE = 368, - LAN = 369, - LOR = 370, - INCR = 371, - DECR = 372, - IEQ = 373, - DEQ = 374, - MEQ = 375, - SEQ = 376, - REQ = 377, - AEQ = 378, - OEQ = 379, - SHL = 380, - SHR = 381, - SHR2 = 382, - SHLEQ = 383, - SHREQ = 384, - SHR2EQ = 385, - NOELSE = 386, - UMINUS = 388, - POSTFIX = 389 - }; -#endif -/* Tokens. */ -#define BREAK 258 -#define CONTINUE 259 -#define FUNCTION 260 -#define ELSE 261 -#define SWITCH 262 -#define CASE 263 -#define DEFAULT 264 -#define FOR 265 -#define IN 266 -#define IF 267 -#define WHILE 268 -#define DO 269 -#define VAR 270 -#define NEW 271 -#define DELETE 272 -#define RETURN 273 -#define END 274 -#define WITH 275 -#define ASM 276 -#define EVAL 277 -#define RANDOM 278 -#define GETTIMER 279 -#define LENGTH 280 -#define CONCAT 281 -#define SUBSTR 282 -#define TRACE 283 -#define INT 284 -#define ORD 285 -#define CHR 286 -#define GETURL 287 -#define GETURL1 288 -#define NEXTFRAME 289 -#define PREVFRAME 290 -#define PLAY 291 -#define STOP 292 -#define TOGGLEQUALITY 293 -#define STOPSOUNDS 294 -#define DUP 295 -#define SWAP 296 -#define POP 297 -#define PUSH 298 -#define SETREGISTER 299 -#define CALLFUNCTION 300 -#define CALLMETHOD 301 -#define AND 302 -#define OR 303 -#define XOR 304 -#define MODULO 305 -#define ADD 306 -#define LESSTHAN 307 -#define EQUALS 308 -#define INC 309 -#define DEC 310 -#define TYPEOF 311 -#define INSTANCEOF 312 -#define ENUMERATE 313 -#define INITOBJECT 314 -#define INITARRAY 315 -#define GETMEMBER 316 -#define SETMEMBER 317 -#define SHIFTLEFT 318 -#define SHIFTRIGHT 319 -#define SHIFTRIGHT2 320 -#define VAREQUALS 321 -#define OLDADD 322 -#define SUBTRACT 323 -#define MULTIPLY 324 -#define DIVIDE 325 -#define OLDEQUALS 326 -#define OLDLESSTHAN 327 -#define LOGICALAND 328 -#define LOGICALOR 329 -#define NOT 330 -#define STRINGEQ 331 -#define STRINGLENGTH 332 -#define SUBSTRING 333 -#define GETVARIABLE 334 -#define SETVARIABLE 335 -#define SETTARGETEXPRESSION 336 -#define DUPLICATEMOVIECLIP 337 -#define REMOVEMOVIECLIP 338 -#define STRINGLESSTHAN 339 -#define MBLENGTH 340 -#define MBSUBSTRING 341 -#define MBORD 342 -#define MBCHR 343 -#define BRANCHALWAYS 344 -#define BRANCHIFTRUE 345 -#define GETURL2 346 -#define POST 347 -#define GET 348 -#define LOADVARIABLES 349 -#define LOADMOVIE 350 -#define LOADVARIABLESNUM 351 -#define LOADMOVIENUM 352 -#define CALLFRAME 353 -#define STARTDRAG 354 -#define STOPDRAG 355 -#define GOTOFRAME 356 -#define SETTARGET 357 -#define NULLVAL 358 -#define INTEGER 359 -#define DOUBLE 360 -#define BOOLEAN 361 -#define REGISTER 362 -#define STRING 363 -#define IDENTIFIER 364 -#define EQ 365 -#define LE 366 -#define GE 367 -#define NE 368 -#define LAN 369 -#define LOR 370 -#define INCR 371 -#define DECR 372 -#define IEQ 373 -#define DEQ 374 -#define MEQ 375 -#define SEQ 376 -#define REQ 377 -#define AEQ 378 -#define OEQ 379 -#define SHL 380 -#define SHR 381 -#define SHR2 382 -#define SHLEQ 383 -#define SHREQ 384 -#define SHR2EQ 385 -#define NOELSE 386 -#define UMINUS 388 -#define POSTFIX 389 - - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 21 "swf5compiler.y" -{ - Buffer action; - char *str; - SWFGetUrl2Method getURLMethod; - int op; - int intVal; - int len; - double doubleVal; - - struct - { - Buffer buffer; - int count; - } exprlist; - struct switchcase switchcase; - struct switchcases switchcases; - struct - { - Buffer obj, ident, memexpr; - } lval; -} -/* Line 1489 of yacc.c. */ -#line 337 "swf5compiler.tab.h" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif - -extern YYSTYPE swf5lval; - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.y b/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.y deleted file mode 100644 index ed3b94f9e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/action/swf5compiler.y +++ /dev/null @@ -1,1698 +0,0 @@ -/* $Id: swf5compiler.y,v 1.2 2008/10/28 13:05:13 kramm Exp $ */ - -%start program - -%{ - -#include -#include -#include -#include "compile.h" -#include "action.h" -#include "assembler.h" - -#define YYPARSE_PARAM buffer - -Buffer bf, bc; - -%} - -%union -{ - Buffer action; - char *str; - SWFGetUrl2Method getURLMethod; - int op; - int intVal; - int len; - double doubleVal; - - struct - { - Buffer buffer; - int count; - } exprlist; - struct switchcase switchcase; - struct switchcases switchcases; - struct - { - Buffer obj, ident, memexpr; - } lval; -} - -/* tokens etc. */ - -%token BREAK CONTINUE FUNCTION ELSE SWITCH CASE DEFAULT FOR IN IF WHILE -%token DO VAR NEW DELETE RETURN END WITH ASM EVAL - -%token RANDOM GETTIMER LENGTH CONCAT SUBSTR TRACE INT ORD CHR GETURL -%token GETURL1 NEXTFRAME PREVFRAME PLAY STOP TOGGLEQUALITY STOPSOUNDS - -%token DUP SWAP POP PUSH SETREGISTER CALLFUNCTION CALLMETHOD -%token AND OR XOR MODULO ADD LESSTHAN EQUALS -%token INC DEC TYPEOF INSTANCEOF ENUMERATE INITOBJECT INITARRAY GETMEMBER -%token SETMEMBER SHIFTLEFT SHIFTRIGHT SHIFTRIGHT2 VAREQUALS OLDADD SUBTRACT -%token MULTIPLY DIVIDE OLDEQUALS OLDLESSTHAN LOGICALAND LOGICALOR NOT -%token STRINGEQ STRINGLENGTH SUBSTRING GETVARIABLE SETVARIABLE -%token SETTARGETEXPRESSION DUPLICATEMOVIECLIP REMOVEMOVIECLIP -%token STRINGLESSTHAN MBLENGTH MBSUBSTRING MBORD MBCHR -%token BRANCHALWAYS BRANCHIFTRUE GETURL2 POST GET -%token LOADVARIABLES LOADMOVIE LOADVARIABLESNUM LOADMOVIENUM -%token CALLFRAME STARTDRAG STOPDRAG GOTOFRAME SETTARGET - -%token NULLVAL -%token INTEGER -%token DOUBLE -%token BOOLEAN -%token REGISTER - -/* these two are strdup'ed in compiler.flex, so free them up here */ -%token STRING -%token IDENTIFIER - -%token EQ "==" -%token LE "<=" -%token GE ">=" -%token NE "!=" -%token LAN "&&" -%token LOR "||" -%token INCR "++" -%token DECR "--" -%token IEQ "+=" -%token DEQ "/=" -%token MEQ "*=" -%token SEQ "-=" -%token REQ "%=" -%token AEQ "&=" -%token OEQ "|=" - -%token SHL "<<" -%token SHR ">>" -%token SHR2 ">>>" -%token SHLEQ "<<=" -%token SHREQ ">>=" -%token SHR2EQ ">>>=" - - -/* ascending order of ops ..? */ - -%nonassoc NOELSE -%nonassoc ELSE -%left ',' -%right '=' "*=" "/=" "%=" "+=" "-=" "&=" "|=" "^=" ">>=" ">>>=" "<<=" -%right '?' ':' -%left "&&" "||" -%left "==" "!=" -%left '<' '>' "<=" ">=" -%left '&' '|' '^' -%left "<<" ">>" ">>>" -%left '+' '-' -%left '*' '/' '%' -%nonassoc "++" "--" -%right '!' '~' UMINUS -%right POSTFIX -%right TYPEOF -%nonassoc INSTANCEOF -%left '.' '[' ']' - - -%type program code -%type stmt stmts -%type if_stmt iter_stmt cont_stmt break_stmt return_stmt -%type with_stmt -%type switch_stmt -%type anon_function_decl function_decl anycode -%type void_function_call function_call method_call -%type assign_stmt assign_stmts assign_stmts_opt -%type expr expr_or_obj objexpr expr_opt obj_ref -%type emptybraces level init_vars init_var primary lvalue_expr -%type lvalue - -%type expr_list objexpr_list formals_list - -%type switch_case -%type switch_cases - -%type assignop incdecop -%type urlmethod - -%type identifier - -%type opcode opcode_list push_item with push_list - -/* -%type integer -%type double -*/ -%% - -/* rules */ - -program - : { bf = newBuffer(); - bc = newBuffer(); - } code - { Buffer b = newBuffer(); - bufferWriteConstants(b); - bufferConcat(b, bf); - bufferConcat(b, bc); - *((Buffer *)buffer) = b; } - | /* nothing */ { Buffer b = newBuffer(); *((Buffer *)buffer) = b; } - ; - -code - : anycode - | code anycode - ; - -anycode - : stmt - { bufferConcat(bc, $1); } - | function_decl - { bufferConcat(bf, $1); } - ; - -stmts - : stmt - { $$ = $1; } - - | stmts stmt - { $$ = $1; - bufferConcat($$, $2); } - ; - -emptybraces - : '{' '}' { } - ; - -stmt - : emptybraces { $$ = NULL; } - | '{' stmts '}' { $$ = $2; } - | ';' { $$ = NULL; } - | assign_stmt ';' { $$ = $1; } - | if_stmt - | iter_stmt - | cont_stmt - | break_stmt - | switch_stmt - | return_stmt - | with_stmt - ; - -with_stmt - : WITH '(' expr ')' '{' stmts '}' - { $$ = $3; - bufferWriteOp($$, SWFACTION_WITH); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($6)); - bufferConcat($$, $6); } - ; - -// only possible if there is an active CTX_FUNCTION -// in some contexts, may have to pop a few values ... -return_stmt - : RETURN ';' - { int tmp = chkctx(CTX_FUNCTION); - if(tmp < 0) - swf5error("return outside function"); - $$ = newBuffer(); - while(--tmp >= 0) - bufferWriteOp($$, SWFACTION_POP); - bufferWriteNull($$); - bufferWriteOp($$, SWFACTION_RETURN); } - - | RETURN expr_or_obj ';' - { int tmp = chkctx(CTX_FUNCTION); - if(tmp < 0) - swf5error("return outside function"); - $$ = newBuffer(); - while(--tmp >= 0) - bufferWriteOp($$, SWFACTION_POP); - bufferConcat($$, $2); - bufferWriteOp($$, SWFACTION_RETURN); } - ; - -assign_stmts - : assign_stmt - | assign_stmts ',' assign_stmt { bufferConcat($1, $3); } - ; - -if_stmt - : IF '(' expr ')' stmt ELSE stmt - { $$ = $3; - bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($7)+5); - bufferConcat($$, $7); - bufferWriteOp($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($5)); - bufferConcat($$, $5); } - - | IF '(' expr ')' stmt %prec NOELSE - { $$ = $3; - bufferWriteOp($$, SWFACTION_LOGICALNOT); - bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($5)); - bufferConcat($$, $5); } - ; - -expr_opt - : /* empty */ { $$ = NULL; } - | expr { $$ = $1; } - ; - -switch_init - : SWITCH - { addctx(CTX_SWITCH); } - ; - -switch_stmt - : switch_init '(' expr ')' '{' - switch_cases '}' - { $$ = $3; - bufferResolveSwitch($$, &$6); - bufferResolveJumps($$); - bufferWriteOp($$, SWFACTION_POP); - delctx(CTX_SWITCH); - /* FIXME: continue in switch continues surrounding loop, if any */ - } - ; - -/* XXX */ -switch_cases - : /* empty */ - { $$.count = 0; - $$.list = 0; } - - | switch_cases switch_case - { $$ = $1; - $$.list = (struct switchcase*) realloc($$.list, ($$.count+1) * sizeof(struct switchcase)); - $$.list[$$.count] = $2; - $$.count++; } - ; - -switch_case - : CASE expr ':' stmts BREAK ';' - { $$.cond = $2; - $$.action = $4; - $$.isbreak = 1; } - - | CASE expr ':' stmts - { $$.cond = $2; - $$.action = $4; - $$.isbreak = 0; } - - | DEFAULT ':' stmts - { $$.cond = NULL; - $$.action = $3; - $$.isbreak = 0; } - ; - - -/* there's GOT to be a better way than this.. */ - -identifier - : IDENTIFIER - | NEW { $$ = strdup("new"); } - | DELETE { $$ = strdup("delete"); } - | RANDOM { $$ = strdup("random"); } - | GETTIMER { $$ = strdup("getTimer"); } - | LENGTH { $$ = strdup("length"); } - | CONCAT { $$ = strdup("concat"); } - | SUBSTR { $$ = strdup("substr"); } - | TRACE { $$ = strdup("trace"); } - | INT { $$ = strdup("int"); } - | ORD { $$ = strdup("ord"); } - | CHR { $$ = strdup("chr"); } - | GETURL { $$ = strdup("getURL"); } - | GETURL1 { $$ = strdup("getURL1"); } - | NEXTFRAME { $$ = strdup("nextFrame"); } - | PREVFRAME { $$ = strdup("prevFrame"); } - | PLAY { $$ = strdup("play"); } - | STOP { $$ = strdup("stop"); } - | TOGGLEQUALITY { $$ = strdup("toggleQuality"); } - | STOPSOUNDS { $$ = strdup("stopSounds"); } - | DUP { $$ = strdup("dup"); } - | SWAP { $$ = strdup("swap"); } - | POP { $$ = strdup("pop"); } - | PUSH { $$ = strdup("push"); } - | SETREGISTER { $$ = strdup("setRegister"); } - | CALLFUNCTION { $$ = strdup("callFunction"); } - | CALLMETHOD { $$ = strdup("callMethod"); } - | AND { $$ = strdup("and"); } - | OR { $$ = strdup("or"); } - | XOR { $$ = strdup("xor"); } - | MODULO { $$ = strdup("modulo"); } - | ADD { $$ = strdup("add"); } - | LESSTHAN { $$ = strdup("lessThan"); } - | EQUALS { $$ = strdup("equals"); } - | INC { $$ = strdup("inc"); } - | DEC { $$ = strdup("dec"); } - | TYPEOF { $$ = strdup("typeof"); } - | INSTANCEOF { $$ = strdup("instanceof"); } - | ENUMERATE { $$ = strdup("enumerate"); } - | INITOBJECT { $$ = strdup("initobject"); } - | INITARRAY { $$ = strdup("initarray"); } - | GETMEMBER { $$ = strdup("getmember"); } - | SETMEMBER { $$ = strdup("setmember"); } - | SHIFTLEFT { $$ = strdup("shiftleft"); } - | SHIFTRIGHT { $$ = strdup("shiftright"); } - | SHIFTRIGHT2 { $$ = strdup("shiftright2"); } - | VAREQUALS { $$ = strdup("varequals"); } - | OLDADD { $$ = strdup("oldAdd"); } - | SUBTRACT { $$ = strdup("subtract"); } - | MULTIPLY { $$ = strdup("multiply"); } - | DIVIDE { $$ = strdup("divide"); } - | OLDEQUALS { $$ = strdup("oldequals"); } - | OLDLESSTHAN { $$ = strdup("oldlessthan"); } - | LOGICALAND { $$ = strdup("logicaland"); } - | LOGICALOR { $$ = strdup("logicalor"); } - | NOT { $$ = strdup("not"); } - | STRINGEQ { $$ = strdup("stringeq"); } - | STRINGLENGTH { $$ = strdup("stringlength"); } - | SUBSTRING { $$ = strdup("substring"); } - | GETVARIABLE { $$ = strdup("getvariable"); } - | SETVARIABLE { $$ = strdup("setvariable"); } - | SETTARGETEXPRESSION { $$ = strdup("settargetexpression"); } - | DUPLICATEMOVIECLIP { $$ = strdup("duplicatemovieclip"); } - | REMOVEMOVIECLIP { $$ = strdup("removemovieclip"); } - | STARTDRAG { $$ = strdup("startdrag"); } - | STOPDRAG { $$ = strdup("stopdrag"); } - | STRINGLESSTHAN { $$ = strdup("stringlessthan"); } - | MBLENGTH { $$ = strdup("mblength"); } - | MBSUBSTRING { $$ = strdup("mbsubstring"); } - | MBORD { $$ = strdup("mbord"); } - | MBCHR { $$ = strdup("mbchr"); } - | BRANCHALWAYS { $$ = strdup("branchalways"); } - | BRANCHIFTRUE { $$ = strdup("branchiftrue"); } - | GETURL2 { $$ = strdup("getURL2"); } - | POST { $$ = strdup("post"); } - | GET { $$ = strdup("get"); } - | LOADVARIABLES { $$ = strdup("loadvariables"); } - | LOADMOVIE { $$ = strdup("loadMovie"); } - ; - -formals_list - : /* empty */ - { $$.buffer = newBuffer(); - $$.count = 0; } - - | identifier - { $$.buffer = newBuffer(); - bufferWriteHardString($$.buffer, (byte*)$1, strlen($1)+1); - $$.count = 1; } - - | formals_list ',' identifier - { $$ = $1; - bufferWriteHardString($$.buffer, (byte*)$3, strlen($3)+1); - ++$$.count; } - ; - -function_init - : FUNCTION - { addctx(CTX_FUNCTION); } - ; - -function_decl - : function_init identifier '(' formals_list ')' stmt - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_DEFINEFUNCTION); - bufferWriteS16($$, strlen($2) + - bufferLength($4.buffer) + 5); - bufferWriteHardString($$, (byte*) $2, strlen($2)+1); - bufferWriteS16($$, $4.count); - bufferConcat($$, $4.buffer); - bufferWriteS16($$, bufferLength($6)); - bufferConcat($$, $6); - delctx(CTX_FUNCTION); } - ; - -obj_ref - : identifier - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - free($1); } - - | expr '.' identifier - { $$ = $1; - bufferWriteString($$, $3, strlen($3)+1); - bufferWriteOp($$, SWFACTION_GETMEMBER); - free($3); } - - | expr '[' expr ']' - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_GETMEMBER); } - - | function_call - - | method_call - ; - -while_init - : WHILE - { addctx(CTX_LOOP); } - ; - -do_init - : DO - { addctx(CTX_LOOP); } - ; - -for_init - : /* empty */ - { addctx(CTX_LOOP); } - ; - -for_in_init - : /* empty */ - { addctx(CTX_FOR_IN); } - ; - -iter_stmt - : while_init '(' expr ')' stmt - { $$ = $3; - bufferWriteOp($$, SWFACTION_LOGICALNOT); - bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($5)+5); - bufferConcat($$, $5); - bufferWriteOp($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, -(bufferLength($$)+2)); - bufferResolveJumps($$); - delctx(CTX_LOOP); } - - | do_init stmt WHILE '(' expr ')' - { if($2) - { $$ = $2; - bufferConcat($$, $5); - } - else - $$ = $5; - bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($$, 2); - bufferWriteS16($$, -(bufferLength($$)+2)); - bufferResolveJumps($$); - delctx(CTX_LOOP); } - - | FOR '(' assign_stmts_opt ';' expr_opt ';' assign_stmts_opt ')' for_init stmt - { - if($3) - $$ = $3; - else - $$ = newBuffer(); - - if($7) - { - bufferWriteOp($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($7)); - } - else - $7 = newBuffer(); - - if($5) - { - bufferConcat($7, $5); - bufferWriteOp($7, SWFACTION_LOGICALNOT); - bufferWriteOp($7, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($7, 2); - bufferWriteS16($7, bufferLength($10)+5); - } - - bufferConcat($7, $10); - bufferWriteOp($7, SWFACTION_BRANCHALWAYS); - bufferWriteS16($7, 2); - bufferWriteS16($7, -(bufferLength($7)+2)); - bufferResolveJumps($7); - - bufferConcat($$, $7); - delctx(CTX_LOOP); - } - - | FOR '(' identifier IN obj_ref ')' for_in_init stmt - { Buffer b2, b3; - int tmp; - - $$ = $5; - bufferWriteOp($$, SWFACTION_ENUMERATE); - - b2 = newBuffer(); - bufferWriteSetRegister(b2, 0); - bufferWriteOp(b2, SWFACTION_PUSHDATA); - bufferWriteS16(b2, 1); - bufferWriteU8(b2, 2); - bufferWriteOp(b2, SWFACTION_NEWEQUALS); - bufferWriteOp(b2, SWFACTION_BRANCHIFTRUE); - bufferWriteS16(b2, 2); - - b3 = newBuffer(); -/* basically a lvalue could be used here rather than an ident !!! */ -/* probably by using reg1 for the test rather than reg0 */ - bufferWriteString(b3, $3, strlen($3)+1); - bufferWriteRegister(b3, 0); - bufferWriteOp(b3, SWFACTION_SETVARIABLE); - bufferConcat(b3, $8); - bufferWriteS16(b2, bufferLength(b3) + 5); - tmp = bufferLength(b2) + bufferLength(b3) + 5; - bufferConcat($$, b2); - bufferWriteOp(b3, SWFACTION_BRANCHALWAYS); - bufferWriteS16(b3, 2); - bufferWriteS16(b3, -tmp); - bufferResolveJumps(b3); - bufferConcat($$, b3); - delctx(CTX_FOR_IN); } - - | FOR '(' VAR identifier IN obj_ref ')' for_in_init stmt - { Buffer b2, b3; - int tmp; - - $$ = $6; - bufferWriteOp($$, SWFACTION_ENUMERATE); - - b2 = newBuffer(); - bufferWriteSetRegister(b2, 0); - bufferWriteOp(b2, SWFACTION_PUSHDATA); - bufferWriteS16(b2, 1); - bufferWriteU8(b2, 2); - bufferWriteOp(b2, SWFACTION_NEWEQUALS); - bufferWriteOp(b2, SWFACTION_BRANCHIFTRUE); - bufferWriteS16(b2, 2); - // add size later - - b3 = newBuffer(); - bufferWriteString(b3, $4, strlen($4)+1); - bufferWriteRegister(b3, 0); - bufferWriteOp(b3, SWFACTION_VAREQUALS); - bufferConcat(b3, $9); - bufferWriteS16(b2, bufferLength(b3) + 5); - tmp = bufferLength(b2) + bufferLength(b3) + 5; - bufferConcat($$, b2); - bufferWriteOp(b3, SWFACTION_BRANCHALWAYS); - bufferWriteS16(b3, 2); - bufferWriteS16(b3, -tmp); - bufferResolveJumps(b3); - bufferConcat($$, b3); - delctx(CTX_FOR_IN); } - ; - -assign_stmts_opt - : /* empty */ { $$ = NULL; } - | assign_stmts - ; - -// continue only makes sense if there is a CTX_LOOP or CTX_FOR_IN -// on the stack -cont_stmt - : CONTINUE ';' - { if(chkctx(CTX_CONTINUE) < 0) - swf5error("continue outside loop"); - $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, MAGIC_CONTINUE_NUMBER); } - ; - -// break is possible if there is a CTX_LOOP, CTX_FOR_IN or CTX_SWITCH -break_stmt - : BREAK ';' - { int tmp = chkctx(CTX_BREAK); - if(tmp < 0) - swf5error("break outside switch / loop"); - $$ = newBuffer(); - if(tmp) /* break out of a for .. in */ - bufferWriteOp($$, SWFACTION_POP); - bufferWriteOp($$, SWFACTION_BRANCHALWAYS); - bufferWriteS16($$, 2); - bufferWriteS16($$, MAGIC_BREAK_NUMBER); } - ; - -urlmethod - : /* empty */ { $$ = GETURL_METHOD_NOSEND; } - - | ',' GET { $$ = GETURL_METHOD_GET; } - - | ',' POST { $$ = GETURL_METHOD_POST; } - - | ',' STRING { if(strcmp($2, "GET") == 0) - $$ = GETURL_METHOD_GET; - else if(strcmp($2, "POST") == 0) - $$ = GETURL_METHOD_POST; } - ; - -level - : INTEGER - { char *lvlstring = (char*) malloc(12*sizeof(char)); - sprintf(lvlstring, "_level%d", $1); - $$ = newBuffer(); - bufferWriteString($$, lvlstring, strlen(lvlstring)+1); - free(lvlstring); } - - | expr - { $$ = newBuffer(); - bufferWriteString($$, "_level", 7); - bufferConcat($$, $1); - bufferWriteOp($$, SWFACTION_STRINGCONCAT); } - ; - -void_function_call - : IDENTIFIER '(' expr_list ')' - { $$ = $3.buffer; - bufferWriteInt($$, $3.count); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteOp($$, SWFACTION_CALLFUNCTION); - bufferWriteOp($$, SWFACTION_POP); - free($1); } - - | DELETE IDENTIFIER - { $$ = newBuffer(); - bufferWriteString($$, $2, strlen($2)+1); - free($2); - bufferWriteOp($$, SWFACTION_DELETE); } - - | DELETE lvalue_expr '.' IDENTIFIER - { $$ = $2; - // bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferWriteString($$, $4, strlen($4)+1); - free($4); - bufferWriteOp($$, SWFACTION_DELETEVAR); } - - | DELETE lvalue_expr '[' expr ']' - { $$ = $2; - // bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferConcat($$, $4); - // bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferWriteOp($$, SWFACTION_DELETEVAR); } - - | TRACE '(' expr_or_obj ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_TRACE); } - - | GETURL '(' expr ',' expr urlmethod ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteOp($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, $6); } - - | LOADVARIABLES '(' expr ',' expr urlmethod ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteOp($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, 0xc0+$6); } - - | LOADVARIABLESNUM '(' expr ',' level urlmethod ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteOp($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, 0x80+$6); } - - | LOADMOVIE '(' expr ',' expr urlmethod ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteOp($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, 0x40+$6); } - - | LOADMOVIENUM '(' expr ',' level urlmethod ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteOp($$, SWFACTION_GETURL2); - bufferWriteS16($$, 1); - bufferWriteU8($$, $6); } - - | CALLFRAME '(' expr ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_CALLFRAME); - bufferWriteS16($$, 0); } - - /* startDrag(target, lock, [left, right, top, bottom]) */ - | STARTDRAG '(' expr ',' expr ')' - { $$ = newBuffer(); - bufferWriteString($$, "0", 2); /* no constraint */ - bufferConcat($$, $5); - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_STARTDRAGMOVIE); } - - | STARTDRAG '(' expr ',' expr ',' expr ',' expr ',' expr ',' expr ')' - { $$ = newBuffer(); - bufferConcat($$, $7); - bufferConcat($$, $11); - bufferConcat($$, $9); - bufferConcat($$, $13); - bufferWriteString($$, "1", 2); /* has constraint */ - bufferConcat($$, $5); - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_STARTDRAGMOVIE); } - - | STOPDRAG '(' ')' /* no args */ - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_STOPDRAGMOVIE); } - - /* duplicateMovieClip(target, new, depth) */ - | DUPLICATEMOVIECLIP '(' expr ',' expr ',' expr ')' - { $$ = $3; - bufferConcat($$, $5); - bufferConcat($$, $7); - bufferWriteInt($$, 16384); /* magic number */ - bufferWriteOp($$, SWFACTION_ADD); - bufferWriteOp($$, SWFACTION_DUPLICATECLIP); } - - | REMOVEMOVIECLIP '(' expr ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_REMOVECLIP); } - - | GETURL1 '(' STRING ',' STRING ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_GETURL); - bufferWriteS16($$, strlen($3) + strlen($5) + 2); - bufferWriteHardString($$, (byte*)$3, strlen($3)); - bufferWriteU8($$, 0); - bufferWriteHardString($$, (byte*)$5, strlen($5)); - bufferWriteU8($$, 0); } - - /* v3 actions */ - | NEXTFRAME '(' ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_NEXTFRAME); } - - | PREVFRAME '(' ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_PREVFRAME); } - - | PLAY '(' ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_PLAY); } - - | STOP '(' ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_STOP); } - - | STOPSOUNDS '(' ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_STOPSOUNDS); } - - | TOGGLEQUALITY '(' ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_TOGGLEQUALITY); } - - | GOTOFRAME '(' INTEGER ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_GOTOFRAME); - bufferWriteS16($$, 2); - bufferWriteS16($$, $3); } - - | GOTOFRAME '(' STRING ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_GOTOLABEL); - bufferWriteS16($$, strlen($3)+1); - bufferWriteHardString($$, (byte*)$3, strlen($3)+1); - free($3); } - - | GOTOFRAME '(' expr ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_GOTOEXPRESSION); - bufferWriteS16($$, 1); - bufferWriteU8($$, 0); } /* XXX - and stop */ - - | SETTARGET '(' STRING ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_SETTARGET); - bufferWriteS16($$, strlen($3)+1); - bufferWriteHardString($$, (byte*)$3, strlen($3)+1); - free($3); } - - | SETTARGET '(' expr ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_SETTARGETEXPRESSION); } - - - ; - - -function_call - : IDENTIFIER '(' expr_list ')' - { $$ = $3.buffer; - bufferWriteInt($$, $3.count); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteOp($$, SWFACTION_CALLFUNCTION); - free($1); } - - | EVAL '(' expr ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_GETVARIABLE); } - - | GETTIMER '(' ')' - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_GETTIMER); } - - | RANDOM '(' expr ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_RANDOM); } - - | LENGTH '(' expr_or_obj ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_STRINGLENGTH); } - - | INT '(' expr ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_INT); } - - | ORD '(' expr ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_ORD); } - - | CHR '(' expr ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_CHR); } - - | CONCAT '(' expr ',' expr ')' - { $$ = $3; - bufferConcat($$, $5); - bufferWriteOp($$, SWFACTION_STRINGCONCAT); } - - | SUBSTRING '(' expr ',' expr ',' expr ')' - { $$ = $3; - bufferConcat($$, $5); - bufferConcat($$, $7); - bufferWriteOp($$, SWFACTION_SUBSTRING); } - - | TYPEOF '(' expr_or_obj ')' - { $$ = $3; - bufferWriteOp($$, SWFACTION_TYPEOF); } - - ; - - -expr_list - : /* empty */ - { $$.buffer = newBuffer(); - $$.count = 0; } - - | expr_or_obj - { $$.buffer = $1; - $$.count = 1; } - - /* goes backwards. rrgh. */ - | expr_list ',' expr_or_obj - { Buffer tmp = newBuffer(); - bufferConcat(tmp, $3); - bufferConcat(tmp, $$.buffer); - $$.buffer = tmp; - ++$$.count; } - ; - -anon_function_decl - : function_init '(' formals_list ')' stmt - { $$ = newBuffer(); - bufferWriteOp($$, SWFACTION_DEFINEFUNCTION); - bufferWriteS16($$, bufferLength($3.buffer) + 5); - bufferWriteU8($$, 0); /* empty function name */ - bufferWriteS16($$, $3.count); - bufferConcat($$, $3.buffer); - bufferWriteS16($$, bufferLength($5)); - bufferConcat($$, $5); - delctx(CTX_FUNCTION); } - ; - -method_call - : lvalue_expr '.' identifier '(' expr_list ')' - { $$ = $5.buffer; - bufferWriteInt($$, $5.count); - bufferConcat($$, $1); - bufferWriteString($$, $3, strlen($3)+1); - bufferWriteOp($$, SWFACTION_CALLMETHOD); - free($3); } - - | lvalue_expr '[' expr ']' '(' expr_list ')' - { $$ = $6.buffer; - bufferWriteInt($$, $6.count); - bufferConcat($$, $1); - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_CALLMETHOD); } - ; - -objexpr - : identifier ':' expr_or_obj - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferConcat($$, $3); } - ; - -objexpr_list - : objexpr - { $$.buffer = $1; - $$.count = 1; } - - | objexpr_list ',' objexpr - { bufferConcat($$.buffer, $3); - ++$$.count; } - ; - -assignop - : "+=" { $$ = SWFACTION_NEWADD; } - | "-=" { $$ = SWFACTION_SUBTRACT; } - | "*=" { $$ = SWFACTION_MULTIPLY; } - | "/=" { $$ = SWFACTION_DIVIDE; } - | "%=" { $$ = SWFACTION_MODULO; } - | "&=" { $$ = SWFACTION_BITWISEAND; } - | "|=" { $$ = SWFACTION_BITWISEOR; } - | "^=" { $$ = SWFACTION_BITWISEXOR; } - | "<<=" { $$ = SWFACTION_SHIFTLEFT; } - | ">>=" { $$ = SWFACTION_SHIFTRIGHT; } - | ">>>=" { $$ = SWFACTION_SHIFTRIGHT2; } - ; - -incdecop - : "++" { $$ = SWFACTION_INCREMENT; } - | "--" { $$ = SWFACTION_DECREMENT; } - ; - - -/* -integer - : '-' INTEGER %prec UMINUS { $$ = -$2; } - | INTEGER { $$ = $1; } - ; - -double - : '-' DOUBLE %prec UMINUS { $$ = -$2; } - | DOUBLE { $$ = $1; } - ; -*/ - -/* resolves an lvalue into a buffer */ -lvalue_expr - : lvalue - { if($1.obj) - { - $$ = $1.obj; - - if($1.ident) - bufferConcat($$, $1.ident); - else - bufferConcat($$, $1.memexpr); - - bufferWriteOp($$, SWFACTION_GETMEMBER); - } - else - { - $$ = $1.ident; - bufferWriteOp($$, SWFACTION_GETVARIABLE); - } - } - | function_call - | method_call - ; - -/* lvalue - things you can assign to */ -lvalue - : identifier - { $$.ident = newBuffer(); - bufferWriteString($$.ident, $1, strlen($1)+1); - free($1); - $$.obj = 0; - $$.memexpr = 0; } - - | lvalue_expr '.' identifier %prec '.' - { $$.obj = $1; - $$.ident = newBuffer(); - bufferWriteString($$.ident, $3, strlen($3)+1); - $$.memexpr = 0; } - - | lvalue_expr '[' expr ']' %prec '.' - { $$.obj = $1; - $$.memexpr = $3; - $$.ident = 0; } - ; - -/* these leave a value on the stack */ - -expr - : primary - - | '-' expr %prec UMINUS - { $$ = $2; - bufferWriteInt($2, -1); - bufferWriteOp($2, SWFACTION_MULTIPLY); } - - | '~' expr %prec UMINUS - { $$ = $2; - bufferWriteInt($2, 0xffffffff); - bufferWriteOp($2, SWFACTION_BITWISEXOR); } - - | '!' expr - { $$ = $2; - bufferWriteOp($2, SWFACTION_LOGICALNOT); } - - | expr "||" expr - { $$ = $1; - bufferWriteOp($$, SWFACTION_DUP); - bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($3)+1); - bufferWriteOp($$, SWFACTION_POP); - bufferConcat($$, $3); } - - | expr "&&" expr - { $$ = $1; - bufferWriteOp($$, SWFACTION_DUP); - bufferWriteOp($$, SWFACTION_LOGICALNOT); - bufferWriteOp($$, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($$, 2); - bufferWriteS16($$, bufferLength($3)+1); - bufferWriteOp($$, SWFACTION_POP); - bufferConcat($$, $3); } - - | expr '*' expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_MULTIPLY); } - - | expr '/' expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_DIVIDE); } - - | expr '%' expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_MODULO); } - - | expr '+' expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_NEWADD); } - - | expr '-' expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_SUBTRACT); } - - | expr '&' expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_BITWISEAND); } - - | expr '|' expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_BITWISEOR); } - - | expr '^' expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_BITWISEXOR); } - - | expr '<' expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_NEWLESSTHAN); } - - | expr '>' expr - { $$ = $3; - bufferConcat($$, $1); - bufferWriteOp($$, SWFACTION_NEWLESSTHAN); } - - | expr "<=" expr - { $$ = $3; - bufferConcat($$, $1); - bufferWriteOp($$, SWFACTION_NEWLESSTHAN); - bufferWriteOp($$, SWFACTION_LOGICALNOT); } - - | expr ">=" expr - { bufferConcat($1, $3); - bufferWriteOp($1, SWFACTION_NEWLESSTHAN); - bufferWriteOp($1, SWFACTION_LOGICALNOT); } - - | expr "==" expr - { bufferConcat($1, $3); - bufferWriteOp($1, SWFACTION_NEWEQUALS); } - - | expr "!=" expr - { bufferConcat($1, $3); - bufferWriteOp($1, SWFACTION_NEWEQUALS); - bufferWriteOp($1, SWFACTION_LOGICALNOT); } - - | expr "<<" expr - { bufferConcat($1, $3); - bufferWriteOp($1, SWFACTION_SHIFTLEFT); } - - | expr ">>" expr - { bufferConcat($1, $3); - bufferWriteOp($1, SWFACTION_SHIFTRIGHT); } - - | expr ">>>" expr - { bufferConcat($1, $3); - bufferWriteOp($1, SWFACTION_SHIFTRIGHT2); } - - | expr '?' expr ':' expr - { bufferWriteOp($1, SWFACTION_BRANCHIFTRUE); - bufferWriteS16($1, 2); - bufferWriteS16($1, bufferLength($5)+5); - bufferConcat($1, $5); - bufferWriteOp($1, SWFACTION_BRANCHALWAYS); - bufferWriteS16($1, 2); - bufferWriteS16($1, bufferLength($3)); - bufferConcat($1, $3); } - - | lvalue '=' expr_or_obj - { if($1.obj) /* obj[memexpr] or obj.ident */ - { - $$ = $1.obj; - - if($1.ident) - bufferConcat($$, $1.ident); - else - bufferConcat($$, $1.memexpr); - - bufferConcat($$, $3); - bufferWriteSetRegister($$, 0); - bufferWriteOp($$, SWFACTION_SETMEMBER); - bufferWriteRegister($$, 0); - } - else /* just ident */ - { - $$ = $3; - bufferWriteOp($$, SWFACTION_DUP); - bufferConcat($$, $1.ident); - bufferWriteOp($$, SWFACTION_SWAP); - bufferWriteOp($$, SWFACTION_SETVARIABLE); - } -/* tricky case missing here: lvalue ASSIGN expr */ -/* like in x = y += z; */ - } - - | expr INSTANCEOF lvalue_expr - { $$ = $1; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_INSTANCEOF); } - - ; - -expr_or_obj - : expr - - | NEW identifier - { $$ = newBuffer(); - bufferWriteInt($$, 0); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteOp($$, SWFACTION_NEW); } - - | NEW identifier '(' expr_list ')' - { $$ = $4.buffer; - bufferWriteInt($$, $4.count); - bufferWriteString($$, $2, strlen($2)+1); - bufferWriteOp($$, SWFACTION_NEW); } - - | '[' expr_list ']' - { $$ = $2.buffer; - bufferWriteInt($$, $2.count); - bufferWriteOp($$, SWFACTION_INITARRAY); } - - | emptybraces - { $$ = newBuffer(); - bufferWriteInt($$, 0); - bufferWriteOp($$, SWFACTION_INITOBJECT); } - - | '{' objexpr_list '}' - { $$ = $2.buffer; - bufferWriteInt($$, $2.count); - bufferWriteOp($$, SWFACTION_INITOBJECT); } - - ; - -primary - : function_call - - | anon_function_decl - - | method_call - - | lvalue_expr - - | incdecop lvalue %prec "++" - { if($2.obj) - { - if($2.ident) // expr . identifier - { - $$ = $2.obj; - bufferWriteOp($$, SWFACTION_DUP); /* a, a */ - bufferWriteBuffer($$, $2.ident); /* a, a, i */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a */ - bufferConcat($$, $2.ident); /* a, i, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); - bufferWriteOp($$, $1); - bufferWriteSetRegister($$, 0); - bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+1 */ - bufferWriteRegister($$, 0); /* a.i+1 */ - } - else // expr [ expr ] - { - $$ = $2.memexpr; /* i */ - bufferConcat($$, $2.obj); /* i, a */ - bufferWriteSetRegister($$, 0); /* ($2.memexpr can use reg0) */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ - bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister($$, 0); /* a, i, i, a */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferWriteOp($$, $1); /* a, i, a[i]+1 */ - bufferWriteSetRegister($$, 0); - bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ - bufferWriteRegister($$, 0); /* a[i]+1 */ - } - } - else // identifier - { - $$ = newBuffer(); - bufferWriteBuffer($$, $2.ident); - bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferWriteOp($$, $1); - bufferWriteOp($$, SWFACTION_DUP); - bufferConcat($$, $2.ident); - bufferWriteOp($$, SWFACTION_SWAP); - bufferWriteOp($$, SWFACTION_SETVARIABLE); - } - } - - | lvalue incdecop %prec POSTFIX - { if($1.obj) - { - if($1.ident) - { - $$ = $1.obj; /* a */ - bufferWriteOp($$, SWFACTION_DUP); /* a, a */ - bufferWriteBuffer($$, $1.ident); /* a, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ - bufferWriteSetRegister($$, 0); - bufferWriteOp($$, SWFACTION_SWAP); /* a.i, a */ - bufferConcat($$, $1.ident); /* a.i, a, i */ - bufferWriteRegister($$, 0); /* a.i, a, i, a.i */ - bufferWriteOp($$, $2); /* a.i, a, i, a.i+1 */ - bufferWriteOp($$, SWFACTION_SETMEMBER); - } - else - { - $$ = $1.memexpr; - bufferConcat($$, $1.obj); /* i, a */ - bufferWriteSetRegister($$, 0); - bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ - bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister($$, 0); /* a, i, i, a */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferWriteSetRegister($$, 0); - bufferWriteOp($$, $2); /* a, i, a[i]+1 */ - bufferWriteOp($$, SWFACTION_SETMEMBER); - bufferWriteRegister($$, 0); /* a[i] */ - } - } - else - { - $$ = newBuffer(); - bufferWriteBuffer($$, $1.ident); - bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferWriteOp($$, SWFACTION_DUP); - bufferWriteOp($$, $2); - bufferConcat($$, $1.ident); - bufferWriteOp($$, SWFACTION_SWAP); - bufferWriteOp($$, SWFACTION_SETVARIABLE); - } - } - - | '(' expr ')' - { $$ = $2; } - - | '-' INTEGER %prec UMINUS - { $$ = newBuffer(); - bufferWriteInt($$, -$2); } - - | INTEGER - { $$ = newBuffer(); - bufferWriteInt($$, $1); } - - | '-' DOUBLE %prec UMINUS - { $$ = newBuffer(); - bufferWriteDouble($$, -$2); } - - | DOUBLE - { $$ = newBuffer(); - bufferWriteDouble($$, $1); } - - | BOOLEAN - { $$ = newBuffer(); - bufferWriteBoolean($$, $1); } - - | NULLVAL - { $$ = newBuffer(); - bufferWriteNull($$); } - - | STRING - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - free($1); } - ; - -init_vars - : init_var - - | init_vars ',' init_var - { $$ = $1; - bufferConcat($$, $3); } - ; - -init_var - : identifier '=' expr_or_obj - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_VAREQUALS); } - - | identifier - { $$ = newBuffer(); - bufferWriteString($$, $1, strlen($1)+1); - bufferWriteOp($$, SWFACTION_VAR); } - ; - -assign_stmt - : ASM '{' - { asmBuffer = newBuffer(); } - opcode_list '}' - { $$ = asmBuffer; } - - | VAR init_vars - { $$ = $2; } - - | void_function_call - - | function_call - { $$ = $1; - bufferWriteOp($$, SWFACTION_POP); } - - | method_call - { $$ = $1; - bufferWriteOp($$, SWFACTION_POP); } - - | incdecop lvalue %prec INCR - { if($2.obj) - { - if($2.ident) - { - $$ = $2.obj; /* a */ - bufferWriteOp($$, SWFACTION_DUP); /* a, a */ - bufferWriteBuffer($$, $2.ident); /* a, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ - bufferWriteOp($$, $1); /* a, a.i+1 */ - bufferConcat($$, $2.ident); /* a, a.i+1, i */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a.i+1 */ - bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+1 */ - } - else - { - /* weird contortions so that $2.memexpr can use reg 0 */ - $$ = $2.memexpr; /* i */ - bufferConcat($$, $2.obj); /* i, a */ - bufferWriteSetRegister($$, 0); - bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ - bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister($$, 0); /* a, i, i, a */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferWriteOp($$, $1); /* a, i, a[i]+1 */ - bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ - } - } - else - { - $$ = $2.ident; - bufferWriteOp($$, SWFACTION_DUP); - bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferWriteOp($$, $1); - bufferWriteOp($$, SWFACTION_SETVARIABLE); - } - } - - | lvalue incdecop %prec POSTFIX - { if($1.obj) - { - if($1.ident) - { - $$ = $1.obj; /* a */ - bufferWriteOp($$, SWFACTION_DUP); /* a, a */ - bufferWriteBuffer($$, $1.ident); /* a, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ - bufferWriteOp($$, $2); /* a, a.i+1 */ - bufferConcat($$, $1.ident); /* a, a.i+1, i */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a.i+1 */ - bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+1 */ - } - else - { - /* weird contortions so that $1.memexpr can use reg 0 */ - $$ = $1.memexpr; /* i */ - bufferConcat($$, $1.obj); /* i, a */ - bufferWriteSetRegister($$, 0); - bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ - bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister($$, 0); /* a, i, i, a */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferWriteOp($$, $2); /* a, i, a[i]+1 */ - bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ - } - } - else - { - $$ = $1.ident; - bufferWriteOp($$, SWFACTION_DUP); - bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferWriteOp($$, $2); - bufferWriteOp($$, SWFACTION_SETVARIABLE); - } - } - - | lvalue '=' expr_or_obj - { if($1.obj) - { - $$ = $1.obj; - - if($1.ident) - bufferConcat($$, $1.ident); - else - bufferConcat($$, $1.memexpr); - - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_SETMEMBER); - } - else - { - $$ = $1.ident; - bufferConcat($$, $3); - bufferWriteOp($$, SWFACTION_SETVARIABLE); - } - } - - | lvalue assignop expr - { if($1.obj) - { - if($1.ident) - { - $$ = $1.obj; /* a */ - bufferWriteOp($$, SWFACTION_DUP); /* a, a */ - bufferWriteBuffer($$, $1.ident); /* a, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ - bufferConcat($$, $3); /* a, a.i, v */ - bufferWriteOp($$, $2); /* a, a.i+v */ - bufferConcat($$, $1.ident); /* a, a.i+v, i */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a.i+v */ - bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+v */ - } - else - { - $$ = $1.memexpr; /* i */ - bufferConcat($$, $1.obj); /* i, a */ - bufferWriteSetRegister($$, 0); - bufferWriteOp($$, SWFACTION_SWAP); /* a, i */ - bufferWriteOp($$, SWFACTION_DUP); /* a, i, i */ - bufferWriteRegister($$, 0); /* a, i, i, a */ - bufferWriteOp($$, SWFACTION_SWAP); /* a, i, a, i */ - bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ - bufferConcat($$, $3); /* a, i, a[i], v */ - bufferWriteOp($$, $2); /* a, i, a[i]+v */ - bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+v */ - } - } - else - { - $$ = $1.ident; - bufferWriteOp($$, SWFACTION_DUP); - bufferWriteOp($$, SWFACTION_GETVARIABLE); - bufferConcat($$, $3); - bufferWriteOp($$, $2); - bufferWriteOp($$, SWFACTION_SETVARIABLE); - } - } - ; - -/* assembler stuff */ - -opcode_list - : opcode - | opcode_list opcode { $$ = $1 + $2; } - ; - -with - : WITH - { $$ = bufferWriteOp(asmBuffer, - SWFACTION_WITH); } - opcode_list END { $$ = $2 + $3; - bufferPatchLength(asmBuffer, $3); } - ; - -push_item - : STRING { $$ = bufferWriteConstantString(asmBuffer,(byte*) $1, - strlen($1)+1); } - - | INTEGER { bufferWriteU8(asmBuffer, PUSH_INT); - $$ = bufferWriteInt(asmBuffer, $1)+1; } - - | DOUBLE { bufferWriteU8(asmBuffer, PUSH_DOUBLE); - $$ = bufferWriteDouble(asmBuffer, $1)+1; } - - | BOOLEAN { bufferWriteU8(asmBuffer, PUSH_BOOLEAN); - $$ = bufferWriteU8(asmBuffer, $1)+1; } - - | NULLVAL { $$ = bufferWriteU8(asmBuffer, PUSH_NULL); } - - | REGISTER { bufferWriteU8(asmBuffer, PUSH_REGISTER); - $$ = bufferWriteU8(asmBuffer, - (char)atoi($1))+1; } - ; - - -push_list - : push_item { $$ = $1; } - | push_list ',' push_item { $$ += $3; } - ; - -opcode - : PUSH { $$ = bufferWriteOp(asmBuffer, - SWFACTION_PUSHDATA); - $$ += bufferWriteS16(asmBuffer, 0); } - push_list { $$ = $2 + $3; - bufferPatchLength(asmBuffer, $3); } - - | with - - | SETREGISTER REGISTER - { $$ = bufferWriteOp(asmBuffer, - SWFACTION_SETREGISTER); - $$ += bufferWriteS16(asmBuffer, 1); - $$ += bufferWriteU8(asmBuffer, - (char)atoi($2)); } - /* no args */ - | CALLFUNCTION { $$ = bufferWriteOp(asmBuffer, - SWFACTION_CALLFUNCTION); } - | RETURN { $$ = bufferWriteOp(asmBuffer, - SWFACTION_RETURN); } - | CALLMETHOD { $$ = bufferWriteOp(asmBuffer, - SWFACTION_CALLMETHOD); } - | AND { $$ = bufferWriteOp(asmBuffer, - SWFACTION_BITWISEAND); } - | OR { $$ = bufferWriteOp(asmBuffer, - SWFACTION_BITWISEOR); } - | XOR { $$ = bufferWriteOp(asmBuffer, - SWFACTION_BITWISEXOR); } - | MODULO { $$ = bufferWriteOp(asmBuffer, - SWFACTION_MODULO); } - | ADD { $$ = bufferWriteOp(asmBuffer, - SWFACTION_NEWADD); } - | LESSTHAN { $$ = bufferWriteOp(asmBuffer, - SWFACTION_NEWLESSTHAN); } - | EQUALS { $$ = bufferWriteOp(asmBuffer, - SWFACTION_NEWEQUALS); } - | INC { $$ = bufferWriteOp(asmBuffer, - SWFACTION_INCREMENT); } - | DEC { $$ = bufferWriteOp(asmBuffer, - SWFACTION_DECREMENT); } - | TYPEOF { $$ = bufferWriteOp(asmBuffer, - SWFACTION_TYPEOF); } - | INSTANCEOF { $$ = bufferWriteOp(asmBuffer, - SWFACTION_INSTANCEOF); } - | ENUMERATE { $$ = bufferWriteOp(asmBuffer, - SWFACTION_ENUMERATE); } - | DELETE { $$ = bufferWriteOp(asmBuffer, - SWFACTION_DELETE); } - | NEW { $$ = bufferWriteOp(asmBuffer, - SWFACTION_NEW); } - | INITARRAY { $$ = bufferWriteOp(asmBuffer, - SWFACTION_INITARRAY); } - | INITOBJECT { $$ = bufferWriteOp(asmBuffer, - SWFACTION_INITOBJECT); } - | GETMEMBER { $$ = bufferWriteOp(asmBuffer, - SWFACTION_GETMEMBER); } - | SETMEMBER { $$ = bufferWriteOp(asmBuffer, - SWFACTION_SETMEMBER); } - | SHIFTLEFT { $$ = bufferWriteOp(asmBuffer, - SWFACTION_SHIFTLEFT); } - | SHIFTRIGHT { $$ = bufferWriteOp(asmBuffer, - SWFACTION_SHIFTRIGHT); } - | SHIFTRIGHT2 { $$ = bufferWriteOp(asmBuffer, - SWFACTION_SHIFTRIGHT2); } - | VAR { $$ = bufferWriteOp(asmBuffer, - SWFACTION_VAR); } - | VAREQUALS { $$ = bufferWriteOp(asmBuffer, - SWFACTION_VAREQUALS); } - - /* f4 ops */ - | OLDADD { $$ = bufferWriteOp(asmBuffer, SWFACTION_ADD); } - | SUBTRACT { $$ = bufferWriteOp(asmBuffer, SWFACTION_SUBTRACT); } - | MULTIPLY { $$ = bufferWriteOp(asmBuffer, SWFACTION_MULTIPLY); } - | DIVIDE { $$ = bufferWriteOp(asmBuffer, SWFACTION_DIVIDE); } - | OLDEQUALS { $$ = bufferWriteOp(asmBuffer, SWFACTION_EQUAL); } - | OLDLESSTHAN { $$ = bufferWriteOp(asmBuffer, SWFACTION_LESSTHAN); } - | LOGICALAND { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALAND); } - | LOGICALOR { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALOR); } - | NOT { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALNOT); } - | STRINGEQ { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGEQ); } - | STRINGLENGTH { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGLENGTH); } - | SUBSTRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_SUBSTRING); } - | INT { $$ = bufferWriteOp(asmBuffer, SWFACTION_INT); } - | DUP { $$ = bufferWriteOp(asmBuffer, SWFACTION_DUP); } - | SWAP { $$ = bufferWriteOp(asmBuffer, SWFACTION_SWAP); } - | POP { $$ = bufferWriteOp(asmBuffer, SWFACTION_POP); } - | GETVARIABLE { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETVARIABLE); } - | SETVARIABLE { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETVARIABLE); } - | SETTARGETEXPRESSION { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETTARGETEXPRESSION); } - | CONCAT { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGCONCAT); } - | DUPLICATEMOVIECLIP { $$ = bufferWriteOp(asmBuffer, SWFACTION_DUPLICATECLIP); } - | REMOVEMOVIECLIP { $$ = bufferWriteOp(asmBuffer, SWFACTION_REMOVECLIP); } - | TRACE { $$ = bufferWriteOp(asmBuffer, SWFACTION_TRACE); } - | STRINGLESSTHAN { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGCOMPARE); } - | RANDOM { $$ = bufferWriteOp(asmBuffer, SWFACTION_RANDOM); } - | MBLENGTH { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBLENGTH); } - | ORD { $$ = bufferWriteOp(asmBuffer, SWFACTION_ORD); } - | CHR { $$ = bufferWriteOp(asmBuffer, SWFACTION_CHR); } - | GETTIMER { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETTIMER); } - | MBSUBSTRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBSUBSTRING); } - | MBORD { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBORD); } - | MBCHR { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBCHR); } - - /* with args */ - | BRANCHALWAYS STRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_BRANCHALWAYS); - $$ += bufferWriteS16(asmBuffer, 2); - $$ += bufferBranchTarget(asmBuffer, $2); } - - | BRANCHIFTRUE STRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_BRANCHIFTRUE); - $$ += bufferWriteS16(asmBuffer, 2); - $$ += bufferBranchTarget(asmBuffer, $2); } - ; - -%% - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/args.h b/fluidbook/tools/swftools-special-swfdump/lib/args.h deleted file mode 100644 index c0350e4a0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/args.h +++ /dev/null @@ -1,250 +0,0 @@ -/* args.h - Routines to simplify argument handling - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __args_h__ -#define __args_h__ - -#ifndef NO_ARGPARSER - -extern int args_callback_option(char*,char*); -extern int args_callback_longoption(char*,char*); -extern int args_callback_command(char*,char*); -extern void args_callback_usage(char*name); - -//int argn; -//char**argv; - -static void processargs(int argn2,char**argv2) -{ - int t; - if(argn2==1) - { - args_callback_usage(argv2[0]); - exit(1); - } - for(t=1;t2) { - fprintf(stderr, "internal error in command line parsing\n"); - exit(1); - } - t+=num; - } - } -} - -struct options_t -{ - const char*shortoption; - const char*longoption; -}; - -static int args_long2shortoption(struct options_t*options, char*name, char*val) -{ - char*equal = strchr(name,'='); - if (equal) { - *equal = 0; - equal++; - } - while(options->shortoption) { - if(!strcmp(options->longoption, name)) { - char*tmp = (char*)malloc(strlen(options->shortoption) - +(equal?strlen(equal)+2:2)); - strcpy(tmp, options->shortoption); - if(equal) { - //strcpy(&tmp[strlen(tmp)], equal); - int ret = args_callback_option(tmp, equal); - if(!ret) { - fprintf(stderr, "Warning: Option --%s takes no parameter.\n", name); - } - return 0; - } - return args_callback_option(tmp,val); - } - options++; - } - fprintf(stderr, "Unknown option: --%s\n", name); - exit(1); -} - -#endif - -/* check whether the value t is in a given range. - examples: 3 is in range 1-10: true - 7 is in range 2-4,6,8-10: false - 9 is in range 1,2,3-12: true -*/ -static char is_in_range(int t, char*irange) -{ - char*pos = irange; - char*digits; - int num; - char range = 0; - int last=0; - char tmp; - - if(!irange) // no range resembles (-OO,OO) - return 1; - - while(*pos) - { - while(*pos == ' ' || *pos == '\r' || *pos == '\n' || *pos == '\t') - pos++; - - digits = pos; - while(*digits>='0' && *digits<='9') - digits++; - if(digits == pos) { - fprintf(stderr, "Error: \"%s\" is not a valid format (digit expected)\n",irange); - exit(1); - } - - tmp=*digits;*digits=0; - num = atoi(pos); - *digits=tmp; - pos = digits; - - while(*pos == ' ' || *pos == '\r' || *pos == '\n' || *pos == '\t') - pos++; - - if(range && last<=t && num>=t) - return 1; - if(range) { - range = 0; - if(*pos) - pos ++; - continue; - } - - if(*pos=='-') - { - if(range) { - fprintf(stderr, "Error: \"%s\" is not a valid format (too many '-'s)\n",irange); - exit(1); - } - last = num; - range = 1; - if(*pos) - pos ++; - continue; - } - else - { - /* if it isn't a '-', we assume it is a seperator like - ',', ';', ':', whatever. */ - if(t == num) - return 1; - if(*pos) - pos ++; - continue; - } - } - if(range && last<=t) - return 1; - return 0; -} - -static char* filename2template(char*filename, int*startindex) -{ - int l = strlen(filename); - char*newname = (char*)malloc(l+5); - /* first look whether the file is already numbered */ - while(1) { - l--; - if(l<0 || strchr("0123456789", filename[l])) - break; - }; - if(l>=0) { - int lastdigit=l; - int firstdigit=l; - while(firstdigit && strchr("0123456789", filename[firstdigit-1])) - firstdigit--; - *startindex = atoi(filename+firstdigit); - memcpy(newname, filename, firstdigit); - sprintf(newname+firstdigit, "%%%dd", lastdigit+1-firstdigit); - strcat(newname+firstdigit, filename+lastdigit+1); - return newname; - } - /* if it isn't, try to paste a %d between filename and extension */ - char*dot = strrchr(filename, '.'); - if(dot) { - int pos = dot-filename; - memcpy(newname, filename, pos); - newname[pos++] = '.'; - newname[pos++] = '%'; - newname[pos++] = 'd'; - strcpy(newname+pos, dot); - *startindex = 1; - return newname; - } - /* if that didn't work either, just append the number at the end */ - strcpy(newname, filename); - strcat(newname, ".%d"); - *startindex = 1; - return newname; -} - -#endif //__args_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.c deleted file mode 100644 index 171de47bf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.c +++ /dev/null @@ -1,1347 +0,0 @@ -/* abc.c - - Routines for handling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "../rfxswf.h" -#include "../q.h" -#include "abc.h" -#include "assets.h" - -char stringbuffer[2048]; - -int abc_RegisterNameSpace(abc_file_t*file, const char*name); -int abc_RegisterPackageNameSpace(abc_file_t*file, const char*name); -int abc_RegisterPackageInternalNameSpace(abc_file_t*file, const char*name); -int abc_RegisterProtectedNameSpace(abc_file_t*file, const char*name); -int abc_RegisterExplicitNameSpace(abc_file_t*file, const char*name); -int abc_RegisterStaticProtectedNameSpace(abc_file_t*file, const char*name); -int abc_RegisterPrivateNameSpace(abc_file_t*file, const char*name); - -/* TODO: switch to a datastructure with just values */ -#define NO_KEY "" - -static void params_dump(FILE*fo, multiname_list_t*l, constant_list_t*o) -{ - int n = list_length(l); - int no = list_length(o); - int i = 0; - - fprintf(fo, "("); - while(l) { - char*s = multiname_tostring(l->multiname); - fprintf(fo, "%s", s); - free(s); - if(i>=n-no) { - s = constant_tostring(o->constant); - fprintf(fo, " = "); - fprintf(fo, "%s", s); - free(s); - o = o->next; - } - - if(l->next) - fprintf(fo, ", "); - l = l->next;i++; - } - fprintf(fo, ")"); -} - -//#define DEBUG -#define DEBUG if(0) - -static void parse_metadata(TAG*tag, abc_file_t*file, pool_t*pool) -{ - int t; - int num_metadata = swf_GetU30(tag); - - DEBUG printf("%d metadata\n", num_metadata); - for(t=0;tmetadata, entry_name, items); - } -} - -void swf_CopyData(TAG*to, TAG*from, int len) -{ - unsigned char*data = malloc(len); - swf_GetBlock(from, data, len); - swf_SetBlock(to, data, len); - free(data); -} - -abc_file_t*abc_file_new() -{ - abc_file_t*f = malloc(sizeof(abc_file_t)); - memset(f, 0, sizeof(abc_file_t)); - f->metadata = array_new(); - - f->methods = array_new(); - f->classes = array_new(); - f->scripts = array_new(); - f->method_bodies = array_new(); - f->flags = ABCFILE_LAZY; - - return f; -} - -abc_class_t* abc_class_new(abc_file_t*file, multiname_t*classname, multiname_t*superclass) { - - NEW(abc_class_t,c); - if(file) - array_append(file->classes, NO_KEY, c); - - c->file = file; - c->classname = multiname_clone(classname); - c->superclass = multiname_clone(superclass); - c->flags = 0; - c->constructor = 0; - c->static_constructor = 0; - c->traits = list_new(); - return c; -} -abc_class_t* abc_class_new2(abc_file_t*pool, char*classname, char*superclass) -{ - return abc_class_new(pool, multiname_fromstring(classname), multiname_fromstring(superclass)); -} - -void abc_class_sealed(abc_class_t*c) -{ - c->flags |= CLASS_SEALED; -} -void abc_class_final(abc_class_t*c) -{ - c->flags |= CLASS_FINAL; -} -void abc_class_interface(abc_class_t*c) -{ - c->flags |= CLASS_INTERFACE; -} -void abc_class_protectedNS(abc_class_t*c, char*namespace) -{ - c->protectedNS = namespace_new_protected(namespace); - c->flags |= CLASS_PROTECTED_NS; -} -void abc_class_add_interface(abc_class_t*c, multiname_t*interface) -{ - list_append(c->interfaces, multiname_clone(interface)); -} -char*abc_class_fullname(abc_class_t*cls) -{ - const char*package = cls->classname->ns->name; - const char*name = cls->classname->name; - int l1 = strlen(package); - int l2 = strlen(name); - char*fullname = malloc(l1+l2+2); - if(l1) { - memcpy(fullname, package, l1); - fullname[l1++]='.'; - } - memcpy(fullname+l1, name, l2+1); - return fullname; -} - -void abc_method_init(abc_method_t*m, abc_file_t*file, multiname_t*returntype, char body) -{ - /* construct method object */ - m->index = array_length(file->methods); - array_append(file->methods, NO_KEY, m); - m->return_type = returntype; - - if(body) { - /* construct code (method body) object */ - NEW(abc_method_body_t,c); - array_append(file->method_bodies, NO_KEY, c); - c->index = array_length(file->method_bodies); - c->file = file; - c->traits = list_new(); - c->code = 0; - - /* crosslink the two objects */ - m->body = c; - c->method = m; - } -} -abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body) -{ - NEW(abc_method_t,m); - abc_method_init(m, file, returntype, body); - return m; -} - -abc_method_t* abc_class_getconstructor(abc_class_t*cls, multiname_t*returntype) -{ - if(cls->constructor) { - return cls->constructor; - } - abc_method_t* m = abc_method_new(cls->file, returntype, 1); - cls->constructor = m; - return m; -} - -abc_method_t* abc_class_getstaticconstructor(abc_class_t*cls, multiname_t*returntype) -{ - if(cls->static_constructor) { - return cls->static_constructor; - } - abc_method_t* m = abc_method_new(cls->file, returntype, 1); - cls->static_constructor = m; - return m; -} - -trait_t*trait_new(int type, multiname_t*name, int data1, int data2, constant_t*v) -{ - trait_t*trait = malloc(sizeof(trait_t)); - memset(trait, 0, sizeof(trait_t)); - trait->kind = type&0x0f; - trait->attributes = type&0xf0; - trait->name = name; - trait->data1 = data1; - trait->data2 = data2; - trait->value = v; - return trait; -} - -trait_t*trait_new_member(trait_list_t**traits, multiname_t*type, multiname_t*name,constant_t*v) -{ - int kind = TRAIT_SLOT; - trait_t*trait = malloc(sizeof(trait_t)); - memset(trait, 0, sizeof(trait_t)); - trait->kind = kind&0x0f; - trait->attributes = kind&0xf0; - trait->name = name; - trait->type_name = type; - - trait->slot_id = list_length(*traits)+1; - trait_list_t*l = *traits; - list_append_(traits, trait); - return trait; -} -trait_t*trait_new_method(trait_list_t**traits, multiname_t*name, abc_method_t*m) -{ - int type = TRAIT_METHOD; - trait_t*trait = malloc(sizeof(trait_t)); - memset(trait, 0, sizeof(trait_t)); - trait->kind = type&0x0f; - trait->attributes = type&0xf0; - trait->name = name; - trait->method = m; - - /* start assigning traits at position #1. - Weird things happen when assigning slot 0- slot 0 and 1 seem - to be identical */ - trait->slot_id = list_length(*traits)+1; - list_append_(traits, trait); - return trait; -} - -abc_method_t* abc_class_method(abc_class_t*cls, multiname_t*returntype, multiname_t*name) -{ - abc_file_t*file = cls->file; - abc_method_t* m = abc_method_new(cls->file, returntype, !(cls->flags&CLASS_INTERFACE)); - m->trait = trait_new_method(&cls->traits, multiname_clone(name), m); - return m; -} -abc_method_t* abc_class_staticmethod(abc_class_t*cls, multiname_t*returntype, multiname_t*name) -{ - abc_file_t*file = cls->file; - abc_method_t* m = abc_method_new(cls->file, returntype, !(cls->flags&CLASS_INTERFACE)); - m->trait = trait_new_method(&cls->static_traits, multiname_clone(name), m); - return m; -} - -trait_t* abc_class_slot(abc_class_t*cls, multiname_t*name, multiname_t*type) -{ - abc_file_t*file = cls->file; - multiname_t*m_name = multiname_clone(name); - multiname_t*m_type = multiname_clone(type); - trait_t*t = trait_new_member(&cls->traits, m_type, m_name, 0); - return t; -} -trait_t* abc_class_staticslot(abc_class_t*cls, multiname_t*name, multiname_t*type) -{ - abc_file_t*file = cls->file; - multiname_t*m_name = multiname_clone(name); - multiname_t*m_type = multiname_clone(type); - trait_t*t = trait_new_member(&cls->static_traits, m_type, m_name, 0); - return t; -} - - -trait_t* traits_find_slotid(trait_list_t*traits, int slotid) -{ - trait_list_t*l; - trait_t*t=0; - for(l=traits;l;l=l->next) { - if(l->trait->slot_id==slotid) { - t=l->trait; - break; - } - } - return t; -} - -void abc_method_body_addClassTrait(abc_method_body_t*code, char*multiname, int slotid, abc_class_t*cls) -{ - abc_file_t*file = code->file; - multiname_t*m = multiname_fromstring(multiname); - trait_t*trait = trait_new(TRAIT_CLASS, m, slotid, 0, 0); - trait->cls = cls; - list_append(code->traits, trait); -} - -/* notice: traits of a method (body) belonging to an init script - and traits of the init script are *not* the same thing */ -trait_t* abc_initscript_addClassTrait(abc_script_t*script, multiname_t*multiname, abc_class_t*cls) -{ - abc_file_t*file = script->file; - multiname_t*m = multiname_clone(multiname); - int slotid = list_length(script->traits)+1; - trait_t*trait = trait_new(TRAIT_CLASS, m, slotid, 0, 0); - trait->cls = cls; - list_append(script->traits, trait); - return trait; -} - -abc_script_t* abc_initscript(abc_file_t*file) -{ - abc_method_t*m = abc_method_new(file, 0, 1); - abc_script_t* s = malloc(sizeof(abc_script_t)); - s->method = m; - s->traits = list_new(); - s->file = file; - array_append(file->scripts, NO_KEY, s); - return s; -} - -static void traits_dump(FILE*fo, const char*prefix, trait_list_t*traits, abc_file_t*file, dict_t*methods_seen); - -static void dump_method(FILE*fo, const char*prefix, - const char*attr, - const char*type, - const char*name, - abc_method_t*m, abc_file_t*file, dict_t*methods_seen) -{ - if(methods_seen) - dict_put(methods_seen, m, 0); - - char*return_type = 0; - if(m->return_type) - return_type = multiname_tostring(m->return_type); - else - return_type = strdup("*"); - - fprintf(fo, "%s", prefix); - fprintf(fo, "%s %s ", attr, type); - fprintf(fo, "%s %s=%s", return_type, name, m->name); - params_dump(fo, m->parameters, m->optional_parameters); - fprintf(fo, "(%d params, %d optional)\n", list_length(m->parameters), list_length(m->optional_parameters)); - - free(return_type);return_type=0; - - abc_method_body_t*c = m->body; - if(!c) { - return; - } - - fprintf(fo, "%s[stack:%d locals:%d scope:%d-%d flags:", - prefix, c->old.max_stack, c->old.local_count, c->old.init_scope_depth, - c->old.max_scope_depth); - - - int flags = c->method->flags; - if(flags&METHOD_NEED_ARGUMENTS) {fprintf(fo, " need_arguments");flags&=~METHOD_NEED_ARGUMENTS;} - if(flags&METHOD_NEED_ACTIVATION) {fprintf(fo, " need_activation");flags&=~METHOD_NEED_ACTIVATION;} - if(flags&METHOD_NEED_REST) {fprintf(fo, " need_rest");flags&=~METHOD_NEED_REST;} - if(flags&METHOD_HAS_OPTIONAL) {fprintf(fo, " has_optional");flags&=~METHOD_HAS_OPTIONAL;} - if(flags&METHOD_SET_DXNS) {fprintf(fo, " set_dxns");flags&=~METHOD_SET_DXNS;} - if(flags&METHOD_HAS_PARAM_NAMES) {fprintf(fo, " has_param_names");flags&=~METHOD_HAS_PARAM_NAMES;} - if(flags) fprintf(fo, " %02x", flags); - fprintf(fo, "]"); - - if(m->trait) { - fprintf(fo, " slot:%d", m->trait->slot_id); - } - fprintf(fo, "\n"); - - - char prefix2[80]; - sprintf(prefix2, "%s ", prefix); - if(c->traits) - traits_dump(fo, prefix, c->traits, file, methods_seen); - fprintf(fo, "%s{\n", prefix); - code_dump2(c->code, c->exceptions, file, prefix2, fo); - fprintf(fo, "%s}\n\n", prefix); -} - -static void traits_free(trait_list_t*traits) -{ - trait_list_t*t = traits; - while(t) { - if(t->trait->name) { - multiname_destroy(t->trait->name);t->trait->name = 0; - } - if(t->trait->kind == TRAIT_SLOT || t->trait->kind == TRAIT_CONST) { - multiname_destroy(t->trait->type_name); - } - if(t->trait->value) { - constant_free(t->trait->value);t->trait->value = 0; - } - free(t->trait);t->trait = 0; - t = t->next; - } - list_free(traits); -} - -static char trait_is_method(trait_t*trait) -{ - return (trait->kind == TRAIT_METHOD || trait->kind == TRAIT_GETTER || - trait->kind == TRAIT_SETTER || trait->kind == TRAIT_FUNCTION); -} - -static trait_list_t* traits_parse(TAG*tag, pool_t*pool, abc_file_t*file) -{ - int num_traits = swf_GetU30(tag); - trait_list_t*traits = list_new(); - int t; - if(num_traits) { - DEBUG printf("%d traits\n", num_traits); - } - - for(t=0;tname = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); // always a QName (ns,name) - - const char*name = 0; - DEBUG name = multiname_tostring(trait->name); - U8 kind = swf_GetU8(tag); - U8 attributes = kind&0xf0; - kind&=0x0f; - trait->kind = kind; - trait->attributes = attributes; - DEBUG printf(" trait %d) %s type=%02x\n", t, name, kind); - if(kind == TRAIT_METHOD || kind == TRAIT_GETTER || kind == TRAIT_SETTER) { // method / getter / setter - trait->disp_id = swf_GetU30(tag); - trait->method = (abc_method_t*)array_getvalue(file->methods, swf_GetU30(tag)); - trait->method->trait = trait; - DEBUG printf(" method/getter/setter\n"); - } else if(kind == TRAIT_FUNCTION) { // function - trait->slot_id = swf_GetU30(tag); - trait->method = (abc_method_t*)array_getvalue(file->methods, swf_GetU30(tag)); - trait->method->trait = trait; - } else if(kind == TRAIT_CLASS) { // class - trait->slot_id = swf_GetU30(tag); - trait->cls = (abc_class_t*)array_getvalue(file->classes, swf_GetU30(tag)); - DEBUG printf(" class %s %d %p\n", name, trait->slot_id, (int)trait->cls); - } else if(kind == TRAIT_SLOT || kind == TRAIT_CONST) { // slot, const - trait->slot_id = swf_GetU30(tag); - trait->type_name = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); - int vindex = swf_GetU30(tag); - if(vindex) { - int vkind = swf_GetU8(tag); - trait->value = constant_fromindex(pool, vindex, vkind); - } - DEBUG printf(" slot %s %d %s (%s)\n", name, trait->slot_id, trait->type_name->name, constant_tostring(trait->value)); - } else { - fprintf(stderr, "Can't parse trait type %d\n", kind); - } - if(attributes&0x40) { - int num = swf_GetU30(tag); - int s; - for(s=0;sTRAIT_CONST) { - fprintf(stderr, "Can't parse trait type %d\n", kind); - } - if(attributes&0x40) { - int s, num = swf_GetU30(tag); - for(s=0;strait; - - swf_SetU30(tag, pool_register_multiname(pool, trait->name)); - swf_SetU8(tag, trait->kind|trait->attributes); - - swf_SetU30(tag, trait->data1); - - if(trait->kind == TRAIT_CLASS) { - swf_SetU30(tag, trait->cls->index); - } else if(trait->kind == TRAIT_GETTER || - trait->kind == TRAIT_SETTER || - trait->kind == TRAIT_METHOD) { - swf_SetU30(tag, trait->method->index); - } else if(trait->kind == TRAIT_SLOT || - trait->kind == TRAIT_CONST) { - int index = pool_register_multiname(pool, trait->type_name); - swf_SetU30(tag, index); - } else { - swf_SetU30(tag, trait->data2); - } - - if(trait->kind == TRAIT_SLOT || trait->kind == TRAIT_CONST) { - int vindex = constant_get_index(pool, trait->value); - swf_SetU30(tag, vindex); - if(vindex) { - swf_SetU8(tag, trait->value->type); - } - } - if(trait->attributes&0x40) { - // metadata - swf_SetU30(tag, 0); - } - traits = traits->next; - } -} - - -static void traits_dump(FILE*fo, const char*prefix, trait_list_t*traits, abc_file_t*file, dict_t*methods_seen) -{ - int t; - while(traits) { - trait_t*trait = traits->trait; - char*name = multiname_tostring(trait->name); - U8 kind = trait->kind; - U8 attributes = trait->attributes; - - char a = attributes & (TRAIT_ATTR_OVERRIDE|TRAIT_ATTR_FINAL); - char* type = ""; - if(a==TRAIT_ATTR_FINAL) - type = "final "; - else if(a==TRAIT_ATTR_OVERRIDE) - type = "override "; - else if(a==(TRAIT_ATTR_OVERRIDE|TRAIT_ATTR_FINAL)) - type = "final override "; - - if(attributes&TRAIT_ATTR_METADATA) - fprintf(fo, ""); - - if(kind == TRAIT_METHOD) { - abc_method_t*m = trait->method; - dump_method(fo, prefix, type, "method", name, m, file, methods_seen); - } else if(kind == TRAIT_GETTER) { - abc_method_t*m = trait->method; - dump_method(fo, prefix, type, "getter", name, m, file, methods_seen); - } else if(kind == TRAIT_SETTER) { - abc_method_t*m = trait->method; - dump_method(fo, prefix, type, "setter", name, m, file, methods_seen); - } else if(kind == TRAIT_FUNCTION) { // function - abc_method_t*m = trait->method; - dump_method(fo, prefix, type, "function", name, m, file, methods_seen); - } else if(kind == TRAIT_CLASS) { // class - abc_class_t*cls = trait->cls; - if(!cls) { - fprintf(fo, "%sslot %d: class %s=00000000\n", prefix, trait->slot_id, name); - } else { - fprintf(fo, "%sslot %d: class %s=%s\n", prefix, trait->slot_id, name, cls->classname->name); - } - } else if(kind == TRAIT_SLOT || kind == TRAIT_CONST) { // slot, const - int slot_id = trait->slot_id; - char*type_name = multiname_tostring(trait->type_name); - char*value = constant_tostring(trait->value); - fprintf(fo, "%sslot %d: %s %s:%s %s %s\n", prefix, trait->slot_id, - kind==TRAIT_CONST?"const":"var", name, type_name, - trait->value?"=":"", trait->value?value:""); - if(value) free(value); - free(type_name); - } else { - fprintf(fo, "%s can't dump trait type %d\n", prefix, kind); - } - free(name); - traits=traits->next; - } -} - -void* swf_DumpABC(FILE*fo, void*code, char*prefix) -{ - abc_file_t* file = (abc_file_t*)code; - - if(file->name) { - fprintf(fo, "%s#\n", prefix); - fprintf(fo, "%s#name: %s\n", prefix, file->name); - fprintf(fo, "%s#\n", prefix); - } - - int t; - for(t=0;tmetadata->num;t++) { - const char*entry_name = array_getkey(file->metadata, t); - fprintf(fo, "%s#Metadata \"%s\":\n", prefix, entry_name); - int s; - array_t*items = (array_t*)array_getvalue(file->metadata, t); - for(s=0;snum;s++) { - fprintf(fo, "%s# %s=%s\n", prefix, (char*)array_getkey(items, s), (char*)array_getvalue(items,s)); - } - fprintf(fo, "%s#\n", prefix); - } - - dict_t*methods_seen = dict_new2(&ptr_type); - for(t=0;tclasses->num;t++) { - abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); - char prefix2[80]; - sprintf(prefix2, "%s ", prefix); - - fprintf(fo, "%s", prefix); - if(cls->flags&1) fprintf(fo, "sealed "); - if(cls->flags&2) fprintf(fo, "final "); - if(cls->flags&4) fprintf(fo, "interface "); - if(cls->flags&8) { - char*s = namespace_tostring(cls->protectedNS); - fprintf(fo, "protectedNS(%s) ", s); - free(s); - } - - char*classname = multiname_tostring(cls->classname); - fprintf(fo, "class %s", classname); - free(classname); - if(cls->superclass) { - char*supername = multiname_tostring(cls->superclass); - fprintf(fo, " extends %s", supername); - free(supername); - } - if(cls->interfaces) { - multiname_list_t*ilist = cls->interfaces; - if(ilist) - fprintf(fo, " implements"); - while(ilist) { - char*s = multiname_tostring(ilist->multiname); - fprintf(fo, " %s", s); - free(s); - ilist = ilist->next; - } - ilist->next; - } - if(cls->flags&0xf0) - fprintf(fo, "extra flags=%02x\n", cls->flags&0xf0); - fprintf(fo, "%s{\n", prefix); - - dict_put(methods_seen, cls->static_constructor, 0); - dict_put(methods_seen, cls->constructor, 0); - - if(cls->static_constructor) { - dump_method(fo, prefix2, "", "staticconstructor", "", cls->static_constructor, file, methods_seen); - } - traits_dump(fo, prefix2, cls->static_traits, file, methods_seen); - - char*n = multiname_tostring(cls->classname); - if(cls->constructor) - dump_method(fo, prefix2, "", "constructor", n, cls->constructor, file, methods_seen); - free(n); - traits_dump(fo, prefix2,cls->traits, file, methods_seen); - - if(cls->asset) { - swf_DumpAsset(fo, cls->asset, prefix2); - } - - fprintf(fo, "%s}\n", prefix); - } - fprintf(fo, "%s\n", prefix); - - for(t=0;tscripts->num;t++) { - abc_script_t*s = (abc_script_t*)array_getvalue(file->scripts, t); - dump_method(fo, prefix, "", "initmethod", "init", s->method, file, methods_seen); - traits_dump(fo, prefix, s->traits, file, methods_seen); - } - - char extra=0; - for(t=0;tmethods->num;t++) { - abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, t); - if(!dict_contains(methods_seen, m)) { - if(!extra) { - extra=1; - fprintf(fo, "\n"); - fprintf(fo, "%s//internal (non-class non-script) methods:\n", prefix); - } - char name[18]; - sprintf(name, "%08x ", m->index); - dump_method(fo, prefix, "", "internalmethod", name, m, file, methods_seen); - } - } - dict_destroy(methods_seen); - - return file; -} - -void* swf_ReadABC(TAG*tag) -{ - abc_file_t* file = abc_file_new(); - pool_t*pool = pool_new(); - - swf_SetTagPos(tag, 0); - int t; - if(tag->id == ST_DOABC) { - U32 abcflags = swf_GetU32(tag); - DEBUG printf("flags=%08x\n", abcflags); - char*name= swf_GetString(tag); - file->name = (name&&name[0])?strdup(name):0; - } - U32 version = swf_GetU32(tag); - if(version!=0x002e0010) { - fprintf(stderr, "Warning: unknown AVM2 version %08x\n", version); - } - - pool_read(pool, tag); - - int num_methods = swf_GetU30(tag); - DEBUG printf("%d methods\n", num_methods); - for(t=0;treturn_type = multiname_clone(pool_lookup_multiname(pool, return_type_index)); - else - m->return_type = 0; - - int s; - for(s=0;sparameters, param); - } - - int namenr = swf_GetU30(tag); - if(namenr) - m->name = strdup(pool_lookup_string(pool, namenr)); - else - m->name = strdup(""); - - m->flags = swf_GetU8(tag); - - DEBUG printf("method %d) %s ", t, m->name); - DEBUG params_dump(stdout, m->parameters, m->optional_parameters); - DEBUG printf("flags=%02x\n", m->flags); - - if(m->flags&0x08) { - m->optional_parameters = list_new(); - int num = swf_GetU30(tag); - int s; - for(s=0;soptional_parameters, c); - - } - } - if(m->flags&0x80) { - /* debug information- not used by avm2 */ - multiname_list_t*l = m->parameters; - while(l) { - const char*name = pool_lookup_string(pool, swf_GetU30(tag)); - l = l->next; - } - } - m->index = array_length(file->methods); - array_append(file->methods, NO_KEY, m); - } - - parse_metadata(tag, file, pool); - - /* skip classes, and scripts for now, and do the real parsing later */ - int num_classes = swf_GetU30(tag); - int classes_pos = tag->pos; - DEBUG printf("%d classes\n", num_classes); - for(t=0;tclasses, NO_KEY, cls); - - cls->flags = swf_GetU8(tag); - DEBUG printf("class %d %02x\n", t, cls->flags); - if(cls->flags&8) - swf_GetU30(tag); //protectedNS - int s; - int inum = swf_GetU30(tag); //interface count - cls->interfaces = 0; - for(s=0;sinterfaces, m); - DEBUG printf(" class %d interface: %s\n", t, m->name); - } - - int iinit = swf_GetU30(tag); //iinit - DEBUG printf("--iinit-->%d\n", iinit); - traits_skip(tag); - } - for(t=0;tclasses, t); - int cinit = swf_GetU30(tag); - DEBUG printf("--cinit(%d)-->%d\n", t, cinit); - cls->static_constructor = (abc_method_t*)array_getvalue(file->methods, cinit); - traits_skip(tag); - } - int num_scripts = swf_GetU30(tag); - DEBUG printf("%d scripts\n", num_scripts); - for(t=0;t= file->methods->num) { - printf("Invalid method number: %d\n", methodnr); - return 0; - } - abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, methodnr); - abc_method_body_t*c = malloc(sizeof(abc_method_body_t)); - memset(c, 0, sizeof(abc_method_body_t)); - c->old.max_stack = swf_GetU30(tag); - c->old.local_count = swf_GetU30(tag); - c->old.init_scope_depth = swf_GetU30(tag); - c->old.max_scope_depth = swf_GetU30(tag); - - c->init_scope_depth = c->old.init_scope_depth; - int code_length = swf_GetU30(tag); - - c->method = m; - m->body = c; - - int pos = tag->pos + code_length; - codelookup_t*codelookup = 0; - c->code = code_parse(tag, code_length, file, pool, &codelookup); - tag->pos = pos; - - int exception_count = swf_GetU30(tag); - int s; - c->exceptions = list_new(); - for(s=0;sfrom = code_atposition(codelookup, swf_GetU30(tag)); - e->to = code_atposition(codelookup, swf_GetU30(tag)); - e->target = code_atposition(codelookup, swf_GetU30(tag)); - - e->exc_type = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); - e->var_name = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); - //e->var_name = pool_lookup_string(pool, swf_GetU30(tag)); - //if(e->var_name) e->var_name = strdup(e->var_name); - list_append(c->exceptions, e); - } - codelookup_free(codelookup); - c->traits = traits_parse(tag, pool, file); - - DEBUG printf("method_body %d) (method %d), %d bytes of code\n", t, methodnr, code_length); - - array_append(file->method_bodies, NO_KEY, c); - } - if(tag->len - tag->pos) { - fprintf(stderr, "ERROR: %d unparsed bytes remaining in ABC block\n", tag->len - tag->pos); - return 0; - } - - swf_SetTagPos(tag, classes_pos); - for(t=0;tclasses, t); - - int classname_index = swf_GetU30(tag); - int superclass_index = swf_GetU30(tag); - cls->classname = multiname_clone(pool_lookup_multiname(pool, classname_index)); - cls->superclass = multiname_clone(pool_lookup_multiname(pool, superclass_index)); - cls->flags = swf_GetU8(tag); - const char*ns = ""; - if(cls->flags&8) { - int ns_index = swf_GetU30(tag); - cls->protectedNS = namespace_clone(pool_lookup_namespace(pool, ns_index)); - } - - int num_interfaces = swf_GetU30(tag); //interface count - int s; - for(s=0;sconstructor = (abc_method_t*)array_getvalue(file->methods, iinit); - cls->traits = traits_parse(tag, pool, file); - } - for(t=0;tclasses, t); - /* SKIP */ - swf_GetU30(tag); // cindex - cls->static_traits = traits_parse(tag, pool, file); - } - int num_scripts2 = swf_GetU30(tag); - for(t=0;tmethods, init); - - abc_script_t*s = malloc(sizeof(abc_script_t)); - memset(s, 0, sizeof(abc_script_t)); - s->method = m; - s->traits = traits_parse(tag, pool, file); - array_append(file->scripts, NO_KEY, s); - } - - pool_destroy(pool); - return file; -} - -static pool_t*writeABC(TAG*abctag, void*code, pool_t*pool) -{ - abc_file_t*file = (abc_file_t*)code; - if(!pool) - pool = pool_new(); - if(!file) - file = abc_file_new(); - - TAG*tmp = swf_InsertTag(0,0); - TAG*tag = tmp; - int t; - - /* add method bodies where needed */ - for(t=0;tclasses->num;t++) { - abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); - if(!c->constructor) { - if(!(c->flags&CLASS_INTERFACE)) { - NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); - NEW(abc_method_body_t,body);array_append(file->method_bodies, NO_KEY, body); - // don't bother to set m->index - body->method = m; m->body = body; - if(c->superclass && c->superclass->name && strcmp(c->superclass->name,"Object")) { - body->code = abc_getlocal_0(body->code); - body->code = abc_constructsuper(body->code, 0); - } - body->code = abc_returnvoid(body->code); - c->constructor = m; - } else { - NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); - c->constructor = m; - } - } - if(!c->static_constructor) { - NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); - NEW(abc_method_body_t,body);array_append(file->method_bodies, NO_KEY, body); - body->method = m; m->body = body; - body->code = abc_returnvoid(0); - c->static_constructor = m; - } - } - - - swf_SetU30(tag, file->methods->num); - /* enumerate classes, methods and method bodies */ - for(t=0;tmethods->num;t++) { - abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, t); - m->index = t; - } - for(t=0;tclasses->num;t++) { - abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); - c->index = t; - } - for(t=0;tmethod_bodies->num;t++) { - abc_method_body_t*m = (abc_method_body_t*)array_getvalue(file->method_bodies, t); - m->index = t; - } - - /* generate code statistics */ - for(t=0;tmethod_bodies->num;t++) { - abc_method_body_t*m = (abc_method_body_t*)array_getvalue(file->method_bodies, t); - m->stats = code_get_statistics(m->code, m->exceptions); - } - - /* level init scope depths: The init scope depth of a method is - always as least as high as the init scope depth of it's surrounding - class. - A method has it's own init_scope_depth if it's an init method - (then its init scope depth is zero), or if it's used as a closure. - - Not sure yet what to do with methods which are used at different - locations- e.g. the nullmethod is used all over the place. - EDIT: flashplayer doesn't allow this anyway- a method can only - be used once - - Also, I have the strong suspicion that flash player uses only - the difference between max_scope_stack and init_scope_stack, anyway. - */ - for(t=0;tclasses->num;t++) { - abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); - trait_list_t*traits = c->traits; - if(c->constructor && c->constructor->body && - c->constructor->body->init_scope_depth < c->init_scope_depth) { - c->constructor->body->init_scope_depth = c->init_scope_depth; - } - if(c->static_constructor && c->static_constructor->body && - c->static_constructor->body->init_scope_depth < c->init_scope_depth) { - c->static_constructor->body->init_scope_depth = c->init_scope_depth; - } - while(traits) { - trait_t*trait = traits->trait; - if(trait_is_method(trait) && trait->method->body) { - abc_method_body_t*body = trait->method->body; - if(body->init_scope_depth < c->init_scope_depth) { - body->init_scope_depth = c->init_scope_depth; - } - } - traits = traits->next; - } - } - - for(t=0;tmethods->num;t++) { - abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, t); - int n = 0; - multiname_list_t*l = m->parameters; - int num_params = list_length(m->parameters); - swf_SetU30(tag, num_params); - if(m->return_type) - swf_SetU30(tag, pool_register_multiname(pool, m->return_type)); - else - swf_SetU30(tag, 0); - int s; - while(l) { - swf_SetU30(tag, pool_register_multiname(pool, l->multiname)); - l = l->next; - } - if(m->name) { - swf_SetU30(tag, pool_register_string(pool, m->name)); - } else { - swf_SetU30(tag, 0); - } - - U8 flags = m->flags&(METHOD_NEED_REST|METHOD_NEED_ARGUMENTS); - if(m->optional_parameters) - flags |= METHOD_HAS_OPTIONAL; - if(m->body) { - flags |= m->body->stats->flags; - } - - swf_SetU8(tag, flags); - if(flags&METHOD_HAS_OPTIONAL) { - swf_SetU30(tag, list_length(m->optional_parameters)); - constant_list_t*l = m->optional_parameters; - while(l) { - int i = constant_get_index(pool, l->constant); - swf_SetU30(tag, i); - if(!i) { - swf_SetU8(tag, CONSTANT_NULL); - } else { - swf_SetU8(tag, l->constant->type); - } - l = l->next; - } - } - } - - /* write metadata */ - swf_SetU30(tag, file->metadata->num); - for(t=0;tmetadata->num;t++) { - const char*entry_name = array_getkey(file->metadata, t); - swf_SetU30(tag, pool_register_string(pool, entry_name)); - array_t*items = (array_t*)array_getvalue(file->metadata, t); - swf_SetU30(tag, items->num); - int s; - for(s=0;snum;s++) { - int i1 = pool_register_string(pool, array_getkey(items, s)); - int i2 = pool_register_string(pool, array_getvalue(items, s)); - swf_SetU30(tag, i1); - swf_SetU30(tag, i2); - } - } - - swf_SetU30(tag, file->classes->num); - for(t=0;tclasses->num;t++) { - abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); - - int classname_index = pool_register_multiname(pool, c->classname); - int superclass_index = pool_register_multiname(pool, c->superclass); - - swf_SetU30(tag, classname_index); - swf_SetU30(tag, superclass_index); - - swf_SetU8(tag, c->flags); // flags - if(c->flags&0x08) { - int ns_index = pool_register_namespace(pool, c->protectedNS); - swf_SetU30(tag, ns_index); - } - - swf_SetU30(tag, list_length(c->interfaces)); - multiname_list_t*interface= c->interfaces; - while(interface) { - swf_SetU30(tag, pool_register_multiname(pool, interface->multiname)); - interface = interface->next; - } - - assert(c->constructor); - swf_SetU30(tag, c->constructor->index); - - traits_write(pool, tag, c->traits); - } - for(t=0;tclasses->num;t++) { - abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); - assert(c->static_constructor); - swf_SetU30(tag, c->static_constructor->index); - - traits_write(pool, tag, c->static_traits); - } - - swf_SetU30(tag, file->scripts->num); - for(t=0;tscripts->num;t++) { - abc_script_t*s = (abc_script_t*)array_getvalue(file->scripts, t); - if(!s->method->body || !s->method->body->code) { - fprintf(stderr, "Internal Error: initscript has no body\n"); - } - swf_SetU30(tag, s->method->index); //!=t! - traits_write(pool, tag, s->traits); - } - - swf_SetU30(tag, file->method_bodies->num); - for(t=0;tmethod_bodies->num;t++) { - abc_method_body_t*c = (abc_method_body_t*)array_getvalue(file->method_bodies, t); - abc_method_t*m = c->method; - swf_SetU30(tag, m->index); - - //swf_SetU30(tag, c->old.max_stack); - //swf_SetU30(tag, c->old.local_count); - //swf_SetU30(tag, c->old.init_scope_depth); - //swf_SetU30(tag, c->old.max_scope_depth); - - swf_SetU30(tag, c->stats->max_stack); - int param_num = list_length(c->method->parameters)+1; - if(c->method->flags&METHOD_NEED_REST) - param_num++; - if(param_num <= c->stats->local_count) - swf_SetU30(tag, c->stats->local_count); - else - swf_SetU30(tag, param_num); - - swf_SetU30(tag, c->init_scope_depth); - swf_SetU30(tag, c->stats->max_scope_depth+ - c->init_scope_depth); - - code_write(tag, c->code, pool, file); - - swf_SetU30(tag, list_length(c->exceptions)); - abc_exception_list_t*l = c->exceptions; - while(l) { - // warning: assumes "pos" in each code_t is up-to-date - swf_SetU30(tag, l->abc_exception->from->pos); - swf_SetU30(tag, l->abc_exception->to->pos); - swf_SetU30(tag, l->abc_exception->target->pos); - swf_SetU30(tag, pool_register_multiname(pool, l->abc_exception->exc_type)); - swf_SetU30(tag, pool_register_multiname(pool, l->abc_exception->var_name)); - l = l->next; - } - - traits_write(pool, tag, c->traits); - } - - /* free temporary codestat data again. Notice: If we were to write this - file multiple times, this can also be shifted to abc_file_free() */ - for(t=0;tmethod_bodies->num;t++) { - abc_method_body_t*m = (abc_method_body_t*)array_getvalue(file->method_bodies, t); - codestats_free(m->stats);m->stats=0; - } - - // --- start to write real tag -- - - tag = abctag; - - if(tag->id == ST_DOABC) { - swf_SetU32(tag, file->flags); // flags - swf_SetString(tag, file->name); - } - - swf_SetU16(tag, 0x10); //version - swf_SetU16(tag, 0x2e); - - pool_write(pool, tag); - - swf_SetBlock(tag, tmp->data, tmp->len); - - swf_DeleteTag(0, tmp); - return pool; -} - -void swf_WriteABC(TAG*abctag, void*code) -{ - pool_t*pool = writeABC(abctag, code, 0); - pool_optimize(pool); - swf_ResetTag(abctag, abctag->id); - writeABC(abctag, code, pool); - pool_destroy(pool); -} - -void abc_file_free(abc_file_t*file) -{ - if(!file) - return; - int t; - if(file->metadata) { - for(t=0;tmetadata->num;t++) { - array_t*items = (array_t*)array_getvalue(file->metadata, t); - int s; - for(s=0;snum;s++) { - free(array_getvalue(items, s)); - } - array_free(items); - } - array_free(file->metadata);file->metadata=0; - } - - for(t=0;tmethods->num;t++) { - abc_method_t*m = (abc_method_t*)array_getvalue(file->methods, t); - - multiname_list_t*param = m->parameters; - while(param) { - multiname_destroy(param->multiname);param->multiname=0; - param = param->next; - } - list_free(m->parameters);m->parameters=0; - - constant_list_t*opt = m->optional_parameters; - while(opt) { - constant_free(opt->constant);opt->constant=0; - opt = opt->next; - } - list_free(m->optional_parameters);m->optional_parameters=0; - - if(m->name) { - free((void*)m->name);m->name=0; - } - if(m->return_type) { - multiname_destroy(m->return_type); - } - free(m); - } - array_free(file->methods);file->methods=0; - - for(t=0;tclasses->num;t++) { - abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); - traits_free(cls->traits);cls->traits=0; - traits_free(cls->static_traits);cls->static_traits=0; - - if(cls->classname) { - multiname_destroy(cls->classname); - } - if(cls->superclass) { - multiname_destroy(cls->superclass); - } - - multiname_list_t*i = cls->interfaces; - while(i) { - multiname_destroy(i->multiname);i->multiname=0; - i = i->next; - } - list_free(cls->interfaces);cls->interfaces=0; - - if(cls->protectedNS) { - namespace_destroy(cls->protectedNS); - } - free(cls); - } - array_free(file->classes);file->classes=0; - - for(t=0;tscripts->num;t++) { - abc_script_t*s = (abc_script_t*)array_getvalue(file->scripts, t); - traits_free(s->traits);s->traits=0; - free(s); - } - array_free(file->scripts);file->scripts=0; - - for(t=0;tmethod_bodies->num;t++) { - abc_method_body_t*body = (abc_method_body_t*)array_getvalue(file->method_bodies, t); - code_free(body->code);body->code=0; - traits_free(body->traits);body->traits=0; - - abc_exception_list_t*ee = body->exceptions; - while(ee) { - abc_exception_t*e=ee->abc_exception;ee->abc_exception=0; - e->from = e->to = e->target = 0; - multiname_destroy(e->exc_type);e->exc_type=0; - multiname_destroy(e->var_name);e->var_name=0; - free(e); - ee=ee->next; - } - list_free(body->exceptions);body->exceptions=0; - - free(body); - } - array_free(file->method_bodies);file->method_bodies=0; - - if(file->name) { - free((void*)file->name);file->name=0; - } - - free(file); -} - -void swf_FreeABC(void*code) -{ - abc_file_t*file= (abc_file_t*)code; - abc_file_free(file); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.h deleted file mode 100644 index 4ba6da320..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/abc.h +++ /dev/null @@ -1,229 +0,0 @@ -/* abc.h - - Routines for handling Flash2 AVM2 ABC Actionscript (header file) - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __swfabc_h__ -#define __swfabc_h__ - -#include "../q.h" -#include "pool.h" - -DECLARE(abc_file); -DECLARE(abc_method); -DECLARE(abc_method_body); -DECLARE(abc_interface); -DECLARE(abc_class); -DECLARE(abc_exception); -DECLARE(abc_asset); -DECLARE(asset_dependency); -DECLARE(asset_tag); -DECLARE_LIST(abc_asset); -DECLARE_LIST(asset_dependency); -DECLARE_LIST(asset_tag); -DECLARE_LIST(abc_exception); -DECLARE_LIST(TAG); - -#include "code.h" -#include "opcodes.h" - -DECLARE(trait); - - -#define METHOD_NEED_ARGUMENTS 1 -#define METHOD_NEED_ACTIVATION 2 -#define METHOD_NEED_REST 4 -#define METHOD_HAS_OPTIONAL 8 -#define METHOD_SET_DXNS 0x40 -#define METHOD_HAS_PARAM_NAMES 0x80 - -struct _abc_method { - multiname_t*return_type; - multiname_list_t*parameters; - constant_list_t*optional_parameters; - const char*name; - U8 flags; - abc_method_body_t*body; - - trait_t*trait; - - int index; //filled in during writing -}; - -#define ABCFILE_LAZY 1 -struct _abc_file { - // abc_file - - const char*name; - U32 flags; - array_t*metadata; - array_t*methods; - array_t*classes; - array_t*scripts; - array_t*method_bodies; -}; - -abc_file_t*abc_file_new(); - -#define TRAIT_SLOT 0 -#define TRAIT_METHOD 1 -#define TRAIT_GETTER 2 -#define TRAIT_SETTER 3 -#define TRAIT_CLASS 4 -#define TRAIT_FUNCTION 5 -#define TRAIT_CONST 6 - -#define TRAIT_ATTR_FINAL 0x10 -#define TRAIT_ATTR_OVERRIDE 0x20 -#define TRAIT_ATTR_METADATA 0x40 - - -struct _trait { - unsigned char kind; - unsigned char attributes; - multiname_t*name; - - union { - int disp_id; - int slot_id; - int data1; - }; - union { - abc_method_t*method; - abc_class_t*cls; - multiname_t*type_name; - int data2; - }; - constant_t*value; -}; - -trait_t*trait_new_method(trait_list_t**traits, multiname_t*name, abc_method_t*m); -trait_t*trait_new_member(trait_list_t**traits, multiname_t*type, multiname_t*name, constant_t*v); - -#define CLASS_SEALED 1 -#define CLASS_FINAL 2 -#define CLASS_INTERFACE 4 -#define CLASS_PROTECTED_NS 8 - -struct _abc_class { - abc_file_t*file; - - multiname_t*classname; - multiname_t*superclass; - namespace_t*protectedNS; - - multiname_list_t*interfaces; - - abc_method_t*constructor; - trait_list_t*traits; - - abc_method_t*static_constructor; - trait_list_t*static_traits; - - U8 flags; - - abc_asset_t*asset; // swf tags needed for this class - - int init_scope_depth; // volatile, might be increased during code verification - int index; //filled in during writing -}; - -void abc_method_init(abc_method_t*m, abc_file_t*file, multiname_t*returntype, char body); -abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body); - -abc_class_t* abc_class_new(abc_file_t*file, multiname_t*classname, multiname_t*superclass); -abc_class_t* abc_class_new2(abc_file_t*file, char*classname, char*superclass); -void abc_class_sealed(abc_class_t*c); -void abc_class_final(abc_class_t*c); -void abc_class_interface(abc_class_t*c); -void abc_class_protectedNS(abc_class_t*c, char*namespace); -void abc_class_add_interface(abc_class_t*c, multiname_t*interface); -char*abc_class_fullname(abc_class_t*cls); - -trait_t* traits_find_slotid(trait_list_t*traits, int slotid); - -abc_method_t* abc_class_getconstructor(abc_class_t*cls, multiname_t*returntype); -abc_method_t* abc_class_getstaticconstructor(abc_class_t*cls, multiname_t*returntype); - -abc_method_t* abc_class_method(abc_class_t*cls, multiname_t*returntype, multiname_t*name); -abc_method_t* abc_class_staticmethod(abc_class_t*cls, multiname_t*returntype, multiname_t*name); -trait_t* abc_class_slot(abc_class_t*cls, multiname_t*name, multiname_t*type); -trait_t* abc_class_staticslot(abc_class_t*cls, multiname_t*name, multiname_t*type); - -struct _abc_exception { - code_t*from; - code_t*to; - code_t*target; - multiname_t*exc_type; - multiname_t*var_name; -}; - -struct _abc_method_body { - abc_file_t*file; - //abc_class_t*cls; - abc_method_t*method; - code_t*code; - - struct { - //for dumping: filled in during parsing - int max_stack; - int local_count; - int max_scope_depth; - int init_scope_depth; - } old; - - int init_scope_depth; // volatile, might be increased during code verification - - abc_exception_list_t* exceptions; - - trait_list_t*traits; - - int index; // filled in during writing - codestats_t*stats; //filled in during writing -}; - -typedef struct _abc_script { - abc_method_t*method; - abc_file_t*file; - trait_list_t*traits; -} abc_script_t; - -struct _asset_dependency { - abc_asset_t*asset; - int patch_pos; -}; -struct _asset_tag { - TAG*tag; - asset_dependency_t*deps; - int num_deps; -}; -struct _abc_asset { - asset_tag_list_t*tags; - U16 id; -}; - -abc_method_t* abc_nullmethod(abc_file_t*file); -abc_script_t* abc_initscript(abc_file_t*file); -trait_t*abc_initscript_addClassTrait(abc_script_t*script, multiname_t*multiname, abc_class_t*cls); - -#define __ - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.c deleted file mode 100644 index f6b4aee87..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.c +++ /dev/null @@ -1,216 +0,0 @@ -#include -#include "../types.h" -#include "../rfxswf.h" -#include "assets.h" - -static void add_dependencies(asset_resolver_t*assets, abc_asset_t*asset, asset_tag_t*atag) -{ - TAG*tag = atag->tag; - atag->num_deps = swf_GetNumUsedIDs(tag); - int*positions = malloc(sizeof(int)*atag->num_deps); - atag->deps = malloc(atag->num_deps*sizeof(atag->deps[0])); - swf_GetUsedIDs(tag, positions); - int t; - for(t=0;tnum_deps;t++) { - asset_dependency_t*d = &atag->deps[t]; - d->patch_pos = positions[t]; - U16 id = GET16(&tag->data[positions[t]]); - d->asset = assets->id2asset[id]; - if(!d->asset) { - fprintf(stderr, "Error: ID %d referenced, but not defined\n", id); - } - } - free(positions); -} - -asset_resolver_t* swf_ParseAssets(SWF*swf) -{ - NEW(asset_resolver_t,assets); - assets->name2asset = dict_new2(&charptr_type); - assets->id2asset = rfx_calloc(sizeof(abc_asset_t*)*65536); - - TAG*tag = swf->firstTag; - while(tag) { - if(swf_isDefiningTag(tag)) { - NEW(abc_asset_t, asset); - assets->id2asset[swf_GetDefineID(tag)] = asset; - } - tag = tag->next; - } - - tag = swf->firstTag; - while(tag) { - if(swf_isDefiningTag(tag)) { - abc_asset_t*asset = assets->id2asset[swf_GetDefineID(tag)]; - assert(asset); - if(asset) { - NEW(asset_tag_t,t); - t->tag = tag; - list_append(asset->tags, t); - add_dependencies(assets, asset, t); - } - } else if(swf_isPseudoDefiningTag(tag)) { - abc_asset_t*asset = assets->id2asset[swf_GetDefineID(tag)]; - if(asset) { - NEW(asset_tag_t,t); - t->tag = tag; - list_append(asset->tags, t); - add_dependencies(assets, asset, t); - } - } else if(tag->id == ST_SYMBOLCLASS) { - int t, num = swf_GetU16(tag); - for(t=0;tmainclass_id = id; - } else { - abc_asset_t*asset = assets->id2asset[id]; - if(!asset) { - fprintf(stderr, "Error: ID %d referenced, but not defined.\n", id); - } else { - char*name = swf_GetString(tag); - dict_put(assets->name2asset, name, asset); - } - } - } - } - tag = tag->next; - } - return assets; -} - -void swf_ResolveAssets(asset_resolver_t*assets, abc_file_t*file) -{ - int num = assets->name2asset->num; - int resolved = 0; - int t; - for(t=0;tclasses->num;t++) { - abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); - char*fullname = abc_class_fullname(cls); - abc_asset_t*a = (abc_asset_t*)dict_lookup(assets->name2asset, fullname); - if(a) { - resolved++; - cls->asset = a; - } - free(fullname); - } -} - -static void dump_asset(FILE*fo, abc_asset_t*a, const char*prefix) -{ - asset_tag_list_t*t = a->tags; - while(t) { - TAG*tag = t->asset_tag->tag; - fprintf(fo, "%s[tag] %s defines ID %d\n", prefix, swf_TagGetName(tag), swf_GetDefineID(tag)); - char*prefix2 = allocprintf("%s ", prefix); - int i; - for(i=0;iasset_tag->num_deps;i++) { - asset_dependency_t*d = &t->asset_tag->deps[i]; - dump_asset(fo, d->asset, prefix2); - } - free(prefix2); - t = t->next; - } -} - -void swf_DumpAsset(FILE*fo, abc_asset_t*asset, const char*prefix) -{ - dump_asset(fo, asset, prefix); -} - -static TAG* write_tag(TAG*prev, TAG*tag) -{ - if(prev) { - prev->next = tag; - } - tag->prev = prev; - tag->next = 0; - prev = tag; - return prev; -} -static TAG*write_asset(TAG*tag, abc_asset_t*a, dict_t*written, U16*currentid) -{ - if(!dict_contains(written, a)) { - dict_put(written, a, 0); - a->id = (*currentid)++; - asset_tag_list_t*tags = a->tags; - - while(tags) { - asset_tag_t*t = tags->asset_tag; - int i; - for(i=0;inum_deps;i++) { - asset_dependency_t*dep = &t->deps[i]; - tag = write_asset(tag, dep->asset, written, currentid); - PUT16(&t->tag->data[dep->patch_pos], dep->asset->id); - } - swf_SetDefineID(t->tag, a->id); - tag = write_tag(tag, t->tag); - tags = tags->next; - } - } - return tag; -} - -void swf_WriteABCSymbols(TAG*tag, abc_file_t*file) -{ - int num = 0; - int t; - for(t=0;tclasses->num;t++) { - abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); - abc_asset_t*a = cls->asset; - if(a && a->tags) { - num++; - } - } - swf_SetU16(tag, num); - for(t=0;tclasses->num;t++) { - abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t); - abc_asset_t*a = cls->asset; - if(a && a->tags) { - U16 id = swf_GetDefineID(a->tags->asset_tag->tag); - char*fullname = abc_class_fullname(cls); - swf_SetU16(tag, id); - swf_SetString(tag, fullname); - } - } -} - -TAG*swf_AssetsToTags(TAG*itag, asset_bundle_list_t*assets) -{ - U16 currentid = 1; - asset_bundle_list_t*l = assets; - dict_t*written = dict_new2(&ptr_type); - while(l) { - if(l->asset_bundle->used) { - abc_file_t*file = l->asset_bundle->file; - int t; - TAG* tag = 0; - for(t=0;tclasses->num;t++) { - abc_asset_t*a = ((abc_class_t*)array_getvalue(file->classes, t))->asset; - if(a) { - tag = write_asset(tag, a, written, ¤tid); - } - } - - tag = swf_InsertTag(tag, ST_DOABC); - swf_WriteABC(tag, file); - tag = swf_InsertTag(tag, ST_SYMBOLCLASS); - swf_WriteABCSymbols(tag, file); - - TAG*first = tag; - while(first && first->prev) - first=first->prev; - - if(!itag) { - itag = first; - } else { - itag->next = first; - first->prev = itag; - itag = tag; - } - } - l = l->next; - } - dict_destroy(written); - return itag; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.h deleted file mode 100644 index 7dda7c61e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/assets.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __abc_assets_h__ -#define __abc_assets_h__ -#include "abc.h" -#include "registry.h" - -typedef struct _asset_resolver { - SWF*swf; - abc_asset_t**id2asset; - dict_t*name2asset; - U16 mainclass_id; -} asset_resolver_t; - -asset_resolver_t* swf_ParseAssets(SWF*swf); -void swf_ResolveAssets(asset_resolver_t*swf, abc_file_t*file); -void swf_DumpAsset(FILE*fo, abc_asset_t*asset, const char*prefix); -TAG*swf_AssetsToTags(TAG*tag, asset_bundle_list_t*assets); - -#endif //__abc_assets_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.c deleted file mode 100644 index 592ca5fb8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.c +++ /dev/null @@ -1,8951 +0,0 @@ -#include "builtin.h" - -static classinfo_t flash_text_TextFormat; -static varinfo_t flash_text_TextFormat_leading; -static varinfo_t flash_text_TextFormat_bold; -static varinfo_t flash_text_TextFormat_underline; -static varinfo_t flash_text_TextFormat_color; -static varinfo_t flash_text_TextFormat_letterSpacing; -static varinfo_t flash_text_TextFormat_kerning; -static varinfo_t flash_text_TextFormat_target; -static varinfo_t flash_text_TextFormat_italic; -static varinfo_t flash_text_TextFormat_rightMargin; -static varinfo_t flash_text_TextFormat_bullet; -static varinfo_t flash_text_TextFormat_url; -static varinfo_t flash_text_TextFormat_size; -static varinfo_t flash_text_TextFormat_indent; -static varinfo_t flash_text_TextFormat_leftMargin; -static varinfo_t flash_text_TextFormat_display; -static varinfo_t flash_text_TextFormat_align; -static varinfo_t flash_text_TextFormat_tabStops; -static varinfo_t flash_text_TextFormat_blockIndent; -static varinfo_t flash_text_TextFormat_font; -static varinfo_t flash_text_TextFormat_leading; -static varinfo_t flash_text_TextFormat_bold; -static varinfo_t flash_text_TextFormat_underline; -static varinfo_t flash_text_TextFormat_color; -static varinfo_t flash_text_TextFormat_letterSpacing; -static varinfo_t flash_text_TextFormat_kerning; -static varinfo_t flash_text_TextFormat_target; -static varinfo_t flash_text_TextFormat_italic; -static varinfo_t flash_text_TextFormat_rightMargin; -static varinfo_t flash_text_TextFormat_bullet; -static varinfo_t flash_text_TextFormat_url; -static varinfo_t flash_text_TextFormat_size; -static varinfo_t flash_text_TextFormat_indent; -static varinfo_t flash_text_TextFormat_leftMargin; -static varinfo_t flash_text_TextFormat_display; -static varinfo_t flash_text_TextFormat_align; -static varinfo_t flash_text_TextFormat_tabStops; -static varinfo_t flash_text_TextFormat_blockIndent; -static varinfo_t flash_text_TextFormat_font; -static classinfo_t flash_filters_BitmapFilter; -static methodinfo_t flash_filters_BitmapFilter_clone; -static methodinfo_t flash_filters_BitmapFilter_clone; -static classinfo_t flash_filters_DropShadowFilter; -static varinfo_t flash_filters_DropShadowFilter_alpha; -static varinfo_t flash_filters_DropShadowFilter_strength; -static varinfo_t flash_filters_DropShadowFilter_quality; -static varinfo_t flash_filters_DropShadowFilter_angle; -static varinfo_t flash_filters_DropShadowFilter_knockout; -static varinfo_t flash_filters_DropShadowFilter_color; -static varinfo_t flash_filters_DropShadowFilter_hideObject; -static varinfo_t flash_filters_DropShadowFilter_inner; -static varinfo_t flash_filters_DropShadowFilter_blurX; -static varinfo_t flash_filters_DropShadowFilter_blurY; -static varinfo_t flash_filters_DropShadowFilter_distance; -static methodinfo_t flash_filters_DropShadowFilter_clone; -static varinfo_t flash_filters_DropShadowFilter_alpha; -static varinfo_t flash_filters_DropShadowFilter_strength; -static varinfo_t flash_filters_DropShadowFilter_quality; -static varinfo_t flash_filters_DropShadowFilter_angle; -static varinfo_t flash_filters_DropShadowFilter_knockout; -static varinfo_t flash_filters_DropShadowFilter_color; -static varinfo_t flash_filters_DropShadowFilter_hideObject; -static varinfo_t flash_filters_DropShadowFilter_inner; -static varinfo_t flash_filters_DropShadowFilter_blurX; -static varinfo_t flash_filters_DropShadowFilter_blurY; -static varinfo_t flash_filters_DropShadowFilter_distance; -static methodinfo_t flash_filters_DropShadowFilter_clone; -static classinfo_t adobe_utils_CustomActions; -static classinfo_t flash_text_engine_TextLineValidity; -static classinfo_t flash_display_LineScaleMode; -static classinfo_t flash_geom_Transform; -static varinfo_t flash_geom_Transform_matrix; -static varinfo_t flash_geom_Transform_perspectiveProjection; -static varinfo_t flash_geom_Transform_concatenatedMatrix; -static varinfo_t flash_geom_Transform_colorTransform; -static methodinfo_t flash_geom_Transform_getRelativeMatrix3D; -static varinfo_t flash_geom_Transform_pixelBounds; -static varinfo_t flash_geom_Transform_matrix3D; -static varinfo_t flash_geom_Transform_concatenatedColorTransform; -static varinfo_t flash_geom_Transform_matrix; -static varinfo_t flash_geom_Transform_perspectiveProjection; -static varinfo_t flash_geom_Transform_concatenatedMatrix; -static varinfo_t flash_geom_Transform_colorTransform; -static methodinfo_t flash_geom_Transform_getRelativeMatrix3D; -static varinfo_t flash_geom_Transform_pixelBounds; -static varinfo_t flash_geom_Transform_matrix3D; -static varinfo_t flash_geom_Transform_concatenatedColorTransform; -static classinfo_t flash_ui_KeyLocation; -static classinfo_t flash_events_MouseEvent; -static varinfo_t flash_events_MouseEvent_localY; -static methodinfo_t flash_events_MouseEvent_updateAfterEvent; -static varinfo_t flash_events_MouseEvent_delta; -static varinfo_t flash_events_MouseEvent_stageX; -static methodinfo_t flash_events_MouseEvent_toString; -static varinfo_t flash_events_MouseEvent_relatedObject; -static varinfo_t flash_events_MouseEvent_isRelatedObjectInaccessible; -static varinfo_t flash_events_MouseEvent_shiftKey; -static varinfo_t flash_events_MouseEvent_stageY; -static varinfo_t flash_events_MouseEvent_altKey; -static methodinfo_t flash_events_MouseEvent_clone; -static varinfo_t flash_events_MouseEvent_ctrlKey; -static varinfo_t flash_events_MouseEvent_localX; -static varinfo_t flash_events_MouseEvent_buttonDown; -static varinfo_t flash_events_MouseEvent_localY; -static methodinfo_t flash_events_MouseEvent_updateAfterEvent; -static varinfo_t flash_events_MouseEvent_delta; -static varinfo_t flash_events_MouseEvent_stageX; -static methodinfo_t flash_events_MouseEvent_toString; -static varinfo_t flash_events_MouseEvent_relatedObject; -static varinfo_t flash_events_MouseEvent_isRelatedObjectInaccessible; -static varinfo_t flash_events_MouseEvent_shiftKey; -static varinfo_t flash_events_MouseEvent_stageY; -static varinfo_t flash_events_MouseEvent_altKey; -static methodinfo_t flash_events_MouseEvent_clone; -static varinfo_t flash_events_MouseEvent_ctrlKey; -static varinfo_t flash_events_MouseEvent_localX; -static varinfo_t flash_events_MouseEvent_buttonDown; -static classinfo_t flash_text_engine_LineJustification; -static classinfo_t flash_media_Camera; -static varinfo_t flash_media_Camera_fps; -static methodinfo_t flash_media_Camera_setMode; -static varinfo_t flash_media_Camera_keyFrameInterval; -static varinfo_t flash_media_Camera_motionTimeout; -static varinfo_t flash_media_Camera_width; -static methodinfo_t flash_media_Camera_setCursor; -static methodinfo_t flash_media_Camera_setLoopback; -static varinfo_t flash_media_Camera_height; -static varinfo_t flash_media_Camera_index; -static varinfo_t flash_media_Camera_name; -static varinfo_t flash_media_Camera_currentFPS; -static methodinfo_t flash_media_Camera_setKeyFrameInterval; -static varinfo_t flash_media_Camera_quality; -static varinfo_t flash_media_Camera_motionLevel; -static varinfo_t flash_media_Camera_bandwidth; -static varinfo_t flash_media_Camera_muted; -static varinfo_t flash_media_Camera_activityLevel; -static varinfo_t flash_media_Camera_loopback; -static methodinfo_t flash_media_Camera_setQuality; -static methodinfo_t flash_media_Camera_setMotionLevel; -static varinfo_t flash_media_Camera_fps; -static methodinfo_t flash_media_Camera_setMode; -static varinfo_t flash_media_Camera_keyFrameInterval; -static varinfo_t flash_media_Camera_motionTimeout; -static varinfo_t flash_media_Camera_width; -static methodinfo_t flash_media_Camera_setCursor; -static methodinfo_t flash_media_Camera_setLoopback; -static varinfo_t flash_media_Camera_height; -static varinfo_t flash_media_Camera_index; -static varinfo_t flash_media_Camera_name; -static varinfo_t flash_media_Camera_currentFPS; -static methodinfo_t flash_media_Camera_setKeyFrameInterval; -static varinfo_t flash_media_Camera_quality; -static varinfo_t flash_media_Camera_motionLevel; -static varinfo_t flash_media_Camera_bandwidth; -static varinfo_t flash_media_Camera_muted; -static varinfo_t flash_media_Camera_activityLevel; -static varinfo_t flash_media_Camera_loopback; -static methodinfo_t flash_media_Camera_setQuality; -static methodinfo_t flash_media_Camera_setMotionLevel; -static methodinfo_t flash_net_registerClassAlias; -static classinfo_t flash_accessibility_AccessibilityImplementation; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accState; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accName; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accSelection; -static methodinfo_t flash_accessibility_AccessibilityImplementation_accDoDefaultAction; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accFocus; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accDefaultAction; -static methodinfo_t flash_accessibility_AccessibilityImplementation_accSelect; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accValue; -static varinfo_t flash_accessibility_AccessibilityImplementation_stub; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accRole; -static varinfo_t flash_accessibility_AccessibilityImplementation_errno; -static methodinfo_t flash_accessibility_AccessibilityImplementation_isLabeledBy; -static methodinfo_t flash_accessibility_AccessibilityImplementation_accLocation; -static methodinfo_t flash_accessibility_AccessibilityImplementation_getChildIDArray; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accState; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accName; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accSelection; -static methodinfo_t flash_accessibility_AccessibilityImplementation_accDoDefaultAction; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accFocus; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accDefaultAction; -static methodinfo_t flash_accessibility_AccessibilityImplementation_accSelect; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accValue; -static varinfo_t flash_accessibility_AccessibilityImplementation_stub; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accRole; -static varinfo_t flash_accessibility_AccessibilityImplementation_errno; -static methodinfo_t flash_accessibility_AccessibilityImplementation_isLabeledBy; -static methodinfo_t flash_accessibility_AccessibilityImplementation_accLocation; -static methodinfo_t flash_accessibility_AccessibilityImplementation_getChildIDArray; -static classinfo_t flash_utils_ByteArray; -static methodinfo_t flash_utils_ByteArray_writeBoolean; -static methodinfo_t flash_utils_ByteArray_readDouble; -static methodinfo_t flash_utils_ByteArray_toString; -static methodinfo_t flash_utils_ByteArray_writeByte; -static methodinfo_t flash_utils_ByteArray_writeObject; -static methodinfo_t flash_utils_ByteArray_readUTFBytes; -static methodinfo_t flash_utils_ByteArray_writeMultiByte; -static methodinfo_t flash_utils_ByteArray_uncompress; -static methodinfo_t flash_utils_ByteArray_readUnsignedByte; -static methodinfo_t flash_utils_ByteArray_writeInt; -static methodinfo_t flash_utils_ByteArray_deflate; -static methodinfo_t flash_utils_ByteArray_readMultiByte; -static methodinfo_t flash_utils_ByteArray_readBytes; -static methodinfo_t flash_utils_ByteArray_writeShort; -static varinfo_t flash_utils_ByteArray_position; -static methodinfo_t flash_utils_ByteArray_readShort; -static methodinfo_t flash_utils_ByteArray_writeUTF; -static methodinfo_t flash_utils_ByteArray_writeBytes; -static varinfo_t flash_utils_ByteArray_objectEncoding; -static methodinfo_t flash_utils_ByteArray_readObject; -static varinfo_t flash_utils_ByteArray_length; -static methodinfo_t flash_utils_ByteArray_writeUnsignedInt; -static methodinfo_t flash_utils_ByteArray_writeDouble; -static methodinfo_t flash_utils_ByteArray_writeFloat; -static methodinfo_t flash_utils_ByteArray_readInt; -static methodinfo_t flash_utils_ByteArray_readByte; -static varinfo_t flash_utils_ByteArray_bytesAvailable; -static methodinfo_t flash_utils_ByteArray_clear; -static varinfo_t flash_utils_ByteArray_endian; -static methodinfo_t flash_utils_ByteArray_readUnsignedShort; -static methodinfo_t flash_utils_ByteArray_readUnsignedInt; -static methodinfo_t flash_utils_ByteArray_readFloat; -static methodinfo_t flash_utils_ByteArray_compress; -static methodinfo_t flash_utils_ByteArray_writeUTFBytes; -static methodinfo_t flash_utils_ByteArray_readBoolean; -static methodinfo_t flash_utils_ByteArray_inflate; -static methodinfo_t flash_utils_ByteArray_readUTF; -static methodinfo_t flash_utils_ByteArray_writeBoolean; -static methodinfo_t flash_utils_ByteArray_readDouble; -static methodinfo_t flash_utils_ByteArray_toString; -static methodinfo_t flash_utils_ByteArray_writeByte; -static methodinfo_t flash_utils_ByteArray_writeObject; -static methodinfo_t flash_utils_ByteArray_readUTFBytes; -static methodinfo_t flash_utils_ByteArray_writeMultiByte; -static methodinfo_t flash_utils_ByteArray_uncompress; -static methodinfo_t flash_utils_ByteArray_readUnsignedByte; -static methodinfo_t flash_utils_ByteArray_writeInt; -static methodinfo_t flash_utils_ByteArray_deflate; -static methodinfo_t flash_utils_ByteArray_readMultiByte; -static methodinfo_t flash_utils_ByteArray_readBytes; -static methodinfo_t flash_utils_ByteArray_writeShort; -static varinfo_t flash_utils_ByteArray_position; -static methodinfo_t flash_utils_ByteArray_readShort; -static methodinfo_t flash_utils_ByteArray_writeUTF; -static methodinfo_t flash_utils_ByteArray_writeBytes; -static varinfo_t flash_utils_ByteArray_objectEncoding; -static methodinfo_t flash_utils_ByteArray_readObject; -static varinfo_t flash_utils_ByteArray_length; -static methodinfo_t flash_utils_ByteArray_writeUnsignedInt; -static methodinfo_t flash_utils_ByteArray_writeDouble; -static methodinfo_t flash_utils_ByteArray_writeFloat; -static methodinfo_t flash_utils_ByteArray_readInt; -static methodinfo_t flash_utils_ByteArray_readByte; -static varinfo_t flash_utils_ByteArray_bytesAvailable; -static methodinfo_t flash_utils_ByteArray_clear; -static varinfo_t flash_utils_ByteArray_endian; -static methodinfo_t flash_utils_ByteArray_readUnsignedShort; -static methodinfo_t flash_utils_ByteArray_readUnsignedInt; -static methodinfo_t flash_utils_ByteArray_readFloat; -static methodinfo_t flash_utils_ByteArray_compress; -static methodinfo_t flash_utils_ByteArray_writeUTFBytes; -static methodinfo_t flash_utils_ByteArray_readBoolean; -static methodinfo_t flash_utils_ByteArray_inflate; -static methodinfo_t flash_utils_ByteArray_readUTF; -static methodinfo_t flash_sampler_stopSampling; -static classinfo_t flash_events_SyncEvent; -static methodinfo_t flash_events_SyncEvent_toString; -static methodinfo_t flash_events_SyncEvent_clone; -static varinfo_t flash_events_SyncEvent_changeList; -static methodinfo_t flash_events_SyncEvent_toString; -static methodinfo_t flash_events_SyncEvent_clone; -static varinfo_t flash_events_SyncEvent_changeList; -static methodinfo_t _encodeURIComponent; -static classinfo_t flash_net_Socket; -static methodinfo_t flash_net_Socket_writeBoolean; -static methodinfo_t flash_net_Socket_connect; -static methodinfo_t flash_net_Socket_readDouble; -static methodinfo_t flash_net_Socket_writeByte; -static methodinfo_t flash_net_Socket_writeObject; -static methodinfo_t flash_net_Socket_readUTFBytes; -static methodinfo_t flash_net_Socket_close; -static methodinfo_t flash_net_Socket_writeMultiByte; -static methodinfo_t flash_net_Socket_readUnsignedByte; -static methodinfo_t flash_net_Socket_writeInt; -static methodinfo_t flash_net_Socket_readMultiByte; -static methodinfo_t flash_net_Socket_readBytes; -static methodinfo_t flash_net_Socket_writeShort; -static methodinfo_t flash_net_Socket_readShort; -static methodinfo_t flash_net_Socket_writeUTF; -static varinfo_t flash_net_Socket_timeout; -static methodinfo_t flash_net_Socket_writeBytes; -static varinfo_t flash_net_Socket_connected; -static methodinfo_t flash_net_Socket_readObject; -static varinfo_t flash_net_Socket_objectEncoding; -static methodinfo_t flash_net_Socket_flush; -static methodinfo_t flash_net_Socket_writeUnsignedInt; -static methodinfo_t flash_net_Socket_writeDouble; -static methodinfo_t flash_net_Socket_writeFloat; -static methodinfo_t flash_net_Socket_readInt; -static methodinfo_t flash_net_Socket_readByte; -static varinfo_t flash_net_Socket_bytesAvailable; -static varinfo_t flash_net_Socket_endian; -static methodinfo_t flash_net_Socket_readUnsignedShort; -static methodinfo_t flash_net_Socket_readUnsignedInt; -static methodinfo_t flash_net_Socket_readFloat; -static methodinfo_t flash_net_Socket_writeUTFBytes; -static methodinfo_t flash_net_Socket_readBoolean; -static methodinfo_t flash_net_Socket_readUTF; -static methodinfo_t flash_net_Socket_writeBoolean; -static methodinfo_t flash_net_Socket_connect; -static methodinfo_t flash_net_Socket_readDouble; -static methodinfo_t flash_net_Socket_writeByte; -static methodinfo_t flash_net_Socket_writeObject; -static methodinfo_t flash_net_Socket_readUTFBytes; -static methodinfo_t flash_net_Socket_close; -static methodinfo_t flash_net_Socket_writeMultiByte; -static methodinfo_t flash_net_Socket_readUnsignedByte; -static methodinfo_t flash_net_Socket_writeInt; -static methodinfo_t flash_net_Socket_readMultiByte; -static methodinfo_t flash_net_Socket_readBytes; -static methodinfo_t flash_net_Socket_writeShort; -static methodinfo_t flash_net_Socket_readShort; -static methodinfo_t flash_net_Socket_writeUTF; -static varinfo_t flash_net_Socket_timeout; -static methodinfo_t flash_net_Socket_writeBytes; -static varinfo_t flash_net_Socket_connected; -static methodinfo_t flash_net_Socket_readObject; -static varinfo_t flash_net_Socket_objectEncoding; -static methodinfo_t flash_net_Socket_flush; -static methodinfo_t flash_net_Socket_writeUnsignedInt; -static methodinfo_t flash_net_Socket_writeDouble; -static methodinfo_t flash_net_Socket_writeFloat; -static methodinfo_t flash_net_Socket_readInt; -static methodinfo_t flash_net_Socket_readByte; -static varinfo_t flash_net_Socket_bytesAvailable; -static varinfo_t flash_net_Socket_endian; -static methodinfo_t flash_net_Socket_readUnsignedShort; -static methodinfo_t flash_net_Socket_readUnsignedInt; -static methodinfo_t flash_net_Socket_readFloat; -static methodinfo_t flash_net_Socket_writeUTFBytes; -static methodinfo_t flash_net_Socket_readBoolean; -static methodinfo_t flash_net_Socket_readUTF; -static methodinfo_t _unescape; -static classinfo_t flash_utils_Timer; -static methodinfo_t flash_utils_Timer_reset; -static varinfo_t flash_utils_Timer_running; -static varinfo_t flash_utils_Timer_repeatCount; -static methodinfo_t flash_utils_Timer_stop; -static methodinfo_t flash_utils_Timer_start; -static varinfo_t flash_utils_Timer_currentCount; -static varinfo_t flash_utils_Timer_delay; -static methodinfo_t flash_utils_Timer_reset; -static varinfo_t flash_utils_Timer_running; -static varinfo_t flash_utils_Timer_repeatCount; -static methodinfo_t flash_utils_Timer_stop; -static methodinfo_t flash_utils_Timer_start; -static varinfo_t flash_utils_Timer_currentCount; -static varinfo_t flash_utils_Timer_delay; -static classinfo_t _Array; -static methodinfo_t _Array_forEach; -static methodinfo_t _Array_sortOn; -static methodinfo_t _Array_indexOf; -static methodinfo_t _Array_splice; -static methodinfo_t _Array_lastIndexOf; -static methodinfo_t _Array_map; -static methodinfo_t _Array_concat; -static methodinfo_t _Array_shift; -static methodinfo_t _Array_unshift; -static methodinfo_t _Array_some; -static methodinfo_t _Array_filter; -static methodinfo_t _Array_join; -static methodinfo_t _Array_slice; -static methodinfo_t _Array_every; -static methodinfo_t _Array_pop; -static methodinfo_t _Array_sort; -static methodinfo_t _Array_reverse; -static methodinfo_t _Array_push; -static varinfo_t _Array_length; -static methodinfo_t _Array_forEach; -static methodinfo_t _Array_sortOn; -static methodinfo_t _Array_indexOf; -static methodinfo_t _Array_splice; -static methodinfo_t _Array_lastIndexOf; -static methodinfo_t _Array_map; -static methodinfo_t _Array_concat; -static methodinfo_t _Array_shift; -static methodinfo_t _Array_unshift; -static methodinfo_t _Array_some; -static methodinfo_t _Array_filter; -static methodinfo_t _Array_join; -static methodinfo_t _Array_slice; -static methodinfo_t _Array_every; -static methodinfo_t _Array_pop; -static methodinfo_t _Array_sort; -static methodinfo_t _Array_reverse; -static methodinfo_t _Array_push; -static varinfo_t _Array_length; -static classinfo_t flash_geom_ColorTransform; -static varinfo_t flash_geom_ColorTransform_blueOffset; -static varinfo_t flash_geom_ColorTransform_greenOffset; -static varinfo_t flash_geom_ColorTransform_greenMultiplier; -static varinfo_t flash_geom_ColorTransform_redMultiplier; -static varinfo_t flash_geom_ColorTransform_color; -static methodinfo_t flash_geom_ColorTransform_concat; -static varinfo_t flash_geom_ColorTransform_alphaOffset; -static varinfo_t flash_geom_ColorTransform_blueMultiplier; -static methodinfo_t flash_geom_ColorTransform_toString; -static varinfo_t flash_geom_ColorTransform_alphaMultiplier; -static varinfo_t flash_geom_ColorTransform_redOffset; -static varinfo_t flash_geom_ColorTransform_blueOffset; -static varinfo_t flash_geom_ColorTransform_greenOffset; -static varinfo_t flash_geom_ColorTransform_greenMultiplier; -static varinfo_t flash_geom_ColorTransform_redMultiplier; -static varinfo_t flash_geom_ColorTransform_color; -static methodinfo_t flash_geom_ColorTransform_concat; -static varinfo_t flash_geom_ColorTransform_alphaOffset; -static varinfo_t flash_geom_ColorTransform_blueMultiplier; -static methodinfo_t flash_geom_ColorTransform_toString; -static varinfo_t flash_geom_ColorTransform_alphaMultiplier; -static varinfo_t flash_geom_ColorTransform_redOffset; -static classinfo_t flash_text_GridFitType; -static classinfo_t flash_filters_DisplacementMapFilterMode; -static classinfo_t flash_text_TextFieldType; -static classinfo_t flash_display_IGraphicsStroke; -static classinfo_t flash_media_SoundLoaderContext; -static varinfo_t flash_media_SoundLoaderContext_checkPolicyFile; -static varinfo_t flash_media_SoundLoaderContext_bufferTime; -static varinfo_t flash_media_SoundLoaderContext_checkPolicyFile; -static varinfo_t flash_media_SoundLoaderContext_bufferTime; -static classinfo_t flash_net_IDynamicPropertyOutput; -static methodinfo_t flash_net_IDynamicPropertyOutput_writeDynamicProperty; -static methodinfo_t flash_net_IDynamicPropertyOutput_writeDynamicProperty; -static classinfo_t flash_display_IGraphicsData; -static methodinfo_t flash_utils_getDefinitionByName; -static classinfo_t _Function; -static varinfo_t _Function_length; -static methodinfo_t _Function_apply; -static methodinfo_t _Function_call; -static varinfo_t _Function_prototype; -static varinfo_t _Function_length; -static methodinfo_t _Function_apply; -static methodinfo_t _Function_call; -static varinfo_t _Function_prototype; -static classinfo_t flash_geom_PerspectiveProjection; -static varinfo_t flash_geom_PerspectiveProjection_fieldOfView; -static varinfo_t flash_geom_PerspectiveProjection_projectionCenter; -static methodinfo_t flash_geom_PerspectiveProjection_toMatrix3D; -static varinfo_t flash_geom_PerspectiveProjection_focalLength; -static varinfo_t flash_geom_PerspectiveProjection_fieldOfView; -static varinfo_t flash_geom_PerspectiveProjection_projectionCenter; -static methodinfo_t flash_geom_PerspectiveProjection_toMatrix3D; -static varinfo_t flash_geom_PerspectiveProjection_focalLength; -static classinfo_t flash_text_engine_BreakOpportunity; -static methodinfo_t flash_sampler__getInvocationCount; -static methodinfo_t _parseFloat; -static classinfo_t flash_events_NetStatusEvent; -static methodinfo_t flash_events_NetStatusEvent_toString; -static varinfo_t flash_events_NetStatusEvent_info; -static methodinfo_t flash_events_NetStatusEvent_clone; -static methodinfo_t flash_events_NetStatusEvent_toString; -static varinfo_t flash_events_NetStatusEvent_info; -static methodinfo_t flash_events_NetStatusEvent_clone; -static classinfo_t flash_display_ShaderJob; -static methodinfo_t flash_display_ShaderJob_cancel; -static varinfo_t flash_display_ShaderJob_width; -static methodinfo_t flash_display_ShaderJob_start; -static varinfo_t flash_display_ShaderJob_shader; -static varinfo_t flash_display_ShaderJob_height; -static varinfo_t flash_display_ShaderJob_target; -static varinfo_t flash_display_ShaderJob_progress; -static methodinfo_t flash_display_ShaderJob_cancel; -static varinfo_t flash_display_ShaderJob_width; -static methodinfo_t flash_display_ShaderJob_start; -static varinfo_t flash_display_ShaderJob_shader; -static varinfo_t flash_display_ShaderJob_height; -static varinfo_t flash_display_ShaderJob_target; -static varinfo_t flash_display_ShaderJob_progress; -static classinfo_t _VerifyError; -static classinfo_t flash_events_AsyncErrorEvent; -static methodinfo_t flash_events_AsyncErrorEvent_toString; -static varinfo_t flash_events_AsyncErrorEvent_error; -static methodinfo_t flash_events_AsyncErrorEvent_clone; -static methodinfo_t flash_events_AsyncErrorEvent_toString; -static varinfo_t flash_events_AsyncErrorEvent_error; -static methodinfo_t flash_events_AsyncErrorEvent_clone; -static classinfo_t flash_net_SharedObject; -static varinfo_t flash_net_SharedObject_objectEncoding; -static varinfo_t flash_net_SharedObject_client; -static methodinfo_t flash_net_SharedObject_setProperty; -static methodinfo_t flash_net_SharedObject_clear; -static methodinfo_t flash_net_SharedObject_flush; -static methodinfo_t flash_net_SharedObject_connect; -static varinfo_t flash_net_SharedObject_size; -static methodinfo_t flash_net_SharedObject_setDirty; -static methodinfo_t flash_net_SharedObject_send; -static methodinfo_t flash_net_SharedObject_close; -static varinfo_t flash_net_SharedObject_data; -static varinfo_t flash_net_SharedObject_objectEncoding; -static varinfo_t flash_net_SharedObject_client; -static methodinfo_t flash_net_SharedObject_setProperty; -static methodinfo_t flash_net_SharedObject_clear; -static methodinfo_t flash_net_SharedObject_flush; -static methodinfo_t flash_net_SharedObject_connect; -static varinfo_t flash_net_SharedObject_size; -static methodinfo_t flash_net_SharedObject_setDirty; -static methodinfo_t flash_net_SharedObject_send; -static methodinfo_t flash_net_SharedObject_close; -static varinfo_t flash_net_SharedObject_data; -static classinfo_t _Namespace; -static methodinfo_t _Namespace_valueOf; -static methodinfo_t _Namespace_toString; -static varinfo_t _Namespace_uri; -static varinfo_t _Namespace_prefix; -static methodinfo_t _Namespace_valueOf; -static methodinfo_t _Namespace_toString; -static varinfo_t _Namespace_uri; -static varinfo_t _Namespace_prefix; -static methodinfo_t flash_utils_setTimeout; -static classinfo_t flash_geom_Matrix3D; -static methodinfo_t flash_geom_Matrix3D_decompose; -static methodinfo_t flash_geom_Matrix3D_pointAt; -static methodinfo_t flash_geom_Matrix3D_identity; -static methodinfo_t flash_geom_Matrix3D_transformVector; -static methodinfo_t flash_geom_Matrix3D_appendRotation; -static varinfo_t flash_geom_Matrix3D_determinant; -static methodinfo_t flash_geom_Matrix3D_prependRotation; -static varinfo_t flash_geom_Matrix3D_position; -static methodinfo_t flash_geom_Matrix3D_interpolateTo; -static methodinfo_t flash_geom_Matrix3D_appendScale; -static methodinfo_t flash_geom_Matrix3D_prepend; -static methodinfo_t flash_geom_Matrix3D_recompose; -static methodinfo_t flash_geom_Matrix3D_appendTranslation; -static methodinfo_t flash_geom_Matrix3D_invert; -static varinfo_t flash_geom_Matrix3D_rawData; -static methodinfo_t flash_geom_Matrix3D_prependTranslation; -static methodinfo_t flash_geom_Matrix3D_append; -static methodinfo_t flash_geom_Matrix3D_clone; -static methodinfo_t flash_geom_Matrix3D_prependScale; -static methodinfo_t flash_geom_Matrix3D_deltaTransformVector; -static methodinfo_t flash_geom_Matrix3D_transformVectors; -static methodinfo_t flash_geom_Matrix3D_transpose; -static methodinfo_t flash_geom_Matrix3D_decompose; -static methodinfo_t flash_geom_Matrix3D_pointAt; -static methodinfo_t flash_geom_Matrix3D_identity; -static methodinfo_t flash_geom_Matrix3D_transformVector; -static methodinfo_t flash_geom_Matrix3D_appendRotation; -static varinfo_t flash_geom_Matrix3D_determinant; -static methodinfo_t flash_geom_Matrix3D_prependRotation; -static varinfo_t flash_geom_Matrix3D_position; -static methodinfo_t flash_geom_Matrix3D_interpolateTo; -static methodinfo_t flash_geom_Matrix3D_appendScale; -static methodinfo_t flash_geom_Matrix3D_prepend; -static methodinfo_t flash_geom_Matrix3D_recompose; -static methodinfo_t flash_geom_Matrix3D_appendTranslation; -static methodinfo_t flash_geom_Matrix3D_invert; -static varinfo_t flash_geom_Matrix3D_rawData; -static methodinfo_t flash_geom_Matrix3D_prependTranslation; -static methodinfo_t flash_geom_Matrix3D_append; -static methodinfo_t flash_geom_Matrix3D_clone; -static methodinfo_t flash_geom_Matrix3D_prependScale; -static methodinfo_t flash_geom_Matrix3D_deltaTransformVector; -static methodinfo_t flash_geom_Matrix3D_transformVectors; -static methodinfo_t flash_geom_Matrix3D_transpose; -static methodinfo_t flash_sampler_pauseSampling; -static classinfo_t flash_system_Capabilities; -static methodinfo_t flash_sampler_getSetterInvocationCount; -static methodinfo_t flash_sampler_getGetterInvocationCount; -static classinfo_t flash_filters_BlurFilter; -static varinfo_t flash_filters_BlurFilter_blurY; -static methodinfo_t flash_filters_BlurFilter_clone; -static varinfo_t flash_filters_BlurFilter_quality; -static varinfo_t flash_filters_BlurFilter_blurX; -static varinfo_t flash_filters_BlurFilter_blurY; -static methodinfo_t flash_filters_BlurFilter_clone; -static varinfo_t flash_filters_BlurFilter_quality; -static varinfo_t flash_filters_BlurFilter_blurX; -static methodinfo_t _isFinite; -static classinfo_t flash_media_Video; -static methodinfo_t flash_media_Video_attachCamera; -static varinfo_t flash_media_Video_videoWidth; -static methodinfo_t flash_media_Video_clear; -static varinfo_t flash_media_Video_deblocking; -static varinfo_t flash_media_Video_videoHeight; -static methodinfo_t flash_media_Video_attachNetStream; -static varinfo_t flash_media_Video_smoothing; -static methodinfo_t flash_media_Video_attachCamera; -static varinfo_t flash_media_Video_videoWidth; -static methodinfo_t flash_media_Video_clear; -static varinfo_t flash_media_Video_deblocking; -static varinfo_t flash_media_Video_videoHeight; -static methodinfo_t flash_media_Video_attachNetStream; -static varinfo_t flash_media_Video_smoothing; -static classinfo_t flash_text_engine_TextLineCreationResult; -static classinfo_t _Error; -static varinfo_t _Error_message; -static varinfo_t _Error_errorID; -static methodinfo_t _Error_getStackTrace; -static varinfo_t _Error_name; -static varinfo_t _Error_message; -static varinfo_t _Error_errorID; -static methodinfo_t _Error_getStackTrace; -static varinfo_t _Error_name; -static classinfo_t flash_xml_XMLNode; -static varinfo_t flash_xml_XMLNode_childNodes; -static methodinfo_t flash_xml_XMLNode_appendChild; -static varinfo_t flash_xml_XMLNode_nextSibling; -static varinfo_t flash_xml_XMLNode_nodeType; -static varinfo_t flash_xml_XMLNode_attributes; -static varinfo_t flash_xml_XMLNode_firstChild; -static varinfo_t flash_xml_XMLNode_parentNode; -static methodinfo_t flash_xml_XMLNode_toString; -static varinfo_t flash_xml_XMLNode_prefix; -static varinfo_t flash_xml_XMLNode_localName; -static varinfo_t flash_xml_XMLNode_nodeName; -static methodinfo_t flash_xml_XMLNode_getNamespaceForPrefix; -static methodinfo_t flash_xml_XMLNode_insertBefore; -static varinfo_t flash_xml_XMLNode_lastChild; -static methodinfo_t flash_xml_XMLNode_cloneNode; -static methodinfo_t flash_xml_XMLNode_removeNode; -static varinfo_t flash_xml_XMLNode_namespaceURI; -static varinfo_t flash_xml_XMLNode_previousSibling; -static methodinfo_t flash_xml_XMLNode_hasChildNodes; -static methodinfo_t flash_xml_XMLNode_getPrefixForNamespace; -static varinfo_t flash_xml_XMLNode_nodeValue; -static varinfo_t flash_xml_XMLNode_childNodes; -static methodinfo_t flash_xml_XMLNode_appendChild; -static varinfo_t flash_xml_XMLNode_nextSibling; -static varinfo_t flash_xml_XMLNode_nodeType; -static varinfo_t flash_xml_XMLNode_attributes; -static varinfo_t flash_xml_XMLNode_firstChild; -static varinfo_t flash_xml_XMLNode_parentNode; -static methodinfo_t flash_xml_XMLNode_toString; -static varinfo_t flash_xml_XMLNode_prefix; -static varinfo_t flash_xml_XMLNode_localName; -static varinfo_t flash_xml_XMLNode_nodeName; -static methodinfo_t flash_xml_XMLNode_getNamespaceForPrefix; -static methodinfo_t flash_xml_XMLNode_insertBefore; -static varinfo_t flash_xml_XMLNode_lastChild; -static methodinfo_t flash_xml_XMLNode_cloneNode; -static methodinfo_t flash_xml_XMLNode_removeNode; -static varinfo_t flash_xml_XMLNode_namespaceURI; -static varinfo_t flash_xml_XMLNode_previousSibling; -static methodinfo_t flash_xml_XMLNode_hasChildNodes; -static methodinfo_t flash_xml_XMLNode_getPrefixForNamespace; -static varinfo_t flash_xml_XMLNode_nodeValue; -static classinfo_t flash_net_URLVariables; -static methodinfo_t flash_net_URLVariables_toString; -static methodinfo_t flash_net_URLVariables_decode; -static methodinfo_t flash_net_URLVariables_toString; -static methodinfo_t flash_net_URLVariables_decode; -static classinfo_t flash_display_LoaderInfo; -static varinfo_t flash_display_LoaderInfo_actionScriptVersion; -static varinfo_t flash_display_LoaderInfo_contentType; -static varinfo_t flash_display_LoaderInfo_sameDomain; -static varinfo_t flash_display_LoaderInfo_bytesTotal; -static varinfo_t flash_display_LoaderInfo_loaderURL; -static varinfo_t flash_display_LoaderInfo_width; -static methodinfo_t flash_display_LoaderInfo_dispatchEvent; -static varinfo_t flash_display_LoaderInfo_height; -static varinfo_t flash_display_LoaderInfo_frameRate; -static varinfo_t flash_display_LoaderInfo_parameters; -static varinfo_t flash_display_LoaderInfo_bytesLoaded; -static varinfo_t flash_display_LoaderInfo_url; -static varinfo_t flash_display_LoaderInfo_content; -static varinfo_t flash_display_LoaderInfo_swfVersion; -static varinfo_t flash_display_LoaderInfo_bytes; -static varinfo_t flash_display_LoaderInfo_loader; -static varinfo_t flash_display_LoaderInfo_applicationDomain; -static varinfo_t flash_display_LoaderInfo_parentAllowsChild; -static varinfo_t flash_display_LoaderInfo_childAllowsParent; -static varinfo_t flash_display_LoaderInfo_sharedEvents; -static varinfo_t flash_display_LoaderInfo_actionScriptVersion; -static varinfo_t flash_display_LoaderInfo_contentType; -static varinfo_t flash_display_LoaderInfo_sameDomain; -static varinfo_t flash_display_LoaderInfo_bytesTotal; -static varinfo_t flash_display_LoaderInfo_loaderURL; -static varinfo_t flash_display_LoaderInfo_width; -static methodinfo_t flash_display_LoaderInfo_dispatchEvent; -static varinfo_t flash_display_LoaderInfo_height; -static varinfo_t flash_display_LoaderInfo_frameRate; -static varinfo_t flash_display_LoaderInfo_parameters; -static varinfo_t flash_display_LoaderInfo_bytesLoaded; -static varinfo_t flash_display_LoaderInfo_url; -static varinfo_t flash_display_LoaderInfo_content; -static varinfo_t flash_display_LoaderInfo_swfVersion; -static varinfo_t flash_display_LoaderInfo_bytes; -static varinfo_t flash_display_LoaderInfo_loader; -static varinfo_t flash_display_LoaderInfo_applicationDomain; -static varinfo_t flash_display_LoaderInfo_parentAllowsChild; -static varinfo_t flash_display_LoaderInfo_childAllowsParent; -static varinfo_t flash_display_LoaderInfo_sharedEvents; -static classinfo_t flash_sampler_Sample; -static varinfo_t flash_sampler_Sample_time; -static varinfo_t flash_sampler_Sample_stack; -static varinfo_t flash_sampler_Sample_time; -static varinfo_t flash_sampler_Sample_stack; -static classinfo_t flash_text_engine_DigitWidth; -static classinfo_t flash_net_URLRequestMethod; -static methodinfo_t adobe_utils_MMExecute; -static classinfo_t flash_system_System; -static classinfo_t flash_filters_BitmapFilterQuality; -static classinfo_t flash_display_DisplayObjectContainer; -static methodinfo_t flash_display_DisplayObjectContainer_addChild; -static methodinfo_t flash_display_DisplayObjectContainer_getObjectsUnderPoint; -static methodinfo_t flash_display_DisplayObjectContainer_removeChildAt; -static methodinfo_t flash_display_DisplayObjectContainer_swapChildren; -static methodinfo_t flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint; -static methodinfo_t flash_display_DisplayObjectContainer_setChildIndex; -static varinfo_t flash_display_DisplayObjectContainer_numChildren; -static methodinfo_t flash_display_DisplayObjectContainer_getChildIndex; -static methodinfo_t flash_display_DisplayObjectContainer_getChildAt; -static methodinfo_t flash_display_DisplayObjectContainer_removeChild; -static methodinfo_t flash_display_DisplayObjectContainer_addChildAt; -static methodinfo_t flash_display_DisplayObjectContainer_contains; -static methodinfo_t flash_display_DisplayObjectContainer_getChildByName; -static methodinfo_t flash_display_DisplayObjectContainer_swapChildrenAt; -static varinfo_t flash_display_DisplayObjectContainer_mouseChildren; -static varinfo_t flash_display_DisplayObjectContainer_tabChildren; -static varinfo_t flash_display_DisplayObjectContainer_textSnapshot; -static methodinfo_t flash_display_DisplayObjectContainer_addChild; -static methodinfo_t flash_display_DisplayObjectContainer_getObjectsUnderPoint; -static methodinfo_t flash_display_DisplayObjectContainer_removeChildAt; -static methodinfo_t flash_display_DisplayObjectContainer_swapChildren; -static methodinfo_t flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint; -static methodinfo_t flash_display_DisplayObjectContainer_setChildIndex; -static varinfo_t flash_display_DisplayObjectContainer_numChildren; -static methodinfo_t flash_display_DisplayObjectContainer_getChildIndex; -static methodinfo_t flash_display_DisplayObjectContainer_getChildAt; -static methodinfo_t flash_display_DisplayObjectContainer_removeChild; -static methodinfo_t flash_display_DisplayObjectContainer_addChildAt; -static methodinfo_t flash_display_DisplayObjectContainer_contains; -static methodinfo_t flash_display_DisplayObjectContainer_getChildByName; -static methodinfo_t flash_display_DisplayObjectContainer_swapChildrenAt; -static varinfo_t flash_display_DisplayObjectContainer_mouseChildren; -static varinfo_t flash_display_DisplayObjectContainer_tabChildren; -static varinfo_t flash_display_DisplayObjectContainer_textSnapshot; -static classinfo_t flash_system_LoaderContext; -static varinfo_t flash_system_LoaderContext_checkPolicyFile; -static varinfo_t flash_system_LoaderContext_securityDomain; -static varinfo_t flash_system_LoaderContext_applicationDomain; -static varinfo_t flash_system_LoaderContext_checkPolicyFile; -static varinfo_t flash_system_LoaderContext_securityDomain; -static varinfo_t flash_system_LoaderContext_applicationDomain; -static methodinfo_t flash_utils_clearTimeout; -static methodinfo_t _isXMLName; -static classinfo_t flash_xml_XMLNodeType; -static classinfo_t flash_events_ErrorEvent; -static methodinfo_t flash_events_ErrorEvent_toString; -static methodinfo_t flash_events_ErrorEvent_clone; -static methodinfo_t flash_events_ErrorEvent_toString; -static methodinfo_t flash_events_ErrorEvent_clone; -static classinfo_t flash_utils_IDataOutput; -static methodinfo_t flash_utils_IDataOutput_writeUnsignedInt; -static methodinfo_t flash_utils_IDataOutput_writeInt; -static varinfo_t flash_utils_IDataOutput_objectEncoding; -static methodinfo_t flash_utils_IDataOutput_writeUTFBytes; -static methodinfo_t flash_utils_IDataOutput_writeObject; -static methodinfo_t flash_utils_IDataOutput_writeMultiByte; -static methodinfo_t flash_utils_IDataOutput_writeShort; -static methodinfo_t flash_utils_IDataOutput_writeFloat; -static methodinfo_t flash_utils_IDataOutput_writeUTF; -static methodinfo_t flash_utils_IDataOutput_writeByte; -static methodinfo_t flash_utils_IDataOutput_writeBoolean; -static methodinfo_t flash_utils_IDataOutput_writeDouble; -static methodinfo_t flash_utils_IDataOutput_writeBytes; -static varinfo_t flash_utils_IDataOutput_endian; -static methodinfo_t flash_utils_IDataOutput_writeUnsignedInt; -static methodinfo_t flash_utils_IDataOutput_writeInt; -static varinfo_t flash_utils_IDataOutput_objectEncoding; -static methodinfo_t flash_utils_IDataOutput_writeUTFBytes; -static methodinfo_t flash_utils_IDataOutput_writeObject; -static methodinfo_t flash_utils_IDataOutput_writeMultiByte; -static methodinfo_t flash_utils_IDataOutput_writeShort; -static methodinfo_t flash_utils_IDataOutput_writeFloat; -static methodinfo_t flash_utils_IDataOutput_writeUTF; -static methodinfo_t flash_utils_IDataOutput_writeByte; -static methodinfo_t flash_utils_IDataOutput_writeBoolean; -static methodinfo_t flash_utils_IDataOutput_writeDouble; -static methodinfo_t flash_utils_IDataOutput_writeBytes; -static varinfo_t flash_utils_IDataOutput_endian; -static classinfo_t flash_geom_Utils3D; -static classinfo_t flash_events_TextEvent; -static methodinfo_t flash_events_TextEvent_toString; -static varinfo_t flash_events_TextEvent_text; -static methodinfo_t flash_events_TextEvent_clone; -static methodinfo_t flash_events_TextEvent_toString; -static varinfo_t flash_events_TextEvent_text; -static methodinfo_t flash_events_TextEvent_clone; -static classinfo_t flash_utils_Proxy; -static methodinfo_t flash_utils_Proxy_callProperty; -static methodinfo_t flash_utils_Proxy_setProperty; -static methodinfo_t flash_utils_Proxy_getProperty; -static methodinfo_t flash_utils_Proxy_nextName; -static methodinfo_t flash_utils_Proxy_nextNameIndex; -static methodinfo_t flash_utils_Proxy_hasProperty; -static methodinfo_t flash_utils_Proxy_deleteProperty; -static methodinfo_t flash_utils_Proxy_getDescendants; -static methodinfo_t flash_utils_Proxy_isAttribute; -static methodinfo_t flash_utils_Proxy_nextValue; -static methodinfo_t flash_utils_Proxy_callProperty; -static methodinfo_t flash_utils_Proxy_setProperty; -static methodinfo_t flash_utils_Proxy_getProperty; -static methodinfo_t flash_utils_Proxy_nextName; -static methodinfo_t flash_utils_Proxy_nextNameIndex; -static methodinfo_t flash_utils_Proxy_hasProperty; -static methodinfo_t flash_utils_Proxy_deleteProperty; -static methodinfo_t flash_utils_Proxy_getDescendants; -static methodinfo_t flash_utils_Proxy_isAttribute; -static methodinfo_t flash_utils_Proxy_nextValue; -static classinfo_t flash_text_engine_FontPosture; -static classinfo_t flash_xml_XMLDocument; -static varinfo_t flash_xml_XMLDocument_docTypeDecl; -static varinfo_t flash_xml_XMLDocument_idMap; -static methodinfo_t flash_xml_XMLDocument_toString; -static varinfo_t flash_xml_XMLDocument_xmlDecl; -static methodinfo_t flash_xml_XMLDocument_createElement; -static varinfo_t flash_xml_XMLDocument_ignoreWhite; -static methodinfo_t flash_xml_XMLDocument_createTextNode; -static methodinfo_t flash_xml_XMLDocument_parseXML; -static varinfo_t flash_xml_XMLDocument_docTypeDecl; -static varinfo_t flash_xml_XMLDocument_idMap; -static methodinfo_t flash_xml_XMLDocument_toString; -static varinfo_t flash_xml_XMLDocument_xmlDecl; -static methodinfo_t flash_xml_XMLDocument_createElement; -static varinfo_t flash_xml_XMLDocument_ignoreWhite; -static methodinfo_t flash_xml_XMLDocument_createTextNode; -static methodinfo_t flash_xml_XMLDocument_parseXML; -static classinfo_t flash_display_ShaderInput; -static varinfo_t flash_display_ShaderInput_width; -static varinfo_t flash_display_ShaderInput_input; -static varinfo_t flash_display_ShaderInput_height; -static varinfo_t flash_display_ShaderInput_index; -static varinfo_t flash_display_ShaderInput_channels; -static varinfo_t flash_display_ShaderInput_width; -static varinfo_t flash_display_ShaderInput_input; -static varinfo_t flash_display_ShaderInput_height; -static varinfo_t flash_display_ShaderInput_index; -static varinfo_t flash_display_ShaderInput_channels; -static classinfo_t flash_text_engine_TextBlock; -static methodinfo_t flash_text_engine_TextBlock_createTextLine; -static varinfo_t flash_text_engine_TextBlock_bidiLevel; -static methodinfo_t flash_text_engine_TextBlock_getTextLineAtCharIndex; -static varinfo_t flash_text_engine_TextBlock_lastLine; -static methodinfo_t flash_text_engine_TextBlock_findPreviousWordBoundary; -static methodinfo_t flash_text_engine_TextBlock_findPreviousAtomBoundary; -static varinfo_t flash_text_engine_TextBlock_baselineZero; -static varinfo_t flash_text_engine_TextBlock_applyNonLinearFontScaling; -static varinfo_t flash_text_engine_TextBlock_firstLine; -static varinfo_t flash_text_engine_TextBlock_textJustifier; -static methodinfo_t flash_text_engine_TextBlock_releaseLines; -static varinfo_t flash_text_engine_TextBlock_firstInvalidLine; -static varinfo_t flash_text_engine_TextBlock_baselineFontSize; -static varinfo_t flash_text_engine_TextBlock_lineRotation; -static varinfo_t flash_text_engine_TextBlock_userData; -static varinfo_t flash_text_engine_TextBlock_content; -static varinfo_t flash_text_engine_TextBlock_textLineCreationResult; -static varinfo_t flash_text_engine_TextBlock_baselineFontDescription; -static methodinfo_t flash_text_engine_TextBlock_findNextAtomBoundary; -static methodinfo_t flash_text_engine_TextBlock_findNextWordBoundary; -static varinfo_t flash_text_engine_TextBlock_tabStops; -static methodinfo_t flash_text_engine_TextBlock_dump; -static methodinfo_t flash_text_engine_TextBlock_createTextLine; -static varinfo_t flash_text_engine_TextBlock_bidiLevel; -static methodinfo_t flash_text_engine_TextBlock_getTextLineAtCharIndex; -static varinfo_t flash_text_engine_TextBlock_lastLine; -static methodinfo_t flash_text_engine_TextBlock_findPreviousWordBoundary; -static methodinfo_t flash_text_engine_TextBlock_findPreviousAtomBoundary; -static varinfo_t flash_text_engine_TextBlock_baselineZero; -static varinfo_t flash_text_engine_TextBlock_applyNonLinearFontScaling; -static varinfo_t flash_text_engine_TextBlock_firstLine; -static varinfo_t flash_text_engine_TextBlock_textJustifier; -static methodinfo_t flash_text_engine_TextBlock_releaseLines; -static varinfo_t flash_text_engine_TextBlock_firstInvalidLine; -static varinfo_t flash_text_engine_TextBlock_baselineFontSize; -static varinfo_t flash_text_engine_TextBlock_lineRotation; -static varinfo_t flash_text_engine_TextBlock_userData; -static varinfo_t flash_text_engine_TextBlock_content; -static varinfo_t flash_text_engine_TextBlock_textLineCreationResult; -static varinfo_t flash_text_engine_TextBlock_baselineFontDescription; -static methodinfo_t flash_text_engine_TextBlock_findNextAtomBoundary; -static methodinfo_t flash_text_engine_TextBlock_findNextWordBoundary; -static varinfo_t flash_text_engine_TextBlock_tabStops; -static methodinfo_t flash_text_engine_TextBlock_dump; -static classinfo_t flash_ui_MouseCursor; -static varinfo_t flash_utils_flash_proxy; -static classinfo_t flash_display_MorphShape; -static classinfo_t flash_text_TextDisplayMode; -static classinfo_t flash_net_URLLoaderDataFormat; -static classinfo_t flash_display_StageQuality; -static classinfo_t flash_display_Sprite; -static methodinfo_t flash_display_Sprite_stopDrag; -static varinfo_t flash_display_Sprite_buttonMode; -static varinfo_t flash_display_Sprite_soundTransform; -static varinfo_t flash_display_Sprite_hitArea; -static varinfo_t flash_display_Sprite_useHandCursor; -static varinfo_t flash_display_Sprite_graphics; -static methodinfo_t flash_display_Sprite_startDrag; -static varinfo_t flash_display_Sprite_dropTarget; -static methodinfo_t flash_display_Sprite_stopDrag; -static varinfo_t flash_display_Sprite_buttonMode; -static varinfo_t flash_display_Sprite_soundTransform; -static varinfo_t flash_display_Sprite_hitArea; -static varinfo_t flash_display_Sprite_useHandCursor; -static varinfo_t flash_display_Sprite_graphics; -static methodinfo_t flash_display_Sprite_startDrag; -static varinfo_t flash_display_Sprite_dropTarget; -static classinfo_t flash_ui_Keyboard; -static classinfo_t flash_filters_DisplacementMapFilter; -static varinfo_t flash_filters_DisplacementMapFilter_scaleY; -static varinfo_t flash_filters_DisplacementMapFilter_mapPoint; -static varinfo_t flash_filters_DisplacementMapFilter_scaleX; -static varinfo_t flash_filters_DisplacementMapFilter_mapBitmap; -static varinfo_t flash_filters_DisplacementMapFilter_mode; -static varinfo_t flash_filters_DisplacementMapFilter_color; -static varinfo_t flash_filters_DisplacementMapFilter_componentX; -static methodinfo_t flash_filters_DisplacementMapFilter_clone; -static varinfo_t flash_filters_DisplacementMapFilter_alpha; -static varinfo_t flash_filters_DisplacementMapFilter_componentY; -static varinfo_t flash_filters_DisplacementMapFilter_scaleY; -static varinfo_t flash_filters_DisplacementMapFilter_mapPoint; -static varinfo_t flash_filters_DisplacementMapFilter_scaleX; -static varinfo_t flash_filters_DisplacementMapFilter_mapBitmap; -static varinfo_t flash_filters_DisplacementMapFilter_mode; -static varinfo_t flash_filters_DisplacementMapFilter_color; -static varinfo_t flash_filters_DisplacementMapFilter_componentX; -static methodinfo_t flash_filters_DisplacementMapFilter_clone; -static varinfo_t flash_filters_DisplacementMapFilter_alpha; -static varinfo_t flash_filters_DisplacementMapFilter_componentY; -static methodinfo_t flash_utils_escapeMultiByte; -static methodinfo_t adobe_utils_MMEndCommand; -static classinfo_t flash_display_GradientType; -static classinfo_t flash_media_ID3Info; -static varinfo_t flash_media_ID3Info_comment; -static varinfo_t flash_media_ID3Info_year; -static varinfo_t flash_media_ID3Info_track; -static varinfo_t flash_media_ID3Info_artist; -static varinfo_t flash_media_ID3Info_songName; -static varinfo_t flash_media_ID3Info_genre; -static varinfo_t flash_media_ID3Info_album; -static varinfo_t flash_media_ID3Info_comment; -static varinfo_t flash_media_ID3Info_year; -static varinfo_t flash_media_ID3Info_track; -static varinfo_t flash_media_ID3Info_artist; -static varinfo_t flash_media_ID3Info_songName; -static varinfo_t flash_media_ID3Info_genre; -static varinfo_t flash_media_ID3Info_album; -static classinfo_t flash_display_GraphicsSolidFill; -static varinfo_t flash_display_GraphicsSolidFill_color; -static varinfo_t flash_display_GraphicsSolidFill_alpha; -static varinfo_t flash_display_GraphicsSolidFill_color; -static varinfo_t flash_display_GraphicsSolidFill_alpha; -static classinfo_t flash_filters_ColorMatrixFilter; -static varinfo_t flash_filters_ColorMatrixFilter_matrix; -static methodinfo_t flash_filters_ColorMatrixFilter_clone; -static varinfo_t flash_filters_ColorMatrixFilter_matrix; -static methodinfo_t flash_filters_ColorMatrixFilter_clone; -static classinfo_t flash_net_NetStreamPlayTransitions; -static classinfo_t flash_media_SoundCodec; -static classinfo_t flash_net_ObjectEncoding; -static classinfo_t flash_text_engine_GroupElement; -static methodinfo_t flash_text_engine_GroupElement_groupElements; -static methodinfo_t flash_text_engine_GroupElement_splitTextElement; -static methodinfo_t flash_text_engine_GroupElement_mergeTextElements; -static methodinfo_t flash_text_engine_GroupElement_getElementAtCharIndex; -static varinfo_t flash_text_engine_GroupElement_elementCount; -static methodinfo_t flash_text_engine_GroupElement_setElements; -static methodinfo_t flash_text_engine_GroupElement_getElementAt; -static methodinfo_t flash_text_engine_GroupElement_ungroupElements; -static methodinfo_t flash_text_engine_GroupElement_replaceElements; -static methodinfo_t flash_text_engine_GroupElement_getElementIndex; -static methodinfo_t flash_text_engine_GroupElement_groupElements; -static methodinfo_t flash_text_engine_GroupElement_splitTextElement; -static methodinfo_t flash_text_engine_GroupElement_mergeTextElements; -static methodinfo_t flash_text_engine_GroupElement_getElementAtCharIndex; -static varinfo_t flash_text_engine_GroupElement_elementCount; -static methodinfo_t flash_text_engine_GroupElement_setElements; -static methodinfo_t flash_text_engine_GroupElement_getElementAt; -static methodinfo_t flash_text_engine_GroupElement_ungroupElements; -static methodinfo_t flash_text_engine_GroupElement_replaceElements; -static methodinfo_t flash_text_engine_GroupElement_getElementIndex; -static methodinfo_t _parseInt; -static classinfo_t _QName; -static varinfo_t _QName_localName; -static methodinfo_t _QName_valueOf; -static methodinfo_t _QName_toString; -static varinfo_t _QName_uri; -static varinfo_t _QName_localName; -static methodinfo_t _QName_valueOf; -static methodinfo_t _QName_toString; -static varinfo_t _QName_uri; -static classinfo_t _UninitializedError; -static classinfo_t _Date; -static methodinfo_t _Date_getTimezoneOffset; -static methodinfo_t _Date_getTime; -static methodinfo_t _Date_setUTCMilliseconds; -static varinfo_t _Date_month; -static methodinfo_t _Date_toString; -static methodinfo_t _Date_getHours; -static varinfo_t _Date_date; -static varinfo_t _Date_milliseconds; -static methodinfo_t _Date_setSeconds; -static methodinfo_t _Date_getDate; -static varinfo_t _Date_hoursUTC; -static methodinfo_t _Date_getUTCDate; -static varinfo_t _Date_timezoneOffset; -static methodinfo_t _Date_setTime; -static varinfo_t _Date_millisecondsUTC; -static varinfo_t _Date_minutes; -static methodinfo_t _Date_setUTCHours; -static varinfo_t _Date_minutesUTC; -static methodinfo_t _Date_toLocaleTimeString; -static varinfo_t _Date_fullYearUTC; -static varinfo_t _Date_time; -static varinfo_t _Date_monthUTC; -static methodinfo_t _Date_getUTCMilliseconds; -static methodinfo_t _Date_toDateString; -static methodinfo_t _Date_getMonth; -static methodinfo_t _Date_setMinutes; -static methodinfo_t _Date_toLocaleDateString; -static varinfo_t _Date_fullYear; -static methodinfo_t _Date_getUTCFullYear; -static methodinfo_t _Date_getSeconds; -static varinfo_t _Date_dateUTC; -static methodinfo_t _Date_getMilliseconds; -static methodinfo_t _Date_setUTCMinutes; -static varinfo_t _Date_day; -static methodinfo_t _Date_setUTCSeconds; -static methodinfo_t _Date_setUTCDate; -static methodinfo_t _Date_getUTCMonth; -static methodinfo_t _Date_valueOf; -static varinfo_t _Date_seconds; -static methodinfo_t _Date_getUTCMinutes; -static methodinfo_t _Date_setDate; -static methodinfo_t _Date_getFullYear; -static methodinfo_t _Date_setFullYear; -static methodinfo_t _Date_setHours; -static methodinfo_t _Date_setMonth; -static methodinfo_t _Date_getUTCSeconds; -static methodinfo_t _Date_getMinutes; -static methodinfo_t _Date_toLocaleString; -static methodinfo_t _Date_toUTCString; -static varinfo_t _Date_dayUTC; -static methodinfo_t _Date_getDay; -static methodinfo_t _Date_setUTCMonth; -static varinfo_t _Date_hours; -static methodinfo_t _Date_getUTCDay; -static methodinfo_t _Date_setUTCFullYear; -static varinfo_t _Date_secondsUTC; -static methodinfo_t _Date_toTimeString; -static methodinfo_t _Date_setMilliseconds; -static methodinfo_t _Date_getUTCHours; -static methodinfo_t _Date_getTimezoneOffset; -static methodinfo_t _Date_getTime; -static methodinfo_t _Date_setUTCMilliseconds; -static varinfo_t _Date_month; -static methodinfo_t _Date_toString; -static methodinfo_t _Date_getHours; -static varinfo_t _Date_date; -static varinfo_t _Date_milliseconds; -static methodinfo_t _Date_setSeconds; -static methodinfo_t _Date_getDate; -static varinfo_t _Date_hoursUTC; -static methodinfo_t _Date_getUTCDate; -static varinfo_t _Date_timezoneOffset; -static methodinfo_t _Date_setTime; -static varinfo_t _Date_millisecondsUTC; -static varinfo_t _Date_minutes; -static methodinfo_t _Date_setUTCHours; -static varinfo_t _Date_minutesUTC; -static methodinfo_t _Date_toLocaleTimeString; -static varinfo_t _Date_fullYearUTC; -static varinfo_t _Date_time; -static varinfo_t _Date_monthUTC; -static methodinfo_t _Date_getUTCMilliseconds; -static methodinfo_t _Date_toDateString; -static methodinfo_t _Date_getMonth; -static methodinfo_t _Date_setMinutes; -static methodinfo_t _Date_toLocaleDateString; -static varinfo_t _Date_fullYear; -static methodinfo_t _Date_getUTCFullYear; -static methodinfo_t _Date_getSeconds; -static varinfo_t _Date_dateUTC; -static methodinfo_t _Date_getMilliseconds; -static methodinfo_t _Date_setUTCMinutes; -static varinfo_t _Date_day; -static methodinfo_t _Date_setUTCSeconds; -static methodinfo_t _Date_setUTCDate; -static methodinfo_t _Date_getUTCMonth; -static methodinfo_t _Date_valueOf; -static varinfo_t _Date_seconds; -static methodinfo_t _Date_getUTCMinutes; -static methodinfo_t _Date_setDate; -static methodinfo_t _Date_getFullYear; -static methodinfo_t _Date_setFullYear; -static methodinfo_t _Date_setHours; -static methodinfo_t _Date_setMonth; -static methodinfo_t _Date_getUTCSeconds; -static methodinfo_t _Date_getMinutes; -static methodinfo_t _Date_toLocaleString; -static methodinfo_t _Date_toUTCString; -static varinfo_t _Date_dayUTC; -static methodinfo_t _Date_getDay; -static methodinfo_t _Date_setUTCMonth; -static varinfo_t _Date_hours; -static methodinfo_t _Date_getUTCDay; -static methodinfo_t _Date_setUTCFullYear; -static varinfo_t _Date_secondsUTC; -static methodinfo_t _Date_toTimeString; -static methodinfo_t _Date_setMilliseconds; -static methodinfo_t _Date_getUTCHours; -static classinfo_t flash_text_StyleSheet; -static varinfo_t flash_text_StyleSheet_styleNames; -static methodinfo_t flash_text_StyleSheet_clear; -static methodinfo_t flash_text_StyleSheet_transform; -static methodinfo_t flash_text_StyleSheet_getStyle; -static methodinfo_t flash_text_StyleSheet_parseCSS; -static methodinfo_t flash_text_StyleSheet_setStyle; -static varinfo_t flash_text_StyleSheet_styleNames; -static methodinfo_t flash_text_StyleSheet_clear; -static methodinfo_t flash_text_StyleSheet_transform; -static methodinfo_t flash_text_StyleSheet_getStyle; -static methodinfo_t flash_text_StyleSheet_parseCSS; -static methodinfo_t flash_text_StyleSheet_setStyle; -static classinfo_t flash_display_ActionScriptVersion; -static classinfo_t flash_text_engine_EastAsianJustifier; -static varinfo_t flash_text_engine_EastAsianJustifier_justificationStyle; -static methodinfo_t flash_text_engine_EastAsianJustifier_clone; -static varinfo_t flash_text_engine_EastAsianJustifier_justificationStyle; -static methodinfo_t flash_text_engine_EastAsianJustifier_clone; -static classinfo_t _String; -static methodinfo_t _String_indexOf; -static methodinfo_t _String_replace; -static methodinfo_t _String_lastIndexOf; -static methodinfo_t _String_valueOf; -static methodinfo_t _String_concat; -static methodinfo_t _String_substr; -static methodinfo_t _String_slice; -static methodinfo_t _String_search; -static methodinfo_t _String_toLocaleUpperCase; -static methodinfo_t _String_toString; -static methodinfo_t _String_toUpperCase; -static methodinfo_t _String_charAt; -static methodinfo_t _String_match; -static methodinfo_t _String_charCodeAt; -static methodinfo_t _String_substring; -static methodinfo_t _String_localeCompare; -static methodinfo_t _String_split; -static methodinfo_t _String_toLocaleLowerCase; -static varinfo_t _String_length; -static methodinfo_t _String_toLowerCase; -static methodinfo_t _String_indexOf; -static methodinfo_t _String_replace; -static methodinfo_t _String_lastIndexOf; -static methodinfo_t _String_valueOf; -static methodinfo_t _String_concat; -static methodinfo_t _String_substr; -static methodinfo_t _String_slice; -static methodinfo_t _String_search; -static methodinfo_t _String_toLocaleUpperCase; -static methodinfo_t _String_toString; -static methodinfo_t _String_toUpperCase; -static methodinfo_t _String_charAt; -static methodinfo_t _String_match; -static methodinfo_t _String_charCodeAt; -static methodinfo_t _String_substring; -static methodinfo_t _String_localeCompare; -static methodinfo_t _String_split; -static methodinfo_t _String_toLocaleLowerCase; -static varinfo_t _String_length; -static methodinfo_t _String_toLowerCase; -static classinfo_t flash_media_SoundChannel; -static varinfo_t flash_media_SoundChannel_leftPeak; -static methodinfo_t flash_media_SoundChannel_stop; -static varinfo_t flash_media_SoundChannel_position; -static varinfo_t flash_media_SoundChannel_soundTransform; -static varinfo_t flash_media_SoundChannel_rightPeak; -static varinfo_t flash_media_SoundChannel_leftPeak; -static methodinfo_t flash_media_SoundChannel_stop; -static varinfo_t flash_media_SoundChannel_position; -static varinfo_t flash_media_SoundChannel_soundTransform; -static varinfo_t flash_media_SoundChannel_rightPeak; -static classinfo_t flash_desktop_Clipboard; -static methodinfo_t flash_desktop_Clipboard_setDataHandler; -static methodinfo_t flash_desktop_Clipboard_setData; -static varinfo_t flash_desktop_Clipboard_formats; -static methodinfo_t flash_desktop_Clipboard_clear; -static methodinfo_t flash_desktop_Clipboard_getData; -static methodinfo_t flash_desktop_Clipboard_hasFormat; -static methodinfo_t flash_desktop_Clipboard_clearData; -static methodinfo_t flash_desktop_Clipboard_setDataHandler; -static methodinfo_t flash_desktop_Clipboard_setData; -static varinfo_t flash_desktop_Clipboard_formats; -static methodinfo_t flash_desktop_Clipboard_clear; -static methodinfo_t flash_desktop_Clipboard_getData; -static methodinfo_t flash_desktop_Clipboard_hasFormat; -static methodinfo_t flash_desktop_Clipboard_clearData; -static classinfo_t flash_display_IBitmapDrawable; -static classinfo_t _TypeError; -static classinfo_t _int; -static methodinfo_t _int_valueOf; -static methodinfo_t _int_toString; -static methodinfo_t _int_toExponential; -static methodinfo_t _int_toFixed; -static methodinfo_t _int_toPrecision; -static methodinfo_t _int_valueOf; -static methodinfo_t _int_toString; -static methodinfo_t _int_toExponential; -static methodinfo_t _int_toFixed; -static methodinfo_t _int_toPrecision; -static classinfo_t flash_display_Scene; -static varinfo_t flash_display_Scene_numFrames; -static varinfo_t flash_display_Scene_labels; -static varinfo_t flash_display_Scene_name; -static varinfo_t flash_display_Scene_numFrames; -static varinfo_t flash_display_Scene_labels; -static varinfo_t flash_display_Scene_name; -static classinfo_t flash_text_engine_FontMetrics; -static varinfo_t flash_text_engine_FontMetrics_superscriptOffset; -static varinfo_t flash_text_engine_FontMetrics_underlineThickness; -static varinfo_t flash_text_engine_FontMetrics_subscriptScale; -static varinfo_t flash_text_engine_FontMetrics_strikethroughOffset; -static varinfo_t flash_text_engine_FontMetrics_emBox; -static varinfo_t flash_text_engine_FontMetrics_strikethroughThickness; -static varinfo_t flash_text_engine_FontMetrics_superscriptScale; -static varinfo_t flash_text_engine_FontMetrics_subscriptOffset; -static varinfo_t flash_text_engine_FontMetrics_underlineOffset; -static varinfo_t flash_text_engine_FontMetrics_superscriptOffset; -static varinfo_t flash_text_engine_FontMetrics_underlineThickness; -static varinfo_t flash_text_engine_FontMetrics_subscriptScale; -static varinfo_t flash_text_engine_FontMetrics_strikethroughOffset; -static varinfo_t flash_text_engine_FontMetrics_emBox; -static varinfo_t flash_text_engine_FontMetrics_strikethroughThickness; -static varinfo_t flash_text_engine_FontMetrics_superscriptScale; -static varinfo_t flash_text_engine_FontMetrics_subscriptOffset; -static varinfo_t flash_text_engine_FontMetrics_underlineOffset; -static classinfo_t flash_utils_IExternalizable; -static methodinfo_t flash_utils_IExternalizable_readExternal; -static methodinfo_t flash_utils_IExternalizable_writeExternal; -static methodinfo_t flash_utils_IExternalizable_readExternal; -static methodinfo_t flash_utils_IExternalizable_writeExternal; -static classinfo_t __AS3___vec_Vector; -static classinfo_t flash_filters_GradientBevelFilter; -static varinfo_t flash_filters_GradientBevelFilter_strength; -static varinfo_t flash_filters_GradientBevelFilter_quality; -static varinfo_t flash_filters_GradientBevelFilter_angle; -static varinfo_t flash_filters_GradientBevelFilter_knockout; -static varinfo_t flash_filters_GradientBevelFilter_alphas; -static varinfo_t flash_filters_GradientBevelFilter_type; -static varinfo_t flash_filters_GradientBevelFilter_ratios; -static varinfo_t flash_filters_GradientBevelFilter_colors; -static varinfo_t flash_filters_GradientBevelFilter_blurX; -static varinfo_t flash_filters_GradientBevelFilter_blurY; -static varinfo_t flash_filters_GradientBevelFilter_distance; -static methodinfo_t flash_filters_GradientBevelFilter_clone; -static varinfo_t flash_filters_GradientBevelFilter_strength; -static varinfo_t flash_filters_GradientBevelFilter_quality; -static varinfo_t flash_filters_GradientBevelFilter_angle; -static varinfo_t flash_filters_GradientBevelFilter_knockout; -static varinfo_t flash_filters_GradientBevelFilter_alphas; -static varinfo_t flash_filters_GradientBevelFilter_type; -static varinfo_t flash_filters_GradientBevelFilter_ratios; -static varinfo_t flash_filters_GradientBevelFilter_colors; -static varinfo_t flash_filters_GradientBevelFilter_blurX; -static varinfo_t flash_filters_GradientBevelFilter_blurY; -static varinfo_t flash_filters_GradientBevelFilter_distance; -static methodinfo_t flash_filters_GradientBevelFilter_clone; -static classinfo_t flash_text_TextRun; -static varinfo_t flash_text_TextRun_beginIndex; -static varinfo_t flash_text_TextRun_endIndex; -static varinfo_t flash_text_TextRun_textFormat; -static varinfo_t flash_text_TextRun_beginIndex; -static varinfo_t flash_text_TextRun_endIndex; -static varinfo_t flash_text_TextRun_textFormat; -static classinfo_t flash_text_TextColorType; -static methodinfo_t flash_sampler_getSampleCount; -static classinfo_t flash_net_URLRequestHeader; -static varinfo_t flash_net_URLRequestHeader_value; -static varinfo_t flash_net_URLRequestHeader_name; -static varinfo_t flash_net_URLRequestHeader_value; -static varinfo_t flash_net_URLRequestHeader_name; -static methodinfo_t flash_profiler_showRedrawRegions; -static classinfo_t flash_display_ShaderData; -static classinfo_t flash_text_engine_TextLine; -static varinfo_t flash_text_engine_TextLine_previousLine; -static varinfo_t flash_text_engine_TextLine_validity; -static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockBeginIndex; -static methodinfo_t flash_text_engine_TextLine_getAtomWordBoundaryOnLeft; -static methodinfo_t flash_text_engine_TextLine_getAtomTextRotation; -static varinfo_t flash_text_engine_TextLine_textHeight; -static methodinfo_t flash_text_engine_TextLine_getAtomCenter; -static methodinfo_t flash_text_engine_TextLine_getAtomBounds; -static varinfo_t flash_text_engine_TextLine_mirrorRegions; -static varinfo_t flash_text_engine_TextLine_rawTextLength; -static varinfo_t flash_text_engine_TextLine_userData; -static varinfo_t flash_text_engine_TextLine_textWidth; -static varinfo_t flash_text_engine_TextLine_textBlock; -static varinfo_t flash_text_engine_TextLine_textBlockBeginIndex; -static varinfo_t flash_text_engine_TextLine_unjustifiedTextWidth; -static varinfo_t flash_text_engine_TextLine_ascent; -static methodinfo_t flash_text_engine_TextLine_getBaselinePosition; -static varinfo_t flash_text_engine_TextLine_specifiedWidth; -static methodinfo_t flash_text_engine_TextLine_getMirrorRegion; -static methodinfo_t flash_text_engine_TextLine_getAtomGraphic; -static varinfo_t flash_text_engine_TextLine_hasGraphicElement; -static methodinfo_t flash_text_engine_TextLine_flushAtomData; -static methodinfo_t flash_text_engine_TextLine_dump; -static varinfo_t flash_text_engine_TextLine_nextLine; -static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtCharIndex; -static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockEndIndex; -static varinfo_t flash_text_engine_TextLine_atomCount; -static varinfo_t flash_text_engine_TextLine_descent; -static methodinfo_t flash_text_engine_TextLine_getAtomBidiLevel; -static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtPoint; -static varinfo_t flash_text_engine_TextLine_previousLine; -static varinfo_t flash_text_engine_TextLine_validity; -static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockBeginIndex; -static methodinfo_t flash_text_engine_TextLine_getAtomWordBoundaryOnLeft; -static methodinfo_t flash_text_engine_TextLine_getAtomTextRotation; -static varinfo_t flash_text_engine_TextLine_textHeight; -static methodinfo_t flash_text_engine_TextLine_getAtomCenter; -static methodinfo_t flash_text_engine_TextLine_getAtomBounds; -static varinfo_t flash_text_engine_TextLine_mirrorRegions; -static varinfo_t flash_text_engine_TextLine_rawTextLength; -static varinfo_t flash_text_engine_TextLine_userData; -static varinfo_t flash_text_engine_TextLine_textWidth; -static varinfo_t flash_text_engine_TextLine_textBlock; -static varinfo_t flash_text_engine_TextLine_textBlockBeginIndex; -static varinfo_t flash_text_engine_TextLine_unjustifiedTextWidth; -static varinfo_t flash_text_engine_TextLine_ascent; -static methodinfo_t flash_text_engine_TextLine_getBaselinePosition; -static varinfo_t flash_text_engine_TextLine_specifiedWidth; -static methodinfo_t flash_text_engine_TextLine_getMirrorRegion; -static methodinfo_t flash_text_engine_TextLine_getAtomGraphic; -static varinfo_t flash_text_engine_TextLine_hasGraphicElement; -static methodinfo_t flash_text_engine_TextLine_flushAtomData; -static methodinfo_t flash_text_engine_TextLine_dump; -static varinfo_t flash_text_engine_TextLine_nextLine; -static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtCharIndex; -static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockEndIndex; -static varinfo_t flash_text_engine_TextLine_atomCount; -static varinfo_t flash_text_engine_TextLine_descent; -static methodinfo_t flash_text_engine_TextLine_getAtomBidiLevel; -static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtPoint; -static methodinfo_t flash_sampler_getSamples; -static classinfo_t flash_net_URLRequest; -static varinfo_t flash_net_URLRequest_contentType; -static varinfo_t flash_net_URLRequest_url; -static varinfo_t flash_net_URLRequest_requestHeaders; -static varinfo_t flash_net_URLRequest_method; -static varinfo_t flash_net_URLRequest_digest; -static varinfo_t flash_net_URLRequest_data; -static varinfo_t flash_net_URLRequest_contentType; -static varinfo_t flash_net_URLRequest_url; -static varinfo_t flash_net_URLRequest_requestHeaders; -static varinfo_t flash_net_URLRequest_method; -static varinfo_t flash_net_URLRequest_digest; -static varinfo_t flash_net_URLRequest_data; -static classinfo_t _URIError; -static methodinfo_t flash_net_getClassByAlias; -static classinfo_t flash_display_ShaderParameter; -static varinfo_t flash_display_ShaderParameter_value; -static varinfo_t flash_display_ShaderParameter_index; -static varinfo_t flash_display_ShaderParameter_type; -static varinfo_t flash_display_ShaderParameter_value; -static varinfo_t flash_display_ShaderParameter_index; -static varinfo_t flash_display_ShaderParameter_type; -static classinfo_t flash_filters_BitmapFilterType; -static classinfo_t _SecurityError; -static classinfo_t flash_utils_IDataInput; -static methodinfo_t flash_utils_IDataInput_readUTF; -static methodinfo_t flash_utils_IDataInput_readByte; -static methodinfo_t flash_utils_IDataInput_readUTFBytes; -static methodinfo_t flash_utils_IDataInput_readShort; -static varinfo_t flash_utils_IDataInput_objectEncoding; -static methodinfo_t flash_utils_IDataInput_readUnsignedInt; -static methodinfo_t flash_utils_IDataInput_readDouble; -static methodinfo_t flash_utils_IDataInput_readBytes; -static methodinfo_t flash_utils_IDataInput_readUnsignedByte; -static methodinfo_t flash_utils_IDataInput_readMultiByte; -static methodinfo_t flash_utils_IDataInput_readInt; -static varinfo_t flash_utils_IDataInput_bytesAvailable; -static methodinfo_t flash_utils_IDataInput_readUnsignedShort; -static methodinfo_t flash_utils_IDataInput_readObject; -static methodinfo_t flash_utils_IDataInput_readFloat; -static varinfo_t flash_utils_IDataInput_endian; -static methodinfo_t flash_utils_IDataInput_readBoolean; -static methodinfo_t flash_utils_IDataInput_readUTF; -static methodinfo_t flash_utils_IDataInput_readByte; -static methodinfo_t flash_utils_IDataInput_readUTFBytes; -static methodinfo_t flash_utils_IDataInput_readShort; -static varinfo_t flash_utils_IDataInput_objectEncoding; -static methodinfo_t flash_utils_IDataInput_readUnsignedInt; -static methodinfo_t flash_utils_IDataInput_readDouble; -static methodinfo_t flash_utils_IDataInput_readBytes; -static methodinfo_t flash_utils_IDataInput_readUnsignedByte; -static methodinfo_t flash_utils_IDataInput_readMultiByte; -static methodinfo_t flash_utils_IDataInput_readInt; -static varinfo_t flash_utils_IDataInput_bytesAvailable; -static methodinfo_t flash_utils_IDataInput_readUnsignedShort; -static methodinfo_t flash_utils_IDataInput_readObject; -static methodinfo_t flash_utils_IDataInput_readFloat; -static varinfo_t flash_utils_IDataInput_endian; -static methodinfo_t flash_utils_IDataInput_readBoolean; -static classinfo_t flash_events_IEventDispatcher; -static methodinfo_t flash_events_IEventDispatcher_willTrigger; -static methodinfo_t flash_events_IEventDispatcher_removeEventListener; -static methodinfo_t flash_events_IEventDispatcher_hasEventListener; -static methodinfo_t flash_events_IEventDispatcher_addEventListener; -static methodinfo_t flash_events_IEventDispatcher_dispatchEvent; -static methodinfo_t flash_events_IEventDispatcher_willTrigger; -static methodinfo_t flash_events_IEventDispatcher_removeEventListener; -static methodinfo_t flash_events_IEventDispatcher_hasEventListener; -static methodinfo_t flash_events_IEventDispatcher_addEventListener; -static methodinfo_t flash_events_IEventDispatcher_dispatchEvent; -static classinfo_t _Class; -static varinfo_t _Class_prototype; -static varinfo_t _Class_prototype; -static classinfo_t flash_geom_Rectangle; -static varinfo_t flash_geom_Rectangle_top; -static methodinfo_t flash_geom_Rectangle_intersection; -static methodinfo_t flash_geom_Rectangle_intersects; -static methodinfo_t flash_geom_Rectangle_containsPoint; -static methodinfo_t flash_geom_Rectangle_setEmpty; -static varinfo_t flash_geom_Rectangle_topLeft; -static varinfo_t flash_geom_Rectangle_width; -static methodinfo_t flash_geom_Rectangle_containsRect; -static methodinfo_t flash_geom_Rectangle_isEmpty; -static methodinfo_t flash_geom_Rectangle_equals; -static varinfo_t flash_geom_Rectangle_height; -static varinfo_t flash_geom_Rectangle_left; -static methodinfo_t flash_geom_Rectangle_inflate; -static methodinfo_t flash_geom_Rectangle_inflatePoint; -static methodinfo_t flash_geom_Rectangle_toString; -static methodinfo_t flash_geom_Rectangle_offsetPoint; -static varinfo_t flash_geom_Rectangle_x; -static varinfo_t flash_geom_Rectangle_size; -static varinfo_t flash_geom_Rectangle_bottomRight; -static varinfo_t flash_geom_Rectangle_right; -static methodinfo_t flash_geom_Rectangle_contains; -static methodinfo_t flash_geom_Rectangle_union; -static varinfo_t flash_geom_Rectangle_bottom; -static methodinfo_t flash_geom_Rectangle_clone; -static varinfo_t flash_geom_Rectangle_y; -static methodinfo_t flash_geom_Rectangle_offset; -static varinfo_t flash_geom_Rectangle_top; -static methodinfo_t flash_geom_Rectangle_intersection; -static methodinfo_t flash_geom_Rectangle_intersects; -static methodinfo_t flash_geom_Rectangle_containsPoint; -static methodinfo_t flash_geom_Rectangle_setEmpty; -static varinfo_t flash_geom_Rectangle_topLeft; -static varinfo_t flash_geom_Rectangle_width; -static methodinfo_t flash_geom_Rectangle_containsRect; -static methodinfo_t flash_geom_Rectangle_isEmpty; -static methodinfo_t flash_geom_Rectangle_equals; -static varinfo_t flash_geom_Rectangle_height; -static varinfo_t flash_geom_Rectangle_left; -static methodinfo_t flash_geom_Rectangle_inflate; -static methodinfo_t flash_geom_Rectangle_inflatePoint; -static methodinfo_t flash_geom_Rectangle_toString; -static methodinfo_t flash_geom_Rectangle_offsetPoint; -static varinfo_t flash_geom_Rectangle_x; -static varinfo_t flash_geom_Rectangle_size; -static varinfo_t flash_geom_Rectangle_bottomRight; -static varinfo_t flash_geom_Rectangle_right; -static methodinfo_t flash_geom_Rectangle_contains; -static methodinfo_t flash_geom_Rectangle_union; -static varinfo_t flash_geom_Rectangle_bottom; -static methodinfo_t flash_geom_Rectangle_clone; -static varinfo_t flash_geom_Rectangle_y; -static methodinfo_t flash_geom_Rectangle_offset; -static classinfo_t flash_events_SecurityErrorEvent; -static methodinfo_t flash_events_SecurityErrorEvent_toString; -static methodinfo_t flash_events_SecurityErrorEvent_clone; -static methodinfo_t flash_events_SecurityErrorEvent_toString; -static methodinfo_t flash_events_SecurityErrorEvent_clone; -static classinfo_t flash_net_IDynamicPropertyWriter; -static methodinfo_t flash_net_IDynamicPropertyWriter_writeDynamicProperties; -static methodinfo_t flash_net_IDynamicPropertyWriter_writeDynamicProperties; -static classinfo_t flash_display_InterpolationMethod; -static classinfo_t _Object; -static methodinfo_t _Object_propertyIsEnumerable; -static methodinfo_t _Object_isPrototypeOf; -static methodinfo_t _Object_hasOwnProperty; -static methodinfo_t _Object_propertyIsEnumerable; -static methodinfo_t _Object_isPrototypeOf; -static methodinfo_t _Object_hasOwnProperty; -static classinfo_t flash_errors_EOFError; -static classinfo_t flash_net_NetStream; -static varinfo_t flash_net_NetStream_videoCodec; -static varinfo_t flash_net_NetStream_info; -static methodinfo_t flash_net_NetStream_attachCamera; -static varinfo_t flash_net_NetStream_farNonce; -static methodinfo_t flash_net_NetStream_close; -static methodinfo_t flash_net_NetStream_pause; -static methodinfo_t flash_net_NetStream_onPeerConnect; -static varinfo_t flash_net_NetStream_client; -static methodinfo_t flash_net_NetStream_resume; -static varinfo_t flash_net_NetStream_liveDelay; -static varinfo_t flash_net_NetStream_peerStreams; -static varinfo_t flash_net_NetStream_objectEncoding; -static varinfo_t flash_net_NetStream_bytesLoaded; -static methodinfo_t flash_net_NetStream_receiveVideo; -static varinfo_t flash_net_NetStream_maxPauseBufferTime; -static methodinfo_t flash_net_NetStream_play2; -static varinfo_t flash_net_NetStream_audioCodec; -static methodinfo_t flash_net_NetStream_receiveVideoFPS; -static varinfo_t flash_net_NetStream_bytesTotal; -static varinfo_t flash_net_NetStream_farID; -static methodinfo_t flash_net_NetStream_receiveAudio; -static varinfo_t flash_net_NetStream_bufferLength; -static methodinfo_t flash_net_NetStream_seek; -static methodinfo_t flash_net_NetStream_attachAudio; -static varinfo_t flash_net_NetStream_bufferTime; -static methodinfo_t flash_net_NetStream_play; -static methodinfo_t flash_net_NetStream_publish; -static methodinfo_t flash_net_NetStream_togglePause; -static varinfo_t flash_net_NetStream_checkPolicyFile; -static varinfo_t flash_net_NetStream_nearNonce; -static varinfo_t flash_net_NetStream_decodedFrames; -static methodinfo_t flash_net_NetStream_send; -static varinfo_t flash_net_NetStream_currentFPS; -static varinfo_t flash_net_NetStream_time; -static varinfo_t flash_net_NetStream_soundTransform; -static varinfo_t flash_net_NetStream_videoCodec; -static varinfo_t flash_net_NetStream_info; -static methodinfo_t flash_net_NetStream_attachCamera; -static varinfo_t flash_net_NetStream_farNonce; -static methodinfo_t flash_net_NetStream_close; -static methodinfo_t flash_net_NetStream_pause; -static methodinfo_t flash_net_NetStream_onPeerConnect; -static varinfo_t flash_net_NetStream_client; -static methodinfo_t flash_net_NetStream_resume; -static varinfo_t flash_net_NetStream_liveDelay; -static varinfo_t flash_net_NetStream_peerStreams; -static varinfo_t flash_net_NetStream_objectEncoding; -static varinfo_t flash_net_NetStream_bytesLoaded; -static methodinfo_t flash_net_NetStream_receiveVideo; -static varinfo_t flash_net_NetStream_maxPauseBufferTime; -static methodinfo_t flash_net_NetStream_play2; -static varinfo_t flash_net_NetStream_audioCodec; -static methodinfo_t flash_net_NetStream_receiveVideoFPS; -static varinfo_t flash_net_NetStream_bytesTotal; -static varinfo_t flash_net_NetStream_farID; -static methodinfo_t flash_net_NetStream_receiveAudio; -static varinfo_t flash_net_NetStream_bufferLength; -static methodinfo_t flash_net_NetStream_seek; -static methodinfo_t flash_net_NetStream_attachAudio; -static varinfo_t flash_net_NetStream_bufferTime; -static methodinfo_t flash_net_NetStream_play; -static methodinfo_t flash_net_NetStream_publish; -static methodinfo_t flash_net_NetStream_togglePause; -static varinfo_t flash_net_NetStream_checkPolicyFile; -static varinfo_t flash_net_NetStream_nearNonce; -static varinfo_t flash_net_NetStream_decodedFrames; -static methodinfo_t flash_net_NetStream_send; -static varinfo_t flash_net_NetStream_currentFPS; -static varinfo_t flash_net_NetStream_time; -static varinfo_t flash_net_NetStream_soundTransform; -static classinfo_t _ArgumentError; -static classinfo_t _XMLList; -static methodinfo_t _XMLList_normalize; -static methodinfo_t _XMLList_removeNamespace; -static methodinfo_t _XMLList_prependChild; -static methodinfo_t _XMLList_toXMLString; -static methodinfo_t _XMLList_nodeKind; -static methodinfo_t _XMLList_copy; -static methodinfo_t _XMLList_text; -static methodinfo_t _XMLList_toString; -static methodinfo_t _XMLList_childIndex; -static methodinfo_t _XMLList_setName; -static methodinfo_t _XMLList_setLocalName; -static methodinfo_t _XMLList_namespace; -static methodinfo_t _XMLList_insertChildBefore; -static methodinfo_t _XMLList_addNamespace; -static methodinfo_t _XMLList_propertyIsEnumerable; -static methodinfo_t _XMLList_comments; -static methodinfo_t _XMLList_attributes; -static methodinfo_t _XMLList_descendants; -static methodinfo_t _XMLList_replace; -static methodinfo_t _XMLList_children; -static methodinfo_t _XMLList_contains; -static methodinfo_t _XMLList_hasSimpleContent; -static methodinfo_t _XMLList_elements; -static methodinfo_t _XMLList_hasComplexContent; -static methodinfo_t _XMLList_insertChildAfter; -static methodinfo_t _XMLList_parent; -static methodinfo_t _XMLList_length; -static methodinfo_t _XMLList_processingInstructions; -static methodinfo_t _XMLList_child; -static methodinfo_t _XMLList_appendChild; -static methodinfo_t _XMLList_valueOf; -static methodinfo_t _XMLList_localName; -static methodinfo_t _XMLList_inScopeNamespaces; -static methodinfo_t _XMLList_hasOwnProperty; -static methodinfo_t _XMLList_setNamespace; -static methodinfo_t _XMLList_namespaceDeclarations; -static methodinfo_t _XMLList_name; -static methodinfo_t _XMLList_setChildren; -static methodinfo_t _XMLList_attribute; -static methodinfo_t _XMLList_normalize; -static methodinfo_t _XMLList_removeNamespace; -static methodinfo_t _XMLList_prependChild; -static methodinfo_t _XMLList_toXMLString; -static methodinfo_t _XMLList_nodeKind; -static methodinfo_t _XMLList_copy; -static methodinfo_t _XMLList_text; -static methodinfo_t _XMLList_toString; -static methodinfo_t _XMLList_childIndex; -static methodinfo_t _XMLList_setName; -static methodinfo_t _XMLList_setLocalName; -static methodinfo_t _XMLList_namespace; -static methodinfo_t _XMLList_insertChildBefore; -static methodinfo_t _XMLList_addNamespace; -static methodinfo_t _XMLList_propertyIsEnumerable; -static methodinfo_t _XMLList_comments; -static methodinfo_t _XMLList_attributes; -static methodinfo_t _XMLList_descendants; -static methodinfo_t _XMLList_replace; -static methodinfo_t _XMLList_children; -static methodinfo_t _XMLList_contains; -static methodinfo_t _XMLList_hasSimpleContent; -static methodinfo_t _XMLList_elements; -static methodinfo_t _XMLList_hasComplexContent; -static methodinfo_t _XMLList_insertChildAfter; -static methodinfo_t _XMLList_parent; -static methodinfo_t _XMLList_length; -static methodinfo_t _XMLList_processingInstructions; -static methodinfo_t _XMLList_child; -static methodinfo_t _XMLList_appendChild; -static methodinfo_t _XMLList_valueOf; -static methodinfo_t _XMLList_localName; -static methodinfo_t _XMLList_inScopeNamespaces; -static methodinfo_t _XMLList_hasOwnProperty; -static methodinfo_t _XMLList_setNamespace; -static methodinfo_t _XMLList_namespaceDeclarations; -static methodinfo_t _XMLList_name; -static methodinfo_t _XMLList_setChildren; -static methodinfo_t _XMLList_attribute; -static classinfo_t flash_geom_Point; -static methodinfo_t flash_geom_Point_equals; -static methodinfo_t flash_geom_Point_normalize; -static varinfo_t flash_geom_Point_x; -static methodinfo_t flash_geom_Point_offset; -static methodinfo_t flash_geom_Point_subtract; -static varinfo_t flash_geom_Point_y; -static varinfo_t flash_geom_Point_length; -static methodinfo_t flash_geom_Point_add; -static methodinfo_t flash_geom_Point_toString; -static methodinfo_t flash_geom_Point_clone; -static methodinfo_t flash_geom_Point_equals; -static methodinfo_t flash_geom_Point_normalize; -static varinfo_t flash_geom_Point_x; -static methodinfo_t flash_geom_Point_offset; -static methodinfo_t flash_geom_Point_subtract; -static varinfo_t flash_geom_Point_y; -static varinfo_t flash_geom_Point_length; -static methodinfo_t flash_geom_Point_add; -static methodinfo_t flash_geom_Point_toString; -static methodinfo_t flash_geom_Point_clone; -static classinfo_t flash_printing_PrintJobOptions; -static varinfo_t flash_printing_PrintJobOptions_printAsBitmap; -static varinfo_t flash_printing_PrintJobOptions_printAsBitmap; -static classinfo_t flash_display_DisplayObject; -static varinfo_t flash_display_DisplayObject_rotation; -static varinfo_t flash_display_DisplayObject_filters; -static varinfo_t flash_display_DisplayObject_rotationZ; -static varinfo_t flash_display_DisplayObject_accessibilityProperties; -static varinfo_t flash_display_DisplayObject_mouseX; -static varinfo_t flash_display_DisplayObject_root; -static varinfo_t flash_display_DisplayObject_stage; -static varinfo_t flash_display_DisplayObject_rotationY; -static varinfo_t flash_display_DisplayObject_scaleZ; -static methodinfo_t flash_display_DisplayObject_local3DToGlobal; -static varinfo_t flash_display_DisplayObject_loaderInfo; -static varinfo_t flash_display_DisplayObject_cacheAsBitmap; -static varinfo_t flash_display_DisplayObject_transform; -static varinfo_t flash_display_DisplayObject_scaleY; -static varinfo_t flash_display_DisplayObject_height; -static varinfo_t flash_display_DisplayObject_rotationX; -static varinfo_t flash_display_DisplayObject_scrollRect; -static varinfo_t flash_display_DisplayObject_width; -static varinfo_t flash_display_DisplayObject_scale9Grid; -static varinfo_t flash_display_DisplayObject_parent; -static methodinfo_t flash_display_DisplayObject_hitTestObject; -static methodinfo_t flash_display_DisplayObject_hitTestPoint; -static varinfo_t flash_display_DisplayObject_alpha; -static methodinfo_t flash_display_DisplayObject_getRect; -static varinfo_t flash_display_DisplayObject_opaqueBackground; -static methodinfo_t flash_display_DisplayObject_globalToLocal3D; -static varinfo_t flash_display_DisplayObject_visible; -static varinfo_t flash_display_DisplayObject_blendMode; -static varinfo_t flash_display_DisplayObject_scaleX; -static methodinfo_t flash_display_DisplayObject_globalToLocal; -static methodinfo_t flash_display_DisplayObject_localToGlobal; -static varinfo_t flash_display_DisplayObject_z; -static varinfo_t flash_display_DisplayObject_name; -static methodinfo_t flash_display_DisplayObject_getBounds; -static varinfo_t flash_display_DisplayObject_mask; -static varinfo_t flash_display_DisplayObject_mouseY; -static varinfo_t flash_display_DisplayObject_x; -static varinfo_t flash_display_DisplayObject_y; -static varinfo_t flash_display_DisplayObject_rotation; -static varinfo_t flash_display_DisplayObject_filters; -static varinfo_t flash_display_DisplayObject_rotationZ; -static varinfo_t flash_display_DisplayObject_accessibilityProperties; -static varinfo_t flash_display_DisplayObject_mouseX; -static varinfo_t flash_display_DisplayObject_root; -static varinfo_t flash_display_DisplayObject_stage; -static varinfo_t flash_display_DisplayObject_rotationY; -static varinfo_t flash_display_DisplayObject_scaleZ; -static methodinfo_t flash_display_DisplayObject_local3DToGlobal; -static varinfo_t flash_display_DisplayObject_loaderInfo; -static varinfo_t flash_display_DisplayObject_cacheAsBitmap; -static varinfo_t flash_display_DisplayObject_transform; -static varinfo_t flash_display_DisplayObject_scaleY; -static varinfo_t flash_display_DisplayObject_height; -static varinfo_t flash_display_DisplayObject_rotationX; -static varinfo_t flash_display_DisplayObject_scrollRect; -static varinfo_t flash_display_DisplayObject_width; -static varinfo_t flash_display_DisplayObject_scale9Grid; -static varinfo_t flash_display_DisplayObject_parent; -static methodinfo_t flash_display_DisplayObject_hitTestObject; -static methodinfo_t flash_display_DisplayObject_hitTestPoint; -static varinfo_t flash_display_DisplayObject_alpha; -static methodinfo_t flash_display_DisplayObject_getRect; -static varinfo_t flash_display_DisplayObject_opaqueBackground; -static methodinfo_t flash_display_DisplayObject_globalToLocal3D; -static varinfo_t flash_display_DisplayObject_visible; -static varinfo_t flash_display_DisplayObject_blendMode; -static varinfo_t flash_display_DisplayObject_scaleX; -static methodinfo_t flash_display_DisplayObject_globalToLocal; -static methodinfo_t flash_display_DisplayObject_localToGlobal; -static varinfo_t flash_display_DisplayObject_z; -static varinfo_t flash_display_DisplayObject_name; -static methodinfo_t flash_display_DisplayObject_getBounds; -static varinfo_t flash_display_DisplayObject_mask; -static varinfo_t flash_display_DisplayObject_mouseY; -static varinfo_t flash_display_DisplayObject_x; -static varinfo_t flash_display_DisplayObject_y; -static classinfo_t flash_sampler_DeleteObjectSample; -static varinfo_t flash_sampler_DeleteObjectSample_size; -static varinfo_t flash_sampler_DeleteObjectSample_id; -static varinfo_t flash_sampler_DeleteObjectSample_size; -static varinfo_t flash_sampler_DeleteObjectSample_id; -static methodinfo_t flash_system_fscommand; -static methodinfo_t flash_utils_unescapeMultiByte; -static classinfo_t flash_sampler_StackFrame; -static varinfo_t flash_sampler_StackFrame_name; -static varinfo_t flash_sampler_StackFrame_line; -static methodinfo_t flash_sampler_StackFrame_toString; -static varinfo_t flash_sampler_StackFrame_file; -static varinfo_t flash_sampler_StackFrame_name; -static varinfo_t flash_sampler_StackFrame_line; -static methodinfo_t flash_sampler_StackFrame_toString; -static varinfo_t flash_sampler_StackFrame_file; -static classinfo_t flash_system_JPEGLoaderContext; -static varinfo_t flash_system_JPEGLoaderContext_deblockingFilter; -static varinfo_t flash_system_JPEGLoaderContext_deblockingFilter; -static classinfo_t flash_system_IME; -static methodinfo_t _isNaN; -static classinfo_t flash_system_Security; -static classinfo_t flash_display_Bitmap; -static varinfo_t flash_display_Bitmap_pixelSnapping; -static varinfo_t flash_display_Bitmap_bitmapData; -static varinfo_t flash_display_Bitmap_smoothing; -static varinfo_t flash_display_Bitmap_pixelSnapping; -static varinfo_t flash_display_Bitmap_bitmapData; -static varinfo_t flash_display_Bitmap_smoothing; -static classinfo_t flash_printing_PrintJob; -static varinfo_t flash_printing_PrintJob_paperWidth; -static methodinfo_t flash_printing_PrintJob_addPage; -static varinfo_t flash_printing_PrintJob_pageHeight; -static methodinfo_t flash_printing_PrintJob_start; -static varinfo_t flash_printing_PrintJob_pageWidth; -static methodinfo_t flash_printing_PrintJob_send; -static varinfo_t flash_printing_PrintJob_paperHeight; -static varinfo_t flash_printing_PrintJob_orientation; -static varinfo_t flash_printing_PrintJob_paperWidth; -static methodinfo_t flash_printing_PrintJob_addPage; -static varinfo_t flash_printing_PrintJob_pageHeight; -static methodinfo_t flash_printing_PrintJob_start; -static varinfo_t flash_printing_PrintJob_pageWidth; -static methodinfo_t flash_printing_PrintJob_send; -static varinfo_t flash_printing_PrintJob_paperHeight; -static varinfo_t flash_printing_PrintJob_orientation; -static classinfo_t flash_text_StaticText; -static varinfo_t flash_text_StaticText_text; -static varinfo_t flash_text_StaticText_text; -static classinfo_t flash_text_engine_SpaceJustifier; -static methodinfo_t flash_text_engine_SpaceJustifier_clone; -static varinfo_t flash_text_engine_SpaceJustifier_letterSpacing; -static methodinfo_t flash_text_engine_SpaceJustifier_clone; -static varinfo_t flash_text_engine_SpaceJustifier_letterSpacing; -static classinfo_t flash_events_DataEvent; -static methodinfo_t flash_events_DataEvent_toString; -static methodinfo_t flash_events_DataEvent_clone; -static varinfo_t flash_events_DataEvent_data; -static methodinfo_t flash_events_DataEvent_toString; -static methodinfo_t flash_events_DataEvent_clone; -static varinfo_t flash_events_DataEvent_data; -static classinfo_t flash_events_ActivityEvent; -static methodinfo_t flash_events_ActivityEvent_toString; -static varinfo_t flash_events_ActivityEvent_activating; -static methodinfo_t flash_events_ActivityEvent_clone; -static methodinfo_t flash_events_ActivityEvent_toString; -static varinfo_t flash_events_ActivityEvent_activating; -static methodinfo_t flash_events_ActivityEvent_clone; -static classinfo_t flash_display_GraphicsEndFill; -static classinfo_t flash_display_ColorCorrection; -static classinfo_t flash_events_IOErrorEvent; -static methodinfo_t flash_events_IOErrorEvent_toString; -static methodinfo_t flash_events_IOErrorEvent_clone; -static methodinfo_t flash_events_IOErrorEvent_toString; -static methodinfo_t flash_events_IOErrorEvent_clone; -static classinfo_t flash_display_GraphicsStroke; -static varinfo_t flash_display_GraphicsStroke_scaleMode; -static varinfo_t flash_display_GraphicsStroke_miterLimit; -static varinfo_t flash_display_GraphicsStroke_pixelHinting; -static varinfo_t flash_display_GraphicsStroke_fill; -static varinfo_t flash_display_GraphicsStroke_thickness; -static varinfo_t flash_display_GraphicsStroke_joints; -static varinfo_t flash_display_GraphicsStroke_caps; -static varinfo_t flash_display_GraphicsStroke_scaleMode; -static varinfo_t flash_display_GraphicsStroke_miterLimit; -static varinfo_t flash_display_GraphicsStroke_pixelHinting; -static varinfo_t flash_display_GraphicsStroke_fill; -static varinfo_t flash_display_GraphicsStroke_thickness; -static varinfo_t flash_display_GraphicsStroke_joints; -static varinfo_t flash_display_GraphicsStroke_caps; -static classinfo_t _Boolean; -static methodinfo_t _Boolean_valueOf; -static methodinfo_t _Boolean_toString; -static methodinfo_t _Boolean_valueOf; -static methodinfo_t _Boolean_toString; -static methodinfo_t flash_sampler_getMemberNames; -static methodinfo_t flash_utils_getQualifiedClassName; -static classinfo_t flash_text_engine_GraphicElement; -static varinfo_t flash_text_engine_GraphicElement_graphic; -static varinfo_t flash_text_engine_GraphicElement_elementWidth; -static varinfo_t flash_text_engine_GraphicElement_elementHeight; -static varinfo_t flash_text_engine_GraphicElement_graphic; -static varinfo_t flash_text_engine_GraphicElement_elementWidth; -static varinfo_t flash_text_engine_GraphicElement_elementHeight; -static classinfo_t flash_media_Microphone; -static varinfo_t flash_media_Microphone_codec; -static varinfo_t flash_media_Microphone_gain; -static varinfo_t flash_media_Microphone_index; -static methodinfo_t flash_media_Microphone_setLoopBack; -static methodinfo_t flash_media_Microphone_setSilenceLevel; -static varinfo_t flash_media_Microphone_name; -static methodinfo_t flash_media_Microphone_setUseEchoSuppression; -static varinfo_t flash_media_Microphone_framesPerPacket; -static varinfo_t flash_media_Microphone_muted; -static varinfo_t flash_media_Microphone_soundTransform; -static varinfo_t flash_media_Microphone_encodeQuality; -static varinfo_t flash_media_Microphone_useEchoSuppression; -static varinfo_t flash_media_Microphone_silenceLevel; -static varinfo_t flash_media_Microphone_silenceTimeout; -static varinfo_t flash_media_Microphone_rate; -static varinfo_t flash_media_Microphone_activityLevel; -static varinfo_t flash_media_Microphone_codec; -static varinfo_t flash_media_Microphone_gain; -static varinfo_t flash_media_Microphone_index; -static methodinfo_t flash_media_Microphone_setLoopBack; -static methodinfo_t flash_media_Microphone_setSilenceLevel; -static varinfo_t flash_media_Microphone_name; -static methodinfo_t flash_media_Microphone_setUseEchoSuppression; -static varinfo_t flash_media_Microphone_framesPerPacket; -static varinfo_t flash_media_Microphone_muted; -static varinfo_t flash_media_Microphone_soundTransform; -static varinfo_t flash_media_Microphone_encodeQuality; -static varinfo_t flash_media_Microphone_useEchoSuppression; -static varinfo_t flash_media_Microphone_silenceLevel; -static varinfo_t flash_media_Microphone_silenceTimeout; -static varinfo_t flash_media_Microphone_rate; -static varinfo_t flash_media_Microphone_activityLevel; -static classinfo_t flash_ui_ContextMenuClipboardItems; -static varinfo_t flash_ui_ContextMenuClipboardItems_clear; -static methodinfo_t flash_ui_ContextMenuClipboardItems_clone; -static varinfo_t flash_ui_ContextMenuClipboardItems_paste; -static varinfo_t flash_ui_ContextMenuClipboardItems_selectAll; -static varinfo_t flash_ui_ContextMenuClipboardItems_copy; -static varinfo_t flash_ui_ContextMenuClipboardItems_cut; -static varinfo_t flash_ui_ContextMenuClipboardItems_clear; -static methodinfo_t flash_ui_ContextMenuClipboardItems_clone; -static varinfo_t flash_ui_ContextMenuClipboardItems_paste; -static varinfo_t flash_ui_ContextMenuClipboardItems_selectAll; -static varinfo_t flash_ui_ContextMenuClipboardItems_copy; -static varinfo_t flash_ui_ContextMenuClipboardItems_cut; -static classinfo_t flash_display_GraphicsShaderFill; -static varinfo_t flash_display_GraphicsShaderFill_shader; -static varinfo_t flash_display_GraphicsShaderFill_matrix; -static varinfo_t flash_display_GraphicsShaderFill_shader; -static varinfo_t flash_display_GraphicsShaderFill_matrix; -static classinfo_t flash_errors_IllegalOperationError; -static classinfo_t flash_filters_GradientGlowFilter; -static varinfo_t flash_filters_GradientGlowFilter_strength; -static varinfo_t flash_filters_GradientGlowFilter_quality; -static varinfo_t flash_filters_GradientGlowFilter_angle; -static varinfo_t flash_filters_GradientGlowFilter_knockout; -static varinfo_t flash_filters_GradientGlowFilter_type; -static varinfo_t flash_filters_GradientGlowFilter_alphas; -static varinfo_t flash_filters_GradientGlowFilter_ratios; -static varinfo_t flash_filters_GradientGlowFilter_colors; -static varinfo_t flash_filters_GradientGlowFilter_blurX; -static varinfo_t flash_filters_GradientGlowFilter_blurY; -static varinfo_t flash_filters_GradientGlowFilter_distance; -static methodinfo_t flash_filters_GradientGlowFilter_clone; -static varinfo_t flash_filters_GradientGlowFilter_strength; -static varinfo_t flash_filters_GradientGlowFilter_quality; -static varinfo_t flash_filters_GradientGlowFilter_angle; -static varinfo_t flash_filters_GradientGlowFilter_knockout; -static varinfo_t flash_filters_GradientGlowFilter_type; -static varinfo_t flash_filters_GradientGlowFilter_alphas; -static varinfo_t flash_filters_GradientGlowFilter_ratios; -static varinfo_t flash_filters_GradientGlowFilter_colors; -static varinfo_t flash_filters_GradientGlowFilter_blurX; -static varinfo_t flash_filters_GradientGlowFilter_blurY; -static varinfo_t flash_filters_GradientGlowFilter_distance; -static methodinfo_t flash_filters_GradientGlowFilter_clone; -static classinfo_t flash_display_CapsStyle; -static classinfo_t flash_text_TextSnapshot; -static methodinfo_t flash_text_TextSnapshot_setSelectColor; -static methodinfo_t flash_text_TextSnapshot_setSelected; -static methodinfo_t flash_text_TextSnapshot_getSelectedText; -static methodinfo_t flash_text_TextSnapshot_getTextRunInfo; -static varinfo_t flash_text_TextSnapshot_charCount; -static methodinfo_t flash_text_TextSnapshot_findText; -static methodinfo_t flash_text_TextSnapshot_getSelected; -static methodinfo_t flash_text_TextSnapshot_hitTestTextNearPos; -static methodinfo_t flash_text_TextSnapshot_getText; -static methodinfo_t flash_text_TextSnapshot_setSelectColor; -static methodinfo_t flash_text_TextSnapshot_setSelected; -static methodinfo_t flash_text_TextSnapshot_getSelectedText; -static methodinfo_t flash_text_TextSnapshot_getTextRunInfo; -static varinfo_t flash_text_TextSnapshot_charCount; -static methodinfo_t flash_text_TextSnapshot_findText; -static methodinfo_t flash_text_TextSnapshot_getSelected; -static methodinfo_t flash_text_TextSnapshot_hitTestTextNearPos; -static methodinfo_t flash_text_TextSnapshot_getText; -static classinfo_t flash_text_engine_FontLookup; -static classinfo_t flash_display_InteractiveObject; -static varinfo_t flash_display_InteractiveObject_tabIndex; -static varinfo_t flash_display_InteractiveObject_doubleClickEnabled; -static varinfo_t flash_display_InteractiveObject_tabEnabled; -static varinfo_t flash_display_InteractiveObject_mouseEnabled; -static varinfo_t flash_display_InteractiveObject_contextMenu; -static varinfo_t flash_display_InteractiveObject_focusRect; -static varinfo_t flash_display_InteractiveObject_accessibilityImplementation; -static varinfo_t flash_display_InteractiveObject_tabIndex; -static varinfo_t flash_display_InteractiveObject_doubleClickEnabled; -static varinfo_t flash_display_InteractiveObject_tabEnabled; -static varinfo_t flash_display_InteractiveObject_mouseEnabled; -static varinfo_t flash_display_InteractiveObject_contextMenu; -static varinfo_t flash_display_InteractiveObject_focusRect; -static varinfo_t flash_display_InteractiveObject_accessibilityImplementation; -static classinfo_t flash_text_TextField; -static methodinfo_t flash_text_TextField_getTextFormat; -static varinfo_t flash_text_TextField_border; -static varinfo_t flash_text_TextField_selectedText; -static methodinfo_t flash_text_TextField_pasteRichText; -static varinfo_t flash_text_TextField_bottomScrollV; -static methodinfo_t flash_text_TextField_getLineIndexOfChar; -static methodinfo_t flash_text_TextField_replaceText; -static varinfo_t flash_text_TextField_defaultTextFormat; -static varinfo_t flash_text_TextField_restrict; -static varinfo_t flash_text_TextField_htmlText; -static methodinfo_t flash_text_TextField_copyRichText; -static methodinfo_t flash_text_TextField_getLineText; -static methodinfo_t flash_text_TextField_getFirstCharInParagraph; -static methodinfo_t flash_text_TextField_setSelection; -static varinfo_t flash_text_TextField_length; -static varinfo_t flash_text_TextField_wordWrap; -static methodinfo_t flash_text_TextField_appendText; -static varinfo_t flash_text_TextField_caretIndex; -static varinfo_t flash_text_TextField_mouseWheelEnabled; -static varinfo_t flash_text_TextField_selectionBeginIndex; -static varinfo_t flash_text_TextField_sharpness; -static varinfo_t flash_text_TextField_type; -static methodinfo_t flash_text_TextField_getLineIndexAtPoint; -static methodinfo_t flash_text_TextField_getCharIndexAtPoint; -static methodinfo_t flash_text_TextField_getXMLText; -static methodinfo_t flash_text_TextField_getParagraphLength; -static methodinfo_t flash_text_TextField_getRawText; -static varinfo_t flash_text_TextField_gridFitType; -static methodinfo_t flash_text_TextField_getLineOffset; -static varinfo_t flash_text_TextField_backgroundColor; -static varinfo_t flash_text_TextField_multiline; -static varinfo_t flash_text_TextField_numLines; -static methodinfo_t flash_text_TextField_getImageReference; -static varinfo_t flash_text_TextField_displayAsPassword; -static varinfo_t flash_text_TextField_textWidth; -static varinfo_t flash_text_TextField_autoSize; -static varinfo_t flash_text_TextField_selectable; -static methodinfo_t flash_text_TextField_getCharBoundaries; -static varinfo_t flash_text_TextField_alwaysShowSelection; -static varinfo_t flash_text_TextField_thickness; -static varinfo_t flash_text_TextField_useRichTextClipboard; -static varinfo_t flash_text_TextField_scrollV; -static methodinfo_t flash_text_TextField_getTextRuns; -static methodinfo_t flash_text_TextField_setTextFormat; -static varinfo_t flash_text_TextField_textColor; -static varinfo_t flash_text_TextField_maxScrollV; -static varinfo_t flash_text_TextField_embedFonts; -static varinfo_t flash_text_TextField_scrollH; -static varinfo_t flash_text_TextField_text; -static methodinfo_t flash_text_TextField_getLineLength; -static varinfo_t flash_text_TextField_textHeight; -static varinfo_t flash_text_TextField_antiAliasType; -static varinfo_t flash_text_TextField_styleSheet; -static varinfo_t flash_text_TextField_background; -static methodinfo_t flash_text_TextField_replaceSelectedText; -static varinfo_t flash_text_TextField_borderColor; -static varinfo_t flash_text_TextField_maxScrollH; -static varinfo_t flash_text_TextField_maxChars; -static methodinfo_t flash_text_TextField_getLineMetrics; -static varinfo_t flash_text_TextField_selectionEndIndex; -static methodinfo_t flash_text_TextField_insertXMLText; -static varinfo_t flash_text_TextField_condenseWhite; -static methodinfo_t flash_text_TextField_getTextFormat; -static varinfo_t flash_text_TextField_border; -static varinfo_t flash_text_TextField_selectedText; -static methodinfo_t flash_text_TextField_pasteRichText; -static varinfo_t flash_text_TextField_bottomScrollV; -static methodinfo_t flash_text_TextField_getLineIndexOfChar; -static methodinfo_t flash_text_TextField_replaceText; -static varinfo_t flash_text_TextField_defaultTextFormat; -static varinfo_t flash_text_TextField_restrict; -static varinfo_t flash_text_TextField_htmlText; -static methodinfo_t flash_text_TextField_copyRichText; -static methodinfo_t flash_text_TextField_getLineText; -static methodinfo_t flash_text_TextField_getFirstCharInParagraph; -static methodinfo_t flash_text_TextField_setSelection; -static varinfo_t flash_text_TextField_length; -static varinfo_t flash_text_TextField_wordWrap; -static methodinfo_t flash_text_TextField_appendText; -static varinfo_t flash_text_TextField_caretIndex; -static varinfo_t flash_text_TextField_mouseWheelEnabled; -static varinfo_t flash_text_TextField_selectionBeginIndex; -static varinfo_t flash_text_TextField_sharpness; -static varinfo_t flash_text_TextField_type; -static methodinfo_t flash_text_TextField_getLineIndexAtPoint; -static methodinfo_t flash_text_TextField_getCharIndexAtPoint; -static methodinfo_t flash_text_TextField_getXMLText; -static methodinfo_t flash_text_TextField_getParagraphLength; -static methodinfo_t flash_text_TextField_getRawText; -static varinfo_t flash_text_TextField_gridFitType; -static methodinfo_t flash_text_TextField_getLineOffset; -static varinfo_t flash_text_TextField_backgroundColor; -static varinfo_t flash_text_TextField_multiline; -static varinfo_t flash_text_TextField_numLines; -static methodinfo_t flash_text_TextField_getImageReference; -static varinfo_t flash_text_TextField_displayAsPassword; -static varinfo_t flash_text_TextField_textWidth; -static varinfo_t flash_text_TextField_autoSize; -static varinfo_t flash_text_TextField_selectable; -static methodinfo_t flash_text_TextField_getCharBoundaries; -static varinfo_t flash_text_TextField_alwaysShowSelection; -static varinfo_t flash_text_TextField_thickness; -static varinfo_t flash_text_TextField_useRichTextClipboard; -static varinfo_t flash_text_TextField_scrollV; -static methodinfo_t flash_text_TextField_getTextRuns; -static methodinfo_t flash_text_TextField_setTextFormat; -static varinfo_t flash_text_TextField_textColor; -static varinfo_t flash_text_TextField_maxScrollV; -static varinfo_t flash_text_TextField_embedFonts; -static varinfo_t flash_text_TextField_scrollH; -static varinfo_t flash_text_TextField_text; -static methodinfo_t flash_text_TextField_getLineLength; -static varinfo_t flash_text_TextField_textHeight; -static varinfo_t flash_text_TextField_antiAliasType; -static varinfo_t flash_text_TextField_styleSheet; -static varinfo_t flash_text_TextField_background; -static methodinfo_t flash_text_TextField_replaceSelectedText; -static varinfo_t flash_text_TextField_borderColor; -static varinfo_t flash_text_TextField_maxScrollH; -static varinfo_t flash_text_TextField_maxChars; -static methodinfo_t flash_text_TextField_getLineMetrics; -static varinfo_t flash_text_TextField_selectionEndIndex; -static methodinfo_t flash_text_TextField_insertXMLText; -static varinfo_t flash_text_TextField_condenseWhite; -static classinfo_t flash_printing_PrintJobOrientation; -static classinfo_t flash_text_TextRenderer; -static classinfo_t flash_net_NetConnection; -static varinfo_t flash_net_NetConnection_nearID; -static varinfo_t flash_net_NetConnection_client; -static varinfo_t flash_net_NetConnection_farNonce; -static varinfo_t flash_net_NetConnection_objectEncoding; -static varinfo_t flash_net_NetConnection_farID; -static varinfo_t flash_net_NetConnection_connected; -static methodinfo_t flash_net_NetConnection_call; -static varinfo_t flash_net_NetConnection_usingTLS; -static varinfo_t flash_net_NetConnection_proxyType; -static methodinfo_t flash_net_NetConnection_addHeader; -static varinfo_t flash_net_NetConnection_protocol; -static methodinfo_t flash_net_NetConnection_close; -static varinfo_t flash_net_NetConnection_nearNonce; -static methodinfo_t flash_net_NetConnection_connect; -static varinfo_t flash_net_NetConnection_unconnectedPeerStreams; -static varinfo_t flash_net_NetConnection_maxPeerConnections; -static varinfo_t flash_net_NetConnection_connectedProxyType; -static varinfo_t flash_net_NetConnection_uri; -static varinfo_t flash_net_NetConnection_nearID; -static varinfo_t flash_net_NetConnection_client; -static varinfo_t flash_net_NetConnection_farNonce; -static varinfo_t flash_net_NetConnection_objectEncoding; -static varinfo_t flash_net_NetConnection_farID; -static varinfo_t flash_net_NetConnection_connected; -static methodinfo_t flash_net_NetConnection_call; -static varinfo_t flash_net_NetConnection_usingTLS; -static varinfo_t flash_net_NetConnection_proxyType; -static methodinfo_t flash_net_NetConnection_addHeader; -static varinfo_t flash_net_NetConnection_protocol; -static methodinfo_t flash_net_NetConnection_close; -static varinfo_t flash_net_NetConnection_nearNonce; -static methodinfo_t flash_net_NetConnection_connect; -static varinfo_t flash_net_NetConnection_unconnectedPeerStreams; -static varinfo_t flash_net_NetConnection_maxPeerConnections; -static varinfo_t flash_net_NetConnection_connectedProxyType; -static varinfo_t flash_net_NetConnection_uri; -static methodinfo_t _decodeURIComponent; -static methodinfo_t flash_sampler_isGetterSetter; -static methodinfo_t flash_utils_getQualifiedSuperclassName; -static classinfo_t flash_display_GraphicsPathWinding; -static classinfo_t flash_text_engine_TabStop; -static varinfo_t flash_text_engine_TabStop_alignment; -static varinfo_t flash_text_engine_TabStop_position; -static varinfo_t flash_text_engine_TabStop_decimalAlignmentToken; -static varinfo_t flash_text_engine_TabStop_alignment; -static varinfo_t flash_text_engine_TabStop_position; -static varinfo_t flash_text_engine_TabStop_decimalAlignmentToken; -static classinfo_t flash_text_engine_JustificationStyle; -static methodinfo_t flash_sampler_startSampling; -static classinfo_t flash_text_engine_TextRotation; -static methodinfo_t flash_sampler_clearSamples; -static classinfo_t flash_system_IMEConversionMode; -static classinfo_t flash_display_StageScaleMode; -static methodinfo_t flash_sampler_getSize; -static classinfo_t flash_net_URLStream; -static methodinfo_t flash_net_URLStream_readUTF; -static methodinfo_t flash_net_URLStream_readByte; -static methodinfo_t flash_net_URLStream_readUTFBytes; -static methodinfo_t flash_net_URLStream_readShort; -static varinfo_t flash_net_URLStream_objectEncoding; -static varinfo_t flash_net_URLStream_connected; -static methodinfo_t flash_net_URLStream_readUnsignedInt; -static methodinfo_t flash_net_URLStream_readDouble; -static methodinfo_t flash_net_URLStream_readBytes; -static methodinfo_t flash_net_URLStream_readUnsignedByte; -static methodinfo_t flash_net_URLStream_readMultiByte; -static methodinfo_t flash_net_URLStream_readInt; -static varinfo_t flash_net_URLStream_bytesAvailable; -static methodinfo_t flash_net_URLStream_load; -static methodinfo_t flash_net_URLStream_close; -static methodinfo_t flash_net_URLStream_readUnsignedShort; -static methodinfo_t flash_net_URLStream_readObject; -static methodinfo_t flash_net_URLStream_readFloat; -static varinfo_t flash_net_URLStream_endian; -static methodinfo_t flash_net_URLStream_readBoolean; -static methodinfo_t flash_net_URLStream_readUTF; -static methodinfo_t flash_net_URLStream_readByte; -static methodinfo_t flash_net_URLStream_readUTFBytes; -static methodinfo_t flash_net_URLStream_readShort; -static varinfo_t flash_net_URLStream_objectEncoding; -static varinfo_t flash_net_URLStream_connected; -static methodinfo_t flash_net_URLStream_readUnsignedInt; -static methodinfo_t flash_net_URLStream_readDouble; -static methodinfo_t flash_net_URLStream_readBytes; -static methodinfo_t flash_net_URLStream_readUnsignedByte; -static methodinfo_t flash_net_URLStream_readMultiByte; -static methodinfo_t flash_net_URLStream_readInt; -static varinfo_t flash_net_URLStream_bytesAvailable; -static methodinfo_t flash_net_URLStream_load; -static methodinfo_t flash_net_URLStream_close; -static methodinfo_t flash_net_URLStream_readUnsignedShort; -static methodinfo_t flash_net_URLStream_readObject; -static methodinfo_t flash_net_URLStream_readFloat; -static varinfo_t flash_net_URLStream_endian; -static methodinfo_t flash_net_URLStream_readBoolean; -static classinfo_t flash_display_BlendMode; -static classinfo_t flash_ui_Mouse; -static classinfo_t flash_errors_InvalidSWFError; -static classinfo_t flash_text_engine_RenderingMode; -static classinfo_t flash_display_GraphicsTrianglePath; -static varinfo_t flash_display_GraphicsTrianglePath_culling; -static varinfo_t flash_display_GraphicsTrianglePath_vertices; -static varinfo_t flash_display_GraphicsTrianglePath_indices; -static varinfo_t flash_display_GraphicsTrianglePath_uvtData; -static varinfo_t flash_display_GraphicsTrianglePath_culling; -static varinfo_t flash_display_GraphicsTrianglePath_vertices; -static varinfo_t flash_display_GraphicsTrianglePath_indices; -static varinfo_t flash_display_GraphicsTrianglePath_uvtData; -static classinfo_t flash_display_IGraphicsFill; -static classinfo_t flash_text_engine_TypographicCase; -static classinfo_t _XML; -static methodinfo_t _XML_normalize; -static methodinfo_t _XML_removeNamespace; -static methodinfo_t _XML_prependChild; -static methodinfo_t _XML_toXMLString; -static methodinfo_t _XML_text; -static methodinfo_t _XML_nodeKind; -static methodinfo_t _XML_copy; -static methodinfo_t _XML_toString; -static methodinfo_t _XML_childIndex; -static methodinfo_t _XML_setName; -static methodinfo_t _XML_setLocalName; -static methodinfo_t _XML_namespace; -static methodinfo_t _XML_insertChildBefore; -static methodinfo_t _XML_addNamespace; -static methodinfo_t _XML_propertyIsEnumerable; -static methodinfo_t _XML_comments; -static methodinfo_t _XML_attributes; -static methodinfo_t _XML_descendants; -static methodinfo_t _XML_replace; -static methodinfo_t _XML_setNotification; -static methodinfo_t _XML_children; -static methodinfo_t _XML_contains; -static methodinfo_t _XML_hasSimpleContent; -static methodinfo_t _XML_elements; -static methodinfo_t _XML_hasComplexContent; -static methodinfo_t _XML_insertChildAfter; -static methodinfo_t _XML_parent; -static methodinfo_t _XML_length; -static methodinfo_t _XML_processingInstructions; -static methodinfo_t _XML_child; -static methodinfo_t _XML_appendChild; -static methodinfo_t _XML_valueOf; -static methodinfo_t _XML_localName; -static methodinfo_t _XML_notification; -static methodinfo_t _XML_inScopeNamespaces; -static methodinfo_t _XML_hasOwnProperty; -static methodinfo_t _XML_namespaceDeclarations; -static methodinfo_t _XML_setNamespace; -static methodinfo_t _XML_name; -static methodinfo_t _XML_setChildren; -static methodinfo_t _XML_attribute; -static methodinfo_t _XML_normalize; -static methodinfo_t _XML_removeNamespace; -static methodinfo_t _XML_prependChild; -static methodinfo_t _XML_toXMLString; -static methodinfo_t _XML_text; -static methodinfo_t _XML_nodeKind; -static methodinfo_t _XML_copy; -static methodinfo_t _XML_toString; -static methodinfo_t _XML_childIndex; -static methodinfo_t _XML_setName; -static methodinfo_t _XML_setLocalName; -static methodinfo_t _XML_namespace; -static methodinfo_t _XML_insertChildBefore; -static methodinfo_t _XML_addNamespace; -static methodinfo_t _XML_propertyIsEnumerable; -static methodinfo_t _XML_comments; -static methodinfo_t _XML_attributes; -static methodinfo_t _XML_descendants; -static methodinfo_t _XML_replace; -static methodinfo_t _XML_setNotification; -static methodinfo_t _XML_children; -static methodinfo_t _XML_contains; -static methodinfo_t _XML_hasSimpleContent; -static methodinfo_t _XML_elements; -static methodinfo_t _XML_hasComplexContent; -static methodinfo_t _XML_insertChildAfter; -static methodinfo_t _XML_parent; -static methodinfo_t _XML_length; -static methodinfo_t _XML_processingInstructions; -static methodinfo_t _XML_child; -static methodinfo_t _XML_appendChild; -static methodinfo_t _XML_valueOf; -static methodinfo_t _XML_localName; -static methodinfo_t _XML_notification; -static methodinfo_t _XML_inScopeNamespaces; -static methodinfo_t _XML_hasOwnProperty; -static methodinfo_t _XML_namespaceDeclarations; -static methodinfo_t _XML_setNamespace; -static methodinfo_t _XML_name; -static methodinfo_t _XML_setChildren; -static methodinfo_t _XML_attribute; -static classinfo_t flash_net_NetStreamInfo; -static varinfo_t flash_net_NetStreamInfo_maxBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_dataBufferByteLength; -static varinfo_t flash_net_NetStreamInfo_videoByteCount; -static varinfo_t flash_net_NetStreamInfo_videoBufferLength; -static varinfo_t flash_net_NetStreamInfo_audioBufferByteLength; -static varinfo_t flash_net_NetStreamInfo_dataBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_SRTT; -static varinfo_t flash_net_NetStreamInfo_droppedFrames; -static varinfo_t flash_net_NetStreamInfo_audioByteCount; -static varinfo_t flash_net_NetStreamInfo_audioBufferLength; -static varinfo_t flash_net_NetStreamInfo_byteCount; -static methodinfo_t flash_net_NetStreamInfo_toString; -static varinfo_t flash_net_NetStreamInfo_dataByteCount; -static varinfo_t flash_net_NetStreamInfo_videoBufferByteLength; -static varinfo_t flash_net_NetStreamInfo_dataBufferLength; -static varinfo_t flash_net_NetStreamInfo_audioLossRate; -static varinfo_t flash_net_NetStreamInfo_videoBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_currentBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_audioBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_playbackBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_maxBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_dataBufferByteLength; -static varinfo_t flash_net_NetStreamInfo_videoByteCount; -static varinfo_t flash_net_NetStreamInfo_videoBufferLength; -static varinfo_t flash_net_NetStreamInfo_audioBufferByteLength; -static varinfo_t flash_net_NetStreamInfo_dataBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_SRTT; -static varinfo_t flash_net_NetStreamInfo_droppedFrames; -static varinfo_t flash_net_NetStreamInfo_audioByteCount; -static varinfo_t flash_net_NetStreamInfo_audioBufferLength; -static varinfo_t flash_net_NetStreamInfo_byteCount; -static methodinfo_t flash_net_NetStreamInfo_toString; -static varinfo_t flash_net_NetStreamInfo_dataByteCount; -static varinfo_t flash_net_NetStreamInfo_videoBufferByteLength; -static varinfo_t flash_net_NetStreamInfo_dataBufferLength; -static varinfo_t flash_net_NetStreamInfo_audioLossRate; -static varinfo_t flash_net_NetStreamInfo_videoBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_currentBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_audioBytesPerSecond; -static varinfo_t flash_net_NetStreamInfo_playbackBytesPerSecond; -static classinfo_t flash_display_Stage; -static methodinfo_t flash_display_Stage_setChildIndex; -static varinfo_t flash_display_Stage_stageFocusRect; -static varinfo_t flash_display_Stage_frameRate; -static methodinfo_t flash_display_Stage_invalidate; -static varinfo_t flash_display_Stage_textSnapshot; -static varinfo_t flash_display_Stage_quality; -static methodinfo_t flash_display_Stage_willTrigger; -static methodinfo_t flash_display_Stage_dispatchEvent; -static methodinfo_t flash_display_Stage_isFocusInaccessible; -static methodinfo_t flash_display_Stage_removeChildAt; -static varinfo_t flash_display_Stage_fullScreenWidth; -static methodinfo_t flash_display_Stage_addChildAt; -static varinfo_t flash_display_Stage_height; -static varinfo_t flash_display_Stage_fullScreenSourceRect; -static varinfo_t flash_display_Stage_width; -static methodinfo_t flash_display_Stage_addChild; -static varinfo_t flash_display_Stage_numChildren; -static varinfo_t flash_display_Stage_mouseChildren; -static methodinfo_t flash_display_Stage_swapChildrenAt; -static varinfo_t flash_display_Stage_showDefaultContextMenu; -static methodinfo_t flash_display_Stage_addEventListener; -static varinfo_t flash_display_Stage_stageHeight; -static varinfo_t flash_display_Stage_fullScreenHeight; -static varinfo_t flash_display_Stage_align; -static methodinfo_t flash_display_Stage_hasEventListener; -static varinfo_t flash_display_Stage_displayState; -static varinfo_t flash_display_Stage_scaleMode; -static varinfo_t flash_display_Stage_tabChildren; -static varinfo_t flash_display_Stage_focus; -static varinfo_t flash_display_Stage_colorCorrection; -static varinfo_t flash_display_Stage_colorCorrectionSupport; -static varinfo_t flash_display_Stage_stageWidth; -static methodinfo_t flash_display_Stage_setChildIndex; -static varinfo_t flash_display_Stage_stageFocusRect; -static varinfo_t flash_display_Stage_frameRate; -static methodinfo_t flash_display_Stage_invalidate; -static varinfo_t flash_display_Stage_textSnapshot; -static varinfo_t flash_display_Stage_quality; -static methodinfo_t flash_display_Stage_willTrigger; -static methodinfo_t flash_display_Stage_dispatchEvent; -static methodinfo_t flash_display_Stage_isFocusInaccessible; -static methodinfo_t flash_display_Stage_removeChildAt; -static varinfo_t flash_display_Stage_fullScreenWidth; -static methodinfo_t flash_display_Stage_addChildAt; -static varinfo_t flash_display_Stage_height; -static varinfo_t flash_display_Stage_fullScreenSourceRect; -static varinfo_t flash_display_Stage_width; -static methodinfo_t flash_display_Stage_addChild; -static varinfo_t flash_display_Stage_numChildren; -static varinfo_t flash_display_Stage_mouseChildren; -static methodinfo_t flash_display_Stage_swapChildrenAt; -static varinfo_t flash_display_Stage_showDefaultContextMenu; -static methodinfo_t flash_display_Stage_addEventListener; -static varinfo_t flash_display_Stage_stageHeight; -static varinfo_t flash_display_Stage_fullScreenHeight; -static varinfo_t flash_display_Stage_align; -static methodinfo_t flash_display_Stage_hasEventListener; -static varinfo_t flash_display_Stage_displayState; -static varinfo_t flash_display_Stage_scaleMode; -static varinfo_t flash_display_Stage_tabChildren; -static varinfo_t flash_display_Stage_focus; -static varinfo_t flash_display_Stage_colorCorrection; -static varinfo_t flash_display_Stage_colorCorrectionSupport; -static varinfo_t flash_display_Stage_stageWidth; -static classinfo_t flash_ui_ContextMenuItem; -static varinfo_t flash_ui_ContextMenuItem_separatorBefore; -static varinfo_t flash_ui_ContextMenuItem_enabled; -static varinfo_t flash_ui_ContextMenuItem_caption; -static methodinfo_t flash_ui_ContextMenuItem_clone; -static varinfo_t flash_ui_ContextMenuItem_visible; -static varinfo_t flash_ui_ContextMenuItem_separatorBefore; -static varinfo_t flash_ui_ContextMenuItem_enabled; -static varinfo_t flash_ui_ContextMenuItem_caption; -static methodinfo_t flash_ui_ContextMenuItem_clone; -static varinfo_t flash_ui_ContextMenuItem_visible; -static classinfo_t flash_trace_Trace; -static classinfo_t flash_events_TimerEvent; -static methodinfo_t flash_events_TimerEvent_toString; -static methodinfo_t flash_events_TimerEvent_clone; -static methodinfo_t flash_events_TimerEvent_updateAfterEvent; -static methodinfo_t flash_events_TimerEvent_toString; -static methodinfo_t flash_events_TimerEvent_clone; -static methodinfo_t flash_events_TimerEvent_updateAfterEvent; -static classinfo_t flash_events_SampleDataEvent; -static methodinfo_t flash_events_SampleDataEvent_toString; -static varinfo_t flash_events_SampleDataEvent_position; -static methodinfo_t flash_events_SampleDataEvent_clone; -static varinfo_t flash_events_SampleDataEvent_data; -static methodinfo_t flash_events_SampleDataEvent_toString; -static varinfo_t flash_events_SampleDataEvent_position; -static methodinfo_t flash_events_SampleDataEvent_clone; -static varinfo_t flash_events_SampleDataEvent_data; -static classinfo_t flash_display_ShaderPrecision; -static classinfo_t flash_net_FileReference; -static varinfo_t flash_net_FileReference_type; -static methodinfo_t flash_net_FileReference_browse; -static varinfo_t flash_net_FileReference_creationDate; -static methodinfo_t flash_net_FileReference_upload; -static methodinfo_t flash_net_FileReference_download; -static methodinfo_t flash_net_FileReference_save; -static methodinfo_t flash_net_FileReference_cancel; -static varinfo_t flash_net_FileReference_creator; -static varinfo_t flash_net_FileReference_data; -static varinfo_t flash_net_FileReference_size; -static varinfo_t flash_net_FileReference_name; -static methodinfo_t flash_net_FileReference_load; -static varinfo_t flash_net_FileReference_modificationDate; -static varinfo_t flash_net_FileReference_type; -static methodinfo_t flash_net_FileReference_browse; -static varinfo_t flash_net_FileReference_creationDate; -static methodinfo_t flash_net_FileReference_upload; -static methodinfo_t flash_net_FileReference_download; -static methodinfo_t flash_net_FileReference_save; -static methodinfo_t flash_net_FileReference_cancel; -static varinfo_t flash_net_FileReference_creator; -static varinfo_t flash_net_FileReference_data; -static varinfo_t flash_net_FileReference_size; -static varinfo_t flash_net_FileReference_name; -static methodinfo_t flash_net_FileReference_load; -static varinfo_t flash_net_FileReference_modificationDate; -static classinfo_t _DefinitionError; -static classinfo_t flash_events_EventDispatcher; -static methodinfo_t flash_events_EventDispatcher_willTrigger; -static methodinfo_t flash_events_EventDispatcher_toString; -static methodinfo_t flash_events_EventDispatcher_removeEventListener; -static methodinfo_t flash_events_EventDispatcher_hasEventListener; -static methodinfo_t flash_events_EventDispatcher_addEventListener; -static methodinfo_t flash_events_EventDispatcher_dispatchEvent; -static methodinfo_t flash_events_EventDispatcher_willTrigger; -static methodinfo_t flash_events_EventDispatcher_toString; -static methodinfo_t flash_events_EventDispatcher_removeEventListener; -static methodinfo_t flash_events_EventDispatcher_hasEventListener; -static methodinfo_t flash_events_EventDispatcher_addEventListener; -static methodinfo_t flash_events_EventDispatcher_dispatchEvent; -static classinfo_t flash_net_SharedObjectFlushStatus; -static classinfo_t flash_text_TextLineMetrics; -static varinfo_t flash_text_TextLineMetrics_descent; -static varinfo_t flash_text_TextLineMetrics_width; -static varinfo_t flash_text_TextLineMetrics_ascent; -static varinfo_t flash_text_TextLineMetrics_leading; -static varinfo_t flash_text_TextLineMetrics_height; -static varinfo_t flash_text_TextLineMetrics_x; -static varinfo_t flash_text_TextLineMetrics_descent; -static varinfo_t flash_text_TextLineMetrics_width; -static varinfo_t flash_text_TextLineMetrics_ascent; -static varinfo_t flash_text_TextLineMetrics_leading; -static varinfo_t flash_text_TextLineMetrics_height; -static varinfo_t flash_text_TextLineMetrics_x; -static classinfo_t flash_text_AntiAliasType; -static classinfo_t flash_system_SecurityDomain; -static classinfo_t flash_text_Font; -static methodinfo_t flash_text_Font_hasGlyphs; -static varinfo_t flash_text_Font_fontName; -static varinfo_t flash_text_Font_fontStyle; -static varinfo_t flash_text_Font_fontType; -static methodinfo_t flash_text_Font_hasGlyphs; -static varinfo_t flash_text_Font_fontName; -static varinfo_t flash_text_Font_fontStyle; -static varinfo_t flash_text_Font_fontType; -static classinfo_t _RegExp; -static varinfo_t _RegExp_source; -static methodinfo_t _RegExp_test; -static varinfo_t _RegExp_global; -static methodinfo_t _RegExp_exec; -static varinfo_t _RegExp_ignoreCase; -static varinfo_t _RegExp_dotall; -static varinfo_t _RegExp_lastIndex; -static varinfo_t _RegExp_extended; -static varinfo_t _RegExp_multiline; -static varinfo_t _RegExp_source; -static methodinfo_t _RegExp_test; -static varinfo_t _RegExp_global; -static methodinfo_t _RegExp_exec; -static varinfo_t _RegExp_ignoreCase; -static varinfo_t _RegExp_dotall; -static varinfo_t _RegExp_lastIndex; -static varinfo_t _RegExp_extended; -static varinfo_t _RegExp_multiline; -static classinfo_t flash_accessibility_AccessibilityProperties; -static varinfo_t flash_accessibility_AccessibilityProperties_forceSimple; -static varinfo_t flash_accessibility_AccessibilityProperties_noAutoLabeling; -static varinfo_t flash_accessibility_AccessibilityProperties_description; -static varinfo_t flash_accessibility_AccessibilityProperties_name; -static varinfo_t flash_accessibility_AccessibilityProperties_shortcut; -static varinfo_t flash_accessibility_AccessibilityProperties_silent; -static varinfo_t flash_accessibility_AccessibilityProperties_forceSimple; -static varinfo_t flash_accessibility_AccessibilityProperties_noAutoLabeling; -static varinfo_t flash_accessibility_AccessibilityProperties_description; -static varinfo_t flash_accessibility_AccessibilityProperties_name; -static varinfo_t flash_accessibility_AccessibilityProperties_shortcut; -static varinfo_t flash_accessibility_AccessibilityProperties_silent; -static classinfo_t flash_ui_ContextMenu; -static methodinfo_t flash_ui_ContextMenu_hideBuiltInItems; -static varinfo_t flash_ui_ContextMenu_clipboardItems; -static varinfo_t flash_ui_ContextMenu_builtInItems; -static varinfo_t flash_ui_ContextMenu_customItems; -static methodinfo_t flash_ui_ContextMenu_clone; -static varinfo_t flash_ui_ContextMenu_link; -static varinfo_t flash_ui_ContextMenu_clipboardMenu; -static methodinfo_t flash_ui_ContextMenu_hideBuiltInItems; -static varinfo_t flash_ui_ContextMenu_clipboardItems; -static varinfo_t flash_ui_ContextMenu_builtInItems; -static varinfo_t flash_ui_ContextMenu_customItems; -static methodinfo_t flash_ui_ContextMenu_clone; -static varinfo_t flash_ui_ContextMenu_link; -static varinfo_t flash_ui_ContextMenu_clipboardMenu; -static classinfo_t flash_text_TextFieldAutoSize; -static classinfo_t _Math; -static classinfo_t flash_display_ColorCorrectionSupport; -static classinfo_t flash_errors_IOError; -static methodinfo_t _trace; -static classinfo_t flash_ui_ContextMenuBuiltInItems; -static varinfo_t flash_ui_ContextMenuBuiltInItems_zoom; -static varinfo_t flash_ui_ContextMenuBuiltInItems_save; -static varinfo_t flash_ui_ContextMenuBuiltInItems_loop; -static varinfo_t flash_ui_ContextMenuBuiltInItems_print; -static varinfo_t flash_ui_ContextMenuBuiltInItems_forwardAndBack; -static varinfo_t flash_ui_ContextMenuBuiltInItems_rewind; -static methodinfo_t flash_ui_ContextMenuBuiltInItems_clone; -static varinfo_t flash_ui_ContextMenuBuiltInItems_quality; -static varinfo_t flash_ui_ContextMenuBuiltInItems_play; -static varinfo_t flash_ui_ContextMenuBuiltInItems_zoom; -static varinfo_t flash_ui_ContextMenuBuiltInItems_save; -static varinfo_t flash_ui_ContextMenuBuiltInItems_loop; -static varinfo_t flash_ui_ContextMenuBuiltInItems_print; -static varinfo_t flash_ui_ContextMenuBuiltInItems_forwardAndBack; -static varinfo_t flash_ui_ContextMenuBuiltInItems_rewind; -static methodinfo_t flash_ui_ContextMenuBuiltInItems_clone; -static varinfo_t flash_ui_ContextMenuBuiltInItems_quality; -static varinfo_t flash_ui_ContextMenuBuiltInItems_play; -static classinfo_t flash_net_FileReferenceList; -static varinfo_t flash_net_FileReferenceList_fileList; -static methodinfo_t flash_net_FileReferenceList_browse; -static varinfo_t flash_net_FileReferenceList_fileList; -static methodinfo_t flash_net_FileReferenceList_browse; -static classinfo_t flash_display_TriangleCulling; -static classinfo_t flash_media_SoundMixer; -static classinfo_t adobe_utils_XMLUI; -static methodinfo_t _escape; -static methodinfo_t flash_utils_setInterval; -static classinfo_t flash_events_StatusEvent; -static methodinfo_t flash_events_StatusEvent_toString; -static varinfo_t flash_events_StatusEvent_code; -static methodinfo_t flash_events_StatusEvent_clone; -static varinfo_t flash_events_StatusEvent_level; -static methodinfo_t flash_events_StatusEvent_toString; -static varinfo_t flash_events_StatusEvent_code; -static methodinfo_t flash_events_StatusEvent_clone; -static varinfo_t flash_events_StatusEvent_level; -static classinfo_t flash_display_IGraphicsPath; -static classinfo_t flash_events_ShaderEvent; -static varinfo_t flash_events_ShaderEvent_vector; -static methodinfo_t flash_events_ShaderEvent_toString; -static varinfo_t flash_events_ShaderEvent_bitmapData; -static methodinfo_t flash_events_ShaderEvent_clone; -static varinfo_t flash_events_ShaderEvent_byteArray; -static varinfo_t flash_events_ShaderEvent_vector; -static methodinfo_t flash_events_ShaderEvent_toString; -static varinfo_t flash_events_ShaderEvent_bitmapData; -static methodinfo_t flash_events_ShaderEvent_clone; -static varinfo_t flash_events_ShaderEvent_byteArray; -static classinfo_t flash_display_Shader; -static varinfo_t flash_display_Shader_precisionHint; -static varinfo_t flash_display_Shader_data; -static varinfo_t flash_display_Shader_precisionHint; -static varinfo_t flash_display_Shader_data; -static classinfo_t flash_errors_StackOverflowError; -static methodinfo_t flash_sampler_getInvocationCount; -static classinfo_t flash_text_engine_Kerning; -static classinfo_t flash_text_CSMSettings; -static varinfo_t flash_text_CSMSettings_fontSize; -static varinfo_t flash_text_CSMSettings_outsideCutoff; -static varinfo_t flash_text_CSMSettings_insideCutoff; -static varinfo_t flash_text_CSMSettings_fontSize; -static varinfo_t flash_text_CSMSettings_outsideCutoff; -static varinfo_t flash_text_CSMSettings_insideCutoff; -static classinfo_t _RangeError; -static classinfo_t _Number; -static methodinfo_t _Number_valueOf; -static methodinfo_t _Number_toString; -static methodinfo_t _Number_toExponential; -static methodinfo_t _Number_toFixed; -static methodinfo_t _Number_toPrecision; -static methodinfo_t _Number_valueOf; -static methodinfo_t _Number_toString; -static methodinfo_t _Number_toExponential; -static methodinfo_t _Number_toFixed; -static methodinfo_t _Number_toPrecision; -static classinfo_t flash_display_Graphics; -static methodinfo_t flash_display_Graphics_drawPath; -static methodinfo_t flash_display_Graphics_drawEllipse; -static methodinfo_t flash_display_Graphics_drawRoundRectComplex; -static methodinfo_t flash_display_Graphics_moveTo; -static methodinfo_t flash_display_Graphics_lineShaderStyle; -static methodinfo_t flash_display_Graphics_beginFill; -static methodinfo_t flash_display_Graphics_beginGradientFill; -static methodinfo_t flash_display_Graphics_drawGraphicsData; -static methodinfo_t flash_display_Graphics_lineGradientStyle; -static methodinfo_t flash_display_Graphics_drawRoundRect; -static methodinfo_t flash_display_Graphics_beginBitmapFill; -static methodinfo_t flash_display_Graphics_lineStyle; -static methodinfo_t flash_display_Graphics_lineTo; -static methodinfo_t flash_display_Graphics_endFill; -static methodinfo_t flash_display_Graphics_copyFrom; -static methodinfo_t flash_display_Graphics_lineBitmapStyle; -static methodinfo_t flash_display_Graphics_curveTo; -static methodinfo_t flash_display_Graphics_clear; -static methodinfo_t flash_display_Graphics_drawCircle; -static methodinfo_t flash_display_Graphics_beginShaderFill; -static methodinfo_t flash_display_Graphics_drawTriangles; -static methodinfo_t flash_display_Graphics_drawRect; -static methodinfo_t flash_display_Graphics_drawPath; -static methodinfo_t flash_display_Graphics_drawEllipse; -static methodinfo_t flash_display_Graphics_drawRoundRectComplex; -static methodinfo_t flash_display_Graphics_moveTo; -static methodinfo_t flash_display_Graphics_lineShaderStyle; -static methodinfo_t flash_display_Graphics_beginFill; -static methodinfo_t flash_display_Graphics_beginGradientFill; -static methodinfo_t flash_display_Graphics_drawGraphicsData; -static methodinfo_t flash_display_Graphics_lineGradientStyle; -static methodinfo_t flash_display_Graphics_drawRoundRect; -static methodinfo_t flash_display_Graphics_beginBitmapFill; -static methodinfo_t flash_display_Graphics_lineStyle; -static methodinfo_t flash_display_Graphics_lineTo; -static methodinfo_t flash_display_Graphics_endFill; -static methodinfo_t flash_display_Graphics_copyFrom; -static methodinfo_t flash_display_Graphics_lineBitmapStyle; -static methodinfo_t flash_display_Graphics_curveTo; -static methodinfo_t flash_display_Graphics_clear; -static methodinfo_t flash_display_Graphics_drawCircle; -static methodinfo_t flash_display_Graphics_beginShaderFill; -static methodinfo_t flash_display_Graphics_drawTriangles; -static methodinfo_t flash_display_Graphics_drawRect; -static classinfo_t _SyntaxError; -static classinfo_t flash_sampler_NewObjectSample; -static varinfo_t flash_sampler_NewObjectSample_type; -static varinfo_t flash_sampler_NewObjectSample_object; -static varinfo_t flash_sampler_NewObjectSample_id; -static varinfo_t flash_sampler_NewObjectSample_type; -static varinfo_t flash_sampler_NewObjectSample_object; -static varinfo_t flash_sampler_NewObjectSample_id; -static classinfo_t flash_net_FileFilter; -static varinfo_t flash_net_FileFilter_extension; -static varinfo_t flash_net_FileFilter_description; -static varinfo_t flash_net_FileFilter_macType; -static varinfo_t flash_net_FileFilter_extension; -static varinfo_t flash_net_FileFilter_description; -static varinfo_t flash_net_FileFilter_macType; -static classinfo_t flash_display_BitmapDataChannel; -static methodinfo_t flash_utils_clearInterval; -static classinfo_t flash_text_engine_ContentElement; -static varinfo_t flash_text_engine_ContentElement_eventMirror; -static varinfo_t flash_text_engine_ContentElement_groupElement; -static varinfo_t flash_text_engine_ContentElement_textRotation; -static varinfo_t flash_text_engine_ContentElement_text; -static varinfo_t flash_text_engine_ContentElement_userData; -static varinfo_t flash_text_engine_ContentElement_elementFormat; -static varinfo_t flash_text_engine_ContentElement_textBlock; -static varinfo_t flash_text_engine_ContentElement_rawText; -static varinfo_t flash_text_engine_ContentElement_textBlockBeginIndex; -static varinfo_t flash_text_engine_ContentElement_eventMirror; -static varinfo_t flash_text_engine_ContentElement_groupElement; -static varinfo_t flash_text_engine_ContentElement_textRotation; -static varinfo_t flash_text_engine_ContentElement_text; -static varinfo_t flash_text_engine_ContentElement_userData; -static varinfo_t flash_text_engine_ContentElement_elementFormat; -static varinfo_t flash_text_engine_ContentElement_textBlock; -static varinfo_t flash_text_engine_ContentElement_rawText; -static varinfo_t flash_text_engine_ContentElement_textBlockBeginIndex; -static classinfo_t flash_utils_Endian; -static methodinfo_t flash_net_navigateToURL; -static classinfo_t flash_events_ProgressEvent; -static varinfo_t flash_events_ProgressEvent_bytesLoaded; -static methodinfo_t flash_events_ProgressEvent_toString; -static varinfo_t flash_events_ProgressEvent_bytesTotal; -static methodinfo_t flash_events_ProgressEvent_clone; -static varinfo_t flash_events_ProgressEvent_bytesLoaded; -static methodinfo_t flash_events_ProgressEvent_toString; -static varinfo_t flash_events_ProgressEvent_bytesTotal; -static methodinfo_t flash_events_ProgressEvent_clone; -static classinfo_t flash_media_Sound; -static methodinfo_t flash_media_Sound_extract; -static varinfo_t flash_media_Sound_bytesLoaded; -static varinfo_t flash_media_Sound_id3; -static methodinfo_t flash_media_Sound_play; -static varinfo_t flash_media_Sound_url; -static varinfo_t flash_media_Sound_isBuffering; -static methodinfo_t flash_media_Sound_load; -static varinfo_t flash_media_Sound_bytesTotal; -static varinfo_t flash_media_Sound_length; -static methodinfo_t flash_media_Sound_close; -static methodinfo_t flash_media_Sound_extract; -static varinfo_t flash_media_Sound_bytesLoaded; -static varinfo_t flash_media_Sound_id3; -static methodinfo_t flash_media_Sound_play; -static varinfo_t flash_media_Sound_url; -static varinfo_t flash_media_Sound_isBuffering; -static methodinfo_t flash_media_Sound_load; -static varinfo_t flash_media_Sound_bytesTotal; -static varinfo_t flash_media_Sound_length; -static methodinfo_t flash_media_Sound_close; -static classinfo_t flash_text_TextExtent; -static varinfo_t flash_text_TextExtent_descent; -static varinfo_t flash_text_TextExtent_width; -static varinfo_t flash_text_TextExtent_ascent; -static varinfo_t flash_text_TextExtent_textFieldHeight; -static varinfo_t flash_text_TextExtent_textFieldWidth; -static varinfo_t flash_text_TextExtent_height; -static varinfo_t flash_text_TextExtent_descent; -static varinfo_t flash_text_TextExtent_width; -static varinfo_t flash_text_TextExtent_ascent; -static varinfo_t flash_text_TextExtent_textFieldHeight; -static varinfo_t flash_text_TextExtent_textFieldWidth; -static varinfo_t flash_text_TextExtent_height; -static classinfo_t flash_text_FontStyle; -static classinfo_t flash_text_engine_TextLineMirrorRegion; -static varinfo_t flash_text_engine_TextLineMirrorRegion_mirror; -static varinfo_t flash_text_engine_TextLineMirrorRegion_previousRegion; -static varinfo_t flash_text_engine_TextLineMirrorRegion_bounds; -static varinfo_t flash_text_engine_TextLineMirrorRegion_nextRegion; -static varinfo_t flash_text_engine_TextLineMirrorRegion_element; -static varinfo_t flash_text_engine_TextLineMirrorRegion_textLine; -static varinfo_t flash_text_engine_TextLineMirrorRegion_mirror; -static varinfo_t flash_text_engine_TextLineMirrorRegion_previousRegion; -static varinfo_t flash_text_engine_TextLineMirrorRegion_bounds; -static varinfo_t flash_text_engine_TextLineMirrorRegion_nextRegion; -static varinfo_t flash_text_engine_TextLineMirrorRegion_element; -static varinfo_t flash_text_engine_TextLineMirrorRegion_textLine; -static classinfo_t flash_geom_Vector3D; -static methodinfo_t flash_geom_Vector3D_subtract; -static methodinfo_t flash_geom_Vector3D_scaleBy; -static methodinfo_t flash_geom_Vector3D_decrementBy; -static methodinfo_t flash_geom_Vector3D_equals; -static methodinfo_t flash_geom_Vector3D_normalize; -static methodinfo_t flash_geom_Vector3D_dotProduct; -static methodinfo_t flash_geom_Vector3D_negate; -static methodinfo_t flash_geom_Vector3D_toString; -static varinfo_t flash_geom_Vector3D_lengthSquared; -static varinfo_t flash_geom_Vector3D_x; -static methodinfo_t flash_geom_Vector3D_incrementBy; -static varinfo_t flash_geom_Vector3D_w; -static varinfo_t flash_geom_Vector3D_z; -static methodinfo_t flash_geom_Vector3D_add; -static methodinfo_t flash_geom_Vector3D_project; -static methodinfo_t flash_geom_Vector3D_crossProduct; -static methodinfo_t flash_geom_Vector3D_nearEquals; -static methodinfo_t flash_geom_Vector3D_clone; -static varinfo_t flash_geom_Vector3D_y; -static varinfo_t flash_geom_Vector3D_length; -static methodinfo_t flash_geom_Vector3D_subtract; -static methodinfo_t flash_geom_Vector3D_scaleBy; -static methodinfo_t flash_geom_Vector3D_decrementBy; -static methodinfo_t flash_geom_Vector3D_equals; -static methodinfo_t flash_geom_Vector3D_normalize; -static methodinfo_t flash_geom_Vector3D_dotProduct; -static methodinfo_t flash_geom_Vector3D_negate; -static methodinfo_t flash_geom_Vector3D_toString; -static varinfo_t flash_geom_Vector3D_lengthSquared; -static varinfo_t flash_geom_Vector3D_x; -static methodinfo_t flash_geom_Vector3D_incrementBy; -static varinfo_t flash_geom_Vector3D_w; -static varinfo_t flash_geom_Vector3D_z; -static methodinfo_t flash_geom_Vector3D_add; -static methodinfo_t flash_geom_Vector3D_project; -static methodinfo_t flash_geom_Vector3D_crossProduct; -static methodinfo_t flash_geom_Vector3D_nearEquals; -static methodinfo_t flash_geom_Vector3D_clone; -static varinfo_t flash_geom_Vector3D_y; -static varinfo_t flash_geom_Vector3D_length; -static classinfo_t flash_desktop_ClipboardTransferMode; -static classinfo_t flash_display_SpreadMethod; -static classinfo_t flash_system_SecurityPanel; -static classinfo_t flash_events_HTTPStatusEvent; -static methodinfo_t flash_events_HTTPStatusEvent_toString; -static methodinfo_t flash_events_HTTPStatusEvent_clone; -static varinfo_t flash_events_HTTPStatusEvent_status; -static methodinfo_t flash_events_HTTPStatusEvent_toString; -static methodinfo_t flash_events_HTTPStatusEvent_clone; -static varinfo_t flash_events_HTTPStatusEvent_status; -static classinfo_t flash_net_NetStreamPlayOptions; -static varinfo_t flash_net_NetStreamPlayOptions_len; -static varinfo_t flash_net_NetStreamPlayOptions_streamName; -static varinfo_t flash_net_NetStreamPlayOptions_start; -static varinfo_t flash_net_NetStreamPlayOptions_oldStreamName; -static varinfo_t flash_net_NetStreamPlayOptions_transition; -static varinfo_t flash_net_NetStreamPlayOptions_len; -static varinfo_t flash_net_NetStreamPlayOptions_streamName; -static varinfo_t flash_net_NetStreamPlayOptions_start; -static varinfo_t flash_net_NetStreamPlayOptions_oldStreamName; -static varinfo_t flash_net_NetStreamPlayOptions_transition; -static classinfo_t flash_net_Responder; -static classinfo_t flash_net_XMLSocket; -static methodinfo_t flash_net_XMLSocket_close; -static methodinfo_t flash_net_XMLSocket_connect; -static methodinfo_t flash_net_XMLSocket_send; -static varinfo_t flash_net_XMLSocket_connected; -static varinfo_t flash_net_XMLSocket_timeout; -static methodinfo_t flash_net_XMLSocket_close; -static methodinfo_t flash_net_XMLSocket_connect; -static methodinfo_t flash_net_XMLSocket_send; -static varinfo_t flash_net_XMLSocket_connected; -static varinfo_t flash_net_XMLSocket_timeout; -static classinfo_t flash_filters_ConvolutionFilter; -static varinfo_t flash_filters_ConvolutionFilter_alpha; -static varinfo_t flash_filters_ConvolutionFilter_matrixX; -static varinfo_t flash_filters_ConvolutionFilter_matrix; -static varinfo_t flash_filters_ConvolutionFilter_bias; -static varinfo_t flash_filters_ConvolutionFilter_color; -static varinfo_t flash_filters_ConvolutionFilter_preserveAlpha; -static varinfo_t flash_filters_ConvolutionFilter_divisor; -static methodinfo_t flash_filters_ConvolutionFilter_clone; -static varinfo_t flash_filters_ConvolutionFilter_clamp; -static varinfo_t flash_filters_ConvolutionFilter_matrixY; -static varinfo_t flash_filters_ConvolutionFilter_alpha; -static varinfo_t flash_filters_ConvolutionFilter_matrixX; -static varinfo_t flash_filters_ConvolutionFilter_matrix; -static varinfo_t flash_filters_ConvolutionFilter_bias; -static varinfo_t flash_filters_ConvolutionFilter_color; -static varinfo_t flash_filters_ConvolutionFilter_preserveAlpha; -static varinfo_t flash_filters_ConvolutionFilter_divisor; -static methodinfo_t flash_filters_ConvolutionFilter_clone; -static varinfo_t flash_filters_ConvolutionFilter_clamp; -static varinfo_t flash_filters_ConvolutionFilter_matrixY; -static classinfo_t flash_text_engine_ElementFormat; -static methodinfo_t flash_text_engine_ElementFormat_getFontMetrics; -static varinfo_t flash_text_engine_ElementFormat_digitCase; -static varinfo_t flash_text_engine_ElementFormat_breakOpportunity; -static varinfo_t flash_text_engine_ElementFormat_ligatureLevel; -static varinfo_t flash_text_engine_ElementFormat_dominantBaseline; -static varinfo_t flash_text_engine_ElementFormat_alignmentBaseline; -static varinfo_t flash_text_engine_ElementFormat_color; -static varinfo_t flash_text_engine_ElementFormat_digitWidth; -static varinfo_t flash_text_engine_ElementFormat_kerning; -static varinfo_t flash_text_engine_ElementFormat_fontSize; -static varinfo_t flash_text_engine_ElementFormat_fontDescription; -static varinfo_t flash_text_engine_ElementFormat_baselineShift; -static varinfo_t flash_text_engine_ElementFormat_locale; -static varinfo_t flash_text_engine_ElementFormat_typographicCase; -static varinfo_t flash_text_engine_ElementFormat_trackingLeft; -static varinfo_t flash_text_engine_ElementFormat_locked; -static methodinfo_t flash_text_engine_ElementFormat_clone; -static varinfo_t flash_text_engine_ElementFormat_alpha; -static varinfo_t flash_text_engine_ElementFormat_textRotation; -static varinfo_t flash_text_engine_ElementFormat_trackingRight; -static methodinfo_t flash_text_engine_ElementFormat_getFontMetrics; -static varinfo_t flash_text_engine_ElementFormat_digitCase; -static varinfo_t flash_text_engine_ElementFormat_breakOpportunity; -static varinfo_t flash_text_engine_ElementFormat_ligatureLevel; -static varinfo_t flash_text_engine_ElementFormat_dominantBaseline; -static varinfo_t flash_text_engine_ElementFormat_alignmentBaseline; -static varinfo_t flash_text_engine_ElementFormat_color; -static varinfo_t flash_text_engine_ElementFormat_digitWidth; -static varinfo_t flash_text_engine_ElementFormat_kerning; -static varinfo_t flash_text_engine_ElementFormat_fontSize; -static varinfo_t flash_text_engine_ElementFormat_fontDescription; -static varinfo_t flash_text_engine_ElementFormat_baselineShift; -static varinfo_t flash_text_engine_ElementFormat_locale; -static varinfo_t flash_text_engine_ElementFormat_typographicCase; -static varinfo_t flash_text_engine_ElementFormat_trackingLeft; -static varinfo_t flash_text_engine_ElementFormat_locked; -static methodinfo_t flash_text_engine_ElementFormat_clone; -static varinfo_t flash_text_engine_ElementFormat_alpha; -static varinfo_t flash_text_engine_ElementFormat_textRotation; -static varinfo_t flash_text_engine_ElementFormat_trackingRight; -static classinfo_t flash_display_GraphicsGradientFill; -static varinfo_t flash_display_GraphicsGradientFill_interpolationMethod; -static varinfo_t flash_display_GraphicsGradientFill_focalPointRatio; -static varinfo_t flash_display_GraphicsGradientFill_colors; -static varinfo_t flash_display_GraphicsGradientFill_matrix; -static varinfo_t flash_display_GraphicsGradientFill_type; -static varinfo_t flash_display_GraphicsGradientFill_ratios; -static varinfo_t flash_display_GraphicsGradientFill_spreadMethod; -static varinfo_t flash_display_GraphicsGradientFill_alphas; -static varinfo_t flash_display_GraphicsGradientFill_interpolationMethod; -static varinfo_t flash_display_GraphicsGradientFill_focalPointRatio; -static varinfo_t flash_display_GraphicsGradientFill_colors; -static varinfo_t flash_display_GraphicsGradientFill_matrix; -static varinfo_t flash_display_GraphicsGradientFill_type; -static varinfo_t flash_display_GraphicsGradientFill_ratios; -static varinfo_t flash_display_GraphicsGradientFill_spreadMethod; -static varinfo_t flash_display_GraphicsGradientFill_alphas; -static classinfo_t flash_display_FrameLabel; -static varinfo_t flash_display_FrameLabel_frame; -static varinfo_t flash_display_FrameLabel_name; -static varinfo_t flash_display_FrameLabel_frame; -static varinfo_t flash_display_FrameLabel_name; -static classinfo_t flash_media_SoundTransform; -static varinfo_t flash_media_SoundTransform_pan; -static varinfo_t flash_media_SoundTransform_leftToRight; -static varinfo_t flash_media_SoundTransform_rightToLeft; -static varinfo_t flash_media_SoundTransform_volume; -static varinfo_t flash_media_SoundTransform_leftToLeft; -static varinfo_t flash_media_SoundTransform_rightToRight; -static varinfo_t flash_media_SoundTransform_pan; -static varinfo_t flash_media_SoundTransform_leftToRight; -static varinfo_t flash_media_SoundTransform_rightToLeft; -static varinfo_t flash_media_SoundTransform_volume; -static varinfo_t flash_media_SoundTransform_leftToLeft; -static varinfo_t flash_media_SoundTransform_rightToRight; -static varinfo_t _AS3; -static classinfo_t flash_net_LocalConnection; -static varinfo_t flash_net_LocalConnection_client; -static methodinfo_t flash_net_LocalConnection_allowDomain; -static methodinfo_t flash_net_LocalConnection_connect; -static varinfo_t flash_net_LocalConnection_domain; -static methodinfo_t flash_net_LocalConnection_allowInsecureDomain; -static methodinfo_t flash_net_LocalConnection_send; -static methodinfo_t flash_net_LocalConnection_close; -static varinfo_t flash_net_LocalConnection_client; -static methodinfo_t flash_net_LocalConnection_allowDomain; -static methodinfo_t flash_net_LocalConnection_connect; -static varinfo_t flash_net_LocalConnection_domain; -static methodinfo_t flash_net_LocalConnection_allowInsecureDomain; -static methodinfo_t flash_net_LocalConnection_send; -static methodinfo_t flash_net_LocalConnection_close; -static classinfo_t flash_display_ShaderParameterType; -static classinfo_t flash_events_IMEEvent; -static methodinfo_t flash_events_IMEEvent_toString; -static methodinfo_t flash_events_IMEEvent_clone; -static methodinfo_t flash_events_IMEEvent_toString; -static methodinfo_t flash_events_IMEEvent_clone; -static classinfo_t flash_text_TextFormatDisplay; -static methodinfo_t flash_profiler_profile; -static classinfo_t flash_display_AVM1Movie; -static methodinfo_t flash_display_AVM1Movie_call; -static methodinfo_t flash_display_AVM1Movie_addCallback; -static methodinfo_t flash_display_AVM1Movie_call; -static methodinfo_t flash_display_AVM1Movie_addCallback; -static classinfo_t flash_events_ContextMenuEvent; -static varinfo_t flash_events_ContextMenuEvent_mouseTarget; -static varinfo_t flash_events_ContextMenuEvent_isMouseTargetInaccessible; -static methodinfo_t flash_events_ContextMenuEvent_toString; -static varinfo_t flash_events_ContextMenuEvent_contextMenuOwner; -static methodinfo_t flash_events_ContextMenuEvent_clone; -static varinfo_t flash_events_ContextMenuEvent_mouseTarget; -static varinfo_t flash_events_ContextMenuEvent_isMouseTargetInaccessible; -static methodinfo_t flash_events_ContextMenuEvent_toString; -static varinfo_t flash_events_ContextMenuEvent_contextMenuOwner; -static methodinfo_t flash_events_ContextMenuEvent_clone; -static classinfo_t flash_events_EventPhase; -static classinfo_t flash_display_JointStyle; -static classinfo_t flash_utils_Dictionary; -static classinfo_t flash_display_GraphicsPathCommand; -static classinfo_t flash_filters_BevelFilter; -static varinfo_t flash_filters_BevelFilter_type; -static varinfo_t flash_filters_BevelFilter_highlightColor; -static varinfo_t flash_filters_BevelFilter_knockout; -static varinfo_t flash_filters_BevelFilter_distance; -static varinfo_t flash_filters_BevelFilter_strength; -static varinfo_t flash_filters_BevelFilter_highlightAlpha; -static varinfo_t flash_filters_BevelFilter_blurY; -static varinfo_t flash_filters_BevelFilter_shadowColor; -static varinfo_t flash_filters_BevelFilter_angle; -static varinfo_t flash_filters_BevelFilter_blurX; -static varinfo_t flash_filters_BevelFilter_shadowAlpha; -static varinfo_t flash_filters_BevelFilter_quality; -static methodinfo_t flash_filters_BevelFilter_clone; -static varinfo_t flash_filters_BevelFilter_type; -static varinfo_t flash_filters_BevelFilter_highlightColor; -static varinfo_t flash_filters_BevelFilter_knockout; -static varinfo_t flash_filters_BevelFilter_distance; -static varinfo_t flash_filters_BevelFilter_strength; -static varinfo_t flash_filters_BevelFilter_highlightAlpha; -static varinfo_t flash_filters_BevelFilter_blurY; -static varinfo_t flash_filters_BevelFilter_shadowColor; -static varinfo_t flash_filters_BevelFilter_angle; -static varinfo_t flash_filters_BevelFilter_blurX; -static varinfo_t flash_filters_BevelFilter_shadowAlpha; -static varinfo_t flash_filters_BevelFilter_quality; -static methodinfo_t flash_filters_BevelFilter_clone; -static methodinfo_t flash_utils_getTimer; -static classinfo_t flash_display_Loader; -static varinfo_t flash_display_Loader_content; -static methodinfo_t flash_display_Loader_unloadAndStop; -static methodinfo_t flash_display_Loader_unload; -static methodinfo_t flash_display_Loader_removeChildAt; -static methodinfo_t flash_display_Loader_addChildAt; -static varinfo_t flash_display_Loader_contentLoaderInfo; -static methodinfo_t flash_display_Loader_loadBytes; -static methodinfo_t flash_display_Loader_removeChild; -static methodinfo_t flash_display_Loader_load; -static methodinfo_t flash_display_Loader_addChild; -static methodinfo_t flash_display_Loader_close; -static methodinfo_t flash_display_Loader_setChildIndex; -static varinfo_t flash_display_Loader_content; -static methodinfo_t flash_display_Loader_unloadAndStop; -static methodinfo_t flash_display_Loader_unload; -static methodinfo_t flash_display_Loader_removeChildAt; -static methodinfo_t flash_display_Loader_addChildAt; -static varinfo_t flash_display_Loader_contentLoaderInfo; -static methodinfo_t flash_display_Loader_loadBytes; -static methodinfo_t flash_display_Loader_removeChild; -static methodinfo_t flash_display_Loader_load; -static methodinfo_t flash_display_Loader_addChild; -static methodinfo_t flash_display_Loader_close; -static methodinfo_t flash_display_Loader_setChildIndex; -static classinfo_t flash_display_GraphicsBitmapFill; -static varinfo_t flash_display_GraphicsBitmapFill_smooth; -static varinfo_t flash_display_GraphicsBitmapFill_repeat; -static varinfo_t flash_display_GraphicsBitmapFill_bitmapData; -static varinfo_t flash_display_GraphicsBitmapFill_matrix; -static varinfo_t flash_display_GraphicsBitmapFill_smooth; -static varinfo_t flash_display_GraphicsBitmapFill_repeat; -static varinfo_t flash_display_GraphicsBitmapFill_bitmapData; -static varinfo_t flash_display_GraphicsBitmapFill_matrix; -static varinfo_t _undefined; -static classinfo_t flash_display_SimpleButton; -static varinfo_t flash_display_SimpleButton_overState; -static varinfo_t flash_display_SimpleButton_downState; -static varinfo_t flash_display_SimpleButton_enabled; -static varinfo_t flash_display_SimpleButton_trackAsMenu; -static varinfo_t flash_display_SimpleButton_soundTransform; -static varinfo_t flash_display_SimpleButton_useHandCursor; -static varinfo_t flash_display_SimpleButton_upState; -static varinfo_t flash_display_SimpleButton_hitTestState; -static varinfo_t flash_display_SimpleButton_overState; -static varinfo_t flash_display_SimpleButton_downState; -static varinfo_t flash_display_SimpleButton_enabled; -static varinfo_t flash_display_SimpleButton_trackAsMenu; -static varinfo_t flash_display_SimpleButton_soundTransform; -static varinfo_t flash_display_SimpleButton_useHandCursor; -static varinfo_t flash_display_SimpleButton_upState; -static varinfo_t flash_display_SimpleButton_hitTestState; -static classinfo_t flash_text_engine_TabAlignment; -static classinfo_t flash_text_engine_FontWeight; -static methodinfo_t flash_utils_describeType; -static classinfo_t flash_display_PixelSnapping; -static classinfo_t flash_events_FocusEvent; -static varinfo_t flash_events_FocusEvent_keyCode; -static methodinfo_t flash_events_FocusEvent_toString; -static varinfo_t flash_events_FocusEvent_isRelatedObjectInaccessible; -static methodinfo_t flash_events_FocusEvent_clone; -static varinfo_t flash_events_FocusEvent_shiftKey; -static varinfo_t flash_events_FocusEvent_relatedObject; -static varinfo_t flash_events_FocusEvent_keyCode; -static methodinfo_t flash_events_FocusEvent_toString; -static varinfo_t flash_events_FocusEvent_isRelatedObjectInaccessible; -static methodinfo_t flash_events_FocusEvent_clone; -static varinfo_t flash_events_FocusEvent_shiftKey; -static varinfo_t flash_events_FocusEvent_relatedObject; -static classinfo_t flash_errors_MemoryError; -static classinfo_t flash_events_NetFilterEvent; -static varinfo_t flash_events_NetFilterEvent_header; -static methodinfo_t flash_events_NetFilterEvent_toString; -static methodinfo_t flash_events_NetFilterEvent_clone; -static varinfo_t flash_events_NetFilterEvent_data; -static varinfo_t flash_events_NetFilterEvent_header; -static methodinfo_t flash_events_NetFilterEvent_toString; -static methodinfo_t flash_events_NetFilterEvent_clone; -static varinfo_t flash_events_NetFilterEvent_data; -static methodinfo_t _decodeURI; -static methodinfo_t _encodeURI; -static classinfo_t flash_text_engine_TextBaseline; -static classinfo_t flash_external_ExternalInterface; -static classinfo_t _EvalError; -static classinfo_t flash_text_engine_DigitCase; -static classinfo_t flash_text_TextFormatAlign; -static classinfo_t flash_errors_ScriptTimeoutError; -static classinfo_t _uint; -static methodinfo_t _uint_valueOf; -static methodinfo_t _uint_toString; -static methodinfo_t _uint_toExponential; -static methodinfo_t _uint_toFixed; -static methodinfo_t _uint_toPrecision; -static methodinfo_t _uint_valueOf; -static methodinfo_t _uint_toString; -static methodinfo_t _uint_toExponential; -static methodinfo_t _uint_toFixed; -static methodinfo_t _uint_toPrecision; -static methodinfo_t flash_debugger_enterDebugger; -static classinfo_t flash_geom_Orientation3D; -static classinfo_t flash_text_engine_CFFHinting; -static classinfo_t flash_text_FontType; -static classinfo_t flash_filters_ShaderFilter; -static varinfo_t flash_filters_ShaderFilter_bottomExtension; -static varinfo_t flash_filters_ShaderFilter_shader; -static varinfo_t flash_filters_ShaderFilter_rightExtension; -static varinfo_t flash_filters_ShaderFilter_leftExtension; -static varinfo_t flash_filters_ShaderFilter_topExtension; -static varinfo_t flash_filters_ShaderFilter_bottomExtension; -static varinfo_t flash_filters_ShaderFilter_shader; -static varinfo_t flash_filters_ShaderFilter_rightExtension; -static varinfo_t flash_filters_ShaderFilter_leftExtension; -static varinfo_t flash_filters_ShaderFilter_topExtension; -static classinfo_t flash_display_GraphicsPath; -static methodinfo_t flash_display_GraphicsPath_wideMoveTo; -static varinfo_t flash_display_GraphicsPath_winding; -static methodinfo_t flash_display_GraphicsPath_moveTo; -static methodinfo_t flash_display_GraphicsPath_wideLineTo; -static varinfo_t flash_display_GraphicsPath_commands; -static methodinfo_t flash_display_GraphicsPath_curveTo; -static methodinfo_t flash_display_GraphicsPath_lineTo; -static varinfo_t flash_display_GraphicsPath_data; -static methodinfo_t flash_display_GraphicsPath_wideMoveTo; -static varinfo_t flash_display_GraphicsPath_winding; -static methodinfo_t flash_display_GraphicsPath_moveTo; -static methodinfo_t flash_display_GraphicsPath_wideLineTo; -static varinfo_t flash_display_GraphicsPath_commands; -static methodinfo_t flash_display_GraphicsPath_curveTo; -static methodinfo_t flash_display_GraphicsPath_lineTo; -static varinfo_t flash_display_GraphicsPath_data; -static classinfo_t flash_system_ApplicationDomain; -static methodinfo_t flash_system_ApplicationDomain_hasDefinition; -static methodinfo_t flash_system_ApplicationDomain_getDefinition; -static varinfo_t flash_system_ApplicationDomain_parentDomain; -static varinfo_t flash_system_ApplicationDomain_domainMemory; -static methodinfo_t flash_system_ApplicationDomain_hasDefinition; -static methodinfo_t flash_system_ApplicationDomain_getDefinition; -static varinfo_t flash_system_ApplicationDomain_parentDomain; -static varinfo_t flash_system_ApplicationDomain_domainMemory; -static classinfo_t flash_events_KeyboardEvent; -static varinfo_t flash_events_KeyboardEvent_shiftKey; -static varinfo_t flash_events_KeyboardEvent_keyCode; -static varinfo_t flash_events_KeyboardEvent_keyLocation; -static methodinfo_t flash_events_KeyboardEvent_updateAfterEvent; -static methodinfo_t flash_events_KeyboardEvent_toString; -static varinfo_t flash_events_KeyboardEvent_altKey; -static varinfo_t flash_events_KeyboardEvent_ctrlKey; -static methodinfo_t flash_events_KeyboardEvent_clone; -static varinfo_t flash_events_KeyboardEvent_charCode; -static varinfo_t flash_events_KeyboardEvent_shiftKey; -static varinfo_t flash_events_KeyboardEvent_keyCode; -static varinfo_t flash_events_KeyboardEvent_keyLocation; -static methodinfo_t flash_events_KeyboardEvent_updateAfterEvent; -static methodinfo_t flash_events_KeyboardEvent_toString; -static varinfo_t flash_events_KeyboardEvent_altKey; -static varinfo_t flash_events_KeyboardEvent_ctrlKey; -static methodinfo_t flash_events_KeyboardEvent_clone; -static varinfo_t flash_events_KeyboardEvent_charCode; -static classinfo_t adobe_utils_ProductManager; -static varinfo_t adobe_utils_ProductManager_running; -static methodinfo_t adobe_utils_ProductManager_download; -static varinfo_t adobe_utils_ProductManager_installedVersion; -static varinfo_t adobe_utils_ProductManager_installed; -static methodinfo_t adobe_utils_ProductManager_launch; -static varinfo_t adobe_utils_ProductManager_running; -static methodinfo_t adobe_utils_ProductManager_download; -static varinfo_t adobe_utils_ProductManager_installedVersion; -static varinfo_t adobe_utils_ProductManager_installed; -static methodinfo_t adobe_utils_ProductManager_launch; -static classinfo_t flash_events_Event; -static varinfo_t flash_events_Event_type; -static varinfo_t flash_events_Event_cancelable; -static methodinfo_t flash_events_Event_isDefaultPrevented; -static varinfo_t flash_events_Event_target; -static varinfo_t flash_events_Event_eventPhase; -static varinfo_t flash_events_Event_currentTarget; -static methodinfo_t flash_events_Event_toString; -static methodinfo_t flash_events_Event_stopImmediatePropagation; -static varinfo_t flash_events_Event_bubbles; -static methodinfo_t flash_events_Event_stopPropagation; -static methodinfo_t flash_events_Event_clone; -static methodinfo_t flash_events_Event_preventDefault; -static methodinfo_t flash_events_Event_formatToString; -static varinfo_t flash_events_Event_type; -static varinfo_t flash_events_Event_cancelable; -static methodinfo_t flash_events_Event_isDefaultPrevented; -static varinfo_t flash_events_Event_target; -static varinfo_t flash_events_Event_eventPhase; -static varinfo_t flash_events_Event_currentTarget; -static methodinfo_t flash_events_Event_toString; -static methodinfo_t flash_events_Event_stopImmediatePropagation; -static varinfo_t flash_events_Event_bubbles; -static methodinfo_t flash_events_Event_stopPropagation; -static methodinfo_t flash_events_Event_clone; -static methodinfo_t flash_events_Event_preventDefault; -static methodinfo_t flash_events_Event_formatToString; -static classinfo_t flash_desktop_ClipboardFormats; -static classinfo_t flash_display_MovieClip; -static methodinfo_t flash_display_MovieClip_prevScene; -static methodinfo_t flash_display_MovieClip_gotoAndPlay; -static varinfo_t flash_display_MovieClip_currentLabels; -static methodinfo_t flash_display_MovieClip_nextFrame; -static varinfo_t flash_display_MovieClip_currentScene; -static varinfo_t flash_display_MovieClip_enabled; -static varinfo_t flash_display_MovieClip_currentFrameLabel; -static methodinfo_t flash_display_MovieClip_play; -static varinfo_t flash_display_MovieClip_framesLoaded; -static varinfo_t flash_display_MovieClip_scenes; -static methodinfo_t flash_display_MovieClip_addFrameScript; -static varinfo_t flash_display_MovieClip_currentLabel; -static methodinfo_t flash_display_MovieClip_prevFrame; -static methodinfo_t flash_display_MovieClip_gotoAndStop; -static varinfo_t flash_display_MovieClip_currentFrame; -static methodinfo_t flash_display_MovieClip_nextScene; -static varinfo_t flash_display_MovieClip_totalFrames; -static varinfo_t flash_display_MovieClip_trackAsMenu; -static methodinfo_t flash_display_MovieClip_stop; -static methodinfo_t flash_display_MovieClip_prevScene; -static methodinfo_t flash_display_MovieClip_gotoAndPlay; -static varinfo_t flash_display_MovieClip_currentLabels; -static methodinfo_t flash_display_MovieClip_nextFrame; -static varinfo_t flash_display_MovieClip_currentScene; -static varinfo_t flash_display_MovieClip_enabled; -static varinfo_t flash_display_MovieClip_currentFrameLabel; -static methodinfo_t flash_display_MovieClip_play; -static varinfo_t flash_display_MovieClip_framesLoaded; -static varinfo_t flash_display_MovieClip_scenes; -static methodinfo_t flash_display_MovieClip_addFrameScript; -static varinfo_t flash_display_MovieClip_currentLabel; -static methodinfo_t flash_display_MovieClip_prevFrame; -static methodinfo_t flash_display_MovieClip_gotoAndStop; -static varinfo_t flash_display_MovieClip_currentFrame; -static methodinfo_t flash_display_MovieClip_nextScene; -static varinfo_t flash_display_MovieClip_totalFrames; -static varinfo_t flash_display_MovieClip_trackAsMenu; -static methodinfo_t flash_display_MovieClip_stop; -static classinfo_t flash_display_BitmapData; -static methodinfo_t flash_display_BitmapData_getPixel32; -static methodinfo_t flash_display_BitmapData_draw; -static methodinfo_t flash_display_BitmapData_setPixels; -static methodinfo_t flash_display_BitmapData_copyPixels; -static methodinfo_t flash_display_BitmapData_histogram; -static methodinfo_t flash_display_BitmapData_scroll; -static varinfo_t flash_display_BitmapData_transparent; -static methodinfo_t flash_display_BitmapData_noise; -static methodinfo_t flash_display_BitmapData_threshold; -static methodinfo_t flash_display_BitmapData_paletteMap; -static methodinfo_t flash_display_BitmapData_perlinNoise; -static methodinfo_t flash_display_BitmapData_hitTest; -static methodinfo_t flash_display_BitmapData_getPixel; -static methodinfo_t flash_display_BitmapData_unlock; -static varinfo_t flash_display_BitmapData_height; -static methodinfo_t flash_display_BitmapData_copyChannel; -static varinfo_t flash_display_BitmapData_width; -static methodinfo_t flash_display_BitmapData_clone; -static methodinfo_t flash_display_BitmapData_colorTransform; -static methodinfo_t flash_display_BitmapData_generateFilterRect; -static methodinfo_t flash_display_BitmapData_compare; -static methodinfo_t flash_display_BitmapData_fillRect; -static methodinfo_t flash_display_BitmapData_setVector; -static methodinfo_t flash_display_BitmapData_floodFill; -static methodinfo_t flash_display_BitmapData_pixelDissolve; -static methodinfo_t flash_display_BitmapData_setPixel; -static methodinfo_t flash_display_BitmapData_setPixel32; -static methodinfo_t flash_display_BitmapData_lock; -static methodinfo_t flash_display_BitmapData_getVector; -static methodinfo_t flash_display_BitmapData_getColorBoundsRect; -static methodinfo_t flash_display_BitmapData_getPixels; -static methodinfo_t flash_display_BitmapData_merge; -static varinfo_t flash_display_BitmapData_rect; -static methodinfo_t flash_display_BitmapData_applyFilter; -static methodinfo_t flash_display_BitmapData_dispose; -static methodinfo_t flash_display_BitmapData_getPixel32; -static methodinfo_t flash_display_BitmapData_draw; -static methodinfo_t flash_display_BitmapData_setPixels; -static methodinfo_t flash_display_BitmapData_copyPixels; -static methodinfo_t flash_display_BitmapData_histogram; -static methodinfo_t flash_display_BitmapData_scroll; -static varinfo_t flash_display_BitmapData_transparent; -static methodinfo_t flash_display_BitmapData_noise; -static methodinfo_t flash_display_BitmapData_threshold; -static methodinfo_t flash_display_BitmapData_paletteMap; -static methodinfo_t flash_display_BitmapData_perlinNoise; -static methodinfo_t flash_display_BitmapData_hitTest; -static methodinfo_t flash_display_BitmapData_getPixel; -static methodinfo_t flash_display_BitmapData_unlock; -static varinfo_t flash_display_BitmapData_height; -static methodinfo_t flash_display_BitmapData_copyChannel; -static varinfo_t flash_display_BitmapData_width; -static methodinfo_t flash_display_BitmapData_clone; -static methodinfo_t flash_display_BitmapData_colorTransform; -static methodinfo_t flash_display_BitmapData_generateFilterRect; -static methodinfo_t flash_display_BitmapData_compare; -static methodinfo_t flash_display_BitmapData_fillRect; -static methodinfo_t flash_display_BitmapData_setVector; -static methodinfo_t flash_display_BitmapData_floodFill; -static methodinfo_t flash_display_BitmapData_pixelDissolve; -static methodinfo_t flash_display_BitmapData_setPixel; -static methodinfo_t flash_display_BitmapData_setPixel32; -static methodinfo_t flash_display_BitmapData_lock; -static methodinfo_t flash_display_BitmapData_getVector; -static methodinfo_t flash_display_BitmapData_getColorBoundsRect; -static methodinfo_t flash_display_BitmapData_getPixels; -static methodinfo_t flash_display_BitmapData_merge; -static varinfo_t flash_display_BitmapData_rect; -static methodinfo_t flash_display_BitmapData_applyFilter; -static methodinfo_t flash_display_BitmapData_dispose; -static classinfo_t flash_text_engine_LigatureLevel; -static varinfo_t _Infinity; -static classinfo_t flash_text_engine_FontDescription; -static varinfo_t flash_text_engine_FontDescription_renderingMode; -static varinfo_t flash_text_engine_FontDescription_cffHinting; -static varinfo_t flash_text_engine_FontDescription_fontPosture; -static varinfo_t flash_text_engine_FontDescription_fontName; -static varinfo_t flash_text_engine_FontDescription_fontLookup; -static varinfo_t flash_text_engine_FontDescription_locked; -static varinfo_t flash_text_engine_FontDescription_fontWeight; -static methodinfo_t flash_text_engine_FontDescription_clone; -static varinfo_t flash_text_engine_FontDescription_renderingMode; -static varinfo_t flash_text_engine_FontDescription_cffHinting; -static varinfo_t flash_text_engine_FontDescription_fontPosture; -static varinfo_t flash_text_engine_FontDescription_fontName; -static varinfo_t flash_text_engine_FontDescription_fontLookup; -static varinfo_t flash_text_engine_FontDescription_locked; -static varinfo_t flash_text_engine_FontDescription_fontWeight; -static methodinfo_t flash_text_engine_FontDescription_clone; -static classinfo_t flash_text_engine_TextElement; -static methodinfo_t flash_text_engine_TextElement_replaceText; -static methodinfo_t flash_text_engine_TextElement_replaceText; -static classinfo_t flash_display_SWFVersion; -static classinfo_t flash_net_URLLoader; -static methodinfo_t flash_net_URLLoader_close; -static varinfo_t flash_net_URLLoader_bytesLoaded; -static methodinfo_t flash_net_URLLoader_load; -static varinfo_t flash_net_URLLoader_bytesTotal; -static varinfo_t flash_net_URLLoader_dataFormat; -static varinfo_t flash_net_URLLoader_data; -static methodinfo_t flash_net_URLLoader_close; -static varinfo_t flash_net_URLLoader_bytesLoaded; -static methodinfo_t flash_net_URLLoader_load; -static varinfo_t flash_net_URLLoader_bytesTotal; -static varinfo_t flash_net_URLLoader_dataFormat; -static varinfo_t flash_net_URLLoader_data; -static classinfo_t flash_geom_Matrix; -static varinfo_t flash_geom_Matrix_b; -static methodinfo_t flash_geom_Matrix_deltaTransformPoint; -static methodinfo_t flash_geom_Matrix_identity; -static varinfo_t flash_geom_Matrix_ty; -static methodinfo_t flash_geom_Matrix_translate; -static methodinfo_t flash_geom_Matrix_concat; -static varinfo_t flash_geom_Matrix_c; -static varinfo_t flash_geom_Matrix_a; -static methodinfo_t flash_geom_Matrix_scale; -static varinfo_t flash_geom_Matrix_d; -static methodinfo_t flash_geom_Matrix_transformPoint; -static methodinfo_t flash_geom_Matrix_rotate; -static methodinfo_t flash_geom_Matrix_createGradientBox; -static methodinfo_t flash_geom_Matrix_toString; -static methodinfo_t flash_geom_Matrix_invert; -static methodinfo_t flash_geom_Matrix_clone; -static varinfo_t flash_geom_Matrix_tx; -static methodinfo_t flash_geom_Matrix_createBox; -static varinfo_t flash_geom_Matrix_b; -static methodinfo_t flash_geom_Matrix_deltaTransformPoint; -static methodinfo_t flash_geom_Matrix_identity; -static varinfo_t flash_geom_Matrix_ty; -static methodinfo_t flash_geom_Matrix_translate; -static methodinfo_t flash_geom_Matrix_concat; -static varinfo_t flash_geom_Matrix_c; -static varinfo_t flash_geom_Matrix_a; -static methodinfo_t flash_geom_Matrix_scale; -static varinfo_t flash_geom_Matrix_d; -static methodinfo_t flash_geom_Matrix_transformPoint; -static methodinfo_t flash_geom_Matrix_rotate; -static methodinfo_t flash_geom_Matrix_createGradientBox; -static methodinfo_t flash_geom_Matrix_toString; -static methodinfo_t flash_geom_Matrix_invert; -static methodinfo_t flash_geom_Matrix_clone; -static varinfo_t flash_geom_Matrix_tx; -static methodinfo_t flash_geom_Matrix_createBox; -static classinfo_t flash_accessibility_Accessibility; -static methodinfo_t flash_net_sendToURL; -static classinfo_t flash_filters_GlowFilter; -static varinfo_t flash_filters_GlowFilter_blurY; -static varinfo_t flash_filters_GlowFilter_strength; -static varinfo_t flash_filters_GlowFilter_inner; -static varinfo_t flash_filters_GlowFilter_color; -static methodinfo_t flash_filters_GlowFilter_clone; -static varinfo_t flash_filters_GlowFilter_quality; -static varinfo_t flash_filters_GlowFilter_knockout; -static varinfo_t flash_filters_GlowFilter_alpha; -static varinfo_t flash_filters_GlowFilter_blurX; -static varinfo_t flash_filters_GlowFilter_blurY; -static varinfo_t flash_filters_GlowFilter_strength; -static varinfo_t flash_filters_GlowFilter_inner; -static varinfo_t flash_filters_GlowFilter_color; -static methodinfo_t flash_filters_GlowFilter_clone; -static varinfo_t flash_filters_GlowFilter_quality; -static varinfo_t flash_filters_GlowFilter_knockout; -static varinfo_t flash_filters_GlowFilter_alpha; -static varinfo_t flash_filters_GlowFilter_blurX; -static classinfo_t flash_events_FullScreenEvent; -static methodinfo_t flash_events_FullScreenEvent_toString; -static methodinfo_t flash_events_FullScreenEvent_clone; -static varinfo_t flash_events_FullScreenEvent_fullScreen; -static methodinfo_t flash_events_FullScreenEvent_toString; -static methodinfo_t flash_events_FullScreenEvent_clone; -static varinfo_t flash_events_FullScreenEvent_fullScreen; -static classinfo_t flash_display_StageDisplayState; -static classinfo_t flash_text_engine_TextJustifier; -static varinfo_t flash_text_engine_TextJustifier_lineJustification; -static varinfo_t flash_text_engine_TextJustifier_locale; -static methodinfo_t flash_text_engine_TextJustifier_clone; -static varinfo_t flash_text_engine_TextJustifier_lineJustification; -static varinfo_t flash_text_engine_TextJustifier_locale; -static methodinfo_t flash_text_engine_TextJustifier_clone; -static classinfo_t flash_display_StageAlign; -static varinfo_t _NaN; -static classinfo_t _ReferenceError; -static classinfo_t flash_display_Shape; -static varinfo_t flash_display_Shape_graphics; -static varinfo_t flash_display_Shape_graphics; -static classinfo_t flash_text_TextFormat = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextFormat", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextFormat_leading = {0x01, 0x00, 0x80, 0x16, "", "leading", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_bold = {0x01, 0x00, 0x80, 0x16, "", "bold", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_underline = {0x01, 0x00, 0x80, 0x16, "", "underline", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_letterSpacing = {0x01, 0x00, 0x80, 0x16, "", "letterSpacing", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_kerning = {0x01, 0x00, 0x80, 0x16, "", "kerning", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_target = {0x01, 0x00, 0x80, 0x16, "", "target", 0, &_String, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_italic = {0x01, 0x00, 0x80, 0x16, "", "italic", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_rightMargin = {0x01, 0x00, 0x80, 0x16, "", "rightMargin", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_bullet = {0x01, 0x00, 0x80, 0x16, "", "bullet", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_url = {0x01, 0x00, 0x80, 0x16, "", "url", 0, &_String, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_indent = {0x01, 0x00, 0x80, 0x16, "", "indent", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_leftMargin = {0x01, 0x00, 0x80, 0x16, "", "leftMargin", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_display = {0x01, 0x00, 0x80, 0x16, "", "display", 0, &_String, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_align = {0x01, 0x00, 0x80, 0x16, "", "align", 0, &_String, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_tabStops = {0x01, 0x00, 0x80, 0x16, "", "tabStops", 0, &_Array, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_blockIndent = {0x01, 0x00, 0x80, 0x16, "", "blockIndent", 0, &_Object, &flash_text_TextFormat, 0}; -static varinfo_t flash_text_TextFormat_font = {0x01, 0x00, 0x80, 0x16, "", "font", 0, &_String, &flash_text_TextFormat, 0}; -static classinfo_t flash_filters_BitmapFilter = {0x03, 0x00, 0x80, 0x16, "flash.filters", "BitmapFilter", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_filters_BitmapFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_BitmapFilter, 0}; -static classinfo_t flash_filters_DropShadowFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "DropShadowFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_DropShadowFilter_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_angle = {0x01, 0x00, 0x80, 0x16, "", "angle", 0, &_Number, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_hideObject = {0x01, 0x00, 0x80, 0x16, "", "hideObject", 0, &_Boolean, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_inner = {0x01, 0x00, 0x80, 0x16, "", "inner", 0, &_Boolean, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_DropShadowFilter, 0}; -static varinfo_t flash_filters_DropShadowFilter_distance = {0x01, 0x00, 0x80, 0x16, "", "distance", 0, &_Number, &flash_filters_DropShadowFilter, 0}; -static methodinfo_t flash_filters_DropShadowFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_DropShadowFilter, 0}; -static classinfo_t adobe_utils_CustomActions = {0x03, 0x00, 0x81, 0x16, "adobe.utils", "CustomActions", 0, &_Object, interfaces: {0}}; -static varinfo_t adobe_utils_CustomActions_actionsList = {0x01, 0x00, 0x82, 0x16, "", "actionsList", 0, &_Array, &adobe_utils_CustomActions, 0}; -static methodinfo_t adobe_utils_CustomActions_uninstallActions = {0x02, 0x00, 0x82, 0x16, "", "uninstallActions", 0, &voidclass, &adobe_utils_CustomActions, 0}; -static methodinfo_t adobe_utils_CustomActions_getActions = {0x02, 0x00, 0x82, 0x16, "", "getActions", 0, &_String, &adobe_utils_CustomActions, 0}; -static methodinfo_t adobe_utils_CustomActions_installActions = {0x02, 0x00, 0x82, 0x16, "", "installActions", 0, &voidclass, &adobe_utils_CustomActions, 0}; -static classinfo_t flash_text_engine_TextLineValidity = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextLineValidity", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_TextLineValidity_STATIC = {0x01, 0x00, 0x82, 0x16, "", "STATIC", 0, &_String, &flash_text_engine_TextLineValidity, 0}; -static varinfo_t flash_text_engine_TextLineValidity_VALID = {0x01, 0x00, 0x82, 0x16, "", "VALID", 0, &_String, &flash_text_engine_TextLineValidity, 0}; -static varinfo_t flash_text_engine_TextLineValidity_INVALID = {0x01, 0x00, 0x82, 0x16, "", "INVALID", 0, &_String, &flash_text_engine_TextLineValidity, 0}; -static varinfo_t flash_text_engine_TextLineValidity_POSSIBLY_INVALID = {0x01, 0x00, 0x82, 0x16, "", "POSSIBLY_INVALID", 0, &_String, &flash_text_engine_TextLineValidity, 0}; -static classinfo_t flash_display_LineScaleMode = {0x03, 0x00, 0x81, 0x16, "flash.display", "LineScaleMode", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_LineScaleMode_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_display_LineScaleMode, 0}; -static varinfo_t flash_display_LineScaleMode_VERTICAL = {0x01, 0x00, 0x82, 0x16, "", "VERTICAL", 0, &_String, &flash_display_LineScaleMode, 0}; -static varinfo_t flash_display_LineScaleMode_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_display_LineScaleMode, 0}; -static varinfo_t flash_display_LineScaleMode_HORIZONTAL = {0x01, 0x00, 0x82, 0x16, "", "HORIZONTAL", 0, &_String, &flash_display_LineScaleMode, 0}; -static classinfo_t flash_geom_Transform = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Transform", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_geom_Transform_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &flash_geom_Matrix, &flash_geom_Transform, 0}; -static varinfo_t flash_geom_Transform_perspectiveProjection = {0x01, 0x00, 0x80, 0x16, "", "perspectiveProjection", 0, &flash_geom_PerspectiveProjection, &flash_geom_Transform, 0}; -static varinfo_t flash_geom_Transform_concatenatedMatrix = {0x01, 0x00, 0x80, 0x16, "", "concatenatedMatrix", 0, &flash_geom_Matrix, &flash_geom_Transform, 0}; -static varinfo_t flash_geom_Transform_colorTransform = {0x01, 0x00, 0x80, 0x16, "", "colorTransform", 0, &flash_geom_ColorTransform, &flash_geom_Transform, 0}; -static methodinfo_t flash_geom_Transform_getRelativeMatrix3D = {0x02, 0x00, 0x80, 0x16, "", "getRelativeMatrix3D", 0, &flash_geom_Matrix3D, &flash_geom_Transform, 0}; -static varinfo_t flash_geom_Transform_pixelBounds = {0x01, 0x00, 0x80, 0x16, "", "pixelBounds", 0, &flash_geom_Rectangle, &flash_geom_Transform, 0}; -static varinfo_t flash_geom_Transform_matrix3D = {0x01, 0x00, 0x80, 0x16, "", "matrix3D", 0, &flash_geom_Matrix3D, &flash_geom_Transform, 0}; -static varinfo_t flash_geom_Transform_concatenatedColorTransform = {0x01, 0x00, 0x80, 0x16, "", "concatenatedColorTransform", 0, &flash_geom_ColorTransform, &flash_geom_Transform, 0}; -static classinfo_t flash_ui_KeyLocation = {0x03, 0x00, 0x81, 0x16, "flash.ui", "KeyLocation", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_ui_KeyLocation_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_uint, &flash_ui_KeyLocation, 0}; -static varinfo_t flash_ui_KeyLocation_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_uint, &flash_ui_KeyLocation, 0}; -static varinfo_t flash_ui_KeyLocation_NUM_PAD = {0x01, 0x00, 0x82, 0x16, "", "NUM_PAD", 0, &_uint, &flash_ui_KeyLocation, 0}; -static varinfo_t flash_ui_KeyLocation_STANDARD = {0x01, 0x00, 0x82, 0x16, "", "STANDARD", 0, &_uint, &flash_ui_KeyLocation, 0}; -static classinfo_t flash_events_MouseEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "MouseEvent", 0, &flash_events_Event, interfaces: {0}}; -static varinfo_t flash_events_MouseEvent_localY = {0x01, 0x00, 0x80, 0x16, "", "localY", 0, &_Number, &flash_events_MouseEvent, 0}; -static methodinfo_t flash_events_MouseEvent_updateAfterEvent = {0x02, 0x00, 0x80, 0x16, "", "updateAfterEvent", 0, &voidclass, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_delta = {0x01, 0x00, 0x80, 0x16, "", "delta", 0, &_int, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_stageX = {0x01, 0x00, 0x80, 0x16, "", "stageX", 0, &_Number, &flash_events_MouseEvent, 0}; -static methodinfo_t flash_events_MouseEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_relatedObject = {0x01, 0x00, 0x80, 0x16, "", "relatedObject", 0, &flash_display_InteractiveObject, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_isRelatedObjectInaccessible = {0x01, 0x00, 0x80, 0x16, "", "isRelatedObjectInaccessible", 0, &_Boolean, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_shiftKey = {0x01, 0x00, 0x80, 0x16, "", "shiftKey", 0, &_Boolean, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_stageY = {0x01, 0x00, 0x80, 0x16, "", "stageY", 0, &_Number, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_altKey = {0x01, 0x00, 0x80, 0x16, "", "altKey", 0, &_Boolean, &flash_events_MouseEvent, 0}; -static methodinfo_t flash_events_MouseEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_ctrlKey = {0x01, 0x00, 0x80, 0x16, "", "ctrlKey", 0, &_Boolean, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_localX = {0x01, 0x00, 0x80, 0x16, "", "localX", 0, &_Number, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_buttonDown = {0x01, 0x00, 0x80, 0x16, "", "buttonDown", 0, &_Boolean, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_ROLL_OVER = {0x01, 0x00, 0x82, 0x16, "", "ROLL_OVER", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_ROLL_OUT = {0x01, 0x00, 0x82, 0x16, "", "ROLL_OUT", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_MOUSE_DOWN = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_DOWN", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_DOUBLE_CLICK = {0x01, 0x00, 0x82, 0x16, "", "DOUBLE_CLICK", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_MOUSE_WHEEL = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_WHEEL", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_CLICK = {0x01, 0x00, 0x82, 0x16, "", "CLICK", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_MOUSE_MOVE = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_MOVE", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_MOUSE_UP = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_UP", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_MOUSE_OVER = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_OVER", 0, &_String, &flash_events_MouseEvent, 0}; -static varinfo_t flash_events_MouseEvent_MOUSE_OUT = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_OUT", 0, &_String, &flash_events_MouseEvent, 0}; -static classinfo_t flash_text_engine_LineJustification = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "LineJustification", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_LineJustification_ALL_INCLUDING_LAST = {0x01, 0x00, 0x82, 0x16, "", "ALL_INCLUDING_LAST", 0, &_String, &flash_text_engine_LineJustification, 0}; -static varinfo_t flash_text_engine_LineJustification_UNJUSTIFIED = {0x01, 0x00, 0x82, 0x16, "", "UNJUSTIFIED", 0, &_String, &flash_text_engine_LineJustification, 0}; -static varinfo_t flash_text_engine_LineJustification_ALL_BUT_LAST = {0x01, 0x00, 0x82, 0x16, "", "ALL_BUT_LAST", 0, &_String, &flash_text_engine_LineJustification, 0}; -static classinfo_t flash_media_Camera = {0x03, 0x00, 0x81, 0x16, "flash.media", "Camera", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_media_Camera_fps = {0x01, 0x00, 0x80, 0x16, "", "fps", 0, &_Number, &flash_media_Camera, 0}; -static methodinfo_t flash_media_Camera_setMode = {0x02, 0x00, 0x80, 0x16, "", "setMode", 0, &voidclass, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_keyFrameInterval = {0x01, 0x00, 0x80, 0x16, "", "keyFrameInterval", 0, &_int, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_motionTimeout = {0x01, 0x00, 0x80, 0x16, "", "motionTimeout", 0, &_int, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_media_Camera, 0}; -static methodinfo_t flash_media_Camera_setCursor = {0x02, 0x00, 0x80, 0x16, "", "setCursor", 0, &voidclass, &flash_media_Camera, 0}; -static methodinfo_t flash_media_Camera_setLoopback = {0x02, 0x00, 0x80, 0x16, "", "setLoopback", 0, &voidclass, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_index = {0x01, 0x00, 0x80, 0x16, "", "index", 0, &_int, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_currentFPS = {0x01, 0x00, 0x80, 0x16, "", "currentFPS", 0, &_Number, &flash_media_Camera, 0}; -static methodinfo_t flash_media_Camera_setKeyFrameInterval = {0x02, 0x00, 0x80, 0x16, "", "setKeyFrameInterval", 0, &voidclass, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_motionLevel = {0x01, 0x00, 0x80, 0x16, "", "motionLevel", 0, &_int, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_bandwidth = {0x01, 0x00, 0x80, 0x16, "", "bandwidth", 0, &_int, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_muted = {0x01, 0x00, 0x80, 0x16, "", "muted", 0, &_Boolean, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_activityLevel = {0x01, 0x00, 0x80, 0x16, "", "activityLevel", 0, &_Number, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_loopback = {0x01, 0x00, 0x80, 0x16, "", "loopback", 0, &_Boolean, &flash_media_Camera, 0}; -static methodinfo_t flash_media_Camera_setQuality = {0x02, 0x00, 0x80, 0x16, "", "setQuality", 0, &voidclass, &flash_media_Camera, 0}; -static methodinfo_t flash_media_Camera_setMotionLevel = {0x02, 0x00, 0x80, 0x16, "", "setMotionLevel", 0, &voidclass, &flash_media_Camera, 0}; -static methodinfo_t flash_media_Camera_getCamera = {0x02, 0x00, 0x82, 0x16, "", "getCamera", 0, &flash_media_Camera, &flash_media_Camera, 0}; -static varinfo_t flash_media_Camera_names = {0x01, 0x00, 0x82, 0x16, "", "names", 0, &_Array, &flash_media_Camera, 0}; -static methodinfo_t flash_net_registerClassAlias = {0x02, 0x00, 0x82, 0x16, "flash.net", "registerClassAlias", 0, &voidclass, 0, 0}; -static classinfo_t flash_accessibility_AccessibilityImplementation = {0x03, 0x00, 0x80, 0x16, "flash.accessibility", "AccessibilityImplementation", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accState = {0x02, 0x00, 0x80, 0x16, "", "get_accState", 0, &_uint, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accName = {0x02, 0x00, 0x80, 0x16, "", "get_accName", 0, &_String, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accSelection = {0x02, 0x00, 0x80, 0x16, "", "get_accSelection", 0, &_Array, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_accDoDefaultAction = {0x02, 0x00, 0x80, 0x16, "", "accDoDefaultAction", 0, &voidclass, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accFocus = {0x02, 0x00, 0x80, 0x16, "", "get_accFocus", 0, &_uint, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accDefaultAction = {0x02, 0x00, 0x80, 0x16, "", "get_accDefaultAction", 0, &_String, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_accSelect = {0x02, 0x00, 0x80, 0x16, "", "accSelect", 0, &voidclass, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accValue = {0x02, 0x00, 0x80, 0x16, "", "get_accValue", 0, &_String, &flash_accessibility_AccessibilityImplementation, 0}; -static varinfo_t flash_accessibility_AccessibilityImplementation_stub = {0x01, 0x00, 0x80, 0x16, "", "stub", 0, &_Boolean, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_get_accRole = {0x02, 0x00, 0x80, 0x16, "", "get_accRole", 0, &_uint, &flash_accessibility_AccessibilityImplementation, 0}; -static varinfo_t flash_accessibility_AccessibilityImplementation_errno = {0x01, 0x00, 0x80, 0x16, "", "errno", 0, &_uint, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_isLabeledBy = {0x02, 0x00, 0x80, 0x16, "", "isLabeledBy", 0, &_Boolean, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_accLocation = {0x02, 0x00, 0x80, 0x16, "", "accLocation", 0, 0, &flash_accessibility_AccessibilityImplementation, 0}; -static methodinfo_t flash_accessibility_AccessibilityImplementation_getChildIDArray = {0x02, 0x00, 0x80, 0x16, "", "getChildIDArray", 0, &_Array, &flash_accessibility_AccessibilityImplementation, 0}; -static classinfo_t flash_utils_ByteArray = {0x03, 0x00, 0x80, 0x16, "flash.utils", "ByteArray", 0, &_Object, interfaces: {&flash_utils_IDataInput, &flash_utils_IDataOutput, 0}}; -static methodinfo_t flash_utils_ByteArray_writeBoolean = {0x02, 0x00, 0x80, 0x16, "", "writeBoolean", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readDouble = {0x02, 0x00, 0x80, 0x16, "", "readDouble", 0, &_Number, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeByte = {0x02, 0x00, 0x80, 0x16, "", "writeByte", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeObject = {0x02, 0x00, 0x80, 0x16, "", "writeObject", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "readUTFBytes", 0, &_String, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeMultiByte = {0x02, 0x00, 0x80, 0x16, "", "writeMultiByte", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_uncompress = {0x02, 0x00, 0x80, 0x16, "", "uncompress", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readUnsignedByte = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedByte", 0, &_uint, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeInt = {0x02, 0x00, 0x80, 0x16, "", "writeInt", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_deflate = {0x02, 0x00, 0x80, 0x16, "", "deflate", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readMultiByte = {0x02, 0x00, 0x80, 0x16, "", "readMultiByte", 0, &_String, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readBytes = {0x02, 0x00, 0x80, 0x16, "", "readBytes", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeShort = {0x02, 0x00, 0x80, 0x16, "", "writeShort", 0, &voidclass, &flash_utils_ByteArray, 0}; -static varinfo_t flash_utils_ByteArray_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &_uint, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readShort = {0x02, 0x00, 0x80, 0x16, "", "readShort", 0, &_int, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeUTF = {0x02, 0x00, 0x80, 0x16, "", "writeUTF", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeBytes = {0x02, 0x00, 0x80, 0x16, "", "writeBytes", 0, &voidclass, &flash_utils_ByteArray, 0}; -static varinfo_t flash_utils_ByteArray_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readObject = {0x02, 0x00, 0x80, 0x16, "", "readObject", 0, 0, &flash_utils_ByteArray, 0}; -static varinfo_t flash_utils_ByteArray_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_uint, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "writeUnsignedInt", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeDouble = {0x02, 0x00, 0x80, 0x16, "", "writeDouble", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeFloat = {0x02, 0x00, 0x80, 0x16, "", "writeFloat", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readInt = {0x02, 0x00, 0x80, 0x16, "", "readInt", 0, &_int, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readByte = {0x02, 0x00, 0x80, 0x16, "", "readByte", 0, &_int, &flash_utils_ByteArray, 0}; -static varinfo_t flash_utils_ByteArray_bytesAvailable = {0x01, 0x00, 0x80, 0x16, "", "bytesAvailable", 0, &_uint, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_utils_ByteArray, 0}; -static varinfo_t flash_utils_ByteArray_endian = {0x01, 0x00, 0x80, 0x16, "", "endian", 0, &_String, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readUnsignedShort = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedShort", 0, &_uint, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedInt", 0, &_uint, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readFloat = {0x02, 0x00, 0x80, 0x16, "", "readFloat", 0, &_Number, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_compress = {0x02, 0x00, 0x80, 0x16, "", "compress", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_writeUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "writeUTFBytes", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readBoolean = {0x02, 0x00, 0x80, 0x16, "", "readBoolean", 0, &_Boolean, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_inflate = {0x02, 0x00, 0x80, 0x16, "", "inflate", 0, &voidclass, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_utils_ByteArray_readUTF = {0x02, 0x00, 0x80, 0x16, "", "readUTF", 0, &_String, &flash_utils_ByteArray, 0}; -static varinfo_t flash_utils_ByteArray_defaultObjectEncoding = {0x01, 0x00, 0x82, 0x16, "", "defaultObjectEncoding", 0, &_uint, &flash_utils_ByteArray, 0}; -static methodinfo_t flash_sampler_stopSampling = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "stopSampling", 0, &voidclass, 0, 0}; -static classinfo_t flash_events_SyncEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "SyncEvent", 0, &flash_events_Event, interfaces: {0}}; -static methodinfo_t flash_events_SyncEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_SyncEvent, 0}; -static methodinfo_t flash_events_SyncEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_SyncEvent, 0}; -static varinfo_t flash_events_SyncEvent_changeList = {0x01, 0x00, 0x80, 0x16, "", "changeList", 0, &_Array, &flash_events_SyncEvent, 0}; -static varinfo_t flash_events_SyncEvent_SYNC = {0x01, 0x00, 0x82, 0x16, "", "SYNC", 0, &_String, &flash_events_SyncEvent, 0}; -static methodinfo_t _encodeURIComponent = {0x02, 0x00, 0x82, 0x16, "", "encodeURIComponent", 0, &_String, 0, 0}; -static classinfo_t flash_net_Socket = {0x03, 0x00, 0x80, 0x16, "flash.net", "Socket", 0, &flash_events_EventDispatcher, interfaces: {&flash_utils_IDataInput, &flash_utils_IDataOutput, 0}}; -static methodinfo_t flash_net_Socket_writeBoolean = {0x02, 0x00, 0x80, 0x16, "", "writeBoolean", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readDouble = {0x02, 0x00, 0x80, 0x16, "", "readDouble", 0, &_Number, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeByte = {0x02, 0x00, 0x80, 0x16, "", "writeByte", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeObject = {0x02, 0x00, 0x80, 0x16, "", "writeObject", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "readUTFBytes", 0, &_String, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeMultiByte = {0x02, 0x00, 0x80, 0x16, "", "writeMultiByte", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readUnsignedByte = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedByte", 0, &_uint, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeInt = {0x02, 0x00, 0x80, 0x16, "", "writeInt", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readMultiByte = {0x02, 0x00, 0x80, 0x16, "", "readMultiByte", 0, &_String, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readBytes = {0x02, 0x00, 0x80, 0x16, "", "readBytes", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeShort = {0x02, 0x00, 0x80, 0x16, "", "writeShort", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readShort = {0x02, 0x00, 0x80, 0x16, "", "readShort", 0, &_int, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeUTF = {0x02, 0x00, 0x80, 0x16, "", "writeUTF", 0, &voidclass, &flash_net_Socket, 0}; -static varinfo_t flash_net_Socket_timeout = {0x01, 0x00, 0x80, 0x16, "", "timeout", 0, &_uint, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeBytes = {0x02, 0x00, 0x80, 0x16, "", "writeBytes", 0, &voidclass, &flash_net_Socket, 0}; -static varinfo_t flash_net_Socket_connected = {0x01, 0x00, 0x80, 0x16, "", "connected", 0, &_Boolean, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readObject = {0x02, 0x00, 0x80, 0x16, "", "readObject", 0, 0, &flash_net_Socket, 0}; -static varinfo_t flash_net_Socket_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_flush = {0x02, 0x00, 0x80, 0x16, "", "flush", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "writeUnsignedInt", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeDouble = {0x02, 0x00, 0x80, 0x16, "", "writeDouble", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeFloat = {0x02, 0x00, 0x80, 0x16, "", "writeFloat", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readInt = {0x02, 0x00, 0x80, 0x16, "", "readInt", 0, &_int, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readByte = {0x02, 0x00, 0x80, 0x16, "", "readByte", 0, &_int, &flash_net_Socket, 0}; -static varinfo_t flash_net_Socket_bytesAvailable = {0x01, 0x00, 0x80, 0x16, "", "bytesAvailable", 0, &_uint, &flash_net_Socket, 0}; -static varinfo_t flash_net_Socket_endian = {0x01, 0x00, 0x80, 0x16, "", "endian", 0, &_String, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readUnsignedShort = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedShort", 0, &_uint, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedInt", 0, &_uint, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readFloat = {0x02, 0x00, 0x80, 0x16, "", "readFloat", 0, &_Number, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_writeUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "writeUTFBytes", 0, &voidclass, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readBoolean = {0x02, 0x00, 0x80, 0x16, "", "readBoolean", 0, &_Boolean, &flash_net_Socket, 0}; -static methodinfo_t flash_net_Socket_readUTF = {0x02, 0x00, 0x80, 0x16, "", "readUTF", 0, &_String, &flash_net_Socket, 0}; -static methodinfo_t _unescape = {0x02, 0x00, 0x82, 0x16, "", "unescape", 0, &_String, 0, 0}; -static classinfo_t flash_utils_Timer = {0x03, 0x00, 0x80, 0x16, "flash.utils", "Timer", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static methodinfo_t flash_utils_Timer_reset = {0x02, 0x00, 0x80, 0x16, "", "reset", 0, &voidclass, &flash_utils_Timer, 0}; -static varinfo_t flash_utils_Timer_running = {0x01, 0x00, 0x80, 0x16, "", "running", 0, &_Boolean, &flash_utils_Timer, 0}; -static varinfo_t flash_utils_Timer_repeatCount = {0x01, 0x00, 0x80, 0x16, "", "repeatCount", 0, &_int, &flash_utils_Timer, 0}; -static methodinfo_t flash_utils_Timer_stop = {0x02, 0x00, 0x80, 0x16, "", "stop", 0, &voidclass, &flash_utils_Timer, 0}; -static methodinfo_t flash_utils_Timer_start = {0x02, 0x00, 0x80, 0x16, "", "start", 0, &voidclass, &flash_utils_Timer, 0}; -static varinfo_t flash_utils_Timer_currentCount = {0x01, 0x00, 0x80, 0x16, "", "currentCount", 0, &_int, &flash_utils_Timer, 0}; -static varinfo_t flash_utils_Timer_delay = {0x01, 0x00, 0x80, 0x16, "", "delay", 0, &_Number, &flash_utils_Timer, 0}; -static classinfo_t _Array = {0x03, 0x00, 0x88, 0x16, "", "Array", 0, &_Object, interfaces: {0}}; -static methodinfo_t _Array_forEach = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "forEach", 0, &voidclass, &_Array, 0}; -static methodinfo_t _Array_sortOn = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "sortOn", 0, 0, &_Array, 0}; -static methodinfo_t _Array_indexOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "indexOf", 0, &_int, &_Array, 0}; -static methodinfo_t _Array_splice = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "splice", 0, 0, &_Array, 0}; -static methodinfo_t _Array_lastIndexOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "lastIndexOf", 0, &_int, &_Array, 0}; -static methodinfo_t _Array_map = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "map", 0, &_Array, &_Array, 0}; -static methodinfo_t _Array_concat = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "concat", 0, &_Array, &_Array, 0}; -static methodinfo_t _Array_shift = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "shift", 0, 0, &_Array, 0}; -static methodinfo_t _Array_unshift = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "unshift", 0, &_uint, &_Array, 0}; -static methodinfo_t _Array_some = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "some", 0, &_Boolean, &_Array, 0}; -static methodinfo_t _Array_filter = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "filter", 0, &_Array, &_Array, 0}; -static methodinfo_t _Array_join = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "join", 0, &_String, &_Array, 0}; -static methodinfo_t _Array_slice = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "slice", 0, &_Array, &_Array, 0}; -static methodinfo_t _Array_every = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "every", 0, &_Boolean, &_Array, 0}; -static methodinfo_t _Array_pop = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "pop", 0, 0, &_Array, 0}; -static methodinfo_t _Array_sort = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "sort", 0, 0, &_Array, 0}; -static methodinfo_t _Array_reverse = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "reverse", 0, &_Array, &_Array, 0}; -static methodinfo_t _Array_push = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "push", 0, &_uint, &_Array, 0}; -static varinfo_t _Array_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_uint, &_Array, 0}; -static varinfo_t _Array_DESCENDING = {0x01, 0x00, 0x82, 0x16, "", "DESCENDING", 0, &_uint, &_Array, 0}; -static varinfo_t _Array_UNIQUESORT = {0x01, 0x00, 0x82, 0x16, "", "UNIQUESORT", 0, &_uint, &_Array, 0}; -static varinfo_t _Array_RETURNINDEXEDARRAY = {0x01, 0x00, 0x82, 0x16, "", "RETURNINDEXEDARRAY", 0, &_uint, &_Array, 0}; -static varinfo_t _Array_CASEINSENSITIVE = {0x01, 0x00, 0x82, 0x16, "", "CASEINSENSITIVE", 0, &_uint, &_Array, 0}; -static varinfo_t _Array_NUMERIC = {0x01, 0x00, 0x82, 0x16, "", "NUMERIC", 0, &_uint, &_Array, 0}; -static classinfo_t flash_geom_ColorTransform = {0x03, 0x00, 0x80, 0x16, "flash.geom", "ColorTransform", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_geom_ColorTransform_blueOffset = {0x01, 0x00, 0x80, 0x16, "", "blueOffset", 0, &_Number, &flash_geom_ColorTransform, 0}; -static varinfo_t flash_geom_ColorTransform_greenOffset = {0x01, 0x00, 0x80, 0x16, "", "greenOffset", 0, &_Number, &flash_geom_ColorTransform, 0}; -static varinfo_t flash_geom_ColorTransform_greenMultiplier = {0x01, 0x00, 0x80, 0x16, "", "greenMultiplier", 0, &_Number, &flash_geom_ColorTransform, 0}; -static varinfo_t flash_geom_ColorTransform_redMultiplier = {0x01, 0x00, 0x80, 0x16, "", "redMultiplier", 0, &_Number, &flash_geom_ColorTransform, 0}; -static varinfo_t flash_geom_ColorTransform_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_geom_ColorTransform, 0}; -static methodinfo_t flash_geom_ColorTransform_concat = {0x02, 0x00, 0x80, 0x16, "", "concat", 0, &voidclass, &flash_geom_ColorTransform, 0}; -static varinfo_t flash_geom_ColorTransform_alphaOffset = {0x01, 0x00, 0x80, 0x16, "", "alphaOffset", 0, &_Number, &flash_geom_ColorTransform, 0}; -static varinfo_t flash_geom_ColorTransform_blueMultiplier = {0x01, 0x00, 0x80, 0x16, "", "blueMultiplier", 0, &_Number, &flash_geom_ColorTransform, 0}; -static methodinfo_t flash_geom_ColorTransform_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_ColorTransform, 0}; -static varinfo_t flash_geom_ColorTransform_alphaMultiplier = {0x01, 0x00, 0x80, 0x16, "", "alphaMultiplier", 0, &_Number, &flash_geom_ColorTransform, 0}; -static varinfo_t flash_geom_ColorTransform_redOffset = {0x01, 0x00, 0x80, 0x16, "", "redOffset", 0, &_Number, &flash_geom_ColorTransform, 0}; -static classinfo_t flash_text_GridFitType = {0x03, 0x00, 0x81, 0x16, "flash.text", "GridFitType", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_GridFitType_SUBPIXEL = {0x01, 0x00, 0x82, 0x16, "", "SUBPIXEL", 0, &_String, &flash_text_GridFitType, 0}; -static varinfo_t flash_text_GridFitType_PIXEL = {0x01, 0x00, 0x82, 0x16, "", "PIXEL", 0, &_String, &flash_text_GridFitType, 0}; -static varinfo_t flash_text_GridFitType_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_GridFitType, 0}; -static classinfo_t flash_filters_DisplacementMapFilterMode = {0x03, 0x00, 0x81, 0x16, "flash.filters", "DisplacementMapFilterMode", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_filters_DisplacementMapFilterMode_COLOR = {0x01, 0x00, 0x82, 0x16, "", "COLOR", 0, &_String, &flash_filters_DisplacementMapFilterMode, 0}; -static varinfo_t flash_filters_DisplacementMapFilterMode_WRAP = {0x01, 0x00, 0x82, 0x16, "", "WRAP", 0, &_String, &flash_filters_DisplacementMapFilterMode, 0}; -static varinfo_t flash_filters_DisplacementMapFilterMode_CLAMP = {0x01, 0x00, 0x82, 0x16, "", "CLAMP", 0, &_String, &flash_filters_DisplacementMapFilterMode, 0}; -static varinfo_t flash_filters_DisplacementMapFilterMode_IGNORE = {0x01, 0x00, 0x82, 0x16, "", "IGNORE", 0, &_String, &flash_filters_DisplacementMapFilterMode, 0}; -static classinfo_t flash_text_TextFieldType = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextFieldType", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextFieldType_DYNAMIC = {0x01, 0x00, 0x82, 0x16, "", "DYNAMIC", 0, &_String, &flash_text_TextFieldType, 0}; -static varinfo_t flash_text_TextFieldType_INPUT = {0x01, 0x00, 0x82, 0x16, "", "INPUT", 0, &_String, &flash_text_TextFieldType, 0}; -static classinfo_t flash_display_IGraphicsStroke = {0x03, 0x00, 0x90, 0x16, "flash.display", "IGraphicsStroke", 0, 0, interfaces: {0}}; -static classinfo_t flash_media_SoundLoaderContext = {0x03, 0x00, 0x80, 0x16, "flash.media", "SoundLoaderContext", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_media_SoundLoaderContext_checkPolicyFile = {0x01, 0x00, 0x80, 0x16, "", "checkPolicyFile", 0, &_Boolean, &flash_media_SoundLoaderContext, 0}; -static varinfo_t flash_media_SoundLoaderContext_bufferTime = {0x01, 0x00, 0x80, 0x16, "", "bufferTime", 0, &_Number, &flash_media_SoundLoaderContext, 0}; -static classinfo_t flash_net_IDynamicPropertyOutput = {0x03, 0x00, 0x90, 0x16, "flash.net", "IDynamicPropertyOutput", 0, 0, interfaces: {0}}; -static methodinfo_t flash_net_IDynamicPropertyOutput_writeDynamicProperty = {0x02, 0x00, 0x80, 0x08, "flash.net:IDynamicPropertyOutput", "writeDynamicProperty", 0, &voidclass, &flash_net_IDynamicPropertyOutput, 0}; -static classinfo_t flash_display_IGraphicsData = {0x03, 0x00, 0x90, 0x16, "flash.display", "IGraphicsData", 0, 0, interfaces: {0}}; -static methodinfo_t flash_utils_getDefinitionByName = {0x02, 0x00, 0x82, 0x16, "flash.utils", "getDefinitionByName", 0, &_Object, 0, 0}; -static classinfo_t _Function = {0x03, 0x00, 0x88, 0x16, "", "Function", 0, &_Object, interfaces: {0}}; -static varinfo_t _Function_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_int, &_Function, 0}; -static methodinfo_t _Function_apply = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "apply", 0, 0, &_Function, 0}; -static methodinfo_t _Function_call = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "call", 0, 0, &_Function, 0}; -static varinfo_t _Function_prototype = {0x01, 0x00, 0x80, 0x16, "", "prototype", 0, 0, &_Function, 0}; -static classinfo_t flash_geom_PerspectiveProjection = {0x03, 0x00, 0x80, 0x16, "flash.geom", "PerspectiveProjection", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_geom_PerspectiveProjection_fieldOfView = {0x01, 0x00, 0x80, 0x16, "", "fieldOfView", 0, &_Number, &flash_geom_PerspectiveProjection, 0}; -static varinfo_t flash_geom_PerspectiveProjection_projectionCenter = {0x01, 0x00, 0x80, 0x16, "", "projectionCenter", 0, &flash_geom_Point, &flash_geom_PerspectiveProjection, 0}; -static methodinfo_t flash_geom_PerspectiveProjection_toMatrix3D = {0x02, 0x00, 0x80, 0x16, "", "toMatrix3D", 0, &flash_geom_Matrix3D, &flash_geom_PerspectiveProjection, 0}; -static varinfo_t flash_geom_PerspectiveProjection_focalLength = {0x01, 0x00, 0x80, 0x16, "", "focalLength", 0, &_Number, &flash_geom_PerspectiveProjection, 0}; -static classinfo_t flash_text_engine_BreakOpportunity = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "BreakOpportunity", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_BreakOpportunity_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_text_engine_BreakOpportunity, 0}; -static varinfo_t flash_text_engine_BreakOpportunity_ANY = {0x01, 0x00, 0x82, 0x16, "", "ANY", 0, &_String, &flash_text_engine_BreakOpportunity, 0}; -static varinfo_t flash_text_engine_BreakOpportunity_ALL = {0x01, 0x00, 0x82, 0x16, "", "ALL", 0, &_String, &flash_text_engine_BreakOpportunity, 0}; -static varinfo_t flash_text_engine_BreakOpportunity_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_engine_BreakOpportunity, 0}; -static methodinfo_t flash_sampler__getInvocationCount = {0x02, 0x00, 0x82, 0x17, "flash.sampler", "_getInvocationCount", 0, &_Number, 0, 0}; -static methodinfo_t _parseFloat = {0x02, 0x00, 0x82, 0x16, "", "parseFloat", 0, &_Number, 0, 0}; -static classinfo_t flash_events_NetStatusEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "NetStatusEvent", 0, &flash_events_Event, interfaces: {0}}; -static methodinfo_t flash_events_NetStatusEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_NetStatusEvent, 0}; -static varinfo_t flash_events_NetStatusEvent_info = {0x01, 0x00, 0x80, 0x16, "", "info", 0, &_Object, &flash_events_NetStatusEvent, 0}; -static methodinfo_t flash_events_NetStatusEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_NetStatusEvent, 0}; -static varinfo_t flash_events_NetStatusEvent_NET_STATUS = {0x01, 0x00, 0x82, 0x16, "", "NET_STATUS", 0, &_String, &flash_events_NetStatusEvent, 0}; -static classinfo_t flash_display_ShaderJob = {0x03, 0x00, 0x80, 0x16, "flash.display", "ShaderJob", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static methodinfo_t flash_display_ShaderJob_cancel = {0x02, 0x00, 0x80, 0x16, "", "cancel", 0, &voidclass, &flash_display_ShaderJob, 0}; -static varinfo_t flash_display_ShaderJob_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_display_ShaderJob, 0}; -static methodinfo_t flash_display_ShaderJob_start = {0x02, 0x00, 0x80, 0x16, "", "start", 0, &voidclass, &flash_display_ShaderJob, 0}; -static varinfo_t flash_display_ShaderJob_shader = {0x01, 0x00, 0x80, 0x16, "", "shader", 0, &flash_display_Shader, &flash_display_ShaderJob, 0}; -static varinfo_t flash_display_ShaderJob_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_display_ShaderJob, 0}; -static varinfo_t flash_display_ShaderJob_target = {0x01, 0x00, 0x80, 0x16, "", "target", 0, &_Object, &flash_display_ShaderJob, 0}; -static varinfo_t flash_display_ShaderJob_progress = {0x01, 0x00, 0x80, 0x16, "", "progress", 0, &_Number, &flash_display_ShaderJob, 0}; -static classinfo_t _VerifyError = {0x03, 0x00, 0x88, 0x16, "", "VerifyError", 0, &_Error, interfaces: {0}}; -static varinfo_t _VerifyError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_VerifyError, 0}; -static classinfo_t flash_events_AsyncErrorEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "AsyncErrorEvent", 0, &flash_events_ErrorEvent, interfaces: {0}}; -static methodinfo_t flash_events_AsyncErrorEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_AsyncErrorEvent, 0}; -static varinfo_t flash_events_AsyncErrorEvent_error = {0x01, 0x00, 0x80, 0x16, "", "error", 0, &_Error, &flash_events_AsyncErrorEvent, 0}; -static methodinfo_t flash_events_AsyncErrorEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_AsyncErrorEvent, 0}; -static varinfo_t flash_events_AsyncErrorEvent_ASYNC_ERROR = {0x01, 0x00, 0x82, 0x16, "", "ASYNC_ERROR", 0, &_String, &flash_events_AsyncErrorEvent, 0}; -static classinfo_t flash_net_SharedObject = {0x03, 0x00, 0x80, 0x16, "flash.net", "SharedObject", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_net_SharedObject_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_SharedObject, 0}; -static varinfo_t flash_net_SharedObject_client = {0x01, 0x00, 0x80, 0x16, "", "client", 0, &_Object, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_setProperty = {0x02, 0x00, 0x80, 0x16, "", "setProperty", 0, &voidclass, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_flush = {0x02, 0x00, 0x80, 0x16, "", "flush", 0, &_String, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_SharedObject, 0}; -static varinfo_t flash_net_SharedObject_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &_uint, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_setDirty = {0x02, 0x00, 0x80, 0x16, "", "setDirty", 0, &voidclass, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_SharedObject, 0}; -static varinfo_t flash_net_SharedObject_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &_Object, &flash_net_SharedObject, 0}; -static varinfo_t flash_net_SharedObject_defaultObjectEncoding = {0x01, 0x00, 0x82, 0x16, "", "defaultObjectEncoding", 0, &_uint, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_getDiskUsage = {0x02, 0x00, 0x82, 0x16, "", "getDiskUsage", 0, &_int, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_getRemote = {0x02, 0x00, 0x82, 0x16, "", "getRemote", 0, &flash_net_SharedObject, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_deleteAll = {0x02, 0x00, 0x82, 0x16, "", "deleteAll", 0, &_int, &flash_net_SharedObject, 0}; -static methodinfo_t flash_net_SharedObject_getLocal = {0x02, 0x00, 0x82, 0x16, "", "getLocal", 0, &flash_net_SharedObject, &flash_net_SharedObject, 0}; -static classinfo_t _Namespace = {0x03, 0x00, 0x81, 0x16, "", "Namespace", 0, &_Object, interfaces: {0}}; -static methodinfo_t _Namespace_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_String, &_Namespace, 0}; -static methodinfo_t _Namespace_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_Namespace, 0}; -static varinfo_t _Namespace_uri = {0x01, 0x00, 0x80, 0x16, "", "uri", 0, &_String, &_Namespace, 0}; -static varinfo_t _Namespace_prefix = {0x01, 0x00, 0x80, 0x16, "", "prefix", 0, 0, &_Namespace, 0}; -static varinfo_t _Namespace_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, 0, &_Namespace, 0}; -static methodinfo_t flash_utils_setTimeout = {0x02, 0x00, 0x82, 0x16, "flash.utils", "setTimeout", 0, &_uint, 0, 0}; -static classinfo_t flash_geom_Matrix3D = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Matrix3D", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_geom_Matrix3D_decompose = {0x02, 0x00, 0x80, 0x16, "", "decompose", 0, &__AS3___vec_Vector, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_pointAt = {0x02, 0x00, 0x80, 0x16, "", "pointAt", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_identity = {0x02, 0x00, 0x80, 0x16, "", "identity", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_transformVector = {0x02, 0x00, 0x80, 0x16, "", "transformVector", 0, &flash_geom_Vector3D, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_appendRotation = {0x02, 0x00, 0x80, 0x16, "", "appendRotation", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static varinfo_t flash_geom_Matrix3D_determinant = {0x01, 0x00, 0x80, 0x16, "", "determinant", 0, &_Number, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_prependRotation = {0x02, 0x00, 0x80, 0x16, "", "prependRotation", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static varinfo_t flash_geom_Matrix3D_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &flash_geom_Vector3D, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_interpolateTo = {0x02, 0x00, 0x80, 0x16, "", "interpolateTo", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_appendScale = {0x02, 0x00, 0x80, 0x16, "", "appendScale", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_prepend = {0x02, 0x00, 0x80, 0x16, "", "prepend", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_recompose = {0x02, 0x00, 0x80, 0x16, "", "recompose", 0, &_Boolean, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_appendTranslation = {0x02, 0x00, 0x80, 0x16, "", "appendTranslation", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_invert = {0x02, 0x00, 0x80, 0x16, "", "invert", 0, &_Boolean, &flash_geom_Matrix3D, 0}; -static varinfo_t flash_geom_Matrix3D_rawData = {0x01, 0x00, 0x80, 0x16, "", "rawData", 0, &__AS3___vec_Vector, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_prependTranslation = {0x02, 0x00, 0x80, 0x16, "", "prependTranslation", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_append = {0x02, 0x00, 0x80, 0x16, "", "append", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Matrix3D, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_prependScale = {0x02, 0x00, 0x80, 0x16, "", "prependScale", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_deltaTransformVector = {0x02, 0x00, 0x80, 0x16, "", "deltaTransformVector", 0, &flash_geom_Vector3D, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_transformVectors = {0x02, 0x00, 0x80, 0x16, "", "transformVectors", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_transpose = {0x02, 0x00, 0x80, 0x16, "", "transpose", 0, &voidclass, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_geom_Matrix3D_interpolate = {0x02, 0x00, 0x82, 0x16, "", "interpolate", 0, &flash_geom_Matrix3D, &flash_geom_Matrix3D, 0}; -static methodinfo_t flash_sampler_pauseSampling = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "pauseSampling", 0, &voidclass, 0, 0}; -static classinfo_t flash_system_Capabilities = {0x03, 0x00, 0x81, 0x16, "flash.system", "Capabilities", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_system_Capabilities_maxLevelIDC = {0x01, 0x00, 0x82, 0x16, "", "maxLevelIDC", 0, &_String, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_isDebugger = {0x01, 0x00, 0x82, 0x16, "", "isDebugger", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasStreamingAudio = {0x01, 0x00, 0x82, 0x16, "", "hasStreamingAudio", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_screenColor = {0x01, 0x00, 0x82, 0x16, "", "screenColor", 0, &_String, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasIME = {0x01, 0x00, 0x82, 0x16, "", "hasIME", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasEmbeddedVideo = {0x01, 0x00, 0x82, 0x16, "", "hasEmbeddedVideo", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasTLS = {0x01, 0x00, 0x82, 0x16, "", "hasTLS", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_isEmbeddedInAcrobat = {0x01, 0x00, 0x82, 0x16, "", "isEmbeddedInAcrobat", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasScreenPlayback = {0x01, 0x00, 0x82, 0x16, "", "hasScreenPlayback", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasVideoEncoder = {0x01, 0x00, 0x82, 0x16, "", "hasVideoEncoder", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasAudioEncoder = {0x01, 0x00, 0x82, 0x16, "", "hasAudioEncoder", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_pixelAspectRatio = {0x01, 0x00, 0x82, 0x16, "", "pixelAspectRatio", 0, &_Number, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasStreamingVideo = {0x01, 0x00, 0x82, 0x16, "", "hasStreamingVideo", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_screenResolutionX = {0x01, 0x00, 0x82, 0x16, "", "screenResolutionX", 0, &_Number, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasScreenBroadcast = {0x01, 0x00, 0x82, 0x16, "", "hasScreenBroadcast", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasAudio = {0x01, 0x00, 0x82, 0x16, "", "hasAudio", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_language = {0x01, 0x00, 0x82, 0x16, "", "language", 0, &_String, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_manufacturer = {0x01, 0x00, 0x82, 0x16, "", "manufacturer", 0, &_String, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasPrinting = {0x01, 0x00, 0x82, 0x16, "", "hasPrinting", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_os = {0x01, 0x00, 0x82, 0x16, "", "os", 0, &_String, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_localFileReadDisable = {0x01, 0x00, 0x82, 0x16, "", "localFileReadDisable", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasMP3 = {0x01, 0x00, 0x82, 0x16, "", "hasMP3", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_avHardwareDisable = {0x01, 0x00, 0x82, 0x16, "", "avHardwareDisable", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_hasAccessibility = {0x01, 0x00, 0x82, 0x16, "", "hasAccessibility", 0, &_Boolean, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_version = {0x01, 0x00, 0x82, 0x16, "", "version", 0, &_String, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_screenDPI = {0x01, 0x00, 0x82, 0x16, "", "screenDPI", 0, &_Number, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_playerType = {0x01, 0x00, 0x82, 0x16, "", "playerType", 0, &_String, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_screenResolutionY = {0x01, 0x00, 0x82, 0x16, "", "screenResolutionY", 0, &_Number, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities__internal = {0x01, 0x00, 0x82, 0x16, "", "_internal", 0, &_uint, &flash_system_Capabilities, 0}; -static varinfo_t flash_system_Capabilities_serverString = {0x01, 0x00, 0x82, 0x16, "", "serverString", 0, &_String, &flash_system_Capabilities, 0}; -static methodinfo_t flash_sampler_getSetterInvocationCount = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getSetterInvocationCount", 0, &_Number, 0, 0}; -static methodinfo_t flash_sampler_getGetterInvocationCount = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getGetterInvocationCount", 0, &_Number, 0, 0}; -static classinfo_t flash_filters_BlurFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "BlurFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_BlurFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_BlurFilter, 0}; -static methodinfo_t flash_filters_BlurFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_BlurFilter, 0}; -static varinfo_t flash_filters_BlurFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_BlurFilter, 0}; -static varinfo_t flash_filters_BlurFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_BlurFilter, 0}; -static methodinfo_t _isFinite = {0x02, 0x00, 0x82, 0x16, "", "isFinite", 0, &_Boolean, 0, 0}; -static classinfo_t flash_media_Video = {0x03, 0x00, 0x80, 0x16, "flash.media", "Video", 0, &flash_display_DisplayObject, interfaces: {0}}; -static methodinfo_t flash_media_Video_attachCamera = {0x02, 0x00, 0x80, 0x16, "", "attachCamera", 0, &voidclass, &flash_media_Video, 0}; -static varinfo_t flash_media_Video_videoWidth = {0x01, 0x00, 0x80, 0x16, "", "videoWidth", 0, &_int, &flash_media_Video, 0}; -static methodinfo_t flash_media_Video_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_media_Video, 0}; -static varinfo_t flash_media_Video_deblocking = {0x01, 0x00, 0x80, 0x16, "", "deblocking", 0, &_int, &flash_media_Video, 0}; -static varinfo_t flash_media_Video_videoHeight = {0x01, 0x00, 0x80, 0x16, "", "videoHeight", 0, &_int, &flash_media_Video, 0}; -static methodinfo_t flash_media_Video_attachNetStream = {0x02, 0x00, 0x80, 0x16, "", "attachNetStream", 0, &voidclass, &flash_media_Video, 0}; -static varinfo_t flash_media_Video_smoothing = {0x01, 0x00, 0x80, 0x16, "", "smoothing", 0, &_Boolean, &flash_media_Video, 0}; -static classinfo_t flash_text_engine_TextLineCreationResult = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextLineCreationResult", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_TextLineCreationResult_EMERGENCY = {0x01, 0x00, 0x82, 0x16, "", "EMERGENCY", 0, &_String, &flash_text_engine_TextLineCreationResult, 0}; -static varinfo_t flash_text_engine_TextLineCreationResult_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "COMPLETE", 0, &_String, &flash_text_engine_TextLineCreationResult, 0}; -static varinfo_t flash_text_engine_TextLineCreationResult_SUCCESS = {0x01, 0x00, 0x82, 0x16, "", "SUCCESS", 0, &_String, &flash_text_engine_TextLineCreationResult, 0}; -static varinfo_t flash_text_engine_TextLineCreationResult_INSUFFICIENT_WIDTH = {0x01, 0x00, 0x82, 0x16, "", "INSUFFICIENT_WIDTH", 0, &_String, &flash_text_engine_TextLineCreationResult, 0}; -static classinfo_t _Error = {0x03, 0x00, 0x88, 0x16, "", "Error", 0, &_Object, interfaces: {0}}; -static varinfo_t _Error_message = {0x01, 0x00, 0x80, 0x16, "", "message", 0, 0, &_Error, 0}; -static varinfo_t _Error_errorID = {0x01, 0x00, 0x80, 0x16, "", "errorID", 0, &_int, &_Error, 0}; -static methodinfo_t _Error_getStackTrace = {0x02, 0x00, 0x80, 0x16, "", "getStackTrace", 0, &_String, &_Error, 0}; -static varinfo_t _Error_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, 0, &_Error, 0}; -static varinfo_t _Error_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Error, 0}; -static methodinfo_t _Error_getErrorMessage = {0x02, 0x00, 0x82, 0x16, "", "getErrorMessage", 0, &_String, &_Error, 0}; -static methodinfo_t _Error_throwError = {0x02, 0x00, 0x82, 0x16, "", "throwError", 0, 0, &_Error, 0}; -static classinfo_t flash_xml_XMLNode = {0x03, 0x00, 0x80, 0x16, "flash.xml", "XMLNode", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_xml_XMLNode_childNodes = {0x01, 0x00, 0x80, 0x16, "", "childNodes", 0, &_Array, &flash_xml_XMLNode, 0}; -static methodinfo_t flash_xml_XMLNode_appendChild = {0x02, 0x00, 0x80, 0x16, "", "appendChild", 0, &voidclass, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_nextSibling = {0x01, 0x00, 0x80, 0x16, "", "nextSibling", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_nodeType = {0x01, 0x00, 0x80, 0x16, "", "nodeType", 0, &_uint, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_attributes = {0x01, 0x00, 0x80, 0x16, "", "attributes", 0, &_Object, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_firstChild = {0x01, 0x00, 0x80, 0x16, "", "firstChild", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_parentNode = {0x01, 0x00, 0x80, 0x16, "", "parentNode", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; -static methodinfo_t flash_xml_XMLNode_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_prefix = {0x01, 0x00, 0x80, 0x16, "", "prefix", 0, &_String, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_localName = {0x01, 0x00, 0x80, 0x16, "", "localName", 0, &_String, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_nodeName = {0x01, 0x00, 0x80, 0x16, "", "nodeName", 0, &_String, &flash_xml_XMLNode, 0}; -static methodinfo_t flash_xml_XMLNode_getNamespaceForPrefix = {0x02, 0x00, 0x80, 0x16, "", "getNamespaceForPrefix", 0, &_String, &flash_xml_XMLNode, 0}; -static methodinfo_t flash_xml_XMLNode_insertBefore = {0x02, 0x00, 0x80, 0x16, "", "insertBefore", 0, &voidclass, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_lastChild = {0x01, 0x00, 0x80, 0x16, "", "lastChild", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; -static methodinfo_t flash_xml_XMLNode_cloneNode = {0x02, 0x00, 0x80, 0x16, "", "cloneNode", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; -static methodinfo_t flash_xml_XMLNode_removeNode = {0x02, 0x00, 0x80, 0x16, "", "removeNode", 0, &voidclass, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_namespaceURI = {0x01, 0x00, 0x80, 0x16, "", "namespaceURI", 0, &_String, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_previousSibling = {0x01, 0x00, 0x80, 0x16, "", "previousSibling", 0, &flash_xml_XMLNode, &flash_xml_XMLNode, 0}; -static methodinfo_t flash_xml_XMLNode_hasChildNodes = {0x02, 0x00, 0x80, 0x16, "", "hasChildNodes", 0, &_Boolean, &flash_xml_XMLNode, 0}; -static methodinfo_t flash_xml_XMLNode_getPrefixForNamespace = {0x02, 0x00, 0x80, 0x16, "", "getPrefixForNamespace", 0, &_String, &flash_xml_XMLNode, 0}; -static varinfo_t flash_xml_XMLNode_nodeValue = {0x01, 0x00, 0x80, 0x16, "", "nodeValue", 0, &_String, &flash_xml_XMLNode, 0}; -static classinfo_t flash_net_URLVariables = {0x03, 0x00, 0x88, 0x16, "flash.net", "URLVariables", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_net_URLVariables_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_net_URLVariables, 0}; -static methodinfo_t flash_net_URLVariables_decode = {0x02, 0x00, 0x80, 0x16, "", "decode", 0, &voidclass, &flash_net_URLVariables, 0}; -static classinfo_t flash_display_LoaderInfo = {0x03, 0x00, 0x80, 0x16, "flash.display", "LoaderInfo", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_display_LoaderInfo_actionScriptVersion = {0x01, 0x00, 0x80, 0x16, "", "actionScriptVersion", 0, &_uint, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_contentType = {0x01, 0x00, 0x80, 0x16, "", "contentType", 0, &_String, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_sameDomain = {0x01, 0x00, 0x80, 0x16, "", "sameDomain", 0, &_Boolean, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_uint, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_loaderURL = {0x01, 0x00, 0x80, 0x16, "", "loaderURL", 0, &_String, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_display_LoaderInfo, 0}; -static methodinfo_t flash_display_LoaderInfo_dispatchEvent = {0x02, 0x00, 0x80, 0x16, "", "dispatchEvent", 0, &_Boolean, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_frameRate = {0x01, 0x00, 0x80, 0x16, "", "frameRate", 0, &_Number, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_parameters = {0x01, 0x00, 0x80, 0x16, "", "parameters", 0, &_Object, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_url = {0x01, 0x00, 0x80, 0x16, "", "url", 0, &_String, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_content = {0x01, 0x00, 0x80, 0x16, "", "content", 0, &flash_display_DisplayObject, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_swfVersion = {0x01, 0x00, 0x80, 0x16, "", "swfVersion", 0, &_uint, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_bytes = {0x01, 0x00, 0x80, 0x16, "", "bytes", 0, &flash_utils_ByteArray, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_loader = {0x01, 0x00, 0x80, 0x16, "", "loader", 0, &flash_display_Loader, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_applicationDomain = {0x01, 0x00, 0x80, 0x16, "", "applicationDomain", 0, &flash_system_ApplicationDomain, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_parentAllowsChild = {0x01, 0x00, 0x80, 0x16, "", "parentAllowsChild", 0, &_Boolean, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_childAllowsParent = {0x01, 0x00, 0x80, 0x16, "", "childAllowsParent", 0, &_Boolean, &flash_display_LoaderInfo, 0}; -static varinfo_t flash_display_LoaderInfo_sharedEvents = {0x01, 0x00, 0x80, 0x16, "", "sharedEvents", 0, &flash_events_EventDispatcher, &flash_display_LoaderInfo, 0}; -static methodinfo_t flash_display_LoaderInfo_getLoaderInfoByDefinition = {0x02, 0x00, 0x82, 0x16, "", "getLoaderInfoByDefinition", 0, &flash_display_LoaderInfo, &flash_display_LoaderInfo, 0}; -static classinfo_t flash_sampler_Sample = {0x03, 0x00, 0x80, 0x16, "flash.sampler", "Sample", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_sampler_Sample_time = {0x01, 0x00, 0x80, 0x16, "", "time", 0, &_Number, &flash_sampler_Sample, 0}; -static varinfo_t flash_sampler_Sample_stack = {0x01, 0x00, 0x80, 0x16, "", "stack", 0, &_Array, &flash_sampler_Sample, 0}; -static classinfo_t flash_text_engine_DigitWidth = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "DigitWidth", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_DigitWidth_PROPORTIONAL = {0x01, 0x00, 0x82, 0x16, "", "PROPORTIONAL", 0, &_String, &flash_text_engine_DigitWidth, 0}; -static varinfo_t flash_text_engine_DigitWidth_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_text_engine_DigitWidth, 0}; -static varinfo_t flash_text_engine_DigitWidth_TABULAR = {0x01, 0x00, 0x82, 0x16, "", "TABULAR", 0, &_String, &flash_text_engine_DigitWidth, 0}; -static classinfo_t flash_net_URLRequestMethod = {0x03, 0x00, 0x81, 0x16, "flash.net", "URLRequestMethod", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_net_URLRequestMethod_GET = {0x01, 0x00, 0x82, 0x16, "", "GET", 0, &_String, &flash_net_URLRequestMethod, 0}; -static varinfo_t flash_net_URLRequestMethod_POST = {0x01, 0x00, 0x82, 0x16, "", "POST", 0, &_String, &flash_net_URLRequestMethod, 0}; -static methodinfo_t adobe_utils_MMExecute = {0x02, 0x00, 0x82, 0x16, "adobe.utils", "MMExecute", 0, &_String, 0, 0}; -static classinfo_t flash_system_System = {0x03, 0x00, 0x81, 0x16, "flash.system", "System", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_system_System_pause = {0x02, 0x00, 0x82, 0x16, "", "pause", 0, &voidclass, &flash_system_System, 0}; -static varinfo_t flash_system_System_useCodePage = {0x01, 0x00, 0x82, 0x16, "", "useCodePage", 0, &_Boolean, &flash_system_System, 0}; -static methodinfo_t flash_system_System_exit = {0x02, 0x00, 0x82, 0x16, "", "exit", 0, &voidclass, &flash_system_System, 0}; -static methodinfo_t flash_system_System_setClipboard = {0x02, 0x00, 0x82, 0x16, "", "setClipboard", 0, &voidclass, &flash_system_System, 0}; -static varinfo_t flash_system_System_totalMemory = {0x01, 0x00, 0x82, 0x16, "", "totalMemory", 0, &_uint, &flash_system_System, 0}; -static methodinfo_t flash_system_System_gc = {0x02, 0x00, 0x82, 0x16, "", "gc", 0, &voidclass, &flash_system_System, 0}; -static methodinfo_t flash_system_System_resume = {0x02, 0x00, 0x82, 0x16, "", "resume", 0, &voidclass, &flash_system_System, 0}; -static varinfo_t flash_system_System_vmVersion = {0x01, 0x00, 0x82, 0x16, "", "vmVersion", 0, &_String, &flash_system_System, 0}; -static varinfo_t flash_system_System_ime = {0x01, 0x00, 0x82, 0x16, "", "ime", 0, &flash_system_IME, &flash_system_System, 0}; -static classinfo_t flash_filters_BitmapFilterQuality = {0x03, 0x00, 0x81, 0x16, "flash.filters", "BitmapFilterQuality", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_filters_BitmapFilterQuality_LOW = {0x01, 0x00, 0x82, 0x16, "", "LOW", 0, &_int, &flash_filters_BitmapFilterQuality, 0}; -static varinfo_t flash_filters_BitmapFilterQuality_MEDIUM = {0x01, 0x00, 0x82, 0x16, "", "MEDIUM", 0, &_int, &flash_filters_BitmapFilterQuality, 0}; -static varinfo_t flash_filters_BitmapFilterQuality_HIGH = {0x01, 0x00, 0x82, 0x16, "", "HIGH", 0, &_int, &flash_filters_BitmapFilterQuality, 0}; -static classinfo_t flash_display_DisplayObjectContainer = {0x03, 0x00, 0x80, 0x16, "flash.display", "DisplayObjectContainer", 0, &flash_display_InteractiveObject, interfaces: {0}}; -static methodinfo_t flash_display_DisplayObjectContainer_addChild = {0x02, 0x00, 0x80, 0x16, "", "addChild", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_getObjectsUnderPoint = {0x02, 0x00, 0x80, 0x16, "", "getObjectsUnderPoint", 0, &_Array, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_removeChildAt = {0x02, 0x00, 0x80, 0x16, "", "removeChildAt", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_swapChildren = {0x02, 0x00, 0x80, 0x16, "", "swapChildren", 0, &voidclass, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint = {0x02, 0x00, 0x80, 0x16, "", "areInaccessibleObjectsUnderPoint", 0, &_Boolean, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_setChildIndex = {0x02, 0x00, 0x80, 0x16, "", "setChildIndex", 0, &voidclass, &flash_display_DisplayObjectContainer, 0}; -static varinfo_t flash_display_DisplayObjectContainer_numChildren = {0x01, 0x00, 0x80, 0x16, "", "numChildren", 0, &_int, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_getChildIndex = {0x02, 0x00, 0x80, 0x16, "", "getChildIndex", 0, &_int, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_getChildAt = {0x02, 0x00, 0x80, 0x16, "", "getChildAt", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_removeChild = {0x02, 0x00, 0x80, 0x16, "", "removeChild", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_addChildAt = {0x02, 0x00, 0x80, 0x16, "", "addChildAt", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_contains = {0x02, 0x00, 0x80, 0x16, "", "contains", 0, &_Boolean, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_getChildByName = {0x02, 0x00, 0x80, 0x16, "", "getChildByName", 0, &flash_display_DisplayObject, &flash_display_DisplayObjectContainer, 0}; -static methodinfo_t flash_display_DisplayObjectContainer_swapChildrenAt = {0x02, 0x00, 0x80, 0x16, "", "swapChildrenAt", 0, &voidclass, &flash_display_DisplayObjectContainer, 0}; -static varinfo_t flash_display_DisplayObjectContainer_mouseChildren = {0x01, 0x00, 0x80, 0x16, "", "mouseChildren", 0, &_Boolean, &flash_display_DisplayObjectContainer, 0}; -static varinfo_t flash_display_DisplayObjectContainer_tabChildren = {0x01, 0x00, 0x80, 0x16, "", "tabChildren", 0, &_Boolean, &flash_display_DisplayObjectContainer, 0}; -static varinfo_t flash_display_DisplayObjectContainer_textSnapshot = {0x01, 0x00, 0x80, 0x16, "", "textSnapshot", 0, &flash_text_TextSnapshot, &flash_display_DisplayObjectContainer, 0}; -static classinfo_t flash_system_LoaderContext = {0x03, 0x00, 0x80, 0x16, "flash.system", "LoaderContext", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_system_LoaderContext_checkPolicyFile = {0x01, 0x00, 0x80, 0x16, "", "checkPolicyFile", 0, &_Boolean, &flash_system_LoaderContext, 0}; -static varinfo_t flash_system_LoaderContext_securityDomain = {0x01, 0x00, 0x80, 0x16, "", "securityDomain", 0, &flash_system_SecurityDomain, &flash_system_LoaderContext, 0}; -static varinfo_t flash_system_LoaderContext_applicationDomain = {0x01, 0x00, 0x80, 0x16, "", "applicationDomain", 0, &flash_system_ApplicationDomain, &flash_system_LoaderContext, 0}; -static methodinfo_t flash_utils_clearTimeout = {0x02, 0x00, 0x82, 0x16, "flash.utils", "clearTimeout", 0, &voidclass, 0, 0}; -static methodinfo_t _isXMLName = {0x02, 0x00, 0x82, 0x16, "", "isXMLName", 0, &_Boolean, 0, 0}; -static classinfo_t flash_xml_XMLNodeType = {0x03, 0x00, 0x81, 0x16, "flash.xml", "XMLNodeType", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_xml_XMLNodeType_PROCESSING_INSTRUCTION_NODE = {0x01, 0x00, 0x82, 0x16, "", "PROCESSING_INSTRUCTION_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; -static varinfo_t flash_xml_XMLNodeType_CDATA_NODE = {0x01, 0x00, 0x82, 0x16, "", "CDATA_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; -static varinfo_t flash_xml_XMLNodeType_DOCUMENT_TYPE_NODE = {0x01, 0x00, 0x82, 0x16, "", "DOCUMENT_TYPE_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; -static varinfo_t flash_xml_XMLNodeType_COMMENT_NODE = {0x01, 0x00, 0x82, 0x16, "", "COMMENT_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; -static varinfo_t flash_xml_XMLNodeType_XML_DECLARATION = {0x01, 0x00, 0x82, 0x16, "", "XML_DECLARATION", 0, &_uint, &flash_xml_XMLNodeType, 0}; -static varinfo_t flash_xml_XMLNodeType_TEXT_NODE = {0x01, 0x00, 0x82, 0x16, "", "TEXT_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; -static varinfo_t flash_xml_XMLNodeType_ELEMENT_NODE = {0x01, 0x00, 0x82, 0x16, "", "ELEMENT_NODE", 0, &_uint, &flash_xml_XMLNodeType, 0}; -static classinfo_t flash_events_ErrorEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ErrorEvent", 0, &flash_events_TextEvent, interfaces: {0}}; -static methodinfo_t flash_events_ErrorEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ErrorEvent, 0}; -static methodinfo_t flash_events_ErrorEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ErrorEvent, 0}; -static varinfo_t flash_events_ErrorEvent_ERROR = {0x01, 0x00, 0x82, 0x16, "", "ERROR", 0, &_String, &flash_events_ErrorEvent, 0}; -static classinfo_t flash_utils_IDataOutput = {0x03, 0x00, 0x90, 0x16, "flash.utils", "IDataOutput", 0, 0, interfaces: {0}}; -static methodinfo_t flash_utils_IDataOutput_writeUnsignedInt = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeUnsignedInt", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeInt = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeInt", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static varinfo_t flash_utils_IDataOutput_objectEncoding = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "objectEncoding", 0, &_uint, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeUTFBytes = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeUTFBytes", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeObject = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeObject", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeMultiByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeMultiByte", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeShort = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeShort", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeFloat = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeFloat", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeUTF = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeUTF", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeByte", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeBoolean = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeBoolean", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeDouble = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeDouble", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static methodinfo_t flash_utils_IDataOutput_writeBytes = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "writeBytes", 0, &voidclass, &flash_utils_IDataOutput, 0}; -static varinfo_t flash_utils_IDataOutput_endian = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataOutput", "endian", 0, &_String, &flash_utils_IDataOutput, 0}; -static classinfo_t flash_geom_Utils3D = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Utils3D", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_geom_Utils3D_projectVectors = {0x02, 0x00, 0x82, 0x16, "", "projectVectors", 0, &voidclass, &flash_geom_Utils3D, 0}; -static methodinfo_t flash_geom_Utils3D_projectVector = {0x02, 0x00, 0x82, 0x16, "", "projectVector", 0, &flash_geom_Vector3D, &flash_geom_Utils3D, 0}; -static methodinfo_t flash_geom_Utils3D_pointTowards = {0x02, 0x00, 0x82, 0x16, "", "pointTowards", 0, &flash_geom_Matrix3D, &flash_geom_Utils3D, 0}; -static classinfo_t flash_events_TextEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "TextEvent", 0, &flash_events_Event, interfaces: {0}}; -static methodinfo_t flash_events_TextEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_TextEvent, 0}; -static varinfo_t flash_events_TextEvent_text = {0x01, 0x00, 0x80, 0x16, "", "text", 0, &_String, &flash_events_TextEvent, 0}; -static methodinfo_t flash_events_TextEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_TextEvent, 0}; -static varinfo_t flash_events_TextEvent_LINK = {0x01, 0x00, 0x82, 0x16, "", "LINK", 0, &_String, &flash_events_TextEvent, 0}; -static varinfo_t flash_events_TextEvent_TEXT_INPUT = {0x01, 0x00, 0x82, 0x16, "", "TEXT_INPUT", 0, &_String, &flash_events_TextEvent, 0}; -static classinfo_t flash_utils_Proxy = {0x03, 0x00, 0x80, 0x16, "flash.utils", "Proxy", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_utils_Proxy_callProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "callProperty", 0, 0, &flash_utils_Proxy, 0}; -static methodinfo_t flash_utils_Proxy_setProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "setProperty", 0, &voidclass, &flash_utils_Proxy, 0}; -static methodinfo_t flash_utils_Proxy_getProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "getProperty", 0, 0, &flash_utils_Proxy, 0}; -static methodinfo_t flash_utils_Proxy_nextName = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "nextName", 0, &_String, &flash_utils_Proxy, 0}; -static methodinfo_t flash_utils_Proxy_nextNameIndex = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "nextNameIndex", 0, &_int, &flash_utils_Proxy, 0}; -static methodinfo_t flash_utils_Proxy_hasProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "hasProperty", 0, &_Boolean, &flash_utils_Proxy, 0}; -static methodinfo_t flash_utils_Proxy_deleteProperty = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "deleteProperty", 0, &_Boolean, &flash_utils_Proxy, 0}; -static methodinfo_t flash_utils_Proxy_getDescendants = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "getDescendants", 0, 0, &flash_utils_Proxy, 0}; -static methodinfo_t flash_utils_Proxy_isAttribute = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "isAttribute", 0, &_Boolean, &flash_utils_Proxy, 0}; -static methodinfo_t flash_utils_Proxy_nextValue = {0x02, 0x00, 0x80, 0x08, "http://www.adobe.com/2006/actionscript/flash/proxy", "nextValue", 0, 0, &flash_utils_Proxy, 0}; -static classinfo_t flash_text_engine_FontPosture = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontPosture", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_FontPosture_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_text_engine_FontPosture, 0}; -static varinfo_t flash_text_engine_FontPosture_ITALIC = {0x01, 0x00, 0x82, 0x16, "", "ITALIC", 0, &_String, &flash_text_engine_FontPosture, 0}; -static classinfo_t flash_xml_XMLDocument = {0x03, 0x00, 0x80, 0x16, "flash.xml", "XMLDocument", 0, &flash_xml_XMLNode, interfaces: {0}}; -static varinfo_t flash_xml_XMLDocument_docTypeDecl = {0x01, 0x00, 0x80, 0x16, "", "docTypeDecl", 0, &_Object, &flash_xml_XMLDocument, 0}; -static varinfo_t flash_xml_XMLDocument_idMap = {0x01, 0x00, 0x80, 0x16, "", "idMap", 0, &_Object, &flash_xml_XMLDocument, 0}; -static methodinfo_t flash_xml_XMLDocument_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_xml_XMLDocument, 0}; -static varinfo_t flash_xml_XMLDocument_xmlDecl = {0x01, 0x00, 0x80, 0x16, "", "xmlDecl", 0, &_Object, &flash_xml_XMLDocument, 0}; -static methodinfo_t flash_xml_XMLDocument_createElement = {0x02, 0x00, 0x80, 0x16, "", "createElement", 0, &flash_xml_XMLNode, &flash_xml_XMLDocument, 0}; -static varinfo_t flash_xml_XMLDocument_ignoreWhite = {0x01, 0x00, 0x80, 0x16, "", "ignoreWhite", 0, &_Boolean, &flash_xml_XMLDocument, 0}; -static methodinfo_t flash_xml_XMLDocument_createTextNode = {0x02, 0x00, 0x80, 0x16, "", "createTextNode", 0, &flash_xml_XMLNode, &flash_xml_XMLDocument, 0}; -static methodinfo_t flash_xml_XMLDocument_parseXML = {0x02, 0x00, 0x80, 0x16, "", "parseXML", 0, &voidclass, &flash_xml_XMLDocument, 0}; -static classinfo_t flash_display_ShaderInput = {0x03, 0x00, 0x89, 0x16, "flash.display", "ShaderInput", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_ShaderInput_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_display_ShaderInput, 0}; -static varinfo_t flash_display_ShaderInput_input = {0x01, 0x00, 0x80, 0x16, "", "input", 0, &_Object, &flash_display_ShaderInput, 0}; -static varinfo_t flash_display_ShaderInput_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_display_ShaderInput, 0}; -static varinfo_t flash_display_ShaderInput_index = {0x01, 0x00, 0x80, 0x16, "", "index", 0, &_int, &flash_display_ShaderInput, 0}; -static varinfo_t flash_display_ShaderInput_channels = {0x01, 0x00, 0x80, 0x16, "", "channels", 0, &_int, &flash_display_ShaderInput, 0}; -static classinfo_t flash_text_engine_TextBlock = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextBlock", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_text_engine_TextBlock_createTextLine = {0x02, 0x00, 0x80, 0x16, "", "createTextLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_bidiLevel = {0x01, 0x00, 0x80, 0x16, "", "bidiLevel", 0, &_int, &flash_text_engine_TextBlock, 0}; -static methodinfo_t flash_text_engine_TextBlock_getTextLineAtCharIndex = {0x02, 0x00, 0x80, 0x16, "", "getTextLineAtCharIndex", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_lastLine = {0x01, 0x00, 0x80, 0x16, "", "lastLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; -static methodinfo_t flash_text_engine_TextBlock_findPreviousWordBoundary = {0x02, 0x00, 0x80, 0x16, "", "findPreviousWordBoundary", 0, &_int, &flash_text_engine_TextBlock, 0}; -static methodinfo_t flash_text_engine_TextBlock_findPreviousAtomBoundary = {0x02, 0x00, 0x80, 0x16, "", "findPreviousAtomBoundary", 0, &_int, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_baselineZero = {0x01, 0x00, 0x80, 0x16, "", "baselineZero", 0, &_String, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_applyNonLinearFontScaling = {0x01, 0x00, 0x80, 0x16, "", "applyNonLinearFontScaling", 0, &_Boolean, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_firstLine = {0x01, 0x00, 0x80, 0x16, "", "firstLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_textJustifier = {0x01, 0x00, 0x80, 0x16, "", "textJustifier", 0, &flash_text_engine_TextJustifier, &flash_text_engine_TextBlock, 0}; -static methodinfo_t flash_text_engine_TextBlock_releaseLines = {0x02, 0x00, 0x80, 0x16, "", "releaseLines", 0, &voidclass, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_firstInvalidLine = {0x01, 0x00, 0x80, 0x16, "", "firstInvalidLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_baselineFontSize = {0x01, 0x00, 0x80, 0x16, "", "baselineFontSize", 0, &_Number, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_lineRotation = {0x01, 0x00, 0x80, 0x16, "", "lineRotation", 0, &_String, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_userData = {0x01, 0x00, 0x80, 0x16, "", "userData", 0, 0, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_content = {0x01, 0x00, 0x80, 0x16, "", "content", 0, &flash_text_engine_ContentElement, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_textLineCreationResult = {0x01, 0x00, 0x80, 0x16, "", "textLineCreationResult", 0, &_String, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_baselineFontDescription = {0x01, 0x00, 0x80, 0x16, "", "baselineFontDescription", 0, &flash_text_engine_FontDescription, &flash_text_engine_TextBlock, 0}; -static methodinfo_t flash_text_engine_TextBlock_findNextAtomBoundary = {0x02, 0x00, 0x80, 0x16, "", "findNextAtomBoundary", 0, &_int, &flash_text_engine_TextBlock, 0}; -static methodinfo_t flash_text_engine_TextBlock_findNextWordBoundary = {0x02, 0x00, 0x80, 0x16, "", "findNextWordBoundary", 0, &_int, &flash_text_engine_TextBlock, 0}; -static varinfo_t flash_text_engine_TextBlock_tabStops = {0x01, 0x00, 0x80, 0x16, "", "tabStops", 0, &__AS3___vec_Vector, &flash_text_engine_TextBlock, 0}; -static methodinfo_t flash_text_engine_TextBlock_dump = {0x02, 0x00, 0x80, 0x16, "", "dump", 0, &_String, &flash_text_engine_TextBlock, 0}; -static classinfo_t flash_ui_MouseCursor = {0x03, 0x00, 0x81, 0x16, "flash.ui", "MouseCursor", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_ui_MouseCursor_BUTTON = {0x01, 0x00, 0x82, 0x16, "", "BUTTON", 0, &_String, &flash_ui_MouseCursor, 0}; -static varinfo_t flash_ui_MouseCursor_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_ui_MouseCursor, 0}; -static varinfo_t flash_ui_MouseCursor_ARROW = {0x01, 0x00, 0x82, 0x16, "", "ARROW", 0, &_String, &flash_ui_MouseCursor, 0}; -static varinfo_t flash_ui_MouseCursor_IBEAM = {0x01, 0x00, 0x82, 0x16, "", "IBEAM", 0, &_String, &flash_ui_MouseCursor, 0}; -static varinfo_t flash_ui_MouseCursor_HAND = {0x01, 0x00, 0x82, 0x16, "", "HAND", 0, &_String, &flash_ui_MouseCursor, 0}; -static namespace_t flash_utils_flash_proxy_constant_ns = {0x08, "http://www.adobe.com/2006/actionscript/flash/proxy"}; -static constant_t flash_utils_flash_proxy_constant = {type: 8, &flash_utils_flash_proxy_constant_ns}; -static varinfo_t flash_utils_flash_proxy = {0x01, 0x00, 0xa2, 0x16, "flash.utils", "flash_proxy", 0, 0, 0, &flash_utils_flash_proxy_constant}; -static classinfo_t flash_display_MorphShape = {0x03, 0x00, 0x81, 0x16, "flash.display", "MorphShape", 0, &flash_display_DisplayObject, interfaces: {0}}; -static classinfo_t flash_text_TextDisplayMode = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextDisplayMode", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextDisplayMode_CRT = {0x01, 0x00, 0x82, 0x16, "", "CRT", 0, &_String, &flash_text_TextDisplayMode, 0}; -static varinfo_t flash_text_TextDisplayMode_LCD = {0x01, 0x00, 0x82, 0x16, "", "LCD", 0, &_String, &flash_text_TextDisplayMode, 0}; -static varinfo_t flash_text_TextDisplayMode_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_text_TextDisplayMode, 0}; -static classinfo_t flash_net_URLLoaderDataFormat = {0x03, 0x00, 0x81, 0x16, "flash.net", "URLLoaderDataFormat", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_net_URLLoaderDataFormat_VARIABLES = {0x01, 0x00, 0x82, 0x16, "", "VARIABLES", 0, &_String, &flash_net_URLLoaderDataFormat, 0}; -static varinfo_t flash_net_URLLoaderDataFormat_BINARY = {0x01, 0x00, 0x82, 0x16, "", "BINARY", 0, &_String, &flash_net_URLLoaderDataFormat, 0}; -static varinfo_t flash_net_URLLoaderDataFormat_TEXT = {0x01, 0x00, 0x82, 0x16, "", "TEXT", 0, &_String, &flash_net_URLLoaderDataFormat, 0}; -static classinfo_t flash_display_StageQuality = {0x03, 0x00, 0x81, 0x16, "flash.display", "StageQuality", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_StageQuality_LOW = {0x01, 0x00, 0x82, 0x16, "", "LOW", 0, &_String, &flash_display_StageQuality, 0}; -static varinfo_t flash_display_StageQuality_MEDIUM = {0x01, 0x00, 0x82, 0x16, "", "MEDIUM", 0, &_String, &flash_display_StageQuality, 0}; -static varinfo_t flash_display_StageQuality_HIGH = {0x01, 0x00, 0x82, 0x16, "", "HIGH", 0, &_String, &flash_display_StageQuality, 0}; -static varinfo_t flash_display_StageQuality_BEST = {0x01, 0x00, 0x82, 0x16, "", "BEST", 0, &_String, &flash_display_StageQuality, 0}; -static classinfo_t flash_display_Sprite = {0x03, 0x00, 0x80, 0x16, "flash.display", "Sprite", 0, &flash_display_DisplayObjectContainer, interfaces: {0}}; -static methodinfo_t flash_display_Sprite_stopDrag = {0x02, 0x00, 0x80, 0x16, "", "stopDrag", 0, &voidclass, &flash_display_Sprite, 0}; -static varinfo_t flash_display_Sprite_buttonMode = {0x01, 0x00, 0x80, 0x16, "", "buttonMode", 0, &_Boolean, &flash_display_Sprite, 0}; -static varinfo_t flash_display_Sprite_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_display_Sprite, 0}; -static varinfo_t flash_display_Sprite_hitArea = {0x01, 0x00, 0x80, 0x16, "", "hitArea", 0, &flash_display_Sprite, &flash_display_Sprite, 0}; -static varinfo_t flash_display_Sprite_useHandCursor = {0x01, 0x00, 0x80, 0x16, "", "useHandCursor", 0, &_Boolean, &flash_display_Sprite, 0}; -static varinfo_t flash_display_Sprite_graphics = {0x01, 0x00, 0x80, 0x16, "", "graphics", 0, &flash_display_Graphics, &flash_display_Sprite, 0}; -static methodinfo_t flash_display_Sprite_startDrag = {0x02, 0x00, 0x80, 0x16, "", "startDrag", 0, &voidclass, &flash_display_Sprite, 0}; -static varinfo_t flash_display_Sprite_dropTarget = {0x01, 0x00, 0x80, 0x16, "", "dropTarget", 0, &flash_display_DisplayObject, &flash_display_Sprite, 0}; -static classinfo_t flash_ui_Keyboard = {0x03, 0x00, 0x81, 0x16, "flash.ui", "Keyboard", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_ui_Keyboard_PAGE_DOWN = {0x01, 0x00, 0x82, 0x16, "", "PAGE_DOWN", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F4 = {0x01, 0x00, 0x82, 0x16, "", "F4", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_ENTER = {0x01, 0x00, 0x82, 0x16, "", "ENTER", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_CONTROL = {0x01, 0x00, 0x82, 0x16, "", "CONTROL", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F7 = {0x01, 0x00, 0x82, 0x16, "", "F7", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F14 = {0x01, 0x00, 0x82, 0x16, "", "F14", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_3 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_3", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_DECIMAL = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_DECIMAL", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_CAPS_LOCK = {0x01, 0x00, 0x82, 0x16, "", "CAPS_LOCK", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_SHIFT = {0x01, 0x00, 0x82, 0x16, "", "SHIFT", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_TAB = {0x01, 0x00, 0x82, 0x16, "", "TAB", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_0 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_0", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_END = {0x01, 0x00, 0x82, 0x16, "", "END", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_1 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_1", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F8 = {0x01, 0x00, 0x82, 0x16, "", "F8", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F9 = {0x01, 0x00, 0x82, 0x16, "", "F9", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_numLock = {0x01, 0x00, 0x82, 0x16, "", "numLock", 0, &_Boolean, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F2 = {0x01, 0x00, 0x82, 0x16, "", "F2", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_4 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_4", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F3 = {0x01, 0x00, 0x82, 0x16, "", "F3", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_2 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_2", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_HOME = {0x01, 0x00, 0x82, 0x16, "", "HOME", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_7 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_7", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_6 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_6", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F6 = {0x01, 0x00, 0x82, 0x16, "", "F6", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F5 = {0x01, 0x00, 0x82, 0x16, "", "F5", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_INSERT = {0x01, 0x00, 0x82, 0x16, "", "INSERT", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_ESCAPE = {0x01, 0x00, 0x82, 0x16, "", "ESCAPE", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F1 = {0x01, 0x00, 0x82, 0x16, "", "F1", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_SUBTRACT = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_SUBTRACT", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_8 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_8", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_SPACE = {0x01, 0x00, 0x82, 0x16, "", "SPACE", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_BACKSPACE = {0x01, 0x00, 0x82, 0x16, "", "BACKSPACE", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_DELETE = {0x01, 0x00, 0x82, 0x16, "", "DELETE", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_MULTIPLY = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_MULTIPLY", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F13 = {0x01, 0x00, 0x82, 0x16, "", "F13", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_ADD = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_ADD", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_9 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_9", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F12 = {0x01, 0x00, 0x82, 0x16, "", "F12", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F15 = {0x01, 0x00, 0x82, 0x16, "", "F15", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F11 = {0x01, 0x00, 0x82, 0x16, "", "F11", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_UP = {0x01, 0x00, 0x82, 0x16, "", "UP", 0, &_uint, &flash_ui_Keyboard, 0}; -static methodinfo_t flash_ui_Keyboard_isAccessible = {0x02, 0x00, 0x82, 0x16, "", "isAccessible", 0, &_Boolean, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_DOWN = {0x01, 0x00, 0x82, 0x16, "", "DOWN", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_capsLock = {0x01, 0x00, 0x82, 0x16, "", "capsLock", 0, &_Boolean, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_PAGE_UP = {0x01, 0x00, 0x82, 0x16, "", "PAGE_UP", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_ENTER = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_ENTER", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_F10 = {0x01, 0x00, 0x82, 0x16, "", "F10", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_5 = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_5", 0, &_uint, &flash_ui_Keyboard, 0}; -static varinfo_t flash_ui_Keyboard_NUMPAD_DIVIDE = {0x01, 0x00, 0x82, 0x16, "", "NUMPAD_DIVIDE", 0, &_uint, &flash_ui_Keyboard, 0}; -static classinfo_t flash_filters_DisplacementMapFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "DisplacementMapFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_DisplacementMapFilter_scaleY = {0x01, 0x00, 0x80, 0x16, "", "scaleY", 0, &_Number, &flash_filters_DisplacementMapFilter, 0}; -static varinfo_t flash_filters_DisplacementMapFilter_mapPoint = {0x01, 0x00, 0x80, 0x16, "", "mapPoint", 0, &flash_geom_Point, &flash_filters_DisplacementMapFilter, 0}; -static varinfo_t flash_filters_DisplacementMapFilter_scaleX = {0x01, 0x00, 0x80, 0x16, "", "scaleX", 0, &_Number, &flash_filters_DisplacementMapFilter, 0}; -static varinfo_t flash_filters_DisplacementMapFilter_mapBitmap = {0x01, 0x00, 0x80, 0x16, "", "mapBitmap", 0, &flash_display_BitmapData, &flash_filters_DisplacementMapFilter, 0}; -static varinfo_t flash_filters_DisplacementMapFilter_mode = {0x01, 0x00, 0x80, 0x16, "", "mode", 0, &_String, &flash_filters_DisplacementMapFilter, 0}; -static varinfo_t flash_filters_DisplacementMapFilter_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_filters_DisplacementMapFilter, 0}; -static varinfo_t flash_filters_DisplacementMapFilter_componentX = {0x01, 0x00, 0x80, 0x16, "", "componentX", 0, &_uint, &flash_filters_DisplacementMapFilter, 0}; -static methodinfo_t flash_filters_DisplacementMapFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_DisplacementMapFilter, 0}; -static varinfo_t flash_filters_DisplacementMapFilter_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_filters_DisplacementMapFilter, 0}; -static varinfo_t flash_filters_DisplacementMapFilter_componentY = {0x01, 0x00, 0x80, 0x16, "", "componentY", 0, &_uint, &flash_filters_DisplacementMapFilter, 0}; -static methodinfo_t flash_utils_escapeMultiByte = {0x02, 0x00, 0x82, 0x16, "flash.utils", "escapeMultiByte", 0, &_String, 0, 0}; -static methodinfo_t adobe_utils_MMEndCommand = {0x02, 0x00, 0x82, 0x16, "adobe.utils", "MMEndCommand", 0, &voidclass, 0, 0}; -static classinfo_t flash_display_GradientType = {0x03, 0x00, 0x81, 0x16, "flash.display", "GradientType", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_GradientType_LINEAR = {0x01, 0x00, 0x82, 0x16, "", "LINEAR", 0, &_String, &flash_display_GradientType, 0}; -static varinfo_t flash_display_GradientType_RADIAL = {0x01, 0x00, 0x82, 0x16, "", "RADIAL", 0, &_String, &flash_display_GradientType, 0}; -static classinfo_t flash_media_ID3Info = {0x03, 0x00, 0x89, 0x16, "flash.media", "ID3Info", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_media_ID3Info_comment = {0x01, 0x00, 0x80, 0x16, "", "comment", 0, &_String, &flash_media_ID3Info, 0}; -static varinfo_t flash_media_ID3Info_year = {0x01, 0x00, 0x80, 0x16, "", "year", 0, &_String, &flash_media_ID3Info, 0}; -static varinfo_t flash_media_ID3Info_track = {0x01, 0x00, 0x80, 0x16, "", "track", 0, &_String, &flash_media_ID3Info, 0}; -static varinfo_t flash_media_ID3Info_artist = {0x01, 0x00, 0x80, 0x16, "", "artist", 0, &_String, &flash_media_ID3Info, 0}; -static varinfo_t flash_media_ID3Info_songName = {0x01, 0x00, 0x80, 0x16, "", "songName", 0, &_String, &flash_media_ID3Info, 0}; -static varinfo_t flash_media_ID3Info_genre = {0x01, 0x00, 0x80, 0x16, "", "genre", 0, &_String, &flash_media_ID3Info, 0}; -static varinfo_t flash_media_ID3Info_album = {0x01, 0x00, 0x80, 0x16, "", "album", 0, &_String, &flash_media_ID3Info, 0}; -static classinfo_t flash_display_GraphicsSolidFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsSolidFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; -static varinfo_t flash_display_GraphicsSolidFill_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_display_GraphicsSolidFill, 0}; -static varinfo_t flash_display_GraphicsSolidFill_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_display_GraphicsSolidFill, 0}; -static classinfo_t flash_filters_ColorMatrixFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "ColorMatrixFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_ColorMatrixFilter_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &_Array, &flash_filters_ColorMatrixFilter, 0}; -static methodinfo_t flash_filters_ColorMatrixFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_ColorMatrixFilter, 0}; -static classinfo_t flash_net_NetStreamPlayTransitions = {0x03, 0x00, 0x80, 0x16, "flash.net", "NetStreamPlayTransitions", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_net_NetStreamPlayTransitions_RESET = {0x01, 0x00, 0x82, 0x16, "", "RESET", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; -static varinfo_t flash_net_NetStreamPlayTransitions_APPEND = {0x01, 0x00, 0x82, 0x16, "", "APPEND", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; -static varinfo_t flash_net_NetStreamPlayTransitions_SWAP = {0x01, 0x00, 0x82, 0x16, "", "SWAP", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; -static varinfo_t flash_net_NetStreamPlayTransitions_SWITCH = {0x01, 0x00, 0x82, 0x16, "", "SWITCH", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; -static varinfo_t flash_net_NetStreamPlayTransitions_STOP = {0x01, 0x00, 0x82, 0x16, "", "STOP", 0, 0, &flash_net_NetStreamPlayTransitions, 0}; -static classinfo_t flash_media_SoundCodec = {0x03, 0x00, 0x81, 0x16, "flash.media", "SoundCodec", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_media_SoundCodec_NELLYMOSER = {0x01, 0x00, 0x82, 0x16, "", "NELLYMOSER", 0, &_String, &flash_media_SoundCodec, 0}; -static varinfo_t flash_media_SoundCodec_SPEEX = {0x01, 0x00, 0x82, 0x16, "", "SPEEX", 0, &_String, &flash_media_SoundCodec, 0}; -static classinfo_t flash_net_ObjectEncoding = {0x03, 0x00, 0x81, 0x16, "flash.net", "ObjectEncoding", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_net_ObjectEncoding_dynamicPropertyWriter = {0x01, 0x00, 0x82, 0x16, "", "dynamicPropertyWriter", 0, &flash_net_IDynamicPropertyWriter, &flash_net_ObjectEncoding, 0}; -static varinfo_t flash_net_ObjectEncoding_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_uint, &flash_net_ObjectEncoding, 0}; -static varinfo_t flash_net_ObjectEncoding_AMF0 = {0x01, 0x00, 0x82, 0x16, "", "AMF0", 0, &_uint, &flash_net_ObjectEncoding, 0}; -static varinfo_t flash_net_ObjectEncoding_AMF3 = {0x01, 0x00, 0x82, 0x16, "", "AMF3", 0, &_uint, &flash_net_ObjectEncoding, 0}; -static classinfo_t flash_text_engine_GroupElement = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "GroupElement", 0, &flash_text_engine_ContentElement, interfaces: {0}}; -static methodinfo_t flash_text_engine_GroupElement_groupElements = {0x02, 0x00, 0x80, 0x16, "", "groupElements", 0, &flash_text_engine_GroupElement, &flash_text_engine_GroupElement, 0}; -static methodinfo_t flash_text_engine_GroupElement_splitTextElement = {0x02, 0x00, 0x80, 0x16, "", "splitTextElement", 0, &flash_text_engine_TextElement, &flash_text_engine_GroupElement, 0}; -static methodinfo_t flash_text_engine_GroupElement_mergeTextElements = {0x02, 0x00, 0x80, 0x16, "", "mergeTextElements", 0, &flash_text_engine_TextElement, &flash_text_engine_GroupElement, 0}; -static methodinfo_t flash_text_engine_GroupElement_getElementAtCharIndex = {0x02, 0x00, 0x80, 0x16, "", "getElementAtCharIndex", 0, &flash_text_engine_ContentElement, &flash_text_engine_GroupElement, 0}; -static varinfo_t flash_text_engine_GroupElement_elementCount = {0x01, 0x00, 0x80, 0x16, "", "elementCount", 0, &_int, &flash_text_engine_GroupElement, 0}; -static methodinfo_t flash_text_engine_GroupElement_setElements = {0x02, 0x00, 0x80, 0x16, "", "setElements", 0, &voidclass, &flash_text_engine_GroupElement, 0}; -static methodinfo_t flash_text_engine_GroupElement_getElementAt = {0x02, 0x00, 0x80, 0x16, "", "getElementAt", 0, &flash_text_engine_ContentElement, &flash_text_engine_GroupElement, 0}; -static methodinfo_t flash_text_engine_GroupElement_ungroupElements = {0x02, 0x00, 0x80, 0x16, "", "ungroupElements", 0, &voidclass, &flash_text_engine_GroupElement, 0}; -static methodinfo_t flash_text_engine_GroupElement_replaceElements = {0x02, 0x00, 0x80, 0x16, "", "replaceElements", 0, &__AS3___vec_Vector, &flash_text_engine_GroupElement, 0}; -static methodinfo_t flash_text_engine_GroupElement_getElementIndex = {0x02, 0x00, 0x80, 0x16, "", "getElementIndex", 0, &_int, &flash_text_engine_GroupElement, 0}; -static methodinfo_t _parseInt = {0x02, 0x00, 0x82, 0x16, "", "parseInt", 0, &_Number, 0, 0}; -static classinfo_t _QName = {0x03, 0x00, 0x81, 0x16, "", "QName", 0, &_Object, interfaces: {0}}; -static varinfo_t _QName_localName = {0x01, 0x00, 0x80, 0x16, "", "localName", 0, &_String, &_QName, 0}; -static methodinfo_t _QName_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_QName, &_QName, 0}; -static methodinfo_t _QName_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_QName, 0}; -static varinfo_t _QName_uri = {0x01, 0x00, 0x80, 0x16, "", "uri", 0, 0, &_QName, 0}; -static varinfo_t _QName_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, 0, &_QName, 0}; -static classinfo_t _UninitializedError = {0x03, 0x00, 0x88, 0x16, "", "UninitializedError", 0, &_Error, interfaces: {0}}; -static varinfo_t _UninitializedError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_UninitializedError, 0}; -static classinfo_t _Date = {0x03, 0x00, 0x89, 0x16, "", "Date", 0, &_Object, interfaces: {0}}; -static methodinfo_t _Date_getTimezoneOffset = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getTimezoneOffset", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getTime = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getTime", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setUTCMilliseconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCMilliseconds", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_month = {0x01, 0x00, 0x80, 0x16, "", "month", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_Date, 0}; -static methodinfo_t _Date_getHours = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getHours", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_date = {0x01, 0x00, 0x80, 0x16, "", "date", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_milliseconds = {0x01, 0x00, 0x80, 0x16, "", "milliseconds", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setSeconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setSeconds", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getDate = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getDate", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_hoursUTC = {0x01, 0x00, 0x80, 0x16, "", "hoursUTC", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getUTCDate = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCDate", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_timezoneOffset = {0x01, 0x00, 0x80, 0x16, "", "timezoneOffset", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setTime = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setTime", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_millisecondsUTC = {0x01, 0x00, 0x80, 0x16, "", "millisecondsUTC", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_minutes = {0x01, 0x00, 0x80, 0x16, "", "minutes", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setUTCHours = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCHours", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_minutesUTC = {0x01, 0x00, 0x80, 0x16, "", "minutesUTC", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_toLocaleTimeString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleTimeString", 0, &_String, &_Date, 0}; -static varinfo_t _Date_fullYearUTC = {0x01, 0x00, 0x80, 0x16, "", "fullYearUTC", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_time = {0x01, 0x00, 0x80, 0x16, "", "time", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_monthUTC = {0x01, 0x00, 0x80, 0x16, "", "monthUTC", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getUTCMilliseconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCMilliseconds", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_toDateString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toDateString", 0, &_String, &_Date, 0}; -static methodinfo_t _Date_getMonth = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getMonth", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setMinutes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setMinutes", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_toLocaleDateString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleDateString", 0, &_String, &_Date, 0}; -static varinfo_t _Date_fullYear = {0x01, 0x00, 0x80, 0x16, "", "fullYear", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getUTCFullYear = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCFullYear", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getSeconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getSeconds", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_dateUTC = {0x01, 0x00, 0x80, 0x16, "", "dateUTC", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getMilliseconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getMilliseconds", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setUTCMinutes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCMinutes", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_day = {0x01, 0x00, 0x80, 0x16, "", "day", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setUTCSeconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCSeconds", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setUTCDate = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCDate", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getUTCMonth = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCMonth", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_seconds = {0x01, 0x00, 0x80, 0x16, "", "seconds", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getUTCMinutes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCMinutes", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setDate = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setDate", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getFullYear = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getFullYear", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setFullYear = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setFullYear", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setHours = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setHours", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setMonth = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setMonth", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getUTCSeconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCSeconds", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getMinutes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getMinutes", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_toLocaleString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleString", 0, &_String, &_Date, 0}; -static methodinfo_t _Date_toUTCString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toUTCString", 0, &_String, &_Date, 0}; -static varinfo_t _Date_dayUTC = {0x01, 0x00, 0x80, 0x16, "", "dayUTC", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getDay = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getDay", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setUTCMonth = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCMonth", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_hours = {0x01, 0x00, 0x80, 0x16, "", "hours", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getUTCDay = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCDay", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_setUTCFullYear = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setUTCFullYear", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_secondsUTC = {0x01, 0x00, 0x80, 0x16, "", "secondsUTC", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_toTimeString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toTimeString", 0, &_String, &_Date, 0}; -static methodinfo_t _Date_setMilliseconds = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setMilliseconds", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_getUTCHours = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "getUTCHours", 0, &_Number, &_Date, 0}; -static varinfo_t _Date_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Date, 0}; -static methodinfo_t _Date_UTC = {0x02, 0x00, 0x82, 0x16, "", "UTC", 0, &_Number, &_Date, 0}; -static methodinfo_t _Date_parse = {0x02, 0x00, 0x82, 0x16, "", "parse", 0, &_Number, &_Date, 0}; -static classinfo_t flash_text_StyleSheet = {0x03, 0x00, 0x88, 0x16, "flash.text", "StyleSheet", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_text_StyleSheet_styleNames = {0x01, 0x00, 0x80, 0x16, "", "styleNames", 0, &_Array, &flash_text_StyleSheet, 0}; -static methodinfo_t flash_text_StyleSheet_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_text_StyleSheet, 0}; -static methodinfo_t flash_text_StyleSheet_transform = {0x02, 0x00, 0x80, 0x16, "", "transform", 0, &flash_text_TextFormat, &flash_text_StyleSheet, 0}; -static methodinfo_t flash_text_StyleSheet_getStyle = {0x02, 0x00, 0x80, 0x16, "", "getStyle", 0, &_Object, &flash_text_StyleSheet, 0}; -static methodinfo_t flash_text_StyleSheet_parseCSS = {0x02, 0x00, 0x80, 0x16, "", "parseCSS", 0, &voidclass, &flash_text_StyleSheet, 0}; -static methodinfo_t flash_text_StyleSheet_setStyle = {0x02, 0x00, 0x80, 0x16, "", "setStyle", 0, &voidclass, &flash_text_StyleSheet, 0}; -static classinfo_t flash_display_ActionScriptVersion = {0x03, 0x00, 0x81, 0x16, "flash.display", "ActionScriptVersion", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_ActionScriptVersion_ACTIONSCRIPT3 = {0x01, 0x00, 0x82, 0x16, "", "ACTIONSCRIPT3", 0, &_uint, &flash_display_ActionScriptVersion, 0}; -static varinfo_t flash_display_ActionScriptVersion_ACTIONSCRIPT2 = {0x01, 0x00, 0x82, 0x16, "", "ACTIONSCRIPT2", 0, &_uint, &flash_display_ActionScriptVersion, 0}; -static classinfo_t flash_text_engine_EastAsianJustifier = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "EastAsianJustifier", 0, &flash_text_engine_TextJustifier, interfaces: {0}}; -static varinfo_t flash_text_engine_EastAsianJustifier_justificationStyle = {0x01, 0x00, 0x80, 0x16, "", "justificationStyle", 0, &_String, &flash_text_engine_EastAsianJustifier, 0}; -static methodinfo_t flash_text_engine_EastAsianJustifier_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_TextJustifier, &flash_text_engine_EastAsianJustifier, 0}; -static classinfo_t _String = {0x03, 0x00, 0x81, 0x16, "", "String", 0, &_Object, interfaces: {0}}; -static methodinfo_t _String_indexOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "indexOf", 0, &_int, &_String, 0}; -static methodinfo_t _String_replace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "replace", 0, &_String, &_String, 0}; -static methodinfo_t _String_lastIndexOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "lastIndexOf", 0, &_int, &_String, 0}; -static methodinfo_t _String_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_String, &_String, 0}; -static methodinfo_t _String_concat = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "concat", 0, &_String, &_String, 0}; -static methodinfo_t _String_substr = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "substr", 0, &_String, &_String, 0}; -static methodinfo_t _String_slice = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "slice", 0, &_String, &_String, 0}; -static methodinfo_t _String_search = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "search", 0, &_int, &_String, 0}; -static methodinfo_t _String_toLocaleUpperCase = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleUpperCase", 0, &_String, &_String, 0}; -static methodinfo_t _String_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_String, 0}; -static methodinfo_t _String_toUpperCase = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toUpperCase", 0, &_String, &_String, 0}; -static methodinfo_t _String_charAt = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "charAt", 0, &_String, &_String, 0}; -static methodinfo_t _String_match = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "match", 0, &_Array, &_String, 0}; -static methodinfo_t _String_charCodeAt = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "charCodeAt", 0, &_Number, &_String, 0}; -static methodinfo_t _String_substring = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "substring", 0, &_String, &_String, 0}; -static methodinfo_t _String_localeCompare = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "localeCompare", 0, &_int, &_String, 0}; -static methodinfo_t _String_split = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "split", 0, &_Array, &_String, 0}; -static methodinfo_t _String_toLocaleLowerCase = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLocaleLowerCase", 0, &_String, &_String, 0}; -static varinfo_t _String_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_int, &_String, 0}; -static methodinfo_t _String_toLowerCase = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toLowerCase", 0, &_String, &_String, 0}; -static methodinfo_t _String_fromCharCode = {0x02, 0x00, 0x82, 0x08, "http://adobe.com/AS3/2006/builtin", "fromCharCode", 0, &_String, &_String, 0}; -static classinfo_t flash_media_SoundChannel = {0x03, 0x00, 0x81, 0x16, "flash.media", "SoundChannel", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_media_SoundChannel_leftPeak = {0x01, 0x00, 0x80, 0x16, "", "leftPeak", 0, &_Number, &flash_media_SoundChannel, 0}; -static methodinfo_t flash_media_SoundChannel_stop = {0x02, 0x00, 0x80, 0x16, "", "stop", 0, &voidclass, &flash_media_SoundChannel, 0}; -static varinfo_t flash_media_SoundChannel_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &_Number, &flash_media_SoundChannel, 0}; -static varinfo_t flash_media_SoundChannel_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_media_SoundChannel, 0}; -static varinfo_t flash_media_SoundChannel_rightPeak = {0x01, 0x00, 0x80, 0x16, "", "rightPeak", 0, &_Number, &flash_media_SoundChannel, 0}; -static classinfo_t flash_desktop_Clipboard = {0x03, 0x00, 0x80, 0x16, "flash.desktop", "Clipboard", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_desktop_Clipboard_setDataHandler = {0x02, 0x00, 0x80, 0x16, "", "setDataHandler", 0, &_Boolean, &flash_desktop_Clipboard, 0}; -static methodinfo_t flash_desktop_Clipboard_setData = {0x02, 0x00, 0x80, 0x16, "", "setData", 0, &_Boolean, &flash_desktop_Clipboard, 0}; -static varinfo_t flash_desktop_Clipboard_formats = {0x01, 0x00, 0x80, 0x16, "", "formats", 0, &_Array, &flash_desktop_Clipboard, 0}; -static methodinfo_t flash_desktop_Clipboard_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_desktop_Clipboard, 0}; -static methodinfo_t flash_desktop_Clipboard_getData = {0x02, 0x00, 0x80, 0x16, "", "getData", 0, &_Object, &flash_desktop_Clipboard, 0}; -static methodinfo_t flash_desktop_Clipboard_hasFormat = {0x02, 0x00, 0x80, 0x16, "", "hasFormat", 0, &_Boolean, &flash_desktop_Clipboard, 0}; -static methodinfo_t flash_desktop_Clipboard_clearData = {0x02, 0x00, 0x80, 0x16, "", "clearData", 0, &voidclass, &flash_desktop_Clipboard, 0}; -static varinfo_t flash_desktop_Clipboard_generalClipboard = {0x01, 0x00, 0x82, 0x16, "", "generalClipboard", 0, &flash_desktop_Clipboard, &flash_desktop_Clipboard, 0}; -static classinfo_t flash_display_IBitmapDrawable = {0x03, 0x00, 0x90, 0x16, "flash.display", "IBitmapDrawable", 0, 0, interfaces: {0}}; -static classinfo_t _TypeError = {0x03, 0x00, 0x88, 0x16, "", "TypeError", 0, &_Error, interfaces: {0}}; -static varinfo_t _TypeError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_TypeError, 0}; -static classinfo_t _int = {0x03, 0x00, 0x81, 0x16, "", "int", 0, &_Object, interfaces: {0}}; -static methodinfo_t _int_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_int, &_int, 0}; -static methodinfo_t _int_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_int, 0}; -static methodinfo_t _int_toExponential = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toExponential", 0, &_String, &_int, 0}; -static methodinfo_t _int_toFixed = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toFixed", 0, &_String, &_int, 0}; -static methodinfo_t _int_toPrecision = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toPrecision", 0, &_String, &_int, 0}; -static varinfo_t _int_MAX_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MAX_VALUE", 0, &_int, &_int, 0}; -static varinfo_t _int_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_int, 0}; -static varinfo_t _int_MIN_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MIN_VALUE", 0, &_int, &_int, 0}; -static classinfo_t flash_display_Scene = {0x03, 0x00, 0x81, 0x16, "flash.display", "Scene", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_Scene_numFrames = {0x01, 0x00, 0x80, 0x16, "", "numFrames", 0, &_int, &flash_display_Scene, 0}; -static varinfo_t flash_display_Scene_labels = {0x01, 0x00, 0x80, 0x16, "", "labels", 0, &_Array, &flash_display_Scene, 0}; -static varinfo_t flash_display_Scene_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_display_Scene, 0}; -static classinfo_t flash_text_engine_FontMetrics = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontMetrics", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_FontMetrics_superscriptOffset = {0x01, 0x00, 0x80, 0x16, "", "superscriptOffset", 0, &_Number, &flash_text_engine_FontMetrics, 0}; -static varinfo_t flash_text_engine_FontMetrics_underlineThickness = {0x01, 0x00, 0x80, 0x16, "", "underlineThickness", 0, &_Number, &flash_text_engine_FontMetrics, 0}; -static varinfo_t flash_text_engine_FontMetrics_subscriptScale = {0x01, 0x00, 0x80, 0x16, "", "subscriptScale", 0, &_Number, &flash_text_engine_FontMetrics, 0}; -static varinfo_t flash_text_engine_FontMetrics_strikethroughOffset = {0x01, 0x00, 0x80, 0x16, "", "strikethroughOffset", 0, &_Number, &flash_text_engine_FontMetrics, 0}; -static varinfo_t flash_text_engine_FontMetrics_emBox = {0x01, 0x00, 0x80, 0x16, "", "emBox", 0, &flash_geom_Rectangle, &flash_text_engine_FontMetrics, 0}; -static varinfo_t flash_text_engine_FontMetrics_strikethroughThickness = {0x01, 0x00, 0x80, 0x16, "", "strikethroughThickness", 0, &_Number, &flash_text_engine_FontMetrics, 0}; -static varinfo_t flash_text_engine_FontMetrics_superscriptScale = {0x01, 0x00, 0x80, 0x16, "", "superscriptScale", 0, &_Number, &flash_text_engine_FontMetrics, 0}; -static varinfo_t flash_text_engine_FontMetrics_subscriptOffset = {0x01, 0x00, 0x80, 0x16, "", "subscriptOffset", 0, &_Number, &flash_text_engine_FontMetrics, 0}; -static varinfo_t flash_text_engine_FontMetrics_underlineOffset = {0x01, 0x00, 0x80, 0x16, "", "underlineOffset", 0, &_Number, &flash_text_engine_FontMetrics, 0}; -static classinfo_t flash_utils_IExternalizable = {0x03, 0x00, 0x90, 0x16, "flash.utils", "IExternalizable", 0, 0, interfaces: {0}}; -static methodinfo_t flash_utils_IExternalizable_readExternal = {0x02, 0x00, 0x80, 0x08, "flash.utils:IExternalizable", "readExternal", 0, &voidclass, &flash_utils_IExternalizable, 0}; -static methodinfo_t flash_utils_IExternalizable_writeExternal = {0x02, 0x00, 0x80, 0x08, "flash.utils:IExternalizable", "writeExternal", 0, &voidclass, &flash_utils_IExternalizable, 0}; -static classinfo_t __AS3___vec_Vector = {0x03, 0x00, 0x89, 0x16, "__AS3__.vec", "Vector", 0, &_Object, interfaces: {0}}; -static classinfo_t flash_filters_GradientBevelFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "GradientBevelFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_GradientBevelFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_angle = {0x01, 0x00, 0x80, 0x16, "", "angle", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_alphas = {0x01, 0x00, 0x80, 0x16, "", "alphas", 0, &_Array, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_ratios = {0x01, 0x00, 0x80, 0x16, "", "ratios", 0, &_Array, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_colors = {0x01, 0x00, 0x80, 0x16, "", "colors", 0, &_Array, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; -static varinfo_t flash_filters_GradientBevelFilter_distance = {0x01, 0x00, 0x80, 0x16, "", "distance", 0, &_Number, &flash_filters_GradientBevelFilter, 0}; -static methodinfo_t flash_filters_GradientBevelFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_GradientBevelFilter, 0}; -static classinfo_t flash_text_TextRun = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextRun", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextRun_beginIndex = {0x01, 0x00, 0x80, 0x16, "", "beginIndex", 0, &_int, &flash_text_TextRun, 0}; -static varinfo_t flash_text_TextRun_endIndex = {0x01, 0x00, 0x80, 0x16, "", "endIndex", 0, &_int, &flash_text_TextRun, 0}; -static varinfo_t flash_text_TextRun_textFormat = {0x01, 0x00, 0x80, 0x16, "", "textFormat", 0, &flash_text_TextFormat, &flash_text_TextRun, 0}; -static classinfo_t flash_text_TextColorType = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextColorType", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextColorType_DARK_COLOR = {0x01, 0x00, 0x82, 0x16, "", "DARK_COLOR", 0, &_String, &flash_text_TextColorType, 0}; -static varinfo_t flash_text_TextColorType_LIGHT_COLOR = {0x01, 0x00, 0x82, 0x16, "", "LIGHT_COLOR", 0, &_String, &flash_text_TextColorType, 0}; -static methodinfo_t flash_sampler_getSampleCount = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getSampleCount", 0, &_Number, 0, 0}; -static classinfo_t flash_net_URLRequestHeader = {0x03, 0x00, 0x81, 0x16, "flash.net", "URLRequestHeader", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_net_URLRequestHeader_value = {0x01, 0x00, 0x80, 0x16, "", "value", 0, &_String, &flash_net_URLRequestHeader, 0}; -static varinfo_t flash_net_URLRequestHeader_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_net_URLRequestHeader, 0}; -static methodinfo_t flash_profiler_showRedrawRegions = {0x02, 0x00, 0x82, 0x16, "flash.profiler", "showRedrawRegions", 0, &voidclass, 0, 0}; -static classinfo_t flash_display_ShaderData = {0x03, 0x00, 0x89, 0x16, "flash.display", "ShaderData", 0, &_Object, interfaces: {0}}; -static classinfo_t flash_text_engine_TextLine = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextLine", 0, &flash_display_DisplayObjectContainer, interfaces: {0}}; -static varinfo_t flash_text_engine_TextLine_previousLine = {0x01, 0x00, 0x80, 0x16, "", "previousLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_validity = {0x01, 0x00, 0x80, 0x16, "", "validity", 0, &_String, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockBeginIndex = {0x02, 0x00, 0x80, 0x16, "", "getAtomTextBlockBeginIndex", 0, &_int, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomWordBoundaryOnLeft = {0x02, 0x00, 0x80, 0x16, "", "getAtomWordBoundaryOnLeft", 0, &_Boolean, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomTextRotation = {0x02, 0x00, 0x80, 0x16, "", "getAtomTextRotation", 0, &_String, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_textHeight = {0x01, 0x00, 0x80, 0x16, "", "textHeight", 0, &_Number, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomCenter = {0x02, 0x00, 0x80, 0x16, "", "getAtomCenter", 0, &_Number, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomBounds = {0x02, 0x00, 0x80, 0x16, "", "getAtomBounds", 0, &flash_geom_Rectangle, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_mirrorRegions = {0x01, 0x00, 0x80, 0x16, "", "mirrorRegions", 0, &__AS3___vec_Vector, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_rawTextLength = {0x01, 0x00, 0x80, 0x16, "", "rawTextLength", 0, &_int, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_userData = {0x01, 0x00, 0x80, 0x16, "", "userData", 0, 0, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_textWidth = {0x01, 0x00, 0x80, 0x16, "", "textWidth", 0, &_Number, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_textBlock = {0x01, 0x00, 0x80, 0x16, "", "textBlock", 0, &flash_text_engine_TextBlock, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_textBlockBeginIndex = {0x01, 0x00, 0x80, 0x16, "", "textBlockBeginIndex", 0, &_int, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_unjustifiedTextWidth = {0x01, 0x00, 0x80, 0x16, "", "unjustifiedTextWidth", 0, &_Number, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_ascent = {0x01, 0x00, 0x80, 0x16, "", "ascent", 0, &_Number, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getBaselinePosition = {0x02, 0x00, 0x80, 0x16, "", "getBaselinePosition", 0, &_Number, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_specifiedWidth = {0x01, 0x00, 0x80, 0x16, "", "specifiedWidth", 0, &_Number, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getMirrorRegion = {0x02, 0x00, 0x80, 0x16, "", "getMirrorRegion", 0, &flash_text_engine_TextLineMirrorRegion, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomGraphic = {0x02, 0x00, 0x80, 0x16, "", "getAtomGraphic", 0, &flash_display_DisplayObject, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_hasGraphicElement = {0x01, 0x00, 0x80, 0x16, "", "hasGraphicElement", 0, &_Boolean, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_flushAtomData = {0x02, 0x00, 0x80, 0x16, "", "flushAtomData", 0, &voidclass, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_dump = {0x02, 0x00, 0x80, 0x16, "", "dump", 0, &_String, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_nextLine = {0x01, 0x00, 0x80, 0x16, "", "nextLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtCharIndex = {0x02, 0x00, 0x80, 0x16, "", "getAtomIndexAtCharIndex", 0, &_int, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomTextBlockEndIndex = {0x02, 0x00, 0x80, 0x16, "", "getAtomTextBlockEndIndex", 0, &_int, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_atomCount = {0x01, 0x00, 0x80, 0x16, "", "atomCount", 0, &_int, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_descent = {0x01, 0x00, 0x80, 0x16, "", "descent", 0, &_Number, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomBidiLevel = {0x02, 0x00, 0x80, 0x16, "", "getAtomBidiLevel", 0, &_int, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_text_engine_TextLine_getAtomIndexAtPoint = {0x02, 0x00, 0x80, 0x16, "", "getAtomIndexAtPoint", 0, &_int, &flash_text_engine_TextLine, 0}; -static varinfo_t flash_text_engine_TextLine_MAX_LINE_WIDTH = {0x01, 0x00, 0x82, 0x16, "", "MAX_LINE_WIDTH", 0, &_int, &flash_text_engine_TextLine, 0}; -static methodinfo_t flash_sampler_getSamples = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getSamples", 0, &_Object, 0, 0}; -static classinfo_t flash_net_URLRequest = {0x03, 0x00, 0x81, 0x16, "flash.net", "URLRequest", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_net_URLRequest_contentType = {0x01, 0x00, 0x80, 0x16, "", "contentType", 0, &_String, &flash_net_URLRequest, 0}; -static varinfo_t flash_net_URLRequest_url = {0x01, 0x00, 0x80, 0x16, "", "url", 0, &_String, &flash_net_URLRequest, 0}; -static varinfo_t flash_net_URLRequest_requestHeaders = {0x01, 0x00, 0x80, 0x16, "", "requestHeaders", 0, &_Array, &flash_net_URLRequest, 0}; -static varinfo_t flash_net_URLRequest_method = {0x01, 0x00, 0x80, 0x16, "", "method", 0, &_String, &flash_net_URLRequest, 0}; -static varinfo_t flash_net_URLRequest_digest = {0x01, 0x00, 0x80, 0x16, "", "digest", 0, &_String, &flash_net_URLRequest, 0}; -static varinfo_t flash_net_URLRequest_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &_Object, &flash_net_URLRequest, 0}; -static classinfo_t _URIError = {0x03, 0x00, 0x88, 0x16, "", "URIError", 0, &_Error, interfaces: {0}}; -static varinfo_t _URIError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_URIError, 0}; -static methodinfo_t flash_net_getClassByAlias = {0x02, 0x00, 0x82, 0x16, "flash.net", "getClassByAlias", 0, &_Class, 0, 0}; -static classinfo_t flash_display_ShaderParameter = {0x03, 0x00, 0x89, 0x16, "flash.display", "ShaderParameter", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_ShaderParameter_value = {0x01, 0x00, 0x80, 0x16, "", "value", 0, &_Array, &flash_display_ShaderParameter, 0}; -static varinfo_t flash_display_ShaderParameter_index = {0x01, 0x00, 0x80, 0x16, "", "index", 0, &_int, &flash_display_ShaderParameter, 0}; -static varinfo_t flash_display_ShaderParameter_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_display_ShaderParameter, 0}; -static classinfo_t flash_filters_BitmapFilterType = {0x03, 0x00, 0x81, 0x16, "flash.filters", "BitmapFilterType", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_filters_BitmapFilterType_FULL = {0x01, 0x00, 0x82, 0x16, "", "FULL", 0, &_String, &flash_filters_BitmapFilterType, 0}; -static varinfo_t flash_filters_BitmapFilterType_INNER = {0x01, 0x00, 0x82, 0x16, "", "INNER", 0, &_String, &flash_filters_BitmapFilterType, 0}; -static varinfo_t flash_filters_BitmapFilterType_OUTER = {0x01, 0x00, 0x82, 0x16, "", "OUTER", 0, &_String, &flash_filters_BitmapFilterType, 0}; -static classinfo_t _SecurityError = {0x03, 0x00, 0x88, 0x16, "", "SecurityError", 0, &_Error, interfaces: {0}}; -static varinfo_t _SecurityError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_SecurityError, 0}; -static classinfo_t flash_utils_IDataInput = {0x03, 0x00, 0x90, 0x16, "flash.utils", "IDataInput", 0, 0, interfaces: {0}}; -static methodinfo_t flash_utils_IDataInput_readUTF = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUTF", 0, &_String, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readByte", 0, &_int, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readUTFBytes = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUTFBytes", 0, &_String, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readShort = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readShort", 0, &_int, &flash_utils_IDataInput, 0}; -static varinfo_t flash_utils_IDataInput_objectEncoding = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "objectEncoding", 0, &_uint, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readUnsignedInt = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUnsignedInt", 0, &_uint, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readDouble = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readDouble", 0, &_Number, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readBytes = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readBytes", 0, &voidclass, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readUnsignedByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUnsignedByte", 0, &_uint, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readMultiByte = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readMultiByte", 0, &_String, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readInt = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readInt", 0, &_int, &flash_utils_IDataInput, 0}; -static varinfo_t flash_utils_IDataInput_bytesAvailable = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "bytesAvailable", 0, &_uint, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readUnsignedShort = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readUnsignedShort", 0, &_uint, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readObject = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readObject", 0, 0, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readFloat = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readFloat", 0, &_Number, &flash_utils_IDataInput, 0}; -static varinfo_t flash_utils_IDataInput_endian = {0x01, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "endian", 0, &_String, &flash_utils_IDataInput, 0}; -static methodinfo_t flash_utils_IDataInput_readBoolean = {0x02, 0x00, 0x80, 0x08, "flash.utils:IDataInput", "readBoolean", 0, &_Boolean, &flash_utils_IDataInput, 0}; -static classinfo_t flash_events_IEventDispatcher = {0x03, 0x00, 0x90, 0x16, "flash.events", "IEventDispatcher", 0, 0, interfaces: {0}}; -static methodinfo_t flash_events_IEventDispatcher_willTrigger = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "willTrigger", 0, &_Boolean, &flash_events_IEventDispatcher, 0}; -static methodinfo_t flash_events_IEventDispatcher_removeEventListener = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "removeEventListener", 0, &voidclass, &flash_events_IEventDispatcher, 0}; -static methodinfo_t flash_events_IEventDispatcher_hasEventListener = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "hasEventListener", 0, &_Boolean, &flash_events_IEventDispatcher, 0}; -static methodinfo_t flash_events_IEventDispatcher_addEventListener = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "addEventListener", 0, &voidclass, &flash_events_IEventDispatcher, 0}; -static methodinfo_t flash_events_IEventDispatcher_dispatchEvent = {0x02, 0x00, 0x80, 0x08, "flash.events:IEventDispatcher", "dispatchEvent", 0, &_Boolean, &flash_events_IEventDispatcher, 0}; -static classinfo_t _Class = {0x03, 0x00, 0x88, 0x16, "", "Class", 0, &_Object, interfaces: {0}}; -static varinfo_t _Class_prototype = {0x01, 0x00, 0x80, 0x16, "", "prototype", 0, 0, &_Class, 0}; -static varinfo_t _Class_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Class, 0}; -static classinfo_t flash_geom_Rectangle = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Rectangle", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_geom_Rectangle_top = {0x01, 0x00, 0x80, 0x16, "", "top", 0, &_Number, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_intersection = {0x02, 0x00, 0x80, 0x16, "", "intersection", 0, &flash_geom_Rectangle, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_intersects = {0x02, 0x00, 0x80, 0x16, "", "intersects", 0, &_Boolean, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_containsPoint = {0x02, 0x00, 0x80, 0x16, "", "containsPoint", 0, &_Boolean, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_setEmpty = {0x02, 0x00, 0x80, 0x16, "", "setEmpty", 0, &voidclass, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_topLeft = {0x01, 0x00, 0x80, 0x16, "", "topLeft", 0, &flash_geom_Point, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_containsRect = {0x02, 0x00, 0x80, 0x16, "", "containsRect", 0, &_Boolean, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_isEmpty = {0x02, 0x00, 0x80, 0x16, "", "isEmpty", 0, &_Boolean, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_equals = {0x02, 0x00, 0x80, 0x16, "", "equals", 0, &_Boolean, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_left = {0x01, 0x00, 0x80, 0x16, "", "left", 0, &_Number, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_inflate = {0x02, 0x00, 0x80, 0x16, "", "inflate", 0, &voidclass, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_inflatePoint = {0x02, 0x00, 0x80, 0x16, "", "inflatePoint", 0, &voidclass, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_offsetPoint = {0x02, 0x00, 0x80, 0x16, "", "offsetPoint", 0, &voidclass, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &flash_geom_Point, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_bottomRight = {0x01, 0x00, 0x80, 0x16, "", "bottomRight", 0, &flash_geom_Point, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_right = {0x01, 0x00, 0x80, 0x16, "", "right", 0, &_Number, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_contains = {0x02, 0x00, 0x80, 0x16, "", "contains", 0, &_Boolean, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_union = {0x02, 0x00, 0x80, 0x16, "", "union", 0, &flash_geom_Rectangle, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_bottom = {0x01, 0x00, 0x80, 0x16, "", "bottom", 0, &_Number, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Rectangle, &flash_geom_Rectangle, 0}; -static varinfo_t flash_geom_Rectangle_y = {0x01, 0x00, 0x80, 0x16, "", "y", 0, &_Number, &flash_geom_Rectangle, 0}; -static methodinfo_t flash_geom_Rectangle_offset = {0x02, 0x00, 0x80, 0x16, "", "offset", 0, &voidclass, &flash_geom_Rectangle, 0}; -static classinfo_t flash_events_SecurityErrorEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "SecurityErrorEvent", 0, &flash_events_ErrorEvent, interfaces: {0}}; -static methodinfo_t flash_events_SecurityErrorEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_SecurityErrorEvent, 0}; -static methodinfo_t flash_events_SecurityErrorEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_SecurityErrorEvent, 0}; -static varinfo_t flash_events_SecurityErrorEvent_SECURITY_ERROR = {0x01, 0x00, 0x82, 0x16, "", "SECURITY_ERROR", 0, &_String, &flash_events_SecurityErrorEvent, 0}; -static classinfo_t flash_net_IDynamicPropertyWriter = {0x03, 0x00, 0x90, 0x16, "flash.net", "IDynamicPropertyWriter", 0, 0, interfaces: {0}}; -static methodinfo_t flash_net_IDynamicPropertyWriter_writeDynamicProperties = {0x02, 0x00, 0x80, 0x08, "flash.net:IDynamicPropertyWriter", "writeDynamicProperties", 0, &voidclass, &flash_net_IDynamicPropertyWriter, 0}; -static classinfo_t flash_display_InterpolationMethod = {0x03, 0x00, 0x81, 0x16, "flash.display", "InterpolationMethod", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_InterpolationMethod_RGB = {0x01, 0x00, 0x82, 0x16, "", "RGB", 0, &_String, &flash_display_InterpolationMethod, 0}; -static varinfo_t flash_display_InterpolationMethod_LINEAR_RGB = {0x01, 0x00, 0x82, 0x16, "", "LINEAR_RGB", 0, &_String, &flash_display_InterpolationMethod, 0}; -static classinfo_t _Object = {0x03, 0x00, 0x88, 0x16, "", "Object", 0, 0, interfaces: {0}}; -static methodinfo_t _Object_propertyIsEnumerable = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "propertyIsEnumerable", 0, &_Boolean, &_Object, 0}; -static methodinfo_t _Object_isPrototypeOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "isPrototypeOf", 0, &_Boolean, &_Object, 0}; -static methodinfo_t _Object_hasOwnProperty = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasOwnProperty", 0, &_Boolean, &_Object, 0}; -static methodinfo_t _Object_init = {0x02, 0x00, 0x82, 0x17, "", "init", 0, 0, &_Object, 0}; -static varinfo_t _Object_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Object, 0}; -static methodinfo_t _Object__setPropertyIsEnumerable = {0x02, 0x00, 0x82, 0x1a, "", "_setPropertyIsEnumerable", 0, &voidclass, &_Object, 0}; -static methodinfo_t _Object__dontEnumPrototype = {0x02, 0x00, 0x82, 0x1a, "", "_dontEnumPrototype", 0, &voidclass, &_Object, 0}; -static classinfo_t flash_errors_EOFError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "EOFError", 0, &flash_errors_IOError, interfaces: {0}}; -static classinfo_t flash_net_NetStream = {0x03, 0x00, 0x80, 0x16, "flash.net", "NetStream", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_net_NetStream_videoCodec = {0x01, 0x00, 0x80, 0x16, "", "videoCodec", 0, &_uint, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_info = {0x01, 0x00, 0x80, 0x16, "", "info", 0, &flash_net_NetStreamInfo, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_attachCamera = {0x02, 0x00, 0x80, 0x16, "", "attachCamera", 0, &voidclass, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_farNonce = {0x01, 0x00, 0x80, 0x16, "", "farNonce", 0, &_String, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_pause = {0x02, 0x00, 0x80, 0x16, "", "pause", 0, &voidclass, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_onPeerConnect = {0x02, 0x00, 0x80, 0x16, "", "onPeerConnect", 0, &_Boolean, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_client = {0x01, 0x00, 0x80, 0x16, "", "client", 0, &_Object, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_resume = {0x02, 0x00, 0x80, 0x16, "", "resume", 0, &voidclass, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_liveDelay = {0x01, 0x00, 0x80, 0x16, "", "liveDelay", 0, &_Number, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_peerStreams = {0x01, 0x00, 0x80, 0x16, "", "peerStreams", 0, &_Array, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_receiveVideo = {0x02, 0x00, 0x80, 0x16, "", "receiveVideo", 0, &voidclass, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_maxPauseBufferTime = {0x01, 0x00, 0x80, 0x16, "", "maxPauseBufferTime", 0, &_Number, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_play2 = {0x02, 0x00, 0x80, 0x16, "", "play2", 0, &voidclass, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_audioCodec = {0x01, 0x00, 0x80, 0x16, "", "audioCodec", 0, &_uint, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_receiveVideoFPS = {0x02, 0x00, 0x80, 0x16, "", "receiveVideoFPS", 0, &voidclass, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_uint, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_farID = {0x01, 0x00, 0x80, 0x16, "", "farID", 0, &_String, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_receiveAudio = {0x02, 0x00, 0x80, 0x16, "", "receiveAudio", 0, &voidclass, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_bufferLength = {0x01, 0x00, 0x80, 0x16, "", "bufferLength", 0, &_Number, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_seek = {0x02, 0x00, 0x80, 0x16, "", "seek", 0, &voidclass, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_attachAudio = {0x02, 0x00, 0x80, 0x16, "", "attachAudio", 0, &voidclass, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_bufferTime = {0x01, 0x00, 0x80, 0x16, "", "bufferTime", 0, &_Number, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_play = {0x02, 0x00, 0x80, 0x16, "", "play", 0, &voidclass, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_publish = {0x02, 0x00, 0x80, 0x16, "", "publish", 0, &voidclass, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_togglePause = {0x02, 0x00, 0x80, 0x16, "", "togglePause", 0, &voidclass, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_checkPolicyFile = {0x01, 0x00, 0x80, 0x16, "", "checkPolicyFile", 0, &_Boolean, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_nearNonce = {0x01, 0x00, 0x80, 0x16, "", "nearNonce", 0, &_String, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_decodedFrames = {0x01, 0x00, 0x80, 0x16, "", "decodedFrames", 0, &_uint, &flash_net_NetStream, 0}; -static methodinfo_t flash_net_NetStream_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_currentFPS = {0x01, 0x00, 0x80, 0x16, "", "currentFPS", 0, &_Number, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_time = {0x01, 0x00, 0x80, 0x16, "", "time", 0, &_Number, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_CONNECT_TO_FMS = {0x01, 0x00, 0x82, 0x16, "", "CONNECT_TO_FMS", 0, &_String, &flash_net_NetStream, 0}; -static varinfo_t flash_net_NetStream_DIRECT_CONNECTIONS = {0x01, 0x00, 0x82, 0x16, "", "DIRECT_CONNECTIONS", 0, &_String, &flash_net_NetStream, 0}; -static classinfo_t _ArgumentError = {0x03, 0x00, 0x88, 0x16, "", "ArgumentError", 0, &_Error, interfaces: {0}}; -static varinfo_t _ArgumentError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_ArgumentError, 0}; -static classinfo_t _XMLList = {0x03, 0x00, 0x89, 0x16, "", "XMLList", 0, &_Object, interfaces: {0}}; -static methodinfo_t _XMLList_normalize = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "normalize", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_removeNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "removeNamespace", 0, &_XML, &_XMLList, 0}; -static methodinfo_t _XMLList_prependChild = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "prependChild", 0, &_XML, &_XMLList, 0}; -static methodinfo_t _XMLList_toXMLString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toXMLString", 0, &_String, &_XMLList, 0}; -static methodinfo_t _XMLList_nodeKind = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "nodeKind", 0, &_String, &_XMLList, 0}; -static methodinfo_t _XMLList_copy = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "copy", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_text = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "text", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_XMLList, 0}; -static methodinfo_t _XMLList_childIndex = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "childIndex", 0, &_int, &_XMLList, 0}; -static methodinfo_t _XMLList_setName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setName", 0, &voidclass, &_XMLList, 0}; -static methodinfo_t _XMLList_setLocalName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setLocalName", 0, &voidclass, &_XMLList, 0}; -static methodinfo_t _XMLList_namespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "namespace", 0, 0, &_XMLList, 0}; -static methodinfo_t _XMLList_insertChildBefore = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "insertChildBefore", 0, 0, &_XMLList, 0}; -static methodinfo_t _XMLList_addNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "addNamespace", 0, &_XML, &_XMLList, 0}; -static methodinfo_t _XMLList_propertyIsEnumerable = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "propertyIsEnumerable", 0, &_Boolean, &_XMLList, 0}; -static methodinfo_t _XMLList_comments = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "comments", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_attributes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "attributes", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_descendants = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "descendants", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_replace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "replace", 0, &_XML, &_XMLList, 0}; -static methodinfo_t _XMLList_children = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "children", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_contains = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "contains", 0, &_Boolean, &_XMLList, 0}; -static methodinfo_t _XMLList_hasSimpleContent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasSimpleContent", 0, &_Boolean, &_XMLList, 0}; -static methodinfo_t _XMLList_elements = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "elements", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_hasComplexContent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasComplexContent", 0, &_Boolean, &_XMLList, 0}; -static methodinfo_t _XMLList_insertChildAfter = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "insertChildAfter", 0, 0, &_XMLList, 0}; -static methodinfo_t _XMLList_parent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "parent", 0, 0, &_XMLList, 0}; -static methodinfo_t _XMLList_length = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "length", 0, &_int, &_XMLList, 0}; -static methodinfo_t _XMLList_processingInstructions = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "processingInstructions", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_child = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "child", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_appendChild = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "appendChild", 0, &_XML, &_XMLList, 0}; -static methodinfo_t _XMLList_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_XMLList, &_XMLList, 0}; -static methodinfo_t _XMLList_localName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "localName", 0, &_Object, &_XMLList, 0}; -static methodinfo_t _XMLList_inScopeNamespaces = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "inScopeNamespaces", 0, &_Array, &_XMLList, 0}; -static methodinfo_t _XMLList_hasOwnProperty = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasOwnProperty", 0, &_Boolean, &_XMLList, 0}; -static methodinfo_t _XMLList_setNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setNamespace", 0, &voidclass, &_XMLList, 0}; -static methodinfo_t _XMLList_namespaceDeclarations = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "namespaceDeclarations", 0, &_Array, &_XMLList, 0}; -static methodinfo_t _XMLList_name = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "name", 0, &_Object, &_XMLList, 0}; -static methodinfo_t _XMLList_setChildren = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setChildren", 0, &_XML, &_XMLList, 0}; -static methodinfo_t _XMLList_attribute = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "attribute", 0, &_XMLList, &_XMLList, 0}; -static classinfo_t flash_geom_Point = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Point", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_geom_Point_equals = {0x02, 0x00, 0x80, 0x16, "", "equals", 0, &_Boolean, &flash_geom_Point, 0}; -static methodinfo_t flash_geom_Point_normalize = {0x02, 0x00, 0x80, 0x16, "", "normalize", 0, &voidclass, &flash_geom_Point, 0}; -static varinfo_t flash_geom_Point_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_geom_Point, 0}; -static methodinfo_t flash_geom_Point_offset = {0x02, 0x00, 0x80, 0x16, "", "offset", 0, &voidclass, &flash_geom_Point, 0}; -static methodinfo_t flash_geom_Point_subtract = {0x02, 0x00, 0x80, 0x16, "", "subtract", 0, &flash_geom_Point, &flash_geom_Point, 0}; -static varinfo_t flash_geom_Point_y = {0x01, 0x00, 0x80, 0x16, "", "y", 0, &_Number, &flash_geom_Point, 0}; -static varinfo_t flash_geom_Point_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_Number, &flash_geom_Point, 0}; -static methodinfo_t flash_geom_Point_add = {0x02, 0x00, 0x80, 0x16, "", "add", 0, &flash_geom_Point, &flash_geom_Point, 0}; -static methodinfo_t flash_geom_Point_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_Point, 0}; -static methodinfo_t flash_geom_Point_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Point, &flash_geom_Point, 0}; -static methodinfo_t flash_geom_Point_polar = {0x02, 0x00, 0x82, 0x16, "", "polar", 0, &flash_geom_Point, &flash_geom_Point, 0}; -static methodinfo_t flash_geom_Point_distance = {0x02, 0x00, 0x82, 0x16, "", "distance", 0, &_Number, &flash_geom_Point, 0}; -static methodinfo_t flash_geom_Point_interpolate = {0x02, 0x00, 0x82, 0x16, "", "interpolate", 0, &flash_geom_Point, &flash_geom_Point, 0}; -static classinfo_t flash_printing_PrintJobOptions = {0x03, 0x00, 0x80, 0x16, "flash.printing", "PrintJobOptions", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_printing_PrintJobOptions_printAsBitmap = {0x01, 0x00, 0x80, 0x16, "", "printAsBitmap", 0, &_Boolean, &flash_printing_PrintJobOptions, 0}; -static classinfo_t flash_display_DisplayObject = {0x03, 0x00, 0x80, 0x16, "flash.display", "DisplayObject", 0, &flash_events_EventDispatcher, interfaces: {&flash_display_IBitmapDrawable, 0}}; -static varinfo_t flash_display_DisplayObject_rotation = {0x01, 0x00, 0x80, 0x16, "", "rotation", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_filters = {0x01, 0x00, 0x80, 0x16, "", "filters", 0, &_Array, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_rotationZ = {0x01, 0x00, 0x80, 0x16, "", "rotationZ", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_accessibilityProperties = {0x01, 0x00, 0x80, 0x16, "", "accessibilityProperties", 0, &flash_accessibility_AccessibilityProperties, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_mouseX = {0x01, 0x00, 0x80, 0x16, "", "mouseX", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_root = {0x01, 0x00, 0x80, 0x16, "", "root", 0, &flash_display_DisplayObject, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_stage = {0x01, 0x00, 0x80, 0x16, "", "stage", 0, &flash_display_Stage, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_rotationY = {0x01, 0x00, 0x80, 0x16, "", "rotationY", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_scaleZ = {0x01, 0x00, 0x80, 0x16, "", "scaleZ", 0, &_Number, &flash_display_DisplayObject, 0}; -static methodinfo_t flash_display_DisplayObject_local3DToGlobal = {0x02, 0x00, 0x80, 0x16, "", "local3DToGlobal", 0, &flash_geom_Point, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_loaderInfo = {0x01, 0x00, 0x80, 0x16, "", "loaderInfo", 0, &flash_display_LoaderInfo, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_cacheAsBitmap = {0x01, 0x00, 0x80, 0x16, "", "cacheAsBitmap", 0, &_Boolean, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_transform = {0x01, 0x00, 0x80, 0x16, "", "transform", 0, &flash_geom_Transform, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_scaleY = {0x01, 0x00, 0x80, 0x16, "", "scaleY", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_rotationX = {0x01, 0x00, 0x80, 0x16, "", "rotationX", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_scrollRect = {0x01, 0x00, 0x80, 0x16, "", "scrollRect", 0, &flash_geom_Rectangle, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_scale9Grid = {0x01, 0x00, 0x80, 0x16, "", "scale9Grid", 0, &flash_geom_Rectangle, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_parent = {0x01, 0x00, 0x80, 0x16, "", "parent", 0, &flash_display_DisplayObjectContainer, &flash_display_DisplayObject, 0}; -static methodinfo_t flash_display_DisplayObject_hitTestObject = {0x02, 0x00, 0x80, 0x16, "", "hitTestObject", 0, &_Boolean, &flash_display_DisplayObject, 0}; -static methodinfo_t flash_display_DisplayObject_hitTestPoint = {0x02, 0x00, 0x80, 0x16, "", "hitTestPoint", 0, &_Boolean, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_display_DisplayObject, 0}; -static methodinfo_t flash_display_DisplayObject_getRect = {0x02, 0x00, 0x80, 0x16, "", "getRect", 0, &flash_geom_Rectangle, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_opaqueBackground = {0x01, 0x00, 0x80, 0x16, "", "opaqueBackground", 0, &_Object, &flash_display_DisplayObject, 0}; -static methodinfo_t flash_display_DisplayObject_globalToLocal3D = {0x02, 0x00, 0x80, 0x16, "", "globalToLocal3D", 0, &flash_geom_Vector3D, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_visible = {0x01, 0x00, 0x80, 0x16, "", "visible", 0, &_Boolean, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_blendMode = {0x01, 0x00, 0x80, 0x16, "", "blendMode", 0, &_String, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_scaleX = {0x01, 0x00, 0x80, 0x16, "", "scaleX", 0, &_Number, &flash_display_DisplayObject, 0}; -static methodinfo_t flash_display_DisplayObject_globalToLocal = {0x02, 0x00, 0x80, 0x16, "", "globalToLocal", 0, &flash_geom_Point, &flash_display_DisplayObject, 0}; -static methodinfo_t flash_display_DisplayObject_localToGlobal = {0x02, 0x00, 0x80, 0x16, "", "localToGlobal", 0, &flash_geom_Point, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_z = {0x01, 0x00, 0x80, 0x16, "", "z", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_display_DisplayObject, 0}; -static methodinfo_t flash_display_DisplayObject_getBounds = {0x02, 0x00, 0x80, 0x16, "", "getBounds", 0, &flash_geom_Rectangle, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_mask = {0x01, 0x00, 0x80, 0x16, "", "mask", 0, &flash_display_DisplayObject, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_mouseY = {0x01, 0x00, 0x80, 0x16, "", "mouseY", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_display_DisplayObject, 0}; -static varinfo_t flash_display_DisplayObject_y = {0x01, 0x00, 0x80, 0x16, "", "y", 0, &_Number, &flash_display_DisplayObject, 0}; -static classinfo_t flash_sampler_DeleteObjectSample = {0x03, 0x00, 0x81, 0x16, "flash.sampler", "DeleteObjectSample", 0, &flash_sampler_Sample, interfaces: {0}}; -static varinfo_t flash_sampler_DeleteObjectSample_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &_Number, &flash_sampler_DeleteObjectSample, 0}; -static varinfo_t flash_sampler_DeleteObjectSample_id = {0x01, 0x00, 0x80, 0x16, "", "id", 0, &_Number, &flash_sampler_DeleteObjectSample, 0}; -static methodinfo_t flash_system_fscommand = {0x02, 0x00, 0x82, 0x16, "flash.system", "fscommand", 0, &voidclass, 0, 0}; -static methodinfo_t flash_utils_unescapeMultiByte = {0x02, 0x00, 0x82, 0x16, "flash.utils", "unescapeMultiByte", 0, &_String, 0, 0}; -static classinfo_t flash_sampler_StackFrame = {0x03, 0x00, 0x81, 0x16, "flash.sampler", "StackFrame", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_sampler_StackFrame_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_sampler_StackFrame, 0}; -static varinfo_t flash_sampler_StackFrame_line = {0x01, 0x00, 0x80, 0x16, "", "line", 0, &_uint, &flash_sampler_StackFrame, 0}; -static methodinfo_t flash_sampler_StackFrame_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_sampler_StackFrame, 0}; -static varinfo_t flash_sampler_StackFrame_file = {0x01, 0x00, 0x80, 0x16, "", "file", 0, &_String, &flash_sampler_StackFrame, 0}; -static classinfo_t flash_system_JPEGLoaderContext = {0x03, 0x00, 0x80, 0x16, "flash.system", "JPEGLoaderContext", 0, &flash_system_LoaderContext, interfaces: {0}}; -static varinfo_t flash_system_JPEGLoaderContext_deblockingFilter = {0x01, 0x00, 0x80, 0x16, "", "deblockingFilter", 0, &_Number, &flash_system_JPEGLoaderContext, 0}; -static classinfo_t flash_system_IME = {0x03, 0x00, 0x81, 0x16, "flash.system", "IME", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static methodinfo_t flash_system_IME_setCompositionString = {0x02, 0x00, 0x82, 0x16, "", "setCompositionString", 0, &voidclass, &flash_system_IME, 0}; -static varinfo_t flash_system_IME_enabled = {0x01, 0x00, 0x82, 0x16, "", "enabled", 0, &_Boolean, &flash_system_IME, 0}; -static methodinfo_t flash_system_IME_doConversion = {0x02, 0x00, 0x82, 0x16, "", "doConversion", 0, &voidclass, &flash_system_IME, 0}; -static varinfo_t flash_system_IME_conversionMode = {0x01, 0x00, 0x82, 0x16, "", "conversionMode", 0, &_String, &flash_system_IME, 0}; -static methodinfo_t _isNaN = {0x02, 0x00, 0x82, 0x16, "", "isNaN", 0, &_Boolean, 0, 0}; -static classinfo_t flash_system_Security = {0x03, 0x00, 0x81, 0x16, "flash.system", "Security", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_system_Security_sandboxType = {0x01, 0x00, 0x82, 0x16, "", "sandboxType", 0, &_String, &flash_system_Security, 0}; -static varinfo_t flash_system_Security_LOCAL_WITH_NETWORK = {0x01, 0x00, 0x82, 0x16, "", "LOCAL_WITH_NETWORK", 0, &_String, &flash_system_Security, 0}; -static methodinfo_t flash_system_Security_loadPolicyFile = {0x02, 0x00, 0x82, 0x16, "", "loadPolicyFile", 0, &voidclass, &flash_system_Security, 0}; -static methodinfo_t flash_system_Security_allowDomain = {0x02, 0x00, 0x82, 0x16, "", "allowDomain", 0, &voidclass, &flash_system_Security, 0}; -static methodinfo_t flash_system_Security_showSettings = {0x02, 0x00, 0x82, 0x16, "", "showSettings", 0, &voidclass, &flash_system_Security, 0}; -static varinfo_t flash_system_Security_LOCAL_TRUSTED = {0x01, 0x00, 0x82, 0x16, "", "LOCAL_TRUSTED", 0, &_String, &flash_system_Security, 0}; -static varinfo_t flash_system_Security_disableAVM1Loading = {0x01, 0x00, 0x82, 0x16, "", "disableAVM1Loading", 0, &_Boolean, &flash_system_Security, 0}; -static methodinfo_t flash_system_Security_allowInsecureDomain = {0x02, 0x00, 0x82, 0x16, "", "allowInsecureDomain", 0, &voidclass, &flash_system_Security, 0}; -static varinfo_t flash_system_Security_exactSettings = {0x01, 0x00, 0x82, 0x16, "", "exactSettings", 0, &_Boolean, &flash_system_Security, 0}; -static varinfo_t flash_system_Security_REMOTE = {0x01, 0x00, 0x82, 0x16, "", "REMOTE", 0, &_String, &flash_system_Security, 0}; -static varinfo_t flash_system_Security_LOCAL_WITH_FILE = {0x01, 0x00, 0x82, 0x16, "", "LOCAL_WITH_FILE", 0, &_String, &flash_system_Security, 0}; -static classinfo_t flash_display_Bitmap = {0x03, 0x00, 0x80, 0x16, "flash.display", "Bitmap", 0, &flash_display_DisplayObject, interfaces: {0}}; -static varinfo_t flash_display_Bitmap_pixelSnapping = {0x01, 0x00, 0x80, 0x16, "", "pixelSnapping", 0, &_String, &flash_display_Bitmap, 0}; -static varinfo_t flash_display_Bitmap_bitmapData = {0x01, 0x00, 0x80, 0x16, "", "bitmapData", 0, &flash_display_BitmapData, &flash_display_Bitmap, 0}; -static varinfo_t flash_display_Bitmap_smoothing = {0x01, 0x00, 0x80, 0x16, "", "smoothing", 0, &_Boolean, &flash_display_Bitmap, 0}; -static classinfo_t flash_printing_PrintJob = {0x03, 0x00, 0x80, 0x16, "flash.printing", "PrintJob", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_printing_PrintJob_paperWidth = {0x01, 0x00, 0x80, 0x16, "", "paperWidth", 0, &_int, &flash_printing_PrintJob, 0}; -static methodinfo_t flash_printing_PrintJob_addPage = {0x02, 0x00, 0x80, 0x16, "", "addPage", 0, &voidclass, &flash_printing_PrintJob, 0}; -static varinfo_t flash_printing_PrintJob_pageHeight = {0x01, 0x00, 0x80, 0x16, "", "pageHeight", 0, &_int, &flash_printing_PrintJob, 0}; -static methodinfo_t flash_printing_PrintJob_start = {0x02, 0x00, 0x80, 0x16, "", "start", 0, &_Boolean, &flash_printing_PrintJob, 0}; -static varinfo_t flash_printing_PrintJob_pageWidth = {0x01, 0x00, 0x80, 0x16, "", "pageWidth", 0, &_int, &flash_printing_PrintJob, 0}; -static methodinfo_t flash_printing_PrintJob_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_printing_PrintJob, 0}; -static varinfo_t flash_printing_PrintJob_paperHeight = {0x01, 0x00, 0x80, 0x16, "", "paperHeight", 0, &_int, &flash_printing_PrintJob, 0}; -static varinfo_t flash_printing_PrintJob_orientation = {0x01, 0x00, 0x80, 0x16, "", "orientation", 0, &_String, &flash_printing_PrintJob, 0}; -static classinfo_t flash_text_StaticText = {0x03, 0x00, 0x81, 0x16, "flash.text", "StaticText", 0, &flash_display_DisplayObject, interfaces: {0}}; -static varinfo_t flash_text_StaticText_text = {0x01, 0x00, 0x80, 0x16, "", "text", 0, &_String, &flash_text_StaticText, 0}; -static classinfo_t flash_text_engine_SpaceJustifier = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "SpaceJustifier", 0, &flash_text_engine_TextJustifier, interfaces: {0}}; -static methodinfo_t flash_text_engine_SpaceJustifier_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_TextJustifier, &flash_text_engine_SpaceJustifier, 0}; -static varinfo_t flash_text_engine_SpaceJustifier_letterSpacing = {0x01, 0x00, 0x80, 0x16, "", "letterSpacing", 0, &_Boolean, &flash_text_engine_SpaceJustifier, 0}; -static classinfo_t flash_events_DataEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "DataEvent", 0, &flash_events_TextEvent, interfaces: {0}}; -static methodinfo_t flash_events_DataEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_DataEvent, 0}; -static methodinfo_t flash_events_DataEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_DataEvent, 0}; -static varinfo_t flash_events_DataEvent_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &_String, &flash_events_DataEvent, 0}; -static varinfo_t flash_events_DataEvent_DATA = {0x01, 0x00, 0x82, 0x16, "", "DATA", 0, &_String, &flash_events_DataEvent, 0}; -static varinfo_t flash_events_DataEvent_UPLOAD_COMPLETE_DATA = {0x01, 0x00, 0x82, 0x16, "", "UPLOAD_COMPLETE_DATA", 0, &_String, &flash_events_DataEvent, 0}; -static classinfo_t flash_events_ActivityEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ActivityEvent", 0, &flash_events_Event, interfaces: {0}}; -static methodinfo_t flash_events_ActivityEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ActivityEvent, 0}; -static varinfo_t flash_events_ActivityEvent_activating = {0x01, 0x00, 0x80, 0x16, "", "activating", 0, &_Boolean, &flash_events_ActivityEvent, 0}; -static methodinfo_t flash_events_ActivityEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ActivityEvent, 0}; -static varinfo_t flash_events_ActivityEvent_ACTIVITY = {0x01, 0x00, 0x82, 0x16, "", "ACTIVITY", 0, &_String, &flash_events_ActivityEvent, 0}; -static classinfo_t flash_display_GraphicsEndFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsEndFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; -static classinfo_t flash_display_ColorCorrection = {0x03, 0x00, 0x81, 0x16, "flash.display", "ColorCorrection", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_ColorCorrection_OFF = {0x01, 0x00, 0x82, 0x16, "", "OFF", 0, &_String, &flash_display_ColorCorrection, 0}; -static varinfo_t flash_display_ColorCorrection_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_display_ColorCorrection, 0}; -static varinfo_t flash_display_ColorCorrection_ON = {0x01, 0x00, 0x82, 0x16, "", "ON", 0, &_String, &flash_display_ColorCorrection, 0}; -static classinfo_t flash_events_IOErrorEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "IOErrorEvent", 0, &flash_events_ErrorEvent, interfaces: {0}}; -static methodinfo_t flash_events_IOErrorEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_IOErrorEvent, 0}; -static methodinfo_t flash_events_IOErrorEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_IOErrorEvent, 0}; -static varinfo_t flash_events_IOErrorEvent_IO_ERROR = {0x01, 0x00, 0x82, 0x16, "", "IO_ERROR", 0, &_String, &flash_events_IOErrorEvent, 0}; -static varinfo_t flash_events_IOErrorEvent_VERIFY_ERROR = {0x01, 0x00, 0x82, 0x16, "", "VERIFY_ERROR", 0, &_String, &flash_events_IOErrorEvent, 0}; -static varinfo_t flash_events_IOErrorEvent_NETWORK_ERROR = {0x01, 0x00, 0x82, 0x16, "", "NETWORK_ERROR", 0, &_String, &flash_events_IOErrorEvent, 0}; -static varinfo_t flash_events_IOErrorEvent_DISK_ERROR = {0x01, 0x00, 0x82, 0x16, "", "DISK_ERROR", 0, &_String, &flash_events_IOErrorEvent, 0}; -static classinfo_t flash_display_GraphicsStroke = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsStroke", 0, &_Object, interfaces: {&flash_display_IGraphicsStroke, &flash_display_IGraphicsData, 0}}; -static varinfo_t flash_display_GraphicsStroke_scaleMode = {0x01, 0x00, 0x80, 0x16, "", "scaleMode", 0, &_String, &flash_display_GraphicsStroke, 0}; -static varinfo_t flash_display_GraphicsStroke_miterLimit = {0x01, 0x00, 0x80, 0x16, "", "miterLimit", 0, &_Number, &flash_display_GraphicsStroke, 0}; -static varinfo_t flash_display_GraphicsStroke_pixelHinting = {0x01, 0x00, 0x80, 0x16, "", "pixelHinting", 0, &_Boolean, &flash_display_GraphicsStroke, 0}; -static varinfo_t flash_display_GraphicsStroke_fill = {0x01, 0x00, 0x80, 0x16, "", "fill", 0, &flash_display_IGraphicsFill, &flash_display_GraphicsStroke, 0}; -static varinfo_t flash_display_GraphicsStroke_thickness = {0x01, 0x00, 0x80, 0x16, "", "thickness", 0, &_Number, &flash_display_GraphicsStroke, 0}; -static varinfo_t flash_display_GraphicsStroke_joints = {0x01, 0x00, 0x80, 0x16, "", "joints", 0, &_String, &flash_display_GraphicsStroke, 0}; -static varinfo_t flash_display_GraphicsStroke_caps = {0x01, 0x00, 0x80, 0x16, "", "caps", 0, &_String, &flash_display_GraphicsStroke, 0}; -static classinfo_t _Boolean = {0x03, 0x00, 0x81, 0x16, "", "Boolean", 0, &_Object, interfaces: {0}}; -static methodinfo_t _Boolean_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_Boolean, &_Boolean, 0}; -static methodinfo_t _Boolean_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_Boolean, 0}; -static varinfo_t _Boolean_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Boolean, 0}; -static methodinfo_t flash_sampler_getMemberNames = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getMemberNames", 0, &_Object, 0, 0}; -static methodinfo_t flash_utils_getQualifiedClassName = {0x02, 0x00, 0x82, 0x16, "flash.utils", "getQualifiedClassName", 0, &_String, 0, 0}; -static classinfo_t flash_text_engine_GraphicElement = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "GraphicElement", 0, &flash_text_engine_ContentElement, interfaces: {0}}; -static varinfo_t flash_text_engine_GraphicElement_graphic = {0x01, 0x00, 0x80, 0x16, "", "graphic", 0, &flash_display_DisplayObject, &flash_text_engine_GraphicElement, 0}; -static varinfo_t flash_text_engine_GraphicElement_elementWidth = {0x01, 0x00, 0x80, 0x16, "", "elementWidth", 0, &_Number, &flash_text_engine_GraphicElement, 0}; -static varinfo_t flash_text_engine_GraphicElement_elementHeight = {0x01, 0x00, 0x80, 0x16, "", "elementHeight", 0, &_Number, &flash_text_engine_GraphicElement, 0}; -static classinfo_t flash_media_Microphone = {0x03, 0x00, 0x81, 0x16, "flash.media", "Microphone", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_media_Microphone_codec = {0x01, 0x00, 0x80, 0x16, "", "codec", 0, &_String, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_gain = {0x01, 0x00, 0x80, 0x16, "", "gain", 0, &_Number, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_index = {0x01, 0x00, 0x80, 0x16, "", "index", 0, &_int, &flash_media_Microphone, 0}; -static methodinfo_t flash_media_Microphone_setLoopBack = {0x02, 0x00, 0x80, 0x16, "", "setLoopBack", 0, &voidclass, &flash_media_Microphone, 0}; -static methodinfo_t flash_media_Microphone_setSilenceLevel = {0x02, 0x00, 0x80, 0x16, "", "setSilenceLevel", 0, &voidclass, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_media_Microphone, 0}; -static methodinfo_t flash_media_Microphone_setUseEchoSuppression = {0x02, 0x00, 0x80, 0x16, "", "setUseEchoSuppression", 0, &voidclass, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_framesPerPacket = {0x01, 0x00, 0x80, 0x16, "", "framesPerPacket", 0, &_int, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_muted = {0x01, 0x00, 0x80, 0x16, "", "muted", 0, &_Boolean, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_encodeQuality = {0x01, 0x00, 0x80, 0x16, "", "encodeQuality", 0, &_int, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_useEchoSuppression = {0x01, 0x00, 0x80, 0x16, "", "useEchoSuppression", 0, &_Boolean, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_silenceLevel = {0x01, 0x00, 0x80, 0x16, "", "silenceLevel", 0, &_Number, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_silenceTimeout = {0x01, 0x00, 0x80, 0x16, "", "silenceTimeout", 0, &_int, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_rate = {0x01, 0x00, 0x80, 0x16, "", "rate", 0, &_int, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_activityLevel = {0x01, 0x00, 0x80, 0x16, "", "activityLevel", 0, &_Number, &flash_media_Microphone, 0}; -static varinfo_t flash_media_Microphone_names = {0x01, 0x00, 0x82, 0x16, "", "names", 0, &_Array, &flash_media_Microphone, 0}; -static methodinfo_t flash_media_Microphone_getMicrophone = {0x02, 0x00, 0x82, 0x16, "", "getMicrophone", 0, &flash_media_Microphone, &flash_media_Microphone, 0}; -static classinfo_t flash_ui_ContextMenuClipboardItems = {0x03, 0x00, 0x81, 0x16, "flash.ui", "ContextMenuClipboardItems", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_ui_ContextMenuClipboardItems_clear = {0x01, 0x00, 0x80, 0x16, "", "clear", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; -static methodinfo_t flash_ui_ContextMenuClipboardItems_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_ui_ContextMenuClipboardItems, &flash_ui_ContextMenuClipboardItems, 0}; -static varinfo_t flash_ui_ContextMenuClipboardItems_paste = {0x01, 0x00, 0x80, 0x16, "", "paste", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; -static varinfo_t flash_ui_ContextMenuClipboardItems_selectAll = {0x01, 0x00, 0x80, 0x16, "", "selectAll", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; -static varinfo_t flash_ui_ContextMenuClipboardItems_copy = {0x01, 0x00, 0x80, 0x16, "", "copy", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; -static varinfo_t flash_ui_ContextMenuClipboardItems_cut = {0x01, 0x00, 0x80, 0x16, "", "cut", 0, &_Boolean, &flash_ui_ContextMenuClipboardItems, 0}; -static classinfo_t flash_display_GraphicsShaderFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsShaderFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; -static varinfo_t flash_display_GraphicsShaderFill_shader = {0x01, 0x00, 0x80, 0x16, "", "shader", 0, &flash_display_Shader, &flash_display_GraphicsShaderFill, 0}; -static varinfo_t flash_display_GraphicsShaderFill_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &flash_geom_Matrix, &flash_display_GraphicsShaderFill, 0}; -static classinfo_t flash_errors_IllegalOperationError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "IllegalOperationError", 0, &_Error, interfaces: {0}}; -static classinfo_t flash_filters_GradientGlowFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "GradientGlowFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_GradientGlowFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_angle = {0x01, 0x00, 0x80, 0x16, "", "angle", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_alphas = {0x01, 0x00, 0x80, 0x16, "", "alphas", 0, &_Array, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_ratios = {0x01, 0x00, 0x80, 0x16, "", "ratios", 0, &_Array, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_colors = {0x01, 0x00, 0x80, 0x16, "", "colors", 0, &_Array, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; -static varinfo_t flash_filters_GradientGlowFilter_distance = {0x01, 0x00, 0x80, 0x16, "", "distance", 0, &_Number, &flash_filters_GradientGlowFilter, 0}; -static methodinfo_t flash_filters_GradientGlowFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_GradientGlowFilter, 0}; -static classinfo_t flash_display_CapsStyle = {0x03, 0x00, 0x81, 0x16, "flash.display", "CapsStyle", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_CapsStyle_ROUND = {0x01, 0x00, 0x82, 0x16, "", "ROUND", 0, &_String, &flash_display_CapsStyle, 0}; -static varinfo_t flash_display_CapsStyle_SQUARE = {0x01, 0x00, 0x82, 0x16, "", "SQUARE", 0, &_String, &flash_display_CapsStyle, 0}; -static varinfo_t flash_display_CapsStyle_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_display_CapsStyle, 0}; -static classinfo_t flash_text_TextSnapshot = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextSnapshot", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_text_TextSnapshot_setSelectColor = {0x02, 0x00, 0x80, 0x16, "", "setSelectColor", 0, &voidclass, &flash_text_TextSnapshot, 0}; -static methodinfo_t flash_text_TextSnapshot_setSelected = {0x02, 0x00, 0x80, 0x16, "", "setSelected", 0, &voidclass, &flash_text_TextSnapshot, 0}; -static methodinfo_t flash_text_TextSnapshot_getSelectedText = {0x02, 0x00, 0x80, 0x16, "", "getSelectedText", 0, &_String, &flash_text_TextSnapshot, 0}; -static methodinfo_t flash_text_TextSnapshot_getTextRunInfo = {0x02, 0x00, 0x80, 0x16, "", "getTextRunInfo", 0, &_Array, &flash_text_TextSnapshot, 0}; -static varinfo_t flash_text_TextSnapshot_charCount = {0x01, 0x00, 0x80, 0x16, "", "charCount", 0, &_int, &flash_text_TextSnapshot, 0}; -static methodinfo_t flash_text_TextSnapshot_findText = {0x02, 0x00, 0x80, 0x16, "", "findText", 0, &_int, &flash_text_TextSnapshot, 0}; -static methodinfo_t flash_text_TextSnapshot_getSelected = {0x02, 0x00, 0x80, 0x16, "", "getSelected", 0, &_Boolean, &flash_text_TextSnapshot, 0}; -static methodinfo_t flash_text_TextSnapshot_hitTestTextNearPos = {0x02, 0x00, 0x80, 0x16, "", "hitTestTextNearPos", 0, &_Number, &flash_text_TextSnapshot, 0}; -static methodinfo_t flash_text_TextSnapshot_getText = {0x02, 0x00, 0x80, 0x16, "", "getText", 0, &_String, &flash_text_TextSnapshot, 0}; -static classinfo_t flash_text_engine_FontLookup = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontLookup", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_FontLookup_DEVICE = {0x01, 0x00, 0x82, 0x16, "", "DEVICE", 0, &_String, &flash_text_engine_FontLookup, 0}; -static varinfo_t flash_text_engine_FontLookup_EMBEDDED_CFF = {0x01, 0x00, 0x82, 0x16, "", "EMBEDDED_CFF", 0, &_String, &flash_text_engine_FontLookup, 0}; -static classinfo_t flash_display_InteractiveObject = {0x03, 0x00, 0x80, 0x16, "flash.display", "InteractiveObject", 0, &flash_display_DisplayObject, interfaces: {0}}; -static varinfo_t flash_display_InteractiveObject_tabIndex = {0x01, 0x00, 0x80, 0x16, "", "tabIndex", 0, &_int, &flash_display_InteractiveObject, 0}; -static varinfo_t flash_display_InteractiveObject_doubleClickEnabled = {0x01, 0x00, 0x80, 0x16, "", "doubleClickEnabled", 0, &_Boolean, &flash_display_InteractiveObject, 0}; -static varinfo_t flash_display_InteractiveObject_tabEnabled = {0x01, 0x00, 0x80, 0x16, "", "tabEnabled", 0, &_Boolean, &flash_display_InteractiveObject, 0}; -static varinfo_t flash_display_InteractiveObject_mouseEnabled = {0x01, 0x00, 0x80, 0x16, "", "mouseEnabled", 0, &_Boolean, &flash_display_InteractiveObject, 0}; -static varinfo_t flash_display_InteractiveObject_contextMenu = {0x01, 0x00, 0x80, 0x16, "", "contextMenu", 0, &flash_ui_ContextMenu, &flash_display_InteractiveObject, 0}; -static varinfo_t flash_display_InteractiveObject_focusRect = {0x01, 0x00, 0x80, 0x16, "", "focusRect", 0, &_Object, &flash_display_InteractiveObject, 0}; -static varinfo_t flash_display_InteractiveObject_accessibilityImplementation = {0x01, 0x00, 0x80, 0x16, "", "accessibilityImplementation", 0, &flash_accessibility_AccessibilityImplementation, &flash_display_InteractiveObject, 0}; -static classinfo_t flash_text_TextField = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextField", 0, &flash_display_InteractiveObject, interfaces: {0}}; -static methodinfo_t flash_text_TextField_getTextFormat = {0x02, 0x00, 0x80, 0x16, "", "getTextFormat", 0, &flash_text_TextFormat, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_border = {0x01, 0x00, 0x80, 0x16, "", "border", 0, &_Boolean, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_selectedText = {0x01, 0x00, 0x80, 0x16, "", "selectedText", 0, &_String, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_pasteRichText = {0x02, 0x00, 0x80, 0x17, "", "pasteRichText", 0, &_Boolean, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_bottomScrollV = {0x01, 0x00, 0x80, 0x16, "", "bottomScrollV", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getLineIndexOfChar = {0x02, 0x00, 0x80, 0x16, "", "getLineIndexOfChar", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_replaceText = {0x02, 0x00, 0x80, 0x16, "", "replaceText", 0, &voidclass, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_defaultTextFormat = {0x01, 0x00, 0x80, 0x16, "", "defaultTextFormat", 0, &flash_text_TextFormat, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_restrict = {0x01, 0x00, 0x80, 0x16, "", "restrict", 0, &_String, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_htmlText = {0x01, 0x00, 0x80, 0x16, "", "htmlText", 0, &_String, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_copyRichText = {0x02, 0x00, 0x80, 0x17, "", "copyRichText", 0, &_String, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getLineText = {0x02, 0x00, 0x80, 0x16, "", "getLineText", 0, &_String, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getFirstCharInParagraph = {0x02, 0x00, 0x80, 0x16, "", "getFirstCharInParagraph", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_setSelection = {0x02, 0x00, 0x80, 0x16, "", "setSelection", 0, &voidclass, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_int, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_wordWrap = {0x01, 0x00, 0x80, 0x16, "", "wordWrap", 0, &_Boolean, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_appendText = {0x02, 0x00, 0x80, 0x16, "", "appendText", 0, &voidclass, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_caretIndex = {0x01, 0x00, 0x80, 0x16, "", "caretIndex", 0, &_int, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_mouseWheelEnabled = {0x01, 0x00, 0x80, 0x16, "", "mouseWheelEnabled", 0, &_Boolean, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_selectionBeginIndex = {0x01, 0x00, 0x80, 0x16, "", "selectionBeginIndex", 0, &_int, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_sharpness = {0x01, 0x00, 0x80, 0x16, "", "sharpness", 0, &_Number, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getLineIndexAtPoint = {0x02, 0x00, 0x80, 0x16, "", "getLineIndexAtPoint", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getCharIndexAtPoint = {0x02, 0x00, 0x80, 0x16, "", "getCharIndexAtPoint", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getXMLText = {0x02, 0x00, 0x80, 0x16, "", "getXMLText", 0, &_String, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getParagraphLength = {0x02, 0x00, 0x80, 0x16, "", "getParagraphLength", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getRawText = {0x02, 0x00, 0x80, 0x16, "", "getRawText", 0, &_String, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_gridFitType = {0x01, 0x00, 0x80, 0x16, "", "gridFitType", 0, &_String, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getLineOffset = {0x02, 0x00, 0x80, 0x16, "", "getLineOffset", 0, &_int, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_backgroundColor = {0x01, 0x00, 0x80, 0x16, "", "backgroundColor", 0, &_uint, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_multiline = {0x01, 0x00, 0x80, 0x16, "", "multiline", 0, &_Boolean, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_numLines = {0x01, 0x00, 0x80, 0x16, "", "numLines", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getImageReference = {0x02, 0x00, 0x80, 0x16, "", "getImageReference", 0, &flash_display_DisplayObject, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_displayAsPassword = {0x01, 0x00, 0x80, 0x16, "", "displayAsPassword", 0, &_Boolean, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_textWidth = {0x01, 0x00, 0x80, 0x16, "", "textWidth", 0, &_Number, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_autoSize = {0x01, 0x00, 0x80, 0x16, "", "autoSize", 0, &_String, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_selectable = {0x01, 0x00, 0x80, 0x16, "", "selectable", 0, &_Boolean, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getCharBoundaries = {0x02, 0x00, 0x80, 0x16, "", "getCharBoundaries", 0, &flash_geom_Rectangle, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_alwaysShowSelection = {0x01, 0x00, 0x80, 0x16, "", "alwaysShowSelection", 0, &_Boolean, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_thickness = {0x01, 0x00, 0x80, 0x16, "", "thickness", 0, &_Number, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_useRichTextClipboard = {0x01, 0x00, 0x80, 0x16, "", "useRichTextClipboard", 0, &_Boolean, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_scrollV = {0x01, 0x00, 0x80, 0x16, "", "scrollV", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getTextRuns = {0x02, 0x00, 0x80, 0x16, "", "getTextRuns", 0, &_Array, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_setTextFormat = {0x02, 0x00, 0x80, 0x16, "", "setTextFormat", 0, &voidclass, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_textColor = {0x01, 0x00, 0x80, 0x16, "", "textColor", 0, &_uint, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_maxScrollV = {0x01, 0x00, 0x80, 0x16, "", "maxScrollV", 0, &_int, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_embedFonts = {0x01, 0x00, 0x80, 0x16, "", "embedFonts", 0, &_Boolean, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_scrollH = {0x01, 0x00, 0x80, 0x16, "", "scrollH", 0, &_int, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_text = {0x01, 0x00, 0x80, 0x16, "", "text", 0, &_String, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getLineLength = {0x02, 0x00, 0x80, 0x16, "", "getLineLength", 0, &_int, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_textHeight = {0x01, 0x00, 0x80, 0x16, "", "textHeight", 0, &_Number, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_antiAliasType = {0x01, 0x00, 0x80, 0x16, "", "antiAliasType", 0, &_String, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_styleSheet = {0x01, 0x00, 0x80, 0x16, "", "styleSheet", 0, &flash_text_StyleSheet, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_background = {0x01, 0x00, 0x80, 0x16, "", "background", 0, &_Boolean, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_replaceSelectedText = {0x02, 0x00, 0x80, 0x16, "", "replaceSelectedText", 0, &voidclass, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_borderColor = {0x01, 0x00, 0x80, 0x16, "", "borderColor", 0, &_uint, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_maxScrollH = {0x01, 0x00, 0x80, 0x16, "", "maxScrollH", 0, &_int, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_maxChars = {0x01, 0x00, 0x80, 0x16, "", "maxChars", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_getLineMetrics = {0x02, 0x00, 0x80, 0x16, "", "getLineMetrics", 0, &flash_text_TextLineMetrics, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_selectionEndIndex = {0x01, 0x00, 0x80, 0x16, "", "selectionEndIndex", 0, &_int, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_insertXMLText = {0x02, 0x00, 0x80, 0x16, "", "insertXMLText", 0, &voidclass, &flash_text_TextField, 0}; -static varinfo_t flash_text_TextField_condenseWhite = {0x01, 0x00, 0x80, 0x16, "", "condenseWhite", 0, &_Boolean, &flash_text_TextField, 0}; -static methodinfo_t flash_text_TextField_isFontCompatible = {0x02, 0x00, 0x82, 0x16, "", "isFontCompatible", 0, &_Boolean, &flash_text_TextField, 0}; -static classinfo_t flash_printing_PrintJobOrientation = {0x03, 0x00, 0x81, 0x16, "flash.printing", "PrintJobOrientation", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_printing_PrintJobOrientation_LANDSCAPE = {0x01, 0x00, 0x82, 0x16, "", "LANDSCAPE", 0, &_String, &flash_printing_PrintJobOrientation, 0}; -static varinfo_t flash_printing_PrintJobOrientation_PORTRAIT = {0x01, 0x00, 0x82, 0x16, "", "PORTRAIT", 0, &_String, &flash_printing_PrintJobOrientation, 0}; -static classinfo_t flash_text_TextRenderer = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextRenderer", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextRenderer_displayMode = {0x01, 0x00, 0x82, 0x16, "", "displayMode", 0, &_String, &flash_text_TextRenderer, 0}; -static varinfo_t flash_text_TextRenderer_antiAliasType = {0x01, 0x00, 0x82, 0x16, "", "antiAliasType", 0, &_String, &flash_text_TextRenderer, 0}; -static varinfo_t flash_text_TextRenderer_maxLevel = {0x01, 0x00, 0x82, 0x16, "", "maxLevel", 0, &_int, &flash_text_TextRenderer, 0}; -static methodinfo_t flash_text_TextRenderer_setAdvancedAntiAliasingTable = {0x02, 0x00, 0x82, 0x16, "", "setAdvancedAntiAliasingTable", 0, &voidclass, &flash_text_TextRenderer, 0}; -static classinfo_t flash_net_NetConnection = {0x03, 0x00, 0x80, 0x16, "flash.net", "NetConnection", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_net_NetConnection_nearID = {0x01, 0x00, 0x80, 0x16, "", "nearID", 0, &_String, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_client = {0x01, 0x00, 0x80, 0x16, "", "client", 0, &_Object, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_farNonce = {0x01, 0x00, 0x80, 0x16, "", "farNonce", 0, &_String, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_farID = {0x01, 0x00, 0x80, 0x16, "", "farID", 0, &_String, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_connected = {0x01, 0x00, 0x80, 0x16, "", "connected", 0, &_Boolean, &flash_net_NetConnection, 0}; -static methodinfo_t flash_net_NetConnection_call = {0x02, 0x00, 0x80, 0x16, "", "call", 0, &voidclass, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_usingTLS = {0x01, 0x00, 0x80, 0x16, "", "usingTLS", 0, &_Boolean, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_proxyType = {0x01, 0x00, 0x80, 0x16, "", "proxyType", 0, &_String, &flash_net_NetConnection, 0}; -static methodinfo_t flash_net_NetConnection_addHeader = {0x02, 0x00, 0x80, 0x16, "", "addHeader", 0, &voidclass, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_protocol = {0x01, 0x00, 0x80, 0x16, "", "protocol", 0, &_String, &flash_net_NetConnection, 0}; -static methodinfo_t flash_net_NetConnection_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_nearNonce = {0x01, 0x00, 0x80, 0x16, "", "nearNonce", 0, &_String, &flash_net_NetConnection, 0}; -static methodinfo_t flash_net_NetConnection_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_unconnectedPeerStreams = {0x01, 0x00, 0x80, 0x16, "", "unconnectedPeerStreams", 0, &_Array, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_maxPeerConnections = {0x01, 0x00, 0x80, 0x16, "", "maxPeerConnections", 0, &_uint, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_connectedProxyType = {0x01, 0x00, 0x80, 0x16, "", "connectedProxyType", 0, &_String, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_uri = {0x01, 0x00, 0x80, 0x16, "", "uri", 0, &_String, &flash_net_NetConnection, 0}; -static varinfo_t flash_net_NetConnection_defaultObjectEncoding = {0x01, 0x00, 0x82, 0x16, "", "defaultObjectEncoding", 0, &_uint, &flash_net_NetConnection, 0}; -static methodinfo_t _decodeURIComponent = {0x02, 0x00, 0x82, 0x16, "", "decodeURIComponent", 0, &_String, 0, 0}; -static methodinfo_t flash_sampler_isGetterSetter = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "isGetterSetter", 0, &_Boolean, 0, 0}; -static methodinfo_t flash_utils_getQualifiedSuperclassName = {0x02, 0x00, 0x82, 0x16, "flash.utils", "getQualifiedSuperclassName", 0, &_String, 0, 0}; -static classinfo_t flash_display_GraphicsPathWinding = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsPathWinding", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_GraphicsPathWinding_EVEN_ODD = {0x01, 0x00, 0x82, 0x16, "", "EVEN_ODD", 0, &_String, &flash_display_GraphicsPathWinding, 0}; -static varinfo_t flash_display_GraphicsPathWinding_NON_ZERO = {0x01, 0x00, 0x82, 0x16, "", "NON_ZERO", 0, &_String, &flash_display_GraphicsPathWinding, 0}; -static classinfo_t flash_text_engine_TabStop = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TabStop", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_TabStop_alignment = {0x01, 0x00, 0x80, 0x16, "", "alignment", 0, &_String, &flash_text_engine_TabStop, 0}; -static varinfo_t flash_text_engine_TabStop_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &_Number, &flash_text_engine_TabStop, 0}; -static varinfo_t flash_text_engine_TabStop_decimalAlignmentToken = {0x01, 0x00, 0x80, 0x16, "", "decimalAlignmentToken", 0, &_String, &flash_text_engine_TabStop, 0}; -static classinfo_t flash_text_engine_JustificationStyle = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "JustificationStyle", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_JustificationStyle_PUSH_OUT_ONLY = {0x01, 0x00, 0x82, 0x16, "", "PUSH_OUT_ONLY", 0, &_String, &flash_text_engine_JustificationStyle, 0}; -static varinfo_t flash_text_engine_JustificationStyle_PRIORITIZE_LEAST_ADJUSTMENT = {0x01, 0x00, 0x82, 0x16, "", "PRIORITIZE_LEAST_ADJUSTMENT", 0, &_String, &flash_text_engine_JustificationStyle, 0}; -static varinfo_t flash_text_engine_JustificationStyle_PUSH_IN_KINSOKU = {0x01, 0x00, 0x82, 0x16, "", "PUSH_IN_KINSOKU", 0, &_String, &flash_text_engine_JustificationStyle, 0}; -static methodinfo_t flash_sampler_startSampling = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "startSampling", 0, &voidclass, 0, 0}; -static classinfo_t flash_text_engine_TextRotation = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextRotation", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_TextRotation_ROTATE_270 = {0x01, 0x00, 0x82, 0x16, "", "ROTATE_270", 0, &_String, &flash_text_engine_TextRotation, 0}; -static varinfo_t flash_text_engine_TextRotation_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_text_engine_TextRotation, 0}; -static varinfo_t flash_text_engine_TextRotation_ROTATE_0 = {0x01, 0x00, 0x82, 0x16, "", "ROTATE_0", 0, &_String, &flash_text_engine_TextRotation, 0}; -static varinfo_t flash_text_engine_TextRotation_ROTATE_90 = {0x01, 0x00, 0x82, 0x16, "", "ROTATE_90", 0, &_String, &flash_text_engine_TextRotation, 0}; -static varinfo_t flash_text_engine_TextRotation_ROTATE_180 = {0x01, 0x00, 0x82, 0x16, "", "ROTATE_180", 0, &_String, &flash_text_engine_TextRotation, 0}; -static methodinfo_t flash_sampler_clearSamples = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "clearSamples", 0, &voidclass, 0, 0}; -static classinfo_t flash_system_IMEConversionMode = {0x03, 0x00, 0x81, 0x16, "flash.system", "IMEConversionMode", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_system_IMEConversionMode_JAPANESE_KATAKANA_FULL = {0x01, 0x00, 0x82, 0x16, "", "JAPANESE_KATAKANA_FULL", 0, &_String, &flash_system_IMEConversionMode, 0}; -static varinfo_t flash_system_IMEConversionMode_CHINESE = {0x01, 0x00, 0x82, 0x16, "", "CHINESE", 0, &_String, &flash_system_IMEConversionMode, 0}; -static varinfo_t flash_system_IMEConversionMode_JAPANESE_KATAKANA_HALF = {0x01, 0x00, 0x82, 0x16, "", "JAPANESE_KATAKANA_HALF", 0, &_String, &flash_system_IMEConversionMode, 0}; -static varinfo_t flash_system_IMEConversionMode_UNKNOWN = {0x01, 0x00, 0x82, 0x16, "", "UNKNOWN", 0, &_String, &flash_system_IMEConversionMode, 0}; -static varinfo_t flash_system_IMEConversionMode_KOREAN = {0x01, 0x00, 0x82, 0x16, "", "KOREAN", 0, &_String, &flash_system_IMEConversionMode, 0}; -static varinfo_t flash_system_IMEConversionMode_ALPHANUMERIC_HALF = {0x01, 0x00, 0x82, 0x16, "", "ALPHANUMERIC_HALF", 0, &_String, &flash_system_IMEConversionMode, 0}; -static varinfo_t flash_system_IMEConversionMode_ALPHANUMERIC_FULL = {0x01, 0x00, 0x82, 0x16, "", "ALPHANUMERIC_FULL", 0, &_String, &flash_system_IMEConversionMode, 0}; -static varinfo_t flash_system_IMEConversionMode_JAPANESE_HIRAGANA = {0x01, 0x00, 0x82, 0x16, "", "JAPANESE_HIRAGANA", 0, &_String, &flash_system_IMEConversionMode, 0}; -static classinfo_t flash_display_StageScaleMode = {0x03, 0x00, 0x81, 0x16, "flash.display", "StageScaleMode", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_StageScaleMode_SHOW_ALL = {0x01, 0x00, 0x82, 0x16, "", "SHOW_ALL", 0, &_String, &flash_display_StageScaleMode, 0}; -static varinfo_t flash_display_StageScaleMode_NO_BORDER = {0x01, 0x00, 0x82, 0x16, "", "NO_BORDER", 0, &_String, &flash_display_StageScaleMode, 0}; -static varinfo_t flash_display_StageScaleMode_EXACT_FIT = {0x01, 0x00, 0x82, 0x16, "", "EXACT_FIT", 0, &_String, &flash_display_StageScaleMode, 0}; -static varinfo_t flash_display_StageScaleMode_NO_SCALE = {0x01, 0x00, 0x82, 0x16, "", "NO_SCALE", 0, &_String, &flash_display_StageScaleMode, 0}; -static methodinfo_t flash_sampler_getSize = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getSize", 0, &_Number, 0, 0}; -static classinfo_t flash_net_URLStream = {0x03, 0x00, 0x80, 0x16, "flash.net", "URLStream", 0, &flash_events_EventDispatcher, interfaces: {&flash_utils_IDataInput, 0}}; -static methodinfo_t flash_net_URLStream_readUTF = {0x02, 0x00, 0x80, 0x16, "", "readUTF", 0, &_String, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readByte = {0x02, 0x00, 0x80, 0x16, "", "readByte", 0, &_int, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readUTFBytes = {0x02, 0x00, 0x80, 0x16, "", "readUTFBytes", 0, &_String, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readShort = {0x02, 0x00, 0x80, 0x16, "", "readShort", 0, &_int, &flash_net_URLStream, 0}; -static varinfo_t flash_net_URLStream_objectEncoding = {0x01, 0x00, 0x80, 0x16, "", "objectEncoding", 0, &_uint, &flash_net_URLStream, 0}; -static varinfo_t flash_net_URLStream_connected = {0x01, 0x00, 0x80, 0x16, "", "connected", 0, &_Boolean, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readUnsignedInt = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedInt", 0, &_uint, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readDouble = {0x02, 0x00, 0x80, 0x16, "", "readDouble", 0, &_Number, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readBytes = {0x02, 0x00, 0x80, 0x16, "", "readBytes", 0, &voidclass, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readUnsignedByte = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedByte", 0, &_uint, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readMultiByte = {0x02, 0x00, 0x80, 0x16, "", "readMultiByte", 0, &_String, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readInt = {0x02, 0x00, 0x80, 0x16, "", "readInt", 0, &_int, &flash_net_URLStream, 0}; -static varinfo_t flash_net_URLStream_bytesAvailable = {0x01, 0x00, 0x80, 0x16, "", "bytesAvailable", 0, &_uint, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readUnsignedShort = {0x02, 0x00, 0x80, 0x16, "", "readUnsignedShort", 0, &_uint, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readObject = {0x02, 0x00, 0x80, 0x16, "", "readObject", 0, 0, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readFloat = {0x02, 0x00, 0x80, 0x16, "", "readFloat", 0, &_Number, &flash_net_URLStream, 0}; -static varinfo_t flash_net_URLStream_endian = {0x01, 0x00, 0x80, 0x16, "", "endian", 0, &_String, &flash_net_URLStream, 0}; -static methodinfo_t flash_net_URLStream_readBoolean = {0x02, 0x00, 0x80, 0x16, "", "readBoolean", 0, &_Boolean, &flash_net_URLStream, 0}; -static classinfo_t flash_display_BlendMode = {0x03, 0x00, 0x81, 0x16, "flash.display", "BlendMode", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_BlendMode_LAYER = {0x01, 0x00, 0x82, 0x16, "", "LAYER", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_ERASE = {0x01, 0x00, 0x82, 0x16, "", "ERASE", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_HARDLIGHT = {0x01, 0x00, 0x82, 0x16, "", "HARDLIGHT", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_OVERLAY = {0x01, 0x00, 0x82, 0x16, "", "OVERLAY", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_ALPHA = {0x01, 0x00, 0x82, 0x16, "", "ALPHA", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_SUBTRACT = {0x01, 0x00, 0x82, 0x16, "", "SUBTRACT", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_INVERT = {0x01, 0x00, 0x82, 0x16, "", "INVERT", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_DIFFERENCE = {0x01, 0x00, 0x82, 0x16, "", "DIFFERENCE", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_DARKEN = {0x01, 0x00, 0x82, 0x16, "", "DARKEN", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_SHADER = {0x01, 0x00, 0x82, 0x16, "", "SHADER", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_MULTIPLY = {0x01, 0x00, 0x82, 0x16, "", "MULTIPLY", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_ADD = {0x01, 0x00, 0x82, 0x16, "", "ADD", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_SCREEN = {0x01, 0x00, 0x82, 0x16, "", "SCREEN", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_display_BlendMode, 0}; -static varinfo_t flash_display_BlendMode_LIGHTEN = {0x01, 0x00, 0x82, 0x16, "", "LIGHTEN", 0, &_String, &flash_display_BlendMode, 0}; -static classinfo_t flash_ui_Mouse = {0x03, 0x00, 0x81, 0x16, "flash.ui", "Mouse", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_ui_Mouse_cursor = {0x01, 0x00, 0x82, 0x16, "", "cursor", 0, &_String, &flash_ui_Mouse, 0}; -static methodinfo_t flash_ui_Mouse_show = {0x02, 0x00, 0x82, 0x16, "", "show", 0, &voidclass, &flash_ui_Mouse, 0}; -static methodinfo_t flash_ui_Mouse_hide = {0x02, 0x00, 0x82, 0x16, "", "hide", 0, &voidclass, &flash_ui_Mouse, 0}; -static classinfo_t flash_errors_InvalidSWFError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "InvalidSWFError", 0, &_Error, interfaces: {0}}; -static classinfo_t flash_text_engine_RenderingMode = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "RenderingMode", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_RenderingMode_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_text_engine_RenderingMode, 0}; -static varinfo_t flash_text_engine_RenderingMode_CFF = {0x01, 0x00, 0x82, 0x16, "", "CFF", 0, &_String, &flash_text_engine_RenderingMode, 0}; -static classinfo_t flash_display_GraphicsTrianglePath = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsTrianglePath", 0, &_Object, interfaces: {&flash_display_IGraphicsPath, &flash_display_IGraphicsData, 0}}; -static varinfo_t flash_display_GraphicsTrianglePath_culling = {0x01, 0x00, 0x80, 0x16, "", "culling", 0, &_String, &flash_display_GraphicsTrianglePath, 0}; -static varinfo_t flash_display_GraphicsTrianglePath_vertices = {0x01, 0x00, 0x80, 0x16, "", "vertices", 0, &__AS3___vec_Vector, &flash_display_GraphicsTrianglePath, 0}; -static varinfo_t flash_display_GraphicsTrianglePath_indices = {0x01, 0x00, 0x80, 0x16, "", "indices", 0, &__AS3___vec_Vector, &flash_display_GraphicsTrianglePath, 0}; -static varinfo_t flash_display_GraphicsTrianglePath_uvtData = {0x01, 0x00, 0x80, 0x16, "", "uvtData", 0, &__AS3___vec_Vector, &flash_display_GraphicsTrianglePath, 0}; -static classinfo_t flash_display_IGraphicsFill = {0x03, 0x00, 0x90, 0x16, "flash.display", "IGraphicsFill", 0, 0, interfaces: {0}}; -static classinfo_t flash_text_engine_TypographicCase = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TypographicCase", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_TypographicCase_UPPERCASE = {0x01, 0x00, 0x82, 0x16, "", "UPPERCASE", 0, &_String, &flash_text_engine_TypographicCase, 0}; -static varinfo_t flash_text_engine_TypographicCase_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_text_engine_TypographicCase, 0}; -static varinfo_t flash_text_engine_TypographicCase_LOWERCASE = {0x01, 0x00, 0x82, 0x16, "", "LOWERCASE", 0, &_String, &flash_text_engine_TypographicCase, 0}; -static varinfo_t flash_text_engine_TypographicCase_SMALL_CAPS = {0x01, 0x00, 0x82, 0x16, "", "SMALL_CAPS", 0, &_String, &flash_text_engine_TypographicCase, 0}; -static varinfo_t flash_text_engine_TypographicCase_TITLE = {0x01, 0x00, 0x82, 0x16, "", "TITLE", 0, &_String, &flash_text_engine_TypographicCase, 0}; -static varinfo_t flash_text_engine_TypographicCase_CAPS = {0x01, 0x00, 0x82, 0x16, "", "CAPS", 0, &_String, &flash_text_engine_TypographicCase, 0}; -static varinfo_t flash_text_engine_TypographicCase_CAPS_AND_SMALL_CAPS = {0x01, 0x00, 0x82, 0x16, "", "CAPS_AND_SMALL_CAPS", 0, &_String, &flash_text_engine_TypographicCase, 0}; -static classinfo_t _XML = {0x03, 0x00, 0x89, 0x16, "", "XML", 0, &_Object, interfaces: {0}}; -static methodinfo_t _XML_normalize = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "normalize", 0, &_XML, &_XML, 0}; -static methodinfo_t _XML_removeNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "removeNamespace", 0, &_XML, &_XML, 0}; -static methodinfo_t _XML_prependChild = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "prependChild", 0, &_XML, &_XML, 0}; -static methodinfo_t _XML_toXMLString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toXMLString", 0, &_String, &_XML, 0}; -static methodinfo_t _XML_text = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "text", 0, &_XMLList, &_XML, 0}; -static methodinfo_t _XML_nodeKind = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "nodeKind", 0, &_String, &_XML, 0}; -static methodinfo_t _XML_copy = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "copy", 0, &_XML, &_XML, 0}; -static methodinfo_t _XML_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_XML, 0}; -static methodinfo_t _XML_childIndex = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "childIndex", 0, &_int, &_XML, 0}; -static methodinfo_t _XML_setName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setName", 0, &voidclass, &_XML, 0}; -static methodinfo_t _XML_setLocalName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setLocalName", 0, &voidclass, &_XML, 0}; -static methodinfo_t _XML_namespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "namespace", 0, 0, &_XML, 0}; -static methodinfo_t _XML_insertChildBefore = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "insertChildBefore", 0, 0, &_XML, 0}; -static methodinfo_t _XML_addNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "addNamespace", 0, &_XML, &_XML, 0}; -static methodinfo_t _XML_propertyIsEnumerable = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "propertyIsEnumerable", 0, &_Boolean, &_XML, 0}; -static methodinfo_t _XML_comments = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "comments", 0, &_XMLList, &_XML, 0}; -static methodinfo_t _XML_attributes = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "attributes", 0, &_XMLList, &_XML, 0}; -static methodinfo_t _XML_descendants = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "descendants", 0, &_XMLList, &_XML, 0}; -static methodinfo_t _XML_replace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "replace", 0, &_XML, &_XML, 0}; -static methodinfo_t _XML_setNotification = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setNotification", 0, 0, &_XML, 0}; -static methodinfo_t _XML_children = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "children", 0, &_XMLList, &_XML, 0}; -static methodinfo_t _XML_contains = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "contains", 0, &_Boolean, &_XML, 0}; -static methodinfo_t _XML_hasSimpleContent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasSimpleContent", 0, &_Boolean, &_XML, 0}; -static methodinfo_t _XML_elements = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "elements", 0, &_XMLList, &_XML, 0}; -static methodinfo_t _XML_hasComplexContent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasComplexContent", 0, &_Boolean, &_XML, 0}; -static methodinfo_t _XML_insertChildAfter = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "insertChildAfter", 0, 0, &_XML, 0}; -static methodinfo_t _XML_parent = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "parent", 0, 0, &_XML, 0}; -static methodinfo_t _XML_length = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "length", 0, &_int, &_XML, 0}; -static methodinfo_t _XML_processingInstructions = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "processingInstructions", 0, &_XMLList, &_XML, 0}; -static methodinfo_t _XML_child = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "child", 0, &_XMLList, &_XML, 0}; -static methodinfo_t _XML_appendChild = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "appendChild", 0, &_XML, &_XML, 0}; -static methodinfo_t _XML_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_XML, &_XML, 0}; -static methodinfo_t _XML_localName = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "localName", 0, &_Object, &_XML, 0}; -static methodinfo_t _XML_notification = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "notification", 0, &_Function, &_XML, 0}; -static methodinfo_t _XML_inScopeNamespaces = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "inScopeNamespaces", 0, &_Array, &_XML, 0}; -static methodinfo_t _XML_hasOwnProperty = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "hasOwnProperty", 0, &_Boolean, &_XML, 0}; -static methodinfo_t _XML_namespaceDeclarations = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "namespaceDeclarations", 0, &_Array, &_XML, 0}; -static methodinfo_t _XML_setNamespace = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setNamespace", 0, &voidclass, &_XML, 0}; -static methodinfo_t _XML_name = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "name", 0, &_Object, &_XML, 0}; -static methodinfo_t _XML_setChildren = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "setChildren", 0, &_XML, &_XML, 0}; -static methodinfo_t _XML_attribute = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "attribute", 0, &_XMLList, &_XML, 0}; -static varinfo_t _XML_prettyPrinting = {0x01, 0x00, 0x82, 0x16, "", "prettyPrinting", 0, &_Boolean, &_XML, 0}; -static methodinfo_t _XML_setSettings = {0x02, 0x00, 0x82, 0x08, "http://adobe.com/AS3/2006/builtin", "setSettings", 0, &voidclass, &_XML, 0}; -static varinfo_t _XML_ignoreComments = {0x01, 0x00, 0x82, 0x16, "", "ignoreComments", 0, &_Boolean, &_XML, 0}; -static varinfo_t _XML_prettyIndent = {0x01, 0x00, 0x82, 0x16, "", "prettyIndent", 0, &_int, &_XML, 0}; -static methodinfo_t _XML_settings = {0x02, 0x00, 0x82, 0x08, "http://adobe.com/AS3/2006/builtin", "settings", 0, &_Object, &_XML, 0}; -static varinfo_t _XML_ignoreProcessingInstructions = {0x01, 0x00, 0x82, 0x16, "", "ignoreProcessingInstructions", 0, &_Boolean, &_XML, 0}; -static varinfo_t _XML_ignoreWhitespace = {0x01, 0x00, 0x82, 0x16, "", "ignoreWhitespace", 0, &_Boolean, &_XML, 0}; -static methodinfo_t _XML_defaultSettings = {0x02, 0x00, 0x82, 0x08, "http://adobe.com/AS3/2006/builtin", "defaultSettings", 0, &_Object, &_XML, 0}; -static classinfo_t flash_net_NetStreamInfo = {0x03, 0x00, 0x81, 0x16, "flash.net", "NetStreamInfo", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_net_NetStreamInfo_maxBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "maxBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_dataBufferByteLength = {0x01, 0x00, 0x80, 0x16, "", "dataBufferByteLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_videoByteCount = {0x01, 0x00, 0x80, 0x16, "", "videoByteCount", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_videoBufferLength = {0x01, 0x00, 0x80, 0x16, "", "videoBufferLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_audioBufferByteLength = {0x01, 0x00, 0x80, 0x16, "", "audioBufferByteLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_dataBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "dataBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_SRTT = {0x01, 0x00, 0x80, 0x16, "", "SRTT", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_droppedFrames = {0x01, 0x00, 0x80, 0x16, "", "droppedFrames", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_audioByteCount = {0x01, 0x00, 0x80, 0x16, "", "audioByteCount", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_audioBufferLength = {0x01, 0x00, 0x80, 0x16, "", "audioBufferLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_byteCount = {0x01, 0x00, 0x80, 0x16, "", "byteCount", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static methodinfo_t flash_net_NetStreamInfo_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_dataByteCount = {0x01, 0x00, 0x80, 0x16, "", "dataByteCount", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_videoBufferByteLength = {0x01, 0x00, 0x80, 0x16, "", "videoBufferByteLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_dataBufferLength = {0x01, 0x00, 0x80, 0x16, "", "dataBufferLength", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_audioLossRate = {0x01, 0x00, 0x80, 0x16, "", "audioLossRate", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_videoBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "videoBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_currentBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "currentBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_audioBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "audioBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static varinfo_t flash_net_NetStreamInfo_playbackBytesPerSecond = {0x01, 0x00, 0x80, 0x16, "", "playbackBytesPerSecond", 0, &_Number, &flash_net_NetStreamInfo, 0}; -static classinfo_t flash_display_Stage = {0x03, 0x00, 0x80, 0x16, "flash.display", "Stage", 0, &flash_display_DisplayObjectContainer, interfaces: {0}}; -static methodinfo_t flash_display_Stage_setChildIndex = {0x02, 0x00, 0x80, 0x16, "", "setChildIndex", 0, &voidclass, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_stageFocusRect = {0x01, 0x00, 0x80, 0x16, "", "stageFocusRect", 0, &_Boolean, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_frameRate = {0x01, 0x00, 0x80, 0x16, "", "frameRate", 0, &_Number, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_invalidate = {0x02, 0x00, 0x80, 0x16, "", "invalidate", 0, &voidclass, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_textSnapshot = {0x01, 0x00, 0x80, 0x16, "", "textSnapshot", 0, &flash_text_TextSnapshot, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_String, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_willTrigger = {0x02, 0x00, 0x80, 0x16, "", "willTrigger", 0, &_Boolean, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_dispatchEvent = {0x02, 0x00, 0x80, 0x16, "", "dispatchEvent", 0, &_Boolean, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_isFocusInaccessible = {0x02, 0x00, 0x80, 0x16, "", "isFocusInaccessible", 0, &_Boolean, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_removeChildAt = {0x02, 0x00, 0x80, 0x16, "", "removeChildAt", 0, &flash_display_DisplayObject, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_fullScreenWidth = {0x01, 0x00, 0x80, 0x16, "", "fullScreenWidth", 0, &_uint, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_addChildAt = {0x02, 0x00, 0x80, 0x16, "", "addChildAt", 0, &flash_display_DisplayObject, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_fullScreenSourceRect = {0x01, 0x00, 0x80, 0x16, "", "fullScreenSourceRect", 0, &flash_geom_Rectangle, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_addChild = {0x02, 0x00, 0x80, 0x16, "", "addChild", 0, &flash_display_DisplayObject, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_numChildren = {0x01, 0x00, 0x80, 0x16, "", "numChildren", 0, &_int, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_mouseChildren = {0x01, 0x00, 0x80, 0x16, "", "mouseChildren", 0, &_Boolean, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_swapChildrenAt = {0x02, 0x00, 0x80, 0x16, "", "swapChildrenAt", 0, &voidclass, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_showDefaultContextMenu = {0x01, 0x00, 0x80, 0x16, "", "showDefaultContextMenu", 0, &_Boolean, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_addEventListener = {0x02, 0x00, 0x80, 0x16, "", "addEventListener", 0, &voidclass, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_stageHeight = {0x01, 0x00, 0x80, 0x16, "", "stageHeight", 0, &_int, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_fullScreenHeight = {0x01, 0x00, 0x80, 0x16, "", "fullScreenHeight", 0, &_uint, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_align = {0x01, 0x00, 0x80, 0x16, "", "align", 0, &_String, &flash_display_Stage, 0}; -static methodinfo_t flash_display_Stage_hasEventListener = {0x02, 0x00, 0x80, 0x16, "", "hasEventListener", 0, &_Boolean, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_displayState = {0x01, 0x00, 0x80, 0x16, "", "displayState", 0, &_String, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_scaleMode = {0x01, 0x00, 0x80, 0x16, "", "scaleMode", 0, &_String, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_tabChildren = {0x01, 0x00, 0x80, 0x16, "", "tabChildren", 0, &_Boolean, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_focus = {0x01, 0x00, 0x80, 0x16, "", "focus", 0, &flash_display_InteractiveObject, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_colorCorrection = {0x01, 0x00, 0x80, 0x16, "", "colorCorrection", 0, &_String, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_colorCorrectionSupport = {0x01, 0x00, 0x80, 0x16, "", "colorCorrectionSupport", 0, &_String, &flash_display_Stage, 0}; -static varinfo_t flash_display_Stage_stageWidth = {0x01, 0x00, 0x80, 0x16, "", "stageWidth", 0, &_int, &flash_display_Stage, 0}; -static classinfo_t flash_ui_ContextMenuItem = {0x03, 0x00, 0x81, 0x16, "flash.ui", "ContextMenuItem", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_ui_ContextMenuItem_separatorBefore = {0x01, 0x00, 0x80, 0x16, "", "separatorBefore", 0, &_Boolean, &flash_ui_ContextMenuItem, 0}; -static varinfo_t flash_ui_ContextMenuItem_enabled = {0x01, 0x00, 0x80, 0x16, "", "enabled", 0, &_Boolean, &flash_ui_ContextMenuItem, 0}; -static varinfo_t flash_ui_ContextMenuItem_caption = {0x01, 0x00, 0x80, 0x16, "", "caption", 0, &_String, &flash_ui_ContextMenuItem, 0}; -static methodinfo_t flash_ui_ContextMenuItem_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_ui_ContextMenuItem, &flash_ui_ContextMenuItem, 0}; -static varinfo_t flash_ui_ContextMenuItem_visible = {0x01, 0x00, 0x80, 0x16, "", "visible", 0, &_Boolean, &flash_ui_ContextMenuItem, 0}; -static classinfo_t flash_trace_Trace = {0x03, 0x00, 0x80, 0x16, "flash.trace", "Trace", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_trace_Trace_METHODS_AND_LINES_WITH_ARGS = {0x01, 0x00, 0x82, 0x16, "", "METHODS_AND_LINES_WITH_ARGS", 0, &_int, &flash_trace_Trace, 0}; -static varinfo_t flash_trace_Trace_FILE = {0x01, 0x00, 0x82, 0x16, "", "FILE", 0, 0, &flash_trace_Trace, 0}; -static varinfo_t flash_trace_Trace_METHODS_WITH_ARGS = {0x01, 0x00, 0x82, 0x16, "", "METHODS_WITH_ARGS", 0, &_int, &flash_trace_Trace, 0}; -static varinfo_t flash_trace_Trace_OFF = {0x01, 0x00, 0x82, 0x16, "", "OFF", 0, &_int, &flash_trace_Trace, 0}; -static varinfo_t flash_trace_Trace_METHODS_AND_LINES = {0x01, 0x00, 0x82, 0x16, "", "METHODS_AND_LINES", 0, &_int, &flash_trace_Trace, 0}; -static varinfo_t flash_trace_Trace_LISTENER = {0x01, 0x00, 0x82, 0x16, "", "LISTENER", 0, 0, &flash_trace_Trace, 0}; -static methodinfo_t flash_trace_Trace_getLevel = {0x02, 0x00, 0x82, 0x16, "", "getLevel", 0, &_int, &flash_trace_Trace, 0}; -static methodinfo_t flash_trace_Trace_setLevel = {0x02, 0x00, 0x82, 0x16, "", "setLevel", 0, 0, &flash_trace_Trace, 0}; -static methodinfo_t flash_trace_Trace_setListener = {0x02, 0x00, 0x82, 0x16, "", "setListener", 0, 0, &flash_trace_Trace, 0}; -static methodinfo_t flash_trace_Trace_getListener = {0x02, 0x00, 0x82, 0x16, "", "getListener", 0, &_Function, &flash_trace_Trace, 0}; -static varinfo_t flash_trace_Trace_METHODS = {0x01, 0x00, 0x82, 0x16, "", "METHODS", 0, &_int, &flash_trace_Trace, 0}; -static classinfo_t flash_events_TimerEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "TimerEvent", 0, &flash_events_Event, interfaces: {0}}; -static methodinfo_t flash_events_TimerEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_TimerEvent, 0}; -static methodinfo_t flash_events_TimerEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_TimerEvent, 0}; -static methodinfo_t flash_events_TimerEvent_updateAfterEvent = {0x02, 0x00, 0x80, 0x16, "", "updateAfterEvent", 0, &voidclass, &flash_events_TimerEvent, 0}; -static varinfo_t flash_events_TimerEvent_TIMER_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "TIMER_COMPLETE", 0, &_String, &flash_events_TimerEvent, 0}; -static varinfo_t flash_events_TimerEvent_TIMER = {0x01, 0x00, 0x82, 0x16, "", "TIMER", 0, &_String, &flash_events_TimerEvent, 0}; -static classinfo_t flash_events_SampleDataEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "SampleDataEvent", 0, &flash_events_Event, interfaces: {0}}; -static methodinfo_t flash_events_SampleDataEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_SampleDataEvent, 0}; -static varinfo_t flash_events_SampleDataEvent_position = {0x01, 0x00, 0x80, 0x16, "", "position", 0, &_Number, &flash_events_SampleDataEvent, 0}; -static methodinfo_t flash_events_SampleDataEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_SampleDataEvent, 0}; -static varinfo_t flash_events_SampleDataEvent_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &flash_utils_ByteArray, &flash_events_SampleDataEvent, 0}; -static varinfo_t flash_events_SampleDataEvent_SAMPLE_DATA = {0x01, 0x00, 0x82, 0x16, "", "SAMPLE_DATA", 0, &_String, &flash_events_SampleDataEvent, 0}; -static classinfo_t flash_display_ShaderPrecision = {0x03, 0x00, 0x81, 0x16, "flash.display", "ShaderPrecision", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_ShaderPrecision_FULL = {0x01, 0x00, 0x82, 0x16, "", "FULL", 0, &_String, &flash_display_ShaderPrecision, 0}; -static varinfo_t flash_display_ShaderPrecision_FAST = {0x01, 0x00, 0x82, 0x16, "", "FAST", 0, &_String, &flash_display_ShaderPrecision, 0}; -static classinfo_t flash_net_FileReference = {0x03, 0x00, 0x80, 0x16, "flash.net", "FileReference", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_net_FileReference_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_net_FileReference, 0}; -static methodinfo_t flash_net_FileReference_browse = {0x02, 0x00, 0x80, 0x16, "", "browse", 0, &_Boolean, &flash_net_FileReference, 0}; -static varinfo_t flash_net_FileReference_creationDate = {0x01, 0x00, 0x80, 0x16, "", "creationDate", 0, &_Date, &flash_net_FileReference, 0}; -static methodinfo_t flash_net_FileReference_upload = {0x02, 0x00, 0x80, 0x16, "", "upload", 0, &voidclass, &flash_net_FileReference, 0}; -static methodinfo_t flash_net_FileReference_download = {0x02, 0x00, 0x80, 0x16, "", "download", 0, &voidclass, &flash_net_FileReference, 0}; -static methodinfo_t flash_net_FileReference_save = {0x02, 0x00, 0x80, 0x16, "", "save", 0, &voidclass, &flash_net_FileReference, 0}; -static methodinfo_t flash_net_FileReference_cancel = {0x02, 0x00, 0x80, 0x16, "", "cancel", 0, &voidclass, &flash_net_FileReference, 0}; -static varinfo_t flash_net_FileReference_creator = {0x01, 0x00, 0x80, 0x16, "", "creator", 0, &_String, &flash_net_FileReference, 0}; -static varinfo_t flash_net_FileReference_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &flash_utils_ByteArray, &flash_net_FileReference, 0}; -static varinfo_t flash_net_FileReference_size = {0x01, 0x00, 0x80, 0x16, "", "size", 0, &_uint, &flash_net_FileReference, 0}; -static varinfo_t flash_net_FileReference_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_net_FileReference, 0}; -static methodinfo_t flash_net_FileReference_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_net_FileReference, 0}; -static varinfo_t flash_net_FileReference_modificationDate = {0x01, 0x00, 0x80, 0x16, "", "modificationDate", 0, &_Date, &flash_net_FileReference, 0}; -static classinfo_t _DefinitionError = {0x03, 0x00, 0x88, 0x16, "", "DefinitionError", 0, &_Error, interfaces: {0}}; -static varinfo_t _DefinitionError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_DefinitionError, 0}; -static classinfo_t flash_events_EventDispatcher = {0x03, 0x00, 0x80, 0x16, "flash.events", "EventDispatcher", 0, &_Object, interfaces: {&flash_events_IEventDispatcher, 0}}; -static methodinfo_t flash_events_EventDispatcher_willTrigger = {0x02, 0x00, 0x80, 0x16, "", "willTrigger", 0, &_Boolean, &flash_events_EventDispatcher, 0}; -static methodinfo_t flash_events_EventDispatcher_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_EventDispatcher, 0}; -static methodinfo_t flash_events_EventDispatcher_removeEventListener = {0x02, 0x00, 0x80, 0x16, "", "removeEventListener", 0, &voidclass, &flash_events_EventDispatcher, 0}; -static methodinfo_t flash_events_EventDispatcher_hasEventListener = {0x02, 0x00, 0x80, 0x16, "", "hasEventListener", 0, &_Boolean, &flash_events_EventDispatcher, 0}; -static methodinfo_t flash_events_EventDispatcher_addEventListener = {0x02, 0x00, 0x80, 0x16, "", "addEventListener", 0, &voidclass, &flash_events_EventDispatcher, 0}; -static methodinfo_t flash_events_EventDispatcher_dispatchEvent = {0x02, 0x00, 0x80, 0x16, "", "dispatchEvent", 0, &_Boolean, &flash_events_EventDispatcher, 0}; -static classinfo_t flash_net_SharedObjectFlushStatus = {0x03, 0x00, 0x81, 0x16, "flash.net", "SharedObjectFlushStatus", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_net_SharedObjectFlushStatus_FLUSHED = {0x01, 0x00, 0x82, 0x16, "", "FLUSHED", 0, &_String, &flash_net_SharedObjectFlushStatus, 0}; -static varinfo_t flash_net_SharedObjectFlushStatus_PENDING = {0x01, 0x00, 0x82, 0x16, "", "PENDING", 0, &_String, &flash_net_SharedObjectFlushStatus, 0}; -static classinfo_t flash_text_TextLineMetrics = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextLineMetrics", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextLineMetrics_descent = {0x01, 0x00, 0x80, 0x16, "", "descent", 0, &_Number, &flash_text_TextLineMetrics, 0}; -static varinfo_t flash_text_TextLineMetrics_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_text_TextLineMetrics, 0}; -static varinfo_t flash_text_TextLineMetrics_ascent = {0x01, 0x00, 0x80, 0x16, "", "ascent", 0, &_Number, &flash_text_TextLineMetrics, 0}; -static varinfo_t flash_text_TextLineMetrics_leading = {0x01, 0x00, 0x80, 0x16, "", "leading", 0, &_Number, &flash_text_TextLineMetrics, 0}; -static varinfo_t flash_text_TextLineMetrics_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_text_TextLineMetrics, 0}; -static varinfo_t flash_text_TextLineMetrics_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_text_TextLineMetrics, 0}; -static classinfo_t flash_text_AntiAliasType = {0x03, 0x00, 0x81, 0x16, "flash.text", "AntiAliasType", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_AntiAliasType_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_text_AntiAliasType, 0}; -static varinfo_t flash_text_AntiAliasType_ADVANCED = {0x01, 0x00, 0x82, 0x16, "", "ADVANCED", 0, &_String, &flash_text_AntiAliasType, 0}; -static classinfo_t flash_system_SecurityDomain = {0x03, 0x00, 0x80, 0x16, "flash.system", "SecurityDomain", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_system_SecurityDomain_currentDomain = {0x01, 0x00, 0x82, 0x16, "", "currentDomain", 0, &flash_system_SecurityDomain, &flash_system_SecurityDomain, 0}; -static classinfo_t flash_text_Font = {0x03, 0x00, 0x80, 0x16, "flash.text", "Font", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_text_Font_hasGlyphs = {0x02, 0x00, 0x80, 0x16, "", "hasGlyphs", 0, &_Boolean, &flash_text_Font, 0}; -static varinfo_t flash_text_Font_fontName = {0x01, 0x00, 0x80, 0x16, "", "fontName", 0, &_String, &flash_text_Font, 0}; -static varinfo_t flash_text_Font_fontStyle = {0x01, 0x00, 0x80, 0x16, "", "fontStyle", 0, &_String, &flash_text_Font, 0}; -static varinfo_t flash_text_Font_fontType = {0x01, 0x00, 0x80, 0x16, "", "fontType", 0, &_String, &flash_text_Font, 0}; -static methodinfo_t flash_text_Font_enumerateFonts = {0x02, 0x00, 0x82, 0x16, "", "enumerateFonts", 0, &_Array, &flash_text_Font, 0}; -static methodinfo_t flash_text_Font_registerFont = {0x02, 0x00, 0x82, 0x16, "", "registerFont", 0, &voidclass, &flash_text_Font, 0}; -static classinfo_t _RegExp = {0x03, 0x00, 0x88, 0x16, "", "RegExp", 0, &_Object, interfaces: {0}}; -static varinfo_t _RegExp_source = {0x01, 0x00, 0x80, 0x16, "", "source", 0, &_String, &_RegExp, 0}; -static methodinfo_t _RegExp_test = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "test", 0, &_Boolean, &_RegExp, 0}; -static varinfo_t _RegExp_global = {0x01, 0x00, 0x80, 0x16, "", "global", 0, &_Boolean, &_RegExp, 0}; -static methodinfo_t _RegExp_exec = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "exec", 0, 0, &_RegExp, 0}; -static varinfo_t _RegExp_ignoreCase = {0x01, 0x00, 0x80, 0x16, "", "ignoreCase", 0, &_Boolean, &_RegExp, 0}; -static varinfo_t _RegExp_dotall = {0x01, 0x00, 0x80, 0x16, "", "dotall", 0, &_Boolean, &_RegExp, 0}; -static varinfo_t _RegExp_lastIndex = {0x01, 0x00, 0x80, 0x16, "", "lastIndex", 0, &_int, &_RegExp, 0}; -static varinfo_t _RegExp_extended = {0x01, 0x00, 0x80, 0x16, "", "extended", 0, &_Boolean, &_RegExp, 0}; -static varinfo_t _RegExp_multiline = {0x01, 0x00, 0x80, 0x16, "", "multiline", 0, &_Boolean, &_RegExp, 0}; -static varinfo_t _RegExp_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_RegExp, 0}; -static classinfo_t flash_accessibility_AccessibilityProperties = {0x03, 0x00, 0x80, 0x16, "flash.accessibility", "AccessibilityProperties", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_accessibility_AccessibilityProperties_forceSimple = {0x01, 0x00, 0x80, 0x16, "", "forceSimple", 0, &_Boolean, &flash_accessibility_AccessibilityProperties, 0}; -static varinfo_t flash_accessibility_AccessibilityProperties_noAutoLabeling = {0x01, 0x00, 0x80, 0x16, "", "noAutoLabeling", 0, &_Boolean, &flash_accessibility_AccessibilityProperties, 0}; -static varinfo_t flash_accessibility_AccessibilityProperties_description = {0x01, 0x00, 0x80, 0x16, "", "description", 0, &_String, &flash_accessibility_AccessibilityProperties, 0}; -static varinfo_t flash_accessibility_AccessibilityProperties_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_accessibility_AccessibilityProperties, 0}; -static varinfo_t flash_accessibility_AccessibilityProperties_shortcut = {0x01, 0x00, 0x80, 0x16, "", "shortcut", 0, &_String, &flash_accessibility_AccessibilityProperties, 0}; -static varinfo_t flash_accessibility_AccessibilityProperties_silent = {0x01, 0x00, 0x80, 0x16, "", "silent", 0, &_Boolean, &flash_accessibility_AccessibilityProperties, 0}; -static classinfo_t flash_ui_ContextMenu = {0x03, 0x00, 0x81, 0x16, "flash.ui", "ContextMenu", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static methodinfo_t flash_ui_ContextMenu_hideBuiltInItems = {0x02, 0x00, 0x80, 0x16, "", "hideBuiltInItems", 0, &voidclass, &flash_ui_ContextMenu, 0}; -static varinfo_t flash_ui_ContextMenu_clipboardItems = {0x01, 0x00, 0x80, 0x16, "", "clipboardItems", 0, &flash_ui_ContextMenuClipboardItems, &flash_ui_ContextMenu, 0}; -static varinfo_t flash_ui_ContextMenu_builtInItems = {0x01, 0x00, 0x80, 0x16, "", "builtInItems", 0, &flash_ui_ContextMenuBuiltInItems, &flash_ui_ContextMenu, 0}; -static varinfo_t flash_ui_ContextMenu_customItems = {0x01, 0x00, 0x80, 0x16, "", "customItems", 0, &_Array, &flash_ui_ContextMenu, 0}; -static methodinfo_t flash_ui_ContextMenu_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_ui_ContextMenu, &flash_ui_ContextMenu, 0}; -static varinfo_t flash_ui_ContextMenu_link = {0x01, 0x00, 0x80, 0x16, "", "link", 0, &flash_net_URLRequest, &flash_ui_ContextMenu, 0}; -static varinfo_t flash_ui_ContextMenu_clipboardMenu = {0x01, 0x00, 0x80, 0x16, "", "clipboardMenu", 0, &_Boolean, &flash_ui_ContextMenu, 0}; -static classinfo_t flash_text_TextFieldAutoSize = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextFieldAutoSize", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextFieldAutoSize_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_String, &flash_text_TextFieldAutoSize, 0}; -static varinfo_t flash_text_TextFieldAutoSize_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_String, &flash_text_TextFieldAutoSize, 0}; -static varinfo_t flash_text_TextFieldAutoSize_CENTER = {0x01, 0x00, 0x82, 0x16, "", "CENTER", 0, &_String, &flash_text_TextFieldAutoSize, 0}; -static varinfo_t flash_text_TextFieldAutoSize_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_TextFieldAutoSize, 0}; -static classinfo_t _Math = {0x03, 0x00, 0x81, 0x16, "", "Math", 0, &_Object, interfaces: {0}}; -static methodinfo_t _Math_ceil = {0x02, 0x00, 0x82, 0x16, "", "ceil", 0, &_Number, &_Math, 0}; -static varinfo_t _Math_SQRT2 = {0x01, 0x00, 0x82, 0x16, "", "SQRT2", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_cos = {0x02, 0x00, 0x82, 0x16, "", "cos", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_abs = {0x02, 0x00, 0x82, 0x16, "", "abs", 0, &_Number, &_Math, 0}; -static varinfo_t _Math_PI = {0x01, 0x00, 0x82, 0x16, "", "PI", 0, &_Number, &_Math, 0}; -static varinfo_t _Math_E = {0x01, 0x00, 0x82, 0x16, "", "E", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_round = {0x02, 0x00, 0x82, 0x16, "", "round", 0, &_Number, &_Math, 0}; -static varinfo_t _Math_LN10 = {0x01, 0x00, 0x82, 0x16, "", "LN10", 0, &_Number, &_Math, 0}; -static varinfo_t _Math_SQRT1_2 = {0x01, 0x00, 0x82, 0x16, "", "SQRT1_2", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_log = {0x02, 0x00, 0x82, 0x16, "", "log", 0, &_Number, &_Math, 0}; -static varinfo_t _Math_LOG10E = {0x01, 0x00, 0x82, 0x16, "", "LOG10E", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_random = {0x02, 0x00, 0x82, 0x16, "", "random", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_acos = {0x02, 0x00, 0x82, 0x16, "", "acos", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_tan = {0x02, 0x00, 0x82, 0x16, "", "tan", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_asin = {0x02, 0x00, 0x82, 0x16, "", "asin", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_exp = {0x02, 0x00, 0x82, 0x16, "", "exp", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_atan2 = {0x02, 0x00, 0x82, 0x16, "", "atan2", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_pow = {0x02, 0x00, 0x82, 0x16, "", "pow", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_min = {0x02, 0x00, 0x82, 0x16, "", "min", 0, &_Number, &_Math, 0}; -static varinfo_t _Math_LN2 = {0x01, 0x00, 0x82, 0x16, "", "LN2", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_sin = {0x02, 0x00, 0x82, 0x16, "", "sin", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_sqrt = {0x02, 0x00, 0x82, 0x16, "", "sqrt", 0, &_Number, &_Math, 0}; -static varinfo_t _Math_LOG2E = {0x01, 0x00, 0x82, 0x16, "", "LOG2E", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_max = {0x02, 0x00, 0x82, 0x16, "", "max", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_atan = {0x02, 0x00, 0x82, 0x16, "", "atan", 0, &_Number, &_Math, 0}; -static methodinfo_t _Math_floor = {0x02, 0x00, 0x82, 0x16, "", "floor", 0, &_Number, &_Math, 0}; -static classinfo_t flash_display_ColorCorrectionSupport = {0x03, 0x00, 0x81, 0x16, "flash.display", "ColorCorrectionSupport", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_ColorCorrectionSupport_UNSUPPORTED = {0x01, 0x00, 0x82, 0x16, "", "UNSUPPORTED", 0, &_String, &flash_display_ColorCorrectionSupport, 0}; -static varinfo_t flash_display_ColorCorrectionSupport_DEFAULT_ON = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT_ON", 0, &_String, &flash_display_ColorCorrectionSupport, 0}; -static varinfo_t flash_display_ColorCorrectionSupport_DEFAULT_OFF = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT_OFF", 0, &_String, &flash_display_ColorCorrectionSupport, 0}; -static classinfo_t flash_errors_IOError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "IOError", 0, &_Error, interfaces: {0}}; -static methodinfo_t _trace = {0x02, 0x00, 0x82, 0x16, "", "trace", 0, &voidclass, 0, 0}; -static classinfo_t flash_ui_ContextMenuBuiltInItems = {0x03, 0x00, 0x81, 0x16, "flash.ui", "ContextMenuBuiltInItems", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_ui_ContextMenuBuiltInItems_zoom = {0x01, 0x00, 0x80, 0x16, "", "zoom", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; -static varinfo_t flash_ui_ContextMenuBuiltInItems_save = {0x01, 0x00, 0x80, 0x16, "", "save", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; -static varinfo_t flash_ui_ContextMenuBuiltInItems_loop = {0x01, 0x00, 0x80, 0x16, "", "loop", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; -static varinfo_t flash_ui_ContextMenuBuiltInItems_print = {0x01, 0x00, 0x80, 0x16, "", "print", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; -static varinfo_t flash_ui_ContextMenuBuiltInItems_forwardAndBack = {0x01, 0x00, 0x80, 0x16, "", "forwardAndBack", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; -static varinfo_t flash_ui_ContextMenuBuiltInItems_rewind = {0x01, 0x00, 0x80, 0x16, "", "rewind", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; -static methodinfo_t flash_ui_ContextMenuBuiltInItems_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_ui_ContextMenuBuiltInItems, &flash_ui_ContextMenuBuiltInItems, 0}; -static varinfo_t flash_ui_ContextMenuBuiltInItems_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; -static varinfo_t flash_ui_ContextMenuBuiltInItems_play = {0x01, 0x00, 0x80, 0x16, "", "play", 0, &_Boolean, &flash_ui_ContextMenuBuiltInItems, 0}; -static classinfo_t flash_net_FileReferenceList = {0x03, 0x00, 0x80, 0x16, "flash.net", "FileReferenceList", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_net_FileReferenceList_fileList = {0x01, 0x00, 0x80, 0x16, "", "fileList", 0, &_Array, &flash_net_FileReferenceList, 0}; -static methodinfo_t flash_net_FileReferenceList_browse = {0x02, 0x00, 0x80, 0x16, "", "browse", 0, &_Boolean, &flash_net_FileReferenceList, 0}; -static classinfo_t flash_display_TriangleCulling = {0x03, 0x00, 0x81, 0x16, "flash.display", "TriangleCulling", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_TriangleCulling_POSITIVE = {0x01, 0x00, 0x82, 0x16, "", "POSITIVE", 0, &_String, &flash_display_TriangleCulling, 0}; -static varinfo_t flash_display_TriangleCulling_NEGATIVE = {0x01, 0x00, 0x82, 0x16, "", "NEGATIVE", 0, &_String, &flash_display_TriangleCulling, 0}; -static varinfo_t flash_display_TriangleCulling_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_display_TriangleCulling, 0}; -static classinfo_t flash_media_SoundMixer = {0x03, 0x00, 0x81, 0x16, "flash.media", "SoundMixer", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_media_SoundMixer_computeSpectrum = {0x02, 0x00, 0x82, 0x16, "", "computeSpectrum", 0, &voidclass, &flash_media_SoundMixer, 0}; -static methodinfo_t flash_media_SoundMixer_areSoundsInaccessible = {0x02, 0x00, 0x82, 0x16, "", "areSoundsInaccessible", 0, &_Boolean, &flash_media_SoundMixer, 0}; -static varinfo_t flash_media_SoundMixer_soundTransform = {0x01, 0x00, 0x82, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_media_SoundMixer, 0}; -static varinfo_t flash_media_SoundMixer_bufferTime = {0x01, 0x00, 0x82, 0x16, "", "bufferTime", 0, &_int, &flash_media_SoundMixer, 0}; -static methodinfo_t flash_media_SoundMixer_stopAll = {0x02, 0x00, 0x82, 0x16, "", "stopAll", 0, &voidclass, &flash_media_SoundMixer, 0}; -static classinfo_t adobe_utils_XMLUI = {0x03, 0x00, 0x81, 0x16, "adobe.utils", "XMLUI", 0, &_Object, interfaces: {0}}; -static methodinfo_t adobe_utils_XMLUI_cancel = {0x02, 0x00, 0x82, 0x16, "", "cancel", 0, &voidclass, &adobe_utils_XMLUI, 0}; -static methodinfo_t adobe_utils_XMLUI_setProperty = {0x02, 0x00, 0x82, 0x16, "", "setProperty", 0, &voidclass, &adobe_utils_XMLUI, 0}; -static methodinfo_t adobe_utils_XMLUI_getProperty = {0x02, 0x00, 0x82, 0x16, "", "getProperty", 0, &_String, &adobe_utils_XMLUI, 0}; -static methodinfo_t adobe_utils_XMLUI_accept = {0x02, 0x00, 0x82, 0x16, "", "accept", 0, &voidclass, &adobe_utils_XMLUI, 0}; -static methodinfo_t _escape = {0x02, 0x00, 0x82, 0x16, "", "escape", 0, &_String, 0, 0}; -static methodinfo_t flash_utils_setInterval = {0x02, 0x00, 0x82, 0x16, "flash.utils", "setInterval", 0, &_uint, 0, 0}; -static classinfo_t flash_events_StatusEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "StatusEvent", 0, &flash_events_Event, interfaces: {0}}; -static methodinfo_t flash_events_StatusEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_StatusEvent, 0}; -static varinfo_t flash_events_StatusEvent_code = {0x01, 0x00, 0x80, 0x16, "", "code", 0, &_String, &flash_events_StatusEvent, 0}; -static methodinfo_t flash_events_StatusEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_StatusEvent, 0}; -static varinfo_t flash_events_StatusEvent_level = {0x01, 0x00, 0x80, 0x16, "", "level", 0, &_String, &flash_events_StatusEvent, 0}; -static varinfo_t flash_events_StatusEvent_STATUS = {0x01, 0x00, 0x82, 0x16, "", "STATUS", 0, &_String, &flash_events_StatusEvent, 0}; -static classinfo_t flash_display_IGraphicsPath = {0x03, 0x00, 0x90, 0x16, "flash.display", "IGraphicsPath", 0, 0, interfaces: {0}}; -static classinfo_t flash_events_ShaderEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ShaderEvent", 0, &flash_events_Event, interfaces: {0}}; -static varinfo_t flash_events_ShaderEvent_vector = {0x01, 0x00, 0x80, 0x16, "", "vector", 0, &__AS3___vec_Vector, &flash_events_ShaderEvent, 0}; -static methodinfo_t flash_events_ShaderEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ShaderEvent, 0}; -static varinfo_t flash_events_ShaderEvent_bitmapData = {0x01, 0x00, 0x80, 0x16, "", "bitmapData", 0, &flash_display_BitmapData, &flash_events_ShaderEvent, 0}; -static methodinfo_t flash_events_ShaderEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ShaderEvent, 0}; -static varinfo_t flash_events_ShaderEvent_byteArray = {0x01, 0x00, 0x80, 0x16, "", "byteArray", 0, &flash_utils_ByteArray, &flash_events_ShaderEvent, 0}; -static varinfo_t flash_events_ShaderEvent_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "COMPLETE", 0, &_String, &flash_events_ShaderEvent, 0}; -static classinfo_t flash_display_Shader = {0x03, 0x00, 0x80, 0x16, "flash.display", "Shader", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_Shader_precisionHint = {0x01, 0x00, 0x80, 0x16, "", "precisionHint", 0, &_String, &flash_display_Shader, 0}; -static varinfo_t flash_display_Shader_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &flash_display_ShaderData, &flash_display_Shader, 0}; -static classinfo_t flash_errors_StackOverflowError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "StackOverflowError", 0, &_Error, interfaces: {0}}; -static methodinfo_t flash_sampler_getInvocationCount = {0x02, 0x00, 0x82, 0x16, "flash.sampler", "getInvocationCount", 0, &_Number, 0, 0}; -static classinfo_t flash_text_engine_Kerning = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "Kerning", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_Kerning_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_text_engine_Kerning, 0}; -static varinfo_t flash_text_engine_Kerning_OFF = {0x01, 0x00, 0x82, 0x16, "", "OFF", 0, &_String, &flash_text_engine_Kerning, 0}; -static varinfo_t flash_text_engine_Kerning_ON = {0x01, 0x00, 0x82, 0x16, "", "ON", 0, &_String, &flash_text_engine_Kerning, 0}; -static classinfo_t flash_text_CSMSettings = {0x03, 0x00, 0x81, 0x16, "flash.text", "CSMSettings", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_CSMSettings_fontSize = {0x01, 0x00, 0x80, 0x16, "", "fontSize", 0, &_Number, &flash_text_CSMSettings, 0}; -static varinfo_t flash_text_CSMSettings_outsideCutoff = {0x01, 0x00, 0x80, 0x16, "", "outsideCutoff", 0, &_Number, &flash_text_CSMSettings, 0}; -static varinfo_t flash_text_CSMSettings_insideCutoff = {0x01, 0x00, 0x80, 0x16, "", "insideCutoff", 0, &_Number, &flash_text_CSMSettings, 0}; -static classinfo_t _RangeError = {0x03, 0x00, 0x88, 0x16, "", "RangeError", 0, &_Error, interfaces: {0}}; -static varinfo_t _RangeError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_RangeError, 0}; -static classinfo_t _Number = {0x03, 0x00, 0x81, 0x16, "", "Number", 0, &_Object, interfaces: {0}}; -static methodinfo_t _Number_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_Number, &_Number, 0}; -static methodinfo_t _Number_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_Number, 0}; -static methodinfo_t _Number_toExponential = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toExponential", 0, &_String, &_Number, 0}; -static methodinfo_t _Number_toFixed = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toFixed", 0, &_String, &_Number, 0}; -static methodinfo_t _Number_toPrecision = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toPrecision", 0, &_String, &_Number, 0}; -static varinfo_t _Number_MAX_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MAX_VALUE", 0, &_Number, &_Number, 0}; -static varinfo_t _Number_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_Number, 0}; -static varinfo_t _Number_MIN_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MIN_VALUE", 0, &_Number, &_Number, 0}; -static varinfo_t _Number_NaN = {0x01, 0x00, 0x82, 0x16, "", "NaN", 0, &_Number, &_Number, 0}; -static varinfo_t _Number_POSITIVE_INFINITY = {0x01, 0x00, 0x82, 0x16, "", "POSITIVE_INFINITY", 0, &_Number, &_Number, 0}; -static varinfo_t _Number_NEGATIVE_INFINITY = {0x01, 0x00, 0x82, 0x16, "", "NEGATIVE_INFINITY", 0, &_Number, &_Number, 0}; -static classinfo_t flash_display_Graphics = {0x03, 0x00, 0x81, 0x16, "flash.display", "Graphics", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_display_Graphics_drawPath = {0x02, 0x00, 0x80, 0x16, "", "drawPath", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_drawEllipse = {0x02, 0x00, 0x80, 0x16, "", "drawEllipse", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_drawRoundRectComplex = {0x02, 0x00, 0x80, 0x16, "", "drawRoundRectComplex", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_moveTo = {0x02, 0x00, 0x80, 0x16, "", "moveTo", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_lineShaderStyle = {0x02, 0x00, 0x80, 0x16, "", "lineShaderStyle", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_beginFill = {0x02, 0x00, 0x80, 0x16, "", "beginFill", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_beginGradientFill = {0x02, 0x00, 0x80, 0x16, "", "beginGradientFill", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_drawGraphicsData = {0x02, 0x00, 0x80, 0x16, "", "drawGraphicsData", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_lineGradientStyle = {0x02, 0x00, 0x80, 0x16, "", "lineGradientStyle", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_drawRoundRect = {0x02, 0x00, 0x80, 0x16, "", "drawRoundRect", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_beginBitmapFill = {0x02, 0x00, 0x80, 0x16, "", "beginBitmapFill", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_lineStyle = {0x02, 0x00, 0x80, 0x16, "", "lineStyle", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_lineTo = {0x02, 0x00, 0x80, 0x16, "", "lineTo", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_endFill = {0x02, 0x00, 0x80, 0x16, "", "endFill", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_copyFrom = {0x02, 0x00, 0x80, 0x16, "", "copyFrom", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_lineBitmapStyle = {0x02, 0x00, 0x80, 0x16, "", "lineBitmapStyle", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_curveTo = {0x02, 0x00, 0x80, 0x16, "", "curveTo", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_clear = {0x02, 0x00, 0x80, 0x16, "", "clear", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_drawCircle = {0x02, 0x00, 0x80, 0x16, "", "drawCircle", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_beginShaderFill = {0x02, 0x00, 0x80, 0x16, "", "beginShaderFill", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_drawTriangles = {0x02, 0x00, 0x80, 0x16, "", "drawTriangles", 0, &voidclass, &flash_display_Graphics, 0}; -static methodinfo_t flash_display_Graphics_drawRect = {0x02, 0x00, 0x80, 0x16, "", "drawRect", 0, &voidclass, &flash_display_Graphics, 0}; -static classinfo_t _SyntaxError = {0x03, 0x00, 0x88, 0x16, "", "SyntaxError", 0, &_Error, interfaces: {0}}; -static varinfo_t _SyntaxError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_SyntaxError, 0}; -static classinfo_t flash_sampler_NewObjectSample = {0x03, 0x00, 0x81, 0x16, "flash.sampler", "NewObjectSample", 0, &flash_sampler_Sample, interfaces: {0}}; -static varinfo_t flash_sampler_NewObjectSample_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_Class, &flash_sampler_NewObjectSample, 0}; -static varinfo_t flash_sampler_NewObjectSample_object = {0x01, 0x00, 0x80, 0x16, "", "object", 0, 0, &flash_sampler_NewObjectSample, 0}; -static varinfo_t flash_sampler_NewObjectSample_id = {0x01, 0x00, 0x80, 0x16, "", "id", 0, &_Number, &flash_sampler_NewObjectSample, 0}; -static classinfo_t flash_net_FileFilter = {0x03, 0x00, 0x81, 0x16, "flash.net", "FileFilter", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_net_FileFilter_extension = {0x01, 0x00, 0x80, 0x16, "", "extension", 0, &_String, &flash_net_FileFilter, 0}; -static varinfo_t flash_net_FileFilter_description = {0x01, 0x00, 0x80, 0x16, "", "description", 0, &_String, &flash_net_FileFilter, 0}; -static varinfo_t flash_net_FileFilter_macType = {0x01, 0x00, 0x80, 0x16, "", "macType", 0, &_String, &flash_net_FileFilter, 0}; -static classinfo_t flash_display_BitmapDataChannel = {0x03, 0x00, 0x81, 0x16, "flash.display", "BitmapDataChannel", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_BitmapDataChannel_BLUE = {0x01, 0x00, 0x82, 0x16, "", "BLUE", 0, &_uint, &flash_display_BitmapDataChannel, 0}; -static varinfo_t flash_display_BitmapDataChannel_GREEN = {0x01, 0x00, 0x82, 0x16, "", "GREEN", 0, &_uint, &flash_display_BitmapDataChannel, 0}; -static varinfo_t flash_display_BitmapDataChannel_ALPHA = {0x01, 0x00, 0x82, 0x16, "", "ALPHA", 0, &_uint, &flash_display_BitmapDataChannel, 0}; -static varinfo_t flash_display_BitmapDataChannel_RED = {0x01, 0x00, 0x82, 0x16, "", "RED", 0, &_uint, &flash_display_BitmapDataChannel, 0}; -static methodinfo_t flash_utils_clearInterval = {0x02, 0x00, 0x82, 0x16, "flash.utils", "clearInterval", 0, &voidclass, 0, 0}; -static classinfo_t flash_text_engine_ContentElement = {0x03, 0x00, 0x80, 0x16, "flash.text.engine", "ContentElement", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_ContentElement_eventMirror = {0x01, 0x00, 0x80, 0x16, "", "eventMirror", 0, &flash_events_EventDispatcher, &flash_text_engine_ContentElement, 0}; -static varinfo_t flash_text_engine_ContentElement_groupElement = {0x01, 0x00, 0x80, 0x16, "", "groupElement", 0, &flash_text_engine_GroupElement, &flash_text_engine_ContentElement, 0}; -static varinfo_t flash_text_engine_ContentElement_textRotation = {0x01, 0x00, 0x80, 0x16, "", "textRotation", 0, &_String, &flash_text_engine_ContentElement, 0}; -static varinfo_t flash_text_engine_ContentElement_text = {0x01, 0x00, 0x80, 0x16, "", "text", 0, &_String, &flash_text_engine_ContentElement, 0}; -static varinfo_t flash_text_engine_ContentElement_userData = {0x01, 0x00, 0x80, 0x16, "", "userData", 0, 0, &flash_text_engine_ContentElement, 0}; -static varinfo_t flash_text_engine_ContentElement_elementFormat = {0x01, 0x00, 0x80, 0x16, "", "elementFormat", 0, &flash_text_engine_ElementFormat, &flash_text_engine_ContentElement, 0}; -static varinfo_t flash_text_engine_ContentElement_textBlock = {0x01, 0x00, 0x80, 0x16, "", "textBlock", 0, &flash_text_engine_TextBlock, &flash_text_engine_ContentElement, 0}; -static varinfo_t flash_text_engine_ContentElement_rawText = {0x01, 0x00, 0x80, 0x16, "", "rawText", 0, &_String, &flash_text_engine_ContentElement, 0}; -static varinfo_t flash_text_engine_ContentElement_textBlockBeginIndex = {0x01, 0x00, 0x80, 0x16, "", "textBlockBeginIndex", 0, &_int, &flash_text_engine_ContentElement, 0}; -static varinfo_t flash_text_engine_ContentElement_GRAPHIC_ELEMENT = {0x01, 0x00, 0x82, 0x16, "", "GRAPHIC_ELEMENT", 0, &_uint, &flash_text_engine_ContentElement, 0}; -static classinfo_t flash_utils_Endian = {0x03, 0x00, 0x81, 0x16, "flash.utils", "Endian", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_utils_Endian_LITTLE_ENDIAN = {0x01, 0x00, 0x82, 0x16, "", "LITTLE_ENDIAN", 0, &_String, &flash_utils_Endian, 0}; -static varinfo_t flash_utils_Endian_BIG_ENDIAN = {0x01, 0x00, 0x82, 0x16, "", "BIG_ENDIAN", 0, &_String, &flash_utils_Endian, 0}; -static methodinfo_t flash_net_navigateToURL = {0x02, 0x00, 0x82, 0x16, "flash.net", "navigateToURL", 0, &voidclass, 0, 0}; -static classinfo_t flash_events_ProgressEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ProgressEvent", 0, &flash_events_Event, interfaces: {0}}; -static varinfo_t flash_events_ProgressEvent_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_events_ProgressEvent, 0}; -static methodinfo_t flash_events_ProgressEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ProgressEvent, 0}; -static varinfo_t flash_events_ProgressEvent_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_uint, &flash_events_ProgressEvent, 0}; -static methodinfo_t flash_events_ProgressEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ProgressEvent, 0}; -static varinfo_t flash_events_ProgressEvent_PROGRESS = {0x01, 0x00, 0x82, 0x16, "", "PROGRESS", 0, &_String, &flash_events_ProgressEvent, 0}; -static varinfo_t flash_events_ProgressEvent_SOCKET_DATA = {0x01, 0x00, 0x82, 0x16, "", "SOCKET_DATA", 0, &_String, &flash_events_ProgressEvent, 0}; -static classinfo_t flash_media_Sound = {0x03, 0x00, 0x80, 0x16, "flash.media", "Sound", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static methodinfo_t flash_media_Sound_extract = {0x02, 0x00, 0x80, 0x16, "", "extract", 0, &_Number, &flash_media_Sound, 0}; -static varinfo_t flash_media_Sound_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_media_Sound, 0}; -static varinfo_t flash_media_Sound_id3 = {0x01, 0x00, 0x80, 0x16, "", "id3", 0, &flash_media_ID3Info, &flash_media_Sound, 0}; -static methodinfo_t flash_media_Sound_play = {0x02, 0x00, 0x80, 0x16, "", "play", 0, &flash_media_SoundChannel, &flash_media_Sound, 0}; -static varinfo_t flash_media_Sound_url = {0x01, 0x00, 0x80, 0x16, "", "url", 0, &_String, &flash_media_Sound, 0}; -static varinfo_t flash_media_Sound_isBuffering = {0x01, 0x00, 0x80, 0x16, "", "isBuffering", 0, &_Boolean, &flash_media_Sound, 0}; -static methodinfo_t flash_media_Sound_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_media_Sound, 0}; -static varinfo_t flash_media_Sound_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_int, &flash_media_Sound, 0}; -static varinfo_t flash_media_Sound_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_Number, &flash_media_Sound, 0}; -static methodinfo_t flash_media_Sound_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_media_Sound, 0}; -static classinfo_t flash_text_TextExtent = {0x03, 0x00, 0x80, 0x16, "flash.text", "TextExtent", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextExtent_descent = {0x01, 0x00, 0x80, 0x16, "", "descent", 0, &_Number, &flash_text_TextExtent, 0}; -static varinfo_t flash_text_TextExtent_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_Number, &flash_text_TextExtent, 0}; -static varinfo_t flash_text_TextExtent_ascent = {0x01, 0x00, 0x80, 0x16, "", "ascent", 0, &_Number, &flash_text_TextExtent, 0}; -static varinfo_t flash_text_TextExtent_textFieldHeight = {0x01, 0x00, 0x80, 0x16, "", "textFieldHeight", 0, &_Number, &flash_text_TextExtent, 0}; -static varinfo_t flash_text_TextExtent_textFieldWidth = {0x01, 0x00, 0x80, 0x16, "", "textFieldWidth", 0, &_Number, &flash_text_TextExtent, 0}; -static varinfo_t flash_text_TextExtent_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_Number, &flash_text_TextExtent, 0}; -static classinfo_t flash_text_FontStyle = {0x03, 0x00, 0x81, 0x16, "flash.text", "FontStyle", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_FontStyle_REGULAR = {0x01, 0x00, 0x82, 0x16, "", "REGULAR", 0, &_String, &flash_text_FontStyle, 0}; -static varinfo_t flash_text_FontStyle_BOLD = {0x01, 0x00, 0x82, 0x16, "", "BOLD", 0, &_String, &flash_text_FontStyle, 0}; -static varinfo_t flash_text_FontStyle_BOLD_ITALIC = {0x01, 0x00, 0x82, 0x16, "", "BOLD_ITALIC", 0, &_String, &flash_text_FontStyle, 0}; -static varinfo_t flash_text_FontStyle_ITALIC = {0x01, 0x00, 0x82, 0x16, "", "ITALIC", 0, &_String, &flash_text_FontStyle, 0}; -static classinfo_t flash_text_engine_TextLineMirrorRegion = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextLineMirrorRegion", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_TextLineMirrorRegion_mirror = {0x01, 0x00, 0x80, 0x16, "", "mirror", 0, &flash_events_EventDispatcher, &flash_text_engine_TextLineMirrorRegion, 0}; -static varinfo_t flash_text_engine_TextLineMirrorRegion_previousRegion = {0x01, 0x00, 0x80, 0x16, "", "previousRegion", 0, &flash_text_engine_TextLineMirrorRegion, &flash_text_engine_TextLineMirrorRegion, 0}; -static varinfo_t flash_text_engine_TextLineMirrorRegion_bounds = {0x01, 0x00, 0x80, 0x16, "", "bounds", 0, &flash_geom_Rectangle, &flash_text_engine_TextLineMirrorRegion, 0}; -static varinfo_t flash_text_engine_TextLineMirrorRegion_nextRegion = {0x01, 0x00, 0x80, 0x16, "", "nextRegion", 0, &flash_text_engine_TextLineMirrorRegion, &flash_text_engine_TextLineMirrorRegion, 0}; -static varinfo_t flash_text_engine_TextLineMirrorRegion_element = {0x01, 0x00, 0x80, 0x16, "", "element", 0, &flash_text_engine_ContentElement, &flash_text_engine_TextLineMirrorRegion, 0}; -static varinfo_t flash_text_engine_TextLineMirrorRegion_textLine = {0x01, 0x00, 0x80, 0x16, "", "textLine", 0, &flash_text_engine_TextLine, &flash_text_engine_TextLineMirrorRegion, 0}; -static classinfo_t flash_geom_Vector3D = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Vector3D", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_geom_Vector3D_subtract = {0x02, 0x00, 0x80, 0x16, "", "subtract", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_scaleBy = {0x02, 0x00, 0x80, 0x16, "", "scaleBy", 0, &voidclass, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_decrementBy = {0x02, 0x00, 0x80, 0x16, "", "decrementBy", 0, &voidclass, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_equals = {0x02, 0x00, 0x80, 0x16, "", "equals", 0, &_Boolean, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_normalize = {0x02, 0x00, 0x80, 0x16, "", "normalize", 0, &_Number, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_dotProduct = {0x02, 0x00, 0x80, 0x16, "", "dotProduct", 0, &_Number, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_negate = {0x02, 0x00, 0x80, 0x16, "", "negate", 0, &voidclass, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_Vector3D, 0}; -static varinfo_t flash_geom_Vector3D_lengthSquared = {0x01, 0x00, 0x80, 0x16, "", "lengthSquared", 0, &_Number, &flash_geom_Vector3D, 0}; -static varinfo_t flash_geom_Vector3D_x = {0x01, 0x00, 0x80, 0x16, "", "x", 0, &_Number, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_incrementBy = {0x02, 0x00, 0x80, 0x16, "", "incrementBy", 0, &voidclass, &flash_geom_Vector3D, 0}; -static varinfo_t flash_geom_Vector3D_w = {0x01, 0x00, 0x80, 0x16, "", "w", 0, &_Number, &flash_geom_Vector3D, 0}; -static varinfo_t flash_geom_Vector3D_z = {0x01, 0x00, 0x80, 0x16, "", "z", 0, &_Number, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_add = {0x02, 0x00, 0x80, 0x16, "", "add", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_project = {0x02, 0x00, 0x80, 0x16, "", "project", 0, &voidclass, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_crossProduct = {0x02, 0x00, 0x80, 0x16, "", "crossProduct", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_nearEquals = {0x02, 0x00, 0x80, 0x16, "", "nearEquals", 0, &_Boolean, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; -static varinfo_t flash_geom_Vector3D_y = {0x01, 0x00, 0x80, 0x16, "", "y", 0, &_Number, &flash_geom_Vector3D, 0}; -static varinfo_t flash_geom_Vector3D_length = {0x01, 0x00, 0x80, 0x16, "", "length", 0, &_Number, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_distance = {0x02, 0x00, 0x82, 0x16, "", "distance", 0, &_Number, &flash_geom_Vector3D, 0}; -static varinfo_t flash_geom_Vector3D_Z_AXIS = {0x01, 0x00, 0x82, 0x16, "", "Z_AXIS", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; -static varinfo_t flash_geom_Vector3D_X_AXIS = {0x01, 0x00, 0x82, 0x16, "", "X_AXIS", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; -static methodinfo_t flash_geom_Vector3D_angleBetween = {0x02, 0x00, 0x82, 0x16, "", "angleBetween", 0, &_Number, &flash_geom_Vector3D, 0}; -static varinfo_t flash_geom_Vector3D_Y_AXIS = {0x01, 0x00, 0x82, 0x16, "", "Y_AXIS", 0, &flash_geom_Vector3D, &flash_geom_Vector3D, 0}; -static classinfo_t flash_desktop_ClipboardTransferMode = {0x03, 0x00, 0x80, 0x16, "flash.desktop", "ClipboardTransferMode", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_desktop_ClipboardTransferMode_CLONE_ONLY = {0x01, 0x00, 0x82, 0x16, "", "CLONE_ONLY", 0, &_String, &flash_desktop_ClipboardTransferMode, 0}; -static varinfo_t flash_desktop_ClipboardTransferMode_ORIGINAL_PREFERRED = {0x01, 0x00, 0x82, 0x16, "", "ORIGINAL_PREFERRED", 0, &_String, &flash_desktop_ClipboardTransferMode, 0}; -static varinfo_t flash_desktop_ClipboardTransferMode_CLONE_PREFERRED = {0x01, 0x00, 0x82, 0x16, "", "CLONE_PREFERRED", 0, &_String, &flash_desktop_ClipboardTransferMode, 0}; -static varinfo_t flash_desktop_ClipboardTransferMode_ORIGINAL_ONLY = {0x01, 0x00, 0x82, 0x16, "", "ORIGINAL_ONLY", 0, &_String, &flash_desktop_ClipboardTransferMode, 0}; -static classinfo_t flash_display_SpreadMethod = {0x03, 0x00, 0x81, 0x16, "flash.display", "SpreadMethod", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_SpreadMethod_REFLECT = {0x01, 0x00, 0x82, 0x16, "", "REFLECT", 0, &_String, &flash_display_SpreadMethod, 0}; -static varinfo_t flash_display_SpreadMethod_REPEAT = {0x01, 0x00, 0x82, 0x16, "", "REPEAT", 0, &_String, &flash_display_SpreadMethod, 0}; -static varinfo_t flash_display_SpreadMethod_PAD = {0x01, 0x00, 0x82, 0x16, "", "PAD", 0, &_String, &flash_display_SpreadMethod, 0}; -static classinfo_t flash_system_SecurityPanel = {0x03, 0x00, 0x81, 0x16, "flash.system", "SecurityPanel", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_system_SecurityPanel_LOCAL_STORAGE = {0x01, 0x00, 0x82, 0x16, "", "LOCAL_STORAGE", 0, &_String, &flash_system_SecurityPanel, 0}; -static varinfo_t flash_system_SecurityPanel_CAMERA = {0x01, 0x00, 0x82, 0x16, "", "CAMERA", 0, &_String, &flash_system_SecurityPanel, 0}; -static varinfo_t flash_system_SecurityPanel_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_system_SecurityPanel, 0}; -static varinfo_t flash_system_SecurityPanel_SETTINGS_MANAGER = {0x01, 0x00, 0x82, 0x16, "", "SETTINGS_MANAGER", 0, &_String, &flash_system_SecurityPanel, 0}; -static varinfo_t flash_system_SecurityPanel_PRIVACY = {0x01, 0x00, 0x82, 0x16, "", "PRIVACY", 0, &_String, &flash_system_SecurityPanel, 0}; -static varinfo_t flash_system_SecurityPanel_MICROPHONE = {0x01, 0x00, 0x82, 0x16, "", "MICROPHONE", 0, &_String, &flash_system_SecurityPanel, 0}; -static varinfo_t flash_system_SecurityPanel_DISPLAY = {0x01, 0x00, 0x82, 0x16, "", "DISPLAY", 0, &_String, &flash_system_SecurityPanel, 0}; -static classinfo_t flash_events_HTTPStatusEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "HTTPStatusEvent", 0, &flash_events_Event, interfaces: {0}}; -static methodinfo_t flash_events_HTTPStatusEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_HTTPStatusEvent, 0}; -static methodinfo_t flash_events_HTTPStatusEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_HTTPStatusEvent, 0}; -static varinfo_t flash_events_HTTPStatusEvent_status = {0x01, 0x00, 0x80, 0x16, "", "status", 0, &_int, &flash_events_HTTPStatusEvent, 0}; -static varinfo_t flash_events_HTTPStatusEvent_HTTP_STATUS = {0x01, 0x00, 0x82, 0x16, "", "HTTP_STATUS", 0, &_String, &flash_events_HTTPStatusEvent, 0}; -static classinfo_t flash_net_NetStreamPlayOptions = {0x03, 0x00, 0x88, 0x16, "flash.net", "NetStreamPlayOptions", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_net_NetStreamPlayOptions_len = {0x01, 0x00, 0x80, 0x16, "", "len", 0, &_Number, &flash_net_NetStreamPlayOptions, 0}; -static varinfo_t flash_net_NetStreamPlayOptions_streamName = {0x01, 0x00, 0x80, 0x16, "", "streamName", 0, &_String, &flash_net_NetStreamPlayOptions, 0}; -static varinfo_t flash_net_NetStreamPlayOptions_start = {0x01, 0x00, 0x80, 0x16, "", "start", 0, &_Number, &flash_net_NetStreamPlayOptions, 0}; -static varinfo_t flash_net_NetStreamPlayOptions_oldStreamName = {0x01, 0x00, 0x80, 0x16, "", "oldStreamName", 0, &_String, &flash_net_NetStreamPlayOptions, 0}; -static varinfo_t flash_net_NetStreamPlayOptions_transition = {0x01, 0x00, 0x80, 0x16, "", "transition", 0, &_String, &flash_net_NetStreamPlayOptions, 0}; -static classinfo_t flash_net_Responder = {0x03, 0x00, 0x80, 0x16, "flash.net", "Responder", 0, &_Object, interfaces: {0}}; -static classinfo_t flash_net_XMLSocket = {0x03, 0x00, 0x80, 0x16, "flash.net", "XMLSocket", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static methodinfo_t flash_net_XMLSocket_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_XMLSocket, 0}; -static methodinfo_t flash_net_XMLSocket_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_XMLSocket, 0}; -static methodinfo_t flash_net_XMLSocket_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_net_XMLSocket, 0}; -static varinfo_t flash_net_XMLSocket_connected = {0x01, 0x00, 0x80, 0x16, "", "connected", 0, &_Boolean, &flash_net_XMLSocket, 0}; -static varinfo_t flash_net_XMLSocket_timeout = {0x01, 0x00, 0x80, 0x16, "", "timeout", 0, &_int, &flash_net_XMLSocket, 0}; -static classinfo_t flash_filters_ConvolutionFilter = {0x03, 0x00, 0x80, 0x16, "flash.filters", "ConvolutionFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_ConvolutionFilter_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; -static varinfo_t flash_filters_ConvolutionFilter_matrixX = {0x01, 0x00, 0x80, 0x16, "", "matrixX", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; -static varinfo_t flash_filters_ConvolutionFilter_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &_Array, &flash_filters_ConvolutionFilter, 0}; -static varinfo_t flash_filters_ConvolutionFilter_bias = {0x01, 0x00, 0x80, 0x16, "", "bias", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; -static varinfo_t flash_filters_ConvolutionFilter_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_filters_ConvolutionFilter, 0}; -static varinfo_t flash_filters_ConvolutionFilter_preserveAlpha = {0x01, 0x00, 0x80, 0x16, "", "preserveAlpha", 0, &_Boolean, &flash_filters_ConvolutionFilter, 0}; -static varinfo_t flash_filters_ConvolutionFilter_divisor = {0x01, 0x00, 0x80, 0x16, "", "divisor", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; -static methodinfo_t flash_filters_ConvolutionFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_ConvolutionFilter, 0}; -static varinfo_t flash_filters_ConvolutionFilter_clamp = {0x01, 0x00, 0x80, 0x16, "", "clamp", 0, &_Boolean, &flash_filters_ConvolutionFilter, 0}; -static varinfo_t flash_filters_ConvolutionFilter_matrixY = {0x01, 0x00, 0x80, 0x16, "", "matrixY", 0, &_Number, &flash_filters_ConvolutionFilter, 0}; -static classinfo_t flash_text_engine_ElementFormat = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "ElementFormat", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_text_engine_ElementFormat_getFontMetrics = {0x02, 0x00, 0x80, 0x16, "", "getFontMetrics", 0, &flash_text_engine_FontMetrics, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_digitCase = {0x01, 0x00, 0x80, 0x16, "", "digitCase", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_breakOpportunity = {0x01, 0x00, 0x80, 0x16, "", "breakOpportunity", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_ligatureLevel = {0x01, 0x00, 0x80, 0x16, "", "ligatureLevel", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_dominantBaseline = {0x01, 0x00, 0x80, 0x16, "", "dominantBaseline", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_alignmentBaseline = {0x01, 0x00, 0x80, 0x16, "", "alignmentBaseline", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_digitWidth = {0x01, 0x00, 0x80, 0x16, "", "digitWidth", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_kerning = {0x01, 0x00, 0x80, 0x16, "", "kerning", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_fontSize = {0x01, 0x00, 0x80, 0x16, "", "fontSize", 0, &_Number, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_fontDescription = {0x01, 0x00, 0x80, 0x16, "", "fontDescription", 0, &flash_text_engine_FontDescription, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_baselineShift = {0x01, 0x00, 0x80, 0x16, "", "baselineShift", 0, &_Number, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_locale = {0x01, 0x00, 0x80, 0x16, "", "locale", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_typographicCase = {0x01, 0x00, 0x80, 0x16, "", "typographicCase", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_trackingLeft = {0x01, 0x00, 0x80, 0x16, "", "trackingLeft", 0, &_Number, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_locked = {0x01, 0x00, 0x80, 0x16, "", "locked", 0, &_Boolean, &flash_text_engine_ElementFormat, 0}; -static methodinfo_t flash_text_engine_ElementFormat_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_ElementFormat, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_textRotation = {0x01, 0x00, 0x80, 0x16, "", "textRotation", 0, &_String, &flash_text_engine_ElementFormat, 0}; -static varinfo_t flash_text_engine_ElementFormat_trackingRight = {0x01, 0x00, 0x80, 0x16, "", "trackingRight", 0, &_Number, &flash_text_engine_ElementFormat, 0}; -static classinfo_t flash_display_GraphicsGradientFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsGradientFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; -static varinfo_t flash_display_GraphicsGradientFill_interpolationMethod = {0x01, 0x00, 0x80, 0x16, "", "interpolationMethod", 0, &_String, &flash_display_GraphicsGradientFill, 0}; -static varinfo_t flash_display_GraphicsGradientFill_focalPointRatio = {0x01, 0x00, 0x80, 0x16, "", "focalPointRatio", 0, &_Number, &flash_display_GraphicsGradientFill, 0}; -static varinfo_t flash_display_GraphicsGradientFill_colors = {0x01, 0x00, 0x80, 0x16, "", "colors", 0, &_Array, &flash_display_GraphicsGradientFill, 0}; -static varinfo_t flash_display_GraphicsGradientFill_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &flash_geom_Matrix, &flash_display_GraphicsGradientFill, 0}; -static varinfo_t flash_display_GraphicsGradientFill_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_display_GraphicsGradientFill, 0}; -static varinfo_t flash_display_GraphicsGradientFill_ratios = {0x01, 0x00, 0x80, 0x16, "", "ratios", 0, &_Array, &flash_display_GraphicsGradientFill, 0}; -static varinfo_t flash_display_GraphicsGradientFill_spreadMethod = {0x01, 0x00, 0x80, 0x16, "", "spreadMethod", 0, &_String, &flash_display_GraphicsGradientFill, 0}; -static varinfo_t flash_display_GraphicsGradientFill_alphas = {0x01, 0x00, 0x80, 0x16, "", "alphas", 0, &_Array, &flash_display_GraphicsGradientFill, 0}; -static classinfo_t flash_display_FrameLabel = {0x03, 0x00, 0x81, 0x16, "flash.display", "FrameLabel", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_FrameLabel_frame = {0x01, 0x00, 0x80, 0x16, "", "frame", 0, &_int, &flash_display_FrameLabel, 0}; -static varinfo_t flash_display_FrameLabel_name = {0x01, 0x00, 0x80, 0x16, "", "name", 0, &_String, &flash_display_FrameLabel, 0}; -static classinfo_t flash_media_SoundTransform = {0x03, 0x00, 0x81, 0x16, "flash.media", "SoundTransform", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_media_SoundTransform_pan = {0x01, 0x00, 0x80, 0x16, "", "pan", 0, &_Number, &flash_media_SoundTransform, 0}; -static varinfo_t flash_media_SoundTransform_leftToRight = {0x01, 0x00, 0x80, 0x16, "", "leftToRight", 0, &_Number, &flash_media_SoundTransform, 0}; -static varinfo_t flash_media_SoundTransform_rightToLeft = {0x01, 0x00, 0x80, 0x16, "", "rightToLeft", 0, &_Number, &flash_media_SoundTransform, 0}; -static varinfo_t flash_media_SoundTransform_volume = {0x01, 0x00, 0x80, 0x16, "", "volume", 0, &_Number, &flash_media_SoundTransform, 0}; -static varinfo_t flash_media_SoundTransform_leftToLeft = {0x01, 0x00, 0x80, 0x16, "", "leftToLeft", 0, &_Number, &flash_media_SoundTransform, 0}; -static varinfo_t flash_media_SoundTransform_rightToRight = {0x01, 0x00, 0x80, 0x16, "", "rightToRight", 0, &_Number, &flash_media_SoundTransform, 0}; -static namespace_t _AS3_constant_ns = {0x08, "http://adobe.com/AS3/2006/builtin"}; -static constant_t _AS3_constant = {type: 8, &_AS3_constant_ns}; -static varinfo_t _AS3 = {0x01, 0x00, 0xa2, 0x16, "", "AS3", 0, 0, 0, &_AS3_constant}; -static classinfo_t flash_net_LocalConnection = {0x03, 0x00, 0x80, 0x16, "flash.net", "LocalConnection", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t flash_net_LocalConnection_client = {0x01, 0x00, 0x80, 0x16, "", "client", 0, &_Object, &flash_net_LocalConnection, 0}; -static methodinfo_t flash_net_LocalConnection_allowDomain = {0x02, 0x00, 0x80, 0x16, "", "allowDomain", 0, &voidclass, &flash_net_LocalConnection, 0}; -static methodinfo_t flash_net_LocalConnection_connect = {0x02, 0x00, 0x80, 0x16, "", "connect", 0, &voidclass, &flash_net_LocalConnection, 0}; -static varinfo_t flash_net_LocalConnection_domain = {0x01, 0x00, 0x80, 0x16, "", "domain", 0, &_String, &flash_net_LocalConnection, 0}; -static methodinfo_t flash_net_LocalConnection_allowInsecureDomain = {0x02, 0x00, 0x80, 0x16, "", "allowInsecureDomain", 0, &voidclass, &flash_net_LocalConnection, 0}; -static methodinfo_t flash_net_LocalConnection_send = {0x02, 0x00, 0x80, 0x16, "", "send", 0, &voidclass, &flash_net_LocalConnection, 0}; -static methodinfo_t flash_net_LocalConnection_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_LocalConnection, 0}; -static classinfo_t flash_display_ShaderParameterType = {0x03, 0x00, 0x81, 0x16, "flash.display", "ShaderParameterType", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_ShaderParameterType_FLOAT = {0x01, 0x00, 0x82, 0x16, "", "FLOAT", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_BOOL = {0x01, 0x00, 0x82, 0x16, "", "BOOL", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_FLOAT2 = {0x01, 0x00, 0x82, 0x16, "", "FLOAT2", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_MATRIX2X2 = {0x01, 0x00, 0x82, 0x16, "", "MATRIX2X2", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_INT = {0x01, 0x00, 0x82, 0x16, "", "INT", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_INT4 = {0x01, 0x00, 0x82, 0x16, "", "INT4", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_MATRIX4X4 = {0x01, 0x00, 0x82, 0x16, "", "MATRIX4X4", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_FLOAT3 = {0x01, 0x00, 0x82, 0x16, "", "FLOAT3", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_BOOL2 = {0x01, 0x00, 0x82, 0x16, "", "BOOL2", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_INT3 = {0x01, 0x00, 0x82, 0x16, "", "INT3", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_BOOL3 = {0x01, 0x00, 0x82, 0x16, "", "BOOL3", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_BOOL4 = {0x01, 0x00, 0x82, 0x16, "", "BOOL4", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_FLOAT4 = {0x01, 0x00, 0x82, 0x16, "", "FLOAT4", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_INT2 = {0x01, 0x00, 0x82, 0x16, "", "INT2", 0, &_String, &flash_display_ShaderParameterType, 0}; -static varinfo_t flash_display_ShaderParameterType_MATRIX3X3 = {0x01, 0x00, 0x82, 0x16, "", "MATRIX3X3", 0, &_String, &flash_display_ShaderParameterType, 0}; -static classinfo_t flash_events_IMEEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "IMEEvent", 0, &flash_events_TextEvent, interfaces: {0}}; -static methodinfo_t flash_events_IMEEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_IMEEvent, 0}; -static methodinfo_t flash_events_IMEEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_IMEEvent, 0}; -static varinfo_t flash_events_IMEEvent_IME_COMPOSITION = {0x01, 0x00, 0x82, 0x16, "", "IME_COMPOSITION", 0, &_String, &flash_events_IMEEvent, 0}; -static classinfo_t flash_text_TextFormatDisplay = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextFormatDisplay", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextFormatDisplay_INLINE = {0x01, 0x00, 0x82, 0x16, "", "INLINE", 0, &_String, &flash_text_TextFormatDisplay, 0}; -static varinfo_t flash_text_TextFormatDisplay_BLOCK = {0x01, 0x00, 0x82, 0x16, "", "BLOCK", 0, &_String, &flash_text_TextFormatDisplay, 0}; -static methodinfo_t flash_profiler_profile = {0x02, 0x00, 0x82, 0x16, "flash.profiler", "profile", 0, &voidclass, 0, 0}; -static classinfo_t flash_display_AVM1Movie = {0x03, 0x00, 0x80, 0x16, "flash.display", "AVM1Movie", 0, &flash_display_DisplayObject, interfaces: {0}}; -static methodinfo_t flash_display_AVM1Movie_call = {0x02, 0x00, 0x80, 0x16, "", "call", 0, 0, &flash_display_AVM1Movie, 0}; -static methodinfo_t flash_display_AVM1Movie_addCallback = {0x02, 0x00, 0x80, 0x16, "", "addCallback", 0, &voidclass, &flash_display_AVM1Movie, 0}; -static classinfo_t flash_events_ContextMenuEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "ContextMenuEvent", 0, &flash_events_Event, interfaces: {0}}; -static varinfo_t flash_events_ContextMenuEvent_mouseTarget = {0x01, 0x00, 0x80, 0x16, "", "mouseTarget", 0, &flash_display_InteractiveObject, &flash_events_ContextMenuEvent, 0}; -static varinfo_t flash_events_ContextMenuEvent_isMouseTargetInaccessible = {0x01, 0x00, 0x80, 0x16, "", "isMouseTargetInaccessible", 0, &_Boolean, &flash_events_ContextMenuEvent, 0}; -static methodinfo_t flash_events_ContextMenuEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_ContextMenuEvent, 0}; -static varinfo_t flash_events_ContextMenuEvent_contextMenuOwner = {0x01, 0x00, 0x80, 0x16, "", "contextMenuOwner", 0, &flash_display_InteractiveObject, &flash_events_ContextMenuEvent, 0}; -static methodinfo_t flash_events_ContextMenuEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_ContextMenuEvent, 0}; -static varinfo_t flash_events_ContextMenuEvent_MENU_SELECT = {0x01, 0x00, 0x82, 0x16, "", "MENU_SELECT", 0, &_String, &flash_events_ContextMenuEvent, 0}; -static varinfo_t flash_events_ContextMenuEvent_MENU_ITEM_SELECT = {0x01, 0x00, 0x82, 0x16, "", "MENU_ITEM_SELECT", 0, &_String, &flash_events_ContextMenuEvent, 0}; -static classinfo_t flash_events_EventPhase = {0x03, 0x00, 0x81, 0x16, "flash.events", "EventPhase", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_events_EventPhase_BUBBLING_PHASE = {0x01, 0x00, 0x82, 0x16, "", "BUBBLING_PHASE", 0, &_uint, &flash_events_EventPhase, 0}; -static varinfo_t flash_events_EventPhase_CAPTURING_PHASE = {0x01, 0x00, 0x82, 0x16, "", "CAPTURING_PHASE", 0, &_uint, &flash_events_EventPhase, 0}; -static varinfo_t flash_events_EventPhase_AT_TARGET = {0x01, 0x00, 0x82, 0x16, "", "AT_TARGET", 0, &_uint, &flash_events_EventPhase, 0}; -static classinfo_t flash_display_JointStyle = {0x03, 0x00, 0x81, 0x16, "flash.display", "JointStyle", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_JointStyle_ROUND = {0x01, 0x00, 0x82, 0x16, "", "ROUND", 0, &_String, &flash_display_JointStyle, 0}; -static varinfo_t flash_display_JointStyle_MITER = {0x01, 0x00, 0x82, 0x16, "", "MITER", 0, &_String, &flash_display_JointStyle, 0}; -static varinfo_t flash_display_JointStyle_BEVEL = {0x01, 0x00, 0x82, 0x16, "", "BEVEL", 0, &_String, &flash_display_JointStyle, 0}; -static classinfo_t flash_utils_Dictionary = {0x03, 0x00, 0x88, 0x16, "flash.utils", "Dictionary", 0, &_Object, interfaces: {0}}; -static classinfo_t flash_display_GraphicsPathCommand = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsPathCommand", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_GraphicsPathCommand_NO_OP = {0x01, 0x00, 0x82, 0x16, "", "NO_OP", 0, &_int, &flash_display_GraphicsPathCommand, 0}; -static varinfo_t flash_display_GraphicsPathCommand_MOVE_TO = {0x01, 0x00, 0x82, 0x16, "", "MOVE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; -static varinfo_t flash_display_GraphicsPathCommand_WIDE_MOVE_TO = {0x01, 0x00, 0x82, 0x16, "", "WIDE_MOVE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; -static varinfo_t flash_display_GraphicsPathCommand_CURVE_TO = {0x01, 0x00, 0x82, 0x16, "", "CURVE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; -static varinfo_t flash_display_GraphicsPathCommand_LINE_TO = {0x01, 0x00, 0x82, 0x16, "", "LINE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; -static varinfo_t flash_display_GraphicsPathCommand_WIDE_LINE_TO = {0x01, 0x00, 0x82, 0x16, "", "WIDE_LINE_TO", 0, &_int, &flash_display_GraphicsPathCommand, 0}; -static classinfo_t flash_filters_BevelFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "BevelFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_BevelFilter_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_highlightColor = {0x01, 0x00, 0x80, 0x16, "", "highlightColor", 0, &_uint, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_distance = {0x01, 0x00, 0x80, 0x16, "", "distance", 0, &_Number, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_highlightAlpha = {0x01, 0x00, 0x80, 0x16, "", "highlightAlpha", 0, &_Number, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_shadowColor = {0x01, 0x00, 0x80, 0x16, "", "shadowColor", 0, &_uint, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_angle = {0x01, 0x00, 0x80, 0x16, "", "angle", 0, &_Number, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_shadowAlpha = {0x01, 0x00, 0x80, 0x16, "", "shadowAlpha", 0, &_Number, &flash_filters_BevelFilter, 0}; -static varinfo_t flash_filters_BevelFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_BevelFilter, 0}; -static methodinfo_t flash_filters_BevelFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_BevelFilter, 0}; -static methodinfo_t flash_utils_getTimer = {0x02, 0x00, 0x82, 0x16, "flash.utils", "getTimer", 0, &_int, 0, 0}; -static classinfo_t flash_display_Loader = {0x03, 0x00, 0x80, 0x16, "flash.display", "Loader", 0, &flash_display_DisplayObjectContainer, interfaces: {0}}; -static varinfo_t flash_display_Loader_content = {0x01, 0x00, 0x80, 0x16, "", "content", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_unloadAndStop = {0x02, 0x00, 0x80, 0x16, "", "unloadAndStop", 0, &voidclass, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_unload = {0x02, 0x00, 0x80, 0x16, "", "unload", 0, &voidclass, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_removeChildAt = {0x02, 0x00, 0x80, 0x16, "", "removeChildAt", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_addChildAt = {0x02, 0x00, 0x80, 0x16, "", "addChildAt", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; -static varinfo_t flash_display_Loader_contentLoaderInfo = {0x01, 0x00, 0x80, 0x16, "", "contentLoaderInfo", 0, &flash_display_LoaderInfo, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_loadBytes = {0x02, 0x00, 0x80, 0x16, "", "loadBytes", 0, &voidclass, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_removeChild = {0x02, 0x00, 0x80, 0x16, "", "removeChild", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_addChild = {0x02, 0x00, 0x80, 0x16, "", "addChild", 0, &flash_display_DisplayObject, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_display_Loader, 0}; -static methodinfo_t flash_display_Loader_setChildIndex = {0x02, 0x00, 0x80, 0x16, "", "setChildIndex", 0, &voidclass, &flash_display_Loader, 0}; -static classinfo_t flash_display_GraphicsBitmapFill = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsBitmapFill", 0, &_Object, interfaces: {&flash_display_IGraphicsFill, &flash_display_IGraphicsData, 0}}; -static varinfo_t flash_display_GraphicsBitmapFill_smooth = {0x01, 0x00, 0x80, 0x16, "", "smooth", 0, &_Boolean, &flash_display_GraphicsBitmapFill, 0}; -static varinfo_t flash_display_GraphicsBitmapFill_repeat = {0x01, 0x00, 0x80, 0x16, "", "repeat", 0, &_Boolean, &flash_display_GraphicsBitmapFill, 0}; -static varinfo_t flash_display_GraphicsBitmapFill_bitmapData = {0x01, 0x00, 0x80, 0x16, "", "bitmapData", 0, &flash_display_BitmapData, &flash_display_GraphicsBitmapFill, 0}; -static varinfo_t flash_display_GraphicsBitmapFill_matrix = {0x01, 0x00, 0x80, 0x16, "", "matrix", 0, &flash_geom_Matrix, &flash_display_GraphicsBitmapFill, 0}; -static varinfo_t _undefined = {0x01, 0x00, 0xa2, 0x16, "", "undefined", 0, 0, 0, 0}; -static classinfo_t flash_display_SimpleButton = {0x03, 0x00, 0x80, 0x16, "flash.display", "SimpleButton", 0, &flash_display_InteractiveObject, interfaces: {0}}; -static varinfo_t flash_display_SimpleButton_overState = {0x01, 0x00, 0x80, 0x16, "", "overState", 0, &flash_display_DisplayObject, &flash_display_SimpleButton, 0}; -static varinfo_t flash_display_SimpleButton_downState = {0x01, 0x00, 0x80, 0x16, "", "downState", 0, &flash_display_DisplayObject, &flash_display_SimpleButton, 0}; -static varinfo_t flash_display_SimpleButton_enabled = {0x01, 0x00, 0x80, 0x16, "", "enabled", 0, &_Boolean, &flash_display_SimpleButton, 0}; -static varinfo_t flash_display_SimpleButton_trackAsMenu = {0x01, 0x00, 0x80, 0x16, "", "trackAsMenu", 0, &_Boolean, &flash_display_SimpleButton, 0}; -static varinfo_t flash_display_SimpleButton_soundTransform = {0x01, 0x00, 0x80, 0x16, "", "soundTransform", 0, &flash_media_SoundTransform, &flash_display_SimpleButton, 0}; -static varinfo_t flash_display_SimpleButton_useHandCursor = {0x01, 0x00, 0x80, 0x16, "", "useHandCursor", 0, &_Boolean, &flash_display_SimpleButton, 0}; -static varinfo_t flash_display_SimpleButton_upState = {0x01, 0x00, 0x80, 0x16, "", "upState", 0, &flash_display_DisplayObject, &flash_display_SimpleButton, 0}; -static varinfo_t flash_display_SimpleButton_hitTestState = {0x01, 0x00, 0x80, 0x16, "", "hitTestState", 0, &flash_display_DisplayObject, &flash_display_SimpleButton, 0}; -static classinfo_t flash_text_engine_TabAlignment = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TabAlignment", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_TabAlignment_END = {0x01, 0x00, 0x82, 0x16, "", "END", 0, &_String, &flash_text_engine_TabAlignment, 0}; -static varinfo_t flash_text_engine_TabAlignment_CENTER = {0x01, 0x00, 0x82, 0x16, "", "CENTER", 0, &_String, &flash_text_engine_TabAlignment, 0}; -static varinfo_t flash_text_engine_TabAlignment_START = {0x01, 0x00, 0x82, 0x16, "", "START", 0, &_String, &flash_text_engine_TabAlignment, 0}; -static varinfo_t flash_text_engine_TabAlignment_DECIMAL = {0x01, 0x00, 0x82, 0x16, "", "DECIMAL", 0, &_String, &flash_text_engine_TabAlignment, 0}; -static classinfo_t flash_text_engine_FontWeight = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontWeight", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_FontWeight_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_text_engine_FontWeight, 0}; -static varinfo_t flash_text_engine_FontWeight_BOLD = {0x01, 0x00, 0x82, 0x16, "", "BOLD", 0, &_String, &flash_text_engine_FontWeight, 0}; -static methodinfo_t flash_utils_describeType = {0x02, 0x00, 0x82, 0x16, "flash.utils", "describeType", 0, &_XML, 0, 0}; -static classinfo_t flash_display_PixelSnapping = {0x03, 0x00, 0x81, 0x16, "flash.display", "PixelSnapping", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_PixelSnapping_AUTO = {0x01, 0x00, 0x82, 0x16, "", "AUTO", 0, &_String, &flash_display_PixelSnapping, 0}; -static varinfo_t flash_display_PixelSnapping_NEVER = {0x01, 0x00, 0x82, 0x16, "", "NEVER", 0, &_String, &flash_display_PixelSnapping, 0}; -static varinfo_t flash_display_PixelSnapping_ALWAYS = {0x01, 0x00, 0x82, 0x16, "", "ALWAYS", 0, &_String, &flash_display_PixelSnapping, 0}; -static classinfo_t flash_events_FocusEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "FocusEvent", 0, &flash_events_Event, interfaces: {0}}; -static varinfo_t flash_events_FocusEvent_keyCode = {0x01, 0x00, 0x80, 0x16, "", "keyCode", 0, &_uint, &flash_events_FocusEvent, 0}; -static methodinfo_t flash_events_FocusEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_FocusEvent, 0}; -static varinfo_t flash_events_FocusEvent_isRelatedObjectInaccessible = {0x01, 0x00, 0x80, 0x16, "", "isRelatedObjectInaccessible", 0, &_Boolean, &flash_events_FocusEvent, 0}; -static methodinfo_t flash_events_FocusEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_FocusEvent, 0}; -static varinfo_t flash_events_FocusEvent_shiftKey = {0x01, 0x00, 0x80, 0x16, "", "shiftKey", 0, &_Boolean, &flash_events_FocusEvent, 0}; -static varinfo_t flash_events_FocusEvent_relatedObject = {0x01, 0x00, 0x80, 0x16, "", "relatedObject", 0, &flash_display_InteractiveObject, &flash_events_FocusEvent, 0}; -static varinfo_t flash_events_FocusEvent_FOCUS_IN = {0x01, 0x00, 0x82, 0x16, "", "FOCUS_IN", 0, &_String, &flash_events_FocusEvent, 0}; -static varinfo_t flash_events_FocusEvent_FOCUS_OUT = {0x01, 0x00, 0x82, 0x16, "", "FOCUS_OUT", 0, &_String, &flash_events_FocusEvent, 0}; -static varinfo_t flash_events_FocusEvent_KEY_FOCUS_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "KEY_FOCUS_CHANGE", 0, &_String, &flash_events_FocusEvent, 0}; -static varinfo_t flash_events_FocusEvent_MOUSE_FOCUS_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_FOCUS_CHANGE", 0, &_String, &flash_events_FocusEvent, 0}; -static classinfo_t flash_errors_MemoryError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "MemoryError", 0, &_Error, interfaces: {0}}; -static classinfo_t flash_events_NetFilterEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "NetFilterEvent", 0, &flash_events_Event, interfaces: {0}}; -static varinfo_t flash_events_NetFilterEvent_header = {0x01, 0x00, 0x80, 0x16, "", "header", 0, &flash_utils_ByteArray, &flash_events_NetFilterEvent, 0}; -static methodinfo_t flash_events_NetFilterEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_NetFilterEvent, 0}; -static methodinfo_t flash_events_NetFilterEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_NetFilterEvent, 0}; -static varinfo_t flash_events_NetFilterEvent_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &flash_utils_ByteArray, &flash_events_NetFilterEvent, 0}; -static methodinfo_t _decodeURI = {0x02, 0x00, 0x82, 0x16, "", "decodeURI", 0, &_String, 0, 0}; -static methodinfo_t _encodeURI = {0x02, 0x00, 0x82, 0x16, "", "encodeURI", 0, &_String, 0, 0}; -static classinfo_t flash_text_engine_TextBaseline = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextBaseline", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_TextBaseline_ROMAN = {0x01, 0x00, 0x82, 0x16, "", "ROMAN", 0, &_String, &flash_text_engine_TextBaseline, 0}; -static varinfo_t flash_text_engine_TextBaseline_DESCENT = {0x01, 0x00, 0x82, 0x16, "", "DESCENT", 0, &_String, &flash_text_engine_TextBaseline, 0}; -static varinfo_t flash_text_engine_TextBaseline_IDEOGRAPHIC_CENTER = {0x01, 0x00, 0x82, 0x16, "", "IDEOGRAPHIC_CENTER", 0, &_String, &flash_text_engine_TextBaseline, 0}; -static varinfo_t flash_text_engine_TextBaseline_USE_DOMINANT_BASELINE = {0x01, 0x00, 0x82, 0x16, "", "USE_DOMINANT_BASELINE", 0, &_String, &flash_text_engine_TextBaseline, 0}; -static varinfo_t flash_text_engine_TextBaseline_IDEOGRAPHIC_BOTTOM = {0x01, 0x00, 0x82, 0x16, "", "IDEOGRAPHIC_BOTTOM", 0, &_String, &flash_text_engine_TextBaseline, 0}; -static varinfo_t flash_text_engine_TextBaseline_ASCENT = {0x01, 0x00, 0x82, 0x16, "", "ASCENT", 0, &_String, &flash_text_engine_TextBaseline, 0}; -static varinfo_t flash_text_engine_TextBaseline_IDEOGRAPHIC_TOP = {0x01, 0x00, 0x82, 0x16, "", "IDEOGRAPHIC_TOP", 0, &_String, &flash_text_engine_TextBaseline, 0}; -static classinfo_t flash_external_ExternalInterface = {0x03, 0x00, 0x81, 0x16, "flash.external", "ExternalInterface", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_external_ExternalInterface_call = {0x02, 0x00, 0x82, 0x16, "", "call", 0, 0, &flash_external_ExternalInterface, 0}; -static varinfo_t flash_external_ExternalInterface_available = {0x01, 0x00, 0x82, 0x16, "", "available", 0, &_Boolean, &flash_external_ExternalInterface, 0}; -static methodinfo_t flash_external_ExternalInterface_addCallback = {0x02, 0x00, 0x82, 0x16, "", "addCallback", 0, &voidclass, &flash_external_ExternalInterface, 0}; -static varinfo_t flash_external_ExternalInterface_marshallExceptions = {0x01, 0x00, 0x82, 0x16, "", "marshallExceptions", 0, &_Boolean, &flash_external_ExternalInterface, 0}; -static varinfo_t flash_external_ExternalInterface_objectID = {0x01, 0x00, 0x82, 0x16, "", "objectID", 0, &_String, &flash_external_ExternalInterface, 0}; -static classinfo_t _EvalError = {0x03, 0x00, 0x88, 0x16, "", "EvalError", 0, &_Error, interfaces: {0}}; -static varinfo_t _EvalError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_EvalError, 0}; -static classinfo_t flash_text_engine_DigitCase = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "DigitCase", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_DigitCase_OLD_STYLE = {0x01, 0x00, 0x82, 0x16, "", "OLD_STYLE", 0, &_String, &flash_text_engine_DigitCase, 0}; -static varinfo_t flash_text_engine_DigitCase_DEFAULT = {0x01, 0x00, 0x82, 0x16, "", "DEFAULT", 0, &_String, &flash_text_engine_DigitCase, 0}; -static varinfo_t flash_text_engine_DigitCase_LINING = {0x01, 0x00, 0x82, 0x16, "", "LINING", 0, &_String, &flash_text_engine_DigitCase, 0}; -static classinfo_t flash_text_TextFormatAlign = {0x03, 0x00, 0x81, 0x16, "flash.text", "TextFormatAlign", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_TextFormatAlign_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_String, &flash_text_TextFormatAlign, 0}; -static varinfo_t flash_text_TextFormatAlign_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_String, &flash_text_TextFormatAlign, 0}; -static varinfo_t flash_text_TextFormatAlign_CENTER = {0x01, 0x00, 0x82, 0x16, "", "CENTER", 0, &_String, &flash_text_TextFormatAlign, 0}; -static varinfo_t flash_text_TextFormatAlign_JUSTIFY = {0x01, 0x00, 0x82, 0x16, "", "JUSTIFY", 0, &_String, &flash_text_TextFormatAlign, 0}; -static classinfo_t flash_errors_ScriptTimeoutError = {0x03, 0x00, 0x88, 0x16, "flash.errors", "ScriptTimeoutError", 0, &_Error, interfaces: {0}}; -static classinfo_t _uint = {0x03, 0x00, 0x81, 0x16, "", "uint", 0, &_Object, interfaces: {0}}; -static methodinfo_t _uint_valueOf = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "valueOf", 0, &_uint, &_uint, 0}; -static methodinfo_t _uint_toString = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toString", 0, &_String, &_uint, 0}; -static methodinfo_t _uint_toExponential = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toExponential", 0, &_String, &_uint, 0}; -static methodinfo_t _uint_toFixed = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toFixed", 0, &_String, &_uint, 0}; -static methodinfo_t _uint_toPrecision = {0x02, 0x00, 0x80, 0x08, "http://adobe.com/AS3/2006/builtin", "toPrecision", 0, &_String, &_uint, 0}; -static varinfo_t _uint_MAX_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MAX_VALUE", 0, &_uint, &_uint, 0}; -static varinfo_t _uint_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_uint, 0}; -static varinfo_t _uint_MIN_VALUE = {0x01, 0x00, 0x82, 0x16, "", "MIN_VALUE", 0, &_uint, &_uint, 0}; -static methodinfo_t flash_debugger_enterDebugger = {0x02, 0x00, 0x82, 0x16, "flash.debugger", "enterDebugger", 0, &voidclass, 0, 0}; -static classinfo_t flash_geom_Orientation3D = {0x03, 0x00, 0x81, 0x16, "flash.geom", "Orientation3D", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_geom_Orientation3D_QUATERNION = {0x01, 0x00, 0x82, 0x16, "", "QUATERNION", 0, &_String, &flash_geom_Orientation3D, 0}; -static varinfo_t flash_geom_Orientation3D_EULER_ANGLES = {0x01, 0x00, 0x82, 0x16, "", "EULER_ANGLES", 0, &_String, &flash_geom_Orientation3D, 0}; -static varinfo_t flash_geom_Orientation3D_AXIS_ANGLE = {0x01, 0x00, 0x82, 0x16, "", "AXIS_ANGLE", 0, &_String, &flash_geom_Orientation3D, 0}; -static classinfo_t flash_text_engine_CFFHinting = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "CFFHinting", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_CFFHinting_HORIZONTAL_STEM = {0x01, 0x00, 0x82, 0x16, "", "HORIZONTAL_STEM", 0, &_String, &flash_text_engine_CFFHinting, 0}; -static varinfo_t flash_text_engine_CFFHinting_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_engine_CFFHinting, 0}; -static classinfo_t flash_text_FontType = {0x03, 0x00, 0x81, 0x16, "flash.text", "FontType", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_FontType_EMBEDDED = {0x01, 0x00, 0x82, 0x16, "", "EMBEDDED", 0, &_String, &flash_text_FontType, 0}; -static varinfo_t flash_text_FontType_DEVICE = {0x01, 0x00, 0x82, 0x16, "", "DEVICE", 0, &_String, &flash_text_FontType, 0}; -static varinfo_t flash_text_FontType_EMBEDDED_CFF = {0x01, 0x00, 0x82, 0x16, "", "EMBEDDED_CFF", 0, &_String, &flash_text_FontType, 0}; -static classinfo_t flash_filters_ShaderFilter = {0x03, 0x00, 0x80, 0x16, "flash.filters", "ShaderFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_ShaderFilter_bottomExtension = {0x01, 0x00, 0x80, 0x16, "", "bottomExtension", 0, &_int, &flash_filters_ShaderFilter, 0}; -static varinfo_t flash_filters_ShaderFilter_shader = {0x01, 0x00, 0x80, 0x16, "", "shader", 0, &flash_display_Shader, &flash_filters_ShaderFilter, 0}; -static varinfo_t flash_filters_ShaderFilter_rightExtension = {0x01, 0x00, 0x80, 0x16, "", "rightExtension", 0, &_int, &flash_filters_ShaderFilter, 0}; -static varinfo_t flash_filters_ShaderFilter_leftExtension = {0x01, 0x00, 0x80, 0x16, "", "leftExtension", 0, &_int, &flash_filters_ShaderFilter, 0}; -static varinfo_t flash_filters_ShaderFilter_topExtension = {0x01, 0x00, 0x80, 0x16, "", "topExtension", 0, &_int, &flash_filters_ShaderFilter, 0}; -static classinfo_t flash_display_GraphicsPath = {0x03, 0x00, 0x81, 0x16, "flash.display", "GraphicsPath", 0, &_Object, interfaces: {&flash_display_IGraphicsPath, &flash_display_IGraphicsData, 0}}; -static methodinfo_t flash_display_GraphicsPath_wideMoveTo = {0x02, 0x00, 0x80, 0x16, "", "wideMoveTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; -static varinfo_t flash_display_GraphicsPath_winding = {0x01, 0x00, 0x80, 0x16, "", "winding", 0, &_String, &flash_display_GraphicsPath, 0}; -static methodinfo_t flash_display_GraphicsPath_moveTo = {0x02, 0x00, 0x80, 0x16, "", "moveTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; -static methodinfo_t flash_display_GraphicsPath_wideLineTo = {0x02, 0x00, 0x80, 0x16, "", "wideLineTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; -static varinfo_t flash_display_GraphicsPath_commands = {0x01, 0x00, 0x80, 0x16, "", "commands", 0, &__AS3___vec_Vector, &flash_display_GraphicsPath, 0}; -static methodinfo_t flash_display_GraphicsPath_curveTo = {0x02, 0x00, 0x80, 0x16, "", "curveTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; -static methodinfo_t flash_display_GraphicsPath_lineTo = {0x02, 0x00, 0x80, 0x16, "", "lineTo", 0, &voidclass, &flash_display_GraphicsPath, 0}; -static varinfo_t flash_display_GraphicsPath_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, &__AS3___vec_Vector, &flash_display_GraphicsPath, 0}; -static classinfo_t flash_system_ApplicationDomain = {0x03, 0x00, 0x81, 0x16, "flash.system", "ApplicationDomain", 0, &_Object, interfaces: {0}}; -static methodinfo_t flash_system_ApplicationDomain_hasDefinition = {0x02, 0x00, 0x80, 0x16, "", "hasDefinition", 0, &_Boolean, &flash_system_ApplicationDomain, 0}; -static methodinfo_t flash_system_ApplicationDomain_getDefinition = {0x02, 0x00, 0x80, 0x16, "", "getDefinition", 0, &_Object, &flash_system_ApplicationDomain, 0}; -static varinfo_t flash_system_ApplicationDomain_parentDomain = {0x01, 0x00, 0x80, 0x16, "", "parentDomain", 0, &flash_system_ApplicationDomain, &flash_system_ApplicationDomain, 0}; -static varinfo_t flash_system_ApplicationDomain_domainMemory = {0x01, 0x00, 0x80, 0x16, "", "domainMemory", 0, &flash_utils_ByteArray, &flash_system_ApplicationDomain, 0}; -static varinfo_t flash_system_ApplicationDomain_MIN_DOMAIN_MEMORY_LENGTH = {0x01, 0x00, 0x82, 0x16, "", "MIN_DOMAIN_MEMORY_LENGTH", 0, &_uint, &flash_system_ApplicationDomain, 0}; -static varinfo_t flash_system_ApplicationDomain_currentDomain = {0x01, 0x00, 0x82, 0x16, "", "currentDomain", 0, &flash_system_ApplicationDomain, &flash_system_ApplicationDomain, 0}; -static classinfo_t flash_events_KeyboardEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "KeyboardEvent", 0, &flash_events_Event, interfaces: {0}}; -static varinfo_t flash_events_KeyboardEvent_shiftKey = {0x01, 0x00, 0x80, 0x16, "", "shiftKey", 0, &_Boolean, &flash_events_KeyboardEvent, 0}; -static varinfo_t flash_events_KeyboardEvent_keyCode = {0x01, 0x00, 0x80, 0x16, "", "keyCode", 0, &_uint, &flash_events_KeyboardEvent, 0}; -static varinfo_t flash_events_KeyboardEvent_keyLocation = {0x01, 0x00, 0x80, 0x16, "", "keyLocation", 0, &_uint, &flash_events_KeyboardEvent, 0}; -static methodinfo_t flash_events_KeyboardEvent_updateAfterEvent = {0x02, 0x00, 0x80, 0x16, "", "updateAfterEvent", 0, &voidclass, &flash_events_KeyboardEvent, 0}; -static methodinfo_t flash_events_KeyboardEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_KeyboardEvent, 0}; -static varinfo_t flash_events_KeyboardEvent_altKey = {0x01, 0x00, 0x80, 0x16, "", "altKey", 0, &_Boolean, &flash_events_KeyboardEvent, 0}; -static varinfo_t flash_events_KeyboardEvent_ctrlKey = {0x01, 0x00, 0x80, 0x16, "", "ctrlKey", 0, &_Boolean, &flash_events_KeyboardEvent, 0}; -static methodinfo_t flash_events_KeyboardEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_KeyboardEvent, 0}; -static varinfo_t flash_events_KeyboardEvent_charCode = {0x01, 0x00, 0x80, 0x16, "", "charCode", 0, &_uint, &flash_events_KeyboardEvent, 0}; -static varinfo_t flash_events_KeyboardEvent_KEY_DOWN = {0x01, 0x00, 0x82, 0x16, "", "KEY_DOWN", 0, &_String, &flash_events_KeyboardEvent, 0}; -static varinfo_t flash_events_KeyboardEvent_KEY_UP = {0x01, 0x00, 0x82, 0x16, "", "KEY_UP", 0, &_String, &flash_events_KeyboardEvent, 0}; -static classinfo_t adobe_utils_ProductManager = {0x03, 0x00, 0x81, 0x16, "adobe.utils", "ProductManager", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static varinfo_t adobe_utils_ProductManager_running = {0x01, 0x00, 0x80, 0x16, "", "running", 0, &_Boolean, &adobe_utils_ProductManager, 0}; -static methodinfo_t adobe_utils_ProductManager_download = {0x02, 0x00, 0x80, 0x16, "", "download", 0, &_Boolean, &adobe_utils_ProductManager, 0}; -static varinfo_t adobe_utils_ProductManager_installedVersion = {0x01, 0x00, 0x80, 0x16, "", "installedVersion", 0, &_String, &adobe_utils_ProductManager, 0}; -static varinfo_t adobe_utils_ProductManager_installed = {0x01, 0x00, 0x80, 0x16, "", "installed", 0, &_Boolean, &adobe_utils_ProductManager, 0}; -static methodinfo_t adobe_utils_ProductManager_launch = {0x02, 0x00, 0x80, 0x16, "", "launch", 0, &_Boolean, &adobe_utils_ProductManager, 0}; -static classinfo_t flash_events_Event = {0x03, 0x00, 0x80, 0x16, "flash.events", "Event", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_events_Event_type = {0x01, 0x00, 0x80, 0x16, "", "type", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_cancelable = {0x01, 0x00, 0x80, 0x16, "", "cancelable", 0, &_Boolean, &flash_events_Event, 0}; -static methodinfo_t flash_events_Event_isDefaultPrevented = {0x02, 0x00, 0x80, 0x16, "", "isDefaultPrevented", 0, &_Boolean, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_target = {0x01, 0x00, 0x80, 0x16, "", "target", 0, &_Object, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_eventPhase = {0x01, 0x00, 0x80, 0x16, "", "eventPhase", 0, &_uint, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_currentTarget = {0x01, 0x00, 0x80, 0x16, "", "currentTarget", 0, &_Object, &flash_events_Event, 0}; -static methodinfo_t flash_events_Event_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_Event, 0}; -static methodinfo_t flash_events_Event_stopImmediatePropagation = {0x02, 0x00, 0x80, 0x16, "", "stopImmediatePropagation", 0, &voidclass, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_bubbles = {0x01, 0x00, 0x80, 0x16, "", "bubbles", 0, &_Boolean, &flash_events_Event, 0}; -static methodinfo_t flash_events_Event_stopPropagation = {0x02, 0x00, 0x80, 0x16, "", "stopPropagation", 0, &voidclass, &flash_events_Event, 0}; -static methodinfo_t flash_events_Event_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_Event, 0}; -static methodinfo_t flash_events_Event_preventDefault = {0x02, 0x00, 0x80, 0x16, "", "preventDefault", 0, &voidclass, &flash_events_Event, 0}; -static methodinfo_t flash_events_Event_formatToString = {0x02, 0x00, 0x80, 0x16, "", "formatToString", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_REMOVED_FROM_STAGE = {0x01, 0x00, 0x82, 0x16, "", "REMOVED_FROM_STAGE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_CLEAR = {0x01, 0x00, 0x82, 0x16, "", "CLEAR", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_OPEN = {0x01, 0x00, 0x82, 0x16, "", "OPEN", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_TAB_CHILDREN_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "TAB_CHILDREN_CHANGE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_DEACTIVATE = {0x01, 0x00, 0x82, 0x16, "", "DEACTIVATE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_ACTIVATE = {0x01, 0x00, 0x82, 0x16, "", "ACTIVATE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_SOUND_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "SOUND_COMPLETE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_CANCEL = {0x01, 0x00, 0x82, 0x16, "", "CANCEL", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_REMOVED = {0x01, 0x00, 0x82, 0x16, "", "REMOVED", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_INIT = {0x01, 0x00, 0x82, 0x16, "", "INIT", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_FRAME_CONSTRUCTED = {0x01, 0x00, 0x82, 0x16, "", "FRAME_CONSTRUCTED", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_SCROLL = {0x01, 0x00, 0x82, 0x16, "", "SCROLL", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_TAB_INDEX_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "TAB_INDEX_CHANGE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "CHANGE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_ADDED_TO_STAGE = {0x01, 0x00, 0x82, 0x16, "", "ADDED_TO_STAGE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_UNLOAD = {0x01, 0x00, 0x82, 0x16, "", "UNLOAD", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_SELECT = {0x01, 0x00, 0x82, 0x16, "", "SELECT", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_CONNECT = {0x01, 0x00, 0x82, 0x16, "", "CONNECT", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_CUT = {0x01, 0x00, 0x82, 0x16, "", "CUT", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_PASTE = {0x01, 0x00, 0x82, 0x16, "", "PASTE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_ADDED = {0x01, 0x00, 0x82, 0x16, "", "ADDED", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_ID3 = {0x01, 0x00, 0x82, 0x16, "", "ID3", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_ENTER_FRAME = {0x01, 0x00, 0x82, 0x16, "", "ENTER_FRAME", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_RENDER = {0x01, 0x00, 0x82, 0x16, "", "RENDER", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_EXIT_FRAME = {0x01, 0x00, 0x82, 0x16, "", "EXIT_FRAME", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_RESIZE = {0x01, 0x00, 0x82, 0x16, "", "RESIZE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_FULLSCREEN = {0x01, 0x00, 0x82, 0x16, "", "FULLSCREEN", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_MOUSE_LEAVE = {0x01, 0x00, 0x82, 0x16, "", "MOUSE_LEAVE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_CLOSE = {0x01, 0x00, 0x82, 0x16, "", "CLOSE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_SELECT_ALL = {0x01, 0x00, 0x82, 0x16, "", "SELECT_ALL", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_TAB_ENABLED_CHANGE = {0x01, 0x00, 0x82, 0x16, "", "TAB_ENABLED_CHANGE", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_COPY = {0x01, 0x00, 0x82, 0x16, "", "COPY", 0, &_String, &flash_events_Event, 0}; -static varinfo_t flash_events_Event_COMPLETE = {0x01, 0x00, 0x82, 0x16, "", "COMPLETE", 0, &_String, &flash_events_Event, 0}; -static classinfo_t flash_desktop_ClipboardFormats = {0x03, 0x00, 0x80, 0x16, "flash.desktop", "ClipboardFormats", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_desktop_ClipboardFormats_TEXT_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "TEXT_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static varinfo_t flash_desktop_ClipboardFormats_BITMAP_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "BITMAP_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static varinfo_t flash_desktop_ClipboardFormats_FLASH_PREFIX = {0x01, 0x00, 0x82, 0x17, "", "FLASH_PREFIX", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static varinfo_t flash_desktop_ClipboardFormats_HTML_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "HTML_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static varinfo_t flash_desktop_ClipboardFormats_REFERENCE_PREFIX = {0x01, 0x00, 0x82, 0x17, "", "REFERENCE_PREFIX", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static varinfo_t flash_desktop_ClipboardFormats_AIR_PREFIX = {0x01, 0x00, 0x82, 0x17, "", "AIR_PREFIX", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static varinfo_t flash_desktop_ClipboardFormats_SERIALIZATION_PREFIX = {0x01, 0x00, 0x82, 0x17, "", "SERIALIZATION_PREFIX", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static varinfo_t flash_desktop_ClipboardFormats_RICH_TEXT_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "RICH_TEXT_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static varinfo_t flash_desktop_ClipboardFormats_URL_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "URL_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static varinfo_t flash_desktop_ClipboardFormats_FILE_LIST_FORMAT = {0x01, 0x00, 0x82, 0x16, "", "FILE_LIST_FORMAT", 0, &_String, &flash_desktop_ClipboardFormats, 0}; -static classinfo_t flash_display_MovieClip = {0x03, 0x00, 0x88, 0x16, "flash.display", "MovieClip", 0, &flash_display_Sprite, interfaces: {0}}; -static methodinfo_t flash_display_MovieClip_prevScene = {0x02, 0x00, 0x80, 0x16, "", "prevScene", 0, &voidclass, &flash_display_MovieClip, 0}; -static methodinfo_t flash_display_MovieClip_gotoAndPlay = {0x02, 0x00, 0x80, 0x16, "", "gotoAndPlay", 0, &voidclass, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_currentLabels = {0x01, 0x00, 0x80, 0x16, "", "currentLabels", 0, &_Array, &flash_display_MovieClip, 0}; -static methodinfo_t flash_display_MovieClip_nextFrame = {0x02, 0x00, 0x80, 0x16, "", "nextFrame", 0, &voidclass, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_currentScene = {0x01, 0x00, 0x80, 0x16, "", "currentScene", 0, &flash_display_Scene, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_enabled = {0x01, 0x00, 0x80, 0x16, "", "enabled", 0, &_Boolean, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_currentFrameLabel = {0x01, 0x00, 0x80, 0x16, "", "currentFrameLabel", 0, &_String, &flash_display_MovieClip, 0}; -static methodinfo_t flash_display_MovieClip_play = {0x02, 0x00, 0x80, 0x16, "", "play", 0, &voidclass, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_framesLoaded = {0x01, 0x00, 0x80, 0x16, "", "framesLoaded", 0, &_int, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_scenes = {0x01, 0x00, 0x80, 0x16, "", "scenes", 0, &_Array, &flash_display_MovieClip, 0}; -static methodinfo_t flash_display_MovieClip_addFrameScript = {0x02, 0x00, 0x80, 0x16, "", "addFrameScript", 0, &voidclass, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_currentLabel = {0x01, 0x00, 0x80, 0x16, "", "currentLabel", 0, &_String, &flash_display_MovieClip, 0}; -static methodinfo_t flash_display_MovieClip_prevFrame = {0x02, 0x00, 0x80, 0x16, "", "prevFrame", 0, &voidclass, &flash_display_MovieClip, 0}; -static methodinfo_t flash_display_MovieClip_gotoAndStop = {0x02, 0x00, 0x80, 0x16, "", "gotoAndStop", 0, &voidclass, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_currentFrame = {0x01, 0x00, 0x80, 0x16, "", "currentFrame", 0, &_int, &flash_display_MovieClip, 0}; -static methodinfo_t flash_display_MovieClip_nextScene = {0x02, 0x00, 0x80, 0x16, "", "nextScene", 0, &voidclass, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_totalFrames = {0x01, 0x00, 0x80, 0x16, "", "totalFrames", 0, &_int, &flash_display_MovieClip, 0}; -static varinfo_t flash_display_MovieClip_trackAsMenu = {0x01, 0x00, 0x80, 0x16, "", "trackAsMenu", 0, &_Boolean, &flash_display_MovieClip, 0}; -static methodinfo_t flash_display_MovieClip_stop = {0x02, 0x00, 0x80, 0x16, "", "stop", 0, &voidclass, &flash_display_MovieClip, 0}; -static classinfo_t flash_display_BitmapData = {0x03, 0x00, 0x80, 0x16, "flash.display", "BitmapData", 0, &_Object, interfaces: {&flash_display_IBitmapDrawable, 0}}; -static methodinfo_t flash_display_BitmapData_getPixel32 = {0x02, 0x00, 0x80, 0x16, "", "getPixel32", 0, &_uint, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_draw = {0x02, 0x00, 0x80, 0x16, "", "draw", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_setPixels = {0x02, 0x00, 0x80, 0x16, "", "setPixels", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_copyPixels = {0x02, 0x00, 0x80, 0x16, "", "copyPixels", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_histogram = {0x02, 0x00, 0x80, 0x16, "", "histogram", 0, &__AS3___vec_Vector, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_scroll = {0x02, 0x00, 0x80, 0x16, "", "scroll", 0, &voidclass, &flash_display_BitmapData, 0}; -static varinfo_t flash_display_BitmapData_transparent = {0x01, 0x00, 0x80, 0x16, "", "transparent", 0, &_Boolean, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_noise = {0x02, 0x00, 0x80, 0x16, "", "noise", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_threshold = {0x02, 0x00, 0x80, 0x16, "", "threshold", 0, &_uint, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_paletteMap = {0x02, 0x00, 0x80, 0x16, "", "paletteMap", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_perlinNoise = {0x02, 0x00, 0x80, 0x16, "", "perlinNoise", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_hitTest = {0x02, 0x00, 0x80, 0x16, "", "hitTest", 0, &_Boolean, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_getPixel = {0x02, 0x00, 0x80, 0x16, "", "getPixel", 0, &_uint, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_unlock = {0x02, 0x00, 0x80, 0x16, "", "unlock", 0, &voidclass, &flash_display_BitmapData, 0}; -static varinfo_t flash_display_BitmapData_height = {0x01, 0x00, 0x80, 0x16, "", "height", 0, &_int, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_copyChannel = {0x02, 0x00, 0x80, 0x16, "", "copyChannel", 0, &voidclass, &flash_display_BitmapData, 0}; -static varinfo_t flash_display_BitmapData_width = {0x01, 0x00, 0x80, 0x16, "", "width", 0, &_int, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_display_BitmapData, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_colorTransform = {0x02, 0x00, 0x80, 0x16, "", "colorTransform", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_generateFilterRect = {0x02, 0x00, 0x80, 0x16, "", "generateFilterRect", 0, &flash_geom_Rectangle, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_compare = {0x02, 0x00, 0x80, 0x16, "", "compare", 0, &_Object, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_fillRect = {0x02, 0x00, 0x80, 0x16, "", "fillRect", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_setVector = {0x02, 0x00, 0x80, 0x16, "", "setVector", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_floodFill = {0x02, 0x00, 0x80, 0x16, "", "floodFill", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_pixelDissolve = {0x02, 0x00, 0x80, 0x16, "", "pixelDissolve", 0, &_int, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_setPixel = {0x02, 0x00, 0x80, 0x16, "", "setPixel", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_setPixel32 = {0x02, 0x00, 0x80, 0x16, "", "setPixel32", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_lock = {0x02, 0x00, 0x80, 0x16, "", "lock", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_getVector = {0x02, 0x00, 0x80, 0x16, "", "getVector", 0, &__AS3___vec_Vector, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_getColorBoundsRect = {0x02, 0x00, 0x80, 0x16, "", "getColorBoundsRect", 0, &flash_geom_Rectangle, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_getPixels = {0x02, 0x00, 0x80, 0x16, "", "getPixels", 0, &flash_utils_ByteArray, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_merge = {0x02, 0x00, 0x80, 0x16, "", "merge", 0, &voidclass, &flash_display_BitmapData, 0}; -static varinfo_t flash_display_BitmapData_rect = {0x01, 0x00, 0x80, 0x16, "", "rect", 0, &flash_geom_Rectangle, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_applyFilter = {0x02, 0x00, 0x80, 0x16, "", "applyFilter", 0, &voidclass, &flash_display_BitmapData, 0}; -static methodinfo_t flash_display_BitmapData_dispose = {0x02, 0x00, 0x80, 0x16, "", "dispose", 0, &voidclass, &flash_display_BitmapData, 0}; -static classinfo_t flash_text_engine_LigatureLevel = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "LigatureLevel", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_LigatureLevel_UNCOMMON = {0x01, 0x00, 0x82, 0x16, "", "UNCOMMON", 0, &_String, &flash_text_engine_LigatureLevel, 0}; -static varinfo_t flash_text_engine_LigatureLevel_COMMON = {0x01, 0x00, 0x82, 0x16, "", "COMMON", 0, &_String, &flash_text_engine_LigatureLevel, 0}; -static varinfo_t flash_text_engine_LigatureLevel_EXOTIC = {0x01, 0x00, 0x82, 0x16, "", "EXOTIC", 0, &_String, &flash_text_engine_LigatureLevel, 0}; -static varinfo_t flash_text_engine_LigatureLevel_MINIMUM = {0x01, 0x00, 0x82, 0x16, "", "MINIMUM", 0, &_String, &flash_text_engine_LigatureLevel, 0}; -static varinfo_t flash_text_engine_LigatureLevel_NONE = {0x01, 0x00, 0x82, 0x16, "", "NONE", 0, &_String, &flash_text_engine_LigatureLevel, 0}; -static constant_t _Infinity_constant = {type: 6}; -static varinfo_t _Infinity = {0x01, 0x00, 0xa2, 0x16, "", "Infinity", 0, &_Number, 0, &_Infinity_constant}; -static classinfo_t flash_text_engine_FontDescription = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "FontDescription", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_FontDescription_renderingMode = {0x01, 0x00, 0x80, 0x16, "", "renderingMode", 0, &_String, &flash_text_engine_FontDescription, 0}; -static varinfo_t flash_text_engine_FontDescription_cffHinting = {0x01, 0x00, 0x80, 0x16, "", "cffHinting", 0, &_String, &flash_text_engine_FontDescription, 0}; -static varinfo_t flash_text_engine_FontDescription_fontPosture = {0x01, 0x00, 0x80, 0x16, "", "fontPosture", 0, &_String, &flash_text_engine_FontDescription, 0}; -static varinfo_t flash_text_engine_FontDescription_fontName = {0x01, 0x00, 0x80, 0x16, "", "fontName", 0, &_String, &flash_text_engine_FontDescription, 0}; -static varinfo_t flash_text_engine_FontDescription_fontLookup = {0x01, 0x00, 0x80, 0x16, "", "fontLookup", 0, &_String, &flash_text_engine_FontDescription, 0}; -static varinfo_t flash_text_engine_FontDescription_locked = {0x01, 0x00, 0x80, 0x16, "", "locked", 0, &_Boolean, &flash_text_engine_FontDescription, 0}; -static varinfo_t flash_text_engine_FontDescription_fontWeight = {0x01, 0x00, 0x80, 0x16, "", "fontWeight", 0, &_String, &flash_text_engine_FontDescription, 0}; -static methodinfo_t flash_text_engine_FontDescription_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_FontDescription, &flash_text_engine_FontDescription, 0}; -static methodinfo_t flash_text_engine_FontDescription_isFontCompatible = {0x02, 0x00, 0x82, 0x16, "", "isFontCompatible", 0, &_Boolean, &flash_text_engine_FontDescription, 0}; -static classinfo_t flash_text_engine_TextElement = {0x03, 0x00, 0x81, 0x16, "flash.text.engine", "TextElement", 0, &flash_text_engine_ContentElement, interfaces: {0}}; -static methodinfo_t flash_text_engine_TextElement_replaceText = {0x02, 0x00, 0x80, 0x16, "", "replaceText", 0, &voidclass, &flash_text_engine_TextElement, 0}; -static classinfo_t flash_display_SWFVersion = {0x03, 0x00, 0x81, 0x16, "flash.display", "SWFVersion", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_SWFVersion_FLASH4 = {0x01, 0x00, 0x82, 0x16, "", "FLASH4", 0, &_uint, &flash_display_SWFVersion, 0}; -static varinfo_t flash_display_SWFVersion_FLASH7 = {0x01, 0x00, 0x82, 0x16, "", "FLASH7", 0, &_uint, &flash_display_SWFVersion, 0}; -static varinfo_t flash_display_SWFVersion_FLASH8 = {0x01, 0x00, 0x82, 0x16, "", "FLASH8", 0, &_uint, &flash_display_SWFVersion, 0}; -static varinfo_t flash_display_SWFVersion_FLASH3 = {0x01, 0x00, 0x82, 0x16, "", "FLASH3", 0, &_uint, &flash_display_SWFVersion, 0}; -static varinfo_t flash_display_SWFVersion_FLASH6 = {0x01, 0x00, 0x82, 0x16, "", "FLASH6", 0, &_uint, &flash_display_SWFVersion, 0}; -static varinfo_t flash_display_SWFVersion_FLASH9 = {0x01, 0x00, 0x82, 0x16, "", "FLASH9", 0, &_uint, &flash_display_SWFVersion, 0}; -static varinfo_t flash_display_SWFVersion_FLASH2 = {0x01, 0x00, 0x82, 0x16, "", "FLASH2", 0, &_uint, &flash_display_SWFVersion, 0}; -static varinfo_t flash_display_SWFVersion_FLASH5 = {0x01, 0x00, 0x82, 0x16, "", "FLASH5", 0, &_uint, &flash_display_SWFVersion, 0}; -static varinfo_t flash_display_SWFVersion_FLASH10 = {0x01, 0x00, 0x82, 0x16, "", "FLASH10", 0, &_uint, &flash_display_SWFVersion, 0}; -static varinfo_t flash_display_SWFVersion_FLASH1 = {0x01, 0x00, 0x82, 0x16, "", "FLASH1", 0, &_uint, &flash_display_SWFVersion, 0}; -static classinfo_t flash_net_URLLoader = {0x03, 0x00, 0x80, 0x16, "flash.net", "URLLoader", 0, &flash_events_EventDispatcher, interfaces: {0}}; -static methodinfo_t flash_net_URLLoader_close = {0x02, 0x00, 0x80, 0x16, "", "close", 0, &voidclass, &flash_net_URLLoader, 0}; -static varinfo_t flash_net_URLLoader_bytesLoaded = {0x01, 0x00, 0x80, 0x16, "", "bytesLoaded", 0, &_uint, &flash_net_URLLoader, 0}; -static methodinfo_t flash_net_URLLoader_load = {0x02, 0x00, 0x80, 0x16, "", "load", 0, &voidclass, &flash_net_URLLoader, 0}; -static varinfo_t flash_net_URLLoader_bytesTotal = {0x01, 0x00, 0x80, 0x16, "", "bytesTotal", 0, &_uint, &flash_net_URLLoader, 0}; -static varinfo_t flash_net_URLLoader_dataFormat = {0x01, 0x00, 0x80, 0x16, "", "dataFormat", 0, &_String, &flash_net_URLLoader, 0}; -static varinfo_t flash_net_URLLoader_data = {0x01, 0x00, 0x80, 0x16, "", "data", 0, 0, &flash_net_URLLoader, 0}; -static classinfo_t flash_geom_Matrix = {0x03, 0x00, 0x80, 0x16, "flash.geom", "Matrix", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_geom_Matrix_b = {0x01, 0x00, 0x80, 0x16, "", "b", 0, &_Number, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_deltaTransformPoint = {0x02, 0x00, 0x80, 0x16, "", "deltaTransformPoint", 0, &flash_geom_Point, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_identity = {0x02, 0x00, 0x80, 0x16, "", "identity", 0, &voidclass, &flash_geom_Matrix, 0}; -static varinfo_t flash_geom_Matrix_ty = {0x01, 0x00, 0x80, 0x16, "", "ty", 0, &_Number, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_translate = {0x02, 0x00, 0x80, 0x16, "", "translate", 0, &voidclass, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_concat = {0x02, 0x00, 0x80, 0x16, "", "concat", 0, &voidclass, &flash_geom_Matrix, 0}; -static varinfo_t flash_geom_Matrix_c = {0x01, 0x00, 0x80, 0x16, "", "c", 0, &_Number, &flash_geom_Matrix, 0}; -static varinfo_t flash_geom_Matrix_a = {0x01, 0x00, 0x80, 0x16, "", "a", 0, &_Number, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_scale = {0x02, 0x00, 0x80, 0x16, "", "scale", 0, &voidclass, &flash_geom_Matrix, 0}; -static varinfo_t flash_geom_Matrix_d = {0x01, 0x00, 0x80, 0x16, "", "d", 0, &_Number, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_transformPoint = {0x02, 0x00, 0x80, 0x16, "", "transformPoint", 0, &flash_geom_Point, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_rotate = {0x02, 0x00, 0x80, 0x16, "", "rotate", 0, &voidclass, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_createGradientBox = {0x02, 0x00, 0x80, 0x16, "", "createGradientBox", 0, &voidclass, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_invert = {0x02, 0x00, 0x80, 0x16, "", "invert", 0, &voidclass, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_geom_Matrix, &flash_geom_Matrix, 0}; -static varinfo_t flash_geom_Matrix_tx = {0x01, 0x00, 0x80, 0x16, "", "tx", 0, &_Number, &flash_geom_Matrix, 0}; -static methodinfo_t flash_geom_Matrix_createBox = {0x02, 0x00, 0x80, 0x16, "", "createBox", 0, &voidclass, &flash_geom_Matrix, 0}; -static classinfo_t flash_accessibility_Accessibility = {0x03, 0x00, 0x81, 0x16, "flash.accessibility", "Accessibility", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_accessibility_Accessibility_active = {0x01, 0x00, 0x82, 0x16, "", "active", 0, &_Boolean, &flash_accessibility_Accessibility, 0}; -static methodinfo_t flash_accessibility_Accessibility_updateProperties = {0x02, 0x00, 0x82, 0x16, "", "updateProperties", 0, &voidclass, &flash_accessibility_Accessibility, 0}; -static methodinfo_t flash_accessibility_Accessibility_sendEvent = {0x02, 0x00, 0x82, 0x16, "", "sendEvent", 0, &voidclass, &flash_accessibility_Accessibility, 0}; -static methodinfo_t flash_net_sendToURL = {0x02, 0x00, 0x82, 0x16, "flash.net", "sendToURL", 0, &voidclass, 0, 0}; -static classinfo_t flash_filters_GlowFilter = {0x03, 0x00, 0x81, 0x16, "flash.filters", "GlowFilter", 0, &flash_filters_BitmapFilter, interfaces: {0}}; -static varinfo_t flash_filters_GlowFilter_blurY = {0x01, 0x00, 0x80, 0x16, "", "blurY", 0, &_Number, &flash_filters_GlowFilter, 0}; -static varinfo_t flash_filters_GlowFilter_strength = {0x01, 0x00, 0x80, 0x16, "", "strength", 0, &_Number, &flash_filters_GlowFilter, 0}; -static varinfo_t flash_filters_GlowFilter_inner = {0x01, 0x00, 0x80, 0x16, "", "inner", 0, &_Boolean, &flash_filters_GlowFilter, 0}; -static varinfo_t flash_filters_GlowFilter_color = {0x01, 0x00, 0x80, 0x16, "", "color", 0, &_uint, &flash_filters_GlowFilter, 0}; -static methodinfo_t flash_filters_GlowFilter_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_filters_BitmapFilter, &flash_filters_GlowFilter, 0}; -static varinfo_t flash_filters_GlowFilter_quality = {0x01, 0x00, 0x80, 0x16, "", "quality", 0, &_int, &flash_filters_GlowFilter, 0}; -static varinfo_t flash_filters_GlowFilter_knockout = {0x01, 0x00, 0x80, 0x16, "", "knockout", 0, &_Boolean, &flash_filters_GlowFilter, 0}; -static varinfo_t flash_filters_GlowFilter_alpha = {0x01, 0x00, 0x80, 0x16, "", "alpha", 0, &_Number, &flash_filters_GlowFilter, 0}; -static varinfo_t flash_filters_GlowFilter_blurX = {0x01, 0x00, 0x80, 0x16, "", "blurX", 0, &_Number, &flash_filters_GlowFilter, 0}; -static classinfo_t flash_events_FullScreenEvent = {0x03, 0x00, 0x80, 0x16, "flash.events", "FullScreenEvent", 0, &flash_events_ActivityEvent, interfaces: {0}}; -static methodinfo_t flash_events_FullScreenEvent_toString = {0x02, 0x00, 0x80, 0x16, "", "toString", 0, &_String, &flash_events_FullScreenEvent, 0}; -static methodinfo_t flash_events_FullScreenEvent_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_events_Event, &flash_events_FullScreenEvent, 0}; -static varinfo_t flash_events_FullScreenEvent_fullScreen = {0x01, 0x00, 0x80, 0x16, "", "fullScreen", 0, &_Boolean, &flash_events_FullScreenEvent, 0}; -static varinfo_t flash_events_FullScreenEvent_FULL_SCREEN = {0x01, 0x00, 0x82, 0x16, "", "FULL_SCREEN", 0, &_String, &flash_events_FullScreenEvent, 0}; -static classinfo_t flash_display_StageDisplayState = {0x03, 0x00, 0x81, 0x16, "flash.display", "StageDisplayState", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_StageDisplayState_NORMAL = {0x01, 0x00, 0x82, 0x16, "", "NORMAL", 0, &_String, &flash_display_StageDisplayState, 0}; -static varinfo_t flash_display_StageDisplayState_FULL_SCREEN = {0x01, 0x00, 0x82, 0x16, "", "FULL_SCREEN", 0, &_String, &flash_display_StageDisplayState, 0}; -static classinfo_t flash_text_engine_TextJustifier = {0x03, 0x00, 0x80, 0x16, "flash.text.engine", "TextJustifier", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_text_engine_TextJustifier_lineJustification = {0x01, 0x00, 0x80, 0x16, "", "lineJustification", 0, &_String, &flash_text_engine_TextJustifier, 0}; -static varinfo_t flash_text_engine_TextJustifier_locale = {0x01, 0x00, 0x80, 0x16, "", "locale", 0, &_String, &flash_text_engine_TextJustifier, 0}; -static methodinfo_t flash_text_engine_TextJustifier_clone = {0x02, 0x00, 0x80, 0x16, "", "clone", 0, &flash_text_engine_TextJustifier, &flash_text_engine_TextJustifier, 0}; -static methodinfo_t flash_text_engine_TextJustifier_getJustifierForLocale = {0x02, 0x00, 0x82, 0x16, "", "getJustifierForLocale", 0, &flash_text_engine_TextJustifier, &flash_text_engine_TextJustifier, 0}; -static classinfo_t flash_display_StageAlign = {0x03, 0x00, 0x81, 0x16, "flash.display", "StageAlign", 0, &_Object, interfaces: {0}}; -static varinfo_t flash_display_StageAlign_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "RIGHT", 0, &_String, &flash_display_StageAlign, 0}; -static varinfo_t flash_display_StageAlign_BOTTOM = {0x01, 0x00, 0x82, 0x16, "", "BOTTOM", 0, &_String, &flash_display_StageAlign, 0}; -static varinfo_t flash_display_StageAlign_BOTTOM_LEFT = {0x01, 0x00, 0x82, 0x16, "", "BOTTOM_LEFT", 0, &_String, &flash_display_StageAlign, 0}; -static varinfo_t flash_display_StageAlign_TOP_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "TOP_RIGHT", 0, &_String, &flash_display_StageAlign, 0}; -static varinfo_t flash_display_StageAlign_TOP = {0x01, 0x00, 0x82, 0x16, "", "TOP", 0, &_String, &flash_display_StageAlign, 0}; -static varinfo_t flash_display_StageAlign_LEFT = {0x01, 0x00, 0x82, 0x16, "", "LEFT", 0, &_String, &flash_display_StageAlign, 0}; -static varinfo_t flash_display_StageAlign_BOTTOM_RIGHT = {0x01, 0x00, 0x82, 0x16, "", "BOTTOM_RIGHT", 0, &_String, &flash_display_StageAlign, 0}; -static varinfo_t flash_display_StageAlign_TOP_LEFT = {0x01, 0x00, 0x82, 0x16, "", "TOP_LEFT", 0, &_String, &flash_display_StageAlign, 0}; -static constant_t _NaN_constant = {type: 6}; -static varinfo_t _NaN = {0x01, 0x00, 0xa2, 0x16, "", "NaN", 0, &_Number, 0, &_NaN_constant}; -static classinfo_t _ReferenceError = {0x03, 0x00, 0x88, 0x16, "", "ReferenceError", 0, &_Error, interfaces: {0}}; -static varinfo_t _ReferenceError_length = {0x01, 0x00, 0x82, 0x16, "", "length", 0, &_int, &_ReferenceError, 0}; -static classinfo_t flash_display_Shape = {0x03, 0x00, 0x80, 0x16, "flash.display", "Shape", 0, &flash_display_DisplayObject, interfaces: {0}}; -static varinfo_t flash_display_Shape_graphics = {0x01, 0x00, 0x80, 0x16, "", "graphics", 0, &flash_display_Graphics, &flash_display_Shape, 0}; -dict_t* builtin_getclasses() -{ - dict_t*d = dict_new2(&slotinfo_type); - dict_put(d, &flash_text_TextFormat, &flash_text_TextFormat); - dict_init2(&flash_text_TextFormat.members, &memberinfo_type, 31); - dict_init2(&flash_text_TextFormat.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_leading, &flash_text_TextFormat_leading); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_bold, &flash_text_TextFormat_bold); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_underline, &flash_text_TextFormat_underline); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_color, &flash_text_TextFormat_color); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_letterSpacing, &flash_text_TextFormat_letterSpacing); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_kerning, &flash_text_TextFormat_kerning); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_target, &flash_text_TextFormat_target); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_italic, &flash_text_TextFormat_italic); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_rightMargin, &flash_text_TextFormat_rightMargin); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_bullet, &flash_text_TextFormat_bullet); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_url, &flash_text_TextFormat_url); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_size, &flash_text_TextFormat_size); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_indent, &flash_text_TextFormat_indent); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_leftMargin, &flash_text_TextFormat_leftMargin); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_display, &flash_text_TextFormat_display); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_align, &flash_text_TextFormat_align); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_tabStops, &flash_text_TextFormat_tabStops); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_blockIndent, &flash_text_TextFormat_blockIndent); - dict_put(&flash_text_TextFormat.members, &flash_text_TextFormat_font, &flash_text_TextFormat_font); - dict_put(d, &flash_filters_BitmapFilter, &flash_filters_BitmapFilter); - dict_init2(&flash_filters_BitmapFilter.members, &memberinfo_type, 8); - dict_init2(&flash_filters_BitmapFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_BitmapFilter.members, &flash_filters_BitmapFilter_clone, &flash_filters_BitmapFilter_clone); - dict_put(d, &flash_filters_DropShadowFilter, &flash_filters_DropShadowFilter); - dict_init2(&flash_filters_DropShadowFilter.members, &memberinfo_type, 15); - dict_init2(&flash_filters_DropShadowFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_alpha, &flash_filters_DropShadowFilter_alpha); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_strength, &flash_filters_DropShadowFilter_strength); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_quality, &flash_filters_DropShadowFilter_quality); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_angle, &flash_filters_DropShadowFilter_angle); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_knockout, &flash_filters_DropShadowFilter_knockout); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_color, &flash_filters_DropShadowFilter_color); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_hideObject, &flash_filters_DropShadowFilter_hideObject); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_inner, &flash_filters_DropShadowFilter_inner); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_blurX, &flash_filters_DropShadowFilter_blurX); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_blurY, &flash_filters_DropShadowFilter_blurY); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_distance, &flash_filters_DropShadowFilter_distance); - dict_put(&flash_filters_DropShadowFilter.members, &flash_filters_DropShadowFilter_clone, &flash_filters_DropShadowFilter_clone); - dict_put(d, &adobe_utils_CustomActions, &adobe_utils_CustomActions); - dict_init2(&adobe_utils_CustomActions.members, &memberinfo_type, 8); - dict_init2(&adobe_utils_CustomActions.static_members, &memberinfo_type, 8); - dict_put(&adobe_utils_CustomActions.static_members, &adobe_utils_CustomActions_actionsList, &adobe_utils_CustomActions_actionsList); - dict_put(&adobe_utils_CustomActions.static_members, &adobe_utils_CustomActions_uninstallActions, &adobe_utils_CustomActions_uninstallActions); - dict_put(&adobe_utils_CustomActions.static_members, &adobe_utils_CustomActions_getActions, &adobe_utils_CustomActions_getActions); - dict_put(&adobe_utils_CustomActions.static_members, &adobe_utils_CustomActions_installActions, &adobe_utils_CustomActions_installActions); - dict_put(d, &flash_text_engine_TextLineValidity, &flash_text_engine_TextLineValidity); - dict_init2(&flash_text_engine_TextLineValidity.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TextLineValidity.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TextLineValidity.static_members, &flash_text_engine_TextLineValidity_STATIC, &flash_text_engine_TextLineValidity_STATIC); - dict_put(&flash_text_engine_TextLineValidity.static_members, &flash_text_engine_TextLineValidity_VALID, &flash_text_engine_TextLineValidity_VALID); - dict_put(&flash_text_engine_TextLineValidity.static_members, &flash_text_engine_TextLineValidity_INVALID, &flash_text_engine_TextLineValidity_INVALID); - dict_put(&flash_text_engine_TextLineValidity.static_members, &flash_text_engine_TextLineValidity_POSSIBLY_INVALID, &flash_text_engine_TextLineValidity_POSSIBLY_INVALID); - dict_put(d, &flash_display_LineScaleMode, &flash_display_LineScaleMode); - dict_init2(&flash_display_LineScaleMode.members, &memberinfo_type, 8); - dict_init2(&flash_display_LineScaleMode.static_members, &memberinfo_type, 8); - dict_put(&flash_display_LineScaleMode.static_members, &flash_display_LineScaleMode_NORMAL, &flash_display_LineScaleMode_NORMAL); - dict_put(&flash_display_LineScaleMode.static_members, &flash_display_LineScaleMode_VERTICAL, &flash_display_LineScaleMode_VERTICAL); - dict_put(&flash_display_LineScaleMode.static_members, &flash_display_LineScaleMode_NONE, &flash_display_LineScaleMode_NONE); - dict_put(&flash_display_LineScaleMode.static_members, &flash_display_LineScaleMode_HORIZONTAL, &flash_display_LineScaleMode_HORIZONTAL); - dict_put(d, &flash_geom_Transform, &flash_geom_Transform); - dict_init2(&flash_geom_Transform.members, &memberinfo_type, 15); - dict_init2(&flash_geom_Transform.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_Transform.members, &flash_geom_Transform_matrix, &flash_geom_Transform_matrix); - dict_put(&flash_geom_Transform.members, &flash_geom_Transform_perspectiveProjection, &flash_geom_Transform_perspectiveProjection); - dict_put(&flash_geom_Transform.members, &flash_geom_Transform_concatenatedMatrix, &flash_geom_Transform_concatenatedMatrix); - dict_put(&flash_geom_Transform.members, &flash_geom_Transform_colorTransform, &flash_geom_Transform_colorTransform); - dict_put(&flash_geom_Transform.members, &flash_geom_Transform_getRelativeMatrix3D, &flash_geom_Transform_getRelativeMatrix3D); - dict_put(&flash_geom_Transform.members, &flash_geom_Transform_pixelBounds, &flash_geom_Transform_pixelBounds); - dict_put(&flash_geom_Transform.members, &flash_geom_Transform_matrix3D, &flash_geom_Transform_matrix3D); - dict_put(&flash_geom_Transform.members, &flash_geom_Transform_concatenatedColorTransform, &flash_geom_Transform_concatenatedColorTransform); - dict_put(d, &flash_ui_KeyLocation, &flash_ui_KeyLocation); - dict_init2(&flash_ui_KeyLocation.members, &memberinfo_type, 8); - dict_init2(&flash_ui_KeyLocation.static_members, &memberinfo_type, 8); - dict_put(&flash_ui_KeyLocation.static_members, &flash_ui_KeyLocation_LEFT, &flash_ui_KeyLocation_LEFT); - dict_put(&flash_ui_KeyLocation.static_members, &flash_ui_KeyLocation_RIGHT, &flash_ui_KeyLocation_RIGHT); - dict_put(&flash_ui_KeyLocation.static_members, &flash_ui_KeyLocation_NUM_PAD, &flash_ui_KeyLocation_NUM_PAD); - dict_put(&flash_ui_KeyLocation.static_members, &flash_ui_KeyLocation_STANDARD, &flash_ui_KeyLocation_STANDARD); - dict_put(d, &flash_events_MouseEvent, &flash_events_MouseEvent); - dict_init2(&flash_events_MouseEvent.members, &memberinfo_type, 31); - dict_init2(&flash_events_MouseEvent.static_members, &memberinfo_type, 15); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_localY, &flash_events_MouseEvent_localY); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_updateAfterEvent, &flash_events_MouseEvent_updateAfterEvent); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_delta, &flash_events_MouseEvent_delta); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_stageX, &flash_events_MouseEvent_stageX); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_toString, &flash_events_MouseEvent_toString); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_relatedObject, &flash_events_MouseEvent_relatedObject); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_isRelatedObjectInaccessible, &flash_events_MouseEvent_isRelatedObjectInaccessible); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_shiftKey, &flash_events_MouseEvent_shiftKey); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_stageY, &flash_events_MouseEvent_stageY); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_altKey, &flash_events_MouseEvent_altKey); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_clone, &flash_events_MouseEvent_clone); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_ctrlKey, &flash_events_MouseEvent_ctrlKey); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_localX, &flash_events_MouseEvent_localX); - dict_put(&flash_events_MouseEvent.members, &flash_events_MouseEvent_buttonDown, &flash_events_MouseEvent_buttonDown); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_ROLL_OVER, &flash_events_MouseEvent_ROLL_OVER); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_ROLL_OUT, &flash_events_MouseEvent_ROLL_OUT); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_DOWN, &flash_events_MouseEvent_MOUSE_DOWN); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_DOUBLE_CLICK, &flash_events_MouseEvent_DOUBLE_CLICK); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_WHEEL, &flash_events_MouseEvent_MOUSE_WHEEL); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_CLICK, &flash_events_MouseEvent_CLICK); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_MOVE, &flash_events_MouseEvent_MOUSE_MOVE); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_UP, &flash_events_MouseEvent_MOUSE_UP); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_OVER, &flash_events_MouseEvent_MOUSE_OVER); - dict_put(&flash_events_MouseEvent.static_members, &flash_events_MouseEvent_MOUSE_OUT, &flash_events_MouseEvent_MOUSE_OUT); - dict_put(d, &flash_text_engine_LineJustification, &flash_text_engine_LineJustification); - dict_init2(&flash_text_engine_LineJustification.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_LineJustification.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_LineJustification.static_members, &flash_text_engine_LineJustification_ALL_INCLUDING_LAST, &flash_text_engine_LineJustification_ALL_INCLUDING_LAST); - dict_put(&flash_text_engine_LineJustification.static_members, &flash_text_engine_LineJustification_UNJUSTIFIED, &flash_text_engine_LineJustification_UNJUSTIFIED); - dict_put(&flash_text_engine_LineJustification.static_members, &flash_text_engine_LineJustification_ALL_BUT_LAST, &flash_text_engine_LineJustification_ALL_BUT_LAST); - dict_put(d, &flash_media_Camera, &flash_media_Camera); - dict_init2(&flash_media_Camera.members, &memberinfo_type, 31); - dict_init2(&flash_media_Camera.static_members, &memberinfo_type, 8); - dict_put(&flash_media_Camera.members, &flash_media_Camera_fps, &flash_media_Camera_fps); - dict_put(&flash_media_Camera.members, &flash_media_Camera_setMode, &flash_media_Camera_setMode); - dict_put(&flash_media_Camera.members, &flash_media_Camera_keyFrameInterval, &flash_media_Camera_keyFrameInterval); - dict_put(&flash_media_Camera.members, &flash_media_Camera_motionTimeout, &flash_media_Camera_motionTimeout); - dict_put(&flash_media_Camera.members, &flash_media_Camera_width, &flash_media_Camera_width); - dict_put(&flash_media_Camera.members, &flash_media_Camera_setCursor, &flash_media_Camera_setCursor); - dict_put(&flash_media_Camera.members, &flash_media_Camera_setLoopback, &flash_media_Camera_setLoopback); - dict_put(&flash_media_Camera.members, &flash_media_Camera_height, &flash_media_Camera_height); - dict_put(&flash_media_Camera.members, &flash_media_Camera_index, &flash_media_Camera_index); - dict_put(&flash_media_Camera.members, &flash_media_Camera_name, &flash_media_Camera_name); - dict_put(&flash_media_Camera.members, &flash_media_Camera_currentFPS, &flash_media_Camera_currentFPS); - dict_put(&flash_media_Camera.members, &flash_media_Camera_setKeyFrameInterval, &flash_media_Camera_setKeyFrameInterval); - dict_put(&flash_media_Camera.members, &flash_media_Camera_quality, &flash_media_Camera_quality); - dict_put(&flash_media_Camera.members, &flash_media_Camera_motionLevel, &flash_media_Camera_motionLevel); - dict_put(&flash_media_Camera.members, &flash_media_Camera_bandwidth, &flash_media_Camera_bandwidth); - dict_put(&flash_media_Camera.members, &flash_media_Camera_muted, &flash_media_Camera_muted); - dict_put(&flash_media_Camera.members, &flash_media_Camera_activityLevel, &flash_media_Camera_activityLevel); - dict_put(&flash_media_Camera.members, &flash_media_Camera_loopback, &flash_media_Camera_loopback); - dict_put(&flash_media_Camera.members, &flash_media_Camera_setQuality, &flash_media_Camera_setQuality); - dict_put(&flash_media_Camera.members, &flash_media_Camera_setMotionLevel, &flash_media_Camera_setMotionLevel); - dict_put(&flash_media_Camera.static_members, &flash_media_Camera_getCamera, &flash_media_Camera_getCamera); - dict_put(&flash_media_Camera.static_members, &flash_media_Camera_names, &flash_media_Camera_names); - dict_put(d, &flash_net_registerClassAlias, &flash_net_registerClassAlias); - dict_put(d, &flash_accessibility_AccessibilityImplementation, &flash_accessibility_AccessibilityImplementation); - dict_init2(&flash_accessibility_AccessibilityImplementation.members, &memberinfo_type, 15); - dict_init2(&flash_accessibility_AccessibilityImplementation.static_members, &memberinfo_type, 8); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accState, &flash_accessibility_AccessibilityImplementation_get_accState); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accName, &flash_accessibility_AccessibilityImplementation_get_accName); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accSelection, &flash_accessibility_AccessibilityImplementation_get_accSelection); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_accDoDefaultAction, &flash_accessibility_AccessibilityImplementation_accDoDefaultAction); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accFocus, &flash_accessibility_AccessibilityImplementation_get_accFocus); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accDefaultAction, &flash_accessibility_AccessibilityImplementation_get_accDefaultAction); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_accSelect, &flash_accessibility_AccessibilityImplementation_accSelect); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accValue, &flash_accessibility_AccessibilityImplementation_get_accValue); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_stub, &flash_accessibility_AccessibilityImplementation_stub); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_get_accRole, &flash_accessibility_AccessibilityImplementation_get_accRole); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_errno, &flash_accessibility_AccessibilityImplementation_errno); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_isLabeledBy, &flash_accessibility_AccessibilityImplementation_isLabeledBy); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_accLocation, &flash_accessibility_AccessibilityImplementation_accLocation); - dict_put(&flash_accessibility_AccessibilityImplementation.members, &flash_accessibility_AccessibilityImplementation_getChildIDArray, &flash_accessibility_AccessibilityImplementation_getChildIDArray); - dict_put(d, &flash_utils_ByteArray, &flash_utils_ByteArray); - dict_init2(&flash_utils_ByteArray.members, &memberinfo_type, 63); - dict_init2(&flash_utils_ByteArray.static_members, &memberinfo_type, 8); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeBoolean, &flash_utils_ByteArray_writeBoolean); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readDouble, &flash_utils_ByteArray_readDouble); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_toString, &flash_utils_ByteArray_toString); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeByte, &flash_utils_ByteArray_writeByte); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeObject, &flash_utils_ByteArray_writeObject); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUTFBytes, &flash_utils_ByteArray_readUTFBytes); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeMultiByte, &flash_utils_ByteArray_writeMultiByte); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_uncompress, &flash_utils_ByteArray_uncompress); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUnsignedByte, &flash_utils_ByteArray_readUnsignedByte); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeInt, &flash_utils_ByteArray_writeInt); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_deflate, &flash_utils_ByteArray_deflate); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readMultiByte, &flash_utils_ByteArray_readMultiByte); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readBytes, &flash_utils_ByteArray_readBytes); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeShort, &flash_utils_ByteArray_writeShort); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_position, &flash_utils_ByteArray_position); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readShort, &flash_utils_ByteArray_readShort); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeUTF, &flash_utils_ByteArray_writeUTF); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeBytes, &flash_utils_ByteArray_writeBytes); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_objectEncoding, &flash_utils_ByteArray_objectEncoding); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readObject, &flash_utils_ByteArray_readObject); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_length, &flash_utils_ByteArray_length); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeUnsignedInt, &flash_utils_ByteArray_writeUnsignedInt); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeDouble, &flash_utils_ByteArray_writeDouble); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeFloat, &flash_utils_ByteArray_writeFloat); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readInt, &flash_utils_ByteArray_readInt); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readByte, &flash_utils_ByteArray_readByte); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_bytesAvailable, &flash_utils_ByteArray_bytesAvailable); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_clear, &flash_utils_ByteArray_clear); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_endian, &flash_utils_ByteArray_endian); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUnsignedShort, &flash_utils_ByteArray_readUnsignedShort); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUnsignedInt, &flash_utils_ByteArray_readUnsignedInt); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readFloat, &flash_utils_ByteArray_readFloat); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_compress, &flash_utils_ByteArray_compress); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_writeUTFBytes, &flash_utils_ByteArray_writeUTFBytes); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readBoolean, &flash_utils_ByteArray_readBoolean); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_inflate, &flash_utils_ByteArray_inflate); - dict_put(&flash_utils_ByteArray.members, &flash_utils_ByteArray_readUTF, &flash_utils_ByteArray_readUTF); - dict_put(&flash_utils_ByteArray.static_members, &flash_utils_ByteArray_defaultObjectEncoding, &flash_utils_ByteArray_defaultObjectEncoding); - dict_put(d, &flash_sampler_stopSampling, &flash_sampler_stopSampling); - dict_put(d, &flash_events_SyncEvent, &flash_events_SyncEvent); - dict_init2(&flash_events_SyncEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_SyncEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_SyncEvent.members, &flash_events_SyncEvent_toString, &flash_events_SyncEvent_toString); - dict_put(&flash_events_SyncEvent.members, &flash_events_SyncEvent_clone, &flash_events_SyncEvent_clone); - dict_put(&flash_events_SyncEvent.members, &flash_events_SyncEvent_changeList, &flash_events_SyncEvent_changeList); - dict_put(&flash_events_SyncEvent.static_members, &flash_events_SyncEvent_SYNC, &flash_events_SyncEvent_SYNC); - dict_put(d, &_encodeURIComponent, &_encodeURIComponent); - dict_put(d, &flash_net_Socket, &flash_net_Socket); - dict_init2(&flash_net_Socket.members, &memberinfo_type, 63); - dict_init2(&flash_net_Socket.static_members, &memberinfo_type, 8); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeBoolean, &flash_net_Socket_writeBoolean); - dict_put(&flash_net_Socket.members, &flash_net_Socket_connect, &flash_net_Socket_connect); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readDouble, &flash_net_Socket_readDouble); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeByte, &flash_net_Socket_writeByte); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeObject, &flash_net_Socket_writeObject); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readUTFBytes, &flash_net_Socket_readUTFBytes); - dict_put(&flash_net_Socket.members, &flash_net_Socket_close, &flash_net_Socket_close); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeMultiByte, &flash_net_Socket_writeMultiByte); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readUnsignedByte, &flash_net_Socket_readUnsignedByte); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeInt, &flash_net_Socket_writeInt); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readMultiByte, &flash_net_Socket_readMultiByte); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readBytes, &flash_net_Socket_readBytes); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeShort, &flash_net_Socket_writeShort); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readShort, &flash_net_Socket_readShort); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeUTF, &flash_net_Socket_writeUTF); - dict_put(&flash_net_Socket.members, &flash_net_Socket_timeout, &flash_net_Socket_timeout); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeBytes, &flash_net_Socket_writeBytes); - dict_put(&flash_net_Socket.members, &flash_net_Socket_connected, &flash_net_Socket_connected); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readObject, &flash_net_Socket_readObject); - dict_put(&flash_net_Socket.members, &flash_net_Socket_objectEncoding, &flash_net_Socket_objectEncoding); - dict_put(&flash_net_Socket.members, &flash_net_Socket_flush, &flash_net_Socket_flush); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeUnsignedInt, &flash_net_Socket_writeUnsignedInt); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeDouble, &flash_net_Socket_writeDouble); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeFloat, &flash_net_Socket_writeFloat); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readInt, &flash_net_Socket_readInt); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readByte, &flash_net_Socket_readByte); - dict_put(&flash_net_Socket.members, &flash_net_Socket_bytesAvailable, &flash_net_Socket_bytesAvailable); - dict_put(&flash_net_Socket.members, &flash_net_Socket_endian, &flash_net_Socket_endian); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readUnsignedShort, &flash_net_Socket_readUnsignedShort); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readUnsignedInt, &flash_net_Socket_readUnsignedInt); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readFloat, &flash_net_Socket_readFloat); - dict_put(&flash_net_Socket.members, &flash_net_Socket_writeUTFBytes, &flash_net_Socket_writeUTFBytes); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readBoolean, &flash_net_Socket_readBoolean); - dict_put(&flash_net_Socket.members, &flash_net_Socket_readUTF, &flash_net_Socket_readUTF); - dict_put(d, &_unescape, &_unescape); - dict_put(d, &flash_utils_Timer, &flash_utils_Timer); - dict_init2(&flash_utils_Timer.members, &memberinfo_type, 8); - dict_init2(&flash_utils_Timer.static_members, &memberinfo_type, 8); - dict_put(&flash_utils_Timer.members, &flash_utils_Timer_reset, &flash_utils_Timer_reset); - dict_put(&flash_utils_Timer.members, &flash_utils_Timer_running, &flash_utils_Timer_running); - dict_put(&flash_utils_Timer.members, &flash_utils_Timer_repeatCount, &flash_utils_Timer_repeatCount); - dict_put(&flash_utils_Timer.members, &flash_utils_Timer_stop, &flash_utils_Timer_stop); - dict_put(&flash_utils_Timer.members, &flash_utils_Timer_start, &flash_utils_Timer_start); - dict_put(&flash_utils_Timer.members, &flash_utils_Timer_currentCount, &flash_utils_Timer_currentCount); - dict_put(&flash_utils_Timer.members, &flash_utils_Timer_delay, &flash_utils_Timer_delay); - dict_put(d, &_Array, &_Array); - dict_init2(&_Array.members, &memberinfo_type, 31); - dict_init2(&_Array.static_members, &memberinfo_type, 8); - dict_put(&_Array.members, &_Array_forEach, &_Array_forEach); - dict_put(&_Array.members, &_Array_sortOn, &_Array_sortOn); - dict_put(&_Array.members, &_Array_indexOf, &_Array_indexOf); - dict_put(&_Array.members, &_Array_splice, &_Array_splice); - dict_put(&_Array.members, &_Array_lastIndexOf, &_Array_lastIndexOf); - dict_put(&_Array.members, &_Array_map, &_Array_map); - dict_put(&_Array.members, &_Array_concat, &_Array_concat); - dict_put(&_Array.members, &_Array_shift, &_Array_shift); - dict_put(&_Array.members, &_Array_unshift, &_Array_unshift); - dict_put(&_Array.members, &_Array_some, &_Array_some); - dict_put(&_Array.members, &_Array_filter, &_Array_filter); - dict_put(&_Array.members, &_Array_join, &_Array_join); - dict_put(&_Array.members, &_Array_slice, &_Array_slice); - dict_put(&_Array.members, &_Array_every, &_Array_every); - dict_put(&_Array.members, &_Array_pop, &_Array_pop); - dict_put(&_Array.members, &_Array_sort, &_Array_sort); - dict_put(&_Array.members, &_Array_reverse, &_Array_reverse); - dict_put(&_Array.members, &_Array_push, &_Array_push); - dict_put(&_Array.members, &_Array_length, &_Array_length); - dict_put(&_Array.static_members, &_Array_DESCENDING, &_Array_DESCENDING); - dict_put(&_Array.static_members, &_Array_UNIQUESORT, &_Array_UNIQUESORT); - dict_put(&_Array.static_members, &_Array_RETURNINDEXEDARRAY, &_Array_RETURNINDEXEDARRAY); - dict_put(&_Array.static_members, &_Array_CASEINSENSITIVE, &_Array_CASEINSENSITIVE); - dict_put(&_Array.static_members, &_Array_NUMERIC, &_Array_NUMERIC); - dict_put(d, &flash_geom_ColorTransform, &flash_geom_ColorTransform); - dict_init2(&flash_geom_ColorTransform.members, &memberinfo_type, 15); - dict_init2(&flash_geom_ColorTransform.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_blueOffset, &flash_geom_ColorTransform_blueOffset); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_greenOffset, &flash_geom_ColorTransform_greenOffset); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_greenMultiplier, &flash_geom_ColorTransform_greenMultiplier); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_redMultiplier, &flash_geom_ColorTransform_redMultiplier); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_color, &flash_geom_ColorTransform_color); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_concat, &flash_geom_ColorTransform_concat); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_alphaOffset, &flash_geom_ColorTransform_alphaOffset); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_blueMultiplier, &flash_geom_ColorTransform_blueMultiplier); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_toString, &flash_geom_ColorTransform_toString); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_alphaMultiplier, &flash_geom_ColorTransform_alphaMultiplier); - dict_put(&flash_geom_ColorTransform.members, &flash_geom_ColorTransform_redOffset, &flash_geom_ColorTransform_redOffset); - dict_put(d, &flash_text_GridFitType, &flash_text_GridFitType); - dict_init2(&flash_text_GridFitType.members, &memberinfo_type, 8); - dict_init2(&flash_text_GridFitType.static_members, &memberinfo_type, 8); - dict_put(&flash_text_GridFitType.static_members, &flash_text_GridFitType_SUBPIXEL, &flash_text_GridFitType_SUBPIXEL); - dict_put(&flash_text_GridFitType.static_members, &flash_text_GridFitType_PIXEL, &flash_text_GridFitType_PIXEL); - dict_put(&flash_text_GridFitType.static_members, &flash_text_GridFitType_NONE, &flash_text_GridFitType_NONE); - dict_put(d, &flash_filters_DisplacementMapFilterMode, &flash_filters_DisplacementMapFilterMode); - dict_init2(&flash_filters_DisplacementMapFilterMode.members, &memberinfo_type, 8); - dict_init2(&flash_filters_DisplacementMapFilterMode.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_DisplacementMapFilterMode.static_members, &flash_filters_DisplacementMapFilterMode_COLOR, &flash_filters_DisplacementMapFilterMode_COLOR); - dict_put(&flash_filters_DisplacementMapFilterMode.static_members, &flash_filters_DisplacementMapFilterMode_WRAP, &flash_filters_DisplacementMapFilterMode_WRAP); - dict_put(&flash_filters_DisplacementMapFilterMode.static_members, &flash_filters_DisplacementMapFilterMode_CLAMP, &flash_filters_DisplacementMapFilterMode_CLAMP); - dict_put(&flash_filters_DisplacementMapFilterMode.static_members, &flash_filters_DisplacementMapFilterMode_IGNORE, &flash_filters_DisplacementMapFilterMode_IGNORE); - dict_put(d, &flash_text_TextFieldType, &flash_text_TextFieldType); - dict_init2(&flash_text_TextFieldType.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextFieldType.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextFieldType.static_members, &flash_text_TextFieldType_DYNAMIC, &flash_text_TextFieldType_DYNAMIC); - dict_put(&flash_text_TextFieldType.static_members, &flash_text_TextFieldType_INPUT, &flash_text_TextFieldType_INPUT); - dict_put(d, &flash_display_IGraphicsStroke, &flash_display_IGraphicsStroke); - dict_init2(&flash_display_IGraphicsStroke.members, &memberinfo_type, 8); - dict_init2(&flash_display_IGraphicsStroke.static_members, &memberinfo_type, 8); - dict_put(d, &flash_media_SoundLoaderContext, &flash_media_SoundLoaderContext); - dict_init2(&flash_media_SoundLoaderContext.members, &memberinfo_type, 8); - dict_init2(&flash_media_SoundLoaderContext.static_members, &memberinfo_type, 8); - dict_put(&flash_media_SoundLoaderContext.members, &flash_media_SoundLoaderContext_checkPolicyFile, &flash_media_SoundLoaderContext_checkPolicyFile); - dict_put(&flash_media_SoundLoaderContext.members, &flash_media_SoundLoaderContext_bufferTime, &flash_media_SoundLoaderContext_bufferTime); - dict_put(d, &flash_net_IDynamicPropertyOutput, &flash_net_IDynamicPropertyOutput); - dict_init2(&flash_net_IDynamicPropertyOutput.members, &memberinfo_type, 8); - dict_init2(&flash_net_IDynamicPropertyOutput.static_members, &memberinfo_type, 8); - dict_put(&flash_net_IDynamicPropertyOutput.members, &flash_net_IDynamicPropertyOutput_writeDynamicProperty, &flash_net_IDynamicPropertyOutput_writeDynamicProperty); - dict_put(d, &flash_display_IGraphicsData, &flash_display_IGraphicsData); - dict_init2(&flash_display_IGraphicsData.members, &memberinfo_type, 8); - dict_init2(&flash_display_IGraphicsData.static_members, &memberinfo_type, 8); - dict_put(d, &flash_utils_getDefinitionByName, &flash_utils_getDefinitionByName); - dict_put(d, &_Function, &_Function); - dict_init2(&_Function.members, &memberinfo_type, 8); - dict_init2(&_Function.static_members, &memberinfo_type, 8); - dict_put(&_Function.members, &_Function_length, &_Function_length); - dict_put(&_Function.members, &_Function_apply, &_Function_apply); - dict_put(&_Function.members, &_Function_call, &_Function_call); - dict_put(&_Function.members, &_Function_prototype, &_Function_prototype); - dict_put(d, &flash_geom_PerspectiveProjection, &flash_geom_PerspectiveProjection); - dict_init2(&flash_geom_PerspectiveProjection.members, &memberinfo_type, 8); - dict_init2(&flash_geom_PerspectiveProjection.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_PerspectiveProjection.members, &flash_geom_PerspectiveProjection_fieldOfView, &flash_geom_PerspectiveProjection_fieldOfView); - dict_put(&flash_geom_PerspectiveProjection.members, &flash_geom_PerspectiveProjection_projectionCenter, &flash_geom_PerspectiveProjection_projectionCenter); - dict_put(&flash_geom_PerspectiveProjection.members, &flash_geom_PerspectiveProjection_toMatrix3D, &flash_geom_PerspectiveProjection_toMatrix3D); - dict_put(&flash_geom_PerspectiveProjection.members, &flash_geom_PerspectiveProjection_focalLength, &flash_geom_PerspectiveProjection_focalLength); - dict_put(d, &flash_text_engine_BreakOpportunity, &flash_text_engine_BreakOpportunity); - dict_init2(&flash_text_engine_BreakOpportunity.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_BreakOpportunity.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_BreakOpportunity.static_members, &flash_text_engine_BreakOpportunity_AUTO, &flash_text_engine_BreakOpportunity_AUTO); - dict_put(&flash_text_engine_BreakOpportunity.static_members, &flash_text_engine_BreakOpportunity_ANY, &flash_text_engine_BreakOpportunity_ANY); - dict_put(&flash_text_engine_BreakOpportunity.static_members, &flash_text_engine_BreakOpportunity_ALL, &flash_text_engine_BreakOpportunity_ALL); - dict_put(&flash_text_engine_BreakOpportunity.static_members, &flash_text_engine_BreakOpportunity_NONE, &flash_text_engine_BreakOpportunity_NONE); - dict_put(d, &flash_sampler__getInvocationCount, &flash_sampler__getInvocationCount); - dict_put(d, &_parseFloat, &_parseFloat); - dict_put(d, &flash_events_NetStatusEvent, &flash_events_NetStatusEvent); - dict_init2(&flash_events_NetStatusEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_NetStatusEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_NetStatusEvent.members, &flash_events_NetStatusEvent_toString, &flash_events_NetStatusEvent_toString); - dict_put(&flash_events_NetStatusEvent.members, &flash_events_NetStatusEvent_info, &flash_events_NetStatusEvent_info); - dict_put(&flash_events_NetStatusEvent.members, &flash_events_NetStatusEvent_clone, &flash_events_NetStatusEvent_clone); - dict_put(&flash_events_NetStatusEvent.static_members, &flash_events_NetStatusEvent_NET_STATUS, &flash_events_NetStatusEvent_NET_STATUS); - dict_put(d, &flash_display_ShaderJob, &flash_display_ShaderJob); - dict_init2(&flash_display_ShaderJob.members, &memberinfo_type, 8); - dict_init2(&flash_display_ShaderJob.static_members, &memberinfo_type, 8); - dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_cancel, &flash_display_ShaderJob_cancel); - dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_width, &flash_display_ShaderJob_width); - dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_start, &flash_display_ShaderJob_start); - dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_shader, &flash_display_ShaderJob_shader); - dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_height, &flash_display_ShaderJob_height); - dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_target, &flash_display_ShaderJob_target); - dict_put(&flash_display_ShaderJob.members, &flash_display_ShaderJob_progress, &flash_display_ShaderJob_progress); - dict_put(d, &_VerifyError, &_VerifyError); - dict_init2(&_VerifyError.members, &memberinfo_type, 8); - dict_init2(&_VerifyError.static_members, &memberinfo_type, 8); - dict_put(&_VerifyError.static_members, &_VerifyError_length, &_VerifyError_length); - dict_put(d, &flash_events_AsyncErrorEvent, &flash_events_AsyncErrorEvent); - dict_init2(&flash_events_AsyncErrorEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_AsyncErrorEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_AsyncErrorEvent.members, &flash_events_AsyncErrorEvent_toString, &flash_events_AsyncErrorEvent_toString); - dict_put(&flash_events_AsyncErrorEvent.members, &flash_events_AsyncErrorEvent_error, &flash_events_AsyncErrorEvent_error); - dict_put(&flash_events_AsyncErrorEvent.members, &flash_events_AsyncErrorEvent_clone, &flash_events_AsyncErrorEvent_clone); - dict_put(&flash_events_AsyncErrorEvent.static_members, &flash_events_AsyncErrorEvent_ASYNC_ERROR, &flash_events_AsyncErrorEvent_ASYNC_ERROR); - dict_put(d, &flash_net_SharedObject, &flash_net_SharedObject); - dict_init2(&flash_net_SharedObject.members, &memberinfo_type, 15); - dict_init2(&flash_net_SharedObject.static_members, &memberinfo_type, 8); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_objectEncoding, &flash_net_SharedObject_objectEncoding); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_client, &flash_net_SharedObject_client); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_setProperty, &flash_net_SharedObject_setProperty); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_clear, &flash_net_SharedObject_clear); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_flush, &flash_net_SharedObject_flush); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_connect, &flash_net_SharedObject_connect); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_size, &flash_net_SharedObject_size); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_setDirty, &flash_net_SharedObject_setDirty); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_send, &flash_net_SharedObject_send); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_close, &flash_net_SharedObject_close); - dict_put(&flash_net_SharedObject.members, &flash_net_SharedObject_data, &flash_net_SharedObject_data); - dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_defaultObjectEncoding, &flash_net_SharedObject_defaultObjectEncoding); - dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_getDiskUsage, &flash_net_SharedObject_getDiskUsage); - dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_getRemote, &flash_net_SharedObject_getRemote); - dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_deleteAll, &flash_net_SharedObject_deleteAll); - dict_put(&flash_net_SharedObject.static_members, &flash_net_SharedObject_getLocal, &flash_net_SharedObject_getLocal); - dict_put(d, &_Namespace, &_Namespace); - dict_init2(&_Namespace.members, &memberinfo_type, 8); - dict_init2(&_Namespace.static_members, &memberinfo_type, 8); - dict_put(&_Namespace.members, &_Namespace_valueOf, &_Namespace_valueOf); - dict_put(&_Namespace.members, &_Namespace_toString, &_Namespace_toString); - dict_put(&_Namespace.members, &_Namespace_uri, &_Namespace_uri); - dict_put(&_Namespace.members, &_Namespace_prefix, &_Namespace_prefix); - dict_put(&_Namespace.static_members, &_Namespace_length, &_Namespace_length); - dict_put(d, &flash_utils_setTimeout, &flash_utils_setTimeout); - dict_put(d, &flash_geom_Matrix3D, &flash_geom_Matrix3D); - dict_init2(&flash_geom_Matrix3D.members, &memberinfo_type, 31); - dict_init2(&flash_geom_Matrix3D.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_decompose, &flash_geom_Matrix3D_decompose); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_pointAt, &flash_geom_Matrix3D_pointAt); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_identity, &flash_geom_Matrix3D_identity); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_transformVector, &flash_geom_Matrix3D_transformVector); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_appendRotation, &flash_geom_Matrix3D_appendRotation); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_determinant, &flash_geom_Matrix3D_determinant); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_prependRotation, &flash_geom_Matrix3D_prependRotation); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_position, &flash_geom_Matrix3D_position); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_interpolateTo, &flash_geom_Matrix3D_interpolateTo); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_appendScale, &flash_geom_Matrix3D_appendScale); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_prepend, &flash_geom_Matrix3D_prepend); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_recompose, &flash_geom_Matrix3D_recompose); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_appendTranslation, &flash_geom_Matrix3D_appendTranslation); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_invert, &flash_geom_Matrix3D_invert); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_rawData, &flash_geom_Matrix3D_rawData); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_prependTranslation, &flash_geom_Matrix3D_prependTranslation); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_append, &flash_geom_Matrix3D_append); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_clone, &flash_geom_Matrix3D_clone); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_prependScale, &flash_geom_Matrix3D_prependScale); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_deltaTransformVector, &flash_geom_Matrix3D_deltaTransformVector); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_transformVectors, &flash_geom_Matrix3D_transformVectors); - dict_put(&flash_geom_Matrix3D.members, &flash_geom_Matrix3D_transpose, &flash_geom_Matrix3D_transpose); - dict_put(&flash_geom_Matrix3D.static_members, &flash_geom_Matrix3D_interpolate, &flash_geom_Matrix3D_interpolate); - dict_put(d, &flash_sampler_pauseSampling, &flash_sampler_pauseSampling); - dict_put(d, &flash_system_Capabilities, &flash_system_Capabilities); - dict_init2(&flash_system_Capabilities.members, &memberinfo_type, 8); - dict_init2(&flash_system_Capabilities.static_members, &memberinfo_type, 63); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_maxLevelIDC, &flash_system_Capabilities_maxLevelIDC); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_isDebugger, &flash_system_Capabilities_isDebugger); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasStreamingAudio, &flash_system_Capabilities_hasStreamingAudio); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_screenColor, &flash_system_Capabilities_screenColor); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasIME, &flash_system_Capabilities_hasIME); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasEmbeddedVideo, &flash_system_Capabilities_hasEmbeddedVideo); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasTLS, &flash_system_Capabilities_hasTLS); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_isEmbeddedInAcrobat, &flash_system_Capabilities_isEmbeddedInAcrobat); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasScreenPlayback, &flash_system_Capabilities_hasScreenPlayback); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasVideoEncoder, &flash_system_Capabilities_hasVideoEncoder); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasAudioEncoder, &flash_system_Capabilities_hasAudioEncoder); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_pixelAspectRatio, &flash_system_Capabilities_pixelAspectRatio); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasStreamingVideo, &flash_system_Capabilities_hasStreamingVideo); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_screenResolutionX, &flash_system_Capabilities_screenResolutionX); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasScreenBroadcast, &flash_system_Capabilities_hasScreenBroadcast); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasAudio, &flash_system_Capabilities_hasAudio); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_language, &flash_system_Capabilities_language); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_manufacturer, &flash_system_Capabilities_manufacturer); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasPrinting, &flash_system_Capabilities_hasPrinting); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_os, &flash_system_Capabilities_os); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_localFileReadDisable, &flash_system_Capabilities_localFileReadDisable); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasMP3, &flash_system_Capabilities_hasMP3); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_avHardwareDisable, &flash_system_Capabilities_avHardwareDisable); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_hasAccessibility, &flash_system_Capabilities_hasAccessibility); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_version, &flash_system_Capabilities_version); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_screenDPI, &flash_system_Capabilities_screenDPI); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_playerType, &flash_system_Capabilities_playerType); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_screenResolutionY, &flash_system_Capabilities_screenResolutionY); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities__internal, &flash_system_Capabilities__internal); - dict_put(&flash_system_Capabilities.static_members, &flash_system_Capabilities_serverString, &flash_system_Capabilities_serverString); - dict_put(d, &flash_sampler_getSetterInvocationCount, &flash_sampler_getSetterInvocationCount); - dict_put(d, &flash_sampler_getGetterInvocationCount, &flash_sampler_getGetterInvocationCount); - dict_put(d, &flash_filters_BlurFilter, &flash_filters_BlurFilter); - dict_init2(&flash_filters_BlurFilter.members, &memberinfo_type, 8); - dict_init2(&flash_filters_BlurFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_BlurFilter.members, &flash_filters_BlurFilter_blurY, &flash_filters_BlurFilter_blurY); - dict_put(&flash_filters_BlurFilter.members, &flash_filters_BlurFilter_clone, &flash_filters_BlurFilter_clone); - dict_put(&flash_filters_BlurFilter.members, &flash_filters_BlurFilter_quality, &flash_filters_BlurFilter_quality); - dict_put(&flash_filters_BlurFilter.members, &flash_filters_BlurFilter_blurX, &flash_filters_BlurFilter_blurX); - dict_put(d, &_isFinite, &_isFinite); - dict_put(d, &flash_media_Video, &flash_media_Video); - dict_init2(&flash_media_Video.members, &memberinfo_type, 8); - dict_init2(&flash_media_Video.static_members, &memberinfo_type, 8); - dict_put(&flash_media_Video.members, &flash_media_Video_attachCamera, &flash_media_Video_attachCamera); - dict_put(&flash_media_Video.members, &flash_media_Video_videoWidth, &flash_media_Video_videoWidth); - dict_put(&flash_media_Video.members, &flash_media_Video_clear, &flash_media_Video_clear); - dict_put(&flash_media_Video.members, &flash_media_Video_deblocking, &flash_media_Video_deblocking); - dict_put(&flash_media_Video.members, &flash_media_Video_videoHeight, &flash_media_Video_videoHeight); - dict_put(&flash_media_Video.members, &flash_media_Video_attachNetStream, &flash_media_Video_attachNetStream); - dict_put(&flash_media_Video.members, &flash_media_Video_smoothing, &flash_media_Video_smoothing); - dict_put(d, &flash_text_engine_TextLineCreationResult, &flash_text_engine_TextLineCreationResult); - dict_init2(&flash_text_engine_TextLineCreationResult.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TextLineCreationResult.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TextLineCreationResult.static_members, &flash_text_engine_TextLineCreationResult_EMERGENCY, &flash_text_engine_TextLineCreationResult_EMERGENCY); - dict_put(&flash_text_engine_TextLineCreationResult.static_members, &flash_text_engine_TextLineCreationResult_COMPLETE, &flash_text_engine_TextLineCreationResult_COMPLETE); - dict_put(&flash_text_engine_TextLineCreationResult.static_members, &flash_text_engine_TextLineCreationResult_SUCCESS, &flash_text_engine_TextLineCreationResult_SUCCESS); - dict_put(&flash_text_engine_TextLineCreationResult.static_members, &flash_text_engine_TextLineCreationResult_INSUFFICIENT_WIDTH, &flash_text_engine_TextLineCreationResult_INSUFFICIENT_WIDTH); - dict_put(d, &_Error, &_Error); - dict_init2(&_Error.members, &memberinfo_type, 8); - dict_init2(&_Error.static_members, &memberinfo_type, 8); - dict_put(&_Error.members, &_Error_message, &_Error_message); - dict_put(&_Error.members, &_Error_errorID, &_Error_errorID); - dict_put(&_Error.members, &_Error_getStackTrace, &_Error_getStackTrace); - dict_put(&_Error.members, &_Error_name, &_Error_name); - dict_put(&_Error.static_members, &_Error_length, &_Error_length); - dict_put(&_Error.static_members, &_Error_getErrorMessage, &_Error_getErrorMessage); - dict_put(&_Error.static_members, &_Error_throwError, &_Error_throwError); - dict_put(d, &flash_xml_XMLNode, &flash_xml_XMLNode); - dict_init2(&flash_xml_XMLNode.members, &memberinfo_type, 31); - dict_init2(&flash_xml_XMLNode.static_members, &memberinfo_type, 8); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_childNodes, &flash_xml_XMLNode_childNodes); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_appendChild, &flash_xml_XMLNode_appendChild); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_nextSibling, &flash_xml_XMLNode_nextSibling); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_nodeType, &flash_xml_XMLNode_nodeType); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_attributes, &flash_xml_XMLNode_attributes); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_firstChild, &flash_xml_XMLNode_firstChild); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_parentNode, &flash_xml_XMLNode_parentNode); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_toString, &flash_xml_XMLNode_toString); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_prefix, &flash_xml_XMLNode_prefix); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_localName, &flash_xml_XMLNode_localName); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_nodeName, &flash_xml_XMLNode_nodeName); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_getNamespaceForPrefix, &flash_xml_XMLNode_getNamespaceForPrefix); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_insertBefore, &flash_xml_XMLNode_insertBefore); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_lastChild, &flash_xml_XMLNode_lastChild); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_cloneNode, &flash_xml_XMLNode_cloneNode); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_removeNode, &flash_xml_XMLNode_removeNode); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_namespaceURI, &flash_xml_XMLNode_namespaceURI); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_previousSibling, &flash_xml_XMLNode_previousSibling); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_hasChildNodes, &flash_xml_XMLNode_hasChildNodes); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_getPrefixForNamespace, &flash_xml_XMLNode_getPrefixForNamespace); - dict_put(&flash_xml_XMLNode.members, &flash_xml_XMLNode_nodeValue, &flash_xml_XMLNode_nodeValue); - dict_put(d, &flash_net_URLVariables, &flash_net_URLVariables); - dict_init2(&flash_net_URLVariables.members, &memberinfo_type, 8); - dict_init2(&flash_net_URLVariables.static_members, &memberinfo_type, 8); - dict_put(&flash_net_URLVariables.members, &flash_net_URLVariables_toString, &flash_net_URLVariables_toString); - dict_put(&flash_net_URLVariables.members, &flash_net_URLVariables_decode, &flash_net_URLVariables_decode); - dict_put(d, &flash_display_LoaderInfo, &flash_display_LoaderInfo); - dict_init2(&flash_display_LoaderInfo.members, &memberinfo_type, 31); - dict_init2(&flash_display_LoaderInfo.static_members, &memberinfo_type, 8); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_actionScriptVersion, &flash_display_LoaderInfo_actionScriptVersion); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_contentType, &flash_display_LoaderInfo_contentType); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_sameDomain, &flash_display_LoaderInfo_sameDomain); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_bytesTotal, &flash_display_LoaderInfo_bytesTotal); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_loaderURL, &flash_display_LoaderInfo_loaderURL); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_width, &flash_display_LoaderInfo_width); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_dispatchEvent, &flash_display_LoaderInfo_dispatchEvent); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_height, &flash_display_LoaderInfo_height); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_frameRate, &flash_display_LoaderInfo_frameRate); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_parameters, &flash_display_LoaderInfo_parameters); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_bytesLoaded, &flash_display_LoaderInfo_bytesLoaded); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_url, &flash_display_LoaderInfo_url); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_content, &flash_display_LoaderInfo_content); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_swfVersion, &flash_display_LoaderInfo_swfVersion); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_bytes, &flash_display_LoaderInfo_bytes); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_loader, &flash_display_LoaderInfo_loader); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_applicationDomain, &flash_display_LoaderInfo_applicationDomain); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_parentAllowsChild, &flash_display_LoaderInfo_parentAllowsChild); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_childAllowsParent, &flash_display_LoaderInfo_childAllowsParent); - dict_put(&flash_display_LoaderInfo.members, &flash_display_LoaderInfo_sharedEvents, &flash_display_LoaderInfo_sharedEvents); - dict_put(&flash_display_LoaderInfo.static_members, &flash_display_LoaderInfo_getLoaderInfoByDefinition, &flash_display_LoaderInfo_getLoaderInfoByDefinition); - dict_put(d, &flash_sampler_Sample, &flash_sampler_Sample); - dict_init2(&flash_sampler_Sample.members, &memberinfo_type, 8); - dict_init2(&flash_sampler_Sample.static_members, &memberinfo_type, 8); - dict_put(&flash_sampler_Sample.members, &flash_sampler_Sample_time, &flash_sampler_Sample_time); - dict_put(&flash_sampler_Sample.members, &flash_sampler_Sample_stack, &flash_sampler_Sample_stack); - dict_put(d, &flash_text_engine_DigitWidth, &flash_text_engine_DigitWidth); - dict_init2(&flash_text_engine_DigitWidth.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_DigitWidth.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_DigitWidth.static_members, &flash_text_engine_DigitWidth_PROPORTIONAL, &flash_text_engine_DigitWidth_PROPORTIONAL); - dict_put(&flash_text_engine_DigitWidth.static_members, &flash_text_engine_DigitWidth_DEFAULT, &flash_text_engine_DigitWidth_DEFAULT); - dict_put(&flash_text_engine_DigitWidth.static_members, &flash_text_engine_DigitWidth_TABULAR, &flash_text_engine_DigitWidth_TABULAR); - dict_put(d, &flash_net_URLRequestMethod, &flash_net_URLRequestMethod); - dict_init2(&flash_net_URLRequestMethod.members, &memberinfo_type, 8); - dict_init2(&flash_net_URLRequestMethod.static_members, &memberinfo_type, 8); - dict_put(&flash_net_URLRequestMethod.static_members, &flash_net_URLRequestMethod_GET, &flash_net_URLRequestMethod_GET); - dict_put(&flash_net_URLRequestMethod.static_members, &flash_net_URLRequestMethod_POST, &flash_net_URLRequestMethod_POST); - dict_put(d, &adobe_utils_MMExecute, &adobe_utils_MMExecute); - dict_put(d, &flash_system_System, &flash_system_System); - dict_init2(&flash_system_System.members, &memberinfo_type, 8); - dict_init2(&flash_system_System.static_members, &memberinfo_type, 15); - dict_put(&flash_system_System.static_members, &flash_system_System_pause, &flash_system_System_pause); - dict_put(&flash_system_System.static_members, &flash_system_System_useCodePage, &flash_system_System_useCodePage); - dict_put(&flash_system_System.static_members, &flash_system_System_exit, &flash_system_System_exit); - dict_put(&flash_system_System.static_members, &flash_system_System_setClipboard, &flash_system_System_setClipboard); - dict_put(&flash_system_System.static_members, &flash_system_System_totalMemory, &flash_system_System_totalMemory); - dict_put(&flash_system_System.static_members, &flash_system_System_gc, &flash_system_System_gc); - dict_put(&flash_system_System.static_members, &flash_system_System_resume, &flash_system_System_resume); - dict_put(&flash_system_System.static_members, &flash_system_System_vmVersion, &flash_system_System_vmVersion); - dict_put(&flash_system_System.static_members, &flash_system_System_ime, &flash_system_System_ime); - dict_put(d, &flash_filters_BitmapFilterQuality, &flash_filters_BitmapFilterQuality); - dict_init2(&flash_filters_BitmapFilterQuality.members, &memberinfo_type, 8); - dict_init2(&flash_filters_BitmapFilterQuality.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_BitmapFilterQuality.static_members, &flash_filters_BitmapFilterQuality_LOW, &flash_filters_BitmapFilterQuality_LOW); - dict_put(&flash_filters_BitmapFilterQuality.static_members, &flash_filters_BitmapFilterQuality_MEDIUM, &flash_filters_BitmapFilterQuality_MEDIUM); - dict_put(&flash_filters_BitmapFilterQuality.static_members, &flash_filters_BitmapFilterQuality_HIGH, &flash_filters_BitmapFilterQuality_HIGH); - dict_put(d, &flash_display_DisplayObjectContainer, &flash_display_DisplayObjectContainer); - dict_init2(&flash_display_DisplayObjectContainer.members, &memberinfo_type, 31); - dict_init2(&flash_display_DisplayObjectContainer.static_members, &memberinfo_type, 8); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_addChild, &flash_display_DisplayObjectContainer_addChild); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_getObjectsUnderPoint, &flash_display_DisplayObjectContainer_getObjectsUnderPoint); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_removeChildAt, &flash_display_DisplayObjectContainer_removeChildAt); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_swapChildren, &flash_display_DisplayObjectContainer_swapChildren); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint, &flash_display_DisplayObjectContainer_areInaccessibleObjectsUnderPoint); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_setChildIndex, &flash_display_DisplayObjectContainer_setChildIndex); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_numChildren, &flash_display_DisplayObjectContainer_numChildren); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_getChildIndex, &flash_display_DisplayObjectContainer_getChildIndex); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_getChildAt, &flash_display_DisplayObjectContainer_getChildAt); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_removeChild, &flash_display_DisplayObjectContainer_removeChild); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_addChildAt, &flash_display_DisplayObjectContainer_addChildAt); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_contains, &flash_display_DisplayObjectContainer_contains); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_getChildByName, &flash_display_DisplayObjectContainer_getChildByName); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_swapChildrenAt, &flash_display_DisplayObjectContainer_swapChildrenAt); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_mouseChildren, &flash_display_DisplayObjectContainer_mouseChildren); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_tabChildren, &flash_display_DisplayObjectContainer_tabChildren); - dict_put(&flash_display_DisplayObjectContainer.members, &flash_display_DisplayObjectContainer_textSnapshot, &flash_display_DisplayObjectContainer_textSnapshot); - dict_put(d, &flash_system_LoaderContext, &flash_system_LoaderContext); - dict_init2(&flash_system_LoaderContext.members, &memberinfo_type, 8); - dict_init2(&flash_system_LoaderContext.static_members, &memberinfo_type, 8); - dict_put(&flash_system_LoaderContext.members, &flash_system_LoaderContext_checkPolicyFile, &flash_system_LoaderContext_checkPolicyFile); - dict_put(&flash_system_LoaderContext.members, &flash_system_LoaderContext_securityDomain, &flash_system_LoaderContext_securityDomain); - dict_put(&flash_system_LoaderContext.members, &flash_system_LoaderContext_applicationDomain, &flash_system_LoaderContext_applicationDomain); - dict_put(d, &flash_utils_clearTimeout, &flash_utils_clearTimeout); - dict_put(d, &_isXMLName, &_isXMLName); - dict_put(d, &flash_xml_XMLNodeType, &flash_xml_XMLNodeType); - dict_init2(&flash_xml_XMLNodeType.members, &memberinfo_type, 8); - dict_init2(&flash_xml_XMLNodeType.static_members, &memberinfo_type, 8); - dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_PROCESSING_INSTRUCTION_NODE, &flash_xml_XMLNodeType_PROCESSING_INSTRUCTION_NODE); - dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_CDATA_NODE, &flash_xml_XMLNodeType_CDATA_NODE); - dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_DOCUMENT_TYPE_NODE, &flash_xml_XMLNodeType_DOCUMENT_TYPE_NODE); - dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_COMMENT_NODE, &flash_xml_XMLNodeType_COMMENT_NODE); - dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_XML_DECLARATION, &flash_xml_XMLNodeType_XML_DECLARATION); - dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_TEXT_NODE, &flash_xml_XMLNodeType_TEXT_NODE); - dict_put(&flash_xml_XMLNodeType.static_members, &flash_xml_XMLNodeType_ELEMENT_NODE, &flash_xml_XMLNodeType_ELEMENT_NODE); - dict_put(d, &flash_events_ErrorEvent, &flash_events_ErrorEvent); - dict_init2(&flash_events_ErrorEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_ErrorEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_ErrorEvent.members, &flash_events_ErrorEvent_toString, &flash_events_ErrorEvent_toString); - dict_put(&flash_events_ErrorEvent.members, &flash_events_ErrorEvent_clone, &flash_events_ErrorEvent_clone); - dict_put(&flash_events_ErrorEvent.static_members, &flash_events_ErrorEvent_ERROR, &flash_events_ErrorEvent_ERROR); - dict_put(d, &flash_utils_IDataOutput, &flash_utils_IDataOutput); - dict_init2(&flash_utils_IDataOutput.members, &memberinfo_type, 31); - dict_init2(&flash_utils_IDataOutput.static_members, &memberinfo_type, 8); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeUnsignedInt, &flash_utils_IDataOutput_writeUnsignedInt); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeInt, &flash_utils_IDataOutput_writeInt); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_objectEncoding, &flash_utils_IDataOutput_objectEncoding); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeUTFBytes, &flash_utils_IDataOutput_writeUTFBytes); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeObject, &flash_utils_IDataOutput_writeObject); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeMultiByte, &flash_utils_IDataOutput_writeMultiByte); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeShort, &flash_utils_IDataOutput_writeShort); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeFloat, &flash_utils_IDataOutput_writeFloat); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeUTF, &flash_utils_IDataOutput_writeUTF); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeByte, &flash_utils_IDataOutput_writeByte); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeBoolean, &flash_utils_IDataOutput_writeBoolean); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeDouble, &flash_utils_IDataOutput_writeDouble); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_writeBytes, &flash_utils_IDataOutput_writeBytes); - dict_put(&flash_utils_IDataOutput.members, &flash_utils_IDataOutput_endian, &flash_utils_IDataOutput_endian); - dict_put(d, &flash_geom_Utils3D, &flash_geom_Utils3D); - dict_init2(&flash_geom_Utils3D.members, &memberinfo_type, 8); - dict_init2(&flash_geom_Utils3D.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_Utils3D.static_members, &flash_geom_Utils3D_projectVectors, &flash_geom_Utils3D_projectVectors); - dict_put(&flash_geom_Utils3D.static_members, &flash_geom_Utils3D_projectVector, &flash_geom_Utils3D_projectVector); - dict_put(&flash_geom_Utils3D.static_members, &flash_geom_Utils3D_pointTowards, &flash_geom_Utils3D_pointTowards); - dict_put(d, &flash_events_TextEvent, &flash_events_TextEvent); - dict_init2(&flash_events_TextEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_TextEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_TextEvent.members, &flash_events_TextEvent_toString, &flash_events_TextEvent_toString); - dict_put(&flash_events_TextEvent.members, &flash_events_TextEvent_text, &flash_events_TextEvent_text); - dict_put(&flash_events_TextEvent.members, &flash_events_TextEvent_clone, &flash_events_TextEvent_clone); - dict_put(&flash_events_TextEvent.static_members, &flash_events_TextEvent_LINK, &flash_events_TextEvent_LINK); - dict_put(&flash_events_TextEvent.static_members, &flash_events_TextEvent_TEXT_INPUT, &flash_events_TextEvent_TEXT_INPUT); - dict_put(d, &flash_utils_Proxy, &flash_utils_Proxy); - dict_init2(&flash_utils_Proxy.members, &memberinfo_type, 15); - dict_init2(&flash_utils_Proxy.static_members, &memberinfo_type, 8); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_callProperty, &flash_utils_Proxy_callProperty); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_setProperty, &flash_utils_Proxy_setProperty); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_getProperty, &flash_utils_Proxy_getProperty); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_nextName, &flash_utils_Proxy_nextName); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_nextNameIndex, &flash_utils_Proxy_nextNameIndex); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_hasProperty, &flash_utils_Proxy_hasProperty); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_deleteProperty, &flash_utils_Proxy_deleteProperty); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_getDescendants, &flash_utils_Proxy_getDescendants); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_isAttribute, &flash_utils_Proxy_isAttribute); - dict_put(&flash_utils_Proxy.members, &flash_utils_Proxy_nextValue, &flash_utils_Proxy_nextValue); - dict_put(d, &flash_text_engine_FontPosture, &flash_text_engine_FontPosture); - dict_init2(&flash_text_engine_FontPosture.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_FontPosture.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_FontPosture.static_members, &flash_text_engine_FontPosture_NORMAL, &flash_text_engine_FontPosture_NORMAL); - dict_put(&flash_text_engine_FontPosture.static_members, &flash_text_engine_FontPosture_ITALIC, &flash_text_engine_FontPosture_ITALIC); - dict_put(d, &flash_xml_XMLDocument, &flash_xml_XMLDocument); - dict_init2(&flash_xml_XMLDocument.members, &memberinfo_type, 8); - dict_init2(&flash_xml_XMLDocument.static_members, &memberinfo_type, 8); - dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_docTypeDecl, &flash_xml_XMLDocument_docTypeDecl); - dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_idMap, &flash_xml_XMLDocument_idMap); - dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_toString, &flash_xml_XMLDocument_toString); - dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_xmlDecl, &flash_xml_XMLDocument_xmlDecl); - dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_createElement, &flash_xml_XMLDocument_createElement); - dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_ignoreWhite, &flash_xml_XMLDocument_ignoreWhite); - dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_createTextNode, &flash_xml_XMLDocument_createTextNode); - dict_put(&flash_xml_XMLDocument.members, &flash_xml_XMLDocument_parseXML, &flash_xml_XMLDocument_parseXML); - dict_put(d, &flash_display_ShaderInput, &flash_display_ShaderInput); - dict_init2(&flash_display_ShaderInput.members, &memberinfo_type, 8); - dict_init2(&flash_display_ShaderInput.static_members, &memberinfo_type, 8); - dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_width, &flash_display_ShaderInput_width); - dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_input, &flash_display_ShaderInput_input); - dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_height, &flash_display_ShaderInput_height); - dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_index, &flash_display_ShaderInput_index); - dict_put(&flash_display_ShaderInput.members, &flash_display_ShaderInput_channels, &flash_display_ShaderInput_channels); - dict_put(d, &flash_text_engine_TextBlock, &flash_text_engine_TextBlock); - dict_init2(&flash_text_engine_TextBlock.members, &memberinfo_type, 31); - dict_init2(&flash_text_engine_TextBlock.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_createTextLine, &flash_text_engine_TextBlock_createTextLine); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_bidiLevel, &flash_text_engine_TextBlock_bidiLevel); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_getTextLineAtCharIndex, &flash_text_engine_TextBlock_getTextLineAtCharIndex); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_lastLine, &flash_text_engine_TextBlock_lastLine); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_findPreviousWordBoundary, &flash_text_engine_TextBlock_findPreviousWordBoundary); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_findPreviousAtomBoundary, &flash_text_engine_TextBlock_findPreviousAtomBoundary); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_baselineZero, &flash_text_engine_TextBlock_baselineZero); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_applyNonLinearFontScaling, &flash_text_engine_TextBlock_applyNonLinearFontScaling); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_firstLine, &flash_text_engine_TextBlock_firstLine); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_textJustifier, &flash_text_engine_TextBlock_textJustifier); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_releaseLines, &flash_text_engine_TextBlock_releaseLines); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_firstInvalidLine, &flash_text_engine_TextBlock_firstInvalidLine); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_baselineFontSize, &flash_text_engine_TextBlock_baselineFontSize); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_lineRotation, &flash_text_engine_TextBlock_lineRotation); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_userData, &flash_text_engine_TextBlock_userData); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_content, &flash_text_engine_TextBlock_content); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_textLineCreationResult, &flash_text_engine_TextBlock_textLineCreationResult); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_baselineFontDescription, &flash_text_engine_TextBlock_baselineFontDescription); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_findNextAtomBoundary, &flash_text_engine_TextBlock_findNextAtomBoundary); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_findNextWordBoundary, &flash_text_engine_TextBlock_findNextWordBoundary); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_tabStops, &flash_text_engine_TextBlock_tabStops); - dict_put(&flash_text_engine_TextBlock.members, &flash_text_engine_TextBlock_dump, &flash_text_engine_TextBlock_dump); - dict_put(d, &flash_ui_MouseCursor, &flash_ui_MouseCursor); - dict_init2(&flash_ui_MouseCursor.members, &memberinfo_type, 8); - dict_init2(&flash_ui_MouseCursor.static_members, &memberinfo_type, 8); - dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_BUTTON, &flash_ui_MouseCursor_BUTTON); - dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_AUTO, &flash_ui_MouseCursor_AUTO); - dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_ARROW, &flash_ui_MouseCursor_ARROW); - dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_IBEAM, &flash_ui_MouseCursor_IBEAM); - dict_put(&flash_ui_MouseCursor.static_members, &flash_ui_MouseCursor_HAND, &flash_ui_MouseCursor_HAND); - dict_put(d, &flash_utils_flash_proxy, &flash_utils_flash_proxy); - dict_put(d, &flash_display_MorphShape, &flash_display_MorphShape); - dict_init2(&flash_display_MorphShape.members, &memberinfo_type, 8); - dict_init2(&flash_display_MorphShape.static_members, &memberinfo_type, 8); - dict_put(d, &flash_text_TextDisplayMode, &flash_text_TextDisplayMode); - dict_init2(&flash_text_TextDisplayMode.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextDisplayMode.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextDisplayMode.static_members, &flash_text_TextDisplayMode_CRT, &flash_text_TextDisplayMode_CRT); - dict_put(&flash_text_TextDisplayMode.static_members, &flash_text_TextDisplayMode_LCD, &flash_text_TextDisplayMode_LCD); - dict_put(&flash_text_TextDisplayMode.static_members, &flash_text_TextDisplayMode_DEFAULT, &flash_text_TextDisplayMode_DEFAULT); - dict_put(d, &flash_net_URLLoaderDataFormat, &flash_net_URLLoaderDataFormat); - dict_init2(&flash_net_URLLoaderDataFormat.members, &memberinfo_type, 8); - dict_init2(&flash_net_URLLoaderDataFormat.static_members, &memberinfo_type, 8); - dict_put(&flash_net_URLLoaderDataFormat.static_members, &flash_net_URLLoaderDataFormat_VARIABLES, &flash_net_URLLoaderDataFormat_VARIABLES); - dict_put(&flash_net_URLLoaderDataFormat.static_members, &flash_net_URLLoaderDataFormat_BINARY, &flash_net_URLLoaderDataFormat_BINARY); - dict_put(&flash_net_URLLoaderDataFormat.static_members, &flash_net_URLLoaderDataFormat_TEXT, &flash_net_URLLoaderDataFormat_TEXT); - dict_put(d, &flash_display_StageQuality, &flash_display_StageQuality); - dict_init2(&flash_display_StageQuality.members, &memberinfo_type, 8); - dict_init2(&flash_display_StageQuality.static_members, &memberinfo_type, 8); - dict_put(&flash_display_StageQuality.static_members, &flash_display_StageQuality_LOW, &flash_display_StageQuality_LOW); - dict_put(&flash_display_StageQuality.static_members, &flash_display_StageQuality_MEDIUM, &flash_display_StageQuality_MEDIUM); - dict_put(&flash_display_StageQuality.static_members, &flash_display_StageQuality_HIGH, &flash_display_StageQuality_HIGH); - dict_put(&flash_display_StageQuality.static_members, &flash_display_StageQuality_BEST, &flash_display_StageQuality_BEST); - dict_put(d, &flash_display_Sprite, &flash_display_Sprite); - dict_init2(&flash_display_Sprite.members, &memberinfo_type, 15); - dict_init2(&flash_display_Sprite.static_members, &memberinfo_type, 8); - dict_put(&flash_display_Sprite.members, &flash_display_Sprite_stopDrag, &flash_display_Sprite_stopDrag); - dict_put(&flash_display_Sprite.members, &flash_display_Sprite_buttonMode, &flash_display_Sprite_buttonMode); - dict_put(&flash_display_Sprite.members, &flash_display_Sprite_soundTransform, &flash_display_Sprite_soundTransform); - dict_put(&flash_display_Sprite.members, &flash_display_Sprite_hitArea, &flash_display_Sprite_hitArea); - dict_put(&flash_display_Sprite.members, &flash_display_Sprite_useHandCursor, &flash_display_Sprite_useHandCursor); - dict_put(&flash_display_Sprite.members, &flash_display_Sprite_graphics, &flash_display_Sprite_graphics); - dict_put(&flash_display_Sprite.members, &flash_display_Sprite_startDrag, &flash_display_Sprite_startDrag); - dict_put(&flash_display_Sprite.members, &flash_display_Sprite_dropTarget, &flash_display_Sprite_dropTarget); - dict_put(d, &flash_ui_Keyboard, &flash_ui_Keyboard); - dict_init2(&flash_ui_Keyboard.members, &memberinfo_type, 8); - dict_init2(&flash_ui_Keyboard.static_members, &memberinfo_type, 127); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_PAGE_DOWN, &flash_ui_Keyboard_PAGE_DOWN); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F4, &flash_ui_Keyboard_F4); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_ENTER, &flash_ui_Keyboard_ENTER); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_CONTROL, &flash_ui_Keyboard_CONTROL); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F7, &flash_ui_Keyboard_F7); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F14, &flash_ui_Keyboard_F14); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_3, &flash_ui_Keyboard_NUMPAD_3); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_DECIMAL, &flash_ui_Keyboard_NUMPAD_DECIMAL); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_CAPS_LOCK, &flash_ui_Keyboard_CAPS_LOCK); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_SHIFT, &flash_ui_Keyboard_SHIFT); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_TAB, &flash_ui_Keyboard_TAB); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_0, &flash_ui_Keyboard_NUMPAD_0); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_END, &flash_ui_Keyboard_END); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_1, &flash_ui_Keyboard_NUMPAD_1); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_LEFT, &flash_ui_Keyboard_LEFT); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F8, &flash_ui_Keyboard_F8); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F9, &flash_ui_Keyboard_F9); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_numLock, &flash_ui_Keyboard_numLock); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F2, &flash_ui_Keyboard_F2); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_4, &flash_ui_Keyboard_NUMPAD_4); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F3, &flash_ui_Keyboard_F3); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_2, &flash_ui_Keyboard_NUMPAD_2); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_HOME, &flash_ui_Keyboard_HOME); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_7, &flash_ui_Keyboard_NUMPAD_7); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_6, &flash_ui_Keyboard_NUMPAD_6); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F6, &flash_ui_Keyboard_F6); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F5, &flash_ui_Keyboard_F5); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_INSERT, &flash_ui_Keyboard_INSERT); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_ESCAPE, &flash_ui_Keyboard_ESCAPE); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F1, &flash_ui_Keyboard_F1); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_SUBTRACT, &flash_ui_Keyboard_NUMPAD_SUBTRACT); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_8, &flash_ui_Keyboard_NUMPAD_8); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_SPACE, &flash_ui_Keyboard_SPACE); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_BACKSPACE, &flash_ui_Keyboard_BACKSPACE); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_DELETE, &flash_ui_Keyboard_DELETE); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_MULTIPLY, &flash_ui_Keyboard_NUMPAD_MULTIPLY); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F13, &flash_ui_Keyboard_F13); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_ADD, &flash_ui_Keyboard_NUMPAD_ADD); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_9, &flash_ui_Keyboard_NUMPAD_9); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F12, &flash_ui_Keyboard_F12); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_RIGHT, &flash_ui_Keyboard_RIGHT); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F15, &flash_ui_Keyboard_F15); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F11, &flash_ui_Keyboard_F11); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_UP, &flash_ui_Keyboard_UP); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_isAccessible, &flash_ui_Keyboard_isAccessible); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_DOWN, &flash_ui_Keyboard_DOWN); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_capsLock, &flash_ui_Keyboard_capsLock); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_PAGE_UP, &flash_ui_Keyboard_PAGE_UP); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_ENTER, &flash_ui_Keyboard_NUMPAD_ENTER); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_F10, &flash_ui_Keyboard_F10); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_5, &flash_ui_Keyboard_NUMPAD_5); - dict_put(&flash_ui_Keyboard.static_members, &flash_ui_Keyboard_NUMPAD_DIVIDE, &flash_ui_Keyboard_NUMPAD_DIVIDE); - dict_put(d, &flash_filters_DisplacementMapFilter, &flash_filters_DisplacementMapFilter); - dict_init2(&flash_filters_DisplacementMapFilter.members, &memberinfo_type, 31); - dict_init2(&flash_filters_DisplacementMapFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_scaleY, &flash_filters_DisplacementMapFilter_scaleY); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_mapPoint, &flash_filters_DisplacementMapFilter_mapPoint); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_scaleX, &flash_filters_DisplacementMapFilter_scaleX); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_mapBitmap, &flash_filters_DisplacementMapFilter_mapBitmap); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_mode, &flash_filters_DisplacementMapFilter_mode); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_color, &flash_filters_DisplacementMapFilter_color); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_componentX, &flash_filters_DisplacementMapFilter_componentX); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_clone, &flash_filters_DisplacementMapFilter_clone); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_alpha, &flash_filters_DisplacementMapFilter_alpha); - dict_put(&flash_filters_DisplacementMapFilter.members, &flash_filters_DisplacementMapFilter_componentY, &flash_filters_DisplacementMapFilter_componentY); - dict_put(d, &flash_utils_escapeMultiByte, &flash_utils_escapeMultiByte); - dict_put(d, &adobe_utils_MMEndCommand, &adobe_utils_MMEndCommand); - dict_put(d, &flash_display_GradientType, &flash_display_GradientType); - dict_init2(&flash_display_GradientType.members, &memberinfo_type, 8); - dict_init2(&flash_display_GradientType.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GradientType.static_members, &flash_display_GradientType_LINEAR, &flash_display_GradientType_LINEAR); - dict_put(&flash_display_GradientType.static_members, &flash_display_GradientType_RADIAL, &flash_display_GradientType_RADIAL); - dict_put(d, &flash_media_ID3Info, &flash_media_ID3Info); - dict_init2(&flash_media_ID3Info.members, &memberinfo_type, 8); - dict_init2(&flash_media_ID3Info.static_members, &memberinfo_type, 8); - dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_comment, &flash_media_ID3Info_comment); - dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_year, &flash_media_ID3Info_year); - dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_track, &flash_media_ID3Info_track); - dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_artist, &flash_media_ID3Info_artist); - dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_songName, &flash_media_ID3Info_songName); - dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_genre, &flash_media_ID3Info_genre); - dict_put(&flash_media_ID3Info.members, &flash_media_ID3Info_album, &flash_media_ID3Info_album); - dict_put(d, &flash_display_GraphicsSolidFill, &flash_display_GraphicsSolidFill); - dict_init2(&flash_display_GraphicsSolidFill.members, &memberinfo_type, 8); - dict_init2(&flash_display_GraphicsSolidFill.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GraphicsSolidFill.members, &flash_display_GraphicsSolidFill_color, &flash_display_GraphicsSolidFill_color); - dict_put(&flash_display_GraphicsSolidFill.members, &flash_display_GraphicsSolidFill_alpha, &flash_display_GraphicsSolidFill_alpha); - dict_put(d, &flash_filters_ColorMatrixFilter, &flash_filters_ColorMatrixFilter); - dict_init2(&flash_filters_ColorMatrixFilter.members, &memberinfo_type, 8); - dict_init2(&flash_filters_ColorMatrixFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_ColorMatrixFilter.members, &flash_filters_ColorMatrixFilter_matrix, &flash_filters_ColorMatrixFilter_matrix); - dict_put(&flash_filters_ColorMatrixFilter.members, &flash_filters_ColorMatrixFilter_clone, &flash_filters_ColorMatrixFilter_clone); - dict_put(d, &flash_net_NetStreamPlayTransitions, &flash_net_NetStreamPlayTransitions); - dict_init2(&flash_net_NetStreamPlayTransitions.members, &memberinfo_type, 8); - dict_init2(&flash_net_NetStreamPlayTransitions.static_members, &memberinfo_type, 8); - dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_RESET, &flash_net_NetStreamPlayTransitions_RESET); - dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_APPEND, &flash_net_NetStreamPlayTransitions_APPEND); - dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_SWAP, &flash_net_NetStreamPlayTransitions_SWAP); - dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_SWITCH, &flash_net_NetStreamPlayTransitions_SWITCH); - dict_put(&flash_net_NetStreamPlayTransitions.static_members, &flash_net_NetStreamPlayTransitions_STOP, &flash_net_NetStreamPlayTransitions_STOP); - dict_put(d, &flash_media_SoundCodec, &flash_media_SoundCodec); - dict_init2(&flash_media_SoundCodec.members, &memberinfo_type, 8); - dict_init2(&flash_media_SoundCodec.static_members, &memberinfo_type, 8); - dict_put(&flash_media_SoundCodec.static_members, &flash_media_SoundCodec_NELLYMOSER, &flash_media_SoundCodec_NELLYMOSER); - dict_put(&flash_media_SoundCodec.static_members, &flash_media_SoundCodec_SPEEX, &flash_media_SoundCodec_SPEEX); - dict_put(d, &flash_net_ObjectEncoding, &flash_net_ObjectEncoding); - dict_init2(&flash_net_ObjectEncoding.members, &memberinfo_type, 8); - dict_init2(&flash_net_ObjectEncoding.static_members, &memberinfo_type, 8); - dict_put(&flash_net_ObjectEncoding.static_members, &flash_net_ObjectEncoding_dynamicPropertyWriter, &flash_net_ObjectEncoding_dynamicPropertyWriter); - dict_put(&flash_net_ObjectEncoding.static_members, &flash_net_ObjectEncoding_DEFAULT, &flash_net_ObjectEncoding_DEFAULT); - dict_put(&flash_net_ObjectEncoding.static_members, &flash_net_ObjectEncoding_AMF0, &flash_net_ObjectEncoding_AMF0); - dict_put(&flash_net_ObjectEncoding.static_members, &flash_net_ObjectEncoding_AMF3, &flash_net_ObjectEncoding_AMF3); - dict_put(d, &flash_text_engine_GroupElement, &flash_text_engine_GroupElement); - dict_init2(&flash_text_engine_GroupElement.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_GroupElement.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_groupElements, &flash_text_engine_GroupElement_groupElements); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_splitTextElement, &flash_text_engine_GroupElement_splitTextElement); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_mergeTextElements, &flash_text_engine_GroupElement_mergeTextElements); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_getElementAtCharIndex, &flash_text_engine_GroupElement_getElementAtCharIndex); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_elementCount, &flash_text_engine_GroupElement_elementCount); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_setElements, &flash_text_engine_GroupElement_setElements); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_getElementAt, &flash_text_engine_GroupElement_getElementAt); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_ungroupElements, &flash_text_engine_GroupElement_ungroupElements); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_replaceElements, &flash_text_engine_GroupElement_replaceElements); - dict_put(&flash_text_engine_GroupElement.members, &flash_text_engine_GroupElement_getElementIndex, &flash_text_engine_GroupElement_getElementIndex); - dict_put(d, &_parseInt, &_parseInt); - dict_put(d, &_QName, &_QName); - dict_init2(&_QName.members, &memberinfo_type, 8); - dict_init2(&_QName.static_members, &memberinfo_type, 8); - dict_put(&_QName.members, &_QName_localName, &_QName_localName); - dict_put(&_QName.members, &_QName_valueOf, &_QName_valueOf); - dict_put(&_QName.members, &_QName_toString, &_QName_toString); - dict_put(&_QName.members, &_QName_uri, &_QName_uri); - dict_put(&_QName.static_members, &_QName_length, &_QName_length); - dict_put(d, &_UninitializedError, &_UninitializedError); - dict_init2(&_UninitializedError.members, &memberinfo_type, 8); - dict_init2(&_UninitializedError.static_members, &memberinfo_type, 8); - dict_put(&_UninitializedError.static_members, &_UninitializedError_length, &_UninitializedError_length); - dict_put(d, &_Date, &_Date); - dict_init2(&_Date.members, &memberinfo_type, 127); - dict_init2(&_Date.static_members, &memberinfo_type, 8); - dict_put(&_Date.members, &_Date_getTimezoneOffset, &_Date_getTimezoneOffset); - dict_put(&_Date.members, &_Date_getTime, &_Date_getTime); - dict_put(&_Date.members, &_Date_setUTCMilliseconds, &_Date_setUTCMilliseconds); - dict_put(&_Date.members, &_Date_month, &_Date_month); - dict_put(&_Date.members, &_Date_toString, &_Date_toString); - dict_put(&_Date.members, &_Date_getHours, &_Date_getHours); - dict_put(&_Date.members, &_Date_date, &_Date_date); - dict_put(&_Date.members, &_Date_milliseconds, &_Date_milliseconds); - dict_put(&_Date.members, &_Date_setSeconds, &_Date_setSeconds); - dict_put(&_Date.members, &_Date_getDate, &_Date_getDate); - dict_put(&_Date.members, &_Date_hoursUTC, &_Date_hoursUTC); - dict_put(&_Date.members, &_Date_getUTCDate, &_Date_getUTCDate); - dict_put(&_Date.members, &_Date_timezoneOffset, &_Date_timezoneOffset); - dict_put(&_Date.members, &_Date_setTime, &_Date_setTime); - dict_put(&_Date.members, &_Date_millisecondsUTC, &_Date_millisecondsUTC); - dict_put(&_Date.members, &_Date_minutes, &_Date_minutes); - dict_put(&_Date.members, &_Date_setUTCHours, &_Date_setUTCHours); - dict_put(&_Date.members, &_Date_minutesUTC, &_Date_minutesUTC); - dict_put(&_Date.members, &_Date_toLocaleTimeString, &_Date_toLocaleTimeString); - dict_put(&_Date.members, &_Date_fullYearUTC, &_Date_fullYearUTC); - dict_put(&_Date.members, &_Date_time, &_Date_time); - dict_put(&_Date.members, &_Date_monthUTC, &_Date_monthUTC); - dict_put(&_Date.members, &_Date_getUTCMilliseconds, &_Date_getUTCMilliseconds); - dict_put(&_Date.members, &_Date_toDateString, &_Date_toDateString); - dict_put(&_Date.members, &_Date_getMonth, &_Date_getMonth); - dict_put(&_Date.members, &_Date_setMinutes, &_Date_setMinutes); - dict_put(&_Date.members, &_Date_toLocaleDateString, &_Date_toLocaleDateString); - dict_put(&_Date.members, &_Date_fullYear, &_Date_fullYear); - dict_put(&_Date.members, &_Date_getUTCFullYear, &_Date_getUTCFullYear); - dict_put(&_Date.members, &_Date_getSeconds, &_Date_getSeconds); - dict_put(&_Date.members, &_Date_dateUTC, &_Date_dateUTC); - dict_put(&_Date.members, &_Date_getMilliseconds, &_Date_getMilliseconds); - dict_put(&_Date.members, &_Date_setUTCMinutes, &_Date_setUTCMinutes); - dict_put(&_Date.members, &_Date_day, &_Date_day); - dict_put(&_Date.members, &_Date_setUTCSeconds, &_Date_setUTCSeconds); - dict_put(&_Date.members, &_Date_setUTCDate, &_Date_setUTCDate); - dict_put(&_Date.members, &_Date_getUTCMonth, &_Date_getUTCMonth); - dict_put(&_Date.members, &_Date_valueOf, &_Date_valueOf); - dict_put(&_Date.members, &_Date_seconds, &_Date_seconds); - dict_put(&_Date.members, &_Date_getUTCMinutes, &_Date_getUTCMinutes); - dict_put(&_Date.members, &_Date_setDate, &_Date_setDate); - dict_put(&_Date.members, &_Date_getFullYear, &_Date_getFullYear); - dict_put(&_Date.members, &_Date_setFullYear, &_Date_setFullYear); - dict_put(&_Date.members, &_Date_setHours, &_Date_setHours); - dict_put(&_Date.members, &_Date_setMonth, &_Date_setMonth); - dict_put(&_Date.members, &_Date_getUTCSeconds, &_Date_getUTCSeconds); - dict_put(&_Date.members, &_Date_getMinutes, &_Date_getMinutes); - dict_put(&_Date.members, &_Date_toLocaleString, &_Date_toLocaleString); - dict_put(&_Date.members, &_Date_toUTCString, &_Date_toUTCString); - dict_put(&_Date.members, &_Date_dayUTC, &_Date_dayUTC); - dict_put(&_Date.members, &_Date_getDay, &_Date_getDay); - dict_put(&_Date.members, &_Date_setUTCMonth, &_Date_setUTCMonth); - dict_put(&_Date.members, &_Date_hours, &_Date_hours); - dict_put(&_Date.members, &_Date_getUTCDay, &_Date_getUTCDay); - dict_put(&_Date.members, &_Date_setUTCFullYear, &_Date_setUTCFullYear); - dict_put(&_Date.members, &_Date_secondsUTC, &_Date_secondsUTC); - dict_put(&_Date.members, &_Date_toTimeString, &_Date_toTimeString); - dict_put(&_Date.members, &_Date_setMilliseconds, &_Date_setMilliseconds); - dict_put(&_Date.members, &_Date_getUTCHours, &_Date_getUTCHours); - dict_put(&_Date.static_members, &_Date_length, &_Date_length); - dict_put(&_Date.static_members, &_Date_UTC, &_Date_UTC); - dict_put(&_Date.static_members, &_Date_parse, &_Date_parse); - dict_put(d, &flash_text_StyleSheet, &flash_text_StyleSheet); - dict_init2(&flash_text_StyleSheet.members, &memberinfo_type, 8); - dict_init2(&flash_text_StyleSheet.static_members, &memberinfo_type, 8); - dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_styleNames, &flash_text_StyleSheet_styleNames); - dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_clear, &flash_text_StyleSheet_clear); - dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_transform, &flash_text_StyleSheet_transform); - dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_getStyle, &flash_text_StyleSheet_getStyle); - dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_parseCSS, &flash_text_StyleSheet_parseCSS); - dict_put(&flash_text_StyleSheet.members, &flash_text_StyleSheet_setStyle, &flash_text_StyleSheet_setStyle); - dict_put(d, &flash_display_ActionScriptVersion, &flash_display_ActionScriptVersion); - dict_init2(&flash_display_ActionScriptVersion.members, &memberinfo_type, 8); - dict_init2(&flash_display_ActionScriptVersion.static_members, &memberinfo_type, 8); - dict_put(&flash_display_ActionScriptVersion.static_members, &flash_display_ActionScriptVersion_ACTIONSCRIPT3, &flash_display_ActionScriptVersion_ACTIONSCRIPT3); - dict_put(&flash_display_ActionScriptVersion.static_members, &flash_display_ActionScriptVersion_ACTIONSCRIPT2, &flash_display_ActionScriptVersion_ACTIONSCRIPT2); - dict_put(d, &flash_text_engine_EastAsianJustifier, &flash_text_engine_EastAsianJustifier); - dict_init2(&flash_text_engine_EastAsianJustifier.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_EastAsianJustifier.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_EastAsianJustifier.members, &flash_text_engine_EastAsianJustifier_justificationStyle, &flash_text_engine_EastAsianJustifier_justificationStyle); - dict_put(&flash_text_engine_EastAsianJustifier.members, &flash_text_engine_EastAsianJustifier_clone, &flash_text_engine_EastAsianJustifier_clone); - dict_put(d, &_String, &_String); - dict_init2(&_String.members, &memberinfo_type, 31); - dict_init2(&_String.static_members, &memberinfo_type, 8); - dict_put(&_String.members, &_String_indexOf, &_String_indexOf); - dict_put(&_String.members, &_String_replace, &_String_replace); - dict_put(&_String.members, &_String_lastIndexOf, &_String_lastIndexOf); - dict_put(&_String.members, &_String_valueOf, &_String_valueOf); - dict_put(&_String.members, &_String_concat, &_String_concat); - dict_put(&_String.members, &_String_substr, &_String_substr); - dict_put(&_String.members, &_String_slice, &_String_slice); - dict_put(&_String.members, &_String_search, &_String_search); - dict_put(&_String.members, &_String_toLocaleUpperCase, &_String_toLocaleUpperCase); - dict_put(&_String.members, &_String_toString, &_String_toString); - dict_put(&_String.members, &_String_toUpperCase, &_String_toUpperCase); - dict_put(&_String.members, &_String_charAt, &_String_charAt); - dict_put(&_String.members, &_String_match, &_String_match); - dict_put(&_String.members, &_String_charCodeAt, &_String_charCodeAt); - dict_put(&_String.members, &_String_substring, &_String_substring); - dict_put(&_String.members, &_String_localeCompare, &_String_localeCompare); - dict_put(&_String.members, &_String_split, &_String_split); - dict_put(&_String.members, &_String_toLocaleLowerCase, &_String_toLocaleLowerCase); - dict_put(&_String.members, &_String_length, &_String_length); - dict_put(&_String.members, &_String_toLowerCase, &_String_toLowerCase); - dict_put(&_String.static_members, &_String_fromCharCode, &_String_fromCharCode); - dict_put(d, &flash_media_SoundChannel, &flash_media_SoundChannel); - dict_init2(&flash_media_SoundChannel.members, &memberinfo_type, 8); - dict_init2(&flash_media_SoundChannel.static_members, &memberinfo_type, 8); - dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_leftPeak, &flash_media_SoundChannel_leftPeak); - dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_stop, &flash_media_SoundChannel_stop); - dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_position, &flash_media_SoundChannel_position); - dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_soundTransform, &flash_media_SoundChannel_soundTransform); - dict_put(&flash_media_SoundChannel.members, &flash_media_SoundChannel_rightPeak, &flash_media_SoundChannel_rightPeak); - dict_put(d, &flash_desktop_Clipboard, &flash_desktop_Clipboard); - dict_init2(&flash_desktop_Clipboard.members, &memberinfo_type, 8); - dict_init2(&flash_desktop_Clipboard.static_members, &memberinfo_type, 8); - dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_setDataHandler, &flash_desktop_Clipboard_setDataHandler); - dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_setData, &flash_desktop_Clipboard_setData); - dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_formats, &flash_desktop_Clipboard_formats); - dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_clear, &flash_desktop_Clipboard_clear); - dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_getData, &flash_desktop_Clipboard_getData); - dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_hasFormat, &flash_desktop_Clipboard_hasFormat); - dict_put(&flash_desktop_Clipboard.members, &flash_desktop_Clipboard_clearData, &flash_desktop_Clipboard_clearData); - dict_put(&flash_desktop_Clipboard.static_members, &flash_desktop_Clipboard_generalClipboard, &flash_desktop_Clipboard_generalClipboard); - dict_put(d, &flash_display_IBitmapDrawable, &flash_display_IBitmapDrawable); - dict_init2(&flash_display_IBitmapDrawable.members, &memberinfo_type, 8); - dict_init2(&flash_display_IBitmapDrawable.static_members, &memberinfo_type, 8); - dict_put(d, &_TypeError, &_TypeError); - dict_init2(&_TypeError.members, &memberinfo_type, 8); - dict_init2(&_TypeError.static_members, &memberinfo_type, 8); - dict_put(&_TypeError.static_members, &_TypeError_length, &_TypeError_length); - dict_put(d, &_int, &_int); - dict_init2(&_int.members, &memberinfo_type, 8); - dict_init2(&_int.static_members, &memberinfo_type, 8); - dict_put(&_int.members, &_int_valueOf, &_int_valueOf); - dict_put(&_int.members, &_int_toString, &_int_toString); - dict_put(&_int.members, &_int_toExponential, &_int_toExponential); - dict_put(&_int.members, &_int_toFixed, &_int_toFixed); - dict_put(&_int.members, &_int_toPrecision, &_int_toPrecision); - dict_put(&_int.static_members, &_int_MAX_VALUE, &_int_MAX_VALUE); - dict_put(&_int.static_members, &_int_length, &_int_length); - dict_put(&_int.static_members, &_int_MIN_VALUE, &_int_MIN_VALUE); - dict_put(d, &flash_display_Scene, &flash_display_Scene); - dict_init2(&flash_display_Scene.members, &memberinfo_type, 8); - dict_init2(&flash_display_Scene.static_members, &memberinfo_type, 8); - dict_put(&flash_display_Scene.members, &flash_display_Scene_numFrames, &flash_display_Scene_numFrames); - dict_put(&flash_display_Scene.members, &flash_display_Scene_labels, &flash_display_Scene_labels); - dict_put(&flash_display_Scene.members, &flash_display_Scene_name, &flash_display_Scene_name); - dict_put(d, &flash_text_engine_FontMetrics, &flash_text_engine_FontMetrics); - dict_init2(&flash_text_engine_FontMetrics.members, &memberinfo_type, 15); - dict_init2(&flash_text_engine_FontMetrics.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_superscriptOffset, &flash_text_engine_FontMetrics_superscriptOffset); - dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_underlineThickness, &flash_text_engine_FontMetrics_underlineThickness); - dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_subscriptScale, &flash_text_engine_FontMetrics_subscriptScale); - dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_strikethroughOffset, &flash_text_engine_FontMetrics_strikethroughOffset); - dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_emBox, &flash_text_engine_FontMetrics_emBox); - dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_strikethroughThickness, &flash_text_engine_FontMetrics_strikethroughThickness); - dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_superscriptScale, &flash_text_engine_FontMetrics_superscriptScale); - dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_subscriptOffset, &flash_text_engine_FontMetrics_subscriptOffset); - dict_put(&flash_text_engine_FontMetrics.members, &flash_text_engine_FontMetrics_underlineOffset, &flash_text_engine_FontMetrics_underlineOffset); - dict_put(d, &flash_utils_IExternalizable, &flash_utils_IExternalizable); - dict_init2(&flash_utils_IExternalizable.members, &memberinfo_type, 8); - dict_init2(&flash_utils_IExternalizable.static_members, &memberinfo_type, 8); - dict_put(&flash_utils_IExternalizable.members, &flash_utils_IExternalizable_readExternal, &flash_utils_IExternalizable_readExternal); - dict_put(&flash_utils_IExternalizable.members, &flash_utils_IExternalizable_writeExternal, &flash_utils_IExternalizable_writeExternal); - dict_put(d, &__AS3___vec_Vector, &__AS3___vec_Vector); - dict_init2(&__AS3___vec_Vector.members, &memberinfo_type, 8); - dict_init2(&__AS3___vec_Vector.static_members, &memberinfo_type, 8); - dict_put(d, &flash_filters_GradientBevelFilter, &flash_filters_GradientBevelFilter); - dict_init2(&flash_filters_GradientBevelFilter.members, &memberinfo_type, 15); - dict_init2(&flash_filters_GradientBevelFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_strength, &flash_filters_GradientBevelFilter_strength); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_quality, &flash_filters_GradientBevelFilter_quality); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_angle, &flash_filters_GradientBevelFilter_angle); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_knockout, &flash_filters_GradientBevelFilter_knockout); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_alphas, &flash_filters_GradientBevelFilter_alphas); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_type, &flash_filters_GradientBevelFilter_type); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_ratios, &flash_filters_GradientBevelFilter_ratios); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_colors, &flash_filters_GradientBevelFilter_colors); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_blurX, &flash_filters_GradientBevelFilter_blurX); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_blurY, &flash_filters_GradientBevelFilter_blurY); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_distance, &flash_filters_GradientBevelFilter_distance); - dict_put(&flash_filters_GradientBevelFilter.members, &flash_filters_GradientBevelFilter_clone, &flash_filters_GradientBevelFilter_clone); - dict_put(d, &flash_text_TextRun, &flash_text_TextRun); - dict_init2(&flash_text_TextRun.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextRun.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextRun.members, &flash_text_TextRun_beginIndex, &flash_text_TextRun_beginIndex); - dict_put(&flash_text_TextRun.members, &flash_text_TextRun_endIndex, &flash_text_TextRun_endIndex); - dict_put(&flash_text_TextRun.members, &flash_text_TextRun_textFormat, &flash_text_TextRun_textFormat); - dict_put(d, &flash_text_TextColorType, &flash_text_TextColorType); - dict_init2(&flash_text_TextColorType.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextColorType.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextColorType.static_members, &flash_text_TextColorType_DARK_COLOR, &flash_text_TextColorType_DARK_COLOR); - dict_put(&flash_text_TextColorType.static_members, &flash_text_TextColorType_LIGHT_COLOR, &flash_text_TextColorType_LIGHT_COLOR); - dict_put(d, &flash_sampler_getSampleCount, &flash_sampler_getSampleCount); - dict_put(d, &flash_net_URLRequestHeader, &flash_net_URLRequestHeader); - dict_init2(&flash_net_URLRequestHeader.members, &memberinfo_type, 8); - dict_init2(&flash_net_URLRequestHeader.static_members, &memberinfo_type, 8); - dict_put(&flash_net_URLRequestHeader.members, &flash_net_URLRequestHeader_value, &flash_net_URLRequestHeader_value); - dict_put(&flash_net_URLRequestHeader.members, &flash_net_URLRequestHeader_name, &flash_net_URLRequestHeader_name); - dict_put(d, &flash_profiler_showRedrawRegions, &flash_profiler_showRedrawRegions); - dict_put(d, &flash_display_ShaderData, &flash_display_ShaderData); - dict_init2(&flash_display_ShaderData.members, &memberinfo_type, 8); - dict_init2(&flash_display_ShaderData.static_members, &memberinfo_type, 8); - dict_put(d, &flash_text_engine_TextLine, &flash_text_engine_TextLine); - dict_init2(&flash_text_engine_TextLine.members, &memberinfo_type, 63); - dict_init2(&flash_text_engine_TextLine.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_previousLine, &flash_text_engine_TextLine_previousLine); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_validity, &flash_text_engine_TextLine_validity); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomTextBlockBeginIndex, &flash_text_engine_TextLine_getAtomTextBlockBeginIndex); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomWordBoundaryOnLeft, &flash_text_engine_TextLine_getAtomWordBoundaryOnLeft); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomTextRotation, &flash_text_engine_TextLine_getAtomTextRotation); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_textHeight, &flash_text_engine_TextLine_textHeight); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomCenter, &flash_text_engine_TextLine_getAtomCenter); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomBounds, &flash_text_engine_TextLine_getAtomBounds); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_mirrorRegions, &flash_text_engine_TextLine_mirrorRegions); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_rawTextLength, &flash_text_engine_TextLine_rawTextLength); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_userData, &flash_text_engine_TextLine_userData); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_textWidth, &flash_text_engine_TextLine_textWidth); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_textBlock, &flash_text_engine_TextLine_textBlock); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_textBlockBeginIndex, &flash_text_engine_TextLine_textBlockBeginIndex); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_unjustifiedTextWidth, &flash_text_engine_TextLine_unjustifiedTextWidth); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_ascent, &flash_text_engine_TextLine_ascent); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getBaselinePosition, &flash_text_engine_TextLine_getBaselinePosition); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_specifiedWidth, &flash_text_engine_TextLine_specifiedWidth); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getMirrorRegion, &flash_text_engine_TextLine_getMirrorRegion); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomGraphic, &flash_text_engine_TextLine_getAtomGraphic); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_hasGraphicElement, &flash_text_engine_TextLine_hasGraphicElement); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_flushAtomData, &flash_text_engine_TextLine_flushAtomData); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_dump, &flash_text_engine_TextLine_dump); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_nextLine, &flash_text_engine_TextLine_nextLine); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomIndexAtCharIndex, &flash_text_engine_TextLine_getAtomIndexAtCharIndex); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomTextBlockEndIndex, &flash_text_engine_TextLine_getAtomTextBlockEndIndex); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_atomCount, &flash_text_engine_TextLine_atomCount); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_descent, &flash_text_engine_TextLine_descent); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomBidiLevel, &flash_text_engine_TextLine_getAtomBidiLevel); - dict_put(&flash_text_engine_TextLine.members, &flash_text_engine_TextLine_getAtomIndexAtPoint, &flash_text_engine_TextLine_getAtomIndexAtPoint); - dict_put(&flash_text_engine_TextLine.static_members, &flash_text_engine_TextLine_MAX_LINE_WIDTH, &flash_text_engine_TextLine_MAX_LINE_WIDTH); - dict_put(d, &flash_sampler_getSamples, &flash_sampler_getSamples); - dict_put(d, &flash_net_URLRequest, &flash_net_URLRequest); - dict_init2(&flash_net_URLRequest.members, &memberinfo_type, 15); - dict_init2(&flash_net_URLRequest.static_members, &memberinfo_type, 8); - dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_contentType, &flash_net_URLRequest_contentType); - dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_url, &flash_net_URLRequest_url); - dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_requestHeaders, &flash_net_URLRequest_requestHeaders); - dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_method, &flash_net_URLRequest_method); - dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_digest, &flash_net_URLRequest_digest); - dict_put(&flash_net_URLRequest.members, &flash_net_URLRequest_data, &flash_net_URLRequest_data); - dict_put(d, &_URIError, &_URIError); - dict_init2(&_URIError.members, &memberinfo_type, 8); - dict_init2(&_URIError.static_members, &memberinfo_type, 8); - dict_put(&_URIError.static_members, &_URIError_length, &_URIError_length); - dict_put(d, &flash_net_getClassByAlias, &flash_net_getClassByAlias); - dict_put(d, &flash_display_ShaderParameter, &flash_display_ShaderParameter); - dict_init2(&flash_display_ShaderParameter.members, &memberinfo_type, 8); - dict_init2(&flash_display_ShaderParameter.static_members, &memberinfo_type, 8); - dict_put(&flash_display_ShaderParameter.members, &flash_display_ShaderParameter_value, &flash_display_ShaderParameter_value); - dict_put(&flash_display_ShaderParameter.members, &flash_display_ShaderParameter_index, &flash_display_ShaderParameter_index); - dict_put(&flash_display_ShaderParameter.members, &flash_display_ShaderParameter_type, &flash_display_ShaderParameter_type); - dict_put(d, &flash_filters_BitmapFilterType, &flash_filters_BitmapFilterType); - dict_init2(&flash_filters_BitmapFilterType.members, &memberinfo_type, 8); - dict_init2(&flash_filters_BitmapFilterType.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_BitmapFilterType.static_members, &flash_filters_BitmapFilterType_FULL, &flash_filters_BitmapFilterType_FULL); - dict_put(&flash_filters_BitmapFilterType.static_members, &flash_filters_BitmapFilterType_INNER, &flash_filters_BitmapFilterType_INNER); - dict_put(&flash_filters_BitmapFilterType.static_members, &flash_filters_BitmapFilterType_OUTER, &flash_filters_BitmapFilterType_OUTER); - dict_put(d, &_SecurityError, &_SecurityError); - dict_init2(&_SecurityError.members, &memberinfo_type, 8); - dict_init2(&_SecurityError.static_members, &memberinfo_type, 8); - dict_put(&_SecurityError.static_members, &_SecurityError_length, &_SecurityError_length); - dict_put(d, &flash_utils_IDataInput, &flash_utils_IDataInput); - dict_init2(&flash_utils_IDataInput.members, &memberinfo_type, 31); - dict_init2(&flash_utils_IDataInput.static_members, &memberinfo_type, 8); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUTF, &flash_utils_IDataInput_readUTF); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readByte, &flash_utils_IDataInput_readByte); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUTFBytes, &flash_utils_IDataInput_readUTFBytes); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readShort, &flash_utils_IDataInput_readShort); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_objectEncoding, &flash_utils_IDataInput_objectEncoding); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUnsignedInt, &flash_utils_IDataInput_readUnsignedInt); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readDouble, &flash_utils_IDataInput_readDouble); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readBytes, &flash_utils_IDataInput_readBytes); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUnsignedByte, &flash_utils_IDataInput_readUnsignedByte); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readMultiByte, &flash_utils_IDataInput_readMultiByte); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readInt, &flash_utils_IDataInput_readInt); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_bytesAvailable, &flash_utils_IDataInput_bytesAvailable); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readUnsignedShort, &flash_utils_IDataInput_readUnsignedShort); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readObject, &flash_utils_IDataInput_readObject); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readFloat, &flash_utils_IDataInput_readFloat); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_endian, &flash_utils_IDataInput_endian); - dict_put(&flash_utils_IDataInput.members, &flash_utils_IDataInput_readBoolean, &flash_utils_IDataInput_readBoolean); - dict_put(d, &flash_events_IEventDispatcher, &flash_events_IEventDispatcher); - dict_init2(&flash_events_IEventDispatcher.members, &memberinfo_type, 8); - dict_init2(&flash_events_IEventDispatcher.static_members, &memberinfo_type, 8); - dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_willTrigger, &flash_events_IEventDispatcher_willTrigger); - dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_removeEventListener, &flash_events_IEventDispatcher_removeEventListener); - dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_hasEventListener, &flash_events_IEventDispatcher_hasEventListener); - dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_addEventListener, &flash_events_IEventDispatcher_addEventListener); - dict_put(&flash_events_IEventDispatcher.members, &flash_events_IEventDispatcher_dispatchEvent, &flash_events_IEventDispatcher_dispatchEvent); - dict_put(d, &_Class, &_Class); - dict_init2(&_Class.members, &memberinfo_type, 8); - dict_init2(&_Class.static_members, &memberinfo_type, 8); - dict_put(&_Class.members, &_Class_prototype, &_Class_prototype); - dict_put(&_Class.static_members, &_Class_length, &_Class_length); - dict_put(d, &flash_geom_Rectangle, &flash_geom_Rectangle); - dict_init2(&flash_geom_Rectangle.members, &memberinfo_type, 31); - dict_init2(&flash_geom_Rectangle.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_top, &flash_geom_Rectangle_top); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_intersection, &flash_geom_Rectangle_intersection); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_intersects, &flash_geom_Rectangle_intersects); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_containsPoint, &flash_geom_Rectangle_containsPoint); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_setEmpty, &flash_geom_Rectangle_setEmpty); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_topLeft, &flash_geom_Rectangle_topLeft); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_width, &flash_geom_Rectangle_width); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_containsRect, &flash_geom_Rectangle_containsRect); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_isEmpty, &flash_geom_Rectangle_isEmpty); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_equals, &flash_geom_Rectangle_equals); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_height, &flash_geom_Rectangle_height); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_left, &flash_geom_Rectangle_left); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_inflate, &flash_geom_Rectangle_inflate); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_inflatePoint, &flash_geom_Rectangle_inflatePoint); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_toString, &flash_geom_Rectangle_toString); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_offsetPoint, &flash_geom_Rectangle_offsetPoint); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_x, &flash_geom_Rectangle_x); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_size, &flash_geom_Rectangle_size); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_bottomRight, &flash_geom_Rectangle_bottomRight); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_right, &flash_geom_Rectangle_right); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_contains, &flash_geom_Rectangle_contains); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_union, &flash_geom_Rectangle_union); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_bottom, &flash_geom_Rectangle_bottom); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_clone, &flash_geom_Rectangle_clone); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_y, &flash_geom_Rectangle_y); - dict_put(&flash_geom_Rectangle.members, &flash_geom_Rectangle_offset, &flash_geom_Rectangle_offset); - dict_put(d, &flash_events_SecurityErrorEvent, &flash_events_SecurityErrorEvent); - dict_init2(&flash_events_SecurityErrorEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_SecurityErrorEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_SecurityErrorEvent.members, &flash_events_SecurityErrorEvent_toString, &flash_events_SecurityErrorEvent_toString); - dict_put(&flash_events_SecurityErrorEvent.members, &flash_events_SecurityErrorEvent_clone, &flash_events_SecurityErrorEvent_clone); - dict_put(&flash_events_SecurityErrorEvent.static_members, &flash_events_SecurityErrorEvent_SECURITY_ERROR, &flash_events_SecurityErrorEvent_SECURITY_ERROR); - dict_put(d, &flash_net_IDynamicPropertyWriter, &flash_net_IDynamicPropertyWriter); - dict_init2(&flash_net_IDynamicPropertyWriter.members, &memberinfo_type, 8); - dict_init2(&flash_net_IDynamicPropertyWriter.static_members, &memberinfo_type, 8); - dict_put(&flash_net_IDynamicPropertyWriter.members, &flash_net_IDynamicPropertyWriter_writeDynamicProperties, &flash_net_IDynamicPropertyWriter_writeDynamicProperties); - dict_put(d, &flash_display_InterpolationMethod, &flash_display_InterpolationMethod); - dict_init2(&flash_display_InterpolationMethod.members, &memberinfo_type, 8); - dict_init2(&flash_display_InterpolationMethod.static_members, &memberinfo_type, 8); - dict_put(&flash_display_InterpolationMethod.static_members, &flash_display_InterpolationMethod_RGB, &flash_display_InterpolationMethod_RGB); - dict_put(&flash_display_InterpolationMethod.static_members, &flash_display_InterpolationMethod_LINEAR_RGB, &flash_display_InterpolationMethod_LINEAR_RGB); - dict_put(d, &_Object, &_Object); - dict_init2(&_Object.members, &memberinfo_type, 8); - dict_init2(&_Object.static_members, &memberinfo_type, 8); - dict_put(&_Object.members, &_Object_propertyIsEnumerable, &_Object_propertyIsEnumerable); - dict_put(&_Object.members, &_Object_isPrototypeOf, &_Object_isPrototypeOf); - dict_put(&_Object.members, &_Object_hasOwnProperty, &_Object_hasOwnProperty); - dict_put(&_Object.static_members, &_Object_init, &_Object_init); - dict_put(&_Object.static_members, &_Object_length, &_Object_length); - dict_put(&_Object.static_members, &_Object__setPropertyIsEnumerable, &_Object__setPropertyIsEnumerable); - dict_put(&_Object.static_members, &_Object__dontEnumPrototype, &_Object__dontEnumPrototype); - dict_put(d, &flash_errors_EOFError, &flash_errors_EOFError); - dict_init2(&flash_errors_EOFError.members, &memberinfo_type, 8); - dict_init2(&flash_errors_EOFError.static_members, &memberinfo_type, 8); - dict_put(d, &flash_net_NetStream, &flash_net_NetStream); - dict_init2(&flash_net_NetStream.members, &memberinfo_type, 63); - dict_init2(&flash_net_NetStream.static_members, &memberinfo_type, 8); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_videoCodec, &flash_net_NetStream_videoCodec); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_info, &flash_net_NetStream_info); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_attachCamera, &flash_net_NetStream_attachCamera); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_farNonce, &flash_net_NetStream_farNonce); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_close, &flash_net_NetStream_close); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_pause, &flash_net_NetStream_pause); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_onPeerConnect, &flash_net_NetStream_onPeerConnect); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_client, &flash_net_NetStream_client); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_resume, &flash_net_NetStream_resume); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_liveDelay, &flash_net_NetStream_liveDelay); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_peerStreams, &flash_net_NetStream_peerStreams); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_objectEncoding, &flash_net_NetStream_objectEncoding); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_bytesLoaded, &flash_net_NetStream_bytesLoaded); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_receiveVideo, &flash_net_NetStream_receiveVideo); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_maxPauseBufferTime, &flash_net_NetStream_maxPauseBufferTime); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_play2, &flash_net_NetStream_play2); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_audioCodec, &flash_net_NetStream_audioCodec); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_receiveVideoFPS, &flash_net_NetStream_receiveVideoFPS); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_bytesTotal, &flash_net_NetStream_bytesTotal); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_farID, &flash_net_NetStream_farID); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_receiveAudio, &flash_net_NetStream_receiveAudio); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_bufferLength, &flash_net_NetStream_bufferLength); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_seek, &flash_net_NetStream_seek); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_attachAudio, &flash_net_NetStream_attachAudio); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_bufferTime, &flash_net_NetStream_bufferTime); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_play, &flash_net_NetStream_play); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_publish, &flash_net_NetStream_publish); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_togglePause, &flash_net_NetStream_togglePause); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_checkPolicyFile, &flash_net_NetStream_checkPolicyFile); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_nearNonce, &flash_net_NetStream_nearNonce); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_decodedFrames, &flash_net_NetStream_decodedFrames); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_send, &flash_net_NetStream_send); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_currentFPS, &flash_net_NetStream_currentFPS); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_time, &flash_net_NetStream_time); - dict_put(&flash_net_NetStream.members, &flash_net_NetStream_soundTransform, &flash_net_NetStream_soundTransform); - dict_put(&flash_net_NetStream.static_members, &flash_net_NetStream_CONNECT_TO_FMS, &flash_net_NetStream_CONNECT_TO_FMS); - dict_put(&flash_net_NetStream.static_members, &flash_net_NetStream_DIRECT_CONNECTIONS, &flash_net_NetStream_DIRECT_CONNECTIONS); - dict_put(d, &_ArgumentError, &_ArgumentError); - dict_init2(&_ArgumentError.members, &memberinfo_type, 8); - dict_init2(&_ArgumentError.static_members, &memberinfo_type, 8); - dict_put(&_ArgumentError.static_members, &_ArgumentError_length, &_ArgumentError_length); - dict_put(d, &_XMLList, &_XMLList); - dict_init2(&_XMLList.members, &memberinfo_type, 63); - dict_init2(&_XMLList.static_members, &memberinfo_type, 8); - dict_put(&_XMLList.members, &_XMLList_normalize, &_XMLList_normalize); - dict_put(&_XMLList.members, &_XMLList_removeNamespace, &_XMLList_removeNamespace); - dict_put(&_XMLList.members, &_XMLList_prependChild, &_XMLList_prependChild); - dict_put(&_XMLList.members, &_XMLList_toXMLString, &_XMLList_toXMLString); - dict_put(&_XMLList.members, &_XMLList_nodeKind, &_XMLList_nodeKind); - dict_put(&_XMLList.members, &_XMLList_copy, &_XMLList_copy); - dict_put(&_XMLList.members, &_XMLList_text, &_XMLList_text); - dict_put(&_XMLList.members, &_XMLList_toString, &_XMLList_toString); - dict_put(&_XMLList.members, &_XMLList_childIndex, &_XMLList_childIndex); - dict_put(&_XMLList.members, &_XMLList_setName, &_XMLList_setName); - dict_put(&_XMLList.members, &_XMLList_setLocalName, &_XMLList_setLocalName); - dict_put(&_XMLList.members, &_XMLList_namespace, &_XMLList_namespace); - dict_put(&_XMLList.members, &_XMLList_insertChildBefore, &_XMLList_insertChildBefore); - dict_put(&_XMLList.members, &_XMLList_addNamespace, &_XMLList_addNamespace); - dict_put(&_XMLList.members, &_XMLList_propertyIsEnumerable, &_XMLList_propertyIsEnumerable); - dict_put(&_XMLList.members, &_XMLList_comments, &_XMLList_comments); - dict_put(&_XMLList.members, &_XMLList_attributes, &_XMLList_attributes); - dict_put(&_XMLList.members, &_XMLList_descendants, &_XMLList_descendants); - dict_put(&_XMLList.members, &_XMLList_replace, &_XMLList_replace); - dict_put(&_XMLList.members, &_XMLList_children, &_XMLList_children); - dict_put(&_XMLList.members, &_XMLList_contains, &_XMLList_contains); - dict_put(&_XMLList.members, &_XMLList_hasSimpleContent, &_XMLList_hasSimpleContent); - dict_put(&_XMLList.members, &_XMLList_elements, &_XMLList_elements); - dict_put(&_XMLList.members, &_XMLList_hasComplexContent, &_XMLList_hasComplexContent); - dict_put(&_XMLList.members, &_XMLList_insertChildAfter, &_XMLList_insertChildAfter); - dict_put(&_XMLList.members, &_XMLList_parent, &_XMLList_parent); - dict_put(&_XMLList.members, &_XMLList_length, &_XMLList_length); - dict_put(&_XMLList.members, &_XMLList_processingInstructions, &_XMLList_processingInstructions); - dict_put(&_XMLList.members, &_XMLList_child, &_XMLList_child); - dict_put(&_XMLList.members, &_XMLList_appendChild, &_XMLList_appendChild); - dict_put(&_XMLList.members, &_XMLList_valueOf, &_XMLList_valueOf); - dict_put(&_XMLList.members, &_XMLList_localName, &_XMLList_localName); - dict_put(&_XMLList.members, &_XMLList_inScopeNamespaces, &_XMLList_inScopeNamespaces); - dict_put(&_XMLList.members, &_XMLList_hasOwnProperty, &_XMLList_hasOwnProperty); - dict_put(&_XMLList.members, &_XMLList_setNamespace, &_XMLList_setNamespace); - dict_put(&_XMLList.members, &_XMLList_namespaceDeclarations, &_XMLList_namespaceDeclarations); - dict_put(&_XMLList.members, &_XMLList_name, &_XMLList_name); - dict_put(&_XMLList.members, &_XMLList_setChildren, &_XMLList_setChildren); - dict_put(&_XMLList.members, &_XMLList_attribute, &_XMLList_attribute); - dict_put(d, &flash_geom_Point, &flash_geom_Point); - dict_init2(&flash_geom_Point.members, &memberinfo_type, 15); - dict_init2(&flash_geom_Point.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_Point.members, &flash_geom_Point_equals, &flash_geom_Point_equals); - dict_put(&flash_geom_Point.members, &flash_geom_Point_normalize, &flash_geom_Point_normalize); - dict_put(&flash_geom_Point.members, &flash_geom_Point_x, &flash_geom_Point_x); - dict_put(&flash_geom_Point.members, &flash_geom_Point_offset, &flash_geom_Point_offset); - dict_put(&flash_geom_Point.members, &flash_geom_Point_subtract, &flash_geom_Point_subtract); - dict_put(&flash_geom_Point.members, &flash_geom_Point_y, &flash_geom_Point_y); - dict_put(&flash_geom_Point.members, &flash_geom_Point_length, &flash_geom_Point_length); - dict_put(&flash_geom_Point.members, &flash_geom_Point_add, &flash_geom_Point_add); - dict_put(&flash_geom_Point.members, &flash_geom_Point_toString, &flash_geom_Point_toString); - dict_put(&flash_geom_Point.members, &flash_geom_Point_clone, &flash_geom_Point_clone); - dict_put(&flash_geom_Point.static_members, &flash_geom_Point_polar, &flash_geom_Point_polar); - dict_put(&flash_geom_Point.static_members, &flash_geom_Point_distance, &flash_geom_Point_distance); - dict_put(&flash_geom_Point.static_members, &flash_geom_Point_interpolate, &flash_geom_Point_interpolate); - dict_put(d, &flash_printing_PrintJobOptions, &flash_printing_PrintJobOptions); - dict_init2(&flash_printing_PrintJobOptions.members, &memberinfo_type, 8); - dict_init2(&flash_printing_PrintJobOptions.static_members, &memberinfo_type, 8); - dict_put(&flash_printing_PrintJobOptions.members, &flash_printing_PrintJobOptions_printAsBitmap, &flash_printing_PrintJobOptions_printAsBitmap); - dict_put(d, &flash_display_DisplayObject, &flash_display_DisplayObject); - dict_init2(&flash_display_DisplayObject.members, &memberinfo_type, 63); - dict_init2(&flash_display_DisplayObject.static_members, &memberinfo_type, 8); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_rotation, &flash_display_DisplayObject_rotation); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_filters, &flash_display_DisplayObject_filters); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_rotationZ, &flash_display_DisplayObject_rotationZ); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_accessibilityProperties, &flash_display_DisplayObject_accessibilityProperties); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_mouseX, &flash_display_DisplayObject_mouseX); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_root, &flash_display_DisplayObject_root); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_stage, &flash_display_DisplayObject_stage); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_rotationY, &flash_display_DisplayObject_rotationY); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scaleZ, &flash_display_DisplayObject_scaleZ); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_local3DToGlobal, &flash_display_DisplayObject_local3DToGlobal); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_loaderInfo, &flash_display_DisplayObject_loaderInfo); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_cacheAsBitmap, &flash_display_DisplayObject_cacheAsBitmap); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_transform, &flash_display_DisplayObject_transform); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scaleY, &flash_display_DisplayObject_scaleY); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_height, &flash_display_DisplayObject_height); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_rotationX, &flash_display_DisplayObject_rotationX); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scrollRect, &flash_display_DisplayObject_scrollRect); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_width, &flash_display_DisplayObject_width); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scale9Grid, &flash_display_DisplayObject_scale9Grid); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_parent, &flash_display_DisplayObject_parent); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_hitTestObject, &flash_display_DisplayObject_hitTestObject); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_hitTestPoint, &flash_display_DisplayObject_hitTestPoint); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_alpha, &flash_display_DisplayObject_alpha); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_getRect, &flash_display_DisplayObject_getRect); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_opaqueBackground, &flash_display_DisplayObject_opaqueBackground); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_globalToLocal3D, &flash_display_DisplayObject_globalToLocal3D); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_visible, &flash_display_DisplayObject_visible); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_blendMode, &flash_display_DisplayObject_blendMode); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_scaleX, &flash_display_DisplayObject_scaleX); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_globalToLocal, &flash_display_DisplayObject_globalToLocal); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_localToGlobal, &flash_display_DisplayObject_localToGlobal); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_z, &flash_display_DisplayObject_z); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_name, &flash_display_DisplayObject_name); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_getBounds, &flash_display_DisplayObject_getBounds); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_mask, &flash_display_DisplayObject_mask); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_mouseY, &flash_display_DisplayObject_mouseY); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_x, &flash_display_DisplayObject_x); - dict_put(&flash_display_DisplayObject.members, &flash_display_DisplayObject_y, &flash_display_DisplayObject_y); - dict_put(d, &flash_sampler_DeleteObjectSample, &flash_sampler_DeleteObjectSample); - dict_init2(&flash_sampler_DeleteObjectSample.members, &memberinfo_type, 8); - dict_init2(&flash_sampler_DeleteObjectSample.static_members, &memberinfo_type, 8); - dict_put(&flash_sampler_DeleteObjectSample.members, &flash_sampler_DeleteObjectSample_size, &flash_sampler_DeleteObjectSample_size); - dict_put(&flash_sampler_DeleteObjectSample.members, &flash_sampler_DeleteObjectSample_id, &flash_sampler_DeleteObjectSample_id); - dict_put(d, &flash_system_fscommand, &flash_system_fscommand); - dict_put(d, &flash_utils_unescapeMultiByte, &flash_utils_unescapeMultiByte); - dict_put(d, &flash_sampler_StackFrame, &flash_sampler_StackFrame); - dict_init2(&flash_sampler_StackFrame.members, &memberinfo_type, 8); - dict_init2(&flash_sampler_StackFrame.static_members, &memberinfo_type, 8); - dict_put(&flash_sampler_StackFrame.members, &flash_sampler_StackFrame_name, &flash_sampler_StackFrame_name); - dict_put(&flash_sampler_StackFrame.members, &flash_sampler_StackFrame_line, &flash_sampler_StackFrame_line); - dict_put(&flash_sampler_StackFrame.members, &flash_sampler_StackFrame_toString, &flash_sampler_StackFrame_toString); - dict_put(&flash_sampler_StackFrame.members, &flash_sampler_StackFrame_file, &flash_sampler_StackFrame_file); - dict_put(d, &flash_system_JPEGLoaderContext, &flash_system_JPEGLoaderContext); - dict_init2(&flash_system_JPEGLoaderContext.members, &memberinfo_type, 8); - dict_init2(&flash_system_JPEGLoaderContext.static_members, &memberinfo_type, 8); - dict_put(&flash_system_JPEGLoaderContext.members, &flash_system_JPEGLoaderContext_deblockingFilter, &flash_system_JPEGLoaderContext_deblockingFilter); - dict_put(d, &flash_system_IME, &flash_system_IME); - dict_init2(&flash_system_IME.members, &memberinfo_type, 8); - dict_init2(&flash_system_IME.static_members, &memberinfo_type, 8); - dict_put(&flash_system_IME.static_members, &flash_system_IME_setCompositionString, &flash_system_IME_setCompositionString); - dict_put(&flash_system_IME.static_members, &flash_system_IME_enabled, &flash_system_IME_enabled); - dict_put(&flash_system_IME.static_members, &flash_system_IME_doConversion, &flash_system_IME_doConversion); - dict_put(&flash_system_IME.static_members, &flash_system_IME_conversionMode, &flash_system_IME_conversionMode); - dict_put(d, &_isNaN, &_isNaN); - dict_put(d, &flash_system_Security, &flash_system_Security); - dict_init2(&flash_system_Security.members, &memberinfo_type, 8); - dict_init2(&flash_system_Security.static_members, &memberinfo_type, 15); - dict_put(&flash_system_Security.static_members, &flash_system_Security_sandboxType, &flash_system_Security_sandboxType); - dict_put(&flash_system_Security.static_members, &flash_system_Security_LOCAL_WITH_NETWORK, &flash_system_Security_LOCAL_WITH_NETWORK); - dict_put(&flash_system_Security.static_members, &flash_system_Security_loadPolicyFile, &flash_system_Security_loadPolicyFile); - dict_put(&flash_system_Security.static_members, &flash_system_Security_allowDomain, &flash_system_Security_allowDomain); - dict_put(&flash_system_Security.static_members, &flash_system_Security_showSettings, &flash_system_Security_showSettings); - dict_put(&flash_system_Security.static_members, &flash_system_Security_LOCAL_TRUSTED, &flash_system_Security_LOCAL_TRUSTED); - dict_put(&flash_system_Security.static_members, &flash_system_Security_disableAVM1Loading, &flash_system_Security_disableAVM1Loading); - dict_put(&flash_system_Security.static_members, &flash_system_Security_allowInsecureDomain, &flash_system_Security_allowInsecureDomain); - dict_put(&flash_system_Security.static_members, &flash_system_Security_exactSettings, &flash_system_Security_exactSettings); - dict_put(&flash_system_Security.static_members, &flash_system_Security_REMOTE, &flash_system_Security_REMOTE); - dict_put(&flash_system_Security.static_members, &flash_system_Security_LOCAL_WITH_FILE, &flash_system_Security_LOCAL_WITH_FILE); - dict_put(d, &flash_display_Bitmap, &flash_display_Bitmap); - dict_init2(&flash_display_Bitmap.members, &memberinfo_type, 8); - dict_init2(&flash_display_Bitmap.static_members, &memberinfo_type, 8); - dict_put(&flash_display_Bitmap.members, &flash_display_Bitmap_pixelSnapping, &flash_display_Bitmap_pixelSnapping); - dict_put(&flash_display_Bitmap.members, &flash_display_Bitmap_bitmapData, &flash_display_Bitmap_bitmapData); - dict_put(&flash_display_Bitmap.members, &flash_display_Bitmap_smoothing, &flash_display_Bitmap_smoothing); - dict_put(d, &flash_printing_PrintJob, &flash_printing_PrintJob); - dict_init2(&flash_printing_PrintJob.members, &memberinfo_type, 15); - dict_init2(&flash_printing_PrintJob.static_members, &memberinfo_type, 8); - dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_paperWidth, &flash_printing_PrintJob_paperWidth); - dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_addPage, &flash_printing_PrintJob_addPage); - dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_pageHeight, &flash_printing_PrintJob_pageHeight); - dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_start, &flash_printing_PrintJob_start); - dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_pageWidth, &flash_printing_PrintJob_pageWidth); - dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_send, &flash_printing_PrintJob_send); - dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_paperHeight, &flash_printing_PrintJob_paperHeight); - dict_put(&flash_printing_PrintJob.members, &flash_printing_PrintJob_orientation, &flash_printing_PrintJob_orientation); - dict_put(d, &flash_text_StaticText, &flash_text_StaticText); - dict_init2(&flash_text_StaticText.members, &memberinfo_type, 8); - dict_init2(&flash_text_StaticText.static_members, &memberinfo_type, 8); - dict_put(&flash_text_StaticText.members, &flash_text_StaticText_text, &flash_text_StaticText_text); - dict_put(d, &flash_text_engine_SpaceJustifier, &flash_text_engine_SpaceJustifier); - dict_init2(&flash_text_engine_SpaceJustifier.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_SpaceJustifier.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_SpaceJustifier.members, &flash_text_engine_SpaceJustifier_clone, &flash_text_engine_SpaceJustifier_clone); - dict_put(&flash_text_engine_SpaceJustifier.members, &flash_text_engine_SpaceJustifier_letterSpacing, &flash_text_engine_SpaceJustifier_letterSpacing); - dict_put(d, &flash_events_DataEvent, &flash_events_DataEvent); - dict_init2(&flash_events_DataEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_DataEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_DataEvent.members, &flash_events_DataEvent_toString, &flash_events_DataEvent_toString); - dict_put(&flash_events_DataEvent.members, &flash_events_DataEvent_clone, &flash_events_DataEvent_clone); - dict_put(&flash_events_DataEvent.members, &flash_events_DataEvent_data, &flash_events_DataEvent_data); - dict_put(&flash_events_DataEvent.static_members, &flash_events_DataEvent_DATA, &flash_events_DataEvent_DATA); - dict_put(&flash_events_DataEvent.static_members, &flash_events_DataEvent_UPLOAD_COMPLETE_DATA, &flash_events_DataEvent_UPLOAD_COMPLETE_DATA); - dict_put(d, &flash_events_ActivityEvent, &flash_events_ActivityEvent); - dict_init2(&flash_events_ActivityEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_ActivityEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_ActivityEvent.members, &flash_events_ActivityEvent_toString, &flash_events_ActivityEvent_toString); - dict_put(&flash_events_ActivityEvent.members, &flash_events_ActivityEvent_activating, &flash_events_ActivityEvent_activating); - dict_put(&flash_events_ActivityEvent.members, &flash_events_ActivityEvent_clone, &flash_events_ActivityEvent_clone); - dict_put(&flash_events_ActivityEvent.static_members, &flash_events_ActivityEvent_ACTIVITY, &flash_events_ActivityEvent_ACTIVITY); - dict_put(d, &flash_display_GraphicsEndFill, &flash_display_GraphicsEndFill); - dict_init2(&flash_display_GraphicsEndFill.members, &memberinfo_type, 8); - dict_init2(&flash_display_GraphicsEndFill.static_members, &memberinfo_type, 8); - dict_put(d, &flash_display_ColorCorrection, &flash_display_ColorCorrection); - dict_init2(&flash_display_ColorCorrection.members, &memberinfo_type, 8); - dict_init2(&flash_display_ColorCorrection.static_members, &memberinfo_type, 8); - dict_put(&flash_display_ColorCorrection.static_members, &flash_display_ColorCorrection_OFF, &flash_display_ColorCorrection_OFF); - dict_put(&flash_display_ColorCorrection.static_members, &flash_display_ColorCorrection_DEFAULT, &flash_display_ColorCorrection_DEFAULT); - dict_put(&flash_display_ColorCorrection.static_members, &flash_display_ColorCorrection_ON, &flash_display_ColorCorrection_ON); - dict_put(d, &flash_events_IOErrorEvent, &flash_events_IOErrorEvent); - dict_init2(&flash_events_IOErrorEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_IOErrorEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_IOErrorEvent.members, &flash_events_IOErrorEvent_toString, &flash_events_IOErrorEvent_toString); - dict_put(&flash_events_IOErrorEvent.members, &flash_events_IOErrorEvent_clone, &flash_events_IOErrorEvent_clone); - dict_put(&flash_events_IOErrorEvent.static_members, &flash_events_IOErrorEvent_IO_ERROR, &flash_events_IOErrorEvent_IO_ERROR); - dict_put(&flash_events_IOErrorEvent.static_members, &flash_events_IOErrorEvent_VERIFY_ERROR, &flash_events_IOErrorEvent_VERIFY_ERROR); - dict_put(&flash_events_IOErrorEvent.static_members, &flash_events_IOErrorEvent_NETWORK_ERROR, &flash_events_IOErrorEvent_NETWORK_ERROR); - dict_put(&flash_events_IOErrorEvent.static_members, &flash_events_IOErrorEvent_DISK_ERROR, &flash_events_IOErrorEvent_DISK_ERROR); - dict_put(d, &flash_display_GraphicsStroke, &flash_display_GraphicsStroke); - dict_init2(&flash_display_GraphicsStroke.members, &memberinfo_type, 15); - dict_init2(&flash_display_GraphicsStroke.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_scaleMode, &flash_display_GraphicsStroke_scaleMode); - dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_miterLimit, &flash_display_GraphicsStroke_miterLimit); - dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_pixelHinting, &flash_display_GraphicsStroke_pixelHinting); - dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_fill, &flash_display_GraphicsStroke_fill); - dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_thickness, &flash_display_GraphicsStroke_thickness); - dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_joints, &flash_display_GraphicsStroke_joints); - dict_put(&flash_display_GraphicsStroke.members, &flash_display_GraphicsStroke_caps, &flash_display_GraphicsStroke_caps); - dict_put(d, &_Boolean, &_Boolean); - dict_init2(&_Boolean.members, &memberinfo_type, 8); - dict_init2(&_Boolean.static_members, &memberinfo_type, 8); - dict_put(&_Boolean.members, &_Boolean_valueOf, &_Boolean_valueOf); - dict_put(&_Boolean.members, &_Boolean_toString, &_Boolean_toString); - dict_put(&_Boolean.static_members, &_Boolean_length, &_Boolean_length); - dict_put(d, &flash_sampler_getMemberNames, &flash_sampler_getMemberNames); - dict_put(d, &flash_utils_getQualifiedClassName, &flash_utils_getQualifiedClassName); - dict_put(d, &flash_text_engine_GraphicElement, &flash_text_engine_GraphicElement); - dict_init2(&flash_text_engine_GraphicElement.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_GraphicElement.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_GraphicElement.members, &flash_text_engine_GraphicElement_graphic, &flash_text_engine_GraphicElement_graphic); - dict_put(&flash_text_engine_GraphicElement.members, &flash_text_engine_GraphicElement_elementWidth, &flash_text_engine_GraphicElement_elementWidth); - dict_put(&flash_text_engine_GraphicElement.members, &flash_text_engine_GraphicElement_elementHeight, &flash_text_engine_GraphicElement_elementHeight); - dict_put(d, &flash_media_Microphone, &flash_media_Microphone); - dict_init2(&flash_media_Microphone.members, &memberinfo_type, 31); - dict_init2(&flash_media_Microphone.static_members, &memberinfo_type, 8); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_codec, &flash_media_Microphone_codec); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_gain, &flash_media_Microphone_gain); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_index, &flash_media_Microphone_index); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_setLoopBack, &flash_media_Microphone_setLoopBack); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_setSilenceLevel, &flash_media_Microphone_setSilenceLevel); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_name, &flash_media_Microphone_name); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_setUseEchoSuppression, &flash_media_Microphone_setUseEchoSuppression); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_framesPerPacket, &flash_media_Microphone_framesPerPacket); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_muted, &flash_media_Microphone_muted); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_soundTransform, &flash_media_Microphone_soundTransform); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_encodeQuality, &flash_media_Microphone_encodeQuality); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_useEchoSuppression, &flash_media_Microphone_useEchoSuppression); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_silenceLevel, &flash_media_Microphone_silenceLevel); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_silenceTimeout, &flash_media_Microphone_silenceTimeout); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_rate, &flash_media_Microphone_rate); - dict_put(&flash_media_Microphone.members, &flash_media_Microphone_activityLevel, &flash_media_Microphone_activityLevel); - dict_put(&flash_media_Microphone.static_members, &flash_media_Microphone_names, &flash_media_Microphone_names); - dict_put(&flash_media_Microphone.static_members, &flash_media_Microphone_getMicrophone, &flash_media_Microphone_getMicrophone); - dict_put(d, &flash_ui_ContextMenuClipboardItems, &flash_ui_ContextMenuClipboardItems); - dict_init2(&flash_ui_ContextMenuClipboardItems.members, &memberinfo_type, 8); - dict_init2(&flash_ui_ContextMenuClipboardItems.static_members, &memberinfo_type, 8); - dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_clear, &flash_ui_ContextMenuClipboardItems_clear); - dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_clone, &flash_ui_ContextMenuClipboardItems_clone); - dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_paste, &flash_ui_ContextMenuClipboardItems_paste); - dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_selectAll, &flash_ui_ContextMenuClipboardItems_selectAll); - dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_copy, &flash_ui_ContextMenuClipboardItems_copy); - dict_put(&flash_ui_ContextMenuClipboardItems.members, &flash_ui_ContextMenuClipboardItems_cut, &flash_ui_ContextMenuClipboardItems_cut); - dict_put(d, &flash_display_GraphicsShaderFill, &flash_display_GraphicsShaderFill); - dict_init2(&flash_display_GraphicsShaderFill.members, &memberinfo_type, 8); - dict_init2(&flash_display_GraphicsShaderFill.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GraphicsShaderFill.members, &flash_display_GraphicsShaderFill_shader, &flash_display_GraphicsShaderFill_shader); - dict_put(&flash_display_GraphicsShaderFill.members, &flash_display_GraphicsShaderFill_matrix, &flash_display_GraphicsShaderFill_matrix); - dict_put(d, &flash_errors_IllegalOperationError, &flash_errors_IllegalOperationError); - dict_init2(&flash_errors_IllegalOperationError.members, &memberinfo_type, 8); - dict_init2(&flash_errors_IllegalOperationError.static_members, &memberinfo_type, 8); - dict_put(d, &flash_filters_GradientGlowFilter, &flash_filters_GradientGlowFilter); - dict_init2(&flash_filters_GradientGlowFilter.members, &memberinfo_type, 15); - dict_init2(&flash_filters_GradientGlowFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_strength, &flash_filters_GradientGlowFilter_strength); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_quality, &flash_filters_GradientGlowFilter_quality); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_angle, &flash_filters_GradientGlowFilter_angle); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_knockout, &flash_filters_GradientGlowFilter_knockout); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_type, &flash_filters_GradientGlowFilter_type); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_alphas, &flash_filters_GradientGlowFilter_alphas); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_ratios, &flash_filters_GradientGlowFilter_ratios); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_colors, &flash_filters_GradientGlowFilter_colors); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_blurX, &flash_filters_GradientGlowFilter_blurX); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_blurY, &flash_filters_GradientGlowFilter_blurY); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_distance, &flash_filters_GradientGlowFilter_distance); - dict_put(&flash_filters_GradientGlowFilter.members, &flash_filters_GradientGlowFilter_clone, &flash_filters_GradientGlowFilter_clone); - dict_put(d, &flash_display_CapsStyle, &flash_display_CapsStyle); - dict_init2(&flash_display_CapsStyle.members, &memberinfo_type, 8); - dict_init2(&flash_display_CapsStyle.static_members, &memberinfo_type, 8); - dict_put(&flash_display_CapsStyle.static_members, &flash_display_CapsStyle_ROUND, &flash_display_CapsStyle_ROUND); - dict_put(&flash_display_CapsStyle.static_members, &flash_display_CapsStyle_SQUARE, &flash_display_CapsStyle_SQUARE); - dict_put(&flash_display_CapsStyle.static_members, &flash_display_CapsStyle_NONE, &flash_display_CapsStyle_NONE); - dict_put(d, &flash_text_TextSnapshot, &flash_text_TextSnapshot); - dict_init2(&flash_text_TextSnapshot.members, &memberinfo_type, 15); - dict_init2(&flash_text_TextSnapshot.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_setSelectColor, &flash_text_TextSnapshot_setSelectColor); - dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_setSelected, &flash_text_TextSnapshot_setSelected); - dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_getSelectedText, &flash_text_TextSnapshot_getSelectedText); - dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_getTextRunInfo, &flash_text_TextSnapshot_getTextRunInfo); - dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_charCount, &flash_text_TextSnapshot_charCount); - dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_findText, &flash_text_TextSnapshot_findText); - dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_getSelected, &flash_text_TextSnapshot_getSelected); - dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_hitTestTextNearPos, &flash_text_TextSnapshot_hitTestTextNearPos); - dict_put(&flash_text_TextSnapshot.members, &flash_text_TextSnapshot_getText, &flash_text_TextSnapshot_getText); - dict_put(d, &flash_text_engine_FontLookup, &flash_text_engine_FontLookup); - dict_init2(&flash_text_engine_FontLookup.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_FontLookup.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_FontLookup.static_members, &flash_text_engine_FontLookup_DEVICE, &flash_text_engine_FontLookup_DEVICE); - dict_put(&flash_text_engine_FontLookup.static_members, &flash_text_engine_FontLookup_EMBEDDED_CFF, &flash_text_engine_FontLookup_EMBEDDED_CFF); - dict_put(d, &flash_display_InteractiveObject, &flash_display_InteractiveObject); - dict_init2(&flash_display_InteractiveObject.members, &memberinfo_type, 15); - dict_init2(&flash_display_InteractiveObject.static_members, &memberinfo_type, 8); - dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_tabIndex, &flash_display_InteractiveObject_tabIndex); - dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_doubleClickEnabled, &flash_display_InteractiveObject_doubleClickEnabled); - dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_tabEnabled, &flash_display_InteractiveObject_tabEnabled); - dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_mouseEnabled, &flash_display_InteractiveObject_mouseEnabled); - dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_contextMenu, &flash_display_InteractiveObject_contextMenu); - dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_focusRect, &flash_display_InteractiveObject_focusRect); - dict_put(&flash_display_InteractiveObject.members, &flash_display_InteractiveObject_accessibilityImplementation, &flash_display_InteractiveObject_accessibilityImplementation); - dict_put(d, &flash_text_TextField, &flash_text_TextField); - dict_init2(&flash_text_TextField.members, &memberinfo_type, 127); - dict_init2(&flash_text_TextField.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getTextFormat, &flash_text_TextField_getTextFormat); - dict_put(&flash_text_TextField.members, &flash_text_TextField_border, &flash_text_TextField_border); - dict_put(&flash_text_TextField.members, &flash_text_TextField_selectedText, &flash_text_TextField_selectedText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_pasteRichText, &flash_text_TextField_pasteRichText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_bottomScrollV, &flash_text_TextField_bottomScrollV); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineIndexOfChar, &flash_text_TextField_getLineIndexOfChar); - dict_put(&flash_text_TextField.members, &flash_text_TextField_replaceText, &flash_text_TextField_replaceText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_defaultTextFormat, &flash_text_TextField_defaultTextFormat); - dict_put(&flash_text_TextField.members, &flash_text_TextField_restrict, &flash_text_TextField_restrict); - dict_put(&flash_text_TextField.members, &flash_text_TextField_htmlText, &flash_text_TextField_htmlText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_copyRichText, &flash_text_TextField_copyRichText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineText, &flash_text_TextField_getLineText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getFirstCharInParagraph, &flash_text_TextField_getFirstCharInParagraph); - dict_put(&flash_text_TextField.members, &flash_text_TextField_setSelection, &flash_text_TextField_setSelection); - dict_put(&flash_text_TextField.members, &flash_text_TextField_length, &flash_text_TextField_length); - dict_put(&flash_text_TextField.members, &flash_text_TextField_wordWrap, &flash_text_TextField_wordWrap); - dict_put(&flash_text_TextField.members, &flash_text_TextField_appendText, &flash_text_TextField_appendText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_caretIndex, &flash_text_TextField_caretIndex); - dict_put(&flash_text_TextField.members, &flash_text_TextField_mouseWheelEnabled, &flash_text_TextField_mouseWheelEnabled); - dict_put(&flash_text_TextField.members, &flash_text_TextField_selectionBeginIndex, &flash_text_TextField_selectionBeginIndex); - dict_put(&flash_text_TextField.members, &flash_text_TextField_sharpness, &flash_text_TextField_sharpness); - dict_put(&flash_text_TextField.members, &flash_text_TextField_type, &flash_text_TextField_type); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineIndexAtPoint, &flash_text_TextField_getLineIndexAtPoint); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getCharIndexAtPoint, &flash_text_TextField_getCharIndexAtPoint); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getXMLText, &flash_text_TextField_getXMLText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getParagraphLength, &flash_text_TextField_getParagraphLength); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getRawText, &flash_text_TextField_getRawText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_gridFitType, &flash_text_TextField_gridFitType); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineOffset, &flash_text_TextField_getLineOffset); - dict_put(&flash_text_TextField.members, &flash_text_TextField_backgroundColor, &flash_text_TextField_backgroundColor); - dict_put(&flash_text_TextField.members, &flash_text_TextField_multiline, &flash_text_TextField_multiline); - dict_put(&flash_text_TextField.members, &flash_text_TextField_numLines, &flash_text_TextField_numLines); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getImageReference, &flash_text_TextField_getImageReference); - dict_put(&flash_text_TextField.members, &flash_text_TextField_displayAsPassword, &flash_text_TextField_displayAsPassword); - dict_put(&flash_text_TextField.members, &flash_text_TextField_textWidth, &flash_text_TextField_textWidth); - dict_put(&flash_text_TextField.members, &flash_text_TextField_autoSize, &flash_text_TextField_autoSize); - dict_put(&flash_text_TextField.members, &flash_text_TextField_selectable, &flash_text_TextField_selectable); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getCharBoundaries, &flash_text_TextField_getCharBoundaries); - dict_put(&flash_text_TextField.members, &flash_text_TextField_alwaysShowSelection, &flash_text_TextField_alwaysShowSelection); - dict_put(&flash_text_TextField.members, &flash_text_TextField_thickness, &flash_text_TextField_thickness); - dict_put(&flash_text_TextField.members, &flash_text_TextField_useRichTextClipboard, &flash_text_TextField_useRichTextClipboard); - dict_put(&flash_text_TextField.members, &flash_text_TextField_scrollV, &flash_text_TextField_scrollV); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getTextRuns, &flash_text_TextField_getTextRuns); - dict_put(&flash_text_TextField.members, &flash_text_TextField_setTextFormat, &flash_text_TextField_setTextFormat); - dict_put(&flash_text_TextField.members, &flash_text_TextField_textColor, &flash_text_TextField_textColor); - dict_put(&flash_text_TextField.members, &flash_text_TextField_maxScrollV, &flash_text_TextField_maxScrollV); - dict_put(&flash_text_TextField.members, &flash_text_TextField_embedFonts, &flash_text_TextField_embedFonts); - dict_put(&flash_text_TextField.members, &flash_text_TextField_scrollH, &flash_text_TextField_scrollH); - dict_put(&flash_text_TextField.members, &flash_text_TextField_text, &flash_text_TextField_text); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineLength, &flash_text_TextField_getLineLength); - dict_put(&flash_text_TextField.members, &flash_text_TextField_textHeight, &flash_text_TextField_textHeight); - dict_put(&flash_text_TextField.members, &flash_text_TextField_antiAliasType, &flash_text_TextField_antiAliasType); - dict_put(&flash_text_TextField.members, &flash_text_TextField_styleSheet, &flash_text_TextField_styleSheet); - dict_put(&flash_text_TextField.members, &flash_text_TextField_background, &flash_text_TextField_background); - dict_put(&flash_text_TextField.members, &flash_text_TextField_replaceSelectedText, &flash_text_TextField_replaceSelectedText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_borderColor, &flash_text_TextField_borderColor); - dict_put(&flash_text_TextField.members, &flash_text_TextField_maxScrollH, &flash_text_TextField_maxScrollH); - dict_put(&flash_text_TextField.members, &flash_text_TextField_maxChars, &flash_text_TextField_maxChars); - dict_put(&flash_text_TextField.members, &flash_text_TextField_getLineMetrics, &flash_text_TextField_getLineMetrics); - dict_put(&flash_text_TextField.members, &flash_text_TextField_selectionEndIndex, &flash_text_TextField_selectionEndIndex); - dict_put(&flash_text_TextField.members, &flash_text_TextField_insertXMLText, &flash_text_TextField_insertXMLText); - dict_put(&flash_text_TextField.members, &flash_text_TextField_condenseWhite, &flash_text_TextField_condenseWhite); - dict_put(&flash_text_TextField.static_members, &flash_text_TextField_isFontCompatible, &flash_text_TextField_isFontCompatible); - dict_put(d, &flash_printing_PrintJobOrientation, &flash_printing_PrintJobOrientation); - dict_init2(&flash_printing_PrintJobOrientation.members, &memberinfo_type, 8); - dict_init2(&flash_printing_PrintJobOrientation.static_members, &memberinfo_type, 8); - dict_put(&flash_printing_PrintJobOrientation.static_members, &flash_printing_PrintJobOrientation_LANDSCAPE, &flash_printing_PrintJobOrientation_LANDSCAPE); - dict_put(&flash_printing_PrintJobOrientation.static_members, &flash_printing_PrintJobOrientation_PORTRAIT, &flash_printing_PrintJobOrientation_PORTRAIT); - dict_put(d, &flash_text_TextRenderer, &flash_text_TextRenderer); - dict_init2(&flash_text_TextRenderer.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextRenderer.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextRenderer.static_members, &flash_text_TextRenderer_displayMode, &flash_text_TextRenderer_displayMode); - dict_put(&flash_text_TextRenderer.static_members, &flash_text_TextRenderer_antiAliasType, &flash_text_TextRenderer_antiAliasType); - dict_put(&flash_text_TextRenderer.static_members, &flash_text_TextRenderer_maxLevel, &flash_text_TextRenderer_maxLevel); - dict_put(&flash_text_TextRenderer.static_members, &flash_text_TextRenderer_setAdvancedAntiAliasingTable, &flash_text_TextRenderer_setAdvancedAntiAliasingTable); - dict_put(d, &flash_net_NetConnection, &flash_net_NetConnection); - dict_init2(&flash_net_NetConnection.members, &memberinfo_type, 31); - dict_init2(&flash_net_NetConnection.static_members, &memberinfo_type, 8); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_nearID, &flash_net_NetConnection_nearID); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_client, &flash_net_NetConnection_client); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_farNonce, &flash_net_NetConnection_farNonce); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_objectEncoding, &flash_net_NetConnection_objectEncoding); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_farID, &flash_net_NetConnection_farID); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_connected, &flash_net_NetConnection_connected); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_call, &flash_net_NetConnection_call); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_usingTLS, &flash_net_NetConnection_usingTLS); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_proxyType, &flash_net_NetConnection_proxyType); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_addHeader, &flash_net_NetConnection_addHeader); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_protocol, &flash_net_NetConnection_protocol); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_close, &flash_net_NetConnection_close); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_nearNonce, &flash_net_NetConnection_nearNonce); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_connect, &flash_net_NetConnection_connect); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_unconnectedPeerStreams, &flash_net_NetConnection_unconnectedPeerStreams); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_maxPeerConnections, &flash_net_NetConnection_maxPeerConnections); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_connectedProxyType, &flash_net_NetConnection_connectedProxyType); - dict_put(&flash_net_NetConnection.members, &flash_net_NetConnection_uri, &flash_net_NetConnection_uri); - dict_put(&flash_net_NetConnection.static_members, &flash_net_NetConnection_defaultObjectEncoding, &flash_net_NetConnection_defaultObjectEncoding); - dict_put(d, &_decodeURIComponent, &_decodeURIComponent); - dict_put(d, &flash_sampler_isGetterSetter, &flash_sampler_isGetterSetter); - dict_put(d, &flash_utils_getQualifiedSuperclassName, &flash_utils_getQualifiedSuperclassName); - dict_put(d, &flash_display_GraphicsPathWinding, &flash_display_GraphicsPathWinding); - dict_init2(&flash_display_GraphicsPathWinding.members, &memberinfo_type, 8); - dict_init2(&flash_display_GraphicsPathWinding.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GraphicsPathWinding.static_members, &flash_display_GraphicsPathWinding_EVEN_ODD, &flash_display_GraphicsPathWinding_EVEN_ODD); - dict_put(&flash_display_GraphicsPathWinding.static_members, &flash_display_GraphicsPathWinding_NON_ZERO, &flash_display_GraphicsPathWinding_NON_ZERO); - dict_put(d, &flash_text_engine_TabStop, &flash_text_engine_TabStop); - dict_init2(&flash_text_engine_TabStop.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TabStop.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TabStop.members, &flash_text_engine_TabStop_alignment, &flash_text_engine_TabStop_alignment); - dict_put(&flash_text_engine_TabStop.members, &flash_text_engine_TabStop_position, &flash_text_engine_TabStop_position); - dict_put(&flash_text_engine_TabStop.members, &flash_text_engine_TabStop_decimalAlignmentToken, &flash_text_engine_TabStop_decimalAlignmentToken); - dict_put(d, &flash_text_engine_JustificationStyle, &flash_text_engine_JustificationStyle); - dict_init2(&flash_text_engine_JustificationStyle.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_JustificationStyle.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_JustificationStyle.static_members, &flash_text_engine_JustificationStyle_PUSH_OUT_ONLY, &flash_text_engine_JustificationStyle_PUSH_OUT_ONLY); - dict_put(&flash_text_engine_JustificationStyle.static_members, &flash_text_engine_JustificationStyle_PRIORITIZE_LEAST_ADJUSTMENT, &flash_text_engine_JustificationStyle_PRIORITIZE_LEAST_ADJUSTMENT); - dict_put(&flash_text_engine_JustificationStyle.static_members, &flash_text_engine_JustificationStyle_PUSH_IN_KINSOKU, &flash_text_engine_JustificationStyle_PUSH_IN_KINSOKU); - dict_put(d, &flash_sampler_startSampling, &flash_sampler_startSampling); - dict_put(d, &flash_text_engine_TextRotation, &flash_text_engine_TextRotation); - dict_init2(&flash_text_engine_TextRotation.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TextRotation.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_ROTATE_270, &flash_text_engine_TextRotation_ROTATE_270); - dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_AUTO, &flash_text_engine_TextRotation_AUTO); - dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_ROTATE_0, &flash_text_engine_TextRotation_ROTATE_0); - dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_ROTATE_90, &flash_text_engine_TextRotation_ROTATE_90); - dict_put(&flash_text_engine_TextRotation.static_members, &flash_text_engine_TextRotation_ROTATE_180, &flash_text_engine_TextRotation_ROTATE_180); - dict_put(d, &flash_sampler_clearSamples, &flash_sampler_clearSamples); - dict_put(d, &flash_system_IMEConversionMode, &flash_system_IMEConversionMode); - dict_init2(&flash_system_IMEConversionMode.members, &memberinfo_type, 8); - dict_init2(&flash_system_IMEConversionMode.static_members, &memberinfo_type, 8); - dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_JAPANESE_KATAKANA_FULL, &flash_system_IMEConversionMode_JAPANESE_KATAKANA_FULL); - dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_CHINESE, &flash_system_IMEConversionMode_CHINESE); - dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_JAPANESE_KATAKANA_HALF, &flash_system_IMEConversionMode_JAPANESE_KATAKANA_HALF); - dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_UNKNOWN, &flash_system_IMEConversionMode_UNKNOWN); - dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_KOREAN, &flash_system_IMEConversionMode_KOREAN); - dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_ALPHANUMERIC_HALF, &flash_system_IMEConversionMode_ALPHANUMERIC_HALF); - dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_ALPHANUMERIC_FULL, &flash_system_IMEConversionMode_ALPHANUMERIC_FULL); - dict_put(&flash_system_IMEConversionMode.static_members, &flash_system_IMEConversionMode_JAPANESE_HIRAGANA, &flash_system_IMEConversionMode_JAPANESE_HIRAGANA); - dict_put(d, &flash_display_StageScaleMode, &flash_display_StageScaleMode); - dict_init2(&flash_display_StageScaleMode.members, &memberinfo_type, 8); - dict_init2(&flash_display_StageScaleMode.static_members, &memberinfo_type, 8); - dict_put(&flash_display_StageScaleMode.static_members, &flash_display_StageScaleMode_SHOW_ALL, &flash_display_StageScaleMode_SHOW_ALL); - dict_put(&flash_display_StageScaleMode.static_members, &flash_display_StageScaleMode_NO_BORDER, &flash_display_StageScaleMode_NO_BORDER); - dict_put(&flash_display_StageScaleMode.static_members, &flash_display_StageScaleMode_EXACT_FIT, &flash_display_StageScaleMode_EXACT_FIT); - dict_put(&flash_display_StageScaleMode.static_members, &flash_display_StageScaleMode_NO_SCALE, &flash_display_StageScaleMode_NO_SCALE); - dict_put(d, &flash_sampler_getSize, &flash_sampler_getSize); - dict_put(d, &flash_net_URLStream, &flash_net_URLStream); - dict_init2(&flash_net_URLStream.members, &memberinfo_type, 31); - dict_init2(&flash_net_URLStream.static_members, &memberinfo_type, 8); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUTF, &flash_net_URLStream_readUTF); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readByte, &flash_net_URLStream_readByte); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUTFBytes, &flash_net_URLStream_readUTFBytes); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readShort, &flash_net_URLStream_readShort); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_objectEncoding, &flash_net_URLStream_objectEncoding); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_connected, &flash_net_URLStream_connected); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUnsignedInt, &flash_net_URLStream_readUnsignedInt); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readDouble, &flash_net_URLStream_readDouble); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readBytes, &flash_net_URLStream_readBytes); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUnsignedByte, &flash_net_URLStream_readUnsignedByte); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readMultiByte, &flash_net_URLStream_readMultiByte); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readInt, &flash_net_URLStream_readInt); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_bytesAvailable, &flash_net_URLStream_bytesAvailable); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_load, &flash_net_URLStream_load); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_close, &flash_net_URLStream_close); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readUnsignedShort, &flash_net_URLStream_readUnsignedShort); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readObject, &flash_net_URLStream_readObject); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readFloat, &flash_net_URLStream_readFloat); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_endian, &flash_net_URLStream_endian); - dict_put(&flash_net_URLStream.members, &flash_net_URLStream_readBoolean, &flash_net_URLStream_readBoolean); - dict_put(d, &flash_display_BlendMode, &flash_display_BlendMode); - dict_init2(&flash_display_BlendMode.members, &memberinfo_type, 8); - dict_init2(&flash_display_BlendMode.static_members, &memberinfo_type, 31); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_LAYER, &flash_display_BlendMode_LAYER); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_ERASE, &flash_display_BlendMode_ERASE); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_HARDLIGHT, &flash_display_BlendMode_HARDLIGHT); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_OVERLAY, &flash_display_BlendMode_OVERLAY); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_ALPHA, &flash_display_BlendMode_ALPHA); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_SUBTRACT, &flash_display_BlendMode_SUBTRACT); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_INVERT, &flash_display_BlendMode_INVERT); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_DIFFERENCE, &flash_display_BlendMode_DIFFERENCE); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_DARKEN, &flash_display_BlendMode_DARKEN); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_SHADER, &flash_display_BlendMode_SHADER); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_MULTIPLY, &flash_display_BlendMode_MULTIPLY); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_ADD, &flash_display_BlendMode_ADD); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_SCREEN, &flash_display_BlendMode_SCREEN); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_NORMAL, &flash_display_BlendMode_NORMAL); - dict_put(&flash_display_BlendMode.static_members, &flash_display_BlendMode_LIGHTEN, &flash_display_BlendMode_LIGHTEN); - dict_put(d, &flash_ui_Mouse, &flash_ui_Mouse); - dict_init2(&flash_ui_Mouse.members, &memberinfo_type, 8); - dict_init2(&flash_ui_Mouse.static_members, &memberinfo_type, 8); - dict_put(&flash_ui_Mouse.static_members, &flash_ui_Mouse_cursor, &flash_ui_Mouse_cursor); - dict_put(&flash_ui_Mouse.static_members, &flash_ui_Mouse_show, &flash_ui_Mouse_show); - dict_put(&flash_ui_Mouse.static_members, &flash_ui_Mouse_hide, &flash_ui_Mouse_hide); - dict_put(d, &flash_errors_InvalidSWFError, &flash_errors_InvalidSWFError); - dict_init2(&flash_errors_InvalidSWFError.members, &memberinfo_type, 8); - dict_init2(&flash_errors_InvalidSWFError.static_members, &memberinfo_type, 8); - dict_put(d, &flash_text_engine_RenderingMode, &flash_text_engine_RenderingMode); - dict_init2(&flash_text_engine_RenderingMode.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_RenderingMode.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_RenderingMode.static_members, &flash_text_engine_RenderingMode_NORMAL, &flash_text_engine_RenderingMode_NORMAL); - dict_put(&flash_text_engine_RenderingMode.static_members, &flash_text_engine_RenderingMode_CFF, &flash_text_engine_RenderingMode_CFF); - dict_put(d, &flash_display_GraphicsTrianglePath, &flash_display_GraphicsTrianglePath); - dict_init2(&flash_display_GraphicsTrianglePath.members, &memberinfo_type, 8); - dict_init2(&flash_display_GraphicsTrianglePath.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GraphicsTrianglePath.members, &flash_display_GraphicsTrianglePath_culling, &flash_display_GraphicsTrianglePath_culling); - dict_put(&flash_display_GraphicsTrianglePath.members, &flash_display_GraphicsTrianglePath_vertices, &flash_display_GraphicsTrianglePath_vertices); - dict_put(&flash_display_GraphicsTrianglePath.members, &flash_display_GraphicsTrianglePath_indices, &flash_display_GraphicsTrianglePath_indices); - dict_put(&flash_display_GraphicsTrianglePath.members, &flash_display_GraphicsTrianglePath_uvtData, &flash_display_GraphicsTrianglePath_uvtData); - dict_put(d, &flash_display_IGraphicsFill, &flash_display_IGraphicsFill); - dict_init2(&flash_display_IGraphicsFill.members, &memberinfo_type, 8); - dict_init2(&flash_display_IGraphicsFill.static_members, &memberinfo_type, 8); - dict_put(d, &flash_text_engine_TypographicCase, &flash_text_engine_TypographicCase); - dict_init2(&flash_text_engine_TypographicCase.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TypographicCase.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_UPPERCASE, &flash_text_engine_TypographicCase_UPPERCASE); - dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_DEFAULT, &flash_text_engine_TypographicCase_DEFAULT); - dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_LOWERCASE, &flash_text_engine_TypographicCase_LOWERCASE); - dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_SMALL_CAPS, &flash_text_engine_TypographicCase_SMALL_CAPS); - dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_TITLE, &flash_text_engine_TypographicCase_TITLE); - dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_CAPS, &flash_text_engine_TypographicCase_CAPS); - dict_put(&flash_text_engine_TypographicCase.static_members, &flash_text_engine_TypographicCase_CAPS_AND_SMALL_CAPS, &flash_text_engine_TypographicCase_CAPS_AND_SMALL_CAPS); - dict_put(d, &_XML, &_XML); - dict_init2(&_XML.members, &memberinfo_type, 63); - dict_init2(&_XML.static_members, &memberinfo_type, 15); - dict_put(&_XML.members, &_XML_normalize, &_XML_normalize); - dict_put(&_XML.members, &_XML_removeNamespace, &_XML_removeNamespace); - dict_put(&_XML.members, &_XML_prependChild, &_XML_prependChild); - dict_put(&_XML.members, &_XML_toXMLString, &_XML_toXMLString); - dict_put(&_XML.members, &_XML_text, &_XML_text); - dict_put(&_XML.members, &_XML_nodeKind, &_XML_nodeKind); - dict_put(&_XML.members, &_XML_copy, &_XML_copy); - dict_put(&_XML.members, &_XML_toString, &_XML_toString); - dict_put(&_XML.members, &_XML_childIndex, &_XML_childIndex); - dict_put(&_XML.members, &_XML_setName, &_XML_setName); - dict_put(&_XML.members, &_XML_setLocalName, &_XML_setLocalName); - dict_put(&_XML.members, &_XML_namespace, &_XML_namespace); - dict_put(&_XML.members, &_XML_insertChildBefore, &_XML_insertChildBefore); - dict_put(&_XML.members, &_XML_addNamespace, &_XML_addNamespace); - dict_put(&_XML.members, &_XML_propertyIsEnumerable, &_XML_propertyIsEnumerable); - dict_put(&_XML.members, &_XML_comments, &_XML_comments); - dict_put(&_XML.members, &_XML_attributes, &_XML_attributes); - dict_put(&_XML.members, &_XML_descendants, &_XML_descendants); - dict_put(&_XML.members, &_XML_replace, &_XML_replace); - dict_put(&_XML.members, &_XML_setNotification, &_XML_setNotification); - dict_put(&_XML.members, &_XML_children, &_XML_children); - dict_put(&_XML.members, &_XML_contains, &_XML_contains); - dict_put(&_XML.members, &_XML_hasSimpleContent, &_XML_hasSimpleContent); - dict_put(&_XML.members, &_XML_elements, &_XML_elements); - dict_put(&_XML.members, &_XML_hasComplexContent, &_XML_hasComplexContent); - dict_put(&_XML.members, &_XML_insertChildAfter, &_XML_insertChildAfter); - dict_put(&_XML.members, &_XML_parent, &_XML_parent); - dict_put(&_XML.members, &_XML_length, &_XML_length); - dict_put(&_XML.members, &_XML_processingInstructions, &_XML_processingInstructions); - dict_put(&_XML.members, &_XML_child, &_XML_child); - dict_put(&_XML.members, &_XML_appendChild, &_XML_appendChild); - dict_put(&_XML.members, &_XML_valueOf, &_XML_valueOf); - dict_put(&_XML.members, &_XML_localName, &_XML_localName); - dict_put(&_XML.members, &_XML_notification, &_XML_notification); - dict_put(&_XML.members, &_XML_inScopeNamespaces, &_XML_inScopeNamespaces); - dict_put(&_XML.members, &_XML_hasOwnProperty, &_XML_hasOwnProperty); - dict_put(&_XML.members, &_XML_namespaceDeclarations, &_XML_namespaceDeclarations); - dict_put(&_XML.members, &_XML_setNamespace, &_XML_setNamespace); - dict_put(&_XML.members, &_XML_name, &_XML_name); - dict_put(&_XML.members, &_XML_setChildren, &_XML_setChildren); - dict_put(&_XML.members, &_XML_attribute, &_XML_attribute); - dict_put(&_XML.static_members, &_XML_prettyPrinting, &_XML_prettyPrinting); - dict_put(&_XML.static_members, &_XML_setSettings, &_XML_setSettings); - dict_put(&_XML.static_members, &_XML_ignoreComments, &_XML_ignoreComments); - dict_put(&_XML.static_members, &_XML_prettyIndent, &_XML_prettyIndent); - dict_put(&_XML.static_members, &_XML_settings, &_XML_settings); - dict_put(&_XML.static_members, &_XML_ignoreProcessingInstructions, &_XML_ignoreProcessingInstructions); - dict_put(&_XML.static_members, &_XML_ignoreWhitespace, &_XML_ignoreWhitespace); - dict_put(&_XML.static_members, &_XML_defaultSettings, &_XML_defaultSettings); - dict_put(d, &flash_net_NetStreamInfo, &flash_net_NetStreamInfo); - dict_init2(&flash_net_NetStreamInfo.members, &memberinfo_type, 31); - dict_init2(&flash_net_NetStreamInfo.static_members, &memberinfo_type, 8); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_maxBytesPerSecond, &flash_net_NetStreamInfo_maxBytesPerSecond); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_dataBufferByteLength, &flash_net_NetStreamInfo_dataBufferByteLength); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_videoByteCount, &flash_net_NetStreamInfo_videoByteCount); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_videoBufferLength, &flash_net_NetStreamInfo_videoBufferLength); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioBufferByteLength, &flash_net_NetStreamInfo_audioBufferByteLength); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_dataBytesPerSecond, &flash_net_NetStreamInfo_dataBytesPerSecond); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_SRTT, &flash_net_NetStreamInfo_SRTT); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_droppedFrames, &flash_net_NetStreamInfo_droppedFrames); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioByteCount, &flash_net_NetStreamInfo_audioByteCount); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioBufferLength, &flash_net_NetStreamInfo_audioBufferLength); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_byteCount, &flash_net_NetStreamInfo_byteCount); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_toString, &flash_net_NetStreamInfo_toString); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_dataByteCount, &flash_net_NetStreamInfo_dataByteCount); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_videoBufferByteLength, &flash_net_NetStreamInfo_videoBufferByteLength); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_dataBufferLength, &flash_net_NetStreamInfo_dataBufferLength); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioLossRate, &flash_net_NetStreamInfo_audioLossRate); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_videoBytesPerSecond, &flash_net_NetStreamInfo_videoBytesPerSecond); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_currentBytesPerSecond, &flash_net_NetStreamInfo_currentBytesPerSecond); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_audioBytesPerSecond, &flash_net_NetStreamInfo_audioBytesPerSecond); - dict_put(&flash_net_NetStreamInfo.members, &flash_net_NetStreamInfo_playbackBytesPerSecond, &flash_net_NetStreamInfo_playbackBytesPerSecond); - dict_put(d, &flash_display_Stage, &flash_display_Stage); - dict_init2(&flash_display_Stage.members, &memberinfo_type, 63); - dict_init2(&flash_display_Stage.static_members, &memberinfo_type, 8); - dict_put(&flash_display_Stage.members, &flash_display_Stage_setChildIndex, &flash_display_Stage_setChildIndex); - dict_put(&flash_display_Stage.members, &flash_display_Stage_stageFocusRect, &flash_display_Stage_stageFocusRect); - dict_put(&flash_display_Stage.members, &flash_display_Stage_frameRate, &flash_display_Stage_frameRate); - dict_put(&flash_display_Stage.members, &flash_display_Stage_invalidate, &flash_display_Stage_invalidate); - dict_put(&flash_display_Stage.members, &flash_display_Stage_textSnapshot, &flash_display_Stage_textSnapshot); - dict_put(&flash_display_Stage.members, &flash_display_Stage_quality, &flash_display_Stage_quality); - dict_put(&flash_display_Stage.members, &flash_display_Stage_willTrigger, &flash_display_Stage_willTrigger); - dict_put(&flash_display_Stage.members, &flash_display_Stage_dispatchEvent, &flash_display_Stage_dispatchEvent); - dict_put(&flash_display_Stage.members, &flash_display_Stage_isFocusInaccessible, &flash_display_Stage_isFocusInaccessible); - dict_put(&flash_display_Stage.members, &flash_display_Stage_removeChildAt, &flash_display_Stage_removeChildAt); - dict_put(&flash_display_Stage.members, &flash_display_Stage_fullScreenWidth, &flash_display_Stage_fullScreenWidth); - dict_put(&flash_display_Stage.members, &flash_display_Stage_addChildAt, &flash_display_Stage_addChildAt); - dict_put(&flash_display_Stage.members, &flash_display_Stage_height, &flash_display_Stage_height); - dict_put(&flash_display_Stage.members, &flash_display_Stage_fullScreenSourceRect, &flash_display_Stage_fullScreenSourceRect); - dict_put(&flash_display_Stage.members, &flash_display_Stage_width, &flash_display_Stage_width); - dict_put(&flash_display_Stage.members, &flash_display_Stage_addChild, &flash_display_Stage_addChild); - dict_put(&flash_display_Stage.members, &flash_display_Stage_numChildren, &flash_display_Stage_numChildren); - dict_put(&flash_display_Stage.members, &flash_display_Stage_mouseChildren, &flash_display_Stage_mouseChildren); - dict_put(&flash_display_Stage.members, &flash_display_Stage_swapChildrenAt, &flash_display_Stage_swapChildrenAt); - dict_put(&flash_display_Stage.members, &flash_display_Stage_showDefaultContextMenu, &flash_display_Stage_showDefaultContextMenu); - dict_put(&flash_display_Stage.members, &flash_display_Stage_addEventListener, &flash_display_Stage_addEventListener); - dict_put(&flash_display_Stage.members, &flash_display_Stage_stageHeight, &flash_display_Stage_stageHeight); - dict_put(&flash_display_Stage.members, &flash_display_Stage_fullScreenHeight, &flash_display_Stage_fullScreenHeight); - dict_put(&flash_display_Stage.members, &flash_display_Stage_align, &flash_display_Stage_align); - dict_put(&flash_display_Stage.members, &flash_display_Stage_hasEventListener, &flash_display_Stage_hasEventListener); - dict_put(&flash_display_Stage.members, &flash_display_Stage_displayState, &flash_display_Stage_displayState); - dict_put(&flash_display_Stage.members, &flash_display_Stage_scaleMode, &flash_display_Stage_scaleMode); - dict_put(&flash_display_Stage.members, &flash_display_Stage_tabChildren, &flash_display_Stage_tabChildren); - dict_put(&flash_display_Stage.members, &flash_display_Stage_focus, &flash_display_Stage_focus); - dict_put(&flash_display_Stage.members, &flash_display_Stage_colorCorrection, &flash_display_Stage_colorCorrection); - dict_put(&flash_display_Stage.members, &flash_display_Stage_colorCorrectionSupport, &flash_display_Stage_colorCorrectionSupport); - dict_put(&flash_display_Stage.members, &flash_display_Stage_stageWidth, &flash_display_Stage_stageWidth); - dict_put(d, &flash_ui_ContextMenuItem, &flash_ui_ContextMenuItem); - dict_init2(&flash_ui_ContextMenuItem.members, &memberinfo_type, 8); - dict_init2(&flash_ui_ContextMenuItem.static_members, &memberinfo_type, 8); - dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_separatorBefore, &flash_ui_ContextMenuItem_separatorBefore); - dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_enabled, &flash_ui_ContextMenuItem_enabled); - dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_caption, &flash_ui_ContextMenuItem_caption); - dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_clone, &flash_ui_ContextMenuItem_clone); - dict_put(&flash_ui_ContextMenuItem.members, &flash_ui_ContextMenuItem_visible, &flash_ui_ContextMenuItem_visible); - dict_put(d, &flash_trace_Trace, &flash_trace_Trace); - dict_init2(&flash_trace_Trace.members, &memberinfo_type, 8); - dict_init2(&flash_trace_Trace.static_members, &memberinfo_type, 15); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_METHODS_AND_LINES_WITH_ARGS, &flash_trace_Trace_METHODS_AND_LINES_WITH_ARGS); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_FILE, &flash_trace_Trace_FILE); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_METHODS_WITH_ARGS, &flash_trace_Trace_METHODS_WITH_ARGS); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_OFF, &flash_trace_Trace_OFF); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_METHODS_AND_LINES, &flash_trace_Trace_METHODS_AND_LINES); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_LISTENER, &flash_trace_Trace_LISTENER); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_getLevel, &flash_trace_Trace_getLevel); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_setLevel, &flash_trace_Trace_setLevel); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_setListener, &flash_trace_Trace_setListener); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_getListener, &flash_trace_Trace_getListener); - dict_put(&flash_trace_Trace.static_members, &flash_trace_Trace_METHODS, &flash_trace_Trace_METHODS); - dict_put(d, &flash_events_TimerEvent, &flash_events_TimerEvent); - dict_init2(&flash_events_TimerEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_TimerEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_TimerEvent.members, &flash_events_TimerEvent_toString, &flash_events_TimerEvent_toString); - dict_put(&flash_events_TimerEvent.members, &flash_events_TimerEvent_clone, &flash_events_TimerEvent_clone); - dict_put(&flash_events_TimerEvent.members, &flash_events_TimerEvent_updateAfterEvent, &flash_events_TimerEvent_updateAfterEvent); - dict_put(&flash_events_TimerEvent.static_members, &flash_events_TimerEvent_TIMER_COMPLETE, &flash_events_TimerEvent_TIMER_COMPLETE); - dict_put(&flash_events_TimerEvent.static_members, &flash_events_TimerEvent_TIMER, &flash_events_TimerEvent_TIMER); - dict_put(d, &flash_events_SampleDataEvent, &flash_events_SampleDataEvent); - dict_init2(&flash_events_SampleDataEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_SampleDataEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_SampleDataEvent.members, &flash_events_SampleDataEvent_toString, &flash_events_SampleDataEvent_toString); - dict_put(&flash_events_SampleDataEvent.members, &flash_events_SampleDataEvent_position, &flash_events_SampleDataEvent_position); - dict_put(&flash_events_SampleDataEvent.members, &flash_events_SampleDataEvent_clone, &flash_events_SampleDataEvent_clone); - dict_put(&flash_events_SampleDataEvent.members, &flash_events_SampleDataEvent_data, &flash_events_SampleDataEvent_data); - dict_put(&flash_events_SampleDataEvent.static_members, &flash_events_SampleDataEvent_SAMPLE_DATA, &flash_events_SampleDataEvent_SAMPLE_DATA); - dict_put(d, &flash_display_ShaderPrecision, &flash_display_ShaderPrecision); - dict_init2(&flash_display_ShaderPrecision.members, &memberinfo_type, 8); - dict_init2(&flash_display_ShaderPrecision.static_members, &memberinfo_type, 8); - dict_put(&flash_display_ShaderPrecision.static_members, &flash_display_ShaderPrecision_FULL, &flash_display_ShaderPrecision_FULL); - dict_put(&flash_display_ShaderPrecision.static_members, &flash_display_ShaderPrecision_FAST, &flash_display_ShaderPrecision_FAST); - dict_put(d, &flash_net_FileReference, &flash_net_FileReference); - dict_init2(&flash_net_FileReference.members, &memberinfo_type, 31); - dict_init2(&flash_net_FileReference.static_members, &memberinfo_type, 8); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_type, &flash_net_FileReference_type); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_browse, &flash_net_FileReference_browse); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_creationDate, &flash_net_FileReference_creationDate); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_upload, &flash_net_FileReference_upload); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_download, &flash_net_FileReference_download); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_save, &flash_net_FileReference_save); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_cancel, &flash_net_FileReference_cancel); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_creator, &flash_net_FileReference_creator); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_data, &flash_net_FileReference_data); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_size, &flash_net_FileReference_size); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_name, &flash_net_FileReference_name); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_load, &flash_net_FileReference_load); - dict_put(&flash_net_FileReference.members, &flash_net_FileReference_modificationDate, &flash_net_FileReference_modificationDate); - dict_put(d, &_DefinitionError, &_DefinitionError); - dict_init2(&_DefinitionError.members, &memberinfo_type, 8); - dict_init2(&_DefinitionError.static_members, &memberinfo_type, 8); - dict_put(&_DefinitionError.static_members, &_DefinitionError_length, &_DefinitionError_length); - dict_put(d, &flash_events_EventDispatcher, &flash_events_EventDispatcher); - dict_init2(&flash_events_EventDispatcher.members, &memberinfo_type, 8); - dict_init2(&flash_events_EventDispatcher.static_members, &memberinfo_type, 8); - dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_willTrigger, &flash_events_EventDispatcher_willTrigger); - dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_toString, &flash_events_EventDispatcher_toString); - dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_removeEventListener, &flash_events_EventDispatcher_removeEventListener); - dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_hasEventListener, &flash_events_EventDispatcher_hasEventListener); - dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_addEventListener, &flash_events_EventDispatcher_addEventListener); - dict_put(&flash_events_EventDispatcher.members, &flash_events_EventDispatcher_dispatchEvent, &flash_events_EventDispatcher_dispatchEvent); - dict_put(d, &flash_net_SharedObjectFlushStatus, &flash_net_SharedObjectFlushStatus); - dict_init2(&flash_net_SharedObjectFlushStatus.members, &memberinfo_type, 8); - dict_init2(&flash_net_SharedObjectFlushStatus.static_members, &memberinfo_type, 8); - dict_put(&flash_net_SharedObjectFlushStatus.static_members, &flash_net_SharedObjectFlushStatus_FLUSHED, &flash_net_SharedObjectFlushStatus_FLUSHED); - dict_put(&flash_net_SharedObjectFlushStatus.static_members, &flash_net_SharedObjectFlushStatus_PENDING, &flash_net_SharedObjectFlushStatus_PENDING); - dict_put(d, &flash_text_TextLineMetrics, &flash_text_TextLineMetrics); - dict_init2(&flash_text_TextLineMetrics.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextLineMetrics.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_descent, &flash_text_TextLineMetrics_descent); - dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_width, &flash_text_TextLineMetrics_width); - dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_ascent, &flash_text_TextLineMetrics_ascent); - dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_leading, &flash_text_TextLineMetrics_leading); - dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_height, &flash_text_TextLineMetrics_height); - dict_put(&flash_text_TextLineMetrics.members, &flash_text_TextLineMetrics_x, &flash_text_TextLineMetrics_x); - dict_put(d, &flash_text_AntiAliasType, &flash_text_AntiAliasType); - dict_init2(&flash_text_AntiAliasType.members, &memberinfo_type, 8); - dict_init2(&flash_text_AntiAliasType.static_members, &memberinfo_type, 8); - dict_put(&flash_text_AntiAliasType.static_members, &flash_text_AntiAliasType_NORMAL, &flash_text_AntiAliasType_NORMAL); - dict_put(&flash_text_AntiAliasType.static_members, &flash_text_AntiAliasType_ADVANCED, &flash_text_AntiAliasType_ADVANCED); - dict_put(d, &flash_system_SecurityDomain, &flash_system_SecurityDomain); - dict_init2(&flash_system_SecurityDomain.members, &memberinfo_type, 8); - dict_init2(&flash_system_SecurityDomain.static_members, &memberinfo_type, 8); - dict_put(&flash_system_SecurityDomain.static_members, &flash_system_SecurityDomain_currentDomain, &flash_system_SecurityDomain_currentDomain); - dict_put(d, &flash_text_Font, &flash_text_Font); - dict_init2(&flash_text_Font.members, &memberinfo_type, 8); - dict_init2(&flash_text_Font.static_members, &memberinfo_type, 8); - dict_put(&flash_text_Font.members, &flash_text_Font_hasGlyphs, &flash_text_Font_hasGlyphs); - dict_put(&flash_text_Font.members, &flash_text_Font_fontName, &flash_text_Font_fontName); - dict_put(&flash_text_Font.members, &flash_text_Font_fontStyle, &flash_text_Font_fontStyle); - dict_put(&flash_text_Font.members, &flash_text_Font_fontType, &flash_text_Font_fontType); - dict_put(&flash_text_Font.static_members, &flash_text_Font_enumerateFonts, &flash_text_Font_enumerateFonts); - dict_put(&flash_text_Font.static_members, &flash_text_Font_registerFont, &flash_text_Font_registerFont); - dict_put(d, &_RegExp, &_RegExp); - dict_init2(&_RegExp.members, &memberinfo_type, 8); - dict_init2(&_RegExp.static_members, &memberinfo_type, 8); - dict_put(&_RegExp.members, &_RegExp_source, &_RegExp_source); - dict_put(&_RegExp.members, &_RegExp_test, &_RegExp_test); - dict_put(&_RegExp.members, &_RegExp_global, &_RegExp_global); - dict_put(&_RegExp.members, &_RegExp_exec, &_RegExp_exec); - dict_put(&_RegExp.members, &_RegExp_ignoreCase, &_RegExp_ignoreCase); - dict_put(&_RegExp.members, &_RegExp_dotall, &_RegExp_dotall); - dict_put(&_RegExp.members, &_RegExp_lastIndex, &_RegExp_lastIndex); - dict_put(&_RegExp.members, &_RegExp_extended, &_RegExp_extended); - dict_put(&_RegExp.members, &_RegExp_multiline, &_RegExp_multiline); - dict_put(&_RegExp.static_members, &_RegExp_length, &_RegExp_length); - dict_put(d, &flash_accessibility_AccessibilityProperties, &flash_accessibility_AccessibilityProperties); - dict_init2(&flash_accessibility_AccessibilityProperties.members, &memberinfo_type, 8); - dict_init2(&flash_accessibility_AccessibilityProperties.static_members, &memberinfo_type, 8); - dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_forceSimple, &flash_accessibility_AccessibilityProperties_forceSimple); - dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_noAutoLabeling, &flash_accessibility_AccessibilityProperties_noAutoLabeling); - dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_description, &flash_accessibility_AccessibilityProperties_description); - dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_name, &flash_accessibility_AccessibilityProperties_name); - dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_shortcut, &flash_accessibility_AccessibilityProperties_shortcut); - dict_put(&flash_accessibility_AccessibilityProperties.members, &flash_accessibility_AccessibilityProperties_silent, &flash_accessibility_AccessibilityProperties_silent); - dict_put(d, &flash_ui_ContextMenu, &flash_ui_ContextMenu); - dict_init2(&flash_ui_ContextMenu.members, &memberinfo_type, 8); - dict_init2(&flash_ui_ContextMenu.static_members, &memberinfo_type, 8); - dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_hideBuiltInItems, &flash_ui_ContextMenu_hideBuiltInItems); - dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_clipboardItems, &flash_ui_ContextMenu_clipboardItems); - dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_builtInItems, &flash_ui_ContextMenu_builtInItems); - dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_customItems, &flash_ui_ContextMenu_customItems); - dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_clone, &flash_ui_ContextMenu_clone); - dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_link, &flash_ui_ContextMenu_link); - dict_put(&flash_ui_ContextMenu.members, &flash_ui_ContextMenu_clipboardMenu, &flash_ui_ContextMenu_clipboardMenu); - dict_put(d, &flash_text_TextFieldAutoSize, &flash_text_TextFieldAutoSize); - dict_init2(&flash_text_TextFieldAutoSize.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextFieldAutoSize.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextFieldAutoSize.static_members, &flash_text_TextFieldAutoSize_LEFT, &flash_text_TextFieldAutoSize_LEFT); - dict_put(&flash_text_TextFieldAutoSize.static_members, &flash_text_TextFieldAutoSize_RIGHT, &flash_text_TextFieldAutoSize_RIGHT); - dict_put(&flash_text_TextFieldAutoSize.static_members, &flash_text_TextFieldAutoSize_CENTER, &flash_text_TextFieldAutoSize_CENTER); - dict_put(&flash_text_TextFieldAutoSize.static_members, &flash_text_TextFieldAutoSize_NONE, &flash_text_TextFieldAutoSize_NONE); - dict_put(d, &_Math, &_Math); - dict_init2(&_Math.members, &memberinfo_type, 8); - dict_init2(&_Math.static_members, &memberinfo_type, 63); - dict_put(&_Math.static_members, &_Math_ceil, &_Math_ceil); - dict_put(&_Math.static_members, &_Math_SQRT2, &_Math_SQRT2); - dict_put(&_Math.static_members, &_Math_cos, &_Math_cos); - dict_put(&_Math.static_members, &_Math_abs, &_Math_abs); - dict_put(&_Math.static_members, &_Math_PI, &_Math_PI); - dict_put(&_Math.static_members, &_Math_E, &_Math_E); - dict_put(&_Math.static_members, &_Math_round, &_Math_round); - dict_put(&_Math.static_members, &_Math_LN10, &_Math_LN10); - dict_put(&_Math.static_members, &_Math_SQRT1_2, &_Math_SQRT1_2); - dict_put(&_Math.static_members, &_Math_log, &_Math_log); - dict_put(&_Math.static_members, &_Math_LOG10E, &_Math_LOG10E); - dict_put(&_Math.static_members, &_Math_random, &_Math_random); - dict_put(&_Math.static_members, &_Math_acos, &_Math_acos); - dict_put(&_Math.static_members, &_Math_tan, &_Math_tan); - dict_put(&_Math.static_members, &_Math_asin, &_Math_asin); - dict_put(&_Math.static_members, &_Math_exp, &_Math_exp); - dict_put(&_Math.static_members, &_Math_atan2, &_Math_atan2); - dict_put(&_Math.static_members, &_Math_pow, &_Math_pow); - dict_put(&_Math.static_members, &_Math_min, &_Math_min); - dict_put(&_Math.static_members, &_Math_LN2, &_Math_LN2); - dict_put(&_Math.static_members, &_Math_sin, &_Math_sin); - dict_put(&_Math.static_members, &_Math_sqrt, &_Math_sqrt); - dict_put(&_Math.static_members, &_Math_LOG2E, &_Math_LOG2E); - dict_put(&_Math.static_members, &_Math_max, &_Math_max); - dict_put(&_Math.static_members, &_Math_atan, &_Math_atan); - dict_put(&_Math.static_members, &_Math_floor, &_Math_floor); - dict_put(d, &flash_display_ColorCorrectionSupport, &flash_display_ColorCorrectionSupport); - dict_init2(&flash_display_ColorCorrectionSupport.members, &memberinfo_type, 8); - dict_init2(&flash_display_ColorCorrectionSupport.static_members, &memberinfo_type, 8); - dict_put(&flash_display_ColorCorrectionSupport.static_members, &flash_display_ColorCorrectionSupport_UNSUPPORTED, &flash_display_ColorCorrectionSupport_UNSUPPORTED); - dict_put(&flash_display_ColorCorrectionSupport.static_members, &flash_display_ColorCorrectionSupport_DEFAULT_ON, &flash_display_ColorCorrectionSupport_DEFAULT_ON); - dict_put(&flash_display_ColorCorrectionSupport.static_members, &flash_display_ColorCorrectionSupport_DEFAULT_OFF, &flash_display_ColorCorrectionSupport_DEFAULT_OFF); - dict_put(d, &flash_errors_IOError, &flash_errors_IOError); - dict_init2(&flash_errors_IOError.members, &memberinfo_type, 8); - dict_init2(&flash_errors_IOError.static_members, &memberinfo_type, 8); - dict_put(d, &_trace, &_trace); - dict_put(d, &flash_ui_ContextMenuBuiltInItems, &flash_ui_ContextMenuBuiltInItems); - dict_init2(&flash_ui_ContextMenuBuiltInItems.members, &memberinfo_type, 8); - dict_init2(&flash_ui_ContextMenuBuiltInItems.static_members, &memberinfo_type, 8); - dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_zoom, &flash_ui_ContextMenuBuiltInItems_zoom); - dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_save, &flash_ui_ContextMenuBuiltInItems_save); - dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_loop, &flash_ui_ContextMenuBuiltInItems_loop); - dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_print, &flash_ui_ContextMenuBuiltInItems_print); - dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_forwardAndBack, &flash_ui_ContextMenuBuiltInItems_forwardAndBack); - dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_rewind, &flash_ui_ContextMenuBuiltInItems_rewind); - dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_clone, &flash_ui_ContextMenuBuiltInItems_clone); - dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_quality, &flash_ui_ContextMenuBuiltInItems_quality); - dict_put(&flash_ui_ContextMenuBuiltInItems.members, &flash_ui_ContextMenuBuiltInItems_play, &flash_ui_ContextMenuBuiltInItems_play); - dict_put(d, &flash_net_FileReferenceList, &flash_net_FileReferenceList); - dict_init2(&flash_net_FileReferenceList.members, &memberinfo_type, 8); - dict_init2(&flash_net_FileReferenceList.static_members, &memberinfo_type, 8); - dict_put(&flash_net_FileReferenceList.members, &flash_net_FileReferenceList_fileList, &flash_net_FileReferenceList_fileList); - dict_put(&flash_net_FileReferenceList.members, &flash_net_FileReferenceList_browse, &flash_net_FileReferenceList_browse); - dict_put(d, &flash_display_TriangleCulling, &flash_display_TriangleCulling); - dict_init2(&flash_display_TriangleCulling.members, &memberinfo_type, 8); - dict_init2(&flash_display_TriangleCulling.static_members, &memberinfo_type, 8); - dict_put(&flash_display_TriangleCulling.static_members, &flash_display_TriangleCulling_POSITIVE, &flash_display_TriangleCulling_POSITIVE); - dict_put(&flash_display_TriangleCulling.static_members, &flash_display_TriangleCulling_NEGATIVE, &flash_display_TriangleCulling_NEGATIVE); - dict_put(&flash_display_TriangleCulling.static_members, &flash_display_TriangleCulling_NONE, &flash_display_TriangleCulling_NONE); - dict_put(d, &flash_media_SoundMixer, &flash_media_SoundMixer); - dict_init2(&flash_media_SoundMixer.members, &memberinfo_type, 8); - dict_init2(&flash_media_SoundMixer.static_members, &memberinfo_type, 8); - dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_computeSpectrum, &flash_media_SoundMixer_computeSpectrum); - dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_areSoundsInaccessible, &flash_media_SoundMixer_areSoundsInaccessible); - dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_soundTransform, &flash_media_SoundMixer_soundTransform); - dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_bufferTime, &flash_media_SoundMixer_bufferTime); - dict_put(&flash_media_SoundMixer.static_members, &flash_media_SoundMixer_stopAll, &flash_media_SoundMixer_stopAll); - dict_put(d, &adobe_utils_XMLUI, &adobe_utils_XMLUI); - dict_init2(&adobe_utils_XMLUI.members, &memberinfo_type, 8); - dict_init2(&adobe_utils_XMLUI.static_members, &memberinfo_type, 8); - dict_put(&adobe_utils_XMLUI.static_members, &adobe_utils_XMLUI_cancel, &adobe_utils_XMLUI_cancel); - dict_put(&adobe_utils_XMLUI.static_members, &adobe_utils_XMLUI_setProperty, &adobe_utils_XMLUI_setProperty); - dict_put(&adobe_utils_XMLUI.static_members, &adobe_utils_XMLUI_getProperty, &adobe_utils_XMLUI_getProperty); - dict_put(&adobe_utils_XMLUI.static_members, &adobe_utils_XMLUI_accept, &adobe_utils_XMLUI_accept); - dict_put(d, &_escape, &_escape); - dict_put(d, &flash_utils_setInterval, &flash_utils_setInterval); - dict_put(d, &flash_events_StatusEvent, &flash_events_StatusEvent); - dict_init2(&flash_events_StatusEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_StatusEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_StatusEvent.members, &flash_events_StatusEvent_toString, &flash_events_StatusEvent_toString); - dict_put(&flash_events_StatusEvent.members, &flash_events_StatusEvent_code, &flash_events_StatusEvent_code); - dict_put(&flash_events_StatusEvent.members, &flash_events_StatusEvent_clone, &flash_events_StatusEvent_clone); - dict_put(&flash_events_StatusEvent.members, &flash_events_StatusEvent_level, &flash_events_StatusEvent_level); - dict_put(&flash_events_StatusEvent.static_members, &flash_events_StatusEvent_STATUS, &flash_events_StatusEvent_STATUS); - dict_put(d, &flash_display_IGraphicsPath, &flash_display_IGraphicsPath); - dict_init2(&flash_display_IGraphicsPath.members, &memberinfo_type, 8); - dict_init2(&flash_display_IGraphicsPath.static_members, &memberinfo_type, 8); - dict_put(d, &flash_events_ShaderEvent, &flash_events_ShaderEvent); - dict_init2(&flash_events_ShaderEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_ShaderEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_vector, &flash_events_ShaderEvent_vector); - dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_toString, &flash_events_ShaderEvent_toString); - dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_bitmapData, &flash_events_ShaderEvent_bitmapData); - dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_clone, &flash_events_ShaderEvent_clone); - dict_put(&flash_events_ShaderEvent.members, &flash_events_ShaderEvent_byteArray, &flash_events_ShaderEvent_byteArray); - dict_put(&flash_events_ShaderEvent.static_members, &flash_events_ShaderEvent_COMPLETE, &flash_events_ShaderEvent_COMPLETE); - dict_put(d, &flash_display_Shader, &flash_display_Shader); - dict_init2(&flash_display_Shader.members, &memberinfo_type, 8); - dict_init2(&flash_display_Shader.static_members, &memberinfo_type, 8); - dict_put(&flash_display_Shader.members, &flash_display_Shader_precisionHint, &flash_display_Shader_precisionHint); - dict_put(&flash_display_Shader.members, &flash_display_Shader_data, &flash_display_Shader_data); - dict_put(d, &flash_errors_StackOverflowError, &flash_errors_StackOverflowError); - dict_init2(&flash_errors_StackOverflowError.members, &memberinfo_type, 8); - dict_init2(&flash_errors_StackOverflowError.static_members, &memberinfo_type, 8); - dict_put(d, &flash_sampler_getInvocationCount, &flash_sampler_getInvocationCount); - dict_put(d, &flash_text_engine_Kerning, &flash_text_engine_Kerning); - dict_init2(&flash_text_engine_Kerning.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_Kerning.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_Kerning.static_members, &flash_text_engine_Kerning_AUTO, &flash_text_engine_Kerning_AUTO); - dict_put(&flash_text_engine_Kerning.static_members, &flash_text_engine_Kerning_OFF, &flash_text_engine_Kerning_OFF); - dict_put(&flash_text_engine_Kerning.static_members, &flash_text_engine_Kerning_ON, &flash_text_engine_Kerning_ON); - dict_put(d, &flash_text_CSMSettings, &flash_text_CSMSettings); - dict_init2(&flash_text_CSMSettings.members, &memberinfo_type, 8); - dict_init2(&flash_text_CSMSettings.static_members, &memberinfo_type, 8); - dict_put(&flash_text_CSMSettings.members, &flash_text_CSMSettings_fontSize, &flash_text_CSMSettings_fontSize); - dict_put(&flash_text_CSMSettings.members, &flash_text_CSMSettings_outsideCutoff, &flash_text_CSMSettings_outsideCutoff); - dict_put(&flash_text_CSMSettings.members, &flash_text_CSMSettings_insideCutoff, &flash_text_CSMSettings_insideCutoff); - dict_put(d, &_RangeError, &_RangeError); - dict_init2(&_RangeError.members, &memberinfo_type, 8); - dict_init2(&_RangeError.static_members, &memberinfo_type, 8); - dict_put(&_RangeError.static_members, &_RangeError_length, &_RangeError_length); - dict_put(d, &_Number, &_Number); - dict_init2(&_Number.members, &memberinfo_type, 8); - dict_init2(&_Number.static_members, &memberinfo_type, 8); - dict_put(&_Number.members, &_Number_valueOf, &_Number_valueOf); - dict_put(&_Number.members, &_Number_toString, &_Number_toString); - dict_put(&_Number.members, &_Number_toExponential, &_Number_toExponential); - dict_put(&_Number.members, &_Number_toFixed, &_Number_toFixed); - dict_put(&_Number.members, &_Number_toPrecision, &_Number_toPrecision); - dict_put(&_Number.static_members, &_Number_MAX_VALUE, &_Number_MAX_VALUE); - dict_put(&_Number.static_members, &_Number_length, &_Number_length); - dict_put(&_Number.static_members, &_Number_MIN_VALUE, &_Number_MIN_VALUE); - dict_put(&_Number.static_members, &_Number_NaN, &_Number_NaN); - dict_put(&_Number.static_members, &_Number_POSITIVE_INFINITY, &_Number_POSITIVE_INFINITY); - dict_put(&_Number.static_members, &_Number_NEGATIVE_INFINITY, &_Number_NEGATIVE_INFINITY); - dict_put(d, &flash_display_Graphics, &flash_display_Graphics); - dict_init2(&flash_display_Graphics.members, &memberinfo_type, 63); - dict_init2(&flash_display_Graphics.static_members, &memberinfo_type, 8); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawPath, &flash_display_Graphics_drawPath); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawEllipse, &flash_display_Graphics_drawEllipse); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawRoundRectComplex, &flash_display_Graphics_drawRoundRectComplex); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_moveTo, &flash_display_Graphics_moveTo); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineShaderStyle, &flash_display_Graphics_lineShaderStyle); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_beginFill, &flash_display_Graphics_beginFill); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_beginGradientFill, &flash_display_Graphics_beginGradientFill); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawGraphicsData, &flash_display_Graphics_drawGraphicsData); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineGradientStyle, &flash_display_Graphics_lineGradientStyle); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawRoundRect, &flash_display_Graphics_drawRoundRect); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_beginBitmapFill, &flash_display_Graphics_beginBitmapFill); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineStyle, &flash_display_Graphics_lineStyle); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineTo, &flash_display_Graphics_lineTo); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_endFill, &flash_display_Graphics_endFill); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_copyFrom, &flash_display_Graphics_copyFrom); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_lineBitmapStyle, &flash_display_Graphics_lineBitmapStyle); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_curveTo, &flash_display_Graphics_curveTo); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_clear, &flash_display_Graphics_clear); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawCircle, &flash_display_Graphics_drawCircle); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_beginShaderFill, &flash_display_Graphics_beginShaderFill); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawTriangles, &flash_display_Graphics_drawTriangles); - dict_put(&flash_display_Graphics.members, &flash_display_Graphics_drawRect, &flash_display_Graphics_drawRect); - dict_put(d, &_SyntaxError, &_SyntaxError); - dict_init2(&_SyntaxError.members, &memberinfo_type, 8); - dict_init2(&_SyntaxError.static_members, &memberinfo_type, 8); - dict_put(&_SyntaxError.static_members, &_SyntaxError_length, &_SyntaxError_length); - dict_put(d, &flash_sampler_NewObjectSample, &flash_sampler_NewObjectSample); - dict_init2(&flash_sampler_NewObjectSample.members, &memberinfo_type, 8); - dict_init2(&flash_sampler_NewObjectSample.static_members, &memberinfo_type, 8); - dict_put(&flash_sampler_NewObjectSample.members, &flash_sampler_NewObjectSample_type, &flash_sampler_NewObjectSample_type); - dict_put(&flash_sampler_NewObjectSample.members, &flash_sampler_NewObjectSample_object, &flash_sampler_NewObjectSample_object); - dict_put(&flash_sampler_NewObjectSample.members, &flash_sampler_NewObjectSample_id, &flash_sampler_NewObjectSample_id); - dict_put(d, &flash_net_FileFilter, &flash_net_FileFilter); - dict_init2(&flash_net_FileFilter.members, &memberinfo_type, 8); - dict_init2(&flash_net_FileFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_net_FileFilter.members, &flash_net_FileFilter_extension, &flash_net_FileFilter_extension); - dict_put(&flash_net_FileFilter.members, &flash_net_FileFilter_description, &flash_net_FileFilter_description); - dict_put(&flash_net_FileFilter.members, &flash_net_FileFilter_macType, &flash_net_FileFilter_macType); - dict_put(d, &flash_display_BitmapDataChannel, &flash_display_BitmapDataChannel); - dict_init2(&flash_display_BitmapDataChannel.members, &memberinfo_type, 8); - dict_init2(&flash_display_BitmapDataChannel.static_members, &memberinfo_type, 8); - dict_put(&flash_display_BitmapDataChannel.static_members, &flash_display_BitmapDataChannel_BLUE, &flash_display_BitmapDataChannel_BLUE); - dict_put(&flash_display_BitmapDataChannel.static_members, &flash_display_BitmapDataChannel_GREEN, &flash_display_BitmapDataChannel_GREEN); - dict_put(&flash_display_BitmapDataChannel.static_members, &flash_display_BitmapDataChannel_ALPHA, &flash_display_BitmapDataChannel_ALPHA); - dict_put(&flash_display_BitmapDataChannel.static_members, &flash_display_BitmapDataChannel_RED, &flash_display_BitmapDataChannel_RED); - dict_put(d, &flash_utils_clearInterval, &flash_utils_clearInterval); - dict_put(d, &flash_text_engine_ContentElement, &flash_text_engine_ContentElement); - dict_init2(&flash_text_engine_ContentElement.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_ContentElement.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_eventMirror, &flash_text_engine_ContentElement_eventMirror); - dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_groupElement, &flash_text_engine_ContentElement_groupElement); - dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_textRotation, &flash_text_engine_ContentElement_textRotation); - dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_text, &flash_text_engine_ContentElement_text); - dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_userData, &flash_text_engine_ContentElement_userData); - dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_elementFormat, &flash_text_engine_ContentElement_elementFormat); - dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_textBlock, &flash_text_engine_ContentElement_textBlock); - dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_rawText, &flash_text_engine_ContentElement_rawText); - dict_put(&flash_text_engine_ContentElement.members, &flash_text_engine_ContentElement_textBlockBeginIndex, &flash_text_engine_ContentElement_textBlockBeginIndex); - dict_put(&flash_text_engine_ContentElement.static_members, &flash_text_engine_ContentElement_GRAPHIC_ELEMENT, &flash_text_engine_ContentElement_GRAPHIC_ELEMENT); - dict_put(d, &flash_utils_Endian, &flash_utils_Endian); - dict_init2(&flash_utils_Endian.members, &memberinfo_type, 8); - dict_init2(&flash_utils_Endian.static_members, &memberinfo_type, 8); - dict_put(&flash_utils_Endian.static_members, &flash_utils_Endian_LITTLE_ENDIAN, &flash_utils_Endian_LITTLE_ENDIAN); - dict_put(&flash_utils_Endian.static_members, &flash_utils_Endian_BIG_ENDIAN, &flash_utils_Endian_BIG_ENDIAN); - dict_put(d, &flash_net_navigateToURL, &flash_net_navigateToURL); - dict_put(d, &flash_events_ProgressEvent, &flash_events_ProgressEvent); - dict_init2(&flash_events_ProgressEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_ProgressEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_ProgressEvent.members, &flash_events_ProgressEvent_bytesLoaded, &flash_events_ProgressEvent_bytesLoaded); - dict_put(&flash_events_ProgressEvent.members, &flash_events_ProgressEvent_toString, &flash_events_ProgressEvent_toString); - dict_put(&flash_events_ProgressEvent.members, &flash_events_ProgressEvent_bytesTotal, &flash_events_ProgressEvent_bytesTotal); - dict_put(&flash_events_ProgressEvent.members, &flash_events_ProgressEvent_clone, &flash_events_ProgressEvent_clone); - dict_put(&flash_events_ProgressEvent.static_members, &flash_events_ProgressEvent_PROGRESS, &flash_events_ProgressEvent_PROGRESS); - dict_put(&flash_events_ProgressEvent.static_members, &flash_events_ProgressEvent_SOCKET_DATA, &flash_events_ProgressEvent_SOCKET_DATA); - dict_put(d, &flash_media_Sound, &flash_media_Sound); - dict_init2(&flash_media_Sound.members, &memberinfo_type, 15); - dict_init2(&flash_media_Sound.static_members, &memberinfo_type, 8); - dict_put(&flash_media_Sound.members, &flash_media_Sound_extract, &flash_media_Sound_extract); - dict_put(&flash_media_Sound.members, &flash_media_Sound_bytesLoaded, &flash_media_Sound_bytesLoaded); - dict_put(&flash_media_Sound.members, &flash_media_Sound_id3, &flash_media_Sound_id3); - dict_put(&flash_media_Sound.members, &flash_media_Sound_play, &flash_media_Sound_play); - dict_put(&flash_media_Sound.members, &flash_media_Sound_url, &flash_media_Sound_url); - dict_put(&flash_media_Sound.members, &flash_media_Sound_isBuffering, &flash_media_Sound_isBuffering); - dict_put(&flash_media_Sound.members, &flash_media_Sound_load, &flash_media_Sound_load); - dict_put(&flash_media_Sound.members, &flash_media_Sound_bytesTotal, &flash_media_Sound_bytesTotal); - dict_put(&flash_media_Sound.members, &flash_media_Sound_length, &flash_media_Sound_length); - dict_put(&flash_media_Sound.members, &flash_media_Sound_close, &flash_media_Sound_close); - dict_put(d, &flash_text_TextExtent, &flash_text_TextExtent); - dict_init2(&flash_text_TextExtent.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextExtent.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_descent, &flash_text_TextExtent_descent); - dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_width, &flash_text_TextExtent_width); - dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_ascent, &flash_text_TextExtent_ascent); - dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_textFieldHeight, &flash_text_TextExtent_textFieldHeight); - dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_textFieldWidth, &flash_text_TextExtent_textFieldWidth); - dict_put(&flash_text_TextExtent.members, &flash_text_TextExtent_height, &flash_text_TextExtent_height); - dict_put(d, &flash_text_FontStyle, &flash_text_FontStyle); - dict_init2(&flash_text_FontStyle.members, &memberinfo_type, 8); - dict_init2(&flash_text_FontStyle.static_members, &memberinfo_type, 8); - dict_put(&flash_text_FontStyle.static_members, &flash_text_FontStyle_REGULAR, &flash_text_FontStyle_REGULAR); - dict_put(&flash_text_FontStyle.static_members, &flash_text_FontStyle_BOLD, &flash_text_FontStyle_BOLD); - dict_put(&flash_text_FontStyle.static_members, &flash_text_FontStyle_BOLD_ITALIC, &flash_text_FontStyle_BOLD_ITALIC); - dict_put(&flash_text_FontStyle.static_members, &flash_text_FontStyle_ITALIC, &flash_text_FontStyle_ITALIC); - dict_put(d, &flash_text_engine_TextLineMirrorRegion, &flash_text_engine_TextLineMirrorRegion); - dict_init2(&flash_text_engine_TextLineMirrorRegion.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TextLineMirrorRegion.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_mirror, &flash_text_engine_TextLineMirrorRegion_mirror); - dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_previousRegion, &flash_text_engine_TextLineMirrorRegion_previousRegion); - dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_bounds, &flash_text_engine_TextLineMirrorRegion_bounds); - dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_nextRegion, &flash_text_engine_TextLineMirrorRegion_nextRegion); - dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_element, &flash_text_engine_TextLineMirrorRegion_element); - dict_put(&flash_text_engine_TextLineMirrorRegion.members, &flash_text_engine_TextLineMirrorRegion_textLine, &flash_text_engine_TextLineMirrorRegion_textLine); - dict_put(d, &flash_geom_Vector3D, &flash_geom_Vector3D); - dict_init2(&flash_geom_Vector3D.members, &memberinfo_type, 31); - dict_init2(&flash_geom_Vector3D.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_subtract, &flash_geom_Vector3D_subtract); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_scaleBy, &flash_geom_Vector3D_scaleBy); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_decrementBy, &flash_geom_Vector3D_decrementBy); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_equals, &flash_geom_Vector3D_equals); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_normalize, &flash_geom_Vector3D_normalize); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_dotProduct, &flash_geom_Vector3D_dotProduct); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_negate, &flash_geom_Vector3D_negate); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_toString, &flash_geom_Vector3D_toString); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_lengthSquared, &flash_geom_Vector3D_lengthSquared); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_x, &flash_geom_Vector3D_x); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_incrementBy, &flash_geom_Vector3D_incrementBy); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_w, &flash_geom_Vector3D_w); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_z, &flash_geom_Vector3D_z); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_add, &flash_geom_Vector3D_add); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_project, &flash_geom_Vector3D_project); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_crossProduct, &flash_geom_Vector3D_crossProduct); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_nearEquals, &flash_geom_Vector3D_nearEquals); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_clone, &flash_geom_Vector3D_clone); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_y, &flash_geom_Vector3D_y); - dict_put(&flash_geom_Vector3D.members, &flash_geom_Vector3D_length, &flash_geom_Vector3D_length); - dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_distance, &flash_geom_Vector3D_distance); - dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_Z_AXIS, &flash_geom_Vector3D_Z_AXIS); - dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_X_AXIS, &flash_geom_Vector3D_X_AXIS); - dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_angleBetween, &flash_geom_Vector3D_angleBetween); - dict_put(&flash_geom_Vector3D.static_members, &flash_geom_Vector3D_Y_AXIS, &flash_geom_Vector3D_Y_AXIS); - dict_put(d, &flash_desktop_ClipboardTransferMode, &flash_desktop_ClipboardTransferMode); - dict_init2(&flash_desktop_ClipboardTransferMode.members, &memberinfo_type, 8); - dict_init2(&flash_desktop_ClipboardTransferMode.static_members, &memberinfo_type, 8); - dict_put(&flash_desktop_ClipboardTransferMode.static_members, &flash_desktop_ClipboardTransferMode_CLONE_ONLY, &flash_desktop_ClipboardTransferMode_CLONE_ONLY); - dict_put(&flash_desktop_ClipboardTransferMode.static_members, &flash_desktop_ClipboardTransferMode_ORIGINAL_PREFERRED, &flash_desktop_ClipboardTransferMode_ORIGINAL_PREFERRED); - dict_put(&flash_desktop_ClipboardTransferMode.static_members, &flash_desktop_ClipboardTransferMode_CLONE_PREFERRED, &flash_desktop_ClipboardTransferMode_CLONE_PREFERRED); - dict_put(&flash_desktop_ClipboardTransferMode.static_members, &flash_desktop_ClipboardTransferMode_ORIGINAL_ONLY, &flash_desktop_ClipboardTransferMode_ORIGINAL_ONLY); - dict_put(d, &flash_display_SpreadMethod, &flash_display_SpreadMethod); - dict_init2(&flash_display_SpreadMethod.members, &memberinfo_type, 8); - dict_init2(&flash_display_SpreadMethod.static_members, &memberinfo_type, 8); - dict_put(&flash_display_SpreadMethod.static_members, &flash_display_SpreadMethod_REFLECT, &flash_display_SpreadMethod_REFLECT); - dict_put(&flash_display_SpreadMethod.static_members, &flash_display_SpreadMethod_REPEAT, &flash_display_SpreadMethod_REPEAT); - dict_put(&flash_display_SpreadMethod.static_members, &flash_display_SpreadMethod_PAD, &flash_display_SpreadMethod_PAD); - dict_put(d, &flash_system_SecurityPanel, &flash_system_SecurityPanel); - dict_init2(&flash_system_SecurityPanel.members, &memberinfo_type, 8); - dict_init2(&flash_system_SecurityPanel.static_members, &memberinfo_type, 8); - dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_LOCAL_STORAGE, &flash_system_SecurityPanel_LOCAL_STORAGE); - dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_CAMERA, &flash_system_SecurityPanel_CAMERA); - dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_DEFAULT, &flash_system_SecurityPanel_DEFAULT); - dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_SETTINGS_MANAGER, &flash_system_SecurityPanel_SETTINGS_MANAGER); - dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_PRIVACY, &flash_system_SecurityPanel_PRIVACY); - dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_MICROPHONE, &flash_system_SecurityPanel_MICROPHONE); - dict_put(&flash_system_SecurityPanel.static_members, &flash_system_SecurityPanel_DISPLAY, &flash_system_SecurityPanel_DISPLAY); - dict_put(d, &flash_events_HTTPStatusEvent, &flash_events_HTTPStatusEvent); - dict_init2(&flash_events_HTTPStatusEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_HTTPStatusEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_HTTPStatusEvent.members, &flash_events_HTTPStatusEvent_toString, &flash_events_HTTPStatusEvent_toString); - dict_put(&flash_events_HTTPStatusEvent.members, &flash_events_HTTPStatusEvent_clone, &flash_events_HTTPStatusEvent_clone); - dict_put(&flash_events_HTTPStatusEvent.members, &flash_events_HTTPStatusEvent_status, &flash_events_HTTPStatusEvent_status); - dict_put(&flash_events_HTTPStatusEvent.static_members, &flash_events_HTTPStatusEvent_HTTP_STATUS, &flash_events_HTTPStatusEvent_HTTP_STATUS); - dict_put(d, &flash_net_NetStreamPlayOptions, &flash_net_NetStreamPlayOptions); - dict_init2(&flash_net_NetStreamPlayOptions.members, &memberinfo_type, 8); - dict_init2(&flash_net_NetStreamPlayOptions.static_members, &memberinfo_type, 8); - dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_len, &flash_net_NetStreamPlayOptions_len); - dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_streamName, &flash_net_NetStreamPlayOptions_streamName); - dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_start, &flash_net_NetStreamPlayOptions_start); - dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_oldStreamName, &flash_net_NetStreamPlayOptions_oldStreamName); - dict_put(&flash_net_NetStreamPlayOptions.members, &flash_net_NetStreamPlayOptions_transition, &flash_net_NetStreamPlayOptions_transition); - dict_put(d, &flash_net_Responder, &flash_net_Responder); - dict_init2(&flash_net_Responder.members, &memberinfo_type, 8); - dict_init2(&flash_net_Responder.static_members, &memberinfo_type, 8); - dict_put(d, &flash_net_XMLSocket, &flash_net_XMLSocket); - dict_init2(&flash_net_XMLSocket.members, &memberinfo_type, 8); - dict_init2(&flash_net_XMLSocket.static_members, &memberinfo_type, 8); - dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_close, &flash_net_XMLSocket_close); - dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_connect, &flash_net_XMLSocket_connect); - dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_send, &flash_net_XMLSocket_send); - dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_connected, &flash_net_XMLSocket_connected); - dict_put(&flash_net_XMLSocket.members, &flash_net_XMLSocket_timeout, &flash_net_XMLSocket_timeout); - dict_put(d, &flash_filters_ConvolutionFilter, &flash_filters_ConvolutionFilter); - dict_init2(&flash_filters_ConvolutionFilter.members, &memberinfo_type, 15); - dict_init2(&flash_filters_ConvolutionFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_alpha, &flash_filters_ConvolutionFilter_alpha); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_matrixX, &flash_filters_ConvolutionFilter_matrixX); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_matrix, &flash_filters_ConvolutionFilter_matrix); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_bias, &flash_filters_ConvolutionFilter_bias); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_color, &flash_filters_ConvolutionFilter_color); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_preserveAlpha, &flash_filters_ConvolutionFilter_preserveAlpha); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_divisor, &flash_filters_ConvolutionFilter_divisor); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_clone, &flash_filters_ConvolutionFilter_clone); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_clamp, &flash_filters_ConvolutionFilter_clamp); - dict_put(&flash_filters_ConvolutionFilter.members, &flash_filters_ConvolutionFilter_matrixY, &flash_filters_ConvolutionFilter_matrixY); - dict_put(d, &flash_text_engine_ElementFormat, &flash_text_engine_ElementFormat); - dict_init2(&flash_text_engine_ElementFormat.members, &memberinfo_type, 31); - dict_init2(&flash_text_engine_ElementFormat.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_getFontMetrics, &flash_text_engine_ElementFormat_getFontMetrics); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_digitCase, &flash_text_engine_ElementFormat_digitCase); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_breakOpportunity, &flash_text_engine_ElementFormat_breakOpportunity); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_ligatureLevel, &flash_text_engine_ElementFormat_ligatureLevel); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_dominantBaseline, &flash_text_engine_ElementFormat_dominantBaseline); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_alignmentBaseline, &flash_text_engine_ElementFormat_alignmentBaseline); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_color, &flash_text_engine_ElementFormat_color); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_digitWidth, &flash_text_engine_ElementFormat_digitWidth); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_kerning, &flash_text_engine_ElementFormat_kerning); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_fontSize, &flash_text_engine_ElementFormat_fontSize); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_fontDescription, &flash_text_engine_ElementFormat_fontDescription); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_baselineShift, &flash_text_engine_ElementFormat_baselineShift); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_locale, &flash_text_engine_ElementFormat_locale); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_typographicCase, &flash_text_engine_ElementFormat_typographicCase); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_trackingLeft, &flash_text_engine_ElementFormat_trackingLeft); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_locked, &flash_text_engine_ElementFormat_locked); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_clone, &flash_text_engine_ElementFormat_clone); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_alpha, &flash_text_engine_ElementFormat_alpha); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_textRotation, &flash_text_engine_ElementFormat_textRotation); - dict_put(&flash_text_engine_ElementFormat.members, &flash_text_engine_ElementFormat_trackingRight, &flash_text_engine_ElementFormat_trackingRight); - dict_put(d, &flash_display_GraphicsGradientFill, &flash_display_GraphicsGradientFill); - dict_init2(&flash_display_GraphicsGradientFill.members, &memberinfo_type, 8); - dict_init2(&flash_display_GraphicsGradientFill.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_interpolationMethod, &flash_display_GraphicsGradientFill_interpolationMethod); - dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_focalPointRatio, &flash_display_GraphicsGradientFill_focalPointRatio); - dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_colors, &flash_display_GraphicsGradientFill_colors); - dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_matrix, &flash_display_GraphicsGradientFill_matrix); - dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_type, &flash_display_GraphicsGradientFill_type); - dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_ratios, &flash_display_GraphicsGradientFill_ratios); - dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_spreadMethod, &flash_display_GraphicsGradientFill_spreadMethod); - dict_put(&flash_display_GraphicsGradientFill.members, &flash_display_GraphicsGradientFill_alphas, &flash_display_GraphicsGradientFill_alphas); - dict_put(d, &flash_display_FrameLabel, &flash_display_FrameLabel); - dict_init2(&flash_display_FrameLabel.members, &memberinfo_type, 8); - dict_init2(&flash_display_FrameLabel.static_members, &memberinfo_type, 8); - dict_put(&flash_display_FrameLabel.members, &flash_display_FrameLabel_frame, &flash_display_FrameLabel_frame); - dict_put(&flash_display_FrameLabel.members, &flash_display_FrameLabel_name, &flash_display_FrameLabel_name); - dict_put(d, &flash_media_SoundTransform, &flash_media_SoundTransform); - dict_init2(&flash_media_SoundTransform.members, &memberinfo_type, 8); - dict_init2(&flash_media_SoundTransform.static_members, &memberinfo_type, 8); - dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_pan, &flash_media_SoundTransform_pan); - dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_leftToRight, &flash_media_SoundTransform_leftToRight); - dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_rightToLeft, &flash_media_SoundTransform_rightToLeft); - dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_volume, &flash_media_SoundTransform_volume); - dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_leftToLeft, &flash_media_SoundTransform_leftToLeft); - dict_put(&flash_media_SoundTransform.members, &flash_media_SoundTransform_rightToRight, &flash_media_SoundTransform_rightToRight); - dict_put(d, &_AS3, &_AS3); - dict_put(d, &flash_net_LocalConnection, &flash_net_LocalConnection); - dict_init2(&flash_net_LocalConnection.members, &memberinfo_type, 15); - dict_init2(&flash_net_LocalConnection.static_members, &memberinfo_type, 8); - dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_client, &flash_net_LocalConnection_client); - dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_allowDomain, &flash_net_LocalConnection_allowDomain); - dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_connect, &flash_net_LocalConnection_connect); - dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_domain, &flash_net_LocalConnection_domain); - dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_allowInsecureDomain, &flash_net_LocalConnection_allowInsecureDomain); - dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_send, &flash_net_LocalConnection_send); - dict_put(&flash_net_LocalConnection.members, &flash_net_LocalConnection_close, &flash_net_LocalConnection_close); - dict_put(d, &flash_display_ShaderParameterType, &flash_display_ShaderParameterType); - dict_init2(&flash_display_ShaderParameterType.members, &memberinfo_type, 8); - dict_init2(&flash_display_ShaderParameterType.static_members, &memberinfo_type, 31); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_FLOAT, &flash_display_ShaderParameterType_FLOAT); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_BOOL, &flash_display_ShaderParameterType_BOOL); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_FLOAT2, &flash_display_ShaderParameterType_FLOAT2); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_MATRIX2X2, &flash_display_ShaderParameterType_MATRIX2X2); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_INT, &flash_display_ShaderParameterType_INT); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_INT4, &flash_display_ShaderParameterType_INT4); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_MATRIX4X4, &flash_display_ShaderParameterType_MATRIX4X4); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_FLOAT3, &flash_display_ShaderParameterType_FLOAT3); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_BOOL2, &flash_display_ShaderParameterType_BOOL2); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_INT3, &flash_display_ShaderParameterType_INT3); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_BOOL3, &flash_display_ShaderParameterType_BOOL3); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_BOOL4, &flash_display_ShaderParameterType_BOOL4); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_FLOAT4, &flash_display_ShaderParameterType_FLOAT4); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_INT2, &flash_display_ShaderParameterType_INT2); - dict_put(&flash_display_ShaderParameterType.static_members, &flash_display_ShaderParameterType_MATRIX3X3, &flash_display_ShaderParameterType_MATRIX3X3); - dict_put(d, &flash_events_IMEEvent, &flash_events_IMEEvent); - dict_init2(&flash_events_IMEEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_IMEEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_IMEEvent.members, &flash_events_IMEEvent_toString, &flash_events_IMEEvent_toString); - dict_put(&flash_events_IMEEvent.members, &flash_events_IMEEvent_clone, &flash_events_IMEEvent_clone); - dict_put(&flash_events_IMEEvent.static_members, &flash_events_IMEEvent_IME_COMPOSITION, &flash_events_IMEEvent_IME_COMPOSITION); - dict_put(d, &flash_text_TextFormatDisplay, &flash_text_TextFormatDisplay); - dict_init2(&flash_text_TextFormatDisplay.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextFormatDisplay.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextFormatDisplay.static_members, &flash_text_TextFormatDisplay_INLINE, &flash_text_TextFormatDisplay_INLINE); - dict_put(&flash_text_TextFormatDisplay.static_members, &flash_text_TextFormatDisplay_BLOCK, &flash_text_TextFormatDisplay_BLOCK); - dict_put(d, &flash_profiler_profile, &flash_profiler_profile); - dict_put(d, &flash_display_AVM1Movie, &flash_display_AVM1Movie); - dict_init2(&flash_display_AVM1Movie.members, &memberinfo_type, 8); - dict_init2(&flash_display_AVM1Movie.static_members, &memberinfo_type, 8); - dict_put(&flash_display_AVM1Movie.members, &flash_display_AVM1Movie_call, &flash_display_AVM1Movie_call); - dict_put(&flash_display_AVM1Movie.members, &flash_display_AVM1Movie_addCallback, &flash_display_AVM1Movie_addCallback); - dict_put(d, &flash_events_ContextMenuEvent, &flash_events_ContextMenuEvent); - dict_init2(&flash_events_ContextMenuEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_ContextMenuEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_mouseTarget, &flash_events_ContextMenuEvent_mouseTarget); - dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_isMouseTargetInaccessible, &flash_events_ContextMenuEvent_isMouseTargetInaccessible); - dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_toString, &flash_events_ContextMenuEvent_toString); - dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_contextMenuOwner, &flash_events_ContextMenuEvent_contextMenuOwner); - dict_put(&flash_events_ContextMenuEvent.members, &flash_events_ContextMenuEvent_clone, &flash_events_ContextMenuEvent_clone); - dict_put(&flash_events_ContextMenuEvent.static_members, &flash_events_ContextMenuEvent_MENU_SELECT, &flash_events_ContextMenuEvent_MENU_SELECT); - dict_put(&flash_events_ContextMenuEvent.static_members, &flash_events_ContextMenuEvent_MENU_ITEM_SELECT, &flash_events_ContextMenuEvent_MENU_ITEM_SELECT); - dict_put(d, &flash_events_EventPhase, &flash_events_EventPhase); - dict_init2(&flash_events_EventPhase.members, &memberinfo_type, 8); - dict_init2(&flash_events_EventPhase.static_members, &memberinfo_type, 8); - dict_put(&flash_events_EventPhase.static_members, &flash_events_EventPhase_BUBBLING_PHASE, &flash_events_EventPhase_BUBBLING_PHASE); - dict_put(&flash_events_EventPhase.static_members, &flash_events_EventPhase_CAPTURING_PHASE, &flash_events_EventPhase_CAPTURING_PHASE); - dict_put(&flash_events_EventPhase.static_members, &flash_events_EventPhase_AT_TARGET, &flash_events_EventPhase_AT_TARGET); - dict_put(d, &flash_display_JointStyle, &flash_display_JointStyle); - dict_init2(&flash_display_JointStyle.members, &memberinfo_type, 8); - dict_init2(&flash_display_JointStyle.static_members, &memberinfo_type, 8); - dict_put(&flash_display_JointStyle.static_members, &flash_display_JointStyle_ROUND, &flash_display_JointStyle_ROUND); - dict_put(&flash_display_JointStyle.static_members, &flash_display_JointStyle_MITER, &flash_display_JointStyle_MITER); - dict_put(&flash_display_JointStyle.static_members, &flash_display_JointStyle_BEVEL, &flash_display_JointStyle_BEVEL); - dict_put(d, &flash_utils_Dictionary, &flash_utils_Dictionary); - dict_init2(&flash_utils_Dictionary.members, &memberinfo_type, 8); - dict_init2(&flash_utils_Dictionary.static_members, &memberinfo_type, 8); - dict_put(d, &flash_display_GraphicsPathCommand, &flash_display_GraphicsPathCommand); - dict_init2(&flash_display_GraphicsPathCommand.members, &memberinfo_type, 8); - dict_init2(&flash_display_GraphicsPathCommand.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_NO_OP, &flash_display_GraphicsPathCommand_NO_OP); - dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_MOVE_TO, &flash_display_GraphicsPathCommand_MOVE_TO); - dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_WIDE_MOVE_TO, &flash_display_GraphicsPathCommand_WIDE_MOVE_TO); - dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_CURVE_TO, &flash_display_GraphicsPathCommand_CURVE_TO); - dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_LINE_TO, &flash_display_GraphicsPathCommand_LINE_TO); - dict_put(&flash_display_GraphicsPathCommand.static_members, &flash_display_GraphicsPathCommand_WIDE_LINE_TO, &flash_display_GraphicsPathCommand_WIDE_LINE_TO); - dict_put(d, &flash_filters_BevelFilter, &flash_filters_BevelFilter); - dict_init2(&flash_filters_BevelFilter.members, &memberinfo_type, 31); - dict_init2(&flash_filters_BevelFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_type, &flash_filters_BevelFilter_type); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_highlightColor, &flash_filters_BevelFilter_highlightColor); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_knockout, &flash_filters_BevelFilter_knockout); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_distance, &flash_filters_BevelFilter_distance); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_strength, &flash_filters_BevelFilter_strength); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_highlightAlpha, &flash_filters_BevelFilter_highlightAlpha); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_blurY, &flash_filters_BevelFilter_blurY); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_shadowColor, &flash_filters_BevelFilter_shadowColor); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_angle, &flash_filters_BevelFilter_angle); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_blurX, &flash_filters_BevelFilter_blurX); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_shadowAlpha, &flash_filters_BevelFilter_shadowAlpha); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_quality, &flash_filters_BevelFilter_quality); - dict_put(&flash_filters_BevelFilter.members, &flash_filters_BevelFilter_clone, &flash_filters_BevelFilter_clone); - dict_put(d, &flash_utils_getTimer, &flash_utils_getTimer); - dict_put(d, &flash_display_Loader, &flash_display_Loader); - dict_init2(&flash_display_Loader.members, &memberinfo_type, 15); - dict_init2(&flash_display_Loader.static_members, &memberinfo_type, 8); - dict_put(&flash_display_Loader.members, &flash_display_Loader_content, &flash_display_Loader_content); - dict_put(&flash_display_Loader.members, &flash_display_Loader_unloadAndStop, &flash_display_Loader_unloadAndStop); - dict_put(&flash_display_Loader.members, &flash_display_Loader_unload, &flash_display_Loader_unload); - dict_put(&flash_display_Loader.members, &flash_display_Loader_removeChildAt, &flash_display_Loader_removeChildAt); - dict_put(&flash_display_Loader.members, &flash_display_Loader_addChildAt, &flash_display_Loader_addChildAt); - dict_put(&flash_display_Loader.members, &flash_display_Loader_contentLoaderInfo, &flash_display_Loader_contentLoaderInfo); - dict_put(&flash_display_Loader.members, &flash_display_Loader_loadBytes, &flash_display_Loader_loadBytes); - dict_put(&flash_display_Loader.members, &flash_display_Loader_removeChild, &flash_display_Loader_removeChild); - dict_put(&flash_display_Loader.members, &flash_display_Loader_load, &flash_display_Loader_load); - dict_put(&flash_display_Loader.members, &flash_display_Loader_addChild, &flash_display_Loader_addChild); - dict_put(&flash_display_Loader.members, &flash_display_Loader_close, &flash_display_Loader_close); - dict_put(&flash_display_Loader.members, &flash_display_Loader_setChildIndex, &flash_display_Loader_setChildIndex); - dict_put(d, &flash_display_GraphicsBitmapFill, &flash_display_GraphicsBitmapFill); - dict_init2(&flash_display_GraphicsBitmapFill.members, &memberinfo_type, 8); - dict_init2(&flash_display_GraphicsBitmapFill.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GraphicsBitmapFill.members, &flash_display_GraphicsBitmapFill_smooth, &flash_display_GraphicsBitmapFill_smooth); - dict_put(&flash_display_GraphicsBitmapFill.members, &flash_display_GraphicsBitmapFill_repeat, &flash_display_GraphicsBitmapFill_repeat); - dict_put(&flash_display_GraphicsBitmapFill.members, &flash_display_GraphicsBitmapFill_bitmapData, &flash_display_GraphicsBitmapFill_bitmapData); - dict_put(&flash_display_GraphicsBitmapFill.members, &flash_display_GraphicsBitmapFill_matrix, &flash_display_GraphicsBitmapFill_matrix); - dict_put(d, &_undefined, &_undefined); - dict_put(d, &flash_display_SimpleButton, &flash_display_SimpleButton); - dict_init2(&flash_display_SimpleButton.members, &memberinfo_type, 8); - dict_init2(&flash_display_SimpleButton.static_members, &memberinfo_type, 8); - dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_overState, &flash_display_SimpleButton_overState); - dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_downState, &flash_display_SimpleButton_downState); - dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_enabled, &flash_display_SimpleButton_enabled); - dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_trackAsMenu, &flash_display_SimpleButton_trackAsMenu); - dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_soundTransform, &flash_display_SimpleButton_soundTransform); - dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_useHandCursor, &flash_display_SimpleButton_useHandCursor); - dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_upState, &flash_display_SimpleButton_upState); - dict_put(&flash_display_SimpleButton.members, &flash_display_SimpleButton_hitTestState, &flash_display_SimpleButton_hitTestState); - dict_put(d, &flash_text_engine_TabAlignment, &flash_text_engine_TabAlignment); - dict_init2(&flash_text_engine_TabAlignment.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TabAlignment.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TabAlignment.static_members, &flash_text_engine_TabAlignment_END, &flash_text_engine_TabAlignment_END); - dict_put(&flash_text_engine_TabAlignment.static_members, &flash_text_engine_TabAlignment_CENTER, &flash_text_engine_TabAlignment_CENTER); - dict_put(&flash_text_engine_TabAlignment.static_members, &flash_text_engine_TabAlignment_START, &flash_text_engine_TabAlignment_START); - dict_put(&flash_text_engine_TabAlignment.static_members, &flash_text_engine_TabAlignment_DECIMAL, &flash_text_engine_TabAlignment_DECIMAL); - dict_put(d, &flash_text_engine_FontWeight, &flash_text_engine_FontWeight); - dict_init2(&flash_text_engine_FontWeight.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_FontWeight.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_FontWeight.static_members, &flash_text_engine_FontWeight_NORMAL, &flash_text_engine_FontWeight_NORMAL); - dict_put(&flash_text_engine_FontWeight.static_members, &flash_text_engine_FontWeight_BOLD, &flash_text_engine_FontWeight_BOLD); - dict_put(d, &flash_utils_describeType, &flash_utils_describeType); - dict_put(d, &flash_display_PixelSnapping, &flash_display_PixelSnapping); - dict_init2(&flash_display_PixelSnapping.members, &memberinfo_type, 8); - dict_init2(&flash_display_PixelSnapping.static_members, &memberinfo_type, 8); - dict_put(&flash_display_PixelSnapping.static_members, &flash_display_PixelSnapping_AUTO, &flash_display_PixelSnapping_AUTO); - dict_put(&flash_display_PixelSnapping.static_members, &flash_display_PixelSnapping_NEVER, &flash_display_PixelSnapping_NEVER); - dict_put(&flash_display_PixelSnapping.static_members, &flash_display_PixelSnapping_ALWAYS, &flash_display_PixelSnapping_ALWAYS); - dict_put(d, &flash_events_FocusEvent, &flash_events_FocusEvent); - dict_init2(&flash_events_FocusEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_FocusEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_keyCode, &flash_events_FocusEvent_keyCode); - dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_toString, &flash_events_FocusEvent_toString); - dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_isRelatedObjectInaccessible, &flash_events_FocusEvent_isRelatedObjectInaccessible); - dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_clone, &flash_events_FocusEvent_clone); - dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_shiftKey, &flash_events_FocusEvent_shiftKey); - dict_put(&flash_events_FocusEvent.members, &flash_events_FocusEvent_relatedObject, &flash_events_FocusEvent_relatedObject); - dict_put(&flash_events_FocusEvent.static_members, &flash_events_FocusEvent_FOCUS_IN, &flash_events_FocusEvent_FOCUS_IN); - dict_put(&flash_events_FocusEvent.static_members, &flash_events_FocusEvent_FOCUS_OUT, &flash_events_FocusEvent_FOCUS_OUT); - dict_put(&flash_events_FocusEvent.static_members, &flash_events_FocusEvent_KEY_FOCUS_CHANGE, &flash_events_FocusEvent_KEY_FOCUS_CHANGE); - dict_put(&flash_events_FocusEvent.static_members, &flash_events_FocusEvent_MOUSE_FOCUS_CHANGE, &flash_events_FocusEvent_MOUSE_FOCUS_CHANGE); - dict_put(d, &flash_errors_MemoryError, &flash_errors_MemoryError); - dict_init2(&flash_errors_MemoryError.members, &memberinfo_type, 8); - dict_init2(&flash_errors_MemoryError.static_members, &memberinfo_type, 8); - dict_put(d, &flash_events_NetFilterEvent, &flash_events_NetFilterEvent); - dict_init2(&flash_events_NetFilterEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_NetFilterEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_NetFilterEvent.members, &flash_events_NetFilterEvent_header, &flash_events_NetFilterEvent_header); - dict_put(&flash_events_NetFilterEvent.members, &flash_events_NetFilterEvent_toString, &flash_events_NetFilterEvent_toString); - dict_put(&flash_events_NetFilterEvent.members, &flash_events_NetFilterEvent_clone, &flash_events_NetFilterEvent_clone); - dict_put(&flash_events_NetFilterEvent.members, &flash_events_NetFilterEvent_data, &flash_events_NetFilterEvent_data); - dict_put(d, &_decodeURI, &_decodeURI); - dict_put(d, &_encodeURI, &_encodeURI); - dict_put(d, &flash_text_engine_TextBaseline, &flash_text_engine_TextBaseline); - dict_init2(&flash_text_engine_TextBaseline.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TextBaseline.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_ROMAN, &flash_text_engine_TextBaseline_ROMAN); - dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_DESCENT, &flash_text_engine_TextBaseline_DESCENT); - dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_IDEOGRAPHIC_CENTER, &flash_text_engine_TextBaseline_IDEOGRAPHIC_CENTER); - dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_USE_DOMINANT_BASELINE, &flash_text_engine_TextBaseline_USE_DOMINANT_BASELINE); - dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_IDEOGRAPHIC_BOTTOM, &flash_text_engine_TextBaseline_IDEOGRAPHIC_BOTTOM); - dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_ASCENT, &flash_text_engine_TextBaseline_ASCENT); - dict_put(&flash_text_engine_TextBaseline.static_members, &flash_text_engine_TextBaseline_IDEOGRAPHIC_TOP, &flash_text_engine_TextBaseline_IDEOGRAPHIC_TOP); - dict_put(d, &flash_external_ExternalInterface, &flash_external_ExternalInterface); - dict_init2(&flash_external_ExternalInterface.members, &memberinfo_type, 8); - dict_init2(&flash_external_ExternalInterface.static_members, &memberinfo_type, 8); - dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_call, &flash_external_ExternalInterface_call); - dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_available, &flash_external_ExternalInterface_available); - dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_addCallback, &flash_external_ExternalInterface_addCallback); - dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_marshallExceptions, &flash_external_ExternalInterface_marshallExceptions); - dict_put(&flash_external_ExternalInterface.static_members, &flash_external_ExternalInterface_objectID, &flash_external_ExternalInterface_objectID); - dict_put(d, &_EvalError, &_EvalError); - dict_init2(&_EvalError.members, &memberinfo_type, 8); - dict_init2(&_EvalError.static_members, &memberinfo_type, 8); - dict_put(&_EvalError.static_members, &_EvalError_length, &_EvalError_length); - dict_put(d, &flash_text_engine_DigitCase, &flash_text_engine_DigitCase); - dict_init2(&flash_text_engine_DigitCase.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_DigitCase.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_DigitCase.static_members, &flash_text_engine_DigitCase_OLD_STYLE, &flash_text_engine_DigitCase_OLD_STYLE); - dict_put(&flash_text_engine_DigitCase.static_members, &flash_text_engine_DigitCase_DEFAULT, &flash_text_engine_DigitCase_DEFAULT); - dict_put(&flash_text_engine_DigitCase.static_members, &flash_text_engine_DigitCase_LINING, &flash_text_engine_DigitCase_LINING); - dict_put(d, &flash_text_TextFormatAlign, &flash_text_TextFormatAlign); - dict_init2(&flash_text_TextFormatAlign.members, &memberinfo_type, 8); - dict_init2(&flash_text_TextFormatAlign.static_members, &memberinfo_type, 8); - dict_put(&flash_text_TextFormatAlign.static_members, &flash_text_TextFormatAlign_LEFT, &flash_text_TextFormatAlign_LEFT); - dict_put(&flash_text_TextFormatAlign.static_members, &flash_text_TextFormatAlign_RIGHT, &flash_text_TextFormatAlign_RIGHT); - dict_put(&flash_text_TextFormatAlign.static_members, &flash_text_TextFormatAlign_CENTER, &flash_text_TextFormatAlign_CENTER); - dict_put(&flash_text_TextFormatAlign.static_members, &flash_text_TextFormatAlign_JUSTIFY, &flash_text_TextFormatAlign_JUSTIFY); - dict_put(d, &flash_errors_ScriptTimeoutError, &flash_errors_ScriptTimeoutError); - dict_init2(&flash_errors_ScriptTimeoutError.members, &memberinfo_type, 8); - dict_init2(&flash_errors_ScriptTimeoutError.static_members, &memberinfo_type, 8); - dict_put(d, &_uint, &_uint); - dict_init2(&_uint.members, &memberinfo_type, 8); - dict_init2(&_uint.static_members, &memberinfo_type, 8); - dict_put(&_uint.members, &_uint_valueOf, &_uint_valueOf); - dict_put(&_uint.members, &_uint_toString, &_uint_toString); - dict_put(&_uint.members, &_uint_toExponential, &_uint_toExponential); - dict_put(&_uint.members, &_uint_toFixed, &_uint_toFixed); - dict_put(&_uint.members, &_uint_toPrecision, &_uint_toPrecision); - dict_put(&_uint.static_members, &_uint_MAX_VALUE, &_uint_MAX_VALUE); - dict_put(&_uint.static_members, &_uint_length, &_uint_length); - dict_put(&_uint.static_members, &_uint_MIN_VALUE, &_uint_MIN_VALUE); - dict_put(d, &flash_debugger_enterDebugger, &flash_debugger_enterDebugger); - dict_put(d, &flash_geom_Orientation3D, &flash_geom_Orientation3D); - dict_init2(&flash_geom_Orientation3D.members, &memberinfo_type, 8); - dict_init2(&flash_geom_Orientation3D.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_Orientation3D.static_members, &flash_geom_Orientation3D_QUATERNION, &flash_geom_Orientation3D_QUATERNION); - dict_put(&flash_geom_Orientation3D.static_members, &flash_geom_Orientation3D_EULER_ANGLES, &flash_geom_Orientation3D_EULER_ANGLES); - dict_put(&flash_geom_Orientation3D.static_members, &flash_geom_Orientation3D_AXIS_ANGLE, &flash_geom_Orientation3D_AXIS_ANGLE); - dict_put(d, &flash_text_engine_CFFHinting, &flash_text_engine_CFFHinting); - dict_init2(&flash_text_engine_CFFHinting.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_CFFHinting.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_CFFHinting.static_members, &flash_text_engine_CFFHinting_HORIZONTAL_STEM, &flash_text_engine_CFFHinting_HORIZONTAL_STEM); - dict_put(&flash_text_engine_CFFHinting.static_members, &flash_text_engine_CFFHinting_NONE, &flash_text_engine_CFFHinting_NONE); - dict_put(d, &flash_text_FontType, &flash_text_FontType); - dict_init2(&flash_text_FontType.members, &memberinfo_type, 8); - dict_init2(&flash_text_FontType.static_members, &memberinfo_type, 8); - dict_put(&flash_text_FontType.static_members, &flash_text_FontType_EMBEDDED, &flash_text_FontType_EMBEDDED); - dict_put(&flash_text_FontType.static_members, &flash_text_FontType_DEVICE, &flash_text_FontType_DEVICE); - dict_put(&flash_text_FontType.static_members, &flash_text_FontType_EMBEDDED_CFF, &flash_text_FontType_EMBEDDED_CFF); - dict_put(d, &flash_filters_ShaderFilter, &flash_filters_ShaderFilter); - dict_init2(&flash_filters_ShaderFilter.members, &memberinfo_type, 8); - dict_init2(&flash_filters_ShaderFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_bottomExtension, &flash_filters_ShaderFilter_bottomExtension); - dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_shader, &flash_filters_ShaderFilter_shader); - dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_rightExtension, &flash_filters_ShaderFilter_rightExtension); - dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_leftExtension, &flash_filters_ShaderFilter_leftExtension); - dict_put(&flash_filters_ShaderFilter.members, &flash_filters_ShaderFilter_topExtension, &flash_filters_ShaderFilter_topExtension); - dict_put(d, &flash_display_GraphicsPath, &flash_display_GraphicsPath); - dict_init2(&flash_display_GraphicsPath.members, &memberinfo_type, 8); - dict_init2(&flash_display_GraphicsPath.static_members, &memberinfo_type, 8); - dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_wideMoveTo, &flash_display_GraphicsPath_wideMoveTo); - dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_winding, &flash_display_GraphicsPath_winding); - dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_moveTo, &flash_display_GraphicsPath_moveTo); - dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_wideLineTo, &flash_display_GraphicsPath_wideLineTo); - dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_commands, &flash_display_GraphicsPath_commands); - dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_curveTo, &flash_display_GraphicsPath_curveTo); - dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_lineTo, &flash_display_GraphicsPath_lineTo); - dict_put(&flash_display_GraphicsPath.members, &flash_display_GraphicsPath_data, &flash_display_GraphicsPath_data); - dict_put(d, &flash_system_ApplicationDomain, &flash_system_ApplicationDomain); - dict_init2(&flash_system_ApplicationDomain.members, &memberinfo_type, 8); - dict_init2(&flash_system_ApplicationDomain.static_members, &memberinfo_type, 8); - dict_put(&flash_system_ApplicationDomain.members, &flash_system_ApplicationDomain_hasDefinition, &flash_system_ApplicationDomain_hasDefinition); - dict_put(&flash_system_ApplicationDomain.members, &flash_system_ApplicationDomain_getDefinition, &flash_system_ApplicationDomain_getDefinition); - dict_put(&flash_system_ApplicationDomain.members, &flash_system_ApplicationDomain_parentDomain, &flash_system_ApplicationDomain_parentDomain); - dict_put(&flash_system_ApplicationDomain.members, &flash_system_ApplicationDomain_domainMemory, &flash_system_ApplicationDomain_domainMemory); - dict_put(&flash_system_ApplicationDomain.static_members, &flash_system_ApplicationDomain_MIN_DOMAIN_MEMORY_LENGTH, &flash_system_ApplicationDomain_MIN_DOMAIN_MEMORY_LENGTH); - dict_put(&flash_system_ApplicationDomain.static_members, &flash_system_ApplicationDomain_currentDomain, &flash_system_ApplicationDomain_currentDomain); - dict_put(d, &flash_events_KeyboardEvent, &flash_events_KeyboardEvent); - dict_init2(&flash_events_KeyboardEvent.members, &memberinfo_type, 15); - dict_init2(&flash_events_KeyboardEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_shiftKey, &flash_events_KeyboardEvent_shiftKey); - dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_keyCode, &flash_events_KeyboardEvent_keyCode); - dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_keyLocation, &flash_events_KeyboardEvent_keyLocation); - dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_updateAfterEvent, &flash_events_KeyboardEvent_updateAfterEvent); - dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_toString, &flash_events_KeyboardEvent_toString); - dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_altKey, &flash_events_KeyboardEvent_altKey); - dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_ctrlKey, &flash_events_KeyboardEvent_ctrlKey); - dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_clone, &flash_events_KeyboardEvent_clone); - dict_put(&flash_events_KeyboardEvent.members, &flash_events_KeyboardEvent_charCode, &flash_events_KeyboardEvent_charCode); - dict_put(&flash_events_KeyboardEvent.static_members, &flash_events_KeyboardEvent_KEY_DOWN, &flash_events_KeyboardEvent_KEY_DOWN); - dict_put(&flash_events_KeyboardEvent.static_members, &flash_events_KeyboardEvent_KEY_UP, &flash_events_KeyboardEvent_KEY_UP); - dict_put(d, &adobe_utils_ProductManager, &adobe_utils_ProductManager); - dict_init2(&adobe_utils_ProductManager.members, &memberinfo_type, 8); - dict_init2(&adobe_utils_ProductManager.static_members, &memberinfo_type, 8); - dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_running, &adobe_utils_ProductManager_running); - dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_download, &adobe_utils_ProductManager_download); - dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_installedVersion, &adobe_utils_ProductManager_installedVersion); - dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_installed, &adobe_utils_ProductManager_installed); - dict_put(&adobe_utils_ProductManager.members, &adobe_utils_ProductManager_launch, &adobe_utils_ProductManager_launch); - dict_put(d, &flash_events_Event, &flash_events_Event); - dict_init2(&flash_events_Event.members, &memberinfo_type, 31); - dict_init2(&flash_events_Event.static_members, &memberinfo_type, 63); - dict_put(&flash_events_Event.members, &flash_events_Event_type, &flash_events_Event_type); - dict_put(&flash_events_Event.members, &flash_events_Event_cancelable, &flash_events_Event_cancelable); - dict_put(&flash_events_Event.members, &flash_events_Event_isDefaultPrevented, &flash_events_Event_isDefaultPrevented); - dict_put(&flash_events_Event.members, &flash_events_Event_target, &flash_events_Event_target); - dict_put(&flash_events_Event.members, &flash_events_Event_eventPhase, &flash_events_Event_eventPhase); - dict_put(&flash_events_Event.members, &flash_events_Event_currentTarget, &flash_events_Event_currentTarget); - dict_put(&flash_events_Event.members, &flash_events_Event_toString, &flash_events_Event_toString); - dict_put(&flash_events_Event.members, &flash_events_Event_stopImmediatePropagation, &flash_events_Event_stopImmediatePropagation); - dict_put(&flash_events_Event.members, &flash_events_Event_bubbles, &flash_events_Event_bubbles); - dict_put(&flash_events_Event.members, &flash_events_Event_stopPropagation, &flash_events_Event_stopPropagation); - dict_put(&flash_events_Event.members, &flash_events_Event_clone, &flash_events_Event_clone); - dict_put(&flash_events_Event.members, &flash_events_Event_preventDefault, &flash_events_Event_preventDefault); - dict_put(&flash_events_Event.members, &flash_events_Event_formatToString, &flash_events_Event_formatToString); - dict_put(&flash_events_Event.static_members, &flash_events_Event_REMOVED_FROM_STAGE, &flash_events_Event_REMOVED_FROM_STAGE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_CLEAR, &flash_events_Event_CLEAR); - dict_put(&flash_events_Event.static_members, &flash_events_Event_OPEN, &flash_events_Event_OPEN); - dict_put(&flash_events_Event.static_members, &flash_events_Event_TAB_CHILDREN_CHANGE, &flash_events_Event_TAB_CHILDREN_CHANGE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_DEACTIVATE, &flash_events_Event_DEACTIVATE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_ACTIVATE, &flash_events_Event_ACTIVATE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_SOUND_COMPLETE, &flash_events_Event_SOUND_COMPLETE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_CANCEL, &flash_events_Event_CANCEL); - dict_put(&flash_events_Event.static_members, &flash_events_Event_REMOVED, &flash_events_Event_REMOVED); - dict_put(&flash_events_Event.static_members, &flash_events_Event_INIT, &flash_events_Event_INIT); - dict_put(&flash_events_Event.static_members, &flash_events_Event_FRAME_CONSTRUCTED, &flash_events_Event_FRAME_CONSTRUCTED); - dict_put(&flash_events_Event.static_members, &flash_events_Event_SCROLL, &flash_events_Event_SCROLL); - dict_put(&flash_events_Event.static_members, &flash_events_Event_TAB_INDEX_CHANGE, &flash_events_Event_TAB_INDEX_CHANGE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_CHANGE, &flash_events_Event_CHANGE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_ADDED_TO_STAGE, &flash_events_Event_ADDED_TO_STAGE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_UNLOAD, &flash_events_Event_UNLOAD); - dict_put(&flash_events_Event.static_members, &flash_events_Event_SELECT, &flash_events_Event_SELECT); - dict_put(&flash_events_Event.static_members, &flash_events_Event_CONNECT, &flash_events_Event_CONNECT); - dict_put(&flash_events_Event.static_members, &flash_events_Event_CUT, &flash_events_Event_CUT); - dict_put(&flash_events_Event.static_members, &flash_events_Event_PASTE, &flash_events_Event_PASTE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_ADDED, &flash_events_Event_ADDED); - dict_put(&flash_events_Event.static_members, &flash_events_Event_ID3, &flash_events_Event_ID3); - dict_put(&flash_events_Event.static_members, &flash_events_Event_ENTER_FRAME, &flash_events_Event_ENTER_FRAME); - dict_put(&flash_events_Event.static_members, &flash_events_Event_RENDER, &flash_events_Event_RENDER); - dict_put(&flash_events_Event.static_members, &flash_events_Event_EXIT_FRAME, &flash_events_Event_EXIT_FRAME); - dict_put(&flash_events_Event.static_members, &flash_events_Event_RESIZE, &flash_events_Event_RESIZE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_FULLSCREEN, &flash_events_Event_FULLSCREEN); - dict_put(&flash_events_Event.static_members, &flash_events_Event_MOUSE_LEAVE, &flash_events_Event_MOUSE_LEAVE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_CLOSE, &flash_events_Event_CLOSE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_SELECT_ALL, &flash_events_Event_SELECT_ALL); - dict_put(&flash_events_Event.static_members, &flash_events_Event_TAB_ENABLED_CHANGE, &flash_events_Event_TAB_ENABLED_CHANGE); - dict_put(&flash_events_Event.static_members, &flash_events_Event_COPY, &flash_events_Event_COPY); - dict_put(&flash_events_Event.static_members, &flash_events_Event_COMPLETE, &flash_events_Event_COMPLETE); - dict_put(d, &flash_desktop_ClipboardFormats, &flash_desktop_ClipboardFormats); - dict_init2(&flash_desktop_ClipboardFormats.members, &memberinfo_type, 8); - dict_init2(&flash_desktop_ClipboardFormats.static_members, &memberinfo_type, 15); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_TEXT_FORMAT, &flash_desktop_ClipboardFormats_TEXT_FORMAT); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_BITMAP_FORMAT, &flash_desktop_ClipboardFormats_BITMAP_FORMAT); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_FLASH_PREFIX, &flash_desktop_ClipboardFormats_FLASH_PREFIX); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_HTML_FORMAT, &flash_desktop_ClipboardFormats_HTML_FORMAT); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_REFERENCE_PREFIX, &flash_desktop_ClipboardFormats_REFERENCE_PREFIX); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_AIR_PREFIX, &flash_desktop_ClipboardFormats_AIR_PREFIX); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_SERIALIZATION_PREFIX, &flash_desktop_ClipboardFormats_SERIALIZATION_PREFIX); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_RICH_TEXT_FORMAT, &flash_desktop_ClipboardFormats_RICH_TEXT_FORMAT); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_URL_FORMAT, &flash_desktop_ClipboardFormats_URL_FORMAT); - dict_put(&flash_desktop_ClipboardFormats.static_members, &flash_desktop_ClipboardFormats_FILE_LIST_FORMAT, &flash_desktop_ClipboardFormats_FILE_LIST_FORMAT); - dict_put(d, &flash_display_MovieClip, &flash_display_MovieClip); - dict_init2(&flash_display_MovieClip.members, &memberinfo_type, 31); - dict_init2(&flash_display_MovieClip.static_members, &memberinfo_type, 8); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_prevScene, &flash_display_MovieClip_prevScene); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_gotoAndPlay, &flash_display_MovieClip_gotoAndPlay); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentLabels, &flash_display_MovieClip_currentLabels); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_nextFrame, &flash_display_MovieClip_nextFrame); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentScene, &flash_display_MovieClip_currentScene); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_enabled, &flash_display_MovieClip_enabled); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentFrameLabel, &flash_display_MovieClip_currentFrameLabel); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_play, &flash_display_MovieClip_play); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_framesLoaded, &flash_display_MovieClip_framesLoaded); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_scenes, &flash_display_MovieClip_scenes); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_addFrameScript, &flash_display_MovieClip_addFrameScript); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentLabel, &flash_display_MovieClip_currentLabel); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_prevFrame, &flash_display_MovieClip_prevFrame); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_gotoAndStop, &flash_display_MovieClip_gotoAndStop); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_currentFrame, &flash_display_MovieClip_currentFrame); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_nextScene, &flash_display_MovieClip_nextScene); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_totalFrames, &flash_display_MovieClip_totalFrames); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_trackAsMenu, &flash_display_MovieClip_trackAsMenu); - dict_put(&flash_display_MovieClip.members, &flash_display_MovieClip_stop, &flash_display_MovieClip_stop); - dict_put(d, &flash_display_BitmapData, &flash_display_BitmapData); - dict_init2(&flash_display_BitmapData.members, &memberinfo_type, 63); - dict_init2(&flash_display_BitmapData.static_members, &memberinfo_type, 8); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getPixel32, &flash_display_BitmapData_getPixel32); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_draw, &flash_display_BitmapData_draw); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_setPixels, &flash_display_BitmapData_setPixels); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_copyPixels, &flash_display_BitmapData_copyPixels); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_histogram, &flash_display_BitmapData_histogram); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_scroll, &flash_display_BitmapData_scroll); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_transparent, &flash_display_BitmapData_transparent); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_noise, &flash_display_BitmapData_noise); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_threshold, &flash_display_BitmapData_threshold); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_paletteMap, &flash_display_BitmapData_paletteMap); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_perlinNoise, &flash_display_BitmapData_perlinNoise); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_hitTest, &flash_display_BitmapData_hitTest); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getPixel, &flash_display_BitmapData_getPixel); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_unlock, &flash_display_BitmapData_unlock); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_height, &flash_display_BitmapData_height); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_copyChannel, &flash_display_BitmapData_copyChannel); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_width, &flash_display_BitmapData_width); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_clone, &flash_display_BitmapData_clone); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_colorTransform, &flash_display_BitmapData_colorTransform); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_generateFilterRect, &flash_display_BitmapData_generateFilterRect); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_compare, &flash_display_BitmapData_compare); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_fillRect, &flash_display_BitmapData_fillRect); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_setVector, &flash_display_BitmapData_setVector); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_floodFill, &flash_display_BitmapData_floodFill); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_pixelDissolve, &flash_display_BitmapData_pixelDissolve); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_setPixel, &flash_display_BitmapData_setPixel); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_setPixel32, &flash_display_BitmapData_setPixel32); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_lock, &flash_display_BitmapData_lock); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getVector, &flash_display_BitmapData_getVector); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getColorBoundsRect, &flash_display_BitmapData_getColorBoundsRect); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_getPixels, &flash_display_BitmapData_getPixels); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_merge, &flash_display_BitmapData_merge); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_rect, &flash_display_BitmapData_rect); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_applyFilter, &flash_display_BitmapData_applyFilter); - dict_put(&flash_display_BitmapData.members, &flash_display_BitmapData_dispose, &flash_display_BitmapData_dispose); - dict_put(d, &flash_text_engine_LigatureLevel, &flash_text_engine_LigatureLevel); - dict_init2(&flash_text_engine_LigatureLevel.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_LigatureLevel.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_UNCOMMON, &flash_text_engine_LigatureLevel_UNCOMMON); - dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_COMMON, &flash_text_engine_LigatureLevel_COMMON); - dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_EXOTIC, &flash_text_engine_LigatureLevel_EXOTIC); - dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_MINIMUM, &flash_text_engine_LigatureLevel_MINIMUM); - dict_put(&flash_text_engine_LigatureLevel.static_members, &flash_text_engine_LigatureLevel_NONE, &flash_text_engine_LigatureLevel_NONE); - dict_put(d, &_Infinity, &_Infinity); - dict_put(d, &flash_text_engine_FontDescription, &flash_text_engine_FontDescription); - dict_init2(&flash_text_engine_FontDescription.members, &memberinfo_type, 15); - dict_init2(&flash_text_engine_FontDescription.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_renderingMode, &flash_text_engine_FontDescription_renderingMode); - dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_cffHinting, &flash_text_engine_FontDescription_cffHinting); - dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_fontPosture, &flash_text_engine_FontDescription_fontPosture); - dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_fontName, &flash_text_engine_FontDescription_fontName); - dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_fontLookup, &flash_text_engine_FontDescription_fontLookup); - dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_locked, &flash_text_engine_FontDescription_locked); - dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_fontWeight, &flash_text_engine_FontDescription_fontWeight); - dict_put(&flash_text_engine_FontDescription.members, &flash_text_engine_FontDescription_clone, &flash_text_engine_FontDescription_clone); - dict_put(&flash_text_engine_FontDescription.static_members, &flash_text_engine_FontDescription_isFontCompatible, &flash_text_engine_FontDescription_isFontCompatible); - dict_put(d, &flash_text_engine_TextElement, &flash_text_engine_TextElement); - dict_init2(&flash_text_engine_TextElement.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TextElement.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TextElement.members, &flash_text_engine_TextElement_replaceText, &flash_text_engine_TextElement_replaceText); - dict_put(d, &flash_display_SWFVersion, &flash_display_SWFVersion); - dict_init2(&flash_display_SWFVersion.members, &memberinfo_type, 8); - dict_init2(&flash_display_SWFVersion.static_members, &memberinfo_type, 8); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH4, &flash_display_SWFVersion_FLASH4); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH7, &flash_display_SWFVersion_FLASH7); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH8, &flash_display_SWFVersion_FLASH8); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH3, &flash_display_SWFVersion_FLASH3); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH6, &flash_display_SWFVersion_FLASH6); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH9, &flash_display_SWFVersion_FLASH9); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH2, &flash_display_SWFVersion_FLASH2); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH5, &flash_display_SWFVersion_FLASH5); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH10, &flash_display_SWFVersion_FLASH10); - dict_put(&flash_display_SWFVersion.static_members, &flash_display_SWFVersion_FLASH1, &flash_display_SWFVersion_FLASH1); - dict_put(d, &flash_net_URLLoader, &flash_net_URLLoader); - dict_init2(&flash_net_URLLoader.members, &memberinfo_type, 8); - dict_init2(&flash_net_URLLoader.static_members, &memberinfo_type, 8); - dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_close, &flash_net_URLLoader_close); - dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_bytesLoaded, &flash_net_URLLoader_bytesLoaded); - dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_load, &flash_net_URLLoader_load); - dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_bytesTotal, &flash_net_URLLoader_bytesTotal); - dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_dataFormat, &flash_net_URLLoader_dataFormat); - dict_put(&flash_net_URLLoader.members, &flash_net_URLLoader_data, &flash_net_URLLoader_data); - dict_put(d, &flash_geom_Matrix, &flash_geom_Matrix); - dict_init2(&flash_geom_Matrix.members, &memberinfo_type, 31); - dict_init2(&flash_geom_Matrix.static_members, &memberinfo_type, 8); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_b, &flash_geom_Matrix_b); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_deltaTransformPoint, &flash_geom_Matrix_deltaTransformPoint); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_identity, &flash_geom_Matrix_identity); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_ty, &flash_geom_Matrix_ty); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_translate, &flash_geom_Matrix_translate); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_concat, &flash_geom_Matrix_concat); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_c, &flash_geom_Matrix_c); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_a, &flash_geom_Matrix_a); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_scale, &flash_geom_Matrix_scale); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_d, &flash_geom_Matrix_d); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_transformPoint, &flash_geom_Matrix_transformPoint); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_rotate, &flash_geom_Matrix_rotate); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_createGradientBox, &flash_geom_Matrix_createGradientBox); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_toString, &flash_geom_Matrix_toString); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_invert, &flash_geom_Matrix_invert); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_clone, &flash_geom_Matrix_clone); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_tx, &flash_geom_Matrix_tx); - dict_put(&flash_geom_Matrix.members, &flash_geom_Matrix_createBox, &flash_geom_Matrix_createBox); - dict_put(d, &flash_accessibility_Accessibility, &flash_accessibility_Accessibility); - dict_init2(&flash_accessibility_Accessibility.members, &memberinfo_type, 8); - dict_init2(&flash_accessibility_Accessibility.static_members, &memberinfo_type, 8); - dict_put(&flash_accessibility_Accessibility.static_members, &flash_accessibility_Accessibility_active, &flash_accessibility_Accessibility_active); - dict_put(&flash_accessibility_Accessibility.static_members, &flash_accessibility_Accessibility_updateProperties, &flash_accessibility_Accessibility_updateProperties); - dict_put(&flash_accessibility_Accessibility.static_members, &flash_accessibility_Accessibility_sendEvent, &flash_accessibility_Accessibility_sendEvent); - dict_put(d, &flash_net_sendToURL, &flash_net_sendToURL); - dict_put(d, &flash_filters_GlowFilter, &flash_filters_GlowFilter); - dict_init2(&flash_filters_GlowFilter.members, &memberinfo_type, 8); - dict_init2(&flash_filters_GlowFilter.static_members, &memberinfo_type, 8); - dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_blurY, &flash_filters_GlowFilter_blurY); - dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_strength, &flash_filters_GlowFilter_strength); - dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_inner, &flash_filters_GlowFilter_inner); - dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_color, &flash_filters_GlowFilter_color); - dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_clone, &flash_filters_GlowFilter_clone); - dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_quality, &flash_filters_GlowFilter_quality); - dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_knockout, &flash_filters_GlowFilter_knockout); - dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_alpha, &flash_filters_GlowFilter_alpha); - dict_put(&flash_filters_GlowFilter.members, &flash_filters_GlowFilter_blurX, &flash_filters_GlowFilter_blurX); - dict_put(d, &flash_events_FullScreenEvent, &flash_events_FullScreenEvent); - dict_init2(&flash_events_FullScreenEvent.members, &memberinfo_type, 8); - dict_init2(&flash_events_FullScreenEvent.static_members, &memberinfo_type, 8); - dict_put(&flash_events_FullScreenEvent.members, &flash_events_FullScreenEvent_toString, &flash_events_FullScreenEvent_toString); - dict_put(&flash_events_FullScreenEvent.members, &flash_events_FullScreenEvent_clone, &flash_events_FullScreenEvent_clone); - dict_put(&flash_events_FullScreenEvent.members, &flash_events_FullScreenEvent_fullScreen, &flash_events_FullScreenEvent_fullScreen); - dict_put(&flash_events_FullScreenEvent.static_members, &flash_events_FullScreenEvent_FULL_SCREEN, &flash_events_FullScreenEvent_FULL_SCREEN); - dict_put(d, &flash_display_StageDisplayState, &flash_display_StageDisplayState); - dict_init2(&flash_display_StageDisplayState.members, &memberinfo_type, 8); - dict_init2(&flash_display_StageDisplayState.static_members, &memberinfo_type, 8); - dict_put(&flash_display_StageDisplayState.static_members, &flash_display_StageDisplayState_NORMAL, &flash_display_StageDisplayState_NORMAL); - dict_put(&flash_display_StageDisplayState.static_members, &flash_display_StageDisplayState_FULL_SCREEN, &flash_display_StageDisplayState_FULL_SCREEN); - dict_put(d, &flash_text_engine_TextJustifier, &flash_text_engine_TextJustifier); - dict_init2(&flash_text_engine_TextJustifier.members, &memberinfo_type, 8); - dict_init2(&flash_text_engine_TextJustifier.static_members, &memberinfo_type, 8); - dict_put(&flash_text_engine_TextJustifier.members, &flash_text_engine_TextJustifier_lineJustification, &flash_text_engine_TextJustifier_lineJustification); - dict_put(&flash_text_engine_TextJustifier.members, &flash_text_engine_TextJustifier_locale, &flash_text_engine_TextJustifier_locale); - dict_put(&flash_text_engine_TextJustifier.members, &flash_text_engine_TextJustifier_clone, &flash_text_engine_TextJustifier_clone); - dict_put(&flash_text_engine_TextJustifier.static_members, &flash_text_engine_TextJustifier_getJustifierForLocale, &flash_text_engine_TextJustifier_getJustifierForLocale); - dict_put(d, &flash_display_StageAlign, &flash_display_StageAlign); - dict_init2(&flash_display_StageAlign.members, &memberinfo_type, 8); - dict_init2(&flash_display_StageAlign.static_members, &memberinfo_type, 15); - dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_RIGHT, &flash_display_StageAlign_RIGHT); - dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_BOTTOM, &flash_display_StageAlign_BOTTOM); - dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_BOTTOM_LEFT, &flash_display_StageAlign_BOTTOM_LEFT); - dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_TOP_RIGHT, &flash_display_StageAlign_TOP_RIGHT); - dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_TOP, &flash_display_StageAlign_TOP); - dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_LEFT, &flash_display_StageAlign_LEFT); - dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_BOTTOM_RIGHT, &flash_display_StageAlign_BOTTOM_RIGHT); - dict_put(&flash_display_StageAlign.static_members, &flash_display_StageAlign_TOP_LEFT, &flash_display_StageAlign_TOP_LEFT); - dict_put(d, &_NaN, &_NaN); - dict_put(d, &_ReferenceError, &_ReferenceError); - dict_init2(&_ReferenceError.members, &memberinfo_type, 8); - dict_init2(&_ReferenceError.static_members, &memberinfo_type, 8); - dict_put(&_ReferenceError.static_members, &_ReferenceError_length, &_ReferenceError_length); - dict_put(d, &flash_display_Shape, &flash_display_Shape); - dict_init2(&flash_display_Shape.members, &memberinfo_type, 8); - dict_init2(&flash_display_Shape.static_members, &memberinfo_type, 8); - dict_put(&flash_display_Shape.members, &flash_display_Shape_graphics, &flash_display_Shape_graphics); - _NaN_constant.f = __builtin_nan(""); - _Infinity_constant.f = __builtin_inf(); - return d; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.h deleted file mode 100644 index f407c7cdf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/builtin.h +++ /dev/null @@ -1,33 +0,0 @@ -/* builtin.h - - Flash AVM2 ABC Actionscript standard library - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __builtin_h__ -#define __builtin_h__ - -#include "../q.h" -#include "../types.h" -#include "registry.h" - -dict_t* builtin_getclasses(); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/code.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/code.c deleted file mode 100644 index fb4bf5327..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/code.c +++ /dev/null @@ -1,1289 +0,0 @@ -/* code.c - - Routines for handling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include "code.h" -#include "pool.h" - -#define OP_REGISTER 1 -#define OP_STACK_ARGS 2 -#define OP_STACK_NS 4 -#define OP_SET_DXNS 8 -#define OP_RETURN 16 -#define OP_THROW 32 -#define OP_BRANCH 64 -#define OP_JUMP 128 -#define OP_LABEL 256 -#define OP_LOOKUPSWITCH 512 -#define OP_NEED_ACTIVATION 1024 -#define OP_STACK_ARGS2 2048 -#define OP_INTERNAL 32768 - -/* 2 = u30 index into multiname - m = u30 index into method - n = u30 number of params - i = u30 index into method info - b = byte - c = u30 index into class - N = u30 index into namespaces - s = string (u30 index into strings) - S = switch - u = u30 - r = register -*/ - -opcode_t opcodes[]={ -{0xa0, "add", "", -2, 1, 0, 0}, -{0xc5, "add_i", "", -2, 1, 0, 0}, -{0x86, "astype", "2", -1, 1, 0, 0}, -{0x87, "astypelate", "", -2, 1, 0, 0}, -{0xA8, "bitand", "", -2, 1, 0, 0}, -{0x97, "bitnot", "", -1, 1, 0, 0}, -{0xa9, "bitor", "", -2, 1, 0, 0}, -{0xaa, "bitxor", "", -2, 1, 0, 0}, -{0x41, "call", "n", -2, 1, 0, OP_STACK_ARGS}, -{0x43, "callmethod", "mn", -1, 1, 0, OP_STACK_ARGS}, -{0x4c, "callproplex", "2n", -1, 1, 0, OP_STACK_ARGS|OP_STACK_NS}, -{0x46, "callproperty", "2n", -1, 1, 0, OP_STACK_ARGS|OP_STACK_NS}, -{0x4f, "callpropvoid", "2n", -1, 0, 0, OP_STACK_ARGS|OP_STACK_NS}, -{0x44, "callstatic", "in", -1, 1, 0, OP_STACK_ARGS}, -{0x45, "callsuper", "2n", -1, 1, 0, OP_STACK_ARGS|OP_STACK_NS}, -{0x4e, "callsupervoid", "2n", -1, 0, 0, OP_STACK_ARGS|OP_STACK_NS}, -{0x78, "checkfilter", "", -1, 1, 0, 0}, -{0x80, "coerce", "2", -1, 1, 0, 0}, -{0x82, "coerce_a", "", -1, 1, 0, 0}, -{0x85, "coerce_s", "", -1, 1, 0, 0}, -{0x42, "construct", "n", -1, 1, 0, OP_STACK_ARGS}, -{0x4a, "constructprop", "2n", -1, 1, 0, OP_STACK_ARGS|OP_STACK_NS}, -{0x49, "constructsuper", "n", -1, 0, 0, OP_STACK_ARGS}, -{0x76, "convert_b", "", -1, 1, 0, 0}, -{0x73, "convert_i", "", -1, 1, 0, 0}, -{0x75, "convert_d", "", -1, 1, 0, 0}, -{0x77, "convert_o", "", -1, 1, 0, 0}, -{0x74, "convert_u", "", -1, 1, 0, 0}, -{0x70, "convert_s", "", -1, 1, 0, 0}, -{0xef, "debug", "D", 0, 0, 0, 0}, -{0xf1, "debugfile", "s", 0, 0, 0, 0}, -{0xf0, "debugline", "u", 0, 0, 0, 0}, -{0x94, "declocal", "r", 0, 0, 0, OP_REGISTER}, -{0xc3, "declocal_i", "r", 0, 0, 0, OP_REGISTER}, -{0x93, "decrement", "", -1, 1, 0, 0}, -{0xc1, "decrement_i", "", -1, 1, 0, 0}, -{0x6a, "deleteproperty", "2", -1, 1, 0, OP_STACK_NS}, -{0xa3, "divide", "", -2, 1, 0, 0}, -{0x2a, "dup", "", -1, 2, 0, 0}, -{0x06, "dxns", "s", 0, 0, 0, OP_SET_DXNS}, -{0x07, "dxnslate", "", -1, 0, 0, OP_SET_DXNS}, -{0xab, "equals", "", -2, 1, 0, 0}, -{0x72, "esc_xattr", "", -1, 1, 0, 0}, -{0x71, "esc_xelem", "", -1, 1, 0, 0}, -{0x5e, "findproperty", "2", 0, 1, 0, OP_STACK_NS}, -{0x5d, "findpropstrict", "2", 0, 1, 0, OP_STACK_NS}, -{0x59, "getdescendants", "2", -1, 1, 0, OP_STACK_NS}, -{0x64, "getglobalscope", "", 0, 1, 0, 0}, -{0x6e, "getglobalslot", "u", 0, 1, 0, 0}, -{0x60, "getlex", "2", 0, 1, 0, 0}, //multiname may not be runtime -{0x62, "getlocal", "r", 0, 1, 0, OP_REGISTER}, -{0xd0, "getlocal_0", "", 0, 1, 0, OP_REGISTER}, -{0xd1, "getlocal_1", "", 0, 1, 0, OP_REGISTER}, -{0xd2, "getlocal_2", "", 0, 1, 0, OP_REGISTER}, -{0xd3, "getlocal_3", "", 0, 1, 0, OP_REGISTER}, -{0x66, "getproperty", "2", -1, 1, 0, OP_STACK_NS}, -{0x65, "getscopeobject", "u", 0, 1, 0, 0}, // u = index into scope stack -{0x6c, "getslot", "u", -1, 1, 0, 0}, -{0x04, "getsuper", "2", -1, 1, 0, OP_STACK_NS}, -{0xaf, "greaterthan", "", -2, 1, 0, 0}, -{0xb0, "greaterequals", "", -2, 1, 0, 0}, -{0x1f, "hasnext", "", -2, 1, 0, 0}, -{0x32, "hasnext2", "rr", 0, 1, 0, OP_REGISTER}, -{0x13, "ifeq", "j", -2, 0, 0, OP_BRANCH}, -{0x12, "iffalse", "j", -1, 0, 0, OP_BRANCH}, -{0x18, "ifge", "j", -2, 0, 0, OP_BRANCH}, -{0x17, "ifgt", "j", -2, 0, 0, OP_BRANCH}, -{0x16, "ifle", "j", -2, 0, 0, OP_BRANCH}, -{0x15, "iflt", "j", -2, 0, 0, OP_BRANCH}, -{0x0f, "ifnge", "j", -2, 0, 0, OP_BRANCH}, -{0x0e, "ifngt", "j", -2, 0, 0, OP_BRANCH}, -{0x0d, "ifnle", "j", -2, 0, 0, OP_BRANCH}, -{0x0c, "ifnlt", "j", -2, 0, 0, OP_BRANCH}, -{0x14, "ifne", "j", -2, 0, 0, OP_BRANCH}, -{0x19, "ifstricteq", "j", -2, 0, 0, OP_BRANCH}, -{0x1a, "ifstrictne", "j", -2, 0, 0, OP_BRANCH}, -{0x11, "iftrue", "j", -1, 0, 0, OP_BRANCH}, -{0xb4, "in", "", -2, 1, 0, 0}, -{0x92, "inclocal", "r", 0, 0, 0, OP_REGISTER}, -{0xc2, "inclocal_i", "r", 0, 0, 0, OP_REGISTER}, -{0x91, "increment", "", -1, 1, 0, 0}, -{0xc0, "increment_i", "", -1, 1, 0, 0}, -{0x68, "initproperty", "2", -2, 0, 0, OP_STACK_NS}, -{0xb1, "instanceof", "", -2, 1, 0, 0}, -{0xb2, "istype", "2", -1, 1, 0, 0}, // may not be a runtime multiname -{0xb3, "istypelate", "", -2, 1, 0, 0}, -{0x10, "jump", "j", 0, 0, 0, OP_JUMP}, -{0x08, "kill", "r", 0, 0, 0, OP_REGISTER}, -{0x09, "label", "", 0, 0, 0, OP_LABEL}, -{0xae, "lessequals", "", -2, 1, 0, 0}, -{0xad, "lessthan", "", -2, 1, 0, 0}, -{0x1b, "lookupswitch", "S", -1, 0, 0, OP_LOOKUPSWITCH}, -{0xa5, "lshift", "", -2, 1, 0, 0}, -{0xa4, "modulo", "", -2, 1, 0, 0}, -{0xa2, "multiply", "", -2, 1, 0, 0}, -{0xc7, "multiply_i", "", -2, 1, 0, 0}, -{0x90, "negate", "", -1, 1, 0, 0}, -{0xc4, "negate_i", "", -1, 1, 0, 0}, -{0x57, "newactivation", "", 0, 1, 0, OP_NEED_ACTIVATION}, -{0x56, "newarray", "n", 0, 1, 0, OP_STACK_ARGS}, -{0x5a, "newcatch", "u", 0, 1, 0, 0}, //u = index into exception_info -{0x58, "newclass", "c", -1, 1, 0, 0}, //c = index into class_info -{0x40, "newfunction", "m", 0, 1, 0, 0}, //i = index into method_info -{0x55, "newobject", "n", 0, 1, 0, OP_STACK_ARGS2}, -{0x1e, "nextname", "", -2, 1, 0, 0}, -{0x23, "nextvalue", "", -2, 1, 0, 0}, -{0x02, "nop", "", 0, 0, 0, 0}, -{0x96, "not", "", -1, 1, 0 ,0}, -{0x29, "pop", "", -1, 0, 0, 0}, -{0x1d, "popscope", "", 0, 0,-1, 0}, -{0x24, "pushbyte", "b", 0, 1, 0, 0}, -{0x2f, "pushdouble", "f", 0, 1, 0, 0}, //index into floats -{0x27, "pushfalse", "", 0, 1, 0, 0}, -{0x2d, "pushint", "I", 0, 1, 0, 0}, //index into ints -{0x31, "pushnamespace", "N", 0, 1, 0, 0}, //index into namespace -{0x28, "pushnan", "", 0, 1, 0, 0}, -{0x20, "pushnull", "", 0, 1, 0, 0}, -{0x30, "pushscope", "", -1, 0, 1, 0}, -{0x25, "pushshort", "u", 0, 1, 0, 0}, -{0x2c, "pushstring", "s", 0, 1, 0, 0}, -{0x26, "pushtrue", "", 0, 1, 0, 0}, -{0x2e, "pushuint", "U", 0, 1, 0, 0}, //index into uints -{0x21, "pushundefined", "", 0, 1, 0, 0}, -{0x1c, "pushwith", "", -1, 0, 1, 0}, -{0x48, "returnvalue", "", -1, 0, 0, OP_RETURN}, -{0x47, "returnvoid", "", 0, 0, 0, OP_RETURN}, -{0xa6, "rshift", "", -2, 1, 0, 0}, -{0x63, "setlocal", "r", -1, 0, 0, OP_REGISTER}, -{0xd4, "setlocal_0", "", -1, 0, 0, OP_REGISTER}, -{0xd5, "setlocal_1", "", -1, 0, 0, OP_REGISTER}, -{0xd6, "setlocal_2", "", -1, 0, 0, OP_REGISTER}, -{0xd7, "setlocal_3", "", -1, 0, 0, OP_REGISTER}, -{0x6f, "setglobalslot", "u", -1, 0, 0, 0}, -{0x61, "setproperty", "2", -2, 0, 0, OP_STACK_NS}, -{0x6d, "setslot", "u", -2, 0, 0, 0}, -{0x05, "setsuper", "2", -2, 0, 0, OP_STACK_NS}, -{0xac, "strictequals", "", -2, 1, 0, 0}, -{0xa1, "subtract", "", -2, 1, 0, 0}, -{0xc6, "subtract_i", "", -2, 1, 0, 0}, -{0x2b, "swap", "", -2, 2, 0, 0}, -{0x03, "throw", "", -1, 0, 0, OP_THROW}, -{0x95, "typeof", "", -1, 1, 0, 0}, -{0xa7, "urshift", "", -2, 1, 0, 0}, - -/* opcodes not documented, but seen in the wild */ -{0x53, "applytype", "n", -1, 1, 0, OP_STACK_ARGS}, //seen in builtin.abc - -/* dummy instructions. Warning: these are not actually supported by flash */ -{0xfb, "__pushpackage__", "s", 0, 1, 0, OP_INTERNAL}, -{0xfc, "__rethrow__", "", 0, 0, 0, OP_THROW|OP_INTERNAL}, -{0xfd, "__fallthrough__", "s", 0, 0, 0, OP_INTERNAL}, -{0xfe, "__continue__", "s", 0, 0, 0, OP_RETURN|OP_INTERNAL}, -{0xff, "__break__", "s", 0, 0, 0, OP_RETURN|OP_INTERNAL}, -}; - -static opcode_t* op2op[256] = {0,0,0}; - -static inline opcode_t* opcode_get(U8 op) -{ - int t; - if(!op2op[0x02]) { - memset(op2op, 0, sizeof(op2op)); - for(t=0;tpos; - } - if(pos < 0 || - pos > len || - (pos!=len && !bytepos[pos])) { - /* flex likes to generate these. yuck. */ - if(c) { - opcode_t*op = opcode_get(c->opcode); - fprintf(stderr, "Warning: Invalid jump instruction \"%s\" from %d to %d (%d)\n", op->name, c->pos, pos, len); - } else { - fprintf(stderr, "Warning: Invalid jump to %d (%d)\n", pos, len); - } - return 0; - } else { - if(pos==len) { - //opcode_t*op = opcode_get(c->opcode); - //fprintf(stderr, "Warning: jump beyond end of code in instruction %s at position %d\n", op->name, c->pos); - return 0; - } else { - return bytepos[pos]; - } - } -} -code_t* code_atposition(codelookup_t*l, int pos) -{ - return pos2code(l->bytepos, 0, pos, l->len); -} - -void lookupswitch_print(lookupswitch_t*l) -{ - printf("default: %p\n", l->def); - code_list_t*t = l->targets; - while(t) { - printf("target: %p\n", t->code); - t = t->next; - } -} - -code_t*code_parse(TAG*tag, int len, abc_file_t*file, pool_t*pool, codelookup_t**codelookup) -{ - code_t*head=0; - code_t*code=0; - int start=tag->pos; - int end=tag->pos+len; - //printf("-->\n");fflush(stdout); - - code_t**bytepos = rfx_calloc(sizeof(code_t*)*len); - - while(tag->pospos-start; - U8 opcode = swf_GetU8(tag); - opcode_t*op = opcode_get(opcode); - if(!op) { - fprintf(stderr, "Can't parse opcode %02x\n", opcode); - continue; - } - //printf("%s\n", op->name);fflush(stdout); - NEW(code_t,c); - c->pos = codepos; - - bytepos[codepos] = c; - - if(!head) { - head = code = c; - } else { - code->next = c; - c->prev = code; - code = c; - } - - c->opcode = opcode; - - char*p = op->params; - int pos = 0; - while(*p) { - void*data = 0; - if(*p == 'n') { // number - data = (void*)(ptroff_t)swf_GetU30(tag); - } else if(*p == '2') { //multiname - data = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); - } else if(*p == 'N') { //namespace - data = namespace_clone(pool_lookup_namespace(pool, swf_GetU30(tag))); - } else if(*p == 'U') { //uint - data = (void*)(ptroff_t)pool_lookup_uint(pool, swf_GetU30(tag)); - } else if(*p == 'I') { //int - data = (void*)(ptroff_t)pool_lookup_int(pool, swf_GetU30(tag)); - } else if(*p == 'f') { //int - double*fp = malloc(sizeof(double)); - *fp = pool_lookup_float(pool, swf_GetU30(tag)); - data = fp; - } else if(*p == 'm') { //method - data = array_getvalue(file->methods, swf_GetU30(tag)); - } else if(*p == 'c') { //classinfo - data = array_getvalue(file->classes, swf_GetU30(tag)); - } else if(*p == 'i') { - data = array_getvalue(file->method_bodies, swf_GetU30(tag)); - } else if(*p == 'u') { // generic integer - data = (void*)(ptroff_t)swf_GetU30(tag); - } else if(*p == 'r') { // local register - data = (void*)(ptroff_t)swf_GetU30(tag); - } else if(*p == 'b') { // byte - data = (void*)(ptroff_t)swf_GetU8(tag); - } else if(*p == 'j') { // jump - int j = swf_GetS24(tag); - data = (void*)(ptroff_t)j; - } else if(*p == 's') { // string - string_t s = pool_lookup_string2(pool, swf_GetU30(tag)); - data = string_dup3(&s); - } else if(*p == 'D') { // debug - /*type, usually 1*/ - U8 type = swf_GetU8(tag); - if(type!=1) - fprintf(stderr, "Unknown debug type: %02x\n", type); - /*register name*/ - code->data[0] = strdup((char*)pool_lookup_string(pool, swf_GetU30(tag))); - /*register index*/ - code->data[1] = (void*)(ptroff_t)swf_GetU8(tag); - /*unused*/ - swf_GetU30(tag); - } else if(*p == 'S') { // switch statement - lookupswitch_t*l = malloc(sizeof(lookupswitch_t)); - l->def = (code_t*)(ptroff_t)swf_GetS24(tag); - l->targets = list_new(); - int num = swf_GetU30(tag)+1; - int t; - for(t=0;ttargets, (code_t*)(ptroff_t)swf_GetS24(tag)); - data = l; - } else { - printf("Can't parse opcode param type \"%c\" (for op %02x %s).\n", *p, code->opcode, op->name); - return 0; - } - code->data[pos++] = data; - p++; - } - } - -//#define DEBUG_BYTES -#ifdef DEBUG_BYTES - int t; - for(t=0;topcode); - if(op->flags & (OP_JUMP|OP_BRANCH)) { - printf("%50d) %02x %s %d\n", t, tag->data[start+t], op->name, c->data[0]); - } else { - printf("%50d) %02x %s\n", t, tag->data[start+t], op->name); - } - } else { - printf("%50d) %02x\n", t, tag->data[start+t]); - } - } - //printf("%05d) %02x\n", t, tag->data[start+t]); -#endif - - code_t*c = head; - while(c) { - opcode_t*op = opcode_get(c->opcode); - if(op->flags & (OP_JUMP|OP_BRANCH)) { - int j = ((int)(ptroff_t)c->data[0]); - c->branch = pos2code(bytepos,c,j+4,len); - } else if(op->flags & (OP_LOOKUPSWITCH)) { - lookupswitch_t*l = (lookupswitch_t*)c->data[0]; - int offset = 0; - l->def = pos2code(bytepos,c,(ptroff_t)l->def+offset,len); - code_list_t*t=l->targets; - while(t) { - t->code = pos2code(bytepos,c,(ptroff_t)t->code+offset,len); - t = t->next; - } - } - c = c->next; - } - - if(codelookup) { - (*codelookup) = malloc(sizeof(codelookup_t)); - (*codelookup)->bytepos = bytepos; - (*codelookup)->len = len; - } else { - free(bytepos); - } - - return head; -} - -void codelookup_free(codelookup_t*codelookup) -{ - free(codelookup->bytepos);codelookup->bytepos=0; - free(codelookup); -} - -void code_free(code_t*c) -{ - c = code_start(c); - while(c) { - code_t*next = c->next; - opcode_t*op = opcode_get(c->opcode); - char*p = op?op->params:""; - int pos=0; - while(*p) { - void*data = c->data[pos]; - if(*p == '2') { //multiname - multiname_destroy(data); - } else if(*p == 'N') { //namespace - namespace_destroy(data); - } else if(strchr("sDf", *p)) { - free(data); - } else if(strchr("S", *p)) { - lookupswitch_t*l = (lookupswitch_t*)data; - list_free(l->targets);l->targets=0; - free(l); - } - c->data[pos]=0; - p++;pos++; - } - memset(c, 0, sizeof(c)); - free(c); - c = next; - } -} - -static int opcode_write(TAG*tag, code_t*c, pool_t*pool, abc_file_t*file, int length) -{ - opcode_t*op = opcode_get(c->opcode); - char*p = op->params; - int pos = 0; - int len = 0; - - if(tag) - swf_SetU8(tag, c->opcode); - len++; - - if(op->flags & OP_INTERNAL) { - if(c->opcode == OPCODE___BREAK__ || - c->opcode == OPCODE___CONTINUE__) { - fprintf(stderr, "Unresolved %s\n", op->name); - } else { - fprintf(stderr, "Error: writing undefined internal opcode %s\n", op->name); - } - } - - while(*p) { - void*data = c->data[pos++]; - assert(pos<=2); - switch(*p) { - case 'n': { // number - len += swf_SetU30(tag, (ptroff_t)data); - break; - } - case '2': { //multiname - multiname_t*m = (multiname_t*)data; - len += swf_SetU30(tag, pool_register_multiname(pool, m)); - break; - } - case 'N': { //namespace - namespace_t*ns = (namespace_t*)data; - len += swf_SetU30(tag, pool_register_namespace(pool, ns)); - break; - } - case 'm': { //method - abc_method_t*m = (abc_method_t*)data; - len += swf_SetU30(tag, m->index); - break; - } - case 'c': { //classinfo - abc_class_t*cls = (abc_class_t*)data; - len += swf_SetU30(tag, cls->index); - break; - } - case 'i': { //methodbody - abc_method_body_t*m = (abc_method_body_t*)data; - len += swf_SetU30(tag, m->index); - break; - } - case 'I': { // int - len += swf_SetU30(tag, pool_register_int(pool, (ptroff_t)data)); - break; - } - case 'U': { // uint - len += swf_SetU30(tag, pool_register_uint(pool, (ptroff_t)data)); - break; - } - case 'f': { // float - len += swf_SetU30(tag, pool_register_float(pool, *(double*)data)); - break; - } - case 'u': { // integer - len += swf_SetU30(tag, (ptroff_t)data); - break; - } - case 'r': { // integer - len += swf_SetU30(tag, (ptroff_t)data); - break; - } - case 'b': { // byte - if(tag) - swf_SetU8(tag, (ptroff_t)data); - len++; - break; - } - case 'j': { // jump - int skip = length-c->pos-4; - if(c->branch) - skip = (c->branch->pos) - c->pos - 4; - len += swf_SetS24(tag, skip); - break; - } - case 's': { // string - int index = pool_register_string2(pool, (string_t*)data); - len += swf_SetU30(tag, index); - break; - } - case 'D': { // debug statement - if(tag) - swf_SetU8(tag, 1); - len++; - len+=swf_SetU30(tag, pool_register_string(pool,c->data[0])); - if(tag) - swf_SetU8(tag, (ptroff_t)c->data[1]); - len++; - len+=swf_SetU30(tag, 0); - break; - } - case 'S': { // switch statement - lookupswitch_t*l = (lookupswitch_t*)data; - int offset = 0; - len+=swf_SetS24(tag, l->def->pos-c->pos+offset); //default - code_list_t*t = l->targets; - if(list_length(t)) { - len+=swf_SetU30(tag, list_length(t)-1); //nr-1 - code_list_t*t = l->targets; - while(t) { - len+=swf_SetS24(tag, t->code->pos - c->pos+offset); - t = t->next; - } - } else { - len+=swf_SetU30(tag, 0); //nr-1 - len+=swf_SetS24(tag, l->def->pos-c->pos+offset); - } - break; - } - default: - printf("Can't parse opcode param type \"%c\"\n", *p); - } - p++; - } - return len; -} - -void code_write(TAG*tag, code_t*code, pool_t*pool, abc_file_t*file) -{ - code = code_start(code); - int pos = 0; - int length = 0; - code_t*c = code; - while(c) { - c->pos = pos; - pos += opcode_write(0, c, pool, file, 0); - c = c->next; - } - length = pos; - swf_SetU30(tag, pos); - int start = tag->len; - c = code; - pos = 0; - while(c) { - opcode_t*op = opcode_get(code->opcode); - if(op->flags&(OP_BRANCH|OP_JUMP)) { - int skip = 0; - } - pos += opcode_write(tag, c, pool, file, length); - c = c->next; - } - assert(tag->len - start == pos); -} - -typedef struct { - int stackpos; - int scopepos; - code_t*code; - char flags; - char error; -} stackpos_t; - -typedef struct { - stackpos_t*stack; - int num; - int maxlocal; - int maxstack; - int maxscope; - int flags; -} currentstats_t; - -static int stack_minus(code_t*c) -{ - opcode_t*op = opcode_get(c->opcode); - if(op->stack_minus>0) { - fprintf(stderr, "Invalid opcode entry %02x %s\n", c->opcode, op->name); - } - int stack = op->stack_minus; - if(op->flags&OP_STACK_NS) { - multiname_t*m = (multiname_t*)c->data[0]; - if(multiname_late_namespace(m)) - stack--; - if(multiname_late_name(m)) - stack--; - } - if(op->flags&OP_STACK_ARGS || op->flags&OP_STACK_ARGS2) { - assert(strchr(op->params, 'n')); - int nr = (ptroff_t)(op->params[0]=='n'?c->data[0]:c->data[1]); - stack-=nr; - if(op->flags&OP_STACK_ARGS2) - stack-=nr; - } - return stack; -} -static void handleregister(currentstats_t*stats, int reg) -{ - if(reg+1 > stats->maxlocal) - stats->maxlocal = reg+1; -} - -#define FLAG_SEEN 1 -#define FLAG_ERROR 2 - -static void dumpstack(currentstats_t*stats) -{ - int t; - for(t=0;tnum;t++) { - code_t*c = stats->stack[t].code; - opcode_t*op = opcode_get(c->opcode); - printf("%05d) %c %d:%d %s", t, (stats->stack[t].flags&FLAG_SEEN)?'x':'|', - stats->stack[t].stackpos, - stats->stack[t].scopepos, - op->name); - - if(op->flags&(OP_BRANCH|OP_JUMP)) { - if(c->branch) - printf(" ->%d\n", c->branch->pos); - else - printf(" 00000000\n"); - } - if(op->params[0]=='2') { - printf(" %s", multiname_tostring(c->data[0])); - } else if(op->params[0]=='N') { - printf(" %s", namespace_tostring(c->data[0])); - } - printf("\n"); - } -} - -static char callcode(currentstats_t*stats, int pos, int stack, int scope) -{ - while(posnum) { - if(stats->stack[pos].flags&FLAG_SEEN) { - if(stats->stack[pos].stackpos != stack || - stats->stack[pos].scopepos != scope) { - //dumpstack(stats); - stats->stack[pos].flags |= FLAG_ERROR; - fprintf(stderr, "Stack mismatch at pos %d\n", pos); - fprintf(stderr, "Should be: %d:%d, is: %d:%d\n", stack, scope, - stats->stack[pos].stackpos, stats->stack[pos].scopepos); - - /* return error here if we do verification */ - //return 0; - } - return 1; - } - - stats->stack[pos].flags |= FLAG_SEEN; - stats->stack[pos].stackpos = stack; - stats->stack[pos].scopepos = scope; - - code_t*c = stats->stack[pos].code; - opcode_t*op = opcode_get(c->opcode); - - //printf("Walking %s at position %d, stack=%d, scope=%d\n", op->name, pos, stack, scope); - - stack += stack_minus(c); - - if(stack<0) { - stats->stack[pos].flags |= FLAG_ERROR; - fprintf(stderr, "error: stack underflow at %d (%s)\n", pos, op->name); - - /* if we would do true verification (if we would be a vm), this is - where we would return the error - return 0; - */ - } - - stack += op->stack_plus; - scope += op->scope_stack_plus; - - if(stack > stats->maxstack) - stats->maxstack = stack; - if(scope > stats->maxscope) - stats->maxscope = scope; - - if(op->flags & OP_SET_DXNS) - stats->flags |= FLAGS_SET_DXNS; - if(op->flags & OP_NEED_ACTIVATION) - stats->flags |= FLAGS_ACTIVATION; - - if(c->opcode == OPCODE_NEWCLASS) { - abc_class_t*cls = (abc_class_t*)(c->data[0]); - if(scope > cls->init_scope_depth) - cls->init_scope_depth = scope; - } - if(c->opcode == OPCODE_NEWFUNCTION) { - abc_method_t*m = (abc_method_t*)(c->data[0]); - if(m->body && scope > m->body->init_scope_depth) - m->body->init_scope_depth = scope; - } - - if(op->flags & OP_REGISTER) { - char*p = op->params; - int pos = 0; - char ok=0; - while(*p) { - if(*p=='r') { - handleregister(stats, (ptroff_t)c->data[pos]); - ok = 1; - } - p++; - } - if(!ok) { - handleregister(stats, c->opcode&3); - } - } - if(op->flags&OP_RETURN) { - if(OP_RETURN==0x48/*returnvalue*/) { - if(stack!=1) { - stats->stack[pos].flags |= FLAG_ERROR; - fprintf(stderr, "return(value) with stackposition %d\n", stack); - } - } else if(OP_RETURN==0x47) { - if(stack!=0) { - stats->stack[pos].flags |= FLAG_ERROR; - fprintf(stderr, "return(void) with stackposition %d\n", stack); - } - } - } - if(op->flags & (OP_THROW|OP_RETURN)) - return 1; - if(op->flags & OP_JUMP) { - if(!c->branch) { - stats->stack[pos].flags |= FLAG_ERROR; - fprintf(stderr, "Error: Invalid jump target in instruction %s at position %d.\n", op->name, pos); - return 0; - } - c = c->branch; - pos = c->pos; - continue; - } - if(op->flags & OP_BRANCH) { - if(!c->branch) { - stats->stack[pos].flags |= FLAG_ERROR; - fprintf(stderr, "Error: Invalid jump target in instruction %s at position %d\n", op->name, pos); - return 0; - } - int newpos = c->branch->pos; - if(!callcode(stats, newpos, stack, scope)) - return 0; - } - if(op->flags & OP_LOOKUPSWITCH) { - lookupswitch_t*l = c->data[0]; - if(!l->def) { - stats->stack[pos].flags |= FLAG_ERROR; - fprintf(stderr, "Error: Invalid jump target in instruction %s at position %d\n", op->name, pos); - return 0; - } - if(!callcode(stats, l->def->pos, stack, scope)) - return 0; - code_list_t*t = l->targets; - while(t) { - if(!t->code) { - stats->stack[pos].flags |= FLAG_ERROR; - fprintf(stderr, "Error: Invalid jump target in instruction %s at position %d\n", op->name, pos); - return 0; - } - if(!callcode(stats, t->code->pos, stack, scope)) - return 0; - t = t->next; - } - } - - pos++; - if(posnum) { - assert(c->next == stats->stack[pos].code); - } - } - return 1; -} - -static currentstats_t* code_get_stats(code_t*code, abc_exception_list_t*exceptions) -{ - code = code_start(code); - int num = 0; - code_t*c = code; - while(c) { - num++; - c = c->next; - } - currentstats_t* current = malloc(sizeof(currentstats_t)); - current->stack = rfx_calloc(sizeof(stackpos_t)*num); - current->maxlocal = 0; - current->maxstack = 0; - current->maxscope = 0; - current->num = num; - current->flags = 0; - -//#define DEBUG_BYTES -#ifdef DEBUG_BYTES - int t; - c = code; - for(t=0;topcode); - if(op->flags & (OP_JUMP|OP_BRANCH)) { - printf("%05d) %s %p\n", t, op->name, c->branch); - } else if(op->params[0]=='2') { - printf("%05d) %s %s\n", t, op->name, multiname_tostring(c->data[0])); - } else if(op->params[0]=='N') { - printf("%05d) %s %s\n", t, op->name, namespace_tostring(c->data[0])); - } else { - printf("%05d) %s\n", t, op->name); - } - c = c->next; - } - //printf("%05d) %02x\n", t, tag->data[start+t]); -#endif - - num = 0; - c = code; - while(c) { - //crosslink - current->stack[num].code = c; - c->pos = num; - num++; - c = c->next; - } - - if(!callcode(current, 0, 0, 0)) { - free(current); - return 0; - } - abc_exception_list_t*e = exceptions; - while(e) { - if(e->abc_exception->target) - callcode(current, e->abc_exception->target->pos, 1, 0); - e = e->next; - } - - return current; -} - -void stats_free(currentstats_t*stats) -{ - if(stats) { - free(stats->stack);stats->stack=0; - free(stats); - } -} - -int code_dump(code_t*c) -{ - code_t*cc = code_start(c); - while(cc) { - assert(!cc->next || cc->next->prev == cc); - cc = cc->next; - } - - return code_dump2(c, 0, 0, "", stdout); -} -int code_dump2(code_t*c, abc_exception_list_t*exceptions, abc_file_t*file, char*prefix, FILE*fo) -{ - abc_exception_list_t*e = exceptions; - c = code_start(c); - currentstats_t*stats = code_get_stats(c, exceptions); - - int pos = 0; - while(c) { - U8 opcode = c->opcode; - char found = 0; - opcode_t*op = opcode_get(opcode); - - e = exceptions; - while(e) { - if(c==e->abc_exception->from) - fprintf(fo, "%s TRY {\n", prefix); - if(c==e->abc_exception->target) { - char*s1 = multiname_tostring(e->abc_exception->exc_type); - char*s2 = multiname_tostring(e->abc_exception->var_name); - fprintf(fo, "%s CATCH(%s %s)\n", prefix, s1, s2); - free(s1); - free(s2); - } - e = e->next; - } - - if(!op) { - fprintf(stderr, "Can't parse opcode %02x.\n", opcode); - return 0; - } else { - char*p = op->params; - char first = 1; - int i=0; - - if(stats) { - int f = stats->stack[c->pos].flags; - fprintf(fo, "%s%05d) %c %d:%d %s ", prefix, c->pos, - (f&FLAG_ERROR)?'E':((f&FLAG_SEEN)?'+':'|'), - stats->stack[c->pos].stackpos, - stats->stack[c->pos].scopepos, - op->name); - } else { - fprintf(fo, "%s%05d) ? ?:? %s ", prefix, c->pos, op->name); - } - - while(*p) { - void*data = c->data[i]; - if(i>0) - printf(", "); - - if(*p == 'n') { - int n = (ptroff_t)data; - fprintf(fo, "%d params", n); - } else if(*p == '2') { - multiname_t*n = (multiname_t*)data; - char* m = multiname_tostring(n); - fprintf(fo, "%s", m); - free(m); - } else if(*p == 'N') { - namespace_t*ns = (namespace_t*)data; - char* m = namespace_tostring(ns); - fprintf(fo, "%s", m); - free(m); - } else if(*p == 'm') { - abc_method_t*m = (abc_method_t*)data; - fprintf(fo, "[method %08x %s]", m->index, m->name); - } else if(*p == 'c') { - abc_class_t*cls = (abc_class_t*)data; - char*classname = multiname_tostring(cls->classname); - fprintf(fo, "[classinfo %08x %s]", cls->index, classname); - free(classname); - } else if(*p == 'i') { - abc_method_body_t*b = (abc_method_body_t*)data; - fprintf(fo, "[methodbody]"); - } else if(*p == 'u' || *p == 'I' || *p == 'U') { - int n = (ptroff_t)data; - fprintf(fo, "%d", n); - } else if(*p == 'f') { - double f = *(double*)data; - fprintf(fo, "%f", f); - } else if(*p == 'r') { - int n = (ptroff_t)data; - fprintf(fo, "r%d", n); - } else if(*p == 'b') { - int b = (signed char)(ptroff_t)data; - fprintf(fo, "%d", b); - } else if(*p == 'j') { - if(c->branch) - fprintf(fo, "->%d", c->branch->pos); - else - fprintf(fo, "%p", c->branch); - } else if(*p == 's') { - char*s = string_escape((string_t*)data); - fprintf(fo, "\"%s\"", s); - free(s); - } else if(*p == 'D') { - fprintf(fo, "[register %02x=%s]", (int)(ptroff_t)c->data[1], (char*)c->data[0]); - } else if(*p == 'S') { - lookupswitch_t*l = c->data[0]; - fprintf(fo, "["); - if(l->def) - fprintf(fo, "default->%d", l->def->pos); - else - fprintf(fo, "default->00000000"); - code_list_t*t = l->targets; - while(t) { - if(t->code) - fprintf(fo, ",->%d", t->code->pos); - else - fprintf(fo, ",->00000000"); - t = t->next; - } - fprintf(fo, "]"); - } else { - fprintf(stderr, "Can't parse opcode param type \"%c\"\n", *p); - return 0; - } - p++; - i++; - first = 0; - } - fprintf(fo, "\n"); - } - - e = exceptions; - while(e) { - if(c==e->abc_exception->to) { - if(e->abc_exception->target) - fprintf(fo, "%s } // END TRY (HANDLER: %d)\n", prefix, e->abc_exception->target->pos); - else - fprintf(fo, "%s } // END TRY (HANDLER: 00000000)\n", prefix); - } - e = e->next; - } - - pos++; - c = c->next; - } - stats_free(stats); - return 1; -} - -codestats_t* code_get_statistics(code_t*code, abc_exception_list_t*exceptions) -{ - currentstats_t*current = code_get_stats(code, exceptions); - if(!current) - return 0; - codestats_t*stats = rfx_calloc(sizeof(codestats_t)); - stats->local_count = current->maxlocal; - stats->max_stack = current->maxstack; - stats->max_scope_depth = current->maxscope; - stats->flags = current->flags; - - stats_free(current);current=0; - return stats; -} - -void codestats_free(codestats_t*s) -{ - free(s); -} - -code_t* add_opcode(code_t*atag, U8 op) -{ - code_t*tmp = (code_t*)rfx_calloc(sizeof(code_t)); - tmp->opcode = op; - if(atag) { - tmp->prev = atag; - tmp->next = atag->next; - if(tmp->next) - tmp->next->prev = tmp; - atag->next = tmp; - } else { - tmp->prev = 0; - tmp->next = 0; - } - return tmp; -} - -void codestats_print(codestats_t*stats) -{ - printf("max_stack: %d\n", stats->max_stack); - printf("local_count: %d\n", stats->local_count); - printf("scope_depth: %d\n", stats->max_scope_depth); -} - -code_t* code_end(code_t*code) -{ - if(!code) - return 0; - while(code->next) - code = code->next; - return code; -} -code_t* code_start(code_t*code) -{ - if(!code) - return 0; - while(code->prev) - code = code->prev; - return code; -} - -code_t* code_append(code_t*code, code_t*toappend) -{ - if(!code) - return code_end(toappend); - if(!toappend) - return code_end(code); - //find end of first list - while(code->next) { - code = code->next; - } - code_t*start=toappend; - //and start of second list - while(start->prev) { - start = start->prev; - } - code->next = start; - start->prev = code; - return code_end(toappend); -} - -lookupswitch_t*lookupswitch_dup(lookupswitch_t*l) -{ - lookupswitch_t*n = malloc(sizeof(lookupswitch_t)); - fprintf(stderr, "Error: lookupswitch dupping not supported yet\n"); - n->targets = list_clone(l->targets); - return 0; -} - -code_t*code_dup(code_t*c) -{ - if(!c) return 0; - - dict_t*pos2pos = dict_new2(&ptr_type); - - code_t*last = 0; - c = code_start(c); - code_t*start = 0; - char does_branch = 0; - while(c) { - NEW(code_t, n); - memcpy(n, c, sizeof(code_t)); - if(!start) - start=n; - - if(c->opcode == OPCODE_LABEL || c->opcode == OPCODE_NOP) { - dict_put(pos2pos, c, n); - } - if(c->branch) { - does_branch = 1; - } - - opcode_t*op = opcode_get(c->opcode); - - char*p = op?op->params:""; - int pos=0; - while(*p) { - if(*p == '2') { //multiname - c->data[pos] = multiname_clone(c->data[pos]); - } else if(*p == 'N') { //multiname - c->data[pos] = namespace_clone(c->data[pos]); - } else if(*p == 's') { - c->data[pos] = string_dup3(c->data[pos]); - } else if(*p == 'D') { - c->data[pos] = strdup(c->data[pos]); - } else if(*p == 'f') { - double old = *(double*)c->data[pos]; - c->data[pos] = malloc(sizeof(double)); - *(double*)c->data[pos] = old; - } else if(strchr("S", *p)) { - c->data[pos] = lookupswitch_dup(c->data[pos]); - } - p++;pos++; - } - - n->prev = last; - if(last) { - last->next = n; - } - last = n; - c = c->next; - } - - if(does_branch) { - c = start; - while(c) { - if(c->branch) { - code_t*target = dict_lookup(pos2pos, c->branch); - if(!target) { - fprintf(stderr, "Error: Can't find branch target in code_dup\n"); - return 0; - } - c->branch = target; - } - c = c->next; - } - } - dict_destroy(pos2pos); - return last; -} - -code_t*code_cut(code_t*c) -{ - if(!c) return c; - code_t*prev = c->prev; - code_t*next = c->next; - c->prev = 0; - c->next = 0; - if(prev) prev->next=next; - if(next) next->prev=prev; - code_free(c); - - if(next) return code_end(next); - else return prev; -} - -code_t*code_cutlast(code_t*c) -{ - if(!c) return c; - assert(!c->next); - return code_cut(c); -} - -char is_getlocal(code_t*c) -{ - if(!c) return 0; - if(c->opcode == OPCODE_GETLOCAL || - c->opcode == OPCODE_GETLOCAL_0 || - c->opcode == OPCODE_GETLOCAL_1 || - c->opcode == OPCODE_GETLOCAL_2 || - c->opcode == OPCODE_GETLOCAL_3) { - return 1; - } - return 0; -} - -code_t* cut_last_push(code_t*c) -{ - assert(!c->next); - while(c) { - if(!c) break; - opcode_t*op = opcode_get(c->opcode); - /* cut conversion type operations */ - if(op->stack_minus == -1 && op->stack_plus == 1 && !(op->flags)) { - c = code_cutlast(c); - continue; - } - /* cut any type of push */ - else if(op->stack_minus == 0 && op->stack_plus == 1 && !(op->flags)) { - return code_cutlast(c); - } - /* cut register lookups */ - else if(c->opcode == OPCODE_GETLOCAL || - c->opcode == OPCODE_GETLOCAL_0 || - c->opcode == OPCODE_GETLOCAL_1 || - c->opcode == OPCODE_GETLOCAL_2 || - c->opcode == OPCODE_GETLOCAL_3) { - return code_cutlast(c); - } - /* discard function call values */ - else if(c->opcode == OPCODE_CALLPROPERTY) { - c->opcode = OPCODE_CALLPROPVOID; - return c; - } else if(c->opcode == OPCODE_CALLSUPER) { - c->opcode = OPCODE_CALLSUPERVOID; - return c; - } else if((c->opcode == OPCODE_NEWOBJECT || - c->opcode == OPCODE_NEWARRAY) && - !c->data[0]) { - // we can discard these if they're not eating up stack parameters - return code_cutlast(c); - } else if(op->stack_minus ==0 && op->stack_plus == 0 && - !(op->flags&~(OP_REGISTER|OP_SET_DXNS)) && c->prev) { - // trim code *before* the kill, inclocal, declocal, dxns - code_t*p = c->prev; - p->next = 0; - c->prev = 0; - return code_append(cut_last_push(p), c); - } else - break; - } - c = abc_pop(c); - return c; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/code.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/code.h deleted file mode 100644 index d120203a3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/code.h +++ /dev/null @@ -1,109 +0,0 @@ -/* code.h - - Routines for handling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __abc_code_h__ -#define __abc_code_h__ - -#include "../q.h" - -DECLARE(code); -DECLARE_LIST(code); -DECLARE(codestats); -DECLARE(codelookup); -DECLARE(lookupswitch); - - -#include "abc.h" - -typedef struct _opcode -{ - unsigned char opcode; - char*name; - char*params; - - int stack_minus; - int stack_plus; - int scope_stack_plus; - int flags; -} opcode_t; - -struct _code { - void*data[2]; - code_t*next; - code_t*prev; - - code_t*branch; - int pos; //used during code path evaluation - - U8 opcode; -}; - -struct _lookupswitch { - code_t*def; - code_list_t*targets; -}; - -#define FLAGS_ACTIVATION 0x02 -#define FLAGS_SET_DXNS 0x40 -struct _codestats { - int max_stack; - int local_count; - int max_scope_depth; - int flags; -}; - -struct _codelookup { - code_t**bytepos; - int len; -}; - -code_t*code_dup(code_t*c); - -code_t*add_opcode(code_t*atag, U8 op); - -code_t*code_parse(TAG*tag, int len, abc_file_t*file, pool_t*pool, codelookup_t**codelookup); -int code_dump(code_t*c); -int code_dump2(code_t*c, abc_exception_list_t*exceptions, abc_file_t*file, char*prefix, FILE*fo); -void code_write(TAG*tag, code_t*code, pool_t*pool, abc_file_t*file); -void code_free(code_t*c); -code_t* code_atposition(codelookup_t*l, int pos); -void codelookup_free(codelookup_t*codelookup); - -code_t*code_cutlast(code_t*c); - -codestats_t* code_get_statistics(code_t*code, abc_exception_list_t*exceptions); - -void codestats_print(codestats_t*s); -void codestats_free(codestats_t*s); - -code_t* code_start(code_t*c); - -code_t* code_append(code_t*code, code_t*toappend); - -code_t* cut_last_push(code_t*_c); - -char is_getlocal(code_t*c); - -#define code_new() (0) - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/common.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/common.c deleted file mode 100644 index 5d4d4068d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/common.c +++ /dev/null @@ -1,85 +0,0 @@ -/* common.c - - Routines for handling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008,2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "files.h" -#include "common.h" - -int as3_pass = 0; -int as3_verbosity = 1; - -void as3_error(const char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - if(as3_verbosity<0) - exit(1); - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - fprintf(stderr, "%s:%d:%d: error: %s\n", current_filename, current_line, current_column, buf); - fprintf(stderr, "%s\n", current_filename_long); - fflush(stderr); - exit(1); -} -void as3_warning(const char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - if(as3_verbosity<1) - return; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - fprintf(stdout, "%s:%d:%d: warning: %s\n", current_filename, current_line, current_column, buf); - fflush(stdout); -} -void as3_softwarning(const char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - if(as3_verbosity<2) - return; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - fprintf(stderr, "%s:%d:%d: warning: %s\n", current_filename, current_line, current_column, buf); - fflush(stderr); -} - -void internal_error(const char*file, int line, const char*f) -{ - syntaxerror("internal error in %s, %s:%d", f, file, line); -} - -int a3_error(char*s) -{ - syntaxerror("%s", s); - return 0; //make gcc happy -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/common.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/common.h deleted file mode 100644 index 40444229a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/common.h +++ /dev/null @@ -1,39 +0,0 @@ -/* common.h - - Routines for handling/compiling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008,2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __as3_common_h__ -#define __as3_common_h__ - -extern int as3_lex(); -extern int as3_verbosity; -extern int as3_pass; -#define syntaxerror as3_error -int a3_error(char*s); -void as3_error(const char*format, ...) __attribute__ ((__noreturn__)); -void as3_warning(const char*format, ...); -void as3_softwarning(const char*format, ...); - -void internal_error(const char*file, int line, const char*f); -#define as3_assert(b) {if(!(b)) internal_error(__FILE__, __LINE__,__func__);} - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.c deleted file mode 100644 index e6571dbfc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.c +++ /dev/null @@ -1,369 +0,0 @@ -/* compiler.h - - Compiler for parsing Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008/2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "common.h" -#include "tokenizer.h" -#include "files.h" -#include "parser.h" -#include "parser.tab.h" -#include "compiler.h" -#include "registry.h" -#include "assets.h" -#include "../os.h" -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_DIRENT_H -#include -#endif - -/* flex/bison definitions */ -extern int a3_parse(); -extern int as3_lex(); -extern int as3_lex_destroy(); - -static char config_recurse = 0; - -void as3_setverbosity(int level) -{ - as3_verbosity=level; -} -void as3_add_include_dir(char*dir) -{ - add_include_dir(dir); -} -void as3_set_option(const char*key, const char*value) -{ - if(!strcmp(key, "recurse")) { - config_recurse=atoi(value); - } -} - -static char registry_initialized = 0; -static char parser_initialized = 0; - -//#define STORE_TOKENS - -//#define DEBUG -#define DEBUG if(0) - -int a3_lex() -{ - as3_tokencount++; - return as3_lex(); -} - -typedef struct _compile_list { - const char*name; - const char*filename; - struct _compile_list*next; -} compile_list_t; -static compile_list_t*compile_list=0; - -static void as3_parse_file_or_array(const char*name, const char*filename, const void*mem, int length) -{ - if(!registry_initialized) { - registry_initialized = 1; - registry_init(); - } - if(!parser_initialized) { - parser_initialized = 1; - initialize_parser(); - } - - FILE*fi = 0; - if(filename) { - if(as3_pass==1 && !mem) { - // record the fact that we compiled this file - compile_list_t*c = rfx_calloc(sizeof(compile_list_t)); - c->next = compile_list; - c->name = strdup(name); - c->filename = strdup(filename); - compile_list = c; - } - DEBUG printf("[pass %d] parse file %s %s\n", as3_pass, name, filename); - fi = enter_file2(name, filename, 0); - as3_file_input(fi); - } else { - DEBUG printf("[pass %d] parse bytearray %s (%d bytes)\n", as3_pass, name, length); - enter_file(name, name, 0); - as3_buffer_input((void*)mem, length); - } - - as3_tokencount=0; - initialize_file(name, filename); - a3_parse(); - as3_lex_destroy(); - finish_file(); - if(fi) fclose(fi); -} - -typedef struct _scheduled_file { - char*name; - char*filename; - struct _scheduled_file*next; -} scheduled_file_t; - -static scheduled_file_t*scheduled=0; -dict_t*scheduled_dict=0; - -void as3_parse_scheduled() -{ - DEBUG printf("[pass %d] parse scheduled\n", as3_pass); - - while(scheduled) { - scheduled_file_t*s = scheduled; - scheduled = 0; - while(s) { - scheduled_file_t*old = s; - as3_parse_file_or_array(s->name, s->filename, 0,0); - s = s->next; - - free(old->filename); - free(old->name); - old->filename = old->name = 0; - free(old); - } - } - if(scheduled_dict) { - dict_destroy(scheduled_dict); - scheduled_dict=0; - } -} - -void as3_schedule_file(const char*name, const char*filename) -{ - if(!scheduled_dict) { - scheduled_dict = dict_new(); - } - - filename = normalize_path(filename); - - if(dict_contains(scheduled_dict, filename)) { - return; //already processed - } else { - dict_put(scheduled_dict, filename, 0); - } - DEBUG printf("[pass %d] schedule %s %s\n", as3_pass, name, filename); - - NEW(scheduled_file_t, f); - f->name = strdup(name); - f->filename = strdup(filename); - f->next = scheduled; // dfs - scheduled = f; -} - -void as3_parse_list() -{ - while(compile_list) { - as3_parse_file_or_array(compile_list->name, compile_list->filename, 0,0); - compile_list = compile_list->next; - } -} - -void as3_parse_bytearray(const char*name, const void*mem, int length) -{ - as3_pass = 1; - as3_parse_file_or_array(name, 0, mem, length); - as3_parse_scheduled(); - - registry_resolve_all(); - - as3_pass = 2; - as3_parse_file_or_array(name, 0, mem, length); - as3_parse_list(); -} - -void as3_parse_file(const char*filename) -{ - char*fullfilename = find_file(filename, 1); - if(!fullfilename) - return; // not found - - compile_list = 0; - as3_pass = 1; - as3_schedule_file(filename, fullfilename); - as3_parse_scheduled(); - - registry_resolve_all(); - - as3_pass = 2; - as3_parse_list(); - - free(fullfilename); -} - -void as3_parse_directory(const char*dir) -{ - compile_list = 0; - - as3_pass = 1; - as3_schedule_directory(dir); - if(!scheduled) - as3_warning("Directory %s doesn't contain any ActionScript files", dir); - as3_parse_scheduled(); - - registry_resolve_all(); - - as3_pass = 2; - as3_parse_list(); -} - -char as3_schedule_directory(const char*dirname) -{ - DEBUG printf("[pass %d] schedule directory %s\n", as3_pass, dirname); - char ok=0; -#ifdef HAVE_DIRENT_H - include_dir_t*i = current_include_dirs; - while(i) { - char*fulldirname = concat_paths(i->path, dirname); - DEBUG printf("[pass %d] ... %s\n", as3_pass, fulldirname); - DIR*dir = opendir(fulldirname); - if(dir) { - ok = 1; - struct dirent*ent; - while(1) { - ent = readdir(dir); - if (!ent) - break; - char*name = ent->d_name; - char type = 0; - if(!name) continue; - int l=strlen(name); - if(l<4) - continue; - if(strncasecmp(&name[l-3], ".as", 3)) - continue; - char*fullfilename = concatPaths(fulldirname, name); - as3_schedule_file(name, fullfilename); - free(fullfilename); - } - } - free(fulldirname); - i = i->next; - } -#endif - return ok; -} - -void as3_schedule_package(const char*package) -{ - DEBUG printf("[pass %d] schedule package %s\n", as3_pass, package); - char*dirname = strdup(package); - int s=0; - while(dirname[s]) { - if(dirname[s]=='.') - dirname[s] = path_seperator; - s++; - }; - if(!as3_schedule_directory(dirname)) - as3_softwarning("Could not find package %s in file system", package); -} - -static void schedule_class(const char*package, const char*cls, char error) -{ - if(error) { - DEBUG printf("[pass %d] schedule class %s.%s\n", as3_pass, package, cls); - } - if(!cls) { - as3_schedule_package(package); - return; - } - int l1 = package?strlen(package):0; - int l2 = cls?strlen(cls):0; - char*filename = malloc(l1+l2+5); - int s=0,t=0; - while(package[s]) { - if(package[s]=='.') - filename[t++]='/'; - else - filename[t++] = package[s]; - s++; - } - if(t) - filename[t++] = '/'; - - strcpy(filename+t, cls); - strcpy(filename+t+l2, ".as"); - char*f=find_file(filename, error); - if(!f) { - int i; - filename = filename_to_lowercase(filename); - f=find_file(filename, error); - } - if(!f) { - if(error) { - strcpy(filename+t, cls); - strcpy(filename+t+l2, ".as"); - as3_warning("Could not open file %s", filename); - } - return; - } - as3_schedule_file(filename, f); -} - -void as3_schedule_class(const char*package, const char*cls) -{ - schedule_class(package, cls, 1); -} - -void as3_schedule_class_noerror(const char*package, const char*cls) -{ - if(config_recurse) { - schedule_class(package, cls, 0); - } -} - - -static void*as3code = 0; -void* as3_getcode() -{ - if(parser_initialized) { - parser_initialized = 0; - as3code = finish_parser(); - } - return as3code; -} -void* as3_getassets(void*t) -{ - return swf_AssetsToTags((TAG*)t, registry_getassets()); -} -char* as3_getglobalclass() -{ - return as3_globalclass; -} - -void as3_destroy() -{ - if(parser_initialized) { - parser_initialized = 0; - swf_FreeABC(finish_parser()); -#ifdef STORE_TOKENS - mem_clear(&tokens); -#endif - } - if(as3_globalclass) { - free(as3_globalclass);as3_globalclass=0; - } -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.h deleted file mode 100644 index 848775571..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/compiler.h +++ /dev/null @@ -1,48 +0,0 @@ -/* compiler.h - - Routines for handling/compiling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008,2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __as3_compiler_h__ -#define __as3_compiler_h__ - -void as3_setverbosity(int level); -void as3_add_include_dir(char*dir); - -void as3_set_define(const char*c); -void as3_set_option(const char*key, const char*value); - -void as3_parse_file(const char*filename); -void as3_parse_bytearray(const char*name, const void*mem, int length); -void as3_parse_directory(const char*dir); - -char as3_schedule_directory(const char*dir); -void as3_schedule_package(const char*package); -void as3_schedule_class(const char*package, const char*cls); -void as3_schedule_class_noerror(const char*package, const char*cls); - -void as3_warning(const char*format, ...); -char* as3_getglobalclass(); -void* as3_getcode(); -void* as3_getassets(void*); -void as3_destroy(); - -#endif //__as3_compiler_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.c deleted file mode 100644 index 1a6759498..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.c +++ /dev/null @@ -1,2904 +0,0 @@ -/* expr.c - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "expr.h" -#include "common.h" -#include "tokenizer.h" - -#define IS_INT(a) (TYPE_IS_INT((a)) || TYPE_IS_UINT((a))) -#define BOTH_INT(a,b) (IS_INT(a) && IS_INT(b)) - -#define READ_HEADER_LEFTRIGHT \ - typedcode_t left = n->child[0]->type->read(n->child[0]);\ - typedcode_t right = n->child[1]->type->read(n->child[1]);\ - code_t*c=0;\ - classinfo_t*t=0; - -#define READ_HEADER_ONE \ - typedcode_t x = n->child[0]->type->read(n->child[0]);\ - code_t*c=0;\ - classinfo_t*t=0; - -#define EXEC_HEADER_ONE \ - code_t* x = n->child[0]->type->exec(n->child[0]);\ - code_t*c=0;\ - classinfo_t*t=0; - -#define EXEC_HEADER_LEFTRIGHT \ - code_t* left = n->child[0]->type->exec(n->child[0]);\ - code_t* right = n->child[1]->type->exec(n->child[1]);\ - code_t*c=0;\ - classinfo_t*t=0; - -#define EVAL_HEADER_LEFTRIGHT \ - constant_t left = n->child[0]->type->eval(n->child[0]);\ - constant_t right = n->child[1]->type->eval(n->child[1]);\ - constant_t r; \ - if(left.type==CONSTANT_UNKNOWN || right.type==CONSTANT_UNKNOWN) {\ - r.type = CONSTANT_UNKNOWN;return r; \ - } - - -#define RET \ - typedcode_t r; \ - r.c = c; \ - r.t = t; \ - return r; - -static classinfo_t*join_types(classinfo_t*type1, classinfo_t*type2, nodetype_t*t) -{ - if(t == &node_plus) { - if((TYPE_IS_XMLLIST(type1) || TYPE_IS_XML(type1)) && - (TYPE_IS_XMLLIST(type2) || TYPE_IS_XML(type2))) - return TYPE_OBJECT; - if(BOTH_INT(type1, type2)) - return TYPE_INT; - if(IS_NUMBER_OR_INT(type1) && IS_NUMBER_OR_INT(type2)) - return TYPE_NUMBER; - if(TYPE_IS_DATE(type1) || TYPE_IS_DATE(type2)) - return TYPE_OBJECT; - if(TYPE_IS_STRING(type1) || TYPE_IS_STRING(type2)) { - /* depending on where the strings come from, the result type - of an "add" might be an object or a string, depending on the - verifier's mood. So basically we just don't know the type. */ - return TYPE_VOID; - } - if(TYPE_IS_ANY(type1) || TYPE_IS_ANY(type2)) - return TYPE_ANY; - return TYPE_OBJECT; // e.g. array+array = object - } - - if(type1 == type2) - return type1; - return TYPE_ANY; -} -static int getlocalnr(code_t*c) -{ - if(c->opcode == OPCODE_GETLOCAL) {return (ptroff_t)c->data[0];} - else if(c->opcode == OPCODE_GETLOCAL_0) {return 0;} - else if(c->opcode == OPCODE_GETLOCAL_1) {return 1;} - else if(c->opcode == OPCODE_GETLOCAL_2) {return 2;} - else if(c->opcode == OPCODE_GETLOCAL_3) {return 3;} - else syntaxerror("Internal error: opcode %02x is not a getlocal call", c->opcode); - return 0; -} - - -int gettempvar(); /* FIXME: we should use a function pointer here */ - - -static code_t* toreadwrite(code_t*in, code_t*middlepart, char justassign, char readbefore, char pushvalue) -{ - /* converts this: - - [prefix code] [read instruction] - - to this: - - [prefix code] ([dup]) [read instruction] [middlepart] [setvar] [write instruction] [getvar] - */ - if(in && in->opcode == OPCODE_COERCE_A) { - in = code_cutlast(in); - } - if(in->next) - syntaxerror("internal error"); - - /* chop off read instruction */ - code_t*prefix = in; - code_t*r = in; - if(r->prev) { - prefix = r->prev;r->prev = 0; - prefix->next=0; - } else { - prefix = 0; - } - - char use_temp_var = readbefore; - - /* generate the write instruction, and maybe append a dup to the prefix code */ - code_t* write = abc_nop(0); - if(r->opcode == OPCODE_GETPROPERTY) { - write->opcode = OPCODE_SETPROPERTY; - multiname_t*m = (multiname_t*)r->data[0]; - write->data[0] = multiname_clone(m); - if(m->type == QNAME || m->type == MULTINAME || - m->type == QNAMEA || m->type == MULTINAMEA) { - if(!justassign) { - prefix = abc_dup(prefix); // we need the object, too - } - use_temp_var = 1; - } else if(m->type == MULTINAMEL || m->type == MULTINAMELA || - m->type == RTQNAME || m->type == RTQNAMEA) { - if(!justassign) { - /* dupping two values on the stack requires 5 operations and one register- - couldn't adobe just have given us a dup2? */ - int temp = gettempvar(); - prefix = abc_setlocal(prefix, temp); - prefix = abc_dup(prefix); - prefix = abc_getlocal(prefix, temp); - prefix = abc_swap(prefix); - prefix = abc_getlocal(prefix, temp); - if(!use_temp_var); - prefix = abc_kill(prefix, temp); - } - use_temp_var = 1; - } else { - syntaxerror("illegal lvalue: can't assign a value to this expression (not a qname/multiname)"); - } - } else if(r->opcode == OPCODE_GETSLOT) { - write->opcode = OPCODE_SETSLOT; - write->data[0] = r->data[0]; - if(!justassign) { - prefix = abc_dup(prefix); // we need the object, too - } - use_temp_var = 1; - } else if(r->opcode == OPCODE_GETLOCAL) { - write->opcode = OPCODE_SETLOCAL; - write->data[0] = r->data[0]; - } else if(r->opcode == OPCODE_GETLOCAL_0) { - write->opcode = OPCODE_SETLOCAL_0; - } else if(r->opcode == OPCODE_GETLOCAL_1) { - write->opcode = OPCODE_SETLOCAL_1; - } else if(r->opcode == OPCODE_GETLOCAL_2) { - write->opcode = OPCODE_SETLOCAL_2; - } else if(r->opcode == OPCODE_GETLOCAL_3) { - write->opcode = OPCODE_SETLOCAL_3; - } else if(r->opcode == OPCODE_GETSUPER) { - write->opcode = OPCODE_SETSUPER; - multiname_t*m = (multiname_t*)r->data[0]; - write->data[0] = multiname_clone(m); - } else { - code_dump(r); - syntaxerror("illegal lvalue: can't assign a value to this expression"); - } - code_t* c = 0; - - int temp = -1; - if(!justassign) { - if(use_temp_var) { - /* with getproperty/getslot, we have to be extra careful not - to execute the read code twice, as it might have side-effects - (e.g. if the property is in fact a setter/getter combination) - - So read the value, modify it, and write it again, - using prefix only once and making sure (by using a temporary - register) that the return value is what we just wrote */ - temp = gettempvar(); - c = code_append(c, prefix); - c = code_append(c, r); - if(pushvalue && readbefore) { - c = abc_dup(c); - c = abc_setlocal(c, temp); - } - c = code_append(c, middlepart); - if(pushvalue && !readbefore) { - c = abc_dup(c); - c = abc_setlocal(c, temp); - } - c = code_append(c, write); - if(pushvalue) { - c = abc_getlocal(c, temp); - c = abc_kill(c, temp); - } - } else { - /* if we're allowed to execute the read code twice *and* - the middlepart doesn't modify the code, things are easier. - */ - //c = code_append(c, prefix); - if(prefix) syntaxerror("internal error (prefix)"); - code_t* r2 = 0; - if(pushvalue) { - r2 = code_dup(r); - } - c = code_append(c, r); - c = code_append(c, middlepart); - c = code_append(c, write); - if(pushvalue) { - c = code_append(c, r2); - } - } - } else { - /* even smaller version: overwrite the value without reading - it out first */ - if(!use_temp_var) { - if(prefix) { - c = code_append(c, prefix); - c = abc_dup(c); - } - c = code_append(c, middlepart); - c = code_append(c, write); - if(pushvalue) { - c = code_append(c, r); - } - } else { - code_free(r);r=0; - temp = gettempvar(); - if(prefix) { - c = code_append(c, prefix); - } - c = code_append(c, middlepart); - if(pushvalue) { - c = abc_dup(c); - c = abc_setlocal(c, temp); - } - c = code_append(c, write); - if(pushvalue) { - c = abc_getlocal(c, temp); - c = abc_kill(c, temp); - } - } - } - return c; -} - -typedcode_t push_constant(constant_t*v) -{ - typedcode_t t; - switch(v->type) { - case CONSTANT_INT: t.c = abc_pushint(0, v->i);t.t = TYPE_INT;break; - case CONSTANT_UINT: t.c = abc_pushuint(0, v->u);t.t = TYPE_UINT;break; - case CONSTANT_FLOAT: t.c = abc_pushdouble(0, v->f);t.t = TYPE_FLOAT;break; - case CONSTANT_TRUE: t.c = abc_pushtrue(0);t.t = TYPE_BOOLEAN;break; - case CONSTANT_FALSE: t.c = abc_pushfalse(0);t.t = TYPE_BOOLEAN;break; - case CONSTANT_STRING: t.c = abc_pushstring2(0, v->s);t.t = TYPE_STRING;break; - case CONSTANT_NULL: t.c = abc_pushnull(0);t.t = TYPE_NULL;break; - case CONSTANT_UNDEFINED: t.c = abc_pushundefined(0);t.t = TYPE_ANY;break; - case CONSTANT_NAMESPACE: - case CONSTANT_NAMESPACE_PACKAGE: - case CONSTANT_NAMESPACE_PACKAGEINTERNAL: - case CONSTANT_NAMESPACE_PROTECTED: - case CONSTANT_NAMESPACE_EXPLICIT: - case CONSTANT_NAMESPACE_STATICPROTECTED: - case CONSTANT_NAMESPACE_PRIVATE: - t.c = abc_pushnamespace(0, v->ns);t.t = TYPE_NAMESPACE;break; - default: - syntaxerror("internal error: bad constant"); - } - return t; -} - -code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to); - -int constant_to_int(constant_t*c) -{ - switch(c->type) { - case CONSTANT_INT: return c->i; - case CONSTANT_UINT: return (int)c->u; - case CONSTANT_FLOAT: return c->f; - case CONSTANT_TRUE: return 1; - case CONSTANT_FALSE: return 0; - case CONSTANT_STRING: return atoi(c->s->str); - default: syntaxerror("can't convert this constant to an integer"); - } -} - -double constant_to_float(constant_t*c) -{ - switch(c->type) { - case CONSTANT_INT: return (double)c->i; - case CONSTANT_UINT: return (double)c->u; - case CONSTANT_FLOAT: return c->f; - case CONSTANT_TRUE: return (double)1; - case CONSTANT_FALSE: return (double)0; - case CONSTANT_STRING: return atof(c->s->str); - default: syntaxerror("can't convert this constant to a float"); - } -} - -// -------------------------- x + y ----------------------------------- - -typedcode_t node_plus_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_plus_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c, right.c); - if(BOTH_INT(left.t, right.t)) { - c = abc_add_i(c); - t = TYPE_INT; - } else { - c = abc_add(c); - t = join_types(left.t,right.t,n->type); - } - RET; -} -code_t* node_plus_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_plus_eval(node_t*n) -{ - EVAL_HEADER_LEFTRIGHT; - char left_int = left.type == CONSTANT_INT || left.type == CONSTANT_UINT; - if(left_int && (right.type == CONSTANT_INT || right.type == CONSTANT_UINT)) { - int i = constant_to_int(&left) + constant_to_int(&right); - r.type = CONSTANT_INT; - r.i = i; - } else if(left_int && right.type == CONSTANT_FLOAT) { - double f = constant_to_int(&left) + constant_to_float(&right); - r.type = CONSTANT_FLOAT; - r.f = f; - } else if(left.type == CONSTANT_STRING) { - char*add = constant_tostring(&right); - int l1 = left.s->len; - int l2 = strlen(add); - char*s = malloc(l1+l2+1); - memcpy(s, left.s->str, l1); - memcpy(s+l1, add, l2); - s[l1+l2]=0; - r.type = CONSTANT_STRING; - r.s = malloc(sizeof(string_t)); - r.s->str = s; - r.s->len = l1+l2; - free(add); - } else { - r.type = CONSTANT_UNKNOWN; - } - return r; -} -nodetype_t node_plus = -{ -name:"plus", -flags:NODE_HAS_CHILDREN, -eval:node_plus_eval, -write:node_plus_write, -read:node_plus_read, -exec:node_plus_exec, -}; - -// -------------------------- x - y ----------------------------------- - -typedcode_t node_minus_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_minus_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c, right.c); - if(BOTH_INT(left.t,right.t)) { - c = abc_subtract_i(c); - t = TYPE_INT; - } else { - c = abc_subtract(c); - t = TYPE_NUMBER; - } - RET; -} -code_t* node_minus_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_minus_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_minus = -{ -name:"minus", -flags:NODE_HAS_CHILDREN, -eval: node_minus_eval, -write: node_minus_write, -read: node_minus_read, -exec: node_minus_exec -}; - -// ---------------------------- ++x ----------------------------------- - -typedcode_t node_lplusplus_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_lplusplus_read(node_t*n) -{ - READ_HEADER_ONE; - t = x.t; - if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { - int nr = getlocalnr(x.c); - code_free(x.c);x.c=0; - if(TYPE_IS_INT(x.t)) { - c = abc_inclocal_i(c, nr); - c = abc_getlocal(c, nr); - } else if(TYPE_IS_NUMBER(x.t)) { - c = abc_inclocal(c, nr); - c = abc_getlocal(c, nr); - } else syntaxerror("internal error"); - } else { - if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { - c = abc_increment_i(c); - t = TYPE_INT; - } else { - c = abc_increment(c); - t = TYPE_NUMBER; - } - c = converttype(c, t, x.t); - c = toreadwrite(x.c, c, 0, 0, 1); - t = x.t; - } - RET -} -code_t* node_lplusplus_exec(node_t*n) -{ - typedcode_t x = n->child[0]->type->read(n->child[0]); - code_t*c=0; - if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { - int nr = getlocalnr(x.c); - code_free(x.c);x.c=0; - if(TYPE_IS_INT(x.t)) { - c = abc_inclocal_i(c, nr); - } else if(TYPE_IS_NUMBER(x.t)) { - c = abc_inclocal(c, nr); - } else syntaxerror("internal error"); - } else { - classinfo_t*t; - if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { - c = abc_increment_i(c); - t = TYPE_INT; - } else { - c = abc_increment(c); - t = TYPE_NUMBER; - } - c = converttype(c, t, x.t); //convert back to original type - c = toreadwrite(x.c, c, 0, 0, 0); - t = x.t; - } - return c; -} -constant_t node_lplusplus_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_lplusplus = -{ -name: "lplusplus", -flags:NODE_HAS_CHILDREN, -eval: node_lplusplus_eval, -write: node_lplusplus_write, -read: node_lplusplus_read, -exec: node_lplusplus_exec -}; - - -// ---------------------------- --x ----------------------------------- - -typedcode_t node_lminusminus_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_lminusminus_read(node_t*n) -{ - READ_HEADER_ONE; - t = x.t; - if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { - int nr = getlocalnr(x.c); - code_free(x.c);x.c=0; - if(TYPE_IS_INT(x.t)) { - c = abc_declocal_i(c, nr); - c = abc_getlocal(c, nr); - } else if(TYPE_IS_NUMBER(x.t)) { - c = abc_declocal(c, nr); - c = abc_getlocal(c, nr); - } else syntaxerror("internal error"); - } else { - if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { - c = abc_decrement_i(c); - t = TYPE_INT; - } else { - c = abc_decrement(c); - t = TYPE_NUMBER; - } - c = converttype(c, t, x.t); - c = toreadwrite(x.c, c, 0, 0, 1); - t = x.t; - } - RET -} -code_t* node_lminusminus_exec(node_t*n) -{ - typedcode_t x = n->child[0]->type->read(n->child[0]); - code_t*c=0; - if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { - int nr = getlocalnr(x.c); - code_free(x.c);x.c=0; - if(TYPE_IS_INT(x.t)) { - c = abc_declocal_i(c, nr); - } else if(TYPE_IS_NUMBER(x.t)) { - c = abc_declocal(c, nr); - } else syntaxerror("internal error"); - } else { - classinfo_t*t; - if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { - c = abc_decrement_i(c); - t = TYPE_INT; - } else { - c = abc_decrement(c); - t = TYPE_NUMBER; - } - c = converttype(c, t, x.t); //convert back to original type - c = toreadwrite(x.c, c, 0, 0, 0); - t = x.t; - } - return c; -} -constant_t node_lminusminus_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_lminusminus = -{ -name: "lminusminus", -flags:NODE_HAS_CHILDREN, -eval: node_lminusminus_eval, -write: node_lminusminus_write, -read: node_lminusminus_read, -exec: node_lminusminus_exec -}; - - - -// ---------------------------- x++ ----------------------------------- - -typedcode_t node_rplusplus_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_rplusplus_read(node_t*n) -{ - READ_HEADER_ONE; - t = x.t; - if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { - int nr = getlocalnr(x.c); - code_free(x.c);x.c=0; - if(TYPE_IS_INT(x.t)) { - c = abc_getlocal(0, nr); - c = abc_inclocal_i(c, nr); - } else if(TYPE_IS_NUMBER(x.t)) { - c = abc_getlocal(0, nr); - c = abc_inclocal(c, nr); - } else syntaxerror("internal error"); - } else { - if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { - c = abc_increment_i(c); - t = TYPE_INT; - } else { - c = abc_increment(c); - t = TYPE_NUMBER; - } - c = converttype(c, t, x.t); - c = toreadwrite(x.c, c, 0, 1, 1); - t = x.t; - } - RET -} -code_t* node_rplusplus_exec(node_t*n) -{ - typedcode_t x = n->child[0]->type->read(n->child[0]); - code_t*c=0; - if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { - int nr = getlocalnr(x.c); - code_free(x.c);x.c=0; - if(TYPE_IS_INT(x.t)) { - c = abc_inclocal_i(c, nr); - } else if(TYPE_IS_NUMBER(x.t)) { - c = abc_inclocal(c, nr); - } else syntaxerror("internal error"); - } else { - classinfo_t*t; - if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { - c = abc_increment_i(c); - t = TYPE_INT; - } else { - c = abc_increment(c); - t = TYPE_NUMBER; - } - c = converttype(c, t, x.t); //convert back to original type - c = toreadwrite(x.c, c, 0, 1, 0); - t = x.t; - } - return c; -} -constant_t node_rplusplus_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_rplusplus = -{ -name: "rplusplus", -flags:NODE_HAS_CHILDREN, -eval: node_rplusplus_eval, -write: node_rplusplus_write, -read: node_rplusplus_read, -exec: node_rplusplus_exec -}; - -// ---------------------------- x-- ----------------------------------- - -typedcode_t node_rminusminus_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_rminusminus_read(node_t*n) -{ - READ_HEADER_ONE; - t = x.t; - if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { - int nr = getlocalnr(x.c); - code_free(x.c);x.c=0; - if(TYPE_IS_INT(x.t)) { - c = abc_getlocal(0, nr); - c = abc_declocal_i(c, nr); - } else if(TYPE_IS_NUMBER(x.t)) { - c = abc_getlocal(0, nr); - c = abc_declocal(c, nr); - } else syntaxerror("internal error"); - } else { - if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { - c = abc_decrement_i(c); - t = TYPE_INT; - } else { - c = abc_decrement(c); - t = TYPE_NUMBER; - } - c = converttype(c, t, x.t); - c = toreadwrite(x.c, c, 0, 1, 1); - t = x.t; - } - RET -} -code_t* node_rminusminus_exec(node_t*n) -{ - typedcode_t x = n->child[0]->type->read(n->child[0]); - code_t*c=0; - if(is_getlocal(x.c) && (TYPE_IS_INT(x.t) || TYPE_IS_NUMBER(x.t))) { - int nr = getlocalnr(x.c); - code_free(x.c);x.c=0; - if(TYPE_IS_INT(x.t)) { - c = abc_declocal_i(c, nr); - } else if(TYPE_IS_NUMBER(x.t)) { - c = abc_declocal(c, nr); - } else syntaxerror("internal error"); - } else { - classinfo_t*t; - if(TYPE_IS_INT(x.t) || TYPE_IS_UINT(x.t)) { - c = abc_decrement_i(c); - t = TYPE_INT; - } else { - c = abc_decrement(c); - t = TYPE_NUMBER; - } - c = converttype(c, t, x.t); //convert back to original type - c = toreadwrite(x.c, c, 0, 1, 0); - t = x.t; - } - return c; -} -constant_t node_rminusminus_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_rminusminus = -{ -name: "rminusminus", -flags:NODE_HAS_CHILDREN, -eval: node_rminusminus_eval, -write: node_rminusminus_write, -read: node_rminusminus_read, -exec: node_rminusminus_exec -}; - -// ---------------------------- x*y ----------------------------------- - -typedcode_t node_multiply_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_multiply_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - if(BOTH_INT(left.t,right.t)) { - c = abc_multiply_i(c); - t = TYPE_INT; - } else { - c = abc_multiply(c); - t = TYPE_NUMBER; - } - RET -} -code_t* node_multiply_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_multiply_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_multiply = -{ -name: "multiply", -flags:NODE_HAS_CHILDREN, -eval: node_multiply_eval, -write: node_multiply_write, -read: node_multiply_read, -exec: node_multiply_exec -}; - -// ---------------------------- x/y ----------------------------------- - -typedcode_t node_div_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_div_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c, right.c); - c = abc_divide(c); - t = TYPE_NUMBER; - RET -} -code_t* node_div_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_div_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_div = -{ -name: "div", -flags:NODE_HAS_CHILDREN, -eval: node_div_eval, -write: node_div_write, -read: node_div_read, -exec: node_div_exec -}; - -// ---------------------------- x%y ----------------------------------- - -typedcode_t node_mod_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_mod_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c, right.c); - c = abc_modulo(c); - t = TYPE_NUMBER; - RET -} -code_t* node_mod_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_mod_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_mod = -{ -name: "mod", -flags:NODE_HAS_CHILDREN, -eval: node_mod_eval, -write: node_mod_write, -read: node_mod_read, -exec: node_mod_exec -}; - -// ---------------------------- xy ----------------------------------- - -typedcode_t node_gt_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_gt_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_greaterthan(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_gt_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_gt_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_gt = -{ -name: "gt", -flags:NODE_HAS_CHILDREN, -eval: node_gt_eval, -write: node_gt_write, -read: node_gt_read, -exec: node_gt_exec -}; - -// ---------------------------- x<=y ---------------------------------- - -typedcode_t node_le_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_le_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_lessequals(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_le_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_le_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_le = //<= -{ -name: "le", -flags:NODE_HAS_CHILDREN, -eval: node_le_eval, -write: node_le_write, -read: node_le_read, -exec: node_le_exec -}; - -// ---------------------------- x>=y ---------------------------------- - -typedcode_t node_ge_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_ge_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_greaterequals(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_ge_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_ge_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_ge = //>= -{ -name: "ge", -flags:NODE_HAS_CHILDREN, -eval: node_ge_eval, -write: node_ge_write, -read: node_ge_read, -exec: node_ge_exec -}; - -// ---------------------------- x==y ---------------------------------- - -typedcode_t node_eqeq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_eqeq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_equals(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_eqeq_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_eqeq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_eqeq = //== -{ -name: "eqeq", -flags:NODE_HAS_CHILDREN, -eval: node_eqeq_eval, -write: node_eqeq_write, -read: node_eqeq_read, -exec: node_eqeq_exec -}; - -// --------------------------- x===y ---------------------------------- - -typedcode_t node_eqeqeq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_eqeqeq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_strictequals(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_eqeqeq_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_eqeqeq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_eqeqeq = //=== -{ -name: "eqeqeq", -flags:NODE_HAS_CHILDREN, -eval: node_eqeqeq_eval, -write: node_eqeqeq_write, -read: node_eqeqeq_read, -exec: node_eqeqeq_exec -}; - -// --------------------------- x!==y ---------------------------------- - -typedcode_t node_noteqeq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_noteqeq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_strictequals(c); - c = abc_not(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_noteqeq_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_noteqeq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_noteqeq = //!== -{ -name: "noteqeq", -flags:NODE_HAS_CHILDREN, -eval: node_noteqeq_eval, -write: node_noteqeq_write, -read: node_noteqeq_read, -exec: node_noteqeq_exec -}; - -// --------------------------- x!=y ---------------------------------- - -typedcode_t node_noteq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_noteq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_equals(c); - c = abc_not(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_noteq_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_noteq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_noteq = //!= -{ -name: "noteq", -flags:NODE_HAS_CHILDREN, -eval: node_noteq_eval, -write: node_noteq_write, -read: node_noteq_read, -exec: node_noteq_exec -}; - -// --------------------------- x||y ---------------------------------- - -typedcode_t node_oror_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_oror_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - t = join_types(left.t, right.t, n->type); - c = left.c; - c = converttype(c, left.t, t); - c = abc_dup(c); - code_t*jmp = c = abc_iftrue(c, 0); - c = cut_last_push(c); - c = code_append(c, right.c); - c = converttype(c, right.t, t); - code_t*label = c = abc_label(c); - jmp->branch = label; - RET; -} -code_t* node_oror_exec(node_t*n) -{ - typedcode_t left = n->child[0]->type->read(n->child[0]); - code_t* right = n->child[1]->type->exec(n->child[1]); - code_t*c = left.c; - code_t*jmp = c = abc_iftrue(c, 0); - c = code_append(c, right); - code_t*label = c = abc_label(c); - jmp->branch = label; - return c; -} -constant_t node_oror_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_oror = //|| -{ -name: "oror", -flags:NODE_HAS_CHILDREN, -eval: node_oror_eval, -write: node_oror_write, -read: node_oror_read, -exec: node_oror_exec -}; - -// --------------------------- x&&y ---------------------------------- - -typedcode_t node_andand_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_andand_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - t = join_types(left.t, right.t, &node_andand); - c = left.c; - c = converttype(c, left.t, t); - c = abc_dup(c); - code_t*jmp = c = abc_iffalse(c, 0); - c = cut_last_push(c); - c = code_append(c,right.c); - c = converttype(c, right.t, t); - code_t*label = c = abc_label(c); - jmp->branch = label; - RET; -} -code_t* node_andand_exec(node_t*n) -{ - typedcode_t left = n->child[0]->type->read(n->child[0]);\ - code_t* right = n->child[1]->type->exec(n->child[1]);\ - code_t*c = left.c; - code_t*jmp = c = abc_iffalse(c, 0); - c = code_append(c, right); - code_t*label = c = abc_label(c); - jmp->branch = label; - return c; -} -constant_t node_andand_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_andand = //&& -{ -name: "andand", -flags:NODE_HAS_CHILDREN, -eval: node_andand_eval, -write: node_andand_write, -read: node_andand_read, -exec: node_andand_exec -}; - -// ----------------------------- !x ----------------------------------- - -typedcode_t node_not_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_not_read(node_t*n) -{ - READ_HEADER_ONE; - c = x.c; - c = abc_not(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_not_exec(node_t*n) -{ - EXEC_HEADER_ONE; - return x; -} -constant_t node_not_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_not = -{ -name: "not", -flags:NODE_HAS_CHILDREN, -eval: node_not_eval, -write: node_not_write, -read: node_not_read, -exec: node_not_exec -}; - -// ----------------------------- ~x ----------------------------------- - -typedcode_t node_bitnot_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_bitnot_read(node_t*n) -{ - READ_HEADER_ONE; - c = x.c; - c = abc_bitnot(c); - t = TYPE_INT; - RET; -} -code_t* node_bitnot_exec(node_t*n) -{ - EXEC_HEADER_ONE; - return x; -} -constant_t node_bitnot_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_bitnot = -{ -name: "bitnot", -flags:NODE_HAS_CHILDREN, -eval: node_bitnot_eval, -write: node_bitnot_write, -read: node_bitnot_read, -exec: node_bitnot_exec -}; - -// ----------------------------- x&y ----------------------------------- - -typedcode_t node_bitand_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_bitand_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_bitand(c); - t = TYPE_INT; - RET; -} -code_t* node_bitand_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_bitand_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_bitand = -{ -name: "bitand", -flags:NODE_HAS_CHILDREN, -eval: node_bitand_eval, -write: node_bitand_write, -read: node_bitand_read, -exec: node_bitand_exec -}; - -// ----------------------------- x^y ----------------------------------- - -typedcode_t node_bitxor_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_bitxor_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_bitxor(c); - t = TYPE_INT; - RET; -} -code_t* node_bitxor_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_bitxor_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_bitxor = -{ -name: "bitxor", -flags:NODE_HAS_CHILDREN, -eval: node_bitxor_eval, -write: node_bitxor_write, -read: node_bitxor_read, -exec: node_bitxor_exec -}; - -// ----------------------------- x|y ----------------------------------- - -typedcode_t node_bitor_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_bitor_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_bitor(c); - t = TYPE_INT; - RET; -} -code_t* node_bitor_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_bitor_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_bitor = -{ -name: "bitor", -flags:NODE_HAS_CHILDREN, -eval: node_bitor_eval, -write: node_bitor_write, -read: node_bitor_read, -exec: node_bitor_exec -}; - -// ---------------------------- x>>y ----------------------------------- - -typedcode_t node_shr_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_shr_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_rshift(c); - t = TYPE_INT; - RET; -} -code_t* node_shr_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_shr_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_shr = //>> -{ -name: "shr", -flags:NODE_HAS_CHILDREN, -eval: node_shr_eval, -write: node_shr_write, -read: node_shr_read, -exec: node_shr_exec -}; - -// ---------------------------- x<>>y ----------------------------------- - -typedcode_t node_ushr_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_ushr_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_urshift(c); - t = TYPE_INT; - RET; -} -code_t* node_ushr_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_ushr_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_ushr = //>>> -{ -name: "ushr", -flags:NODE_HAS_CHILDREN, -eval: node_ushr_eval, -write: node_ushr_write, -read: node_ushr_read, -exec: node_ushr_exec -}; - -// ---------------------------- x in y ---------------------------------- - -typedcode_t node_in_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_in_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c,right.c); - c = abc_in(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_in_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_in_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_in = //in -{ -name: "in", -flags:NODE_HAS_CHILDREN, -eval: node_in_eval, -write: node_in_write, -read: node_in_read, -exec: node_in_exec -}; - -// ---------------------------- x as y ---------------------------------- - -typedcode_t node_as_write(node_t*n) -{ - /* ? */ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_as_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c, right.c); - c = abc_astypelate(c); - if(TYPE_IS_CLASS(right.t) && right.t->data) { - t = (classinfo_t*)right.t->data; - } else { - t = TYPE_ANY; - } - RET; -} -code_t* node_as_exec(node_t*n) -{ - /* we assume here that "as" doesn't have side-effects (like - early run time type checking) */ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_as_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_as = //as -{ -name: "as", -flags:NODE_HAS_CHILDREN, -eval: node_as_eval, -write: node_as_write, -read: node_as_read, -exec: node_as_exec -}; - -// ------------------------- x instanceof y ----------------------------- - -typedcode_t node_instanceof_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_instanceof_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c, right.c); - c = abc_instanceof(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_instanceof_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_instanceof_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_instanceof = //instanceof -{ -name: "instanceof", -flags:NODE_HAS_CHILDREN, -eval: node_instanceof_eval, -write: node_instanceof_write, -read: node_instanceof_read, -exec: node_instanceof_exec -}; - -// ------------------------- x is y -------------------------------------- - -typedcode_t node_is_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_is_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c, right.c); - c = abc_istypelate(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_is_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_is_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_is = //is -{ -name: "is", -flags:NODE_HAS_CHILDREN, -eval: node_is_eval, -write: node_is_write, -read: node_is_read, -exec: node_is_exec -}; - -// ------------------------- x[y] -------------------------------------- - -typedcode_t node_arraylookup_write(node_t*n) -{ - syntaxerror("not implemented yet"); -} -typedcode_t node_arraylookup_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = code_append(left.c, right.c); - - /* XXX not sure whether this access logic is correct */ - namespace_t ns = {left.t?left.t->access:ACCESS_PACKAGE, ""}; - namespace_set_t nsset; - namespace_list_t l;l.next = 0; - nsset.namespaces = &l; - l.namespace = &ns; - multiname_t m = {MULTINAMEL, 0, &nsset, 0}; - - c = abc_getproperty2(c, &m); - t = 0; // array elements have unknown type - RET; -} -code_t* node_arraylookup_exec(node_t*n) -{ - EXEC_HEADER_LEFTRIGHT; - return code_append(left, right); -} -constant_t node_arraylookup_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_arraylookup = -{ -name: "arraylookup", -flags:NODE_HAS_CHILDREN, -eval: node_arraylookup_eval, -write: node_arraylookup_write, -read: node_arraylookup_read, -exec: node_arraylookup_exec -}; - -// ------------------------- typeof(x) ------------------------------------ - -typedcode_t node_typeof_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_typeof_read(node_t*n) -{ - READ_HEADER_ONE; - c = x.c; - c = abc_typeof(c); - t = TYPE_BOOLEAN; - RET; -} -code_t* node_typeof_exec(node_t*n) -{ - EXEC_HEADER_ONE; - return x; -} -constant_t node_typeof_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_typeof = //typeof -{ -name: "typeof", -flags:NODE_HAS_CHILDREN, -eval: node_typeof_eval, -write: node_typeof_write, -read: node_typeof_read, -exec: node_typeof_exec -}; - -// ------------------------- (void)(x) ------------------------------------ - -typedcode_t node_void_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_void_read(node_t*n) -{ - code_t*c = n->type->exec(n); - c = abc_pushundefined(c); - classinfo_t*t = TYPE_ANY; - RET; -} -code_t* node_void_exec(node_t*n) -{ - EXEC_HEADER_ONE; - return x; -} -constant_t node_void_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_void = //void -{ -name: "void", -flags:NODE_HAS_CHILDREN, -eval: node_void_eval, -write: node_void_write, -read: node_void_read, -exec: node_void_exec -}; - -// ---------------------------- -x ---------------------------------------- - -typedcode_t node_neg_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_neg_read(node_t*n) -{ - READ_HEADER_ONE; - c = x.c; - if(IS_INT(x.t)) { - c = abc_negate_i(c); - t = TYPE_INT; - } else { - c = abc_negate(c); - t = TYPE_NUMBER; - } - RET; -} -code_t* node_neg_exec(node_t*n) -{ - EXEC_HEADER_ONE; - return x; -} -constant_t node_neg_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_neg = //- -{ -name: "neg", -flags:NODE_HAS_CHILDREN, -eval: node_neg_eval, -write: node_neg_write, -read: node_neg_read, -exec: node_neg_exec -}; - -// ---------------------------- x*=y ---------------------------------------- - -typedcode_t node_muleq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_muleq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = right.c; - classinfo_t*f = 0; - if(BOTH_INT(left.t,right.t)) { - c=abc_multiply_i(c); - f = TYPE_INT; - } else { - c=abc_multiply(c); - f = TYPE_NUMBER; - } - c=converttype(c, f, left.t); - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_muleq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = right.c; - classinfo_t*f = 0; - if(BOTH_INT(left.t,right.t)) { - c=abc_multiply_i(c); - f = TYPE_INT; - } else { - c=abc_multiply(c); - f = TYPE_NUMBER; - } - c = converttype(c, f, left.t); - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_muleq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_muleq = -{ -name: "muleq", -flags:NODE_HAS_CHILDREN, -eval: node_muleq_eval, -write: node_muleq_write, -read: node_muleq_read, -exec: node_muleq_exec -}; - -// ---------------------------- x%=y ---------------------------------------- - -typedcode_t node_modeq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_modeq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_modulo(right.c); - c = converttype(c, TYPE_NUMBER, left.t); - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_modeq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_modulo(right.c); - c = converttype(c, TYPE_NUMBER, left.t); - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_modeq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_modeq = //%= -{ -name: "modeq", -flags:NODE_HAS_CHILDREN, -eval: node_modeq_eval, -write: node_modeq_write, -read: node_modeq_read, -exec: node_modeq_exec -}; - -// ---------------------------- x<<=y ---------------------------------------- - -typedcode_t node_shleq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_shleq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_lshift(right.c); - c = converttype(c, TYPE_INT, left.t); - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_shleq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_lshift(right.c); - c = converttype(c, TYPE_INT, left.t); - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_shleq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_shleq = //<<= -{ -name: "shleq", -flags:NODE_HAS_CHILDREN, -eval: node_shleq_eval, -write: node_shleq_write, -read: node_shleq_read, -exec: node_shleq_exec -}; - -// ---------------------------- x>>=y ---------------------------------------- - -typedcode_t node_shreq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_shreq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_rshift(right.c); - c = converttype(c, TYPE_INT, left.t); - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_shreq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_rshift(right.c); - c = converttype(c, TYPE_INT, left.t); - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_shreq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_shreq = //>>= -{ -name: "shreq", -flags:NODE_HAS_CHILDREN, -eval: node_shreq_eval, -write: node_shreq_write, -read: node_shreq_read, -exec: node_shreq_exec -}; - -// --------------------------- x>>>=y ---------------------------------------- - -typedcode_t node_ushreq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_ushreq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_urshift(right.c); - c = converttype(c, TYPE_UINT, left.t); - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_ushreq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_urshift(right.c); - c = converttype(c, TYPE_UINT, left.t); - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_ushreq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_ushreq = //>>>= -{ -name: "ushreq", -flags:NODE_HAS_CHILDREN, -eval: node_ushreq_eval, -write: node_ushreq_write, -read: node_ushreq_read, -exec: node_ushreq_exec -}; - -// --------------------------- x/=y ---------------------------------------- - -typedcode_t node_diveq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_diveq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_divide(right.c); - c = converttype(c, TYPE_NUMBER, left.t); - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_diveq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_divide(right.c); - c = converttype(c, TYPE_NUMBER, left.t); - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_diveq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_diveq = -{ -name: "diveq", -flags:NODE_HAS_CHILDREN, -eval: node_diveq_eval, -write: node_diveq_write, -read: node_diveq_read, -exec: node_diveq_exec -}; - -// --------------------------- x|=y ---------------------------------------- - -typedcode_t node_bitoreq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_bitoreq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_bitor(right.c); - c = converttype(c, TYPE_INT, left.t); - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_bitoreq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_bitor(right.c); - c = converttype(c, TYPE_INT, left.t); - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_bitoreq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_bitoreq = //|= -{ -name: "bitoreq", -flags:NODE_HAS_CHILDREN, -eval: node_bitoreq_eval, -write: node_bitoreq_write, -read: node_bitoreq_read, -exec: node_bitoreq_exec -}; - -// --------------------------- x^=y ---------------------------------------- - -typedcode_t node_bitxoreq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_bitxoreq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_bitxor(right.c); - c = converttype(c, TYPE_INT, left.t); - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_bitxoreq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_bitxor(right.c); - c = converttype(c, TYPE_INT, left.t); - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_bitxoreq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_bitxoreq = //^= -{ -name: "bitxoreq", -flags:NODE_HAS_CHILDREN, -eval: node_bitxoreq_eval, -write: node_bitxoreq_write, -read: node_bitxoreq_read, -exec: node_bitxoreq_exec -}; - -// --------------------------- x&=y ---------------------------------------- - -typedcode_t node_bitandeq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_bitandeq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_bitand(right.c); - c = converttype(c, TYPE_INT, left.t); - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_bitandeq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = abc_bitand(right.c); - c = converttype(c, TYPE_INT, left.t); - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_bitandeq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_bitandeq = //^= -{ -name: "bitandeq", -flags:NODE_HAS_CHILDREN, -eval: node_bitandeq_eval, -write: node_bitandeq_write, -read: node_bitandeq_read, -exec: node_bitandeq_exec -}; - -// --------------------------- x+=y ---------------------------------------- - -typedcode_t node_pluseq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_pluseq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = right.c; - if(TYPE_IS_INT(left.t)) { - c = abc_add_i(c); - } else { - c = abc_add(c); - c = converttype(c, join_types(left.t,right.t,&node_plus), left.t); - } - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_pluseq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = right.c; - if(TYPE_IS_INT(left.t)) { - c = abc_add_i(c); - } else { - c = abc_add(c); - c = converttype(c, join_types(left.t,right.t,&node_plus), left.t); - } - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_pluseq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_pluseq = //+= -{ -name: "pluseq", -flags:NODE_HAS_CHILDREN, -eval: node_pluseq_eval, -write: node_pluseq_write, -read: node_pluseq_read, -exec: node_pluseq_exec -}; - -// --------------------------- x-=y ---------------------------------------- - -typedcode_t node_minuseq_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_minuseq_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = right.c; - if(TYPE_IS_INT(left.t)) { - c = abc_subtract_i(c); - } else { - c = abc_subtract(c); - c = converttype(c, TYPE_NUMBER, left.t); - } - c = toreadwrite(left.c, c, 0, 0, 1); - t = left.t; - RET; -} -code_t* node_minuseq_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = right.c; - if(TYPE_IS_INT(left.t)) { - c = abc_subtract_i(c); - } else { - c = abc_subtract(c); - c = converttype(c, TYPE_NUMBER, left.t); - } - return toreadwrite(left.c, c, 0, 0, 0); -} -constant_t node_minuseq_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_minuseq = //-= -{ -name: "minuseq", -flags:NODE_HAS_CHILDREN, -eval: node_minuseq_eval, -write: node_minuseq_write, -read: node_minuseq_read, -exec: node_minuseq_exec -}; - -// --------------------------- x=y ----------------------------------------- - -typedcode_t node_assign_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_assign_read(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = right.c; - c = converttype(c, right.t, left.t); - c = toreadwrite(left.c, c, 1, 0, 1); - t = left.t; - RET; -} -code_t* node_assign_exec(node_t*n) -{ - READ_HEADER_LEFTRIGHT; - c = right.c; - c = converttype(c, right.t, left.t); - return toreadwrite(left.c, c, 1, 0, 0); -} -constant_t node_assign_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_assign = -{ -name: "assign", -flags:NODE_HAS_CHILDREN, -eval: node_assign_eval, -write: node_assign_write, -read: node_assign_read, -exec: node_assign_exec -}; - -// --------------------------- x?y1:y2 -------------------------------------- - -typedcode_t node_tenary_write(node_t*n) -{ - /* TODO: this might actually be kinda useful. - (global?global.x:this.x) = 3; - */ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_tenary_read(node_t*n) -{ - typedcode_t cond = n->child[0]->type->read(n->child[0]); - typedcode_t left = n->child[1]->type->read(n->child[1]); - typedcode_t right = n->child[2]->type->read(n->child[2]); - classinfo_t*t = join_types(left.t,right.t,&node_tenary); - code_t* c = cond.c; - code_t*j1 = c = abc_iffalse(c, 0); - c = code_append(c, left.c); - c = converttype(c, left.t, t); - code_t*j2 = c = abc_jump(c, 0); - c = j1->branch = abc_label(c); - c = code_append(c, right.c); - c = converttype(c, right.t, t); - c = j2->branch = abc_label(c); - RET; -} -code_t* node_tenary_exec(node_t*n) -{ - typedcode_t cond = n->child[0]->type->read(n->child[0]); - code_t* left = n->child[1]->type->exec(n->child[1]); - code_t* right = n->child[2]->type->exec(n->child[2]); - code_t* c = cond.c; - code_t*j1 = c = abc_iffalse(c, 0); - c = code_append(c, left); - code_t*j2 = c = abc_jump(c, 0); - c = j1->branch = abc_label(c); - c = code_append(c, right); - c = j2->branch = abc_label(c); - return c; -} -constant_t node_tenary_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_tenary = -{ -name: "tenary", -flags:NODE_HAS_CHILDREN, -eval: node_tenary_eval, -write: node_tenary_write, -read: node_tenary_read, -exec: node_tenary_exec -}; - -// ---------------------------- comma ---------------------------------------- - -typedcode_t node_comma_write(node_t*n) -{ - syntaxerror("can't assign to this expression"); -} -typedcode_t node_comma_read(node_t*n) -{ - code_t*c = 0; - classinfo_t*t = 0; - int i; - for(i=0;inum_children-1;i++) { - c = code_append(c, n->child[i]->type->exec(n->child[i])); - } - typedcode_t o = n->child[i]->type->read(n->child[i]); - c = code_append(c, o.c); - t = o.t; - RET; -} -code_t* node_comma_exec(node_t*n) -{ - int t; - code_t*c = 0; - for(t=0;tnum_children;t++) { - c = code_append(c, n->child[t]->type->exec(n->child[t])); - } - return c; -} -constant_t node_comma_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_comma = -{ -name: "expr", -flags: NODE_HAS_CHILDREN, -eval: node_comma_eval, -write: node_comma_write, -read: node_comma_read, -exec: node_comma_exec -}; - - -#if 0 -// -------------------------- new x ----------------------------------- - -typedcode_t node_new_write(node_t*n) -{ -} -typedcode_t node_new_read(node_t*n) -{ -} -code_t* node_new_exec(node_t*n) -{ -} -constant_t node_new_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_new = //new -{ -write: node_new_write, -read: node_new_read, -eval: node_new_eval, -exec: node_new_exec -}; - -// ------------------------ delete x ---------------------------------- - -typedcode_t node_delete_write(node_t*n) -{ -} -typedcode_t node_delete_read(node_t*n) -{ -} -code_t* node_delete_exec(node_t*n) -{ -} -constant_t node_delete_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_delete = //delete -{ -write: node_delete_write, -read: node_delete_read, -eval: node_delete_eval, -exec: node_delete_exec -}; - -// ---------------------------- x.y ----------------------------------- - -typedcode_t node_dot_write(node_t*n) -{ -} -typedcode_t node_dot_read(node_t*n) -{ -} -code_t* node_dot_exec(node_t*n) -{ -} -constant_t node_dot_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_dot = -{ -write: node_dot_write, -read: node_dot_read, -eval: node_dot_eval, -exec: node_dot_exec -}; - -// --------------------------- x..y ----------------------------------- - -typedcode_t node_dotdot_write(node_t*n) -{ -} -typedcode_t node_dotdot_read(node_t*n) -{ -} -code_t* node_dotdot_exec(node_t*n) -{ - -} -constant_t node_dotdot_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_dotdot = //.. -{ -write: node_dotdot_write, -read: node_dotdot_read, -eval: node_dotdot_eval, -exec: node_dotdot_exec -}; - -// --------------------------- x.@y ----------------------------------- - -typedcode_t node_dotat_write(node_t*n) -{ -} -typedcode_t node_dotat_read(node_t*n) -{ -} -code_t* node_dotat_exec(node_t*n) -{ -} -constant_t node_dotat_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_dotat = //.@ -{ -write: node_dotat_write, -read: node_dotat_read, -eval: node_dotat_eval, -exec: node_dotat_exec -}; - -// --------------------------- x.*y ----------------------------------- - -typedcode_t node_dotstar_write(node_t*n) -{ -} -typedcode_t node_dotstar_read(node_t*n) -{ -} -code_t* node_dotstar_exec(node_t*n) -{ -} -constant_t node_dotstar_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_dotstar = //.* -{ -write: node_dotstar_write, -read: node_dotstar_read, -eval: node_dotstar_eval, -exec: node_dotstar_exec -}; - -// -------------------------- x.(y) ----------------------------------- - -typedcode_t node_filter_write(node_t*n) -{ -} -typedcode_t node_filter_read(node_t*n) -{ -} -code_t* node_filter_exec(node_t*n) -{ -} -constant_t node_filter_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_filter = //.( -{ -write: node_filter_write, -read: node_filter_read, -eval: node_filter_eval, -exec: node_filter_exec -}; - -// ------------------------ x(y1,...,yn) ------------------------------ - -typedcode_t node_call_write(node_t*n) -{ -} -typedcode_t node_call_read(node_t*n) -{ -} -code_t* node_call_exec(node_t*n) -{ -} -constant_t node_call_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_call = //functioncall -{ -write: node_call_write, -read: node_call_read, -eval: node_call_eval, -exec: node_call_exec -}; - -// ------------------------------ @x ---------------------------------------- - -typedcode_t node_at_write(node_t*n) -{ -} -typedcode_t node_at_read(node_t*n) -{ -} -code_t* node_at_exec(node_t*n) -{ -} -constant_t node_at_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_at = //@ -{ -write: node_at_write, -read: node_at_read, -eval: node_at_eval, -exec: node_at_exec -}; - -// ---------------------------- x.ns::y ---------------------------------------- - -typedcode_t node_dotns_write(node_t*n) -{ -} -typedcode_t node_dotns_read(node_t*n) -{ -} -code_t* node_dotns_exec(node_t*n) -{ -} -constant_t node_dotns_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_dotns = //.:: -{ -write: node_dotns_write, -read: node_dotns_read, -eval: node_dotns_eval, -exec: node_dotns_exec -}; -#endif - -// ------------------------ constant ------------------------------ - -typedcode_t node_const_write(node_t*n) -{ - syntaxerror("can't assign a value to a constant"); -} -typedcode_t node_const_read(node_t*n) -{ - constant_t*v = n->value; - code_t*c=0; - classinfo_t*t=0; - switch(v->type) { - case CONSTANT_INT: - if(v->i>-128 && v->i<128) { - c = abc_pushbyte(0,v->i); - } else if(v->i>=-32768 && v->i<32768) { - c = abc_pushshort(0,v->i); - } else { - c = abc_pushint(0,v->i); - } - t = TYPE_INT; - break; - case CONSTANT_UINT: - c = abc_pushuint(0,v->u); - if(v->u<128) { - c = abc_pushbyte(0,v->u); - } else if(v->u<32768) { - c = abc_pushshort(0,v->u); - } else { - c = abc_pushint(0,v->u); - } - t = TYPE_UINT; - break; - case CONSTANT_FLOAT: - c = abc_pushdouble(0,v->f); - t = TYPE_FLOAT; - break; - case CONSTANT_TRUE: - c = abc_pushtrue(0); - t = TYPE_BOOLEAN; - break; - case CONSTANT_FALSE: - c = abc_pushfalse(0); - t = TYPE_BOOLEAN; - break; - case CONSTANT_NULL: - c = abc_pushnull(0); - t = TYPE_NULL; - break; - case CONSTANT_STRING: - c = abc_pushstring2(0,v->s); - t = TYPE_STRING; - break; - case CONSTANT_UNDEFINED: - c = abc_pushundefined(0); - t = 0; - break; - case CONSTANT_NAMESPACE: - case CONSTANT_NAMESPACE_PACKAGE: - case CONSTANT_NAMESPACE_PACKAGEINTERNAL: - case CONSTANT_NAMESPACE_PROTECTED: - case CONSTANT_NAMESPACE_EXPLICIT: - case CONSTANT_NAMESPACE_STATICPROTECTED: - case CONSTANT_NAMESPACE_PRIVATE: - c = abc_pushnamespace(0, v->ns); - break; - case CONSTANT_UNKNOWN: - syntaxerror("internal error: invalid constant"); - default: - *(int*)0=0; - syntaxerror("invalid constant (%d)", v->type); - - } - RET; -} - -code_t* node_const_exec(node_t*n) -{ - return 0; -} -constant_t node_const_eval(node_t*n) -{ - constant_t*c = constant_clone(n->value); - constant_t r = *c; - free(c); //shallow free - return r; -} -nodetype_t node_const = -{ -name: "const", -flags:0, -eval: node_const_eval, -write: node_const_write, -read: node_const_read, -exec: node_const_exec -}; - -// ------------------------ code node ------------------------------ - -typedcode_t node_code_write(node_t*n) -{ - typedcode_t t; - t.c = 0; - int tmp = gettempvar(); - t.c = abc_setlocal(t.c, tmp); - code_t*w = toreadwrite(n->code.c, abc_getlocal(0,tmp), 1, 0, 0); - t.c = code_append(t.c, w); - t.c = abc_kill(t.c, tmp); - n->code.c=0; - t.t = n->code.t; - return t; -} -typedcode_t node_code_read(node_t*n) -{ - typedcode_t t; - t.c = n->code.c; - n->code.c=0; - t.t = n->code.t; - return t; -} -code_t* node_code_exec(node_t*n) -{ - code_t*c = code_dup(n->code.c); - c = cut_last_push(c); - return c; -} -constant_t node_code_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_code = -{ -name: "code", -flags:0, -eval: node_code_eval, -write: node_code_write, -read: node_code_read, -exec: node_code_exec -}; - -// ------------------------ dummy node ------------------------------ - -typedcode_t node_dummy_write(node_t*n) -{ - syntaxerror("not implemented yet"); -} -typedcode_t node_dummy_read(node_t*n) -{ - typedcode_t t; - t.c = abc_pushundefined(0); - t.t = TYPE_ANY; - return t; -} -code_t* node_dummy_exec(node_t*n) -{ - return 0; -} -constant_t node_dummy_eval(node_t*n) -{ - constant_t r;r.type=CONSTANT_UNKNOWN;return r; -} -nodetype_t node_dummy = -{ -name: "dummy", -flags:0, -eval: node_dummy_eval, -write: node_dummy_write, -read: node_dummy_read, -exec: node_dummy_exec -}; - -// ======================== node handling ============================== - -node_t* mkdummynode() -{ - node_t*n = (node_t*)rfx_calloc(sizeof(node_t)); - n->type = &node_dummy; - return n; -} - -node_t* mkconstnode(constant_t*c) -{ - node_t*n = (node_t*)malloc(sizeof(node_t)); - n->type = &node_const; - n->parent = 0; - n->value = c; - return n; -} - -node_t* mkcodenode(typedcode_t c) -{ - node_t*n = (node_t*)malloc(sizeof(node_t)); - n->type = &node_code; - n->parent = 0; - n->code = c; - return n; -} - -node_t* mkmultinode(nodetype_t*t, node_t*one) -{ - node_t*n = (node_t*)malloc(sizeof(node_t)); - n->type = t; - n->parent = 0; - n->child = (node_t**)malloc(sizeof(node_t*)*1); - n->child[0] = one; - n->num_children = 1; - return n; -} - -node_t* mkstringnode(const char*s) -{ - return mkconstnode(constant_new_string(s)); -} - -node_t* mkaddnode(node_t*n1, node_t*n2) -{ - return mknode2(&node_plus, n1, n2); -} - -node_t* multinode_extend(node_t*n, node_t*add) -{ - n->child = realloc(n->child, (n->num_children+1)*sizeof(node_t*)); - n->child[n->num_children] = add; - n->num_children++; - return n; -} - -node_t* mknode1(nodetype_t*t, node_t*node) -{ - node_t*n = (node_t*)malloc(sizeof(node_t)+sizeof(node_t*)*2); - node_t**x = (node_t**)&n[1]; - n->type = t; - n->parent = 0; - n->child = x; - n->num_children = 1; - x[0] = node; - x[1] = 0; - return n; -}; - -node_t* mknode2(nodetype_t*t, node_t*left, node_t*right) -{ - node_t*n = (node_t*)malloc(sizeof(node_t)+sizeof(node_t*)*3); - node_t**x = (node_t**)&n[1]; - n->type = t; - n->parent = 0; - n->child = x; - n->num_children = 2; - x[0] = left; - x[1] = right; - x[2] = 0; - return n; -} -node_t* mknode3(nodetype_t*t, node_t*one, node_t*two, node_t*three) -{ - node_t*n = (node_t*)malloc(sizeof(node_t)+sizeof(node_t*)*4); - node_t**x = (node_t**)&n[1]; - n->type = t; - n->parent = 0; - n->child = x; - n->num_children = 3; - x[0] = one; - x[1] = two; - x[2] = three; - x[3] = 0; - return n; -} - -void node_free(node_t*n) -{ - int t; - if(n->type == &node_code) { - if(n->code.c) { - code_free(n->code.c);n->code.c = 0; - } - } else if(n->type == &node_const) { - /* keep, this is not our reference */ - } else for(t=0;tnum_children;t++) { - node_free(n->child[t]);n->child[t] = 0; - } - free(n); -} - -typedcode_t node_read(node_t*n) -{ - constant_t c = n->type->eval(n); - if(c.type == CONSTANT_UNKNOWN) { - typedcode_t t = n->type->read(n); - node_free(n); - return t; - } else { - typedcode_t t = push_constant(&c); - node_free(n); - return t; - } -} -typedcode_t node_write(node_t*n) -{ - typedcode_t t = n->type->write(n); - node_free(n); - return t; -} -code_t* node_exec(node_t*n) -{ - code_t*c = n->type->exec(n); - node_free(n); - return c; -} -constant_t node_eval(node_t*n) -{ - constant_t c = n->type->eval(n); - node_free(n); - return c; -} - -/* - | - +-add - | | - | +-code - | | - | +-code - | | - | + - | - +-div - -*/ -void node_dump2(node_t*n, const char*p1, const char*p2, FILE*fi) -{ - if(n->type->flags&NODE_HAS_CHILDREN) { - fprintf(fi, "%s%s\n", p1, n->type->name); - int t; - char*o2 = malloc(strlen(p2)+3); - strcpy(o2, p2);strcat(o2, "| "); - char*o3 = malloc(strlen(p2)+3); - strcpy(o3, p2);strcat(o3, "+-"); - char*o4 = malloc(strlen(p2)+3); - strcpy(o4, p2);strcat(o4, " "); - - for(t=0;tnum_children;t++) { - fprintf(fi, "%s\n", o2); - node_dump2(n->child[t], o3, tnum_children-1?o2:o4, fi); - } - free(o2); - free(o3); - free(o4); - } else if(n->type == &node_const) { - char*s = constant_tostring(n->value); - fprintf(fi, "%s%s (%s)\n", p1, n->type->name, s); - free(s); - } else if(n->type == &node_code) { - fprintf(fi, "%s%s (%s)\n", p1, n->type->name, n->code.t?n->code.t->name:"*"); - code_dump2(n->code.c, 0, 0, (char*)p2, fi); - } else { - fprintf(fi, "%s%s\n", p1, n->type->name); - } -} - -void node_dump(node_t*n) -{ - printf("------------VVVV---------------\n"); - node_dump2(n,"","",stdout); - printf("-------------------------------\n"); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.h deleted file mode 100644 index d216c2c20..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/expr.h +++ /dev/null @@ -1,149 +0,0 @@ -/* expr.h - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __expr_h__ -#define __expr_h__ - -#include "../q.h" -#include "code.h" -#include "registry.h" -#include "pool.h" - -DECLARE(node); -DECLARE(typedcode); -DECLARE(nodetype); -DECLARE_LIST(node); - -struct _typedcode { - code_t*c; - classinfo_t*t; -}; - -#define NODE_HAS_CHILDREN 1 - -struct _nodetype { - char*name; - int flags; - typedcode_t (*write)(node_t*n); - typedcode_t (*read)(node_t*n); - code_t* (*exec)(node_t*n); - constant_t (*eval)(node_t*n); -}; - -extern nodetype_t node_plus; -extern nodetype_t node_minus; -extern nodetype_t node_lplusplus; //++x -extern nodetype_t node_lminusminus; //--x -extern nodetype_t node_rplusplus; //x++ -extern nodetype_t node_rminusminus; //x-- -extern nodetype_t node_multiply; -extern nodetype_t node_div; -extern nodetype_t node_mod; -extern nodetype_t node_dot; -extern nodetype_t node_lt; -extern nodetype_t node_gt; -extern nodetype_t node_le; //<= -extern nodetype_t node_ge; //>= -extern nodetype_t node_eqeq; //== -extern nodetype_t node_eqeqeq; //=== -extern nodetype_t node_noteqeq; //!== -extern nodetype_t node_noteq; //!= -extern nodetype_t node_oror; //|| -extern nodetype_t node_andand; //&& -extern nodetype_t node_not; -extern nodetype_t node_bitnot; -extern nodetype_t node_bitand; -extern nodetype_t node_bitxor; -extern nodetype_t node_bitor; -extern nodetype_t node_shr; //>> -extern nodetype_t node_shl; //<< -extern nodetype_t node_ushr; //>>> -extern nodetype_t node_in; //in -extern nodetype_t node_as; //as -extern nodetype_t node_instanceof; //instanceof -extern nodetype_t node_is; //is -extern nodetype_t node_typeof; //typeof -extern nodetype_t node_void; //void -extern nodetype_t node_neg; //- -extern nodetype_t node_muleq; //*= -extern nodetype_t node_modeq; //%= -extern nodetype_t node_shleq; //<<= -extern nodetype_t node_shreq; //>>= -extern nodetype_t node_ushreq; //>>>= -extern nodetype_t node_diveq; ///= -extern nodetype_t node_bitoreq; //|= -extern nodetype_t node_bitxoreq; //^= -extern nodetype_t node_bitandeq; //&= -extern nodetype_t node_pluseq; //+= -extern nodetype_t node_minuseq; //-= -extern nodetype_t node_assign; //-= -extern nodetype_t node_tenary; //?: -extern nodetype_t node_arraylookup; //x[y] -extern nodetype_t node_comma; //(y1,y2,...,yn) - -extern nodetype_t node_const; -extern nodetype_t node_code; - -#if 0 -extern nodetype_t node_dotdot; //.. -extern nodetype_t node_dotat; //.@ -extern nodetype_t node_dotstar; //.* -extern nodetype_t node_filter; //.( -extern nodetype_t node_new; //new -extern nodetype_t node_delete; //delete -extern nodetype_t node_call; //functioncall -extern nodetype_t node_at; //@ -extern nodetype_t node_dotns; //.:: -#endif - -node_t* multinode_extend(node_t*n, node_t*add); - -struct _node { - nodetype_t*type; - node_t*parent; - union { - struct { - node_t**child; - int num_children; - }; - constant_t*value; - char*id; - typedcode_t code; - }; -}; - -node_t* mkdummynode(); -node_t* mkconstnode(constant_t*c); -node_t* mkcodenode(typedcode_t c); -node_t* mkstringnode(const char*s); -node_t* mkaddnode(node_t*n1, node_t*n2); -node_t* mkmultinode(nodetype_t*t, node_t*one); -node_t* mknode1(nodetype_t*t, node_t*node); -node_t* mknode2(nodetype_t*t, node_t*left, node_t*right); -node_t* mknode3(nodetype_t*t, node_t*one, node_t*two, node_t*three); -void node_free(node_t*n); -typedcode_t node_read(node_t*n); //read and free -typedcode_t node_write(node_t*n); //write and free -code_t* node_exec(node_t*n); //exec and free -constant_t node_eval(node_t*n); //eval and free -void node_dump(node_t*n); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/files.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/files.c deleted file mode 100644 index f6284ddf5..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/files.c +++ /dev/null @@ -1,327 +0,0 @@ -/* files.c - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include "files.h" -#include "common.h" -#include "tokenizer.h" -#include "../os.h" - -static int verbose = 0; -static void dbg(const char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - if(!verbose) - return; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - printf("(includefilehandler) "); - printf("%s\n", buf); - fflush(stdout); -} - - -int current_line=1; -int current_column=0; -char* current_filename=0; -char* current_filename_short=0; -char* current_filename_long=0; -include_dir_t* current_include_dirs=0; - -#define MAX_INCLUDE_DEPTH 16 - -void*include_stack[MAX_INCLUDE_DEPTH]; -int line_stack[MAX_INCLUDE_DEPTH]; -int column_stack[MAX_INCLUDE_DEPTH]; -char* filename_stack[MAX_INCLUDE_DEPTH]; -char* shortfilename_stack[MAX_INCLUDE_DEPTH]; -char* longfilename_stack[MAX_INCLUDE_DEPTH]; -include_dir_t* includedir_stack[MAX_INCLUDE_DEPTH]; -int include_stack_ptr = 0; - -void add_include_dir(char*dir) -{ - include_dir_t*d = malloc(sizeof(include_dir_t)); - memset(d , 0, sizeof(include_dir_t)); - d->path = strdup(dir); - d->next = current_include_dirs; - current_include_dirs = d; -} - -void del_include_dirs(include_dir_t*d, include_dir_t*d2) -{ - while(d && d!=d2) { - include_dir_t*next = d->next; - free(d->path);d->path=0; - d->next = 0; - free(d); - d = next; - } -} - -char*get_path(const char*file) -{ - char*path = strdup(file); - char*r1 = strrchr(path, '/'); - char*r2 = strrchr(path, '\\'); - if(r1r2) { - *r1=0; - return path; - } else { - return strdup("."); - } -} - -char is_absolute(const char*filename) -{ - if(!filename || !filename[0]) - return 0; - if(filename[0]=='/' || filename[0]=='\\') - return 1; - if(filename[1]==':' && filename[2]=='/') - return 1; - if(filename[1]==':' && filename[2]=='\\') - return 1; - return 0; -} - -char* filename_to_lowercase(const char*name) -{ - char*n = strdup(name); - //char*x1 = strrchr(name, '/'); - //char*x2 = strrchr(name, '\\'); - char*s = n; - //if(x1+1>s) s=x1+1; - //if(x2+1>s) s=x2+1; - while(*s) { - /* FIXME: what we probably should do here is use libc's tolower(). - I don't really know yet, though, how Windows (or MacOS X) handles - lowercasing of Unicode filenames */ - if(*s>='A' && *s<='Z') - *s += 'a'-'A'; - s++; - } - return n; -} - -char* normalize_path(const char*path) -{ - char*n = 0, *d = 0; - if(!is_absolute(path)) { - char buf[512]; - char*c = getcwd(buf,512); - int l = strlen(buf); - d = n = malloc(l+strlen(path)+10); - strcpy(n, buf);d += l; - if(!l || n[l-1]!=path_seperator) { - *d=path_seperator;d++; - } - } else { - d = n = strdup(path); - } - const char*s=path; - char init = 1; - - while(*s) { - if(init && s[0] == '.' && (s[1]==path_seperator || s[1]=='\0')) { - if(!s[1]) break; - s+=2; - init=1; - continue; - } - if(init && s[0] == '.' && s[1] == '.' && (s[2] == path_seperator || s[2]=='\0')) { - // step one down - char*last = 0; - if(d<=n) - return 0; - *--d = 0; - if(!(last=strrchr(n, path_seperator))) { - return 0; - } - d = last+1; - if(!s[2]) break; - s+=3; - init=1; - continue; - } - - *d = *s; - if(*s==path_seperator) init=1; - else init=0; - d++;s++; - } - if(d!=n && d[-1]==path_seperator) - d--; - *d = 0; - -#ifdef LOWERCASE_UPPERCASE - n = filename_to_lowercase(n); -#endif - - return n; -} -static void testnormalize() -{ -#define TEST(x) {printf("%s -> %s\n", (x), normalize_path(x));} - TEST("."); - TEST("../as3"); - TEST("../as3/"); - TEST("../as3/parser.y"); - TEST("../as3/ok/../ok/scope.as"); - TEST("ok/scope.as"); - TEST("ok/./scope.as"); - TEST("./ok/scope.as"); - TEST("./"); - TEST("/tmp/"); - TEST("/./tmp/"); - TEST("../"); - TEST("/"); - TEST("/tmp"); - TEST("/tmp/../usr/"); -} - -char* concat_paths(const char*base, const char*add) -{ - int l1 = strlen(base); - int l2 = strlen(add); - int pos = 0; - char*n = 0; - while(l1 && base[l1-1] == path_seperator) - l1--; - while(pos < l2 && add[pos] == path_seperator) - pos++; - n = (char*)malloc(l1 + (l2-pos) + 2); - memcpy(n,base,l1); - n[l1]=path_seperator; - memcpy(&n[l1+1],&add[pos],l2-pos+1); - return n; -} - -char*find_file(const char*filename, char error) -{ - include_dir_t*i = current_include_dirs; - FILE*fi = 0; - if(is_absolute(filename)) { - FILE*fi = fopen(filename, "rb"); - if(fi) { - fclose(fi); - return strdup(filename); - } - } else { - if(!i && error) { - as3_warning("Include directory stack is empty, while looking for file %s", filename); - } - while(i) { - char*p = concat_paths(i->path, filename); - fi = fopen(p, "rb"); - if(fi) { - fclose(fi); - return p; - } else { - free(p); - } - i = i->next; - } - } - if(!error) { - return 0; - } - - as3_error("Couldn't find file %s", filename); - i = current_include_dirs; - while(i) { - fprintf(stderr, "include dir: %s\n", i->path); - i = i->next; - } - return 0; -} - -void enter_file(const char*name, const char*filename, void*state) -{ - if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { - as3_error("Includes nested too deeply"); - exit(1); - } - include_stack[include_stack_ptr] = state; - line_stack[include_stack_ptr] = current_line; - column_stack[include_stack_ptr] = current_column; - shortfilename_stack[include_stack_ptr] = current_filename_short; - longfilename_stack[include_stack_ptr] = current_filename_long; - filename_stack[include_stack_ptr] = current_filename; - includedir_stack[include_stack_ptr] = current_include_dirs; - - /*char*dir = get_path(filename); - add_include_dir(dir); - free(dir);*/ - - include_stack_ptr++; - - dbg("entering file %s", filename); - - current_line=1; - current_column=0; - current_filename = strdup(name); - current_filename_short = strdup(name); - current_filename_long = strdup(filename); -} - -FILE*enter_file2(const char*name, const char*filename, void*state) -{ - enter_file(name, filename, state); - FILE*fi = fopen(filename, "rb"); - if(!fi) { - as3_error("Couldn't find file %s: %s", filename, strerror(errno)); - } - return fi; -} - -void* leave_file() -{ - dbg("leaving file %s", current_filename); - if(--include_stack_ptr<=0) { - return 0; - } else { - free(current_filename);current_filename = filename_stack[include_stack_ptr]; - free(current_filename_short);current_filename_short = shortfilename_stack[include_stack_ptr]; - free(current_filename_long);current_filename_long = longfilename_stack[include_stack_ptr]; - current_column = column_stack[include_stack_ptr]; - current_line = line_stack[include_stack_ptr]; - del_include_dirs(includedir_stack[include_stack_ptr], current_include_dirs); - current_include_dirs = includedir_stack[include_stack_ptr]; - return include_stack[include_stack_ptr]; - } -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/files.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/files.h deleted file mode 100644 index 244df43e9..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/files.h +++ /dev/null @@ -1,48 +0,0 @@ -/* files.h - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __avm2_files_h__ -#define __avm2_files_h__ - -typedef struct _include_dir { - char*path; - struct _include_dir*next; -} include_dir_t; - -extern int current_line; -extern int current_column; -extern char* current_filename; -extern char* current_filename_short; -extern char* current_filename_long; -extern include_dir_t* current_include_dirs; - -void add_include_dir(char*dir); - -char*find_file(const char*filename, char report_errors); -void enter_file(const char*name, const char*filename, void*state); -FILE* enter_file2(const char*name, const char*filename, void*state); -void* leave_file(); - -char* concat_paths(const char*base, const char*add); -char* normalize_path(const char*path); -char* filename_to_lowercase(const char*name); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/import.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/import.c deleted file mode 100644 index df0271e16..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/import.c +++ /dev/null @@ -1,458 +0,0 @@ -/* import.c - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "import.h" -#include "abc.h" -#include "registry.h" -#include "common.h" -#include "tokenizer.h" -#include "assets.h" -#include "../os.h" -#include "../xml.h" -#ifdef HAVE_ZZIP -#include "zzip/lib.h" -#endif - -static void import_code(void*_abc, char*filename, int pass, asset_bundle_t*a); - -void as3_import_abc(char*filename) -{ - TAG*tag = swf_InsertTag(0, ST_RAWABC); - memfile_t*file = memfile_open(filename); - tag->data = file->data; - tag->len = file->len; - abc_file_t*abc = swf_ReadABC(tag); - import_code(abc, filename, 0, 0); - import_code(abc, filename, 1, 0); - swf_FreeABC(abc); - memfile_close(file); - free(tag); -} - -typedef struct _deps { - const char*name; - struct _deps*next; -} deps_t; - -void as3_import_swf2(reader_t*r, char*filename, dict_t*deps) -{ - SWF _swf,*swf=&_swf; - if(swf_ReadSWF2(r, &_swf)<0) - return; - swf_FoldAll(swf); - - TAG*tag = swf->firstTag; - - asset_resolver_t* assets = swf_ParseAssets(swf); - - asset_bundle_list_t* asset_bundles = list_new(); - - dict_t*name2bundle = dict_new(); - /* pass 1 */ - while(tag) { - if(tag->id == ST_DOABC || tag->id == ST_RAWABC) { - abc_file_t*abc = swf_ReadABC(tag); - import_code(abc, filename, 0, 0); - NEW(asset_bundle_t, a); - a->file = abc; - if(abc->name) { - dict_put(name2bundle, abc->name, a); - } - list_append(asset_bundles, a); - } - tag = tag->next; - } - - tag = swf->firstTag; - asset_bundle_list_t*b = asset_bundles; - /* pass 2 */ - while(tag) { - if(tag->id == ST_DOABC || tag->id == ST_RAWABC) { - asset_bundle_t*a = b->asset_bundle; - abc_file_t*abc = a->file; - swf_ResolveAssets(assets, abc); - if(deps && abc->name) { - deps_t*d = dict_lookup(deps, abc->name); - while(d) { - if(d->name) { - asset_bundle_t*other = dict_lookup(name2bundle, d->name); - list_append(a->dependencies, other); - } - d = d->next; - } - } - registry_add_asset(a); - import_code(abc, filename, 1, a); - b=b->next; - } - tag = tag->next; - } - - dict_destroy(name2bundle); - list_free(asset_bundles); - - //swf_FreeTags(swf); // FIXME: mem leak -} - -void as3_import_swf(char*filename) -{ - reader_t reader; - reader_init_filereader2(&reader, filename); - as3_import_swf2(&reader, filename, 0); - reader.dealloc(&reader); -} - -#ifdef HAVE_ZZIP -typedef struct _catalog_state { - char*xml_filename; - char in_libraries; - char*library; - char*script; - dict_t*deps; - deps_t*current_deps; - dict_t*name2deps; - dict_t*id2script; - ZZIP_DIR*dir; -} catalog_state_t; - -const char* fa(catalog_state_t*state, xmlattribute_t*attr, const char*name) -{ - while(attr) { - if(!strcmp(attr->name, name)) return attr->value; - attr = attr->next; - } - syntaxerror("error parsing %s: attribute %s missing", state->xml_filename, name); -} - -void catalog_start_tag(xmlconsumer_t*c, char*name, xmlattribute_t*attr) -{ - catalog_state_t*state = (catalog_state_t*)c->internal; - if(!strcmp(name, "libraries")) { - state->in_libraries = 1; - } else if(!strcmp(name, "library")) { - state->library = strdup(fa(state, attr, "path")); - } else if(!strcmp(name, "script")) { - state->script = strdup(fa(state, attr, "name")); - } else if(!strcmp(name, "def")) { - dict_put(state->id2script, strdup(fa(state, attr, "id")), strdup(state->script)); - } else if(!strcmp(name, "dep")) { - NEW(deps_t,d); - d->name = strdup(fa(state, attr, "id")); - d->next = state->current_deps; - state->current_deps = d; - } -} -void catalog_data(xmlconsumer_t*c, char*data, int len) -{ - catalog_state_t*state = (catalog_state_t*)c->internal; -} -void catalog_end_tag(xmlconsumer_t*c, char*name) -{ - catalog_state_t*state = (catalog_state_t*)c->internal; - if(!strcmp(name, "libraries")) { - state->in_libraries = 0; - } else if(!strcmp(name, "library")) { - ZZIP_FILE*file = zzip_file_open(state->dir, state->library, 0); - - DICT_ITERATE_DATA(state->deps,deps_t*,deps) { - while(deps) { - char*script = dict_lookup(state->id2script, deps->name); - if(!script) { - //as3_warning("when importing %s: depencency %s referenced in catalog.xml, but not found.", state->xml_filename, deps->name); - } - deps->name = script; - deps = deps->next; - } - } - - if(!file) { - as3_warning("when importing %s: %s referenced in catalog.xml, but not found.", state->xml_filename, state->library); - } else { - reader_t r; - reader_init_zzipreader(&r, file); - as3_import_swf2(&r, state->library, state->deps); - r.dealloc(&r); - zzip_file_close(file); - } - dict_destroy(state->deps); - state->deps = 0; - free(state->library); - state->library = 0; - } else if(!strcmp(name, "script")) { - dict_put(state->deps, state->script, state->current_deps); - free(state->script); - state->current_deps = 0; - state->script = 0; - } -} -void as3_import_zipfile(char*filename) -{ - ZZIP_DIR*dir = zzip_opendir(filename); - if(!dir) as3_error("Error reading %s\n", filename); - ZZIP_FILE*file = zzip_file_open(dir, "catalog.xml", 0); - reader_t r; - reader_init_zzipreader(&r, file); - - xmlconsumer_t c; - catalog_state_t state; - memset(&state, 0, sizeof(state)); - state.dir = dir; - state.xml_filename = filename; - state.name2deps = dict_new(); - state.id2script = dict_new(); - state.deps = dict_new(); - c.start_tag = catalog_start_tag; - c.data= catalog_data; - c.end_tag = catalog_end_tag; - c.internal = &state; - - xml_parse(&r, &c); - - r.dealloc(&r); -} -#else -void as3_import_zipfile(char*filename) -{ - as3_warning("No zipfile support compiled in- can't import %s\n", filename); -} -#endif - -void as3_import_file(char*filename) -{ - FILE*fi = fopen(filename, "rb"); - if(!fi) return; - char head[3]; - fread(head, 3, 1, fi); - fclose(fi); - if(!strncmp(head, "FWS", 3) || - !strncmp(head, "CWS", 3)) { - as3_import_swf(filename); - } else if(!strncmp(head, "PK", 2)) { - as3_import_zipfile(filename); - } else { - as3_import_abc(filename); - } -} - -static int compare_traits(const void*v1, const void*v2) -{ - trait_t* x1 = *(trait_t**)v1; - trait_t* x2 = *(trait_t**)v2; - int i = strcmp(x1->name->ns->name, x2->name->ns->name); - if(i) - return i; - return strcmp(x1->name->name, x2->name->name); -} - -static classinfo_t*resolve_class(char*filename, char*what, multiname_t*n) -{ - if(!n) return 0; - if(!n->name[0]) return 0; - if(!strcmp(n->name, "void")) - return &voidclass; - - classinfo_t*c = 0; - if(n->ns && n->ns->name) { - c = (classinfo_t*)registry_find(n->ns->name, n->name); - } else if(n->namespace_set) { - namespace_list_t*s = n->namespace_set->namespaces; - while(s) { - c = (classinfo_t*)registry_find(s->namespace->name, n->name); - if(c) - break; - s = s->next; - } - } - - if(!c) { - as3_warning("import %s: couldn't resolve %s %s.%s", filename, what, n->ns->name, n->name); - return 0; - } - if(c->kind != INFOTYPE_CLASS) - as3_warning("import %s: %s %s resolves to something that's not a class", filename, what, n->name); - return c; -} - -static void import_code(void*_abc, char*filename, int pass, asset_bundle_t*asset_bundle) -{ - abc_file_t*abc = _abc; - int t; - if(pass==0) { - for(t=0;tclasses->num;t++) { - abc_class_t*cls = array_getvalue(abc->classes, t); - U8 access = cls->classname->ns->access; - if(access==ACCESS_PRIVATE || - access==ACCESS_PACKAGEINTERNAL) - continue; - //if(!strncmp(cls->classname->ns->name, "__AS3", 5)) - // continue; - - const char*package = strdup(cls->classname->ns->name); - const char*name = strdup(cls->classname->name); - - multiname_list_t*i=cls->interfaces; - classinfo_t*c = classinfo_register(access, package, name, list_length(i)); - c->flags|=FLAG_BUILTIN; - - if(cls->flags & CLASS_FINAL) - c->flags |= FLAG_FINAL; - if(cls->flags & CLASS_INTERFACE) - c->flags |= FLAG_INTERFACE; - if(!(cls->flags & CLASS_SEALED)) - c->flags |= FLAG_DYNAMIC; - } - return; - } - - for(t=0;tclasses->num;t++) { - abc_class_t*cls = array_getvalue(abc->classes, t); - const char*package = strdup(cls->classname->ns->name); - const char*name = strdup(cls->classname->name); - classinfo_t*c = (classinfo_t*)registry_find(package, name); - if(!c) continue; - - c->assets = asset_bundle; - - int nr = 0; - multiname_list_t*i = cls->interfaces; - while(i) { - c->interfaces[nr++] = resolve_class(filename, "interface", i->multiname); - i = i->next; - } - c->superclass = resolve_class(filename, "superclass", cls->superclass); - - trait_list_t*l=0; - char is_static = 0; - l = cls->traits; - if(!l) { - l = cls->static_traits; - is_static = 1; - } - dict_t*names = dict_new(); - while(l) { - trait_t*trait = l->trait; - U8 access = trait->name->ns->access; - - if(access==ACCESS_PRIVATE) - goto cont; - const char*name = trait->name->name; - char* ns = access==ACCESS_NAMESPACE?strdup(trait->name->ns->name):""; - - if(registry_findmember(c, ns, name, 0, is_static)) - goto cont; - - name = strdup(name); - - memberinfo_t*s = 0; - if(trait->kind == TRAIT_METHOD) { - s = (memberinfo_t*)methodinfo_register_onclass(c, access, ns, name, is_static); - s->return_type = resolve_class(filename, "return type", trait->method->return_type); - dict_put(names, name, 0); - } else if(trait->kind == TRAIT_SLOT) { - s = (memberinfo_t*)varinfo_register_onclass(c, access, ns, name, is_static); - s->type = resolve_class(filename, "type", trait->type_name); - dict_put(names, name, 0); - } else if(trait->kind == TRAIT_GETTER) { - s = (memberinfo_t*)varinfo_register_onclass(c, access, ns, name, is_static); - s->type = resolve_class(filename, "type", trait->method->return_type); - dict_put(names, name, 0); - } else if(trait->kind == TRAIT_CONST) { - /* some variables (e.g. XML.length) are apparently both a method and a slot. - needs split of static/non-static first */ - if(!dict_contains(names, name)) { - varinfo_t*v = (varinfo_t*)varinfo_register_onclass(c, access, ns, name, is_static); - v->type = resolve_class(filename, "type", trait->type_name); - v->flags |= FLAG_CONST; - /* leave this alone for now- it blows up the file too much - v->value = constant_clone(trait->value);*/ - s = (memberinfo_t*)v; - dict_put(names, name, 0); - } else - goto cont; - - } else { - goto cont; - } - - s->flags = is_static?FLAG_STATIC:0; - s->flags |= FLAG_BUILTIN; - s->parent = c; - - cont: - l = l->next; - if(!l && !is_static) { - l = cls->static_traits; - is_static = 1; - } - } - dict_destroy(names); - } - -# define IS_PUBLIC_MEMBER(trait) ((trait)->kind != TRAIT_CLASS && (trait)->name->ns->access != ACCESS_PRIVATE) - - /* count public functions */ - int num_methods=0; - for(t=0;tscripts->num;t++) { - trait_list_t*l = ((abc_script_t*)array_getvalue(abc->scripts, t))->traits; - for(;l;l=l->next) { - num_methods += IS_PUBLIC_MEMBER(l->trait); - } - } - trait_t**traits = (trait_t**)malloc(num_methods*sizeof(trait_t*)); - num_methods=0; - for(t=0;tscripts->num;t++) { - trait_list_t*l = ((abc_script_t*)array_getvalue(abc->scripts, t))->traits; - for(;l;l=l->next) { - if(IS_PUBLIC_MEMBER(l->trait)) { - traits[num_methods++] = l->trait; - } - } - } - qsort(traits, num_methods, sizeof(trait_t*), compare_traits); - for(t=0;tname->ns->access; - const char*package = strdup(trait->name->ns->name); - const char*name = strdup(trait->name->name); - char np = 0; - memberinfo_t*m = 0; - if(trait->kind == TRAIT_METHOD) { - m = (memberinfo_t*)methodinfo_register_global(access, package, name); - m->return_type = resolve_class(filename, "return type", trait->method->return_type); - } else { - varinfo_t*v = varinfo_register_global(access, package, name); - v->type = resolve_class(filename, "type", trait->type_name); - v->value = constant_clone(trait->value); - v->flags |= trait->kind==TRAIT_CONST?FLAG_CONST:0; - m = (memberinfo_t*)v; - } - m->flags |= FLAG_BUILTIN; - m->parent = 0; - } - } -} - -void as3_import_code(void*_abc) -{ - import_code(_abc, "", 0, 0); - import_code(_abc, "", 1, 0); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/import.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/import.h deleted file mode 100644 index 2bfaaa17e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/import.h +++ /dev/null @@ -1,30 +0,0 @@ -/* import.h - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __as3_import_h__ -#define __as3_import_h__ - -void as3_import_file(char*filename); -void as3_import_swf(char*filename); -void as3_import_abc(char*filename); -void as3_import_code(void*f); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.c deleted file mode 100644 index eebfa132a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.c +++ /dev/null @@ -1,271 +0,0 @@ -/* initcode.c - - Routines for handling/compiling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008,2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include "../q.h" -#include "abc.h" -#include "code.h" -#include "common.h" -#include "registry.h" -#include "initcode.h" - -int compare_parsedclass(const void *_v1, const void *_v2) -{ - parsedclass_t*p1 = *(parsedclass_t**)_v1; - parsedclass_t*p2 = *(parsedclass_t**)_v2; - if((p1->cls->flags^p2->cls->flags)&FLAG_INTERFACE) { - return (int)(p2->cls->flags&FLAG_INTERFACE) - (int)(p1->cls->flags&FLAG_INTERFACE); - } - classinfo_t*c2 = dict_lookup(&p1->parents, p2); - classinfo_t*c1 = dict_lookup(&p2->parents, p1); - assert(!c1 || !c2); // otherwise we would have a loop - assert(!c1 || c1==p1->cls); - assert(!c2 || c2==p2->cls); - - if(c1) { - return -1; - } - if(c2) { - return 1; - } - - c2 = dict_lookup(&p1->usedclasses_deep, p2); - c1 = dict_lookup(&p2->usedclasses_deep, p1); - assert(!c1 || !c2); - assert(!c1 || c1==p1->cls); - assert(!c2 || c2==p2->cls); - if(c1) { - return -1; - } - if(c2) { - return 1; - } - - return 0; -} - -static void add_parent(parsedclass_t*p, classinfo_t*c, dict_t*s2p, char soft) -{ - dict_t*parents = soft?(&p->usedclasses_deep):(&p->parents); - int t; - if(dict_contains(parents, p)) { - if(soft) { - as3_warning("circular reference: class %s references self (through static code)", p->cls->name); - return; - } else { - syntaxerror("circular reference: class %s references self", p->cls->name); - } - } - - if(c) { - parsedclass_t*n = dict_lookup(s2p, c); - if(n && !dict_contains(parents, n)) { - assert(n->cls == c); - dict_put(parents, n, c); - } - } else { - c = p->cls; - } - - if(soft && dict_contains(s2p, c)) { - parsedclass_t*pp = dict_lookup(s2p, c); - DICT_ITERATE_KEY(&pp->usedclasses, classinfo_t*, cc) { - add_parent(p, cc, s2p, soft); - } - } - if(c->superclass) { - add_parent(p, c->superclass, s2p, soft); - } - for(t=0;c->interfaces[t];t++) { - add_parent(p, c->interfaces[t], s2p, soft); - } -} - -parsedclass_t* parsedclass_new(classinfo_t*cls, abc_class_t*abc) -{ - NEW(parsedclass_t,p); - p->cls = cls; - p->abc = abc; - dict_init2(&p->parents, &ptr_type, 1); - dict_init2(&p->usedclasses, &ptr_type, 1); - dict_init2(&p->usedclasses_deep, &ptr_type, 1); - return p; -} - -/* sort classes so that - (a) interfaces appear before classes - (b) base classes always appear before their subclasses - (c) classes appear after the classes they use in static code -*/ -parsedclass_t** initcode_sort_classlist(parsedclass_list_t*classes) -{ - dict_t* s2p = dict_new2(&ptr_type); - - /* create hash tables */ - int count = 0; - parsedclass_list_t*l; - for(l=classes;l;l=l->next) { - dict_put(s2p, l->parsedclass->cls, l->parsedclass); - count++; - } - for(l=classes;l;l=l->next) { - add_parent(l->parsedclass, 0, s2p, 0); - DICT_ITERATE_KEY(&l->parsedclass->usedclasses, classinfo_t*, c) { - add_parent(l->parsedclass, c, s2p, 1); - } - } - - parsedclass_t**list = malloc(sizeof(parsedclass_t*)*count); - - /* build an array for each class */ - int i = 0; - for(l=classes;l;l=l->next) { - list[i++] = l->parsedclass; - } - - /* sort and flatten. - We unfortunately need to do insertion sort O(n^2) as - our dependencies are only partially ordered */ - int j; - for(i=0;i0) { - parsedclass_t*p1 = list[i]; - parsedclass_t*p2 = list[j]; - list[i] = p2; - list[j] = p1; - } - } - } - - parsedclass_t**list2 = malloc(sizeof(parsedclass_t*)*(count+1)); - for(i=0;icls->name); - if(p->cls->superclass) - printf(" extends %s\n", p->cls->superclass->name); - int t; - for(t=0;p->cls->interfaces[t];t++) - printf(" interface %s\n", p->cls->interfaces[t]->name); - DICT_ITERATE_KEY(&p->usedclasses, classinfo_t*, c) { - printf(" uses %s\n", c->name); - } - DICT_ITERATE_KEY(&p->parents, parsedclass_t*, pp) { - printf(" depends on (deep) %s\n", pp->cls->name); - } - DICT_ITERATE_KEY(&p->usedclasses_deep, parsedclass_t*, px) { - printf(" uses (deep) %s\n", px->cls->name); - } - printf("\n"); -#endif - } - list2[count]=0; - free(list); - - dict_destroy(s2p); - return list2; -} - -void parsedclass_add_dependency(parsedclass_t*p, classinfo_t*c) -{ - if(!dict_contains(&p->usedclasses, c)) { - dict_put(&p->usedclasses, c, c); - } -} - -void initcode_add_classlist(abc_script_t*init, parsedclass_list_t*_classes) -{ - code_t*c = 0; - - c = abc_getlocal_0(c); - c = abc_pushscope(c); - - parsedclass_t**classes = initcode_sort_classlist(_classes); - - int t; - for(t=0;classes[t];t++) { - abc_class_t*abc = classes[t]->abc; - classinfo_t*cls = classes[t]->cls; - - array_append(init->file->classes, "", abc); - - /* write the construction code for this class to the global init - function */ - MULTINAME(classname2,cls); - trait_t*trait = abc_initscript_addClassTrait(init, &classname2, abc); - - c = abc_getglobalscope(c); - classinfo_t*s = cls->superclass; - - int count=0; - - while(s) { - //TODO: take a look at the current scope stack, maybe - // we can re-use something - s = s->superclass; - if(!s) - break; - - multiname_t*s2 = sig2mname(s); - c = abc_getlex2(c, s2); - multiname_destroy(s2); - - c = abc_pushscope(c); count++; - c = c->prev->prev; // invert - } - /* continue appending after last op end */ - while(c && c->next) c = c->next; - - multiname_t*extends2 = sig2mname(cls->superclass); - /* TODO: if this is one of *our* classes, we can also - do a getglobalscope/getslot (which references - the init function's slots) */ - if(extends2) { - c = abc_getlex2(c, extends2); - c = abc_dup(c); - /* notice: we get a Verify Error #1107 if the top elemnt on the scope - stack is not the superclass */ - c = abc_pushscope(c);count++; - } else { - c = abc_pushnull(c); - /* notice: we get a verify error #1107 if the top element on the scope - stack is not the global object */ - c = abc_getlocal_0(c); - c = abc_pushscope(c);count++; - } - c = abc_newclass(c,abc); - while(count--) { - c = abc_popscope(c); - } - c = abc_setslot(c, trait->slot_id); - multiname_destroy(extends2); - } - c = abc_returnvoid(c); - - free(classes); - - init->method->body->code = c; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.h deleted file mode 100644 index 03029a6b3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/initcode.h +++ /dev/null @@ -1,44 +0,0 @@ -/* initcode.h - - Routines for handling/compiling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008,2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __initcode_h__ -#define __initcode_h__ - -#include "abc.h" -#include "registry.h" - -DECLARE(parsedclass); -DECLARE_LIST(parsedclass); -struct _parsedclass { - classinfo_t*cls; - dict_t parents; - dict_t usedclasses_deep; - dict_t usedclasses; - abc_class_t*abc; -}; - -void initcode_add_classlist(abc_script_t*init, parsedclass_list_t*classes); -parsedclass_t* parsedclass_new(classinfo_t*c, abc_class_t*abc); -void parsedclass_add_dependency(parsedclass_t*p, classinfo_t*c); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.c deleted file mode 100644 index 93215f09b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.c +++ /dev/null @@ -1,1008 +0,0 @@ -#include "opcodes.h" -code_t* abc_add(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xa0); - return self; -} -code_t* abc_add_i(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xc5); - return self; -} -code_t* abc_astype(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x86); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_astype2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x86); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_astypelate(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x87); - return self; -} -code_t* abc_bitand(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xA8); - return self; -} -code_t* abc_bitnot(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x97); - return self; -} -code_t* abc_bitor(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xa9); - return self; -} -code_t* abc_bitxor(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xaa); - return self; -} -code_t* abc_call(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x41); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callmethod(code_t*prev, abc_method_t* m, int v) -{ - code_t*self = add_opcode(prev, 0x43); - self->data[0] = m; - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callproplex(code_t*prev, char* name, int v) -{ - code_t*self = add_opcode(prev, 0x4c); - self->data[0] = multiname_fromstring(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callproplex2(code_t*prev, multiname_t* name, int v) -{ - code_t*self = add_opcode(prev, 0x4c); - self->data[0] = multiname_clone(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callproperty(code_t*prev, char* name, int v) -{ - code_t*self = add_opcode(prev, 0x46); - self->data[0] = multiname_fromstring(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callproperty2(code_t*prev, multiname_t* name, int v) -{ - code_t*self = add_opcode(prev, 0x46); - self->data[0] = multiname_clone(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callpropvoid(code_t*prev, char* name, int v) -{ - code_t*self = add_opcode(prev, 0x4f); - self->data[0] = multiname_fromstring(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callpropvoid2(code_t*prev, multiname_t* name, int v) -{ - code_t*self = add_opcode(prev, 0x4f); - self->data[0] = multiname_clone(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callstatic(code_t*prev, abc_method_body_t* m, int v) -{ - code_t*self = add_opcode(prev, 0x44); - self->data[0] = m; - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callsuper(code_t*prev, char* name, int v) -{ - code_t*self = add_opcode(prev, 0x45); - self->data[0] = multiname_fromstring(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callsuper2(code_t*prev, multiname_t* name, int v) -{ - code_t*self = add_opcode(prev, 0x45); - self->data[0] = multiname_clone(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callsupervoid(code_t*prev, char* name, int v) -{ - code_t*self = add_opcode(prev, 0x4e); - self->data[0] = multiname_fromstring(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_callsupervoid2(code_t*prev, multiname_t* name, int v) -{ - code_t*self = add_opcode(prev, 0x4e); - self->data[0] = multiname_clone(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_checkfilter(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x78); - return self; -} -code_t* abc_coerce(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x80); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_coerce2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x80); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_coerce_a(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x82); - return self; -} -code_t* abc_coerce_s(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x85); - return self; -} -code_t* abc_construct(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x42); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_constructprop(code_t*prev, char* name, int v) -{ - code_t*self = add_opcode(prev, 0x4a); - self->data[0] = multiname_fromstring(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_constructprop2(code_t*prev, multiname_t* name, int v) -{ - code_t*self = add_opcode(prev, 0x4a); - self->data[0] = multiname_clone(name); - self->data[1] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_constructsuper(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x49); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_convert_b(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x76); - return self; -} -code_t* abc_convert_i(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x73); - return self; -} -code_t* abc_convert_d(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x75); - return self; -} -code_t* abc_convert_o(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x77); - return self; -} -code_t* abc_convert_u(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x74); - return self; -} -code_t* abc_convert_s(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x70); - return self; -} -code_t* abc_debug(code_t*prev, void* debuginfo) -{ - code_t*self = add_opcode(prev, 0xef); - /* FIXME: write debuginfo debuginfo */ - return self; -} -code_t* abc_debugfile(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0xf1); - self->data[0] = string_new4(name); - return self; -} -code_t* abc_debugfile2(code_t*prev, string_t* s) -{ - code_t*self = add_opcode(prev, 0xf1); - self->data[0] = string_dup3(s); - return self; -} -code_t* abc_debugline(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0xf0); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_declocal(code_t*prev, int reg) -{ - code_t*self = add_opcode(prev, 0x94); - self->data[0] = (void*)(ptroff_t)reg; - return self; -} -code_t* abc_declocal_i(code_t*prev, int reg) -{ - code_t*self = add_opcode(prev, 0xc3); - self->data[0] = (void*)(ptroff_t)reg; - return self; -} -code_t* abc_decrement(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x93); - return self; -} -code_t* abc_decrement_i(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xc1); - return self; -} -code_t* abc_deleteproperty(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x6a); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_deleteproperty2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x6a); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_divide(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xa3); - return self; -} -code_t* abc_dup(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x2a); - return self; -} -code_t* abc_dxns(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x06); - self->data[0] = string_new4(name); - return self; -} -code_t* abc_dxns2(code_t*prev, string_t* s) -{ - code_t*self = add_opcode(prev, 0x06); - self->data[0] = string_dup3(s); - return self; -} -code_t* abc_dxnslate(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x07); - return self; -} -code_t* abc_equals(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xab); - return self; -} -code_t* abc_esc_xattr(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x72); - return self; -} -code_t* abc_esc_xelem(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x71); - return self; -} -code_t* abc_findproperty(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x5e); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_findproperty2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x5e); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_findpropstrict(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x5d); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_findpropstrict2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x5d); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_getdescendants(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x59); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_getdescendants2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x59); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_getglobalscope(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x64); - return self; -} -code_t* abc_getglobalslot(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x6e); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_getlex(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x60); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_getlex2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x60); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_getlocal(code_t*prev, int reg) -{ - code_t*self = add_opcode(prev, 0x62); - self->data[0] = (void*)(ptroff_t)reg; - return self; -} -code_t* abc_getlocal_0(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xd0); - return self; -} -code_t* abc_getlocal_1(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xd1); - return self; -} -code_t* abc_getlocal_2(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xd2); - return self; -} -code_t* abc_getlocal_3(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xd3); - return self; -} -code_t* abc_getproperty(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x66); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_getproperty2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x66); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_getscopeobject(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x65); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_getslot(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x6c); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_getsuper(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x04); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_getsuper2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x04); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_greaterthan(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xaf); - return self; -} -code_t* abc_greaterequals(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xb0); - return self; -} -code_t* abc_hasnext(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x1f); - return self; -} -code_t* abc_hasnext2(code_t*prev, int reg, int reg2) -{ - code_t*self = add_opcode(prev, 0x32); - self->data[0] = (void*)(ptroff_t)reg; - self->data[1] = (void*)(ptroff_t)reg2; - return self; -} -code_t* abc_ifeq(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x13); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_iffalse(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x12); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifge(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x18); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifgt(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x17); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifle(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x16); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_iflt(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x15); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifnge(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x0f); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifngt(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x0e); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifnle(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x0d); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifnlt(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x0c); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifne(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x14); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifstricteq(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x19); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_ifstrictne(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x1a); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_iftrue(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x11); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_in(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xb4); - return self; -} -code_t* abc_inclocal(code_t*prev, int reg) -{ - code_t*self = add_opcode(prev, 0x92); - self->data[0] = (void*)(ptroff_t)reg; - return self; -} -code_t* abc_inclocal_i(code_t*prev, int reg) -{ - code_t*self = add_opcode(prev, 0xc2); - self->data[0] = (void*)(ptroff_t)reg; - return self; -} -code_t* abc_increment(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x91); - return self; -} -code_t* abc_increment_i(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xc0); - return self; -} -code_t* abc_initproperty(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x68); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_initproperty2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x68); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_instanceof(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xb1); - return self; -} -code_t* abc_istype(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0xb2); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_istype2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0xb2); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_istypelate(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xb3); - return self; -} -code_t* abc_jump(code_t*prev, code_t* label) -{ - code_t*self = add_opcode(prev, 0x10); - self->data[0] = 0; //placeholder - self->branch = label; - return self; -} -code_t* abc_kill(code_t*prev, int reg) -{ - code_t*self = add_opcode(prev, 0x08); - self->data[0] = (void*)(ptroff_t)reg; - return self; -} -code_t* abc_label(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x09); - return self; -} -code_t* abc_lessequals(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xae); - return self; -} -code_t* abc_lessthan(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xad); - return self; -} -code_t* abc_lookupswitch(code_t*prev, lookupswitch_t* l) -{ - code_t*self = add_opcode(prev, 0x1b); - self->data[0] = l; - return self; -} -code_t* abc_lshift(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xa5); - return self; -} -code_t* abc_modulo(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xa4); - return self; -} -code_t* abc_multiply(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xa2); - return self; -} -code_t* abc_multiply_i(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xc7); - return self; -} -code_t* abc_negate(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x90); - return self; -} -code_t* abc_negate_i(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xc4); - return self; -} -code_t* abc_newactivation(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x57); - return self; -} -code_t* abc_newarray(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x56); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_newcatch(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x5a); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_newclass(code_t*prev, abc_class_t* m) -{ - code_t*self = add_opcode(prev, 0x58); - self->data[0] = m; - return self; -} -code_t* abc_newfunction(code_t*prev, abc_method_t* m) -{ - code_t*self = add_opcode(prev, 0x40); - self->data[0] = m; - return self; -} -code_t* abc_newobject(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x55); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_nextname(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x1e); - return self; -} -code_t* abc_nextvalue(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x23); - return self; -} -code_t* abc_nop(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x02); - return self; -} -code_t* abc_not(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x96); - return self; -} -code_t* abc_pop(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x29); - return self; -} -code_t* abc_popscope(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x1d); - return self; -} -code_t* abc_pushbyte(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x24); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_pushdouble(code_t*prev, double f) -{ - code_t*self = add_opcode(prev, 0x2f); - double*fp = malloc(sizeof(double)); - *fp = f; - self->data[0] = fp; - return self; -} -code_t* abc_pushfalse(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x27); - return self; -} -code_t* abc_pushint(code_t*prev, int i) -{ - code_t*self = add_opcode(prev, 0x2d); - self->data[0] = (void*)(ptroff_t)i; - return self; -} -code_t* abc_pushnamespace(code_t*prev, namespace_t* ns) -{ - code_t*self = add_opcode(prev, 0x31); - self->data[0] = namespace_clone(ns); - return self; -} -code_t* abc_pushnan(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x28); - return self; -} -code_t* abc_pushnull(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x20); - return self; -} -code_t* abc_pushscope(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x30); - return self; -} -code_t* abc_pushshort(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x25); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_pushstring(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x2c); - self->data[0] = string_new4(name); - return self; -} -code_t* abc_pushstring2(code_t*prev, string_t* s) -{ - code_t*self = add_opcode(prev, 0x2c); - self->data[0] = string_dup3(s); - return self; -} -code_t* abc_pushtrue(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x26); - return self; -} -code_t* abc_pushuint(code_t*prev, unsigned int u) -{ - code_t*self = add_opcode(prev, 0x2e); - self->data[0] = (void*)(ptroff_t)u; - return self; -} -code_t* abc_pushundefined(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x21); - return self; -} -code_t* abc_pushwith(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x1c); - return self; -} -code_t* abc_returnvalue(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x48); - return self; -} -code_t* abc_returnvoid(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x47); - return self; -} -code_t* abc_rshift(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xa6); - return self; -} -code_t* abc_setlocal(code_t*prev, int reg) -{ - code_t*self = add_opcode(prev, 0x63); - self->data[0] = (void*)(ptroff_t)reg; - return self; -} -code_t* abc_setlocal_0(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xd4); - return self; -} -code_t* abc_setlocal_1(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xd5); - return self; -} -code_t* abc_setlocal_2(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xd6); - return self; -} -code_t* abc_setlocal_3(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xd7); - return self; -} -code_t* abc_setglobalslot(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x6f); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_setproperty(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x61); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_setproperty2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x61); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_setslot(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x6d); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc_setsuper(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0x05); - self->data[0] = multiname_fromstring(name); - return self; -} -code_t* abc_setsuper2(code_t*prev, multiname_t* name) -{ - code_t*self = add_opcode(prev, 0x05); - self->data[0] = multiname_clone(name); - return self; -} -code_t* abc_strictequals(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xac); - return self; -} -code_t* abc_subtract(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xa1); - return self; -} -code_t* abc_subtract_i(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xc6); - return self; -} -code_t* abc_swap(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x2b); - return self; -} -code_t* abc_throw(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x03); - return self; -} -code_t* abc_typeof(code_t*prev) -{ - code_t*self = add_opcode(prev, 0x95); - return self; -} -code_t* abc_urshift(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xa7); - return self; -} -code_t* abc_applytype(code_t*prev, int v) -{ - code_t*self = add_opcode(prev, 0x53); - self->data[0] = (void*)(ptroff_t)v; - return self; -} -code_t* abc___pushpackage__(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0xfb); - self->data[0] = string_new4(name); - return self; -} -code_t* abc___pushpackage__2(code_t*prev, string_t* s) -{ - code_t*self = add_opcode(prev, 0xfb); - self->data[0] = string_dup3(s); - return self; -} -code_t* abc___rethrow__(code_t*prev) -{ - code_t*self = add_opcode(prev, 0xfc); - return self; -} -code_t* abc___fallthrough__(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0xfd); - self->data[0] = string_new4(name); - return self; -} -code_t* abc___fallthrough__2(code_t*prev, string_t* s) -{ - code_t*self = add_opcode(prev, 0xfd); - self->data[0] = string_dup3(s); - return self; -} -code_t* abc___continue__(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0xfe); - self->data[0] = string_new4(name); - return self; -} -code_t* abc___continue__2(code_t*prev, string_t* s) -{ - code_t*self = add_opcode(prev, 0xfe); - self->data[0] = string_dup3(s); - return self; -} -code_t* abc___break__(code_t*prev, char* name) -{ - code_t*self = add_opcode(prev, 0xff); - self->data[0] = string_new4(name); - return self; -} -code_t* abc___break__2(code_t*prev, string_t* s) -{ - code_t*self = add_opcode(prev, 0xff); - self->data[0] = string_dup3(s); - return self; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.h deleted file mode 100644 index b95ed07c9..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/opcodes.h +++ /dev/null @@ -1,531 +0,0 @@ -#ifndef __opcodes_h__ -#define __opcodes_h__ -#include "abc.h" -#include "pool.h" -#include "code.h" -code_t* abc_add(code_t*prev); -#define add(method) (method->code = abc_add(method->code)) -#define OPCODE_ADD 0xa0 -code_t* abc_add_i(code_t*prev); -#define add_i(method) (method->code = abc_add_i(method->code)) -#define OPCODE_ADD_I 0xc5 -code_t* abc_astype(code_t*prev, char* name); -#define astype(method,name) (method->code = abc_astype(method->code,name)) -#define OPCODE_ASTYPE 0x86 -code_t* abc_astype2(code_t*prev, multiname_t* name); -#define astype2(method,name) (method->code = abc_astype2(method->code,name)) -#define OPCODE_ASTYPE2 0x86 -code_t* abc_astypelate(code_t*prev); -#define astypelate(method) (method->code = abc_astypelate(method->code)) -#define OPCODE_ASTYPELATE 0x87 -code_t* abc_bitand(code_t*prev); -#define bitand(method) (method->code = abc_bitand(method->code)) -#define OPCODE_BITAND 0xA8 -code_t* abc_bitnot(code_t*prev); -#define bitnot(method) (method->code = abc_bitnot(method->code)) -#define OPCODE_BITNOT 0x97 -code_t* abc_bitor(code_t*prev); -#define bitor(method) (method->code = abc_bitor(method->code)) -#define OPCODE_BITOR 0xa9 -code_t* abc_bitxor(code_t*prev); -#define bitxor(method) (method->code = abc_bitxor(method->code)) -#define OPCODE_BITXOR 0xaa -code_t* abc_call(code_t*prev, int v); -#define call(method,v) (method->code = abc_call(method->code,v)) -#define OPCODE_CALL 0x41 -code_t* abc_callmethod(code_t*prev, abc_method_t* m, int v); -#define callmethod(method,m,v) (method->code = abc_callmethod(method->code,m,v)) -#define OPCODE_CALLMETHOD 0x43 -code_t* abc_callproplex(code_t*prev, char* name, int v); -#define callproplex(method,name,v) (method->code = abc_callproplex(method->code,name,v)) -#define OPCODE_CALLPROPLEX 0x4c -code_t* abc_callproplex2(code_t*prev, multiname_t* name, int v); -#define callproplex2(method,name,v) (method->code = abc_callproplex2(method->code,name,v)) -#define OPCODE_CALLPROPLEX2 0x4c -code_t* abc_callproperty(code_t*prev, char* name, int v); -#define callproperty(method,name,v) (method->code = abc_callproperty(method->code,name,v)) -#define OPCODE_CALLPROPERTY 0x46 -code_t* abc_callproperty2(code_t*prev, multiname_t* name, int v); -#define callproperty2(method,name,v) (method->code = abc_callproperty2(method->code,name,v)) -#define OPCODE_CALLPROPERTY2 0x46 -code_t* abc_callpropvoid(code_t*prev, char* name, int v); -#define callpropvoid(method,name,v) (method->code = abc_callpropvoid(method->code,name,v)) -#define OPCODE_CALLPROPVOID 0x4f -code_t* abc_callpropvoid2(code_t*prev, multiname_t* name, int v); -#define callpropvoid2(method,name,v) (method->code = abc_callpropvoid2(method->code,name,v)) -#define OPCODE_CALLPROPVOID2 0x4f -code_t* abc_callstatic(code_t*prev, abc_method_body_t* m, int v); -#define callstatic(method,m,v) (method->code = abc_callstatic(method->code,m,v)) -#define OPCODE_CALLSTATIC 0x44 -code_t* abc_callsuper(code_t*prev, char* name, int v); -#define callsuper(method,name,v) (method->code = abc_callsuper(method->code,name,v)) -#define OPCODE_CALLSUPER 0x45 -code_t* abc_callsuper2(code_t*prev, multiname_t* name, int v); -#define callsuper2(method,name,v) (method->code = abc_callsuper2(method->code,name,v)) -#define OPCODE_CALLSUPER2 0x45 -code_t* abc_callsupervoid(code_t*prev, char* name, int v); -#define callsupervoid(method,name,v) (method->code = abc_callsupervoid(method->code,name,v)) -#define OPCODE_CALLSUPERVOID 0x4e -code_t* abc_callsupervoid2(code_t*prev, multiname_t* name, int v); -#define callsupervoid2(method,name,v) (method->code = abc_callsupervoid2(method->code,name,v)) -#define OPCODE_CALLSUPERVOID2 0x4e -code_t* abc_checkfilter(code_t*prev); -#define checkfilter(method) (method->code = abc_checkfilter(method->code)) -#define OPCODE_CHECKFILTER 0x78 -code_t* abc_coerce(code_t*prev, char* name); -#define coerce(method,name) (method->code = abc_coerce(method->code,name)) -#define OPCODE_COERCE 0x80 -code_t* abc_coerce2(code_t*prev, multiname_t* name); -#define coerce2(method,name) (method->code = abc_coerce2(method->code,name)) -#define OPCODE_COERCE2 0x80 -code_t* abc_coerce_a(code_t*prev); -#define coerce_a(method) (method->code = abc_coerce_a(method->code)) -#define OPCODE_COERCE_A 0x82 -code_t* abc_coerce_s(code_t*prev); -#define coerce_s(method) (method->code = abc_coerce_s(method->code)) -#define OPCODE_COERCE_S 0x85 -code_t* abc_construct(code_t*prev, int v); -#define construct(method,v) (method->code = abc_construct(method->code,v)) -#define OPCODE_CONSTRUCT 0x42 -code_t* abc_constructprop(code_t*prev, char* name, int v); -#define constructprop(method,name,v) (method->code = abc_constructprop(method->code,name,v)) -#define OPCODE_CONSTRUCTPROP 0x4a -code_t* abc_constructprop2(code_t*prev, multiname_t* name, int v); -#define constructprop2(method,name,v) (method->code = abc_constructprop2(method->code,name,v)) -#define OPCODE_CONSTRUCTPROP2 0x4a -code_t* abc_constructsuper(code_t*prev, int v); -#define constructsuper(method,v) (method->code = abc_constructsuper(method->code,v)) -#define OPCODE_CONSTRUCTSUPER 0x49 -code_t* abc_convert_b(code_t*prev); -#define convert_b(method) (method->code = abc_convert_b(method->code)) -#define OPCODE_CONVERT_B 0x76 -code_t* abc_convert_i(code_t*prev); -#define convert_i(method) (method->code = abc_convert_i(method->code)) -#define OPCODE_CONVERT_I 0x73 -code_t* abc_convert_d(code_t*prev); -#define convert_d(method) (method->code = abc_convert_d(method->code)) -#define OPCODE_CONVERT_D 0x75 -code_t* abc_convert_o(code_t*prev); -#define convert_o(method) (method->code = abc_convert_o(method->code)) -#define OPCODE_CONVERT_O 0x77 -code_t* abc_convert_u(code_t*prev); -#define convert_u(method) (method->code = abc_convert_u(method->code)) -#define OPCODE_CONVERT_U 0x74 -code_t* abc_convert_s(code_t*prev); -#define convert_s(method) (method->code = abc_convert_s(method->code)) -#define OPCODE_CONVERT_S 0x70 -code_t* abc_debug(code_t*prev, void* debuginfo); -#define debug(method,debuginfo) (method->code = abc_debug(method->code,debuginfo)) -#define OPCODE_DEBUG 0xef -code_t* abc_debugfile(code_t*prev, char* name); -#define debugfile(method,name) (method->code = abc_debugfile(method->code,name)) -#define OPCODE_DEBUGFILE 0xf1 -code_t* abc_debugfile2(code_t*prev, string_t* s); -#define debugfile2(method,s) (method->code = abc_debugfile2(method->code,s)) -#define OPCODE_DEBUGFILE2 0xf1 -code_t* abc_debugline(code_t*prev, int v); -#define debugline(method,v) (method->code = abc_debugline(method->code,v)) -#define OPCODE_DEBUGLINE 0xf0 -code_t* abc_declocal(code_t*prev, int reg); -#define declocal(method,reg) (method->code = abc_declocal(method->code,reg)) -#define OPCODE_DECLOCAL 0x94 -code_t* abc_declocal_i(code_t*prev, int reg); -#define declocal_i(method,reg) (method->code = abc_declocal_i(method->code,reg)) -#define OPCODE_DECLOCAL_I 0xc3 -code_t* abc_decrement(code_t*prev); -#define decrement(method) (method->code = abc_decrement(method->code)) -#define OPCODE_DECREMENT 0x93 -code_t* abc_decrement_i(code_t*prev); -#define decrement_i(method) (method->code = abc_decrement_i(method->code)) -#define OPCODE_DECREMENT_I 0xc1 -code_t* abc_deleteproperty(code_t*prev, char* name); -#define deleteproperty(method,name) (method->code = abc_deleteproperty(method->code,name)) -#define OPCODE_DELETEPROPERTY 0x6a -code_t* abc_deleteproperty2(code_t*prev, multiname_t* name); -#define deleteproperty2(method,name) (method->code = abc_deleteproperty2(method->code,name)) -#define OPCODE_DELETEPROPERTY2 0x6a -code_t* abc_divide(code_t*prev); -#define divide(method) (method->code = abc_divide(method->code)) -#define OPCODE_DIVIDE 0xa3 -code_t* abc_dup(code_t*prev); -#define dup(method) (method->code = abc_dup(method->code)) -#define OPCODE_DUP 0x2a -code_t* abc_dxns(code_t*prev, char* name); -#define dxns(method,name) (method->code = abc_dxns(method->code,name)) -#define OPCODE_DXNS 0x06 -code_t* abc_dxns2(code_t*prev, string_t* s); -#define dxns2(method,s) (method->code = abc_dxns2(method->code,s)) -#define OPCODE_DXNS2 0x06 -code_t* abc_dxnslate(code_t*prev); -#define dxnslate(method) (method->code = abc_dxnslate(method->code)) -#define OPCODE_DXNSLATE 0x07 -code_t* abc_equals(code_t*prev); -#define equals(method) (method->code = abc_equals(method->code)) -#define OPCODE_EQUALS 0xab -code_t* abc_esc_xattr(code_t*prev); -#define esc_xattr(method) (method->code = abc_esc_xattr(method->code)) -#define OPCODE_ESC_XATTR 0x72 -code_t* abc_esc_xelem(code_t*prev); -#define esc_xelem(method) (method->code = abc_esc_xelem(method->code)) -#define OPCODE_ESC_XELEM 0x71 -code_t* abc_findproperty(code_t*prev, char* name); -#define findproperty(method,name) (method->code = abc_findproperty(method->code,name)) -#define OPCODE_FINDPROPERTY 0x5e -code_t* abc_findproperty2(code_t*prev, multiname_t* name); -#define findproperty2(method,name) (method->code = abc_findproperty2(method->code,name)) -#define OPCODE_FINDPROPERTY2 0x5e -code_t* abc_findpropstrict(code_t*prev, char* name); -#define findpropstrict(method,name) (method->code = abc_findpropstrict(method->code,name)) -#define OPCODE_FINDPROPSTRICT 0x5d -code_t* abc_findpropstrict2(code_t*prev, multiname_t* name); -#define findpropstrict2(method,name) (method->code = abc_findpropstrict2(method->code,name)) -#define OPCODE_FINDPROPSTRICT2 0x5d -code_t* abc_getdescendants(code_t*prev, char* name); -#define getdescendants(method,name) (method->code = abc_getdescendants(method->code,name)) -#define OPCODE_GETDESCENDANTS 0x59 -code_t* abc_getdescendants2(code_t*prev, multiname_t* name); -#define getdescendants2(method,name) (method->code = abc_getdescendants2(method->code,name)) -#define OPCODE_GETDESCENDANTS2 0x59 -code_t* abc_getglobalscope(code_t*prev); -#define getglobalscope(method) (method->code = abc_getglobalscope(method->code)) -#define OPCODE_GETGLOBALSCOPE 0x64 -code_t* abc_getglobalslot(code_t*prev, int v); -#define getglobalslot(method,v) (method->code = abc_getglobalslot(method->code,v)) -#define OPCODE_GETGLOBALSLOT 0x6e -code_t* abc_getlex(code_t*prev, char* name); -#define getlex(method,name) (method->code = abc_getlex(method->code,name)) -#define OPCODE_GETLEX 0x60 -code_t* abc_getlex2(code_t*prev, multiname_t* name); -#define getlex2(method,name) (method->code = abc_getlex2(method->code,name)) -#define OPCODE_GETLEX2 0x60 -code_t* abc_getlocal(code_t*prev, int reg); -#define getlocal(method,reg) (method->code = abc_getlocal(method->code,reg)) -#define OPCODE_GETLOCAL 0x62 -code_t* abc_getlocal_0(code_t*prev); -#define getlocal_0(method) (method->code = abc_getlocal_0(method->code)) -#define OPCODE_GETLOCAL_0 0xd0 -code_t* abc_getlocal_1(code_t*prev); -#define getlocal_1(method) (method->code = abc_getlocal_1(method->code)) -#define OPCODE_GETLOCAL_1 0xd1 -code_t* abc_getlocal_2(code_t*prev); -#define getlocal_2(method) (method->code = abc_getlocal_2(method->code)) -#define OPCODE_GETLOCAL_2 0xd2 -code_t* abc_getlocal_3(code_t*prev); -#define getlocal_3(method) (method->code = abc_getlocal_3(method->code)) -#define OPCODE_GETLOCAL_3 0xd3 -code_t* abc_getproperty(code_t*prev, char* name); -#define getproperty(method,name) (method->code = abc_getproperty(method->code,name)) -#define OPCODE_GETPROPERTY 0x66 -code_t* abc_getproperty2(code_t*prev, multiname_t* name); -#define getproperty2(method,name) (method->code = abc_getproperty2(method->code,name)) -#define OPCODE_GETPROPERTY2 0x66 -code_t* abc_getscopeobject(code_t*prev, int v); -#define getscopeobject(method,v) (method->code = abc_getscopeobject(method->code,v)) -#define OPCODE_GETSCOPEOBJECT 0x65 -code_t* abc_getslot(code_t*prev, int v); -#define getslot(method,v) (method->code = abc_getslot(method->code,v)) -#define OPCODE_GETSLOT 0x6c -code_t* abc_getsuper(code_t*prev, char* name); -#define getsuper(method,name) (method->code = abc_getsuper(method->code,name)) -#define OPCODE_GETSUPER 0x04 -code_t* abc_getsuper2(code_t*prev, multiname_t* name); -#define getsuper2(method,name) (method->code = abc_getsuper2(method->code,name)) -#define OPCODE_GETSUPER2 0x04 -code_t* abc_greaterthan(code_t*prev); -#define greaterthan(method) (method->code = abc_greaterthan(method->code)) -#define OPCODE_GREATERTHAN 0xaf -code_t* abc_greaterequals(code_t*prev); -#define greaterequals(method) (method->code = abc_greaterequals(method->code)) -#define OPCODE_GREATEREQUALS 0xb0 -code_t* abc_hasnext(code_t*prev); -#define hasnext(method) (method->code = abc_hasnext(method->code)) -#define OPCODE_HASNEXT 0x1f -code_t* abc_hasnext2(code_t*prev, int reg, int reg2); -#define hasnext2(method,reg,reg2) (method->code = abc_hasnext2(method->code,reg,reg2)) -#define OPCODE_HASNEXT2 0x32 -code_t* abc_ifeq(code_t*prev, code_t* label); -#define ifeq(method,label) (method->code = abc_ifeq(method->code,label)) -#define OPCODE_IFEQ 0x13 -code_t* abc_iffalse(code_t*prev, code_t* label); -#define iffalse(method,label) (method->code = abc_iffalse(method->code,label)) -#define OPCODE_IFFALSE 0x12 -code_t* abc_ifge(code_t*prev, code_t* label); -#define ifge(method,label) (method->code = abc_ifge(method->code,label)) -#define OPCODE_IFGE 0x18 -code_t* abc_ifgt(code_t*prev, code_t* label); -#define ifgt(method,label) (method->code = abc_ifgt(method->code,label)) -#define OPCODE_IFGT 0x17 -code_t* abc_ifle(code_t*prev, code_t* label); -#define ifle(method,label) (method->code = abc_ifle(method->code,label)) -#define OPCODE_IFLE 0x16 -code_t* abc_iflt(code_t*prev, code_t* label); -#define iflt(method,label) (method->code = abc_iflt(method->code,label)) -#define OPCODE_IFLT 0x15 -code_t* abc_ifnge(code_t*prev, code_t* label); -#define ifnge(method,label) (method->code = abc_ifnge(method->code,label)) -#define OPCODE_IFNGE 0x0f -code_t* abc_ifngt(code_t*prev, code_t* label); -#define ifngt(method,label) (method->code = abc_ifngt(method->code,label)) -#define OPCODE_IFNGT 0x0e -code_t* abc_ifnle(code_t*prev, code_t* label); -#define ifnle(method,label) (method->code = abc_ifnle(method->code,label)) -#define OPCODE_IFNLE 0x0d -code_t* abc_ifnlt(code_t*prev, code_t* label); -#define ifnlt(method,label) (method->code = abc_ifnlt(method->code,label)) -#define OPCODE_IFNLT 0x0c -code_t* abc_ifne(code_t*prev, code_t* label); -#define ifne(method,label) (method->code = abc_ifne(method->code,label)) -#define OPCODE_IFNE 0x14 -code_t* abc_ifstricteq(code_t*prev, code_t* label); -#define ifstricteq(method,label) (method->code = abc_ifstricteq(method->code,label)) -#define OPCODE_IFSTRICTEQ 0x19 -code_t* abc_ifstrictne(code_t*prev, code_t* label); -#define ifstrictne(method,label) (method->code = abc_ifstrictne(method->code,label)) -#define OPCODE_IFSTRICTNE 0x1a -code_t* abc_iftrue(code_t*prev, code_t* label); -#define iftrue(method,label) (method->code = abc_iftrue(method->code,label)) -#define OPCODE_IFTRUE 0x11 -code_t* abc_in(code_t*prev); -#define in(method) (method->code = abc_in(method->code)) -#define OPCODE_IN 0xb4 -code_t* abc_inclocal(code_t*prev, int reg); -#define inclocal(method,reg) (method->code = abc_inclocal(method->code,reg)) -#define OPCODE_INCLOCAL 0x92 -code_t* abc_inclocal_i(code_t*prev, int reg); -#define inclocal_i(method,reg) (method->code = abc_inclocal_i(method->code,reg)) -#define OPCODE_INCLOCAL_I 0xc2 -code_t* abc_increment(code_t*prev); -#define increment(method) (method->code = abc_increment(method->code)) -#define OPCODE_INCREMENT 0x91 -code_t* abc_increment_i(code_t*prev); -#define increment_i(method) (method->code = abc_increment_i(method->code)) -#define OPCODE_INCREMENT_I 0xc0 -code_t* abc_initproperty(code_t*prev, char* name); -#define initproperty(method,name) (method->code = abc_initproperty(method->code,name)) -#define OPCODE_INITPROPERTY 0x68 -code_t* abc_initproperty2(code_t*prev, multiname_t* name); -#define initproperty2(method,name) (method->code = abc_initproperty2(method->code,name)) -#define OPCODE_INITPROPERTY2 0x68 -code_t* abc_instanceof(code_t*prev); -#define instanceof(method) (method->code = abc_instanceof(method->code)) -#define OPCODE_INSTANCEOF 0xb1 -code_t* abc_istype(code_t*prev, char* name); -#define istype(method,name) (method->code = abc_istype(method->code,name)) -#define OPCODE_ISTYPE 0xb2 -code_t* abc_istype2(code_t*prev, multiname_t* name); -#define istype2(method,name) (method->code = abc_istype2(method->code,name)) -#define OPCODE_ISTYPE2 0xb2 -code_t* abc_istypelate(code_t*prev); -#define istypelate(method) (method->code = abc_istypelate(method->code)) -#define OPCODE_ISTYPELATE 0xb3 -code_t* abc_jump(code_t*prev, code_t* label); -#define jump(method,label) (method->code = abc_jump(method->code,label)) -#define OPCODE_JUMP 0x10 -code_t* abc_kill(code_t*prev, int reg); -#define kill(method,reg) (method->code = abc_kill(method->code,reg)) -#define OPCODE_KILL 0x08 -code_t* abc_label(code_t*prev); -#define label(method) (method->code = abc_label(method->code)) -#define OPCODE_LABEL 0x09 -code_t* abc_lessequals(code_t*prev); -#define lessequals(method) (method->code = abc_lessequals(method->code)) -#define OPCODE_LESSEQUALS 0xae -code_t* abc_lessthan(code_t*prev); -#define lessthan(method) (method->code = abc_lessthan(method->code)) -#define OPCODE_LESSTHAN 0xad -code_t* abc_lookupswitch(code_t*prev, lookupswitch_t* l); -#define lookupswitch(method,l) (method->code = abc_lookupswitch(method->code,l)) -#define OPCODE_LOOKUPSWITCH 0x1b -code_t* abc_lshift(code_t*prev); -#define lshift(method) (method->code = abc_lshift(method->code)) -#define OPCODE_LSHIFT 0xa5 -code_t* abc_modulo(code_t*prev); -#define modulo(method) (method->code = abc_modulo(method->code)) -#define OPCODE_MODULO 0xa4 -code_t* abc_multiply(code_t*prev); -#define multiply(method) (method->code = abc_multiply(method->code)) -#define OPCODE_MULTIPLY 0xa2 -code_t* abc_multiply_i(code_t*prev); -#define multiply_i(method) (method->code = abc_multiply_i(method->code)) -#define OPCODE_MULTIPLY_I 0xc7 -code_t* abc_negate(code_t*prev); -#define negate(method) (method->code = abc_negate(method->code)) -#define OPCODE_NEGATE 0x90 -code_t* abc_negate_i(code_t*prev); -#define negate_i(method) (method->code = abc_negate_i(method->code)) -#define OPCODE_NEGATE_I 0xc4 -code_t* abc_newactivation(code_t*prev); -#define newactivation(method) (method->code = abc_newactivation(method->code)) -#define OPCODE_NEWACTIVATION 0x57 -code_t* abc_newarray(code_t*prev, int v); -#define newarray(method,v) (method->code = abc_newarray(method->code,v)) -#define OPCODE_NEWARRAY 0x56 -code_t* abc_newcatch(code_t*prev, int v); -#define newcatch(method,v) (method->code = abc_newcatch(method->code,v)) -#define OPCODE_NEWCATCH 0x5a -code_t* abc_newclass(code_t*prev, abc_class_t* m); -#define newclass(method,m) (method->code = abc_newclass(method->code,m)) -#define OPCODE_NEWCLASS 0x58 -code_t* abc_newfunction(code_t*prev, abc_method_t* m); -#define newfunction(method,m) (method->code = abc_newfunction(method->code,m)) -#define OPCODE_NEWFUNCTION 0x40 -code_t* abc_newobject(code_t*prev, int v); -#define newobject(method,v) (method->code = abc_newobject(method->code,v)) -#define OPCODE_NEWOBJECT 0x55 -code_t* abc_nextname(code_t*prev); -#define nextname(method) (method->code = abc_nextname(method->code)) -#define OPCODE_NEXTNAME 0x1e -code_t* abc_nextvalue(code_t*prev); -#define nextvalue(method) (method->code = abc_nextvalue(method->code)) -#define OPCODE_NEXTVALUE 0x23 -code_t* abc_nop(code_t*prev); -#define nop(method) (method->code = abc_nop(method->code)) -#define OPCODE_NOP 0x02 -code_t* abc_not(code_t*prev); -#define not(method) (method->code = abc_not(method->code)) -#define OPCODE_NOT 0x96 -code_t* abc_pop(code_t*prev); -#define pop(method) (method->code = abc_pop(method->code)) -#define OPCODE_POP 0x29 -code_t* abc_popscope(code_t*prev); -#define popscope(method) (method->code = abc_popscope(method->code)) -#define OPCODE_POPSCOPE 0x1d -code_t* abc_pushbyte(code_t*prev, int v); -#define pushbyte(method,v) (method->code = abc_pushbyte(method->code,v)) -#define OPCODE_PUSHBYTE 0x24 -code_t* abc_pushdouble(code_t*prev, double f); -#define pushdouble(method,f) (method->code = abc_pushdouble(method->code,f)) -#define OPCODE_PUSHDOUBLE 0x2f -code_t* abc_pushfalse(code_t*prev); -#define pushfalse(method) (method->code = abc_pushfalse(method->code)) -#define OPCODE_PUSHFALSE 0x27 -code_t* abc_pushint(code_t*prev, int i); -#define pushint(method,i) (method->code = abc_pushint(method->code,i)) -#define OPCODE_PUSHINT 0x2d -code_t* abc_pushnamespace(code_t*prev, namespace_t* ns); -#define pushnamespace(method,ns) (method->code = abc_pushnamespace(method->code,ns)) -#define OPCODE_PUSHNAMESPACE 0x31 -code_t* abc_pushnan(code_t*prev); -#define pushnan(method) (method->code = abc_pushnan(method->code)) -#define OPCODE_PUSHNAN 0x28 -code_t* abc_pushnull(code_t*prev); -#define pushnull(method) (method->code = abc_pushnull(method->code)) -#define OPCODE_PUSHNULL 0x20 -code_t* abc_pushscope(code_t*prev); -#define pushscope(method) (method->code = abc_pushscope(method->code)) -#define OPCODE_PUSHSCOPE 0x30 -code_t* abc_pushshort(code_t*prev, int v); -#define pushshort(method,v) (method->code = abc_pushshort(method->code,v)) -#define OPCODE_PUSHSHORT 0x25 -code_t* abc_pushstring(code_t*prev, char* name); -#define pushstring(method,name) (method->code = abc_pushstring(method->code,name)) -#define OPCODE_PUSHSTRING 0x2c -code_t* abc_pushstring2(code_t*prev, string_t* s); -#define pushstring2(method,s) (method->code = abc_pushstring2(method->code,s)) -#define OPCODE_PUSHSTRING2 0x2c -code_t* abc_pushtrue(code_t*prev); -#define pushtrue(method) (method->code = abc_pushtrue(method->code)) -#define OPCODE_PUSHTRUE 0x26 -code_t* abc_pushuint(code_t*prev, unsigned int u); -#define pushuint(method,u) (method->code = abc_pushuint(method->code,u)) -#define OPCODE_PUSHUINT 0x2e -code_t* abc_pushundefined(code_t*prev); -#define pushundefined(method) (method->code = abc_pushundefined(method->code)) -#define OPCODE_PUSHUNDEFINED 0x21 -code_t* abc_pushwith(code_t*prev); -#define pushwith(method) (method->code = abc_pushwith(method->code)) -#define OPCODE_PUSHWITH 0x1c -code_t* abc_returnvalue(code_t*prev); -#define returnvalue(method) (method->code = abc_returnvalue(method->code)) -#define OPCODE_RETURNVALUE 0x48 -code_t* abc_returnvoid(code_t*prev); -#define returnvoid(method) (method->code = abc_returnvoid(method->code)) -#define OPCODE_RETURNVOID 0x47 -code_t* abc_rshift(code_t*prev); -#define rshift(method) (method->code = abc_rshift(method->code)) -#define OPCODE_RSHIFT 0xa6 -code_t* abc_setlocal(code_t*prev, int reg); -#define setlocal(method,reg) (method->code = abc_setlocal(method->code,reg)) -#define OPCODE_SETLOCAL 0x63 -code_t* abc_setlocal_0(code_t*prev); -#define setlocal_0(method) (method->code = abc_setlocal_0(method->code)) -#define OPCODE_SETLOCAL_0 0xd4 -code_t* abc_setlocal_1(code_t*prev); -#define setlocal_1(method) (method->code = abc_setlocal_1(method->code)) -#define OPCODE_SETLOCAL_1 0xd5 -code_t* abc_setlocal_2(code_t*prev); -#define setlocal_2(method) (method->code = abc_setlocal_2(method->code)) -#define OPCODE_SETLOCAL_2 0xd6 -code_t* abc_setlocal_3(code_t*prev); -#define setlocal_3(method) (method->code = abc_setlocal_3(method->code)) -#define OPCODE_SETLOCAL_3 0xd7 -code_t* abc_setglobalslot(code_t*prev, int v); -#define setglobalslot(method,v) (method->code = abc_setglobalslot(method->code,v)) -#define OPCODE_SETGLOBALSLOT 0x6f -code_t* abc_setproperty(code_t*prev, char* name); -#define setproperty(method,name) (method->code = abc_setproperty(method->code,name)) -#define OPCODE_SETPROPERTY 0x61 -code_t* abc_setproperty2(code_t*prev, multiname_t* name); -#define setproperty2(method,name) (method->code = abc_setproperty2(method->code,name)) -#define OPCODE_SETPROPERTY2 0x61 -code_t* abc_setslot(code_t*prev, int v); -#define setslot(method,v) (method->code = abc_setslot(method->code,v)) -#define OPCODE_SETSLOT 0x6d -code_t* abc_setsuper(code_t*prev, char* name); -#define setsuper(method,name) (method->code = abc_setsuper(method->code,name)) -#define OPCODE_SETSUPER 0x05 -code_t* abc_setsuper2(code_t*prev, multiname_t* name); -#define setsuper2(method,name) (method->code = abc_setsuper2(method->code,name)) -#define OPCODE_SETSUPER2 0x05 -code_t* abc_strictequals(code_t*prev); -#define strictequals(method) (method->code = abc_strictequals(method->code)) -#define OPCODE_STRICTEQUALS 0xac -code_t* abc_subtract(code_t*prev); -#define subtract(method) (method->code = abc_subtract(method->code)) -#define OPCODE_SUBTRACT 0xa1 -code_t* abc_subtract_i(code_t*prev); -#define subtract_i(method) (method->code = abc_subtract_i(method->code)) -#define OPCODE_SUBTRACT_I 0xc6 -code_t* abc_swap(code_t*prev); -#define swap(method) (method->code = abc_swap(method->code)) -#define OPCODE_SWAP 0x2b -code_t* abc_throw(code_t*prev); -#define throw(method) (method->code = abc_throw(method->code)) -#define OPCODE_THROW 0x03 -code_t* abc_typeof(code_t*prev); -#define typeof(method) (method->code = abc_typeof(method->code)) -#define OPCODE_TYPEOF 0x95 -code_t* abc_urshift(code_t*prev); -#define urshift(method) (method->code = abc_urshift(method->code)) -#define OPCODE_URSHIFT 0xa7 -code_t* abc_applytype(code_t*prev, int v); -#define applytype(method,v) (method->code = abc_applytype(method->code,v)) -#define OPCODE_APPLYTYPE 0x53 -code_t* abc___pushpackage__(code_t*prev, char* name); -#define __pushpackage__(method,name) (method->code = abc___pushpackage__(method->code,name)) -#define OPCODE___PUSHPACKAGE__ 0xfb -code_t* abc___pushpackage__2(code_t*prev, string_t* s); -#define __pushpackage__2(method,s) (method->code = abc___pushpackage__2(method->code,s)) -#define OPCODE___PUSHPACKAGE__2 0xfb -code_t* abc___rethrow__(code_t*prev); -#define __rethrow__(method) (method->code = abc___rethrow__(method->code)) -#define OPCODE___RETHROW__ 0xfc -code_t* abc___fallthrough__(code_t*prev, char* name); -#define __fallthrough__(method,name) (method->code = abc___fallthrough__(method->code,name)) -#define OPCODE___FALLTHROUGH__ 0xfd -code_t* abc___fallthrough__2(code_t*prev, string_t* s); -#define __fallthrough__2(method,s) (method->code = abc___fallthrough__2(method->code,s)) -#define OPCODE___FALLTHROUGH__2 0xfd -code_t* abc___continue__(code_t*prev, char* name); -#define __continue__(method,name) (method->code = abc___continue__(method->code,name)) -#define OPCODE___CONTINUE__ 0xfe -code_t* abc___continue__2(code_t*prev, string_t* s); -#define __continue__2(method,s) (method->code = abc___continue__2(method->code,s)) -#define OPCODE___CONTINUE__2 0xfe -code_t* abc___break__(code_t*prev, char* name); -#define __break__(method,name) (method->code = abc___break__(method->code,name)) -#define OPCODE___BREAK__ 0xff -code_t* abc___break__2(code_t*prev, string_t* s); -#define __break__2(method,s) (method->code = abc___break__2(method->code,s)) -#define OPCODE___BREAK__2 0xff -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.h deleted file mode 100644 index 1ce738a17..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.h +++ /dev/null @@ -1,36 +0,0 @@ -/* parser.h - - Routines for compiling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __abc_parser_h__ -#define __abc_parser_h__ - -/* first public class overloading MovieClip, if any */ -extern char*as3_globalclass; - -void set_conditional(const char*part1, const char*part2); - -void initialize_parser(); -void initialize_file(const char*name, const char*filename); -void finish_file(); -void* finish_parser(); -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.c deleted file mode 100644 index 39a7c89af..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.c +++ /dev/null @@ -1,7539 +0,0 @@ - -/* A Bison parser, made by GNU Bison 2.4.2. */ - -/* Skeleton implementation for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.4.2" - -/* Skeleton name. */ -#define YYSKELETON_NAME "./skeleton.m4" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - -/* Using locations. */ -#define YYLSP_NEEDED 0 - -/* Substitute the variable and function names. */ -#define yyparse a3_parse -#define yylex a3_lex -#define yyerror a3_error -#define yylval a3_lval -#define yychar a3_char -#define yydebug a3_debug -#define yynerrs a3_nerrs - - -/* Copy the first part of user declarations. */ - -/* Line 198 of skeleton.m4 */ -#line 23 "parser.y" - -#include -#include -#include -#include "abc.h" -#include "pool.h" -#include "files.h" -#include "common.h" -#include "tokenizer.h" -#include "registry.h" -#include "code.h" -#include "opcodes.h" -#include "compiler.h" -#include "expr.h" -#include "initcode.h" -#include "parser_help.h" - -extern int a3_lex(); - - - -/* Line 198 of skeleton.m4 */ -#line 103 "parser.tab.c" - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 1 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - T_IDENTIFIER = 258, - T_STRING = 259, - T_REGEXP = 260, - T_EMPTY = 261, - T_INT = 262, - T_UINT = 263, - T_FLOAT = 264, - T_FOR = 265, - T_WHILE = 266, - T_DO = 267, - T_SWITCH = 268, - KW_IMPLEMENTS = 269, - KW_NAMESPACE = 270, - KW_PACKAGE = 271, - KW_PROTECTED = 272, - KW_ARGUMENTS = 273, - KW_PUBLIC = 274, - KW_PRIVATE = 275, - KW_USE = 276, - KW_INTERNAL = 277, - KW_NEW = 278, - KW_NATIVE = 279, - KW_FUNCTION = 280, - KW_FINALLY = 281, - KW_UNDEFINED = 282, - KW_NAN = 283, - KW_CONTINUE = 284, - KW_CLASS = 285, - KW_CONST = 286, - KW_CATCH = 287, - KW_CASE = 288, - KW_SET = 289, - KW_VOID = 290, - KW_THROW = 291, - KW_STATIC = 292, - KW_WITH = 293, - KW_INSTANCEOF = 294, - KW_IMPORT = 295, - KW_RETURN = 296, - KW_TYPEOF = 297, - KW_INTERFACE = 298, - KW_NULL = 299, - KW_VAR = 300, - KW_DYNAMIC = 301, - KW_OVERRIDE = 302, - KW_FINAL = 303, - KW_EACH = 304, - KW_GET = 305, - KW_TRY = 306, - KW_SUPER = 307, - KW_EXTENDS = 308, - KW_FALSE = 309, - KW_TRUE = 310, - KW_BOOLEAN = 311, - KW_UINT = 312, - KW_INT = 313, - KW_NUMBER = 314, - KW_STRING = 315, - KW_DEFAULT = 316, - KW_DEFAULT_XML = 317, - KW_DELETE = 318, - KW_IF = 319, - KW_ELSE = 320, - KW_BREAK = 321, - KW_IS = 322, - KW_IN = 323, - KW_AS = 324, - T_DICTSTART = 325, - T_EQEQ = 326, - T_EQEQEQ = 327, - T_NE = 328, - T_NEE = 329, - T_LE = 330, - T_GE = 331, - T_ORBY = 332, - T_DIVBY = 333, - T_MODBY = 334, - T_MULBY = 335, - T_ANDBY = 336, - T_PLUSBY = 337, - T_MINUSBY = 338, - T_XORBY = 339, - T_SHRBY = 340, - T_SHLBY = 341, - T_USHRBY = 342, - T_OROR = 343, - T_ANDAND = 344, - T_COLONCOLON = 345, - T_MINUSMINUS = 346, - T_PLUSPLUS = 347, - T_DOTDOT = 348, - T_DOTDOTDOT = 349, - T_SHL = 350, - T_USHR = 351, - T_SHR = 352, - prec_none = 353, - prec_var_read = 354, - below_semicolon = 355, - below_assignment = 356, - below_lt = 357, - below_minus = 358, - minusminus_prefix = 359, - plusplus_prefix = 360, - below_curly = 361, - new2 = 362, - below_identifier = 363, - above_identifier = 364, - below_else = 365, - above_function = 366 - }; -#endif - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union -/* Line 223 of skeleton.m4 */ -#line 48 "parser.y" -tokenunion -{ - -/* Line 223 of skeleton.m4 */ -#line 48 "parser.y" - - enum yytokentype token; - - classinfo_t*classinfo; - classinfo_list_t*classinfo_list; - slotinfo_t*slotinfo; - slotinfo_list_t*slotinfo_list; - - int number_int; - unsigned int number_uint; - double number_float; - code_t*code; - typedcode_t value; - //typedcode_list_t*value_list; - codeandnumber_t value_list; - param_t* param; - params_t params; - string_t str; - char*id; - constant_t*constant; - for_start_t for_start; - abc_exception_t *exception; - regexp_t regexp; - modifiers_t flags; - namespace_decl_t* namespace_decl; - node_t*node; - struct { - abc_exception_list_t *l; - code_t*finally; - } catch_list; - - - -/* Line 223 of skeleton.m4 */ -#line 287 "parser.tab.c" -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - - -/* Copy the second part of user declarations. */ - -/* Line 273 of skeleton.m4 */ -#line 277 "parser.y" - - -#define PASS1 }} if(as3_pass == 1) {{ -#define PASS1END }} if(as3_pass == 2) {{ -#define PASS2 }} if(as3_pass == 2) {{ -#define PASS12 }} if(as3_pass == 1 || as3_pass == 2) {{ -#define PASS12END }} if(as3_pass == 2) {{ -#define PASS_ALWAYS }} {{ - - - -/* Line 273 of skeleton.m4 */ -#line 311 "parser.tab.c" -/* Unqualified %code blocks. */ - -/* Line 274 of skeleton.m4 */ -#line 401 "parser.y" - - char is_subtype_of(classinfo_t*type, classinfo_t*supertype) - { - return 1; // FIXME - } - char do_init_variable(char*name) - { - if(!state->method->no_variable_scoping) - return 0; - if(!state->new_vars) - return 1; - return 1; - } - - -/* Line 274 of skeleton.m4 */ -#line 852 "parser.y" - - static void state_has_imports() - { - state->wildcard_imports = list_clone(state->wildcard_imports); - state->imports = dict_clone(state->imports); - state->has_own_imports = 1; - } - static void import_toplevel(const char*package) - { - char* s = strdup(package); - while(1) { - dict_put(state->import_toplevel_packages, s, 0); - char*x = strrchr(s, '.'); - if(!x) - break; - *x = 0; - } - free(s); - } - - -/* Line 274 of skeleton.m4 */ -#line 995 "parser.y" - - static int slotstate_varconst = 0; - static modifiers_t*slotstate_flags = 0; - static void setslotstate(modifiers_t* flags, int varconst) - { - slotstate_varconst = varconst; - slotstate_flags = flags; - if(state->cls) { - if(flags) { - if(flags->flags&FLAG_STATIC) { - state->method = state->cls->static_init; - } else { - state->method = state->cls->init; - } - } else { - // reset to "default" state (all in class code is static by default) */ - state->method = state->cls->static_init; - } - } else { - as3_assert(state->method); - } - } - static trait_t* add_abc_slot(modifiers_t* modifiers, const char*name, multiname_t*m, code_t***c) - { - int flags = modifiers->flags; - namespace_t ns = modifiers2access(modifiers); - - /* slot name */ - multiname_t mname = {QNAME, &ns, 0, name}; - - trait_list_t**traits; - code_t**code=0; - if(!state->cls) { - // global variable - if(!global->init) global->init = abc_initscript(global->file); - ns.name = state->package; - traits = &global->init->traits; - code = &global->init->method->body->code; - } else if(flags&FLAG_STATIC) { - // static variable - traits = &state->cls->abc->static_traits; - code = &state->cls->static_init->header; - } else { - // instance variable - traits = &state->cls->abc->traits; - code = &state->cls->init->header; - - if(ns.access == ACCESS_PROTECTED) { - ns.name = concat3(state->cls->info->package,":",state->cls->info->name); - } - } - if(c) - *c = code; - if(m) - *m = *multiname_clone(&mname); - - return trait_new_member(traits, 0, multiname_clone(&mname), 0); - } - - -/* Line 274 of skeleton.m4 */ -#line 1169 "parser.y" - - static int xml_level = 0; - - -/* Line 274 of skeleton.m4 */ -#line 1837 "parser.y" - - node_t* resolve_identifier(const char*name); - node_t* get_descendants(node_t*e,const char*ns,const char*subnode,char multi, char attr) - { - typedcode_t v = node_read(e); - typedcode_t w; - - multiname_t m = {0,0,0,subnode}; - namespace_t zero = {ZERONAMESPACE,"*"}; - if(!strcmp(ns,"*")) { - m.ns = &zero; - m.type = attr?QNAMEA:QNAME; - } else { - typedcode_t w = node_read(resolve_identifier(ns)); - if(!TYPE_IS_NAMESPACE(w.t)) { - as3_softwarning("%s might not be a namespace", ns); - } - v.c = code_append(v.c, w.c); - v.c = converttype(v.c, w.t, TYPE_NAMESPACE); - m.type = attr?RTQNAMEA:RTQNAME; - } - - if(!multi) { - v.c = abc_getproperty2(v.c, &m); - } else { - v.c = abc_getdescendants2(v.c, &m); - } - - if(TYPE_IS_XML(v.t)) { - v.t = TYPE_XMLLIST; - } else { - v.c = abc_coerce_a(v.c); - v.t = TYPE_ANY; - } - return mkcodenode(v); - } - - -/* Line 274 of skeleton.m4 */ -#line 2012 "parser.y" - - node_t* var_read(variable_t*v) - { - typedcode_t o; - o.c = abc_getlocal(0, v->index); - o.t = v->type; - return mkcodenode(o); - } - - node_t* resolve_identifier(const char*name) - { - typedcode_t o; - o.t = 0; - o.c = 0; - - slotinfo_t*a = 0; - memberinfo_t*f = 0; - - variable_t*v; - /* look at variables */ - if((v = find_variable(state, name))) { - // name is a local variable - return var_read(v); - } - if((v = find_slot(state->method, name))) { - o.c = abc_getscopeobject(o.c, 1); - o.c = abc_getslot(o.c, v->index); - o.t = v->type; - return mkcodenode(o); - } - - int i_am_static = state->method->is_static; - - if(!state->method->inner && !state->xmlfilter && state->cls) - { - /* look at current class' members */ - if((f = findmember_nsset(state->cls->info, name, 1, i_am_static))) - { - // name is a member or attribute in this class - int var_is_static = (f->flags&FLAG_STATIC); - - if(f->kind == INFOTYPE_VAR && (f->flags&FLAG_CONST)) { - /* if the variable is a constant (and we know what is evaluates to), we - can just use the value itself */ - varinfo_t*v = (varinfo_t*)f; - if(v->value) { - return mkconstnode(v->value); - } - } - - if(var_is_static >= i_am_static) { - if(f->kind == INFOTYPE_METHOD) { - o.t = TYPE_FUNCTION(f); - } else { - o.t = f->type; - } - - if(var_is_static && !i_am_static) { - /* access to a static member from a non-static location. - do this via findpropstrict: - there doesn't seem to be any non-lookup way to access - static properties of a class */ - state->method->late_binding = 1; - o.t = f->type; - namespace_t ns = {f->access, f->package}; - multiname_t m = {QNAME, &ns, 0, name}; - o.c = abc_findpropstrict2(o.c, &m); - o.c = abc_getproperty2(o.c, &m); - return mkcodenode(o); - } else if(f->slot>0) { - o.c = abc_getlocal_0(o.c); - o.c = abc_getslot(o.c, f->slot); - return mkcodenode(o); - } else { - MEMBER_MULTINAME(m, f, name); - o.c = abc_getlocal_0(o.c); - o.c = abc_getproperty2(o.c, &m); - return mkcodenode(o); - } - } - } - /* special case: it's allowed to access non-static constants - from a static context */ - if(i_am_static && (f=findmember_nsset(state->cls->info, name, 1, 0))) { - if(f->kind == INFOTYPE_VAR && (f->flags&FLAG_CONST)) { - varinfo_t*v = (varinfo_t*)f; - if(v->value) { - return mkconstnode(v->value); - } - } - } - } - - /* look at actual classes, in the current package and imported */ - if(!state->xmlfilter && (a = find_class(name))) { - registry_use(a); - if(state->cls && state->cls->info == (classinfo_t*)a && i_am_static) { - o.c = abc_getlocal_0(0); - o.t = TYPE_CLASS((classinfo_t*)a); - } else { - o = push_class(a); - } - return mkcodenode(o); - } - - /* look through package prefixes */ - if(!state->xmlfilter && - (dict_contains(state->import_toplevel_packages, name) || - registry_ispackage(name))) { - o.c = abc___pushpackage__(o.c, (char*)name); - o.t = 0; - return mkcodenode(o); //? - } - - /* unknown object, let the avm2 resolve it */ - if(1) { - if(!state->method->inner && !state->xmlfilter) { - /* we really should make inner functions aware of the class context */ - as3_warning("Couldn't resolve '%s', doing late binding", name); - } - state->method->late_binding = 1; - - multiname_t m = {MULTINAME, 0, &nopackage_namespace_set, name}; - - o.t = 0; - o.c = abc_findpropstrict2(o.c, &m); - o.c = abc_getproperty2(o.c, &m); - return mkcodenode(o); - } - } - - -/* Line 274 of skeleton.m4 */ -#line 2171 "parser.y" - - void add_active_url(const char*url) - { - NEW(namespace_t,n); - n->name = url; - list_append(state->active_namespace_urls, n); - } - - - -/* Line 274 of skeleton.m4 */ -#line 609 "parser.tab.c" - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if 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 - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int yyi) -#else -static int -YYID (yyi) - int yyi; -#endif -{ - return yyi; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (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 _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) - -#endif - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 162 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 3432 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 137 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 136 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 358 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 615 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 366 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 120, 2, 2, 2, 118, 109, 2, - 124, 136, 117, 115, 102, 114, 129, 116, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 106, 101, - 111, 104, 112, 105, 130, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 126, 2, 127, 108, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 128, 107, 135, 119, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 103, 110, 113, 121, - 122, 123, 125, 131, 132, 133, 134 -}; - -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 5, 6, 8, 10, 13, 15, 17, - 19, 21, 23, 25, 30, 32, 33, 35, 37, 40, - 42, 44, 46, 48, 50, 55, 60, 62, 64, 65, - 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, - 88, 90, 92, 94, 96, 100, 103, 105, 107, 109, - 111, 113, 115, 117, 122, 125, 127, 129, 130, 134, - 137, 138, 141, 144, 146, 150, 154, 155, 158, 159, - 162, 169, 170, 172, 174, 178, 180, 183, 187, 196, - 203, 209, 216, 218, 221, 223, 226, 227, 229, 231, - 234, 236, 239, 244, 248, 249, 258, 259, 269, 270, - 276, 278, 281, 283, 286, 288, 289, 296, 299, 301, - 306, 309, 311, 313, 315, 317, 321, 323, 324, 331, - 332, 338, 341, 344, 349, 350, 352, 354, 357, 359, - 361, 363, 365, 367, 369, 371, 373, 375, 377, 378, - 381, 382, 385, 386, 389, 390, 400, 401, 410, 411, - 413, 415, 418, 420, 425, 427, 429, 434, 436, 437, - 439, 441, 444, 446, 449, 458, 460, 462, 463, 468, - 470, 474, 478, 479, 482, 484, 486, 488, 490, 492, - 494, 496, 498, 500, 502, 504, 506, 507, 508, 513, - 514, 519, 520, 523, 526, 529, 532, 536, 538, 540, - 541, 543, 550, 561, 573, 575, 578, 580, 584, 588, - 592, 596, 597, 599, 602, 607, 611, 613, 618, 621, - 623, 625, 626, 627, 640, 642, 643, 644, 655, 657, - 661, 663, 665, 667, 671, 673, 675, 677, 680, 681, - 682, 686, 687, 689, 691, 693, 696, 699, 700, 705, - 710, 715, 718, 720, 723, 725, 727, 729, 733, 735, - 739, 740, 742, 744, 746, 748, 750, 752, 756, 762, - 764, 766, 768, 770, 772, 774, 776, 778, 780, 782, - 786, 790, 794, 798, 802, 806, 810, 814, 818, 822, - 826, 830, 833, 836, 840, 844, 848, 852, 856, 860, - 864, 868, 872, 876, 880, 884, 888, 892, 896, 899, - 902, 904, 908, 911, 916, 920, 924, 928, 932, 936, - 940, 944, 948, 952, 956, 960, 964, 970, 973, 976, - 979, 982, 986, 989, 990, 997, 999, 1001, 1003, 1005, - 1009, 1015, 1019, 1025, 1031, 1036, 1043, 1048, 1055, 1062, - 1069, 1073, 1074, 1077, 1080, 1085, 1090, 1093, 1098 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int16 yyrhs[] = -{ - 138, 0, -1, 139, -1, -1, 140, -1, 141, -1, - 140, 141, -1, 189, -1, 201, -1, 199, -1, 235, - -1, 210, -1, 150, -1, 152, 128, 139, 135, -1, - 101, -1, -1, 143, -1, 144, -1, 143, 144, -1, - 201, -1, 199, -1, 235, -1, 210, -1, 150, -1, - 152, 128, 142, 135, -1, 126, 151, 262, 127, -1, - 101, -1, 146, -1, -1, 146, 148, -1, 148, -1, - 271, -1, 192, -1, 164, -1, 165, -1, 166, -1, - 167, -1, 174, -1, 160, -1, 186, -1, 182, -1, - 258, -1, 272, -1, 270, -1, 128, 146, 135, -1, - 128, 135, -1, 101, -1, 147, -1, 154, -1, 168, - -1, 169, -1, 254, -1, 184, -1, 152, 128, 146, - 135, -1, 148, 101, -1, 148, -1, 147, -1, -1, - 3, 90, 3, -1, 104, 262, -1, -1, 45, 155, - -1, 31, 155, -1, 156, -1, 155, 102, 156, -1, - 3, 245, 153, -1, -1, 158, 149, -1, -1, 65, - 157, -1, 64, 124, 256, 136, 157, 159, -1, -1, - 154, -1, 258, -1, 45, 3, 245, -1, 3, -1, - 10, 124, -1, 10, 49, 124, -1, 163, 161, 101, - 256, 101, 258, 136, 157, -1, 163, 162, 68, 256, - 136, 157, -1, 11, 124, 256, 136, 157, -1, 12, - 157, 11, 124, 256, 136, -1, 66, -1, 66, 3, - -1, 29, -1, 29, 3, -1, -1, 171, -1, 173, - -1, 171, 173, -1, 172, -1, 171, 172, -1, 33, - 262, 106, 145, -1, 61, 106, 145, -1, -1, 13, - 124, 175, 262, 136, 128, 170, 135, -1, -1, 32, - 124, 3, 245, 136, 177, 128, 145, 135, -1, -1, - 26, 128, 179, 145, 135, -1, 176, -1, 180, 176, - -1, 180, -1, 180, 178, -1, 178, -1, -1, 51, - 128, 183, 145, 135, 181, -1, 36, 256, -1, 36, - -1, 38, 124, 256, 136, -1, 185, 149, -1, 3, - -1, 16, -1, 15, -1, 28, -1, 188, 129, 187, - -1, 187, -1, -1, 16, 188, 128, 190, 142, 135, - -1, -1, 16, 128, 191, 142, 135, -1, 40, 3, - -1, 40, 241, -1, 40, 188, 129, 117, -1, -1, - 194, -1, 195, -1, 194, 195, -1, 19, -1, 20, - -1, 17, -1, 37, -1, 46, -1, 48, -1, 47, - -1, 24, -1, 22, -1, 3, -1, -1, 53, 242, - -1, -1, 53, 243, -1, -1, 14, 243, -1, -1, - 193, 30, 3, 196, 198, 128, 200, 203, 135, -1, - -1, 193, 43, 3, 197, 128, 202, 206, 135, -1, - -1, 204, -1, 205, -1, 204, 205, -1, 101, -1, - 152, 128, 203, 135, -1, 210, -1, 235, -1, 126, - 151, 262, 127, -1, 147, -1, -1, 207, -1, 208, - -1, 207, 208, -1, 101, -1, 45, 3, -1, 193, - 25, 234, 3, 124, 231, 136, 245, -1, 45, -1, - 31, -1, -1, 193, 209, 211, 212, -1, 213, -1, - 212, 102, 213, -1, 3, 245, 153, -1, -1, 104, - 262, -1, 7, -1, 8, -1, 9, -1, 4, -1, - 55, -1, 54, -1, 44, -1, 27, -1, 28, -1, - 228, -1, 111, -1, 112, -1, -1, -1, 128, 262, - 221, 135, -1, -1, 128, 262, 223, 135, -1, -1, - 224, 220, -1, 224, 4, -1, 224, 112, -1, 228, - 224, -1, 225, 228, 224, -1, 3, -1, 222, -1, - -1, 229, -1, 217, 226, 227, 116, 219, 112, -1, - 217, 226, 227, 218, 224, 111, 116, 226, 219, 112, - -1, 217, 226, 227, 218, 224, 225, 111, 116, 226, - 219, 112, -1, 230, -1, 229, 230, -1, 222, -1, - 222, 104, 4, -1, 222, 104, 222, -1, 3, 104, - 222, -1, 3, 104, 4, -1, -1, 232, -1, 94, - 233, -1, 232, 102, 94, 233, -1, 232, 102, 233, - -1, 233, -1, 3, 106, 244, 214, -1, 3, 214, - -1, 50, -1, 34, -1, -1, -1, 193, 25, 234, - 3, 124, 231, 136, 245, 128, 236, 145, 135, -1, - 3, -1, -1, -1, 25, 237, 124, 231, 136, 245, - 128, 239, 145, 135, -1, 187, -1, 188, 129, 187, - -1, 241, -1, 240, -1, 242, -1, 243, 102, 242, - -1, 242, -1, 117, -1, 35, -1, 106, 244, -1, - -1, -1, 124, 247, 136, -1, -1, 248, -1, 249, - -1, 255, -1, 248, 102, -1, 249, 255, -1, -1, - 23, 262, 250, 246, -1, 262, 124, 247, 136, -1, - 52, 124, 247, 136, -1, 63, 262, -1, 41, -1, - 41, 256, -1, 262, -1, 257, -1, 262, -1, 257, - 102, 262, -1, 262, -1, 258, 102, 262, -1, -1, - 261, -1, 3, -1, 4, -1, 7, -1, 8, -1, - 9, -1, 260, 106, 255, -1, 261, 102, 260, 106, - 255, -1, 238, -1, 266, -1, 251, -1, 253, -1, - 252, -1, 268, -1, 215, -1, 216, -1, 5, -1, - 18, -1, 126, 247, 127, -1, 70, 259, 135, -1, - 262, 111, 262, -1, 262, 112, 262, -1, 262, 75, - 262, -1, 262, 76, 262, -1, 262, 71, 262, -1, - 262, 72, 262, -1, 262, 74, 262, -1, 262, 73, - 262, -1, 262, 88, 262, -1, 262, 89, 262, -1, - 120, 262, -1, 119, 262, -1, 262, 109, 262, -1, - 262, 108, 262, -1, 262, 107, 262, -1, 262, 97, - 262, -1, 262, 96, 262, -1, 262, 95, 262, -1, - 262, 116, 262, -1, 262, 118, 262, -1, 262, 115, - 262, -1, 262, 114, 262, -1, 262, 117, 262, -1, - 262, 68, 262, -1, 262, 69, 262, -1, 262, 39, - 262, -1, 262, 67, 262, -1, 42, 262, -1, 35, - 262, -1, 35, -1, 124, 257, 136, -1, 114, 262, - -1, 262, 126, 262, 127, -1, 262, 80, 262, -1, - 262, 79, 262, -1, 262, 86, 262, -1, 262, 85, - 262, -1, 262, 87, 262, -1, 262, 78, 262, -1, - 262, 77, 262, -1, 262, 84, 262, -1, 262, 81, - 262, -1, 262, 82, 262, -1, 262, 83, 262, -1, - 262, 104, 262, -1, 262, 105, 262, 106, 262, -1, - 262, 92, -1, 262, 91, -1, 92, 262, -1, 91, - 262, -1, 52, 129, 3, -1, 130, 3, -1, -1, - 262, 129, 124, 263, 262, 136, -1, 3, -1, 117, - -1, 187, -1, 117, -1, 262, 90, 262, -1, 262, - 129, 264, 90, 265, -1, 262, 93, 265, -1, 262, - 93, 264, 90, 265, -1, 262, 129, 126, 262, 127, - -1, 262, 129, 130, 265, -1, 262, 129, 130, 264, - 90, 265, -1, 262, 93, 130, 265, -1, 262, 93, - 130, 264, 90, 265, -1, 262, 129, 130, 126, 262, - 127, -1, 262, 93, 130, 126, 262, 127, -1, 262, - 129, 265, -1, -1, 267, 3, -1, 15, 3, -1, - 15, 3, 104, 3, -1, 15, 3, 104, 4, -1, - 193, 269, -1, 62, 15, 104, 262, -1, 21, 15, - 242, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 292, 292, 294, 294, 295, 296, 298, 299, 300, - 301, 302, 303, 304, 305, 307, 307, 308, 309, 311, - 312, 313, 314, 315, 316, 317, 318, 320, 321, 323, - 326, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 346, 347, 348, 349, - 350, 351, 352, 353, 365, 366, 370, 381, 389, 416, - 417, 419, 420, 422, 423, 425, 486, 486, 490, 491, - 494, 510, 511, 512, 517, 521, 526, 527, 529, 549, - 593, 609, 621, 624, 627, 630, 634, 635, 636, 637, - 638, 639, 641, 652, 655, 655, 686, 686, 711, 711, - 727, 728, 729, 730, 738, 747, 747, 796, 801, 812, - 822, 839, 840, 841, 842, 844, 845, 847, 847, 849, - 849, 873, 881, 895, 911, 912, 913, 914, 921, 922, - 923, 924, 925, 926, 927, 928, 929, 930, 934, 935, - 937, 938, 940, 941, 945, 943, 951, 949, 958, 959, - 960, 961, 962, 963, 964, 965, 966, 968, 974, 975, - 976, 977, 978, 979, 982, 1055, 1055, 1057, 1057, 1059, - 1060, 1062, 1146, 1147, 1155, 1156, 1159, 1160, 1161, 1162, - 1163, 1164, 1165, 1173, 1184, 1185, 1186, 1188, 1188, 1191, - 1191, 1194, 1195, 1198, 1203, 1206, 1209, 1212, 1215, 1219, - 1222, 1226, 1230, 1235, 1241, 1244, 1247, 1250, 1255, 1258, - 1261, 1271, 1275, 1281, 1287, 1295, 1300, 1306, 1314, 1322, - 1323, 1324, 1327, 1326, 1343, 1344, 1346, 1345, 1369, 1389, - 1404, 1405, 1407, 1408, 1410, 1411, 1412, 1421, 1422, 1426, - 1427, 1429, 1430, 1431, 1433, 1437, 1438, 1443, 1444, 1491, - 1541, 1562, 1584, 1587, 1594, 1597, 1600, 1603, 1606, 1609, - 1614, 1615, 1617, 1618, 1619, 1620, 1621, 1623, 1629, 1638, - 1639, 1640, 1641, 1642, 1643, 1645, 1649, 1654, 1672, 1683, - 1693, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, - 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, - 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, - 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, - 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1749, 1750, 1751, - 1752, 1754, 1769, 1777, 1777, 1831, 1832, 1834, 1835, 1876, - 1879, 1882, 1889, 1892, 1903, 1911, 1915, 1922, 1926, 1936, - 1947, 2144, 2145, 2180, 2187, 2194, 2201, 2223, 2230 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "T_IDENTIFIER", "T_STRING", "T_REGEXP", - "T_EMPTY", "T_INT", "T_UINT", "T_FLOAT", "\"for\"", "\"while\"", - "\"do\"", "\"switch\"", "\"implements\"", "\"namespace\"", "\"package\"", - "\"protected\"", "\"arguments\"", "\"public\"", "\"private\"", "\"use\"", - "\"internal\"", "\"new\"", "\"native\"", "\"function\"", "\"finally\"", - "\"undefined\"", "\"NaN\"", "\"continue\"", "\"class\"", "\"const\"", - "\"catch\"", "\"case\"", "\"set\"", "\"void\"", "\"throw\"", - "\"static\"", "\"with\"", "\"instanceof\"", "\"import\"", "\"return\"", - "\"typeof\"", "\"interface\"", "\"null\"", "\"var\"", "\"dynamic\"", - "\"override\"", "\"final\"", "\"each\"", "\"get\"", "\"try\"", - "\"super\"", "\"extends\"", "\"false\"", "\"true\"", "\"Boolean\"", - "\"uint\"", "\"int\"", "\"Number\"", "\"String\"", "\"default\"", - "\"default xml\"", "\"delete\"", "\"if\"", "\"else\"", "\"break\"", - "\"is\"", "\"in\"", "\"as\"", "\"{ (dictionary)\"", "\"==\"", "\"===\"", - "\"!=\"", "\"!==\"", "\"<=\"", "\">=\"", "\"|=\"", "\"/=\"", "\"%=\"", - "\"*=\"", "\"&=\"", "\"+=\"", "\"-=\"", "\"^=\"", "\">>=\"", "\"<<=\"", - "\">>>=\"", "\"||\"", "\"&&\"", "\"::\"", "\"--\"", "\"++\"", "\"..\"", - "\"...\"", "\"<<\"", "\">>>\"", "\">>\"", "prec_none", "prec_var_read", - "below_semicolon", "';'", "','", "below_assignment", "'='", "'?'", "':'", - "'|'", "'^'", "'&'", "below_lt", "'<'", "'>'", "below_minus", "'-'", - "'+'", "'/'", "'*'", "'%'", "'~'", "'!'", "minusminus_prefix", - "plusplus_prefix", "below_curly", "'('", "new2", "'['", "']'", "'{'", - "'.'", "'@'", "below_identifier", "above_identifier", "below_else", - "above_function", "'}'", "')'", "$accept", "PROGRAM", - "MAYBE_PROGRAM_CODE_LIST", "PROGRAM_CODE_LIST", "PROGRAM_CODE", - "MAYBE_INPACKAGE_CODE_LIST", "INPACKAGE_CODE_LIST", "INPACKAGE_CODE", - "MAYBECODE", "CODE", "CODE_STATEMENT", "CODEPIECE", "CODEBLOCK", - "PACKAGE_INITCODE", "EMBED_START", "CONDITIONAL_COMPILATION", - "MAYBEEXPRESSION", "VARIABLE_DECLARATION", "VARIABLE_LIST", - "ONE_VARIABLE", "IF_CODEBLOCK", "$@1", "MAYBEELSE", "IF", "FOR_INIT", - "FOR_IN_INIT", "FOR_START", "FOR", "FOR_IN", "WHILE", "DO_WHILE", - "BREAK", "CONTINUE", "MAYBE_CASE_LIST", "CASE_LIST", "CASE", "DEFAULT", - "SWITCH", "$@2", "CATCH", "$@3", "FINALLY", "$@4", "CATCH_LIST", - "CATCH_FINALLY_LIST", "TRY", "$@5", "THROW", "WITH_HEAD", "WITH", - "X_IDENTIFIER", "PACKAGE", "PACKAGE_DECLARATION", "$@6", "$@7", "IMPORT", - "MAYBE_MODIFIERS", "MODIFIER_LIST", "MODIFIER", "EXTENDS", - "EXTENDS_LIST", "IMPLEMENTS_LIST", "CLASS_DECLARATION", "$@8", - "INTERFACE_DECLARATION", "$@9", "MAYBE_CLASS_BODY", "CLASS_BODY", - "CLASS_BODY_ITEM", "MAYBE_INTERFACE_BODY", "INTERFACE_BODY", - "IDECLARATION", "VARCONST", "SLOT_DECLARATION", "$@10", "SLOT_LIST", - "ONE_SLOT", "MAYBECONSTANT", "CONSTANT", "XML", "OPEN", "CLOSE", - "CLOSE2", "XMLEXPR1", "$@11", "XMLEXPR2", "$@12", "XMLTEXT", "XML2", - "XML_ID_OR_EXPR", "MAYBE_XMLATTRIBUTES", "XMLNODE", "XMLATTRIBUTES", - "XMLATTRIBUTE", "MAYBE_PARAM_LIST", "PARAM_LIST", "PARAM", "GETSET", - "FUNCTION_DECLARATION", "$@13", "MAYBE_IDENTIFIER", "INNERFUNCTION", - "$@14", "CLASS", "PACKAGEANDCLASS", "CLASS_SPEC", "CLASS_SPEC_LIST", - "TYPE", "MAYBETYPE", "MAYBE_PARAM_VALUES", "MAYBE_EXPRESSION_LIST", - "EXPRESSION_LIST", "EXPRESSION_LIST_AND_COMMA", "XX", "NEW", - "FUNCTIONCALL", "DELETE", "RETURN", "NONCOMMAEXPRESSION", "EXPRESSION", - "COMMA_EXPRESSION", "VOIDEXPRESSION", "MAYBE_DICT_EXPRPAIR_LIST", - "DICTLH", "DICT_EXPRPAIR_LIST", "E", "$@15", "ID_OR_NS", "SUBNODE", - "MEMBER", "NOTHING", "VAR_READ", "NAMESPACE_ID", "NAMESPACE_DECLARATION", - "DEFAULT_NAMESPACE", "USE_NAMESPACE", 0 -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 59, 44, 356, 61, 63, 58, 124, 94, 38, - 357, 60, 62, 358, 45, 43, 47, 42, 37, 126, - 33, 359, 360, 361, 40, 362, 91, 93, 123, 46, - 64, 363, 364, 365, 366, 125, 41 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint16 yyr1[] = -{ - 0, 137, 138, 139, 139, 140, 140, 141, 141, 141, - 141, 141, 141, 141, 141, 142, 142, 143, 143, 144, - 144, 144, 144, 144, 144, 144, 144, 145, 145, 146, - 146, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 148, 148, 148, 148, - 148, 148, 148, 148, 149, 149, 150, 151, 152, 153, - 153, 154, 154, 155, 155, 156, 158, 157, 159, 159, - 160, 161, 161, 161, 162, 162, 163, 163, 164, 165, - 166, 167, 168, 168, 169, 169, 170, 170, 170, 170, - 171, 171, 172, 173, 175, 174, 177, 176, 179, 178, - 180, 180, 181, 181, 181, 183, 182, 184, 184, 185, - 186, 187, 187, 187, 187, 188, 188, 190, 189, 191, - 189, 192, 192, 192, 193, 193, 194, 194, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 196, 196, - 197, 197, 198, 198, 200, 199, 202, 201, 203, 203, - 204, 204, 205, 205, 205, 205, 205, 205, 206, 206, - 207, 207, 208, 208, 208, 209, 209, 211, 210, 212, - 212, 213, 214, 214, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 216, 217, 218, 219, 221, 220, 223, - 222, 224, 224, 224, 224, 225, 225, 226, 226, 227, - 227, 228, 228, 228, 229, 229, 230, 230, 230, 230, - 230, 231, 231, 231, 231, 232, 232, 233, 233, 234, - 234, 234, 236, 235, 237, 237, 239, 238, 240, 241, - 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, - 246, 247, 247, 247, 248, 249, 248, 250, 251, 252, - 252, 253, 254, 254, 255, 256, 257, 257, 258, 258, - 259, 259, 260, 260, 260, 260, 260, 261, 261, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 263, 262, 264, 264, 265, 265, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 266, 267, 268, 269, 269, 269, 270, 271, 272 -}; - -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 1, 0, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 4, 1, 0, 1, 1, 2, 1, - 1, 1, 1, 1, 4, 4, 1, 1, 0, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, - 1, 1, 1, 4, 2, 1, 1, 0, 3, 2, - 0, 2, 2, 1, 3, 3, 0, 2, 0, 2, - 6, 0, 1, 1, 3, 1, 2, 3, 8, 6, - 5, 6, 1, 2, 1, 2, 0, 1, 1, 2, - 1, 2, 4, 3, 0, 8, 0, 9, 0, 5, - 1, 2, 1, 2, 1, 0, 6, 2, 1, 4, - 2, 1, 1, 1, 1, 3, 1, 0, 6, 0, - 5, 2, 2, 4, 0, 1, 1, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, - 0, 2, 0, 2, 0, 9, 0, 8, 0, 1, - 1, 2, 1, 4, 1, 1, 4, 1, 0, 1, - 1, 2, 1, 2, 8, 1, 1, 0, 4, 1, - 3, 3, 0, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 4, 0, - 4, 0, 2, 2, 2, 2, 3, 1, 1, 0, - 1, 6, 10, 11, 1, 2, 1, 3, 3, 3, - 3, 0, 1, 2, 4, 3, 1, 4, 2, 1, - 1, 0, 0, 12, 1, 0, 0, 10, 1, 3, - 1, 1, 1, 3, 1, 1, 1, 2, 0, 0, - 3, 0, 1, 1, 1, 2, 2, 0, 4, 4, - 4, 2, 1, 2, 1, 1, 1, 3, 1, 3, - 0, 1, 1, 1, 1, 1, 1, 3, 5, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, - 1, 3, 2, 4, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 2, 2, 2, - 2, 3, 2, 0, 6, 1, 1, 1, 1, 3, - 5, 3, 5, 5, 4, 6, 4, 6, 6, 6, - 3, 0, 2, 2, 4, 4, 2, 4, 3 -}; - -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint16 yydefact[] = -{ - 124, 137, 177, 277, 174, 175, 176, 0, 0, 66, - 0, 0, 130, 278, 128, 129, 0, 136, 351, 135, - 225, 181, 182, 310, 131, 0, 0, 351, 180, 132, - 134, 133, 0, 0, 179, 178, 0, 351, 0, 260, - 351, 351, 14, 184, 351, 351, 351, 351, 241, 124, - 0, 0, 2, 124, 5, 56, 12, 0, 38, 71, - 33, 34, 35, 36, 37, 40, 124, 39, 7, 32, - 0, 125, 126, 9, 8, 11, 275, 276, 0, 183, - 10, 269, 271, 273, 272, 41, 258, 270, 0, 274, - 43, 31, 42, 0, 0, 76, 351, 0, 124, 94, - 111, 113, 112, 114, 119, 116, 0, 0, 247, 224, - 0, 309, 351, 121, 0, 122, 308, 105, 241, 0, - 0, 251, 351, 262, 263, 264, 265, 266, 0, 0, - 261, 330, 329, 312, 292, 291, 0, 256, 0, 242, - 243, 244, 254, 84, 0, 108, 252, 0, 82, 46, - 45, 124, 47, 30, 0, 48, 49, 50, 52, 0, - 51, 332, 1, 6, 124, 75, 0, 72, 0, 0, - 73, 55, 110, 0, 221, 0, 166, 0, 165, 167, - 356, 137, 127, 197, 351, 198, 199, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 328, 327, 0, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, - 241, 351, 0, 352, 58, 77, 0, 255, 0, 67, - 351, 124, 117, 0, 228, 0, 231, 230, 358, 239, - 211, 0, 0, 28, 0, 331, 351, 0, 280, 351, - 0, 351, 311, 279, 245, 246, 85, 238, 62, 63, - 107, 253, 61, 83, 44, 29, 124, 0, 238, 351, - 351, 54, 353, 220, 219, 0, 138, 140, 0, 189, - 0, 206, 0, 200, 204, 259, 306, 307, 304, 305, - 285, 286, 288, 287, 283, 284, 320, 319, 315, 314, - 322, 323, 324, 321, 317, 316, 318, 289, 290, 339, - 111, 338, 0, 337, 0, 341, 298, 297, 296, 325, - 0, 295, 294, 293, 281, 282, 302, 301, 299, 303, - 300, 0, 0, 333, 351, 0, 0, 350, 66, 351, - 0, 26, 57, 0, 124, 17, 23, 0, 20, 19, - 22, 21, 124, 115, 0, 241, 248, 172, 0, 0, - 212, 216, 109, 123, 229, 0, 27, 250, 357, 66, - 267, 0, 257, 0, 60, 0, 124, 13, 60, 0, - 0, 0, 0, 0, 142, 0, 0, 238, 168, 169, - 0, 0, 0, 185, 186, 191, 205, 351, 0, 346, - 0, 351, 249, 313, 351, 0, 351, 0, 344, 0, - 80, 0, 0, 351, 120, 18, 124, 0, 0, 351, - 0, 218, 213, 238, 0, 0, 68, 351, 236, 235, - 234, 237, 351, 65, 64, 53, 351, 66, 354, 355, - 211, 139, 0, 0, 232, 141, 146, 60, 0, 190, - 210, 209, 207, 208, 0, 0, 0, 0, 338, 342, - 326, 0, 343, 0, 0, 340, 81, 86, 0, 0, - 118, 240, 173, 172, 0, 0, 215, 0, 0, 100, - 104, 102, 106, 66, 70, 268, 59, 0, 79, 0, - 143, 144, 0, 124, 171, 170, 201, 193, 184, 194, - 351, 192, 0, 191, 349, 347, 334, 348, 345, 351, - 0, 0, 87, 90, 88, 25, 24, 217, 226, 214, - 98, 0, 101, 103, 69, 66, 238, 124, 233, 0, - 162, 0, 0, 124, 160, 0, 187, 184, 191, 195, - 0, 28, 95, 91, 89, 28, 28, 238, 78, 0, - 152, 57, 157, 0, 0, 0, 124, 150, 154, 155, - 163, 221, 147, 161, 186, 0, 0, 196, 28, 93, - 0, 0, 0, 222, 351, 124, 145, 151, 0, 0, - 188, 186, 92, 227, 99, 96, 28, 0, 0, 0, - 202, 0, 0, 0, 156, 153, 211, 203, 28, 223, - 0, 0, 238, 97, 164 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 51, 52, 53, 54, 353, 354, 355, 375, 376, - 152, 153, 172, 356, 423, 154, 443, 155, 272, 269, - 97, 98, 494, 58, 168, 169, 59, 60, 61, 62, - 63, 156, 157, 521, 522, 523, 524, 64, 240, 489, - 602, 490, 556, 491, 492, 65, 253, 158, 66, 67, - 323, 245, 68, 362, 241, 69, 159, 71, 72, 394, - 396, 453, 358, 537, 359, 503, 565, 566, 567, 542, - 543, 544, 179, 360, 288, 398, 399, 431, 76, 77, - 78, 405, 464, 511, 575, 185, 400, 465, 512, 186, - 292, 79, 293, 294, 369, 370, 371, 285, 361, 596, - 110, 81, 555, 246, 247, 440, 455, 441, 384, 366, - 138, 139, 140, 249, 82, 83, 84, 160, 141, 236, - 237, 85, 128, 129, 130, 86, 414, 324, 325, 87, - 88, 89, 180, 90, 91, 92 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -499 -static const yytype_int16 yypact[] = -{ - 431, -19, -499, -499, -499, -499, -499, -22, -35, -499, - -17, 34, -499, -499, -499, -499, 81, -499, 2103, -499, - 75, -499, -499, 2156, -499, -15, 344, 2103, -499, -499, - -499, -499, -11, -3, -499, -499, 109, 2103, 6, 319, - 2103, 2103, -499, -499, 2103, 2103, 2103, 2103, 2022, 719, - 142, 151, -499, 590, -499, -499, -499, 30, -499, 1969, - -499, -499, -499, -499, -499, -499, 1879, -499, -499, -499, - 305, 366, -499, -499, -499, -499, -499, -499, 18, -499, - -499, -499, -499, -499, -499, 69, 2925, -499, 199, -499, - -499, -499, -499, 218, 100, -499, 2103, 222, 1879, -499, - -499, -499, -499, -499, -499, -499, 13, 377, -46, -499, - 111, 708, 2103, 105, 125, -499, 708, -499, 2022, 236, - 136, 708, 2103, -499, -499, -499, -499, -499, 121, 153, - 159, 708, 708, 436, 708, 708, -33, 2862, 135, 163, - 2022, -499, 2862, 269, 270, 2103, 2103, 270, 271, -499, - -499, 848, -499, -499, 147, -499, -499, -499, -499, 267, - -499, -499, -499, -499, 1106, -499, 286, -499, 190, 225, - 69, 193, -499, 294, 86, 296, -499, 298, -499, -499, - -499, -499, -499, -499, 2103, -499, 20, 2103, 2103, 2103, - 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, - 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, - 2103, 2103, -499, -499, 141, 2103, 2103, 2103, 2103, 2103, - 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, - 2022, 2103, 23, -499, -499, -499, 166, 204, 186, -499, - 2103, 1235, -499, 377, 187, 189, -499, -499, -499, 191, - 21, 188, 57, 1751, 195, -499, 2103, 197, -499, 2103, - 319, 2103, -499, -499, -499, -499, -499, 219, 239, -499, - -499, -499, 239, -499, -499, -499, 1879, 210, 219, 2103, - 2103, -499, 242, -499, -499, 346, 299, 317, 348, 2862, - 272, 274, 19, 20, -499, 2862, 1098, 582, 582, 582, - 3303, 3303, 3303, 3303, 1098, 1098, 2862, 2862, 2862, 2862, - 2862, 2862, 2862, 2862, 2862, 2862, 2862, 2988, 3051, -499, - -499, 281, 248, -499, 283, -499, 700, 700, 700, 2862, - 2358, 3114, 3177, 3240, 1098, 1098, 436, 436, 708, 708, - 708, 243, 2421, -499, 2103, 289, 285, -499, -499, 2103, - 2216, -499, 254, 247, 1364, -499, -499, 263, -499, -499, - -499, -499, 1235, -499, 377, 2022, -499, 46, 394, 262, - 306, -499, -499, -499, 280, 265, 1751, -499, 2862, -499, - -499, 310, 2862, 83, 314, 270, 977, -499, -7, 318, - 284, 157, 297, 377, 408, 377, 295, 219, 327, -499, - 302, 15, 42, -499, -499, -499, -499, 2103, 342, -499, - 293, 2103, -499, -499, 2103, 2484, 2103, 343, -499, 293, - -499, 309, 328, 2103, -499, -499, 1235, 322, 324, 2103, - 83, -499, -499, 219, 28, 38, 396, 2103, -499, -499, - -499, -499, 2103, -499, -499, -499, 2103, -499, -499, -499, - 21, -499, 377, 334, -499, 361, -499, 314, 348, -499, - -499, -499, -499, -499, 352, 26, 2547, 293, -499, -499, - 2862, 2287, -499, 2610, 293, -499, -499, 44, 2673, 330, - -499, -499, 2862, 363, 353, 394, -499, 356, 350, -499, - -499, 38, -499, -499, -499, -499, 2862, -28, -499, 336, - 361, -499, 377, 233, -499, -499, -499, -499, 354, -499, - 2103, -499, 365, -499, -499, -499, -499, -499, -499, 2103, - 374, 355, 44, -499, -499, -499, -499, -499, -499, -499, - -499, 484, -499, -499, -499, -499, 219, 1493, -499, 485, - -499, 464, 357, 266, -499, 18, 2862, 375, -499, 110, - 2736, 1751, -499, -499, -499, 1751, 1751, 219, -499, 369, - -499, 254, -499, 371, 50, 367, 1622, -499, -499, -499, - -499, 86, -499, -499, -499, 370, 18, 110, 1751, -499, - 373, 376, 364, -499, 2103, 1493, -499, -499, 501, 397, - -499, -499, -499, -499, -499, -499, 1751, 2799, 378, 382, - -499, 398, 384, 379, -499, -499, 21, -499, 1751, -499, - 380, 383, 219, -499, -499 -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -499, -499, 351, -499, 466, -322, -499, 167, -212, -31, - 1, -57, 419, 59, -41, 2, 67, 471, 381, 146, - -334, -499, -499, -499, -499, -499, -499, -499, -499, -499, - -499, -499, -499, -499, -499, 11, 12, -499, -499, 45, - -499, 53, -499, -499, -499, -499, -499, -499, -499, -499, - -6, 56, -499, -499, -499, -499, 0, -499, 475, -499, - -499, -499, 63, -499, 66, -499, -50, -499, -18, -499, - -499, 31, -499, 3, -499, -499, 89, 73, -499, -499, - -499, -499, -498, -499, -499, -170, -499, -461, -499, -497, - -499, -422, -499, 278, -433, -499, -346, -13, 4, -499, - -499, -499, -499, -499, 537, -95, 112, 143, -270, -499, - -105, -499, -499, -499, -499, -499, -499, -499, -130, -54, - 528, -52, -499, 316, -499, -12, -499, 16, -190, -499, - -499, -499, -499, -499, -499, -499 -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -352 -static const yytype_int16 yytable[] = -{ - 70, 55, 57, 75, 80, 105, 108, 170, 388, 171, - 265, 111, 248, 254, 420, 116, 291, 499, 151, 460, - 105, 183, 432, 290, 367, 121, 320, 94, 131, 132, - 507, 367, 133, 134, 135, 137, 142, 100, 101, 102, - 427, 171, 347, 513, 211, 436, 462, 214, 574, 101, - 102, 103, 549, 70, 55, 57, 75, 80, 251, 56, - 100, -74, 103, 73, 487, 173, 74, 106, 257, 261, - 488, 93, 101, 102, 187, 174, 589, 519, 109, 591, - 231, 176, 114, 232, 137, 103, 100, 577, 486, 96, - 548, 270, 271, 601, 275, 178, 107, 442, 101, 102, - 137, 244, 95, 262, 479, 520, 142, 99, 535, 112, - 137, 103, 56, 498, 507, 368, 73, 117, 438, 74, - 283, 118, 485, 291, 120, 341, 119, 457, 142, 380, - 122, 403, 409, 137, 137, 404, 284, 508, 509, 529, - 321, 242, 243, 184, 320, 161, 184, 343, 184, 344, - 429, 162, 430, 345, 510, 418, 101, 102, 164, 534, - 448, 449, 104, 484, 70, 55, 57, 75, 80, 103, - 184, 187, 289, 610, 373, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 439, 558, 233, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 142, 342, - 469, 234, 509, 56, 235, 389, 390, 73, 350, 475, - 74, 461, 463, 238, -111, 250, 181, 363, 510, 255, - 256, 70, 55, 357, 378, 386, 374, 142, 346, 382, - 12, 320, 14, 15, 252, 17, 258, 19, 321, 259, - 428, 260, 263, 101, 102, 264, 559, 137, 137, 181, - 24, 322, 266, 267, 273, 276, 103, 515, 539, 29, - 30, 31, 173, 12, 518, 14, 15, 582, 17, 278, - 19, 279, 320, 280, 281, 421, 100, 282, 451, 286, - 454, 287, 348, 24, 101, 102, 261, 495, 101, 102, - 349, 539, 29, 30, 31, 365, -116, 103, 364, 275, - 173, 103, 123, 124, 372, 383, 125, 126, 127, 275, - 174, 377, 415, 379, 540, 175, 176, 137, 408, 579, - 142, 385, 614, 580, 581, 387, 391, 113, 177, 392, - 178, 397, 393, 142, 70, 55, 357, 454, 374, 101, - 102, 417, 70, 55, 357, 321, 592, 540, -158, 181, - 395, -336, 103, 410, 407, 419, 401, 244, 402, 412, - 100, -241, 424, 12, 603, 14, 15, 244, 17, 244, - 19, 426, 101, 102, 497, 466, 611, 367, 433, 470, - 435, -159, 471, 24, 473, 103, 321, 538, 434, -115, - 468, 478, 29, 30, 31, 416, 437, 482, 442, 446, - 447, 450, 452, 456, 244, 142, 70, 55, 357, 458, - 496, -3, 467, 474, 1, 2, 3, 459, 4, 5, - 6, 7, 8, 9, 10, 476, 244, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 477, 480, 21, 22, - 481, 493, 501, 502, 506, 526, 23, 429, 24, 25, - 545, 26, 536, 27, 531, 28, 547, 29, 30, 31, - 551, 528, 32, 33, 530, 34, 35, 557, 570, 571, - 552, 576, 572, 36, 37, 38, 244, 583, 546, 585, - 595, 39, 586, 541, 599, 590, 606, 550, 593, 600, - 607, 594, 608, 605, 609, 277, 612, 239, 613, 163, - 584, 425, 40, 41, 504, 268, 211, 212, 213, 214, - 167, 444, 42, 553, 554, 598, 532, 564, 562, 563, - 568, 569, 43, 541, 533, 44, 182, 505, 587, 142, - 45, 46, 227, 228, 229, 47, 527, 48, 588, 49, - 230, 50, 231, 115, 500, 232, 564, 562, 563, 568, - 569, 406, 597, 483, 573, 136, 381, 0, 0, 0, - 0, 0, 0, 0, 0, 564, 562, 563, 568, 569, - -4, 0, 0, 1, 2, 3, 0, 4, 5, 6, - 7, 8, 9, 10, 0, 0, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 0, 0, 21, 22, 0, - 0, 188, 0, 0, 0, 23, 0, 24, 25, 0, - 26, 0, 27, 0, 28, 0, 29, 30, 31, 0, - 0, 32, 33, 0, 34, 35, 0, 0, 0, -352, - -352, -352, 36, 37, 38, 0, 0, 196, 197, 0, - 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 211, 212, 213, 214, 0, 215, 216, 217, - 0, 40, 41, 0, 0, 0, 0, 0, 0, 0, - 0, 42, 0, 223, 224, 0, 225, 226, 227, 228, - 229, 43, 0, 0, 44, 0, 230, 0, 231, 45, - 46, 232, 0, 0, 47, 0, 48, 0, 49, 0, - 50, 0, 1, 2, 3, -4, 4, 5, 6, 7, - 8, 9, 10, 0, 0, 0, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 0, 21, 22, 143, 0, - 144, 0, 0, 0, 23, 145, 24, 25, 0, 26, - 146, 27, 0, 28, 147, 29, 30, 31, 0, 0, - 32, 33, 0, 34, 35, 0, 0, 0, 0, 0, - 0, 36, 37, 38, 0, 148, 0, 0, 0, 39, - 211, 212, 213, 214, 0, 0, 0, 0, 211, 212, - 213, 214, 0, 0, 0, 0, 0, 0, 0, 0, - 40, 41, 0, 0, 225, 226, 227, 228, 229, 0, - 149, 0, 0, 0, 230, 0, 231, 0, 0, 232, - 43, 0, 230, 44, 231, 0, 0, 232, 45, 46, - 0, 0, 0, 47, 0, 48, 0, 49, 0, 50, - 0, 1, 2, 3, 150, 4, 5, 6, 7, 8, - 9, 10, 0, 0, 0, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 0, 21, 22, 143, 0, 144, - 0, 0, 0, 23, 145, 24, 25, 0, 26, 146, - 27, 0, 28, 147, 29, 30, 31, 0, 0, 32, - 33, 0, 34, 35, 0, 0, 0, 0, 0, 0, - 36, 37, 38, 0, 148, 0, 0, 0, 39, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, - 41, 0, 0, 0, 0, 0, 0, 0, 0, 149, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, - 0, 0, 44, 0, 0, 0, 0, 45, 46, 0, - 0, 0, 47, 0, 48, 0, 49, 0, 50, 0, - 1, 2, 3, 274, 4, 5, 6, 7, 8, 9, - 10, 0, 0, 0, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 0, 21, 22, 143, 0, 144, 0, - 0, 0, 23, 145, 24, 25, 0, 26, 146, 27, - 0, 28, 147, 29, 30, 31, 0, 0, 32, 33, - 0, 34, 35, 0, 0, 0, 0, 0, 0, 36, - 37, 38, 0, 148, 0, 0, 0, 39, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40, 41, - 0, 0, 0, 0, 0, 0, 0, 0, 149, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, - 0, 44, 0, 0, 0, 0, 45, 46, 0, 0, - 0, 47, 0, 48, 0, 49, 0, 50, 0, 1, - 2, 3, 445, 4, 5, 6, 7, 8, 9, 10, - 0, 0, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 0, 0, 21, 22, 0, 0, -352, 0, 0, - 0, 23, 0, 24, 25, 0, 26, 0, 27, 0, - 28, 0, 29, 30, 31, 0, 0, 32, 33, 0, - 34, 35, 0, 0, 0, 0, 0, 0, 36, 37, - 38, 0, 0, -352, -352, 0, 39, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 211, 212, - 213, 214, 0, 215, 216, 217, 0, 40, 41, 0, - 0, 0, 0, 0, 0, 0, 0, 42, 0, -352, - -352, 0, 225, 226, 227, 228, 229, 43, 0, 0, - 44, 0, 230, 0, 231, 45, 46, 232, 0, 0, - 47, 0, 48, 0, 49, 0, 50, 0, 1, 2, - 3, -3, 4, 5, 6, 7, 8, 9, 10, 0, - 0, 0, 12, 13, 14, 15, 16, 17, 18, 19, - 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, - 23, 0, 24, 25, 0, 26, 0, 27, 0, 28, - 0, 29, 30, 31, 0, 0, 32, 33, 0, 34, - 35, 0, 0, 0, 0, 0, 0, 36, 37, 38, - 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, - 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 43, 0, 0, 44, - 0, 0, 0, 0, 45, 46, 0, 0, 0, 47, - 0, 352, 0, 49, 0, 50, 0, 1, 2, 3, - -15, 4, 5, 6, 7, 8, 9, 10, 0, 0, - 0, 12, 13, 14, 15, 16, 17, 18, 19, 0, - 0, 21, 22, 0, 0, 0, 0, 0, 0, 23, - 0, 24, 25, 0, 26, 0, 27, 0, 28, 0, - 29, 30, 31, 0, 0, 32, 33, 0, 34, 35, - 0, 0, 0, 0, 0, 0, 36, 37, 38, 0, - 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, - 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 43, 0, 0, 44, 0, - 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, - 352, 0, 49, 0, 50, 0, 1, 2, 3, -16, - 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, - 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, - 21, 22, 0, 0, 0, 0, 0, 0, 23, 0, - 24, 25, 0, 26, 0, 27, 0, 28, 0, 29, - 30, 31, 0, 0, 32, 33, 0, 34, 35, 0, - 0, 0, 0, 0, 0, 36, 37, 38, 0, 0, - 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 40, 41, 0, 0, 0, 0, - 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 43, 0, 0, 44, 0, 0, - 0, 0, 45, 46, 0, 0, 0, 47, 0, 561, - 0, 49, 0, 50, 0, 1, 2, 3, -148, 4, - 5, 6, 7, 8, 9, 10, 0, 0, 0, 12, - 13, 14, 15, 16, 17, 18, 19, 0, 0, 21, - 22, 0, 0, 0, 0, 0, 0, 23, 0, 24, - 25, 0, 26, 0, 27, 0, 28, 0, 29, 30, - 31, 0, 0, 32, 33, 0, 34, 35, 0, 0, - 0, 0, 0, 0, 36, 37, 38, 0, 0, 0, - 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 40, 41, 0, 0, 0, 0, 0, - 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 43, 0, 0, 44, 0, 0, 0, - 0, 45, 46, 0, 0, 0, 47, 0, 561, 0, - 49, 0, 50, 0, 1, 2, 3, -149, 4, 5, - 6, 7, 8, 9, 10, 0, -124, 0, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, - 143, 0, 144, 0, 0, 0, 23, 145, 24, 25, - 0, 26, 146, 27, 0, 28, 147, 29, 30, 31, - 0, 0, 32, 33, 0, 34, 35, 0, 0, 0, - 0, 0, 0, 36, 37, 38, 0, 148, 0, 0, - 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 41, 0, 0, 0, 0, 0, 0, - 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 43, 0, 0, 44, 0, 0, 0, 0, - 45, 46, 0, 0, 0, 47, 0, 48, 0, 49, - 0, 50, 1, 2, 3, 0, 4, 5, 6, 7, - 8, 9, 10, 0, 0, 0, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 0, 21, 22, 143, 0, - 144, 0, 0, 0, 23, 145, 24, 25, 0, 26, - 146, 27, 0, 28, 147, 29, 30, 31, 0, 0, - 32, 33, 0, 34, 35, 0, 0, 0, 0, 0, - 0, 36, 37, 38, 0, 148, 0, 0, 0, 39, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 40, 41, 165, 2, 3, 0, 4, 5, 6, 0, - 149, 0, 0, 0, 0, 0, 0, 13, 0, 0, - 43, 0, 18, 44, 20, 0, 21, 22, 45, 46, - 144, 0, 0, 47, 23, 48, 0, 49, 0, 50, - 0, 27, 0, 28, 166, 0, 0, 0, 0, 0, - 0, 33, 0, 34, 35, -351, 2, 3, 0, 4, - 5, 6, 37, 0, 0, 0, 0, 0, 0, 39, - 13, 0, 0, 0, 0, 18, 0, 20, 0, 21, - 22, 0, 0, 0, 0, 0, 0, 23, 0, 0, - 40, 41, 0, 0, 27, 0, 28, 0, 0, 0, - 0, 0, 0, 0, 33, 0, 34, 35, 0, 0, - 43, 0, 0, 44, 0, 37, 0, 0, 45, 46, - 0, 0, 39, 47, 0, 48, 0, 0, 0, 50, - 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, - 4, 5, 6, 40, 41, 0, 0, 0, 0, 0, - 0, 13, 0, 0, 0, 0, 18, 0, 20, 0, - 21, 22, 0, 43, 0, 0, 44, 0, 23, 0, - 0, 45, 46, 0, 0, 27, 47, 28, 48, 0, - 0, 0, 50, 0, 0, 33, 0, 34, 35, 0, - 2, 3, 0, 4, 5, 6, 37, 0, 0, 0, - 0, 0, 0, 39, 13, 0, 0, 0, 0, 18, - 0, 20, 0, 21, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 40, 41, 0, 0, 0, 0, - 28, 0, 0, 0, 0, 0, 0, 0, 33, 0, - 34, 35, 0, 0, 43, 0, 0, 44, 0, 0, - 0, 0, 45, 46, 0, 0, 39, 47, 0, 48, - 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 40, 41, 0, - 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 47, 0, 48, 189, 190, 191, 50, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 0, 215, 216, 217, 0, 0, 0, 0, 0, 0, - 218, 219, 0, 220, 221, 222, 188, 223, 224, 0, - 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, - 230, 0, 231, 0, 0, 232, 0, 0, 0, 0, - 0, 0, 422, 0, 189, 190, 191, 0, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 217, 0, 0, 0, 0, 0, - 0, 218, 219, 0, 220, 221, 222, 188, 223, 224, - 0, 225, 226, 227, 228, 229, 0, 0, 0, 0, - 0, 230, 0, 231, 0, 0, 232, 0, 0, 0, - 0, 0, 0, 516, 0, 189, 190, 191, 0, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 0, 215, 216, 217, 0, 0, 0, 0, - 188, 0, 218, 219, 411, 220, 221, 222, 0, 223, - 224, 0, 225, 226, 227, 228, 229, 0, 0, 0, - 0, 0, 230, 0, 231, 0, 0, 232, 189, 190, - 191, 0, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 0, 215, 216, 217, 0, - 0, 0, 0, 188, 0, 218, 219, 0, 220, 221, - 222, 0, 223, 224, 0, 225, 226, 227, 228, 229, - 0, 0, 0, 0, 0, 230, 0, 231, 413, 0, - 232, 189, 190, 191, 0, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, - 216, 217, 0, 0, 0, 0, 188, 0, 218, 219, - 0, 220, 221, 222, 0, 223, 224, 0, 225, 226, - 227, 228, 229, 0, 0, 0, 0, 0, 230, 0, - 231, 472, 0, 232, 189, 190, 191, 0, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 217, 0, 0, 0, 0, 188, - 0, 218, 219, 0, 220, 221, 222, 0, 223, 224, - 0, 225, 226, 227, 228, 229, 0, 0, 0, 0, - 0, 230, 0, 231, 514, 0, 232, 189, 190, 191, - 0, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 217, 0, 0, - 0, 0, 188, 0, 218, 219, 0, 220, 221, 222, - 0, 223, 224, 0, 225, 226, 227, 228, 229, 0, - 0, 0, 0, 0, 230, 0, 231, 517, 0, 232, - 189, 190, 191, 0, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 0, 215, 216, - 217, 0, 0, 0, 0, 188, 0, 218, 219, 0, - 220, 221, 222, 0, 223, 224, 0, 225, 226, 227, - 228, 229, 0, 0, 0, 0, 0, 230, 0, 231, - 525, 0, 232, 189, 190, 191, 0, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 0, 215, 216, 217, 0, 0, 0, 0, 188, 0, - 218, 219, 578, 220, 221, 222, 0, 223, 224, 0, - 225, 226, 227, 228, 229, 0, 0, 0, 0, 0, - 230, 0, 231, 0, 0, 232, 189, 190, 191, 0, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 0, 215, 216, 217, 0, 0, 0, - 0, 188, 0, 218, 219, 0, 220, 221, 222, 0, - 223, 224, 0, 225, 226, 227, 228, 229, 0, 0, - 0, 0, 0, 230, 0, 231, 604, 0, 232, 189, - 190, 191, 0, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 0, 215, 216, 217, - 0, 0, 0, 0, 188, 0, 218, 219, 0, 220, - 221, 222, 0, 223, 224, 0, 225, 226, 227, 228, - 229, 0, 0, 0, 0, 0, 230, 0, 231, 0, - 0, 232, 189, 190, 191, 0, 192, 193, 194, 195, - 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 217, 0, 0, 0, 0, 188, 0, 218, - 219, 0, 220, 221, 222, 0, 0, 224, 0, 225, - 226, 227, 228, 229, 0, 0, 0, 0, 0, 230, - 0, 231, 0, 0, 232, 189, 190, 191, 0, 192, - 193, 194, 195, 196, 197, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 210, 211, 212, - 213, 214, 0, 215, 216, 217, 0, 0, 0, 0, - 188, 0, 0, 0, 0, 220, 221, 222, 0, 223, - 224, 0, 225, 226, 227, 228, 229, 0, 0, 0, - 0, 0, 230, 0, 231, 0, 0, 232, 189, 190, - 191, 0, 192, 193, 194, 195, 196, 197, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 211, 212, 213, 214, 0, 215, 216, 217, 0, - 0, 0, 0, 188, 0, 0, 0, 0, 220, 221, - 222, 0, 223, 224, 0, 225, 226, 227, 228, 229, - 0, 0, 0, 0, 0, 230, 0, 231, 0, 0, - 232, 189, 190, 191, 0, 192, 193, 194, 195, 196, - 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 211, 212, 213, 214, 0, 215, - 216, 217, 0, 0, 0, 0, 188, 0, 0, 0, - 0, 0, 221, 222, 0, 223, 224, 0, 225, 226, - 227, 228, 229, 0, 0, 0, 0, 0, 230, 0, - 231, 0, 0, 232, 189, 190, 191, 0, 192, 193, - 194, 195, 196, 197, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 211, 212, 213, - 214, 0, 215, 216, 217, 0, 0, 0, 0, 188, - 0, 0, 0, 0, 0, 0, 222, 0, 223, 224, - 0, 225, 226, 227, 228, 229, 0, 0, 0, 0, - 0, 230, 0, 231, 0, 0, 232, 189, 190, 191, - 0, 192, 193, 194, 195, 196, 197, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 211, 212, 213, 214, 0, 215, 216, 217, 0, 0, - 0, 0, 188, 0, 0, 0, 0, 0, 0, -352, - 0, 223, 224, 0, 225, 226, 227, 228, 229, 0, - 0, 0, 0, 0, 230, 0, 231, 0, 0, 232, - 189, 190, 191, 0, -352, -352, -352, -352, 196, 197, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 211, 212, 213, 214, 0, 215, 216, - 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 223, 224, 0, 225, 226, 227, - 228, 229, 0, 0, 0, 0, 0, 230, 0, 231, - 0, 0, 232 -}; - -static const yytype_int16 yycheck[] = -{ - 0, 0, 0, 0, 0, 11, 18, 59, 278, 66, - 140, 23, 107, 118, 348, 27, 186, 450, 49, 4, - 26, 3, 368, 3, 3, 37, 3, 49, 40, 41, - 4, 3, 44, 45, 46, 47, 48, 3, 15, 16, - 362, 98, 232, 465, 90, 379, 4, 93, 545, 15, - 16, 28, 513, 53, 53, 53, 53, 53, 112, 0, - 3, 68, 28, 0, 26, 15, 0, 11, 122, 102, - 32, 90, 15, 16, 102, 25, 574, 33, 3, 576, - 126, 31, 26, 129, 96, 28, 3, 548, 434, 124, - 512, 145, 146, 591, 151, 45, 15, 104, 15, 16, - 112, 107, 124, 136, 426, 61, 118, 124, 136, 124, - 122, 28, 53, 447, 4, 94, 53, 128, 35, 53, - 34, 124, 94, 293, 15, 230, 129, 397, 140, 259, - 124, 112, 322, 145, 146, 116, 50, 111, 112, 485, - 117, 128, 129, 128, 3, 3, 128, 124, 128, 126, - 104, 0, 106, 130, 128, 345, 15, 16, 128, 493, - 3, 4, 128, 433, 164, 164, 164, 164, 164, 28, - 128, 102, 184, 606, 117, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 117, 535, 3, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 410, 3, 112, 164, 124, 279, 280, 164, 240, 419, - 164, 401, 402, 11, 129, 124, 3, 243, 128, 3, - 104, 241, 241, 241, 256, 276, 252, 259, 232, 261, - 17, 3, 19, 20, 129, 22, 135, 24, 117, 106, - 365, 102, 127, 15, 16, 102, 536, 279, 280, 3, - 37, 130, 3, 3, 3, 128, 28, 467, 45, 46, - 47, 48, 15, 17, 474, 19, 20, 557, 22, 3, - 24, 101, 3, 68, 101, 349, 3, 3, 393, 3, - 395, 3, 136, 37, 15, 16, 102, 437, 15, 16, - 124, 45, 46, 47, 48, 124, 129, 28, 129, 376, - 15, 28, 3, 4, 136, 106, 7, 8, 9, 386, - 25, 136, 344, 136, 101, 30, 31, 349, 322, 551, - 352, 102, 612, 555, 556, 135, 104, 3, 43, 3, - 45, 3, 53, 365, 354, 354, 354, 452, 364, 15, - 16, 345, 362, 362, 362, 117, 578, 101, 135, 3, - 53, 90, 28, 90, 126, 90, 104, 383, 104, 136, - 3, 127, 135, 17, 596, 19, 20, 393, 22, 395, - 24, 128, 15, 16, 446, 407, 608, 3, 136, 411, - 135, 135, 414, 37, 416, 28, 117, 502, 102, 129, - 117, 423, 46, 47, 48, 126, 106, 429, 104, 101, - 136, 124, 14, 128, 430, 437, 426, 426, 426, 102, - 442, 0, 90, 90, 3, 4, 5, 135, 7, 8, - 9, 10, 11, 12, 13, 136, 452, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 128, 135, 27, 28, - 136, 65, 128, 102, 112, 135, 35, 104, 37, 38, - 116, 40, 136, 42, 124, 44, 111, 46, 47, 48, - 106, 128, 51, 52, 128, 54, 55, 3, 3, 25, - 135, 116, 135, 62, 63, 64, 502, 128, 510, 128, - 136, 70, 135, 503, 3, 135, 124, 519, 135, 112, - 112, 135, 128, 135, 135, 164, 136, 98, 135, 53, - 561, 354, 91, 92, 457, 144, 90, 91, 92, 93, - 59, 385, 101, 522, 522, 585, 491, 537, 537, 537, - 537, 537, 111, 543, 491, 114, 71, 458, 566, 561, - 119, 120, 116, 117, 118, 124, 483, 126, 571, 128, - 124, 130, 126, 26, 452, 129, 566, 566, 566, 566, - 566, 293, 584, 430, 543, 47, 260, -1, -1, -1, - -1, -1, -1, -1, -1, 585, 585, 585, 585, 585, - 0, -1, -1, 3, 4, 5, -1, 7, 8, 9, - 10, 11, 12, 13, -1, -1, 16, 17, 18, 19, - 20, 21, 22, 23, 24, -1, -1, 27, 28, -1, - -1, 39, -1, -1, -1, 35, -1, 37, 38, -1, - 40, -1, 42, -1, 44, -1, 46, 47, 48, -1, - -1, 51, 52, -1, 54, 55, -1, -1, -1, 67, - 68, 69, 62, 63, 64, -1, -1, 75, 76, -1, - 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 90, 91, 92, 93, -1, 95, 96, 97, - -1, 91, 92, -1, -1, -1, -1, -1, -1, -1, - -1, 101, -1, 111, 112, -1, 114, 115, 116, 117, - 118, 111, -1, -1, 114, -1, 124, -1, 126, 119, - 120, 129, -1, -1, 124, -1, 126, -1, 128, -1, - 130, -1, 3, 4, 5, 135, 7, 8, 9, 10, - 11, 12, 13, -1, -1, -1, 17, 18, 19, 20, - 21, 22, 23, 24, 25, -1, 27, 28, 29, -1, - 31, -1, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, -1, 44, 45, 46, 47, 48, -1, -1, - 51, 52, -1, 54, 55, -1, -1, -1, -1, -1, - -1, 62, 63, 64, -1, 66, -1, -1, -1, 70, - 90, 91, 92, 93, -1, -1, -1, -1, 90, 91, - 92, 93, -1, -1, -1, -1, -1, -1, -1, -1, - 91, 92, -1, -1, 114, 115, 116, 117, 118, -1, - 101, -1, -1, -1, 124, -1, 126, -1, -1, 129, - 111, -1, 124, 114, 126, -1, -1, 129, 119, 120, - -1, -1, -1, 124, -1, 126, -1, 128, -1, 130, - -1, 3, 4, 5, 135, 7, 8, 9, 10, 11, - 12, 13, -1, -1, -1, 17, 18, 19, 20, 21, - 22, 23, 24, 25, -1, 27, 28, 29, -1, 31, - -1, -1, -1, 35, 36, 37, 38, -1, 40, 41, - 42, -1, 44, 45, 46, 47, 48, -1, -1, 51, - 52, -1, 54, 55, -1, -1, -1, -1, -1, -1, - 62, 63, 64, -1, 66, -1, -1, -1, 70, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, - 92, -1, -1, -1, -1, -1, -1, -1, -1, 101, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 111, - -1, -1, 114, -1, -1, -1, -1, 119, 120, -1, - -1, -1, 124, -1, 126, -1, 128, -1, 130, -1, - 3, 4, 5, 135, 7, 8, 9, 10, 11, 12, - 13, -1, -1, -1, 17, 18, 19, 20, 21, 22, - 23, 24, 25, -1, 27, 28, 29, -1, 31, -1, - -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, - -1, 44, 45, 46, 47, 48, -1, -1, 51, 52, - -1, 54, 55, -1, -1, -1, -1, -1, -1, 62, - 63, 64, -1, 66, -1, -1, -1, 70, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 91, 92, - -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 111, -1, - -1, 114, -1, -1, -1, -1, 119, 120, -1, -1, - -1, 124, -1, 126, -1, 128, -1, 130, -1, 3, - 4, 5, 135, 7, 8, 9, 10, 11, 12, 13, - -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, - 24, -1, -1, 27, 28, -1, -1, 39, -1, -1, - -1, 35, -1, 37, 38, -1, 40, -1, 42, -1, - 44, -1, 46, 47, 48, -1, -1, 51, 52, -1, - 54, 55, -1, -1, -1, -1, -1, -1, 62, 63, - 64, -1, -1, 75, 76, -1, 70, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 90, 91, - 92, 93, -1, 95, 96, 97, -1, 91, 92, -1, - -1, -1, -1, -1, -1, -1, -1, 101, -1, 111, - 112, -1, 114, 115, 116, 117, 118, 111, -1, -1, - 114, -1, 124, -1, 126, 119, 120, 129, -1, -1, - 124, -1, 126, -1, 128, -1, 130, -1, 3, 4, - 5, 135, 7, 8, 9, 10, 11, 12, 13, -1, - -1, -1, 17, 18, 19, 20, 21, 22, 23, 24, - -1, -1, 27, 28, -1, -1, -1, -1, -1, -1, - 35, -1, 37, 38, -1, 40, -1, 42, -1, 44, - -1, 46, 47, 48, -1, -1, 51, 52, -1, 54, - 55, -1, -1, -1, -1, -1, -1, 62, 63, 64, - -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 91, 92, -1, -1, - -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 111, -1, -1, 114, - -1, -1, -1, -1, 119, 120, -1, -1, -1, 124, - -1, 126, -1, 128, -1, 130, -1, 3, 4, 5, - 135, 7, 8, 9, 10, 11, 12, 13, -1, -1, - -1, 17, 18, 19, 20, 21, 22, 23, 24, -1, - -1, 27, 28, -1, -1, -1, -1, -1, -1, 35, - -1, 37, 38, -1, 40, -1, 42, -1, 44, -1, - 46, 47, 48, -1, -1, 51, 52, -1, 54, 55, - -1, -1, -1, -1, -1, -1, 62, 63, 64, -1, - -1, -1, -1, -1, 70, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 91, 92, -1, -1, -1, - -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 111, -1, -1, 114, -1, - -1, -1, -1, 119, 120, -1, -1, -1, 124, -1, - 126, -1, 128, -1, 130, -1, 3, 4, 5, 135, - 7, 8, 9, 10, 11, 12, 13, -1, -1, -1, - 17, 18, 19, 20, 21, 22, 23, 24, -1, -1, - 27, 28, -1, -1, -1, -1, -1, -1, 35, -1, - 37, 38, -1, 40, -1, 42, -1, 44, -1, 46, - 47, 48, -1, -1, 51, 52, -1, 54, 55, -1, - -1, -1, -1, -1, -1, 62, 63, 64, -1, -1, - -1, -1, -1, 70, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 91, 92, -1, -1, -1, -1, - -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 111, -1, -1, 114, -1, -1, - -1, -1, 119, 120, -1, -1, -1, 124, -1, 126, - -1, 128, -1, 130, -1, 3, 4, 5, 135, 7, - 8, 9, 10, 11, 12, 13, -1, -1, -1, 17, - 18, 19, 20, 21, 22, 23, 24, -1, -1, 27, - 28, -1, -1, -1, -1, -1, -1, 35, -1, 37, - 38, -1, 40, -1, 42, -1, 44, -1, 46, 47, - 48, -1, -1, 51, 52, -1, 54, 55, -1, -1, - -1, -1, -1, -1, 62, 63, 64, -1, -1, -1, - -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 91, 92, -1, -1, -1, -1, -1, - -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 111, -1, -1, 114, -1, -1, -1, - -1, 119, 120, -1, -1, -1, 124, -1, 126, -1, - 128, -1, 130, -1, 3, 4, 5, 135, 7, 8, - 9, 10, 11, 12, 13, -1, 15, -1, 17, 18, - 19, 20, 21, 22, 23, 24, 25, -1, 27, 28, - 29, -1, 31, -1, -1, -1, 35, 36, 37, 38, - -1, 40, 41, 42, -1, 44, 45, 46, 47, 48, - -1, -1, 51, 52, -1, 54, 55, -1, -1, -1, - -1, -1, -1, 62, 63, 64, -1, 66, -1, -1, - -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 91, 92, -1, -1, -1, -1, -1, -1, - -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 111, -1, -1, 114, -1, -1, -1, -1, - 119, 120, -1, -1, -1, 124, -1, 126, -1, 128, - -1, 130, 3, 4, 5, -1, 7, 8, 9, 10, - 11, 12, 13, -1, -1, -1, 17, 18, 19, 20, - 21, 22, 23, 24, 25, -1, 27, 28, 29, -1, - 31, -1, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, -1, 44, 45, 46, 47, 48, -1, -1, - 51, 52, -1, 54, 55, -1, -1, -1, -1, -1, - -1, 62, 63, 64, -1, 66, -1, -1, -1, 70, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 91, 92, 3, 4, 5, -1, 7, 8, 9, -1, - 101, -1, -1, -1, -1, -1, -1, 18, -1, -1, - 111, -1, 23, 114, 25, -1, 27, 28, 119, 120, - 31, -1, -1, 124, 35, 126, -1, 128, -1, 130, - -1, 42, -1, 44, 45, -1, -1, -1, -1, -1, - -1, 52, -1, 54, 55, 3, 4, 5, -1, 7, - 8, 9, 63, -1, -1, -1, -1, -1, -1, 70, - 18, -1, -1, -1, -1, 23, -1, 25, -1, 27, - 28, -1, -1, -1, -1, -1, -1, 35, -1, -1, - 91, 92, -1, -1, 42, -1, 44, -1, -1, -1, - -1, -1, -1, -1, 52, -1, 54, 55, -1, -1, - 111, -1, -1, 114, -1, 63, -1, -1, 119, 120, - -1, -1, 70, 124, -1, 126, -1, -1, -1, 130, - -1, -1, -1, -1, -1, -1, -1, 4, 5, -1, - 7, 8, 9, 91, 92, -1, -1, -1, -1, -1, - -1, 18, -1, -1, -1, -1, 23, -1, 25, -1, - 27, 28, -1, 111, -1, -1, 114, -1, 35, -1, - -1, 119, 120, -1, -1, 42, 124, 44, 126, -1, - -1, -1, 130, -1, -1, 52, -1, 54, 55, -1, - 4, 5, -1, 7, 8, 9, 63, -1, -1, -1, - -1, -1, -1, 70, 18, -1, -1, -1, -1, 23, - -1, 25, -1, 27, 28, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 91, 92, -1, -1, -1, -1, - 44, -1, -1, -1, -1, -1, -1, -1, 52, -1, - 54, 55, -1, -1, 111, -1, -1, 114, -1, -1, - -1, -1, 119, 120, -1, -1, 70, 124, -1, 126, - -1, -1, -1, 130, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 91, 92, -1, - -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 124, -1, 126, 67, 68, 69, 130, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - -1, 95, 96, 97, -1, -1, -1, -1, -1, -1, - 104, 105, -1, 107, 108, 109, 39, 111, 112, -1, - 114, 115, 116, 117, 118, -1, -1, -1, -1, -1, - 124, -1, 126, -1, -1, 129, -1, -1, -1, -1, - -1, -1, 136, -1, 67, 68, 69, -1, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, -1, 95, 96, 97, -1, -1, -1, -1, -1, - -1, 104, 105, -1, 107, 108, 109, 39, 111, 112, - -1, 114, 115, 116, 117, 118, -1, -1, -1, -1, - -1, 124, -1, 126, -1, -1, 129, -1, -1, -1, - -1, -1, -1, 136, -1, 67, 68, 69, -1, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, -1, 95, 96, 97, -1, -1, -1, -1, - 39, -1, 104, 105, 106, 107, 108, 109, -1, 111, - 112, -1, 114, 115, 116, 117, 118, -1, -1, -1, - -1, -1, 124, -1, 126, -1, -1, 129, 67, 68, - 69, -1, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, -1, 95, 96, 97, -1, - -1, -1, -1, 39, -1, 104, 105, -1, 107, 108, - 109, -1, 111, 112, -1, 114, 115, 116, 117, 118, - -1, -1, -1, -1, -1, 124, -1, 126, 127, -1, - 129, 67, 68, 69, -1, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, - 96, 97, -1, -1, -1, -1, 39, -1, 104, 105, - -1, 107, 108, 109, -1, 111, 112, -1, 114, 115, - 116, 117, 118, -1, -1, -1, -1, -1, 124, -1, - 126, 127, -1, 129, 67, 68, 69, -1, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, -1, 95, 96, 97, -1, -1, -1, -1, 39, - -1, 104, 105, -1, 107, 108, 109, -1, 111, 112, - -1, 114, 115, 116, 117, 118, -1, -1, -1, -1, - -1, 124, -1, 126, 127, -1, 129, 67, 68, 69, - -1, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, -1, 95, 96, 97, -1, -1, - -1, -1, 39, -1, 104, 105, -1, 107, 108, 109, - -1, 111, 112, -1, 114, 115, 116, 117, 118, -1, - -1, -1, -1, -1, 124, -1, 126, 127, -1, 129, - 67, 68, 69, -1, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, - 97, -1, -1, -1, -1, 39, -1, 104, 105, -1, - 107, 108, 109, -1, 111, 112, -1, 114, 115, 116, - 117, 118, -1, -1, -1, -1, -1, 124, -1, 126, - 127, -1, 129, 67, 68, 69, -1, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - -1, 95, 96, 97, -1, -1, -1, -1, 39, -1, - 104, 105, 106, 107, 108, 109, -1, 111, 112, -1, - 114, 115, 116, 117, 118, -1, -1, -1, -1, -1, - 124, -1, 126, -1, -1, 129, 67, 68, 69, -1, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, -1, 95, 96, 97, -1, -1, -1, - -1, 39, -1, 104, 105, -1, 107, 108, 109, -1, - 111, 112, -1, 114, 115, 116, 117, 118, -1, -1, - -1, -1, -1, 124, -1, 126, 127, -1, 129, 67, - 68, 69, -1, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, - -1, -1, -1, -1, 39, -1, 104, 105, -1, 107, - 108, 109, -1, 111, 112, -1, 114, 115, 116, 117, - 118, -1, -1, -1, -1, -1, 124, -1, 126, -1, - -1, 129, 67, 68, 69, -1, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, - 95, 96, 97, -1, -1, -1, -1, 39, -1, 104, - 105, -1, 107, 108, 109, -1, -1, 112, -1, 114, - 115, 116, 117, 118, -1, -1, -1, -1, -1, 124, - -1, 126, -1, -1, 129, 67, 68, 69, -1, 71, - 72, 73, 74, 75, 76, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 89, 90, 91, - 92, 93, -1, 95, 96, 97, -1, -1, -1, -1, - 39, -1, -1, -1, -1, 107, 108, 109, -1, 111, - 112, -1, 114, 115, 116, 117, 118, -1, -1, -1, - -1, -1, 124, -1, 126, -1, -1, 129, 67, 68, - 69, -1, 71, 72, 73, 74, 75, 76, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 90, 91, 92, 93, -1, 95, 96, 97, -1, - -1, -1, -1, 39, -1, -1, -1, -1, 107, 108, - 109, -1, 111, 112, -1, 114, 115, 116, 117, 118, - -1, -1, -1, -1, -1, 124, -1, 126, -1, -1, - 129, 67, 68, 69, -1, 71, 72, 73, 74, 75, - 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 90, 91, 92, 93, -1, 95, - 96, 97, -1, -1, -1, -1, 39, -1, -1, -1, - -1, -1, 108, 109, -1, 111, 112, -1, 114, 115, - 116, 117, 118, -1, -1, -1, -1, -1, 124, -1, - 126, -1, -1, 129, 67, 68, 69, -1, 71, 72, - 73, 74, 75, 76, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 90, 91, 92, - 93, -1, 95, 96, 97, -1, -1, -1, -1, 39, - -1, -1, -1, -1, -1, -1, 109, -1, 111, 112, - -1, 114, 115, 116, 117, 118, -1, -1, -1, -1, - -1, 124, -1, 126, -1, -1, 129, 67, 68, 69, - -1, 71, 72, 73, 74, 75, 76, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 90, 91, 92, 93, -1, 95, 96, 97, -1, -1, - -1, -1, 39, -1, -1, -1, -1, -1, -1, 109, - -1, 111, 112, -1, 114, 115, 116, 117, 118, -1, - -1, -1, -1, -1, 124, -1, 126, -1, -1, 129, - 67, 68, 69, -1, 71, 72, 73, 74, 75, 76, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 90, 91, 92, 93, -1, 95, 96, - 97, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 111, 112, -1, 114, 115, 116, - 117, 118, -1, -1, -1, -1, -1, 124, -1, 126, - -1, -1, 129 -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint16 yystos[] = -{ - 0, 3, 4, 5, 7, 8, 9, 10, 11, 12, - 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 27, 28, 35, 37, 38, 40, 42, 44, 46, - 47, 48, 51, 52, 54, 55, 62, 63, 64, 70, - 91, 92, 101, 111, 114, 119, 120, 124, 126, 128, - 130, 138, 139, 140, 141, 147, 150, 152, 160, 163, - 164, 165, 166, 167, 174, 182, 185, 186, 189, 192, - 193, 194, 195, 199, 201, 210, 215, 216, 217, 228, - 235, 238, 251, 252, 253, 258, 262, 266, 267, 268, - 270, 271, 272, 90, 49, 124, 124, 157, 158, 124, - 3, 15, 16, 28, 128, 187, 188, 15, 262, 3, - 237, 262, 124, 3, 188, 241, 262, 128, 124, 129, - 15, 262, 124, 3, 4, 7, 8, 9, 259, 260, - 261, 262, 262, 262, 262, 262, 257, 262, 247, 248, - 249, 255, 262, 29, 31, 36, 41, 45, 66, 101, - 135, 146, 147, 148, 152, 154, 168, 169, 184, 193, - 254, 3, 0, 141, 128, 3, 45, 154, 161, 162, - 258, 148, 149, 15, 25, 30, 31, 43, 45, 209, - 269, 3, 195, 3, 128, 222, 226, 102, 39, 67, - 68, 69, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 95, 96, 97, 104, 105, - 107, 108, 109, 111, 112, 114, 115, 116, 117, 118, - 124, 126, 129, 3, 3, 124, 256, 257, 11, 149, - 175, 191, 128, 129, 187, 188, 240, 241, 242, 250, - 124, 256, 129, 183, 247, 3, 104, 256, 135, 106, - 102, 102, 136, 127, 102, 255, 3, 3, 155, 156, - 256, 256, 155, 3, 135, 148, 128, 139, 3, 101, - 68, 101, 3, 34, 50, 234, 3, 3, 211, 262, - 3, 222, 227, 229, 230, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 3, 117, 130, 187, 264, 265, 262, 262, 262, 262, - 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, - 262, 247, 262, 124, 126, 130, 264, 265, 136, 124, - 262, 101, 126, 142, 143, 144, 150, 152, 199, 201, - 210, 235, 190, 187, 129, 124, 246, 3, 94, 231, - 232, 233, 136, 117, 187, 145, 146, 136, 262, 136, - 255, 260, 262, 106, 245, 102, 146, 135, 245, 256, - 256, 104, 3, 53, 196, 53, 197, 3, 212, 213, - 223, 104, 104, 112, 116, 218, 230, 126, 264, 265, - 90, 106, 136, 127, 263, 262, 126, 264, 265, 90, - 157, 256, 136, 151, 135, 144, 128, 142, 247, 104, - 106, 214, 233, 136, 102, 135, 157, 106, 35, 117, - 242, 244, 104, 153, 156, 135, 101, 136, 3, 4, - 124, 242, 14, 198, 242, 243, 128, 245, 102, 135, - 4, 222, 4, 222, 219, 224, 262, 90, 117, 265, - 262, 262, 127, 262, 90, 265, 136, 128, 262, 142, - 135, 136, 262, 244, 245, 94, 233, 26, 32, 176, - 178, 180, 181, 65, 159, 255, 262, 258, 157, 231, - 243, 128, 102, 202, 153, 213, 112, 4, 111, 112, - 128, 220, 225, 228, 127, 265, 136, 127, 265, 33, - 61, 170, 171, 172, 173, 127, 135, 214, 128, 233, - 128, 124, 176, 178, 157, 136, 136, 200, 242, 45, - 101, 193, 206, 207, 208, 116, 262, 111, 228, 224, - 262, 106, 135, 172, 173, 239, 179, 3, 157, 245, - 101, 126, 147, 152, 193, 203, 204, 205, 210, 235, - 3, 25, 135, 208, 226, 221, 116, 224, 106, 145, - 145, 145, 245, 128, 151, 128, 135, 205, 234, 219, - 135, 226, 145, 135, 135, 136, 236, 262, 203, 3, - 112, 219, 177, 145, 127, 135, 124, 112, 128, 135, - 231, 145, 136, 135, 245 -}; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif - -/* 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 (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -#else -static void -yy_stack_print (yybottom, yytop) - yytype_int16 *yybottom; - yytype_int16 *yytop; -#endif -{ - 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 (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} - -/* Prevent warnings from -Wmissing-prototypes. */ -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; - -/* Number of syntax errors so far. */ -int yynerrs; - - - -/*-------------------------. -| yyparse or yypush_parse. | -`-------------------------*/ - -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () - -#endif -#endif -{ - - - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - `yyss': related to states. - `yyvs': related to semantic values. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yytoken = 0; - yyss = yyssa; - yyvs = yyvsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - yyssp = yyss; - yyvsp = yyvs; - - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - - yystate = yyn; - *++yyvsp = yylval; - - 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 13: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 304 "parser.y" - {PASS_ALWAYS as3_pass=(yyvsp[(1) - (4)].number_int);} - } - break; - - - - case 24: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 316 "parser.y" - {PASS_ALWAYS as3_pass=(yyvsp[(1) - (4)].number_int);} - } - break; - - - - case 25: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 317 "parser.y" - {PASS_ALWAYS as3_pass=(yyvsp[(2) - (4)].number_int);PASS1 as3_warning("embed command ignored");} - } - break; - - - - case 27: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 320 "parser.y" - {(yyval.code)=(yyvsp[(1) - (1)].code);} - } - break; - - - - case 28: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 321 "parser.y" - {(yyval.code)=code_new();} - } - break; - - - - case 29: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 323 "parser.y" - { - (yyval.code)=code_append((yyvsp[(1) - (2)].code),(yyvsp[(2) - (2)].code)); -} - } - break; - - - - case 30: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 326 "parser.y" - {(yyval.code)=(yyvsp[(1) - (1)].code);} - } - break; - - - - case 44: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 342 "parser.y" - {(yyval.code)=(yyvsp[(2) - (3)].code);} - } - break; - - - - case 45: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 343 "parser.y" - {(yyval.code)=0;} - } - break; - - - - case 46: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 346 "parser.y" - {(yyval.code)=0;} - } - break; - - - - case 53: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 353 "parser.y" - { - PASS_ALWAYS - if(as3_pass) { - (yyval.code) = (yyvsp[(3) - (4)].code); - } else { - (yyval.code) = 0; - } - as3_pass=(yyvsp[(1) - (4)].number_int); -} - } - break; - - - - case 54: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 365 "parser.y" - {(yyval.code)=(yyvsp[(1) - (2)].code);} - } - break; - - - - case 55: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 366 "parser.y" - {(yyval.code)=(yyvsp[(1) - (1)].code);} - } - break; - - - - case 56: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 370 "parser.y" - { - if((yyvsp[(1) - (1)].code)) { - if(!global->init) - global->init = abc_initscript(global->file); - code_t**cc = &global->init->method->body->code; - *cc = code_append(*cc, (yyvsp[(1) - (1)].code)); - } -} - } - break; - - - - case 57: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 381 "parser.y" - { - PASS_ALWAYS - (yyval.number_int) = as3_pass; - as3_pass=0; -} - } - break; - - - - case 58: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 389 "parser.y" - { - PASS12 - (yyval.number_int)=as3_pass; - char*key = concat3((yyvsp[(1) - (3)].id),"::",(yyvsp[(3) - (3)].id)); - if(!definitions || !dict_contains(definitions, key)) { - as3_pass=0; - } - free(key); -} - } - break; - - - - case 59: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 416 "parser.y" - {(yyval.node)=(yyvsp[(2) - (2)].node);} - } - break; - - - - case 60: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 417 "parser.y" - {(yyval.node)=mkdummynode();} - } - break; - - - - case 61: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 419 "parser.y" - {(yyval.code)=(yyvsp[(2) - (2)].code);} - } - break; - - - - case 62: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 420 "parser.y" - {(yyval.code)=(yyvsp[(2) - (2)].code);} - } - break; - - - - case 63: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 422 "parser.y" - {(yyval.code) = (yyvsp[(1) - (1)].code);} - } - break; - - - - case 64: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 423 "parser.y" - {(yyval.code) = code_append((yyvsp[(1) - (3)].code), (yyvsp[(3) - (3)].code));} - } - break; - - - - case 65: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 426 "parser.y" - { -PASS12 - if(variable_exists((yyvsp[(1) - (3)].id))) - syntaxerror("Variable %s already defined", (yyvsp[(1) - (3)].id)); -PASS1 - new_variable(state->method, (yyvsp[(1) - (3)].id), (yyvsp[(2) - (3)].classinfo), 1, 0); -PASS2 - - char slot = 0; - int index = 0; - variable_t*v = 0; - if(state->method->uses_slots) { - v = find_slot(state->method, (yyvsp[(1) - (3)].id)); - if(v && !v->init) { - // this variable is stored in a slot - v->init = 1; - v->type = (yyvsp[(2) - (3)].classinfo); - slot = 1; - } - } - if(!v) { - v = new_variable2(state->method, (yyvsp[(1) - (3)].id), (yyvsp[(2) - (3)].classinfo), 1, 0); - } - - (yyval.code) = slot?abc_getscopeobject(0, 1):0; - - typedcode_t val = node_read((yyvsp[(3) - (3)].node)); - if(!is_subtype_of(val.t, (yyvsp[(2) - (3)].classinfo))) { - syntaxerror("Can't convert %s to %s", val.t->name, (yyvsp[(2) - (3)].classinfo)->name); - } - if((yyvsp[(2) - (3)].classinfo)) { - if(val.c->prev || val.c->opcode != OPCODE_PUSHUNDEFINED) { - (yyval.code) = code_append((yyval.code), val.c); - (yyval.code) = converttype((yyval.code), val.t, (yyvsp[(2) - (3)].classinfo)); - } else { - code_free(val.c); - (yyval.code) = defaultvalue((yyval.code), (yyvsp[(2) - (3)].classinfo)); - } - } else { - if(val.c->prev || val.c->opcode != OPCODE_PUSHUNDEFINED) { - (yyval.code) = code_append((yyval.code), val.c); - (yyval.code) = abc_coerce_a((yyval.code)); - } else { - // don't do anything - code_free(val.c); - code_free((yyval.code)); - (yyval.code) = 0; - break; - } - } - if(slot) { - (yyval.code) = abc_setslot((yyval.code), v->index); - } else { - (yyval.code) = abc_setlocal((yyval.code), v->index); - v->init = do_init_variable((yyvsp[(1) - (3)].id)); - } -} - } - break; - - - - case 66: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 486 "parser.y" - {PASS12 new_state();} - } - break; - - - - case 67: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 486 "parser.y" - { - (yyval.code) = var_block((yyvsp[(2) - (2)].code), state->vars); - PASS12 old_state(); -} - } - break; - - - - case 68: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 490 "parser.y" - {(yyval.code) = code_new();} - } - break; - - - - case 69: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 491 "parser.y" - {(yyval.code)=(yyvsp[(2) - (2)].code);} - } - break; - - - - case 70: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 494 "parser.y" - { - (yyval.code) = code_new(); - (yyval.code) = code_append((yyval.code), (yyvsp[(3) - (6)].value).c); - code_t*myjmp,*myif = (yyval.code) = abc_iffalse((yyval.code), 0); - - (yyval.code) = code_append((yyval.code), (yyvsp[(5) - (6)].code)); - if((yyvsp[(6) - (6)].code)) { - myjmp = (yyval.code) = abc_jump((yyval.code), 0); - } - myif->branch = (yyval.code) = abc_nop((yyval.code)); - if((yyvsp[(6) - (6)].code)) { - (yyval.code) = code_append((yyval.code), (yyvsp[(6) - (6)].code)); - myjmp->branch = (yyval.code) = abc_nop((yyval.code)); - } -} - } - break; - - - - case 71: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 510 "parser.y" - {(yyval.code)=code_new();} - } - break; - - - - case 74: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 517 "parser.y" - { - PASS1 (yyval.id)=(yyvsp[(2) - (3)].id);new_variable(state->method, (yyvsp[(2) - (3)].id),(yyvsp[(3) - (3)].classinfo),1,0); - PASS2 (yyval.id)=(yyvsp[(2) - (3)].id);new_variable(state->method, (yyvsp[(2) - (3)].id),(yyvsp[(3) - (3)].classinfo),1,0); -} - } - break; - - - - case 75: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 521 "parser.y" - { - PASS12 - (yyval.id)=(yyvsp[(1) - (1)].id); -} - } - break; - - - - case 76: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 526 "parser.y" - {PASS12 new_state();(yyval.for_start).name=(yyvsp[(1) - (2)].id);(yyval.for_start).each=0;} - } - break; - - - - case 77: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 527 "parser.y" - {PASS12 new_state();(yyval.for_start).name=(yyvsp[(1) - (3)].id);(yyval.for_start).each=1;} - } - break; - - - - case 78: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 529 "parser.y" - { - if((yyvsp[(1) - (8)].for_start).each) syntaxerror("invalid syntax: ; not allowed in for each statement"); - (yyval.code) = code_new(); - (yyval.code) = code_append((yyval.code), (yyvsp[(2) - (8)].code)); - code_t*loopstart = (yyval.code) = abc_label((yyval.code)); - (yyval.code) = code_append((yyval.code), (yyvsp[(4) - (8)].value).c); - code_t*myif = (yyval.code) = abc_iffalse((yyval.code), 0); - (yyval.code) = code_append((yyval.code), (yyvsp[(8) - (8)].code)); - code_t*cont = (yyval.code) = abc_nop((yyval.code)); - (yyval.code) = code_append((yyval.code), (yyvsp[(6) - (8)].code)); - (yyval.code) = abc_jump((yyval.code), loopstart); - code_t*out = (yyval.code) = abc_nop((yyval.code)); - breakjumpsto((yyval.code), (yyvsp[(1) - (8)].for_start).name, out); - continuejumpsto((yyval.code), (yyvsp[(1) - (8)].for_start).name, cont); - myif->branch = out; - - (yyval.code) = var_block((yyval.code), state->vars); - PASS12 old_state(); -} - } - break; - - - - case 79: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 549 "parser.y" - { - node_t*n = resolve_identifier((yyvsp[(2) - (6)].id)); - typedcode_t w = node_write(n); - - int it = alloc_local(); - int array = alloc_local(); - - (yyval.code) = code_new(); - (yyval.code) = code_append((yyval.code), (yyvsp[(4) - (6)].value).c); - (yyval.code) = abc_coerce_a((yyval.code)); - (yyval.code) = abc_setlocal((yyval.code), array); - (yyval.code) = abc_pushbyte((yyval.code), 0); - (yyval.code) = abc_setlocal((yyval.code), it); - - code_t*loopstart = (yyval.code) = abc_label((yyval.code)); - - (yyval.code) = abc_hasnext2((yyval.code), array, it); - code_t*myif = (yyval.code) = abc_iffalse((yyval.code), 0); - (yyval.code) = abc_getlocal((yyval.code), array); - (yyval.code) = abc_getlocal((yyval.code), it); - if(!(yyvsp[(1) - (6)].for_start).each) - (yyval.code) = abc_nextname((yyval.code)); - else - (yyval.code) = abc_nextvalue((yyval.code)); - - (yyval.code) = converttype((yyval.code), 0, w.t); - (yyval.code) = code_append((yyval.code), w.c); - - (yyval.code) = code_append((yyval.code), (yyvsp[(6) - (6)].code)); - (yyval.code) = abc_jump((yyval.code), loopstart); - - code_t*out = (yyval.code) = abc_nop((yyval.code)); - breakjumpsto((yyval.code), (yyvsp[(1) - (6)].for_start).name, out); - continuejumpsto((yyval.code), (yyvsp[(1) - (6)].for_start).name, loopstart); - - myif->branch = out; - - (yyval.code) = abc_kill((yyval.code), it); - (yyval.code) = abc_kill((yyval.code), array); - - (yyval.code) = var_block((yyval.code), state->vars); - PASS12 old_state(); -} - } - break; - - - - case 80: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 593 "parser.y" - { - - (yyval.code) = code_new(); - - code_t*myjmp = (yyval.code) = abc_jump((yyval.code), 0); - code_t*loopstart = (yyval.code) = abc_label((yyval.code)); - (yyval.code) = code_append((yyval.code), (yyvsp[(5) - (5)].code)); - code_t*cont = (yyval.code) = abc_nop((yyval.code)); - myjmp->branch = cont; - (yyval.code) = code_append((yyval.code), (yyvsp[(3) - (5)].value).c); - (yyval.code) = abc_iftrue((yyval.code), loopstart); - code_t*out = (yyval.code) = abc_nop((yyval.code)); - breakjumpsto((yyval.code), (yyvsp[(1) - (5)].id), out); - continuejumpsto((yyval.code), (yyvsp[(1) - (5)].id), cont); -} - } - break; - - - - case 81: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 609 "parser.y" - { - (yyval.code) = code_new(); - code_t*loopstart = (yyval.code) = abc_label((yyval.code)); - (yyval.code) = code_append((yyval.code), (yyvsp[(2) - (6)].code)); - code_t*cont = (yyval.code) = abc_nop((yyval.code)); - (yyval.code) = code_append((yyval.code), (yyvsp[(5) - (6)].value).c); - (yyval.code) = abc_iftrue((yyval.code), loopstart); - code_t*out = (yyval.code) = abc_nop((yyval.code)); - breakjumpsto((yyval.code), (yyvsp[(1) - (6)].id), out); - continuejumpsto((yyval.code), (yyvsp[(1) - (6)].id), cont); -} - } - break; - - - - case 82: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 621 "parser.y" - { - (yyval.code) = abc___break__(0, ""); -} - } - break; - - - - case 83: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 624 "parser.y" - { - (yyval.code) = abc___break__(0, (yyvsp[(2) - (2)].id)); -} - } - break; - - - - case 84: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 627 "parser.y" - { - (yyval.code) = abc___continue__(0, ""); -} - } - break; - - - - case 85: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 630 "parser.y" - { - (yyval.code) = abc___continue__(0, (yyvsp[(2) - (2)].id)); -} - } - break; - - - - case 86: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 634 "parser.y" - {(yyval.code)=0;} - } - break; - - - - case 87: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 635 "parser.y" - {(yyval.code)=(yyvsp[(1) - (1)].code);} - } - break; - - - - case 88: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 636 "parser.y" - {(yyval.code)=(yyvsp[(1) - (1)].code);} - } - break; - - - - case 89: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 637 "parser.y" - {(yyval.code)=code_append((yyvsp[(1) - (2)].code),(yyvsp[(2) - (2)].code));} - } - break; - - - - case 90: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 638 "parser.y" - {(yyval.code)=(yyvsp[(1) - (1)].code);} - } - break; - - - - case 91: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 639 "parser.y" - {(yyval.code)=code_append((yyval.code),(yyvsp[(2) - (2)].code));} - } - break; - - - - case 92: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 641 "parser.y" - { - (yyval.code) = abc_getlocal(0, state->switch_var); - (yyval.code) = code_append((yyval.code), node_read((yyvsp[(2) - (4)].node)).c); - code_t*j = (yyval.code) = abc_ifne((yyval.code), 0); - (yyval.code) = code_append((yyval.code), (yyvsp[(4) - (4)].code)); - if((yyval.code)->opcode != OPCODE___BREAK__) { - (yyval.code) = abc___fallthrough__((yyval.code), ""); - } - code_t*e = (yyval.code) = abc_nop((yyval.code)); - j->branch = e; -} - } - break; - - - - case 93: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 652 "parser.y" - { - (yyval.code) = (yyvsp[(3) - (3)].code); -} - } - break; - - - - case 94: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 655 "parser.y" - {PASS12 new_state();state->switch_var=alloc_local();} - } - break; - - - - case 95: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 655 "parser.y" - { - (yyval.code) = node_read((yyvsp[(4) - (8)].node)).c; - (yyval.code) = abc_setlocal((yyval.code), state->switch_var); - (yyval.code) = code_append((yyval.code), (yyvsp[(7) - (8)].code)); - - code_t*out = (yyval.code) = abc_kill((yyval.code), state->switch_var); - breakjumpsto((yyval.code), (yyvsp[(1) - (8)].id), out); - - code_t*c = (yyval.code),*lastblock=0; - while(c) { - if(c->opcode == OPCODE_IFNE) { - if(!c->next) syntaxerror("internal error in fallthrough handling"); - lastblock=c->next; - } else if(c->opcode == OPCODE___FALLTHROUGH__) { - if(lastblock) { - c->opcode = OPCODE_JUMP; - c->branch = lastblock; - } else { - /* fall through end of switch */ - c->opcode = OPCODE_NOP; - } - } - c=c->prev; - } - - (yyval.code) = var_block((yyval.code), state->vars); - PASS12 old_state(); -} - } - break; - - - - case 96: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 686 "parser.y" - {PASS12 new_state(); - state->exception_name=(yyvsp[(3) - (5)].id); - PASS1 new_variable(state->method, (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].classinfo), 0, 0); - PASS2 new_variable(state->method, (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].classinfo), 0, 0); - } - } - break; - - - - case 97: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 691 "parser.y" - { - namespace_t name_ns = {ACCESS_PACKAGE, ""}; - multiname_t name = {QNAME, &name_ns, 0, (yyvsp[(3) - (9)].id)}; - - NEW(abc_exception_t, e) - e->exc_type = sig2mname((yyvsp[(4) - (9)].classinfo)); - e->var_name = multiname_clone(&name); - (yyval.exception) = e; - - code_t*c = 0; - int i = find_variable_safe(state, (yyvsp[(3) - (9)].id))->index; - e->target = c = abc_nop(0); - c = abc_setlocal(c, i); - c = code_append(c, code_dup(state->method->scope_code)); - c = code_append(c, (yyvsp[(8) - (9)].code)); - c = abc_kill(c, i); - - c = var_block(c, state->vars); - PASS12 old_state(); -} - } - break; - - - - case 98: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 711 "parser.y" - {PASS12 new_state();state->exception_name=0;} - } - break; - - - - case 99: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 711 "parser.y" - { - (yyvsp[(4) - (5)].code) = var_block((yyvsp[(4) - (5)].code), state->vars); - if(!(yyvsp[(4) - (5)].code)) { - (yyval.exception)=0; - } else { - NEW(abc_exception_t, e) - e->exc_type = 0; //all exceptions - e->var_name = 0; //no name - e->target = 0; - e->to = abc_nop(0); - e->to = code_append(e->to, (yyvsp[(4) - (5)].code)); - (yyval.exception) = e; - } - PASS12 old_state(); -} - } - break; - - - - case 100: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 727 "parser.y" - {(yyval.catch_list).l=list_new();(yyval.catch_list).finally=0;list_append((yyval.catch_list).l,(yyvsp[(1) - (1)].exception));} - } - break; - - - - case 101: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 728 "parser.y" - {(yyval.catch_list)=(yyvsp[(1) - (2)].catch_list);list_append((yyval.catch_list).l,(yyvsp[(2) - (2)].exception));} - } - break; - - - - case 102: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 729 "parser.y" - {(yyval.catch_list)=(yyvsp[(1) - (1)].catch_list);} - } - break; - - - - case 103: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 730 "parser.y" - { - (yyval.catch_list) = (yyvsp[(1) - (2)].catch_list); - (yyval.catch_list).finally = 0; - if((yyvsp[(2) - (2)].exception)) { - list_append((yyval.catch_list).l,(yyvsp[(2) - (2)].exception)); - (yyval.catch_list).finally = (yyvsp[(2) - (2)].exception)->to;(yyvsp[(2) - (2)].exception)->to=0; - } -} - } - break; - - - - case 104: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 738 "parser.y" - { - (yyval.catch_list).l=list_new(); - (yyval.catch_list).finally = 0; - if((yyvsp[(1) - (1)].exception)) { - list_append((yyval.catch_list).l,(yyvsp[(1) - (1)].exception)); - (yyval.catch_list).finally = (yyvsp[(1) - (1)].exception)->to;(yyvsp[(1) - (1)].exception)->to=0; - } -} - } - break; - - - - case 105: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 747 "parser.y" - {PASS12 new_state(); - state->method->has_exceptions=1; - state->method->late_binding=1;//for invariant scope_code - } - } - break; - - - - case 106: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 750 "parser.y" - { - code_t*out = abc_nop(0); - - code_t*start = abc_nop(0); - (yyval.code) = code_append(start, (yyvsp[(4) - (6)].code)); - if(!is_break_or_jump((yyvsp[(4) - (6)].code))) { - (yyval.code) = abc_jump((yyval.code), out); - } - code_t*end = (yyval.code) = abc_nop((yyval.code)); - - int tmp; - if((yyvsp[(6) - (6)].catch_list).finally) - tmp = alloc_local(); - - abc_exception_list_t*l = (yyvsp[(6) - (6)].catch_list).l; - int count=0; - while(l) { - abc_exception_t*e = l->abc_exception; - if(e->var_name) { - (yyval.code) = code_append((yyval.code), e->target); - (yyval.code) = abc_jump((yyval.code), out); - } else { - as3_assert((ptroff_t)(yyvsp[(6) - (6)].catch_list).finally); - // finally block - e->target = (yyval.code) = abc_nop((yyval.code)); - (yyval.code) = code_append((yyval.code), code_dup(state->method->scope_code)); - (yyval.code) = abc___rethrow__((yyval.code)); - } - - e->from = start; - e->to = end; - - l = l->next; - } - (yyval.code) = code_append((yyval.code), out); - - (yyval.code) = insert_finally((yyval.code), (yyvsp[(6) - (6)].catch_list).finally, tmp); - - list_concat(state->method->exceptions, (yyvsp[(6) - (6)].catch_list).l); - - (yyval.code) = var_block((yyval.code), state->vars); - PASS12 old_state(); -} - } - break; - - - - case 107: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 796 "parser.y" - { - (yyval.code)=(yyvsp[(2) - (2)].value).c; - (yyval.code)=abc_throw((yyval.code)); -} - } - break; - - - - case 108: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 801 "parser.y" - { - if(!state->exception_name) - syntaxerror("re-throw only possible within a catch block"); - variable_t*v = find_variable(state, state->exception_name); - (yyval.code)=code_new(); - (yyval.code)=abc_getlocal((yyval.code), v->index); - (yyval.code)=abc_throw((yyval.code)); -} - } - break; - - - - case 109: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 812 "parser.y" - { - new_state(); - if(state->method->has_exceptions) { - int v = alloc_local(); - state->method->scope_code = abc_getlocal(state->method->scope_code, v); - state->method->scope_code = abc_pushwith(state->method->scope_code); - (yyval.value_list).number = v; - } - (yyval.value_list).cc = (yyvsp[(3) - (4)].value).c; -} - } - break; - - - - case 110: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 822 "parser.y" - { - /* remove getlocal;pushwith from scope code again */ - state->method->scope_code = code_cutlast(code_cutlast(state->method->scope_code)); - - (yyval.code) = (yyvsp[(1) - (2)].value_list).cc; - if(state->method->has_exceptions) { - (yyval.code) = abc_dup((yyval.code)); - (yyval.code) = abc_setlocal((yyval.code), (yyvsp[(1) - (2)].value_list).number); - } - (yyval.code) = abc_pushwith((yyval.code)); - (yyval.code) = code_append((yyval.code), (yyvsp[(2) - (2)].code)); - (yyval.code) = abc_popscope((yyval.code)); - old_state(); -} - } - break; - - - - case 112: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 840 "parser.y" - {PASS12 (yyval.id)="package";} - } - break; - - - - case 113: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 841 "parser.y" - {PASS12 (yyval.id)="namespace";} - } - break; - - - - case 114: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 842 "parser.y" - {PASS12 (yyval.id)="NaN";} - } - break; - - - - case 115: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 844 "parser.y" - {PASS12 (yyval.id) = concat3((yyvsp[(1) - (3)].id),".",(yyvsp[(3) - (3)].id));free((yyvsp[(1) - (3)].id));(yyvsp[(1) - (3)].id)=0;} - } - break; - - - - case 116: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 845 "parser.y" - {PASS12 (yyval.id)=strdup((yyvsp[(1) - (1)].id));} - } - break; - - - - case 117: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 847 "parser.y" - {PASS12 startpackage((yyvsp[(2) - (3)].id));free((yyvsp[(2) - (3)].id));(yyvsp[(2) - (3)].id)=0;} - } - break; - - - - case 118: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 848 "parser.y" - {PASS12 endpackage();(yyval.code)=0;} - } - break; - - - - case 119: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 849 "parser.y" - {PASS12 startpackage("");} - } - break; - - - - case 120: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 850 "parser.y" - {PASS12 endpackage();(yyval.code)=0;} - } - break; - - - - case 121: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 873 "parser.y" - { - PASS12 - slotinfo_t*s = registry_find(state->package, (yyvsp[(2) - (2)].id)); - if(!s && as3_pass==1) {as3_schedule_class(state->package, (yyvsp[(2) - (2)].id));} - state_has_imports(); - dict_put(state->imports, state->package, (yyvsp[(2) - (2)].id)); - (yyval.code)=0; -} - } - break; - - - - case 122: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 881 "parser.y" - { - PASS12 - slotinfo_t*s = registry_find((yyvsp[(2) - (2)].classinfo)->package, (yyvsp[(2) - (2)].classinfo)->name); - if(!s && as3_pass==1) { - as3_schedule_class((yyvsp[(2) - (2)].classinfo)->package, (yyvsp[(2) - (2)].classinfo)->name); - } - /*if(s && s->kind == INFOTYPE_VAR && TYPE_IS_NAMESPACE(s->type)) { - trie_put(active_namespaces, (unsigned char*)$2->name, 0); - }*/ - state_has_imports(); - dict_put(state->imports, (yyvsp[(2) - (2)].classinfo)->name, (yyvsp[(2) - (2)].classinfo)); - import_toplevel((yyvsp[(2) - (2)].classinfo)->package); - (yyval.code)=0; -} - } - break; - - - - case 123: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 895 "parser.y" - { - PASS12 - if(strncmp("flash.", (yyvsp[(2) - (4)].id), 6) && as3_pass==1) { - as3_schedule_package((yyvsp[(2) - (4)].id)); - } - - NEW(import_t,i); - i->package = (yyvsp[(2) - (4)].id); - state_has_imports(); - list_append(state->wildcard_imports, i); - import_toplevel(i->package); - (yyval.code)=0; -} - } - break; - - - - case 124: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 911 "parser.y" - {PASS12 (yyval.flags).flags=0;(yyval.flags).ns=0;} - } - break; - - - - case 125: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 912 "parser.y" - {PASS12 (yyval.flags)=(yyvsp[(1) - (1)].flags);} - } - break; - - - - case 126: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 913 "parser.y" - {PASS12 (yyval.flags)=(yyvsp[(1) - (1)].flags);} - } - break; - - - - case 127: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 914 "parser.y" - { - PASS12 - (yyval.flags).flags=(yyvsp[(1) - (2)].flags).flags|(yyvsp[(2) - (2)].flags).flags; - if((yyvsp[(1) - (2)].flags).ns && (yyvsp[(2) - (2)].flags).ns) syntaxerror("only one namespace allowed in one declaration"); - (yyval.flags).ns=(yyvsp[(1) - (2)].flags).ns?(yyvsp[(1) - (2)].flags).ns:(yyvsp[(2) - (2)].flags).ns; - -} - } - break; - - - - case 128: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 921 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_PUBLIC;(yyval.flags).ns=0;} - } - break; - - - - case 129: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 922 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_PRIVATE;(yyval.flags).ns=0;} - } - break; - - - - case 130: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 923 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_PROTECTED;(yyval.flags).ns=0;} - } - break; - - - - case 131: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 924 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_STATIC;(yyval.flags).ns=0;} - } - break; - - - - case 132: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 925 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_DYNAMIC;(yyval.flags).ns=0;} - } - break; - - - - case 133: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 926 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_FINAL;(yyval.flags).ns=0;} - } - break; - - - - case 134: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 927 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_OVERRIDE;(yyval.flags).ns=0;} - } - break; - - - - case 135: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 928 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_NATIVE;(yyval.flags).ns=0;} - } - break; - - - - case 136: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 929 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_PACKAGEINTERNAL;(yyval.flags).ns=0;} - } - break; - - - - case 137: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 930 "parser.y" - {PASS12 (yyval.flags).flags=FLAG_NAMESPACE; - (yyval.flags).ns=(yyvsp[(1) - (1)].id); - } - } - break; - - - - case 138: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 934 "parser.y" - {PASS12 (yyval.classinfo)=0;} - } - break; - - - - case 139: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 935 "parser.y" - {PASS12 (yyval.classinfo)=(yyvsp[(2) - (2)].classinfo);} - } - break; - - - - case 140: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 937 "parser.y" - {PASS12 (yyval.classinfo_list)=list_new();} - } - break; - - - - case 141: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 938 "parser.y" - {PASS12 (yyval.classinfo_list)=(yyvsp[(2) - (2)].classinfo_list);} - } - break; - - - - case 142: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 940 "parser.y" - {PASS12 (yyval.classinfo_list)=list_new();} - } - break; - - - - case 143: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 941 "parser.y" - {PASS12 (yyval.classinfo_list)=(yyvsp[(2) - (2)].classinfo_list);} - } - break; - - - - case 144: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 945 "parser.y" - {PASS12 startclass(&(yyvsp[(1) - (6)].flags),(yyvsp[(3) - (6)].id),(yyvsp[(4) - (6)].classinfo),(yyvsp[(5) - (6)].classinfo_list));} - } - break; - - - - case 145: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 947 "parser.y" - {PASS12 endclass();(yyval.code)=0;} - } - break; - - - - case 146: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 951 "parser.y" - {PASS12 (yyvsp[(1) - (5)].flags).flags|=FLAG_INTERFACE; - startclass(&(yyvsp[(1) - (5)].flags),(yyvsp[(3) - (5)].id),0,(yyvsp[(4) - (5)].classinfo_list));} - } - break; - - - - case 147: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 954 "parser.y" - {PASS12 endclass();(yyval.code)=0;} - } - break; - - - - case 153: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 963 "parser.y" - {PASS_ALWAYS as3_pass=(yyvsp[(1) - (4)].number_int);} - } - break; - - - - case 156: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 966 "parser.y" - {PASS_ALWAYS as3_pass=(yyvsp[(2) - (4)].number_int);PASS1 as3_warning("embed command ignored");} - } - break; - - - - case 157: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 968 "parser.y" - { - code_t*c = state->cls->static_init->header; - c = code_append(c, (yyvsp[(1) - (1)].code)); - state->cls->static_init->header = c; -} - } - break; - - - - case 163: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 979 "parser.y" - { - syntaxerror("variable declarations not allowed in interfaces"); -} - } - break; - - - - case 164: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 982 "parser.y" - { - PASS12 - (yyvsp[(1) - (8)].flags).flags |= FLAG_PUBLIC; - if((yyvsp[(1) - (8)].flags).flags&(FLAG_PRIVATE|FLAG_PACKAGEINTERNAL|FLAG_PROTECTED)) { - syntaxerror("invalid method modifiers: interface methods always need to be public"); - } - startfunction(&(yyvsp[(1) - (8)].flags),(yyvsp[(3) - (8)].token),(yyvsp[(4) - (8)].id),&(yyvsp[(6) - (8)].params),(yyvsp[(8) - (8)].classinfo)); - endfunction(&(yyvsp[(1) - (8)].flags),(yyvsp[(3) - (8)].token),(yyvsp[(4) - (8)].id),&(yyvsp[(6) - (8)].params),(yyvsp[(8) - (8)].classinfo), 0); - list_deep_free((yyvsp[(6) - (8)].params).list); -} - } - break; - - - - case 167: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1057 "parser.y" - {PASS12 setslotstate(&(yyvsp[(1) - (2)].flags),(yyvsp[(2) - (2)].token));} - } - break; - - - - case 168: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1057 "parser.y" - {PASS12 (yyval.code)=(yyvsp[(4) - (4)].code);setslotstate(0, 0);} - } - break; - - - - case 169: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1059 "parser.y" - {PASS12 (yyval.code)=0;} - } - break; - - - - case 170: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1060 "parser.y" - {PASS12 (yyval.code)=0;} - } - break; - - - - case 171: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1063 "parser.y" - { -PASS12 - int flags = slotstate_flags->flags; - namespace_t ns = modifiers2access(slotstate_flags); - - if(as3_pass == 1) { - - varinfo_t* info = 0; - if(state->cls) { - memberinfo_t*i = registry_findmember(state->cls->info, ns.name, (yyvsp[(1) - (3)].id), 1, slotstate_flags->flags&FLAG_STATIC); - if(i) { - check_override(i, flags); - } - info = varinfo_register_onclass(state->cls->info, ns.access, ns.name, (yyvsp[(1) - (3)].id), slotstate_flags->flags&FLAG_STATIC); - } else { - slotinfo_t*i = registry_find(state->package, (yyvsp[(1) - (3)].id)); - if(i) { - syntaxerror("package %s already contains '%s'", state->package, (yyvsp[(1) - (3)].id)); - } - if(ns.name && ns.name[0]) { - syntaxerror("namespaces not allowed on package-level variables"); - } - info = varinfo_register_global(ns.access, state->package, (yyvsp[(1) - (3)].id)); - } - - info->type = (yyvsp[(2) - (3)].classinfo); - info->flags = flags; - - dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, info); - } - - if(as3_pass == 2) { - varinfo_t*info = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); - - multiname_t mname; - code_t**code; - trait_t*t = add_abc_slot(slotstate_flags, (yyvsp[(1) - (3)].id), &mname, &code); - - if((yyvsp[(2) - (3)].classinfo)) { - MULTINAME(m, (yyvsp[(2) - (3)].classinfo)); - t->type_name = multiname_clone(&m); - } - info->slot = t->slot_id; - - /* workaround for "VerifyError: Error #1053: Illegal override of ::test2 in C1" - FIXME: is there a way to use slots and still don't have conflicting overrides? - */ - info->slot = t->slot_id = 0; - - constant_t cval = (yyvsp[(3) - (3)].node)->type->eval((yyvsp[(3) - (3)].node)); - if(cval.type!=CONSTANT_UNKNOWN) { - /* compile time constant */ - t->value = malloc(sizeof(constant_t)); - memcpy(t->value, &cval, sizeof(constant_t)); - info->value = constant_clone(t->value); - } else { - typedcode_t v = node_read((yyvsp[(3) - (3)].node)); - /* initalization code (if needed) */ - code_t*c = 0; - if(v.c && !is_pushundefined(v.c)) { - c = abc_getlocal_0(c); - c = code_append(c, v.c); - c = converttype(c, v.t, (yyvsp[(2) - (3)].classinfo)); - if(!t->slot_id) { - c = abc_initproperty2(c, &mname); - } else { - c = abc_setslot(c, t->slot_id); - } - } - *code = code_append(*code, c); - } - - if(slotstate_varconst==KW_CONST) { - t->kind= TRAIT_CONST; - info->flags |= FLAG_CONST; - } - } - - (yyval.code)=0; -} - } - break; - - - - case 172: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1146 "parser.y" - {(yyval.constant)=0;} - } - break; - - - - case 173: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1147 "parser.y" - { - (yyval.constant) = malloc(sizeof(constant_t)); - *(yyval.constant) = node_eval((yyvsp[(2) - (2)].node)); - if((yyval.constant)->type == CONSTANT_UNKNOWN) { - syntaxerror("can't evaluate default parameter value (needs to be a compile-time constant)"); - } -} - } - break; - - - - case 174: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1155 "parser.y" - {(yyval.constant) = constant_new_int((yyvsp[(1) - (1)].number_int));} - } - break; - - - - case 175: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1156 "parser.y" - { - (yyval.constant) = constant_new_uint((yyvsp[(1) - (1)].number_uint)); -} - } - break; - - - - case 176: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1159 "parser.y" - {(yyval.constant) = constant_new_float((yyvsp[(1) - (1)].number_float));} - } - break; - - - - case 177: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1160 "parser.y" - {(yyval.constant) = constant_new_string2((yyvsp[(1) - (1)].str).str,(yyvsp[(1) - (1)].str).len);free((char*)(yyvsp[(1) - (1)].str).str);} - } - break; - - - - case 178: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1161 "parser.y" - {(yyval.constant) = constant_new_true((yyvsp[(1) - (1)].token));} - } - break; - - - - case 179: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1162 "parser.y" - {(yyval.constant) = constant_new_false((yyvsp[(1) - (1)].token));} - } - break; - - - - case 180: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1163 "parser.y" - {(yyval.constant) = constant_new_null((yyvsp[(1) - (1)].token));} - } - break; - - - - case 181: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1164 "parser.y" - {(yyval.constant) = constant_new_undefined((yyvsp[(1) - (1)].token));} - } - break; - - - - case 182: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1165 "parser.y" - {(yyval.constant) = constant_new_float(__builtin_nan(""));} - } - break; - - - - case 183: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1173 "parser.y" - { - multiname_t m = {QNAME, &stdns, 0, "XML"}; - typedcode_t v; - v.c = 0; - v.c = abc_getlex2(v.c, &m); - v.c = code_append(v.c, node_read((yyvsp[(1) - (1)].node)).c); - v.c = abc_construct(v.c, 1); - v.t = TYPE_XML; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 184: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1184 "parser.y" - {PASS_ALWAYS if(!xml_level++) tokenizer_begin_xml();} - } - break; - - - - case 185: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1185 "parser.y" - {PASS_ALWAYS tokenizer_begin_xmltext();} - } - break; - - - - case 186: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1186 "parser.y" - {PASS_ALWAYS if(!--xml_level) tokenizer_end_xml(); else tokenizer_begin_xmltext();} - } - break; - - - - case 187: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1188 "parser.y" - {PASS_ALWAYS tokenizer_begin_xmltext();} - } - break; - - - - case 188: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1188 "parser.y" - { - (yyval.node) = (yyvsp[(2) - (4)].node); -} - } - break; - - - - case 189: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1191 "parser.y" - {PASS_ALWAYS tokenizer_begin_xml();} - } - break; - - - - case 190: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1191 "parser.y" - { - (yyval.node) = (yyvsp[(2) - (4)].node); -} - } - break; - - - - case 191: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1194 "parser.y" - {(yyval.node)=mkstringnode("");} - } - break; - - - - case 192: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1195 "parser.y" - { - (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node),(yyvsp[(2) - (2)].node)); -} - } - break; - - - - case 193: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1198 "parser.y" - { - char* str = string_cstr(&(yyvsp[(2) - (2)].str)); - (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node),mkstringnode(str)); - free(str); -} - } - break; - - - - case 194: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1203 "parser.y" - { - (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node), mkstringnode(">")); -} - } - break; - - - - case 195: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1206 "parser.y" - { - (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node),(yyvsp[(2) - (2)].node)); -} - } - break; - - - - case 196: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1209 "parser.y" - { - (yyval.node) = mkaddnode((yyvsp[(1) - (3)].node), mkaddnode((yyvsp[(2) - (3)].node),(yyvsp[(3) - (3)].node))); -} - } - break; - - - - case 197: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1212 "parser.y" - { - (yyval.node) = mkstringnode((yyvsp[(1) - (1)].id)); -} - } - break; - - - - case 198: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1215 "parser.y" - { - (yyval.node) = (yyvsp[(1) - (1)].node); -} - } - break; - - - - case 199: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1219 "parser.y" - { - (yyval.node) = mkstringnode(""); -} - } - break; - - - - case 200: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1222 "parser.y" - { - (yyval.node) = mkaddnode(mkstringnode(" "),(yyvsp[(1) - (1)].node)); -} - } - break; - - - - case 201: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1226 "parser.y" - { - //$$ = allocprintf("<%s%s/>", $2, $3, $5, $8); - (yyval.node) = mkaddnode(mkaddnode(mkaddnode(mkstringnode("<"),(yyvsp[(2) - (6)].node)),(yyvsp[(3) - (6)].node)),mkstringnode("/>")); -} - } - break; - - - - case 202: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1230 "parser.y" - { - //$$ = allocprintf("<%s%s>%s", $2, $3, $5, $8); - (yyval.node) = mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode( - mkstringnode("<"),(yyvsp[(2) - (10)].node)),(yyvsp[(3) - (10)].node)),mkstringnode(">")),(yyvsp[(5) - (10)].node)),mkstringnode("")); -} - } - break; - - - - case 203: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1235 "parser.y" - { - //$$ = allocprintf("<%s%s>%s%s", $2, $3, $5, $6, $9); - (yyval.node) = mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode(mkaddnode( - mkstringnode("<"),(yyvsp[(2) - (11)].node)),(yyvsp[(3) - (11)].node)),mkstringnode(">")),(yyvsp[(5) - (11)].node)),(yyvsp[(6) - (11)].node)),mkstringnode("")); -} - } - break; - - - - case 204: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1241 "parser.y" - { - (yyval.node) = (yyvsp[(1) - (1)].node); -} - } - break; - - - - case 205: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1244 "parser.y" - { - (yyval.node) = mkaddnode((yyvsp[(1) - (2)].node), mkaddnode(mkstringnode(" "),(yyvsp[(2) - (2)].node))); -} - } - break; - - - - case 206: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1247 "parser.y" - { - (yyval.node) = (yyvsp[(1) - (1)].node); -} - } - break; - - - - case 207: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1250 "parser.y" - { - char* str = string_cstr(&(yyvsp[(3) - (3)].str)); - (yyval.node) = mkaddnode((yyvsp[(1) - (3)].node), mkstringnode(concat2("=",str))); - free(str); -} - } - break; - - - - case 208: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1255 "parser.y" - { - (yyval.node) = mkaddnode((yyvsp[(1) - (3)].node), mkaddnode(mkstringnode("=\""), mkaddnode((yyvsp[(3) - (3)].node), mkstringnode("\"")))); -} - } - break; - - - - case 209: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1258 "parser.y" - { - (yyval.node) = mkaddnode(mkaddnode(mkstringnode(concat2((yyvsp[(1) - (3)].id),"=\"")), (yyvsp[(3) - (3)].node)), mkstringnode("\"")); -} - } - break; - - - - case 210: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1261 "parser.y" - { - char* str = string_cstr(&(yyvsp[(3) - (3)].str)); - (yyval.node)=mkstringnode(allocprintf("%s=%s", (yyvsp[(1) - (3)].id),str)); - free(str); - free((yyvsp[(1) - (3)].id));free((char*)(yyvsp[(3) - (3)].str).str); -} - } - break; - - - - case 211: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1271 "parser.y" - { - PASS12 - memset(&(yyval.params),0,sizeof((yyval.params))); -} - } - break; - - - - case 212: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1275 "parser.y" - { - PASS12 - (yyval.params)=(yyvsp[(1) - (1)].params); -} - } - break; - - - - case 213: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1281 "parser.y" - { - PASS12 - memset(&(yyval.params),0,sizeof((yyval.params))); - (yyval.params).varargs=1; - list_append((yyval.params).list, (yyvsp[(2) - (2)].param)); -} - } - break; - - - - case 214: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1287 "parser.y" - { - PASS12 - (yyval.params) =(yyvsp[(1) - (4)].params); - (yyval.params).varargs=1; - list_append((yyval.params).list, (yyvsp[(4) - (4)].param)); -} - } - break; - - - - case 215: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1295 "parser.y" - { - PASS12 - (yyval.params) = (yyvsp[(1) - (3)].params); - list_append((yyval.params).list, (yyvsp[(3) - (3)].param)); -} - } - break; - - - - case 216: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1300 "parser.y" - { - PASS12 - memset(&(yyval.params),0,sizeof((yyval.params))); - list_append((yyval.params).list, (yyvsp[(1) - (1)].param)); -} - } - break; - - - - case 217: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1306 "parser.y" - { - PASS12 - (yyval.param) = rfx_calloc(sizeof(param_t)); - (yyval.param)->name=(yyvsp[(1) - (4)].id); - (yyval.param)->type = (yyvsp[(3) - (4)].classinfo); - PASS2 - (yyval.param)->value = (yyvsp[(4) - (4)].constant); -} - } - break; - - - - case 218: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1314 "parser.y" - { - PASS12 - (yyval.param) = rfx_calloc(sizeof(param_t)); - (yyval.param)->name=(yyvsp[(1) - (2)].id); - (yyval.param)->type = TYPE_ANY; - PASS2 - (yyval.param)->value = (yyvsp[(2) - (2)].constant); -} - } - break; - - - - case 221: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1324 "parser.y" - {PASS12 (yyval.token)=0;} - } - break; - - - - case 222: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1327 "parser.y" - {PASS12 startfunction(&(yyvsp[(1) - (9)].flags),(yyvsp[(3) - (9)].token),(yyvsp[(4) - (9)].id),&(yyvsp[(6) - (9)].params),(yyvsp[(8) - (9)].classinfo));} - } - break; - - - - case 223: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1328 "parser.y" - { - PASS1 - endfunction(&(yyvsp[(1) - (12)].flags),(yyvsp[(3) - (12)].token),(yyvsp[(4) - (12)].id),&(yyvsp[(6) - (12)].params),0,0); - PASS2 - if(!state->method->info) syntaxerror("internal error"); - - code_t*c = method_header(state->method); - c = wrap_function(c, 0, (yyvsp[(11) - (12)].code)); - - endfunction(&(yyvsp[(1) - (12)].flags),(yyvsp[(3) - (12)].token),(yyvsp[(4) - (12)].id),&(yyvsp[(6) - (12)].params),(yyvsp[(8) - (12)].classinfo),c); - PASS12 - list_deep_free((yyvsp[(6) - (12)].params).list); - (yyval.code)=0; -} - } - break; - - - - case 225: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1344 "parser.y" - {PASS12 (yyval.id)=0;} - } - break; - - - - case 226: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1346 "parser.y" - {PASS12 innerfunction((yyvsp[(2) - (7)].id),&(yyvsp[(4) - (7)].params),(yyvsp[(6) - (7)].classinfo));} - } - break; - - - - case 227: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1347 "parser.y" - { - PASS1 - endfunction(0,0,(yyvsp[(2) - (10)].id),&(yyvsp[(4) - (10)].params),0,0); - PASS2 - methodinfo_t*f = state->method->info; - if(!f || !f->kind) syntaxerror("internal error"); - - code_t*c = method_header(state->method); - c = wrap_function(c, 0, (yyvsp[(9) - (10)].code)); - - int index = state->method->var_index; - endfunction(0,0,(yyvsp[(2) - (10)].id),&(yyvsp[(4) - (10)].params),(yyvsp[(6) - (10)].classinfo),c); - - (yyval.value).c = abc_getlocal(0, index); - (yyval.value).t = TYPE_FUNCTION(f); - - PASS12 list_deep_free((yyvsp[(4) - (10)].params).list); -} - } - break; - - - - case 228: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1369 "parser.y" - { - PASS1 NEW(unresolvedinfo_t,c); - memset(c, 0, sizeof(*c)); - c->kind = INFOTYPE_UNRESOLVED; - c->name = (yyvsp[(1) - (1)].id); - c->package = get_package_from_name((yyvsp[(1) - (1)].id)); - if(!c->package) { - c->nsset = get_current_imports(); - /* make the compiler look for this class in the current directory, - just in case: */ - as3_schedule_class_noerror(state->package, (yyvsp[(1) - (1)].id)); - } - (yyval.classinfo) = (classinfo_t*)c; - PASS2 - slotinfo_t*s = find_class((yyvsp[(1) - (1)].id)); - if(!s) syntaxerror("Could not find class/method %s (current package: %s)\n", (yyvsp[(1) - (1)].id), state->package); - (yyval.classinfo) = (classinfo_t*)s; - registry_use(s); -} - } - break; - - - - case 229: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1389 "parser.y" - { - PASS1 NEW(unresolvedinfo_t,c); - memset(c, 0, sizeof(*c)); - c->kind = INFOTYPE_UNRESOLVED; - c->package = (yyvsp[(1) - (3)].id); - c->name = (yyvsp[(3) - (3)].id); - (yyval.classinfo) = (classinfo_t*)c; - PASS2 - slotinfo_t*s = registry_find((yyvsp[(1) - (3)].id), (yyvsp[(3) - (3)].id)); - if(!s) syntaxerror("Couldn't find class/method %s.%s\n", (yyvsp[(1) - (3)].id), (yyvsp[(3) - (3)].id)); - free((yyvsp[(1) - (3)].id));(yyvsp[(1) - (3)].id)=0; - (yyval.classinfo) = (classinfo_t*)s; - registry_use(s); -} - } - break; - - - - case 232: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1407 "parser.y" - {PASS12 (yyval.classinfo_list)=list_new();list_append((yyval.classinfo_list), (yyvsp[(1) - (1)].classinfo));} - } - break; - - - - case 233: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1408 "parser.y" - {PASS12 (yyval.classinfo_list)=(yyvsp[(1) - (3)].classinfo_list);list_append((yyval.classinfo_list),(yyvsp[(3) - (3)].classinfo));} - } - break; - - - - case 234: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1410 "parser.y" - {PASS12 (yyval.classinfo)=(yyvsp[(1) - (1)].classinfo);} - } - break; - - - - case 235: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1411 "parser.y" - {PASS12 (yyval.classinfo)=TYPE_ANY;} - } - break; - - - - case 236: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1412 "parser.y" - {PASS12 (yyval.classinfo)=TYPE_VOID;} - } - break; - - - - case 237: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1421 "parser.y" - {PASS12 (yyval.classinfo)=(yyvsp[(2) - (2)].classinfo);} - } - break; - - - - case 238: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1422 "parser.y" - {PASS12 (yyval.classinfo)=0;} - } - break; - - - - case 239: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1426 "parser.y" - {(yyval.value_list).cc=0;(yyval.value_list).number=0;} - } - break; - - - - case 240: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1427 "parser.y" - {(yyval.value_list)=(yyvsp[(2) - (3)].value_list);} - } - break; - - - - case 241: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1429 "parser.y" - {(yyval.value_list).cc=0;(yyval.value_list).number=0;} - } - break; - - - - case 244: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1433 "parser.y" - {(yyval.value_list).number=1; - (yyval.value_list).cc = (yyvsp[(1) - (1)].value).c; - } - } - break; - - - - case 245: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1437 "parser.y" - {(yyval.value_list) = (yyvsp[(1) - (2)].value_list);} - } - break; - - - - case 246: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1438 "parser.y" - { - (yyval.value_list).number= (yyvsp[(1) - (2)].value_list).number+1; - (yyval.value_list).cc = code_append((yyvsp[(1) - (2)].value_list).cc, (yyvsp[(2) - (2)].value).c); - } - } - break; - - - - case 248: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1444 "parser.y" - { - typedcode_t v = node_read((yyvsp[(2) - (4)].node)); - (yyval.value).c = v.c; - if((yyval.value).c->opcode == OPCODE_COERCE_A) (yyval.value).c = code_cutlast((yyval.value).c); - - code_t*paramcode = (yyvsp[(4) - (4)].value_list).cc; - if((yyval.value).c->opcode == OPCODE_GETPROPERTY) { - multiname_t*name = (yyval.value).c->data[0];(yyval.value).c->data[0]=0; - (yyval.value).c = code_cutlast((yyval.value).c); - (yyval.value).c = code_append((yyval.value).c, paramcode); - (yyval.value).c = abc_constructprop2((yyval.value).c, name, (yyvsp[(4) - (4)].value_list).number); - multiname_destroy(name); - } else if(is_getlocal((yyval.value).c)) { - (yyval.value).c = code_append((yyval.value).c, paramcode); - (yyval.value).c = abc_construct((yyval.value).c, (yyvsp[(4) - (4)].value_list).number); - } else if(TYPE_IS_CLASS(v.t) && v.t->data) { - code_free((yyval.value).c); - classinfo_t*c = v.t->data; - MULTINAME(m, c); - (yyval.value).c = abc_findpropstrict2(0, &m); - (yyval.value).c = code_append((yyval.value).c, paramcode); - (yyval.value).c = abc_constructprop2((yyval.value).c, &m, (yyvsp[(4) - (4)].value_list).number); - /*} else if($$.c->opcode == OPCODE_GETSLOT) { - int slot = (int)(ptroff_t)$$.c->data[0]; - trait_t*t = traits_find_slotid(state->cls->abc->traits,slot);//FIXME - multiname_t*name = t->name; - $$.c = code_cutlast($$.c); - $$.c = code_append($$.c, paramcode); - $$.c = abc_constructprop2($$.c, name, $4.number);*/ - } else { - (yyval.value).c = code_append((yyval.value).c, paramcode); - (yyval.value).c = abc_construct((yyval.value).c, (yyvsp[(4) - (4)].value_list).number); - } - - (yyval.value).t = TYPE_ANY; - if(TYPE_IS_CLASS(v.t) && v.t->data) { - (yyval.value).t = v.t->data; - } else { - (yyval.value).c = abc_coerce_a((yyval.value).c); - (yyval.value).t = TYPE_ANY; - } -} - } - break; - - - - case 249: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1491 "parser.y" - { - - typedcode_t v = node_read((yyvsp[(1) - (4)].node)); - (yyval.value).c = v.c; - if((yyval.value).c->opcode == OPCODE_COERCE_A) { - (yyval.value).c = code_cutlast((yyval.value).c); - } - code_t*paramcode = (yyvsp[(3) - (4)].value_list).cc; - - (yyval.value).t = TYPE_ANY; - if((yyval.value).c->opcode == OPCODE_GETPROPERTY) { - multiname_t*name = (yyval.value).c->data[0];(yyval.value).c->data[0]=0; - (yyval.value).c = code_cutlast((yyval.value).c); - (yyval.value).c = code_append((yyval.value).c, paramcode); - (yyval.value).c = abc_callproperty2((yyval.value).c, name, (yyvsp[(3) - (4)].value_list).number); - multiname_destroy(name); -/* } else if($$.c->opcode == OPCODE_GETSLOT && $$.c->prev->opcode != OPCODE_GETSCOPEOBJECT) { - int slot = (int)(ptroff_t)$$.c->data[0]; - trait_t*t = traits_find_slotid(state->cls->abc->traits,slot); - if(t->kind!=TRAIT_METHOD) { - //ok: flash allows to assign closures to members. - } - multiname_t*name = t->name; - $$.c = code_cutlast($$.c); - $$.c = code_append($$.c, paramcode); - //$$.c = abc_callmethod($$.c, t->method, len); //#1051 illegal early access binding - $$.c = abc_callproperty2($$.c, name, $3.number);*/ - } else if((yyval.value).c->opcode == OPCODE_GETSUPER) { - multiname_t*name = (yyval.value).c->data[0];(yyval.value).c->data[0]=0; - (yyval.value).c = code_cutlast((yyval.value).c); - (yyval.value).c = code_append((yyval.value).c, paramcode); - (yyval.value).c = abc_callsuper2((yyval.value).c, name, (yyvsp[(3) - (4)].value_list).number); - multiname_destroy(name); - } else { - (yyval.value).c = abc_getglobalscope((yyval.value).c); - (yyval.value).c = code_append((yyval.value).c, paramcode); - (yyval.value).c = abc_call((yyval.value).c, (yyvsp[(3) - (4)].value_list).number); - } - - if(TYPE_IS_FUNCTION(v.t) && v.t->data) { - (yyval.value).t = ((methodinfo_t*)(v.t->data))->return_type; - } else if(TYPE_IS_CLASS(v.t) && v.t->data) { - // calling a class is like a typecast - (yyval.value).t = (classinfo_t*)v.t->data; - } else { - (yyval.value).t = TYPE_ANY; - (yyval.value).c = abc_coerce_a((yyval.value).c); - } -} - } - break; - - - - case 250: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1541 "parser.y" - { - if(!state->cls) syntaxerror("super() not allowed outside of a class"); - if(!state->method) syntaxerror("super() not allowed outside of a function"); - if(!state->method->is_constructor) syntaxerror("super() not allowed outside of a constructor"); - - (yyval.value).c = code_new(); - (yyval.value).c = abc_getlocal_0((yyval.value).c); - - (yyval.value).c = code_append((yyval.value).c, (yyvsp[(3) - (4)].value_list).cc); - /* - this is dependent on the control path, check this somewhere else - if(state->method->has_super) - syntaxerror("constructor may call super() only once"); - */ - state->method->has_super = 1; - - (yyval.value).c = abc_constructsuper((yyval.value).c, (yyvsp[(3) - (4)].value_list).number); - (yyval.value).c = abc_pushundefined((yyval.value).c); - (yyval.value).t = TYPE_ANY; -} - } - break; - - - - case 251: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1562 "parser.y" - { - typedcode_t v = node_read((yyvsp[(2) - (2)].node)); - (yyval.value).c = v.c; - if((yyval.value).c->opcode == OPCODE_COERCE_A) { - (yyval.value).c = code_cutlast((yyval.value).c); - } - multiname_t*name = 0; - if((yyval.value).c->opcode == OPCODE_GETPROPERTY) { - (yyval.value).c->opcode = OPCODE_DELETEPROPERTY; - } else if((yyval.value).c->opcode == OPCODE_GETSLOT) { - int slot = (int)(ptroff_t)(yyval.value).c->data[0]; - multiname_t*name = traits_find_slotid(state->cls->abc->traits,slot)->name; - (yyval.value).c = code_cutlast((yyval.value).c); - (yyval.value).c = abc_deleteproperty2((yyval.value).c, name); - } else { - (yyval.value).c = abc_getlocal_0((yyval.value).c); - MULTINAME_LATE(m, v.t?v.t->access:ACCESS_PACKAGE, ""); - (yyval.value).c = abc_deleteproperty2((yyval.value).c, &m); - } - (yyval.value).t = TYPE_BOOLEAN; -} - } - break; - - - - case 252: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1584 "parser.y" - { - (yyval.code) = abc_returnvoid(0); -} - } - break; - - - - case 253: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1587 "parser.y" - { - (yyval.code) = (yyvsp[(2) - (2)].value).c; - (yyval.code) = abc_returnvalue((yyval.code)); -} - } - break; - - - - case 254: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1594 "parser.y" - { - (yyval.value) = node_read((yyvsp[(1) - (1)].node)); -} - } - break; - - - - case 255: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1597 "parser.y" - { - (yyval.value) = node_read((yyvsp[(1) - (1)].node)); -} - } - break; - - - - case 256: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1600 "parser.y" - { - (yyval.node) = mkmultinode(&node_comma, (yyvsp[(1) - (1)].node)); -} - } - break; - - - - case 257: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1603 "parser.y" - { - (yyval.node) = multinode_extend((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); -} - } - break; - - - - case 258: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1606 "parser.y" - { - (yyval.code) = node_exec((yyvsp[(1) - (1)].node)); -} - } - break; - - - - case 259: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1609 "parser.y" - { - (yyval.code) = (yyvsp[(1) - (3)].code); - (yyval.code) = code_append((yyval.code), node_exec((yyvsp[(3) - (3)].node))); -} - } - break; - - - - case 260: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1614 "parser.y" - {(yyval.value_list).cc=0;(yyval.value_list).number=0;} - } - break; - - - - case 261: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1615 "parser.y" - {(yyval.value_list)=(yyvsp[(1) - (1)].value_list);} - } - break; - - - - case 262: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1617 "parser.y" - {(yyval.code)=abc_pushstring(0,(yyvsp[(1) - (1)].id));} - } - break; - - - - case 263: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1618 "parser.y" - {(yyval.code)=abc_pushstring2(0,&(yyvsp[(1) - (1)].str));} - } - break; - - - - case 264: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1619 "parser.y" - {syntaxerror("dictionary keys must be strings");} - } - break; - - - - case 265: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1620 "parser.y" - {syntaxerror("dictionary keys must be strings");} - } - break; - - - - case 266: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1621 "parser.y" - {syntaxerror("dictionary keys must be strings");} - } - break; - - - - case 267: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1623 "parser.y" - { - (yyval.value_list).cc = 0; - (yyval.value_list).cc = code_append((yyval.value_list).cc, (yyvsp[(1) - (3)].code)); - (yyval.value_list).cc = code_append((yyval.value_list).cc, (yyvsp[(3) - (3)].value).c); - (yyval.value_list).number = 2; -} - } - break; - - - - case 268: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1629 "parser.y" - { - (yyval.value_list).cc = (yyvsp[(1) - (5)].value_list).cc; - (yyval.value_list).number = (yyvsp[(1) - (5)].value_list).number+2; - (yyval.value_list).cc = code_append((yyval.value_list).cc, (yyvsp[(3) - (5)].code)); - (yyval.value_list).cc = code_append((yyval.value_list).cc, (yyvsp[(5) - (5)].value).c); -} - } - break; - - - - case 269: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1638 "parser.y" - {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} - } - break; - - - - case 270: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1639 "parser.y" - {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} - } - break; - - - - case 271: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1640 "parser.y" - {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} - } - break; - - - - case 272: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1641 "parser.y" - {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} - } - break; - - - - case 273: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1642 "parser.y" - {(yyval.node) = mkcodenode((yyvsp[(1) - (1)].value));} - } - break; - - - - case 274: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1643 "parser.y" - {(yyval.node) = (yyvsp[(1) - (1)].node);} - } - break; - - - - case 275: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1645 "parser.y" - { - (yyval.node) = mkconstnode((yyvsp[(1) - (1)].constant)); -} - } - break; - - - - case 276: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1649 "parser.y" - { - (yyval.node) = (yyvsp[(1) - (1)].node); -} - } - break; - - - - case 277: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1654 "parser.y" - { - typedcode_t v; - v.c = 0; - multiname_t m = {QNAME, &stdns, 0, "RegExp"}; - if(!(yyvsp[(1) - (1)].regexp).options) { - v.c = abc_getlex2(v.c, &m); - v.c = abc_pushstring(v.c, (yyvsp[(1) - (1)].regexp).pattern); - v.c = abc_construct(v.c, 1); - } else { - v.c = abc_getlex2(v.c, &m); - v.c = abc_pushstring(v.c, (yyvsp[(1) - (1)].regexp).pattern); - v.c = abc_pushstring(v.c, (yyvsp[(1) - (1)].regexp).options); - v.c = abc_construct(v.c, 2); - } - v.t = TYPE_REGEXP; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 278: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1672 "parser.y" - { - PASS1 - state->method->need_arguments = 1; - PASS2 - typedcode_t v; - v.c = abc_getlocal(0, state->method->need_arguments); - v.t = TYPE_ARRAY; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 279: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1683 "parser.y" - { - typedcode_t v; - v.c = code_new(); - v.c = code_append(v.c, (yyvsp[(2) - (3)].value_list).cc); - v.c = abc_newarray(v.c, (yyvsp[(2) - (3)].value_list).number); - v.t = registry_getarrayclass(); - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 280: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1693 "parser.y" - { - typedcode_t v; - v.c = code_new(); - v.c = code_append(v.c, (yyvsp[(2) - (3)].value_list).cc); - v.c = abc_newobject(v.c, (yyvsp[(2) - (3)].value_list).number/2); - v.t = registry_getobjectclass(); - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 281: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1702 "parser.y" - {(yyval.node) = mknode2(&node_lt,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 282: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1703 "parser.y" - {(yyval.node) = mknode2(&node_gt,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 283: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1704 "parser.y" - {(yyval.node) = mknode2(&node_le,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 284: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1705 "parser.y" - {(yyval.node) = mknode2(&node_ge,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 285: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1706 "parser.y" - {(yyval.node) = mknode2(&node_eqeq,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 286: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1707 "parser.y" - {(yyval.node) = mknode2(&node_eqeqeq,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 287: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1708 "parser.y" - {(yyval.node) = mknode2(&node_noteqeq,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 288: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1709 "parser.y" - {(yyval.node) = mknode2(&node_noteq,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 289: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1710 "parser.y" - {(yyval.node) = mknode2(&node_oror,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 290: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1711 "parser.y" - {(yyval.node) = mknode2(&node_andand,(yyvsp[(1) - (3)].node),(yyvsp[(3) - (3)].node));} - } - break; - - - - case 291: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1712 "parser.y" - {(yyval.node) = mknode1(&node_not, (yyvsp[(2) - (2)].node));} - } - break; - - - - case 292: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1713 "parser.y" - {(yyval.node) = mknode1(&node_bitnot, (yyvsp[(2) - (2)].node));} - } - break; - - - - case 293: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1714 "parser.y" - {(yyval.node) = mknode2(&node_bitand, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 294: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1715 "parser.y" - {(yyval.node) = mknode2(&node_bitxor, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 295: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1716 "parser.y" - {(yyval.node) = mknode2(&node_bitor, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 296: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1717 "parser.y" - {(yyval.node) = mknode2(&node_shr, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 297: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1718 "parser.y" - {(yyval.node) = mknode2(&node_ushr, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 298: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1719 "parser.y" - {(yyval.node) = mknode2(&node_shl, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 299: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1720 "parser.y" - {(yyval.node) = mknode2(&node_div, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 300: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1721 "parser.y" - {(yyval.node) = mknode2(&node_mod, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 301: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1722 "parser.y" - {(yyval.node) = mknode2(&node_plus, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 302: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1723 "parser.y" - {(yyval.node) = mknode2(&node_minus, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 303: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1724 "parser.y" - {(yyval.node) = mknode2(&node_multiply, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 304: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1725 "parser.y" - {(yyval.node) = mknode2(&node_in, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 305: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1726 "parser.y" - {(yyval.node) = mknode2(&node_as, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 306: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1727 "parser.y" - {(yyval.node) = mknode2(&node_instanceof, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 307: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1728 "parser.y" - {(yyval.node) = mknode2(&node_is, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 308: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1729 "parser.y" - {(yyval.node) = mknode1(&node_typeof, (yyvsp[(2) - (2)].node));} - } - break; - - - - case 309: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1730 "parser.y" - {(yyval.node) = mknode1(&node_void, (yyvsp[(2) - (2)].node));} - } - break; - - - - case 310: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1731 "parser.y" - { (yyval.node) = mkconstnode(constant_new_undefined());} - } - break; - - - - case 311: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1732 "parser.y" - { (yyval.node)=(yyvsp[(2) - (3)].node);} - } - break; - - - - case 312: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1733 "parser.y" - {(yyval.node) = mknode1(&node_neg, (yyvsp[(2) - (2)].node));} - } - break; - - - - case 313: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1734 "parser.y" - {(yyval.node) = mknode2(&node_arraylookup, (yyvsp[(1) - (4)].node),(yyvsp[(3) - (4)].node));} - } - break; - - - - case 314: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1735 "parser.y" - {(yyval.node) = mknode2(&node_muleq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 315: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1736 "parser.y" - {(yyval.node) = mknode2(&node_modeq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 316: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1737 "parser.y" - {(yyval.node) = mknode2(&node_shleq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 317: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1738 "parser.y" - {(yyval.node) = mknode2(&node_shreq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 318: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1739 "parser.y" - {(yyval.node) = mknode2(&node_ushreq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 319: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1740 "parser.y" - { (yyval.node) = mknode2(&node_diveq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 320: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1741 "parser.y" - { (yyval.node) = mknode2(&node_bitoreq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 321: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1742 "parser.y" - { (yyval.node) = mknode2(&node_bitxoreq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 322: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1743 "parser.y" - { (yyval.node) = mknode2(&node_bitandeq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 323: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1744 "parser.y" - { (yyval.node) = mknode2(&node_pluseq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 324: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1745 "parser.y" - { (yyval.node) = mknode2(&node_minuseq, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 325: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1746 "parser.y" - { (yyval.node) = mknode2(&node_assign, (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));} - } - break; - - - - case 326: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1747 "parser.y" - { (yyval.node) = mknode3(&node_tenary, (yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].node), (yyvsp[(5) - (5)].node));} - } - break; - - - - case 327: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1749 "parser.y" - { (yyval.node) = mknode1(&node_rplusplus, (yyvsp[(1) - (2)].node));} - } - break; - - - - case 328: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1750 "parser.y" - { (yyval.node) = mknode1(&node_rminusminus, (yyvsp[(1) - (2)].node));} - } - break; - - - - case 329: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1751 "parser.y" - {(yyval.node) = mknode1(&node_lplusplus, (yyvsp[(2) - (2)].node)); } - } - break; - - - - case 330: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1752 "parser.y" - {(yyval.node) = mknode1(&node_lminusminus, (yyvsp[(2) - (2)].node)); } - } - break; - - - - case 331: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1755 "parser.y" - { if(!state->cls->info) - syntaxerror("super keyword not allowed outside a class"); - classinfo_t*t = state->cls->info->superclass; - if(!t) t = TYPE_OBJECT; - memberinfo_t*f = findmember_nsset(t, (yyvsp[(3) - (3)].id), 1, 0); - MEMBER_MULTINAME(m, f, (yyvsp[(3) - (3)].id)); - typedcode_t v; - v.c = 0; - v.c = abc_getlocal_0(v.c); - v.c = abc_getsuper2(v.c, &m); - v.t = slotinfo_gettype((slotinfo_t*)f); - (yyval.node) = mkcodenode(v); - } - } - break; - - - - case 332: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1769 "parser.y" - { - typedcode_t v; - multiname_t m = {MULTINAMEA, 0, &nopackage_namespace_set, (yyvsp[(2) - (2)].id)}; - v.c = abc_getlex2(0, &m); - v.t = TYPE_STRING; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 333: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1777 "parser.y" - {PASS12 new_state();state->xmlfilter=1;} - } - break; - - - - case 334: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1777 "parser.y" - { - PASS1 old_state(); - PASS2 - typedcode_t v = node_read((yyvsp[(1) - (6)].node)); - typedcode_t w = node_read((yyvsp[(5) - (6)].node)); - code_t*c = 0; - int index = alloc_local(); - int result = alloc_local(); - int tmp = alloc_local(); - int xml = alloc_local(); - - c = code_append(c, v.c); - c = abc_checkfilter(c); - c = abc_coerce_a(c); //hasnext2 converts to * - c = abc_setlocal(c, xml); - multiname_t m = {QNAME, &stdns, 0, "XMLList"}; - c = abc_getlex2(c, &m); - c = abc_construct(c, 0); - c = abc_setlocal(c, result); - c = abc_pushbyte(c, 0); - c = abc_setlocal(c, index); - code_t*jmp = c = abc_jump(c, 0); - code_t*loop = c = abc_label(c); - c = abc_getlocal(c, xml); - c = abc_getlocal(c, index); - c = abc_nextvalue(c); - c = abc_dup(c); - c = abc_setlocal(c, tmp); - c = abc_pushwith(c); - c = code_append(c, w.c); - c = abc_popscope(c); - code_t*b = c = abc_iffalse(c, 0); - c = abc_getlocal(c, result); - c = abc_getlocal(c, index); - c = abc_getlocal(c, tmp); - multiname_t m2 = {MULTINAMEL, 0, &nopackage_namespace_set, 0}; - c = abc_setproperty2(c, &m2); - c = b->branch = jmp->branch = abc_nop(c); - c = abc_kill(c, tmp); - c = abc_hasnext2(c, xml, index); - c = abc_iftrue(c, loop); - c = abc_getlocal(c, result); - c = abc_kill(c, xml); - c = abc_kill(c, result); - c = abc_kill(c, index); - - c = var_block(c, state->vars); - old_state(); - typedcode_t r; - r.c = c; - r.t = TYPE_XMLLIST; - (yyval.node) = mkcodenode(r); -} - } - break; - - - - case 335: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1831 "parser.y" - {(yyval.id)=(yyvsp[(1) - (1)].id);} - } - break; - - - - case 336: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1832 "parser.y" - {(yyval.id)="*";} - } - break; - - - - case 338: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1835 "parser.y" - {(yyval.id)="*";} - } - break; - - - - case 339: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1876 "parser.y" - { -} - } - break; - - - - case 340: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1879 "parser.y" - { - (yyval.node) = get_descendants((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(5) - (5)].id), 0, 0); -} - } - break; - - - - case 341: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1882 "parser.y" - { - typedcode_t v = node_read((yyvsp[(1) - (3)].node)); - multiname_t m = {MULTINAME, 0, &nopackage_namespace_set, (yyvsp[(3) - (3)].id)}; - v.c = abc_getdescendants2(v.c, &m); - v.t = TYPE_XMLLIST; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 342: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1889 "parser.y" - { - (yyval.node) = get_descendants((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].id), (yyvsp[(5) - (5)].id), 1, 0); -} - } - break; - - - - case 343: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1892 "parser.y" - { - typedcode_t v = node_read((yyvsp[(1) - (5)].node)); - typedcode_t w = node_read((yyvsp[(4) - (5)].node)); - multiname_t m = {MULTINAMEL, 0, &nopackage_namespace_set, 0}; - v.c = code_append(v.c, w.c); - v.c = converttype(w.c, w.t, TYPE_STRING); - v.c = abc_getproperty2(v.c, &m); - v.t = TYPE_XMLLIST; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 344: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1903 "parser.y" - { - typedcode_t v = node_read((yyvsp[(1) - (4)].node)); - multiname_t m = {MULTINAMEA, 0, &nopackage_namespace_set, (yyvsp[(4) - (4)].id)}; - v.c = abc_getproperty2(v.c, &m); - v.t = TYPE_STRING; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 345: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1911 "parser.y" - { - (yyval.node) = get_descendants((yyvsp[(1) - (6)].node), (yyvsp[(4) - (6)].id), (yyvsp[(6) - (6)].id), 0, 1); -} - } - break; - - - - case 346: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1915 "parser.y" - { - typedcode_t v = node_read((yyvsp[(1) - (4)].node)); - multiname_t m = {MULTINAMEA, 0, &nopackage_namespace_set, (yyvsp[(4) - (4)].id)}; - v.c = abc_getdescendants2(v.c, &m); - v.t = TYPE_STRING; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 347: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1922 "parser.y" - { - (yyval.node) = get_descendants((yyvsp[(1) - (6)].node), (yyvsp[(4) - (6)].id), (yyvsp[(6) - (6)].id), 1, 1); -} - } - break; - - - - case 348: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1926 "parser.y" - { - typedcode_t v = node_read((yyvsp[(1) - (6)].node)); - typedcode_t w = node_read((yyvsp[(5) - (6)].node)); - multiname_t m = {MULTINAMELA, 0, &nopackage_namespace_set, 0}; - v.c = code_append(v.c, w.c); - v.c = converttype(w.c, w.t, TYPE_STRING); - v.c = abc_getproperty2(v.c, &m); - v.t = TYPE_STRING; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 349: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1936 "parser.y" - { - typedcode_t v = node_read((yyvsp[(1) - (6)].node)); - typedcode_t w = node_read((yyvsp[(5) - (6)].node)); - multiname_t m = {MULTINAMELA, 0, &nopackage_namespace_set, 0}; - v.c = code_append(v.c, w.c); - v.c = converttype(w.c, w.t, TYPE_STRING); - v.c = abc_getdescendants2(v.c, &m); - v.t = TYPE_STRING; - (yyval.node) = mkcodenode(v); -} - } - break; - - - - case 350: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 1947 "parser.y" - { - typedcode_t v1 = node_read((yyvsp[(1) - (3)].node)); - (yyval.value).c = v1.c; - classinfo_t*t = v1.t; - char is_static = 0; - if(TYPE_IS_CLASS(t) && t->data) { - t = t->data; - is_static = 1; - } - if(TYPE_IS_XML(t) && !findmember_nsset(t, (yyvsp[(3) - (3)].id), 1, is_static)) { - multiname_t m = {MULTINAME, 0, &nopackage_namespace_set, (yyvsp[(3) - (3)].id)}; - (yyval.value).c = abc_getproperty2((yyval.value).c, &m); - (yyval.value).c = abc_coerce_a((yyval.value).c); - (yyval.value).t = TYPE_XMLLIST; - } else if(t) { - if(t->subtype==INFOTYPE_UNRESOLVED) { - syntaxerror("syntaxerror: trying to resolve property '%s' on incomplete object '%s'", (yyvsp[(3) - (3)].id), t->name); - } - memberinfo_t*f = findmember_nsset(t, (yyvsp[(3) - (3)].id), 1, is_static); - char noslot = 0; - if(f && !is_static != !(f->flags&FLAG_STATIC)) - noslot=1; - if(f && f->slot && !noslot) { - (yyval.value).c = abc_getslot((yyval.value).c, f->slot); - } else { - if(!f) { - if(!TYPE_IS_XMLLIST(t)) { - as3_softwarning("Access of undefined property '%s' in %s", (yyvsp[(3) - (3)].id), t->name); - } - } - MEMBER_MULTINAME(m, f, (yyvsp[(3) - (3)].id)); - (yyval.value).c = abc_getproperty2((yyval.value).c, &m); - } - /* determine type */ - (yyval.value).t = slotinfo_gettype((slotinfo_t*)f); - if(!(yyval.value).t) - (yyval.value).c = abc_coerce_a((yyval.value).c); - - } else if(v1.c && v1.c->opcode == OPCODE___PUSHPACKAGE__) { - string_t*package = v1.c->data[0]; - char*package2 = concat3(package->str, ".", (yyvsp[(3) - (3)].id)); - - slotinfo_t*a = registry_find(package->str, (yyvsp[(3) - (3)].id)); - if(a) { - (yyval.value) = push_class(a); - } else if(dict_contains(state->import_toplevel_packages, package2) || - registry_ispackage(package2)) { - (yyval.value).c = v1.c; - (yyval.value).c->data[0] = string_new4(package2); - (yyval.value).t = 0; - } else { - syntaxerror("couldn't resolve %s", package2); - } - } else { - /* when resolving a property on an unknown type, we do know the - name of the property (and don't seem to need the package), but - we need to make avm2 try out all access modes */ - as3_softwarning("Resolving %s on unknown type", (yyvsp[(3) - (3)].id)); - multiname_t m = {MULTINAME, 0, &nopackage_namespace_set, (yyvsp[(3) - (3)].id)}; - (yyval.value).c = abc_getproperty2((yyval.value).c, &m); - (yyval.value).c = abc_coerce_a((yyval.value).c); - (yyval.value).t = TYPE_ANY; - } -} - } - break; - - - - case 352: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 2145 "parser.y" - { - PASS1 - char*name = (yyvsp[(2) - (2)].id); - /* Queue unresolved identifiers for checking against the parent - function's variables. - We consider everything which is not a local variable "unresolved". - This encompasses class names, members of the surrounding class - etc. which is *correct* because local variables of the parent function - would shadow those. - */ - - if(!find_variable(state, name)) { - unknown_variable(name); - /* let the compiler know that it might want to check the current directory/package - for this identifier- maybe there's a file $1.as defining $1. */ - as3_schedule_class_noerror(state->package, name); - } - - (yyval.node) = 0; - PASS2 - char*name = (yyvsp[(2) - (2)].id); - (yyval.node) = resolve_identifier(name); -} - } - break; - - - - case 353: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 2180 "parser.y" - { - PASS12 - NEW(namespace_decl_t,n); - n->name = (yyvsp[(2) - (2)].id); - n->url = (yyvsp[(2) - (2)].id); - (yyval.namespace_decl)=n; -} - } - break; - - - - case 354: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 2187 "parser.y" - { - PASS12 - NEW(namespace_decl_t,n); - n->name = (yyvsp[(2) - (4)].id); - n->url = (yyvsp[(4) - (4)].id); - (yyval.namespace_decl)=n; -} - } - break; - - - - case 355: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 2194 "parser.y" - { - PASS12 - NEW(namespace_decl_t,n); - n->name = (yyvsp[(2) - (4)].id); - n->url = (yyvsp[(4) - (4)].str).str; - (yyval.namespace_decl)=n; -} - } - break; - - - - case 356: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 2201 "parser.y" - { - PASS12 - dict_put(state->namespaces, (unsigned char*)(yyvsp[(2) - (2)].namespace_decl)->name, (void*)(yyvsp[(2) - (2)].namespace_decl)->url); - - namespace_t access = modifiers2access(&(yyvsp[(1) - (2)].flags)); - varinfo_t* var = varinfo_register_global(access.access, state->package, (yyvsp[(2) - (2)].namespace_decl)->name); - var->type = TYPE_NAMESPACE; - namespace_t ns; - ns.access = ACCESS_NAMESPACE; - ns.name = (yyvsp[(2) - (2)].namespace_decl)->url; - var->value = constant_new_namespace(&ns); - - if(as3_pass==2) { - MULTINAME(m, TYPE_NAMESPACE); - trait_t*t = add_abc_slot(&(yyvsp[(1) - (2)].flags), (yyvsp[(2) - (2)].namespace_decl)->name, 0, 0); - t->value = var->value; - t->type_name = multiname_clone(&m); - } - - (yyval.code)=0; -} - } - break; - - - - case 357: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 2224 "parser.y" - { - (yyval.code) = 0; - (yyval.code) = code_append((yyval.code), node_read((yyvsp[(4) - (4)].node)).c); - (yyval.code) = abc_dxnslate((yyval.code)); -} - } - break; - - - - case 358: - if(as3_pass==2) { - -/* Line 1464 of skeleton.m4 */ -#line 2230 "parser.y" - { - PASS12 - - varinfo_t*s = (varinfo_t*)(yyvsp[(3) - (3)].classinfo); - if(s->kind == INFOTYPE_UNRESOLVED) { - s = (varinfo_t*)registry_resolve((slotinfo_t*)s); - if(!s) - syntaxerror("Couldn't resolve namespace %s", (yyvsp[(3) - (3)].classinfo)->name); - } - - if(!s || s->kind != INFOTYPE_VAR) - syntaxerror("%s.%s is not a public namespace (%d)", (yyvsp[(3) - (3)].classinfo)->package, (yyvsp[(3) - (3)].classinfo)->name, s?s->kind:-1); - if(!s->value || !NS_TYPE(s->value->type)) - syntaxerror("%s.%s is not a namespace", (yyvsp[(3) - (3)].classinfo)->package, (yyvsp[(3) - (3)].classinfo)->name); - - const char*url = s->value->ns->name; - dict_put(state->namespaces, (unsigned char*)(yyvsp[(3) - (3)].classinfo)->name, (void*)url); - add_active_url(url); - (yyval.code)=0; -} - } - break; - - - - -/* Line 1464 of skeleton.m4 */ -#line 7330 "parser.tab.c" - default: break; - } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - *++yyvsp = yylval; - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#if !defined(yyoverflow) || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} - - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.h deleted file mode 100644 index f2dfefb7a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser.tab.h +++ /dev/null @@ -1,208 +0,0 @@ - -/* A Bison parser, made by GNU Bison 2.4.2. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 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. */ - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - T_IDENTIFIER = 258, - T_STRING = 259, - T_REGEXP = 260, - T_EMPTY = 261, - T_INT = 262, - T_UINT = 263, - T_FLOAT = 264, - T_FOR = 265, - T_WHILE = 266, - T_DO = 267, - T_SWITCH = 268, - KW_IMPLEMENTS = 269, - KW_NAMESPACE = 270, - KW_PACKAGE = 271, - KW_PROTECTED = 272, - KW_ARGUMENTS = 273, - KW_PUBLIC = 274, - KW_PRIVATE = 275, - KW_USE = 276, - KW_INTERNAL = 277, - KW_NEW = 278, - KW_NATIVE = 279, - KW_FUNCTION = 280, - KW_FINALLY = 281, - KW_UNDEFINED = 282, - KW_NAN = 283, - KW_CONTINUE = 284, - KW_CLASS = 285, - KW_CONST = 286, - KW_CATCH = 287, - KW_CASE = 288, - KW_SET = 289, - KW_VOID = 290, - KW_THROW = 291, - KW_STATIC = 292, - KW_WITH = 293, - KW_INSTANCEOF = 294, - KW_IMPORT = 295, - KW_RETURN = 296, - KW_TYPEOF = 297, - KW_INTERFACE = 298, - KW_NULL = 299, - KW_VAR = 300, - KW_DYNAMIC = 301, - KW_OVERRIDE = 302, - KW_FINAL = 303, - KW_EACH = 304, - KW_GET = 305, - KW_TRY = 306, - KW_SUPER = 307, - KW_EXTENDS = 308, - KW_FALSE = 309, - KW_TRUE = 310, - KW_BOOLEAN = 311, - KW_UINT = 312, - KW_INT = 313, - KW_NUMBER = 314, - KW_STRING = 315, - KW_DEFAULT = 316, - KW_DEFAULT_XML = 317, - KW_DELETE = 318, - KW_IF = 319, - KW_ELSE = 320, - KW_BREAK = 321, - KW_IS = 322, - KW_IN = 323, - KW_AS = 324, - T_DICTSTART = 325, - T_EQEQ = 326, - T_EQEQEQ = 327, - T_NE = 328, - T_NEE = 329, - T_LE = 330, - T_GE = 331, - T_ORBY = 332, - T_DIVBY = 333, - T_MODBY = 334, - T_MULBY = 335, - T_ANDBY = 336, - T_PLUSBY = 337, - T_MINUSBY = 338, - T_XORBY = 339, - T_SHRBY = 340, - T_SHLBY = 341, - T_USHRBY = 342, - T_OROR = 343, - T_ANDAND = 344, - T_COLONCOLON = 345, - T_MINUSMINUS = 346, - T_PLUSPLUS = 347, - T_DOTDOT = 348, - T_DOTDOTDOT = 349, - T_SHL = 350, - T_USHR = 351, - T_SHR = 352, - prec_none = 353, - prec_var_read = 354, - below_semicolon = 355, - below_assignment = 356, - below_lt = 357, - below_minus = 358, - minusminus_prefix = 359, - plusplus_prefix = 360, - below_curly = 361, - new2 = 362, - below_identifier = 363, - above_identifier = 364, - below_else = 365, - above_function = 366 - }; -#endif - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union -/* Line 1685 of skeleton.m4 */ -#line 48 "parser.y" -tokenunion -{ - -/* Line 1685 of skeleton.m4 */ -#line 48 "parser.y" - - enum yytokentype token; - - classinfo_t*classinfo; - classinfo_list_t*classinfo_list; - slotinfo_t*slotinfo; - slotinfo_list_t*slotinfo_list; - - int number_int; - unsigned int number_uint; - double number_float; - code_t*code; - typedcode_t value; - //typedcode_list_t*value_list; - codeandnumber_t value_list; - param_t* param; - params_t params; - string_t str; - char*id; - constant_t*constant; - for_start_t for_start; - abc_exception_t *exception; - regexp_t regexp; - modifiers_t flags; - namespace_decl_t* namespace_decl; - node_t*node; - struct { - abc_exception_list_t *l; - code_t*finally; - } catch_list; - - - -/* Line 1685 of skeleton.m4 */ -#line 200 "parser.tab.h" -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - -extern YYSTYPE a3_lval; - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.c deleted file mode 100644 index e801ecf75..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.c +++ /dev/null @@ -1,1435 +0,0 @@ -#include "parser_help.h" - -global_t*global = 0; - -static namespace_t ns1 = {ACCESS_PRIVATE, ""}; -static namespace_t ns2 = {ACCESS_PROTECTED, ""}; -static namespace_t ns3 = {ACCESS_PACKAGEINTERNAL, ""}; -namespace_t stdns = {ACCESS_PACKAGE, ""}; -static namespace_list_t nl4 = {&stdns,0}; -static namespace_list_t nl3 = {&ns3,&nl4}; -static namespace_list_t nl2 = {&ns2,&nl3}; -static namespace_list_t nl1 = {&ns1,&nl2}; -namespace_set_t nopackage_namespace_set = {&nl1}; - -static char* internal_filename_package = 0; -void initialize_file(char*filename) -{ - if(state) { - syntaxerror("invalid call to initialize_file during parsing of another file"); - } - - new_state(); - state->package = internal_filename_package = strdup(filename); - - global->token2info = dict_lookup(global->file2token2info, - current_filename // use long version - ); - if(!global->token2info) { - global->token2info = dict_new2(&ptr_type); - dict_put(global->file2token2info, current_filename, global->token2info); - } - - if(as3_pass==1) { - state->method = rfx_calloc(sizeof(methodstate_t)); - dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, state->method); - state->method->late_binding = 1; // init scripts use getglobalscope, so we need a getlocal0/pushscope - state->method->allvars = dict_new(); - } else { - state->method = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); - state->method->variable_count = 0; - if(!state->method) - syntaxerror("internal error: skewed tokencount"); - function_initvars(state->method, 0, 0, 0, 1); - global->init = 0; - } -} - -void finish_file() -{ - if(!state || state->level!=1) { - syntaxerror("unexpected end of file in pass %d", as3_pass); - } - - if(as3_pass==2) { - dict_del(global->file2token2info, current_filename); - code_t*header = method_header(state->method); - //if(global->init->method->body->code || global->init->traits) { - if(global->init) { - code_t*c = wrap_function(header, 0, global->init->method->body->code); - global->init->method->body->code = abc_returnvoid(c); - free(state->method);state->method=0; - } - } - - //free(state->package);state->package=0; // used in registry - state_destroy(state);state=0; -} - -void initialize_parser() -{ - global = rfx_calloc(sizeof(global_t)); - global->file = abc_file_new(); - global->file->flags &= ~ABCFILE_LAZY; - global->file2token2info = dict_new(); - global->token2info = 0; - global->classinit = abc_initscript(global->file); -} - -void* finish_parser() -{ - dict_free_all(global->file2token2info, 1, (void*)dict_destroy); - global->token2info=0; - - initcode_add_classlist(global->classinit, global->classes); - - return global->file; -} - -variable_t* find_variable(state_t*s, const char*name) -{ - if(s->method->no_variable_scoping) { - return dict_lookup(s->method->allvars, name); - } else { - state_t*top = s; - while(s) { - variable_t*v = 0; - v = dict_lookup(s->vars, name); - if(v) return v; - if(s->new_vars) break; - s = s->old; - } - return 0; - } -} -variable_t* find_slot(methodstate_t*m, const char*name) -{ - if(m && m->slots) - return dict_lookup(m->slots, name); - return 0; -} - -variable_t* find_variable_safe(state_t*s, char*name) -{ - variable_t* v = find_variable(s, name); - if(!v) - syntaxerror("undefined variable: %s", name); - return v; -} - -char variable_exists(char*name) -{ - return dict_contains(state->vars, name); -} - -code_t*defaultvalue(code_t*c, classinfo_t*type) -{ - as3_assert(!type || type->kind!=INFOTYPE_UNRESOLVED); - if(TYPE_IS_INT(type)) { - c = abc_pushbyte(c, 0); - } else if(TYPE_IS_UINT(type)) { - c = abc_pushuint(c, 0); - } else if(TYPE_IS_FLOAT(type)) { - c = abc_pushnan(c); - } else if(TYPE_IS_BOOLEAN(type)) { - c = abc_pushfalse(c); - } else if(TYPE_IS_STRING(type)) { - c = abc_pushnull(c); - c = abc_coerce_s(c); - } else if(!type) { - //c = abc_pushundefined(c); - syntaxerror("internal error: can't generate default value for * type"); - } else { - c = abc_pushnull(c); - MULTINAME(m, type); - c = abc_coerce2(c, &m); - } - return c; -} - -int alloc_local() -{ - return state->method->variable_count++; -} - -variable_t* new_variable2(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot) -{ - if(maybeslot) { - variable_t*v = find_slot(method, name); - if(v) { - alloc_local(); - return v; - } - } - - NEW(variable_t, v); - v->type = type; - v->init = v->kill = init; - - if(name) { - if(!method->no_variable_scoping) { - if(dict_contains(state->vars, name)) { - syntaxerror("variable %s already defined", name); - } - v->index = alloc_local(); - dict_put(state->vars, name, v); - } else { - if(as3_pass==2 && dict_contains(state->method->allvars, name)) { - variable_t*v = dict_lookup(state->method->allvars, name); - if(v->type != type && (!v->type || v->type->kind!=INFOTYPE_UNRESOLVED)) { - syntaxerror("variable %s already defined.", name); - } - return v; - } - v->index = alloc_local(); - } - dict_put(state->method->allvars, name, v); - } else { - v->index = alloc_local(); - } - return v; -} -int new_variable(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot) -{ - return new_variable2(method, name, type, init, maybeslot)->index; -} - -#define TEMPVARNAME "__as3_temp__" -int gettempvar() -{ - variable_t*v = find_variable(state, TEMPVARNAME); - int i; - if(v) - i = v->index; - else - i = new_variable(state->method, TEMPVARNAME, 0, 0, 0); - as3_assert(i); - return i; -} -code_t* var_block(code_t*body, dict_t*vars) -{ - code_t*c = 0; - code_t*k = 0; - int t; - DICT_ITERATE_DATA(vars, variable_t*, v) { - if(v->type && v->init) { - c = defaultvalue(c, v->type); - c = abc_setlocal(c, v->index); - } - if(v->type && v->kill) { - k = abc_kill(k, v->index); - } - } - - if(k) { - code_t*x = body; - while(x) { - if(x->opcode== OPCODE___BREAK__ || - x->opcode== OPCODE___CONTINUE__) { - /* link kill code before break/continue */ - code_t*e = code_dup(k); - code_t*s = code_start(e); - s->prev = x->prev; - if(x->prev) { - x->prev->next = s; - } - e->next = x; - x->prev = e; - } - x = x->prev; - } - } - - c = code_append(c, body); - c = code_append(c, k); - return c; -} - -void unknown_variable(char*name) -{ - if(!state->method->unresolved_variables) - state->method->unresolved_variables = dict_new(); - if(!dict_contains(state->method->unresolved_variables, name)) - dict_put(state->method->unresolved_variables, name, 0); -} -code_t* add_scope_code(code_t*c, methodstate_t*m, char init) -{ - if(m->uses_slots || m->innerfunctions || (m->late_binding && !m->inner)) { - c = abc_getlocal_0(c); - c = abc_pushscope(c); - } - if(m->uses_slots) { - /* FIXME: this alloc_local() causes variable indexes to be - different in pass2 than in pass1 */ - if(!m->activation_var) { - m->activation_var = alloc_local(); - } - if(init) { - c = abc_newactivation(c); - c = abc_dup(c); - c = abc_pushscope(c); - c = abc_setlocal(c, m->activation_var); - } else { - c = abc_getlocal(c, m->activation_var); - c = abc_pushscope(c); - } - } - return c; -} - -code_t* method_header(methodstate_t*m) -{ - code_t*c = 0; - - c = add_scope_code(c, m, 1); - - methodstate_list_t*l = m->innerfunctions; - while(l) { - as3_assert(l->methodstate->abc); - if(m->uses_slots && l->methodstate->is_a_slot) { - c = abc_getscopeobject(c, 1); - c = abc_newfunction(c, l->methodstate->abc); - c = abc_dup(c); - c = abc_setlocal(c, l->methodstate->var_index); - c = abc_setslot(c, l->methodstate->slot_index); - } else { - c = abc_newfunction(c, l->methodstate->abc); - c = abc_setlocal(c, l->methodstate->var_index); - } - free(l->methodstate);l->methodstate=0; - l = l->next; - } - if(m->header) { - c = code_append(c, m->header); - m->header = 0; - } - if(m->is_constructor && !m->has_super) { - // call default constructor - c = abc_getlocal_0(c); - c = abc_constructsuper(c, 0); - } - - if(m->slots) { - /* all parameters that are used by inner functions - need to be copied from local to slot */ - as3_assert(m->activation_var); - DICT_ITERATE_ITEMS(m->slots,char*,name,variable_t*,v) { - if(v->is_parameter) { - c = abc_getlocal(c, m->activation_var); - c = abc_getlocal(c, v->index); - c = abc_setslot(c, v->index); - } - } - } - list_free(m->innerfunctions); - m->innerfunctions = 0; - return c; -} - - -code_t* wrap_function(code_t*c,code_t*header, code_t*body) -{ - c = code_append(c, header); - c = code_append(c, var_block(body, state->method->no_variable_scoping?state->method->allvars:state->vars)); - /* append return if necessary */ - if(!c || (c->opcode != OPCODE_RETURNVOID && - c->opcode != OPCODE_RETURNVALUE)) { - c = abc_returnvoid(c); - } - return c; -} - -void startpackage(char*name) -{ - new_state(); - state->package = strdup(name); -} -void endpackage() -{ - //used e.g. in classinfo_register: - //free(state->package);state->package=0; - old_state(); -} - -const char* lookup_namespace(const char*name) -{ - state_t*s = state; - while(s) { - const char*url = dict_lookup(s->namespaces, name); - if(url) - return url; - s = s->old; - } - varinfo_t*a; - registry_find(state->package, name); - if(( a = (varinfo_t*)find_class(name) )) { - if(a->kind == INFOTYPE_VAR) { - if(!a->value || !NS_TYPE(a->value->type)) - syntaxerror("%s.%s is not a namespace", a->package, a->name); - return a->value->ns->name; - } - } - return 0; -} - -namespace_t modifiers2access(modifiers_t*mod) -{ - namespace_t ns; - ns.access = 0; - ns.name = ""; - if(mod->flags&FLAG_NAMESPACE) { - if(mod->flags&(FLAG_PRIVATE|FLAG_PROTECTED|FLAG_PACKAGEINTERNAL)) - syntaxerror("invalid combination of access levels and namespaces"); - ns.access = ACCESS_NAMESPACE; - const char*url = lookup_namespace(mod->ns); - if(!url) { - if(as3_pass>1) { - syntaxerror("unknown namespace: %s (pass %d)", mod->ns, as3_pass); - } else { - url = mod->ns; - } - } - ns.name = url; - } else if(mod->flags&FLAG_PUBLIC) { - if(mod->flags&(FLAG_PRIVATE|FLAG_PROTECTED|FLAG_PACKAGEINTERNAL)) - syntaxerror("invalid combination of access levels"); - ns.access = ACCESS_PACKAGE; - } else if(mod->flags&FLAG_PRIVATE) { - if(mod->flags&(FLAG_PUBLIC|FLAG_PROTECTED|FLAG_PACKAGEINTERNAL)) - syntaxerror("invalid combination of access levels"); - ns.access = ACCESS_PRIVATE; - } else if(mod->flags&FLAG_PROTECTED) { - if(mod->flags&(FLAG_PUBLIC|FLAG_PRIVATE|FLAG_PACKAGEINTERNAL)) - syntaxerror("invalid combination of access levels"); - ns.access = ACCESS_PROTECTED; - } else { - ns.access = ACCESS_PACKAGEINTERNAL; - } - return ns; -} - -memberinfo_t* findmember_nsset(classinfo_t*cls, const char*name, char recurse, char is_static) -{ - return registry_findmember_nsset(cls, state->active_namespace_urls, name, recurse, is_static); -} - -void innerfunctions2vars(methodstate_t*m) -{ - methodstate_list_t*l = m->innerfunctions; - while(l) { - methodstate_t*m = l->methodstate; - variable_t* v = new_variable2(state->method, m->info->name, TYPE_FUNCTION(m->info), 0, 0); - m->var_index = v->index; - if(m->is_a_slot) - m->slot_index = m->is_a_slot; - v->is_inner_method = m; - l = l->next; - } -} - -void function_initvars(methodstate_t*m, char has_params, params_t*params, int flags, char var0) -{ - if(var0) { - int index = -1; - if(m->inner) - index = new_variable(m, "this", 0, 0, 0); - else if(!m->is_global) - index = new_variable(m, (flags&FLAG_STATIC)?"class":"this", state->cls?state->cls->info:0, 0, 0); - else - index = new_variable(m, "globalscope", 0, 0, 0); - if(index) { - DICT_ITERATE_ITEMS(state->vars, char*, name, variable_t*, v) { - printf("%s %d\n", name, v->index); - } - } - as3_assert(!index); - } - - if(has_params) { - param_list_t*p=0; - for(p=params->list;p;p=p->next) { - variable_t*v = new_variable2(m, p->param->name, p->param->type, 0, 1); - v->is_parameter = 1; - } - if(as3_pass==2 && m->need_arguments) { - /* arguments can never be used by an innerfunction (the inner functions - have their own arguments var), so it's ok to not initialize this until - pass 2. (We don't know whether we need it before, anyway) */ - variable_t*v = new_variable2(m, "arguments", TYPE_ARRAY, 0, 0); - m->need_arguments = v->index; - } - } - - innerfunctions2vars(m); - - if(as3_pass==2) { - m->scope_code = add_scope_code(m->scope_code, m, 0); - if(m->slots) { - /* exchange unresolved identifiers with the actual objects */ - DICT_ITERATE_ITEMS(m->slots, char*, name, variable_t*, v1) { - if(v1->type && v1->type->kind == INFOTYPE_UNRESOLVED) { - classinfo_t*type = (classinfo_t*)registry_resolve((slotinfo_t*)v1->type); - if(!type || type->kind != INFOTYPE_CLASS) { - syntaxerror("Couldn't find class %s::%s (%s)", v1->type->package, v1->type->name, name); - } - v1->type = type; - } - } - } - if(m->allvars) { - DICT_ITERATE_ITEMS(m->allvars, char*, name2, variable_t*, v2) { - if(v2->type && v2->type->kind == INFOTYPE_UNRESOLVED) { - classinfo_t*type = (classinfo_t*)registry_resolve((slotinfo_t*)v2->type); - if(!type || type->kind != INFOTYPE_CLASS) { - syntaxerror("Couldn't find class %s::%s (%s)", v2->type->package, v2->type->name, name2); - } - v2->type = type; - } - } - } - } -} - -char*as3_globalclass=0; -void startclass(modifiers_t* mod, char*classname, classinfo_t*extends, classinfo_list_t*implements) -{ - if(state->cls) { - syntaxerror("inner classes now allowed"); - } - - new_state(); - token_list_t*t=0; - classinfo_list_t*mlist=0; - - if(mod->flags&~(FLAG_PACKAGEINTERNAL|FLAG_PUBLIC|FLAG_FINAL|FLAG_DYNAMIC|FLAG_INTERFACE)) - syntaxerror("invalid modifier(s)"); - - if((mod->flags&(FLAG_PUBLIC|FLAG_PACKAGEINTERNAL)) == (FLAG_PUBLIC|FLAG_PACKAGEINTERNAL)) - syntaxerror("public and internal not supported at the same time."); - - if((mod->flags&(FLAG_PROTECTED|FLAG_STATIC)) == (FLAG_PROTECTED|FLAG_STATIC)) - syntaxerror("protected and static not supported at the same time."); - - //if(!(mod->flags&FLAG_INTERFACE) && !extends) { - if(!(mod->flags&FLAG_INTERFACE) && !extends) { - // all classes extend object - extends = registry_getobjectclass(); - } - - /* create the class name, together with the proper attributes */ - int access=0; - char*package=0; - - if(!(mod->flags&FLAG_PUBLIC) && state->package==internal_filename_package) { - access = ACCESS_PRIVATE; package = internal_filename_package; - } else if(!(mod->flags&FLAG_PUBLIC) && state->package!=internal_filename_package) { - access = ACCESS_PACKAGEINTERNAL; package = state->package; - } else if(state->package!=internal_filename_package) { - access = ACCESS_PACKAGE; package = state->package; - } else { - syntaxerror("public classes only allowed inside a package"); - } - - if(as3_pass==1) { - state->cls = rfx_calloc(sizeof(classstate_t)); - state->cls->init = methodstate_new(); - state->cls->static_init = methodstate_new(); - state->cls->static_init->is_static=FLAG_STATIC; - /* notice: we make no effort to initialize the top variable (local0) here, - even though it has special meaning. We just rely on the fact - that pass 1 won't do anything with variables */ - - dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, state->cls); - - /* set current method to constructor- all code within the class-level (except - static variable initializations) will be executed during construction time */ - state->method = state->cls->init; - - if(registry_find(package, classname)) { - syntaxerror("Package \"%s\" already contains a class called \"%s\"", package, classname); - } - /* build info struct */ - int num_interfaces = (list_length(implements)); - state->cls->info = classinfo_register(access, package, classname, num_interfaces); - state->cls->info->flags |= mod->flags & (FLAG_DYNAMIC|FLAG_INTERFACE|FLAG_FINAL); - state->cls->info->superclass = extends; - - int pos = 0; - classinfo_list_t*l = implements; - for(l=implements;l;l=l->next) { - state->cls->info->interfaces[pos++] = l->classinfo; - } - } - - if(as3_pass == 2) { - state->cls = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); - - as3_assert(state->cls && state->cls->info); - - state->method = state->cls->static_init; - - function_initvars(state->cls->init, 0, 0, 0, 1); - state->cls->static_init->variable_count=1; - function_initvars(state->cls->static_init, 0, 0, 0, 0); - - if(extends && (extends->flags & FLAG_FINAL)) - syntaxerror("Can't extend final class '%s'", extends->name); - - int pos = 0; - while(state->cls->info->interfaces[pos]) { - if(!(state->cls->info->interfaces[pos]->flags & FLAG_INTERFACE)) - syntaxerror("'%s' is not an interface", - state->cls->info->interfaces[pos]->name); - pos++; - } - - /* generate the abc code for this class */ - MULTINAME(classname2,state->cls->info); - multiname_t*extends2 = sig2mname(extends); - - /* don't add the class to the class index just yet- that will be done later - by initscript */ - state->cls->abc = abc_class_new(0, &classname2, extends2); - state->cls->abc->file = global->file; - - multiname_destroy(extends2); - if(state->cls->info->flags&FLAG_FINAL) abc_class_final(state->cls->abc); - if(!(state->cls->info->flags&FLAG_DYNAMIC)) abc_class_sealed(state->cls->abc); - if(state->cls->info->flags&FLAG_INTERFACE) { - abc_class_interface(state->cls->abc); - } - - for(mlist=implements;mlist;mlist=mlist->next) { - MULTINAME(m, mlist->classinfo); - abc_class_add_interface(state->cls->abc, &m); - } - - state->cls->dependencies = parsedclass_new(state->cls->info, state->cls->abc); - list_append(global->classes, state->cls->dependencies); - - /* flash.display.MovieClip handling */ - if(!as3_globalclass && (mod->flags&FLAG_PUBLIC) && slotinfo_equals((slotinfo_t*)registry_getMovieClip(),(slotinfo_t*)extends)) { - if(state->package && state->package[0]) { - as3_globalclass = concat3(state->package, ".", classname); - } else { - as3_globalclass = strdup(classname); - } - } - } -} - -void endclass() -{ - if(as3_pass == 2) { - if(!state->cls->has_constructor && !(state->cls->info->flags&FLAG_INTERFACE)) { - code_t*c = 0; - c = abc_getlocal_0(c); - c = abc_constructsuper(c, 0); - state->cls->init->header = code_append(state->cls->init->header, c); - state->cls->has_constructor=1; - } - if(state->cls->init) { - if(state->cls->info->flags&FLAG_INTERFACE) { - if(state->cls->init->header) - syntaxerror("interface can not have class-level code"); - } else { - abc_method_t*m = abc_class_getconstructor(state->cls->abc, 0); - code_t*c = method_header(state->cls->init); - m->body->code = wrap_function(c, 0, m->body->code); - } - } - if(state->cls->static_init) { - abc_method_t*m = abc_class_getstaticconstructor(state->cls->abc, 0); - code_t*c = method_header(state->cls->static_init); - m->body->code = wrap_function(c, 0, m->body->code); - } - - trait_list_t*trait = state->cls->abc->traits; - /* switch all protected members to the protected ns of this class */ - while(trait) { - trait_t*t = trait->trait; - if(t->name->ns->access == ACCESS_PROTECTED) { - if(!state->cls->abc->protectedNS) { - char*n = concat3(state->cls->info->package, ":", state->cls->info->name); - state->cls->abc->protectedNS = namespace_new_protected(n); - state->cls->abc->flags |= CLASS_PROTECTED_NS; - } - t->name->ns->name = strdup(state->cls->abc->protectedNS->name); - } - trait = trait->next; - } - } - - old_state(); -} - -void check_code_for_break(code_t*c) -{ - while(c) { - if(c->opcode == OPCODE___BREAK__) { - char*name = string_cstr(c->data[0]); - syntaxerror("Unresolved \"break %s\"", name); - } - if(c->opcode == OPCODE___CONTINUE__) { - char*name = string_cstr(c->data[0]); - syntaxerror("Unresolved \"continue %s\"", name); - } - if(c->opcode == OPCODE___RETHROW__) { - syntaxerror("Unresolved \"rethrow\""); - } - if(c->opcode == OPCODE___FALLTHROUGH__) { - syntaxerror("Unresolved \"fallthrough\""); - } - if(c->opcode == OPCODE___PUSHPACKAGE__) { - char*name = string_cstr(c->data[0]); - syntaxerror("Can't reference a package (%s) as such", name); - } - c=c->prev; - } -} - -void check_constant_against_type(classinfo_t*t, constant_t*c) -{ -#define xassert(b) if(!(b)) syntaxerror("Invalid default value %s for type '%s'", constant_tostring(c), t->name) - if(TYPE_IS_NUMBER(t)) { - xassert(c->type == CONSTANT_FLOAT - || c->type == CONSTANT_INT - || c->type == CONSTANT_UINT); - } else if(TYPE_IS_UINT(t)) { - xassert(c->type == CONSTANT_UINT || - (c->type == CONSTANT_INT && c->i>=0)); - } else if(TYPE_IS_INT(t)) { - xassert(c->type == CONSTANT_INT); - } else if(TYPE_IS_BOOLEAN(t)) { - xassert(c->type == CONSTANT_TRUE - || c->type == CONSTANT_FALSE); - } -} - -void check_override(memberinfo_t*m, int flags) -{ - if(!m) - return; - if(m->parent == state->cls->info && !((flags^m->flags)&FLAG_STATIC)) - syntaxerror("class '%s' already contains a method/slot '%s'", m->parent->name, m->name); - if(!m->parent) - syntaxerror("internal error: overriding method %s, which doesn't have parent", m->name); - if(m->access==ACCESS_PRIVATE) - return; - if(m->flags & FLAG_FINAL) - syntaxerror("can't override final member %s", m->name); - - /* allow this. it's no issue. - if((m->flags & FLAG_STATIC) && !(flags&FLAG_STATIC)) - syntaxerror("can't override static member %s", m->name);*/ - - if(!(m->flags & FLAG_STATIC) && (flags&FLAG_STATIC)) - syntaxerror("can't override non-static member %s with static declaration", m->name); - - if(!(flags&FLAG_OVERRIDE) && !(flags&FLAG_STATIC) && !(m->flags&FLAG_STATIC)) { - if(m->parent && !(m->parent->flags&FLAG_INTERFACE)) { - if(m->kind == INFOTYPE_METHOD) - syntaxerror("can't override without explicit 'override' declaration"); - else - syntaxerror("can't override '%s'", m->name); - } - } -} - -methodinfo_t*registerfunction(enum yytokentype getset, modifiers_t*mod, char*name, params_t*params, classinfo_t*return_type, int slot) -{ - methodinfo_t*minfo = 0; - namespace_t ns = modifiers2access(mod); - if(!state->cls) { - //package method - minfo = methodinfo_register_global(ns.access, state->package, name); - minfo->return_type = return_type; - } else if(getset != KW_GET && getset != KW_SET) { - //class method - memberinfo_t* m = registry_findmember(state->cls->info, ns.name, name, 0, mod->flags&FLAG_STATIC); - if(m) { - syntaxerror("class already contains a %s '%s'", infotypename((slotinfo_t*)m), m->name); - } - minfo = methodinfo_register_onclass(state->cls->info, ns.access, ns.name, name, mod->flags&FLAG_STATIC); - minfo->return_type = return_type; - // getslot on a member slot only returns "undefined", so no need - // to actually store these - //state->minfo->slot = state->method->abc->method->trait->slot_id; - } else { - //class getter/setter - int gs = getset==KW_GET?SUBTYPE_GET:SUBTYPE_SET; - classinfo_t*type=0; - if(getset == KW_GET) { - type = return_type; - } else if(params->list && params->list->param && !params->list->next) { - type = params->list->param->type; - } else - syntaxerror("setter function needs to take exactly one argument"); - // not sure wether to look into superclasses here, too - minfo = (methodinfo_t*)registry_findmember(state->cls->info, ns.name, name, 1, mod->flags&FLAG_STATIC); - if(minfo) { - if(minfo->kind!=INFOTYPE_VAR) - syntaxerror("class already contains a method called '%s'", name); - if(!(minfo->subtype & (SUBTYPE_GETSET))) - syntaxerror("class already contains a field called '%s'", name); - if(minfo->subtype & gs) - syntaxerror("getter/setter for '%s' already defined", name); - /* make a setter or getter into a getset */ - minfo->subtype |= gs; - - /* - FIXME: this check needs to be done in pass 2 - - if((!minfo->return_type != !type) || - (minfo->return_type && type && - !strcmp(minfo->return_type->name, type->name))) { - syntaxerror("different type in getter and setter: %s and %s", - minfo->return_type?minfo->return_type->name:"*", - type?type->name:"*"); - }*/ - } else { - minfo = methodinfo_register_onclass(state->cls->info, ns.access, ns.name, name, mod->flags&FLAG_STATIC); - minfo->kind = INFOTYPE_VAR; //hack - minfo->subtype = gs; - minfo->return_type = type; - } - - /* can't assign a slot as getter and setter might have different slots */ - //minfo->slot = slot; - } - if(mod->flags&FLAG_FINAL) minfo->flags |= FLAG_FINAL; - if(mod->flags&FLAG_STATIC) minfo->flags |= FLAG_STATIC; - if(mod->flags&FLAG_OVERRIDE) minfo->flags |= FLAG_OVERRIDE; - - return minfo; -} - -void innerfunction(char*name, params_t*params, classinfo_t*return_type) -{ - //as3_assert(state->method && state->method->info); - - methodstate_t*parent_method = state->method; - variable_t*v = 0; - - if(as3_pass==1) { - return_type = 0; // not valid in pass 1 - if(name) { - v = new_variable2(parent_method, name, 0, 0, 0); - } - } - - new_state(); - state->new_vars = 1; - - if(as3_pass == 1) { - state->method = methodstate_new(); - state->method->inner = 1; - state->method->is_static = parent_method->is_static; - state->method->variable_count = 0; - state->method->abc = rfx_calloc(sizeof(abc_method_t)); - if(v) { - v->is_inner_method = state->method; - } - - NEW(methodinfo_t,minfo); - minfo->kind = INFOTYPE_METHOD; - minfo->access = ACCESS_PACKAGEINTERNAL; - minfo->name = name; - state->method->info = minfo; - - if(parent_method) - list_append(parent_method->innerfunctions, state->method); - - dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, state->method); - - function_initvars(state->method, 1, params, 0, 1); - } - - if(as3_pass == 2) { - state->method = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); - state->method->variable_count = 0; - as3_assert(state->method); - - state->method->info->return_type = return_type; - function_initvars(state->method, 1, params, 0, 1); - } -} - - -void startfunction(modifiers_t*mod, enum yytokentype getset, char*name, - params_t*params, classinfo_t*return_type) -{ - if(state->method && state->method->info) { - syntaxerror("not able to start another method scope"); - } - new_state(); - state->new_vars = 1; - - if(as3_pass == 1) { - state->method = methodstate_new(); - state->method->has_super = 0; - state->method->is_static = mod->flags&FLAG_STATIC; - - if(state->cls) { - state->method->is_constructor = !strcmp(state->cls->info->name,name); - } else { - state->method->is_global = 1; - state->method->late_binding = 1; // for global methods, always push local_0 on the scope stack - } - if(state->method->is_constructor) - name = "__as3_constructor__"; - - state->method->info = registerfunction(getset, mod, name, params, return_type, 0); - - function_initvars(state->method, 1, params, mod->flags, 1); - - dict_put(global->token2info, (void*)(ptroff_t)as3_tokencount, state->method); - } - - if(as3_pass == 2) { - state->method = dict_lookup(global->token2info, (void*)(ptroff_t)as3_tokencount); - - if(!state->method->no_variable_scoping) - state->method->variable_count = 0; - - as3_assert(state->method); - - if(state->cls) { - memberinfo_t*m = registry_findmember(state->cls->info, mod->ns, name, 2, mod->flags&FLAG_STATIC); - check_override(m, mod->flags); - } - - if(state->cls) { - state->cls->has_constructor |= state->method->is_constructor; - } - - function_initvars(state->method, 1, params, mod->flags, 1); - } -} - -void insert_unresolved(methodstate_t*m, dict_t*xvars, dict_t*allvars) -{ - as3_assert(m->inner); - if(m->unresolved_variables) { - dict_t*d = m->unresolved_variables; - int t; - DICT_ITERATE_KEY(d, char*, id) { - /* check parent method's variables */ - variable_t*v; - if(dict_contains(allvars, id)) { - m->uses_parent_function = 1; - state->method->uses_slots = 1; - dict_put(xvars, id, 0); - } - } - } - methodstate_list_t*ml = m->innerfunctions; - while(ml) { - insert_unresolved(ml->methodstate, xvars, allvars); - ml = ml->next; - } -} - -abc_method_t* endfunction(modifiers_t*mod, enum yytokentype getset, - char*name, params_t*params, classinfo_t*return_type, - code_t*body) -{ - if(as3_pass==1) { - dict_t*xvars = dict_new(); - - if(state->method->unresolved_variables) { - DICT_ITERATE_KEY(state->method->unresolved_variables, char*, vname) { - if(!state->method->no_variable_scoping && dict_contains(state->method->allvars, vname)) { - variable_t*v = dict_lookup(state->method->allvars, vname); - if(!v->is_inner_method) { - state->method->no_variable_scoping = 1; - as3_warning("function %s uses forward or outer block variable references (%s): switching into compatibility mode", name, vname); - } - } - } - } - - methodstate_list_t*ml = state->method->innerfunctions; - while(ml) { - insert_unresolved(ml->methodstate, xvars, state->method->allvars); - ml = ml->next; - } - - if(state->method->uses_slots) { - state->method->slots = dict_new(); - int i = 1; - DICT_ITERATE_ITEMS(state->method->allvars, char*, name, variable_t*, v) { - if(!name) syntaxerror("internal error"); - if(v->index && dict_contains(xvars, name)) { - v->init = v->kill = 0; - v->index = i; - if(v->is_inner_method) { - v->is_inner_method->is_a_slot = i; - } - i++; - dict_put(state->method->slots, name, v); - } - } - state->method->uses_slots = i; - dict_destroy(state->vars);state->vars = 0; - as3_assert(state->new_vars); - } - old_state(); - return 0; - } - - if(as3_pass==2) { - /*if(state->method->uses_parent_function){ - syntaxerror("accessing variables of parent function from inner functions not supported yet"); - }*/ - - abc_method_t*f = 0; - - multiname_t*type2 = sig2mname(return_type); - int slot = 0; - if(state->method->inner) { - f = state->method->abc; - abc_method_init(f, global->file, type2, 1); - } else if(state->method->is_constructor) { - f = abc_class_getconstructor(state->cls->abc, type2); - } else if(!state->method->is_global) { - namespace_t ns = modifiers2access(mod); - multiname_t mname = {QNAME, &ns, 0, name}; - if(mod->flags&FLAG_STATIC) - f = abc_class_staticmethod(state->cls->abc, type2, &mname); - else - f = abc_class_method(state->cls->abc, type2, &mname); - slot = f->trait->slot_id; - } else { - namespace_t mname_ns = {state->method->info->access, state->package}; - multiname_t mname = {QNAME, &mname_ns, 0, name}; - - f = abc_method_new(global->file, type2, 1); - if(!global->init) global->init = abc_initscript(global->file); - trait_t*t = trait_new_method(&global->init->traits, multiname_clone(&mname), f); - //abc_code_t*c = global->init->method->body->code; - } - //flash doesn't seem to allow us to access function slots - //state->method->info->slot = slot; - - if(mod && mod->flags&FLAG_OVERRIDE) f->trait->attributes |= TRAIT_ATTR_OVERRIDE; - if(getset == KW_GET) f->trait->kind = TRAIT_GETTER; - if(getset == KW_SET) f->trait->kind = TRAIT_SETTER; - if(params->varargs) f->flags |= METHOD_NEED_REST; - if(state->method->need_arguments) f->flags |= METHOD_NEED_ARGUMENTS; - - char opt=0; - param_list_t*p=0; - for(p=params->list;p;p=p->next) { - if(params->varargs && !p->next) { - break; //varargs: omit last parameter in function signature - } - multiname_t*m = sig2mname(p->param->type); - list_append(f->parameters, m); - if(p->param->value) { - check_constant_against_type(p->param->type, p->param->value); - opt=1;list_append(f->optional_parameters, p->param->value); - } else if(opt) { - syntaxerror("function %s: non-optional parameter not allowed after optional parameters", name); - } - } - if(state->method->slots) { - DICT_ITERATE_ITEMS(state->method->slots, char*, name, variable_t*, v) { - if(v->index) { - multiname_t*mname = multiname_new(namespace_new(ACCESS_PACKAGE, ""), name); - multiname_t*type = sig2mname(v->type); - trait_t*t = trait_new_member(&f->body->traits, type, mname, 0); - t->slot_id = v->index; - } - } - } - - check_code_for_break(body); - - /* Seems this works now. - if(state->method->exceptions && state->method->uses_slots) { - as3_warning("try/catch and activation not supported yet within the same method"); - }*/ - - if(f->body) { - f->body->code = body; - f->body->exceptions = state->method->exceptions; - } else { //interface - if(body) - syntaxerror("interface methods can't have a method body"); - } - - old_state(); - return f; - } - - return 0; -} - -void breakjumpsto(code_t*c, char*name, code_t*jump) -{ - while(c) { - if(c->opcode == OPCODE___BREAK__) { - string_t*name2 = c->data[0]; - if(!name2->len || !strncmp(name2->str, name, name2->len)) { - c->opcode = OPCODE_JUMP; - c->branch = jump; - } - } - c=c->prev; - } -} - -void continuejumpsto(code_t*c, char*name, code_t*jump) -{ - while(c) { - if(c->opcode == OPCODE___CONTINUE__) { - string_t*name2 = c->data[0]; - if(!name2->len || !strncmp(name2->str, name, name2->len)) { - c->opcode = OPCODE_JUMP; - c->branch = jump; - } - } - c = c->prev; - } -} - -code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to) -{ - if(from==to) - return c; - if(!to) { - return abc_coerce_a(c); - } - MULTINAME(m, to); - if(!from) { - // cast an "any" type to a specific type. subject to - // runtime exceptions - return abc_coerce2(c, &m); - } - - if((TYPE_IS_NUMBER(from) || TYPE_IS_UINT(from) || TYPE_IS_INT(from)) && - (TYPE_IS_NUMBER(to) || TYPE_IS_UINT(to) || TYPE_IS_INT(to))) { - // allow conversion between number types - if(TYPE_IS_UINT(to)) - return abc_convert_u(c); - else if(TYPE_IS_INT(to)) - return abc_convert_i(c); - else if(TYPE_IS_NUMBER(to)) - return abc_convert_d(c); - return abc_coerce2(c, &m); - } - /* allow conversion from string to number */ - if(TYPE_IS_STRING(from) && TYPE_IS_NUMBER(to)) { - return abc_convert_d(c); - } - - if(TYPE_IS_XMLLIST(to) && TYPE_IS_XML(from)) - return c; - - if(TYPE_IS_BOOLEAN(to)) - return abc_convert_b(c); - if(TYPE_IS_STRING(to)) - return abc_convert_s(c); - if(TYPE_IS_OBJECT(to)) - return abc_coerce2(c, &m); - if(TYPE_IS_OBJECT(from) && TYPE_IS_XMLLIST(to)) - return abc_coerce2(c, &m); - if(TYPE_IS_OBJECT(from) && TYPE_IS_ARRAY(to)) - return abc_coerce2(c, &m); - - classinfo_t*supertype = from; - while(supertype) { - if(supertype == to) { - /* target type is one of from's superclasses. - (not sure we need this coerce - as far as the verifier - is concerned, object==object (i think) */ - return abc_coerce2(c, &m); - } - int t=0; - while(supertype->interfaces[t]) { - if(supertype->interfaces[t]==to) { - // target type is one of from's interfaces - return abc_coerce2(c, &m); - } - t++; - } - supertype = supertype->superclass; - } - if(TYPE_IS_FUNCTION(from) && TYPE_IS_FUNCTION(to)) - return c; - if(TYPE_IS_CLASS(from) && TYPE_IS_CLASS(to)) - return c; - if(TYPE_IS_NULL(from) && !IS_NUMBER_OR_INT(to)) - return c; - - - as3_error("can't convert type %s%s%s to %s%s%s", - from->package, from->package[0]?".":"", from->name, - to->package, to->package[0]?".":"", to->name); - - return c; -} - -code_t* coerce_to_type(code_t*c, classinfo_t*t) -{ - if(!t) { - return abc_coerce_a(c); - } else if(TYPE_IS_STRING(t)) { - return abc_coerce_s(c); - } else { - MULTINAME(m, t); - return abc_coerce2(c, &m); - } -} - -char is_pushundefined(code_t*c) -{ - return (c && !c->prev && !c->next && c->opcode == OPCODE_PUSHUNDEFINED); -} - -const char* get_package_from_name(const char*name) -{ - /* try explicit imports */ - dictentry_t* e = dict_get_slot(state->imports, name); - while(e) { - if(!strcmp(e->key, name)) { - slotinfo_t*c = (slotinfo_t*)e->data; - if(c) return c->package; - } - e = e->next; - } - return 0; -} - -namespace_list_t*get_current_imports() -{ - namespace_list_t*searchlist = 0; - - list_append(searchlist, namespace_new_package(state->package)); - - import_list_t*l = state->wildcard_imports; - while(l) { - namespace_t*ns = namespace_new_package(l->import->package); - list_append(searchlist, ns); - l = l->next; - } - list_append(searchlist, namespace_new_package("")); - list_append(searchlist, namespace_new_package(internal_filename_package)); - return searchlist; -} - -slotinfo_t* find_class(const char*name) -{ - slotinfo_t*c=0; - - c = registry_find(state->package, name); - if(c) return c; - - /* try explicit imports */ - dictentry_t* e = dict_get_slot(state->imports, name); - if(c) return c; - while(e) { - if(!strcmp(e->key, name)) { - c = (slotinfo_t*)e->data; - if(c) return c; - } - e = e->next; - } - - /* try package.* imports */ - import_list_t*l = state->wildcard_imports; - while(l) { - //printf("does package %s contain a class %s?\n", l->import->package, name); - c = registry_find(l->import->package, name); - if(c) return c; - l = l->next; - } - - /* try global package */ - c = registry_find("", name); - if(c) return c; - - /* try local "filename" package */ - c = registry_find(internal_filename_package, name); - if(c) return c; - - return 0; -} - -typedcode_t push_class(slotinfo_t*a) -{ - typedcode_t x; - x.c = 0; - x.t = 0; - if(a->access == ACCESS_PACKAGEINTERNAL && - strcmp(a->package, state->package) && - strcmp(a->package, internal_filename_package) - ) { - syntaxerror("Can't access internal %s %s in package '%s' from package '%s'", - infotypename(a), a->name, a->package, state->package); - } - - - if(a->kind != INFOTYPE_CLASS) { - MULTINAME(m, a); - x.c = abc_findpropstrict2(x.c, &m); - x.c = abc_getproperty2(x.c, &m); - if(a->kind == INFOTYPE_METHOD) { - methodinfo_t*f = (methodinfo_t*)a; - x.t = TYPE_FUNCTION(f); - } else { - varinfo_t*v = (varinfo_t*)a; - x.t = v->type; - } - return x; - } else { - if(state->cls && state->method == state->cls->static_init) { - /* we're in the static initializer. - record the fact that we're using this class here */ - parsedclass_add_dependency(state->cls->dependencies, (classinfo_t*)a); - } - classinfo_t*c = (classinfo_t*)a; - //if(c->slot) { - if(0) { //Error #1026: Slot 1 exceeds slotCount=0 of global - x.c = abc_getglobalscope(x.c); - x.c = abc_getslot(x.c, c->slot); - } else { - MULTINAME(m, c); - x.c = abc_getlex2(x.c, &m); - } - x.t = TYPE_CLASS(c); - } - return x; -} - -char is_break_or_jump(code_t*c) -{ - if(!c) - return 0; - if(c->opcode == OPCODE_JUMP || - c->opcode == OPCODE___BREAK__ || - c->opcode == OPCODE___CONTINUE__ || - c->opcode == OPCODE_THROW || - c->opcode == OPCODE_RETURNVOID || - c->opcode == OPCODE_RETURNVALUE) { - return 1; - } - return 0; -} - -#define IS_FINALLY_TARGET(op) \ - ((op) == OPCODE___CONTINUE__ || \ - (op) == OPCODE___BREAK__ || \ - (op) == OPCODE_RETURNVOID || \ - (op) == OPCODE_RETURNVALUE || \ - (op) == OPCODE___RETHROW__) - -static code_t* insert_finally_lookup(code_t*c, code_t*finally, int tempvar) -{ -#define NEED_EXTRA_STACK_ARG - code_t*finally_label = abc_nop(0); - NEW(lookupswitch_t, l); - //_lookupswitch - - code_t*i = c; - int count=0; - while(i) { - code_t*prev = i->prev; - if(IS_FINALLY_TARGET(i->opcode)) { - code_t*p = prev; - char needvalue=0; - if(i->opcode == OPCODE___RETHROW__ || - i->opcode == OPCODE_RETURNVALUE) { - if(i->opcode == OPCODE___RETHROW__) - i->opcode = OPCODE_THROW; - needvalue=1; - p = abc_coerce_a(p); - p = abc_setlocal(p, tempvar); - } - p = abc_pushbyte(p, count++); - p = abc_jump(p, finally_label); - code_t*target = p = abc_label(p); -#ifdef NEED_EXTRA_STACK_ARG - p = abc_pop(p); -#endif - if(needvalue) { - p = abc_getlocal(p, tempvar); - } - - p->next = i;i->prev = p; - list_append(l->targets, target); - } - i = prev; - } - - code_t*j,*f; - c = abc_pushbyte(c, -1); - c = code_append(c, finally_label); - c = code_append(c, finally); - -#ifdef NEED_EXTRA_STACK_ARG - c = abc_dup(c); -#endif - c = abc_lookupswitch(c, l); - c = l->def = abc_label(c); -#ifdef NEED_EXTRA_STACK_ARG - c = abc_pop(c); -#endif - - return c; -} - -static code_t* insert_finally_simple(code_t*c, code_t*finally, int tempvar) -{ - code_t*i = c; - while(i) { - code_t*prev = i->prev; - if(IS_FINALLY_TARGET(i->opcode)) { - if(i->opcode == OPCODE___RETHROW__) - i->opcode = OPCODE_THROW; - code_t*end = code_dup(finally); - code_t*start = code_start(end); - if(prev) prev->next = start; - start->prev = prev; - i->prev = end; - end->next = i; - } - i = prev; - } - return code_append(c, finally); -} - -code_t* insert_finally(code_t*c, code_t*finally, int tempvar) -{ - if(!finally) - return c; - code_t*i = c; - char cantdup=0; - int num_insertion_points=0; - while(i) { - if(IS_FINALLY_TARGET(i->opcode)) - num_insertion_points++; - i = i->prev; - } - i = finally; - int code_size=0; - while(i) { - code_size++; - if(i->branch || i->opcode == OPCODE_LOOKUPSWITCH) { - cantdup=1; - } - i = i->prev; - } - int simple_version_cost = (1+num_insertion_points)*code_size; - int lookup_version_cost = 4*num_insertion_points + 5; - - if(cantdup || simple_version_cost > lookup_version_cost) { - //printf("(use lookup) simple=%d > lookup=%d\n", simple_version_cost, lookup_version_cost); - return insert_finally_lookup(c, finally, tempvar); - } else { - //printf("(use simple) simple=%d < lookup=%d\n", simple_version_cost, lookup_version_cost); - return insert_finally_simple(c, finally, tempvar); - } -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.h deleted file mode 100644 index 5ee8751b3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/parser_help.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef __parse_help__ -#define __parse_help__ - -#include "state.h" -#include "expr.h" -#include "tokenizer.h" -#include "common.h" - -typedef struct _global { - abc_file_t*file; - - parsedclass_list_t*classes; - abc_script_t*classinit; - - abc_script_t*init; //package-level code - - dict_t*token2info; - dict_t*file2token2info; -} global_t; - -extern global_t*global; - -typedef struct _variable { - int index; - classinfo_t*type; - char init; - char kill; - char is_parameter; - methodstate_t*is_inner_method; -} variable_t; - -void initialize_file(char*filename); -void finish_file(); - -void initialize_parser(); -void* finish_parser(); - -#define FLAG_PUBLIC 256 -#define FLAG_PROTECTED 512 -#define FLAG_PRIVATE 1024 -#define FLAG_PACKAGEINTERNAL 2048 -#define FLAG_NAMESPACE 4096 - -slotinfo_t* find_class(const char*name); -char is_break_or_jump(code_t*c); -code_t* insert_finally(code_t*c, code_t*finally, int tempvar); -typedcode_t push_class(slotinfo_t*a); -slotinfo_t* find_class(const char*name); -namespace_list_t*get_current_imports(); -const char* get_package_from_name(const char*name); -char is_pushundefined(code_t*c); -code_t* coerce_to_type(code_t*c, classinfo_t*t); -code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to); -void continuejumpsto(code_t*c, char*name, code_t*jump); -void breakjumpsto(code_t*c, char*name, code_t*jump); -void insert_unresolved(methodstate_t*m, dict_t*xvars, dict_t*allvars); -void startfunction(modifiers_t*mod, enum yytokentype getset, char*name, params_t*params, classinfo_t*return_type); -void function_initvars(methodstate_t*m, char has_params, params_t*params, int flags, char var0); -abc_method_t* endfunction(modifiers_t*mod, enum yytokentype getset, char*name, params_t*params, classinfo_t*return_type, code_t*body); -void innerfunction(char*name, params_t*params, classinfo_t*return_type); -methodinfo_t*registerfunction(enum yytokentype getset, modifiers_t*mod, char*name, params_t*params, classinfo_t*return_type, int slot); -void check_override(memberinfo_t*m, int flags); -void check_constant_against_type(classinfo_t*t, constant_t*c); -void check_code_for_break(code_t*c); -void startclass(modifiers_t* mod, char*classname, classinfo_t*extends, classinfo_list_t*implements); -void endclass(); -void innerfunctions2vars(methodstate_t*m); -memberinfo_t* findmember_nsset(classinfo_t*cls, const char*name, char recurse, char is_static); -namespace_t modifiers2access(modifiers_t*mod); -const char* lookup_namespace(const char*name); -void startpackage(char*name); -void endpackage(); -code_t* wrap_function(code_t*c,code_t*header, code_t*body); -code_t* method_header(methodstate_t*m); -code_t* add_scope_code(code_t*c, methodstate_t*m, char init); -void unknown_variable(char*name); -code_t* var_block(code_t*body, dict_t*vars); -int gettempvar(); -int new_variable(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot); -variable_t* new_variable2(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot); -int alloc_local(); -code_t*defaultvalue(code_t*c, classinfo_t*type); -char variable_exists(char*name); -variable_t* find_variable_safe(state_t*s, char*name); -variable_t* find_variable(state_t*s, const char*name); -variable_t* find_slot(methodstate_t*m, const char*name); -code_t* method_header(methodstate_t*m); -code_t* wrap_function(code_t*c,code_t*header, code_t*body); -void function_initvars(methodstate_t*m, char has_params, params_t*params, int flags, char var0); -void state_destroy(state_t*state); -void as3_set_define(const char*c); - -/* protected handling here is a big hack: we just assume the protectedns - is package:class. the correct approach would be to add the proper - namespace to all protected members in the registry, even though that - would slow down searching */ -#define MEMBER_MULTINAME(m,f,n) \ - multiname_t m;\ - namespace_t m##_ns;\ - if(f) { \ - m##_ns.access = ((slotinfo_t*)(f))->access; \ - if(m##_ns.access == ACCESS_NAMESPACE) \ - m##_ns.name = ((slotinfo_t*)(f))->package; \ - else if(m##_ns.access == ACCESS_PROTECTED && (f)->parent) \ - m##_ns.name = concat3((f)->parent->package,":",(f)->parent->name); \ - else \ - m##_ns.name = ""; \ - m.type = QNAME; \ - m.ns = &m##_ns; \ - m.namespace_set = 0; \ - m.name = ((slotinfo_t*)(f))->name; \ - } else { \ - m.type = MULTINAME; \ - m.ns =0; \ - m.namespace_set = &nopackage_namespace_set; \ - m.name = n; \ - } - -/* warning: list length of namespace set is undefined */ -#define MULTINAME_LATE(m, access, package) \ - namespace_t m##_ns = {access, package}; \ - namespace_set_t m##_nsset; \ - namespace_list_t m##_l;m##_l.next = 0; \ - m##_nsset.namespaces = &m##_l; \ - m##_nsset = m##_nsset; \ - m##_l.namespace = &m##_ns; \ - multiname_t m = {MULTINAMEL, 0, &m##_nsset, 0}; - -extern namespace_t stdns; -extern namespace_set_t nopackage_namespace_set; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.c deleted file mode 100644 index 691086263..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.c +++ /dev/null @@ -1,1403 +0,0 @@ -/* pool.c - - Routines for handling Flash2 AVM2 ABC contantpool entries. - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include "pool.h" - - -// ----------------------------- float ---------------------------------- - -void* float_clone(const void*_v) { - if(_v==0) - return 0; - const double*v1=_v; - double*v2 = malloc(sizeof(double)); - *v2 = *v1; - return v2; -} -unsigned int float_hash(const void*_v) { - if(!_v) - return 0; - const unsigned char*b=_v; - unsigned int h=0; - int t; - for(t=0;t<8;t++) - h = crc32_add_byte(h, b[t]); - return h; -} -void float_destroy(void*_v) { - double*v = (double*)_v; - if(v) - free(v); -} -char float_equals(const void*_v1, const void*_v2) { - const double*v1=_v1; - const double*v2=_v2; - if(!v1 || !v2) - return v1==v2; - - if(*v1==*v2) return 1; - if(*v1!=*v1 && *v2!=*v2) return 1; //both values are NaN - return 0; -} - -type_t float_type = { - dup: float_clone, - hash: float_hash, - free: float_destroy, - equals: float_equals -}; - -// ----------------------------- uint ---------------------------------- - -unsigned int undefined_uint = 0; - -void*uint_clone(const void*_v) { - if(!_v) - return 0; - const unsigned int*v1=_v; - unsigned int*v2 = malloc(sizeof(unsigned int)); - *v2 = *v1; - return v2; -} -unsigned int uint_hash(const void*_v) { - if(!_v) - return 0; - const unsigned int*v=_v; - return *v; -} -void uint_destroy(void*_v) { - unsigned int*v = (unsigned int*)_v; - if(v) - free(v); -} -char uint_equals(const void*_v1, const void*_v2) { - const unsigned int*v1=_v1; - const unsigned int*v2=_v2; - if(!v1 || !v2) - return v1==v2; - return *v1==*v2; -} - -type_t uint_type = { - dup: (dup_func)uint_clone, - hash: (hash_func)uint_hash, - free: (free_func)uint_destroy, - equals: (equals_func)uint_equals -}; - -// ----------------------------- namespace ---------------------------------- - -unsigned int namespace_hash(namespace_t*n) -{ - if(!n) - return 0; - unsigned int hash = 0; - hash = crc32_add_byte(hash, n->access); - hash = crc32_add_string(hash, n->name); - return hash; -} - -unsigned char namespace_equals(const namespace_t*n1, const namespace_t*n2) -{ - if(!n1 || !n2) - return n1==n2; - if(n1->access != n2->access) - return 0; - if(!(n1->name) != !(n2->name)) - return 0; - if(n1->name && n2->name && strcmp(n1->name, n2->name)) - return 0; - return 1; -} - -char*escape_string(const char*str) -{ - if(!str) - return strdup("NULL"); - int len=0; - unsigned const char*s=(unsigned const char*)str; - while(*s) { - if(*s<10) { - len+=2; // \d - } else if(*s<32) { - len+=3; // \dd - } else if(*s<127) { - len++; - } else { - len+=4; // \xhh - } - s++; - } - char*newstr = malloc(len+1); - char*dest = newstr; - s=(unsigned const char*)str; - while(*s) { - if(*s<9) { - dest+=sprintf(dest, "\\%d", *s); - } else if(*s<32) { - if(*s==13) - dest+=sprintf(dest, "\\r"); - else if(*s==10) - dest+=sprintf(dest, "\\n"); - else if(*s==9) - dest+=sprintf(dest, "\\t"); - else - dest+=sprintf(dest, "\\%2o", *s); - } else if(*s<127) { - *dest++=*s; - } else { - dest+=sprintf(dest, "\\x%02x", *s); - } - s++; - } - *dest = 0; - return newstr; -} - -char* namespace_tostring(namespace_t*ns) -{ - if(!ns) - return strdup("NULL"); - char*access = 0; - U8 type = ns->access; - access = access2str(type); - char*s = escape_string(ns->name); - char*string = (char*)malloc(strlen(access)+strlen(s)+7); - if(!s) - sprintf(string, "[%s]NULL", access); - else if(!*s) - sprintf(string, "[%s]\"\"", access); - else - sprintf(string, "[%s]%s", access, s); - free(s); - return string; -} - -namespace_t* namespace_clone(namespace_t*other) -{ - if(!other) - return 0; - NEW(namespace_t,n); - n->access = other->access; - n->name = other->name?strdup(other->name):0; - return n; -} - -namespace_t* namespace_fromstring(const char*name) -{ - namespace_t*ns = malloc(sizeof(namespace_t)); - memset(ns, 0, sizeof(namespace_t)); - if(name[0] == '[') { - U8 access = 0; - char*n = strdup(name); - char*bracket = strchr(n, ']'); - if(bracket) { - *bracket = 0; - char*a = n+1; - name += (bracket-n)+1; - if(!strcmp(a, "")) access=0x16; - else if(!strcmp(a, "undefined")) access=0x08; // public?? - else if(!strcmp(a, "package")) access=0x16; - else if(!strcmp(a, "public")) access=0x16; - else if(!strcmp(a, "packageinternal")) access=0x17; - else if(!strcmp(a, "protected")) access=0x18; - else if(!strcmp(a, "explicit")) access=0x19; - else if(!strcmp(a, "staticprotected")) access=0x1a; - else if(!strcmp(a, "private")) access=0x05; - else { - fprintf(stderr, "Undefined access level: [%s]\n", a); - free(n); - return 0; - } - } - ns->access = access; - ns->name = strdup(name); - free(n); - return ns; - } else { - ns->access = 0x16; - ns->name = strdup(name); - return ns; - } -} - -namespace_t* namespace_new(U8 access, const char*name) -{ - namespace_t*ns = malloc(sizeof(namespace_t)); - ns->access = access; - /* not sure what namespaces with empty strings are good for, but they *do* exist */ - ns->name = name?strdup(name):0; - return ns; -} -namespace_t* namespace_new_namespace(const char*name) { - return namespace_new(0x08, name); // public? -} -namespace_t* namespace_new_package(const char*name) { - return namespace_new(0x16 , name); -} -namespace_t* namespace_new_packageinternal(const char*name) { - return namespace_new(0x17, name); -} -namespace_t* namespace_new_protected(const char*name) { - return namespace_new(0x18, name); -} -namespace_t* namespace_new_explicit(const char*name) { - return namespace_new(0x19, name); -} -namespace_t* namespace_new_staticprotected(const char*name) { - return namespace_new(0x1a, name); -} -namespace_t* namespace_new_private(const char*name) { - return namespace_new(0x05, name); -} - -void namespace_destroy(namespace_t*n) -{ - if(n) { - free((char*)n->name);n->name=0; - n->access=0x00; - free(n); - } -} - -type_t namespace_type = { - dup: (dup_func)namespace_clone, - hash: (hash_func)namespace_hash, - free: (free_func)namespace_destroy, - equals: (equals_func)namespace_equals -}; - -// ---------------------------namespace sets -------------------------------- - -unsigned int namespace_set_hash(namespace_set_t*set) -{ - if(!set) - return 0; - namespace_list_t*l = set->namespaces; - unsigned int hash = 0; - while(l) { - hash = crc32_add_byte(hash, l->namespace->access); - hash = crc32_add_string(hash, l->namespace->name); - l = l->next; - } - return hash; -} - -int namespace_set_equals(namespace_set_t*m1, namespace_set_t*m2) -{ - if(!m1 || !m2) - return m1==m2; - namespace_list_t*l1 = m1->namespaces; - namespace_list_t*l2 = m2->namespaces; - while(l1 && l2) { - if(l1->namespace->access != l2->namespace->access) - return 0; - if(!(l1->namespace->name) != !(l2->namespace->name)) - return 0; - if(l1->namespace->name && l2->namespace->name && strcmp(l1->namespace->name, l2->namespace->name)) - return 0; - l1 = l1->next; - l2 = l2->next; - } - if(l1||l2) - return 0; - return 1; -} - -namespace_set_t* namespace_set_clone(namespace_set_t*other) -{ - if(!other) - return 0; - NEW(namespace_set_t,set); - set->namespaces = list_new(); - namespace_list_t*l = other->namespaces; - while(l) { - list_append(set->namespaces, namespace_clone(l->namespace)); - l = l->next; - } - return set; -} -namespace_set_t* namespace_set_new() -{ - NEW(namespace_set_t,set); - set->namespaces = list_new(); - return set; -} -char* namespace_set_tostring(namespace_set_t*set) -{ - if(!set) - return strdup("NULL"); - /* TODO: is the order of the namespaces important (does it - change the lookup order?). E.g. flex freely shuffles namespaces - around. - If the order is not important, we can optimize constant pools by sorting - the namespaces. - */ - int l = 0; - namespace_list_t*lns = set->namespaces; - while(lns) { - char*s = namespace_tostring(lns->namespace); - l += strlen(s)+1; - free(s); - lns = lns->next; - } - char*desc = malloc(l+16); - strcpy(desc, "{"); - lns = set->namespaces; - while(lns) { - char*s = namespace_tostring(lns->namespace); - strcat(desc, s); - free(s); - lns = lns->next; - if(lns) - strcat(desc, ","); - } - strcat(desc, "}"); - return desc; -} - -void namespace_set_destroy(namespace_set_t*set) -{ - if(set) { - namespace_list_t*l = set->namespaces; - while(l) { - namespace_destroy(l->namespace);l->namespace=0; - l = l->next; - } - list_free(set->namespaces); - free(set); - } -} - -type_t namespace_set_type = { - dup: (dup_func)namespace_set_clone, - hash: (hash_func)namespace_set_hash, - free: (free_func)namespace_set_destroy, - equals: (equals_func)namespace_set_equals -}; - -// ----------------------------- multiname ---------------------------------- - -unsigned int multiname_hash(multiname_t*m) -{ - if(!m) - return 0; - unsigned int hash = crc32_add_byte(0, m->type); - if(m->name) { - hash = crc32_add_string(hash, m->name); - } - if(m->ns) { - hash = crc32_add_byte(hash, m->ns->access); - hash = crc32_add_string(hash, m->ns->name); - } - if(m->namespace_set) { - namespace_list_t*l = m->namespace_set->namespaces; - while(l) { - hash = crc32_add_byte(hash, l->namespace->access); - hash = crc32_add_string(hash, l->namespace->name); - l = l->next; - } - } - return hash; -} - -int multiname_equals(multiname_t*m1, multiname_t*m2) -{ - if(!m1 || !m2) - return m1==m2; - if(m1->type!=m2->type) - return 0; - - if((!m1->name) != (!m2->name)) - return 0; - if((!m1->ns) != (!m2->ns)) - return 0; - if((!m1->namespace_set) != (!m2->namespace_set)) - return 0; - - if(m1->name && m2->name && strcmp(m1->name,m2->name)) - return 0; - if(m1->ns && m2->ns) { - if(!namespace_equals(m1->ns, m2->ns)) - return 0; - } - if(m1->namespace_set && m2->namespace_set) { - if(!namespace_set_equals(m1->namespace_set, m2->namespace_set)) - return 0; - } - return 1; -} - -multiname_t* multiname_new(namespace_t*ns, const char*name) -{ - NEW(multiname_t,m); - m->type = QNAME; - if(!ns) { - m->ns = namespace_new_packageinternal(""); - } else { - m->ns = namespace_clone(ns); - } - m->name = strdup(name); - return m; -} - -multiname_t* multiname_clone(multiname_t*other) -{ - if(!other) - return 0; - NEW(multiname_t,m); - m->type = other->type; - if(other->ns) - m->ns = namespace_clone(other->ns); - if(other->namespace_set) - m->namespace_set = namespace_set_clone(other->namespace_set); - if(other->name) - m->name = strdup(other->name); - return m; -} - - -char* access2str(int type) -{ - if(type==0x08) return "namespace"; - else if(type==0x16) return "public"; - else if(type==0x17) return "packageinternal"; - else if(type==0x18) return "protected"; - else if(type==0x19) return "explicit"; - else if(type==0x1A) return "staticprotected"; - else if(type==0x05) return "private"; - else if(type==0x00) return "any"; - else { - fprintf(stderr, "Undefined access type %02x\n", type); - return "undefined"; - } -} - - -char multiname_late_namespace(multiname_t*m) -{ - if(!m) - return 0; - return (m->type==RTQNAME || m->type==RTQNAMEA || - m->type==RTQNAMEL || m->type==RTQNAMELA); -} - -char multiname_late_name(multiname_t*m) -{ - if(!m) - return 0; - return m->type==RTQNAMEL || m->type==RTQNAMELA || - m->type==MULTINAMEL || m->type==MULTINAMELA; -} - -char* multiname_tostring(multiname_t*m) -{ - char*mname = 0; - if(!m) - return strdup("NULL"); - if(m->type==0xff) - return strdup("----"); - - char*name = m->name?escape_string(m->name):strdup("*"); - int namelen = strlen(name); - - if(m->type==QNAME || m->type==QNAMEA || m->type==POSTFIXTYPE) { - char*nsname = m->ns?escape_string(m->ns->name):strdup("NULL"); - mname = malloc(strlen(nsname)+namelen+32); - strcpy(mname, "type == QNAMEA) - strcat(mname, ",attr"); - strcat(mname, ">"); - if(m->ns) { - strcat(mname,"["); - strcat(mname,access2str(m->ns->access)); - strcat(mname, "]"); - } - strcat(mname, nsname); - free(nsname); - strcat(mname, "::"); - strcat(mname, name); - } else if(m->type==RTQNAME || m->type==RTQNAMEA) { - mname = malloc(namelen+32); - strcpy(mname, "type == RTQNAMEA) - strcat(mname, ",attr"); - strcat(mname, ">"); - strcat(mname, name); - } else if(m->type==RTQNAMEL) { - mname = strdup(""); - } else if(m->type==RTQNAMELA) { - mname = strdup(""); - } else if(m->type==MULTINAME || m->type==MULTINAMEA) { - char*s = namespace_set_tostring(m->namespace_set); - mname = malloc(strlen(s)+namelen+16); - if(m->type == MULTINAME) - strcpy(mname,""); - else //MULTINAMEA - strcpy(mname,""); - strcat(mname, s); - strcat(mname, "::"); - strcat(mname, name); - free(s); - } else if(m->type==MULTINAMEL || m->type==MULTINAMELA) { - char*s = namespace_set_tostring(m->namespace_set); - mname = malloc(strlen(s)+16); - if(m->type == MULTINAMEL) - strcpy(mname,""); - else //MULTINAMELA - strcpy(mname,""); - strcat(mname,s); - free(s); - } else { - return strdup(""); - } - free(name); - return mname; -} - -multiname_t* multiname_fromstring(const char*name2) -{ - if(!name2) - return 0; - char*n = strdup(name2); - char*p = strstr(n, "::"); - char*namespace=0,*name=0; - if(!p) { - if(strchr(n, ':')) { - fprintf(stderr, "Error: single ':' in name\n"); - } - namespace = ""; - name = n; - } else { - *p = 0; - namespace = n; - name = p+2; - if(strchr(namespace, ':')) { - fprintf(stderr, "Error: single ':' in namespace\n"); - } - if(strchr(name, ':')) { - fprintf(stderr, "Error: single ':' in qualified name\n"); - } - } - - multiname_t*m = malloc(sizeof(multiname_t)); - memset(m, 0, sizeof(multiname_t)); - m->type = QNAME; - m->namespace_set = 0; - m->ns = namespace_fromstring(namespace); - m->name = name?strdup(name):0; - free(n); - return m; -} - -void multiname_destroy(multiname_t*m) -{ - if(m) { - if(m->name) { - free((void*)m->name);m->name = 0; - } - if(m->ns) { - namespace_destroy(m->ns);m->ns = 0; - } - if(m->namespace_set) { - namespace_set_destroy(m->namespace_set);m->namespace_set = 0; - } - m->type=0; - free(m); - } -} - -type_t multiname_type = { - dup: (dup_func)multiname_clone, - hash: (hash_func)multiname_hash, - free: (free_func)multiname_destroy, - equals: (equals_func)multiname_equals -}; - - -// ------------------------------- constants ------------------------------------- - -#define UNIQUE_CONSTANT(x) ((x) == CONSTANT_TRUE || (x) == CONSTANT_FALSE || (x) == CONSTANT_NULL || (x) == CONSTANT_UNDEFINED) - -constant_t* constant_new_int(int i) -{ - NEW(constant_t,c); - c->i = i; - c->type = CONSTANT_INT; - return c; -} -constant_t* constant_new_uint(unsigned int u) -{ - NEW(constant_t,c); - c->u = u; - c->type = CONSTANT_UINT; - return c; -} -constant_t* constant_new_float(double f) -{ - NEW(constant_t,c); - c->f = f; - c->type = CONSTANT_FLOAT; - return c; -} -constant_t* constant_new_string(const char*s) -{ - NEW(constant_t,c); - c->s = string_new4(s); - c->type = CONSTANT_STRING; - return c; -} -constant_t* constant_new_string2(const char*s, int len) -{ - NEW(constant_t,c); - c->s = string_new3(s, len); - c->type = CONSTANT_STRING; - return c; -} -constant_t* constant_new_namespace(namespace_t*ns) -{ - NEW(constant_t,c); - c->ns = namespace_clone(ns); - c->type = ns->access; - assert(NS_TYPE(c->type)); - return c; -} -constant_t* constant_new_true() -{ - NEW(constant_t,c); - c->type = CONSTANT_TRUE; - return c; -} -constant_t* constant_new_false() -{ - NEW(constant_t,c); - c->type = CONSTANT_FALSE; - return c; -} -constant_t* constant_new_null() -{ - NEW(constant_t,c); - c->type = CONSTANT_NULL; - return c; -} -constant_t* constant_new_undefined() -{ - NEW(constant_t,c); - c->type = CONSTANT_UNDEFINED; - return c; -} -constant_t* constant_clone(constant_t*other) -{ - if(!other) return 0; - constant_t*c = malloc(sizeof(constant_t)); - memcpy(c, other, sizeof(constant_t)); - if(NS_TYPE(c->type)) { - c->ns = namespace_clone(other->ns); - } else if(c->type == CONSTANT_STRING) { - c->s = string_dup3(other->s); - } - return c; -} -constant_t* constant_fromindex(pool_t*pool, int index, int type) -{ - if(!index) { - /* even for nonvalued constants (like TRUE/FALSE etc.), a nonzero - index is present to indicate that a type is coming */ - return 0; - } - NEW(constant_t,c); - c->type = type; - if(NS_TYPE(c->type)) { - c->ns = namespace_clone(pool_lookup_namespace(pool, index)); - } else if(c->type == CONSTANT_INT) { - c->i = pool_lookup_int(pool, index); - } else if(c->type == CONSTANT_UINT) { - c->u = pool_lookup_uint(pool, index); - } else if(c->type == CONSTANT_FLOAT) { - c->f = pool_lookup_float(pool, index); - } else if(c->type == CONSTANT_STRING) { - string_t s = pool_lookup_string2(pool, index); - c->s = string_dup3(&s); - } else if(UNIQUE_CONSTANT(c->type)) { - // ok - } else { - fprintf(stderr, "invalid constant type %02x\n", c->type); - } - return c; -} -char* constant_tostring(constant_t*c) -{ - if(!c) - return strdup("NULL"); - char buf[32]; - if(NS_TYPE(c->type)) { - return namespace_tostring(c->ns); - } else if(c->type == CONSTANT_INT) { - sprintf(buf, "%d", c->i); - return strdup(buf); - } else if(c->type == CONSTANT_UINT) { - sprintf(buf, "%u", c->u); - return strdup(buf); - } else if(c->type == CONSTANT_FLOAT) { - char buf[1024]; - sprintf(buf, "%f", c->f); - return strdup(buf); - } else if(c->type == CONSTANT_STRING) { - /* should we escape the string? \0 bytes won't be printed */ - return strdup_n(c->s->str,c->s->len); - } else if(c->type == CONSTANT_TRUE) { - return strdup("true"); - } else if(c->type == CONSTANT_FALSE) { - return strdup("false"); - } else if(c->type == CONSTANT_NULL) { - return strdup("null"); - } else if(c->type == CONSTANT_UNDEFINED) { - return strdup("undefined"); - } else { - fprintf(stderr, "invalid constant type %02x\n", c->type); - return 0; - } -} -char constant_has_index(constant_t*c) -{ - if(!c) - return 0; - return !UNIQUE_CONSTANT(c->type); -} -int constant_get_index(pool_t*pool, constant_t*c) -{ - if(!c) - return 0; - if(NS_TYPE(c->type)) { - assert(c->ns); - /*if(c->type!=c->ns->access) { - printf("%02x<->%02x\n", c->type, c->ns->access); - }*/ - assert(c->type == c->ns->access); - return pool_register_namespace(pool, c->ns); - } else if(c->type == CONSTANT_INT) { - return pool_register_int(pool, c->i); - } else if(c->type == CONSTANT_UINT) { - return pool_register_uint(pool, c->u); - } else if(c->type == CONSTANT_FLOAT) { - return pool_register_float(pool, c->f); - } else if(c->type == CONSTANT_STRING) { - return pool_register_string2(pool, c->s); - } else if(c->type == CONSTANT_UNDEFINED) { - /* write undefined with index 0 (and no type). Otherwise, the FlashPlayer - seems to throw an "attempt to read out of bounds" exception */ - return 0; - } else if(!constant_has_index(c)) { - return 1; - } else { - fprintf(stderr, "invalid constant type %02x\n", c->type); - return 0; - } -} -void constant_free(constant_t*c) -{ - if(!c) - return; - if(c->type == CONSTANT_STRING) { - string_free(c->s); - } else if (NS_TYPE(c->type)) { - namespace_destroy(c->ns);c->ns=0; - } - free(c); -} -// --------------------------- optimizing ----------------------------------- - -static int array_append_or_increase(array_t*array, void*key) -{ - int pos = array_find(array, key); - if(pos>=0) { - array->d[pos].data++; - return pos; - } else { - return array_append(array, key, 0); - } -} -static int compare_arrayentry(const void*_c1, const void*_c2) -{ - const array_entry_t*c1 = _c1; - const array_entry_t*c2 = _c2; - return c2->data - c1->data; -} - -static void* nodup(const void*o) {return (void*)o;} - -static void reshuffle_array(array_t*array) -{ - qsort(array->d+1, array->num-1, sizeof(array->d[0]), compare_arrayentry); - type_t* old_type = array->entry2pos->key_type; - type_t old_type_nodup = *old_type; - old_type_nodup.dup = nodup; - dict_t*d = dict_new2(&old_type_nodup); - dict_destroy_shallow(array->entry2pos); - array->entry2pos = d; - int t; - for(t=0;tnum;t++) { - dict_put(array->entry2pos, array->d[t].name, (void*)(ptroff_t)(t+1)); - } - d->key_type = old_type; - -} - -// ------------------------------- pool ------------------------------------- - -int pool_register_uint(pool_t*p, unsigned int i) -{ - int pos = array_append_or_increase(p->x_uints, &i); - assert(pos!=0); - return pos; -} -int pool_register_int(pool_t*p, int i) -{ - int pos = array_append_or_increase(p->x_ints, &i); - assert(pos!=0); - return pos; -} -int pool_register_float(pool_t*p, double d) -{ - int pos = array_append_or_increase(p->x_floats, &d); - fprintf(stderr, "putting %f at %d\n", d, pos);fflush(stderr); - assert(pos!=0); - return pos; -} -int pool_register_string(pool_t*pool, const char*str) -{ - if(!str) return 0; - string_t s = string_new2(str); - int pos = array_append_or_increase(pool->x_strings, &s); - assert(pos!=0); - return pos; -} -int pool_register_string2(pool_t*pool, string_t*s) -{ - if(!s || !s->str) return 0; - int pos = array_append_or_increase(pool->x_strings, s); - assert(pos!=0); - return pos; -} -int pool_register_namespace(pool_t*pool, namespace_t*ns) -{ - if(!ns) return 0; - int pos = array_append_or_increase(pool->x_namespaces, ns); - assert(pos!=0 || ns->access==ZERONAMESPACE); - return pos; -} -int pool_register_namespace_set(pool_t*pool, namespace_set_t*set) -{ - if(!set) return 0; - int pos = array_append_or_increase(pool->x_namespace_sets, set); - assert(pos!=0); - return pos; -} -int pool_register_multiname(pool_t*pool, multiname_t*n) -{ - if(!n) return 0; - int pos = array_append_or_increase(pool->x_multinames, n); - assert(pos!=0); - return pos; -} -int pool_register_multiname2(pool_t*pool, char*name) -{ - if(!name) return 0; - multiname_t*n = multiname_fromstring(name); - int pos = array_append_or_increase(pool->x_multinames, n); - multiname_destroy(n); - assert(pos!=0); - return pos; -} - - -int pool_find_uint(pool_t*pool, unsigned int x) -{ - int i = array_find(pool->x_uints, &x); - if(i<=0) { - fprintf(stderr, "Couldn't find uint \"%d\" in constant pool\n", x); - return 0; - } - return i; -} -int pool_find_int(pool_t*pool, int x) -{ - int i = array_find(pool->x_ints, &x); - if(i<=0) { - fprintf(stderr, "Couldn't find int \"%d\" in constant pool\n", x); - return 0; - } - return i; -} -int pool_find_float(pool_t*pool, double x) -{ - int i = array_find(pool->x_ints, &x); - if(i<=0) { - fprintf(stderr, "Couldn't find int \"%f\" in constant pool\n", x); - return 0; - } - return i; -} -int pool_find_namespace(pool_t*pool, namespace_t*ns) -{ - if(!ns) - return 0; - int i = array_find(pool->x_namespaces, ns); - if(i<0) { - char*s = namespace_tostring(ns); - fprintf(stderr, "Couldn't find namespace \"%s\" %p in constant pool\n", s, (int)ns); - free(s); - return 0; - } - return i; -} -int pool_find_namespace_set(pool_t*pool, namespace_set_t*set) -{ - if(!set) - return 0; - int i = array_find(pool->x_namespace_sets, set); - if(i<=0) { - char*s = namespace_set_tostring(set); - fprintf(stderr, "Couldn't find namespace_set \"%s\" in constant pool\n", s); - free(s); - return 0; - } - return i; -} -int pool_find_string(pool_t*pool, const char*str) -{ - if(!str) - return 0; - string_t s = string_new2(str); - int i = array_find(pool->x_strings, &s); - if(i<=0) { - fprintf(stderr, "Couldn't find string \"%s\" in constant pool\n", str); - return 0; - } - return i; -} -int pool_find_multiname(pool_t*pool, multiname_t*name) -{ - if(!name) - return 0; - int i = array_find(pool->x_multinames, name); - if(i<=0) { - char*s = multiname_tostring(name); - fprintf(stderr, "Couldn't find multiname \"%s\" in constant pool\n", s); - free(s); - return 0; - } - return i; -} - -int pool_lookup_int(pool_t*pool, int i) -{ - if(!i) return 0; - int*ptr = (int*)array_getkey(pool->x_ints, i); - if(!ptr) return 0; - return *ptr; -} -unsigned int pool_lookup_uint(pool_t*pool, int i) -{ - if(!i) return 0; - return *(unsigned int*)array_getkey(pool->x_uints, i); -} -double pool_lookup_float(pool_t*pool, int i) -{ - if(!i) return __builtin_nan(""); - double*ptr = (double*)array_getkey(pool->x_floats, i); - if(!ptr) - return __builtin_nan(""); - return *ptr; -} -const char*pool_lookup_string(pool_t*pool, int i) -{ - string_t*s = array_getkey(pool->x_strings, i); - if(!s) return 0; - return s->str; -} -string_t pool_lookup_string2(pool_t*pool, int i) -{ - string_t*s = array_getkey(pool->x_strings, i); - return *s; -} -namespace_t*pool_lookup_namespace(pool_t*pool, int i) -{ - return (namespace_t*)array_getkey(pool->x_namespaces, i); -} -namespace_set_t*pool_lookup_namespace_set(pool_t*pool, int i) -{ - return (namespace_set_t*)array_getkey(pool->x_namespace_sets, i); -} -multiname_t*pool_lookup_multiname(pool_t*pool, int i) -{ - return (multiname_t*)array_getkey(pool->x_multinames, i); -} - -static namespace_t zeronamespace={ZERONAMESPACE,"*"}; -pool_t*pool_new() -{ - NEW(pool_t, p); - - p->x_ints = array_new2(&uint_type); - p->x_uints = array_new2(&uint_type); - p->x_floats = array_new2(&float_type); - p->x_strings = array_new2(&stringstruct_type); - p->x_namespaces = array_new2(&namespace_type); - p->x_namespace_sets = array_new2(&namespace_set_type); - p->x_multinames = array_new2(&multiname_type); - - /* add a zero-index entry in each list */ - - array_append(p->x_ints, 0, 0); - array_append(p->x_uints, 0, 0); - array_append(p->x_floats, 0, 0); - array_append(p->x_strings, 0, 0); - array_append(p->x_namespaces, &zeronamespace, 0); - array_append(p->x_namespace_sets, 0, 0); - array_append(p->x_multinames, 0, 0); - return p; -} - -void pool_optimize(pool_t*p) -{ - reshuffle_array(p->x_ints); - reshuffle_array(p->x_uints); - reshuffle_array(p->x_floats); - reshuffle_array(p->x_strings); - reshuffle_array(p->x_namespaces); - reshuffle_array(p->x_namespace_sets); - reshuffle_array(p->x_multinames); -} - -#define DEBUG if(0) -//#define DEBUG - -void pool_read(pool_t*pool, TAG*tag) -{ - int num_ints = swf_GetU30(tag); - DEBUG printf("%d ints\n", num_ints); - int t; - for(t=1;tx_ints, &v, 0); - } - - int num_uints = swf_GetU30(tag); - DEBUG printf("%d uints\n", num_uints); - for(t=1;tx_uints, &v, 0); - } - - int num_floats = swf_GetU30(tag); - DEBUG printf("%d floats\n", num_floats); - for(t=1;tx_floats, &d, 0); - } - - int num_strings = swf_GetU30(tag); - DEBUG printf("%d strings\n", num_strings); - for(t=1;tdata[tag->pos], len); - swf_GetBlock(tag, 0, len); - array_append(pool->x_strings, &s, 0); - DEBUG printf("%d) \"%s\"\n", t, ((string_t*)array_getkey(pool->x_strings, t))->str); - } - int num_namespaces = swf_GetU30(tag); - DEBUG printf("%d namespaces\n", num_namespaces); - for(t=1;tx_namespaces, ns, 0); - DEBUG printf("%d) %02x \"%s\"\n", t, type, namespace_tostring(ns)); - namespace_destroy(ns); - } - int num_sets = swf_GetU30(tag); - DEBUG printf("%d namespace sets\n", num_sets); - for(t=1;tx_namespaces, nsnr); - list_append(nsset->namespaces, namespace_clone(ns)); - } - array_append(pool->x_namespace_sets, nsset, 0); - DEBUG printf("set %d) %s\n", t, namespace_set_tostring(nsset)); - namespace_set_destroy(nsset); - } - - int num_multinames = swf_GetU30(tag); - DEBUG printf("%d multinames\n", num_multinames); - for(t=1;tdata[tag->pos+s]); - printf("\n");*/ - - m.type = swf_GetU8(tag); - if(m.type==0x07 || m.type==0x0d) { - int namespace_index = swf_GetU30(tag); - m.ns = (namespace_t*)array_getkey(pool->x_namespaces, namespace_index); - if(!m.ns) { - fprintf(stderr, "Error: Illegal reference to namespace #%d in constant pool.\n", namespace_index); - } - int name_index = swf_GetU30(tag); - if(name_index) // 0 = '*' (any) - m.name = pool_lookup_string(pool, name_index); - } else if(m.type==0x0f || m.type==0x10) { - int name_index = swf_GetU30(tag); - if(name_index) // 0 = '*' (any name) - m.name = pool_lookup_string(pool, name_index); - } else if(m.type==0x11 || m.type==0x12) { - } else if(m.type==0x09 || m.type==0x0e) { - int name_index = swf_GetU30(tag); - int namespace_set_index = swf_GetU30(tag); - if(name_index) - m.name = pool_lookup_string(pool, name_index); - m.namespace_set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, namespace_set_index); - } else if(m.type==0x1b || m.type==0x1c) { - int namespace_set_index = swf_GetU30(tag); - m.namespace_set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, namespace_set_index); - } else if(m.type==0x1d) { - int v1 = swf_GetU30(tag); //multiname - int v2 = swf_GetU30(tag); //counter? - int v3 = swf_GetU30(tag); //multiname - // e.g. Vector ... we only store the parent object - m = *(multiname_t*)array_getkey(pool->x_multinames, v1); - } else { - printf("can't parse type %d multinames yet\n", m.type); - } - DEBUG printf("multiname %d) %s\n", t, multiname_tostring(&m)); - array_append(pool->x_multinames, &m, 0); - } -} - -void pool_dump(pool_t*pool, FILE*fo, char flags) -{ - int t; - fprintf(fo, "%d integers\n", pool->x_ints->num); - for(t=1;tx_ints->num;t++) { - S32 val = *(int*)array_getkey(pool->x_ints, t); - int freq = (int)(ptroff_t)array_getvalue(pool->x_ints, t); - if(flags&1) fprintf(fo, "%5d %d) %d\n", freq, t, val); - } - fprintf(fo, "%d unsigned integers\n", pool->x_uints->num); - for(t=1;tx_uints->num;t++) { - U32 val = *(unsigned int*)array_getkey(pool->x_uints, t); - int freq = (int)(ptroff_t)array_getvalue(pool->x_uints, t); - if(flags&1) fprintf(fo, "%5d %d) %d\n", freq, t, val); - } - fprintf(fo, "%d floats\n", pool->x_floats->num); - for(t=1;tx_floats->num;t++) { - double d = pool_lookup_float(pool, t); - int freq = (int)(ptroff_t)array_getvalue(pool->x_floats, t); - if(flags&2) fprintf(fo, "%5d %d) %f\n", freq, t, d); - } - fprintf(fo, "%d strings\n", pool->x_strings->num); - for(t=1;tx_strings->num;t++) { - string_t str = pool_lookup_string2(pool, t); - int freq = (int)(ptroff_t)array_getvalue(pool->x_strings, t); - if(flags&1) fprintf(fo, "%5d %d) ", freq, t); - if(flags&1) fwrite(str.str, str.len, 1, fo); - if(flags&1) fprintf(fo, "\n"); - } - fprintf(fo, "%d namespaces\n", pool->x_namespaces->num); - for(t=1;tx_namespaces->num;t++) { - namespace_t*ns= (namespace_t*)array_getkey(pool->x_namespaces, t); - char*s = namespace_tostring(ns); - int freq = (int)(ptroff_t)array_getvalue(pool->x_namespaces, t); - if(flags&1) fprintf(fo, "%5d %d) %s\n", freq, t, s); - free(s); - } - fprintf(fo, "%d namespace sets\n", pool->x_namespace_sets->num); - for(t=1;tx_namespace_sets->num;t++) { - namespace_set_t*set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, t); - char*s = namespace_set_tostring(set); - int freq = (int)(ptroff_t)array_getvalue(pool->x_namespace_sets, t); - if(flags&1) fprintf(fo, "%5d %d) %s\n", freq, t, s); - free(s); - } - - fprintf(fo, "%d multinames\n", pool->x_multinames->num); - for(t=1;tx_multinames->num;t++) { - multiname_t*m = (multiname_t*)array_getkey(pool->x_multinames, t); - char*s = multiname_tostring(m); - int freq = (int)(ptroff_t)array_getvalue(pool->x_multinames, t); - if(flags&1) fprintf(fo, "%5d %d) %s\n", freq, t, s); - free(s); - } -} - -void pool_write(pool_t*pool, TAG*tag) -{ - int t; - - /* make sure that all namespaces used by multinames / namespace sets - and all strings used by namespaces exist */ - - for(t=1;tx_multinames->num;t++) { - multiname_t*m = (multiname_t*)array_getkey(pool->x_multinames, t); - if(m->ns) { - pool_register_namespace(pool, m->ns); - } - if(m->namespace_set) { - pool_register_namespace_set(pool, m->namespace_set); - } - if(m->name) { - pool_register_string(pool, m->name); - } - } - for(t=1;tx_namespace_sets->num;t++) { - namespace_set_t*set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, t); - namespace_list_t*i = set->namespaces; - while(i) { - pool_register_namespace(pool, i->namespace); - i = i->next; - } - } - for(t=1;tx_namespaces->num;t++) { - namespace_t*ns= (namespace_t*)array_getkey(pool->x_namespaces, t); - /* The spec says (page 22): "a value of zero denotes an empty string". - However when actually using zero strings as empty namespaces, the - flash player breaks.*/ - //if(ns->name && ns->name[0]) - pool_register_string(pool, ns->name); - } - - //pool_register_int(pool, 15); - //pool_register_int(pool, 1); - //pool_register_int(pool, 0); - - /* write data */ - swf_SetU30(tag, pool->x_ints->num>1?pool->x_ints->num:0); - for(t=1;tx_ints->num;t++) { - S32 val = *(int*)array_getkey(pool->x_ints, t); - swf_SetABCS32(tag, val); - } - swf_SetU30(tag, pool->x_uints->num>1?pool->x_uints->num:0); - for(t=1;tx_uints->num;t++) { - swf_SetABCU32(tag, *(unsigned int*)array_getkey(pool->x_uints, t)); - } - swf_SetU30(tag, pool->x_floats->num>1?pool->x_floats->num:0); - for(t=1;tx_floats->num;t++) { - double d = pool_lookup_float(pool, t); - swf_SetD64(tag, d); - } - swf_SetU30(tag, pool->x_strings->num>1?pool->x_strings->num:0); - for(t=1;tx_strings->num;t++) { - string_t str = pool_lookup_string2(pool, t); - swf_SetU30String(tag, str.str, str.len); - } - swf_SetU30(tag, pool->x_namespaces->num>1?pool->x_namespaces->num:0); - for(t=1;tx_namespaces->num;t++) { - namespace_t*ns= (namespace_t*)array_getkey(pool->x_namespaces, t); - swf_SetU8(tag, ns->access); - const char*name = ns->name; - int i = 0; - - //if(name && name[0]) - i = pool_find_string(pool, name); - - swf_SetU30(tag, i); - } - swf_SetU30(tag, pool->x_namespace_sets->num>1?pool->x_namespace_sets->num:0); - for(t=1;tx_namespace_sets->num;t++) { - namespace_set_t*set = (namespace_set_t*)array_getkey(pool->x_namespace_sets, t); - namespace_list_t*i = set->namespaces; - int len = list_length(i); - swf_SetU30(tag, len); - while(i) { - int index = pool_find_namespace(pool, i->namespace); - swf_SetU30(tag, index); - i = i->next; - } - } - - swf_SetU30(tag, pool->x_multinames->num>1?pool->x_multinames->num:0); - for(t=1;tx_multinames->num;t++) { - multiname_t*m = (multiname_t*)array_getkey(pool->x_multinames, t); - swf_SetU8(tag, m->type); - - if(m->ns) { - assert(m->type==0x07 || m->type==0x0d); - int i = pool_find_namespace(pool, m->ns); - if(i<0) fprintf(stderr, "internal error: unregistered namespace %02x %s %s\n", m->ns->access, access2str(m->ns->access), m->ns->name); - swf_SetU30(tag, i); - } else { - assert(m->type!=0x07 && m->type!=0x0d); - } - - if(m->name) { - assert(m->type==0x09 || m->type==0x0e || m->type==0x07 || m->type==0x0d || m->type==0x0f || m->type==0x10); - int i = pool_find_string(pool, m->name); - if(i<0) fprintf(stderr, "internal error: unregistered name\n"); - swf_SetU30(tag, i); - } else { - if(m->type == 0x09) { - swf_SetU30(tag, 0); - } - assert(m->type!=0x0e && m->type!=0x07 && m->type!=0x0d && m->type!=0x0f && m->type!=0x10); - } - if(m->namespace_set) { - assert(m->type==0x09 || m->type==0x0e || m->type==0x1c || m->type==0x1b); - int i = pool_find_namespace_set(pool, m->namespace_set); - if(i<0) fprintf(stderr, "internal error: unregistered namespace set\n"); - swf_SetU30(tag, i); - } else { - assert(m->type!=0x09 && m->type!=0x0e && m->type!=0x1c && m->type!=0x1b); - } - } -} - - -void pool_destroy(pool_t*pool) -{ - int t; - array_free(pool->x_ints); - array_free(pool->x_uints); - array_free(pool->x_floats); - array_free(pool->x_strings); - array_free(pool->x_namespaces); - array_free(pool->x_namespace_sets); - array_free(pool->x_multinames); - free(pool); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.h deleted file mode 100644 index 632fa7f38..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/pool.h +++ /dev/null @@ -1,217 +0,0 @@ -/* pool.h - - Routines for handling Flash2 AVM2 ABC contantpool entries. - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __pool_h__ -#define __pool_h__ - -#include "../q.h" -#include "../rfxswf.h" - -DECLARE(pool); -DECLARE(constant); -DECLARE_LIST(constant); -DECLARE(multiname); -DECLARE(namespace); -DECLARE(namespace_set); -DECLARE_LIST(multiname); -DECLARE_LIST(namespace); -DECLARE_LIST(trait); - -/* abc file constant pool */ -struct _pool { - array_t*x_ints; - array_t*x_uints; - array_t*x_floats; - array_t*x_strings; - array_t*x_namespaces; - array_t*x_namespace_sets; - array_t*x_multinames; -}; - -typedef enum access_type -{ACCESS_STANDARD=0x16, - ACCESS_PACKAGE=0x16, - ACCESS_PUBLIC=0x16, - ACCESS_PACKAGEINTERNAL=0x17, - ACCESS_PROTECTED=0x18, - ACCESS_EXPLICIT=0x19, - ACCESS_STATICPROTECTED=0x1a, - ACCESS_PRIVATE=0x05, - ACCESS_NAMESPACE=0x08 -} access_type_t; - - -typedef enum constant_type -{ -CONSTANT_STRING=0x01, -CONSTANT_INT=0x03, -CONSTANT_UINT=0x04, -CONSTANT_FLOAT=0x06, - -CONSTANT_TRUE=0x0B, -CONSTANT_FALSE=0x0A, -CONSTANT_NULL=0x0C, -CONSTANT_UNDEFINED=0x00, - -CONSTANT_NAMESPACE=0x08, -CONSTANT_NAMESPACE_PACKAGE=0x16, -CONSTANT_NAMESPACE_PACKAGEINTERNAL=0x17, -CONSTANT_NAMESPACE_PROTECTED=0x18, -CONSTANT_NAMESPACE_EXPLICIT=0x19, -CONSTANT_NAMESPACE_STATICPROTECTED=0x1A, -CONSTANT_NAMESPACE_PRIVATE=0x05, -CONSTANT_UNKNOWN=0x55, /*used internally */ -} contant_type_t; - -#define NS_TYPE(x) ((x) == 0x08 || (x) == 0x16 || (x) == 0x17 || (x) == 0x18 || (x) == 0x19 || (x) == 0x1a || (x) == 0x05) - -struct _constant { - int type; - union { - string_t* s; - namespace_t*ns; - double f; - int i; - unsigned int u; - }; -}; - -constant_t* constant_clone(); -constant_t* constant_new_int(int x); -constant_t* constant_new_uint(unsigned int x); -constant_t* constant_new_float(double x); -constant_t* constant_new_string(const char*s); -constant_t* constant_new_string2(const char*s, int len); -constant_t* constant_new_namespace(namespace_t*ns); -constant_t* constant_new_true(); -constant_t* constant_new_false(); -constant_t* constant_new_null(); -constant_t* constant_new_undefined(); -char constant_has_index(constant_t*c); -constant_t* constant_fromindex(pool_t*pool, int index, int type); -char* constant_tostring(constant_t*c); -int constant_get_index(pool_t*pool, constant_t*c); -void constant_free(constant_t*c); - -typedef enum multiname_type -{QNAME=0x07, - RTQNAME=0x0F, - RTQNAMEL=0x11, - MULTINAME=0x09, - MULTINAMEL=0x1B, - QNAMEA=0x0D, - RTQNAMEA=0x10, - RTQNAMELA=0x12, - MULTINAMEA=0x0E, - MULTINAMELA=0x1C, - POSTFIXTYPE=0x1D, - ZERONAMESPACE=0 -} multiname_type_t; - -char* access2str(int type); - -struct _namespace { - U8 access; - const char*name; -}; -struct _namespace_set { - namespace_list_t*namespaces; -}; - -extern type_t multiname_type; -struct _multiname { - multiname_type_t type; - namespace_t*ns; - namespace_set_t*namespace_set; - const char*name; -}; - -/* object -> string */ -char* namespace_set_tostring(namespace_set_t*set); -char* multiname_tostring(multiname_t*m); -char* namespace_tostring(namespace_t*ns); - -/* integer -> object */ -int pool_lookup_int(pool_t*pool, int i); -unsigned int pool_lookup_uint(pool_t*pool, int i); -double pool_lookup_float(pool_t*pool, int i); -const char*pool_lookup_string(pool_t*pool, int i); -string_t pool_lookup_string2(pool_t*pool, int i); -namespace_t*pool_lookup_namespace(pool_t*pool, int i); -namespace_set_t*pool_lookup_namespace_set(pool_t*pool, int i); -multiname_t*pool_lookup_multiname(pool_t*pool, int i); - -/* object -> integer (lookup) */ -int pool_find_int(pool_t*pool, int x); -int pool_find_uint(pool_t*pool, unsigned int x); -int pool_find_double(pool_t*pool, double x); -int pool_find_namespace(pool_t*pool, namespace_t*ns); -int pool_find_namespace_set(pool_t*pool, namespace_set_t*set); -int pool_find_string(pool_t*pool, const char*s); -int pool_find_multiname(pool_t*pool, multiname_t*name); - -/* object -> integer (lookup/creation) */ -int pool_register_int(pool_t*p, int i); -int pool_register_uint(pool_t*p, unsigned int i); -int pool_register_float(pool_t*p, double d); -int pool_register_string(pool_t*pool, const char*s); -int pool_register_string2(pool_t*pool, string_t*s); -int pool_register_namespace(pool_t*pool, namespace_t*ns); -int pool_register_namespace_set(pool_t*pool, namespace_set_t*set); -int pool_register_multiname(pool_t*pool, multiname_t*n); -int pool_register_multiname2(pool_t*pool, char*name); - -/* creation */ -namespace_t* namespace_new(U8 access, const char*name); -namespace_t* namespace_new_namespace(const char*name); -namespace_t* namespace_new_package(const char*name); -namespace_t* namespace_new_packageinternal(const char*name); -namespace_t* namespace_new_protected(const char*name); -namespace_t* namespace_new_explicit(const char*name); -namespace_t* namespace_new_staticprotected(const char*name); -namespace_t* namespace_new_private(const char*name); -namespace_t* namespace_clone(namespace_t*ns); - -namespace_t* namespace_fromstring(const char*name); - -multiname_t* multiname_fromstring(const char*name); -multiname_t* multiname_new(namespace_t*ns, const char*name); -multiname_t* multiname_clone(multiname_t*other); - -/* accessors etc. */ -char multiname_late_namespace(multiname_t*m); -char multiname_late_name(multiname_t*m); - -/* freeing */ -void multiname_destroy(multiname_t*m); -void namespace_destroy(namespace_t*n); - -/* pool constructors/destructors */ -pool_t*pool_new(); -void pool_optimize(); -void pool_read(pool_t*pool, TAG*tag); -void pool_write(pool_t*pool, TAG*tag); -void pool_destroy(pool_t*pool); -void pool_dump(pool_t*pool, FILE*fo, char flags); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.c deleted file mode 100644 index 5aaef97bd..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.c +++ /dev/null @@ -1,596 +0,0 @@ -/* registry.c - - Routines for compiling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include "pool.h" -#include "registry.h" -#include "builtin.h" - -dict_t*registry_classes=0; -asset_bundle_list_t*assets=0; - -// ----------------------- class signature ------------------------------ - -char slotinfo_equals(slotinfo_t*c1, slotinfo_t*c2) -{ - if(!!c1 != !!c2) - return 0; - /* notice: access right is *not* respected */ - if(!strcmp(c1->name, c2->name) && - !strcmp(c1->package, c2->package)) { - return 1; - } - return 0; -} -static unsigned int slotinfo_hash(slotinfo_t*c) -{ - unsigned int hash = 0; - hash = crc32_add_string(hash, c->package); - hash = crc32_add_string(hash, c->name); - return hash; -} -static unsigned int memberinfo_hash(slotinfo_t*c) -{ - unsigned int hash = 0; - hash = crc32_add_string(hash, c->name); - return hash; -} - -static void* dummy_clone(void*other) {return other;} -static void dummy_destroy(slotinfo_t*c) {} - -type_t slotinfo_type = { - hash: (hash_func)slotinfo_hash, - equals: (equals_func)slotinfo_equals, - dup: (dup_func)dummy_clone, // all signatures are static - free: (free_func)dummy_destroy, -}; -type_t memberinfo_type = { - hash: (hash_func)memberinfo_hash, - equals: (equals_func)slotinfo_equals, - dup: (dup_func)dummy_clone, // all signatures are static - free: (free_func)dummy_destroy, -}; - -// ----------------------- assets ------------------------------------- -static void use_asset(asset_bundle_t*a) -{ - a->used = 1; - asset_bundle_list_t*l = a->dependencies; - while(l) { - if(!l->asset_bundle->used) { - use_asset(l->asset_bundle); - } - l = l->next; - } -} -void registry_use(slotinfo_t*s) -{ - if(!s) return; - if(!(s->flags&FLAG_USED)) { - s->flags |= FLAG_USED; - if(s->kind == INFOTYPE_CLASS) { - classinfo_t*c=(classinfo_t*)s; - if(c->assets) { - use_asset(c->assets); - } - int t=0; - while(c->interfaces[t]) { - registry_use((slotinfo_t*)c->interfaces[t]); - t++; - } - while(c->superclass) { - c = c->superclass; - registry_use((slotinfo_t*)c); - } - } else if(s->kind == INFOTYPE_METHOD) { - methodinfo_t*m=(methodinfo_t*)s; - if(m->parent) { - registry_use((slotinfo_t*)m->parent); - } - } else if(s->kind == INFOTYPE_VAR) { - varinfo_t*v=(varinfo_t*)s; - if(v->parent) { - registry_use((slotinfo_t*)v->parent); - } - } - } -} -void registry_add_asset(asset_bundle_t*bundle) -{ - list_append(assets, bundle); -} -asset_bundle_list_t*registry_getassets() -{ - return assets; -} -// ----------------------- resolving ---------------------------------- -slotinfo_t* registry_resolve(slotinfo_t*_s) -{ - if(!_s || _s->kind != INFOTYPE_UNRESOLVED) - return _s; - unresolvedinfo_t*s = (unresolvedinfo_t*)_s; - - if(s->package) - return registry_find(s->package, s->name); - - namespace_list_t*l = s->nsset; - while(l) { - slotinfo_t* n = registry_find(l->namespace->name, s->name); - if(n) return n; - l = l->next; - } - return 0; -} - -static slotinfo_list_t*unresolved = 0; -static void schedule_for_resolve(slotinfo_t*s) -{ - list_append(unresolved, s); -} -static void resolve_on_slot(slotinfo_t*_member) -{ - if(_member->kind == INFOTYPE_VAR) { - varinfo_t*member = (varinfo_t*)_member; - member->type = (classinfo_t*)registry_resolve((slotinfo_t*)member->type); - } else if(_member->kind == INFOTYPE_METHOD) { - methodinfo_t*member = (methodinfo_t*)_member; - member->return_type = (classinfo_t*)registry_resolve((slotinfo_t*)member->return_type); - classinfo_list_t*l = member->params; - while(l) { - l->classinfo = (classinfo_t*)registry_resolve((slotinfo_t*)l->classinfo); - l = l->next; - } - } else fprintf(stderr, "Internal Error: bad slot %s", _member->name); -} -static void resolve_on_class(slotinfo_t*_cls) -{ - classinfo_t*cls = (classinfo_t*)_cls; - cls->superclass = (classinfo_t*)registry_resolve((slotinfo_t*)cls->superclass); - - DICT_ITERATE_DATA(&cls->members,slotinfo_t*,m) { - resolve_on_slot(m); - } - DICT_ITERATE_DATA(&cls->static_members,slotinfo_t*,m2) { - resolve_on_slot(m2); - } - - int t=0; - while(cls->interfaces[t]) { - cls->interfaces[t] = (classinfo_t*)registry_resolve((slotinfo_t*)cls->interfaces[t]); - t++; - } -} -void registry_resolve_all() -{ - while(unresolved) { - slotinfo_t*_s = unresolved->slotinfo; - if(_s->kind == INFOTYPE_CLASS) { - resolve_on_class(_s); - } else if(_s->kind == INFOTYPE_METHOD || _s->kind == INFOTYPE_VAR) { - resolve_on_slot(_s); - } else { - fprintf(stderr, "Internal Error: object %s.%s has bad type\n", _s->package, _s->name); - } - slotinfo_list_t*tofree = unresolved; - unresolved = unresolved->next; - free(tofree); - } -} -// ------------------------- constructors -------------------------------- - -#define AVERAGE_NUMBER_OF_MEMBERS 8 -classinfo_t* classinfo_register(int access, const char*package, const char*name, int num_interfaces) -{ - classinfo_t*c = rfx_calloc(sizeof(classinfo_t)+(sizeof(classinfo_t*)*(num_interfaces+1))); - c->interfaces[0] = 0; - c->kind = INFOTYPE_CLASS; - c->access = access; - c->package = package; - c->name = name; - dict_put(registry_classes, c, c); - dict_init2(&c->members, &memberinfo_type, AVERAGE_NUMBER_OF_MEMBERS); - dict_init2(&c->static_members, &memberinfo_type, AVERAGE_NUMBER_OF_MEMBERS); - - schedule_for_resolve((slotinfo_t*)c); - return c; -} -methodinfo_t* methodinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static) -{ - NEW(methodinfo_t,m); - m->kind = INFOTYPE_METHOD; - m->access = access; - m->name = name; - m->package = ns; - m->parent = cls; - if(!is_static) - dict_put(&cls->members, m, m); - else - dict_put(&cls->static_members, m, m); - return m; -} -varinfo_t* varinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static) -{ - NEW(varinfo_t,m); - m->kind = INFOTYPE_VAR; - m->access = access; - m->name = name; - m->package = ns; - m->parent = cls; - if(!is_static) - dict_put(&cls->members, m, m); - else - dict_put(&cls->static_members, m, m); - return m; -} -methodinfo_t* methodinfo_register_global(U8 access, const char*package, const char*name) -{ - NEW(methodinfo_t, m); - m->kind = INFOTYPE_METHOD; - m->flags = FLAG_STATIC; - m->access = access; - m->package = package; - m->name = name; - m->parent = 0; - dict_put(registry_classes, m, m); - - schedule_for_resolve((slotinfo_t*)m); - return m; -} -varinfo_t* varinfo_register_global(U8 access, const char*package, const char*name) -{ - NEW(varinfo_t, m); - m->kind = INFOTYPE_VAR; - m->flags = FLAG_STATIC; - m->access = access; - m->package = package; - m->name = name; - m->parent = 0; - dict_put(registry_classes, m, m); - - schedule_for_resolve((slotinfo_t*)m); - return m; -} - -// --------------- builtin classes (from builtin.c) ---------------------- - -void registry_init() -{ - if(!registry_classes) - registry_classes = builtin_getclasses(); -} -slotinfo_t* registry_find(const char*package, const char*name) -{ - assert(registry_classes); - slotinfo_t tmp; - tmp.package = package; - tmp.name = name; - slotinfo_t* c = (slotinfo_t*)dict_lookup(registry_classes, &tmp); - /*if(c) - printf("%s.%s->%08x (%s.%s)\n", package, name, c, c->package, c->name);*/ - return c; -} -slotinfo_t* registry_safefind(const char*package, const char*name) -{ - slotinfo_t*c = registry_find(package, name); - if(!c) { - printf("%s.%s\n", package, name); - } - assert(c); - return c; -} -void registry_dump() -{ - int t; - for(t=0;thashsize;t++) { - dictentry_t*e = registry_classes->slots[t]; - while(e) { - slotinfo_t*i = (slotinfo_t*)e->key; - printf("[%s] %s.%s\n", access2str(i->access), i->package, i->name); - e = e->next; - } - } -} - -memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*name, char recursive, char is_static) -{ - memberinfo_t tmp; - tmp.name = name; - tmp.package = ns?ns:""; - - if(!recursive) { - if(!is_static) - return (memberinfo_t*)dict_lookup(&cls->members, &tmp); - else - return (memberinfo_t*)dict_lookup(&cls->static_members, &tmp); - } - /* look at classes directly extended by this class */ - slotinfo_t*m = 0; - classinfo_t*s = cls; - - if(recursive>1) // check *only* superclasses - s = s->superclass; - - while(s) { - if(s->kind == INFOTYPE_UNRESOLVED) - break; - - if(!is_static) { - m = (slotinfo_t*)dict_lookup(&s->members, &tmp); - if(m) return (memberinfo_t*)m; - } - m = (slotinfo_t*)dict_lookup(&s->static_members, &tmp); - if(m) return (memberinfo_t*)m; - - s = s->superclass; - } - /* look at interfaces, and parent interfaces */ - int t=0; - while(cls->interfaces[t]) { - classinfo_t*s = cls->interfaces[t]; - if(s->kind != INFOTYPE_UNRESOLVED) { - while(s) { - if(!is_static) { - m = (slotinfo_t*)dict_lookup(&s->members, &tmp); - if(m) return (memberinfo_t*)m; - } - m = (slotinfo_t*)dict_lookup(&s->static_members, &tmp); - if(m) return (memberinfo_t*)m; - - s = s->superclass; - } - } - t++; - } - return 0; -} - -memberinfo_t* registry_findmember_nsset(classinfo_t*cls, namespace_list_t*ns, const char*name, char superclasses, char is_static) -{ - memberinfo_t*m = 0; - while(ns) { - m = registry_findmember(cls, ns->namespace->name, name, superclasses, is_static); - if(m) return m; - ns = ns->next; - } - m = registry_findmember(cls, "", name, superclasses, is_static); - if(m) return m; - /* TODO: it maybe would be faster to just store the builtin namespace as "" in - builtins.c (update: some members (e.g. XML.length) are present both for - "" and "http:...builtin") */ - m = registry_findmember(cls, "http://adobe.com/AS3/2006/builtin", name, superclasses, is_static); - if(m) return m; - return 0; -} - - -void registry_fill_multiname(multiname_t*m, namespace_t*n, slotinfo_t*c) -{ - m->type = QNAME; - m->ns = n; - m->ns->access = c->access; - m->ns->name = (char*)c->package; - m->name = c->name; - m->namespace_set = 0; -} -multiname_t* classinfo_to_multiname(slotinfo_t*cls) -{ - if(!cls) - return 0; - multiname_t*m=0; - namespace_t ns = {cls->access, (char*)cls->package}; - return multiname_new(&ns,cls->name); -} - -// ----------------------- memberinfo methods ------------------------------ - -/* hacky code to wrap a variable or function into a "type" - object, but keep a pointer to the "value" */ -static dict_t* functionobjects = 0; -classinfo_t* slotinfo_asclass(slotinfo_t*f) { - if(!functionobjects) { - functionobjects = dict_new2(&ptr_type); - } else { - classinfo_t*c = dict_lookup(functionobjects, f); - if(c) - return c; - } - - classinfo_t*c = rfx_calloc(sizeof(classinfo_t)+sizeof(classinfo_t*)); - c->access = ACCESS_PUBLIC; - c->package = ""; - if(f->kind == INFOTYPE_METHOD) { - c->name = "Function"; - c->superclass = registry_getobjectclass(); - } else if(f->kind == INFOTYPE_CLASS) { - c->name = "Class"; - c->superclass = registry_getobjectclass(); - } else if(f->kind == INFOTYPE_VAR) { - c->name = "Object"; - } else { - c->name = "undefined"; - } - - dict_init2(&c->members, &memberinfo_type, 1); - dict_init2(&c->static_members, &memberinfo_type, 1); - c->data = f; - dict_put(functionobjects, f, c); - return c; -} - -classinfo_t* slotinfo_gettype(slotinfo_t*f) -{ - if(f) { - if(f->kind == INFOTYPE_METHOD) { - return slotinfo_asclass(f); - } else if(f->kind == INFOTYPE_VAR) { - varinfo_t*v = (varinfo_t*)f; - return v->type; - } else - return 0; - } else { - return TYPE_ANY; - } -} - -// ----------------------- package handling --------------------------- -char registry_ispackage(const char*package) -{ - /* crude approximation of "the real thing", but sufficient for now */ - return !strncmp(package, "flash", 5); -} -// ----------------------- builtin types ------------------------------ - -char registry_isfunctionclass(classinfo_t*c) { - return (c && c->package && c->name && - !strcmp(c->package, "") && !strcmp(c->name, "Function")); -} -char registry_isclassclass(classinfo_t*c) { - return (c && c->package && c->name && - !strcmp(c->package, "") && !strcmp(c->name, "Class")); -} - -classinfo_t* registry_getobjectclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "Object"); - return c; -} -classinfo_t* registry_getstringclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "String"); - return c; -} -classinfo_t* registry_getarrayclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "Array"); - return c; -} -classinfo_t* registry_getintclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "int"); - return c; -} -classinfo_t* registry_getuintclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "uint"); - return c; -} -classinfo_t* registry_getbooleanclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "Boolean"); - return c; -} -classinfo_t* registry_getnumberclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "Number"); - return c; -} -classinfo_t* registry_getregexpclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "RegExp"); - return c; -} -classinfo_t* registry_getdateclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "Date"); - return c; -} -classinfo_t* registry_getxmlclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "XML"); - return c; -} -classinfo_t* registry_getxmllistclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "XMLList"); - return c; -} -classinfo_t* registry_getnamespaceclass() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("", "Namespace"); - return c; -} -classinfo_t* registry_getMovieClip() { - static classinfo_t*c = 0; - if(!c) c = (classinfo_t*)registry_safefind("flash.display", "MovieClip"); - return c; -} - -// ----------------------- builtin dummy types ------------------------- -classinfo_t nullclass = { - INFOTYPE_CLASS,0,0,ACCESS_PACKAGE, "", "null", 0, 0, 0 -}; -classinfo_t* registry_getnullclass() { - return &nullclass; -} -classinfo_t voidclass = { - INFOTYPE_CLASS,0,0,ACCESS_PACKAGE, "", "void", 0, 0, 0 -}; -classinfo_t* registry_getvoidclass() { - return &voidclass; -} - -namespace_t access2namespace(U8 access, char*package) -{ - namespace_t ns; - ns.access = access; - ns.name = package; - return ns; -} - -char* infotypename(slotinfo_t*s) -{ - if(!s) - return "(unknown)"; - if(s->kind == INFOTYPE_CLASS) return "class"; - else if(s->kind == INFOTYPE_VAR) return "var"; - else if(s->kind == INFOTYPE_METHOD) return "function"; - else return "object"; -} - -void slotinfo_dump(slotinfo_t*s) -{ - if(s->package[0]) { - printf("%s %s.%s", infotypename(s), s->package, s->name); - } else { - printf("%s %s", infotypename(s), s->name); - } - if(s->kind == INFOTYPE_CLASS) { - classinfo_t*c = (classinfo_t*)s; - } - else if(s->kind == INFOTYPE_VAR) { - varinfo_t*v = (varinfo_t*)s; - printf(":%s", v->type?v->type->name:"*"); - if(v->value) - printf("=%s", constant_tostring(v->value)); - if(v->slot) - printf(" (slot:%d)", v->slot); - } - else if(s->kind == INFOTYPE_METHOD) { - methodinfo_t*m = (methodinfo_t*)s; - } - else { - } - printf("\n"); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.h deleted file mode 100644 index dc5d277db..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/registry.h +++ /dev/null @@ -1,231 +0,0 @@ -/* registry.h - - Routines for compiling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __abc_registry_h__ -#define __abc_registry_h__ - -#include "abc.h" - -DECLARE(asset_bundle); -DECLARE_LIST(asset_bundle); -DECLARE(slotinfo); -DECLARE(classinfo); -DECLARE(memberinfo); -DECLARE(methodinfo); -DECLARE(unresolvedinfo); -DECLARE(varinfo); -DECLARE_LIST(classinfo); -DECLARE_LIST(slotinfo); - -/* member/class flags */ -#define FLAG_FINAL 1 -#define FLAG_BUILTIN 128 -#define FLAG_USED 64 - -/* member flags */ -#define FLAG_STATIC 2 -#define FLAG_OVERRIDE 8 -#define FLAG_NATIVE 16 -#define FLAG_CONST 32 - -/* class flags */ -#define FLAG_DYNAMIC 8 -#define FLAG_INTERFACE 16 - -#define INFOTYPE_VAR 1 -#define INFOTYPE_METHOD 2 -#define INFOTYPE_CLASS 3 -#define INFOTYPE_UNRESOLVED 4 -#define SUBTYPE_GET 1 -#define SUBTYPE_SET 2 -#define SUBTYPE_GETSET 3 - -#define SLOTINFO_HEAD \ - U8 kind,subtype,flags,access; \ - const char*package; \ - const char*name; \ - int slot; - -struct _slotinfo { - SLOTINFO_HEAD; -}; -struct _unresolvedinfo { - SLOTINFO_HEAD; - namespace_list_t*nsset; -}; -struct _classinfo { - SLOTINFO_HEAD; - classinfo_t*superclass; - dict_t members; - dict_t static_members; - void*data; //TODO: get rid of this- parser.y should pass type/value/code triples around - asset_bundle_t*assets; - classinfo_t*interfaces[]; -}; -struct _memberinfo { - SLOTINFO_HEAD; - union { - classinfo_t*return_type; - classinfo_t*type; - }; - classinfo_t*parent; -}; -struct _methodinfo /*extends memberinfo*/ { - SLOTINFO_HEAD; - classinfo_t*return_type; - classinfo_t*parent; - classinfo_list_t*params; -}; -struct _varinfo /*extends memberinfo*/ { - SLOTINFO_HEAD; - classinfo_t*type; - classinfo_t*parent; - constant_t*value; -}; - -struct _asset_bundle { - abc_file_t*file; - asset_bundle_list_t*dependencies; - char used; -}; - -extern type_t memberinfo_type; -extern type_t slotinfo_type; -char slotinfo_equals(slotinfo_t*c1, slotinfo_t*c2); - -void registry_init(); - -classinfo_t* classinfo_register(int access, const char*package, const char*name, int num_interfaces); -methodinfo_t* methodinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static); -methodinfo_t* methodinfo_register_global(U8 access, const char*package, const char*name); -varinfo_t* varinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static); -varinfo_t* varinfo_register_global(U8 access, const char*package, const char*name); - -slotinfo_t* registry_resolve(slotinfo_t*s); -void registry_resolve_all(); - -slotinfo_t* registry_find(const char*package, const char*name); -void registry_dump(); -memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*name, char superclasses, char is_static); -memberinfo_t* registry_findmember_nsset(classinfo_t*cls, namespace_list_t*ns, const char*name, char superclasses, char is_static); - -void registry_fill_multiname(multiname_t*m, namespace_t*n, slotinfo_t*c); -#define MULTINAME(m,x) \ - multiname_t m;\ - namespace_t m##_ns;\ - (x)->package; \ - registry_fill_multiname(&m, &m##_ns, (slotinfo_t*)(x)); - -multiname_t* classinfo_to_multiname(slotinfo_t*cls); - -char registry_isfunctionclass(); -char registry_isclassclass(); - -classinfo_t* slotinfo_asclass(slotinfo_t*f); -classinfo_t* slotinfo_gettype(slotinfo_t*); - -namespace_t access2namespace(U8 access, char*package); - -char registry_ispackage(const char*package); - -void registry_add_asset(asset_bundle_t*bundle); -void registry_use(slotinfo_t*s); -asset_bundle_list_t*registry_getassets(); - -// static multinames -classinfo_t voidclass; -classinfo_t* registry_getanytype(); -classinfo_t* registry_getarrayclass(); -classinfo_t* registry_getobjectclass(); -classinfo_t* registry_getnumberclass(); -classinfo_t* registry_getstringclass(); -classinfo_t* registry_getdateclass(); -classinfo_t* registry_getintclass(); -classinfo_t* registry_getuintclass(); -classinfo_t* registry_getnullclass(); -classinfo_t* registry_getvoidclass(); -classinfo_t* registry_getarrayclass(); -classinfo_t* registry_getregexpclass(); -classinfo_t* registry_getxmlclass(); -classinfo_t* registry_getxmllistclass(); -classinfo_t* registry_getbooleanclass(); -classinfo_t* registry_getMovieClip(); -classinfo_t* registry_getclassclass(classinfo_t*a); -classinfo_t* registry_getnamespaceclass(); -extern classinfo_t voidclass; - -char* infotypename(slotinfo_t*s); -void slotinfo_dump(slotinfo_t*s); - -/* convenience functions */ -#define sig2mname(x) (x->superclass,classinfo_to_multiname((slotinfo_t*)(x))) - -#define TYPE_ANY (0) -#define TYPE_IS_ANY(t) ((t) == 0) -#define TYPE_INT registry_getintclass() -#define TYPE_IS_INT(t) ((t) == registry_getintclass()) -#define TYPE_UINT registry_getuintclass() -#define TYPE_IS_UINT(t) ((t) == registry_getuintclass()) -#define TYPE_NUMBER registry_getnumberclass() -#define TYPE_IS_NUMBER(t) ((t) == registry_getnumberclass()) -#define TYPE_FLOAT registry_getnumberclass() -#define TYPE_IS_FLOAT(t) ((t) == registry_getnumberclass()) -#define TYPE_BOOLEAN registry_getbooleanclass() -#define TYPE_IS_BOOLEAN(t) ((t) == registry_getbooleanclass()) -#define TYPE_STRING registry_getstringclass() -#define TYPE_IS_STRING(t) ((t) == registry_getstringclass()) -#define TYPE_DATE registry_getdateclass() -#define TYPE_IS_DATE(t) ((t) == registry_getdateclass()) -#define TYPE_OBJECT registry_getobjectclass() -#define TYPE_IS_OBJECT(t) ((t) == registry_getobjectclass()) -#define TYPE_REGEXP registry_getregexpclass() -#define TYPE_IS_REGEXP(t) ((t) == registry_getregexpclass()) -#define TYPE_VOID registry_getvoidclass() -#define TYPE_IS_VOID(t) ((t) == registry_getvoidclass()) -#define TYPE_ARRAY registry_getarrayclass() -#define TYPE_IS_ARRAY(t) ((t) == registry_getarrayclass()) -#define TYPE_NAMESPACE registry_getnamespaceclass() -#define TYPE_IS_NAMESPACE(t) ((t) == registry_getnamespaceclass()) -#define TYPE_FUNCTION(f) ((f)->return_type,slotinfo_asclass((slotinfo_t*)(f))) -#define TYPE_IS_FUNCTION(t) registry_isfunctionclass(t) -#define TYPE_CLASS(f) ((f)->superclass,slotinfo_asclass((slotinfo_t*)(f))) -#define TYPE_IS_CLASS(t) registry_isclassclass(t) -#define TYPE_NULL registry_getnullclass() -#define TYPE_IS_NULL(t) ((t) == registry_getnullclass()) -#define TYPE_VOID registry_getvoidclass() -#define TYPE_IS_VOID(t) ((t) == registry_getvoidclass()) -#define TYPE_XML registry_getxmlclass() -#define TYPE_IS_XML(t) ((t) == registry_getxmlclass()) -#define TYPE_XMLLIST registry_getxmllistclass() -#define TYPE_IS_XMLLIST(t) ((t) == registry_getxmllistclass()) - -#define TYPE_IS_BUILTIN_SIMPLE(type) (TYPE_IS_INT(type) || \ - TYPE_IS_UINT(type) || \ - TYPE_IS_FLOAT(type) || \ - TYPE_IS_BOOLEAN(type) || \ - TYPE_IS_STRING(type)) - -#define IS_NUMBER_OR_INT(a) (TYPE_IS_INT((a)) || TYPE_IS_UINT((a)) || TYPE_IS_NUMBER((a))) - - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.c deleted file mode 100644 index 24317ccab..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.c +++ /dev/null @@ -1,299 +0,0 @@ -/* scripts.c - - Some hardcoded abc scripts. - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008,2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include "abc.h" - -void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events) -{ - int num_frames = 0; - int has_buttons = 0; - TAG*tag=swf->firstTag; - - unsigned int checksum = 0; - while(tag) { - if(tag->id == ST_SHOWFRAME) - num_frames++; - if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) - has_buttons = 1; - crc32_add_bytes(checksum, tag->data, tag->len); - tag = tag->next; - } - int t = time(0); - checksum = crc32_add_bytes(checksum, &t, sizeof(t)); - - unsigned char h[16]; - unsigned char file_signature[33]; - sprintf((char*)file_signature, "%x", checksum); - - char scenename1[80], scenename2[80]; - sprintf(scenename1, "rfx.MainTimeline_%s", file_signature); - sprintf(scenename2, "rfx::MainTimeline_%s", file_signature); - - abc_file_t*file = abc_file_new(); - abc_method_body_t*c = 0; - - abc_class_t*cls = abc_class_new2(file, scenename2, "flash.display::MovieClip"); - - TAG*abctag = swf_InsertTagBefore(swf, swf->firstTag, ST_DOABC); - - tag = swf_InsertTag(abctag, ST_SYMBOLCLASS); - swf_SetU16(tag, 1); - swf_SetU16(tag, 0); - swf_SetString(tag, scenename1); - - c = abc_class_getstaticconstructor(cls, 0)->body; - c->old.max_stack = 1; - c->old.local_count = 1; - c->old.init_scope_depth = 9; - c->old.max_scope_depth = 10; - - __ getlocal_0(c); - __ pushscope(c); - __ returnvoid(c); - - c = abc_class_getconstructor(cls, 0)->body; - c->old.max_stack = 3; - c->old.local_count = 1; - c->old.init_scope_depth = 10; - c->old.max_scope_depth = 11; - - debugfile(c, "constructor.as"); - - __ getlocal_0(c); - __ pushscope(c); - - __ getlocal_0(c); - __ constructsuper(c,0); - - __ getlex(c, "[package]flash.system::Security"); - __ pushstring(c, "*"); - __ callpropvoid(c, "[package]::allowDomain", 1); - - if(stop_each_frame || has_buttons) { - int frame = 0; - tag = swf->firstTag; - abc_method_body_t*f = 0; //frame script - while(tag && tag->id!=ST_END) { - char framename[80]; - char needs_framescript=0; - char buttonname[80]; - char functionname[80]; - sprintf(framename, "[packageinternal]rfx::frame%d_%s", frame, file_signature); - - if(!f && (tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2 || stop_each_frame)) { - /* make the contructor add a frame script */ - __ findpropstrict(c,"[package]::addFrameScript"); - __ pushuint(c,frame); - __ getlex(c,framename); - __ callpropvoid(c,"[package]::addFrameScript",2); - - f = abc_class_method(cls, 0, multiname_fromstring(framename))->body; - f->old.max_stack = 3; - f->old.local_count = 1; - f->old.init_scope_depth = 10; - f->old.max_scope_depth = 11; - __ debugfile(f, "framescript.as"); - __ debugline(f, 1); - __ getlocal_0(f); - __ pushscope(f); - if(stop_each_frame) { - __ findpropstrict(f, "[package]::stop"); - __ callpropvoid(f, "[package]::stop", 0); - } - } - - if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) { - U16 id = swf_GetDefineID(tag); - sprintf(buttonname, "::button%d", swf_GetDefineID(tag)); - __ getlex(f,buttonname); - __ getlex(f,"flash.events::MouseEvent"); - __ getproperty(f, "::CLICK"); - sprintf(functionname, "::clickbutton%d_%s", swf_GetDefineID(tag), file_signature); - __ getlex(f,functionname); - __ callpropvoid(f, "::addEventListener" ,2); - - needs_framescript = 1; - - abc_method_body_t*h = - abc_class_method(cls, 0, multiname_fromstring(functionname))->body; - list_append(h->method->parameters, multiname_fromstring("flash.events::MouseEvent")); - - h->old.max_stack = 6; - h->old.local_count = 2; - h->old.init_scope_depth = 10; - h->old.max_scope_depth = 11; - __ getlocal_0(h); - __ pushscope(h); - - ActionTAG*oldaction = swf_ButtonGetAction(tag); - if(oldaction && oldaction->op == ACTION__GOTOFRAME) { - int framenr = GET16(oldaction->data); - if(!events) { - __ findpropstrict(h,"[package]::gotoAndStop"); - __ pushuint(h,framenr+1); - __ callpropvoid(h,"[package]::gotoAndStop", 1); - } else { - char framename[80]; - sprintf(framename, "frame%d_%s", framenr, file_signature); - __ getlocal_0(h); //this - __ findpropstrict(h, "[package]flash.events::TextEvent"); - __ pushstring(h, "link"); - __ pushtrue(h); - __ pushtrue(h); - __ pushstring(h, framename); - __ constructprop(h,"[package]flash.events::TextEvent", 4); - __ callpropvoid(h,"[package]::dispatchEvent", 1); - } - } else if(oldaction && oldaction->op == ACTION__GETURL) { - if(!events) { - __ findpropstrict(h,"flash.net::navigateToURL"); - __ findpropstrict(h,"flash.net::URLRequest"); - // TODO: target _blank - __ pushstring(h,(char*)oldaction->data); //url - __ constructprop(h,"flash.net::URLRequest", 1); - __ callpropvoid(h,"flash.net::navigateToURL", 1); - } else { - __ getlocal_0(h); //this - __ findpropstrict(h, "[package]flash.events::TextEvent"); - __ pushstring(h, "link"); - __ pushtrue(h); - __ pushtrue(h); - __ pushstring(h,(char*)oldaction->data); //url - __ constructprop(h,"[package]flash.events::TextEvent", 4); - __ callpropvoid(h,"[package]::dispatchEvent", 1); - } - } else if(oldaction) { - fprintf(stderr, "Warning: Couldn't translate button code of button %d to flash 9 abc action\n", id); - } - __ returnvoid(h); - swf_ActionFree(oldaction); - } - if(tag->id == ST_SHOWFRAME) { - if(f) { - __ returnvoid(f); - f = 0; - } - frame++; - } - tag = tag->next; - } - if(f) { - __ returnvoid(f); - } - } - __ returnvoid(c); - - tag = swf->firstTag; - while(tag) { - if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) { - char buttonname[80]; - sprintf(buttonname, "::button%d", swf_GetDefineID(tag)); - multiname_t*s = multiname_fromstring(buttonname); - //abc_class_slot(cls, multiname_fromstring(buttonname), s); - abc_class_slot(cls, multiname_fromstring(buttonname), - multiname_fromstring("flash.display::SimpleButton")); - } - tag = tag->next; - } - - - abc_script_t*s = abc_initscript(file); - c = s->method->body; - c->old.max_stack = 2; - c->old.local_count = 1; - c->old.init_scope_depth = 1; - c->old.max_scope_depth = 9; - - __ getlocal_0(c); - __ pushscope(c); - __ getscopeobject(c, 0); - __ getlex(c,"::Object"); - __ pushscope(c); - __ getlex(c,"flash.events::EventDispatcher"); - __ pushscope(c); - __ getlex(c,"flash.display::DisplayObject"); - __ pushscope(c); - __ getlex(c,"flash.display::InteractiveObject"); - __ pushscope(c); - __ getlex(c,"flash.display::DisplayObjectContainer"); - __ pushscope(c); - __ getlex(c,"flash.display::Sprite"); - __ pushscope(c); - __ getlex(c,"flash.display::MovieClip"); - __ pushscope(c); - __ getlex(c,"flash.display::MovieClip"); - __ newclass(c,cls); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ popscope(c); - __ initproperty(c,scenename2); - __ returnvoid(c); - - //abc_method_body_addClassTrait(c, "rfx:MainTimeline", 1, cls); - multiname_t*classname = multiname_fromstring(scenename2); - abc_initscript_addClassTrait(s, classname, cls); - multiname_destroy(classname); - - swf_WriteABC(abctag, file); -} - -TAG*swf_AddAS3FontDefine(TAG*tag, U16 id, char*fontname) -{ - tag = swf_InsertTag(tag, ST_DOABC); - abc_file_t*file = abc_file_new(); - - //abc_class_t*cls = abc_class_new2(file, fontname, "flash.display::MovieClip"); - //abc_class_slot(cls, multiname_fromstring(fontname), multiname_fromstring("flash.text::Font")); - - abc_class_t*cls = abc_class_new2(file, fontname, "flash.text::Font"); - - abc_script_t*s = abc_initscript(file); - code_t*c = s->method->body->code; - c = abc_getlocal_0(c); - c = abc_pushscope(c); - c = abc_getscopeobject(c, 0); - c = abc_getlex(c,"flash.text::Font"); - c = abc_pushscope(c); - c = abc_getlex(c,"flash.text::Font"); - c = abc_newclass(c,cls); - c = abc_popscope(c); - c = abc_initproperty(c, fontname); - c = abc_returnvoid(c); - s->method->body->code = c; - - abc_initscript_addClassTrait(s, multiname_fromstring(fontname), cls); - swf_WriteABC(tag, file); - - tag = swf_InsertTag(tag, ST_SYMBOLCLASS); - swf_SetU16(tag, 1); - swf_SetU16(tag, id); - swf_SetString(tag, fontname); - - return tag; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.h deleted file mode 100644 index ec2c4772c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/scripts.h +++ /dev/null @@ -1,30 +0,0 @@ -/* scripts.h - - Some hardcoded abc scripts (header file) - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008,2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifdef __abc_scripts_h__ -#define __abc_scripts_h__ - -void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events); -TAG*swf_AddAS3FontDefine(TAG*tag, U16 id, char*fontname); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/state.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/state.c deleted file mode 100644 index aec9fcf20..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/state.c +++ /dev/null @@ -1,95 +0,0 @@ -#include "state.h" -#include "common.h" - -state_t* state = 0; - -void new_state() -{ - NEW(state_t, s); - state_t*oldstate = state; - if(state) - memcpy(s, state, sizeof(state_t)); //shallow copy - if(!s->imports) { - s->imports = dict_new(); - } - if(!s->import_toplevel_packages) { - s->import_toplevel_packages = dict_new(); - } - state = s; - state->level++; - state->has_own_imports = 0; - state->vars = dict_new(); - state->old = oldstate; - state->new_vars = 0; - - state->namespaces = dict_new(); - - if(oldstate) - state->active_namespace_urls = list_clone(oldstate->active_namespace_urls); -} - -void state_destroy(state_t*state) -{ - if(state->has_own_imports) { - list_free(state->wildcard_imports); - dict_destroy(state->imports);state->imports=0; - } - if(state->imports && (!state->old || state->old->imports!=state->imports)) { - dict_destroy(state->imports);state->imports=0; - } - if(state->vars) { - dict_destroy(state->vars);state->vars=0; - } - - list_free(state->active_namespace_urls) - state->active_namespace_urls = 0; - - free(state); -} - -void old_state() -{ - if(!state || !state->old) - syntaxerror("invalid nesting"); - state_t*leaving = state; - - state = state->old; - - if(as3_pass>1 && leaving->method && leaving->method != state->method && !leaving->method->inner) { - methodstate_destroy(leaving->method);leaving->method=0; - } - if(as3_pass>1 && leaving->cls && leaving->cls != state->cls) { - free(leaving->cls); - leaving->cls=0; - } - - state_destroy(leaving); -} - -methodstate_t*methodstate_new() -{ - NEW(methodstate_t,m); - m->allvars = dict_new(); - return m; -} - -void methodstate_destroy(methodstate_t*m) -{ - dict_destroy(m->unresolved_variables); m->unresolved_variables = 0; - list_free(m->innerfunctions);m->innerfunctions=0; - - if(m->allvars) { - DICT_ITERATE_DATA(m->allvars, void*, data) {free(data);} - m->allvars = 0; - } -} - -dict_t*definitions=0; -void as3_set_define(const char*c) -{ - if(!definitions) - definitions = dict_new(); - if(!dict_contains(definitions,c)) - dict_put(definitions,c,0); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/state.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/state.h deleted file mode 100644 index b20b31e12..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/state.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef __state_h__ -#define __state_h__ - -#include "../q.h" -#include "abc.h" -#include "registry.h" -#include "initcode.h" - -DECLARE(state); -DECLARE_LIST(state); -DECLARE(import); -DECLARE_LIST(import); -DECLARE(methodstate); -DECLARE_LIST(methodstate); -DECLARE(classstate); - -struct _state { - struct _state*old; - int level; - - char*package; - import_list_t*wildcard_imports; - dict_t*import_toplevel_packages; - dict_t*imports; - - dict_t*namespaces; - namespace_list_t*active_namespace_urls; - - char has_own_imports; - char new_vars; // e.g. transition between two functions - char xmlfilter; // are we inside a xmlobj..() filter? - - classstate_t*cls; - methodstate_t*method; - - char*exception_name; - - int switch_var; - - dict_t*vars; -}; - -extern state_t* state; - -struct _import { - char*package; -}; - -struct _classstate { - /* class data */ - classinfo_t*info; - abc_class_t*abc; - - methodstate_t*init; - methodstate_t*static_init; - //code_t*init; - //code_t*static_init; - parsedclass_t*dependencies; - - char has_constructor; -}; - -struct _methodstate { - /* method data */ - methodinfo_t*info; - char has_exceptions; - char late_binding; - char is_constructor; - char has_super; - char is_global; - char is_static; - int variable_count; - - dict_t*unresolved_variables; - dict_t*allvars; // all variables (in all sublevels, but not for inner functions) - - char inner; - char uses_parent_function; - char no_variable_scoping; - int uses_slots; - dict_t*slots; - int activation_var; - - int need_arguments; - - abc_method_t*abc; - int var_index; // for inner methods - int slot_index; // for inner methods - char is_a_slot; // for inner methods - - code_t*header; - - code_t*scope_code; - abc_exception_list_t*exceptions; - - methodstate_list_t*innerfunctions; -}; - -void new_state(); -void old_state(); - -methodstate_t*methodstate_new(); -void methodstate_destroy(methodstate_t*m); - -extern dict_t*definitions; -void as3_set_define(const char*c); - -#endif //__state_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.h b/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.h deleted file mode 100644 index 9a939ec8e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.h +++ /dev/null @@ -1,98 +0,0 @@ -/* tokenizer.h - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __parser_h__ -#define __parser_h__ - -#include "../q.h" -#include "abc.h" -#include "pool.h" -#include "files.h" -#include "tokenizer.h" -#include "registry.h" -#include "code.h" -#include "opcodes.h" -#include "expr.h" - -DECLARE(token); -DECLARE_LIST(token); -DECLARE(param); -DECLARE_LIST(param); -DECLARE(params); -DECLARE(modifiers); -DECLARE(namespace_decl); -DECLARE_LIST(namespace_decl); -DECLARE_LIST(typedcode); - -struct _param { - char*name; - classinfo_t*type; - constant_t*value; -}; - -struct _params { - param_list_t*list; - char varargs; -}; - -struct _modifiers { - int flags; - char*ns; -}; -struct _namespace_decl { - const char*name; - const char*url; -}; - -/* small helper structs: */ -typedef struct _codeandnumber { - code_t*cc; - int number; -} codeandnumber_t; -typedef struct _for_start { - char*name; - char each; -} for_start_t; -typedef struct _regexp { - char*pattern; - char*options; -} regexp_t; - -extern char start_of_expression; - -typedef token_t*tokenptr_t; - -#include "parser.tab.h" - -extern char*token2string(enum yytokentype nr, YYSTYPE v); -extern unsigned int as3_tokencount; - -void as3_buffer_input(void*buffer, int len); -void as3_file_input(FILE*fi); - -void tokenizer_begin_xml(); -void tokenizer_begin_xmltext(); -void tokenizer_end_xmltext(); -void tokenizer_end_xml(); - -#define T_EOF 0 - -extern int avm2_lex(); -extern int avm2_lex_destroy(); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.yy.c b/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.yy.c deleted file mode 100644 index a0850df09..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/as3/tokenizer.yy.c +++ /dev/null @@ -1,4232 +0,0 @@ -#line 2 "tokenizer.yy.c" - -#line 4 "tokenizer.yy.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define yy_create_buffer as3__create_buffer -#define yy_delete_buffer as3__delete_buffer -#define yy_flex_debug as3__flex_debug -#define yy_init_buffer as3__init_buffer -#define yy_flush_buffer as3__flush_buffer -#define yy_load_buffer_state as3__load_buffer_state -#define yy_switch_to_buffer as3__switch_to_buffer -#define yyin as3_in -#define yyleng as3_leng -#define yylex as3_lex -#define yylineno as3_lineno -#define yyout as3_out -#define yyrestart as3_restart -#define yytext as3_text -#define yywrap as3_wrap -#define yyalloc as3_alloc -#define yyrealloc as3_realloc -#define yyfree as3_free - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* 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; -#endif /* ! C99 */ - -/* 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 - -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* 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 as3_restart(as3_in ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#define YY_BUF_SIZE 16384 -#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 - -extern yy_size_t as3_leng; - -extern FILE *as3_in, *as3_out; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up as3_text. */ \ - 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 as3_text 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 - { - FILE *yy_input_file; - - 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. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - yy_size_t 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 as3_restart()), so that the user can continue scanning by - * just pointing as3_in at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* 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 = 0; /**< Stack as an array. */ - -/* 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)] - -/* yy_hold_char holds the character lost when as3_text is formed. */ -static char yy_hold_char; -static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ -yy_size_t as3_leng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow as3_wrap()'s to do buffer switches - * instead of setting up a fresh as3_in. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void as3_restart (FILE *input_file ); -void as3__switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE as3__create_buffer (FILE *file,int size ); -void as3__delete_buffer (YY_BUFFER_STATE b ); -void as3__flush_buffer (YY_BUFFER_STATE b ); -void as3_push_buffer_state (YY_BUFFER_STATE new_buffer ); -void as3_pop_buffer_state (void ); - -static void as3_ensure_buffer_stack (void ); -static void as3__load_buffer_state (void ); -static void as3__init_buffer (YY_BUFFER_STATE b,FILE *file ); - -#define YY_FLUSH_BUFFER as3__flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE as3__scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE as3__scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE as3__scan_bytes (yyconst char *bytes,yy_size_t len ); - -void *as3_alloc (yy_size_t ); -void *as3_realloc (void *,yy_size_t ); -void as3_free (void * ); - -#define yy_new_buffer as3__create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - as3_ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - as3__create_buffer(as3_in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - as3_ensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - as3__create_buffer(as3_in,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -typedef unsigned char YY_CHAR; - -FILE *as3_in = (FILE *) 0, *as3_out = (FILE *) 0; - -typedef int yy_state_type; - -extern int as3_lineno; - -int as3_lineno = 1; - -extern char *as3_text; -#define yytext_ptr as3_text - -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 yy_fatal_error (yyconst char msg[] ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up as3_text. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - as3_leng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 130 -#define YY_END_OF_BUFFER 131 -/* 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 yyconst flex_int16_t yy_accept[705] = - { 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 131, 130, 31, 127, 130, 127, 127, 127, - 130, 127, 128, 126, 127, 127, 73, 127, 130, 130, - 130, 75, 127, 127, 127, 125, 125, 126, 127, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 29, 127, 126, 31, - 130, 130, 125, 129, 31, 127, 129, 127, 127, 127, - 129, 127, 128, 126, 127, 127, 73, 127, 129, 129, - 129, 75, 127, 127, 127, 125, 125, 126, 127, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - - 125, 125, 125, 125, 125, 125, 28, 127, 126, 31, - 129, 129, 125, 29, 127, 127, 73, 127, 129, 129, - 129, 17, 17, 19, 20, 18, 16, 16, 129, 12, - 15, 11, 14, 13, 10, 15, 15, 49, 0, 6, - 0, 125, 0, 0, 61, 47, 64, 0, 0, 62, - 56, 57, 55, 59, 72, 0, 3, 0, 60, 34, - 34, 0, 0, 0, 0, 74, 0, 68, 54, 52, - 53, 70, 0, 125, 0, 125, 125, 125, 58, 125, - 124, 125, 125, 125, 125, 125, 44, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 123, 125, 122, 121, - - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 63, 48, 125, 31, 0, 122, 0, 0, 0, - 0, 0, 3, 23, 60, 0, 26, 26, 0, 0, - 0, 0, 17, 0, 0, 9, 15, 0, 15, 50, - 125, 0, 71, 35, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 66, 51, 65, 69, - 0, 0, 0, 0, 0, 0, 0, 125, 36, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 43, 125, 117, 125, 125, 125, 125, - - 125, 116, 125, 125, 125, 125, 125, 125, 125, 118, - 125, 125, 125, 125, 125, 120, 125, 125, 115, 119, - 125, 125, 125, 30, 125, 0, 26, 26, 0, 0, - 27, 23, 0, 0, 0, 23, 0, 23, 23, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 2, 0, 33, 0, 32, 32, 0, 0, 67, 0, - 0, 0, 0, 125, 125, 113, 125, 125, 125, 125, - 125, 125, 125, 108, 112, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 111, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 110, 125, 125, 109, - - 125, 114, 125, 27, 0, 0, 0, 0, 23, 0, - 23, 0, 0, 2, 0, 23, 23, 25, 0, 24, - 24, 0, 0, 0, 0, 2, 37, 0, 39, 0, - 0, 0, 125, 106, 103, 101, 102, 125, 125, 125, - 125, 125, 105, 104, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 107, 125, - 100, 125, 125, 45, 125, 25, 0, 24, 24, 0, - 0, 2, 0, 23, 23, 0, 0, 0, 0, 0, - 0, 38, 0, 0, 125, 125, 125, 93, 125, 125, - 125, 125, 125, 98, 125, 125, 125, 125, 96, 125, - - 125, 125, 125, 95, 94, 97, 46, 99, 125, 125, - 23, 0, 0, 0, 0, 0, 0, 125, 125, 88, - 91, 92, 87, 125, 125, 125, 125, 125, 125, 125, - 89, 90, 125, 125, 125, 23, 8, 21, 0, 0, - 0, 40, 125, 83, 0, 125, 125, 86, 125, 125, - 125, 85, 125, 84, 125, 125, 0, 125, 125, 0, - 0, 41, 82, 0, 125, 125, 125, 125, 78, 80, - 79, 81, 0, 0, 0, 0, 0, 125, 125, 125, - 0, 0, 0, 0, 125, 77, 76, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 0, 125, 0, 125, 125, 125, 0, - 0, 0, 42, 42, 0, 0, 0, 4, 0, 0, - 0, 0, 4, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, - 0, 0, 125, 125, 125, 125, 0, 7, 0, 0, - 0, 39, 5, 39, 39, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 125, 22, 0, 7, - 0, 38, 5, 38, 38, 0, 0, 0, 5, 0, - 22, 0, 0, 0, 0, 40, 5, 40, 40, 41, - - 5, 41, 41, 0 - } ; - -static yyconst flex_int32_t 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, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 13, 17, 18, 19, 20, 21, 21, - 22, 21, 21, 21, 21, 21, 21, 23, 13, 24, - 25, 26, 13, 13, 27, 28, 29, 30, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 31, 28, 28, - 28, 28, 28, 32, 28, 28, 28, 28, 28, 28, - 33, 34, 35, 36, 37, 8, 38, 39, 40, 41, - - 42, 43, 44, 45, 46, 28, 47, 48, 49, 50, - 51, 52, 28, 53, 54, 55, 56, 57, 58, 59, - 60, 28, 61, 62, 63, 13, 8, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 64, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 65, 37, 37, 37, - 66, 37, 37, 67, 37, 37, 37, 37, 37, 37, - - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 68, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37 - } ; - -static yyconst flex_int32_t yy_meta[69] = - { 0, - 1, 2, 3, 2, 2, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 5, 4, 6, - 6, 6, 7, 8, 4, 8, 9, 9, 9, 9, - 9, 9, 4, 10, 4, 4, 11, 9, 9, 9, - 9, 12, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 13, 9, - 8, 4, 4, 11, 11, 11, 11, 11 - } ; - -static yyconst flex_int16_t yy_base[749] = - { 0, - 0, 1980, 68, 1979, 1963, 91, 122, 129, 150, 153, - 214, 0, 2022, 3900, 3900, 1996, 147, 90, 1995, 144, - 148, 3900, 3900, 1993, 143, 145, 143, 169, 265, 270, - 275, 1994, 161, 1990, 146, 296, 300, 3900, 1944, 328, - 138, 149, 153, 268, 299, 156, 293, 316, 256, 303, - 272, 320, 326, 334, 345, 348, 3900, 286, 3900, 286, - 1903, 1896, 354, 3900, 3900, 1931, 159, 298, 1903, 283, - 356, 3900, 3900, 1896, 393, 399, 405, 413, 413, 419, - 424, 1887, 424, 1878, 380, 397, 405, 3900, 1875, 0, - 399, 416, 420, 437, 441, 446, 455, 464, 403, 469, - - 459, 473, 479, 484, 492, 495, 3900, 360, 3900, 428, - 1818, 1814, 501, 3900, 164, 451, 538, 538, 146, 1811, - 0, 0, 0, 1827, 3900, 3900, 3900, 3900, 1806, 3900, - 1753, 3900, 3900, 3900, 3900, 1717, 297, 1712, 429, 3900, - 1659, 0, 544, 547, 3900, 3900, 3900, 477, 1646, 3900, - 3900, 3900, 3900, 3900, 1618, 550, 572, 532, 3900, 3900, - 562, 1542, 568, 1572, 1526, 3900, 1510, 1502, 3900, 1455, - 3900, 536, 591, 526, 595, 532, 549, 570, 3900, 562, - 556, 565, 567, 573, 575, 587, 578, 589, 593, 591, - 597, 612, 614, 603, 619, 621, 617, 625, 627, 630, - - 636, 634, 645, 652, 655, 650, 658, 660, 663, 669, - 667, 678, 672, 674, 683, 688, 691, 685, 694, 697, - 699, 3900, 3900, 702, 3900, 1411, 706, 742, 747, 752, - 755, 629, 780, 812, 752, 759, 3900, 770, 1388, 780, - 1421, 179, 0, 486, 1409, 3900, 1388, 0, 1381, 3900, - 0, 783, 3900, 3900, 806, 821, 872, 1377, 754, 3900, - 806, 857, 899, 962, 1370, 1325, 3900, 3900, 3900, 1311, - 1244, 987, 1209, 1206, 1138, 1144, 1104, 726, 734, 776, - 780, 793, 840, 766, 828, 946, 842, 955, 844, 952, - 959, 784, 964, 832, 967, 929, 978, 961, 980, 985, - - 950, 957, 989, 982, 993, 995, 1002, 1005, 1007, 1011, - 1013, 1020, 1016, 1024, 1030, 1026, 1034, 1039, 1032, 1036, - 1041, 1043, 1053, 3900, 1051, 1080, 3900, 1088, 1091, 1142, - 3900, 0, 1113, 1122, 1142, 1123, 1147, 0, 1163, 1098, - 1113, 1223, 1286, 1114, 1112, 1092, 0, 495, 1168, 1312, - 1084, 1322, 3900, 0, 3900, 0, 997, 1014, 3900, 0, - 966, 890, 887, 1105, 1120, 1085, 1132, 1099, 1110, 1134, - 1264, 1145, 1279, 1125, 1253, 1285, 1292, 1302, 1289, 1298, - 1276, 1315, 1304, 1306, 1308, 1310, 1313, 1332, 1334, 1329, - 1327, 1321, 1338, 1323, 1349, 1340, 1325, 1346, 1352, 1354, - - 1359, 1356, 1361, 3900, 1398, 1401, 1443, 1506, 0, 1525, - 1569, 1532, 1559, 873, 1629, 1663, 0, 3900, 0, 3900, - 0, 873, 871, 815, 1423, 3900, 3900, 804, 3900, 0, - 758, 750, 1484, 1375, 1377, 1379, 1381, 1495, 1502, 1504, - 1529, 1511, 1383, 1532, 1535, 1538, 1549, 1584, 1592, 1587, - 1552, 1597, 1603, 1599, 1692, 1694, 1605, 1696, 1500, 1688, - 1523, 1700, 1698, 1607, 1714, 3900, 0, 3900, 0, 1755, - 1760, 0, 1780, 0, 0, 779, 318, 768, 374, 739, - 717, 3900, 670, 660, 1685, 1724, 1718, 1712, 1747, 1732, - 1737, 1751, 1754, 1739, 1758, 1765, 1768, 1771, 1762, 1776, - - 1778, 1781, 1773, 1783, 1785, 1787, 1789, 1791, 1796, 1805, - 681, 467, 1110, 654, 627, 592, 0, 1798, 1812, 1858, - 1802, 1814, 1816, 1821, 1823, 1830, 1838, 1832, 1841, 1845, - 1835, 1843, 1848, 1851, 1904, 598, 3900, 3900, 578, 544, - 0, 3900, 1860, 1862, 1915, 1870, 1873, 1877, 1879, 1888, - 1893, 1890, 1898, 1895, 1909, 1912, 1973, 2040, 1906, 519, - 512, 3900, 1901, 493, 1934, 1936, 1919, 1938, 1940, 1944, - 1946, 1948, 2107, 627, 2112, 2123, 2116, 2189, 457, 0, - 481, 451, 430, 381, 1955, 1951, 1953, 2256, 2260, 2264, - 2268, 2272, 1977, 2276, 409, 1776, 2280, 2285, 2299, 2291, - - 2304, 2371, 2357, 2375, 2382, 2386, 2390, 2404, 2399, 2456, - 2471, 2477, 2482, 2486, 0, 2493, 0, 346, 2560, 354, - 342, 1149, 3900, 1959, 285, 2627, 2631, 2635, 254, 312, - 1952, 2639, 2643, 2647, 2651, 2655, 2667, 225, 2734, 2659, - 2725, 2759, 2770, 2776, 2813, 2782, 2805, 2849, 2827, 2853, - 220, 2860, 0, 0, 0, 144, 1734, 3900, 1822, 137, - 2871, 2884, 2893, 2897, 2901, 2968, 2941, 2950, 3007, 3016, - 3031, 3038, 3023, 3050, 3074, 3044, 0, 3900, 1910, 143, - 1984, 3056, 3089, 3122, 3126, 3130, 3140, 2122, 3144, 3157, - 138, 1988, 3164, 3231, 3294, 3196, 3210, 3214, 3267, 3280, - - 3284, 3319, 3333, 3900, 3400, 3413, 3418, 3431, 3444, 3456, - 3464, 3477, 3490, 3503, 3516, 3524, 3532, 3545, 3557, 3570, - 3579, 3592, 3605, 3617, 3626, 3634, 3647, 3660, 3668, 3673, - 3686, 3699, 3712, 3720, 3733, 3746, 3759, 3767, 3775, 3783, - 3796, 3808, 3821, 3834, 3847, 3860, 3873, 3886 - } ; - -static yyconst flex_int16_t yy_def[749] = - { 0, - 704, 1, 704, 3, 3, 3, 3, 3, 705, 705, - 704, 11, 704, 704, 704, 704, 706, 707, 704, 704, - 708, 704, 704, 704, 704, 704, 704, 704, 709, 709, - 709, 704, 704, 704, 704, 710, 710, 704, 704, 710, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 704, 704, 704, 40, - 711, 711, 40, 704, 704, 704, 706, 707, 704, 704, - 708, 704, 704, 704, 704, 704, 704, 712, 713, 713, - 713, 704, 704, 704, 704, 40, 40, 704, 704, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - - 40, 40, 40, 40, 40, 40, 704, 704, 704, 40, - 711, 711, 40, 704, 704, 704, 704, 704, 31, 31, - 31, 714, 714, 704, 704, 704, 704, 704, 715, 704, - 716, 704, 704, 704, 704, 716, 716, 704, 706, 704, - 706, 717, 707, 707, 704, 704, 704, 708, 708, 704, - 704, 704, 704, 704, 704, 718, 719, 720, 704, 704, - 718, 31, 704, 721, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 40, 704, 40, 40, 40, 704, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 704, 704, 40, 704, 711, 40, 704, 722, 722, - 723, 712, 724, 720, 712, 712, 704, 723, 81, 704, - 725, 704, 714, 704, 715, 704, 716, 726, 716, 704, - 717, 707, 704, 704, 719, 719, 727, 704, 720, 704, - 718, 718, 704, 721, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 704, 40, 728, 704, 728, 704, 729, - 704, 730, 724, 724, 731, 730, 724, 234, 712, 723, - 723, 704, 725, 704, 704, 704, 726, 732, 719, 727, - 704, 719, 704, 263, 704, 263, 704, 704, 704, 733, - 704, 704, 704, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - - 40, 40, 40, 704, 728, 728, 704, 729, 730, 734, - 719, 724, 731, 730, 724, 704, 339, 704, 342, 704, - 342, 735, 736, 704, 719, 704, 704, 704, 704, 737, - 704, 704, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 704, 407, 704, 407, 724, - 724, 730, 724, 411, 416, 735, 735, 736, 736, 704, - 704, 704, 704, 704, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 339, 735, 736, 704, 704, 704, 738, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 411, 704, 704, 704, 704, - 739, 704, 40, 40, 704, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 740, 704, 40, 704, - 741, 704, 40, 704, 40, 40, 40, 40, 40, 40, - 40, 40, 742, 743, 744, 742, 742, 704, 578, 558, - 745, 741, 741, 704, 40, 40, 40, 704, 704, 742, - 742, 742, 743, 704, 743, 746, 746, 744, 744, 742, - - 744, 744, 704, 704, 742, 742, 742, 742, 742, 742, - 747, 704, 704, 742, 578, 742, 578, 578, 704, 745, - 745, 741, 704, 40, 704, 742, 704, 704, 704, 746, - 746, 704, 704, 742, 742, 746, 744, 704, 742, 742, - 742, 742, 742, 740, 740, 742, 748, 744, 742, 742, - 704, 742, 578, 578, 619, 578, 745, 704, 741, 704, - 742, 704, 704, 742, 742, 639, 742, 742, 742, 743, - 748, 748, 748, 748, 747, 742, 619, 704, 745, 741, - 741, 704, 704, 742, 742, 742, 742, 743, 743, 748, - 745, 745, 742, 639, 639, 704, 704, 742, 742, 704, - - 704, 742, 742, 0, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704 - } ; - -static yyconst flex_int16_t yy_nxt[3969] = - { 0, - 14, 15, 15, 15, 15, 16, 17, 14, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, - 37, 36, 22, 14, 38, 39, 36, 40, 41, 42, - 43, 44, 45, 46, 36, 47, 36, 36, 36, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 36, 36, - 57, 58, 59, 60, 36, 36, 61, 62, 64, 65, - 15, 65, 65, 66, 67, 64, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 86, 86, 86, 87, 86, - - 72, 64, 88, 89, 86, 90, 91, 92, 93, 94, - 95, 96, 86, 97, 86, 86, 86, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 86, 86, 107, 108, - 109, 110, 86, 86, 111, 112, 113, 115, 116, 117, - 118, 119, 120, 121, 115, 116, 117, 118, 119, 120, - 121, 114, 123, 140, 146, 123, 143, 144, 151, 140, - 155, 153, 156, 156, 156, 140, 167, 152, 147, 154, - 171, 172, 621, 124, 113, 125, 124, 583, 125, 151, - 141, 149, 114, 157, 168, 169, 183, 158, 152, 114, - 182, 174, 141, 159, 186, 344, 184, 196, 704, 185, - - 632, 174, 174, 187, 164, 174, 174, 677, 174, 174, - 126, 266, 188, 126, 64, 127, 128, 127, 127, 64, - 129, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 130, 131, 131, 131, 64, 132, 133, 134, - 131, 131, 131, 131, 131, 131, 64, 64, 64, 64, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 135, 64, 64, 136, 131, 131, - 137, 131, 161, 612, 162, 162, 162, 161, 603, 162, - 162, 162, 161, 146, 162, 162, 162, 173, 173, 173, - - 173, 173, 173, 173, 173, 189, 163, 147, 174, 174, - 222, 163, 204, 208, 596, 190, 163, 627, 175, 248, - 174, 174, 175, 164, 174, 174, 191, 165, 704, 173, - 173, 173, 173, 704, 512, 197, 192, 178, 174, 174, - 205, 198, 199, 704, 193, 174, 200, 223, 588, 194, - 175, 174, 174, 201, 195, 206, 174, 202, 207, 176, - 249, 209, 177, 176, 143, 144, 177, 140, 174, 174, - 213, 203, 174, 174, 210, 211, 657, 212, 214, 174, - 180, 181, 218, 216, 222, 215, 174, 217, 621, 149, - 513, 176, 220, 221, 177, 219, 197, 174, 174, 704, - - 174, 174, 198, 227, 171, 172, 174, 200, 151, 653, - 228, 593, 229, 230, 230, 153, 228, 152, 229, 230, - 230, 223, 155, 154, 231, 231, 231, 233, 623, 242, - 238, 234, 239, 239, 239, 140, 238, 235, 239, 239, - 239, 238, 178, 239, 239, 239, 236, 168, 169, 174, - 174, 182, 174, 183, 240, 174, 174, 174, 174, 204, - 240, 186, 141, 184, 622, 240, 185, 153, 174, 174, - 187, 241, 174, 174, 189, 154, 165, 704, 192, 188, - 174, 174, 704, 512, 190, 583, 193, 196, 140, 174, - 174, 194, 537, 174, 174, 191, 195, 197, 174, 174, - - 208, 201, 345, 198, 199, 202, 205, 174, 200, 425, - 149, 174, 174, 426, 209, 621, 174, 174, 346, 203, - 619, 206, 174, 213, 207, 174, 174, 210, 211, 218, - 212, 214, 174, 216, 260, 260, 174, 217, 215, 220, - 221, 584, 219, 197, 174, 174, 583, 174, 174, 198, - 227, 581, 157, 174, 200, 155, 158, 156, 156, 156, - 269, 270, 159, 142, 142, 142, 142, 142, 142, 156, - 156, 156, 255, 255, 255, 255, 561, 142, 174, 174, - 142, 261, 261, 261, 174, 174, 257, 262, 262, 262, - 258, 163, 173, 173, 173, 173, 272, 272, 272, 272, - - 279, 174, 174, 163, 560, 280, 281, 704, 174, 174, - 284, 252, 278, 175, 174, 174, 258, 174, 174, 174, - 282, 283, 174, 174, 285, 174, 174, 174, 174, 286, - 174, 174, 289, 594, 287, 273, 541, 274, 288, 174, - 174, 174, 174, 174, 290, 174, 174, 332, 275, 174, - 174, 291, 276, 540, 173, 294, 174, 271, 272, 292, - 595, 277, 236, 293, 174, 174, 174, 174, 295, 174, - 174, 174, 174, 174, 174, 296, 297, 174, 174, 174, - 298, 299, 174, 174, 300, 539, 174, 174, 174, 174, - 301, 302, 303, 304, 305, 306, 308, 174, 174, 536, - - 307, 517, 174, 174, 174, 174, 311, 174, 174, 516, - 174, 174, 174, 174, 309, 174, 174, 310, 312, 174, - 174, 174, 174, 313, 314, 174, 174, 174, 318, 315, - 174, 174, 319, 316, 317, 174, 174, 320, 174, 321, - 174, 174, 322, 174, 174, 325, 174, 174, 515, 174, - 174, 174, 174, 323, 174, 174, 260, 260, 174, 298, - 299, 326, 326, 326, 328, 514, 230, 230, 230, 328, - 332, 230, 230, 230, 231, 231, 231, 339, 174, 174, - 333, 333, 255, 333, 479, 236, 174, 174, 329, 340, - 340, 340, 236, 329, 335, 477, 240, 484, 336, 341, - - 341, 341, 142, 142, 142, 330, 255, 255, 255, 255, - 704, 240, 483, 337, 260, 260, 142, 365, 174, 368, - 348, 255, 255, 255, 255, 261, 261, 261, 174, 174, - 481, 364, 174, 174, 366, 348, 174, 377, 338, 338, - 338, 338, 338, 338, 480, 174, 174, 163, 704, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 349, 349, 349, 349, 262, 262, 262, 367, - 174, 369, 370, 372, 174, 174, 350, 479, 374, 477, - 351, 352, 174, 174, 174, 174, 174, 174, 704, 353, - - 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, - 353, 353, 353, 353, 353, 353, 353, 353, 354, 354, - 354, 353, 353, 353, 353, 354, 354, 354, 354, 354, - 354, 353, 432, 353, 353, 431, 354, 354, 354, 354, - 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, - 354, 354, 354, 354, 354, 354, 354, 354, 354, 353, - 353, 353, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 356, - 355, 174, 174, 371, 355, 355, 355, 355, 272, 272, - 272, 272, 373, 375, 355, 385, 355, 355, 174, 174, - - 376, 378, 174, 174, 174, 174, 379, 174, 174, 174, - 174, 174, 174, 174, 174, 382, 174, 174, 430, 174, - 174, 383, 355, 355, 355, 380, 384, 273, 381, 274, - 174, 174, 174, 174, 387, 174, 386, 174, 174, 388, - 275, 174, 174, 428, 276, 174, 174, 174, 174, 427, - 272, 389, 391, 277, 174, 174, 390, 174, 174, 174, - 174, 394, 392, 174, 174, 174, 174, 393, 174, 174, - 395, 397, 174, 174, 396, 398, 174, 174, 174, 174, - 399, 400, 174, 174, 174, 174, 174, 174, 174, 174, - 401, 174, 174, 174, 174, 174, 174, 402, 403, 326, - - 326, 326, 352, 174, 174, 174, 174, 405, 405, 405, - 406, 406, 406, 333, 333, 255, 333, 340, 340, 340, - 424, 329, 333, 333, 255, 333, 513, 410, 423, 329, - 422, 411, 341, 341, 341, 538, 410, 174, 174, 240, - 411, 352, 412, 412, 349, 412, 337, 333, 333, 255, - 333, 174, 436, 433, 704, 337, 413, 174, 174, 407, - 414, 410, 174, 174, 437, 416, 434, 272, 255, 255, - 255, 255, 174, 174, 658, 415, 435, 174, 174, 438, - 337, 332, 348, 659, 174, 174, 174, 174, 363, 417, - 417, 417, 417, 417, 417, 362, 236, 174, 174, 440, - - 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, - 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, - 417, 417, 417, 418, 418, 418, 418, 418, 418, 418, - 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, - 418, 418, 419, 419, 419, 418, 418, 418, 418, 419, - 419, 419, 419, 419, 419, 418, 361, 418, 418, 360, - 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, - 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, - 419, 419, 419, 418, 418, 418, 420, 420, 420, 420, - 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, - - 420, 420, 420, 421, 420, 174, 174, 173, 420, 420, - 420, 420, 349, 349, 349, 349, 174, 174, 420, 439, - 420, 420, 255, 255, 255, 255, 350, 441, 447, 174, - 351, 174, 174, 443, 442, 359, 348, 174, 174, 446, - 258, 174, 174, 445, 174, 174, 420, 420, 420, 444, - 174, 174, 448, 358, 174, 174, 449, 174, 174, 450, - 174, 174, 174, 174, 451, 452, 174, 174, 174, 453, - 455, 454, 456, 457, 174, 459, 174, 174, 174, 174, - 174, 174, 174, 458, 174, 174, 174, 174, 460, 357, - 174, 174, 174, 174, 463, 352, 462, 461, 174, 174, - - 464, 174, 174, 248, 174, 174, 174, 174, 174, 174, - 248, 174, 174, 174, 174, 246, 465, 405, 405, 405, - 406, 406, 406, 255, 255, 255, 255, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 348, 342, 329, - 704, 351, 704, 466, 466, 466, 466, 466, 466, 466, - 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, - 466, 466, 467, 467, 467, 466, 466, 466, 466, 467, - 467, 467, 467, 467, 467, 466, 324, 466, 466, 268, - 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, - 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, - - 467, 467, 467, 466, 466, 466, 468, 468, 468, 468, - 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, - 468, 468, 468, 469, 468, 485, 267, 352, 468, 468, - 468, 468, 333, 333, 255, 333, 174, 174, 468, 471, - 468, 468, 266, 472, 486, 488, 410, 174, 174, 487, - 411, 490, 174, 174, 174, 174, 174, 174, 473, 412, - 412, 349, 412, 174, 174, 337, 468, 468, 468, 255, - 255, 255, 255, 413, 489, 174, 174, 414, 265, 491, - 492, 174, 174, 348, 174, 174, 493, 174, 174, 263, - 174, 174, 415, 499, 704, 474, 474, 474, 474, 474, - - 474, 174, 174, 494, 174, 174, 474, 474, 474, 474, - 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, - 474, 474, 474, 474, 474, 474, 474, 474, 474, 333, - 333, 255, 333, 495, 496, 253, 174, 174, 498, 174, - 174, 497, 500, 410, 174, 174, 501, 416, 148, 174, - 174, 174, 174, 502, 505, 174, 174, 174, 174, 174, - 174, 139, 337, 333, 333, 255, 333, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 410, 334, 334, - 334, 411, 334, 334, 334, 334, 334, 334, 334, 475, - 475, 475, 475, 475, 475, 334, 337, 334, 334, 334, - - 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, - 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, - 475, 475, 475, 334, 334, 334, 334, 334, 334, 334, - 334, 503, 507, 504, 518, 506, 250, 174, 174, 248, - 174, 174, 508, 509, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 510, 333, 333, 255, 333, 678, - 333, 333, 255, 333, 174, 174, 174, 174, 679, 410, - 174, 174, 520, 336, 410, 248, 174, 174, 414, 519, - 333, 333, 255, 333, 174, 522, 521, 594, 337, 174, - 174, 174, 174, 337, 410, 525, 523, 526, 511, 174, - - 174, 524, 527, 174, 174, 528, 174, 174, 529, 630, - 174, 174, 246, 337, 174, 174, 530, 174, 174, 531, - 174, 174, 532, 174, 174, 174, 174, 533, 174, 174, - 174, 174, 244, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 534, 535, 680, 174, 174, - 174, 174, 543, 544, 174, 174, 681, 174, 174, 545, - 545, 545, 545, 704, 174, 174, 174, 174, 174, 174, - 548, 550, 549, 174, 174, 174, 174, 551, 226, 552, - 553, 225, 174, 174, 174, 174, 554, 174, 174, 555, - 174, 174, 556, 174, 174, 174, 174, 174, 174, 179, - - 174, 174, 170, 174, 174, 557, 557, 557, 557, 166, - 174, 174, 174, 563, 174, 174, 173, 173, 173, 173, - 150, 546, 174, 174, 547, 174, 174, 145, 565, 174, - 174, 174, 174, 567, 569, 691, 566, 175, 568, 570, - 174, 174, 174, 174, 692, 174, 174, 174, 174, 571, - 174, 174, 572, 174, 174, 138, 174, 174, 174, 174, - 226, 174, 174, 594, 174, 174, 225, 558, 179, 580, - 559, 174, 586, 564, 557, 557, 557, 557, 173, 574, - 587, 271, 585, 594, 575, 630, 174, 174, 174, 174, - 174, 174, 174, 174, 565, 576, 174, 174, 174, 174, - - 174, 174, 624, 174, 174, 174, 174, 174, 174, 680, - 595, 174, 174, 691, 170, 597, 166, 150, 622, 145, - 138, 704, 657, 114, 113, 63, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 557, 704, 704, 577, - 573, 557, 557, 557, 557, 573, 574, 573, 573, 573, - 573, 575, 573, 573, 573, 573, 573, 573, 573, 578, - 578, 578, 576, 573, 573, 573, 578, 578, 578, 578, - 578, 578, 573, 578, 573, 573, 578, 578, 578, 578, - 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, - 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, - - 573, 573, 573, 558, 578, 578, 579, 578, 588, 589, - 588, 590, 596, 597, 589, 597, 598, 588, 589, 588, - 590, 704, 704, 600, 603, 604, 603, 605, 594, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 601, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 595, 704, 704, 704, 704, - 704, 704, 704, 606, 704, 607, 704, 704, 704, 704, - 590, 704, 704, 592, 704, 598, 608, 704, 602, 611, - 609, 704, 592, 704, 704, 670, 605, 704, 704, 610, - 612, 613, 612, 614, 591, 591, 591, 591, 591, 591, - - 591, 591, 591, 591, 591, 591, 591, 591, 615, 615, - 615, 616, 591, 591, 591, 615, 615, 615, 615, 615, - 615, 591, 615, 591, 591, 615, 615, 615, 615, 615, - 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, - 615, 615, 615, 615, 615, 615, 615, 615, 615, 591, - 591, 591, 617, 615, 615, 618, 615, 588, 589, 588, - 588, 588, 589, 588, 588, 588, 589, 588, 590, 588, - 589, 588, 590, 588, 589, 588, 590, 627, 628, 627, - 627, 597, 589, 597, 597, 596, 597, 589, 597, 598, - 704, 594, 632, 633, 632, 634, 600, 704, 704, 596, - - 597, 589, 597, 598, 596, 597, 636, 597, 598, 704, - 600, 704, 704, 630, 704, 704, 704, 704, 601, 588, - 704, 704, 625, 588, 704, 704, 625, 590, 704, 704, - 592, 590, 601, 704, 592, 626, 704, 704, 592, 627, - 704, 704, 629, 597, 704, 704, 631, 704, 598, 704, - 704, 602, 704, 704, 634, 704, 704, 635, 603, 604, - 603, 603, 598, 704, 704, 602, 704, 598, 704, 704, - 602, 596, 597, 589, 597, 598, 603, 604, 603, 603, - 704, 704, 600, 603, 604, 603, 605, 588, 589, 588, - 590, 588, 589, 588, 590, 704, 704, 273, 704, 274, - - 588, 589, 588, 590, 601, 588, 589, 588, 590, 704, - 275, 704, 704, 704, 276, 273, 704, 274, 704, 704, - 603, 704, 606, 638, 607, 704, 704, 704, 275, 704, - 704, 704, 276, 704, 637, 608, 639, 602, 603, 609, - 640, 638, 704, 642, 704, 605, 704, 704, 610, 590, - 704, 704, 592, 590, 704, 704, 592, 588, 589, 588, - 590, 641, 590, 704, 704, 592, 704, 590, 704, 704, - 592, 573, 644, 645, 644, 611, 704, 647, 612, 613, - 612, 612, 648, 612, 613, 612, 612, 612, 613, 612, - 614, 704, 704, 649, 603, 604, 603, 605, 704, 175, - - 704, 704, 704, 704, 175, 704, 704, 704, 616, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 643, - 704, 704, 592, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 606, 611, 607, 704, 650, 704, 704, - 612, 704, 704, 651, 704, 612, 608, 704, 651, 614, - 609, 704, 652, 704, 704, 704, 605, 704, 704, 610, - 573, 644, 645, 644, 611, 646, 647, 646, 646, 646, - 646, 648, 646, 646, 646, 646, 646, 646, 646, 654, - 654, 654, 649, 646, 646, 646, 654, 654, 654, 654, - 654, 654, 646, 654, 646, 646, 654, 654, 654, 654, - - 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, - 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, - 646, 646, 646, 655, 654, 654, 656, 654, 588, 589, - 588, 590, 627, 628, 627, 627, 627, 628, 627, 627, - 632, 633, 632, 632, 632, 633, 632, 632, 632, 633, - 632, 634, 588, 589, 588, 590, 597, 589, 597, 597, - 588, 589, 588, 590, 704, 704, 594, 596, 597, 589, - 597, 598, 704, 704, 704, 704, 704, 704, 600, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 630, 704, - 590, 704, 704, 592, 627, 704, 704, 629, 627, 704, - - 601, 629, 632, 704, 704, 660, 632, 704, 704, 660, - 634, 666, 704, 635, 661, 704, 704, 592, 597, 704, - 704, 631, 590, 704, 704, 592, 588, 589, 588, 590, - 598, 704, 704, 602, 429, 662, 663, 662, 664, 665, - 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, - 665, 665, 665, 704, 704, 704, 665, 665, 665, 665, - 588, 589, 588, 590, 704, 704, 665, 704, 665, 665, - 667, 603, 604, 603, 605, 704, 704, 644, 645, 644, - 644, 704, 574, 588, 589, 588, 590, 575, 590, 704, - 704, 592, 704, 704, 665, 665, 665, 590, 576, 704, - - 592, 704, 704, 704, 668, 593, 670, 589, 670, 671, - 606, 600, 607, 704, 644, 645, 644, 644, 704, 574, - 704, 704, 590, 608, 575, 592, 704, 609, 603, 604, - 603, 605, 704, 605, 704, 576, 610, 704, 673, 644, - 704, 704, 669, 704, 704, 590, 704, 704, 592, 596, - 597, 589, 597, 598, 588, 589, 588, 590, 704, 704, - 600, 588, 589, 588, 590, 704, 704, 606, 671, 607, - 704, 674, 632, 633, 632, 634, 644, 704, 704, 669, - 608, 704, 601, 704, 609, 588, 589, 588, 588, 704, - 605, 704, 704, 610, 588, 589, 588, 588, 588, 589, - - 588, 590, 588, 589, 588, 590, 704, 704, 704, 704, - 704, 704, 598, 704, 704, 602, 675, 704, 704, 592, - 704, 704, 704, 676, 704, 704, 592, 704, 704, 704, - 704, 704, 704, 704, 634, 704, 704, 635, 704, 704, - 704, 704, 588, 589, 588, 590, 704, 588, 704, 704, - 625, 588, 589, 588, 590, 704, 588, 704, 704, 625, - 590, 704, 704, 592, 590, 704, 704, 592, 482, 682, - 683, 682, 684, 685, 685, 685, 685, 685, 685, 685, - 685, 685, 685, 685, 685, 685, 685, 704, 704, 704, - 685, 685, 685, 685, 704, 686, 704, 687, 704, 704, - - 685, 704, 685, 685, 590, 704, 704, 592, 588, 589, - 588, 590, 704, 590, 704, 704, 592, 670, 589, 670, - 670, 704, 594, 593, 670, 689, 670, 671, 685, 685, - 685, 593, 670, 589, 670, 671, 704, 600, 593, 670, - 589, 670, 671, 704, 600, 612, 613, 612, 614, 595, - 593, 670, 589, 670, 671, 704, 600, 588, 589, 588, - 588, 704, 704, 704, 673, 704, 616, 704, 704, 704, - 675, 673, 704, 592, 573, 644, 645, 644, 611, 670, - 647, 704, 688, 673, 704, 648, 671, 704, 704, 674, - 588, 589, 588, 588, 671, 704, 649, 674, 704, 704, - - 704, 671, 704, 704, 674, 704, 704, 614, 704, 704, - 652, 704, 704, 690, 704, 704, 674, 704, 704, 588, - 704, 704, 625, 588, 589, 588, 590, 588, 589, 588, - 590, 588, 589, 588, 590, 704, 704, 611, 704, 704, - 650, 588, 589, 588, 590, 670, 589, 670, 670, 704, - 594, 704, 588, 704, 704, 625, 704, 593, 670, 589, - 670, 671, 704, 600, 704, 588, 589, 588, 590, 693, - 704, 704, 704, 704, 704, 704, 704, 595, 704, 704, - 704, 694, 704, 704, 704, 590, 704, 704, 592, 590, - 673, 704, 592, 590, 704, 704, 592, 588, 589, 588, - - 588, 704, 704, 590, 704, 704, 592, 670, 695, 704, - 688, 588, 589, 588, 588, 588, 589, 588, 590, 704, - 671, 704, 704, 674, 704, 704, 704, 590, 704, 704, - 592, 542, 696, 697, 696, 698, 699, 699, 699, 699, - 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, - 704, 704, 704, 699, 699, 699, 699, 704, 704, 588, - 704, 704, 625, 699, 704, 699, 699, 704, 588, 589, - 588, 590, 704, 588, 704, 704, 625, 590, 704, 704, - 592, 588, 589, 588, 588, 588, 589, 588, 588, 704, - 704, 699, 699, 699, 562, 700, 701, 700, 702, 703, - - 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, - 703, 703, 703, 704, 704, 704, 703, 703, 703, 703, - 588, 589, 588, 590, 704, 704, 703, 704, 703, 703, - 590, 704, 704, 592, 588, 589, 588, 590, 704, 704, - 704, 704, 704, 588, 704, 704, 625, 588, 704, 704, - 625, 704, 704, 704, 703, 703, 703, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 590, 704, 704, 592, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 590, 704, 704, 592, - - 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 122, 139, 139, 704, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 142, 704, 142, 142, - 142, 148, 148, 704, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 160, 160, 160, 160, 160, 160, - 160, 160, 704, 704, 704, 160, 160, 174, 174, 704, - 704, 174, 174, 704, 174, 174, 174, 174, 174, 224, - 704, 704, 224, 224, 224, 224, 224, 232, 232, 704, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, - 237, 237, 237, 237, 237, 237, 237, 237, 704, 704, - - 704, 237, 237, 243, 243, 243, 243, 243, 243, 243, - 704, 243, 243, 243, 243, 243, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 247, - 247, 704, 247, 704, 247, 247, 247, 251, 704, 704, - 251, 251, 251, 251, 251, 254, 254, 254, 254, 254, - 254, 254, 254, 704, 704, 704, 254, 256, 256, 256, - 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, - 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 264, 264, 704, 704, 264, 704, 704, - 264, 264, 327, 327, 327, 327, 327, 327, 327, 327, - - 704, 704, 704, 327, 327, 331, 331, 331, 331, 331, - 331, 331, 331, 704, 704, 704, 331, 334, 334, 334, - 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, - 343, 343, 704, 704, 343, 704, 704, 343, 343, 347, - 704, 704, 347, 704, 347, 347, 347, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 404, 404, 404, 404, 404, 404, 404, 404, 704, 704, - 704, 404, 408, 408, 704, 704, 408, 704, 704, 408, - 408, 409, 704, 704, 409, 409, 333, 333, 333, 333, - 333, 333, 333, 333, 333, 333, 333, 333, 333, 352, - - 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, - 352, 352, 429, 429, 429, 429, 429, 704, 429, 429, - 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, - 470, 470, 470, 476, 476, 476, 476, 476, 476, 476, - 476, 476, 476, 476, 476, 476, 478, 478, 478, 478, - 478, 478, 478, 478, 478, 478, 478, 478, 478, 482, - 482, 482, 482, 482, 704, 482, 482, 542, 542, 542, - 542, 542, 704, 542, 542, 562, 562, 562, 562, 562, - 704, 562, 562, 573, 573, 573, 573, 573, 573, 573, - 573, 573, 573, 573, 573, 573, 582, 582, 582, 582, - - 582, 582, 582, 582, 582, 582, 582, 582, 582, 591, - 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, - 591, 593, 593, 704, 593, 593, 593, 593, 593, 593, - 593, 593, 593, 593, 599, 599, 599, 599, 599, 599, - 599, 599, 599, 599, 599, 599, 599, 620, 620, 620, - 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, - 596, 596, 704, 596, 596, 596, 596, 596, 596, 596, - 596, 596, 596, 646, 646, 646, 646, 646, 646, 646, - 646, 646, 646, 646, 646, 646, 672, 672, 672, 672, - 672, 672, 672, 672, 672, 672, 672, 672, 672, 13, - - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704 - } ; - -static yyconst flex_int16_t yy_chk[3969] = - { 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, 1, 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, 3, 3, 3, 3, 3, 3, 3, 3, - - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 6, 7, 7, 7, - 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 6, 9, 17, 20, 10, 18, 18, 25, 21, - 27, 26, 27, 27, 27, 67, 33, 25, 20, 26, - 35, 35, 691, 9, 8, 9, 10, 680, 10, 115, - 17, 21, 7, 28, 33, 33, 42, 28, 115, 8, - 41, 41, 67, 28, 43, 242, 42, 46, 119, 42, - - 660, 42, 42, 43, 119, 43, 43, 656, 46, 46, - 9, 242, 43, 10, 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, 11, 11, 11, - 11, 11, 29, 651, 29, 29, 29, 30, 638, 30, - 30, 30, 31, 70, 31, 31, 31, 36, 36, 36, - - 36, 37, 37, 37, 37, 44, 29, 70, 49, 49, - 58, 30, 49, 51, 630, 44, 31, 629, 36, 137, - 44, 44, 37, 29, 51, 51, 44, 31, 30, 40, - 40, 40, 40, 31, 477, 47, 45, 37, 60, 60, - 50, 47, 47, 477, 45, 47, 47, 58, 625, 45, - 40, 45, 45, 48, 45, 50, 50, 48, 50, 36, - 137, 52, 36, 37, 68, 68, 37, 71, 48, 48, - 53, 48, 52, 52, 52, 52, 621, 52, 53, 53, - 40, 40, 55, 54, 108, 53, 54, 54, 620, 71, - 479, 40, 56, 56, 40, 55, 63, 55, 55, 479, - - 56, 56, 63, 63, 85, 85, 63, 63, 75, 618, - 75, 595, 75, 75, 75, 76, 76, 75, 76, 76, - 76, 108, 77, 76, 77, 77, 77, 78, 584, 83, - 79, 78, 79, 79, 79, 139, 80, 78, 80, 80, - 80, 81, 87, 81, 81, 81, 78, 83, 83, 86, - 86, 91, 91, 92, 79, 99, 99, 87, 87, 99, - 80, 93, 139, 92, 583, 81, 92, 116, 92, 92, - 93, 79, 93, 93, 94, 116, 81, 80, 95, 93, - 110, 110, 81, 512, 94, 582, 95, 96, 148, 94, - 94, 95, 512, 95, 95, 94, 95, 97, 96, 96, - - 101, 98, 244, 97, 97, 98, 100, 97, 97, 348, - 148, 101, 101, 348, 102, 581, 98, 98, 244, 98, - 579, 100, 100, 103, 100, 102, 102, 102, 102, 105, - 102, 103, 103, 104, 158, 158, 104, 104, 103, 106, - 106, 564, 105, 113, 105, 105, 561, 106, 106, 113, - 113, 560, 118, 113, 113, 117, 118, 117, 117, 117, - 172, 172, 118, 143, 143, 143, 144, 144, 144, 156, - 156, 156, 157, 157, 157, 157, 540, 143, 174, 174, - 144, 161, 161, 161, 176, 176, 157, 163, 163, 163, - 157, 156, 173, 173, 173, 173, 175, 175, 175, 175, - - 178, 177, 177, 161, 539, 180, 182, 143, 181, 181, - 184, 144, 177, 173, 180, 180, 536, 182, 182, 183, - 183, 183, 178, 178, 185, 184, 184, 185, 185, 186, - 187, 187, 189, 574, 186, 175, 516, 175, 188, 186, - 186, 188, 188, 190, 190, 189, 189, 232, 175, 191, - 191, 191, 175, 515, 173, 194, 194, 173, 175, 192, - 574, 175, 232, 193, 192, 192, 193, 193, 195, 197, - 197, 195, 195, 196, 196, 196, 198, 198, 198, 199, - 199, 199, 200, 200, 201, 514, 202, 202, 201, 201, - 201, 202, 203, 204, 205, 206, 207, 203, 203, 511, - - 206, 484, 206, 206, 204, 204, 210, 205, 205, 483, - 207, 207, 208, 208, 208, 209, 209, 209, 211, 211, - 211, 210, 210, 212, 213, 213, 214, 214, 216, 214, - 212, 212, 217, 214, 215, 215, 215, 218, 218, 219, - 216, 216, 220, 217, 217, 227, 219, 219, 481, 220, - 220, 221, 221, 221, 224, 224, 259, 259, 227, 227, - 227, 228, 228, 228, 229, 480, 229, 229, 229, 230, - 235, 230, 230, 230, 231, 231, 231, 236, 278, 278, - 233, 233, 233, 233, 478, 235, 279, 279, 229, 238, - 238, 238, 236, 230, 233, 476, 231, 432, 233, 240, - - 240, 240, 252, 252, 252, 229, 255, 255, 255, 255, - 230, 238, 431, 233, 234, 234, 252, 281, 284, 284, - 255, 256, 256, 256, 256, 261, 261, 261, 280, 280, - 428, 280, 281, 281, 282, 256, 292, 292, 234, 234, - 234, 234, 234, 234, 424, 282, 282, 261, 252, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 257, 257, 257, 257, 262, 262, 262, 283, - 285, 285, 285, 287, 294, 294, 257, 423, 289, 422, - 257, 414, 283, 283, 287, 287, 289, 289, 262, 263, - - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 363, 263, 263, 362, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 263, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, - 264, 296, 296, 286, 264, 264, 264, 264, 272, 272, - 272, 272, 288, 290, 264, 301, 264, 264, 286, 286, - - 291, 293, 301, 301, 290, 290, 295, 288, 288, 302, - 302, 291, 291, 298, 298, 298, 293, 293, 361, 295, - 295, 299, 264, 264, 264, 297, 300, 272, 297, 272, - 297, 297, 299, 299, 304, 304, 303, 300, 300, 305, - 272, 303, 303, 358, 272, 305, 305, 306, 306, 357, - 272, 306, 308, 272, 307, 307, 307, 308, 308, 309, - 309, 312, 309, 310, 310, 311, 311, 311, 313, 313, - 313, 315, 312, 312, 314, 317, 314, 314, 316, 316, - 318, 321, 315, 315, 319, 319, 317, 317, 320, 320, - 322, 318, 318, 321, 321, 322, 322, 323, 325, 326, - - 326, 326, 351, 325, 325, 323, 323, 328, 328, 328, - 329, 329, 329, 333, 333, 333, 333, 340, 340, 340, - 346, 326, 334, 334, 334, 334, 513, 333, 345, 328, - 344, 333, 341, 341, 341, 513, 334, 366, 366, 340, - 334, 336, 335, 335, 335, 335, 333, 337, 337, 337, - 337, 368, 368, 364, 341, 334, 335, 364, 364, 330, - 335, 337, 369, 369, 369, 337, 365, 277, 349, 349, - 349, 349, 365, 365, 622, 335, 367, 374, 374, 370, - 337, 339, 349, 622, 367, 367, 370, 370, 276, 339, - 339, 339, 339, 339, 339, 275, 339, 372, 372, 372, - - 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, - 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, - 339, 339, 339, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 274, 342, 342, 273, - 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, - - 343, 343, 343, 343, 343, 375, 375, 271, 343, 343, - 343, 343, 350, 350, 350, 350, 371, 371, 343, 371, - 343, 343, 352, 352, 352, 352, 350, 373, 381, 381, - 350, 373, 373, 377, 376, 270, 352, 376, 376, 380, - 352, 379, 379, 379, 377, 377, 343, 343, 343, 378, - 380, 380, 382, 266, 378, 378, 383, 383, 384, 384, - 385, 385, 386, 386, 385, 387, 387, 382, 382, 388, - 390, 389, 391, 392, 392, 394, 394, 397, 397, 391, - 391, 390, 390, 393, 388, 388, 389, 389, 395, 265, - 393, 393, 396, 396, 399, 258, 398, 396, 398, 398, - - 401, 395, 395, 249, 399, 399, 400, 400, 402, 402, - 247, 401, 401, 403, 403, 245, 403, 405, 405, 405, - 406, 406, 406, 425, 425, 425, 425, 434, 434, 435, - 435, 436, 436, 437, 437, 443, 443, 425, 241, 405, - 239, 425, 406, 407, 407, 407, 407, 407, 407, 407, - 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, - 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, - 407, 407, 407, 407, 407, 407, 226, 407, 407, 170, - 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, - 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, - - 407, 407, 407, 407, 407, 407, 408, 408, 408, 408, - 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, - 408, 408, 408, 408, 408, 433, 168, 410, 408, 408, - 408, 408, 412, 412, 412, 412, 433, 433, 408, 410, - 408, 408, 167, 410, 438, 440, 412, 438, 438, 439, - 412, 442, 459, 459, 439, 439, 440, 440, 410, 413, - 413, 413, 413, 442, 442, 412, 408, 408, 408, 411, - 411, 411, 411, 413, 441, 461, 461, 413, 165, 444, - 445, 441, 441, 411, 444, 444, 446, 445, 445, 164, - 446, 446, 413, 451, 162, 411, 411, 411, 411, 411, - - 411, 447, 447, 447, 451, 451, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, 411, 415, - 415, 415, 415, 448, 449, 155, 448, 448, 450, 450, - 450, 449, 452, 415, 449, 449, 453, 415, 149, 452, - 452, 454, 454, 454, 457, 453, 453, 457, 457, 464, - 464, 141, 415, 416, 416, 416, 416, 416, 416, 416, - 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, - 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, - 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, - - 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, - 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, - 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, - 416, 455, 460, 456, 485, 458, 138, 485, 485, 136, - 460, 460, 462, 463, 455, 455, 456, 456, 458, 458, - 463, 463, 462, 462, 465, 470, 470, 470, 470, 657, - 471, 471, 471, 471, 488, 488, 465, 465, 657, 470, - 487, 487, 487, 470, 471, 131, 486, 486, 471, 486, - 473, 473, 473, 473, 490, 490, 489, 596, 470, 491, - 491, 494, 494, 471, 473, 493, 491, 495, 473, 489, - - 489, 492, 496, 492, 492, 497, 493, 493, 498, 596, - 495, 495, 129, 473, 499, 499, 500, 496, 496, 501, - 497, 497, 502, 498, 498, 503, 503, 503, 500, 500, - 501, 501, 124, 502, 502, 504, 504, 505, 505, 506, - 506, 507, 507, 508, 508, 509, 510, 659, 509, 509, - 518, 518, 518, 519, 521, 521, 659, 510, 510, 520, - 520, 520, 520, 120, 519, 519, 522, 522, 523, 523, - 524, 526, 525, 524, 524, 525, 525, 527, 112, 528, - 529, 111, 526, 526, 528, 528, 530, 531, 531, 533, - 527, 527, 534, 529, 529, 532, 532, 530, 530, 89, - - 533, 533, 84, 534, 534, 535, 535, 535, 535, 82, - 520, 520, 543, 543, 544, 544, 545, 545, 545, 545, - 74, 520, 546, 546, 520, 547, 547, 69, 546, 548, - 548, 549, 549, 549, 551, 679, 547, 545, 550, 553, - 550, 550, 552, 552, 679, 551, 551, 554, 554, 555, - 553, 553, 556, 563, 563, 66, 535, 535, 559, 559, - 62, 555, 555, 631, 556, 556, 61, 535, 39, 559, - 535, 567, 567, 545, 557, 557, 557, 557, 545, 557, - 568, 545, 565, 593, 557, 631, 565, 565, 566, 566, - 568, 568, 569, 569, 566, 557, 570, 570, 571, 571, - - 572, 572, 585, 586, 586, 587, 587, 585, 585, 681, - 593, 624, 624, 692, 34, 631, 32, 24, 681, 19, - 16, 13, 692, 5, 4, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 557, 0, 0, 557, - 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, - 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, - 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, - 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, - 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, - 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, - - 558, 558, 558, 558, 558, 558, 558, 558, 573, 573, - 573, 573, 575, 575, 575, 575, 575, 577, 577, 577, - 577, 0, 0, 575, 576, 576, 576, 576, 688, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 688, 0, 0, 0, 0, - 0, 0, 0, 576, 0, 576, 0, 0, 0, 0, - 573, 0, 0, 573, 0, 575, 576, 0, 575, 577, - 576, 0, 577, 0, 0, 688, 576, 0, 0, 576, - 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, - - 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, - 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, - 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, - 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, - 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, - 578, 578, 578, 578, 578, 578, 578, 588, 588, 588, - 588, 589, 589, 589, 589, 590, 590, 590, 590, 591, - 591, 591, 591, 592, 592, 592, 592, 594, 594, 594, - 594, 597, 597, 597, 597, 598, 598, 598, 598, 598, - 0, 597, 600, 600, 600, 600, 598, 0, 0, 599, - - 599, 599, 599, 599, 601, 601, 601, 601, 601, 0, - 599, 0, 0, 597, 0, 0, 0, 0, 598, 588, - 0, 0, 588, 589, 0, 0, 589, 590, 0, 0, - 590, 591, 599, 0, 591, 592, 0, 0, 592, 594, - 0, 0, 594, 597, 0, 0, 597, 0, 598, 0, - 0, 598, 0, 0, 600, 0, 0, 600, 603, 603, - 603, 603, 599, 0, 0, 599, 0, 601, 0, 0, - 601, 602, 602, 602, 602, 602, 604, 604, 604, 604, - 0, 0, 602, 605, 605, 605, 605, 606, 606, 606, - 606, 607, 607, 607, 607, 0, 0, 603, 0, 603, - - 609, 609, 609, 609, 602, 608, 608, 608, 608, 0, - 603, 0, 0, 0, 603, 604, 0, 604, 0, 0, - 603, 0, 605, 603, 605, 0, 0, 0, 604, 0, - 0, 0, 604, 0, 602, 605, 606, 602, 604, 605, - 607, 604, 0, 609, 0, 605, 0, 0, 605, 606, - 0, 0, 606, 607, 0, 0, 607, 610, 610, 610, - 610, 608, 609, 0, 0, 609, 0, 608, 0, 0, - 608, 611, 611, 611, 611, 611, 0, 611, 612, 612, - 612, 612, 611, 613, 613, 613, 613, 614, 614, 614, - 614, 0, 0, 611, 616, 616, 616, 616, 0, 612, - - 0, 0, 0, 0, 613, 0, 0, 0, 614, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 610, - 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 616, 611, 616, 0, 611, 0, 0, - 612, 0, 0, 612, 0, 613, 616, 0, 613, 614, - 616, 0, 614, 0, 0, 0, 616, 0, 0, 616, - 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, - 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, - 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, - 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, - - 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, - 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, - 619, 619, 619, 619, 619, 619, 619, 619, 626, 626, - 626, 626, 627, 627, 627, 627, 628, 628, 628, 628, - 632, 632, 632, 632, 633, 633, 633, 633, 634, 634, - 634, 634, 635, 635, 635, 635, 636, 636, 636, 636, - 640, 640, 640, 640, 0, 0, 636, 637, 637, 637, - 637, 637, 0, 0, 0, 0, 0, 0, 637, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 636, 0, - 626, 0, 0, 626, 627, 0, 0, 627, 628, 0, - - 637, 628, 632, 0, 0, 632, 633, 0, 0, 633, - 634, 640, 0, 634, 635, 0, 0, 635, 636, 0, - 0, 636, 640, 0, 0, 640, 641, 641, 641, 641, - 637, 0, 0, 637, 639, 639, 639, 639, 639, 639, - 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, - 639, 639, 639, 0, 0, 0, 639, 639, 639, 639, - 642, 642, 642, 642, 0, 0, 639, 0, 639, 639, - 641, 643, 643, 643, 643, 0, 0, 644, 644, 644, - 644, 0, 644, 646, 646, 646, 646, 644, 641, 0, - 0, 641, 0, 0, 639, 639, 639, 639, 644, 0, - - 639, 0, 0, 0, 642, 647, 647, 647, 647, 647, - 643, 647, 643, 0, 645, 645, 645, 645, 0, 645, - 0, 0, 642, 643, 645, 642, 0, 643, 649, 649, - 649, 649, 0, 643, 0, 645, 643, 0, 647, 644, - 0, 0, 644, 0, 0, 646, 0, 0, 646, 648, - 648, 648, 648, 648, 650, 650, 650, 650, 0, 0, - 648, 652, 652, 652, 652, 0, 0, 649, 647, 649, - 0, 647, 661, 661, 661, 661, 645, 0, 0, 645, - 649, 0, 648, 0, 649, 662, 662, 662, 662, 0, - 649, 0, 0, 649, 663, 663, 663, 663, 664, 664, - - 664, 664, 665, 665, 665, 665, 0, 0, 0, 0, - 0, 0, 648, 0, 0, 648, 650, 0, 0, 650, - 0, 0, 0, 652, 0, 0, 652, 0, 0, 0, - 0, 0, 0, 0, 661, 0, 0, 661, 0, 0, - 0, 0, 667, 667, 667, 667, 0, 662, 0, 0, - 662, 668, 668, 668, 668, 0, 663, 0, 0, 663, - 664, 0, 0, 664, 665, 0, 0, 665, 666, 666, - 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, - 666, 666, 666, 666, 666, 666, 666, 0, 0, 0, - 666, 666, 666, 666, 0, 667, 0, 668, 0, 0, - - 666, 0, 666, 666, 667, 0, 0, 667, 669, 669, - 669, 669, 0, 668, 0, 0, 668, 670, 670, 670, - 670, 0, 670, 673, 673, 673, 673, 673, 666, 666, - 666, 671, 671, 671, 671, 671, 0, 671, 672, 672, - 672, 672, 672, 0, 672, 676, 676, 676, 676, 670, - 674, 674, 674, 674, 674, 0, 674, 682, 682, 682, - 682, 0, 0, 0, 671, 0, 676, 0, 0, 0, - 669, 672, 0, 669, 675, 675, 675, 675, 675, 670, - 675, 0, 670, 674, 0, 675, 673, 0, 0, 673, - 683, 683, 683, 683, 671, 0, 675, 671, 0, 0, - - 0, 672, 0, 0, 672, 0, 0, 676, 0, 0, - 676, 0, 0, 674, 0, 0, 674, 0, 0, 682, - 0, 0, 682, 684, 684, 684, 684, 685, 685, 685, - 685, 686, 686, 686, 686, 0, 0, 675, 0, 0, - 675, 687, 687, 687, 687, 689, 689, 689, 689, 0, - 689, 0, 683, 0, 0, 683, 0, 690, 690, 690, - 690, 690, 0, 690, 0, 693, 693, 693, 693, 686, - 0, 0, 0, 0, 0, 0, 0, 689, 0, 0, - 0, 687, 0, 0, 0, 684, 0, 0, 684, 685, - 690, 0, 685, 686, 0, 0, 686, 696, 696, 696, - - 696, 0, 0, 687, 0, 0, 687, 689, 693, 0, - 689, 697, 697, 697, 697, 698, 698, 698, 698, 0, - 690, 0, 0, 690, 0, 0, 0, 693, 0, 0, - 693, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, - 0, 0, 0, 694, 694, 694, 694, 0, 0, 696, - 0, 0, 696, 694, 0, 694, 694, 0, 699, 699, - 699, 699, 0, 697, 0, 0, 697, 698, 0, 0, - 698, 700, 700, 700, 700, 701, 701, 701, 701, 0, - 0, 694, 694, 694, 695, 695, 695, 695, 695, 695, - - 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, - 695, 695, 695, 0, 0, 0, 695, 695, 695, 695, - 702, 702, 702, 702, 0, 0, 695, 0, 695, 695, - 699, 0, 0, 699, 703, 703, 703, 703, 0, 0, - 0, 0, 0, 700, 0, 0, 700, 701, 0, 0, - 701, 0, 0, 0, 695, 695, 695, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 702, 0, 0, 702, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 703, 0, 0, 703, - - 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, - 705, 705, 705, 706, 706, 0, 706, 706, 706, 706, - 706, 706, 706, 706, 706, 706, 707, 0, 707, 707, - 707, 708, 708, 0, 708, 708, 708, 708, 708, 708, - 708, 708, 708, 708, 709, 709, 709, 709, 709, 709, - 709, 709, 0, 0, 0, 709, 709, 710, 710, 0, - 0, 710, 710, 0, 710, 710, 710, 710, 710, 711, - 0, 0, 711, 711, 711, 711, 711, 712, 712, 0, - 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, - 713, 713, 713, 713, 713, 713, 713, 713, 0, 0, - - 0, 713, 713, 714, 714, 714, 714, 714, 714, 714, - 0, 714, 714, 714, 714, 714, 715, 715, 715, 715, - 715, 715, 715, 715, 715, 715, 715, 715, 715, 716, - 716, 0, 716, 0, 716, 716, 716, 717, 0, 0, - 717, 717, 717, 717, 717, 718, 718, 718, 718, 718, - 718, 718, 718, 0, 0, 0, 718, 719, 719, 719, - 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, - 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, - 720, 720, 720, 721, 721, 0, 0, 721, 0, 0, - 721, 721, 722, 722, 722, 722, 722, 722, 722, 722, - - 0, 0, 0, 722, 722, 723, 723, 723, 723, 723, - 723, 723, 723, 0, 0, 0, 723, 724, 724, 724, - 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, - 725, 725, 0, 0, 725, 0, 0, 725, 725, 726, - 0, 0, 726, 0, 726, 726, 726, 727, 727, 727, - 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, - 728, 728, 728, 728, 728, 728, 728, 728, 0, 0, - 0, 728, 729, 729, 0, 0, 729, 0, 0, 729, - 729, 730, 0, 0, 730, 730, 731, 731, 731, 731, - 731, 731, 731, 731, 731, 731, 731, 731, 731, 732, - - 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, - 732, 732, 733, 733, 733, 733, 733, 0, 733, 733, - 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, - 734, 734, 734, 735, 735, 735, 735, 735, 735, 735, - 735, 735, 735, 735, 735, 735, 736, 736, 736, 736, - 736, 736, 736, 736, 736, 736, 736, 736, 736, 737, - 737, 737, 737, 737, 0, 737, 737, 738, 738, 738, - 738, 738, 0, 738, 738, 739, 739, 739, 739, 739, - 0, 739, 739, 740, 740, 740, 740, 740, 740, 740, - 740, 740, 740, 740, 740, 740, 741, 741, 741, 741, - - 741, 741, 741, 741, 741, 741, 741, 741, 741, 742, - 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, - 742, 743, 743, 0, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 744, 744, 744, 744, 744, 744, - 744, 744, 744, 744, 744, 744, 744, 745, 745, 745, - 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, - 746, 746, 0, 746, 746, 746, 746, 746, 746, 746, - 746, 746, 746, 747, 747, 747, 747, 747, 747, 747, - 747, 747, 747, 747, 747, 747, 748, 748, 748, 748, - 748, 748, 748, 748, 748, 748, 748, 748, 748, 704, - - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 704, 704, 704, 704, 704 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int as3__flex_debug; -int as3__flex_debug = 0; - -/* 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 *as3_text; -#line 1 "tokenizer.lex" -/* tokenizer.lex - - Routines for compiling Flash2 AVM2 ABC Actionscript - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#line 24 "tokenizer.lex" - - -#include -#include -#include -#include -#include "../utf8.h" -#include "common.h" -#include "tokenizer.h" -#include "files.h" - -unsigned int as3_tokencount = 0; - -static void dbg(const char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - if(as3_verbosity<3) - return; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - printf("(tokenizer) "); - printf("%s\n", buf); - fflush(stdout); -} - -#ifndef YY_CURRENT_BUFFER -#define YY_CURRENT_BUFFER yy_current_buffer -#endif - -static void*as3_buffer=0; -static int as3_buffer_pos=0; -static int as3_buffer_len=0; -void as3_file_input(FILE*fi) -{ - as3_in = fi; - as3_buffer = 0; -} -void as3_buffer_input(void*buffer, int len) -{ - if(!buffer) - syntaxerror("trying to parse zero bytearray"); - as3_buffer = buffer; - as3_buffer_len = len; - as3_buffer_pos = 0; - as3_in = 0; -} - -//#undef BEGIN -//#define BEGIN(x) {(yy_start) = 1 + 2 *x;dbg("entering state %d", x);} - -#define YY_INPUT(buf,result,max_size) { \ - if(!as3_buffer) { \ - errno=0; \ - while((result = fread(buf, 1, max_size, as3_in))==0 && ferror(as3_in)) \ - { if(errno != EINTR) {YY_FATAL_ERROR("input in flex scanner failed"); break;} \ - errno=0; clearerr(as3_in); \ - } \ - } else { \ - int to_read = max_size; \ - if(to_read + as3_buffer_pos > as3_buffer_len) \ - to_read = as3_buffer_len - as3_buffer_pos; \ - memcpy(buf, as3_buffer+as3_buffer_pos, to_read); \ - as3_buffer_pos += to_read; \ - result=to_read; \ - } \ -} - -void handleInclude(char*text, int len, char quotes) -{ - char*filename = 0; - if(quotes) { - char*p1 = strchr(text, '"'); - char*p2 = strrchr(text, '"'); - if(!p1 || !p2 || p1==p2) { - syntaxerror("Invalid include in line %d\n", current_line); - } - *p2 = 0; - filename = strdup(p1+1); - } else { - int i1=0,i2=len; - // find start - while(!strchr(" \n\r\t\xa0", text[i1])) i1++; - // strip - while(strchr(" \n\r\t\xa0", text[i1])) i1++; - while(strchr(" \n\r\t\xa0", text[i2-1])) i2--; - if(i2!=len) text[i2]=0; - filename = strdup(&text[i1]); - } - - char*fullfilename = find_file(filename, 1); - enter_file2(filename, fullfilename, YY_CURRENT_BUFFER); - as3_in = fopen(fullfilename, "rb"); - if (!as3_in) { - syntaxerror("Couldn't open include file \"%s\"\n", fullfilename); - } - - as3__switch_to_buffer(as3__create_buffer(as3_in,YY_BUF_SIZE ) ); - //BEGIN(DEFAULT); keep context -} - -static int do_unescape(const char*s, const char*end, char*n) -{ - char*o = n; - int len=0; - while(s256) - syntaxerror("octal number out of range (0-255): %d", num); - if(o) o[len] = num;len++; - continue; - } - case 'x': case 'u': { - int max=2; - char bracket = 0; - char unicode = 0; - if(*s == 'u') { - max = 6; - unicode = 1; - } - s++; - if(s==end) syntaxerror("invalid \\u or \\x at end of string"); - if(*s == '{') { - s++; - if(s==end) syntaxerror("invalid \\u{ at end of string"); - bracket=1; - } - unsigned int num=0; - int nr = 0; - while(strchr("0123456789abcdefABCDEF", *s) && (bracket || nr < max) && s='0' && *s<='9') num |= *s - '0'; - if(*s>='a' && *s<='f') num |= *s - 'a' + 10; - if(*s>='A' && *s<='F') num |= *s - 'A' + 10; - nr++; - s++; - } - if(bracket) { - if(*s=='}' && s256) - syntaxerror("byte out of range (0-255): %d", num); - if(o) o[len] = num;len++; - } - break; - } - default: { - if(o) { - o[len+0] = '\\'; - o[len+1] = *s; - } - s++; - len+=2; - break; - } - } - } - if(o) o[len]=0; - return len; -} - -static string_t string_unescape(const char*in, int l) -{ - const char*s = in; - const char*end = &in[l]; - - int len = do_unescape(s, end, 0); - char*n = (char*)malloc(len+1); - do_unescape(s, end, n); - string_t out = string_new(n, len); - return out; -} - -static void handleCData(char*s, int len) -{ - a3_lval.str.str = s+9; // - a3_lval.str.str = strdup_n(a3_lval.str.str, a3_lval.str.len); -} - -static void handleRaw(char*s, int len) -{ - a3_lval.str.len = len; - a3_lval.str.str = strdup_n(s, a3_lval.str.len); -} - -static void handleString(char*s, int len) -{ - if(s[0]=='"') { - if(s[len-1]!='"') syntaxerror("String doesn't end with '\"'"); - s++;len-=2; - } - else if(s[0]=='\'') { - if(s[len-1]!='\'') syntaxerror("String doesn't end with '\"'"); - s++;len-=2; - } - else syntaxerror("String incorrectly terminated"); - - a3_lval.str = string_unescape(s, len); -} - - -char start_of_expression; - -static inline int m(int type) -{ - a3_lval.token = type; - return type; -} - -static char numberbuf[64]; -static char*nrbuf() -{ - if(as3_leng>sizeof(numberbuf)-1) - syntaxerror("decimal number overflow"); - char*s = numberbuf; - memcpy(s, as3_text, as3_leng); - s[as3_leng]=0; - return s; -} - -static inline int setint(int v) -{ - a3_lval.number_int = v; - return T_INT; -} -static inline int setfloat(double v) -{ - a3_lval.number_float = v; - return T_FLOAT; -} - -static inline int handlefloat() -{ - char*s = nrbuf(); - a3_lval.number_float = atof(s); - return T_FLOAT; -} - -static inline int handleint() -{ - char*s = nrbuf(); - char l = (as3_text[0]=='-'); - - //char*max = l?"1073741824":"2147483647"; - char*max = l?"2147483648":"2147483647"; - - if(as3_leng-l>10) { - as3_softwarning("integer overflow: %s (converted to Number)", s); - return handlefloat(); - } - if(as3_leng-l==10) { - int t; - for(t=0;tmax[t]) { - as3_softwarning("integer overflow: %s (converted to Number)", s); - return handlefloat(); - } - else if(as3_text[l+t]='0' && c<='9') - d+=(c&15)*base; - else if((c>='a' && c<='f') || (c>='A' && c<='F')) - d+=((c&0x0f)+9)*base; - } - return setfloat(d); -} -static inline int handlehex() -{ - char l = (as3_text[0]=='-')+2; - int len = as3_leng; - - if(len-l>8) { - char*s = nrbuf(); - syntaxerror("integer overflow %s", s); - } - - int t; - unsigned int v = 0; - for(t=l;t='0' && c<='9') - v|=(c&15); - else if((c>='a' && c<='f') || (c>='A' && c<='F')) - v|=(c&0x0f)+9; - } - if(l && v>=0x80000000) { - char*s = nrbuf(); - as3_softwarning("integer overflow: %s (converted to Number)", s); - return setfloat(v); - } - if(!l && v>0x7fffffff) { - char*s = nrbuf(); - as3_softwarning("integer overflow: %s (converted to Number)", s); - return setfloat(v); - } - - if(l==3) { - return setint(-(int)v); - } else { - return setint(v); - } -} - -void handleLabel(char*text, int len) -{ - int t; - for(t=len-1;t>=0;--t) { - if(text[t]!=' ' && - text[t]!=':') - break; - } - char*s = malloc(t+1); - memcpy(s, as3_text, t); - s[t]=0; - a3_lval.id = s; -} - -static int handleregexp() -{ - char*s = malloc(as3_leng); - int len=as3_leng-1; - memcpy(s, as3_text+1, len); - s[len] = 0; - int t; - for(t=len;t>=0;--t) { - if(s[t]=='/') { - s[t] = 0; - break; - } - } - a3_lval.regexp.pattern = s; - if(t==len) { - a3_lval.regexp.options = 0; - } else { - a3_lval.regexp.options = s+t+1; - } - return T_REGEXP; -} - -void initialize_scanner(); -#define YY_USER_INIT initialize_scanner(); - -/* count the number of lines+columns consumed by this token */ -static inline void l() { - int t; - for(t=0;t]|(-/[^-])|(--/[^>]))*--> - -//{XMLCOMMENT} - - - - - - -#line 2080 "tokenizer.yy.c" - -#define INITIAL 0 -#define REGEXPOK 1 -#define BEGINNING 2 -#define DEFAULT 3 -#define XMLTEXT 4 -#define XML 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. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -static int yy_init_globals (void ); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int as3_lex_destroy (void ); - -int as3_get_debug (void ); - -void as3_set_debug (int debug_flag ); - -YY_EXTRA_TYPE as3_get_extra (void ); - -void as3_set_extra (YY_EXTRA_TYPE user_defined ); - -FILE *as3_get_in (void ); - -void as3_set_in (FILE * in_str ); - -FILE *as3_get_out (void ); - -void as3_set_out (FILE * out_str ); - -yy_size_t as3_get_leng (void ); - -char *as3_get_text (void ); - -int as3_get_lineno (void ); - -void as3_set_lineno (int line_number ); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int as3_wrap (void ); -#else -extern int as3_wrap (void ); -#endif -#endif - - static void yyunput (int c,char *buf_ptr ); - -#ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); -#endif - -#ifndef YY_NO_INPUT - -#ifdef __cplusplus -static int yyinput (void ); -#else -static int input (void ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO fwrite( as3_text, as3_leng, 1, as3_out ) -#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) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - yy_size_t n; \ - for ( n = 0; n < max_size && \ - (c = getc( as3_in )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( as3_in ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, as3_in))==0 && ferror(as3_in)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(as3_in); \ - } \ - }\ -\ - -#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 -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int as3_lex (void); - -#define YY_DECL int as3_lex (void) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after as3_text and as3_leng - * 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 break; -#endif - -#define YY_RULE_SETUP \ - if ( as3_leng > 0 ) \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ - (as3_text[as3_leng - 1] == '\n'); \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 536 "tokenizer.lex" - - - -#line 2274 "tokenizer.yy.c" - - if ( !(yy_init) ) - { - (yy_init) = 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! as3_in ) - as3_in = stdin; - - if ( ! as3_out ) - as3_out = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - as3_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - as3__create_buffer(as3_in,YY_BUF_SIZE ); - } - - as3__load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of as3_text. */ - *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; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); -yy_match: - do - { - register 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 >= 705 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_current_state != 704 ); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - 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: -/* rule 1 can match eol */ -YY_RULE_SETUP -#line 539 "tokenizer.lex" -{l(); /* single line comment */} - YY_BREAK -case 2: -/* rule 2 can match eol */ -YY_RULE_SETUP -#line 540 "tokenizer.lex" -{l(); /* multi line comment */} - YY_BREAK -case 3: -YY_RULE_SETUP -#line 541 "tokenizer.lex" -{syntaxerror("syntax error: unterminated comment", as3_text);} - YY_BREAK -case 4: -/* rule 4 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 543 "tokenizer.lex" -{l();handleInclude(as3_text, as3_leng, 1);} - YY_BREAK -case 5: -/* rule 5 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 544 "tokenizer.lex" -{l();handleInclude(as3_text, as3_leng, 0);} - YY_BREAK -case 6: -/* rule 6 can match eol */ -YY_RULE_SETUP -#line 545 "tokenizer.lex" -{l(); BEGIN(DEFAULT);handleString(as3_text, as3_leng);return T_STRING;} - YY_BREAK -case 7: -/* rule 7 can match eol */ -YY_RULE_SETUP -#line 546 "tokenizer.lex" -{l(); BEGIN(DEFAULT);handleCData(as3_text, as3_leng);return T_STRING;} - YY_BREAK - -case 8: -/* rule 8 can match eol */ -YY_RULE_SETUP -#line 549 "tokenizer.lex" -{l(); BEGIN(DEFAULT);handleRaw(as3_text, as3_leng);return T_STRING;} - YY_BREAK - - -case 9: -/* rule 9 can match eol */ -YY_RULE_SETUP -#line 553 "tokenizer.lex" -{l(); handleRaw(as3_text, as3_leng);return T_STRING;} - YY_BREAK -case 10: -YY_RULE_SETUP -#line 554 "tokenizer.lex" -{c(); BEGIN(REGEXPOK);return m('{');} - YY_BREAK -case 11: -YY_RULE_SETUP -#line 555 "tokenizer.lex" -{c(); return m('<');} - YY_BREAK -case 12: -YY_RULE_SETUP -#line 556 "tokenizer.lex" -{c(); return m('/');} - YY_BREAK -case 13: -YY_RULE_SETUP -#line 557 "tokenizer.lex" -{c(); return m('>');} - YY_BREAK -case 14: -YY_RULE_SETUP -#line 558 "tokenizer.lex" -{c(); return m('=');} - YY_BREAK -case 15: -YY_RULE_SETUP -#line 559 "tokenizer.lex" -{c(); handleRaw(as3_text, as3_leng);return T_IDENTIFIER;} - YY_BREAK -case 16: -/* rule 16 can match eol */ -YY_RULE_SETUP -#line 560 "tokenizer.lex" -{l(); handleRaw(as3_text, as3_leng);return T_STRING;} - YY_BREAK -case YY_STATE_EOF(XML): -#line 561 "tokenizer.lex" -{syntaxerror("unexpected end of file");} - YY_BREAK - - -case 17: -/* rule 17 can match eol */ -YY_RULE_SETUP -#line 565 "tokenizer.lex" -{l(); handleRaw(as3_text, as3_leng);return T_STRING;} - YY_BREAK -case 18: -YY_RULE_SETUP -#line 566 "tokenizer.lex" -{c(); BEGIN(REGEXPOK);return m('{');} - YY_BREAK -case 19: -YY_RULE_SETUP -#line 567 "tokenizer.lex" -{c(); BEGIN(XML);return m('<');} - YY_BREAK -case 20: -YY_RULE_SETUP -#line 568 "tokenizer.lex" -{c(); return m('>');} - YY_BREAK -case 21: -/* rule 21 can match eol */ -YY_RULE_SETUP -#line 569 "tokenizer.lex" -{l(); handleRaw(as3_text, as3_leng);return T_STRING;} - YY_BREAK -case 22: -/* rule 22 can match eol */ -YY_RULE_SETUP -#line 570 "tokenizer.lex" -{l(); handleRaw(as3_text, as3_leng);return T_STRING;} - YY_BREAK -case YY_STATE_EOF(XMLTEXT): -#line 571 "tokenizer.lex" -{syntaxerror("unexpected end of file");} - YY_BREAK - - -case 23: -YY_RULE_SETUP -#line 575 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return handleregexp();} - YY_BREAK -case 24: -/* rule 24 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 576 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return handlehex();} - YY_BREAK -case 25: -/* rule 25 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 577 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return handlehexfloat();} - YY_BREAK -case 26: -/* rule 26 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 578 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return handleint();} - YY_BREAK -case 27: -/* rule 27 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 579 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return handlefloat();} - YY_BREAK - -case 28: -YY_RULE_SETUP -#line 582 "tokenizer.lex" -{c(); BEGIN(REGEXPOK);return m(T_DICTSTART);} - YY_BREAK -case 29: -YY_RULE_SETUP -#line 583 "tokenizer.lex" -{c(); BEGIN(DEFAULT); return m('{');} - YY_BREAK -case 30: -YY_RULE_SETUP -#line 585 "tokenizer.lex" -{/* utf 8 bom (0xfeff) */} - YY_BREAK -case 31: -/* rule 31 can match eol */ -YY_RULE_SETUP -#line 586 "tokenizer.lex" -{l();} - YY_BREAK -case 32: -/* rule 32 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 588 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return handlehex();} - YY_BREAK -case 33: -/* rule 33 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 589 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return handlehexfloat();} - YY_BREAK -case 34: -/* rule 34 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 590 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return handleint();} - YY_BREAK -case 35: -/* rule 35 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 591 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return handlefloat();} - YY_BREAK -case 36: -YY_RULE_SETUP -#line 592 "tokenizer.lex" -{c(); BEGIN(DEFAULT);return m(KW_NAN);} - YY_BREAK -case 37: -YY_RULE_SETUP -#line 594 "tokenizer.lex" -{/* for debugging: generates a tokenizer-level error */ - syntaxerror("3rr0r");} - YY_BREAK -case 38: -/* rule 38 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 597 "tokenizer.lex" -{l();BEGIN(DEFAULT);handleLabel(as3_text, as3_leng-3);return T_FOR;} - YY_BREAK -case 39: -/* rule 39 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 598 "tokenizer.lex" -{l();BEGIN(DEFAULT);handleLabel(as3_text, as3_leng-2);return T_DO;} - YY_BREAK -case 40: -/* rule 40 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 599 "tokenizer.lex" -{l();BEGIN(DEFAULT);handleLabel(as3_text, as3_leng-5);return T_WHILE;} - YY_BREAK -case 41: -/* rule 41 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up as3_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up as3_text again */ -YY_RULE_SETUP -#line 600 "tokenizer.lex" -{l();BEGIN(DEFAULT);handleLabel(as3_text, as3_leng-6);return T_SWITCH;} - YY_BREAK -case 42: -/* rule 42 can match eol */ -YY_RULE_SETUP -#line 601 "tokenizer.lex" -{l();BEGIN(DEFAULT);return m(KW_DEFAULT_XML);} - YY_BREAK -case 43: -YY_RULE_SETUP -#line 602 "tokenizer.lex" -{c();BEGIN(DEFAULT);a3_lval.id="";return T_FOR;} - YY_BREAK -case 44: -YY_RULE_SETUP -#line 603 "tokenizer.lex" -{c();BEGIN(DEFAULT);a3_lval.id="";return T_DO;} - YY_BREAK -case 45: -YY_RULE_SETUP -#line 604 "tokenizer.lex" -{c();BEGIN(DEFAULT);a3_lval.id="";return T_WHILE;} - YY_BREAK -case 46: -YY_RULE_SETUP -#line 605 "tokenizer.lex" -{c();BEGIN(DEFAULT);a3_lval.id="";return T_SWITCH;} - YY_BREAK -case 47: -YY_RULE_SETUP -#line 607 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_ANDAND);} - YY_BREAK -case 48: -YY_RULE_SETUP -#line 608 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_OROR);} - YY_BREAK -case 49: -YY_RULE_SETUP -#line 609 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_NE);} - YY_BREAK -case 50: -YY_RULE_SETUP -#line 610 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_NEE);} - YY_BREAK -case 51: -YY_RULE_SETUP -#line 611 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_EQEQEQ);} - YY_BREAK -case 52: -YY_RULE_SETUP -#line 612 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_EQEQ);} - YY_BREAK -case 53: -YY_RULE_SETUP -#line 613 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_GE);} - YY_BREAK -case 54: -YY_RULE_SETUP -#line 614 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_LE);} - YY_BREAK -case 55: -YY_RULE_SETUP -#line 615 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(T_MINUSMINUS);} - YY_BREAK -case 56: -YY_RULE_SETUP -#line 616 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(T_PLUSPLUS);} - YY_BREAK -case 57: -YY_RULE_SETUP -#line 617 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_PLUSBY);} - YY_BREAK -case 58: -YY_RULE_SETUP -#line 618 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_XORBY);} - YY_BREAK -case 59: -YY_RULE_SETUP -#line 619 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_MINUSBY);} - YY_BREAK -case 60: -YY_RULE_SETUP -#line 620 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_DIVBY);} - YY_BREAK -case 61: -YY_RULE_SETUP -#line 621 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_MODBY);} - YY_BREAK -case 62: -YY_RULE_SETUP -#line 622 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_MULBY);} - YY_BREAK -case 63: -YY_RULE_SETUP -#line 623 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_ORBY);} - YY_BREAK -case 64: -YY_RULE_SETUP -#line 624 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_ANDBY);} - YY_BREAK -case 65: -YY_RULE_SETUP -#line 625 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_SHRBY);} - YY_BREAK -case 66: -YY_RULE_SETUP -#line 626 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_SHLBY);} - YY_BREAK -case 67: -YY_RULE_SETUP -#line 627 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_USHRBY);} - YY_BREAK -case 68: -YY_RULE_SETUP -#line 628 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_SHL);} - YY_BREAK -case 69: -YY_RULE_SETUP -#line 629 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_USHR);} - YY_BREAK -case 70: -YY_RULE_SETUP -#line 630 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_SHR);} - YY_BREAK -case 71: -YY_RULE_SETUP -#line 631 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_DOTDOTDOT);} - YY_BREAK -case 72: -YY_RULE_SETUP -#line 632 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_DOTDOT);} - YY_BREAK -case 73: -YY_RULE_SETUP -#line 633 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m('.');} - YY_BREAK -case 74: -YY_RULE_SETUP -#line 634 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(T_COLONCOLON);} - YY_BREAK -case 75: -YY_RULE_SETUP -#line 635 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(':');} - YY_BREAK -case 76: -YY_RULE_SETUP -#line 636 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_INSTANCEOF);} - YY_BREAK -case 77: -YY_RULE_SETUP -#line 637 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_IMPLEMENTS);} - YY_BREAK -case 78: -YY_RULE_SETUP -#line 638 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_INTERFACE);} - YY_BREAK -case 79: -YY_RULE_SETUP -#line 639 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_PROTECTED);} - YY_BREAK -case 80: -YY_RULE_SETUP -#line 640 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_NAMESPACE);} - YY_BREAK -case 81: -YY_RULE_SETUP -#line 641 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_UNDEFINED);} - YY_BREAK -case 82: -YY_RULE_SETUP -#line 642 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_ARGUMENTS);} - YY_BREAK -case 83: -YY_RULE_SETUP -#line 643 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_CONTINUE);} - YY_BREAK -case 84: -YY_RULE_SETUP -#line 644 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_OVERRIDE);} - YY_BREAK -case 85: -YY_RULE_SETUP -#line 645 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_INTERNAL);} - YY_BREAK -case 86: -YY_RULE_SETUP -#line 646 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_FUNCTION);} - YY_BREAK -case 87: -YY_RULE_SETUP -#line 647 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_FINALLY);} - YY_BREAK -case 88: -YY_RULE_SETUP -#line 648 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_DEFAULT);} - YY_BREAK -case 89: -YY_RULE_SETUP -#line 649 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_PACKAGE);} - YY_BREAK -case 90: -YY_RULE_SETUP -#line 650 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_PRIVATE);} - YY_BREAK -case 91: -YY_RULE_SETUP -#line 651 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_DYNAMIC);} - YY_BREAK -case 92: -YY_RULE_SETUP -#line 652 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_EXTENDS);} - YY_BREAK -case 93: -YY_RULE_SETUP -#line 653 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_DELETE);} - YY_BREAK -case 94: -YY_RULE_SETUP -#line 654 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_RETURN);} - YY_BREAK -case 95: -YY_RULE_SETUP -#line 655 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_PUBLIC);} - YY_BREAK -case 96: -YY_RULE_SETUP -#line 656 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_NATIVE);} - YY_BREAK -case 97: -YY_RULE_SETUP -#line 657 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_STATIC);} - YY_BREAK -case 98: -YY_RULE_SETUP -#line 658 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_IMPORT);} - YY_BREAK -case 99: -YY_RULE_SETUP -#line 659 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_TYPEOF);} - YY_BREAK -case 100: -YY_RULE_SETUP -#line 660 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_THROW);} - YY_BREAK -case 101: -YY_RULE_SETUP -#line 661 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_CLASS);} - YY_BREAK -case 102: -YY_RULE_SETUP -#line 662 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_CONST);} - YY_BREAK -case 103: -YY_RULE_SETUP -#line 663 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_CATCH);} - YY_BREAK -case 104: -YY_RULE_SETUP -#line 664 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_FINAL);} - YY_BREAK -case 105: -YY_RULE_SETUP -#line 665 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_FALSE);} - YY_BREAK -case 106: -YY_RULE_SETUP -#line 666 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_BREAK);} - YY_BREAK -case 107: -YY_RULE_SETUP -#line 667 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_SUPER);} - YY_BREAK -case 108: -YY_RULE_SETUP -#line 668 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_EACH);} - YY_BREAK -case 109: -YY_RULE_SETUP -#line 669 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_VOID);} - YY_BREAK -case 110: -YY_RULE_SETUP -#line 670 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_TRUE);} - YY_BREAK -case 111: -YY_RULE_SETUP -#line 671 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_NULL);} - YY_BREAK -case 112: -YY_RULE_SETUP -#line 672 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_ELSE);} - YY_BREAK -case 113: -YY_RULE_SETUP -#line 673 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_CASE);} - YY_BREAK -case 114: -YY_RULE_SETUP -#line 674 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_WITH);} - YY_BREAK -case 115: -YY_RULE_SETUP -#line 675 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_USE);} - YY_BREAK -case 116: -YY_RULE_SETUP -#line 676 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_NEW);} - YY_BREAK -case 117: -YY_RULE_SETUP -#line 677 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_GET);} - YY_BREAK -case 118: -YY_RULE_SETUP -#line 678 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_SET);} - YY_BREAK -case 119: -YY_RULE_SETUP -#line 679 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_VAR);} - YY_BREAK -case 120: -YY_RULE_SETUP -#line 680 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_TRY);} - YY_BREAK -case 121: -YY_RULE_SETUP -#line 681 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_IS) ;} - YY_BREAK -case 122: -YY_RULE_SETUP -#line 682 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_IN) ;} - YY_BREAK -case 123: -YY_RULE_SETUP -#line 683 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(KW_IF) ;} - YY_BREAK -case 124: -YY_RULE_SETUP -#line 684 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(KW_AS);} - YY_BREAK -case 125: -YY_RULE_SETUP -#line 685 "tokenizer.lex" -{c();BEGIN(DEFAULT);return handleIdentifier();} - YY_BREAK -case 126: -YY_RULE_SETUP -#line 687 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(as3_text[0]);} - YY_BREAK -case 127: -YY_RULE_SETUP -#line 688 "tokenizer.lex" -{c();BEGIN(REGEXPOK);return m(as3_text[0]);} - YY_BREAK -case 128: -YY_RULE_SETUP -#line 689 "tokenizer.lex" -{c();BEGIN(DEFAULT);return m(as3_text[0]);} - YY_BREAK - -case 129: -YY_RULE_SETUP -#line 692 "tokenizer.lex" -{tokenerror();} - YY_BREAK - -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(REGEXPOK): -case YY_STATE_EOF(BEGINNING): -case YY_STATE_EOF(DEFAULT): -#line 694 "tokenizer.lex" -{l(); - void*b = leave_file(); - if (!b) { - yyterminate(); - as3__delete_buffer(YY_CURRENT_BUFFER); - return m(T_EOF); - } else { - as3__delete_buffer(YY_CURRENT_BUFFER); - as3__switch_to_buffer(b); - } - } - YY_BREAK -case 130: -YY_RULE_SETUP -#line 706 "tokenizer.lex" -ECHO; - YY_BREAK -#line 3108 "tokenizer.yy.c" - - 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 as3_in at a new source and called - * as3_lex(). 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; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = as3_in; - 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 - { - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( as3_wrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * as3_text, 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 as3_lex */ - -/* 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 - */ -static int yy_get_next_buffer (void) -{ - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register 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 - { - yy_size_t 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; - - int yy_c_buf_p_offset = - (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - yy_size_t 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. */ - as3_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - 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; - as3_restart(as3_in ); - } - - 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_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) as3_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } - - (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 */ - - static yy_state_type yy_get_previous_state (void) -{ - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - register 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 >= 705 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) 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 ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -{ - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); - - register 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 >= 705 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 704); - - return yy_is_jam ? 0 : yy_current_state; -} - - static void yyunput (int c, register char * yy_bp ) -{ - register char *yy_cp; - - yy_cp = (yy_c_buf_p); - - /* undo effects of setting up as3_text */ - *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. */ - register yy_size_t number_to_move = (yy_n_chars) + 2; - register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - register 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) = 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; - - (yytext_ptr) = yy_bp; - (yy_hold_char) = *yy_cp; - (yy_c_buf_p) = yy_cp; -} - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) -#else - static int input (void) -#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 */ - yy_size_t offset = (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. */ - as3_restart(as3_in ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( as3_wrap( ) ) - 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 as3_text */ - (yy_hold_char) = *++(yy_c_buf_p); - - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** 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 . - */ - void as3_restart (FILE * input_file ) -{ - - if ( ! YY_CURRENT_BUFFER ){ - as3_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - as3__create_buffer(as3_in,YY_BUF_SIZE ); - } - - as3__init_buffer(YY_CURRENT_BUFFER,input_file ); - as3__load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ - void as3__switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - - /* TODO. We should be able to replace this entire function body - * with - * as3_pop_buffer_state(); - * as3_push_buffer_state(new_buffer); - */ - as3_ensure_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; - as3__load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (as3_wrap()) processing, but the only time this flag - * is looked at is after as3_wrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; -} - -static void as3__load_buffer_state (void) -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - as3_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (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. - */ - YY_BUFFER_STATE as3__create_buffer (FILE * file, int size ) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) as3_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in as3__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 *) as3_alloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in as3__create_buffer()" ); - - b->yy_is_our_buffer = 1; - - as3__init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with as3__create_buffer() - * - */ - void as3__delete_buffer (YY_BUFFER_STATE b ) -{ - - 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 ) - as3_free((void *) b->yy_ch_buf ); - - as3_free((void *) b ); -} - -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a as3_restart() or at EOF. - */ - static void as3__init_buffer (YY_BUFFER_STATE b, FILE * file ) - -{ - int oerrno = errno; - - as3__flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then as3__init_buffer was _probably_ - * called from as3_restart() 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; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - 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. - * - */ - void as3__flush_buffer (YY_BUFFER_STATE b ) -{ - 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 ) - as3__load_buffer_state( ); -} - -/** 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. - * - */ -void as3_push_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - if (new_buffer == NULL) - return; - - as3_ensure_buffer_stack(); - - /* This block is copied from as3__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 as3__switch_to_buffer. */ - as3__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void as3_pop_buffer_state (void) -{ - if (!YY_CURRENT_BUFFER) - return; - - as3__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - as3__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void as3_ensure_buffer_stack (void) -{ - 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; - (yy_buffer_stack) = (struct yy_buffer_state**)as3_alloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in as3_ensure_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. */ - int grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)as3_realloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in as3_ensure_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; - } -} - -/** 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 as3__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 0; - - b = (YY_BUFFER_STATE) as3_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in as3__scan_buffer()" ); - - b->yy_buf_size = 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 = 0; - 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; - - as3__switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to as3_lex() 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 - * as3__scan_bytes() instead. - */ -YY_BUFFER_STATE as3__scan_string (yyconst char * yystr ) -{ - - return as3__scan_bytes(yystr,strlen(yystr) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to as3_lex() will - * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE as3__scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n, i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) as3_alloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in as3__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 = as3__scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in as3__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; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up as3_text. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - as3_text[as3_leng] = (yy_hold_char); \ - (yy_c_buf_p) = as3_text + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - as3_leng = yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - * - */ -int as3_get_lineno (void) -{ - - return as3_lineno; -} - -/** Get the input stream. - * - */ -FILE *as3_get_in (void) -{ - return as3_in; -} - -/** Get the output stream. - * - */ -FILE *as3_get_out (void) -{ - return as3_out; -} - -/** Get the length of the current token. - * - */ -yy_size_t as3_get_leng (void) -{ - return as3_leng; -} - -/** Get the current token. - * - */ - -char *as3_get_text (void) -{ - return as3_text; -} - -/** Set the current line number. - * @param line_number - * - */ -void as3_set_lineno (int line_number ) -{ - - as3_lineno = line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param in_str A readable stream. - * - * @see as3__switch_to_buffer - */ -void as3_set_in (FILE * in_str ) -{ - as3_in = in_str ; -} - -void as3_set_out (FILE * out_str ) -{ - as3_out = out_str ; -} - -int as3_get_debug (void) -{ - return as3__flex_debug; -} - -void as3_set_debug (int bdebug ) -{ - as3__flex_debug = bdebug ; -} - -static int yy_init_globals (void) -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from as3_lex_destroy(), so don't allocate here. - */ - - (yy_buffer_stack) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - as3_in = stdin; - as3_out = stdout; -#else - as3_in = (FILE *) 0; - as3_out = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * as3_lex_init() - */ - return 0; -} - -/* as3_lex_destroy is for both reentrant and non-reentrant scanners. */ -int as3_lex_destroy (void) -{ - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - as3__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - as3_pop_buffer_state(); - } - - /* Destroy the stack itself. */ - as3_free((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so the next time - * as3_lex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *as3_alloc (yy_size_t size ) -{ - return (void *) malloc( size ); -} - -void *as3_realloc (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 (void *) realloc( (char *) ptr, size ); -} - -void as3_free (void * ptr ) -{ - free( (char *) ptr ); /* see as3_realloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 706 "tokenizer.lex" - - - -int as3_wrap() -{ - return 1; -} - -static int tokenerror() -{ - char c1=as3_text[0]; - char buf[128]; - buf[0] = as3_text[0]; - int t; - for(t=1;t<128;t++) { - char c = buf[t]=input(); - if(c=='\n' || c==EOF) { - buf[t] = 0; - break; - } - } - if(c1>='0' && c1<='9') - syntaxerror("syntax error: %s (identifiers must not start with a digit)"); - else - syntaxerror("syntax error [state=%d]: %s", (yy_start-1)/2, buf); - printf("\n"); - exit(1); - yyterminate(); -} - - -static char mbuf[256]; -char*token2string(enum yytokentype nr, YYSTYPE v) -{ - if(nr==T_STRING) { - char*s = malloc(v.str.len+10); - strcpy(s, ""); - memcpy(s+8, v.str.str, v.str.len); - sprintf(s+8+v.str.len, " (%d bytes)", v.str.len); - return s; - } - else if(nr==T_REGEXP) { - char*s = malloc(strlen(v.regexp.pattern)+10); - sprintf(s, "%s", v.regexp.pattern); - return s; - } - else if(nr==T_IDENTIFIER) { - char*s = malloc(strlen(v.id)+10); - sprintf(s, "%s", v.id); - return s; - } - else if(nr==T_INT) return ""; - else if(nr==T_UINT) return ""; - else if(nr==T_FLOAT) return ""; - else if(nr==T_EOF) return "***END***"; - else if(nr==T_GE) return ">="; - else if(nr==T_LE) return "<="; - else if(nr==T_MINUSMINUS) return "--"; - else if(nr==T_PLUSPLUS) return "++"; - else if(nr==KW_IMPLEMENTS) return "implements"; - else if(nr==KW_INTERFACE) return "interface"; - else if(nr==KW_NAMESPACE) return "namespace"; - else if(nr==KW_PROTECTED) return "protected"; - else if(nr==KW_OVERRIDE) return "override"; - else if(nr==KW_INTERNAL) return "internal"; - else if(nr==KW_FUNCTION) return "function"; - else if(nr==KW_PACKAGE) return "package"; - else if(nr==KW_PRIVATE) return "private"; - else if(nr==KW_BOOLEAN) return "Boolean"; - else if(nr==KW_DYNAMIC) return "dynamic"; - else if(nr==KW_EXTENDS) return "extends"; - else if(nr==KW_PUBLIC) return "public"; - else if(nr==KW_NATIVE) return "native"; - else if(nr==KW_STATIC) return "static"; - else if(nr==KW_IMPORT) return "import"; - else if(nr==KW_NUMBER) return "number"; - else if(nr==KW_CLASS) return "class"; - else if(nr==KW_CONST) return "const"; - else if(nr==KW_FINAL) return "final"; - else if(nr==KW_FALSE) return "False"; - else if(nr==KW_TRUE) return "True"; - else if(nr==KW_UINT) return "uint"; - else if(nr==KW_NULL) return "null"; - else if(nr==KW_ELSE) return "else"; - else if(nr==KW_USE) return "use"; - else if(nr==KW_INT) return "int"; - else if(nr==KW_NEW) return "new"; - else if(nr==KW_GET) return "get"; - else if(nr==KW_SET) return "set"; - else if(nr==KW_VAR) return "var"; - else if(nr==KW_IS) return "is"; - else if(nr==KW_AS) return "as"; - else { - sprintf(mbuf, "%d", nr); - return mbuf; - } -} - -void tokenizer_begin_xml() -{ - dbg("begin reading xml"); - BEGIN(XML); -} -void tokenizer_begin_xmltext() -{ - dbg("begin reading xml text"); - BEGIN(XMLTEXT); -} -void tokenizer_end_xmltext() -{ - dbg("end reading xml text"); - BEGIN(XML); -} -void tokenizer_end_xml() -{ - dbg("end reading xml"); - BEGIN(DEFAULT); -} - -void initialize_scanner() -{ - BEGIN(BEGINNING); -} - - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/base64.c b/fluidbook/tools/swftools-special-swfdump/lib/base64.c deleted file mode 100644 index 3c5d22fb0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/base64.c +++ /dev/null @@ -1,65 +0,0 @@ -/* base64.c - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include -#include -#include -#include "base64.h" - -static const char base64[65]= -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -void write_base64(FILE*fi, const char* s) -{ - const unsigned char*b = (const unsigned char*)s; - const unsigned char*end = b + strlen(b); - const unsigned char*end_minus_3 = end - 3; - - while(b <= end_minus_3) { - char data[4]; - data[0] = base64[(b[0]>>2)&63 ]; - data[1] = base64[(b[0]<<4|b[1]>>4)&63]; - data[2] = base64[(b[1]<<2|b[2]>>6)&63]; - data[3] = base64[(b[2])&63 ]; - fwrite(data, 4, 1, fi); - b += 3; - } - - unsigned char data[4]; - switch(end - b) { - case 0: - return; //done - case 1: - data[0] = base64[(b[0]>>2)&63]; - data[1] = base64[(b[0]<<4)&63]; - data[2] = '='; - data[3] = '='; - break; - case 2: - data[0] = base64[(b[0]>>2)&63]; - data[1] = base64[(b[0]<<4|b[1]>>4)&63]; - data[2] = base64[(b[1]<<2)&63]; - data[3] = '='; - break; - default: - fprintf(stderr, "internal error in base64 implementation (%d)\n", end-b); - break; - } - fwrite(data, 4, 1, fi); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/base64.h b/fluidbook/tools/swftools-special-swfdump/lib/base64.h deleted file mode 100644 index 6921c15a0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/base64.h +++ /dev/null @@ -1,25 +0,0 @@ -/* base64.h - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __base64_h__ -#define __base64_h__ - -void write_base64(FILE*fi, const char* s); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/bitio.c b/fluidbook/tools/swftools-special-swfdump/lib/bitio.c deleted file mode 100644 index b84ebe86c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/bitio.c +++ /dev/null @@ -1,871 +0,0 @@ -/* bitio.c - part of swftools - implementation of bitio.h. - - Copyright (C) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_IO_H -#include -#endif -#include -#include -#define __USE_LARGEFILE64 -#include -#include - -#include "../config.h" - -#ifdef HAVE_ZLIB -#include -#define ZLIB_BUFFER_SIZE 16384 -#endif -#include "./bitio.h" - -/* ---------------------------- null reader ------------------------------- */ - -static int reader_nullread(reader_t*r, void* data, int len) -{ - memset(data, 0, len); - return len; -} -static void reader_nullread_dealloc(reader_t*r) -{ - memset(r, 0, sizeof(reader_t)); -} -static int reader_nullseek(reader_t*r, int pos) -{ - return pos; -} -void reader_init_nullreader(reader_t*r) -{ - r->read = reader_nullread; - r->seek = reader_nullseek; - r->dealloc = reader_nullread_dealloc; - r->internal = 0; - r->type = READER_TYPE_NULL; - r->mybyte = 0; - r->bitpos = 8; - r->pos = 0; -} -/* ---------------------------- file reader ------------------------------- */ - -static int reader_fileread(reader_t*reader, void* data, int len) -{ - int ret = read((int)reader->internal, data, len); - if(ret>=0) - reader->pos += ret; - return ret; -} -static void reader_fileread_dealloc(reader_t*r) -{ - if(r->type == READER_TYPE_FILE2) { - close((ptroff_t)r->internal); - } - memset(r, 0, sizeof(reader_t)); -} -static int reader_fileread_seek(reader_t*r, int pos) -{ - return lseek((ptroff_t)r->internal, pos, SEEK_SET); -} -void reader_init_filereader(reader_t*r, int handle) -{ - r->read = reader_fileread; - r->seek = reader_fileread_seek; - r->dealloc = reader_fileread_dealloc; - r->internal = (void*)handle; - r->type = READER_TYPE_FILE; - r->mybyte = 0; - r->bitpos = 8; - r->pos = 0; -} -void reader_init_filereader2(reader_t*r, const char*filename) -{ -#ifdef HAVE_OPEN64 - int fi = open64 -#else - int fi = open -#endif - (filename, -#ifdef O_BINARY - O_BINARY| -#endif - O_RDONLY); - reader_init_filereader(r, fi); - r->type = READER_TYPE_FILE2; -} - -/* ---------------------------- mem reader ------------------------------- */ - -typedef struct _memread -{ - unsigned char*data; - int length; -} memread_t; - -static int reader_memread(reader_t*reader, void* data, int len) -{ - memread_t*mr = (memread_t*)reader->internal; - - if(mr->length - reader->pos < len) { - len = mr->length - reader->pos; - } - if(!len) return 0; - memcpy(data, &mr->data[reader->pos], len); - reader->pos += len; - return len; -} -static int reader_memseek(reader_t*reader, int pos) -{ - memread_t*mr = (memread_t*)reader->internal; - if(pos>=0 && pos<=mr->length) { - reader->pos = pos; - return pos; - } else { - return -1; - } -} -static void reader_memread_dealloc(reader_t*reader) -{ - if(reader->internal) - free(reader->internal); - memset(reader, 0, sizeof(reader_t)); -} -void reader_init_memreader(reader_t*r, void*newdata, int newlength) -{ - memread_t*mr = (memread_t*)malloc(sizeof(memread_t)); - mr->data = (unsigned char*)newdata; - mr->length = newlength; - r->read = reader_memread; - r->seek = reader_memseek; - r->dealloc = reader_memread_dealloc; - r->internal = (void*)mr; - r->type = READER_TYPE_MEM; - r->mybyte = 0; - r->bitpos = 8; - r->pos = 0; -} - -/* ---------------------------- zzip reader ------------------------------ */ -#ifdef HAVE_ZZIP -static int reader_zzip_read(reader_t*reader, void* data, int len) -{ - return zzip_file_read((ZZIP_FILE*)reader->internal, data, len); -} -static void reader_zzip_dealloc(reader_t*reader) -{ - memset(reader, 0, sizeof(reader_t)); -} -static int reader_zzip_seek(reader_t*reader, int pos) -{ - return zzip_seek((ZZIP_FILE*)reader->internal, pos, SEEK_SET); -} -void reader_init_zzipreader(reader_t*r,ZZIP_FILE*z) -{ - r->read = reader_zzip_read; - r->seek = reader_zzip_seek; - r->dealloc = reader_zzip_dealloc; - r->internal = z; - r->type = READER_TYPE_ZZIP; - r->mybyte = 0; - r->bitpos = 8; - r->pos = 0; -} -#endif - -/* ---------------------------- mem writer ------------------------------- */ - -typedef struct _memwrite -{ - unsigned char*data; - int length; -} memwrite_t; - -static int writer_memwrite_write(writer_t*w, void* data, int len) -{ - memwrite_t*mw = (memwrite_t*)w->internal; - if(mw->length - w->pos > len) { - memcpy(&mw->data[w->pos], data, len); - w->pos += len; - return len; - } else { - memcpy(&mw->data[w->pos], data, mw->length - w->pos); - w->pos = mw->length; - return mw->length - w->pos; - } -} -static void writer_memwrite_finish(writer_t*w) -{ - if(w->internal) - free(w->internal); - w->internal = 0; -} -static void dummy_flush(writer_t*w) -{ -} -void writer_init_memwriter(writer_t*w, void*data, int len) -{ - memwrite_t *mr; - mr = (memwrite_t*)malloc(sizeof(memwrite_t)); - mr->data = (unsigned char *)data; - mr->length = len; - memset(w, 0, sizeof(writer_t)); - w->write = writer_memwrite_write; - w->flush = dummy_flush; - w->finish = writer_memwrite_finish; - w->internal = (void*)mr; - w->type = WRITER_TYPE_MEM; - w->bitpos = 0; - w->mybyte = 0; - w->pos = 0; -} - -/* ------------------------- growing mem writer ------------------------------- */ - -typedef struct _growmemwrite -{ - unsigned char*data; - int length; - U32 grow; -} growmemwrite_t; -static int writer_growmemwrite_write(writer_t*w, void* data, int len) -{ - growmemwrite_t*mw = (growmemwrite_t*)w->internal; - if(!mw->data) { - fprintf(stderr, "Illegal write operation: data already given away"); - exit(1); - } - if(mw->length - w->pos < len) { - int newlength = mw->length; - while(newlength - w->pos < len) { - newlength += mw->grow; - } -#ifdef NO_REALLOC - unsigned char*newmem = (unsigned char*)malloc(newlength); - memcpy(newmem, mw->data, mw->length); - free(mw->data); - mw->data = newmem; -#else - mw->data = (unsigned char*)realloc(mw->data, newlength); -#endif - mw->length = newlength; - } - memcpy(&mw->data[w->pos], data, len); - w->pos += len; - return len; -} -static void writer_growmemwrite_finish(writer_t*w) -{ - growmemwrite_t*mw = (growmemwrite_t*)w->internal; - if(mw->data) { - free(mw->data);mw->data = 0; - } - mw->length = 0; - free(w->internal);mw=0; - memset(w, 0, sizeof(writer_t)); -} -void* writer_growmemwrite_memptr(writer_t*w, int*len) -{ - growmemwrite_t*mw = (growmemwrite_t*)w->internal; - if(len) { - *len = w->pos; - } - return mw->data; -} -void* writer_growmemwrite_getmem(writer_t*w) -{ - growmemwrite_t*mw = (growmemwrite_t*)w->internal; - void*ret = mw->data; - /* remove own reference so that neither write() nor finish() can free it. - It's property of the caller now. - */ - mw->data = 0; - return ret; -} -void writer_growmemwrite_reset(writer_t*w) -{ - growmemwrite_t*mw = (growmemwrite_t*)w->internal; - w->pos = 0; - w->bitpos = 0; - w->mybyte = 0; -} -void writer_init_growingmemwriter(writer_t*w, U32 grow) -{ - growmemwrite_t *mw = (growmemwrite_t *)malloc(sizeof(growmemwrite_t)); - mw->length = 4096; - mw->data = (unsigned char *)malloc(mw->length); - mw->grow = grow; - memset(w, 0, sizeof(writer_t)); - w->write = writer_growmemwrite_write; - w->flush = dummy_flush; - w->finish = writer_growmemwrite_finish; - w->internal = (void*)mw; - w->type = WRITER_TYPE_GROWING_MEM; - w->bitpos = 0; - w->mybyte = 0; - w->pos = 0; -} - -/* ---------------------------- file writer ------------------------------- */ - -typedef struct _filewrite -{ - int handle; - char free_handle; -} filewrite_t; - -static int writer_filewrite_write(writer_t*w, void* data, int len) -{ - filewrite_t * fw= (filewrite_t*)w->internal; - w->pos += len; - return write(fw->handle, data, len); -} -static void writer_filewrite_finish(writer_t*w) -{ - filewrite_t *mr = (filewrite_t*)w->internal; - if(mr->free_handle) - close(mr->handle); - free(w->internal); - memset(w, 0, sizeof(writer_t)); -} -void writer_init_filewriter(writer_t*w, int handle) -{ - filewrite_t *mr = (filewrite_t *)malloc(sizeof(filewrite_t)); - mr->handle = handle; - mr->free_handle = 0; - memset(w, 0, sizeof(writer_t)); - w->write = writer_filewrite_write; - w->finish = writer_filewrite_finish; - w->internal = mr; - w->type = WRITER_TYPE_FILE; - w->bitpos = 0; - w->mybyte = 0; - w->pos = 0; -} -void writer_init_filewriter2(writer_t*w, char*filename) -{ -#ifdef HAVE_OPEN64 - int fi = open64 -#else - int fi = open -#endif - (filename, -#ifdef O_BINARY - O_BINARY| -#endif - O_WRONLY|O_CREAT|O_TRUNC, 0644); - writer_init_filewriter(w, fi); - ((filewrite_t*)w->internal)->free_handle = 1; -} - -/* ---------------------------- null writer ------------------------------- */ - -static int writer_nullwrite_write(writer_t*w, void* data, int len) -{ - w->pos += len; - return len; -} -static void writer_nullwrite_finish(writer_t*w) -{ - memset(w, 0, sizeof(writer_t)); -} -void writer_init_nullwriter(writer_t*w) -{ - memset(w, 0, sizeof(writer_t)); - w->write = writer_nullwrite_write; - w->flush = dummy_flush; - w->finish = writer_nullwrite_finish; - w->internal = 0; - w->type = WRITER_TYPE_NULL; - w->bitpos = 0; - w->mybyte = 0; - w->pos = 0; -} -/* ---------------------------- zlibinflate reader -------------------------- */ - -typedef struct _zlibinflate -{ -#ifdef HAVE_ZLIB - z_stream zs; - reader_t*input; - unsigned char readbuffer[ZLIB_BUFFER_SIZE]; -#endif -} zlibinflate_t; - -#ifdef HAVE_ZLIB -static void zlib_error(int ret, char* msg, z_stream*zs) -{ - fprintf(stderr, "%s: zlib error (%d): last zlib error: %s\n", - msg, - ret, - zs->msg?zs->msg:"unknown"); - if(errno) perror("errno:"); - exit(1); -} -#endif - -static int reader_zlibinflate(reader_t*reader, void* data, int len) -{ -#ifdef HAVE_ZLIB - zlibinflate_t*z = (zlibinflate_t*)reader->internal; - int ret; - if(!z) { - return 0; - } - if(!len) - return 0; - - z->zs.next_out = (Bytef *)data; - z->zs.avail_out = len; - - while(1) { - if(!z->zs.avail_in) { - z->zs.avail_in = z->input->read(z->input, z->readbuffer, ZLIB_BUFFER_SIZE); - z->zs.next_in = z->readbuffer; - } - if(z->zs.avail_in) - ret = inflate(&z->zs, Z_NO_FLUSH); - else - ret = inflate(&z->zs, Z_FINISH); - - if (ret != Z_OK && - ret != Z_STREAM_END) zlib_error(ret, "bitio:inflate_inflate", &z->zs); - - if (ret == Z_STREAM_END) { - int pos = z->zs.next_out - (Bytef*)data; - ret = inflateEnd(&z->zs); - if (ret != Z_OK) zlib_error(ret, "bitio:inflate_end", &z->zs); - free(reader->internal); - reader->internal = 0; - reader->pos += pos; - return pos; - } - if(!z->zs.avail_out) { - break; - } - } - reader->pos += len; - return len; -#else - fprintf(stderr, "Error: swftools was compiled without zlib support"); - exit(1); -#endif -} -static int reader_zlibseek(reader_t*reader, int pos) -{ - fprintf(stderr, "Erro: seeking not supported for zlib streams"); - return -1; -} -static void reader_zlibinflate_dealloc(reader_t*reader) -{ -#ifdef HAVE_ZLIB - zlibinflate_t*z = (zlibinflate_t*)reader->internal; - /* test whether read() already did basic deallocation */ - if(reader->internal) { - inflateEnd(&z->zs); - free(reader->internal); - } - memset(reader, 0, sizeof(reader_t)); -#endif -} -void reader_init_zlibinflate(reader_t*r, reader_t*input) -{ -#ifdef HAVE_ZLIB - zlibinflate_t*z = (zlibinflate_t*)malloc(sizeof(zlibinflate_t)); - memset(z, 0, sizeof(zlibinflate_t)); - int ret; - memset(r, 0, sizeof(reader_t)); - r->internal = z; - r->read = reader_zlibinflate; - r->seek = reader_zlibseek; - r->dealloc = reader_zlibinflate_dealloc; - r->type = READER_TYPE_ZLIB; - r->pos = 0; - z->input = input; - memset(&z->zs,0,sizeof(z_stream)); - z->zs.zalloc = Z_NULL; - z->zs.zfree = Z_NULL; - z->zs.opaque = Z_NULL; - ret = inflateInit(&z->zs); - if (ret != Z_OK) zlib_error(ret, "bitio:inflate_init", &z->zs); - reader_resetbits(r); -#else - fprintf(stderr, "Error: swftools was compiled without zlib support"); - exit(1); -#endif -} - -/* ---------------------------- zlibdeflate writer -------------------------- */ - -typedef struct _zlibdeflate -{ -#ifdef HAVE_ZLIB - z_stream zs; - writer_t*output; - unsigned char writebuffer[ZLIB_BUFFER_SIZE]; -#endif -} zlibdeflate_t; - -static int writer_zlibdeflate_write(writer_t*writer, void* data, int len) -{ -#ifdef HAVE_ZLIB - zlibdeflate_t*z = (zlibdeflate_t*)writer->internal; - int ret; - if(writer->type != WRITER_TYPE_ZLIB) { - fprintf(stderr, "Wrong writer ID (writer not initialized?)\n"); - return 0; - } - if(!z) { - fprintf(stderr, "zlib not initialized!\n"); - return 0; - } - if(!len) - return 0; - - z->zs.next_in = (Bytef *)data; - z->zs.avail_in = len; - - while(1) { - ret = deflate(&z->zs, Z_NO_FLUSH); - - if (ret != Z_OK) zlib_error(ret, "bitio:deflate_deflate", &z->zs); - - if(z->zs.next_out != z->writebuffer) { - writer->pos += z->zs.next_out - (Bytef*)z->writebuffer; - z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer); - z->zs.next_out = z->writebuffer; - z->zs.avail_out = ZLIB_BUFFER_SIZE; - } - - if(!z->zs.avail_in) { - break; - } - } - return len; -#else - fprintf(stderr, "Error: swftools was compiled without zlib support"); - exit(1); -#endif -} - -void writer_zlibdeflate_flush(writer_t*writer) -{ -#ifdef HAVE_ZLIB - zlibdeflate_t*z = (zlibdeflate_t*)writer->internal; - int ret; - if(writer->type != WRITER_TYPE_ZLIB) { - fprintf(stderr, "Wrong writer ID (writer not initialized?)\n"); - return; - } - if(!z) { - fprintf(stderr, "zlib not initialized!\n"); - return; - } - - z->zs.next_in = 0; - z->zs.avail_in = 0; - while(1) { - ret = deflate(&z->zs, Z_SYNC_FLUSH); - if (ret != Z_OK) zlib_error(ret, "bitio:deflate_flush", &z->zs); - if(z->zs.next_out != z->writebuffer) { - writer->pos += z->zs.next_out - (Bytef*)z->writebuffer; - z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer); - z->zs.next_out = z->writebuffer; - z->zs.avail_out = ZLIB_BUFFER_SIZE; - } - /* TODO: how will zlib let us know it needs more buffer space? */ - break; - } - return; -#else - fprintf(stderr, "Error: swftools was compiled without zlib support"); - exit(1); -#endif -} - -static void writer_zlibdeflate_finish(writer_t*writer) -{ -#ifdef HAVE_ZLIB - zlibdeflate_t*z = (zlibdeflate_t*)writer->internal; - writer_t*output; - int ret; - if(writer->type != WRITER_TYPE_ZLIB) { - fprintf(stderr, "Wrong writer ID (writer not initialized?)\n"); - return; - } - if(!z) - return; - output= z->output; - while(1) { - ret = deflate(&z->zs, Z_FINISH); - if (ret != Z_OK && - ret != Z_STREAM_END) zlib_error(ret, "bitio:deflate_finish", &z->zs); - - if(z->zs.next_out != z->writebuffer) { - writer->pos += z->zs.next_out - (Bytef*)z->writebuffer; - z->output->write(z->output, z->writebuffer, z->zs.next_out - (Bytef*)z->writebuffer); - z->zs.next_out = z->writebuffer; - z->zs.avail_out = ZLIB_BUFFER_SIZE; - } - - if (ret == Z_STREAM_END) { - break; - - } - } - ret = deflateEnd(&z->zs); - if (ret != Z_OK) zlib_error(ret, "bitio:deflate_end", &z->zs); - free(writer->internal); - memset(writer, 0, sizeof(writer_t)); - //output->finish(output); -#else - fprintf(stderr, "Error: swftools was compiled without zlib support"); - exit(1); -#endif -} -void writer_init_zlibdeflate(writer_t*w, writer_t*output) -{ -#ifdef HAVE_ZLIB - zlibdeflate_t*z; - int ret; - memset(w, 0, sizeof(writer_t)); - z = (zlibdeflate_t*)malloc(sizeof(zlibdeflate_t)); - memset(z, 0, sizeof(zlibdeflate_t)); - w->internal = z; - w->write = writer_zlibdeflate_write; - w->flush = writer_zlibdeflate_flush; - w->finish = writer_zlibdeflate_finish; - w->type = WRITER_TYPE_ZLIB; - w->pos = 0; - z->output = output; - memset(&z->zs,0,sizeof(z_stream)); - z->zs.zalloc = Z_NULL; - z->zs.zfree = Z_NULL; - z->zs.opaque = Z_NULL; - ret = deflateInit(&z->zs, 9); - if (ret != Z_OK) zlib_error(ret, "bitio:deflate_init", &z->zs); - w->bitpos = 0; - w->mybyte = 0; - z->zs.next_out = z->writebuffer; - z->zs.avail_out = ZLIB_BUFFER_SIZE; -#else - fprintf(stderr, "Error: swftools was compiled without zlib support"); - exit(1); -#endif -} - -/* ----------------------- bit handling routines -------------------------- */ - -void writer_writebit(writer_t*w, int bit) -{ - if(w->bitpos==8) - { - w->write(w, &w->mybyte, 1); - w->bitpos = 0; - w->mybyte = 0; - } - if(bit&1) - w->mybyte |= 1 << (7 - w->bitpos); - w->bitpos ++; -} -void writer_writebits(writer_t*w, unsigned int data, int bits) -{ - int t; - for(t=0;t> (bits-t-1))&1); - } -} -void writer_resetbits(writer_t*w) -{ - if(w->bitpos) - w->write(w, &w->mybyte, 1); - w->bitpos = 0; - w->mybyte = 0; -} - -unsigned int reader_readbit(reader_t*r) -{ - if(r->bitpos==8) - { - r->bitpos=0; - r->read(r, &r->mybyte, 1); - } - return (r->mybyte>>(7-r->bitpos++))&1; -} -unsigned int reader_readbits(reader_t*r, int num) -{ - int t; - int val = 0; - for(t=0;tmybyte = 0; - r->bitpos = 8; - -} - -U8 reader_readU8(reader_t*r) -{ - U8 b = 0; - if(r->read(r, &b, 1)<1) { - fprintf(stderr, "bitio.c:reader_readU8: Read over end of memory region\n"); - } - return b; -} -U16 reader_readU16(reader_t*r) -{ - U8 b1=0,b2=0; - if(r->read(r, &b1, 1)<1) { - fprintf(stderr, "bitio.c:reader_readU16: Read over end of memory region\n"); - } - if(r->read(r, &b2, 1)<1) { - fprintf(stderr, "bitio.c:reader_readU16: Read over end of memory region\n"); - } - return b1|b2<<8; -} -U32 reader_readU32(reader_t*r) -{ - U8 b1=0,b2=0,b3=0,b4=0; - if(r->read(r, &b1, 1)<1) - fprintf(stderr, "bitio.c:reader_readU32: Read over end of memory region\n"); - if(r->read(r, &b2, 1)<1) - fprintf(stderr, "bitio.c:reader_readU32: Read over end of memory region\n"); - if(r->read(r, &b3, 1)<1) - fprintf(stderr, "bitio.c:reader_readU32: Read over end of memory region\n"); - if(r->read(r, &b4, 1)<1) - fprintf(stderr, "bitio.c:reader_readU32: Read over end of memory region\n"); - return b1|b2<<8|b3<<16|b4<<24; -} - -float reader_readFloat(reader_t*r) -{ - float f; - r->read(r, &f, 4); - return f; - - U8 b1=0,b2=0,b3=0,b4=0; - r->read(r, &b1, 1); - r->read(r, &b2, 1); - r->read(r, &b3, 1); - r->read(r, &b4, 1); - U32 w = (b1|b2<<8|b3<<16|b4<<24); - return *(float*)&w; -} -double reader_readDouble(reader_t*r) -{ - double f; - r->read(r, &f, 8); - return f; - - U8 b[8]; - r->read(r, b, 8); - U64 w = ((U64)b[0]|(U64)b[1]<<8|(U64)b[2]<<16|(U64)b[3]<<24|(U64)b[4]<<32|(U64)b[5]<<40|(U64)b[6]<<48|(U64)b[7]<<56); - return *(double*)&w; -} -char*reader_readString(reader_t*r) -{ - writer_t g; - writer_init_growingmemwriter(&g, 16); - while(1) { - U8 b = reader_readU8(r); - writer_writeU8(&g, b); - if(!b) - break; - } - char*string = (char*)writer_growmemwrite_getmem(&g); - g.finish(&g); - return string; -} - -void writer_writeString(writer_t*w, const char*s) -{ - int l = strlen(s); - char zero = 0; - w->write(w, (void*)s, l); - w->write(w, &zero, 1); -} -void writer_writeU8(writer_t*w, unsigned char b) -{ - w->write(w, &b, 1); -} -void writer_writeU16(writer_t*w, unsigned short v) -{ - unsigned char b1 = v; - unsigned char b2 = v>>8; - w->write(w, &b1, 1); - w->write(w, &b2, 1); -} -void writer_writeU32(writer_t*w, unsigned long v) -{ - unsigned char b1 = v; - unsigned char b2 = v>>8; - unsigned char b3 = v>>16; - unsigned char b4 = v>>24; - w->write(w, &b1, 1); - w->write(w, &b2, 1); - w->write(w, &b3, 1); - w->write(w, &b4, 1); -} -void writer_writeFloat(writer_t*w, float f) -{ - w->write(w, &f, 4); - return; - - unsigned v = *(unsigned*)&f; - unsigned char b1 = v; - unsigned char b2 = v>>8; - unsigned char b3 = v>>16; - unsigned char b4 = v>>24; - w->write(w, &b1, 1); - w->write(w, &b2, 1); - w->write(w, &b3, 1); - w->write(w, &b4, 1); -} -void writer_writeDouble(writer_t*w, double f) -{ - w->write(w, &f, 8); - return; - - unsigned long long v = *(unsigned long long*)&f; - unsigned char b1 = v; - unsigned char b2 = v>>8; - unsigned char b3 = v>>16; - unsigned char b4 = v>>24; - unsigned char b5 = v>>32; - unsigned char b6 = v>>40; - unsigned char b7 = v>>48; - unsigned char b8 = v>>56; - w->write(w, &b1, 1); - w->write(w, &b2, 1); - w->write(w, &b3, 1); - w->write(w, &b4, 1); - w->write(w, &b5, 1); - w->write(w, &b6, 1); - w->write(w, &b7, 1); - w->write(w, &b8, 1); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/bitio.h b/fluidbook/tools/swftools-special-swfdump/lib/bitio.h deleted file mode 100644 index cf6a3cb45..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/bitio.h +++ /dev/null @@ -1,120 +0,0 @@ -/* bitio.h - Generic object-oriented reading/writing. - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include "types.h" -#include "../config.h" - -#ifdef HAVE_ZZIP -#include "zzip/lib.h" -#endif - -#ifndef __rfxswf_bitio_h__ -#define __rfxswf_bitio_h__ - -#define READER_TYPE_FILE 1 -#define READER_TYPE_MEM 2 -#define READER_TYPE_ZLIB_U 3 -#define READER_TYPE_ZLIB_C 4 -#define READER_TYPE_ZLIB READER_TYPE_ZLIB_U -#define READER_TYPE_NULL 5 -#define READER_TYPE_FILE2 6 -#define READER_TYPE_ZZIP 7 - -#define WRITER_TYPE_FILE 1 -#define WRITER_TYPE_MEM 2 -#define WRITER_TYPE_ZLIB_C 3 -#define WRITER_TYPE_ZLIB_U 4 -#define WRITER_TYPE_NULL 5 -#define WRITER_TYPE_GROWING_MEM 6 -#define WRITER_TYPE_ZLIB WRITER_TYPE_ZLIB_C - -typedef struct _reader -{ - int (*read)(struct _reader*, void*data, int len); - int (*seek)(struct _reader*, int pos); - void (*dealloc)(struct _reader*); - - void *internal; - int type; - unsigned char mybyte; - unsigned char bitpos; - int pos; -} reader_t; - -typedef struct _writer -{ - int (*write)(struct _writer*, void*data, int len); - void (*flush)(struct _writer*); - void (*finish)(struct _writer*); - - void *internal; - int type; - unsigned char mybyte; - unsigned char bitpos; - int pos; -} writer_t; - -void reader_resetbits(reader_t*r); -unsigned int reader_readbit(reader_t*r); -unsigned int reader_readbits(reader_t*r, int num); - -U8 reader_readU8(reader_t*r); -U16 reader_readU16(reader_t*r); -U32 reader_readU32(reader_t*r); -float reader_readFloat(reader_t*r); -double reader_readDouble(reader_t*r); -char*reader_readString(reader_t*r); - -void writer_resetbits(writer_t*w); -void writer_writebit(writer_t*w, int bit); -void writer_writebits(writer_t*w, unsigned int data, int bits); - -void writer_writeU8(writer_t*w, unsigned char b); -void writer_writeU16(writer_t*w, unsigned short v); -void writer_writeU32(writer_t*w, unsigned long v); -void writer_writeFloat(writer_t*w, float f); -void writer_writeDouble(writer_t*w, double f); -void writer_writeString(writer_t*w, const char*s); - -/* standard readers / writers */ - -void reader_init_filereader(reader_t*r, int handle); -void reader_init_filereader2(reader_t*r, const char*filename); -void reader_init_zlibinflate(reader_t*r, reader_t*input); -void reader_init_memreader(reader_t*r, void*data, int length); -void reader_init_nullreader(reader_t*r); -#ifdef HAVE_ZZIP -void reader_init_zzipreader(reader_t*r,ZZIP_FILE*z); -#endif - -void writer_init_filewriter(writer_t*w, int handle); -void writer_init_filewriter2(writer_t*w, char*filename); -void writer_init_zlibdeflate(writer_t*w, writer_t*output); -void writer_init_memwriter(writer_t*r, void*data, int length); -void writer_init_nullwriter(writer_t*w); - -void writer_init_growingmemwriter(writer_t*r, U32 grow); -void* writer_growmemwrite_memptr(writer_t*w, int*len); -void* writer_growmemwrite_getmem(writer_t*w); -void writer_growmemwrite_reset(writer_t*w); - -#endif //__rfxswf_bitio_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.c deleted file mode 100644 index 8b729c116..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.c +++ /dev/null @@ -1,178 +0,0 @@ -/* bbox.c - - Part of the swftools package. - - Copyright (c) 2006 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#ifndef WIN32 -#include -#endif -#include -#include -#include "../types.h" -#include "../mem.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" - -typedef struct _internal { - gfxbbox_t bbox; - int do_graphics; - int do_text; -} internal_t; - -void measuregfxline(internal_t*i, gfxline_t*line) -{ - gfxbbox_t b = gfxline_getbbox(line); - if(b.xmin==0 && b.ymin==0 && b.xmax==0 && b.ymax==0) { - return; - } - i->bbox = gfxbbox_expand_to_point(i->bbox, b.xmin, b.ymin); - i->bbox = gfxbbox_expand_to_point(i->bbox, b.xmax, b.ymax); -} - -int bbox_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - if(!strcmp(key, "graphics")) { - i->do_graphics = atoi(value); - return 1; - } else if(!strcmp(key, "text")) { - i->do_text = atoi(value); - return 1; - } - return 0; -} - -void bbox_startpage(gfxdevice_t*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - i->bbox.xmin = 0; - i->bbox.ymin = 0; - i->bbox.xmax = 0; - i->bbox.ymax = 0; -} - -void bbox_startclip(gfxdevice_t*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; -} - -void bbox_endclip(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; -} - -void bbox_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->do_graphics) - measuregfxline(i, line); -} - -void bbox_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->do_graphics) - measuregfxline(i, line); -} - -void bbox_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->do_graphics) - measuregfxline(i, line); -} - -void bbox_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->do_graphics) - measuregfxline(i, line); -} - -void bbox_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; -} - -void bbox_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - if(!font) - return; - - if(i->do_text) { - gfxglyph_t*glyph = &font->glyphs[glyphnr]; - gfxline_t*line2 = gfxline_clone(glyph->line); - gfxline_transform(line2, matrix); - measuregfxline(i, line2); - gfxline_free(line2); - } -} - -void bbox_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) -{ - internal_t*i = (internal_t*)dev->internal; -} - -void bbox_endpage(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; -} - -gfxresult_t* bbox_finish(gfxdevice_t*dev) -{ - free(dev->internal);dev->internal = 0; - return 0; -} - -gfxbbox_t gfxdevice_bbox_getbbox(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - return i->bbox; -} - -void gfxdevice_bbox_init(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "bbox"; - - dev->internal = i; - - dev->setparameter = bbox_setparameter; - dev->startpage = bbox_startpage; - dev->startclip = bbox_startclip; - dev->endclip = bbox_endclip; - dev->stroke = bbox_stroke; - dev->fill = bbox_fill; - dev->fillbitmap = bbox_fillbitmap; - dev->fillgradient = bbox_fillgradient; - dev->addfont = bbox_addfont; - dev->drawchar = bbox_drawchar; - dev->drawlink = bbox_drawlink; - dev->endpage = bbox_endpage; - dev->finish = bbox_finish; - - i->do_graphics = 1; - i->do_text = 1; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.h deleted file mode 100644 index a69803ed1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/bbox.h +++ /dev/null @@ -1,38 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_bbox_h__ -#define __gfxdevice_bbox_h__ - -#include "../gfxdevice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_bbox_init(gfxdevice_t*self); -gfxbbox_t gfxdevice_bbox_getbbox(gfxdevice_t*self); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_bbox_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.c deleted file mode 100644 index 43ae1983d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.c +++ /dev/null @@ -1,157 +0,0 @@ -/* dummy.c - - Part of the swftools package. - - Copyright (c) 2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include "../types.h" -#include "../mem.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" - -typedef struct _internal { - gfxdevice_t*out; -} internal_t; - -int dummy_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) { - return i->out->setparameter(i->out,key,value); - } else { - return 0; - } -} - -void dummy_startpage(gfxdevice_t*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->startpage(i->out,width,height); -} -void dummy_startclip(gfxdevice_t*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->startclip(i->out,line); -} -void dummy_endclip(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->endclip(i->out); -} -void dummy_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->stroke(i->out, line, width, color, cap_style, joint_style, miterLimit); -} - -void dummy_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->fill(i->out, line, color); -} - -void dummy_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->fillbitmap(i->out, line, img, matrix, cxform); -} - -void dummy_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->fillgradient(i->out, line, gradient, type, matrix); -} - -void dummy_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->addfont(i->out, font); -} - -void dummy_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->drawchar(i->out, font, glyphnr, color, matrix); -} - -void dummy_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->drawlink(i->out, line, action, text); -} - -void dummy_endpage(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) - i->out->endpage(i->out); -} - -gfxresult_t* dummy_finish(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->out) { - gfxdevice_t*out = i->out; - free(dev->internal);dev->internal = 0;i=0; - return out->finish(out); - } else { - free(dev->internal);dev->internal = 0;i=0; - return 0; - } -} - -void gfxdevice_dummy_init(gfxdevice_t*dev, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "dummy"; - - dev->internal = i; - - dev->setparameter = dummy_setparameter; - dev->startpage = dummy_startpage; - dev->startclip = dummy_startclip; - dev->endclip = dummy_endclip; - dev->stroke = dummy_stroke; - dev->fill = dummy_fill; - dev->fillbitmap = dummy_fillbitmap; - dev->fillgradient = dummy_fillgradient; - dev->addfont = dummy_addfont; - dev->drawchar = dummy_drawchar; - dev->drawlink = dummy_drawlink; - dev->endpage = dummy_endpage; - dev->finish = dummy_finish; - - i->out = out; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.h deleted file mode 100644 index ee3e5fbb5..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/dummy.h +++ /dev/null @@ -1,37 +0,0 @@ -/* dummy.h - Header file for dummy.c - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_dummy_h__ -#define __gfxdevice_dummy_h__ - -#include "../gfxdevice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_dummy_init(gfxdevice_t*dev, gfxdevice_t*out); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_dummy_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/file.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/file.c deleted file mode 100644 index 01263aef0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/file.c +++ /dev/null @@ -1,251 +0,0 @@ -/* gfxdevice_file.cc - - Part of the swftools package. - - Copyright (c) 2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#ifndef WIN32 -#include -#endif -#include -#include -#include "../gfxdevice.h" - -typedef struct _internal { - char*filename; - FILE*fi; -} internal_t; - -int file_setparameter(struct _gfxdevice*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "setparameter %s=%s\n", key, value); - return 1; -} - -void file_startpage(struct _gfxdevice*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "startpage %d %d\n", width, height); -} - -static void dumpline(FILE*fi, gfxline_t*line) -{ - while(line) { - if(line->type == gfx_moveTo) { - fprintf(fi, "\tmoveTo %f %f\n", line->x, line->y); - } else if(line->type == gfx_lineTo) { - fprintf(fi, "\tlineTo %f %f\n", line->x, line->y); - } else if(line->type == gfx_splineTo) { - fprintf(fi, "\tsplineTo %f %f %f %f\n", line->sx, line->sy, line->x, line->y); - } - line = line->next; - } -} - -static void dumpmatrix (FILE*fi, gfxmatrix_t*matrix) -{ - fprintf(fi, "| %5.2f %5.2f %5.2f\n", matrix->m00, matrix->m10, matrix->tx); - fprintf(fi, "| %5.2f %5.2f %5.2f\n", matrix->m01, matrix->m11, matrix->ty); -} - -static void dumpgradient (FILE*fi, gfxgradient_t*gradient) -{ - while(gradient) { - fprintf(fi, "pos %f: %02x%02x%02x%02x\n", gradient->pos, gradient->color.r, gradient->color.g, gradient->color.b, gradient->color.a); - gradient = gradient->next; - } -} - -void file_startclip(struct _gfxdevice*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "startclip\n"); - dumpline(i->fi, line); -} - -void file_endclip(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "endclip\n"); -} - -void file_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - char* jointTypes[] = {"joinMiter", "joinRound", "joinBevel"}; - char* capTypes[] = {"capButt", "capRound", "capSquare"}; - - fprintf(i->fi, "stroke %f %f %s %s %02x%02x%02x%02x\n", width, miterLimit, capTypes[cap_style], jointTypes[joint_style], - color->r, color->g, color->b, color->a - ); - dumpline(i->fi, line); -} - -void file_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "fill %02x%02x%02x%02x\n", color->r, color->g, color->b, color->a); - dumpline(i->fi, line); -} - -void file_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "fillbitmap\n"); - dumpmatrix(i->fi, matrix); - dumpline(i->fi, line); -} - -void file_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "fillgradient\n"); - dumpmatrix(i->fi, matrix); - dumpgradient(i->fi, gradient); - dumpline(i->fi, line); -} - -void file_addfont(struct _gfxdevice*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "addfont %s\n", font->id); -} - -void file_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; -} - -void file_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "drawlink %s\n", action); - dumpline(i->fi, line); -} - -void file_endpage(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - fprintf(i->fi, "endpage\n"); -} - -typedef struct gfxresult_internal -{ - FILE*fi; - char*filename; -} gfxresult_internal_t; - -void fileresult_destroy(struct _gfxresult*gfx) -{ - gfxresult_internal_t*i = (gfxresult_internal_t*)gfx->internal; - unlink(i->filename); - free(i->filename);i->filename = 0; -} - -int fileresult_save(struct _gfxresult*gfx, const char*filename) -{ - gfxresult_internal_t*i = (gfxresult_internal_t*)gfx->internal; - FILE*fi,*fo; - fi = fopen(i->filename, "rb"); - if(!fi) { - perror(i->filename); - return 0; - } - fo = fopen(filename, "wb"); - if(!fo) { - perror(filename); - return 0; - } - - char buf[4096]; - while(!feof(fi)) { - int l = fread(buf, 1, 4096, fi); - if(l>0) { - fwrite(buf, 1, l, fo); - } else { - break; - } - } - - fclose(fi); - fclose(fo); - return 0; -} - -void* fileresult_get(struct _gfxresult*gfx, const char*name) -{ - return 0; -} - -gfxresult_t* file_finish(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - char*filename = strdup(i->filename); - gfxresult_t*result = (gfxresult_t*)malloc(sizeof(gfxresult_t)); - fclose(i->fi); - i->fi = 0; - if(i->filename) { - free(i->filename); - i->filename = 0; - } - free(dev->internal); - dev->internal = 0; - - memset(result, 0, sizeof(gfxresult_t)); - result->save = fileresult_save; - result->get = fileresult_get; - result->destroy = fileresult_destroy; - result->internal = malloc(sizeof(gfxresult_internal_t)); - ((gfxresult_internal_t*)result->internal)->filename = filename; - - return result; -} - -void gfxdevice_file_init(gfxdevice_t*dev, char*filename) -{ - internal_t*i = (internal_t*)malloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "file"; - - dev->internal = i; - - dev->setparameter = file_setparameter; - dev->startpage = file_startpage; - dev->startclip = file_startclip; - dev->endclip = file_endclip; - dev->stroke = file_stroke; - dev->fill = file_fill; - dev->fillbitmap = file_fillbitmap; - dev->fillgradient = file_fillgradient; - dev->addfont = file_addfont; - dev->drawchar = file_drawchar; - dev->drawlink = file_drawlink; - dev->endpage = file_endpage; - dev->finish = file_finish; - - i->fi = fopen(filename, "wb"); - i->filename = strdup(filename); - if(!i->fi) { - fprintf(stderr, "Couldn't open file %s\n", filename); - exit(1); - } -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/file.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/file.h deleted file mode 100644 index 753391676..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/file.h +++ /dev/null @@ -1,38 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_file_h__ -#define __gfxdevice_file_h__ - - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../gfxdevice.h" - -void gfxdevice_file_init(gfxdevice_t*, char*filename); - -#ifdef __cplusplus -} -#endif - -#endif //gfxdevice_file_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.c deleted file mode 100644 index 4326c656f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.c +++ /dev/null @@ -1,262 +0,0 @@ -/* ocr.c - - Part of the swftools package. - - Copyright (c) 2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include "../types.h" -#include "../mem.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "render.h" - -#include "../gocr/pnm.h" -#include "../gocr/pgm2asc.h" - -typedef struct _textpage { - char*text; - int textpos; - struct _textpage*next; -} textpage_t; - -typedef struct _internal { - gfxdevice_t*render; - int pages; - - textpage_t*first_page; - textpage_t*current_page; -} internal_t; - -int ocr_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - return i->render->setparameter(i->render,key,value); -} - -void ocr_startpage(gfxdevice_t*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->render) { - fprintf(stderr, "Call endpage() before calling startpage()\n"); - return; - } - i->render = malloc(sizeof(gfxdevice_t)); - gfxdevice_render_init(i->render); - i->render->startpage(i->render,width,height); - i->pages++; -} -/* passthrough */ -void ocr_startclip(gfxdevice_t*dev, gfxline_t*line) { ((internal_t*)dev->internal)->render->startclip(((internal_t*)dev->internal)->render,line); } -void ocr_endclip(gfxdevice_t*dev) { ((internal_t*)dev->internal)->render->endclip(((internal_t*)dev->internal)->render); } -void ocr_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) { ((internal_t*)dev->internal)->render->stroke(((internal_t*)dev->internal)->render, line, width, color, cap_style, joint_style, miterLimit); } -void ocr_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) { ((internal_t*)dev->internal)->render->fill(((internal_t*)dev->internal)->render, line, color); } -void ocr_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) { ((internal_t*)dev->internal)->render->fillbitmap(((internal_t*)dev->internal)->render, line, img, matrix, cxform); } -void ocr_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) { ((internal_t*)dev->internal)->render->fillgradient(((internal_t*)dev->internal)->render, line, gradient, type, matrix); } -void ocr_addfont(gfxdevice_t*dev, gfxfont_t*font) { ((internal_t*)dev->internal)->render->addfont(((internal_t*)dev->internal)->render, font); } -void ocr_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) { ((internal_t*)dev->internal)->render->drawchar(((internal_t*)dev->internal)->render, font, glyphnr, color, matrix); } -void ocr_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) { ((internal_t*)dev->internal)->render->drawlink(((internal_t*)dev->internal)->render, line, action, text); } - -void ocr_result_write(gfxresult_t*r, int filedesc) -{ - textpage_t*i= (textpage_t*)r->internal; -} -int ocr_result_save(gfxresult_t*r, const char*filename) -{ - textpage_t*i= (textpage_t*)r->internal; - if(!i) { - return 0; // no pages drawn - } - FILE*fi = fopen(filename, "wb"); - if(!fi) - return 0; - while(i) { - fwrite(i->text, i->textpos, 1, fi); - i = i->next; - } - fclose(fi); - return 1; -} - -void*ocr_result_get(gfxresult_t*r, const char*name) -{ - textpage_t*i= (textpage_t*)r->internal; - if(!strcmp(name,"text")) { - textpage_t*j = i; - int len = 0; - while(j) { - len += i->textpos; - j = j->next; - } - char*text = (char*)malloc(len); - int pos = 0; - j = i; - while(j) { - memcpy(&text[pos], i->text, i->textpos); - pos += i->textpos; - j = j->next; - } - text[pos] = 0; - return text; - } else if(!strncmp(name,"page",4)) { - int pagenr = atoi(&name[4]); - if(pagenr<0) - pagenr=0; - while(pagenr>0) { - i = i->next; - if(!i) - return 0; - pagenr++; - } - i->text[i->textpos] = 0; - return strdup(i->text); - } - return 0; -} -void ocr_result_destroy(gfxresult_t*r) -{ - textpage_t*i= (textpage_t*)r->internal; - int t; - r->internal = 0; - while(i) { - textpage_t*next = i->next; - free(i->text);i->text = 0; - free(i); - i = next; - } - free(r); -} - -job_t*JOB; - -void ocr_endpage(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - i->render->endpage(i->render); - - gfxdevice_t*out = i->render; - gfxresult_t* r = out->finish(out); - free(i->render);i->render = 0; - - gfximage_t*img = (gfximage_t*)r->get(r, "page"); - - job_t job; - JOB = &job; - - job_init(&job); - job.cfg.out_format=UTF8; - - job.src.fname = ""; - job.src.p.p = malloc(img->width*img->height); - job.src.p.bpp = 1; - job.src.p.x = img->width; - job.src.p.y = img->height; - int size=img->width*img->height; - int t; - for(t=0;tdata[t].r+img->data[t].g+img->data[t].b)/3; - } - - pgm2asc(&job); - - int linecounter; - const char *line = 0; - int len = 0; - linecounter = 0; - line = getTextLine(linecounter++); - while (line) { - len += strlen(line)+1; - line = getTextLine(linecounter++); - } - - textpage_t*page = malloc(sizeof(textpage_t)); - page->next = 0; - page->text = malloc(len+1); - page->textpos = 0; - if(!i->first_page) { - i->first_page = i->current_page = page; - } else { - i->current_page->next = page; - i->current_page = page; - } - - linecounter = 0; - line = getTextLine(linecounter++); - while (line) { - int l = strlen(line); - memcpy(&page->text[page->textpos], line, l); - page->textpos += l; - page->text[page->textpos++] = '\n'; - - line = getTextLine(linecounter++); - } - page->text[page->textpos++] = 0; - - free_textlines(); - - job_free(&job);JOB=0; - - r->destroy(r); -} - -gfxresult_t* ocr_finish(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - - gfxresult_t*r = (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); - - r->internal = i->first_page; - r->write = ocr_result_write; - r->save = ocr_result_save; - r->get = ocr_result_get; - r->destroy = ocr_result_destroy; - - free(dev->internal); dev->internal = 0; i = 0; - - return r; -} - -void gfxdevice_ocr_init(gfxdevice_t*dev, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "ocr"; - - dev->internal = i; - - dev->setparameter = ocr_setparameter; - dev->startpage = ocr_startpage; - dev->startclip = ocr_startclip; - dev->endclip = ocr_endclip; - dev->stroke = ocr_stroke; - dev->fill = ocr_fill; - dev->fillbitmap = ocr_fillbitmap; - dev->fillgradient = ocr_fillgradient; - dev->addfont = ocr_addfont; - dev->drawchar = ocr_drawchar; - dev->drawlink = ocr_drawlink; - dev->endpage = ocr_endpage; - dev->finish = ocr_finish; - - i->pages = 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.h deleted file mode 100644 index 14bd3be12..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/ocr.h +++ /dev/null @@ -1,37 +0,0 @@ -/* ocr.h - Header file for ocr.c - - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_ocr_h__ -#define __gfxdevice_ocr_h__ - -#include "../gfxdevice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_ocr_init(gfxdevice_t*dev); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_ocr_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.c deleted file mode 100644 index bc0ffeb32..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.c +++ /dev/null @@ -1,626 +0,0 @@ -#include -#include -#include -#include - -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../MD5.h" -#include "../types.h" - -#include -#include -#include -#include - -#include - -//#define ZSTEP (1/65536.0) -#define ZSTEP (1/32.0) -//#define ZSTEP (1/4.0) - -typedef struct _fontlist { - gfxfont_t*font; - struct _fontlist*next; -} fontlist_t; - -typedef struct _internal { - gfxfont_t*font; - char*fontid; - fontlist_t* fontlist; - int width, height; - int currentz; - - int config_polygonoutlines; - - GLUtesselator *tesselator; - GLUtesselator *tesselator_line; - GLUtesselator *tesselator_tex; -} internal_t; - -static int verbose = 0; -static void dbg(char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - if(!verbose) - return; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - printf("(device-opengl) %s\n", buf); - fflush(stdout); -} - -#ifndef CALLBACK -#define CALLBACK -#endif - -typedef void(*callbackfunction_t)(); - -void CALLBACK errorCallback(GLenum errorCode) -{ - const GLubyte *estring; - estring = gluErrorString(errorCode); - printf("Tessellation Error: %s\n", estring); - exit(0); -} -void CALLBACK beginCallback(GLenum which) -{ - glBegin(which); -} -void CALLBACK endCallback(void) -{ - glEnd(); -} -void CALLBACK vertexCallback(GLvoid *vertex) -{ - double*xyz = (GLdouble*)vertex; - glVertex3d(xyz[0],xyz[1],xyz[2]); -} -void CALLBACK combineCallback(GLdouble coords[3], GLdouble *data[4], GLfloat w[4], GLdouble **out) -{ - GLdouble *vertex; - vertex = (GLdouble *) malloc(6 * sizeof(GLdouble)); - vertex[0] = coords[0]; - vertex[1] = coords[1]; - vertex[2] = coords[2]; - *out = vertex; -} -void CALLBACK vertexCallbackTex(GLvoid *vertex) -{ - double*v = (GLdouble*)vertex; - glTexCoord2f(v[3],v[4]); - glVertex3d(v[0],v[1],v[2]); -} -void CALLBACK combineCallbackTex(GLdouble coords[3], GLdouble *data[4], GLfloat w[4], GLdouble **out) -{ - GLdouble *vertex; - vertex = (GLdouble *) malloc(5 * sizeof(GLdouble)); - vertex[0] = coords[0]; - vertex[1] = coords[1]; - vertex[2] = coords[2]; - if(data[2] && data[3]) { - vertex[3] = w[0]*data[0][3] + w[1]*data[1][3] + w[2]*data[2][3] + w[3]*data[3][3]; - vertex[4] = w[0]*data[0][4] + w[1]*data[1][4] + w[2]*data[2][4] + w[3]*data[3][4]; - } else { - vertex[3] = w[0]*data[0][3] + w[1]*data[1][3]; - vertex[4] = w[0]*data[0][4] + w[1]*data[1][4]; - } - *out = vertex; -} - -int opengl_setparameter(struct _gfxdevice*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - dbg("setparameter %s=%s", key, value); - if(!strcmp(key, "polygonoutlines")) { - i->config_polygonoutlines = atoi(value); - } - return 0; -} - -void opengl_startpage(struct _gfxdevice*dev, int width, int height) -{ - dbg("startpage %d %d", width, height); - internal_t*i = (internal_t*)dev->internal; - i->width = width; - i->height = height; - i->currentz = 0; -} - -void opengl_startclip(struct _gfxdevice*dev, gfxline_t*line) -{ - dbg("startclip"); -} - -void opengl_endclip(struct _gfxdevice*dev) -{ - dbg("endclip"); -} - -void opengl_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - dbg("stroke"); - internal_t*i = (internal_t*)dev->internal; - i->currentz++; - char running = 0; - gfxline_t*l=0; - - glColor4f(color->r/255.0, color->g/255.0, color->b/255.0, color->a/255.0); - - //glLineWidth(width*64); - if(width <= 0) { - width = 1.0; - } - glLineWidth(width); - double z = i->currentz*ZSTEP; - - glPolygonOffset(0.0, 500.0); - - l = line; - while(l) { - if(l->type == gfx_moveTo) { - if(running) { - running = 0; - glEnd(); - } - } - if(!running) { - running = 1; - glBegin(GL_LINE_STRIP); - } - glVertex3d(l->x, l->y, z); - l=l->next; - } - if(running) { - running = 0; - glEnd(); - } - glLineWidth(1.0); -} - -#define SPLINE_SUBDIVISION 2 - -void tesselatePolygon(GLUtesselator*tesselator, double z, gfxline_t*line) -{ - int len = 0; - gfxline_t*l=0; - double lastx=0,lasty=0; - double*xyz=0; - char running = 0; - gluTessBeginPolygon(tesselator, NULL); - l = line; - len = 0; - while(l) { - if(l->type == gfx_splineTo) { - double c = sqrt(abs(l->x-2*l->sx+lastx) + abs(l->y-2*l->sy+lasty))*SPLINE_SUBDIVISION; - int steps = (int)c; - if(steps<1) steps = 1; - len += steps; - } else { - len++; - } - l = l->next; - } - //printf("full len:%d\n", len); - xyz = malloc(sizeof(double)*3*len); - l = line; - len = 0; - while(l) { - if(l->type == gfx_moveTo) { - if(running) { - running = 0; - gluTessEndContour(tesselator); - } - } - if(!running) { - running = 1; - gluTessBeginContour(tesselator); - } - - if(l->type == gfx_splineTo) { - int j; - double c = sqrt(abs(l->x-2*l->sx+lastx) + abs(l->y-2*l->sy+lasty))*SPLINE_SUBDIVISION; - int steps = (int)c; - if(steps<1) steps = 1; - //printf("c=%f d1=%f (%f/%f) d2=%f (%f/%f)\n", c,d1,l->x-l->sx,l->y-l->sy,d2,lastx-l->sx,lasty-l->sy); - //printf("%f %f %f\n", lastx, l->sx, l->x); - //printf("%f %f %f\n", lasty, l->sy, l->y); - for(j=1;j<=steps;j++) { - //printf("%d\n", j); - double t = (double)j / (double)steps; - xyz[len*3+0] = lastx*(1-t)*(1-t) + 2*l->sx*(1-t)*t + l->x*t*t; - xyz[len*3+1] = lasty*(1-t)*(1-t) + 2*l->sy*(1-t)*t + l->y*t*t; - xyz[len*3+2] = z; - gluTessVertex(tesselator, &xyz[len*3], &xyz[len*3]); - len++; - } - //printf("%d\n", len); - } else { - xyz[len*3+0] = l->x; - xyz[len*3+1] = l->y; - xyz[len*3+2] = z; - gluTessVertex(tesselator, &xyz[len*3], &xyz[len*3]); - len++; - } - lastx = l->x; - lasty = l->y; - - l=l->next; - } - if(running) { - running = 0; - gluTessEndContour(tesselator); - } - gluTessEndPolygon(tesselator); - free(xyz); -} - -void opengl_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) -{ - double z; - dbg("fill %02x%02x%02x%02x", color->a, color->r, color->g, color->b); - internal_t*i = (internal_t*)dev->internal; - - glDisable(GL_TEXTURE_2D); - glColor4f(color->r/255.0, color->g/255.0, color->b/255.0, color->a/255.0); - - i->currentz ++; - z = (i->currentz*ZSTEP); - tesselatePolygon(i->tesselator, z, line); - - //tesselatePolygon(i->tesselator_line, z, line); -} - -typedef struct _gfxhash -{ - unsigned char d[16]; -} gfxhash_t; - -char gfxhash_compare(gfxhash_t*h1, gfxhash_t*h2) -{ - return !memcmp(h1->d, h2->d, 16); -} - -typedef struct _imgopengl -{ - gfxhash_t hash; - GLuint texID; - int width, height; - unsigned char*data; - struct _imgopengl*next; -} imgopengl_t; - -static imgopengl_t*img2texid = 0; - -static gfxhash_t gfximage_hash(gfximage_t*img) -{ - int t; - int size = img->width*img->height*4; - U8*data = (U8*)img->data; - gfxhash_t hash; - hash_md5(data, size, hash.d); - return hash; -} - -static void delTextures() -{ - imgopengl_t*i = img2texid; - while(i) { - imgopengl_t*next = i->next; - if(i->data) { - glDeleteTextures(1, &i->texID); - free(i->data); - } - memset(i, 0, sizeof(imgopengl_t)); - free(i); - i = next; - } -} - -static imgopengl_t*addTexture(gfximage_t*img) -{ - gfxhash_t hash = gfximage_hash(img); - imgopengl_t*i = img2texid; - - int width_bits = 0; - int height_bits = 0; - while(1<width) - width_bits++; - while(1<height) - height_bits++; - int newwidth = 1<hash) && newwidth==i->width && newheight==i->height) { - return i; - } - i = i->next; - } - - GLuint texIDs[1]; - glGenTextures(1, texIDs); - - i = malloc(sizeof(imgopengl_t)); - i->hash = hash; - i->texID = texIDs[0]; - i->next = img2texid; - img2texid = i; - - i->width = newwidth; - i->height = newheight; - - unsigned char*data = malloc(newwidth*newheight*4); - i->data = data; - int x,y; - for(y=0;yheight;y++) { - for(x=0;xwidth;x++) { - data[(y*newwidth+x)*4+0] = img->data[y*img->width+x].r; - data[(y*newwidth+x)*4+1] = img->data[y*img->width+x].g; - data[(y*newwidth+x)*4+2] = img->data[y*img->width+x].b; - data[(y*newwidth+x)*4+3] = img->data[y*img->width+x].a; - } - int lastx = img->width - 1; - for(;xdata[y*img->width+lastx].r; - data[(y*newwidth+x)*4+1] = img->data[y*img->width+lastx].g; - data[(y*newwidth+x)*4+2] = img->data[y*img->width+lastx].b; - data[(y*newwidth+x)*4+3] = img->data[y*img->width+lastx].a; - } - } - int lasty = img->height - 1; - for(;ydata[lasty*img->width+x].r; - data[(y*newwidth+x)*4+1] = img->data[lasty*img->width+x].g; - data[(y*newwidth+x)*4+2] = img->data[lasty*img->width+x].b; - data[(y*newwidth+x)*4+3] = img->data[lasty*img->width+x].a; - } - } - - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, i->texID); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, i->width, i->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - - return i; -}; - -void opengl_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - dbg("fillbitmap"); - internal_t*i = (internal_t*)dev->internal; - char running = 0; - int len = 0; - double*xyz=0; - gfxline_t*l=0; - glColor4f(1.0,0,0.7,1.0); - - i->currentz ++; - - imgopengl_t* txt = addTexture(img); - - gfxmatrix_t m2; - gfxmatrix_invert(matrix, &m2); - m2.m00 /= txt->width; - m2.m10 /= txt->width; - m2.tx /= txt->width; - m2.m01 /= txt->height; - m2.m11 /= txt->height; - m2.ty /= txt->height; - - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, txt->texID); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - - gluTessBeginPolygon(i->tesselator_tex, NULL); - l = line; - len = 0; - while(l) { - len++; - l = l->next; - } - xyz = malloc(sizeof(double)*5*len); - l = line; - len = 0; - while(l) { - if(l->type == gfx_moveTo) { - if(running) { - running = 0; - gluTessEndContour(i->tesselator_tex); - } - } - if(!running) { - running = 1; - gluTessBeginContour(i->tesselator_tex); - } - - xyz[len*5+0] = l->x; - xyz[len*5+1] = l->y; - xyz[len*5+2] = (i->currentz*ZSTEP); - xyz[len*5+3] = 0; - xyz[len*5+4] = 0; - gfxmatrix_transform(&m2, /*src*/&xyz[len*5+0], /*dest*/&xyz[len*5+3]); - - gluTessVertex(i->tesselator_tex, &xyz[len*5], &xyz[len*5]); - len++; - - l=l->next; - } - - if(running) { - running = 0; - gluTessEndContour(i->tesselator_tex); - } - gluTessEndPolygon(i->tesselator_tex); - free(xyz); - - glDisable(GL_TEXTURE_2D); -} - -void opengl_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - dbg("fillgradient"); -} - -void opengl_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; - - fontlist_t*last=0,*l = i->fontlist; - while(l) { - last = l; - if(!strcmp((char*)l->font->id, font->id)) { - return; // we already know this font - } - l = l->next; - } - l = (fontlist_t*)rfx_calloc(sizeof(fontlist_t)); - l->font = font; - l->next = 0; - if(last) { - last->next = l; - } else { - i->fontlist = l; - } -} - -void opengl_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - if(!font) - return; - - if(i->font && i->font->id && !strcmp(font->id, i->font->id)) { - // current font is correct - } else { - fontlist_t*l = i->fontlist; - i->font = 0; - while(l) { - if(!strcmp((char*)l->font->id, font->id)) { - i->font = l->font; - break; - } - l = l->next; - } - if(i->font == 0) { - opengl_addfont(dev, font); - i->font = font; - //fprintf(stderr, "Unknown font id: %s", font->id); - //return; - } - } - - gfxglyph_t*glyph = &i->font->glyphs[glyphnr]; - - gfxline_t*line2 = gfxline_clone(glyph->line); - gfxline_transform(line2, matrix); - opengl_fill(dev, line2, color); - gfxline_free(line2); - - i->currentz --; - - return; -} - - - -void opengl_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) -{ - dbg("link"); -} - -void opengl_endpage(struct _gfxdevice*dev) -{ - dbg("endpage"); -} - -int opengl_result_save(struct _gfxresult*gfx, const char*filename) -{ - dbg("result:save"); - return 0; -} -void* opengl_result_get(struct _gfxresult*gfx, const char*name) -{ - dbg("result:get"); - return 0; -} -void opengl_result_destroy(struct _gfxresult*gfx) -{ - dbg("result:destroy"); - free(gfx); - delTextures(); -} - -gfxresult_t*opengl_finish(struct _gfxdevice*dev) -{ - dbg("finish"); - internal_t*i = (internal_t*)dev->internal; - gluDeleteTess(i->tesselator);i->tesselator=0; - gluDeleteTess(i->tesselator_tex);i->tesselator_tex=0; - gfxresult_t*result = (gfxresult_t*)malloc(sizeof(gfxresult_t)); - memset(result, 0, sizeof(gfxresult_t)); - result->save = opengl_result_save; - result->get = opengl_result_get; - result->destroy = opengl_result_destroy; - return result; -} - -void gfxdevice_opengl_init(gfxdevice_t*dev) -{ - dbg("init"); - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "opengl"; - - dev->internal = i; - - dev->setparameter = opengl_setparameter; - dev->startpage = opengl_startpage; - dev->startclip = opengl_startclip; - dev->endclip = opengl_endclip; - dev->stroke = opengl_stroke; - dev->fill = opengl_fill; - dev->fillbitmap = opengl_fillbitmap; - dev->fillgradient = opengl_fillgradient; - dev->addfont = opengl_addfont; - dev->drawchar = opengl_drawchar; - dev->drawlink = opengl_drawlink; - dev->endpage = opengl_endpage; - dev->finish = opengl_finish; - - i->tesselator = gluNewTess(); - gluTessCallback(i->tesselator, GLU_TESS_ERROR, (callbackfunction_t)errorCallback); - gluTessCallback(i->tesselator, GLU_TESS_VERTEX, (callbackfunction_t)vertexCallback); - gluTessCallback(i->tesselator, GLU_TESS_BEGIN, (callbackfunction_t)beginCallback); - gluTessCallback(i->tesselator, GLU_TESS_END, (callbackfunction_t)endCallback); - gluTessCallback(i->tesselator, GLU_TESS_COMBINE, (callbackfunction_t)combineCallback); - - i->tesselator_line = gluNewTess(); - gluTessCallback(i->tesselator_line, GLU_TESS_ERROR, (callbackfunction_t)errorCallback); - gluTessCallback(i->tesselator_line, GLU_TESS_VERTEX, (callbackfunction_t)vertexCallback); - gluTessCallback(i->tesselator_line, GLU_TESS_BEGIN, (callbackfunction_t)beginCallback); - gluTessCallback(i->tesselator_line, GLU_TESS_END, (callbackfunction_t)endCallback); - gluTessProperty(i->tesselator_line, GLU_TESS_BOUNDARY_ONLY, 1.0); - - i->tesselator_tex = gluNewTess(); - gluTessCallback(i->tesselator_tex, GLU_TESS_ERROR, (callbackfunction_t)errorCallback); - gluTessCallback(i->tesselator_tex, GLU_TESS_VERTEX, (callbackfunction_t)vertexCallbackTex); - gluTessCallback(i->tesselator_tex, GLU_TESS_BEGIN, (callbackfunction_t)beginCallback); - gluTessCallback(i->tesselator_tex, GLU_TESS_END, (callbackfunction_t)endCallback); - gluTessCallback(i->tesselator_tex, GLU_TESS_COMBINE, (callbackfunction_t)combineCallbackTex); - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.h deleted file mode 100644 index d870127fc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/opengl.h +++ /dev/null @@ -1,38 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __opengl_h__ -#define __opengl_h__ - -#include "../gfxdevice.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_opengl_init(gfxdevice_t*); - -#ifdef __cplusplus -} -#endif - -#endif //__opengl_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.c deleted file mode 100644 index c40dac5e3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.c +++ /dev/null @@ -1,195 +0,0 @@ -/* ops.c - - Part of the swftools package. - - Copyright (c) 2006 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#ifndef WIN32 -#include -#endif -#include -#include -#include "../types.h" -#include "../mem.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "ops.h" - -typedef struct _internal { - gfxdevice_t*out; - U8 alpha; -} internal_t; - -static int verbose = 1; -static void dbg(char*format, ...) -{ - if(!verbose) - return; - char buf[1024]; - int l; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - printf("(device-ops) %s\n", buf); - fflush(stdout); -} - -inline gfxcolor_t transform_color(internal_t*i, gfxcolor_t*col) -{ - gfxcolor_t col2; - /*col2.r = (col->r * i->alpha)>>8; - col2.g = (col->g * i->alpha)>>8; - col2.b = (col->b * i->alpha)>>8;*/ - col2.r = col->r; - col2.g = col->g; - col2.b = col->b; - col2.a = (col->a * i->alpha)/255; - return col2; -} - -int ops_setparameter(struct _gfxdevice*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - return i->out->setparameter(i->out,key,value); -} - -void ops_startpage(struct _gfxdevice*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->startpage(i->out,width,height); -} - -void ops_startclip(struct _gfxdevice*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->startclip(i->out,line); -} - -void ops_endclip(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->endclip(i->out); -} - -void ops_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - gfxcolor_t color2 = transform_color(i, color); - i->out->stroke(i->out, line, width, &color2, cap_style, joint_style, miterLimit); -} - -void ops_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - gfxcolor_t color2 = transform_color(i, color); - i->out->fill(i->out, line, &color2); -} - -void ops_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - gfximage_t img2; - img2.width = img->width; - img2.height = img->height; - img2.data = (gfxcolor_t*)malloc(img->width*img->height*4); - int x,y; - for(y=0;yheight;y++) { - gfxcolor_t*in = &img->data[y*img->width]; - gfxcolor_t*out = &img2.data[y*img->width]; - for(x=0;xwidth;x++) { - out[x] = transform_color(i, &in[x]); - } - } - i->out->fillbitmap(i->out, line, &img2, matrix, cxform); - free(img2.data); -} - -void ops_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->fillgradient(i->out, line, gradient, type, matrix); -} - -void ops_addfont(struct _gfxdevice*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->addfont(i->out, font); -} - -void ops_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - gfxcolor_t color2 = transform_color(i, color); - i->out->drawchar(i->out, font, glyphnr, color, matrix); -} - -void ops_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->drawlink(i->out, line, action, text); -} - -void ops_endpage(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->endpage(i->out); -} - -gfxresult_t* ops_finish(struct _gfxdevice*dev) -{ - if(dev->internal) - free(dev->internal); - dev->internal = 0; - return 0; -} - -void gfxdevice_ops_init(gfxdevice_t*dev, gfxdevice_t*out, U8 alpha) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "ops"; - - dev->internal = i; - - dev->setparameter = ops_setparameter; - dev->startpage = ops_startpage; - dev->startclip = ops_startclip; - dev->endclip = ops_endclip; - dev->stroke = ops_stroke; - dev->fill = ops_fill; - dev->fillbitmap = ops_fillbitmap; - dev->fillgradient = ops_fillgradient; - dev->addfont = ops_addfont; - dev->drawchar = ops_drawchar; - dev->drawlink = ops_drawlink; - dev->endpage = ops_endpage; - dev->finish = ops_finish; - - i->out = out; - i->alpha = alpha; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.h deleted file mode 100644 index 1739a4b53..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/ops.h +++ /dev/null @@ -1,38 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_ops_h__ -#define __gfxdevice_ops_h__ - -#include "../gfxdevice.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_ops_init(gfxdevice_t*self, gfxdevice_t*dest, unsigned char alpha); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_ops_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.c deleted file mode 100644 index 2e8d4ae43..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.c +++ /dev/null @@ -1,597 +0,0 @@ -/* pdf.c - - Part of the swftools package. - - Copyright (c) 2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "../os.h" -#include "../q.h" -#include "../log.h" -#include "../jpeg.h" -#include "../types.h" -#include "../mem.h" -#include "../log.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../gfximage.h" -#include "../gfxfont.h" - -typedef struct _internal { - PDF* p; - - char config_addblankpages; - double config_xpad; - double config_ypad; - int config_maxdpi; - int config_mindpi; - - int width,height; - int num_pages; - - char*tempfile; - char*page_opts; - double lastx,lasty; - gfxfontlist_t*fontlist; - - char has_matrix; - double m00, m01, m10, m11; -} internal_t; - -static void restore_matrix(internal_t*i) -{ - if(i->has_matrix) { - PDF_restore(i->p); - i->has_matrix=0; - i->m00 = 0; - i->m01 = 0; - i->m10 = 0; - i->m11 = 0; - } -} -static void set_matrix(internal_t*i, double m00, double m01, double m10, double m11) -{ - restore_matrix(i); - - i->m00 = m00; - i->m01 = m01; - i->m10 = m10; - i->m11 = m11; - - PDF_save(i->p); - PDF_setmatrix(i->p, m00, -m01, m10, -m11, 0, i->height+2*i->config_ypad); - i->has_matrix = 1; -} -static void reset_matrix(internal_t*i) -{ - set_matrix(i, 1.0, 0.0, 0.0, 1.0); -} -static void transform_back(internal_t*i, double x, double y, double *ox, double *oy) -{ - double det = i->m00*i->m11 - i->m10*i->m01; - if(!det) { - msg(" Codependent text matrix"); - *ox=*oy=0; - return; - } - *ox = (x*i->m11 - i->m10*y)/det; - *oy = (i->m00*y - x*i->m01)/det; -} - -void pdf_startpage(gfxdevice_t*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - - if(!i->tempfile) { - i->tempfile = strdup(mktempname(0, "pdf")); - - PDF_begin_document(i->p, i->tempfile, 0, ""); - //PDF_set_value(i->p, "compress", 0); - PDF_set_parameter(i->p, "usercoordinates", "true"); - PDF_set_parameter(i->p, "topdown", "true"); - } - - int width_plus_pad = width+floor(i->config_xpad*2); - int height_plus_pad = height+floor(i->config_ypad*2); - PDF_begin_page_ext(i->p, width_plus_pad, height_plus_pad, i->page_opts); - PDF_set_value(i->p, "CropBox/llx", 0); - PDF_set_value(i->p, "CropBox/lly", 0); - PDF_set_value(i->p, "CropBox/urx", width_plus_pad); - PDF_set_value(i->p, "CropBox/ury", height_plus_pad); - if(i->config_xpad || i->config_ypad) { - PDF_set_value(i->p, "TrimBox/llx", i->config_xpad); - PDF_set_value(i->p, "TrimBox/lly", i->config_ypad); - PDF_set_value(i->p, "TrimBox/urx", i->config_xpad+width); - PDF_set_value(i->p, "TrimBox/ury", i->config_ypad+height); - } - - PDF_set_parameter(i->p, "fillrule", "evenodd"); - i->width = width; - i->height = height; - i->num_pages++; - - reset_matrix(i); -} - -int pdf_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - if(!strcmp(key, "addblankpages")) { - i->config_addblankpages = atoi(value); - } else if(!strcmp(key, "maxdpi")) { - i->config_maxdpi = atoi(value); - } else if(!strcmp(key, "mindpi")) { - i->config_mindpi = atoi(value); - } else if(!strcmp(key, "xpad")) { - i->config_xpad = atof(value); - } else if(!strcmp(key, "ypad")) { - i->config_ypad = atof(value); - } - return 0; -} - - -static int mkline(gfxline_t*line, PDF*p, double mx, double my, double scale, char fill) -{ - double x=0,y=0; - char first = 1; - int ret = 0; - gfxline_t*free_line = 0; - if(fill) { - line = gfxline_restitch(gfxline_clone(line)); - free_line = line; - } - while(line) { - if(line->type == gfx_moveTo && (x!=line->x || y!=line->y || first)) { - first = 0; - PDF_moveto(p, line->x*scale+mx, line->y*scale+my); - } else if(line->type == gfx_lineTo) { - PDF_lineto(p, line->x*scale+mx, line->y*scale+my); - ret = 1; - } else { - /* when converting a quadratic bezier to a cubic bezier, the - two new control points are both 2/3 the way from the - endpoints to the old control point */ - double c1x = (x + line->sx*2)/3; - double c1y = (y + line->sy*2)/3; - double c2x = (line->x + line->sx*2)/3; - double c2y = (line->y + line->sy*2)/3; - PDF_curveto(p, c1x*scale+mx, c1y*scale+my, - c2x*scale+mx, c2y*scale+my, - line->x*scale+mx, line->y*scale+my); - ret = 1; - } - x = line->x; - y = line->y; - line = line->next; - } - if(free_line) - gfxline_free(free_line); - return ret; -} - -void pdf_startclip(gfxdevice_t*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - - restore_matrix(i); - PDF_save(i->p); - - if(mkline(line, i->p, i->config_xpad, i->config_ypad, 1.0, 1)) - PDF_clip(i->p); - else - ; // TODO: strictly speaking, an empty clip clears everything - - reset_matrix(i); -} -void pdf_endclip(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - restore_matrix(i); - PDF_restore(i->p); -} -void pdf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - if(width<1e-6) - return; - reset_matrix(i); - PDF_setlinewidth(i->p, width); - PDF_setlinecap(i->p, cap_style==gfx_capButt?0:(cap_style==gfx_capRound?1:2)); - PDF_setlinejoin(i->p, joint_style==gfx_joinMiter?0:(joint_style==gfx_joinRound?1:2)); - - PDF_setrgbcolor_stroke(i->p, color->r/255.0, color->g/255.0, color->b/255.0); - - if(joint_style==gfx_joinMiter) - PDF_setmiterlimit(i->p, miterLimit); - if(mkline(line, i->p, i->config_xpad, i->config_ypad, 1.0, 0)) - PDF_stroke(i->p); -} - -void pdf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - reset_matrix(i); - PDF_setrgbcolor_fill(i->p, color->r/255.0, color->g/255.0, color->b/255.0); - /* - pdf-x (pdf 1.3) doesn't support opacityfill - if(color->a!=255) { - char opacityfill[80]; - sprintf(opacityfill, "opacityfill %f", color->a/256.0); - int gstate = PDF_create_gstate(i->p, opacityfill); - PDF_set_gstate(i->p, gstate); - }*/ - - if(mkline(line, i->p, i->config_xpad, i->config_ypad, 1.0, 1)) { - PDF_fill(i->p); - } -} - -void pdf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - - int t,size=img->width*img->height; - int has_alpha=0; - for(t=0;tdata[t].a!=255) { - has_alpha=1; - break; - } - } - - double w = sqrt(matrix->m00*matrix->m00+matrix->m01*matrix->m01); - double h = sqrt(matrix->m10*matrix->m10+matrix->m11*matrix->m11); - double l1 = w*img->width; - double l2 = h*img->height; - - double dpi_x = 72.0 / w; - double dpi_y = 72.0 / h; - double dpi = dpi_x>dpi_y?dpi_x:dpi_y; - gfximage_t*rescaled_image = 0; - if(i->config_maxdpi && dpi > i->config_maxdpi) { - int newwidth = img->width*i->config_maxdpi/dpi; - int newheight = img->height*i->config_maxdpi/dpi; - rescaled_image = gfximage_rescale(img, newwidth, newheight); - msg(" Downscaling %dx%d image (dpi %f, %.0fx%.0f on page) to %dx%d (dpi %d)", - img->width, img->height, dpi, l1, l2, newwidth, newheight, i->config_maxdpi); - img = rescaled_image; - } - if(i->config_mindpi && dpi < i->config_mindpi && img->width>1 && img->height>1) { - msg(" Found image of size %dx%d with dpi %f, minimum allowed dpi is %d", - img->width, img->height, dpi, i->config_mindpi); - exit(1); - } - - char tempfile[128]; - mktempname(tempfile, "jpg"); - - gfximage_save_jpeg(img, tempfile, 96); - - int imgid=-1; - if(has_alpha) { - char tempfile2[128]; - mktempname(tempfile2, "jpg"); - int t; - int size = img->width*img->height; - unsigned char*alpha = malloc(size); - for(t=0;tdata[t].a; - } - jpeg_save_gray(alpha, img->width, img->height, 97, tempfile2); - free(alpha); - int maskid = PDF_load_image(i->p, "jpeg", tempfile2, 0, "mask"); - unlink(tempfile2); - char masked[80]; - if(maskid<0) { - msg(" Couldn't process mask jpeg of size %dx%d: error code %d", img->width, img->height, maskid); - return; - } - sprintf(masked, "masked %d", maskid); - imgid = PDF_load_image(i->p, "jpeg", tempfile, 0, masked); - } else { - imgid = PDF_load_image(i->p, "jpeg", tempfile, 0, ""); - } - - if(imgid<0) { - msg(" Couldn't process jpeg of size %dx%d: error code %d, file %s", img->width, img->height, imgid, tempfile); - return; - } - unlink(tempfile); - - char options[80]; - set_matrix(i, matrix->m00, matrix->m01, matrix->m10, matrix->m11); - /* an image's (0,0) is at the lower left corner */ - double x=matrix->tx + i->config_xpad + matrix->m10*img->height; - double y=matrix->ty + i->config_ypad + matrix->m11*img->height; - double tx,ty; - transform_back(i, x, y, &tx, &ty); - PDF_place_image(i->p, imgid, tx, ty, 1.0); - PDF_close_image(i->p, imgid); - - if(rescaled_image) - gfximage_free(rescaled_image); -} - -void pdf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; -} - -static const char type3 = 0; -static const char ttf = 1; - -void pdf_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; - - int num = font->num_glyphs<256-32?font->num_glyphs:256-32; - if(type3) { - int fontid = 0; - if(!gfxfontlist_hasfont(i->fontlist, font)) { - - static int fontnr = 1; - char fontname[32]; - sprintf(fontname, "font%d", fontnr++); - int l = strlen(fontname); - char fontname2[64]; - int t; - for(t=0;tp, fontname2, l*2, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, ""); - for(t=0;tglyphs[t]; - gfxbbox_t bbox = gfxline_getbbox(g->line); - char name[32]; - sprintf(name, "chr%d", t+32); - PDF_encoding_set_char(i->p, fontname, t+32, name, 0); - PDF_begin_glyph(i->p, name, g->advance, bbox.xmin/64.0, bbox.ymin/64.0, bbox.xmax/64.0, bbox.ymax/64.0); - if(mkline(g->line, i->p, 0, 0, 1.0/64.0, 1)) - PDF_fill(i->p); - PDF_end_glyph(i->p); - } - PDF_end_font(i->p); - fontid = PDF_load_font(i->p, fontname2, l*2, fontname, ""); - - i->fontlist = gfxfontlist_addfont2(i->fontlist, font, (void*)(ptroff_t)fontid); - } - } else if(ttf) { - int fontid = 0; - if(!gfxfontlist_hasfont(i->fontlist, font)) { - char fontname[32],filename[32],fontname2[64]; - static int fontnr = 1; - sprintf(fontname, "font%d", fontnr); - sprintf(filename, "font%d.ttf", fontnr); - fontnr++; - const char*old_id = font->id; - font->id = fontname; - int t; - for(t=0;tglyphs[t].unicode = 32+t; - } - font->max_unicode = 0; - font->unicode2glyph = 0; - gfxfont_save(font, filename); - font->id=old_id; - -#ifdef RUN_TTX - /* for testing the generated fonts: run everything through ttx (fonttools) */ - char cmd[256]; - sprintf(cmd, "mv %s.ttf test.ttf", fontname);system(cmd); - system("rm -f test.ttx"); - if(system("ttx test.ttf")&0xff00) exit(1); - sprintf(cmd, "mv test.ttf %s.old.ttf", fontname, fontname);system(cmd); - sprintf(cmd, "ttx test.ttx;mv test.ttf %s.ttf", fontname);system(cmd); - sprintf(cmd, "rm -f test.ttx");system(cmd); -#endif - - int l = strlen(fontname); - for(t=0;tp, fontname2, l*2, "host", "embedding=true"); - i->fontlist = gfxfontlist_addfont2(i->fontlist, font, (void*)(ptroff_t)fontid); - unlink(filename); - } - } -} - -void pdf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - - if(!font) - return; - - gfxglyph_t*glyph = &font->glyphs[glyphnr]; - char as_shape = 0; - if(!type3 && !ttf) {msg(" No type3 enabled. Drawing char %d as shape", glyphnr);as_shape=1;} - if(glyphnr>256-32) {msg(" Drawing char %d as shape (not < 224)", glyphnr);as_shape=1;} - - if(as_shape) { - reset_matrix(i); - PDF_setrgbcolor_fill(i->p, color->r/255.0, color->g/255.0, color->b/255.0); - gfxline_t*line2 = gfxline_clone(glyph->line); - gfxline_transform(line2, matrix); - if(mkline(line2, i->p, i->config_xpad, i->config_ypad, 1.0, 1)) { - PDF_fill(i->p); - } - gfxline_free(line2); - } else { - assert(gfxfontlist_hasfont(i->fontlist, font)); - int fontid = (int)(ptroff_t)gfxfontlist_getuserdata(i->fontlist, font->id); - - gfxmatrix_t m = *matrix; - - m.m00*=64; - m.m01*=64; - m.m10*=64; - m.m11*=64; - if(ttf) { - m.m10 = -m.m10; - m.m11 = -m.m11; - } - - if(!(fabs(m.m00 - i->m00) < 1e-6 && - fabs(m.m01 - i->m01) < 1e-6 && - fabs(m.m10 - i->m10) < 1e-6 && - fabs(m.m11 - i->m11) < 1e-6)) { - set_matrix(i, m.m00, m.m01, m.m10, m.m11); - } - double tx, ty; - transform_back(i, m.tx+i->config_xpad, m.ty+i->config_ypad, &tx, &ty); - - PDF_setfont(i->p, fontid, ttf?16.0:1.0); - PDF_setrgbcolor_fill(i->p, color->r/255.0, color->g/255.0, color->b/255.0); - - char name[32]; - sprintf(name, "%c", glyphnr+32); - - if(fabs(tx - i->lastx) > 0.001 || ty != i->lasty) { - PDF_show_xy2(i->p, name, strlen(name), tx, ty); - } else { - PDF_show2(i->p, name, strlen(name)); - } - - i->lastx = tx + glyph->advance; - i->lasty = ty; - } -} - -void pdf_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) -{ - internal_t*i = (internal_t*)dev->internal; -} - -void pdf_endpage(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - restore_matrix(i); - PDF_end_page(i->p); -} - -typedef struct pdfresult_internal { - char*tempfile; -} pdfresult_internal_t; - -void pdfresult_destroy(gfxresult_t*gfx) -{ - pdfresult_internal_t*i = (pdfresult_internal_t*)gfx->internal; - unlink(i->tempfile); - free(i->tempfile); - free(gfx->internal);gfx->internal = 0; - free(gfx); -} - -int pdfresult_save(gfxresult_t*gfx, const char*filename) -{ - pdfresult_internal_t*i = (pdfresult_internal_t*)gfx->internal; - FILE*fi = fopen(i->tempfile, "rb"); - FILE*fo = fopen(filename, "wb"); - if(!fo) { - perror(filename); - return -1; - } - char buffer[4096]; - int size = 0; - while((size = fread(buffer, 1, 4096, fi))) { - fwrite(buffer, 1, size, fo); - } - fclose(fi); - fclose(fo); - return 0; -} - -void* pdfresult_get(gfxresult_t*gfx, const char*name) -{ - return 0; -} - -gfxresult_t* pdf_finish(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - - if(i->config_addblankpages) { - int mod = i->num_pages%i->config_addblankpages; - if(mod) { - int count = i->config_addblankpages - mod; - int t; - for(t=0;tstartpage(dev, i->width, i->height); - dev->endpage(dev); - } - } - } - - PDF_end_document(i->p, ""); - //PDF_close(i->p); - PDF_delete(i->p); - - gfxresult_t*result = (gfxresult_t*)malloc(sizeof(gfxresult_t)); - memset(result, 0, sizeof(gfxresult_t)); - result->save = pdfresult_save; - result->get = pdfresult_get; - result->destroy = pdfresult_destroy; - result->internal = 0; - result->internal = malloc(sizeof(pdfresult_internal_t)); - pdfresult_internal_t*ri = (pdfresult_internal_t*)result->internal; - ri->tempfile = i->tempfile;i->tempfile=0; - free(dev->internal);dev->internal = 0;i=0; - return result; -} - -void gfxdevice_pdf_init(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "pdf"; - - dev->internal = i; - - dev->setparameter = pdf_setparameter; - dev->startpage = pdf_startpage; - dev->startclip = pdf_startclip; - dev->endclip = pdf_endclip; - dev->stroke = pdf_stroke; - dev->fill = pdf_fill; - dev->fillbitmap = pdf_fillbitmap; - dev->fillgradient = pdf_fillgradient; - dev->addfont = pdf_addfont; - dev->drawchar = pdf_drawchar; - dev->drawlink = pdf_drawlink; - dev->endpage = pdf_endpage; - dev->finish = pdf_finish; - - i->page_opts = ""; - i->lastx = -1e38; - i->lasty = -1e38; - i->has_matrix = 0; - i->p = PDF_new(); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.h deleted file mode 100644 index e64ca7e94..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/pdf.h +++ /dev/null @@ -1,37 +0,0 @@ -/* pdf.h - Header file for pdf.c - - Part of the swftools package. - - Copyright (c) 2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_pdf_h__ -#define __gfxdevice_pdf_h__ - -#include "../gfxdevice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_pdf_init(gfxdevice_t*dev); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_pdf_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.c deleted file mode 100644 index 275dc7b0a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.c +++ /dev/null @@ -1,443 +0,0 @@ -/* polyops.c - - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#ifndef WIN32 -#include -#endif -#include -#include -#include -#include -#include "../mem.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../gfxpoly.h" -#include "../log.h" -#include "polyops.h" - -typedef struct _clip { - gfxpoly_t*poly; - int openclips; - struct _clip*next; -} clip_t; - -typedef struct _internal { - gfxdevice_t*out; - clip_t*clip; - gfxpoly_t*polyunion; - - int good_polygons; - int bad_polygons; -} internal_t; - -static int verbose = 0; - -static void dbg(char*format, ...) -{ - if(!verbose) - return; - char buf[1024]; - int l; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - printf("(device-polyops) %s\n", buf); - fflush(stdout); -} - -int polyops_setparameter(struct _gfxdevice*dev, const char*key, const char*value) -{ - dbg("polyops_setparameter"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) return i->out->setparameter(i->out,key,value); - else return 0; -} - -void polyops_startpage(struct _gfxdevice*dev, int width, int height) -{ - dbg("polyops_startpage"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) i->out->startpage(i->out,width,height); -} - -void polyops_startclip(struct _gfxdevice*dev, gfxline_t*line) -{ - dbg("polyops_startclip"); - internal_t*i = (internal_t*)dev->internal; - - gfxpoly_t* oldclip = i->clip?i->clip->poly:0; - gfxpoly_t* poly = gfxpoly_from_fill(line, DEFAULT_GRID); - if(poly) - i->good_polygons++; - else - i->bad_polygons++; - - gfxpoly_t* currentclip = 0; - int type = 0; - - /* we can't rely on gfxpoly actually being able to convert - a gfxline into a gfxpoly- for polygons which are too - complex or just degenerate, this might fail. So handle - all the cases where polygon conversion or intersection - might go awry - UPDATE: this is not needed anymore. The new gfxpoly - implementation is stable enough so it always returns - a valid result. Still, it's good practice. - */ - if(!poly && !oldclip) { - i->out->startclip(i->out,line); - currentclip = 0; - type = 1; - } else if(!poly && oldclip) { - gfxline_t*oldclipline = gfxline_from_gfxpoly(oldclip); - i->out->startclip(i->out,oldclipline); - i->out->startclip(i->out,line); - currentclip = 0; - type = 2; - } else if(poly && oldclip) { - gfxpoly_t*intersection = gfxpoly_intersect(poly, oldclip); - if(intersection) { - i->good_polygons++; - // this case is what usually happens - gfxpoly_destroy(poly);poly=0; - currentclip = intersection; - type = 0; - } else { - i->bad_polygons++; - gfxline_t*oldclipline = gfxline_from_gfxpoly(oldclip); - i->out->startclip(i->out, oldclipline); - currentclip = poly; - type = 1; - } - } else if(poly && !oldclip) { - currentclip = poly; - type = 0; - } - - clip_t*n = i->clip; - i->clip = (clip_t*)rfx_calloc(sizeof(clip_t)); - i->clip->next = n; - i->clip->poly = currentclip; - i->clip->openclips = type; -} - -void polyops_endclip(struct _gfxdevice*dev) -{ - dbg("polyops_endclip"); - internal_t*i = (internal_t*)dev->internal; - - if(!i->clip) { - msg(" endclip without startclip (in: polyops)\n"); - return; - } - - clip_t*old = i->clip; - i->clip = i->clip->next; - if(old->poly) { - gfxpoly_destroy(old->poly);old->poly = 0; - } - int t; - for(t=0;topenclips;t++) - i->out->endclip(i->out); - - old->next = 0;free(old); -} - -static void addtounion(struct _gfxdevice*dev, gfxpoly_t*poly) -{ - internal_t*i = (internal_t*)dev->internal; - if(poly && i->polyunion) { - gfxpoly_t*old = i->polyunion; - gfxpoly_t*newpoly = gfxpoly_union(poly,i->polyunion); - i->polyunion = newpoly; - gfxpoly_destroy(old); - } -} - -static gfxline_t* handle_poly(gfxdevice_t*dev, gfxpoly_t*poly, char*ok) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->clip && i->clip->poly) { - gfxpoly_t*old = poly; - if(poly) { - poly = gfxpoly_intersect(poly, i->clip->poly); - gfxpoly_destroy(old); - } - } - - if(poly) - i->good_polygons++; - else - i->bad_polygons++; - - addtounion(dev, poly); - gfxline_t*gfxline = 0; - if(poly) { - // this is the case where everything went right - gfxline_t*line = gfxline_from_gfxpoly(poly); - gfxpoly_destroy(poly); - *ok = 1; - return line; - } else { - if(i->clip && i->clip->poly) { - /* convert current clipping from a polygon to an - actual "startclip" written to the output */ - assert(i->clip->openclips <= 1); - gfxline_t*clipline = gfxline_from_gfxpoly(i->clip->poly); - i->out->startclip(i->out, clipline); - gfxline_free(clipline); - gfxpoly_destroy(i->clip->poly);i->clip->poly = 0; - i->clip->openclips++; - return 0; - } else { - return 0; - } - } -} - -void polyops_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - dbg("polyops_stroke"); - internal_t*i = (internal_t*)dev->internal; - - gfxpoly_t* poly = gfxpoly_from_stroke(line, width, cap_style, joint_style, miterLimit, DEFAULT_GRID); - char ok = 0; - gfxline_t*line2 = handle_poly(dev, poly, &ok); - - if(ok) { - if(i->out && line2) i->out->fill(i->out, line2, color); - gfxline_free(line2); - } else { - msg(" .."); - if(i->out) i->out->stroke(i->out, line, width, color, cap_style, joint_style, miterLimit); - } -} - -void polyops_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) -{ - dbg("polyops_fill"); - internal_t*i = (internal_t*)dev->internal; - - gfxpoly_t*poly = gfxpoly_from_fill(line, DEFAULT_GRID); - char ok = 0; - gfxline_t*line2 = handle_poly(dev, poly, &ok); - - if(ok) { - if(i->out && line2) i->out->fill(i->out, line2, color); - gfxline_free(line2); - } else { - if(i->out) i->out->fill(i->out, line, color); - } -} - -void polyops_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - dbg("polyops_fillbitmap"); - internal_t*i = (internal_t*)dev->internal; - - gfxpoly_t*poly = gfxpoly_from_fill(line, DEFAULT_GRID); - char ok = 0; - gfxline_t*line2 = handle_poly(dev, poly, &ok); - - if(ok) { - if(i->out && line2) i->out->fillbitmap(i->out, line2, img, matrix, cxform); - gfxline_free(line2); - } else { - if(i->out) i->out->fillbitmap(i->out, line, img, matrix, cxform); - } -} - -void polyops_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - dbg("polyops_fillgradient"); - internal_t*i = (internal_t*)dev->internal; - - gfxpoly_t*poly = gfxpoly_from_fill(line, DEFAULT_GRID); - char ok = 0; - gfxline_t*line2 = handle_poly(dev, poly, &ok); - - if(ok) { - if(i->out && line2) i->out->fillgradient(i->out, line2, gradient, type, matrix); - gfxline_free(line2); - } else { - if(i->out) i->out->fillgradient(i->out, line, gradient, type, matrix); - } -} - -void polyops_addfont(struct _gfxdevice*dev, gfxfont_t*font) -{ - dbg("polyops_addfont"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) i->out->addfont(i->out, font); -} - -void polyops_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - dbg("polyops_drawchar"); - if(!font) - return; - internal_t*i = (internal_t*)dev->internal; - gfxline_t*glyph = gfxline_clone(font->glyphs[glyphnr].line); - gfxline_transform(glyph, matrix); - - if(i->clip && i->clip->poly) { - gfxbbox_t bbox = gfxline_getbbox(glyph); - gfxpoly_t*dummybox = gfxpoly_createbox(bbox.xmin,bbox.ymin,bbox.xmax,bbox.ymax, DEFAULT_GRID); - gfxline_t*dummybox2 = gfxline_from_gfxpoly(dummybox); - bbox = gfxline_getbbox(dummybox2); - gfxline_free(dummybox2); - - char ok=0; - gfxline_t*gfxline = handle_poly(dev, dummybox, &ok); - if(ok) { - gfxbbox_t bbox2 = gfxline_getbbox(gfxline); - double w = bbox2.xmax - bbox2.xmin; - double h = bbox2.ymax - bbox2.ymin; - if(fabs((bbox.xmax - bbox.xmin) - w) > DEFAULT_GRID*2 || - fabs((bbox.ymax - bbox.ymin) - h) > DEFAULT_GRID*2) { - /* notable change in character size: character was clipped - TODO: how to deal with diagonal cuts? - */ - msg(" Character %d was clipped: (%f,%f,%f,%f) -> (%f,%f,%f,%f)", - glyphnr, - bbox.xmin,bbox.ymin,bbox.xmax,bbox.ymax, - bbox2.xmin,bbox2.ymin,bbox2.xmax,bbox2.ymax); - polyops_fill(dev, glyph, color); - } else { - if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix); - } - } else { - if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix); - } - gfxline_free(gfxline); - } else { - if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix); - } - - gfxline_free(glyph); -} - -void polyops_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) -{ - dbg("polyops_drawlink"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) i->out->drawlink(i->out, line, action, text); -} - -void polyops_endpage(struct _gfxdevice*dev) -{ - dbg("polyops_endpage"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) i->out->endpage(i->out); -} - -gfxresult_t* polyops_finish(struct _gfxdevice*dev) -{ - dbg("polyops_finish"); - internal_t*i = (internal_t*)dev->internal; - - if(i->polyunion) { - gfxpoly_destroy(i->polyunion);i->polyunion=0; - } else { - if(i->bad_polygons) { - msg(" --flatten success rate: %.1f%% (%d failed polygons)", i->good_polygons*100.0 / (i->good_polygons + i->bad_polygons), i->bad_polygons); - } - } - gfxdevice_t*out = i->out; - free(i);memset(dev, 0, sizeof(gfxdevice_t)); - if(out) { - return out->finish(out); - } else { - return 0; - } -} - -gfxline_t*gfxdevice_union_getunion(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - return gfxline_from_gfxpoly(i->polyunion); -} - -void gfxdevice_removeclippings_init(gfxdevice_t*dev, gfxdevice_t*out) -{ - dbg("gfxdevice_removeclippings_init"); - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "removeclippings"; - - dev->internal = i; - - dev->setparameter = polyops_setparameter; - dev->startpage = polyops_startpage; - dev->startclip = polyops_startclip; - dev->endclip = polyops_endclip; - dev->stroke = polyops_stroke; - dev->fill = polyops_fill; - dev->fillbitmap = polyops_fillbitmap; - dev->fillgradient = polyops_fillgradient; - dev->addfont = polyops_addfont; - dev->drawchar = polyops_drawchar; - dev->drawlink = polyops_drawlink; - dev->endpage = polyops_endpage; - dev->finish = polyops_finish; - - i->out = out; - i->polyunion = 0; -} - -void gfxdevice_union_init(gfxdevice_t*dev,gfxdevice_t*out) -{ - dbg("gfxdevice_getunion_init"); - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "union"; - - dev->internal = i; - - dev->setparameter = polyops_setparameter; - dev->startpage = polyops_startpage; - dev->startclip = polyops_startclip; - dev->endclip = polyops_endclip; - dev->stroke = polyops_stroke; - dev->fill = polyops_fill; - dev->fillbitmap = polyops_fillbitmap; - dev->fillgradient = polyops_fillgradient; - dev->addfont = polyops_addfont; - dev->drawchar = polyops_drawchar; - dev->drawlink = polyops_drawlink; - dev->endpage = polyops_endpage; - dev->finish = polyops_finish; - - i->out = out; - /* create empty polygon */ - i->polyunion = gfxpoly_from_stroke(0, 0, gfx_capButt, gfx_joinMiter, 0, DEFAULT_GRID); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.h deleted file mode 100644 index fa1379e2d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/polyops.h +++ /dev/null @@ -1,40 +0,0 @@ -/* gfxdevice_polyops.h - Header file for gfxdevice_polyops.c - - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_polyops_h__ -#define __gfxdevice_polyops_h__ - -#include "../gfxdevice.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_removeclippings_init(gfxdevice_t*self, gfxdevice_t*dest); -void gfxdevice_union_init(gfxdevice_t*self, gfxdevice_t*dest); -gfxline_t*gfxdevice_union_getunion(struct _gfxdevice*dev); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_polyops_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/record.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/record.c deleted file mode 100644 index f58f7e997..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/record.c +++ /dev/null @@ -1,1016 +0,0 @@ -/* gfxdevice_record.cc - - Part of the swftools package. - - Copyright (c) 2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../../config.h" -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#ifdef HAVE_IO_H -#include -#endif -#include -#include -#include -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../gfxfont.h" -#include "../types.h" -#include "../bitio.h" -#include "../log.h" -#include "../os.h" -#include "../png.h" -#ifdef HAVE_FASTLZ -#include "../fastlz.h" -#endif -#include "record.h" - -//#define STATS -//#define COMPRESS_IMAGES -//#define FILTER_IMAGES - -typedef struct _state { - char*last_string[16]; - gfxcolor_t last_color[16]; - gfxmatrix_t last_matrix[16]; - -#ifdef STATS - int size_matrices; - int size_positions; - int size_images; - int size_lines; - int size_colors; - int size_fonts; - int size_chars; -#endif -} state_t; - -typedef struct _internal { - gfxfontlist_t* fontlist; - state_t state; - - writer_t w; - int cliplevel; - char use_tempfile; - char*filename; -} internal_t; - -typedef struct _internal_result { - char use_tempfile; - char*filename; - void*data; - int length; -} internal_result_t; - -#define OP_END 0x00 -#define OP_SETPARAM 0x01 -#define OP_STROKE 0x02 -#define OP_STARTCLIP 0x03 -#define OP_ENDCLIP 0x04 -#define OP_FILL 0x05 -#define OP_FILLBITMAP 0x06 -#define OP_FILLGRADIENT 0x07 -#define OP_ADDFONT 0x08 -#define OP_DRAWCHAR 0x09 -#define OP_DRAWLINK 0x0a -#define OP_STARTPAGE 0x0b -#define OP_ENDPAGE 0x0c -#define OP_FINISH 0x0d - -#define FLAG_SAME_AS_LAST 0x10 -#define FLAG_ZERO_FONT 0x20 - -#define LINE_MOVETO 0x0e -#define LINE_LINETO 0x0f -#define LINE_SPLINETO 0x10 - -/* ----------------- reading/writing of low level primitives -------------- */ - -static void dumpLine(writer_t*w, state_t*state, gfxline_t*line) -{ - while(line) { - if(line->type == gfx_moveTo) { - writer_writeU8(w, LINE_MOVETO); - writer_writeDouble(w, line->x); - writer_writeDouble(w, line->y); -#ifdef STATS - state->size_lines += 1+8+8; -#endif - } else if(line->type == gfx_lineTo) { - writer_writeU8(w, LINE_LINETO); - writer_writeDouble(w, line->x); - writer_writeDouble(w, line->y); -#ifdef STATS - state->size_lines += 1+8+8; -#endif - } else if(line->type == gfx_splineTo) { - writer_writeU8(w, LINE_SPLINETO); - writer_writeDouble(w, line->x); - writer_writeDouble(w, line->y); - writer_writeDouble(w, line->sx); - writer_writeDouble(w, line->sy); -#ifdef STATS - state->size_lines += 1+8+8+8+8; -#endif - } - line = line->next; - } - writer_writeU8(w, OP_END); -#ifdef STATS - state->size_lines += 1; -#endif -} -static gfxline_t* readLine(reader_t*r, state_t*s) -{ - gfxline_t*start = 0, *pos = 0; - while(1) { - unsigned char op = reader_readU8(r); - if(op == OP_END) - break; - gfxline_t*line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); - if(!start) { - start = pos = line; - } else { - pos->next = line; - pos = line; - } - if(op == LINE_MOVETO) { - line->type = gfx_moveTo; - line->x = reader_readDouble(r); - line->y = reader_readDouble(r); - } else if(op == LINE_LINETO) { - line->type = gfx_lineTo; - line->x = reader_readDouble(r); - line->y = reader_readDouble(r); - } else if(op == LINE_SPLINETO) { - line->type = gfx_splineTo; - line->x = reader_readDouble(r); - line->y = reader_readDouble(r); - line->sx = reader_readDouble(r); - line->sy = reader_readDouble(r); - } - } - return start; -} - -static void dumpImage(writer_t*w, state_t*state, gfximage_t*img) -{ - int oldpos = w->pos; - writer_writeU16(w, img->width); - writer_writeU16(w, img->height); -#ifdef COMPRESS_IMAGES - //35.3% images (2027305 bytes) (with filter, Z_BEST_COMPRESSION) - //39.9% images (2458904 bytes) (with filter, Z_BEST_SPEED) - //45.2% images (3055340 bytes) (without filter) - //45.9% images (3149247 bytes) (without filter, 5) - //48.0% images (3480495 bytes) (with filter, fastlz) - //48.0% images (3488650 bytes) (without filter, Z_BEST_SPEED) - //55.3% images (4665889 bytes) (without filter, fastlz level 2) - //55.6% images (4726334 bytes) (without filter, fastlz level 1) - //83.0% images (18091804 bytes) (no compression) - - gfxcolor_t*image; -#ifdef FILTER_IMAGES - unsigned char*filter = malloc(img->height); - int y; - image = malloc(img->width*img->height*sizeof(gfxcolor_t)); - for(y=0;yheight;y++) { - filter[y] = png_apply_filter_32( - (void*)&image[y*img->width], - (void*)&img->data[y*img->width], img->width, y); - } -#else - image = img->data; -#endif - int size = img->width*img->height; - uLongf compressdata_size = compressBound(size*sizeof(gfxcolor_t)); - void*compressdata = malloc(compressdata_size); - -#ifdef HAVE_FASTLZ - compressdata_size = fastlz_compress_level(2, (void*)image, size*sizeof(gfxcolor_t), compressdata); -#else - compress2(compressdata, &compressdata_size, (void*)image, sizeof(gfxcolor_t)*size, Z_BEST_SPEED); -#endif - - writer_writeU32(w, compressdata_size); -#ifdef FILTER_IMAGES - w->write(w, filter, img->height); - free(filter); - free(image); -#endif - w->write(w, compressdata, compressdata_size); - free(compressdata); -#else - w->write(w, img->data, img->width*img->height*sizeof(gfxcolor_t)); -#endif -#ifdef STATS - state->size_images += w->pos - oldpos; -#endif -} -static gfximage_t readImage(reader_t*r, state_t*state) -{ - gfximage_t img; - img.width = reader_readU16(r); - img.height = reader_readU16(r); - uLongf size = img.width*img.height*sizeof(gfxcolor_t); - img.data = malloc(size); -#ifdef COMPRESS_IMAGES - uLongf compressdata_size = reader_readU32(r); - void*compressdata = malloc(compressdata_size); -# ifdef FILTER_IMAGES - unsigned char*filter = malloc(img.height); - r->read(r, filter, img.height); -# endif - r->read(r, compressdata, compressdata_size); - -# ifdef HAVE_FASTLZ - fastlz_decompress(compressdata, compressdata_size, (void*)img.data, size); -# else - uncompress((void*)img.data, &size, compressdata, compressdata_size); -# endif - free(compressdata); - -# ifdef FILTER_IMAGES - int y; - unsigned char*line = malloc(img.width*sizeof(gfxcolor_t)); - for(y=0;yread(r, img.data, size); -#endif - return img; -} - -static void dumpMatrix(writer_t*w, state_t*state, gfxmatrix_t*matrix) -{ - writer_writeDouble(w, matrix->m00); - writer_writeDouble(w, matrix->m01); - writer_writeDouble(w, matrix->m10); - writer_writeDouble(w, matrix->m11); - writer_writeDouble(w, matrix->tx); - writer_writeDouble(w, matrix->ty); -#ifdef STATS - state->size_matrices += 6*8; -#endif -} -static gfxmatrix_t readMatrix(reader_t*r, state_t*state) -{ - gfxmatrix_t matrix; - matrix.m00 = reader_readDouble(r); - matrix.m01 = reader_readDouble(r); - matrix.m10 = reader_readDouble(r); - matrix.m11 = reader_readDouble(r); - matrix.tx = reader_readDouble(r); - matrix.ty = reader_readDouble(r); - return matrix; -} -static void dumpXY(writer_t*w, state_t*state, gfxmatrix_t*matrix) -{ - writer_writeDouble(w, matrix->tx); - writer_writeDouble(w, matrix->ty); -#ifdef STATS - state->size_positions += 2*8; -#endif -} -static void readXY(reader_t*r, state_t*state, gfxmatrix_t*m) -{ - m->tx = reader_readDouble(r); - m->ty = reader_readDouble(r); -} - -static void dumpColor(writer_t*w, state_t*state, gfxcolor_t*color) -{ - writer_writeU8(w, color->r); - writer_writeU8(w, color->g); - writer_writeU8(w, color->b); - writer_writeU8(w, color->a); -#ifdef STATS - state->size_colors += 4; -#endif -} -static gfxcolor_t readColor(reader_t*r, state_t*state) -{ - gfxcolor_t col; - col.r = reader_readU8(r); - col.g = reader_readU8(r); - col.b = reader_readU8(r); - col.a = reader_readU8(r); - return col; -} - -static void dumpGradient(writer_t*w, state_t*state, gfxgradient_t*gradient) -{ - while(gradient) { - writer_writeU8(w, 1); - dumpColor(w, state, &gradient->color); - writer_writeFloat(w, gradient->pos); - gradient = gradient->next; - } - writer_writeU8(w, 0); -} -static gfxgradient_t* readGradient(reader_t*r, state_t*state) -{ - gfxgradient_t*start = 0, *pos = 0; - while(1) { - U8 op = reader_readU8(r); - if(!op) - break; - gfxgradient_t*g = (gfxgradient_t*)rfx_calloc(sizeof(gfxgradient_t)); - if(!start) { - start = pos = g; - } else { - pos->next = g; - pos = g; - } - g->color = readColor(r, state); - g->pos = reader_readFloat(r); - } - return start; -} - -static void dumpCXForm(writer_t*w, state_t*state, gfxcxform_t*c) -{ - if(!c) { - writer_writeU8(w, 0); - } else { - writer_writeU8(w, 1); - writer_writeFloat(w, c->rr); writer_writeFloat(w, c->rg); writer_writeFloat(w, c->rb); writer_writeFloat(w, c->ra); - writer_writeFloat(w, c->gr); writer_writeFloat(w, c->gg); writer_writeFloat(w, c->gb); writer_writeFloat(w, c->ga); - writer_writeFloat(w, c->br); writer_writeFloat(w, c->bg); writer_writeFloat(w, c->bb); writer_writeFloat(w, c->ba); - writer_writeFloat(w, c->ar); writer_writeFloat(w, c->ag); writer_writeFloat(w, c->ab); writer_writeFloat(w, c->aa); - } -} -static gfxcxform_t* readCXForm(reader_t*r, state_t*state) -{ - U8 type = reader_readU8(r); - if(!type) - return 0; - gfxcxform_t* c = (gfxcxform_t*)rfx_calloc(sizeof(gfxcxform_t)); - c->rr = reader_readFloat(r); c->rg = reader_readFloat(r); c->rb = reader_readFloat(r); c->ra = reader_readFloat(r); - c->gr = reader_readFloat(r); c->gg = reader_readFloat(r); c->gb = reader_readFloat(r); c->ga = reader_readFloat(r); - c->br = reader_readFloat(r); c->bg = reader_readFloat(r); c->bb = reader_readFloat(r); c->ba = reader_readFloat(r); - c->ar = reader_readFloat(r); c->ag = reader_readFloat(r); c->ab = reader_readFloat(r); c->aa = reader_readFloat(r); - return c; -} - -static void dumpFont(writer_t*w, state_t*state, gfxfont_t*font) -{ - int oldpos = w->pos; -#ifdef STATS - int old_size_lines = state->size_lines; -#endif - writer_writeString(w, font->id); - writer_writeU32(w, font->num_glyphs); - writer_writeU32(w, font->max_unicode); - writer_writeDouble(w, font->ascent); - writer_writeDouble(w, font->descent); - int t; - for(t=0;tnum_glyphs;t++) { - dumpLine(w, state, font->glyphs[t].line); - writer_writeDouble(w, font->glyphs[t].advance); - writer_writeU32(w, font->glyphs[t].unicode); - if(font->glyphs[t].name) { - writer_writeString(w,font->glyphs[t].name); - } else { - writer_writeU8(w,0); - } - } - for(t=0;tmax_unicode;t++) { - writer_writeU32(w, font->unicode2glyph[t]); - } -#ifdef STATS - state->size_lines = old_size_lines; - state->size_fonts += w->pos - oldpos; -#endif -} -static gfxfont_t*readFont(reader_t*r, state_t*state) -{ - gfxfont_t* font = (gfxfont_t*)rfx_calloc(sizeof(gfxfont_t)); - font->id = reader_readString(r); - font->num_glyphs = reader_readU32(r); - font->max_unicode = reader_readU32(r); - font->ascent = reader_readDouble(r); - font->descent = reader_readDouble(r); - font->glyphs = (gfxglyph_t*)rfx_calloc(sizeof(gfxglyph_t)*font->num_glyphs); - font->unicode2glyph = (int*)rfx_calloc(sizeof(font->unicode2glyph[0])*font->max_unicode); - int t; - for(t=0;tnum_glyphs;t++) { - font->glyphs[t].line = readLine(r, state); - font->glyphs[t].advance = reader_readDouble(r); - font->glyphs[t].unicode = reader_readU32(r); - font->glyphs[t].name = reader_readString(r); - if(!font->glyphs[t].name[0]) { - free((void*)(font->glyphs[t].name)); - font->glyphs[t].name = 0; - } - } - for(t=0;tmax_unicode;t++) { - font->unicode2glyph[t] = reader_readU32(r); - } - return font; -} - -/* ----------------- reading/writing of primitives with caching -------------- */ - -void state_clear(state_t*state) -{ - int t; - for(t=0;tlast_string)/sizeof(state->last_string[0]);t++) { - if(state->last_string[t]) { - free(state->last_string[t]); - state->last_string[t] = 0; - } - } -} - -static char* read_string(reader_t*r, state_t*state, U8 id, U8 flags) -{ - assert(id>=0 && id<16); - if(flags&FLAG_SAME_AS_LAST) { - assert(state->last_string[id]); - return strdup(state->last_string[id]); - } - char*s = reader_readString(r); - if(state->last_string[id]) { - free(state->last_string[id]); - } - state->last_string[id] = strdup(s); - return s; -} -static gfxcolor_t read_color(reader_t*r, state_t*state, U8 id, U8 flags) -{ - assert(id>=0 && id<16); - if(flags&FLAG_SAME_AS_LAST) - return state->last_color[id]; - gfxcolor_t c = readColor(r, state); - state->last_color[id] = c; - return c; -} -static gfxmatrix_t read_matrix(reader_t*r, state_t*state, U8 id, U8 flags) -{ - assert(id>=0 && id<16); - if(flags&FLAG_SAME_AS_LAST) { - gfxmatrix_t m = state->last_matrix[id]; - readXY(r, state, &m); - return m; - } - gfxmatrix_t m = readMatrix(r, state); - state->last_matrix[id] = m; - return m; -} - -/* --------------------------- record device operations ---------------------- */ - -static int record_setparameter(struct _gfxdevice*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x SETPARAM %s %s\n", dev, key, value); - writer_writeU8(&i->w, OP_SETPARAM); - writer_writeString(&i->w, key); - writer_writeString(&i->w, value); - return 1; -} - -static void record_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x STROKE\n", dev); - writer_writeU8(&i->w, OP_STROKE); - writer_writeDouble(&i->w, width); - writer_writeDouble(&i->w, miterLimit); - dumpColor(&i->w, &i->state, color); - writer_writeU8(&i->w, cap_style); - writer_writeU8(&i->w, joint_style); - dumpLine(&i->w, &i->state, line); -} - -static void record_startclip(struct _gfxdevice*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x STARTCLIP\n", dev); - writer_writeU8(&i->w, OP_STARTCLIP); - dumpLine(&i->w, &i->state, line); - i->cliplevel++; -} - -static void record_endclip(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x ENDCLIP\n", dev); - writer_writeU8(&i->w, OP_ENDCLIP); - i->cliplevel--; - if(i->cliplevel<0) { - msg(" record: endclip() without startclip()"); - } -} - -static void record_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x FILL\n", dev); - writer_writeU8(&i->w, OP_FILL); - dumpColor(&i->w, &i->state, color); - dumpLine(&i->w, &i->state, line); -} - -static void record_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x FILLBITMAP\n", dev); - writer_writeU8(&i->w, OP_FILLBITMAP); - dumpImage(&i->w, &i->state, img); - dumpMatrix(&i->w, &i->state, matrix); - dumpLine(&i->w, &i->state, line); - dumpCXForm(&i->w, &i->state, cxform); -} - -static void record_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x FILLGRADIENT %08x\n", dev, gradient); - writer_writeU8(&i->w, OP_FILLGRADIENT); - writer_writeU8(&i->w, type); - dumpGradient(&i->w, &i->state, gradient); - dumpMatrix(&i->w, &i->state, matrix); - dumpLine(&i->w, &i->state, line); -} - -static void record_addfont(struct _gfxdevice*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x ADDFONT %s\n", dev, font->id); - if(font && !gfxfontlist_hasfont(i->fontlist, font)) { - writer_writeU8(&i->w, OP_ADDFONT); - dumpFont(&i->w, &i->state, font); - i->fontlist = gfxfontlist_addfont(i->fontlist, font); - } -} - -static void record_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - if(font && !gfxfontlist_hasfont(i->fontlist, font)) { - record_addfont(dev, font); - } - - msg(" record: %08x DRAWCHAR %d\n", glyphnr, dev); - const char*font_id = (font&&font->id)?font->id:"*NULL*"; - - gfxmatrix_t*l = &i->state.last_matrix[OP_DRAWCHAR]; - - U8 flags = 0; - if(!font) - flags |= FLAG_ZERO_FONT; - - char same_font = i->state.last_string[OP_DRAWCHAR] && !strcmp(i->state.last_string[OP_DRAWCHAR], font_id); - char same_matrix = (l->m00 == matrix->m00) && (l->m01 == matrix->m01) && (l->m10 == matrix->m10) && (l->m11 == matrix->m11); - char same_color = !memcmp(color, &i->state.last_color[OP_DRAWCHAR], sizeof(gfxcolor_t)); - - /* FIXME - if(same_font && same_matrix && same_color) - flags |= FLAG_SAME_AS_LAST; - */ - - writer_writeU8(&i->w, OP_DRAWCHAR|flags); - writer_writeU32(&i->w, glyphnr); -#ifdef STATS - i->state.size_chars += 5; -#endif - - if(!(flags&FLAG_SAME_AS_LAST)) { - if(!(flags&FLAG_ZERO_FONT)) - writer_writeString(&i->w, font_id); - dumpColor(&i->w, &i->state, color); - dumpMatrix(&i->w, &i->state, matrix); - - if(i->state.last_string[OP_DRAWCHAR]) - free(i->state.last_string[OP_DRAWCHAR]); - i->state.last_string[OP_DRAWCHAR] = strdup(font_id); - - i->state.last_color[OP_DRAWCHAR] = *color; - i->state.last_matrix[OP_DRAWCHAR] = *matrix; - } else { - dumpXY(&i->w, &i->state, matrix); - } -} - -static void record_startpage(struct _gfxdevice*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x STARTPAGE\n", dev); - writer_writeU8(&i->w, OP_STARTPAGE); - writer_writeU16(&i->w, width); - writer_writeU16(&i->w, height); -} - -static void record_endpage(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x ENDPAGE\n", dev); - writer_writeU8(&i->w, OP_ENDPAGE); -} - -static void record_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x DRAWLINK\n", dev); - writer_writeU8(&i->w, OP_DRAWLINK); - dumpLine(&i->w, &i->state, line); - writer_writeString(&i->w, action?action:""); - writer_writeString(&i->w, text?text:""); -} - -/* ------------------------------- replaying --------------------------------- */ - -static void replay(struct _gfxdevice*dev, gfxdevice_t*out, reader_t*r, gfxfontlist_t**fontlist) -{ - internal_t*i = 0; - if(dev) { - i = (internal_t*)dev->internal; - } - gfxfontlist_t*_fontlist=0; - if(!fontlist) { - fontlist = &_fontlist; - } - - state_t state; - memset(&state, 0, sizeof(state)); - - while(1) { - unsigned char op; - if(r->read(r, &op, 1)!=1) - break; - unsigned char flags = op&0xf0; - op&=0x0f; - - switch(op) { - case OP_END: - goto finish; - case OP_SETPARAM: { - msg(" replay: SETPARAM"); - char*key; - char*value; - key = reader_readString(r); - value = reader_readString(r); - out->setparameter(out, key, value); - free(key); - free(value); - break; - } - case OP_STARTPAGE: { - msg(" replay: STARTPAGE"); - U16 width = reader_readU16(r); - U16 height = reader_readU16(r); - out->startpage(out, width, height); - break; - } - case OP_ENDPAGE: { - msg(" replay: ENDPAGE"); - out->endpage(out); - break; - } - case OP_FINISH: { - msg(" replay: FINISH"); - break; - } - case OP_STROKE: { - msg(" replay: STROKE"); - double width = reader_readDouble(r); - double miterlimit = reader_readDouble(r); - gfxcolor_t color = readColor(r, &state); - gfx_capType captype; - int v = reader_readU8(r); - switch (v) { - case 0: captype = gfx_capButt; break; - case 1: captype = gfx_capRound; break; - case 2: captype = gfx_capSquare; break; - } - gfx_joinType jointtype; - v = reader_readU8(r); - switch (v) { - case 0: jointtype = gfx_joinMiter; break; - case 1: jointtype = gfx_joinRound; break; - case 2: jointtype = gfx_joinBevel; break; - } - gfxline_t* line = readLine(r, &state); - out->stroke(out, line, width, &color, captype, jointtype,miterlimit); - gfxline_free(line); - break; - } - case OP_STARTCLIP: { - msg(" replay: STARTCLIP"); - gfxline_t* line = readLine(r, &state); - out->startclip(out, line); - gfxline_free(line); - break; - } - case OP_ENDCLIP: { - msg(" replay: ENDCLIP"); - out->endclip(out); - break; - } - case OP_FILL: { - msg(" replay: FILL"); - gfxcolor_t color = readColor(r, &state); - gfxline_t* line = readLine(r, &state); - out->fill(out, line, &color); - gfxline_free(line); - break; - } - case OP_FILLBITMAP: { - msg(" replay: FILLBITMAP"); - gfximage_t img = readImage(r, &state); - gfxmatrix_t matrix = readMatrix(r, &state); - gfxline_t* line = readLine(r, &state); - gfxcxform_t* cxform = readCXForm(r, &state); - out->fillbitmap(out, line, &img, &matrix, cxform); - gfxline_free(line); - if(cxform) - free(cxform); - free(img.data);img.data=0; - break; - } - case OP_FILLGRADIENT: { - msg(" replay: FILLGRADIENT"); - gfxgradienttype_t type; - int v = reader_readU8(r); - switch (v) { - case 0: - type = gfxgradient_radial; break; - case 1: - type = gfxgradient_linear; break; - } - gfxgradient_t*gradient = readGradient(r, &state); - gfxmatrix_t matrix = readMatrix(r, &state); - gfxline_t* line = readLine(r, &state); - out->fillgradient(out, line, gradient, type, &matrix); - break; - } - case OP_DRAWLINK: { - msg(" replay: DRAWLINK"); - gfxline_t* line = readLine(r, &state); - char* s = reader_readString(r); - char* t = reader_readString(r); - out->drawlink(out,line,s, t); - gfxline_free(line); - free(s); - break; - } - case OP_ADDFONT: { - msg(" replay: ADDFONT out=%08x(%s)", out, out->name); - gfxfont_t*font = readFont(r, &state); - if(!gfxfontlist_hasfont(*fontlist, font)) { - *fontlist = gfxfontlist_addfont(*fontlist, font); - out->addfont(out, font); - } else { - gfxfont_free(font); - } - break; - } - case OP_DRAWCHAR: { - U32 glyph = reader_readU32(r); - gfxmatrix_t m = {1,0,0, 0,1,0}; - char* id = 0; - if(!(flags&FLAG_ZERO_FONT)) - id = read_string(r, &state, op, flags); - gfxcolor_t color = read_color(r, &state, op, flags); - gfxmatrix_t matrix = read_matrix(r, &state, op, flags); - - gfxfont_t*font = id?gfxfontlist_findfont(*fontlist, id):0; - if(i && !font) { - font = gfxfontlist_findfont(i->fontlist, id); - } - msg(" replay: DRAWCHAR font=%s glyph=%d (flags=%d)", id, glyph, flags); - out->drawchar(out, font, glyph, &color, &matrix); - if(id) - free(id); - break; - } - } - } -finish: - state_clear(&state); - r->dealloc(r); - if(_fontlist) - gfxfontlist_free(_fontlist, 0); -} -void gfxresult_record_replay(gfxresult_t*result, gfxdevice_t*device, gfxfontlist_t**fontlist) -{ - internal_result_t*i = (internal_result_t*)result->internal; - - reader_t r; - if(i->use_tempfile) { - reader_init_filereader2(&r, i->filename); - } else { - reader_init_memreader(&r, i->data, i->length); - } - - replay(0, device, &r, fontlist); -} - -static void record_result_write(gfxresult_t*r, int filedesc) -{ - internal_result_t*i = (internal_result_t*)r->internal; - if(i->data) { - write(filedesc, i->data, i->length); - } -} -static int record_result_save(gfxresult_t*r, const char*filename) -{ - internal_result_t*i = (internal_result_t*)r->internal; - if(i->use_tempfile) { - move_file(i->filename, filename); - } else { - FILE*fi = fopen(filename, "wb"); - if(!fi) { - fprintf(stderr, "Couldn't open file %s for writing\n", filename); - return -1; - } - fwrite(i->data, i->length, 1, fi); - fclose(fi); - } - return 0; -} -static void*record_result_get(gfxresult_t*r, const char*name) -{ - internal_result_t*i = (internal_result_t*)r->internal; - if(!strcmp(name, "data")) { - return i->data; - } else if(!strcmp(name, "length")) { - return &i->length; - } - return 0; -} -static void record_result_destroy(gfxresult_t*r) -{ - internal_result_t*i = (internal_result_t*)r->internal; - if(i->data) { - free(i->data);i->data = 0; - } - if(i->filename) { - unlink(i->filename); - free(i->filename); - } - free(r->internal);r->internal = 0; - free(r); -} - -static unsigned char printable(unsigned char a) -{ - if(a<32 || a==127) return '.'; - else return a; -} - -static void hexdumpMem(unsigned char*data, int len) -{ - int t; - char ascii[32]; - for(t=0;tinternal; - if(out) { - if(!i->use_tempfile) { - int len=0; - void*data = writer_growmemwrite_memptr(&i->w, &len); - reader_t r; - reader_init_memreader(&r, data, len); - replay(dev, out, &r, fontlist); - writer_growmemwrite_reset(&i->w); - } else { - msg(" Flushing not supported for file based record device"); - exit(1); - } - } -} - -static gfxresult_t* record_finish(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - msg(" record: %08x END", dev); - - if(i->cliplevel) { - msg(" Warning: unclosed cliplevels"); - } - - state_clear(&i->state); - -#ifdef STATS - int total = i->w.pos; - if(total && i->use_tempfile) { - state_t*s = &i->state; - msg(" record device finished. stats:"); - msg(" %4.1f%% matrices (%d bytes)", s->size_matrices*100.0/total, s->size_matrices); - msg(" %4.1f%% positions (%d bytes)", s->size_positions*100.0/total, s->size_positions); - msg(" %4.1f%% colors (%d bytes)", s->size_colors*100.0/total, s->size_colors); - msg(" %4.1f%% lines (%d bytes)", s->size_lines*100.0/total, s->size_lines); - msg(" %4.1f%% fonts (%d bytes)", s->size_fonts*100.0/total, s->size_fonts); - msg(" %4.1f%% images (%d bytes)", s->size_images*100.0/total, s->size_images); - msg(" %4.1f%% characters (%d bytes)", s->size_chars*100.0/total, s->size_chars); - msg(" total: %d bytes", total); - } -#endif - - writer_writeU8(&i->w, OP_END); - - gfxfontlist_free(i->fontlist, 0); - - internal_result_t*ir = (internal_result_t*)rfx_calloc(sizeof(gfxresult_t)); - - ir->use_tempfile = i->use_tempfile; - if(i->use_tempfile) { - ir->filename = i->filename; - } else { - ir->data = writer_growmemwrite_getmem(&i->w); - ir->length = i->w.pos; - } - i->w.finish(&i->w); - - gfxresult_t*result= (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); - result->save = record_result_save; - result->get = record_result_get; - result->destroy = record_result_destroy; - result->internal = ir; - - free(dev->internal);memset(dev, 0, sizeof(gfxdevice_t)); - - return result; -} - -void gfxdevice_record_init(gfxdevice_t*dev, char use_tempfile) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "record"; - - dev->internal = i; - - i->use_tempfile = use_tempfile; - if(!use_tempfile) { - writer_init_growingmemwriter(&i->w, 1048576); - } else { - char buffer[128]; - i->filename = strdup(mktempname(buffer, "gfx")); - writer_init_filewriter2(&i->w, i->filename); - } - i->fontlist = gfxfontlist_create(); - i->cliplevel = 0; - - dev->setparameter = record_setparameter; - dev->startpage = record_startpage; - dev->startclip = record_startclip; - dev->endclip = record_endclip; - dev->stroke = record_stroke; - dev->fill = record_fill; - dev->fillbitmap = record_fillbitmap; - dev->fillgradient = record_fillgradient; - dev->addfont = record_addfont; - dev->drawchar = record_drawchar; - dev->drawlink = record_drawlink; - dev->endpage = record_endpage; - dev->finish = record_finish; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/record.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/record.h deleted file mode 100644 index d47b0ec06..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/record.h +++ /dev/null @@ -1,45 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __record_h__ -#define __record_h__ - -#include "../gfxdevice.h" -#include "../gfxtools.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_record_init(gfxdevice_t*, char use_tempfile); - -gfxdevice_t* gfxdevice_record_new(char*filename); - -void gfxdevice_record_flush(gfxdevice_t*, gfxdevice_t*, gfxfontlist_t**); - -void gfxresult_record_replay(gfxresult_t*, gfxdevice_t*, gfxfontlist_t**); - -#ifdef __cplusplus -} -#endif - -#endif //__record_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/render.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/render.c deleted file mode 100644 index 11c63d951..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/render.c +++ /dev/null @@ -1,1084 +0,0 @@ -/* render.c - - Part of the swftools package. - - Copyright (c) 2005/2006/2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../mem.h" -#include "../types.h" -#include "../png.h" -#include "../log.h" -#include "render.h" - -typedef gfxcolor_t RGBA; - -typedef struct _renderpoint -{ - float x; -} renderpoint_t; - -typedef struct _renderline -{ - renderpoint_t*points; - int size; - int num; -} renderline_t; - -typedef struct _internal_result { - gfximage_t img; - struct _internal_result*next; - char palette; -} internal_result_t; - -typedef struct _clipbuffer { - U32*data; - struct _clipbuffer*next; -} clipbuffer_t; - -typedef struct _internal { - int width; - int height; - int width2; - int height2; - int bitwidth; - int multiply; - int antialize; - int zoom; - int ymin, ymax; - int fillwhite; - - char palette; - - RGBA* img; - - clipbuffer_t*clipbuf; - - renderline_t*lines; - - internal_result_t*results; - internal_result_t*result_next; -} internal_t; - -typedef enum {filltype_solid,filltype_clip,filltype_bitmap,filltype_gradient} filltype_t; - -typedef struct _fillinfo { - filltype_t type; - gfxcolor_t*color; - gfximage_t*image; - gfxmatrix_t*matrix; - gfxcxform_t*cxform; - RGBA*gradient; - char linear_or_radial; -} fillinfo_t; - - -static inline void add_pixel(internal_t*i, float x, int y) -{ - renderpoint_t p; - - if(x >= i->width2 || y >= i->height2 || y<0) return; - p.x = x; - if(yymin) i->ymin = y; - if(y>i->ymax) i->ymax = y; - - renderline_t*l = &i->lines[y]; - - if(l->num == l->size) { - l->size += 32; - l->points = (renderpoint_t*)rfx_realloc(l->points, l->size * sizeof(renderpoint_t)); - } - l->points[l->num] = p; - l->num++; -} - -/* set this to 0.777777 or something if the "both fillstyles set while not inside shape" - problem appears to often */ -#define CUT 0.5 - -#define INT(x) ((int)((x)+16)-16) - -static void add_line(gfxdevice_t*dev , double x1, double y1, double x2, double y2) -{ - internal_t*i = (internal_t*)dev->internal; - double diffx, diffy; - double ny1, ny2, stepx; -/* if(DEBUG&4) { - int l = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); - printf(" l[%d - %.2f/%.2f -> %.2f/%.2f]\n", l, x1/20.0, y1/20.0, x2/20.0, y2/20.0); - }*/ - - if(y2 < y1) { - double x; - double y; - x = x1;x1 = x2;x2=x; - y = y1;y1 = y2;y2=y; - } - - diffx = x2 - x1; - diffy = y2 - y1; - - ny1 = INT(y1)+CUT; - ny2 = INT(y2)+CUT; - - if(ny1 < y1) { - ny1 = INT(y1) + 1.0 + CUT; - } - if(ny2 >= y2) { - ny2 = INT(y2) - 1.0 + CUT; - } - - if(ny1 > ny2) - return; - - stepx = diffx/diffy; - x1 = x1 + (ny1-y1)*stepx; - x2 = x2 + (ny2-y2)*stepx; - - { - int posy=INT(ny1); - int endy=INT(ny2); - double posx=0; - double startx = x1; - - while(posy<=endy) { - float xx = (float)(startx + posx); - add_pixel(i, xx ,posy); - posx+=stepx; - posy++; - } - } -} -#define PI 3.14159265358979 -static void add_solidline(gfxdevice_t*dev, double x1, double y1, double x2, double y2, double width) -{ - /* TODO: handle cap styles */ - - internal_t*i = (internal_t*)dev->internal; - - double dx = x2-x1; - double dy = y2-y1; - double sd; - double d; - - int t; - int segments; - double lastx,lasty; - double vx,vy; - double xx,yy; - - /* Make sure the line is always at least one pixel wide */ -#ifdef LINEMODE1 - /* That's what Macromedia's Player does at least at zoom level >= 1. */ - width += 1.0; -#else - /* That's what Macromedia's Player seems to do at zoom level 0. */ - /* TODO: needs testing */ - - /* TODO: how does this interact with scaling? */ - if(width * i->multiply < 1.0) - width = 1.0 / i->multiply; -#endif - - sd = (double)dx*(double)dx+(double)dy*(double)dy; - d = sqrt(sd); - - if(!dx && !dy) { - vx = 1; - vy = 0; - } else { - vx = ( dy/d); - vy = (-dx/d); - } - - segments = width/2; - if(segments < 2) - segments = 2; - - segments = 8; - - vx=vx*width*0.5; - vy=vy*width*0.5; - - xx = x2+vx; - yy = y2+vy; - add_line(dev, x1+vx, y1+vy, xx, yy); - lastx = xx; - lasty = yy; - for(t=1;tx < b->x) return -1; - if(a->x > b->x) return 1; - return 0; -} - -static void fill_line_solid(RGBA*line, U32*z, int y, int x1, int x2, RGBA col) -{ - int x = x1; - - U32 bit = 1<<(x1&31); - int bitpos = (x1/32); - - if(col.a!=255) { - int ainv = 255-col.a; - col.r = (col.r*col.a)/255; - col.g = (col.g*col.a)/255; - col.b = (col.b*col.a)/255; - do { - if(z[bitpos]&bit) { - line[x].r = ((line[x].r*ainv)/255)+col.r; - line[x].g = ((line[x].g*ainv)/255)+col.g; - line[x].b = ((line[x].b*ainv)/255)+col.b; - //line[x].a = 255; - line[x].a = ((line[x].a*ainv)/255)+col.a; - } - bit <<= 1; - if(!bit) { - bit = 1;bitpos++; - } - } while(++xmatrix; - gfximage_t*b = info->image; - - if(!b || !b->width || !b->height) { - gfxcolor_t red = {255,255,0,0}; - fill_line_solid(line, z, y, x1, x2, red); - return; - } - - double det = m->m00*m->m11 - m->m01*m->m10; - if(fabs(det) < 0.0005) { - /* x direction equals y direction- the image is invisible */ - return; - } - det = 1.0/det; - double xx1 = ( (-m->tx) * m->m11 - (y - m->ty) * m->m10) * det; - double yy1 = (- (-m->tx) * m->m01 + (y - m->ty) * m->m00) * det; - double xinc1 = m->m11 * det; - double yinc1 = m->m01 * det; - - U32 bit = 1<<(x1&31); - int bitpos = (x1/32); - - do { - if(z[bitpos]&bit) { - RGBA col; - int xx = (int)(xx1 + x * xinc1); - int yy = (int)(yy1 - x * yinc1); - int ainv; - - if(info->linear_or_radial) { - if(xx<0) xx=0; - if(xx>=b->width) xx = b->width-1; - if(yy<0) yy=0; - if(yy>=b->height) yy = b->height-1; - } else { - xx %= b->width; - yy %= b->height; - if(xx<0) xx += b->width; - if(yy<0) yy += b->height; - } - - col = b->data[yy*b->width+xx]; - ainv = 255-col.a; - - /* needs bitmap with premultiplied alpha */ - line[x].r = ((line[x].r*ainv)/255)+col.r; - line[x].g = ((line[x].g*ainv)/255)+col.g; - line[x].b = ((line[x].b*ainv)/255)+col.b; - line[x].a = 255; - } - bit <<= 1; - if(!bit) { - bit = 1;bitpos++; - } - } while(++xmatrix; - RGBA*g= info->gradient; - - double det = m->m00*m->m11 - m->m01*m->m10; - if(fabs(det) < 0.0005) { - /* x direction equals y direction */ - return; - } - - det = 1.0/det; - double xx1 = ( (-m->tx) * m->m11 - (y - m->ty) * m->m10) * det; - double yy1 = (- (-m->tx) * m->m01 + (y - m->ty) * m->m00) * det; - double xinc1 = m->m11 * det; - double yinc1 = m->m01 * det; - - U32 bit = 1<<(x1&31); - int bitpos = (x1/32); - - do { - if(z[bitpos]&bit) { - RGBA col; - int ainv; - - int pos = 0; - if(info->linear_or_radial) { - double xx = xx1 + x * xinc1; - double yy = yy1 + y * yinc1; - double r = sqrt(xx*xx + yy*yy); - if(r>1) r = 1; - pos = (int)(r*255.999); - } else { - double r = xx1 + x * xinc1; - if(r>1) r = 1; - if(r<-1) r = -1; - pos = (int)((r+1)*127.999); - } - col = g[pos]; - ainv = 255-col.a; - - /* needs bitmap with premultiplied alpha */ - line[x].r = ((line[x].r*ainv)/255)+col.r; - line[x].g = ((line[x].g*ainv)/255)+col.g; - line[x].b = ((line[x].b*ainv)/255)+col.b; - line[x].a = 255; - } - bit <<= 1; - if(!bit) { - bit = 1;bitpos++; - } - } while(++xtype == filltype_solid) - fill_line_solid(line, zline, y, startx, endx, *fill->color); - else if(fill->type == filltype_clip) - fill_line_clip(line, zline, y, startx, endx); - else if(fill->type == filltype_bitmap) - fill_line_bitmap(line, zline, y, startx, endx, fill); - else if(fill->type == filltype_gradient) - fill_line_gradient(line, zline, y, startx, endx, fill); -} - -void fill(gfxdevice_t*dev, fillinfo_t*fill) -{ - internal_t*i = (internal_t*)dev->internal; - int y; - U32 clipdepth = 0; - for(y=i->ymin;y<=i->ymax;y++) { - renderpoint_t*points = i->lines[y].points; - RGBA*line = &i->img[i->width2*y]; - U32*zline = &i->clipbuf->data[i->bitwidth*y]; - - int n; - int num = i->lines[y].num; - int lastx; - qsort(points, num, sizeof(renderpoint_t), compare_renderpoints); - - for(n=0;nx; - int endx = next?next->x:i->width2; - if(endx > i->width2) - endx = i->width2; - if(startx < 0) - startx = 0; - if(endx < 0) - endx = 0; - - if(!(n&1)) - fill_line(dev, line, zline, y, startx, endx, fill); - - lastx = endx; - if(endx == i->width2) - break; - } - if(fill->type == filltype_clip) { - if(i->clipbuf->next) { - U32*line2 = &i->clipbuf->next->data[i->bitwidth*y]; - int x; - for(x=0;xbitwidth;x++) - zline[x] &= line2[x]; - } - } - - i->lines[y].num = 0; - } -} - -void fill_solid(gfxdevice_t*dev, gfxcolor_t* color) -{ - fillinfo_t info; - memset(&info, 0, sizeof(info)); - info.type = filltype_solid; - info.color = color; - fill(dev, &info); -} - -int render_setparameter(struct _gfxdevice*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - if(!strcmp(key, "antialize") || !strcmp(key, "antialise")) { - i->antialize = atoi(value); - i->zoom = i->antialize * i->multiply; - return 1; - } else if(!strcmp(key, "multiply")) { - i->multiply = atoi(value); - i->zoom = i->antialize * i->multiply; - fprintf(stderr, "Warning: multiply not implemented yet\n"); - return 1; - } else if(!strcmp(key, "fillwhite")) { - i->fillwhite = atoi(value); - return 1; - } else if(!strcmp(key, "palette")) { - i->palette = atoi(value); - return 1; - } - return 0; -} - -void newclip(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - - clipbuffer_t*c = (clipbuffer_t*)rfx_calloc(sizeof(clipbuffer_t)); - c->data = (U32*)rfx_calloc(sizeof(U32) * i->bitwidth * i->height2); - c->next = i->clipbuf; - i->clipbuf = c; - memset(c->data, 0, sizeof(U32)*i->bitwidth*i->height2); -} - -void endclip(struct _gfxdevice*dev, char removelast) -{ - internal_t*i = (internal_t*)dev->internal; - - /* test for at least one cliplevel (the one we created ourselves) */ - if(!i->clipbuf || (!i->clipbuf->next && !removelast)) { - fprintf(stderr, "endclip without any active clip buffers\n"); - return; - } - - clipbuffer_t*c = i->clipbuf; - i->clipbuf = i->clipbuf->next; - c->next = 0; - free(c->data);c->data = 0; - free(c); -} - -void render_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - double x,y; - - /*if(cap_style != gfx_capRound || joint_style != gfx_joinRound) { - fprintf(stderr, "Warning: cap/joint style != round not yet supported\n"); - }*/ - - while(line) { - if(line->type == gfx_moveTo) { - } else if(line->type == gfx_lineTo) { - double x1=x*i->zoom,y1=y*i->zoom; - double x3=line->x*i->zoom,y3=line->y*i->zoom; - add_solidline(dev, x1, y1, x3, y3, width * i->zoom); - fill_solid(dev, color); - } else if(line->type == gfx_splineTo) { - int t,parts; - double xx,yy; - - double x1=x*i->zoom,y1=y*i->zoom; - double x2=line->sx*i->zoom,y2=line->sy*i->zoom; - double x3=line->x*i->zoom,y3=line->y*i->zoom; - - double c = abs(x3-2*x2+x1) + abs(y3-2*y2+y1); - xx=x1; - yy=y1; - - parts = (int)(sqrt(c)/3); - if(!parts) parts = 1; - - for(t=1;t<=parts;t++) { - double nx = (double)(t*t*x3 + 2*t*(parts-t)*x2 + (parts-t)*(parts-t)*x1)/(double)(parts*parts); - double ny = (double)(t*t*y3 + 2*t*(parts-t)*y2 + (parts-t)*(parts-t)*y1)/(double)(parts*parts); - - add_solidline(dev, xx, yy, nx, ny, width * i->zoom); - fill_solid(dev, color); - xx = nx; - yy = ny; - } - } - x = line->x; - y = line->y; - line = line->next; - } -} - -static void draw_line(gfxdevice_t*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - double x=0,y=0; - - while(line) - { - int x1,y1,x2,y2,x3,y3; - - if(line->type == gfx_moveTo) { - } else if(line->type == gfx_lineTo) { - double x1=x*i->zoom,y1=y*i->zoom; - double x3=line->x*i->zoom,y3=line->y*i->zoom; - - add_line(dev, x1, y1, x3, y3); - } else if(line->type == gfx_splineTo) { - int c,t,parts,qparts; - double xx,yy; - - double x1=x*i->zoom,y1=y*i->zoom; - double x2=line->sx*i->zoom,y2=line->sy*i->zoom; - double x3=line->x*i->zoom,y3=line->y*i->zoom; - - c = abs(x3-2*x2+x1) + abs(y3-2*y2+y1); - xx=x1; - yy=y1; - - parts = (int)(sqrt(c)); - if(!parts) parts = 1; - - for(t=1;t<=parts;t++) { - double nx = (double)(t*t*x3 + 2*t*(parts-t)*x2 + (parts-t)*(parts-t)*x1)/(double)(parts*parts); - double ny = (double)(t*t*y3 + 2*t*(parts-t)*y2 + (parts-t)*(parts-t)*y1)/(double)(parts*parts); - - add_line(dev, xx, yy, nx, ny); - xx = nx; - yy = ny; - } - } - x = line->x; - y = line->y; - line = line->next; - } -} - -void render_startclip(struct _gfxdevice*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - fillinfo_t info; - memset(&info, 0, sizeof(info)); - newclip(dev); - info.type = filltype_clip; - draw_line(dev, line); - fill(dev, &info); -} - -void render_endclip(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - endclip(dev, 0); -} - -void render_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - - draw_line(dev, line); - fill_solid(dev, color); -} - -void render_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - - gfxmatrix_t m2 = *matrix; - - draw_line(dev, line); - - fillinfo_t info; - memset(&info, 0, sizeof(info)); - info.type = filltype_bitmap; - info.image = img; - info.matrix = &m2; - info.cxform = cxform; - - m2.m00 *= i->zoom; m2.m01 *= i->zoom; m2.tx *= i->zoom; - m2.m10 *= i->zoom; m2.m11 *= i->zoom; m2.ty *= i->zoom; - - fill(dev, &info); -} - -void render_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - - gfxmatrix_t m2 = *matrix; - - draw_line(dev, line); - - RGBA g[256]; - fillinfo_t info; - memset(&info, 0, sizeof(info)); - info.type = filltype_gradient; - info.gradient = g; - info.matrix = &m2; - - m2.m00 *= i->zoom; m2.m01 *= i->zoom; m2.tx *= i->zoom; - m2.m10 *= i->zoom; m2.m11 *= i->zoom; m2.ty *= i->zoom; - - info.linear_or_radial = type == gfxgradient_radial; - - int pos = 0; - gfxcolor_t color = {0,0,0,0}; - pos=0; - while(gradient) { - int nextpos = gradient->pos*256; - int t; - if(nextpos>256) { - msg(" Invalid gradient- contains values > 1.0"); - return; - } - - gfxcolor_t nextcolor = gradient->color; - if(nextpos!=pos) { - double p0 = 1.0; - double p1 = 0.0; - double step = 1.0/(nextpos-pos); - int t; - for(t=pos;tnext; - } - if(pos!=256) { - msg(" Invalid gradient- doesn't end with 1.0"); - } - - fill(dev, &info); -} - -void render_addfont(struct _gfxdevice*dev, gfxfont_t*font) -{ -} - -void render_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - if(!font) - return; - - /* align characters to whole pixels */ - matrix->tx = (int)(matrix->tx * i->antialize) / i->antialize; - matrix->ty = (int)(matrix->ty * i->antialize) / i->antialize; - - gfxglyph_t*glyph = &font->glyphs[glyphnr]; - gfxline_t*line2 = gfxline_clone(glyph->line); - gfxline_transform(line2, matrix); - draw_line(dev, line2); - fill_solid(dev, color); - gfxline_free(line2); - - return; -} - -void render_result_write(gfxresult_t*r, int filedesc) -{ - internal_result_t*i= (internal_result_t*)r->internal; -} -int render_result_save(gfxresult_t*r, const char*filename) -{ - internal_result_t*i= (internal_result_t*)r->internal; - if(!i) { - return 0; // no pages drawn - } - if(i->next) { - int nr=0; - char filenamebuf[256]; - char*origname = strdup(filename); - int l = strlen(origname); - if(l>3 && strchr("gG",origname[l-1]) && strchr("nN",filename[l-2]) && - strchr("pP",origname[l-3]) && filename[l-4]=='.') { - origname[l-4] = 0; - } - while(i->next) { - sprintf(filenamebuf, "%s.%d.png", origname, nr); - if(!i->palette) { - png_write(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); - } else { - png_write_palette_based_2(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); - } - nr++; - } - free(origname); - } else { - if(!i->palette) { - png_write(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); - } else { - png_write_palette_based_2(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); - } - } - return 1; -} -char*gfximage_asXPM(gfximage_t*img, int depth) -{ - int d= 256/depth; - char*str = (char*)malloc(img->width*img->height*4 + 500 + 16*depth*depth*depth); - char*p = str; - p+= sprintf(p, "static char *noname[] = {\n\"%d %d 262144 3\",\n", img->width, img->height); - int r,g,b; - for(r=0;rheight;y++) { - p+=sprintf(p, "\""); - gfxcolor_t*col = &img->data[y*img->height]; - int x; - for(x=0;xwidth;x++) { - p+=sprintf(p, "%c%c%c", 32+(col->r/d), 32+(col->g/d), 32+(col->b/d)); - } - p+=sprintf(p, "\",\n"); - } - *p = 0; - return p; -} -void*render_result_get(gfxresult_t*r, const char*name) -{ - internal_result_t*i= (internal_result_t*)r->internal; - if(!strncmp(name,"xpm",3)) { - int pagenr = atoi(&name[3]); - if(pagenr<0) - pagenr=0; - while(pagenr>0) { - i = i->next; - if(!i) - return 0; - pagenr--; - } - return gfximage_asXPM(&i->img, 64); - } else if(!strncmp(name,"page",4)) { - int pagenr = atoi(&name[4]); - if(pagenr<0) - pagenr=0; - while(pagenr>0) { - i = i->next; - if(!i) - return 0; - pagenr--; - } - return &i->img; - } - return 0; -} -void render_result_destroy(gfxresult_t*r) -{ - internal_result_t*i= (internal_result_t*)r->internal; - r->internal = 0; - while(i) { - internal_result_t*next = i->next; - free(i->img.data);i->img.data = 0; - - /* FIXME memleak - the following rfx_free causes a segfault on WIN32 machines, - if executed */ - //rfx_free(i); - - i = next; - } - rfx_free(r); -} - -gfxresult_t* render_finish(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - - gfxresult_t* res = (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); - - res->internal = i->results;i->results = 0; - res->write = render_result_write; - res->save = render_result_save; - res->get = render_result_get; - res->destroy = render_result_destroy; - - free(dev->internal); dev->internal = 0; i = 0; - - return res; -} - -void render_startpage(struct _gfxdevice*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - int y; - - if(i->width2 || i->height2) { - fprintf(stderr, "Error: startpage() called twice (no endpage()?)\n"); - exit(1); - } - - i->width = width*i->multiply; - i->height = height*i->multiply; - i->width2 = width*i->zoom; - i->height2 = height*i->zoom; - i->bitwidth = (i->width2+31)/32; - - i->lines = (renderline_t*)rfx_alloc(i->height2*sizeof(renderline_t)); - for(y=0;yheight2;y++) { - memset(&i->lines[y], 0, sizeof(renderline_t)); - i->lines[y].points = 0; - i->lines[y].num = 0; - } - i->img = (RGBA*)rfx_calloc(sizeof(RGBA)*i->width2*i->height2); - if(i->fillwhite) { - memset(i->img, 0xff, sizeof(RGBA)*i->width2*i->height2); - } - - i->ymin = 0x7fffffff; - i->ymax = -0x80000000; - - - /* initialize initial clipping field, which doesn't clip anything yet */ - newclip(dev); - memset(i->clipbuf->data, 255, sizeof(U32)*i->bitwidth*i->height2); -} - -static void store_image(internal_t*i, internal_result_t*ir) -{ - ir->img.data = (gfxcolor_t*)malloc(i->width*i->height*sizeof(gfxcolor_t)); - ir->img.width = i->width; - ir->img.height = i->height; - - gfxcolor_t*dest = ir->img.data; - - if(i->antialize <= 1) /* no antializing */ { - int y; - for(y=0;yheight;y++) { - RGBA*line = &i->img[y*i->width]; - memcpy(&dest[y*i->width], line, sizeof(RGBA)*i->width); - } - } else { - RGBA**lines = (RGBA**)rfx_calloc(sizeof(RGBA*)*i->antialize); - int q = i->antialize*i->antialize; - int ypos = 0; - int y; - int y2=0; - for(y=0;yheight2;y++) { - int n; - ypos = y % i->antialize; - lines[ypos] = &i->img[y*i->width2]; - if(ypos == i->antialize-1) { - RGBA*out = &dest[(y2++)*i->width]; - int x; - int r,g,b,a; - for(x=0;xwidth;x++) { - int xpos = x*i->antialize; - int yp; - U32 r=0,g=0,b=0,a=0; - for(yp=0;ypantialize;yp++) { - RGBA*lp = &lines[yp][xpos]; - int xp; - for(xp=0;xpantialize;xp++) { - RGBA*p = &lp[xp]; - r += p->r; - g += p->g; - b += p->b; - a += p->a; - } - } - out[x].r = r / q; - out[x].g = g / q; - out[x].b = b / q; - out[x].a = a / q; - } - } - } - rfx_free(lines); - } -} - -void render_endpage(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - - if(!i->width2 || !i->height2) { - fprintf(stderr, "Error: endpage() called without corresponding startpage()\n"); - exit(1); - } - - endclip(dev, 1); - int unclosed = 0; - while(i->clipbuf) { - endclip(dev, 1); - unclosed++; - } - - if(unclosed) { - fprintf(stderr, "Warning: %d unclosed clip(s) while processing endpage()\n", unclosed); - } - - internal_result_t*ir= (internal_result_t*)rfx_calloc(sizeof(internal_result_t)); - ir->palette = i->palette; - - int y,x; - - store_image(i, ir); - - ir->next = 0; - if(i->result_next) { - i->result_next->next = ir; - } - if(!i->results) { - i->results = ir; - } - i->result_next = ir; - - for(y=0;yheight2;y++) { - rfx_free(i->lines[y].points); i->lines[y].points = 0; - } - rfx_free(i->lines);i->lines=0; - - if(i->img) {rfx_free(i->img);i->img = 0;} - - i->width2 = 0; - i->height2 = 0; -} - -void render_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text) -{ - /* not supported for this output device */ -} - -void gfxdevice_render_init(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "render"; - - dev->internal = i; - - i->width = 0; - i->width2 = 0; - i->height = 0; - i->height2 = 0; - i->antialize = 1; - i->multiply = 1; - i->zoom = 1; - - dev->setparameter = render_setparameter; - dev->startpage = render_startpage; - dev->startclip = render_startclip; - dev->endclip = render_endclip; - dev->stroke = render_stroke; - dev->fill = render_fill; - dev->fillbitmap = render_fillbitmap; - dev->fillgradient = render_fillgradient; - dev->addfont = render_addfont; - dev->drawchar = render_drawchar; - dev->drawlink = render_drawlink; - dev->endpage = render_endpage; - dev->finish = render_finish; -} - - -gfxdevice_t* gfxdevice_render_new() -{ - gfxdevice_t* d = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_render_init(d); - return d; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/render.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/render.h deleted file mode 100644 index 589f2a5b2..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/render.h +++ /dev/null @@ -1,39 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __render_h__ -#define __render_h__ - -#include "../gfxdevice.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_render_init(gfxdevice_t*); -gfxdevice_t* gfxdevice_render_new(); - -#ifdef __cplusplus -} -#endif - -#endif //__swfoutput_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.c deleted file mode 100644 index 413a54299..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.c +++ /dev/null @@ -1,340 +0,0 @@ -/* rescale.c - - Part of the swftools package. - - Copyright (c) 2006 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#ifndef WIN32 -#include -#endif -#include -#include -#include -#include "rescale.h" -#include "../types.h" -#include "../mem.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" - -typedef struct _internal { - gfxdevice_t*out; - int origwidth; - int origheight; - int targetwidth; - int targetheight; - int centerx, centery; - gfxmatrix_t matrix; - double zoomwidth; - int keepratio; -} internal_t; - -static int verbose = 1; -static void dbg(char*format, ...) -{ - if(!verbose) - return; - char buf[1024]; - int l; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - printf("(device-rescale) %s\n", buf); - fflush(stdout); -} - -char gfxline_isRect(gfxline_t*line) -{ - return 1; - if(!line) - return 0; - double x1=line->x,y1=line->x,x2=line->x,y2=line->y; - int nx1=0,nx2=0,ny1=0,ny2=0; - line = line->next; - while(line) { - if(line->type != gfx_lineTo) - return 0; - if(line->x < x1) { - x1 = line->x; - nx1++; - } else if(line->y < y1) { - y1 = line->y; - ny1++; - } else if(line->x > x2) { - x2 = line->x; - nx2++; - } else if(line->y > y1) { - y2 = line->y; - ny2++; - } - line = line->next; - } - return (nx1+nx2)==1 && (ny1+ny2)==1; -} - -gfxline_t*transformgfxline(internal_t*i, gfxline_t*line) -{ - /* special case: transformed rectangle - if(gfxline_isRect(line)) { - gfxbbox_t bbox = gfxline_getbbox(line); - if(fabs(bbox.xmin)<0.1 && fabs(bbox.ymin)<0.1 && - fabs(bbox.ymax-i->origwidth)<0.1 && fabs(bbox.ymax-i->origheight)<0.1) { - gfxline_t r[5]; - r[0].x = 0; r[0].y = 0; r[0].type = gfx_moveTo;r[0].next = &r[1]; - r[1].x = i->targetwidth;r[1].y = 0; r[1].type = gfx_lineTo;r[1].next = &r[2]; - r[2].x = i->targetwidth;r[2].y = i->targetheight;r[2].type = gfx_lineTo;r[2].next = &r[3]; - r[3].x = 0; r[3].y = i->targetheight;r[3].type = gfx_lineTo;r[3].next = &r[4]; - r[4].x = 0; r[4].y = 0; r[4].type = gfx_lineTo;r[4].next = 0; - return gfxline_clone(r); - } - } */ - gfxline_t*line2 = gfxline_clone(line); - gfxline_transform(line2, &i->matrix); - return line2; -} - -int rescale_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - if(!strcmp(key, "keepratio")) { - i->keepratio = atoi(value); - return 1; - } else if(!strcmp(key, "centerx")) { - i->centerx = atoi(value); - return 1; - } else if(!strcmp(key, "centery")) { - i->centery = atoi(value); - return 1; - } else { - if(i->out) { - return i->out->setparameter(i->out,key,value); - } else { - return 0; - } - } -} - -void rescale_startpage(gfxdevice_t*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - - i->origwidth = width; - i->origheight = height; - - if(i->targetwidth || i->targetheight) { - int targetwidth = i->targetwidth; - if(!targetwidth) - targetwidth = width*i->targetheight/height; - int targetheight = i->targetheight; - if(!targetheight) - targetheight = height*i->targetwidth/width; - if(i->keepratio) { - double rx = (double)targetwidth / (double)width; - double ry = (double)targetheight / (double)height; - if(rxmatrix.m00 = rx; - i->matrix.m11 = rx; - i->matrix.tx = 0; - if(i->centery) { - i->matrix.ty = (targetheight - height*rx) / 2; - } - } else { - i->matrix.m00 = ry; - i->matrix.m11 = ry; - if(i->centerx) { - i->matrix.tx = (targetwidth - width*ry) / 2; - } - i->matrix.ty = 0; - } - } else { - i->matrix.m00 = (double)targetwidth / (double)width; - i->matrix.m11 = (double)targetheight / (double)height; - } - i->zoomwidth = sqrt(i->matrix.m00*i->matrix.m11); - i->out->startpage(i->out,targetwidth,targetheight); - } else { - i->out->startpage(i->out,(int)(width*i->matrix.m00),(int)(height*i->matrix.m11)); - } -} - -void rescale_startclip(gfxdevice_t*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - gfxline_t*line2 = transformgfxline(i, line); - i->out->startclip(i->out,line2); - gfxline_free(line2); -} - -void rescale_endclip(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->endclip(i->out); -} - -void rescale_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - gfxline_t*line2 = transformgfxline(i, line); - i->out->stroke(i->out, line2, width*i->zoomwidth, color, cap_style, joint_style, miterLimit); - gfxline_free(line2); -} - -void rescale_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - gfxline_t*line2 = transformgfxline(i, line); - i->out->fill(i->out, line2, color); - gfxline_free(line2); -} - -void rescale_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - gfxline_t*line2 = transformgfxline(i, line); - gfxmatrix_t m2; - gfxmatrix_multiply(&i->matrix, matrix, &m2); - i->out->fillbitmap(i->out, line2, img, &m2, cxform); - gfxline_free(line2); -} - -void rescale_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - gfxline_t*line2 = transformgfxline(i, line); - i->out->fillgradient(i->out, line2, gradient, type, matrix); - gfxline_free(line2); -} - -void rescale_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->addfont(i->out, font); -} - -void rescale_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - gfxmatrix_t m2; - gfxmatrix_multiply(&i->matrix, matrix, &m2); - i->out->drawchar(i->out, font, glyphnr, color, &m2); -} - -void rescale_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) -{ - internal_t*i = (internal_t*)dev->internal; - gfxline_t*line2 = transformgfxline(i, line); - i->out->drawlink(i->out, line2, action, text); - gfxline_free(line2); -} - -void rescale_endpage(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->endpage(i->out); -} - -gfxresult_t* rescale_finish(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - gfxdevice_t*out = i->out; - free(dev->internal);dev->internal = 0;i=0; - if(out) { - return out->finish(out); - } else { - return 0; - } -} - -void gfxdevice_rescale_init(gfxdevice_t*dev, gfxdevice_t*out, int width, int height, double scale) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "rescale"; - - dev->internal = i; - - dev->setparameter = rescale_setparameter; - dev->startpage = rescale_startpage; - dev->startclip = rescale_startclip; - dev->endclip = rescale_endclip; - dev->stroke = rescale_stroke; - dev->fill = rescale_fill; - dev->fillbitmap = rescale_fillbitmap; - dev->fillgradient = rescale_fillgradient; - dev->addfont = rescale_addfont; - dev->drawchar = rescale_drawchar; - dev->drawlink = rescale_drawlink; - dev->endpage = rescale_endpage; - dev->finish = rescale_finish; - - gfxmatrix_unit(&i->matrix); - i->targetwidth = width; - i->targetheight = height; - i->zoomwidth = 1.0; - i->centerx = 1; - - i->matrix.m00 = scale; - i->matrix.m01 = 0; - i->matrix.m11 = scale; - i->matrix.m10 = 0; - i->matrix.tx = 0; - i->matrix.ty = 0; - i->zoomwidth = scale; - - i->out = out; -} - -void gfxdevice_rescale_setzoom(gfxdevice_t*dev, double scale) -{ - internal_t*i = (internal_t*)dev->internal; - if(strcmp(dev->name, "rescale")) { - fprintf(stderr, "Internal error: can't cast device %s to a rescale device\n", dev->name); - return; - } - i->matrix.m00 = scale; - i->matrix.m01 = 0; - i->matrix.m11 = scale; - i->matrix.m10 = 0; - i->matrix.tx = 0; - i->matrix.ty = 0; - i->zoomwidth = scale; -} -void gfxdevice_rescale_setdevice(gfxdevice_t*dev, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)dev->internal; - if(strcmp(dev->name, "rescale")) { - fprintf(stderr, "Internal error: can't cast device %s to a rescale device\n", dev->name); - return; - } - i->out = out; -} - -gfxdevice_t* gfxdevice_rescale_new(gfxdevice_t*out, int width, int height, double scale) -{ - gfxdevice_t* d = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_rescale_init(d, out, width, height, scale); - return d; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.h deleted file mode 100644 index b8ca6bb75..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/rescale.h +++ /dev/null @@ -1,47 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_rescale_h__ -#define __gfxdevice_rescale_h__ - -#include "../gfxdevice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* either: - width,height = desired output size - or: - scale = desired zoom factor -*/ -void gfxdevice_rescale_init(gfxdevice_t*dev, gfxdevice_t*out, int width, int height, double scale); -gfxdevice_t* gfxdevice_rescale_new(gfxdevice_t*out, int width, int height, double scale); - -void gfxdevice_rescale_setzoom(gfxdevice_t*dev, double scale); -void gfxdevice_rescale_setdevice(gfxdevice_t*dev, gfxdevice_t*out); - - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_rescale_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.c deleted file mode 100644 index 74d124ce2..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.c +++ /dev/null @@ -1,3178 +0,0 @@ -/* gfxdevice_swf.c - - Part of the swftools package. - - Copyright (c) 2001,2002,2003,2004,2005 Matthias Kramm - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../../config.h" -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_IO_H -#include -#endif -#ifdef HAVE_ASSERT_H -#include -#else -#define assert(a) -#endif -#include -#include "../mem.h" -#include "../log.h" -#include "../rfxswf.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "swf.h" -#include "../gfxpoly.h" -#include "../gfximage.h" - -#define CHARDATAMAX 1024 -#define CHARMIDX 0 -#define CHARMIDY 0 - -typedef struct _charatposition { - int charid; - SWFFONT*font; - int x; - int y; - int size; - RGBA color; -} charatposition_t; - -typedef struct _chararray { - charatposition_t chr[CHARDATAMAX+1]; - int pos; - struct _chararray *next; -} chararray_t; - -typedef struct _charbuffer { - MATRIX matrix; - chararray_t*array; - chararray_t*last; - struct _charbuffer *next; -} charbuffer_t; - -typedef struct _fontlist -{ - SWFFONT *swffont; - struct _fontlist*next; -} fontlist_t; - -typedef long int twip; - -typedef struct _swfmatrix { - double m11,m12,m21,m22,m31,m32; -} swfmatrix_t; - -typedef struct _swfoutput_internal -{ - gfxdevice_t*dev; // the gfxdevice object where this internal struct resides - - double config_dumpfonts; - double config_ppmsubpixels; - double config_jpegsubpixels; - char hasbuttons; - int config_invisibletexttofront; - int config_dots; - int config_simpleviewer; - int config_opennewwindow; - int config_ignoredraworder; - int config_drawonlyshapes; - int config_frameresets; - int config_linknameurl; - int config_jpegquality; - int config_storeallcharacters; - int config_enablezlib; - int config_insertstoptag; - int config_showimages; - int config_watermark; - int config_noclips; - int config_flashversion; - int config_reordertags; - int config_showclipshapes; - int config_splinemaxerror; - int config_fontsplinemaxerror; - int config_filloverlap; - int config_protect; - int config_bboxvars; - int config_disable_polygon_conversion; - int config_normalize_polygon_positions; - int config_alignfonts; - double config_override_line_widths; - double config_remove_small_polygons; - char config_disablelinks; - RGBA config_linkcolor; - float config_minlinewidth; - double config_caplinewidth; - char* config_linktarget; - char*config_internallinkfunction; - char*config_externallinkfunction; - char config_animate; - double config_framerate; - - SWF* swf; - - fontlist_t* fontlist; - - char storefont; - - MATRIX page_matrix; - - TAG *tag; - int currentswfid; - int startids; - int depth; - int startdepth; - int linewidth; - - SHAPE* shape; - int shapeid; - int textmode; - - int watermarks; - - int fillstyleid; - int linestyleid; - int swflastx; - int swflasty; - int lastwasfill; - int shapeisempty; - char fill; - int min_x,max_x; - int min_y,max_y; - TAG* cliptags[128]; - int clipshapes[128]; - U32 clipdepths[128]; - int clippos; - - /* image cache */ - /* - int pic_xids[1024]; - int pic_yids[1024]; - int pic_ids[1024]; - int pic_width[1024]; - int pic_height[1024]; - int picpos; - */ - - int frameno; - int lastframeno; - - char fillstylechanged; - - int jpeg; //next image type - - int bboxrectpos; - SRECT bboxrect; - - SRECT pagebbox; - - gfxline_t*stored_clipshapes; //for config_showclipshapes - - charbuffer_t* chardata; - charbuffer_t* topchardata; //chars supposed to be above everything else - - int firstpage; - char pagefinished; - - char overflow; - - int current_font_size; - MATRIX fontmatrix; - double lastfontm11,lastfontm12,lastfontm21,lastfontm22; - SWFFONT *swffont; - RGBA strokergb; - RGBA fillrgb; - int drawmode; - - int shapeposx; - int shapeposy; - - char* mark; - -} swfoutput_internal; - -static const int NO_FONT3=0; - -static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform); -static int swf_setparameter(gfxdevice_t*driver, const char*key, const char*value); -static void swf_drawstroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit); -static void swf_startclip(gfxdevice_t*dev, gfxline_t*line); -static void swf_endclip(gfxdevice_t*dev); -static void swf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit); -static void swf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color); -static void swf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix); -static void swf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); -static void swf_addfont(gfxdevice_t*dev, gfxfont_t*font); -static void swf_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text); -static void swf_startframe(gfxdevice_t*dev, int width, int height); -static void swf_endframe(gfxdevice_t*dev); -static void swfoutput_namedlink(gfxdevice_t*dev, char*name, gfxline_t*points); -static void swfoutput_linktopage(gfxdevice_t*dev, int page, gfxline_t*points); -static void swfoutput_linktourl(gfxdevice_t*dev, const char*url, gfxline_t*points); - -static gfxresult_t* swf_finish(gfxdevice_t*driver); - -static swfoutput_internal* init_internal_struct() -{ - swfoutput_internal*i = (swfoutput_internal*)malloc(sizeof(swfoutput_internal)); - memset(i, 0, sizeof(swfoutput_internal)); - - i->storefont = 0; - i->currentswfid = 0; - i->depth = 0; - i->overflow = 0; - i->startdepth = 0; - i->linewidth = 0; - i->shapeid = -1; - i->textmode = 0; - i->frameno = 0; - i->lastframeno = 0; - - i->mark = 0; - - i->fillstyleid; - i->linestyleid; - i->swflastx=0; - i->swflasty=0; - i->lastwasfill = 0; - i->shapeisempty = 1; - i->fill = 0; - i->clippos = 0; - - i->fillstylechanged = 0; - - i->bboxrectpos = -1; - i->chardata = 0; - i->firstpage = 1; - i->pagefinished = 1; - - i->config_disablelinks=0; - i->config_dumpfonts=0; - i->config_ppmsubpixels=0; - i->config_jpegsubpixels=0; - i->config_opennewwindow=1; - i->config_ignoredraworder=0; - i->config_drawonlyshapes=0; - i->config_jpegquality=85; - i->config_storeallcharacters=0; - i->config_dots=1; - i->config_enablezlib=0; - i->config_insertstoptag=0; - i->config_flashversion=6; - i->config_framerate=0.25; - i->config_splinemaxerror=1; - i->config_fontsplinemaxerror=1; - i->config_filloverlap=0; - i->config_protect=0; - i->config_bboxvars=0; - i->config_override_line_widths=0; - i->config_showclipshapes=0; - i->config_minlinewidth=0.05; - i->config_caplinewidth=1; - i->config_linktarget=0; - i->config_internallinkfunction=0; - i->config_externallinkfunction=0; - i->config_reordertags=1; - i->config_linknameurl=0; - - i->config_linkcolor.r = i->config_linkcolor.g = i->config_linkcolor.b = 255; - i->config_linkcolor.a = 0x40; - - return i; -}; - -static int id_error = 0; - -static U16 getNewID(gfxdevice_t* dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->currentswfid == 65535) { - if(!id_error) { - msg(" ID Table overflow"); - msg(" This file is too complex to render- SWF only supports 65536 shapes at once"); - } - id_error=1; - i->overflow = 1; - exit(1); - } - return ++i->currentswfid; -} -static U16 getNewDepth(gfxdevice_t* dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->depth == 65520) { - if(!id_error) { - msg(" Depth Table overflow"); - msg(" This file is too complex to render- SWF only supports 65536 shapes at once"); - } - id_error=1; - i->overflow = 1; - exit(1); - } - return ++i->depth; -} - -static void startshape(gfxdevice_t* dev); -static void starttext(gfxdevice_t* dev); -static void endshape(gfxdevice_t* dev); -static void endtext(gfxdevice_t* dev); - -typedef struct _plotxy -{ - double x,y; -} plotxy_t; - -static inline int twipsnap(double f) -{ - /* if(f < -0x40000000/20.0) { - fprintf(stderr, "Warning: Coordinate underflow (%f)\n", f); - f = -0x40000000/20.0; - } else if(f>0x3fffffff/20.0) { - fprintf(stderr, "Warning: Coordinate overflow (%f)\n", f); - f = 0x3fffffff/20.0; - }*/ - - /* clamp coordinates to a rectangle with the property that we - can represent a line from the upper left corner to the upper - right corner using no more than 64 strokes */ - const double min = -(1<<(18+4))/20.0; - const double max = ((1<<(18+4))-1)/20.0; - if(f < min) { - fprintf(stderr, "Warning: Coordinate underflow (%f)\n", f); - f = min; - } else if(f>max) { - fprintf(stderr, "Warning: Coordinate overflow (%f)\n", f); - f = max; - } - - return (int)(f*20); -} - -// write a move-to command into the swf -static int movetoxy(gfxdevice_t*dev, TAG*tag, plotxy_t p0) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - int rx = twipsnap(p0.x); - int ry = twipsnap(p0.y); - if(rx!=i->swflastx || ry!=i->swflasty || i->fillstylechanged) { - swf_ShapeSetMove (tag, i->shape, rx,ry); - i->fillstylechanged = 0; - i->swflastx=rx; - i->swflasty=ry; - return 1; - } - return 0; -} -static int moveto(gfxdevice_t*dev, TAG*tag, double x, double y) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - plotxy_t p; - p.x = x; - p.y = y; - return movetoxy(dev, tag, p); -} -static void addPointToBBox(gfxdevice_t*dev, int px, int py) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - SPOINT p; - p.x = px; - p.y = py; - if(i->fill) { - swf_ExpandRect(&i->bboxrect, p); - } else { - swf_ExpandRect3(&i->bboxrect, p, i->linewidth*3/2); - } -} - -/*static void plot(gfxdevice_t*dev, int x, int y, TAG*tag) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - int width = i->linewidth/4; - if(width > 5) - width = 5; - ////square - //swf_ShapeSetLine(tag, i->shape,-width,-width); - //swf_ShapeSetLine(tag, i->shape,width*2,0); - //swf_ShapeSetLine(tag, i->shape,0,width*2); - //swf_ShapeSetLine(tag, i->shape,-width*2,0); - //swf_ShapeSetLine(tag, i->shape,0,-width*2); - //swf_ShapeSetLine(tag, i->shape,width,width); - - // diamond - swf_ShapeSetLine(tag, i->shape,-width,0); - swf_ShapeSetLine(tag, i->shape,width,-width); - swf_ShapeSetLine(tag, i->shape,width,width); - swf_ShapeSetLine(tag, i->shape,-width,width); - swf_ShapeSetLine(tag, i->shape,-width,-width); - swf_ShapeSetLine(tag, i->shape,width,0); - - addPointToBBox(dev, x-width ,y-width); - addPointToBBox(dev, x+width ,y+width); -}*/ - -// write a line-to command into the swf -static void linetoxy(gfxdevice_t*dev, TAG*tag, plotxy_t p0) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - int px = twipsnap(p0.x); - int py = twipsnap(p0.y); - int rx = (px-i->swflastx); - int ry = (py-i->swflasty); - if(rx|ry) { - swf_ShapeSetLine (tag, i->shape, rx,ry); - addPointToBBox(dev, i->swflastx,i->swflasty); - addPointToBBox(dev, px,py); - } /* this is a nice idea, but doesn't work with current flash - players (the pixel will be invisible if they're not - precisely on a pixel boundary) - Besides, we should only do this if this lineto itself - is again followed by a "move". - else if(!i->fill && i->config_dots) { - // treat lines of length 0 as plots, making them - // at least 1 twip wide so Flash will display them - //plot(dev, i->swflastx, i->swflasty, tag); - swf_ShapeSetLine (tag, i->shape, rx+1,ry); - }*/ - - i->shapeisempty = 0; - i->swflastx+=rx; - i->swflasty+=ry; -} -static void lineto(gfxdevice_t*dev, TAG*tag, double x, double y) -{ - plotxy_t p; - p.x = x; - p.y = y; - linetoxy(dev,tag, p); -} - -// write a spline-to command into the swf -static void splineto(gfxdevice_t*dev, TAG*tag, plotxy_t control,plotxy_t end) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - int lastlastx = i->swflastx; - int lastlasty = i->swflasty; - - int cx = (twipsnap(control.x)-i->swflastx); - int cy = (twipsnap(control.y)-i->swflasty); - i->swflastx += cx; - i->swflasty += cy; - int ex = (twipsnap(end.x)-i->swflastx); - int ey = (twipsnap(end.y)-i->swflasty); - i->swflastx += ex; - i->swflasty += ey; - - if((cx || cy) && (ex || ey)) { - swf_ShapeSetCurve(tag, i->shape, cx,cy,ex,ey); - addPointToBBox(dev, lastlastx ,lastlasty ); - addPointToBBox(dev, lastlastx+cx,lastlasty+cy); - addPointToBBox(dev, lastlastx+cx+ex,lastlasty+cy+ey); - } else if(cx || cy || ex || ey) { - swf_ShapeSetLine(tag, i->shape, cx+ex,cy+ey); - addPointToBBox(dev, lastlastx ,lastlasty ); - addPointToBBox(dev, lastlastx+cx,lastlasty+cy); - addPointToBBox(dev, lastlastx+cx+ex,lastlasty+cy+ey); - } - - i->shapeisempty = 0; -} - -/* write a line, given two points and the transformation - matrix. */ -/*static void line(gfxdevice_t*dev, TAG*tag, plotxy_t p0, plotxy_t p1) -{ - moveto(dev, tag, p0); - lineto(dev, tag, p1); -}*/ - -void resetdrawer(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - i->swflastx = 0; - i->swflasty = 0; -} - -static void stopFill(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->lastwasfill!=0) - { - swf_ShapeSetStyle(i->tag,i->shape,i->linestyleid,0x8000,0); - i->fillstylechanged = 1; - i->lastwasfill = 0; - } -} -static void startFill(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->lastwasfill!=1) - { - swf_ShapeSetStyle(i->tag,i->shape,0x8000,i->fillstyleid,0); - i->fillstylechanged = 1; - i->lastwasfill = 1; - } -} - -static inline int colorcompare(RGBA*a,RGBA*b) -{ - - if(a->r!=b->r || - a->g!=b->g || - a->b!=b->b || - a->a!=b->a) { - return 0; - } - return 1; -} - -static SRECT getcharacterbbox(chararray_t*chardata, MATRIX* m, int flashversion) -{ - SRECT r; - char debug = 0; - memset(&r, 0, sizeof(r)); - - int t; - if(debug) printf("\n"); - - double div = 1.0 / 1024.0; - if(flashversion>=8 && !NO_FONT3) { - div = 1.0 / 20480.0; - } - - while(chardata) { - for(t=0;tpos;t++) { - charatposition_t*chr = &chardata->chr[t]; - SRECT b = chr->font->layout->bounds[chr->charid]; - b.xmin = floor((b.xmin*(double)chr->size) *div); - b.ymin = floor((b.ymin*(double)chr->size) *div); - b.xmax = ceil((b.xmax*(double)chr->size) *div); - b.ymax = ceil((b.ymax*(double)chr->size) *div); - - b.xmin += chr->x; - b.ymin += chr->y; - b.xmax += chr->x; - b.ymax += chr->y; - - /* until we solve the INTERNAL_SCALING problem (see below) - make sure the bounding box is big enough */ - b.xmin -= 20; - b.ymin -= 20; - b.xmax += 20; - b.ymax += 20; - - b = swf_TurnRect(b, m); - - if(debug) printf("(%f,%f,%f,%f) -> (%f,%f,%f,%f) [font %d, char %d]\n", - chr->font->layout->bounds[chr->charid].xmin/20.0, - chr->font->layout->bounds[chr->charid].ymin/20.0, - chr->font->layout->bounds[chr->charid].xmax/20.0, - chr->font->layout->bounds[chr->charid].ymax/20.0, - b.xmin/20.0, - b.ymin/20.0, - b.xmax/20.0, - b.ymax/20.0, - chr->font->id, - chr->charid); - swf_ExpandRect2(&r, &b); - } - chardata = chardata->next; - } - if(debug) printf("-----> (%f,%f,%f,%f)\n", - r.xmin/20.0, - r.ymin/20.0, - r.xmax/20.0, - r.ymax/20.0); - return r; -} - -static chararray_t*chararray_reverse(chararray_t*buf) -{ - chararray_t*prev = 0; - while(buf) { - chararray_t*next = buf->next; - buf->next = prev; - prev = buf; - buf = next; - } - return prev; -} - -static void chararray_writetotag(chararray_t*_chardata, TAG*tag) -{ - SWFFONT font; - RGBA color; - color.r = _chardata?_chardata->chr[0].color.r^255:0; - color.g = 0; - color.b = 0; - color.a = 0; - SWFFONT*lastfont; - int lastx; - int lasty; - int lastsize; - int lastchar; - int charids[128]; - int charadvance[128]; - int charstorepos; - int pass; - int glyphbits=1; //TODO: can this be zero? - int advancebits=1; - - if(tag->id != ST_DEFINETEXT && - tag->id != ST_DEFINETEXT2) { - msg(" internal error: charbuffer_put needs an text tag, not %d\n",tag->id); - exit(1); - } - if(!_chardata) { - msg(" charbuffer_put called with zero characters"); - } - - for(pass = 0; pass < 2; pass++) - { - charstorepos = 0; - lastfont = 0; - lastx = CHARMIDX; - lasty = CHARMIDY; - lastsize = -1; - lastchar = -1; - - if(pass==1) - { - advancebits++; // add sign bit - swf_SetU8(tag, glyphbits); - swf_SetU8(tag, advancebits); - } - - chararray_t*chardata = _chardata; - - while(chardata) { - int t; - - assert(!chardata->next || chardata->pos == CHARDATAMAX); - assert(chardata->pos); - - int to = chardata->next?chardata->pos-1:chardata->pos; - - for(t=0;t<=to;t++) - { - char islast = t==chardata->pos; - - charatposition_t*chr = &chardata->chr[t]; - - if(lastfont != chr->font || - lastx!=chr->x || - lasty!=chr->y || - !colorcompare(&color, &chardata->chr[t].color) || - charstorepos==127 || - lastsize != chardata->chr[t].size || - islast) - { - if(charstorepos && pass==0) - { - int s; - for(s=0;s=(1<=(1<writeBit = 0; // Q&D - swf_SetBits(tag, 0, 1); // GLYPH Record - swf_SetBits(tag, charstorepos, 7); // number of glyphs - int s; - for(s=0;sx || - lasty != chr->y) - { - newx = chr->x; - newy = chr->y; - if(newx == 0) - newx = SET_TO_ZERO; - if(newy == 0) - newy = SET_TO_ZERO; - } - if(!colorcompare(&color, &chr->color)) - { - color = chr->color; - newcolor = &color; - } - font.id = chr->font->id; - if(lastfont != chr->font || lastsize != chr->size) - newfont = &font; - - tag->writeBit = 0; // Q&D - swf_TextSetInfoRecord(tag, newfont, chr->size, newcolor, newx, newy); - } - - lastfont = chr->font; - lastx = chr->x; - lasty = chr->y; - lastsize = chr->size; - } - - if(islast) - break; - - int nextx = chr->x; - if(tpos-1) nextx = chardata->chr[t+1].x; - if(t==chardata->pos-1 && chardata->next) nextx = chardata->next->chr[0].x; - int dx = nextx-chr->x; - - int advance; - if(dx>=0 && (dx<(1<<(advancebits-1)) || pass==0)) { - advance = dx; - lastx=nextx; - } else { - advance = 0; - lastx=chr->x; - } - - charids[charstorepos] = chr->charid; - charadvance[charstorepos] = advance; - lastchar = chr->charid; - charstorepos ++; - } - chardata = chardata->next; - } - } -} - -static void chararray_destroy(chararray_t*chr) -{ - while(chr) { - chararray_t*next = chr->next; - chr->next = 0; - free(chr); - chr = next; - } -} - -static inline int matrix_diff(MATRIX*m1, MATRIX*m2) -{ - return memcmp(m1,m2,sizeof(MATRIX)); -} -static charbuffer_t*charbuffer_append(charbuffer_t*buf, SWFFONT*font, int charid, int x,int y, int size, RGBA color, MATRIX*m) -{ - if(!buf || matrix_diff(&buf->matrix,m)) { - charbuffer_t*n = rfx_calloc(sizeof(charbuffer_t)); - n->matrix = *m; - n->next = buf; - buf = n; - } - if(!buf->last || buf->last->pos == CHARDATAMAX) { - chararray_t*n = rfx_calloc(sizeof(chararray_t)); - if(!buf->array) { - buf->array = buf->last = n; - } else { - buf->last->next = n; - buf->last = n; - } - } - chararray_t*a = buf->last; - a->chr[a->pos].font = font; - a->chr[a->pos].charid = charid; - a->chr[a->pos].x = x; - a->chr[a->pos].y = y; - a->chr[a->pos].color = color; - a->chr[a->pos].size = size; - a->pos++; - return buf; -} - -/* Notice: we can only put chars in the range -1639,1638 (-32768/20,32768/20). - So if we set this value to high, the char coordinates will overflow. - If we set it to low, however, the char positions will be inaccurate */ -#define GLYPH_SCALE 1 - -static void chararray_writetodev(gfxdevice_t*dev, chararray_t*array, MATRIX*matrix, char invisible) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - int textid = getNewID(dev); - i->tag = swf_InsertTag(i->tag,ST_DEFINETEXT2); - swf_SetU16(i->tag, textid); - SRECT r; - r = getcharacterbbox(array, matrix, i->config_flashversion); - r = swf_ClipRect(i->pagebbox, r); - swf_SetRect(i->tag,&r); - swf_SetMatrix(i->tag, matrix); - msg(" Placing text as ID %d", textid); - chararray_writetotag(array, i->tag); - i->chardata = 0; - - swf_SetU8(i->tag,0); - - if(i->swf->fileVersion >= 8) { - i->tag = swf_InsertTag(i->tag, ST_CSMTEXTSETTINGS); - swf_SetU16(i->tag, textid); - - //swf_SetU8(i->tag, /*subpixel grid*/(2<<3)|/*flashtype*/0x40); - swf_SetU8(i->tag, /*grid*/(1<<3)|/*flashtype*/0x40); - //swf_SetU8(i->tag, /*no grid*/(0<<3)|/*flashtype*/0x40); - - swf_SetU32(i->tag, 0);//thickness - swf_SetU32(i->tag, 0);//sharpness - //swf_SetU32(i->tag, 0x20000);//thickness - //swf_SetU32(i->tag, 0x800000);//sharpness - swf_SetU8(i->tag, 0);//reserved - } - if(invisible && i->config_flashversion>=8) { - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT3); - swf_ObjectPlaceBlend(i->tag,textid,getNewDepth(dev),&i->page_matrix,NULL,NULL,BLENDMODE_MULTIPLY); - } else { - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - swf_ObjectPlace(i->tag,textid,getNewDepth(dev),&i->page_matrix,NULL,NULL); - } -} - -static void charbuffer_writetodevandfree(gfxdevice_t*dev, charbuffer_t*buf, char invisible) -{ - while(buf) { - charbuffer_t*next = buf->next;buf->next = 0; - chararray_writetodev(dev, buf->array, &buf->matrix, invisible); - chararray_destroy(buf->array); - free(buf); - buf = next; - } -} - -static void endtext(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(!i->textmode) - return; - charbuffer_writetodevandfree(dev, i->chardata, 0);i->chardata = 0; - i->textmode = 0; -} - -static int watermark2_width=47; -static int watermark2_height=11; -static int watermark2[47] = {95,1989,71,0,2015,337,1678,0,2015,5,1921,320,1938,25,2006,1024, - 1042,21,13,960,1039,976,8,2000,1359,1088,31,1989,321,1728,0,1152, - 1344,832,0,1984,0,896,1088,1088,896,0,1984,128,256,512,1984}; - -static void draw_watermark(gfxdevice_t*dev, gfxbbox_t r, char drawall) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - double wx = r.xmax / 5.0; - double tx = r.xmax*4.0 / 5.0; - double ty = r.ymax-wx*watermark2_height/watermark2_width; - double sx = (r.xmax - tx) / watermark2_width; - double sy = (r.ymax - ty) / watermark2_height; - double px = sx-0.5; - double py = sy-0.5; - if(ty > 0 && px > 1.0 && py > 1.0) { - int x,y; - for(y=0;y>y)&1)) { - if(!drawall && rand()%5) - continue; - unsigned int b = rand(); - moveto(dev, i->tag, x*sx+tx+((b>>1)&1)/20.0, y*sy+ty+((b>>3)&1)/20.0); - lineto(dev, i->tag, x*sx+px+tx+((b>>2)&1)/20.0, y*sy+ty+((b>>3)&1)/20.0); - lineto(dev, i->tag, x*sx+px+tx+((b>>2)&1)/20.0, y*sy+py+ty+((b>>4)&1)/20.0); - lineto(dev, i->tag, x*sx+tx+((b>>1)&1)/20.0, y*sy+py+ty+((b>>4)&1)/20.0); - lineto(dev, i->tag, x*sx+tx+((b>>1)&1)/20.0, y*sy+ty+((b>>3)&1)/20.0); - } - } - } -} - -static void swfoutput_setfillcolor(gfxdevice_t* dev, U8 r, U8 g, U8 b, U8 a) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->fillrgb.r == r && - i->fillrgb.g == g && - i->fillrgb.b == b && - i->fillrgb.a == a) return; - if(i->shapeid>=0) - endshape(dev); - - i->fillrgb.r = r; - i->fillrgb.g = g; - i->fillrgb.b = b; - i->fillrgb.a = a; -} -static void insert_watermark(gfxdevice_t*dev, char drawall) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(!drawall && i->watermarks>20) - return; - endshape(dev); - endtext(dev); - - if(drawall) { - swfoutput_setfillcolor(dev, 0,0,255,192); - } else { - swfoutput_setfillcolor(dev, rand(),rand(),rand(),(rand()&127)+128); - } - startshape(dev); - startFill(dev); - - gfxbbox_t r; r.xmin = r.ymin = 0; - r.xmax = i->max_x; - r.ymax = i->max_y; - draw_watermark(dev, r, drawall); - endshape(dev); - i->watermarks++; -} - -static void drawoutline(gfxdevice_t*dev, gfxline_t*line); - -static void endpage(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->pagefinished) - return; - - if(i->shapeid>=0) - endshape(dev); - if(i->textmode) - endtext(dev); - if(i->topchardata) { - charbuffer_writetodevandfree(dev, i->topchardata, 1); - i->topchardata=0; - } - - while(i->clippos) - dev->endclip(dev); - - if(i->stored_clipshapes) { - // in case of config_showclipshapes - drawoutline(dev, i->stored_clipshapes); - } - - if(i->config_watermark) { - insert_watermark(dev, 1); - } - - i->pagefinished = 1; -} - -static void addViewer(gfxdevice_t* dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - SHAPE*s; - RGBA button_colors[3]= {{0xbf,0x00,0x00,0x80},{0xbf,0x20,0x20,0xc0}, {0xbf,0xc0,0xc0,0xff}}; - int ids[6]; - int button_sizex = 20; - int button_sizey = 20; - int t; - RGBA black = {255,0,0,0}; - for(t=0;t<6;t++) { - i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); - swf_ShapeNew(&s); - int ls1 = swf_ShapeAddLineStyle(s,40,&black); - int fs1 = swf_ShapeAddSolidFillStyle(s,&button_colors[t/2]); - int shapeid = ids[t] = getNewID(dev); - swf_SetU16(i->tag,shapeid); - SRECT r; - r.xmin = -20*button_sizex; - r.xmax = 20*button_sizex; - r.ymin = 0; - r.ymax = 40*button_sizey; - swf_SetRect(i->tag,&r); // set shape bounds - swf_SetShapeHeader(i->tag,s); // write all styles to tag - swf_ShapeSetAll(i->tag,s,0*button_sizex,0,ls1,fs1,0); - swf_ShapeSetLine(i->tag,s,(1-(t&1)*2)*20*button_sizex,20*button_sizey); - swf_ShapeSetLine(i->tag,s,-(1-(t&1)*2)*20*button_sizex,20*button_sizey); - swf_ShapeSetLine(i->tag,s,0,-40*button_sizey); - swf_ShapeSetEnd(i->tag); // finish drawing - swf_ShapeFree(s); // clean shape structure (which isn't needed anymore after writing the tag) - } - ActionTAG*a1=0,*a2=0,*a3=0; - a1 = action_NextFrame(a1); - a1 = action_Stop(a1); - a1 = action_End(a1); - - a2 = action_PreviousFrame(a2); - a2 = action_Stop(a2); - a2 = action_End(a2); - - a3 = action_Stop(a3); - a3 = action_End(a3); - - i->tag = swf_InsertTag(i->tag, ST_DOACTION); - swf_ActionSet(i->tag,a3); - - i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON); - int buttonid1 = getNewID(dev); - swf_SetU16(i->tag, buttonid1); - swf_ButtonSetRecord(i->tag,BS_UP|BS_HIT,ids[0],1,NULL,NULL); - swf_ButtonSetRecord(i->tag,BS_OVER,ids[2],1,NULL,NULL); - swf_ButtonSetRecord(i->tag,BS_DOWN,ids[4],1,NULL,NULL); - swf_SetU8(i->tag,0); // end of button records - swf_ActionSet(i->tag,a1); - - i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON); - int buttonid2 = getNewID(dev); - swf_SetU16(i->tag, buttonid2); - swf_ButtonSetRecord(i->tag,BS_UP|BS_HIT,ids[1],1,NULL,NULL); - swf_ButtonSetRecord(i->tag,BS_OVER,ids[3],1,NULL,NULL); - swf_ButtonSetRecord(i->tag,BS_DOWN,ids[5],1,NULL,NULL); - swf_SetU8(i->tag,0); // end of button records - swf_ActionSet(i->tag,a2); - - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - MATRIX m; - swf_GetMatrix(0, &m); - m.tx = button_sizex*20+200; - swf_ObjectPlace(i->tag, buttonid2, 65534,&m,0,0); - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - m.tx = button_sizex*20+200+200; - swf_ObjectPlace(i->tag, buttonid1, 65535,&m,0,0); -} - - -void swf_startframe(gfxdevice_t*dev, int width, int height) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->firstpage) { - if(i->config_protect) { - i->tag = swf_InsertTag(i->tag, ST_PROTECT); - i->config_protect = 0; - } - if(i->config_simpleviewer) { - addViewer(dev); - } - } - - if(!i->firstpage && !i->pagefinished) - endpage(dev); - - msg(" Starting new SWF page of size %dx%d", width, height); - - swf_GetMatrix(0, &i->page_matrix); - i->page_matrix.tx = 0; - i->page_matrix.ty = 0; - i->min_x = 0; - i->min_y = 0; - i->max_x = width; - i->max_y = height; - i->watermarks = 0; - - /* create a bbox structure with the page size. This is used - for clipping shape and text bounding boxes. As we don't want to - generate bounding boxes which extend beyond the movie size (in - order to not confuse Flash), we clip everything against i->pagebbox */ - i->pagebbox.xmin = 0; - i->pagebbox.ymin = 0; - i->pagebbox.xmax = width*20; - i->pagebbox.ymax = height*20; - - /* increase SWF's bounding box */ - swf_ExpandRect2(&i->swf->movieSize, &i->pagebbox); - - i->lastframeno = i->frameno; - i->firstpage = 0; - i->pagefinished = 0; - i->chardata = 0; -} - -void swf_endframe(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - if(!i->pagefinished) - endpage(dev); - - if( (i->swf->fileVersion <= 8) && (i->config_insertstoptag) ) { - ActionTAG*atag=0; - atag = action_Stop(atag); - atag = action_End(atag); - i->tag = swf_InsertTag(i->tag,ST_DOACTION); - swf_ActionSet(i->tag,atag); - } - i->tag = swf_InsertTag(i->tag,ST_SHOWFRAME); - i->frameno ++; - - for(i->depth;i->depth>i->startdepth;i->depth--) { - i->tag = swf_InsertTag(i->tag,ST_REMOVEOBJECT2); - swf_SetU16(i->tag,i->depth); - } - i->depth = i->startdepth; - - if(i->config_frameresets) { - for(i->currentswfid;i->currentswfid>i->startids;i->currentswfid--) { - i->tag = swf_InsertTag(i->tag,ST_FREECHARACTER); - swf_SetU16(i->tag,i->currentswfid); - } - i->currentswfid = i->startids; - } -} - -static void setBackground(gfxdevice_t*dev, int x1, int y1, int x2, int y2) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - RGBA rgb; - rgb.a = rgb.r = rgb.g = rgb.b = 0xff; - SRECT r; - SHAPE* s; - int ls1=0,fs1=0; - int shapeid = getNewID(dev); - r.xmin = x1; - r.ymin = y1; - r.xmax = x2; - r.ymax = y2; - i->tag = swf_InsertTag(i->tag, ST_DEFINESHAPE); - swf_ShapeNew(&s); - fs1 = swf_ShapeAddSolidFillStyle(s, &rgb); - swf_SetU16(i->tag,shapeid); - swf_SetRect(i->tag,&r); - swf_SetShapeHeader(i->tag,s); - swf_ShapeSetAll(i->tag,s,x1,y1,ls1,fs1,0); - swf_ShapeSetLine(i->tag,s,(x2-x1),0); - swf_ShapeSetLine(i->tag,s,0,(y2-y1)); - swf_ShapeSetLine(i->tag,s,(x1-x2),0); - swf_ShapeSetLine(i->tag,s,0,(y1-y2)); - swf_ShapeSetEnd(i->tag); - swf_ShapeFree(s); - i->tag = swf_InsertTag(i->tag, ST_PLACEOBJECT2); - swf_ObjectPlace(i->tag,shapeid,getNewDepth(dev),0,0,0); - i->tag = swf_InsertTag(i->tag, ST_PLACEOBJECT2); - swf_ObjectPlaceClip(i->tag,shapeid,getNewDepth(dev),0,0,0,65535); -} - -/* initialize the swf writer */ -void gfxdevice_swf_init(gfxdevice_t* dev) -{ - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "swf"; - - dev->internal = init_internal_struct(); // set config to default values - - dev->startpage = swf_startframe; - dev->endpage = swf_endframe; - dev->finish = swf_finish; - dev->fillbitmap = swf_fillbitmap; - dev->setparameter = swf_setparameter; - dev->stroke = swf_stroke; - dev->startclip = swf_startclip; - dev->endclip = swf_endclip; - dev->fill = swf_fill; - dev->fillgradient = swf_fillgradient; - dev->addfont = swf_addfont; - dev->drawchar = swf_drawchar; - dev->drawlink = swf_drawlink; - - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - i->dev = dev; - - msg(" initializing swf output\n", i->max_x,i->max_y); - - i->swffont = 0; - - i->swf = (SWF*)rfx_calloc(sizeof(SWF)); - i->swf->fileVersion = 0; - i->swf->frameRate = 0x80; - i->swf->movieSize.xmin = 0; - i->swf->movieSize.ymin = 0; - i->swf->movieSize.xmax = 0; - i->swf->movieSize.ymax = 0; - i->swf->fileAttributes = 9; // as3, local-with-network - - i->swf->firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); - i->tag = i->swf->firstTag; - RGBA rgb; - rgb.a = rgb.r = rgb.g = rgb.b = 0xff; - //rgb.r = 0; - swf_SetRGB(i->tag,&rgb); - - i->startdepth = i->depth = 0; - i->startids = i->currentswfid = 0; -} - -static void startshape(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - SRECT r; - - if(i->shapeid>=0) - return; - //if(i->chardatapos && i->chardata[i->chardatapos-1].color.a) - endtext(dev); - - i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); - - swf_ShapeNew(&i->shape); - i->linestyleid = swf_ShapeAddLineStyle(i->shape,i->linewidth,&i->strokergb); - i->fillstyleid = swf_ShapeAddSolidFillStyle(i->shape,&i->fillrgb); - if(i->mark) { - RGBA markcol = {0,i->mark[0],i->mark[1],i->mark[2]}; - swf_ShapeAddSolidFillStyle(i->shape,&markcol); - } - - i->shapeid = getNewID(dev); - - msg(" Using shape id %d", i->shapeid); - - swf_SetU16(i->tag,i->shapeid); // ID - - i->bboxrectpos = i->tag->len; - /* changed later */ - swf_SetRect(i->tag,&i->pagebbox); - - memset(&i->bboxrect, 0, sizeof(i->bboxrect)); - - swf_SetShapeStyles(i->tag,i->shape); - swf_ShapeCountBits(i->shape,NULL,NULL); - swf_SetShapeBits(i->tag,i->shape); - - /* TODO: do we really need this? */ - //swf_ShapeSetAll(i->tag,i->shape,/*x*/0,/*y*/0,i->linestyleid,0,0); - //swf_ShapeSetAll(i->tag,i->shape,/*x*/UNDEFINED_COORD,/*y*/UNDEFINED_COORD,i->linestyleid,0,0); - i->swflastx=i->swflasty=UNDEFINED_COORD; - i->lastwasfill = -1; - i->shapeisempty = 1; -} - -static void starttext(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->shapeid>=0) - endshape(dev); - - if(i->config_watermark) { - insert_watermark(dev, 0); - } - i->textmode = 1; - i->swflastx=i->swflasty=0; -} - - -/* TODO: move to ../lib/rfxswf */ -void changeRect(gfxdevice_t*dev, TAG*tag, int pos, SRECT*newrect) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - /* determine length of old rect */ - tag->pos = pos; - tag->readBit = 0; - SRECT old; - swf_GetRect(tag, &old); - swf_ResetReadBits(tag); - int pos_end = tag->pos; - - int len = tag->len - pos_end; - U8*data = (U8*)malloc(len); - memcpy(data, &tag->data[pos_end], len); - tag->writeBit = 0; - tag->len = pos; - swf_SetRect(tag, newrect); - swf_SetBlock(tag, data, len); - free(data); - tag->pos = tag->readBit = 0; -} - -void cancelshape(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - /* delete old shape tag */ - TAG*todel = i->tag; - i->tag = i->tag->prev; - swf_DeleteTag(0, todel); - if(i->shape) {swf_ShapeFree(i->shape);i->shape=0;} - i->shapeid = -1; - i->bboxrectpos = -1; - -// i->currentswfid--; // doesn't work, for some reason -} - -void fixAreas(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(!i->shapeisempty && i->fill && - (i->bboxrect.xmin == i->bboxrect.xmax || - i->bboxrect.ymin == i->bboxrect.ymax) && - i->config_minlinewidth >= 0.001 - ) { - msg(" Shape has size 0: width=%.2f height=%.2f", - (i->bboxrect.xmax-i->bboxrect.xmin)/20.0, - (i->bboxrect.ymax-i->bboxrect.ymin)/20.0 - ); - - SRECT r = i->bboxrect; - - if(r.xmin == r.xmax && r.ymin == r.ymax) { - /* this thing comes down to a single dot- nothing to fix here */ - return; - } - - cancelshape(dev); - - RGBA save_col = i->strokergb; - int save_width = i->linewidth; - - i->strokergb = i->fillrgb; - i->linewidth = (int)(i->config_minlinewidth*20); - if(i->linewidth==0) i->linewidth = 1; - - startshape(dev); - stopFill(dev); - - moveto(dev, i->tag, r.xmin/20.0,r.ymin/20.0); - lineto(dev, i->tag, r.xmax/20.0,r.ymax/20.0); - - i->strokergb = save_col; - i->linewidth = save_width; - } - -} - -static void endshape_noput(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->shapeid<0) - return; - //changeRect(dev, i->tag, i->bboxrectpos, &i->bboxrect); - i->shapeid = -1; - if(i->shape) { - swf_ShapeFree(i->shape); - i->shape=0; - } - i->fill=0; - i->shapeposx=0; - i->shapeposy=0; -} - -static void endshape(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->shapeid<0) - return; - - fixAreas(dev); - - if(i->shapeisempty || - /*bbox empty?*/ - (i->bboxrect.xmin == i->bboxrect.xmax && - i->bboxrect.ymin == i->bboxrect.ymax)) - { - // delete the shape again, we didn't do anything - msg(" cancelling shape: bbox is (%f,%f,%f,%f)", - i->bboxrect.xmin /20.0, - i->bboxrect.ymin /20.0, - i->bboxrect.xmax /20.0, - i->bboxrect.ymax /20.0 - ); - cancelshape(dev); - return; - } - - swf_ShapeSetEnd(i->tag); - - SRECT r = swf_ClipRect(i->pagebbox, i->bboxrect); - changeRect(dev, i->tag, i->bboxrectpos, &r); - - msg(" Placing shape ID %d", i->shapeid); - - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - MATRIX m = i->page_matrix; - m.tx += i->shapeposx; - m.ty += i->shapeposy; - swf_ObjectPlace(i->tag,i->shapeid,getNewDepth(dev),&m,NULL,NULL); - - swf_ShapeFree(i->shape); - i->shape = 0; - i->shapeid = -1; - i->bboxrectpos = -1; - - i->fill=0; - i->shapeposx=0; - i->shapeposy=0; -} - -void wipeSWF(SWF*swf) -{ - TAG*tag = swf->firstTag; - while(tag) { - TAG*next = tag->next; - if(tag->id != ST_SETBACKGROUNDCOLOR && - tag->id != ST_END && - tag->id != ST_DOACTION && - tag->id != ST_SHOWFRAME) { - swf_DeleteTag(swf, tag); - } - tag = next; - } -} - -void swfoutput_finalize(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - if(i->tag && i->tag->id == ST_END) - return; //already done - - i->swf->fileVersion = i->config_flashversion; - i->swf->frameRate = i->config_framerate*0x100; - - if(i->config_bboxvars) { - TAG* tag = swf_InsertTag(i->swf->firstTag, ST_DOACTION); - ActionTAG*a = 0; - a = action_PushString(a, "xmin"); - a = action_PushFloat(a, i->swf->movieSize.xmin / 20.0); - a = action_SetVariable(a); - a = action_PushString(a, "ymin"); - a = action_PushFloat(a, i->swf->movieSize.ymin / 20.0); - a = action_SetVariable(a); - a = action_PushString(a, "xmax"); - a = action_PushFloat(a, i->swf->movieSize.xmax / 20.0); - a = action_SetVariable(a); - a = action_PushString(a, "ymax"); - a = action_PushFloat(a, i->swf->movieSize.ymax / 20.0); - a = action_SetVariable(a); - a = action_PushString(a, "width"); - a = action_PushFloat(a, (i->swf->movieSize.xmax - i->swf->movieSize.xmin) / 20.0); - a = action_SetVariable(a); - a = action_PushString(a, "height"); - a = action_PushFloat(a, (i->swf->movieSize.ymax - i->swf->movieSize.ymin) / 20.0); - a = action_SetVariable(a); - a = action_End(a); - swf_ActionSet(tag, a); - swf_ActionFree(a); - } - - if(i->mark) { - free(i->mark);i->mark = 0; - } - - endpage(dev); - fontlist_t *iterator = i->fontlist; - char use_font3 = i->config_flashversion>=8 && !NO_FONT3; - - while(iterator) { - TAG*mtag = i->swf->firstTag; - if(iterator->swffont) { - if(!i->config_storeallcharacters) { - msg(" Reducing font %s", iterator->swffont->name); - swf_FontReduce(iterator->swffont); - } - int used = iterator->swffont->use && iterator->swffont->use->used_glyphs; - if(used) { - if(!use_font3) { - mtag = swf_InsertTag(mtag, ST_DEFINEFONT2); - swf_FontSetDefine2(mtag, iterator->swffont); - } else { - mtag = swf_InsertTag(mtag, ST_DEFINEFONT3); - swf_FontSetDefine2(mtag, iterator->swffont); - } - } - } - - iterator = iterator->next; - } - - i->tag = swf_InsertTag(i->tag,ST_END); - TAG* tag = i->tag->prev; - - if(use_font3 && i->config_storeallcharacters && i->config_alignfonts) { - swf_FontPostprocess(i->swf); // generate alignment information - } - - /* remove the removeobject2 tags between the last ST_SHOWFRAME - and the ST_END- they confuse the flash player */ - while(tag->id == ST_REMOVEOBJECT2) { - TAG* prev = tag->prev; - swf_DeleteTag(i->swf, tag); - tag = prev; - } - - if(i->overflow) { - wipeSWF(i->swf); - } - if(i->config_enablezlib || i->config_flashversion>=6) { - i->swf->compressed = 1; - } - - /* Add AVM2 actionscript */ - if(i->config_flashversion>=9 && - (i->config_insertstoptag || i->hasbuttons) && !i->config_linknameurl) { - swf_AddButtonLinks(i->swf, i->config_insertstoptag, - i->config_internallinkfunction||i->config_externallinkfunction); - } -// if(i->config_reordertags) -// swf_Optimize(i->swf); -} - -int swfresult_save(gfxresult_t*gfx, const char*filename) -{ - SWF*swf = (SWF*)gfx->internal; - int fi; - if(filename) - fi = open(filename, O_BINARY|O_CREAT|O_TRUNC|O_WRONLY, 0777); - else - fi = 1; // stdout - - if(fi<=0) { - msg(" Could not create \"%s\". ", FIXNULL(filename)); - return -1; - } - - if FAILED(swf_WriteSWF(fi,swf)) - msg(" WriteSWF() failed.\n"); - - if(filename) - close(fi); - return 0; -} -void* swfresult_get(gfxresult_t*gfx, const char*name) -{ - SWF*swf = (SWF*)gfx->internal; - if(!strcmp(name, "swf")) { - return (void*)swf_CopySWF(swf); - } else if(!strcmp(name, "xmin")) { - return (void*)(ptroff_t)(swf->movieSize.xmin/20); - } else if(!strcmp(name, "ymin")) { - return (void*)(ptroff_t)(swf->movieSize.ymin/20); - } else if(!strcmp(name, "xmax")) { - return (void*)(ptroff_t)(swf->movieSize.xmax/20); - } else if(!strcmp(name, "ymax")) { - return (void*)(ptroff_t)(swf->movieSize.ymax/20); - } else if(!strcmp(name, "width")) { - return (void*)(ptroff_t)((swf->movieSize.xmax - swf->movieSize.xmin)/20); - } else if(!strcmp(name, "height")) { - return (void*)(ptroff_t)((swf->movieSize.ymax - swf->movieSize.ymin)/20); - } - return 0; -} -void swfresult_destroy(gfxresult_t*gfx) -{ - if(gfx->internal) { - swf_FreeTags((SWF*)gfx->internal); - free(gfx->internal); - gfx->internal = 0; - } - memset(gfx, 0, sizeof(gfxresult_t)); - free(gfx); -} - -static void swfoutput_destroy(gfxdevice_t* dev); - -gfxresult_t* swf_finish(gfxdevice_t* dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - gfxresult_t*result; - - if(i->config_linktarget) { - free(i->config_linktarget); - i->config_linktarget = 0; - } - - swfoutput_finalize(dev); - SWF* swf = i->swf;i->swf = 0; - swfoutput_destroy(dev); - - result = (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); - result->internal = swf; - result->save = swfresult_save; - result->write = 0; - result->get = swfresult_get; - result->destroy = swfresult_destroy; - return result; -} - -/* Perform cleaning up */ -static void swfoutput_destroy(gfxdevice_t* dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(!i) { - /* not initialized yet- nothing to destroy */ - return; - } - - fontlist_t *tmp,*iterator = i->fontlist; - while(iterator) { - if(iterator->swffont) { - swf_FontFree(iterator->swffont);iterator->swffont=0; - } - tmp = iterator; - iterator = iterator->next; - free(tmp); - } - if(i->swf) {swf_FreeTags(i->swf);free(i->swf);i->swf = 0;} - - free(i);i=0; - memset(dev, 0, sizeof(gfxdevice_t)); -} - -static void swfoutput_setstrokecolor(gfxdevice_t* dev, U8 r, U8 g, U8 b, U8 a) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->strokergb.r == r && - i->strokergb.g == g && - i->strokergb.b == b && - i->strokergb.a == a) return; - - if(i->shapeid>=0) - endshape(dev); - i->strokergb.r = r; - i->strokergb.g = g; - i->strokergb.b = b; - i->strokergb.a = a; -} - -//#define ROUND_UP 19 -//#define ROUND_UP 10 - -static void swfoutput_setlinewidth(gfxdevice_t*dev, double _linewidth) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->linewidth == (U16)(_linewidth*20+19.0/20.0)) - return; - if(i->shapeid>=0) - endshape(dev); - i->linewidth = (U16)(_linewidth*20+19.0/20.0); -} - - -static void drawlink(gfxdevice_t*dev, ActionTAG*,ActionTAG*, gfxline_t*points, char mouseover, char*type, const char*url); -static void swfoutput_namedlink(gfxdevice_t*dev, char*name, gfxline_t*points); -static void swfoutput_linktopage(gfxdevice_t*dev, int page, gfxline_t*points); -static void swfoutput_linktourl(gfxdevice_t*dev, const char*url, gfxline_t*points); - -/*void swfoutput_drawlink(gfxdevice_t*dev, char*url, gfxline_t*points) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - dev->drawlink(dev, points, url); -}*/ - -void swf_drawlink(gfxdevice_t*dev, gfxline_t*points, const char*url, const char*text) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - if(i->config_disablelinks) - return; - - if(!strncmp("http://pdf2swf:", url, 15)) { - char*tmp = strdup(url); - int l = strlen(tmp); - if(tmp[l-1] == '/') - tmp[l-1] = 0; - swfoutput_namedlink(dev, tmp+15, points); - free(tmp); - return; - } else if(!strncmp("page", url, 4)) { - int t, nodigit=0; - for(t=4;url[t];t++) - if(url[t]<'0' || url[t]>'9') - nodigit = 1; - if(!nodigit) { - int page = atoi(&url[4]); - if(page<0) page = 0; - swfoutput_linktopage(dev, page, points); - } - } else { - swfoutput_linktourl(dev, url, points); - } -} -void swfoutput_linktourl(gfxdevice_t*dev, const char*url, gfxline_t*points) -{ - ActionTAG* actions = 0; - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->shapeid>=0) - endshape(dev); - if(i->textmode) - endtext(dev); - - /* TODO: escape special characters in url */ - - if(i->config_externallinkfunction && i->config_flashversion<=8) { - actions = action_PushString(actions, url); //parameter - actions = action_PushInt(actions, 1); //number of parameters (1) - actions = action_PushString(actions, i->config_externallinkfunction); //function name - actions = action_CallFunction(actions); - } else if(!i->config_linktarget) { - if(!i->config_opennewwindow) - actions = action_GetUrl(actions, url, "_parent"); - else - actions = action_GetUrl(actions, url, "_this"); - } else { - actions = action_GetUrl(actions, url, i->config_linktarget); - } - actions = action_End(actions); - - drawlink(dev, actions, 0, points, 0, "url", url); - - swf_ActionFree(actions); -} -void swfoutput_linktopage(gfxdevice_t*dev, int page, gfxline_t*points) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - ActionTAG* actions = 0; - - if(i->shapeid>=0) - endshape(dev); - if(i->textmode) - endtext(dev); - - if(!i->config_internallinkfunction || i->config_flashversion>=9) { - actions = action_GotoFrame(actions, page-1); - actions = action_End(actions); - } else { - actions = action_PushInt(actions, page); //parameter - actions = action_PushInt(actions, 1); //number of parameters (1) - actions = action_PushString(actions, i->config_internallinkfunction); //function name - actions = action_CallFunction(actions); - actions = action_End(actions); - } - - char name[80]; - sprintf(name, "page%d", page); - - drawlink(dev, actions, 0, points, 0, "page", name); - - swf_ActionFree(actions); -} - -/* Named Links (a.k.a. Acrobatmenu) are used to implement various gadgets - of the viewer objects, like subtitles, index elements etc. -*/ -void swfoutput_namedlink(gfxdevice_t*dev, char*name, gfxline_t*points) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - ActionTAG *actions1,*actions2; - char*tmp = strdup(name); - char mouseover = 1; - - if(i->shapeid>=0) - endshape(dev); - if(i->textmode) - endtext(dev); - - char*type = 0; - if(!strncmp(tmp, "call:", 5)) - { - char*x = strchr(&tmp[5], ':'); - if(!x) { - actions1 = action_PushInt(0, 0); //number of parameters (0) - actions1 = action_PushString(actions1, &tmp[5]); //function name - actions1 = action_CallFunction(actions1); - actions1 = action_End(actions1); - } else { - *x = 0; - actions1 = action_PushString(0, x+1); //parameter - actions1 = action_PushInt(actions1, 1); //number of parameters (1) - actions1 = action_PushString(actions1, &tmp[5]); //function name - actions1 = action_CallFunction(actions1); - actions1 = action_End(actions1); - } - actions2 = action_End(0); - mouseover = 0; - type = "call"; - } - else - { - actions1 = action_PushString(0, "/:subtitle"); - actions1 = action_PushString(actions1, name); - actions1 = action_SetVariable(actions1); - actions1 = action_End(actions1); - - actions2 = action_PushString(0, "/:subtitle"); - actions2 = action_PushString(actions2, ""); - actions2 = action_SetVariable(actions2); - actions2 = action_End(actions2); - type = "subtitle"; - } - - drawlink(dev, actions1, actions2, points, mouseover, type, name); - - swf_ActionFree(actions1); - swf_ActionFree(actions2); - free(tmp); -} - -static void drawgfxline(gfxdevice_t*dev, gfxline_t*line, int fill) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - gfxcoord_t lastx=0,lasty=0,px=0,py=0; - char lastwasmoveto; - int lines= 0, splines=0; - - i->fill = fill; - - while(1) { - if(!line) - break; - /* check whether the next segment is zero */ - if(line->type == gfx_moveTo) { - moveto(dev, i->tag, line->x, line->y); - px = lastx = line->x; - py = lasty = line->y; - lastwasmoveto = 1; - } if(line->type == gfx_lineTo) { - lineto(dev, i->tag, line->x, line->y); - px = line->x; - py = line->y; - lastwasmoveto = 0; - lines++; - } else if(line->type == gfx_splineTo) { - plotxy_t s,p; - s.x = line->sx;p.x = line->x; - s.y = line->sy;p.y = line->y; - splineto(dev, i->tag, s, p); - px = line->x; - py = line->y; - lastwasmoveto = 0; - splines++; - } - line = line->next; - } - msg(" drawgfxline, %d lines, %d splines", lines, splines); -} - - -static void drawlink(gfxdevice_t*dev, ActionTAG*actions1, ActionTAG*actions2, gfxline_t*points, char mouseover, char*type, const char*url) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - RGBA rgb; - SRECT r; - int lsid=0; - int fsid; - int myshapeid; - int myshapeid2; - double posx = 0; - double posy = 0; - int buttonid = getNewID(dev); - gfxbbox_t bbox = gfxline_getbbox(points); - - if(i->config_linknameurl) { - actions1 = 0; - actions2 = 0; - } - - i->hasbuttons = 1; - - /* shape */ - myshapeid = getNewID(dev); - i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); - swf_ShapeNew(&i->shape); - rgb.r = rgb.b = rgb.a = rgb.g = 0; - fsid = swf_ShapeAddSolidFillStyle(i->shape,&rgb); - swf_SetU16(i->tag, myshapeid); - r.xmin = (int)(bbox.xmin*20); - r.ymin = (int)(bbox.ymin*20); - r.xmax = (int)(bbox.xmax*20); - r.ymax = (int)(bbox.ymax*20); - r = swf_ClipRect(i->pagebbox, r); - swf_SetRect(i->tag,&r); - swf_SetShapeStyles(i->tag,i->shape); - swf_ShapeCountBits(i->shape,NULL,NULL); - swf_SetShapeBits(i->tag,i->shape); - swf_ShapeSetAll(i->tag,i->shape,/*x*/0,/*y*/0,0,fsid,0); - i->swflastx = i->swflasty = 0; - drawgfxline(dev, points, 1); - swf_ShapeSetEnd(i->tag); - swf_ShapeFree(i->shape); - - /* shape2 */ - myshapeid2 = getNewID(dev); - i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); - swf_ShapeNew(&i->shape); - - rgb = i->config_linkcolor; - - fsid = swf_ShapeAddSolidFillStyle(i->shape,&rgb); - swf_SetU16(i->tag, myshapeid2); - r.xmin = (int)(bbox.xmin*20); - r.ymin = (int)(bbox.ymin*20); - r.xmax = (int)(bbox.xmax*20); - r.ymax = (int)(bbox.ymax*20); - r = swf_ClipRect(i->pagebbox, r); - swf_SetRect(i->tag,&r); - swf_SetShapeStyles(i->tag,i->shape); - swf_ShapeCountBits(i->shape,NULL,NULL); - swf_SetShapeBits(i->tag,i->shape); - swf_ShapeSetAll(i->tag,i->shape,/*x*/0,/*y*/0,0,fsid,0); - i->swflastx = i->swflasty = 0; - drawgfxline(dev, points, 1); - swf_ShapeSetEnd(i->tag); - swf_ShapeFree(i->shape); - - if(!mouseover) - { - i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON); - swf_SetU16(i->tag,buttonid); //id - swf_ButtonSetFlags(i->tag, 0); //menu=no - swf_ButtonSetRecord(i->tag,0x01,myshapeid,i->depth,0,0); - swf_ButtonSetRecord(i->tag,0x02,myshapeid2,i->depth,0,0); - swf_ButtonSetRecord(i->tag,0x04,myshapeid2,i->depth,0,0); - swf_ButtonSetRecord(i->tag,0x08,myshapeid,i->depth,0,0); - swf_SetU8(i->tag,0); - swf_ActionSet(i->tag,actions1); - swf_SetU8(i->tag,0); - } - else - { - i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON2); - swf_SetU16(i->tag,buttonid); //id - swf_ButtonSetFlags(i->tag, 0); //menu=no - swf_ButtonSetRecord(i->tag,0x01,myshapeid,i->depth,0,0); - swf_ButtonSetRecord(i->tag,0x02,myshapeid2,i->depth,0,0); - swf_ButtonSetRecord(i->tag,0x04,myshapeid2,i->depth,0,0); - swf_ButtonSetRecord(i->tag,0x08,myshapeid,i->depth,0,0); - swf_SetU8(i->tag,0); // end of button records - swf_ButtonSetCondition(i->tag, BC_IDLE_OVERUP); - swf_ActionSet(i->tag,actions1); - if(actions2) { - swf_ButtonSetCondition(i->tag, BC_OVERUP_IDLE); - swf_ActionSet(i->tag,actions2); - swf_SetU8(i->tag,0); - swf_ButtonPostProcess(i->tag, 2); - } else { - swf_SetU8(i->tag,0); - swf_ButtonPostProcess(i->tag, 1); - } - } - - char buf[80]; - char*buf2 = 0; - const char* name = 0; - if(i->config_linknameurl) { - buf2 = malloc(strlen(type)+strlen(url)+2); - sprintf(buf2, "%s:%s", type, url); - name = buf2; - } else { - name = buf; - sprintf(buf, "button%d", buttonid); - } - - msg(" Placing link ID %d", buttonid); - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - - if(posx!=0 || posy!=0) { - SPOINT p; - p.x = (int)(posx*20); - p.y = (int)(posy*20); - p = swf_TurnPoint(p, &i->page_matrix); - MATRIX m; - m = i->page_matrix; - m.tx = p.x; - m.ty = p.y; - swf_ObjectPlace(i->tag, buttonid, getNewDepth(dev),&m,0,(U8*)name); - } else { - swf_ObjectPlace(i->tag, buttonid, getNewDepth(dev),&i->page_matrix,0,(U8*)name); - } - - if(buf2) - free(buf2); -} - - -/////////// -/* -for(t=0;tinternal; - - msg(" swfdevice: %s=%s", name, value); - if(!strcmp(name, "jpegsubpixels")) { - i->config_jpegsubpixels = atof(value); - } else if(!strcmp(name, "ppmsubpixels")) { - i->config_ppmsubpixels = atof(value); - } else if(!strcmp(name, "subpixels")) { - i->config_ppmsubpixels = i->config_jpegsubpixels = atof(value); - } else if(!strcmp(name, "drawonlyshapes")) { - i->config_drawonlyshapes = atoi(value); - } else if(!strcmp(name, "ignoredraworder")) { - i->config_ignoredraworder = atoi(value); - } else if(!strcmp(name, "mark")) { - if(!value || !value[0]) { - if(i->mark) free(i->mark); - i->mark = 0; - } else { - int t; - i->mark = strdup("..."); - for(t=0;t<3;t++) if(value[t]) i->mark[t] = value[t]; - } - } else if(!strcmp(name, "filloverlap")) { - i->config_filloverlap = atoi(value); - } else if(!strcmp(name, "linksopennewwindow")) { - i->config_opennewwindow = atoi(value); - } else if(!strcmp(name, "opennewwindow")) { - i->config_opennewwindow = atoi(value); - } else if(!strcmp(name, "storeallcharacters")) { - i->config_storeallcharacters = atoi(value); - } else if(!strcmp(name, "enablezlib")) { - i->config_enablezlib = atoi(value); - } else if(!strcmp(name, "bboxvars")) { - i->config_bboxvars = atoi(value); - } else if(!strcmp(name, "dots")) { - i->config_dots = atoi(value); - } else if(!strcmp(name, "frameresets")) { - i->config_frameresets = atoi(value); - } else if(!strcmp(name, "showclipshapes")) { - i->config_showclipshapes = atoi(value); - } else if(!strcmp(name, "reordertags")) { - i->config_reordertags = atoi(value); - } else if(!strcmp(name, "internallinkfunction")) { - i->config_internallinkfunction = strdup(value); - } else if(!strcmp(name, "externallinkfunction")) { - i->config_externallinkfunction = strdup(value); - } else if(!strcmp(name, "linkfunction")) { //sets both internallinkfunction and externallinkfunction - i->config_internallinkfunction = strdup(value); - i->config_externallinkfunction = strdup(value); - } else if(!strcmp(name, "disable_polygon_conversion")) { - i->config_disable_polygon_conversion = atoi(value); - } else if(!strcmp(name, "normalize_polygon_positions")) { - i->config_normalize_polygon_positions = atoi(value); - } else if(!strcmp(name, "wxwindowparams")) { - i->config_watermark = atoi(value); - } else if(!strcmp(name, "insertstop")) { - i->config_insertstoptag = atoi(value); - } else if(!strcmp(name, "protect")) { - i->config_protect = atoi(value); - if(i->config_protect && i->tag) { - i->tag = swf_InsertTag(i->tag, ST_PROTECT); - } - } else if(!strcmp(name, "flashversion")) { - i->config_flashversion = atoi(value); - if(i->swf) { - i->swf->fileVersion = i->config_flashversion; - } - } else if(!strcmp(name, "framerate")) { - i->config_framerate = atof(value); - if(i->swf) { - i->swf->frameRate = i->config_framerate*0x100; - } - } else if(!strcmp(name, "minlinewidth")) { - i->config_minlinewidth = atof(value); - } else if(!strcmp(name, "remove_small_polygons")) { - i->config_remove_small_polygons = atof(value); - } else if(!strcmp(name, "caplinewidth")) { - i->config_caplinewidth = atof(value); - } else if(!strcmp(name, "linktarget")) { - i->config_linktarget = strdup(value); - } else if(!strcmp(name, "invisibletexttofront")) { - i->config_invisibletexttofront = atoi(value); - } else if(!strcmp(name, "noclips")) { - i->config_noclips = atoi(value); - } else if(!strcmp(name, "dumpfonts")) { - i->config_dumpfonts = atoi(value); - } else if(!strcmp(name, "override_line_widths")) { - i->config_override_line_widths = atof(value); - } else if(!strcmp(name, "animate")) { - i->config_animate = atoi(value); - i->config_framerate = 25; - } else if(!strcmp(name, "linknameurl")) { - i->config_linknameurl = atoi(value); - } else if(!strcmp(name, "showimages")) { - i->config_showimages = atoi(value); - } else if(!strcmp(name, "disablelinks")) { - i->config_disablelinks = atoi(value); - } else if(!strcmp(name, "simpleviewer")) { - i->config_simpleviewer = atoi(value); - } else if(!strcmp(name, "next_bitmap_is_jpeg")) { - i->jpeg = 1; - } else if(!strcmp(name, "jpegquality")) { - int val = atoi(value); - if(val<0) val=0; - if(val>101) val=101; - i->config_jpegquality = val; - } else if(!strcmp(name, "splinequality")) { - int v = atoi(value); - v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel - if(v<1) v = 1; - i->config_splinemaxerror = v; - } else if(!strcmp(name, "fontquality")) { - int v = atoi(value); - v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel - if(v<1) v = 1; - i->config_fontsplinemaxerror = v; - } else if(!strcmp(name, "linkcolor")) { - if(strlen(value)!=8) { - fprintf(stderr, "Unknown format for option 'linkcolor'. (%s <-> RRGGBBAA)\n", value); - return 1; - } -# define NIBBLE(s) (((s)>='0' && (s)<='9')?((s)-'0'):((s)&0x0f)+9) - i->config_linkcolor.r = NIBBLE(value[0])<<4 | NIBBLE(value[1]); - i->config_linkcolor.g = NIBBLE(value[2])<<4 | NIBBLE(value[3]); - i->config_linkcolor.b = NIBBLE(value[4])<<4 | NIBBLE(value[5]); - i->config_linkcolor.a = NIBBLE(value[6])<<4 | NIBBLE(value[7]); - } else if(!strcmp(name, "help")) { - printf("\nSWF layer options:\n"); - printf("jpegsubpixels= resolution adjustment for jpeg images (same as jpegdpi, but in pixels)\n"); - printf("ppmsubpixels= shortcut for setting both jpegsubpixels and ppmsubpixels\n"); - printf("drawonlyshapes convert everything to shapes (currently broken)\n"); - printf("ignoredraworder allow to perform a few optimizations for creating smaller SWFs\n"); - printf("linksopennewwindow make links open a new browser window\n"); - printf("linktarget target window name of new links\n"); - printf("linkcolor==6)\n"); - printf("bboxvars store the bounding box of the SWF file in actionscript variables\n"); - printf("dots Take care to handle dots correctly\n"); - printf("reordertags=0/1 (default: 1) perform some tag optimizations\n"); - printf("internallinkfunction= when the user clicks a internal link (to a different page) in the converted file, this actionscript function is called\n"); - printf("externallinkfunction= when the user clicks an external link (e.g. http://www.foo.bar/) on the converted file, this actionscript function is called\n"); - printf("disable_polygon_conversion never convert strokes to polygons (will remove capstyles and joint styles)\n"); - printf("caplinewidth= the minimum thichness a line needs to have so that capstyles become visible (and are converted)\n"); - printf("insertstop put an ActionScript \"STOP\" tag in every frame\n"); - printf("protect add a \"protect\" tag to the file, to prevent loading in the Flash editor\n"); - printf("flashversion= the SWF fileversion (6)\n"); - printf("framerate= SWF framerate\n"); - printf("minlinewidth= convert horizontal/vertical boxes smaller than this width to lines (0.05) \n"); - printf("simpleviewer Add next/previous buttons to the SWF\n"); - printf("animate insert a showframe tag after each placeobject (animate draw order of PDF files)\n"); - printf("jpegquality= set compression quality of jpeg images\n"); - printf("splinequality= Set the quality of spline convertion to value (0-100, default: 100).\n"); - printf("disablelinks Disable links.\n"); - } else { - return 0; - } - return 1; -} - -// -------------------------------------------------------------------- - -static CXFORM gfxcxform_to_cxform(gfxcxform_t* c) -{ - CXFORM cx; - swf_GetCXForm(0, &cx, 1); - if(!c) - return cx; - if(c->rg!=0 || c->rb!=0 || c->ra!=0 || - c->gr!=0 || c->gb!=0 || c->ga!=0 || - c->br!=0 || c->bg!=0 || c->ba!=0 || - c->ar!=0 || c->ag!=0 || c->ab!=0) - msg(" CXForm not SWF-compatible"); - - cx.a0 = (S16)(c->aa*256); - cx.r0 = (S16)(c->rr*256); - cx.g0 = (S16)(c->gg*256); - cx.b0 = (S16)(c->bb*256); - cx.a1 = c->ta; - cx.r1 = c->tr; - cx.g1 = c->tg; - cx.b1 = c->tb; - return cx; -} - -/* TODO */ -static int imageInCache(gfxdevice_t*dev, void*data, int width, int height) -{ - return -1; -} -static void addImageToCache(gfxdevice_t*dev, void*data, int width, int height) -{ -} - -static int add_image(swfoutput_internal*i, gfximage_t*img, int targetwidth, int targetheight, int* newwidth, int* newheight) -{ - gfxdevice_t*dev = i->dev; - RGBA*newpic = 0; - RGBA*mem = (RGBA*)img->data; - - int sizex = img->width; - int sizey = img->height; - int is_jpeg = i->jpeg; - i->jpeg = 0; - - int newsizex=sizex, newsizey=sizey; - - /// { - if(is_jpeg && i->config_jpegsubpixels) { - newsizex = (int)(targetwidth*i->config_jpegsubpixels + 0.5); - newsizey = (int)(targetheight*i->config_jpegsubpixels + 0.5); - } else if(!is_jpeg && i->config_ppmsubpixels) { - newsizex = (int)(targetwidth*i->config_ppmsubpixels + 0.5); - newsizey = (int)(targetheight*i->config_ppmsubpixels + 0.5); - } - /// } - - if(sizex<=0 || sizey<=0) - return -1; - if(newsizex<=0) - newsizex = 1; - if(newsizey<=0) - newsizey = 1; - - /* TODO: cache images */ - - if(newsizex Scaling %dx%d image to %dx%d", sizex, sizey, newsizex, newsizey); - gfximage_t*ni = gfximage_rescale(img, newsizex, newsizey); - newpic = (RGBA*)ni->data; - free(ni); - *newwidth = sizex = newsizex; - *newheight = sizey = newsizey; - mem = newpic; - } else { - *newwidth = newsizex = sizex; - *newheight = newsizey = sizey; - } - - int num_colors = swf_ImageGetNumberOfPaletteEntries(mem,sizex,sizey,0); - int has_alpha = swf_ImageHasAlpha(mem,sizex,sizey); - - msg(" Drawing %dx%d %s%simage (id %d) at size %dx%d (%dx%d), %s%d colors", - sizex, sizey, - has_alpha?(has_alpha==2?"semi-transparent ":"transparent "):"", - is_jpeg?"jpeg-":"", i->currentswfid+1, - newsizex, newsizey, - targetwidth, targetheight, - /*newsizex, newsizey,*/ - num_colors>256?">":"", num_colors>256?256:num_colors); - - /*RGBA* pal = (RGBA*)rfx_alloc(sizeof(RGBA)*num_colors); - swf_ImageGetNumberOfPaletteEntries(mem,sizex,sizey,pal); - int t; - for(t=0;ttag = swf_AddImage(i->tag, bitid, mem, sizex, sizey, i->config_jpegquality); - addImageToCache(dev, mem, sizex, sizey); - } else { - bitid = cacheid; - } - - if(newpic) - free(newpic); - return bitid; -} - -int line_is_empty(gfxline_t*line) -{ - while(line) { - if(line->type != gfx_moveTo) - return 0; - line = line->next; - } - return 1; -} - -static SRECT gfxline_getSWFbbox(gfxline_t*line) -{ - gfxbbox_t bbox = gfxline_getbbox(line); - SRECT r; - r.xmin = (int)(bbox.xmin*20); - r.ymin = (int)(bbox.ymin*20); - r.xmax = (int)(bbox.xmax*20); - r.ymax = (int)(bbox.ymax*20); - return r; -} - -static void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - if(line_is_empty(line)) - return; - - endshape(dev); - endtext(dev); - - int targetx = (int)(sqrt(matrix->m00*matrix->m00 + matrix->m01*matrix->m01)*img->width); - int targety = (int)(sqrt(matrix->m10*matrix->m10 + matrix->m11*matrix->m11)*img->height); - - int newwidth=0,newheight=0; - int bitid = add_image(i, img, targetx, targety, &newwidth, &newheight); - if(bitid<0) - return; - double fx = (double)img->width / (double)newwidth; - double fy = (double)img->height / (double)newheight; - - MATRIX m; - m.sx = (int)(65536*20*matrix->m00*fx); m.r1 = (int)(65536*20*matrix->m10*fy); - m.r0 = (int)(65536*20*matrix->m01*fx); m.sy = (int)(65536*20*matrix->m11*fy); - m.tx = (int)(matrix->tx*20); - m.ty = (int)(matrix->ty*20); - - /* shape */ - int myshapeid = getNewID(dev); - i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE); - SHAPE*shape; - swf_ShapeNew(&shape); - int fsid = swf_ShapeAddBitmapFillStyle(shape,&m,bitid,1); - int lsid = 0; - if(i->config_showimages) { - RGBA pink = {255,255,0,255}; - lsid = swf_ShapeAddLineStyle(shape, 20, &pink); - } - swf_SetU16(i->tag, myshapeid); - SRECT r = gfxline_getSWFbbox(line); - r = swf_ClipRect(i->pagebbox, r); - swf_SetRect(i->tag,&r); - swf_SetShapeStyles(i->tag,shape); - swf_ShapeCountBits(shape,NULL,NULL); - swf_SetShapeBits(i->tag,shape); - swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,lsid,fsid,0); - i->swflastx = i->swflasty = UNDEFINED_COORD; - drawgfxline(dev, line, 1); - swf_ShapeSetEnd(i->tag); - swf_ShapeFree(shape); - - msg(" Placing image, shape ID %d, bitmap ID %d", myshapeid, bitid); - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - CXFORM cxform2 = gfxcxform_to_cxform(cxform); - swf_ObjectPlace(i->tag,myshapeid,getNewDepth(dev),&i->page_matrix,&cxform2,NULL); -} - -static RGBA col_purple = {255,255,0,255}; -static void drawoutline(gfxdevice_t*dev, gfxline_t*line) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - int myshapeid = getNewID(dev); - i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); - - SHAPE*shape; - swf_ShapeNew(&shape); - int lsid = swf_ShapeAddLineStyle(shape,60,&col_purple); - - swf_SetU16(i->tag,myshapeid); - SRECT r = gfxline_getSWFbbox(line); - r = swf_ClipRect(i->pagebbox, r); - swf_SetRect(i->tag,&r); - swf_SetShapeStyles(i->tag,shape); - swf_ShapeCountBits(shape,NULL,NULL); - swf_SetShapeBits(i->tag,shape); - swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,lsid,0,0); - drawgfxline(dev, line, 1); - swf_ShapeSetEnd(i->tag); - swf_ShapeFree(shape); - - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - swf_ObjectPlace(i->tag, myshapeid, getNewDepth(dev), 0,0,0); -} - -static void swf_startclip(gfxdevice_t*dev, gfxline_t*line) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->config_noclips) - return; - - endtext(dev); - endshape(dev); - - if(i->clippos >= 127) - { - msg(" Too many clip levels."); - i->clippos --; - } - - if(i->config_showclipshapes) { - i->stored_clipshapes = gfxline_append(i->stored_clipshapes, gfxline_clone(line)); - } - - int myshapeid = getNewID(dev); - i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); - RGBA col; - memset(&col, 0, sizeof(RGBA)); - col.a = 255; - SHAPE*shape; - swf_ShapeNew(&shape); - int fsid = swf_ShapeAddSolidFillStyle(shape,&col); - if(i->mark) { - RGBA markcol = {0,i->mark[0],i->mark[1],i->mark[2]}; - swf_ShapeAddSolidFillStyle(shape,&markcol); - } - swf_SetU16(i->tag,myshapeid); - SRECT r = gfxline_getSWFbbox(line); - r = swf_ClipRect(i->pagebbox, r); - swf_SetRect(i->tag,&r); - swf_SetShapeStyles(i->tag,shape); - swf_ShapeCountBits(shape,NULL,NULL); - swf_SetShapeBits(i->tag,shape); - swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,0,fsid,0); - i->swflastx = i->swflasty = UNDEFINED_COORD; - i->shapeisempty = 1; - drawgfxline(dev, line, 1); - if(i->shapeisempty) { - /* an empty clip shape is equivalent to a shape with no area */ - int x = line?line->x:0; - int y = line?line->y:0; - moveto(dev, i->tag, x,y); - lineto(dev, i->tag, x,y); - lineto(dev, i->tag, x,y); - } - if(!i->shapeisempty && i->currentswfid==1 && r.xmin==0 && r.ymin==0 && r.xmax==(int)(i->max_x*20) && r.ymax==(int)(i->max_y*20)) { - if(i->config_watermark) { - gfxbbox_t r; r.xmin = r.ymin = 0;r.xmax = i->max_x;r.ymax = i->max_y; - draw_watermark(dev, r, 1); - } - } - swf_ShapeSetEnd(i->tag); - swf_ShapeFree(shape); - - /* TODO: remember the bbox, and check all shapes against it */ - - msg(" Placing clip ID %d", myshapeid); - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - i->cliptags[i->clippos] = i->tag; - i->clipshapes[i->clippos] = myshapeid; - i->clipdepths[i->clippos] = getNewDepth(dev); - i->clippos++; -} - -static void swf_endclip(gfxdevice_t*dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->config_noclips) - return; - if(i->textmode) - endtext(dev); - if(i->shapeid>=0) - endshape(dev); - - if(!i->clippos) { - msg(" Invalid end of clipping region"); - return; - } - i->clippos--; - /*swf_ObjectPlaceClip(i->cliptags[i->clippos],i->clipshapes[i->clippos],i->clipdepths[i->clippos],&i->page_matrix,NULL,NULL, - / * clip to depth: * / i->depth <= i->clipdepths[i->clippos]? i->depth : i->depth - 1); - i->depth ++;*/ - swf_ObjectPlaceClip(i->cliptags[i->clippos],i->clipshapes[i->clippos],i->clipdepths[i->clippos],&i->page_matrix,NULL,NULL,i->depth); -} -static int gfxline_type(gfxline_t*line) -{ - int tmplines=0; - int tmpsplines=0; - int lines=0; - int splines=0; - int haszerosegments=0; - int length=0; - while(line) { - if(line->type == gfx_moveTo) { - tmplines=0; - tmpsplines=0; - } else if(line->type == gfx_lineTo) { - tmplines++; - if(tmplines>lines) - lines=tmplines; - } else if(line->type == gfx_splineTo) { - tmpsplines++; - if(tmpsplines>lines) - splines=tmpsplines; - } - length++; - line = line->next; - } - if(length>400) - return 5; - if(lines==0 && splines==0) return 0; - else if(lines==1 && splines==0) return 1; - else if(lines==0 && splines==1) return 2; - else if(splines==0) return 3; - else return 4; -} - -static int gfxline_has_dots(gfxline_t*line) -{ - int tmplines=0; - double x=0,y=0; - double dist = 0; - int isline = 0; - int short_gap = 0; - while(line) { - if(line->type == gfx_moveTo) { - /* test the length of the preceding line, and assume it is a dot if - it's length is less than 1.0. But *only* if there's a noticable - gap between the previous line and the next moveTo. (I've come - across a PDF where thousands of "dots" were stringed together, - forming a line) */ - int last_short_gap = short_gap; - if((fabs(line->x - x) + fabs(line->y - y)) < 1.0) { - short_gap = 1; - } else { - short_gap = 0; - } - if(isline && dist < 1 && !short_gap && !last_short_gap) { - return 1; - } - dist = 0; - isline = 0; - } else if(line->type == gfx_lineTo) { - dist += fabs(line->x - x) + fabs(line->y - y); - isline = 1; - } else if(line->type == gfx_splineTo) { - dist += fabs(line->sx - x) + fabs(line->sy - y) + - fabs(line->x - line->sx) + fabs(line->y - line->sy); - isline = 1; - } - x = line->x; - y = line->y; - line = line->next; - } - if(isline && dist < 1 && !short_gap) { - return 1; - } - return 0; -} - -static int gfxline_fix_short_edges(gfxline_t*line) -{ - double x,y; - while(line) { - if(line->type == gfx_lineTo) { - if(fabs(line->x - x) + fabs(line->y - y) < 0.01) { - line->x += 0.01; - } - } else if(line->type == gfx_splineTo) { - if(fabs(line->sx - x) + fabs(line->sy - y) + - fabs(line->x - line->sx) + fabs(line->y - line->sy) < 0.01) { - line->x += 0.01; - } - } - x = line->x; - y = line->y; - line = line->next; - } - return 0; -} - -static char is_inside_page(gfxdevice_t*dev, gfxcoord_t x, gfxcoord_t y) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(xmin_x || x>i->max_x) return 0; - if(ymin_y || y>i->max_y) return 0; - return 1; -} - -gfxline_t* gfxline_move(gfxline_t*line, double x, double y) -{ - gfxline_t*l = line = gfxline_clone(line); - - while(l) { - l->x += x; - l->y += y; - l->sx += x; - l->sy += y; - l = l->next; - } - return line; -} - -//#define NORMALIZE_POLYGON_POSITIONS - -static void swf_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(line_is_empty(line)) - return; - int type = gfxline_type(line); - int has_dots = gfxline_has_dots(line); - gfxbbox_t r = gfxline_getbbox(line); - int is_outside_page = !is_inside_page(dev, r.xmin, r.ymin) || !is_inside_page(dev, r.xmax, r.ymax); - - if(i->config_override_line_widths) { - width = i->config_override_line_widths; - } - - /* TODO: * split line into segments, and perform this check for all segments */ - - if(i->config_disable_polygon_conversion || /*type>=5 ||*/ - (!has_dots && - (width <= i->config_caplinewidth - || (cap_style == gfx_capRound && joint_style == gfx_joinRound) - || (cap_style == gfx_capRound && type<=2)))) - { - // ... - } else { - /* convert line to polygon */ - msg(" draw as polygon, type=%d dots=%d", type, has_dots); - if(has_dots) - gfxline_fix_short_edges(line); - /* we need to convert the line into a polygon */ - gfxpoly_t* poly = gfxpoly_from_stroke(line, width, cap_style, joint_style, miterLimit, DEFAULT_GRID); - gfxline_t*gfxline = gfxline_from_gfxpoly(poly); - dev->fill(dev, gfxline, color); - gfxline_free(gfxline); - gfxpoly_destroy(poly); - return; - } - - msg(" draw as stroke, type=%d dots=%d", type, has_dots); - endtext(dev); - - if(i->config_normalize_polygon_positions) { - endshape(dev); - double startx = 0, starty = 0; - if(line && line->type == gfx_moveTo) { - startx = line->x; - starty = line->y; - } - line = gfxline_move(line, -startx, -starty); - i->shapeposx = (int)(startx*20); - i->shapeposy = (int)(starty*20); - } - - swfoutput_setstrokecolor(dev, color->r, color->g, color->b, color->a); - swfoutput_setlinewidth(dev, width); - startshape(dev); - stopFill(dev); - drawgfxline(dev, line, 0); - - if(i->config_normalize_polygon_positions) { - free(line); //account for _move - } - -} - -static void swf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(line_is_empty(line)) - return; - if(!color->a) - return; - - gfxbbox_t r = gfxline_getbbox(line); - int is_outside_page = !is_inside_page(dev, r.xmin, r.ymin) || !is_inside_page(dev, r.xmax, r.ymax); - - if(r.xmax - r.xmin < i->config_remove_small_polygons && - r.ymax - r.ymin < i->config_remove_small_polygons) { - msg(" Not drawing %.2fx%.2f polygon", r.xmax - r.xmin, r.ymax - r.ymin); - return; - } - - endtext(dev); - - if(!i->config_ignoredraworder) - endshape(dev); - - if(i->config_normalize_polygon_positions) { - endshape(dev); - double startx = 0, starty = 0; - if(line && line->type == gfx_moveTo) { - startx = line->x; - starty = line->y; - } - line = gfxline_move(line, -startx, -starty); - i->shapeposx = (int)(startx*20); - i->shapeposy = (int)(starty*20); - } - - swfoutput_setfillcolor(dev, color->r, color->g, color->b, color->a); - startshape(dev); - startFill(dev); - drawgfxline(dev, line, 1); - - if(i->currentswfid==2 && r.xmin==0 && r.ymin==0 && r.xmax==i->max_x && r.ymax==i->max_y) { - if(i->config_watermark) { - draw_watermark(dev, r, 1); - } - } - - msg(" end of swf_fill (shapeid=%d)", i->shapeid); - - if(i->config_normalize_polygon_positions) { - free(line); //account for _move - } -} - -static GRADIENT* gfxgradient_to_GRADIENT(gfxgradient_t*gradient) -{ - int num = 0; - gfxgradient_t*g = gradient; - while(g) { - num++; - g = g->next; - } - GRADIENT* swfgradient = malloc(sizeof(GRADIENT)); - swfgradient->num = num; - swfgradient->rgba = malloc(sizeof(swfgradient->rgba[0])*num); - swfgradient->ratios = malloc(sizeof(swfgradient->ratios[0])*num); - - g = gradient; - num = 0; - while(g) { - swfgradient->ratios[num] = g->pos*255; - swfgradient->rgba[num] = *(RGBA*)&g->color; - num++; - g = g->next; - } - return swfgradient; -} - -static void swf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - if(line_is_empty(line)) - return; - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - if(line_is_empty(line)) - return; - - GRADIENT* swfgradient = gfxgradient_to_GRADIENT(gradient); - if(!swfgradient) - return; - - endshape(dev); - endtext(dev); - - double f = type==gfxgradient_radial?4:4; - MATRIX m; - m.sx = (int)(matrix->m00*20*f); m.r1 = (int)(matrix->m10*20*f); - m.r0 = (int)(matrix->m01*20*f); m.sy = (int)(matrix->m11*20*f); - m.tx = (int)(matrix->tx*20); - m.ty = (int)(matrix->ty*20); - - /* shape */ - int myshapeid = getNewID(dev); - i->tag = swf_InsertTag(i->tag, ST_DEFINESHAPE2); - SHAPE*shape; - swf_ShapeNew(&shape); - int fsid = swf_ShapeAddGradientFillStyle(shape,&m,swfgradient,type==gfxgradient_radial); - swf_SetU16(i->tag, myshapeid); - SRECT r = gfxline_getSWFbbox(line); - r = swf_ClipRect(i->pagebbox, r); - swf_SetRect(i->tag,&r); - swf_SetShapeStyles(i->tag,shape); - swf_ShapeCountBits(shape,NULL,NULL); - swf_SetShapeBits(i->tag,shape); - swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,0,fsid,0); - i->swflastx = i->swflasty = UNDEFINED_COORD; - drawgfxline(dev, line, 1); - swf_ShapeSetEnd(i->tag); - swf_ShapeFree(shape); - - int depth = getNewDepth(dev); - msg(" Placing gradient, shape ID %d, depth %d", myshapeid, depth); - i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); - swf_ObjectPlace(i->tag,myshapeid,depth,&i->page_matrix,NULL,NULL); - - swf_FreeGradient(swfgradient);free(swfgradient); -} - -static SWFFONT* gfxfont_to_swffont(gfxfont_t*font, const char* id, int version) -{ - SWFFONT*swffont = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); - int t; - SRECT bounds = {0,0,0,0}; - swffont->id = -1; - swffont->version = version; - swffont->name = (U8*)strdup(id); - swffont->layout = (SWFLAYOUT*)rfx_calloc(sizeof(SWFLAYOUT)); - swffont->layout->ascent = 0; - swffont->layout->descent = 0; - swffont->layout->leading = 0; - swffont->layout->bounds = (SRECT*)rfx_calloc(sizeof(SRECT)*font->num_glyphs); - swffont->encoding = FONT_ENCODING_UNICODE; - swffont->numchars = font->num_glyphs; - swffont->maxascii = font->max_unicode; - swffont->ascii2glyph = (int*)rfx_calloc(sizeof(int)*swffont->maxascii); - swffont->glyph2ascii = (U16*)rfx_calloc(sizeof(U16)*swffont->numchars); - swffont->glyph = (SWFGLYPH*)rfx_calloc(sizeof(SWFGLYPH)*swffont->numchars); - swffont->glyphnames = (char**)rfx_calloc(sizeof(char*)*swffont->numchars); - - SRECT max = {0,0,0,0}; - for(t=0;tnum_glyphs;t++) { - drawer_t draw; - gfxline_t*line; - double advance = 0; - int u = font->glyphs[t].unicode; - int s; - char twice=0; - for(s=0;snum_glyphs;s++) { - if(swffont->glyph2ascii[s]==u) - twice=1; - } - if(u >= 0xd800 || u == 0x0000 || twice) { - /* flash 8 flashtype requires unique unicode IDs for each character. - We use the Unicode private user area to assign characters, hoping that - the font doesn't contain more than 8192 glyphs */ - u = 0xe000 + (t&0x1fff); - } - swffont->glyph2ascii[t] = u; - - if(font->glyphs[t].name) { - swffont->glyphnames[t] = strdup(font->glyphs[t].name); - } else { - swffont->glyphnames[t] = 0; - } - advance = font->glyphs[t].advance; - - swf_Shape01DrawerInit(&draw, 0); - line = font->glyphs[t].line; - - const double scale = GLYPH_SCALE; - while(line) { - FPOINT c,to; - c.x = line->sx * scale; c.y = -line->sy * scale; - //to.x = floor(line->x * scale); to.y = floor(-line->y * scale); - to.x = line->x * scale; to.y = -line->y * scale; - - /*if(strstr(swffont->name, "BIRNU") && t==90) { - to.x += 1; - }*/ - - if(line->type == gfx_moveTo) { - draw.moveTo(&draw, &to); - } else if(line->type == gfx_lineTo) { - draw.lineTo(&draw, &to); - } else if(line->type == gfx_splineTo) { - draw.splineTo(&draw, &c, &to); - } - line = line->next; - } - draw.finish(&draw); - swffont->glyph[t].shape = swf_ShapeDrawerToShape(&draw); - - SRECT bbox = swf_ShapeDrawerGetBBox(&draw); - swf_ExpandRect2(&max, &bbox); - - swffont->layout->bounds[t] = bbox; - - if(advance<32768.0/20) { - swffont->glyph[t].advance = (int)(advance*20); - } else { - //msg(" Advance value overflow in glyph %d", t); - swffont->glyph[t].advance = 32767; - } - - draw.dealloc(&draw); - - swf_ExpandRect2(&bounds, &swffont->layout->bounds[t]); - } - - for(t=0;tnum_glyphs;t++) { - SRECT bbox = swffont->layout->bounds[t]; - - /* if the glyph doesn't have a bounding box, use the - combined bounding box (necessary e.g. for space characters) */ - if(!(bbox.xmin|bbox.ymin|bbox.xmax|bbox.ymax)) { - swffont->layout->bounds[t] = bbox = max; - } - - /* check that the advance value is reasonable, by comparing it - with the bounding box */ - if(bbox.xmax>0 && (bbox.xmax*10 < swffont->glyph[t].advance || !swffont->glyph[t].advance)) { - if(swffont->glyph[t].advance) - msg(" fix bad advance value for char %d: bbox=%.2f, advance=%.2f\n", t, bbox.xmax/20.0, swffont->glyph[t].advance/20.0); - swffont->glyph[t].advance = bbox.xmax; - } - //swffont->glyph[t].advance = bbox.xmax - bbox.xmin; - } - - - /* Flash player will use the advance value from the char, and the ascent/descent values - from the layout for text selection. - ascent will extend the char into negative y direction, from the baseline, while descent - will extend in positive y direction, also from the baseline. - The baseline is defined as the y-position zero - */ - - swffont->layout->ascent = bounds.ymin<0?-bounds.ymin:0; - swffont->layout->descent = bounds.ymax>0?bounds.ymax:0; - swffont->layout->leading = bounds.ymax - bounds.ymin; - - /* if the font has proper ascent/descent values (>0) and those define - greater (but not overly large) line spacing than what we estimated - from the bounding boxes, use the font's parameters */ - if(font->ascent*20 > swffont->layout->ascent && font->ascent*20*2 < swffont->layout->ascent) - swffont->layout->ascent = font->ascent*20; - if(font->descent*20 > swffont->layout->descent && font->descent*20*2 < swffont->layout->descent) - swffont->layout->descent = font->descent*20; - - swf_FontSort(swffont); - return swffont; -} - -static void swf_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - if(i->swffont && i->swffont->name && !strcmp((char*)i->swffont->name,font->id)) - return; // the requested font is the current font - - fontlist_t*last=0,*l = i->fontlist; - while(l) { - last = l; - if(!strcmp((char*)l->swffont->name, font->id)) { - return; // we already know this font - } - l = l->next; - } - l = (fontlist_t*)rfx_calloc(sizeof(fontlist_t)); - l->swffont = gfxfont_to_swffont(font, font->id, (i->config_flashversion>=8 && !NO_FONT3)?3:2); - l->next = 0; - if(last) { - last->next = l; - } else { - i->fontlist = l; - } - swf_FontSetID(l->swffont, getNewID(i->dev)); - - if(getScreenLogLevel() >= LOGLEVEL_DEBUG) { - int iii; - // print font information - msg(" Font %s",font->id); - msg(" | ID: %d", l->swffont->id); - msg(" | Version: %d", l->swffont->version); - msg(" | Name: %s", l->swffont->name); - msg(" | Numchars: %d", l->swffont->numchars); - msg(" | Maxascii: %d", l->swffont->maxascii); - msg(" | Style: %d", l->swffont->style); - msg(" | Encoding: %d", l->swffont->encoding); - if(l->swffont->layout) { - msg(" | Ascent: %.2f", l->swffont->layout->ascent / 20.0); - msg(" | Descent: %.2f", l->swffont->layout->descent / 20.0); - msg(" | Leading: %.2f", l->swffont->layout->leading / 20.0); - } - - for(iii=0; iiiswffont->numchars;iii++) { - msg(" | Glyph %d) name=%s, unicode=%d size=%d bbox=(%.2f,%.2f,%.2f,%.2f)\n", iii, l->swffont->glyphnames?l->swffont->glyphnames[iii]:"", l->swffont->glyph2ascii[iii], l->swffont->glyph[iii].shape->bitlen, - l->swffont->layout->bounds[iii].xmin/20.0, - l->swffont->layout->bounds[iii].ymin/20.0, - l->swffont->layout->bounds[iii].xmax/20.0, - l->swffont->layout->bounds[iii].ymax/20.0 - ); - } - } -} - -static void swf_switchfont(gfxdevice_t*dev, const char*fontid) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - - if(i->swffont && i->swffont->name && !strcmp((char*)i->swffont->name,fontid)) - return; // the requested font is the current font - - fontlist_t*l = i->fontlist; - while(l) { - if(!strcmp((char*)l->swffont->name, fontid)) { - i->swffont = l->swffont; - return; //done! - } - l = l->next; - } - msg(" Unknown font id: %s", fontid); - return; -} - -/* sets the matrix which is to be applied to characters drawn by swfoutput_drawchar() */ -static void setfontscale(gfxdevice_t*dev,double m11,double m12, double m21,double m22,double x, double y, char force) -{ - m11 *= 1024; - m12 *= 1024; - m21 *= 1024; - m22 *= 1024; - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->lastfontm11 == m11 && - i->lastfontm12 == m12 && - i->lastfontm21 == m21 && - i->lastfontm22 == m22 && !force) - return; - if(i->textmode) - endtext(dev); - - i->lastfontm11 = m11; - i->lastfontm12 = m12; - i->lastfontm21 = m21; - i->lastfontm22 = m22; - - double xsize = sqrt(m11*m11 + m12*m12); - double ysize = sqrt(m21*m21 + m22*m22); - - int extrazoom = 1; - if(i->config_flashversion>=8 && !NO_FONT3) - extrazoom = 20; - - i->current_font_size = (xsize>ysize?xsize:ysize)*extrazoom; - if(i->current_font_size < 1) - i->current_font_size = 1; - - MATRIX m; - swf_GetMatrix(0, &m); - - if(m21 || m12 || fabs(m11+m22)>0.001 || m11<0) { - double ifs = (double)extrazoom/(i->current_font_size); - m.sx = (S32)((m11*ifs)*65536); m.r1 = -(S32)((m21*ifs)*65536); - m.r0 = (S32)((m12*ifs)*65536); m.sy = -(S32)((m22*ifs)*65536); - } - - /* this is the position of the first char to set a new fontmatrix- - we hope that it's close enough to all other characters using the - font, so we use its position as origin for the matrix */ - m.tx = x*20; - m.ty = y*20; - i->fontmatrix = m; -} - - -static void swf_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(!font) { - msg(" swf_drawchar called (glyph %d) without font", glyph); - return; - } - - if(i->config_drawonlyshapes) { - gfxglyph_t*g = &font->glyphs[glyph]; - gfxline_t*line2 = gfxline_clone(g->line); - gfxline_transform(line2, matrix); - dev->fill(dev, line2, color); - gfxline_free(line2); - return; - } - - if(!i->swffont || !i->swffont->name || strcmp((char*)i->swffont->name,font->id)) // not equal to current font - { - swf_switchfont(dev, font->id); // set the current font - } - - if(!i->swffont) { - msg(" swf_drawchar: Font is NULL"); - return; - } - if(glyph<0 || glyph>=i->swffont->numchars) { - msg(" No character %d in font %s (%d chars)", glyph, FIXNULL((char*)i->swffont->name), i->swffont->numchars); - return; - } - glyph = i->swffont->glyph2glyph[glyph]; - - setfontscale(dev, matrix->m00, matrix->m01, matrix->m10, matrix->m11, matrix->tx, matrix->ty, 0); - - double det = i->fontmatrix.sx/65536.0 * i->fontmatrix.sy/65536.0 - - i->fontmatrix.r0/65536.0 * i->fontmatrix.r1/65536.0; - if(fabs(det) < 0.0005) { - /* x direction equals y direction- the text is invisible */ - msg(" Not drawing invisible character %d (det=%f, m=[%f %f;%f %f]\n", glyph, - det, - i->fontmatrix.sx/65536.0, i->fontmatrix.r1/65536.0, - i->fontmatrix.r0/65536.0, i->fontmatrix.sy/65536.0); - return; - } - - /*if(i->swffont->glyph[glyph].shape->bitlen <= 16) { - msg(" Glyph %d in current charset (%s, %d characters) is empty", - glyph, FIXNULL((char*)i->swffont->name), i->swffont->numchars); - return 1; - }*/ - - /* calculate character position with respect to the current font matrix */ - double s = 20 * GLYPH_SCALE / det; - double px = matrix->tx - i->fontmatrix.tx/20.0; - double py = matrix->ty - i->fontmatrix.ty/20.0; - int x = (SCOORD)(( px * i->fontmatrix.sy/65536.0 - py * i->fontmatrix.r1/65536.0)*s); - int y = (SCOORD)((- px * i->fontmatrix.r0/65536.0 + py * i->fontmatrix.sx/65536.0)*s); - if(x>32767 || x<-32768 || y>32767 || y<-32768) { - msg(" Moving character origin to %f %f\n", matrix->tx, matrix->ty); - endtext(dev); - setfontscale(dev, matrix->m00, matrix->m01, matrix->m10, matrix->m11, matrix->tx, matrix->ty, 1); - /* since we just moved the char origin to the current char's position, - it now has the relative position (0,0) */ - x = y = 0; - } - - if(i->shapeid>=0) - endshape(dev); - - if(i->config_animate) { - endtext(dev); - i->tag = swf_InsertTag(i->tag,ST_SHOWFRAME); - } - - if(!i->textmode) - starttext(dev); - - msg(" Drawing char %d in font %d at %d,%d in color %02x%02x%02x%02x", - glyph, i->swffont->id, x, y, color->r, color->g, color->b, color->a); - - if(color->a == 0 && i->config_invisibletexttofront) { - RGBA color2 = *(RGBA*)color; - if(i->config_flashversion>=8) { - // use "multiply" blend mode - color2.a = color2.r = color2.g = color2.b = 255; - } - i->topchardata = charbuffer_append(i->topchardata, i->swffont, glyph, x, y, i->current_font_size, color2, &i->fontmatrix); - } else { - i->chardata = charbuffer_append(i->chardata, i->swffont, glyph, x, y, i->current_font_size, *(RGBA*)color, &i->fontmatrix); - } - swf_FontUseGlyph(i->swffont, glyph, i->current_font_size); - return; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.h deleted file mode 100644 index efb08fb64..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/swf.h +++ /dev/null @@ -1,37 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __swfoutput_h__ -#define __swfoutput_h__ - -#include "../gfxdevice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_swf_init(gfxdevice_t*); - -#ifdef __cplusplus -} -#endif - -#endif //__swfoutput_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/text.c b/fluidbook/tools/swftools-special-swfdump/lib/devices/text.c deleted file mode 100644 index ed7f60ce8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/text.c +++ /dev/null @@ -1,255 +0,0 @@ -/* text.c - - Part of the swftools package. - - Copyright (c) 2006 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include -#include "../types.h" -#include "../mem.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../utf8.h" - -typedef struct _textpage { - char*text; - int textsize; - int textpos; - struct _textpage*next; -} textpage_t; - -typedef struct _internal { - textpage_t*first_page; - textpage_t*current_page; - double currentx; - double currenty; - double lastadvance; -} internal_t; - -int text_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - return 0; -} -void text_startpage(gfxdevice_t*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - if(!i->first_page) { - i->first_page = i->current_page = (textpage_t*)malloc(sizeof(textpage_t)); - } else { - i->current_page->next = (textpage_t*)malloc(sizeof(textpage_t)); - i->current_page = i->current_page->next; - } - i->current_page->textsize = 4096; - i->current_page->text = (char*)malloc(i->current_page->textsize); - i->current_page->textpos = 0; - i->current_page->next = 0; - i->currentx = 0; - i->currenty = 0; - i->lastadvance = 0; -} -void text_startclip(gfxdevice_t*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; -} -void text_endclip(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; -} -void text_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; -} -void text_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; -} -void text_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; -} -void text_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; -} -void text_addfont(gfxdevice_t*dev, gfxfont_t*font) {} - -static void addchar(gfxdevice_t*dev, int unicode) -{ - internal_t*i = (internal_t*)dev->internal; - if(!i->current_page) { - text_startpage(dev, 0, 0); - } - if(i->current_page->textpos + 10 > i->current_page->textsize) { - i->current_page->textsize += 4096; - i->current_page->text = realloc(i->current_page->text, i->current_page->textsize); - } - writeUTF8(unicode, &i->current_page->text[i->current_page->textpos]); - i->current_page->textpos += strlen(&i->current_page->text[i->current_page->textpos]); -} - -void text_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - double xshift = matrix->tx - i->currentx; - double yshift = matrix->ty - i->currenty; - i->currentx = matrix->tx; - i->currenty = matrix->ty; - - if(fabs(yshift)>1.0) { - addchar(dev, 10); - } else if(xshift > i->lastadvance*1.3 || xshift<0) { - addchar(dev, 32); - } - int u; - if(font) { - i->lastadvance = font->glyphs[glyphnr].advance*matrix->m00; - u = font->glyphs[glyphnr].unicode; - } else { - u = glyphnr; - i->currentx = 0;i->currenty = 0; - } - if(u>13) { - addchar(dev, u); - } -} - -void text_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*drawlink) -{ - internal_t*i = (internal_t*)dev->internal; -} - -void text_endpage(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; -} - -void text_result_write(gfxresult_t*r, int filedesc) -{ - textpage_t*i= (textpage_t*)r->internal; -} -int text_result_save(gfxresult_t*r, const char*filename) -{ - textpage_t*i= (textpage_t*)r->internal; - if(!i) { - return 0; // no pages drawn - } - FILE*fi = fopen(filename, "wb"); - if(!fi) - return 0; - while(i) { - fwrite(i->text, i->textpos, 1, fi); - i = i->next; - } - fclose(fi); - return 1; -} -void*text_result_get(gfxresult_t*r, const char*name) -{ - textpage_t*i= (textpage_t*)r->internal; - if(!strcmp(name,"text")) { - textpage_t*j = i; - int len = 0; - while(j) { - len += i->textpos; - j = j->next; - } - char*text = (char*)malloc(len); - int pos = 0; - j = i; - while(j) { - memcpy(&text[pos], i->text, i->textpos); - pos += i->textpos; - j = j->next; - } - text[pos] = 0; - return text; - } else if(!strncmp(name,"page",4)) { - int pagenr = atoi(&name[4]); - if(pagenr<0) - pagenr=0; - while(pagenr>0) { - i = i->next; - if(!i) - return 0; - } - i->text[i->textpos] = 0; - return strdup(i->text); - } - return 0; -} -void text_result_destroy(gfxresult_t*r) -{ - textpage_t*i= (textpage_t*)r->internal; - r->internal = 0; - while(i) { - textpage_t*next = i->next; - free(i->text);i->text = 0; - free(i); - i = next; - } - free(r); -} - -gfxresult_t* text_finish(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - - gfxresult_t* res = (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); - - res->internal = i->first_page;i->first_page = 0;i->current_page=0; - res->write = text_result_write; - res->save = text_result_save; - res->get = text_result_get; - res->destroy = text_result_destroy; - - free(dev->internal); dev->internal = 0; i = 0; - - return res; -} - - - -void gfxdevice_text_init(gfxdevice_t*dev, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "text"; - - dev->internal = i; - - dev->setparameter = text_setparameter; - dev->startpage = text_startpage; - dev->startclip = text_startclip; - dev->endclip = text_endclip; - dev->stroke = text_stroke; - dev->fill = text_fill; - dev->fillbitmap = text_fillbitmap; - dev->fillgradient = text_fillgradient; - dev->addfont = text_addfont; - dev->drawchar = text_drawchar; - dev->drawlink = text_drawlink; - dev->endpage = text_endpage; - dev->finish = text_finish; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/devices/text.h b/fluidbook/tools/swftools-special-swfdump/lib/devices/text.h deleted file mode 100644 index 1f520931c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/devices/text.h +++ /dev/null @@ -1,37 +0,0 @@ -/* text.h - Header file for dummy.c - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_text_h__ -#define __gfxdevice_text_h__ - -#include "../gfxdevice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_text_init(gfxdevice_t*dev); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_text_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/drawer.c b/fluidbook/tools/swftools-special-swfdump/lib/drawer.c deleted file mode 100644 index 671ac84aa..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/drawer.c +++ /dev/null @@ -1,390 +0,0 @@ -/* drawer.c - part of swftools - - A generic structure for providing vector drawing. - (Helper routines, spline approximation, simple text drawers) - - Copyright (C) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include -#include "drawer.h" - -static char* getToken(const char**p) -{ - const char*start; - char*result; - while(**p && strchr(" ,()\t\n\r", **p)) { - (*p)++; - } - start = *p; - - /* - SVF pathdata can exclude whitespace after L and M commands. - Ref: http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation - This allows us to use svg files output from gnuplot. - Also checks for relative MoveTo and LineTo (m and l). - 051106 Magnus Lundin, lundin@mlu.mine.nu - */ - if (strchr("LMlm", **p) && (isdigit(*(*p+1))||strchr("+-", *(*p+1)))) { - (*p)++; - } - else while(**p && !strchr(" ,()\t\n\r", **p)) { - (*p)++; - } - result = (char*)malloc((*p)-start+1); - memcpy(result,start,(*p)-start+1); - result[(*p)-start] = 0; - return result; -} - -void draw_conicTo(drawer_t*draw, FPOINT* c, FPOINT* to) -{ - FPOINT* pos = &draw->pos; - FPOINT c1,c2; - c1.x = (pos->x + 2 * c->x) / 3; - c1.y = (pos->y + 2 * c->y) / 3; - c2.x = (2 * c->x + to->x) / 3; - c2.y = (2 * c->y + to->y) / 3; - draw_cubicTo(draw, &c1,&c2,to); - - draw->pos = *to; -} - -/* convenience routine */ -static void draw_conicTo2(drawer_t*draw, double x1, double y1, double x2, double y2) -{ - FPOINT c1,c2; - c1.x = x1; - c1.y = y1; - c2.x = x2; - c2.y = y2; - draw_conicTo(draw, &c1, &c2); -} -/* convenience routine */ -static void draw_moveTo2(drawer_t*draw, double x, double y) -{ - FPOINT c; - c.x = x; c.y = y; - draw->moveTo(draw, &c); -} -/* convenience routine */ -static void draw_lineTo2(drawer_t*draw, double x, double y) -{ - FPOINT c; - c.x = x; c.y = y; - draw->lineTo(draw, &c); -} - -static float getFloat(const char** p) -{ - char* token = getToken(p); - float result = atof(token); - free(token); - return result; -} - -void draw_string(drawer_t*draw, const char*string) -{ - const char*p = string; - while(*p) { - char*token = getToken(&p); - if(!token) - break; - if (!*token) - { - free(token); - break; - } - if(!strncmp(token, "moveTo", 6) || - !strncmp(token, "M", 1) //svg - ) { - FPOINT to; - to.x = getFloat(&p); - to.y = getFloat(&p); - draw->moveTo(draw, &to); - } - else if(!strncmp(token, "lineTo", 6) || - !strncmp(token, "L", 1) //svg - ) { - FPOINT to; - to.x = getFloat(&p); - to.y = getFloat(&p); - draw->lineTo(draw, &to); - } - else if(!strncmp(token, "curveTo", 7) || !strncmp(token, "splineTo", 8)) { - FPOINT mid,to; - mid.x = getFloat(&p); - mid.y = getFloat(&p); - to.x = getFloat(&p); - to.y = getFloat(&p); - draw->splineTo(draw, &mid, &to); - } - else if(!strncmp(token, "conicTo", 5)) { - FPOINT mid,to; - mid.x = getFloat(&p); - mid.y = getFloat(&p); - to.x = getFloat(&p); - to.y = getFloat(&p); - draw_conicTo(draw, &mid, &to); - } - else if(!strncmp(token, "circle", 6)) { - int mx,my,r; - double r2; - mx = getFloat(&p); - my = getFloat(&p); - r = getFloat(&p); - r2 = 0.70710678118654757*r; - draw_moveTo2(draw, mx, my-r); - draw_conicTo2(draw, mx+r2, my-r2, mx+r, my); - draw_conicTo2(draw, mx+r2, my+r2, mx, my+r); - draw_conicTo2(draw, mx-r2, my+r2, mx-r, my); - draw_conicTo2(draw, mx-r2, my-r2, mx, my-r); - } - else if(!strncmp(token, "box", 3)) { - int x1,y1,x2,y2; - x1 = getFloat(&p); - y1 = getFloat(&p); - x2 = getFloat(&p); - y2 = getFloat(&p); - draw_moveTo2(draw, x1, y1); - draw_lineTo2(draw, x1, y2); - draw_lineTo2(draw, x2, y2); - draw_lineTo2(draw, x2, y1); - draw_lineTo2(draw, x1, y1); - } - else if(!strncmp(token, "cubicTo", 5) || - !strncmp(token, "C", 1) //svg - ) { - FPOINT mid1,mid2,to; - mid1.x = getFloat(&p); - mid1.y = getFloat(&p); - mid2.x = getFloat(&p); - mid2.y = getFloat(&p); - to.x = getFloat(&p); - to.y = getFloat(&p); - draw_cubicTo(draw, &mid1, &mid2, &to); - } - else if(!strncmp(token, "z", 1) //svg - ) { - // ignore - } - else - fprintf(stderr, "drawer: Warning: unknown primitive '%s'\n", token); - - free(token); - } -} - -struct SPLINEPOINT -{ - double x,y; -}; - -struct qspline -{ - struct SPLINEPOINT start; - struct SPLINEPOINT control; - struct SPLINEPOINT end; -}; - -struct cspline -{ - struct SPLINEPOINT start; - struct SPLINEPOINT control1; - struct SPLINEPOINT control2; - struct SPLINEPOINT end; -}; - -static inline struct SPLINEPOINT cspline_getpoint(const struct cspline*s, double t) -{ - struct SPLINEPOINT p; - double tt = t*t; - double ttt = tt*t; - double mt = (1-t); - double mtmt = mt*(1-t); - double mtmtmt = mtmt*(1-t); - p.x= s->end.x*ttt + 3*s->control2.x*tt*mt - + 3*s->control1.x*t*mtmt + s->start.x*mtmtmt; - p.y= s->end.y*ttt + 3*s->control2.y*tt*mt - + 3*s->control1.y*t*mtmt + s->start.y*mtmtmt; - return p; -} -static struct SPLINEPOINT qspline_getpoint(const struct qspline*s, double t) -{ - struct SPLINEPOINT p; - p.x= s->end.x*t*t + 2*s->control.x*t*(1-t) + s->start.x*(1-t)*(1-t); - p.y= s->end.y*t*t + 2*s->control.y*t*(1-t) + s->start.y*(1-t)*(1-t); - return p; -} - -static int approximate3(const struct cspline*s, struct qspline*q, int size, double quality2) -{ - unsigned int gran = 0; - unsigned int istep = 0x80000000; - unsigned int istart = 0; - int num = 0; - int level = 0; - - while(istart<0x80000000) - { - unsigned int iend = istart + istep; - double start = istart/(double)0x80000000; - double end = iend/(double)0x80000000; - struct qspline test; - double pos,qpos; - char left = 0,recurse=0; - int t; - int probes = 15; - - /* create simple approximation: a qspline which run's through the - qspline point at 0.5 */ - test.start = cspline_getpoint(s, start); - test.control = cspline_getpoint(s, (start+end)/2); - test.end = cspline_getpoint(s, end); - /* fix the control point: - move it so that the new spline does runs through it */ - test.control.x = -(test.end.x + test.start.x)/2 + 2*(test.control.x); - test.control.y = -(test.end.y + test.start.y)/2 + 2*(test.control.y); - - /* depending on where we are in the spline, we either try to match - the left or right tangent */ - if(start<0.5) - left=1; - /* get derivative */ - pos = left?start:end; - qpos = pos*pos; - test.control.x = s->end.x*(3*qpos) + 3*s->control2.x*(2*pos-3*qpos) + - 3*s->control1.x*(1-4*pos+3*qpos) + s->start.x*(-3+6*pos-3*qpos); - test.control.y = s->end.y*(3*qpos) + 3*s->control2.y*(2*pos-3*qpos) + - 3*s->control1.y*(1-4*pos+3*qpos) + s->start.y*(-3+6*pos-3*qpos); - if(left) { - test.control.x *= (end-start)/2; - test.control.y *= (end-start)/2; - test.control.x += test.start.x; - test.control.y += test.start.y; - } else { - test.control.x *= -(end-start)/2; - test.control.y *= -(end-start)/2; - test.control.x += test.end.x; - test.control.y += test.end.y; - } - -#define PROBES -#ifdef PROBES - /* measure the spline's accurancy, by taking a number of probes */ - for(t=0;tquality2) { - recurse=1;break; - } - qr2 = qspline_getpoint(&test, (1-pos)); - cr2 = cspline_getpoint(s, start+(1-pos)*(end-start)); - - dx = qr2.x - cr2.x; - dy = qr2.y - cr2.y; - dist2 = dx*dx+dy*dy; - - if(dist2>quality2) { - recurse=1;break; - } - } -#else // quadratic error: *much* faster! - - /* convert control point representation to - d*x^3 + c*x^2 + b*x + a */ - double dx,dy; - dx= s->end.x - s->control2.x*3 + s->control1.x*3 - s->start.x; - dy= s->end.y - s->control2.y*3 + s->control1.y*3 - s->start.y; - - /* we need to do this for the subspline between [start,end], not [0,1] - as a transformation of t->a*t+b does nothing to highest coefficient - of the spline except multiply it with a^3, we just need to modify - d here. */ - {double m = end-start; - dx*=m*m*m; - dy*=m*m*m; - } - - /* use the integral over (f(x)-g(x))^2 between 0 and 1 - to measure the approximation quality. - (it boils down to const*d^2) - */ - recurse = (dx*dx + dy*dy > quality2); -#endif - - if(recurse && istep>1 && size-level > num) { - istep >>= 1; - level++; - } else { - *q++ = test; - num++; - istart += istep; - while(!(istart & istep)) { - level--; - istep <<= 1; - } - } - } - return num; -} - -void draw_cubicTo(drawer_t*draw, FPOINT* control1, FPOINT* control2, FPOINT* to) -{ - struct qspline q[128]; - struct cspline c; - //double quality = 80; - double maxerror = 1;//(500-(quality*5)>1?500-(quality*5):1)/20.0; - int t,num; - - c.start.x = draw->pos.x; - c.start.y = draw->pos.y; - c.control1.x = control1->x; - c.control1.y = control1->y; - c.control2.x = control2->x; - c.control2.y = control2->y; - c.end.x = to->x; - c.end.y = to->y; - - num = approximate3(&c, q, 128, maxerror*maxerror); - - for(t=0;tsplineTo(draw, &mid, &to); - } -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/drawer.h b/fluidbook/tools/swftools-special-swfdump/lib/drawer.h deleted file mode 100644 index 7c88df5a1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/drawer.h +++ /dev/null @@ -1,52 +0,0 @@ -/* drawer.h - part of swftools - - A generic structure for providing vector drawing. - - Copyright (C) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __drawer_h__ -#define __drawer_h__ - -typedef struct _FPOINT -{ - float x,y; -} FPOINT; - -typedef struct _drawer_t -{ - void*internal; - - FPOINT pos; //last "to" - - void (*setLineStyle)(struct _drawer_t*draw, void*linestyle); - void (*setFillStyle)(struct _drawer_t*draw, void*fillstyle); - - void (*moveTo)(struct _drawer_t*draw, FPOINT * to); - void (*lineTo)(struct _drawer_t*draw, FPOINT * to); - void (*splineTo)(struct _drawer_t*draw, FPOINT*c, FPOINT * to); - void (*finish)(struct _drawer_t*draw); - - void (*dealloc)(struct _drawer_t*draw); - -} drawer_t; - -void draw_cubicTo(drawer_t*drawer, FPOINT* control1, FPOINT* control2, FPOINT* to); -void draw_conicTo(drawer_t*drawer, FPOINT* control, FPOINT* to); -void draw_string(drawer_t*drawer, const char*code); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/filters/alpha.c b/fluidbook/tools/swftools-special-swfdump/lib/filters/alpha.c deleted file mode 100644 index 98a49af4c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/filters/alpha.c +++ /dev/null @@ -1,117 +0,0 @@ -/* alpha.c - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "../gfxfilter.h" -#include "../gfxtools.h" -#include "../types.h" -#include "../mem.h" - -typedef struct _internal { - U8 alpha; -} internal_t; - -static inline gfxcolor_t transform_color(internal_t*i, gfxcolor_t*col) -{ - gfxcolor_t col2; - col2.r = col->r; - col2.g = col->g; - col2.b = col->b; - col2.a = (col->a * i->alpha)/255; - return col2; -} - -static void maketransparent_stroke(gfxfilter_t*f, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - gfxcolor_t color2 = transform_color(i, color); - out->stroke(out, line, width, &color2, cap_style, joint_style, miterLimit); -} -static void maketransparent_fill(gfxfilter_t*f, gfxline_t*line, gfxcolor_t*color, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - gfxcolor_t color2 = transform_color(i, color); - out->fill(out, line, &color2); -} -static void maketransparent_fillbitmap(gfxfilter_t*f, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - gfximage_t img2; - img2.width = img->width; - img2.height = img->height; - img2.data = (gfxcolor_t*)rfx_alloc(img->width*img->height*4); - int x,y; - for(y=0;yheight;y++) { - gfxcolor_t*in = &img->data[y*img->width]; - gfxcolor_t*out = &img2.data[y*img->width]; - for(x=0;xwidth;x++) { - out[x] = transform_color(i, &in[x]); - } - } - out->fillbitmap(out, line, &img2, matrix, cxform); - rfx_free(img2.data); -} -static void maketransparent_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - gfxcolor_t color2 = transform_color(i, color); - out->drawchar(out, font, glyphnr, color, matrix); -} -static void maketransparent_fillgradient(gfxfilter_t*f, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - - gfxgradient_t*g = 0, *prev = 0; - - while(gradient) { - gfxgradient_t*n = rfx_alloc(sizeof(gfxgradient_t)); - n->pos = gradient->pos; - n->color = transform_color(i, &gradient->color); - n->next = 0; - if(prev) { - prev->next = n; - prev = n; - } else { - g = prev = n; - } - gradient = gradient->next; - } - - out->fillgradient(out, line, g, type, matrix); - gfxgradient_destroy(g); -} - -void gfxfilter_maketransparent_init(gfxfilter_t*f, U8 alpha) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - i->alpha = alpha; - - memset(f, 0, sizeof(gfxfilter_t)); - f->type = gfxfilter_onepass; - f->name = "maketransparent"; - f->internal = i; - f->stroke = maketransparent_stroke; - f->fill = maketransparent_fill; - f->fillbitmap = maketransparent_fillbitmap; - f->fillgradient = maketransparent_fillgradient; - f->drawchar = maketransparent_drawchar; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/filters/one_big_font.c b/fluidbook/tools/swftools-special-swfdump/lib/filters/one_big_font.c deleted file mode 100644 index 8802171bf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/filters/one_big_font.c +++ /dev/null @@ -1,117 +0,0 @@ -/* remove_font_transform.c - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "../gfxfilter.h" -#include "../gfxtools.h" -#include "../gfxfont.h" -#include "../types.h" -#include "../mem.h" - -typedef struct _internal { - gfxfontlist_t*fonts; - gfxfont_t*font; - int num_glyphs; -} internal_t; - -typedef struct _fontdata { - gfxfont_t*font; - int start; -} fontdata_t; - -static void pass1_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - fontdata_t*d = gfxfontlist_getuserdata(i->fonts, font->id); - if(!d) { - d = rfx_calloc(sizeof(fontdata_t)); - d->font = font; - d->start = i->num_glyphs; - i->num_glyphs += font->num_glyphs; - i->fonts = gfxfontlist_addfont2(i->fonts, font, d); - } - out->drawchar(out, font, glyphnr, color, matrix); -} -static gfxresult_t*pass1_finish(gfxfilter_t*f, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - gfxfont_t*font = i->font = rfx_calloc(sizeof(gfxfont_t)); - font->id = strdup("onebigfont"); - font->num_glyphs = i->num_glyphs; - font->glyphs = rfx_calloc(sizeof(gfxglyph_t)*i->num_glyphs); - gfxfontlist_t*l = i->fonts; - while(l) { - gfxfont_t*old = l->font; - fontdata_t*d = l->user; - memcpy(font->glyphs + d->start, old->glyphs, sizeof(gfxglyph_t)*old->num_glyphs); - if(old->ascent > font->ascent) - font->ascent = old->ascent; - if(old->descent > font->descent) - font->descent = old->descent; - l = l->next; - } - gfxfont_fix_unicode(font, 0); - return out->finish(out); -} - -static void pass2_addfont(gfxfilter_t*f, gfxfont_t*font, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - out->addfont(out, i->font); -} -static void pass2_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - fontdata_t*d = gfxfontlist_getuserdata(i->fonts, font->id); - out->drawchar(out, i->font, glyphnr + d->start, color, matrix); -} -static gfxresult_t*pass2_finish(gfxfilter_t*f, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - // clean up - gfxfontlist_t*l = i->fonts; - while(l) { - free(l->user);l->user=0; - l=l->next; - } - gfxfontlist_free(i->fonts, 0);i->fonts=0; - return out->finish(out); -} - -void gfxtwopassfilter_one_big_font_init(gfxtwopassfilter_t*f) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - - memset(f, 0, sizeof(gfxtwopassfilter_t)); - f->type = gfxfilter_twopass; - - f->pass1.name = "filter \"one big font\" pass 1"; - f->pass1.drawchar = pass1_drawchar; - f->pass1.finish = pass1_finish; - f->pass1.internal = i; - - f->pass2.name = "filter \"one big font\" pass 2"; - f->pass2.addfont = pass2_addfont; - f->pass2.drawchar = pass2_drawchar; - f->pass2.finish = pass2_finish; - f->pass2.internal = i; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/filters/remove_font_transforms.c b/fluidbook/tools/swftools-special-swfdump/lib/filters/remove_font_transforms.c deleted file mode 100644 index e1d05902b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/filters/remove_font_transforms.c +++ /dev/null @@ -1,326 +0,0 @@ -/* remove_font_transform.c - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../gfxfilter.h" -#include "../gfxtools.h" -#include "../gfxfont.h" -#include "../types.h" -#include "../mem.h" -#include "../q.h" -#include "../log.h" - -typedef struct _mymatrix { - float m00,m01,m10,m11; - char*id; - unsigned char alpha; -} mymatrix_t; - -static void* mymatrix_clone(const void*_m) { - if(_m==0) - return 0; - const mymatrix_t*m1=_m; - mymatrix_t*m2 = malloc(sizeof(mymatrix_t)); - *m2 = *m1; - m2->id = strdup(m1->id); - return m2; -} -static unsigned int mymatrix_hash(const void*_m) { - if(!_m) - return 0; - const mymatrix_t*m = (mymatrix_t*)_m; - unsigned int h=0; - h = crc32_add_bytes(h, (char*)&m->m00, sizeof(m->m00)); - h = crc32_add_bytes(h, (char*)&m->m01, sizeof(m->m01)); - h = crc32_add_bytes(h, (char*)&m->m10, sizeof(m->m10)); - h = crc32_add_bytes(h, (char*)&m->m11, sizeof(m->m11)); - h = crc32_add_bytes(h, (char*)&m->alpha, 1); - h = crc32_add_string(h, m->id); - return h; -} -static void mymatrix_destroy(void*_m) { - mymatrix_t*m = (mymatrix_t*)_m; - free(m->id);m->id=0; - free(m); -} -static char mymatrix_equals(const void*_m1, const void*_m2) { - const mymatrix_t*m1=_m1; - const mymatrix_t*m2=_m2; - if(!m1 || !m2) - return m1==m2; - - /* we do a binary comparison of the float32 - bits here instead of a numerical comparison - to prevent the compiler from e.g. removing the - (float) cast during optimization, which would break - the equivalence between equals() and hash() (as - the hash is derived from the float32 values) */ - return *(U32*)&m1->m00 == *(U32*)&m2->m00 && - *(U32*)&m1->m01 == *(U32*)&m2->m01 && - *(U32*)&m1->m10 == *(U32*)&m2->m10 && - *(U32*)&m1->m11 == *(U32*)&m2->m11 && - m1->alpha == m2->alpha && - !strcmp(m1->id, m2->id); -} -type_t mymatrix_type = { - dup: mymatrix_clone, - hash: mymatrix_hash, - free: mymatrix_destroy, - equals: mymatrix_equals -}; - -typedef struct _internal { - dict_t*matrices; - char first; -} internal_t; - - -#ifdef __GNUC__ -int __attribute__((noinline)) - matrix_convert(gfxmatrix_t*in, const char*id, mymatrix_t*out, gfxmatrix_t*scalematrix, unsigned char alpha) -#else -int matrix_convert(gfxmatrix_t*in, const char*id, mymatrix_t*out, gfxmatrix_t*scalematrix, unsigned char alpha) -#endif -{ - double l1 = sqrt(in->m00 * in->m00 + in->m01 * in->m01); - double l2 = sqrt(in->m10 * in->m10 + in->m11 * in->m11); - double l = (l1+l2)/2.0; - if(l < 1e-10) { - memset(out, 0, sizeof(*out)); - return 0; - } - out->m00 = in->m00 / l; - out->m10 = in->m10 / l; - out->m01 = -in->m01 / l; - out->m11 = -in->m11 / l; - out->id = (char*)id; - out->alpha = alpha?1:0; - - if(scalematrix) { - scalematrix->m00 = l; - scalematrix->m01 = 0; - scalematrix->m10 = 0; - scalematrix->m11 = -l; - scalematrix->tx = in->tx; - scalematrix->ty = in->ty; - } - return 1; -} - -typedef struct _matrixdata { - gfxfontlist_t*fonts; -} matrixdata_t; - -typedef struct _transformedfont { - gfxfont_t*orig; - gfxfont_t*font; - mymatrix_t matrix; - int*used; - double dx; -} transformedfont_t; - -static transformedfont_t* transformedfont_new(gfxfont_t*orig, mymatrix_t*m) -{ - transformedfont_t*f = rfx_calloc(sizeof(transformedfont_t)); - f->orig = orig; - f->matrix = *m; - f->used = rfx_calloc(sizeof(f->used[0])*orig->num_glyphs); - int t; - for(t=0;tnum_glyphs;t++) { - if(orig->glyphs[t].unicode==32 && - (!orig->glyphs[t].line || - !orig->glyphs[t].line->next || - !orig->glyphs[t].line->next->next)) - f->used[t]=1; //always preserve the space char in fonts - } - return f; -} - -static void pass1_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - mymatrix_t m; - if(!font->id) - msg(" Font has no ID"); - if(!matrix_convert(matrix, font->id?font->id:"unknown", &m, 0, color->a)) - return; - transformedfont_t*fd = dict_lookup(i->matrices, &m); - if(!fd) { - fd = transformedfont_new(font, &m); - dict_put(i->matrices, &m, fd); - } - fd->used[glyphnr]=1; - out->drawchar(out, font, glyphnr, color, matrix); -} - -static void glyph_transform(gfxglyph_t*g, mymatrix_t*mm) -{ - gfxmatrix_t m; - m.m00 = mm->m00; - m.m01 = mm->m01; - m.m10 = mm->m10; - m.m11 = mm->m11; - m.tx = 0; - m.ty = 0; - if(m.m00>0) - g->advance *= m.m00; - g->line = gfxline_clone(g->line); - gfxline_transform(g->line, &m); -} - -static gfxresult_t* pass1_finish(gfxfilter_t*f, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - DICT_ITERATE_DATA(i->matrices, transformedfont_t*, fd) { - gfxfont_t*font = fd->font = rfx_calloc(sizeof(gfxfont_t)); - char id[80]; - static int fontcount=0; - sprintf(id, "font%d", fontcount++); - font->id = strdup(id); - int t; - int count=0; - for(t=0;torig->num_glyphs;t++) { - if(fd->used[t]) - count++; - } - font->num_glyphs = count; - font->glyphs = rfx_calloc(sizeof(gfxglyph_t)*font->num_glyphs); - count = 0; - for(t=0;torig->num_glyphs;t++) { - if(fd->used[t]) { - font->glyphs[count] = fd->orig->glyphs[t]; - glyph_transform(&font->glyphs[count], &fd->matrix); - fd->used[t] = count + 1; - count++; - } - } - - /* adjust the origin so that every character is to the - right of the origin */ - gfxbbox_t total = {0,0,0,0}; - double average_xmax = 0; - for(t=0;tglyphs[t].line; - gfxbbox_t b = gfxline_getbbox(line); - total = gfxbbox_expand_to_bbox(total, b); - } - if(count) - average_xmax /= count; - - fd->dx = 0;//-total.xmin; - - font->ascent = total.ymax; - font->descent = -total.ymin; - - for(t=0;tglyphs[t]; - gfxline_t*line = font->glyphs[t].line; - - if(fd->matrix.alpha) { - while(line) { - line->x += fd->dx; - line->sx += fd->dx; - line = line->next; - } - } else { - gfxline_free(g->line); - /* for OCR: remove the outlines of characters that are only - ever displayed with alpha=0 */ - g->line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); - g->line->type = gfx_moveTo; - g->line->x = g->advance; - } - } - - gfxfont_fix_unicode(font, 1); - } - return out->finish(out); -} - -static void pass2_addfont(gfxfilter_t*f, gfxfont_t*font, gfxdevice_t*out) -{ - /* we throw away original fonts, and do the addfont() for the transformed - fonts in the first drawchar() */ -} - -static void pass2_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*_color, gfxmatrix_t*matrix, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - gfxcolor_t color = *_color; - - if(i->first) { - i->first = 0; - DICT_ITERATE_DATA(i->matrices, transformedfont_t*, fd) { - out->addfont(out, fd->font); - } - } - - mymatrix_t m; - gfxmatrix_t scalematrix; - matrix_convert(matrix, font->id?font->id:"unknown", &m, &scalematrix, color.a); - transformedfont_t*d = dict_lookup(i->matrices, &m); - scalematrix.tx -= d->dx*scalematrix.m00; - - /* if this character is invisible (alpha=0), then we will have removed the - outline, so we make set the alpha color channel to "fully visible" again to allow - output devices to be more performant (transparency is expensive) */ - if(!m.alpha) - color.a = 255; - - out->drawchar(out, d->font, d->used[glyphnr]-1, &color, &scalematrix); -} - -static gfxresult_t* pass2_finish(gfxfilter_t*f, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - DICT_ITERATE_DATA(i->matrices, transformedfont_t*, fd) { - if(fd->used) { - free(fd->used);fd->used=0; - } - free(fd); - } - dict_destroy(i->matrices);i->matrices=0; - return out->finish(out); -} - -void gfxtwopassfilter_remove_font_transforms_init(gfxtwopassfilter_t*f) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - - memset(f, 0, sizeof(gfxtwopassfilter_t)); - f->type = gfxfilter_twopass; - - f->pass1.name = "remove font transforms pass 1"; - f->pass1.drawchar = pass1_drawchar; - f->pass1.finish = pass1_finish; - f->pass1.internal = i; - - f->pass2.name = "remove font transforms pass 2"; - f->pass2.addfont = pass2_addfont; - f->pass2.drawchar = pass2_drawchar; - f->pass2.finish = pass2_finish; - f->pass2.internal = i; - - i->matrices = dict_new2(&mymatrix_type); - i->first = 1; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/filters/vectors_to_glyphs.c b/fluidbook/tools/swftools-special-swfdump/lib/filters/vectors_to_glyphs.c deleted file mode 100644 index 8cd91ec72..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/filters/vectors_to_glyphs.c +++ /dev/null @@ -1,165 +0,0 @@ -/* vectors_to_fonts.c - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../gfxfilter.h" -#include "../gfxtools.h" -#include "../gfxpoly.h" -#include "../gfxfont.h" -#include "../types.h" -#include "../mem.h" -#include "../q.h" - -typedef struct _vglyph { - gfxglyph_t glyph; - struct _vglyph*next; -} vglyph_t; - -typedef struct _internal { - vglyph_t*first_glyph; - vglyph_t*last_glyph; - gfxfont_t*font; - char first; - int glyph_nr; -} internal_t; - -#define FONT_SIZE 1024.0 - -static void pass1_fill(gfxfilter_t*f, gfxline_t*line, gfxcolor_t*color, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - gfxbbox_t bbox = gfxline_getbbox(line); - double height = bbox.ymax - bbox.ymin; - double width = bbox.xmax - bbox.xmin; - double size = fmax(width,height); - if(fabs(size) < 1e-3) return; - double scale = FONT_SIZE/size; - gfxmatrix_t m = {scale, 0, -bbox.xmin*scale, - 0, scale, -bbox.ymax*scale}; - line = gfxline_clone(line); - gfxline_transform(line, &m); - line = gfxline_restitch(line); - vglyph_t*v = rfx_calloc(sizeof(vglyph_t)); - v->glyph.line = line; - v->glyph.advance = width*scale; - v->glyph.unicode = 32+i->glyph_nr; - - i->last_glyph->next = v; - i->last_glyph = v; - - gfxmatrix_t m2 = {1.0/scale, 0, bbox.xmin, - 0, 1.0/scale, bbox.ymax}; - out->drawchar(out, 0, i->glyph_nr, color, &m2); - - i->glyph_nr++; -} -static void pass1_stroke(gfxfilter_t*f, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, gfxdevice_t*out) -{ - return; - internal_t*i = (internal_t*)f->internal; - gfxpoly_t*poly = gfxpoly_from_stroke(line, width, cap_style, joint_style, miterLimit, DEFAULT_GRID); - gfxline_t*line2 = gfxline_from_gfxpoly_with_direction(poly); - pass1_fill(f, line2, color, out); - gfxline_free(line2); - gfxpoly_destroy(poly); -} - -static void make_font(internal_t*i) -{ - i->font = rfx_calloc(sizeof(gfxfont_t)); - i->font->id = "SWFTools-Vector-Magic"; - i->font->num_glyphs = i->glyph_nr; - i->font->glyphs = malloc(sizeof(gfxglyph_t)*i->font->num_glyphs); - i->font->ascent = FONT_SIZE; - i->font->descent = 0; - int pos = 0; - vglyph_t*g = i->first_glyph; - while(g) { - i->font->glyphs[pos] = g->glyph; - pos++; - g = g->next; - } - gfxfont_fix_unicode(i->font, 1); -} - -static void pass2_drawchar(gfxfilter_t*f, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)f->internal; - if(i->first) { - make_font(i); - out->addfont(out, i->font); - i->first = 0; - } - if(!font) { - font = i->font; - - gfxcolor_t red = {255,254,1,1}; - int x; - gfxmatrix_t m = {1.0, 0,0, - 0, 1.0,0}; - out->drawchar(out, font, 1, &red, &m); - - /*gfxmatrix_t m2 = {1.0, 0,600, - 0, 1.0,600}; - out->drawchar(out, font, 1, &red, &m2);*/ - gfxline_t*line = gfxline_makerectangle(0, 0, 1, 1); - gfximage_t img; - img.data = color; - img.width = 1; - img.height = 1; - out->fillbitmap(out, line, &img, &m, 0); - } - out->drawchar(out, font, glyphnr, color, matrix); -} - -void gfxtwopassfilter_vectors_to_glyphs_init(gfxtwopassfilter_t*f) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - - memset(f, 0, sizeof(gfxtwopassfilter_t)); - f->type = gfxfilter_twopass; - - f->pass1.name = "vectors to glyphs pass 1"; - f->pass1.fill = pass1_fill; - f->pass1.stroke = pass1_stroke; - f->pass1.internal = i; - - f->pass2.name = "vectors to glyphs pass 2"; - f->pass2.drawchar = pass2_drawchar; - f->pass2.internal = i; - - i->first = 1; - - i->first_glyph = rfx_calloc(sizeof(vglyph_t)); - i->first_glyph->glyph.line = 0; - i->first_glyph->glyph.advance = FONT_SIZE; - i->first_glyph->glyph.unicode = 32; - i->last_glyph = rfx_calloc(sizeof(vglyph_t)); - // dummy char - i->first_glyph->next = i->last_glyph; - i->last_glyph->glyph.line = 0; - i->last_glyph->glyph.advance = FONT_SIZE/8; - i->last_glyph->glyph.unicode = 33; - i->glyph_nr = 2; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxdevice.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxdevice.h deleted file mode 100644 index fa22bc56e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxdevice.h +++ /dev/null @@ -1,139 +0,0 @@ -#ifndef __gfxdevice_h__ -#define __gfxdevice_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define GFX_SUBPIXEL 2560 - -typedef double gfxcoord_t; - -typedef enum {gfx_moveTo, gfx_lineTo, gfx_splineTo} gfx_linetype; -typedef enum {gfx_joinMiter, gfx_joinRound, gfx_joinBevel} gfx_joinType; -typedef enum {gfx_capButt, gfx_capRound, gfx_capSquare} gfx_capType; - -typedef struct _gfxline -{ - gfx_linetype type; - gfxcoord_t x,y; - gfxcoord_t sx,sy; - struct _gfxline*next; /*NULL=end*/ -} gfxline_t; - -typedef struct _gfxglyph -{ - gfxline_t*line; - gfxcoord_t advance; - - int unicode; // array? - const char*name; -} gfxglyph_t; - -typedef struct _gfxfont -{ - const char*id; - int num_glyphs; - int max_unicode; - - double ascent,descent; - - gfxglyph_t*glyphs; - int* unicode2glyph; -} gfxfont_t; - -typedef struct _gfxcolor -{ - unsigned char a; - unsigned char r; - unsigned char g; - unsigned char b; -} gfxcolor_t; - -typedef struct _gfxmatrix -{ - double m00,m10,tx; - double m01,m11,ty; -} gfxmatrix_t; - -typedef struct _gfximage -{ - /* if the data contains an alpha layer (a != 255), the - r,g,b values will have to be premultiplied */ - gfxcolor_t*data; - unsigned width; - unsigned height; -} gfximage_t; - -/* gradients: A radial gradient will start at 0,0 and have a radius of 1,0 - An axial gradient starts at -1,0 and ends at 1,0 - */ -typedef enum {gfxgradient_radial, gfxgradient_linear} gfxgradienttype_t; -typedef struct _gfxgradient -{ - gfxcolor_t color; - float pos; // 0.0 - 1.0 - struct _gfxgradient*next; //NULL=end -} gfxgradient_t; - -typedef struct _gfxcxform -{ - float rr,rg,rb,ra, tr; - float gr,gg,gb,ga, tg; - float br,bg,bb,ba, tb; - float ar,ag,ab,aa, ta; -} gfxcxform_t; - -typedef struct _gfxbbox -{ - gfxcoord_t xmin, ymin, xmax, ymax; -} gfxbbox_t; - -typedef struct _gfxresult -{ - void (*write)(struct _gfxresult*gfx, int filedesc); - int (*save)(struct _gfxresult*gfx, const char*filename); - void* (*get)(struct _gfxresult*gfx, const char*name); - void (*destroy)(struct _gfxresult*gfx); - - void*internal; -} gfxresult_t; - -typedef struct _gfxdevice -{ - const char* name; // gfx device name - - int (*setparameter)(struct _gfxdevice*dev, const char*key, const char*value); - - void (*startpage)(struct _gfxdevice*dev, int width, int height); - - void (*startclip)(struct _gfxdevice*dev, gfxline_t*line); - void (*endclip)(struct _gfxdevice*dev); - void (*stroke)(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit); - void (*fill)(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color); - - /* expects alpha channel in image to be non-premultiplied */ - void (*fillbitmap)(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*imgcoord2devcoord, gfxcxform_t*cxform); //cxform? tiling? - - void (*fillgradient)(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*gradcoord2devcoord); //? - - void (*addfont)(struct _gfxdevice*dev, gfxfont_t*font); - - void (*drawchar)(struct _gfxdevice*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); - - void (*drawlink)(struct _gfxdevice*dev, gfxline_t*line, const char*action, const char*text); - - void (*endpage)(struct _gfxdevice*dev); - - const char* (*geterror)(); - - gfxresult_t* (*finish)(struct _gfxdevice*dev); - - void* internal; -} gfxdevice_t; - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.c deleted file mode 100644 index 4fba1e863..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.c +++ /dev/null @@ -1,442 +0,0 @@ -/* gfxfilter.c - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include "mem.h" -#include "gfxfilter.h" -#include "devices/record.h" -#include "q.h" - -typedef struct _internal { - gfxfilter_t*filter; - gfxdevice_t*out; - - /* for two pass filters: */ - gfxdevice_t*final_out; - int pass; - int num_passes; - gfxdevice_t record; - gfxtwopassfilter_t*twopass; -} internal_t; - -static int filter_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - return i->filter->setparameter(i->filter, key, value, i->out); -} -static void filter_startpage(gfxdevice_t*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->startpage(i->filter, width, height, i->out); -} -static void filter_startclip(gfxdevice_t*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->startclip(i->filter, line, i->out); -} -static void filter_endclip(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->endclip(i->filter, i->out); -} -static void filter_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->stroke(i->filter, line, width, color, cap_style, joint_style, miterLimit, i->out); -} -static void filter_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->fill(i->filter, line, color, i->out); -} -static void filter_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->fillbitmap(i->filter, line, img, matrix, cxform, i->out); -} -static void filter_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->fillgradient(i->filter, line, gradient, type, matrix, i->out); -} -static void filter_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->addfont(i->filter, font, i->out); -} -static void filter_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->drawchar(i->filter, font, glyphnr, color, matrix, i->out); -} -static void filter_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->drawlink(i->filter, line, action, text, i->out); -} -static void filter_endpage(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - i->filter->endpage(i->filter, i->out); -} -static gfxresult_t* filter_finish(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - gfxresult_t*r; - if(i->filter->finish) { - r = i->filter->finish(i->filter, i->out); - } else { - r = i->out->finish(i->out); - } - if(i->filter->internal) { - free(i->filter->internal); - i->filter->internal = 0; - } - free(i->filter);i->filter=0; - free(dev->internal);dev->internal=0;free(dev); - return r; -} - - -static int passthrough_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - internal_t*i = (internal_t*)dev->internal; - return i->out->setparameter(i->out, key, value); -} -static void passthrough_startpage(gfxdevice_t*dev, int width, int height) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->startpage(i->out, width, height); -} -static void passthrough_startclip(gfxdevice_t*dev, gfxline_t*line) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->startclip(i->out, line); -} -static void passthrough_endclip(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->endclip(i->out); -} -static void passthrough_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->stroke(i->out, line, width, color, cap_style, joint_style, miterLimit); -} -static void passthrough_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->fill(i->out, line, color); -} -static void passthrough_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->fillbitmap(i->out, line, img, matrix, cxform); -} -static void passthrough_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->fillgradient(i->out, line, gradient, type, matrix); -} -static void passthrough_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->addfont(i->out, font); -} -static void passthrough_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->drawchar(i->out, font, glyphnr, color, matrix); -} -static void passthrough_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->drawlink(i->out, line, action, text); -} -static void passthrough_endpage(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - i->out->endpage(i->out); -} - -int discard_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - return 0; -} -static void discard_startpage(gfxdevice_t*dev, int width, int height) -{ -} -static void discard_startclip(gfxdevice_t*dev, gfxline_t*line) -{ -} -static void discard_endclip(gfxdevice_t*dev) -{ -} -static void discard_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ -} -static void discard_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ -} -static void discard_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ -} -static void discard_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ -} -static void discard_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ -} -static void discard_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ -} -static void discard_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) -{ -} -static void discard_endpage(gfxdevice_t*dev) -{ -} -static gfxresult_t* discard_finish(gfxdevice_t*dev) -{ - return 0; -} - -gfxdevice_t*gfxfilter_apply(gfxfilter_t*_filter, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - gfxdevice_t*dev = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); - gfxfilter_t*filter = (gfxfilter_t*)rfx_alloc(sizeof(gfxfilter_t)); - memcpy(filter, _filter, sizeof(gfxfilter_t)); - - i->out = out; - i->filter = filter; - i->pass = 1; - - dev->internal = i; - dev->name = filter->name?filter->name:"filter"; - dev->setparameter = filter->setparameter?filter_setparameter:passthrough_setparameter; - dev->startpage = filter->startpage?filter_startpage:passthrough_startpage; - dev->startclip = filter->startclip?filter_startclip:passthrough_startclip; - dev->endclip = filter->endclip?filter_endclip:passthrough_endclip; - dev->stroke = filter->stroke?filter_stroke:passthrough_stroke; - dev->fill = filter->fill?filter_fill:passthrough_fill; - dev->fillbitmap = filter->fillbitmap?filter_fillbitmap:passthrough_fillbitmap; - dev->fillgradient = filter->fillgradient?filter_fillgradient:passthrough_fillgradient; - dev->addfont = filter->addfont?filter_addfont:passthrough_addfont; - dev->drawchar = filter->drawchar?filter_drawchar:passthrough_drawchar; - dev->drawlink = filter->drawlink?filter_drawlink:passthrough_drawlink; - dev->endpage = filter->endpage?filter_endpage:passthrough_endpage; - dev->finish = filter_finish; - return dev; -} - -static void setup_twopass(gfxdevice_t*dev, gfxfilter_t*filter) -{ - dev->name = filter->name?filter->name:"filter"; - dev->setparameter = filter->setparameter?filter_setparameter:passthrough_setparameter; - dev->startpage = filter->startpage?filter_startpage:passthrough_startpage; - dev->startclip = filter->startclip?filter_startclip:passthrough_startclip; - dev->endclip = filter->endclip?filter_endclip:passthrough_endclip; - dev->stroke = filter->stroke?filter_stroke:passthrough_stroke; - dev->fill = filter->fill?filter_fill:passthrough_fill; - dev->fillbitmap = filter->fillbitmap?filter_fillbitmap:passthrough_fillbitmap; - dev->fillgradient = filter->fillgradient?filter_fillgradient:passthrough_fillgradient; - dev->addfont = filter->addfont?filter_addfont:passthrough_addfont; - dev->drawchar = filter->drawchar?filter_drawchar:passthrough_drawchar; - dev->drawlink = filter->drawlink?filter_drawlink:passthrough_drawlink; - dev->endpage = filter->endpage?filter_endpage:passthrough_endpage; -} - -static gfxresult_t* twopass_finish(gfxdevice_t*dev) -{ - internal_t*i = (internal_t*)dev->internal; - - gfxresult_t*r; - if(i->filter->finish) { - r = i->filter->finish(i->filter, i->out); - } else { - r = i->out->finish(i->out); - } - - if(i->pass == i->num_passes) { - free(i->twopass); - i->twopass = 0; - i->filter = 0; - free(i); - dev->internal=0; - free(dev); - return r; - } - - /* switch to next pass filter */ - i->filter = &i->twopass->pass2; - setup_twopass(dev, i->filter); - dev->finish = twopass_finish; - - if(i->pass == i->num_passes-1) { - /* we don't record in the final pass- we just stream out to the - next output device */ - i->out = i->final_out; - } else { - // switch to a new tempfile- this only happens for 3 passes or more - assert(i->num_passes>2); - gfxdevice_record_init(&i->record, /*use tempfile*/1); - i->out = &i->record; - } - - i->pass++; - gfxresult_record_replay(r, dev, 0); - r->destroy(r); - - return twopass_finish(dev); -} - -gfxdevice_t*gfxtwopassfilter_apply(gfxtwopassfilter_t*_twopass, gfxdevice_t*out) -{ - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - gfxdevice_t*dev = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); - - gfxtwopassfilter_t*twopass = (gfxtwopassfilter_t*)rfx_alloc(sizeof(gfxtwopassfilter_t)); - memcpy(twopass, _twopass, sizeof(gfxtwopassfilter_t)); - - gfxdevice_record_init(&i->record, /*use tempfile*/1); - - i->out = &i->record; - i->final_out = out; - i->twopass = twopass; - i->pass = 1; - i->num_passes = 2; - - dev->internal = i; - - i->filter = &twopass->pass1; - setup_twopass(dev, i->filter); - dev->finish = twopass_finish; - - return dev; -} - -gfxfilterchain_t* gfxfilterchain_parse(const char*_filterexpr) -{ - char*filterexpr = strdup(_filterexpr); - char*f = filterexpr; - char*end = filterexpr+strlen(filterexpr); - dict_t* params = dict_new2(&charptr_type); - char*cmd = 0; - - gfxfilterchain_t*chain = 0; - gfxfilterchain_t*next = 0; - - if(!*f) - return 0; - - while(1) { - char* eq = strchr(f, '='); - char* colon = strchr(f, ':'); - char lastitem = 0; - if(!colon) { - colon = end; - lastitem = 1; - } - *colon = 0; - char*newcmd = 0; - char param = 0; - - /* fixme: change this from a dict_t to gfxparams_t? */ - if(eq && eq < colon) { // parameter - *eq = 0; - if(!cmd) { - fprintf(stderr, "Error: need a filter before specifying parameters (%s=%s)\n", f, eq+1); - return 0; - } - dict_put(params, f, strdup(eq+1)); - param = 1; - } else { - newcmd = f; - } - if(!param || lastitem) { - if(!cmd && lastitem) - cmd = newcmd; - assert(cmd); - gfxfilterbase_t*f = 0; - if(!strcmp(cmd, "maketransparent")) { - char*alphastr = dict_lookup(params, "alpha"); - int alpha = 255; - if(alphastr) alpha=atoi(alphastr); - f = malloc(sizeof(gfxfilter_t)); - gfxfilter_maketransparent_init((gfxfilter_t*)f, alpha); - } else if(!strcmp(cmd, "remove_font_transforms")) { - f = malloc(sizeof(gfxtwopassfilter_t)); - gfxtwopassfilter_remove_font_transforms_init((gfxtwopassfilter_t*)f); - } else if(!strcmp(cmd, "vectors_to_glyphs")) { - f = malloc(sizeof(gfxtwopassfilter_t)); - gfxtwopassfilter_vectors_to_glyphs_init((gfxtwopassfilter_t*)f); - } else if(!strcmp(cmd, "one_big_font")) { - f = malloc(sizeof(gfxtwopassfilter_t)); - gfxtwopassfilter_one_big_font_init((gfxtwopassfilter_t*)f); - } else { - fprintf(stderr, "Unknown filter: %s\n", cmd); - return 0; - } - dict_clear(params); - gfxfilterchain_t*n = rfx_calloc(sizeof(gfxfilterchain_t)); - if(!chain) { - chain = next = n; - } else { - next->next = n; - next = n; - } - n->filter = f; - - cmd = newcmd; - if(lastitem) break; - } - f = colon+1; - } - dict_destroy(params); - return chain; -} - -gfxdevice_t* gfxfilterchain_apply(gfxfilterchain_t*chain, gfxdevice_t*dev) -{ - while(chain) { - if(chain->filter->type == gfxfilter_onepass) { - dev = gfxfilter_apply((gfxfilter_t*)chain->filter, dev); - } else if(chain->filter->type == gfxfilter_twopass) { - dev = gfxtwopassfilter_apply((gfxtwopassfilter_t*)chain->filter, dev); - } else { - fprintf(stderr, "Internal error in gfxfilterchain_apply- unknown filter type %d\n", chain->filter->type); - } - chain = chain->next; - } - return dev; -} - -void gfxfilterchain_destroy(gfxfilterchain_t*chain) -{ - while(chain) { - gfxfilterchain_t*next = chain->next; - free(chain); - chain = next; - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.h deleted file mode 100644 index 9111930da..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxfilter.h +++ /dev/null @@ -1,107 +0,0 @@ -/* gfxfilter.h - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxfilter_h__ -#define __gfxfilter_h__ - -#include "gfxdevice.h" -#include "types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum {gfxfilter_none, gfxfilter_onepass, gfxfilter_twopass} gfxfiltertype_t; - -typedef struct _gfxfilterbase -{ - gfxfiltertype_t type; -} gfxfilterbase_t; - -typedef struct _gfxfilter -{ - gfxfiltertype_t type; - int num_passes; - const char*name; - - int pass; - - int (*setparameter)(struct _gfxfilter*in, const char*key, const char*value, struct _gfxdevice*out); - void (*startpage)(struct _gfxfilter*in, int width, int height, struct _gfxdevice*out); - void (*startclip)(struct _gfxfilter*in, gfxline_t*line, struct _gfxdevice*out); - void (*endclip)(struct _gfxfilter*in, struct _gfxdevice*out); - void (*stroke)(struct _gfxfilter*in, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, struct _gfxdevice*out); - void (*fill)(struct _gfxfilter*in, gfxline_t*line, gfxcolor_t*color, struct _gfxdevice*out); - void (*fillbitmap)(struct _gfxfilter*in, gfxline_t*line, gfximage_t*img, gfxmatrix_t*imgcoord2devcoord, gfxcxform_t*cxform, struct _gfxdevice*out); //cxform? tiling? - void (*fillgradient)(struct _gfxfilter*in, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*gradcoord2devcoord, struct _gfxdevice*out); //? - void (*addfont)(struct _gfxfilter*in, gfxfont_t*font, struct _gfxdevice*out); - void (*drawchar)(struct _gfxfilter*in, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix, struct _gfxdevice*out); - void (*drawlink)(struct _gfxfilter*in, gfxline_t*line, const char*action, const char*text, struct _gfxdevice*out); - void (*endpage)(struct _gfxfilter*in, struct _gfxdevice*out); - gfxresult_t* (*finish)(struct _gfxfilter*in, struct _gfxdevice*out); - - void (*dealloc)(struct _gfxfilter*f); - - void* internal; -} gfxfilter_t; - -typedef struct _gfxtwopassfilter -{ - gfxfiltertype_t type; - gfxfilter_t pass1; - gfxfilter_t pass2; -} gfxtwopassfilter_t; - -gfxdevice_t*gfxfilter_apply(gfxfilter_t*filter, gfxdevice_t*dev); -gfxdevice_t*gfxtwopassfilter_apply(gfxtwopassfilter_t*filter, gfxdevice_t*dev); - -typedef struct _gfxfilterchain { - gfxfilterbase_t*filter; - struct _gfxfilterchain*next; -} gfxfilterchain_t; - -gfxfilterchain_t* gfxfilterchain_parse(const char*filterexpr); -gfxdevice_t* gfxfilterchain_apply(gfxfilterchain_t*chain, gfxdevice_t*dev); -void gfxfilterchain_destroy(gfxfilterchain_t*chain); - -#define wrap_filter(dev, name, args...) \ - {gfxfilter_t f_##name; \ - gfxfilter_##name##_init(&f_##name, ## args); \ - dev = gfxfilter_apply(&f_##name, dev); \ - } - -#define wrap_filter2(dev, name, args...) \ - {gfxtwopassfilter_t f_##name; \ - gfxtwopassfilter_##name##_init(&f_##name, ## args); \ - dev = gfxtwopassfilter_apply(&f_##name, dev); \ - } - -/* known filters */ -void gfxfilter_maketransparent_init(gfxfilter_t*f, U8 alpha); -void gfxtwopassfilter_remove_font_transforms_init(gfxtwopassfilter_t*f); -void gfxtwopassfilter_one_big_font_init(gfxtwopassfilter_t*f); -void gfxtwopassfilter_vectors_to_glyphs_init(gfxtwopassfilter_t*f); - - -#ifdef __cplusplus -} -#endif - -#endif //__gfxfilter_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.c deleted file mode 100644 index 078b850a4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.c +++ /dev/null @@ -1,770 +0,0 @@ -/* swffont.c - - Functions for loading external fonts. - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2003, 2004, 2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../config.h" -#include "gfxdevice.h" -#include "gfxtools.h" -#include "gfxfont.h" -#include "ttf.h" -#include "mem.h" -#include "log.h" - -static int loadfont_scale = 64; -static int full_unicode = 1; - -static void glyph_clear(gfxglyph_t*g) -{ - gfxline_t*line; - if(g->name) { - free((void*)g->name); g->name = 0; - } - gfxline_free(g->line);g->line = 0; -} - -#ifdef HAVE_FREETYPE - -#ifdef HAVE_FT2BUILD_H -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H -#include FT_SIZES_H -#include FT_SFNT_NAMES_H -#include FT_TRUETYPE_IDS_H -#include FT_OUTLINE_H -#else -#include -#include -#include -#include -#include -#include -#endif - -/* Setting subpixels to 64 also means that the "point size" of the - font outlines will be 64. So the font, when rendered at original - size (i.e., the swf fontsize is 1024) will have the same size as - if it was rendered at 64pt */ - -#define FT_SCALE 1 -#define FT_SUBPIXELS 64 - -typedef struct _gfxdrawinfo_t { - gfxdrawer_t* draw; - double quality; -} gfxdrawinfo_t; - -static int ft_move_to(const FT_Vector* _to, void* user) -{ - gfxdrawinfo_t* info = (gfxdrawinfo_t*)user; - gfxdrawer_t* draw = info->draw; - double x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; - double y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - draw->moveTo(draw, x,y); - return 0; -} -static int ft_line_to(const FT_Vector* _to, void* user) -{ - gfxdrawinfo_t* info = (gfxdrawinfo_t*)user; - gfxdrawer_t* draw = info->draw; - double x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; - double y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - draw->lineTo(draw, x,y); - return 0; -} -static int ft_cubic_to(const FT_Vector* _c1, const FT_Vector* _c2, const FT_Vector* _to, void* user) -{ - gfxdrawinfo_t* info = (gfxdrawinfo_t*)user; - gfxdrawer_t* draw = info->draw; - double tox = _to->x*FT_SCALE/(float)FT_SUBPIXELS; - double toy = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - double c1x = _c1->x*FT_SCALE/(float)FT_SUBPIXELS; - double c1y = -_c1->y*FT_SCALE/(float)FT_SUBPIXELS; - double c2x = _c2->x*FT_SCALE/(float)FT_SUBPIXELS; - double c2y = -_c2->y*FT_SCALE/(float)FT_SUBPIXELS; - gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy, info->quality); - return 0; -} -static int ft_conic_to(const FT_Vector* _c, const FT_Vector* _to, void* user) -{ - gfxdrawinfo_t* info = (gfxdrawinfo_t*)user; - gfxdrawer_t* draw = info->draw; - double tox = _to->x*FT_SCALE/(float)FT_SUBPIXELS; - double toy = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - double cx = _c->x*FT_SCALE/(float)FT_SUBPIXELS; - double cy = -_c->y*FT_SCALE/(float)FT_SUBPIXELS; - gfxdraw_conicTo(draw, cx,cy, tox,toy, info->quality); - return 0; -} -static FT_Outline_Funcs outline_functions = -{ - ft_move_to, - ft_line_to, - ft_conic_to, - ft_cubic_to, - 0,0 -}; - -static FT_Library ftlibrary = 0; - -static gfxglyph_t cloneGlyph(gfxglyph_t*src) -{ - gfxglyph_t dest; - memset(&dest, 0, sizeof(dest)); - if(src->name) - dest.name = strdup(src->name); - dest.advance = src->advance; - dest.unicode = src->unicode; - dest.line = gfxline_clone(src->line); - return dest; -} - -static int errorno = 0; - -//#define DEBUG 1 - -gfxfont_t* gfxfont_load(const char*id, const char*filename, unsigned int flags, double quality) -{ - FT_Face face; - FT_Error error; - const char* fontname = 0; - FT_ULong charcode; - FT_UInt gindex; - gfxfont_t* font; - int t; - int*glyph2glyph = 0; - int*glyph2unicode = 0; - int max_unicode = 0; - int charmap = -1; - int isunicode = 1; - int has_had_errors = 0; - int num_names = 0; - - if(ftlibrary == 0) { - if(FT_Init_FreeType(&ftlibrary)) { - fprintf(stderr, "Couldn't init freetype library!\n"); - exit(1); - } - } - error = FT_New_Face(ftlibrary, filename, 0, &face); - FT_Set_Pixel_Sizes (face, 16*loadfont_scale, 16*loadfont_scale); -#ifdef DEBUG - printf("gfxfont_load(%s, %s, %f)\n", id, filename, quality); -#endif - - if(error) { - fprintf(stderr, "Couldn't load file %s- not a TTF file? (error=%02x)\n", filename, error); - return 0; - } - if(face->num_glyphs <= 0) { - fprintf(stderr, "File %s contains %d glyphs\n", filename, (int)face->num_glyphs); - return 0; - } - - font = (gfxfont_t*)rfx_calloc(sizeof(gfxfont_t)); - //font->style = ((face->style_flags&FT_STYLE_FLAG_ITALIC)?FONT_STYLE_ITALIC:0) |((face->style_flags&FT_STYLE_FLAG_BOLD)?FONT_STYLE_BOLD:0); - //font->ascent = abs(face->ascender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMin; - //font->descent = abs(face->descender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMax; - //font->leading = font->layout->ascent + font->layout->descent; - //font->encoding = FONT_ENCODING_UNICODE; - font->max_unicode = 0; - font->id = strdup(id); - - font->glyphs = (gfxglyph_t*)rfx_calloc(face->num_glyphs*sizeof(gfxglyph_t)); - glyph2unicode = (int*)rfx_calloc(face->num_glyphs*sizeof(int)); - glyph2glyph = (int*)rfx_calloc(face->num_glyphs*sizeof(int)); - - if(FT_HAS_GLYPH_NAMES(face)) { - //font->glyphnames = rfx_calloc(face->num_glyphs*sizeof(char*)); - } - - fontname = FT_Get_Postscript_Name(face); - -#ifdef DEBUG - for(t=0;tnum_charmaps;t++) { - printf("possible encoding: %c%c%c%c (%d of %d)\n", - (face->charmaps[t]->encoding >> 24)&255, - (face->charmaps[t]->encoding >> 16)&255, - (face->charmaps[t]->encoding >> 8)&255, - (face->charmaps[t]->encoding >> 0)&255, - t+1, face->num_charmaps - ); - } -#endif - - while(1) - { - charcode = FT_Get_First_Char(face, &gindex); - - while(gindex != 0) - { - if(gindex >= 0 && gindexnum_glyphs) { - if(!glyph2unicode[gindex]) { - glyph2unicode[gindex] = charcode; - if(charcode + 1 > font->max_unicode) { - font->max_unicode = charcode + 1; - } - } - } - charcode = FT_Get_Next_Char(face, charcode, &gindex); - } - -#ifdef DEBUG - if(face->charmap) { - printf("ENCODING: %c%c%c%c (%d of %d) max_unicode=%d\n", - (face->charmap->encoding >> 24)&255, - (face->charmap->encoding >> 16)&255, - (face->charmap->encoding >> 8)&255, - (face->charmap->encoding >> 0)&255, - charmap, face->num_charmaps, font->max_unicode - ); - } else { - printf("ENCODING: NONE (%d of %d) max_unicode=%d\n", - charmap, face->num_charmaps, font->max_unicode - ); - } -#endif - - /* if we didn't find a single encoding character, try - the font's charmaps instead. That usually means that - the encoding is no longer unicode. - TODO: find a way to convert the encoding to unicode - */ - if(font->max_unicode == 0 && charmap < face->num_charmaps-1 - && face->charmaps[charmap+1]->encoding != 0x41444243 /* adbc, custom */ - && face->charmaps[charmap+1]->encoding != 0x61726d6e /* armn */ - ) - { - charmap++; - FT_Set_Charmap(face, face->charmaps[charmap]); - isunicode = 0; - } else - break; - } - /* TODO: if isunicode is 1, we now need to permutate the character - order so that each character is at it's encoding position */ - - if(full_unicode) - font->max_unicode = 65535; - - font->unicode2glyph = (int*)rfx_calloc(font->max_unicode*sizeof(int)); - - for(t=0;tmax_unicode;t++) { - int g = FT_Get_Char_Index(face, t); - if(!g || g>=face->num_glyphs) - g = -1; - font->unicode2glyph[t] = g; - if(g>=0) { -#ifdef DEBUG - printf("u%d ->%d\n", t, g); -#endif - max_unicode = t+1; - if(!glyph2unicode[g]) { - glyph2unicode[g] = t; - } - } - } - font->max_unicode = max_unicode; - - font->num_glyphs = 0; - - - for(t=0; t < face->num_glyphs; t++) { - if(FT_HAS_GLYPH_NAMES(face)) { - char name[128]; - error = FT_Get_Glyph_Name(face, t, name, 127); - if(!error && name[0] && !strstr(name, "notdef")) { - num_names++; - } - } - } - - - for(t=0; t < face->num_glyphs; t++) { - FT_Glyph glyph; - char name[128]; - gfxdrawer_t draw; - gfxdrawinfo_t info; - char hasname = 0; - int omit = 0; - name[0]=0; - - font->glyphs[font->num_glyphs].advance = 0; - font->glyphs[font->num_glyphs].line = 0; - font->glyphs[font->num_glyphs].unicode = glyph2unicode[t]; - font->glyphs[font->num_glyphs].name = 0; - - if(FT_HAS_GLYPH_NAMES(face) && (num_names >= face->num_glyphs/10 || num_names > 2)) { - name[0] = 0; - error = FT_Get_Glyph_Name(face, t, name, 127); - if(!error && name[0] && !strstr(name, "notdef")) { - font->glyphs[font->num_glyphs].name = strdup(name); - hasname = 1; - } - } - -#if 0 // some cantonese pdfs fail to work if this is activated - - if(has_had_errors && (isunicode && !glyph2unicode[t]) && !hasname && t>=256) { - /* some freetype versions crash or corrupt memory if we try to load - characters (without unicode index or name) above 256 for some fonts. - So skip those characters once the first error occured */ - omit = 1; - } -#endif - - if(!omit) { - error = FT_Load_Glyph(face, t, FT_LOAD_NO_BITMAP); - if(error) { - if(hasname) - fprintf(stderr, "Warning: glyph %d/%d (unicode %d, name %s) has return code %d\n", t, (int)face->num_glyphs, glyph2unicode[t], name, error); - else - fprintf(stderr, "Warning: glyph %d/%d (unicode %d) has return code %d\n", t, (int)face->num_glyphs, glyph2unicode[t], error); - omit = 2; - -#if 0 - if(!has_had_errors) { - char buf[256]; - if(fontname && *fontname) { - fprintf(stderr, "font has been copied to %s.ttf\n", fontname); - sprintf(buf, "cp %s %s.ttf", filename, fontname); - } else { - fprintf(stderr, "font has been copied to badfont%d.ttf\n", errorno); - sprintf(buf, "cp %s badfont%d.ttf", filename, errorno); - errorno++; - } - system(buf); - } -#endif - has_had_errors = 1; - } - } - if(!omit) { - error = FT_Get_Glyph(face->glyph, &glyph); - if(error) { - fprintf(stderr, "Couldn't get glyph %d/%d, error:%d\n", t, (int)face->num_glyphs, error); - omit = 3; - } - } - - if(!omit) { - gfxline_t*l; - int ok=0; - gfxdrawer_target_gfxline(&draw); - info.draw = &draw; - info.quality = quality; - - //error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &info); - error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &info); - - if(error) { - fprintf(stderr, "Couldn't decompose glyph %d\n", t); - gfxline_free((gfxline_t*)draw.result(&draw)); - FT_Done_Glyph(glyph); - omit = 4; - } else { - font->glyphs[font->num_glyphs].advance = glyph->advance.x/65536; - font->glyphs[font->num_glyphs].line = (gfxline_t*)draw.result(&draw); - } - l = font->glyphs[font->num_glyphs].line; - while(l) { - if(l->type != gfx_moveTo) { - ok = 1; - } - l = l->next; - } - if(!ok && !hasname) { - gfxline_free(font->glyphs[font->num_glyphs].line); - font->glyphs[font->num_glyphs].line = 0; - font->glyphs[font->num_glyphs].advance = 0; - - /* Some PDFs created e.g. by InDesign tend to create - fonts with reduced (empty) characters, which still - have unicode indices attached to them. - Remove that information, in order to not confuse - any converter applications. - */ - font->glyphs[font->num_glyphs].unicode = 0; - if(font->glyphs[font->num_glyphs].name) { - free((void*)font->glyphs[font->num_glyphs].name); - font->glyphs[font->num_glyphs].name = 0; - } - FT_Done_Glyph(glyph); - omit = 5; - } - } - - if(!omit) { - FT_Done_Glyph(glyph); - font->glyphs[font->num_glyphs].unicode = glyph2unicode[t]; - } - - glyph2glyph[t] = font->num_glyphs; - font->num_glyphs++; - } - - /* notice: if skip_unused is true, font->glyph2unicode, font->glyphnames and font->layout->bounds will - have more memory allocated than just font->num_glyphs, but only the first font->numchars - are used/valid */ - - for(t=0;tmax_unicode;t++) { - if(font->unicode2glyph[t]>=0) { - font->unicode2glyph[t] = glyph2glyph[font->unicode2glyph[t]]; - } - } - rfx_free(glyph2glyph); - rfx_free(glyph2unicode); - - FT_Done_Face(face); - FT_Done_FreeType(ftlibrary);ftlibrary=0; - - if(!isunicode && font->num_glyphs>0 && font->max_unicode) { - /* if the encoding isn't unicode, remap the font - so that the encoding equals the char position, and - remove the unicode table */ - int t; - gfxglyph_t*newglyphs = (gfxglyph_t*)rfx_calloc(font->max_unicode*sizeof(gfxglyph_t)); - - for(t=0;tunicode2glyph[t]; - if(c>=font->num_glyphs || c<0) - c = 0; - newglyphs[t] = cloneGlyph(&font->glyphs[c]); - newglyphs[t].unicode = -1; - } - for(t=0;tnum_glyphs;t++) { - glyph_clear(&font->glyphs[t]); - } - free(font->glyphs); - font->glyphs = newglyphs; - font->num_glyphs = font->max_unicode; - - free(font->unicode2glyph);font->unicode2glyph = 0; - font->max_unicode = 0; - } - - if(font->unicode2glyph) { - int t; - int bad = 0; - /* check whether the Unicode indices look o.k. - If they don't, disable the unicode lookup by setting - the unicode map to -1 everywhere */ - for(t=0;tnum_glyphs;t++) { - int c = font->glyphs[t].unicode; - gfxline_t* line = font->glyphs[t].line; - if(c && c < 32 && (line && line->next && line->next->next)) { - // the character maps into the unicode control character range - // between 0001-001f. Yet it is not empty. Treat the one - // mapping as broken, and look how many of those we find. - bad ++; - } - } - if(bad>5) { - free(font->unicode2glyph);font->unicode2glyph = 0; - font->max_unicode = 0; - for(t=0;tnum_glyphs;t++) { - font->glyphs[t].unicode = -1; - } - } - } - - return font; -} -#else - -gfxfont_t* gfxfont_load(const char*id, const char*filename, unsigned int flags, double quality) -{ - fprintf(stderr, "No freetype support compiled in! Not able to load %s\n", filename); - return 0; -} - -#endif - -void gfxfont_free(gfxfont_t*font) -{ - int t; - for(t=0;tnum_glyphs;t++) { - glyph_clear(&font->glyphs[t]); - } - if(font->glyphs) { - free(font->glyphs);font->glyphs = 0; - } - font->num_glyphs = 0; - if(font->unicode2glyph) { - free(font->unicode2glyph);font->unicode2glyph = 0; - } - if(font->id) { - free((void*)font->id);font->id=0; - } - - free(font); -} - -static inline int invalid_unicode(int u) -{ - return (u<32 || (u>=0xd800 && u<0xf900)); -} -void gfxfont_fix_unicode(gfxfont_t*font, char remove_duplicates) -{ - int t; - - /* find the current maximum unicode2glyph */ - int max = 0; - for(t=0;tnum_glyphs;t++) { - int u = font->glyphs[t].unicode; - if(u > max) - max = u; - } - char*used = rfx_calloc(max+1); - - /* now, remap all duplicates (and invalid characters) and - calculate the new maximum */ - int remap_pos=0; - max = 0; - for(t=0;tnum_glyphs;t++) { - int u = font->glyphs[t].unicode; - if(u>=0) { - if(remove_duplicates && used[u]) { - u = font->glyphs[t].unicode = 0xe000 + remap_pos++; - } if(invalid_unicode(u)) { - u = font->glyphs[t].unicode = 0xe000 + remap_pos++; - } else { - used[u] = 1; - } - } - if(u > max) - max = u; - } - free(used); - if(font->unicode2glyph) { - free(font->unicode2glyph); - } - font->unicode2glyph = 0; - font->max_unicode = 0; -} - -void gfxfont_add_unicode2glyph(gfxfont_t*font) -{ - int t; - int max = 0; - for(t=0;tnum_glyphs;t++) { - int u = font->glyphs[t].unicode; - if(u > max) - max = u; - } - if(!font->unicode2glyph) { - /* (re)generate unicode2glyph-to-glyph mapping table by reverse mapping - the glyph unicode2glyph's indexes into the mapping table. For collisions, - we prefer the smaller unicode2glyph value.*/ - font->max_unicode = max+1; - font->unicode2glyph = malloc(sizeof(font->unicode2glyph[0])*(font->max_unicode)); - memset(font->unicode2glyph, -1, sizeof(font->unicode2glyph[0])*(font->max_unicode)); - - for(t=0;tnum_glyphs;t++) { - int u = font->glyphs[t].unicode; - if(u>=0 && font->unicode2glyph[u]<0) { - assert(umax_unicode); - font->unicode2glyph[u] = t; - } - } - } else { - /* add the new glyph indexes (most probably, that's only the remapped values - at 0xe000) to the unicode2glyph table. Notice: Unlike glyph2unicode, we don't - care about collisions in the unicode2glyph table */ - int new_max_unicode = max+1; - if(font->max_unicode < new_max_unicode) { - font->unicode2glyph = rfx_realloc(font->unicode2glyph, sizeof(font->unicode2glyph[0])*(font->max_unicode)); - memset(font->unicode2glyph+font->max_unicode, -1, sizeof(font->unicode2glyph[0])*(new_max_unicode - font->max_unicode)); - } - for(t=0;tnum_glyphs;t++) { - int u = font->glyphs[t].unicode; - if(u>=0 && font->unicode2glyph[u]<0) { - font->unicode2glyph[u] = t; - } - } - font->max_unicode = new_max_unicode; - } -} - -ttf_t* gfxfont_to_ttf(gfxfont_t*font, char eot) -{ - ttf_t*ttf = ttf_new(); - int num_glyphs = font->num_glyphs; - int offset = 0; - int t; - char has_nondef_glyph = - font->num_glyphs && font->glyphs[0].unicode==-1 && - (!font->glyphs[0].line || !font->glyphs[0].line->next); - - if(!has_nondef_glyph) { - /* insert a new .nondef glyph at the start of the font */ - offset++; - num_glyphs++; - } - ttf->num_glyphs = num_glyphs; - ttf->glyphs = rfx_calloc(num_glyphs*sizeof(ttfglyph_t)); - double scale = 1.0; - int max_unicode = font->max_unicode; - int remap_pos=0; - for(t=0;tnum_glyphs;t++) { - gfxglyph_t*src = &font->glyphs[t]; - ttfglyph_t*dest = &ttf->glyphs[t+offset]; - gfxline_t*line = src->line; - int count = 0; - while(line) { - count++; - if(line->type == gfx_splineTo) - count++; - line=line->next; - } - dest->num_points = count; - dest->points = rfx_calloc(count*sizeof(ttfpoint_t)); - count = 0; - line = src->line; - while(line) { - if(line->type == gfx_splineTo) { - dest->points[count].x = line->sx*scale; - dest->points[count].y = line->sy*scale; - count++; - } - dest->points[count].x = line->x*scale; - dest->points[count].y = line->y*scale; - dest->points[count].flags |= GLYPH_ON_CURVE; - if(line->type == gfx_moveTo) { - dest->points[count].flags |= GLYPH_CONTOUR_START; - if(count) - dest->points[count-1].flags |= GLYPH_CONTOUR_END; - } - count++; - line=line->next; - } - if(count) - dest->points[count-1].flags |= GLYPH_CONTOUR_END; - - /* compute bounding box */ - int s; - if(count) { - dest->xmin = dest->xmax = dest->points[0].x; - dest->ymin = dest->ymax = dest->points[0].y; - for(s=1;spoints[s].x < dest->xmin) - dest->xmin = dest->points[s].x; - if(dest->points[s].y < dest->ymin) - dest->ymin = dest->points[s].y; - if(dest->points[s].x > dest->xmax) - dest->xmax = dest->points[s].x; - if(dest->points[s].y > dest->ymax) - dest->ymax = dest->points[s].y; - } - } - - if(eot) { - dest->bearing = dest->xmin; - /* for windows font rendering, make sure coordinates are always - to the right of the origin (and use bearing to shift them "back".) - Don't do this for non-windows platforms though because e.g. OS X - ignores bearing. */ - int xshift=0; - if(dest->xmin < 0) { - xshift = -dest->xmin; - for(s=0;spoints[s].x += xshift; - } - dest->xmin += xshift; - dest->xmax += xshift; - } - } - dest->advance = src->advance*scale; - - //dest->xmin=0; //TODO: might be necessary for some font engines? - - dest->advance = src->advance*scale; - - int u = font->glyphs[t].unicode; - if(u > max_unicode) - max_unicode = u; - } - ttf->unicode_size = max_unicode+1; - ttf->unicode = rfx_calloc(sizeof(unicode_t)*ttf->unicode_size); - - if(!font->unicode2glyph) { - for(t=0;tnum_glyphs;t++) { - gfxglyph_t*src = &font->glyphs[t]; - int u = font->glyphs[t].unicode; - if(u<=0) - continue; - if(u<32) { - msg(" gfxfont_to_ttf: glyph %d has an invalid unicode (%d)", t, u); - continue; - } else if(ttf->unicode[u]) { - msg(" gfxfont_to_ttf: glyph %d has a duplicate unicode (%d)", t, u); - continue; - } - if(uunicode_size) - ttf->unicode[u] = t+offset; - } - } else { - int u; - for(u=1;umax_unicode;u++) { - int g = font->unicode2glyph[u]; - if(g>=0 && u<32) { - msg(" gfxfont_to_ttf: Font contains an invalid unicode (%d)", u); - continue; - } - if(g>=0 && gnum_glyphs && !ttf->unicode[u]) { - ttf->unicode[u] = g+offset; - } - } - } - - ttf->ascent = font->ascent; - ttf->descent = -font->descent; - ttf->lineGap = 0; - - ttf->full_name = strdup(font->id); - ttf->family_name = strdup(font->id); - ttf->subfamily_name = strdup(font->id); - ttf->postscript_name = strdup(font->id); - ttf->version_string = strdup("Version 1.0"); - ttf->font_uid = strdup(font->id); - - ttf_create_truetype_tables(ttf); - return ttf; -} - -void gfxfont_save(gfxfont_t*font, const char*filename) -{ - ttf_t*ttf = gfxfont_to_ttf(font, 0); - ttf_save(ttf, filename); - ttf_destroy(ttf); -} - -void gfxfont_save_eot(gfxfont_t*font, const char*filename) -{ - ttf_t*ttf = gfxfont_to_ttf(font, 1); - ttf_save_eot(ttf, filename); - ttf_destroy(ttf); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.h deleted file mode 100644 index 9ff7e3390..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxfont.h +++ /dev/null @@ -1,46 +0,0 @@ -/* swffont.h - - Functions for loading external fonts. Header file - of swffont.c - - Part of the swftools package. - - Copyright (c) 2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxfont_h__ -#define __gfxfont_h__ - -#include "gfxdevice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* The quality parameter is given by 1 divided by the zoom factor at which the font - still looks good. 1=normal, 0.5=double resolution etc. */ -gfxfont_t* gfxfont_load(const char*id, const char*filename, unsigned int flags, double quality); -void gfxfont_save(gfxfont_t*font, const char*filename); -void gfxfont_save_eot(gfxfont_t*font, const char*filename); -void gfxfont_fix_unicode(gfxfont_t*font, char remove_duplicates); -void gfxfont_free(gfxfont_t*font); -void gfxfont_add_unicode2glyph(gfxfont_t*font); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxfont_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfximage.c b/fluidbook/tools/swftools-special-swfdump/lib/gfximage.c deleted file mode 100644 index cbe417baa..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfximage.c +++ /dev/null @@ -1,502 +0,0 @@ -#include -#include -#include -#include -#include -#include "../config.h" -#include "jpeg.h" -#include "png.h" -#include "mem.h" -#include "gfximage.h" -#include "types.h" -#ifdef HAVE_FFTW3 -#include -#endif - -#define MOD(x,d) (((x)+(d))%(d)) - -gfximage_t*gfximage_new(int width, int height) -{ - gfximage_t*i = rfx_calloc(sizeof(gfximage_t)); - i->data = rfx_calloc(width*height*4); - i->width = width; - i->height = height; - return i; -} - -void gfximage_save_jpeg(gfximage_t*img, const char*filename, int quality) -{ - int x,y; - int l = img->width*img->height; - unsigned char*data = (unsigned char*)rfx_alloc(img->width*img->height*3); - int s,t; - for(t=0,s=0;tdata[t].r; - data[s+1] = img->data[t].g; - data[s+2] = img->data[t].b; - } - jpeg_save(data, img->width, img->height, quality, filename); - free(data); -} - -void gfximage_save_png(gfximage_t*image, const char*filename) -{ - png_write(filename, (void*)image->data, image->width, image->height); -} - -void gfximage_save_png_quick(gfximage_t*image, const char*filename) -{ - png_write_quick(filename, (void*)image->data, image->width, image->height); -} - -typedef struct scale_lookup { - int pos; - unsigned int weight; -} scale_lookup_t; - -typedef struct rgba_int { - unsigned int r,g,b,a; -} rgba_int_t; - -static int bicubic = 0; - -static scale_lookup_t**make_scale_lookup(int width, int newwidth) -{ - scale_lookup_t*lookupx = (scale_lookup_t*)rfx_alloc((width>newwidth?width:newwidth)*2*sizeof(scale_lookup_t)); - scale_lookup_t**lblockx = (scale_lookup_t**)rfx_alloc((newwidth+1)*sizeof(scale_lookup_t**)); - double fx = ((double)width)/((double)newwidth); - double px = 0; - int x; - scale_lookup_t*p_x = lookupx; - - if(newwidth<=width) { - for(x=0;x=width) tox = width-1; - for(xx=fromx;xx<=tox;xx++) { - if(xx==fromx && xx==tox) p_x->weight = 256; - else if(xx==fromx) p_x->weight = xweight; - else if(xx==tox) p_x->weight = 256-w; - else p_x->weight = i; - w+=p_x->weight; - p_x->pos = xx; - p_x++; - } - px = ex; - } - } else { - for(x=0;x=width) ix2=width-1; - lblockx[x] = p_x; - if(bicubic) - r = -2*r*r*r+3*r*r; - p_x[0].weight = (int)(256*(1-r)); - p_x[0].pos = ix1; - p_x[1].weight = 256-p_x[0].weight; - p_x[1].pos = ix2; - p_x+=2; - px += fx; - } - } - lblockx[newwidth] = p_x; - return lblockx; -} - -static void encodeMonochromeImage(gfxcolor_t*data, int width, int height, gfxcolor_t*colors) -{ - int t; - int len = width*height; - - U32* img = (U32*)data; - U32 color1 = img[0]; - U32 color2 = 0; - for(t=1;t> 8; - data[t].g = (colors[0].g * (255-m) + colors[1].g * m) >> 8; - data[t].b = (colors[0].b * (255-m) + colors[1].b * m) >> 8; - data[t].a = (colors[0].a * (255-m) + colors[1].a * m) >> 8; - } -} - -void blurImage(gfxcolor_t*src, int width, int height, int r) __attribute__ ((noinline)); - -void blurImage(gfxcolor_t*src, int width, int height, int r) -{ - int e = 2; // r times e is the sampling interval - double*gauss = (double*)rfx_alloc(r*e*sizeof(double)); - double sum=0; - int x; - for(x=0;x> 16; - d[x].g = g >> 16; - d[x].b = b >> 16; - d[x].a = a >> 16; - } - for(;x> 16; - d[yy].g = g >> 16; - d[yy].b = b >> 16; - d[yy].a = a >> 16; - yy += width; - } - for(;ywidth; - int height = img->height; - - int size = width*height; - int t; - U32* data = (U32*)img->data; - U32 color1 = data[0]; - U32 color2 = 0; - for(t=1;twidth; - int height = image->height; - gfxcolor_t*data = image->data; - - if(gfximage_getNumberOfPaletteEntries(image) == 2) { - monochrome=1; - encodeMonochromeImage(data, width, height, monochrome_colors); - int r1 = width / newwidth; - int r2 = height / newheight; - int r = r14) { - /* high-resolution monochrome images are usually dithered, so - low-pass filter them first to get rid of any moire patterns */ - blurImage(data, width, height, r+1); - } - } - - tmpline = (rgba_int_t*)rfx_alloc(width*sizeof(rgba_int_t)); - newdata = (gfxcolor_t*)rfx_alloc(newwidth*newheight*sizeof(gfxcolor_t)); - - lblockx = make_scale_lookup(width, newwidth); - lblocky = make_scale_lookup(height, newheight); - - for(p=lblocky[0];ppos*=width; - - for(y=0;ypos]; - scale_lookup_t*p_x; - int weight = p_y->weight; - for(x=0;xpos]; - unsigned int weight = p_x->weight; - r += col->r*weight; - g += col->g*weight; - b += col->b*weight; - a += col->a*weight; - p_x++; - } while (p_xr = r >> 16; - destline->g = g >> 16; - destline->b = b >> 16; - destline->a = a >> 16; - - destline++; - } - } - - if(monochrome) - decodeMonochromeImage(newdata, newwidth, newheight, monochrome_colors); - - rfx_free(tmpline); - rfx_free(*lblockx); - rfx_free(lblockx); - rfx_free(*lblocky); - rfx_free(lblocky); - - gfximage_t*image2 = (gfximage_t*)malloc(sizeof(gfximage_t)); - image2->data = newdata; - image2->width = newwidth; - image2->height = newheight; - return image2; -} - -#ifdef HAVE_FFTW3 -gfximage_t* gfximage_rescale_fft(gfximage_t*image, int newwidth, int newheight) -{ - int channel; - - int oldwidth = image->width; - int oldheight = image->height; - - unsigned char*rgba = (unsigned char*)image->data; - - bool has_alpha = gfximage_has_alpha(image); - bool monochrome = 0; - gfxcolor_t monochrome_colors[2]; - if(gfximage_getNumberOfPaletteEntries(image) == 2) { - monochrome=1; - encodeMonochromeImage(image->data, image->width, image->height, monochrome_colors); - } - - float*data = fftwf_malloc(sizeof(float)*oldwidth*oldheight); - int osize = oldwidth*oldheight; - int nsize = newwidth*newheight; - - assert(newwidth <= oldwidth && newheight <= oldheight); - - gfxcolor_t*rgba_new = malloc(newwidth*newheight*sizeof(gfxcolor_t)); - unsigned char*rgba_new_asbytes = (unsigned char*)rgba_new; - - int oxwidth = oldwidth/2+1; - int oxsize = oxwidth*oldheight; - fftwf_complex* fft = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*oxwidth*oldheight); - fftwf_complex* fft2 = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*newwidth*newheight); - fftwf_complex* data2 = fftwf_malloc(sizeof(fftwf_complex)*newwidth*newheight); - fftwf_plan plan1 = fftwf_plan_dft_r2c_2d(oldheight, oldwidth, data, fft, FFTW_ESTIMATE); - fftwf_plan plan2 = fftwf_plan_dft_2d(newheight, newwidth, fft2, data2, FFTW_BACKWARD, FFTW_ESTIMATE); - - double ff = 1.0/osize; - - for(channel=0;channel<4;channel++) { - if(channel==0 && !has_alpha) - continue; - if(channel>=1 && monochrome) - continue; - int t; - for(t=0;t> 2; - for(y=0;y255?255:f); - } - } - fftwf_destroy_plan(plan1); - fftwf_destroy_plan(plan2); - free(fft); - free(fft2); - if(!has_alpha) { - int t; - for(t=0;tdata = rgba_new; - image2->width = newwidth; - image2->height = newheight; - return image2; -} -#endif - -#ifdef HAVE_FFTW3 -gfximage_t* gfximage_rescale(gfximage_t*image, int newwidth, int newheight) -{ - //return gfximage_rescale_fft(image, newwidth, newheight); - return gfximage_rescale_old(image, newwidth, newheight); -} -#else -gfximage_t* gfximage_rescale(gfximage_t*image, int newwidth, int newheight) -{ - return gfximage_rescale_old(image, newwidth, newheight); -} -#endif - -bool gfximage_has_alpha(gfximage_t*img) -{ - int size = img->width*img->height; - gfxcolor_t*data = img->data; - int t; - for(t=0;tdata); - b->data = 0; - free(b); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfximage.h b/fluidbook/tools/swftools-special-swfdump/lib/gfximage.h deleted file mode 100644 index 4f4db4b08..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfximage.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __gfximage_h__ -#define __gfximage_h__ - -#include -#include "gfxdevice.h" - -gfximage_t*gfximage_new(int width, int height); -void gfximage_save_jpeg(gfximage_t*image, const char*filename, int quality); -void gfximage_save_png(gfximage_t*image, const char*filename); -void gfximage_save_png_quick(gfximage_t*image, const char*filename); -gfximage_t* gfximage_rescale(gfximage_t*image, int newwidth, int newheight); -bool gfximage_has_alpha(gfximage_t*image); -void gfximage_free(gfximage_t*b); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.c deleted file mode 100644 index a687e6309..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.c +++ /dev/null @@ -1,1174 +0,0 @@ -/* gfxpoly.c - - Various boolean polygon functions. - - Part of the swftools package. - - Copyright (c) 2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../config.h" -#include "gfxdevice.h" -#include "gfxtools.h" -#include "gfxpoly.h" -#include "mem.h" -#include "art/libart.h" -#include "art/art_svp_intersect.h" -#include "art/art_svp_ops.h" -#include "log.h" -#include -#include -#include - -#define PERTURBATE -//#define SHEAR -//#define DEBUG - -//----------------------------------------- svp renderer ---------------------------------------- - -typedef struct { - int xmin; - int ymin; - int xmax; - int ymax; - int width; - int height; -} intbbox_t; - -typedef struct _renderpoint -{ - double x; - signed char direction; -} renderpoint_t; - -typedef struct _renderline -{ - renderpoint_t*points; - int size; - int num; -} renderline_t; - -typedef struct _renderbuf -{ - intbbox_t bbox; - int width; - int height; - double zoom; - renderline_t*lines; -} renderbuf_t; - -static inline void add_pixel(renderbuf_t*buf, double x, int y, signed char direction) -{ - renderpoint_t p; - p.x = x; - p.direction = direction; - - if(x >= buf->bbox.xmax || y >= buf->bbox.ymax || y < buf->bbox.ymin) - return; - renderline_t*l = &buf->lines[y-buf->bbox.ymin]; - - if(l->num == l->size) { - l->size += 32; - l->points = (renderpoint_t*)rfx_realloc(l->points, l->size * sizeof(renderpoint_t)); - } - l->points[l->num] = p; - l->num++; -} -#define CUT 0.5 -#define INT(x) ((int)((x)+16)-16) -static void add_line(renderbuf_t*buf, double x1, double y1, double x2, double y2, signed char direction) -{ - x1 *= buf->zoom; - y1 *= buf->zoom; - x2 *= buf->zoom; - y2 *= buf->zoom; - double diffx, diffy; - double ny1, ny2, stepx; - if(y2 < y1) { - double x,y; - x = x1;x1 = x2;x2=x; - y = y1;y1 = y2;y2=y; - } - diffx = x2 - x1; - diffy = y2 - y1; - ny1 = INT(y1)+CUT; - ny2 = INT(y2)+CUT; - - if(ny1 < y1) { - ny1 = INT(y1) + 1.0 + CUT; - } - if(ny2 >= y2) { - ny2 = INT(y2) - 1.0 + CUT; - } - if(ny1 > ny2) - return; - - stepx = diffx/diffy; - x1 = x1 + (ny1-y1)*stepx; - x2 = x2 + (ny2-y2)*stepx; - - int posy=INT(ny1); - int endy=INT(ny2); - double posx=0; - double startx = x1; - - while(posy<=endy) { - double xx = startx + posx; - add_pixel(buf, xx, posy, direction); - posx+=stepx; - posy++; - } -} - -static int compare_renderpoints(const void * _a, const void * _b) -{ - renderpoint_t*a = (renderpoint_t*)_a; - renderpoint_t*b = (renderpoint_t*)_b; - if(a->x < b->x) return -1; - if(a->x > b->x) return 1; - return 0; -} - -static void fill_bitwise(unsigned char*line, int x1, int x2) -{ - int p1 = x1>>3; - int p2 = x2>>3; - int b1 = 0xff >> (x1&7); - int b2 = 0xff << (1+7-(x2&7)); - if(p1==p2) { - line[p1] |= b1&b2; - } else { - line[p1] |= b1; - memset(&line[p1+1], 255, p2-(p1+1)); - line[p2] = b2; - } -} - -unsigned char* render_svp(ArtSVP*svp, intbbox_t*bbox, double zoom, ArtWindRule rule) -{ - renderbuf_t _buf, *buf=&_buf; - buf->width = (bbox->xmax - bbox->xmin); - buf->height = (bbox->ymax - bbox->ymin); - buf->bbox = *bbox; - buf->zoom = zoom; - int width8 = (buf->width+7) >> 3; - unsigned char* image = (unsigned char*)malloc(width8*buf->height); - memset(image, 0, width8*buf->height); - - buf->lines = (renderline_t*)rfx_alloc(buf->height*sizeof(renderline_t)); - int y; - for(y=0;yheight;y++) { - memset(&buf->lines[y], 0, sizeof(renderline_t)); - buf->lines[y].points = 0; - buf->lines[y].num = 0; - } - - int t; - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &svp->segs[t]; - int s; - for(s=0;sn_points-1;s++) { - int dir = seg->dir? 1 : -1; - add_line(buf, seg->points[s].x, seg->points[s].y, seg->points[s+1].x, seg->points[s+1].y, dir); - } - } - for(y=0;yheight;y++) { - renderpoint_t*points = buf->lines[y].points; - unsigned char*line = &image[width8*y]; - int n; - int num = buf->lines[y].num; - int wind = 0; - qsort(points, num, sizeof(renderpoint_t), compare_renderpoints); - int lastx = 0; - int fill = 0; - - for(n=0;nx - bbox->xmin); - - if(x < lastx) - x = lastx; - if(x > buf->width) { - break; - } - if(fill && x!=lastx) { - fill_bitwise(line, lastx, x); - } - wind += p->direction; - if(rule == ART_WIND_RULE_INTERSECT) { - fill = wind>=2; - } else if (rule == ART_WIND_RULE_NONZERO) { - fill = wind!=0; - } else if (rule == ART_WIND_RULE_ODDEVEN) { - fill = wind&1; - } else { // rule == ART_WIND_RULE_POSITIVE - fill = wind>=1; - } - lastx = x; - } - if(fill && lastx!=buf->width) - fill_bitwise(line, lastx, buf->width); - } - - for(y=0;yheight;y++) { - if(buf->lines[y].points) { - free(buf->lines[y].points); - } - memset(&buf->lines[y], 0, sizeof(renderline_t)); - } - free(buf->lines);buf->lines=0; - return image; -} - -#define MAX_WIDTH 8192 -#define MAX_HEIGHT 4096 - -intbbox_t get_svp_bbox(ArtSVP*svp, double zoom) -{ - int t; - intbbox_t b = {0,0,0,0}; - if(svp->n_segs && svp->segs[0].n_points) { - b.xmin = svp->segs[0].points[0].x; - b.ymin = svp->segs[0].points[0].y; - b.xmax = svp->segs[0].points[0].x; - b.ymax = svp->segs[0].points[0].y; - } - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &svp->segs[t]; - int s; - for(s=0;sn_points;s++) { - double x = seg->points[s].x*zoom; - double y = seg->points[s].y*zoom; - int x1 = floor(x); - int x2 = ceil(x); - int y1 = floor(y); - int y2 = ceil(y); - if(x1 < b.xmin) b.xmin = x1; - if(y1 < b.ymin) b.ymin = y1; - if(x2 > b.xmax) b.xmax = x2; - if(y2 > b.ymax) b.ymax = y2; - } - } - if(b.xmax > (int)(MAX_WIDTH*zoom)) - b.xmax = (int)(MAX_WIDTH*zoom); - if(b.ymax > (int)(MAX_HEIGHT*zoom)) - b.ymax = (int)(MAX_HEIGHT*zoom); - if(b.xmin < -(int)(MAX_WIDTH*zoom)) - b.xmin = -(int)(MAX_WIDTH*zoom); - if(b.ymin < -(int)(MAX_HEIGHT*zoom)) - b.ymin = -(int)(MAX_HEIGHT*zoom); - - if(b.xmin > b.xmax) - b.xmin = b.xmax; - if(b.ymin > b.ymax) - b.ymin = b.ymax; - - b.width = b.xmax - b.xmin; - b.height = b.ymax - b.ymin; - return b; -} - -#define B11100000 0xe0 -#define B01110000 0x70 -#define B00111000 0x38 -#define B00011100 0x1c -#define B00001110 0x0e -#define B00000111 0x07 -#define B10000000 0x80 -#define B01000000 0x40 -#define B00100000 0x20 -#define B00010000 0x10 -#define B00001000 0x08 -#define B00000100 0x04 -#define B00000010 0x02 -#define B00000001 0x01 - -static int compare_bitmaps(intbbox_t*bbox, unsigned char*data1, unsigned char*data2) -{ - if(!data1 || !data2) - return 0; - int x,y; - int height = bbox->height; - int width = bbox->width; - int width8 = (width+7) >> 3; - unsigned char*l1 = &data1[width8]; - unsigned char*l2 = &data2[width8]; - for(y=1;ytype == gfx_moveTo) { - pos ++; - } else if(l2->type == gfx_lineTo) { - pos ++; - } else if(l2->type == gfx_splineTo) { - int parts = (int)(sqrt(fabs(l2->x-2*l2->sx+x) + fabs(l2->y-2*l2->sy+y))*subfraction); - if(!parts) parts = 1; - pos += parts + 1; - } - x = l2->x; - y = l2->y; - l2 = l2->next; - } - pos++; - len = pos; - - vec = art_new (ArtVpath, len+1); - - pos = 0; - l2 = line; - int lastmove=-1; - while(l2) { - if(l2->type == gfx_moveTo) { - vec[pos].code = ART_MOVETO_OPEN; - vec[pos].x = l2->x; - vec[pos].y = l2->y; - lastmove=pos; - pos++; - assert(pos<=len); - } else if(l2->type == gfx_lineTo) { - vec[pos].code = ART_LINETO; - vec[pos].x = l2->x; - vec[pos].y = l2->y; - pos++; - assert(pos<=len); - } else if(l2->type == gfx_splineTo) { - int i; - int parts = (int)(sqrt(fabs(l2->x-2*l2->sx+x) + fabs(l2->y-2*l2->sy+y))*subfraction); - if(!parts) parts = 1; - double stepsize = 1.0/parts; - for(i=0;i<=parts;i++) { - double t = (double)i*stepsize; - vec[pos].code = ART_LINETO; - vec[pos].x = l2->x*t*t + 2*l2->sx*t*(1-t) + x*(1-t)*(1-t); - vec[pos].y = l2->y*t*t + 2*l2->sy*t*(1-t) + y*(1-t)*(1-t); - pos++; - assert(pos<=len); - } - } - x = l2->x; - y = l2->y; - - /* let closed line segments start w/ MOVETO instead of MOVETO_OPEN */ - if(lastmove>=0 && l2->type!=gfx_moveTo && (!l2->next || l2->next->type == gfx_moveTo)) { - if(vec[lastmove].x == l2->x && - vec[lastmove].y == l2->y) { - assert(vec[lastmove].code == ART_MOVETO_OPEN); - vec[lastmove].code = ART_MOVETO; - } - } - - l2 = l2->next; - } - vec[pos++].code = ART_END; - assert(pos == len); - - if(!fill) { - /* Fix "dotted" lines. Those are lines where singular points are created - by a moveto x,y lineto x,y combination. We "fix" these by shifting the - point in the lineto a little bit to the right - These should only occur in strokes, not in fills, so do this only - when we know we're not filling. - */ - int t; - for(t=0;vec[t].code!=ART_END;t++) { - if(t>0 && (vec[t-1].code==ART_MOVETO_OPEN || vec[t-1].code==ART_MOVETO) - && vec[t].code==ART_LINETO && vec[t+1].code!=ART_LINETO && - vec[t-1].x == vec[t].x && - vec[t-1].y == vec[t].y) { - vec[t].x += 0.01; - } - } - } - - /* Find adjacent identical points. If an ajdacent pair of identical - points is found, the second one is removed. - So moveto x,y lineto x,y becomes moveto x,y - lineto x,y lineto x,y becomes lineto x,y - lineto x,y moveto x,y becomes lineto x,y - moveto x,y moveto x,y becomes moveto x,y - lineto x,y lineto x2,y2 becomes lineto x2,y2 (if dir(x,y) ~= dir(x2,y2)) - */ - pos = 0; - int outpos = 0; - while(1) - { - if(vec[pos].code == ART_END) { - vec[outpos++] = vec[pos++]; - break; - } - - char samedir = 0, samepoint = 0; - if(outpos) { - double dx = vec[pos].x-vec[pos-1].x; - double dy = vec[pos].y-vec[pos-1].y; - /*if(pos= 0) { - samedir=1; - } - }*/ - if(fabs(dx) + fabs(dy) < 0.0001) { - samepoint=1; - } - } - if(!samepoint && !samedir) { - vec[outpos++] = vec[pos++]; - } else { - pos++; // skip - } - } - - return vec; -} - -static void shear_svp(ArtSVP*svp, double v) -{ - /* do a "shearing" on the polygon. We do this to eliminate all - horizontal lines (which libart can't handle properly, even though - it tries). */ - - int t; - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &svp->segs[t]; - int s; - for(s=0;sn_points;s++) { - ArtPoint* point = &seg->points[s]; - point->y += point->x*v; - } - } -} - -static double find_shear_value(ArtSVP*svp) -{ - /* We try random values until we find one - where there's no slope below a given value, or if that fails, - at least no slope of 0 */ - - double v = 0; - int tries = 0; - while(1) { - char fail = 0; - int t; - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &svp->segs[t]; - int s; - for(s=0;sn_points-1;s++) { - ArtPoint* p1 = &seg->points[s]; - ArtPoint* p2 = &seg->points[s+1]; - double dx = p2->x - p1->x; - double dy = p2->y - p1->y; - dy += dx*v; - if(dy==0) { - fail = 1; - break; - } - if(tries<100 && dx && fabs(dy / dx) < 1e-5) { - fail = 1; - break; - } - } - if(fail) - break; - } - if(!fail) - break; -#ifdef HAVE_LRAND48 - v = lrand48() / 2000000000.0;; -#elif HAVE_RAND - v = rand() / 2000000000.0; -#else -#error "no lrand48()/rand() implementation found" -#endif - tries++; - } - return v; -} - -void show_path(ArtSVP*path) -{ - int t; - printf("Segments: %d\n", path->n_segs); - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &path->segs[t]; - printf("Segment %d: %d points, %s, BBox: (%f,%f,%f,%f)\n", - t, seg->n_points, seg->dir==0?"UP ":"DOWN", - seg->bbox.x0, seg->bbox.y0, seg->bbox.x1, seg->bbox.y1); - int p; - for(p=0;pn_points;p++) { - ArtPoint* point = &seg->points[p]; - printf(" (%f,%f)\n", point->x, point->y); - } - } - printf("\n"); -} - - -typedef struct svp_segment_part -{ - double y1; - double y2; - char active; -} svp_segment_part_t; - -int compare_double(const void*_y1, const void*_y2) -{ - const double*y1 = _y1; - const double*y2 = _y2; - if(*y1<*y2) return -1; - if(*y1>*y2) return 1; - else return 0; -} - -int compare_seg_start(const void*_s1, const void*_s2) -{ - svp_segment_part_t*s1 = *(svp_segment_part_t**)_s1; - svp_segment_part_t*s2 = *(svp_segment_part_t**)_s2; - if(s1->y1 < s2->y1) return -1; - if(s1->y1 > s2->y1) return 1; - else return 0; -} - -int compare_seg_end(const void*_s1, const void*_s2) -{ - svp_segment_part_t*s1 = *(svp_segment_part_t**)_s1; - svp_segment_part_t*s2 = *(svp_segment_part_t**)_s2; - if(s1->y2 < s2->y2) return -1; - if(s1->y2 > s2->y2) return 1; - else return 0; -} - -void clean_svp(ArtSVP*svp) -{ - int t; - int oldpoints = 0; - int newpoints = 0; - int oldsegs = 0; - int newsegs = 0; - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &svp->segs[t]; - int p; - int pos=0; - double lasty = 0; - oldpoints += seg->n_points; - for(p=0;pn_points;p++) { - ArtPoint* p1 = &seg->points[p]; - if(!p || lasty!=p1->y) { - seg->points[pos] = seg->points[p]; - pos++; - lasty = p1->y; - } - } - seg->n_points = pos; - newpoints += seg->n_points; - } - int pos = 0; - oldsegs = svp->n_segs; - for(t=0;tn_segs;t++) { - if(svp->segs[t].n_points > 1) { - svp->segs[pos++] = svp->segs[t]; - } - } - svp->n_segs = pos; - newsegs = svp->n_segs; - if(newsegs < oldsegs || newpoints < oldpoints) { - msg(" Simplified polygon from %d points to %d points, %d to %d segs", - oldpoints, newpoints, oldsegs, newsegs); - } -} - -int check_svp(ArtSVP*svp) -{ - /* count number of y coordinates and segs */ - int t; - int num_points = 0; - int num_segs = 0; - for(t=0;tn_segs;t++) { - if(!svp->segs[t].n_points) { - msg(" svp contains segment with zero points\n"); - return 0; - } - num_points += svp->segs[t].n_points; - num_segs += svp->segs[t].n_points - 1; - } - - /* create segs and ys */ - double*y = malloc(sizeof(double)*num_points); - svp_segment_part_t*segs = malloc(sizeof(svp_segment_part_t)*num_segs); - svp_segment_part_t**seg_start = malloc(sizeof(svp_segment_part_t*)*num_segs); - svp_segment_part_t**seg_end = malloc(sizeof(svp_segment_part_t*)*num_segs); - - int c1=0; - num_segs = 0; - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &svp->segs[t]; - int p; - for(p=0;pn_points;p++) { - y[c1++] = seg->points[p].y; - assert(c1 <= num_points); - } - for(p=0;pn_points-1;p++) { - ArtPoint* p1 = &seg->points[p]; - ArtPoint* p2 = &seg->points[p+1]; - - if(p1->y >= p2->y) { - if(p1->y > p2->y) { - msg(" bad svp, y in seg is non-increasing %.16f -> %.16f\n", p1->y, p2->y); - } - } else { - segs[num_segs].y1 = p1->y; - segs[num_segs].y2 = p2->y; - segs[num_segs].active = 0; - seg_start[num_segs] = &segs[num_segs]; - seg_end[num_segs] = &segs[num_segs]; - num_segs++; - } - } - } - - qsort(y, num_points, sizeof(double), compare_double); - qsort(seg_start, num_segs, sizeof(svp_segment_part_t*), compare_seg_start); - qsort(seg_end, num_segs, sizeof(svp_segment_part_t*), compare_seg_end); - - double lasty = num_points?y[0]+1:0; - int num_active = 0; - int bleed = 0; - double bleedy1=0,bleedy2 = 0; - for(t=0;t svp bleeds from y=%.16f to y=%.16f (%d/%d active segments)\n", - bleedy1, bleedy2, - bleed, num_segs); - free(y);free(segs);free(seg_start);free(seg_end); - return 0; - } - - free(y); - free(segs); - free(seg_start); - free(seg_end); - - return 1; -} - -void write_svp_postscript(const char*filename, ArtSVP*svp) -{ - if(!svp) - return; - FILE*fi = fopen(filename, "wb"); - int i, j; - double xmin=0,ymin=0,xmax=0,ymax=0; - fprintf(fi, "%% begin\n"); - for (i = 0; i < svp->n_segs; i++) { - for (j = 0; j < svp->segs[i].n_points; j++) { - double x = svp->segs[i].points[j].x; - double y = svp->segs[i].points[j].y; - if(i==0 && j==0) { - xmin = xmax = x; - ymin = ymax = y; - } else { - if(x < xmin) xmin = x; - if(x > xmax) xmax = x; - if(y < ymin) ymin = y; - if(y > ymax) ymax = y; - } - } - } - if(xmax == xmin) xmax=xmin+1; - if(ymax == ymin) ymax=ymin+1; - - for (i = 0; i < svp->n_segs; i++) - { - fprintf(fi, "%g setgray\n", svp->segs[i].dir ? 0.7 : 0); - for (j = 0; j < svp->segs[i].n_points; j++) - { - //fprintf(fi, "%g %g %s\n", - // 20 + 550*(svp->segs[i].points[j].x-xmin)/(xmax-xmin), - // 820 - 800*(svp->segs[i].points[j].y-ymin)/(ymax-ymin), - // j ? "lineto" : "moveto"); - fprintf(fi, "%.32f %.32f %s\n", - svp->segs[i].points[j].x, - svp->segs[i].points[j].y, - j ? "lineto" : "moveto"); - } - fprintf(fi, "stroke\n"); - } - - fprintf(fi, "showpage\n"); - fclose(fi); -} - -void write_vpath_postscript(const char*filename, ArtVpath*path) -{ - FILE*fi = fopen(filename, "wb"); - int i, j; - double xmin=0,ymin=0,xmax=0,ymax=0; - fprintf(fi, "%% begin\n"); - ArtVpath*p = path; - char first = 1; - while(p->code != ART_END) { - if(p->code == ART_MOVETO || p->code == ART_MOVETO_OPEN) { - if(!first) - fprintf(fi, "stroke\n"); - first = 0; - fprintf(fi, "0.0 setgray\n"); - fprintf(fi, "%.32f %.32f moveto\n", p->x, p->y); - } else { - fprintf(fi, "%.32f %.32f lineto\n", p->x, p->y); - } - p++; - } - if(!first) - fprintf(fi, "stroke\n"); - fprintf(fi, "showpage\n"); - fclose(fi); -} - -void write_gfxline_postscript(const char*filename, gfxline_t*line) -{ - FILE*fi = fopen(filename, "wb"); - int i, j; - fprintf(fi, "%% begin\n"); - char first = 1; - while(line) { - if(line->type == gfx_moveTo) { - if(!first) - fprintf(fi, "stroke\n"); - first = 0; - fprintf(fi, "0.0 setgray\n"); - fprintf(fi, "%.32f %.32f moveto\n", line->x, line->y); - } else { - fprintf(fi, "%.32f %.32f lineto\n", line->x, line->y); - } - line = line->next; - } - if(!first) - fprintf(fi, "stroke\n"); - fprintf(fi, "showpage\n"); - fclose(fi); -} - -static int vpath_len(ArtVpath*svp) -{ - int len = 0; - while(svp->code != ART_END) { - svp ++; - len ++; - } - return len; -} - -int gfxline_len(gfxline_t*line) -{ - gfxline_t*i = line; - int len = 0; - while(i) { - len ++; - i = i->next; - } - return len; -} - -static ArtVpath*pvpath= 0; -static int cmppos(const void*_p1, const void*_p2) -{ - int*p1 = (int*)_p1; - int*p2 = (int*)_p2; - ArtVpath*v1 = &pvpath[*p1]; - ArtVpath*v2 = &pvpath[*p2]; - if(v1->y < v2->y) - return -1; - else if(v1->y > v2->y) - return 1; - else if(v1->x < v2->x) - return -2; - else if(v1->x > v2->x) - return 2; - else - return 0; -} - -#define PERTURBATION 2e-3 -static void my_perturb(ArtVpath*vpath) -{ - int t; - int len = vpath_len(vpath); - int*pos = (int*)malloc(len*sizeof(int)); - for(t=0;t Casting gfxline of %d segments (%d line segments) to a gfxpoly", gfxline_len(line), vpath_len(vec)); - - if(perturb) { - //ArtVpath* vec2 = art_vpath_perturb(vec); - //free(vec); - //vec = vec2; - my_perturb(vec); - } - ArtSVP *svp = art_svp_from_vpath(vec); - free(vec); - - return svp; -} - -//#ifdef SHEAR -// double shear = find_shear_value(svp); -// gfxline_t*line = gfxline_from_gfxpoly((gfxpoly_t*)svp); -// gfxline_t*l = line; -// while(l) { -// l->y += l->x*shear; -// l->sy += l->sx*shear; -// l= l->next; -// } -// svp = (ArtSVP*)gfxpoly_fillToPoly(line); -// printf("shearing svp by %.16f\n", shear); -//#endif -// .... -//#ifdef SHEAR -// art_svp_free(svp); -// shear_svp(result, -shear); -//#endif - - -ArtSVP* run_intersector(ArtSVP*svp, ArtWindRule rule) -{ - ArtSvpWriter * swr = art_svp_writer_rewind_new(rule); - - double zoom = 1.0; - intbbox_t bbox = get_svp_bbox(svp, zoom); - - art_svp_intersector(svp, swr); - ArtSVP*result = art_svp_writer_rewind_reap(swr); - clean_svp(result); - if(!check_svp(result)) { - current_svp = result; - art_report_error(); // might set art_error_in_intersector - } else { - msg(" Comparing polygon renderings of size %dx%d and %dx%d", bbox.width, bbox.height, bbox.width, bbox.height); - unsigned char*data1 = render_svp(svp, &bbox, zoom, rule); - unsigned char*data2 = render_svp(result, &bbox, zoom, ART_WIND_RULE_ODDEVEN); - if(!compare_bitmaps(&bbox, data1, data2)) { - msg(" Bad SVP rewinding result- polygons don't match"); - current_svp = result; - art_report_error(); // might set art_error_in_intersector - } - free(data1); - free(data2); - } - - if(art_error_in_intersector) { - msg(" Error in polygon processing"); - art_svp_free(result); - art_error_in_intersector=0; - return 0; - } - return result; -} - -gfxline_t* gfxline_from_gfxpoly(gfxpoly_t*poly) -{ - ArtSVP*svp = (ArtSVP*)poly; - int size = 0; - int t; - int pos = 0; - - msg(" Casting polygon of %d segments back to gfxline", svp->n_segs); - - for(t=0;tn_segs;t++) { - size += svp->segs[t].n_points; - } - size = size + 1; - gfxline_t* lines = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)*size); - - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &svp->segs[t]; - int p; - for(p=0;pn_points;p++) { - lines[pos].type = p==0?gfx_moveTo:gfx_lineTo; - ArtPoint* point = &seg->points[p]; - lines[pos].x = point->x; - lines[pos].y = point->y; - lines[pos].next = &lines[pos+1]; - pos++; - } - } - if(pos) { - lines[pos-1].next = 0; - return lines; - } else { - return 0; - } -} - -gfxpoly_t* gfxpoly_from_fill(gfxline_t*line, double gridsize) -{ - /* I'm not sure whether doing perturbation here is actually - a good idea- if that line has been run through the machinery - several times already, it might be safer to leave it alone, - since it should already be in a format libart can handle */ -#ifdef PERTURBATE - ArtSVP* svp = gfxfillToSVP(line, 1); -#else - ArtSVP* svp = gfxfillToSVP(line, 0); -#endif - -#ifdef DEBUG - char filename[80]; - static int counter = 0; - sprintf(filename, "svp%d.ps", counter); - write_svp_postscript(filename, svp); - sprintf(filename, "gfxline%d.ps", counter); - write_gfxline_postscript(filename, line); -#endif - - /* we do xor-filling by default, so dir is always 1 - (actually for oddeven rewinding it makes no difference, but - it's "cleaner") - */ - int t; - for(t=0; tn_segs; t++) { - svp->segs[t].dir = 1; - } - - /* for some reason, we need to rewind / self-intersect the polygons that gfxfillToSVP - returns- art probably uses a different fill mode (circular?) for vpaths */ - ArtSVP*svp_uncrossed=0; - -#ifdef DEBUG - sprintf(filename, "svp%d_in.ps", counter); - write_svp_postscript(filename, svp); - counter++; -#endif - - svp_uncrossed = run_intersector(svp, ART_WIND_RULE_ODDEVEN); - - art_svp_free(svp); - svp=svp_uncrossed; - - return (gfxpoly_t*)svp; -} - -gfxpoly_t* gfxpoly_intersect(gfxpoly_t*poly1, gfxpoly_t*poly2) -{ - ArtSvpWriter *swr; - - static int counter = 0; - - ArtSVP* svp1 = (ArtSVP*)poly1; - ArtSVP* svp2 = (ArtSVP*)poly2; - msg(" Intersecting two polygons of %d and %d segments", svp1->n_segs, svp2->n_segs); - -#ifdef DEBUG - char filename[80]; - sprintf(filename, "isvp%d_src1.ps", counter); - write_svp_postscript(filename, svp1); - sprintf(filename, "isvp%d_src2.ps", counter); - write_svp_postscript(filename, svp2); -#endif - - ArtSVP* svp3 = art_svp_merge (svp1, svp2); - -#ifdef DEBUG - sprintf(filename, "isvp%d_src.ps", counter); - write_svp_postscript(filename, svp3); -#endif - - //write_svp_postscript("svp.ps", svp3); - ArtSVP*svp_new = run_intersector(svp3, ART_WIND_RULE_INTERSECT); - - art_free (svp3); /* shallow free because svp3 contains shared segments */ - -#ifdef DEBUG - sprintf(filename, "isvp%d.ps", counter); - write_svp_postscript(filename, svp_new); -#endif - - counter++; - - //write_svp_postscript("svp_new.ps", svp_new); - - return (gfxpoly_t*)svp_new; -} - -gfxpoly_t* gfxpoly_union(gfxpoly_t*poly1, gfxpoly_t*poly2) -{ - ArtSVP* svp1 = (ArtSVP*)poly1; - ArtSVP* svp2 = (ArtSVP*)poly2; - msg(" Unifying two polygons of %d and %d segments", svp1->n_segs, svp2->n_segs); - - ArtSVP* svp = art_svp_union(svp1, svp2); - return (gfxpoly_t*)svp; -} - -gfxpoly_t* gfxpoly_from_stroke(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, double miterLimit, double gridsize) -{ - ArtVpath* vec = gfxline_to_ArtVpath(line, 0); - msg(" Casting gfxline of %d segments to a stroke-polygon", gfxline_len(line)); - - ArtVpath* vec2 = art_vpath_perturb(vec); - free(vec); - vec = vec2; - - ArtSVP *svp = art_svp_vpath_stroke (vec, - (joint_style==gfx_joinMiter)?ART_PATH_STROKE_JOIN_MITER: - ((joint_style==gfx_joinRound)?ART_PATH_STROKE_JOIN_ROUND: - ((joint_style==gfx_joinBevel)?ART_PATH_STROKE_JOIN_BEVEL:ART_PATH_STROKE_JOIN_BEVEL)), - (cap_style==gfx_capButt)?ART_PATH_STROKE_CAP_BUTT: - ((cap_style==gfx_capRound)?ART_PATH_STROKE_CAP_ROUND: - ((cap_style==gfx_capSquare)?ART_PATH_STROKE_CAP_SQUARE:ART_PATH_STROKE_CAP_SQUARE)), - width, //line_width - miterLimit, //miter_limit - 0.05 //flatness - ); - free(vec); - return (gfxpoly_t*)svp; -} - -gfxline_t* gfxpoly_circular_to_evenodd(gfxline_t*line, double gridsize) -{ - msg(" Converting circular-filled gfxline of %d segments to even-odd filled gfxline", gfxline_len(line)); - ArtSVP* svp = gfxfillToSVP(line, 1); - - ArtSVP* svp_rewinded; - - svp_rewinded = run_intersector(svp, ART_WIND_RULE_NONZERO); - if(!svp_rewinded) { - art_svp_free(svp); - return 0; - } - - gfxline_t* result = gfxline_from_gfxpoly((gfxpoly_t*)svp_rewinded); - art_svp_free(svp); - art_svp_free(svp_rewinded); - return result; -} - -gfxpoly_t* gfxpoly_createbox(double x1, double y1,double x2, double y2, double gridsize) -{ - ArtVpath *vec = art_new (ArtVpath, 5+1); - vec[0].code = ART_MOVETO; - vec[0].x = x1; - vec[0].y = y1; - vec[1].code = ART_LINETO; - vec[1].x = x1; - vec[1].y = y2; - vec[2].code = ART_LINETO; - vec[2].x = x2; - vec[2].y = y2; - vec[3].code = ART_LINETO; - vec[3].x = x2; - vec[3].y = y1; - vec[4].code = ART_LINETO; - vec[4].x = x1; - vec[4].y = y1; - vec[5].code = ART_END; - vec[5].x = 0; - vec[5].y = 0; - ArtSVP *svp = art_svp_from_vpath(vec); - free(vec); - return (gfxpoly_t*)svp; -} - -void gfxpoly_destroy(gfxpoly_t*poly) -{ - ArtSVP*svp = (ArtSVP*)poly; - art_svp_free(svp); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.h deleted file mode 100644 index b8329c821..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly.h +++ /dev/null @@ -1,64 +0,0 @@ -/* gfxpoly.h - - Various boolean polygon functions. - - Part of the swftools package. - - Copyright (c) 2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxpoly_h__ -#define __gfxpoly_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "mem.h" -#include "gfxdevice.h" -#include "gfxtools.h" - -/* A "grid" value is the granularity at which polygon intersection operates. - It usually makes sense this to the smallest value that can actually be represented - in the output device (like 0.05 = 1 twip for SWF). */ -#define DEFAULT_GRID (0.05) - -typedef struct _gfxpoly { -} gfxpoly_t; - -void gfxpoly_destroy(gfxpoly_t*poly); - -/* constructors */ -gfxpoly_t* gfxpoly_from_fill(gfxline_t*line, double gridsize); -gfxpoly_t* gfxpoly_from_stroke(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, double gridsize); - -/* operators */ -gfxpoly_t* gfxpoly_intersect(gfxpoly_t*p1, gfxpoly_t*p2); -gfxpoly_t* gfxpoly_union(gfxpoly_t*p1, gfxpoly_t*p2); - -/* conversion functions */ -gfxpoly_t* gfxpoly_createbox(double x1, double y1,double x2, double y2, double gridsize); -gfxline_t* gfxline_from_gfxpoly(gfxpoly_t*poly); -gfxline_t* gfxline_from_gfxpoly_with_direction(gfxpoly_t*poly); -gfxline_t* gfxpoly_circular_to_evenodd(gfxline_t*line, double gridsize); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxpoly_h__ - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.c deleted file mode 100644 index c5f9c02f6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.c +++ /dev/null @@ -1,693 +0,0 @@ -#include -#include -#include -#include "../../config.h" -#include "../q.h" -#include "../types.h" -#include "active.h" - -actlist_t* actlist_new() -{ - NEW(actlist_t, a); - return a; -} -void actlist_destroy(actlist_t*a) -{ - free(a); -} - -void actlist_dump(actlist_t*a, int32_t y, double gridsize) -{ - segment_t*s = a->list; - double lastx; - char bad = 0; - if(!s) fprintf(stderr, "(empty)\n"); - while(s) { - if(y) { - double x = ((double)s->delta.x*(y-s->a.y)/s->delta.y)+s->a.x; - if(s!=a->list) { - if(lastx>x) - fprintf(stderr, "?%.2f<->%.2f? ", lastx * gridsize, x * gridsize); - } - lastx = x; - } - fprintf(stderr, "[%d]", (int)s->nr); - s = s->right; - if(s) fprintf(stderr, " "); - else fprintf(stderr, " y=%.2f\n", y * gridsize); - } -} -void actlist_verify(actlist_t*a, int32_t y) -{ - segment_t*s = a->list; - assert(!s || !s->left); - segment_t*l = 0; - while(s) { - if(y) { - if(l) { - /* we need to re-evaluate the x of the previous segment. if we - try to store it, it might end up being converted to a double, - which will make it non-equal to (and possibly larger than) the - "long double" the FPU has in its register. This only happens - when compiler optimizations are turned on. */ - assert((XPOS(s, y) - XPOS(l, y)) >= 0); - assert(XDIFF(s,l,y) >= 0); - } - l = s; - } - assert(!s->left || s->left->right == s); - assert(!s->right || s->right->left == s); - s = s->right; - } -} - -static inline double single_cmp(segment_t*s, point_t p1) -{ - return LINE_EQ(p1, s); -} - -static inline double cmp(segment_t*s, point_t p1, point_t p2) -{ - double d = LINE_EQ(p1, s); - if(d==0) { - d = LINE_EQ(p2, s); - if(d==0) { - /* We default to always inserting the new segment to the right of the old segment. - We do this so that we don't place new segments into the middle of already - overlapping lines which may have intersections scheduled. - */ - //fprintf(stderr, "Notice: actlist_find: both points (%d,%d) and (%d,%d) exactly on segment [%d]\n", p1.x, p1.y, p2.x, p2.y, s->nr); - } - } - return d; -} - -#ifdef SPLAY -static void actlist_splay_dump(actlist_t*a); -segment_t* actlist_find(actlist_t*a, point_t p1, point_t p2) -{ -#ifdef CHECKS - segment_t*t = a->list; - char to_the_left = 0; - char fail = 0; - while(t) { - /* this check doesn't work out with cmp() because during horizontal - processing, both segments ending as well as segments starting will - be active in this scanline */ - //double d = cmp(t, p1, p2); - double d = single_cmp(t, p1); - if(d>=0 && to_the_left) { - actlist_dump(a, p1.y, 1); - segment_t*s = a->list; - while(s) { - fprintf(stderr, "[%d] %f/%f (%d,%d) -> (%d,%d)\n", SEGNR(s), - single_cmp(s,p1), cmp(s,p1,p2), - s->a.x, s->a.y, s->b.x, s->b.y); - s = s->right; - } - } - assert(!(d>=0 && to_the_left)); - if(d<0) to_the_left=1; - t = t->right; - } -#if 0 - if(a->size > 100) { - static actlist_t*last = 0; - if(last != a) { - last = a; - actlist_splay_dump(a); - } - } -#endif -#endif - segment_t*last=0, *s = a->root; - if(!s) return 0; - double d=0; - int depth = 0; - while(s) { - last = s; - depth++; - d = single_cmp(s, p1); - if(d<=0) { - s = s->leftchild; - } else { - s = s->rightchild; - } - } -//#ifdef DEBUG -#if 0 - if(a->size > 1) { - /* 80% hit, average cost per miss ~ 4 nodes */ - int expected_depth = (int)((double)log2((double)a->size+1))+1; - static int hits = 0; - static int misses = 0; - static int miss_cost = 0; - if(depth <= expected_depth) hits++; - else {misses++; - miss_cost += depth - expected_depth; - } - if(hits && misses) - fprintf(stderr, "%02.2f%% %f\n", hits / (double)(hits+misses), miss_cost / (double)misses); - } -#endif - - /* this can be optimized for (is not needed in) normal mode (as opposed to horizontal postprocess mode) */ - segment_t*out = last; - if(d<0 || (d==0 && LINE_EQ(p2,last)<0)) { - last = last->left; - if(!last) { - assert(cmp(a->list, p1, p2)<0); - return 0; - } - } else { - while(last->right && cmp(last->right, p1, p2)>=0) { - last = last->right; - } - } - -#ifdef CHECKS - segment_t*l=0; - s = a->list; - while(s) { - if(cmp(s, p1, p2)<0) - break; - l = s;s = s->right; - } - if(l!=last) { - printf("[%d]!=[%d]\n", SEGNR(l), SEGNR(last)); - printf("after tree: [%d]\n", SEGNR(out)); - actlist_splay_dump(a); - s = a->list; - while(s) { - double d1 = single_cmp(s,p1); - double d2 = cmp(s,p1,p2); - int x1 = d1<0?-1:(d1>0?1:0); - int x2 = d2<0?-1:(d2>0?1:0); - printf("[%d](%d,%d) ", SEGNR(s), x1, x2); - s = s->right; - } - printf("\n"); - } - assert(l == last); -#endif - - return last; -} -#else -segment_t* actlist_find(actlist_t*a, point_t p1, point_t p2) -{ - segment_t*last=0, *s = a->list; - if(!s) return last; - while(s) { - double d = cmp(s, p1, p2); - if(d<0) - break; - last = s; - s = s->right; - } - return last; -} -#endif - -#ifdef SPLAY - -#define LINK(node,side,child) (node)->side = (child);if(child) {(child)->parent = (node);} - //;fprintf(stderr, "[%d]->%s now [%d]\n", SEGNR(node), __STRING(side), SEGNR(child)); - -// rotates segment's left node to the top -static inline segment_t*rotate_right(actlist_t*a, segment_t*s) -{ - /* s n - / \ - n -> s - \ / - l l - */ - assert(s->leftchild); - segment_t*p = s->parent; - segment_t*n = s->leftchild; - segment_t*l = n->rightchild; - LINK(n,rightchild,s); - LINK(s,leftchild,l); - n->parent = p; - if(p) { - if(p->leftchild == s) - p->leftchild = n; - else if(p->rightchild == s) - p->rightchild = n; - } else { - a->root = n; - } - return n; -} -// rotates segment's right node to the top -static inline segment_t*rotate_left(actlist_t*a, segment_t*s) -{ - /* s n - \ / - n -> s - / \ - r r - */ - assert(s->rightchild); - segment_t*p = s->parent; - segment_t*n = s->rightchild; - segment_t*r = n->leftchild; - LINK(n,leftchild,s); - LINK(s,rightchild,r); - n->parent = p; - if(p) { - if(p->leftchild == s) - p->leftchild = n; - else if(p->rightchild == s) - p->rightchild = n; - } else { - a->root = n; - } - return n; -} - -static int actlist_splay_walk(actlist_t*a, segment_t*s, segment_t**ss, segment_t*parent) -{ - if(!s) return 1; - if(parent != s->parent) { - fprintf(stderr, "Parent mismatch in [%d]: [%d] != [%d]\n", SEGNR(s), SEGNR(parent), SEGNR(s->parent)); - return 0; - } - if(!actlist_splay_walk(a, s->leftchild, ss, s)) return 0; - if(s != *ss) { - fprintf(stderr, "[%d] != [%d]\n", SEGNR(s), SEGNR(*ss)); - return 0; - } - (*ss) = (*ss)->right; - if(!actlist_splay_walk(a, s->rightchild, ss, s)) return 0; - return 1; -} - -static int actlist_splay_verify(actlist_t*a) -{ - segment_t*c = a->list; - if(!actlist_splay_walk(a, a->root, &c, 0)) return 0; - if(c) return 0; - return 1; -} -static void actlist_splay_dump2(actlist_t*a, segment_t*s, char*mid, char*up, char*down) -{ - if(!s) return; - - if(s->leftchild || s->rightchild) { - int t; - - if(s->leftchild) { - char*o3 = malloc(strlen(up)+3); - strcpy(o3, up);strcat(o3, "+-"); - char*newup = malloc(strlen(up)+3); - strcpy(newup, up);strcat(newup, "| "); - char*newup2 = malloc(strlen(up)+3); - strcpy(newup2, up);strcat(newup2, " "); - actlist_splay_dump2(a, s->leftchild, o3, newup2, newup); - fprintf(stderr, "%s| \n", up); - free(newup); - free(newup2); - free(o3); - } - fprintf(stderr, "%s[%d]\n", mid, SEGNR(s)); - if(s->rightchild) { - char*o3 = malloc(strlen(down)+3); - strcpy(o3, down);strcat(o3, "+-"); - char*newdown = malloc(strlen(down)+3); - strcpy(newdown, down);strcat(newdown, "| "); - char*newdown2 = malloc(strlen(down)+3); - strcpy(newdown2, down);strcat(newdown2, " "); - fprintf(stderr, "%s| \n", down); - actlist_splay_dump2(a, s->rightchild, o3, newdown, newdown2); - free(newdown); - free(newdown2); - free(o3); - } - } else { - fprintf(stderr, "%s[%d]\n", mid, SEGNR(s)); - } -} -static void actlist_splay_dump(actlist_t*a) -{ - actlist_splay_dump2(a, a->root, "", "", ""); -} - - -static void move_to_root(actlist_t*a, segment_t*s) -{ - if(!s) return; - /* this is a textbook implementation of the three splay operations - zig, zig-zig and zig-zag */ - int nr=0; - while(a->root != s) { - assert(s->parent); - segment_t*p = s->parent; - if(p == a->root) { - // zig - if(a->root->leftchild == s) { - rotate_right(a, a->root); - } else { - rotate_left(a, a->root); - } - assert(a->root == s); - } else { - segment_t*pp = p->parent; - if(p->leftchild == s && pp->leftchild == p) { - // zig-zig (left) - rotate_right(a, pp); - rotate_right(a, s->parent); - } else if(p->rightchild == s && pp->rightchild == p) { - // zig-zig (right) - rotate_left(a, pp); - rotate_left(a, s->parent); - } else if(p->leftchild == s && pp->rightchild == p) { - // zig-zag (left) - rotate_right(a, p); - rotate_left(a, s->parent); - } else if(p->rightchild == s && pp->leftchild == p) { - // zig-zag (right) - rotate_left(a, p); - rotate_right(a, s->parent); - } else { - assert(0); - } - } - } -} - -static void actlist_splay(actlist_t*a, point_t p1, point_t p2) -{ - if(!a->list) return; - - segment_t tmp; - memset(&tmp, 0, sizeof(tmp)); - segment_t*left=&tmp,*right=&tmp; - - int c = 0; - while(1) { - if(cmp(a->root,p1,p2)<0) { - /* we're to the left of the root */ - if(!a->root->leftchild) { - c = -1;break; - } - if(cmp(a->root->leftchild,p1,p2)<0) { - /* we're also to the left of the root's left child - -> rotate right, so that the left child is root */ - segment_t*s = a->root->leftchild; - LINK(a->root, leftchild, s->rightchild); - LINK(s, rightchild, a->root); - a->root = s; - if(!a->root->leftchild) { - c = -1;break; - } - } - LINK(right, leftchild, a->root); - right = a->root; - a->root = a->root->leftchild; - } else /* cmp(a->root,p1,p2)>=0 */ { - /* we're to the right of the root */ - if(!a->root->rightchild) { - c = 1;break; - } - if(cmp(a->root->rightchild,p1,p2)>=0) { - /* we're also to the right of the root's right child - -> rotate left, so that the right child is root */ - segment_t*s = a->root->rightchild; - LINK(a->root, rightchild, s->leftchild); - LINK(s, leftchild, a->root); - a->root = s; - if(!a->root->rightchild) - c = 1;break; - } - LINK(left, rightchild, a->root); - left = a->root; - a->root = a->root->rightchild; - } - } - LINK(left, rightchild, a->root->leftchild); - LINK(right, leftchild, a->root->rightchild); - LINK(a->root, leftchild, tmp.rightchild); - LINK(a->root, rightchild, tmp.leftchild); - a->root->parent = 0; -} - -#endif - -static void actlist_insert_after(actlist_t*a, segment_t*left, segment_t*s) -{ -#ifdef SPLAY - //fprintf(stderr, "insert [%d] after [%d]\n", SEGNR(s), SEGNR(left)); - //actlist_splay_dump(a); - //actlist_dump(a, s->a.y); -#endif - - s->left = left; - if(left) { - s->right = left->right; - } else { - s->right = a->list; - a->list = s; - } - if(s->left) - s->left->right = s; - if(s->right) - s->right->left = s; - -#ifdef SPLAY - // we insert nodes not trees - assert(!s->leftchild); - assert(!s->rightchild); - - if(a->root) { - move_to_root(a, left); - if(left) { - LINK(s,leftchild,a->root); - // steal right child from (previous) root - LINK(s,rightchild,a->root->rightchild); - a->root->rightchild = 0; - } else { - LINK(s,rightchild,a->root); - } - } - a->root = s; - a->root->parent = 0; - - assert(actlist_splay_verify(a)); -#endif - - a->size++; -} - -void actlist_delete(actlist_t*a, segment_t*s) -{ -#ifdef SPLAY - assert(actlist_splay_verify(a)); - move_to_root(a, s); - assert(actlist_splay_verify(a)); -#endif - if(s->left) { - s->left->right = s->right; - } else { - a->list = s->right; - } - if(s->right) { - s->right->left = s->left; - } - s->left = s->right = 0; - a->size--; -#ifdef SPLAY - assert(a->root == s); - // delete root node - if(!a->root->leftchild) { - a->root = a->root->rightchild; - } else if(!a->root->rightchild) { - a->root = a->root->leftchild; - } else { -#ifdef HAVE_LRAND48 - if(lrand48()&1) { -#else - if(((ptroff_t)s)&16) { -#endif - // free up root->left->right - segment_t*t = a->root->leftchild; - while(t->rightchild) { - segment_t*r = t->rightchild; - segment_t*l = r->leftchild; - LINK(r, leftchild, t); - LINK(t, rightchild, l); - t = r; - } - LINK(a->root,leftchild,t); - assert(!a->root->leftchild->rightchild); - LINK(a->root->leftchild,rightchild,a->root->rightchild); - a->root = a->root->leftchild; - } else { - // free up root->right->left - segment_t*t = a->root->rightchild; - while(t->leftchild) { - segment_t*l = t->leftchild; - segment_t*r = l->rightchild; - LINK(l, rightchild, t); - LINK(t, leftchild, r); - t = l; - } - LINK(a->root,rightchild,t); - assert(!a->root->rightchild->leftchild); - LINK(a->root->rightchild,leftchild,a->root->leftchild); - a->root = a->root->rightchild; - } - } - if(a->root) - a->root->parent = 0; - s->leftchild = s->rightchild = s->parent = 0; - - assert(actlist_splay_verify(a)); -#endif -} -int actlist_size(actlist_t*a) -{ - return a->size; -} - -segment_t* actlist_leftmost(actlist_t*a) -{ - return a->list; -} - -segment_t* actlist_rightmost(actlist_t*a) -{ - /* this is only used in checks, so it doesn't matter that it's slow */ -#ifndef CHECKS - fprintf(stderr, "Warning: actlist_rightmost should not be used\n"); -#endif - segment_t*s = a->list; - segment_t*last = 0; - while(s) { - last = s; - s = s->right; - } - return last; -} - -void actlist_insert(actlist_t*a, point_t p1, point_t p2, segment_t*s) -{ - segment_t*left = actlist_find(a, p1, p2); - actlist_insert_after(a, left, s); -} - -void actlist_swap(actlist_t*a, segment_t*s1, segment_t*s2) -{ -#ifdef SPLAY - assert(actlist_splay_verify(a)); -#endif -#ifdef CHECKS - /* test that s1 is to the left of s2- our swap - code depends on that */ - segment_t*s = s1; - while(s && s!=s2) s = s->right; - assert(s==s2); -#endif -/*#ifndef SPLAY - actlist_delete(a, s1); - actlist_insert_after(a, s2, s1); -#else*/ - segment_t*s1l = s1->left; - segment_t*s1r = s1->right; - segment_t*s2l = s2->left; - segment_t*s2r = s2->right; - if(s1l) s1l->right = s2; - else a->list = s2; - s2->left = s1l; - if(s2r) s2r->left = s1; - s1->right = s2r; - if(s2l!=s1) s1->left = s2l; - else s1->left = s2; - if(s1r!=s2) s2->right = s1r; - else s2->right = s1; - -#ifdef SPLAY - if(s2->parent==s1) { - /* - s1 s2 - / -> / - s2 s1 - */ - segment_t*l = s2->leftchild; - segment_t*r = s2->rightchild; - assert(s1->rightchild == s2); // because s1 < s2 - segment_t*l1 = s1->leftchild; - segment_t*p = s1->parent; - s1->parent = s2; - s2->parent = p; - if(p) { - if(p->leftchild == s1) p->leftchild=s2; - else {assert(p->rightchild == s1);p->rightchild=s2;} - } else { - a->root = s2; - } - s2->leftchild = l1; - s2->rightchild = s1; - s1->leftchild = l; - s1->rightchild = r; - } else if(s1->parent==s2) { - /* - s2 s1 - / -> / - s1 s2 - */ - segment_t*l = s1->leftchild; - segment_t*r = s1->rightchild; - segment_t*r2 = s2->rightchild; - assert(s2->leftchild == s1); // because s1 < s2 - segment_t*p = s2->parent; - s2->parent = s1; - s1->parent = p; - if(p) { - if(p->leftchild == s2) p->leftchild=s1; - else {assert(p->rightchild == s2);p->rightchild=s1;} - } else { - a->root = s1; - } - s1->leftchild = s2; - s1->rightchild = r2; - s2->leftchild = l; - s2->rightchild = r; - } else { - segment_t*s1p = s1->parent; - segment_t*s1l = s1->leftchild; - segment_t*s1r = s1->rightchild; - segment_t*s2p = s2->parent; - segment_t*s2l = s2->leftchild; - segment_t*s2r = s2->rightchild; - s2->parent = s1p; - s2->leftchild = s1l; - s2->rightchild = s1r; - s1->parent = s2p; - s1->leftchild = s2l; - s1->rightchild = s2r; - assert(s1p || s2p); - if(s1p) { - if(s1p->leftchild == s1) s1p->leftchild=s2; - else {assert(s1p->rightchild == s1);s1p->rightchild=s2;} - } else { - a->root = s2; - } - if(s2p) { - if(s2p->leftchild == s2) s2p->leftchild=s1; - else {assert(s2p->rightchild == s2);s2p->rightchild=s1;} - } else { - a->root = s1; - } - } - if(s1->leftchild) s1->leftchild->parent = s1; - if(s2->leftchild) s2->leftchild->parent = s2; - if(s1->rightchild) s1->rightchild->parent = s1; - if(s2->rightchild) s2->rightchild->parent = s2; - - assert(actlist_splay_verify(a)); -#endif - -//#endif -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.h deleted file mode 100644 index 2dc09fa2b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/active.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __active_h__ -#define __active_h__ - -#include "poly.h" - -typedef struct _actlist -{ - segment_t*list; - int size; -#ifdef SPLAY - segment_t*root; -#endif -} actlist_t; - -#define actlist_left(a,s) ((s)->left) -#define actlist_right(a,s) ((s)?(s)->right:(a)->list) - -actlist_t* actlist_new(); -void actlist_destroy(actlist_t*a); -int actlist_size(actlist_t*a); -void actlist_verify(actlist_t*a, int32_t y); -void actlist_dump(actlist_t*a, int32_t y, double gridsize); -segment_t* actlist_find(actlist_t*a, point_t p1, point_t p2); // finds segment immediately to the left of p1 (breaking ties w/ p2) -void actlist_insert(actlist_t*a, point_t p1, point_t p2, segment_t*s); -void actlist_delete(actlist_t*a, segment_t*s); -void actlist_swap(actlist_t*a, segment_t*s1, segment_t*s2); -segment_t* actlist_leftmost(actlist_t*a); -segment_t* actlist_rightmost(actlist_t*a); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.c deleted file mode 100644 index 9fbe40d26..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.c +++ /dev/null @@ -1,550 +0,0 @@ -#include -#include -#include -#include "../gfxdevice.h" -#include "../mem.h" -#include "poly.h" -#include "convert.h" -#include "wind.h" - -/* factor that determines into how many line fragments a spline is converted */ -#define SUBFRACTION (2.4) - -static inline int32_t convert_coord(double x, double z) -{ - /* we clamp to 26 bit because: - a) we use a (x1-x2) shortcut when comparing coordinates - b) we need to be able to multiply two coordinates and store them in a double w/o loss of precision - */ - x *= z; - if(x < -0x2000000) x = -0x2000000; - if(x > 0x1ffffff) x = 0x1ffffff; - return ceil(x); -} - -static void convert_gfxline(gfxline_t*line, polywriter_t*w, double gridsize) -{ - assert(!line || line[0].type == gfx_moveTo); - double lastx=0,lasty=0; - double z = 1.0 / gridsize; - while(line) { - if(line->type == gfx_moveTo) { - if(line->next && line->next->type != gfx_moveTo && (line->x!=lastx || line->y!=lasty)) { - w->moveto(w, convert_coord(line->x,z), convert_coord(line->y,z)); - } - } else if(line->type == gfx_lineTo) { - w->lineto(w, convert_coord(line->x,z), convert_coord(line->y,z)); - } else if(line->type == gfx_splineTo) { - int parts = (int)(sqrt(fabs(line->x-2*line->sx+lastx) + - fabs(line->y-2*line->sy+lasty))*SUBFRACTION); - if(!parts) parts = 1; - double stepsize = 1.0/parts; - int i; - for(i=0;ix*t*t + 2*line->sx*t*(1-t) + lastx*(1-t)*(1-t)); - double sy = (line->y*t*t + 2*line->sy*t*(1-t) + lasty*(1-t)*(1-t)); - w->lineto(w, convert_coord(sx,z), convert_coord(sy,z)); - } - w->lineto(w, convert_coord(line->x,z), convert_coord(line->y,z)); - } - lastx = line->x; - lasty = line->y; - line = line->next; - } -} - -static char* readline(FILE*fi) -{ - char c; - while(1) { - int l = fread(&c, 1, 1, fi); - if(!l) - return 0; - if(c!=10 || c!=13) - break; - } - char line[256]; - int pos = 0; - while(1) { - line[pos++] = c; - line[pos] = 0; - int l = fread(&c, 1, 1, fi); - if(!l || c==10 || c==13) { - return strdup(line); - } - } -} - -static void convert_file(const char*filename, polywriter_t*w, double gridsize) -{ - FILE*fi = fopen(filename, "rb"); - if(!fi) { - perror(filename); - } - double z = 1.0 / gridsize; - int count = 0; - double g = 0; - double lastx=0,lasty=0; - while(1) { - char*line = readline(fi); - if(!line) - break; - double x,y; - char s[256]; - if(sscanf(line, "%lf %lf %s", &x, &y, (char*)&s) == 3) { - if(!strcmp(s,"moveto")) { - w->moveto(w, convert_coord(x,z), convert_coord(y,z)); - count++; - } else if(!strcmp(s,"lineto")) { - w->lineto(w, convert_coord(x,z), convert_coord(y,z)); - count++; - } else { - fprintf(stderr, "invalid command: %s\n", s); - } - } else if(sscanf(line, "%% gridsize %lf", &g) == 1) { - gridsize = g; - z = 1.0 / gridsize; - w->setgridsize(w, g); - } - free(line); - } - fclose(fi); - if(g) { - fprintf(stderr, "loaded %d points from %s (gridsize %f)\n", count, filename, g); - } else { - fprintf(stderr, "loaded %d points from %s\n", count, filename); - } -} - -typedef struct _compactpoly { - gfxpoly_t*poly; - point_t last; - point_t*points; - int num_points; - int points_size; - segment_dir_t dir; - char new; -} compactpoly_t; - -void finish_segment(compactpoly_t*data) -{ - if(data->num_points <= 1) - return; - point_t*p = malloc(sizeof(point_t)*data->num_points); - gfxpolystroke_t*s = rfx_calloc(sizeof(gfxpolystroke_t)); - s->fs = &edgestyle_default; - s->next = data->poly->strokes; - data->poly->strokes = s; - s->num_points = s->points_size = data->num_points; - s->dir = data->dir; - s->points = p; - assert(data->dir != DIR_UNKNOWN); - if(data->dir == DIR_UP) { - int t; - int s = data->num_points; - for(t=0;tnum_points;t++) { - p[--s] = data->points[t]; - } - } else { - memcpy(p, data->points, sizeof(point_t)*data->num_points); - } -#ifdef CHECKS - int t; - for(t=0;tnum_points-1;t++) { - assert(p[t].y<=p[t+1].y); - } -#endif -} -static void compactmoveto(polywriter_t*w, int32_t x, int32_t y) -{ - compactpoly_t*data = (compactpoly_t*)w->internal; - point_t p; - p.x = x; - p.y = y; - if(p.x != data->last.x || p.y != data->last.y) { - data->new = 1; - } - data->last = p; -} - -static inline int direction(point_t p1, point_t p2) -{ - int diff = p1.y - p2.y; - if(diff) return diff; - return p1.x - p2.x; -} - -static void compactlineto(polywriter_t*w, int32_t x, int32_t y) -{ - compactpoly_t*data = (compactpoly_t*)w->internal; - point_t p; - p.x = x; - p.y = y; - - int diff = direction(p, data->last); - if(!diff) - return; - segment_dir_t dir = diff<0?DIR_UP:DIR_DOWN; - - if(dir!=data->dir || data->new) { - finish_segment(data); - data->dir = dir; - data->points[0] = data->last; - data->num_points = 1; - } - data->new = 0; - - if(data->points_size == data->num_points) { - data->points_size <<= 1; - assert(data->points_size > data->num_points); - data->points = rfx_realloc(data->points, sizeof(point_t)*data->points_size); - } - data->points[data->num_points++] = p; - data->last = p; -} -static void compactsetgridsize(polywriter_t*w, double gridsize) -{ - compactpoly_t*d = (compactpoly_t*)w->internal; - d->poly->gridsize = gridsize; -} -/*static int compare_stroke(const void*_s1, const void*_s2) -{ - gfxpolystroke_t*s1 = (gfxpolystroke_t*)_s1; - gfxpolystroke_t*s2 = (gfxpolystroke_t*)_s2; - return s1->points[0].y - s2->points[0].y; -}*/ -static void*compactfinish(polywriter_t*w) -{ - compactpoly_t*data = (compactpoly_t*)w->internal; - finish_segment(data); - //qsort(data->poly->strokes, data->poly->num_strokes, sizeof(gfxpolystroke_t), compare_stroke); - free(data->points); - gfxpoly_t*poly = data->poly; - free(w->internal);w->internal = 0; - return (void*)poly; -} -void gfxpolywriter_init(polywriter_t*w) -{ - w->moveto = compactmoveto; - w->lineto = compactlineto; - w->setgridsize = compactsetgridsize; - w->finish = compactfinish; - compactpoly_t*data = w->internal = rfx_calloc(sizeof(compactpoly_t)); - data->poly = rfx_calloc(sizeof(gfxpoly_t)); - data->poly->gridsize = 1.0; - data->last.x = data->last.y = 0; - data->num_points = 0; - data->points_size = 16; - data->new = 1; - data->dir = DIR_UNKNOWN; - data->points = (point_t*)rfx_alloc(sizeof(point_t)*data->points_size); - data->poly->strokes = 0; -} - -gfxpoly_t* gfxpoly_from_fill(gfxline_t*line, double gridsize) -{ - polywriter_t writer; - gfxpolywriter_init(&writer); - writer.setgridsize(&writer, gridsize); - convert_gfxline(line, &writer, gridsize); - return (gfxpoly_t*)writer.finish(&writer); -} -gfxpoly_t* gfxpoly_from_file(const char*filename, double gridsize) -{ - polywriter_t writer; - gfxpolywriter_init(&writer); - writer.setgridsize(&writer, gridsize); - convert_file(filename, &writer, gridsize); - return (gfxpoly_t*)writer.finish(&writer); -} -void gfxpoly_destroy(gfxpoly_t*poly) -{ - int t; - gfxpolystroke_t*stroke = poly->strokes; - while(stroke) { - gfxpolystroke_t*next = stroke->next; - free(stroke->points); - free(stroke); - stroke = next; - } - free(poly); -} - -typedef struct _polydraw_internal -{ - double lx, ly; - int32_t lastx, lasty; - int32_t x0, y0; - double z; - char last; - polywriter_t writer; -} polydraw_internal_t; - -static void polydraw_moveTo(gfxdrawer_t*d, gfxcoord_t _x, gfxcoord_t _y) -{ - polydraw_internal_t*i = (polydraw_internal_t*)d->internal; - int32_t x = convert_coord(_x, i->z); - int32_t y = convert_coord(_y, i->z); - if(i->lastx != x || i->lasty != y) { - i->writer.moveto(&i->writer, x, y); - } - i->lx = _x; - i->ly = _y; - i->x0 = x; - i->y0 = y; - i->lastx = x; - i->lasty = y; - i->last = 1; -} -static void polydraw_lineTo(gfxdrawer_t*d, gfxcoord_t _x, gfxcoord_t _y) -{ - polydraw_internal_t*i = (polydraw_internal_t*)d->internal; - if(!i->last) { - polydraw_moveTo(d, _x, _y); - return; - } - int32_t x = convert_coord(_x, i->z); - int32_t y = convert_coord(_y, i->z); - if(i->lastx != x || i->lasty != y) { - i->writer.lineto(&i->writer, x, y); - } - i->lx = _x; - i->ly = _y; - i->lastx = x; - i->lasty = y; - i->last = 1; -} -static void polydraw_splineTo(gfxdrawer_t*d, gfxcoord_t sx, gfxcoord_t sy, gfxcoord_t x, gfxcoord_t y) -{ - polydraw_internal_t*i = (polydraw_internal_t*)d->internal; - if(!i->last) { - polydraw_moveTo(d, x, y); - return; - } - double c = fabs(x-2*sx+i->lx) + fabs(y-2*sy+i->ly); - int parts = (int)(sqrt(c)*SUBFRACTION); - if(!parts) parts = 1; - int t; - int32_t nx,ny; - for(t=0;tlx)/(double)(parts*parts), i->z); - ny = convert_coord((double)(t*t*y + 2*t*(parts-t)*sy + (parts-t)*(parts-t)*i->ly)/(double)(parts*parts), i->z); - if(nx != i->lastx || ny != i->lasty) { - i->writer.lineto(&i->writer, nx, ny); - i->lastx = nx; i->lasty = ny; - } - } - nx = convert_coord(x,i->z); - ny = convert_coord(y,i->z); - if(nx != i->lastx || ny != i->lasty) { - i->writer.lineto(&i->writer, nx, ny); - } - i->lx = x; - i->ly = y; - i->lastx = nx; - i->lasty = ny; - i->last = 1; -} -static void polydraw_close(gfxdrawer_t*d) -{ - polydraw_internal_t*i = (polydraw_internal_t*)d->internal; - assert(!(i->last && (i->x0 == INVALID_COORD || i->y0 == INVALID_COORD))); - if(!i->last) - return; - if(i->lastx != i->x0 || i->lasty != i->y0) { - i->writer.lineto(&i->writer, i->x0, i->y0); - i->lastx = i->x0; - i->lasty = i->y0; - } - i->last = 0; - i->x0 = INVALID_COORD; - i->y0 = INVALID_COORD; -} -static void* polydraw_result(gfxdrawer_t*d) -{ - polydraw_internal_t*i = (polydraw_internal_t*)d->internal; - void*result = i->writer.finish(&i->writer); - rfx_free(i); - memset(d, 0, sizeof(gfxdrawer_t)); - return result; -} - -void gfxdrawer_target_poly(gfxdrawer_t*d, double gridsize) -{ - polydraw_internal_t*i = (polydraw_internal_t*)rfx_calloc(sizeof(polydraw_internal_t)); - d->internal = i; - i->lastx = INVALID_COORD; // convert_coord can never return this value - i->lasty = INVALID_COORD; - i->x0 = INVALID_COORD; - i->y0 = INVALID_COORD; - d->moveTo = polydraw_moveTo; - d->lineTo = polydraw_lineTo; - d->splineTo = polydraw_splineTo; - d->close = polydraw_close; - d->result = polydraw_result; - gfxpolywriter_init(&i->writer); - i->writer.setgridsize(&i->writer, gridsize); - i->z = 1.0 / gridsize; -} - -#if 0 -gfxline_t*gfxline_from_gfxpoly(gfxpoly_t*poly) -{ - gfxpolystroke_t*stroke; - int count = 0; - for(stroke=poly->strokes;stroke;stroke=stroke->next) { - assert(stroke->num_points); - count += stroke->num_points; - } - if(!count) return 0; - gfxline_t*l = malloc(sizeof(gfxline_t)*count); - count = 0; - /* TODO: it might make sense to concatenate strokes */ - for(stroke=poly->strokes;stroke;stroke=stroke->next) { - int t; - for(t=0;tnum_points;t++) { - l[count+t].x = stroke->points[t].x * poly->gridsize; - l[count+t].y = stroke->points[t].y * poly->gridsize; - l[count+t].type = gfx_lineTo; - l[count+t].next = &l[count+t+1]; - } - l[count].type = gfx_moveTo; - count+=stroke->num_points; - } - l[count-1].next = 0; - return l; -} -#endif - -static gfxline_t*mkgfxline(gfxpoly_t*poly, char preserve_direction) -{ - gfxpolystroke_t*stroke; - int count = 0; - if(!poly->strokes) - return 0; - dict_t*d = dict_new2(&point_type); - dict_t*todo = dict_new2(&ptr_type); - gfxpolystroke_t*stroke_min= poly->strokes; - int32_t x_min=stroke_min->points[0].x; - int32_t y_min=stroke_min->points[0].y; - for(stroke=poly->strokes;stroke;stroke=stroke->next) { - dict_put(todo, stroke, stroke); - assert(stroke->num_points>1); - count += stroke->num_points; - if(stroke->dir == DIR_UP) { - dict_put(d, &stroke->points[stroke->num_points-1], stroke); - if(!preserve_direction) - dict_put(d, &stroke->points[0], stroke); - } else { - dict_put(d, &stroke->points[0], stroke); - if(!preserve_direction) - dict_put(d, &stroke->points[stroke->num_points-1], stroke); - } - if(stroke->points[0].y < y_min || - (stroke->points[0].y == y_min && stroke->points[0].x < x_min)) { - y_min = stroke->points[0].y; - stroke_min = stroke; - } - } - gfxpolystroke_t*next_todo = poly->strokes; - gfxline_t*l = malloc(sizeof(gfxline_t)*count); - count = 0; - stroke = stroke_min; - - point_t last = {INVALID_COORD, INVALID_COORD}; - char should_connect = 0; - while(stroke) { - if(stroke && !preserve_direction) { - char del1 = dict_del2(d, &stroke->points[0], stroke); - char del2 = dict_del2(d, &stroke->points[stroke->num_points-1], stroke); - assert(del1 && del2); - } - assert(dict_contains(todo, stroke)); - int t; - int pos = 0; - int incr = 1; - if(preserve_direction) { - if(stroke->dir == DIR_UP) { - pos = stroke->num_points-1; - incr = -1; - } - } else { - // try to find matching point on either end. - // Prefer downward. - if(last.x == stroke->points[stroke->num_points-1].x && - last.y == stroke->points[stroke->num_points-1].y) { - pos = stroke->num_points-1; - incr = -1; - } - } - if(last.x != stroke->points[pos].x || last.y != stroke->points[pos].y) { - l[count].x = stroke->points[pos].x * poly->gridsize; - l[count].y = stroke->points[pos].y * poly->gridsize; - l[count].type = gfx_moveTo; - l[count].next = &l[count+1]; - count++; - assert(!should_connect); - } - pos += incr; - for(t=1;tnum_points;t++) { - l[count].x = stroke->points[pos].x * poly->gridsize; - l[count].y = stroke->points[pos].y * poly->gridsize; - l[count].type = gfx_lineTo; - l[count].next = &l[count+1]; - count++; - pos += incr; - } - last = stroke->points[pos-incr]; - char del = dict_del(todo, stroke); - assert(del); - assert(!dict_contains(todo, stroke)); - - /* try to find a poly which starts at the point we drew last */ - stroke = dict_lookup(d, &last); - should_connect = 1; - while(!dict_contains(todo, stroke)) { - should_connect = 0; - stroke = next_todo; - if(!next_todo) { - stroke = 0; - break; - } - next_todo = next_todo->next; - } - } - l[count-1].next = 0; - dict_destroy(todo); - dict_destroy(d); - return l; -} - -gfxline_t*gfxline_from_gfxpoly(gfxpoly_t*poly) -{ - return mkgfxline(poly, 0); -} - -gfxline_t*gfxline_from_gfxpoly_with_direction(gfxpoly_t*poly) -{ - return mkgfxline(poly, 1); -} - -static windcontext_t onepolygon = {1}; -gfxline_t* gfxpoly_circular_to_evenodd(gfxline_t*line, double gridsize) -{ - gfxpoly_t*poly = gfxpoly_from_fill(line, gridsize); - gfxpoly_t*poly2 = gfxpoly_process(poly, 0, &windrule_circular, &onepolygon); - gfxline_t*line2 = gfxline_from_gfxpoly(poly2); - gfxpoly_destroy(poly); - gfxpoly_destroy(poly2); - return line2; -} - -gfxpoly_t* gfxpoly_createbox(double x1, double y1,double x2, double y2, double gridsize) -{ - gfxline_t* line = gfxline_makerectangle(x1, y1, x2, y2); - gfxpoly_t* poly = gfxpoly_from_fill(line, gridsize); - gfxline_free(line); - return poly; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.h deleted file mode 100644 index c02e38581..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/convert.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __poly_convert_h__ -#define __poly_convert_h__ - -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "poly.h" - -typedef struct _polywriter -{ - void(*moveto)(struct _polywriter*, int32_t x, int32_t y); - void(*lineto)(struct _polywriter*, int32_t x, int32_t y); - void(*setgridsize)(struct _polywriter*, double g); - void*(*finish)(struct _polywriter*); - void*internal; -} polywriter_t; - -void gfxdrawer_target_poly(gfxdrawer_t*d, double gridsize); - -void gfxpolywriter_init(polywriter_t*w); -gfxpoly_t* gfxpoly_from_fill(gfxline_t*line, double gridsize); -gfxpoly_t* gfxpoly_from_file(const char*filename, double gridsize); -void gfxpoly_destroy(gfxpoly_t*poly); - -gfxline_t*gfxline_from_gfxpoly(gfxpoly_t*poly); -gfxline_t*gfxline_from_gfxpoly_with_direction(gfxpoly_t*poly); // preserves up/down - -gfxline_t* gfxpoly_circular_to_evenodd(gfxline_t*line, double gridsize); -gfxpoly_t* gfxpoly_createbox(double x1, double y1,double x2, double y2, double gridsize); - -#endif //__poly_convert_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/heap.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/heap.h deleted file mode 100644 index 7987337d4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/heap.h +++ /dev/null @@ -1,74 +0,0 @@ -/* heap.h - - An inline heap implementation - - Copyright (c) 2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#define HEAP_DEFINE(name,t,lt) \ -typedef struct { \ - t**elements; \ - int size; \ - int max_size; \ -} name##_t; \ -static void name##_put(name##_t*h, t*e) \ -{ \ - int parent = h->size++; \ - if(h->size>=h->max_size) { \ - h->max_size = h->max_size<15?15:(h->max_size+1)*2-1; \ - h->elements = (t**)realloc(h->elements, \ - h->max_size*sizeof(t*)); \ - } \ - int node; \ - do { \ - node = parent; \ - if(!node) break; \ - parent = (node-1)/2; \ - h->elements[node] = h->elements[parent]; \ - } while(lt(e, h->elements[parent])); \ - h->elements[node] = e; \ -} \ -static t* name##_get(name##_t*h) \ -{ \ - if(!h->size) return 0; \ - t*r = h->elements[0]; \ - int node,child = 0; \ - t*node_p = h->elements[--h->size]; \ - h->elements[0] = node_p; /* for the size==1 case */ \ - do { \ - node = child; \ - child = node<<1|1; \ - if(child >= h->size) { \ - break; \ - } \ - if(child+1 < h->size && lt(h->elements[child+1], \ - h->elements[child])) \ - child++; \ - h->elements[node] = h->elements[child]; \ - } while(lt(h->elements[child],node_p)); \ - h->elements[node] = node_p; \ - return r; \ -} \ -static void name##_init(name##_t*h) \ -{ \ - memset(h, 0, sizeof(*h)); \ - h->max_size = 15; \ - h->elements = malloc(h->max_size*sizeof(t*)); \ -} \ -static void name##_destroy(name##_t*h) \ -{ \ - free((h)->elements); \ -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.c deleted file mode 100644 index d20bcd377..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.c +++ /dev/null @@ -1,1608 +0,0 @@ -#include -#include -#include -#include "../mem.h" -#include "../types.h" -#include "poly.h" -#include "active.h" -#include "xrow.h" -#include "wind.h" -#include "convert.h" -#include "heap.h" - -#ifdef HAVE_MD5 -#include "MD5.h" -#endif - -static gfxpoly_t*current_polygon = 0; -void gfxpoly_fail(char*expr, char*file, int line, const char*function) -{ - if(!current_polygon) { - fprintf(stderr, "assert(%s) failed in %s in line %d: %s\n", expr, file, line, function); - exit(1); - } - - char filename[32+4+1]; -#ifdef HAVE_MD5 - void*md5 = initialize_md5(); - - int s,t; - gfxpolystroke_t*stroke = current_polygon->strokes; - for(;stroke;stroke=stroke->next) { - for(t=0;tnum_points;t++) { - update_md5(md5, (unsigned char*)&stroke->points[t].x, sizeof(stroke->points[t].x)); - update_md5(md5, (unsigned char*)&stroke->points[t].y, sizeof(stroke->points[t].y)); - } - } - unsigned char h[16]; - finish_md5(md5, h); - sprintf(filename, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x.ps", - h[0],h[1],h[2],h[3],h[4],h[5],h[6],h[7],h[8],h[9],h[10],h[11],h[12],h[13],h[14],h[15]); -#else - sprintf(filename, "%d", time(0)); -#endif - - fprintf(stderr, "assert(%s) failed in %s in line %d: %s\n", expr, file, line, function); - fprintf(stderr, "I'm saving a debug file \"%s\" to the current directory.\n", filename); - - gfxpoly_save(current_polygon, filename); - exit(1); -} - -static char point_equals(const void*o1, const void*o2) -{ - const point_t*p1 = o1; - const point_t*p2 = o2; - return p1->x == p2->x && p1->y == p2->y; -} -static unsigned int point_hash(const void*o) -{ - const point_t*p = o; - return p->x^p->y; -} -static void* point_dup(const void*o) -{ - const point_t*p = o; - point_t*n = malloc(sizeof(point_t)); - n->x = p->x; - n->y = p->y; - return n; -} -static void point_free(void*o) -{ - point_t*p = o; - p->x = 0; - p->y = 0; - free(p); -} -type_t point_type = { - equals: point_equals, - hash: point_hash, - dup: point_dup, - free: point_free, -}; - -typedef struct _event { - eventtype_t type; - point_t p; - segment_t*s1; - segment_t*s2; -} event_t; - -/* compare_events_simple differs from compare_events in that it schedules - events from left to right regardless of type. It's only used in horizontal - processing, in order to get an x-wise sorting of the current scanline */ -static inline int compare_events_simple(const void*_a,const void*_b) -{ - event_t* a = (event_t*)_a; - event_t* b = (event_t*)_b; - int d = b->p.y - a->p.y; - if(d) return d; - d = b->p.x - a->p.x; - if(d) return d; - return 0; -} - -static inline int compare_events(const void*_a,const void*_b) -{ - event_t* a = (event_t*)_a; - event_t* b = (event_t*)_b; - int d = b->p.y - a->p.y; - if(d) return d; - /* we need to schedule end after intersect (so that a segment about - to end has a chance to tear up a few other segs first) and start - events after end (in order not to confuse the intersection check, which - assumes there's an actual y overlap between active segments, and - because ending segments in the active list make it difficult to insert - starting segments at the right position)). - Horizontal lines come last, because the only purpose - they have is to create snapping coordinates for the segments (still) - existing in this scanline. - */ - d = b->type - a->type; - if(d) return d; - return 0; - - /* I don't see any reason why we would need to order by x- at least as long - as we do horizontal lines in a seperate pass */ - //d = b->p.x - a->p.x; - //return d; -} - -#define COMPARE_EVENTS(x,y) (compare_events(x,y)>0) -#define COMPARE_EVENTS_SIMPLE(x,y) (compare_events_simple(x,y)>0) -HEAP_DEFINE(queue,event_t,COMPARE_EVENTS); -HEAP_DEFINE(hqueue,event_t,COMPARE_EVENTS_SIMPLE); - -typedef struct _horizontal { - int32_t y; - int32_t x1, x2; - edgestyle_t*fs; - segment_dir_t dir; - int polygon_nr; - int xpos; - int pos; -} horizontal_t; - -typedef struct _horizdata { - horizontal_t*data; - int num; - int size; -} horizdata_t; - -typedef struct _status { - int32_t y; - double gridsize; - actlist_t*actlist; - queue_t queue; - xrow_t*xrow; - windrule_t*windrule; - windcontext_t*context; - segment_t*ending_segments; - - horizdata_t horiz; - - gfxpolystroke_t*strokes; -#ifdef CHECKS - dict_t*seen_crossings; //list of crossing we saw so far - dict_t*intersecting_segs; //list of segments intersecting in this scanline - dict_t*segs_with_point; //lists of segments that received a point in this scanline -#endif -} status_t; - - -int gfxpoly_num_segments(gfxpoly_t*poly) -{ - gfxpolystroke_t*stroke = poly->strokes; - int count = 0; - for(;stroke;stroke=stroke->next) { - count++; - } - return count; -} -int gfxpoly_size(gfxpoly_t*poly) -{ - int s,t; - int edges = 0; - gfxpolystroke_t*stroke = poly->strokes; - for(;stroke;stroke=stroke->next) { - edges += stroke->num_points-1; - } - return edges; -} - -char gfxpoly_check(gfxpoly_t*poly, char updown) -{ - dict_t*d1 = dict_new2(&point_type); - dict_t*d2 = dict_new2(&point_type); - int s,t; - gfxpolystroke_t*stroke = poly->strokes; - for(;stroke;stroke=stroke->next) { - /* In order to not confuse the fill/wind logic, existing segments must have - a non-zero edge style */ - assert(stroke->fs); - - /* put all the segments into dictionaries so that we can check - that the endpoint multiplicity is two */ - for(s=0;snum_points;s++) { - point_t p = stroke->points[s]; - int num_xor = (s>=1 && snum_points-1)?2:1; // mid points are two points (start+end) - int num_circ = (s>=1 && snum_points-1)?0:(s==0?1:-1); - if(stroke->dir==DIR_UP) - num_circ=-num_circ; - - if(!dict_contains(d1, &p)) { - dict_put(d1, &p, (void*)(ptroff_t)num_xor); - if(updown) { - assert(!dict_contains(d2, &p)); - dict_put(d2, &p, (void*)(ptroff_t)num_circ); - } - } else { - int count = (ptroff_t)dict_lookup(d1, &p); - dict_del(d1, &p); - count+=num_xor; - dict_put(d1, &p, (void*)(ptroff_t)count); - - if(updown) { - assert(dict_contains(d2, &p)); - count = (ptroff_t)dict_lookup(d2, &p); - dict_del(d2, &p); - count+=num_circ; - dict_put(d2, &p, (void*)(ptroff_t)count); - } - } - } - } - DICT_ITERATE_ITEMS(d1, point_t*, p1, void*, c1) { - int count = (ptroff_t)c1; - if(count&1) { - fprintf(stderr, "Error: Point (%.2f,%.2f) occurs %d times\n", p1->x * poly->gridsize, p1->y * poly->gridsize, count); - dict_destroy(d1); - dict_destroy(d2); - return 0; - } - } - if(updown) { - DICT_ITERATE_ITEMS(d2, point_t*, p2, void*, c2) { - int count = (ptroff_t)c2; - assert(dict_contains(d1, p2)); - int ocount = (ptroff_t)dict_lookup(d1, p2); - if(count!=0) { - if(count>0) fprintf(stderr, "Error: Point (%.2f,%.2f) has %d more incoming than outgoing segments (%d incoming, %d outgoing)\n", p2->x * poly->gridsize, p2->y * poly->gridsize, count, (ocount+count)/2, (ocount-count)/2); - if(count<0) fprintf(stderr, "Error: Point (%.2f,%.2f) has %d more outgoing than incoming segments (%d incoming, %d outgoing)\n", p2->x * poly->gridsize, p2->y * poly->gridsize, -count, (ocount+count)/2, (ocount-count)/2); - gfxpolystroke_t*stroke = poly->strokes; - for(;stroke;stroke=stroke->next) { - for(s=0;snum_points-1;s++) { - point_t a = stroke->points[s]; - point_t b = stroke->points[s+1]; - if(a.x == p2->x && a.y == p2->y || - b.x == p2->x && b.y == p2->y) { - fprintf(stderr, "%.2f,%.2f -> %.2f,%.2f\n", - a.x * poly->gridsize, - a.y * poly->gridsize, - b.x * poly->gridsize, - b.y * poly->gridsize); - } - } - } - dict_destroy(d2); - return 0; - } - } - } - dict_destroy(d1); - dict_destroy(d2); - return 1; -} - -void gfxpoly_dump(gfxpoly_t*poly) -{ - int s,t; - double g = poly->gridsize; - fprintf(stderr, "polyon %p (gridsize: %.2f)\n", poly, poly->gridsize); - gfxpolystroke_t*stroke = poly->strokes; - for(;stroke;stroke=stroke->next) { - fprintf(stderr, "%11p", stroke); - if(stroke->dir==DIR_UP) { - for(s=stroke->num_points-1;s>=1;s--) { - point_t a = stroke->points[s]; - point_t b = stroke->points[s-1]; - fprintf(stderr, "%s (%.2f,%.2f) -> (%.2f,%.2f)%s%s\n", s!=stroke->num_points-1?" ":"", a.x*g, a.y*g, b.x*g, b.y*g, - s==1?"]":"", a.y==b.y?"H":""); - } - } else { - for(s=0;snum_points-1;s++) { - point_t a = stroke->points[s]; - point_t b = stroke->points[s+1]; - fprintf(stderr, "%s (%.2f,%.2f) -> (%.2f,%.2f)%s%s\n", s?" ":"", a.x*g, a.y*g, b.x*g, b.y*g, - s==stroke->num_points-2?"]":"", a.y==b.y?"H":""); - } - } - } -} - -void gfxpoly_save(gfxpoly_t*poly, const char*filename) -{ - FILE*fi = fopen(filename, "wb"); - fprintf(fi, "%% gridsize %f\n", poly->gridsize); - fprintf(fi, "%% begin\n"); - int s,t; - gfxpolystroke_t*stroke = poly->strokes; - for(;stroke;stroke=stroke->next) { - fprintf(fi, "%g setgray\n", stroke->dir==DIR_UP ? 0.7 : 0); - point_t p = stroke->points[0]; - fprintf(fi, "%d %d moveto\n", p.x, p.y); - for(s=1;snum_points;s++) { - p = stroke->points[s]; - fprintf(fi, "%d %d lineto\n", p.x, p.y); - } - fprintf(fi, "stroke\n"); - } - fprintf(fi, "showpage\n"); - fclose(fi); -} - -void gfxpoly_save_arrows(gfxpoly_t*poly, const char*filename) -{ - FILE*fi = fopen(filename, "wb"); - fprintf(fi, "%% gridsize %f\n", poly->gridsize); - fprintf(fi, "%% begin\n"); - int t; - double l = 5.0 / poly->gridsize; - double g = poly->gridsize; - gfxpolystroke_t*stroke = poly->strokes; - for(;stroke;stroke=stroke->next) { - fprintf(fi, "0 setgray\n"); - - int s = stroke->dir==DIR_UP?stroke->num_points-1:0; - int end = stroke->dir==DIR_UP?-1:stroke->num_points; - int dir = stroke->dir==DIR_UP?-1:1; - - point_t p = stroke->points[s]; - s+=dir; - point_t o = p; - fprintf(fi, "%f %f moveto\n", p.x * g, p.y * g); - for(;s!=end;s+=dir) { - p = stroke->points[s]; - int lx = p.x - o.x; - int ly = p.y - o.y; - double d = sqrt(lx*lx+ly*ly); - if(!d) d=1; - else d = l / d; - double d2 = d*1.5; - fprintf(fi, "%f %f lineto\n", (p.x - lx*d2) * g, (p.y - ly*d2) * g); - fprintf(fi, "%f %f lineto\n", (p.x - lx*d2 + (ly*d))*g, - (p.y - ly*d2 - (lx*d))*g); - fprintf(fi, "%f %f lineto\n", p.x * g, p.y * g); - fprintf(fi, "%f %f lineto\n", (p.x - lx*d2 - (ly*d))*g, - (p.y - ly*d2 + (lx*d))*g); - fprintf(fi, "%f %f lineto\n", (p.x - lx*d2) * g, (p.y - ly*d2) * g); - fprintf(fi, "%f %f moveto\n", p.x * g, p.y * g); - o = p; - } - fprintf(fi, "stroke\n"); - } - fprintf(fi, "showpage\n"); - fclose(fi); -} - -inline static event_t* event_new() -{ - event_t*e = rfx_calloc(sizeof(event_t)); - return e; -} -inline static void event_free(event_t*e) -{ - free(e); -} - -static void event_dump(status_t*status, event_t*e) -{ - if(e->type == EVENT_HORIZONTAL) { - fprintf(stderr, "Horizontal [%d] (%.2f,%.2f) -> (%.2f,%.2f)\n", (int)e->s1->nr, - e->s1->a.x * status->gridsize, e->s1->a.y * status->gridsize, e->s1->b.x * status->gridsize, e->s1->b.y * status->gridsize); - } else if(e->type == EVENT_START) { - fprintf(stderr, "event: segment [%d] starts at (%.2f,%.2f)\n", (int)e->s1->nr, - e->p.x * status->gridsize, e->p.y * status->gridsize); - } else if(e->type == EVENT_END) { - fprintf(stderr, "event: segment [%d] ends at (%.2f,%.2f)\n", (int)e->s1->nr, - e->p.x * status->gridsize, e->p.y * status->gridsize); - } else if(e->type == EVENT_CROSS) { - fprintf(stderr, "event: segment [%d] and [%d] intersect at (%.2f,%.2f)\n", (int)e->s1->nr, (int)e->s2->nr, - e->p.x * status->gridsize, e->p.y * status->gridsize); - } else { - assert(0); - } -} - -static inline int32_t max32(int32_t v1, int32_t v2) {return v1>v2?v1:v2;} -static inline int32_t min32(int32_t v1, int32_t v2) {return v1(%d,%d) ", (int)s->nr, s->a.x, s->a.y, s->b.x, s->b.y); - fprintf(stderr, " dx:%d dy:%d k:%f dx/dy=%f fs=%p\n", s->delta.x, s->delta.y, s->k, - (double)s->delta.x / s->delta.y, s->fs); -} - -static void segment_init(segment_t*s, int32_t x1, int32_t y1, int32_t x2, int32_t y2, int polygon_nr, segment_dir_t dir) -{ - static int segment_count=0; - s->nr = segment_count++; - s->dir = dir; - if(y1!=y2) { - assert(y1x2) { - s->dir = DIR_INVERT(s->dir); - int32_t x = x1;x1=x2;x2=x; - int32_t y = y1;y1=y2;y2=y; - } -#ifdef DEBUG - fprintf(stderr, "Scheduling horizontal segment [%d] (%.2f,%.2f) -> (%.2f,%.2f) %s\n", - segment_count, - x1 * 0.05, y1 * 0.05, x2 * 0.05, y2 * 0.05, s->dir==DIR_UP?"up":"down"); -#endif - } - s->a.x = x1; - s->a.y = y1; - s->b.x = x2; - s->b.y = y2; - s->k = (double)x1*y2-(double)x2*y1; - s->left = s->right = 0; - s->delta.x = x2-x1; - s->delta.y = y2-y1; - s->minx = min32(x1,x2); - s->maxx = max32(x1,x2); - - s->pos = s->a; - s->polygon_nr = polygon_nr; - -#ifdef CHECKS - /* notice: on some systems (with some compilers), for the line - (1073741823,-1073741824)->(1073741823,1073741823) - we get LINE_EQ(s->a, s) == 1. - That's why we now clamp to 26 bit. - */ - assert(LINE_EQ(s->a, s) == 0); - assert(LINE_EQ(s->b, s) == 0); - - /* check that all signs are in order: - a a - |\ /| - | \ / | - minx-b b--maxx - < 0 > 0 - */ - point_t p = s->b; - p.x = min32(s->a.x, s->b.x); - assert(LINE_EQ(p, s) <= 0); - p.x = max32(s->a.x, s->b.x); - assert(LINE_EQ(p, s) >= 0); -#endif - -#ifndef DONT_REMEMBER_CROSSINGS - dict_init2(&s->scheduled_crossings, &ptr_type, 0); -#endif -} - -static segment_t* segment_new(point_t a, point_t b, int polygon_nr, segment_dir_t dir) -{ - segment_t*s = (segment_t*)rfx_calloc(sizeof(segment_t)); - segment_init(s, a.x, a.y, b.x, b.y, polygon_nr, dir); - return s; -} - -static void segment_clear(segment_t*s) -{ -#ifndef DONT_REMEMBER_CROSSINGS - dict_clear(&s->scheduled_crossings); -#endif -} -static void segment_destroy(segment_t*s) -{ - segment_clear(s); - free(s); -} - -static void advance_stroke(queue_t*queue, hqueue_t*hqueue, gfxpolystroke_t*stroke, int polygon_nr, int pos, double gridsize) -{ - if(!stroke) - return; - segment_t*s = 0; - /* we need to queue multiple segments at once because we need to process start events - before horizontal events */ - while(pos < stroke->num_points-1) { - assert(stroke->points[pos].y <= stroke->points[pos+1].y); - s = segment_new(stroke->points[pos], stroke->points[pos+1], polygon_nr, stroke->dir); - s->fs = stroke->fs; - pos++; - s->stroke = 0; - s->stroke_pos = 0; -#ifdef DEBUG - /*if(l->tmp) - s->nr = l->tmp;*/ - fprintf(stderr, "[%d] (%.2f,%.2f) -> (%.2f,%.2f) %s (stroke %p, %d more to come)\n", - s->nr, s->a.x * gridsize, s->a.y * gridsize, - s->b.x * gridsize, s->b.y * gridsize, - s->dir==DIR_UP?"up":"down", stroke, stroke->num_points - 1 - pos); -#endif - event_t* e = event_new(); - e->type = s->delta.y ? EVENT_START : EVENT_HORIZONTAL; - e->p = s->a; - e->s1 = s; - e->s2 = 0; - - if(queue) queue_put(queue, e); - else hqueue_put(hqueue, e); - - if(e->type != EVENT_HORIZONTAL) { - break; - } - } - if(s) { - s->stroke = stroke; - s->stroke_pos = pos; - } -} - -static void gfxpoly_enqueue(gfxpoly_t*p, queue_t*queue, hqueue_t*hqueue, int polygon_nr) -{ - int t; - gfxpolystroke_t*stroke = p->strokes; - for(;stroke;stroke=stroke->next) { - assert(stroke->num_points > 1); - -#ifdef CHECKS - int s; - for(s=0;snum_points-1;s++) { - assert(stroke->points[s].y <= stroke->points[s+1].y); - } -#endif - advance_stroke(queue, hqueue, stroke, polygon_nr, 0, p->gridsize); - } -} - -static void schedule_endpoint(status_t*status, segment_t*s) -{ - // schedule end point of segment - assert(s->b.y > status->y); - event_t*e = event_new(); - e->type = EVENT_END; - e->p = s->b; - e->s1 = s; - e->s2 = 0; - queue_put(&status->queue, e); -} - -static void schedule_crossing(status_t*status, segment_t*s1, segment_t*s2) -{ - /* the code that's required (and the checks you can perform) before - it can be said with 100% certainty that we indeed have a valid crossing - amazes me every time. -mk */ -#ifdef CHECKS - assert(s1!=s2); - assert(s1->right == s2); - assert(s2->left == s1); - int32_t miny1 = min32(s1->a.y,s1->b.y); - int32_t maxy1 = max32(s1->a.y,s1->b.y); - int32_t miny2 = min32(s2->a.y,s2->b.y); - int32_t maxy2 = max32(s2->a.y,s2->b.y); - int32_t minx1 = min32(s1->a.x,s1->b.x); - int32_t minx2 = min32(s2->a.x,s2->b.x); - int32_t maxx1 = max32(s1->a.x,s1->b.x); - int32_t maxx2 = max32(s2->a.x,s2->b.x); - /* check that precomputation is sane */ - assert(minx1 == s1->minx && minx2 == s2->minx); - assert(maxx1 == s1->maxx && maxx2 == s2->maxx); - /* both segments are active, so this can't happen */ - assert(!(maxy1 <= miny2 || maxy2 <= miny1)); - /* we know that right now, s2 is to the right of s1, so there's - no way the complete bounding box of s1 is to the right of s1 */ - assert(!(s1->minx > s2->maxx)); - assert(s1->minx != s2->maxx || (!s1->delta.x && !s2->delta.x)); -#endif - - if(s1->maxx <= s2->minx) { -#ifdef DEBUG - fprintf(stderr, "[%d] doesn't intersect with [%d] because: bounding boxes don't intersect\n", s1->nr, s2->nr); -#endif - /* bounding boxes don't intersect */ - return; - } - -#ifndef DONT_REMEMBER_CROSSINGS - if(dict_contains(&s1->scheduled_crossings, (void*)(ptroff_t)s2->nr)) { - /* FIXME: this whole segment hashing thing is really slow */ -#ifdef DEBUG - fprintf(stderr, "[%d] doesn't intersect with [%d] because: we already scheduled this intersection\n", s1->nr, s2->nr); -// DICT_ITERATE_KEY(&s1->scheduled_crossings, void*, x) { -// fprintf(stderr, "[%d]<->[%d]\n", s1->nr, (int)(ptroff_t)x); -// } -#endif - return; // we already know about this one - } -#endif - - double det = (double)s1->delta.x*s2->delta.y - (double)s1->delta.y*s2->delta.x; - if(!det) { - if(s1->k == s2->k) { - // lines are exactly on top of each other (ignored) -#ifdef DEBUG - fprintf(stderr, "Notice: segments [%d] and [%d] are exactly on top of each other\n", s1->nr, s2->nr); -#endif - return; - } else { -#ifdef DEBUG - fprintf(stderr, "[%d] doesn't intersect with [%d] because: they are parallel to each other\n", s1->nr, s2->nr); -#endif - /* lines are parallel */ - return; - } - } - - double asign2 = LINE_EQ(s1->a, s2); - if(asign2==0) { - // segment1 touches segment2 in a single point (ignored) -#ifdef DEBUG - fprintf(stderr, "Notice: segment [%d]'s start point touches segment [%d]\n", s1->nr, s2->nr); -#endif - return; - } - double bsign2 = LINE_EQ(s1->b, s2); - if(bsign2==0) { - // segment1 touches segment2 in a single point (ignored) -#ifdef DEBUG - fprintf(stderr, "Notice: segment [%d]'s end point touches segment [%d]\n", s1->nr, s2->nr); -#endif - return; - } - - if(asign2<0 && bsign2<0) { - // segment1 is completely to the left of segment2 -#ifdef DEBUG - fprintf(stderr, "[%d] doesn't intersect with [%d] because: [%d] is completely to the left of [%d]\n", s1->nr, s2->nr, s1->nr, s2->nr); -#endif - return; - } - if(asign2>0 && bsign2>0) { - // segment1 is completely to the right of segment2 -#ifndef DONT_REMEMBER_CROSSINGS - assert(0); -#endif -#ifdef DEBUG - fprintf(stderr, "[%d] doesn't intersect with [%d] because: [%d] is completely to the left of [%d]\n", s1->nr, s2->nr, s2->nr, s1->nr); -#endif - return; - } - - double asign1 = LINE_EQ(s2->a, s1); - if(asign1==0) { - // segment2 touches segment1 in a single point (ignored) -#ifdef DEBUG - fprintf(stderr, "Notice: segment [%d]'s start point touches segment [%d]\n", s2->nr, s1->nr); -#endif - return; - } - double bsign1 = LINE_EQ(s2->b, s1); - if(asign2==0) { - // segment2 touches segment1 in a single point (ignored) -#ifdef DEBUG - fprintf(stderr, "Notice: segment [%d]'s end point touches segment [%d]\n", s2->nr, s1->nr); -#endif - return; - } - - if(asign1<0 && bsign1<0) { - // segment2 is completely to the left of segment1 -#ifndef DONT_REMEMBER_CROSSINGS - assert(0); -#endif -#ifdef DEBUG - fprintf(stderr, "[%d] doesn't intersect with [%d] because: [%d] is completely to the left of [%d]\n", s1->nr, s2->nr, s1->nr, s2->nr); -#endif - return; - } - if(asign1>0 && bsign1>0) { - // segment2 is completely to the right of segment1 -#ifdef DEBUG - fprintf(stderr, "[%d] doesn't intersect with [%d] because: [%d] is completely to the left of [%d]\n", s1->nr, s2->nr, s2->nr, s1->nr); -#endif - return; - } - -#ifdef DONT_REMEMBER_CROSSINGS - /* s2 crosses s1 from *left* to *right*. This is a crossing we already processed- - there's not way s2 would be to the left of s1 otherwise */ - if(asign1<0 && bsign1>0) return; - if(asign2>0 && bsign2<0) return; -#endif - - assert(!(asign1<0 && bsign1>0)); - assert(!(asign2>0 && bsign2<0)); - - /* TODO: should we precompute these? */ - double la = (double)s1->a.x*(double)s1->b.y - (double)s1->a.y*(double)s1->b.x; - double lb = (double)s2->a.x*(double)s2->b.y - (double)s2->a.y*(double)s2->b.x; - - point_t p; - p.x = (int32_t)ceil((-la*s2->delta.x + lb*s1->delta.x) / det); - p.y = (int32_t)ceil((+lb*s1->delta.y - la*s2->delta.y) / det); - - assert(p.y >= status->y); -#ifdef CHECKS - assert(p.x >= s1->minx && p.x <= s1->maxx); - assert(p.x >= s2->minx && p.x <= s2->maxx); - - point_t pair; - pair.x = s1->nr; - pair.y = s2->nr; -#ifndef DONT_REMEMBER_CROSSINGS - assert(!dict_contains(status->seen_crossings, &pair)); - dict_put(status->seen_crossings, &pair, 0); -#endif -#endif -#ifdef DEBUG - fprintf(stderr, "schedule crossing between [%d] and [%d] at (%d,%d)\n", s1->nr, s2->nr, p.x, p.y); -#endif - -#ifndef DONT_REMEMBER_CROSSINGS - /* we insert into each other's intersection history because these segments might switch - places and we still want to look them up quickly after they did */ - dict_put(&s1->scheduled_crossings, (void*)(ptroff_t)(s2->nr), 0); - dict_put(&s2->scheduled_crossings, (void*)(ptroff_t)(s1->nr), 0); -#endif - - event_t* e = event_new(); - e->type = EVENT_CROSS; - e->p = p; - e->s1 = s1; - e->s2 = s2; - queue_put(&status->queue, e); - return; -} - -static void exchange_two(status_t*status, event_t*e) -{ - //exchange two segments in list - segment_t*s1 = e->s1; - segment_t*s2 = e->s2; -#ifdef CHECKS - if(!dict_contains(status->intersecting_segs, s1)) - dict_put(status->intersecting_segs, s1, 0); - if(!dict_contains(status->intersecting_segs, s2)) - dict_put(status->intersecting_segs, s2, 0); -#endif - assert(s2->left == s1); - assert(s1->right == s2); - actlist_swap(status->actlist, s1, s2); - assert(s2->right == s1); - assert(s1->left == s2); - segment_t*left = s2->left; - segment_t*right = s1->right; - if(left) - schedule_crossing(status, left, s2); - if(right) - schedule_crossing(status, s1, right); -} - -typedef struct _box { - point_t left1, left2, right1, right2; -} box_t; -static inline box_t box_new(int32_t x, int32_t y) -{ - box_t box; - box.right1.x = box.right2.x = x; - box.left1.x = box.left2.x = x-1; - box.left1.y = box.right1.y = y-1; - box.left2.y = box.right2.y = y; - return box; -} - -static void store_horizontal(status_t*status, point_t p1, point_t p2, edgestyle_t*fs, segment_dir_t dir, int polygon_nr); - -static void append_stroke(status_t*status, point_t a, point_t b, segment_dir_t dir, edgestyle_t*fs) -{ - gfxpolystroke_t*stroke = status->strokes; - /* find a stoke to attach this segment to. It has to have an endpoint - matching our start point, and a matching edgestyle */ - while(stroke) { - point_t p = stroke->points[stroke->num_points-1]; - if(p.x == a.x && p.y == a.y && stroke->fs == fs && stroke->dir == dir) - break; - stroke = stroke->next; - } - if(!stroke) { - stroke = rfx_calloc(sizeof(gfxpolystroke_t)); - stroke->dir = dir; - stroke->fs = fs; - stroke->next = status->strokes; - status->strokes = stroke; - stroke->points_size = 2; - stroke->points = rfx_calloc(sizeof(point_t)*stroke->points_size); - stroke->points[0] = a; - stroke->num_points = 1; - } else if(stroke->num_points == stroke->points_size) { - assert(stroke->fs); - stroke->points_size *= 2; - stroke->points = rfx_realloc(stroke->points, sizeof(point_t)*stroke->points_size); - } - stroke->points[stroke->num_points++] = b; -} - -static void insert_point_into_segment(status_t*status, segment_t*s, point_t p) -{ - assert(s->pos.x != p.x || s->pos.y != p.y); - -#ifdef CHECKS - if(!dict_contains(status->segs_with_point, s)) - dict_put(status->segs_with_point, s, 0); - assert(s->fs_out_ok); -#endif - - if(s->pos.y != p.y) { - /* non horizontal line- copy to output */ - if(s->fs_out) { - segment_dir_t dir = s->wind.is_filled?DIR_DOWN:DIR_UP; -#ifdef DEBUG - fprintf(stderr, "[%d] receives next point (%.2f,%.2f)->(%.2f,%.2f) (drawing (%s))\n", s->nr, - s->pos.x * status->gridsize, s->pos.y * status->gridsize, - p.x * status->gridsize, p.y * status->gridsize, - dir==DIR_UP?"up":"down" - ); -#endif - assert(s->pos.y != p.y); - append_stroke(status, s->pos, p, dir, s->fs_out); - } else { -#ifdef DEBUG - fprintf(stderr, "[%d] receives next point (%.2f,%.2f) (omitting)\n", s->nr, - p.x * status->gridsize, - p.y * status->gridsize); -#endif - } - } else { - /* horizontal line. we need to look at this more closely at the end of this - scanline */ - store_horizontal(status, s->pos, p, s->fs, s->dir, s->polygon_nr); - } - - s->pos = p; -} - -typedef struct _segrange { - double xmin; - segment_t*segmin; - double xmax; - segment_t*segmax; -} segrange_t; - -static void segrange_adjust_endpoints(segrange_t*range, int32_t y) -{ -#define XPOS_EQ(s1,s2,ypos) (XPOS((s1),(ypos))==XPOS((s2),(ypos))) - segment_t*min = range->segmin; - segment_t*max = range->segmax; - - /* we need this because if two segments intersect exactly on - the scanline, segrange_test_segment_{min,max} can't tell which - one is smaller/larger */ - if(min) while(min->left && XPOS_EQ(min, min->left, y)) { - min = min->left; - } - if(max) while(max->right && XPOS_EQ(max, max->right, y)) { - max = max->right; - } - range->segmin = min; - range->segmax = max; -} -static void segrange_test_segment_min(segrange_t*range, segment_t*seg, int32_t y) -{ - if(!seg) return; - /* we need to calculate the xpos anew (and can't use start coordinate or - intersection coordinate), because we need the xpos exactly at the end of - this scanline. - */ - double x = XPOS(seg, y); - if(!range->segmin || xxmin) { - range->segmin = seg; - range->xmin = x; - } -} -static void segrange_test_segment_max(segrange_t*range, segment_t*seg, int32_t y) -{ - if(!seg) return; - double x = XPOS(seg, y); - if(!range->segmax || x>range->xmax) { - range->segmax = seg; - range->xmax = x; - } -} - -/* - SLOPE_POSITIVE: - \+ \ + ------- I \I - -I\---- I - I \ --I\--- - I \ I \ ------- - + \ + \ -*/ -static void add_points_to_positively_sloped_segments(status_t*status, int32_t y, segrange_t*range) -{ - segment_t*first=0, *last = 0; - int t; - for(t=0;txrow->num;t++) { - box_t box = box_new(status->xrow->x[t], y); - segment_t*seg = actlist_find(status->actlist, box.left2, box.left2); - - seg = actlist_right(status->actlist, seg); - while(seg) { - if(seg->a.y == y) { - // this segment started in this scanline, ignore it - seg->changed = 1;last = seg;if(!first) {first=seg;} - } else if(seg->delta.x <= 0) { - // ignore segment w/ negative slope - } else { - last = seg;if(!first) {first=seg;} - double d1 = LINE_EQ(box.right1, seg); - double d2 = LINE_EQ(box.right2, seg); - if(d1>0 || d2>=0) { - seg->changed = 1; - insert_point_into_segment(status, seg, box.right2); - } else { - /* we unfortunately can't break here- the active list is sorted according - to the *bottom* of the scanline. hence pretty much everything that's still - coming might reach into our box */ - //break; - } - } - seg = seg->right; - } - } - segrange_test_segment_min(range, first, y); - segrange_test_segment_max(range, last, y); -} -/* SLOPE_NEGATIVE: - | + /| + / / - | I / | I / / - | I / | I/ / - | I/ | I / - | I | /I / - | /+ |/ + / -*/ -static void add_points_to_negatively_sloped_segments(status_t*status, int32_t y, segrange_t*range) -{ - segment_t*first=0, *last = 0; - int t; - for(t=status->xrow->num-1;t>=0;t--) { - box_t box = box_new(status->xrow->x[t], y); - segment_t*seg = actlist_find(status->actlist, box.right2, box.right2); - - while(seg) { - if(seg->a.y == y) { - // this segment started in this scanline, ignore it - seg->changed = 1;last = seg;if(!first) {first=seg;} - } else if(seg->delta.x > 0) { - // ignore segment w/ positive slope - } else { - last = seg;if(!first) {first=seg;} - double d1 = LINE_EQ(box.left1, seg); - double d2 = LINE_EQ(box.left2, seg); - if(d1<0 || d2<0) { - seg->changed = 1; - insert_point_into_segment(status, seg, box.right2); - } else { - //break; - } - } - seg = seg->left; - } - } - segrange_test_segment_min(range, last, y); - segrange_test_segment_max(range, first, y); -} - -/* segments ending in the current scanline need xrow treatment like everything else. - (consider an intersection taking place just above a nearly horizontal segment - ending on the current scanline- the intersection would snap down *below* the - ending segment if we don't add the intersection point to the latter right away) - we need to treat ending segments seperately, however. we have to delete them from - the active list right away to make room for intersect operations (which might - still be in the current scanline- consider two 45° polygons and a vertical polygon - intersecting on an integer coordinate). but once they're no longer in the active list, - we can't use the add_points_to_*_sloped_segments() functions anymore, and re-adding - them to the active list just for point snapping would be overkill. - (One other option to consider, however, would be to create a new active list only - for ending segments) -*/ -static void add_points_to_ending_segments(status_t*status, int32_t y) -{ - segment_t*seg = status->ending_segments; - while(seg) { - segment_t*next = seg->right;seg->right=0; - - assert(seg->b.y == status->y); - - if(status->xrow->num == 1) { - // shortcut - assert(seg->b.x == status->xrow->x[0]); - point_t p = {status->xrow->x[0], y}; - insert_point_into_segment(status, seg, p); - } else { - int t; - int start=0,end=status->xrow->num,dir=1; - if(seg->delta.x < 0) { - start = status->xrow->num-1; - end = dir = -1; - } -#ifdef CHECKS - char ok = 0; -#endif - for(t=start;t!=end;t+=dir) { - box_t box = box_new(status->xrow->x[t], y); - double d0 = LINE_EQ(box.left1, seg); - double d1 = LINE_EQ(box.left2, seg); - double d2 = LINE_EQ(box.right1, seg); - double d3 = LINE_EQ(box.right2, seg); - if(!(d0>=0 && d1>=0 && d2>=0 && d3>0 || - d0<=0 && d1<=0 && d2<=0 && d3<0)) { - insert_point_into_segment(status, seg, box.right2); - //break; -#ifdef CHECKS - ok = 1; -#endif - } - } - -#ifdef CHECKS - /* we *need* to find a point to insert. the segment's own end point - is in that list, for Pete's sake. */ - assert(ok); -#endif - } - // now that this is done, too, we can also finally free this segment - segment_destroy(seg); - seg = next; - } - status->ending_segments = 0; -} - -static void recalculate_windings(status_t*status, segrange_t*range) -{ -#ifdef DEBUG - fprintf(stderr, "range: [%d]..[%d]\n", SEGNR(range->segmin), SEGNR(range->segmax)); -#endif - segrange_adjust_endpoints(range, status->y); - - segment_t*s = range->segmin; - segment_t*end = range->segmax; - segment_t*last = 0; - -#ifdef DEBUG - s = actlist_leftmost(status->actlist); - while(s) { - fprintf(stderr, "[%d]%d%s ", s->nr, s->changed, - s == range->segmin?"S":( - s == range->segmax?"E":"")); - s = s->right; - } - fprintf(stderr, "\n"); - s = range->segmin; -#endif -#ifdef CHECKS - /* test sanity: verify that we don't have changed segments - outside of the given range */ - s = actlist_leftmost(status->actlist); - while(s && s!=range->segmin) { - assert(!s->changed); - s = s->right; - } - s = actlist_rightmost(status->actlist); - while(s && s!=range->segmax) { - assert(!s->changed); - s = s->left; - } - /* in check mode, go through the whole interval so we can test - that all polygons where the edgestyle changed also have seg->changed=1 */ - s = actlist_leftmost(status->actlist); - end = 0; -#endif - - if(end) - end = end->right; - while(s!=end) { -#ifndef CHECKS - if(s->changed) -#endif - { - segment_t* left = actlist_left(status->actlist, s); - windstate_t wind = left?left->wind:status->windrule->start(status->context); - s->wind = status->windrule->add(status->context, wind, s->fs, s->dir, s->polygon_nr); - edgestyle_t*fs_old = s->fs_out; - s->fs_out = status->windrule->diff(&wind, &s->wind); - -#ifdef DEBUG - fprintf(stderr, "[%d] dir=%s wind=%d wind.filled=%s fs_old/new=%s/%s %s\n", s->nr, s->dir==DIR_UP?"up":"down", s->wind.wind_nr, s->wind.is_filled?"fill":"nofill", - fs_old?"draw":"omit", s->fs_out?"draw":"omit", - fs_old!=s->fs_out?"CHANGED":""); -#endif - assert(!(!s->changed && fs_old!=s->fs_out)); - s->changed = 0; - -#ifdef CHECKS - s->fs_out_ok = 1; -#endif - } - s = s->right; - } -} - -/* we need to handle horizontal lines in order to add points to segments - we otherwise would miss during the windrule re-evaluation */ -static void intersect_with_horizontal(status_t*status, segment_t*h) -{ - segment_t* left = actlist_find(status->actlist, h->a, h->a); - segment_t* right = actlist_find(status->actlist, h->b, h->b); - - /* h->a.x is not strictly necessary, as it's also done by the event */ - xrow_add(status->xrow, h->a.x); - xrow_add(status->xrow, h->b.x); - - if(!right) { - assert(!left); - return; - } - - left = actlist_right(status->actlist, left); //first seg to the right of h->a - right = right->right; //first seg to the right of h->b - segment_t* s = left; - - point_t o = h->a; - while(s!=right) { - assert(s); - int32_t x = XPOS_INT(s, status->y); - point_t p = {x, status->y}; -#ifdef DEBUG - fprintf(stderr, "...intersecting with [%d] (%.2f,%.2f) -> (%.2f,%.2f) at (%.2f,%.2f)\n", - s->nr, - s->a.x * status->gridsize, s->a.y * status->gridsize, - s->b.x * status->gridsize, s->b.y * status->gridsize, - x * status->gridsize, status->y * status->gridsize - ); -#endif - assert(x >= h->a.x); - assert(x <= h->b.x); - assert(s->delta.x > 0 && x >= s->a.x || s->delta.x <= 0 && x <= s->a.x); - assert(s->delta.x > 0 && x <= s->b.x || s->delta.x <= 0 && x >= s->b.x); - xrow_add(status->xrow, x); - - o = p; - s = s->right; - } -} - -/* while, for a scanline, we need both starting as well as ending segments in order - to *reconstruct* horizontal lines, we only need one or the other to *process* - horizontal lines from the input data. - - So horizontal lines are processed twice: first they create hotpixels by intersecting - all segments on the scanline (EVENT_HORIZTONAL). Secondly, they are processed for - their actual content. The second also happens for all segments that received more than - one point in this scanline. -*/ -void horiz_reset(horizdata_t*horiz) -{ - horiz->num = 0; -} - -void horiz_destroy(horizdata_t*horiz) -{ - if(horiz->data) rfx_free(horiz->data); - horiz->data = 0; -} - -static windstate_t get_horizontal_first_windstate(status_t*status, int x1, int x2) -{ - point_t p1 = {x1,status->y}; - point_t p2 = {x2,status->y}; - segment_t*left = actlist_find(status->actlist, p1, p2); - - segment_t*a = actlist_right(status->actlist, left); - while(a) { - if(a->pos.y == status->y) { - /* we need to iterate through all segments that received a point in this - scanline, as actlist_find above will miss (positively sloped) segments - that are to the right of (x1,y) only as long as we don't take the - hotpixel re-routing into account - TODO: this is inefficient, we should probably be iterating through the - hotpixels on this scanline. - */ - if(a->pos.x == x1) - left = a; - if(a->pos.x > x1) - break; - } - a = a->right; - } - - assert(!left || left->fs_out_ok); -#ifdef DEBUG - fprintf(stderr, " fragment %.2f..%.2f\n", - x1 * status->gridsize, - x2 * status->gridsize); - if(left) { - fprintf(stderr, " segment [%d] (%.2f,%.2f -> %.2f,%2f, at %.2f,%.2f) is to the left\n", - SEGNR(left), - left->a.x * status->gridsize, - left->a.y * status->gridsize, - left->b.x * status->gridsize, - left->b.y * status->gridsize, - left->pos.x * status->gridsize, - left->pos.y * status->gridsize - ); - /* this segment might be a distance away from the left point - of the horizontal line if the horizontal line belongs to a stroke - with segments that just ended (so this horizontal line appears to - be "floating in space" from our current point of view) - assert(left->pos.y == h->y && left->pos.x == h->x1); - */ - } -#endif - return left?left->wind:status->windrule->start(status->context); -} - -static windstate_t process_horizontal_fragment(status_t*status, horizontal_t*h, int x1, int x2, windstate_t below) -{ - windstate_t above = status->windrule->add(status->context, below, h->fs, h->dir, h->polygon_nr); - edgestyle_t*fs = status->windrule->diff(&above, &below); - - segment_dir_t dir = above.is_filled?DIR_DOWN:DIR_UP; - point_t p1 = {x1,h->y}; - point_t p2 = {x2,h->y}; - - if(fs) { - //append_stroke(status, p1, p2, DIR_INVERT(h->dir), fs); - append_stroke(status, p1, p2, dir, fs); - } -#ifdef DEBUG - fprintf(stderr, " ...%s (below: (wind_nr=%d, filled=%d), above: (wind_nr=%d, filled=%d) %s %d-%d\n", - fs?"storing":"ignoring", - below.wind_nr, below.is_filled, - above.wind_nr, above.is_filled, - dir==DIR_UP?"up":"down", x1, x2); -#endif - return above; -} - -typedef enum {hevent_hotpixel,hevent_end,hevent_start} horizontal_event_type_t; -typedef struct _hevent { - int32_t x; - horizontal_t*h; - horizontal_event_type_t type; -} hevent_t; - -typedef struct _hevents { - hevent_t*events; - int num; -} hevents_t; - -static int compare_hevents(const void *_e1, const void *_e2) -{ - hevent_t*e1 = (hevent_t*)_e1; - hevent_t*e2 = (hevent_t*)_e2; - int diff = e1->x - e2->x; - if(diff) return diff; - return e1->type - e2->type; //schedule hotpixel before hend -} - -static hevents_t hevents_fill(status_t*status) -{ - horizdata_t*horiz = &status->horiz; - xrow_t*xrow = status->xrow; - - hevents_t e; - e.events = malloc(sizeof(hevent_t)*(horiz->num*2 + xrow->num)); - e.num = 0; - - int t; - for(t=0;tnum;t++) { - assert(horiz->data[t].x1 != horiz->data[t].x2); - e.events[e.num].x = horiz->data[t].x1; - e.events[e.num].h = &horiz->data[t]; - e.events[e.num].type = hevent_start; - e.num++; - e.events[e.num].x = horiz->data[t].x2; - e.events[e.num].h = &horiz->data[t]; - e.events[e.num].type = hevent_end; - e.num++; - } - for(t=0;tnum;t++) { - e.events[e.num].x = status->xrow->x[t]; - e.events[e.num].h = 0; - e.events[e.num].type = hevent_hotpixel; - e.num++; - } - qsort(e.events, e.num, sizeof(hevent_t), compare_hevents); - return e; - -} - -static void process_horizontals(status_t*status) -{ - horizdata_t*horiz = &status->horiz; - - if(!horiz->num) - return; - - hevents_t events = hevents_fill(status); - int num_open = 0; - horizontal_t**open = malloc(sizeof(horizontal_t*)*horiz->num); - - int s,t; - for(t=0;ttype) { - case hevent_start: - e->h->pos = num_open; - open[num_open++] = e->h; -#ifdef DEBUG - fprintf(stderr, "horizontal (y=%.2f): %.2f -> %.2f dir=%s fs=%p\n", - e->h->y * status->gridsize, - e->h->x1 * status->gridsize, - e->h->x2 * status->gridsize, - e->h->dir==DIR_UP?"up":"down", e->h->fs); -#endif - assert(e->h->y == status->y); - assert(xrow_contains(status->xrow, e->h->x1)); - assert(xrow_contains(status->xrow, e->h->x2)); - break; - case hevent_end: - num_open--; - if(num_open) { - open[num_open]->pos = e->h->pos; - open[e->h->pos] = open[num_open]; - } - break; - case hevent_hotpixel: - { - windstate_t below; - for(s=0;sxpos; - int x2 = e->x; - assert(status->y == open[s]->y); - if(!s) - below = get_horizontal_first_windstate(status, x1, x2); - open[s]->xpos = e->x; - assert(x1 < x2); - below = process_horizontal_fragment(status, open[s], x1, x2, below); - } - } - break; - } - } - free(open); - free(events.events); -} - -static void store_horizontal(status_t*status, point_t p1, point_t p2, edgestyle_t*fs, segment_dir_t dir, int polygon_nr) -{ - assert(p1.y == p2.y); - assert(p1.x != p2.x); // TODO: can this happen? - - if(p1.x > p2.x) { - dir = DIR_INVERT(dir); - point_t p_1 = p1; - point_t p_2 = p2; - p1 = p_2; - p2 = p_1; - } - - /* TODO: convert this into a linked list */ - if(status->horiz.size == status->horiz.num) { - if(!status->horiz.size) - status->horiz.size = 16; - status->horiz.size *= 2; - status->horiz.data = rfx_realloc(status->horiz.data, sizeof(status->horiz.data[0])*status->horiz.size); - } - horizontal_t*h = &status->horiz.data[status->horiz.num++]; - h->y = p1.y; - h->xpos = p1.x; - h->x1 = p1.x; - h->x2 = p2.x; - h->fs = fs; - h->dir = dir; - h->polygon_nr = polygon_nr; -} - - -static void event_apply(status_t*status, event_t*e) -{ -#ifdef DEBUG - event_dump(status, e); -#endif - - switch(e->type) { - case EVENT_HORIZONTAL: { - segment_t*s = e->s1; - intersect_with_horizontal(status, s); - store_horizontal(status, s->a, s->b, s->fs, s->dir, s->polygon_nr); - advance_stroke(&status->queue, 0, s->stroke, s->polygon_nr, s->stroke_pos, status->gridsize); - segment_destroy(s);e->s1=0; - break; - } - case EVENT_END: { - //delete segment from list - segment_t*s = e->s1; -#ifdef CHECKS - dict_del(status->intersecting_segs, s); - dict_del(status->segs_with_point, s); - assert(!dict_contains(status->intersecting_segs, s)); - assert(!dict_contains(status->segs_with_point, s)); -#endif - segment_t*left = s->left; - segment_t*right = s->right; - actlist_delete(status->actlist, s); - if(left && right) - schedule_crossing(status, left, right); - - /* schedule segment for xrow handling */ - s->left = 0; s->right = status->ending_segments; - status->ending_segments = s; - advance_stroke(&status->queue, 0, s->stroke, s->polygon_nr, s->stroke_pos, status->gridsize); - break; - } - case EVENT_START: { - //insert segment into list - segment_t*s = e->s1; - assert(e->p.x == s->a.x && e->p.y == s->a.y); - actlist_insert(status->actlist, s->a, s->b, s); - segment_t*left = s->left; - segment_t*right = s->right; - if(left) - schedule_crossing(status, left, s); - if(right) - schedule_crossing(status, s, right); - schedule_endpoint(status, s); - break; - } - case EVENT_CROSS: { - // exchange two segments - if(e->s1->right == e->s2) { - assert(e->s2->left == e->s1); - exchange_two(status, e); - } else { - assert(e->s2->left != e->s1); -#ifdef DEBUG - fprintf(stderr, "Ignore this crossing ([%d] not next to [%d])\n", e->s1->nr, e->s2->nr); -#endif -#ifndef DONT_REMEMBER_CROSSINGS - /* ignore this crossing for now (there are some line segments in between). - it'll get rescheduled as soon as the "obstacles" are gone */ - char del1 = dict_del(&e->s1->scheduled_crossings, (void*)(ptroff_t)e->s2->nr); - char del2 = dict_del(&e->s2->scheduled_crossings, (void*)(ptroff_t)e->s1->nr); - assert(del1 && del2); -#endif -#ifdef CHECKS - point_t pair; - pair.x = e->s1->nr; - pair.y = e->s2->nr; -#ifndef DONT_REMEMBER_CROSSINGS - assert(dict_contains(status->seen_crossings, &pair)); - dict_del(status->seen_crossings, &pair); -#endif -#endif - } - } - } -} - -#ifdef CHECKS -static void check_status(status_t*status) -{ - DICT_ITERATE_KEY(status->intersecting_segs, segment_t*, s) { - if((s->pos.x != s->b.x || - s->pos.y != s->b.y) && - !dict_contains(status->segs_with_point, s)) { - fprintf(stderr, "Error: segment [%d] (%sslope) intersects in scanline %d, but it didn't receive a point\n", - SEGNR(s), - s->delta.x<0?"-":"+", - status->y); - assert(0); - } - } -} -#endif - -gfxpoly_t* gfxpoly_process(gfxpoly_t*poly1, gfxpoly_t*poly2, windrule_t*windrule, windcontext_t*context) -{ - current_polygon = poly1; - - status_t status; - memset(&status, 0, sizeof(status_t)); - status.gridsize = poly1->gridsize; - - queue_init(&status.queue); - gfxpoly_enqueue(poly1, &status.queue, 0, /*polygon nr*/0); - if(poly2) { - assert(poly1->gridsize == poly2->gridsize); - gfxpoly_enqueue(poly2, &status.queue, 0, /*polygon nr*/1); - } - - status.windrule = windrule; - status.context = context; - status.actlist = actlist_new(); - -#ifdef CHECKS - status.seen_crossings = dict_new2(&point_type); - int32_t lasty=-0x80000000; -#endif - - status.xrow = xrow_new(); - - event_t*e = queue_get(&status.queue); - while(e) { - assert(e->s1->fs); - status.y = e->p.y; -#ifdef CHECKS - assert(status.y>=lasty); - lasty = status.y; - status.intersecting_segs = dict_new2(&ptr_type); - status.segs_with_point = dict_new2(&ptr_type); -#endif - -#ifdef DEBUG - fprintf(stderr, "----------------------------------- %.2f\n", status.y * status.gridsize); - actlist_dump(status.actlist, status.y-1, status.gridsize); -#endif -#ifdef CHECKS - actlist_verify(status.actlist, status.y-1); -#endif - xrow_reset(status.xrow); - horiz_reset(&status.horiz); - - do { - xrow_add(status.xrow, e->p.x); - event_apply(&status, e); - event_free(e); - e = queue_get(&status.queue); - } while(e && status.y == e->p.y); - - xrow_sort(status.xrow); - segrange_t range; - memset(&range, 0, sizeof(range)); -#ifdef DEBUG - actlist_dump(status.actlist, status.y, status.gridsize); - xrow_dump(status.xrow, status.gridsize); -#endif - add_points_to_positively_sloped_segments(&status, status.y, &range); - add_points_to_negatively_sloped_segments(&status, status.y, &range); - add_points_to_ending_segments(&status, status.y); - - recalculate_windings(&status, &range); - - actlist_verify(status.actlist, status.y); - process_horizontals(&status); -#ifdef CHECKS - check_status(&status); - dict_destroy(status.intersecting_segs); - dict_destroy(status.segs_with_point); -#endif - } -#ifdef CHECKS - dict_destroy(status.seen_crossings); -#endif - actlist_destroy(status.actlist); - queue_destroy(&status.queue); - horiz_destroy(&status.horiz); - xrow_destroy(status.xrow); - - gfxpoly_t*p = (gfxpoly_t*)malloc(sizeof(gfxpoly_t)); - p->gridsize = poly1->gridsize; - p->strokes = status.strokes; - -#ifdef CHECKS - /* we only add segments with non-empty edgestyles to strokes in - recalculate_windings, but better safe than sorry */ - gfxpolystroke_t*stroke = p->strokes; - while(stroke) { - assert(stroke->fs); - stroke = stroke->next; - } -#endif - return p; -} - -static windcontext_t twopolygons = {2}; -gfxpoly_t* gfxpoly_intersect(gfxpoly_t*p1, gfxpoly_t*p2) -{ - return gfxpoly_process(p1, p2, &windrule_intersect, &twopolygons); -} -gfxpoly_t* gfxpoly_union(gfxpoly_t*p1, gfxpoly_t*p2) -{ - return gfxpoly_process(p1, p2, &windrule_union, &twopolygons); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.h deleted file mode 100644 index 0017f8e8b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/poly.h +++ /dev/null @@ -1,114 +0,0 @@ -#ifndef __poly_h__ -#define __poly_h__ - -#include -#include "../q.h" -#include "../types.h" -#include "wind.h" - -/* features */ -#define SPLAY -#define DONT_REMEMBER_CROSSINGS - -typedef enum {EVENT_CROSS, EVENT_END, EVENT_START, EVENT_HORIZONTAL} eventtype_t; -typedef enum {SLOPE_POSITIVE, SLOPE_NEGATIVE} slope_t; - -#define INVALID_COORD (0x7fffffff) -typedef struct _point { - int32_t x; - int32_t y; -} point_t; -type_t point_type; - -#define SEGNR(s) ((int)((s)?(s)->nr:-1)) - -typedef struct _gfxpolystroke { - segment_dir_t dir; - edgestyle_t*fs; - int points_size; - int num_points; - point_t*points; - struct _gfxpolystroke*next; -} gfxpolystroke_t; -typedef struct _gfxpoly { - double gridsize; - gfxpolystroke_t*strokes; -} gfxpoly_t; - -typedef struct _segment { - point_t a; - point_t b; - point_t delta; - double k; //k = a.x*b.y-a.y*b.x = delta.y*a.x - delta.x*a.y (=0 for points on the segment) - int32_t minx, maxx; - - segment_dir_t dir; - edgestyle_t*fs; - edgestyle_t*fs_out; -#ifdef CHECKS - char fs_out_ok; -#endif - - int polygon_nr; - windstate_t wind; - ptroff_t nr; - -#ifdef SPLAY - struct _segment*parent; - struct _segment*leftchild; - struct _segment*rightchild; -#endif - struct _segment*left; - struct _segment*right; - char changed; - - point_t pos; - - gfxpolystroke_t*stroke; - int stroke_pos; - -#ifndef DONT_REMEMBER_CROSSINGS - dict_t scheduled_crossings; -#endif -} segment_t; - -#define LINE_EQ(p,s) ((double)(s)->delta.y*(p).x - (double)(s)->delta.x*(p).y - (s)->k) - -/* x1 + ((x2-x1)*(y-y1)) / dy = - (x1*(y2-y1) + (x2-x1)*(y-y1)) / dy = - (x1*(y2-y) + x2 *(y-y1)) / dy = - (x1*y2 - x2*y1 + x2*y - y*x1) / dy = - (k + x2*y - x1*y) / dy - (k + dx*y) / dy -*/ -//#define XPOS(s,ypos) ((s)->a.x + ((s)->delta.x * (double)((ypos) - (s)->a.y)) / (s)->delta.y) -#define XPOS(s,ypos) (((s)->k + (double)(s)->delta.x*ypos) / (s)->delta.y) - -#define XPOS_INT(s,ypos) ((int)ceil(XPOS((s),ypos))) -#define XDIFF(s1,s2,ypos) (((s1)->k + (double)(s1)->delta.x*ypos)*(s2)->delta.y - \ - ((s2)->k + (double)(s2)->delta.x*ypos)*(s1)->delta.y) - -void gfxpoly_fail(char*expr, char*file, int line, const char*function); - -char gfxpoly_check(gfxpoly_t*poly, char updown); -int gfxpoly_num_segments(gfxpoly_t*poly); -int gfxpoly_size(gfxpoly_t*poly); -void gfxpoly_dump(gfxpoly_t*poly); -void gfxpoly_save(gfxpoly_t*poly, const char*filename); -void gfxpoly_save_arrows(gfxpoly_t*poly, const char*filename); -gfxpoly_t* gfxpoly_process(gfxpoly_t*poly1, gfxpoly_t*poly2, windrule_t*windrule, windcontext_t*context); - -gfxpoly_t* gfxpoly_intersect(gfxpoly_t*p1, gfxpoly_t*p2); -gfxpoly_t* gfxpoly_union(gfxpoly_t*p1, gfxpoly_t*p2); - -#ifndef CHECKS -#ifdef assert -#undef assert -#endif -#define assert(x) -#else -#define assert(x) ((x)?0:gfxpoly_fail(__STRING(x), __FILE__, __LINE__, __PRETTY_FUNCTION__)) -#endif - - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.c deleted file mode 100644 index 0edf5b1e4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.c +++ /dev/null @@ -1,400 +0,0 @@ -#include -#include -#include -#include "renderpoly.h" - -typedef struct _renderpoint -{ - double x; - segment_dir_t dir; - edgestyle_t*fs; - int polygon_nr; -} renderpoint_t; - -typedef struct _renderline -{ - renderpoint_t*points; - int size; - int num; -} renderline_t; - -typedef struct _renderbuf -{ - intbbox_t bbox; - int width; - int height; - double zoom; - renderline_t*lines; -} renderbuf_t; - -static inline void add_pixel(renderbuf_t*buf, double x, int y, segment_dir_t dir, edgestyle_t*fs, int polygon_nr) -{ - renderpoint_t p; - p.x = x; - p.dir = dir; - p.fs = fs; - p.polygon_nr = polygon_nr; - - if(y >= buf->bbox.ymax || y < buf->bbox.ymin) - return; - - renderline_t*l = &buf->lines[y-buf->bbox.ymin]; - - if(l->num == l->size) { - l->size += 32; - l->points = (renderpoint_t*)rfx_realloc(l->points, l->size * sizeof(renderpoint_t)); - } - l->points[l->num] = p; - l->num++; -} -#define CUT 0.5 -static void add_line(renderbuf_t*buf, double x1, double y1, double x2, double y2, edgestyle_t*fs, segment_dir_t dir, int polygon_nr) -{ - x1 *= buf->zoom; - y1 *= buf->zoom; - x2 *= buf->zoom; - y2 *= buf->zoom; - double diffx, diffy; - double ny1, ny2, stepx; - - if(y2 < y1) { - dir ^= DIR_UP^DIR_DOWN; - double x,y; - x = x1;x1 = x2;x2=x; - y = y1;y1 = y2;y2=y; - } - - diffx = x2 - x1; - diffy = y2 - y1; - ny1 = floor(y1)+CUT; - ny2 = floor(y2)+CUT; - - if(ny1 < y1) { - ny1 = floor(y1) + 1.0 + CUT; - } - if(ny2 >= y2) { - ny2 = floor(y2) - 1.0 + CUT; - } - if(ny1 > ny2) - return; - - stepx = diffx/diffy; - x1 = x1 + (ny1-y1)*stepx; - x2 = x2 + (ny2-y2)*stepx; - - int posy=floor(ny1); - int endy=floor(ny2); - double posx=0; - double startx = x1; - - //printf("line %d from %f to %f dir=%s\n", polygon_nr, y1, y2, dir==DIR_UP?"up":"down"); - - while(posy<=endy) { - double xx = startx + posx; - add_pixel(buf, xx, posy, dir, fs, polygon_nr); - posx+=stepx; - posy++; - } -} - -static int compare_renderpoints(const void * _a, const void * _b) -{ - renderpoint_t*a = (renderpoint_t*)_a; - renderpoint_t*b = (renderpoint_t*)_b; - if(a->x < b->x) return -1; - if(a->x > b->x) return 1; - return 0; -} - -static void fill_bitwise(unsigned char*line, int x1, int x2) -{ - int p1 = x1>>3; - int p2 = x2>>3; - int b1 = 0xff >> (x1&7); - int b2 = 0xff << (1+7-(x2&7)); - if(p1==p2) { - line[p1] |= b1&b2; - } else { - line[p1] |= b1; - memset(&line[p1+1], 255, p2-(p1+1)); - line[p2] = b2; - } -} - -unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, windrule_t*rule, windcontext_t*context) -{ - renderbuf_t _buf, *buf=&_buf; - buf->width = (bbox->xmax - bbox->xmin); - buf->height = (bbox->ymax - bbox->ymin); - buf->bbox = *bbox; - buf->zoom = zoom * polygon->gridsize; - int width8 = (buf->width+7) >> 3; - char bleeding = 0; - unsigned char* image = (unsigned char*)malloc(width8*buf->height); - memset(image, 0, width8*buf->height); - - buf->lines = (renderline_t*)rfx_alloc(buf->height*sizeof(renderline_t)); - int y; - for(y=0;yheight;y++) { - memset(&buf->lines[y], 0, sizeof(renderline_t)); - buf->lines[y].points = 0; - buf->lines[y].num = 0; - } - - int polygon_nr = 0; - int s,t; - gfxpolystroke_t*stroke = polygon->strokes; - for(;stroke;stroke=stroke->next) { - for(t=0;tnum_points-1;t++) { - point_t a = stroke->points[t]; - point_t b = stroke->points[t+1]; - add_line(buf, a.x, a.y, b.x, b.y, stroke->fs, stroke->dir, polygon_nr); - } - } - - for(y=0;yheight;y++) { - renderpoint_t*points = buf->lines[y].points; - unsigned char*line = &image[width8*y]; - int n; - int num = buf->lines[y].num; - qsort(points, num, sizeof(renderpoint_t), compare_renderpoints); - int lastx = 0; - - windstate_t fill = rule->start(context); - for(n=0;nx - bbox->xmin); - - if(x < lastx) - x = lastx; - if(x > buf->width) - x = buf->width; - - if(fill.is_filled && lastxadd(context, fill, p->fs, p->dir, p->polygon_nr); - lastx = x; - } - if(fill.is_filled && lastx!=buf->width) { - /* we're bleeding, fill over padding, too. */ - fprintf(stderr, "Polygon %p is bleeding in line %d\n", polygon, y); - fill_bitwise(line, lastx, width8*8); - assert(line[width8-1]&0x01); - bleeding = 1; - exit(1); - - } - } - - for(y=0;yheight;y++) { - if(buf->lines[y].points) { - free(buf->lines[y].points); - } - memset(&buf->lines[y], 0, sizeof(renderline_t)); - } - if(bleeding) { - assert(!bitmap_ok(bbox, image)); - } - free(buf->lines);buf->lines=0; - return image; -} - -#define MAX_WIDTH 8192 -#define MAX_HEIGHT 4096 - -static inline double max(double a, double b) {return a>b?a:b;} -static inline double min(double a, double b) {return agridsize; - - if(polygon->strokes && polygon->strokes->num_points) { - b.xmin = polygon->strokes->points[0].x*g; - b.ymin = polygon->strokes->points[0].y*g; - b.xmax = polygon->strokes->points[0].x*g; - b.ymax = polygon->strokes->points[0].y*g; - } - int s,t; - gfxpolystroke_t*stroke = polygon->strokes; - for(;stroke;stroke=stroke->next) { - for(t=0;tnum_points;t++) { - point_t p = stroke->points[t]; - int x1 = floor(p.x); - int y1 = floor(p.y); - int x2 = ceil(p.x); - int y2 = ceil(p.y); - if(x1 < b.xmin) b.xmin = x1; - if(y1 < b.ymin) b.ymin = y1; - if(x2 > b.xmax) b.xmax = x2; - if(y2 > b.ymax) b.ymax = y2; - } - } - - if(b.xmax > (int)(MAX_WIDTH*zoom)) - b.xmax = (int)(MAX_WIDTH*zoom); - if(b.ymax > (int)(MAX_HEIGHT*zoom)) - b.ymax = (int)(MAX_HEIGHT*zoom); - if(b.xmin < -(int)(MAX_WIDTH*zoom)) - b.xmin = -(int)(MAX_WIDTH*zoom); - if(b.ymin < -(int)(MAX_HEIGHT*zoom)) - b.ymin = -(int)(MAX_HEIGHT*zoom); - - if(b.xmin > b.xmax) - b.xmin = b.xmax; - if(b.ymin > b.ymax) - b.ymin = b.ymax; - - b.xmax = adjust_x(b.xmin, b.xmax); - - b.width = b.xmax - b.xmin; - b.height = b.ymax - b.ymin; - return b; -} - -#define B11111000 0xf8 -#define B01111100 0x7c -#define B00111110 0x3e -#define B00011111 0x1f -#define B11100000 0xe0 -#define B01110000 0x70 -#define B00111000 0x38 -#define B00011100 0x1c -#define B00001110 0x0e -#define B00000111 0x07 -#define B10000000 0x80 -#define B01000000 0x40 -#define B00100000 0x20 -#define B00010000 0x10 -#define B00001000 0x08 -#define B00000100 0x04 -#define B00000010 0x02 -#define B00000001 0x01 - -int bitmap_ok(intbbox_t*bbox, unsigned char*data) -{ - int y; - int width8 = (bbox->width+7) >> 3; - for(y=0;yheight;y++) { - if(data[width8-1]&0x01) - return 0; //bleeding - data += width8; - } - return 1; -} - -int compare_bitmaps(intbbox_t*bbox, unsigned char*data1, unsigned char*data2) -{ - if(!data1 || !data2) - return 0; - int x,y; - int height = bbox->height; - int width = bbox->width; - int width8 = (width+7) >> 3; - unsigned char*l1 = &data1[width8*2]; - unsigned char*l2 = &data2[width8*2]; - for(y=2;ywidth+7) >> 3; - unsigned char*data = malloc(b->width*b->height*4*4); - unsigned char*p = data; - int x,y; - unsigned char*b1 = data1; - unsigned char*b2 = data2; - compare_bitmaps(b, data1, data2); -//# define MARK ((abs(x-badx)<3 && abs(y-bady)<3)*255) -#define MARK 0 - for(y=0;yheight;y++) { - for(x=0;xwidth;x++) { - unsigned char c1 = (b1[x>>3]&(0x80>>(x&7)))?255:0; - unsigned char c2 = (b2[x>>3]&(0x80>>(x&7)))?255:0; - *p++ = 255; - *p++ = c1^c2; - *p++ = c1^c2; - *p++ = MARK; - } - for(x=0;xwidth;x++) { - unsigned char c = (b2[x>>3]&(0x80>>(x&7)))?255:0; - *p++ = 255; - *p++ = c; - *p++ = c; - *p++ = MARK; - } - b1 += width8; - b2 += width8; - } - b1 = data1; - for(y=0;yheight;y++) { - for(x=0;xwidth;x++) { - unsigned char c = (b1[x>>3]&(0x80>>(x&7)))?255:0; - *p++ = 255; - *p++ = c; - *p++ = c; - *p++ = MARK; - } - for(x=0;xwidth;x++) { - *p++ = 255; - *p++ = 0; - *p++ = 0; - *p++ = 0; - } - b1 += width8; - } - png_write(filename, data, b->width*2, b->height*2); - free(data); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.h deleted file mode 100644 index 1c8d183e1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/renderpoly.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef __renderpoly_h__ -#define __renderpoly_h__ - -#include "poly.h" -#include "wind.h" - -typedef struct { - int xmin; - int ymin; - int xmax; - int ymax; - int width; - int height; -} intbbox_t; - -unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, windrule_t*rule, windcontext_t*context); - -intbbox_t intbbox_new(int x1, int y1, int x2, int y2); -intbbox_t intbbox_from_polygon(gfxpoly_t*polygon, double zoom); - -int bitmap_ok(intbbox_t*bbox, unsigned char*data); -int compare_bitmaps(intbbox_t*bbox, unsigned char*data1, unsigned char*data2); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.c deleted file mode 100644 index b9ccb1073..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.c +++ /dev/null @@ -1,233 +0,0 @@ -#include -#include -#include -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "poly.h" -#include "wind.h" -#include "convert.h" - -/* notice: left/right for a coordinate system where y goes up, not down */ -typedef enum {LEFT=0, RIGHT=1} leftright_t; - -/* factor that determines into how many line fragments a spline is converted */ -#define SUBFRACTION (2.4) - -// spline equation: -// s(t) = t*t*x2 + 2*t*(1-t)*cx + (1-t)*(1-t)*x1 -// -// s(0.5) = 0.25*x2 + 0.5*cx + 0.25*x1 -// ds(t)/dt = 2*t*x2 + (2-2t)*cx + (2t-2)*x1 -// ds(0) = 2*(cx-x1) - -static void draw_arc(gfxdrawer_t*draw, double x, double y, double a1, double a2, double r) -{ - if(a2lineTo(draw, x+cos(a1)*r,y+sin(a1)*r); - for(t=1;t<=steps;t++) { - double a = a1 + t*step; - double c = cos(a)*r; - double s = sin(a)*r; - double xx = c + x; - double yy = s + y; - double dx = x + cos(a-step/2)*r2; - double dy = y + sin(a-step/2)*r2; - draw->splineTo(draw, dx, dy, xx, yy); - lastx = xx; - lasty = yy; - } -} - -static void draw_single_stroke(gfxpoint_t*p, int num, gfxdrawer_t*draw, double width, gfx_capType cap, gfx_joinType join, double limit) -{ - width/=2; - if(width<=0) - width = 0.05; - - /* remove duplicate points */ - int s=1,t; - gfxpoint_t last = p[0]; - for(t=1;t2 && p[0].x == p[num-1].x && p[0].y == p[num-1].y); - - int start = 0; - int end = num-1; - int incr = 1; - int pos = 0; - - double lastw=0; - /* iterate through the points two times: first forward, then backward, - adding a stroke outline to the right side and line caps after each - pass */ - int pass; - for(pass=0;pass<2;pass++) { - if(closed) { - double dx = p[end].x - p[end-incr].x; - double dy = p[end].y - p[end-incr].y; - lastw = atan2(dy,dx); - if(lastw<0) lastw+=M_PI*2; - } - - int pos; - for(pos=start;pos!=end;pos+=incr) { - //printf("%d) %.2f %.2f\n", pos, p[pos].x, p[pos].y); - double dx = p[pos+incr].x - p[pos].x; - double dy = p[pos+incr].y - p[pos].y; - double w = atan2(dy,dx); - if(w<0) w+=M_PI*2; - - if(closed || pos!=start) { - double d = w-lastw; - leftright_t turn; - if(d>=0 && d-M_PI) turn=RIGHT; - else if(d>=M_PI) {turn=RIGHT;} - else if(d<=-M_PI) {turn=LEFT;d+=M_PI*2;} - else {assert(0);} - if(turn!=LEFT || join==gfx_joinBevel) { - // nothing to do. bevel joins are easy - } else if(join==gfx_joinRound) { - draw_arc(draw, p[pos].x, p[pos].y, lastw-M_PI/2, w-M_PI/2, width); - } else if(join==gfx_joinMiter) { - double xw = M_PI/2 - d/2; - if(xw>0) { - double r2 = 1.0 / sin(M_PI/2-d/2); - if(r2 < limit) { - r2 *= width; - double addx = cos(lastw-M_PI/2+d/2)*r2; - double addy = sin(lastw-M_PI/2+d/2)*r2; - draw->lineTo(draw, p[pos].x+addx, p[pos].y+addy); - } - } - } - } - - double addx = cos(w-M_PI/2)*width; - double addy = sin(w-M_PI/2)*width; - draw->lineTo(draw, p[pos].x+addx, p[pos].y+addy); - double px2 = p[pos+incr].x + addx; - double py2 = p[pos+incr].y + addy; - draw->lineTo(draw, p[pos+incr].x+addx, p[pos+incr].y+addy); - lastw = w; - } - - if(closed) { - draw->close(draw); - } else { - /* draw stroke ends. We draw duplicates of some points here. The drawer - implementation should be smart enough to remove them. */ - double c = cos(lastw-M_PI/2)*width; - double s = sin(lastw-M_PI/2)*width; - if(cap == gfx_capButt) { - draw->lineTo(draw, p[pos].x+c, p[pos].y+s); - draw->lineTo(draw, p[pos].x-c, p[pos].y-s); - } else if(cap == gfx_capRound) { - draw_arc(draw, p[pos].x, p[pos].y, lastw-M_PI/2, lastw+M_PI/2, width); - } else if(cap == gfx_capSquare) { - double c = cos(lastw-M_PI/2)*width; - double s = sin(lastw-M_PI/2)*width; - draw->lineTo(draw, p[pos].x+c, p[pos].y+s); - draw->lineTo(draw, p[pos].x+c-s, p[pos].y+s+c); - draw->lineTo(draw, p[pos].x-c-s, p[pos].y-s+c); - draw->lineTo(draw, p[pos].x-c, p[pos].y-s); - } - lastw += M_PI; // for dots - } - start=num-1; - end=0; - incr=-1; - } - if(!closed) - draw->close(draw); -} - -void draw_stroke(gfxline_t*start, gfxdrawer_t*draw, double width, gfx_capType cap, gfx_joinType join, double miterLimit) -{ - if(!start) - return; - assert(start->type == gfx_moveTo); - gfxline_t*line = start; - // measure array size - int size = 0; - int pos = 0; - double lastx,lasty; - while(line) { - if(line->type == gfx_moveTo) { - if(pos>size) size = pos; - pos++; - } else if(line->type == gfx_lineTo) { - pos++; - } else if(line->type == gfx_splineTo) { - int parts = (int)(sqrt(fabs(line->x-2*line->sx+lastx) + fabs(line->y-2*line->sy+lasty))*SUBFRACTION); - if(!parts) parts = 1; - pos+=parts+1; - } - lastx = line->x; - lasty = line->y; - line = line->next; - } - if(pos>size) size = pos; - if(!size) return; - - gfxpoint_t* points = malloc(sizeof(gfxpoint_t)*size); - line = start; - pos = 0; - while(line) { - if(line->type == gfx_moveTo) { - if(pos) - draw_single_stroke(points, pos, draw, width, cap, join, miterLimit); - pos = 0; - } else if(line->type == gfx_splineTo) { - int parts = (int)(sqrt(fabs(line->x-2*line->sx+lastx) + fabs(line->y-2*line->sy+lasty))*SUBFRACTION); - if(!parts) parts = 1; - double stepsize = 1.0/parts; - int i; - for(i=0;ix*t*t + 2*line->sx*t*(1-t) + lastx*(1-t)*(1-t)); - points[pos].y = (line->y*t*t + 2*line->sy*t*(1-t) + lasty*(1-t)*(1-t)); - pos++; - } - } - lastx = points[pos].x = line->x; - lasty = points[pos].y = line->y; - pos++; - line = line->next; - } - if(pos) draw_single_stroke(points, pos, draw, width, cap, join, miterLimit); - free(points); -} - -static windcontext_t onepolygon = {1}; -gfxpoly_t* gfxpoly_from_stroke(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, double gridsize) -{ - gfxdrawer_t d; - gfxdrawer_target_poly(&d, gridsize); - draw_stroke(line, &d, width, cap_style, joint_style, miterLimit); - gfxpoly_t*poly = (gfxpoly_t*)d.result(&d); - assert(gfxpoly_check(poly, 1)); - gfxpoly_t*poly2 = gfxpoly_process(poly, 0, &windrule_circular, &onepolygon); - gfxpoly_destroy(poly); - return poly2; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.h deleted file mode 100644 index 4b52d5270..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/stroke.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __stroke_h__ -#define __stroke_h__ -#include "../gfxdevice.h" -#include "poly.h" -gfxpoly_t* gfxpoly_from_stroke(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit, double gridsize); -void draw_stroke(gfxline_t*start, gfxdrawer_t*draw, double width, gfx_capType cap, gfx_joinType join, double miterLimit); -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.c deleted file mode 100644 index 30a21fd24..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.c +++ /dev/null @@ -1,138 +0,0 @@ -#include "poly.h" - -edgestyle_t edgestyle_default; - -windstate_t windstate_nonfilled = { - is_filled: 0, - wind_nr: 0, -}; - -// -------------------- even/odd ---------------------- - -windstate_t evenodd_start(windcontext_t*context) -{ - return windstate_nonfilled; -} -windstate_t evenodd_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) -{ - assert(edge); - left.is_filled ^= 1; - return left; -} -edgestyle_t* evenodd_diff(windstate_t*left, windstate_t*right) -{ - if(left->is_filled==right->is_filled) - return 0; - else - return &edgestyle_default; -} - -windrule_t windrule_evenodd = { - start: evenodd_start, - add: evenodd_add, - diff: evenodd_diff, -}; - -// -------------------- circular ---------------------- - -windstate_t circular_start(windcontext_t*context) -{ - return windstate_nonfilled; -} - -windstate_t circular_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) -{ - assert(edge); - /* which one is + and which one - doesn't actually make any difference */ - if(dir == DIR_DOWN) - left.wind_nr++; - else - left.wind_nr--; - - left.is_filled = left.wind_nr != 0; - return left; -} - -edgestyle_t* circular_diff(windstate_t*left, windstate_t*right) -{ - if(left->is_filled==right->is_filled) - return 0; - else - return &edgestyle_default; -} - -windrule_t windrule_circular = { - start: circular_start, - add: circular_add, - diff: circular_diff, -}; - -// -------------------- intersect ---------------------- - -windstate_t intersect_start(windcontext_t*context) -{ - return windstate_nonfilled; -} - -windstate_t intersect_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) -{ - assert(master < context->num_polygons); - - left.wind_nr ^= 1<num_polygons)-1); - return left; -} - -edgestyle_t* intersect_diff(windstate_t*left, windstate_t*right) -{ - if(left->is_filled==right->is_filled) - return 0; - else - return &edgestyle_default; -} - -windrule_t windrule_intersect = { - start: intersect_start, - add: intersect_add, - diff: intersect_diff, -}; - -// -------------------- union ---------------------- - -windstate_t union_start(windcontext_t*context) -{ - return windstate_nonfilled; -} - -windstate_t union_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) -{ - assert(masteris_filled==right->is_filled) - return 0; - else - return &edgestyle_default; -} - -windrule_t windrule_union = { - start: union_start, - add: union_add, - diff: union_diff, -}; - - -/* - } else if (rule == WIND_NONZERO) { - fill = wind!=0; - } else if (rule == WIND_ODDEVEN) { - fill = wind&1; - } else { // rule == WIND_POSITIVE - fill = wind>=1; - } - */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.h deleted file mode 100644 index a07ed6424..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/wind.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef __wind_h__ -#define __wind_h__ - -/* Every segment has an original direction, which is the direction - the segment had in the input data. - as our scanline moves from minimum y to maximum y, "DOWN" means - the the (original) segment's y2 is larger than its y1 */ -typedef enum {DIR_UP, DIR_DOWN, DIR_UNKNOWN} segment_dir_t; - -#define DIR_INVERT(d) ((d)^(DIR_UP^DIR_DOWN)) - -typedef struct _edgestyle { - void*internal; -} edgestyle_t; - -extern edgestyle_t edgestyle_default; - -typedef struct _windstate -{ - char is_filled; - int wind_nr; -} windstate_t; - -typedef struct _windcontext -{ - int num_polygons; -} windcontext_t; - -typedef struct _windrule -{ - windstate_t (*start)(windcontext_t* num_polygons); - windstate_t (*add)(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int polygon_nr); - edgestyle_t* (*diff)(windstate_t*left, windstate_t*right); -} windrule_t; - -extern windrule_t windrule_evenodd; -extern windrule_t windrule_circular; -extern windrule_t windrule_intersect; -extern windrule_t windrule_union; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.c deleted file mode 100644 index 7987ac15a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.c +++ /dev/null @@ -1,101 +0,0 @@ -#include -#include -#include -#include "../mem.h" -#include "xrow.h" -#include "poly.h" - -xrow_t* xrow_new() -{ - xrow_t*r = rfx_calloc(sizeof(xrow_t)); - r->size = 16; - r->x = rfx_alloc(sizeof(r->x[0])*r->size); - return r; -} - -void xrow_add(xrow_t*r, int32_t x) -{ - if(r->num && r->lastx==x) - return; - r->lastx = x; - if(r->num >= r->size) { - r->size *= 2; - r->x = rfx_realloc(r->x, sizeof(r->x[0])*r->size); - } - r->x[r->num++]=x; -} - -int compare_int32(const void*_i1,const void*_i2) -{ - int32_t*i1 = (int32_t*)_i1; - int32_t*i2 = (int32_t*)_i2; - return *i1-*i2; -} - -void xrow_sort(xrow_t*r) -{ - if(!r->num) - return; - qsort(r->x, r->num, sizeof(r->x[0]), compare_int32); - int t; - int pos = 1; - int32_t lastx=r->x[0]; - for(t=1;tnum;t++) { - if(r->x[t]!=lastx) { - r->x[pos++] = lastx = r->x[t]; - } - } - r->num = pos; -} - -int xrow_find(xrow_t*r, int32_t x) -{ - int min, max, i, l; - - for(min=0, max=r->num, i=r->num/2, l=r->num; i != l; l=i, i=(min+max)/2) { - if(x < r->x[i]) max=i; - else min=i; - } - -#ifdef CHECKS - int t; - for(t=0;tnum;t++) { - if(x < r->x[t]) - break; - } - assert(max == t); -#endif - - return max; -} - -char xrow_contains(xrow_t*r, int32_t x) -{ - int pos = xrow_find(r,x) - 1; - return (pos>=0 && r->x[pos]==x); -} - -void xrow_reset(xrow_t*r) -{ - r->num = 0; -} - -void xrow_dump(xrow_t*xrow, double gridsize) -{ - fprintf(stderr, "x: "); - int t; - for(t=0;tnum;t++) { - if(t) - fprintf(stderr, ", "); - fprintf(stderr, "%.2f", xrow->x[t] * gridsize); - } - fprintf(stderr, "\n"); -} - -void xrow_destroy(xrow_t*r) -{ - if(r->x) { - free(r->x);r->x = 0; - } - free(r); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.h deleted file mode 100644 index 5de10d4c4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxpoly/xrow.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __xrow_h__ -#define __xrow_h__ - -#include - -#include "poly.h" - -typedef struct _xrow { - int32_t*x; - int num; - int size; - int32_t lastx; -} xrow_t; - -xrow_t* xrow_new(); - -void xrow_add(xrow_t*xrow, int32_t x); -void xrow_sort(xrow_t*xrow); -int xrow_find(xrow_t*r, int32_t x); -char xrow_contains(xrow_t*xrow, int32_t x); -void xrow_dump(xrow_t*xrow, double gridsize); -void xrow_reset(xrow_t*xrow); -void xrow_destroy(xrow_t*xrow); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxsource.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxsource.h deleted file mode 100644 index 845eca790..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxsource.h +++ /dev/null @@ -1,71 +0,0 @@ -/* pdfswf.h - Header file for pdfswf.cc. - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxsource_h__ -#define __gfxsource_h__ - -#include "gfxdevice.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct _gfxdocument; -struct _gfxpage; - -typedef struct _gfxsource -{ - void (*setparameter)(struct _gfxsource*src, const char*name, const char*value); - struct _gfxdocument* (*open)(struct _gfxsource*src, const char*filename); - void (*destroy)(struct _gfxsource*src); - void*internal; -} gfxsource_t; - -typedef struct _gfxdocument -{ - gfxsource_t*driver; - int num_pages; - void* (*get)(struct _gfxdocument*gfx, const char*name); - void (*destroy)(struct _gfxdocument*gfx); - void (*setparameter)(struct _gfxdocument*gfx, const char*name, const char*value); - char* (*getinfo)(struct _gfxdocument*gfx, const char*key); - struct _gfxpage* (*getpage)(struct _gfxdocument*gfx, int page); - void (*prepare)(struct _gfxdocument*gfx, gfxdevice_t*device); - void*internal; -} gfxdocument_t; - -typedef struct _gfxpage -{ - gfxdocument_t*parent; - gfxcoord_t width; - gfxcoord_t height; - int nr; - void (*render)(struct _gfxpage*gfx, gfxdevice_t*output); - void (*rendersection)(struct _gfxpage*gfx, gfxdevice_t*output, gfxcoord_t x, gfxcoord_t y, gfxcoord_t x1, gfxcoord_t y1, gfxcoord_t x2, gfxcoord_t y2); - void (*destroy)(struct _gfxpage*page); - void*internal; -} gfxpage_t; - -#ifdef __cplusplus -} -#endif - -#endif //__gfxsource_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.c b/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.c deleted file mode 100644 index 0f39da7cd..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.c +++ /dev/null @@ -1,1274 +0,0 @@ -/* gfxtools.c - - Various utility functions for dealing with gfxdevices. - - Part of the swftools package. - - Copyright (c) 2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include -#include -#include "gfxtools.h" -#include "gfxfont.h" -#include "jpeg.h" -#include "q.h" - -typedef struct _linedraw_internal -{ - gfxline_t*start; - gfxline_t*next; - gfxcoord_t x0,y0; - char has_moveto; -} linedraw_internal_t; - -static void linedraw_moveTo(gfxdrawer_t*d, gfxcoord_t x, gfxcoord_t y) -{ - linedraw_internal_t*i = (linedraw_internal_t*)d->internal; - gfxline_t*l = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)); - l->type = gfx_moveTo; - i->has_moveto = 1; - i->x0 = x; - i->y0 = y; - l->sx = l->sy = 0; - d->x = l->x = x; - d->y = l->y = y; - l->next = 0; - if(i->next) - i->next->next = l; - i->next = l; - if(!i->start) - i->start = l; -} -static void linedraw_lineTo(gfxdrawer_t*d, gfxcoord_t x, gfxcoord_t y) -{ - linedraw_internal_t*i = (linedraw_internal_t*)d->internal; - if(!i->has_moveto) { - /* starts with a line, not with a moveto. As this is the first - entry in the list, this is probably *meant* to be a moveto */ - linedraw_moveTo(d, x, y); - return; - } - - gfxline_t*l = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)); - l->type = gfx_lineTo; - d->x = l->x = x; - d->y = l->y = y; - - l->next = 0; - if(i->next) - i->next->next = l; - i->next = l; - if(!i->start) - i->start = l; -} -static void linedraw_splineTo(gfxdrawer_t*d, gfxcoord_t sx, gfxcoord_t sy, gfxcoord_t x, gfxcoord_t y) -{ - linedraw_internal_t*i = (linedraw_internal_t*)d->internal; - if(!i->has_moveto) { - linedraw_moveTo(d, x, y); - return; - } - - gfxline_t*l = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)); - l->type = gfx_splineTo; - d->x = l->x = x; - d->y = l->y = y; - l->sx = sx; - l->sy = sy; - l->next = 0; - if(i->next) - i->next->next = l; - i->next = l; - if(!i->start) - i->start = l; -} -static void linedraw_close(gfxdrawer_t*d) -{ - linedraw_internal_t*i = (linedraw_internal_t*)d->internal; - if(!i->has_moveto) - return; - linedraw_lineTo(d, i->x0, i->y0); - i->has_moveto = 0; - i->x0 = 0; - i->y0 = 0; -} -static void* linedraw_result(gfxdrawer_t*d) -{ - linedraw_internal_t*i = (linedraw_internal_t*)d->internal; - void*result = (void*)i->start; - rfx_free(i); - memset(d, 0, sizeof(gfxdrawer_t)); - return result; -} - -void gfxdrawer_target_gfxline(gfxdrawer_t*d) -{ - linedraw_internal_t*i = (linedraw_internal_t*)rfx_calloc(sizeof(linedraw_internal_t)); - d->x = 0x7fffffff; - d->y = 0x7fffffff; - d->internal = i; - d->moveTo = linedraw_moveTo; - d->lineTo = linedraw_lineTo; - d->splineTo = linedraw_splineTo; - d->close = linedraw_close; - d->result = linedraw_result; -} - -typedef struct _qspline_abc -{ - double ax,bx,cx; - double ay,by,cy; -} qspline_abc_t; - -typedef struct qspline_t -{ - gfxpoint_t start; - gfxpoint_t control; - gfxpoint_t end; -} qspline_t; - -typedef struct cspline_t -{ - gfxpoint_t start; - gfxpoint_t control1; - gfxpoint_t control2; - gfxpoint_t end; -} cspline_t; - -static void mkspline(qspline_abc_t*s, double x, double y, gfxline_t*l) -{ - /* - Form 1: x = t*t*l->x + 2*t*(1-t)*l->sx + (1-t)*(1-t)*x; - Form 2: x = a*t*t + b*t + c - */ - s->cx = x; s->bx = 2*l->sx - 2*x; s->ax = l->x - 2*l->sx + x; - s->cy = y; s->by = 2*l->sy - 2*y; s->ay = l->y - 2*l->sy + y; -} - -static void spline_get_controlpoint(qspline_abc_t*q, double t1, double t2, double*dx, double*dy) -{ - double dt = t2-t1; - double nax = q->ax*dt*dt; - double nay = q->ay*dt*dt; - double nbx = 2*q->ax*dt*t1 + q->bx*dt; - double nby = 2*q->ay*dt*t1 + q->by*dt; - double ncx = q->ax*t1*t1 + q->bx*t1 + q->cx; - double ncy = q->ay*t1*t1 + q->by*t1 + q->cy; - *dx = ncx + nbx/2; - *dy = ncy + nby/2; -} - -static double get_spline_len(qspline_abc_t*s) -{ - int parts = (int)(sqrt(fabs(s->ax) + fabs(s->ay))*3); - int i; - double len = 0; - double r; - double r2; - if(parts < 3) parts = 3; - r = 1.0/parts; - r2 = 1.0/(parts*parts); - for(i=0;iax*(2*i+1)*r2 + s->bx*r; - double dy = s->ay*(2*i+1)*r2 + s->by*r; - len += sqrt(dx*dx+dy*dy); - } - /*printf("Spline from %f,%f to %f,%f has len %f (%f)\n", s->cx, s->cy, - s->cx + s->bx + s->ax, - s->cy + s->by + s->ay, len, - sqrt((s->bx + s->ax)*(s->bx + s->ax) + (s->by + s->ay)*(s->by + s->ay)) - ); - assert(len+0.5 >= sqrt((s->bx + s->ax)*(s->bx + s->ax) + (s->by + s->ay)*(s->by + s->ay))); - */ - return len; -} - -void gfxtool_draw_dashed_line(gfxdrawer_t*d, gfxline_t*line, float*r, float phase) -{ - double x=0,y=0; - double linepos = 0,nextpos = 0; - char on = 0; - int apos=0; - - if(line && line->type != gfx_moveTo) { - fprintf(stderr, "gfxtool: outline doesn't start with a moveTo"); - return; - } - - int i; - double dashlen=0; - for(i=0;r[i]>=0;i++) { - dashlen+=r[i]; - } - if(!r || (r[0]<=0 && r[0]>-0.01) || dashlen<0.001) { - // no dashing. just draw the thing - while(line) { - if(line->type == gfx_moveTo) { - d->moveTo(d, line->x, line->y); - } else if(line->type == gfx_lineTo) { - d->lineTo(d, line->x, line->y); - } else if(line->type == gfx_splineTo) { - d->splineTo(d, line->sx, line->sy, line->x, line->y); - } - line = line->next; - } - return; - } - - if(phase < 0) { - phase = -phase; - } - - if(r[0]<0 || phase<0) { - fprintf(stderr, "gfxtool: invalid (negative) dashes: %f, phase=%f\n", r[0], phase); - return; - } - - for(;line;line=line->next) { - if(line->type == gfx_moveTo) { - d->moveTo(d, line->x, line->y); - on = 1; nextpos = r[0]; apos = 0; linepos = 0; - x = line->x; y = line->y; - while(linepos < phase) { - //printf("[+] linepos: %f, phase: %f, on:%d, apos:%d nextpos:%f\n", linepos, phase, on, apos, nextpos); - linepos += r[apos]; - if(linepos < phase) { - on ^= 1; - if(r[++apos]<0) - apos = 0; - nextpos += r[apos]; - } - } - linepos = phase; - //printf("[k] linepos: %f, phase: %f, on:%d, apos:%d nextpos:%f \n", linepos, phase, on, apos, nextpos); - } else if(line->type == gfx_lineTo) { - double dx = line->x - x; - double dy = line->y - y; - double len = sqrt(dx*dx+dy*dy); - double vx; - double vy; - double lineend = linepos+len; - if(len==0) - continue; - vx = dx/len; - vy = dy/len; - assert(nextpos>=linepos); - //printf("(line) on:%d apos: %d nextpos: %f, line pos: %f, line end: %f\n", on, apos, nextpos, linepos, linepos+len); - while(nextposlineTo(d, nx,ny);/*printf("lineTo %f\n", nextpos);*/} - else {d->moveTo(d, nx,ny);/*printf("moveTo %f\n", nextpos);*/} - on^=1; - if(r[++apos]<0) - apos = 0; - nextpos+=r[apos]; - } - linepos = lineend; - if(on) { - //printf("lineTo %f\n", 1.0); - d->lineTo(d, line->x,line->y); - } - x = line->x; y = line->y; - } else if(line->type == gfx_splineTo) { - qspline_abc_t q; - double len, lineend,lastt; - mkspline(&q, x, y, line); - - len = get_spline_len(&q); - //printf("%f %f -> %f %f, len: %f\n", x, y, line->x, line->y, len); - if(len==0) - continue; - lineend = linepos+len; - lastt = 0; - if(nextpos=linepos); - //printf("(spline) on:%d apos: %d nextpos: %f, line pos: %f, line end: %f\n", on, apos, nextpos, linepos, linepos+len); - while(nextpossplineTo(d, sx, sy, nx,ny); - //printf("splineTo %f\n", nextpos); - } else { - d->moveTo(d, nx,ny); - //printf("moveTo %f\n", nextpos); - } - lastt = t; - on^=1; - if(r[++apos]<0) - apos = 0; - nextpos+=r[apos]; - } - linepos = lineend; - if(on) { - double sx,sy; - spline_get_controlpoint(&q, lastt, 1, &sx, &sy); - d->splineTo(d, sx, sy, line->x,line->y); - //printf("splineTo %f\n", 1.0); - } - x = line->x; y = line->y; - } - } -} - -static char* getToken(const char**p) -{ - const char*start; - char*result; - while(**p && strchr(" ,()\t\n\r", **p)) { - (*p)++; - } - start = *p; - if (strchr("LMlm", **p) && (isdigit(*(*p+1))||strchr("+-", *(*p+1)))) { - (*p)++; - } else while(**p && !strchr(" ,()\t\n\r", **p)) { - (*p)++; - } - result = (char*)malloc((*p)-start+1); - memcpy(result,start,(*p)-start+1); - result[(*p)-start] = 0; - return result; -} - -static float getFloat(const char** p) -{ - char* token = getToken(p); - float result = atof(token); - free(token); - return result; -} - -gfxline_t*gfxline_fromstring(const char*string) -{ - gfxdrawer_t d; - gfxdrawer_target_gfxline(&d); - - const char*p = string; - while(*p) { - char*token = getToken(&p); - if(!token) - break; - if (!*token) { - free(token); - break; - } - if(!strcmp(token, "M")) { - double x = getFloat(&p); - double y = getFloat(&p); - d.moveTo(&d, x, y); - } else if(!strncmp(token, "L", 1)) { - double x = getFloat(&p); - double y = getFloat(&p); - d.lineTo(&d, x, y); - } else if(!strncmp(token, "C", 1)) { - double x1 = getFloat(&p); - double y1 = getFloat(&p); - double x2 = getFloat(&p); - double y2 = getFloat(&p); - double x3 = getFloat(&p); - double y3 = getFloat(&p); - gfxdraw_cubicTo(&d, x1,y1, x2,y2, x3,y3, 0.9); - } else if(!strncmp(token, "z", 1)) { - //ignore - } else - fprintf(stderr, "gfxdraw: Warning: unknown primitive '%s'\n", token); - free(token); - } - gfxline_t*line = d.result(&d); - return line; -} - - -gfxline_t * gfxline_clone(gfxline_t*line) -{ - gfxline_t*dest = 0; - gfxline_t*pos = 0; - while(line) { - gfxline_t*n = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); - *n = *line; - n->next = 0; - if(!pos) { - dest = pos = n; - } else { - pos->next = n; - pos = n; - } - line = line->next; - } - return dest; -} - -static char splineIsStraight(double x, double y, gfxline_t*l) -{ - if(l->type == gfx_moveTo) - return 0; - if(l->type == gfx_lineTo) - return 1; - double dx = l->x-x; - double dy = l->y-y; - double sx = l->sx-x; - double sy = l->sy-y; - if(fabs(dx*sy - dy*sx) < 0.000001 && (dx*sx + dy*sy) >= 0) { - return 1; - } - return 0; -} - -void gfxline_optimize(gfxline_t*line) -{ - gfxline_t*l = line; - /* step 1: convert splines to lines, where possible */ - double x=0,y=0; - while(l) { - if(l->type == gfx_splineTo && splineIsStraight(x,y,l)) { - l->type = gfx_lineTo; - } - x = l->x; - y = l->y; - l = l->next; - } - /* step 2: combine adjacent lines and splines, where possible */ - l = line; - while(l && l->next) { - gfxline_t*next = l->next; - char combine = 0; - double sx=0,sy=0; - if(l->type == gfx_lineTo && next->type == gfx_lineTo) { - double dx = l->x-x; - double dy = l->y-y; - double nx = next->x-l->x; - double ny = next->y-l->y; - if(fabs(dx*ny - dy*nx) < 0.000001 && (dx*nx + dy*ny) >= 0) { - combine = 1; - } - } else if(l->type == gfx_splineTo && next->type == gfx_splineTo) { - /* TODO */ - } - if(combine) { - l->next = next->next; - next->next = 0; - l->x = next->x; - l->y = next->y; - l->sx = sx; - l->sy = sy; - rfx_free(next); - } else { - x = l->x; - y = l->y; - l = l->next; - } - } -} - -gfxline_t* gfxtool_dash_line(gfxline_t*line, float*dashes, float phase) -{ - gfxdrawer_t d; - gfxline_t*result; - gfxdrawer_target_gfxline(&d); - gfxtool_draw_dashed_line(&d, line, dashes, phase); - result= (gfxline_t*)d.result(&d); - return result; -} - -void gfxline_show(gfxline_t*l, FILE*fi) -{ - while(l) { - if(l->type == gfx_moveTo) { - fprintf(fi, "moveTo %.2f,%.2f\n", l->x, l->y); - } - if(l->type == gfx_lineTo) { - fprintf(fi, "lineTo %.2f,%.2f\n", l->x, l->y); - } - if(l->type == gfx_splineTo) { - fprintf(fi, "splineTo %.2f,%.2f %.2f,%.2f\n", l->sx, l->sy, l->x, l->y); - } - l = l->next; - } -} - -void gfxline_free(gfxline_t*l) -{ - if(l && (l+1) == l->next) { - /* flattened */ - rfx_free(l); - } else { - gfxline_t*next; - while(l) { - next = l->next; - l->next = 0; - rfx_free(l); - l = next; - } - } -} - -static inline gfxpoint_t cspline_getpoint(const struct cspline_t*s, double t) -{ - gfxpoint_t p; - double tt = t*t; - double ttt = tt*t; - double mt = (1-t); - double mtmt = mt*(1-t); - double mtmtmt = mtmt*(1-t); - p.x= s->end.x*ttt + 3*s->control2.x*tt*mt - + 3*s->control1.x*t*mtmt + s->start.x*mtmtmt; - p.y= s->end.y*ttt + 3*s->control2.y*tt*mt - + 3*s->control1.y*t*mtmt + s->start.y*mtmtmt; - return p; -} -static gfxpoint_t qspline_getpoint(const qspline_t*s, double t) -{ - gfxpoint_t p; - p.x= s->end.x*t*t + 2*s->control.x*t*(1-t) + s->start.x*(1-t)*(1-t); - p.y= s->end.y*t*t + 2*s->control.y*t*(1-t) + s->start.y*(1-t)*(1-t); - return p; -} - -static int approximate3(const cspline_t*s, qspline_t*q, int size, double quality2) -{ - unsigned int gran = 0; - unsigned int istep = 0x80000000; - unsigned int istart = 0; - int num = 0; - int level = 0; - - while(istart<0x80000000) - { - unsigned int iend = istart + istep; - double start = istart/(double)0x80000000; - double end = iend/(double)0x80000000; - qspline_t test; - double pos,qpos; - char left = 0,recurse=0; - int t; - int probes = 15; - double dx,dy; - - /* create simple approximation: a qspline_t which run's through the - qspline_t point at 0.5 */ - test.start = cspline_getpoint(s, start); - test.control = cspline_getpoint(s, (start+end)/2); - test.end = cspline_getpoint(s, end); - /* fix the control point: - move it so that the new spline does runs through it */ - test.control.x = -(test.end.x + test.start.x)/2 + 2*(test.control.x); - test.control.y = -(test.end.y + test.start.y)/2 + 2*(test.control.y); - - /* depending on where we are in the spline, we either try to match - the left or right tangent */ - if(start<0.5) - left=1; - /* get derivative */ - pos = left?start:end; - qpos = pos*pos; - test.control.x = s->end.x*(3*qpos) + 3*s->control2.x*(2*pos-3*qpos) + - 3*s->control1.x*(1-4*pos+3*qpos) + s->start.x*(-3+6*pos-3*qpos); - test.control.y = s->end.y*(3*qpos) + 3*s->control2.y*(2*pos-3*qpos) + - 3*s->control1.y*(1-4*pos+3*qpos) + s->start.y*(-3+6*pos-3*qpos); - if(left) { - test.control.x *= (end-start)/2; - test.control.y *= (end-start)/2; - test.control.x += test.start.x; - test.control.y += test.start.y; - } else { - test.control.x *= -(end-start)/2; - test.control.y *= -(end-start)/2; - test.control.x += test.end.x; - test.control.y += test.end.y; - } - -//#define PROBES -#ifdef PROBES - /* measure the spline's accurancy, by taking a number of probes */ - for(t=0;tquality2) { - recurse=1;break; - } - qr2 = qspline_getpoint(&test, (1-pos)); - cr2 = cspline_getpoint(s, start+(1-pos)*(end-start)); - - dx = qr2.x - cr2.x; - dy = qr2.y - cr2.y; - dist2 = dx*dx+dy*dy; - - if(dist2>quality2) { - recurse=1;break; - } - } -#else // quadratic error: *much* faster! - - /* convert control point representation to - d*x^3 + c*x^2 + b*x + a */ - dx= s->end.x - s->control2.x*3 + s->control1.x*3 - s->start.x; - dy= s->end.y - s->control2.y*3 + s->control1.y*3 - s->start.y; - - /* we need to do this for the subspline between [start,end], not [0,1] - as a transformation of t->a*t+b does nothing to highest coefficient - of the spline except multiply it with a^3, we just need to modify - d here. */ - {double m = end-start; - dx*=m*m*m; - dy*=m*m*m; - } - - /* use the integral over (f(x)-g(x))^2 between 0 and 1 - to measure the approximation quality. - (it boils down to const*d^2) */ - recurse = (dx*dx + dy*dy > quality2); -#endif - - if(recurse && istep>1 && size-level > num) { - istep >>= 1; - level++; - } else { - *q++ = test; - num++; - istart += istep; - while(!(istart & istep)) { - level--; - istep <<= 1; - } - } - } - return num; -} - -void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy, double quality) -{ - double c1x = (draw->x + 2 * cx) / 3; - double c1y = (draw->y + 2 * cy) / 3; - double c2x = (2 * cx + tox) / 3; - double c2y = (2 * cy + toy) / 3; - gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy, quality); -} - - -void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y, double quality) -{ - qspline_t q[128]; - cspline_t c; - double maxerror = quality>0 ? quality : 1.0; - int t,num; - - c.start.x = draw->x; - c.start.y = draw->y; - c.control1.x = c1x; - c.control1.y = c1y; - c.control2.x = c2x; - c.control2.y = c2y; - c.end.x = x; - c.end.y = y; - - num = approximate3(&c, q, 128, maxerror); - - for(t=0;tsplineTo(draw, mid.x, mid.y, to.x, to.y); - } -} - -gfxbbox_t gfxbbox_expand_to_point(gfxbbox_t box, gfxcoord_t x, gfxcoord_t y) -{ - if(box.xmin==0 && box.ymin==0 && box.xmax==0 && box.ymax==0) { - box.xmin = x; - box.ymin = y; - box.xmax = x; - box.ymax = y; - if(x==0 && y==0) box.xmax = 0.0000001; - return box; - } - if(x < box.xmin) - box.xmin = x; - if(x > box.xmax) - box.xmax = x; - if(y < box.ymin) - box.ymin = y; - if(y > box.ymax) - box.ymax = y; - return box; -} - -gfxbbox_t gfxbbox_expand_to_bbox(gfxbbox_t box, gfxbbox_t box2) -{ - box = gfxbbox_expand_to_point(box, box2.xmin, box2.ymin); - box = gfxbbox_expand_to_point(box, box2.xmax, box2.ymax); - return box; -} - -void gfxbbox_intersect(gfxbbox_t*box1, gfxbbox_t*box2) -{ - if(box2->xmin > box1->xmin) - box1->xmin = box2->xmin; - if(box2->ymin > box1->ymin) - box1->ymin = box2->ymin; - if(box2->xmax < box1->xmax) - box1->xmax = box2->xmax; - if(box2->ymax < box1->ymax) - box1->ymax = box2->ymax; - if(box1->xmin > box1->xmax) - box1->xmax = box1->xmin; - if(box1->ymin > box1->ymax) - box1->ymax = box1->ymin; -} - -gfxbbox_t gfxline_getbbox(gfxline_t*line) -{ - gfxcoord_t x=0,y=0; - gfxbbox_t bbox = {0,0,0,0}; - char last = 0; - while(line) { - if(line->type == gfx_moveTo) { - last = 1; - } else if(line->type == gfx_lineTo) { - if(last) bbox = gfxbbox_expand_to_point(bbox, x, y); - bbox = gfxbbox_expand_to_point(bbox, line->x, line->y); - last = 0; - } else if(line->type == gfx_splineTo) { - if(last) bbox = gfxbbox_expand_to_point(bbox, x, y); - bbox = gfxbbox_expand_to_point(bbox, line->sx, line->sy); - bbox = gfxbbox_expand_to_point(bbox, line->x, line->y); - last = 0; - } - x = line->x; - y = line->y; - line = line->next; - } - return bbox; -} - -gfxline_t* gfxline_append(gfxline_t*line1, gfxline_t*line2) -{ - gfxline_t*l = line1;; - if(!l) - return line2; - while(l->next) { - l = l->next; - } - l->next = line2; - return line1; -} - -void gfxline_transform(gfxline_t*line, gfxmatrix_t*matrix) -{ - while(line) { - double x = matrix->m00*line->x + matrix->m10*line->y + matrix->tx; - double y = matrix->m01*line->x + matrix->m11*line->y + matrix->ty; - line->x = x; - line->y = y; - if(line->type == gfx_splineTo) { - double sx = matrix->m00*line->sx + matrix->m10*line->sy + matrix->tx; - double sy = matrix->m01*line->sx + matrix->m11*line->sy + matrix->ty; - line->sx = sx; - line->sy = sy; - } - line = line->next; - } -} - -void gfxmatrix_dump(gfxmatrix_t*m, FILE*fi, char*prefix) -{ - fprintf(fi, "%s%f %f | %f\n", prefix, m->m00, m->m10, m->tx); - fprintf(fi, "%s%f %f | %f\n", prefix, m->m01, m->m11, m->ty); -} - -void gfxmatrix_transform(gfxmatrix_t*m, double* v, double*dest) -{ - dest[0] = m->m00*v[0] + m->m10*v[1] + m->tx; - dest[1] = m->m01*v[0] + m->m11*v[1] + m->ty; -} -void gfxmatrix_invert(gfxmatrix_t*m, gfxmatrix_t*dest) -{ - double det = m->m00 * m->m11 - m->m10 * m->m01; - if(!det) { - memset(dest, 0, sizeof(gfxmatrix_t)); - return; - } - det = 1/det; - dest->m00 = m->m11 * det; - dest->m01 = -m->m01 * det; - dest->m10 = -m->m10 * det; - dest->m11 = m->m00 * det; - dest->tx = -(dest->m00 * m->tx + dest->m10 * m->ty); - dest->ty = -(dest->m01 * m->tx + dest->m11 * m->ty); -} -void gfxmatrix_unit(gfxmatrix_t*m) -{ - memset(m, 0, sizeof(gfxmatrix_t)); - m->m00 = 1.0; - m->m11 = 1.0; -} -void gfxmatrix_multiply(gfxmatrix_t*m1, gfxmatrix_t*m2, gfxmatrix_t*dest) -{ - dest->m00 = m1->m00*m2->m00 + m1->m10*m2->m01; - dest->m01 = m1->m01*m2->m00 + m1->m11*m2->m01; - dest->m10 = m1->m00*m2->m10 + m1->m10*m2->m11; - dest->m11 = m1->m01*m2->m10 + m1->m11*m2->m11; - dest->tx = m1->m00*m2->tx + m1->m10*m2->ty + m1->tx; - dest->ty = m1->m01*m2->tx + m1->m11*m2->ty + m1->ty; -} - -gfxfontlist_t* gfxfontlist_create() -{ - /* Initial list ist empty */ - return 0; -} - -gfxfont_t*gfxfontlist_findfont(gfxfontlist_t*list, char*id) -{ - gfxfontlist_t*l = list; - while(l) { - if(!strcmp((char*)l->font->id, id)) { - return l->font; - } - l = l->next; - } - return 0; -} -char gfxfontlist_hasfont(gfxfontlist_t*list, gfxfont_t*font) -{ - gfxfontlist_t*l = list; - while(l) { - if(!strcmp((char*)l->font->id, font->id)) { - return 1; - } - l = l->next; - } - return 0; -} -void*gfxfontlist_getuserdata(gfxfontlist_t*list, const char*id) -{ - gfxfontlist_t*l = list; - while(l) { - if(!strcmp((char*)l->font->id, id)) { - return l->user; - } - l = l->next; - } - return 0; -} -gfxfontlist_t*gfxfontlist_addfont2(gfxfontlist_t*list, gfxfont_t*font, void*user) -{ - gfxfontlist_t*last=0,*l = list; - while(l) { - last = l; - if(l->font == font) { - return list; // we already know this font - } - l = l->next; - } - if(!font) { - fprintf(stderr, "Tried to add zero font\n"); - } - l = (gfxfontlist_t*)rfx_calloc(sizeof(gfxfontlist_t)); - l->font = font; - l->user = user; - l->next = 0; - if(last) { - last->next = l; - return list; - } else { - return l; - } -} -gfxfontlist_t*gfxfontlist_addfont(gfxfontlist_t*list, gfxfont_t*font) -{ - return gfxfontlist_addfont2(list, font, 0); -} -void gfxfontlist_free(gfxfontlist_t*list, char deletefonts) -{ - gfxfontlist_t*l = list; - while(l) { - gfxfontlist_t*next = l->next; - if(deletefonts && l->font) { - gfxfont_free(l->font);l->font=0; - } - l->next = 0; - free(l); - l = next; - } -} - -gfxline_t*gfxline_makerectangle(double x1,double y1,double x2, double y2) -{ - gfxline_t* line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)*5); - line[0].x = x1;line[0].y = y1;line[0].type = gfx_moveTo;line[0].next = &line[1]; - line[1].x = x2;line[1].y = y1;line[1].type = gfx_lineTo;line[1].next = &line[2]; - line[2].x = x2;line[2].y = y2;line[2].type = gfx_lineTo;line[2].next = &line[3]; - line[3].x = x1;line[3].y = y2;line[3].type = gfx_lineTo;line[3].next = &line[4]; - line[4].x = x1;line[4].y = y1;line[4].type = gfx_lineTo; - return line; -} - -gfxline_t*gfxline_makecircle(double x,double y,double rx, double ry) -{ - double C1 = 0.2930; - double C2 = 0.4140; - double begin = 0.7070; - gfxline_t** line = (gfxline_t**)rfx_calloc(sizeof(gfxline_t*)*9); - int t; - for(t=0;t<9;t++) { - line[t] = rfx_calloc(sizeof(gfxline_t)); - } - line[0]->type = gfx_moveTo; - line[0]->x = x+begin*rx; - line[0]->y = y+begin*ry; - for(t=1;t<9;t++) { - line[t-1]->next = line[t]; - line[t]->type = gfx_splineTo; - } - line[8]->next = 0; -#define R(nr,cx,cy,mx,my) \ - line[nr]->sx = line[nr-1]->x + (cx); \ - line[nr]->sy = line[nr-1]->y + (cy); \ - line[nr]->x = line[nr]->sx + (mx); \ - line[nr]->y = line[nr]->sy + (my); - R(1, -C1*rx, C1*ry, -C2*rx, 0); - R(2, -C2*rx, 0, -C1*rx, -C1*ry); - R(3, -C1*rx, -C1*ry, 0, -C2*ry); - R(4, 0, -C2*ry, C1*rx, -C1*ry); - R(5, C1*rx, -C1*ry, C2*rx, 0); - R(6, C2*rx, 0, C1*rx, C1*ry); - R(7, C1*rx, C1*ry, 0, C2*ry); - R(8, 0, C2*ry, -C1*rx, C1*ry); - gfxline_t*l = line[0]; - free(line); - return l; -} - -gfxbbox_t* gfxline_isrectangle(gfxline_t*_l) -{ - if(!_l) - return 0; - - gfxline_t*l = gfxline_clone(_l); - gfxline_optimize(l); - - double x1=0,x2=0,y1=0,y2=0; - int xc=0,yc=0; - char corners=0; - - char prev=0; - char fail=0; - for(;l; l=l->next) { - double x = l->x; - double y = l->y; - - char top=0,left=0; - - if(xc==2 && x!=x1 && x!=x2) {fail=1;break;} - else if(xc>=1 && x==x1) {left=0;} - else if(xc==2 && x==x2) {left=1;} - else if(xc==1 && x!=x1) {x2 = x; xc=2; left=1;} - else if(xc==0) {x1 = x; xc=1;left=0;} - else {fprintf(stderr, "Internal error in rectangle detection\n");} - - if(yc==2 && y!=y1 && y!=y2) {fail=1;break;} - else if(yc>=1 && y==y1) {top=0;} - else if(yc==2 && y==y2) {top=1;} - else if(yc==1 && y!=y1) {y2 = y; yc=2; top=1;} - else if(yc==0) {y1 = y; yc=1;top=0;} - else {fprintf(stderr, "Internal error in rectangle detection\n");} - - char pos=top<<1|left; - - if((pos^prev)==3) { - /* diagonal lines not allowed */ - fail=1;break; - } - prev = pos; - - /* no corner except the first one may be touched twice */ - if(pos && (corners & 1<xmin = x1; r->ymin = y1; - r->xmax = x2; r->ymax = y2; - return r; -} - -void gfximage_transform(gfximage_t*img, gfxcxform_t*cxform) -{ - int t; - int size = img->width*img->height; - - int rr,rg,rb,ra, tr; - int gr,gg,gb,ga, tg; - int br,bg,bb,ba, tb; - int ar,ag,ab,aa, ta; - rr = (int)(cxform->rr*256);gr = (int)(cxform->gr*256); - rg = (int)(cxform->rg*256);gg = (int)(cxform->gg*256); - rb = (int)(cxform->rb*256);gb = (int)(cxform->gb*256); - ra = (int)(cxform->ra*256);ga = (int)(cxform->ga*256); - br = (int)(cxform->br*256);ar = (int)(cxform->ar*256);tr = (int)(cxform->tr*256); - bg = (int)(cxform->bg*256);ag = (int)(cxform->ag*256);tg = (int)(cxform->tg*256); - bb = (int)(cxform->bb*256);ab = (int)(cxform->ab*256);tb = (int)(cxform->tb*256); - ba = (int)(cxform->ba*256);aa = (int)(cxform->aa*256);ta = (int)(cxform->ta*256); - - for(t=0;tdata[t]; - unsigned char r = (pixel->r * rr + pixel->g * rg + pixel->b * rb + pixel->a * ra + tr) / 256; - unsigned char g = (pixel->r * gr + pixel->g * gg + pixel->b * gb + pixel->a * ga + tg) / 256; - unsigned char b = (pixel->r * br + pixel->g * bg + pixel->b * bb + pixel->a * ba + tb) / 256; - unsigned char a = (pixel->r * ar + pixel->g * ag + pixel->b * ab + pixel->a * aa + ta) / 256; - pixel->r = r; - pixel->g = g; - pixel->b = b; - pixel->a = a; - } -} -void gfxline_dump(gfxline_t*line, FILE*fi, char*prefix) -{ - while(line) { - if(line->type == gfx_moveTo) { - fprintf(fi, "%smoveTo %.2f %.2f\n", prefix, line->x, line->y); - } else if(line->type == gfx_lineTo) { - fprintf(fi, "%slineTo %.2f %.2f\n", prefix, line->x, line->y); - } else if(line->type == gfx_splineTo) { - fprintf(fi, "%ssplineTo (%.2f %.2f) %.2f %.2f\n", prefix, line->sx, line->sy, line->x, line->y); - } - line = line->next; - } -} - -static char gfxpoint_equals(void*c1, void*c2) -{ - return !memcmp(c1, c2, sizeof(gfxpoint_t)); -} -static unsigned int gfxpoint_hash(void*c) -{ - return string_hash3(c, sizeof(gfxpoint_t)); -} -static void* gfxpoint_clone(void*c) -{ - void*n = malloc(sizeof(gfxpoint_t)); - memcpy(n, c, sizeof(gfxpoint_t)); - return n; -} -static void gfxpoint_destroy(void*c) -{ - free(c); -} -static type_t gfxpoint_type = { - hash: (hash_func)gfxpoint_hash, - equals: (equals_func)gfxpoint_equals, - dup: (dup_func)gfxpoint_clone, - free: (free_func)gfxpoint_destroy, -}; - -gfxline_t* gfxline_restitch(gfxline_t*line) -{ - dict_t*ff = dict_new2(&gfxpoint_type); - dict_t*rev = dict_new2(&gfxpoint_type); - - gfxline_t*prev=0; - while(line) { - gfxline_t*next = line->next; - if(line->type == gfx_moveTo && (line->next && line->next->type != gfx_moveTo)) { - gfxpoint_t xy = {line->x, line->y}; - dict_put(ff, &xy, line); - prev = line; - } else if(!line->next || line->next->type == gfx_moveTo) { - if(prev) { - gfxpoint_t xy = {line->x, line->y}; - dict_put(rev, &xy, prev); - line->next = 0; - prev=0; - } - } - line = next; - } - - gfxpoint_t pos = {0,0}; - - gfxline_t*result = 0; - gfxline_t*last = 0; - - char first = 1; - while(dict_count(ff)) { - char reverse = 0, stitch = 1; - gfxline_t*l = dict_lookup(ff, &pos); - if(l) { - char d = dict_del2(ff,&pos,l);assert(d); - } else { - l = dict_lookup(rev, &pos); - if(l) { - reverse = 1; - char d = dict_del2(rev,&pos,l);assert(d); - } - } - if(!l) { - /* try to find *any* entry. this is costly, but - doesn't happen too often */ - stitch = 0; - DICT_ITERATE_DATA(ff, gfxline_t*, l2) { - l = l2; - break; - } - assert(l); - gfxpoint_t xy = {l->x,l->y}; - char d = dict_del2(ff,&xy,l);assert(d); - } - - gfxline_t*end = l; - if(!reverse) { - while(end->next) end = end->next; - pos.x = end->x; - pos.y = end->y; - char d = dict_del2(rev,&pos,l);assert(d); - } else { - l = gfxline_reverse(l); - pos.x = end->x; - pos.y = end->y; - char d = dict_del2(ff,&pos,end);assert(d); - } - - assert(l->type == gfx_moveTo); - if(stitch && !first) { - /* cut away the moveTo */ - gfxline_t*next = l->next; - free(l); - l = next; - } - - if(!last) { - result = l; - last = end; - } else { - last->next = l; - last = end; - } - first = 0; - } - dict_destroy(ff); - dict_destroy(rev); - return result; -} - -gfxline_t* gfxline_reverse(gfxline_t*line) -{ - gfxline_t*b = 0; - while(line) { - gfxline_t*next = line->next; - if(next && next->type != gfx_moveTo) { - line->type = next->type; - line->sx = next->sx; - line->sy = next->sy; - } else { - line->type = gfx_moveTo; - } - line->next = b; - b = line; - line = next; - } - return b; -} - -void gfxgradient_destroy(gfxgradient_t*gradient) -{ - while(gradient) { - gfxgradient_t*next = gradient->next; - free(gradient); - gradient = next; - } -} - -gfxparams_t* gfxparams_new() -{ - return (gfxparams_t*)rfx_calloc(sizeof(gfxparams_t)); -} - -void gfxparams_store(gfxparams_t*params, const char*key, const char*value) -{ - gfxparam_t*o = params->params; - while(o) { - if(!strcmp(key, o->key)) { - /* overwrite old value */ - free((void*)o->value); - o->value = strdup(value); - return; - } - o = o->next; - } - gfxparam_t*p = (gfxparam_t*)malloc(sizeof(gfxparam_t)); - p->key = strdup(key); - p->value = strdup(value); - p->next = 0; - - if(params->last) { - params->last->next = p; - params->last = p; - } else { - params->params = p; - params->last = p; - } -} - -void gfxparams_free(gfxparams_t*params) -{ - gfxparam_t*p = params->params; - while(p) { - gfxparam_t*next = p->next; - free((void*)p->key); - if(p->value) free((void*)p->value); - free(p); - p = next; - } - free(params); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.h b/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.h deleted file mode 100644 index 555deb34c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gfxtools.h +++ /dev/null @@ -1,124 +0,0 @@ -/* gfxtools.h - - Various utility functions for dealing with gfxdevices (header file). - - Part of the swftools package. - - Copyright (c) 2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxtools_h__ -#define __gfxtools_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "../lib/mem.h" -#include "../lib/gfxdevice.h" - -typedef struct _gfxdrawer -{ - void*internal; - gfxcoord_t x,y; - void (*moveTo)(struct _gfxdrawer*d, gfxcoord_t x, gfxcoord_t y); - void (*lineTo)(struct _gfxdrawer*d, gfxcoord_t x, gfxcoord_t y); - void (*splineTo)(struct _gfxdrawer*d, gfxcoord_t sx, gfxcoord_t sy, gfxcoord_t x, gfxcoord_t y); - void (*close)(struct _gfxdrawer*d); - void* (*result)(struct _gfxdrawer*d); -} gfxdrawer_t; - -typedef struct _gfxpoint -{ - gfxcoord_t x,y; -} gfxpoint_t; - -typedef struct _gfxfontlist -{ - gfxfont_t*font; - void*user; - struct _gfxfontlist*next; -} gfxfontlist_t; - -void gfxdrawer_target_gfxline(gfxdrawer_t*d); - -void gfxtool_draw_dashed_line(gfxdrawer_t*d, gfxline_t*line, float*dashes, float phase); -gfxline_t* gfxtool_dash_line(gfxline_t*line, float*dashes, float phase); - -void gfxline_dump(gfxline_t*l, FILE*fi, char*prefix); -gfxline_t* gfxline_append(gfxline_t*line1, gfxline_t*line2); -void gfxline_free(gfxline_t*l); -gfxline_t* gfxline_clone(gfxline_t*line); -void gfxline_optimize(gfxline_t*line); - -void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y, double quality); -void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy, double quality); - -gfxline_t*gfxline_fromstring(const char*string); - -gfxbbox_t gfxline_getbbox(gfxline_t*line); -gfxbbox_t gfxbbox_expand_to_point(gfxbbox_t box, gfxcoord_t x, gfxcoord_t y); -void gfxbbox_intersect(gfxbbox_t*box1, gfxbbox_t*box2); - -void gfxline_transform(gfxline_t*line, gfxmatrix_t*matrix); - -/* tries to remove unnecessary moveTos from the gfxline */ -gfxline_t* gfxline_restitch(gfxline_t*line); -/* reverses in place */ -gfxline_t* gfxline_reverse(gfxline_t*line); - -void gfxmatrix_dump(gfxmatrix_t*l, FILE*fi, char*prefix); -void gfxmatrix_transform(gfxmatrix_t*m, gfxcoord_t* v1, gfxcoord_t*dest); -void gfxmatrix_invert(gfxmatrix_t*src, gfxmatrix_t*dest); -void gfxmatrix_unit(gfxmatrix_t*m); -void gfxmatrix_multiply(gfxmatrix_t*m1, gfxmatrix_t*m2, gfxmatrix_t*dest); - -gfxfontlist_t* gfxfontlist_create(); -gfxfontlist_t*gfxfontlist_addfont(gfxfontlist_t*list, gfxfont_t*font); -gfxfontlist_t*gfxfontlist_addfont2(gfxfontlist_t*list, gfxfont_t*font, void*user); -gfxfont_t*gfxfontlist_findfont(gfxfontlist_t*list, char*id); -char gfxfontlist_hasfont(gfxfontlist_t*list, gfxfont_t*font); -void* gfxfontlist_getuserdata(gfxfontlist_t*list, const char*id); -void gfxfontlist_free(gfxfontlist_t*list, char deletefonts); - -gfxbbox_t* gfxline_isrectangle(gfxline_t*_l); -gfxbbox_t gfxbbox_expand_to_bbox(gfxbbox_t box, gfxbbox_t box2); - -gfxline_t*gfxline_makerectangle(double x1, double y1, double x2, double y2); -gfxline_t*gfxline_makecircle(double x,double y,double rx, double ry); -void gfxline_show(gfxline_t*line, FILE*fi); - -void gfxgradient_destroy(gfxgradient_t*gradient); - -typedef struct _gfxparam { - const char*key; - const char*value; - struct _gfxparam* next; -} gfxparam_t; -typedef struct _gfxparams { - gfxparam_t*params; - gfxparam_t*last; -} gfxparams_t; -gfxparams_t* gfxparams_new(); -void gfxparams_store(gfxparams_t*params, const char*name, const char*value); -void gfxparams_free(gfxparams_t*params); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxtools_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/box.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/box.c deleted file mode 100644 index f0cc989f8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/box.c +++ /dev/null @@ -1,369 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2007 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL address - - */ - -#include -#include -#include -#include -/* do we need #include ? conflicts with INFINITY in unicode.h */ -#include "gocr.h" -#include "pgm2asc.h" - -/* for sorting letters by position on the image -/ ToDo: - use function same line like this or include lines.m1 etc. */ -int box_gt(struct box *box1, struct box *box2) { - // box1 after box2 ? - if (box1->line > box2->line) - return 1; - if (box1->line < box2->line) - return 0; - if (box1->x0 > box2->x1) // before - return 1; - if (box1->x1 < box2->x0) // before - return 0; - if (box1->x0 > box2->x0) // before, overlapping! - return 1; - - return 0; -} - -/* --- copy part of pix p into new pix b ---- len=10000 - * Returns: 0 on success, 1 on error. - * naming it as copybox isnt very clever, because it dont have to do with the - * char boxes (struct box) - */ -int copybox (pix * p, int x0, int y0, int dx, int dy, pix * b, int len) { - int x, y; - - /* test boundaries */ - if (b->p == NULL || dx < 0 || dy < 0 || dx * dy > len) { - fprintf(stderr, " error-copybox x=%5d %5d d=%5d %5d\n", x0, y0, dx, dy); - return 1; - } - - b->x = dx; - b->y = dy; - b->bpp = 1; -#ifdef FASTER_INCOMPLETE - for (y = 0; y < dy; y++) - memcpy(&pixel_atp(b, 0, y), &pixel_atp(p, x0, y + y0 ), dx); - // and unmark pixels -#else - for (y = 0; y < dy; y++) - for (x = 0; x < dx; x++) - pixel_atp(b, x, y) = getpixel(p, x + x0, y + y0); -#endif - - return 0; -} - -/* reset table of alternative chars (and free memory) */ -int reset_box_ac(struct box *box){ - int i; - for (i=0; inum_ac; i++) - if (box->tas[i]) { - /* fprintf(stderr,"DBG free_s[%d] %p %s\n",i,box->tas[i],box->tas[i]); */ - free(box->tas[i]); - box->tas[i]=0; /* prevent double freeing */ - } - box->num_ac=0; /* mark as freed */ - return 0; -} - -/* ini or copy a box: get memory for box and initialize the memory */ -struct box *malloc_box (struct box *inibox) { - struct box *buf; - int i; - - buf = (struct box *) malloc(sizeof(struct box)); - if (!buf) - return NULL; - if (inibox) { - memcpy(buf, inibox, sizeof(struct box)); - /* only pointer are copied, we want to copy the contents too */ - for (i=0;inum_ac;i++) { - if (inibox->tas[i]) { - buf->tas[i]=(char *)malloc(strlen(inibox->tas[i])+1); - memcpy(buf->tas[i], inibox->tas[i], strlen(inibox->tas[i])+1); - } - } - } - else { /* ToDo: init it */ - buf->num_ac=0; - buf->num_frames=0; - } - /* fprintf(stderr,"\nDBG ini_box %p",buf); */ - return buf; -} - -/* free memory of box */ -int free_box (struct box *box) { - if (!box) return 0; - /* fprintf(stderr,"DBG free_box %p\n",box); out_x(box); */ - reset_box_ac(box); /* free alternative char table */ - free(box); /* free the box memory */ - return 0; -} - -/* simplify the vectorgraph, - * but what is the best way? - * a) melting two neighbouring vectors with nearly same direction? - * (nearest angle to pi) - * b) melting three neigbours with smallest area? - * ToDo: - * mode = 0 - only lossless - * mode = 1 - reduce one vector, smallest possible loss - * mode = 2 - remove jitter (todo, or somewhere else) - * ToDo: include also loop around (last - first element) - * ToDo: reduce by 10..50% - */ -int reduce_vectors ( struct box *box1, int mode ) { - int i1, i2, nx, ny, mx, my, len, - minlen=1024, /* minlength of to neighbouring vectors */ - besti1=0, /* frame for best reduction */ - besti2=2; /* vector replacing its predecessor */ - double sprod, maxsprod=-1; - if (mode!=1) fprintf(stderr,"ERR not supported yet, ToDo\n"); - for (i2=1,i1=0; i1num_frames; i1++) { /* every frame */ - for (;i2num_frame_vectors[i1]-1; i2++) { /* every vector */ - /* predecessor n */ - nx = box1->frame_vector[i2-0][0] - box1->frame_vector[i2-1][0]; - ny = box1->frame_vector[i2-0][1] - box1->frame_vector[i2-1][1]; - /* successor m */ - mx = box1->frame_vector[i2+1][0] - box1->frame_vector[i2-0][0]; - my = box1->frame_vector[i2+1][1] - box1->frame_vector[i2-0][1]; - /* angle is w = a*b/(|a|*|b|) = 1 means parallel */ - /* normalized: minimize w^2 = (a*b/(|a|*|b|)-1)^2 */ - /* -1=90grd, 0=0grd, -2=180grd */ - sprod = /* fabs */(abs(nx*mx+ny*my)*(nx*mx+ny*my) - /(1.*(nx*nx+ny*ny)*(mx*mx+my*my))-1); - /* we dont include math.h because INFINITY conflicts to unicode,h */ - if (sprod<0) sprod=-sprod; - len = (mx*mx+my*my)*(nx*nx+ny*ny); /* sum lengths^2 */ -// ..c ###c ... .. ... -// .b. len=2+2 #b.. len=2+5 #bc len=1+2 bc len=1+1 b#a len=4+5 -// a.. spr=0 a... spr=1/10 a.. spr=1/4 a. spr=1 ##c spr=9/5 -// - if ( len* sprod* sprod* sprod* sprod - num_frames>0) - for (i2=besti2; i2num_frame_vectors[ box1->num_frames-1 ]-1; i2++) { - box1->frame_vector[i2][0]=box1->frame_vector[i2+1][0]; - box1->frame_vector[i2][1]=box1->frame_vector[i2+1][1]; - } - for (i1=besti1; i1num_frames; i1++) - box1->num_frame_vectors[i1]--; -// fprintf(stderr,"\nDBG_reduce_vectors i= %d nv= %d sprod=%f len2=%d\n# ...", -// besti2,box1->num_frame_vectors[ box1->num_frames-1 ],maxsprod,minlen); -// out_x(box1); - return 0; -} - -/* add the contents of box2 to box1 - * especially add vectors of box2 to box1 - */ -int merge_boxes( struct box *box1, struct box *box2 ) { - int i1, i2, i3, i4; - struct box tmpbox, *bsmaller, *bbigger; /* for mixing and sorting */ - /* DEBUG, use valgrind to check uninitialized memory */ -#if 0 - fprintf(stderr,"\nDBG merge_boxes_input:"); out_x(box1); out_x(box2); -#endif - /* pair distance is to expendable, taking borders is easier */ - if ((box2->x1 - box2->x0)*(box2->y1 - box2->y0) - >(box1->x1 - box1->x0)*(box1->y1 - box1->y0)) { - bbigger=box2; bsmaller=box1; } - else { - bbigger=box1; bsmaller=box2; } - /* ToDo: does not work if a third box is added */ - if (box2->y0>box1->y1 || box2->y1y0 - || box2->x0>box1->x1 || box2->x1x0) { - box1->num_boxes += box2->num_boxes; /* num seperate objects 2=ij */ - } else { - if (box2->num_boxes>box1->num_boxes) box1->num_boxes=box2->num_boxes; - box1->num_subboxes += box2->num_subboxes+1; /* num holes 1=abdepq 2=B */ - } - box1->dots += box2->dots; /* num i-dots */ - if ( box2->x0 < box1->x0 ) box1->x0 = box2->x0; - if ( box2->x1 > box1->x1 ) box1->x1 = box2->x1; - if ( box2->y0 < box1->y0 ) box1->y0 = box2->y0; - if ( box2->y1 > box1->y1 ) box1->y1 = box2->y1; - i1 = i2 = 0; - if (bbigger->num_frames) - i1 = bbigger->num_frame_vectors[ bbigger->num_frames - 1 ]; - if (bsmaller->num_frames) - i2 = bsmaller->num_frame_vectors[ bsmaller->num_frames - 1 ]; - while (i1+i2 > MaxFrameVectors) { - if (i1>i2) { reduce_vectors( bbigger, 1 ); i1--; } - else { reduce_vectors( bsmaller, 1 ); i2--; } - } - /* if i1+i2>MaxFrameVectors simplify the vectorgraph */ - /* if sum num_frames>MaxNumFrames through shortest graph away and warn */ - /* first copy the bigger box */ - memcpy(&tmpbox, bbigger, sizeof(struct box)); - /* attach the smaller box */ - for (i4=i3=0; i3num_frames; i3++) { - if (tmpbox.num_frames>=MaxNumFrames) break; - - for (; i4num_frame_vectors[i3]; i4++) { - memcpy(tmpbox.frame_vector[i1], - bsmaller->frame_vector[i4],2*sizeof(int)); - i1++; - } - tmpbox.num_frame_vectors[ tmpbox.num_frames ] = i1; - tmpbox.frame_vol[ tmpbox.num_frames ] = bsmaller->frame_vol[ i3 ]; - tmpbox.frame_per[ tmpbox.num_frames ] = bsmaller->frame_per[ i3 ]; - tmpbox.num_frames++; - if (tmpbox.num_frames>=MaxNumFrames) { - if (JOB->cfg.verbose) - fprintf(stderr,"\nDBG merge_boxes MaxNumFrames reached"); - break; - } - } - /* copy tmpbox to destination */ - box1->num_frames = tmpbox.num_frames; - memcpy(box1->num_frame_vectors, - tmpbox.num_frame_vectors,sizeof(int)*MaxNumFrames); - memcpy(box1->frame_vol, - tmpbox.frame_vol,sizeof(int)*MaxNumFrames); - memcpy(box1->frame_per, - tmpbox.frame_per,sizeof(int)*MaxNumFrames); - memcpy(box1->frame_vector, - tmpbox.frame_vector,sizeof(int)*2*MaxFrameVectors); -#if 0 - if (JOB->cfg.verbose) - fprintf(stderr,"\nDBG merge_boxes_result:"); out_x(box1); -#endif - return 0; -} - -/* used for division of glued chars - * after a box is splitted into 2, where vectors are copied to both, - * vectors outside the new box are cutted and thrown away, - * later replaced by - * - 1st remove outside vectors with outside neighbours (complete frames?) - * add vector on outside vector with inside neighbours - * care about connections through box between outside vectors - * - 2nd reduce outside crossings (inclusive splitting frames if necessary) - * depending on direction (rotation) of outside connections - * - 3th shift outside vectors to crossing points - * - split add this points, connect only in-out...out-in, - * - cutting can result in more objects - * ToDo: dont connect --1---2--------3----4-- new-y1 (inside above not drawn) - * \ \->>>>-/ / outside - * \----<<<<-----/ old-y1 - * |======| subtractable? - * - * only connect --1---2--------3----4-- new-y1 - * \>>/ \>>>/ old-y1 outside - * - * ToDo: new vol, per - */ -int cut_box( struct box *box1) { - int i1, i2, i3, i4, x, y, lx, ly, dbg=0; - if (JOB->cfg.verbose) dbg=1; // debug level, enlarge to get more output - if (dbg) fprintf(stderr,"\n cut box x= %3d %3d", box1->x0, box1->y0); - /* check if complete frames are outside the box */ - for (i1=0; i1num_frames; i1++){ - if (dbg>2) fprintf(stderr,"\n checking frame %d outside", i1); - i2 = ((i1)?box1->num_frame_vectors[ i1-1 ]:0); // this frame - i3 = box1->num_frame_vectors[ i1 ]; // next frame - for (i4=i2; i4 < i3; i4++) { - x = box1->frame_vector[i4][0]; - y = box1->frame_vector[i4][1]; - /* break, if one vector is lying inside */ - if (x>=box1->x0 && x<=box1->x1 && y>=box1->y0 && y<=box1->y1) break; - } - if (i4==i3) { /* all vectors outside */ - if (dbg>1) fprintf(stderr,"\n remove frame %d",i1); - /* replace all frames i1,i1+1,... by i1+1,i1+2,... */ - /* replace (x,y) pairs first */ - for (i4=i2; i4num_frame_vectors[ box1->num_frames-1 ]-(i3-i2); - i4++) { - box1->frame_vector[i4][0] = box1->frame_vector[i4+i3-i2][0]; - box1->frame_vector[i4][1] = box1->frame_vector[i4+i3-i2][1]; - } - /* replace the num_frame_vectors */ - for (i4=i1; i4num_frames-1; i4++) - box1->num_frame_vectors[ i4 ] = - box1->num_frame_vectors[ i4+1 ]-(i3-i2); - box1->num_frames--; i1--; - } - } - /* remove vectors outside the box */ - i3=0; - for (i1=0; i1num_frames; i1++){ - if (dbg>2) fprintf(stderr,"\n check cutting vectors on frame %d", i1); - x = box1->frame_vector[0][0]; /* last x */ - y = box1->frame_vector[0][1]; /* last y */ - /* ToDo: start inside to get a closed object */ - if (xx0 || x>box1->x1 || yy0 || y>box1->y1) i3=1; - for (i2=0; i2num_frame_vectors[ i1 ]; i2++) { - lx = x; /* last x */ - ly = y; /* last y */ - x = box1->frame_vector[i2][0]; - y = box1->frame_vector[i2][1]; - // fprintf(stderr,"DBG LEV3 i2= %3d xy= %3d %3d",i2,x,y); - /* check if outside */ - if (xx0 || x>box1->x1 || yy0 || y>box1->y1) { - /* replace by nearest point at border, ToDo: better crossingpoint */ - if (i3==0) { /* wrong if it starts outside */ - if (x < box1->x0) x = box1->frame_vector[i2][0] = box1->x0; - if (x > box1->x1) x = box1->frame_vector[i2][0] = box1->x1; - if (y < box1->y0) y = box1->frame_vector[i2][1] = box1->y0; - if (y > box1->y1) y = box1->frame_vector[i2][1] = box1->y1; - } else { - /* remove vector */ - if (dbg>1) fprintf(stderr,"\n remove vector[%d][%d] x= %2d %2d",i1,i2,x-box1->x0,y-box1->y0); - for (i4=i2;i4num_frame_vectors[ box1->num_frames-1 ]-1;i4++) { - box1->frame_vector[i4][0] = box1->frame_vector[i4+1][0]; - box1->frame_vector[i4][1] = box1->frame_vector[i4+1][1]; - } - for (i4=i1; i4num_frames; i4++) - box1->num_frame_vectors[ i4 ]--; - i2--; /* next element is shiftet now, setting back the counter */ - } - i3++; - // fprintf(stderr," outside i3= %d\n",i3); - continue; - } - // fprintf(stderr," inside i3= %d",i3); - if (i3) { /* ToDo: better crossing point last vector and border */ - if (lx < box1->x0) lx = box1->x0; - if (lx > box1->x1) lx = box1->x1; - if (ly < box1->y0) ly = box1->y0; - if (ly > box1->y1) ly = box1->y1; - x = box1->frame_vector[i2][0] = lx; - y = box1->frame_vector[i2][1] = ly; - i3 = 0; - } - // fprintf(stderr," xy= %3d %3d\n",x,y); - } - } - //if (dbg>2) { fprintf(stderr,"\nDBG cut_box_result:"); out_x(box1); } - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/database.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/database.c deleted file mode 100644 index 21a4f02ad..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/database.c +++ /dev/null @@ -1,451 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2006 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL address - */ - -#include -#include -#include "gocr.h" -#include "pnm.h" -#include "pgm2asc.h" -#include -#include - -#define Blen 256 - -// load boxes from database into boxlist (for faster access) -// used as alternate engine, comparing chars with database -int load_db(void) { - FILE *f1; - char s1[Blen+1], - s2[Blen+1] = "./db/", /* ToDo: replace by constant! by configure */ - *s3; - int i, j, ii, i2, line; - struct box *box1; - pix *pp; - - if( JOB->cfg.db_path ) strncpy(s2,JOB->cfg.db_path,Blen-1); - i2=strlen(s2); - if (JOB->cfg.verbose) - fprintf(stderr, "# load database %s %s ... ",s2,JOB->cfg.db_path); - - strncpy(s2+i2,"db.lst",Blen-i2);s2[Blen]=0; - f1 = fopen(s2, "r"); - if (!f1) { - fprintf(stderr, " DB %s not found\n",s2); - return 1; - } - - line = 0; /* line counter for better error report */ - for (ii = 0; !feof(f1); ii++) { -/* bbg: should write a better input routine */ - if (!fgets(s1, Blen, f1)) break; line++; - j = strlen(s1); - /* remove carriage return sequences from line */ - while (j > 0 && (s1[j - 1] == '\r' || s1[j - 1] == '\n')) - s1[--j] = 0; - if (!j) continue; /* skip empty line */ - if (s1[0]=='#') continue; /* skip comments (v0.44) */ - /* copy file name */ - for (i = 0; i < j && i+i2 < Blen && strchr(" \t,;",s1[i]) == 0; i++) - s2[i2 + i] = s1[i]; - s2[i2+i]=0; - /* skip spaces */ - for (; i < j && strchr(" \t",s1[i]) != 0; i++); - /* by now: read pix, fill box, goto next ??? */ - pp = (pix *)malloc(sizeof(pix)); - if( !pp ) fprintf(stderr,"malloc error in load_db pix\n"); - - //readpgm(s2, pp, 0 * JOB->cfg.verbose); - fprintf(stderr, "Can't call readpgm()\n"); - - box1 = (struct box *)malloc_box(NULL); - if(!box1) fprintf(stderr,"malloc error in load_db box1\n"); - box1->x0 = 0; - box1->x1 = pp->x-1; // white border 1 pixel width - box1->y0 = 0; - box1->y1 = pp->y-1; - box1->x = 1; - box1->y = 1; - box1->dots = 0; - box1->c = 0; - box1->modifier = 0; /* ToDo: obsolete */ - box1->tas[0]=NULL; - box1->tac[0]=0; - box1->wac[0]=100; /* really 100% sure? */ - box1->num_ac=1; - if (s1[i]=='"'){ /* parse a string */ - j=strrchr(s1+i+1,'"')-(s1+i+1); /* we only look for first and last "" */ - if (j>=1) { - s3=(char *)malloc(j+1); - if (!s3) fprintf (stderr, "malloc error in load_db s3\n"); - if (s3) { - memcpy(s3,s1+i+1,j); - s3[j]=0; - box1->tas[0]=s3; - // fprintf(stderr,"\nstring=%s",s3); - } - } else { fprintf(stderr,"load_db: string parse error L%d\n",line); } - } else { - box1->tac[0] = box1->c = s1[i]; /* try to interpret as ASCII */ - /* we can live without hexcode in future if we use UTF8-strings */ - s3=s1+i; - j=strtol( s1+i, &s3, 16); /* try to read 4 to 8 digit hex unicode */ - /* if its an hexcode, ASCII interpretation is overwritten */ - if( j && i+3<=Blen && s3-s1-i>3 ) box1->tac[0] = box1->c = j; - // fprintf(stderr,"\nhexcode=%04x=%04x %d",(int)j,(int)box1->c,s3-s1-i); - } - box1->num = 0; - box1->line = -1; - box1->m1 = 0; /* ToDo: should be given too in the database! */ - box1->m2 = 0; - box1->m3 = 0; - box1->m4 = 0; - box1->p = pp; - list_app(&JOB->tmp.dblist, box1); // append to list -#if 0 - out_x(box1); -#endif - } - fclose(f1); - if (JOB->cfg.verbose) - fprintf(stderr, " %d chars loaded\n", ii); - return 0; -} - -// expand database from box/boxlist name=db_$utime.pbm -// this is added in version v0.3.3 -int store_db(struct box *box1) { - FILE *f1; - char s2[Blen+1] = "./db/", s3[Blen+1]; - int i2, dx, dy; - pix b; /* temporary mini page */ - - if( JOB->cfg.db_path ) strncpy(s2,JOB->cfg.db_path,Blen-1); - i2=strlen(s2); - - /* name generation can cause problems, if called twice within a second */ - if (box1->num_ac && box1->tas[0]) - sprintf(s3,"db_%04x_%lu.pbm", (unsigned int)box1->tas[0][0], - (unsigned long)time(NULL)); - else - sprintf(s3,"db_%04x_%lu.pbm", (unsigned int)box1->c, - (unsigned long)time(NULL)); - /* ToDo: the file name may be not unique */ - strncpy(s2+i2,"db.lst",Blen-i2);s2[Blen]=0; - f1 = fopen(s2, "a"); - if (!f1) { - fprintf(stderr, " could not access %s\n",s2); - return 1; - } - strncpy(s2+i2,s3,strlen(s3)); s2[i2+strlen(s3)]=0; - /* store image and infos about the char */ - /* ToDo: store the vector list instead of the pixelarray */ - - if (JOB->cfg.verbose) - fprintf(stderr, "store_db: add file %s to database\n#",s3); - dx=box1->x1-box1->x0+1; - dy=box1->y1-box1->y0+1; - b.p = (unsigned char *) malloc( dx * dy ); - if( !b.p ){ - fprintf( stderr, "\nFATAL: malloc failed, skip store_db" ); - return 2; - } - if (copybox(box1->p, box1->x0, box1->y0, dx, dy, &b, dx * dy)) - return -1; - - //writepbm(s2,&b); /* What is to do on error? */ - - free(b.p); - - /* store the database line */ - /* some infos about box1->m1,..,m4 should added (base line, high etc.) */ - if (box1->num_ac && box1->tas[0]) { - fprintf(f1, "%s \"%s\"\n",s3,box1->tas[0]); - /* ToDo: what if tas contains '"'? */ - } else { - if( (box1->c >= '0' && box1->c <= '9') - || (box1->c >= 'A' && box1->c <= 'Z') - || (box1->c >= 'a' && box1->c <= 'z') ) - fprintf(f1, "%s %c\n",s3,(char)box1->c); - else { - if (((box1->c)>>16)>>16) - fprintf(f1, "%s %08x\n",s3,(unsigned int)box1->c); - else - fprintf(f1, "%s %04x\n",s3,(unsigned int)box1->c); - } - } - fclose(f1); - return 0; -} - -/* function is only for user prompt on console to identify chars - it prints out a part of pixmap b at point x0,y0 to stderr - using dots .,; if no pixel, and @xoO for pixels - */ -void out_env(struct box *px ){ - int x0,y0,x1,y1,dx,dy,x,y,x2,y2,yy0,tx,ty,i,cs; - char c1, c2; pix *b; - cs=JOB->cfg.cs; - yy0=px->y0; - { /* overwrite rest of arguments */ - b=px->p; - x0=px->x0; x1=px->x1; dx=x1-x0+1; - y0=px->y0; y1=px->y1; dy=y1-y0+1; - y0-=2; y1+=2; - if (px->m4 && y0>px->m1) y0=px->m1; - if (px->m4 && y1m4) y1=px->m4; - if (x1-x0+1<52) { x0-=10; x1+=10; } /* fragment? expand frame */ - if (x1-x0+1<52) { x0-=10; x1+=10; } /* fragment? expand frame */ - if (x1-x0+1<62) { x0-=5; x1+=5; } - if (y1-y0+1<10) { y0-= 4; y1+= 4; } /* fragment? */ - if (x0<0) x0=0; if (x1>=b->x) x1=b->x-1; - if (y0<0) y0=0; if (y1>=b->y) y1=b->y-1; - dx=x1-x0+1; - dy=y1-y0+1; yy0=y0; - fprintf(stderr,"\n# show box + environment"); - fprintf(stderr,"\n# show box x= %4d %4d d= %3d %3d r= %d %d", - px->x0, px->y0, px->x1 - px->x0 + 1, px->y1 - px->y0 + 1, - px->x - px->x0, px->y - px->y0); - if (px->num_ac){ /* output table of chars and its probabilities */ - fprintf(stderr,"\n# list box char: "); - for(i=0;inum_ac && itas[i]) - fprintf(stderr," %s(%d)", px->tas[i] ,px->wac[i]); - else - fprintf(stderr," %s(%d)",decode(px->tac[i],ASCII),px->wac[i]); - } - fprintf(stderr,"\n"); - if (px->dots && px->m2 && px->m1m1; dy=px->y1-yy0+1; } - } - tx=dx/80+1; - ty=dy/40+1; // step, usually 1, but greater on large maps - fprintf(stderr,"# show pattern x= %4d %4d d= %3d %3d t= %d %d\n", - x0,y0,dx,dy,tx,ty); - if (dx>0) - for(y=yy0;yx0 || x > px->x1 - || y+ty-1 < px->y0 || y > px->y1) c1=((c1=='#')?'O':','); - fprintf(stderr,"%c", c1 ); - } - - c1=c2=' '; - /* mark lines with < */ - if (px) if (y==px->m1 || y==px->m2 || y==px->m3 || y==px->m4) c1='<'; - if (y==px->y0 || y==px->y1) c2='-'; /* boxmarks */ - fprintf(stderr,"%c%c\n",c1,c2); - } -} - - -/* -// second variant, for database (with slightly other behaviour) -// new variant -// look at the environment of the pixel too (contrast etc.) -// detailed analysis only of diff pixels! -// -// 100% * distance, 0 is best fit -// = similarity of 2 chars for recognition of noisy chars -// weigth of pixels with only one same neighbour set to 0 -// look at contours too! - ToDo: especially on small boxes distance should only be 0 if - characters are 100% identical! -*/ -// #define DEBUG 2 -int distance2( pix *p1, struct box *box1, - pix *p2, struct box *box2, int cs){ - int rc=0,x,y,v1,v2,i1,i2,rgood=0,rbad=0, - x1,y1,x2,y2,dx,dy,dx1,dy1,dx2,dy2,tx,ty; -#if DEBUG == 2 - if(JOB->cfg.verbose) - fprintf(stderr," DEBUG: distance2\n"); -#endif - x1=box1->x0;y1=box1->y0;x2=box2->x0;y2=box2->y0; - dx1=box1->x1-box1->x0+1; dx2=box2->x1-box2->x0+1; dx=((dx1>dx2)?dx1:dx2);dx=dx1; - dy1=box1->y1-box1->y0+1; dy2=box2->y1-box2->y0+1; dy=((dy1>dy2)?dy1:dy2);dy=dy1; - if(abs(dx1-dx2)>1+dx/16 || abs(dy1-dy2)>1+dy/16) rbad++; // how to weight? - // compare relations to baseline and upper line - if(box1->m4>0 && box2->m4>0){ // used ??? - if(2*box1->y1>box1->m3+box1->m4 && 2*box2->y1m3+box2->m4) rbad+=128; - if(2*box1->y0>box1->m1+box1->m2 && 2*box2->y0m1+box2->m2) rbad+=128; - } - tx=dx/16; if(dx<17)tx=1; // raster - ty=dy/32; if(dy<33)ty=1; - // compare pixels - for( y=0;y0) - rbad+=16*v1; - } - if(rgood+rbad) rc= 100*rbad/(rgood+rbad); else rc=99; - /* if width/high is not correct add badness */ - rc += ( abs(dx1*dy2-dx2*dy1) * 10 ) / (dy1*dy2); - if (rc>100) rc=100; - if(/* rc<10 && */ JOB->cfg.verbose /* &1024 */){ -#if DEBUG == 2 - fprintf(stderr," distance2 rc=%d rgood=%d rbad=%d\n",rc,rgood,rbad); -// out_b(NULL,p1,box1->x0,box1->y0,box1->x1-box1->x0+1, -// box1->y1-box1->y0+1,cs); -// out_b(NULL,p2,box2->x0,box2->y0,box2->x1-box2->x0+1, -// box2->y1-box2->y0+1,cs); - out_x(box1); - out_x(box2); -#endif - } - return rc; -} - -wchar_t ocr_db(struct box *box1) { - int dd = 1000, dist = 1000; - wchar_t c = UNKNOWN; - char buf[200]; - Box *box2, *box3; - - if (!list_empty(&JOB->tmp.dblist)){ - box3 = (Box *)list_get_header(&JOB->tmp.dblist); - if(JOB->cfg.verbose) - fprintf(stderr,"\n#DEBUG: ocr_db (%d,%d) ",box1->x0, box1->y0); - - for_each_data(&JOB->tmp.dblist) { - box2 = (Box *)list_get_current(&JOB->tmp.dblist); - /* do preselect!!! distance() slowly */ - dd = distance2( box2->p, box2, box1->p, box1, JOB->cfg.cs); - if (dd <= dist) { /* new best fit */ - dist = dd; - box3 = box2; /* box3 is a pointer and not copied box2 */ - - if (dist<100 && 100-dist > JOB->cfg.certainty) { - /* some deviation of the pattern is tolerated */ - int i, wa; - for (i=0;inum_ac;i++) { - wa = (100-dist)*box3->wac[i]/100; /* weight *= (100-dist) */ - if (box3->tas[i]) setas(box1,box3->tas[i],wa); - else setac(box1,box3->tac[i],wa); - } - if (box3->num_ac) c=box3->tac[0]; /* 0 for strings (!UNKNOWN) */ - if (JOB->cfg.verbose) - fprintf(stderr, " dist=%4d c= %c 0x%02x %s wc= %3d", dist, - ((box3->c>32 && box3->c<127) ? (char) box3->c : '.'), - (int)box3->c, ((box3->tas[0])?box3->tas[0]:""), box3->wac[0]); - } - if (dd<=0 && ((box3->num_ac && box3->tas[0]) || box3->c >= 128 - || !strchr ("l1|I0O", box3->c))) - break; /* speedup if found */ - } - } end_for_each(&JOB->tmp.dblist); - - } - - if( (JOB->cfg.mode&128) != 0 && c == UNKNOWN ) { /* prompt the user */ - /* should the output go to stderr or special pipe??? */ - int utf8_ok=0; /* trigger this flag if input is ok */ - int i, endchar; /* index */ - out_env(box1); /* old: out_x(box1); */ - fprintf(stderr,"The above pattern was not recognized.\n" - "Enter UTF8 char or string for above pattern. Leave empty if unsure.\n" - "Press RET at the end (ALT+RET to store into RAM only) : " - ); /* ToDo: empty + alt-return (0x1b 0x0a) for help? ^a for skip all */ - /* UTF-8 (man 7 utf-8): - * 7bit = 0xxxxxxx (0000-007F) - * 11bit = 110xxxxx 10xxxxxx (0080-07FF) - * 16bit = 1110xxxx 10xxxxxx 10xxxxxx (0800-FFFF) - * 21bit = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - * 26bit = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - * 31bit = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - */ - buf[0]=0; - /* shift/ctrl/altgr-enter acts like enter or ^j or ^m, - * alt-enter returns 0x1b 0x0a and returns from fgets() - * ^d (EOF) returns (nil) from fgets() - * x+(2*)ctrl-d returns from fgets() without returning a 0x0a - * if not UTF-input-mode, we are in trouble? - * ^a=0x01, ^b=0x02, ^e=05, ..., ToDo: meaning of no-input or <=space - */ - fgets(buf,200,stdin); /* including \n=0x0a */ - dd=strlen(buf); - /* output hexcode if verbose set */ - if (JOB->cfg.verbose) { - fprintf(stderr, "\n# fgets [%d]:", dd); - for(i=0; icfg.mode&=~128; } /* skip all */ - buf[dd=i]=0; /* replace final 0x0a or other special codes */ - if (dd==1 && !(buf[0]&128)) { c=buf[0]; utf8_ok=1; } /* single char */ - if (dd>1 && dd<7) { /* try to decode single wide char (utf8) */ - int u0, u1; /* define UTF8-start sequences, u0=0bits u1=1bits */ - u0= 1<<(7-dd); /* compute start byte from UTF8-length */ - u1=255&~((1<<(8-dd))-1); - for (i=1;i0){ /* ToDo: skip space and tab too? */ - if (utf8_ok==1) { setac(box1, c, 100); } /* store single wchar */ - if (utf8_ok==0) { /* store a string of chars (UTF8-string) */ - c='_'; /* what should we do with c? probably a bad idea? */ - setas(box1, buf, 100); - } - /* decide between - * 0) just help gocr to find the results and (dont remember, 0x01) - * 1) help and remember in the same run (store to memory, 0x1b) - * 2) expand the database (dont store ugly chars to the database!) - */ - if (endchar!=0x01){ /* ^a before hit return */ - /* is there a reason to dont store to memory? */ - list_app(&JOB->tmp.dblist, box1); /* append to list for 1+2 */ - } - if (endchar!=0x01 && endchar!=0x1b){ - store_db(box1); /* store to disk for 2 */ - } - if (JOB->cfg.verbose) - fprintf(stderr, " got char= %c 16bit= 0x%04x string= \"%s\"\n", - ((c>32 && c<127)?(char)c:'.'), (int)c, buf); - } - } - - return c; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/detect.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/detect.c deleted file mode 100644 index bfd3ec9e2..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/detect.c +++ /dev/null @@ -1,943 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2007 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - check README for my email address -*/ - -#include -#include -#include -#include // toupper, tolower -#include "pgm2asc.h" -#include "gocr.h" - -// ----- detect lines --------------- -/* suggestion: Fourier transform and set line frequency where the - amplitude has a maximum (JS: slow and not smarty enough). - - option: range for line numbers 1..1000 or similar - todo: look for thickest line, and divide if thickness=2*mean_thickness - Set these elements of the box structs: - - m1 <-- top of upper case letters and (bdfhkl) (can differ) - m2 <-- top of letters (acegmnopqrsuvwxyz) - m3 <-- baseline - m4 <-- bottom of hanging letters (gqpy) - - performance can be improved by working with a temporary - list of boxes of the special text line - - - Jun23,00 more robustness of m3 (test liebfrau1) - - Feb01,02 more robustness of m4 (test s46_084.pgm) - - Dec03,12 fix problems with footnotes - ToDo: - - generate lists of boxes per line (faster access) - - use statistics - - for each box look at it neighbours and set box-m1..m4 - - m[1..4].max .min if m4.min-m3.max<1 probability lower - */ -int detect_lines1(pix * p, int x0, int y0, int dx, int dy) -{ - int i, jj, j2, y, yy, my, mi, mc, i1, i2, i3, i4, - m1, m2, m3, m4, ma1, ma2, ma3, ma4, m3pre, m4pre; - struct box *box2, *box3; /* box3 is for verbose / debugging */ - struct tlines *lines = &JOB->res.lines; - - /* ToDo: optional read line-data from external source??? */ - if (lines->num == 0) { // initialize one dummy-line for pictures etc. - lines->m4[0] = 0; - lines->m3[0] = 0; - lines->m2[0] = 0; - lines->m1[0] = 0; - lines->x0[0] = p->x; /* expand to left end during detection */ - lines->x1[0] = 0; /* expand to right end */ - lines->pitch[0] = JOB->cfg.spc; /* default word pitch */ - lines->mono[0] = 0; /* default spacing = prop */ - lines->num++; - } - i = lines->num; - if (dy < 4) - return 0; /* image is to low for latin chars */ - my = jj = 0; - // get the mean height of all hollow chars - // (better than mean value of everything including bg-pattern or dust?) - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if ( box2->c != PICTURE - && box2->num_frames>1 && box2->num_frames<3 /* 1 or 2 holes */ - && box2->y0 >= y0 && box2->y1 <= y0 + dy - && box2->x0 >= x0 && box2->x1 <= x0 + dx - && box2->frame_vol[0]>0 - && box2->frame_vol[1]<0 - ) { - jj++; - my += box2->y1 - box2->y0 + 1; - } - } end_for_each(&(JOB->res.boxlist)); - if (jj==0) { - // get the mean height of all chars - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if ( box2->c != PICTURE - && box2->y1 - box2->y0 + 1 >= 4 /* 4x6 font */ - && box2->y0 >= y0 && box2->y1 <= y0 + dy - && box2->x0 >= x0 && box2->x1 <= x0 + dx ) { - jj++; - my += box2->y1 - box2->y0 + 1; - } - } end_for_each(&(JOB->res.boxlist)); - } - if (jj == 0) - return 0; /* no chars detected */ - - - /* ToDo: a better way could be to mark good boxes (of typical high a-zA-Z0-9) - * first and handle only marked boxes for line scan, exclude ?!,.:;etc - * but without setect the chars itself (using good statistics) - * see adjust_text_lines() - */ - my /= jj; /* we only care about chars with high arround my */ - if (JOB->cfg.verbose & 16) - fprintf(stderr,"\n# detect_lines1(%d %d %d %d) vvv&16 chars=%d my=%d\n# ", - x0, y0, dx, dy, jj, my); - // "my" is the average over the whole image (bad, if different fontsizes) - - if (my < 4) - return 0; /* mean high is to small => error */ - - m4pre=m3pre=y0; /* lower bond of upper line */ - // better function for scanning line around a letter ??? - // or define lines around known chars "eaTmM" - for (j2 = y = y0; y < y0 + dy; y++) { - // look for max. of upper and lower bound of next line - m1 = y0 + dy; - jj = 0; -#if 1 - /* this is only for test runs */ - if (JOB->cfg.verbose & 16) - fprintf(stderr,"searching new line %d\n# ",i /* lines->num */); -#endif - - box3 = NULL; /* mark the most upper box starting next line */ - // find highest point of next line => store to m1-min (m1>=y) - // only objects greater 2/3*my and smaller 3*my are allowed - // a higher "!" at end of line can result in a to low m1 - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->line>0 || box2->c == PICTURE) continue; - if (lines->dx) - yy = lines->dy * box2->x0 / (lines->dx); /* correct crooked lines */ - else yy=0; - if ( box2->y0 >= y + yy && box2->y1 < y0 + dy // lower than y - && box2->x0 >= x0 && box2->x1 < x0 + dx // within box ? - && box2->c != PICTURE // no picture - && box2->num_boxes <= 1 // ignore 2 for "!?i" 3 for "ä" - && 3 * (box2->y1 - box2->y0) > 2 * my // not to small - && (box2->y1 - box2->y0) < 3 * my // not to big - && (box2->y1 - box2->y0) > 4) // minimum absolute size - { - if (box2->y0 < m1 + yy) { - m1 = box2->y0 - yy; /* highest upper boundary */ - box3 = box2; - } - // fprintf(stderr,"\n %3d %3d %+3d %d m1= %3d", - // box2->x0, box2->y0, box2->y1 - box2->y0 + 1, box2->num_boxes, m1); - } - } end_for_each(&(JOB->res.boxlist)); - if (!box3 || m1 >= y0+dy) break; /* no further line found */ - if (JOB->cfg.verbose & 16) - fprintf(stderr," most upper box at new line xy= %4d %4d %+4d %+4d\n# ", - box3->x0, box3->y0, box3->x1-box3->x0, box3->y1-box3->y0); - - // at the moment values depend from single chars, which can - // result in bad values (ex: 4x6 /\=) - // ToDo: 2) mean size of next line (store list of y0,y1) - // ToDo: 3) count num0[(y0-m1)*16/my], num1[(y1-m1)*16/my] - // ToDo: or down-top search horizontal nerarest neighbours - lines->x0[i] = x0 + dx - 1; /* expand during operation to left end */ - lines->x1[i] = x0; /* expand to the right end of line */ - m4=m2=m1; mi=m1+my; m3=m1+2*my; jj=0; - // find limits for upper bound, base line and ground line - // m2-max m3-min m4-max - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->line>0 || box2->c == PICTURE) continue; - if ( box2->y0 < y0 || box2->y1 >= y0 + dy - || box2->x0 < x0 || box2->x1 >= x0 + dx ) continue; // out of image - if (lines->dx) yy = lines->dy * box2->x0 / (lines->dx); - else yy=0; - /* check for ij-dots, used if chars of same high */ - if ( box2->y0 >= y + yy - && box2->y0 >= y - && (box2->y1 - box2->y0) < my - && box2->y1 < m1 + yy + my/4 - && box2->y0 < mi + yy ) { - mi = box2->y0 - yy; /* highest upper boundary i-dot */ - } - // fprintf(stderr,"\n check %3d %3d-%3d y=%d yy=%d m1=%d", box2->x0, box2->y0, box2->y1, y, yy, m1); - /* get m2-max m3-min m4-max */ - if ( box2->y0 >= y + yy // lower than y - && 3 * (box2->y1 - box2->y0 + 1) > 2 * my // right size ? - && (box2->y1 - box2->y0 + 1) < 3 * my // font mix, size = 2.6*my - && (box2->y1 - box2->y0 + 1) > 3 // 4x6 lowercase=4 - && box2->y0 >= m1 // in m1 range? - && box2->y0 <= m1 + yy + 9 * my / 8 // my can be to small if mixed - // ToDo: we need a better (local?) algorithm for big headlines > 2*my - && box2->y1 <= m1 + yy + 3 * my - && box2->y1 >= m1 + yy + my / 2 - // lines can differ in high, my may be to small (smaller headlines) - && box2->y0+box2->y1 <= 2*box3->y1 - ) - { - jj++; // count chars for debugging purpose - if (box2->y0 > m2 + yy) { - m2 = box2->y0 - yy; /* highest upper boundary */ - if (JOB->cfg.verbose & 16) - fprintf(stderr," set m2= %d yy= %d\n# ",m2, yy); - } - if (box2->y1 > m4 + yy && (my>6 || box2->y1 < m3+my)) { - m4 = box2->y1 - yy; /* lowest lower boundary, small font lines can touch */ - } - if ( box2->y1 < m3 + yy - && ( ( 2*box2->y1 > m2+ m4+yy && m2>m1) - || ( 4*box2->y1 > m1+3*m4+yy) ) ) // care for TeX: \(^1\)Footnote 2003 - /* "'!?" could cause trouble here, therefore this lines */ - /* ToDo: get_bw costs time, check pre and next */ - if( get_bw(box2->x0,box2->x1,box2->y1+1 ,box2->y1+my/2,box2->p,JOB->cfg.cs,1) == 0 - || get_bw(box2->x0,box2->x1,box2->y1+my/2,box2->y1+my/2,box2->p,JOB->cfg.cs,1) == 1 - || num_cross(box2->x0,box2->x1,(box2->y0+box2->y1)/2,(box2->y0+box2->y1)/2,box2->p,JOB->cfg.cs)>2 ) - { - m3 = box2->y1 - yy; /* highest lower boundary */ - // printf("\n# set1 m3 m=%3d %+2d %+2d %+2d",m1,m2-m1,m3-m1,m4-m1); - // out_x(box2); - } - if (box2->y0 + box2->y1 > 2*(m3 + yy) - && box2->y1 < m4 + yy - my/4 -1 - && box2->y1 >= (m2 + m4)/2 // care for TeX: \(^1\)Footnote 2003 - && m2 > m1 ) // be sure to not use ', m2 must be ok - { - m3 = box2->y1 - yy; /* highest lower boundary */ - // printf("\n# set2 m3 m=%3d %+2d %+2d %+2d",m1,m2-m1,m3-m1,m4-m1); - // out_x(box2); - } - if (box2->x1>lines->x1[i]) lines->x1[i] = box2->x1; /* right end */ - if (box2->x0x0[i]) lines->x0[i] = box2->x0; /* left end */ - // printf(" m=%3d %+2d %+2d %+2d yy=%3d\n",m1,m2-m1,m3-m1,m4-m1,yy); - } - } end_for_each(&(JOB->res.boxlist)); - -#if 1 - /* this is only for test runs */ - if (JOB->cfg.verbose & 16) - fprintf(stderr," step 1 y=%4d m= %4d %+3d %+3d %+3d" - " my=%2d chars=%3d\n# ", - y, m1, m2-m1, m3-m1, m4-m1, my, jj); -#endif - - if (m3 == m1) - break; -#if 1 /* make averages about the line */ - // same again better estimation - mc = (3 * m3 + m1) / 4; /* lower center ? */ - ma1 = ma2 = ma3 = ma4 = i1 = i2 = i3 = i4 = jj = 0; - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->line>0 || box2->c == PICTURE) continue; - if (lines->dx) yy = lines->dy * box2->x0 / (lines->dx); else yy=0; - if (box2->y0 >= y + yy && box2->y1 < y0 + dy // lower than y - && box2->x0 >= x0 && box2->x1 < x0 + dx // in box ? - && box2->c != PICTURE // no picture - && 2 * (box2->y1 - box2->y0) > my // right size ? - && (box2->y1 - box2->y0) < 4 * my) { - if ( box2->y0 - yy >= m1-my/4 - && box2->y0 - yy <= m2+my/4 - && box2->y1 - yy >= m3-my/4 - && box2->y1 - yy <= m4+my/4 ) { /* its within allowed range! */ - // jj++; // not used - if (abs(box2->y0 - yy - m1) <= abs(box2->y0 - yy - m2)) - { i1++; ma1 += box2->y0 - yy; } - else { i2++; ma2 += box2->y0 - yy; } - if (abs(box2->y1 - yy - m3) < abs(box2->y1 - yy - m4)) - { i3++; ma3 += box2->y1 - yy; } - else { i4++; ma4 += box2->y1 - yy; } - if (box2->x1>lines->x1[i]) lines->x1[i] = box2->x1; /* right end */ - if (box2->x0x0[i]) lines->x0[i] = box2->x0; /* left end */ - } - } - } end_for_each(&(JOB->res.boxlist)); - - if (i1) m1 = (ma1+i1/2) / i1; /* best rounded */ - if (i2) m2 = (ma2+i2/2) / i2; - if (i3) m3 = (ma3+i3-1) / i3; /* round up */ - if (i4) m4 = (ma4+i4-1) / i4; - // printf("\n# .. set3 m3 m=%3d %+2d %+2d %+2d",m1,m2-m1,m3-m1,m4-m1); - -#endif - - /* expand right and left end of line */ - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->line>0 || box2->c == PICTURE) continue; - if (lines->dx) yy = lines->dy * box2->x0 / (lines->dx); else yy=0; - if ( box2->y0 >= y0 && box2->y1 < y0 + dy - && box2->x0 >= x0 && box2->x1 < x0 + dx // in box ? - && box2->c != PICTURE // no picture - && box2->y0 >= m1-1 - && box2->y0 <= m4 - && box2->y1 >= m1 - && box2->y1 <= m4+1 ) { /* its within line */ - if (box2->x1>lines->x1[i]) lines->x1[i] = box2->x1; /* right end */ - if (box2->x0x0[i]) lines->x0[i] = box2->x0; /* left end */ - } - } end_for_each(&(JOB->res.boxlist)); - -#if 1 - /* this is only for test runs */ - if (JOB->cfg.verbose & 16) - fprintf(stderr," step 2 y=%4d m= %4d %+3d %+3d %+3d\n# ", - y,m1,m2-m1,m3-m1,m4-m1); -#endif - - if (m4 == m1) { - if(m3+m4>2*y) y = (m4+m3)/2; /* lower end may overlap the next line */ - continue; - } - jj=0; - lines->wt[i] = 100; - if (5 * (m2 - m1 +1) < m3 - m2 || (m2 - m1) < 2) jj|=1; /* same high */ - if (5 * (m4 - m3 +1) < m3 - m2 || (m4 - m3) < 1) jj|=2; /* same base */ - if (jj&1) lines->wt[i] = 75*lines->wt[i]/100; - if (jj&2) lines->wt[i] = 75*lines->wt[i]/100; - if (jj>0 && JOB->cfg.verbose) { - fprintf(stderr," trouble on line %d, wt*100= %d\n",i,lines->wt[i]); - fprintf(stderr,"# m= %4d %+3d %+3d %+3d\n",m1,m2-m1,m3-m1,m4-m1); - fprintf(stderr,"# i= %3d %3d %3d %3d (counts)\n",i1,i2,i3,i4); - if (jj==3) fprintf(stderr,"# all boxes of same high!\n# "); - if (jj==1) fprintf(stderr,"# all boxes of same upper bound!\n# "); - if (jj==2) fprintf(stderr,"# all boxes of same lower bound!\n# "); - } - /* ToDo: check for dots ij,. to get the missing information */ -#if 1 - /* jj=3: ABCDEF123456 or mnmno or gqpy or lkhfdtb => we are in trouble */ - if (jj==3 && (m4-m1)>my) { jj=0; m2=m1+my/8+1; m4=m3+my/8+1; } /* ABC123 */ - /* using idots, may fail on "ABCDEFGÄÜÖ" */ - if (jj==3 && mi>0 && mim4pre) { jj=2; m1=mi; } /* use ij dots */ - if (jj==1 && m2-(m3-m2)/4>m3pre ) { /* expect: acegmnopqrsuvwxyz */ - if (m1-m4pre0 && JOB->cfg.verbose & 16) { - fprintf(stderr," m= %4d %+2d %+2d %+2d my= %4d\n# ", - m1, m2-m1, m3-m1, m4-m1, my); - } -#endif - - - { // empty space between lines - lines->m4[i] = m4; - lines->m3[i] = m3; - lines->m2[i] = m2; - lines->m1[i] = m1; - lines->pitch[i] = JOB->cfg.spc; /* default word pitch */ - lines->pitch[i] = 0; /* default spacing */ - if (JOB->cfg.verbose & 16) - fprintf(stderr, " m= %4d %+3d %+3d %+3d w= %d (line=%d)\n# ", - m1, m2 - m1, m3 - m1, m4 - m1, lines->wt[i], i); - if (i < MAXlines && m4 - m1 > 4) - i++; - if (i >= MAXlines) { - fprintf(stderr, "Warning: lines>MAXlines\n"); - break; - } - } - if (m3+m4>2*y) y = (m3+m4)/2; /* lower end may overlap the next line */ - if (m3>m3pre) m3pre = m3; else m3=y0; /* set for next-line scan */ - if (m4>m4pre) m4pre = m4; else m4=y0; /* set for next-line scan */ - } - lines->num = i; - if (JOB->cfg.verbose) - fprintf(stderr, " num_lines= %d", lines->num-1); - return 0; -} - -// ----- layout analyzis of dx*dy region at x0,y0 ----- -// ----- detect lines via recursive division (new version) --------------- -// what about text in frames??? -// ToDo: change to bottom-top analyse or/and take rotation into account -int detect_lines2(pix *p,int x0,int y0,int dx,int dy,int r){ - int i,x2,y2,x3,y3,x4,y4,x5,y5,y6,mx,my,x30,x31,y30,y31; - struct box *box2,*box3; - // shrink box - if(dx<=0 || dy<=0) return 0; - if(y0+dy< p->y/128 && y0==0) return 0; /* looks like dust */ - if(y0>p->y-p->y/128 && y0+dy==p->y) return 0; /* looks like dust */ - - if(r>1000){ return -1;} // something is wrong - if(JOB->cfg.verbose)fprintf(stderr,"\n# r=%2d ",r); - - mx=my=i=0; // mean thickness - // remove border, shrink size - x2=x0+dx-1; // min x - y2=y0+dy-1; // min y - x3=x0; // max x - y3=y0; // max y - for_each_data(&(JOB->res.boxlist)) { - box3 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if(box3->y0>=y0 && box3->y1x0>=x0 && box3->x1x1 > x3 ) x3=box3->x1; // max x - if( box3->x0 < x2 ) x2=box3->x0; // min x - if( box3->y1 > y3 ) y3=box3->y1; // max y - if( box3->y0 < y2 ) y2=box3->y0; // min y - if(box3->c!=PICTURE) - if( box3->y1 - box3->y0 > 4 ) - { - i++; - mx+=box3->x1-box3->x0+1; // mean x - my+=box3->y1-box3->y0+1; // mean y - } - } - } end_for_each(&(JOB->res.boxlist)); - x0=x2; dx=x3-x2+1; - y0=y2; dy=y3-y2+1; - - if(i==0 || dx<=0 || dy<=0) return 0; - mx/=i;my/=i; - // better look for widest h/v-gap, ToDo: vertical lines? - if(r<8){ // max. depth - - // detect widest horizontal gap - y2=y3=y4=y5=y6=0; - x2=x3=x4=x5=y5=0;// min. 3 lines - // position and thickness of gap, y6=num_gaps, nbox^2 ops - for_each_data(&(JOB->res.boxlist)) { // not very efficient, sorry - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if( box2->c!=PICTURE ) /* ToDo: not sure, that this is a good idea */ - if( box2->y0>=y0 && box2->y1x0>=x0 && box2->x1y1-box2->y0>my/2 ){ // no pictures & dust??? - - y4=y0+dy-1; // nearest vert. box - x4=x0+dx-1; - // ToDo: rotate back box2->x1,y1 to x21,y21 - // look for nearest lowest (y4) and right (x4) neighbour - // of every box (box2) - for_each_data(&(JOB->res.boxlist)) { - box3 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if(box3!=box2) - if(box3->y0>=y0 && box3->y1x0>=x0 && box3->x1c!=PICTURE) /* ToDo: not sure, that this is a good idea */ - if(box3->y1-box3->y0>my/2 ){ - // ToDo: here we need the rotation around box2 - x30=box3->x0; - x31=box3->x1; - y30=box3->y0; - y31=box3->y1; - // get min. distances to lower and to right direction - if( y31 > box2->y1 && y30 < y4 ) y4=y30-1; - if( x31 > box2->x1 && x30 < x4 ) x4=x30-1; - } - } end_for_each(&(JOB->res.boxlist)); - // set the witdht and position of largest hor./vert. gap - // largest gap: width position - if( y4-box2->y1 > y3 ) { y3=y4-box2->y1; y2=(y4+box2->y1)/2; } - if( x4-box2->x1 > x3 ) { x3=x4-box2->x1; x2=(x4+box2->x1)/2; } - } - } end_for_each(&(JOB->res.boxlist)); - // fprintf(stderr,"\n widest y-gap= %4d %4d",y2,y3); - // fprintf(stderr,"\n widest x-gap= %4d %4d",x2,x3); - - i=0; // i=1 at x, i=2 at y - // this is the critical point - // is this a good decision or not??? - if(x3>0 || y3>0){ - if(x3>mx && x3>2*y3 && (dy>5*x3 || (x3>10*y3 && y3>0))) i=1; else - if(dx>5*y3 && y3>my) i=2; - } - - // compare with largest box??? - for_each_data(&(JOB->res.boxlist)) { // not very efficient, sorry - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if( box2->c == PICTURE ) - if( box2->y0>=y0 && box2->y1x0>=x0 && box2->x1x1-box2->x0+4 > dx && box2->y1+4y1+1; i=2; break; } - if( box2->x1-box2->x0+4 > dx && box2->y0-4>y0 ) { y3=1; y2=box2->y0-1; i=2; break; } - if( box2->y1-box2->y0+4 > dy && box2->x1+4x1+1; i=1; break; } - if( box2->y1-box2->y0+4 > dy && box2->x0-4>x0 ) { x3=1; x2=box2->x0-1; i=1; break; } - } - } end_for_each(&(JOB->res.boxlist)); - if(JOB->cfg.verbose)fprintf(stderr," i=%d",i); - - if(JOB->cfg.verbose && i) fprintf(stderr," divide at %s x=%4d y=%4d dx=%4d dy=%4d", - ((i)?( (i==1)?"x":"y" ):"?"),x2,y2,x3,y3); - // divide horizontally if v-gap is thicker than h-gap - // and length is larger 5*width - if(i==1){ detect_lines2(p,x0,y0,x2-x0+1,dy,r+1); - return detect_lines2(p,x2,y0,x0+dx-x2+1,dy,r+1); } - // divide vertically - if(i==2){ detect_lines2(p,x0,y0,dx,y2-y0+1,r+1); - return detect_lines2(p,x0,y2,dx,y0+dy-y2+1,r+1); - } - } - - - if(JOB->cfg.verbose) if(dx<5 || dy<7)fprintf(stderr," empty box"); - if(dx<5 || dy<7) return 0; // do not care about dust - if(JOB->cfg.verbose)fprintf(stderr, " box detected at %4d %4d %4d %4d",x0,y0,dx,dy); - if(JOB->tmp.ppo.p){ - for(i=0;itmp.ppo,x0+i ,y0 ,255,16); - for(i=0;itmp.ppo,x0+i ,y0+dy-1,255,16); - for(i=0;itmp.ppo,x0 ,y0+i ,255,16); - for(i=0;itmp.ppo,x0+dx-1,y0+i ,255,16); - // writebmp("out10.bmp",p2,JOB->cfg.verbose); // colored should be better - } - return detect_lines1(p,x0-0*1,y0-0*2,dx+0*2,dy+0*3); - -/* - struct tlines *lines = &JOB->res.lines; - i=lines->num; lines->num++; - lines->m1[i]=y0; lines->m2[i]=y0+5*dy/16; - lines->m3[i]=y0+12*dy/16; lines->m4[i]=y0+dy-1; - lines->x0[i]=x0; lines->x1[i]=x0+dx-1; - if(JOB->cfg.verbose)fprintf(stderr," - line= %d",lines->num); - return 0; - */ -} - -/* ToDo: herons algorithm for square root x=(x+y/x)/2 is more efficient - * than interval subdivision (?) (germ.: Intervallschachtelung) - * without using matlib - * see http://www.math.vt.edu/people/brown/doc/sqrts.pdf - */ -int my_sqrt(int x){ - int y0=0,y1=x,ym; - for (;y0res.lines.{dx,dy} - * pass 1: get mean vector to nearest char - * pass 2: get mean vector to nearest char without outriders to pass 1 - * extimate direction as (dx,dy,num)[pass] - * ToDo: estimate an error, boxes only work fine for zero-rotation - * for 45 degree use vectors, not boxes to get base line - */ -#define INorm 1024 /* integer unit 1.0 */ -int detect_rotation_angle(job_t *job){ - struct box *box2, *box3, - *box_nn; /* nearest neighbour box */ - int x2, y2, x3, y3, dist, mindist, pass, - rx=0, ry=0, re=0, // final result - /* to avoid 2nd run, wie store pairs in 2 different categories */ - nn[4]={0,0,0,0}, /* num_pairs used for estimation [(pass-1)%2,pass%2] */ - dx[4]={0,0,0,0}, /* x-component of rotation vector per pass */ - dy[4]={0,0,0,0}, /* y-component of rotation vector per pass */ - er[4]={INorm/4,0,0,0}; /* mean angle deviation to pass-1 (radius^2) */ - // de; /* ToDo: absolute maximum error (dx^2+dy^2) */ - // ToDo: next pass: go to bigger distances and reduce max error - // error is diff between passes? or diff of bottoms and top borders (?) - - rx=1024; ry=0; // default - for (pass=0;pass<4;pass++) { - for_each_data(&(job->res.boxlist)) { - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - if (box2->c==PICTURE) continue; - /* subfunction probability of char */ - // i? - // if (box2->x1 - box2->x0 < 3) continue; /* smallest font is 4x6 */ - if (box2->y1 - box2->y0 < 4) continue; - /* set maximum possible distance */ - box_nn=box2; // initial box to compare with - - // ToDo: clustering or majority - // the algorithm is far from being perfect, pitfalls are likely - // but its better than the old algorithm, ToDo: database-rotated-images - mindist = job->src.p.x * job->src.p.x + job->src.p.y * job->src.p.y; - /* get middle point of the box */ - x2 = (box2->x0 + box2->x1)/2; - y2 = (box2->y0 + box2->y1)/2; - re=0; - /* search for nearest neighbour box_nn[pass+1] of box_nn[pass] */ - for_each_data(&(job->res.boxlist)) { - box3 = (struct box *)list_get_current(&(job->res.boxlist)); - /* try to select only potential neighbouring chars */ - /* select out all senseless combinations */ - if (box3->c==PICTURE || box3==box2) continue; - x3 = (box3->x0 + box3->x1)/2; - y3 = (box3->y0 + box3->y1)/2; /* get middle point of the box */ - if (x3 pass-1? - // scalprod max in direction, cross prod min in direction - // a,b (vectors): ^2/(|a|*|b|)^2 = 0(90deg)..0.5(45deg).. 1(0deg) - // * 1024 ?? - if (pass>0) { // new variant = scalar product - // danger of int overflow, ToDo: use int fraction - re =(int) ((1.*(x3-x2)*dx[pass-1]+(y3-y2)*dy[pass-1]) - *(1.*(x3-x2)*dx[pass-1]+(y3-y2)*dy[pass-1])*INorm - /(1.*((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)) - *(1.*dx[pass-1]*dx[pass-1]+dy[pass-1]*dy[pass-1]))); - if (INorm-re>er[pass-1]) continue; // hits mean deviation - } - /* neighbours should have same order of size (?) */ - if (3*(box3->y1-box3->y0+4) < 2*(box2->y1-box2->y0+1)) continue; - if (2*(box3->y1-box3->y0+1) > 3*(box2->y1-box2->y0+4)) continue; - if (2*(box3->x1-box3->x0+1) > 5*(box2->x1-box2->x0+4)) continue; - if (5*(box3->x1-box3->x0+4) < 2*(box2->x1-box2->x0+1)) continue; - /* should be in right range, Idea: center3 outside box2? noholes */ - if ((x3x1-1) && (x3>box2->x0+1) - && (y3y1-1) && (y3>box2->y0+1)) continue; - // if chars are of different size, connect careful - if ( abs(x3-x2) > 2*(box2->x1 - box2->x0 + box3->x1 - box3 ->x0 + 2)) continue; - if ( abs(y3-y2) > (box2->x1 - box2->x0 + box3->x1 - box3 ->x0 + 2)) continue; - dist = (y3-y2)*(y3-y2) + (x3-x2)*(x3-x2); - // make distances in pass-1 directions shorter or continue if not in pass-1 range? - if (dist<9) continue; /* minimum distance^2 is 3^2 */ - if (distres.boxlist)); - - if (box_nn==box2) continue; /* has no neighbour, next box */ - - box3=box_nn; dist=mindist; - x3 = (box3->x0 + box3->x1)/2; - y3 = (box3->y0 + box3->y1)/2; /* get middle point of the box */ - // dist = my_sqrt(1024*((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2))); - // compare with first box - x2 = (box2->x0 + box2->x1)/2; - y2 = (box2->y0 + box2->y1)/2; - // if the high of neighbouring boxes differ, use min diff (y0,y1) - if (pass>0 && 16*abs(dy[pass-1]) < dx[pass-1]) // dont work for strong rot. - if (abs(box2->y1-box2->y0-box3->y1+box3->y0)>(box2->y1-box2->y0)/8) { - // ad eh ck ... - if (abs(box2->y1-box3->y1)y1; y3=box3->y1; } - // ag ep qu ... - if (abs(box2->y0-box3->y0)y0; y3=box3->y0; } - } - if (abs(x3-x2)<4) continue; - dx[pass]+=(x3-x2)*1024; /* normalized before averaging */ - dy[pass]+=(y3-y2)*1024; /* 1024 is for the precision */ - nn[pass]++; - if (pass>0) { // set error = mean deviation from pass -1 - re = INorm-(int)((1.*(x3-x2)*dx[pass-1]+(y3-y2)*dy[pass-1]) - *(1.*(x3-x2)*dx[pass-1]+(y3-y2)*dy[pass-1])*INorm - /((1.*(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)) - *(1.*dx[pass-1]*dx[pass-1]+dy[pass-1]*dy[pass-1])) - ); - er[pass]+=re; - } -#if 0 - if(JOB->cfg.verbose) - fprintf(stderr,"# next nb (x,y,dx,dy,re) %6d %6d %5d %5d %5d pass %d\n", - x2, y2, x3-x2, y3-y2, re, pass+1); -#endif - } end_for_each(&(job->res.boxlist)); - if (!nn[pass]) break; - if (nn[pass]) { - /* meanvalues */ - rx=dx[pass]/=nn[pass]; - ry=dy[pass]/=nn[pass]; - if (pass>0) er[pass]/=nn[pass]; - } - if(JOB->cfg.verbose) - fprintf(stderr,"# rotation angle (x,y,maxr,num)" - " %6d %6d %6d %4d pass %d\n", - rx, ry, er[pass], nn[pass], pass+1); - } - if (abs(ry*100)>abs(rx*50)) - fprintf(stderr,"\n"); - /* ToDo: normalize to 2^10 bit (square fits to 32 it) */ - JOB->res.lines.dx=rx; - JOB->res.lines.dy=ry; - return 0; -} - -/* ----- detect lines --------------- */ -int detect_text_lines(pix * pp, int mo) { - - if (JOB->cfg.verbose) - fprintf(stderr, "# detect.c detect_text_lines (vvv=16 for more info) "); - if (mo & 4){ - if (JOB->cfg.verbose) fprintf(stderr, "# zoning\n# ... "); - detect_lines2(pp, 0, 0, pp->x, pp->y, 0); // later replaced by better algo - } else - detect_lines1(pp, 0, 0, pp->x, pp->y); // old algo - - if(JOB->cfg.verbose) fprintf(stderr,"\n"); - return 0; -} - - -/* ----- adjust lines --------------- */ -// rotation angle? JOB->res.lines.dy, .x0 removed later -// this is for cases, where m1..m4 is not very sure detected before -// chars are recognized -int adjust_text_lines(pix * pp, int mo) { - struct box *box2; - int *m, /* summ m1..m4, num_chars for m1..m4, min m1..m4, max. m1..m4 */ - l, i, dy, dx, diff=0, y0, y1; - - if ((l=JOB->res.lines.num)<2) return 0; // ??? - if (JOB->cfg.verbose) - fprintf(stderr, "# adjust text lines "); - m=(int *)malloc(l*16*sizeof(int)); - if (!m) { fprintf(stderr," malloc failed\n"); return 0;} - for (i=0;i<16*l;i++) m[i]=0; /* initialize */ - dy=JOB->res.lines.dy; /* tan(alpha) of skewing */ - dx=JOB->res.lines.dx; /* old: width of image */ - // js: later skewing is replaced by one transformation of vectorized image - - if (dx) - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->line<=0) continue; - if (box2->num_ac<1) continue; - if (box2->wac[0]<95) continue; - if (box2->m2==0 || box2->y1m2) continue; // char outside line - if (box2->m3==4 || box2->y0>box2->m3) continue; // char outside line - y0=box2->y0-((box2->x1)*dy/dx); /* corrected by page skewing */ - y1=box2->y1-((box2->x1)*dy/dx); - if (strchr("aemnr",(char)box2->tac[0])) { // cC vV sS oO ... is unsure! - m[box2->line*16+1]+=y0; m[box2->line*16+5]++; // num m2 - m[box2->line*16+2]+=y1; m[box2->line*16+6]++; // num m3 - if (m[box2->line*16+ 9]>y0) m[box2->line*16+ 9]=y0; /* min m2 */ - if (m[box2->line*16+13]line*16+13]=y0; /* max m2 */ - if (m[box2->line*16+10]>y1) m[box2->line*16+10]=y1; /* min m3 */ - if (m[box2->line*16+14]line*16+14]=y1; /* max m3 */ - } - if (strchr("bdhklABDEFGHIKLMNRT123456789",(char)box2->tac[0])) { - m[box2->line*16+0]+=y0; m[box2->line*16+4]++; // num m1 - m[box2->line*16+2]+=y1; m[box2->line*16+6]++; // num m3 - if (m[box2->line*16+ 8]>y0) m[box2->line*16+ 8]=y0; /* min m1 */ - if (m[box2->line*16+12]line*16+12]=y0; /* max m1 */ - if (m[box2->line*16+10]>y1) m[box2->line*16+10]=y1; /* min m3 */ - if (m[box2->line*16+14]line*16+14]=y1; /* max m3 */ - } - if (strchr("gq",(char)box2->tac[0])) { - m[box2->line*16+1]+=y0; m[box2->line*16+5]++; // num m2 - m[box2->line*16+3]+=y1; m[box2->line*16+7]++; // num m4 - if (m[box2->line*16+ 9]>y0) m[box2->line*16+ 9]=y0; /* min m2 */ - if (m[box2->line*16+13]line*16+13]=y0; /* max m2 */ - if (m[box2->line*16+11]>y1) m[box2->line*16+11]=y1; /* min m4 */ - if (m[box2->line*16+15]line*16+15]=y1; /* max m4 */ - } - } end_for_each(&(JOB->res.boxlist)); - - for (i=1;ires.lines.m1[i]-m[i*16+0]/m[i*16+4]); - if (m[i*16+5]) diff+=abs(JOB->res.lines.m2[i]-m[i*16+1]/m[i*16+5]); - if (m[i*16+6]) diff+=abs(JOB->res.lines.m3[i]-m[i*16+2]/m[i*16+6]); - if (m[i*16+7]) diff+=abs(JOB->res.lines.m4[i]-m[i*16+3]/m[i*16+7]); - /* recalculate sureness, empirically */ - if (m[i*16+4]*m[i*16+5]*m[i*16+6]*m[i*16+7] > 0) - JOB->res.lines.wt[i]=(JOB->res.lines.wt[i]+100)/2; - else - JOB->res.lines.wt[i]=(JOB->res.lines.wt[i]*90)/100; - // set mean values of sure detected bounds (rounded precisely) - if ( m[i*16+4]) JOB->res.lines.m1[i]=(m[i*16+0]+m[i*16+4]/2)/m[i*16+4]; - if ( m[i*16+5]) JOB->res.lines.m2[i]=(m[i*16+1]+m[i*16+5]/2)/m[i*16+5]; - if ( m[i*16+6]) JOB->res.lines.m3[i]=(m[i*16+2]+m[i*16+6]/2)/m[i*16+6]; - if ( m[i*16+7]) JOB->res.lines.m4[i]=(m[i*16+3]+m[i*16+7]/2)/m[i*16+7]; - // care about very small fonts - if (JOB->res.lines.m2[i]-JOB->res.lines.m1[i]<=1 && m[i*16+5]==0 && m[i*16+4]) - JOB->res.lines.m2[i]=JOB->res.lines.m1[i]+2; - if (JOB->res.lines.m2[i]-JOB->res.lines.m1[i]<=1 && m[i*16+4]==0 && m[i*16+5]) - JOB->res.lines.m1[i]=JOB->res.lines.m2[i]-2; - if (JOB->res.lines.m4[i]-JOB->res.lines.m3[i]<=1 && m[i*16+7]==0 && m[i*16+6]) - JOB->res.lines.m4[i]=JOB->res.lines.m3[i]+2; - if (JOB->res.lines.m4[i]-JOB->res.lines.m3[i]<=1 && m[i*16+6]==0 && m[i*16+7]) - JOB->res.lines.m3[i]=JOB->res.lines.m4[i]-2; - if ( m[i*16+7]<1 && - JOB->res.lines.m4[i] - <=JOB->res.lines.m3[i]+(JOB->res.lines.m3[i]-JOB->res.lines.m2[i])/4 ) - JOB->res.lines.m4[i]= - JOB->res.lines.m3[i]+(JOB->res.lines.m3[i]-JOB->res.lines.m2[i])/4; - if ( m[i*16+7]<1 && m[i*16+12+2]>0 && // m4 < max.m3+.. - JOB->res.lines.m4[i] < 2*m[i*16+12+2]-JOB->res.lines.m3[i]+2 ) - JOB->res.lines.m4[i] = 2*m[i*16+12+2]-JOB->res.lines.m3[i]+2; - if (JOB->res.lines.m4[i]<=JOB->res.lines.m3[i]) - JOB->res.lines.m4[i]= JOB->res.lines.m3[i]+1; /* 4x6 */ - - if (JOB->cfg.verbose & 17) - fprintf(stderr, "\n# line= %3d m= %4d %+3d %+3d %+3d " - " n= %2d %2d %2d %2d w= %3d diff= %d", - i, JOB->res.lines.m1[i], - JOB->res.lines.m2[i] - JOB->res.lines.m1[i], - JOB->res.lines.m3[i] - JOB->res.lines.m1[i], - JOB->res.lines.m4[i] - JOB->res.lines.m1[i], - m[i*16+4],m[i*16+5],m[i*16+6],m[i*16+7], - JOB->res.lines.wt[i], diff); - } - diff=0; // count adjusted chars -#if 1 - if (dx) - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->line<=0) continue; - /* check if box was on the wrong line, ToDo: search a better line */ - if (2*box2->y0<2*JOB->res.lines.m1[box2->line] - -JOB->res.lines.m4[box2->line] - +JOB->res.lines.m1[box2->line]) box2->line=0; - if (2*box2->y1>2*JOB->res.lines.m4[box2->line] - +JOB->res.lines.m4[box2->line] - -JOB->res.lines.m1[box2->line]) box2->line=0; - /* do adjustments */ - if (box2->num_ac>0 - && box2->num_ac > 31 && box2->tac[0] < 127 /* islower(>256) may SIGSEGV */ - && strchr("cCoOpPsSuUvVwWxXyYzZ",(char)box2->tac[0])) { // no_wchar - if (box2->y0-((box2->x1)*dy/dx) - < (JOB->res.lines.m1[box2->line]+JOB->res.lines.m2[box2->line])/2 - && islower(box2->tac[0]) - ) { setac(box2,toupper((char)box2->tac[0]),(box2->wac[0]+101)/2); diff++; } - if (box2->y0-((box2->x1)*dy/dx) - > (JOB->res.lines.m1[box2->line]+JOB->res.lines.m2[box2->line]+1)/2 - && isupper(box2->tac[0]) - ){ setac(box2,tolower((char)box2->tac[0]),(box2->wac[0]+101)/2); diff++; } - } - box2->m1=JOB->res.lines.m1[box2->line]+((box2->x1)*dy/dx); - box2->m2=JOB->res.lines.m2[box2->line]+((box2->x1)*dy/dx); - box2->m3=JOB->res.lines.m3[box2->line]+((box2->x1)*dy/dx); - box2->m4=JOB->res.lines.m4[box2->line]+((box2->x1)*dy/dx); - } end_for_each(&(JOB->res.boxlist)); -#endif - - free(m); - if(JOB->cfg.verbose) fprintf(stderr,"\n# changed_chars= %d\n",diff); - return(diff); -} - -/* ---- measure mean character - * recalculate mean width and high after changes in boxlist - * ToDo: only within a Range? - */ -int calc_average() { - int i = 0, x0, y0, x1, y1; - struct box *box4; - - JOB->res.numC = 0; - JOB->res.sumY = 0; - JOB->res.sumX = 0; - for_each_data(&(JOB->res.boxlist)) { - box4 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if( box4->c != PICTURE ){ - x0 = box4->x0; x1 = box4->x1; - y0 = box4->y0; y1 = box4->y1; - i++; - if (JOB->res.avX * JOB->res.avY > 0) { - if (x1 - x0 + 1 > 4 * JOB->res.avX - && y1 - y0 + 1 > 4 * JOB->res.avY) continue; /* small picture */ - if (4 * (y1 - y0 + 1) < JOB->res.avY || y1 - y0 < 2) - continue; // dots .,-_ etc. - } - if (x1 - x0 + 1 < 4 - && y1 - y0 + 1 < 6 ) continue; /* dots etc */ - JOB->res.sumX += x1 - x0 + 1; - JOB->res.sumY += y1 - y0 + 1; - JOB->res.numC++; - } - } end_for_each(&(JOB->res.boxlist)); - if ( JOB->res.numC ) { /* avoid div 0 */ - JOB->res.avY = (JOB->res.sumY+JOB->res.numC/2) / JOB->res.numC; - JOB->res.avX = (JOB->res.sumX+JOB->res.numC/2) / JOB->res.numC; - } - if (JOB->cfg.verbose){ - fprintf(stderr, "# averages: mXmY= %d %d nC= %d n= %d\n", - JOB->res.avX, JOB->res.avY, JOB->res.numC, i); - } - return 0; -} - - -/* ---- analyse boxes, find pictures and mark (do this first!!!) - */ -int detect_pictures(job_t *job) { - int i = 0, x0, y0, x1, y1, num_h; - struct box *box2, *box4; - - if ( job->res.numC == 0 ) { - if (job->cfg.verbose) fprintf(stderr, - "# detect.C L%d Warning: numC=0\n", __LINE__); - return -1; - } - /* ToDo: set Y to uppercase mean value? */ - job->res.avY = (job->res.sumY+job->res.numC/2) / job->res.numC; - job->res.avX = (job->res.sumX+job->res.numC/2) / job->res.numC; - /* ToDo: two highest volumes? crosses, on extreme volume + on border */ - if (job->cfg.verbose) - fprintf(stderr, "# detect.C L%d pictures, frames, mXmY= %d %d ... ", - __LINE__, job->res.avX, job->res.avY); - for_each_data(&(job->res.boxlist)) { - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - if (box2->c == PICTURE) continue; - x0 = box2->x0; x1 = box2->x1; - y0 = box2->y0; y1 = box2->y1; - - /* pictures could be of unusual size */ - if (x1 - x0 + 1 > 4 * job->res.avX || y1 - y0 + 1 > 4 * job->res.avY) { - /* count objects on same baseline which could be chars */ - /* else: big headlines could be misinterpreted as pictures */ - num_h=0; - for_each_data(&(job->res.boxlist)) { - box4 = (struct box *)list_get_current(&(job->res.boxlist)); - if (box4->c == PICTURE) continue; - if (box4->y1-box4->y0 > 2*(y1-y0)) continue; - if (2*(box4->y1-box4->y0) < y1-y0) continue; - if (box4->y0 > y0 + (y1-y0+1)/2 - || box4->y0 < y0 - (y1-y0+1)/2 - || box4->y1 > y1 + (y1-y0+1)/2 - || box4->y1 < y1 - (y1-y0+1)/2) continue; - // ToDo: continue if numcross() only 1, example: |||IIIll||| - num_h++; - } end_for_each(&(job->res.boxlist)); - if (num_h>4) continue; - box2->c = PICTURE; - i++; - } - /* ToDo: pictures could have low contrast=Sum((pixel(p,x,y)-160)^2) */ - } end_for_each(&(job->res.boxlist)); - // start second iteration - if (job->cfg.verbose) { - fprintf(stderr, " %d - boxes %d\n", i, job->res.numC-i); - } - calc_average(); - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/gocr.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/gocr.h deleted file mode 100644 index a252ba608..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/gocr.h +++ /dev/null @@ -1,286 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2006 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL-address - - sometimes I have written comments in german language, sorry for that - - - look for ??? for preliminary code -*/ - -/* General headerfile with gocr-definitions */ - -#ifndef __GOCR_H__ -#define __GOCR_H__ - -#include "pnm.h" -#include "unicode.h" -#include "list.h" -#include -#ifdef HAVE_GETTIMEOFDAY -#include -#endif - -/* - * wchar_t should always exist (ANSI), but WCHAR.H is sometimes missing - * USE_UNICODE should be removed or replaced by HAVE_WCHAR_H in future - */ -#ifdef HAVE_WCHAR_H -#define USE_UNICODE 1 -#endif - -/* extern "C"{ */ -/* ------------------------ feature extraction ----------------- */ -#define AT 7 /* mark */ -#define M1 1 /* mark */ -enum direction { - UP=1, DO, RI, LE -}; -typedef enum direction DIRECTION; -#define ST 7 /* stop */ -/* ------------------------------------------------------------- */ -/* detect maximas in of line overlapps (return in %) and line koord */ -#define HOR 1 /* horizontal */ -#define VER 2 /* vertikal */ -#define RIS 3 /* rising=steigend */ -#define FAL 4 /* falling=fallend */ - -#define MAXlines 1024 - -/* ToDo: if we have a tree instead of a list, a line could be a node object */ -struct tlines { - int num; - int dx, dy; /* direction of text lines (straight/skew) */ - int m1[MAXlines], /* start of line = upper bound of 'A' */ - m2[MAXlines], /* upper bound of 'e' */ - m3[MAXlines], /* lower bound of 'e' = baseline */ - m4[MAXlines]; /* stop of line = lower bound of 'q' */ - int x0[MAXlines], - x1[MAXlines]; /* left and right border */ - int wt[MAXlines]; /* weight, how sure thats correct in percent, v0.41 */ - int pitch[MAXlines]; /* word pitch (later per box?), v0.41 */ - int mono[MAXlines]; /* spacing type, 0=proportional, 1=monospaced */ -}; - -#define NumAlt 10 /* maximal number of alternative chars (table length) */ -#define MaxNumFrames 8 /* maximum number of frames per char/box */ -#define MaxFrameVectors 128 /* maximum vectors per frame (*8=1KB/box) */ -/* ToDo: use only malloc_box(),free_box(),copybox() for creation, destroy etc. - * adding reference_counter to avoid pointer pointing to freed box - */ -struct box { /* this structure should contain all pixel infos of a letter */ - int x0,x1,y0,y1,x,y,dots; /* xmin,xmax,ymin,ymax,reference-pixel,i-dots */ - int num_boxes, /* 1 "abc", 2 "!i?", 3 "ä" (composed objects) 0.41 */ - num_subboxes; /* 1 for "abdegopqADOPQR", 2 for "B" (holes) 0.41 */ - wchar_t c; /* detected char (same as tac[0], obsolete?) */ - wchar_t modifier; /* default=0, see compose() in unicode.c */ - int num; /* same number = same char */ - int line; /* line number (points to struct tlines lines) */ - int m1,m2,m3,m4; /* m2 = upper boundary, m3 = baseline */ - /* planed: sizeof hole_1, hole_2, certainty (run1=100%,run2=90%,etc.) */ - pix *p; /* pointer to pixmap (v0.2.5) */ - /* tac, wac is used together with setac() to manage very similar chars */ - int num_ac; /* length of table (alternative chars), default=0 */ - wchar_t tac[NumAlt]; /* alternative chars, only used by setac(),getac() */ - int wac[NumAlt]; /* weight of alternative chars */ - char *tas[NumAlt]; /* alternative UTF8-strings or XML codes if tac[]=0 */ - /* replacing old obj */ - /* ToDo: (*obj)[NumAlt] + olen[NumAlt] ??? */ - /* ToDo: bitmap for possible Picture|Object|Char ??? */ -/* char *obj; */ /* pointer to text-object ... -> replaced by tas[] */ - /* ... (melted chars, barcode, picture coords, ...) */ - /* must be freed before box is freed! */ - /* do _not_ copy only the pointer to object */ - /* -------------------------------------------------------- - * extension since v0.41 js05, Store frame vectors, - * which is a table of vectors sourrounding the char and its - * inner white holes. The advantage is the independence from - * resolution, handling of holes, overlap and rotation. - * --------------------------------------------------------- */ - int num_frames; /* number of frames: 1 for cfhklmnrstuvwxyz */ - /* 2 for abdegijopq */ - int frame_vol[MaxNumFrames]; /* volume inside frame +/- (black/white) */ - int frame_per[MaxNumFrames]; /* periphery, summed length of vectors */ - int num_frame_vectors[MaxNumFrames]; /* index to next frame */ - /* biggest frame should be stored first (outer frame) */ - /* biggest has the maximum pair distance */ - /* num vector loops */ - int frame_vector[MaxFrameVectors][2]; /* may be 16*int=fixpoint_number */ - -}; -typedef struct box Box; - -/* true if the coordination pair (a,b) is outside the image p */ -#define outbounds(p, a, b) (a < 0 || b < 0 || a >= (p)->x || b >= (p)->y) - -/* ToDo: this structure seems to be obsolete, remove it */ -typedef struct path { - int start; /* color at the beginning of the path, (0=white, 1=black) */ - int *x; /* x coordinates of transitions */ - int *y; /* y coordinates of transitions */ - int num; /* current number of entries in x or y */ - int max; /* maximum number of entries in x or y */ - /* (if more values need to be stored, the arrays are enlarged) */ -} path_t; - -/* job_t contains all information needed for an OCR task */ -typedef struct job_s { - struct { /* source data */ - char *fname; /* input filename; default value: "-" */ - pix p; /* source pixel data, pixelmap 8bit gray */ - } src; - struct { /* temporary stuff, e.g. buffers */ -#ifdef HAVE_GETTIMEOFDAY - struct timeval init_time; /* starting time of this job */ -#endif - pix ppo; /* pixmap for visual debugging output, obsolete */ - - /* sometimes recognition function is called again and again, if result was 0 - n_run tells the pixel function to return alternative results */ - int n_run; /* num of run, if run_2 critical pattern get other results */ - /* used for 2nd try, pixel uses slower filter function etc. */ - List dblist; /* list of boxes loaded from the character database */ - } tmp; - struct { /* results */ - List boxlist; /* store every object in a box, which contains */ - /* the characteristics of the object (see struct box) */ - List linelist; /* recognized text lines after recognition */ - - struct tlines lines; /* used to access to line-data (statistics) */ - /* here the positions (frames) of lines are */ - /* stored for further use */ - int avX,avY; /* average X,Y (avX=sumX/numC) */ - int sumX,sumY,numC; /* sum of all X,Y; num chars */ - } res; - struct { /* configuration */ - int cs; /* critical grey value (pixel black pixel) */ - /* range: 0..255, 0 means autodetection */ - int spc; /* spacewidth/dots (0 = autodetect); default value: 0 */ - int mode; /* operation modes; default value: 0 */ - /* operation mode (see --help) */ - int dust_size; /* dust size; default value: 10 */ - int only_numbers; /* numbers only; default value: 0 */ - int verbose; /* verbose mode; default value: 0 */ - /* verbose option (see --help) */ - FORMAT out_format; /* output format; default value: ISO8859_1*/ - char *lc; /* debuglist of chars (_ = not recognized chars) */ - /* default value: "_" */ - char *db_path; /* pathname for database; default value: NULL */ - char *cfilter; /* char filter; default value: NULL, ex: "A-Za-z" */ - /* limit of certainty where chars are accepted as identified */ - int certainty; /* in units of 100 (percent); 0..100; default 95 */ - } cfg; -} job_t; - -/* initialze job structure */ -void job_init(job_t *job); - -/* free job structure */ -void job_free(job_t *job); - -/*FIXME jb: remove JOB; */ -extern job_t *JOB; - -/* calculate the overlapp of the line (0-1) with black points - * by rekursiv bisection - * (evl. Fehlertoleranz mit pixel in Umgebung dx,dy suchen) (umschaltbar) ??? - * MidPoint Line Algorithm (Bresenham) Foley: ComputerGraphics better? - * will be replaced by vector functions - */ - -/* gerade y=dy/dx*x+b, implizit d=F(x,y)=dy*x-dx*y+b*dx=0 - * incrementell y(i+1)=m*(x(i)+1)+b, F(x+1,y+1)=f(F(x,y)) */ -int get_line(int x0, int y0, int x1, int y1, pix *p, int cs, int ret); -int get_line2(int x0, int y0, int x1, int y1, pix *p, int cs, int ret); - -/* look for white 0x02 or black 0x01 dots (0x03 = white+black) */ -char get_bw(int x0, int x1, int y0, int y1, - pix *p, int cs,int mask); - -/* look for black crossing a line x0,y0,x1,y1 - * follow line and count crossings ([white]-black-transitions) - */ -int num_cross(int x0, int x1, int y0, int y1, - pix *p, int cs); - -/* memory allocation with error checking */ -void *xrealloc(void *ptr, size_t size); - -/* follow a line x0,y0,x1,y1 recording locations of transitions, - * return count of transitions - */ -int follow_path(int x0, int x1, int y0, int y1, pix *p, int cs, path_t *path); - -/* ------------------------------------------------------------- - * mark edge-points - * - first move forward until b/w-edge - * - more than 2 pixel? - * - loop around - * - if forward pixel : go up, rotate right - * - if forward no pixel : rotate left - * - stop if found first 2 pixel in same order - * mit an rechter-Wand-entlang-gehen strategie - * -------------------------------------------------------------- - * turmite game: inp: start-x,y, regel r_black=UP,r_white=RIght until border - * out: last-position - * Zaehle dabei, Schritte,Sackgassen,xmax,ymax,ro-,ru-,lo-,lu-Ecken - * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * - * is this the right place for declaration? - */ -void turmite(pix *p, int *x, int *y, - int x0, int x1, int y0, int y1, int cs, int rw, int rb); - -/* test if points are connected via t-pixel (rekursiv!) */ -int joined(pix *p, int x0, int y0, int x1, int y1, int cs); - -/* move from x,y to direction r until pixel or l steps - * return number of steps - */ -int loop(pix *p, int x, int y, int l, int cs, int col, DIRECTION r); - -#define MAX_HOLES 3 -typedef struct list_holes { - int num; /* numbers of holes, initialize with 0 */ - struct hole_s { - int size,x,y,x0,y0,x1,y1; /* size, start point, outer rectangle */ - } hole[MAX_HOLES]; -} holes_t; - -/* look for white holes surrounded by black points - * at moment white point with black in all four directions - */ -int num_hole(int x0, int x1, int y0, int y1, pix *p, int cs, holes_t *holes); - -/* count for black nonconnected objects --- used for i,auml,ouml,etc. */ -int num_obj(int x0, int x1, int y0, int y1, pix *p, int cs); - -int distance( pix *p1, struct box *box1, /* box-frame */ - pix *p2, struct box *box2, int cs); - -/* call the OCR engine ;) */ -/* char whatletter(struct box *box1,int cs); */ - -/* declared in pixel.c */ -/* getpixel() was pixel() but it may collide with netpnm pixel declaration */ -int getpixel(pix *p, int x, int y); -int marked(pix *p, int x, int y); -void put(pix * p, int x, int y, int ia, int io); - -/* } */ /* extern C */ -#endif /* __GOCR_H__ */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/job.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/job.c deleted file mode 100644 index 9cfb5d86c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/job.c +++ /dev/null @@ -1,86 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2006 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for email address */ - -#include -#include -#include -#include "pgm2asc.h" -#include "gocr.h" - -/* initialize job structure */ -void job_init(job_t *job) { - /* init source */ - job->src.fname = "-"; - /* FIXME jb: init pix */ - job->src.p.p = NULL; - - /* init results */ - list_init( &job->res.boxlist ); - list_init( &job->res.linelist ); - job->res.avX = 5; - job->res.avY = 8; - job->res.sumX = 0; - job->res.sumY = 0; - job->res.numC = 0; - job->res.lines.dy=0; - job->res.lines.num=0; - - /* init temporaries */ - list_init( &job->tmp.dblist ); - job->tmp.n_run = 0; - /* FIXME jb: init ppo */ - job->tmp.ppo.p = NULL; - job->tmp.ppo.x = 0; - job->tmp.ppo.y = 0; - - /* init cfg */ - job->cfg.cs = 0; - job->cfg.spc = 0; - job->cfg.mode = 0; - job->cfg.dust_size = -1; /* auto detect */ - job->cfg.only_numbers = 0; - job->cfg.verbose = 0; - job->cfg.out_format = UTF8; /* old: ISO8859_1; */ - job->cfg.lc = "_"; - job->cfg.db_path = (char*)NULL; - job->cfg.cfilter = (char*)NULL; - job->cfg.certainty = 95; -} - -/* free job structure */ -void job_free(job_t *job) { - - /* if tmp is just a copy of the pointer to the original image */ - if (job->tmp.ppo.p==job->src.p.p) job->tmp.ppo.p=NULL; - - /* FIMXE jb: free lists - * list_free( &job->res.linelist ); - * list_free( &job->tmp.dblist ); - */ - - list_and_data_free(&(job->res.boxlist), (void (*)(void *))free_box); - - /* FIXME jb: free pix */ - if (job->src.p.p) { free(job->src.p.p); job->src.p.p=NULL; } - - /* FIXME jb: free pix */ - if (job->tmp.ppo.p) { free(job->tmp.ppo.p); job->tmp.ppo.p=NULL; } - -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/lines.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/lines.c deleted file mode 100644 index 396000dd3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/lines.c +++ /dev/null @@ -1,348 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2006 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL-address -*/ - -#include -#include -#include -#include -#include -#include "pgm2asc.h" -#include "gocr.h" -#include "unicode.h" - -const char *getTextLine (int line) { - int i; - Element *elem; - - if (line < 0 || line > list_total(&(JOB->res.linelist))) - return NULL; - - for ( i = 0, elem = JOB->res.linelist.start.next; i < line && elem != NULL; i++ ) - elem = elem->next; - - if ( elem != NULL ) - return (const char *)elem->data; - - return NULL; -} - -void free_textlines(void) { - for_each_data(&(JOB->res.linelist)) { - if (list_get_current(&(JOB->res.linelist))) - free(list_get_current(&(JOB->res.linelist))); - } end_for_each(&(JOB->res.linelist)); - list_free(&(JOB->res.linelist)); -} - -/* append a string (s1) to the string buffer (buffer) of length (len) - * if buffer is to small or len==0 realloc buffer, len+=512 - */ -char *append_to_line(char *buffer, const char *s1, int *len) { - char *temp; - int slen=0, alen; - if( s1==NULL || s1[0] == 0 ){ - fprintf(stderr,"\n#BUG: appending 0 to a line makes no sense!"); - return buffer; - } - if ( *len>0 ) slen= strlen(buffer); // used buffer - alen = strlen(s1); - if ( slen+alen+1 >= *len ) { - *len+=512; - temp = (char *)realloc(buffer, *len); - if( !temp ) { fprintf(stderr,"realloc failed!\n"); *len-=512; return buffer; } - else buffer = temp; // buffer successfull enlarged - } - temp = buffer + slen; // end of buffered string - memcpy(temp,s1,alen+1); // copy including end sign '\0' - return buffer; -} - -int calc_median_gap(struct tlines * lines) { - int gaps[MAXlines], l; - if (lines->num<2) return 0; - for (l = 0; l < lines->num - 1; l++) - gaps[l] = lines->m2[l + 1] - lines->m3[l]; - qsort(gaps, lines->num - 1, sizeof(gaps[0]), intcompare); - return gaps[(lines->num - 1) / 2]; -} - -/* - * Return the indent in pixels of the least-indented line. - * Will be subtracted as base_indent to avoid negativ indent. - * - * This is adjusted to account for an angle on the page as - * a whole. For instance, if the page is rotated clockwise, - * lower lines may be physically closer to the left edge - * than higher lines that are logically less indented. - * We rotate around (0,0). Note that this rotation could - * rotate lines "off the left margin", leading to a negative - * indent. - * - * boxlist -- list of character boxes. - * dx, dy -- rotation angle as vector - */ -int get_least_line_indent(List * boxlist, int dx, int dy) { - int min_indent = INT_MAX; - int adjusted_indent; - struct box * box2; - if (JOB->cfg.verbose) - fprintf(stderr, "get_least_line_indent: rot.vector dxdy %d %d\n", - dx, dy); - for_each_data(boxlist) { - box2 = (struct box *)list_get_current(boxlist); - /* if num == -1, indicates this is a space or newline box, - * inserted in list_insert_spaces. */ - if (box2->num != -1) { - adjusted_indent = box2->x0; - if (dx) adjusted_indent += box2->y0 * dy / dx; - if (adjusted_indent < min_indent) { - min_indent = adjusted_indent; - if (dy!=0 && JOB->cfg.verbose) - fprintf(stderr, - "# Line %2d, unadjusted xy %3d %3d, adjusted x %2d\n", - box2->line, box2->x0, box2->y0, adjusted_indent); - } - } - } end_for_each(boxlist); - if (JOB->cfg.verbose) - fprintf(stderr, "# Minimum adjusted x: %d (min_indent)\n", min_indent); - return min_indent; -} - -/* collect all the chars from the box tree and write them to a string buffer - mo is the mode: mode&8 means, use chars even if unsure recognized - ToDo: store full text(?), store decoded text+boxes+position chars (v0.4) - (HTML,UTF,ASCII,XML), not wchar incl. dexcriptions (at<95% in red) - remove decode(*c, job->cfg.out_format) from gocr.c! - XML add alternate-tags, format tags and position tags - ToDo: better output XML to stdout instead of circumstantial store to lines - not all texts/images follow the line concept? - Better use a tree of objects where leafes are chars instead of simple list. - Chars or objects are taken into account. Objects can be text strings - or XML strings. - */ -void store_boxtree_lines(int mo) { - char *buffer; /* temp buffer for text */ - int i = 0, j = 0; - int len = 1024; // initial buffer length for text line - struct box *box2; - int median_gap = 0; - int max_single_space_gap = 0; - struct tlines line_info; - int line, line_gap, oldline=-1; - int left_margin; - int i1=0, i2=0; - - buffer = (char *)malloc(len); - if ( !buffer ) { - fprintf(stderr,"malloc failed!\n"); // ToDo: index_to_error_list - return; - } - *buffer = 0; - - if ( JOB->cfg.verbose&1 ) - fprintf(stderr,"# store boxtree to lines ..."); - - /* wew: calculate the median line gap, to determine line spacing - * for the text output. The line gap used is between one line's - * m3 (baseline) and the next line's m2 (height of non-rising - * lowercase). We use these lines as they are the least likely - * to vary according to actual character content of lines. - */ - median_gap = calc_median_gap(&JOB->res.lines); - if (median_gap <= 0) { - fprintf(stderr, "# Warning: non-positive median line gap of %d\n", - median_gap); - median_gap = 8; - max_single_space_gap = 12; /* arbitrary */ - } else { - max_single_space_gap = median_gap * 7 / 4; - } - - // Will be subtracted as base_indent to avoid negativ indent. - left_margin = get_least_line_indent(&JOB->res.boxlist, - JOB->res.lines.dx, - JOB->res.lines.dy); - - if (JOB->cfg.out_format==XML) { /* subject of change */ - char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ - /* output lot of usefull information for XML filter */ - sprintf(s1,"\n", - 0,0,0,0); - buffer=append_to_line(buffer,s1,&len); - sprintf(s1,"\n", - 0,0,0,0); - buffer=append_to_line(buffer,s1,&len); - } - - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - line = box2->line; - line_info = JOB->res.lines; - /* reset the output char if certainty is below the limit v0.44 */ - if (box2->num_ac && box2->wac[0]cfg.certainty) box2->c=UNKNOWN; - if (line!=oldline) { - if (JOB->cfg.out_format==XML && oldline>-1) { /* subject of change */ - buffer=append_to_line(buffer,"\n",&len); - list_app( &(JOB->res.linelist), (void *)strdup(buffer) ); // wcsdup - memset(buffer, 0, len); - j=0; // reset counter for new line - } - if (JOB->cfg.out_format==XML) { /* subject of change */ - char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ - /* output lot of usefull information for XML filter */ - sprintf(s1,"\n", - line_info.x0[line],line_info.m1[line], - line_info.x1[line]-line_info.x0[line]+1, - line_info.m4[line]-line_info.m1[line],line); - buffer=append_to_line(buffer,s1,&len); - } - oldline=line; - } - if (box2->c > ' ' && - box2->c <= 'z') i1++; /* count non-space chars */ - if (box2->c == '\n') { - if (JOB->cfg.out_format!=XML) { /* subject of change */ - line_info = JOB->res.lines; - line = box2->line; - if (line > 0) { - line_gap = line_info.m2[line] - line_info.m3[line - 1]; - for (line_gap -= max_single_space_gap; line_gap > 0; - line_gap -= median_gap) { - buffer=append_to_line(buffer,"\n",&len); - j++; /* count chars in line */ - } - } - list_app( &(JOB->res.linelist), (void *)strdup(buffer) ); // wcsdup - memset(buffer, 0, len); - j=0; // reset counter for new line - } - } - if (box2->c == ' ') // fill large gaps with spaces - { - if (JOB->res.avX) { /* avoid SIGFPE */ - if (JOB->cfg.out_format==XML) { /* subject of change */ - char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ - /* output lot of usefull information for XML filter */ - sprintf(s1," \n", - box2->x0,box2->y0,box2->x1-box2->x0+1,box2->y1-box2->y0+1); - buffer=append_to_line(buffer,s1,&len); - } else - for (i = (box2->x1 - box2->x0) / (2 * JOB->res.avX) + 1; i > 0; i--) { - buffer=append_to_line(buffer," ",&len); - j++; - } - } - } - else if (box2->c != '\n') { - if (j==0 && JOB->res.avX) /* first char in new line? */ { - int indent = box2->x0 - JOB->res.lines.x0[box2->line]; - /* correct for angle of page as a whole. */ - if (JOB->res.lines.dx) - indent += box2->y0 * JOB->res.lines.dy / JOB->res.lines.dx; - /* subtract the base margin. */ - indent -= left_margin; - if (JOB->cfg.out_format==XML) { /* subject of change */ - char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ - /* output lot of usefull information for XML filter */ - sprintf(s1," \n", - box2->x0,box2->y0,box2->x1-box2->x0+1,box2->y1-box2->y0+1); - buffer=append_to_line(buffer,s1,&len); - } else - for (i = indent / JOB->res.avX; i > 0; i--) { - buffer=append_to_line(buffer," ",&len); j++; - } - } - if (JOB->cfg.out_format==XML) { /* subject of change */ - char s1[255]; /* ToDo: avoid potential buffer overflow !!! */ - /* output lot of usefull information for XML filter */ - sprintf(s1," x0,box2->y0,box2->x1-box2->x0+1,box2->y1-box2->y0+1); - buffer=append_to_line(buffer,s1,&len); - if (box2->num_ac>1) { /* output alist */ - } - } - if (box2->c != UNKNOWN && box2->c!=0) { - buffer= - append_to_line(buffer,decode(box2->c,JOB->cfg.out_format),&len); - if (box2->c > ' ' && - box2->c <= 'z') i2++; /* count non-space chars */ - } else { - wchar_t cc; cc=box2->c; - if (box2->num_ac>0 && box2->tas[0] - && (JOB->cfg.out_format!=XML || box2->tas[0][0]!='<')) { - buffer=append_to_line(buffer,box2->tas[0],&len); - j+=strlen(box2->tas[0]); - } else { - buffer= - append_to_line(buffer,decode(cc,JOB->cfg.out_format),&len); - } - } - if (JOB->cfg.out_format==XML) { - if (box2->num_ac>0) { - /* output alist ToDo: separate */ - int i1; char s1[256]; - sprintf(s1,"\" numac=\"%d\" weights=\"",box2->num_ac); - buffer=append_to_line(buffer,s1,&len); - for (i1=0;i1num_ac;i1++) { - sprintf(s1,"%d",box2->wac[i1]); - buffer=append_to_line(buffer,s1,&len); - if (i1+1num_ac) buffer=append_to_line(buffer,",",&len); - } - if (box2->num_ac>1) - buffer=append_to_line(buffer,"\" achars=\"",&len); - for (i1=1;i1num_ac;i1++) { - if (box2->tas[i1] && box2->tas[i1][0]!='<') - buffer=append_to_line(buffer,box2->tas[i1],&len); - else - buffer=append_to_line(buffer, - decode(box2->tac[i1],JOB->cfg.out_format),&len); - // ToDo: add tas[] (achars->avalues or alternate_strings? - if (i1+1num_ac) buffer=append_to_line(buffer,",",&len); - } - } - buffer=append_to_line(buffer,"\" />\n",&len); - } - if (box2->num_ac && box2->tas[0]) { - if (box2->tas[0][0]=='<') { /* output special XML object */ - buffer=append_to_line(buffer,box2->tas[0],&len); - buffer=append_to_line(buffer,"\n",&len); - j+=strlen(box2->tas[0]); - } - } - j++; - } - i++; - } end_for_each(&(JOB->res.boxlist)); - if (JOB->cfg.out_format==XML && oldline>-1) { /* subject of change */ - buffer=append_to_line(buffer,"\n",&len); - } - if (JOB->cfg.out_format==XML) { /* subject of change */ - buffer=append_to_line(buffer,"\n\n",&len); - } - - /* do not forget last line */ - // is there no \n in the last line? If there is, delete next line. - list_app( &(JOB->res.linelist), (void *)strdup(buffer) ); - free(buffer); - if( JOB->cfg.verbose&1 ) - fprintf(stderr,"... %d lines, boxes= %d, chars= %d\n",i,i1,i2); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.c deleted file mode 100644 index 332d2bd37..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.c +++ /dev/null @@ -1,334 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2006 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for email address - - ***********************************IMPORTANT********************************* - Notes to the developers: read the following notes before using these - functions. - * Be careful when using for_each_data() recursively and calling list_del. - It may mangle with the current[] pointers, and possibly segfault or do an - unpredictable or just undesirable behavior. We have been working on a - solution for this problem, and solved some of the biggest problems. - In a few words, the problem is this: when you delete a node, it may be - the current node of a lower level loop. The current code takes care of - access to previous/next elements of the now defunct node. So, if you do - something like: - - for_each_data(l) { - for_each_data(l) { - list_del(l, header_data); - free(header_data); - } end_for_each(l); -+ tempnode = list_cur_next(l); - } end_for_each(l); - - It will work, even though the current node in the outer loop was deleted. - However, if you replace the line marked with + with the following code: - - tempnode = list_next(l, list_get_current(l)); - - it will break, since list_get_current is likely to return NULL or garbage, - since you deleted header_data(). - Conclusion: use list_del carefully. The best way to avoid this problem is - to not use list_del inside a big stack of loops. - * If you have two elements with the same data, the functions will assume - that the first one is the wanted one. Not a bug, a feature. ;-) - * avoid calling list_prev and list_next. They are intensive and slow - functions. Keep the result in a variable or, if you need something more, - use list_get_element_from_data. - - */ - -#include -#include -#include "list.h" -#include "progress.h" - -void list_init( List *l ) { - if ( !l ) - return; - - l->start.next = &l->stop; - l->stop.previous = &l->start; - l->start.previous = l->stop.next = NULL; - l->start.data = l->stop.data = NULL; - l->current = NULL; - l->level = -1; - l->n = 0; -} - -/* inserts data before data_after. If data_after == NULL, appends. - Returns 1 on error, 0 if OK. */ -int list_ins( List *l, void *data_after, void *data) { - Element *e, *after_element; - - /* test arguments */ - if ( !l || !data ) - return 1; - - if ( !data_after || !l->n ) - return list_app(l, data); - - /* get data_after element */ - if ( !(after_element = list_element_from_data(l, data_after)) ) - return 1; - - /* alloc a new element */ - if( !(e = (Element *)malloc(sizeof(Element))) ) - return 1; - e->data = data; - e->next = after_element; - e->previous = after_element->previous; - after_element->previous->next = e; - after_element->previous = e; - l->n++; - - return 0; -} - -/* appends data to the list. Returns 1 on error, 0 if OK. */ -/* same as list_ins(l,NULL,data) ??? */ -int list_app( List *l, void *data ) { - Element *e; - - if ( !l || !data ) - return 1; - if ( !(e = (Element *)malloc(sizeof(Element))) ) - return 1; - - e->data = data; - e->previous = l->stop.previous; - e->next = l->stop.previous->next; - l->stop.previous->next = e; - l->stop.previous = e; - l->n++; - return 0; -} - -/* returns element associated with data. */ -Element *list_element_from_data( List *l, void *data ) { - Element *temp; - - if ( !l || !data || !l->n) - return NULL; - - temp = l->start.next; - - while ( temp->data != data ) { - if ( !temp || temp==&l->stop ) - return NULL; - temp = temp->next; - } - return temp; -} - -/* deletes (first) element with data from list. User must free data. - Returns 0 if OK, 1 on error. - This is the internal version, that shouldn't be called usually. Use the - list_del() macro instead. - */ -int list_del( List *l, void *data ) { - Element *temp; - int i; - - if (!data) return 1; /* do not delete start or stop element */ - - /* find element associated with data */ - if ( !(temp = list_element_from_data(l, data)) ) - return 1; - - /* test if the deleted node is current in some nested loop, and fix it. */ - for ( i = l->level; i >= 0; i-- ) { - if ( l->current[i] == temp ) { - l->current[i] = temp->previous; - } - } - - temp->previous->next = temp->next; - temp->next->previous = temp->previous; - temp->previous = temp->next = NULL; /* mark as freed */ -/* - fprintf(stderr,"\n# list_del=%p start=%p stop=%p",temp,&l->start,&l->stop); -*/ - - /* and free stuff */ - free(temp); /* element pointing to data, fixed mem-leak 0.41 */ - l->n--; - return 0; -} - -/* frees list. See also list_and_data_free() */ -void list_free( List *l ) { - Element *temp, *temp2; - - if ( !l || !l->n ) - return; - - if ( l->current ) { - free(l->current); - } - l->current = NULL; - - temp = l->start.next; - while ( temp && temp!=&l->stop) { - temp2 = temp->next; - free(temp); - temp = temp2; - } - l->start.next = &l->stop; - l->stop.previous = &l->start; -} - -/* setup a new level of for_each */ -int list_higher_level( List *l ) { - Element **newcur; - - if ( !l ) return(1); - - /* - Security-check: NULL pointer passed to realloc. - ANSI allows this, but it may cause portability problems. - */ - newcur = (Element **)realloc(l->current, (l->level+2)*sizeof(Element *)); - if (newcur) { - l->current = newcur; - l->level++; - l->current[l->level] = l->start.next; - } - g_debug(fprintf(stderr, " level++=%d current[]=%p\n", - l->level, l->current);) - if ( !newcur ) { - fprintf(stderr, " realloc failed! abort\n"); return(1); - } - return 0; -} - -void list_lower_level( List *l ) { - if ( !l ) - return; - - if (!l->level) { - free(l->current); /* calm -lefence */ - l->current = NULL; /* could be important */ - } else { - l->current = (Element **)realloc(l->current, l->level*sizeof(Element *)); - } - l->level--; - g_debug(fprintf(stderr, " level--=%d current[]=%p\n", l->level, - l->current);) -} - -/* returns the next item data */ -void *list_next( List *l, void *data ) { - Element *temp; - - if ( !l || !(temp = list_element_from_data(l, data)) ) - return NULL; - if( !temp->next ) return NULL; - return (temp->next->data); -} - -/* returns the previous item data */ -void *list_prev( List *l, void *data ) { - Element *temp; - - if ( !l || !(temp = list_element_from_data(l, data)) ) - return NULL; - if( !temp->previous ) return NULL; - return (temp->previous->data); -} - -/* Similar to qsort. Sorts list, using the (*compare) function, which is - provided by the user. The comparison function must return an integer less - than, equal to, or greater than zero if the first argument is considered to - be respectively less than, equal to, or greater than the second. - Uses the bubble sort algorithm. - */ -void list_sort( List *l, int (*compare)(const void *, const void *) ) { - Element *temp, *prev; - int i, sorted; - progress_counter_t *pc = NULL; - - if ( !l ) - return; - - /* start progress meter, sorting is slow for huge number of elements */ - /* l->n is the worst case, real time is less or equal estimated time */ - pc = open_progress(l->n,"list_sort"); - - for (i = 0; i < l->n; i++ ) { - sorted = 1; /* Flag for early break */ - for ( temp = l->start.next->next; - temp != NULL && temp != &l->stop; temp = temp->next ) { - if ( temp->previous == &l->start ) continue; - if ( compare((const void *)temp->previous->data, - (const void *)temp->data) > 0 ) { - - sorted = 0; /* rest flag */ - /* swap with the previous node */ - prev = temp->previous; - prev->previous->next = temp; - temp->next->previous = prev; - temp->previous = prev->previous; - prev->next = temp->next; - prev->previous = temp; - temp->next = prev; - /* and make sure the node in the for loop is correct */ - temp = prev; - -#ifdef SLOWER_BUT_KEEP_BY_NOW -/* this is a slower version, but guaranteed to work */ - void *data; - - data = temp->data; - prev = temp->previous; - list_del(l, data); - list_ins(l, prev->data, data); - temp = prev; -#endif - } - } - if (sorted) break; - progress(i,pc); /* progress meter */ - } - - close_progress(pc); - g_debug(fprintf(stderr, "list_sort()\n");) -} - -/* calls free_data() for each data in list l, - * before free list with list_free() */ -int list_and_data_free( List *l, void (*free_data)(void *data)) { - void *data; - - if ( !l ) return 0; - if ( !free_data ) return 1; - - for_each_data(l) { - if ((data = list_get_current(l))) - free_data(data); - } end_for_each(l); - - list_free(l); - - g_debug(fprintf(stderr, "list_and_data_free()\n");) - - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.h deleted file mode 100644 index dd3009985..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/list.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL-address - - */ - -#ifndef GOCR_LIST_H -#define GOCR_LIST_H - -#ifdef DEBUG -#define g_debug(a) a -#else -#define g_debug(a) -#endif - -/* - * Structures - */ - -struct element { - struct element *next, *previous; - void *data; -}; -typedef struct element Element; - -struct list { - Element start; /* simplifies for(each_element) { ... */ - Element stop; /* ... list_del() ... } v0.41 */ - Element **current; /* for(each_element) */ - int n; /* number of elements */ - int level; /* level of nested fors */ -}; -typedef struct list List; - -/* - * Functions - */ - -void list_init ( List *l ); -int list_app ( List *l, void *data ); -int list_ins ( List *l, void *data_after, void *data); -Element*list_element_from_data ( List *l, void *data ); -int list_del ( List *l, void *data ); -void list_free ( List *l ); -int list_and_data_free ( List *l, void (*free_data)(void *data)); -int list_higher_level ( List *l ); -void list_lower_level ( List *l ); -void * list_next ( List *l, void *data ); -void * list_prev ( List *l, void *data ); -void list_sort ( List *l, int (*compare)(const void *, const void *) ); - -#define list_empty(l) ((l)->start.next == &(l)->stop ? 1 : 0) -#define list_get_header(l) ((l)->start.next->data) -#define list_get_tail(l) ((l)->stop.previous->data) -#define list_get_current(l) ((l)->current[(l)->level]->data) -#define list_get_cur_prev(l) ((l)->current[(l)->level]->previous == NULL ? \ - NULL : (l)->current[(l)->level]->previous->data ) -#define list_get_cur_next(l) ((l)->current[(l)->level]->next == NULL ? \ - NULL : (l)->current[(l)->level]->next->data ) -#define list_total(l) ((l)->n) - -#define for_each_data(l) \ - if (list_higher_level(l) == 0) { \ - for ( ; (l)->current[(l)->level] \ - && (l)->current[(l)->level]!=&(l)->stop; (l)->current[(l)->level] = \ - (l)->current[(l)->level]->next ) { - - -#define end_for_each(l) \ - } \ - list_lower_level(l); \ - } - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.c deleted file mode 100644 index 1066b7cb6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.c +++ /dev/null @@ -1,6591 +0,0 @@ -/* - rule based OCR engine, partly rewritten for edges (old=pixel) - */ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2007 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for email address - - >>> DO NOT EDIT THIS FILE IF YOU NOT REALLY KNOW WHAT YOU ARE DOING! <<< - - I have invested lot of time, to write this part of the program. - This engine should recognize chars allways right or return UNKNOWN. - If you change something, test all other example files too, - to be sure that all things work better. (JoergS) - - This engine was pixelbased until 0.40 which was not successfull enough. - Also code changes always hade side effects. The vectorisation of the code - starts from version 0.41 with the chars XNz and seems to be much better - to handle. Vectorization means we frame each character by a chain of - vectors and dont care about pixels anymore. Unfortunatly I have to - replace all the pixel codes, which is a long process. Old code will be lost. - (JorgS) - - -ToDo: - - if box1->p and b differ, reduce probability - - probability makes life much easier here - - use only one box!?, may be bits have usefull infos - - divide this file, suggestion: classify chars: - high=ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhklt, low=acegijmnopqrsuvwxyz - or - often_used=etianmsurwdkgo rarely_used=hvjcflpqxyz.,: - or - every char (large overhead) - - two-pass version (first pass without tolerance) - 2nd pass with tolerance (ex: one tiny more in sdata->holes) - - general feature extraction: - - white holes at middle, upper, lower position (cost much time) - - test lines and triangles insteat of rectangles - - char is removed, wchar_t is used (better code) - - making a static global variable-set x.x0,x.x1, and call test_a, - test_b ... (faster compilation, but not reentrant!) - - - adding slant-angle (if detected) to distinguish between l and / ? - - ac (alternate chars) as string add_ac(box1,"/") => box1->ac="Il/"; - for better context correction or output: "Ha[lI][lI]o!" - -*/ - -#include -#include -// #include "pgm2asc.h" -#include "ocr0.h" -// #include "ocr1.h" -#include "pnm.h" -#include "gocr.h" - -#define IFV if(JOB->cfg.verbose&4) -#define MM {IFV fprintf(stderr,"\nDBG %c L%04d (%d,%d): ",(char)c_ask,__LINE__,box1->x0,box1->y0);} - -// the old debug mode (0.40) was only for a special char, for another char -// code must be recompiled with C_ASK='char' -// new debug mode (0.41) explains why char is declined or accepted as ABC... -// the output can be filtered by external scripts -// ToDo: we could reduce output to filter string -#ifndef DO_DEBUG /* can be defined outside */ -#define DO_DEBUG 0 /* 0 is the default */ -#endif - -/* this macro is for debugging output: "if char is declined, why?" */ -#if DO_DEBUG /* 0=Work mode, 1=debugging mode */ -// Setac: output, that char is choosen with a probability -// Break: output, why the char is not choosen -// MSG: debugging functions for char C_ASK, mostly messages -// DBG: definitions usefull only for debugging -#define Setac(box1,ac,ad) { MM;IFV fprintf(stderr,"setac %d",ad);setac(box1,ac,ad); } -#define Break { MM;IFV fprintf(stderr,"break"); break; } -#define MSG(x) { MM;IFV x } -#define DBG(x) x -#else -#define Setac(box1,ac,ad) setac(box1,ac,ad) -#define Break break -#define MSG(x) -#define DBG(x) -#endif - -/* extern "C"{ */ - -// static inline int sq(int x) { return x*x; } /* square */ - -/* - * go from vector j1 to vector j2 and measure maximum deviation of - * the steps from the line connecting j1 and j2 - * return the squared maximum distance - * in units of the box size times 1024 - * ToDo: 1) better give back max-dx and max-dy ??? - * errors if j1 and j2 are in different frames or belong to - * more then one frame? - * 2) Better get deviation from a complete vector graphic? - * The vectorgraphic is the ideal test char adapted to the - * extrem vertices of the real char. - */ -int line_deviation( struct box *box1, int j1, int j2 ) { - int r1x, r1y, r2x, r2y, r3x, r3y, i, x, y, d, dist, maxdist=0, frame, l2; - r1x=box1->frame_vector[j1][0]; - r1y=box1->frame_vector[j1][1]; - r2x=box1->frame_vector[j2][0]; - r2y=box1->frame_vector[j2][1]; - if (!box1->num_frames) return(-1); - if (j1<0 || j1>box1->num_frame_vectors[box1->num_frames-1] || - j2<0 || j2>box1->num_frame_vectors[box1->num_frames-1]) { - fprintf(stderr,"Error in "__FILE__" L%d: idx out of range",__LINE__); - return(-1); - } - /* get the frame the endvector belongs to */ - for (i=0;inum_frames;i++) - if (j2num_frame_vectors[i]) break; - frame=i; - /* frame(j1)<=frame(j2) possible */ - for (i=j1;;i++) { // do it for each vector between j1 and j2 - if (i >= box1->num_frame_vectors[frame]) - i=((frame)?box1->num_frame_vectors[frame-1]:0); /* go around */ - if (i==j2) break; - // for (i=j1;i!=j2;i=(i+1)%box1->num_frame_vectors[0]) {~} - r3x=box1->frame_vector[i][0]; - r3y=box1->frame_vector[i][1]; - // Language=german - // german: Abstand Punkt von Strecke, Laenge Lotrechte - // germ.Strecke : l1=(r1+r2)/2+d*(r2-r1)/2 for d=-1..1 - // germ.Lotrechte: l2=r3+b*[-(r2-r1).y,(r2-r1).x] - // Schnittpunkt : l1=l2, - // eq1x: (r1x+r2x)/2-r3x+d*(r2x-r1x)/2+b*(r2y-r1y)=0 - // eq1y: (r1y+r2y)/2-r3y+d*(r2y-r1y)/2-b*(r2x-r1x)=0 - // eq2x: b*(r2x-r1x)*(r2y-r1y)=-((r1x+r2x)/2-r3x+d*(r2x-r1x)/2)*(r2x-r1x) - // eq2y: b*(r2x-r1x)*(r2y-r1y)= ((r1y+r2y)/2-r3y+d*(r2y-r1y)/2)*(r2y-r1y) - // eq2y-eq2x: ... in units of 1024 (fast integer rounded correctly) - l2=sq(r2x-r1x)+sq(r2y-r1y); // square of distance r2-r1 - if (l2==0) { - // fprintf(stderr,"ocr0 L%d: r1==r2 r1= %d %d",__LINE__, r1x, r1y); // debugging - d=-1024; - } else - d=-( ((r1x+r2x)-2*r3x)*(r2x-r1x) - +((r1y+r2y)-2*r3y)*(r2y-r1y))*1024/l2; // ..-1024..+1024.. - if (d<=-1024) { x=r1x; y=r1y; } // starting point - else { - if (d>=1024) { x=r2x; y=r2y; } // end point - else { - x=((r1x+r2x)+1)/2+(d*(r2x-r1x))/2048; - y=((r1y+r2y)+1)/2+(d*(r2y-r1y))/2048; - /* we have the crossing point x,y now */ - } - } - dist=sq((x-r3x)*1024/(box1->x1-box1->x0+1)) - +sq((y-r3y)*1024/(box1->y1-box1->y0+1)); // 0..2*sq(1024) - if (dist>maxdist) maxdist=dist; - // for debugging: - // fprintf(stderr,"\nDBG dev: %d-%d-%d dist=%5d max=%5d d=%d %d,%d-%d,%d" - // " vector= %d %d crosspoint= %d %d ", - // j1,i,j2,dist,maxdist,d,r1x,r1y,r2x,r2y,r3x,r3y,x,y); - } - return maxdist; -} - -/* - * search vectors between j1 and j2 for nearest point a to point r - * example: - * - * r-> $$...$$ $ - mark vectors - * @@$..@@ @ - black pixels - * @@$..@@ . - white pixels - * @@@@.$@ - * a-> @@$@$@@ - * @$.@@@@ - * @@..$@@ - * @@..$@@ - * j1 --> $$...$$ <-- j2 - * - * ToDo: vector aa[5] = {rx,ry,x,y,d^2,idx} statt rx,ry? - * j1 and j2 must be in the same frame - * return aa? - */ -int nearest_frame_vector( struct box *box1, int j1, int j2, int rx, int ry) { - int x,y,d,i,aa[4]; /* x,y,normalized_distance^2,vector_index */ - int frame=0, x0=box1->x0, y0=box1->y0, - x1=box1->x1, y1=box1->y1, - dx=box1->x1-x0+1, dy=box1->y1-y0+1; - if (!box1->num_frames) return(-1); - if (j1<0 || j1>box1->num_frame_vectors[box1->num_frames-1] || - j2<0 || j2>box1->num_frame_vectors[box1->num_frames-1]) { - fprintf(stderr,"Error in "__FILE__" L%d: idx %d-%d out of range\n",__LINE__,j1,j2); - //out_x(box1); - return(-1); - } - aa[0]=x=box1->frame_vector[j2][0]; /* x */ - aa[1]=y=box1->frame_vector[j2][1]; /* y */ - /* maximum is (distance*128)^2 if r is inside the box */ - aa[2]=d=2*sq(128)+sq((rx-(x0+x1)/2)*128/dx)+sq((ry-(y0+y1)/2)*128/dy); - aa[3]=j2; /* vector index */ - /* get the frame the endvector belongs to */ - for (i=0;inum_frames;i++) - if (j2num_frame_vectors[i]) break; - frame=i; - /* frame(j1)<=frame(j2) possible */ - for (i=j1;;i++) { - if (i >= box1->num_frame_vectors[frame]) - i=((frame)?box1->num_frame_vectors[frame-1]:0); /* go around */ - x=box1->frame_vector[i][0]; /* take a vector */ - y=box1->frame_vector[i][1]; - /* distance to upper left end, normalized to 128 */ - d=sq((x-rx)*128/dx)+sq((y-ry)*128/dy); - if (d0 and m==1 box1 is changed -// m>0 modify box1->dots -// m==2 modify box1->y0 -// called by pgm2asc + ocr0(?) -int testumlaut(struct box *box1, int cs, int m, wchar_t *modifier){ - // pix p=*(box1->p); - int r,y,x,x0,x1,y0,y1,dx,dy,m1,m2,m3, - xl,xr,yu,yl; // left, right, upper and lower border of dots - wchar_t mod='\0'; /* (TeX-) modifier ~"'` for compose() */ - DBG( wchar_t c_ask='"'; ) - r=0; - x0=box1->x0; x1=box1->x1; dx=x1-x0+1; - y0=box1->y0; y1=box1->y1; dy=y1-y0+1; - m1=box1->m1; m2=box1->m2; m3=box1->m3; - xl=x0; xr=x1; yu=yl=y0; - if( dy < 5 || 4*y0 > 3*m2+m3 ) return 0; // no low chars: .,-= - /* modifier in box included? */ - if( 2*y1 > m1+m2 ){ - /* modifier in box included? */ - for(y=y0;2*yp,cs,1)==0 ) break; - if( 2*y extract */ - yl=y; - while( get_bw(xl,xr,y,y,box1->p,cs,1)==0 && 2*y<=y0+y1) y++; - if( m&2 ) box1->y0=y; /* set new upper bond */ - } - } - if( yu>=yl ) { if(m) box1->dots=0; return 0; } /* nothing found */ - if( get_bw(xl-1,xl-1,yu,yl-1,box1->p,cs,1)==1 ) // neighbour overlap? - while( get_bw(xl ,xl ,yu,yl-1,box1->p,cs,1)==1 && 2*xlp,cs,1)==1 ) break; - for(;xr>xl;xr--)if( get_bw(xr,xr,yu,yl,box1->p,cs,1)==1 ) break; - - if ( yl-1>yu ) { // tall box ij"a"o"u -#if 0 - x=box1->y0; box1->y0=m1; out_x(box1); box1->y0=x; - fprintf(stderr,"\n#testumlaut x= %d %d m1=%d m2=%d",x0,y0,m1-y0,m2-y0); - fprintf(stderr," yu=%d yl=%d xl=%d xr=%d",yu-y0,yl-y0,xl-x0,xr-x0); -#define DEBUG 1 -#endif - { - - x=xl;y=yu; - if( get_bw(xl,x1+1,yu,yl-1,box1->p,cs,1)==0 ) r=0; // neighbour overlap? - else - if( get_bw(xl ,xl ,yu,yl-1,box1->p,cs,1)==0 - || get_bw(xl-1,xl-1,yu,yl-1,box1->p,cs,1)==0 ) // be sure there are gap to neighbours - if( get_bw(xr ,xr ,yu,yl-1,box1->p,cs,1)==0 - || get_bw(xr+1,xr+1,yu,yl-1,box1->p,cs,1)==0 ) - { int i,j,x; - r=1; - // ...@@@.... RING_ABOVE // ..@@@..@@. TILDE - // ..@...@... // @@.@@@@@.. - // ..@...@... // @......... - // ..@..@@... - // ...@@@.... - for (i=yu;ip,cs,1)==1) break; - for ( ;ip,cs,1)==0) break; - for (j=xl;jp,cs,1)==1) break; - for ( ;jp,cs,1)==0) break; - for ( x=j;xp,cs,1)==1) break; - // vert. gap detected - if( j2 - && num_obj(xl,xr,yu,yl-1,box1->p,cs)>=2 // not best!!! - && num_cross(xl,xr,yu +(yl-yu)/4,yu+ (yl-yu)/4,box1->p,cs) == 2 - && num_cross(xl,xr,yl-1-(yl-yu)/2,yl-1-(yl-yu)/2,box1->p,cs) == 2 - ){ // may be the following lines are not quite ok - while( get_bw(xl,xr,yl,yl,box1->p,cs,1)==0 && 2*yly0=yl; -/* if( m&2 ) box1->y0= ( (r==1) ? yu : yl ); */ - // out_x(box1); - } - if(r==0){ // divided fr != fi - while( get_bw(x0,x1,yu,yu,box1->p,cs,1)==0 && 2*yuy0=yu; - } - if( r==1 ){ yl--; -// .@@@. ..@@. -// .@@.. .@@.. -// .@... .@@.. -// -// if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) -// > loop(box1->p,xl,yl,xr-xl,cs,0,RI) // +dx/8 -// && loop(box1->p,xr,yu,xr-xl,cs,0,LE) -// < loop(box1->p,xr,yl,xr-xl,cs,0,LE)) // -dx/8 ) // é Nov03 - if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) - - loop(box1->p,xr,yu,xr-xl,cs,0,LE) - > loop(box1->p,xl,yl,xr-xl,cs,0,RI) // +dx/8 - - loop(box1->p,xr,yl,xr-xl,cs,0,LE)+1) // -dx/8 ) // é Nov03 - mod = ACUTE_ACCENT; // ' - - if( xr-xl+1 > 3*(yl-yu+1) - && get_bw(xl,xr,yu,yl,box1->p,cs,2)==0 ) - mod = MACRON; // "-" above - -// .@@@. .@@.. -// ..@@. ..@@. -// ...@. ..@@. -// -// if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) -// < loop(box1->p,xl,yl,xr-xl,cs,0,RI) // -dx/8 -// && loop(box1->p,xr,yu,xr-xl,cs,0,LE) -// > loop(box1->p,xr,yl,xr-xl,cs,0,LE) ) // +dx/8 ) à Nov03 - if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) - - loop(box1->p,xr,yu,xr-xl,cs,0,LE) - < loop(box1->p,xl,yl,xr-xl,cs,0,RI) // -dx/8 - - loop(box1->p,xr,yl,xr-xl,cs,0,LE) -1 ) // +dx/8 ) à Nov03 - mod = GRAVE_ACCENT; // ` - -#ifdef DEBUG - fprintf(stderr,"\n#testumlaut x= %d %d m1=%d m2=%d",x0,y0,m1-y0,m2-y0); - fprintf(stderr," yu=%d yl=%d xl=%d xr=%d",yu-y0,yl-y0,xl-x0,xr-x0); -#endif - if( (xr-xl+1) < 2*(yl-yu+1)+2 - && 2*(xr-xl+1)+2 > (yl-yu+1) ) { - int i,i1,i2,i3,i4; - i1=loop(box1->p,xl ,(yu+yl)/2,xr-xl+1,cs,0,RI); - i1=loop(box1->p,xl+i1,(yu+yl)/2,xr-xl+1,cs,1,RI); - i2=loop(box1->p,(xl+xr)/2,yu ,yl-yu+1,cs,0,DO); - i2=loop(box1->p,(xl+xr)/2,yu+i2,yl-yu+1,cs,1,DO); - for (i=0;ip,xl+i,yu+i)< cs) break; i3=i; - for ( ;ip,xl+i,yu+i)>=cs) break; i3=i-i3; - for (i=0;ip,xr-i,yu+i)< cs) break; i4=i; - for ( ;ip,xr-i,yu+i)>=cs) break; i4=i-i4; -#ifdef DEBUG - fprintf(stderr,"\n#DEBUG DOT_ABOVE %d %d %d %d",i1,i2,i3,i4); -#endif - if ( (xr-xl<5 && yl-yu<8) /* to small */ - || (i1>=(xr-xl+1)/2+2 && i2>=(yl-yu+1)/2+2 /* symmetrical */ - && abs(i3-i4)<=i1/4+2 && abs(i1-i2)<=i1/4+2 - && abs(i3-i1)<=i1/4+4 && abs(i4-i2)<=i1/4+4) - ) - mod = DOT_ABOVE; // "." above, ToDo: improve it! - } - - if( ( loop(box1->p,xl,yu ,xr-xl,cs,0,RI) - > loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/8 - || loop(box1->p,xl,yu ,xr-xl,cs,0,RI) - > loop(box1->p,xl,yl-1,xr-xl,cs,0,RI)-dx/8 ) - && ( loop(box1->p,xr,yu ,xr-xl,cs,0,LE) - > loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/8 - || loop(box1->p,xr,yu ,xr-xl,cs,0,LE) - > loop(box1->p,xr,yl-1,xr-xl,cs,0,LE)-dx/8 ) - && num_cross(xl,xr,yu ,yu ,box1->p,cs) == 1 - && ( num_cross(xl,xr,yl ,yl ,box1->p,cs) == 2 - || num_cross(xl,xr,yl-1,yl-1,box1->p,cs) == 2 )) - mod = CIRCUMFLEX_ACCENT; // "^" - - if( ( loop(box1->p,xl,yu ,xr-xl,cs,0,RI) - < loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/10 - || loop(box1->p,xl,yu+1,xr-xl,cs,0,RI) - < loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/10 ) - && ( loop(box1->p,xr,yu ,xr-xl,cs,0,LE) - < loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/10 - || loop(box1->p,xr,yu+1,xr-xl,cs,0,LE) - < loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/10 ) - && ( num_cross(xl,xr,yu ,yu ,box1->p,cs) == 2 - || num_cross(xl,xr,yu+1,yu+1,box1->p,cs) == 2 ) - && num_cross(xl,xr,yl ,yl ,box1->p,cs) == 1 ) - mod = CARON; // "v" above - - if( /* test for bow (new0.3.6) */ - loop(box1->p,xl,yu ,xr-xl,cs,0,RI) - + loop(box1->p,xl,yl ,xr-xl,cs,0,RI) - - 2*loop(box1->p,xl,(yl+yu)/2,xr-xl,cs,0,RI) > dx/16+1 - && xr-xl>10) - if( ( loop(box1->p,xl,yu ,xr-xl,cs,0,RI) - < loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/10 - || loop(box1->p,xl,yu+1,xr-xl,cs,0,RI) - < loop(box1->p,xl,yl ,xr-xl,cs,0,RI)-dx/10 ) - && ( loop(box1->p,xr,yu ,xr-xl,cs,0,LE) - < loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/10 - || loop(box1->p,xr,yu+1,xr-xl,cs,0,LE) - < loop(box1->p,xr,yl ,xr-xl,cs,0,LE)-dx/10 ) - && ( num_cross(xl,xr,yu ,yu ,box1->p,cs) == 2 - || num_cross(xl,xr,yu+1,yu+1,box1->p,cs) == 2 ) - && num_cross(xl,xr,yl ,yl ,box1->p,cs) == 1 ) - mod = BREVE; // round "u" above - - if( xr-xl>3 && yl-yu>1 ) - if( loop(box1->p,xl,yu,xr-xl,cs,0,RI) - > loop(box1->p,xl,yl,xr-xl,cs,0,RI) - && loop(box1->p,xr,yu,xr-xl,cs,0,LE) - < loop(box1->p,xr,yl,xr-xl,cs,0,LE) - && num_cross(xl,xr,yu,yu,box1->p,cs) == 2 - && num_cross(xl,xr,yl,yl,box1->p,cs) == 2 ) - mod = TILDE; - - if( xr-xl>2 && yl-yu>2) - if( num_cross(xl,xr,(yu+yl)/2,(yu+yl)/2,box1->p,cs) >1 ) - if( num_cross((xl+xr)/2,(xl+xr)/2,yu,yl,box1->p,cs) >1 ) - if( num_hole(xl,xr,yu,yl,box1->p,cs,NULL) == 1 ) - mod = RING_ABOVE; - -#ifdef DEBUG - printf("\n#DEBUG umlaut mod=0x%04x x=%d..%d y=%d..%d r=%d %s", - (int)mod,yu-box1->y0,yl-box1->y0, - xl-box1->x0,xr-box1->x0,r,((mod==CARON)?"CARON": - ((mod==ACUTE_ACCENT)?"ACUTE": - ((mod==TILDE)?"TILDE":"?")))); - out_x(box1); -#endif - - } - } - if (m) box1->dots=r; // set to 0 also possible after division - if (m) box1->modifier=mod; /* should be resetted after compose ??? */ - MSG(fprintf(stderr,"umlaut mod=%s dots=%d y0o=%d",decode(mod,ASCII),r,y0);) - } -// printf(" modifier=%c",mod); - if (modifier) *modifier=mod; /* set modifier */ - return r; -} - - -static wchar_t ocr0_eE(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - int i,i1,i2,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar,bad_e=0, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - int (*aa)[4]=sdata->aa; /* corner-points, (x,y,dist^2,vector_idx) */ - - // --- most frequent letter e first!!! - // --- test e --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 (smallest seen is 5x6) - DBG( wchar_t c_ask='e'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if (sdata->holes.num != 1) ad=97*ad/100; - /* ToDo: may be a two pass version intolerant/tolerant is better */ - if( loop(box1->p,x0,y0+dy/2,x1-x0,cs,0,RI)>dx/3 ) Break; // rough test - if( loop(box1->p,x0+dx/2,y0,y1-y0,cs,0,DO)>dy/3 ) Break; - if( loop(box1->p,x0+dx/2,y1,y1-y0,cs,0,UP)>dy/3 ) Break; - if( num_cross(x0,x1,y0+dy/4 ,y0+dy/4 ,box1->p,cs) > 2 - && num_cross(x0,x1,y0+dy/4+1,y0+dy/4+1,box1->p,cs) > 2 ) Break; // gt - x=(x0+x1)/2;i= num_cross(x,x,y0,y1,box1->p,cs); // v0.40 - if (i!=3) { x=(x0+2*x1)/3;i= num_cross(x,x,y0,y1,box1->p,cs); } - if (i!=3) { x=(x0+3*x1)/4;i= num_cross(x,x,y0,y1,box1->p,cs); } - if (i!=3) { i= num_cross((x0+2*x1)/3,(x0+x1)/2,y0,y1,box1->p,cs); } - i=loop(box1->p,x0,y0+dy/2,x1-x0,cs,0,RI); if( i>dx/2 ) Break; - j=loop(box1->p,x0,y0 ,x1-x0,cs,0,RI); if( jp,x0,y1 ,x1-x0,cs,0,RI); if( jp,x0+dx/2,y0,y1-y0,cs,0,DO); if( i>dx/2 ) Break; - j=loop(box1->p,x1-dx/3,y0,y1-y0,cs,0,DO); if( jp,x0 ,y0,y1-y0,cs,0,DO); if( jp,x1 ,y0,y1-y0,cs,0,DO); if( jp,x0+dx/2,y1,y1-y0,cs,0,UP); if( i>dx/2 ) Break; - j=loop(box1->p,x0 ,y1,y1-y0,cs,0,UP); if( jp,x1 ,y1,y1-y0,cs,0,UP); if( jp,x0, (y0+y1)/2,x1-x0,cs,0,RI) - -loop(box1->p,x0,(3*y0+y1)/4,x1-x0,cs,0,RI) - -loop(box1->p,x0,(y0+3*y1)/4,x1-x0,cs,0,RI); - if (dx>3 && j>=dx/4) Break; // ~g 4x6font - for(y=1;yp,cs) == 2 ) break; - if( y==dy/2 ) Break; // v0.2.5 ~ bad_t - for(i=0,j=x0+dx/4;j<=x1-dx/4 && i<=dx/4;j++) - if( num_cross(j,j,y0,y1,box1->p,cs) == 3 ) i++; - if( dx>4 && dy>5 && (i set x,y - for(x=0,y=i=y0+dy/3;ip,x1,i,y1-y0,cs,0,LE); - if(j>=x) { x=j;y=i; } - } - if (x 2* smallest thickness right - for(i1=dx,i=y0+dy/3;ip,x0 ,i,y1-y0,cs,0,RI); if (j>dx/2) break; - j =loop(box1->p,x0+j,i,y1-y0,cs,1,RI); - if (jp,x1 ,i,y1-y0,cs,0,LE); - j =loop(box1->p,x1-j,i,y1-y0,cs,1,LE); - if(j2*i1) Break; // not accepted, if right line is not very thinn - x =loop(box1->p,x1 ,y,y1-y0,cs,0,LE); - x+=loop(box1->p,x1-x,y,y1-y0,cs,1,LE); - x+=loop(box1->p,x1-x,y,y1-y0,cs,0,LE); - if (3*i2>i1) ad=99*ad/100; - if (2*i2>i1) ad=99*ad/100; - bad_e=60; // used later? - } - if (xp,cs) > 1 ) i=0; - if( i ) Break; -// ..@@@@...<- -// .@@@@@@;. -// @@,...@@. -// @@.....@, -// @@@@@@@@@ -// @@.,;.@,. <- problem (y) == bad_e>50 -// @@.....@. -// @@,...@@. -// .@@@,@@@. -// ..@@@@;..<- - if (dy>11 && bad_e<50) - if ( num_cross(x0,x1,y,y,box1->p,cs) != 1 ) Break; // except "geschwungenem e" - if ( num_cross(x0,x1-dx/3,y ,y ,box1->p,cs) != 1 - && num_cross(x0,x1-dx/3,y+1,y+1,box1->p,cs) != 1 ) Break; - // if( num_hole(x0, x1, y0 , y ,box1->p,cs,NULL) < 1 ){ - if( sdata->holes.num == 0 || sdata->holes.hole[0].y1 >= y-y0){ - if( sdata->hchar ) Break; // ~ \it t - // look if thinn font (may be h-line is broken) Mai00 - for(j=0,i=x0+dx/8;ip,cs,1) == 1 ) j++; - if(j<2*dx/4) Break; - } - if( sdata->holes.num>0 && sdata->holes.hole[0].y0 > y-y0) Break; - if( sdata->holes.num>1 && sdata->holes.hole[1].y0 > y-y0) Break; - if( sdata->holes.num==1 && sdata->holes.hole[0].x0 >= dx/2) { - ad=95*ad/100; } /* 8*10 @ (=at) is not an e */ - // look for horizontal gap - for(x=0,y=i=y0+dy/4;ip,x0,i,x1-x0,cs,0,RI); - if(j>=x) { x=j;y=i; } - } - if (y>y0+dy/4 && ydx/2) Break; // s - if (x>dx/4) ad=99*ad/100; - - if( num_cross(x0+dx/2,x1 ,y1-dy/4,y1 ,box1->p,cs) == 0 - && num_cross(x0+dx/2,x1-1,y1-dy/4,y1 ,box1->p,cs) == 0 - && num_cross(x0+dx/2,x1 ,y1-dy/4,y1-1,box1->p,cs) == 0 ) { - if (sdata->gchar) Break; // ~p - ad=99*ad/100; - } - /* upper case is for 5x6 box */ - if( sdata->hchar // broken B ? should also work when linedetection fails - && loop(box1->p,x1,y1-dy/3,dx,cs,0,LE)<=dx/8 ) { - x = loop(box1->p,x0,y0+dy/2,dx,cs,0,RI); - if( loop(box1->p,x0,y0+dy/4,dx,cs,0,RI)<=x - && loop(box1->p,x0,y0+dy/8,dx,cs,0,RI)<=x ) Break; - if( loop(box1->p,x0,y1-dy/4,dx,cs,0,RI)<=x - && loop(box1->p,x0,y1-dy/8,dx,cs,0,RI)<=x ) Break; - } - x = loop(sdata->bp,0,dy-2 ,dx,cs,0,RI); - if( loop(sdata->bp,0,dy-1-dy/8,dx,cs,0,RI)>x && dy>16) Break; // some Q - if (box1->m2) { - if (sdata->gchar) ad=99*ad/100; - if (sdata->hchar) ad=99*ad/100; - } else ad=99*ad/100; - - Setac(box1,(wchar_t)'e',ad); - if (ad>=100) return 'e'; - break; - } - // --- test E --------------------------------------------------- - for(ad=d=100;dx>2 && dy>4 ;){ // min 3x4 - // rewritten for vectors 0.43 - int i1, i2, i3, i4, i5; // line derivation + corners - DBG( wchar_t c_ask='E'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the upper right end of the h */ - if (aa[3][2]>d/2) Break; /* [2] = distance, ~dj... */ - if (aa[0][2]>d/2) Break; /* upper left end */ - if (aa[1][2]>d/2) Break; /* lower left end */ - if (aa[2][2]>d/2) Break; /* lowerright end */ -/* - E f near E - - OOOOOOOO OOOO - O5 O O - O4 O - OOOO3 OOOOOO - O2 O - O O - O1 O O - OOOOOOOO OOOOOO -*/ - // check the bow from below - for (i=aa[1][3];i!=aa[2][3];i=(i+1)%box1->num_frame_vectors[0]) { - if (y1-box1->frame_vector[ i][1]>dy/4) break; // fatal! - } if (i!=aa[2][3]) Break; // ~AHKMNRX - // search most left+down between bottom right and top right - i1=nearest_frame_vector(box1, aa[2][3],aa[3][3], x0, y1); - i5=nearest_frame_vector(box1, i1,aa[3][3], x0, y0); - i3=nearest_frame_vector(box1, i1, i5, x1, (y0+y1)/2); - i2=nearest_frame_vector(box1, i1, i3, x0, (2*y0+y1)/3); - i4=nearest_frame_vector(box1, i3, i5, x0, (y0+2*y1)/3); - i =nearest_frame_vector(box1, aa[0][3],aa[1][3], x0-dx/4, (y0+y1)/2); - if (2*box1->frame_vector[i][0] < aa[0][0]+aa[1][0]-1-dx/16) Break; - if (2*box1->frame_vector[i][0] < aa[0][0]+aa[1][0]) ad=99*ad/100; // f - - MSG(fprintf(stderr,"i1-5 %d %d %d %d %d",i1,i2,i3,i4,i5);) - // holes right open? - for( i=1,y=y0; yp,cs,2) == 0 ) i=0; - if( i ) Break; - for( i=1,y=y1; y>y1-dy/4 && i; y-- ) // long black line - if( get_bw(x0+dx/6,x1-dx/4,y,y,box1->p,cs,2) == 0 ) i=0; - if( i ) Break; - for( i=1,y=y0+dy/3; yp,x0 ,y,dx,cs,0,RI); - j=loop(box1->p,x0+j,y,dx,cs,1,RI); if( j>dx/3 ) i=0; - } if( i ) Break; - x=x1-dx/3; y=y0; // von oben durchbohren! - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,DO,ST); if( y>y0+dy/4 ) Break; - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,ST,DO); if( y>y0+dy/3 ) Break; - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,RI,DO); if( x<=x1 || y>y0+dy/2 ) Break; - x=x1-dx/3; y=y1; // von unten durchbohren! - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,UP,ST); if( yp,&x,&y,x0,x1,y0,y1,cs,ST,UP); if( yp,&x,&y,x0,x1,y0,y1,cs,RI,UP); if( x<=x1 || yp,&x,&y,x0,x1,y0,y1,cs,DO,ST); if( y>y0+dy/4 ) Break; - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,ST,DO); if( y>y0+dy/3 ) Break; - y+=dy/15; - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,LE,ST); if( x15 && x==x0) ad=99*ad/100; // to thin - x+=dx/15+1; - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,DO,ST); if( y>y1-dy/3 ) Break; - // if( num_hole(x0, x1, y0 , y1 ,box1->p,cs,NULL) > 0 ) Break; - if (sdata->holes.num > 0) Break; - i=loop(box1->p,x0,y0+dy/4,dx,cs,0,RI); if(i>dx/2) Break; - j=loop(box1->p,x0,y0+dy/2,dx,cs,0,RI); if(ji+dx/8) Break; i=j; - j=loop(box1->p,x0,y1-dy/4,dx,cs,0,RI); if(ji+dx/8) Break; - j=loop(box1->p,x1,y1-dy/4,dx,cs,0,LE); - for( x=dx,y=y0+dy/6; yp,x0,y,dx,cs,0,RI); - if (i>j/2 && ad>98) ad=99*ad/100; - if (i>dx/4) break; - if(i3*dx) // ~[ - if( get_bw(x0+dx/2,x0+dx/2,y0+dy/4,y1-dy/4,box1->p,cs,1) == 0 ) Break; - - if (box1->m2) { - if (!hchar) ad=ad*99/100; - if ( gchar) ad=ad*99/100; - } - Setac(box1,(wchar_t)'E',ad); - if (ad>=100) return 'E'; - break; - } - return box1->c; -} - -static wchar_t ocr0_n(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - int i,j,d,x,y,i1,i2,i3,handwritten=0, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test n --------------------------------------------------- - // glued rm is very similar to glued nn -> thickness of h-line should grow - // may02: tested for 8x12 font - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='n'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - i= num_cross( 0,dx-1,dy/4,dy/4,sdata->bp,cs); - j= num_cross( 0,dx-1,dy/2,dy/2,sdata->bp,cs); - if( (i<2 || i>3) && j!=2 ) Break; - if( loop(sdata->bp,dx/2,0,dy,cs,0,DO) > dy/8 && sdata->hchar ) Break; /* tt */ - y=5*dy/8; /* also for handwritten n, where first bow goes not down enough */ - if( num_cross( 0,dx/2,y ,y ,sdata->bp,cs) != 1 - && num_cross( 0,dx/2,y-1,y-1,sdata->bp,cs) != 1 - && num_cross(dx/2,dx-1,y ,y ,sdata->bp,cs) < 1 ) Break; // n rr - // ~thick_w - y=loop(sdata->bp,dx-1-dx/4,0,dy,cs,0,DO); if(y>dy/2) Break; - if(y>1)if( get_bw(dx-1-dx/4,dx-1,0,y-2,sdata->bp,cs,1) == 1 ) Break; - - y=3*dy/4; - if( num_cross(0, dx/2,y ,y ,sdata->bp,cs) == 1 - && num_cross(dx/2,dx-1,y ,y ,sdata->bp,cs) == 0 ) Break; // ~p - y=dy/2; - if( num_cross(0,dx-1,dy/2-dy/8,dy/2-dy/8,sdata->bp,cs) == 2 - && num_cross(0,dx-1,dy/2, dy/2 ,sdata->bp,cs) == 2 ) { // n rr - /* printed n */ - x =loop(sdata->bp,0,y,dx ,cs,0,RI); if(x> dx/4) Break; // search 1st v-line - x+=loop(sdata->bp,x,y,dx-x,cs,1,RI); if(x> dx/2) Break; i1=x; // 1st gap - x+=loop(sdata->bp,x,y,dx-x,cs,0,RI); if(x< dx/2) Break; i2=x; // 2nd v-line - x+=loop(sdata->bp,x,y,dx-x,cs,1,RI); if(x<3*dx/4) Break; i3=x; // 2nd gap - i=dy/4; y=13*dy/16; - if( num_cross(dx/2,dx-1,y,y,sdata->bp,cs)==2 ) i=3*dy/8; // \it n - if (i<2 && il1 l2 l3 l4 ??? - for(x=i1;xbp,x, 0,dy,cs,0,DO)>=i ) break; - if(x bp,x,dy-1,dy,cs,0,UP) >dy/4 ) break; - if(x==i2) Break; // no gap detected (glued serifs ??? ) - // glued rm as nn ??? - for(y=0,x=(i1+i2)/2;xbp,x,0,dy,cs,0,DO); - i=loop(sdata->bp,x,i,dy,cs,1,DO); // measure thickness - if( i>y ) y=i; if( i7 ) - if( loop(sdata->bp,dx-1,dy-1-dy/8,dx,cs,0,LE) - +loop(sdata->bp, 0,dy-1-dy/8,dx,cs,0,RI)-dx/8-1 - > loop(sdata->bp,dx-1,dy-1-dy/2,dx,cs,0,LE) - +loop(sdata->bp, 0,dy-1-dy/2,dx,cs,0,RI) ) ad=90*ad/100; // broken o - if( dy>7 && dx>7 ) - if( loop(sdata->bp,dx-1, dy/2,dx,cs,0,LE)==0 - && loop(sdata->bp,dx-1,dy-1-dy/8,dx,cs,0,RI)>dx/8 ) ad=98*ad/100; // broken o - } else { /* check handwritten n */ - if( num_cross(0,dx-1,dy/2, dy/2 ,sdata->bp,cs) != 3 - && num_cross(0,dx-1,dy/2-dy/8,dy/2-dy/8,sdata->bp,cs) != 3 ) Break; - i =loop(sdata->bp,0,dy/2-dy/8,dx,cs,0,RI); if (i>dx/4) Break; - i+=loop(sdata->bp,i,dy/2-dy/8,dx,cs,1,RI); if (i>dx/2) Break; - i+=loop(sdata->bp,i,dy/2-dy/8,dx,cs,0,RI); - if( num_cross(i,i, 0,dy/2-2*dy/8,sdata->bp,cs) != 0 ) Break; - i+=loop(sdata->bp,i,dy/2-dy/8,dx,cs,1,RI); - if( num_cross(i,i,dy/2+1, dy-1,sdata->bp,cs) != 0 ) Break; - handwritten=80; - } - - i= loop(sdata->bp,dx-1 ,dy/2,dx,cs,0,LE); if(i>5) - if( get_bw(dx-1-i/2,dx-1-i/2,0,dy/2,sdata->bp,cs,1) == 1 ) Break; // ~rr - i+=loop(sdata->bp,dx-1-i,dy/2,dx,cs,1,LE); - if( get_bw(dx-1-i ,dx-1-i ,0,dy/2,sdata->bp,cs,1) == 0 ) Break; // ~rv - - if( get_bw(dx/2,dx/2,dy/4,dy/4,sdata->bp,cs,1) == 0 - && get_bw(dx/2,dx-1,dy-2,dy-2,sdata->bp,cs,1) == 0 - && get_bw(dx/2,dx/2,dy/4,dy-2,sdata->bp,cs,1) == 1 ) Break; // ~P - - // glued ri ??? - if( box1->dots>0 && box1->m1 ) - if( get_bw((x1+x0)/2,x1,box1->m1,y0-1,box1->p,cs,1) == 1 ) - if( num_cross( 0,dx-1,0 ,0 ,sdata->bp,cs) >2 - || num_cross( 0,dx-1,1 ,1 ,sdata->bp,cs) >2 ) Break; - - - i=loop(sdata->bp,dx-1, dy-1,dx,cs,0,LE); if (i>dx/2) - i=loop(sdata->bp,dx-1, dy-2,dx,cs,0,LE); - x=loop(sdata->bp,dx-1,dy-1-dy/4,dx,cs,0,LE); - if (sdata->hchar && i-x>1) Break; // ß - x=loop(sdata->bp, 0,dy-1,dx,cs,0,LE); // check for serifs - i=loop(sdata->bp, 0,dy-2,dx,cs,0,LE); if (ibp, 0, 1,dx,cs,0,LE); if (ibp, 0, 2,dx,cs,0,LE); if (ihchar && x>0) Break; // fl - - if (num_cross( 0,dx-1,dy/4,dy/4,sdata->bp,cs)>=3) ad=98*ad/100; // small M - if (sdata->hchar || 2*y0m1+box1->m2) ad=96*ad/100; - if (sdata->gchar) ad=96*ad/100; // ß fl - if (dx<5) { // for small fonts no middle line is possible for m - ad=99*ad/100; // 4x6 m - if (num_cross(0,dx-1,dy/8,dy/8,sdata->bp,cs)>=2) { - ad=97*ad/100; // ~m - if (dy<=4) Setac(box1,'m',97); // only for 4x6 font! - } - } - Setac(box1,'n',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_M(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int d,x,y,i0,i1,i2,i3,t1,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // ------------------ test M --------------------------- - for(ad=d=100;dx>3 && dy>3;){ // dy<=dx nicht perfekt! besser mittleres - // min-suchen fuer m - DBG( wchar_t c_ask='M'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if( num_cross(0,dx-1, dy/2, dy/2,bp,cs)<3 - && num_cross(0,dx-1, dy/4, dy/4,bp,cs)<3 - && num_cross(0,dx-1,5*dy/8,5*dy/8,bp,cs)<3 - && num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs)<3 - && dx>4 ) Break; - if( num_cross(0,dx-1, dy/4, dy/4,bp,cs)<2 - && num_cross(0,dx-1, dy/8, dy/8,bp,cs)<2 ) Break; /* fat M */ - if( num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs)<2 ) Break; - - x = loop(bp,dx-1 ,dy-1,dx,cs,0,LE); // ~ melted kl - x = loop(bp,dx-1-x,dy-1,dx,cs,1,LE); if( x>dx/2 ) Break; - - if( loop(bp, 0,7*dy/16,dx,cs,0,RI) - + loop(bp,dx-1,7*dy/16,dx,cs,0,LE) > dx/2 ) Break; // ~K - - if( dy>8 /* following lines should be extend to range check */ - && loop(bp, dx/4,dy-1, dy,cs,0,UP) 2 - && num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs)> 2 ) Break; // ~it_u - if( num_cross(0 ,dx-1,3*dy/4,3*dy/4,bp,cs)==2 - && num_cross(dx/2,dx/2,3*dy/4, dy-1,bp,cs)> 0 ) Break; // ~it_v - - if( loop(bp,3*dx/4, 0,dy,cs,0,DO) - > loop(bp,2*dx/4, 0,dy,cs,0,DO) - && loop(bp,3*dx/4,dy-1,dy,cs,0,UP) - < loop(bp,2*dx/4,dy-1,dy,cs,0,UP) ) Break; // ~N - if( loop(bp,3*dx/4, dy/8,dy,cs,0,DO) - > loop(bp,2*dx/4, dy/8,dy,cs,0,DO) - && loop(bp,3*dx/4,dy-1-dy/8,dy,cs,0,UP) - < loop(bp,2*dx/4,dy-1-dy/8,dy,cs,0,UP) ) Break; // ~serif_N - - // i0 is lower end of upper serifen (widest gap? ) - i0=0; - - if( num_cross(0,dx-1,dy/2,dy/2,bp,cs)!=4 ){ // Is it a N ? - if( num_cross(0,dx-1,dy/2,dy/2,bp,cs)==3 ){ - for(y=dy/2+1;yy-2 ) Break; // ~N - } - } - } - // MNWK - for(i2=0,i1=x=dx/2;xi2) {i2=y;i1=x;} else break; } - i3=i2+loop(bp,i1,i2,dy-i2,cs,1,DO); - if(i2hchar) Break; // rm - ad=99*ad/100; - } - if (i2==0 && dx>8 && dy>12) Break; // glued and bad splitted serifen-MN - - // if( num_hole(x0, x1, y0 , y1 ,box1->p,cs,NULL) != 0 ) Break; // small A - if (sdata->holes.num != 0) Break; - t1=loop(bp,0 ,3*dy/4,dx,cs,0,RI); - t1=loop(bp,t1,3*dy/4,dx,cs,1,RI); // thickness of line? - if( 7*(t1+1)=i2 ) Break; // no good M - i1+=loop(bp,i1, dy/4,dx,cs,1,RI); - i2+=loop(bp,i2,3*dy/4,dx,cs,1,RI); - if( i1>=i2 ) Break; // no good M - i1+=loop(bp,i1, dy/4,dx,cs,0,RI); - i2+=loop(bp,i2,3*dy/4,dx,cs,0,RI); - if( i1<=i2 ) Break; // no good M - } - if( num_cross(0,dx-1,dy/2,dy/2,bp,cs)==2 - && num_cross(0,dx-1,dy/4,dy/4,bp,cs)==2 && !hchar ) Break; // ~ \it u - - if (dy<17) - if( num_cross(0,dx-1, 0, 0,bp,cs)<2 ) ad=99*ad/100; - if (dx>5) /* 4x6 font has only 1 cross at y=1 */ - if( num_cross(0,dx-1, 1, 1,bp,cs)<2 ) ad=96*ad/100; // kt - if( num_cross(dx/2,dx/2, 0, dy-1,bp,cs)!=1) ad=98*ad/100; // kt - if (dx<5 && loop(bp,dx/2,0,dy,cs,0,DO)>=3*dy/8) ad=96*ad/100; // 4x6 H - - if( num_cross(0,dx-1, dy/4, dy/4,bp,cs)<=2 - && num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs)<=2 - && dx>8 && dy>12 ){ - ad=98*ad/100; - for(y=5*dy/16;y<5*dy/8;y++) // look for H-line - if( num_cross(0,dx-1,y ,y ,bp,cs)==1 ) break; - if( y<5*dy/8 ) ad=95*ad/100; - if( y<5*dy/8 ) - if( num_cross(2+dx/6,dx-3-dx/6,y-2,y-2,bp,cs)==0 - || num_cross(2+dx/6,dx-3-dx/6,y-1,y-1,bp,cs)==0 ) Break; // ~H bad! - } - - if( loop(bp,3*dx/8, 0,dy,cs,0,DO) >dy/2 - && loop(bp,5*dx/8,dy-1,dy,cs,0,UP) >dy/2 ) ad=95*ad/100; - - if(!hchar){ - ad=98*ad/100; /* not sure */ - if( loop(bp,0, dy/4,dx,cs,0,RI) - < loop(bp,0,dy-1-dy/8,dx,cs,0,RI)-dx/16 ) Break; // ~wi glued - } - if( gchar ) ad=98*ad/100; - if (ad>99 && dx<8) ad=99*ad/100; /* give 5x8 N a chance */ - Setac(box1,'M',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_N(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - int d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - (*aa)[4]=sdata->aa, /* corner-points, (x,y,dist^2,vector_idx) */ - dbg[9], - ad; /* tmp-vars */ - - // --- test N ------- +hchar -gchar - for(ad=d=100;dx>3 && dy>3;){ // 4x6font - DBG( wchar_t c_ask='N'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if (sdata->holes.num > 0) ad=98*ad/100; /* # */ - if (dx<6) ad=99*ad/100; - if (dx<5) ad=99*ad/100; - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the 4 ends of the x */ - if (aa[0][2]>d) Break; - if (aa[1][2]>d) Break; - if (aa[2][2]>d) Break; - if (aa[3][2]>d) Break; - if (aa[3][0]-aa[0][0](dy+2)/5) Break; /* glued tu */ - if (abs(aa[3][1]-aa[0][1])>(dy+4)/8) ad=98*ad/100; /* glued tu */ - /* left and right vertical line */ - d=line_deviation(box1, aa[0][3], aa[1][3]); if (d>2*sq(1024/4)) Break; - ad=(100-(d-sq(1024)/2)/sq(1024)/4)*ad/100; - d=line_deviation(box1, aa[2][3], aa[3][3]); if (d>2*sq(1024/4)) Break; - - /* search uppermost left ^ (between near 0,0) */ - i1=nearest_frame_vector(box1,aa[1][3],aa[2][3], x0+dx/8, y0); - x=box1->frame_vector[i1][0]; - y=box1->frame_vector[i1][1]; - MSG( fprintf(stderr,"i1= %d (%d,%d) left ^", i1,x-x0,y-y0);) - if (y-y0 > 5*dy/8) Break; - if (x-x0 > 5*dx/8) Break; - /* search uppermost right ^ ~H */ - i3=nearest_frame_vector(box1,aa[1][3],aa[2][3], x1, y0); - MSG( fprintf(stderr,"i3= %d (%d,%d) right ^",\ - i3, box1->frame_vector[i3][0]-x0,box1->frame_vector[i3][1]-y0);) - - /* check if upper left and lower right point are joined directly */ - dbg[0]=d=line_deviation(box1,i1, aa[2][3]); - /* check if lower left and lower left point are joined directly */ - dbg[1]=d=line_deviation(box1, aa[1][3],i1); - MSG( fprintf(stderr," i1-a2 %d a1-i1 %d",dbg[0],dbg[1]); ) - if (dbg[0] > sq(1024/4)) Break; - if (dx>4 && dbg[1] > sq(1024/4)) ad=97*ad/100; // d=0..2*sq(1024) - if (dx>4 && dbg[1] > sq(1024/3)) Break; // d=0..2*sq(1024) - // serif N has d=sq(1024/3)=116508 - - /* serach lowest right v, same frame? N-tilde etc.? */ - i2=nearest_frame_vector(box1,aa[3][3],aa[0][3], x1, y1-dy/8); - x=box1->frame_vector[i2][0]; - y=box1->frame_vector[i2][1]; - MSG( fprintf(stderr,"i2= %d (%d,%d) right v",\ - i2, box1->frame_vector[i2][0]-x0,box1->frame_vector[i2][1]-y0);) - if (y-y0 < 3*dy/8) Break; - if (x-x0 < 3*dx/8) Break; - // test H - if ( box1->frame_vector[i3][0]-box1->frame_vector[i1][0]> dx/4 - && box1->frame_vector[i3][1]-box1->frame_vector[i1][1]<=dy/8 - && y<=box1->frame_vector[i1][1]) Break; - /* check if upper left and lower right point are joined directly */ - dbg[2]=d=line_deviation(box1,i2, aa[0][3]); - /* check if lower right and lower right point are joined directly */ - dbg[3]=d=line_deviation(box1, aa[3][3],i2); - MSG( fprintf(stderr," i2-a0 %d a3-i2 %d",dbg[2],dbg[3]); ) - if (dbg[2] > sq(1024/4)) Break; - if (dbg[3] > sq(1024/4)) ad=97*ad/100; // serif N, ToDo: do it better - if (dbg[3] > sq(1024/3)) Break; - - if (abs((box1->frame_vector[i1][1]-y0) - -(y1-box1->frame_vector[i2][1]))>dy/8) ad=99*ad/100; /* ~ tu */ - if (abs(((y0+y1)/2-box1->frame_vector[i1][1]) - -(box1->frame_vector[i2][1]-(y0+y1)/2))>dy/8) ad=99*ad/100; /* ~ tu */ - if (box1->frame_vector[i2][0] - -box1->frame_vector[i1][0]<=dx/8) Break; /* nonsignificant distance */ - if (box1->frame_vector[i2][1] - -box1->frame_vector[i1][1]<=dy/8) ad=97*ad/100; /* too flat (ff,H) */ - if (box1->frame_vector[i2][1] - -box1->frame_vector[i1][1]<=dy/2) ad=99*ad/100; - MSG( \ - fprintf(stderr,"^v %d %d %d %d line deviation %d %d %d %d max %d %d",\ - box1->frame_vector[i1][0]-x0,box1->frame_vector[i1][1]-y0,\ - box1->frame_vector[i2][0]-x0,box1->frame_vector[i2][1]-y0,\ - dbg[0],dbg[1],dbg[2],dbg[3],sq(1024/4),sq(1024));) - ad=(100-(dbg[0]-sq(1024)/2)/sq(1024)/4)*ad/100; - ad=(100-(dbg[1]-sq(1024)/2)/sq(1024)/4)*ad/100; - ad=(100-(dbg[2]-sq(1024)/2)/sq(1024)/4)*ad/100; - ad=(100-(dbg[3]-sq(1024)/2)/sq(1024)/4)*ad/100; - - if (!hchar) ad=99*ad/100; - if ( gchar) ad=98*ad/100; // \sc N - Setac(box1,'N',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_h(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - int (*aa)[4]=sdata->aa; /* corner-points, (x,y,dist^2,vector_idx) */ - - // --- test h --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - // rewritten for vectors 0.42 - int i1, i2, i3, i4, i5, i6, i7, i8; // line derivation + corners - DBG( wchar_t c_ask='h'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the upper right end of the h */ - if (aa[3][2]d/2) Break; /* upper left end */ - if (aa[1][2]>d/2) Break; /* lower left end */ - if (aa[2][2]>d/2) Break; /* lowerright end */ -/* - type A B=italic ??? - 18 OOO - O O O - O O - O7OOO OOOO - O4 O O O - O O O O - O O O O O - 2O3 5O6 O OOO -*/ - i1=i8=aa[0][3]; - i2=i3=aa[1][3]; - i5=i6=aa[2][3]; - // check the bow from below - for (i4=i=i2;i!=i5;i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[ i][1] - frame_vector[i4][1]) i4=i; // get next maximum - if (box1->frame_vector[ i][1]<=y0) break; // fatal! - } - if (box1->frame_vector[i4][1]-y0frame_vector[i4][1]18 ) - if( get_bw(dx-1-dx/3,dx-1,dy/6 ,dy/5 ,bp,cs,1) == 1 ) Break; - if( get_bw(dx-1-dx/3,dx-1,dy-1-dy/4,dy-1 ,bp,cs,1) == 0 ) Break; // s- - for( x=x0+dx/3;xp,cs,1) == 0 ) break; - if( x>=x1-dx/3 ) Break; - for(i=dy/4,y=y0+dy/3;y<=y1 && i;y++){ - if( num_cross(x0,x1 ,y,y, box1->p,cs) == 2 ) i--; - } if( i ) Break; - for(i=dy/4,y=y0;y<=y0+dy/2 && i;y++){ - if( num_cross(x0,x0+dx/2,y,y, box1->p,cs) == 1 ) i--; - } if( i ) Break; - // if( num_hole(x0, x1, y0 , y1 ,box1->p,cs,NULL) > 0 ) // could happen - if (sdata->holes.num > 0) - if (sdata->holes.hole[0].y0 > dy/3 - && sdata->holes.hole[0].y1 < dy-1-dy/3) Break; - // if( num_hole(x0, x1, y0+dy/3 , y1-dy/3 ,box1->p,cs,NULL) != 1 ) Break; // mini - if( loop(bp,dx-1,dy/3,dx,cs,0,LE)+dx/8 - < loop(bp,dx-1,dy/2,dx,cs,0,LE) - && loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)+dx/8 - < loop(bp,dx-1,dy/2,dx,cs,0,LE)) Break; // ~k Okt00 - i=loop(bp,0,dy-1-dy/4,dx,cs,0,RI); - if (i>1 && num_cross(x0,x0,y0+dy/8+2,y0+dy/2, box1->p,cs) == 1 ){ // fi fu - ad=(99-(1<p,cs) == 0 ) ad=97*ad/100; - if (num_cross(x0+dx/2,x0+dx/2,y0,y0+dy/8+2, box1->p,cs) == 1 ) ad=97*ad/100; - if (ad<1) break; - } - i =loop(bp,0,dy/4,dx,cs,0,RI); - i+=loop(bp,i,dy/4,dx,cs,1,RI)+1; - for ( ; i5*dy/8 ) { - ad=98*ad/100; // melted hi, li, but handwritten h - MSG(fprintf(stderr,"ad=%d",ad);) } - if( num_cross(x0,x0,y0+(dy+3)/8,y1,box1->p,cs) > 1 ) { - ad=98*ad/100; // melted fr - MSG(fprintf(stderr,"ad=%d",ad);) } - - i=loop(bp,dx-1,3*dy/4,dx,cs,0,LE); // melted "fr" for vertikal letters - if (i>dx/4 && loop(bp,dx-1-i,dy-1,dy,cs,1,UP)>dy/2) { - ad=94*ad/100; MSG(fprintf(stderr,"ad=%d",ad);) } - - i=loop(bp,dx-1,1+dy/16,dx,cs,0,LE); if (i 0 ) { - ad=95*ad/100; // melted fi - MSG(fprintf(stderr,"ad=%d",ad);) } - if (loop(box1->p,x1,y0+1+dy/16,dx,cs,0,LE)p,x1,y0 ,dx,cs,0,LE)p,x1,y0+1,dx,cs,0,LE)holes.num > 0) ad=97*ad/100; - if (box1->m2) { - if ( gchar) ad=98*ad/100; - if (!hchar) ad=97*ad/100; - } else ad=99*ad/100; - Setac(box1,'h',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_H(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,j1,d,x,y,ya,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test H --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='H'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if( num_cross(0,dx-1,dy/4 ,dy/4 ,bp,cs) != 2 - && num_cross(0,dx-1,dy/4-1,dy/4-1,bp,cs) != 2 ) Break; - if( num_cross(0,dx-1,3*dy/4 ,3*dy/4 ,bp,cs) != 2 - && num_cross(0,dx-1,3*dy/4+1,3*dy/4+1,bp,cs) != 2 ) Break; - if( loop(bp,0 ,dy/8,dx,cs,0,RI) - + loop(bp,dx-1,dy/8,dx,cs,0,LE)>dx/2 ) Break; // ~A - for( j1=0,i=1,y=y0+dy/10; yp,x0 ,y,dx,cs,0,RI) - +loop(box1->p,x1 ,y,dx,cs,0,LE); if( j>dx/2 ) i=0; if(j>j1)j1=j; } - if( !i ) Break; - for( i=1,y=dy/4; ydx/5 ) i=0; } - if( !i ) Break; // ~K Jul00 - for( i=0,ya=y=y0+dy/3; yp,x0 ,y,dx,cs,0,RI); - j=loop(box1->p,x0+j,y,dx,cs,1,RI); if( j>i ) { i=j; ya=y; } } - if( i<=dx/2 ) Break; ya-=y0; - if( num_cross(0,dx-1,ya ,ya ,bp,cs) != 1 - && num_cross(0,dx-1,ya+1,ya+1,bp,cs) != 1 ) Break; /* Dec00 */ - for( y=ya; y 2 - && num_cross(0,dx-1,y+1,y+1,bp,cs) > 2 ) break; - if ( yp,cs,1) == 0 ) i=0; - } if( i ) Break; - for(i=1,x=x0+dx/4;x<=x1-dx/4 && i;x++){ - if( get_bw( x, x,y1-dy/4,y1 ,box1->p,cs,1) == 0 ) i=0; - } if( i ) Break; - for(i=1,x=x0+dx/4;x<=x1-dx/4 && i;x++){ - if( num_cross(x,x,y0+dy/8,y1-dy/8, box1->p,cs) == 1 ) i=0; - } if( i ) Break; - for(i=1,y=y0;y<=y0+dy/4 && i;y++){ - if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; - } if( i ) Break; - for(i=1,y=y1-dy/4;y<=y1 && i;y++){ - if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; - } if( i ) Break; - if( get_bw(x1-dx/8, x1 , y0, y0+dy/8,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0 , x0+dx/8, y1-dy/8, y1,box1->p,cs,1) != 1 ) Break; - i1=loop(bp,dx-1, dy/4,dx,cs,0,LE); if(i1>dx/2) Break; - i2=loop(bp,dx-1, dy/2,dx,cs,0,LE); if(i2i1+dx/8) Break; - i3=loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE); if(i3i2+dx/8) Break; - if(abs(i1+i3-2*i2)>dx/16+1) Break; - // test for thick tall N looking like a H - if( num_cross(x0,x1,y0,y1, box1->p,cs) < 2 ) Break; // sure N - i1=loop(bp, 0, dy/4,dx,cs,0,RI); - i1=loop(bp, i1, dy/4,dx,cs,1,RI); - i2=loop(bp, 0,dy-1-dy/4,dx,cs,0,RI); - i2=loop(bp, i2,dy-1-dy/4,dx,cs,1,RI); - i3=loop(bp,dx-1 ,dy-1-dy/4,dx,cs,0,LE); - i3=loop(bp,dx-1-i3,dy-1-dy/4,dx,cs,1,LE); - i =loop(bp, 0,dy/2+1+dy/8,dx,cs,0,RI); - i+=loop(bp, i,dy/2+1+dy/8,dx,cs,1,RI); - i =loop(bp, i,dy/2+1+dy/8,dx,cs,0,RI); - if (i6*i2 && 5*i3>6*i2 && i1>i2 && i3>i2 ) Break; - if( dx>8 ) - if ( loop(bp,dx-1, 3*dy/8,dx,cs,0,LE) - -loop(bp,dx-1, dy/8,dx,cs,0,LE)>dx/4 - && loop(bp,dx-1, 3*dy/8,dx,cs,0,LE) - -loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)>dx/4 ) Break; // ~K - // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 0 ) Break; - if (sdata->holes.num != 0) Break; - if ( gchar) ad=99*ad/100; - if (!hchar) ad=98*ad/100; - Setac(box1,'H',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_k(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - int (*aa)[4]=sdata->aa; /* corner-points, (x,y,dist^2,vector_idx) */ - - // --- test k --------------------------------------------------- - for(ad=100;dx>2 && dy>3;){ // min 3x4 - // rewritten for vectors 0.43 - int d, i1, i2, i3, i4, i5, i6, i7, i8; // line derivation + corners - DBG( wchar_t c_ask='k'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the upper right end of the h */ - if (aa[3][2]d/2) Break; /* upper left end */ - if (aa[1][2]>d/2) Break; /* lower left end */ - if (aa[2][2]>d/2) Break; /* lowerright end */ -/* - type A B=italic ??? - 18 OOO - O O O - O O6 O - O7 OO O OO - O4OO OO OO - O OO O O - O OO O O O - 2O3 O5 O OOO -*/ - i1=i8=aa[0][3]; - i2=i3=aa[1][3]; - i5= aa[2][3]; - // check the bow from below - for (i4=i=i2;i!=i5;i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[ i][1] - frame_vector[i4][1]) i4=i; // get next maximum - if (box1->frame_vector[ i][1]<=y0) break; // fatal! - } - if (box1->frame_vector[i4][1]-y0frame_vector[i4][1]frame_vector[i][0]frame_vector[i][0]dx/2) Break; - i3=loop(bp,0,dy/2+dy/4,dx,cs,0,RI); - if(abs(i1+i3-2*i2)>dx/16+1 || i1p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2,x1, y1-dy/3,y1 ,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/4,x1, y0 ,y0+3*dy/16,box1->p,cs,1) == 1 ) Break; - if( get_bw(x1-dx/4,x1, y0+dy/4,y1-dy/4,box1->p,cs,1) != 1 ) Break; //~1 - if( get_bw(x1-dx/4,x1, y1-dy/8,y1 ,box1->p,cs,1) != 1 ) Break; - if (sdata->holes.num > 0) - if (sdata->holes.hole[0].y0 > dy/4) Break; - // if( num_hole(x0,x1,y0+dy/4,y1,box1->p,cs,NULL) != 0 ) Break; - for(y=y0+1;yp,cs,1) == 0 ) break; - if( yp,cs,100)>50) i=0; - if( i ) Break; // no vertikal line! - - /* check for falling line in the lower left corner */ - for (j=x=0,y=5*dy/8;y<7*dy/8;y++) { - i= loop(bp,dx-1,y,dx,cs,0,LE); if(i>x) { x=i;j=y; } - } // x=dx/6 on fat k - if (x + loop(bp,dx-1-x,y,dx,cs,1,LE)/2 dx/2) - i =loop(bp,dx-1,dy-2,dx,cs,0,LE); if(i>dx/2) Break; - i+=loop(bp,dx-1-i,dy-1,dx,cs,1,LE)/2; - if( get_line(x,y,dx-1-i,dy-1,bp,cs,100)<60 ) Break; - - for(y=y0+dy/3;yp,cs)==2 ) break; - if( y==y1 ) Break; - if( - // num_hole(x0,x1 ,y0 ,y1 ,box1->p,cs,NULL)>0 // ~A happens! - sdata->holes.num > 0 ) - if (sdata->holes.hole[0].x1>dx-1-dx/4 - || sdata->holes.hole[0].y1>dy-1-dy/4 - || sdata->holes.hole[0].y0< dy/4) Break; - // if ( num_hole(x0,x1-dx/4,y0+dy/4,y1-dy/4,box1->p,cs,NULL)==0 ) Break; - i=loop(bp,0,dy-1,dx,cs,0,RI); - i=loop(bp,i,dy-1,dx,cs,1,RI); if (dx>8 && 4*i>3*dx) Break; // ~glued_tz - i =loop(bp,0,dy/4,dx,cs,0,RI); - if (i>dx/4 - && i+loop(bp,i,dy/4,dx,cs,1,RI)>dx/2 - && loop(bp, 0,0,dx,cs,0,RI)<=dx/4 - && loop(bp,dx-1,0,dx,cs,0,LE)>=dx/2 ) ad=90*ad/100; // divided Q - - if( 2*y0>(box1->m1+box1->m2) ) ad=99*ad/100; - - if ( gchar) ad=98*ad/100; - if (!hchar) ad=98*ad/100; - Setac(box1,'k',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_K(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,i1,i2,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad,ya,xa,yb,xb,yc,xc,yd,xd,ye,xe,yf,xf; /* tmp-vars */ - - // --- test K --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // updated 29 Mar 2000 perfect??? - DBG( wchar_t c_ask='K'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - for(y=dy/8;yp,x,y0,y1-y0,cs,0,DO); if (y>3*dy/4) { i=1;break; } - if (dy>15 && j>dy/8){ - j =loop(box1->p,x-1,y0+y-1,x1-x0,cs,0,LE)/2; - y+=loop(box1->p,x-j,y0+y-1,y1-y0,cs,0,DO)-1; - } - if(y>=dy/4) i=0; /* ok, found gap */ - } if( i ) Break; - for(y=0,x=x0+dx/4;x<=x1-dx/4;x++){ // lower h-gap - i=loop(box1->p,x,y1,dy,cs,0,UP); - /* on small chars bypass possible low left serifs */ - if (i>0) { i2=loop(box1->p,x-1,y1-i-1,dy,cs,0,UP); - if (i2>1) i+=i2-1; } - if (i>y) { y=i; i1=x; } - } if( y<=dy/8 ) Break; if (yp,cs) == 2 ) i=0; - } if( i ) Break; - for(i=1,y=y0;y<=y0+dy/4 && i;y++){ - if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; - } if( i ) Break; - if( dx<10 ){ - for(i=1,y=y0+dy/3;y<=y1-dy/3 && i;y++){ - if( num_cross(x0,x1,y,y, box1->p,cs) == 1 ) i=0; - } if( i ) Break; - } - for(i=1,y=y1-dy/4;y<=y1 && i;y++){ - if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; - } if( i ) Break; - if( get_bw(x1-dx/3,x1,y0,y0+dy/8,box1->p,cs,1) != 1 ) Break; // ~k - if( dy>16 - && loop(bp,0, dy/4,dx,cs,0,RI) - +loop(bp,0,3*dy/4,dx,cs,0,RI) - <2*loop(bp,0, dy/2,dx,cs,0,RI)-2-dx/32 ) Break; // ~X - - i=loop(box1->p,x1,y0+ dy/4,x1-x0+1,cs,0,LE); if(i>dx/2) Break; - j=loop(box1->p,x1,y0+ dy/2,x1-x0+1,cs,0,LE); - x=loop(box1->p,x1,y0+3*dy/8,x1-x0+1,cs,0,LE); if(x>j) j=x; - if(j<=i ) Break; i=j; - j=loop(box1->p,x1,y1-dy/4,x1-x0+1,cs,0,LE); if(j>=i ) Break; - // out_x(box1); // detailed analysis - // - // a d <= that are main points of K - // | / - // b/e - // | \ . - // c f - ya= dy/4;xa=loop(bp,0,ya,dx,cs,0,RI);xa+=loop(bp,xa,ya,dx,cs,1,RI)/2; - yc=dy-dy/4;xc=loop(bp,0,yc,dx,cs,0,RI);xc+=loop(bp,xc,yc,dx,cs,1,RI)/2; - yb=dy/2; xb=dx-1-loop(bp,dx-1,dy/2,dx,cs,0,LE); - for(yd=ye=yf=xe=y=i=0,xf=xd=dx;yxe){ xe=x;ye=dy/2+y; } - x =loop(bp,dx-1,dy/2-y,dx,cs,0,LE); if(x>xe){ xe=x;ye=dy/2-y; } -#if 0 // removed v0.2.4a2 - x =loop(bp,0 ,dy/2+y,dx,cs,0,RI); // middle left border - x+=loop(bp,x ,dy/2+y,dx,cs,1,RI); // test 2nd cross - x+=loop(bp,x ,dy/2+y,dx,cs,0,RI); if(x8 ){ // example szaka0103 - if( xe>5*dx/8 || xb>5*dx/8 ) Break; // ~{\it n} - i=loop(bp,xb,yb,xb,cs,1,LE); // thick center? see font22 - if( get_line2(xb,yb,xd,yd,bp,cs,100)<95 ) // right up - if( get_line2(xb-i/2,yb,xd,yd,bp,cs,100)<95 ) Break; - if( get_line2(xe,ye,xf,yf,bp,cs,100)<95 ) Break; // right down - xe+=loop(bp,xe,ye,dx,cs,1,RI); if( xe>=xf ) Break; // ~{\it n} - } else { - if( dy<16 && !hchar ) Break; - if( loop(bp,0,1,dy,cs,1,DO)<=3*dx/4 - && loop(bp,1,1,dy,cs,1,DO)<=3*dx/4 - && loop(bp,2,1,dy,cs,1,DO)<=3*dx/4 ) Break; // ~x - } - if (loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE)<=dx/8){ - ad=99*ad/100; /* broken B ? */ - if (sdata->holes.num > 0) - if (sdata->holes.hole[0].y1 < dy-1-dy/3) Break; - // if( num_hole(x0,x1,y0,(y0+2*y1)/3,box1->p,cs,NULL)>0) Break; // broken B - } - if(box1->m3 && !hchar) ad=99*ad/100; - if(box1->m3 && gchar) ad=99*ad/100; - // printf(" ok xe=%d",xe); - Setac(box1,'K',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_f(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - (*aa)[4]=sdata->aa, /* the for line ends, (x,y,dist^2,vector_idx) */ - ab[8][4], /* special points (x,y,dist^2,vector_idx) */ - ad; /* tmp-vars */ - /* x=mindist_to_a y=0 "t" - 0>..$$. 0>..$$ 0>..$$ end right bow a--..$$ a--.$7. y>0 "f" - 1>.$..$ 1>.$.. 1>.$$$ start right bow .$7. .$.. - .@... .@.. 2>.@@. start upper end .@.. .@.. - 2>.$... 2>.$.. 3>$$$$ crossing bar .$.. $$$. - 3>$@$$. 3>$@$. $@@$ $@$. .@.. - 4>.$... 4>.$.. 4>.$$. lower end .$.. .$.. - .@... .@.. .@@. .@.. .@.. - .@... .@.. .@@. .@.. .@.. - 5>.$... 5>.$.. 5>.$$. lower start .$.. .$.. - 6>..... 6>$... 6>.... optional left bow - */ - // --- test f like t --------------------------------------------------- - for(ad=d=100;dx>2 && dy>5;){ // sometimes no hchar! - // rewritten for vectors 0.43 - int d, i1, i2, i3, i4, i5, i6, i7, i8, i9; // line derivation + corners - DBG( wchar_t c_ask='f'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the upper right end of the h */ - if (aa[3][2]>d/2) Break; /* [2] = distance, ~BCDEF... */ - if (aa[0][2]>d ) Break; /* upper left end */ -/* - 9 - OOO - O 7 O8 - O6 - 1OOOO5 - O4 - O - 2O3 - OOOOO -*/ - i1=nearest_frame_vector(box1,aa[0][3],aa[1][3],x0-dx/2,(5*y0+3*y1)/8); - /* we need i for 4x6 font, where left side of h-bar is near (x0,y1) */ - i =aa[1][3]; if (box1->frame_vector[i][1]frame_vector[i2][0]-x0>dx/2) Break; // ~3 - i =nearest_frame_vector(box1, aa[0][3], i2, x1+2*dx, (y0+y1)/2); - // MSG(fprintf(stderr,"i %d",i);) - if (box1->frame_vector[i ][0] - -box1->frame_vector[i9][0]>dx/8) Break; // ~3 - - if( (box1->dots) ) Break; // Bold-face is gchar - if (dy<=box1->m3-box1->m2+1) Break; - for(x=0,j=y=2+(3*dy+4)/32;y<=5*dy/8;y++){ // upper cross line min=2 - i=loop(bp,0,y,dx,cs,0,RI); if( y>dy/4 && i>5*dx/8 ) break; - i=loop(bp,i,y,dx,cs,1,RI); if( i>x ) { x=i;j=y; } - if( y<3*dy/4 && y>dy/4 - && num_cross(0,dx-1,y ,y ,bp,cs) != 1 - && num_cross(0,dx-1,y+1,y+1,bp,cs) != 1 // against noise - ) break; - } if( y<=5*dy/8 ) Break; y=j;// if( y>dy/2 || ydy/8 - && num_cross( 0, (dx+1)/2,i,i,bp,cs) > 0 - && num_cross((dx+1)/2,dx-1,i,i,bp,cs) > 0 ) Break; // ~Y - - if (loop(bp,3*dx/4, 0,dy,cs,0,DO)>dy/8 - && loop(bp,3*dx/4-1,0,dy,cs,0,DO)>dy/8) Break; // upper bow - i=3*dy/4; if (box1->m3 && i>=box1->m3) i=box1->m3-1; - if (num_cross(0,dx-1,i,i,bp,cs)!=1) Break; - - // the middle bar appear in a wide vertical range, get part below - for (i1=dx,i2=y,j=y+1;jframe_vector[i3][0]-x0,box1->frame_vector[i3][1]-y0);) - ab[7][0]=box1->frame_vector[i3][0]; - ab[7][1]=box1->frame_vector[i3][1]; - ab[7][3]=i3; - if (ab[7][1]-y0<=dy/16) ad=95*ad/100; // ~t - // because of the dx,dy scaling the horiz. bar could be nearer to (x1,y0) - // as the upper right end of the "t" - if (aa[3][0]-x0>3*dx/4 && aa[3][1]-y0>3*dy/16) ad=99*ad/100; // ~t - - - j=loop(bp,0,dy/8,dx,cs,0,RI); // if j>dx/2 we have italic f - if ((2*x(j+dx/4)) break; - if (iloop(bp,0, 1,dx,cs,0,RI) ) Break; // ~X - - i=y;j=1; // j used as flag - if( num_cross(0,dx-1,0,0,bp,cs)==1 && hchar) //~r - if( num_cross(0,dx-1,dy-1,dy-1,bp,cs)!=1 - && num_cross(0,dx-1,dy-2,dy-2,bp,cs)!=1 ) Break; // ~* etc. - // check for upper bow to right - for(y=1;j && y=cs || dx<7) && getpixel(bp,x+1,y )>=cs - && getpixel(bp,x ,y-1)< cs && getpixel(bp,x+1,y-1)< cs ) - { j=0;break; } - } if(j) ad=98*ad/100; // not detected - - // if( num_hole (x0 , x1 , y0, y1,box1->p,cs,NULL) != 0 ) Break; // ~e - if (sdata->holes.num != 0) Break; // ~e - for(i1=i2=dx,y=7*dy/8;yi2+dx/4) Break; // ~t ~e - if(i1>i2+1) ad=96*ad/100; // ~t ~e - if( loop(bp,0,3*dy/4,dx,cs,0,RI)5 && !hchar) - if( loop(bp,dx-1,dy/2,dx,cs,0,LE)>3*dx/4 ) - if( loop(bp,dx-1,dy-1,dy,cs,0,UP)8 ) - if( loop(bp, 0,2*dy/3 ,dx,cs,0,RI)>2*dx/3 - || loop(bp, 0,2*dy/3-1,dx,cs,0,RI)>2*dx/3 ) - if( loop(bp,dx-1, dy/4 ,dx,cs,0,LE)>2*dx/3 ) Break; // ~5 ~S - - if (!hchar) - if ( get_bw(x0+dx/8,x0+dx/8,y0+dy/4,y1-dy/16,box1->p,cs,2) == 0 - && num_cross(x1-dx/4,x1-dx/4,y0,y1,box1->p,cs)!=2 - && num_cross(x1-dx/8,x1-dx/8,y0,y1,box1->p,cs)!=2 ) Break; // ~r - - if (dy>15) - if( num_cross(x0,x1,y1-dy/4,y1-dy/4,box1->p,cs)>1 - && num_cross(x0,x1,y0+dy/4,y0+dy/4,box1->p,cs)>1 ) Break; // ~H - - if( dx>4 ) - if( loop(bp,dx-1 ,3*dy/4,dx,cs,0,LE)- - loop(bp,0 ,3*dy/4,dx,cs,0,RI)>dx/5+1 - && loop(bp,dx-1-dx/8,dy-1 ,dy,cs,0,UP)=dx/5+1) ad=98*ad/100; // ~E - i=loop(bp,dx/8,0,dy,cs,0,DO); - if (idy/2) { - ad=98*ad/100; // ~E, could also be a "f" with big serifs - MSG(fprintf(stderr,"ad=%d",ad);) } - if (!gchar) { ad=98*ad/100; - MSG(fprintf(stderr,"ad=%d",ad);) } - } - i = loop(bp,dx-1 ,3*dy/4,dx ,cs,0,LE)/2; - if (loop(bp,dx-1-i , dy-1,dy/2,cs,0,UP)1 - && loop(bp,0, 0,dy/4,cs,0,DO)p,cs,2) == 0) { // white pixels? - ad=98*ad/100; // F - MSG(fprintf(stderr,"ad=%d",ad);) } - - if (!hchar) ad=ad*98/100; // d*=100;d/=128 // not 100% ! - if (box1->m4>0 && gchar && ad<99 && - 8*box1->y1 >= box1->m4*7+box1->m3) ad++; - Setac(box1,'f',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_bB(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test B --------------------------------------------------- - for(ad=d=100;dx>2 && dy>4;){ // min 3x4 - DBG( wchar_t c_ask='B'; ) - if (sdata->holes.num < 2) Break; /* tolerant against a tiny hole */ - for(i=1,y=y0;yp,cs,1) != 1 ) i=0; - if( !i ) Break; - for(i=1,y=y1-dy/2;yp,cs,1) != 1 ) i=0; - if( !i ) Break; - if( get_bw(x1,x1 , y0 , y0 ,box1->p,cs,1) == 1 ) Break; - if( num_cross(x0+dx/2, x0+dx/2,y0,y1 ,box1->p,cs) != 3 ) - if( num_cross(x1-dx/3, x1-dx/3,y0,y1 ,box1->p,cs) != 3 ) Break; - /* --- detect center of lower hole --- */ - y = loop(box1->p,x0+dx/2,y1 ,dy,cs,0,UP); if (y>1+dy/8) Break; - y+= loop(box1->p,x0+dx/2,y1-y,dy,cs,1,UP); if (y>dy/3) Break; - y=y1-y-loop(box1->p,x0+dx/2,y1-y,dy,cs,0,UP)/2; if (yp,x0,y0+ y ,dx,cs,0,RI) - > loop(box1->p,x0,y0+dy/4,dx,cs,0,RI)+dx/32 ) - if( get_bw(x0,x0,y0,y0,box1->p,cs,1) == 0 ) - if( get_bw(x0,x0,y1,y1,box1->p,cs,1) == 0 ) Break; // ~8 - i1=loop(box1->p,x0,y0+dy/4,dx,cs,0,RI); - i2=loop(box1->p,x0,y0+dy/2,dx,cs,0,RI); - i =loop(box1->p,x0,y0+dy/2-dy/ 8,dx,cs,0,RI); if(i>i2) i2=i; - i =loop(box1->p,x0,y0+dy/2-dy/16,dx,cs,0,RI); if(i>i2) i2=i; - i3=loop(box1->p,x0,y1-dy/4,dx,cs,0,RI); - if(dy>16 && i3p,x0,y0+ 1 ,dx,cs,0,RI) - >= loop(box1->p,x0,y0+ 3 ,dx,cs,0,RI)+dx/32 ) - if( loop(box1->p,x0,y0+ 0 ,dx,cs,0,RI) - > loop(box1->p,x0,y0+ 3 ,dx,cs,0,RI)+dx/32 ) - if( loop(box1->p,x0,y1- 0 ,dx,cs,0,RI) - > loop(box1->p,x0,y1- 3 ,dx,cs,0,RI)+dx/32 ) - if( loop(box1->p,x0,y1- 1 ,dx,cs,0,RI) - > loop(box1->p,x0,y1- 3 ,dx,cs,0,RI)+dx/32 ) Break; // ~8 Aug00 - } - - if (sdata->holes.num != 2) Break; - if (sdata->holes.hole[0].y0 < y-1 - && sdata->holes.hole[1].y0 < y-1 ) Break; - if (sdata->holes.hole[0].y1 > y+1 - && sdata->holes.hole[1].y1 > y+1 ) Break; - // if( num_hole(0,dx-1,0 ,y+1 ,bp,cs,NULL) != 1 ) Break; - // if( num_hole(0,dx-1,y-1,dy-1,bp,cs,NULL) != 1 ) Break; - // out_x(box1); - - for( x=dx,y=dy/6; yp,x0,y0+y,dx,cs,0,RI); if( i>x+dx/9 ) break; - if(ix )break; - } if( yx) x=i; // allow dust - i=loop(bp,0,dy/2+1,dx,cs,0,RI); if (i>x) x=i; - if ( loop(bp,0, dy/8,dx,cs,0,RI) - +loop(bp,0,7*dy/8,dx,cs,0,RI) > 2*x+1 ) Break; // not konvex! - - if(!hchar){ // ~ fat_a - ad=99*ad/100; - x =loop(bp,0,dy/4,dx,cs,0,RI); - if(loop(bp,0,dy/2,dx,cs,0,RI)>x+dx/8) ad=97*ad/100; - } - - if ( (!hchar) && (dx<=10 || dy<=10) ) ad=97*ad/100; // hchar or good_quality - if (gchar) ad=99*ad/100; - Setac(box1,'B',ad); - break; - } - // --- test b --------------------------------------------------- - for(ad=d=100;dx>3 && dy>4;){ // min 3x4 - DBG( wchar_t c_ask='b'; ) - if (sdata->holes.num < 1) Break; /* tolerant against a tiny hole */ - for(y=y0;yp,cs,1) != 1 ) Break; - if(yp,cs,1) != 1 ) Break; - if( get_bw(x1- dx/2, x1 , y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1- dx/3, x1 , y0 , y0+dy/5,box1->p,cs,1) == 1 ) Break; - if( get_bw(x1-4*dx/9, x1 , y0+dy/5, y0+dy/5,box1->p,cs,1) == 1 ) Break; - if( num_cross(x0,x1,y0+dy/4 ,y0+dy/4 ,box1->p,cs) > 1 ) // & - if( num_cross(x0,x1,y0+dy/4-1,y0+dy/4-1,box1->p,cs) > 1 ) - if( dy<16 || - num_cross(x0,x1,y0+dy/5 ,y0+dy/5 ,box1->p,cs) > 1 ) Break; // fat b - for(i=j=0,y=dy/2;yholes.num != 1) Break; - if (sdata->holes.hole[0].y0 < dy/4) Break; - if ((sdata->holes.hole[0].y1-sdata->holes.hole[0].y0+1) - *(sdata->holes.hole[0].x1-sdata->holes.hole[0].x0+1)*16 - < dx*dy) ad=90*ad/100; // hole to small - if( num_hole( x0, x1 , y0+dy/4, y1,box1->p,cs,NULL) != 1 ) Break; - i=loop(bp,dx-1,dy-1 ,dx,cs,0,LE); - j=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); if(j>i) Break; - if (!hchar) ad=99*ad/100; - if ( gchar) ad=99*ad/100; - Setac(box1,'b',ad); - if (ad>=100) return 'b'; - break; - } - return box1->c; -} - -static wchar_t ocr0_dD(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,d,x,y,ya,yb,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test D --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='D'; ) - if (sdata->holes.num < 1) Break; /* tolerant against a tiny hole */ - if( get_bw(x0 ,x0+dx/3,y0+dy/2,y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/3,x1 ,y0+dy/2,y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1 ,x1 ,y0 ,y0+dy/16,box1->p,cs,1) == 1 ) Break; - if( get_bw(x1-dx/2,x1 ,y0+dy/4,y0+dy/4 ,box1->p,cs,1) != 1 ) Break; - if( num_cross(x0+dx/2,x0+dx/2,y0 ,y1 ,box1->p,cs) != 2 ) - if( num_cross(x1-dx/3,x1-dx/3,y0 ,y1 ,box1->p,cs) != 2 ) Break; - if( num_cross(x0 ,x1 ,y0+dy/3,y0+dy/3,box1->p,cs) != 2 ) Break; - if( num_cross(x0 ,x1 ,y1-dy/3,y1-dy/3,box1->p,cs) != 2 ) Break; - if (sdata->holes.num != 1) Break; - if (sdata->holes.hole[0].y0 > dy/3) Break; - if (sdata->holes.hole[0].y1 < dy-1-dy/3) Break; - // if( num_hole (x0 ,x1 ,y0 ,y1 ,box1->p,cs,NULL) != 1 ) Break; - // test if left edge is straight - for(x=0,y=bp->y-1-dy/8;y>=dy/5;y--){ - i=loop(bp,0,y,x1-x0,cs,0,RI); - if( i+2+dx/16<=x ) break; - if( i>x ) x=i; - } - if (y>=dy/5 ) Break; - /* test if right edge is falling */ - for(x=dx,y=0;yx-1,y,x1-x0,cs,0,LE); - if( i>x+dx/16 ) break; - if( iy-1;y>2*dy/3;y--){ - i=loop(bp,bp->x-1,y,x1-x0,cs,0,LE); - if( i>x+dx/16 ) break; - if( i2*dy/3 ) Break; - if( loop(bp,dx-1,dy-1 ,dx,cs,0,LE) <= - loop(bp,dx-1,dy-2-dy/16,dx,cs,0,LE) ) Break; // P - - y=loop(bp,dx/2,dy-1,dy,cs,0,UP)-1; if (dy>16) y/=2; - if ( y>=dy/16 ) { y-=dy/16; - if (get_bw(dx/2,dx-1,dy-1-y,dy-1-y,bp,cs,1)==1) Break; // ~A - } - - ya=loop(bp, 0,dy-1,dy,cs,0,UP); - yb=loop(bp,dx/16+1,dy-1,dy,cs,0,UP); - if( yady/16 && ya>yb ) Break; // ~O - - if ( loop(bp, dx/2, 0,dy,cs,0,DO) - -loop(bp, dx/2,dy-1,dy,cs,0,UP) > dy/8 ) ad=97*ad/100; // ~b - - - - if (loop(bp, 0, 0,dx,cs,0,RI)>=dx/2 - && loop(bp,dx-1,dy-1,dx,cs,0,LE)>=dx/2 - && loop(bp, 0,dy/2,dx,cs,0,RI)< 2 ) ad=96*ad/100; // thin O - - if(box1->dots) ad=ad*94/100; - if ( gchar) ad=99*ad/100; - if (!hchar) ad=99*ad/100; - Setac(box1,'D',ad); - break; - } - // --- test d --------------------------------------------------- - for(d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='d'; ) - ad=100; - if (sdata->holes.num < 1) Break; /* tolerant against a tiny hole */ - if( get_bw(x0 , x0+dx/2, y1-dy/6, y1-dy/9,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0 , x0+dx/2, y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2, x1 , y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/4, x1 , y0+dy/8, y0+dy/8,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2, x0+dx/2, y1-dy/4, y1 ,box1->p,cs,1) != 1 ) Break; - if(dy>19) - if( get_bw(x0 , x0+dx/3, y0 , y0+dy/5,box1->p,cs,1) == 1 ) Break; - if( get_bw(x0 , x0+dx/3, y0 , y0+dy/6,box1->p,cs,1) == 1 ) Break; - if( get_bw(x0 , x0+dx/4, y1-dy/8, y1 ,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2-1,x0+dx/2,y1-dy/8, y1 ,box1->p,cs,1) != 1 ) Break; // ~"A - if( loop(bp,bp->x-1, bp->y/4,x1-x0,cs,0,LE) > - loop(bp,bp->x-1,3*bp->y/4,x1-x0,cs,0,LE)+1 ) Break; - for(i=dx/8+1,x=0;x 3 ) i++; // ~al - } if( i ) ad=98*ad/100; - for(i=dy/8+1,y=0;yholes.num<1) Break; - if (sdata->holes.num>1) { - if (dx<6) Break; ad=95*ad/100; } // glued j above 8 (4x6 sample) - MSG(fprintf(stderr,"hole[0].y0,y1= %d %d",sdata->holes.hole[0].y0,sdata->holes.hole[0].y1);); - if ( sdata->holes.hole[0].y0 < dy/4 ) Break; - if (dy-sdata->holes.hole[0].y1 > dy/4+1) Break; // glued et - // if( num_hole(x0 , x1 , y0+dy/4 , y1 ,box1->p,cs,NULL) !=1 ) Break; - if( num_cross(0 ,dx-1,dy-1-dy/4,dy-1-dy/4,bp,cs) != 2 ) { // glued al - if (dy>15) { Break; } else ad=96*ad/100; - } - if (!hchar) ad=98*ad/100; - if ( gchar) ad=99*ad/100; - Setac(box1,'d',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_F(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test F --------------------------------------------------- - for(ad=d=100;dx>2 && dy>4;){ // dx>1 dy>2*dx - DBG( wchar_t c_ask='F'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if( get_bw(x0+dx/2,x0+dx/2,y0,y0+dy/8,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0,x0+dx/4,y1-dy/4,y1-dy/4,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0,x0+dx/2,y0+dy/4,y0+dy/4,box1->p,cs,1) != 1 ) Break; - - for (x=0,y=0;yx) x=j; - } if (ydx/2 ) i=0; } - if( i ) Break; - - x=loop(bp,0,dy-1-dy/4,dx,cs,0,RI); - x=loop(bp,x,dy-1-dy/4,dx,cs,1,RI); // strichdicke - for( i=1,y=dy/3; ydx/3 && ((j>2*x && dx>8) || j>x+1)) i=0; } - if( i ) Break; - - y=dy/8; if (y<1) y=1; - for( i=1; y=dx/3) { i=0; break; } - } - if( i ) Break; - - // check for vertical line on left side - for(i=1,y=1;y<=dy/2 && i;y++) - if( get_bw(0,dx/2,y,y,bp,cs,1) != 1 ) i=0; - if( !i ) Break; - - for(i=1,y=dy/2;ydx/8 // no serif - || loop(bp, 0, dy-3,dx,cs,0,RI)<1) break; - ad=99*ad/100; - } - if( get_bw(dx-1-dx/4,dx-1,dy-1-dy/4,dy-1,bp,cs,1) == 1 ) Break; // ~E - if( get_bw(dx-1 ,dx-1,0 ,dy/3,bp,cs,1) != 1 ) Break; - - if( loop(bp,0, bp->y/4,dx,cs,0,RI) < - loop(bp,0,3*bp->y/4,dx,cs,0,RI)-1 ) Break; - // if( num_hole(x0 , x1 , y0 , y1 ,box1->p,cs,NULL) >0 ) Break; - if (sdata->holes.num > 0) Break; - for(i=0,x=dx/4;xy/4,dx,cs,0,RI)-1; - if (i>=0 && loop(bp,dy-1,i,dy,cs,0,UP)<=3*dy/4 ) ad=ad*98/100; - - // check for screen font P - i= loop(bp,bp->x-1,bp->y/4,dx,cs,0,LE); - if (i<1) { - j=i+loop(bp,bp->x-1-i,bp->y/4, dx ,cs,1,LE); - j= loop(bp,bp->x-1-j,bp->y/4,3*dy/4,cs,0,DO); - if (j<=dy/2) { - i=loop(bp,bp->x-1,0,dx,cs,0,LE); - ad=ad*98/100; - if (i>dx/8) Break; - if (i) ad=98*ad/100; - } - } - - if (!hchar) if ((box1->m2-box1->y0)*8>=dy) { // ignore bad m1..4 - if ( num_cross(2*dx/3,2*dx/3,0,dy-1,bp,cs) < 2 ) ad=90*ad/100; // ~r - } - if (gchar) ad=99*ad/100; - Setac(box1,'F',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_uU(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - wchar_t bc=UNKNOWN; - - // --- test uU --------------------------------------------------- - // in Mitte so breit wie oben (bei V kontinuierlich schmaler) - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='u'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - for(y=y0+dy/4;yp,cs) < 2 ) break; - if( yi)i=y; if(y1) break; - } if( idy/2)?dx/8:0),y,y,bp,cs); - if( y1 ) i--; // ~{\it v} - if( y2) ) { i--; ad=90*ad/100; } - if( y>dy/2 && j!=1 ) { i--; ad=95*ad/100; } - } if( !i ) Break; - for(i=dy/16+1,y=dy/8;ydy/2 && (j<1 && j>2) ) i--; - if( yp,cs,1) != 1 ) i=0; - } if( i ) Break; - for(i=dx/4+1,x=x0+dx/3;x<=x1-dx/3 && i;x++){ - if( get_bw( x, x,y0+dy/3,y1-dy/3,box1->p,cs,3) != 2 ) i--; - } if( !i ) Break; - for(i=1,x=x0+dx/3;x<=x1-dx/3 && i;x++){ - if( get_bw( x, x,y1-dy/2,y1,box1->p,cs,3) == 2 ) i=0; - if( get_bw( x, x,y1-dy/3,y1,box1->p,cs,3) == 2 ) ad=98*ad/100; - } if( !i ) Break; - if( num_cross(0 ,dx/2, dy/4, dy/4,bp,cs)==2 - && num_cross(dx-dx/2,dx-1,dy-dy/4,dy-dy/4,bp,cs)==1 ) Break; // ~{\it v} - - i=loop(bp,0,dy-1-dy/16,dx,cs,0,RI); - j=loop(bp,0,dy-1-dy/8 ,dx,cs,0,RI); - if( i15) - if( loop(bp,dx-1,dy/16,dx,cs,0,LE) - > loop(bp,dx-1,dy/8 ,dx,cs,0,LE)+1+dx/32 ) Break; // ~bad 0 (thinn) - if( hchar && dy>7) - if( loop(bp, 0, dy-1,dx,cs,1,RI)==dx - && loop(bp,dx-1,3*dy/4,dx,cs,0,LE)>dx/16 - && loop(bp, 0,3*dy/4,dx,cs,0,RI)>dx/16 - && loop(bp,dx-1, dy/2,dx,cs,0,LE)>dx/16 - && loop(bp, 0, dy/2,dx,cs,0,RI)>dx/16 - ) Break; // melted ll - - i=loop(bp, 0,dy-2-dy/8,dx,cs,0,RI); - j=loop(bp,dx-1,dy-2-dy/8,dx,cs,0,LE); - if ( i>dx/4 && j>dx/4 && i+j>=dx/2) Break; // v - if (i+j>=dx/2) ad=97*ad/100; - - if ( num_cross(0,dx-1,dy/2,dy/2,bp,cs)!=2 ) ad=96*ad/100; // w - if ( loop(bp,dx/2,dy-1,dy,cs,0,UP)>0 ) ad=98*ad/100; // w - - if (ad==100) ad=99; // ToDo: only if lines.wt<100 - bc='u'; - if (gchar) ad=98*ad/100; - if (hchar) bc='U'; - if (box1->dots>0) ad=99*ad/100; - Setac(box1,bc,ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_micro(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i2,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test \mu µ MICRO_SIGN -------------------------------------- - // in Mitte so breit wie oben (bei V kontinuierlich schmaler) - if( gchar && !hchar ) - for(ad=d=100;dx>2 && dy>4;){ // min 3x4 - DBG( wchar_t c_ask='u'; ) - if (sdata->holes.num > 1) break; /* tolerant against a tiny hole */ - for(y=y0+dy/8;ym3-dy/4;y++) - if( num_cross(x0,x1,y,y,box1->p,cs) < 2 ) break; - if( ym3-dy/4 ) break; - if( get_bw(dx/2,dx/2,3*dy/8,7*dy/8,bp,cs,1)==0 ) break; - if( get_bw(dx/2,dx-1,3*dy/8,7*dy/8,bp,cs,1)==0 ) break; - for(y=dy/2;y5*dx) break; - } if( y>=dy || 2*y>box1->m3+box1->m4) break; i2=y; - for(i=0,x=2*dx/8;xi)i=y; if(y1) break; - } if( im4-box1->m3)-dy/4 && i;y++){ // 12%+1 Fehler - j=num_cross(0,dx/2,y,y,bp,cs); - if( y1 ) i--; // ~{\it v} - if( y2) ) i--; - if( y>dy/2 && j!=1 ) i--; - } if( !i ) break; - for(i=dy/16+1,y=dy/8;ym4-box1->m3)-dy/4 && i;y++){ // 12%+1 Fehler - j=num_cross(dx-dx/2,dx-1,y,y,bp,cs); - if( y>dy/2 && (j<1 && j>2) ) i--; - if( yp,cs,1) != 1 ) i=0; - } if( i ) break; - for(i=dx/4+1,x=x0+dx/3;x<=x1-dx/3 && i;x++){ - if( get_bw( x, x,y0+dy/4,y1-dy/2,box1->p,cs,3) != 2 ) i--; - } if( !i ) break; - if( num_cross(0 ,dx/2, dy/4, dy/4,bp,cs)!=1 ) break; - if( num_cross(dx-dx/2,dx-1,dy-dy/2,dy-dy/2,bp,cs)!=1 ) break; - if( get_bw( (dx+2)/4,dx-1,dy-2-3*dy/16,dy-1,bp,cs,1) == 1 ) break; - if( num_cross(0,dx/4,dy-1,dy-1,bp,cs)!=1 ) break; - - Setac(box1,MICRO_SIGN,ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_vV(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - wchar_t bc=UNKNOWN; - - // --- test v ------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='v'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - x=loop(bp,dx/2,0,dx,cs,1,RI)+dx/2; // be sure in the upper gap - y=loop(bp, x,0,(dy+1)/2,cs,0,DO)-1; // (x,y) should be in the gap - if (x>3*dx/4 || yp,cs,1) != 1 ) Break; - if( get_bw(x0+x,x1,y0+y,y0+y,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+x,x0+x,y1-dy/2,y1, box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+x, x0+x ,y0, y0+dy/3,box1->p,cs,1) == 1 ) // it v? - if( get_bw(x0+x+1,x0+x+1,y0, y0+dy/3,box1->p,cs,1) == 1 ) Break; - - // UVW - if(((num_cross( 0,dx/2+1,dy/ 8,dy/ 8,bp,cs)!=1) - && (num_cross( 0,dx/2+1,dy/16,dy/16,bp,cs)!=1) // it v - && (num_cross(dx/2+1,dx -1,dy/ 8,dy/ 8,bp,cs)!=1)) /* () added on Sep00 */ - || ((num_cross( 0,dx-1,dy-1-dy/8,dy-1-dy/8,bp,cs)> 1) - && (num_cross( 0,dx-1,dy-1 ,dy-1 ,bp,cs)> 1)) ) Break; - // UV - if( get_bw(0 ,dx/8,dy-1-dy/6,dy-1,bp,cs,1)==1 ) Break; - if( get_bw(dx-1-dx/8,dx-1,dy-1-dy/6,dy-1,bp,cs,1)==1 ) Break; - if( loop(bp,0 ,dy/6 ,dx,cs,0,RI) - >=loop(bp,0 ,dy-1-dy/3,dx,cs,0,RI) && dy>6 ) Break; - if( loop(bp,0 ,dy-1-dy/3,dx,cs,0,RI) - >loop(bp,0 ,dy-1-dy/8,dx,cs,0,RI) - && loop(bp,dx-1,dy-1-dy/3,dx,cs,0,LE) - >loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE) ) Break; // better OR ? - if( loop(bp,0 ,dy-1-dy/3,dx,cs,0,RI) - >=loop(bp,0 ,dy-1-dy/8,dx,cs,0,RI) - && loop(bp,dx-1,dy-1-dy/3,dx,cs,0,LE) - >=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE) ) ad=99*ad/100; // font21 - if( loop(bp,dx-1,dy/6 ,dx,cs,0,LE) - >=loop(bp,dx-1,dy-1-dy/3,dx,cs,0,LE) && dy>6 ) Break; - x=loop(bp,0,dy-1,dx,cs,0,RI); // 3*x>dx changed to 2*x>dx May2001 JS - x=loop(bp,x,dy-1,dx,cs,1,RI); if ( dx>14 && 2*x>dx ) Break; // U - if( num_cross(0 ,dx/2, dy/4, dy/4,bp,cs)==2 - && num_cross(dx-dx/2,dx-1,dy-dy/4,dy-dy/4,bp,cs)==2 ) Break; // ~{\it u} - -#if 0 - // measure thickness of lower v - i=loop(bp, 0,dy-1-dy/16,dx,cs,0,RI) - +loop(bp,dx-1,dy-1-dy/16,dx,cs,0,LE); - j=loop(bp, 0,dy-1-dy/4 ,dx,cs,0,RI) - +loop(bp,dx-1,dy-1-dy/4 ,dx,cs,0,LE); - if( box1->m1 && hchar && dy>15 && j>=i-dx/32 ) Break; // ~Y -#endif - /* V has serifs only on upper site! Y also on bottom, check it. Okt00 */ - i=loop(bp, 0, 0,dx,cs,0,RI); - i=loop(bp, i, 0,dx,cs,1,RI); i1=i; // thickness - i=loop(bp, 0, 1,dx,cs,0,RI); - i=loop(bp, i, 1,dx,cs,1,RI); if(i>i1) i1=i; // thiggest - i=loop(bp, 0,dy/4,dx,cs,0,RI); - i=loop(bp, i,dy/4,dx,cs,1,RI); i2=i; - i=loop(bp, 0,dy ,dx,cs,0,RI); - i=loop(bp, i,dy ,dx,cs,1,RI); i3=i; // thickness - i=loop(bp, 0,dy-1,dx,cs,0,RI); - i=loop(bp, i,dy-1,dx,cs,1,RI); if(i>i3) i3=i; // thiggest - if( y0 < box1->m2 ) - if( i1-i2 > dx/32+2 - && i3-i2 > dx/32+2 ) Break; // ~serif_Y - - if( y0 < box1->m2 ) // uppercase V ? - if( i1-i2 < dx/32+2 ) /* no serif detected */ - if( num_cross(0,dx-1,dy-1-dy/4,dy-1-dy/4,bp,cs)==1 ){ - j=loop(bp, 0,dy-1-dy/4 ,dx,cs,0,RI); - j=loop(bp, j,dy-1-dy/4 ,dx,cs,1,RI); - if (jloop(bp,0 ,dy-1 ,dx,cs,0,RI) ) ad=96*ad/100; - - if (gchar) ad=99*ad/100; - bc='v'; - if( hchar ) bc='V'; - Setac(box1, bc, ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_rR(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test r ------- - for(ad=d=100;dy>3 && dx>1;){ // dy>dx, 4x6 font, dx=2 smallest prop-font - DBG( wchar_t c_ask='r'; ) - if (sdata->holes.num > 0 - && ( sdata->holes.hole[0].y1 > dy/2 // tiny hole in upper left - || sdata->holes.hole[0].x1 > dx/2 ) // is tolerated, ~Pp - ) Break; /* tolerant against a tiny hole */ - if( 2*dym3-box1->m1) Break; - - if( loop(bp,dx-1,dy/2,dx,cs,0,LE)<=dx/8 ) Break; - x= loop(bp,dx-1,dy/2,dx,cs,0,LE); if (x<=dx/2) ad=99*ad/100; // ~t - if (loop(bp,dx-1-x/2,0,dy,cs,0,DO)>dy/8) ad=99*ad/100; // ~t - if( dx>4 ) - if( loop(bp,dx-1,dy/2,dx,cs,0,LE)<=dx/8+2 ) Break; // ~v Jun00 - - i=dy-(dy+20)/32; // ignore dust on the ground - - for( y=4*dy/8; y3*dx/8) break; - i2= loop(bp,dx-1,y,dx,cs,0,LE); if(i1>i2) break; - if( (i1+(dx-i2 - -1))/2 >= 4*dx/8 ) break; // mass middle should be left - } - if (y5*dx/8 // not a C - && get_bw(dx-1-dx/8,dx-1,dy-1-dy/4,dy-1,bp,cs,1) ==1 ) Break; - - if( loop(bp, 0,5*dy/8,dx,cs,0,RI)<=dx/8 - && loop(bp,dx-1,5*dy/8,dx,cs,0,LE)>=5*dy/8 - && loop(bp,dx/2, dy-1,dy,cs,0,UP)<=dy/8 ) Break; // ~c - - if( loop(bp, 0,3*dy/8,dx,cs,0,RI) - > loop(bp,dx-1,3*dy/8,dx,cs,0,LE)+dx/8 ) { - if( loop(bp, 0, dy/8,dx,cs,0,RI)3*dx/4 ) Break; // ~i - if( loop(bp,0,dy/4,dx,cs,0,RI)>3*dx/8 // ~I - && get_bw(0,dx/8,0,dy/4,bp,cs,1) ==1 ) Break; - if( num_cross(0,dx-1,dy/2, dy/2 ,bp,cs)!=1 - && num_cross(0,dx-1,dy/2+1,dy/2+1,bp,cs)!=1 ) Break; // ~n 024a3 - - // itallic t is sometimes not high enough, look for v-like shape - for(y=3*dy/4;y1 ) ad=95*ad/100; // ~f - if( num_cross(dx/2 ,dx/2 ,0,dy-1,bp,cs)>2 - && num_cross(dx/2+1,dx/2+1,0,dy-1,bp,cs)>2 ) Break; // ~f - - if (box1->dots) ad=98*ad/100; /* could be modified latin2-r */ - if (hchar) ad=96*ad/100; - if (gchar) ad=97*ad/100; - Setac(box1,'r',ad); - break; // not 100% sure! - } - // --- test R --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='R'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if( num_cross(x0,x1,y1-dy/8,y1-dy/8, box1->p,cs) < 2 ) Break; // ~P - if (loop(bp, dx/2, dy/4,dy,cs,0,DO)>dy/2) Break; // ~C - if (loop(bp, dx/2, 0,dy,cs,0,DO)>dy/8 - && loop(bp, dx/2,dy/16,dx,cs,0,RI)=16 ) Break; - for(i=1,y=y0+dy/8;y<=y1-dy/8 && i;y++){ // left v-line - if( get_bw(x0 , x0+dx/2,y, y,box1->p,cs,1) != 1 ) i=0; - } if( !i ) Break; - for(i=1,x=x0+3*dx/8;x<=x1-dx/4 && i;x++){ // upper h-line - if( get_bw( x, x, y0, y0+dy/4,box1->p,cs,1) != 1 ) i=0; - } if( !i ) Break; - for(y=0,x=x0+dx/4;x<=x1-dx/4;x++){ // lower h-gap - i=loop(box1->p,x,y1,dy,cs,0,UP); - /* on small chars bypass possible low left serifs */ - if (i>0) { i2=loop(box1->p,x-1,y1-i-1,dy,cs,0,UP); - if (i2>1) i+=i2-1; } - if (i>y) { y=i; i1=x; } - } if( y<=dy/8 ) Break; if (yp,cs) == 2 ) i=0; - } if( i ) Break; - for(i=1,y=y0;y<=y0+3*dy/8 && i;y++){ // upper 2 vert lines - if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; - } if( i ) Break; - for(i=1,y=y0+dy/3;y<=y1-dy/3 && i;y++){ // midle h line - if( num_cross(x0,x1,y,y, box1->p,cs) == 1 ) i=0; - } if( i ) ad=95*ad/100; /* sometimes there is a small gap */ - for(i=1,y=y1-dy/4;y<=y1 && i;y++){ // lower 2 vert lies - if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; - } if( i ) Break; - if( get_bw(x1-dx/3,x1,y0,y0+dy/4,box1->p,cs,1) != 1 ) Break; // pixel ru - x=loop(bp,dx-1, dy/4,dx,cs,0,LE); if(x>dx/2) Break; i=x; // ru - x=loop(bp,dx-1, dy/2,dx,cs,0,LE); if(x<=i ) Break; i=x; // rc - x=loop(bp,dx-1, 5*dy/8,dx,cs,0,LE); if(x>i ) i=x; - x=loop(bp,dx-1, 6*dy/8,dx,cs,0,LE); if(x>i ) i=x; - x=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); if(x>=i ) Break; // rd - - i1=loop(bp,0, dy/4,dx,cs,0,RI); // straight - i2=loop(bp,0, dy/2,dx,cs,0,RI); - i3=loop(bp,0,dy-1-dy/4,dx,cs,0,RI); if( abs(i1+i3-2*i2)>1+dx/16 ) Break; - if (dy>15) - if (loop(bp,dx-1, dy/2,dx,cs,0,LE)>=loop(bp,dx-1, dy-1,dx,cs,0,LE) - && loop(bp,dx-1,3*dy/16,dx,cs,0,LE)>=loop(bp,dx-1,dy/16,dx,cs,0,LE)+dx/8 ) Break; // ~ff - if (dy>7) - if (loop(bp,dx-1,dy-2 ,dx,cs,0,LE) - >loop(bp,dx-1,dy-2-dy/8,dx,cs,0,LE)) { - ad=98*ad/100; - if (loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE)==0 - && loop(bp,dx-1,dy-2-dy/8,dx,cs,0,LE)>0 ) Break; // broken B ?? - } - j=sdata->holes.num; - if (j != 1) { - i=num_hole (x0,x1,y0,y1-dy/3,box1->p,cs,NULL); - // j=num_hole (x0,x1,y0,y1 ,box1->p,cs,NULL); - if (i==0) ad=90*ad/100; /* some times there is a small gap */ - if (j>1 || j>i) Break; - } - if (sdata->holes.num < 1) ad=90*ad/100; - if (sdata->holes.num==1) - if (sdata->holes.hole[0].y1 > 3*dy/4) ad=95*ad/100; // alpha - - if (!hchar) ad=98*ad/100; - if ( gchar) ad=98*ad/100; - Setac(box1,'R',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_m(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,d,x,y,i1,i2,i3,i4,i5,hchar=sdata->hchar,gchar=sdata->gchar, - handwritten=0, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test m ------- - for(ad=d=100;dx>4 && dy>3;){ - DBG( wchar_t c_ask='m'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if (sdata->holes.num > 0) ad=96*ad/100; - x =loop(bp,dx-1,dy/2,dx,cs,0,LE); if(3*x>dx) Break; // ~K - y=dy/2; - i=num_cross(0,dx-1,y ,y ,bp,cs); if (i!=3) - i=num_cross(0,dx-1,y+1,y+1,bp,cs); - if (i<3 && i>5) Break; // m ru rn, handwritten m - // im or glued.mm cut to nm - if (i>3) { ad=99*ad/100; MSG(fprintf(stderr,"ad=%d",ad);) } - for (i=0,y=dy-1-dy/8;y>dy/2;y--) { - i=num_cross(0,dx-1,y,y,bp,cs); if (i>2) break; - } if (i>3) Break; - for ( ;y>dy/2;y--) { - i=num_cross(0,dx-1,y,y,bp,cs); if (i!=3) break; - } if (i>5) Break; y++; i5=y; - if (y> dy/2) handwritten=10; - if (y>3*dy/4) handwritten=60; - /* @@............... - @@......,........ - @@,...@@@....@@@. - @@,,.@@@@..@@@@@, - @@@.@@@@@.@@@@@@, - @@;@@@@@@@@@;,@@, - @@@@@,.@@@@,,,@@@ <- i5 - ,@@@...;@@....@@@ - .@;...........,@@ - ...............@@ - i1 i2 i3 i4 - */ - x =loop(bp,0,y,dx ,cs,0,RI); if(x> dx/4) Break; // search 1st v-line - x+=loop(bp,x,y,dx-x,cs,1,RI); if(x> dx/2) Break; i1=x; // first gap - x+=loop(bp,x,y,dx-x,cs,0,RI); if(x>3*dx/4) Break; i2=x; // 2nd v-line - x+=loop(bp,x,y,dx-x,cs,1,RI); if(x>6*dx/8) Break; i3=x; // 2nd gap - x+=loop(bp,x,y,dx-x,cs,0,RI); if(x<5*dx/8) Break; i4=x; // 3th v-line - if (x>=dx) Break; // missing 3th v-line, ~W - MSG(fprintf(stderr,"y=%d x=%d %d %d %d",y,i1,i2,i3,i4);) - if( abs((i2-i1)-(i4-i3)) > 2+((i2-i1)+(i4-i3))/4 ) Break; // same gap width? rn - if( abs((i2-i1)-(i4-i3)) > 2+((i2-i1)+(i4-i3))/8 ) ad=98*ad/100; // same gap width? rn - // the same game for the lower part =>l1 l2 l3 l4 ??? - i =loop(bp,0,5*dy/8,dx,cs,0,RI); - i =loop(bp,i,5*dy/8,dx,cs,1,RI); - x =loop(bp,0,dy-dy/32-1,dx,cs,0,RI); - x =loop(bp,x,dy-dy/32-1,dx,cs,1,RI); - if( x > i+1 ) i=1; else i=0; /* looks like serif m, Okt00 */ - for(y=0,x=i1;xy) y=i; - } - if(yy) y=i; - } - if(y=dy/2 ) break; - if(xi4-i3+dx/16){ - for(y=0,x=(i1+i2)/2;xy ) y=i; if( 2*i3 ) Break; // melted WT - - x=loop(bp,dx-1,dy/2,dx,cs,0,LE); - if (x>2 && loop(bp,dx-1-x/2,0,dy,cs,0,DO)dy/2) Break; // N - - // {\it m} - if( loop(bp,1, dy/4,dx,cs,0,RI) - >loop(bp,0,7*dy/8,dx,cs,0,RI) ) - Setac(box1,'m',98*ad/100); - - if (handwritten<10){ - x =loop(bp,0,dy/4,dx,cs,0,RI); - x+=loop(bp,x,dy/4,dx,cs,1,RI); - for( ;x=dy/4) ad=99*ad/100; - if (i>(dy+2)/4) ad=95*ad/100; - if (3*i>dy) Break; - } - if(xdots) ad=99*ad/100; - Setac(box1,'m',ad); - if (ad>=100) return 'm'; - break; - - } - return box1->c; -} - -static wchar_t ocr0_tT(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,i1,i2,i3,i4,j,d,x,y,yb,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test T --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // dx>1 dy>2*dx - DBG( wchar_t c_ask='T'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - // upper horizontal line - i1= loop (bp, dx/8,0,dy,cs,0,DO); // left side - i2= loop (bp,dx-1-dx/8,0,dy,cs,0,DO); // right side - i3= loop (bp, dx/8,i1,dy,cs,1,DO); // left side - i4= loop (bp,dx-1-dx/8,i2,dy,cs,1,DO); // right side - if (i1>dy/4 || i2>dy/4) Break; - for (x=dx/8;xi1+dy/8 && i>i2+dy/8) break; - if (idx+1 || i+j>=dx || i+j/23*x) break; //~I - } if( y3*dx/4) Break; // ~7 - i+= loop(bp,i ,dy/4,dx,cs,1,RI);if(i>3*dx/4) Break; - - if( num_cross(0,dx-1, dy-1, dy-1,bp,cs) != 1 - && num_cross(0,dx-1, dy-2, dy-2,bp,cs) != 1 ) Break; - if( num_cross(0,dx-1,2*dy/3,2*dy/3,bp,cs) != 1 - && num_cross(0,dx-1,2*dy/3,2*dy/3,bp,cs) != 1 ) Break; - if (box1->m3 && 2*y1>box1->m3+box1->m4 - && loop(bp,0, 0,dy/2,cs,0,DO)>=dy/4 - && loop(bp,0,dy-1,dy ,cs,0,UP)<=dy/2) ad=96*ad/100; // ~J - if (gchar) ad=98*ad/100; - if( loop(bp,0,dy-1,dx,cs,0,RI)<=dx/8) ad=99*ad/100; // ~J - i = loop(bp,0,dy/2,dx,cs,0,RI); - j = loop(bp,i,dy/2,dx,cs,1,RI); - if( 2*i>=dx || 2*(dx-j-i)=100) return 'T'; - break; - } - // --- test t --------------------------------------------------- - // written t can look like a + or even with missing right side - // smallest t found in win-screenshot (prop-font) dx=2 - for(ad=d=100;dx>1 && dy>=box1->m3-box1->m2-1;){ // sometimes no hchar! - DBG( wchar_t c_ask='t'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if (dy<=box1->m3-box1->m2+1) ad=96*ad/100; // bad line detection? - for(x=0,yb=j=y=dy/32+3*dy/16;y<5*dy/8;y++)if(y>0){ // upper cross line - i=loop(bp,0,y,dx,cs,0,RI); - i=loop(bp,i,y,dx,cs,1,RI); if( i>x ) { x=i;yb=j=y; } // hor. line - i=num_cross(0,dx-1,y ,y ,bp,cs); - j=num_cross(0,dx-1,y+1,y+1,bp,cs); if (i>2 && j>2) break; - if( y<11*dy/16 - && num_cross(0,dx-1,y ,y ,bp,cs) != 1 - && ( num_cross(0,dx-1,y+dy/8,y+dy/8,bp,cs) != 1 || dy<13) // against noise - ) break; - } if( y<4*dy/8 ) Break; - if (dy>12 && x>4 && x>dx/2 && yb<=(dy+4)/8) - if ( loop(bp,dx-1-3*x/4,yb,dy,cs,1,UP) - <=loop(bp,dx-1-1*x/4,yb,dy,cs,1,UP)+1 ) - if ( loop(bp,0 ,dy/2,dy,cs,1,UP)>dx/8 ) Break; // ~C - - if (x=dx && 9*dx>=8*dy) { ad=99*ad/100; } // + - - i=loop(bp,dx-1,0,dx,cs,0,LE); - for(y=0;y1) break; i=j; - } - if( yi ) break; - if( y==yb ) break; - - j=loop(bp,0, dy/2,dx,cs,0,RI); - j=loop(bp,j, dy/2,dx,cs,1,RI); i=j; // thickness - j=loop(bp,0, dy/4,dx,cs,0,RI); - j=loop(bp,j, dy/4,dx,cs,1,RI); if (j=loop(bp,dx-1,yb/2,dx,cs,0,LE) ) Break; // ~1 ??? - - j=1; - for(y=1;j && y=cs && getpixel(bp,x+1,y )>=cs - && getpixel(bp,x ,y-1)< cs && getpixel(bp,x+1,y-1)< cs ) { j=0;break; } - } if(!j) Break; - - if( num_cross(0,dx-1,dy-2,dy-2,bp,cs) == 2 - && num_cross(0,dx-1,dy-1,dy-1,bp,cs) == 2 ) Break; // ~* (5er) - - if( dy>= 16 - && loop(bp, 0, 3*dy/4,dx,cs,0,RI) - >=loop(bp, 0, dy-2,dx,cs,0,RI) - && loop(bp,dx-1, 3*dy/4,dx,cs,0,LE) - <=loop(bp,dx-1, dy-2,dx,cs,0,LE) - && loop(bp,dx-1, 1,dx,cs,0,LE)+dx/16 - loop(bp, 0,3*dy/16,dx,cs,0,RI)+dx/16 - || loop(bp,dx-1, 0,dx,cs,0,LE)==0 - || loop(bp,dx-1, 1,dx,cs,0,LE)==0) ) ad=96*ad/100; // ~f Jan02 - if(dx<8 && dy>12){ // thin f's could easily confound with t - x=loop(bp,dx-1,3*dy/16,dx,cs,0,LE); - if (x) - if (loop(bp,dx-x,0,dy,cs,0,DO)<3*dy/16 - && loop(bp, 0, 3*dy/4,dx,cs,0,RI)+1 - >=loop(bp, 0, dy-2,dx,cs,0,RI) - && loop(bp,dx-1, 3*dy/4,dx,cs,0,LE) - <=loop(bp,dx-1, dy-2,dx,cs,0,LE) ) Break; - } - if (dx>7) - if( num_cross( 0,dx-1,2*dy/3,2*dy/3,bp,cs) > 1 - && num_cross( 0,dx/2,2*dy/3,2*dy/3,bp,cs) > 0 - && num_cross(dx/2,dx-1,2*dy/3,2*dy/3,bp,cs) > 0 ) - if (sdata->holes.num > 0) - if (sdata->holes.hole[0].y0 > dy/4) Break; // ~6 - // if ( num_hole( x0, x1, y0+dy/4, y1, box1->p,cs,NULL) > 0 ) Break; // ~6 - - if( num_cross(0,dx-1,3*dy/4, 3*dy/4, bp,cs) >= 2 - && num_cross(0,dx-1,3*dy/4-1,3*dy/4-1,bp,cs) >= 2 ){ - ad=99*ad/100; /* italic t ? */ - if (loop(bp,dx/2 ,dy-1,dy,cs,0,UP)>dy/4) Break; // ~h - if (loop(bp,dx/2+1,dy-1,dy,cs,0,UP)>dy/4) Break; // ~h - } - - x= loop(bp,dx-1,dy/2,dx,cs,0,LE); - i= loop(bp,dx-1,dy/8,dx,cs,0,LE); - if (i>x && loop(bp,dx-x,0,dy,cs,0,DO)>=dy/2) ad=90*ad/100; /* ~\ */ - - x= loop(bp,0, 0,dx,cs,0,RI); - i= loop(bp,0, 1,dx,cs,0,RI); if (i1) Break; // l - - // this happens quite often, do not be to strong - if (!box1->m2) ad=99*ad/100; - if (box1->m2) { - if (!hchar) ad=99*ad/100; /* some times t is not long enough */ - if( y0>=box1->m2-(box1->m2-box1->m1)/4 ) ad=99*ad/100; /* to short */ - if( y0>=box1->m2 ) ad=99*ad/100; /* to short */ - } - - if (sdata->holes.num > 0) ad=95*ad/100; - if (gchar) ad=99*ad/100; - if (box1->dots) ad=90*ad/100; - Setac(box1,'t',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_sS(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - wchar_t ac; - - // --- test sS near 5 --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 (4x6 font) - DBG( wchar_t c_ask='s'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if( num_cross( dx/2, dx/2,0,dy-1,bp,cs)!=3 - && num_cross(5*dx/8,3*dx/8,0,dy-1,bp,cs)!=3 - && dy>4 ) Break; - if( num_cross(0,dx-1,dy/2 ,dy/2 ,bp,cs)!=1 - && num_cross(0,dx-1,dy/2-1,dy/2-1,bp,cs)!=1 ) Break; - // get the upper and lower hole koords - y=dy/4; - x =loop(bp,0,y,dx,cs,0,RI); if(x>3*dx/8) Break; /* slanted too */ - x +=loop(bp,x,y,dx,cs,1,RI); if(x>5*dx/8) Break; /* fat too */ - i1 =loop(bp,x,y,dx,cs,0,RI); i1=(i1+2*x)/2; // upper center x - y=11*dy/16; - x =loop(bp,dx-1 ,y,dx,cs,0,LE); if(x>dx/4) Break; - x +=loop(bp,dx-1-x,y,dx,cs,1,LE); if(dx>5 && dy>7 && x>dx/2) Break; - if (x>3*dx/4) Break; if(x>dx/2) { ad=98*ad/100; MSG({})} - i2 =loop(bp,dx-1-x,y,dx,cs,0,LE); i2=dx-1-(i2+2*x)/2; // upper center x - for( y=dy/4;ydx/8) break; - } - if(y==dy/2) Break; // Mai00 - - y=dy/2+loop(bp,0,dy/2,dy/2,cs,1,DO); - if( !joined(bp,0,y,i2,11*dy/16,cs) ) Break; - - if (sdata->holes.num > 0) - if (sdata->holes.hole[0].y0 > dy/4) Break; // ??? - // if( num_hole( x0, x1, y0+dy/4, y1, box1->p,cs,NULL) > 0 ) Break; - - i1=loop(bp,dx-1,dy-1,dx,cs,0,LE); - i2=loop(bp,dx-1,dy-2,dx,cs,0,LE); - if (i2-i1 >= dx/4) Break; // ~{ 5x7font - - i1=loop(bp, 0, 0,dx,cs,0,RI); - i2=loop(bp, 0, 1,dx,cs,0,RI); - if (i2-i1 >= dx/4) Break; // ~} 5x7font - - // sS5 \sl z left upper v-bow ? - - i1=loop(bp, 0,dy/2,dx,cs,0,RI); - i1=loop(bp, i1,dy/2,dx,cs,1,RI); - if (4*i1>=3*dx) ad=97*ad/100; // ~5 7-segment - - i1=loop(bp,0, dy/16,dx,cs,0,RI); - i2=loop(bp,0,4*dy/16,dx,cs,0,RI); - i3=loop(bp,0,7*dy/16,dx,cs,0,RI); - if( 2*i2+dx/32 >= i1+i3 ){ - if( 2*i2+dx/32 > i1+i3 || dx>9 ) Break; - // very small s? - i1+=loop(bp,i1, dy/16,dx,cs,1,RI); - i2+=loop(bp,i2,4*dy/16,dx,cs,1,RI); - i3+=loop(bp,i3,7*dy/16,dx,cs,1,RI); - if( 2*i2+dx/32 >= i1+i3 ) Break; - } - - for(y=7*dy/16;y<5*dy/8;y++){ - if( num_cross( 0,dx-1,y ,y ,bp,cs)==2 ) - if( num_cross( 0,dx-1,y+1,y+1,bp,cs)==1 ) - if( num_cross( 0,dx/4,y,y,bp,cs)==1 ) break; // ~5 - } if(y<5*dy/8) Break; // v0.2.4a5 - if ( loop(bp, dx-1,dy-2-dy/32,dx,cs,0,LE) - > loop(bp, 0, 1+dy/32,dx,cs,0,RI) + dx/4 ) Break; // ~5 Dec00 - ac='s'; - if (gchar) { ad=98*ad/100; MSG({}) } - if( hchar ){ // S but 5 is very similar! check it - ac='S'; - if ( loop(bp, dx-1,dy-1-dy/32,dx,cs,0,LE) - > loop(bp, 0, 0+dy/32,dx,cs,0,RI) ) ad=99*ad/100; // ~5 - if ( loop(bp, 0,dy-1-dy/32,dx,cs,0,RI) - > loop(bp, dx-1, 0+dy/32,dx,cs,0,LE) ) ad=99*ad/100; // ~5 - } - Setac(box1,ac,ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_gG(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test g --------------------------------------------------- - /* some g's have crotchet at upper right end, so hchar can be set */ - // ~italic g - for(ad=d=100;dx>2 && dy>4;){ // min 3x5 - DBG( wchar_t c_ask='g'; ) - if (sdata->holes.num > 3) Break; /* tolerant against a tiny hole */ - if( get_bw(x0+dx/2, x0+dx/2, y1-dy/2, y1,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/4, x1 , y1-dy/4, y1,box1->p,cs,1) != 1 ) Break; // ~p - if( get_bw(x0+dx/2, x0+dx/2, y0, y0+dy/2,box1->p,cs,1) != 1 ) Break; - - if( num_cross(x0+dx/2, x0+dx/2, y0, y1, box1->p,cs) < 3 ) - if( num_cross(x1-dx/2, x1-dx/2, y0, y1, box1->p,cs) < 3 ) Break; - if (sdata->holes.num < 1) Break; - for (i=0;iholes.num;i++){ - if (sdata->holes.hole[i].y1 < 5*dy/8+1) break; - } if (i==sdata->holes.num) Break; // no upper hole found - // if( num_hole ( x0, x1, y0, y0+5*dy/8, box1->p,cs,NULL) != 1 ) Break; - for(y=dy/4;y=15*dy) Break; // ~B - - if (num_cross(x1, x1, (y0+y1)/2, y1, box1->p,cs)>1) { - ad=98*ad/100; // ~& - if (num_cross(x1 , x1 , y0, (y0+y1)/2, box1->p,cs)<1 ) ad=96*ad/100; - if (num_cross(x1-1, x1-1, y0, (y0+y1)/2, box1->p,cs)<1 ) ad=95*ad/100; - } - // looking for a gap - for (x=0,y=dy/4;yx) x=i; - } // in a good font x is greater dx/2 - - if (xp,cs) > 2 - || num_cross(x0,x1 ,y0+dy/8,y0+dy/8,box1->p,cs) > 2) ad=90*ad/100; - if( num_cross(x0,x1+dx/4,y1-dy/4,y1-dy/4,box1->p,cs) > 2 - || num_cross(x0,x1+dx/4,y1-dy/8,y1-dy/8,box1->p,cs) > 2) ad=90*ad/100; - } - if( num_cross(0,dx-1,dy/2,dy/2,bp,cs) >2 ) ad=99*ad/100; // ~/o - - /* test for horizontal symmetry ~8 */ - for (y=0;ym4==0) ad=98*ad/100; - if ( hchar) ad=96*ad/100; - if (!gchar) ad=96*ad/100; - ad=98*ad/100; - Setac(box1,'g',ad); - break; - } - // --- test rundes G --------------------------------------------- - for(ad=d=100;dx>3 && dy>4;){ // min 3x4 - DBG( wchar_t c_ask='G'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if( get_bw(x0 ,x0+dx/2,y0+dy/3,y0+dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2,x1-dx/4,y0 ,y0+dy/4,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2,x0+dx/2,y1-dy/4,y1 ,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0 ,x0+dx/2,y1-dy/3,y1-dy/3,box1->p,cs,1) != 1 ) Break; // ~S - for( y=y0+dy/4;yp,cs,1) == 0 ) break; - if( y==y1-dy/3 ) Break; // no gap - - if( num_cross(x0+dx/2 , x0+dx/2 , y0, y, box1->p,cs) != 1 - || num_cross(x0+dx/2+1, x0+dx/2+1, y0, y, box1->p,cs) != 1 ) Break; // ~e - - x=x0; y=y1; - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,UP,ST); // left bow? - if( yp,&x,&y,x0,x1,y0,y1,cs,LE,ST); - if( xp,&x,&y,x0,x1,y0,y1,cs,ST,LE); - if( xp,&x,&y,x0,x1,y0,y1,cs,LE,ST); - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,ST,LE); - if( xp,&x,&y,x0,x1,y0,y1,cs,RI,UP); // upper end right midle - if( x<=x1 ) Break; - if( yy1-dy/4 ) Break; - - x=x1-dx/3;y=y1; // follow left C-bow, filter S - turmite(box1->p,&x,&y,x0,x1,y0+dy/4,y1,cs,LE,UP); // w=LE b=UP - if( y>y0+dy/4+1 ) Break; /* leave box below for S or on top for CG */ - MSG(fprintf(stderr,"xy= %d %d",x-x0,y-y0);) - /* if (yp,&x,&y,x0,x1,y0 ,y1,cs,RI,UP); - MSG(fprintf(stderr,"xy= %d %d",x-x0,y-y0);) - if( y>y0 ) Break; - if (sdata->holes.num > 0) Break; - // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) > 0 ) Break; - if( dx>4 && dy>6){ // no (<[ - for(i=1,y=0;i && y Z - if( xi ) i=x; - } if( yi){ i=x;i1=y; } - } if( i1<=dy/4 || i1>=dy-dy/4 ) Break; // around the middle ? - // check from above for gap and left vertical line (~S) - x =loop(bp,0,i1,dx ,cs,0,RI); - x+=loop(bp,x,i1,dx-x,cs,1,RI); // left vertical bow - x+=loop(bp,x,i1,dx-x,cs,0,RI); if (x>=dx) ad=90*ad/100; - MSG(fprintf(stderr,"h-bar y dx %d %d ad= %d",i1,i,ad);) - - i=1; // Mar06: adapted to 4x6 font - for(x=dx/2;x=cs - && getpixel(bp,x+1,y )< cs - && getpixel(bp,x+1,y-1)< cs - && getpixel(bp,x ,y-1)< cs ) { i=0;break; } - } - if(i) ad=95*ad/100; // ~C - if(!hchar) ad=98*ad/100; - if( gchar) ad=98*ad/100; - - Setac(box1,'G',ad); - break; - } - // --- test \it g like 9 ---------------------------------------------- - for(ad=d=100;dx>2 && dy>4;){ // dx>1 dy>2*dx - DBG( wchar_t c_ask='g'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if( num_cross(x0+dx/2,x0+dx/2,y0,y1,box1->p,cs) != 3 // pre select - && num_cross(x0+dx/4,x1-dx/4,y0,y1,box1->p,cs) != 3 ) Break; - for( x=0,i=y=y0+dy/2;y<=y1-3*dy/16;y++){ // suche kerbe - j=loop(box1->p,x0,y,dx,cs,0,RI); - if( j>2 && j>dx/4 && yp,x0+j-2,y+1,dx,cs,0,RI)-2; - if( j>x ) { x=j; i=y; } - } - if( x<4*dx/8 ) Break; - if( num_cross(x0+dx/2,x1,i ,y1,box1->p,cs) != 1 - && num_cross(x0+dx/2,x1,i+1,y1,box1->p,cs) != 1 ) Break; - if( num_hole(x0,x1,y0,i+1,box1->p,cs,NULL)!=1 ) Break; - if( num_hole(x0,x1,i-1,y1,box1->p,cs,NULL)!=0 ) Break; - if( loop(box1->p,x0,y1 ,dy,cs,0,RI)>dx/3 && - loop(box1->p,x0,y1-1,dy,cs,0,RI)>dx/3) Break; // no q - for( x=0,i=y=y0+dy/3;y<=y1-dy/3;y++){ // suche kerbe - j=loop(box1->p,x1,y,dx,cs,0,LE); - if( j>x ) { x=j; i=y; } - } if( x>dx/2 ) Break; // no g - i1=loop(bp,dx-1,dy/8 ,dx,cs,0,LE); if(i1>dx/2) Break; - i3=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); - i2=loop(bp,dx-1,dy/2 ,dx,cs,0,LE); if(i1+i3<2*i2-dx/8) Break; // konvex - i1=loop(bp,dx-1,dy/4 ,dx,cs,0,LE); if(i1>dx/2) Break; - i3=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); - for(y=dy/4;y0){ x--; // robust - y=loop(bp,dx-x-1, dy-1,dy,cs,0,UP); - if(yp,cs) > 2) ad=90*ad/100; - if( num_cross(x0,x1+dx/4,y1-dy/4,y1-dy/4,box1->p,cs) > 2 - || num_cross(x0,x1+dx/4,y1-dy/8,y1-dy/8,box1->p,cs) > 2) ad=90*ad/100; - - if (box1->m4==0) ad=98*ad/100; - if ( hchar) ad=96*ad/100; - if (!gchar) ad=96*ad/100; - if (ad>99) ad=99; // never be sure to have a 9 - Setac(box1,'g',ad); - break; - } - return box1->c; -} - -// rewritten for vector usage v0.41 -static wchar_t ocr0_xX(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - // pix *bp=sdata->bp; // obsolete - int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0, x1=box1->x1, y0=box1->y0, y1=box1->y1; // ,cs=sdata->cs; - int dx=x1-x0+1, dy=y1-y0+1, /* size */ - (*aa)[4]=sdata->aa, /* the for line ends, (x,y,dist^2,vector_idx) */ - ad; /* tmp-vars */ - wchar_t bc=UNKNOWN; - - // --- test xX --------------------------------------------------- - // rewritten for vectors 0.41 - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - int ld, i1, i2, i3, i4; // lien derivation, 4 inner edges - DBG( wchar_t c_ask='x'; ) - if (sdata->holes.num > 0) Break; /* # */ - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the 4 ends of the x */ - if (aa[0][2]>d) Break; - if (aa[1][2]>d) Break; - if (aa[2][2]>d) Break; - if (aa[3][2]>d) Break; - if (aa[3][0]-aa[0][0]num_frame_vectors[0]) { - if (box1->frame_vector[i][0] - >=box1->frame_vector[j][0]) j=i; /* notice most right vector */ - } if (j==i) Break; - /* calculate the distance to the center */ - x=box1->frame_vector[j][0]; - y=box1->frame_vector[j][1]; i1=j; - if (abs(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]-4*x)>(dx+2)) Break; - if (abs(aa[0][1]+aa[1][1]+aa[2][1]+aa[3][1]-4*y)>(dy+2)) Break; - if ( aa[0][0]+aa[1][0]-2*x>=0) Break; - if ( aa[1][0] >= x ) Break; - if ( aa[0][0] > x ) Break; - if ( aa[0][0] >= x ) ad=99*ad/100; - if (x-x02*sq(1024/4)) Break; - /* check if lower left and center point are joined directly */ - ld=line_deviation(box1, j, aa[1][3]); - MSG(fprintf(stderr," X-1 %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - - /* only lower side */ - for (j=i=aa[1][3];i!=aa[2][3];i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[i][1] - <=box1->frame_vector[j][1]) j=i; /* notice most upper vector */ - } if (j==i) Break; - /* calculate the distance to the center */ - x=box1->frame_vector[j][0]; - y=box1->frame_vector[j][1]; i2=j; - if (abs(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]-4*x)>(dx+2)) Break; - if (abs(aa[0][1]+aa[1][1]+aa[2][1]+aa[3][1]-4*y)>(dy+2)) Break; - if ( aa[1][1]+aa[2][1]-2*y<=0) Break; - /* check if lower left and center point are joined directly */ - ld=line_deviation(box1, aa[1][3], j); - MSG(fprintf(stderr," 1-X %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - /* check if lower right and center point are joined directly */ - ld=line_deviation(box1, j, aa[2][3]); - MSG(fprintf(stderr," X-2 %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - - /* only right side */ - for (j=i=aa[2][3];i!=aa[3][3];i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[i][0] - <=box1->frame_vector[j][0]) j=i; /* notice most left vector */ - } if (j==i) Break; - /* calculate the distance to the center */ - x=box1->frame_vector[j][0]; - y=box1->frame_vector[j][1]; i3=j; - if (abs(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]-4*x)>(dx+2)) Break; - if (abs(aa[0][1]+aa[1][1]+aa[2][1]+aa[3][1]-4*y)>(dy+2)) Break; - if ( aa[2][0]+aa[3][0]-2*x<=0) Break; - if ( aa[3][0] <= x ) Break; - if ( aa[2][0] < x ) Break; - if ( aa[2][0] <= x ) ad=99*ad/100; - if (dx-(x-x0)2*sq(1024/4)) Break; - /* check if upper right and center point are joined directly */ - ld=line_deviation(box1, j, aa[3][3]); - MSG(fprintf(stderr," X-3 %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - - /* only upper side */ - for (j=i=aa[3][3];i!=aa[0][3];i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[i][1] - >=box1->frame_vector[j][1]) j=i; /* notice lowest vector */ - } if (j==i) Break; - /* calculate the distance to the center */ - x=box1->frame_vector[j][0]; - y=box1->frame_vector[j][1]; i4=j; - if (abs(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]-4*x)>(dx+2)) Break; - if (abs(aa[0][1]+aa[1][1]+aa[2][1]+aa[3][1]-4*y)>(dy+2)) Break; - if ( aa[3][1]+aa[0][1]-2*y>=0) Break; - /* check if upper left and center point are joined directly */ - ld=line_deviation(box1, aa[3][3], j); - MSG(fprintf(stderr," 3-X %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - /* check if lower left and center point are joined directly */ - ld=line_deviation(box1, j, aa[0][3]); - MSG(fprintf(stderr," X-0 %d %d dist= %d/%d",x-x0,y-y0,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - - // center crossing of diagonal lines is small? - if (box1->frame_vector[i3][0] - box1->frame_vector[i1][0] > dx/2) Break; - - if (gchar) ad=99*ad/100; - bc='x'; if(hchar) bc='X'; - Setac(box1,bc,ad); - break; - } - // --- test \it x --------------------------------------------------- -#if 0 - for(ad=d=99;dx>4 && dy>4;){ // min 3x4 - DBG( wchar_t c_ask='x'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if( get_bw(x0,x0+dx/4,y0+dy/2,y0+dy/2,box1->p,cs,1) != 0 ) Break; - if( get_bw(x1-dx/4,x1,y0+dy/2,y0+dy/2,box1->p,cs,1) != 0 ) Break; - if( num_cross(x0+dx/4,x1-dx/4,y0+dy/2,y0+dy/2, box1->p,cs) != 1 ) Break; - if( num_cross(x0,x1,y0+dy/4,y0+dy/4, box1->p,cs) != 3 - && num_cross(x0,x1,y0+dy/8,y0+dy/8, box1->p,cs) < 3 ) Break; - if( num_cross(x0,x1,y1-dy/4,y1-dy/4, box1->p,cs) != 3 - && num_cross(x0,x1,y1-dy/8,y1-dy/8, box1->p,cs) < 3 ) Break; - if( gchar ) ad=97*ad/100; - if( hchar ) ad=96*ad/100; - bc='x'; - Setac(box1,bc,ad); - break; - } -#endif - return box1->c; -} - -static wchar_t ocr0_yY(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad,xa,ya,xb,yb,xc,yc,xd,yd; /* tmp-vars */ - wchar_t bc=UNKNOWN; - - // --- test italic yY -------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='y'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if (sdata->holes.num > 0) ad=97*ad/100; - if( num_cross(0,dx-1,dy/8,dy/8,bp,cs) < 2 - && num_cross(0,dx-1, 1, 1,bp,cs) < 2 ) Break; - if( num_cross(0,dx-1,dy-1,dy-1,bp,cs) != 1 - && num_cross(0,dx-1,dy-2,dy-2,bp,cs) != 1 ) Break; - if( num_cross(dx-1,dx-1,0,dy-1,bp,cs) != 1 - && num_cross(dx-2,dx-2,0,dy-1,bp,cs) != 1 ) Break; - if( num_cross(dx/3,dx/3,dy/4,dy-1,bp,cs) != 2 - && num_cross(dx/2,dx/2,dy/4,dy-1,bp,cs) != 2 ) Break; - for(yc=y=0,xc=x=dx/4;xy){ yc=y=i;xc=x; } - } if( y>12*dy/16 || y<3*dy/8 ) Break; - ya=dy/8; xa=xc-loop(bp,xc,ya,dx,cs,0,LE); if(xa< 0) Break; - yb=dy/8; xb=xc+loop(bp,xc,yb,dx,cs,0,RI); if(xb>=dx) Break; - for(y=dy/8;y6*dx/8) ad=99*ad/100; // why this??? - if (loop(bp,dx-1,dy-1,dx,cs,0,LE)<1) Break; - // printf(" abcd=%d %d %d %d %d %d %d %d -",xa,ya,xb,yb,xc,yc,xd,yd); - if( get_line2(xb,yb,xd,yd,bp,cs,100)<95 ) Break; - // if( get_line2(xc,yc,xd,yd,bp,cs,100)<95 ) Break; - // printf("ok"); - bc='y'; - if(gchar && !hchar) bc='y'; else - if(hchar && (!gchar || dy<14)) bc='Y'; else ad=98*ad/100; // SMALL-CAPS ??? - Setac(box1,bc,ad); - break; - } - // --- test yY --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='y'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if( get_bw(x0,x0,y1-dy/8,y1,box1->p,cs,1) == 1 ) { - if( get_bw(x0,x0+4*dx/8,y0+dy/8,y0+dy/8,box1->p,cs,1) != 1 ) Break; - } else { - if( get_bw(x0,x0+3*dx/8,y0+dy/8,y0+dy/8,box1->p,cs,1) != 1 ) Break; - } - if( num_cross(0,dx-1,dy/8,dy/8,bp,cs) != 2 - && num_cross(0,dx-1, 1, 1,bp,cs) != 2 ) Break; - if( num_cross(dx/2,dx/2,0, 1,bp,cs) != 0 ) Break; - if( num_cross(0,dx-1,dy-1,dy-1,bp,cs) != 1 - && num_cross(0,dx-1,dy-2,dy-2,bp,cs) != 1 ) Break; - if( num_cross(dx-1,dx-1,0,dy-1,bp,cs) != 1 - && num_cross(dx-2,dx-2,0,dy-1,bp,cs) != 1 - && num_cross(dx-dx/8-1,dx-dx/8-1,0,dy-1,bp,cs) != 1 ) Break; - if( loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)+dx/8+1 // Jul00 - < loop(bp, 0,dy-1-dy/8,dx,cs,0,RI) ) Break; - for(y=0,x=dx/4;xy) y=i; - } if( y>10*dy/16 || y<2*dy/8 ) Break; - for(xc=xb=xa=dx,yc=yb=ya=y=0;ydy/8) Break; - for(i=dx,yc=y=dy/4;y<3*dy/4;y++){ - if( num_cross(0,dx-1,y,y,bp,cs) < 2 ) break; - x =loop(bp,dx-1 ,y,dx,cs,0,LE); - x+=loop(bp,dx-1-x,y,dx,cs,1,LE); - j =loop(bp,dx-1-x,y,dx,cs,0,LE); if(j<=i){ i=j;yc=y;xc=dx-1-x-j/2; } - } yc+=dy/16+1; - yc+=loop(bp,xc,yc,i,cs,1,DO)/2; - xa+= loop(bp,xa ,ya,dx,cs,1,RI)/2; - xb=dx-1-loop(bp,dx-1,yb,dx,cs,1,LE)/2; - yd=dy-1-dy/8;xd=dx-1-loop(bp,dx-1,yd,dx,cs,0,LE); if(xd>6*dx/8) Break; - /* check for serife at lower end */ - for (i=0,x=dx-1;ix+dx/16+1) break; /* detect serif */ - if (j=5*dy/8 && !gchar) - if( get_line2(xa,ya,xd ,yd,bp,cs,100)>95 ) - if( get_line2(xb,yb,xd ,yd,bp,cs,100)>95 ) - { if (dx>4) { Break; } else ad=ad*98/100; } // ~V - xa=loop(bp,0,dy/8,dx,cs,0,RI); - xb=loop(bp,0,dy/2,dx,cs,0,RI); - xc=loop(bp,0,dy-1,dx,cs,0,RI); - if( 2*xb< xa+xc ) ad=98*ad/100; // ~V - if( 2*xb<=xa+xc ) ad=98*ad/100; - if( 2*xb<=xa+xc+1 ) ad=98*ad/100; - - bc='y'; - if ((!gchar) && (!hchar)) ad=98*ad/100; - if(y0m2-(box1->m2-box1->m1)/4) - { bc='Y'; if(gchar) ad=98*ad/100; } - // SMALL-CAPS ??? - Setac(box1,bc,ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_zZ(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - int i1,i2,i3,i4,i5,dbg[9], - d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - (*aa)[4]=sdata->aa, /* the for line ends, (x,y,dist^2,vector_idx) */ - ad; /* tmp-vars */ - wchar_t bc=UNKNOWN; - - // --- test zZ ------- - for(ad=d=100;dx>3 && dy>3;){ // dy>dx - DBG( wchar_t c_ask='z'; ) /* for debugging purpose */ - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if (sdata->holes.num > 0) ad=98*ad/100; /* # */ - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the 4 edges of the z */ - if (aa[0][2]>d) Break; - if (aa[1][2]>d) Break; - if (aa[2][2]>d) Break; - if (aa[3][2]>d) Break; - if (aa[3][0]-aa[0][0]dy/8) ad=99*ad/100; - if (aa[0][1]-y0>dy/8) ad=99*ad/100; - if (2*dx2*sq(1024/4)) Break; - ad=(100-(d-sq(1024)/2)/sq(1024)/4)*ad/100; - d=line_deviation(box1, aa[1][3], aa[2][3]); if (d>2*sq(1024/4)) Break; - - /* search uppermost right > */ - i1=nearest_frame_vector(box1,aa[0][3],aa[1][3], x1, y0); - x=box1->frame_vector[i1][0]; - y=box1->frame_vector[i1][1]; - if (y-y0 > 5*dy/8) Break; - if (x-x0 < 3*dx/8) Break; - if (x-aa[0][0]<=dx/4) Break; // ~lI - if (x-aa[0][0]<=dx/3) ad=98*ad/100; // ~lI - if (x-aa[0][0]<=dx/2) ad=99*ad/100; // ~lI - /* search most right > ~2 */ - i3=nearest_frame_vector(box1,aa[0][3],aa[1][3], x1+2*dx, (y0+y1)/2); - MSG(fprintf(stderr,"xy= %d %d %d %d %d %d",x0,y0,x-x0,y-y0,box1->frame_vector[i3][0]-x0,box1->frame_vector[i3][1]-y0);) - if ( box1->frame_vector[i3][1]-y0> dy/4 - && box1->frame_vector[i3][0]-x>=0) Break; - if ( box1->frame_vector[i3][1]-y> dy/8 - && box1->frame_vector[i3][0]-x>=-dx/8) ad=98*ad/100; - if ( box1->frame_vector[i3][1]-y> dy/8 - && box1->frame_vector[i3][0]-x>= 0) ad=97*ad/100; - if (box1->frame_vector[i3][0]-aa[0][0] - < aa[3][0]-box1->frame_vector[i3][0]) break; // ~lI - if (box1->frame_vector[i3][0]-aa[0][0] - <(aa[3][0]-box1->frame_vector[i3][0])*2) ad=98*ad/100; // ~lI - /* better test for a bow or peaked angle */ - /* upper part of a 2, on a Z a and b should be at c - .....$@@@@@@a...c. o1 (o1-a)=(dx+5)^2 =dx^2+10*dx+25 - ...$$@@@@@@@@@.... (o1-b)=(dx+1)^2+4^2=dx^2+ 2*dx+18 - ..$@@$@@@$@@@@@... - ..@@@.....$$@@@@.. - ..@@.......@$@@@b. - ..$.........$@@@@. - .$$..........$@@@. - .$...........@@@@. - .............@@@@.< - .............$@@$. - ............$@@@.. - ............@@$... - ............$@$... - --- snip ---- - */ - i4=nearest_frame_vector(box1,aa[2][3],aa[0][3], x1+dx, y0); - i5=nearest_frame_vector(box1,aa[2][3],aa[0][3], x1, y0-dx); - d=sq(box1->frame_vector[i5][0]-box1->frame_vector[i4][0]) - +sq(box1->frame_vector[i5][1]-box1->frame_vector[i4][1]); - if (d>2*sq(dx/8+1)) break; - - /* check if upper left and upper right point are joined directly */ - dbg[0]=d=line_deviation(box1, aa[0][3], i1); if (d >2*sq(1024/4)) Break; - /* check if lower right and upper left point are joined directly */ - dbg[1]=d=line_deviation(box1, i1, aa[1][3]); if (d >2*sq(1024/4)) Break; - - /* search lowest left < */ - i2=nearest_frame_vector(box1,aa[2][3],aa[3][3], x0, y1); - x=box1->frame_vector[i2][0]; - y=box1->frame_vector[i2][1]; - if (y-y0 < 3*dy/8) Break; - if (x-x0 > 5*dx/8) Break; - if (aa[2][0]-x<=dx/4) Break; // ~lI - if (aa[2][0]-x<=dx/3) ad=98*ad/100; // ~lI - if (aa[2][0]-x<=dx/2) ad=99*ad/100; // ~lI - /* check if upper right and lower left point are joined directly */ - dbg[2]=d=line_deviation(box1,i2, aa[3][3]); if (d >2*sq(1024/4)) Break; - /* check if lower left and lower right point are joined directly */ - dbg[3]=d=line_deviation(box1, aa[2][3],i2); if (d >2*sq(1024/4)) Break; - - if (box1->frame_vector[i1][0] - -box1->frame_vector[i2][0]<=dx/8) Break; /* nonsignificant distance */ - MSG( \ - fprintf(stderr,"^v %d %d %d %d line deviation %d %d %d %d max %d %d",\ - box1->frame_vector[i1][0]-x0,box1->frame_vector[i1][1]-y0,\ - box1->frame_vector[i2][0]-x0,box1->frame_vector[i2][1]-y0,\ - dbg[0],dbg[1],dbg[2],dbg[3],2*sq(1024/4),2*sq(1024));) - ad=(100-(dbg[0]-sq(1024)/2)/sq(1024)/4)*ad/100; - ad=(100-(dbg[1]-sq(1024)/2)/sq(1024)/4)*ad/100; - ad=(100-(dbg[2]-sq(1024)/2)/sq(1024)/4)*ad/100; - ad=(100-(dbg[3]-sq(1024)/2)/sq(1024)/4)*ad/100; - - if ( gchar) ad=98*ad/100; - bc='z'; - if( hchar ) bc='Z'; - Setac(box1,bc,ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_wW(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar,handwritten=0, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad,ya,yb,xa,xb,xc,xd,xe,t1; /* tmp-vars */ - wchar_t ac; - - // ------- test w ~{\it w} --------------- - for(ad=d=100;dx>3 && dy>3;){ // dy<=dx - DBG( wchar_t c_ask='w'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - // xa xe - // \ xc / <=ya connected xa-xb-xc-xd-xe - // xb xd <=yb - // get two lowest points i3,i4,ya - // out_x(box1); - // ~ul ~uf - // out_x(box1); - for(y=dy/8;y< dy/2;y++) if( num_cross(0,dx-1,y,y,bp,cs)< 2 ) break; - if(y4) { /* 4x6 is to small */ - for(y=dy-1-dy/16;y>3*dy/4;y--) - if( num_cross(0,dx-1,y,y,bp,cs)==2 ) break; - if(y==3*dy/4) Break; - } - yb=y; - t1=loop(bp,0 ,dy/4,dx,cs,0,RI); - t1=loop(bp,t1,dy/4,dx,cs,1,RI); // thickness of line? - for(i=j=0 ;y> dy/4;y--) if( num_cross(0,dx-1,y,y,bp,cs)==4 ) i++; - else if( num_cross(0,dx-1,y,y,bp,cs)>=3 ) j++; - if(i+56 || dx>4)) Break; - if(i+j==0 && dx<=4){ - if (abs(loop(bp, 1,dy-1,dy,cs,0,UP) - -loop(bp,dx-2,dy-1,dy,cs,0,UP))>dy/8+1) Break; // 4x6 N - if ( ( loop(bp, 1, 0,dy,cs,0,DO)>=dy-2 - && loop(bp, 0,dy-1,dy,cs,0,UP)>0) - || ( loop(bp,dx-2, 0,dy,cs,0,DO)>=dy-2 - && loop(bp,dx-1,dy-1,dy,cs,0,UP)>0)) Break; // 4x6 UV - ad=ad*99/100; // 4x6 font - MSG(fprintf(stderr,"ad=%d",ad);) - } - if( num_cross(0,dx-1, 1, 1,bp,cs)< 2 - && num_cross(0,dx-1,dy/16,dy/16,bp,cs)< 2 ) Break; - x =loop(bp,0 ,yb,dx,cs,0,RI); - xb=loop(bp,x ,yb,dx,cs,1,RI);xb=x+xb/2; if(xb>dx/2) Break; - x =loop(bp,dx-1 ,yb,dx,cs,0,LE); - xd=loop(bp,dx-1-x,yb,dx,cs,1,LE);xd=dx-1-x-xd/2;if(xd<3*dx/8) Break; - for(y=0,xc=x=xb+1;xy){xc=x;y=i;} - if(dx>4 && !y) Break; - ya=dy-1-y; // flat - y=loop(bp,xc,ya,dy,cs,1,UP);if(y)y--; - if (dy>6 || dx>4) { // ~4x6 font - if( num_cross(0 ,xc ,ya-y ,ya-y ,bp,cs)!= 2 - && num_cross(0 ,xc ,ya-y/2,ya-y/2,bp,cs)!= 2 ) Break; - if( num_cross(xc,dx-1,ya-y ,ya-y ,bp,cs)!= 2 - && num_cross(xc,dx-1,ya-y/2,ya-y/2,bp,cs)!= 2 ) Break; - } - ya-=y/2; - x =loop(bp,0 ,1 ,dx,cs,0,RI); - xa=loop(bp,x ,1 ,dx,cs,1,RI); - if( x+xa>xb ){ // may be, here is a small but thick letter - // later add some proofs - xa=x+xa/4; - } else { - xa=x+xa/2; - } - x =loop(bp,dx-1 ,1 ,dx,cs,0,LE); - xe=loop(bp,dx-1-x,1 ,dx,cs,1,LE);xe=dx-1-x-xe/2; - MSG( fprintf(stderr,"a-e: %d %d %d %d %d %d %d %d %d %d", - xa,1,xb,yb,xc,ya,xd,yb,xe,1);) - if (ya94 ) break; - if (x==xa+i) Break; // no vert. line found - if( get_line2(xb,yb-1,xc,ya ,bp,cs,100)<95 - && get_line2(xb,yb-1,xc,ya+dy/32,bp,cs,100)<95 - && get_line2(xb,yb-1,xc,ya+dy/16,bp,cs,100)<95 ) Break; - if( get_line2(xc, ya,xd, yb,bp,cs,100)<95 - && get_line2(xc+1,ya,xd, yb,bp,cs,100)<95 ) Break; - if( get_line2(xd,yb,xe ,1+dy/16,bp,cs,100)<95 - && get_line2(xd,yb,dx-1 ,1+dy/8 ,bp,cs,100)<95 // round w - && get_line2(xd,yb,xe+dx/20,1+dy/16,bp,cs,100)<95 ) Break; - // if( num_hole(0,dx-1,0,dy-1,bp,cs,NULL) != 0 ) Break; - // ~ur - MSG(fprintf(stderr,"ad=%d",ad);) - for(i=0,y=5*dy/8;yi ) i=x; if( x3 && dy>3;){ // dy<=dx 4x6font (like a H with fat bar) - DBG( wchar_t c_ask='w'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - // ~ul ~uf - if( num_cross(0,dx-1,dy/2,dy/2,bp,cs)<2 ) Break; - if( num_cross(0,dx-1,dy/8,dy/8,bp,cs)<2 ) handwritten=40; - if( num_cross(0,dx-1,dy/4,dy/4,bp,cs)<2 ) handwritten=80; - for(i=0,y=0;ydx/2) Break; - xb=loop(bp,x ,yb,dx,cs,0,RI);xb=x+xb/2; if(xb>dx/2) Break; - x =loop(bp,dx-1 ,yb,dx,cs,0,LE); - x+=loop(bp,dx-1-x,yb,dx,cs,1,LE); - xd=loop(bp,dx-1-x,yb,dx,cs,0,LE);xd=dx-1-x-xd/2;if(xd<3*dx/8) Break; - if( num_cross(xb,xd,yb,yb ,bp,cs)!= 1 ) Break; - if( num_cross(xb,xb,yb,dy-1,bp,cs)!= 1 ) Break; - if( num_cross(xd,xd,yb,dy-1,bp,cs)!= 1 ) Break; - if( num_cross(xb,xb, 0,yb ,bp,cs)!= 0 ) Break; - if( num_cross(xd,xd, 0,yb ,bp,cs)!= 0 ) Break; - // if( num_hole(0,dx-1,0,dy-1,bp,cs,NULL) != 0 ) Break; - if (sdata->holes.num != 0) Break; - // ~ur - for(i=0,y=3*dy/4;yi ) i=x; if( xc; -} - -static wchar_t ocr0_aA(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,d,x,y,i1,i2,i3,i4,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad,ya; /* tmp-vars */ - - // --- test A --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='A'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - // first selection (rough sieve) - if( get_bw(dx/2 ,dx/2 ,dy-1-dy/8,dy-1,bp,cs,1) == 1 - && get_bw(dx/2-1,dx/2-1,dy-1-dy/8,dy-1,bp,cs,1) == 1 ) Break; // ~B - ya=0; /* upper end, not 0 for modified A etc. */ - if (box1->modifier) - for (ya=0;ya=dy/2) ya=0; // already subtracted? - if( num_cross(0,dx-1,ya+ 1 ,ya+ 1 ,bp,cs)!=1 // 600dpi - && num_cross(0,dx-1,ya+ dy/8 ,ya+ dy/8 ,bp,cs)!=1 - && num_cross(0,dx-1,ya+ dy/16 ,ya+ dy/16 ,bp,cs)!=1 - && num_cross(0,dx-1,ya+ dy/8+1,ya+ dy/8+1,bp,cs)!=1 ) Break; - if( num_cross(0,dx-1, 7*dy/8 , 7*dy/8 ,bp,cs)!=2 - && num_cross(0,dx-1, 7*dy/8-1, 7*dy/8-1,bp,cs)!=2 ) Break; - if ( num_cross( 0,dx/8,ya+dy/8,ya+0,bp,cs)>0 ) Break; // ~R - for(y=ya+dy/8;y 1 ) break; - if( y==ya+dy/2 ) Break; i1=y; - if (dy>20) i1++; /* get arround some noise fat font */ - - x =loop(bp,0,i1,dx,cs,0,RI); if(x>3*dx/4) Break; - x+=loop(bp,x,i1,dx,cs,1,RI); if(x>3*dx/4) Break; i2=x; - x+=loop(bp,x,i1,dx,cs,0,RI); if(x<3*dx/8) Break; i2=(x+i2)/2; - // hole (i2,i1) - y+=loop(bp,i2,y,dy,cs,1,DO); - y+=loop(bp,i2,y,dy,cs,0,DO); if(y>3*dy/4) ad=ad*99/100; - if (y>5*dy/6) { MSG(fprintf(stderr,"x,y,i1,i2= %d %d %d %d",x,y,i1,i2);) } - if (y>5*dy/6) Break; - - if( sdata->holes.num != ((box1->modifier==RING_ABOVE)?2:1) - || sdata->holes.hole[0].y1-ya >= dy-1-dy/4) Break; - // if( num_hole ( x0, x1, y0, y1-dy/4 ,box1->p,cs,NULL) != 1 ) Break; - // out_x(box1); - i3=0;i4=0; - for(x=dx/3;x<2*dx/3;x++){ - i4=num_cross(i2,x,y ,dy-1,bp,cs);if(i4<1 || i4>2) - i4=num_cross(i2,x,y+dy/16,dy-1,bp,cs);if(i4<1 || i4>2) break; - if(i4==1) i3=x; - } if(i4<1 || i4>2 || i3==0){ -// ToDo: MSG(fprintf(stderr,"x,y,i4,i3= %d %d %d %d",x,y,i4,i3);) - Break; - } - if( get_bw(dx-1-dx/4, dx-1, dy-1-dy/4, dy-1, bp,cs,1) != 1 ) Break; - - i1=loop(bp,dx-1,ya+ (dy-ya)/4,dx,cs,0,LE); - i2=loop(bp,dx-1,ya+ (dy-ya)/2,dx,cs,0,LE); - i3=loop(bp,dx-1,dy-1-(dy-ya)/4,dx,cs,0,LE); - if( 2*i2-dx/8>i1+i3 ) ad=99*ad/100; /* 6*8 font */ - if( 2*i2+dx/4i1+i3 ) Break; - - i1=loop(bp,0 ,ya+ (dy-ya)/4,dx,cs,0,RI); // linke senkr. linie - i2=loop(bp,0 ,ya+ (dy-ya)/2,dx,cs,0,RI); - i3=loop(bp,0 ,dy-1-(dy-ya)/4,dx,cs,0,RI); - if( 2*i2-dx/8>i1+i3 ) ad=98*ad/100; /* 6*8 font */ - if( 2*i2+dx/4i1+i3 || i1i3+dx/16) break; if( i1+120) ad=97*ad/100; // italic-a - - if (!hchar) ad=99*ad/100; // italic-a - Setac(box1,'A',ad); - break; - } - // --- test a ------------------------------------------- - // with a open bow above the circle starting - // on the right side of the circle - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='a'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if( get_bw(x0 , x0+dx/2, y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/3, x1 , y0+dy/3, y0+dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/3, x1 , y0+dy/4, y0+dy/4,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2, x0+dx/2, y1-dy/3, y1, box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2, x0+dx/2, y0 , y0+dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/3, x1-dx/3, y0 , y0 ,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/4, x1-dx/2, y1 , y1 ,box1->p,cs,1) != 1 ) - if( get_bw(x0+dx/4, x1-dx/3, y1-1 , y1-1 ,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0 , x0 , y0+dy/2, y1 ,box1->p,cs,1) != 1 ) - if( get_bw(x0+dx/8, x0+dx/8, y0+dy/2, y1 ,box1->p,cs,1) != 1 ) Break; - if( loop(bp,3*dx/8,0,dy,cs,0,DO) > 3*dy/16 ) Break; // ~d - if( num_cross(0,dx-1,dy/4 ,dy/4 , bp,cs) >2 // ~glued am != an - && num_cross(0,dx-1,dy/4+1,dy/4+1, bp,cs) >2 ) Break; - - for( x=dx/4;xdy/2) break; - i=loop(bp,x,dy-1,y1-y0,cs,0,UP); if (i>dy/2) break; - } if( xy-1, bp,cs) == 3 ) i--; - } if( i ) Break; - - i1=loop(bp,0, dy/8,dx,cs,0,RI); - i3=loop(bp,0,3*dy/4,dx,cs,0,RI); - for(y=dy/8+1;y<3*dy/4;y++){ - i2=loop(bp,0,y,dx,cs,0,RI);if(2*i2>i1+i3+1) break; - } if(y==3*dy/4) Break; // ~6 - // ~ s (small thick s), look for vertikal line piece - for(x=3*dx/4;xdy/4 ) break; - if( x==dx ) Break; - - if (sdata->holes.num != 1) ad=96*ad/100; else - if (sdata->holes.num == 1) - if( num_hole ( x0, x1, y0+dy/3, y1 ,box1->p,cs,NULL) != 1 ) Break; - // if( num_hole ( x0, x1, y0, y1, box1->p,cs,NULL) != 1 ) Break; - if( num_hole ( x0, x1, y0, y1-dy/3 ,box1->p,cs,NULL) != 0 ){ - i =loop(bp,0,dy/4,dx,cs,0,RI); - i =loop(bp,i,dy/4,dx,cs,1,RI); - if(ii) Break; // ~ 8 - } - /* test for horizontal symmetry ~8 */ - for (y=0;y3 && dy>3;){ // min 4x4 - DBG( wchar_t c_ask='a'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if( get_bw(x0 , x0+dx/2,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/2 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y1-dy/2 , y1, box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/3 , x0+dx/3,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - i = loop(bp,dx/2, 0 ,dy,cs,0,DO); if (i>dy/4) Break; - i+= loop(bp,dx/2, i ,dy,cs,1,DO); if (i>dy/2) Break; - i = loop(bp,dx/2, i ,dy,cs,0,DO); if (ip,cs,1) == 1 ) Break; - - if( num_cross(x0+dx/2,x0+dx/2,y0 , y1 ,box1->p,cs) != 2 ) Break; - if( num_cross(x0+dx/3,x1-dx/3,y0 , y0 ,box1->p,cs) != 1 ) // AND - if( num_cross(x0+dx/3,x1-dx/3,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; - i = loop(bp,dx/2,dy-1 ,dy,cs,0,UP); if (i>dy/3) Break; - y = i+loop(bp,dx/2,dy-1-i,dy,cs,1,UP); if (i>dy/2) Break; - // normal 'a' has a well separated vertical line right from the circle - // but fat 'a' is like a 'o', only bigger on the right side - if( num_cross(x0+dx/2-1,x1,y1 ,y1 ,box1->p,cs) < 2 /* 4x6font */ - && num_cross(x0+dx/2-1,x1,y1-i,y1-i ,box1->p,cs) < 2 /* 2 or 3 */ - && num_cross(x0+dx/2-1,x1,y1-y,y1-y ,box1->p,cs) < 2 ) - { if (loop(bp, 0,dy-1-dy/16,dx,cs,0,RI) - <4*loop(bp,dx-1,dy-1-dy/16,dx,cs,0,LE)) { Break;} - else ad=98*ad/100; - } - if( num_cross(x0,x1,y0+dy/2 , y0+dy/2,box1->p,cs) < 2 - || num_cross(x0,x1,y0+dy/3 , y0+dy/3,box1->p,cs) < 2 ) Break; // Jun00 - - if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/4,box1->p,cs) != 1 ) - if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/4,box1->p,cs) != 1 ) Break; - if (sdata->holes.num != 1) - if( num_hole(x0,x1-2,y0 ,y1 ,box1->p,cs,NULL) != 1 ) - // if( num_hole(x0,x1 ,y0 ,y1 ,box1->p,cs,NULL) != 1 ) - Break; - if( num_hole(x0,x1 ,y0+dy/3,y1-1 ,box1->p,cs,NULL) != 0 ) Break; - - if( loop(bp,0 ,0 ,x1-x0,cs,0,RI)<= - loop(bp,0 ,2 ,x1-x0,cs,0,RI) ) Break; - - if( loop(bp,dx-1,dy-1,x1-x0,cs,0,LE)> dx/4 - && loop(bp,dx-1,dy-2,x1-x0,cs,0,LE)> (dx+4)/8 ) ad=97*ad/100; - - x=loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE); - i=loop(bp,dx-1, dy/4,dx,cs,0,LE); if (abs(x-i)>dx/4) Break; - - for( x=dx/4;xdy/2) break; - i=loop(bp,x,dy-1,y1-y0,cs,0,UP); if (i>dy/2) break; - } if( xp,cs) == 1 ) - if( num_cross(x0 , x1, y0, y0,box1->p,cs) == 1 ) - if( loop(bp,dx-1, 0,y1-y0,cs,0,DO)> dy/4 - && loop(bp,dx-1,dy-1,y1-y0,cs,0,UP)> dy/4 ) Break; // ~o - if( loop(bp,dx/2,dy-1,y1-y0,cs,0,UP)> dy/4 ) Break; // ~q - - if (hchar) ad=98*ad/100; - if (gchar) ad=98*ad/100; - // handwritten-a (alpha) - Setac(box1,'a',ad); - break; - } - // --- test A_A_WITH_OGONEK 0x0104 Centr.Eur.Font ------------------------- - /* not sure if we should move this to a get_CentralEuropean-function */ - for(ad=d=100;dx>2 && dy>4;){ // min 3x4 - DBG( wchar_t c_ask='A'; ) - if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ - // first selection (grobes Sieb) - if( get_bw(dx/2,dx/2,dy-1-dy/8,dy-1,bp,cs,1) == 1 ) break; // ~B - if( num_cross(0,dx-1, 1 , 1 ,bp,cs)!=1 // 600dpi - && num_cross(0,dx-1, dy/8 , dy/8 ,bp,cs)!=1 - && num_cross(0,dx-1, dy/16 , dy/16 ,bp,cs)!=1 - && num_cross(0,dx-1, dy/8+1, dy/8+1,bp,cs)!=1 ) break; - if( num_cross(0,dx-1, dy-1 , dy-1 ,bp,cs)!=1 ) break; - if( num_cross(0,dx-1, dy/4 , dy/4 ,bp,cs)!=2 - && num_cross(0,dx-1, dy/3 , dy/3 ,bp,cs)!=2 ) break; - if ( num_cross( 0,dx/8,dy/8, 0,bp,cs)>0 ) break; // ~R - for(y=dy/8;y 1 ) break; - if( y==dy/2 ) break; i1=y; - if (dy>20) i1++; /* get arround some noise fat font */ - - x =loop(bp,0,i1,dx,cs,0,RI); if(x>3*dx/4) break; - x+=loop(bp,x,i1,dx,cs,1,RI); if(x>3*dx/4) break; i2=x; - x+=loop(bp,x,i1,dx,cs,0,RI); if(x<3*dx/8) break; i2=(x+i2)/2; - // hole (i2,i1) - y+=loop(bp,i2,y,dy,cs,1,DO); - y+=loop(bp,i2,y,dy,cs,0,DO); if(y>3*dy/4) ad=ad*99/100; - if (y>5*dy/6) break; - - if( sdata->holes.num != 1 || sdata->holes.hole[0].y1 >= dy-1-dy/4) break; - // if( num_hole ( x0, x1, y0, y1-dy/4 ,box1->p,cs,NULL) != 1 ) break; - // out_x(box1); - i3=0;i4=0; - for(x=dx/3;x<2*dx/3;x++){ - i4=num_cross(i2,x,y ,dy-1,bp,cs);if(i4<1 || i4>2) - i4=num_cross(i2,x,y+dy/16,dy-1,bp,cs);if(i4<1 || i4>2) break; - if(i4==1) i3=x; - } if(i4<1 || i4>2 || i3==0){ -// ToDo: g_debug_A(printf(" A: x,y,i4,i3= %d %d %d %d\n",x,y,i4,i3);) - break; - } - if( get_bw(dx-1-dx/4, dx-1, dy-1-dy/4, dy-1, bp,cs,1) != 1 ) break; - /* dy/4 changed to dy/6 because of screenfonts */ - /* there are strange fonts, one has a serif on the upper end of A */ - if ( num_cross( 0,dx/8,dy/6, 0,bp,cs)>0 ) break; - if ( num_cross(dx-1-dx/4,dx-1, 0,dy/6,bp,cs)>0 ) break; - - i1=loop(bp,dx-1, dy/4,dx,cs,0,LE); - i2=loop(bp,dx-1, dy/2,dx,cs,0,LE); - i3=loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE); - if( 2*i2+dx/4i1+i3 ) break; - - i1=loop(bp,0 , dy/4,dx,cs,0,RI); // linke senkr. linie - i2=loop(bp,0 , dy/2,dx,cs,0,RI); - i3=loop(bp,0 ,dy-1-dy/4,dx,cs,0,RI); - if( 2*i2+dx/4i1+i3 || i1i3+dx/16) break; if( i1+12c; -} - -static wchar_t ocr0_cC(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i1,i2,i3,i4,i5,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad,t1; /* tmp-vars */ - wchar_t bc=UNKNOWN; - - // --- test c,C --------------------------------------------------- - for(ad=d=100;dx>2 && dy>2;){ // min 3x4 - DBG( wchar_t c_ask='c'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if( get_bw(x0 , x0+dx/3,y0+dy/2, y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2, x0+dx/2,y1-dy/3, y1, box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2, x0+dx/2,y0 , y0+dy/3,box1->p,cs,1) != 1 ) Break; - if( num_cross(x0,(x0+x1)/2,(y0+y1)/2,(y0+y1)/2,box1->p,cs) > 1 ) Break; // ~ocr-a-[ - - for(y=y0+dy/4;yp,cs,1) == 0 ) break; - if( y==y0+3*dy/4 ) Break; i1=y; // i1: upper end of right gap - - // measure thickness of line! - t1=loop(bp, 0,dy/2,dx,cs,0,RI); - t1=loop(bp,t1,dy/2,dx,cs,1,RI); - if (t1>dx/2) Break; - - for(y=i1,i2=0,x=x0+dx/2;xp,x0+dx/2,i1,dy,cs,0,DO); - if( i>i2 ) { i2=i; } - } if(i2p,x0+5*dx/8,i1,dy,cs,0,UP); - i =y+1-loop(box1->p,x0+4*dx/8,i1,dy,cs,0,UP); if(iy0+ dy/4+t1/2) Break; // highest - - for(y=i1;yp,cs,1) == 1 ) break; - if( y-i1p,cs) < 1 ) Break; // ~L - if (loop(box1->p,x0,y0+3*dy/4,dx,cs,0,RI)>dx/16) - if( num_cross(x0+dx/2,x1,i3 ,y1,box1->p,cs) < 1 - && num_cross(x0+dx/2,x1,y1-dy/4,y1,box1->p,cs) < 1 ) Break; // ~r - - i=1; - for(x=dx/2;x=cs - && getpixel(bp,x+1,y )< cs - && getpixel(bp,x+1,y-1)< cs - && getpixel(bp,x ,y-1)< cs ) { i=0;break; } - } - if(!i) ad=95*ad/100; // ~G - - i=loop(bp,0,dy/2,dx,cs,0,RI); - for(y=0;y=dy/4;y--){ - x =loop(bp,0,y,dx,cs,0,RI); - x+=loop(bp,x,y,dx,cs,1,RI); if(x>i5) i5=x; - i =loop(bp,x,y,dx,cs,0,RI); if(ii4+dx/32 ) break; // unusual for c, more a bad e? - } if( y>=dy/4 ) Break; - - if( !hchar ){ // test for e where the middle line is partly removed - x= loop(bp,0,dy/2,dx,cs,0,RI); - x=x +loop(bp,x,dy/2,dx,cs,1,RI); - y=dy/2-loop(bp,x,dy/2,dy,cs,0,UP)-1; - i=x +loop(bp,x,y,dx,cs,1,RI); - i=i +loop(bp,i,y,dx,cs,0,RI); - if( num_cross(x ,x ,1,dy/2,bp,cs) > 1 - || num_cross(x+1,x+1,1,dy/2,bp,cs) > 1 ) - if( num_cross(i-1,i-1,1,dy/2,bp,cs) > 1 - || num_cross(i ,i ,1,dy/2,bp,cs) > 1 ) Break; // ~bad e - } - if( dy>16 && dy>3*dx && hchar ){ // ~[ - x= loop(bp,0, dy/16,dx,cs,0,RI); - x=+loop(bp,0,dy-1-dy/16,dx,cs,0,RI); - i= loop(bp,0, dy/2 ,dx,cs,0,RI)*2; - if( i>=x ) - if( num_cross(0,dx-1,dy/4,dy/4,bp,cs) < 2 ) Break; - - } - if( get_bw(x0,x0,y0 ,y1 ,box1->p,cs,2) != 2 - && get_bw(x0,x1,y0 ,y0 ,box1->p,cs,2) != 2 - && get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) != 2 - && get_bw(x1,x1,y0+1,y1-1,box1->p,cs,1) != 1 ) Break; /* ~[ */ - - x =loop(bp, 0,dy/2,dx,cs,0,RI); - i =loop(bp,dx-1,dy/2,dx,cs,0,LE); - if( (i7 ) - if( loop(bp, 0,7*dy/8,dx,cs,0,RI) > x+dx/8 - && loop(bp, 0, dy/8,dx,cs,0,RI) > x+dx/8 - && loop(bp,dx-1,dy-1-dy/ 8,dx,cs,0,LE) - > loop(bp,dx-1,dy-1-dy/16,dx,cs,0,LE) - && loop(bp,dx-1, dy/ 8,dx,cs,0,LE) - > loop(bp,dx-1, dy/16,dx,cs,0,LE) ) Break; // ~( - -// printf(" hchar=%d i1=%d i2=%d %d\n",hchar,i1-y0,i2-y0,9*dy/16); - // ~G without characteristic crotchet - if (hchar && dy>15 && dx>7 && i2-y0<9*dy/16 && i1-y0<=dy/4) - if ( loop(bp,5*dx/8,i2-y0,dy,cs,0,DO) > 2*dy/8 ){ - Setac(box1,'G',90); - Break; - } - - if (hchar){ - i=1; - for(x=dx/2;x=cs - && getpixel(bp,x+1,y )< cs - && getpixel(bp,x+1,y-1)< cs - && getpixel(bp,x ,y-1)< cs ) { i=0;break; } - } - if (i) ad=98*ad/100; // ~( - if (dy>2*dx) ad=99*ad/100; - } - if( loop(bp,dx-1,dy/2,dx,cs,0,LE) < 6*dx/8 ) ad=98*ad/100; - - i= loop(bp,dx-1,dy/16,dx,cs,0,LE); - j= loop(bp,dx/2,0 ,dy,cs,0,DO); - if (i>=dx/2 && j>dy/8 && j>2 && j=3*dx && dy>12) ad=99*ad/100; // ( - i= loop(bp,dx-1,dy-1,dy,cs,0,UP); - j= loop(bp,dx/2,dy-1,dy,cs,0,UP); - if (i==0 && j>dy/8) ad=95*ad/100; // < - i= loop(bp,dx-1, 0,dy,cs,0,DO); - j= loop(bp,dx/2, 0,dy,cs,0,DO); - if (i==0 && j>dy/8) ad=95*ad/100; // < - if (loop(bp,0,dy-1-dy/8,dx,cs,0,RI)>= 3*dx/4) ad=98*ad/100; // < - if (loop(bp,0,dy-1-dy/8,dx,cs,0,RI)>=(dx+1)/2) ad=98*ad/100; // < - if (loop(bp,0, dy/8,dx,cs,0,RI)>=dx/2) ad=98*ad/100; // < - - if (gchar) ad=98*ad/100; // could happen for 5x7 font - bc=((hchar)?'C':'c'); - Setac(box1,bc,ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_lL(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i0,i1,i2,i3,i4,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test L --------------------------------------------------- - for(ad=d=100;dx>2 && dy>4;){ // min 3x4 - DBG( wchar_t c_ask='L'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - i=loop(bp,dx-1,dy/2,dx,cs,0,LE); - if (i<3 && dy>8) {Break;} - if (ip,x0 ,y,dx,cs,0,RI); - j=loop(box1->p,x0+j,y,dx,cs,1,RI); if( j>i ){ i=j;i1=y; } - } if( i<3*dx/4 ) Break; i1=i; // length of horizontal line - // line thickness (i2) - i=loop(box1->p,x0 ,y0+dy/2,dx,cs,0,RI); if( i>dx/2 ) Break; - j=loop(box1->p,x0+i,y0+dy/2,dx,cs,1,RI); if( i+j>dx/2 ) Break; i2=j; - if (loop(bp,dx-1, 0,dx,cs,0,LE)dx/2 - && loop(bp, 0,5*dy/8,dx,cs,0,RI)p,x0 ,y,dx,cs,0,RI); - if ( j>(dx+2)/4+(y1-dy/4-y)*dx/2/dy ) { i=0; break; } - x=loop(box1->p,x0+j,y,dx,cs,1,RI); - if( ((x>i2+1 || 4*x<3*i2) && y>y0+dy/8) || 4*x>3*i1 ) i=0; - } if( !i ) Break; - if( num_cross(0, dx-1-dx/8, dy-1-dy/2, dy-1-dy/2,bp,cs) != 1 ) Break; - if( num_cross(0, dx-1 , dy/3 , dy/3,bp,cs) != 1 ) Break; - if( num_cross(0, dx-1 , dy/8 , dy/8,bp,cs) != 1 ) Break; - if (loop(bp,0,dy-1,dx,cs,0,RI) - -loop(bp,0,dy-3,dx,cs,0,RI)>1+dx/16) ad=96*ad/100; // ~c - if (loop(box1->p,x0+dx/4,y1,dy,cs,0,UP)>1+dy/16) ad=99*ad/100; // ~4 - - if ( gchar) ad=98*ad/100; - if (!hchar) ad=99*ad/100; - if (5*dx<2*dy && loop(box1->p,x0,y1,dx,cs,0,RI)>dx/4) ad=99*ad/100; // ~l - Setac(box1,'L',ad); - break; - } - // --- test l --------------------------------------------------- - // recognize a "l" is a never ending problem, because there are lots of - // variants and the char is not very unique (under construction) - // --- test italic l --------------------------------------------------- - // --- test l ~italic (set flag-italic) -------------------------------- - // if unsure d should be multiplied by 80..90% - for(ad=d=100; dy>dx && dy>5;){ // min 3x4 - DBG( wchar_t c_ask='l'; ) - if( box1->dots>0 ) Break; - if( num_cross(0, dx-1,dy/2,dy/2,bp,cs) != 1 - || num_cross(0, dx-1,dy/4,dy/4,bp,cs) != 1 ) Break; - // mesure thickness - for(i1=0,i2=dx,y=dy/4;yi1 ) { i1=j; } // thickest - if( j2*i2 ) Break; - if(box1->m3 && dy<=box1->m3-box1->m2) ad=94*ad/100; - if( box1->m2-box1->m1>1 && y0>=box1->m2 ) ad=94*ad/100; - for(i0=0,i3=0,y=0;yi3 ) { i3=j; } // widest space - j = loop(bp,j,y,dx,cs,1,RI); - if( j>i0 ) { i0=j;i3=0; } // thickest - } - if ( i0>4*i2 || 3*i3>2*dx) - if ( loop(bp,dx-1,dy-1,dx,cs,0,LE)>3*dx/8 - || loop(bp, 0,dy-1,dx,cs,0,RI)>3*dx/8) Break; // ~7 - - // detect serifs - x =loop(bp,0, 0,dx,cs,0,RI); - i3=loop(bp,x, 0,dx,cs,0,RI); - x =loop(bp,0, 1,dx,cs,0,RI); - x =loop(bp,x, 1,dx,cs,0,RI); if(x>i3) i3=x; - x =loop(bp,0,dy-1,dx,cs,0,RI); - i4=loop(bp,x,dy-1,dx,cs,0,RI); - x =loop(bp,0,dy-2,dx,cs,0,RI); - x =loop(bp,x,dy-2,dx,cs,0,RI); if(x>i4) i4=x; - if( i3>i1+dx/8+1 && i4>i1+dx/8+1 ) Break; // ~I - - for(i=dx,j=0,y=1;yi+1) break; i=x; - if( num_cross(0,dx-1,y ,y ,bp,cs)==2 - && num_cross(0,dx-1,y+1+dy/32,y+1+dy/32,bp,cs)==2 ) j=1; - } if ( y3) - if( get_bw(dx-1-dx/8,dx-1,0,dy/6,bp,cs,1) != 1 ) - if( get_bw(dx-1-dx/8,dx-1,0,dy/2,bp,cs,1) == 1 ) Break; - - if( get_bw(dx-1-dx/8,dx-1,dy/4,dy/3,bp,cs,1) != 1 ) // large I ??? - if( get_bw(0 ,dx/8,dy/4,dy/3,bp,cs,1) != 1 ) - if( get_bw(dx-1-dx/8,dx-1,0 ,dy/8,bp,cs,1) == 1 ) - if( get_bw(0 ,dx/8,0 ,dy/8,bp,cs,1) == 1 ) ad=ad*97/100; - if( get_bw(dx-1-dx/8,dx-1,dy/2,dy-1,bp,cs,1) != 1 ) // r ??? - if( get_bw(0 ,dx/8,dy/2,dy-1,bp,cs,1) == 1 ) - if( get_bw(dx-1-dx/8,dx-1,0 ,dy/3,bp,cs,1) == 1 ) - if( get_bw(0 ,dx/8,0 ,dy/3,bp,cs,1) == 1 ) Break; - - for( y=1;y<12*dy/16;y++ ) - if( num_cross(0, dx-1, y , y ,bp,cs) != 1 // sure ? - && num_cross(0, dx-1, y-1, y-1,bp,cs) != 1 ) break; - if( y<12*dy/16 ) Break; - - if(dx>3){ - for( y=dy/2;yy-1-5*dy/16;y>=dy/5;y--){ // rechts abfallende Kante/Knick? - i=loop(bp,bp->x-1,y,x1-x0,cs,0,LE); - if( i-2-dx/16>=x ) break; - if( i=dy/5 ) Break; - - // test ob linke Kante gerade - for(x=0,y=bp->y-1-dy/5;y>=dy/5;y--){ // rechts abfallende Kante/Knick? - i=loop(bp,0,y,x1-x0,cs,0,RI); - if( i+2+dx/16x ) x=i; - } - if (y>=dy/5 ) Break; - if (box1->m4 && y1m4) - if ( get_bw(x0,x1,y1+1,box1->m4+dy/8,box1->p,cs,1) == 1 ) - ad=ad*97/100; // unsure !l| - i=loop(bp,dx-1,dy/16,dx,cs,0,LE); - j=loop(bp,dx-1,dy/2 ,dx,cs,0,LE); - if( i>3 && j>3 ) - if( get_bw(dx-1-i/2,dx-1-i/2,0,dy/2,bp,cs,1) == 1 ) Break; // ~t - - for(y=5*dy/8;y8 - && loop(bp, 0,3*dy/4,dx,cs,0,RI)>=dx/4 - && loop(bp, 0,7*dy/8,dx,cs,0,RI)<=dx/8 - && loop(bp,dx-1,3*dy/4,dx,cs,0,LE)<=dx/8 - && loop(bp,dx-1,7*dy/8,dx,cs,0,LE)<=dx/8 ) Break; // ~J - - if ( 2*i3>5*i1 ) // hmm \tt l can look very similar to 7 - if ( loop(bp,0,dy/4,dx,cs,0,RI)>dx/2 - && get_bw(0,dx/8,0,dy/4,bp,cs,1) == 1 ) Break; // ~7 - - if ( loop(bp,dx-1,dy/2,dx,cs,0,LE)>dx/2 - && get_bw(3*dx/4,dx-1,3*dy/4,dy-1,bp,cs,1) == 1) { - if (loop(bp,0,dy-1,dx,cs,0,RI)2*dy) ad=99*ad/100; // ~L - if(5*dx>3*dy) ad=99*ad/100; // ~L - } - if(!hchar){ // right part (bow) of h is never a l - if( get_bw(dx/4,dx/4, 0,dy/4,bp,cs,1) == 1 - && get_bw(dx/4,dx/4,dy/2,dy-1,bp,cs,1) == 0 ) Break; - } - if( dx>3 && dy>3*dx ) - if( loop(bp,dx/4,dy-1 ,dy,cs,0,UP)< dy/4 - && loop(bp, 0,dy-1-dy/8,dx,cs,0,RI)>=dx/2 - && loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)<=dx/4 ){ - ad=98*ad/100; // ~] - if ( loop(bp,dx-1,dy/2,dx,cs,0,LE)==0 ) Break; - } - - for(x=0;xi ) break; - } - if( x>=loop(bp,0,y+1,dx,cs,0,RI) ) - if( loop(bp,0 ,0,dy,cs,0,DO)>1 ) - if( loop(bp,0 ,0,dy,cs,0,DO) - - loop(bp,dx/16+1,0,dy,cs,0,DO) < dx/16+1 ) Break; // ~1 Jul00,Nov00 - if( num_cross(0,dx/2,y-1,y-1,bp,cs)==2 ) Break; // ~1 - } - if(dx<8 && dy<12){ // screen font - i= loop(bp,0,0,dy,cs,0,DO); - if( loop(bp,dx/2,1,dy,cs,1,DO)>=dy-2 - && loop(bp,0,dy/2,dx,cs,0,RI)>=2 - && i>1 && ip,cs,2) != 2 - && get_bw(x0,x1,y0 ,y0 ,box1->p,cs,2) != 2 - && get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) != 2 - && get_bw(x0,x0+dx/4,y0+1+dy/16,y1-1-dy/16,box1->p,cs,1) != 1 ) Break; /* ~] */ - i=loop(bp,dx-1,dy/2,dx,cs,0,LE); - if( loop(bp, 0,dy/2,dx,cs,0,RI)>=dx/2 - && (ip,cs,2) != 2 - && get_bw(x0,x1,y0 ,y0 ,box1->p,cs,2) != 2 - && get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) != 2 - && get_bw(x1-dx/4,x1,y0+1+dy/16,y1-1-dy/16,box1->p,cs,1) != 1 ) Break; /* ~[ */ - - x =loop(bp, 0,dy/2,dx,cs,0,RI); // konvex/konkav? ~() - i =loop(bp,dx-1,dy/2,dx,cs,0,LE); - if( loop(bp, 0,7*dy/8,dx,cs,0,RI) > x+dx/8 - && loop(bp, 0, dy/8,dx,cs,0,RI) > x+dx/8 - && loop(bp,dx-1,7*dy/8,dx,cs,0,LE) < i-dx/8 - && loop(bp,dx-1, dy/8,dx,cs,0,LE) < i-dx/8 ) Break; // ~( - if( loop(bp, 0,7*dy/8,dx,cs,0,RI) < x-dx/8 - && loop(bp, 0, dy/8,dx,cs,0,RI) < x-dx/8 - && loop(bp,dx-1,7*dy/8,dx,cs,0,LE) > i+dx/8 - && loop(bp,dx-1, dy/8,dx,cs,0,LE) > i+dx/8 ) Break; // ~) - - i= loop(bp, 0, 0,dy,cs,0,DO); // horizontal line? - if(dy>=12 && i>dy/8 && iloop(bp,dx-1, i,dx,cs,0,LE) - || loop(bp,dx-1,3*dy/16,dx,cs,0,LE)-dx/8 - >loop(bp,dx-1, i+1,dx,cs,0,LE) ) - if( loop(bp,dx-1,8*dy/16,dx,cs,0,LE)-dx/8 - >loop(bp,dx-1, i,dx,cs,0,LE) - || loop(bp,dx-1,8*dy/16,dx,cs,0,LE)-dx/8 - >loop(bp,dx-1, i+1,dx,cs,0,LE) ) - if( loop(bp, 0,3*dy/16,dx,cs,0,RI)-dx/8 - >loop(bp, 0, i,dx,cs,0,RI) - || loop(bp, 0,3*dy/16,dx,cs,0,RI)-dx/8 - >loop(bp, 0, i+1,dx,cs,0,RI) ) - if( loop(bp, 0,8*dy/16,dx,cs,0,RI)-dx/8 - >loop(bp, 0, i,dx,cs,0,RI) - || loop(bp, 0,8*dy/16,dx,cs,0,RI)-dx/8 - >loop(bp, 0, i+1,dx,cs,0,RI) ) Break; // ~t - if( loop(bp, 0,i-1,dx,cs,0,RI)>1 && dx<6 ) Break; // ~t - if( loop(bp, 0,8*dy/16,dx,cs,0,RI)>dx/8 - && loop(bp, 0, i,dx,cs,1,RI)>=dx-1 - && loop(bp,dx-1,8*dy/16,dx,cs,0,LE)>dx/8 - && loop(bp,dx-1, i-1,dx,cs,0,LE)>dx/8 ) Break; // ~t - } -// if( vertical_detected && dx>5 ) - if( loop(bp,0, 1,dx,cs,0,RI)>=dx/2 - && ( loop(bp,0,dy-2,dx,cs,0,RI)<=dx/8 - || loop(bp,0,dy-1,dx,cs,0,RI)<=dx/8 ) ) - if( ( loop(bp,dx-1, 0,dx,cs,0,LE)<=dx/8 - || loop(bp,dx-1, 1,dx,cs,0,LE)<=dx/8 ) - && loop(bp,dx-1,dy-2,dx,cs,0,LE)>=dx/2 ) ad=98*ad/100; // ~/ - - if( get_bw(x0,x1,y0,y1,box1->p,cs,2) == 0 ) ad=99*ad/100; - - if (!hchar || loop(bp,0,dy/4,dx,cs,0,RI)>dx/2){ // ~z - i=loop(bp,0,dy/16 ,dx,cs,0,RI); - i=loop(bp,i,dy/16 ,dx,cs,1,RI); j=i; - i=loop(bp,0,dy/16+1,dx,cs,0,RI); - i=loop(bp,i,dy/16+1,dx,cs,1,RI); if (i>j) j=i; - i=loop(bp,0,dy/16+2,dx,cs,0,RI); - i=loop(bp,i,dy/16+2,dx,cs,1,RI); if (i>j) j=i; - if (j*4>=dx*3) ad=98*ad/100; // ~z - if (j*8>=dx*7) ad=96*ad/100; // ~z - } - - if( get_bw(x0,x0,y1,y1,box1->p,cs,2) == 0 ) ad=99*ad/100; - if( get_bw(x1,x1,y1,y1,box1->p,cs,2) == 0 ) ad=99*ad/100; - if (ad==100) ad--; /* I have to fix that: - .@@@@.<- - @@..@@ - ....@@ - ....@@< - ...@@. - ..@@@. - ..@@.. - .@@... - @@.... - @@@@@@<- - */ - if(!hchar) ad=ad*99/100; - if( gchar) ad=ad*99/100; - Setac(box1,'l',ad); -// if( i<100 ) Break; ???? -// if( loop(bp,0, 1,dx,cs,0,RI)<=dx/8 -// && loop(bp,0,dy/2,dx,cs,0,RI)<=dx/8 -// && loop(bp,0,dy-2,dx,cs,0,RI)<=dx/8 ) vertical_detected=1; - break; - } - return box1->c; -} - -static wchar_t ocr0_oO(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - wchar_t bc=UNKNOWN; - - // --- test o,O --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='o'; ) - if (sdata->holes.num !=1 ) Break; - if( get_bw(x0 , x0+dx/2,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/2 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y1-dy/2 , y1, box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y0+dy/2 , y1-dy/3,box1->p,cs,1) != 0 ) Break; - if (sdata->holes.hole[0].y0 > dy/3 - || sdata->holes.hole[0].y1 < dy-1-dy/3) Break; - - if( num_cross(x0+dx/2 ,x0+dx/2 ,y0, y1 ,box1->p,cs) != 2 - && num_cross(x0+dx/2+1,x0+dx/2+1,y0, y1 ,box1->p,cs) != 2 ) Break; - if( num_cross(x0+dx/3,x1-dx/4,y0 , y0 ,box1->p,cs) != 1 ) // AND - if( num_cross(x0+dx/3,x1-dx/4,y0+1 , y0+1,box1->p,cs) != 1 ) Break; - if( num_cross(x0+dx/4,x1-dx/3,y1 , y1 ,box1->p,cs) != 1 ) // against "rauschen" - if( num_cross(x0+dx/4,x1-dx/3,y1-1 , y1-1,box1->p,cs) != 1 ) Break; - if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - - if( loop(bp,0 ,0 ,x1-x0,cs,0,RI)<= - loop(bp,0 ,2 ,x1-x0,cs,0,RI) ) Break; - - x=loop(bp,dx-1,dy-1-dy/3,x1-x0,cs,0,LE); // should be minimum - for( y=dy-1-dy/3;ydx/8 ) - if( loop(bp,0 , dy/16,dx,cs,0,RI)dx/8 ) - if( loop(bp,0 ,dy-1-dy/16,dx,cs,0,RI)p,cs,1) == 0 - && get_bw(x1-dx/32,x1,y1-dy/32,y1,box1->p,cs,1) == 0 -// && ( get_bw(x0,x0+dx/32,y0,y0+dy/32,box1->p,cs,1) == 1 - && ( get_bw(0,dx/32,0,dy/32,bp,cs,1) == 1 - || get_bw(x0,x0+dx/32,y1-dy/32,y1,box1->p,cs,1) == 1 ) ) Break; // ~D - - // search lowest inner white point - for(y=dy,j=x=0;x 1 ) ad=99*ad/100; // ~a \it a - for(y=0;y 2 ) ad=98*ad/100; // ~a \it a - if (loop(bp,dx-1,dy-1,x1-x0,cs,0,LE)dy/8 - || num_cross(0,dx-1, 0, 0,bp,cs) > 1 - || num_cross(0,dx-1,dy-1,dy-1,bp,cs) > 1 - ) ad=98*ad/100; // ~bq - - if( hchar && 2*y0m1+box1->m2 ) i=1; else i=0; - if (gchar) ad=99*ad/100; - bc='o'; - if( i ){ bc='O'; } - if ( bc=='O' && ad>99) ad=99; /* we can never 100% sure, 0O */ - Setac(box1,bc,ad); - if (bc=='O') Setac(box1,'0',ad); - if (bc=='o') Setac(box1,'0',98*ad/100); - break; - } - return box1->c; -} - -static wchar_t ocr0_pP(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i1,i2,i3,i4,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - wchar_t bc=UNKNOWN; - - // --- test pP --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='p'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if( get_bw(0 , dx/2,3*dy/4,3*dy/4,bp,cs,1) != 1 ) Break; - if( get_bw(0 , dx/2, dy/2, dy/2,bp,cs,1) < 1 ) Break; - if( get_bw(dx/4, dx-1, dy/4, dy/4,bp,cs,1) != 1 ) Break; - i= loop(bp,dx-1,3*dy/4,dx,cs,0,LE); if (ip,cs) != 2 ) - if( num_cross(x0+dx/2 ,x0+dx/2 , y0, y1-3*dy/16,box1->p,cs) != 2 ) - if( num_cross(x0+dx/2+1,x0+dx/2+1, y0, y1-3*dy/16,box1->p,cs) != 2 ) Break; - if( num_cross(0,dx-1,7*dy/8 ,7*dy/8 ,bp,cs) != 1 ) - if( num_cross(0,dx-1,7*dy/8-1,7*dy/8-1,bp,cs) != 1 ) Break; - if( num_cross(0,dx-1, dy/4 , dy/4 ,bp,cs) != 2 ) - if( num_cross(0,dx-1, dy/4-1, dy/4-1,bp,cs) != 3 ) // \it p with nice kurve - if( num_cross(0,dx-1, dy/4 , dy/4 ,bp,cs) != 2 ) - if( num_cross(0,dx-1, dy/4+1, dy/4+1,bp,cs) != 2 ) Break; - - i= loop(bp,0,dy/2,dx,cs,0,RI); if(i<1) i++; - if( num_cross(i-1,dx-1, dy/4 , dy/4 ,bp,cs) != 2 ) - if( num_cross(i-1,dx-1, dy/4+1, dy/4+1,bp,cs) != 2 ) Break; - - i1= loop(bp, 0,3*dy/8,dx,cs,0,RI); if (i1>=dx/2) ad=90*ad/100; - i2=i1+loop(bp,i1,3*dy/8,dx,cs,1,RI); // upper x-position of v line - i3= loop(bp, 0,7*dy/8,dx,cs,0,RI); - i4=i3+loop(bp,i3,7*dy/8,dx,cs,1,RI); // lower x-position of v line - // out_x(box1);printf(" p:"); - for ( y=dy/8; y<7*dy/8; y++ ){ - x=i2+ (8*y-3*dy)*(i4-i2)/(4*dy); // right limit of line - i= loop(bp,0,y,dx,cs,0,RI); if(i>x+dx/16) break; - } if ( y<7*dy/8 ) Break; - for ( x=0,j=y=dy/3; yx ) { x=i; j=y; } if(x>dx/2) break; - } if ( x=dx) Break; - if( get_bw(3*dx/4,dx-1, y , dy-1,bp,cs,1) == 1 ) Break; - - i=num_hole (x0,x1,y0,y1-dy/5,box1->p,cs,NULL); - // j=num_hole (x0,x1,y0,y1 ,box1->p,cs,NULL); - j=sdata->holes.num; - - if (j!=1 && dx< 8) ad=96*ad/100; - if (j!=1 && dx>=8) ad=98*ad/100; - if (i==0 && j==0) ad=90*ad/100; /* some times there is a small gap */ - if (i>1 || j>1 || j>i) Break; - - // check for serif F - i= loop(bp,bp->x-1, bp->y/4, dx ,cs,0,LE); - i=i+loop(bp,bp->x-1-i,bp->y/4, dx ,cs,1,LE); - j= loop(bp,bp->x-1-i,bp->y/4,3*dy/4,cs,0,DO); - if (j>dy/2) ad=80*ad/100; // its an serif-F - - if( ((!hchar) && (!gchar)) || (hchar && gchar)) ad=95*ad/100; - bc='p'; - if( hchar && ((!gchar) || dy<14)) bc='P'; - if ( hchar && gchar) ad=98*ad/100; // \ss sz - if ((!hchar) && !gchar) ad=98*ad/100; - - Setac(box1,bc,ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_qQ(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad; /* tmp-vars */ - - // --- test Q --------------------------------------------------- - for(ad=d=100;dx>2 && dy>4;){ // min 3x4 - DBG( wchar_t c_ask='Q'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if( get_bw(x0 ,x0+dx/3,y0+dy/3,y0+dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/3,x1 ,y0+dy/3,y0+dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2,x0+dx/2,y1-dy/3,y1, box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2,x0+dx/2,y0 ,y0+dy/4,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2,x0+dx/2,y0+dy/3,y1-dy/2,box1->p,cs,1) == 1 ) Break; - if( get_bw(x1 ,x1 ,y0 ,y0 ,box1->p,cs,1) == 1 ) Break; //alpha - if( num_cross(x0+dx/2,x0+dx/2,y0 , y1 ,box1->p,cs) < 2 ) Break; - if( num_cross(x0+dx/5,x1-dx/5,y0 , y0 ,box1->p,cs) != 1 ) // AND - if( num_cross(x0+dx/5,x1-dx/5,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; - if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - if( get_bw(x1 ,x1 ,y1-dy/8 , y1 ,box1->p,cs,1) == 0 ) - if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - // i=num_hole(x0,x1,y0,y1,box1->p,cs,NULL); - i=sdata->holes.num; - if(!i) Break; - if( i!=1 && (i!=2 || num_hole(x0,x1,y0+dy/2,y1,box1->p,cs,NULL)!=1) ) Break; - x=x1;y=y1; - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,LE,ST); if( xp,&x,&y,x0,x1,y0,y1,cs,ST,LE); - if( x 5*dx/8 ) Break; // ~4 Okt00 - - x= loop(bp,dx-1,3*dy/8,dy,cs,0,LE); if( x>dx/4 ) Break; - if( loop(bp,dx-1-x,0 ,dy,cs,0,DO) - <= loop(bp,dx-2-x,0 ,dy,cs,0,DO) ) Break; // 4 - - if( loop(bp,dx-1,dy-2,dx,cs,0,LE) - <= loop(bp,dx-1,dy/2,dx,cs,0,LE) ) - if( loop(bp, 1,dy-1,dy,cs,0,UP) - <= loop(bp,dx/2,dy-1,dy,cs,0,UP) ) - if( loop(bp, 0,dy-2,dx,cs,0,RI)>dx/2 ) - if( loop(bp, 0, 0,dx,cs,0,RI)>dx/2 ) Break; // 4 - - if( loop(bp,dx-1,3*dy/4,dx,cs,0,LE) - + loop(bp, 0,3*dy/4,dx,cs,0,RI) - < loop(bp,dx-1,2*dy/4,dx,cs,0,LE) - + loop(bp, 0,2*dy/4,dx,cs,0,RI) ) ad=94*ad/100; // 4 - if( loop(bp,0 ,3*dy/4,dx,cs,1,RI) >= dx ) ad=94*ad/100; // 4 - - - if( loop(bp,dx-1,dy/3,dx,cs,0,LE)> dx/4 ) Break; - j=loop(bp,dx/2,dy-1,dy,cs,0,UP); - if (j>1 && j>dy/8) { - if( get_bw(0,dx/2,dy-1-j/2,dy-1-j/2,bp,cs,1) == 1 ) { // ~RA - if (j<5) ad=95*ad/100; - else Break; - } - } - - // italic a - for(i=0,y=0;y 2 ) i++; if(i>dy/8) Break; // ~a \it a - if (i>0) ad=99*ad/100; - - // ~o look at the lower right side for falling line - for(j=x=0,y=dy/2;yx){ x=i; } - if (x-i>j) j=x-i; - if( j>dx/16 ) Break; // falling line detected - } - if (j==0) Break; // no falling line => no Q - if (j<=dx/16) ad=98*ad/100; - if(y1<=box1->m3) ad=98*ad/100; // ~q no underlength! rare - if(!hchar) ad=96*ad/100; - Setac(box1,'Q',ad); - break; - } - // --- test q --------------------------------------------------- - for(ad=d=100;dx>2 && dy>3;){ // min 3x4 - DBG( wchar_t c_ask='q'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - for ( y=y0; 2*y<=y0+y1; y++ ){ // detect ring - if( num_cross(x0,x1, y, y,box1->p,cs) == 2 ) Break; - } if (2*y>y0+y1) Break; /* < */ - for ( y=(y0+y1)/2; y<=y1; y++ ){ // detect vert line - if( num_cross(x0, x1, y, y,box1->p,cs) == 1 - && num_cross(x0,x0+dx/2, y, y,box1->p,cs) == 0 ) Break; - } if (y>y1) Break; /* O (y==y1 for 4x6font-q) */ - for ( x=0,j=y=y0+dy/3; y<=y1-dy/8; y++ ){ // detect baseline - i=loop(box1->p,x0,y,dx,cs,0,RI); - if ( i>x ) { x=i; j=y; } - if ( x>dx/2 ) break; - } if ( x=dx) Break; - if (y1-j+1p,cs) != 0 ) ad=96*ad/100; // ~g - if( loop(box1->p,x0+dx/16,j,dy,cs,0,UP)<1+dy/16 ){ - ad=97*ad/100; - if (hchar || !gchar) Break; // 4 - } - if( loop(box1->p,x0+dx/16,j-dy/32-1,dy,cs,1,RI)>=dx-dx/8 - || loop(box1->p,x0+dx/16,j-dy/16-1,dy,cs,1,RI)>=dx-dx/8 ){ - ad=96*ad/100; // 4 - } - if( get_bw(x1-dx/3, x1, y0+dy/3, y0+dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0, x0+dx/3, y0+dy/3, y0+dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0, x0+dx/4, y1-dy/8, y1-dy/9,box1->p,cs,1) == 1 ) Break; - if( get_bw(x0, x0+dx/4, y1-dy/5, y1-dy/9,box1->p,cs,1) == 1 ) ad=99*ad/100; - if( num_cross(x0+dx/2,x0+dx/2, y0, j ,box1->p,cs) != 2 ) Break; - // if( num_hole (x0 ,x1 , y0, y1 ,box1->p,cs,NULL) != 1 ) - if (sdata->holes.num != 1) - { if (dx<16) ad=98*ad/100; else Break; } - if( num_hole (x0 ,x1 , y0, j ,box1->p,cs,NULL) != 1 ) - { if (dx<16) ad=98*ad/100; else Break; } - // ~\it g - if( loop(bp,0,dy-1-dy/4,dx,cs,0,RI)>5*dx/8 - && get_bw(dx/4,dx/4,dy-1-dy/4,dy-1,bp,cs,1)==1 ) Break; // ~\it g - // what about unsure m1-m4? - if(!gchar){ ad=ad*99/100; } // ~4 - if( hchar){ ad=ad*99/100; } // ~49 - Setac(box1,'q',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_iIjJ(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i1,i2,i3,i4,i5,hchar=sdata->hchar,gchar=sdata->gchar, - ax,ay,bx,by,cx,cy,ex,ey, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ad,ya,yb,yc,yd,ye,yf,xa,xb, /* tmp-vars */ - (*aa)[4]=sdata->aa; /* the for line ends, (x,y,dist^2,vector_idx) */ - - // --- test i --------------------------------------------------- - // if(box1->dots==1) // what about \it neighbouring ij - for(ad=d=100;dy>3 && dx>0;){ // min 3x4 without dot - DBG( wchar_t c_ask='i'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - // ToDo: ':' check that high of dot is smaller than the vert. line! - /* - * o <== ya - * o - * - * ooo <== yb - * o - * o - * o - * ooo - */ - ya=y0; - if (box1->dots!=1) ad=98*ad/100; - while(dy>3*dx && box1->m2){ // test for vertical i without detected dot - i= loop(bp,dx/2,dy-1 ,dy,cs,0,UP); - if (dy-1-im3-2) break; - i+=loop(bp,dx/2,dy-1-i,dy,cs,1,UP); - // distance upper end to m2 > (m2-m1)/3 - if (3*abs(dy-1-i-box1->m2)>box1->m2-box1->m1) break; - if( get_bw(x0,x1,y0,(box1->m1+box1->m2)/2,box1->p,cs,1) == 1 ) - if( get_bw(x0,x1,y1-i ,y1-i ,box1->p,cs,1) == 0 - || get_bw(x0,x1,y1-i-1,y1-i-1,box1->p,cs,1) == 0 - || get_bw(x0,x1,y1-i-2,y1-i-2,box1->p,cs,1) == 0 ) - { - Setac(box1,'i',ad); - return 'i'; /* beleave me, thats an "i"! */ - } break; - } -// if( box1->dots!=1 ) Break; - if( box1->m2 && 2*y0>=box1->m2+box1->m1 ) ya=box1->m1; - -// out_x(box1); - for (y=ya;2*yp,cs,1) == 1 ) break; - if (2*y>=ya+y1) Break; // hmm, gap only, no dot? - ya=y; - if (box1->m2 && ya>box1->m2+2) Break; - for ( ;2*yp,cs,1) != 1 ) break; - if (2*y>=ya+y1) Break; // hmm no gap - for ( ;2*yp,cs,1) == 1 ) break; - yb=y; - if (5*yb>=3*ya+2*y1) ad=99*ad/100; // large gap - if (2*yb>= ya+ y1) ad=97*ad/100; // very large gap, ~: - if (5*yb>=2*ya+3*y1) Break; // huge gap, ~: - if (loop(bp,dx-1,y+(y1-ya+1)/32,dx,cs,0,LE)>dx/2) // unusual (right part of ouml) - ad=95*ad/100; - - // printf(" num_cross dy/2=%d %d\n",dy/2, num_cross(0,dx-1,dy/2,dy/2,bp,cs)); - // printf(" dots=%d\n",box1->dots); out_x(box1); - // \sl ~f. ! - for (y=y1;y>ya;y--) if( get_bw(x0,x1,y,y,box1->p,cs,1) != 1 ) break; - if (y>(ya+3*y1)/4) Break; - if (y>(ya+2*y1)/3) ad=96*ad/100; - - y=(y1-yb+1)/2+yb-y0; /* only one vertical line, italic i is more an tall S */ - if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) Break; - for(;y<=y1-y0;y++){ if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) break; } yc=y; - for(;y<=y1-y0;y++){ if( num_cross(0,dx-1,y,y,bp,cs) != 2 ) break; } yd=y; - if( yd<3*(y1-yb+1)/4+yb-y0 ) Break; - y=(y1-yb+1)/2+yb-y0; - for(;y>0;y--){ if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) break; } ye=y; - for(;y>0;y--){ if( num_cross(0,dx-1,y,y,bp,cs) != 2 ) break; } yf=y; - if( yf>(y1-yb+1)/4+yb-y0 ) Break; - if(yd>yc+2){ - xa=loop(bp, 0,yc-1,dx,cs,0,RI); - xb=loop(bp,dx-1,yc-1,dx,cs,0,LE); - if( - xb-loop(bp,dx-1,yc,dx,cs,0,LE) /* Dec00 */ - > xa-loop(bp, 0,yc,dx,cs,0,RI) ){ - y= loop(bp,dx-xb,yc-1,dy,cs,0,DO); - if(y>0){ - i=loop(bp,dx-xb-1,yc-1+y-1,dy,cs,0,DO); - if( i>0 ) y+=i-1; - } - if( yc-1+y < yd-1 ) Break; - } else { - y= loop(bp,11*xa/16,yc-1,dy,cs,0,DO); - if( yc-1+y < yd-2 ) Break; - } - } - if(yf0 ) y+=i-1; - if( ye+1-y > yf+1 ) Break; - } - if( 2*y0 <= box1->m1+box1->m2 - && loop(bp,0, 0,dx,cs,0,RI)+1 - < loop(bp,0,dx/2,dx,cs,0,RI) ) ad=97*ad/100; - - if( gchar ) // i is more often than j, be sure that realy correct Mai00 - if( loop(bp, 0,2*dy/4,dx,cs,0,RI) - -loop(bp,dx-1,2*dy/4,dx,cs,0,LE)>dx/8 ) Break; - - // could be a broken + or similar thing? - if( 3 * ya > box1->m1 + 2*box1->m2 ) ad=90*ad/100; - - if( loop(bp,dx-1,3*dy/4,dx,cs,0,LE)>dx/2 - && loop(bp,dx-1, dy-1,dx,cs,0,LE)5 && num_cross(x0+dx/2,x0+dx/2, ya, y1 ,box1->p,cs) >= 3 ) - ad=95*ad/100; - - Setac(box1,'i',ad); - break; - } - // --- test j --------------------------------------------------- - // if(box1->dots==1) // what about \it neighbouring ij - for(ad=d=100;dy>4 && dx>0;){ // min 3x4 - DBG( wchar_t c_ask='j'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - ya=y0; - if( box1->m2 && 2*y0>=box1->m2+box1->m1 ) ya=box1->m1; - - for(y=ya;2*yp,cs,1) == 1 ) break; - if(2*y>=ya+y1) Break; // hmm only gap - ya=y; - if( box1->m2 && ya>box1->m2+2 ) Break; - for( ;2*yp,cs,1) != 1 ) break; - if(2*y>=ya+y1) Break; // hmm no gap - for( ;2*yp,cs,1) == 1 ) break; - if(2*y>=ya+y1) Break; // hmm very large gap - yb=y; - if( loop(bp,dx-1,y+(y1-ya+1)/32,dx,cs,0,LE)>dx/2 ) Break; // unusual (right part of ouml) - - // printf(" num_cross dy/2=%d %d\n",dy/2, num_cross(0,dx-1,dy/2,dy/2,bp,cs)); - // printf(" dots=%d\n",box1->dots); out_x(box1); - // \sl ~f. ! - for(y=(ya+y1)/2;y<=y1;y++) if( get_bw(x0,x1,y,y,box1->p,cs,1) != 1 ) break; - if(y<=y1) Break; - - y=(y1-yb+1)/2+yb-y0; /* only one vertical line, italic i is more an tall S */ - if( num_cross(0,dx-1,y,y,bp,cs) >2 ) Break; - for(;y<=y1-y0;y++){ if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) break; } yc=y; - for(;y<=y1-y0;y++){ if( num_cross(0,dx-1,y,y,bp,cs) != 2 ) break; } yd=y; - if( yd<3*(y1-yb+1)/4+yb-y0 ) Break; - y=(y1-yb+1)/2+yb-y0; - for(;y>0;y--){ if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) break; } ye=y; - for(;y>0;y--){ if( num_cross(0,dx-1,y,y,bp,cs) != 2 ) break; } yf=y; - if( yf>(y1-yb+1)/4+yb-y0 ) Break; - if(yd>yc+2){ - xa=loop(bp, 0,yc-1,dx,cs,0,RI); - xb=loop(bp,dx-1,yc-1,dx,cs,0,LE); - if( - xb-loop(bp,dx-1,yc,dx,cs,0,LE) /* Dec00 */ - > xa-loop(bp, 0,yc,dx,cs,0,RI) ){ - y= loop(bp,dx-xb,yc-1,dy,cs,0,DO); - if(y>0){ - i=loop(bp,dx-xb-1,yc-1+y-1,dy,cs,0,DO); - if( i>0 ) y+=i-1; - } - if( yc-1+y < yd-1 ) Break; - } else { - y= loop(bp,11*xa/16,yc-1,dy,cs,0,DO); - if( yc-1+y < yd-2 ) Break; - } - } - if(yf0 ) y+=i-1; - if( ye+1-y > yf+1 ) Break; - } - if( 2*y0 <= box1->m1+box1->m2 - && loop(bp,0, 0,dx,cs,0,RI)+1 - < loop(bp,0,dx/2,dx,cs,0,RI) ) ad=97*ad/100; - if (loop(bp,0,dy-1,dx,cs,0,RI) - -loop(bp,0,dy-3,dx,cs,0,RI)>1+dx/16) ad=96*ad/100; // ~c - - if( gchar ) // i is more often than j, be sure that realy correct Mai00 - if( loop(bp, 0,2*dy/4,dx,cs,0,RI) - -loop(bp,dx-1,2*dy/4,dx,cs,0,LE)<=dx/8 ) Break; - // could be a broken + or similar thing? - if( 3 * ya > box1->m1 + 2*box1->m2 ) ad=80*ad/100; - if (!gchar) ad=96*ad/100; - if( box1->dots!=1 ) ad=98*ad/100; - - Setac(box1,'j',ad); - - break; - } - // --- test I --------------------------------------------------- - for(ad=d=100;dy>4 && dy>dx && 5*dy>4*(box1->m3-box1->m2);){ // min 3x4 - DBG( wchar_t c_ask='I'; ) - if( box1->dots==1 ) Break; - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - - x =loop(bp,0, dy/2,dx,cs,0,RI); // konvex? divided Q - if(loop(bp,0,7*dy/8,dx,cs,0,RI) > x+dx/8) Break; - for( y=dy/16;y1+dx/8 ) break; - } if( y<3*dy/4 ) Break; - // out_x(box1); - - // upper max width - for(i2=i1=0,y=0;yi1){ i1=x;i2=y; } - } - for(i4=i3=0,y=3*dy/4;yi3){ i3=x;i4=y; } - } - if( abs(i3-i1)>1+dx/8 ) Break; // if i3>>i5 more sure! - if( i1>i5 ){ // look for edges else *80% - } - if(i1+1i2 ) i2=i; - - // printf(" get_line(%d,%d) %d\n",i1,i2, - // get_line2(i1,dy/8,i2,dy-1-dy/8,bp,cs,100)); - if( get_line2(i1,dy/8,i2,dy-1-dy/8,bp,cs,100)<95 ) Break; - x =(i1-i2+4)/8; i1+=x; i2-=x; - - // upper and lower width (what about serifs?) - y=dy/8; - x =loop(bp,i1, y+0,dx,cs,1,LE); i=x; - x =loop(bp,i1, y+1,dx,cs,1,LE); if(x>i)i=x; - x =loop(bp,i1, y+0,dx,cs,1,RI); j=x; - x =loop(bp,i1, y+1,dx,cs,1,RI); if(x>j)j=x; if(abs(i-j)>1+dx/8)Break; - x =loop(bp,i2,dy-y-1,dx,cs,1,LE); j=x; - x =loop(bp,i2,dy-y-2,dx,cs,1,LE); if(x>j)j=x; if(abs(i-j)>1+dx/8)Break; - x =loop(bp,i2,dy-y-1,dx,cs,1,RI); j=x; - x =loop(bp,i2,dy-y-2,dx,cs,1,RI); if(x>j)j=x; if(abs(i-j)>1+dx/8)Break; - - if(dy>15) // v024a4 - if( loop(bp,dx-1,dy/16 ,dx,cs,0,LE) - > loop(bp,dx-1,dy/4 ,dx,cs,0,LE)+1+dx/32 ) Break; // ~bad ) (thinn) - - for(i=0,y=dy/16;y<15*dy/16 && i<2;y++) - if( num_cross(0,dx-1,y,y,bp,cs) != 1 ) i++; - if( i>1 ) Break; - - if(!hchar){ // right part (bow) of h is never a l - if( get_bw(dx/4,dx/4, 0,dy/4,bp,cs,1) == 1 - && get_bw(dx/4,dx/4,dy/2,dy-1,bp,cs,1) == 0 ) Break; - if( loop(bp, 0,dy/4,dx,cs,0,RI)> dx/4 - && loop(bp,dx-1,dy/4,dx,cs,0,LE)<=dx/4 - && loop(bp, 1, 0,dy,cs,0,DO)<=dy/4 ) Break; // ~z - } - - if( get_bw(x1,x1,y0 ,y1 ,box1->p,cs,2) != 2 - && get_bw(x0,x1,y0 ,y0 ,box1->p,cs,2) != 2 - && get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) != 2 - && get_bw(x0,x0,y0+1,y1-1,box1->p,cs,1) != 1 ) Break; /* ~] */ - - if ( loop(bp,dx-1, dy/4,dx,cs,0,LE) > dx/2 - && loop(bp,dx-1,3*dy/4,dx,cs,0,LE) > dx/2 - && loop(bp, 0, dy/2,dx,cs,0,RI) < dx/4 ) Break; /* ~[ */ - - x =loop(bp, 0,dy/2,dx,cs,0,RI); // konvex/konkav? ~() - i =loop(bp,dx-1,dy/2,dx,cs,0,LE); - if( loop(bp, 0,7*dy/8,dx,cs,0,RI) > x+dx/8 - && loop(bp, 0, dy/8,dx,cs,0,RI) > x+dx/8 - && loop(bp,dx-1,7*dy/8,dx,cs,0,LE) < i-dx/8 - && loop(bp,dx-1, dy/8,dx,cs,0,LE) < i-dx/8 ) Break; // ~( - if( loop(bp, 0,7*dy/8,dx,cs,0,RI) < x-dx/8 - && loop(bp, 0, dy/8,dx,cs,0,RI) < x-dx/8 - && loop(bp,dx-1,7*dy/8,dx,cs,0,LE) > i+dx/8 - && loop(bp,dx-1, dy/8,dx,cs,0,LE) > i+dx/8 ) Break; // ~) - if( loop(bp, 0, dy/8,dx,cs,0,RI) - -(dx-loop(bp,dx-1,7*dy/8,dx,cs,0,LE)) > dx/4 ) Break; // ~/ - if( loop(bp, 0, 0,dx,cs,0,RI) > dx/2 // ToDo: check for serifs - && loop(bp, 0, dy/8,dx,cs,0,RI) > dx/2 - && loop(bp,dx-1,dy-1 ,dx,cs,0,LE) > dx/2 - && loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE) > dx/2 ) ad=99*ad/100; // ~/ - - if (box1->m2 && 3*y0>box1->m1+2*box1->m2) - if( get_bw(x0+dx/8,x1-dx/8,box1->m1,(box1->m1+box1->m2)/2,box1->p,cs,1) == 1 ) - Break; // ~i - - if(i1+1p,cs,1) != 1 - || get_bw(x0+i4/4,x0+i4/4,y1-dy/4,y1,box1->p,cs,1) != 1 ) - { ad=99*ad/100; MSG(fprintf(stderr,"ad=%d",ad);) } // ToDo: improve it - if(!hchar){ ad=96*ad/100; MSG({}) } // ~bad_small_r - if (box1->m4 && y1m4) { // probably lower dot? - if ((dx>2 && get_bw(x0+1,x1-1,y1+1,box1->m4,box1->p,cs,1) == 1) - || (dx<3 && get_bw(x0 ,x1 ,y1+1,box1->m4,box1->p,cs,1) == 1)) { - ad=96*ad/100; - } - } // ~! - // a---b - // I - // I - // c---e - // check against Z - for(bx=0,ax=dx,ay=by=y=0;ybx) { bx=dx-1-i; by=y; } - i+=loop(bp,dx-1-i,y,dx,cs,1,LE); if (dx-i-1dy-1-dy/4;y--){ - i =loop(bp,0,y,dx,cs,0,RI); if (iex) { ex=i; ey=y; } - } - x=(3*ax+cx)/4; y=(3*ay+cy)/4; i= loop(bp,x,y,dx,cs,0,RI); - x=(3*bx+ex)/4; y=(3*by+ey)/4; j= loop(bp,x,y,dx,cs,0,LE); - if (j>0 && (2*i>3*j || 3*i<2*j )) ad=99*ad/100; - if (j>0 && ( i>2*j || 2*i< j )) ad=97*ad/100; - i=loop(bp,0,0,dy,cs,0,DO); - if (i>dy/8 && idx/4) ad=96*ad/100; // ~l 5x7 - - if( get_bw(x0,x1,y0,y1,box1->p,cs,2) == 0 ) ad=99*ad/100; - if (gchar) ad=98*ad/100; // J - if (box1->m3 && 2*y1<=box1->m2+box1->m3) ad=96*ad/100; // ' - - Setac(box1,'I',ad); - break; - } - // --- test J --------------------------------------------------- 22Nov06 - for(ad=d=100;dy>4 && dy>=dx && dx>2;){ // min 3x4 ~Y)]d', - // rewritten for vectors 0.42 - int ld, i1, i2, i3, i4, i5, i6, i7; // line derivation + corners - DBG( wchar_t c_ask='J'; ) - if (sdata->holes.num > 0) Break; /* no hole */ - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the upper right end of the J */ - if (aa[3][2]>d) Break; /* [2] = distance */ - /* searching for 4 notches between neighbouring ends */ - -/* - type A B - - 6OOOO 6O5 - 7O5 7O - O O - O O - 2O 1O4 1O4 - OO 2OO - 3 3 -*/ - - /* Warning: aa0 can be left upper or left lower point for type B */ - /* get a point on the inner low left side of the J */ - i =nearest_frame_vector(box1,aa[3][3],aa[1][3],(x0+x1)/2,y0); - i1=nearest_frame_vector(box1,i ,aa[1][3], x1+dx,(y0+3*y1)/4); - /* get the most left point on the lower part of the J */ - i2=nearest_frame_vector(box1,i1,aa[3][3], x0-2*dx, y1-dy/8); - /* get a point on the middle of the bottom of the J */ - i3=nearest_frame_vector(box1,aa[1][3],aa[2][3], (x0+x1)/2, y1); - /* get a point on the outer low right side of the J */ - i4=nearest_frame_vector(box1,aa[1][3],aa[3][3], x1, (y0+2*y1)/3); - /* get a point on the outer right side below top serif */ - i5=nearest_frame_vector(box1,aa[2][3],aa[3][3], (x0+2*x1)/3,y0); - /* get a point on the left side of upper serif */ - i6=nearest_frame_vector(box1,aa[3][3],i1, x0, y0); - /* get a point on the most right left side of upper serif */ - i7=nearest_frame_vector(box1,i6,i1, x1, y0); - MSG(fprintf(stderr," i1-i7 %d %d %d %d %d %d %d",i1,i2,i3,i4,i5,i6,i7);) - - /* check the highest point on lower left area */ - i =nearest_frame_vector(box1,i1,i3,x0,y0); - if (box1->frame_vector[i ][1]-y0frame_vector[i ][1]-y0<=dy/2) ad=97*ad/100; // imperfect a - /* check the lowest point on upper left area, serife? */ - j =nearest_frame_vector(box1,i6,i7,x0,y1); - if (box1->frame_vector[i ][1] - -box1->frame_vector[j ][1]<=dy/4) Break; // imperfect a - if (box1->frame_vector[i7][1]>y0+dy/4) Break; // not to low - if (box1->frame_vector[i1][1] - -box1->frame_vector[i7][1]frame_vector[i4][1] - -box1->frame_vector[i5][1]frame_vector[i7][0]frame_vector[i1][0] - -box1->frame_vector[i2][0]<=dx/8) Break; // ~1 - if (box1->frame_vector[i1][0] - -box1->frame_vector[i2][0]<=dx/4) ad=ad*99/100; // ~1 - if (box1->frame_vector[i6][1]>y0+dy/8) ad=99*ad/100; // ~1 - if (aa[0][2]==0) { // ]? - ad=99*ad/100; - if (aa[1][2]==0) ad=98*ad/100; - if (aa[2][2]<=aa[3][2]) ad=97*ad/100; - } - - /* check for left bow */ - for (j=i=i2;i!=i4;i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[ i][0] /* [0]=x */ - frame_vector[i1][0]) break; /* curve? */ - } if (i==i4) Break; // ~I - /* check for no right bow */ - for (j=i=i2;i!=i4;i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[ i][0] /* [0]=x */ - >box1->frame_vector[i4][0]) break; - } if (i!=i4) Break; // ~I - /* check for no right bow */ - for (j=i=i5;i!=i6;i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[ i][1] > y0+dy/4) break; - } if (i!=i6) Break; // ~Y - /* check if upper left and lower left points are joined directly */ - ld=line_deviation(box1, i7, i1); - MSG(fprintf(stderr," i7,i1 %d %d linedist= %d/%d",i7,i1,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - if (5*ld >4*2*sq(1024/4)) ad=99*ad/100; // ~3 - if (6*ld >4*2*sq(1024/4)) ad=99*ad/100; // ~3 - if (7*ld >4*2*sq(1024/4)) ad=99*ad/100; // ~3 - if (8*ld >4*2*sq(1024/4)) ad=99*ad/100; // ~3 - /* check if lower right and upper right points are joined directly */ - ld=line_deviation(box1, i4, i5); - MSG(fprintf(stderr," i4,i5 %d %d linedist= %d/%d",i4,i5,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - if (5*ld >4*2*sq(1024/4)) ad=99*ad/100; - - // J exists as gchar and ~gchar - if(!hchar){ ad=99*ad/100; } - Setac(box1,'J',ad); - break; - } - return box1->c; -} - -static wchar_t ocr0_brackets(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i1,i2,i3,i4,i5,i6,hchar=sdata->hchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - (*aa)[4]=sdata->aa, /* corner-points, (x,y,dist^2,vector_idx) */ - ad,r1,r2; /* tmp-vars */ - wchar_t bc=UNKNOWN; - - // --- test > derived from xX --------------------------------------------------- - // rewritten for vectors v0.41 - for(ad=d=100;dx>1 && dy>2;){ // min 3x2 - // 0 - indizes 0,1,i1,i2 pointing to edges of the char - // \ . - // \ . - // i1,i2 - // / - // / - // 1 - DBG( wchar_t c_ask='>'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if (sdata->holes.num > 0 && (dx<6 || dy<6)) Break; /* # */ - /* calculate the half distance to the center */ - d=2*sq(128/4); - /* now we check for the 2 left ends of the > */ - if (aa[0][2]>d) Break; /* upper left end */ - if (aa[1][2]>d) Break; /* lower left end */ - if (aa[1][1]-aa[0][1]num_frame_vectors[0]) { - if (box1->frame_vector[i][0] - >=box1->frame_vector[j][0]) j=i; /* notice most right vector */ - } if (j==i || j==aa[0][3]) Break; - /* calculate the distance to the center */ - x=box1->frame_vector[j][0]; - y=box1->frame_vector[j][1]; - if (2*x-aa[0][0]-aa[1][0](dy+2)) Break; - if ( aa[0][0]+aa[1][0]-2*x>=0) Break; - i1=j; - d=line_deviation(box1, aa[0][3], j) >sq(1024/4); - /* check if upper left and center point are joined directly */ - MSG(fprintf(stderr,"x %d %d dist= %d/%d",x-x0,y-y0,d,sq(1024/4));) - if (d >sq(1024/4)) Break; ad=ad-d*100/sq(1024); - MSG(fprintf(stderr,"ad=%d", ad);) - d=line_deviation(box1, j, aa[1][3]); - /* check if lower left and center point are joined directly */ - MSG(fprintf(stderr,"x %d %d dist= %d/%d",x-x0,y-y0,d,sq(1024/4));) - if (d >sq(1024/4)) Break; ad=ad-d*100/sq(1024); - MSG(fprintf(stderr,"ad=%d", ad);) - - /* run along right side from bottom to top */ - for (j=i=aa[1][3];i!=aa[0][3];i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[i][0] - >=box1->frame_vector[j][0]) j=i; /* notice most right vector */ - // MSG(fprintf(stderr,"search right: %d %d %d %d",i,j,aa[1][3],aa[0][3]);) - } if (j==i || j==aa[1][3]) Break; - /* calculate the distance to the center */ - x=box1->frame_vector[j][0]; - y=box1->frame_vector[j][1]; - if ( (aa[0][0]+aa[1][0]-2*x)>= 0 ) Break; - if (abs(aa[0][1]+aa[1][1]-2*y)>(dy+2)/4) Break; - if (aa[0][0]>=x || aa[1][0]>=x) Break; - i2=j; - d=line_deviation(box1, j, aa[0][3]); - /* check if upper left and center point are directly joined directly */ - MSG(fprintf(stderr,"x %d %d dist= %d/%d",x-x0,y-y0,d,sq(1024/4));) - if (d >sq(1024/4)) Break; ad=ad-d*100/sq(1024); - MSG(fprintf(stderr,"ad=%d", ad);) - d=line_deviation(box1, aa[1][3], j); - /* check if lower left and center point are directly joined */ - MSG(fprintf(stderr,"x %d %d dist= %d/%d",x-x0,y-y0,d,sq(1024/4));) - if (d >sq(1024/4)) Break; ad=ad-d*100/sq(1024); - MSG(fprintf(stderr,"ad=%d", ad);) - - /* - ToDo: calculate momentums or max derivations - along lines to distinguish )]}> - i1,i2 - */ - - if (sdata->gchar) ad=98*ad/100; - if (sdata->hchar) ad=99*ad/100; - bc='>'; - Setac(box1,bc,ad); - break; - } - // --- test /\\ ------------------------------------------------ -// if(bc==UNKNOWN) -// if(!box1->dots) - for(ad=d=100;dx>3 && dy>3;){ // min 4x4 for 4x6 font - DBG( wchar_t c_ask='/'; ) - if (sdata->holes.num > 0) Break; /* tolerant against a tiny hole */ -#if 1 - for(i=y=0;y2 || (i>0 && dy<16)) Break; -#endif - /* get the center as exact as possible */ - i2=dx-1-loop(bp,dx-1,dy/2 ,dx,cs,0,LE) // be exact for small fonts - +dx-1-loop(bp,dx-1,dy/2+dy%2-1,dx,cs,0,LE) - + loop(bp, 0,dy/2 ,dx,cs,0,RI) - + loop(bp, 0,dy/2+dy%2-1,dx,cs,0,RI); - if (abs(i2-2*dx)>1+dx/2) Break; - if (abs(i2-2*dx)> dx/2) ad=99*ad/100; - - i1=loop(bp,dx-1,dy/16,dx,cs,0,LE); // right side - i3=loop(bp,dx-1,dy-1 ,dx,cs,0,LE); - i4=loop(bp, 0,0 ,dx,cs,0,RI); // left side - i6=loop(bp, 0,dy-1 ,dx,cs,0,RI); - i=(box1->m4+box1->m3)/2-box1->m2; - // - // out_x(box1);printf("() %d %d %d %d %d %d %d\n",i,i1,i2,i3,i4,i5,i6); - - // ~lI - for(i=i4,y=0;ydx/6+1 ) break; i=x; - } if( ydx/6+1 ) break; i=x; - } if( ydx/4 ) { Setac(box1,(bc='/'),ad);break; } - if(i4<=dx/8 && i3<=dx/8 && i6-(dx-i1)>dx/4 ) { Setac(box1,(bc='\\'),ad);break; } - Break; - } - // --- test ()<> ------------------------------------------------ -// if(bc==UNKNOWN) -// if(!box1->dots) - for(ad=d=100;dx>1 && dy>4;){ // min 3x4 - DBG( wchar_t c_ask='('; ) - if (sdata->holes.num > 1) {Break;}; /* tolerant against a tiny hole */ -#if 1 - for(i=y=0;y2 || (i>0 && dy<16)) {Break;}; -#endif - /* look for the extrema => r1..r2 */ - for(i=dx,r1=r2=y=dy/2-dy/8;y<=dy/2+dy/8;y++){ - j=loop(bp, 0,y,dx,cs,0,RI); if(j==i) r2=y; if(jdy){ -// from Aug06 vector-version of greater is used -// if(i2==0 && 3*i5>dx && i4<=dx/8 && i6<=dx/8) { Setac(box1,(bc='>'),98);{Break;}; } - if(i5==0 && 3*i2>dx && i1<=dx/8 && i3<=dx/8) { Setac(box1,(bc='<'),98);{Break;}; } - } - if( dx > 2 && 9*dx>=5*dy ){ // 4x6 screen-font (3*5) - ad=98; - if (dx<8) ad=99*ad/100; - if (dx<6) ad=96*ad/100; - if( 2*dx > JOB->res.avX && 4*dx>dy ) ad=98; -// printf(" %d %d %d %d %d %d\n",i5,i1,i3,i2,i4,i6); - if( i5==0 && i1<=dx/8+1 && i3<=dx/8+1 && i1+i3<=dx/8+1 - && i2>=dx/2 && i4>=3*dx/4 && i6>=3*dx/4 ) { - if (2*loop(bp, 0, y/2,dx,cs,0,RI)+1+dx/16=dx/2 && i1>=3*dx/4 && i3>=3*dx/4 ) { - if (2*loop(bp,dx-1, y/2,dx,cs,0,LE)+1+dx/16m4+box1->m3)/2-box1->m2; - // - // out_x(box1);printf("() %d %d %d %d %d %d %d\n",i,i1,i2,i3,i4,i5,i6); - if(2*i2i4+i6 && 2*dx=i){ - Setac(box1,(bc=')'),98);break; } - if(2*i2>i1+i3 && 2*i5=i){ - if(2*i2<=i1+i3+1 || 2*i5>=i4+i6-1) ad=98*ad/100; - if(2*i2<=i1+i3+2 || 2*i5>=i4+i6-2) ad=98*ad/100; - for(x=y=0;yx ) x=i; - } - for(y=0;y<(dy+2)/4;y++){ - i=loop(bp,0,y+dy/8,dx,cs,0,RI);if( i2 && dy>4 && dy>=2*dx;){ // (3,6) on 4x6 font - DBG( wchar_t c_ask=']'; ) - if (sdata->holes.num > 1) { Break;} /* tolerant against a tiny hole */ - if (!hchar) ad=97*ad/100; - for(y=0;yp,cs,2) == 2 - && get_bw(x0,x1,y0+1,y0+1,box1->p,cs,2) == 2 ) {Break;}; - if( get_bw(x0,x1,y1 ,y1 ,box1->p,cs,2) == 2 - && get_bw(x0,x1,y1-1,y1-1,box1->p,cs,2) == 2 ) {Break;}; - if( get_bw(x0 ,x0,y0 ,y1 ,box1->p,cs,2) == 0 - || get_bw(x0+1 ,x0+1,y0 ,y1 ,box1->p,cs,2) == 0 ) - if( get_bw(x0+dx/2,x1,y0+dy/4,y1-dy/4,box1->p,cs,1) == 0 ) - { Setac(box1,(bc='['),ad);break; } - if( get_bw(x1 ,x1,y0 ,y1 ,box1->p,cs,2) == 0 - || get_bw(x1-1 ,x1-1,y0 ,y1 ,box1->p,cs,2) == 0 ) - if( get_bw(x0,x1-dx/2,y0+dy/4,y1-dy/4,box1->p,cs,1) == 0 ) - { Setac(box1,(bc=']'),ad);break; } - break; - } - -#if CODE_NOT_COMPLETED - // --- test ] ------- - for(ad=d=100;dx>2 && dy>3;){ - DBG( wchar_t c_ask=']'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if (sdata->holes.num > 0) ad=98*ad/100; /* # */ - /* 1/8 distance to the center */ - d=2*sq(128/16); - /* now we check for the 4 ends of the x */ - if (aa[0][2]>d) Break; - if (aa[1][2]>d) Break; - if (aa[2][2]>d) Break; - if (aa[3][2]>d) Break; - if (aa[3][0]-aa[0][0]<7*dx/8) Break; - if (aa[2][0]-aa[1][0]<7*dx/8) Break; - if (aa[1][1]-aa[0][1]<7*dy/8) Break; - if (aa[2][1]-aa[3][1]<7*dy/8) Break; - if (aa[3][0]-aa[0][0]<2) Break; /* to small */ - if (aa[2][0]-aa[1][0]<2) Break; /* to small */ - MSG( fprintf(stderr," aa %d %d %d %d %d %d %d %d d %d %d %d %d",\ - aa[0][0]-x0,aa[0][1]-y0,aa[1][0]-x0,aa[1][1]-y0,\ - aa[2][0]-x0,aa[2][1]-y0,aa[3][0]-x0,aa[3][1]-y0,\ - aa[0][2],aa[1][2],aa[2][2],aa[3][2]);) - /* left and right vertical line */ - d=line_deviation(box1, aa[0][3], aa[1][3]); if (d>2*sq(1024/4)) Break; - ad=(100-(d-sq(1024)/2)/sq(1024)/4)*ad/100; - d=line_deviation(box1, aa[2][3], aa[3][3]); if (d>2*sq(1024/4)) Break; - - /* search uppermost left ^ */ - i1=nearest_frame_vector(box1,aa[1][3],aa[2][3], x0, y0); - x=box1->frame_vector[i1][0]; - y=box1->frame_vector[i1][1]; - if (y-y0 > 5*dy/8) Break; - if (x-x0 > 5*dx/8) Break; - /* search uppermost right ^ ~H */ - i3=nearest_frame_vector(box1,aa[1][3],aa[2][3], x1, y0); - if ( box1->frame_vector[i3][0]-x> dx/4 - && box1->frame_vector[i3][1]-y<=dy/8) Break; - - /* check if upper left and lower right point are joined directly */ - dbg[0]=d=line_deviation(box1,i1, aa[2][3]); if (d >2*sq(1024/4)) Break; - /* check if lower left and lower left point are joined directly */ - dbg[1]=d=line_deviation(box1, aa[1][3],i1); if (d >2*sq(1024/4)) Break; - - if (!hchar) ad=99*ad/100; - if ( gchar) ad=98*ad/100; // \sc N - ac=(wchar_t) ']'; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - } -#endif - // --------- test ocr-a-[] -------------------------------- - if(bc==UNKNOWN) - for(ad=d=98;dx>5 && dy>7 && 2*dy>3*dx;){ // only for accurate font at the moment - DBG( wchar_t c_ask='['; ) - if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ - if (!hchar) ad=97*ad/100; - if( num_cross(0,dx-1, 0, 0,bp,cs) != 1 ) break; - if( num_cross(0,dx-1,dy-1,dy-1,bp,cs) != 1 ) break; - if ( loop(bp,dx-1,dy/2,dx,cs,0,LE) - +loop(bp, 0,dy/2,dx,cs,0,RI) <= dx/4 ) break; // O - for(y=dy/8;yp,cs,1) == 0) - { Setac(box1,(bc='['),ad);break; } - if( get_bw(x0,(5*x0+3*x1)/8,y0+3*dy/16,y1-3*dy/16,box1->p,cs,1) == 0) - { Setac(box1,(bc=']'),ad);break; } - break; - } - // --------- test {} -------------------------------- - for(ad=d=99;dx>2 && dy>5 && 2*dy>3*dx;){ - DBG( wchar_t c_ask='{'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if (!hchar) ad=97*ad/100; - for(y=0;y3*dx/4 ) ad=99*ad/100; - if ( loop(bp,0, 0,dx,cs,0,RI)>3*dx/4 ) ad=99*ad/100; // < - if ( loop(bp,0, 0,dy,cs,0,DO)=dx/8 ) ad=98*ad/100; // < - if ( loop(bp,dx-2,dy-1,dy,cs,0,UP)>dy/4 ) Break; // f - if ( get_bw(x0,x0,y0,y0+dy/4,box1->p,cs,1) == 1 - || get_bw(x0,x0,y1-dy/4,y1,box1->p,cs,1) == 1 ) Break; - Setac(box1,(bc='{'),ad);Break; - } - for(ad=d=99;dx>2 && dy>5 && 2*dy>3*dx;){ - DBG( wchar_t c_ask='}'; ) - if (!hchar) ad=97*ad/100; - for(y=0;y3*dx/4 ) {ad=99*ad/100;} - if ( loop(bp,dx-1, 0,dx,cs,0,LE)>3*dx/4 ) {ad=99*ad/100;} // > - if ( loop(bp,dx-1, 0,dy,cs,0,DO)=dx/8 ) ad=98*ad/100; // < - if ( loop(bp,1,dy-1,dy,cs,0,UP)>dy/4 ) Break; // ??? - if ( get_bw(x1,x1,y0,y0+dy/4,box1->p,cs,1) == 1 - || get_bw(x1,x1,y1-dy/4,y1,box1->p,cs,1) == 1 ) Break; - Setac(box1,(bc='}'),ad);Break; - } - return box1->c; -} - -#if 0 -/* ---------- empty prototype function for copy and expand ---------- */ -static wchar_t ocr0_XXX(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,i0,i1,i2,i3,hchar=sdata->hchar,gchar=sdata->gchar, - x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1,cs=sdata->cs; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - ac,ad; /* tmp-vars */ - - // --- test XXX --------------------------------------------------- - return box1->c; -} -#endif - - -/* ----------------------- part9 -------------------------------- */ -static wchar_t ocr0p9(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - i1,i2,i3,i4; /* tmp-vars */ - int xa,xb, /* used for store significant points of char */ - dbg[9]={0,0,0,0,0,0,0,0,0}, /* debugging space */ - ya,ad,cs=sdata->cs; - wchar_t ac,bc=UNKNOWN; // bestletter - int hchar; // char is higher than e - int gchar; // char has ink lower than m3 - // --- hchar --- gchar ------------------------- - hchar=0;if( 2*y0<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; - gchar=0;if( 2*y1>=2*box1->m3+(box1->m4-box1->m3) ) gchar=1; - // if the char is slightly moved down correction can be done - if ( y0m2 && y1>box1->m3 && 2*y1m3+box1->m4) // moved - if( 2*(y0-(y1-box1->m3))<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; - - /* reserved for the future */ - // --- test beta,\3,sz,"s --------------------------------------------- - if(bc==UNKNOWN && hchar) - for(ad=d=100;dx>3 && dy>6;){ // min 4x7 - DBG( wchar_t c_ask='S'; ) - if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ - /* this part is provisorium, should be changed! - a-\ - | d - b| / - | \ - -c / - */ - if( num_cross(x0 ,x1 ,y0+dy/4 ,y0+dy/4 ,box1->p,cs) != 2 - && num_cross(x0 ,x1 ,y0+dy/4+1,y0+dy/4+1,box1->p,cs) != 2 ) break; - for(i=1+dy/16,y=y0+dy/8;y0;y++){ - if( yp,cs) != 2 ) i--;} - else { if( num_cross(x0 ,x1 ,y,y,box1->p,cs) < 2 ) i--;} - if( get_bw(x0,x0+dx/2,y,y,box1->p,cs,1) == 0 ) i--; - if( yp,cs,1) == 0 ) i--; - } if( i<=0 ) break; - // out_x(box1); - - for(y=y0+dy/3;yp,x1,y,dx,cs,0,LE); - if( i>=dx/8 ) break; - i+=loop(box1->p,x1-i,y,dx,cs,1,LE); - if( i>=dx/2 ) break; - } if( y>=y1-dy/3 ) break; - - for(y=y0+dy/5;yp,cs,1) == 1 ) break; - if( y>=y0+dy/3 ) break; - - for(y=y0+dy/2;yp,cs,1) == 1 ) break; - if( y>=y1 ) break; - - for(y=y1-dy/3;yp,x1,y,dx,cs,0,LE); - if( i>dx/4 - && get_bw(x1-dx/8,x1-dx/8,y,y1,box1->p,cs,1) == 1 ) break; - } if( ym3==0 || 2*y1m3+box1->m4 ) - if( loop(box1->p,x1,y1, dx,cs,0,LE)==0 - && loop(box1->p,x1,y1-dy/4,dx,cs,0,LE)>dx/8 ) break; // ~R - - - for(x=x0+dx/4;xp,cs) == 3 ) break; - if( x>=x1-dx/4 ) break; - - i=loop(bp,dx/2,dy-1,dy,cs,0,UP)+dy/64; // Jul00 - for(x=dx/5;x i ) break; - if( x==dx/2 ) break; - - x=x0+loop(bp,0,dy/4,dx,cs,0,RI); - for(;xp,cs,1) == 0 ) break; - if( xp,cs,NULL) != 0 ) break; - if (sdata->holes.num != 0) break; - - bc=LATIN_SMALL_LETTER_SHARP_S; - Setac(box1,(wchar_t)bc,98); - break; - } - // --- test + ------------------------------------------------ - for(ad=d=100;dx>2 && dy>2;){ // min 3x3 - DBG( wchar_t c_ask='+'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - xa=(dx+1)/3-1; ya=(dy+1)/3-1; - xb=(dx+1)/4; - if( get_bw(x0,x0+xa,y0,y0+ya,box1->p,cs,1) == 1 ) Break; - if( get_bw(x0,x0+xa,y1-ya,y1,box1->p,cs,1) == 1 ) Break; - if( get_bw(x1-xb,x1,y0,y0+ya,box1->p,cs,1) == 1 ) Break; - if( get_bw(x1-xa,x1,y1-ya,y1,box1->p,cs,1) == 1 ) Break; - for(i=0,y=y0+ya;y<=y1-ya;y++){ // horizontal line - if( get_bw(x0+dx/9,x1-dx/9,y,y,box1->p,cs,2) == 0 ) { i=y; break; } - } - if (3*dx<2*dy) ad=99*ad/100; // ~t - if( !i ) Break; - ac=(wchar_t) '+'; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - } - // --- test $ ------------------------------------------------ - for(ad=d=99;dx>3 && dy>5;){ // min 3x4 - DBG( wchar_t c_ask='$'; ) - if (sdata->holes.num != 2) Break; - - if( get_bw(x0,x0+dx/5,y0 ,y0+dy/18,box1->p,cs,1) == 1 ) Break; - if( get_bw(x0,x0+dx/9,y1-dy/23,y1 ,box1->p,cs,1) == 1 ) Break; - if( get_bw(x1-dx/9,x1,y0 ,y0+dy/18,box1->p,cs,1) == 1 ) Break; - if( get_bw(x1-dx/5,x1,y1-dy/23,y1 ,box1->p,cs,1) == 1 ) Break; - if( get_bw(x0,x0+dx/3,y0+dy/3 ,y0+dy/2 ,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/3,x1,y1-dy/2 ,y1-dy/3 ,box1->p,cs,1) != 1 ) Break; - i1=x0+loop(box1->p,x0,y0,dx,cs,0,RI); if( i1x1-dx/5 ) Break; - i2=x0+loop(box1->p,x0,y1,dx,cs,0,RI); if( i2i1 ) Break; - ad= get_line2(i1,y0,i2,y1,box1->p,cs,100)*ad/100; - // check upper left and lower right half circle, $ - for (x=0,i3=y=0;yp,cs) == 2 ) { - i = loop(box1->p,x0,y0+dy/2-y,dx,cs,0,RI); - if (i>x) { x=i; i3=y0+dy/2-y; } - } if (x<=dx/4) Break; - for (x=0,i4=y=0;yp,cs) == 2 ) { - i = loop(box1->p,x0,y0+dy/2+y,dx,cs,0,RI); - if (i>x) { x=i; i4=y0+dy/2+y; } - } if (x<=dx/4) Break; - if (ad<95) Break; - ac=(wchar_t) '$'; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - } - // --- test & ------------------------------------------------ - for(ad=d=99;dx>3 && dy>4;){ /* 4x6 font */ - DBG( wchar_t c_ask='&'; ) - if (sdata->holes.num != 2) Break; - if( get_bw(x1-dx/9,x1,y0,y0+dy/4,box1->p,cs,1) == 1 ) Break; // g - if( loop(bp,dx/2,0,dy,cs,0,DO)>dy/2) Break; - i1=loop(bp,0,dy/8 ,dx,cs,0,RI); if (i1>dx/2) Break; - i =loop(bp,0,dy/4 ,dx,cs,0,RI); if (i1>dx/2) Break; if (idx/2) Break; - i =loop(bp,0,dy-dy/4-1,dx,cs,0,RI); if (i3>dx/2) Break; if (ii1) Break; - for( i2=0, y=dy/4; y<=dy/2+1; y++ ){ - i =loop(bp,0,y,dx,cs,0,RI); if( i>i2 ) i2=i; - } - if(2*i2-i1-i3<1) Break; - // if( num_hole(x0,x1 ,y0,y1,box1->p,cs,NULL)!=2 ) Break; - if( num_hole(x0,x1-dx/4,y0,y1,box1->p,cs,NULL)!=2 ) Break; - if( num_cross(dx-1,dx-1,dy/4,dy-1,bp,cs) < 1 ) Break; - for( x=dx-1; x>=dx/2; x-- ){ - if( num_cross(x,x,dy/4,dy-1,bp,cs) > 1 ) break; - } if( x<=3*dx/4 && x 3 ) { // glued ah - if (dy>15) { Break; } else ad=96*ad/100; - } - if (!hchar) ad=98*ad/100; - bc=(wchar_t) '&'; - Setac(box1,bc,ad); - if (ad>=100) return bc; - break; - } - // --- test \it & like \epsilon\tau ------------------------------ - if(bc==UNKNOWN) - for(ad=d=100;dx>7 && dy>7;){ - DBG( wchar_t c_ask='&'; ) - if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ - if( num_cross(0,dx-1, dy/4, dy/4,bp,cs) != 3 ) break; - if( num_cross(0,dx-1, dy/2, dy/2,bp,cs) != 4 ) break; - if( num_cross(dx/2,dx-1,dy/2, dy/2,bp,cs) != 2 ) break; - if( num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs) != 2 ) break; - if( num_cross(0,dx-1, dy-1, dy-1,bp,cs) != 1 ) break; - if( num_cross( 0, 0,0,dy-1,bp,cs) != 1 ) break; - if( num_cross( dx/3, dx/3,0,dy-1,bp,cs) != 4 ) break; - if( num_cross(13*dx/16,13*dx/16,0,dy/8,bp,cs) != 0 ) break; - if( num_cross(4*dx/8,4*dx/8,dy-dy/4,dy-1,bp,cs) != 1 ) break; - if( num_cross(3*dx/8,3*dx/8,dy-dy/4,dy-1,bp,cs) != 1 ) break; - if( num_cross(5*dx/8,5*dx/8,dy-dy/4,dy-1,bp,cs) != 1 ) break; - if( num_hole(x0 ,(x0+x1)/2,y0, y1,box1->p,cs,NULL) != 1 ) break; - if( num_hole(x0+dx/8,x1-dx/4,y0,y1-dy/4,box1->p,cs,NULL) != 1 ) break; - ac=(wchar_t) '&'; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - } - // --- test ? --------------------------------------------------- - for(ad=d=98;dx>2 && dy>5;){ // min 3x(4+2) - DBG( wchar_t c_ask='?'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - if ( num_cross(x0, x1, y0, y0, box1->p, cs) !=1 ) Break; // ~? - if ( num_cross(x0, x1, y1, y1, box1->p, cs) > 1 ) Break; // ~? - for(y=y0;yp,cs,1) != 1 ) break; // lower end - if (2*ym4) { // probably lower dot not catched in box? - if (get_bw(x0+1,x1-1,y1+1,box1->m4,box1->p,cs,1) != 1 ) Break; - i1=box1->m4; - for(;i1>y1;i1--) // new y1 - if( get_bw(x0, x1,i1,i1,box1->p,cs,1) == 1 ) break; // lower dot - } - y--; i=y-y0+1; // new dy - for (y=0;yp, cs) == 2 ) break; - if (y==dy/2) Break; - // if( num_hole( x0, x1, y0, y1, box1->p,cs,NULL) > 0 ) Break; - if (sdata->holes.num > 0) Break; - for(y=y0+dy/2;y<=i1;y++) - if( get_bw(x0,x1,y,y,box1->p,cs,1) == 0 ) break; - if( y==i1 ) Break; - for( ;y<=i1;y++) - if( get_bw(x0,x1,y,y,box1->p,cs,1) == 1 ) break; - if( get_bw(x0,x1,y,y,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+7*dx/8,x1,y,i1,box1->p,cs,1) == 1 ) Break; // broken thin 2 - bc='?'; - Setac(box1,(wchar_t)bc,98); - return bc; - } - // --- test !| --------------------------------------------------- - for(ad=d=99; dy>4 && dy>2*dx;){ // min 3x4 - DBG( wchar_t c_ask='!'; ) - if (sdata->holes.num > 1) Break; /* tolerant against a tiny hole */ - // measure thickness - if (num_cross(x0,x1,y0 ,y0 ,box1->p,cs)!=1) Break; - if (num_cross(x0,x1,y0+dy/2,y0+dy/2,box1->p,cs)!=1) Break; - for(y=y0;yp,cs,1) != 1 ) break; // lower end - if (2*ybox1->m3-dy/8) ad=ad*97/100; /* missing dot? */ - i1=y1; - if (y==y1 && box1->m4) { // probably lower dot not catched in box? - if ((dx>2 && get_bw(x0+1,x1-1,y1+1,box1->m4,box1->p,cs,1) == 1) - || (dx<3 && get_bw(x0 ,x1 ,y1+1,box1->m4,box1->p,cs,1) == 1 )) { - i1=box1->m4; - for(;i1>y1;i1--) // new y1 - if( get_bw(x0, x1,i1,i1,box1->p,cs,1) == 1 ) break; // lower dot - } - } i2=i1; - for( i1=0,y=y0;y<=i2;y++){ - i=num_cross(x0,x1,y,y,box1->p,cs); if(i>1) break; - if(i==0 && i1==0) i1=y; - } if(y<=i2 || i1==0 || i1dx/4+1 ) Break; // f - - if (!hchar) ad=96*ad/100; - Setac(box1,(wchar_t)'!',ad); - break; - } - // --- test * five egdes (jagges? beames?) what is the right english word? ---- - for(ad=d=99;dx>2 && dy>4;){ - DBG( wchar_t c_ask='*'; ) - if (sdata->holes.num > 0) Break; /* tolerant against a tiny hole */ - if( num_cross(0,dx-1, 0,dy-1,bp,cs) != 1 - && num_cross(0,dx-1, 1,dy-2,bp,cs) != 1 ) Break; - if( num_cross(0,dx-1,dy-1,dy-1,bp,cs) != 2 - && num_cross(0,dx-1,dy-2,dy-2,bp,cs) != 2 ) Break; - x=dx/2;y=(6*dy+8)/16; // center point 6/8=6/2^3 rounded - /* upwarts from center */ - dbg[0]=i=get_line2(x,y,x ,0,bp,cs,100); if(i<95) Break; - if (dx<8) /* be exact on small fonts, where get_line2 returns 100 (ToDo change) */ - if (get_bw(x,x,0,y,bp,cs,2)==2) Break; - /* horizontal */ - dbg[1]=i=get_line2(0,y,dx-1,y,bp,cs,100); if(i<95) Break; - if (dy<8) - if (get_bw(0,dx-1,y ,y ,bp,cs,2)==2 - && get_bw(0,dx-1,y+1,y+1,bp,cs,2)==2) Break; - /* down (right) */ - i=get_line2(x,y,(5*dx+4)/8,dy-1,bp,cs,100); - j=get_line2(x,y,(6*dx+4)/8,dy-1,bp,cs,100); if(j>i) dbg[2]=i=j; - if(i<95) Break; - /* down (left) */ - dbg[3]=i=get_line2(x, y,(2*dx+4)/8,dy-1,bp,cs,100); if(i<95) Break; // straight up - /* check for lower gap at bottom */ - dbg[4]=i=get_bw( x, x,dy-1-dy/8,dy-1,bp,cs,1); if(i==1) Break; - dbg[5]=i=get_line2( dx/4,dy/4, 0,0,bp,cs,101); if(i<95) Break; // upper left gap - dbg[6]=i=get_line2(dx-1-dx/4,dy/4,dx-1,0,bp,cs,101); if(i<95) Break; // upper right gap - MSG(fprintf(stderr,"%d %d %d %d %d %d %d",dbg[0],dbg[1],dbg[2],dbg[3],dbg[4],dbg[5],dbg[6]);) - Setac(box1,(wchar_t)'*',ad); - break; - } - // --- test * six egdes (jagges? beames?) what is the right english word? ---- - for(ad=d=100;dx>4 && dy>4;){ - DBG( wchar_t c_ask='*'; ) - if (sdata->holes.num > 0) Break; /* tolerant against a tiny hole */ - if( num_cross(0,dx-1, dy/8, dy/8,bp,cs) != 3 - && num_cross(0,dx-1, 1+dy/8, 1+dy/8,bp,cs) != 3) Break; - if( num_cross(0,dx-1,dy-2-dy/8,dy-2-dy/8,bp,cs) != 3) Break; - if( num_cross(0 , 0, 0,dy-1,bp,cs) != 2) Break; - if( num_cross(dx-1,dx-1, 0,dy-1,bp,cs) != 2) Break; - if( num_cross(0,dx-1,dy/2,dy/2,bp,cs) != 1) Break; - if( num_cross( 0 ,dx/8,dy/2,dy/2,bp,cs) != 0) Break; - if( num_cross(dx-1-dx/8,dx-1,dy/2,dy/2,bp,cs) != 0) Break; - if (dx>5) { - dbg[0]=i=get_line2(0,dy-2-dy/8,dx-1,dy/8,bp,cs,100); if(i<95) Break; // black upwarts beam - dbg[1]=i=get_line2(0,dy/8,dx-1,dy-2-dy/8,bp,cs,100); if(i<95) Break; // black downwards beam - /* check vertical line */ - dbg[2]=i=get_line2(dx/2,0,dx/2, dy-1,bp,cs,100); if(i<95) Break; - } - MSG(fprintf(stderr,"%d %d %d %d %d %d",dbg[0],dbg[1],dbg[2],dbg[3],dbg[4],dbg[5]);) - Setac(box1,(wchar_t)'*',98); - break; - } - // --- test @ - a popular char should be detectable! added in version v0.2.4a5 - if(bc==UNKNOWN) - for(ad=d=99;dx>5 && dy>7;){ - DBG( wchar_t c_ask='@'; ) - if (sdata->holes.num > 3) Break; /* tolerant against a tiny hole */ - if (loop(bp, 0,dy/2,dx,cs,0,RI)>dx/4) Break; - if (loop(bp,dx-1,dy/2,dx,cs,0,LE)>dx/4) Break; - if (loop(bp,dx/2,dy-1,dy,cs,0,UP)>dx/8) Break; - if (loop(bp,dx/2, 0,dy,cs,0,DO)>dx/8) Break; - /* ..@@@@..<- 8*10 example - .@@..@@. - @@....@@ - @@..@@@@< - @@.@@.@@ - @@.@@.@@ - @@..@@@. - @@...... - .@@...@@ - ..@@@@@.<- */ - x=6*dx/16; - y=dy/2; - i=num_cross(0,dx-1,y,y,bp,cs); - if (i<3 || i>4) Break; - if( i != 4 && dx>8 ) ad=98*ad/100; - - i=num_cross(x,x,0,dy-1,bp,cs); if (i<2) Break; - if (i!=4) { j=num_cross(x+1,x+1,0,dy-1,bp,cs); - if (abs(4-j)4) Break; - if (i!=4) ad=97*ad/100; - if( num_cross(0, x,y,y,bp,cs) != 2 ) Break; - if( num_cross(x,dx-1,y,y,bp,cs) != 2 ) Break; - if( num_cross(x,x,0, y,bp,cs) != 2 ) Break; - if( num_cross(x,x,y,dy-1,bp,cs) != 2 ) Break; - if (dx>7) { - // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 1 ) Break; - if (sdata->holes.num != 1) Break; - if( num_hole(x0+dx/8,x1-3*dx/16,y0+dy/8,y1-dy/8,box1->p,cs,NULL) != 1 ) Break; - } - Setac(box1,(wchar_t)'@',ad); - break; - } - // --- test paragraph v0.2.6 - if(bc==UNKNOWN && hchar) - for(ad=d=100;dx>4 && dy>15;){ - DBG( wchar_t c_ask='$'; ) - if (sdata->holes.num > 3) break; /* tolerant against a tiny hole */ - if( get_bw( 0,dx/2,3*dy/4,3*dy/4,bp,cs,1) == 1 ) break; - if( get_bw(3*dx/4,dx-1,3*dy/4,3*dy/4,bp,cs,1) == 0 ) break; - if( get_bw( 0,dx/4, dy/4, dy/4,bp,cs,1) == 0 ) break; - if( get_bw( dx/2,dx-1, dy/4, dy/4,bp,cs,1) == 1 ) break; - if( get_bw(dx/2,dx/2, 0, dy/4,bp,cs,1) == 0 ) break; - if( get_bw(dx/2,dx/2,dy-1-dy/4, dy-1,bp,cs,1) == 0 ) break; - if( num_cross(dx/2,dx/2,0,dy-1,bp,cs) != 4 ) break; - if( num_cross(x0,x1,y0+dy/2,y0+dy/2,box1->p,cs) != 2 ) break; - if( num_hole( x0,x1,y0+dy/4,y1-dy/4,box1->p,cs,NULL) != 1 ) break; - Setac(box1,SECTION_SIGN,96); - break; // paragraph=0xA7=167 - } - - return bc; -} - -/* ----------------------- partx -------------------------------- */ -static wchar_t ocr0px(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int i,j,d,x,y,x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - i1,i2,i3,i4,j1,cs=sdata->cs; /* tmp-vars */ - int ya,ad; /* used for store significant points of char */ - wchar_t ac,bc=UNKNOWN; // bestletter - int hchar; // char is higher than e - int gchar; // char has ink lower than m3 - // --- hchar --- gchar ------------------------- - hchar=0;if( 2*y0<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; - gchar=0;if( 2*y1>=2*box1->m3+(box1->m4-box1->m3) ) gchar=1; - // if the char is slightly moved down correction can be done - if ( y0m2 && y1>box1->m3 && 2*y1m3+box1->m4) // moved - if( 2*(y0-(y1-box1->m3))<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; - - /* reserved for special chars, to test at the end */ - // --- test 'ff' --------------------------------------------------- - // ToDo: better check and call test 'f' and 'f' with subboxes - if( bc==UNKNOWN ) - for(ad=98;dx>4 && dy>6;){ // Dec00 body copied from H - DBG( wchar_t c_ask='f'; ) - if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ - if( num_cross(0,dx-1, dy/4 , dy/4 ,bp,cs) != 2 - && num_cross(0,dx-1,3*dy/16,3*dy/16,bp,cs) != 2 ) break; - if( num_cross(0,dx-1,3*dy/4 ,3*dy/4 ,bp,cs) != 2 - && num_cross(0,dx-1,3*dy/4+1,3*dy/4+1,bp,cs) != 2 ) break; - if( loop(bp,0 ,dy/8,dx,cs,0,RI) - + loop(bp,dx-1,dy/8,dx,cs,0,LE)>dx/2 ) break; // ~A - for( j1=0,i=1,y=y0+dy/10; yp,x0 ,y,dx,cs,0,RI) - +loop(box1->p,x1 ,y,dx,cs,0,LE); - if( j>10*dx/16 ) i=0; if ( j>j1 ) j1=j; } - if( !i ) break; - for( x=dx/4; x 3*dy/8 ) break; - if ( 10*y > dy ){ /* italic */ - i=loop(bp,x ,dy-y,dx,cs,0,RI); - if( i>1 && y+loop(bp,x+i-1,dy-y,dy,cs,0,UP)>3*dy/8 ) break; - } - } if( x>=dx/2 ) break; - x=loop(box1->p,x0 ,y1-dy/8,dx,cs,0,RI) - +loop(box1->p,x1 ,y1-dy/8,dx,cs,0,LE); - for( i=1,y=dy/4; ydx/5 ) i=0; } - if( !i ) break; // ~K Jul00 - for( i=0,ya=y=y0+dy/4; yp,x0 ,y,dx,cs,0,RI); - j=loop(box1->p,x0+j,y,dx,cs,1,RI); if( j>i ) { i=j; ya=y; } } - if( i<=dx/2 ) break; ya-=y0; - if( num_cross(0,dx-1,ya ,ya ,bp,cs) != 1 - && num_cross(0,dx-1,ya+1,ya+1,bp,cs) != 1 ) break; /* Dec00 */ - for( y=ya; y 2 - && num_cross(0,dx-1,y+1,y+1,bp,cs) > 2 ) break; - if ( yp,cs,1) == 0 ) i=0; - } if( !i ) break; - for(i=1,x=x0+dx/4;x<=x1-dx/4 && i;x++){ - if( get_bw( x, x,y1-dy/4,y1 ,box1->p,cs,1) == 0 ) i=0; - } if( i ) break; - for(i=1,x=x0+dx/4;x<=x1-dx/4 && i;x++){ - if( num_cross(x,x,y0+dy/8,y1-dy/8, box1->p,cs) == 1 ) i=0; - } if( i ) break; - for(i=1,y=y0;y<=y0+dy/4 && i;y++){ - if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; - } if( i ) break; - for(i=1,y=y1-dy/4;y<=y1 && i;y++){ - if( num_cross(x0,x1,y,y, box1->p,cs) == 2 ) i=0; - } if( i ) break; - if( num_cross(x0 ,x0+dx/8 ,y0+dy/8 ,y0 ,box1->p,cs) != 0 ) ad=96*ad/100; - if( get_bw(x1-dx/8, x1 , y0, y0+dy/8,box1->p,cs,1) != 1 ) break; - if( get_bw(x0 , x0+dx/8, y1-dy/8, y1,box1->p,cs,1) != 1 ) break; - i1=loop(bp,dx-1, dy/4,dx,cs,0,LE); if(i1>dx/2) break; - i2=loop(bp,dx-1, dy/2,dx,cs,0,LE); if(i2i1+dx/8) break; - i3=loop(bp,dx-1,dy-1-dy/4,dx,cs,0,LE); if(i3i2+dx/8) break; - if(abs(i1+i3-2*i2)>dx/16+1) break; - if( num_hole(x0,x1,y0+dy/4,y1,box1->p,cs,NULL) != 0 ) break; - if (!hchar) ad=96*ad/100; - if (!gchar) ad=99*ad/100; - ac=LATIN_SMALL_LIGATURE_FF; - Setac(box1,ac,ad); - break; - } - // --- test ae --------------------------------------------------- - if( bc==UNKNOWN ) - for(ad=98;dx>4 && dy>6;){ // provisorium - DBG( wchar_t c_ask=LATIN_SMALL_LETTER_AE; ) - if (sdata->holes.num > 4) Break; /* tolerant against a tiny hole */ - if( num_cross( dx/4,dx-1,3*dy/16,3*dy/16,bp,cs) != 2 - && num_cross(dx-1-dx/4,dx-1,3*dy/16,3*dy/16,bp,cs) != 1 ) Break; - if( num_cross(0,dx-1,3*dy/ 4,3*dy/ 4,bp,cs) < 2 ) Break; - if( num_cross(0,dx-1, 0, dy-1,bp,cs) < 3 ) Break; - if( num_cross(dx-1,0, 0, dy-1,bp,cs) < 3 ) Break; - if( num_cross(0,dx-1, dy/16, dy/16,bp,cs) < 2 ) - if( num_cross(0,dx-1,1+dy/16,1+dy/16,bp,cs) < 2 ) Break; - if( num_cross(0,dx-1,dy-1-dy/16,dy-1-dy/16,bp,cs) < 2 ) Break; - for( x=0,i2=y=dy/4; y<3*dy/4; y++ ){ - j=loop(bp,0,y,dx,cs,0,RI); if(j>x) { i2=y; x=j; } - } if( x3*dx/4 ) Break; - for( x=0,i4=y=dy/4; y<3*dy/4; y++ ){ - j=loop(bp,dx-1,y,dx,cs,0,LE); if(j>x) { i4=y; x=j; } - } if( x3*dx/4 ) Break; - for( x=0,i4=y=dy/8; y<3*dy/4; y++ ){ - j=loop(bp,dx-1 ,y,dx,cs,0,LE); - j=loop(bp,dx-1-j,y,dx,cs,1,LE); - if(j>x) { i4=y; x=j; } - } if( xp,cs,NULL) != 1 ) Break; - if( num_hole(x0+dx/2-1,x1,y0,y1-dy/4,box1->p,cs,NULL) != 1 ) Break; - ac=LATIN_SMALL_LETTER_AE; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - - } - // --- test AE --------------------------------------------------- - if( bc==UNKNOWN ) - for(ad=98;dx>5 && dy>6;){ // provisorium - DBG( wchar_t c_ask=LATIN_CAPITAL_LETTER_AE; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if( num_cross(0,dx-1,3*dy/16,3*dy/16,bp,cs) < 2 ) Break; - if( num_cross(0,dx-1,3*dy/ 4,3*dy/ 4,bp,cs) < 2 ) Break; - if( num_cross(0,dx-1, 0, dy-1,bp,cs) < 3 ) Break; - if( num_cross(0,dx-1, dy/16, dy/16,bp,cs) != 1 - && num_cross(0,dx-1, dy/32, dy/32,bp,cs) != 1 - && num_cross(0,dx-1, 0, 0,bp,cs) != 1 ) Break; - // check for upper horizontal line - j=loop(bp,dx-1 ,0,dx,cs,0,LE); x=j; - j=loop(bp,dx-1-j,0,dx,cs,1,LE); - i=loop(bp,dx-1 ,1,dx,cs,0,LE); if (ij) j=i; - if (x>dx/8) Break; - if (jx) break; x=j; - j=loop(bp, j,y,dx,cs,1,RI); if(j>i1) { i1=j; i2=y; } - j=loop(bp,dx-1 ,y,dx,cs,0,LE); - j=loop(bp,dx-1-j,y,dx,cs,1,LE); if(j>i3) { i3=j; i4=y; } - } if( y<3*dy/4 || i1i1) { i1=j; } - j=loop(bp,dx-1 ,dy-1-y,dx,cs,0,LE); - j=loop(bp,dx-1-j,dy-1-y,dx,cs,1,LE); if(j>i3) { i3=j; } - } if( i1<=dx/4 || i3<=dx/4 ) Break; - for( x=dx-1-dx/8; x>dx/2; x-- ){ // look for right the E - if( num_cross(x,x, 0,dy-1,bp,cs) == 3 ) - if( num_cross(x,x, 0,dy/4,bp,cs) == 1 ) - if( num_cross(x-1,dx-1-dx/8,3*dy/4,3*dy/4,bp,cs) == 0 ) - if( num_cross(x,x,3*dy/4,dy-1,bp,cs) == 1 ) break; - } if (x<=dx/2) Break; // not found - if (sdata->holes.num != 1) Break; - if( num_hole(x0,x0+3*dx/4,y0,y1-dy/4,box1->p,cs,NULL) != 1 ) Break; - // if( num_hole(x0, x1,y0,y1 ,box1->p,cs,NULL) != 1 ) Break; - ac=LATIN_CAPITAL_LETTER_AE; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - - } - // --- test /0 /o /O O_WITH_STROKE ----------------------------------------- - for(ad=99;dx>4 && dy>4;){ // provisorium - DBG( wchar_t c_ask=LATIN_SMALL_LETTER_O_WITH_STROKE; ) - if (sdata->holes.num > 3) Break; /* tolerant against a tiny hole */ - if( num_cross( 0,dx-1,dy/2,dy/2,bp,cs) != 3 ) Break; - if( num_cross(dx/2,dx/2, 0,dy-1,bp,cs) != 3 ) Break; - if (loop(bp,dx-1,3*dy/8,dx,cs,0,RI)>dx/8) Break; - if (loop(bp, 0,5*dy/8,dx,cs,0,RI)>dx/8) Break; - if( num_cross( 0,dx-1, 0, 0,bp,cs) > 2 ) Break; - if( num_cross(dx/4,dx-1, 0, 0,bp,cs) > 2 ) Break; - if( num_cross( 0,dx-1,dy-1,dy-1,bp,cs) > 2 ) Break; - if( num_cross( 0,3*dx/4,dy-1,dy-1,bp,cs) > 2 ) Break; - if( num_cross( 0, 0, 0,dy-1,bp,cs) > 2 ) Break; - if( num_cross(dx-1,dx-1, 0,dy-1,bp,cs) > 2 ) Break; - if( num_cross( 0, 0,dy/4,dy-1,bp,cs) > 2 ) Break; - if( num_cross(dx-1,dx-1, 0,3*dy/4,bp,cs) > 2 ) Break; - i1 =loop(bp,dx-1 , 0,dx,cs,0,LE); if( i1>dx/8 ) Break; - i1+=loop(bp,dx-1-i1, 0,dx,cs,1,LE); if( i1>dx/3 ) Break; i1=dx-1-i1; - i2 =loop(bp, 0,dy-1,dx,cs,0,RI); if( i2>dx/8 ) Break; - for(y=1;y3*dx/16 ) break; - } if( yholes.num != 2) Break; - // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 2 ) Break; - - if ( hchar && 2*y0m1+box1->m2 ) - ac=LATIN_CAPITAL_LETTER_O_WITH_STROKE; - else ac=LATIN_SMALL_LETTER_O_WITH_STROKE; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - - } - // --- test /c /C C_WITH_STROKE CENT_SIGN -------------------------- - // here only the version with a continuously vertical line (not broken variant) - if( bc==UNKNOWN ) - for(ad=98;dx>4 && dy>4;){ // provisorium - DBG( wchar_t c_ask=CENT_SIGN; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if( num_cross( 0,dx-1,dy/2,dy/2,bp,cs) != 2 ) Break; - if( num_cross(0,dx-1-dx/4,dy/2,dy/2,bp,cs) != 2 ) Break; - if( num_cross(dx/2,dx/2, 0,dy-1,bp,cs) != 3 ) Break; - if( num_cross( 0,dx-1, 0, 0,bp,cs) > 2 ) Break; - if( num_cross(dx/4,dx-1, 0, 0,bp,cs) > 2 ) Break; - if( num_cross( 0,dx-1,dy-1,dy-1,bp,cs) > 2 ) Break; - if( num_cross( 0,3*dx/4,dy-1,dy-1,bp,cs) > 2 ) Break; - if( num_cross( 0, 0, 0,dy-1,bp,cs) > 2 ) Break; - if( num_cross(dx-1,dx-1, 0,dy-1,bp,cs) > 3 ) Break; - if( num_cross( 0, 0,dy/4,dy-1,bp,cs) > 2 ) Break; - if( num_cross(dx-1,dx-1, 0,3*dy/4,bp,cs) > 3 ) Break; - i1 =loop(bp,dx-1 , 0,dx,cs,0,LE); if( i1>dx/4 ) Break; - i1+=loop(bp,dx-1-i1, 0,dx,cs,1,LE); if( i1>dx/4 ) Break; i1=dx-1-i1; - i2 =loop(bp, 0,dy-1,dx,cs,0,RI); if( i2>dx/4 ) Break; - for(y=0;ydx/16+1) x-=dx/16+1; - j=loop(bp,x,y,dx,cs,0,RI); // fprintf(stderr,"\n x=%d j=%d",x,j); - if( j>(dx+4)/8 ) ad=96*ad/100; - if( j>(dx+2)/4 ) break; - } if( yp,cs,NULL) != 1 ) Break; - if (sdata->holes.num != 1) Break; - - ac=CENT_SIGN; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - - } - // --- test EURO_CURRENCY_SIGN ----------------------------------------- - if( bc==UNKNOWN ) - for(ad=98;dx>4 && dy>6;){ // provisorium - DBG( wchar_t c_ask='&'; ) - if (sdata->holes.num > 1) break; /* tolerant against a tiny hole */ - if( num_cross(dx/2,dx/2, 0,dy-1,bp,cs) != 4 ) break; - if( num_cross( 0,dx-1, 0, 0,bp,cs) != 1 ) break; - if( num_cross( 0,dx-1,dy-1,dy-1,bp,cs) != 1 ) break; - if( num_cross( 0,dx-1,dy/2,dy/2,bp,cs) != 1 ) break; - for(i=0,y=dy/4;ydx/4 ) break; - j=loop(bp,x,y,dx,cs,1,RI); if( j>i ) i=j; - } if( ydx/2 ) break; - } if( y>=dy-dy/4-1 ) break; - // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 0 ) break; - if (sdata->holes.num != 0) break; - ac=EURO_CURRENCY_SIGN; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - } - // --- test LETTER_C_WITH_CEDILLA --------------------------------------------------- - if (bc==UNKNOWN) - if (gchar) - for(ad=98;dx>3 && dy>6;){ // provisorium - DBG( wchar_t c_ask='c'; ) - if (sdata->holes.num > 0) break; /* no tolerant against tiny holes */ - j=loop(bp,dx-1,dy/16 ,dy,cs,0,LE); - x=loop(bp,dx-1,dy/16+1,dy,cs,0,LE); if (xdx) Break; // ~4 ocr-b - if( num_cross(0,dx-1,3*dy/16,3*dy/16,bp,cs) > 2 ) break; - if( num_cross(0,dx-1, 0, dy-1,bp,cs) < 2 ) break; - if( num_cross(0,dx-1, dy/16, dy/16,bp,cs) > 2 ) break; - for( x=dx,i2=y=dy/4; y<3*dy/4; y++ ){ - j=loop(bp,0,y,dx,cs,0,RI); if(j0 ) break; i1=x; - for( x=0,i4=y=dy/4; y<5*dy/8; y++ ){ - j=loop(bp,dx-1,y,dx,cs,0,LE); if(j>x) { i4=y; x=j; } - } if( xdy/4) break; - j =loop(bp,dx/2,j,dy,cs,0,DO); if(j3*dx) break; - j =loop(bp,dx-1-j/2,dy-1-dy/8,dy,cs,0,UP); if(j>dy/2) break; // ~() - // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 0 ) break; - if (sdata->holes.num) break; - if( hchar ) ac= LATIN_CAPITAL_LETTER_C_WITH_CEDILLA; - else ac= LATIN_SMALL_LETTER_C_WITH_CEDILLA; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - - } - // --- test # --------------------------------------------------- - for(ad=99;dx>4 && dy>4;){ // never sure? - DBG( wchar_t c_ask='#'; ) - if (sdata->holes.num > 2) Break; /* tolerant against a tiny hole */ - if (sdata->holes.num < 1) Break; - if( num_cross(0,dx-1, dy/8, dy/8,bp,cs) != 2 ) Break; - if( num_cross(0,dx-1,dy-1-dy/8,dy-1-dy/8,bp,cs) != 2 ) Break; - if( num_cross(0,dx-1, dy/2, dy/2,bp,cs) != 2 ) Break; - if( num_cross(0,dx/2, dy/2, dy/2,bp,cs) != 1 ) Break; - /* fat "#" have only small ends on left and right side, we tolerate this */ - j=loop(bp, 0,dy/8,dx,cs,0,RI); if(j<1 || j=dx/2) Break; if (j=dx/2) Break; if (j3*dx/4) { i1=0; break; } - j=loop(bp,j, y,dx,cs,1,RI); if(j>i1) { i1=j; } - j=loop(bp,0,dy-1-y,dx,cs,0,RI); if(j>3*dx/4) { i1=0; break; } - j=loop(bp,j,dy-1-y,dx,cs,1,RI); if(j>i3) { i3=j; } - } - if (i1holes.num != 1) {ad=95*ad/100;} - if( num_hole(x0+dx/8,x1-dx/8,y0+dy/8,y1-dy/8,box1->p,cs,NULL) != 1 ) Break; - // if( num_hole(x0 ,x1 ,y0 ,y1 ,box1->p,cs,NULL) != 1 ) Break; - - ac=(wchar_t) '#'; - if( gchar ) {ad=99*ad/100;} - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - } - // --- test bullet, full_box, grabbed cursor, ZapfDingBats_156 - if (bc==UNKNOWN) - for(ad=96;dx>4 && dy>4 && 2*dx>dy;){ // provisorium - DBG( wchar_t c_ask='#'; ) - if( get_bw(x0,x1,y0,y1,box1->p,cs,2) != 0 ) break; - ac=BULLET; - if (gchar && !hchar) ad=80*ad/100; - Setac(box1,ac,ad); - if (ad>=100) return ac; - break; - } - /* --- test | (vertical line, could be a I or l) --- */ - for(ad=99;dy>4 && 2*dxp,cs,2) != 0 ) break; - /* more unsure if the borders are not exact */ - if( get_bw(x0 ,x0+dx/8,y0+dy/9,y1-dy/9,box1->p,cs,2) != 0 ) ad=99*ad/100; - if( get_bw(x1-dx/8,x1 ,y0+dy/9,y1-dy/9,box1->p,cs,2) != 0 ) ad=99*ad/100; - if( get_bw(x0+dx/8,x1-dx/8,y0 ,y0+dy/8,box1->p,cs,2) != 0 ) ad=99*ad/100; - if( get_bw(x0+dx/8,x1-dx/8,y1-dy/8,y1 ,box1->p,cs,2) != 0 ) ad=99*ad/100; - if (3*dxm2 && 2*y1> box1->m2+box1->m3) Break; - if (box1->m2 && 3*y1>2*box1->m2+box1->m3) ad=95*ad/100; - ac='|'; - if (!hchar) ad=98*ad/100; - Setac(box1,ac,ad); - break; - } - // --- test % --------------------------------------------------- - for(ad=100;dx>5 && dy>7;){ // provisorium - DBG( wchar_t c_ask='%'; ) - if (sdata->holes.num > 2) break; /* tolerant against a tiny hole */ - if( num_cross(x0,x1 ,y0+dy/4,y0+dy/4,box1->p,cs) != 3 - && num_cross(x0,x1 ,y0+dy/8,y0+dy/8,box1->p,cs) != 3 ) Break; - if( num_cross(x0,x1+dx/4,y1-dy/4,y1-dy/4,box1->p,cs) != 3 - && num_cross(x0,x1+dx/4,y1-dy/8,y1-dy/8,box1->p,cs) != 3 ) Break; - if( num_cross(x0,x1, y0, y1,box1->p,cs) < 4 - && num_cross(x0+dx/8,x1, y0, y1,box1->p,cs) < 4 - && num_cross(x0,x1+dx/4, y0, y1,box1->p,cs) < 4 - && dx>7 && dy>15) Break; - if( num_cross(x0,x1, y0, y1,box1->p,cs) !=5 ) ad=99*ad/100; - - if (dx>7 && dy>12) { - if( num_hole(x0 ,x1 ,y0,y1-dy/4,box1->p,cs,NULL) != 1 ) Break; - if( num_hole(x0+dx/4,x1+dx/4,y0+dy/4,y1,box1->p,cs,NULL) != 1 ) Break; - if( num_hole(x0 ,x1+dx/4,y0,y1 ,box1->p,cs,NULL) != 2 ) Break; - } else ad=98*ad/100; - // use box1->p instead of b, because % is a sum of 3 objects - if ( loop(box1->p,x0,y0 ,dx,cs,0,RI) - <= loop(box1->p,x0,y0+dy/16+1,dx,cs,0,RI) ) ad=96*ad/100; // X - if ( loop(box1->p,x1,y1 ,dx,cs,0,LE) - <= loop(box1->p,x1,y1-1-dy/16,dx,cs,0,LE) ) ad=96*ad/100; // X - for (x=0;xp,cs,2) != 2 ) break; - } if (x=100) return ac; - break; - } - // --- test Omega --------------------------------------------------- - for(ad=d=99;dx>7 && dy>7;){ // min 3x4 - DBG( wchar_t c_ask=GREEK_CAPITAL_LETTER_OMEGA; ) - if( get_bw(x0 , x0+dx/2,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/2 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y0+dy/3 , y1-dy/3,box1->p,cs,1) != 0 ) Break; - - if( num_cross(x0+dx/2,x0+dx/2,y0 , y1-dy/3,box1->p,cs) != 1 ) Break; - if( num_cross(x0+dx/3,x1-dx/3,y0 , y0 ,box1->p,cs) != 1 ) // AND - if( num_cross(x0+dx/3,x1-dx/3,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; - if( num_cross(x0+dx/3,x1-dx/3,y1 , y1 ,box1->p,cs) != 2 ) // against "rauschen" - if( num_cross(x0+dx/3,x1-dx/3,y1-1 , y1-1 ,box1->p,cs) != 2 ) Break; - if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - if (sdata->holes.num) Break; - // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 0 ) break; - - if( loop(bp,0 ,0 ,x1-x0,cs,0,RI)<= - loop(bp,0 ,2 ,x1-x0,cs,0,RI) ) Break; - if( loop(bp,dx/2,dy-dy/4,x1-x0,cs,0,RI)>dx/4 - || loop(bp,dx/2,dy-dy/4,x1-x0,cs,0,LE)>dx/4 ) Break; - if( loop(bp,dx/2,3*dy/8,x1-x0,cs,0,RI)dx/8) Break; - x=loop(bp,i,dy-1-dy/16,x1-x0,cs,1,RI); i+=x; if(i<3*dx/8 || i>dx/2) Break; - x=loop(bp,i,dy-1-dy/16,x1-x0,cs,0,RI); i+=x; if(i5*dx/8) Break; - x=loop(bp,i,dy-1-dy/16,x1-x0,cs,1,RI); i+=x; if(i<7*dx/8) Break; - - /* look for a vertikal gap at lower end */ - for( x=dx/4;x<3*dx/4;x++ ){ - i=loop(bp,x,dy-1,y1-y0,cs,0,UP); - if( i>3*dy/4 ) break; - } - if( x>=3*dx/4 ) Break; - - if( !hchar ) ad=60*ad/100; - bc=GREEK_CAPITAL_LETTER_OMEGA; - Setac(box1,bc,ad); - break; - } - - return bc; -} - -// -------------------- OCR engine ;) ---------------------------- -wchar_t ocr0(struct box *box1, pix *bp, int cs){ - // pix p=*(box1->p); - int i,j,d,x,y,x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; - int dx=x1-x0+1,dy=y1-y0+1, /* size */ - rx,ry,r1,r2,i1,i2,ad; /* tmp-vars */ - // ad,ac will be used in future - wchar_t bc = UNKNOWN; // bestletter - wchar_t um = SPACE; // modifier '" - int hchar; // char is higher than e - int gchar; // char has ink lower than m3 - int aa[4][4]; /* corner points, see xX, (x,y,dist^2,vector_idx) v0.41 */ - ocr0_shared_t sdata; // data used in all subfunctions - - sdata.box1=box1; - sdata.bp=bp; - sdata.cs=cs; - // --- hchar --- gchar ------------------------- - hchar=0;if( y0 < box1->m2-(box1->m2-box1->m1)/2 ) hchar=1; - gchar=0;if( y1 > box1->m3+(box1->m4-box1->m3)/2 ) gchar=1; - // if the char is slightly moved down correction can be done - if ( y0m2 && y1>box1->m3 && 2*y1m3+box1->m4) // moved - if( 2*(y0-(y1-box1->m3))<=2*box1->m2-(box1->m2-box1->m1) ) hchar=1; - - sdata.hchar=hchar; - sdata.gchar=gchar; - - /* search for nearest points to the 4 courners, typical for xX */ - /* this is faster as calling nearest_frame_vector 4 times */ - aa[0][0]=aa[1][0]=aa[2][0]=aa[3][0]=(x0+x1)/2; /* set to center */ - aa[0][1]=aa[1][1]=aa[2][1]=aa[3][1]=(y0+y1)/2; /* set to center */ - aa[0][2]=aa[1][2]=aa[2][2]=aa[3][2]=2*sq(128); /* distance to box edges */ - aa[0][3]=aa[1][3]=aa[2][3]=aa[3][3]=0; /* vector index */ - /* searching for 4 diagonal line ends */ - for (i=0;inum_frame_vectors[0];i++) { - x=box1->frame_vector[i][0]; /* take a vector */ - y=box1->frame_vector[i][1]; - /* distance to upper left end, normalized to 128 */ - j=0; d=sq((x-x0)*128/dx)+sq((y-y0)*128/dy); - // fprintf(stderr," setaa i= %2d xy= %3d %3d d=%5d aa[3]=%2d\n",i,x-x0,y-y0,d,aa[0][3]); - if (dnum_frames>0) // speedup v0.42 - num_hole(x0,x1,y0,y1,box1->p,cs,&sdata.holes); // call once - // printf(" num_holes=%d\n",sdata.holes.num); - - /* - after division of two glued chars, boundaries could be wrong, - check this first (ToDo: only if a flag set?) - */ - if (2*y0 < box1->m2+box1->m3) - if (box1->m4>box1->m3 && 2*box1->y1>box1->m4+box1->m3){ - /* could be a "I" from divided "Ij" or "Ig" */ - for(y=(box1->m3+box1->m2)/2;2*ym3+box1->m4;y++) - if( get_bw(x0,x1,y,y,box1->p,cs,1)==0 ) break; - if(2*ym3+box1->m4) - if( get_bw((x0+x1)/2,(x0+x1)/2,y,box1->m4,box1->p,cs,1)==0 ){ - /* be sure, ~_ */ - if (y>y0) y1=box1->y1=y; - } - } - - DBG( IFV fprintf(stderr,"\nDBG L%d (%d,%d): ",__LINE__,box1->x0,box1->y0); ) - DBG( IFV out_b(box1,sdata.bp,0,0,dx,dy,160); ) - DBG( IFV fprintf(stderr,"# aa[] %d %d %d %d %d %d %d %d (4 corners)" - " d= %d %d %d %d", - aa[0][0]-x0,aa[0][1]-y0,aa[1][0]-x0,aa[1][1]-y0, - aa[2][0]-x0,aa[2][1]-y0,aa[3][0]-x0,aa[3][1]-y0, - aa[0][2], aa[1][2], aa[2][2], aa[3][2]);) - DBG( IFV fprintf(stderr,"\n# holes %d gchar=%d hchar=%d",sdata.holes.num, gchar, hchar);) - - // --- test thin lines - --------------------------------- - for( ad=100; 2*dym3-box1->m2 && 3*dx>=4*dy && dx>2; ){ // min 3x3 (small font) - DBG( wchar_t c_ask='-'; ) - if( get_bw(x0+dx/8+1,x1-dx/8-1,y0+dy/8+((dy>2)?1:0), - y1-dy/8-((dy>2)?1:0),box1->p,cs,2)==2 ) break; - if( box1->dots ) { Setac(box1,'=',97);break; } - if (dx<=2*dy) ad=98*ad/100; - if (dx<=3*dy) ad=99*ad/100; - if (!box1->m4) ad=96*ad/100; - else { - if (y1>=box1->m3) { - if ( dx<2*dy) ad=98*ad/100; - if (2*dx<3*dy) ad=98*ad/100; - Setac(box1,'_',ad); - break; - } - } - Setac(box1,'-',ad); if (ad>=100) return '-'; - break; - } - // --- test thin lines = --------------------------------- - for( ; dy>2 && dx>2; ){ // min 3x3 (small font) - DBG( wchar_t c_ask='='; ) - for( y=y0;yp,cs,1)==1 ) break; - if( get_bw(x0+dx/10,x1-dx/10,y ,y ,box1->p,cs,2)==2 ) break; - if( get_bw(x0 ,x1 ,(y+y1)/2,(y+y1)/2,box1->p,cs,1)==1 ) break; - if( get_bw(x0+dx/10,x1-dx/10,y1 ,y1 ,box1->p,cs,2)==2 ) break; - Setac(box1,'=',100); - return '='; - } - // --- test dots : --------------------------------- - for( ad=100; dy>2 && dy>=2*dx; ){ // max 3x3 (small font) - - DBG( wchar_t c_ask=':'; ) - // check the gap hight - for( i1=dy/16;i1p,cs,1)==0 ) break; - if (i1>=dy/2) break; - for( i2=dy/16;i2p,cs,1)==0 ) break; - if (i2>=dy/2) Break; - MSG(fprintf(stderr,"gap y12 %d %d",i1,i2);) - - if (box1->m3 && y1>box1->m3) ad=98*ad/100; // ~; - if (box1->m3 && 2*y0> box1->m2+box1->m1) ad=98*ad/100; // ~i - if (gchar) ad=99*ad/100; - ad=ad-abs(i1-i2)/dy*20; - if (abs(i1-dx)>dy/4) Break; // round or quadratic dots? - if (abs(i1-dx)>dy/8) ad=98*ad/100; - if (abs(i2-dx)>dy/4) Break; // round or quadratic dots? - if (abs(i2-dx)>dy/8) ad=98*ad/100; - if (box1->dots!=1) ad=96*ad/100; - Setac(box1,':',ad); // dx<=3 ad-- - if (ad>=100) return ':'; - break; - } - // --- test dots ; --------------------------------- - if( 2*y0> box1->m2+box1->m1 ) // ~i - if( 4*y1>=3*box1->m3+box1->m2 ) // ~: - for( ad=100; dy>5 && dx>1 && dy>2*dx; ){ // max 3x3 (small font) - DBG( wchar_t c_ask=';'; ) - // better would it be to detect round pixelcluster on top - // check high of upper and lower dot - for( i1=0;i1p,cs,1)==0 ) break; - if (i1>=dy/2) break; - for( i2=0;i2p,cs,1)==0 ) break; - if (i2m3) ad=97*ad/100; - if (i2-i1=100) return ';'; - break; - } - // --- first test small dots . --------------------------------- - if( 3*dym4-box1->m1 && abs(dx-dy)<(dx+dy)/4+2 - && 3*y1>=(2*box1->m3+ box1->m2) // dot near baseline? - && 5*y0>=(3*box1->m3+2*box1->m2) ){ // Jul00 - DBG( wchar_t c_ask='.'; ) - d=0; r1=60;r2=140; ad=99; - for(x=x0;x<=x1;x++)for(y=y0;y<=y1;y++){ /* circle equation */ - rx=100*(2*x-(x0+x1))/dx; // normalize to 15bit number - ry=100*(2*y-(y0+y1))/dy; - if( rx*rx + ry*ry < r1*r1 ) if( getpixel(box1->p,x,y)>=cs ){ d++;x=x1+1;y=y1+1; } - if( rx*rx + ry*ry > r2*r2 ) if( getpixel(box1->p,x,y)< cs ){ d++;x=x1+1;y=y1+1; } - // fprintf(stderr,"\nDBG . x= %3d %3d r= %6d %6d %6d", rx, ry, rx*rx+ry*ry, r1*r1, r2*r2); - } - if(d==0) - if( loop(box1->p,x0,y0,x1-x0,cs,0,RI) - <= loop(box1->p,x0,y1,x1-x0,cs,0,RI) - || loop(box1->p,x1,y0,x1-x0,cs,0,LE) - >= loop(box1->p,x1,y1,x1-x0,cs,0,LE) ) - { - bc='.'; if (box1->dots) { Setac(box1,':',ad); ad=98*ad/100; } - Setac(box1,bc,ad); - } - } - // --- first test small dots , --------------------------------- - if( 3*dy<2*(box1->m4-box1->m1) - && 2*y0> box1->m2+box1->m3 - && (2*dx<3*dy - || get_bw(0,dx/2,dy/2,dy-1,bp,cs,1)==0) ){ // ocr-a-, - DBG( wchar_t c_ask=','; ) - ad=100; bc=','; - if (dy==1 && dx==1) ad=98*ad/100; - if (dy==2 && dx==1) ad=99*ad/100; // this is a problem case - if (dx>=dy) ad=99*ad/100; - if( 2*dy >= box1->m4-box1->m1) ad=98*ad/100; - if( loop(box1->p,x0,y0,x1-x0,cs,0,RI) /* simple line */ - > loop(box1->p,x0,y1,x1-x0,cs,0,RI) - && loop(box1->p,x1,y0,x1-x0,cs,0,LE) - < loop(box1->p,x1,y1,x1-x0,cs,0,LE) ) { ad=99*ad/100; } - else { /* with upper circle */ - if( loop(box1->p,x0,(y0+y1+1)/2,x1-x0,cs,0,RI)p,x1, y1 ,x1-x0,cs,0,LE)p,x0,y1-((dy>5)?1:0),x1-x0,cs,0,LE)>(dx+1)/2 ) - if( loop(box1->p,x0, y1 ,x1-x0,cs,0,LE)>(dx+1)/2 ) ad=96*ad/100; - } - if(box1->dots==1) { Setac(box1,';',ad); ad=99*ad/100; } - Setac(box1,bc,ad); - } - // --- first test small dots '" --------------------------------- - if( 2*dy < box1->m4 -box1->m1+1 - && 2*y0 < box1->m2 +box1->m3 - && 3*y1 < box1->m2+2*box1->m3+2 ){ - DBG( wchar_t c_ask='\''; ) - ad=100; bc='\''; - if (2*y1 >= box1->m2+box1->m3) { ad=96*ad/100; MSG({}) } // ~! - if (3*y1>=2*box1->m2+box1->m3) { ad=96*ad/100; MSG({}) } - if (get_bw(x0,x1,(box1->m2+box1->m3)/2,box1->m4,box1->p,cs,1)!=0) - { ad=98*ad/100; MSG({}) } - if (dx>4 - && num_cross(x0,x1,y1,y1,box1->p,cs) == 2) { // " " - bc='"'; - // ocr-a-" has no gap! - if ( get_bw((x0+x1)/2,(x0+x1)/2,y0,y1,box1->p,cs,1)!=0 ) ad=96*ad/100; - } else { - if ( num_cross(x0,x1, y0 , y0 ,box1->p,cs)!=1) ad=96*ad/100; - if ( num_cross(x0,x1,(y0+y1)/2,(y0+y1)/2,box1->p,cs)!=1) ad=98*ad/100; - if (dx>dy) { ad=96*ad/100; MSG({}) } - } - if (2*y0 > box1->m1+box1->m2) ad=99*ad/100; - Setac(box1,bc,ad); - if (ad>=100) return bc; - } - // --- TILDE ~ --------------------------------- - if( 2*dym4-box1->m1 && dx>=dy && dx>3 && dy>1 - && 2*y0< box1->m1+box1->m2 - && 3*y1<2*box1->m2+box1->m3 ){ - if( loop(box1->p,x0,y0,dx,cs,0,RI) - > loop(box1->p,x0,y1,dx,cs,0,RI) - && loop(box1->p,x1,y0,dx,cs,0,LE) - < loop(box1->p,x1,y1,dx,cs,0,LE) - && num_cross(x0,x1,y0,y0,box1->p,cs) == 2 - && num_cross(x0,x1,y1,y1,box1->p,cs) == 2 ) { - DBG( wchar_t c_ask='~'; ) - bc=TILDE; - Setac(box1,bc,99); - } - } - // --- CIRCUMFLEX, hat ^ --------------------------------- - if( 2*dym4-box1->m1 && dx>=dy && dx>2 && dy>1 - && 2*y0< box1->m1+box1->m2 - && 3*y1<2*box1->m2+box1->m3 ){ - DBG( wchar_t c_ask='^'; ) - if( ( loop(box1->p,x0,y0 ,dx,cs,0,RI) - > loop(box1->p,x0,y1 ,dx,cs,0,RI)-dx/8 - || loop(box1->p,x0,y0 ,dx,cs,0,RI) - > loop(box1->p,x0,y1-1,dx,cs,0,RI)-dx/8 ) - && ( loop(box1->p,x1,y0 ,dx,cs,0,LE) - > loop(box1->p,x1,y1 ,dx,cs,0,LE)-dx/8 - || loop(box1->p,x1,y0 ,dx,cs,0,LE) - > loop(box1->p,x1,y1-1,dx,cs,0,LE)-dx/8 ) - && num_cross(x0,x1,y0 ,y0 ,box1->p,cs) == 1 - && ( num_cross(x0,x1,y1 ,y1 ,box1->p,cs) == 2 - || num_cross(x0,x1,y1-1,y1-1,box1->p,cs) == 2 )) { - bc='^'; - Setac(box1,bc,99); - } - } - // ------------------------------------------------------ -// if( dots==1 ){ um='\''; } -#if 0 /* ToDo: change to vectors, call here or in whatletter */ - if (box1->dots==0) { // i-dots ??? (if dots==0 is wrong) - y=box1->m1; - for(;yp,cs,1)==1) break; - { i1=y; - if( yp,cs,1)==0) break; - if( ybox1->m2-box1->m1){ - testumlaut(box1,cs,2,&um); // set modifier + new y0 ??? - - } - } - } -#else - um = box1->modifier; -#endif - if ( /* um==ACUTE_ACCENT || */ um==DIAERESIS){ - for(y=y1;y>y0;y--) - if( get_bw(x0,x1,y,y,box1->p,cs,1)==0) { y0=y; dy=y1-y0+1; break; } // scan "a "o "u - } - - // --- test numbers 0..9 --- separated for faster compilation - if( JOB->cfg.only_numbers ) return ocr0n(&sdata); - - // bc=ocr1(box1,bp,cs); - if(bc!=UNKNOWN && box1->num_ac>0 && box1->wac[0]==100) - return bc; // for fast compilable tests - - // ------ separated for faster compilation - // ToDo: inser ocr0_shared_t here and split into a,b,cC,d,e,f,g9,... -#define IF_NOT_SURE if(bc==UNKNOWN || box1->num_ac==0 || box1->wac[0]<100) - - IF_NOT_SURE bc=ocr0_eE(&sdata); - IF_NOT_SURE bc=ocr0_f(&sdata); - IF_NOT_SURE bc=ocr0_bB(&sdata); - IF_NOT_SURE bc=ocr0_dD(&sdata); - IF_NOT_SURE bc=ocr0_F(&sdata); - IF_NOT_SURE bc=ocr0_uU(&sdata); - IF_NOT_SURE bc=ocr0_micro(&sdata); - IF_NOT_SURE bc=ocr0_vV(&sdata); - IF_NOT_SURE bc=ocr0_rR(&sdata); - IF_NOT_SURE bc=ocr0_m(&sdata); - IF_NOT_SURE bc=ocr0_tT(&sdata); - IF_NOT_SURE bc=ocr0_sS(&sdata); - IF_NOT_SURE bc=ocr0_gG(&sdata); - IF_NOT_SURE bc=ocr0_xX(&sdata); - IF_NOT_SURE bc=ocr0_yY(&sdata); - IF_NOT_SURE bc=ocr0_zZ(&sdata); - IF_NOT_SURE bc=ocr0_wW(&sdata); - IF_NOT_SURE bc=ocr0_aA(&sdata); - IF_NOT_SURE bc=ocr0_cC(&sdata); - IF_NOT_SURE bc=ocr0_lL(&sdata); - IF_NOT_SURE bc=ocr0_oO(&sdata); - IF_NOT_SURE bc=ocr0_pP(&sdata); - IF_NOT_SURE bc=ocr0_qQ(&sdata); - IF_NOT_SURE bc=ocr0_iIjJ(&sdata); - IF_NOT_SURE bc=ocr0_n(&sdata); - IF_NOT_SURE bc=ocr0_M(&sdata); - IF_NOT_SURE bc=ocr0_N(&sdata); - IF_NOT_SURE bc=ocr0_h(&sdata); - IF_NOT_SURE bc=ocr0_H(&sdata); - IF_NOT_SURE bc=ocr0_k(&sdata); - IF_NOT_SURE bc=ocr0_K(&sdata); - IF_NOT_SURE bc=ocr0n(&sdata); - IF_NOT_SURE bc=ocr0_brackets(&sdata); - IF_NOT_SURE bc=ocr0p9(&sdata); - IF_NOT_SURE bc=ocr0px(&sdata); - - - if(box1->num_ac==0 && bc!=UNKNOWN) fprintf(stderr,""); - if(box1->num_ac>0 && box1->wac[0]>95) box1->c=bc=box1->tac[0]; - /* will be removed later, only fix old things */ - for (i=0;inum_ac;i++) if (box1->tac[i]==bc) { bc=box1->tac[0]; } - - return bc; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.h deleted file mode 100644 index 4c67d77ba..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef _OCR0_H -#define _OCR0_H -#include "pgm2asc.h" - -/* ---------------------------------------------------------------- - - functions with thousand of lines make the compilation very slow - therefore the ocr0-function is splitted in subfunctions - - shared data used often in ocr0-subroutines are stored - in ocr0_shared structure. - * ------------------------------------------------------------ */ - -typedef struct ocr0_shared { /* shared variables and properties */ - - struct box *box1; /* box in whole image */ - pix *bp; /* extracted temporarly box, cleaned */ - int cs; /* global threshold value (gray level) */ - - /* ToDo: or MACROS: X0 = box1->x0 */ - int x0, x1, y0, y1; /* box coordinates related to box1 */ - int dx, dy; /* size of box */ - int hchar, gchar; /* relation to m1..m4 */ - int aa[4][4]; /* corner points, see xX (x,y,dist^2,vector_idx) v0.41 */ - holes_t holes; /* list of holes (max MAX_HOLES) */ - -} ocr0_shared_t; - -/* tests for umlaut */ -int testumlaut(struct box *box1, int cs, int m, wchar_t *modifier); -/* detect chars */ -wchar_t ocr0(struct box *box1, pix *b, int cs); -/* detect numbers */ -wchar_t ocr0n(ocr0_shared_t *sdata); - -static inline int sq(int x) { return x*x; } /* square */ - -/* - * go from vector j1 to vector j2 and measure maximum deviation of - * the steps from the line connecting j1 and j2 - * return the squared maximum distance - * in units of the box size times 1024 - */ -int line_deviation( struct box *box1, int j1, int j2 ); - -/* - * search vectors between j1 and j2 for nearest point a to point r - * example: - * - * r-> $$...$$ $ - mark vectors - * @@$..@@ @ - black pixels - * @@$..@@ . - white pixels - * @@@@.$@ - * a-> @@$@$@@ - * @$.@@@@ - * @@..$@@ - * @@..$@@ - * j1 --> $$...$$ <-- j2 - * - * ToDo: vector aa[5] = {rx,ry,x,y,d^2,idx} statt rx,ry? - * j1 and j2 must be in the same frame - * return aa? - */ -int nearest_frame_vector( struct box *box1, int j1, int j2, int rx, int ry); -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0n.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0n.c deleted file mode 100644 index c833c5886..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr0n.c +++ /dev/null @@ -1,1254 +0,0 @@ -/* ocr-engine numbers only */ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2007 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL-address - - OCR engine (c) Joerg Schulenburg - first engine: rule based --- numbers 0..9 - -*/ - -#include -#include -/* #include "pgm2asc.h" */ -#include "ocr0.h" -#include "ocr1.h" -#include "gocr.h" - -/* only for debugging and development */ -#define IFV if(JOB->cfg.verbose&4) -#define MM {IFV fprintf(stderr,"\nDBG %c L%04d (%d,%d): ",(char)c_ask,__LINE__,box1->x0,box1->y0);} - -/* the old debug mode (0.40) was only for a special char, for another char - * code must be recompiled with C_ASK='char' - * new debug mode (0.41) explains why char is declined or accepted as ABC... - * the output can be filtered by external scripts - * ToDo: we could reduce output to filter string - */ -#ifndef DO_DEBUG /* can be defined outside */ -#define DO_DEBUG 0 /* 0 is the default */ -#endif - -/* this macro is for debugging output: "if char is declined, why?" */ -#if DO_DEBUG /* 0=Work mode, 1=debugging mode */ -// Setac: output, that char is choosen with a probability -// Break: output, why the char is not choosen -// MSG: debugging functions for char C_ASK, mostly messages -// DBG: definitions usefull only for debugging -#define Setac(box1,ac,ad) { MM;IFV fprintf(stderr,"setac %d",ad);setac(box1,ac,ad); } -#define Break { MM;IFV fprintf(stderr,"break"); break; } -#define MSG(x) { MM;IFV x } -#define DBG(x) x -#else -#define Setac(box1,ac,ad) setac(box1,ac,ad) -#define Break break -#define MSG(x) -#define DBG(x) -#endif - -/* extern "C"{ */ - -// OCR engine ;) -wchar_t ocr0n(ocr0_shared_t *sdata){ - struct box *box1=sdata->box1; - pix *bp=sdata->bp; - int d,x,y,x0=box1->x0,x1=box1->x1,y0=box1->y0,y1=box1->y1; - int dx=x1-x0+1,dy=y1-y0+1,cs=sdata->cs; // size - int xa,xb,ya,yb, /* tmp-vars */ - i1,i2,i3,i4,i,j; - int (*aa)[4]=sdata->aa; /* corner-points, (x,y,dist^2,vector_idx) */ - wchar_t bc=UNKNOWN; // best char - int ad=0; // propability 0..100 - int hchar=sdata->hchar; // char is higher than 'e' - int gchar=sdata->gchar; // char has ink lower than m3 - int dots=box1->dots; - // --- test 5 near S --------------------------------------------------- - for(ad=d=100;dx>2 && dy>4;){ // min 3x4 - DBG( char c_ask='5'; ) - if (sdata->holes.num > 1) Break; /* be tolerant */ - if( num_cross( dx/2, dx/2,0,dy-1,bp,cs)!=3 - && num_cross(5*dx/8,3*dx/8,0,dy-1,bp,cs)!=3 ) Break; - - i1=loop(bp,dx-1,dy-1,dx,cs,0,LE); - i2=loop(bp,dx-1,dy-2,dx,cs,0,LE); - if (i2-i1 >= dx/4) Break; // ~{ 5x7font - - // get the upper and lower hole koords, y around dy/4 ??? - x=5*dx/8; - y =loop(bp,x,0,dy,cs,0,DO); if(y>dy/8) Break; - y +=loop(bp,x,y,dy,cs,1,DO); if(y>dy/4) Break; - i1 =loop(bp,x,y,dy,cs,0,DO)+y; if(i1>5*dy/8) Break; - i3=y=(y+i1)/2; // upper end can be shifted to the right for italic - x =loop(bp,0,y,dx,cs,0,RI); if(x>4*dx/8) Break; - x +=loop(bp,x,y,dx,cs,1,RI); if(x>5*dx/8) Break; - i1 =loop(bp,x,y,dx,cs,0,RI); i1=(i1+2*x)/2; // upper center (i1,i3) - y=11*dy/16; - x =loop(bp,dx-1 ,y,dx,cs,0,LE); if(x>dx/4) Break; - x +=loop(bp,dx-1-x,y,dx,cs,1,LE); if(x>dx/2) Break; - i2 =loop(bp,dx-1-x,y,dx,cs,0,LE); i2=dx-1-(i2+2*x)/2; // lower center x - - MSG( fprintf(stderr,"i1,i3=%d,%d i2=%d (upper+lower center)",i1,i3,i2);) - - y =loop(bp,i1,0,dy,cs,0,DO); - y +=loop(bp,i1,y,dy,cs,1,DO); - y =(3*y+i3)/4; - if( num_cross( i1, dx-1, y, y,bp,cs)>0 ){ /* S or serif5 ? */ - y =loop(bp,i1 ,i3,dy,cs,0,DO); - i =loop(bp,i1-1,i3,dy,cs,0,DO); - if (y>i ) ad=99*ad/100; /* looks like S */ - y =loop(bp,i1 ,i3,dy,cs,0,UP); - i =loop(bp,i1+1,i3,dy,cs,0,UP); - if (ii ) ad=99*ad/100; /* looks like S */ - if( num_cross( 0, dx/2, dy-1, dy-1,bp,cs)>1 - && num_cross( dx/2,dx-1, 0, 0,bp,cs)>1 ) ad=98*ad/100; /* serifs */ - if (loop(bp,0,dy-1,dx,cs,0,RI)==0) ad=98*ad/100; /* S or 7segment */ - ad=99*ad/100; - } - - for(y=dy/5;y<3*dy/4;y++) // right gap? - if( num_cross(i1,dx-1,y,y,bp,cs)==0 ) break; - if( y==3*dy/4 ) Break; - - for(y=dy/4;y<=11*dy/16;y++) // left gap? - if( num_cross(0,i2,y,y,bp,cs)==0 ) break; - if( y>11*dy/16 ) Break; - - // if( num_hole( x0, x1, y0, y1, box1->p,cs,NULL) > 0 ) break; - if (sdata->holes.num>0) Break; - - // sS5 \sl z left upper v-bow ? - for(x=dx,i=y=dy/4;yi2 ) i2=i; - i3=loop(bp,0, y ,dx,cs,0,RI); - i =loop(bp,0, y-1,dx,cs,0,RI); if( i=20 && dx<16 ) /* tall S */ - if( loop(bp,0, dy/5 ,dx,cs,0,RI) - ==loop(bp,0, dy/4 ,dx,cs,0,RI) - && - loop(bp,0, dy/10 ,dx,cs,0,RI) - >loop(bp,0, dy/4 ,dx,cs,0,RI) - && - loop(bp,0, 1 ,dx,cs,0,RI) - >loop(bp,0, dy/4 ,dx,cs,0,RI)+1 - && - loop(bp,dx-1, 0 ,dx,cs,0,LE) - >loop(bp,dx-1, 1 ,dx,cs,0,LE) ) Break; - - if( dy>=30 && dx>15 ) /* large S */ - if( loop(bp,dx/4,3*dy/10,dy,cs,1,DO)>0 ) // check start - if( loop(bp,dx-2,3*dy/4 ,dy,cs,1,UP)>0 ) // check end - if( num_cross(dx/4,dx-2,3*dy/10,3*dy/4,bp,cs)==1 ) Break; // connected? - - if( dy>17 && dx>9 ) /* S */ - if( loop(bp, 0,dy/2 ,dx,cs,0,RI)0 ) // check start - if( loop(bp,dx-2,2*dy/3 ,dy,cs,1,UP)>0 ) // check end - if( loop(bp, 0, dy/16,dx,cs,0,RI) - >= loop(bp,dx-1, dy-1-dy/16,dx,cs,0,LE) ) ad=ad*98/100; - if( loop(bp,dx-1, dy/16,dx,cs,0,LE) - >= loop(bp, 0, dy-1-dy/16,dx,cs,0,RI) - && loop(bp,dx-1, dy/16,dx,cs,0,LE) - >= loop(bp, 0, dy-1,dx,cs,0,RI) ) ad=ad*98/100; - - if ( gchar) ad=99*ad/100; - if (!hchar) ad=99*ad/100; - Setac(box1,(wchar_t)'5',ad); - if (ad==100) return '5'; - break; - - } - // --- test 1 --------------------------------------------------- - for(ad=d=100;dy>4 && dy>dx && 2*dy>box1->m3-box1->m2;){ // min 3x4 - DBG( char c_ask='1'; ) - if( dots==1 ) Break; - if (sdata->holes.num > 1) Break; /* be tolerant */ - - if( num_cross(0, dx-1, 0 , 0 ,bp,cs) != 1 - && num_cross(0, dx-1, 1 , 1 ,bp,cs) != 1 ) Break; - if( num_cross(0, dx-1,dy/2,dy/2,bp,cs) != 1 ) Break; - if( num_cross(0, dx-1,dy-1,dy-1,bp,cs) != 1 - && num_cross(0, dx-1,dy-2,dy-2,bp,cs) != 1 ) Break; - /* 5x7 micr - - ooo - .$. ooo - $@. oo - .$. oo - .@. ooooo - .$. ooooo - $@$ ooooo - - */ - - i4=0; // human font - if( num_cross(0, dx-1,3*dy/4,3*dy/4,bp,cs) != 2 ) { // except ocr-a - for( y=1; y=dy/2) ad=98*ad/100; - for( i=dy/8,y=7*dy/16;y8 && !i ) Break; - } else { // ocr-a-1 - /* @@@.. - ..@.. - ..@.. - ..@.. - ..@.@ - ..@.@ - @@@@@ */ - i= loop(bp,dx/2,0,dy,cs,0,DO); - if (loop(bp,dx/2,i,dy,cs,1,DO) 1 - && num_cross(0, dx-1, 1 , 1 ,bp,cs) > 1 ) Break; // ~/it_7 - - // calculate upper and lower mass center (without lower serif) - - x =loop(bp,0,7*dy/8-1,dx,cs,0,RI); i2=x; - x+=loop(bp,x,7*dy/8-1,dx,cs,1,RI)-1; i2=(i2+x)/2; - - i1=loop(bp,dx-1 ,1+0* dy/4,dx,cs,0,LE); i1=dx-1-i1-(x-i2)/2; - - x =(i1-i2+4)/8; i1+=x; i2-=x; - - if( get_line2(i1,0,i2,dy-1,bp,cs,100)<95 ) { // dont work for ocr-a-1 - i1=loop(bp,dx-1 ,1+0* dy/4,dx,cs,0,LE); i1=dx-1-i1; - if( get_line2(i1,0,i2,dy-1,bp,cs,100)<95 ) Break; - } - // upper and lower width - x =loop(bp,(i1+i2)/2,dy/2,dx,cs,1,RI); i=x; i3=0; - for(y=0;y<7*dy/8;y++) - if( loop(bp,i1+y*(i2-i1)/dy, y,dx,cs,1,RI)-i > 1+dx/8 ) break; - if(y<7*dy/8) ad=98*ad/100; // serif or ocr-a-1 ? - if(y<6*dy/8) ad=99*ad/100; /* MICR E-13B font Jan07 */ - if(y<4*dy/8) Break; -// out_x(box1); printf(" i12=%d %d\n",i1,i2); - x =loop(bp,i2,dy-1,dx,cs,1,LE); j=x; - x =loop(bp,i2,dy-2,dx,cs,1,LE); if(x>j)j=x; i=j; - x =loop(bp,i2,dy-1,dx,cs,1,RI); j=x; - x =loop(bp,i2,dy-2,dx,cs,1,RI); if(x>j)j=x; - if(abs(i-j)>1+dx/8) i3|=1; - if(i3) Break; -// out_x(box1);printf(" 11 i=%d j=%d i2=%d dx=%d\n",i,j,i1,dx); - // get most left upper point (i,j) - for(i=dx,j=y=0;y<7*dy/16;y++){ - x =loop(bp,0,y,dx,cs,0,RI); if(x 7*dx/16 MICR E-13B font - if ( i1-i<4*dx/16 ) Break; - x =loop(bp,0,dy/2,dx,cs,0,RI); // right distance - j =loop(bp,x,dy/2,dx,cs,1,RI); // thickness - if( j>x+(dy+16)/32 ) ad=98*ad/100; // ~l but MICR E-13B font - x =loop(bp,0,0,dx,cs,0,RI); // straight line ??? - j =loop(bp,0,1,dx,cs,0,RI); if( j>x ) Break; // ~l - if( x==j ) j =loop(bp,0,dy/8,dx,cs,0,RI); if( j>x && !i4) Break; - if( x==j ) if(loop(bp,0,dy/4,dx,cs,0,RI)>x) { // ~l - // check micr-1 first before taken as 'l' - if (loop(bp,dx-1,dy/8,dx,cs,0,LE)<=dx/4 - && loop(bp,0,3*dy/4,dx,cs,1,RI)=x ) Break; x=j; // ~l -// j =loop(bp,0, 0,dx,cs,0,DO); if( !j ) Break; // ~7 - if( !hchar ) // ~ right part of n - if( loop(bp,dx-1, 1,dx,cs,0,LE)-dy/6 - > loop(bp,dx-1,dy/4,dx,cs,0,LE) - || get_bw(x1+1,x1+2,y0,y0+dy/8,box1->p,cs,1)==1 ) Break; // Mai00 - if( loop(bp,dx-1,3*dy/4,dx,cs,0,LE) > dx/2 - && get_bw(x1-dx/4,x1,y1-1,y1,box1->p,cs,1)==1 ) Break; // ~z Jun00 - - i=loop(bp, dx/8,0,dy,cs,0,DO); - for (y=dy,x=dx/2;x<3*dx/4;x++){ /* get upper end */ - j=loop(bp,x,0,dy,cs,0,DO); if (j=i) ad=97*ad/100; // ~\tt l ??? ocr-a_1 - - if( loop(bp, 0, dy/8,dx,cs,0,RI) - -(dx-loop(bp,dx-1,7*dy/8,dx,cs,0,LE)) > dx/4 ) Break; // ~/ - - i= loop(bp, 0, 0,dy,cs,0,DO); // horizontal line? - if(dy>=12 && i>dy/8 && iloop(bp,dx-1, i,dx,cs,0,LE) - || loop(bp,dx-1,3*dy/16,dx,cs,0,LE)-dx/8 - >loop(bp,dx-1, i+1,dx,cs,0,LE) ) Break; // ~t,~f - i= loop(bp, 0,dy-1-dy/32,dx,cs,0,RI); - x= loop(bp, 0,dy-2-dy/32,dx,cs,0,RI); if (idx/8 - && loop(bp,dx-1, 3*dy/4,dx,cs,0,LE)-dx/8 - >loop(bp,dx-1,dy-1-dy/32,dx,cs,0,LE) ) Break; // ~t - if( loop(bp, 0,i-1,dx,cs,0,RI)>1 && dx<6) { - ad=99*ad/100; - if ( loop(bp,dx-1,i-1,dx,cs,0,LE)>1 ) Break; // ~t - } - } - - if (dx>8){ - if (loop(bp,0,3*dy/4,dx,cs,0,RI)- - loop(bp,0,dy/2-1,dx,cs,0,RI)>dx/4) ad=95*ad/100; // ~3 - if (loop(bp,dx-1,dy/2-1,dx,cs,0,LE)- - loop(bp,dx-1,3*dy/4,dx,cs,0,LE)>dx/8) ad=95*ad/100; // ~3 - if (loop(bp,dx-1, dy/16,dx,cs,0,LE)- - loop(bp,dx-1, dy/4,dx,cs,0,LE)>dx/8) ad=95*ad/100; // ~23 - } - /* font 5x9 "2" recognized as "1" */ - i=loop(bp,dx-1-dx/8,dy-1,dy,cs,0,UP); - if (i<=dy/4) { - i+=loop(bp,dx-1-dx/8,dy-1-i,dy,cs,1,UP); - if (i<=dy/4) { - i=loop(bp,dx-1-dx/8,dy-1-i,dy,cs,0,LE); - if (2*i>=dx && loop(bp,dx/4,0,dy,cs,0,DO)i+dx/8) { break; } - } if (y>=dy/2) ad=95*ad/100; // Feb07 care plates, right black border - - if (sdata->holes.num > 0) Break; // mini holes should be filtered - if (!box1->m3 && ad>98) ad=98; else { - if (!hchar) ad=99*ad/100; - if (box1->y0>box1->m2) ad=98*ad/100; - if (box1->y1<(1*box1->m2+3*box1->m3)/4) ad=98*ad/100; - if (box1->y1-box1->y0<(box1->m3-box1->m1)/2) ad=98*ad/100; - if ( gchar) ad=99*ad/100; - } - - Setac(box1,(wchar_t)'1',ad); - break; - } - // --- test 2 old pixelbased - remove! ----------------------------- -#ifdef Old_pixel_based - for(ad=d=100;dx>2 && dy>4;){ // min 3x4 - DBG( char c_ask='2'; ) - if (sdata->holes.num > 1) Break; /* be tolerant */ - if( get_bw(x0+dx/2, x0+dx/2 , y1-dy/5, y1 ,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2, x0+dx/2 , y0 , y0+dy/5,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/8, x1-dx/3 , y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; - - if( get_bw(x1-dx/3, x1 , y0+dy/3 , y0+dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0 , x0+dx/ 8, y1-dy/16, y1 ,box1->p,cs,1) != 1 ) Break; - if( num_cross(x0, x1-dx/8, y0+dy/2, y0+dy/2,box1->p,cs) != 1 ) Break; - if( get_bw(x0, x0+dx/9 , y0 , y0 ,box1->p,cs,1) == 1 - && get_bw(x0, x0+dx/2 ,y0+3*dy/16,y0+3*dy/16,box1->p,cs,1) == 1 ) Break; - if( get_bw(x0, x0+dx/9 , y0 , y0 ,box1->p,cs,1) - != get_bw(x1-dx/9, x1 , y0 , y0 ,box1->p,cs,1) ) - { if (dx<6 && dy<9) ad=99*ad/100; else Break; } - // out_x(box1); - - for( x=x0+dx/4;xp,cs) == 2 ) break; - if( x>=x1-dx/6 ) Break; - - for( x=x0+dx/4;xp,cs) == 2 ) break; - if( x>=x1-dx/6 ) Break; - - for(i=1,y=y0;yp,cs) == 2 ) i=0; - if( i ) ad=99*ad/100; // ToDo: ocr-a-2 should have 100% - - for(i=1,y=y0+dy/5;yp,cs,1) == 0 ) i=0; - if( i ) Break; - - x=x1-dx/3,y=y1; /* center bottom */ - turmite(box1->p,&x,&y,x0,x1,y0,y1,cs,UP,ST); if( yp,&x,&y,x0,x1,y0,y1,cs,ST,UP); if( yp,&x,&y,x0,x1,y0,y1,cs,UP,ST); if( yp,&x,&y,x0,x1,y0,y1,cs,RI,ST); - if( xp,&x,&y,x0,x1,y0,y1,cs,UP,ST); if( yp,&x,&y,x0,x1,y0,y1,cs,RI,ST); - if( xp,x1,y0+y,dx,cs,0,LE); // use p (not b) for broken chars - if( ix ) x=i; - } - if (y>dy/3 ) Break; // z - - // hole is only allowed in beauty fonts - // if( num_hole( x0, x1, y0, y1,box1->p,cs,NULL) > 0 ) // there is no hole - // if( num_hole( x0, x0+dx/2, y0, y0+dy/2,box1->p,cs,NULL) == 0 ) // except in some beauty fonts - if (sdata->holes.num>0) - if (sdata->holes.hole[0].x1 >= dx/2 || sdata->holes.hole[0].y1 >= dy/2) - Break; - - i1=loop(bp,dx-1-dx/16,0,dy,cs,0,DO); // Jul00 - i2=loop(bp, dx/ 2,0,dy,cs,0,DO); if( i2+dy/32>=i1 ) Break; // ~z - i1=loop(bp,dx-1,dy-3*dy/16,dx,cs,0,LE); - i2=loop(bp, 0,dy-3*dy/16,dx,cs,0,RI); if( i2>i1 ) ad=98*ad/100; // ~i - if (dots) ad=98*ad/100; // i - if (loop(bp,dx-1,dy-1-dy/16,dx,cs,0,LE)>dx/4) ad=96*ad/100; // \it i - - if ((!hchar) && box1->m4!=0) ad=80*ad/100; - Setac(box1,(wchar_t)'2',ad); - if (ad==100) return '2'; - break; - } -#endif - // --- test 2 new edge based v0.44 -------------------------------------- - for(ad=d=100;dx>2 && dy>4;){ // min 3x4 - // rewritten for vectors 0.42 - int ld, i1, i2, i3, i4, i5, i6, i7; // line derivation + corners - DBG( wchar_t c_ask='2'; ) - if (sdata->holes.num > 0) Break; /* no hole */ - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the lower ends, must be near to the corner */ - if (aa[1][2]>d/4) Break; /* [2] = distance, ~7... */ - if (aa[2][2]>d/2) Break; /* [2] = distance, ~r... */ - if (aa[0][2]>d/1) Break; /* [2] = distance, ~d... */ - if (aa[3][2]>d/1) Break; /* [2] = distance, ~bhk... */ - /* searching for 4 notches between neighbouring ends */ - -/* - type A B - - 1OOO OO - 2 1 2 <- 6 - 7-> OOOO O - O O <- 5 - 3OO4 3OO4 -*/ - - /* get a point on the inner low left side of the J */ - i =box1->num_frame_vectors[0] - 1; - /* rightmost point on upper left side */ - i2=nearest_frame_vector(box1, aa[0][3], aa[1][3], x1+dx, y0+dy/4); - /* upper leftmost vector */ - i1=nearest_frame_vector(box1, aa[0][3], i2, x0-dx, (y0+y1)/2); - i3=aa[1][3]; - /* low leftmost vector */ - i5=nearest_frame_vector(box1, aa[2][3], aa[3][3], x0, y1); - /* low mostright vector */ - i4=nearest_frame_vector(box1, aa[1][3], i5, x1+dx, y1); - /* next local max_x-point after i5 */ - i6=i5; - for (i=i5;i!=aa[0][3];i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[ i][0] - >box1->frame_vector[i6][0]) i6=i; // get next maximum - if (box1->frame_vector[ i][0]frame_vector[ i][1]frame_vector[i6][0]>x0+dx/2) break; // 5 - } - /* which type? ToDo: have a more sure algorithm */ - i7=nearest_frame_vector(box1, i2, i3, x0-dx/8, (y0+y1)/2); - if (box1->frame_vector[i7][0]<=x0+ dx/4 - && box1->frame_vector[i7][1]<=y0+2*dy/3) { - MSG(fprintf(stderr,"7-segment-type");) - } else { /* regular-book-type */ - if (aa[3][0]>=x1-dx/8 - && aa[3][1]<=y0+dy/8) ad=99*ad/100; - if (aa[0][0]<=x0+dx/8 - && aa[0][1]<=y0+dy/8) ad=99*ad/100; - if (aa[3][2]<=aa[1][2]) ad=97*ad/100; - } - // ToDo: output no=(x,y) - MSG(fprintf(stderr,"i1-7 %d %d %d %d %d %d %d",i1,i2,i3,i4,i5,i6,i7);) - if (i5==i6) Break; // ~+ - - if (box1->frame_vector[i5][1] - -box1->frame_vector[i6][1]frame_vector[i1][1]>y0+dy/2) Break; // not to low - if (box1->frame_vector[i1][0]>x0+dx/8) Break; - if (box1->frame_vector[i2][1]>(y0+ y1)/2) Break; - if (box1->frame_vector[i2][1]>(5*y0+3*y1)/8) ad=99*ad/100; - if (box1->frame_vector[i2][0]<(x0+x1+1)/2) Break; // fat tiny fonts? - if (box1->frame_vector[i2][0]<(x0+2*x1)/3) ad=99*ad/100; - if (box1->frame_vector[i3][0]>(3*x0+x1)/4) Break; - if (box1->frame_vector[i3][0]>(7*x0+x1)/8) ad=99*ad/100; - if (box1->frame_vector[i3][1]<(y0+3*y1)/4) Break; - if (box1->frame_vector[i3][1]>(y0+7*y1)/8) ad=99*ad/100; - /* check lower leftmost point from right side */ - if (box1->frame_vector[i5][0]>(x0+2*x1)/3) Break; - if (box1->frame_vector[i5][0]>(x0+ x1)/2) ad=98*ad/100; - if (box1->frame_vector[i5][0]>(2*x0+x1)/3) ad=99*ad/100; - if (box1->frame_vector[i5][1]<(3*y0+5*y1)/8) Break; - if (box1->frame_vector[i5][1]<(y0+3*y1)/4) ad=99*ad/100; - if (box1->frame_vector[i6][1]>(y0+2*y1)/3) Break; - if (box1->frame_vector[i6][1]>(y0+ y1)/2) ad=99*ad/100; - if (box1->frame_vector[i6][0]<(x0+3*x1)/4) Break; - if (box1->frame_vector[i6][0]<(x0+7*x1)/8) ad=99*ad/100; - - /* check for zZ */ - - /* check if lower left and right points are joined directly */ - ld=line_deviation(box1, i3, i4); - MSG(fprintf(stderr," i1-i2 %d %d dist= %d/%d",i1,i2,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - if (ld > sq(1024/4)) ad=99*ad/100; - - if (box1->m3) { - if(!hchar){ ad=99*ad/100; } - if( gchar){ ad=99*ad/100; } - } else { if (ad==100) ad=99; } /* not 100% sure */ - Setac(box1,'2',ad); - if (ad==100) return '2'; - break; - } - // --- test 3 ------- - for(ad=d=100;dx>3 && dy>4;){ // dy<=dx nicht perfekt! besser mittleres - // min-suchen fuer m - DBG( char c_ask='3'; ) - if (sdata->holes.num > 1) Break; /* be tolerant */ - // if( get_bw(x0+dx/2,x0+dx/2,y0,y0+dy/4,box1->p,cs,1) == 0 ) Break; // ~4 - // if( get_bw(x0+dx/2,x0+dx/2,y1-dy/8,y1,box1->p,cs,1) == 0 ) Break; // ~4 - // if( num_cross(x0+dx/2,x0+dx/2,y0 ,y1,box1->p,cs) < 2 ) Break; - // if( num_cross(x0+dx/4,x0+dx/4,y1-dy/2,y1,box1->p,cs) == 0 ) Break; - if( get_bw(dx/2,dx/2, 0,dy/6,bp,cs,1) == 0 ) Break; // ~4 - if( get_bw(dx/2,dx-1, dy/6,dy/6,bp,cs,1) == 0 ) Break; // ~j - if( get_bw(dx/2,dx/2,dy-1-dy/8,dy-1,bp,cs,1) == 0 ) Break; // ~4 - if( num_cross(dx/2,dx/2,0 ,dy-1,bp,cs) < 2 // normal - && num_cross(dx/3,dx/3,0 ,dy-1,bp,cs) < 2 ) Break; // fat LCD - if( num_cross(dx/4,dx/4,dy-1-dy/2,dy-1,bp,cs) == 0 ) Break; - if( loop(bp,dx/2, 0 ,dy,cs,0,DO)>dy/4 ) Break; - if( loop(bp,dx/2, dy-1,dy,cs,0,UP)>dy/4 ) Break; - if( loop(bp,dx-1, dy/3,dy,cs,0,LE)>dy/4 /* 3 with upper bow */ - && loop(bp,dx-1, dy/8,dy,cs,0,LE)>dy/4 /* 3 with horizontal line */ - && loop(bp,dx/4, dy/8,dy,cs,1,RI)dy/4 ) Break; - if( loop(bp,dx-1,3*dy/4,dy,cs,0,LE)>dy/2 ) Break; // ~2 Feb06 - if( loop(bp,dx-1,7*dy/8,dy,cs,0,LE)>dy/2 ) Break; // ~2 Feb06 - // search upper right half circle - for( i3=x=0,i1=y=dy/5;yx) { i3=x=i; i1=y; } - } i3--; if (i31+dx/8) ad=ad*99/100; // ~1 with a pixel - // search lower right half circle - for( i4=x=0,i2=y=dy-1-dy/8;y>=dy/2;y-- ){ - i=loop(bp,0,y,dx,cs,0,RI); - if( i>x ) { i4=x=i;i2=y; } - } i4--; if(i41+dx/8) ad=ad*99/100; // ~1 with a pixel - - for( x=xa=0,ya=y=dy/4;y<3*dy/4;y++ ){ // right gap, not on LCD-font - i=loop(bp,dx-1,y,dx,cs,0,LE); - if (i>=xa) { xa=i;ya=y;x=xa+loop(bp,dx-1-xa,y,dx,cs,1,LE); } - } if (dy>3*dx) if (xa<2 && x-xa1+dx/8 // noLCD - && xa<=loop(bp,dx-1,i2,dx,cs,0,LE)) ad=ad*99/100; // ~1 with a pixel - if (xa>1+dx/8 // noLCD - && xa<=loop(bp,dx-1,i1,dx,cs,0,LE)) ad=ad*99/100; // ~1 with a pixel - - - if( get_bw(i3,i3,i1,i2 ,bp,cs,1) != 1 ) Break; - if( get_bw(i4,i4,i1,i2 ,bp,cs,1) != 1 ) Break; - if( get_bw(i3,i3,0 ,i1 ,bp,cs,1) != 1 ) Break; - if( get_bw(i4,i4,i1,dy-1,bp,cs,1) != 1 ) Break; // m like - // hole is only allowed in beauty fonts - // if( num_hole( x0, x1, y0, y1,box1->p,cs,NULL) > 0 ) // there is no hole - // if( num_hole( x0, x0+dx/2, y0, y0+dy/2,box1->p,cs,NULL) == 0 ) // except in some beauty fonts - if (sdata->holes.num>0) - if (sdata->holes.hole[0].x1 >= dx/2 || sdata->holes.hole[0].y1 >= dy/2) - Break; - Setac(box1,(wchar_t)'3',ad); - if (ad==100) return '3'; - break; - } - // --- test 4 --------------------------------------------------- 25Nov06 - for(ad=d=100;dy>3 && dx>2;){ // min 3x4 ~holes.num > 1) Break; /* no or one hole */ - /* half distance to the center */ - d=2*sq(128/4); - /* now we check for the lower left end, must be far away */ - if (aa[1][2]num_frame_vectors[0] - 1; - /* leftmost upper point */ - i1=nearest_frame_vector(box1, 0, i, x0, y0-dy); - /* lowest from leftmost vector can be very low (20/23) */ - i2=nearest_frame_vector(box1, 0, i, x0-2*dx, (y0+7*y1)/8); - /* lowest vector */ - i4=nearest_frame_vector(box1, 0, i, (x0+2*x1)/3, y1+dy); - /* right center crossing point */ - i3=nearest_frame_vector(box1, i2, i4, x1, (3*y0+y1)/4); - /* get a point on the outer right side below top serif */ - /* next local max_y-point after i4 */ - i5=i4; - for (i=i4;i!=i2;i=(i+1)%box1->num_frame_vectors[0]) { - if (box1->frame_vector[ i][1] - frame_vector[i5][1]) i5=i; // get next maximum - if (box1->frame_vector[ i][1] - >box1->frame_vector[i5][1]+1) break; // break after maximum - if (box1->frame_vector[ i][0]num_frames>1) { // type C D - i = box1->num_frame_vectors[0] - 1; // end outer loop - j = box1->num_frame_vectors[1] - 1; // end inner loop - i6=nearest_frame_vector(box1, i+1, j, x1, y1); - i7=nearest_frame_vector(box1, i+1, j, x0, y1); - if (box1->frame_vector[i1][0] - -box1->frame_vector[i2][0]frame_vector[i ][0]-x0frame_vector[i ][1]-y07) ad=97*ad/100; // q - - } else { // type A B - i6=nearest_frame_vector(box1, i5, i1, (x0+3*x1)/4, y1-dy/8); - i7=nearest_frame_vector(box1, i5, i1, x0 , y1-dy/8); - MSG(fprintf(stderr,"open type");) - } - // ToDo: output no=(x,y) - MSG(fprintf(stderr,"i1-7 %d %d %d %d %d %d %d",i1,i2,i3,i4,i5,i6,i7);) - if (i5==i6) Break; // ~+ - - if (box1->frame_vector[i1][1]>y0+dy/8) Break; // not to low - if (box1->frame_vector[i2][1] - -box1->frame_vector[i1][1]frame_vector[i3][0] - -box1->frame_vector[i2][0]frame_vector[i3][1] - -box1->frame_vector[i2][1])>dy/4) Break; - if (box1->frame_vector[i2][0]>x0+dx/8) Break; - if (box1->frame_vector[i2][1]>y1-dy/8) Break; - if (box1->frame_vector[i4][1] - -box1->frame_vector[i2][1]frame_vector[i4][1] - -box1->frame_vector[i2][1]frame_vector[i4][1] - -box1->frame_vector[i3][1]<1+dy/16) Break; - if (box1->frame_vector[i4][1] - -box1->frame_vector[i3][1]frame_vector[i4][1] - -box1->frame_vector[i3][1]frame_vector[i4][1]frame_vector[i3][0]frame_vector[i3][0]frame_vector[i3][1]>y1-1) Break; - if (box1->frame_vector[i3][1]>y1-dy/16) Break; - if (box1->frame_vector[i3][1]>=y1) Break; // ~5x5# - if (box1->frame_vector[i5][0]frame_vector[i5][1]>y0+2*dy/3) Break; - if (box1->frame_vector[i6][1] - -box1->frame_vector[i5][1]<1+dy/16) Break; - if (box1->frame_vector[i6][0]frame_vector[i7][0]>x0+dx/2) Break; - if (box1->frame_vector[i7][0]>x0+dx/3) ad=ad*99/100; - if (box1->frame_vector[i6][1]frame_vector[i6][0]frame_vector[i6][0]=y1-1-dy/8) ad=96*ad/100; // ~ 42 - if (box1->frame_vector[i7][1]frame_vector[i3][1] - -box1->frame_vector[i2][1])>dy/4) Break; - - /* check if upper left and lower left points are joined directly */ - ld=line_deviation(box1, i1, i2); - MSG(fprintf(stderr," i1-i2 %d %d dist= %d/%d",i1,i2,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - /* check if lower right and upper right points are joined directly */ - ld=line_deviation(box1, i2, i3); - MSG(fprintf(stderr," i2-i3 %d %d dist= %d/%d",i2,i3,ld,2*sq(1024/4));) - if (ld > sq(1024/4)) Break; - /* check if lower right and upper right points are joined directly */ - ld=line_deviation(box1, i3, i4); - MSG(fprintf(stderr," i3-i4 %d %d dist= %d/%d",i3,i4,ld,2*sq(1024/4));) - if (ld > sq(1024/4)) Break; - /* check if lower right and upper right points are joined directly */ - ld=line_deviation(box1, i6, i7); - MSG(fprintf(stderr," i6-i7 %d %d dist= %d/%d",i6,i7,ld,2*sq(1024/4));) - if (ld >2*sq(1024/4)) Break; - - // 4 exists as gchar and ~gchar - if(!hchar){ ad=99*ad/100; } - Setac(box1,'4',ad); - break; - } -#ifdef Old_pixel_based - // --- old test 4 pixelbased ------- remove! - for(ad=d=100;dx>3 && dy>5;){ // dy>dx, min 4x6 font - DBG( char c_ask='4'; ) - if (sdata->holes.num > 2) Break; /* be tolerant */ - if (sdata->holes.num > 1) ad=97*ad/100; - // upper raising or vertical line - if( loop(bp,0 ,3*dy/16,dx,cs,0,RI) - < loop(bp,0 ,2*dy/4 ,dx,cs,0,RI)-dx/8 ) Break; - // search for a vertical line on lower end - for (y=0;y= dx/2 ) break; - if (y>=dy/4) Break; - if( loop(bp,0 ,dy-1-dy/8,dx,cs,0,RI) < dx/4 ) Break; - // --- follow line from (1,0) to (0,.7) - y=0; x=loop(bp,0,0,dx,cs,0,RI); - if (x<=dx/4) { // ocr-a-4 - i=loop(bp,0,dy/4,dx,cs,0,RI); if (i>dx/4) Break; - i=loop(bp,i,dy/4,dx,cs,1,RI); if (i>dx/2) Break; - j=loop(bp,i,dy/4,dy,cs,0,DO)+dy/4; if (j>7*dy/8) Break; - } - turmite(bp,&x,&y,0,dx-1,0,dy-1,cs,DO,LE); if( x>=0 ) Break; - - y=loop(bp,0,0,dy,cs,0,DO); - if( (y+loop(bp,0,y,dy,cs,1,DO)) < dy/2 ) Break; - if( get_bw(x0 , x0+3*dx/8, y1-dy/7, y1-dy/7,box1->p,cs,1) == 1 ) Break; - if( get_bw(x0+dx/2, x1 , y1-dy/3, y1-dy/3,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2, x0+dx/2, y0+dy/3, y1-dy/5,box1->p,cs,1) != 1 ) Break; - i=loop(bp,bp->x-1, bp->y/4,dx,cs,0,LE); - if( i > loop(bp,bp->x-1,2*bp->y/4,dx,cs,0,LE)+1 - && i > loop(bp,bp->x-1,3*bp->y/8,dx,cs,0,LE)+1 ) Break; - if (loop(bp,0,0,dx,cs,0,RI)>dx/4) { - for(i=dx/8+1,x=0;x15 && i ) Break; - for(i=dy/10+1,y=dy-1-dy/4;yp,cs,NULL); - // ToDo: - // - get start and endpoint of left edge of left vert. line - // and check if that is an streight line - // - check the right edge of the inner hole (if there) too - i4 = sdata->holes.num; - if (sdata->holes.num >0) { // ~q - i = loop(bp,0,dy/16,dx,cs,0,RI); - if (i < dx/3) Break; - if (i < dx/2) ad=98*ad/100; // hole? - if ( loop(bp, 0,dy-1,dy,cs,0,UP) - -loop(bp,dx/8+1,dy-1,dy,cs,0,UP)>dy/16) ad=97*ad/100; - } - // thickness of left vertical line - for (j=y=0;yj) j=i; - } - if (j>=dx/2) ad=98*ad/100; // ~q handwritten a (or very thinn 4) - // ToDo: check y of masscenter of the hole q4 - - if( i4 ) if( dx > 15 ) - if( loop(bp, dx/2, 0,dy,cs,0,DO)3*dx/4 - && i-loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE)>dx/4 ) Break; - - i =loop(bp,dx-1-dx/4,dy-1,dx,cs,0,UP); - if (i> dy/2) ad=97*ad/100; - if (i>3*dy/4) ad=97*ad/100; /* handwritten n */ - - if( num_cross(0 ,dx-1,dy/16 ,dy/16 , bp,cs) == 2 // ~9 - && loop(bp,dx-1,dy/16 ,dx,cs,0,LE)> - loop(bp,dx-1,dy/16+1+dy/32,dx,cs,0,LE) ) Break; - if ( !hchar) ad=99*ad/100; - if (gchar && !hchar) ad=98*ad/100; // ~q - Setac(box1,(wchar_t)'4',ad); - if (ad>99) bc='4'; - break; - } -#endif - // --- test 6 ------- ocr-a-6 looks like a b :( - for(ad=d=100;dx>3 && dy>4;){ // dy>dx - DBG( char c_ask='6'; ) - if (sdata->holes.num > 2) Break; /* be tolerant */ - if( loop(bp, 0, dy/4,dx,cs,0,RI)>dx/2 // ocr-a=6 - && loop(bp,dx-1, 0,dy,cs,0,DO)>dy/4 ) Break; // italic-6 - if( loop(bp, 0, dy/2,dx,cs,0,RI)>dx/4 ) Break; - if( loop(bp, 0,3*dy/4,dx,cs,0,RI)>dx/4 ) Break; - if( loop(bp,dx-1,3*dy/4,dx,cs,0,LE)>dx/2 ) Break; - if( num_cross(x0+ dx/2,x0+ dx/2,y0 ,y1 ,box1->p,cs) != 3 - && num_cross(x0+5*dx/8,x0+5*dx/8,y0 ,y1 ,box1->p,cs) != 3 ) { - if( num_cross(x0+ dx/2,x0+ dx/2,y0+dy/4,y1 ,box1->p,cs) != 2 - && num_cross(x0+5*dx/8,x0+5*dx/8,y0+dy/4,y1 ,box1->p,cs) != 2 ) Break; - // here we have the problem to decide between ocr-a-6 and b - if ( loop(box1->p,(x0+x1)/2,y0,dy,cs,0,DO)p,x0+dx/2,y0,dx,cs,0,DO)>dy/8 - && loop(box1->p,x1-dx/4,y0,dx,cs,0,DO)>dy/8 ) Break; - } - if( num_cross(x0 ,x1 ,y1-dy/4,y1-dy/4,box1->p,cs) != 2 ) Break; - for( y=y0+dy/6;yp,x1 ,y ,dx,cs,0,LE); if( x>dx/2 ) break; - x+=loop(box1->p,x1-x+1,y-1,dx,cs,0,LE); if( x>dx/2 ) break; - } if( y>=y0+dy/2 ) Break; - if (loop(box1->p,x0,y1-dy/3,dx,cs,0,RI)>dx/4 ) Break; - if (loop(box1->p,x1,y1-dy/3,dx,cs,0,LE)>dx/4 ) Break; - - if (sdata->holes.num != 1) Break; - if (sdata->holes.hole[0].y1 < dy/2) ad=95*ad/100; // whats good for? - if (sdata->holes.hole[0].y0 < dy/4) Break; -// if( num_hole ( x0, x1, y0, y0+dy/2,box1->p,cs,NULL) > 0 ) ad=95*ad/100; -// if( num_hole ( x0, x1, y0+dy/4, y1,box1->p,cs,NULL) != 1 ) Break; -// if( num_hole ( x0, x1, y0 , y1,box1->p,cs,NULL) != 1 ) Break; -// out_x(box1); printf(" x0 y0 %d %d\n",x0,y0); - /* check left vertical bow */ - i1=loop(bp,0,dy/8 ,dx,cs,0,RI); - i3=loop(bp,0,dy-1-dy/8,dx,cs,0,RI); - i2=loop(bp,0,dy/2 ,dx,cs,0,RI); - if(i1+i3-2*i2<-2-dx/16 && i1+i2+i3>0) Break; // convex from left - if(i1+i3-2*i2<1 && i1+i2+i3>0) ad=99*ad/100; // 7-segment-font - for( x=dx,y=0;ydx/2 && i2>dx/4) break; /* its a 6 (example: 7-segment) */ - if (i1x) break; /* may be serifen b */ - } if (y 1 ) i++; if( i>dy/8 ) break; - } if( ydots ) ad=98*ad/100; - Setac(box1,(wchar_t)'6',ad); - bc='6'; - break; - } - // --- test 7 --------------------------------------------------- - for(ad=d=100;dx>2 && dy>4;){ // dx>1 dy>2*dx - DBG( char c_ask='7'; ) - if (sdata->holes.num > 1) Break; /* be tolerant */ - if( loop(bp,dx/2,0,dy,cs,0,DO)>dy/8 ) Break; - if( num_cross(0,dx-1,3*dy/4,3*dy/4,bp,cs) != 1 ) Break; // preselect - for( yb=xb=y=0;y0 && j>dx/4) break; // gap after h-line - j=loop(bp,j,y,dx,cs,1,RI);if(j>xb){ xb=j;yb=y; } // h-line - } if( xbx ) x=j-1; - } if( yj) Break; - j=loop(bp, 0,j,dx,cs,0,RI); - if(j>dx/4 && j<=i+dx/16) Break; // tall T - } - - MSG( fprintf(stderr,"7: ad= %d",ad); ) - if( loop(bp, 0,3*dy/8,dx,cs,0,RI) - <=loop(bp,dx-1,3*dy/8,dx,cs,0,LE)+dx/8 ) ad=ad*98/100; // l - MSG( fprintf(stderr,"7: ad= %d",ad); ) - if( num_cross(0,dx-1,dy/4,dy/4,bp,cs) == 1 - && loop(bp,0,dy/4,dx,cs,0,RI) < dx/2 ) ad=ad*96/100; // J - MSG( fprintf(stderr,"7: ad= %d",ad); ) - - if (box1->m3 && dym3-box1->m2) ad=99*ad/100; // too small - if (box1->m3 && 2*dym3-box1->m2) ad=96*ad/100; // too small - if (dy>3*dx) ad=99*ad/100; // ) - if ( gchar) ad=99*ad/100; // J - if (!hchar) ad=99*ad/100; - Setac(box1,(wchar_t)'7',ad); - break; - } - // --- test 8 --------------------------------------------------- - // last change: May15th,2000 JS - for(ad=d=100;dx>2 && dy>4;){ // or we need large height - DBG( char c_ask='8'; ) - if (sdata->holes.num != 2) Break; - if( num_cross(x0,x1,y0 +dy/4,y0 +dy/4,box1->p,cs) != 2 ) Break; // ~gr (glued) - if( num_cross(x0,x1,y1 -dy/4,y1 -dy/4,box1->p,cs) != 2 - && num_cross(x0,x1,y1-3*dy/8,y1-3*dy/8,box1->p,cs) != 2 ) Break; - if( get_bw(x0,x0+dx/4,y1-dy/4,y1-dy/4,box1->p,cs,1) == 0 ) Break; // ~9 - if( get_bw(x0,x0+dx/2,y0+dy/4,y0+dy/4,box1->p,cs,1) == 0 ) Break; - if( get_bw(x0+dx/2,x0+dx/2,y0+dy/4,y1-dy/4,box1->p,cs,1) == 0 ) Break; // ~0 -// MSG( printf(" x0 y0 %d %d\n",x0,y0); ) - for( i2=i1=x=0,i=y=y0+dy/3;y<=y1-dy/3;y++){ // check left middle nick - j=loop(box1->p,x0,y,dx,cs,0,RI); - if (j>x || (abs(j-x)<=dx/8 /* care about MICR E-13B font */ - && (i1=loop(box1->p,x0+j,y,dx,cs,1,RI))>dx/2)) { - if (j>x) x=j; i=y; if (i1>i2) i2=i1; } - } if(i>=y1-dy/3 || (xdx/2) Break; // no gB - if (x< dx/4) ad=99*ad/100; // no B - if (x<=dx/8) ad=98*ad/100; // no B - j = loop(box1->p,x1,y1- dy/4,dx,cs,0,LE); - if( j>loop(box1->p,x1,y1- dy/5,dx,cs,0,LE) - && j>loop(box1->p,x1,y1-2*dy/5,dx,cs,0,LE) ) Break; // & - // check for upper hole - for (j=0;jholes.num;j++) { - if (sdata->holes.hole[j].y1 < i-y0+1 ) break; - if (sdata->holes.hole[j].y1 < i-y0+dy/8) break; - } if (j==sdata->holes.num) Break; // not found - // if( num_hole(x0,x1,y0,i+1 ,box1->p,cs,NULL)!=1 ) - // if( num_hole(x0,x1,y0,i+dy/8,box1->p,cs,NULL)!=1 ) Break; // upper hole - // check for lower hole - for (j=0;jholes.num;j++) { - if (sdata->holes.hole[j].y0 > i-y0-1 ) break; - } if (j==sdata->holes.num) Break; // not found - // if( num_hole(x0,x1,i-1,y1,box1->p,cs,NULL)!=1 ) Break; - i1=i; // left middle nick - /* find the middle right nick */ - for( x=0,i2=i=y=y0+dy/3;y<=y1-dy/3;y++){ - j=loop(box1->p,x1,y,dx,cs,0,LE); if( j>=x ) i2=y; - /* we care also for 7-segment and unusual fonts */ - if (j>x || (abs(j-x)<=(dx+4)/8 - && loop(box1->p,x1-j,y,dx,cs,1,LE)>dx/2)){ - if (j>x) x=j; i=y; } - // MSG(fprintf(stderr," yjix %d %d %d %d %d %d",y-y0,j,i-y0,x,loop(box1->p,x1-j,y,dx,cs,1,LE),dx/2);) - } - if( i>y0+dy/2+dy/10 ) Break; - // if( xdx/2 ) Break; - MSG(fprintf(stderr,"center bar at y= %d %d x=%d+%d i1=%d",i-y0,i2-y0,x,j,i1);) - if( num_cross(x0,x1, i , i ,box1->p,cs) != 1 - && num_cross(x0,x1, i+1 , i+1 ,box1->p,cs) != 1 - && num_cross(x0,x1,(i+i2)/2,(i+i2)/2,box1->p,cs) != 1 ) Break; // no g - if(abs(i1-i)>(dy+5)/10) ad=99*ad/100; // y-distance right-left-nick - if(abs(i1-i)>(dy+4)/8) ad=99*ad/100; // y-distance right-left-nick - if(abs(i1-i)>(dy+2)/4) Break; - // ~B ff - for(i=dx,y=0;yi+dx/16 ) break; - } if( yi+dx/16 ) break; - } if( y16 && num_cross(0,dx-1,dy-1,dy-1,bp,cs) > 1 - && loop(bp,0,dy-1,dx,cs,0,RI) 2 ) i++; if( i>dy/8 ) break; - } if( y 1) ad=98*ad/100; // & - if (num_cross(dx-1,dx-1,dy/2,dy-1,bp,cs) > 1) ad=98*ad/100; // & - if (num_cross( 0,dx-1, 0, 0,bp,cs) > 1) ad=98*ad/100; - if (dy>15) - if (num_cross( 0,dx-1, 1, 1,bp,cs) > 1) ad=98*ad/100; - /* if m1..4 is unsure ignore hchar and gchar ~ga */ - if (!hchar) { - if ((box1->m2-box1->y0)*8>=dy) ad=98*ad/100; - else ad=99*ad/100; - } - if ( gchar - && (box1->y1-box1->m3)*8>=dy) ad=99*ad/100; - Setac(box1,(wchar_t)'8',ad); - break; - } - // --- test 9 \it g --------------------------------------------------- - /* - * lcd micr - * ooo ooo - * o o o o - * ooo ooo - * o o - * ooo o - */ - for(ad=d=100;dx>2 && dy>4;){ // dx>1 dy>2*dx - DBG( char c_ask='9'; ) - if (sdata->holes.num > 1) Break; - if( num_cross(x0+ dx/2,x0+ dx/2,y0,y1-dy/4,box1->p,cs) != 2 // pre select - && num_cross(x0+ dx/2,x0+ dx/2,y0, y1,box1->p,cs) != 3 // pre select - && num_cross(x0+3*dx/8,x0+3*dx/8,y0,y1,box1->p,cs) != 3 - && num_cross(x0+ dx/4,x1 -dx/4,y0,y1,box1->p,cs) != 3 ) Break; - if( num_cross(x0+ dx/2,x0 +dx/2,y0,y0+dy/4,box1->p,cs) < 1 ) Break; - if( num_cross(x0+ dx/2,x1, y0+dy/2 ,y0+dy/2,box1->p,cs) < 1 ) Break; - if( num_cross(x0,x1, y0+ dy/4 ,y0+ dy/4,box1->p,cs) != 2 - && num_cross(x0,x1, y0+3*dy/8 ,y0+3*dy/8,box1->p,cs) != 2 ) Break; - if( num_cross(x1-dx/8,x1,y0+dy/4,y0+dy/4,box1->p,cs) == 0) ad=ad*97/100; // ~4 - for( x=0,i=y=y0+dy/2;y<=y1-dy/4;y++){ // find notch (suche kerbe) - j=loop(box1->p,x0,y,dx,cs,0,RI); - if( j>x ) { x=j; i=y; } - } if (x<1 || xp,x0+x-1,y,dy/8+1,cs,0,DO)/2; y=i=y+j; - j=loop(box1->p,x0+x-1,y,dx/2 ,cs,0,RI); x+=j; - if (x5) - if( num_cross(x0+dx/2,x1,i,y1 ,box1->p,cs) != 1 /* fails on 5x8 */ - && num_cross(x0+dx/2,x1,i,y1-dy/8,box1->p,cs) != 1 ) Break; - if( num_cross(x0+dx/2,x0+dx/2,i,y1,box1->p,cs) > 1 ) Break; - if( num_cross(x0+dx/2,x1 ,i, i,box1->p,cs) != 1 ) Break; - - if (sdata->holes.num < 1) { /* happens for 5x7 font */ - if (dx<8) ad=98*ad/100; else Break; } - else { - if (sdata->holes.hole[0].y1 >= i+1) Break; - if (sdata->holes.hole[0].y0 > i-1) Break; - if (sdata->holes.num > 1) - if (sdata->holes.hole[1].y0 > i-1) Break; - // if( num_hole(x0,x1,y0,i+1,box1->p,cs,NULL)!=1 ) Break; - // if( num_hole(x0,x1,i-1,y1,box1->p,cs,NULL)!=0 ) Break; - } - if( loop(box1->p,x0,y1 ,dy,cs,0,RI)>dx/3 && - loop(box1->p,x0,y1-1,dy,cs,0,RI)>dx/3 - && (box1->m3==0 || (box1->m3!=0 && (!hchar || gchar)))) ad=98*ad/100; // no q OR ocr-a-9 - for( x=0,i=y=y0+dy/3;y<=y1-dy/3;y++){ // suche kerbe - j=loop(box1->p,x1,y,dx,cs,0,LE); - if( j>x ) { x=j; i=y; } - } if( x>dx/2 ) Break; // no g - i1=loop(bp,dx-1,dy/8 ,dx,cs,0,LE); if(i1>dx/2) Break; - i3=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); - i2=loop(bp,dx-1,dy/2 ,dx,cs,0,LE); if(i1+i3-2*i2<-1-dx/16) Break; // konvex - i1=loop(bp,dx-1,dy/4 ,dx,cs,0,LE); if(i1>dx/2) Break; - i3=loop(bp,dx-1,dy-1-dy/8,dx,cs,0,LE); - for(y=dy/4;y0){ - x--; // robust - y=loop(bp,dx-x-1, dy-1,dy,cs,0,UP); - if(ym3) { - if( gchar) ad=99*ad/100; /* unsure */ - if(!hchar) ad=99*ad/100; /* unsure */ - } else { if (ad==100) ad=99; } /* not 100% sure */ - Setac(box1,(wchar_t)'9',ad); - break; - } - // 0 is same as O !? - // --- test 0 (with one big hole in it ) ----------------------------- - for(d=ad=100;dx>2 && dy>3;){ // min 3x4 - DBG( char c_ask='0'; ) - if (sdata->holes.num > 1) Break; /* be tolerant */ - if( get_bw(x0 , x0+dx/3,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/3 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - /* could be an O, unless we find a dot in the center */ - if( get_bw(x0 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 3 ) ad=99; - if( get_bw(x0+dx/2 , x0+dx/2,y1-dy/3 , y1,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/3,box1->p,cs,1) != 1 ) Break; - /* accept 0 with dot in center, accept \/0 too ... */ - if( get_bw(x0+dx/2 , x0+dx/2,y0+dy/3 , y1-dy/3,box1->p,cs,1) != 0 ) Break; - - if( num_cross(x0+dx/2,x0+dx/2,y0 , y1 ,box1->p,cs) != 2 ) Break; - if( num_cross(x0+dx/3,x1-dx/3,y0 , y0 ,box1->p,cs) != 1 ) // AND - if( num_cross(x0+dx/3,x1-dx/3,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; - if( num_cross(x0+dx/3,x1-dx/3,y1 , y1 ,box1->p,cs) != 1 ) // against "rauschen" - if( num_cross(x0+dx/3,x1-dx/3,y1-1 , y1-1 ,box1->p,cs) != 1 ) Break; - if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 1 ) Break; - if (sdata->holes.num != 1) Break; - - i= loop(bp,0 ,0 ,x1-x0,cs,0,RI)- - loop(bp,0 ,2 ,x1-x0,cs,0,RI); - if (i<0) Break; - if (i==0) { - if (loop(bp,dx-1,0 ,x1-x0,cs,0,LE)> - loop(bp,dx-1,2 ,x1-x0,cs,0,LE) ) ad=98*ad/100; - ad=99*ad/100; /* LCD-type? */ - } - - x=loop(bp,dx-1,dy-1-dy/3,x1-x0,cs,0,LE); // should be minimum - for (y=dy-1-dy/3;yx) x=i; - } - if( ydx/8 ) - if( loop(bp,0 , dy/16,dx,cs,0,RI)dx/8 ) - if( loop(bp,0 ,dy-1-dy/16,dx,cs,0,RI)p,cs,1) == 0 - && get_bw(x1-dx/32,x1,y1-dy/32,y1,box1->p,cs,1) == 0 - && ( get_bw(x0,x0+dx/32,y0,y0+dy/32,box1->p,cs,1) == 1 - || get_bw(x0,x0+dx/32,y1-dy/32,y1,box1->p,cs,1) == 1 ) ) { - if (dx<32) ad=ad*99/100; else Break; // ~D - } - - // search lowest inner white point - for(y=dy,j=x=0;x 1 ) ad=99*ad/100; // ~a \it a - - if (loop(bp, 0, 0,x1-x0,cs,0,RI)>=dx/8) { // round, notLCD - if (loop(bp,dx-1,dy-1,x1-x0,cs,0,LE)dy/8 - || num_cross(0,dx-1, 0, 0,bp,cs) > 1 - || num_cross(0,dx-1,dy-1,dy-1,bp,cs) > 1 - ) ad=98*ad/100; // ~bq - - if (box1->m3) { - if (!hchar) ad=98*ad/100; else // ~o - if ( gchar) ad=99*ad/100; // wrong line detection? - } else { if (ad==100) ad=99; } /* not 100% sure */ - if (ad>99) ad=99; /* we can never be sure having a O, - let context correction decide, see below! */ - Setac(box1,(wchar_t)'0',ad); - break; - } - // --- test 0 with a straight line in it ------------------- - for(ad=100;dx>4 && dy>5;){ /* v0.3.1+ */ - DBG( char c_ask='0'; ) - if (sdata->holes.num > 3) Break; /* be tolerant */ - if (sdata->holes.num < 1) Break; - if (sdata->holes.num != 2) ad=95*ad/100; - if( get_bw(x0 , x0+dx/2,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x1-dx/2 , x1 ,y0+dy/2 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y1-dy/2 , y1,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y0 , y0+dy/2,box1->p,cs,1) != 1 ) Break; - if( get_bw(x0+dx/2 , x0+dx/2,y0+dy/3 , y1-dy/3,box1->p,cs,1) != 1 ) Break; - // out_x(box1); printf(" x0 y0 %d %d\n",x0,y0); - if( num_cross(x0+dx/2,x0+dx/2,y0 , y1 ,box1->p,cs) != 3 ) Break; - if( num_cross(x0+dx/3,x1-dx/3,y0 , y0 ,box1->p,cs) != 1 ) // AND - if( num_cross(x0+dx/3,x1-dx/3,y0+1 , y0+1 ,box1->p,cs) != 1 ) Break; - if( num_cross(x0+dx/3,x1-dx/3,y1 , y1 ,box1->p,cs) != 1 ) // against "rauschen" - if( num_cross(x0+dx/3,x1-dx/3,y1-1 , y1-1 ,box1->p,cs) != 1 ) Break; - if( num_cross(x0 ,x0 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x0+1 ,x0+1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - if( num_cross(x1 ,x1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) - if( num_cross(x1-1 ,x1-1 ,y0+dy/3 , y1-dy/3,box1->p,cs) != 1 ) Break; - // if( num_hole(x0,x1,y0,y1,box1->p,cs,NULL) != 2 ) Break; - if (sdata->holes.num != 2) ad=85*ad/100; - - if( loop(bp,0 , 0,x1-x0,cs,0,RI)<= - loop(bp,0 , 2+dy/32,x1-x0,cs,0,RI) ) Break; - x= loop(bp,0 ,dy/2 ,x1-x0,cs,0,RI); - i= loop(bp,0 ,dy/2-1,x1-x0,cs,0,RI); if (i>x) x=i; - i= loop(bp,0 ,dy/2-2,x1-x0,cs,0,RI); if (i>x && dy>8) x=i; - if( loop(bp,0 , dy/4,x1-x0,cs,0,RI)x) x=i; - i= loop(bp,dx-1,dy/2-1,x1-x0,cs,0,LE); if(i>x && dy>8) x=i; - if( loop(bp,dx-1,3*dy/4,x1-x0,cs,0,LE)x) x=i; - } - if( ydy/4) Break; - y+=loop(bp,dx/2,dy-1-y,y1-y0,cs,1,UP); if(y>dy/3) Break; if (y>dy/4) ad=ad*99/100; - y+=loop(bp,dx/2,dy-1-y,y1-y0,cs,0,UP); if(3*y>2*dy) Break; - x =loop(bp,dx/2,dy-y,dx/2,cs,0,RI); if(x==0) Break; - // MM; fprintf(stderr," y=%d x=%d\n",y-1,x); - if( loop(bp,dx/2+x-1-dx/16,dy-y,y1-y0,cs,0,UP)==0 ) Break; - // $ - for(i=0,y=dy/4;y dx/4 - || loop(bp,dx-1,y,dx-1,cs,0,LE) > dx/4 ) break; - if( ydx/8 ) - if( loop(bp,0 , dy/16,dx,cs,0,RI)dx/8 ) - if( loop(bp,0 ,dy-1-dy/16,dx,cs,0,RI)p,cs,1) == 0 - && get_bw(x1-dx/32,x1,y1-dy/32,y1,box1->p,cs,1) == 0 - && ( get_bw(x0,x0+dx/32,y0,y0+dy/32,box1->p,cs,1) == 1 - || get_bw(x0,x0+dx/32,y1-dy/32,y1,box1->p,cs,1) == 1 ) ) Break; // ~D - - /* 5x9 font "9" is like "0" */ - if (dx<16) - if ( num_cross(x0,x0,y0,y1,box1->p,cs) != 1 ) ad=98*ad/100; - - // italic a - for(i=0,y=6*dy/8;y 2 ) i++; else i--; - if(i>0) ad=ad*98/100; // ~'a' \it a - if( !hchar ) ad=90*ad/100; - Setac(box1,(wchar_t)'0',ad); - break; - } - return box1->c; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr1.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr1.c deleted file mode 100644 index 7ddcc9707..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/ocr1.c +++ /dev/null @@ -1,84 +0,0 @@ -// test routines - faster to compile -#include -#include -#include "pgm2asc.h" -#include "unicode.h" -#include "gocr.h" - -// for learn_mode/analyze_mode high, with, yoffset, num of pattern_i, -// - holes (center,radius in relative coordinates) etc. => cluster analyze -// num_hole => min-volume, tolerance border -// pattern: @@ @. @@ -// .@ @. .. -// regular filter for large resolutions to make edges more smooth (on boxes) -// extra-filter (only if not recognized?) -// map + same color to (#==change) -// - anti color -// . not used -// strongest neighbour pixels (3x3) => directions -// second/third run with more and more tolerance!? - -/* FIXME jb: following is unused */ -#if 0 -struct lobj { // line-object (for fitting to near lines) - int x0,y0; // starting point (left up) - int x1,y1; // end point (right down) - int mt; // minimum thickness - int q; // quality, overlapp -}; - -/* FIXME jb global */ -struct lobj obj1; -#endif - -// that is the first draft of feature extraction -// detect main lines and bows -// seems bad implemented, looking for better algorithms (ToDo: use autotrace) -#define MAXL 10 -void ocr2(pix *b,int cs){ - int x1,y1,x2,y2,l,i,j,xa[MAXL],ya[MAXL],xb[MAXL],yb[MAXL],ll[MAXL]; - for(i=0;ix;x1++) // very slowly, but simple to program - for(y1=0;y1y;y1++) // brute force - for(x2=0;x2x;x2++) - for(y2=y1+1;y2y;y2++) - { - if( get_line2(x1,y1,x2,y2,b,cs,100)>99 ) - { // line ??? - l=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1); // len - for(i=0;ix/2 - && abs(y1+y2-ya[i]-yb[i])<1+b->y/2 - && abs(y1-ya[i])<1+b->y/4 - && abs(x1-xa[i])<1+b->x/4 - ) - { - if( l>ll[i] ) - { - for(j=i;jll[i] ){ // insert if larger - for(j=MAXL-1;j>i;j--){ // shift table - xa[j]=xa[j-1];ya[j]=ya[j-1]; - xb[j]=xb[j-1];yb[j]=yb[j-1];ll[j]=ll[j-1]; - } - xa[i]=x1;ya[i]=y1;xb[i]=x2;yb[i]=y2;ll[i]=l; - break; - } - } - } - } - for(i=0;i - - The algorithm is very simple but works good hopefully. - - Compare the grayscale histogram with a mass density diagram: - I think the algorithm is a kind of - divide a body into two parts in a way that the mass - centers have the largest distance from each other, - the function is weighted in a way that same masses have a advantage - - - otsu algorithm is failing on diskrete multi color images - - TODO: - RGB: do the same with all colors (CMYG?) seperately - - test: hardest case = two colors - bbg: test done, using a two color gray file. Output: - # threshold: Value = 43 gmin=43 gmax=188 - - my changes: - - float -> double - - debug option added (vvv & 1..2) - - **image => *image, &image[i][1] => &image[i*cols+1] - - do only count pixels near contrast regions - this makes otsu much better for shadowed fonts or multi colored text - on white background - - (m) Joerg Schulenburg (see README for email address) - - ToDo: - - measure contrast - - detect low-contrast regions - - */ - -#include -#include - -#define Abs(x) ((x<0)?-(x):x) - -/*======================================================================*/ -/* global thresholding routine */ -/* takes a 2D unsigned char array pointer, number of rows, and */ -/* number of cols in the array. returns the value of the threshold */ -/*======================================================================*/ -int -otsu (unsigned char *image, int rows, int cols, - int x0, int y0, int dx, int dy, int vvv) { - - unsigned char *np; // pointer to position in the image we are working with - unsigned char op1, op2; // predecessor of pixel *np (start value) - int maxc=0; // maximum contrast (start value) - int thresholdValue=1; // value we will threshold at - int ihist[256]; // image histogram - int chist[256]; // contrast histogram - - int i, j, k; // various counters - int is, i1, i2, ns, n1, n2, gmin, gmax; - double m1, m2, sum, csum, fmax, sb; - - // zero out histogram ... - memset(ihist, 0, sizeof(ihist)); - memset(chist, 0, sizeof(chist)); - op1=op2=0; - - gmin=255; gmax=0; k=dy/512+1; - // v0.43 first get max contrast, dont do it together with next step - // because it failes if we have pattern as background (on top) - for (i = 0; i < dy ; i+=k) { - np = &image[(y0+i)*cols+x0]; - for (j = 0; j < dx ; j++) { - ihist[*np]++; - if(*np > gmax) gmax=*np; - if(*np < gmin) gmin=*np; - if (Abs(*np-op1)>maxc) maxc=Abs(*np-op1); /* new maximum contrast */ - if (Abs(*np-op2)>maxc) maxc=Abs(*np-op2); /* new maximum contrast */ - /* we hope that maxc will be find its maximum very fast */ - op2=op1; /* shift old pixel to next older */ - op1=*np; /* store old pixel for contrast check */ - np++; /* next pixel */ - } - } - - // generate the histogram - // Aug06 images with large white or black homogeneous - // areas give bad results, so we only add pixels on contrast edges - for (i = 0; i < dy ; i+=k) { - np = &image[(y0+i)*cols+x0]; - for (j = 0; j < dx ; j++) { - if (Abs(*np-op1)>maxc/4 - || Abs(*np-op2)>maxc/4) - chist[*np]++; // count only relevant pixels - op2=op1; /* shift old pixel to next older */ - op1=*np; /* store old pixel for contrast check */ - np++; /* next pixel */ - } - } - - // set up everything - sum = csum = 0.0; - ns = 0; - is = 0; - - for (k = 0; k <= 255; k++) { - sum += (double) k * (double) chist[k]; /* x*f(x) cmass moment */ - ns += chist[k]; /* f(x) cmass */ - is += ihist[k]; /* f(x) imass */ - // Debug: output to out_hist.dat? - // fprintf(stderr,"\chistogram %3d %6d (brightness weight)", k, ihist[k]); - } - - if (!ns) { - // if n has no value we have problems... - fprintf (stderr, "NOT NORMAL, thresholdValue = 160\n"); - return (160); - } - - // ToDo: only care about extremas in a 3 pixel environment - // check if there are more than 2 mass centers (more colors) - // return object colors and color radius instead of threshold value - // also the reagion, where colored objects are found - // what if more than one background color? no otsu at all? - // whats background? box with lot of other boxes in it - // threshold each box (examples/invers.png,colors.png) - // get maximum white and minimum black pixel color (possible range) - // check range between them for low..high contrast ??? - // typical scenes (which must be covered): - // - white page with text of different colors (gray values) - // - binear page: background (gray=1) + black text (gray=0) - // - text mixed with big (dark) images - // ToDo: recursive clustering for maximum multipol moments? - // idea: normalize ihist to max=1024 before otsu? - - // do the otsu global thresholding method - - if ((vvv&1)) // Debug - fprintf(stderr,"# threshold: value ihist chist mass_dipol_moment\n"); - fmax = -1.0; - n1 = 0; - for (k = 0; k < 255; k++) { - n1 += chist[k]; // left mass (integration) - if (!n1) continue; // we need at least one foreground pixel - n2 = ns - n1; // right mass (num pixels - left mass) - if (n2 == 0) break; // we need at least one background pixel - csum += (double) k *chist[k]; // left mass moment - m1 = csum / n1; // left mass center (black chars) - m2 = (sum - csum) / n2; // right mass center (white background) - // max. dipol moment? - // orig: sb = (double) n1 *(double) n2 * (m1 - m2) * (m1 - m2); - sb = (double) n1 *(double) n2 * (m2 - m1); // seems to be better Aug06 - /* bbg: note: can be optimized. */ - if (sb > fmax) { - fmax = sb; - thresholdValue = k + 1; - // thresholdValue = (m1 + 3 * m2) / 4; - } - if ((vvv&1) && ihist[k]) // Debug - fprintf(stderr,"# threshold: %3d %6d %6d %8.2f\n", - k, ihist[k], chist[k], - sb/(dx*dy)); /* normalized dipol moment */ - } - // ToDo: error = left/right point where sb is 90% of maximum? - // now we count all pixels for background detection - i1 = 0; - for (k = 0; k < thresholdValue; k++) { - i1 += ihist[k]; // left mass (integration) - } - i2 = is - i1; // right mass (num pixels - left mass) - - // at this point we have our thresholding value - // black_char: value=cs - - // can it happen? check for sureness - if (thresholdValue > gmax) { - fprintf(stderr,"# threshold: Value >gmax\n"); - thresholdValue = gmax; - } - if (thresholdValue <= gmin) { - fprintf(stderr,"# threshold: Value<=gmin\n"); - thresholdValue = gmin+1; - } - - // debug code to display thresholding values - if ( vvv & 1 ) - fprintf(stderr,"# threshold: Value = %d gmin=%d gmax=%d cmax=%d" - " i= %d %d\n", - thresholdValue, gmin, gmax, maxc, i1, i2); - - if (i1>=4*i2) { // black>=4*white, obviously black is background - if ( vvv & 1 ) - fprintf(stderr,"# threshold: invert the image\n"); - // we do inversion here (no data lost) - for (i = 0; i < dy ; i++) { - np = &image[(y0+i)*cols+x0]; - for (j = 0; j < dx ; j++) { - *np=255-*np; - np++; /* next pixel */ - } - } - thresholdValue=255-thresholdValue+1; - } - - return(thresholdValue); - /* range: 0 < thresholdValue <= 255, example: 1 on b/w images */ - /* 0..threshold-1 is foreground */ - /* threshold..255 is background */ - /* ToDo: min=blackmasscenter/2,thresh,max=(whitemasscenter+255)/2 */ -} - -/*======================================================================*/ -/* thresholding the image (set threshold to 128+32=160=0xA0) */ -/* now we have a fixed thresholdValue good to recognize on gray image */ -/* - so lower bits can used for other things (bad design?) */ -/* ToDo: different foreground colors, gray on black/white background */ -/*======================================================================*/ -int -thresholding (unsigned char *image, int rows, int cols, - int x0, int y0, int dx, int dy, int thresholdValue) { - - unsigned char *np; // pointer to position in the image we are working with - - int i, j; // various counters - int gmin=255,gmax=0; - int nmin=255,nmax=0; - - // calculate min/max (twice?) - for (i = y0 + 1; i < y0 + dy - 1; i++) { - np = &image[i*cols+x0+1]; - for (j = x0 + 1; j < x0 + dx - 1; j++) { - if(*np > gmax) gmax=*np; - if(*np < gmin) gmin=*np; - np++; /* next pixel */ - } - } - - /* allowed_threshold=gmin+1..gmax v0.43 */ - if (thresholdValue<=gmin || thresholdValue>gmax){ - thresholdValue=(gmin+gmax+1)/2; /* range=0..1 -> threshold=1 */ - fprintf(stderr,"# thresholdValue out of range %d..%d, reset to %d\n", - gmin, gmax, thresholdValue); - } - - /* b/w: min=0,tresh=1,max=1 v0.43 */ - // actually performs the thresholding of the image... - // later: grayvalues should also be used, only rescaling threshold=160=0xA0 - for (i = y0; i < y0+dy; i++) { - np = &image[i*cols+x0]; - for (j = x0; j < x0+dx; j++) { - *np = (unsigned char) (*np >= thresholdValue ? - (255-(gmax - *np)* 80/(gmax - thresholdValue + 1)) : - ( 0+(*np - gmin)*150/(thresholdValue - gmin )) ); - if(*np > nmax) nmax=*np; - if(*np < nmin) nmin=*np; - np++; - } - } - - // fprintf(stderr,"# thresholding: nmin=%d nmax=%d\n", nmin, nmax); - - return(128+32); // return the new normalized threshold value - /* 0..159 is foreground */ - /* 160..255 is background */ -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/otsu.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/otsu.h deleted file mode 100644 index acb16378c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/otsu.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - - see README for EMAIL-address - - */ - - -/*======================================================================*/ -/* OTSU global thresholding routine */ -/* takes a 2D unsigned char array pointer, number of rows, and */ -/* number of cols in the array. returns the value of the threshold */ -/*======================================================================*/ -int -otsu (unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int vvv); - - -/*======================================================================*/ -/* thresholding the image (set threshold to 128+32=160=0xA0) */ -/* now we have a fixed thresholdValue good to recognize on gray image */ -/* - so lower bits can used for other things (bad design?) */ -/*======================================================================*/ -int -thresholding (unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int thresholdValue); diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.c deleted file mode 100644 index 62d55872e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.c +++ /dev/null @@ -1,193 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2006 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL address -*/ - -#include -#include "unicode.h" -#include "output.h" -#include "gocr.h" /* extern job_t JOB; */ - -/* function is only for debugging and for developing - it prints out a part of pixmap b at point x0,y0 to stderr - using dots .,; if no pixel, and @xoO for pixels - modify n_run and print out what would happen on 2nd, 3th loop! - new: output original and copied pixmap in the same figure - */ -void out_b(struct box *px, pix *b, int x0, int y0, int dx, int dy, int cs ){ - int x,y,x2,y2,yy0,tx,ty,n1,i; - char c1, c2; - yy0=y0; - if(px){ /* overwrite rest of arguments */ - if (!b) { - b=px->p; - x0=px->x0; dx=px->x1-px->x0+1; - y0=px->y0; dy=px->y1-px->y0+1; yy0=y0; - } - if(cs==0) cs=JOB->cfg.cs; - fprintf(stderr,"\n# list box x= %4d %4d d= %3d %3d r= %3d %3d" - " nrun=%d p=%p", /* ToDo: r,nrun is obsolete */ - px->x0, px->y0, px->x1 - px->x0 + 1, px->y1 - px->y0 + 1, - px->x - px->x0, px->y - px->y0, JOB->tmp.n_run, (void*)px); - fprintf(stderr,"\n# dots=%d boxes=%d subboxes=%d c=%s mod=%s" - " line=%d m= %d %d %d %d", - px->dots, px->num_boxes, px->num_subboxes, - decode(px->c,ASCII), decode(px->modifier,ASCII), px->line, - px->m1 - px->y0, px->m2 - px->y0, px->m3 - px->y0, px->m4 - px->y0); - if (px->num_frames) { - int i,j,jo; - fprintf(stderr,"\n# frames= %d (sumvects=%d)",px->num_frames, - ((px->num_frames)?px->num_frame_vectors[px->num_frames-1]:-1)); - for (jo=j=i=0; inum_frames; i++, jo=j) { - fprintf(stderr,"\n# frame %d (%+4d,%3d,%2d) ", - i, px->frame_vol[i], px->frame_per[i], - px->num_frame_vectors[i]-jo); - /* print only the first vectors of each frame */ - for (;jnum_frame_vectors[i] && jframe_vector[j][0] - px->x0, - px->frame_vector[j][1] - px->y0); - } - } - if (px->num_ac){ /* output table of chars and its probabilities */ - fprintf(stderr,"\n# list box char: "); - for(i=0;inum_ac && itas[i]) - fprintf(stderr," %s(%d)", px->tas[i] ,px->wac[i]); - else - fprintf(stderr," %s(%d)",decode(px->tac[i],ASCII),px->wac[i]); - } - fprintf(stderr,"\n"); - if (px->dots && px->m2 && px->m1m1; dy=px->y1-yy0+1; } - } - tx=dx/80+1; - ty=dy/40+1; /* step, usually 1, but greater on large maps */ - fprintf(stderr,"# list pattern x= %4d %4d d= %3d %3d t= %d %d\n", - x0,y0,dx,dy,tx,ty); - if (dx>0) - for(y=yy0;yp,x2-x0+px->x0, - y2-y0+px->y0)num_frames) { /* mark vectors */ - int i; - if (c1!='$' && c1!='S') /* dont mark twice */ - for (i=0;inum_frame_vectors[px->num_frames-1];i++) - if ((px->frame_vector[i][0]-px->x0)/tx==(x-x0)/tx - && (px->frame_vector[i][1]-px->y0)/ty==(y-y0)/ty) - { c1=((c1=='@')?'$':'S'); break; } - } - fprintf(stderr,"%c", c1 ); - } - - /* 2nd image is the boxframe in the original bitmap */ - if (dx<40) fprintf(stderr," "); - if (dx<40) /* do it only, if we have enough place */ - for(x=x0;xy0==px->m1 || y-y0+px->y0==px->m2 - || y-y0+px->y0==px->m3 || y-y0+px->y0==px->m4) c1='<'; - if (y==y0 || y==yy0+dy-1) c2='-'; /* boxmarks */ - - fprintf(stderr,"%c%c\n",c1,c2); - } -} - -/* same as out_b, but for faster use, only a box as argument - */ -void out_x(struct box *px) { - out_b(px,NULL,0, 0, 0, 0, JOB->cfg.cs); -} - - -/* print out two boxes side by side, for debugging comparision algos */ -void out_x2(struct box *box1, struct box *box2){ - int x,y,i,tx,ty,dy; - /*FIXME jb static*/static char *c1="OXXXXxx@.,,,,,,,"; - pix *b=&JOB->src.p; - dy=(box1->y1-box1->y0+1); - if(dyy1-box2->y0+1)dy=box2->y1-box2->y0+1; - tx=(box1->x1-box1->x0)/40+1; - ty=(box1->y1-box1->y0)/40+1; /* step, usually 1, but greater on large maps */ - if(box2)fprintf(stderr,"\n# list 2 patterns"); - for(i=0;iy0+i; - for(x=box1->x0;x<=box1->x1;x+=tx) - fprintf(stderr,"%c", c1[ ((getpixel(b,x,y)cfg.cs)?0:8)+marked(b,x,y) ] ); - if(!box2) continue; - fprintf(stderr," "); y=box2->y0+i; - for(x=box2->x0;x<=box2->x1;x+=tx) - fprintf(stderr,"%c", c1[ ((getpixel(b,x,y)cfg.cs)?0:8)+marked(b,x,y) ] ); - } -} - - -/* ---- list output ---- for debugging --- - * list all boxes where the results can be found within the c-option - */ -int output_list(job_t *job) { - int i = 0, j; - struct box *box2; - pix *pp = &job->src.p; - char *lc = job->cfg.lc; - - fprintf(stderr,"\n# list shape for charlist %s",lc); - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *) list_get_current(&(JOB->res.boxlist)); - for (j=0; jnum_ac; j++) - if (!lc || (box2->tac[j] && strchr(lc, box2->tac[j])) - || (box2->tas[j] && strstr(lc, box2->tas[j]))) break; - if (jnum_ac) - fprintf(stderr,"\n# box found in charlist"); - if (!lc || (strchr(lc, box2->c) && box2->c < 256 && box2->c) - || (strchr(lc, '_') && box2->c==UNKNOWN) /* for compability */ - || jnum_ac ){ /* also list alternative chars */ - if (!pp) pp=box2->p; - fprintf(stderr, - "\n# list shape %3d x=%4d %4d d= %3d %3d vf=%d ac=%d %04x %s", - i, box2->x0, box2->y0, - box2->x1 - box2->x0 + 1, - box2->y1 - box2->y0 + 1, - box2->num_frames, box2->num_ac, - (int)box2->c, /* wchar_t -> char ???? */ - decode(box2->c,ASCII) ); - if (JOB->cfg.verbose & 4) out_x(box2); - } - i++; - } end_for_each(&(JOB->res.boxlist)); - fprintf(stderr,"\n"); - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.h deleted file mode 100644 index 68b00ecd2..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/output.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL-address */ - -#ifndef OUTPUT_H -#define OUTPUT_H - -#include -#include -#include "pnm.h" -#include "gocr.h" -#include "list.h" - -void out_b(struct box *px, pix *b, int x0, int y0, int dx, int dy, int cs ); -void out_x(struct box *px); -void out_x2(struct box *box1,struct box *box2); -int output_list(job_t *job); - - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.c deleted file mode 100644 index 9d7a3ef40..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.c +++ /dev/null @@ -1,2875 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2007 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL-address - - sometimes I have written comments in german language, sorry for that - - - look for ??? for preliminary code - - space: avX=22 11-13 (empirical estimated) - avX=16 5-7 - avX= 7 5-6 - - ToDo: - add filter (r/s mismatch) g300c1 - - better get_line2 function (problems on high resolution) - - write parallelizable code! - - learnmode (optimize filter) - - use ispell for final control or if unsure - - better line scanning (if not even) - - step 5: same chars differ? => expert mode - - chars dx>dy and above 50% hor-crossing > 4 is char-group ? - - detect color of chars and background - - better word space calculation (look at the examples) - (distance: left-left, middle-middle, left-right, thickness of e *0.75) - - GLOBAL DATA (mostly structures) - - pix : image - one byte per pixel bits0-2=working - - lines : rows of the text (points to pix) - - box : list of bounding box for character - - obj : objects (lines, splines, etc. building a character) - */ - - -#include -#include -#include -#include -#include -#include "../../config.h" -#ifdef HAVE_WCHAR_H -#include -#endif - -#include "list.h" -#include "pgm2asc.h" -// #include "pcx.h" /* needed for writebmp (removed later) */ -/* ocr1 is the test-engine - remember: this is development version */ -#include "ocr1.h" -/* first engine */ -#include "ocr0.h" -#include "otsu.h" -#include "progress.h" - -#include "gocr.h" - -/* wew: will be exceeded by capitals at 1200dpi */ -#define MaxBox (100*200) // largest possible letter (buffersize) -#define MAX(a,b) ((a) >= (b) ? (a) : (b)) - -/* if the system does not know about wchar.h, define functions here */ -#ifndef HAVE_WCHAR_H -/* typedef unsigned wchar_t; */ -/* Find the first occurrence of WC in WCS. */ -const wchar_t *wcschr (const wchar_t *wcs, const wchar_t wc) { - int i; for(i=0;wcs[i];i++) if (wcs[i]==wc) return wcs+i; return NULL; -} -const wchar_t *wcscpy (wchar_t *dest, const wchar_t *src) { - int i; for(i=0;src[i];i++) dest[i]=src[i]; dest[i]=0; return dest; -} -size_t wcslen (const wchar_t *s){ - size_t i; for(i=0;s[i];i++); return i; -} -#endif -#ifndef HAVE_WCSDUP -wchar_t * wcsdup (const wchar_t *WS) { /* its a gnu extension */ - wchar_t *copy; - copy = (wchar_t *) malloc((wcslen(WS)+1)*sizeof(wchar_t)); - if (!copy)return NULL; - wcscpy(copy, WS); - return copy; -} -#endif - -// ------------------------ feature extraction ----------------- -// ------------------------------------------------------------- -// detect maximas in of line overlaps (return in %) and line coordinates -// this is for future use -#define HOR 1 // horizontal -#define VER 2 // vertical -#define RIS 3 // rising=steigend -#define FAL 4 // falling=fallend - -/* exchange two variables */ -static void swap(int *a, int *b) { - int c = *a; - *a = *b; - *b = c; -} - -// calculate the overlapping of the line (0-1) with black points -// by recursive bisection -// line: y=dy/dx*x+b, implicit form: d=F(x,y)=dy*x-dx*y+b*dx=0 -// incremental y(i+1)=m*(x(i)+1)+b, F(x+1,y+1)=f(F(x,y)) -// ret & 1 => inverse pixel! -// d=2*F(x,y) integer numbers -int get_line(int x0, int y0, int x1, int y1, pix *p, int cs, int ret){ - int dx,dy,incrE,incrNE,d,x,y,r0,r1,ty,tx, - *px,*py,*pdx,*pdy,*ptx,*pty,*px1; - dx=abs(x1-x0); tx=((x1>x0)?1:-1); // tx=x-spiegelung (new) - dy=abs(y1-y0); ty=((y1>y0)?1:-1); // ty=y-spiegelung (new) - // rotate coordinate system if dy>dx -/*bbg: can be faster if instead of pointers we use the variables and swaps? */ -/*js: Do not know, I am happy that the current code is working and is small */ - if(dx>dy){ pdx=&dx;pdy=&dy;px=&x;py=&y;ptx=&tx;pty=&ty;px1=&x1; } - else { pdx=&dy;pdy=&dx;px=&y;py=&x;ptx=&ty;pty=&tx;px1=&y1; } - if( *ptx<0 ){ swap(&x0,&x1);swap(&y0,&y1);tx=-tx;ty=-ty; } - d=((*pdy)<<1)-(*pdx); incrE=(*pdy)<<1; incrNE=((*pdy)-(*pdx))<<1; - x=x0; y=y0; r0=r1=0; /* dd=tolerance (store max drift) */ - while( (*px)<=(*px1) ){ - if( ((getpixel(p,x,y) percentage % -} - -// this function should detect whether a direct connection between points -// exists or not, not finally implemented -// ret & 1 => inverse pixel! -// d=2*F(x,y) integer numbers, ideal line: ,I pixel: I@ -// ..@ @@@ .@. ...,@2@. +1..+3 floodfill around line ??? -// ..@ .@@ .@. ...,.@@@ +2..+4 <= that's not implemented yet -// ..@ ..@ .@. ...,.@@@ +2..+4 -// @.@ @.. .@. ...,@@@. +1..+3 -// @.@ @@. .@. ...I@@@. 0..+3 -// @@@ @@@ .@. ..@1@@.. 0..+2 -// 90% 0% 100% 90% r1-r2 -// I am not satisfied with it -int get_line2(int x0, int y0, int x1, int y1, pix *p, int cs, int ret){ - int dx,dy,incrE,incrNE,d,x,y,r0,r1,ty,tx,q,ddy,rx,ry, - *px,*py,*pdx,*pdy,*ptx,*pty,*px1; - dx=abs(x1-x0); tx=((x1>x0)?1:-1); // tx=x-spiegelung (new) - dy=abs(y1-y0); ty=((y1>y0)?1:-1); // ty=y-spiegelung (new) - // rotate coordinate system if dy>dx - if(dx>dy){ pdx=&dx;pdy=&dy;px=&x;py=&y;ptx=&tx;pty=&ty;px1=&x1;rx=1;ry=0; } - else { pdx=&dy;pdy=&dx;px=&y;py=&x;ptx=&ty;pty=&tx;px1=&y1;rx=0;ry=1; } - if( *ptx<0 ){ swap(&x0,&x1);swap(&y0,&y1);tx=-tx;ty=-ty; } - d=((*pdy)<<1)-(*pdx); incrE=(*pdy)<<1; incrNE=((*pdy)-(*pdx))<<1; - x=x0; y=y0; r0=r1=0; ddy=3; // tolerance = bit 1 + bit 0 = left+right - // int t=(*pdx)/16,tl,tr; // tolerance, left-,right delimiter - while( (*px)<=(*px1) ){ // not finaly implemented - q=((getpixel(p,x,y) percentage % -} - -/* Look for dots in the rectangular region x0 <= x <= x1 and y0 <= y - <= y1 in pixmap p. The two low order bits in mask indicate the color - of dots to look for: If mask==1 then look for black dots (where a - pixel value less than cs is considered black). If mask==2 then look - for white dots. If mask==3 then look for both black and white dots. - If the dots are found, the corresponding bits are set in the returned - value. Heavily used by the engine ocr0*.cc */ -char get_bw(int x0, int x1, int y0, int y1, pix * p, int cs, int mask) { - char rc = 0; // later with error < 2% (1 dot) - int x, y; - - if (x0 < 0) x0 = 0; - if (x1 >= p->x) x1 = p->x - 1; - if (y0 < 0) y0 = 0; - if (y1 >= p->y) y1 = p->y - 1; - - for ( y = y0; y <= y1; y++) - for ( x = x0; x <= x1; x++) { - rc |= ((getpixel(p, x, y) < cs) ? 1 : 2); // break if rc==3 - if ((rc & mask) == mask) - return mask; // break loop - } - return (rc & mask); -} - -/* more general Mar2000 (x0,x1,y0,y1 instead of x0,y0,x1,y1! (history)) - * look for black crossings throw a line from x0,y0 to x1,y1 and count them - * follow line and count crossings ([white]-black-transitions) - * ex: horizontal num_cross of 'm' would return 3 */ -int num_cross(int x0, int x1, int y0, int y1, pix *p, int cs) { - int rc = 0, col = 0, k, x, y, i, d; // rc=crossings col=0=white - int dx = x1 - x0, dy = y1 - y0; - - d = MAX(abs(dx), abs(dy)); - for (i = 0, x = x0, y = y0; i <= d; i++) { - if (d) { - x = x0 + i * dx / d; - y = y0 + i * dy / d; - } - k = ((getpixel(p, x, y) < cs) ? 1 : 0); // 0=white 1=black - if (col == 0 && k == 1) - rc++; - col = k; - } - return rc; -} - -/* check if test matches pattern - * possible pattern: "a-zA-Z0-9+\-\\" (x-y dont work for c>127) - * ToDo: wchar_t cc + matching UTF-8 pattern for nonASCII - */ -int my_strchr( char *pattern, wchar_t cc ) { - char *s1; - if (pattern==(char *)NULL) return 0; - - /* if (!(cc&0x80)) s1=strchr(pattern,(char)cc); else */ - s1=strstr(pattern,decode(cc, UTF8)); - switch (cc) { - case '-': - case '\\': - if ((!s1) || s1-pattern<1 || *(s1-1)!='\\') return 0; - else return 1; - default: - if (s1) return 1; /* cc simply matches */ - s1=pattern+1; - while (s1) { - if ((!s1[0]) || (!s1[1])) return 0; /* end of string */ - if (*(s1-1)!='\\' && *(s1-1)<=cc && *(s1+1)>=cc) return 1; - s1=strchr(s1+1,'-'); /* look for next '-' */ - } - } - return 0; -} - -/* set alternate chars and its weight, called from the engine - if a char is recognized to (weight) percent - can be used for filtering (only numbers etc) - often usefull if Il1 are looking very similar - should this function stay in box.c ??? - weight is between 0 and 100 in percent, 100 means absolutely sure - - not final, not time critical (js) - - replace it by a string-function setaobj(*b,"string",weight) - and let call setac the setas function - */ - -int setas(struct box *b, char *as, int weight){ - int i,j; - if (b->num_ac > NumAlt || b->num_ac<0) { - fprintf(stderr,"\nDBG: There is something wrong with setas()!"); - b->num_ac=0; - } - if (as==NULL) { - fprintf(stderr,"\nDBG: setas(NULL) makes no sense!"); return 0; } - if (as[0]==0) { - fprintf(stderr,"\nDBG: setas(\"\") makes no sense!" - " x= %d %d", b->x0, b->y0); - // out_x(b); - return 0; - } - - /* char filter (ex: only numbers) ToDo: cfilter as UTF-8 */ - if (JOB->cfg.cfilter) { - /* do not accept chars which are not in the cfilter string */ - if ( as[0]>0 && as[1]==0 ) - if ( !my_strchr(JOB->cfg.cfilter,as[0]) ) return 0; - } -#if 0 /* obsolete, done in setac */ - /* not sure that this is the right place, but where else? */ - if ( as[0]>0 && as[1]==0 ) - if (b->modifier != SPACE && b->modifier != 0) { - wchar_t newac; - newac = compose(as[0], b->modifier); - as = (char *)decode(newac, UTF8); /* was (const char *) */ - if (newac == as[0]) { /* nothing composed */ - fprintf(stderr, "\nDBG setas compose was useless %d %d",b->x0,b->y0); - // out_x(b); - } - } -#endif - - /* only the first run gets the full weight */ - weight=(100-JOB->tmp.n_run)*weight/100; - - /* remove same entries from table */ - for (i=0;inum_ac;i++) - if (b->tas[i]) - if (strcmp(as,b->tas[i])==0) break; - if (b->num_ac>0 && inum_ac){ - if (weight<=b->wac[i]) return 0; /* if found + less weight ignore it */ - /* to insert the new weigth on the right place, we remove it first */ - if (b->tas[i]) free(b->tas[i]); - for (j=i;jnum_ac-1;j++){ /* shift lower entries */ - b->tac[j]=b->tac[j+1]; /* copy the char */ - b->tas[j]=b->tas[j+1]; /* copy the pointer to the string */ - b->wac[j]=b->wac[j+1]; /* copy the weight */ - } - b->num_ac--; /* shrink table */ - } - /* sorting and add it to the table */ - for (i=0;inum_ac;i++) if (weight>b->wac[i]) break; - if (b->num_acnum_ac++; /* enlarge table */ - for (j=b->num_ac-1;j>i;j--){ /* shift lower entries */ - b->tac[j]=b->tac[j-1]; /* copy the char */ - b->tas[j]=b->tas[j-1]; /* copy the pointer to the string */ - b->wac[j]=b->wac[j-1]; /* copy the weight */ - } - if (inum_ac) { /* insert new entry */ - b->tac[i]=0; /* insert the char=0 ... */ - b->tas[i]=(char *)malloc(strlen(as)+1); /* ... string */ - if (b->tas[i]) memcpy(b->tas[i],as,strlen(as)+1); - b->wac[i]=weight; /* ... and its weight */ - } - if (i==0) b->c=b->tac[0]; /* char or 0 for string */ - return 0; -} - -/* ToDo: this function will be replaced by a call of setas() later */ -int setac(struct box *b, wchar_t ac, int weight){ - int i,j; - if ((!b) || b->num_ac > NumAlt || b->num_ac<0) { - fprintf(stderr,"\nDBG: This is a bad call to setac()!"); - b->num_ac=0; - } - if (ac==0 || ac==UNKNOWN) { - fprintf(stderr,"\nDBG: setac(0) makes no sense!"); - return 0; - } - /* char filter (ex: only numbers) ToDo: cfilter as UTF-8 */ - if (JOB->cfg.cfilter) { - /* do not accept chars which are not in the cfilter string */ - /* if ( ac>255 || !strchr(JOB->cfg.cfilter,(char)ac) ) return 0; */ - if ( !my_strchr(JOB->cfg.cfilter,ac) ) return 0; - } - /* not sure that this is the right place, but where else? */ - if (b->modifier != SPACE && b->modifier != 0) { - wchar_t newac; - newac = compose(ac, b->modifier); - if (newac == ac) { /* nothing composed */ - if(JOB->cfg.verbose & 7) - fprintf(stderr, "\nDBG setac(%s): compose was useless @ %d %d", - decode(ac,ASCII), b->x0, b->y0); - } - ac = newac; - } - - /* only the first run gets the full weight */ - weight=(100-JOB->tmp.n_run)*weight/100; - - /* remove same entries from table */ - for (i=0;inum_ac;i++) if (ac==b->tac[i]) break; - if (b->num_ac>0 && inum_ac){ - if (weight<=b->wac[i]) return 0; - if (b->tas[i]) free(b->tas[i]); - for (j=i;jnum_ac-1;j++){ /* shift lower entries */ - b->tac[j]=b->tac[j+1]; /* copy the char */ - b->tas[j]=b->tas[j+1]; /* copy the pointer to the string */ - b->wac[j]=b->wac[j+1]; /* copy the weight */ - } - b->num_ac--; /* shrink table */ - } - /* sorting it to the table */ - for (i=0;inum_ac;i++) if (weight>b->wac[i]) break; - if (b->num_acnum_ac++; /* enlarge table */ - for (j=b->num_ac-1;j>i;j--){ /* shift lower entries */ - b->tac[j]=b->tac[j-1]; /* copy the char */ - b->tas[j]=b->tas[j-1]; /* copy the pointer to the string */ - b->wac[j]=b->wac[j-1]; /* copy the weight */ - } - if (inum_ac) { /* insert new entry */ - b->tac[i]=ac; /* insert the char ... */ - b->tas[j]=NULL; /* ... no string (?) */ - b->wac[i]=weight; /* ... and its weight */ - } - if (i==0) b->c=ac; /* store best result to b->c (will be obsolete) */ - - return 0; -} - -/* test if ac in wac-table - usefull for contextcorrection and box-splitting - return 0 if not found - return wac if found (wac>0) - */ -int testac(struct box *b, wchar_t ac){ - int i; - if (b->num_ac > NumAlt || b->num_ac<0) { - fprintf(stderr,"\n#DEBUG: There is something wrong with testac()!"); - b->num_ac=0; - } - /* search entries in table */ - for (i=0;inum_ac;i++) if (ac==b->tac[i]) return b->wac[i]; - return 0; -} - - -/* look for edges: follow a line from x0,y0 to x1,y1, record the - * location of each transition, and return their number. - * ex: horizontal num_cross of 'm' would return 6 - * remark: this function is not used, obsolete? ToDo: remove? - */ -int follow_path(int x0, int x1, int y0, int y1, pix *p, int cs, path_t *path) { - int rc = 0, prev, x, y, i, d, color; // rc=crossings col=0=white - int dx = x1 - x0, dy = y1 - y0; - - d = MAX(abs(dx), abs(dy)); - prev = getpixel(p, x0, y0) < cs; // 0=white 1=black - path->start = prev; - for (i = 1, x = x0, y = y0; i <= d; i++) { - if (d) { - x = x0 + i * dx / d; - y = y0 + i * dy / d; - } - color = getpixel(p, x, y) < cs; // 0=white 1=black - if (color != prev){ - if (rc>=path->max){ - int n=path->max*2+10; - path->x = (int *) xrealloc(path->x, n*sizeof(int)); - path->y = (int *) xrealloc(path->y, n*sizeof(int)); - path->max = n; - } - path->x[rc]=x; - path->y[rc]=y; - rc++; - } - prev = color; - } - path->num=rc; - return rc; -} - -/* ToDo: only used in follow_path, which is obsolete, remove? */ -void *xrealloc(void *ptr, size_t size){ - void *p; - p = realloc(ptr, size); - if (size>0 && (!p)){ - fprintf(stderr, "insufficient memory"); - exit(1); - } - return p; -} - -/* - * ------------------------------------------------------------- - * mark edge-points - * - first move forward until b/w-edge - * - more than 2 pixel? - * - loop around - * - if forward pixel : go up, rotate right - * - if forward no pixel : rotate left - * - stop if found first 2 pixel in same order - * go_along_the_right_wall strategy is very similar and used otherwhere - * -------------------------------------------------------------- - * turmite game: inp: start-x,y, regel r_black=UP,r_white=RIght until border - * out: last-position - * - * could be used to extract more features: - * by counting stepps, dead-end streets ,xmax,ymax,ro-,ru-,lo-,lu-edges - * - * use this little animal to find features, I first was happy about it - * but now I prefer the loop() function - */ - -void turmite(pix *p, int *x, int *y, - int x0, int x1, int y0, int y1, int cs, int rw, int rb) { - int r; - if (outbounds(p, x0, y0)) // out of pixmap - return; - while (*x >= x0 && *y >= y0 && *x <= x1 && *y <= y1) { - r = ((getpixel(p, *x, *y) < cs) ? rb : rw); // select rule - switch (r) { - case UP: (*y)--; break; - case DO: (*y)++; break; - case RI: (*x)++; break; - case LE: (*x)--; break; - case ST: break; - default: assert(0); - } - if( r==ST ) break; /* leave the while-loop */ - } -} - -/* search a way from p0 to p1 without crossing pixels of type t - * only two directions, useful to test if there is a gap 's' - * labyrinth algorithm - do you know a faster way? */ -int joined(pix *p, int x0, int y0, int x1, int y1, int cs){ - int t,r,x,y,dx,dy,xa,ya,xb,yb; - x=x0;y=y0;dx=1;dy=0; - if(x1>x0){xa=x0;xb=x1;} else {xb=x0;xa=x1;} - if(y1>y0){ya=y0;yb=y1;} else {yb=y0;ya=y1;} - t=((getpixel(p,x,y)=xa && x+dy<=xb && y-dx>=ya && y-dx<=yb) // wall - { r=dy;dy=-dx;dx=r;x+=dx;y+=dy; } // rotate right and step forward - else { r=dx;dx=-dy;dy=r; } // rotate left - // fprintf(stderr," path xy %d-%d %d-%d %d %d %d %d\n",xa,xb,ya,yb,x,y,dx,dy); - if( x==x1 && y==y1 ) return 1; - if( x==x0 && y==y0 && dx==1) return 0; - } - // return 0; // endless loop ? -} - -/* move from x,y to direction r until pixel of color col is found - * or maximum of l steps - * return the number of steps done */ -int loop(pix *p,int x,int y,int l,int cs,int col, DIRECTION r){ - int i=0; - if(x>=0 && y>=0 && xx && yy){ - switch (r) { - case UP: - for( ;i=0;i++,y--) - if( (getpixel(p,x,y)y;i++,y++) - if( (getpixel(p,x,y)=0;i++,x--) - if( (getpixel(p,x,y)x;i++,x++) - if( (getpixel(p,x,y)maxstack) maxstack=blen; - blen--; /* reduce the stack */ - x=buf[blen*2+0]; - y=buf[blen*2+1]; - if (y < *y0) *y0 = y; - if (y > *y1) *y1 = y; - /* first go to leftmost pixel */ - for ( ; x>0 && (col == ((getpixel(p, x-1, y) < cs) ? 0 : 1)) ; x--); - if ((marked(p,x,y)&mark)==mark) continue; /* already scanned */ - for (dx=-1;dx<2;dx+=2) /* look at upper and lower line, left */ - if ( diag && xx && x-1>0 && y+dx >=0 && y+dx < p->y - && col != ((getpixel(p, x , y+dx) < cs) ? 0 : 1) - && col == ((getpixel(p, x-1, y+dx) < cs) ? 0 : 1) - && !((marked(p,x-1,y+dx)&mark)==mark) - ) { - if (blen+1>=bmax) { overflow|=1; continue; } - buf[blen*2+0]=x-1; - buf[blen*2+1]=y+dx; - blen++; - } - if (x < *x0) *x0 = x; - /* second go right, mark and get new starting points */ - for ( ; xx && (col == ((getpixel(p, x , y) < cs) ? 0 : 1)) ; x++) { - p->p[x + y * p->x] |= (mark & 7); rc++; /* mark pixel */ - /* enlarge frame */ - if (x > *x1) *x1 = x; - for (dx=-1;dx<2;dx+=2) /* look at upper and lower line */ - if ( col == ((getpixel(p, x , y+dx) < cs) ? 0 : 1) - && ( - col != ((getpixel(p, x-1, y ) < cs) ? 0 : 1) - || col != ((getpixel(p, x-1, y+dx) < cs) ? 0 : 1) ) - && !((marked(p,x,y+dx)&mark)==mark) && y+dxy && y+dx>=0 - ) { - if (blen+1>=bmax) { overflow|=1; continue; } - buf[blen*2+0]=x; - buf[blen*2+1]=y+dx; - blen++; - } - } - for (dx=-1;dx<2;dx+=2) /* look at upper and lower line, right */ - if ( diag && xx && x-1>0 && y+dx >=0 && y+dx < p->y - && col == ((getpixel(p, x-1, y ) < cs) ? 0 : 1) - && col != ((getpixel(p, x , y ) < cs) ? 0 : 1) - && col != ((getpixel(p, x-1, y+dx) < cs) ? 0 : 1) - && col == ((getpixel(p, x , y+dx) < cs) ? 0 : 1) - && !((marked(p,x,y+dx)&mark)==mark) - ) { - if (blen+1>=bmax) { overflow|=1; continue; } - buf[blen*2+0]=x; - buf[blen*2+1]=y+dx; - blen++; - } - } - - /* debug, ToDo: use info maxstack and pixels for image classification */ - g_debug(fprintf(stderr," maxstack= %4d pixels= %6d",maxstack,rc);) - if (overflow==1){ - overflow|=2; - fprintf(stderr,"# Warning: frame_nn stack oerflow\n"); - } - free(buf); -#else /* old version, ToDo: improve it for tmp04/005*.pgm.gz */ - int i, j, d, dx, ox, oy, od, nx, ny, rc = 0, rot = 0, x2 = x, y2 = y, ln; - - static const int d0[8][2] = { { 0, -1} /* up */, {-1, -1}, - {-1, 0} /* left */, {-1, 1}, - { 0, 1} /* down */, { 1, 1}, - { 1, 0} /* right */, { 1, -1}}; - - /* check bounds */ - if (outbounds(p, x, y)) - return 0; - /* check if already marked */ - if ((marked(p,x,y)&mark)==mark) - return 0; - - i = ((getpixel(p, x, y) < cs) ? 0 : 1); - rc = 0; - - g_debug(fprintf(stderr," start frame:");) - - for (ln = 0; ln < 2 && rot >= 0; ln++) { // repeat if right-loop - g_debug(fprintf(stderr," ln=%d diag=%d cs=%d x=%d y=%d - go to border\n",ln,diag,cs,x,y);) - - od=d=(8+4*ln-diag)&7; // start robot looks up, right is a wall - // go to right (left) border - if (ln==1) { - x=x2; y=y2; - } - /* start on leftmost position */ - for (dx = 1 - 2*ln; x + dx < p->x && x + dx >= 0 /* bounds */ && - i == ((getpixel(p, x + dx, y) < cs) ? 0 : 1) /* color */; - x += dx); - - g_debug(fprintf(stderr," ln=%d diag=%d cs=%d x=%d y=%d\n",ln,diag,cs,x,y);) - - /* robot stores start-position */ - ox = x; oy = y; - for (rot = 0; abs(rot) <= 64; ) { /* for sure max. 8 spirals */ - /* leftmost position */ - if (ln == 0 && x < x2) { - x2 = x; y2 = y; - } - - g_debug(fprintf(stderr," x=%3d y=%3d d=%d i=%d p=%3d rc=%d\n",x,y,d,i,getpixel(p,x,y),rc);) - - if ( abs(d0[d][1]) ) { /* mark left (right) pixels */ - for (j = 0, dx = d0[d][1]; x + j >= 0 && x + j < p->x - && i == ((getpixel(p, x + j, y) < cs) ? 0 : 1); j += dx) { - if (!((marked(p, x + j, y)&mark)==mark)) - rc++; - p->p[x + j + y * p->x] |= (mark & 7); - } - } - /* look to the front of robot */ - nx = x + d0[d][0]; - ny = y + d0[d][1]; - /* if right is a wall */ - if ( outbounds(p, nx, ny) || i != ((getpixel(p,nx,ny) *x1) *x1 = x; - if (y < *y0) *y0 = y; - if (y > *y1) *y1 = y; - } - if(x==ox && y==oy && d==od) break; // round trip finished - } - } - g_debug(fprintf(stderr," rot=%d\n",rot);) -#endif - return rc; -} - -/* obsolete! replaced by vectors - * mark neighbouring pixel of same color, return number - * better with neighbours of same color (more general) ??? - * parameters: (&~7)-pixmap, start-point, critical_value, mark - * recursion is removed */ -int mark_nn(pix * p, int x, int y, int cs, int r) { - /* out of bounds or already marked? */ - if (outbounds(p, x, y) || (marked(p, x, y)&r)==r) - return 0; - { - int x0, x1, y0, y1; - x0 = x1 = x; - y0 = y1 = y; // not used - return frame_nn(p, x, y, &x0, &x1, &y0, &y1, cs, r, JOB->tmp.n_run & 1); - // using same scheme - } -} - -/* ToDo: finish to replace old frame by this new one - * - * @...........#@@@@@@@. # = marked as already scanned black pixels - * @........@@@@@@@@@@@# only left and right border - * .......#@@@@@@@@@@@@@ left side on even y - * ......@@@@@@@@#.@@@@# right side on odd y - * .....#@@@@@......#@@@ no border is marked twice - * ....@@@@@#......@@@#. works also for thinn lines - * ...#@@@@........#@@@. - outer loop is stored as first - * ..@@@@#........@@@#.. - inner loop is stored as second - * .#@@@@........#@@@@.. 1st in an extra box (think on white chars) - * @@@@#.......@@@@#.... 2nd merge in an extra step - * #@@@@@....#@@@@@..... - * @@@@@@@@@@@@@@#...... - * .#@@@@@@@@@@@@....... - * - * run around the chape using laby-robot - * - used for scanning boxes, look for horizontal b/w transitions - * with unmarked black pixels and call this routine - * - stop if crossing a marked box in same direction (left=up, right=down) - * box - char box, store frame_vectors and box - * x,y - starting point - * mark - 3 bit marker, mark each valid pixel with it - * diag - 0: only pi/2 direction, 1: pi/4 directions (diagonal) - * ds - start direction, 6=right of right border, 2=left of left border - * ret - 0=ok, -1=already marked, -2=max_num_frames_exceeded - * -7=no border in direction ds - */ -#if 0 -#undef g_debug -#define g_debug(x) x -#endif -/* grep keywords: scan_vectors frame_vector */ -int frame_vector(struct box *box1, int x, int y, - int cs, int mark, int diag, int ds) { - int i1, i2, i2o, - new_x=1, /* flag for storing the vector x,y */ - steps=1, /* steps between stored vectors, speedup for big frames */ - d, /* direction */ - ox, oy, /* starting point */ - nx, ny, mx, my, /* used for simplification */ - /* ToDo: add periphery to box (german: Umfang?) */ - rc = 1, /* return code, circumference, sum vector lengths */ - rot = 0, /* memory for rotation, rot=8 means one full rotation */ - vol = 0; /* volume inside frame, negative for white inside black */ - pix *p=box1->p; - - /* translate the 8 directions to (x,y) pairs, - * if only four directions are used, only every 2nd vector is accessed, - * +1 turn left, -1 turn right - */ - static const int d0[8][2] = - { { 0, -1}, /* up */ {-1, -1}, /* up-le */ - {-1, 0}, /* left */ {-1, 1}, /* do-le */ - { 0, 1}, /* down */ { 1, 1}, /* do-ri */ - { 1, 0}, /* right */ { 1, -1} }; /* up-ri */ - - /* check bounds */ - if (outbounds(p, x, y)) - return 0; - - /* pixel color we are looking for, 0=black, 1=white */ - d = ds; - i1 = ((getpixel(p, x, y ) < cs) ? 0 : 1); - i2 = ((getpixel(p, x + d0[d][0], y + d0[d][1]) < cs) ? 0 : 1); - - g_debug(fprintf(stderr,"\nLEV2 frame_vector @ %3d %3d d%d %2d %2d" - " %d-%d pix=%3d mark=%d cs=%d",\ - x,y,ds,d0[ds][0],d0[ds][1],i1,i2,getpixel(p,x,y),mark,cs);) - - if (i1==i2){ - fprintf(stderr,"ERROR frame_vector: no border\n"); - return -7; /* no border detected */ - } - - /* initialize boxframe outside this function - box1->x0=box1->x1=x; - box1->y0=box1->y1=y; - */ - - /* initialize boxvector outside this function - box1->num_frames=0 - num_frame_vectors[0]=0 ??? - and store start value - */ - if (box1->num_frames > MaxNumFrames) return -2; - /* index to next (x,y) */ - i2o=i2=( (box1->num_frames==0)?0: - box1->num_frame_vectors[ box1->num_frames ] ); -#if 0 // obsolete v0.43 - box1->frame_vector[i2][0]=x; - box1->frame_vector[i2][1]=y; - i2++; - box1->num_frame_vectors[ box1->num_frames ]=i2; -#endif - box1->num_frames++; - - /* robot stores start-position */ - ox = x; oy = y; /* look forward to white pixel */ - - for (;;) { /* stop if same marked pixel touched */ - - g_debug(fprintf(stderr,"\nLEV3: x= %3d %3d d= %d rot= %2d %3d",x,y,d,rot,i2);) - - /* ToDo: store max. abs(rot) ??? for better recognition */ - if (new_x) { - g_debug(fprintf(stderr,"\nLEV2: markB xy= %3d %3d ", x, y);) - p->p[x + y * p->x] |= (mark & 7); /* mark black pixel */ - } - - /* store a new vector or enlarge the predecessor */ - if (new_x && (rc%steps)==0) { /* dont store everything on big chars */ - if (i2>=MaxFrameVectors) { - box1->num_frame_vectors[ box1->num_frames-1 ]=i2; - reduce_vectors(box1,1); /* simplify loop */ - i2=box1->num_frame_vectors[ box1->num_frames-1 ]; - /* enlarge steps on big chars getting speedup */ - steps=(box1->y1-box1->y0+box1->x1-box1->x0)/32+1; - } - /* store frame-vector */ - if (i2frame_vector[i2][0]=x; - box1->frame_vector[i2][1]=y; - /* test if older vector points to the same direction */ - if (i2>1) { - /* get predecessor */ - nx=box1->frame_vector[i2-1][0]-box1->frame_vector[i2-2][0]; - ny=box1->frame_vector[i2-1][1]-box1->frame_vector[i2-2][1]; - mx=x -box1->frame_vector[i2-1][0]; - my=y -box1->frame_vector[i2-1][1]; - /* same direction? */ - if (nx*my-ny*mx==0 && nx*mx>=0 && ny*my>=0) { - /* simplify by removing predecessor */ - i2--; - box1->frame_vector[i2][0]=x; - box1->frame_vector[i2][1]=y; - } /* do not simplify */ - } - i2++; - box1->num_frame_vectors[ box1->num_frames-1 ]=i2; - } - g_debug(fprintf(stderr," stored @ %3d steps= %d", i2-1, steps);) - } - new_x=0; /* work for new pixel (x,y) done */ - - /* check if round trip is finished */ - if (x==ox && y==oy && abs(rot)>=8) break; - - /* look to the front of robot (turtle or ant) */ - nx = x + d0[d][0]; - ny = y + d0[d][1]; - - /* next step, if right is a wall turn the turtle left */ - if ( outbounds(p, nx, ny) || i1 != ((getpixel(p,nx,ny)=0 && nxx) { /* if inbound */ - g_debug(fprintf(stderr,"\nLEV2: markW xy= %3d %3d ", nx, ny);) - p->p[nx + ny * p->x] |= (mark & 7); /* mark white pixel */ - } - /* rotate left 90 or 45 degrees */ - d=(d+2-diag) & 7; rot+=2-diag; - /* calculate volume inside frame */ - switch (d+diag) { - case 2+2: vol-=x-1; break; - case 6+2: vol+=x; break; - } - } - else { /* if no wall, go forward and turn right (90 or 45 degrees) */ - x=nx; y=ny; - /* turn back and rotate left */ - d=(d+4+2-diag) & 7; rot+=2-diag-4; - rc++; /* counting steps, used for speedup */ - - /* enlarge frame */ - if (x < box1->x0) box1->x0 = x; - if (x > box1->x1) box1->x1 = x; - if (y < box1->y0) box1->y0 = y; - if (y > box1->y1) box1->y1 = y; - - new_x=1; - } - } - - /* to distinguish inner and outer frames, store volume as +v or -v */ - box1->frame_vol[ box1->num_frames-1 ] = vol; - box1->frame_per[ box1->num_frames-1 ] = rc-1; - - /* dont count and store the first vector twice */ - if (i2-i2o>1) { - i2--; rc--; box1->num_frame_vectors[ box1->num_frames-1 ]=i2; - } - /* output break conditions */ - g_debug(fprintf(stderr,"\nLEV2 o= %3d %3d x= %3d %3d r=%d v=%d",ox,oy,x,y,rot,vol);) - /* rc=1 for a single point, rc=2 for a two pixel sized point */ - g_debug(fprintf(stderr," steps= %3d vectors= %3d",rc,i2);) - /* out_x(box1); ToDo: output only the first thousend */ - return rc; /* return number of bordering pixels = periphery? */ -} - - - -/* clear lowest 3 (marked) bits (they are used for marking) */ -void clr_bits(pix * p, int x0, int x1, int y0, int y1) { - int x, y; - for ( y=y0; y <= y1; y++) - for ( x=x0; x <= x1; x++) - p->p[x+y*p->x] &= ~7; -} - -/* look for white holes surrounded by black points - * at the moment look for white point with black in all four directions - * - store position of hole in coordinates relativ to box! - * ToDo: count only holes with vol>10% ??? - * ToDo: rewrite for frame vectors (faster, no malloc) - * holes are frames rotating left hand - * obsolete, do it with vectors - */ -int num_hole(int x0, int x1, int y0, int y1, pix * p, int cs, holes_t *holes) { - int num_holes = 0, x, y, hole_size; - pix b; // temporary mini-page - int dx = x1 - x0 + 1, dy = y1 - y0 + 1; - unsigned char *buf; // 2nd copy of picture, for working - - if (holes) holes->num=0; - if(dx<3 || dy<3) return 0; - b.p = buf = (unsigned char *) malloc( dx * dy ); - if( !buf ){ - fprintf( stderr, "\nFATAL: malloc(%d) failed, skip num_hole", dx*dy ); - return 0; - } - if (copybox(p, x0, y0, dx, dy, &b, dx * dy)) - { free(b.p); return -1;} - - // printf(" num_hole("); - /* --- mark white-points connected with border */ - for (x = 0; x < b.x; x++) { - if (getpixel(&b, x, 0) >= cs) - mark_nn(&b, x, 0, cs, AT); - if (getpixel(&b, x, b.y - 1) >= cs) - mark_nn(&b, x, b.y - 1, cs, AT); - } - for (y = 0; y < b.y; y++) { - if (getpixel(&b, 0, y) >= cs) - mark_nn(&b, 0, y, cs, AT); - if (getpixel(&b, b.x - 1, y) >= cs) - mark_nn(&b, b.x - 1, y, cs, AT); - } - - //g_debug(out_b(NULL,&b,0,0,b.x,b.y,cs);) - // --- look for unmarked white points => hole - for (x = 0; x < b.x; x++) - for (y = 0; y < b.y; y++) - if (!((marked(&b, x, y)&AT)==AT)) // unmarked - if (getpixel(&b, x, y) >= cs) { // hole found -#if 0 - hole_size=mark_nn(&b, x, y, cs, AT); /* old version */ - if (hole_size > 1 || dx * dy <= 40) - num_holes++; -#else - { /* new version, for future store of hole characteristics */ - int x0, x1, y0, y1, i, j; - x0 = x1 = x; - y0 = y1 = y; // not used - hole_size=frame_nn(&b, x, y, &x0, &x1, &y0, &y1, cs, AT, JOB->tmp.n_run & 1); - // store hole for future use, num is initialized with 0 - if (hole_size > 1 || dx * dy <= 40){ - num_holes++; - if (holes) { - // sort in table - for (i=0;inum && ihole[i].size < hole_size) break; - for (j=MAX_HOLES-2;j>=i;j--) - holes->hole[j+1]=holes->hole[j]; - if (ihole[i].size=hole_size; - holes->hole[i].x=x; - holes->hole[i].y=y; - holes->hole[i].x0=x0; - holes->hole[i].y0=y0; - holes->hole[i].x1=x1; - holes->hole[i].y1=y1; - } - holes->num++; - } - } - } -#endif - } - free(b.p); - // printf(")=%d",num_holes); - return num_holes; -} - -/* count for black nonconnected objects --- used for i,auml,ouml,etc. */ -/* ToDo: obsolete, replaced by vectors and box.num_boxes */ -int num_obj(int x0, int x1, int y0, int y1, pix * p, int cs) { - int x, y, rc = 0; // rc=num_obj - unsigned char *buf; // 2nd copy of picture, for working - pix b; - - if(x1x0;y1=box1->y0;x2=box2->x0;y2=box2->y0; - dx1=box1->x1-box1->x0+1; dx2=box2->x1-box2->x0+1; dx=((dx1>dx2)?dx1:dx2); - dy1=box1->y1-box1->y0+1; dy2=box2->y1-box2->y0+1; dy=((dy1>dy2)?dy1:dy2); - if(abs(dx1-dx2)>1+dx/16 || abs(dy1-dy2)>1+dy/16) return 100; - // compare relations to baseline and upper line - if(2*box1->y1>box1->m3+box1->m4 && 2*box2->y1m3+box2->m4) rbad+=128; - if(2*box1->y0>box1->m1+box1->m2 && 2*box2->y0m1+box2->m2) rbad+=128; - // compare pixels - for( y=0;y0) rbad+=16*v1; - else rbad++; - } - if(rgood+rbad) rc= (100*rbad+(rgood+rbad-1))/(rgood+rbad); else rc=99; - if(rc<10 && JOB->cfg.verbose & 7){ - fprintf(stderr,"\n# distance rc=%d good=%d bad=%d",rc,rgood,rbad); -// out_x(box1);out_x(box2); - } - return rc; -} - - - -// ============================= call OCR engine ================== ;) -// nrun=0 from outside, nrun=1 from inside (allows modifications, oobsolete) -wchar_t whatletter(struct box *box1, int cs, int nrun){ - wchar_t bc=UNKNOWN; // best letter - wchar_t um=SPACE; // umlaut? '" => modifier - pix *p=box1->p; // whole image - int x,y,dots,xa,ya,x0,x1,y0,y1,dx,dy,i; - pix b; // box - struct box bbuf=*box1; // restore after modifikation! - - if (box1->num_ac>0 && box1->wac[0]>=JOB->cfg.certainty && bc==UNKNOWN) { - bc=box1->tac[0]; - } - // if (bc!=UNKNOWN) return bc; - // if whatletter() called again, only unknown chars are processed - // bad for splitting! - - // store box data, which can be modified for modified chars in 2nd run - bbuf.x0=box1->x0; bbuf.y0=box1->y0; - bbuf.x1=box1->x1; bbuf.y1=box1->y1; - - xa=box1->x; ya=box1->y; - x0=box1->x0; y0=box1->y0; - x1=box1->x1; y1=box1->y1; - // int vol=(y1-y0+1)*(x1-x0+1); // volume - // crossed l-m , divided chars - while( get_bw(x0,x1,y0,y0,p,cs,1)!=1 && y0+15 && box1->num_boxes>1) - testumlaut(box1,cs,2,&um); /* set box1->modifier + new y0 */ - - dots=box1->dots; - y0 =box1->y0; // dots==2 => y0 below double dots - dy =y1-y0+1; - - // move upper and lower border (for divided letters) - while( get_bw(x0,x1,y0,y0,p,cs,1)==0 && y0+1x0=x0; box1->y0=y0; // set reduced frame - box1->x1=x1; box1->y1=y1; - - // set good startpoint (probably bad from division)? - if( xax1 || yay1 - || getpixel(p,xa,ya)>=cs /* || 2*ya0 ){ - // subfunction? also called after division of two glued chars? - for(y=y1;y>=y0;y--) // low to high (not i-dot) - for(x=(x0+x1)/2,i=0;x>=x0 && x<=x1;i++,x+=((2*i&2)-1)*i) /* is that ok? */ - if (getpixel(p,x,y)x,y be set? */ - } - - // ----- create char-only-box ------------------------------------- - // ToDo: this will be obsolete if vectors are used only - if(dx<1 || dy<1) return bc; /* should not happen */ - b.p = (unsigned char *) malloc( dx * dy ); - if (!b.p) fprintf(stderr,"Warning: malloc failed L%d\n",__LINE__); - if( copybox(p,x0,y0,dx,dy,&b,dx*dy) ) - { free(b.p); return bc; } - // clr_bits(&b,0,b.x-1,0,b.y-1); - // ------ use diagonal too (only 2nd run?) - /* following code failes on ! and ? obsolete if vectors are used - ToDo: - - mark pixels neighoured to pixels outside and remove them from &b - v0.40 - will be replaced by list of edge vectors - - mark accents, dots and remove them from &b - */ -#if 1 /* becomes obsolate by vector code */ - if (y0>0) // mark upper overlap - for ( x=x0; x<=x1; x++) { - if (getpixel(p,x,y0-1)0) // mark left overlap - for ( y=y0; y<=y1; y++) { - if (getpixel(p,x0-1,y)x-1) // mark right overlap - for ( y=y0; y<=y1; y++) { - if (getpixel(p,x1+1,y)num_ac>0 && box1->wac[0]>=JOB->cfg.certainty && bc==UNKNOWN) { - bc=box1->tac[0]; - } - - if (um!=0 && um!=SPACE && bc<127) { /* ToDo: is that obsolete now? */ - wchar_t newbc; - newbc = compose(bc, um ); - if (newbc == bc) { /* nothing composed */ - if(JOB->cfg.verbose & 7) - fprintf(stderr, "\nDBG whatletter: compose(%s) was useless (%d,%d)", - decode(bc,ASCII), box1->x0, box1->y0); - // if(JOB->cfg.verbose & 6) out_x(box1); - } - bc = newbc; - } - // restore modified boxes - box1->x0=bbuf.x0; box1->y0=bbuf.y0; - box1->x1=bbuf.x1; box1->y1=bbuf.y1; -// if (box1->c==UNKNOWN) out_b(box1,&b,0,0,dx,dy,cs); // test - - free(b.p); - return bc; -} - -/* -** creates a list of boxes/frames around objects detected -** on the pixmap p for further work -** returns number of boxes created. -** - by the way: get average X, Y (avX=sumX/numC,..) -*/ -int scan_boxes( pix *p ){ - int x, y, nx, cs, rc, ds; - struct box *box3; - - if (JOB->cfg.verbose) - fprintf(stderr,"# scanning boxes"); - - cs = JOB->cfg.cs; - JOB->res.sumX = JOB->res.sumY = JOB->res.numC = 0; - - /* clear the lowest bits of each pixel, later used as "scanned"-marker */ - clr_bits( p, 0, p->x - 1, 0, p->y - 1); - - for (y=0; y < p->y; y++) - for (x=0; x < p->x; x++) - for (ds=2; ds<7; ds+=4) { // NO - dust of size 1 is not removed !!! - nx=x+((ds==2)?-1:+1); - if (nx<0 || nx>=p->x) continue; /* out of image, ex: recframe */ - if ( getpixel(p, x,y)>=cs || getpixel(p,nx,y)< cs) // b/w transition? - continue; - if ((marked(p, x,y) & 1)&&(marked(p, nx, y) & 1)) - continue; - /* check (and mark) only horizontal b/w transitions */ - // --- insert new box in list - box3 = (struct box *)malloc_box(NULL); - box3->x0=box3->x1=box3->x=x; - box3->y0=box3->y1=box3->y=y; - box3->num_frames=0; - box3->dots=0; - box3->num_boxes=1; - box3->num_subboxes=0; - box3->modifier='\0'; - box3->num=JOB->res.numC; - box3->line=0; // not used here - box3->m1=0; box3->m2=0; box3->m3=0; box3->m4=0; - box3->p=p; - box3->num_ac=0; // for future use - -/* frame, vectorize and mark only odd/even horizontal b/w transitions - * args: box, x,y, cs, mark, diag={0,1}, ds={2,6} - * ds - start direction, 6=right of right border, 2=left of left border - * ret - 0=ok, -1=already marked, -2=max_num_frames_exceeded - * -7=no border in direction ds - * ToDo: count errors and print out for debugging - */ - rc=frame_vector(box3, x, y, cs, 1, 1, ds); - g_debug(fprintf(stderr,"\n# ... scan xy= %3d %3d rc= %2d", x, y, rc);) - if (rc<0) { free_box(box3); continue; } - if (box3->num_frames && !box3->num_frame_vectors[0]) - fprintf(stderr,"\nERROR scan_boxes: no vector in frame (%d,%d)",x,y); - - JOB->res.numC++; - JOB->res.sumX += box3->x1 - box3->x0 + 1; - JOB->res.sumY += box3->y1 - box3->y0 + 1; - - box3->c=(((box3->y1-box3->y0+1) - *(box3->x1-box3->x0+1)>=MaxBox)? PICTURE : UNKNOWN); - list_app(&(JOB->res.boxlist), box3); // append to list - // ToDo: debug - // if (JOB->cfg.verbose && box3->y0==29) out_x(box3); - } - if(JOB->res.numC){ - if (JOB->cfg.verbose) - fprintf(stderr," nC= %3d avD= %2d %2d\n",JOB->res.numC, - (JOB->res.sumX+JOB->res.numC/2)/JOB->res.numC, - (JOB->res.sumY+JOB->res.numC/2)/JOB->res.numC); - } - return JOB->res.numC; -} - -/* compare ints for sorting. Return -1, 0, or 1 according to - whether *vr < *vs, vr == *vs, or *vr > *vs */ -int -intcompare (const void *vr, const void *vs) -{ - int *r=(int *)vr; - int *s=(int *)vs; - - if (*r < *s) return -1; - if (*r > *s) return 1; - return 0; -} - -/* - * measure_pitch - detect monospaced font and measure the pitch - * measure overall pitch for difficult lines, - * after that measure pitch per line - * dists arrays are limited to 1024 elements to reduce - * cpu usage for qsort on images with extreme high number of objects - * insert space if dist>=pitch in list_insert_spaces() - * ToDo: ??? - * - min/max distance-matrix a-a,a-b,a-c,a-d ... etc; td,rd > ie,el,es - * - OR measuring distance as min. pixel distance instead of box distance - * especially useful for italic font! - */ -void measure_pitch( job_t *job ){ - int numdists=0, spc=0, /* number of stored distances */ - pitch_p=2, pdist, pdists[1024], /* proportional distances */ - pitch_m=6, mdist, mdists[1024], /* monospaced distances */ - monospaced=0, l1; - struct box *box2, *prev=NULL; - - if(job->cfg.verbose){ fprintf(stderr,"# check for word pitch"); } - for (l1=0; l1res.lines.num; l1++) - { /* 0 means all lines */ - if(job->cfg.verbose){ fprintf(stderr,"\n# line %2d",l1); } - numdists = 0; /* clear distance lists */ - for_each_data(&(job->res.boxlist)) { - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - if (l1>0 && box2->line!=l1) continue; /* ignore other lines */ - /* ignore dots and pictures (min. font is 4x6) */ - if (box2->y1 - box2->y0 + 1 < 4 || box2->c==PICTURE) { prev=NULL; } - if (!prev) { prev=box2; continue; } /* we need a predecessor */ - /* use center distance for monospaced fonts */ - mdist = ((box2->x0 + box2->x1) - (prev->x0 + prev->x1) + 1)/2; - /* use gap for proportional fonts */ - pdist = box2->x0 - prev->x1 + 1; - /* ToDo: better take 3 instead of 2 neighbours?, smallest font 4x6 */ - /* fonts are expected to be 6 to 60 pixels high, which is about - 4 to 50 pixels wide. We allow some extra margin. */ - if (3 < mdist && mdist < 150) { /* better mdist < 3*Xaverage ? */ - /* two options for overflow: 1) ignore, 2) store randomly */ - if (numdists<1024) { /* we do ignore here */ - mdists[numdists] = mdist; - pdists[numdists] = pdist; - numdists++; - } - } - prev = box2; - } end_for_each(&(job->res.boxlist)); - - if(job->cfg.verbose){ fprintf(stderr," num_gaps= %2d",numdists); } - if( numdists<8 ){ - if (job->cfg.verbose && l1==0) /* only for all lines */ - fprintf(stderr," (WARNING num_gaps<8)"); - } - if (numdists>0) { - int i,diff,ni_min,max,best_m,best_p,ni; double v; - /* aware: takes long time for big data sets */ - /* dilute? (german: ausduennen?) */ - qsort (mdists, numdists, sizeof (int), intcompare); - qsort (pdists, numdists, sizeof (int), intcompare); - /* the new method, div0? */ - v = (mdists[numdists*7/10]-mdists[numdists/5]) - /(double)mdists[numdists/5]; - /* measurements showed v=.09 for Courier and .44 for Times-Roman */ - if (l1==0) monospaced = (v < .22); - best_m= numdists/5; - best_p=4*numdists/5; - /* try to find better pitch for monospaced font (ok for prop) */ - for (i=numdists/5+1;i=3*mdists[best_m]) { best_m=i-1; break; } - } - /* try to find better pitch for proportional font */ - // the largest diff could be the best, if diff is always 1, - // take the diff with the lowest weight - for (ni=ni_min=1024,max=0,i=numdists/2+1;imax) { - max=diff; best_p=i-1; - if ((job->cfg.verbose&(32+16))==48) - fprintf(stderr," best_p=%d maxdiff=%d\n# ...", pdists[best_p], max); - if (max>3 && 3*pdists[i]>=4*pdists[i-1]) { break; } - } - if (diff) { - if (ni16) best_p=i-1; - if ((job->cfg.verbose&(32+16))==48) - fprintf(stderr," best_p=%d ni_min=%d\n# ...", pdists[best_p], ni_min); - } - ni=1; - } else ni++; - } - if (numdists<16 && max<=1 && ni_min>1) best_p=numdists-1; // one word -#if 1 /* debugging */ - if ((job->cfg.verbose&(32+16))==48) { - fprintf(stderr,"\n# ..."); - for (i=0;i0 && job->cfg.spc==0) { - job->res.lines.pitch[l1]=(monospaced?pitch_m:pitch_p); - job->res.lines.mono[l1]=monospaced; - } - if (job->cfg.verbose) { - fprintf(stderr,"\n# ..." - " mono: v=%f (v<0.22) line=%d numdists=%d\n# ...", - v, l1, numdists); - fprintf(stderr," mono: min=%3d max=%3d pitch=%3d @ %2d%%\n# ...", - mdists[0],mdists[numdists-1],pitch_m,best_m*100/numdists); - fprintf(stderr," prop: min=%3d max=%3d pitch=%3d @ %2d%%\n# ...", - pdists[0],pdists[numdists-1],pitch_p,best_p*100/numdists); - fprintf(stderr," result: distance >= %d considered space\n# ...", - job->res.lines.pitch[l1]); - } - } /* if (not) enough spaces */ - if (l1==0) { /* set default spaces to each line */ - int l2; - spc = job->cfg.spc; - if (spc==0) /* set only if not set by option */ - spc = ((monospaced)?pitch_m:pitch_p); - for (l2=0; l2res.lines.num; l2++ ) - job->res.lines.pitch[l2]=spc; - } - } /* each line */ - if (job->cfg.spc==0) - job->cfg.spc = spc; - if (job->cfg.verbose) - fprintf(stderr," overall space width is %d %s\n", - spc, ((monospaced)?"monospaced":"proportional")); - - -} - -/* ---- count subboxes (white holes within black area) -------- - * new: count boxes lying inside another box (usually holes, ex: "aeobdg") - * needed for glue_boxes, dont glue textboxes, tables and other complex - * objects - * ToDo: count only frames of invers spin? do we need sorted list here? -> no - */ -int count_subboxes( pix *pp ){ - int ii=0, num_mini=0, num_same=0, cnt=0; - struct box *box2,*box4; - progress_counter_t *pc = NULL; - if (JOB->cfg.verbose) { fprintf(stderr,"# count subboxes\n# ..."); } - - pc = open_progress(JOB->res.boxlist.n,"count_subboxes"); - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - box2->num_subboxes=0; - progress(cnt++,pc); - if ( (box2->x1 - box2->x0)<2 - || (box2->y1 - box2->y0)<2) continue; /* speedup for dotted bg */ - // holes inside box2 char, aoebdqg, 0.41 - for_each_data(&(JOB->res.boxlist)) { - box4=(struct box *)list_get_current(&(JOB->res.boxlist)); - if (box4->y0 > box2->y1) break; // faster, but boxes need to be sorted - // ToDo: better use binary tree (above/below x) to find near boxes? - if (box4==box2) continue; - if( box4->x0==box2->x0 && box4->x1==box2->x1 - && box4->y0==box2->y0 && box4->y1==box2->y1) - num_same++; /* erroneous!? */ - if ( box4->x0 >= box2->x0 && box4->x1 <= box2->x1 - && box4->y0 >= box2->y0 && box4->y1 <= box2->y1 - && box4->num_subboxes==0 ) /* box4 inside box2? */ - { - box2->num_subboxes++; ii++; - if ((box4->x1 - box4->x0 + 1) - *(box4->y1 - box4->y0 + 1)<17) num_mini++; - } - } end_for_each(&(JOB->res.boxlist)); -#if 0 - if (cnt < 1000 && JOB->cfg.verbose) - fprintf(stderr," %4d box %4d %4d %+3d %+3d subboxes %4d\n# ...", - cnt, box2->x0, box2->y0, box2->x1-box2->x0, - box2->y1-box2->y0, box2->num_subboxes); -#endif - } end_for_each(&(JOB->res.boxlist)); - close_progress(pc); - if (JOB->cfg.verbose) - fprintf(stderr," %3d subboxes counted (mini=%d, same=%d) nC= %d\n", - ii, num_mini, num_same/2 /* counted twice */, cnt); - return 0; -} - -/* ---- glue holes tochars( before step1 ) v0.42 ----------------------- - glue boxes lying inside another box (usually holes, ex: "aeobdg46890") - Dont add dust to a char! - lines are not detected yet -*/ -int glue_holes_inside_chars( pix *pp ){ - int ii, cs, x0, y0, x1, y1, cnt=0, - glued_same=0, glued_holes=0; - struct box *box2, *box4; - progress_counter_t *pc = NULL; - cs=JOB->cfg.cs; - { - count_subboxes( pp ); /* move to pgm2asc() later */ - - pc = open_progress(JOB->res.boxlist.n,"glue_holes_inside_chars"); - if (JOB->cfg.verbose) - fprintf(stderr,"# glue holes to chars nC= %d\n# ...",JOB->res.numC); - ii=0; - for_each_data(&(JOB->res.boxlist)) { - // get the smaller box which may be extended by bigger boxes around it - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - x0 = box2->x0; x1 = box2->x1; - y0 = box2->y0; y1 = box2->y1; - - progress(cnt++,pc); - - // would it better than moving vectors to build a sub-box-tree? - - // do not remove chars inside pictures (car plates on photos) - if( box2->c == PICTURE || box2->num_subboxes > 7) continue; - - // holes inside char, aoebdqg, 0.41 - // dont merge boxes which have subboxes by itself! - // search boxes inside box2 - // if (x1-x0+1>2 || y1-y0+1>2) /* skip tiny boxes, bad for 4x6 */ - for_each_data(&(JOB->res.boxlist)) { - box4=(struct box *)list_get_current(&(JOB->res.boxlist)); - if(box4!=box2 && box4->c != PICTURE ) - { - // ToDo: dont glue, if size differs by big factors (>16?) - if ( ( box4->x0==x0 && box4->x1==x1 - && box4->y0==y0 && box4->y1==y1 ) /* do not happen !? */ - || ( box4->x0>=x0 && box4->x1<=x1 - && box4->y0>=y0 && box4->y1<=y1 - && box4->num_subboxes==0 ) ) /* no or very small subboxes? */ - { // fkt melt(box2,box4) - // same box, if very small but hollow char (4x5 o) - if( box4->x0==x0 && box4->x1==x1 - && box4->y0==y0 && box4->y1==y1) glued_same++; else glued_holes++; - // fprintf(stderr,"\n# DEBUG merge:"); - // out_x(box2); // small - // out_x(box4); // big - if ((JOB->cfg.verbose & 7)==7) // LEV3 - fprintf(stderr," glue hole (%4d %4d %+3d %+3d %+4d)" - " (%4d %4d %+3d %+3d %+4d) %d\n# ...", - x0, y0, x1-x0+1, y1-y0+1, box2->frame_vol[0], - box4->x0, box4->y0, - box4->x1-box4->x0+1, box4->y1-box4->y0+1, - box4->frame_vol[0], glued_same); - if ((box4->x1-box4->x0+1)< 8*(x1-x0+1) - || (box4->y1-box4->y0+1)<12*(y1-y0+1)) // skip dust - merge_boxes( box2, box4 ); // add box4 to box2 - // out_x(box2); - x0 = box2->x0; x1 = box2->x1; - y0 = box2->y0; y1 = box2->y1; - JOB->res.numC--; // dont count fragments as chars - ii++; // count removed - list_del(&(JOB->res.boxlist), box4); // remove box4 - free_box(box4); - // now search another hole inside box2 - } - } - } end_for_each(&(JOB->res.boxlist)); - - } end_for_each(&(JOB->res.boxlist)); - - if (JOB->cfg.verbose) - fprintf(stderr," glued: %3d holes, %3d same, nC= %d\n", - glued_holes, glued_same, JOB->res.numC); - close_progress(pc); - } - return 0; -} - - -/* ---- glue broken chars ( before step1 ??? ) ----------------------- - use this carefully, do not destroy previous detection ~fi, broken K=k' g - glue if boxes are near or diagonally connected - other strategy: mark boxes for deleting and delete in extra loop at end - faster: check only next two following boxes because list is sorted! - ToDo: store m4 of upper line to m4_of_prev_line, and check that "-points are below - done: glue boxes lying inside another box (usually holes, ex: "aeobdg") - Dont add dust to a char! - lines should be detected already (Test it for m1-m4 unknown) - ToDo: divide in glue_idots, glue_thin_chars etc. and optimize it -*/ -int glue_broken_chars( pix *pp ){ - int ii, y, cs, x0, y0, x1, y1, cnt=0, - num_frags=0, glued_frags=0, glued_hor=0; - struct box *box2, *box4; - progress_counter_t *pc = NULL; - cs=JOB->cfg.cs; - { - count_subboxes( pp ); /* move to pgm2asc() later */ - - pc = open_progress(JOB->res.boxlist.n,"glue_broken_chars"); - if (JOB->cfg.verbose) - fprintf(stderr,"# glue broken chars nC= %d\n# ...",JOB->res.numC); - ii=0; - for_each_data(&(JOB->res.boxlist)) { - // get the box which may be extended by boxes around it - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - x0 = box2->x0; x1 = box2->x1; - y0 = box2->y0; y1 = box2->y1; - - progress(cnt++,pc); - - // vertical broken (g965T umlauts etc.) - // not: f, - - // would it better than moving vectors to build a sub-box-tree? - - // do not remove chars inside pictures (car plates on photos) - if( box2->c == PICTURE || box2->num_subboxes > 7) continue; - - /* continue loop if box is below or above line */ - if( box2->m4>0 && y0>box2->m4 ) continue; /* dust outside ? */ - if( box2->m1>0 && y0m1-(box2->m3-box2->m2) ) continue; - /* ToDo: - * - check that y0 is greater as m3 of the char/line above - */ - - // check small boxes (box2) whether they belong - // to near same size or bigger boxes (box4) - if( 2*(y1-y0) < box2->m4 - box2->m1 // care for dots etc. - && ( 2*y1<=(box2->m3+box2->m2) // upper fragments - || 2*y0>=(box2->m3+box2->m2)) ) { // lower fragments - struct box *box5=NULL, *box6=NULL; // nearest and next nearest box - box4=NULL; - num_frags++; /* count for debugging */ - // get the [2nd] next x-nearest box in the same line - for_each_data(&(JOB->res.boxlist)) { - box4=(struct box *)list_get_current(&(JOB->res.boxlist)); - if (box4 == box2 || box4->c == PICTURE) continue; - /* 0.42 speed up for backround pixel pattern, box4 to small */ - if ( box4->x1 - box4->x0 + 1 < x1-x0+1 - && box4->y1 - box4->y0 + 1 < y1-y0+1 ) continue; - // have in mind that line number may be wrong for dust - if (box4->line>=0 && box2->line>=0 && box4->line==box2->line) - { - if (!box5) box5=box4; - if ( abs(box4->x0 + box4->x1 - 2*box2->x0) - x0 + box5->x1 - 2*box2->x0)) - { box6=box5; box5=box4; } - } - } end_for_each(&(JOB->res.boxlist)); - box4=box5; // next nearest box within the same line - if (box4) { -#if 0 /* set this to 1 for debugging of melting bugs */ - if (JOB->cfg.verbose & 7) { - fprintf(stderr,"\n# next two boxes are candidates for melting "); - out_x(box2); - out_x(box4); } -#endif - if( /* umlaut "a "o "u, ij; box2 is the small dot, box4 the body */ - ( y1 <= box2->m2 - && box4->y1 >= box2->m2 // dont melt dots together - && 2* y1 < box4->y1 + box4->y0 // box2 above box4 - && box4->x1+JOB->res.avX/2>=x0 - && box4->x0-JOB->res.avX/2<=x1 - && (y1 < box4->y0 || x0 < box4->x1) // dont melt "d'" - && 3* ( y1 - box4->y0) - <= 2* (box4->y1 - box4->y0) // too far away? dust! - && 8* ( x1 - x0 + 1) - >= (box4->x1 - box4->x0 + 1) // dot must have minimum size - && 10* ( y1 - y0 + 1) - >= (box4->y1 - box4->y0 + 1) // dot must have minimum size - ) || ( 0 && /* broken T */ - 3*(box2->x1 - box2->x0) > 2*JOB->res.avX - && 4*box4->x0>3*box2->x0+box2->x1 - && 4*box4->x1x0+3*box2->x1 - ) - || /* !?; box2 is the dot, box4 the body */ - ( 2*box4->x1>=x0+x1 /* test if box4 is around box2 */ - && 2*box4->x0<=2*x1 /* +x0+1 Jan00 */ - && ( x1-x0 <= box4->x1-box4->x0+2 ) - && 2*y0>=box2->m2+box2->m3 - && 4*y1>=box2->m2+3*box2->m3 - && 4*(y1-y0)m4-box2->m1 - && (8*box4->y1 < box4->m2+7*box4->m3 - || box4->m4-box4->m1<16) /* Jan00 */ - ) - || /* =;: box2 is the upper box, box4 the lower box */ - ( 2*box4->x1>=x0+x1 /* test if box4 is around box2 */ - && 2*box4->x0<=2*x1 /* +x0+1 */ - && ( x1-x0 <= box4->x1-box4->x0+4 ) - && ( 4*x0 <= 3*box4->x1+box4->x0 ) - && (( box2->m2 && box4->m2 - && y1< box2->m3 - && 2*box4->y1 > box4->m3+box4->m2 // can be bigger than m3 - && 4*box4->y0 >= 3*box4->m2+box4->m3 - && 2*box2->y0 < box2->m3+box2->m2 - ) - || ( (!box2->m2) || (!box4->m2) ) - ) - ) - ) - { // fkt melt(box2,box4) - if (JOB->cfg.verbose & 7) - fprintf(stderr," glue objects (%3d %3d %+3d %+3d)" - " (%3d %3d %+3d %+3d)\n# ...", - x0, y0, x1-x0+1, y1-y0+1, box4->x0, box4->y0, - box4->x1-box4->x0+1, box4->y1-box4->y0+1); - // fprintf(stderr,"\n# DEBUG merge:"); // d=7x34 @ (109,51) ??? - // out_x(box2); - // out_x(box4); - merge_boxes( box2, box4 ); // add box4 to box2 - x0 = box2->x0; x1 = box2->x1; - y0 = box2->y0; y1 = box2->y1; - // if (JOB->cfg.verbose & 4) out_x(box2); - // JOB->res.numC--; // dont count fragments as chars - ii++; glued_frags++; // remove - // output_list(JOB); - list_del(&(JOB->res.boxlist), box4); /* ret&1: error-message ??? */ - // output_list(JOB); - free_box(box4); - } - } - } -// continue; - - // horizontally broken w' K' - if( 2*y1 < (box2->m3+box2->m2) ) - if( 2*(y1-y0) < (box2->m3+box2->m2) ) // fragment - for_each_data(&(JOB->res.boxlist)) { - box4=(struct box *)list_get_current(&(JOB->res.boxlist)); - if(box4!=box2 && box4->c != PICTURE ) - { - if( box4->line>=0 && box4->line==box2->line - && box4->x1>=x0-1 && box4->x1x0+3*box4->x1<4*x0) - if( get_bw(x0 ,x0 ,y1,y1 ,pp,cs,1) == 1) - if( get_bw(x0-2,x0-1,y1,y1+2,pp,cs,1) == 1) - { // fkt melt(box2,box4) - put(pp,x0,y1+1,~(128+64),0); - merge_boxes( box2, box4 ); - x0 = box2->x0; x1 = box2->x1; - y0 = box2->y0; y1 = box2->y1; - JOB->res.numC--; ii++; // remove - glued_hor++; - list_del(&(JOB->res.boxlist), box4); - free_box(box4); - } - } - } end_for_each(&(JOB->res.boxlist)); - - // horizontally broken n h (h=l_) v0.2.5 Jun00 - if( abs(box2->m2-y0)<=(y1-y0)/8 ) - if( abs(box2->m3-y1)<=(y1-y0)/8 ) - if( num_cross(x0, x1,(y0+ y1)/2,(y0+ y1)/2,pp,cs) == 1) - if( num_cross(x0, x1,(y0+3*y1)/4,(y0+3*y1)/4,pp,cs) == 1) - if( get_bw((3*x0+x1)/4,(3*x0+x1)/4,(3*y0+y1)/4,y1,pp,cs,1) == 0) - if( get_bw(x0,(3*x0+x1)/4,(3*y0+y1)/4,(y0+3*y1)/4,pp,cs,1) == 0) - if( get_bw(x0, x0, y0,(3*y0+y1)/4,pp,cs,1) == 1) - for_each_data(&(JOB->res.boxlist)) { - box4=(struct box *)list_get_current(&(JOB->res.boxlist)); - if(box4!=box2 && box4->c != PICTURE ) - { - if( box4->line>=0 && box4->line==box2->line - && box4->x1>x0-3 && box4->x1-2y1-box2->m3)<2) - { // fkt melt(box2,box4) - y=loop(pp,x0,y0,y1-y0,cs,0,DO);if(2*y>y1-y0) continue; - put(pp,x0-1,y0+y ,~(128+64),0); - put(pp,x0-1,y0+y+1,~(128+64),0); - merge_boxes( box2, box4 ); // add box4 to box2 - x0 = box2->x0; x1 = box2->x1; - y0 = box2->y0; y1 = box2->y1; - JOB->res.numC--; ii++; // remove - glued_hor++; - list_del(&(JOB->res.boxlist), box4); - free_box(box4); - } - } - } end_for_each(&(JOB->res.boxlist)); - } end_for_each(&(JOB->res.boxlist)); - if (JOB->cfg.verbose) - fprintf(stderr," glued: %3d fragments (found %3d), %3d rest, nC= %d\n", - glued_frags, num_frags, glued_hor, JOB->res.numC); - close_progress(pc); - } - return 0; -} - -/* -** this is a simple way to improve results on noisy images: -** - find similar chars (build cluster of same chars) -** - analyze clusters (could be used for generating unknown font-base) -** - the quality of the result depends mainly on the distance function -*/ - // ---- analyse boxes, compare chars, compress picture ------------ - // ToDo: - error-correction only on large chars! -int find_same_chars( pix *pp){ - int i,k,d,cs,dist,n1,dx; struct box *box2,*box3,*box4,*box5; - pix p=(*pp); - cs=JOB->cfg.cs; - { - if(JOB->cfg.verbose)fprintf(stderr,"# packing"); - i = list_total(&(JOB->res.boxlist)); - for_each_data(&(JOB->res.boxlist)) { - box4 = box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - dist=1000; // 100% maximum - dx = box2->x1 - box2->x0 + 1; - - if(JOB->cfg.verbose)fprintf(stderr,"\r# packing %5d",i); - if( dx>3 ) - for(box3=(struct box *)list_next(&(JOB->res.boxlist),box2);box3; - box3=(struct box *)list_next(&(JOB->res.boxlist),box3)) { - if(box2->num!=box3->num){ - int d=distance(&p,box2,&p,box3,cs); - if ( dnum; // set all num==box2.num to box2.num - for_each_data(&(JOB->res.boxlist)) { - box5=(struct box *)(struct box *)list_get_current(&(JOB->res.boxlist)); - if(box5!=box2) - if( box5->num==n1 ) box5->num=box2->num; - } end_for_each(&(JOB->res.boxlist)); - // out_x2(box2,box5); - // fprintf(stderr," dist=%d\n",d); - } - } - } - // nearest dist to box2 has box4 - // out_b2(box2,box4); - // fprintf(stderr," dist=%d\n",dist); - } end_for_each(&(JOB->res.boxlist)); - k=0; - if(JOB->cfg.verbose)fprintf(stderr," %d different chars",i); - for_each_data(&(JOB->res.boxlist)) { - struct box *box3,*box4; - int j,dist; - box2=(struct box *)list_get_current(&(JOB->res.boxlist)); - for(box3=(struct box *)list_get_header(&(JOB->res.boxlist)); - box3!=box2 && box3!=NULL; - box3=(struct box *)list_next(&(JOB->res.boxlist), box3)) - if(box3->num==box2->num)break; - if(box3!=box2 && box3!=NULL)continue; - i++; - // count number of same chars - dist=0;box4=box2; - - for(box3=box2,j=0;box3; - box3=(struct box *)list_next(&(JOB->res.boxlist), box3)) { - if(box3->num==box2->num){ - j++; - d=distance(&p,box2,&p,box3,cs); - if ( d>dist ) { dist=d; box4=box3; } // worst fit - } - } - if(JOB->cfg.verbose&8){ - fprintf(stderr," no %d char %4d %5d times maxdist=%d\n",i,box2->num,j,dist); - } - // calculate mean-char (error-correction) - // ToDo: calculate maxdist in group - k+=j; - // if(j>1) - // out_b(box1,NULL,0,0,0,0,cs); - if(JOB->cfg.verbose&8) - fprintf(stderr," no %d char %4d %5d times sum=%d\n",i,box2->num,j,k); - } end_for_each(&(JOB->res.boxlist)); - if(JOB->cfg.verbose)fprintf(stderr," ok\n"); - } - return 0; -} - -/* -** call the first engine for all boxes and set box->c=result; -** -*/ -int char_recognition( pix *pp, int mo){ - int i,ii,ni,cs,x0,y0,x1,y1; - struct box *box2; - progress_counter_t *pc; - wchar_t cc; - cs=JOB->cfg.cs; - // ---- analyse boxes, find chars --------------------------------- - if (JOB->cfg.verbose) - fprintf(stderr,"# char recognition"); - i=ii=ni=0; - for_each_data(&(JOB->res.boxlist)) { /* count boxes */ - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - /* wew: isn't this just JOB->res.numC? */ - /* js: The program is very complex. I am not sure anymore - wether numC is the number of boxes or the number of valid - characters. - Because its not time consuming I count the boxes here. */ - if (box2->c==UNKNOWN) i++; - if (box2->c==PICTURE) ii++; - ni++; - } end_for_each(&(JOB->res.boxlist)); - if(JOB->cfg.verbose) - fprintf(stderr," unknown= %d picts= %d boxes= %d\n# ",i,ii,ni); - if (!ni) return 0; - i=ii=0; - pc = open_progress(ni,"char_recognition"); - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - x0=box2->x0;x1=box2->x1; - y0=box2->y0;y1=box2->y1; // box - cc=box2->c; - if (cc==PICTURE) continue; - - if ((mo&256)==0) { /* this case should be default (main engine) */ - if(cc==UNKNOWN || box2->num_ac==0 || box2->wac[0]cfg.certainty) - cc=whatletter(box2,cs ,0); - } - - if(mo&2) - if(cc==UNKNOWN || box2->num_ac==0 || box2->wac[0]cfg.certainty) - cc=ocr_db(box2); - - - // box2->c=cc; bad idea (May03 removed) - // set(box2,cc,95); ToDo: is that better? - - if(cc==UNKNOWN) - i++; - ii++; - - if(JOB->cfg.verbose&8) { - fprintf(stderr,"\n# code= %04lx %c",(long)cc,(char)((cc<255)?cc:'_')); - //out_b(box2,pp,x0,y0,x1-x0+1,y1-y0+1,cs); - } - progress(ii,pc); /* ii = 0..ni */ - - } end_for_each(&(JOB->res.boxlist)); - close_progress(pc); - if(JOB->cfg.verbose)fprintf(stderr," %d of %d chars unidentified\n",i,ii); - return 0; -} - - -/* -** compare unknown with known chars, -** very similar to the find_similar_char_function but here only to -** improve the result -*/ -int compare_unknown_with_known_chars(pix * pp, int mo) { - int i, cs = JOB->cfg.cs, dist, d, ad, wac, ni, ii; - struct box *box2, *box3, *box4; - progress_counter_t *pc=NULL; - wchar_t bc; - i = ii = 0; // ---- ------------------------------- - if (JOB->cfg.verbose) - fprintf(stderr, "# try to compare unknown with known chars !(mode&8)"); - if (!(mo & 8)) - { - ii=ni=0; - for_each_data(&(JOB->res.boxlist)) { ni++; } end_for_each(&(JOB->res.boxlist)); - pc = open_progress(ni,"compare_chars"); - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); ii++; - if (box2->c == UNKNOWN || (box2->num_ac>0 && box2->wac[0]<97)) - if (box2->y1 - box2->y0 > 4 && box2->x1 - box2->x0 > 1) { // no dots! - box4 = (struct box *)list_get_header(&(JOB->res.boxlist));; - dist = 1000; /* 100% maximum */ - bc = UNKNOWN; /* best fit char */ - for_each_data(&(JOB->res.boxlist)) { - box3 = (struct box *)list_get_current(&(JOB->res.boxlist)); - wac=((box3->num_ac>0)?box3->wac[0]:100); - if (box3 == box2 || box3->c == UNKNOWN - || waccfg.certainty) continue; - if (box2->y1 - box2->y0 < 5 || box2->x1 - box2->x0 < 3) continue; - d = distance(pp, box2, pp, box3, cs); - if (d < dist) { - dist = d; bc = box3->c; box4 = box3; - } - } end_for_each(&(JOB->res.boxlist)); - if (dist < 10) { - /* sureness can be maximal of box3 */ - if (box4->num_ac>0) ad = box4->wac[0]; - else ad = 97; - ad-=dist; if(ad<1) ad=1; - /* ToDo: ad should depend on ad of bestfit */ - setac(box2,(wchar_t)bc,ad); - i++; - } // limit as option??? - // => better max distance('e','e') ??? - if (dist < 50 && (JOB->cfg.verbose & 7)) { // only for debugging - fprintf(stderr,"\n# L%02d best fit was %04x=%c dist=%3d%% i=%d", - box2->line, (int)bc, (char)((bc<128)?bc:'_'), dist, i); - if(box4->num_ac>0)fprintf(stderr," w= %3d%%",box4->wac[0]); - } - progress(ii,pc); - } - } end_for_each(&(JOB->res.boxlist)); - close_progress(pc); - } - if (JOB->cfg.verbose) - fprintf(stderr, " - found %d (nC=%d)\n", i, ii); - return 0; -} - -/* -// ---- divide overlapping chars which !strchr("_,.:;",c); -// block-splitting (two ore three glued chars) -// division if dots>0 does not work properly! ??? -// -// what about glued "be"? -// what about recursive division? -// ToDo: mark divided boxes to give the engine a chance to -// handle wrong divisions -*/ -int try_to_divide_boxes( pix *pp, int mo){ - struct box *box2, boxa, boxb; - int cs=JOB->cfg.cs, ad=100, - a2[8], ar, // certainty of each part, ar = product of all certainties - cbest; // best certainty, skip search of certaintycfg.verbose) - fprintf(stderr,"# try to divide unknown chars !(mode&16)"); - if(!(mo&16)) // put this to the caller - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - // don't try to split simple structures (ex: 400x30 square) - if ((!box2->num_frames) - || box2->num_frame_vectors[ box2->num_frames-1 ]<9) continue; - if((box2->c==UNKNOWN || (box2->num_ac && box2->wac[0]cfg.certainty)) - && box2->x1-box2->x0>5 && box2->y1-box2->y0>4){ - x0=box2->x0; x1=box2->x1; - y0=box2->y0; y1=box2->y1; - ad=100; - cbest=0; - - /* get minimum vertical lines */ - n1 = num_cross(x0,x1,( y1+y0)/2,( y1+y0)/2,pp,cs); - ii = num_cross(x0,x1,(3*y1+y0)/4,(3*y1+y0)/4,pp,cs); if (iim2 && box2->m3 > box2->m2+2) - for (i=box2->m2+1;i<=box2->m3-1;i++) { - if (loop(pp,x0+1,i,x1-x0,cs,1,RI) > (x1-x0-2)) continue; // ll - ii = num_cross(x0,x1,i,i,pp,cs); if (iim3+box2->m4 /* baseline char ? */ - && num_cross(x0,x1,y1-1,y1-1,pp,cs)==1 // -1 for slopes - && num_cross((x0+2*x1)/3,(x0+3*x1)/4,y0,y1,pp,cs)<3 // not exclude tz - && num_cross((3*x0+x1)/4,(2*x0+x1)/3,y0,y1,pp,cs)<3 // not exclude zl - && loop(pp,x0,y1-(y1-y0)/32,x1-x0,cs,0,RI) - +loop(pp,x1,y1-(y1-y0)/32,x1-x0,cs,0,LE) > (x1-x0+1)/2 - ) continue; /* do not try on bvdo"o etc. */ - - // one vertical line can not be two glued chars, lc? - if ( num_cross(x0,x1,(y1+y0)/2,(y1+y0)/2,pp,cs)<=1 ) continue; - { // doublet = 2 letters - // char buf[4]="\0\0\0"; // 4th byte is string end == \0 - // buf[0]=c1; // c1 is wchar_t! (0xbf00 to 0) failes - // buf[1]=c2; - char buf[64]=""; // end == \0 - if (JOB->cfg.verbose&2){ - fprintf(stderr, "\n#\n# divide box: %4d %4d %3d %3d\n", - x0, y0, x1-x0+1, y1-y0+1); - } - // it would be better if testing is only if most right and left char - // is has no horizontal gap (below m2) ex: be - i=0; // num splittet chars - xi[0]=x0; xi[1]=x0+3; xi[2]=x1; - for ( ; ; xi[i+1]++) { // x[i] .. x[i+1], slower? but better v0.42 - /* break if x is to near to the right border */ - if (xi[i+1]>x1-3) { if (i==0) break; i--; xi[i+2]=x1; continue; } - // ToDo: skip if not a local dy-min for speedup - { int ymin=y1, ymax=y0, bow=0, // min max at cutting point - max0=y0, max1=y0, // max y on left and right side - min0=y1, min1=y1; // min y on left and right side - for (dy=0,ii=0;iinum_frame_vectors[ 0 ];ii++) { - int pre=ii-1, next=(ii+1)%box2->num_frame_vectors[ 0 ]; - if (pre<0) pre=box2->num_frame_vectors[ 0 ]-1; - // check if vector is inside box to cut - if ( box2->frame_vector[ii ][0]<=xi[i ]) continue; - if ( box2->frame_vector[ii ][0]> xi[i+2]) continue; - // 2nd derivation of y(x) - if (abs(box2->frame_vector[ii ][0]-xi[i+1])<2) { - dy= 2*box2->frame_vector[ii ][1] - -box2->frame_vector[next][1] - -box2->frame_vector[pre ][1]; - dx= box2->frame_vector[next][0] - -box2->frame_vector[pre ][0]; - // rotate 180 degree if dx<0 - if (((dx>0)?dy:-dy)<-abs(dx)/2) { bow=1; } - } - // its not the best if we think on glued fi fo etc. - if (( box2->frame_vector[pre ][0]<=xi[i+1] - && box2->frame_vector[next][0]>=xi[i+1]) - || ( box2->frame_vector[pre ][0]>=xi[i+1] - && box2->frame_vector[next][0]<=xi[i+1])) { - if ( box2->frame_vector[ii ][1]>ymax) - ymax= box2->frame_vector[ii ][1]; - if ( box2->frame_vector[ii ][1]frame_vector[ii ][1]; - } - // min and max of left and right side - if ( box2->frame_vector[ii ][1]>max0 - && box2->frame_vector[ii ][0]<=xi[i+1]) - max0=box2->frame_vector[ii ][1]; - if ( box2->frame_vector[ii ][1]>max1 - && box2->frame_vector[ii ][0]> xi[i+1]) - max1=box2->frame_vector[ii ][1]; - if ( box2->frame_vector[ii ][1]frame_vector[ii ][0]<=xi[i+1]) - min0=box2->frame_vector[ii ][1]; - if ( box2->frame_vector[ii ][1]frame_vector[ii ][0]> xi[i+1]) - min1=box2->frame_vector[ii ][1]; - } - if(JOB->cfg.verbose&2) - fprintf(stderr,"\n# test if to split at x%d= %2d %2d %2d" - " bow,(max-min)[i,0,1] %d %3d %3d %3d" - , i, xi[i]-x0, xi[i+1]-x0, xi[i+2]-x0, bow, ymax-ymin, max0-min0, max1-min1); - /* skip if no local minimum at xi[i+1] or if its not thin enough */ - if (bow==0 || 4*(ymax-ymin)>2*(y1-y0)) continue; - // cuttet parts should have about the same height (max-min) - // we dont want to cut an 'n' in three parts! - if (2*(max0-min0+1)<(y1-y0+1)) continue; // left height - if (2*(max1-min1+1)<(y1-y0+1)) continue; // right height - // ToDo: thickness on xi[i+1]? - } - // try to split successive right box if left box is recognised, - // else shift the splitting point further to the right border - // removing ->dots if dot only above one char !!! ??? not implemented - if(JOB->cfg.verbose&2) - fprintf(stderr,"\n# try to split, newbox[%d].x= %2d ... %2d " - "dy= %d ", i, xi[i]-x0, xi[i+1]-x0, dy); - boxa=*box2; // copy contents, ToDo: reset ac-list (in cut_box?) - boxa.x=xi[i]; boxa.y=y0; // obsolete? mark pixel, overlap? - boxa.x0=xi[i];boxa.x1=xi[i+1]; // new horizontal box range - cut_box(&boxa); boxa.num_ac=0; - // out_x(&boxa); - // get wchar + certainty - ci[i]=whatletter(&boxa,cs,0); a2[i]=testac(&boxa,ci[i]); - if(JOB->cfg.verbose&2) - fprintf(stderr,"\n# certainty %d limit= %d cbest= %d ", - a2[i], JOB->cfg.certainty, cbest); - if (a2[i]cfg.certainty || a2[i]cfg.certainty/100 || arcfg.verbose&2) - fprintf(stderr,"\n try end split [%d]=%d [%d]=%d ", - i, xi[i]-x0, i+1, xi[i+1]-x0); - boxb=*box2; // try rest if it has to be split again - boxb.x=xi[i]+1; boxb.y=y0; - boxb.x0=xi[i]+1;boxb.x1=xi[i+1]; - cut_box(&boxb); boxb.num_ac=0; - ci[i]=whatletter(&boxb,cs,0); a2[i]=testac(&boxb,ci[i]); - if (a2[i]cfg.certainty || a2[i]cfg.verbose&2) { - fprintf(stderr,"\n split at/to: "); - for (ii=0;ii<=i;ii++) - fprintf(stderr," %2d %s (%3d)", xi[ii+1]-x0, - decode(ci[ii],ASCII), a2[ii]); - fprintf(stderr,"\n"); - } - // boxa..c changed!!! dots should be modified!!! - // Question: cut it into boxes v0.40 or set a string v0.41? - // new way of building a string v0.41 (can call setas multiple) - // usefull if compare unknown with known strings (except barcode?) - // ToDo: also create alternate variants? ex: I <-> l - for (buf[0]=0,ar=ad,ii=0;ii<=i;ii++) { - ar=a2[ii]*ar/100; // multiply all probabilities - if (i>0 && ci[ii]=='n' && ci[ii-1]=='r') ar--; // m == rn - strncat(buf,decode(ci[ii],JOB->cfg.out_format),20); - } - - if (ar>cbest) cbest=ar; // best (highest) certainty found - // reduce, but not if we cross certainty border - if (99*ar/100 > JOB->cfg.certainty) ar=99*ar/100; - if (JOB->cfg.verbose&2) - fprintf(stderr,"\n split result= %s (%3d) ",buf, ar); - setas(box2,buf,ar); // char *, does it disturb further splitting? - buf[0]=0; - i--; xi[i+2]=x1; - } - } - } - } end_for_each(&(JOB->res.boxlist)); - if(JOB->cfg.verbose)fprintf(stderr,", numC %d\n",JOB->res.numC); - return 0; -} - -/* -// ---- divide vertical glued boxes (ex: g above T); -*/ -int divide_vert_glued_boxes( pix *pp, int mo){ - struct box *box2,*box3,*box4; - int y0,y1,y,dy,flag_found,dx; - if(JOB->cfg.verbose)fprintf(stderr,"# divide vertical glued boxes"); - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->c != UNKNOWN) continue; /* dont try on pictures */ - y0=box2->y0; y1=box2->y1; dy=y1-y0+1; - dx=4*(JOB->res.avX+box2->x1-box2->x0+1); // we want to be sure to look at 4ex distance - if ( dy>2*JOB->res.avY && dy<6*JOB->res.avY && box2->m1 - && y0<=box2->m2+2 && y0>=box2->m1-2 - && y1>=box2->m4+JOB->res.avY-2) - { // test if lower end fits one of the other lines? - box4=box2; flag_found=0; - for_each_data(&(JOB->res.boxlist)) { - box4 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box4->c != UNKNOWN) continue; /* dont try on pictures */ - if (box4->x1x0-dx || box4->x0>box2->x1+dx) continue; // ignore far boxes - if (box4->line==box2->line ) flag_found|=1; // near char on same line - if (box4->line==box2->line+1) flag_found|=2; // near char on next line - if (flag_found==3) break; // we have two vertical glued chars - } end_for_each(&(JOB->res.boxlist)); - if (flag_found!=3) continue; // do not divide big chars or special symbols - y=box2->m4; // lower end of the next line - if(JOB->cfg.verbose&2){ - fprintf(stderr,"\n# divide box below y=%4d",y-y0); - } - // --- insert box3 before box2 - box3= (struct box *) malloc_box(box2); - box3->y1=y; - box2->y0=y+1; box2->line++; // m1..m4 should be corrected! - if (box4->line == box2->line){ - box2->m1=box4->m1; box2->m2=box4->m2; - box2->m3=box4->m3; box2->m4=box4->m4; - } - box3->num=JOB->res.numC; - if (list_ins(&(JOB->res.boxlist), box2, box3)) { - fprintf(stderr,"ERROR list_ins\n"); }; - JOB->res.numC++; - } - } end_for_each(&(JOB->res.boxlist)); - if(JOB->cfg.verbose)fprintf(stderr,", numC %d\n",JOB->res.numC); - return 0; -} - - -/* - on some systems isupper(>255) cause a segmentation fault SIGSEGV - therefore this function - ToDo: should be replaced (?) by wctype if available on every system - */ -int wisupper(wchar_t cc){ return ((cc<128)?isupper(cc):0); } -int wislower(wchar_t cc){ return ((cc<128)?islower(cc):0); } -int wisalpha(wchar_t cc){ return ((cc<128)?isalpha(cc):0); } -int wisdigit(wchar_t cc){ return ((cc<128)?isdigit(cc):0); } -int wisspace(wchar_t cc){ return ((cc<128)?isspace(cc):0); } - -/* set box2->c to cc if cc is in the ac-list of box2, return 1 on success */ -int setc(struct box *box2, wchar_t cc){ - int ret=0, w1, w2; - w1=((box2->num_ac) ? box2->wac[0] : 0); // weight of replaced char - w2=testac(box2,cc); - if (JOB->cfg.verbose) - fprintf(stderr, "\n# change %s (%d) to %s (%d) at (%d,%d)", - decode(box2->c,ASCII), w1, decode(cc,ASCII), w2, box2->x0, box2->y0); - if (w2) { if (box2->c!=cc) { ret=1; setac(box2,cc,(100+w2)/2); } } - // if(JOB->cfg.verbose & 4) out_x(box2); - // ToDo: modify per setac (shift ac) - return ret; -} - - -/* ---- proof difficult chars Il1 by context view ---- - context: separator, number, vowel, nonvowel, upper case ???? - could be also used to find unknown chars if the environment (nonumbers) - can be found in other places! - ToDo: - - box->tac[] as set of possible chars, ac set by engine, example: - ac="l/" (not "Il|/\" because serifs detected and slant>0) - correction only to one of the ac-set (alternative chars)! - - should be language-settable; Unicode compatible - - box2->ad and wac should be changed? (not proper yet) - * ------------- */ -int context_correction( job_t *job ) { - // const static char - char *l_vowel="aeiouy"; - // *l_Vowel="AEIOU",chars if the environment (nonumbers) - char *l_nonvo = "bcdfghjklmnpqrstvwxz"; - struct box *box4, *box3, *box2, *prev, *next; - // pix *pp = &(job->src.p); - int nc=0, ns=0; // num corrections - - if (job->cfg.verbose) - fprintf(stderr, "# context correction Il1 0O"); - - for_each_data(&(job->res.boxlist)) { - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - if (box2->c > 0xFF) continue; // temporary UNICODE fix - prev = (struct box *)list_get_cur_prev(&(job->res.boxlist)); - next = (struct box *)list_get_cur_next(&(job->res.boxlist)); - if( (prev) && (prev->c > 0xFF)) continue; // temporary UNICODE fix 2 - if( (next) && (next->c > 0xFF)) continue; // temporary UNICODE fix 3 - if (box2->num_ac<2) continue; // no alternatives - if (box2->wac[0]==100 && box2->wac[1]<100) continue; - if (box2->num_ac && box2->tas[0]) continue; // buggy space_remove 0.42 - - /* check for Il1| which are general difficult to distinguish */ - /* bbg: not very good. Should add some tests to check if is preceded by '.', - spelling, etc */ - /* ToDo: only correct if not 100% sure (wac[i]<100) - and new char is in wat[] */ - if (strchr("Il1|", box2->c) && next && prev) { -// if( strchr(" \n",prev->c) // SPC -// && strchr(" \n",next->c) ) box2->c='I'; else // bad idea! I have ... - if (wisalpha(next->c) && next->c!='i' && - ( prev->c == '\n' || - ( prev->c == ' ' && - ( box4=(struct box *)list_prev(&(job->res.boxlist), prev)) && - box4->c == '.' ) ) ) { nc+=setc(box2,(wchar_t)'I'); } - else if (box2->c!='1' && strchr(l_nonvo,next->c) && - strchr("\" \n",prev->c)) /* lnt => Int, but 1st */ - /* do not change he'll to he'Il! */ - { nc+=setc(box2,(wchar_t)'I'); } // set box2->c to 'I' if 'I' is in the ac-list - else if (strchr(l_vowel,next->c)) /* unusual? Ii Ie Ia Iy Iu */ - /* && strchr("KkBbFfgGpP",prev->c)) */ /* kle Kla Kli */ - { nc+=setc(box2,(wchar_t)'l'); } - else if (wisupper(next->c) - && !strchr("O0I123456789",next->c) - && !strchr("O0I123456789",prev->c)) /* avoid lO => IO (10) */ - { nc+=setc(box2,(wchar_t)'I'); } - else if (wislower(prev->c)) - { nc+=setc(box2,(wchar_t)'l'); } - else if (wisdigit(prev->c) || wisdigit(next->c) - || (next->c=='O' && !wisalpha(prev->c))) /* lO => 10 */ - { nc+=setc(box2,(wchar_t)'1'); } - } - - /* check for O0 */ - else if (strchr("O0", box2->c) && next && prev) { - if (wisspace(prev->c) && wisalpha(next->c)) /* initial letter */ - { nc+=setc(box2,(wchar_t)'O'); } - else if (wisalpha(prev->c) && wisalpha(next->c) - && wisupper(next->c)) /* word in upper case */ - { nc+=setc(box2,(wchar_t)'O'); } - else if (wisdigit(prev->c) || wisdigit(next->c)) - { nc+=setc(box2,(wchar_t)'0'); } - } - - /* check for 5S */ - else if (strchr("5S", box2->c) && next && prev) { - if (wisspace(prev->c) && wisalpha(next->c)) /* initial letter */ - { nc+=setc(box2,(wchar_t)'S'); } - else if (wisalpha(prev->c) && wisalpha(next->c) - && wisupper(next->c)) /* word in upper case */ - { nc+=setc(box2,(wchar_t)'S'); } - else if (wisdigit(prev->c) || wisdigit(next->c)) - { nc+=setc(box2,(wchar_t)'5'); } - } - - /* was a space not found? xXx => x Xx ??? */ - if (wisupper(box2->c) && next && prev) { - if (wislower(prev->c) && wislower(next->c) - && 2 * (box2->x0 - prev->x1) > 3 * (next->x0 - box2->x1)) { - struct box *box3 = malloc_box((struct box *) NULL); - box3->x0 = prev->x1 + 2; - box3->x1 = box2->x0 - 2; - box3->y0 = box2->y0; - box3->y1 = box2->y1; - box3->x = box2->x0 - 1; - box3->y = box2->y0; - box3->dots = 0; - box3->num_boxes = 0; - box3->num_subboxes = 0; - box3->c = ' '; - box3->modifier = 0; - setac(box3,' ',99); /* ToDo: weight depends from distance */ - box3->num = -1; - box3->line = prev->line; - box3->m1 = box3->m2 = box3->m3 = box3->m4 = 0; - box3->p = &(job->src.p); - list_ins(&(job->res.boxlist), box2, box3); - } - } - - /* a space before punctuation? but not " ./file" */ - if ( prev && next) - if (prev->c == ' ' && strchr(" \n" , next->c) - && strchr(".,;:!?)", box2->c)) - if (prev->x1 - prev->x0 < 2 * job->res.avX) { // carefully on tables - box3 = prev; - if ( !list_del(&(job->res.boxlist), box3) ) free_box(box3); - prev = (struct box *)list_get_cur_prev(&(job->res.boxlist)); - ns++; - } - - /* \'\' to \" */ - if ( prev ) - if ( (prev->c == '`' || prev->c == '\'') - && (box2->c == '`' || box2->c == '\'') ) - if (prev->x1 - box2->x0 < job->res.avX) { // carefully on tables - box2->c='\"'; - box3 = prev; - list_del(&(job->res.boxlist), box3); - free_box(box3); - } - } end_for_each(&(job->res.boxlist)); - if (job->cfg.verbose) - fprintf(stderr, " num_corrected= %d removed_spaces= %d\n", nc, ns); - return 0; -} - - -/* ---- insert spaces ---- - * depends strongly from the outcome of measure_pitch() - * ------------------------ */ -int list_insert_spaces( pix *pp, job_t *job ) { - int i=0, j1, j2, i1, maxline=-1, dy=0; char cc; - struct box *box2, *box3=NULL, *box4=NULL; - - // measure mean line height - for(i1=1;i1res.lines.num;i1++) { - dy+=job->res.lines.m4[i1]-job->res.lines.m1[i1]+1; - } if (job->res.lines.num>1) dy/=(job->res.lines.num-1); - i=0; j2=0; - for(i1=1;i1res.lines.num;i1++) { - j1=job->res.lines.m4[i1]-job->res.lines.m1[i1]+1; - if (j1>dy*120/100 || j10 && j2/i>7) dy=j2/i; - if( job->cfg.verbose&1 ) - fprintf(stderr,"# insert space between words (dy=%d) ...",dy); - if (!dy) dy=(job->res.avY)*110/100+1; - - i=0; - for_each_data(&(job->res.boxlist)) { - box2 =(struct box *)list_get_current(&(job->res.boxlist)); - cc=0; - if (box2->line>maxline) { // lines and chars must be sorted! - if (maxline>=0) cc='\n'; // NL - maxline=box2->line; - } - if((box3 = (struct box *)list_prev(&(job->res.boxlist), box2))){ - if (maxline && !box2->line && cc==0) cc=' '; - if (box2->line<=maxline && cc==0) { // lines and chars must be sorted! - int thispitch = job->res.lines.pitch[box2->line]; - int thismono = job->res.lines.mono[box2->line]; - int mdist = (box2->x1 + box2->x0 - (box3->x1 + box3->x0) + 1)/2; - int pdist = box2->x0 - box3->x1 + 1; - if (box2->x1 - box2->x0 < thispitch) pdist=pdist*4/3; - /* allow extra pixels around small characters .,'!: etc */ - // fprintf(stderr,"#\n ... mono= %2d pitch= %2d mdist= %2d pdist= %2d", - // thismono, thispitch, mdist, pdist); - if ((thismono!=0 && mdist >= thispitch) - || (thismono==0 && pdist >= thispitch)) - cc=' '; // insert SPACE - } - } - if(cc){ - box4=(struct box *)list_prev(&(job->res.boxlist), box2); - box3=(struct box *)malloc_box(NULL); - box3->x0=box2->x0-2; box3->x1=box2->x0-2; - box3->y0=box2->y0; box3->y1=box2->y1; - if(cc!='\n' && box4) - box3->x0=box4->x1+2; - if(cc=='\n' || !box4) - box3->x0=job->res.lines.x0[box2->line]; - if(cc=='\n' && box4){ - box3->y0=box4->y1; // better use lines.y1[box2->pre] ??? - box3->y1=box2->y0; - } - box3->x =box2->x0-1; box3->y=box2->y0; - box3->dots=0; box3->c=cc; - box3->num_boxes = 0; - box3->num_subboxes = 0; - box3->modifier='\0'; - box3->num=-1; box3->line=box2->line; - box3->m1=box2->m1; box3->m2=box2->m2; - box3->m3=box2->m3; box3->m4=box2->m4; - box3->p=pp; - setac(box3,cc,99); /* ToDo: weight depends from distance */ - list_ins(&(job->res.boxlist),box2,box3); - if( job->cfg.verbose&1 ) { - fprintf(stderr,"\n# insert space &%d; at x= %4d %4d box= %p", - (int)cc, box3->x0, box3->y0, (void*)box3); - /* out_x(box3); */ - } - i++; - } - } end_for_each(&(job->res.boxlist)); - if( job->cfg.verbose&1 ) fprintf(stderr," found %d\n",i); - return 0; -} - - -/* - add infos where the box is positioned to the box - this is useful for better recognition -*/ -int add_line_info(/* List *boxlist2 */){ - // pix *pp=&JOB->src.p; - struct tlines *lines = &JOB->res.lines; - struct box *box2; - int i,xx,m1,m2,m3,m4,num_line_members=0,num_rest=0; - if( JOB->cfg.verbose&1 ) fprintf(stderr,"# add line infos to boxes ..."); - for_each_data(&(JOB->res.boxlist)) { - box2 =(struct box *)list_get_current(&(JOB->res.boxlist)); - for(i=1;ires.lines.num;i++) /* line 0 is a place holder */ - { - if (lines->dx) xx=lines->dy*((box2->x1+box2->x0)/2)/lines->dx; else xx=0; - m1=lines->m1[i]+xx; - m2=lines->m2[i]+xx; - m3=lines->m3[i]+xx; - m4=lines->m4[i]+xx; - // fprintf(stderr," test line %d m1=%d %d %d %d\n",i,m1,m2,m3,m4); - if (m4-m1==0) continue; /* no text line (line==0) */ -#if 0 - if( box2->y1+2*JOB->res.avY >= m1 - && box2->y0-2*JOB->res.avY <= m4 ) /* not to far away */ -#endif - /* give also a comma behind the line a chance */ - if( box2->x0 >= lines->x0[i] && box2->x1 <= lines->x1[i]+JOB->res.avX ) - if( box2->m2==0 || abs(box2->y0-box2->m2) > abs(box2->y0-m2) ) - { /* found nearest line */ - box2->m1=m1; - box2->m2=m2; - box2->m3=m3; - box2->m4=m4; - box2->line=i; - } - } - if( box2->y1+2 < box2->m1 - || box2->y0 < box2->m1 - (box2->m3-box2->m1)/2 - || box2->y0-2 > box2->m4 - || box2->y1 > box2->m3 + (box2->m3-box2->m1) - ) /* to far away */ - { /* reset */ - box2->m1=0; - box2->m2=0; - box2->m3=0; - box2->m4=0; - box2->line=0; - num_rest++; - } else num_line_members++; - } end_for_each(&(JOB->res.boxlist)); - if( JOB->cfg.verbose&1 ) - fprintf(stderr," done, num_line_chars=%d rest=%d\n", - num_line_members, num_rest); - return 0; -} - - -/* - * bring the boxes in right order - * add_line_info must be executed first! - */ -int sort_box_func (const void *a, const void *b) { - struct box *boxa, *boxb; - - boxa = (struct box *)a; - boxb = (struct box *)b; - - if ( ( boxb->line < boxa->line ) || - ( boxb->line == boxa->line && boxb->x0 < boxa->x0 ) ) - return 1; - return -1; -} - -// ------------------------------------------------------------- -// ------ use this for entry from other programs -// include pnm.h pgm2asc.h -// ------------------------------------------------------------- -// entry point for gocr.c or if it is used as lib -// better name is call_ocr ??? -// jb: OLD COMMENT: not removed due to set_options_* () -// args after pix *pp should be removed and new functions -// set_option_mode(int mode), set_option_spacewidth() .... etc. -// should be used instead, before calling pgm2asc(pix *pp) -// ! change if you can ! - used by X11 frontend -int pgm2asc(job_t *job) -{ - pix *pp; - progress_counter_t *pc; - - assert(job); - /* FIXME jb: remove pp */ - pp = &(job->src.p); - - if( job->cfg.verbose ) - fprintf(stderr, "# db_path= %s\n", job->cfg.db_path); - - pc = open_progress(100,"pgm2asc_main"); - progress(0,pc); /* start progress output 0% 0% */ - - /* ----- count colors ------ create histogram ------- - - this should be used to create a upper and lower limit for cs - - cs is the optimum gray value between cs_min and cs_max - - also inverse scans could be detected here later */ - if (job->cfg.cs==0) - job->cfg.cs=otsu( pp->p,pp->y,pp->x,0,0,pp->x,pp->y, job->cfg.verbose & 1 ); - /* renormalize the image and set the normalized threshold value */ - job->cfg.cs=thresholding( pp->p,pp->y,pp->x,0,0,pp->x,pp->y, job->cfg.cs ); - if( job->cfg.verbose ) - fprintf(stderr, "# thresholding new_threshold= %d\n", job->cfg.cs); - - progress(5,pc); /* progress is only estimated */ - -#if 0 /* dont vast memory */ - /* FIXME jb: malloc */ - if ( job->cfg.verbose & 32 ) { - // generate 2nd imagebuffer for debugging output - job->tmp.ppo.p = (unsigned char *)malloc(job->src.p.y * job->src.p.x); - // buffer - assert(job->tmp.ppo.p); - copybox(&job->src.p, - 0, 0, job->src.p.x, job->src.p.y, - &job->tmp.ppo, - job->src.p.x * job->src.p.y); - } -#else - job->tmp.ppo=job->src.p; /* temporarely, removed later */ -#endif - - /* load character data base */ - if ( job->cfg.mode&2 ) - load_db(); - - /* this is first step for reorganize the PG - ---- look for letters, put rectangular frames around letters - letter = connected points near color F - should be used by dust removing (faster) and line detection! - ---- 0..cs = black letters, last change = Mai99 */ - - progress(8,pc); /* progress is only estimated */ - - scan_boxes( pp ); - if ( !job->res.numC ){ - fprintf( stderr,"# no boxes found - stopped\n" ); - //if(job->cfg.verbose&32) debug_img("out01",job,8); - /***** should free stuff, etc) */ - return(1); - } - // if (job->cfg.verbose&32) debug_img("out00",job,4+8); - - progress(10,pc); /* progress is only estimated */ - // if(job->cfg.verbose&32) debug_img("out01",job,4+8); - // output_list(job); // for debugging - // ToDo: matrix printer preprocessing - - remove_dust( job ); /* from the &(job->res.boxlist)! */ -// if(job->cfg.verbose&32) debug_img("out02",job,4+8); -// output_list(job); // for debugging - smooth_borders( job ); /* only for big chars */ - progress(12,pc); /* progress is only estimated */ -// if(job->cfg.verbose&32) debug_img("out03",job,4+8); -// output_list(job); // for debugging - - //detect_barcode( job ); /* mark barcode */ -// if(job->cfg.verbose&32) debug_img("out04",job,4+8); -// output_list(job); // for debugging - - detect_pictures( job ); /* mark pictures */ -// if(job->cfg.verbose&32) debug_img("out05",job,4+8); -// output_list(job); // for debugging - - remove_pictures( job ); /* do this as early as possible, before layout */ -// if(job->cfg.verbose&32) debug_img("out06",job,4+8); -// output_list(job); // for debugging - - glue_holes_inside_chars( pp ); /* including count subboxes (holes) */ - - detect_rotation_angle( job ); - -#if 1 /* Rotate the whole picture! move boxes */ - if( job->res.lines.dy!=0 ){ // move down lowest first, move up highest first - // in work! ??? (at end set dy=0) think on ppo! - } -#endif - detect_text_lines( pp, job->cfg.mode ); /* detect and mark JOB->tmp.ppo */ -// if(job->cfg.verbose&32) debug_img("out07",job,4+8); - progress(20,pc); /* progress is only estimated */ - - add_line_info(/* &(job->res.boxlist) */); - //if (job->cfg.verbose&32) debug_img("out10",job,4+8); - - divide_vert_glued_boxes( pp, job->cfg.mode); /* after add_line_info, before list_sort! */ -// if(job->cfg.verbose&32) debug_img("out11",job,0); - - remove_melted_serifs( pp ); /* make some corrections on pixmap */ - /* list_ins seems to sort in the boxes on the wrong place ??? */ -// if(job->cfg.verbose&32) debug_img("out12",job,4+8); - - glue_broken_chars( pp ); /* 2nd glue */ -// if(job->cfg.verbose&32) debug_img("out14",job,4+8); - - remove_rest_of_dust( ); -// if(job->cfg.verbose&32) debug_img("out15",job,4+8); - - /* better sort after dust is removed (slow for lot of pixels) */ - list_sort(&(job->res.boxlist), sort_box_func); - - measure_pitch( job ); - - if(job->cfg.mode&64) find_same_chars( pp ); - progress(30,pc); /* progress is only estimated */ -// if(job->cfg.verbose&32) debug_img("out16",job,4+8); - - char_recognition( pp, job->cfg.mode); - progress(60,pc); /* progress is only estimated */ -// if(job->cfg.verbose&32) debug_img("out17",job,4+8); - - if ( adjust_text_lines( pp, job->cfg.mode ) ) { /* correct using chars */ - /* may be, characters/pictures have changed line number */ - list_sort(&(job->res.boxlist), sort_box_func); - // 2nd recognition call if lines are adjusted - char_recognition( pp, job->cfg.mode); - } - -#define BlownUpDrawing 1 /* german: Explosionszeichnung, temporarly */ -#if BlownUpDrawing == 1 /* german: Explosionszeichnung */ -{ /* just for debugging */ - int i,ii,ni; struct box *box2; - i=ii=ni=0; - for_each_data(&(JOB->res.boxlist)) { /* count boxes */ - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->c==UNKNOWN) i++; - if (box2->c==PICTURE) ii++; - ni++; - } end_for_each(&(JOB->res.boxlist)); - if (JOB->cfg.verbose) - fprintf(stderr,"# debug: unknown= %d picts= %d boxes= %d\n",i,ii,ni); -} -#endif - // ----------- write out20.pgm ----------- mark lines + boxes - //if (job->cfg.verbose&32) debug_img("out20",job,1+4+8); - - compare_unknown_with_known_chars( pp, job->cfg.mode); - progress(70,pc); /* progress is only estimated */ - - try_to_divide_boxes( pp, job->cfg.mode); - progress(80,pc); /* progress is only estimated */ - - /* --- list output ---- for debugging --- */ - //if (job->cfg.verbose&6) output_list(job); - - /* ---- insert spaces ---- */ - list_insert_spaces( pp , job ); - - // ---- proof difficult chars Il1 by context view ---- - if (JOB->cfg.verbose) - fprintf(stderr,"# context correction if !(mode&32)\n"); - if (!(job->cfg.mode&32)) context_correction( job ); - - store_boxtree_lines( job->cfg.mode ); - progress(90,pc); /* progress is only estimated */ - -/* 0050002.pgm.gz ca. 109 digits, only 50 recognized (only in lines?) - * ./gocr -v 39 -m 56 -e - -m 4 -C 0-9 -f XML tmp0406/0050002.pbm.gz - * awk 'BEGIN{num=0}/1<\/box>/{num++;}END{print num}' o - * 15*0 24*1 18*2 19*3 15*4 6*5 6*6 6*7 4*8 8*9 sum=125digits counted boxes - * 9*0 19*1 14*2 15*3 11*4 6*5 5*6 6*7 4*8 8*9 sum=97digits recognized - * 1*1 1*7 not recognized (Oct04) - * 33*SPC 76*NL = 109 spaces + 36*unknown sum=241 * 16 missed - */ -#if BlownUpDrawing == 1 /* german: Explosionszeichnung */ -{ /* just for debugging */ - int i,ii,ni; struct box *box2; const char *testc="0123456789ABCDEFGHIJK"; - i=ii=ni=0; - for_each_data(&(JOB->res.boxlist)) { /* count boxes */ - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->c==UNKNOWN) i++; - if (box2->c==PICTURE) ii++; - if (box2->c>' ' && box2->c<='z') ni++; - } end_for_each(&(JOB->res.boxlist)); - if(JOB->cfg.verbose) - fprintf(stderr,"# debug: (_)= %d picts= %d chars= %d",i,ii,ni); - for (i=0;i<20;i++) { - ni=0; - for_each_data(&(JOB->res.boxlist)) { /* count boxes */ - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->c==testc[i]) ni++; - } end_for_each(&(JOB->res.boxlist)); - if(JOB->cfg.verbose && ni>0) - fprintf(stderr," (%c)=%d",testc[i],ni); - } - if(JOB->cfg.verbose) - fprintf(stderr,"\n"); -} -#endif - - // ---- frame-size-histogram - // ---- (my own defined) distance between letters - // ---- write internal picture of textsite - // ----------- write out30.pgm ----------- - //if( job->cfg.verbose&32 ) debug_img("out30",job,2+4); - - progress(100,pc); /* progress is only estimated */ - - close_progress(pc); - - return 0; /* what should I return? error-state? num-of-chars? */ -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.h deleted file mode 100644 index 9cd8b1fdb..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pgm2asc.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2006 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL-address - -*/ - -#ifndef PGM2ASC_H -#define PGM2ASC_H 1 - -#include "pnm.h" -//#include "output.h" -#include "list.h" -#include "unicode.h" -#include "gocr.h" - -#define pixel_at(pic, xx, yy) (pic).p[(xx)+((yy)*((pic).x))] -#define pixel_atp(pic, xx, yy) (pic)->p[(xx)+((yy)*((pic)->x))] - -#ifndef HAVE_WCHAR_H -const wchar_t *wcschr (const wchar_t *wcs, wchar_t wc); -const wchar_t *wcscpy (wchar_t *dest, const wchar_t *src); -size_t wcslen (const wchar_t *s); -#endif -#ifndef HAVE_WCSDUP -wchar_t * wcsdup (const wchar_t *WS); /* its a gnu extension */ -#endif - -/* declared in pgm2asc.c */ -/* set alternate chars and its weight, called from the engine - if a char is recognized to (weight) percent */ -int setas(struct box *b, char *as, int weight); /* string + xml */ -int setac(struct box *b, wchar_t ac, int weight); /* wchar */ - -/* for qsort() call */ -int intcompare (const void *vr, const void *vs); - -/* declared in box.c */ -int box_gt(struct box *box1, struct box *box2); -int reset_box_ac(struct box *box); /* reset and free char table */ -struct box *malloc_box( struct box *inibox ); /* alloc memory for a box */ -int free_box( struct box *box ); /* free memory of a box */ -int copybox( pix *p, int x0, int y0, int dx, int dy, pix *b, int len); -int reduce_vectors ( struct box *box1, int mode ); -int merge_boxes( struct box *box1, struct box *box2 ); -int cut_box( struct box *box1); - - -/* declared in database.c */ -int load_db(void); -wchar_t ocr_db(struct box *box1); - -/* declared in detect.c */ -int detect_lines1(pix * p, int x0, int y0, int dx, int dy); -int detect_lines2(pix *p,int x0,int y0,int dx,int dy,int r); -int detect_rotation_angle(job_t *job); -int detect_text_lines(pix * pp, int mo); -int adjust_text_lines(pix * pp, int mo); -int detect_pictures(job_t *job); - -/* declared in lines.c */ -void store_boxtree_lines( int mo ); - /* free memory for internal stored textlines. - * Needs to be called _after_ having retrieved the text. - * After freeing, no call to getTextLine is possible any - * more - */ -void free_textlines( void ); - - /* get result of ocr for a given line number. - * If the line is out of range, the function returns 0, - * otherwise a pointer to a complete line. - */ -const char *getTextLine( int ); - -/* declared in remove.c */ -int remove_dust( job_t *job ); -int remove_pictures( job_t *job); -int remove_melted_serifs( pix *pp ); -int remove_rest_of_dust(); -int smooth_borders( job_t *job ); - -/* declared in pixel.c */ -int marked(pix * p, int x, int y); -int pixel(pix *p, int x, int y); -void put(pix * p, int x, int y, int ia, int io); - -/* start ocr on a image in job.src.p */ -int pgm2asc(job_t *job); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pixel.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pixel.c deleted file mode 100644 index 41647f396..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pixel.c +++ /dev/null @@ -1,537 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2006 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Joerg.Schulenburg@physik.uni-magdeburg.de */ - -/* Filter by tree, filter by number methods added by - * William Webber, william@williamwebber.com. */ - -#include "pgm2asc.h" -#include -#include - -/* - * Defining this causes assert() calls to be turned off runtime. - * - * This is normally taken care of by make. - */ -/* #define NDEBUG */ - -// ------------------ (&~7)-pixmap-functions ------------------------ - -/* test if pixel marked? - * Returns: 0 if not marked, least 3 bits if marked. - */ -int marked (pix * p, int x, int y) { - if (x < 0 || y < 0 || x >= p->x || y >= p->y) - return 0; - return (pixel_atp(p, x, y) & 7); -} - -#define Nfilt3 6 /* number of 3x3 filter */ -/* - * Filters to correct possible scanning or image errors. - * - * Each of these filters represents a 3x3 pixel area. - * 0 represents a white or background pixel, 1 a black or - * foreground pixel, and 2 represents a pixel of either value. - * Note that this differs from the meaning of pixel values in - * the image, where a high value means "white" (background), - * and a low value means "black" (foreground). - * - * These filters are applied to the 3x3 environment of a pixel - * to be retrieved from the image, centered around that pixel - * (that is, the to-be-retrieved pixel corresponds with the - * the fifth position of the filter). - * If the filter matches that pixel environment, then - * the returned value of the pixel is inverted (black->white - * or white->black). - * - * So, for instance, the second filter below matches this - * pattern: - * - * 000 - * X0X - * 000 - * - * and "fills in" the middle (retrieved) pixel to rejoin a line - * that may have been broken by a scanning or image error. - */ -const char filt3[Nfilt3][9]={ - {0,0,0, 0,0,1, 1,0,0}, /* (-1,-1) (0,-1) (1,-1) (-1,0) (0,0) ... */ - {0,0,0, 1,0,1, 0,0,0}, - {1,0,0, 0,0,1, 0,0,0}, - {1,1,0, 0,1,0, 2,1,1}, - {0,0,1, 0,0,0, 2,1,0}, - {0,1,0, 0,0,0, 1,2,0} -}; -/* 2=ignore_pixel, 0=white_background, 1=black_pixel */ - - -/* - * Filter by matrix uses the above matrix of filters directly. Pixel - * environments to be filtered are compared pixel by pixel against - * these filters. - * - * Filter by number converts these filters into integer representations - * and stores them in a table. Pixel environments are similarly - * converted to integers, and looked up in the table. - * - * Filter by tree converts these filters into a binary tree. Pixel - * environments are matched by traversing the tree. - * - * A typical performance ratio for these three methods is 20:9:7 - * respectively (i.e., the tree method takes around 35% of the - * time of the matrix method). - */ -#define FILTER_BY_MATRIX 0 -#define FILTER_BY_NUMBER 1 -#define FILTER_BY_TREE 2 - -#define FILTER_METHOD FILTER_BY_TREE - -/* - * Defining FILTER_CHECKED causes filter results from either the tree - * or the number method to be checked against results of the other - * two methods to ensure correctness. This is for bug checking purposes - * only. - */ -/* #define FILTER_CHECKED */ - -/* - * Defining FILTER_STATISTICS causes statistics to be kept on how many - * times the filters are tried, how many times a filter matches, and - * of these matches how many flip a black pixel to white, and how many - * the reverse. These statistics are printed to stderr at the end of - * the program run. Currently, statistics are only kept if the tree - * filter method is being used. - */ -/* #define FILTER_STATISTICS */ - -#ifdef FILTER_STATISTICS -static int filter_tries = 0; -static int filter_matches = 0; -static int filter_blackened = 0; -static int filter_whitened = 0; -#endif - -#ifdef FILTER_STATISTICS -void print_filter_stats() { - fprintf(stderr, "\n# Error filter statistics: tries %d, matches %d, " - "blackened %d, whitened %d\n", - filter_tries, filter_matches, filter_blackened, filter_whitened); -} -#endif - -#if FILTER_METHOD == FILTER_BY_MATRIX || defined(FILTER_CHECKED) -/* - * Filter the pixel at (x,y) by directly applying the matrix. - */ -int pixel_filter_by_matrix(pix * p, int x, int y) { - int i; - static char c33[9]; - memset(c33, 0, sizeof(c33)); - /* copy environment of a point (only highest bit) -bbg: FASTER now. It has 4 ifs less at least, 8 at most. */ - if (x > 0) { c33[3] = pixel_atp(p,x-1, y )>>7; - if (y > 0) c33[0] = pixel_atp(p,x-1,y-1)>>7; - if (y+1 < p->y) c33[6] = pixel_atp(p,x-1,y+1)>>7; - } - if (x+1 < p->x) { c33[5] = pixel_atp(p,x+1, y )>>7; - if (y > 0) c33[2] = pixel_atp(p,x+1,y-1)>>7; - if (y+1 < p->y) c33[8] = pixel_atp(p,x+1,y+1)>>7; - } - if (y > 0) c33[1] = pixel_atp(p, x ,y-1)>>7; - c33[4] = pixel_atp(p, x , y )>>7; - if (y+1 < p->y) c33[7] = pixel_atp(p, x ,y+1)>>7; - - /* do filtering */ - for (i = 0; i < Nfilt3; i++) - if( ( (filt3[i][0]>>1) || c33[0]!=(1 & filt3[i][0]) ) - && ( (filt3[i][1]>>1) || c33[1]!=(1 & filt3[i][1]) ) - && ( (filt3[i][2]>>1) || c33[2]!=(1 & filt3[i][2]) ) - && ( (filt3[i][3]>>1) || c33[3]!=(1 & filt3[i][3]) ) - && ( (filt3[i][4]>>1) || c33[4]!=(1 & filt3[i][4]) ) - && ( (filt3[i][5]>>1) || c33[5]!=(1 & filt3[i][5]) ) - && ( (filt3[i][6]>>1) || c33[6]!=(1 & filt3[i][6]) ) - && ( (filt3[i][7]>>1) || c33[7]!=(1 & filt3[i][7]) ) - && ( (filt3[i][8]>>1) || c33[8]!=(1 & filt3[i][8]) ) ) { - return ((filt3[i][4])?JOB->cfg.cs:0); - } - return pixel_atp(p, x, y) & ~7; -} -#endif - -#if FILTER_METHOD == FILTER_BY_NUMBER || defined(FILTER_CHECKED) - -#define NUM_TABLE_SIZE 512 /* max value of 9-bit value */ -/* - * Recursively generates entries in the number table for a matrix filter. - * - * gen_num_filt is the number representation of the matrix filter. - * This generation is handled recursively because this is the easiest - * way to handle 2 (either value) entries in the filter, which lead - * to 2 distinct entries in the number table (one for each alternate - * value). - */ -void rec_generate_number_table(char * num_table, const char * filter, - int i, unsigned short gen_num_filt) { - if (i == 9) { - /* Invert the value of the number representation, to reflect the - * fact that the "white" is 0 in the filter, 1 (high) in the image. */ - gen_num_filt = ~gen_num_filt; - gen_num_filt &= 0x01ff; - assert(gen_num_filt < NUM_TABLE_SIZE); - num_table[gen_num_filt] = 1; - } else { - if (filter[i] == 0 || filter[i] == 2) - rec_generate_number_table(num_table, filter, i + 1, gen_num_filt); - if (filter[i] == 1 || filter[i] == 2) { - gen_num_filt |= (1 << (8 - i)); - rec_generate_number_table(num_table, filter, i + 1, gen_num_filt); - } - } -} - -/* - * Filter the pixel at (x, y) using a number table. - * - * Each filter can be converted into a 9-bit representation, where - * filters containing 2 (either value) pixels are converted into - * a separate numerical representation for each pixel, where position - * i in the filter corresponds to bit i in the number. Each resulting - * numerical representation N is represented as a 1 value in the Nth - * position of a lookup table. A pixel's environment is converted in - * the same way to a numeric representation P, and that environment - * matches a filter if num_table[P] == 1. - */ -int pixel_filter_by_number(pix * p, int x, int y) { - unsigned short val = 0; - static char num_table[NUM_TABLE_SIZE]; - static int num_table_generated = 0; - if (!num_table_generated) { - int f; - memset(num_table, 0, sizeof(num_table)); - for (f = 0; f < Nfilt3; f++) - rec_generate_number_table(num_table, filt3[f], 0, 0); - num_table_generated = 1; - } - - /* calculate a numeric value for the 3x3 square around the pixel. */ - if (x > 0) { val |= (pixel_atp(p,x-1, y )>>7) << (8 - 3); - if (y > 0) val |= (pixel_atp(p,x-1,y-1)>>7) << (8 - 0); - if (y+1 < p->y) val |= (pixel_atp(p,x-1,y+1)>>7) << (8 - 6); - } - if (x+1 < p->x) { val |= (pixel_atp(p,x+1, y )>>7) << (8 - 5); - if (y > 0) val |= (pixel_atp(p,x+1,y-1)>>7) << (8 - 2); - if (y+1 < p->y) val |= (pixel_atp(p,x+1,y+1)>>7) << (8 - 8); - } - if (y > 0) val |= (pixel_atp(p, x ,y-1)>>7) << (8 - 1); - val |= (pixel_atp(p, x , y )>>7) << (8 - 4); - if (y+1 < p->y) val |= (pixel_atp(p, x ,y+1)>>7) << (8 - 7); - assert(val < NUM_TABLE_SIZE); - - if (num_table[val]) - return (val & (1 << 4)) ? 0 : JOB->cfg.cs; - else - return pixel_atp(p, x, y) & ~7; -} -#endif - -#if FILTER_METHOD == FILTER_BY_TREE || defined(FILTER_CHECKED) - -#define TREE_ARRAY_SIZE 1024 -/* 1+ number of nodes in a complete binary tree of height 10 */ - -/* - * Recursively generate a tree representation of a filter. - */ -void rec_generate_tree(char * tree, const char * filter, int i, int n) { - assert(i >= 0 && i <= 9); - assert(n < TREE_ARRAY_SIZE); - if (i == 9) { - if (filter[4] == 0) - tree[n] = 2; - else - tree[n] = 1; - return; - } - /* first iteration has n == -1, does not set any values of the tree, - just to find whether to start to the left or the right */ - if (n != -1) - tree[n] = 1; - if (filter[i] == 0) - rec_generate_tree(tree, filter, i + 1, n * 2 + 2); - else if (filter[i] == 1) - rec_generate_tree(tree, filter, i + 1, n * 2 + 3); - else { - rec_generate_tree(tree, filter, i + 1, n * 2 + 2); - rec_generate_tree(tree, filter, i + 1, n * 2 + 3); - } -} - -/* - * Filter the pixel at (x, y) using the tree method. - * - * Each filter is represented by a single branch of a binary - * tree, except for filters contain "either value" entries, which - * bifurcate at that point in the branch. Each white pixel in the filter - * is a left branch in the tree, each black pixel a right branch. The - * final node of a branch indicates whether this filter turns a white - * pixel black, or a black one white. - * - * We match a pixel's environment against this tree by similarly - * using the pixels in that environment to traverse the tree. If - * we run out of nodes before getting to the end of a branch, then - * the environment doesn't match against any of the filters represented - * by the tree. Otherwise, we return the value specified by the - * final node. - * - * Since the total tree size, even including missing nodes, is small - * (2 ^ 10), we can use a standard array representation of a binary - * tree, where for the node tree[n], the left child is tree[2n + 2], - * and the right tree[2n + 3]. The only information we want - * from a non-leaf node is whether it exists (that is, is part of - * a filter-representing branch). We represent this with the value - * 1 at the node's slot in the array, the contrary by 0. For the - * leaf node, 0 again represents non-existence, 1 that the filter - * represented by this branch turns a black pixel white, and 2 a - * white pixel black. - */ -int pixel_filter_by_tree(pix * p, int x, int y) { - static char tree[TREE_ARRAY_SIZE]; - static int tree_generated = 0; - int n; - int pixel_val = pixel_atp(p, x, y) & ~7; -#ifdef FILTER_STATISTICS - static int registered_filter_stats = 0; - if (!registered_filter_stats) { - atexit(print_filter_stats); - registered_filter_stats = 1; - } - filter_tries++; -#endif /* FILTER_STATISTICS */ - if (!tree_generated) { - int f; - memset(tree, 0, sizeof(tree)); - for (f = 0; f < Nfilt3; f++) { - const char * filter = filt3[f]; - rec_generate_tree(tree, filter, 0, -1); - } - tree_generated = 1; - } - n = -1; - - /* Note that for the image, low is black, high is white, whereas - * for the filter, 0 is white, 1 is black. For the image, then, - * high (white) means go left, low (black) means go right. */ - -#define IS_BLACK(_dx,_dy) !(pixel_atp(p, x + (_dx), y + (_dy)) >> 7) -#define IS_WHITE(_dx,_dy) (pixel_atp(p, x + (_dx), y + (_dy)) >> 7) -#define GO_LEFT n = n * 2 + 2 -#define GO_RIGHT n = n * 2 + 3 -#define CHECK_NO_MATCH if (tree[n] == 0) return pixel_val - - /* Top row */ - if (y == 0) { - /* top 3 pixels off edge == black == right - n = 2 * (2 * (2 * -1 + 3) + 3) + 3 = 13 */ - n = 13; - } else { - if (x == 0 || IS_BLACK(-1, -1)) - GO_RIGHT; - else - GO_LEFT; - - if (IS_WHITE(0, -1)) - GO_LEFT; - else - GO_RIGHT; - CHECK_NO_MATCH; - - if (x + 1 == p->x || IS_BLACK(+1, -1)) - GO_RIGHT; - else - GO_LEFT; - CHECK_NO_MATCH; - } - - /* Second row */ - if (x == 0 || IS_BLACK(-1, 0)) - GO_RIGHT; - else - GO_LEFT; - CHECK_NO_MATCH; - - if (IS_WHITE(0, 0)) - GO_LEFT; - else - GO_RIGHT; - CHECK_NO_MATCH; - - if (x + 1 == p->x || IS_BLACK(+1, 0)) - GO_RIGHT; - else - GO_LEFT; - CHECK_NO_MATCH; - - /* bottom row */ - if (y + 1 == p->y) { - /* bottom 3 pixels off edge == black == right - n' = 2 * (2 * (2n + 3) + 3) + 3 - = 2 * (4n + 9) + 3 - = 8n + 21 */ - n = 8 * n + 21; - } else { - if (x == 0 || IS_BLACK(-1, +1)) - GO_RIGHT; - else - GO_LEFT; - CHECK_NO_MATCH; - - if (IS_WHITE(0, 1)) - GO_LEFT; - else - GO_RIGHT; - CHECK_NO_MATCH; - - if (x + 1 == p->x || IS_BLACK(+1, +1)) - GO_RIGHT; - else - GO_LEFT; - } - assert(n < TREE_ARRAY_SIZE); - assert(tree[n] == 0 || tree[n] == 1 || tree[n] == 2); - CHECK_NO_MATCH; -#ifdef FILTER_STATISTICS - filter_matches++; -#endif - if (tree[n] == 1) { -#ifdef FILTER_STATISTICS - if (pixel_atp(p, x, y) < JOB->cfg.cs) - filter_whitened++; -#endif - return JOB->cfg.cs; - } else { -#ifdef FILTER_STATISTICS - if (pixel_atp(p, x, y) >= JOB->cfg.cs) - filter_blackened++; -#endif - return 0; - } -} -#endif /* FILTER_METHOD == FILTER_BY_TREE */ - -/* - * This simple filter attempts to correct "fax"-like scan errors. - */ -int pixel_faxfilter(pix *p, int x, int y) { - int r; // filter - r = pixel_atp(p,x,y)&~7; - /* {2,2,2, 2,0,1, 2,1,0} */ - if ((r&128) && (~pixel_atp(p,x+1, y )&128) - && (~pixel_atp(p, x ,y+1)&128) - && ( pixel_atp(p,x+1,y+1)&128)) - r = 64; /* faxfilter */ - - else - /* {2,2,2, 1,0,2, 0,1,2} */ - if ((r&128) && (~pixel_atp(p,x-1, y )&128) - && (~pixel_atp(p, x ,y+1)&128) - && ( pixel_atp(p,x-1,y+1)&128)) - r = 64; /* faxfilter */ - return r & ~7; -} - -#ifdef FILTER_CHECKED -/* - * Print out the 3x3 environment of a pixel as a 9-bit binary. - * - * For debugging purposes only. - */ -void print_pixel_env(FILE * out, pix * p, int x, int y) { - int x0, y0; - for (y0 = y - 1; y0 < y + 2; y0++) { - for (x0 = x - 1; x0 < x + 2; x0++) { - if (x0 < 0 || x0 >= p->x || y0 < 0 || y0 >= p->y) - fputc('?', out); - else if (pixel_atp(p, x0, y0) >> 7) - fputc('0', out); - else - fputc('1', out); - } - } -} -#endif - -/* this function is heavily used - * test if pixel was set, remove low bits (marks) --- later with error-correction - * result depends on n_run, if n_run>0 filter are used - * Returns: pixel-color (without marks) - */ -int getpixel(pix *p, int x, int y){ - if ( x < 0 || y < 0 || x >= p->x || y >= p->y ) - return 255 & ~7; - - /* filter will be used only once later, when vectorization replaces pixel - * processing - */ - if (JOB->tmp.n_run > 0) { /* use the filters (correction of errors) */ -#if FILTER_METHOD == FILTER_BY_NUMBER - int pix = pixel_filter_by_number(p, x, y); -#ifdef FILTER_CHECKED - int pix2 = pixel_filter_by_matrix(p, x, y); - if (pix != pix2) { - fprintf(stderr, - "# BUG: pixel_filter: by number: %d; by matrix: %d, " - "by atp %d; env: ", pix, pix2, pixel_atp(p, x, y) & ~7); - print_pixel_env(stderr, p, x, y); - fputc('\n', stderr); - } -#endif /* FILTER_CHECKED */ - return pix; -#elif FILTER_METHOD == FILTER_BY_MATRIX - return pixel_filter_by_matrix(p, x, y); -#elif FILTER_METHOD == FILTER_BY_TREE - int pix = pixel_filter_by_tree(p, x, y); -#ifdef FILTER_CHECKED - int pix2 = pixel_filter_by_matrix(p, x, y); - int pix3 = pixel_filter_by_number(p, x, y); - if (pix != pix2 || pix != pix3) { - fprintf(stderr, - "# BUG: pixel_filter: tree: %d; matrix: %d, " - "number: %d, atp %d; env: ", pix, pix2, pix3, - pixel_atp(p, x, y) & ~7); - print_pixel_env(stderr, p, x, y); - fputc('\n', stderr); - } -#endif /* FILTER_CHECKED */ - return pix; -#else -#error FILTER_METHOD not defined -#endif /* FILTER_BY_NUMBER */ - } - - return (pixel_atp(p,x,y) & ~7); -} - -/* modify pixel, test if out of range */ -void put(pix * p, int x, int y, int ia, int io) { - if (x < p->x && x >= 0 && y >= 0 && y < p->y) - pixel_atp(p, x, y) = (pixel_atp(p, x, y) & ia) | io; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pnm.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/pnm.h deleted file mode 100644 index 7d5bc8a1a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/pnm.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Handle PNM-files Dez98 JS - * 0,0 = left up - * PAM-formats - * PAM any P7 - * PNM-formats - * PGM gray ASCII=P2 RAW=P5 dx dy col gray - * PPM RGB ASCII=P3 RAW=P6 dx dy col RGB - * PBM B/W ASCII=P1 RAW=P4 dx dy bitmap - */ - -#ifndef GOCR_PNM_H -#define GOCR_PNM_H 1 - -#include "../../config.h" - -struct pixmap { - unsigned char *p; /* pointer of image buffer (pixmap) */ - int x; /* xsize */ - int y; /* ysize */ - int bpp; /* bytes per pixel: 1=gray 3=rgb */ - }; -typedef struct pixmap pix; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.c deleted file mode 100644 index 14804ed8d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.c +++ /dev/null @@ -1,87 +0,0 @@ -/* ---------------------------- progress output ---------------------- */ -#include -#include -#include "progress.h" - -FILE *fp=NULL; /* output stream for progress info */ -time_t printinterval = 10; /* approx. seconds between printouts, 1.. */ - -/* initialization of progress output, fname="","","-" */ -int ini_progress(char *fname){ - int fd; - if (fp) { fclose(fp); fp=NULL; } - if (fname) if (fname[0]) { - fd=atoi(fname); - if(fd>255 || fname[((fd>99)?3:((fd>9)?2:1))]) fd=-1; /* be sure */ - if (fname[0]=='-' && fname[1]==0) { fp=stdout; } -#ifdef __USE_POSIX - else if (fd>0) { fp=fdopen(fd,"w"); } /* not sure that "w" is ok ???? */ -#endif - else { fp=fopen(fname,"w");if(!fp)fp=fopen(fname,"a"); } - if (!fp) { - fprintf(stderr,"could not open %s for progress output\n",fname); - return -1; /* no success */ - } - } - /* fprintf(stderr,"# progress: fd=%d\n",fileno(fp)); */ - return 0; /* no error */ -} - -progress_counter_t *open_progress(int maxcount, const char *name){ - progress_counter_t *pc; - pc = (progress_counter_t*) malloc( sizeof(progress_counter_t) ); - if (!pc) return 0; /* nonfatal */ - pc->starttime = time(NULL); - pc->maxcount = maxcount; - pc->numskip = 0; - pc->lastprintcount = -1; - pc->name = name; - pc->lastprinttime = pc->starttime; - return pc; -} -/* free counter */ -int close_progress(progress_counter_t *counter){ - if (counter) free(counter); - return 0; -} -/* progress meter output - * only 1output/10s, + estimated endtime (test on pixelfields) - * ToDo: to stderr by default? remove subprogress, ini_progress? rm_progress? - * test on tcl - */ -int progress(int counter, progress_counter_t *pc){ - /* we try to save computing time, so we skip early */ - if ((!fp) || counter - pc->lastprintcount <= pc->numskip) return 0; - { - char cr='\n'; - time_t now = time(NULL); -#if 0 /* debugging */ - if (counter) - fprintf(fp," progress %s %3d / %d time %d skip %d\n", - pc->name,counter,pc->maxcount,(int)(now - pc->starttime), - pc->numskip); fflush(fp); -#endif - if (5*(now - pc->lastprinttime) < 2*printinterval - && counter - pc->lastprintcount >= pc->numskip) { /* save for tests */ - if (pc->numskip < 1024) pc->numskip += pc->numskip+1; - } - if (3*(now - pc->lastprinttime) < 2*printinterval ) { - return 0; /* to early for printing */ - } - if (2*(now - pc->lastprinttime) > 3*printinterval ) { - pc->numskip >>= 1; /* to late for printing */ - } - if (fileno(fp)<3) cr='\r'; /* may be choosen in ini? */ - if (counter) - fprintf(fp," progress %s %5d / %d time[s] %5d / %5d (skip=%d)%c", - pc->name,counter,pc->maxcount, - (int)(now - pc->starttime), /* time gone since start */ - (int)(now - pc->starttime)*pc->maxcount/(counter), /* estimated */ - pc->numskip, cr); - fflush(fp); - pc->lastprintcount=counter; - pc->lastprinttime=now; - } - return 0; /* no error */ -} -/* --------------------- end of progress output ---------------------- */ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.h deleted file mode 100644 index d31e7a829..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/progress.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - ---------------------- progress output ---------------------- - output progress for GUIs to a pipe - format: "counter_name" counter maxcounter time estimated_time \r|\n - */ -#ifndef GOCR_PROGRESS_H -#define GOCR_PROGRESS_H "Oct06" -#include - -/* initialization of progress output, fname="","","-" */ -int ini_progress(char *fname); - -/* ToDo: add by open_* and close_* */ -/* place to store values for progress calculation, called often, but - * dont call systime so often - */ -typedef struct progress_counter { - const char *name; /* name of counter */ - int lastprintcount; /* last counter printed for extrapolation */ - int maxcount; /* max counter */ - int numskip; /* num of counts to skip before timecall 0..maxcount */ - time_t starttime; /* start time of this counter */ - time_t lastprinttime; /* last time printed in seconds */ - -} progress_counter_t; - -/* progress output p1=main_progress_0..100% p2=sub_progress_0..100% */ -/* ToDo: improved_progress: counter, maxcount(ini), counter_name(ini), - * printinterval=10 # time before printing out progressmeter - * *numskip=1 # if (counter-lastprintcounter -#include -#include "pgm2asc.h" -#include "gocr.h" -#include "progress.h" - -/* measure mean thickness as an criteria for big chars */ -int mean_thickness( struct box *box2 ){ - int mt=0, i, y, dx=box2->x1-box2->x0+1, dy; - for (y=box2->y0+1; yy1; y++) { - i=loop(box2->p,box2->x0+0,y,dx,JOB->cfg.cs,0,RI); - i=loop(box2->p,box2->x0+i,y,dx,JOB->cfg.cs,1,RI); - mt+=i; - } - dy = box2->y1 - box2->y0 - 1; - if (dy) mt=(mt+dy/2)/dy; - return mt; -} - -/* ---- remove dust --------------------------------- - What is dust? I think, this is a very small pixel cluster without - neighbours. Of course not all dust clusters can be detected correct. - This feature should be possible to switch off via option. - -> may be, all clusters should be stored here? - speed is very slow, I know, but I am happy that it is working well -*/ -int remove_dust( job_t *job ){ - /* new dust removing */ - /* FIXME jb:remove pp */ - pix *pp = &job->src.p; - int i1,i,j,x,y,x0,x1,y0,y1,nC,sX,sY,sP, cs,vvv=job->cfg.verbose; - struct box *box2; -#define HISTSIZE 220 /* histogramm */ - int histo[HISTSIZE]; - cs=job->cfg.cs; sP=sX=sY=nC=0; - /* - * count number of black pixels within a box and store it in .dots - * later .dots is re-used for number of objects belonging to the character - * should be done in the flood-fill algorithm - * volume of white pixels is estimated to big here (left/right rot) - * ToDo: mean thickness of char lines? - * or interval nesting (minP..maxP) to remove outriders - */ - j=0; - for (i1=0;i1res.boxlist)) { - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - if (!box2->num_frames) continue; - if (box2->frame_vol[0]<0) continue; /* don't count inner holes */ - j = abs(box2->frame_vol[0]); - if ((box2->y1-box2->y0+1)>3) { - nC++; /* only count potential chars v0.42 */ - sX+=box2->x1 - box2->x0 + 1; - sY+=box2->y1 - box2->y0 + 1; - sP+=j; - } - if (jres.boxlist)); - - if (job->cfg.dust_size < 0 && nC > 0) { /* auto detection */ - /* this formula is empirically, high resolution scans have bigger dust */ - /* maximum allowed dustsize (min=4*7 ca. 32) - * does not work for background pattern! - */ - job->cfg.dust_size = ( ( sX/nC ) * ( sY/nC ) + 16) / 32; - if (vvv) fprintf(stderr, "# dust size detection, vol num" - " #obj=%d maxDust=%d mpixel= %3d mxy= %2d %2d", - nC, job->cfg.dust_size, sP/nC, sX/nC, sY/nC); - /* we assume that for random dust applies histo[i+1]=nC) continue; /* v0.42 lot of pixels -> bg pattern < 3 */ - if (i>=job->cfg.dust_size) break; /* maximum = mean size / 32 */ - if (histo[i+1]==0) break; /* bad statistic */ - if ((histo[i+2]+histo[i+3]) - >=(histo[i] +histo[i+1])) break; /* no noise, but to late? */ - if ( histo[i-1] > 1024*histo[i] && - 2*histo[i+1] >=histo[i]) break; /* bg pattern */ - } - if (vvv) fprintf(stderr," break"); - if (vvv) for (i1=0,j=i+1;j20) break; /* dont do excessive output */ - } - } - job->cfg.dust_size=i-1; - /* what is the statistic of random dust? - * if we have p pixels on a x*y image we should have - * (p/(x*y))^1 * (x*y) = p singlets - * (p/(x*y))^2 * (x*y) = p^2/(x*y) doublets and - * (p/(x*y))^3 * (x*y) = p^3/(x*y)^2 triplets - */ - if (vvv) fprintf(stderr,"\n# auto dust size = %d nC= %3d .. %3d" - " avD= %2d %2d .. %2d %2d\n", - job->cfg.dust_size, nC, job->res.numC, - (job->res.sumX+job->res.numC/2)/job->res.numC, - (job->res.sumY+job->res.numC/2)/job->res.numC, sX/nC, sY/nC); - } - if (job->cfg.dust_size) - { i=0; - if(vvv){ - fprintf(stderr,"# remove dust of size %2d",job->cfg.dust_size); - /* Warning: better use (1/(x*y))^2 as 1/((x*y)^2), - * because (x*y)^2 may overflow */ - fprintf(stderr," histo=%d,%d(?=%d),%d(?=%d),...\n# ...", - histo[1],histo[2],histo[1]*histo[1]/(pp->x*pp->y), - histo[3], histo[1]*histo[1]/(pp->x*pp->y) - *histo[1]/(pp->x*pp->y)); - } - i = 0; - for_each_data(&(job->res.boxlist)) { - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - x0=box2->x0;x1=box2->x1;y0=box2->y0;y1=box2->y1; /* box */ - j=abs(box2->frame_vol[0]); - if(j<=job->cfg.dust_size) /* remove this tiny object */ - { /* here we should distinguish dust and i-dots, - * may be we should sort out dots to a seperate dot list and - * after line detection decide, which is dust and which not - * dust should be removed to make recognition easier (ToDo) - */ -#if 0 - if(get_bw((3*x0+x1)/4,(x0+3*x1)/4,y1+y1-y0+1,y1+8*(y1-y0+1),pp,cs,1)) - continue; /* this idea was to simple, see kscan003.jpg sample */ -#endif - /* remove from average */ - job->res.numC--; - job->res.sumX-=x1-x0+1; - job->res.sumY-=y1-y0+1; - /* remove pixels (should only be done with dust) */ - for(x=x0;x<=x1;x++) - for(y=y0;y<=y1;y++){ put(pp,x,y,0,255&~7); } - /* remove from list */ - list_del(&(job->res.boxlist),box2); - /* free memory */ - free_box(box2); - i++; /* count as dust particle */ - continue; - } - } end_for_each(&(job->res.boxlist)); - if(vvv)fprintf(stderr," %3d cluster removed, nC= %3d\n",i,job->res.numC); - } - /* reset dots to 0 and remove white pixels (new) */ - i=0; - for_each_data(&(job->res.boxlist)) { - box2 = ((struct box *)list_get_current(&(job->res.boxlist))); - if (box2->frame_vol[0]<0) continue; /* for black areas only */ - x0=box2->x0;x1=box2->x1;y0=box2->y0;y1=box2->y1; /* box */ - if (x1-x0>16 && y1-y0>30) /* only on large enough chars */ - for(x=x0+1;x<=x1-1;x++) - for(y=y0+1;y<=y1-1;y++){ - if( pixel_atp(pp,x ,y )>=cs - && pixel_atp(pp,x-1,y ) res.boxlist)); - if (vvv) fprintf(stderr,"# ... %3d white pixels removed, cs=%d nC= %3d\n", - i,cs,job->res.numC); - return 0; -} - -/* ---- smooth big chars --------------------------------- - * Big chars often do not have smooth borders, which let fail - * the engine. Here we smooth the borders of big chars (>7x16). - * Smoothing is important for b/w scans, where we often have - * comb like pattern on a vertikal border. I also received - * samples with lot of white pixels (sample: 04/02/25). - * ToDo: obsolete if vector code is complete - */ -int smooth_borders( job_t *job ){ - pix *pp = &job->src.p; - int ii=0,x,y,x0,x1,y0,y1,dx,dy,cs,i0,i1,i2,i3,i4,n1,n2, - cn[8],cm,vvv=job->cfg.verbose; /* dust found */ - struct box *box2; - cs=job->cfg.cs; n1=n2=0; - if(vvv){ fprintf(stderr,"# smooth big chars 7x16 cs=%d",cs); } - /* filter for each big box */ - for_each_data(&(job->res.boxlist)) { n2++; /* count boxes */ - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - /* do not touch small characters! but how we define small characters? */ - if (box2->x1-box2->x0+1<7 || box2->y1-box2->y0+1<16 ) continue; - if (box2->c==PICTURE) continue; - if (mean_thickness(box2)<3) continue; - n1++; /* count boxes matching big-char criteria */ - x0=box2->x0; y0=box2->y0; - x1=box2->x1; y1=box2->y1; - dx=x1-x0+1; dy=y1-y0-1; - /* out_x(box2); - * dont change to much! only change if absolutely sure! - * ....... 1 2 3 - * ex: .?##### 0 * 4 - * ....... 7 6 5 - * we should also avoid removing lines by sytematic remove - * from left end to the right, so we concern also about distance>1 - */ - for(x=box2->x0;x<=box2->x1;x++) - for(y=box2->y0;y<=box2->y1;y++){ /* filter out high frequencies */ - /* this is a very primitive solution, only for learning */ - cn[0]=getpixel(pp,x-1,y); - cn[4]=getpixel(pp,x+1,y); /* horizontal */ - cn[2]=getpixel(pp,x,y-1); - cn[6]=getpixel(pp,x,y+1); /* vertical */ - cn[1]=getpixel(pp,x-1,y-1); - cn[3]=getpixel(pp,x+1,y-1); /* diagonal */ - cn[7]=getpixel(pp,x-1,y+1); - cn[5]=getpixel(pp,x+1,y+1); - cm=getpixel(pp,x,y); - /* check for 5 other and 3 same surrounding pixels */ - for (i0=0;i0<8;i0++) - if ((cn[i0 ]=5 && i3>=3 && i4>=3) { /* change only on borders */ - ii++; /* white : black */ - put(pp,x,y,7,((cmx0,y-box2->y0,i0,i1,i2,i3,i3,cm,getpixel(pp,x,y),cs); -#endif - } - } -#if 0 /* debugging */ - out_x(box2); -#endif - } end_for_each(&(job->res.boxlist)); - if(vvv)fprintf(stderr," ... %3d changes in %d of %d\n",ii,n1,n2); - return 0; -} - -/* test if a corner of box1 is within box2 */ -int box_nested( struct box *box1, struct box *box2){ - /* box1 in box2, +1..-1 frame for pixel-patterns */ - if ( ( ( box1->x0>=box2->x0-1 && box1->x0<=box2->x1+1 ) - || ( box1->x1>=box2->x0-1 && box1->x1<=box2->x1+1 ) ) - && ( ( box1->y0>=box2->y0-1 && box1->y0<=box2->y1+1 ) - || ( box1->y1>=box2->y0-1 && box1->y1<=box2->y1+1 ) ) ) - return 1; - return 0; -} - -/* test if box1 is within box2 */ -int box_covered( struct box *box1, struct box *box2){ - /* box1 in box2, +1..-1 frame for pixel-patterns */ - if ( ( box1->x0>=box2->x0-1 && box1->x1<=box2->x1+1 ) - && ( box1->y0>=box2->y0-1 && box1->y1<=box2->y1+1 ) ) - return 1; - return 0; -} - -/* ---- remove pictures ------------------------------------------ - * may be, not deleting or moving to another list is much better! - * should be renamed to remove_pictures and border boxes - */ -int remove_pictures( job_t *job){ - struct box *box4,*box2; - int j=0, j2=0, num_del=0; - - if (job->cfg.verbose) - fprintf(stderr, "# "__FILE__" L%d: remove pictures\n# ...", - __LINE__); - - /* ToDo: output a list for picture handle scripts */ - j=0; j2=0; - if(job->cfg.verbose) - for_each_data(&(job->res.boxlist)) { - box4 = (struct box *)list_get_current(&(job->res.boxlist)); - if (box4->c==PICTURE) j++; else j2++; - } end_for_each(&(job->res.boxlist)); - if (job->cfg.verbose) - fprintf(stderr," status: pictures= %d other= %d nC= %d\n# ...", - j, j2, job->res.numC); - - /* remove table frames */ - if (job->res.numC > 8) - for_each_data(&(job->res.boxlist)) { - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - if (box2->c==PICTURE - && box2->x1-box2->x0+1>box2->p->x/2 /* big table? */ - && box2->y1-box2->y0+1>box2->p->y/2 ){ j=0; - /* count boxes nested with the picture */ - for_each_data(&(job->res.boxlist)) { - box4 = (struct box *)list_get_current(&(job->res.boxlist)); - if( box4 != box2 ) /* not count itself */ - if (box_nested(box4,box2)) j++; /* box4 in box2 */ - } end_for_each(&(job->res.boxlist)); - if( j>8 ){ /* remove box if more than 8 chars are within box */ - list_del(&(job->res.boxlist), box2); /* does not work proper ?! */ - free_box(box2); num_del++; - } - } - } end_for_each(&(job->res.boxlist)); - if (job->cfg.verbose) - fprintf(stderr, " deleted= %d pictures (table frames)\n# ...", - num_del); - num_del=0; - - /* remove dark-border-boxes (typical for hard copy of book site, - * or spam random border) */ - if (job->res.numC > 1) /* dont remove the only char */ - for_each_data(&(job->res.boxlist)) { - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - if (box2->c!=PICTURE) continue; // ToDo: PICTUREs set already? - if ( box2->x1-box2->x0+1 > box2->p->x/2 - && box2->y1-box2->y0+1 > box2->p->y/2 ) continue; - j=0; - if (box2->x0==0) j++; - if (box2->y0==0) j++; /* on border? */ - if (box2->x1==box2->p->x-1) j++; - if (box2->y1==box2->p->y-1) j++; - if (j>2){ /* ToDo: check corner pixel */ - int cs=job->cfg.cs; - j=0; - if (getpixel(box2->p,box2->x0,box2->y0)p,box2->x1,box2->y0)p,box2->x0,box2->y1)p,box2->x1,box2->y1)2) { - list_del(&(job->res.boxlist), box2); - free_box(box2); num_del++; - } - } - } end_for_each(&(job->res.boxlist)); - if (job->cfg.verbose) - fprintf(stderr, " deleted= %d pictures (on border)\n# ...", - num_del); - num_del=0; - - j=0; j2=0; - if(job->cfg.verbose) - for_each_data(&(job->res.boxlist)) { - box4 = (struct box *)list_get_current(&(job->res.boxlist)); - if( box4->c==PICTURE ) j++; else j2++; - } end_for_each(&(job->res.boxlist)); - if (job->cfg.verbose) - fprintf(stderr," status: pictures= %d other= %d nC= %d\n# ...", - j, j2, job->res.numC); - - for(j=1;j;){ j=0; /* this is only because list_del does not work */ - /* can be slow on gray images */ - for_each_data(&(job->res.boxlist)) { - box2 = (struct box *)list_get_current(&(job->res.boxlist)); - if( box2->c==PICTURE && box2->num_ac==0) - for(j=1;j;){ /* let it grow to max before leave */ - j=0; box4=NULL; - /* find boxes nested with the picture and remove */ - /* its for pictures build by compounds */ - for_each_data(&(job->res.boxlist)) { - box4 = (struct box *)list_get_current(&(job->res.boxlist)); - if( box4!=box2 /* not destroy self */ - && (box4->num_ac==0) /* dont remove barcodes etc. */ - && (/* box4->c==UNKNOWN || */ - box4->c==PICTURE) ) /* dont remove valid chars */ - if( - /* box4 in box2, +1..-1 frame for pixel-patterns */ - box_nested(box4,box2) - /* or box2 in box4 */ - || box_nested(box2,box4) /* same? */ - ) - if ( box4->x1-box4->x0+1>2*job->res.avX - || box4->x1-box4->x0+1res.avX/2 - || box4->y1-box4->y0+1>2*job->res.avY - || box4->y1-box4->y0+1res.avY/2 - || box_covered(box4,box2) ) /* box4 completely within box2 */ - /* dont remove chars! see rotate45.fig */ - { - /* do not remove boxes in inner loop (bug?) ToDo: check why! */ - /* instead we leave inner loop and mark box4 as valid */ - if( box4->x0x0 ) box2->x0=box4->x0; - if( box4->x1>box2->x1 ) box2->x1=box4->x1; - if( box4->y0y0 ) box2->y0=box4->y0; - if( box4->y1>box2->y1 ) box2->y1=box4->y1; - j=1; /* mark box4 as valid */ - break; /* and leave inner loop */ - } - } end_for_each(&(job->res.boxlist)); - if (j!=0 && box4!=NULL) { /* check for valid box4 */ - /* ToDo: melt */ - list_del(&(job->res.boxlist), box4); /* does not work proper ?! */ - free_box(box4); /* break; ToDo: necessary to leave after del??? */ - num_del++; - } - - } - } end_for_each(&(job->res.boxlist)); - } - - if (job->cfg.verbose) - fprintf(stderr, " deleted= %d nested pictures\n# ...", num_del); - - /* output a list for picture handle scripts */ - j=0; j2=0; - if(job->cfg.verbose) - for_each_data(&(job->res.boxlist)) { - box4 = (struct box *)list_get_current(&(job->res.boxlist)); - if( box4->c==PICTURE ) { - fprintf(stderr," found picture at %4d %4d size %4d %4d\n# ...", - box4->x0, box4->y0, box4->x1-box4->x0+1, box4->y1-box4->y0+1 ); - j++; - } else j2++; - } end_for_each(&(job->res.boxlist)); - if (job->cfg.verbose) - fprintf(stderr," status: pictures= %d other= %d nC= %d\n", - j, j2, job->res.numC); - return 0; -} - - - - /* ---- remove melted serifs --------------------------------- v0.2.5 - >>v<< - ##########.######## <-y0 - ################### like X VW etc. - ...###.......###... <-y - ...###......###.... - j1 j2 j3 - - can generate new boxes if two characters were glued - */ -int remove_melted_serifs( pix *pp ){ - int x,y,j1,j2,j3,j4,i2,i3,i,ii,ni,cs,x0,x1,xa,xb,y0,y1,vvv=JOB->cfg.verbose; - struct box *box2, *box3; - progress_counter_t *pc = NULL; - - cs=JOB->cfg.cs; i=0; ii=0; ni=0; - for_each_data(&(JOB->res.boxlist)) { - ni++; - } end_for_each(&(JOB->res.boxlist)); - pc = open_progress(ni,"remove_melted_serifs"); - ni = 0; - - if(vvv){ fprintf(stderr,"# searching melted serifs ..."); } - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->c != UNKNOWN) continue; /* dont try on pictures */ - x0=box2->x0; x1=box2->x1; - y0=box2->y0; y1=box2->y1; /* box */ - /* upper serifs */ - for(j1=x0;j1+4x1+1) break; - y =loop(pp,j1,y0+1,x1-x0,cs,1,RI); if(y>x) x=y; if(j1+x>x1+1) break; - /* measure mean thickness of serif */ - for(j2=j3=j4=0,i2=j1;i2y1-y0) break; - i3+=loop(pp,j1,y0+i3,y1-y0,cs,1,DO); if(8*i3>y1-y0) break; - if(8*i3j3)j3=i3; - j3 = j3 + loop(pp,j3,y ,x1-j3,cs,1,RI); - i3 = loop(pp,j3,y ,x1-j3,cs,0,RI); - if(i3<2 || j3>=j1+x){j1+=x;continue;} - j3 += i3/2; - - if(x>5) - { - i++; /* snip! */ - for(y=0;y<(y1-y0+1+4)/8;y++)put(pp,j2,y0+y,255,128+64); /* clear highest bit */ - if(vvv&4){ - fprintf(stderr,"\n"); - //out_x(box2); - fprintf(stderr,"# melted serifs corrected on %d %d j1=%d j3=%d", - j2-x0, y, j1-x0, j3-x0); - } - for(xb=0,xa=0;xa<(x1-x0+4)/8;xa++){ /* detect vertical gap */ - i3=y1; - if(box2->m3>y0 && 2*y1>box2->m3+box2->m4) i3=box2->m3; /* some IJ */ - if( loop(pp,j2-xa,i3,i3-y0,cs,0,UP) > (y1-y0+1)/2 - && loop(pp,j2,(y0+y1)/2,xa+1,cs,0,LE) >=xa ){ xb=-xa; break; } - if( loop(pp,j2+xa,i3,i3-y0,cs,0,UP) > (y1-y0+1)/2 - && loop(pp,j2,(y0+y1)/2,xa+1,cs,0,RI) >=xa ){ xb= xa; break; } - } - if( get_bw(j2 ,j2 ,y0,(y0+y1)/2,pp,cs,1) == 0 - && get_bw(j2+xb,j2+xb,(y0+y1)/2,i3,pp,cs,1) == 0 ) - { /* divide */ - box3=malloc_box(box2); - box3->x1=j2-1; - box2->x0=j2+1; x1=box2->x1; - cut_box(box2); /* cut vectors outside the box */ - cut_box(box3); - box3->num=JOB->res.numC; - list_ins(&(JOB->res.boxlist),box2,box3); JOB->res.numC++; ii++; /* insert box3 before box2 */ - if(vvv&4) fprintf(stderr," => splitted"); - j1=x0=box2->x0; x=0; /* hopefully ok, UVW */ - } - } - j1+=x; - } - /* same on lower serifs -- change this later to better function - // #### ### - // #### v ### # <-y - // #################### <-y1 - // j1 j2 j3 - */ - for(j1=x0;j1x1+1) break; - y =loop(pp,j1,y1-1,x1-x0,cs,1,RI); if(y>x) x=y; if(j1+x>x1+1) break; - /* measure mean thickness of serif */ - for(j2=j3=j4=0,i2=j1;i2y1-y0) break; - i3+=loop(pp,j1,y1-i3,y1-y0,cs,1,UP); if(8*i3>y1-y0) break; - if(8*i3j3)j3=i3; - j3 = j3 + loop(pp,j3,y ,x1-j3,cs,1,RI); - i3 = loop(pp,j3,y,x1-j3,cs,0,RI); - if(i3<2 || j3>=j1+x){j1+=x;continue;} - j3 += i3/2; - - /* y =y1-(y1-y0+1+4)/8; */ - if(x>5) - { - i++; /* snip! */ - for(i3=0;i3<(y1-y0+1+4)/8;i3++) - put(pp,j2,y1-i3,255,128+64); /* clear highest bit */ - if(vvv&4){ - fprintf(stderr,"\n"); - //out_x(box2); - fprintf(stderr,"# melted serifs corrected on %d %d j1=%d j3=%d",j2-x0,y-y0,j1-x0,j3-x0); - } - for(xb=0,xa=0;xa<(x1-x0+4)/8;xa++){ /* detect vertical gap */ - if( loop(pp,j2-xa,y0,y1-y0,cs,0,DO) > (y1-y0+1)/2 - && loop(pp,j2,(y0+y1)/2,xa+1,cs,0,LE) >=xa ){ xb=-xa; break; } - if( loop(pp,j2+xa,y0,y1-y0,cs,0,DO) > (y1-y0+1)/2 - && loop(pp,j2,(y0+y1)/2,xa+1,cs,0,RI) >=xa ){ xb= xa; break; } - } - if( get_bw(j2 ,j2 ,(y0+y1)/2,y1,pp,cs,1) == 0 - && get_bw(j2+xb,j2+xb,y0,(y0+y1)/2,pp,cs,1) == 0 ) - { /* divide */ - box3=malloc_box(box2); - box3->x1=j2-1; - box2->x0=j2; x1=box2->x1; - cut_box(box2); /* cut vectors outside the box */ - cut_box(box3); - box3->num=JOB->res.numC; - list_ins(&(JOB->res.boxlist),box2,box3); JOB->res.numC++; ii++; - /* box3,box2 in correct order??? */ - if(vvv&4) fprintf(stderr," => splitted"); - j1=x0=box2->x0; x=0; /* hopefully ok, NMK */ - } - } - j1+=x; - } - progress(ni++,pc); - } end_for_each(&(JOB->res.boxlist)); - close_progress(pc); - if(vvv)fprintf(stderr," %3d cluster corrected, %d new boxes\n",i,ii); - return 0; -} - -/* remove black borders often seen on bad scanned copies of books - - dust around the border - */ -int remove_rest_of_dust() { - int i1, i2, vvv = JOB->cfg.verbose, x0, x1, y0, y1, cnt=0; - struct box *box2, *box4; - progress_counter_t *pc = NULL; - - i1 = i2 = 0; /* counter for removed boxes */ - if (vvv) - fprintf(stderr, "# detect dust (avX,nC), ... "); - /* remove fragments from border */ - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (box2->c == UNKNOWN) { - x0 = box2->x0; x1 = box2->x1; - y0 = box2->y0; y1 = box2->y1; /* box */ - /* box in char ??? */ - if ( 2 * JOB->res.numC * (y1 - y0 + 1) < 3 * JOB->res.sumY - && ( y1 < box2->p->y/4 || y0 > 3*box2->p->y/4 ) /* not single line */ - && JOB->res.numC > 1 /* do not remove everything */ - && ( box2->m4 == 0 ) ) /* remove this */ - { - JOB->res.numC--; /* ToDo: dont count tiny pixels */ - /* ToDo: res.sumX,Y must also be corrected */ - i1++; - list_del(&(JOB->res.boxlist), box2); - free_box(box2); - } - } - } end_for_each(&(JOB->res.boxlist)); - - pc = open_progress(JOB->res.boxlist.n,"remove_dust2"); - for_each_data(&(JOB->res.boxlist)) { - box2 = (struct box *)list_get_current(&(JOB->res.boxlist)); - progress(cnt++,pc); - if (box2->c == PICTURE) continue; - x0 = box2->x0; x1 = box2->x1; - y0 = box2->y0; y1 = box2->y1; /* box */ - /* remove tiny box2 if to far away from bigger boxes */ - /* ToDo: remove clouds of tiny pixels (count near small, compare with num bigger) */ - /* 0.42: remove far away pixel? ToDo: do it at earlier? */ - if (x1-x0+1<3 && y1-y0+1<3){ - int xn, yn, xs, ys; - int found=0; /* nearest bigger box */ - /* search near bigger box */ - for_each_data(&(JOB->res.boxlist)) { - box4 = (struct box *)list_get_current(&(JOB->res.boxlist)); - if (found || box4 == box2) continue; - if (box4->x1-box4->x0+1<3 && box4->y1-box4->y0+1<3) continue; - xs = box4->x1-box4->x0+1; - ys = box4->y1-box4->y0+1; - xn = abs((box4->x0+box4->x1)/2 - box2->x0); - yn = abs((box4->y0+box4->y1)/2 - box2->y0); - if (2*xn < 3*xs && 2*yn < 3*ys) { found=1; } - } end_for_each(&(JOB->res.boxlist)); - if (!found) { /* found nothing, box2 to far from big boxes */ - i2++; - list_del(&(JOB->res.boxlist), box2); - free_box(box2); - } - } - } end_for_each(&(JOB->res.boxlist)); - close_progress(pc); - if (vvv) - fprintf(stderr, " %3d + %3d boxes deleted, nC= %d ?\n", - i1, i2, JOB->res.numC); - - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.c b/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.c deleted file mode 100644 index d8ed70367..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.c +++ /dev/null @@ -1,1314 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2007 Joerg Schulenburg - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL-address - */ - -#include "unicode.h" -#include - -/* FIXME jb global */ -int warn=0; /* if 1 a message is generated if composition is not defined */ - -/* Arguments: the character (main), and the modifier (accent, etc). See the - function if you want to know the modifiers. - Description: This function intends to be a small helper, to avoid having - to write switches in functions. It's therefore mainly to accents, and - specially for the most usual ones. It supports the basic greek - characters too, which is actually not very helpful. - Returns: the unicode character corresponding to the composed character. - - ToDo: - - It seems to me, that tables should be more effectiv. - So we should use tables in future? (js) - */ -wchar_t compose(wchar_t main, wchar_t modifier) { -/* supported by now: part of ISO8859-1, basic greek characters */ - if( main == UNKNOWN || main == PICTURE ) return main; -#ifdef DEBUG - if(modifier!=UNICODE_NULL && modifier!=SPACE) - printf(" compose(%c,%d)",(char)main,(int)modifier); -#endif - if(main>127 && modifier!=0 && modifier!=SPACE && warn) - fprintf(stderr,"# Warning compose %04x + %04x>127\n", - (int)modifier,(int)main); - switch (modifier) { - case UNICODE_NULL: - case SPACE: - return (wchar_t)main; - - case APOSTROPHE: /* do NOT USE this. It's here for compatibility only. - Use ACUTE_ACCENT instead. */ - fprintf( stderr, "COMPOSE: got APOSTROPHE instead of ACUTE_ACCENT"); - - case ACUTE_ACCENT: /* acute/cedilla */ - switch (main) { - case 'a': return LATIN_SMALL_LETTER_A_WITH_ACUTE; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_ACUTE; - case LATIN_SMALL_LETTER_AE: return LATIN_SMALL_LETTER_AE_WITH_ACUTE; - case LATIN_CAPITAL_LETTER_AE: return LATIN_CAPITAL_LETTER_AE_WITH_ACUTE; - case 'c': return LATIN_SMALL_LETTER_C_WITH_ACUTE; - case 'C': return LATIN_CAPITAL_LETTER_C_WITH_ACUTE; - case 'e': return LATIN_SMALL_LETTER_E_WITH_ACUTE; - case 'E': return LATIN_CAPITAL_LETTER_E_WITH_ACUTE; - case 'g': return LATIN_SMALL_LETTER_G_WITH_ACUTE; - case 'G': return LATIN_CAPITAL_LETTER_G_WITH_ACUTE; - case 'i': return LATIN_SMALL_LETTER_I_WITH_ACUTE; - case 'I': return LATIN_CAPITAL_LETTER_I_WITH_ACUTE; - case 'l': return LATIN_SMALL_LETTER_L_WITH_ACUTE; - case 'L': return LATIN_CAPITAL_LETTER_L_WITH_ACUTE; - case 'n': return LATIN_SMALL_LETTER_N_WITH_ACUTE; - case 'N': return LATIN_CAPITAL_LETTER_N_WITH_ACUTE; - case 'o': return LATIN_SMALL_LETTER_O_WITH_ACUTE; - case 'O': return LATIN_CAPITAL_LETTER_O_WITH_ACUTE; - case '0': return LATIN_CAPITAL_LETTER_O_WITH_ACUTE; - case 'r': return LATIN_SMALL_LETTER_R_WITH_ACUTE; - case 'R': return LATIN_CAPITAL_LETTER_R_WITH_ACUTE; - case 's': return LATIN_SMALL_LETTER_S_WITH_ACUTE; - case 'S': return LATIN_CAPITAL_LETTER_S_WITH_ACUTE; - case 'u': return LATIN_SMALL_LETTER_U_WITH_ACUTE; - case 'U': return LATIN_CAPITAL_LETTER_U_WITH_ACUTE; - case 'y': return LATIN_SMALL_LETTER_Y_WITH_ACUTE; - case 'Y': return LATIN_CAPITAL_LETTER_Y_WITH_ACUTE; - case 'z': return LATIN_SMALL_LETTER_Z_WITH_ACUTE; - case 'Z': return LATIN_CAPITAL_LETTER_Z_WITH_ACUTE; - default: - if(warn)fprintf( stderr, " COMPOSE: ACUTE_ACCENT+%04x not defined\n",(int)main); - } - break; - - case BREVE: /* caron (latin2) "u"-above-... (small bow) */ - switch (main) { - /* FIXME write separate heuristics for breve */ - case 'a': return LATIN_SMALL_LETTER_A_WITH_BREVE; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_BREVE; - case 'e': return LATIN_SMALL_LETTER_E_WITH_BREVE; - case 'E': return LATIN_CAPITAL_LETTER_E_WITH_BREVE; - case 'g': return LATIN_SMALL_LETTER_G_WITH_BREVE; - case 'G': return LATIN_CAPITAL_LETTER_G_WITH_BREVE; - case 'i': return LATIN_SMALL_LETTER_I_WITH_BREVE; - case 'I': return LATIN_CAPITAL_LETTER_I_WITH_BREVE; - case 'o': return LATIN_SMALL_LETTER_O_WITH_BREVE; - case 'O': return LATIN_CAPITAL_LETTER_O_WITH_BREVE; - case 'u': return LATIN_SMALL_LETTER_U_WITH_BREVE; - case 'U': return LATIN_CAPITAL_LETTER_U_WITH_BREVE; - default: - if(warn)fprintf( stderr, " COMPOSE: BREVE+%04x not defined\n",(int)main); - } - break; - - case CARON: /* caron (latin2) "v"-above-... */ - switch (main) { - case 'a': return LATIN_SMALL_LETTER_A_WITH_CARON; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_CARON; - case 'c': return LATIN_SMALL_LETTER_C_WITH_CARON; - case 'C': return LATIN_CAPITAL_LETTER_C_WITH_CARON; - case 'e': return LATIN_SMALL_LETTER_E_WITH_CARON; - case 'E': return LATIN_CAPITAL_LETTER_E_WITH_CARON; - case 'i': return LATIN_SMALL_LETTER_I_WITH_CARON; - case 'I': return LATIN_CAPITAL_LETTER_I_WITH_CARON; - case 'o': return LATIN_SMALL_LETTER_O_WITH_CARON; - case 'O': return LATIN_CAPITAL_LETTER_O_WITH_CARON; - case '0': return LATIN_CAPITAL_LETTER_O_WITH_CARON; - case 's': return LATIN_SMALL_LETTER_S_WITH_CARON; - case 'S': return LATIN_CAPITAL_LETTER_S_WITH_CARON; - case 'u': return LATIN_SMALL_LETTER_U_WITH_CARON; - case 'U': return LATIN_CAPITAL_LETTER_U_WITH_CARON; - case 'z': return LATIN_SMALL_LETTER_Z_WITH_CARON; - case 'Z': return LATIN_CAPITAL_LETTER_Z_WITH_CARON; - default: - if(warn)fprintf( stderr, " COMPOSE: CARON+%04x not defined\n",(int)main); - } - break; - - case CEDILLA: - switch (main) { - case 'c': return LATIN_SMALL_LETTER_C_WITH_CEDILLA; - case 'C': return LATIN_CAPITAL_LETTER_C_WITH_CEDILLA; - default: - if(warn)fprintf( stderr, " COMPOSE: CEDILLA+%04x not defined\n",(int)main); - } - break; - - case TILDE: - switch (main) { - case 'a': return LATIN_SMALL_LETTER_A_WITH_TILDE; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_TILDE; - case 'i': return LATIN_SMALL_LETTER_I_WITH_TILDE; - case 'I': return LATIN_CAPITAL_LETTER_I_WITH_TILDE; - case 'n': return LATIN_SMALL_LETTER_N_WITH_TILDE; - case 'N': return LATIN_CAPITAL_LETTER_N_WITH_TILDE; - case 'o': return LATIN_SMALL_LETTER_O_WITH_TILDE; - case 'O': return LATIN_CAPITAL_LETTER_O_WITH_TILDE; - case '0': return LATIN_CAPITAL_LETTER_O_WITH_TILDE; - case 'u': return LATIN_SMALL_LETTER_U_WITH_TILDE; - case 'U': return LATIN_CAPITAL_LETTER_U_WITH_TILDE; - default: - if(warn)fprintf( stderr, " COMPOSE: TILDE+%04x not defined\n",(int)main); - } - break; - - case GRAVE_ACCENT: - switch (main) { - case 'a': return LATIN_SMALL_LETTER_A_WITH_GRAVE; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_GRAVE; - case 'e': return LATIN_SMALL_LETTER_E_WITH_GRAVE; - case 'E': return LATIN_CAPITAL_LETTER_E_WITH_GRAVE; - case 'i': return LATIN_SMALL_LETTER_I_WITH_GRAVE; - case 'I': return LATIN_CAPITAL_LETTER_I_WITH_GRAVE; - case 'n': return LATIN_SMALL_LETTER_N_WITH_GRAVE; - case 'N': return LATIN_CAPITAL_LETTER_N_WITH_GRAVE; - case 'o': return LATIN_SMALL_LETTER_O_WITH_GRAVE; - case 'O': return LATIN_CAPITAL_LETTER_O_WITH_GRAVE; - case '0': return LATIN_CAPITAL_LETTER_O_WITH_GRAVE; - case 'u': return LATIN_SMALL_LETTER_U_WITH_GRAVE; - case 'U': return LATIN_CAPITAL_LETTER_U_WITH_GRAVE; - default: - if(warn)fprintf( stderr, " COMPOSE: GRAVE_ACCENT+%04x not defined\n",(int)main); - } - break; - - case QUOTATION_MARK: /* do NOT USE this. It's here for compatibility only. - Use DIAERESIS instead. */ - fprintf( stderr, "COMPOSE: got APOSTROPHE instead of ACUTE_ACCENT"); - - case DIAERESIS: - switch (main) { - case 'a': return LATIN_SMALL_LETTER_A_WITH_DIAERESIS; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS; - case 'e': return LATIN_SMALL_LETTER_E_WITH_DIAERESIS; - case 'E': return LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS; - case 'i': return LATIN_SMALL_LETTER_I_WITH_DIAERESIS; - case 'I': return LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS; - case 'o': return LATIN_SMALL_LETTER_O_WITH_DIAERESIS; - case 'O': return LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS; - case '0': return LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS; - case 'u': return LATIN_SMALL_LETTER_U_WITH_DIAERESIS; - case 'U': return LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS; - case 'y': return LATIN_SMALL_LETTER_Y_WITH_DIAERESIS; - case 'Y': return LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS; - default: - if(warn)fprintf( stderr, " COMPOSE: DIAERESIS+%04x (%c) not defined\n",(int)main,(char)main); - } - break; - - case CIRCUMFLEX_ACCENT: /* ^ */ - switch (main) { - case 'a': return LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX; - case 'c': return LATIN_SMALL_LETTER_C_WITH_CIRCUMFLEX; - case 'C': return LATIN_CAPITAL_LETTER_C_WITH_CIRCUMFLEX; - case 'e': return LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX; - case 'E': return LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX; - case 'g': return LATIN_SMALL_LETTER_G_WITH_CIRCUMFLEX; - case 'G': return LATIN_CAPITAL_LETTER_G_WITH_CIRCUMFLEX; - case 'h': return LATIN_SMALL_LETTER_H_WITH_CIRCUMFLEX; - case 'H': return LATIN_CAPITAL_LETTER_H_WITH_CIRCUMFLEX; - case 'i': return LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX; - case 'I': return LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX; - case 'j': return LATIN_SMALL_LETTER_J_WITH_CIRCUMFLEX; - case 'J': return LATIN_CAPITAL_LETTER_J_WITH_CIRCUMFLEX; - case 'o': return LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX; - case 'O': return LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX; - case '0': return LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX; - case 's': return LATIN_SMALL_LETTER_S_WITH_CIRCUMFLEX; - case 'S': return LATIN_CAPITAL_LETTER_S_WITH_CIRCUMFLEX; - case 'u': return LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX; - case 'U': return LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX; - case 'w': return LATIN_SMALL_LETTER_W_WITH_CIRCUMFLEX; - case 'W': return LATIN_CAPITAL_LETTER_W_WITH_CIRCUMFLEX; - case 'y': return LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX; - case 'Y': return LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX; - default: - if(warn)fprintf( stderr, " COMPOSE: CIRCUMFLEX_ACCENT+%04x not defined\n",(int)main); - } - break; - - case MACRON: /* a minus sign above the char (latin2) */ - switch (main) { - case 'a': return LATIN_SMALL_LETTER_A_WITH_MACRON; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_MACRON; - case 'e': return LATIN_SMALL_LETTER_E_WITH_MACRON; - case 'E': return LATIN_CAPITAL_LETTER_E_WITH_MACRON; - case 'i': return LATIN_SMALL_LETTER_I_WITH_MACRON; - case 'I': return LATIN_CAPITAL_LETTER_I_WITH_MACRON; - case 'o': return LATIN_SMALL_LETTER_O_WITH_MACRON; - case 'O': return LATIN_CAPITAL_LETTER_O_WITH_MACRON; - case 'u': return LATIN_SMALL_LETTER_U_WITH_MACRON; - case 'U': return LATIN_CAPITAL_LETTER_U_WITH_MACRON; - case 'y': return LATIN_SMALL_LETTER_Y_WITH_MACRON; - case 'Y': return LATIN_CAPITAL_LETTER_Y_WITH_MACRON; - case LATIN_SMALL_LETTER_AE: return LATIN_SMALL_LETTER_AE_WITH_MACRON; - case LATIN_CAPITAL_LETTER_AE: return LATIN_CAPITAL_LETTER_AE_WITH_MACRON; - case '=': return IDENTICAL_TO; - case '-': return '='; - case ' ': return MODIFIER_LETTER_MACRON; - default: - if(warn)fprintf( stderr, " COMPOSE: MACRON+%04x not defined\n",(int)main); - } - break; - - case DOT_ABOVE: /* latin2 */ - switch (main) { - case 'a': return LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE; - case 'c': return LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE; - case 'C': return LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE; - case 'e': return LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE; - case 'E': return LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE; - case 'g': return LATIN_SMALL_LETTER_G_WITH_DOT_ABOVE; - case 'G': return LATIN_CAPITAL_LETTER_G_WITH_DOT_ABOVE; - case 'l': return 'i'; /* correct wrong recognition */ - case 'i': return 'i'; - case LATIN_SMALL_LETTER_DOTLESS_I: return 'i'; - case 'I': return LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE; - case 'j': return 'j'; - case 'o': return LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE; - case 'O': return LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE; - case 'z': return LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE; - case 'Z': return LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE; - case ',': return ';'; - case '.': return ':'; - default: - if(warn)fprintf( stderr, " COMPOSE: DOT_ABOVE+%04x not defined\n",(int)main); - } - break; - - case RING_ABOVE: - switch (main) { - case 'a': return LATIN_SMALL_LETTER_A_WITH_RING_ABOVE; - case 'A': return LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE; - case 'u': return LATIN_SMALL_LETTER_U_WITH_RING_ABOVE; - case 'U': return LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE; - default: - if(warn)fprintf( stderr, " COMPOSE: RING_ABOVE+%04x not defined\n",(int)main); - } - break; - - case 'e': /* e ligatures: ae, oe. */ - case 'E': - switch (main) { - case 'a': return LATIN_SMALL_LETTER_AE; - case 'A': return LATIN_CAPITAL_LETTER_AE; - case 'o': return LATIN_SMALL_LIGATURE_OE; - case 'O': return LATIN_CAPITAL_LIGATURE_OE; - case '0': return LATIN_CAPITAL_LIGATURE_OE; - default: - if(warn)fprintf( stderr, " COMPOSE: %04x+e/E not defined\n",(int)main); - } - break; - - case 'g': /* greek */ - switch (main) { - /* missing 0x37A-0x390 */ - /* weird cases: Q -> theta (it resembles a little, doesn't it?) - V -> psi (what can I do?) */ - case 'A': return GREEK_CAPITAL_LETTER_ALPHA; - case 'B': return GREEK_CAPITAL_LETTER_BETA; - case 'G': return GREEK_CAPITAL_LETTER_GAMMA; - case 'D': return GREEK_CAPITAL_LETTER_DELTA; - case 'E': return GREEK_CAPITAL_LETTER_EPSILON; - case 'Z': return GREEK_CAPITAL_LETTER_ZETA; - case 'H': return GREEK_CAPITAL_LETTER_ETA; - case 'Q': return GREEK_CAPITAL_LETTER_THETA; - case 'I': return GREEK_CAPITAL_LETTER_IOTA; - case 'K': return GREEK_CAPITAL_LETTER_KAPPA; - case 'L': return GREEK_CAPITAL_LETTER_LAMDA; - case 'M': return GREEK_CAPITAL_LETTER_MU; - case 'N': return GREEK_CAPITAL_LETTER_NU; - case 'X': return GREEK_CAPITAL_LETTER_XI; - case 'O': return GREEK_CAPITAL_LETTER_OMICRON; - case 'P': return GREEK_CAPITAL_LETTER_PI; - case 'R': return GREEK_CAPITAL_LETTER_RHO; - case 'S': return GREEK_CAPITAL_LETTER_SIGMA; - case 'T': return GREEK_CAPITAL_LETTER_TAU; - case 'Y': return GREEK_CAPITAL_LETTER_UPSILON; - case 'F': return GREEK_CAPITAL_LETTER_PHI; - case 'C': return GREEK_CAPITAL_LETTER_CHI; - case 'V': return GREEK_CAPITAL_LETTER_PSI; - case 'W': return GREEK_CAPITAL_LETTER_OMEGA; -/* - case '': return GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA; - case '': return GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA; - case '': return GREEK_SMALL_LETTER_ALPHA_WITH_TONOS; - case '': return GREEK_SMALL_LETTER_EPSILON_WITH_TONOS; - case '': return GREEK_SMALL_LETTER_ETA_WITH_TONOS; - case '': return GREEK_SMALL_LETTER_IOTA_WITH_TONOS; - case '': return GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS; -*/ - case 'a': return GREEK_SMALL_LETTER_ALPHA; - case 'b': return GREEK_SMALL_LETTER_BETA; - case 'g': return GREEK_SMALL_LETTER_GAMMA; - case 'd': return GREEK_SMALL_LETTER_DELTA; - case 'e': return GREEK_SMALL_LETTER_EPSILON; - case 'z': return GREEK_SMALL_LETTER_ZETA; - case 'h': return GREEK_SMALL_LETTER_ETA; - case 'q': return GREEK_SMALL_LETTER_THETA; - case 'i': return GREEK_SMALL_LETTER_IOTA; - case 'k': return GREEK_SMALL_LETTER_KAPPA; - case 'l': return GREEK_SMALL_LETTER_LAMDA; - case 'm': return GREEK_SMALL_LETTER_MU; - case 'n': return GREEK_SMALL_LETTER_NU; - case 'x': return GREEK_SMALL_LETTER_XI; - case 'o': return GREEK_SMALL_LETTER_OMICRON; - case 'p': return GREEK_SMALL_LETTER_PI; - case 'r': return GREEK_SMALL_LETTER_RHO; - case '&': return GREEK_SMALL_LETTER_FINAL_SIGMA; - case 's': return GREEK_SMALL_LETTER_SIGMA; - case 't': return GREEK_SMALL_LETTER_TAU; - case 'y': return GREEK_SMALL_LETTER_UPSILON; - case 'f': return GREEK_SMALL_LETTER_PHI; - case 'c': return GREEK_SMALL_LETTER_CHI; - case 'v': return GREEK_SMALL_LETTER_PSI; - case 'w': return GREEK_SMALL_LETTER_OMEGA; -/* - case '': return GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA; - case '': return GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA; - case '': return GREEK_SMALL_LETTER_OMICRON_WITH_TONOS; - case '': return GREEK_SMALL_LETTER_UPSILON_WITH_TONOS; - case '': return GREEK_SMALL_LETTER_OMEGA_WITH_TONOS; - case '': return GREEK_BETA_SYMBOL; - case '': return GREEK_THETA_SYMBOL; - case '': return GREEK_UPSILON_WITH_HOOK_SYMBOL; - case '': return GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL; - case '': return GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL; - case '': return GREEK_PHI_SYMBOL; - case '': return GREEK_PI_SYMBOL; -*/ - default: - if(warn)fprintf( stderr, " COMPOSE: GREEK %04x not defined\n",(int)main); - } - break; - - default: - fprintf( stderr, " COMPOSE: modifier %04x not defined\n",(int)modifier); - } - return (wchar_t)main; -} - -#define UNDEFINED "~" - -/* Arguments: character in Unicode format, type of format to convert to. - Returns: a string containing the Unicode character converted to the chosen - format. This string is statically allocated and should not be freed. - ToDo: better using tables? - */ -const char *decode(wchar_t c, FORMAT type) { - /* static char d; --- js: big bug (missing \0) if &d returned */ - /*FIXME jb static*/ static char bbuf[8*32]; /* space for 8 buffers, rotating */ - /*FIXME jb static*/ static char *buf=bbuf; /* used for UTF8 sequences and undefined codes */ - buf+=32; if(buf>=bbuf+8*32) buf=bbuf; - buf[0]=buf[1]=buf[2]=0; - switch (type) { - case ISO8859_1: - if ( c <= 0xFF ) { /* UNICODE == ISO8859-1 */ - buf[0] = (char)c; - return buf; - } - switch (c) { /* not found in list, but perhaps we can describe it */ - /* todo: add greek. GREEK_SMALL_LETTER_ALPHA = alpha */ - - /* general puctuation */ - case HYPHEN: - return (const char *)"-"; - case FIGURE_DASH: - case EN_DASH: - return (const char *)"--"; - case EM_DASH: - return (const char *)"---"; - case LEFT_SINGLE_QUOTATION_MARK: - return (const char *)"`"; - case RIGHT_SINGLE_QUOTATION_MARK: - return (const char *)"'"; - case SINGLE_LOW_9_QUOTATION_MARK: - return (const char *)","; - case SINGLE_HIGH_REVERSED_9_QUOTATION_MARK: - return (const char *)UNDEFINED; - case LEFT_DOUBLE_QUOTATION_MARK: - return (const char *)"``"; - case RIGHT_DOUBLE_QUOTATION_MARK: - return (const char *)"''"; - case DOUBLE_LOW_9_QUOTATION_MARK: - return (const char *)",,"; - case DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK: - return (const char *)UNDEFINED; - case DAGGER: - return (const char *)"+"; - case DOUBLE_DAGGER: - return (const char *)"*"; - case BULLET: - return (const char *)"*"; - case TRIANGULAR_BULLET: - return (const char *)"*"; - case HYPHENATION_POINT: - return (const char *)"-"; - case HORIZONTAL_ELLIPSIS: - return (const char *)"..."; - case PER_MILLE_SIGN: - return (const char *)"%%"; /* awk! */ - case SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK: - return (const char *)"<"; - case SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK: - return (const char *)">"; - case EURO_CURRENCY_SIGN: - return (const char *)"EUR"; /* change it! */ - - /* ligatures */ - case LATIN_SMALL_LIGATURE_FF: - return (const char *)"ff"; - case LATIN_SMALL_LIGATURE_FI: - return (const char *)"fi"; - case LATIN_SMALL_LIGATURE_FL: - return (const char *)"fl"; - case LATIN_SMALL_LIGATURE_FFI: - return (const char *)"ffi"; - case LATIN_SMALL_LIGATURE_FFL: - return (const char *)"ffl"; - case LATIN_SMALL_LIGATURE_LONG_S_T: - case LATIN_SMALL_LIGATURE_ST: - return (const char *)"st"; - - /* extra */ - case UNKNOWN: - return (const char *)"_"; - case PICTURE: - return (const char *)"_"; /* Due to Mobile OCR */ - - default: - /* snprintf seems to be no standard, so I use insecure sprintf */ - sprintf(buf,"\\code(%04x)",(unsigned)c); - return buf; /* UNDEFINED; */ - } - break; - case TeX: - if ( c >= SPACE && c <= TILDE ) { /* ASCII */ - switch (c) { - case '$': - return (const char *)"\\$"; - case '&': - return (const char *)"\\&"; - case '%': - return (const char *)"\\%"; - case '#': - return (const char *)"\\#"; - case '_': - return (const char *)"\\_"; - case '{': - return (const char *)"\\{"; - case '}': - return (const char *)"\\}"; - case '\\': - return (const char *)"$\\backslash$"; - case '~': - return (const char *)"\\~{}"; - case '^': - return (const char *)"\\^{}"; - default: - buf[0] = (char)c; - return (const char *)buf; - } - } - switch (c) { - /* ISO8859_1 */ - case NO_BREAK_SPACE: - return (const char *)"~"; - case INVERTED_EXCLAMATION_MARK: - return (const char *)"!'"; - case CENT_SIGN: - return (const char *)"\\textcent"; /* \usepackage{textcomp} */ - case POUND_SIGN: - return (const char *)"\\pounds"; - case EURO_CURRENCY_SIGN: - return (const char *)"\\euro"; /* \usepackage{eurosans} */ - case CURRENCY_SIGN: - return (const char *)"\\textcurrency"; /* \usepackage{textcomp} */ - case YEN_SIGN: - return (const char *)"\\textyen"; /* \usepackage{textcomp} */ - case BROKEN_BAR: - return (const char *)"\\textbrokenbar"; /* \usepackage{textcomp} */ - case SECTION_SIGN: - return (const char *)"\\S"; - case DIAERESIS: - return (const char *)"\""; - case COPYRIGHT_SIGN: - return (const char *)"\\copyright"; - case FEMININE_ORDINAL_INDICATOR: - return (const char *)"$^{\\underbar{a}}$"; - case LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK: - return (const char *)"\\flqq{}"; - case NOT_SIGN: - return (const char *)"$\\lnot$"; - case SOFT_HYPHEN: - return (const char *)"\\-"; - case REGISTERED_SIGN: - return (const char *)"\\textregistered";/* \usepackage{textcomp} */ - case MACRON: - return (const char *)"\\textasciimacron";/* \usepackage{textcomp} */ - case DEGREE_SIGN: - return (const char *)"$^{o}$"; - case PLUS_MINUS_SIGN: - return (const char *)"$\\pm$"; - case SUPERSCRIPT_TWO: - return (const char *)"$^{2}$"; - case SUPERSCRIPT_THREE: - return (const char *)"$^{3}$"; - case ACUTE_ACCENT: - return (const char *)"\\( \\prime \\)"; - case MICRO_SIGN: - return (const char *)"$\\mu$"; - case PILCROW_SIGN: - return (const char *)"\\P"; - case MIDDLE_DOT: - return (const char *)"$\\cdot$"; - case CEDILLA: - return (const char *)"\\,"; - case SUPERSCRIPT_ONE: - return (const char *)"$^{1}$"; - case MASCULINE_ORDINAL_INDICATOR: - return (const char *)"$^{\\underbar{o}}$"; - case RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK: - return (const char *)"\\frqq{}"; - case VULGAR_FRACTION_ONE_QUARTER: /* these fractions are not good*/ - return (const char *)"\\( 1\\over 4 \\)"; - case VULGAR_FRACTION_ONE_HALF: - return (const char *)"\\( 1\\over 2 \\)"; - case VULGAR_FRACTION_THREE_QUARTERS: - return (const char *)"\\( 3\\over 4 \\)"; - case INVERTED_QUESTION_MARK: - return (const char *)"?'"; - case LATIN_CAPITAL_LETTER_A_WITH_GRAVE: - return (const char *)"\\`A"; - case LATIN_CAPITAL_LETTER_A_WITH_ACUTE: - return (const char *)"\\'A"; - case LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX: - return (const char *)"\\^A"; - case LATIN_CAPITAL_LETTER_A_WITH_TILDE: - return (const char *)"\\~A"; - case LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS: - return (const char *)"\\\"A"; - case LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE: - return (const char *)"\\AA"; - case LATIN_CAPITAL_LETTER_AE: - return (const char *)"\\AE"; - case LATIN_CAPITAL_LETTER_C_WITH_CARON: - return (const char *)"\\v{C}"; - case LATIN_CAPITAL_LETTER_C_WITH_CEDILLA: - return (const char *)"\\C"; - case LATIN_CAPITAL_LETTER_E_WITH_GRAVE: - return (const char *)"\\`E"; - case LATIN_CAPITAL_LETTER_E_WITH_ACUTE: - return (const char *)"\\'E"; - case LATIN_CAPITAL_LETTER_E_WITH_CARON: - return (const char *)"\\v{E}"; - case LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX: - return (const char *)"\\^E"; - case LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS: - return (const char *)"\\\"E"; - case LATIN_CAPITAL_LETTER_I_WITH_GRAVE: - return (const char *)"\\`I"; - case LATIN_CAPITAL_LETTER_I_WITH_ACUTE: - return (const char *)"\\'I"; - case LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX: - return (const char *)"\\^I"; - case LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS: - return (const char *)"\\\"I"; - case LATIN_CAPITAL_LETTER_ETH: - return (const char *)UNDEFINED; - case LATIN_CAPITAL_LETTER_N_WITH_TILDE: - return (const char *)"\\~N"; - case LATIN_CAPITAL_LETTER_O_WITH_GRAVE: - return (const char *)"\\`O"; - case LATIN_CAPITAL_LETTER_O_WITH_ACUTE: - return (const char *)"\\'O"; - case LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX: - return (const char *)"\\^O"; - case LATIN_CAPITAL_LETTER_O_WITH_TILDE: - return (const char *)"\\~O"; - case LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS: - return (const char *)"\\\"O"; - case MULTIPLICATION_SIGN: - return (const char *)"$\\times$"; - case LATIN_CAPITAL_LETTER_O_WITH_STROKE: - return (const char *)"\\O"; - case LATIN_CAPITAL_LETTER_S_WITH_CARON: - return (const char *)"\\v{S}"; - case LATIN_CAPITAL_LETTER_U_WITH_GRAVE: - return (const char *)"\\`U"; - case LATIN_CAPITAL_LETTER_U_WITH_ACUTE: - return (const char *)"\\'U"; - case LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX: - return (const char *)"\\^U"; - case LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS: - return (const char *)"\\\"U"; - case LATIN_CAPITAL_LETTER_Y_WITH_ACUTE: - return (const char *)"\\'Y"; - case LATIN_CAPITAL_LETTER_Z_WITH_CARON: - return (const char *)"\\v{Z}"; - case LATIN_CAPITAL_LETTER_THORN: - return (const char *)UNDEFINED; - case LATIN_SMALL_LETTER_SHARP_S: - return (const char *)"\\ss"; - case LATIN_SMALL_LETTER_A_WITH_GRAVE: - return (const char *)"\\`a"; - case LATIN_SMALL_LETTER_A_WITH_ACUTE: - return (const char *)"\\'a"; - case LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX: - return (const char *)"\\^a"; - case LATIN_SMALL_LETTER_A_WITH_TILDE: - return (const char *)"\\~a"; - case LATIN_SMALL_LETTER_A_WITH_DIAERESIS: - return (const char *)"\\\"a"; - case LATIN_SMALL_LETTER_A_WITH_RING_ABOVE: - return (const char *)"\\aa"; - case LATIN_SMALL_LETTER_AE: - return (const char *)"\\ae"; - case LATIN_SMALL_LETTER_C_WITH_CARON: - return (const char *)"\\v{c}"; - case LATIN_SMALL_LETTER_C_WITH_CEDILLA: - return (const char *)"\\c"; - case LATIN_SMALL_LETTER_E_WITH_GRAVE: - return (const char *)"\\`e"; - case LATIN_SMALL_LETTER_E_WITH_ACUTE: - return (const char *)"\\'e"; - case LATIN_SMALL_LETTER_E_WITH_CARON: - return (const char *)"\\v{e}"; - case LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX: - return (const char *)"\\^e"; - case LATIN_SMALL_LETTER_E_WITH_DIAERESIS: - return (const char *)"\\\"e"; - case LATIN_SMALL_LETTER_I_WITH_GRAVE: - return (const char *)"\\`i"; - case LATIN_SMALL_LETTER_I_WITH_ACUTE: - return (const char *)"\\'i"; - case LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX: - return (const char *)"\\^i"; - case LATIN_SMALL_LETTER_I_WITH_DIAERESIS: - return (const char *)"\\\"i"; - case LATIN_SMALL_LETTER_ETH: - return (const char *)UNDEFINED; - case LATIN_SMALL_LETTER_N_WITH_TILDE: - return (const char *)"\\~n"; - case LATIN_SMALL_LETTER_O_WITH_GRAVE: - return (const char *)"\\`o"; - case LATIN_SMALL_LETTER_O_WITH_ACUTE: - return (const char *)"\\'o"; - case LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX: - return (const char *)"\\^o"; - case LATIN_SMALL_LETTER_O_WITH_TILDE: - return (const char *)"\\~o"; - case LATIN_SMALL_LETTER_O_WITH_DIAERESIS: - return (const char *)"\\\"o"; - case DIVISION_SIGN: - return (const char *)"$\\div$"; - case LATIN_SMALL_LETTER_O_WITH_STROKE: - return (const char *)"\\o"; - case LATIN_SMALL_LETTER_S_WITH_CARON: - return (const char *)"\\v{s}"; - case LATIN_SMALL_LETTER_U_WITH_GRAVE: - return (const char *)"\\`u"; - case LATIN_SMALL_LETTER_U_WITH_ACUTE: - return (const char *)"\\'u"; - case LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX: - return (const char *)"\\^u"; - case LATIN_SMALL_LETTER_U_WITH_DIAERESIS: - return (const char *)"\\\"u"; - case LATIN_SMALL_LETTER_Y_WITH_ACUTE: - return (const char *)"\\'y"; - case LATIN_SMALL_LETTER_THORN: - return (const char *)UNDEFINED; - case LATIN_SMALL_LETTER_Y_WITH_DIAERESIS: - return (const char *)"\\\"y"; - case LATIN_SMALL_LETTER_Z_WITH_CARON: - return (const char *)"\\v{z}"; - - /* greek */ - /* some (punctuation, accents, accented capital) greek letters missing*/ - case GREEK_CAPITAL_LETTER_ALPHA: - return (const char *)"A"; - case GREEK_CAPITAL_LETTER_BETA: - return (const char *)"B"; - case GREEK_CAPITAL_LETTER_GAMMA: - return (const char *)"\\( \\Gamma \\)"; - case GREEK_CAPITAL_LETTER_DELTA: - return (const char *)"\\( \\Delta \\)"; - case GREEK_CAPITAL_LETTER_EPSILON: - return (const char *)"E"; - case GREEK_CAPITAL_LETTER_ZETA: - return (const char *)"Z"; - case GREEK_CAPITAL_LETTER_ETA: - return (const char *)"H"; - case GREEK_CAPITAL_LETTER_THETA: - return (const char *)"\\( \\Theta \\)"; - case GREEK_CAPITAL_LETTER_IOTA: - return (const char *)"I"; - case GREEK_CAPITAL_LETTER_KAPPA: - return (const char *)"K"; - case GREEK_CAPITAL_LETTER_LAMDA: - return (const char *)"\\( \\Lambda \\)"; - case GREEK_CAPITAL_LETTER_MU: - return (const char *)"M"; - case GREEK_CAPITAL_LETTER_NU: - return (const char *)"N"; - case GREEK_CAPITAL_LETTER_XI: - return (const char *)"\\( \\Xi \\)"; - case GREEK_CAPITAL_LETTER_OMICRON: - return (const char *)"O"; - case GREEK_CAPITAL_LETTER_PI: - return (const char *)"\\( \\Pi \\)"; - case GREEK_CAPITAL_LETTER_RHO: - return (const char *)"P"; - case GREEK_CAPITAL_LETTER_SIGMA: - return (const char *)"\\( \\Sigma \\)"; - case GREEK_CAPITAL_LETTER_TAU: - return (const char *)"T"; - case GREEK_CAPITAL_LETTER_UPSILON: - return (const char *)"\\( \\Upsilon \\)"; - case GREEK_CAPITAL_LETTER_PHI: - return (const char *)"\\( \\Phi \\)"; - case GREEK_CAPITAL_LETTER_CHI: - return (const char *)"\\( \\Chi \\)"; - case GREEK_CAPITAL_LETTER_PSI: - return (const char *)"\\( \\Psi \\)"; - case GREEK_CAPITAL_LETTER_OMEGA: - return (const char *)"\\( \\Omega \\)"; - case GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA: - return (const char *)UNDEFINED; - case GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_ALPHA_WITH_TONOS: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_EPSILON_WITH_TONOS: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_ETA_WITH_TONOS: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_IOTA_WITH_TONOS: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_ALPHA: - return (const char *)"\\( \\alpha \\)"; - case GREEK_SMALL_LETTER_BETA: - return (const char *)"\\( \\beta \\)"; - case GREEK_SMALL_LETTER_GAMMA: - return (const char *)"\\( \\gamma \\)"; - case GREEK_SMALL_LETTER_DELTA: - return (const char *)"\\( \\delta \\)"; - case GREEK_SMALL_LETTER_EPSILON: - return (const char *)"\\( \\epsilon \\)"; - case GREEK_SMALL_LETTER_ZETA: - return (const char *)"\\( \\zeta \\)"; - case GREEK_SMALL_LETTER_ETA: - return (const char *)"\\( \\eta \\)"; - case GREEK_SMALL_LETTER_THETA: - return (const char *)"\\( \\theta \\)"; - case GREEK_SMALL_LETTER_IOTA: - return (const char *)"\\( \\iota \\)"; - case GREEK_SMALL_LETTER_KAPPA: - return (const char *)"\\( \\kappa \\)"; - case GREEK_SMALL_LETTER_LAMDA: - return (const char *)"\\( \\lambda \\)"; - case GREEK_SMALL_LETTER_MU: - return (const char *)"\\( \\mu \\)"; - case GREEK_SMALL_LETTER_NU: - return (const char *)"\\( \\nu \\)"; - case GREEK_SMALL_LETTER_XI: - return (const char *)"\\( \\xi \\)"; - case GREEK_SMALL_LETTER_OMICRON: - return (const char *)"\\( \\omicron \\)"; - case GREEK_SMALL_LETTER_PI: - return (const char *)"\\( \\pi \\)"; - case GREEK_SMALL_LETTER_RHO: - return (const char *)"\\( \\rho \\)"; - case GREEK_SMALL_LETTER_FINAL_SIGMA: - return (const char *)"\\( \\varsigma \\)"; - case GREEK_SMALL_LETTER_SIGMA: - return (const char *)"\\( \\sigma \\)"; - case GREEK_SMALL_LETTER_TAU: - return (const char *)"\\( \\tau \\)"; - case GREEK_SMALL_LETTER_UPSILON: - return (const char *)"\\( \\upsilon \\)"; - case GREEK_SMALL_LETTER_PHI: - return (const char *)"\\( \\varphi \\)"; - case GREEK_SMALL_LETTER_CHI: - return (const char *)"\\( \\chi \\)"; - case GREEK_SMALL_LETTER_PSI: - return (const char *)"\\( \\psi \\)"; - case GREEK_SMALL_LETTER_OMEGA: - return (const char *)"\\( \\omega \\)"; - case GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_OMICRON_WITH_TONOS: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_UPSILON_WITH_TONOS: - return (const char *)UNDEFINED; - case GREEK_SMALL_LETTER_OMEGA_WITH_TONOS: - return (const char *)UNDEFINED; - case GREEK_BETA_SYMBOL: - return (const char *)UNDEFINED; - case GREEK_THETA_SYMBOL: - return (const char *)"\\( \\vartheta \\)"; - case GREEK_UPSILON_WITH_HOOK_SYMBOL: - return (const char *)UNDEFINED; - case GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL: - return (const char *)UNDEFINED; - case GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL: - return (const char *)UNDEFINED; - case GREEK_PHI_SYMBOL: - return (const char *)"\\( \\phi \\)"; - case GREEK_PI_SYMBOL: - return (const char *)"\\( \\varpi \\)"; - /* and some greek letters missing*/ - - /* punctuation (partial) */ - case HYPHEN: - return (const char *)"-"; - case NON_BREAKING_HYPHEN: - return (const char *)UNDEFINED; - case FIGURE_DASH: - case EN_DASH: - return (const char *)"--"; - case EM_DASH: - return (const char *)"---"; - case HORIZONTAL_BAR: - return (const char *)UNDEFINED; - case LEFT_SINGLE_QUOTATION_MARK: - return (const char *)"`"; - case RIGHT_SINGLE_QUOTATION_MARK: - return (const char *)"'"; - case SINGLE_LOW_9_QUOTATION_MARK: - return (const char *)"\\glq{}"; - case SINGLE_HIGH_REVERSED_9_QUOTATION_MARK: - return (const char *)UNDEFINED; - case LEFT_DOUBLE_QUOTATION_MARK: - return (const char *)"``"; - case RIGHT_DOUBLE_QUOTATION_MARK: - return (const char *)"''"; - case DOUBLE_LOW_9_QUOTATION_MARK: - return (const char *)"\\glqq{}"; - case DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK: - return (const char *)UNDEFINED; - case DAGGER: - return (const char *)"\\dag"; - case DOUBLE_DAGGER: - return (const char *)"\\ddag"; - case BULLET: - return (const char *)"$\\bullet$"; - case TRIANGULAR_BULLET: - return (const char *)"$\\blacktriangleright"; - case HYPHENATION_POINT: - return (const char *)"\\-"; - case HORIZONTAL_ELLIPSIS: - return (const char *)"\\ldots"; - case PER_MILLE_SIGN: - return (const char *)UNDEFINED; - case SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK: - return (const char *)"\\flq{}"; - case SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK: - return (const char *)"\\frq{}"; - /* ligatures */ - case LATIN_SMALL_LIGATURE_FF: - return (const char *)"ff"; - case LATIN_SMALL_LIGATURE_FI: - return (const char *)"fi"; - case LATIN_SMALL_LIGATURE_FL: - return (const char *)"fl"; - case LATIN_SMALL_LIGATURE_FFI: - return (const char *)"ffi"; - case LATIN_SMALL_LIGATURE_FFL: - return (const char *)"ffl"; - case LATIN_SMALL_LIGATURE_LONG_S_T: - case LATIN_SMALL_LIGATURE_ST: - return (const char *)"st"; - /* reserved */ - case 0: - return (const char *)""; - case UNKNOWN: - return (const char *)"\\_"; - case PICTURE: - return (const char *)"(PICTURE)"; - default: - /* snprintf seems to be no standard, so I use insecure sprintf */ - sprintf(buf,"\\symbol{%u}",(unsigned)c); - return buf; /* UNDEFINED; */ - } - case HTML: - if ( c >= SPACE && c <= TILDE ) { /* ASCII */ - switch (c) { - case '&': - return (const char *)"&"; - /* semicolon must not be coded */ - case '\'': - return (const char *)"'"; - case '"': - return (const char *)"""; - case '<': - return (const char *)"<"; - case '>': - return (const char *)">"; - } - buf[0] = (char)c; - return buf; - } - switch (c) { - case PICTURE: - return (const char *)""; - case UNKNOWN: - return (const char *)"_"; /* better use colored symbol? */ - case LINE_FEED: - return (const char *)"
"; /* \n handled somwhere else? */ - case FORM_FEED: - case CARRIAGE_RETURN: - return (const char *)"
"; - case NO_BREAK_SPACE: - return (const char *)""; - case INVERTED_EXCLAMATION_MARK: - return (const char *)"¡"; - case CENT_SIGN: - return (const char *)"¢"; - case POUND_SIGN: - return (const char *)"£"; - case CURRENCY_SIGN: - return (const char *)"¤"; - case YEN_SIGN: - return (const char *)"¥"; - case BROKEN_BAR: - return (const char *)"¦"; - case SECTION_SIGN: - return (const char *)"§"; - case DIAERESIS: - return (const char *)"¨"; - case COPYRIGHT_SIGN: - return (const char *)"©"; - case FEMININE_ORDINAL_INDICATOR: - return (const char *)"ªem;"; - case LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK: - return (const char *)"«"; - case NOT_SIGN: - return (const char *)"¬"; - case SOFT_HYPHEN: - return (const char *)"­"; - case REGISTERED_SIGN: - return (const char *)"®"; - case MACRON: - return (const char *)"¯"; - case DEGREE_SIGN: - return (const char *)"°"; - case PLUS_MINUS_SIGN: - return (const char *)"±"; - case SUPERSCRIPT_TWO: - return (const char *)"²"; - case SUPERSCRIPT_THREE: - return (const char *)"³"; - case ACUTE_ACCENT: - return (const char *)"´"; - case MICRO_SIGN: - return (const char *)"µ"; - case PILCROW_SIGN: - return (const char *)"¶"; - case MIDDLE_DOT: - return (const char *)"·"; - case CEDILLA: - return (const char *)"¸"; - case SUPERSCRIPT_ONE: - return (const char *)"¹"; - case MASCULINE_ORDINAL_INDICATOR: - return (const char *)"º"; - case RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK: - return (const char *)"»"; - case VULGAR_FRACTION_ONE_QUARTER: - return (const char *)"¼"; - case VULGAR_FRACTION_ONE_HALF: - return (const char *)"½"; - case VULGAR_FRACTION_THREE_QUARTERS: - return (const char *)"¾"; - case INVERTED_QUESTION_MARK: - return (const char *)"¿"; - case LATIN_CAPITAL_LETTER_A_WITH_GRAVE: - return (const char *)"À"; - case LATIN_CAPITAL_LETTER_A_WITH_ACUTE: - return (const char *)"Á"; - case LATIN_CAPITAL_LETTER_A_WITH_BREVE: - return (const char *)"Ă"; - case LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX: - return (const char *)"Â"; - case LATIN_CAPITAL_LETTER_A_WITH_TILDE: - return (const char *)"Ã"; - case LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS: - return (const char *)"Ä"; - case LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE: - return (const char *)"Å"; - case LATIN_CAPITAL_LETTER_AE: - return (const char *)"Æ"; - case LATIN_CAPITAL_LETTER_C_WITH_CARON: - return (const char *)"Č"; - case LATIN_CAPITAL_LETTER_C_WITH_CEDILLA: - return (const char *)"Ç"; - case LATIN_CAPITAL_LETTER_E_WITH_GRAVE: - return (const char *)"È"; - case LATIN_CAPITAL_LETTER_E_WITH_ACUTE: - return (const char *)"É"; - case LATIN_CAPITAL_LETTER_E_WITH_CARON: - return (const char *)"Ě"; - case LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX: - return (const char *)"Ê"; - case LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS: - return (const char *)"Ë"; - case LATIN_CAPITAL_LETTER_I_WITH_GRAVE: - return (const char *)"Ì"; - case LATIN_CAPITAL_LETTER_I_WITH_ACUTE: - return (const char *)"Í"; - case LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX: - return (const char *)"Î"; - case LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS: - return (const char *)"Ï"; - case LATIN_CAPITAL_LETTER_ETH: - return (const char *)"Ð"; - case LATIN_CAPITAL_LETTER_N_WITH_TILDE: - return (const char *)"Ñ"; - case LATIN_CAPITAL_LETTER_O_WITH_GRAVE: - return (const char *)"Ò"; - case LATIN_CAPITAL_LETTER_O_WITH_ACUTE: - return (const char *)"Ó"; - case LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX: - return (const char *)"Ô"; - case LATIN_CAPITAL_LETTER_O_WITH_TILDE: - return (const char *)"Õ"; - case LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS: - return (const char *)"Ö"; - case MULTIPLICATION_SIGN: - return (const char *)"×"; - case LATIN_CAPITAL_LETTER_O_WITH_STROKE: - return (const char *)"Ø"; - case LATIN_CAPITAL_LETTER_S_WITH_CARON: - return (const char *)"Š"; - case LATIN_CAPITAL_LETTER_U_WITH_GRAVE: - return (const char *)"Ù"; - case LATIN_CAPITAL_LETTER_U_WITH_ACUTE: - return (const char *)"Ú"; - case LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX: - return (const char *)"Û"; - case LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS: - return (const char *)"Ü"; - case LATIN_CAPITAL_LETTER_Y_WITH_ACUTE: - return (const char *)"Ý"; - case LATIN_CAPITAL_LETTER_Z_WITH_CARON: - return (const char *)"Ž"; - case LATIN_CAPITAL_LETTER_THORN: - return (const char *)"Þ"; - case LATIN_SMALL_LETTER_SHARP_S: - return (const char *)"ß"; - case LATIN_SMALL_LETTER_A_WITH_GRAVE: - return (const char *)"à"; - case LATIN_SMALL_LETTER_A_WITH_ACUTE: - return (const char *)"á"; - case LATIN_SMALL_LETTER_A_WITH_BREVE: - return (const char *)"ă"; - case LATIN_SMALL_LETTER_A_WITH_CARON: - return (const char *)"&acaron;"; - case LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX: - return (const char *)"â"; - case LATIN_SMALL_LETTER_A_WITH_TILDE: - return (const char *)"ã"; - case LATIN_SMALL_LETTER_A_WITH_DIAERESIS: - return (const char *)"ä"; - case LATIN_SMALL_LETTER_A_WITH_RING_ABOVE: - return (const char *)"å"; - case LATIN_SMALL_LETTER_AE: - return (const char *)"æ"; - case LATIN_SMALL_LETTER_C_WITH_CARON: - return (const char *)"č"; - case LATIN_SMALL_LETTER_C_WITH_CEDILLA: - return (const char *)"ç"; - case LATIN_SMALL_LETTER_E_WITH_GRAVE: - return (const char *)"è"; - case LATIN_SMALL_LETTER_E_WITH_ACUTE: - return (const char *)"é"; - case LATIN_SMALL_LETTER_E_WITH_CARON: - return (const char *)"ě"; - case LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX: - return (const char *)"ê"; - case LATIN_SMALL_LETTER_E_WITH_DIAERESIS: - return (const char *)"ë"; - case LATIN_SMALL_LETTER_I_WITH_GRAVE: - return (const char *)"ì"; - case LATIN_SMALL_LETTER_I_WITH_ACUTE: - return (const char *)"í"; - case LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX: - return (const char *)"î"; - case LATIN_SMALL_LETTER_I_WITH_DIAERESIS: - return (const char *)"ï"; - case LATIN_SMALL_LETTER_ETH: - return (const char *)"ð"; - case LATIN_SMALL_LETTER_N_WITH_TILDE: - return (const char *)"ñ"; - case LATIN_SMALL_LETTER_O_WITH_GRAVE: - return (const char *)"ò"; - case LATIN_SMALL_LETTER_O_WITH_ACUTE: - return (const char *)"ó"; - case LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX: - return (const char *)"ô"; - case LATIN_SMALL_LETTER_O_WITH_TILDE: - return (const char *)"õ"; - case LATIN_SMALL_LETTER_O_WITH_DIAERESIS: - return (const char *)"ö"; - case DIVISION_SIGN: - return (const char *)"÷"; - case LATIN_SMALL_LETTER_O_WITH_STROKE: - return (const char *)"ø"; - case LATIN_SMALL_LETTER_S_WITH_CARON: - return (const char *)"š"; - case LATIN_SMALL_LETTER_U_WITH_GRAVE: - return (const char *)"ù"; - case LATIN_SMALL_LETTER_U_WITH_ACUTE: - return (const char *)"ú"; - case LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX: - return (const char *)"û"; - case LATIN_SMALL_LETTER_U_WITH_DIAERESIS: - return (const char *)"ü"; - case LATIN_SMALL_LETTER_Y_WITH_ACUTE: - return (const char *)"ý"; - case LATIN_SMALL_LETTER_THORN: - return (const char *)"þ"; - case LATIN_SMALL_LETTER_Y_WITH_DIAERESIS: - return (const char *)"ÿ"; - case LATIN_SMALL_LETTER_Z_WITH_CARON: - return (const char *)"ž"; - case EURO_CURRENCY_SIGN: - return (const char *)"€"; - case 0: - return (const char *)""; - default: - sprintf(buf,"&#%u;",(unsigned)c); - return buf; /* undefined */ - } - /* break; unreachable code */ - case XML: /* only 5 &xxx;-ENTITIES ar defined by default */ - if ( c >= SPACE && c <= TILDE ) { /* ASCII */ - switch (c) { - case '&': - return (const char *)"&"; - case '\'': - return (const char *)"'"; - case '"': - return (const char *)"""; - case '<': - return (const char *)"<"; - case '>': - return (const char *)">"; - } - buf[0] = (char)c; - return buf; - } - switch (c) { /* subject of change! */ - case PICTURE: - return (const char *)"(PICTURE)"; - case UNKNOWN: - return (const char *)"_"; /* better use colored symbol? */ - case LINE_FEED: /* \n handled somwhere else? */ - case FORM_FEED: - case CARRIAGE_RETURN: - return (const char *)"
"; - case NO_BREAK_SPACE: - return (const char *)"
"; - case 0: - return (const char *)""; - default: - sprintf(buf,"&#x%03x;",(unsigned)c); - return buf; /* undefined */ - } - /* break; unreachable code */ - case SGML: - switch (c) { - default: - sprintf(buf,"&#%u;",(unsigned)c); - return buf; /* UNDEFINED */ - } - /* break; unreachable code */ - case ASCII: /* mainly used for debugging */ - if ( c=='\n' || (c>= 0x20 && c <= 0x7F) ) { - buf[0] = (char)c; - return buf; - } - switch (c) { - /* extra */ - case UNKNOWN: - return (const char *)"(?)"; - case PICTURE: - return (const char *)"(?)"; - - default: - /* snprintf seems to be no standard, so I use insecure sprintf */ - if ((unsigned)c>255) sprintf(buf,"(0x%04x)",(unsigned)c); - else sprintf(buf,"(0x%02x)",(unsigned)c); - return buf; /* UNDEFINED; */ - } - /* break; unreachable code */ - default: /* use UTF8 as default, test with xterm -u8 */ - /* extra */ - if ( c == UNKNOWN ) return (const char *)"_"; - if ( c == PICTURE ) return (const char *)"_"; /* Due to Mobile OCR */ - if ( c <= (wchar_t)0x0000007F ) { /* UTF8 == 7bit ASCII */ - buf[0] = (char)c; - return buf; - } - if ( c <= (wchar_t)0x000007FF ) { /* UTF8 == 11bit */ - buf[0] = (char)(0xc0|((c>> 6) & 0x1f)); /* 110xxxxx */ - buf[1] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ - buf[2] = (char)0; /* terminate string */ - return buf; - } - /* wchar_t is 16bit for Borland-C !? Jan07 */ - if ( c <= (wchar_t)0x0000FFFF ) { /* UTF8 == 16bit */ - buf[0] = (char)(0xe0|((c>>12) & 0x0f)); /* 1110xxxx */ - buf[1] = (char)(0x80|((c>> 6) & 0x3f)); /* 10xxxxxx */ - buf[2] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ - buf[3] = (char)0; /* terminate string */ - return buf; - } - if ( c <= (wchar_t)0x001FFFFF ) { /* UTF8 == 21bit */ - buf[0] = (char)(0xf0|((c>>18) & 0x07)); /* 11110xxx */ - buf[1] = (char)(0x80|((c>>12) & 0x3f)); /* 10xxxxxx */ - buf[2] = (char)(0x80|((c>> 6) & 0x3f)); /* 10xxxxxx */ - buf[3] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ - buf[4] = (char)0; /* terminate string */ - return buf; - } - if ( c <= (wchar_t)0x03FFFFFF ) { /* UTF8 == 26bit */ - buf[0] = (char)(0xf8|((c>>24) & 0x03)); /* 111110xx */ - buf[1] = (char)(0x80|((c>>18) & 0x3f)); /* 10xxxxxx */ - buf[2] = (char)(0x80|((c>>12) & 0x3f)); /* 10xxxxxx */ - buf[3] = (char)(0x80|((c>> 6) & 0x3f)); /* 10xxxxxx */ - buf[4] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ - buf[5] = (char)0; /* terminate string */ - return buf; - } - if ( c <= (wchar_t)0x7FFFFFFF ) { /* UTF8 == 31bit */ - buf[0] = (char)(0xfc|((c>>30) & 0x01)); /* 1111110x */ - buf[1] = (char)(0x80|((c>>24) & 0x3f)); /* 10xxxxxx */ - buf[2] = (char)(0x80|((c>>18) & 0x3f)); /* 10xxxxxx */ - buf[3] = (char)(0x80|((c>>12) & 0x3f)); /* 10xxxxxx */ - buf[4] = (char)(0x80|((c>> 6) & 0x3f)); /* 10xxxxxx */ - buf[5] = (char)(0x80|( c & 0x3f)); /* 10xxxxxx */ - buf[6] = (char)0; /* terminate string */ - return buf; - } - return (const char *)UNDEFINED; - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.h b/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.h deleted file mode 100644 index b85fd444f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/gocr/unicode.h +++ /dev/null @@ -1,1257 +0,0 @@ -/* -This is a Optical-Character-Recognition program -Copyright (C) 2000-2007 Joerg Schulenburg - - The character codes in this file are Copyright (c) 1991-1999 Unicode, Inc. - All Rights reserved. - - This file is provided as-is by Unicode, Inc. (The Unicode Consortium). - No claims are made as to fitness for any particular purpose. No - warranties of any kind are expressed or implied. The recipient - agrees to determine applicability of information provided. If this - file has been provided on optical media by Unicode, Inc., the sole - remedy for any claim will be exchange of defective media within 90 - days of receipt. - - Unicode, Inc. hereby grants the right to freely use the information - supplied in this file in the creation of products supporting the - Unicode Standard, and to make copies of this file in any form for - internal or external distribution as long as this notice remains - attached. - -For the rest of the file, the following applies: - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - see README for EMAIL-address - */ - -/* - Only the codes judged necessary by the developers are present in this - file. It conforms with MES-1. You'll find also Greek characters, - mathematical symbols and some extra symbols. - - Use the following regular expression to help add new codes from the - Unicode data files: ([\w\s]*);([\w\s]*);[^\n]* -*/ - -#ifndef G_UNICODE_H -#define G_UNICODE_H - -#include - -enum format { - ISO8859_1, TeX, HTML, XML, SGML, UTF8, ASCII -}; -typedef enum format FORMAT; - -/* - * Prototypes - */ -wchar_t compose(wchar_t main, wchar_t modifier); -const char *decode(wchar_t c, FORMAT type); - -/* - * Unicode codes - */ - -/* E000-F8FF are for private use. We'll reserve E000-E0FF by now. */ -/* the next line isnt proper, but was the easiest way to fix a problem */ -#ifndef UNKNOWN -#define UNKNOWN 0xE000 -#endif -#define PICTURE 0xE001 -#define HEADER_FILE 0xE010 - -/* most codes 0x00-0x1F are not needed, but we provide them anyway. U0000 had - the name changed from NULL to UNICODE_NULL to avoid conflicts. */ -#define UNICODE_NULL 0x0000 -#define START_OF_HEADING 0x0001 -#define START_OF_TEXT 0x0002 -#define END_OF_TEXT 0x0003 -#define END_OF_TRANSMISSION 0x0004 -#define ENQUIRY 0x0005 -#define ACKNOWLEDGE 0x0006 -#define BELL 0x0007 -#define BACKSPACE 0x0008 -#define HORIZONTAL_TABULATION 0x0009 -#define LINE_FEED 0x000A -#define VERTICAL_TABULATION 0x000B -#define FORM_FEED 0x000C -#define CARRIAGE_RETURN 0x000D -#define SHIFT_OUT 0x000E -#define SHIFT_IN 0x000F -#define DATA_LINK_ESCAPE 0x0010 -#define DEVICE_CONTROL_ONE 0x0011 -#define DEVICE_CONTROL_TWO 0x0012 -#define DEVICE_CONTROL_THREE 0x0013 -#define DEVICE_CONTROL_FOUR 0x0014 -#define NEGATIVE_ACKNOWLEDGE 0x0015 -#define SYNCHRONOUS_IDLE 0x0016 -#define END_OF_TRANSMISSION_BLOCK 0x0017 -#define CANCEL 0x0018 -#define END_OF_MEDIUM 0x0019 -#define SUBSTITUTE 0x001A -#define ESCAPE 0x001B -#define FILE_SEPARATOR 0x001C -#define GROUP_SEPARATOR 0x001D -#define RECORD_SEPARATOR 0x001E -#define UNIT_SEPARATOR 0x001F - -/* ASCII */ -#define SPACE 0x0020 -#define EXCLAMATION_MARK 0x0021 -#define QUOTATION_MARK 0x0022 -#define NUMBER_SIGN 0x0023 -#define DOLLAR_SIGN 0x0024 -#define PERCENT_SIGN 0x0025 -#define AMPERSAND 0x0026 -#define APOSTROPHE 0x0027 -#define LEFT_PARENTHESIS 0x0028 -#define RIGHT_PARENTHESIS 0x0029 -#define ASTERISK 0x002A -#define PLUS_SIGN 0x002B -#define COMMA 0x002C -#define HYPHEN_MINUS 0x002D -#define FULL_STOP 0x002E -#define SOLIDUS 0x002F -#define DIGIT_ZERO 0x0030 -#define DIGIT_ONE 0x0031 -#define DIGIT_TWO 0x0032 -#define DIGIT_THREE 0x0033 -#define DIGIT_FOUR 0x0034 -#define DIGIT_FIVE 0x0035 -#define DIGIT_SIX 0x0036 -#define DIGIT_SEVEN 0x0037 -#define DIGIT_EIGHT 0x0038 -#define DIGIT_NINE 0x0039 -#define COLON 0x003A -#define SEMICOLON 0x003B -#define LESS_THAN_SIGN 0x003C -#define EQUALS_SIGN 0x003D -#define GREATER_THAN_SIGN 0x003E -#define QUESTION_MARK 0x003F -#define COMMERCIAL_AT 0x0040 -#define LATIN_CAPITAL_LETTER_A 0x0041 -#define LATIN_CAPITAL_LETTER_B 0x0042 -#define LATIN_CAPITAL_LETTER_C 0x0043 -#define LATIN_CAPITAL_LETTER_D 0x0044 -#define LATIN_CAPITAL_LETTER_E 0x0045 -#define LATIN_CAPITAL_LETTER_F 0x0046 -#define LATIN_CAPITAL_LETTER_G 0x0047 -#define LATIN_CAPITAL_LETTER_H 0x0048 -#define LATIN_CAPITAL_LETTER_I 0x0049 -#define LATIN_CAPITAL_LETTER_J 0x004A -#define LATIN_CAPITAL_LETTER_K 0x004B -#define LATIN_CAPITAL_LETTER_L 0x004C -#define LATIN_CAPITAL_LETTER_M 0x004D -#define LATIN_CAPITAL_LETTER_N 0x004E -#define LATIN_CAPITAL_LETTER_O 0x004F -#define LATIN_CAPITAL_LETTER_P 0x0050 -#define LATIN_CAPITAL_LETTER_Q 0x0051 -#define LATIN_CAPITAL_LETTER_R 0x0052 -#define LATIN_CAPITAL_LETTER_S 0x0053 -#define LATIN_CAPITAL_LETTER_T 0x0054 -#define LATIN_CAPITAL_LETTER_U 0x0055 -#define LATIN_CAPITAL_LETTER_V 0x0056 -#define LATIN_CAPITAL_LETTER_W 0x0057 -#define LATIN_CAPITAL_LETTER_X 0x0058 -#define LATIN_CAPITAL_LETTER_Y 0x0059 -#define LATIN_CAPITAL_LETTER_Z 0x005A -#define LEFT_SQUARE_BRACKET 0x005B -#define REVERSE_SOLIDUS 0x005C -#define RIGHT_SQUARE_BRACKET 0x005D -#define CIRCUMFLEX_ACCENT 0x005E -#define LOW_LINE 0x005F -#define GRAVE_ACCENT 0x0060 -#define LATIN_SMALL_LETTER_A 0x0061 -#define LATIN_SMALL_LETTER_B 0x0062 -#define LATIN_SMALL_LETTER_C 0x0063 -#define LATIN_SMALL_LETTER_D 0x0064 -#define LATIN_SMALL_LETTER_E 0x0065 -#define LATIN_SMALL_LETTER_F 0x0066 -#define LATIN_SMALL_LETTER_G 0x0067 -#define LATIN_SMALL_LETTER_H 0x0068 -#define LATIN_SMALL_LETTER_I 0x0069 -#define LATIN_SMALL_LETTER_J 0x006A -#define LATIN_SMALL_LETTER_K 0x006B -#define LATIN_SMALL_LETTER_L 0x006C -#define LATIN_SMALL_LETTER_M 0x006D -#define LATIN_SMALL_LETTER_N 0x006E -#define LATIN_SMALL_LETTER_O 0x006F -#define LATIN_SMALL_LETTER_P 0x0070 -#define LATIN_SMALL_LETTER_Q 0x0071 -#define LATIN_SMALL_LETTER_R 0x0072 -#define LATIN_SMALL_LETTER_S 0x0073 -#define LATIN_SMALL_LETTER_T 0x0074 -#define LATIN_SMALL_LETTER_U 0x0075 -#define LATIN_SMALL_LETTER_V 0x0076 -#define LATIN_SMALL_LETTER_W 0x0077 -#define LATIN_SMALL_LETTER_X 0x0078 -#define LATIN_SMALL_LETTER_Y 0x0079 -#define LATIN_SMALL_LETTER_Z 0x007A -#define LEFT_CURLY_BRACKET 0x007B -#define VERTICAL_LINE 0x007C -#define RIGHT_CURLY_BRACKET 0x007D -#define TILDE 0x007E - -/* codes 0x7F-0xBF are not needed */ -#define NO_BREAK_SPACE 0x00A0 -#define INVERTED_EXCLAMATION_MARK 0x00A1 -#define CENT_SIGN 0x00A2 -#define POUND_SIGN 0x00A3 -#define CURRENCY_SIGN 0x00A4 -#define YEN_SIGN 0x00A5 -#define BROKEN_BAR 0x00A6 -#define SECTION_SIGN 0x00A7 -#define DIAERESIS 0x00A8 -#define COPYRIGHT_SIGN 0x00A9 -#define FEMININE_ORDINAL_INDICATOR 0x00AA -#define LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK 0x00AB -#define NOT_SIGN 0x00AC -#define SOFT_HYPHEN 0x00AD -#define REGISTERED_SIGN 0x00AE -#define MACRON 0x00AF -#define DEGREE_SIGN 0x00B0 -#define PLUS_MINUS_SIGN 0x00B1 -#define SUPERSCRIPT_TWO 0x00B2 -#define SUPERSCRIPT_THREE 0x00B3 -#define ACUTE_ACCENT 0x00B4 -#define MICRO_SIGN 0x00B5 -#define PILCROW_SIGN 0x00B6 -#define MIDDLE_DOT 0x00B7 -#define CEDILLA 0x00B8 -#define SUPERSCRIPT_ONE 0x00B9 -#define MASCULINE_ORDINAL_INDICATOR 0x00BA -#define RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK 0x00BB -#define VULGAR_FRACTION_ONE_QUARTER 0x00BC -#define VULGAR_FRACTION_ONE_HALF 0x00BD -#define VULGAR_FRACTION_THREE_QUARTERS 0x00BE -#define INVERTED_QUESTION_MARK 0x00BF -#define LATIN_CAPITAL_LETTER_A_WITH_GRAVE 0x00C0 -#define LATIN_CAPITAL_LETTER_A_WITH_ACUTE 0x00C1 -#define LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX 0x00C2 -#define LATIN_CAPITAL_LETTER_A_WITH_TILDE 0x00C3 -#define LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS 0x00C4 -#define LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE 0x00C5 -#define LATIN_CAPITAL_LETTER_AE 0x00C6 -#define LATIN_CAPITAL_LETTER_C_WITH_CEDILLA 0x00C7 -#define LATIN_CAPITAL_LETTER_E_WITH_GRAVE 0x00C8 -#define LATIN_CAPITAL_LETTER_E_WITH_ACUTE 0x00C9 -#define LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX 0x00CA -#define LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS 0x00CB -#define LATIN_CAPITAL_LETTER_I_WITH_GRAVE 0x00CC -#define LATIN_CAPITAL_LETTER_I_WITH_ACUTE 0x00CD -#define LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX 0x00CE -#define LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS 0x00CF -#define LATIN_CAPITAL_LETTER_ETH 0x00D0 -#define LATIN_CAPITAL_LETTER_N_WITH_TILDE 0x00D1 -#define LATIN_CAPITAL_LETTER_O_WITH_GRAVE 0x00D2 -#define LATIN_CAPITAL_LETTER_O_WITH_ACUTE 0x00D3 -#define LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX 0x00D4 -#define LATIN_CAPITAL_LETTER_O_WITH_TILDE 0x00D5 -#define LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS 0x00D6 -#define MULTIPLICATION_SIGN 0x00D7 -#define LATIN_CAPITAL_LETTER_O_WITH_STROKE 0x00D8 -#define LATIN_CAPITAL_LETTER_U_WITH_GRAVE 0x00D9 -#define LATIN_CAPITAL_LETTER_U_WITH_ACUTE 0x00DA -#define LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX 0x00DB -#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS 0x00DC -#define LATIN_CAPITAL_LETTER_Y_WITH_ACUTE 0x00DD -#define LATIN_CAPITAL_LETTER_THORN 0x00DE -#define LATIN_SMALL_LETTER_SHARP_S 0x00DF -#define LATIN_SMALL_LETTER_A_WITH_GRAVE 0x00E0 -#define LATIN_SMALL_LETTER_A_WITH_ACUTE 0x00E1 -#define LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX 0x00E2 -#define LATIN_SMALL_LETTER_A_WITH_TILDE 0x00E3 -#define LATIN_SMALL_LETTER_A_WITH_DIAERESIS 0x00E4 -#define LATIN_SMALL_LETTER_A_WITH_RING_ABOVE 0x00E5 -#define LATIN_SMALL_LETTER_AE 0x00E6 -#define LATIN_SMALL_LETTER_C_WITH_CEDILLA 0x00E7 -#define LATIN_SMALL_LETTER_E_WITH_GRAVE 0x00E8 -#define LATIN_SMALL_LETTER_E_WITH_ACUTE 0x00E9 -#define LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX 0x00EA -#define LATIN_SMALL_LETTER_E_WITH_DIAERESIS 0x00EB -#define LATIN_SMALL_LETTER_I_WITH_GRAVE 0x00EC -#define LATIN_SMALL_LETTER_I_WITH_ACUTE 0x00ED -#define LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX 0x00EE -#define LATIN_SMALL_LETTER_I_WITH_DIAERESIS 0x00EF -#define LATIN_SMALL_LETTER_ETH 0x00F0 -#define LATIN_SMALL_LETTER_N_WITH_TILDE 0x00F1 -#define LATIN_SMALL_LETTER_O_WITH_GRAVE 0x00F2 -#define LATIN_SMALL_LETTER_O_WITH_ACUTE 0x00F3 -#define LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX 0x00F4 -#define LATIN_SMALL_LETTER_O_WITH_TILDE 0x00F5 -#define LATIN_SMALL_LETTER_O_WITH_DIAERESIS 0x00F6 -#define DIVISION_SIGN 0x00F7 -#define LATIN_SMALL_LETTER_O_WITH_STROKE 0x00F8 -#define LATIN_SMALL_LETTER_U_WITH_GRAVE 0x00F9 -#define LATIN_SMALL_LETTER_U_WITH_ACUTE 0x00FA -#define LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX 0x00FB -#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS 0x00FC -#define LATIN_SMALL_LETTER_Y_WITH_ACUTE 0x00FD -#define LATIN_SMALL_LETTER_THORN 0x00FE -#define LATIN_SMALL_LETTER_Y_WITH_DIAERESIS 0x00FF - -/* latin extended-A */ -#define LATIN_CAPITAL_LETTER_A_WITH_MACRON 0x0100 -#define LATIN_SMALL_LETTER_A_WITH_MACRON 0x0101 -#define LATIN_CAPITAL_LETTER_A_WITH_BREVE 0x0102 -#define LATIN_SMALL_LETTER_A_WITH_BREVE 0x0103 -#define LATIN_CAPITAL_LETTER_A_WITH_OGONEK 0x0104 -#define LATIN_SMALL_LETTER_A_WITH_OGONEK 0x0105 -#define LATIN_CAPITAL_LETTER_C_WITH_ACUTE 0x0106 -#define LATIN_SMALL_LETTER_C_WITH_ACUTE 0x0107 -#define LATIN_CAPITAL_LETTER_C_WITH_CIRCUMFLEX 0x0108 -#define LATIN_SMALL_LETTER_C_WITH_CIRCUMFLEX 0x0109 -#define LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE 0x010A -#define LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE 0x010B -#define LATIN_CAPITAL_LETTER_C_WITH_CARON 0x010C -#define LATIN_SMALL_LETTER_C_WITH_CARON 0x010D -#define LATIN_CAPITAL_LETTER_D_WITH_CARON 0x010E -#define LATIN_SMALL_LETTER_D_WITH_CARON 0x010F -#define LATIN_CAPITAL_LETTER_D_WITH_STROKE 0x0110 -#define LATIN_SMALL_LETTER_D_WITH_STROKE 0x0111 -#define LATIN_CAPITAL_LETTER_E_WITH_MACRON 0x0112 -#define LATIN_SMALL_LETTER_E_WITH_MACRON 0x0113 -#define LATIN_CAPITAL_LETTER_E_WITH_BREVE 0x0114 -#define LATIN_SMALL_LETTER_E_WITH_BREVE 0x0115 -#define LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE 0x0116 -#define LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE 0x0117 -#define LATIN_CAPITAL_LETTER_E_WITH_OGONEK 0x0118 -#define LATIN_SMALL_LETTER_E_WITH_OGONEK 0x0119 -#define LATIN_CAPITAL_LETTER_E_WITH_CARON 0x011A -#define LATIN_SMALL_LETTER_E_WITH_CARON 0x011B -#define LATIN_CAPITAL_LETTER_G_WITH_CIRCUMFLEX 0x011C -#define LATIN_SMALL_LETTER_G_WITH_CIRCUMFLEX 0x011D -#define LATIN_CAPITAL_LETTER_G_WITH_BREVE 0x011E -#define LATIN_SMALL_LETTER_G_WITH_BREVE 0x011F -#define LATIN_CAPITAL_LETTER_G_WITH_DOT_ABOVE 0x0120 -#define LATIN_SMALL_LETTER_G_WITH_DOT_ABOVE 0x0121 -#define LATIN_CAPITAL_LETTER_G_WITH_CEDILLA 0x0122 -#define LATIN_SMALL_LETTER_G_WITH_CEDILLA 0x0123 -#define LATIN_CAPITAL_LETTER_H_WITH_CIRCUMFLEX 0x0124 -#define LATIN_SMALL_LETTER_H_WITH_CIRCUMFLEX 0x0125 -#define LATIN_CAPITAL_LETTER_H_WITH_STROKE 0x0126 -#define LATIN_SMALL_LETTER_H_WITH_STROKE 0x0127 -#define LATIN_CAPITAL_LETTER_I_WITH_TILDE 0x0128 -#define LATIN_SMALL_LETTER_I_WITH_TILDE 0x0129 -#define LATIN_CAPITAL_LETTER_I_WITH_MACRON 0x012A -#define LATIN_SMALL_LETTER_I_WITH_MACRON 0x012B -#define LATIN_CAPITAL_LETTER_I_WITH_BREVE 0x012C -#define LATIN_SMALL_LETTER_I_WITH_BREVE 0x012D -#define LATIN_CAPITAL_LETTER_I_WITH_OGONEK 0x012E -#define LATIN_SMALL_LETTER_I_WITH_OGONEK 0x012F -#define LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE 0x0130 -#define LATIN_SMALL_LETTER_DOTLESS_I 0x0131 -#define LATIN_CAPITAL_LIGATURE_IJ 0x0132 -#define LATIN_SMALL_LIGATURE_IJ 0x0133 -#define LATIN_CAPITAL_LETTER_J_WITH_CIRCUMFLEX 0x0134 -#define LATIN_SMALL_LETTER_J_WITH_CIRCUMFLEX 0x0135 -#define LATIN_CAPITAL_LETTER_K_WITH_CEDILLA 0x0136 -#define LATIN_SMALL_LETTER_K_WITH_CEDILLA 0x0137 -#define LATIN_SMALL_LETTER_KRA 0x0138 -#define LATIN_CAPITAL_LETTER_L_WITH_ACUTE 0x0139 -#define LATIN_SMALL_LETTER_L_WITH_ACUTE 0x013A -#define LATIN_CAPITAL_LETTER_L_WITH_CEDILLA 0x013B -#define LATIN_SMALL_LETTER_L_WITH_CEDILLA 0x013C -#define LATIN_CAPITAL_LETTER_L_WITH_CARON 0x013D -#define LATIN_SMALL_LETTER_L_WITH_CARON 0x013E -#define LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_DOT 0x013F -#define LATIN_SMALL_LETTER_L_WITH_MIDDLE_DOT 0x0140 -#define LATIN_CAPITAL_LETTER_L_WITH_STROKE 0x0141 -#define LATIN_SMALL_LETTER_L_WITH_STROKE 0x0142 -#define LATIN_CAPITAL_LETTER_N_WITH_ACUTE 0x0143 -#define LATIN_SMALL_LETTER_N_WITH_ACUTE 0x0144 -#define LATIN_CAPITAL_LETTER_N_WITH_CEDILLA 0x0145 -#define LATIN_SMALL_LETTER_N_WITH_CEDILLA 0x0146 -#define LATIN_CAPITAL_LETTER_N_WITH_CARON 0x0147 -#define LATIN_SMALL_LETTER_N_WITH_CARON 0x0148 -#define LATIN_SMALL_LETTER_N_PRECEDED_BY_APOSTROPHE 0x0149 -#define LATIN_CAPITAL_LETTER_ENG 0x014A -#define LATIN_SMALL_LETTER_ENG 0x014B -#define LATIN_CAPITAL_LETTER_O_WITH_MACRON 0x014C -#define LATIN_SMALL_LETTER_O_WITH_MACRON 0x014D -#define LATIN_CAPITAL_LETTER_O_WITH_BREVE 0x014E -#define LATIN_SMALL_LETTER_O_WITH_BREVE 0x014F -#define LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_ACUTE 0x0150 -#define LATIN_SMALL_LETTER_O_WITH_DOUBLE_ACUTE 0x0151 -#define LATIN_CAPITAL_LIGATURE_OE 0x0152 -#define LATIN_SMALL_LIGATURE_OE 0x0153 -#define LATIN_CAPITAL_LETTER_R_WITH_ACUTE 0x0154 -#define LATIN_SMALL_LETTER_R_WITH_ACUTE 0x0155 -#define LATIN_CAPITAL_LETTER_R_WITH_CEDILLA 0x0156 -#define LATIN_SMALL_LETTER_R_WITH_CEDILLA 0x0157 -#define LATIN_CAPITAL_LETTER_R_WITH_CARON 0x0158 -#define LATIN_SMALL_LETTER_R_WITH_CARON 0x0159 -#define LATIN_CAPITAL_LETTER_S_WITH_ACUTE 0x015A -#define LATIN_SMALL_LETTER_S_WITH_ACUTE 0x015B -#define LATIN_CAPITAL_LETTER_S_WITH_CIRCUMFLEX 0x015C -#define LATIN_SMALL_LETTER_S_WITH_CIRCUMFLEX 0x015D -#define LATIN_CAPITAL_LETTER_S_WITH_CEDILLA 0x015E -#define LATIN_SMALL_LETTER_S_WITH_CEDILLA 0x015F -#define LATIN_CAPITAL_LETTER_S_WITH_CARON 0x0160 -#define LATIN_SMALL_LETTER_S_WITH_CARON 0x0161 -#define LATIN_CAPITAL_LETTER_T_WITH_CEDILLA 0x0162 -#define LATIN_SMALL_LETTER_T_WITH_CEDILLA 0x0163 -#define LATIN_CAPITAL_LETTER_T_WITH_CARON 0x0164 -#define LATIN_SMALL_LETTER_T_WITH_CARON 0x0165 -#define LATIN_CAPITAL_LETTER_T_WITH_STROKE 0x0166 -#define LATIN_SMALL_LETTER_T_WITH_STROKE 0x0167 -#define LATIN_CAPITAL_LETTER_U_WITH_TILDE 0x0168 -#define LATIN_SMALL_LETTER_U_WITH_TILDE 0x0169 -#define LATIN_CAPITAL_LETTER_U_WITH_MACRON 0x016A -#define LATIN_SMALL_LETTER_U_WITH_MACRON 0x016B -#define LATIN_CAPITAL_LETTER_U_WITH_BREVE 0x016C -#define LATIN_SMALL_LETTER_U_WITH_BREVE 0x016D -#define LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE 0x016E -#define LATIN_SMALL_LETTER_U_WITH_RING_ABOVE 0x016F -#define LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE 0x0170 -#define LATIN_SMALL_LETTER_U_WITH_DOUBLE_ACUTE 0x0171 -#define LATIN_CAPITAL_LETTER_U_WITH_OGONEK 0x0172 -#define LATIN_SMALL_LETTER_U_WITH_OGONEK 0x0173 -#define LATIN_CAPITAL_LETTER_W_WITH_CIRCUMFLEX 0x0174 -#define LATIN_SMALL_LETTER_W_WITH_CIRCUMFLEX 0x0175 -#define LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX 0x0176 -#define LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX 0x0177 -#define LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS 0x0178 -#define LATIN_CAPITAL_LETTER_Z_WITH_ACUTE 0x0179 -#define LATIN_SMALL_LETTER_Z_WITH_ACUTE 0x017A -#define LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE 0x017B -#define LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE 0x017C -#define LATIN_CAPITAL_LETTER_Z_WITH_CARON 0x017D -#define LATIN_SMALL_LETTER_Z_WITH_CARON 0x017E -#define LATIN_SMALL_LETTER_LONG_S 0x017F - -/* latin extended B */ -#define LATIN_SMALL_LETTER_B_WITH_STROKE 0x0180 -#define LATIN_CAPITAL_LETTER_B_WITH_HOOK 0x0181 -#define LATIN_CAPITAL_LETTER_B_WITH_TOPBAR 0x0182 -#define LATIN_SMALL_LETTER_B_WITH_TOPBAR 0x0183 -#define LATIN_CAPITAL_LETTER_TONE_SIX 0x0184 -#define LATIN_SMALL_LETTER_TONE_SIX 0x0185 -#define LATIN_CAPITAL_LETTER_OPEN_O 0x0186 -#define LATIN_CAPITAL_LETTER_C_WITH_HOOK 0x0187 -#define LATIN_SMALL_LETTER_C_WITH_HOOK 0x0188 -#define LATIN_CAPITAL_LETTER_AFRICAN_D 0x0189 -#define LATIN_CAPITAL_LETTER_D_WITH_HOOK 0x018A -#define LATIN_CAPITAL_LETTER_D_WITH_TOPBAR 0x018B -#define LATIN_SMALL_LETTER_D_WITH_TOPBAR 0x018C -#define LATIN_SMALL_LETTER_TURNED_DELTA 0x018D -#define LATIN_CAPITAL_LETTER_REVERSED_E 0x018E -#define LATIN_CAPITAL_LETTER_SCHWA 0x018F -#define LATIN_CAPITAL_LETTER_OPEN_E 0x0190 -#define LATIN_CAPITAL_LETTER_F_WITH_HOOK 0x0191 -#define LATIN_SMALL_LETTER_F_WITH_HOOK 0x0192 -#define LATIN_CAPITAL_LETTER_G_WITH_HOOK 0x0193 -#define LATIN_CAPITAL_LETTER_GAMMA 0x0194 -#define LATIN_SMALL_LETTER_HV 0x0195 -#define LATIN_CAPITAL_LETTER_IOTA 0x0196 -#define LATIN_CAPITAL_LETTER_I_WITH_STROKE 0x0197 -#define LATIN_CAPITAL_LETTER_K_WITH_HOOK 0x0198 -#define LATIN_SMALL_LETTER_K_WITH_HOOK 0x0199 -#define LATIN_SMALL_LETTER_L_WITH_BAR 0x019A -#define LATIN_SMALL_LETTER_LAMBDA_WITH_STROKE 0x019B -#define LATIN_CAPITAL_LETTER_TURNED_M 0x019C -#define LATIN_CAPITAL_LETTER_N_WITH_LEFT_HOOK 0x019D -#define LATIN_SMALL_LETTER_N_WITH_LONG_RIGHT_LEG 0x019E -#define LATIN_CAPITAL_LETTER_O_WITH_MIDDLE_TILDE 0x019F -#define LATIN_CAPITAL_LETTER_O_WITH_HORN 0x01A0 -#define LATIN_SMALL_LETTER_O_WITH_HORN 0x01A1 -#define LATIN_CAPITAL_LETTER_OI 0x01A2 -#define LATIN_SMALL_LETTER_OI 0x01A3 -#define LATIN_CAPITAL_LETTER_P_WITH_HOOK 0x01A4 -#define LATIN_SMALL_LETTER_P_WITH_HOOK 0x01A5 -#define LATIN_LETTER_YR 0x01A6 -#define LATIN_CAPITAL_LETTER_TONE_TWO 0x01A7 -#define LATIN_SMALL_LETTER_TONE_TWO 0x01A8 -#define LATIN_CAPITAL_LETTER_ESH 0x01A9 -#define LATIN_LETTER_REVERSED_ESH_LOOP 0x01AA -#define LATIN_SMALL_LETTER_T_WITH_PALATAL_HOOK 0x01AB -#define LATIN_CAPITAL_LETTER_T_WITH_HOOK 0x01AC -#define LATIN_SMALL_LETTER_T_WITH_HOOK 0x01AD -#define LATIN_CAPITAL_LETTER_T_WITH_RETROFLEX_HOOK 0x01AE -#define LATIN_CAPITAL_LETTER_U_WITH_HORN 0x01AF -#define LATIN_SMALL_LETTER_U_WITH_HORN 0x01B0 -#define LATIN_CAPITAL_LETTER_UPSILON 0x01B1 -#define LATIN_CAPITAL_LETTER_V_WITH_HOOK 0x01B2 -#define LATIN_CAPITAL_LETTER_Y_WITH_HOOK 0x01B3 -#define LATIN_SMALL_LETTER_Y_WITH_HOOK 0x01B4 -#define LATIN_CAPITAL_LETTER_Z_WITH_STROKE 0x01B5 -#define LATIN_SMALL_LETTER_Z_WITH_STROKE 0x01B6 -#define LATIN_CAPITAL_LETTER_EZH 0x01B7 -#define LATIN_CAPITAL_LETTER_EZH_REVERSED 0x01B8 -#define LATIN_SMALL_LETTER_EZH_REVERSED 0x01B9 -#define LATIN_SMALL_LETTER_EZH_WITH_TAIL 0x01BA -#define LATIN_LETTER_TWO_WITH_STROKE 0x01BB -#define LATIN_CAPITAL_LETTER_TONE_FIVE 0x01BC -#define LATIN_SMALL_LETTER_TONE_FIVE 0x01BD -#define LATIN_LETTER_INVERTED_GLOTTAL_STOP_WITH_STROKE 0x01BE -#define LATIN_LETTER_WYNN 0x01BF -#define LATIN_LETTER_DENTAL_CLICK 0x01C0 -#define LATIN_LETTER_LATERAL_CLICK 0x01C1 -#define LATIN_LETTER_ALVEOLAR_CLICK 0x01C2 -#define LATIN_LETTER_RETROFLEX_CLICK 0x01C3 -#define LATIN_CAPITAL_LETTER_DZ_WITH_CARON 0x01C4 -#define LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z_WITH_CARON 0x01C5 -#define LATIN_SMALL_LETTER_DZ_WITH_CARON 0x01C6 -#define LATIN_CAPITAL_LETTER_LJ 0x01C7 -#define LATIN_CAPITAL_LETTER_L_WITH_SMALL_LETTER_J 0x01C8 -#define LATIN_SMALL_LETTER_LJ 0x01C9 -#define LATIN_CAPITAL_LETTER_NJ 0x01CA -#define LATIN_CAPITAL_LETTER_N_WITH_SMALL_LETTER_J 0x01CB -#define LATIN_SMALL_LETTER_NJ 0x01CC -#define LATIN_CAPITAL_LETTER_A_WITH_CARON 0x01CD -#define LATIN_SMALL_LETTER_A_WITH_CARON 0x01CE -#define LATIN_CAPITAL_LETTER_I_WITH_CARON 0x01CF -#define LATIN_SMALL_LETTER_I_WITH_CARON 0x01D0 -#define LATIN_CAPITAL_LETTER_O_WITH_CARON 0x01D1 -#define LATIN_SMALL_LETTER_O_WITH_CARON 0x01D2 -#define LATIN_CAPITAL_LETTER_U_WITH_CARON 0x01D3 -#define LATIN_SMALL_LETTER_U_WITH_CARON 0x01D4 -#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_MACRON 0x01D5 -#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_MACRON 0x01D6 -#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_ACUTE 0x01D7 -#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_ACUTE 0x01D8 -#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_CARON 0x01D9 -#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_CARON 0x01DA -#define LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_GRAVE 0x01DB -#define LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_GRAVE 0x01DC -#define LATIN_SMALL_LETTER_TURNED_E 0x01DD -#define LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS_AND_MACRON 0x01DE -#define LATIN_SMALL_LETTER_A_WITH_DIAERESIS_AND_MACRON 0x01DF -#define LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON 0x01E0 -#define LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON 0x01E1 -#define LATIN_CAPITAL_LETTER_AE_WITH_MACRON 0x01E2 -#define LATIN_SMALL_LETTER_AE_WITH_MACRON 0x01E3 -#define LATIN_CAPITAL_LETTER_G_WITH_STROKE 0x01E4 -#define LATIN_SMALL_LETTER_G_WITH_STROKE 0x01E5 -#define LATIN_CAPITAL_LETTER_G_WITH_CARON 0x01E6 -#define LATIN_SMALL_LETTER_G_WITH_CARON 0x01E7 -#define LATIN_CAPITAL_LETTER_K_WITH_CARON 0x01E8 -#define LATIN_SMALL_LETTER_K_WITH_CARON 0x01E9 -#define LATIN_CAPITAL_LETTER_O_WITH_OGONEK 0x01EA -#define LATIN_SMALL_LETTER_O_WITH_OGONEK 0x01EB -#define LATIN_CAPITAL_LETTER_O_WITH_OGONEK_AND_MACRON 0x01EC -#define LATIN_SMALL_LETTER_O_WITH_OGONEK_AND_MACRON 0x01ED -#define LATIN_CAPITAL_LETTER_EZH_WITH_CARON 0x01EE -#define LATIN_SMALL_LETTER_EZH_WITH_CARON 0x01EF -#define LATIN_SMALL_LETTER_J_WITH_CARON 0x01F0 -#define LATIN_CAPITAL_LETTER_DZ 0x01F1 -#define LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z 0x01F2 -#define LATIN_SMALL_LETTER_DZ 0x01F3 -#define LATIN_CAPITAL_LETTER_G_WITH_ACUTE 0x01F4 -#define LATIN_SMALL_LETTER_G_WITH_ACUTE 0x01F5 -#define LATIN_CAPITAL_LETTER_HWAIR 0x01F6 -#define LATIN_CAPITAL_LETTER_WYNN 0x01F7 -#define LATIN_CAPITAL_LETTER_N_WITH_GRAVE 0x01F8 -#define LATIN_SMALL_LETTER_N_WITH_GRAVE 0x01F9 -#define LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE 0x01FA -#define LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE 0x01FB -#define LATIN_CAPITAL_LETTER_AE_WITH_ACUTE 0x01FC -#define LATIN_SMALL_LETTER_AE_WITH_ACUTE 0x01FD -#define LATIN_CAPITAL_LETTER_O_WITH_STROKE_AND_ACUTE 0x01FE -#define LATIN_SMALL_LETTER_O_WITH_STROKE_AND_ACUTE 0x01FF -#define LATIN_CAPITAL_LETTER_A_WITH_DOUBLE_GRAVE 0x0200 -#define LATIN_SMALL_LETTER_A_WITH_DOUBLE_GRAVE 0x0201 -#define LATIN_CAPITAL_LETTER_A_WITH_INVERTED_BREVE 0x0202 -#define LATIN_SMALL_LETTER_A_WITH_INVERTED_BREVE 0x0203 -#define LATIN_CAPITAL_LETTER_E_WITH_DOUBLE_GRAVE 0x0204 -#define LATIN_SMALL_LETTER_E_WITH_DOUBLE_GRAVE 0x0205 -#define LATIN_CAPITAL_LETTER_E_WITH_INVERTED_BREVE 0x0206 -#define LATIN_SMALL_LETTER_E_WITH_INVERTED_BREVE 0x0207 -#define LATIN_CAPITAL_LETTER_I_WITH_DOUBLE_GRAVE 0x0208 -#define LATIN_SMALL_LETTER_I_WITH_DOUBLE_GRAVE 0x0209 -#define LATIN_CAPITAL_LETTER_I_WITH_INVERTED_BREVE 0x020A -#define LATIN_SMALL_LETTER_I_WITH_INVERTED_BREVE 0x020B -#define LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_GRAVE 0x020C -#define LATIN_SMALL_LETTER_O_WITH_DOUBLE_GRAVE 0x020D -#define LATIN_CAPITAL_LETTER_O_WITH_INVERTED_BREVE 0x020E -#define LATIN_SMALL_LETTER_O_WITH_INVERTED_BREVE 0x020F -#define LATIN_CAPITAL_LETTER_R_WITH_DOUBLE_GRAVE 0x0210 -#define LATIN_SMALL_LETTER_R_WITH_DOUBLE_GRAVE 0x0211 -#define LATIN_CAPITAL_LETTER_R_WITH_INVERTED_BREVE 0x0212 -#define LATIN_SMALL_LETTER_R_WITH_INVERTED_BREVE 0x0213 -#define LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_GRAVE 0x0214 -#define LATIN_SMALL_LETTER_U_WITH_DOUBLE_GRAVE 0x0215 -#define LATIN_CAPITAL_LETTER_U_WITH_INVERTED_BREVE 0x0216 -#define LATIN_SMALL_LETTER_U_WITH_INVERTED_BREVE 0x0217 -#define LATIN_CAPITAL_LETTER_S_WITH_COMMA_BELOW 0x0218 -#define LATIN_SMALL_LETTER_S_WITH_COMMA_BELOW 0x0219 -#define LATIN_CAPITAL_LETTER_T_WITH_COMMA_BELOW 0x021A -#define LATIN_SMALL_LETTER_T_WITH_COMMA_BELOW 0x021B -#define LATIN_CAPITAL_LETTER_YOGH 0x021C -#define LATIN_SMALL_LETTER_YOGH 0x021D -#define LATIN_CAPITAL_LETTER_H_WITH_CARON 0x021E -#define LATIN_SMALL_LETTER_H_WITH_CARON 0x021F -#define LATIN_CAPITAL_LETTER_OU 0x0222 -#define LATIN_SMALL_LETTER_OU 0x0223 -#define LATIN_CAPITAL_LETTER_Z_WITH_HOOK 0x0224 -#define LATIN_SMALL_LETTER_Z_WITH_HOOK 0x0225 -#define LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE 0x0226 -#define LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE 0x0227 -#define LATIN_CAPITAL_LETTER_E_WITH_CEDILLA 0x0228 -#define LATIN_SMALL_LETTER_E_WITH_CEDILLA 0x0229 -#define LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS_AND_MACRON 0x022A -#define LATIN_SMALL_LETTER_O_WITH_DIAERESIS_AND_MACRON 0x022B -#define LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_MACRON 0x022C -#define LATIN_SMALL_LETTER_O_WITH_TILDE_AND_MACRON 0x022D -#define LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE 0x022E -#define LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE 0x022F -#define LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON 0x0230 -#define LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON 0x0231 -#define LATIN_CAPITAL_LETTER_Y_WITH_MACRON 0x0232 -#define LATIN_SMALL_LETTER_Y_WITH_MACRON 0x0233 - -/* IPA extensions */ -#define LATIN_SMALL_LETTER_TURNED_A 0x0250 -#define LATIN_SMALL_LETTER_ALPHA 0x0251 -#define LATIN_SMALL_LETTER_TURNED_ALPHA 0x0252 -#define LATIN_SMALL_LETTER_B_WITH_HOOK 0x0253 -#define LATIN_SMALL_LETTER_OPEN_O 0x0254 -#define LATIN_SMALL_LETTER_C_WITH_CURL 0x0255 -#define LATIN_SMALL_LETTER_D_WITH_TAIL 0x0256 -#define LATIN_SMALL_LETTER_D_WITH_HOOK 0x0257 -#define LATIN_SMALL_LETTER_REVERSED_E 0x0258 -#define LATIN_SMALL_LETTER_SCHWA 0x0259 -#define LATIN_SMALL_LETTER_SCHWA_WITH_HOOK 0x025A -#define LATIN_SMALL_LETTER_OPEN_E 0x025B -#define LATIN_SMALL_LETTER_REVERSED_OPEN_E 0x025C -#define LATIN_SMALL_LETTER_REVERSED_OPEN_E_WITH_HOOK 0x025D -#define LATIN_SMALL_LETTER_CLOSED_REVERSED_OPEN_E 0x025E -#define LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE 0x025F -#define LATIN_SMALL_LETTER_G_WITH_HOOK 0x0260 -#define LATIN_SMALL_LETTER_SCRIPT_G 0x0261 -#define LATIN_LETTER_SMALL_CAPITAL_G 0x0262 -#define LATIN_SMALL_LETTER_GAMMA 0x0263 -#define LATIN_SMALL_LETTER_RAMS_HORN 0x0264 -#define LATIN_SMALL_LETTER_TURNED_H 0x0265 -#define LATIN_SMALL_LETTER_H_WITH_HOOK 0x0266 -#define LATIN_SMALL_LETTER_HENG_WITH_HOOK 0x0267 -#define LATIN_SMALL_LETTER_I_WITH_STROKE 0x0268 -#define LATIN_SMALL_LETTER_IOTA 0x0269 -#define LATIN_LETTER_SMALL_CAPITAL_I 0x026A -#define LATIN_SMALL_LETTER_L_WITH_MIDDLE_TILDE 0x026B -#define LATIN_SMALL_LETTER_L_WITH_BELT 0x026C -#define LATIN_SMALL_LETTER_L_WITH_RETROFLEX_HOOK 0x026D -#define LATIN_SMALL_LETTER_LEZH 0x026E -#define LATIN_SMALL_LETTER_TURNED_M 0x026F -#define LATIN_SMALL_LETTER_TURNED_M_WITH_LONG_LEG 0x0270 -#define LATIN_SMALL_LETTER_M_WITH_HOOK 0x0271 -#define LATIN_SMALL_LETTER_N_WITH_LEFT_HOOK 0x0272 -#define LATIN_SMALL_LETTER_N_WITH_RETROFLEX_HOOK 0x0273 -#define LATIN_LETTER_SMALL_CAPITAL_N 0x0274 -#define LATIN_SMALL_LETTER_BARRED_O 0x0275 -#define LATIN_LETTER_SMALL_CAPITAL_OE 0x0276 -#define LATIN_SMALL_LETTER_CLOSED_OMEGA 0x0277 -#define LATIN_SMALL_LETTER_PHI 0x0278 -#define LATIN_SMALL_LETTER_TURNED_R 0x0279 -#define LATIN_SMALL_LETTER_TURNED_R_WITH_LONG_LEG 0x027A -#define LATIN_SMALL_LETTER_TURNED_R_WITH_HOOK 0x027B -#define LATIN_SMALL_LETTER_R_WITH_LONG_LEG 0x027C -#define LATIN_SMALL_LETTER_R_WITH_TAIL 0x027D -#define LATIN_SMALL_LETTER_R_WITH_FISHHOOK 0x027E -#define LATIN_SMALL_LETTER_REVERSED_R_WITH_FISHHOOK 0x027F -#define LATIN_LETTER_SMALL_CAPITAL_R 0x0280 -#define LATIN_LETTER_SMALL_CAPITAL_INVERTED_R 0x0281 -#define LATIN_SMALL_LETTER_S_WITH_HOOK 0x0282 -#define LATIN_SMALL_LETTER_ESH 0x0283 -#define LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE_AND_HOOK 0x0284 -#define LATIN_SMALL_LETTER_SQUAT_REVERSED_ESH 0x0285 -#define LATIN_SMALL_LETTER_ESH_WITH_CURL 0x0286 -#define LATIN_SMALL_LETTER_TURNED_T 0x0287 -#define LATIN_SMALL_LETTER_T_WITH_RETROFLEX_HOOK 0x0288 -#define LATIN_SMALL_LETTER_U_BAR 0x0289 -#define LATIN_SMALL_LETTER_UPSILON 0x028A -#define LATIN_SMALL_LETTER_V_WITH_HOOK 0x028B -#define LATIN_SMALL_LETTER_TURNED_V 0x028C -#define LATIN_SMALL_LETTER_TURNED_W 0x028D -#define LATIN_SMALL_LETTER_TURNED_Y 0x028E -#define LATIN_LETTER_SMALL_CAPITAL_Y 0x028F -#define LATIN_SMALL_LETTER_Z_WITH_RETROFLEX_HOOK 0x0290 -#define LATIN_SMALL_LETTER_Z_WITH_CURL 0x0291 -#define LATIN_SMALL_LETTER_EZH 0x0292 -#define LATIN_SMALL_LETTER_EZH_WITH_CURL 0x0293 -#define LATIN_LETTER_GLOTTAL_STOP 0x0294 -#define LATIN_LETTER_PHARYNGEAL_VOICED_FRICATIVE 0x0295 -#define LATIN_LETTER_INVERTED_GLOTTAL_STOP 0x0296 -#define LATIN_LETTER_STRETCHED_C 0x0297 -#define LATIN_LETTER_BILABIAL_CLICK 0x0298 -#define LATIN_LETTER_SMALL_CAPITAL_B 0x0299 -#define LATIN_SMALL_LETTER_CLOSED_OPEN_E 0x029A -#define LATIN_LETTER_SMALL_CAPITAL_G_WITH_HOOK 0x029B -#define LATIN_LETTER_SMALL_CAPITAL_H 0x029C -#define LATIN_SMALL_LETTER_J_WITH_CROSSED_TAIL 0x029D -#define LATIN_SMALL_LETTER_TURNED_K 0x029E -#define LATIN_LETTER_SMALL_CAPITAL_L 0x029F -#define LATIN_SMALL_LETTER_Q_WITH_HOOK 0x02A0 -#define LATIN_LETTER_GLOTTAL_STOP_WITH_STROKE 0x02A1 -#define LATIN_LETTER_REVERSED_GLOTTAL_STOP_WITH_STROKE 0x02A2 -#define LATIN_SMALL_LETTER_DZ_DIGRAPH 0x02A3 -#define LATIN_SMALL_LETTER_DEZH_DIGRAPH 0x02A4 -#define LATIN_SMALL_LETTER_DZ_DIGRAPH_WITH_CURL 0x02A5 -#define LATIN_SMALL_LETTER_TS_DIGRAPH 0x02A6 -#define LATIN_SMALL_LETTER_TESH_DIGRAPH 0x02A7 -#define LATIN_SMALL_LETTER_TC_DIGRAPH_WITH_CURL 0x02A8 -#define LATIN_SMALL_LETTER_FENG_DIGRAPH 0x02A9 -#define LATIN_SMALL_LETTER_LS_DIGRAPH 0x02AA -#define LATIN_SMALL_LETTER_LZ_DIGRAPH 0x02AB -#define LATIN_LETTER_BILABIAL_PERCUSSIVE 0x02AC -#define LATIN_LETTER_BIDENTAL_PERCUSSIVE 0x02AD - -/* spacing modifier letters */ -#define MODIFIER_LETTER_SMALL_H 0x02B0 -#define MODIFIER_LETTER_SMALL_H_WITH_HOOK 0x02B1 -#define MODIFIER_LETTER_SMALL_J 0x02B2 -#define MODIFIER_LETTER_SMALL_R 0x02B3 -#define MODIFIER_LETTER_SMALL_TURNED_R 0x02B4 -#define MODIFIER_LETTER_SMALL_TURNED_R_WITH_HOOK 0x02B5 -#define MODIFIER_LETTER_SMALL_CAPITAL_INVERTED_R 0x02B6 -#define MODIFIER_LETTER_SMALL_W 0x02B7 -#define MODIFIER_LETTER_SMALL_Y 0x02B8 -#define MODIFIER_LETTER_PRIME 0x02B9 -#define MODIFIER_LETTER_DOUBLE_PRIME 0x02BA -#define MODIFIER_LETTER_TURNED_COMMA 0x02BB -#define MODIFIER_LETTER_APOSTROPHE 0x02BC -#define MODIFIER_LETTER_REVERSED_COMMA 0x02BD -#define MODIFIER_LETTER_RIGHT_HALF_RING 0x02BE -#define MODIFIER_LETTER_LEFT_HALF_RING 0x02BF -#define MODIFIER_LETTER_GLOTTAL_STOP 0x02C0 -#define MODIFIER_LETTER_REVERSED_GLOTTAL_STOP 0x02C1 -#define MODIFIER_LETTER_LEFT_ARROWHEAD 0x02C2 -#define MODIFIER_LETTER_RIGHT_ARROWHEAD 0x02C3 -#define MODIFIER_LETTER_UP_ARROWHEAD 0x02C4 -#define MODIFIER_LETTER_DOWN_ARROWHEAD 0x02C5 -#define MODIFIER_LETTER_CIRCUMFLEX_ACCENT 0x02C6 -#define CARON 0x02C7 -#define MODIFIER_LETTER_VERTICAL_LINE 0x02C8 -#define MODIFIER_LETTER_MACRON 0x02C9 -#define MODIFIER_LETTER_ACUTE_ACCENT 0x02CA -#define MODIFIER_LETTER_GRAVE_ACCENT 0x02CB -#define MODIFIER_LETTER_LOW_VERTICAL_LINE 0x02CC -#define MODIFIER_LETTER_LOW_MACRON 0x02CD -#define MODIFIER_LETTER_LOW_GRAVE_ACCENT 0x02CE -#define MODIFIER_LETTER_LOW_ACUTE_ACCENT 0x02CF -#define MODIFIER_LETTER_TRIANGULAR_COLON 0x02D0 -#define MODIFIER_LETTER_HALF_TRIANGULAR_COLON 0x02D1 -#define MODIFIER_LETTER_CENTRED_RIGHT_HALF_RING 0x02D2 -#define MODIFIER_LETTER_CENTRED_LEFT_HALF_RING 0x02D3 -#define MODIFIER_LETTER_UP_TACK 0x02D4 -#define MODIFIER_LETTER_DOWN_TACK 0x02D5 -#define MODIFIER_LETTER_PLUS_SIGN 0x02D6 -#define MODIFIER_LETTER_MINUS_SIGN 0x02D7 -#define BREVE 0x02D8 -#define DOT_ABOVE 0x02D9 -#define RING_ABOVE 0x02DA -#define OGONEK 0x02DB -#define SMALL_TILDE 0x02DC -#define DOUBLE_ACUTE_ACCENT 0x02DD -#define MODIFIER_LETTER_RHOTIC_HOOK 0x02DE -#define MODIFIER_LETTER_CROSS_ACCENT 0x02DF -#define MODIFIER_LETTER_SMALL_GAMMA 0x02E0 -#define MODIFIER_LETTER_SMALL_L 0x02E1 -#define MODIFIER_LETTER_SMALL_S 0x02E2 -#define MODIFIER_LETTER_SMALL_X 0x02E3 -#define MODIFIER_LETTER_SMALL_REVERSED_GLOTTAL_STOP 0x02E4 -#define MODIFIER_LETTER_EXTRA_HIGH_TONE_BAR 0x02E5 -#define MODIFIER_LETTER_HIGH_TONE_BAR 0x02E6 -#define MODIFIER_LETTER_MID_TONE_BAR 0x02E7 -#define MODIFIER_LETTER_LOW_TONE_BAR 0x02E8 -#define MODIFIER_LETTER_EXTRA_LOW_TONE_BAR 0x02E9 -#define MODIFIER_LETTER_YIN_DEPARTING_TONE_MARK 0x02EA -#define MODIFIER_LETTER_YANG_DEPARTING_TONE_MARK 0x02EB -#define MODIFIER_LETTER_VOICING 0x02EC -#define MODIFIER_LETTER_UNASPIRATED 0x02ED -#define MODIFIER_LETTER_DOUBLE_APOSTROPHE 0x02EE - -/* combining diacritical marks */ -#define COMBINING_GRAVE_ACCENT 0x0300 -#define COMBINING_ACUTE_ACCENT 0x0301 -#define COMBINING_CIRCUMFLEX_ACCENT 0x0302 -#define COMBINING_TILDE 0x0303 -#define COMBINING_MACRON 0x0304 -#define COMBINING_OVERLINE 0x0305 -#define COMBINING_BREVE 0x0306 -#define COMBINING_DOT_ABOVE 0x0307 -#define COMBINING_DIAERESIS 0x0308 -#define COMBINING_HOOK_ABOVE 0x0309 -#define COMBINING_RING_ABOVE 0x030A -#define COMBINING_DOUBLE_ACUTE_ACCENT 0x030B -#define COMBINING_CARON 0x030C -#define COMBINING_VERTICAL_LINE_ABOVE 0x030D -#define COMBINING_DOUBLE_VERTICAL_LINE_ABOVE 0x030E -#define COMBINING_DOUBLE_GRAVE_ACCENT 0x030F -#define COMBINING_CANDRABINDU 0x0310 -#define COMBINING_INVERTED_BREVE 0x0311 -#define COMBINING_TURNED_COMMA_ABOVE 0x0312 -#define COMBINING_COMMA_ABOVE 0x0313 -#define COMBINING_REVERSED_COMMA_ABOVE 0x0314 -#define COMBINING_COMMA_ABOVE_RIGHT 0x0315 -#define COMBINING_GRAVE_ACCENT_BELOW 0x0316 -#define COMBINING_ACUTE_ACCENT_BELOW 0x0317 -#define COMBINING_LEFT_TACK_BELOW 0x0318 -#define COMBINING_RIGHT_TACK_BELOW 0x0319 -#define COMBINING_LEFT_ANGLE_ABOVE 0x031A -#define COMBINING_HORN 0x031B -#define COMBINING_LEFT_HALF_RING_BELOW 0x031C -#define COMBINING_UP_TACK_BELOW 0x031D -#define COMBINING_DOWN_TACK_BELOW 0x031E -#define COMBINING_PLUS_SIGN_BELOW 0x031F -#define COMBINING_MINUS_SIGN_BELOW 0x0320 -#define COMBINING_PALATALIZED_HOOK_BELOW 0x0321 -#define COMBINING_RETROFLEX_HOOK_BELOW 0x0322 -#define COMBINING_DOT_BELOW 0x0323 -#define COMBINING_DIAERESIS_BELOW 0x0324 -#define COMBINING_RING_BELOW 0x0325 -#define COMBINING_COMMA_BELOW 0x0326 -#define COMBINING_CEDILLA 0x0327 -#define COMBINING_OGONEK 0x0328 -#define COMBINING_VERTICAL_LINE_BELOW 0x0329 -#define COMBINING_BRIDGE_BELOW 0x032A -#define COMBINING_INVERTED_DOUBLE_ARCH_BELOW 0x032B -#define COMBINING_CARON_BELOW 0x032C -#define COMBINING_CIRCUMFLEX_ACCENT_BELOW 0x032D -#define COMBINING_BREVE_BELOW 0x032E -#define COMBINING_INVERTED_BREVE_BELOW 0x032F -#define COMBINING_TILDE_BELOW 0x0330 -#define COMBINING_MACRON_BELOW 0x0331 -#define COMBINING_LOW_LINE 0x0332 -#define COMBINING_DOUBLE_LOW_LINE 0x0333 -#define COMBINING_TILDE_OVERLAY 0x0334 -#define COMBINING_SHORT_STROKE_OVERLAY 0x0335 -#define COMBINING_LONG_STROKE_OVERLAY 0x0336 -#define COMBINING_SHORT_SOLIDUS_OVERLAY 0x0337 -#define COMBINING_LONG_SOLIDUS_OVERLAY 0x0338 -#define COMBINING_RIGHT_HALF_RING_BELOW 0x0339 -#define COMBINING_INVERTED_BRIDGE_BELOW 0x033A -#define COMBINING_SQUARE_BELOW 0x033B -#define COMBINING_SEAGULL_BELOW 0x033C -#define COMBINING_X_ABOVE 0x033D -#define COMBINING_VERTICAL_TILDE 0x033E -#define COMBINING_DOUBLE_OVERLINE 0x033F -#define COMBINING_GRAVE_TONE_MARK 0x0340 -#define COMBINING_ACUTE_TONE_MARK 0x0341 -#define COMBINING_GREEK_PERISPOMENI 0x0342 -#define COMBINING_GREEK_KORONIS 0x0343 -#define COMBINING_GREEK_DIALYTIKA_TONOS 0x0344 -#define COMBINING_GREEK_YPOGEGRAMMENI 0x0345 -#define COMBINING_BRIDGE_ABOVE 0x0346 -#define COMBINING_EQUALS_SIGN_BELOW 0x0347 -#define COMBINING_DOUBLE_VERTICAL_LINE_BELOW 0x0348 -#define COMBINING_LEFT_ANGLE_BELOW 0x0349 -#define COMBINING_NOT_TILDE_ABOVE 0x034A -#define COMBINING_HOMOTHETIC_ABOVE 0x034B -#define COMBINING_ALMOST_EQUAL_TO_ABOVE 0x034C -#define COMBINING_LEFT_RIGHT_ARROW_BELOW 0x034D -#define COMBINING_UPWARDS_ARROW_BELOW 0x034E -#define COMBINING_DOUBLE_TILDE 0x0360 -#define COMBINING_DOUBLE_INVERTED_BREVE 0x0361 -#define COMBINING_DOUBLE_RIGHTWARDS_ARROW_BELOW 0x0362 - -/* greek letters */ -#define GREEK_NUMERAL_SIGN 0x0374 -#define GREEK_LOWER_NUMERAL_SIGN 0x0375 -#define GREEK_YPOGEGRAMMENI 0x037A -#define GREEK_QUESTION_MARK 0x037E -#define GREEK_TONOS 0x0384 -#define GREEK_DIALYTIKA_TONOS 0x0385 -#define GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS 0x0386 -#define GREEK_ANO_TELEIA 0x0387 -#define GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS 0x0388 -#define GREEK_CAPITAL_LETTER_ETA_WITH_TONOS 0x0389 -#define GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS 0x038A -#define GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS 0x038C -#define GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS 0x038E -#define GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS 0x038F -#define GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS 0x0390 -#define GREEK_CAPITAL_LETTER_ALPHA 0x0391 -#define GREEK_CAPITAL_LETTER_BETA 0x0392 -#define GREEK_CAPITAL_LETTER_GAMMA 0x0393 -#define GREEK_CAPITAL_LETTER_DELTA 0x0394 -#define GREEK_CAPITAL_LETTER_EPSILON 0x0395 -#define GREEK_CAPITAL_LETTER_ZETA 0x0396 -#define GREEK_CAPITAL_LETTER_ETA 0x0397 -#define GREEK_CAPITAL_LETTER_THETA 0x0398 -#define GREEK_CAPITAL_LETTER_IOTA 0x0399 -#define GREEK_CAPITAL_LETTER_KAPPA 0x039A -#define GREEK_CAPITAL_LETTER_LAMDA 0x039B -#define GREEK_CAPITAL_LETTER_MU 0x039C -#define GREEK_CAPITAL_LETTER_NU 0x039D -#define GREEK_CAPITAL_LETTER_XI 0x039E -#define GREEK_CAPITAL_LETTER_OMICRON 0x039F -#define GREEK_CAPITAL_LETTER_PI 0x03A0 -#define GREEK_CAPITAL_LETTER_RHO 0x03A1 -#define GREEK_CAPITAL_LETTER_SIGMA 0x03A3 -#define GREEK_CAPITAL_LETTER_TAU 0x03A4 -#define GREEK_CAPITAL_LETTER_UPSILON 0x03A5 -#define GREEK_CAPITAL_LETTER_PHI 0x03A6 -#define GREEK_CAPITAL_LETTER_CHI 0x03A7 -#define GREEK_CAPITAL_LETTER_PSI 0x03A8 -#define GREEK_CAPITAL_LETTER_OMEGA 0x03A9 -#define GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA 0x03AA -#define GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA 0x03AB -#define GREEK_SMALL_LETTER_ALPHA_WITH_TONOS 0x03AC -#define GREEK_SMALL_LETTER_EPSILON_WITH_TONOS 0x03AD -#define GREEK_SMALL_LETTER_ETA_WITH_TONOS 0x03AE -#define GREEK_SMALL_LETTER_IOTA_WITH_TONOS 0x03AF -#define GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS 0x03B0 -#define GREEK_SMALL_LETTER_ALPHA 0x03B1 -#define GREEK_SMALL_LETTER_BETA 0x03B2 -#define GREEK_SMALL_LETTER_GAMMA 0x03B3 -#define GREEK_SMALL_LETTER_DELTA 0x03B4 -#define GREEK_SMALL_LETTER_EPSILON 0x03B5 -#define GREEK_SMALL_LETTER_ZETA 0x03B6 -#define GREEK_SMALL_LETTER_ETA 0x03B7 -#define GREEK_SMALL_LETTER_THETA 0x03B8 -#define GREEK_SMALL_LETTER_IOTA 0x03B9 -#define GREEK_SMALL_LETTER_KAPPA 0x03BA -#define GREEK_SMALL_LETTER_LAMDA 0x03BB -#define GREEK_SMALL_LETTER_MU 0x03BC -#define GREEK_SMALL_LETTER_NU 0x03BD -#define GREEK_SMALL_LETTER_XI 0x03BE -#define GREEK_SMALL_LETTER_OMICRON 0x03BF -#define GREEK_SMALL_LETTER_PI 0x03C0 -#define GREEK_SMALL_LETTER_RHO 0x03C1 -#define GREEK_SMALL_LETTER_FINAL_SIGMA 0x03C2 -#define GREEK_SMALL_LETTER_SIGMA 0x03C3 -#define GREEK_SMALL_LETTER_TAU 0x03C4 -#define GREEK_SMALL_LETTER_UPSILON 0x03C5 -#define GREEK_SMALL_LETTER_PHI 0x03C6 -#define GREEK_SMALL_LETTER_CHI 0x03C7 -#define GREEK_SMALL_LETTER_PSI 0x03C8 -#define GREEK_SMALL_LETTER_OMEGA 0x03C9 -#define GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA 0x03CA -#define GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA 0x03CB -#define GREEK_SMALL_LETTER_OMICRON_WITH_TONOS 0x03CC -#define GREEK_SMALL_LETTER_UPSILON_WITH_TONOS 0x03CD -#define GREEK_SMALL_LETTER_OMEGA_WITH_TONOS 0x03CE -#define GREEK_BETA_SYMBOL 0x03D0 -#define GREEK_THETA_SYMBOL 0x03D1 -#define GREEK_UPSILON_WITH_HOOK_SYMBOL 0x03D2 -#define GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL 0x03D3 -#define GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL 0x03D4 -#define GREEK_PHI_SYMBOL 0x03D5 -#define GREEK_PI_SYMBOL 0x03D6 -#define GREEK_KAI_SYMBOL 0x03D7 -#define GREEK_LETTER_STIGMA 0x03DA -#define GREEK_SMALL_LETTER_STIGMA 0x03DB -#define GREEK_LETTER_DIGAMMA 0x03DC -#define GREEK_SMALL_LETTER_DIGAMMA 0x03DD -#define GREEK_LETTER_KOPPA 0x03DE -#define GREEK_SMALL_LETTER_KOPPA 0x03DF -#define GREEK_LETTER_SAMPI 0x03E0 -#define GREEK_SMALL_LETTER_SAMPI 0x03E1 - -/* general punctuation (partial) */ -#define HYPHEN 0x2010 -#define NON_BREAKING_HYPHEN 0x2011 -#define FIGURE_DASH 0x2012 -#define EN_DASH 0x2013 -#define EM_DASH 0x2014 -#define HORIZONTAL_BAR 0x2015 -#define LEFT_SINGLE_QUOTATION_MARK 0x2018 -#define RIGHT_SINGLE_QUOTATION_MARK 0x2019 -#define SINGLE_LOW_9_QUOTATION_MARK 0x201A -#define SINGLE_HIGH_REVERSED_9_QUOTATION_MARK 0x201B -#define LEFT_DOUBLE_QUOTATION_MARK 0x201C -#define RIGHT_DOUBLE_QUOTATION_MARK 0x201D -#define DOUBLE_LOW_9_QUOTATION_MARK 0x201E -#define DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK 0x201F -#define DAGGER 0x2020 -#define DOUBLE_DAGGER 0x2021 -#define BULLET 0x2022 -#define TRIANGULAR_BULLET 0x2023 -#define HYPHENATION_POINT 0x2027 -#define HORIZONTAL_ELLIPSIS 0x2026 -#define PER_MILLE_SIGN 0x2030 -#define SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK 0x2039 -#define SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK 0x203A -#define EURO_CURRENCY_SIGN 0x20AC - -/* mathematical operators */ -#define FOR_ALL 0x2200 -#define COMPLEMENT 0x2201 -#define PARTIAL_DIFFERENTIAL 0x2202 -#define THERE_EXISTS 0x2203 -#define THERE_DOES_NOT_EXIST 0x2204 -#define EMPTY_SET 0x2205 -#define INCREMENT 0x2206 -#define NABLA 0x2207 -#define ELEMENT_OF 0x2208 -#define NOT_AN_ELEMENT_OF 0x2209 -#define SMALL_ELEMENT_OF 0x220A -#define CONTAINS_AS_MEMBER 0x220B -#define DOES_NOT_CONTAIN_AS_MEMBER 0x220C -#define SMALL_CONTAINS_AS_MEMBER 0x220D -#define END_OF_PROOF 0x220E -#define N_ARY_PRODUCT 0x220F -#define N_ARY_COPRODUCT 0x2210 -#define N_ARY_SUMMATION 0x2211 -#define MINUS_SIGN 0x2212 -#define MINUS_OR_PLUS_SIGN 0x2213 -#define DOT_PLUS 0x2214 -#define DIVISION_SLASH 0x2215 -#define SET_MINUS 0x2216 -#define ASTERISK_OPERATOR 0x2217 -#define RING_OPERATOR 0x2218 -#define BULLET_OPERATOR 0x2219 -#define SQUARE_ROOT 0x221A -#define CUBE_ROOT 0x221B -#define FOURTH_ROOT 0x221C -#define PROPORTIONAL_TO 0x221D -/* INFINITY conflicts with math.h */ -#define INFINITY 0x221E -#define RIGHT_ANGLE 0x221F -#define ANGLE 0x2220 -#define MEASURED_ANGLE 0x2221 -#define SPHERICAL_ANGLE 0x2222 -#define DIVIDES 0x2223 -#define DOES_NOT_DIVIDE 0x2224 -#define PARALLEL_TO 0x2225 -#define NOT_PARALLEL_TO 0x2226 -#define LOGICAL_AND 0x2227 -#define LOGICAL_OR 0x2228 -#define INTERSECTION 0x2229 -#define UNION 0x222A -#define INTEGRAL 0x222B -#define DOUBLE_INTEGRAL 0x222C -#define TRIPLE_INTEGRAL 0x222D -#define CONTOUR_INTEGRAL 0x222E -#define SURFACE_INTEGRAL 0x222F -#define VOLUME_INTEGRAL 0x2230 -#define CLOCKWISE_INTEGRAL 0x2231 -#define CLOCKWISE_CONTOUR_INTEGRAL 0x2232 -#define ANTICLOCKWISE_CONTOUR_INTEGRAL 0x2233 -#define THEREFORE 0x2234 -#define BECAUSE 0x2235 -#define RATIO 0x2236 -#define PROPORTION 0x2237 -#define DOT_MINUS 0x2238 -#define EXCESS 0x2239 -#define GEOMETRIC_PROPORTION 0x223A -#define HOMOTHETIC 0x223B -#define TILDE_OPERATOR 0x223C -#define REVERSED_TILDE 0x223D -#define INVERTED_LAZY_S 0x223E -#define SINE_WAVE 0x223F -#define WREATH_PRODUCT 0x2240 -#define NOT_TILDE 0x2241 -#define MINUS_TILDE 0x2242 -#define ASYMPTOTICALLY_EQUAL_TO 0x2243 -#define NOT_ASYMPTOTICALLY_EQUAL_TO 0x2244 -#define APPROXIMATELY_EQUAL_TO 0x2245 -#define APPROXIMATELY_BUT_NOT_ACTUALLY_EQUAL_TO 0x2246 -#define NEITHER_APPROXIMATELY_NOR_ACTUALLY_EQUAL_TO 0x2247 -#define ALMOST_EQUAL_TO 0x2248 -#define NOT_ALMOST_EQUAL_TO 0x2249 -#define ALMOST_EQUAL_OR_EQUAL_TO 0x224A -#define TRIPLE_TILDE 0x224B -#define ALL_EQUAL_TO 0x224C -#define EQUIVALENT_TO 0x224D -#define GEOMETRICALLY_EQUIVALENT_TO 0x224E -#define DIFFERENCE_BETWEEN 0x224F -#define APPROACHES_THE_LIMIT 0x2250 -#define GEOMETRICALLY_EQUAL_TO 0x2251 -#define APPROXIMATELY_EQUAL_TO_OR_THE_IMAGE_OF 0x2252 -#define IMAGE_OF_OR_APPROXIMATELY_EQUAL_TO 0x2253 -#define COLON_EQUALS 0x2254 -#define EQUALS_COLON 0x2255 -#define RING_IN_EQUAL_TO 0x2256 -#define RING_EQUAL_TO 0x2257 -#define CORRESPONDS_TO 0x2258 -#define ESTIMATES 0x2259 -#define EQUIANGULAR_TO 0x225A -#define STAR_EQUALS 0x225B -#define DELTA_EQUAL_TO 0x225C -#define EQUAL_TO_BY_DEFINITION 0x225D -#define MEASURED_BY 0x225E -#define QUESTIONED_EQUAL_TO 0x225F -#define NOT_EQUAL_TO 0x2260 -#define IDENTICAL_TO 0x2261 -#define NOT_IDENTICAL_TO 0x2262 -#define STRICTLY_EQUIVALENT_TO 0x2263 -#define LESS_THAN_OR_EQUAL_TO 0x2264 -#define GREATER_THAN_OR_EQUAL_TO 0x2265 -#define LESS_THAN_OVER_EQUAL_TO 0x2266 -#define GREATER_THAN_OVER_EQUAL_TO 0x2267 -#define LESS_THAN_BUT_NOT_EQUAL_TO 0x2268 -#define GREATER_THAN_BUT_NOT_EQUAL_TO 0x2269 -#define MUCH_LESS_THAN 0x226A -#define MUCH_GREATER_THAN 0x226B -#define BETWEEN 0x226C -#define NOT_EQUIVALENT_TO 0x226D -#define NOT_LESS_THAN 0x226E -#define NOT_GREATER_THAN 0x226F -#define NEITHER_LESS_THAN_NOR_EQUAL_TO 0x2270 -#define NEITHER_GREATER_THAN_NOR_EQUAL_TO 0x2271 -#define LESS_THAN_OR_EQUIVALENT_TO 0x2272 -#define GREATER_THAN_OR_EQUIVALENT_TO 0x2273 -#define NEITHER_LESS_THAN_NOR_EQUIVALENT_TO 0x2274 -#define NEITHER_GREATER_THAN_NOR_EQUIVALENT_TO 0x2275 -#define LESS_THAN_OR_GREATER_THAN 0x2276 -#define GREATER_THAN_OR_LESS_THAN 0x2277 -#define NEITHER_LESS_THAN_NOR_GREATER_THAN 0x2278 -#define NEITHER_GREATER_THAN_NOR_LESS_THAN 0x2279 -#define PRECEDES 0x227A -#define SUCCEEDS 0x227B -#define PRECEDES_OR_EQUAL_TO 0x227C -#define SUCCEEDS_OR_EQUAL_TO 0x227D -#define PRECEDES_OR_EQUIVALENT_TO 0x227E -#define SUCCEEDS_OR_EQUIVALENT_TO 0x227F -#define DOES_NOT_PRECEDE 0x2280 -#define DOES_NOT_SUCCEED 0x2281 -#define SUBSET_OF 0x2282 -#define SUPERSET_OF 0x2283 -#define NOT_A_SUBSET_OF 0x2284 -#define NOT_A_SUPERSET_OF 0x2285 -#define SUBSET_OF_OR_EQUAL_TO 0x2286 -#define SUPERSET_OF_OR_EQUAL_TO 0x2287 -#define NEITHER_A_SUBSET_OF_NOR_EQUAL_TO 0x2288 -#define NEITHER_A_SUPERSET_OF_NOR_EQUAL_TO 0x2289 -#define SUBSET_OF_WITH_NOT_EQUAL_TO 0x228A -#define SUPERSET_OF_WITH_NOT_EQUAL_TO 0x228B -#define MULTISET 0x228C -#define MULTISET_MULTIPLICATION 0x228D -#define MULTISET_UNION 0x228E -#define SQUARE_IMAGE_OF 0x228F -#define SQUARE_ORIGINAL_OF 0x2290 -#define SQUARE_IMAGE_OF_OR_EQUAL_TO 0x2291 -#define SQUARE_ORIGINAL_OF_OR_EQUAL_TO 0x2292 -#define SQUARE_CAP 0x2293 -#define SQUARE_CUP 0x2294 -#define CIRCLED_PLUS 0x2295 -#define CIRCLED_MINUS 0x2296 -#define CIRCLED_TIMES 0x2297 -#define CIRCLED_DIVISION_SLASH 0x2298 -#define CIRCLED_DOT_OPERATOR 0x2299 -#define CIRCLED_RING_OPERATOR 0x229A -#define CIRCLED_ASTERISK_OPERATOR 0x229B -#define CIRCLED_EQUALS 0x229C -#define CIRCLED_DASH 0x229D -#define SQUARED_PLUS 0x229E -#define SQUARED_MINUS 0x229F -#define SQUARED_TIMES 0x22A0 -#define SQUARED_DOT_OPERATOR 0x22A1 -#define RIGHT_TACK 0x22A2 -#define LEFT_TACK 0x22A3 -#define DOWN_TACK 0x22A4 -#define UP_TACK 0x22A5 -#define ASSERTION 0x22A6 -#define MODELS 0x22A7 -#define TRUEx 0x22A8 -#define FORCES 0x22A9 -#define TRIPLE_VERTICAL_BAR_RIGHT_TURNSTILE 0x22AA -#define DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE 0x22AB -#define DOES_NOT_PROVE 0x22AC -#define NOT_TRUE 0x22AD -#define DOES_NOT_FORCE 0x22AE -#define NEGATED_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE 0x22AF -#define PRECEDES_UNDER_RELATION 0x22B0 -#define SUCCEEDS_UNDER_RELATION 0x22B1 -#define NORMAL_SUBGROUP_OF 0x22B2 -#define CONTAINS_AS_NORMAL_SUBGROUP 0x22B3 -#define NORMAL_SUBGROUP_OF_OR_EQUAL_TO 0x22B4 -#define CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO 0x22B5 -#define ORIGINAL_OF 0x22B6 -#define IMAGE_OF 0x22B7 -#define MULTIMAP 0x22B8 -#define HERMITIAN_CONJUGATE_MATRIX 0x22B9 -#define INTERCALATE 0x22BA -#define XOR 0x22BB -#define NAND 0x22BC -#define NOR 0x22BD -#define RIGHT_ANGLE_WITH_ARC 0x22BE -#define RIGHT_TRIANGLE 0x22BF -#define N_ARY_LOGICAL_AND 0x22C0 -#define N_ARY_LOGICAL_OR 0x22C1 -#define N_ARY_INTERSECTION 0x22C2 -#define N_ARY_UNION 0x22C3 -#define DIAMOND_OPERATOR 0x22C4 -#define DOT_OPERATOR 0x22C5 -#define STAR_OPERATOR 0x22C6 -#define DIVISION_TIMES 0x22C7 -#define BOWTIE 0x22C8 -#define LEFT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT 0x22C9 -#define RIGHT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT 0x22CA -#define LEFT_SEMIDIRECT_PRODUCT 0x22CB -#define RIGHT_SEMIDIRECT_PRODUCT 0x22CC -#define REVERSED_TILDE_EQUALS 0x22CD -#define CURLY_LOGICAL_OR 0x22CE -#define CURLY_LOGICAL_AND 0x22CF -#define DOUBLE_SUBSET 0x22D0 -#define DOUBLE_SUPERSET 0x22D1 -#define DOUBLE_INTERSECTION 0x22D2 -#define DOUBLE_UNION 0x22D3 -#define PITCHFORK 0x22D4 -#define EQUAL_AND_PARALLEL_TO 0x22D5 -#define LESS_THAN_WITH_DOT 0x22D6 -#define GREATER_THAN_WITH_DOT 0x22D7 -#define VERY_MUCH_LESS_THAN 0x22D8 -#define VERY_MUCH_GREATER_THAN 0x22D9 -#define LESS_THAN_EQUAL_TO_OR_GREATER_THAN 0x22DA -#define GREATER_THAN_EQUAL_TO_OR_LESS_THAN 0x22DB -#define EQUAL_TO_OR_LESS_THAN 0x22DC -#define EQUAL_TO_OR_GREATER_THAN 0x22DD -#define EQUAL_TO_OR_PRECEDES 0x22DE -#define EQUAL_TO_OR_SUCCEEDS 0x22DF -#define DOES_NOT_PRECEDE_OR_EQUAL 0x22E0 -#define DOES_NOT_SUCCEED_OR_EQUAL 0x22E1 -#define NOT_SQUARE_IMAGE_OF_OR_EQUAL_TO 0x22E2 -#define NOT_SQUARE_ORIGINAL_OF_OR_EQUAL_TO 0x22E3 -#define SQUARE_IMAGE_OF_OR_NOT_EQUAL_TO 0x22E4 -#define SQUARE_ORIGINAL_OF_OR_NOT_EQUAL_TO 0x22E5 -#define LESS_THAN_BUT_NOT_EQUIVALENT_TO 0x22E6 -#define GREATER_THAN_BUT_NOT_EQUIVALENT_TO 0x22E7 -#define PRECEDES_BUT_NOT_EQUIVALENT_TO 0x22E8 -#define SUCCEEDS_BUT_NOT_EQUIVALENT_TO 0x22E9 -#define NOT_NORMAL_SUBGROUP_OF 0x22EA -#define DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP 0x22EB -#define NOT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO 0x22EC -#define DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP_OR_EQUAL 0x22ED -#define VERTICAL_ELLIPSIS 0x22EE -#define MIDLINE_HORIZONTAL_ELLIPSIS 0x22EF -#define UP_RIGHT_DIAGONAL_ELLIPSIS 0x22F0 -#define DOWN_RIGHT_DIAGONAL_ELLIPSIS 0x22F1 - -/* Optical Character Recognition in Unicode (see wikipedia/OCR) - * range: 0x2440-0x245F - */ -#define OCR_Hook 0x2440 -#define OCR_Chair 0x2441 -#define OCR_Fork 0x2442 -#define OCR_Inverted_Fork 0x2443 -#define OCR_Belt_Buckle 0x2444 -#define OCR_Bow_Tie 0x2445 - -/* the following 4 MICR chars (magnetic ink character recognition) - * They look like: |: ,|' ||' ||| (known also as MICR-A,B,C,D) - */ -#define OCR_Branch_Bank_Identification 0x2446 -#define OCR_Amount_Of_Check 0x2447 -#define OCR_Customer_Account_Number 0x2448 -#define OCR_Dash 0x2449 - -#define OCR_Double_Backslash 0x244A - -/* latin ligatures */ -#define LATIN_SMALL_LIGATURE_FF 0xFB00 -#define LATIN_SMALL_LIGATURE_FI 0xFB01 -#define LATIN_SMALL_LIGATURE_FL 0xFB02 -#define LATIN_SMALL_LIGATURE_FFI 0xFB03 -#define LATIN_SMALL_LIGATURE_FFL 0xFB04 -#define LATIN_SMALL_LIGATURE_LONG_S_T 0xFB05 -#define LATIN_SMALL_LIGATURE_ST 0xFB06 - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/graphcut.c b/fluidbook/tools/swftools-special-swfdump/lib/graphcut.c deleted file mode 100644 index f8216b7fa..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/graphcut.c +++ /dev/null @@ -1,679 +0,0 @@ -/* - graphcut- a graphcut implementation based on the Boykov Kolmogorov algorithm - - Part of the swftools package. - - Copyright (c) 2007,2008,2009 Matthias Kramm - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include -#include -#include -#include "graphcut.h" -#include "mem.h" - -//#define DEBUG - -//#define CHECKS - -#ifdef DEBUG -#define DBG -#include -#else -#define DBG if(0) -#define assert(x) (x) -#endif - -#define ACTIVE 0x10 -#define IN_TREE 0x20 - -#define TWOTREES - -typedef struct _posqueue_entry { - node_t*pos; - struct _posqueue_entry*next; -} posqueue_entry_t; - -typedef struct _posqueue { - posqueue_entry_t*list; -} posqueue_t; - -typedef struct _graphcut_workspace { - unsigned char*flags1; - unsigned char*flags2; - halfedge_t**back; - graph_t*graph; - node_t*pos1; - node_t*pos2; - posqueue_t*queue1; - posqueue_t*queue2; - posqueue_t*tmpqueue; -} graphcut_workspace_t; - -static posqueue_t*posqueue_new() -{ - posqueue_t*m = (posqueue_t*)malloc(sizeof(posqueue_t)); - memset(m, 0, sizeof(posqueue_t)); - return m; -} -static void posqueue_delete(posqueue_t*q) -{ - posqueue_entry_t*l = q->list; - while(l) { - posqueue_entry_t*next = l->next; - free(l); - l = next; - } - free(q); -} -static inline void posqueue_addpos(posqueue_t*queue, node_t*pos) -{ - posqueue_entry_t*old = queue->list; - queue->list = malloc(sizeof(posqueue_entry_t)); - queue->list->pos = pos; - queue->list->next = old; -} -static inline node_t* posqueue_extract(posqueue_t*queue) -{ - posqueue_entry_t*item = queue->list; - node_t*pos; - if(!item) - return 0; - pos = item->pos; - queue->list = queue->list->next; - free(item); - return pos; -} -static inline int posqueue_notempty(posqueue_t*queue) -{ - return (int)queue->list; -} - -#define NR(p) ((p)->nr) - -static void posqueue_print(graphcut_workspace_t*w, posqueue_t*queue) -{ - posqueue_entry_t*e = queue->list; - while(e) { - halfedge_t*back = w->back[NR(e->pos)]; - printf("%d(%d) ", NR(e->pos), back?NR(back->fwd->node):-1); - e = e->next; - } - printf("\n"); -} -static void posqueue_purge(posqueue_t*queue) -{ - posqueue_entry_t*e = queue->list; - while(e) { - posqueue_entry_t*next = e->next; - e->next = 0;free(e); - e = next; - } - queue->list = 0; -} - -graph_t* graph_new(int num_nodes) -{ - graph_t*graph = rfx_calloc(sizeof(graph_t)); - graph->num_nodes = num_nodes; - graph->nodes = rfx_calloc(sizeof(node_t)*num_nodes); - int t; - for(t=0;tnodes[t].nr = t; - } - return graph; -} - -void graph_delete(graph_t*graph) -{ - int t; - for(t=0;tnum_nodes;t++) { - halfedge_t*e = graph->nodes[t].edges; - while(e) { - halfedge_t*next = e->next; - free(e); - e = next; - } - } - free(graph->nodes);graph->nodes=0; - free(graph); -} - -static graphcut_workspace_t*graphcut_workspace_new(graph_t*graph, node_t*pos1, node_t*pos2) -{ - graphcut_workspace_t*workspace = malloc(sizeof(graphcut_workspace_t)); - workspace->flags1 = rfx_calloc(graph->num_nodes); - workspace->flags2 = rfx_calloc(graph->num_nodes); - workspace->back = rfx_calloc(graph->num_nodes*sizeof(halfedge_t*)); - workspace->pos1 = pos1; - workspace->pos2 = pos2; - workspace->graph = graph; - workspace->queue1 = posqueue_new(); - workspace->queue2 = posqueue_new(); - workspace->tmpqueue = posqueue_new(); - return workspace; -} -static void graphcut_workspace_delete(graphcut_workspace_t*w) -{ - posqueue_delete(w->queue1);w->queue1=0; - posqueue_delete(w->queue2);w->queue2=0; - posqueue_delete(w->tmpqueue);w->tmpqueue=0; - if(w->flags1) free(w->flags1);w->flags1=0; - if(w->flags2) free(w->flags2);w->flags2=0; - if(w->back) free(w->back);w->back=0; - free(w); -} - -typedef struct _path { - node_t**pos; - halfedge_t**dir; - unsigned char*firsthalf; - int length; -} path_t; - -static path_t*path_new(int len) -{ - path_t*p = malloc(sizeof(path_t)); - p->pos = malloc(sizeof(node_t*)*len); - p->dir = malloc(sizeof(halfedge_t*)*len); - p->firsthalf = malloc(sizeof(unsigned char)*len); - p->length = len; - return p; -} -static void path_delete(path_t*path) -{ - free(path->pos);path->pos = 0; - free(path->dir);path->dir = 0; - free(path->firsthalf);path->firsthalf = 0; - free(path); -} - -static path_t*extract_path(graphcut_workspace_t*work, unsigned char*mytree, unsigned char*othertree, node_t*pos, node_t*newpos, halfedge_t*dir) -{ - int t; - node_t*p = pos; - node_t*nodes = work->graph->nodes; - int len1 = 0; - /* walk up tree1 */ - DBG printf("walk back up (1) to %d\n", NR(work->pos1)); - while(p != work->pos1) { - halfedge_t*back = work->back[NR(p)]; - DBG printf("walk backward (1): %d %d\n", NR(p), back?NR(back->fwd->node):-1); - node_t*old = p; - p = work->back[NR(p)]->fwd->node; - assert(p!=old); - len1++; - } - p = newpos; - int len2 = 0; - DBG printf("walk back up (2) to %d\n", NR(work->pos2)); - /* walk up tree2 */ - while(p != work->pos2) { - DBG printf("walk backward (2): %d\n", NR(p)); - p = work->back[NR(p)]->fwd->node; - len2++; - } - path_t*path = path_new(len1+len2+2); - - t = len1; - path->pos[t] = p = pos; - path->dir[t] = dir; - path->firsthalf[t] = 1; - while(p != work->pos1) { - assert(mytree[NR(p)]&IN_TREE); - halfedge_t*dir = work->back[NR(p)]; - assert(dir->node == p); - p = dir->fwd->node; - t--; - path->pos[t] = p; - path->dir[t] = dir->fwd; - path->firsthalf[t] = 1; - } - assert(!t); - - t = len1+1; - - p = newpos; - while(p != work->pos2) { - assert(othertree[NR(p)]&IN_TREE); - halfedge_t*dir = work->back[NR(p)]; - path->pos[t] = p; - path->dir[t] = dir; - path->firsthalf[t] = 0; - p = dir->fwd->node; - t++; - } - - /* terminator */ - path->pos[t] = p; - path->dir[t] = 0; // last node - path->firsthalf[t] = 0; - - assert(t == len1+len2+1); - return path; -} - -static void path_print(path_t*path) -{ - int t; - for(t=0;tlength;t++) { - node_t*n = path->pos[t]; - printf("%d (firsthalf: %d)", NR(n), path->firsthalf[t]); - if(tlength-1) { - printf(" -(%d/%d)-> \n", - path->dir[t]->used, - path->dir[t]->fwd->used); - } else { - printf("\n"); - } - } - - for(t=0;tlength-1;t++) { - if(path->firsthalf[t]==path->firsthalf[t+1]) { - assert(( path->firsthalf[t] && path->dir[t]->used) || - (!path->firsthalf[t] && path->dir[t]->fwd->used)); - } - } - printf("\n"); -} - - -static void workspace_print(graphcut_workspace_t*w) -{ - printf("queue1: ");posqueue_print(w, w->queue1); - printf("queue2: ");posqueue_print(w, w->queue2); -} - -static void myassert(graphcut_workspace_t*w, char assertion, const char*file, int line, const char*func) -{ - if(!assertion) { - printf("Assertion %s:%d (%s) failed:\n", file, line, func); - workspace_print(w); - exit(0); - } -} - -#define ASSERT(w,c) {myassert(w,c,__FILE__,__LINE__,__func__);} - -static path_t* expand_pos(graphcut_workspace_t*w, posqueue_t*queue, node_t*pos, char reverse, unsigned char*mytree, unsigned char*othertree) -{ - graph_t*graph = w->graph; - int dir; - if((mytree[NR(pos)]&(IN_TREE|ACTIVE)) != (IN_TREE|ACTIVE)) { - /* this node got deleted or marked inactive in the meantime. ignore it */ - DBG printf("node %d is deleted or inactive\n", NR(pos)); - return 0; - } - - halfedge_t*e = pos->edges; - for(;e;e=e->next) { - node_t*newpos = e->fwd->node; - weight_t weight = reverse?e->fwd->weight:e->weight; - if(mytree[NR(newpos)]) continue; // already known - - if(weight) { - if(othertree[NR(newpos)]) { - DBG printf("found connection: %d connects to %d\n", NR(pos), NR(newpos)); - posqueue_addpos(queue, pos); mytree[NR(pos)] |= ACTIVE; // re-add, this vertex might have other connections - - path_t*path; - if(reverse) { - path = extract_path(w, othertree, mytree, newpos, pos, e->fwd); - } else { - path = extract_path(w, mytree, othertree, pos, newpos, e); - } - return path; - } else { - DBG printf("advance from %d to new pos %d\n", NR(pos), NR(newpos)); - w->back[NR(newpos)] = e->fwd; - e->used = 1; - posqueue_addpos(queue, newpos); mytree[NR(newpos)] |= ACTIVE|IN_TREE; // add - } - } - } - /* if we can't expand this node anymore, it's now an inactive node */ - mytree[NR(pos)] &= ~ACTIVE; - return 0; -} - -static int node_count_edges(node_t*node) -{ - halfedge_t*e = node->edges; - int num = 0; - while(e) { - num++; - e = e->next; - } - return num; -} - -static void bool_op(graphcut_workspace_t*w, unsigned char*flags, node_t*pos, unsigned char and, unsigned char or) -{ - posqueue_t*q = w->tmpqueue; - posqueue_purge(q); - posqueue_addpos(q, pos); - - while(posqueue_notempty(q)) { - node_t*p = posqueue_extract(q); - flags[NR(p)] = (flags[NR(p)]&and)|or; - halfedge_t*e = p->edges; - while(e) { - if(e->used) { - posqueue_addpos(q, e->fwd->node); - } - e = e->next; - } - } -} - -static weight_t decrease_weights(graph_t*map, path_t*path) -{ - int t; - assert(path->length); - - weight_t min = path->dir[0]->weight; - for(t=0;tlength-1;t++) { - int w = path->dir[t]->weight; - DBG printf("%d->%d (%d)\n", NR(path->dir[t]->node), NR(path->dir[t]->fwd->node), w); - if(t==0 || w < min) min = w; - } - assert(min); - if(min<=0) - return 0; - - for(t=0;tlength-1;t++) { - path->dir[t]->weight-=min; - path->dir[t]->fwd->weight+=min; - } - return min; -} - -static int reconnect(graphcut_workspace_t*w, unsigned char*flags, node_t*pos, char reverse) -{ - graph_t*graph = w->graph; - - halfedge_t*e = pos->edges; - for(;e;e=e->next) { - node_t*newpos = e->fwd->node; - int weight; - if(!reverse) { - weight = e->fwd->weight; - } else { - weight = e->weight; - } - if(weight && (flags[NR(newpos)]&IN_TREE)) { - DBG printf("successfully reconnected node %d to %d (%d->%d) (reverse:%d)\n", - NR(pos), NR(newpos), NR(e->node), NR(e->fwd->node), reverse); - - w->back[NR(pos)] = e; - e->fwd->used = 1; - return 1; - } - } - return 0; -} - -static void clear_node(graphcut_workspace_t*w, node_t*n) -{ - w->flags1[NR(n)] = 0; - w->flags2[NR(n)] = 0; - w->back[NR(n)] = 0; - halfedge_t*e = n->edges; - while(e) {e->used = 0;e=e->next;} -} - -static void destroy_subtree(graphcut_workspace_t*w, unsigned char*flags, node_t*pos, posqueue_t*posqueue) -{ - DBG printf("destroying subtree starting with %d\n", NR(pos)); - - posqueue_t*q = w->tmpqueue; - posqueue_purge(q); - posqueue_addpos(q, pos); - - while(posqueue_notempty(q)) { - node_t*p = posqueue_extract(q); - halfedge_t*e = p->edges; - while(e) { - node_t*newpos = e->fwd->node; - if(e->used) { - posqueue_addpos(q, newpos); - } else if((flags[NR(newpos)]&(ACTIVE|IN_TREE)) == IN_TREE) { - // re-activate all nodes that surround our subtree. - // TODO: we should check the weight of the edge from that other - // node to our node. if it's zero, we don't need to activate that node. - posqueue_addpos(posqueue, newpos); - flags[NR(newpos)]|=ACTIVE; - } - e = e->next; - } - - clear_node(w, p); - DBG printf("removed pos %d\n", NR(p)); - } -} - -static void combust_tree(graphcut_workspace_t*w, posqueue_t*q1, posqueue_t*q2, path_t*path) -{ - graph_t*graph = w->graph; - int t; - for(t=0;tlength-1 && path->firsthalf[t+1];t++) { - node_t*pos = path->pos[t]; - halfedge_t*dir = path->dir[t]; - node_t*newpos = dir->fwd->node; - if(!dir->weight) { - /* disconnect node */ - DBG printf("remove link %d -> %d from tree 1\n", NR(pos), NR(newpos)); - - dir->used = 0; - w->flags1[NR(newpos)] &= ACTIVE; - bool_op(w, w->flags1, newpos, ~IN_TREE, 0); - - /* try to reconnect the path to some other tree part */ - if(reconnect(w, w->flags1, newpos, 0)) { - bool_op(w, w->flags1, newpos, ~0, IN_TREE); - } else { - destroy_subtree(w, w->flags1, newpos, q1); - break; - } - } - } - - for(t=path->length-1;t>0 && !path->firsthalf[t-1];t--) { - node_t*pos = path->pos[t]; - node_t*newpos = path->pos[t-1]; - halfedge_t*dir = path->dir[t-1]->fwd; - node_t*newpos2 = dir->fwd->node; - assert(newpos == newpos2); - if(!dir->fwd->weight) { - /* disconnect node */ - DBG printf("remove link %d->%d from tree 2\n", NR(pos), NR(newpos)); - - dir->used = 0; - w->flags2[NR(newpos)] &= ACTIVE; - bool_op(w, w->flags2, newpos, ~IN_TREE, 0); - - /* try to reconnect the path to some other tree part */ - if(reconnect(w, w->flags2, newpos, 1)) { - bool_op(w, w->flags2, newpos, ~0, IN_TREE); - } else { - destroy_subtree(w, w->flags2, newpos, q2); - break; - } - } - } -} - -static void check_graph(graph_t*g) -{ - int t; - for(t=0;tnum_nodes;t++) { - assert(g->nodes[t].nr==t); - halfedge_t*e = g->nodes[t].edges; - while(e) { - assert(!e->used || !e->fwd->used); - e = e->next; - } - } -} - -void graph_reset(graph_t*g) -{ - int t; - for(t=0;tnum_nodes;t++) { - g->nodes[t].nr = t; - assert(g->nodes[t].nr==t); - halfedge_t*e = g->nodes[t].edges; - while(e) { - e->used = 0; - e->weight = e->init_weight; - e = e->next; - } - } -} - -weight_t graph_maxflow(graph_t*graph, node_t*pos1, node_t*pos2) -{ - int max_flow = 0; - graphcut_workspace_t* w = graphcut_workspace_new(graph, pos1, pos2); - - graph_reset(graph); - DBG check_graph(graph); - - posqueue_addpos(w->queue1, pos1); w->flags1[pos1->nr] |= ACTIVE|IN_TREE; - posqueue_addpos(w->queue2, pos2); w->flags2[pos2->nr] |= ACTIVE|IN_TREE; - DBG workspace_print(w); - - while(1) { - path_t*path; - while(1) { - char done1=0,done2=0; - node_t* p1 = posqueue_extract(w->queue1); - if(!p1) { - graphcut_workspace_delete(w); - return max_flow; - } - DBG printf("extend 1 from %d (%d edges)\n", NR(p1), node_count_edges(p1)); - path = expand_pos(w, w->queue1, p1, 0, w->flags1, w->flags2); - if(path) - break; - DBG workspace_print(w); - -#ifdef TWOTREES - node_t* p2 = posqueue_extract(w->queue2); - if(!p2) { - graphcut_workspace_delete(w); - return max_flow; - } - DBG printf("extend 2 from %d (%d edges)\n", NR(p2), node_count_edges(p2)); - path = expand_pos(w, w->queue2, p2, 1, w->flags2, w->flags1); - if(path) - break; - DBG workspace_print(w); -#endif - - } - DBG printf("found connection between tree1 and tree2\n"); - DBG path_print(path); - - DBG printf("decreasing weights\n"); - max_flow += decrease_weights(graph, path); - DBG workspace_print(w); - - DBG printf("destroying trees\n"); - combust_tree(w, w->queue1, w->queue2, path); - DBG workspace_print(w); - - DBG check_graph(w->graph); - - path_delete(path); - } - graphcut_workspace_delete(w); - return max_flow; -} - -halfedge_t*graph_add_edge(node_t*from, node_t*to, weight_t forward_weight, weight_t backward_weight) -{ - halfedge_t*e1 = (halfedge_t*)rfx_calloc(sizeof(halfedge_t)); - halfedge_t*e2 = (halfedge_t*)rfx_calloc(sizeof(halfedge_t)); - e1->fwd = e2; - e2->fwd = e1; - e1->node = from; - e2->node = to; - e1->init_weight = forward_weight; - e2->init_weight = backward_weight; - e1->weight = forward_weight; - e2->weight = backward_weight; - - e1->next = from->edges; - from->edges = e1; - e2->next = to->edges; - to->edges = e2; - return e1; -} - -static void do_dfs(node_t*n, int color) -{ - int t; - n->tmp = color; - halfedge_t*e = n->edges; - while(e) { - if(e->fwd->node->tmp<0) - do_dfs(e->fwd->node, color); - e = e->next; - } -} - -int graph_find_components(graph_t*g) -{ - int t; - int count = 0; - for(t=0;tnum_nodes;t++) { - g->nodes[t].tmp = -1; - } - for(t=0;tnum_nodes;t++) { - if(g->nodes[t].tmp<0) { - do_dfs(&g->nodes[t], count++); - } - } - return count; -} - -#ifdef MAIN -int main() -{ - int t; - int s; - for(s=0;s<10;s++) { - int width = (lrand48()%8)+1; - graph_t*g = graph_new(width*width); - for(t=0;t0) graph_add_edge(&g->nodes[t], &g->nodes[t-1], R, R); - if(xnodes[t], &g->nodes[t+1], R, R); - if(y>0) graph_add_edge(&g->nodes[t], &g->nodes[t-width], R, R); - if(ynodes[t], &g->nodes[t+width], R, R); - } - - int x = graph_maxflow(g, &g->nodes[0], &g->nodes[width*width-1]); - printf("max flow: %d\n", x); - graph_delete(g); - } -} -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/graphcut.h b/fluidbook/tools/swftools-special-swfdump/lib/graphcut.h deleted file mode 100644 index 9b15a44cb..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/graphcut.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - graphcut- a graphcut implementation based on the Boykov Kolmogorov algorithm - - Part of the swftools package. - - Copyright (c) 2007,2008,2009 Matthias Kramm - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -#ifndef __graphcut_h__ -#define __graphcut_h__ - -typedef signed int weight_t; - -typedef struct _halfedge halfedge_t; -typedef struct _node node_t; -typedef struct _graph graph_t; - -struct _halfedge { - node_t*node; - struct _halfedge*fwd; - weight_t weight; - weight_t init_weight; - char used; - halfedge_t*next; -}; - -struct _node { - halfedge_t*edges; - union { - int tmp; - int component; - int color; - }; - int nr; -}; - -struct _graph { - node_t* nodes; - int num_nodes; -}; - -graph_t* graph_new(int num_nodes); -halfedge_t*graph_add_edge(node_t*from, node_t*to, weight_t forward_weight, weight_t backward_weight); -weight_t graph_maxflow(graph_t*graph, node_t*pos1, node_t*pos2); -int graph_find_components(graph_t*g); -void graph_delete(graph_t*); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.c b/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.c deleted file mode 100644 index de3eafa2b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.c +++ /dev/null @@ -1,199 +0,0 @@ -/* dct.c - - DCT implementations and test routines. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include - -int zigzagtable[64] = { - 0, 1, 5, 6, 14, 15, 27, 28, - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63}; - -static double table[8][8] = -{ -{0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548,0.707106781186548}, -{0.980785280403230,0.831469612302545,0.555570233019602,0.195090322016128,-0.195090322016128,-0.555570233019602,-0.831469612302545,-0.980785280403230}, -{0.923879532511287,0.382683432365090,-0.382683432365090,-0.923879532511287,-0.923879532511287,-0.382683432365090,0.382683432365090,0.923879532511287}, -{0.831469612302545,-0.195090322016128,-0.980785280403230,-0.555570233019602,0.555570233019602,0.980785280403230,0.195090322016129,-0.831469612302545}, -{0.707106781186548,-0.707106781186547,-0.707106781186548,0.707106781186547,0.707106781186548,-0.707106781186547,-0.707106781186547,0.707106781186547}, -{0.555570233019602,-0.980785280403230,0.195090322016128,0.831469612302545,-0.831469612302545,-0.195090322016128,0.980785280403231,-0.555570233019602}, -{0.382683432365090,-0.923879532511287,0.923879532511287,-0.382683432365090,-0.382683432365091,0.923879532511287,-0.923879532511286,0.382683432365090}, -{0.195090322016128,-0.555570233019602,0.831469612302545,-0.980785280403231,0.980785280403230,-0.831469612302545,0.555570233019602,-0.195090322016129} -}; - -void dct(int*src) -{ - double tmp[64]; - int x,y,u,v,t; - - for(v=0;v<8;v++) - for(u=0;u<8;u++) - { - double c = 0; - for(x=0;x<8;x++) - { - c+=table[u][x]*src[v*8+x]; - } - tmp[v*8+u] = c; - } - for(u=0;u<8;u++) - for(v=0;v<8;v++) - { - double c = 0; - for(y=0;y<8;y++) - { - c+=table[v][y]*tmp[y*8+u]; - } - src[v*8+u] = (int)(c*0.25+0.5); - } -} - -void idct(int*src) -{ - double tmp[64]; - int x,y,u,v; - for(y=0;y<8;y++) - for(x=0;x<8;x++) - { - double c = 0; - for(u=0;u<8;u++) - { - c+=table[u][x]*src[y*8+u]; - } - tmp[y*8+x] = c; - } - for(y=0;y<8;y++) - for(x=0;x<8;x++) - { - double c = 0; - for(v=0;v<8;v++) - { - c+=table[v][y]*tmp[v*8+x]; - } - src[y*8+x] = (int)(c*0.25+0.5); - } -} - -static double c[8] = {1.0, -0.980785280403230, // cos(Pi*1/16), sin(Pi*7/16) -0.923879532511287, // cos(Pi*2/16), sin(Pi*6/16) -0.831469612302545, // cos(Pi*3/16), sin(Pi*5/16) -0.707106781186548, // cos(Pi*4/16), sin(Pi*4/16), 1/sqrt(2) -0.555570233019602, // cos(Pi*5/16), sin(Pi*3/16) -0.382683432365090, // cos(Pi*6/16), sin(Pi*2/16) -0.195090322016128 // cos(Pi*7/16), sin(Pi*1/16) -}; - -static double cc[8]; -static int ccquant = -1; - -void preparequant(int quant) -{ - if(ccquant == quant) - return; - cc[0] = c[0]/(quant*2*4); - cc[1] = c[1]/(quant*2*4); - cc[2] = c[2]/(quant*2*4); - cc[3] = c[3]/(quant*2*4); - cc[4] = c[4]/(quant*2*4); - cc[5] = c[5]/(quant*2*4); - cc[6] = c[6]/(quant*2*4); - cc[7] = c[7]/(quant*2*4); - ccquant = quant; -} - -inline static void innerdct(const double*a,double*b, const double*c) -{ - // c1*c7*2 = c6 - // c2*c6*2 = c4 - // c3*c5*2 = c2 - // c4*c4*2 = 1 - - //{ 1, 3, 5, 7, -7, -5, -3, -1}, - //{ 3, -7, -1, -5, 5, 1, 7, -3}, - //{ 5, -1, 7, 3, -3, -7, 1, -5}, - //{ 7, -5, 3, -1, 1, -3, 5, -7} - double b0,b1,b2,b3,b4,b5; - b2 = (a[0]+a[7]); - b3 = (a[1]+a[6]); - b4 = (a[2]+a[5]); - b5 = (a[3]+a[4]); - - b0 = (b2+b5)*c[4]; - b1 = (b3+b4)*c[4]; - b[0*8] = b0 + b1; - b[4*8] = b0 - b1; - b[2*8] = (b2-b5)*c[2] + (b3-b4)*c[6]; - b[6*8] = (b2-b5)*c[6] + (b4-b3)*c[2]; - - b0 = (a[0]-a[7]); - b1 = (a[1]-a[6]); - b2 = (a[2]-a[5]); - b3 = (a[3]-a[4]); - - b[1*8] = b0*c[1] + b1*c[3] + b2*c[5] + b3*c[7]; - b[3*8] = b0*c[3] - b1*c[7] - b2*c[1] - b3*c[5]; - b[5*8] = b0*c[5] - b1*c[1] + b2*c[7] + b3*c[3]; - b[7*8] = b0*c[7] - b1*c[5] + b2*c[3] - b3*c[1]; -} - -void dct2(int*src, int*dest) -{ - double tmp[64], tmp2[64]; - double*p; - int u,x,v,t; - - for(t=0;t<64;t++) - tmp2[t] = src[t]; - - for(v=0;v<8;v++) - { - double* a=&tmp2[v*8]; - double* b=&tmp[v]; - innerdct(a,b,c); - } - for(v=0;v<8;v++) - { - double* a=&tmp[v*8]; - double* b=&tmp2[v]; - innerdct(a,b,cc); - } - for(t=0;t<64;t++) { - int v = (int)(tmp2[t]); - dest[zigzagtable[t]] = v; - } -} - - -void zigzag(int*src) -{ - int tmp[64]; - int t; - for(t=0;t<64;t++) { - tmp[zigzagtable[t]] = src[t]; - } - memcpy(src, tmp, sizeof(int)*64); -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.h b/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.h deleted file mode 100644 index eb71bd649..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/h.263/dct.h +++ /dev/null @@ -1,31 +0,0 @@ -/* dct.h - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __dct_h__ -#define __dct_h__ - -void dct(int*src); -void idct(int*src); - -void preparequant(int quant); -void dct2(int*src, int*dest); - -extern int zigzagtable[64]; -void zigzag(int*src); - -#endif //__dct_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.c b/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.c deleted file mode 100644 index 384ffb10d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.c +++ /dev/null @@ -1,308 +0,0 @@ -/* h263tables.c - - Huffman Tables for h.263 encoding. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "h263tables.h" - -struct huffcode mcbpc_intra[] = { -{"1",1, 0}, /*cbpc-00 mb type 3*/ -{"001",3, 1}, /*cbpc-01 mb type 3*/ -{"010",3, 2}, /*cbpc-10 mb type 3*/ -{"011",3, 3}, /*cbpc-11 mb type 3*/ -{"0001",4, 4}, /*cbpc-00 mb type 4*/ -{"000001",6, 5}, /*cbpc-01 mb type 4*/ -{"000010",6, 6}, /*cbpc-10 mb type 4*/ -{"000011",6, 7}, /*cbpc-11 mb type 4*/ -{"000000001",9, 8}, /* stuffing */ -{0,0,0}, -}; - -struct mcbpc_intra_params - mcbpc_intra_params[] = -{{0, 3, 0}, //00 - {1, 3, 1}, //01 - {2, 3, 2}, //10 - {3, 3, 3}, //11 - {4, 4, 0}, //00 - {5, 4, 1}, //01 - {6, 4, 2}, //10 - {7, 4, 3}, //11 - {8 -1, -1} -}; - -struct huffcode mcbpc_inter[] = { -{"1", 1, 0}, -{"0011", 4, 1}, -{"0010", 4 ,2}, -{"000101", 6, 3}, -{"011", 3, 4}, -{"0000111", 7, 5}, -{"0000110", 7, 6}, -{"000000101", 9, 7}, -{"010", 3, 8}, -{"0000101", 7, 9}, -{"0000100", 7, 10}, -{"00000101", 8, 11}, -{"00011", 5, 12}, -{"00000100", 8, 13}, -{"00000011", 8, 14}, -{"0000011", 7, 15}, -{"000100", 6, 16}, -{"000000100", 9, 17}, -{"000000011", 9, 18}, -{"000000010", 9, 19}, -{"000000001", 9, 20}, /*stuffing*/ - -/* h.263+ only -{"00000000010", 11, 21}, -{"0000000001100", 13, 22}, -{"0000000001110", 13, 23}, -{"0000000001111", 13, 24}, -*/ -{0,0,0} -}; - -struct mcbpc_inter_params - mcbpc_inter_params[] = -{ {0, 0, 0}, {1, 0, 1}, {2, 0, 2}, {3, 0, 3}, - {4, 1, 0}, {5, 1, 1}, {6, 1, 2}, {7, 1, 3}, - {8, 2, 0}, {9, 2, 1}, {10, 2, 2}, {11, 2, 3}, - {12, 3, 0}, {13, 3, 1}, {14, 3, 2}, {15, 3, 3}, - {16, 4, 0}, {17, 4, 1}, {18, 4, 2}, {19, 4, 3}, - {20, -1, -1}, //stuffing - //{21, 5, 0}, {22, 5, 1}, {23, 5, 2}, {24, 5, 3}, //h.263+ only -}; - -struct huffcode cbpy[] = { -{"0011", 4, 0}, -{"00101", 5, 1}, -{"00100", 5, 2}, -{"1001", 4, 3}, -{"00011", 5, 4}, -{"0111", 4, 5}, -{"000010", 6, 6}, -{"1011", 4, 7}, -{"00010", 5, 8}, -{"000011", 6, 9}, -{"0101", 4, 10}, -{"1010", 4, 11}, -{"0100", 4, 12}, -{"1000", 4, 13}, -{"0110", 4, 14}, -{"11", 2, 15}, -{0,0,0} -}; - -struct huffcode mvd[] = -{ -{"0000000000101", 13, 0}, -{"0000000000111", 13, 1}, -{"000000000101", 12, 2}, -{"000000000111", 12, 3}, -{"000000001001", 12, 4}, -{"000000001011", 12, 5}, -{"000000001101", 12, 6}, -{"000000001111", 12, 7}, -{"00000001001", 11, 8}, -{"00000001011", 11, 9}, -{"00000001101", 11, 10}, -{"00000001111", 11, 11}, -{"00000010001", 11, 12}, -{"00000010011", 11, 13}, -{"00000010101", 11, 14}, -{"00000010111", 11, 15}, -{"00000011001", 11, 16}, -{"00000011011", 11, 17}, -{"00000011101", 11, 18}, -{"00000011111", 11, 19}, -{"00000100001", 11, 20}, -{"00000100011", 11, 21}, -{"0000010011", 10, 22}, -{"0000010101", 10, 23}, -{"0000010111", 10, 24}, -{"00000111", 8, 25}, -{"00001001", 8, 26}, -{"00001011", 8, 27}, -{"0000111", 7, 28}, -{"00011", 5, 29}, -{"0011", 4, 30}, -{"011", 3, 31}, -{"1", 1, 32}, -{"010", 3, 33}, -{"0010", 4, 34}, -{"00010", 5, 35}, -{"0000110", 7, 36}, -{"00001010", 8, 37}, -{"00001000", 8, 38}, -{"00000110", 8, 39}, -{"0000010110", 10, 40}, -{"0000010100", 10, 41}, -{"0000010010", 10, 42}, -{"00000100010", 11, 43}, -{"00000100000", 11, 44}, -{"00000011110", 11, 45}, -{"00000011100", 11, 46}, -{"00000011010", 11, 47}, -{"00000011000", 11, 48}, -{"00000010110", 11, 49}, -{"00000010100", 11, 50}, -{"00000010010", 11, 51}, -{"00000010000", 11, 52}, -{"00000001110", 11, 53}, -{"00000001100", 11, 54}, -{"00000001010", 11, 55}, -{"00000001000", 11, 56}, -{"000000001110", 12, 57}, -{"000000001100", 12, 58}, -{"000000001010", 12, 59}, -{"000000001000", 12, 60}, -{"000000000110", 12, 61}, -{"000000000100", 12, 62}, -{"0000000000110", 13, 63}, -{0,0,0}}; - -struct huffcode rle[] = -{ -{"10", 2, 0}, -{"1111", 4, 1}, -{"010101", 6, 2}, -{"0010111", 7, 3}, -{"00011111", 8, 4}, -{"000100101", 9, 5}, -{"000100100", 9, 6}, -{"0000100001", 10, 7}, -{"0000100000", 10, 8}, -{"00000000111", 11, 9}, -{"00000000110", 11, 10}, -{"00000100000", 11, 11}, -{"110", 3, 12}, -{"010100", 6, 13}, -{"00011110", 8, 14}, -{"0000001111", 10, 15}, -{"00000100001", 11, 16}, -{"000001010000", 12, 17}, -{"1110", 4, 18}, -{"00011101", 8, 19}, -{"0000001110", 10, 20}, -{"000001010001", 12, 21}, -{"01101", 5, 22}, -{"000100011", 9, 23}, -{"0000001101", 10, 24}, -{"01100", 5, 25}, -{"000100010", 9, 26}, -{"000001010010", 12, 27}, -{"01011", 5, 28}, -{"0000001100", 10, 29}, -{"000001010011", 12, 30}, -{"010011", 6, 31}, -{"0000001011", 10, 32}, -{"000001010100", 12, 33}, -{"010010", 6, 34}, -{"0000001010", 10, 35}, -{"010001", 6, 36}, -{"0000001001", 10, 37}, -{"010000", 6, 38}, -{"0000001000", 10, 39}, -{"0010110", 7, 40}, -{"000001010101", 12, 41}, -{"0010101", 7, 42}, -{"0010100", 7, 43}, -{"00011100", 8, 44}, -{"00011011", 8, 45}, -{"000100001", 9, 46}, -{"000100000", 9, 47}, -{"000011111", 9, 48}, -{"000011110", 9, 49}, -{"000011101", 9, 50}, -{"000011100", 9, 51}, -{"000011011", 9, 52}, -{"000011010", 9, 53}, -{"00000100010", 11, 54}, -{"00000100011", 11, 55}, -{"000001010110", 12, 56}, -{"000001010111", 12, 57}, -{"0111", 4, 58}, -{"000011001", 9, 59}, -{"00000000101", 11, 60}, -{"001111", 6, 61}, -{"00000000100", 11, 62}, -{"001110", 6, 63}, -{"001101", 6, 64}, /* ?? */ -{"001100", 6, 65}, -{"0010011", 7, 66}, -{"0010010", 7, 67}, -{"0010001", 7, 68}, -{"0010000", 7, 69}, -{"00011010", 8, 70}, -{"00011001", 8, 71}, -{"00011000", 8, 72}, -{"00010111", 8, 73}, -{"00010110", 8, 74}, -{"00010101", 8, 75}, -{"00010100", 8, 76}, -{"00010011", 8, 77}, -{"000011000", 9, 78}, -{"000010111", 9, 79}, -{"000010110", 9, 80}, -{"000010101", 9, 81}, -{"000010100", 9, 82}, -{"000010011", 9, 83}, -{"000010010", 9, 84}, -{"000010001", 9, 85}, -{"0000000111", 10, 86}, -{"0000000110", 10, 87}, -{"0000000101", 10, 88}, -{"0000000100", 10, 89}, -{"00000100100", 11, 90}, -{"00000100101", 11, 91}, -{"00000100110", 11, 92}, -{"00000100111", 11, 93}, -{"000001011000", 12, 94}, -{"000001011001", 12, 95}, -{"000001011010", 12, 96}, -{"000001011011", 12, 97}, -{"000001011100", 12, 98}, -{"000001011101", 12, 99}, -{"000001011110", 12, 100}, -{"000001011111", 12, 101}, -{"0000011", 7, 102}, /*ESCAPE*/ -{0,0,0} -}; - -struct rle_params - rle_params[] = -{{0,0,0,1}, {1,0,0,2}, {2,0,0,3}, {3,0,0,4}, {4,0,0,5}, {5,0,0,6}, {6,0,0,7}, -{7,0,0,8}, {8,0,0,9}, {9,0,0,10}, {10,0,0,11}, {11,0,0,12}, {12,0,1,1}, {13,0,1,2}, -{14,0,1,3}, {15,0,1,4}, {16,0,1,5}, {17,0,1,6}, {18,0,2,1}, {19,0,2,2}, {20,0,2,3}, {21,0,2,4}, -{22,0,3,1}, {23,0,3,2}, {24,0,3,3}, {25,0,4,1}, {26,0,4,2}, {27,0,4,3}, {28,0,5,1}, -{29,0,5,2}, {30,0,5,3}, {31,0,6,1}, {32,0,6,2}, {33,0,6,3}, -{34,0,7,1}, {35,0,7,2}, {36,0,8,1}, {37,0,8,2}, {38,0,9,1}, {39,0,9,2}, {40,0,10,1}, -{41,0,10,2}, {42,0,11,1}, {43,0,12,1}, {44,0,13,1}, {45,0,14,1}, {46,0,15,1}, -{47,0,16,1}, {48,0,17,1}, {49,0,18,1}, {50,0,19,1}, {51,0,20,1}, {52,0,21,1}, -{53,0,22,1}, {54,0,23,1}, {55,0,24,1}, {56,0,25,1}, {57,0,26,1}, -{58,1,0,1}, {59,1,0,2}, {60,1,0,3}, {61,1,1,1}, {62,1,1,2}, {63,1,2,1}, {64,1,3,1}, {65, 1,4,1}, -{66,1,5,1}, {67,1,6,1}, {68,1,7,1}, {69,1,8,1}, {70,1,9,1}, {71,1,10,1}, -{72,1,11,1}, {73,1,12,1}, {74,1,13,1}, {75,1,14,1}, {76,1,15,1}, {77,1,16,1}, -{78,1,17,1}, {79,1,18,1}, {80,1,19,1}, {81,1,20,1}, {82,1,21,1}, {83,1,22,1}, -{84,1,23,1}, {85,1,24,1}, {86,1,25,1}, {87,1,26,1}, {88,1,27,1}, {89,1,28,1}, -{90,1,29,1}, {91,1,30,1}, {92,1,31,1}, {93,1,32,1}, {94,1,33,1}, {95,1,34,1}, -{96,1,35,1}, {97,1,36,1}, {98,1,37,1}, {99,1,38,1}, {100,1,39,1}, {101,1,40,1}, -{102,-1, -1, -1} -}; - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.h b/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.h deleted file mode 100644 index b9fdbbb3a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/h.263/h263tables.h +++ /dev/null @@ -1,59 +0,0 @@ -/* h263tables.h - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -struct huffcode { - char*code; - int len; - int index; -}; - -struct mcbpc_intra_params -{ - int index; - int mb_type; - int cbpc; -}; - -struct mcbpc_inter_params -{ - int index; - int mb_type; - int cbpc; -}; - -struct rle_params -{ - int index; - int last; - int run; - int level; -}; - -#define MCBPC_INTRA_STUFFING 8 -#define MCBPC_INTER_STUFFING 20 -#define RLE_ESCAPE 102 - -extern struct huffcode mcbpc_intra[]; -extern struct mcbpc_intra_params mcbpc_intra_params[]; -extern struct mcbpc_inter_params mcbpc_inter_params[]; -extern struct rle_params rle_params[]; - -extern struct huffcode mcbpc_inter[]; -extern struct huffcode cbpy[]; -extern struct huffcode mvd[]; -extern struct huffcode rle[]; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/h.263/swfvideo.c b/fluidbook/tools/swftools-special-swfdump/lib/h.263/swfvideo.c deleted file mode 100644 index d9e180376..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/h.263/swfvideo.c +++ /dev/null @@ -1,1645 +0,0 @@ -/* swfvideo.c - Routines for handling h.263 video tags - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include "../rfxswf.h" -#include "h263tables.h" -#include "dct.h" - -/* TODO: - - use prepare* / write* in encode_IFrame_block - - check whether mvd steps of 2 lead to (much) smaller results -*/ - -#ifdef MAIN -U16 totalframes = 0; -#endif -void swf_SetVideoStreamDefine(TAG*tag, VIDEOSTREAM*stream, U16 frames, U16 width, U16 height) -{ -#ifdef MAIN - totalframes = frames; -#endif - memset(stream, 0, sizeof(VIDEOSTREAM)); - stream->olinex = width; - stream->owidth = width; - stream->oheight = height; - width+=15;width&=~15; - height+=15;height&=~15; - stream->linex = width; - stream->width = width; - stream->height = height; - stream->bbx = width/16; - stream->bby = height/16; - stream->current = (YUV*)rfx_calloc(width*height*sizeof(YUV)); - stream->oldpic = (YUV*)rfx_calloc(width*height*sizeof(YUV)); - stream->mvdx = (int*)rfx_alloc(stream->bbx*stream->bby*sizeof(int)); - stream->mvdy = (int*)rfx_alloc(stream->bbx*stream->bby*sizeof(int)); - stream->do_motion = 0; - - assert((stream->width&15) == 0); - assert((stream->height&15) == 0); - assert((stream->bbx*16) == stream->width); - assert((stream->bby*16) == stream->height); - - swf_SetU16(tag, frames); - swf_SetU16(tag, width); - swf_SetU16(tag, height); - //swf_SetU8(tag, 1); /* smoothing on */ - swf_SetU8(tag, 0); /* smoothing off */ - swf_SetU8(tag, 2); /* codec = h.263 sorenson spark */ - -} -void swf_VideoStreamClear(VIDEOSTREAM*stream) -{ - rfx_free(stream->oldpic);stream->oldpic = 0; - rfx_free(stream->current);stream->current = 0; - rfx_free(stream->mvdx);stream->mvdx=0; - rfx_free(stream->mvdy);stream->mvdy=0; -} - -typedef struct _block_t -{ - int y1[64]; - int y2[64]; - int y3[64]; - int y4[64]; - int u[64]; - int v[64]; -} block_t; - -static inline int truncate256(int a) -{ - if(a>255) return 255; - if(a<0) return 0; - return a; -} - -static void getregion(block_t* bb, YUV*pic, int posx, int posy, int linex) -{ - YUV*p1; - YUV*p2; - int i=0; - int x,y; - posx*=16; - posy*=16; - p1 = &pic[posy*linex+posx]; - p2 = p1; - for(y=0;y<8;y++) { - for(x=0;x<8;x++) { - bb->u[i] = (p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4; - bb->v[i] = (p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4; - bb->y1[i] = p1[x].y; - bb->y2[i] = p1[x+8].y; - bb->y3[i] = p1[linex*8+x].y; - bb->y4[i] = p1[linex*8+x+8].y; - i++; - } - p1+=linex; - p2+=linex*2; - } -} - -/* This function is pretty complex. Let's hope it works correctly */ -static void getmvdregion(block_t* bb, YUV*pic, int posx, int posy, int mvdx, int mvdy, int linex) -{ - YUV*p1; - YUV*p2; - int yy=0,uv=0; - int x,y; - int yhp = 0, uvhp=0; - int uvposx, uvposy; - posx = posx*16 + ((mvdx&~1)/2); //works also for negative mvdx (unlike mvdx/2) - posy = posy*16 + ((mvdy&~1)/2); - p1 = &pic[posy*linex+posx]; - p2 = &pic[(posy&~1)*linex+(posx&~1)]; - uvhp = ((mvdx&1)|((mvdx>>1)&1))|((mvdy&2)|((mvdy&1)<<1)); - yhp = ((mvdy&1)<<1|(mvdx&1)); - - /* y */ - if(yhp==0 || yhp==2) { - for(y=0;y<8;y++) { - for(x=0;x<8;x++) { - bb->y1[yy] = p1[x].y; - bb->y2[yy] = p1[x+8].y; - bb->y3[yy] = p1[linex*8+x].y; - bb->y4[yy] = p1[linex*8+x+8].y; - yy++; - } - p1+=linex; - - if(yhp==2) { - yy-=8; - for(x=0;x<8;x++) { - bb->y1[yy] += p1[x].y; bb->y1[yy] /= 2; - bb->y2[yy] += p1[x+8].y; bb->y2[yy] /= 2; - bb->y3[yy] += p1[linex*8+x].y; bb->y3[yy] /= 2; - bb->y4[yy] += p1[linex*8+x+8].y; bb->y4[yy] /= 2; - yy++; - } - } - } - } else if(yhp==1 || yhp==3) { - for(y=0;y<8;y++) { - for(x=0;x<8;x++) { - bb->y1[yy] = (p1[x].y + p1[x+1].y); - bb->y2[yy] = (p1[x+8].y + p1[x+8+1].y); - bb->y3[yy] = (p1[linex*8+x].y + p1[linex*8+x+1].y); - bb->y4[yy] = (p1[linex*8+x+8].y + p1[linex*8+x+8+1].y); - yy++; - } - yy-=8; - p1+=linex; - if(yhp==3) { - for(x=0;x<8;x++) { - bb->y1[yy] += (p1[x].y + p1[x+1].y); bb->y1[yy]/=4; - bb->y2[yy] += (p1[x+8].y + p1[x+8+1].y); bb->y2[yy]/=4; - bb->y3[yy] += (p1[linex*8+x].y + p1[linex*8+x+1].y); bb->y3[yy]/=4; - bb->y4[yy] += (p1[linex*8+x+8].y + p1[linex*8+x+8+1].y); bb->y4[yy]/=4; - yy++; - } - } else { - for(x=0;x<8;x++) { - bb->y1[yy]/=2; bb->y2[yy]/=2; bb->y3[yy]/=2; bb->y4[yy]/=2; - yy++; - } - } - } - } - - /* u,v */ - if(uvhp==0 || uvhp==2) { - for(y=0;y<8;y++) { - for(x=0;x<8;x++) { - bb->u[uv] = (p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4; - bb->v[uv] = (p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4; - uv++; - } - p2+=linex*2; - if(uvhp==2) { - uv-=8; - for(x=0;x<8;x++) { - bb->u[uv] += (p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4; - bb->v[uv] += (p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4; - bb->u[uv] /= 2; - bb->v[uv] /= 2; - uv++; - } - } - } - } else /* uvhp==1 || uvhp==3 */ { - for(y=0;y<8;y++) { - for(x=0;x<8;x++) { - bb->u[uv] = ((p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4+ - (p2[x*2+2].u + p2[x*2+1+2].u + p2[linex+x*2+2].u + p2[linex+x*2+1+2].u)/4); - bb->v[uv] = ((p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4+ - (p2[x*2+2].v + p2[x*2+1+2].v + p2[linex+x*2+2].v + p2[linex+x*2+1+2].v)/4); - uv++; - } - uv-=8; - p2+=linex*2; - if(uvhp==3) { - for(x=0;x<8;x++) { - bb->u[uv] += ((p2[x*2].u + p2[x*2+1].u + p2[linex+x*2].u + p2[linex+x*2+1].u)/4+ - (p2[x*2+2].u + p2[x*2+1+2].u + p2[linex+x*2+2].u + p2[linex+x*2+1+2].u)/4); - bb->v[uv] += ((p2[x*2].v + p2[x*2+1].v + p2[linex+x*2].v + p2[linex+x*2+1].v)/4+ - (p2[x*2+2].v + p2[x*2+1+2].v + p2[linex+x*2+2].v + p2[linex+x*2+1+2].v)/4); - bb->u[uv] /= 4; - bb->v[uv] /= 4; - uv++; - } - } else { - for(x=0;x<8;x++) { - bb->u[uv] /= 2; - bb->v[uv] /= 2; - uv++; - } - } - } - } -} - -static void rgb2yuv(YUV*dest, RGBA*src, int dlinex, int slinex, int width, int height) -{ - int x,y; - for(y=0;y>8; - - dest[y*dlinex+x].y = (r*((int)( 0.299*256)) + g*((int)( 0.587*256)) + b*((int)( 0.114 *256)))>>8; - dest[y*dlinex+x].u = (r*((int)(-0.169*256)) + g*((int)(-0.332*256)) + b*((int)( 0.500 *256))+ 128*256)>>8; - dest[y*dlinex+x].v = (r*((int)( 0.500*256)) + g*((int)(-0.419*256)) + b*((int)(-0.0813*256))+ 128*256)>>8; - } - } -} - -static void copyregion(VIDEOSTREAM*s, YUV*dest, YUV*src, int bx, int by) -{ - YUV*p1 = &dest[by*s->linex*16+bx*16]; - YUV*p2 = &src[by*s->linex*16+bx*16]; - int y; - for(y=0;y<16;y++) { - memcpy(p1, p2, 16*sizeof(YUV)); - p1+=s->linex;p2+=s->linex; - } -} - -static void yuv2rgb(RGBA*dest, YUV*src, int linex, int width, int height) -{ - int x,y; - for(y=0;y>8)); - dest[y*linex+x].g = truncate256(yy - ((88*(u-128)+183*(v-128))>>8)); - dest[y*linex+x].b = truncate256(yy + ((455 * (u-128))>>8)); - } - } -} -static void copy_block_pic(VIDEOSTREAM*s, YUV*dest, block_t*b, int bx, int by) -{ - YUV*p1 = &dest[(by*16)*s->linex+bx*16]; - YUV*p2 = &dest[(by*16+8)*s->linex+bx*16]; - int x,y; - for(y=0;y<8;y++) { - for(x=0;x<8;x++) { - int u,v,yy; - p1[x+0].u = b->u[(y/2)*8+(x/2)]; - p1[x+0].v = b->v[(y/2)*8+(x/2)]; - p1[x+0].y = b->y1[y*8+x]; - p1[x+8].u = b->u[(y/2)*8+(x/2)+4]; - p1[x+8].v = b->v[(y/2)*8+(x/2)+4]; - p1[x+8].y = b->y2[y*8+x]; - p2[x+0].u = b->u[(y/2+4)*8+(x/2)]; - p2[x+0].v = b->v[(y/2+4)*8+(x/2)]; - p2[x+0].y = b->y3[y*8+x]; - p2[x+8].u = b->u[(y/2+4)*8+(x/2)+4]; - p2[x+8].v = b->v[(y/2+4)*8+(x/2)+4]; - p2[x+8].y = b->y4[y*8+x]; - } - p1+=s->linex; - p2+=s->linex; - } -} - -static int compare_pic_pic(VIDEOSTREAM*s, YUV*pp1, YUV*pp2, int bx, int by) -{ - int linex = s->width; - YUV*p1 = &pp1[by*linex*16+bx*16]; - YUV*p2 = &pp2[by*linex*16+bx*16]; - int diffy=0, diffuv = 0; - int x,y; - for(y=0;y<16;y++) { - for(x=0;x<16;x++) { - YUV*m = &p1[x]; - YUV*n = &p2[x]; - int y = m->y - n->y; - int u = m->u - n->u; - int v = m->v - n->v; - diffy += abs(y); - diffuv += abs(u)+abs(v); - } - p1+=linex; - p2+=linex; - } - return diffy + diffuv/4; -} - -static int compare_pic_block(VIDEOSTREAM*s, block_t* b, YUV*pic, int bx, int by) -{ - int linex = s->width; - YUV*y1 = &pic[(by*2)*linex*8+bx*16]; - YUV*y2 = &pic[(by*2)*linex*8+bx*16+8]; - YUV*y3 = &pic[(by*2+1)*linex*8+bx*16]; - YUV*y4 = &pic[(by*2+1)*linex*8+bx*16+8]; - YUV*uv1 = y1; - YUV*uv2 = &y1[linex]; - int diffy=0, diffuv = 0; - int x,y; - for(y=0;y<8;y++) { - for(x=0;x<8;x++) { - int yy,u1,v1,u2,v2,u3,v3,u4,v4; - int y8x = y*8+x; - yy = y1[x].y - b->y1[y8x]; - diffy += abs(yy); - yy = y2[x].y - b->y2[y8x]; - diffy += abs(yy); - yy = y3[x].y - b->y3[y8x]; - diffy += abs(yy); - yy = y4[x].y - b->y4[y8x]; - diffy += abs(yy); - u1 = uv1[x*2].u - b->u[y8x]; - v1 = uv1[x*2].v - b->v[y8x]; - u2 = uv1[x*2+1].u - b->u[y8x]; - v2 = uv1[x*2+1].v - b->v[y8x]; - u3 = uv2[x*2].u - b->u[y8x]; - v3 = uv2[x*2].v - b->v[y8x]; - u4 = uv2[x*2+1].u - b->u[y8x]; - v4 = uv2[x*2+1].v - b->v[y8x]; - diffuv += (abs(u1)+abs(v1)); - diffuv += (abs(u2)+abs(v2)); - diffuv += (abs(u3)+abs(v3)); - diffuv += (abs(u4)+abs(v4)); - } - y1+=linex; - y2+=linex; - y3+=linex; - y4+=linex; - uv1+=linex*2; - uv2+=linex*2; - } - return diffy + diffuv/4; -} - -static inline int valtodc(int val) -{ - assert(val>=0); - - /* table 12/h.263 */ - - //val+=4; //round - val/=8; - /* TODO: what to do for zero values? skip the block? */ - if(val==0) - return 1; - if(val==128) - return 255; - if(val>254) - return 254; - return val; -} -static int dctoval(int dc) -{ - int val; - assert(dc>0); - assert(dc!=128); - assert(dc<256); - /* table 12/h.263 */ - val = dc*8; - if(val == 255*8) - val = 128*8; - return val; -} - -/* TODO: we could also just let the caller pass only the string table[index] here */ -static int codehuffman(TAG*tag, struct huffcode*table, int index) -{ - /* TODO: !optimize! */ - int i=0; - while(table[index].code[i]) { - if(table[index].code[i]=='0') - swf_SetBits(tag, 0, 1); - else - swf_SetBits(tag, 1, 1); - i++; - } - return i; -} - -static void quantize8x8(int*src, int*dest, int has_dc, int quant) -{ - int t,pos=0; - double q = 1.0/(quant*2); - if(has_dc) { - dest[0] = valtodc((int)src[0]); /*DC*/ - pos++; - } - for(t=pos;t<64;t++) - { - //dest[t] = (int)src[t]; - /* exact: if(quant&1){dest[t] = (dest[t]/quant - 1)/2;}else{dest[t] = ((dest[t]+1)/quant - 1)/2;} */ - //if(quant&1){dest[t] = (dest[t]/quant - 1)/2;}else{dest[t] = ((dest[t]+1)/quant - 1)/2;} - //dest[t] = dest[t]/(quant*2); - dest[t] = (int)(src[t]*q); - /* TODO: warn if this happens- the video will be buggy */ - if(dest[t]>127) dest[t]=127; - if(dest[t]<-127) dest[t]=-127; - } -} - -static void dequantize8x8(int*b, int has_dc, int quant) -{ - int t,pos=0; - if(has_dc) { - b[0] = dctoval(b[0]); //DC - pos++; - } - for(t=pos;t<64;t++) { - if(b[t]) { - int sign = 0; - if(b[t]<0) { - b[t] = -b[t]; - sign = 1; - } - - if(quant&1) { - b[t] = quant*(2*b[t]+1); //-7,8,24,40 - } else { - b[t] = quant*(2*b[t]+1)-1; //-8,7,23,39 - } - - if(sign) - b[t] = -b[t]; - } - - /* paragraph 6.2.2, "clipping of reconstruction levels": */ - if(b[t]>2047) b[t]=2047; - if(b[t]<-2048) b[t]=-2048; - } -} - -static int hascoef(int*b, int has_dc) -{ - int t; - int pos=0; - if(has_dc) - pos++; - for(t=pos;t<64;t++) { - if(b[t]) - return 1; - } - return 0; -} - -static int coefbits8x8(int*bb, int has_dc) -{ - int t; - int pos=0; - int bits=0; - int last; - - if(has_dc) { - bits+=8; - pos++; - } - for(last=63;last>=pos;last--) { - if(bb[last]) - break; - } - if(last < pos) - return bits; - while(1) { - int run=0, level=0, islast=0,t; - while(!bb[pos] && pos=pos;last--) { - /* TODO: we could leave out small coefficients - after a certain point (32?) */ - if(bb[last]) - break; - } - /* blocks without coefficients should not be included - in the cbpy/cbpc patterns: */ - assert(bb[last]); - - while(1) { - int run=0; - int level=0; - int islast=0; - int sign=0; - int t; - while(!bb[pos] && pos127) { - fprintf(stderr, "Warning: Overflow- Level %d at pos %d\n", level, pos); - if(level<-127) level=-127; - if(level>127) level=127; - } - - assert(level); - assert(level>=-127); - assert(level<=127); //TODO: known to fail for pos=0 (with custom frames?) - - swf_SetBits(tag, islast, 1); - swf_SetBits(tag, run, 6); - swf_SetBits(tag, level, 8); //FIXME: fixme?? - bits += 1 + 6 + 8; - } - - if(islast) - break; - pos++; - } - } - return bits; -} - -static void quantize(block_t*fb, block_t*b, int has_dc, int quant) -{ - quantize8x8(fb->y1, b->y1, has_dc, quant); - quantize8x8(fb->y2, b->y2, has_dc, quant); - quantize8x8(fb->y3, b->y3, has_dc, quant); - quantize8x8(fb->y4, b->y4, has_dc, quant); - quantize8x8(fb->u, b->u, has_dc, quant); - quantize8x8(fb->v, b->v, has_dc, quant); -} - -static void dodct(block_t*fb) -{ - dct(fb->y1); dct(fb->y2); dct(fb->y3); dct(fb->y4); - dct(fb->u); dct(fb->v); - zigzag(fb->y1); - zigzag(fb->y2); - zigzag(fb->y3); - zigzag(fb->y4); - zigzag(fb->u); - zigzag(fb->v); -} - -static void dodctandquant(block_t*fb, block_t*b, int has_dc, int quant) -{ - int t; - if(has_dc) { - dodct(fb); - quantize(fb,b,has_dc,quant); - return; - } - preparequant(quant); - dct2(fb->y1,b->y1); dct2(fb->y2,b->y2); dct2(fb->y3,b->y3); dct2(fb->y4,b->y4); - dct2(fb->u,b->u); dct2(fb->v,b->v); - - for(t=0;t<64;t++) { - /* prepare for encoding (only values in (-127..-1,1..127) are - allowed as non-zero, non-dc values */ - if(b->y1[t]<-127) b->y1[t]=-127; - if(b->y2[t]<-127) b->y2[t]=-127; - if(b->y3[t]<-127) b->y3[t]=-127; - if(b->y4[t]<-127) b->y4[t]=-127; - if(b->u[t]<-127) b->u[t]=-127; - if(b->v[t]<-127) b->v[t]=-127; - - if(b->y1[t]>127) b->y1[t]=127; - if(b->y2[t]>127) b->y2[t]=127; - if(b->y3[t]>127) b->y3[t]=127; - if(b->y4[t]>127) b->y4[t]=127; - if(b->u[t]>127) b->u[t]=127; - if(b->v[t]>127) b->v[t]=127; - } -} - -static void doidct(block_t*b) -{ - block_t fb; - int t; - for(t=0;t<64;t++) { - fb.y1[t] = b->y1[zigzagtable[t]]; - fb.y2[t] = b->y2[zigzagtable[t]]; - fb.y3[t] = b->y3[zigzagtable[t]]; - fb.y4[t] = b->y4[zigzagtable[t]]; - fb.u[t] = b->u[zigzagtable[t]]; - fb.v[t] = b->v[zigzagtable[t]]; - } - idct(fb.y1); idct(fb.y2); idct(fb.y3); idct(fb.y4); - idct(fb.u); idct(fb.v); - - memcpy(b, &fb, sizeof(block_t)); -} - -static void truncateblock(block_t*b) -{ - int t; - for(t=0;t<64;t++) { - b->y1[t] = truncate256(b->y1[t]); - b->y2[t] = truncate256(b->y2[t]); - b->y3[t] = truncate256(b->y3[t]); - b->y4[t] = truncate256(b->y4[t]); - b->u[t] = truncate256(b->u[t]); - b->v[t] = truncate256(b->v[t]); - } -} - -static void dequantize(block_t*b, int has_dc, int quant) -{ - dequantize8x8(b->y1, has_dc, quant); - dequantize8x8(b->y2, has_dc, quant); - dequantize8x8(b->y3, has_dc, quant); - dequantize8x8(b->y4, has_dc, quant); - dequantize8x8(b->u, has_dc, quant); - dequantize8x8(b->v, has_dc, quant); -} - -static void getblockpatterns(block_t*b, int*cbpybits,int*cbpcbits, int has_dc) -{ - *cbpybits = 0; - *cbpcbits = 0; - - *cbpybits|=hascoef(b->y1, has_dc)*8; - *cbpybits|=hascoef(b->y2, has_dc)*4; - *cbpybits|=hascoef(b->y3, has_dc)*2; - *cbpybits|=hascoef(b->y4, has_dc)*1; - - *cbpcbits|=hascoef(b->u, has_dc)*2; - *cbpcbits|=hascoef(b->v, has_dc)*1; -} - -static void setQuant(TAG*tag, int dquant) -{ - int code = 0; - /* 00 01 10 11 - -1 -2 +1 +2 - */ - if(dquant == -1) { - swf_SetBits(tag, 0x0, 2); - } else if(dquant == -2) { - swf_SetBits(tag, 0x1, 2); - } else if(dquant == +1) { - swf_SetBits(tag, 0x2, 2); - } else if(dquant == +2) { - swf_SetBits(tag, 0x3, 2); - } else { - assert(0*strlen("invalid dquant")); - } -} - -static void change_quant(int quant, int*dquant) -{ - /* TODO */ - *dquant = 0; -} - -static void yuvdiff(block_t*a, block_t*b) -{ - int t; - for(t=0;t<64;t++) { - a->y1[t] = (a->y1[t] - b->y1[t]); - a->y2[t] = (a->y2[t] - b->y2[t]); - a->y3[t] = (a->y3[t] - b->y3[t]); - a->y4[t] = (a->y4[t] - b->y4[t]); - a->u[t] = (a->u[t] - b->u[t]); - a->v[t] = (a->v[t] - b->v[t]); - } -} - -static void predictmvd(VIDEOSTREAM*s, int bx, int by, int*px, int*py) -{ - int i1,i2; - int x1,y1,x2,y2,x3,y3; - int x4,y4,p; - if(bx) {x1=s->mvdx[by*s->bbx+bx-1]; - y1=s->mvdy[by*s->bbx+bx-1]; - } else {x1=y1=0;} - - if(by) {x2=s->mvdx[(by-1)*s->bbx+bx]; - y2=s->mvdy[(by-1)*s->bbx+bx]; - if(bxbbx-1) { - x3=s->mvdx[(by-1)*s->bbx+bx+1]; - y3=s->mvdy[(by-1)*s->bbx+bx+1]; - } else { - x3=y3=0; - } - } - else {x2=x3=x1;y2=y3=y1;} - - if((x1 <= x2 && x2 <= x3) || - (x3 <= x2 && x2 <= x1)) { - x4=x2; - } else if((x2 <= x1 && x1 <= x3) || - (x3 <= x1 && x1 <= x2)) { - x4=x1; - } else if((x1 <= x3 && x3 <= x2) || - (x2 <= x3 && x3 <= x1)) { - x4=x3; - } else { - x4=0; - assert(x4); - } - - if((y1 <= y2 && y2 <= y3) || - (y3 <= y2 && y2 <= y1)) { - y4=y2; - } else if((y2 <= y1 && y1 <= y3) || - (y3 <= y1 && y1 <= y2)) { - y4=y1; - } else if((y1 <= y3 && y3 <= y2) || - (y2 <= y3 && y3 <= y1)) { - y4=y3; - } else { - y4=0; - assert(y4); - } - - *px = x4; - *py = y4; - assert((x4>=-32 && x4<=31) && (y4>=-32 && y4<=31)); -} - -static inline int mvd2index(int px, int py, int x, int y, int xy) -{ - - if((x<-32 && x>31) || (y<-32 && y>31)) - fprintf(stderr, "(%d,%d)\n", x,y); - assert((x>=-32 && x<=31) && (y>=-32 && y<=31)); - //assert((x&1)==0 && (y&1)==0);//for now - //assert((x&2)==0 && (y&2)==0);//for now(2) - - x-=px; - y-=py; - - if(xy) - x=y; - x+=32; - - /* (x&63) */ - if(x>63) - x-=64; - if(x<0) - x+=64; - - assert(x>=0 && x<64); - return x; -} - -typedef struct _iblockdata_t -{ - block_t b; //transformed quantized coefficients - block_t reconstruction; - int bits; - int bx,by; - struct huffcode*ctable; //table to use for chrominance encoding (different for i-frames) - int iframe; // 1 if this is part of an iframe -} iblockdata_t; - -typedef struct _mvdblockdata_t -{ - block_t b; - block_t fbold; - block_t reconstruction; - int xindex; - int yindex; - int movex; - int movey; - int bits; - int bx,by; -} mvdblockdata_t; - -void prepareIBlock(VIDEOSTREAM*s, iblockdata_t*data, int bx, int by, block_t* fb, int*bits, int iframe) -{ - /* consider I-block */ - block_t fb_i; - block_t b; - int y,c; - struct huffcode*ctable; - - data->bx = bx; - data->by = by; - - data->iframe = iframe; - if(!iframe) { - data->ctable = &mcbpc_inter[3*4]; - } else { - data->ctable = &mcbpc_intra[0]; - } - - memcpy(&fb_i, fb, sizeof(block_t)); - dodctandquant(&fb_i, &data->b, 1, s->quant); - getblockpatterns(&data->b, &y, &c, 1); - *bits = 0; - if(!data->iframe) { - *bits += 1; //cod - } - *bits += data->ctable[c].len; - *bits += cbpy[y].len; - *bits += coefbits8x8(data->b.y1, 1); - *bits += coefbits8x8(data->b.y2, 1); - *bits += coefbits8x8(data->b.y3, 1); - *bits += coefbits8x8(data->b.y4, 1); - *bits += coefbits8x8(data->b.u, 1); - *bits += coefbits8x8(data->b.v, 1); - data->bits = *bits; - - /* -- reconstruction -- */ - memcpy(&data->reconstruction,&data->b,sizeof(block_t)); - dequantize(&data->reconstruction, 1, s->quant); - doidct(&data->reconstruction); - truncateblock(&data->reconstruction); -} - -int writeIBlock(VIDEOSTREAM*s, TAG*tag, iblockdata_t*data) -{ - int c = 0, y = 0; - int has_dc=1; - int bits = 0; - block_t b; - - getblockpatterns(&data->b, &y, &c, has_dc); - if(!data->iframe) { - swf_SetBits(tag,0,1); bits += 1; // COD - } - bits += codehuffman(tag, data->ctable, c); - bits += codehuffman(tag, cbpy, y); - - /* luminance */ - bits += encode8x8(tag, data->b.y1, has_dc, y&8); - bits += encode8x8(tag, data->b.y2, has_dc, y&4); - bits += encode8x8(tag, data->b.y3, has_dc, y&2); - bits += encode8x8(tag, data->b.y4, has_dc, y&1); - - /* chrominance */ - bits += encode8x8(tag, data->b.u, has_dc, c&2); - bits += encode8x8(tag, data->b.v, has_dc, c&1); - - copy_block_pic(s, s->current, &data->reconstruction, data->bx, data->by); - assert(data->bits == bits); - return bits; -} - -int getmvdbits(VIDEOSTREAM*s,block_t*fb, int bx,int by,int hx,int hy) -{ - block_t b; - block_t fbold; - block_t fbdiff; - int bits = 0; - memcpy(&fbdiff, fb, sizeof(block_t)); - getmvdregion(&fbold, s->oldpic, bx, by, hx, hy, s->linex); - yuvdiff(&fbdiff, &fbold); - dodctandquant(&fbdiff, &b, 0, s->quant); - bits += coefbits8x8(b.y1, 0); - bits += coefbits8x8(b.y2, 0); - bits += coefbits8x8(b.y3, 0); - bits += coefbits8x8(b.y4, 0); - bits += coefbits8x8(b.u, 0); - bits += coefbits8x8(b.v, 0); - return bits; -} - -void prepareMVDBlock(VIDEOSTREAM*s, mvdblockdata_t*data, int bx, int by, block_t* fb, int*bits) -{ /* consider mvd(x,y)-block */ - - int t; - int y,c; - block_t fbdiff; - int predictmvdx; - int predictmvdy; - - data->bx = bx; - data->by = by; - predictmvd(s,bx,by,&predictmvdx,&predictmvdy); - - data->bits = 65535; - data->movex=0; - data->movey=0; - - if(s->do_motion) { - int hx,hy; - int bestx=0,besty=0,bestbits=65536; - int startx=-32,endx=31; - int starty=-32,endy=31; - - if(!bx) startx=0; - if(!by) starty=0; - if(bx==s->bbx-1) endx=0; - if(by==s->bby-1) endy=0; - - for(hx=startx;hx<=endx;hx+=4) - for(hy=starty;hy<=endy;hy+=4) - { - int bits = 0; - bits = getmvdbits(s,fb,bx,by,hx,hy); - if(bits startx) startx = bestx-3; - if(besty-3 > starty) starty = besty-3; - if(bestx+3 < endx) endx = bestx+3; - if(besty+3 < endy) endy = besty+3; - - for(hx=startx;hx<=endx;hx++) - for(hy=starty;hy<=endy;hy++) - { - int bits = 0; - bits = getmvdbits(s,fb,bx,by,hx,hy); - if(bitsmovex = bestx; - data->movey = besty; - } - - memcpy(&fbdiff, fb, sizeof(block_t)); - getmvdregion(&data->fbold, s->oldpic, bx, by, data->movex, data->movey, s->linex); - yuvdiff(&fbdiff, &data->fbold); - dodctandquant(&fbdiff, &data->b, 0, s->quant); - getblockpatterns(&data->b, &y, &c, 0); - - data->xindex = mvd2index(predictmvdx, predictmvdy, data->movex, data->movey, 0); - data->yindex = mvd2index(predictmvdx, predictmvdy, data->movex, data->movey, 1); - - *bits = 1; //cod - *bits += mcbpc_inter[0*4+c].len; - *bits += cbpy[y^15].len; - *bits += mvd[data->xindex].len; // (0,0) - *bits += mvd[data->yindex].len; - *bits += coefbits8x8(data->b.y1, 0); - *bits += coefbits8x8(data->b.y2, 0); - *bits += coefbits8x8(data->b.y3, 0); - *bits += coefbits8x8(data->b.y4, 0); - *bits += coefbits8x8(data->b.u, 0); - *bits += coefbits8x8(data->b.v, 0); - data->bits = *bits; - - /* -- reconstruction -- */ - memcpy(&data->reconstruction, &data->b, sizeof(block_t)); - dequantize(&data->reconstruction, 0, s->quant); - doidct(&data->reconstruction); - for(t=0;t<64;t++) { - data->reconstruction.y1[t] = - truncate256(data->reconstruction.y1[t] + (int)data->fbold.y1[t]); - data->reconstruction.y2[t] = - truncate256(data->reconstruction.y2[t] + (int)data->fbold.y2[t]); - data->reconstruction.y3[t] = - truncate256(data->reconstruction.y3[t] + (int)data->fbold.y3[t]); - data->reconstruction.y4[t] = - truncate256(data->reconstruction.y4[t] + (int)data->fbold.y4[t]); - data->reconstruction.u[t] = - truncate256(data->reconstruction.u[t] + (int)data->fbold.u[t]); - data->reconstruction.v[t] = - truncate256(data->reconstruction.v[t] + (int)data->fbold.v[t]); - } -} - -int writeMVDBlock(VIDEOSTREAM*s, TAG*tag, mvdblockdata_t*data) -{ - int c = 0, y = 0; - int t; - int has_dc=0; // mvd w/o mvd24 - /* mvd (0,0) block (mode=0) */ - int mode = 0; - int bx = data->bx; - int by = data->by; - int bits = 0; - - getblockpatterns(&data->b, &y, &c, has_dc); - swf_SetBits(tag,0,1); bits += 1; // COD - bits += codehuffman(tag, mcbpc_inter, mode*4+c); - bits += codehuffman(tag, cbpy, y^15); - - /* vector */ - bits += codehuffman(tag, mvd, data->xindex); - bits += codehuffman(tag, mvd, data->yindex); - - /* luminance */ - bits += encode8x8(tag, data->b.y1, has_dc, y&8); - bits += encode8x8(tag, data->b.y2, has_dc, y&4); - bits += encode8x8(tag, data->b.y3, has_dc, y&2); - bits += encode8x8(tag, data->b.y4, has_dc, y&1); - - /* chrominance */ - bits += encode8x8(tag, data->b.u, has_dc, c&2); - bits += encode8x8(tag, data->b.v, has_dc, c&1); - - s->mvdx[by*s->bbx+bx] = data->movex; - s->mvdy[by*s->bbx+bx] = data->movey; - - copy_block_pic(s, s->current, &data->reconstruction, data->bx, data->by); - assert(data->bits == bits); - return bits; -} - -static int encode_PFrame_block(TAG*tag, VIDEOSTREAM*s, int bx, int by) -{ - block_t fb; - int diff1,diff2; - int bits_i; - int bits_vxy; - - iblockdata_t iblock; - mvdblockdata_t mvdblock; - - getregion(&fb, s->current, bx, by, s->linex); - prepareIBlock(s, &iblock, bx, by, &fb, &bits_i, 0); - - /* encoded last frame <=> original current block: */ - diff1 = compare_pic_pic(s, s->current, s->oldpic, bx, by); - /* encoded current frame <=> original current block: */ - diff2 = compare_pic_block(s, &iblock.reconstruction, s->current, bx, by); - - if(diff1 <= diff2) { - swf_SetBits(tag, 1,1); /* cod=1, block skipped */ - /* copy the region from the last frame so that we have a complete reconstruction */ - copyregion(s, s->current, s->oldpic, bx, by); - return 1; - } - prepareMVDBlock(s, &mvdblock, bx, by, &fb, &bits_vxy); - - if(bits_i > bits_vxy) { - return writeMVDBlock(s, tag, &mvdblock); - } else { - return writeIBlock(s, tag, &iblock); - } -} - -/* should be called encode_IFrameBlock */ -static void encode_IFrame_block(TAG*tag, VIDEOSTREAM*s, int bx, int by) -{ - block_t fb; - iblockdata_t data; - int bits; - - getregion(&fb, s->current, bx, by, s->width); - prepareIBlock(s, &data, bx, by, &fb, &bits, 1); - writeIBlock(s, tag, &data); -} - -#ifdef MAIN -static int bmid = 0; - -void setdbgpic(TAG*tag, RGBA*pic, int width, int height) -{ - MATRIX m; - tag = tag->prev; - - tag = swf_InsertTag(tag,ST_REMOVEOBJECT2); - swf_SetU16(tag, 133); - - tag = swf_InsertTag(tag, ST_DEFINEBITSLOSSLESS); - swf_SetU16(tag, 1000+bmid); - swf_SetLosslessBits(tag, width, height, (void*)pic, BMF_32BIT); - - tag = swf_InsertTag(tag, ST_DEFINESHAPE); - swf_SetU16(tag, 2000+bmid); - swf_ShapeSetBitmapRect(tag, 1000+bmid, width, height); - - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_GetMatrix(0,&m); - m.tx = width*20; - swf_ObjectPlace(tag, 2000+bmid, 133, &m, 0, 0); - - bmid++; -} -#endif - -#define TYPE_IFRAME 0 -#define TYPE_PFRAME 1 - -static void writeHeader(TAG*tag, int width, int height, int frame, int quant, int type) -{ - U32 i32; - swf_SetU16(tag, frame); - swf_SetBits(tag, 1, 17); /* picture start code*/ - swf_SetBits(tag, 0, 5); /* version=0, version 1 would optimize rle behaviour*/ - swf_SetBits(tag, frame, 8); /* time reference */ - - /* write dimensions, taking advantage of some predefined sizes - if the opportunity presents itself */ - i32 = width<<16|height; - switch(i32) - { - case 352<<16|288: swf_SetBits(tag, 2, 3);break; - case 176<<16|144: swf_SetBits(tag, 3, 3);break; - case 128<<16|96: swf_SetBits(tag, 4, 3);break; - case 320<<16|240: swf_SetBits(tag, 5, 3);break; - case 160<<16|120: swf_SetBits(tag, 6, 3);break; - default: - if(width>255 || height>255) { - swf_SetBits(tag, 1, 3); - swf_SetBits(tag, width, 16); - swf_SetBits(tag, height, 16); - } else { - swf_SetBits(tag, 0, 3); - swf_SetBits(tag, width, 8); - swf_SetBits(tag, height, 8); - } - } - - swf_SetBits(tag, type, 2); /* I-Frame or P-Frame */ - swf_SetBits(tag, 0, 1); /* No deblock filter */ - assert(quant>0); - assert(quant<32); - swf_SetBits(tag, quant, 5); /* quantizer (1-31), may be updated later on*/ - swf_SetBits(tag, 0, 1); /* No extra info */ -} - -void swf_SetVideoStreamIFrame(TAG*tag, VIDEOSTREAM*s, RGBA*pic, int quant) -{ - int bx, by; - - if(quant<1) quant=1; - if(quant>31) quant=31; - s->quant = quant; - - writeHeader(tag, s->width, s->height, s->frame, quant, TYPE_IFRAME); - - /* fixme: should fill with 0,128,128, not 0,0,0 */ - memset(s->current, 0, s->linex*s->height*sizeof(YUV)); - - rgb2yuv(s->current, pic, s->linex, s->olinex, s->owidth, s->oheight); - - for(by=0;bybby;by++) - { - for(bx=0;bxbbx;bx++) - { - encode_IFrame_block(tag, s, bx, by); - } - } - s->frame++; - memcpy(s->oldpic, s->current, s->width*s->height*sizeof(YUV)); -} -void swf_SetVideoStreamBlackFrame(TAG*tag, VIDEOSTREAM*s) -{ - int bx, by; - int quant = 31; - int x,y; - s->quant = quant; - - writeHeader(tag, s->width, s->height, s->frame, quant, TYPE_IFRAME); - - for(y=0;yheight;y++) - for(x=0;xwidth;x++) { - s->current[y*s->width+x].y = 0; - s->current[y*s->width+x].u = 128; - s->current[y*s->width+x].v = 128; - } - for(x=0;x<16;x++) - for(y=0;y<16;y++) { - s->current[y*s->width+x].y = 64; - s->current[y*s->width+x].u = 128; - s->current[y*s->width+x].v = 128; - } - - for(by=0;bybby;by++) - { - for(bx=0;bxbbx;bx++) - { - encode_IFrame_block(tag, s, bx, by); - } - } - s->frame++; - memcpy(s->oldpic, s->current, s->width*s->height*sizeof(YUV)); -} - -void swf_SetVideoStreamPFrame(TAG*tag, VIDEOSTREAM*s, RGBA*pic, int quant) -{ - int bx, by; - - if(quant<1) quant=1; - if(quant>31) quant=31; - s->quant = quant; - - writeHeader(tag, s->width, s->height, s->frame, quant, TYPE_PFRAME); - - /* fixme: should fill with 0,128,128, not 0,0,0 */ - memset(s->current, 0, s->linex*s->height*sizeof(YUV)); - - rgb2yuv(s->current, pic, s->linex, s->olinex, s->owidth, s->oheight); - memset(s->mvdx, 0, s->bbx*s->bby*sizeof(int)); - memset(s->mvdy, 0, s->bbx*s->bby*sizeof(int)); - - for(by=0;bybby;by++) - { - for(bx=0;bxbbx;bx++) - { - encode_PFrame_block(tag, s, bx, by); - } - } - s->frame++; - memcpy(s->oldpic, s->current, s->width*s->height*sizeof(YUV)); - -#ifdef MAIN -#ifdef PNG - yuv2rgb(pic, s->current, s->linex, s->width, s->height); - setdbgpic(tag, pic, s->width, s->height); -#endif -#endif -} - -void swf_SetVideoStreamMover(TAG*tag, VIDEOSTREAM*s, signed char* movex, signed char* movey, void**pictures, int quant) -{ - int bx, by; - YUV pic[16*16]; - - if(quant<1) quant=1; - if(quant>31) quant=31; - s->quant = quant; - - writeHeader(tag, s->width, s->height, s->frame, quant, TYPE_PFRAME); - - memset(s->mvdx, 0, s->bbx*s->bby*sizeof(int)); - memset(s->mvdy, 0, s->bbx*s->bby*sizeof(int)); - - for(by=0;bybby;by++) - { - for(bx=0;bxbbx;bx++) - { - int predictmvdx=0, predictmvdy=0; - int mvx=movex[by*s->bbx+bx]; - int mvy=movey[by*s->bbx+bx]; - void*picture = pictures?pictures[by*s->bbx+bx]:0; - - if(mvx<-32) mvx=-32; - if(mvx>31) mvx=31; - if(mvy<-32) mvy=-32; - if(mvy>31) mvy=31; - - if(mvx == 0 && mvy == 0 && picture == 0) { - swf_SetBits(tag,1,1); // COD skip - } else { - int mode = 0; - int has_dc=0; - int y=0,c=0; - block_t b; - block_t b2; - - swf_SetBits(tag,0,1); // COD - - if(mvx==0 && mvy==0 && picture) { // only picture - mode = 3; - has_dc = 1; - } - - if(picture) { - RGBA* picblock = (RGBA*)picture; - rgb2yuv(pic, picblock,16,16,16,16); - /* TODO: if has_dc!=1, subtract 128 from rgb values */ - getregion(&b, pic, 0,0,16); - dodctandquant(&b, &b2, 1, s->quant); - getblockpatterns(&b2, &y, &c, 1); - } else { - y=0;c=0; - } - - codehuffman(tag, mcbpc_inter, mode*4+c); - codehuffman(tag, cbpy, mode==3?y:y^15); - - if(mode < 3) { - /* has motion vector */ - predictmvd(s,bx,by,&predictmvdx,&predictmvdy); - codehuffman(tag, mvd, mvd2index(predictmvdx, predictmvdy, mvx, mvy, 0)); - codehuffman(tag, mvd, mvd2index(predictmvdx, predictmvdy, mvx, mvy, 1)); - s->mvdx[by*s->bbx+bx] = mvx; - s->mvdy[by*s->bbx+bx] = mvy; - } - - if(has_dc||y||c) { - encode8x8(tag, b2.y1, has_dc, y&8); - encode8x8(tag, b2.y2, has_dc, y&4); - encode8x8(tag, b2.y3, has_dc, y&2); - encode8x8(tag, b2.y4, has_dc, y&1); - encode8x8(tag, b2.u, has_dc, c&2); - encode8x8(tag, b2.v, has_dc, c&1); - } - } - } - } - s->frame++; -} - -#define TESTS -#ifdef TESTS -void test_copy_diff() -{ - VIDEOSTREAM stream; - VIDEOSTREAM* s = &stream; - TAG*tag; - RGBA*pic = (RGBA*)rfx_alloc(256*256*sizeof(RGBA)); - block_t fb; - int x,y; - int bx,by; - for(x=0;x<256;x++) - for(y=0;y<256;y++) { - pic[y*256+x].r = x*y; - pic[y*256+x].g = x+y; - pic[y*256+x].b = (x+1)%(y+1); - } - tag = swf_InsertTag(0, ST_DEFINEVIDEOSTREAM); - swf_SetU16(tag, 33); - swf_SetVideoStreamDefine(tag, s, 10, 256, 256); - - rgb2yuv(s->current, pic, s->linex, s->olinex, s->owidth, s->oheight); - for(by=0;by<16;by++) - for(bx=0;bx<16;bx++) { - int diff1,diff2; - /* test1: does compare pic pic return zero for identical blocks? */ - diff1 = compare_pic_pic(s, s->current, s->current, bx, by); - assert(!diff1); - /* test2: do blocks which are copied back return zero diff? */ - getregion(&fb, s->current, bx, by, s->linex); - copy_block_pic(s, s->oldpic, &fb, bx, by); - diff1 = compare_pic_block(s, &fb, s->oldpic, bx, by); - assert(!diff1); - /* test3: does compare_pic_block return the same result as compare_pic_pic? */ - getregion(&fb, s->current, 15-bx, 15-by, s->linex); - copy_block_pic(s, s->oldpic, &fb, bx, by); - diff1 = compare_pic_block(s, &fb, s->current, bx, by); - diff2 = compare_pic_pic(s, s->current, s->oldpic, bx, by); - assert(diff1 == diff2); - } -} - -#endif - -#ifdef MAIN -#include "png.h" - -int compileSWFActionCode(const char *script, int version, void**data, int*len) {return 0;} - -void mkblack() -{ - SWF swf; - SWFPLACEOBJECT obj; - int frames = 88; - int width = 160; - int height = 112; - int x,y; - TAG*tag = 0; - RGBA rgb; - RGBA* pic = 0; - VIDEOSTREAM stream; - - pic = rfx_calloc(width*height*4); - - memset(&swf,0,sizeof(SWF)); - memset(&obj,0,sizeof(obj)); - - swf.fileVersion = 6; - swf.frameRate = 15*256; - swf.movieSize.xmax = 20*width; - swf.movieSize.ymax = 20*height; - - swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); - tag = swf.firstTag; - rgb.r = 0x00;rgb.g = 0x30;rgb.b = 0xff; - swf_SetRGB(tag,&rgb); - - tag = swf_InsertTag(tag, ST_DEFINEVIDEOSTREAM); - swf_SetU16(tag, 1); - swf_SetVideoStreamDefine(tag, &stream, frames, width, height); - stream.do_motion = 0; - - for(y=0;y -#include -#include -#include "jpeg.h" -#include "../config.h" - -#ifdef HAVE_JPEGLIB -#define HAVE_BOOLEAN -#include - -#define OUTBUFFER_SIZE 0x8000 - -static FILE*fi; -static JOCTET * buffer; -static unsigned char*dest; -static int len; -static int destlen; -static unsigned char*data; -static int pos; -static int size; - -static void file_init_destination(j_compress_ptr cinfo) -{ - struct jpeg_destination_mgr*dmgr = - (struct jpeg_destination_mgr*)(cinfo->dest); - buffer = (JOCTET*)malloc(OUTBUFFER_SIZE); - if(!buffer) { - perror("malloc"); - printf("Out of memory!\n"); - exit(1); - } - dmgr->next_output_byte = buffer; - dmgr->free_in_buffer = OUTBUFFER_SIZE; -} - -static boolean file_empty_output_buffer(j_compress_ptr cinfo) -{ - struct jpeg_destination_mgr*dmgr = - (struct jpeg_destination_mgr*)(cinfo->dest); - if(fi) - fwrite(buffer, OUTBUFFER_SIZE, 1, fi); - dmgr->next_output_byte = buffer; - dmgr->free_in_buffer = OUTBUFFER_SIZE; - return 1; -} - -static void file_term_destination(j_compress_ptr cinfo) -{ struct jpeg_destination_mgr*dmgr = - (struct jpeg_destination_mgr*)(cinfo->dest); - if(fi) - fwrite(buffer, OUTBUFFER_SIZE-dmgr->free_in_buffer, 1, fi); - free(buffer); - buffer = 0; - dmgr->free_in_buffer = 0; -} - -static void mem_init_destination(j_compress_ptr cinfo) -{ - struct jpeg_destination_mgr*dmgr = - (struct jpeg_destination_mgr*)(cinfo->dest); - dmgr->next_output_byte = dest; - dmgr->free_in_buffer = destlen; -} - -static boolean mem_empty_output_buffer(j_compress_ptr cinfo) -{ - printf("jpeg mem overflow!\n"); - exit(1); -} - -static void mem_term_destination(j_compress_ptr cinfo) -{ - struct jpeg_destination_mgr*dmgr = - (struct jpeg_destination_mgr*)(cinfo->dest); - len = destlen - dmgr->free_in_buffer; - dmgr->free_in_buffer = 0; -} - -int jpeg_save(unsigned char*data, unsigned width, unsigned height, int quality, const char*filename) -{ - struct jpeg_destination_mgr mgr; - struct jpeg_compress_struct cinfo; - struct jpeg_error_mgr jerr; - int t; - - if(filename) - fi = fopen(filename, "wb"); - else - fi = 0; - - memset(&cinfo, 0, sizeof(cinfo)); - memset(&jerr, 0, sizeof(jerr)); - memset(&mgr, 0, sizeof(mgr)); - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_compress(&cinfo); - - mgr.init_destination = file_init_destination; - mgr.empty_output_buffer = file_empty_output_buffer; - mgr.term_destination = file_term_destination; - cinfo.dest = &mgr; - - // init compression - - cinfo.image_width = width; - cinfo.image_height = height; - cinfo.input_components = 3; - cinfo.in_color_space = JCS_RGB; - jpeg_set_defaults(&cinfo); - jpeg_set_quality(&cinfo,quality,TRUE); - - //jpeg_write_tables(&cinfo); - //jpeg_suppress_tables(&cinfo, TRUE); - jpeg_start_compress(&cinfo, FALSE); - - for(t=0;tsrc; - mgr->next_input_byte = data; - mgr->bytes_in_buffer = size; - //printf("init %d\n", size - mgr->bytes_in_buffer); -} - -boolean mem_fill_input_buffer (j_decompress_ptr cinfo) -{ - struct jpeg_source_mgr* mgr = cinfo->src; - printf("fill %d\n", size - mgr->bytes_in_buffer); - return 0; -} - -void mem_skip_input_data (j_decompress_ptr cinfo, long num_bytes) -{ - struct jpeg_source_mgr* mgr = cinfo->src; - printf("skip %d +%ld\n", size - mgr->bytes_in_buffer, num_bytes); - if(num_bytes<=0) - return; - mgr->next_input_byte += num_bytes; - mgr->bytes_in_buffer -= num_bytes; -} - -boolean mem_resync_to_restart (j_decompress_ptr cinfo, int desired) -{ - struct jpeg_source_mgr* mgr = cinfo->src; - printf("resync %d\n", size - mgr->bytes_in_buffer); - mgr->next_input_byte = data; - mgr->bytes_in_buffer = size; - return 1; -} - -void mem_term_source (j_decompress_ptr cinfo) -{ - struct jpeg_source_mgr* mgr = cinfo->src; - //printf("term %d\n", size - mgr->bytes_in_buffer); -} - -int jpeg_load_from_mem(unsigned char*_data, int _size, unsigned char**dest, unsigned*width, unsigned*height) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - struct jpeg_source_mgr mgr; - - data = _data; - size = _size; - - jpeg_create_decompress(&cinfo); - - mgr.next_input_byte = data; - mgr.bytes_in_buffer = size; - mgr.init_source =mem_init_source ; - mgr.fill_input_buffer =mem_fill_input_buffer ; - mgr.skip_input_data =mem_skip_input_data ; - mgr.resync_to_restart =mem_resync_to_restart ; - mgr.term_source =mem_term_source ; - - cinfo.err = jpeg_std_error(&jerr); - cinfo.src = &mgr; - - jpeg_read_header(&cinfo, TRUE); - cinfo.out_color_space == JCS_RGB; - jpeg_start_decompress(&cinfo); - - *width = cinfo.output_width; - *height = cinfo.output_height; - *dest = malloc(cinfo.output_width * cinfo.output_height * 4); - - unsigned char*scanline = malloc(cinfo.output_width * 4); - int y; - for(y=0;y 0xffffffff) { - *_width = 0; - *_height = 0; - return 0; - } - *dest = (unsigned char*)malloc(image_size); - - int y; - for (y=0;y= 0; x--) { - line[x].a = 255; - line[x].r = js[x*3+0]; - line[x].g = js[x*3+1]; - line[x].b = js[x*3+2]; - } - } else if (cinfo.out_color_space == JCS_YCCK) { - fprintf(stderr, "Error: Can't convert YCCK to RGB.\n"); - return 0; - } else if (cinfo.out_color_space == JCS_YCbCr) { - for (x = 0; x < width; x++) { - int y = js[x * 3 + 0]; - int u = js[x * 3 + 1]; - int v = js[x * 3 + 1]; - line[x].a = 255; - line[x].r = y + ((360 * (v - 128)) >> 8); - line[x].g = y - ((88 * (u - 128) + 183 * (v - 128)) >> 8); - line[x].b = y + ((455 * (u - 128)) >> 8); - } - } else if (cinfo.out_color_space == JCS_CMYK) { - for (x = 0; x < width; x++) { - int white = 255 - js[x * 4 + 3]; - line[x].a = 255; - line[x].r = white - ((js[x * 4] * white) >> 8); - line[x].g = white - ((js[x * 4 + 1] * white) >> 8); - line[x].b = white - ((js[x * 4 + 2] * white) >> 8); - } - } - } - - free(scanline); - - jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - fclose(fi); - return 1; -} - -void jpeg_get_size(const char *filename, unsigned *width, unsigned*height) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - FILE *fi; - *width = 0; - *height = 0; - cinfo.err = jpeg_std_error(&jerr); - cinfo.image_width = 0; - cinfo.image_height = 0; - jpeg_create_decompress(&cinfo); - if ((fi = fopen(filename, "rb")) == NULL) { - fprintf(stderr, "couldn't open %s\n", filename); - return; - } - jpeg_stdio_src(&cinfo, fi); - jpeg_read_header(&cinfo, TRUE); - *width = cinfo.image_width; - *height = cinfo.image_height; - jpeg_destroy_decompress(&cinfo); - fclose(fi); -} - -#else - -int jpeg_save(unsigned char*data, unsigned width, unsigned height, int quality, const char*filename) -{ - fprintf(stderr, "jpeg_save: No JPEG support compiled in\n"); - return 0; -} -int jpeg_save_to_file(unsigned char*data, unsigned width, unsigned height, int quality, FILE*fi) -{ - fprintf(stderr, "jpeg_save_to_file: No JPEG support compiled in\n"); - return 0; -} -int jpeg_save_to_mem(unsigned char*data, unsigned width, unsigned height, int quality, unsigned char*dest, int destsize) -{ - fprintf(stderr, "jpeg_save_tomem: No JPEG support compiled in\n"); - return 0; -} -int jpeg_load_from_mem(unsigned char*_data, int size, unsigned char**dest, unsigned*width, unsigned*height) -{ - fprintf(stderr, "jpeg_load_from_mem: No JPEG support compiled in\n"); - return 0; -} -int jpeg_load(const char*filename, unsigned char**dest, unsigned*_width, unsigned*_height) -{ - fprintf(stderr, "jpeg_load: No JPEG support compiled in\n"); - return 0; -} -void jpeg_get_size(const char *fname, unsigned *width, unsigned *height) -{ - *width = 0; - *height = 0; - fprintf(stderr, "jpeg_get_size: No JPEG support compiled in\n"); -} - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/jpeg.h b/fluidbook/tools/swftools-special-swfdump/lib/jpeg.h deleted file mode 100644 index c6ef30b26..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/jpeg.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __jpeg_h__ -#define __jpeg_h__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -int jpeg_save(unsigned char*data, unsigned int width, unsigned int height, int quality, const char*filename); -int jpeg_save_gray(unsigned char*data, unsigned int width, unsigned int height, int quality, const char*filename); -int jpeg_save_to_file(unsigned char*data, unsigned int width, unsigned int height, int quality, FILE*fi); -int jpeg_save_to_mem(unsigned char*data, unsigned int width, unsigned int height, int quality, unsigned char*dest, int destsize); -int jpeg_load(const char*filename, unsigned char**dest, unsigned int*width, unsigned int*height); -int jpeg_load_from_mem(unsigned char*_data, int _size, unsigned char**dest, unsigned int*width, unsigned int*height); -void jpeg_get_size(const char *fname, unsigned int *width, unsigned int *height); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/kdtree.c b/fluidbook/tools/swftools-special-swfdump/lib/kdtree.c deleted file mode 100644 index b3e8ae44e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/kdtree.c +++ /dev/null @@ -1,507 +0,0 @@ -/* kdtree.c - Implementation of 2d kd trees. - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include "q.h" -#include "kdtree.h" - -/* 0=right 1=down 2=left 3=up */ -static int vx_and[4] = {INT_MAX, 0, INT_MAX, 0}; -static int vy_and[4] = {0, INT_MAX, 0, INT_MAX}; -static int vx[4] = {1, 0, -1, 0}; -static int vy[4] = {0, 1, 0, -1}; -static int vsign[4] = {1,1,-1,-1}; -static char* vname[4] = {"right", "down", "left", "up"}; - -kdarea_t* kdarea_new(void*data) -{ - NEW(kdarea_t,area); - area->bbox.xmin = INT_MIN; - area->bbox.ymin = INT_MIN; - area->bbox.xmax = INT_MAX; - area->bbox.ymax = INT_MAX; - area->data = data; - return area; -} - -kdtree_t* kdtree_new() -{ - NEW(kdtree_t,tree); - tree->root = kdarea_new(0); - return tree; -} - -static inline int32_t max32(int32_t v1, int32_t v2) {return v1>v2?v1:v2;} -static inline int32_t min32(int32_t v1, int32_t v2) {return v1type = type; - b->xy = xy; - return b; -} - -kdarea_t*kdbranch_follow(const kdbranch_t*tree, int32_t x, int32_t y) -{ - /* - int follow = 0; - switch(tree->type) { - case KD_LEFT: - follow = (x < tree->xy); - break; - case KD_RIGHT: - follow = (x > tree->xy); - break; - case KD_UP: - follow = (y < tree->xy); - break; - case KD_DOWN: - follow = (y > tree->xy); - break; - } - return &tree->side[follow]; - */ - int32_t s = x*vx[tree->type] + y*vy[tree->type]; - int32_t v = tree->xy*vsign[tree->type]; - if(s == v) - return 0; //point is on the boundary - return tree->side[s < v]; -} - -static kdarea_list_t* kdarea_list_new(kdarea_t*area) -{ - NEW(kdarea_list_t,b); - b->area = area; - b->next = b->prev = b; - return b; -} - -static kdarea_list_t*kdarea_list_concatenate(kdarea_list_t*l1, kdarea_list_t*l2) -{ - if(!l1) return l2; - if(!l2) return l1; - l2->prev->next = l1->next; - l1->next->prev = l2->prev; - l2->prev = l1; - l1->next = l2; - return l1; -} - -static kdbbox_t bbox_for_halfplane(int xy, int dir) -{ - kdbbox_t b = {INT_MIN,INT_MIN,INT_MAX,INT_MAX}; - switch(dir) { - case KD_LEFT: - b.xmax = xy; - break; - case KD_RIGHT: - b.xmin = xy; - break; - case KD_UP: - b.ymax = xy; - break; - case KD_DOWN: - b.ymin = xy; - break; - } - return b; -} - -static kdbbox_t intersect_bbox(const kdbbox_t*box1, const kdbbox_t*box2) -{ - kdbbox_t b = *box1; - if(box2->xmin > b.xmin) - b.xmin = box2->xmin; - if(box2->ymin > b.ymin) - b.ymin = box2->ymin; - if(box2->xmax < b.xmax) - b.xmax = box2->xmax; - if(box2->ymax < b.ymax) - b.ymax = box2->ymax; - if(b.xmin > b.xmax) - b.xmax = b.xmin; - if(b.ymin > b.ymax) - b.ymax = b.ymin; - return b; -} - -static void kdarea_split(kdarea_t*area, int xy, int dir, - int32_t x1, int32_t y1, - int32_t x2, int32_t y2) -{ - if(!area->split) { - kdbranch_t*b = area->split = kdbranch_new(xy, dir); - kdbbox_t b1 = bbox_for_halfplane(xy, dir); - kdbbox_t b2 = bbox_for_halfplane(xy, dir^2); - b->side[0] = kdarea_new(area->data); - b->side[1] = kdarea_new(area->data); - b->side[0]->bbox = intersect_bbox(&area->bbox,&b1); - b->side[1]->bbox = intersect_bbox(&area->bbox,&b2); - memcpy(b->side[0]->neighbors, area->neighbors, sizeof(area->neighbors)); - memcpy(b->side[1]->neighbors, area->neighbors, sizeof(area->neighbors)); - b->side[0]->neighbors[dir^2] = b->side[1]; - b->side[1]->neighbors[dir] = b->side[0]; - area->data = 0; - } else { - kdbranch_t*split = area->split; - kdarea_t*first = kdbranch_follow(split, x1,y1); - kdarea_t*second = kdbranch_follow(split, x2,y2); - - if(!first) { - if(!second) { - /* line is on top of an already existing segment */ - return; - } else { - /* first point is directly on the split */ - kdarea_split(second, xy, dir, x1,y1, x2,y2); - return; - } - } else { - if(!second) { - /* second point is directly on the split */ - kdarea_split(first, xy, dir, x1,y1, x2,y2); - return; - } else if(first == second) { - /* both points are to the same side of this split */ - kdarea_split(first, xy, dir, x1,y1, x2,y2); - return; - } else { - kdarea_split(first, xy, dir, x1,y1, x2,y2); - kdarea_split(second, xy, dir, x1,y1, x2,y2); - return; - } - } - } -} - -static kdarea_list_t* kdarea_filter(kdarea_t*area, int xy, int dir) -{ - if(!area->split) { - return kdarea_list_new(area); - } else { - kdbranch_t*branch = area->split; - if((branch->type^dir) == 0) { - /* both filter as well as branch point into the same direction */ - if(xy*vsign[dir] >= branch->xy*vsign[dir]) { - /* filter splits the primary node. We can skip the other one. */ -#ifdef DEBUG - printf("%p: using %p, skipping %p (looking to %s of %d)\n", area, branch->side[0], branch->side[1], vname[dir], xy); -#endif - return kdarea_filter(branch->side[0], xy, dir); - } else { - /* filter splits the secondary node. the primary node is left completely intact, - and returned as such */ -#ifdef DEBUG - printf("%p: expanding %p, filtering %p (looking to %s of %d)\n", area, branch->side[0], branch->side[1], vname[dir], xy); -#endif - kdarea_list_t*l1 = kdarea_list_new(branch->side[0]); - kdarea_list_t*l2 = kdarea_filter(branch->side[1], xy, dir); - return kdarea_list_concatenate(l1,l2); - } - } else if((branch->type^dir) == 2) { - /* filter and branch point into opposite directions */ - if(xy*vsign[dir] >= branch->xy*vsign[dir]) { - // filter splits the secondary node. We can skip the primary node. -#ifdef DEBUG - printf("%p: skipping %p, using %p (looking to %s of %d)\n", area, branch->side[0], branch->side[1], vname[dir], xy); -#endif - return kdarea_filter(branch->side[1], xy, dir); - } else { - /* filter splits the primary node. the secondary node is left completely intact, - and returned as such */ -#ifdef DEBUG - printf("%p: filtering %p, expanding %p (looking to %s of %d)\n", area, branch->side[0], branch->side[1], vname[dir], xy); -#endif - kdarea_list_t*l1 = kdarea_filter(branch->side[0], xy, dir); - kdarea_list_t*l2 = kdarea_list_new(branch->side[1]); - return kdarea_list_concatenate(l1,l2); - } - } else { - /* filter segment is perpendicular to the node */ - return kdarea_list_new(area); - } - } -} - -static kdarea_t* kdarea_find(kdarea_t*node, int x, int y) -{ - while(node) { - if(!node->split) - break; - node = kdbranch_follow(node->split, x,y); - } - return node; -} - -kdarea_t*kdtree_find(kdtree_t*tree, int x, int y) -{ - return kdarea_find(tree->root, x,y); -} - -void kdarea_list_destroy(kdarea_list_t*list) -{ - kdarea_list_t*i = list; - if(i) do { - kdarea_list_t*next = i->next; - free(i); - i = next; - } while(i!=list); -} - -static kdarea_list_t* kdarea_list_add(kdarea_list_t*l, kdarea_t*area) -{ - return kdarea_list_concatenate(l,kdarea_list_new(area)); -} - -static kdarea_list_t* kdarea_all_children(kdarea_t*area, int32_t x1, int32_t y1, int32_t x2, int32_t y2, kdarea_list_t*result) -{ - if(!area->split) { - if(area->bbox.xmin >= x1 && - area->bbox.ymin >= y1 && - area->bbox.xmax <= x2 && - area->bbox.ymax <= y2) { - result = kdarea_list_add(result, area); - } - } else { - result = kdarea_all_children(area->split->side[0], x1, y1, x2, y2, result); - result = kdarea_all_children(area->split->side[1], x1, y1, x2, y2, result); - } - return result; -} - -/* return all areas that are contained in, or partly intersect, the given bounding box */ -kdarea_list_t* kdtree_filter(kdtree_t*tree, int32_t x1, int32_t y1, int32_t x2, int32_t y2, char leafs) -{ - kdarea_list_t*result = 0; - kdarea_list_t*branches1 = kdarea_filter(tree->root, x2, KD_LEFT); - kdarea_list_t*i = branches1; - -#ifdef DEBUG - kdarea_list_t*u = branches1; - if(u) do {printf("%p [%d %d %d %d] is to the left of %d\n", u->area, u->area->bbox.xmin, u->area->bbox.ymin, u->area->bbox.xmax, u->area->bbox.ymax, x2);u = u->next;} while(u!=branches1); -#endif - if(i) do { - kdarea_list_t*branches2 = kdarea_filter(i->area, y2, KD_UP); - kdarea_list_t*j = branches2; - -#ifdef DEBUG - kdarea_list_t*u = branches2; - if(u) do {printf("%p [%d %d %d %d] is above %d\n", u->area, u->area->bbox.xmin, u->area->bbox.ymin, u->area->bbox.xmax, u->area->bbox.ymax, y2);u = u->next;} while(u!=branches2); -#endif - if(j) do { - kdarea_list_t*branches3 = kdarea_filter(j->area, x1, KD_RIGHT); - kdarea_list_t*k = branches3; -#ifdef DEBUG - kdarea_list_t*u = branches3; - if(u) do {printf("%p [%d %d %d %d] is to the right of %d\n", u->area, u->area->bbox.xmin, u->area->bbox.ymin, u->area->bbox.xmax, u->area->bbox.ymax, x1);u = u->next;} while(u!=branches3); -#endif - if(k) do { - kdarea_list_t*branches4 = kdarea_filter(k->area, y1, KD_DOWN); - kdarea_list_t*l = branches4; -#ifdef DEBUG - kdarea_list_t*u = branches4; - if(u) do {printf("%p [%d %d %d %d] is below %d\n", u->area, u->area->bbox.xmin, u->area->bbox.ymin, u->area->bbox.xmax, u->area->bbox.ymax, y1);u = u->next;} while(u!=branches4); -#endif - if(leafs) { - if(l) do { - result = kdarea_list_concatenate(result, kdarea_all_children(l->area, x1, y1, x2, y2, 0)); - l = l->next; - } while(l!=branches4); - kdarea_list_destroy(branches4); - } else { - result = kdarea_list_concatenate(result, l); - } - k = k->next; - } while(k!=branches3); - kdarea_list_destroy(branches3); - j = j->next; - } while(j!=branches2); - kdarea_list_destroy(branches2); - i = i->next; - } while(i!=branches1); - kdarea_list_destroy(branches1); - return result; -} - -static void kdtree_modify_box(kdtree_t*tree, int32_t x1, int32_t y1, int32_t x2, int32_t y2, void*(*f)(void*user,void*data), void*user) -{ - kdarea_split(tree->root, x2, KD_LEFT, x2,y1, x2,y2); - kdarea_split(tree->root, y2, KD_UP, x1,y2, x2,y2); - kdarea_split(tree->root, x1, KD_RIGHT, x1,y1, x1,y2); - kdarea_split(tree->root, y1, KD_DOWN, x1,y1, x2,y1); -#ifdef DEBUG - printf("inserting (%d,%d,%d,%d) %p\n", x1, y1, x2, y2, user); -#endif - kdarea_list_t*l = kdtree_filter(tree, x1, y1, x2, y2, 1); - kdarea_list_t*i = l; - if(l) do { -#ifdef DEBUG - printf("%p [%d,%d,%d,%d], is contained in [%d %d %d %d]\n", i->area, - i->area->bbox.xmin, - i->area->bbox.ymin, - i->area->bbox.xmax, - i->area->bbox.ymax, - x1, y1, x2, y2); -#endif - i->area->data = f(user, i->area->data); - i = i->next; - } while(i!=l); - kdarea_list_destroy(l); -} - -static void* overwrite(void*user, void*data) -{ - return user; -} - -void kdtree_add_box(kdtree_t*tree, int32_t x1, int32_t y1, int32_t x2, int32_t y2, void*data) -{ - kdtree_modify_box(tree, x1, y1, x2, y2, overwrite, data); -} - -kdarea_t*kdarea_neighbor(kdarea_t*area, int dir, int xy) -{ - int x,y; - switch(dir) { - case KD_LEFT: - x = area->bbox.xmin; - y = xy; - break; - case KD_RIGHT: - x = area->bbox.xmax; - y = xy; - break; - case KD_UP: - x = xy; - y = area->bbox.ymin; - break; - case KD_DOWN: - x = xy; - y = area->bbox.ymax; - break; - } - kdarea_t*n = area->neighbors[dir]; - if(!n) - return 0; - return kdarea_find(n, x, y); -} - -static void do_indent(int l) -{ - int i; - for(i=0;itype], branch->xy); - kdbbox_t b = bbox_for_halfplane(branch->xy, branch->type); - kdarea_print(branch->side[0], indent+4); - kdarea_print(branch->side[1], indent+4); -} - -void kdarea_print(kdarea_t*area, int indent) -{ - int i; - assert(area); - do_indent(indent);printf("[%p] area (%d,%d,%d,%d) %p (l:%p r:%p u:%p d:%p)\n", area, - area->bbox.xmin, - area->bbox.ymin, - area->bbox.xmax, - area->bbox.ymax, - area->data, - area->neighbors[KD_LEFT], - area->neighbors[KD_RIGHT], - area->neighbors[KD_UP], - area->neighbors[KD_DOWN]); - if(area->split) { - kdbranch_print(area->split, indent+4); - } -} - -void kdtree_print(kdtree_t*tree) -{ - kdarea_print(tree->root, 0); -} - - -void kdbranch_destroy(kdbranch_t*b) -{ - if(b->side[0]) { - kdarea_destroy(b->side[0]); - b->side[0] = 0; - } - if(b->side[1]) { - kdarea_destroy(b->side[1]); - b->side[1] = 0; - } - free(b); -} - -void kdarea_destroy(kdarea_t*area) -{ - if(area->split) { - kdbranch_destroy(area->split); - } - free(area); -} - -void kdtree_destroy(kdtree_t*tree) -{ - kdarea_destroy(tree->root); - tree->root = 0; - free(tree); -} - -#ifdef MAIN -int main() -{ - assert((1^vx[2]) < 0); - - kdtree_t*tree = kdtree_new(); - kdtree_add_box(tree, 10,30,20,40, "hello world"); - kdtree_add_box(tree, 12,50,15,60, "hello world"); - //kdtree_print(tree); - kdarea_t*a = kdtree_find(tree, 15,35); - kdarea_t*left = kdarea_neighbor(a, KD_LEFT, /*y*/35); - kdarea_t*right = kdarea_neighbor(a, KD_RIGHT, /*y*/35); - kdarea_t*up = kdarea_neighbor(a, KD_UP, /*x*/15); - kdarea_t*down = kdarea_neighbor(a, KD_DOWN, /*x*/15); - - a = kdtree_find(tree, 15,25); - assert(!a || !a->data); - a = kdtree_find(tree, 15,45); - assert(!a || !a->data); - a = kdtree_find(tree, 5,35); - assert(!a || !a->data); - a = kdtree_find(tree, 45,35); - assert(!a || !a->data); - - kdtree_destroy(tree); -} -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/kdtree.h b/fluidbook/tools/swftools-special-swfdump/lib/kdtree.h deleted file mode 100644 index 24fb12afe..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/kdtree.h +++ /dev/null @@ -1,98 +0,0 @@ -/* kdtree.h - Implementation of 2d kd trees. - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __kdtree_h__ -#define __kdtree_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* - 3 - A - | - | - 2 <---- ----> 0 - | - | - V - 1 -*/ - -typedef enum {KD_RIGHT=0, KD_DOWN=1, KD_LEFT=2, KD_UP=3} kdtype_t; - -typedef struct _kdbbox { - int32_t xmin, ymin, xmax, ymax; -} kdbbox_t; - -struct _kdbranch; -struct _kdarea; -typedef struct _kdbranch kdbranch_t; -typedef struct _kdarea kdarea_t; - -struct _kdbranch { - kdtype_t type; - kdarea_t*side[2]; - int32_t xy; -}; - -struct _kdarea { - kdarea_t*neighbors[4]; - kdbbox_t bbox; - kdbranch_t*split; - void*data; -}; - -typedef struct _kdtree { - kdarea_t*root; -} kdtree_t; - -/* usually a subset of the tree, e.g. caused by - intersecting the tree with a halfplane */ -typedef struct _kdarea_list { - struct _kdarea_list*next; - struct _kdarea_list*prev; - kdarea_t*area; -} kdarea_list_t; - -kdtree_t* kdtree_new(); -void kdarea_destroy(kdarea_t*area); -void kdbranch_destroy(kdbranch_t*b); -void kdtree_destroy(kdtree_t*tree); -kdarea_t* kdtree_find(kdtree_t*tree, int x, int y); -void kdtree_add_box(kdtree_t*tree, int32_t x1, int32_t y1, int32_t x2, int32_t y2, void*data); -void kdtree_print(kdtree_t*tree); - -kdarea_t*kdarea_neighbor(kdarea_t*area, int dir, int xy); - -#define kdarea_left_neighbor(area, y) (kdarea_neighbor((area), KD_LEFT, (y))) -#define kdarea_right_neighbor(area, y) (kdarea_neighbor((area), KD_RIGHT, (y))) -#define kdarea_top_neighbor(area, x) (kdarea_neighbor((area), KD_TOP, (x))) -#define kdarea_bottom_neighbor(area, x) (kdarea_neighbor((area), KD_BOTTOM, (x))) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/log.c b/fluidbook/tools/swftools-special-swfdump/lib/log.c deleted file mode 100644 index c53e1c060..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/log.c +++ /dev/null @@ -1,221 +0,0 @@ -/* log.c - Logging facilities for displaying information on screen, as well as - (optional) storing it to a file and transmitting it over the network. - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#ifdef WIN32 -//#include "stdafx.h" -#include -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 -#else -#include -#include -#endif - -#include "log.h" - -int maxloglevel = 1; -static int screenloglevel = 1; -static int fileloglevel = -1; -static FILE *logFile = 0; - -int getScreenLogLevel() -{ - return screenloglevel; -} -int getLogLevel() -{ - return maxloglevel; -} - -void setConsoleLogging(int level) -{ - if(level>maxloglevel) - maxloglevel=level; - screenloglevel = level; -} -void setFileLogging(char*filename, int level, char append) -{ - if(level>maxloglevel) - maxloglevel=level; - if(logFile) { - fclose(logFile);logFile=0; - } - if(filename && level>=0) { - logFile = fopen(filename, append?"ab+":"wb"); - fileloglevel = level; - } else { - logFile = 0; - fileloglevel = 0; - } -} -/* deprecated */ -void initLog(char* filename, int filelevel, char* s00, char* s01, int s02, int screenlevel) -{ - setFileLogging(filename, filelevel, 0); - setConsoleLogging(screenlevel); -} - -void exitLog() -{ - // close file - if(logFile != NULL) { - fclose(logFile); - logFile = 0; - fileloglevel = -1; - screenloglevel = 1; - maxloglevel = 1; - } -} - -static char * logimportance[]= {"Fatal","Error","Warning","Notice","Verbose","Debug","Trace"}; -static int loglevels=7; -static char * logimportance2[]= {" ","FATAL ","ERROR ","WARNING","NOTICE ","VERBOSE","DEBUG ", "TRACE "}; - -static inline void log_str(const char* logString) -{ - char timebuffer[32]; - char* logBuffer; - char dbuffer[9]; - char tbuffer[9]; - int level; - char*lt; - char*gt; - int l; - - logBuffer = (char*)malloc (strlen(logString) + 24 + 15); -#ifndef __NT__ - { - /*time_t t = time(0); - tm*t2 = localtime(t); - strftime(dbuffer, 8, "%m %d", t2); - strftime(tbuffer, 8, "%m %d", t2); - dbuffer[0]=0; //FIXME - tbuffer[0]=0;*/ - time_t t = time(0); - char* a = ctime(&t); - int l = strlen(a); - while(a[l-1] == 13 || a[l-1] == 10) - l--; - a[l]=0; - sprintf(timebuffer, "%s", a); - } -#else - _strdate( dbuffer ); - _strtime( tbuffer ); - sprintf(timebuffer, "%s - %s",dbuffer,tbuffer); -#endif - - // search for field - level = -1; - lt=strchr(logString, '<'); - gt=strchr(logString, '>'); - if(lt && gt && lt=0) - { - logBuffer[l]=0; - l--; - } - - if (level <= screenloglevel) - { - printf("%s\n", logBuffer); - fflush(stdout); - } - - if (level <= fileloglevel) - { - if (logFile != NULL) - { - fprintf(logFile, "%s\r\n", logBuffer); - fflush(logFile); - } - } - - free (logBuffer); -} - -void msg_str(const char* buf) -{ - if(buf[0]=='<') { - char*z = "fewnvdt"; - char*x = strchr(z,buf[1]); - if(x && (x-z)>maxloglevel) - return; - } - log_str(buf); -} - -char char2loglevel[32] = -/* a b c d e f g h i j k l m n o */ -{-1,-1,-1,-1, /*debug*/5, /*error*/1, /*fatal*/0, -1, -1, -1,-1,-1,-1,-1,/*notice*/3,-1, -/* p q r s t u v w x y z */ - -1,-1,-1, -1, /*trace*/6, -1,/*verbose*/4,/*warning*/2, -1,-1,-1, -1,-1,-1,-1,-1}; - -int msg_internal(const char* format, ...) -{ - char buf[1024]; - va_list arglist; - va_start(arglist, format); - - /* speed up hack */ - if(format[0]=='<') { - char*z = "fewnvdt"; - char*x = strchr(z,format[1]); - if(x && (x-z)>maxloglevel) - return 0; - } - - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - strcat(buf, "\n"); - log_str(buf); - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/log.h b/fluidbook/tools/swftools-special-swfdump/lib/log.h deleted file mode 100644 index a467e825c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/log.h +++ /dev/null @@ -1,62 +0,0 @@ -/* log.h - Header file for log.c. - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __log_h__ -#define __log_h__ -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -#define LOGLEVEL_FATAL 0 -#define LOGLEVEL_ERROR 1 -#define LOGLEVEL_WARNING 2 -#define LOGLEVEL_NOTICE 3 -#define LOGLEVEL_VERBOSE 4 -#define LOGLEVEL_DEBUG 5 -#define LOGLEVEL_TRACE 6 - -extern int getLogLevel(); -extern int getScreenLogLevel(); - -extern void initLog(char* pLogDir, int fileloglevel, char* servAddr, char* logPort, int serverloglevel, int screenloglevel); -extern void setConsoleLogging(int level); -extern void setFileLogging(char*filename, int level, char append); - -extern int maxloglevel; -extern char char2loglevel[32]; - -#define msg(fmt,args...) \ - (((fmt)[0]=='<' && char2loglevel[(fmt)[1]&31]<=maxloglevel)?msg_internal((fmt),## args):0) - -extern int msg_internal(const char* logFormat, ...); -extern void msg_str(const char* log); -extern void exitLog(void); - -#define FIXNULL(a) ((a)?(a):"NULL") - -#ifdef __cplusplus -} -#endif -#endif // __log_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/mem.c b/fluidbook/tools/swftools-special-swfdump/lib/mem.c deleted file mode 100644 index 6dd58f59c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/mem.c +++ /dev/null @@ -1,99 +0,0 @@ -#include -#include -#include -#include -#include "mem.h" - -// memory allocation - -void rfx_free(void*ptr) -{ - if(!ptr) - return; - free(ptr); -} - -void start_debugger() -{ - //*(int*)0=0; -} - -void* rfx_alloc(int size) -{ - void*ptr; - if(size == 0) { - //*(int*)0 = 0xdead; - //fprintf(stderr, "Warning: Zero alloc\n"); - return 0; - } - - ptr = malloc(size); - if(!ptr) { - fprintf(stderr, "FATAL: Out of memory (while trying to claim %d bytes)\n", size); - start_debugger(); - exit(1); - } - return ptr; -} -void* rfx_realloc(void*data, int size) -{ - void*ptr; - if(size == 0) { - //*(int*)0 = 0xdead; - //fprintf(stderr, "Warning: Zero realloc\n"); - rfx_free(data); - return 0; - } - if(!data) { - ptr = malloc(size); - } else { - ptr = realloc(data, size); - } - - if(!ptr) { - fprintf(stderr, "FATAL: Out of memory (while trying to claim %d bytes)\n", size); - start_debugger(); - exit(1); - } - return ptr; -} -void* rfx_calloc(int size) -{ - void*ptr; - if(size == 0) { - //*(int*)0 = 0xdead; - //fprintf(stderr, "Warning: Zero alloc\n"); - return 0; - } -#ifdef HAVE_CALLOC - ptr = calloc(1, size); -#else - ptr = malloc(size); -#endif - if(!ptr) { - fprintf(stderr, "FATAL: Out of memory (while trying to claim %d bytes)\n", size); - start_debugger(); - exit(1); - } -#ifndef HAVE_CALLOC - memset(ptr, 0, size); -#endif - return ptr; -} -#ifndef HAVE_CALLOC -void* rfx_calloc_replacement(int nmemb, int size) -{ - rfx_calloc(nmemb*size); -} -#endif - -#ifdef MEMORY_INFO -long rfx_memory_used() -{ -} - -char* rfx_memory_used_str() -{ -} -#endif - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/mem.h b/fluidbook/tools/swftools-special-swfdump/lib/mem.h deleted file mode 100644 index e864bbf0b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/mem.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __mem_h__ -#define __mem_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../config.h" - -#define ALLOC_ARRAY(type, num) (((type)*)rfxalloc(sizeof(type)*(num))) -void* rfx_alloc(int size); -void* rfx_calloc(int size); -void* rfx_realloc(void*data, int size); -void rfx_free(void*data); -#ifndef HAVE_CALLOC -void* rfx_calloc_replacement(int nmemb, int size); -#endif -#ifdef MEMORY_INFO -long rfx_memory_used(); -char* rfx_memory_used_str(); -#endif - -#ifdef __cplusplus -} -#endif - -#endif //__mem_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfaction.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfaction.c deleted file mode 100644 index 3d701bbad..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfaction.c +++ /dev/null @@ -1,1137 +0,0 @@ -/* swfaction.c - - Actionscript generation and parsing routines - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../rfxswf.h" - -#define MAX_LOOKUP 1024 // make cross references in dumps - -struct Action -{ - int version; - char*name; - U8 op; - char*flags; -} static actions[] = -{ -/* -f: frame (word) -u: url (string) -t: target (string) -l: label (string) -C: constant pool header (word) -c: constant pool entry (string) -s: skip (byte) (number of actions) -m: method (byte) swf_GetUrl2:(0=none, 1=get, 2=post)/GotoFrame2:(1=play) -b: branch (word) (number of bytes) -p (push): type(byte), type=0:string, type=1:double -{: define function (name (string), num (word), params (num strings), codesize (word) -o: codesize (word) object (string) -r: register (byte) - */ -{3,"End", 0x00, ""}, -{3,"GotoFrame", 0x81, "f"}, -{4,"GotoFrame2", 0x9f, "m"}, // -1 (/Movieclip:3) -{3,"GetUrl", 0x83, "ul"}, -{4,"GetUrl2", 0x9a, "m"}, //-2 -{3,"NextFrame", 0x04, ""}, -{3,"PreviousFrame", 0x05, ""}, -{3,"Play", 0x06, ""}, -{3,"Stop", 0x07, ""}, -{3,"ToggleQuality", 0x08, ""}, -{3,"StopSounds", 0x09, ""}, -{3,"WaitForFrame", 0x8a, "fs"}, -{4,"WaitForFrame2", 0x8d, "s"}, // -1 -{3,"SetTarget", 0x8b, "t"}, -{4,"SetTarget2", 0x20, ""}, //-1 -{3,"GotoLabel", 0x8c, "l"}, -{4,"Add", 0x0a, ""}, // -2, +1 -{4,"Multiply", 0x0c, ""}, // -2, +1 -{4,"Divide", 0x0d, ""}, // -2, +1 -{4,"Subtract", 0x0b, ""}, // -2, +1 -{4,"Less", 0x0f, ""}, // -2, +1 -{4,"Equals", 0x0e, ""}, // -2, +1 -{4,"And", 0x10, ""}, // -2, +1 -{4,"Or", 0x11, ""}, // -2, +1 -{4,"Not", 0x12, ""}, // -1, +1 -{4,"StringAdd", 0x21, ""}, // -2,+1 -{4,"StringLength", 0x14, ""}, // -1, +1 -{4,"MBStringLength", 0x31, ""}, // -1, +1 -{4,"StringEquals", 0x13, ""}, // -2, +1 -{4,"StringLess", 0x29, ""}, //-2, +1 -{4,"StringExtract", 0x15, ""}, // -3, +1 -{4,"MBStringExtract", 0x35, ""}, //-3 +1 -{4,"Push", 0x96, "p"}, // +1 -{4,"Pop", 0x17, ""}, // -1 -{4,"ToInteger", 0x18, ""}, // -1, +1 -{4,"CharToAscii", 0x32, ""}, // -1, +1 -{4,"AsciiToChar", 0x33, ""}, // -1, +1 -{4,"MBCharToAscii", 0x36, ""}, // -1, +1 -{4,"MBAsciiToChar", 0x37, ""}, // -1, +1 -{4,"Jump", 0x99, "b"}, -{4,"If", 0x9d, "b"}, // -1 -{4,"Call", 0x9e, ""}, //-1 (frame label/number) (high bit is wrong.) -{4,"GetVariable", 0x1c,""}, // -1, +1 -{4,"SetVariable", 0x1d,""}, // -2 -{4,"GetProperty", 0x22,""}, //-2, +1 -{4,"SetProperty", 0x23, ""}, // -3 -{4,"RemoveSprite", 0x25, ""}, //-1 -{4,"StartDrag", 0x27, ""}, // -2, -1, (-4) -{4,"EndDrag", 0x28, ""}, -{4,"CloneSprite", 0x24, ""}, // -3 -{4,"Trace", 0x26, ""}, //-1 -{4,"GetTime", 0x34, ""}, //+1 -{4,"RandomNumber", 0x30, ""}, //-1,+1 -{5,"Modulo", 0x3f,""}, -{5,"BitAnd", 0x60,""}, -{5,"BitLShift", 0x63,""}, -{5,"BitOr", 0x61,""}, -{5,"BitRShift", 0x64,""}, -{5,"BitURShift", 0x65,""}, -{5,"BitXor", 0x62,""},//66? -{5,"Decrement", 0x51,""}, -{5,"Increment", 0x50,""}, -{5,"PushDuplicate", 0x4c,""}, -{5,"StackSwap", 0x4d,""}, //? -{5,"StoreRegister", 0x87,"r"}, -{5,"CallFunction", 0x3d,""}, -{5,"DefineFunction", 0x9b, "{"}, -{5,"Return", 0x3e,""}, -{5,"GetMember", 0x4e,""}, -{5,"SetMember", 0x4f,""}, -{5,"CallMethod", 0x52,""}, -{5,"Constantpool", 0x88, "Cc"}, -{5,"DefineLocal", 0x3c,""}, -{5,"DefineLocal2", 0x41,""}, -{5,"Makehash", 0x43, ""}, //?? -{5,"Delete", 0x3a,""}, //? -{5,"Delete2", 0x3b,""}, -{5,"Enumerate", 0x46,""}, -{5,"Equals2", 0x49,""}, -{5,"InitArray", 0x42,""}, // InitObject? -{5,"NewMethod", 0x53,""}, //? -{5,"NewObject", 0x40,""}, -{5,"TargetPath", 0x45,""}, //? -{5,"With", 0x94, "o"}, -{5,"ToNumber", 0x4a,""}, //? -{5,"ToString", 0x4b,""}, //? -{5,"TypeOf", 0x44,""}, -{5,"Add2", 0x47,""}, -{5,"Less2", 0x48,""}, -{6,"Greater", 0x67,""}, -{6,"StringGreater", 0x68,""}, -{6,"Enumerate2", 0x55,""}, -{6,"InstanceOf", 0x54,""}, -{6,"StrictEquals", 0x66,""} -}; -static int definedactions = sizeof(actions)/sizeof(struct Action); - -ActionTAG* swf_ActionGet(TAG*tag) -{ - U8 op = 1; - int length; - ActionTAG tmp; - ActionTAG*action = &tmp; - U8*data; - while(op) - { - action->next = (ActionTAG*)rfx_calloc(sizeof(ActionTAG)); - action->next->prev = action; - action->next->next = 0; - action->next->parent = tmp.next; - action = action->next; - - op = swf_GetU8(tag); - if(op<0x80) - length = 0; - else - length = swf_GetU16(tag); - - if(length) { - data = (U8*)rfx_alloc(length); - swf_GetBlock(tag, data, length); - } else { - data = 0; - } - action->op = op; - action->len = length; - action->data = data; - } - return tmp.next; -} - -void swf_ActionFree(ActionTAG*action) -{ - if(!action) { - return; - } - action = action->parent; - if(!action) { - fprintf(stderr, "Warning: freeing zero action (no parent)"); - return; - } - - while(action) - { - ActionTAG*tmp; - if(action->data && action->data != action->tmp) { - rfx_free(action->data); - action->data = 0; - } - action->len = 0; - - tmp = action; - action=action->next; - rfx_free(tmp); - } -} - -void swf_ActionSet(TAG*tag, ActionTAG*action) -{ - if(!action) { - return; - } - action=action->parent; - while(action) - { - swf_SetU8(tag, action->op); - if(action->op & 128) - swf_SetU16(tag, action->len); - - swf_SetBlock(tag, action->data, action->len); - - action = action->next; - } -} - -int OpAdvance(char c, U8*data) -{ - switch (c) - { - case 'f': - return 2; - case 'u': - return strlen((const char*)data)+1; - case 't': - return strlen((const char*)data)+1; - case 'l': - return strlen((const char*)data)+1; - case 'c': - return strlen((const char*)data)+1; - case 'C': - return 2; - case 's': - return 1; - case 'm': - return 1; - case 'b': - return 2; - case 'r': - return 1; - case 'p': { - U8 type = *data++; - if(type == 0) { - return 1+strlen((const char*)data)+1; //string - } else if (type == 1) { - return 1+4; //float - } else if (type == 2) { - return 1+0; //NULL - } else if (type == 3) { - return 1+0; //Undefined - } else if (type == 4) { - return 1+1; //register - } else if (type == 5) { - return 1+1; //bool - } else if (type == 6) { - return 1+8; //double - } else if (type == 7) { - return 1+4; //int - } else if (type == 8) { - return 1+1; //lookup - } else if (type == 9) { - return 1+2; //lookup 16 - } else return 1; - break; - } - case 'o': { - return 2; - } - case '{': { - U16 num; - U16 codesize; - U8* odata = data; - int t; - while(*data++); //name - num = (*data++)*256; //num - num += (*data++); - for(t=0;tlen + 1 + ((atag)->op&0x80?2:0)) -#define MAX_LEVELS 16 -/* TODO: * this should be in swfdump.c */ -void swf_DumpActions(ActionTAG*atag, char*prefix) -{ - int t; - U8*data; - char* cp; - int entry = 0; - char spaces[MAX_LEVELS*4+1]; - struct { - char*text; - int count; - } counter[MAX_LEVELS]; - int countpos = 0; -#ifdef MAX_LOOKUP - char * lookup[MAX_LOOKUP]; - memset(lookup,0x00,sizeof(lookup)); -#endif - memset(spaces, 32, sizeof(spaces)); - spaces[sizeof(spaces)-1] = 0; - - if (!prefix) - prefix=""; - - while(atag) - { - char*indent = &spaces[sizeof(spaces)-1-countpos*4]; - U16 poollen = 0; - for(t=0;top) - break; - - if(t==definedactions) { - printf("%s (%5d bytes) action:%s unknown[%02x]", prefix, atag->len, indent, atag->op); - } else { - printf("%s (%5d bytes) action:%s %s", prefix, atag->len, indent, actions[t].name); - } - data = atag->data; - if(atag->len && t!=definedactions) //TODO: check for consistency: should we have a length? - { - cp = actions[t].flags; - while(*cp) - { - switch(*cp) - { - case 'f': { //frame - printf(" %d", data[0]+256*data[1]); - } break; - case 'u': { - printf(" URL:\"%s\"", data); - } break; - case 't': { - printf(" Target:\"%s\"", data); - } break; - case 'l': { - printf(" Label:\"%s\"", data); - } break; - case 'c': { - printf(" String:\"%s\"", data); -#ifdef MAX_LOOKUP - if (entry=15) { - printf("Error: nested too deep\n"); - continue; - } - counter[countpos].text = "}"; - counter[countpos].count = codesize + ATAG_FULLLENGTH(atag); - countpos++; - } break; - case 'o': { - int t; - U16 codesize = data[0]+256*data[1]; - printf(" codesize:%d ", codesize); - - /* the following tries to find the "string" - the flash documentation speaks of- I've - never actually seen one yet. -mk */ - for(t=2;tlen;t++) - printf("[%02x]", atag->data[t]); - - printf("\n%s %s{", prefix, indent); - if(countpos>=15) { - printf("Error: nested too deep\n"); - continue; - } - counter[countpos].text = "}"; - counter[countpos].count = codesize + ATAG_FULLLENGTH(atag); - countpos++; - } break; - case 'b': { - printf(" %d", data[0]+256*(signed char)data[1]); - } break; - case 'r': { - printf(" %d", data[0]); - } break; - case 'p': { - U8 type = *data; - unsigned char*value = data+1; - if(type == 0) { - printf(" String:\"%s\"", value); - } else if (type == 1) { - U32 f = value[0]+(value[1]<<8)+ - (value[2]<<16)+(value[3]<<24); - printf(" Float:%f", *(float*)&f); - } else if (type == 2) { - printf(" NULL"); - } else if (type == 3) { - printf(" Undefined"); - } else if (type == 4) { - printf(" register:%d", *value); - } else if (type == 5) { - printf(" bool:%s", *value?"true":"false"); - } else if (type == 6) { - U8 a[8]; - memcpy(&a[4],value,4); - memcpy(a,&value[4],4); -#ifdef WORDS_BIGENDIAN - int t; - for(t=0;t<4;t++) { - U8 tmp = a[t]; - a[t]=a[7-t]; - a[7-t] = tmp; - } -#endif - printf(" double:%f", *(double*)a); - } else if (type == 7) { - printf(" int:%d", value[0]+(value[1]<<8)+ - (value[2]<<16)+(value[3]<<24)); - } else if (type == 8) { - printf(" Lookup:%d", *value); -#ifdef MAX_LOOKUP - if (lookup[*value]) - printf(" (\"%s\")",lookup[*value]); -#endif - } else if (type == 9) { - U32 offset = value[0]+(value[1]<<8); - printf(" Lookup16:%d", offset); -#ifdef MAX_LOOKUP - if (lookup[offset]) - printf(" (\"%s\")",lookup[offset]); -#endif - } else { - printf(" UNKNOWN[%02x]",type); - } - } break; - } - data += OpAdvance(*cp, data); - if((*cp!='c' || !poollen) && - (*cp!='p' || !(data<&atag->data[atag->len]))) - cp++; - if(poollen) - poollen--; - } - } - - if(data < atag->data + atag->len) - { - int nl = ((atag->data+atag->len)-data); - int t; - printf(" (remainder of %d bytes:\"", nl); - for(t=0;tnext; - } - -#ifdef MAX_LOOKUP - for (t=0;top) - break; - - if(t==definedactions) { - // unknown actiontag - atag = atag->next; - count++; - continue; - } - cp = actions[t].flags; - data = atag->data; - if(atag->len) { - while(*cp) { - U8 * replacepos = 0; - int replacelen = 0; - U8 * replacement = 0; - switch(*cp) - { - case 'u': { - if(type&TYPE_URL) - { - replacelen = strlen((const char*)data); - replacepos = data; - replacement = (U8*)callback((char*)data); // may be null - } - } break; - case 't': { - if(type&TYPE_TARGET) - { - replacelen = strlen((const char*)data); - replacepos = data; - replacement = (U8*)callback((char*)data); // may be null - } - } break; - case 'c': { - if(type&TYPE_STRING) - { - replacelen = strlen((const char*)data); - replacepos = data; - replacement = (U8*)callback((char*)data); // may be null - } - } break; - case 'C': { - poollen = (data[0]+256*data[1]); - } break; - case 'o': { - } break; - case 'p': { - U8 datatype = *data; - char*value = (char*)&data[1]; - if(datatype == 0) { //string - if(type&TYPE_STRING) - { - replacelen = strlen(value); - replacepos = (U8*)value; - replacement = (U8*)callback(value); // may be null - } - } else if (datatype == 8) { //lookup - } - } break; - } - data += OpAdvance(*cp, data); - if(*cp!='c' || !poollen) - cp++; - if(poollen) - poollen--; - - if(replacement) - { - int newlen = strlen((const char *)replacement); - char * newdata = (char*)rfx_alloc(atag->len - replacelen + newlen); - int rpos = replacepos - atag->data; - memcpy(newdata, atag->data, rpos); - memcpy(&newdata[rpos], replacement, newlen); - memcpy(&newdata[rpos+newlen], &replacepos[replacelen], - &data[atag->len] - &replacepos[replacelen]); - rfx_free(atag->data); - atag->data = (U8*)newdata; - data = &atag->data[rpos+newlen+1]; - } - } - } - atag = atag->next; - count ++; - } - return count; -} - -void swf_ActionEnumerateTargets(ActionTAG*atag, char*(*callback)(char*)) -{ - swf_ActionEnumerate(atag, callback, TYPE_TARGET); -} -void swf_ActionEnumerateStrings(ActionTAG*atag, char*(*callback)(char*)) -{ - swf_ActionEnumerate(atag, callback, TYPE_STRING); -} -void swf_ActionEnumerateURLs(ActionTAG*atag, char*(*callback)(char*)) -{ - swf_ActionEnumerate(atag, callback, TYPE_URL); -} - -/*static ActionTAG* swf_ActionStart() -{ - ActionTAG*atag; - atag = (ActionTAG*)rfx_alloc(sizeof(ActionTAG)); - atag->prev = 0; - atag->next = 0; - atag->parent = 0; - atag->data = 0; - atag->len = 0; - return atag; -} - -void swf_ActionEnd(ActionTAG* atag) -{ - ActionTAG*last; - while(atag) { - last = atag; - atag=atag->next; - } - - last->prev->next = 0; - rfx_free(last); -}*/ - -static ActionTAG*lastATAG(ActionTAG*atag) -{ - ActionTAG*last = 0; - while(atag) { - last = atag; - atag=atag->next; - } - return last; -} - -ActionTAG* swf_AddActionTAG(ActionTAG*atag, U8 op, U8*data, U16 len) -{ - ActionTAG*tmp; - tmp = (ActionTAG*)rfx_alloc(sizeof(ActionTAG)); - tmp->next = 0; - if(atag) { - tmp->prev = atag; - atag->next = tmp; - tmp->parent = atag->parent; - } else { - tmp->prev = 0; - tmp->parent = tmp; - } - if(data || !len) { - tmp->data = data; - } else { - tmp->data = tmp->tmp; - } - - tmp->len = len; - tmp->op = op; - return tmp; -} - -ActionMarker action_setMarker(ActionTAG*atag) -{ - ActionMarker m; - m.atag = atag; - return m; -} - -int inline ActionTagSize(ActionTAG*atag) -{ - return (atag->op&0x80)?3+(atag->len):1+0; -} - - -#define ACTION_END 0x00 -#define ACTION_NEXTFRAME 0x04 -#define ACTION_PREVIOUSFRAME 0x05 -#define ACTION_PLAY 0x06 -#define ACTION_STOP 0x07 -#define ACTION_TOGGLEQUALITY 0x08 -#define ACTION_STOPSOUNDS 0x09 -#define ACTION_ADD 0x0a -#define ACTION_SUBTRACT 0x0b -#define ACTION_MULTIPLY 0x0c -#define ACTION_DIVIDE 0x0d -#define ACTION_EQUALS 0x0e -#define ACTION_LESS 0x0f -#define ACTION_AND 0x10 -#define ACTION_OR 0x11 -#define ACTION_NOT 0x12 -#define ACTION_STRINGEQUALS 0x13 -#define ACTION_STRINGLENGTH 0x14 -#define ACTION_STRINGEXTRACT 0x15 -#define ACTION_POP 0x17 -#define ACTION_TOINTEGER 0x18 -#define ACTION_GETVARIABLE 0x1c -#define ACTION_SETVARIABLE 0x1d -#define ACTION_SETTARGET2 0x20 -#define ACTION_STRINGADD 0x21 -#define ACTION_GETPROPERTY 0x22 -#define ACTION_SETPROPERTY 0x23 -#define ACTION_CLONESPRITE 0x24 -#define ACTION_REMOVESPRITE 0x25 -#define ACTION_TRACE 0x26 -#define ACTION_STARTDRAG 0x27 -#define ACTION_ENDDRAG 0x28 -#define ACTION_STRINGLESS 0x29 -#define ACTION_RANDOMNUMBER 0x30 -#define ACTION_MBSTRINGLENGTH 0x31 -#define ACTION_CHARTOASCII 0x32 -#define ACTION_ASCIITOCHAR 0x33 -#define ACTION_GETTIME 0x34 -#define ACTION_MBSTRINGEXTRACT 0x35 -#define ACTION_MBCHARTOASCII 0x36 -#define ACTION_MBASCIITOCHAR 0x37 -#define ACTION_DELETE 0x3a -#define ACTION_DELETE2 0x3b -#define ACTION_DEFINELOCAL 0x3c -#define ACTION_CALLFUNCTION 0x3d -#define ACTION_RETURN 0x3e -#define ACTION_MODULO 0x3f -#define ACTION_NEWOBJECT 0x40 -#define ACTION_DEFINELOCAL2 0x41 -#define ACTION_INITARRAY 0x42 -#define ACTION_MAKEHASH 0x43 -#define ACTION_TYPEOF 0x44 -#define ACTION_TARGETPATH 0x45 -#define ACTION_ENUMERATE 0x46 -#define ACTION_ADD2 0x47 -#define ACTION_LESS2 0x48 -#define ACTION_EQUALS2 0x49 -#define ACTION_TONUMBER 0x4a -#define ACTION_TOSTRING 0x4b -#define ACTION_PUSHDUPLICATE 0x4c -#define ACTION_STACKSWAP 0x4d -#define ACTION_GETMEMBER 0x4e -#define ACTION_SETMEMBER 0x4f -#define ACTION_INCREMENT 0x50 -#define ACTION_DECREMENT 0x51 -#define ACTION_CALLMETHOD 0x52 -#define ACTION_NEWMETHOD 0x53 -#define ACTION_BITAND 0x60 -#define ACTION_BITOR 0x61 -#define ACTION_BITXOR 0x62 -#define ACTION_BITLSHIFT 0x63 -#define ACTION_BITRSHIFT 0x64 -#define ACTION_BITURSHIFT 0x65 -#define ACTION_GOTOFRAME 0x81 -#define ACTION_GETURL 0x83 -#define ACTION_STOREREGISTER 0x87 -#define ACTION_CONSTANTPOOL 0x88 -#define ACTION_WAITFORFRAME 0x8a -#define ACTION_SETTARGET 0x8b -#define ACTION_GOTOLABEL 0x8c -#define ACTION_WAITFORFRAME2 0x8d -#define ACTION_WITH 0x94 -#define ACTION_PUSH 0x96 -#define ACTION_JUMP 0x99 -#define ACTION_GETURL2 0x9a -#define ACTION_DEFINEFUNCTION 0x9b -#define ACTION_IF 0x9d -#define ACTION_CALL 0x9e -#define ACTION_GOTOFRAME2 0x9f - -void action_fixjump(ActionMarker m1, ActionMarker m2) -{ - ActionTAG* a1 = m1.atag; - ActionTAG* a2 = m2.atag; - ActionTAG* a; - int len = 0; - int oplen = 0; - a = a1; - - a = a->next; //first one is free - while(a && a!=a2) - { - len += ActionTagSize(a); - oplen ++; - a = a->next; - } - if(!a) - { len = 0; - oplen = 0; - a = a2; - while(a && a!=a1) { - len -= ActionTagSize(a); - oplen --; - a = a->next; - } - if(!a) { - fprintf(stderr, "action_fixjump: couldn't find second tag\n"); - return; - } - len -= ActionTagSize(a); - oplen --; - } - - if (a1->op == ACTION_IF || a1->op == ACTION_JUMP) - { - *(U16*)(a1->data) = LE_16_TO_NATIVE(len); - } - else if(a1->op == ACTION_WAITFORFRAME) - { - ((U8*)(a1->data))[2] = oplen; - } - else if(a1->op == ACTION_WAITFORFRAME2) - { - ((U8*)(a1->data))[0] = oplen; - } - -} - -ActionTAG* action_NextFrame(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_NEXTFRAME, 0, 0);} -ActionTAG* action_PreviousFrame(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_PREVIOUSFRAME, 0, 0);} -ActionTAG* action_Play(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_PLAY, 0, 0);} -ActionTAG* action_Stop(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STOP, 0, 0);} -ActionTAG* action_ToggleQuality(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TOGGLEQUALITY, 0, 0);} -ActionTAG* action_StopSounds(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STOPSOUNDS, 0, 0);} -ActionTAG* action_Add(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ADD, 0, 0);} -ActionTAG* action_Subtract(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SUBTRACT, 0, 0);} -ActionTAG* action_Multiply(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MULTIPLY, 0, 0);} -ActionTAG* action_Divide(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DIVIDE, 0, 0);} -ActionTAG* action_Equals(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_EQUALS, 0, 0);} -ActionTAG* action_Less(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_LESS, 0, 0);} -ActionTAG* action_And(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_AND, 0, 0);} -ActionTAG* action_Or(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_OR, 0, 0);} -ActionTAG* action_Not(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_NOT, 0, 0);} -ActionTAG* action_StringEquals(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGEQUALS, 0, 0);} -ActionTAG* action_StringLength(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGLENGTH, 0, 0);} -ActionTAG* action_StringExtract(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGEXTRACT, 0, 0);} -ActionTAG* action_Pop(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_POP, 0, 0);} -ActionTAG* action_ToInteger(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TOINTEGER, 0, 0);} -ActionTAG* action_GetVariable(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_GETVARIABLE, 0, 0);} -ActionTAG* action_SetVariable(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SETVARIABLE, 0, 0);} -ActionTAG* action_SetTarget2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SETTARGET2, 0, 0);} -ActionTAG* action_StringAdd(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGADD, 0, 0);} -ActionTAG* action_GetProperty(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_GETPROPERTY, 0, 0);} -ActionTAG* action_SetProperty(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SETPROPERTY, 0, 0);} -ActionTAG* action_CloneSprite(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CLONESPRITE, 0, 0);} -ActionTAG* action_RemoveSprite(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_REMOVESPRITE, 0, 0);} -ActionTAG* action_Trace(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TRACE, 0, 0);} -ActionTAG* action_StartDrag(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STARTDRAG, 0, 0);} -ActionTAG* action_EndDrag(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ENDDRAG, 0, 0);} -ActionTAG* action_StringLess(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STRINGLESS, 0, 0);} -ActionTAG* action_RandomNumber(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_RANDOMNUMBER, 0, 0);} -ActionTAG* action_MBStringLength(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MBSTRINGLENGTH, 0, 0);} -ActionTAG* action_CharToAscii(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CHARTOASCII, 0, 0);} -ActionTAG* action_AsciiToChar(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ASCIITOCHAR, 0, 0);} -ActionTAG* action_GetTime(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_GETTIME, 0, 0);} -ActionTAG* action_MBStringExtract(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MBSTRINGEXTRACT, 0, 0);} -ActionTAG* action_MBCharToAscii(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MBCHARTOASCII, 0, 0);} -ActionTAG* action_MBAsciiToChar(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MBASCIITOCHAR, 0, 0);} -ActionTAG* action_Delete(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DELETE, 0, 0);} -ActionTAG* action_Delete2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DELETE2, 0, 0);} -ActionTAG* action_DefineLocal(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DEFINELOCAL, 0, 0);} -ActionTAG* action_CallFunction(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CALLFUNCTION, 0, 0);} -ActionTAG* action_Return(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_RETURN, 0, 0);} -ActionTAG* action_Modulo(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MODULO, 0, 0);} -ActionTAG* action_NewObject(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_NEWOBJECT, 0, 0);} -ActionTAG* action_DefineLocal2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DEFINELOCAL2, 0, 0);} -ActionTAG* action_InitArray(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_INITARRAY, 0, 0);} -ActionTAG* action_Makehash(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_MAKEHASH, 0, 0);} -ActionTAG* action_TypeOf(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TYPEOF, 0, 0);} -ActionTAG* action_TargetPath(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TARGETPATH, 0, 0);} -ActionTAG* action_Enumerate(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ENUMERATE, 0, 0);} -ActionTAG* action_Add2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_ADD2, 0, 0);} -ActionTAG* action_Less2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_LESS2, 0, 0);} -ActionTAG* action_Equals2(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_EQUALS2, 0, 0);} -ActionTAG* action_ToNumber(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TONUMBER, 0, 0);} -ActionTAG* action_ToString(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_TOSTRING, 0, 0);} -ActionTAG* action_PushDuplicate(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_PUSHDUPLICATE, 0, 0);} -ActionTAG* action_StackSwap(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_STACKSWAP, 0, 0);} -ActionTAG* action_GetMember(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_GETMEMBER, 0, 0);} -ActionTAG* action_SetMember(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_SETMEMBER, 0, 0);} -ActionTAG* action_Increment(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_INCREMENT, 0, 0);} -ActionTAG* action_Decrement(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_DECREMENT, 0, 0);} -ActionTAG* action_CallMethod(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CALLMETHOD, 0, 0);} -ActionTAG* action_NewMethod(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_NEWMETHOD, 0, 0);} -ActionTAG* action_BitAnd(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITAND, 0, 0);} -ActionTAG* action_BitOr(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITOR, 0, 0);} -ActionTAG* action_BitXor(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITXOR, 0, 0);} -ActionTAG* action_BitLShift(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITLSHIFT, 0, 0);} -ActionTAG* action_BitRShift(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITRSHIFT, 0, 0);} -ActionTAG* action_BitURShift(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_BITURSHIFT, 0, 0);} -ActionTAG* action_Call(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_CALL, 0, 0);} -ActionTAG* action_End(ActionTAG*atag) {return swf_AddActionTAG(atag, ACTION_END, 0, 0);} -ActionTAG* action_GotoFrame(ActionTAG*atag, U16 frame) -{ - atag = swf_AddActionTAG(atag, ACTION_GOTOFRAME, 0, 2); - *(U16*)atag->tmp = LE_16_TO_NATIVE(frame); - return atag; -} - -ActionTAG* action_Jump(ActionTAG*atag, U16 branch) -{ - atag = swf_AddActionTAG(atag, ACTION_JUMP, 0, 2); - *(U16*)atag->tmp = LE_16_TO_NATIVE(branch); - return atag; -} -ActionTAG* action_If(ActionTAG*atag, U16 branch) -{ - atag = swf_AddActionTAG(atag, ACTION_IF, 0, 2); - *(U16*)atag->tmp = LE_16_TO_NATIVE(branch); - return atag; -} -ActionTAG* action_StoreRegister(ActionTAG*atag, U8 reg) -{ - atag = swf_AddActionTAG(atag, ACTION_STOREREGISTER, 0, 1); - *(U8*)atag->tmp = reg; - return atag; -} -ActionTAG* action_GotoFrame2(ActionTAG*atag, U8 method) -{ - atag = swf_AddActionTAG(atag, ACTION_GOTOFRAME2, 0, 1); - *(U8*)atag->tmp = method; - return atag; -} -ActionTAG* action_GetUrl2(ActionTAG*atag, U8 method) -{ - atag = swf_AddActionTAG(atag, ACTION_GETURL2, 0, 1); - *(U8*)atag->tmp = method; - return atag; -} -ActionTAG* action_WaitForFrame2(ActionTAG*atag, U8 skip) -{ - atag = swf_AddActionTAG(atag, ACTION_WAITFORFRAME2, 0, 1); - *(U8*)atag->tmp = skip; - return atag; -} -ActionTAG* action_WaitForFrame(ActionTAG*atag, U16 frame, U8 skip) -{ - atag = swf_AddActionTAG(atag, ACTION_WAITFORFRAME, 0, 3); - *(U16*)atag->tmp = LE_16_TO_NATIVE(frame); - *(U8*)&atag->tmp[2] = skip; - return atag; -} -ActionTAG* action_SetTarget(ActionTAG*atag, const char* target) -{ - char*ptr = strdup(target); - return swf_AddActionTAG(atag, ACTION_SETTARGET, (U8*)ptr, strlen(ptr)+1); -} -ActionTAG* action_PushNULL(ActionTAG*atag) -{ - atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 1); - *(U8*)atag->tmp = 2; //NULL - return atag; -} -ActionTAG* action_PushUndefined(ActionTAG*atag) -{ - atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 1); - *(U8*)atag->tmp = 3; //Undefined - return atag; -} -ActionTAG* action_PushBoolean(ActionTAG*atag, char c) -{ - atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 2); - *(U8*)atag->tmp = 5; //bool - *(U8*)&atag->tmp[1] = c; - return atag; -} -ActionTAG* action_PushRegister(ActionTAG*atag, U8 reg) -{ - atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 2); - *(U8*)atag->tmp = 4; //register - *(U8*)&atag->tmp[1] = reg; - return atag; -} -ActionTAG* action_PushLookup(ActionTAG*atag, U8 index) -{ - atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 2); - *(U8*)atag->tmp = 8; //lookup - *(U8*)&atag->tmp[1] = index; - return atag; -} -ActionTAG* action_PushLookup16(ActionTAG*atag, U16 index) -{ - atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 3); - *(U8*)atag->tmp = 9; //lookup - *(U8*)&atag->tmp[1] = (U8)index; - *(U8*)&atag->tmp[2] = index>>8; - return atag; -} -ActionTAG* action_PushString(ActionTAG*atag, const char*str) -{ - int l = strlen(str); - char*ptr = (char*)rfx_alloc(l+2); - ptr[0] = 0; // string - strcpy(&ptr[1], str); - return swf_AddActionTAG(atag, ACTION_PUSH, (U8*)ptr, l+2); -} -ActionTAG* action_PushFloat(ActionTAG*atag, float f) -{ - char*ptr = (char*)rfx_alloc(5); - U32 fd = *(U32*)&f; - ptr[0] = 1; //float - ptr[1] = fd; - ptr[2] = fd>>8; - ptr[3] = fd>>16; - ptr[4] = fd>>24; - return swf_AddActionTAG(atag, ACTION_PUSH, (U8*)ptr, 5); -} -ActionTAG* action_PushDouble(ActionTAG*atag, double d) -{ - char*ptr = (char*)rfx_alloc(9); - U8*dd = (U8*)&d; - ptr[0] = 6; //double -#ifdef WORDS_BIGENDIAN - ptr[1] = dd[7];ptr[2] = dd[6]; - ptr[3] = dd[5];ptr[4] = dd[4]; - ptr[5] = dd[3];ptr[6] = dd[2]; - ptr[7] = dd[1];ptr[8] = dd[0]; -#else - ptr[1] = dd[0];ptr[2] = dd[1]; - ptr[3] = dd[2];ptr[4] = dd[3]; - ptr[5] = dd[4];ptr[6] = dd[5]; - ptr[7] = dd[6];ptr[8] = dd[7]; -#endif - return swf_AddActionTAG(atag, ACTION_PUSH, (U8*)ptr, 9); -} -ActionTAG* action_PushInt(ActionTAG*atag, int i) -{ - atag = swf_AddActionTAG(atag, ACTION_PUSH, 0, 5); - atag->tmp[0] = 7; //int - atag->tmp[1] = i; - atag->tmp[2] = i>>8; - atag->tmp[3] = i>>16; - atag->tmp[4] = i>>24; - return atag; -} -ActionTAG* action_GotoLabel(ActionTAG*atag, char* label) -{ - char*ptr = strdup(label); - return swf_AddActionTAG(atag, ACTION_GOTOLABEL, (U8*)ptr, strlen(ptr)); -} -ActionTAG* action_GetUrl(ActionTAG*atag, const char* url, char* label) -{ - int l1= strlen(url); - int l2= strlen(label); - char*ptr = (char*)rfx_alloc(l1+l2+2); - strcpy(ptr, url); - strcpy(&ptr[l1+1], label); - return swf_AddActionTAG(atag, ACTION_GETURL, (U8*)ptr, l1+l2+2); -} -//TODO: -ActionTAG* action_DefineFunction(ActionTAG*atag, U8*data, int len) {return atag;} -ActionTAG* action_Constantpool(ActionTAG*atag, char* constantpool) {return atag;} -ActionTAG* action_With(ActionTAG*atag, char*object) {return atag;} - -#include "../action/actioncompiler.h" - -ActionTAG* swf_ActionCompile(const char* source, int version) -{ - TAG* tag; - ActionTAG* a = 0; - void*buffer = 0; - int len = 0; - int ret; - - tag = swf_InsertTag(NULL, ST_DOACTION); - ret = compileSWFActionCode(source, version, &buffer, &len); - if(!ret || buffer==0 || len == 0) - return 0; - - swf_SetBlock(tag, (U8*)buffer, len); - swf_SetU8(tag, 0); - - rfx_free(buffer); - - a = swf_ActionGet(tag); - swf_DeleteTag(0, tag); - return a; -} - - -/* - Properties: - - _X 0 - _Y 1 - _xscale 2 - _yscale 3 - _currentframe 4 - _totalframes 5 - _alpha 6 - _visible 7 - _width 8 - _height 9 - _rotation 10 - _target 11 - _framesloaded 12 - _name 13 - _droptarget 14 - _url 15 - _highquality 16 - _focusrect 17 - _soundbuftime 18 - _quality* 19 - _xmouse* 20 - _ymouse* 21 -*/ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfalignzones.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfalignzones.c deleted file mode 100644 index 94558ee96..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfalignzones.c +++ /dev/null @@ -1,366 +0,0 @@ -#include "../rfxswf.h" -#include "../graphcut.c" -#include "../log.h" - -static inline double sqr(double x) {return x*x;} - -static void draw_line(float*row, float x1, float x2, float y1, float y2, int min, int max, double weight) -{ - if(x2max) { - fprintf(stderr, "error: glyph x stroke out of bounds\n"); - return; - } - x1 -= min; - x2 -= min; - - double d = sqrt(sqr(y2-y1)+sqr(x2-x1)); - if(floor(x1)==floor(x2)) { - row[(int)floor(x1)] += d*weight; - } else { - double i = d/(x2-x1); - int x; - int xx1 = ceil(x1); - int xx2 = floor(x2); - row[xx1] += i*(xx1-x1)*weight; - row[xx2] += i*(x2-xx2)*weight; - for(x=xx1;xxmin, area->xmax, weight); - draw_line(column, y1, y2, x1, x2, area->ymin, area->ymax, weight); -} - -static void find_best(float*_row, int width, int*_x1, int*_x2, int min_size, int from, int to, int num, char debug) -{ - int x1=-1, x2=-1; - float max1=-1e20,max2=-1e20; - int t; - - if(from==to) { - *_x1 = from; - return; - } - - float*row = malloc(sizeof(float)*(width+1)); - int filter_size = 25; - float* filter = malloc(sizeof(float)*(filter_size*2+1)); - double var = filter_size/3; - double sum = 0; - for(t=-filter_size;t<=filter_size;t++) { - double v = t/var; - float r = v*v/2; - filter[filter_size+t] = exp(-r); - sum += filter[filter_size+t]; - } - for(t=-filter_size;t<=filter_size;t++) { - filter[filter_size+t]/=sum; - } - - //filter[0]=1;filter_size=0; - - for(t=0;t<=width;t++) { - int s; - double sum = 0; - for(s=-filter_size;s<=filter_size;s++) { - if(t+s<0) continue; - if(t+s>width) continue; - sum += _row[t+s]*filter[s+filter_size]; - } - row[t] = sum; - } - free(filter); - - for(t=from;t<=to;t++) { - if(row[t]>max1) { - max1 = row[t]; - x1 = t; - } - } - - - if(num<=1) { - *_x1=x1; - } else { - /* this code is slightly wrong, in that it assumes that the glyph distortion problem - gets worse when the font sizes get smaller. it doesn't. in fact, the smaller - the font size, the more of the scaling bugs disappear (http://www.quiss.org/files/scaletest.swf) - A better way would probably to use the font size you need for the two alignzones - to come to lie in different pixels, which what I think is what makes the problems - appear/disappear. - */ - - double scale = min_size/1024.0; - for(t=from;t<=to;t++) { - if(t==x1) { - row[t]=-1e20; - continue; - } - double r1 = (t=1 || add2>=1) { - row[t]=-1e20; - } - } - - for(t=from;t<=to;t++) { - if(row[t]>max2) { - max2 = row[t]; - x2 = t; - } - } - - if(x1>=0 && x2>=0 && x1>x2) {int x=x1;x1=x2;x2=x;} - - *_x1=x1; - *_x2=x2; - } - - free(row); -} - -static void negate_y(SRECT* b) -{ - // negate y - int by1=b->ymin,by2=b->ymax; - b->ymin = -by2; - b->ymax = -by1; -} - -static void draw_char(SWFFONT * f, int nr, float*row, float*column, SRECT b, double weight) -{ - SWFGLYPH*g = &f->glyph[nr]; - - SHAPE2*s = swf_ShapeToShape2(g->shape); - SHAPELINE*l = s->lines; - int x=0,y=0; - while(l) { - if(l->type == lineTo) { - draw_line_xy(row,column,x,-y,l->x,-l->y,&b,weight); - } else if(l->type == splineTo) { - double x1=x,x2=l->sx,x3=l->x; - double y1=y,y2=l->sy,y3=l->y; - double c = fabs(x3-2*x2+x1) + fabs(y3-2*y2+y1); - int parts = ((int)(sqrt(c)/6))*2+1; - float xx=x1,yy=y1; - int t; - for(t=1;t<=parts;t++) { - float nx = ((t*t*x3 + 2*t*(parts-t)*x2 + (parts-t)*(parts-t)*x1)/(double)(parts*parts)); - float ny = ((t*t*y3 + 2*t*(parts-t)*y2 + (parts-t)*(parts-t)*y1)/(double)(parts*parts)); - draw_line_xy(row,column,xx,-yy,nx,-ny,&b,weight); - xx = nx; - yy = ny; - } - } - x = l->x; - y = l->y; - l = l->next; - } - swf_Shape2Free(s); - free(s); -} - -static ALIGNZONE detect_for_char(SWFFONT * f, float*row, float*column, SRECT font_bbox, SRECT char_bbox) -{ - ALIGNZONE a = {0xffff,0xffff,0xffff,0xffff}; - int width = font_bbox.xmax - font_bbox.xmin; - int height = font_bbox.ymax - font_bbox.ymin; - if(!width || !height) - return a; - - /* find two best x values */ - int x1=-1,y1=-1,x2=-1,y2=-1; - - int nr_x = 0; - find_best(row, width, &x1, &x2, f->use->smallest_size, - char_bbox.xmin - font_bbox.xmin, - char_bbox.xmax - font_bbox.xmin, nr_x, - 0); - if(nr_x>0 && x1>=0) a.x = floatToF16((x1+font_bbox.xmin) / 20480.0); - if(nr_x>1 && x2>=0) a.dx = floatToF16((x2-x1) / 20480.0); - - find_best(column, height, &y1, &y2, f->use->smallest_size, - char_bbox.ymin - font_bbox.ymin, - char_bbox.ymax - font_bbox.ymin, 2, - 0); - if(y1>=0) a.y = floatToF16((y1+font_bbox.ymin) / 20480.0); - if(y2>=0) a.dy = floatToF16((y2-y1) / 20480.0); - return a; -} - -static graph_t*make_graph(SWFFONT*f) -{ - FONTUSAGE*use = f->use; - graph_t*g = graph_new(f->numchars); - int s,t; - for(s=1;snumchars;s++) { - for(t=0;tglyph2ascii) { - int c1 = f->glyph2ascii[s]; - int c2 = f->glyph2ascii[t]; - if((c1<'a' && c2>='a' && c2<='z') || - (c2<'a' && c1>='a' && c1<='z')) { - /* never connect lowercase with any uppercase - or punctuation */ - continue; - } - } - - int pos1 = swf_FontUseGetPair(f, s, t); - int pos2 = swf_FontUseGetPair(f, t, s); - if(pos1 || pos2) { - int weight1 = pos1?use->neighbors[pos1-1].num:0; - int weight2 = pos2?use->neighbors[pos2-1].num:0; - int weight = weight1+weight2; - - /*printf("font %d: pair %c and %c\n", - f->id, f->glyph2ascii[t], f->glyph2ascii[s]);*/ - graph_add_edge(&g->nodes[s], &g->nodes[t], weight, weight); - } - } - } - return g; -} - -void swf_FontCreateAlignZones(SWFFONT * f) -{ - if(f->alignzones) - return; - - if(!f->layout) { - fprintf(stderr, "Error: font needs a layout for alignzones to be detected."); - return; - } - - f->alignzones = (ALIGNZONE*)rfx_calloc(sizeof(ALIGNZONE)*f->numchars); - f->alignzone_flags = FONTALIGN_MEDIUM; - - if(!f->layout || !f->use) { - int t; - for(t=0;tnumchars;t++) { - // just align the baseline - f->alignzones[t].x = 0xffff; - f->alignzones[t].y = 0; - f->alignzones[t].dx = 0xffff; - f->alignzones[t].dy = 0xffff;//floatToF16(460.80 / 1024.0); - } - } else { - graph_t*g = make_graph(f); - - int num_components = graph_find_components(g); - msg(" Building font alignzone information for font %d (%d characters, %d components, %d pairs)\n", - f->id, f->numchars, num_components, f->use->num_neighbors); - - SRECT bounds = {0,0,0,0}; - int t; - for(t=0;tnumchars;t++) { - SRECT b = f->layout->bounds[t]; - negate_y(&b); - swf_ExpandRect2(&bounds, &b); - } - - int width = bounds.xmax - bounds.xmin; - int height = bounds.ymax - bounds.ymin; - float*row = rfx_calloc(sizeof(float)*(width+1)); - float*global_column = rfx_calloc(sizeof(float)*(height+1)); - float*column = rfx_calloc(sizeof(float)*(height+1)); - - const double SELF_WEIGHT = 0.00; // ignore own char - - int c; - for(c=0;cnumchars;t++) { - if(g->nodes[t].tmp == c) { - draw_char(f, t, row, global_column, bounds, 1.0-SELF_WEIGHT); - SRECT b = f->layout->bounds[t]; - negate_y(&b); - swf_ExpandRect2(&local_bounds, &b); - drawn++; - } - } - - for(t=0;t<=height;t++) { - global_column[t] /= drawn; - } - - memcpy(column, global_column, sizeof(float)*(height+1)); - memset(row, 0, sizeof(float)*(width+1)); - ALIGNZONE a = detect_for_char(f, row, column, bounds, local_bounds); - - for(t=0;tnumchars;t++) { - if(g->nodes[t].tmp == c) { - f->alignzones[t] = a; - } - } - } - free(row); - free(column); - free(global_column); - - graph_delete(g); - } -} - -void swf_FontPostprocess(SWF*swf) -{ - TAG*tag = swf->firstTag; - while(tag) { - TAG*next = tag->next; - if(tag->id == ST_DEFINEFONT3) { - U16 id = swf_GetDefineID(tag); - SWFFONT*font = 0; - swf_FontExtract(swf, id, &font); - if(!font->alignzones) { - swf_FontCreateAlignZones(font); - tag = swf_InsertTag(tag, ST_DEFINEFONTALIGNZONES); - swf_FontSetAlignZones(tag, font); - } - swf_FontFree(font); - } - tag = next; - } -} - -void swf_FontSetAlignZones(TAG*t, SWFFONT *f) -{ - swf_SetU16(t, f->id); - swf_SetU8(t, f->alignzone_flags); - int i; - for(i=0;inumchars;i++) { - ALIGNZONE*a = &f->alignzones[i]; - U8 flags = 0; - if((a->x & a->dx)!=0xffff) - flags |= 1; - if((a->y & a->dy)!=0xffff) - flags |= 2; - int num = 1; - if(a->dx != 0xffff || a->dy != 0xffff) - num++; - swf_SetU8(t, num); - if(flags&1) swf_SetU16(t, a->x); else swf_SetU16(t, 0); - if(flags&2) swf_SetU16(t, a->y); else swf_SetU16(t, 0); - if(num==2) { - if((flags&1) && a->dx!=0xffff) swf_SetU16(t, a->dx); else swf_SetU16(t, 0); - if((flags&2) && a->dy!=0xffff) swf_SetU16(t, a->dy); else swf_SetU16(t, 0); - } - swf_SetU8(t, flags); - } -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbits.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbits.c deleted file mode 100644 index c2dcf254e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbits.c +++ /dev/null @@ -1,1266 +0,0 @@ -/* swfbits.c - - Bitmap functions (needs libjpeg) - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2000, 2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../../config.h" -#ifdef HAVE_ZLIB -#include -#include -#endif -#include -#include - -#ifdef HAVE_JPEGLIB -#define HAVE_BOOLEAN -#ifdef __cplusplus -extern "C" { -#endif -#include -#ifdef __cplusplus -} -#endif -#endif // HAVE_JPEGLIB - -#include "../rfxswf.h" - -#define OUTBUFFER_SIZE 0x8000 - -int swf_ImageHasAlpha(RGBA*img, int width, int height) -{ - int len = width*height; - int t; - int hasalpha=0; - for(t=0;t= 4 && img[t].a < 0xfc) - return 2; - if(img[t].a < 4) - hasalpha=1; - } - return hasalpha; -} - -/*int swf_ImageGetNumberOfPaletteEntries(RGBA*img, int width, int height, RGBA*palette) -{ - int len = width*height; - int t; - int palsize = 0; - RGBA pal[512]; - U32*pal32=(U32*)pal; - int palette_overflow = 0; - U32 lastcol32 = 0; - - if(sizeof(RGBA)!=sizeof(U32)) - fprintf(stderr, "rfxswf: sizeof(RGBA)!=sizeof(U32))"); - - lastcol32 = pal32[palsize++] = *(U32*)&img[0]; - - for(t=1;t> 17) ^ col32; - hash ^= ((hash>>8) + 1) ^ hash; - hash &= 255; - - csize = size[hash]; - cpal = &pal[hash*256]; - for(i=0;idest; - dmgr->buffer = (JOCTET *) rfx_alloc(OUTBUFFER_SIZE); - dmgr->mgr.next_output_byte = dmgr->buffer; - dmgr->mgr.free_in_buffer = OUTBUFFER_SIZE; -} - -static boolean RFXSWF_empty_output_buffer(j_compress_ptr cinfo) -{ - JPEGDESTMGR *dmgr = (JPEGDESTMGR *) cinfo->dest; - swf_SetBlock(dmgr->t, (U8 *) dmgr->buffer, OUTBUFFER_SIZE); - dmgr->mgr.next_output_byte = dmgr->buffer; - dmgr->mgr.free_in_buffer = OUTBUFFER_SIZE; - return TRUE; -} - -static void RFXSWF_term_destination(j_compress_ptr cinfo) -{ - JPEGDESTMGR *dmgr = (JPEGDESTMGR *) cinfo->dest; - swf_SetBlock(dmgr->t, (U8 *) dmgr->buffer, - OUTBUFFER_SIZE - dmgr->mgr.free_in_buffer); - rfx_free(dmgr->buffer); - dmgr->mgr.free_in_buffer = 0; -} - -JPEGBITS *swf_SetJPEGBitsStart(TAG * t, int width, int height, int quality) -{ - JPEGDESTMGR *jpeg; - - // redirect compression lib output to local SWF Tag structure - - jpeg = (JPEGDESTMGR *) rfx_calloc(sizeof(JPEGDESTMGR)); - - jpeg->cinfo.err = jpeg_std_error(&jpeg->jerr); - - jpeg_create_compress(&jpeg->cinfo); - - jpeg->mgr.init_destination = RFXSWF_init_destination; - jpeg->mgr.empty_output_buffer = RFXSWF_empty_output_buffer; - jpeg->mgr.term_destination = RFXSWF_term_destination; - - jpeg->t = t; - - jpeg->cinfo.dest = (struct jpeg_destination_mgr *) jpeg; - - // init compression - - jpeg->cinfo.image_width = width; - jpeg->cinfo.image_height = height; - jpeg->cinfo.input_components = 3; - jpeg->cinfo.in_color_space = JCS_RGB; - - jpeg_set_defaults(&jpeg->cinfo); - jpeg_set_quality(&jpeg->cinfo, quality, TRUE); - - // write tables to SWF - - jpeg_write_tables(&jpeg->cinfo); - - // compess image to SWF - - jpeg_suppress_tables(&jpeg->cinfo, TRUE); - jpeg_start_compress(&jpeg->cinfo, FALSE); - - return (JPEGBITS *) jpeg; -} - -int swf_SetJPEGBitsLines(JPEGBITS * jpegbits, U8 ** data, int n) -{ - JPEGDESTMGR *jpeg = (JPEGDESTMGR *) jpegbits; - if (!jpeg) - return -1; - jpeg_write_scanlines(&jpeg->cinfo, data, n); - return 0; -} - -int swf_SetJPEGBitsLine(JPEGBITS * jpegbits, U8 * data) -{ - return swf_SetJPEGBitsLines(jpegbits, &data, 1); -} - -int swf_SetJPEGBitsFinish(JPEGBITS * jpegbits) -{ - JPEGDESTMGR *jpeg = (JPEGDESTMGR *) jpegbits; - if (!jpeg) - return -1; - jpeg_finish_compress(&jpeg->cinfo); - jpeg_destroy_compress(&jpeg->cinfo); - rfx_free(jpeg); - return 0; -} - -#if defined(HAVE_JPEGLIB) -void swf_SetJPEGBits2(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) -{ - JPEGBITS *jpeg; - int y; - jpeg = swf_SetJPEGBitsStart(tag, width, height, quality); - U8 *scanline = (U8*)rfx_alloc(3 * width); - for (y = 0; y < height; y++) { - int x, p = 0; - for (x = 0; x < width; x++) { - scanline[p++] = bitmap[width * y + x].r; - scanline[p++] = bitmap[width * y + x].g; - scanline[p++] = bitmap[width * y + x].b; - } - swf_SetJPEGBitsLine(jpeg, scanline); - } - rfx_free(scanline); - swf_SetJPEGBitsFinish(jpeg); -} -#else -void swf_SetJPEGBits2(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) -{ - fprintf(stderr, "Error: swftools compiled without jpeglib\n"); - return -1; -} -#endif - -void swf_GetJPEGSize(const char *fname, int *width, int *height) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - FILE *fi; - *width = 0; - *height = 0; - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - if ((fi = fopen(fname, "rb")) == NULL) { - fprintf(stderr, "rfxswf: file open error\n"); - return; - } - jpeg_stdio_src(&cinfo, fi); - jpeg_read_header(&cinfo, TRUE); - *width = cinfo.image_width; - *height = cinfo.image_height; - jpeg_destroy_decompress(&cinfo); - fclose(fi); -} - -int swf_SetJPEGBits(TAG * t, const char *fname, int quality) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - JPEGBITS *out; - FILE *f; - U8 *scanline; - - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - - if ((f = fopen(fname, "rb")) == NULL) { - fprintf(stderr, "rfxswf: file open error\n"); - return -1; - } - - jpeg_stdio_src(&cinfo, f); - jpeg_read_header(&cinfo, TRUE); - jpeg_start_decompress(&cinfo); - - out = - swf_SetJPEGBitsStart(t, cinfo.output_width, cinfo.output_height, - quality); - scanline = (U8 *) rfx_alloc(4 * cinfo.output_width); - - if (scanline) { - int y; - U8 *js = scanline; - if (cinfo.out_color_space == JCS_GRAYSCALE) { - for (y = 0; y < cinfo.output_height; y++) { - int x; - jpeg_read_scanlines(&cinfo, &js, 1); - for (x = cinfo.output_width - 1; x >= 0; x--) { - js[x * 3] = js[x * 3 + 1] = js[x * 3 + 2] = js[x]; - } - swf_SetJPEGBitsLines(out, (U8 **) & js, 1); - } - } else if (cinfo.out_color_space == JCS_RGB) { - for (y = 0; y < cinfo.output_height; y++) { - jpeg_read_scanlines(&cinfo, &js, 1); - swf_SetJPEGBitsLines(out, (U8 **) & js, 1); - } - } else if (cinfo.out_color_space == JCS_YCCK) { - //FIXME - fprintf(stderr, "Error: Can't convert YCCK to RGB.\n"); - return -1; - } else if (cinfo.out_color_space == JCS_YCbCr) { - for (y = 0; y < cinfo.output_height; y++) { - int x; - for (x = 0; x < cinfo.output_width; x++) { - int y = js[x * 3 + 0]; - int u = js[x * 3 + 1]; - int v = js[x * 3 + 1]; - js[x * 3 + 0] = y + ((360 * (v - 128)) >> 8); - js[x * 3 + 1] = - y - ((88 * (u - 128) + 183 * (v - 128)) >> 8); - js[x * 3 + 2] = y + ((455 * (u - 128)) >> 8); - } - } - } else if (cinfo.out_color_space == JCS_CMYK) { - for (y = 0; y < cinfo.output_height; y++) { - int x; - jpeg_read_scanlines(&cinfo, &js, 1); - /* This routine seems to work for now- - It's a mixture of 3 different - CMYK->RGB conversion routines I found in the - web. (which all produced garbage) - I'm happily accepting suggestions. (mk) */ - for (x = 0; x < cinfo.output_width; x++) { - int white = 255 - js[x * 4 + 3]; - js[x * 3 + 0] = white - ((js[x * 4] * white) >> 8); - js[x * 3 + 1] = white - ((js[x * 4 + 1] * white) >> 8); - js[x * 3 + 2] = white - ((js[x * 4 + 2] * white) >> 8); - } - swf_SetJPEGBitsLines(out, (U8 **) & js, 1); - } - } - } - - rfx_free(scanline); - swf_SetJPEGBitsFinish(out); - jpeg_finish_decompress(&cinfo); - fclose(f); - - return 0; -} - -typedef struct _JPEGFILEMGR { - struct jpeg_destination_mgr mgr; - JOCTET *buffer; - struct jpeg_compress_struct* cinfo; - struct jpeg_error_mgr* jerr; - FILE*fi; -} JPEGFILEMGR; - -static void file_init_destination(j_compress_ptr cinfo) -{ - JPEGFILEMGR*fmgr = (JPEGFILEMGR*)(cinfo->dest); - struct jpeg_destination_mgr*dmgr = &fmgr->mgr; - - fmgr->buffer = (JOCTET*)rfx_alloc(OUTBUFFER_SIZE); - if(!fmgr->buffer) { - perror("malloc"); - fprintf(stderr, "Out of memory!\n"); - exit(1); - } - - dmgr->next_output_byte = fmgr->buffer; - dmgr->free_in_buffer = OUTBUFFER_SIZE; -} - -static boolean file_empty_output_buffer(j_compress_ptr cinfo) -{ - JPEGFILEMGR*fmgr = (JPEGFILEMGR*)(cinfo->dest); - struct jpeg_destination_mgr*dmgr = &fmgr->mgr; - - if(fmgr->fi) - fwrite(fmgr->buffer, OUTBUFFER_SIZE, 1, fmgr->fi); - - dmgr->next_output_byte = fmgr->buffer; - dmgr->free_in_buffer = OUTBUFFER_SIZE; - return 1; -} - -static void file_term_destination(j_compress_ptr cinfo) -{ - JPEGFILEMGR*fmgr = (JPEGFILEMGR*)(cinfo->dest); - struct jpeg_destination_mgr*dmgr = &fmgr->mgr; - - if(fmgr->fi) - fwrite(fmgr->buffer, OUTBUFFER_SIZE-dmgr->free_in_buffer, 1, fmgr->fi); - - rfx_free(fmgr->buffer); - fmgr->buffer = 0; - dmgr->free_in_buffer = 0; - dmgr->next_output_byte = 0; -} - -void swf_SaveJPEG(char*filename, RGBA*pixels, int width, int height, int quality) -{ - JPEGFILEMGR fmgr; - struct jpeg_compress_struct cinfo; - struct jpeg_error_mgr jerr; - unsigned char*data2 = 0; - int y; - - FILE*fi = fopen(filename, "wb"); - if(!fi) { - char buf[256]; - sprintf(buf, "rfxswf: Couldn't create %s", filename); - perror(buf); - return; - } - data2 = (unsigned char *)rfx_calloc(width*3); - - memset(&cinfo, 0, sizeof(cinfo)); - memset(&jerr, 0, sizeof(jerr)); - memset(&fmgr, 0, sizeof(fmgr)); - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_compress(&cinfo); - - fmgr.mgr.init_destination = file_init_destination; - fmgr.mgr.empty_output_buffer = file_empty_output_buffer; - fmgr.mgr.term_destination = file_term_destination; - fmgr.fi = fi; - fmgr.cinfo = &cinfo; - fmgr.jerr = &jerr; - cinfo.dest = (struct jpeg_destination_mgr*)&fmgr; - - // init compression - - cinfo.image_width = width; - cinfo.image_height = height; - cinfo.input_components = 3; - cinfo.in_color_space = JCS_RGB; - jpeg_set_defaults(&cinfo); - cinfo.dct_method = JDCT_IFAST; - jpeg_set_quality(&cinfo,quality,TRUE); - - //jpeg_write_tables(&cinfo); - //jpeg_suppress_tables(&cinfo, TRUE); - jpeg_start_compress(&cinfo, FALSE); - - for(y=0;yclient_data; - if (tag->id == ST_DEFINEBITSJPEG3) { - swf_SetTagPos(tag, 6); - } else { - swf_SetTagPos(tag, 2); - } - cinfo->src->bytes_in_buffer = 0; -} -static boolean tag_fill_input_buffer(struct jpeg_decompress_struct *cinfo) -{ - TAG *tag = (TAG *) cinfo->client_data; - if (tag->pos + 4 <= tag->len && - tag->data[tag->pos + 0] == 0xff && - tag->data[tag->pos + 1] == 0xd9 && - tag->data[tag->pos + 2] == 0xff && - tag->data[tag->pos + 3] == 0xd8) { - tag->pos += 4; - } - if (tag->pos >= tag->len) { - cinfo->src->next_input_byte = 0; - cinfo->src->bytes_in_buffer = 0; - return 0; - } - cinfo->src->next_input_byte = &tag->data[tag->pos]; - cinfo->src->bytes_in_buffer = 1; //tag->len - tag->pos; - tag->pos += 1; - return 1; -} -static void tag_skip_input_data(struct jpeg_decompress_struct *cinfo, long count) -{ - TAG *tag = (TAG *) cinfo->client_data; - cinfo->src->next_input_byte = 0; - cinfo->src->bytes_in_buffer = 0; - tag->pos += count; -} -static boolean tag_resync_to_restart(struct jpeg_decompress_struct *cinfo, int desired) -{ - return jpeg_resync_to_restart(cinfo, desired); -} -static void tag_term_source(struct jpeg_decompress_struct *cinfo) -{ - TAG *tag = (TAG *) cinfo->client_data; -} -RGBA *swf_JPEG2TagToImage(TAG * tag, int *width, int *height) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - struct jpeg_source_mgr mgr; - RGBA *dest; - int y; - int offset = 0; - int oldtaglen = 0; - *width = 0; - *height = 0; - - if (tag->id == ST_DEFINEBITSJPEG) { - fprintf(stderr, "rfxswf: extracting from definebitsjpeg not yet supported\n"); - return 0; - } - if (tag->id == ST_DEFINEBITSJPEG3) { -#ifdef HAVE_ZLIB - offset = swf_GetU32(tag); - oldtaglen = tag->len; - tag->len = offset+6; -#else - fprintf(stderr, "rfxswf: extracting from definebitsjpeg3 not possible: no zlib\n"); - return 0; -#endif - } - - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - - cinfo.client_data = (void *) tag; - cinfo.src = &mgr; - cinfo.src->init_source = tag_init_source; - cinfo.src->fill_input_buffer = tag_fill_input_buffer; - cinfo.src->skip_input_data = tag_skip_input_data; - cinfo.src->resync_to_restart = jpeg_resync_to_restart; - cinfo.src->term_source = tag_term_source; - cinfo.out_color_space = JCS_RGB; - - jpeg_read_header(&cinfo, TRUE); - *width = cinfo.image_width; - *height = cinfo.image_height; - dest = (RGBA*) - rfx_alloc(sizeof(RGBA) * cinfo.image_width * cinfo.image_height); - - jpeg_start_decompress(&cinfo); - for (y = 0; y < cinfo.output_height; y++) { - RGBA *line = &dest[y * cinfo.image_width]; - U8 *to = (U8 *) line; - int x; - jpeg_read_scanlines(&cinfo, &to, 1); - for (x = cinfo.output_width - 1; x >= 0; --x) { - int r = to[x * 3 + 0]; - int g = to[x * 3 + 1]; - int b = to[x * 3 + 2]; - line[x].r = r; - line[x].g = g; - line[x].b = b; - line[x].a = 255; - } - } - - jpeg_finish_decompress(&cinfo); - - jpeg_destroy_decompress(&cinfo); - -#ifdef HAVE_ZLIB - if(offset) { - uLongf datalen = cinfo.output_width*cinfo.output_height; - U8* alphadata = (U8*)rfx_alloc(datalen); - int error; - tag->len = oldtaglen; - swf_SetTagPos(tag, 6+offset); - error = uncompress(alphadata, &datalen, &tag->data[tag->pos], tag->len - tag->pos); - if (error != Z_OK) { - fprintf(stderr, "rfxswf: Zlib error %d while extracting definejpeg3\n", error); - return 0; - } - for(y=0;ynext_out = data; - zs->avail_out = OUTBUFFER_SIZE; - while (1) { - int status = deflate(zs, Z_NO_FLUSH); - - if (status != Z_OK) { - fprintf(stderr, "rfxswf: zlib compression error (%i)\n", status); - rfx_free(data); - return status; - } - - if (zs->next_out != data) { - swf_SetBlock(t, data, zs->next_out - data); - zs->next_out = data; - zs->avail_out = OUTBUFFER_SIZE; - } - - if (zs->avail_in == 0) - break; - } - - if (!finish) { - rfx_free(data); - return 0; - } - - while (1) { - int status = deflate(zs, Z_FINISH); - if (status != Z_OK && status != Z_STREAM_END) { - fprintf(stderr, "rfxswf: zlib compression error (%i)\n", status); - rfx_free(data); - return status; - } - - if (zs->next_out != data) { - swf_SetBlock(t, data, zs->next_out - data); - zs->next_out = data; - zs->avail_out = OUTBUFFER_SIZE; - } - - if (status == Z_STREAM_END) - break; - } - rfx_free(data); - return 0; -} - - -int swf_SetLosslessBits(TAG * t, U16 width, U16 height, void *bitmap, U8 bitmap_flags) -{ - int res = 0; - int bps; - - switch (bitmap_flags) { - case BMF_8BIT: - return swf_SetLosslessBitsIndexed(t, width, height, (U8*)bitmap, NULL, 256); - case BMF_16BIT: - bps = BYTES_PER_SCANLINE(sizeof(U16) * width); - break; - case BMF_32BIT: - bps = width * 4; - break; - default: - fprintf(stderr, "rfxswf: unknown bitmap type %d\n", bitmap_flags); - return -1; - } - - swf_SetU8(t, bitmap_flags); - swf_SetU16(t, width); - swf_SetU16(t, height); - - { - z_stream zs; - - memset(&zs, 0x00, sizeof(z_stream)); - zs.zalloc = Z_NULL; - zs.zfree = Z_NULL; - - if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) == Z_OK) { - zs.avail_in = bps * height; - zs.next_in = (Bytef *)bitmap; - - if (RFXSWF_deflate_wraper(t, &zs, TRUE) < 0) - res = -3; - deflateEnd(&zs); - - } else - res = -3; // zlib error - } - return res; -} - -int swf_SetLosslessBitsIndexed(TAG * t, U16 width, U16 height, U8 * bitmap, RGBA * palette, U16 ncolors) -{ - RGBA *pal = palette; - int bps = BYTES_PER_SCANLINE(width); - int res = 0; - - if (!pal) // create default palette for grayscale images - { - int i; - pal = (RGBA*)rfx_alloc(256 * sizeof(RGBA)); - for (i = 0; i < 256; i++) { - pal[i].r = pal[i].g = pal[i].b = i; - pal[i].a = 0xff; - } - ncolors = 256; - } - - if ((ncolors < 2) || (ncolors > 256) || (!t)) { - fprintf(stderr, "rfxswf: unsupported number of colors: %d\n", - ncolors); - return -1; // parameter error - } - - swf_SetU8(t, BMF_8BIT); - swf_SetU16(t, width); - swf_SetU16(t, height); - swf_SetU8(t, ncolors - 1); // number of pal entries - - { - z_stream zs; - - memset(&zs, 0x00, sizeof(z_stream)); - zs.zalloc = Z_NULL; - zs.zfree = Z_NULL; - - if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) == Z_OK) { - U8 *zpal; // compress palette - if ((zpal = (U8*)rfx_alloc(ncolors * 4))) { - U8 *pp = zpal; - int i; - - /* be careful with ST_DEFINEBITSLOSSLESS2, because - the Flash player produces great bugs if you use too many - alpha colors in your palette. The only sensible result that - can be archeived is setting one color to r=0,b=0,g=0,a=0 to - make transparent parts in sprites. That's the cause why alpha - handling is implemented in lossless routines of rfxswf. - - Indeed: I haven't understood yet how flash player handles - alpha values different from 0 and 0xff in lossless bitmaps... - */ - - if (swf_GetTagID(t) == ST_DEFINEBITSLOSSLESS2) // have alpha channel? - { - for (i = 0; i < ncolors; i++) { - pp[0] = pal[i].r; - pp[1] = pal[i].g; - pp[2] = pal[i].b; - pp[3] = pal[i].a; - pp += 4; - } - zs.avail_in = 4 * ncolors; - } else { - for (i = 0; i < ncolors; i++) // pack RGBA structures to RGB - { - pp[0] = pal[i].r; - pp[1] = pal[i].g; - pp[2] = pal[i].b; - pp += 3; - } - zs.avail_in = 3 * ncolors; - } - - zs.next_in = zpal; - - if (RFXSWF_deflate_wraper(t, &zs, FALSE) < 0) - res = -3; - - // compress bitmap - zs.next_in = bitmap; - zs.avail_in = (bps * height * sizeof(U8)); - - if (RFXSWF_deflate_wraper(t, &zs, TRUE) < 0) - res = -3; - - deflateEnd(&zs); - - rfx_free(zpal); - } else - res = -2; // memory error - } else - res = -3; // zlib error - } - - if (!palette) - rfx_free(pal); - - return res; -} - -int swf_SetLosslessBitsGrayscale(TAG * t, U16 width, U16 height, U8 * bitmap) -{ - return swf_SetLosslessBitsIndexed(t, width, height, bitmap, NULL, 256); -} - -void swf_PreMultiplyAlpha(RGBA*data, int width, int height) -{ - int num = width*height; - int t; - for(t=0;tid = ST_DEFINEBITSLOSSLESS; - } else { - tag->id = ST_DEFINEBITSLOSSLESS2; - /* FIXME: we're destroying the callers data here */ - swf_PreMultiplyAlpha(data, width, height); - } - num = swf_ImageGetNumberOfPaletteEntries(data, width, height, 0); - if(num>1 && num<=256) { - RGBA*palette = (RGBA*)malloc(sizeof(RGBA)*num); - int width2 = BYTES_PER_SCANLINE(width); - U8*data2 = (U8*)malloc(width2*height); - int len = width*height; - int x,y; - int r; - swf_ImageGetNumberOfPaletteEntries(data, width, height, palette); - for(y=0;yid == ST_DEFINEBITSLOSSLESS2; - int t, x, y; - RGBA *palette = 0; - U8 *data, *data2; - RGBA *dest; - if (tag->id != ST_DEFINEBITSLOSSLESS && - tag->id != ST_DEFINEBITSLOSSLESS2) { - fprintf(stderr, "rfxswf: Object %d is not a PNG picture!\n", - GET16(tag->data)); - return 0; - } - swf_SetTagPos(tag, 0); - id = swf_GetU16(tag); - format = swf_GetU8(tag); - if (format == 3) - bpp = 8; - if (format == 4) - bpp = 16; - if (format == 5) - bpp = 32; - if (format != 3 && format != 5) { - if (format == 4) - fprintf(stderr, - "rfxswf: Can't handle 16-bit palette images yet (image %d)\n", - id); - else - fprintf(stderr, "rfxswf: Unknown image type %d in image %d\n", - format, id); - return 0; - } - *dwidth = width = swf_GetU16(tag); - *dheight = height = swf_GetU16(tag); - - dest = (RGBA*)rfx_alloc(sizeof(RGBA) * width * height); - - if (format == 3) - cols = swf_GetU8(tag) + 1; - else - cols = 0; - - data = 0; - datalen = (width * height * bpp / 8 + cols * 8); - do { - if (data) - rfx_free(data); - datalen += 4096; - data = (U8*)rfx_alloc(datalen); - error = - uncompress(data, &datalen, &tag->data[tag->pos], - tag->len - tag->pos); - } while (error == Z_BUF_ERROR); - if (error != Z_OK) { - fprintf(stderr, "rfxswf: Zlib error %d (image %d)\n", error, id); - return 0; - } - pos = 0; - - if (cols) { - palette = (RGBA *) rfx_alloc(cols * sizeof(RGBA)); - for (t = 0; t < cols; t++) { - palette[t].r = data[pos++]; - palette[t].g = data[pos++]; - palette[t].b = data[pos++]; - if (alpha) { - palette[t].a = data[pos++]; - } else { - palette[t].a = 255; - } - } - } - - for (y = 0; y < height; y++) { - int srcwidth = width * (bpp / 8); - if (bpp == 32) { - if (!alpha) { - // 32 bit to 24 bit "conversion" - for (x = 0; x < width; x++) { - dest[pos2].r = data[pos + 1]; - dest[pos2].g = data[pos + 2]; - dest[pos2].b = data[pos + 3]; - dest[pos2].a = 255; - pos2++; - pos += 4; //ignore padding byte - } - } else { - for (x = 0; x < width; x++) { - /* remove premultiplication */ - int alpha = data[pos+0]; - if(alpha) - alpha = 0xff0000/alpha; - dest[pos2].r = (data[pos + 1]*alpha)>>16; - dest[pos2].g = (data[pos + 2]*alpha)>>16; - dest[pos2].b = (data[pos + 3]*alpha)>>16; - dest[pos2].a = data[pos + 0]; //alpha - pos2++; - pos += 4; - } - } - } else { - for (x = 0; x < srcwidth; x++) { - dest[pos2] = palette[data[pos++]]; - pos2++; - } - } - pos += ((srcwidth + 3) & ~3) - srcwidth; //align - } - if (palette) - rfx_free(palette); - rfx_free(data); - return dest; -} - -#endif // HAVE_ZLIB - -#if defined(HAVE_ZLIB) && defined(HAVE_JPEGLIB) - -/* expects bitmap to be non-premultiplied */ -int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) -{ - JPEGBITS *jpeg; - int y; - int pos; - int res = 0; - U8 *data; - z_stream zs; - - pos = tag->len; - swf_SetU32(tag, 0); //placeholder - jpeg = swf_SetJPEGBitsStart(tag, width, height, quality); - U8 *scanline = (U8*)rfx_alloc(3 * width); - for (y = 0; y < height; y++) { - int x, p = 0; - for (x = 0; x < width; x++) { - //int ia = bitmap[width*y+x].a; - //if(ia) { - // /* remove premultiplication */ - // ia = 0xff0000/ia; - //} - //scanline[p++] = (bitmap[width * y + x].r*ia)>>16; - //scanline[p++] = (bitmap[width * y + x].g*ia)>>16; - //scanline[p++] = (bitmap[width * y + x].b*ia)>>16; - scanline[p++] = bitmap[width * y + x].r; - scanline[p++] = bitmap[width * y + x].g; - scanline[p++] = bitmap[width * y + x].b; - } - swf_SetJPEGBitsLine(jpeg, scanline); - } - rfx_free(scanline); - swf_SetJPEGBitsFinish(jpeg); - PUT32(&tag->data[pos], tag->len - pos - 4); - - data = (U8*)rfx_alloc(OUTBUFFER_SIZE); - memset(&zs, 0x00, sizeof(z_stream)); - - if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) != Z_OK) { - fprintf(stderr, "rfxswf: zlib compression failed"); - return -3; - } - - zs.next_out = data; - zs.avail_out = OUTBUFFER_SIZE; - - scanline = (U8*)rfx_alloc(width); - for (y = 0; y < height; y++) { - int x, p = 0; - for (x = 0; x < width; x++) { - scanline[p++] = bitmap[width * y + x].a; - } - zs.avail_in = width; - zs.next_in = scanline; - - while (1) { - if (deflate(&zs, Z_NO_FLUSH) != Z_OK) { - fprintf(stderr, "rfxswf: zlib compression failed"); - return -4; - } - if (zs.next_out != data) { - swf_SetBlock(tag, data, zs.next_out - data); - zs.next_out = data; - zs.avail_out = OUTBUFFER_SIZE; - } - if (!zs.avail_in) { - break; - } - } - } - - rfx_free(scanline); - - while (1) { - int ret = deflate(&zs, Z_FINISH); - if (ret != Z_OK && ret != Z_STREAM_END) { - fprintf(stderr, "rfxswf: zlib compression failed"); - return -5; - } - if (zs.next_out != data) { - swf_SetBlock(tag, data, zs.next_out - data); - zs.next_out = data; - zs.avail_out = OUTBUFFER_SIZE; - } - if (ret == Z_STREAM_END) { - break; - } - } - - deflateEnd(&zs); - rfx_free(data); - return 0; -} - -#else -int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) -{ - fprintf(stderr, "Error: swftools compiled without jpeglib\n"); - return -1; -} -#endif - - -/* expects mem to be non-premultiplied */ -TAG* swf_AddImage(TAG*tag, int bitid, RGBA*mem, int width, int height, int quality) -{ - TAG *tag1 = 0, *tag2 = 0; - int has_alpha = swf_ImageHasAlpha(mem,width,height); - - /* try lossless image */ - -#ifdef NO_LOSSLESS - tag1 = swf_InsertTag(0, /*ST_DEFINEBITSLOSSLESS1/2*/0); - tag1->len = 0x7fffffff; -#else - tag1 = swf_InsertTag(0, /*ST_DEFINEBITSLOSSLESS1/2*/0); - swf_SetU16(tag1, bitid); - swf_SetLosslessImage(tag1, mem, width, height); -#endif - -#if defined(HAVE_JPEGLIB) - /* try jpeg image. Notice that if (and only if) we tried the lossless compression - above, the data will now be premultiplied with alpha. */ - if(has_alpha) { - tag2 = swf_InsertTag(0, ST_DEFINEBITSJPEG3); - swf_SetU16(tag2, bitid); - swf_SetJPEGBits3(tag2, width, height, mem, quality); - } else { - tag2 = swf_InsertTag(0, ST_DEFINEBITSJPEG2); - swf_SetU16(tag2, bitid); - swf_SetJPEGBits2(tag2, width, height, mem, quality); - } -#endif - - if(quality>100 || !tag2 || (tag1 && tag1->len < tag2->len)) { - /* use the zlib version- it's smaller */ - tag1->prev = tag; - if(tag) tag->next = tag1; - tag = tag1; - swf_DeleteTag(0, tag2); - } else { - /* use the jpeg version- it's smaller */ - tag2->prev = tag; - if(tag) tag->next = tag2; - tag = tag2; - swf_DeleteTag(0, tag1); - } - return tag; -} - -RGBA *swf_ExtractImage(TAG * tag, int *dwidth, int *dheight) -{ - RGBA *img; - - swf_SetTagPos(tag, 2); // id is 2 bytes - - if (tag->id == ST_DEFINEBITSJPEG || - tag->id == ST_DEFINEBITSJPEG2 || tag->id == ST_DEFINEBITSJPEG3) { -#ifdef HAVE_JPEGLIB - return swf_JPEG2TagToImage(tag, dwidth, dheight); -#else - fprintf(stderr, "rfxswf: Error: No JPEG library compiled in"); - return 0; -#endif - } - if (tag->id == ST_DEFINEBITSLOSSLESS || - tag->id == ST_DEFINEBITSLOSSLESS2) { -#ifdef HAVE_ZLIB - return swf_DefineLosslessBitsTagToImage(tag, dwidth, dheight); -#else - fprintf(stderr, "rfxswf: Error: No JPEG library compiled in"); - return 0; -#endif - } - fprintf(stderr, "rfxswf: Error: Invalid tag (%d, %s)", tag->id, - swf_TagGetName(tag)); - return 0; -} - -#undef OUTBUFFER_SIZE - - -void swf_RemoveJPEGTables(SWF * swf) -{ - TAG *tag = swf->firstTag; - TAG *tables_tag = 0; - while (tag) { - if (tag->id == ST_JPEGTABLES) { - tables_tag = tag; - } - tag = tag->next; - } - - if (!tables_tag) - return; - - tag = swf->firstTag; - while (tag) { - if (tag->id == ST_DEFINEBITSJPEG) { - int len = tag->len; - void *data = rfx_alloc(len); - swf_GetBlock(tag, (U8*)data, tag->len); - swf_ResetTag(tag, ST_DEFINEBITSJPEG2); - swf_SetBlock(tag, &((U8*)data)[0], 2); //id - swf_SetBlock(tag, tables_tag->data, tables_tag->len); - swf_SetBlock(tag, &((U8*)data)[2], len-2); - free(data); - } - tag = tag->next; - } - if (swf->firstTag == tables_tag) - swf->firstTag = tables_tag->next; - swf_DeleteTag(swf, tables_tag); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbutton.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbutton.c deleted file mode 100644 index 40684aa7e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfbutton.c +++ /dev/null @@ -1,148 +0,0 @@ -/* swfbutton.c - - Button functions - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2000, 2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../rfxswf.h" - -int swf_ButtonSetRecord(TAG * t,U8 state,U16 id,U16 layer,MATRIX * m,CXFORM * cx) - -{ swf_SetU8(t,state); - swf_SetU16(t,id); - swf_SetU16(t,layer); - swf_SetMatrix(t,m); - if (swf_GetTagID(t)==ST_DEFINEBUTTON2) swf_SetCXForm(t,cx,1); - return 0; -} - -int swf_ButtonSetCondition(TAG * t,U16 condition) -{ swf_SetU16(t,0); // dummy for Action Offset -> later set by ButtonPostProcess - swf_SetU16(t,condition); - return 0; -} - -int swf_ButtonSetFlags(TAG * t,U8 flags) -{ if (swf_GetTagID(t)==ST_DEFINEBUTTON2) - { swf_SetU8(t,flags); - swf_SetU16(t,0); // dummy for Action Offset -> later set by ButtonPostProcess - } - return 0; -} - -void swf_SetButtonOffset(TAG * t,U32 offsetpos) -{ U32 now = swf_GetTagPos(t); - U16 diff = now-offsetpos; - swf_SetTagPos(t,offsetpos); - t->data[t->pos++] = (U8)(diff&0xff); - t->data[t->pos++] = (U8)(diff>>8); - swf_SetTagPos(t,now); -} - -int swf_ButtonPostProcess(TAG * t,int anz_action) -{ if (swf_GetTagID(t)==ST_DEFINEBUTTON2) - { U32 oldTagPos; - U32 offsetpos; - - oldTagPos = swf_GetTagPos(t); - - // scan DefineButton2 Record - - swf_GetU16(t); // Character ID - swf_GetU8(t); // Flags; - - offsetpos = swf_GetTagPos(t); // first offset - swf_GetU16(t); - - while (swf_GetU8(t)) // state -> parse ButtonRecord - { swf_GetU16(t); // id - swf_GetU16(t); // layer - swf_GetMatrix(t,NULL); // matrix - swf_GetCXForm(t,NULL,1);// CXForm - } - - swf_SetButtonOffset(t,offsetpos); - - while(anz_action) - { U8 a; - - offsetpos = swf_GetTagPos(t); // offset - swf_GetU16(t); - - swf_GetU16(t); // condition - - while ((a=swf_GetU8(t))) // skip action records - { if (a&0x80) - { U16 l = swf_GetU16(t); - swf_GetBlock(t,NULL,l); - } - } - - if (--anz_action) swf_SetButtonOffset(t,offsetpos); - } - - swf_SetTagPos(t,oldTagPos); - } - return 0; -} - -ActionTAG* swf_Button1GetAction(TAG*tag) -{ - swf_GetU16(tag); //button id - while(1) - { - U8 flags = swf_GetU8(tag); - if(!flags) - break; - swf_GetU16(tag); //char - swf_GetU16(tag); //layer - swf_ResetReadBits(tag); - swf_GetMatrix(tag, NULL); - } - return swf_ActionGet(tag); -} - -ActionTAG* swf_Button2GetAction(TAG*tag) -{ - swf_GetU16(tag); //button id - swf_GetU8(tag); //flag - U16 offset = swf_GetU16(tag); //offset - swf_SetTagPos(tag, offset); - swf_GetU16(tag); // next offset - swf_GetU16(tag); // condition - - /* notice: this only returns the *first* action block. - For the current appliances, this is enough. - */ - return swf_ActionGet(tag); -} - -ActionTAG* swf_ButtonGetAction(TAG*t) -{ - if(t->id == ST_DEFINEBUTTON) { - return swf_Button1GetAction(t); - } else if(t->id == ST_DEFINEBUTTON2) { - return swf_Button2GetAction(t); - } else { - fprintf(stderr, "error in buttongetaction: not a button tag\n"); - return 0; - } -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfcgi.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfcgi.c deleted file mode 100644 index aa86e4938..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfcgi.c +++ /dev/null @@ -1,193 +0,0 @@ -/* swfcgi.c - - Parse CGI parameters - - Partly adopted from Steven Grimm's uncgi tool and library. - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "../rfxswf.h" - -#define ishex(x) (((x) >= '0' && (x) <= '9') || ((x) >= 'a' && (x) <= 'f') || ((x) >= 'A' && (x) <= 'F')) - -#define PREFIX "WWW_" - -static int swf_htoi(unsigned char * s) -{ int value; - char c; - - c = s[0]; - if (isupper(c)) c = tolower(c); - value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16; - - c = s[1]; - if (isupper(c)) c = tolower(c); - value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10; - - return (value); -} - -static void swf_url_unescape(unsigned char * s) -{ unsigned char *dest = s; - - while (s[0]) - { if (s[0] == '+') dest[0] = ' '; - else - { if (s[0] == '%' && ishex(s[1]) && ishex(s[2])) - { dest[0] = (unsigned char) swf_htoi(s + 1); - s += 2; - } - else dest[0] = s[0]; - } - s++;dest++; - } - dest[0] = 0; -} - -static void swf_cgienv(unsigned char * var) -{ unsigned char *buf, *c, *s, *t, *oldval = NULL, *newval; - int despace = 0, got_cr = 0; - - // fprintf(stderr,"%s\n",var); - swf_url_unescape(var); - // fprintf(stderr,"%s\n",var); - - - buf = (unsigned char*)rfx_alloc(strlen((const char*)var) + sizeof(PREFIX) + 2); - if (!buf) return; - - strcpy((char*)buf, (const char*)PREFIX); - if (var[0] == '_') - { strcpy((char*)&buf[sizeof(PREFIX)-1], (const char*)&var[1]); - despace = 1; - } - else strcpy((char*)&buf[sizeof(PREFIX)-1], (const char*)var); - - for (c = buf; c[0] ; c++) - { if (c[0] == '.') c[0] = '_'; - if (c[0] == '=') break; - } - if (!c[0]) c[1] = 0; - c[0] = 0; - - if (despace && c[1]) - { for (s = c+1; s[0] && isspace(s[0]); s++); - t = c + 1; - while (s[0]) - { if (s[0] == '\r') - { got_cr = 1; - s++; - continue; - } - if (got_cr) - { if (s[0] != '\n') - *t++ = '\n'; - got_cr = 0; - } - *t++ = *s++; - } - while (t > c && isspace(*--t)); - t[1] = 0; - } - - if ((oldval = (unsigned char*)getenv((const char*)buf))) - { newval = (unsigned char*)rfx_alloc(strlen((const char*)oldval) + strlen((const char *)buf) + strlen((const char*)&c[1]) + 3); - if (!newval) return; - - c[0] = '='; - sprintf((char*)newval, "%s#%s", buf, oldval); - c[0] = 0; - - oldval -= strlen((const char*)buf) + 1; // skip past VAR= - } - else - { c[0] = '='; - newval = buf; - } - - putenv((char *)newval); - - if (oldval) - { rfx_free(oldval); - rfx_free(buf); - } -} - -static void swf_scanquery(char * q) -{ char *next = q; - if (!q) return; - - while (next) - { next = strchr(q, '&'); - if (next) next[0] = 0; - swf_cgienv((unsigned char*)q); - if (next) - { next[0] = '&'; - q = next+1; - } - } -} - -char * swf_postread() -{ char * buf = NULL; - int size = 0, sofar = 0, got; - - buf = getenv("CONTENT_TYPE"); - if ((!buf) || strcmp(buf, "application/x-www-form-urlencoded")) return NULL; - - buf = getenv("CONTENT_LENGTH"); - if (!buf) return NULL; - - size = atoi(buf); - buf = (char*)rfx_alloc(size + 1); - if (buf) - { do - { got = fread(buf + sofar, 1, size - sofar, stdin); - sofar += got; - } while (got && sofar < size); - buf[sofar] = 0; - } - - return buf; -} - -void swf_uncgi() -{ char *query, *dupquery, *method; - - query = getenv("QUERY_STRING"); - if ((query) && strlen(query)) - { dupquery = strdup(query); - swf_scanquery(dupquery); - rfx_free(dupquery); - } - - method = getenv("REQUEST_METHOD"); - if ((method) && ! strcmp(method, "POST")) - { query = swf_postread(); - if ((query)&&(query[0]!=0)) swf_scanquery(query); - rfx_free(query); - } - -} - -#undef ishex -#undef PREFIX diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdraw.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdraw.c deleted file mode 100644 index ba601a3c4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdraw.c +++ /dev/null @@ -1,221 +0,0 @@ -// swfdraw.c - -#include "../rfxswf.h" - -typedef struct _SWFSHAPEDRAWER -{ - SHAPE*shape; - TAG*tag; - int tagfree; - SCOORD firstx; - SCOORD firsty; - SCOORD lastx; - SCOORD lasty; - SRECT bbox; - char isfinished; -} SWFSHAPEDRAWER; - -static void swf_ShapeDrawerSetLineStyle(drawer_t*draw, void*style); -static void swf_ShapeDrawerSetFillStyle(drawer_t*draw, void*style); -static void swf_ShapeDrawerMoveTo(drawer_t*draw, FPOINT * to); -static void swf_ShapeDrawerLineTo(drawer_t*draw, FPOINT * to); -static void swf_ShapeDrawerSplineTo(drawer_t*draw, FPOINT * c1, FPOINT* to); -static void swf_ShapeDrawerFinish(drawer_t*draw); -static void swf_ShapeDrawerClear(drawer_t*draw); - -static void swf_ShapeDrawerInit(drawer_t*draw, TAG*tag, int fillstylebits, int linestylebits) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)rfx_calloc(sizeof(SWFSHAPEDRAWER)); - draw->internal = sdraw; - - draw->setLineStyle = swf_ShapeDrawerSetLineStyle; - draw->setFillStyle = swf_ShapeDrawerSetFillStyle; - draw->moveTo = swf_ShapeDrawerMoveTo; - draw->lineTo = swf_ShapeDrawerLineTo; - draw->splineTo = swf_ShapeDrawerSplineTo; - draw->finish = swf_ShapeDrawerFinish; - draw->dealloc = swf_ShapeDrawerClear; - - sdraw->tagfree = 0; - if(tag == 0) { - tag = swf_InsertTag(0, ST_DEFINESHAPE); - sdraw->tagfree = 1; - } - sdraw->tag = tag; - swf_ShapeNew(&sdraw->shape); - draw->pos.x = 0; - draw->pos.y = 0; - - swf_SetU8(sdraw->tag,0); - sdraw->shape->bits.fill = fillstylebits; - sdraw->shape->bits.line = linestylebits; - - sdraw->bbox.xmin = sdraw->bbox.ymin = SCOORD_MAX; - sdraw->bbox.xmax = sdraw->bbox.ymax = SCOORD_MIN; - - sdraw->isfinished = 0; - - swf_ShapeSetStyle(sdraw->tag,sdraw->shape,linestylebits?1:0,fillstylebits?1:0,0/*?*/); -} - -void swf_Shape10DrawerInit(drawer_t*draw, TAG*tag) -{ - swf_ShapeDrawerInit(draw, tag, 0, 1); -} - -void swf_Shape01DrawerInit(drawer_t*draw, TAG*tag) -{ - swf_ShapeDrawerInit(draw, tag, 1, 0); -} - -void swf_Shape11DrawerInit(drawer_t*draw, TAG*tag) -{ - swf_ShapeDrawerInit(draw, tag, 1, 1); -} - -static void swf_ShapeDrawerSetLineStyle(drawer_t*draw, void*style) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; -} -static void swf_ShapeDrawerSetFillStyle(drawer_t*draw, void*style) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; -} -static void fixEndPoint(drawer_t*draw) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; - if( sdraw->firstx != sdraw->lastx - || sdraw->firsty != sdraw->lasty) { - /* fix non-closing shapes */ - FPOINT to; - to.x = sdraw->firstx/20.0; - to.y = sdraw->firsty/20.0; - if(sdraw->shape->bits.fill) // do this only if the shape is filled - draw->lineTo(draw, &to); - } -} -static void swf_ShapeDrawerMoveTo(drawer_t*draw, FPOINT * to) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; - int x = floor(to->x*20); - int y = floor(to->y*20); - - /* Flash will ignore a moveto (0,0) in glyphs. Hence, we map - all (0,0)s to (0.05,0)s in moveto,lineto and splineto. */ - - if(!x&&!y) - x++; - - /* we need to write moveto always- it - might be that it signals the end of a polygon, otherwise - we would end up connecting two polygons which should - be seperate - TODO: check if the last operation was a moveTo- if - yes we *can* skip it. - */ - - //if(sdraw->lastx != x || sdraw->lasty != y) { - fixEndPoint(draw); - swf_ShapeSetMove(sdraw->tag,sdraw->shape,x,y); - sdraw->firstx = sdraw->lastx = x; - sdraw->firsty = sdraw->lasty = y; - draw->pos = *to; - //} -} -static void swf_ShapeDrawerLineTo(drawer_t*draw, FPOINT * to) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; - int x = floor(to->x*20); - int y = floor(to->y*20); - if(!x&&!y) - x++; - if(sdraw->lastx < sdraw->bbox.xmin) sdraw->bbox.xmin = sdraw->lastx; - if(sdraw->lasty < sdraw->bbox.ymin) sdraw->bbox.ymin = sdraw->lasty; - if(sdraw->lastx > sdraw->bbox.xmax) sdraw->bbox.xmax = sdraw->lastx; - if(sdraw->lasty > sdraw->bbox.ymax) sdraw->bbox.ymax = sdraw->lasty; - if(x < sdraw->bbox.xmin) sdraw->bbox.xmin = x; - if(y < sdraw->bbox.ymin) sdraw->bbox.ymin = y; - if(x > sdraw->bbox.xmax) sdraw->bbox.xmax = x; - if(y > sdraw->bbox.ymax) sdraw->bbox.ymax = y; - swf_ShapeSetLine(sdraw->tag,sdraw->shape,x-sdraw->lastx,y-sdraw->lasty); - sdraw->lastx = x; - sdraw->lasty = y; - draw->pos = *to; -} -static void swf_ShapeDrawerSplineTo(drawer_t*draw, FPOINT * c1, FPOINT* to) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; - int tx = floor(c1->x*20); - int ty = floor(c1->y*20); - int x = floor(to->x*20); - int y = floor(to->y*20); - if(!x&&!y) - x++; - if(sdraw->lastx < sdraw->bbox.xmin) sdraw->bbox.xmin = sdraw->lastx; - if(sdraw->lasty < sdraw->bbox.ymin) sdraw->bbox.ymin = sdraw->lasty; - if(sdraw->lastx > sdraw->bbox.xmax) sdraw->bbox.xmax = sdraw->lastx; - if(sdraw->lasty > sdraw->bbox.ymax) sdraw->bbox.ymax = sdraw->lasty; - if(x < sdraw->bbox.xmin) sdraw->bbox.xmin = x; - if(y < sdraw->bbox.ymin) sdraw->bbox.ymin = y; - if(x > sdraw->bbox.xmax) sdraw->bbox.xmax = x; - if(y > sdraw->bbox.ymax) sdraw->bbox.ymax = y; - if(tx < sdraw->bbox.xmin) sdraw->bbox.xmin = tx; - if(ty < sdraw->bbox.ymin) sdraw->bbox.ymin = ty; - if(tx > sdraw->bbox.xmax) sdraw->bbox.xmax = tx; - if(ty > sdraw->bbox.ymax) sdraw->bbox.ymax = ty; - swf_ShapeSetCurve(sdraw->tag,sdraw->shape, tx-sdraw->lastx,ty-sdraw->lasty, x-tx,y-ty); - sdraw->lastx = x; - sdraw->lasty = y; - draw->pos = *to; -} -static void swf_ShapeDrawerFinish(drawer_t*draw) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; - if(sdraw->isfinished) - return; - - fixEndPoint(draw); - - if(sdraw->bbox.xmin == SCOORD_MAX) { - /* no points at all -> empty bounding box */ - sdraw->bbox.xmin = sdraw->bbox.ymin = - sdraw->bbox.xmax = sdraw->bbox.ymax = 0; - } - sdraw->isfinished = 1; - swf_ShapeSetEnd(sdraw->tag); -} - -static void swf_ShapeDrawerClear(drawer_t*draw) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; - if(sdraw->tagfree) { - swf_DeleteTag(0, sdraw->tag); - sdraw->tag = 0; - } - swf_ShapeFree(sdraw->shape); - sdraw->shape = 0; - - rfx_free(draw->internal); - draw->internal = 0; -} - -SRECT swf_ShapeDrawerGetBBox(drawer_t*draw) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; - return sdraw->bbox; -} - -SHAPE* swf_ShapeDrawerToShape(drawer_t*draw) -{ - SWFSHAPEDRAWER*sdraw = (SWFSHAPEDRAWER*)draw->internal; - SHAPE* shape = (SHAPE*)rfx_alloc(sizeof(SHAPE)); - if(!sdraw->isfinished) { - fprintf(stderr, "Warning: you should Finish() your drawer before calling DrawerToShape"); - swf_ShapeDrawerFinish(draw); - } - memcpy(shape, sdraw->shape, sizeof(SHAPE)); - shape->bitlen = (sdraw->tag->len-1)*8; - shape->data = (U8*)rfx_alloc(sdraw->tag->len-1); - memcpy(shape->data, &sdraw->tag->data[1], sdraw->tag->len-1); - return shape; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdump.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdump.c deleted file mode 100644 index 92cce4f58..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfdump.c +++ /dev/null @@ -1,275 +0,0 @@ -/* swfdump.c - - Dump / debug functions - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "../rfxswf.h" - -void swf_DumpHeader(FILE * f,SWF * swf) -{ if (!f) f = stderr; - fprintf(f,"File size\t%u\n",swf->fileSize); - fprintf(f,"Movie width\t%u\n",(swf->movieSize.xmax - swf->movieSize.xmin)/20); - fprintf(f,"Movie height\t%u\n",(swf->movieSize.ymax - swf->movieSize.ymin)/20); - fprintf(f,"Frame rate\t%u.%u\n",swf->frameRate>>8,swf->frameRate&0xff); - fprintf(f,"Frame count\t%u\n",swf->frameCount); -} - -void swf_DumpMatrix(FILE * f,MATRIX * m) -{ if (!f) f = stderr; - /*fprintf(f,"[%08x][%08x]\n",m->sx,m->r1); - fprintf(f,"[%08x][%08x]\n",m->r0,m->sy); - fprintf(f," %08x, %08x\n",m->tx,m->ty);*/ - fprintf(f,"[%08x][%08x] %5.2f %5.2f %5.2f\n",m->sx,m->r1, m->sx/65536.0,m->r1/65536.0, m->tx/20.0); - fprintf(f,"[%08x][%08x] %5.2f %5.2f %5.2f\n",m->r0,m->sy, m->r0/65536.0,m->sy/65536.0, m->ty/20.0 ); - fprintf(f," %08x, %08x \n",m->tx,m->ty); -} - -void swf_DumpGradient(FILE * f,GRADIENT * g) -{ if (!f) f = stderr; - fprintf(f, "%d gradient steps\n", g->num); - int t; - for(t=0;tnum;t++) { - RGBA c = g->rgba[t]; - fprintf(f, "%d) %02x%02x%02x%02x at %d\n", t, c.r,c.g,c.b,c.a, g->ratios[t]); - } -} - -void swf_DumpTag(FILE * f,TAG * t) -{ int i; - if (!f) f = stderr; - for (i=0;ilen;i++) - { if (!(i&15)) fprintf(f,"\n"); - fprintf(f,"%02x ",t->data[i]); - } - fprintf(f,"\n"); -} - -void swf_DumpSWF(FILE * f, SWF*swf) -{ - TAG* tag = swf->firstTag; - fprintf(f, "vvvvvvvvvvvvvvvvvvvvv\n"); - while(tag) { - printf("%8d %s\n", tag->len, swf_TagGetName(tag)); - tag = tag->next; - } - fprintf(f, "^^^^^^^^^^^^^^^^^^^^^\n"); -} - -void swf_DumpFont(SWFFONT * font) -{ - printf("ID: %d\n", font->id); - printf("Version: %d\n", font->version); - printf("name: %s\n", font->name); - printf("characters: %d\n", font->numchars); - printf("biggest mapped ascii value: %d\n", font->maxascii); - printf("layout: %s\n", font->layout?"yes":"no"); - if(font->layout) - { - printf(" ascent:%d\n", font->layout->ascent); - printf(" descent:%d\n", font->layout->descent); - printf(" leading:%d\n", font->layout->leading); - printf(" bounds: (not shown)\n"); - printf(" kerning records:%d\n", font->layout->kerningcount); - printf(" kerning records: (not shown)\n"); - } - printf("style: %d\n", font->style); - printf("encoding: %d\n", font->encoding); - printf("language: %d\n", font->language); -} - -void swf_DumpShape(SHAPE2*shape2) -{ - SHAPELINE*l = shape2->lines; - while(l) { - if(l->type == moveTo) { - //printf("fill %d/%d line %d\n", l->fillstyle0, l->fillstyle1, l->linestyle); - printf("moveTo %.2f,%.2f (fill0:%d fill1:%d line:%d)\n", l->x/20.0, l->y/20.0, l->fillstyle0, l->fillstyle1, l->linestyle); - } - if(l->type == lineTo) { - //printf("fill %d/%d line %d\n", l->fillstyle0, l->fillstyle1, l->linestyle); - printf("lineTo %.2f,%.2f (fill0:%d fill1:%d line:%d)\n", l->x/20.0, l->y/20.0, l->fillstyle0, l->fillstyle1, l->linestyle); - } - if(l->type == splineTo) { - //printf("fill %d/%d line %d\n", l->fillstyle0, l->fillstyle1, l->linestyle); - printf("splineTo %.2f,%.2f %.2f,%.2f (fill0:%d fill1:%d line:%d)\n", l->sx/20.0, l->sy/20.0, l->x/20.0, l->y/20.0, l->fillstyle0, l->fillstyle1, l->linestyle); - } - l = l->next; - } -} - -char* swf_TagGetName(TAG*tag) -{ - switch(tag->id) - { - case ST_END: - return "END"; - case ST_SHOWFRAME: - return "SHOWFRAME"; - case ST_DEFINESHAPE: - return "DEFINESHAPE"; - case ST_FREECHARACTER: - return "FREECHARACTER"; - case ST_PLACEOBJECT: - return "PLACEOBJECT"; - case ST_REMOVEOBJECT: - return "REMOVEOBJECT"; - case ST_DEFINEBITSJPEG: - return "DEFINEBITSJPEG"; - case ST_DEFINEBUTTON: - return "DEFINEBUTTON"; - case ST_JPEGTABLES: - return "JPEGTABLES"; - case ST_SETBACKGROUNDCOLOR: - return "SETBACKGROUNDCOLOR"; - case ST_DEFINEFONT: - return "DEFINEFONT"; - case ST_DEFINETEXT: - return "DEFINETEXT"; - case ST_DEFINEEDITTEXT: - return "DEFINEEDITTEXT"; - case ST_DOACTION: - return "DOACTION"; - case ST_DOABC: - return "DOABC"; - case ST_RAWABC: - return "RAWABC"; - case ST_DEFINEFONTINFO: - return "DEFINEFONTINFO"; - case ST_DEFINESOUND: - return "DEFINESOUND"; - case ST_STARTSOUND: - return "STARTSOUND"; - case ST_DEFINEBUTTONSOUND: - return "DEFINEBUTTONSOUND"; - case ST_SOUNDSTREAMHEAD: - return "SOUNDSTREAMHEAD"; - case ST_SOUNDSTREAMBLOCK: - return "SOUNDSTREAMBLOCK"; - case ST_DEFINEBITSLOSSLESS: - return "DEFINEBITSLOSSLESS"; - case ST_DEFINEBITSJPEG2: - return "DEFINEBITSJPEG2"; - case ST_DEFINESHAPE2: - return "DEFINESHAPE2"; - case ST_DEFINEBUTTONCXFORM: - return "DEFINEBUTTONCXFORM"; - case ST_PROTECT: - return "PROTECT"; - case ST_PLACEOBJECT2: - return "PLACEOBJECT2"; - case ST_REMOVEOBJECT2: - return "REMOVEOBJECT2"; - case ST_DEFINESHAPE3: - return "DEFINESHAPE3"; - case ST_DEFINETEXT2: - return "DEFINETEXT2"; - case ST_DEFINEBUTTON2: - return "DEFINEBUTTON2"; - case ST_DEFINEBITSJPEG3: - return "DEFINEBITSJPEG3"; - case ST_DEFINEBITSLOSSLESS2: - return "DEFINEBITSLOSSLESS2"; - case ST_DEFINESPRITE: - return "DEFINESPRITE"; - case ST_NAMECHARACTER: - return "NAMECHARACTER"; - case ST_SERIALNUMBER: - return "SERIALNUMBER"; - case ST_GENERATORTEXT: - return "GENERATORTEXT"; - case ST_FRAMELABEL: - return "FRAMELABEL"; - case ST_SOUNDSTREAMHEAD2: - return "SOUNDSTREAMHEAD2"; - case ST_DEFINEMORPHSHAPE: - return "DEFINEMORPHSHAPE"; - case ST_DEFINEMORPHSHAPE2: - return "DEFINEMORPHSHAPE2"; - case ST_DEFINEFONT2: - return "DEFINEFONT2"; - case ST_TEMPLATECOMMAND: - return "TEMPLATECOMMAND"; - case ST_GENERATOR3: - return "GENERATOR3"; - case ST_EXTERNALFONT: - return "EXTERNALFONT"; - case ST_EXPORTASSETS: - return "EXPORTASSETS"; - case ST_SYMBOLCLASS: - return "SYMBOLCLASS"; - case ST_DEFINEBINARY: - return "DEFINEBINARY"; - case ST_IMPORTASSETS: - return "IMPORTASSETS"; - case ST_ENABLEDEBUGGER: - return "ENABLEDEBUGGER"; - case ST_DOINITACTION: - return "DOINITACTION"; - case ST_DEFINEMOVIE: - return "DEFINEMOVIE"; - case ST_DEFINEVIDEOSTREAM: - return "DEFINEVIDEOSTREAM"; - case ST_VIDEOFRAME: - return "VIDEOFRAME"; - case ST_DEFINEFONTINFO2: - return "DEFINEFONTINFO2"; - case ST_FILEATTRIBUTES: - return "FILEATTRIBUTES"; - case ST_IMPORTASSETS2: - return "IMPORTASSETS2"; - case ST_DEFINESCALINGGRID: - return "DEFINESCALINGGRID"; - case ST_DEFINESHAPE4: - return "DEFINESHAPE4"; - case ST_DEFINEFONT3: - return "DEFINEFONT3"; - case ST_DEFINEFONTALIGNZONES: - return "DEFINEFONTALIGNZONES"; - case ST_DEFINEFONTNAME: - return "DEFINEFONTNAME"; - case ST_CSMTEXTSETTINGS: - return "CSMTEXTSETTINGS"; - case ST_FREEALL: - return "FREEALL"; - case ST_MX4: - return "MX4"; - case ST_SCRIPTLIMITS: - return "SCRIPTLIMITS"; - case ST_SETTABINDEX: - return "SETTABINDEX"; - case ST_ENABLEDEBUGGER2: - return "ENABLEDEBUGGER2"; - case ST_PLACEOBJECT3: - return "PLACEOBJECT3"; - case ST_METADATA: - return "METADATA"; - case ST_SCENEDESCRIPTION: - return "SCENEDESCRIPTION"; - - case ST_REFLEX: - return "REFLEX"; - case ST_GLYPHNAMES: - return "GLYPHNAMES"; - } - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swffilter.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swffilter.c deleted file mode 100644 index 02ef5dbdc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swffilter.c +++ /dev/null @@ -1,170 +0,0 @@ -#include -#include -#include "../rfxswf.h" - -char* filtername[] = {"dropshadow","blur","glow","bevel","gradientglow","convolution","colormatrix","gradientbevel", 0}; - -void swf_SetFilter(TAG*tag, FILTER*filter) -{ - swf_SetU8(tag, filter->type); - if(filter->type == FILTERTYPE_BLUR) { - FILTER_BLUR*f = (FILTER_BLUR*)filter; - swf_SetFixed(tag, f->blurx); - swf_SetFixed(tag, f->blury); - U8 flags = f->passes << 3; - swf_SetU8(tag, flags); - } else if(filter->type == FILTERTYPE_GLOW) { - FILTER_GLOW*f = (FILTER_GLOW*)filter; - } else if(filter->type == FILTERTYPE_DROPSHADOW) { - FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)filter; - swf_SetRGBA(tag, &f->color); - swf_SetFixed(tag, f->blurx); - swf_SetFixed(tag, f->blury); - swf_SetFixed(tag, f->angle); - swf_SetFixed(tag, f->distance); - swf_SetFixed8(tag, f->strength); - U8 flags = f->innershadow<<7|f->knockout<<6|f->composite<<5|f->passes; - swf_SetU8(tag, flags); - } else if(filter->type == FILTERTYPE_GRADIENTGLOW) { - FILTER_GRADIENTGLOW*f = (FILTER_GRADIENTGLOW*)filter; - swf_SetU8(tag, f->gradient->num); - int s; - for(s=0;sgradient->num;s++) - swf_SetRGBA(tag, &f->gradient->rgba[s]); - for(s=0;sgradient->num;s++) - swf_SetU8(tag, f->gradient->ratios[s]); - - swf_SetFixed(tag, f->blurx); - swf_SetFixed(tag, f->blury); - swf_SetFixed(tag, f->angle); - swf_SetFixed(tag, f->distance); - swf_SetFixed8(tag, f->strength); - U8 flags = f->passes|f->innershadow<<7|f->knockout<<6|f->composite<<5|f->ontop<<4; - swf_SetU8(tag, flags); - } else if(filter->type == FILTERTYPE_BEVEL) { - FILTER_BEVEL*f = (FILTER_BEVEL*)filter; - swf_SetRGBA(tag, &f->shadow); - swf_SetRGBA(tag, &f->highlight); - swf_SetFixed(tag, f->blurx); - swf_SetFixed(tag, f->blury); - swf_SetFixed(tag, f->angle); - swf_SetFixed(tag, f->distance); - swf_SetFixed8(tag, f->strength); - U8 flags = f->passes|f->innershadow<<7|f->knockout<<6|f->composite<<5|f->ontop<<4; - swf_SetU8(tag, flags); - } else { - fprintf(stderr, "Writing of filter type %02x not supported yet\n", filter->type); - } -} - -FILTER*swf_GetFilter(TAG*tag) -{ - U8 type = swf_GetU8(tag); - FILTER*filter; - if(type == FILTERTYPE_BLUR) { - FILTER_BLUR* f = (FILTER_BLUR*)rfx_calloc(sizeof(FILTER_BLUR)); - f->type = type; - f->blurx = swf_GetFixed(tag); - f->blury = swf_GetFixed(tag); - U8 flags = swf_GetU8(tag); - f->passes = (flags&15)<<3; - return (FILTER*)f; - } else if(type == FILTERTYPE_GLOW) { - FILTER_GLOW* f = (FILTER_GLOW*)rfx_calloc(sizeof(FILTER_GLOW)); - f->type = type; - swf_GetRGBA(tag, &f->rgba); - f->blurx = swf_GetFixed(tag); - f->blury = swf_GetFixed(tag); - f->strength = swf_GetFixed8(tag); - U8 flags = swf_GetU8(tag); - f->passes = flags&31; - f->innerglow = (flags>>7)&1; - f->knockout = (flags>>6)&1; - f->composite = (flags>>5)&1; - return (FILTER*)f; - } else if(type == FILTERTYPE_GRADIENTGLOW) { - FILTER_GRADIENTGLOW* f = (FILTER_GRADIENTGLOW*)rfx_calloc(sizeof(FILTER_GRADIENTGLOW)); - f->type = type; - f->gradient = (GRADIENT*)rfx_calloc(sizeof(GRADIENT)); - f->gradient->num = swf_GetU8(tag); - f->gradient->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*f->gradient->num); - f->gradient->ratios = (U8*)rfx_calloc(sizeof(U8)*f->gradient->num); - int s; - for(s=0;sgradient->num;s++) - swf_GetRGBA(tag, &f->gradient->rgba[s]); - for(s=0;sgradient->num;s++) - f->gradient->ratios[s] = swf_GetU8(tag); - - f->blurx = swf_GetFixed(tag); - f->blury = swf_GetFixed(tag); - f->angle = swf_GetFixed(tag); - f->distance = swf_GetFixed(tag); - f->strength = swf_GetFixed8(tag); - U8 flags = swf_GetU8(tag); - f->passes = flags&15; - f->innershadow = (flags>>7)&1; - f->knockout = (flags>>6)&1; - f->composite = (flags>>5)&1; - f->ontop = (flags>>4)&1; - return (FILTER*)f; - } else if(type == FILTERTYPE_DROPSHADOW) { - FILTER_DROPSHADOW* f = (FILTER_DROPSHADOW*)rfx_calloc(sizeof(FILTER_DROPSHADOW)); - f->type = type; - swf_GetRGBA(tag, &f->color); - f->blurx = swf_GetFixed(tag); - f->blury = swf_GetFixed(tag); - f->angle = swf_GetFixed(tag); - f->distance = swf_GetFixed(tag); - f->strength = swf_GetFixed8(tag); - U8 flags = swf_GetU8(tag); - f->passes = flags&31; - f->innershadow = (flags>>7)&1; - f->knockout = (flags>>6)&1; - f->composite = (flags>>5)&1; - return (FILTER*)f; - } else if(type == FILTERTYPE_BEVEL) { - FILTER_BEVEL* f = (FILTER_BEVEL*)rfx_calloc(sizeof(FILTER_BEVEL)); - f->type = type; - swf_GetRGBA(tag, &f->shadow); - swf_GetRGBA(tag, &f->highlight); - f->blurx = swf_GetFixed(tag); - f->blury = swf_GetFixed(tag); - f->angle = swf_GetFixed(tag); - f->distance = swf_GetFixed(tag); - f->strength = swf_GetFixed8(tag); - U8 flags = swf_GetU8(tag); - f->passes = flags&15; - f->innershadow = (flags>>7)&1; - f->knockout = (flags>>6)&1; - f->composite = (flags>>5)&1; - f->ontop = (flags>>4)&1; - return (FILTER*)f; - } else { - fprintf(stderr, "Reading of filter type %02x not supported yet\n", type); - } - return 0; -} - -FILTER*swf_NewFilter(U8 type) -{ - FILTER*f = 0; - if(type == FILTERTYPE_BLUR) - f = (FILTER*)rfx_calloc(sizeof(FILTER_BLUR)); - else if(type == FILTERTYPE_GRADIENTGLOW) - f = (FILTER*)rfx_calloc(sizeof(FILTER_GRADIENTGLOW)); - else if(type == FILTERTYPE_DROPSHADOW) - f = (FILTER*)rfx_calloc(sizeof(FILTER_DROPSHADOW)); - else if(type == FILTERTYPE_BEVEL) - f = (FILTER*)rfx_calloc(sizeof(FILTER_BEVEL)); - else - fprintf(stderr, "Creation of filter type %02x not supported yet\n", type); - if(f) - f->type = type; - return f; -} - -void swf_DeleteFilter(FILTER*f) -{ - //FIXME - free(f); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swffont.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swffont.c deleted file mode 100644 index 986c07d72..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swffont.c +++ /dev/null @@ -1,605 +0,0 @@ -/* swffont.c - - Functions for loading external fonts. - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2003, 2004 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "../rfxswf.h" - -static int loadfont_scale = 4; -static int skip_unused = 1; -static int full_unicode = 0; - -void swf_SetLoadFontParameters(int _scale, int _skip_unused, int _full_unicode) -{ - if(_scale) loadfont_scale = _scale; - skip_unused = _skip_unused; - full_unicode = _full_unicode; -} - -#ifdef HAVE_FREETYPE - -#ifdef HAVE_FT2BUILD_H -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H -#include FT_SIZES_H -#include FT_SFNT_NAMES_H -#include FT_TRUETYPE_IDS_H -#include FT_OUTLINE_H -#else -#include -#include -#include -#include -#include -#include -#endif - -/* Setting subpixels to 64 also means that the "point size" of the - font outlines will be 64. So the font, when rendered at original - size (i.e., the swf fontsize is 1024) will have the same size as - if it was rendered at 64pt */ - -#define FT_SCALE 1 -#define FT_SUBPIXELS 64 - -static int ft_move_to(const FT_Vector* _to, void* user) -{ - drawer_t* draw = (drawer_t*)user; - FPOINT to; - to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; - to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - draw->moveTo(draw, &to); - return 0; -} -static int ft_line_to(const FT_Vector* _to, void* user) -{ - drawer_t* draw = (drawer_t*)user; - FPOINT to; - to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; - to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - draw->lineTo(draw, &to); - return 0; -} -static int ft_conic_to(const FT_Vector* _c, const FT_Vector* _to, void* user) -{ - drawer_t* draw = (drawer_t*)user; - FPOINT c,to; - to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; - to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - c.x = _c->x*FT_SCALE/(float)FT_SUBPIXELS; - c.y = -_c->y*FT_SCALE/(float)FT_SUBPIXELS; - draw_conicTo(draw, &c, &to); - return 0; -} -static int ft_cubic_to(const FT_Vector* _c1, const FT_Vector* _c2, const FT_Vector* _to, void* user) -{ - drawer_t* draw = (drawer_t*)user; - FPOINT c1,c2,to; - to.x = _to->x*FT_SCALE/(float)FT_SUBPIXELS; - to.y = -_to->y*FT_SCALE/(float)FT_SUBPIXELS; - c1.x = _c1->x*FT_SCALE/(float)FT_SUBPIXELS; - c1.y = -_c1->y*FT_SCALE/(float)FT_SUBPIXELS; - c2.x = _c2->x*FT_SCALE/(float)FT_SUBPIXELS; - c2.y = -_c2->y*FT_SCALE/(float)FT_SUBPIXELS; - draw_cubicTo(draw, &c1, &c2, &to); - return 0; -} -static FT_Outline_Funcs outline_functions = -{ - ft_move_to, - ft_line_to, - ft_conic_to, - ft_cubic_to, - 0,0 -}; - -static FT_Library ftlibrary = 0; - -SWFFONT* swf_LoadTrueTypeFont(const char*filename, char flashtype) -{ - FT_Face face; - FT_Error error; - const char* name = 0; - FT_ULong charcode; - FT_UInt gindex; - SWFFONT* font; - int t; - int*glyph2glyph; - int max_unicode = 0; - int charmap = -1; - - if(ftlibrary == 0) { - if(FT_Init_FreeType(&ftlibrary)) { - fprintf(stderr, "Couldn't init freetype library!\n"); - exit(1); - } - } - error = FT_New_Face(ftlibrary, filename, 0, &face); - - if(error || !face) { - fprintf(stderr, "Couldn't load file %s- not a TTF file?\n", filename); - return 0; - } - - int scale = flashtype?20:1; - FT_Set_Pixel_Sizes (face, 16*loadfont_scale*scale, 16*loadfont_scale*scale); - - if(face->num_glyphs <= 0) { - fprintf(stderr, "File %s contains %d glyphs\n", filename, (int)face->num_glyphs); - return 0; - } - - font = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); - font->id = -1; - font->version = flashtype?3:2; - - font->layout = (SWFLAYOUT*)rfx_calloc(sizeof(SWFLAYOUT)); - font->layout->bounds = (SRECT*)rfx_calloc(face->num_glyphs*sizeof(SRECT)); - font->style = ((face->style_flags&FT_STYLE_FLAG_ITALIC)?FONT_STYLE_ITALIC:0) - |((face->style_flags&FT_STYLE_FLAG_BOLD)?FONT_STYLE_BOLD:0); - font->encoding = FONT_ENCODING_UNICODE; - font->glyph2ascii = (U16*)rfx_calloc(face->num_glyphs*sizeof(U16)); - font->maxascii = 0; - font->glyph = (SWFGLYPH*)rfx_calloc(face->num_glyphs*sizeof(SWFGLYPH)); - if(FT_HAS_GLYPH_NAMES(face)) { - font->glyphnames = (char**)rfx_calloc(face->num_glyphs*sizeof(char*)); - } - - font->layout->kerningcount = 0; - - name = face->family_name; - if(!(name && *name)) - name = FT_Get_Postscript_Name(face); - if(name && *name) - font->name = (U8*)strdup(name); - - while(1) - { - /* // Map Glyphs to Unicode, version 1 (quick and dirty): - int t; - for(t=0;t<65536;t++) { - int index = FT_Get_Char_Index(face, t); - if(index>=0 && indexnum_glyphs) { - if(font->glyph2ascii[index]<0) - font->glyph2ascii[index] = t; - } - }*/ - - // Map Glyphs to Unicode, version 2 (much nicer): - // (The third way would be the AGL algorithm, as proposed - // by Werner Lemberg on freetype@freetype.org) - - charcode = FT_Get_First_Char(face, &gindex); - while(gindex != 0) - { - if(gindex >= 0 && gindexnum_glyphs) { - if(!font->glyph2ascii[gindex]) { - font->glyph2ascii[gindex] = charcode; - if(charcode + 1 > font->maxascii) { - font->maxascii = charcode + 1; - } - } - } - charcode = FT_Get_Next_Char(face, charcode, &gindex); - } - - /* if we didn't find a single encoding character, try - the font's charmaps instead. That usually means that - the encoding is no longer unicode. - TODO: find a way to convert the encoding to unicode - */ - if(font->maxascii == 0 && charmap < face->num_charmaps - 1) { - charmap++; - FT_Set_Charmap(face, face->charmaps[charmap]); - font->encoding = 0;//anything but unicode FIXME - } else - break; - } - - if(full_unicode) - font->maxascii = 65535; - - font->ascii2glyph = (int*)rfx_calloc(font->maxascii*sizeof(int)); - - for(t=0;tmaxascii;t++) { - int g = FT_Get_Char_Index(face, t); - if(!g || g>=face->num_glyphs) - g = -1; - font->ascii2glyph[t] = g; - if(g>=0) { - max_unicode = t+1; - if(!font->glyph2ascii[g]) { - font->glyph2ascii[g] = t; - } - } - } - font->maxascii = max_unicode; - - font->numchars = 0; - - glyph2glyph = (int*)rfx_calloc(face->num_glyphs*sizeof(int)); - - SRECT fontbbox = {0,0,0,0}; - - for(t=0; t < face->num_glyphs; t++) { - FT_Glyph glyph; - FT_BBox bbox; - char name[128]; - drawer_t draw; - char hasname = 0; - name[0]=0; - if(FT_HAS_GLYPH_NAMES(face)) { - error = FT_Get_Glyph_Name(face, t, name, 127); - if(!error && name[0] && !strstr(name, "notdef")) { - font->glyphnames[font->numchars] = strdup(name); - hasname = 1; - } - } - if(!font->glyph2ascii[t] && !hasname && skip_unused) { - continue; - } - error = FT_Load_Glyph(face, t, FT_LOAD_NO_BITMAP); - if(error) { - //tends to happen with some pdfs - fprintf(stderr, "Warning: Glyph %d has return code %d\n", t, error); - glyph=0; - if(skip_unused) - continue; - } else { - error = FT_Get_Glyph(face->glyph, &glyph); - if(error) { - fprintf(stderr, "Couldn't get glyph %d, error:%d\n", t, error); - glyph=0; - if(skip_unused) - continue; - } - } - - if(glyph) - FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_unscaled, &bbox); - else - memset(&bbox, 0, sizeof(bbox)); - - bbox.yMin = -bbox.yMin; - bbox.yMax = -bbox.yMax; - if(bbox.xMax < bbox.xMin) { - // swap - bbox.xMax ^= bbox.xMin; - bbox.xMin ^= bbox.xMax; - bbox.xMax ^= bbox.xMin; - } - if(bbox.yMax < bbox.yMin) { - // swap - bbox.yMax ^= bbox.yMin; - bbox.yMin ^= bbox.yMax; - bbox.yMax ^= bbox.yMin; - } - - swf_Shape01DrawerInit(&draw, 0); - - //error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &draw); - if(glyph) - error = FT_Outline_Decompose(&face->glyph->outline, &outline_functions, &draw); - else - error = 0; - draw.finish(&draw); - - if(error) { - fprintf(stderr, "Couldn't decompose glyph %d\n", t); - draw.dealloc(&draw); - continue; - } - -#if 0 - if(bbox.xMin > 0) { - font->glyph[font->numchars].advance = (bbox.xMax*20*FT_SCALE)/FT_SUBPIXELS; - } else { - font->glyph[font->numchars].advance = ((bbox.xMax - bbox.xMin)*20*FT_SCALE)/FT_SUBPIXELS; - } -#else - if(glyph) - font->glyph[font->numchars].advance = glyph->advance.x*20/65536; - else - font->glyph[font->numchars].advance = 0; -#endif - - SRECT b = swf_ShapeDrawerGetBBox(&draw); - - //font->layout->bounds[font->numchars].xmin = (bbox.xMin*FT_SCALE*20)/FT_SUBPIXELS; - //font->layout->bounds[font->numchars].ymin = (bbox.yMin*FT_SCALE*20)/FT_SUBPIXELS; - //font->layout->bounds[font->numchars].xmax = (bbox.xMax*FT_SCALE*20)/FT_SUBPIXELS; - //font->layout->bounds[font->numchars].ymax = (bbox.yMax*FT_SCALE*20)/FT_SUBPIXELS; - - font->layout->bounds[font->numchars] = b; - font->glyph[font->numchars].shape = swf_ShapeDrawerToShape(&draw); - - swf_ExpandRect2(&fontbbox, &font->layout->bounds[font->numchars]); - - draw.dealloc(&draw); - - if(glyph) - FT_Done_Glyph(glyph); - font->glyph2ascii[font->numchars] = font->glyph2ascii[t]; - glyph2glyph[t] = font->numchars; - font->numchars++; - } - - //font->layout->ascent = abs(face->ascender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMin; - //font->layout->descent = abs(face->descender)*FT_SCALE*loadfont_scale*20/FT_SUBPIXELS/2; //face->bbox.xMax; - //font->layout->leading = font->layout->ascent + font->layout->descent; - - if(-fontbbox.ymin < 0) - font->layout->ascent = 0; - else - font->layout->ascent = -fontbbox.ymin; - - if(fontbbox.ymax < 0) - font->layout->descent = 0; - else - font->layout->descent = fontbbox.ymax; - - int leading = fontbbox.ymax - fontbbox.ymin; - font->layout->leading = leading>0x7fff?0x7fff:leading; - - /* notice: if skip_unused is true, font->glyph2ascii, font->glyphnames and font->layout->bounds will - have more memory allocated than just font->numchars, but only the first font->numchars - are used/valid */ - - for(t=0;tmaxascii;t++) { - if(font->ascii2glyph[t]>=0) { - font->ascii2glyph[t] = glyph2glyph[font->ascii2glyph[t]]; - } - } - rfx_free(glyph2glyph); - - FT_Done_Face(face); - FT_Done_FreeType(ftlibrary);ftlibrary=0; - - return font; -} -#else //HAVE_FREETYPE - -SWFFONT* swf_LoadTrueTypeFont(const char*filename, char flashtype) -{ - fprintf(stderr, "Warning: no freetype library- not able to load %s\n", filename); - return 0; -} - -#endif - -#ifdef HAVE_T1LIB - -#include - -static int t1lib_initialized = 0; - -static int counter = 0; - -SWFFONT* swf_LoadT1Font(const char*filename) -{ - SWFFONT * font; - int nr; - float angle,underline; - char*fontname,*fullname,*familyname; - BBox bbox; - int s,num; - char**charnames; - char**charname; - char*encoding[256]; - int c; - int t; - - if(!t1lib_initialized) { - T1_SetBitmapPad(16); - if ((T1_InitLib(NO_LOGFILE)==NULL)){ - fprintf(stderr, "Initialization of t1lib failed\n"); - return 0; - } - t1lib_initialized = 1; - } - nr = T1_AddFont(filename); - T1_LoadFont(nr); - - charnames = T1_GetAllCharNames(nr); - if(!charnames) { - fprintf(stderr, "No Charnames record- not a Type1 Font?\n"); - return 0; - } - - angle = T1_GetItalicAngle(nr); - fontname = T1_GetFontName(nr); - fullname = T1_GetFullName(nr); - familyname = T1_GetFamilyName(nr); - underline = T1_GetUnderlinePosition(nr); - bbox = T1_GetFontBBox(nr); - - font = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); - - font->version = 2; - if(fontname) - font->name = (U8*)strdup(fontname); - else - font->name = 0; - font->layout = (SWFLAYOUT*)rfx_calloc(sizeof(SWFLAYOUT)); - - num = 0; - charname = charnames; - while(*charname) { - charname++; - if(num<256) { - if(*charname) encoding[num] = strdup(*charname); - else encoding[num] = strdup(".notdef"); - } - num++; - } - for(t=num;t<256;t++) - encoding[t] = strdup(".notdef"); - - //T1_ReencodeFont(nr, encoding); - - font->maxascii = num; - font->numchars = num; - - font->style = (/*bold*/0?FONT_STYLE_BOLD:0) + (angle>0.05?FONT_STYLE_ITALIC:0); - - font->glyph = (SWFGLYPH*)rfx_calloc(num*sizeof(SWFGLYPH)); - font->glyph2ascii = (U16*)rfx_calloc(num*sizeof(U16)); - font->ascii2glyph = (int*)rfx_calloc(font->maxascii*sizeof(int)); - font->layout->ascent = (U16)(underline - bbox.lly); - font->layout->descent = (U16)(bbox.ury - underline); - font->layout->leading = (U16)(font->layout->ascent - - font->layout->descent - - (bbox.lly - bbox.ury)); - font->layout->bounds = (SRECT*)rfx_calloc(sizeof(SRECT)*num); - font->layout->kerningcount = 0; - font->layout->kerning = 0; - font->glyphnames = rfx_calloc(num*sizeof(char*)); - - num = 0; - - charname = charnames; - for(c=0;cnumchars;c++) { - drawer_t draw; - SRECT bbox; - T1_OUTLINE * outline; - FPOINT pos,last; - int firstx; - - outline = T1_GetCharOutline(nr, c, 100.0, 0); - firstx = outline->dest.x/0xffff; - - pos.x = 0; - pos.y = 0; - last = pos; - - font->glyphnames[c] = strdup(*charname); - - if(cmaxascii) - font->ascii2glyph[c] = c; - font->glyph2ascii[c] = c; - - swf_Shape01DrawerInit(&draw, 0); - - while(outline) { - pos.x += (outline->dest.x/(float)0xffff); - pos.y += (outline->dest.y/(float)0xffff); - - if(outline->type == T1_PATHTYPE_MOVE) { - draw.moveTo(&draw,&pos); - } else if(outline->type == T1_PATHTYPE_LINE) { - draw.lineTo(&draw,&pos); - } else if(outline->type == T1_PATHTYPE_BEZIER) { - T1_BEZIERSEGMENT*o2 = (T1_BEZIERSEGMENT*)outline; - FPOINT b,c; - b.x = o2->B.x/(float)0xffff+last.x; - b.y = o2->B.y/(float)0xffff+last.y; - c.x = o2->C.x/(float)0xffff+last.x; - c.y = o2->C.y/(float)0xffff+last.y; - draw_cubicTo(&draw,&b,&c,&pos); - } else { - fprintf(stderr, "loadT1Font: unknown outline type:%d\n", outline->type); - } - last = pos; - outline = outline->link; - } - - draw.finish(&draw); - - font->glyph[c].shape = swf_ShapeDrawerToShape(&draw); - bbox = swf_ShapeDrawerGetBBox(&draw); - draw.dealloc(&draw); - - font->layout->bounds[c] = bbox; - font->glyph[c].advance = bbox.xmax; - if(!font->glyph[c].advance) { - font->glyph[c].advance = firstx; - } - charname++; - } - T1_DeleteFont(nr); - - for(t=0;t<256;t++) - rfx_free(encoding[t]); - return font; -} - -#else - -SWFFONT* swf_LoadT1Font(const char*filename) -{ - fprintf(stderr, "Warning: no t1lib- not able to load %s\n", filename); - return 0; -} - -#endif - -SWFFONT* swf_DummyFont() -{ - SWFFONT*font = (SWFFONT*)rfx_calloc(sizeof(SWFFONT)); - return font; -} - -static int isSWF(const char*filename) -{ - FILE*fi = fopen(filename, "rb"); - char a[8]; - if(!fi) { - perror(filename); - return -1; - } - memset(a, 0, sizeof(a)); - fread(a, 4, 1, fi); - fclose(fi); - - if(!strncmp(a, "FWS", 3) || !strncmp(a, "CWS", 3)) { - return 1; - } - return 0; -} - -SWFFONT* swf_LoadFont(const char*filename, char flashtype) -{ - int is_swf; - if(filename == 0) - return swf_DummyFont(); - is_swf = isSWF(filename); - if(is_swf<0) - return 0; - if(is_swf) { - SWFFONT*font = swf_ReadFont(filename); - if(flashtype && font->version==2) - fprintf(stderr, "Warning: Can't load font v2 file as flashtype (%s)\n", filename); - return font; - } - -#if defined(HAVE_FREETYPE) - return swf_LoadTrueTypeFont(filename, flashtype); -#elif defined(HAVE_T1LIB) - return swf_LoadT1Font(filename); -#else - fprintf(stderr, "Error: Neither T1lib nor FreeType support compiled in. Could not load %s\n", filename); - return 0; -#endif -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfobject.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfobject.c deleted file mode 100644 index ab621e62e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfobject.c +++ /dev/null @@ -1,221 +0,0 @@ -/* swfobject.c - - Object place and move routines - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../rfxswf.h" - - -char*blendModeNames[] = {"normal","normal2","layer","multiply", - "screen","lighten", "darken","add", - "substract","difference","invert","alpha", - "erase","overlay","hardlight",0}; - -int isUnitMatrix(MATRIX* m) -{ - /* a matrix with all zeros is also considered - "unit matrix", as a zeroed out MATRIX structure - usually means that the caller doesn't want to - set the matrix */ - if(( (m->sx == 0x10000 && m->sy == 0x10000) - || (m->sx == 0 && m->sy == 0)) - && ((m->r0|m->r1|m->tx|m->ty) == 0) - ) - return 1; - return 0; -} - -int isUnitCXForm(CXFORM* cx) -{ - if((cx->a0==256 && cx->r0==256 && cx->g0==256 && cx->b0==256) && - (cx->a1==0 && cx->r1==0 && cx->g1==0 && cx->b1==0)) - return 1; - /* A CXForm of all zeros is, unfortunately, not as unlikely - as a matrix of all zeros. However, we still treat it - as non-existent/uniform transform */ - if((cx->a0==0 && cx->r0==0 && cx->g0==0 && cx->b0==0) && - (cx->a1==0 && cx->r1==0 && cx->g1==0 && cx->b1==0)) - return 1; - return 0; -} - -static int objectplace(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char * name, U16 clipaction, U8 blendmode, FILTERLIST*filters) -{ U8 flags,flags2; - if (!t) return -1; - - if(cx && id && cx->r1==0 && cx->g1==0 && cx->b1==0 && cx->a1==0 - && cx->r0==256 && cx->g0==256 && cx->b0==256 && cx->a0==256) - cx = 0; - - if(m && id && isUnitMatrix(m)) - m = 0; - - flags = (id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|(name?PF_NAME:0)|((m||cx)&&(!id)?PF_MOVE:0)|(clipaction?PF_CLIPDEPTH:0); - flags2 = (0?PF2_ASBITMAP:0)|(blendmode?PF2_BLENDMODE:0)|(filters?PF2_FILTERS:0); - - swf_SetU8(t,flags); - if(t->id == ST_PLACEOBJECT3) - swf_SetU8(t, flags2); - swf_SetU16(t,depth); - if (flags&PF_CHAR) swf_SetU16(t,id); - if (flags&PF_MATRIX) swf_SetMatrix(t,m); - if (flags&PF_CXFORM) swf_SetCXForm(t,cx,1); - if (flags&PF_RATIO) swf_SetU16(t,0); - /* ??? The spec states that name comes first? */ - if (flags&PF_CLIPDEPTH) swf_SetU16(t, clipaction); - if (flags&PF_NAME) swf_SetString(t,name); - - if (flags2&PF2_BLENDMODE) - swf_SetU8(t,blendmode); - return 0; -} -int swf_ObjectPlace(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char * name) -{ - return objectplace(t,id,depth,m,cx,name,0,0,0); -} -int swf_ObjectPlaceClip(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char * name, U16 clipaction) -{ - return objectplace(t,id,depth,m,cx,name,clipaction,0,0); -} -int swf_ObjectPlaceBlend(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char * name, U8 blend) -{ - if(t->id != ST_PLACEOBJECT3) - fprintf(stderr, "wrong tag- ignoring blend mode\n"); - return objectplace(t,id,depth,m,cx,name,0,blend,0); -} -int swf_ObjectMove(TAG * t,U16 depth,MATRIX * m,CXFORM * cx) -{ - return objectplace(t,0,depth,m,cx,0,0,0,0); -} - -void swf_SetPlaceObject(TAG * t,SWFPLACEOBJECT* obj) -{ - if (!t) return ; - if(t->id == ST_PLACEOBJECT) { - swf_SetU16(t, obj->id); - swf_SetU16(t, obj->depth); - swf_SetMatrix(t, &obj->matrix); - swf_SetCXForm(t, &obj->cxform, 0); - } else { - U8 flags,flags2; - int m = !isUnitMatrix(&obj->matrix); - int cx = !isUnitCXForm(&obj->cxform); - - flags = (obj->id?PF_CHAR:0)|(m?PF_MATRIX:0)|(cx?PF_CXFORM:0)|(obj->ratio?PF_RATIO:0)| - (obj->name?PF_NAME:0)|(obj->move?PF_MOVE:0)| - (obj->clipdepth?PF_CLIPDEPTH:0); - flags2 = (0?PF2_ASBITMAP:0)|(obj->blendmode?PF2_BLENDMODE:0)|(obj->filters?PF2_FILTERS:0); - - swf_SetU8(t,flags); - if(t->id == ST_PLACEOBJECT3) - swf_SetU8(t,flags2); - swf_SetU16(t,obj->depth); - if (flags&PF_CHAR) swf_SetU16(t,obj->id); - if (flags&PF_MATRIX) swf_SetMatrix(t,&obj->matrix); - if (flags&PF_CXFORM) swf_SetCXForm(t,&obj->cxform,1); - if (flags&PF_RATIO) swf_SetU16(t,obj->ratio); - - /* ??? The spec states that name comes first? */ - if (flags&PF_CLIPDEPTH) swf_SetU16(t,obj->clipdepth); - if (flags&PF_NAME) swf_SetString(t,obj->name); - - if (flags2&PF2_FILTERS) { - swf_SetU8(t,obj->filters->num); - int s; - for(s=0;sfilters->num;s++) - swf_SetFilter(t,obj->filters->filter[s]); - } - if (flags2&PF2_BLENDMODE) - swf_SetU8(t,obj->blendmode); - if (flags&PF_ACTIONEVENT) { - // ... - } - } -} - -void swf_GetPlaceObject(TAG * tag,SWFPLACEOBJECT* obj) -{ - if(obj) - memset(obj, 0, sizeof(SWFPLACEOBJECT)); - - if(!tag) { - swf_GetMatrix(0, &obj->matrix); - swf_GetCXForm(0, &obj->cxform, 1); - //obj->internal = PF_CHAR|PF_MATRIX|PF_CXFORM; - return; - } - swf_SetTagPos(tag, 0); - - if(tag->id == ST_PLACEOBJECT) { - obj->id = swf_GetU16(tag); - obj->depth = swf_GetU16(tag); - swf_GetMatrix(tag, &obj->matrix); - swf_GetCXForm(tag, &obj->cxform, 0); - //obj->internal = PF_CHAR|PF_MATRIX|PF_CXFORM; - } else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) { - U8 flags,flags2=0; - flags = swf_GetU8(tag); - if(tag->id == ST_PLACEOBJECT3) - flags2 = swf_GetU8(tag); - memset(obj,0,sizeof(SWFPLACEOBJECT)); - - swf_GetMatrix(0,&obj->matrix); - swf_GetCXForm(0,&obj->cxform,1); - - obj->flags = flags; - obj->depth = swf_GetU16(tag); - //obj->internal = flags; - if(flags&PF_MOVE) obj->move = 1; - if(flags&PF_CHAR) obj->id = swf_GetU16(tag); - if(flags&PF_MATRIX) swf_GetMatrix(tag, &obj->matrix); - if(flags&PF_CXFORM) swf_GetCXForm(tag, &obj->cxform,1); - if(flags&PF_RATIO) obj->ratio = swf_GetU16(tag); - /* if you modify the order of these operations, also - modify it in ../src/swfcombine.c */ - if(flags&PF_CLIPDEPTH) - obj->clipdepth = swf_GetU16(tag); //clip - if(flags&PF_NAME) { - int l,t; - U8*data; - swf_ResetReadBits(tag); - l = strlen((const char *)&tag->data[tag->pos]); - t = 0; - data = (U8*)rfx_alloc(l+1); - obj->name = (char*)data; - while((data[t++] = swf_GetU8(tag))); - } - if(flags2&PF2_BLENDMODE) { - obj->blendmode = swf_GetU8(tag); - } - - /* Actionscript ignored (for now) */ - obj->actions = 0; - } else { - fprintf(stderr, "rfxswf: Bad Tag: %d not a placeobject\n", tag->id); - } -} - -void swf_PlaceObjectFree(SWFPLACEOBJECT* obj) -{ - if(obj->name) - rfx_free(obj->name); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfrender.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfrender.c deleted file mode 100644 index 6c5262a7c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfrender.c +++ /dev/null @@ -1,1352 +0,0 @@ -/* swfrender.c - - functions for rendering swf content - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2004 Mederra Oy - Copyright (c) 2004 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../rfxswf.h" - -/* one bit flag: */ -#define clip_type 0 -#define fill_type 1 - -typedef struct _renderpoint -{ - float x; - U32 depth; - - SHAPELINE*shapeline; - SHAPE2*s; - -} renderpoint_t; - -/* - enum {clip_type, solidfill_type, texturefill_type, gradientfill_type} type; - float fx; - int x; - U32 depth; - U32 clipdepth; - - // solidfill; - RGBA color; - - // texturefill - bitmap_t* bitmap; - - // gradientfill - gradient_t* gradient; - - // texture- & gradientfill; - U32 x,y; - U32 dx,dy; - -*/ - -typedef struct _renderline -{ - TAG*points; //incremented in 128 byte steps - int num; - U32 pending_clipdepth; -} renderline_t; - -typedef struct _bitmap { - int width; - int height; - RGBA*data; - int id; - struct _bitmap*next; -} bitmap_t; - -typedef struct _renderbuf_internal -{ - renderline_t*lines; - bitmap_t*bitmaps; - int antialize; - int multiply; - int width2,height2; - int shapes; - int ymin, ymax; - - RGBA* img; - int* zbuf; -} renderbuf_internal; - -#define DEBUG 0 - -static inline void add_pixel(RENDERBUF*dest, float x, int y, renderpoint_t*p) -{ - renderbuf_internal*i = (renderbuf_internal*)dest->internal; - if(x >= i->width2 || y >= i->height2 || y<0) return; - p->x = x; - if(yymin) i->ymin = y; - if(y>i->ymax) i->ymax = y; - - i->lines[y].num++; - swf_SetBlock(i->lines[y].points, (U8*)p, sizeof(renderpoint_t)); -} - -/* set this to 0.777777 or something if the "both fillstyles set while not inside shape" - problem appears to often */ -#define CUT 0.77887789 - -#define INT(x) ((int)((x)+16)-16) - -static void add_line(RENDERBUF*buf, double x1, double y1, double x2, double y2, renderpoint_t*p) -{ - renderbuf_internal*i = (renderbuf_internal*)buf->internal; - double diffx, diffy; - double ny1, ny2, stepx; -/* if(DEBUG&4) { - int l = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); - printf(" l[%d - %.2f/%.2f -> %.2f/%.2f]\n", l, x1/20.0, y1/20.0, x2/20.0, y2/20.0); - }*/ - assert(p->shapeline); - - y1=y1*i->multiply; - y2=y2*i->multiply; - x1=x1*i->multiply; - x2=x2*i->multiply; - - y1 = y1/20.0; - y2 = y2/20.0; - x1 = x1/20.0; - x2 = x2/20.0; - - if(y2 < y1) { - double x; - double y; - x = x1;x1 = x2;x2=x; - y = y1;y1 = y2;y2=y; - } - - diffx = x2 - x1; - diffy = y2 - y1; - - ny1 = INT(y1)+CUT; - ny2 = INT(y2)+CUT; - - if(ny1 < y1) { - ny1 = INT(y1) + 1.0 + CUT; - } - if(ny2 >= y2) { - ny2 = INT(y2) - 1.0 + CUT; - } - - if(ny1 > ny2) - return; - - stepx = diffx/diffy; - x1 = x1 + (ny1-y1)*stepx; - x2 = x2 + (ny2-y2)*stepx; - - { - int posy=INT(ny1); - int endy=INT(ny2); - double posx=0; - double startx = x1; - - while(posy<=endy) { - float xx = (float)(startx + posx); - add_pixel(buf, xx ,posy, p); - posx+=stepx; - posy++; - } - } -} -#define PI 3.14159265358979 -static void add_solidline(RENDERBUF*buf, double x1, double y1, double x2, double y2, double width, renderpoint_t*p) -{ - renderbuf_internal*i = (renderbuf_internal*)buf->internal; - - double dx = x2-x1; - double dy = y2-y1; - double sd; - double d; - - int t; - int segments; - double lastx,lasty; - double vx,vy; - double xx,yy; - - /* Make sure the line is always at least one pixel wide */ -#ifdef LINEMODE1 - /* That's what Macromedia's Player does at least at zoom level >= 1. */ - width += 20; -#else - /* That's what Macromedia's Player seems to do at zoom level 0. */ - /* TODO: needs testing */ - - /* TODO: how does this interact with scaling? */ - if(width * i->multiply < 20) - width = 20 / i->multiply; -#endif - - sd = (double)dx*(double)dx+(double)dy*(double)dy; - d = sqrt(sd); - - if(!dx && !dy) { - vx = 1; - vy = 0; - } else { - vx = ( dy/d); - vy = (-dx/d); - } - - segments = (int)(width/2); - if(segments < 2) - segments = 2; - - segments = 8; - - vx=vx*width*0.5; - vy=vy*width*0.5; - - xx = x2+vx; - yy = y2+vy; - add_line(buf, x1+vx, y1+vy, xx, yy, p); - lastx = xx; - lasty = yy; - for(t=1;tx < b->x) return -1; - if(a->x > b->x) return 1; - return 0; -} - -void swf_Render_Init(RENDERBUF*buf, int posx, int posy, int width, int height, int antialize, int multiply) -{ - renderbuf_internal*i; - int y; - memset(buf, 0, sizeof(RENDERBUF)); - buf->width = width*multiply; - buf->height = height*multiply; - buf->posx = posx; - buf->posy = posy; - buf->internal = (renderbuf_internal*)rfx_calloc(sizeof(renderbuf_internal)); - i = (renderbuf_internal*)buf->internal; - if(antialize < 1) - antialize = 1; - i->antialize = antialize; - i->multiply = multiply*antialize; - i->height2 = antialize*buf->height; - i->width2 = antialize*buf->width; - i->lines = (renderline_t*)rfx_alloc(i->height2*sizeof(renderline_t)); - for(y=0;yheight2;y++) { - memset(&i->lines[y], 0, sizeof(renderline_t)); - i->lines[y].points = swf_InsertTag(0, 0); - i->lines[y].num = 0; - } - i->zbuf = (int*)rfx_calloc(sizeof(int)*i->width2*i->height2); - i->img = (RGBA*)rfx_calloc(sizeof(RGBA)*i->width2*i->height2); - i->shapes = 0; - i->ymin = 0x7fffffff; - i->ymax = -0x80000000; -} -void swf_Render_SetBackground(RENDERBUF*buf, RGBA*img, int width, int height) -{ - renderbuf_internal*i = (renderbuf_internal*)buf->internal; - int x,xx,y,yy; - int xstep=width*65536/i->width2; - int ystep=height*65536/i->height2; - if(i->shapes) { - fprintf(stderr, "rfxswf: Warning: swf_Render_SetBackground() called after drawing shapes\n"); - } - for(y=0,yy=0;yheight2;y++,yy+=ystep) { - RGBA*src = &img[(yy>>16) * width]; - RGBA*line = &i->img[y * i->width2]; - for(x=0,xx=0;xwidth2;x++,xx+=xstep) { - line[x] = src[xx>>16]; - } - } -} -void swf_Render_SetBackgroundColor(RENDERBUF*buf, RGBA color) -{ - swf_Render_SetBackground(buf, &color, 1, 1); -} -void swf_Render_AddImage(RENDERBUF*buf, U16 id, RGBA*img, int width, int height) -{ - renderbuf_internal*i = (renderbuf_internal*)buf->internal; - - bitmap_t*bm = (bitmap_t*)rfx_calloc(sizeof(bitmap_t)); - bm->id = id; - bm->width = width; - bm->height = height; - bm->data = (RGBA*)rfx_alloc(width*height*4); - memcpy(bm->data, img, width*height*4); - - bm->next = i->bitmaps; - i->bitmaps = bm; -} -void swf_Render_ClearCanvas(RENDERBUF*dest) -{ - renderbuf_internal*i = (renderbuf_internal*)dest->internal; - int y; - for(y=0;yheight2;y++) { - swf_ClearTag(i->lines[y].points); - } - memset(i->zbuf, 0, sizeof(int)*i->width2*i->height2); - memset(i->img, 0, sizeof(RGBA)*i->width2*i->height2); -} -void swf_Render_Delete(RENDERBUF*dest) -{ - renderbuf_internal*i = (renderbuf_internal*)dest->internal; - int y; - bitmap_t*b = i->bitmaps; - - /* delete canvas */ - rfx_free(i->zbuf); - rfx_free(i->img); - - /* delete line buffers */ - for(y=0;yheight2;y++) { - swf_DeleteTag(0, i->lines[y].points); - i->lines[y].points = 0; - } - - /* delete bitmaps */ - while(b) { - bitmap_t*next = b->next; - free(b->data);b->data=0; - rfx_free(b); - b = next; - } - - rfx_free(i->lines); i->lines = 0; - rfx_free(dest->internal); dest->internal = 0; -} - -static SHAPE2* linestyle2fillstyle(SHAPE2*shape) -{ - SHAPE2*s = (SHAPE2*)rfx_calloc(sizeof(SHAPE2)); - int t; - s->numfillstyles = shape->numlinestyles; - s->fillstyles = (FILLSTYLE*)rfx_calloc(sizeof(FILLSTYLE)*shape->numlinestyles); - s->lines = (SHAPELINE*)rfx_calloc(sizeof(SHAPELINE)*shape->numlinestyles); - for(t=0;tnumlinestyles;t++) { - s->lines[t].fillstyle0 = t+1; - s->fillstyles[t].type = FILL_SOLID; - s->fillstyles[t].color = shape->linestyles[t].color; - } - return s; -} - -void swf_Process(RENDERBUF*dest, U32 clipdepth); - -double matrixsize(MATRIX*m) -{ - double l1 = sqrt((m->sx /65536.0) * (m->sx /65536.0) + (m->r0 /65536.0) * (m->r0/65536.0) ); - double l2 = sqrt((m->r1 /65536.0) * (m->r1 /65536.0) + (m->sy /65536.0) * (m->sy/65536.0) ); - return sqrt(l1*l2); -} - -void swf_RenderShape(RENDERBUF*dest, SHAPE2*shape, MATRIX*m, CXFORM*c, U16 _depth,U16 _clipdepth) -{ - renderbuf_internal*i = (renderbuf_internal*)dest->internal; - - SHAPELINE*line; - int x=0,y=0; - MATRIX mat = *m; - SHAPE2* s2 = 0; - SHAPE2* lshape = 0; - renderpoint_t p, lp; - U32 clipdepth; - double widthmultiply = matrixsize(m); - - memset(&p, 0, sizeof(renderpoint_t)); - memset(&lp, 0, sizeof(renderpoint_t)); - - clipdepth = _clipdepth? _clipdepth << 16 | 0xffff : 0; - p.depth = _depth << 16; - - mat.tx -= dest->posx*20; - mat.ty -= dest->posy*20; - - s2 = swf_Shape2Clone(shape); - line = s2->lines; - if(shape->numfillstyles) { - int t; - p.s = s2; - /* multiply fillstyles matrices with placement matrix- - important for texture and gradient fill */ - for(t=0;tnumfillstyles;t++) { - MATRIX nm; - swf_MatrixJoin(&nm, &mat, &s2->fillstyles[t].m); - /*nm.sx *= i->multiply; - nm.sy *= i->multiply; - nm.r0 *= i->multiply; - nm.r1 *= i->multiply; - nm.tx *= i->multiply; - nm.ty *= i->multiply;*/ - s2->fillstyles[t].m = nm; - } - } - - if(shape->numlinestyles) { - lshape = linestyle2fillstyle(shape); - lp.s = lshape; - lp.depth = (_depth << 16)+1; - } - - - while(line) - { - int x1,y1,x2,y2,x3,y3; - - if(line->type == moveTo) { - } else if(line->type == lineTo) { - transform_point(&mat, x, y, &x1, &y1); - transform_point(&mat, line->x, line->y, &x3, &y3); - - if(line->linestyle && ! clipdepth) { - lp.shapeline = &lshape->lines[line->linestyle-1]; - add_solidline(dest, x1, y1, x3, y3, shape->linestyles[line->linestyle-1].width * widthmultiply, &lp); - lp.depth++; - } - if(line->fillstyle0 || line->fillstyle1) { - assert(shape->numfillstyles); - p.shapeline = line; - add_line(dest, x1, y1, x3, y3, &p); - } - } else if(line->type == splineTo) { - int c,t,parts,qparts; - double xx,yy; - - transform_point(&mat, x, y, &x1, &y1); - transform_point(&mat, line->sx, line->sy, &x2, &y2); - transform_point(&mat, line->x, line->y, &x3, &y3); - - c = abs(x3-2*x2+x1) + abs(y3-2*y2+y1); - xx=x1; - yy=y1; - - parts = (int)(sqrt((float)c)/3); - if(!parts) parts = 1; - - for(t=1;t<=parts;t++) { - double nx = (double)(t*t*x3 + 2*t*(parts-t)*x2 + (parts-t)*(parts-t)*x1)/(double)(parts*parts); - double ny = (double)(t*t*y3 + 2*t*(parts-t)*y2 + (parts-t)*(parts-t)*y1)/(double)(parts*parts); - - if(line->linestyle && ! clipdepth) { - lp.shapeline = &lshape->lines[line->linestyle-1]; - add_solidline(dest, xx, yy, nx, ny, shape->linestyles[line->linestyle-1].width * widthmultiply, &lp); - lp.depth++; - } - if(line->fillstyle0 || line->fillstyle1) { - assert(shape->numfillstyles); - p.shapeline = line; - add_line(dest, xx, yy, nx, ny, &p); - } - - xx = nx; - yy = ny; - } - } - x = line->x; - y = line->y; - line = line->next; - } - - swf_Process(dest, clipdepth); - - if(s2) { - swf_Shape2Free(s2);rfx_free(s2);s2=0; - } - if(lshape) { - swf_Shape2Free(lshape);rfx_free(lshape);lshape=0; - } - -} - -static RGBA color_red = {255,255,0,0}; -static RGBA color_white = {255,255,255,255}; -static RGBA color_black = {255,0,0,0}; - -static void fill_clip(RGBA*line, int*z, int y, int x1, int x2, U32 depth) -{ - int x = x1; - if(x1>=x2) - return; - do { - if(depth > z[x]) { - z[x] = depth; - } - } while(++x>8; - col.g = (col.g*col.a)>>8; - col.b = (col.b*col.a)>>8; - col.a = 255; - do { - if(depth >= z[x]) { - line[x].r = ((line[x].r*ainv)>>8)+col.r; - line[x].g = ((line[x].g*ainv)>>8)+col.g; - line[x].b = ((line[x].b*ainv)>>8)+col.b; - line[x].a = 255; - z[x] = depth; - } - } while(++x= z[x]) { - line[x] = col; - z[x] = depth; - } - } while(++x255) return 255; - else return v; -} - -static void fill_bitmap(RGBA*line, int*z, int y, int x1, int x2, MATRIX*m, bitmap_t*b, int clipbitmap, U32 depth, double fmultiply) -{ - int x = x1; - - double m11= m->sx*fmultiply/65536.0, m21= m->r1*fmultiply/65536.0; - double m12= m->r0*fmultiply/65536.0, m22= m->sy*fmultiply/65536.0; - double rx = m->tx*fmultiply/20.0; - double ry = m->ty*fmultiply/20.0; - - double det = m11*m22 - m12*m21; - if(fabs(det) < 0.0005) { - /* x direction equals y direction- the image is invisible */ - return; - } - det = 20.0/det; - - if(!b->width || !b->height) { - fill_solid(line, z, y, x1, x2, color_red, depth); - return; - } - - do { - if(depth >= z[x]) { - RGBA col; - int xx = (int)(( (x - rx) * m22 - (y - ry) * m21)*det); - int yy = (int)((- (x - rx) * m12 + (y - ry) * m11)*det); - int ainv; - - if(clipbitmap) { - if(xx<0) xx=0; - if(xx>=b->width) xx = b->width-1; - if(yy<0) yy=0; - if(yy>=b->height) yy = b->height-1; - } else { - xx %= b->width; - yy %= b->height; - if(xx<0) xx += b->width; - if(yy<0) yy += b->height; - } - - col = b->data[yy*b->width+xx]; - ainv = 255-col.a; - - line[x].r = clamp(((line[x].r*ainv)>>8)+col.r); - line[x].g = clamp(((line[x].g*ainv)>>8)+col.g); - line[x].b = clamp(((line[x].b*ainv)>>8)+col.b); - line[x].a = 255; - - z[x] = depth; - } - } while(++xsx*fmultiply/80, m21= m->r1*fmultiply/80; - double m12= m->r0*fmultiply/80, m22= m->sy*fmultiply/80; - double rx = m->tx*fmultiply/20.0; - double ry = m->ty*fmultiply/20.0; - - double det = m11*m22 - m12*m21; - if(fabs(det) < 0.0005) { - /* x direction equals y direction- the image is invisible */ - return; - } - det = 1.0/det; - - RGBA palette[512]; - RGBA oldcol = g->rgba[0]; - int r0 = g->ratios[0]*2; - int t; - for(t=0;tnum;t++) { - int r1 = g->ratios[t]*2; - RGBA newcol = g->rgba[t]; - if(r0 == r1) - continue; - //printf("%d %d->%d %02x%02x%02x%02x->%02x%02x%02x%02x\n", - // t, r0, r1, oldcol.r,oldcol.g,oldcol.b,oldcol.a, - // newcol.r,newcol.g,newcol.b,newcol.a); - double f = 1.0 / (r1-r0); - double p0 = 1; - double p1 = 0; - int s; - for(;r0<=r1;r0++) { - palette[r0].r = oldcol.r*p0 + newcol.r*p1; - palette[r0].g = oldcol.g*p0 + newcol.g*p1; - palette[r0].b = oldcol.b*p0 + newcol.b*p1; - palette[r0].a = oldcol.a*p0 + newcol.a*p1; - p0 -= f; - p1 += f; - } - oldcol = newcol; - } - for(t=r0;t<512;t++) - palette[t] = oldcol; - - do { - if(depth >= z[x]) { - RGBA col; - double xx = ( (x - rx) * m22 - (y - ry) * m21)*det; - double yy = (- (x - rx) * m12 + (y - ry) * m11)*det; - - if(type == FILL_LINEAR) { - int xr = xx*256; - if(xr<-256) - xr = -256; - if(xr>255) - xr = 255; - col = palette[xr+256]; - } else { - int xr = sqrt(xx*xx+yy*yy)*511; - if(xr<0) - xr = 0; - if(xr>511) - xr = 511; - col = palette[xr]; - } - int ainv; - ainv = 255-col.a; - line[x].r = clamp(((line[x].r*ainv)>>8)+col.r); - line[x].g = clamp(((line[x].g*ainv)>>8)+col.g); - line[x].b = clamp(((line[x].b*ainv)>>8)+col.b); - line[x].a = 255; - - z[x] = depth; - } - } while(++xinternal; - int clip=1; - - layer_t*l = fillstate->layers; - - if(x1>=x2) //zero width? nothing to do. - return; - - while(l) { - if(l->fillid == 0) { - /* not filled. TODO: we should never add those in the first place */ - if(DEBUG&2) - printf("(not filled)"); - } else if(l->fillid > l->p->s->numfillstyles) { - fprintf(stderr, "Fill style out of bounds (%d>%d)", l->fillid, l->p->s->numlinestyles); - } else if(clipdepth) { - /* filled region- not used for clipping */ - clip = 0; - } else { - FILLSTYLE*f; - if(DEBUG&2) - printf("(%d -> %d style %d)", x1, x2, l->fillid); - - f = &l->p->s->fillstyles[l->fillid-1]; - - if(f->type == FILL_SOLID) { - /* plain color fill */ - fill_solid(line, zline, y, x1, x2, f->color, l->p->depth); - } else if(f->type == FILL_TILED || f->type == FILL_CLIPPED || f->type == (FILL_TILED|2) || f->type == (FILL_CLIPPED|2)) { - /* TODO: optimize (do this in add_pixel()?) */ - bitmap_t* b = i->bitmaps; - while(b && b->id != f->id_bitmap) { - b = b->next; - } - if(!b) { - fprintf(stderr, "Shape references unknown bitmap %d\n", f->id_bitmap); - fill_solid(line, zline, y, x1, x2, color_red, l->p->depth); - } else { - fill_bitmap(line, zline, y, x1, x2, &f->m, b, /*clipped?*/f->type&1, l->p->depth, i->multiply); - } - } else if(f->type == FILL_LINEAR || f->type == FILL_RADIAL) { - fill_gradient(line, zline, y, x1, x2, &f->m, &f->gradient, f->type, l->p->depth, i->multiply); - } else { - fprintf(stderr, "Undefined fillmode: %02x\n", f->type); - } - } - l = l->next; - } - if(clip && clipdepth) { - fill_clip(line, zline, y, x1, x2, clipdepth); - } -} - -static void search_layer(state_t*state, int depth, layer_t**before, layer_t**self, layer_t**after) -{ - layer_t*last=0,*l = state->layers; - while(l && l->p->depth < depth) { - last = l; - l = l->next; - } - *before = last; - if(l && l->p->depth == depth) - *self = l; - else - *after = l; -} -static void delete_layer(state_t*state, layer_t*todel) -{ - layer_t*before=todel->prev; - layer_t*next = todel->next; - rfx_free(todel); - if(!before) { - state->layers = next; - if(next) - next->prev = 0; - } else { - before->next = next; - if(before->next) - before->next->prev = before; - } -} -static void add_layer(state_t*state, layer_t*before, layer_t*toadd) -{ - if(!before) { - toadd->next = state->layers; - toadd->prev = 0; - state->layers=toadd; - } else { - toadd->next = before->next; - toadd->prev = before; - before->next = toadd; - } - if(toadd->next) - toadd->next->prev = toadd; -} -static void free_layers(state_t* state) -{ - layer_t*l = state->layers; - while(l) { - layer_t*next = l->next; - rfx_free(l); - l = next; - } -} - -static void change_state(int y, state_t* state, renderpoint_t*p) -{ - layer_t*before=0, *self=0, *after=0; - - if(DEBUG&2) { - printf("[(%f,%d)/%d/%d-%d]", p->x, y, p->depth, p->shapeline->fillstyle0, p->shapeline->fillstyle1); - } - - search_layer(state, p->depth, &before, &self, &after); - - if(self) { - /* shape update */ - if(self->fillid<0/*??*/ || !p->shapeline->fillstyle0 || !p->shapeline->fillstyle1) { - /* filling ends */ - if(DEBUG&2) printf(""); - - delete_layer(state, self); - } else { - /*both fill0 and fill1 are set- exchange the two, updating the layer */ - if(self->fillid == p->shapeline->fillstyle0) { - self->fillid = p->shapeline->fillstyle1; - self->p = p; - if(DEBUG&2) printf(""); - } else if(self->fillid == p->shapeline->fillstyle1) { - self->fillid = p->shapeline->fillstyle0; - self->p = p; - if(DEBUG&2) printf(""); - } else { - /* buggy shape. keep everything as-is. */ - if(DEBUG&2) printf(""); - //fprintf(stderr, "\n", y); - } - } - return; - } else { - layer_t* n = 0; - if(p->shapeline && p->shapeline->fillstyle0 && p->shapeline->fillstyle1) { - /* this is a hack- a better way would be to make sure that - we always get (0,32), (32, 33), (33, 0) in the right order if - they happen to fall on the same pixel. - (not: (0,32), (33, 0), (32, 33)) - Notice: Weird fill styles appear if linestyles are involved, too. - */ - fprintf(stderr, "\n", y); - return; - } - - n = (layer_t*)rfx_calloc(sizeof(layer_t)); - - if(DEBUG&2) printf("<+>"); - - n->fillid = p->shapeline->fillstyle0 ? p->shapeline->fillstyle0 : p->shapeline->fillstyle1; - n->p = p; - - add_layer(state, before, n); - } -} - -void swf_Process(RENDERBUF*dest, U32 clipdepth) -{ - renderbuf_internal*i = (renderbuf_internal*)dest->internal; - int y; - - if(i->ymax < i->ymin) { - /* shape is empty. return. - only, if it's a clipshape, remember the clipdepth */ - if(clipdepth) { - for(y=0;yheight2;y++) { - if(clipdepth > i->lines[y].pending_clipdepth) - i->lines[y].pending_clipdepth = clipdepth; - } - } - return; //nothing (else) to do - } - - if(clipdepth) { - /* lines outside the clip shape are not filled - immediately, only the highest clipdepth so far is - stored there. They will be clipfilled once there's - actually something about to happen in that line */ - for(y=0;yymin;y++) { - if(clipdepth > i->lines[y].pending_clipdepth) - i->lines[y].pending_clipdepth = clipdepth; - } - for(y=i->ymax+1;yheight2;y++) { - if(clipdepth > i->lines[y].pending_clipdepth) - i->lines[y].pending_clipdepth = clipdepth; - } - } - - for(y=i->ymin;y<=i->ymax;y++) { - int n; - TAG*tag = i->lines[y].points; - int num = i->lines[y].num; - renderpoint_t*points = (renderpoint_t*)tag->data; - RGBA*line = &i->img[i->width2*y]; - int*zline = &i->zbuf[i->width2*y]; - int lastx = 0; - state_t fillstate; - memset(&fillstate, 0, sizeof(state_t)); - qsort(points, num, sizeof(renderpoint_t), compare_renderpoints); - /* resort points */ - /*if(y==884) { - for(n=0;nfillstyle0, - points[n].shapeline->fillstyle1, - points[n].shapeline->linestyle); - } - }*/ - - if(i->lines[y].pending_clipdepth && !clipdepth) { - fill_clip(line, zline, y, 0, i->width2, i->lines[y].pending_clipdepth); - i->lines[y].pending_clipdepth=0; - } - - for(n=0;nx; - int endx = (int)(next?next->x:i->width2); - if(endx > i->width2) - endx = i->width2; - if(startx < 0) - startx = 0; - if(endx < 0) - endx = 0; - - if(clipdepth) { - /* for clipping, the inverse is filled - TODO: lastx!=startx only at the start of the loop, - so this might be moved up - */ - fill_clip(line, zline, y, lastx, startx, clipdepth); - } - change_state(y, &fillstate, p); - - fill(dest, line, zline, y, startx, endx, &fillstate, clipdepth); -/* if(y == 0 && startx == 232 && endx == 418) { - printf("ymin=%d ymax=%d\n", i->ymin, i->ymax); - for(n=0;nx, p->depth); - } - }*/ - - lastx = endx; - if(endx == i->width2) - break; - } - if(clipdepth) { - /* TODO: is lastx *ever* != i->width2 here? */ - fill_clip(line, zline, y, lastx, i->width2, clipdepth); - } - free_layers(&fillstate); - - i->lines[y].num = 0; - swf_ClearTag(i->lines[y].points); - } - i->ymin = 0x7fffffff; - i->ymax = -0x80000000; -} - -RGBA* swf_Render(RENDERBUF*dest) -{ - renderbuf_internal*i = (renderbuf_internal*)dest->internal; - RGBA* img = (RGBA*)rfx_alloc(sizeof(RGBA)*dest->width*dest->height); - int y; - int antialize = i->antialize; - - if(antialize <= 1) /* no antializing */ { - for(y=0;yheight2;y++) { - RGBA*line = &i->img[y*i->width2]; - memcpy(&img[y*dest->width], line, sizeof(RGBA)*dest->width); - } - } else { - RGBA**lines = (RGBA**)rfx_calloc(sizeof(RGBA*)*antialize); - int q = antialize*antialize; - int ypos = 0; - for(y=0;yheight2;y++) { - int n; - ypos = y % antialize; - lines[ypos] = &i->img[y*i->width2]; - if(ypos == antialize-1) { - RGBA*out = &img[(y / antialize)*dest->width]; - int x; - int r,g,b,a; - for(x=0;xwidth;x++) { - int xpos = x*antialize; - int yp; - U32 r=0,g=0,b=0,a=0; - for(yp=0;ypr; - g += p->g; - b += p->b; - a += p->a; - } - } - out[x].r = r / q; - out[x].g = g / q; - out[x].b = b / q; - out[x].a = a / q; - } - } - } - rfx_free(lines); - } - return img; -} - -typedef struct -{ - int numchars; - SHAPE2**glyphs; -} font_t; - -enum CHARACTER_TYPE {none_type, shape_type, image_type, text_type, edittext_type, font_type, sprite_type}; -typedef struct -{ - TAG*tag; - SRECT*bbox; - enum CHARACTER_TYPE type; - union { - SHAPE2*shape; - font_t*font; - } obj; -} character_t; - -int compare_placements(const void *v1, const void *v2) -{ - SWFPLACEOBJECT*p1 = (SWFPLACEOBJECT*)v1; - SWFPLACEOBJECT*p2 = (SWFPLACEOBJECT*)v2; - if(p1->depth != p2->depth) - return (int)p1->depth - (int)p2->depth; - else - if(p2->clipdepth) - return 1; // do the clip first - else - return -1; - -/* if(!p1->clipdepth) { - if(!p2->clipdepth) { - // !p1->clipdepth && !p2->clipdepth - return (int)p1->depth - (int)p2->depth; - } else { - // !p1->clipdepth && p2->clipdepth - if(p1->depth != p2->clipdepth) - return (int)p1->depth - (int)p2->clipdepth; - else - return 1; // do the clip first - } - } else { - if(!p2->clipdepth) { - // p1->clipdepth && !p2->clipdepth - if(p1->clipdepth != p2->depth) - return (int)p1->clipdepth - (int)p2->depth; - else - return -1;// do the clip first - } else { - if(p1->clipdepth != p2->clipdepth) - return (int)p1->clipdepth - (int)p2->clipdepth; - else - return (int)p1->depth - (int)p2->depth; - } - }*/ -} - -typedef struct textcallbackblock -{ - character_t*idtable; - U16 depth; - U16 clipdepth; - CXFORM* cxform; - MATRIX m; - RENDERBUF*buf; -} textcallbackblock_t; - -static void textcallback(void*self, int*chars, int*xpos, int nr, int fontid, int fontsize, - int xstart, int ystart, RGBA* color) -{ - textcallbackblock_t * info = (textcallbackblock_t*)self; - font_t*font = 0; - int t; - if(info->idtable[fontid].type != font_type) { - fprintf(stderr, "ID %d is not a font\n", fontid); - return; - } else if(!info->idtable[fontid].obj.font) { - fprintf(stderr, "Font %d unknown\n", fontid); - return; - } else { - font = info->idtable[fontid].obj.font; - } - for(t=0;tm; - SPOINT p; - - p.x = x; p.y = y; - p = swf_TurnPoint(p, &m); - - m.sx = (m.sx * fontsize) / 1024; - m.sy = (m.sy * fontsize) / 1024; - m.r0 = (m.r0 * fontsize) / 1024; - m.r1 = (m.r1 * fontsize) / 1024; - m.tx = p.x; - m.ty = p.y; - - if(chars[t]<0 || chars[t]>= font->numchars) { - fprintf(stderr, "Character out of range: %d\n", chars[t]); - } else { - SHAPE2*shape = font->glyphs[chars[t]]; - shape->fillstyles[0].color = *color; //q&d - /*printf("Rendering char %d (size %d, x:%d, y:%d) color:%02x%02x%02x%02x\n", chars[t], fontsize, x, y, - color->a, color->r, color->g, color->b); - swf_DumpMatrix(stdout, &m); - swf_DumpShape(shape);*/ - swf_RenderShape(info->buf, shape, &m, info->cxform, info->depth, info->clipdepth); - } - } -} - -static void renderFromTag(RENDERBUF*buf, character_t*idtable, TAG*firstTag, MATRIX*m) -{ - TAG*tag = 0; - int numplacements = 0; - SWFPLACEOBJECT* placements; - - tag = firstTag; - numplacements = 0; - while(tag) { - if(tag->id == ST_PLACEOBJECT || - tag->id == ST_PLACEOBJECT2) { - numplacements++; - } - if(tag->id == ST_SHOWFRAME || tag->id == ST_END) - break; - tag = tag->next; - } - placements = (SWFPLACEOBJECT*)rfx_calloc(sizeof(SWFPLACEOBJECT)*numplacements); - numplacements = 0; - - tag = firstTag; - while(tag) { - if(swf_isPlaceTag(tag)) { - SWFPLACEOBJECT p; - swf_GetPlaceObject(tag, &p); - /* TODO: add move and deletion */ - placements[numplacements++] = p; - swf_PlaceObjectFree(&p); //dirty! but it only frees fields we don't use - } - if(tag->id == ST_SHOWFRAME || tag->id == ST_END) - break; - tag = tag->next; - } - - qsort(placements, numplacements, sizeof(SWFPLACEOBJECT), compare_placements); - - int t; - for(t=0;tid; - MATRIX m2; - swf_MatrixJoin(&m2, m, &p->matrix); - - if(!idtable[id].tag) { - fprintf(stderr, "rfxswf: Id %d is unknown\n", id); - continue; - } - - if(idtable[id].type == shape_type) { - //SRECT sbbox = swf_TurnRect(*idtable[id].bbox, &p->matrix); - swf_RenderShape(buf, idtable[id].obj.shape, &m2, &p->cxform, p->depth, p->clipdepth); - } else if(idtable[id].type == sprite_type) { - swf_UnFoldSprite(idtable[id].tag); - renderFromTag(buf, idtable, idtable[id].tag->next, &m2); - swf_FoldSprite(idtable[id].tag); - } else if(idtable[id].type == text_type) { - TAG* tag = idtable[id].tag; - textcallbackblock_t info; - MATRIX mt; - - swf_SetTagPos(tag, 0); - swf_GetU16(tag); - swf_GetRect(tag,0); - swf_GetMatrix(tag,&mt); - swf_MatrixJoin(&info.m, &m2, &mt); - /*printf("Text matrix:\n"); - swf_DumpMatrix(stdout, &m); - printf("Placement matrix:\n"); - swf_DumpMatrix(stdout, &p->matrix); - printf("Final matrix:\n"); - swf_DumpMatrix(stdout, &info.m);*/ - - info.idtable = idtable; - info.depth = p->depth; - info.cxform = &p->cxform; - info.clipdepth = p->clipdepth; - info.buf = buf; - - swf_ParseDefineText(tag, textcallback, &info); - } else if(idtable[id].type == edittext_type) { - TAG* tag = idtable[id].tag; - U16 flags = swf_GetBits(tag, 16); - if(flags & ET_HASTEXT) { - fprintf(stderr, "edittext not supported yet (id %d)\n", id); - } - } else { - fprintf(stderr, "Unknown/Unsupported Object Type for id %d: %s\n", id, swf_TagGetName(idtable[id].tag)); - } - } - - free(placements); -} - -void swf_RenderSWF(RENDERBUF*buf, SWF*swf) -{ - TAG*tag; - int t; - RGBA color; - - swf_OptimizeTagOrder(swf); - swf_FoldAll(swf); - - character_t* idtable = (character_t*)rfx_calloc(sizeof(character_t)*65536); // id to character mapping - - /* set background color */ - color = swf_GetSWFBackgroundColor(swf); - swf_Render_SetBackgroundColor(buf, color); - - /* parse definitions */ - tag = swf->firstTag; - while(tag) { - if(swf_isDefiningTag(tag)) { - int id = swf_GetDefineID(tag); - idtable[id].tag = tag; - idtable[id].bbox = (SRECT*)rfx_alloc(sizeof(SRECT)); - *idtable[id].bbox = swf_GetDefineBBox(tag); - - if(swf_isShapeTag(tag)) { - SHAPE2* shape = (SHAPE2*)rfx_calloc(sizeof(SHAPE2)); - swf_ParseDefineShape(tag, shape); - idtable[id].type = shape_type; - idtable[id].obj.shape = shape; - } else if(swf_isImageTag(tag)) { - int width,height; - RGBA*data = swf_ExtractImage(tag, &width, &height); - idtable[id].type = image_type; - swf_Render_AddImage(buf, id, data, width, height); - free(data); - } else if(tag->id == ST_DEFINEFONT || - tag->id == ST_DEFINEFONT2) { - int t; - SWFFONT*swffont; - font_t*font = (font_t*)rfx_calloc(sizeof(font_t)); - idtable[id].obj.font = font; - swf_FontExtract(swf,id,&swffont); - font->numchars = swffont->numchars; - font->glyphs = (SHAPE2**)rfx_calloc(sizeof(SHAPE2*)*font->numchars); - for(t=0;tnumchars;t++) { - if(!swffont->glyph[t].shape->fillstyle.n) { - /* the actual fill color will be overwritten while rendering */ - swf_ShapeAddSolidFillStyle(swffont->glyph[t].shape, &color_white); - } - font->glyphs[t] = swf_ShapeToShape2(swffont->glyph[t].shape); - } - swf_FontFree(swffont); - idtable[id].type = font_type; - - } else if(tag->id == ST_DEFINEFONTINFO || - tag->id == ST_DEFINEFONTINFO2) { - idtable[id].type = font_type; - } else if(tag->id == ST_DEFINETEXT || - tag->id == ST_DEFINETEXT2) { - idtable[id].type = text_type; - } else if(tag->id == ST_DEFINESPRITE) { - idtable[id].type = sprite_type; - } else if(tag->id == ST_DEFINEEDITTEXT) { - idtable[id].type = edittext_type; - } - } - tag = tag->next; - } - MATRIX m; - swf_GetMatrix(0, &m); - renderFromTag(buf, idtable, swf->firstTag, &m); - - /* free id and depth tables again */ - for(t=0;t<65536;t++) { - if(idtable[t].bbox) { - free(idtable[t].bbox); - idtable[t].bbox=0; - } - if(idtable[t].type == shape_type) { - SHAPE2* shape = idtable[t].obj.shape; - if(shape) { - swf_Shape2Free(shape); // FIXME - free(idtable[t].obj.shape);idtable[t].obj.shape = 0; - } - } else if(idtable[t].type == font_type) { - font_t* font = idtable[t].obj.font; - if(font) { - if(font->glyphs) { - int t; - for(t=0;tnumchars;t++) { - swf_Shape2Free(font->glyphs[t]); - free(font->glyphs[t]); font->glyphs[t] = 0; - } - free(font->glyphs); - font->glyphs = 0; - } - free(idtable[t].obj.font); idtable[t].obj.font = 0; - font = 0; - } - } - } - free(idtable); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfshape.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfshape.c deleted file mode 100644 index bc972d494..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfshape.c +++ /dev/null @@ -1,1124 +0,0 @@ -/* swfshape.c - - shape functions - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../rfxswf.h" - -#define SF_MOVETO 0x01 -#define SF_FILL0 0x02 -#define SF_FILL1 0x04 -#define SF_LINE 0x08 -#define SF_NEWSTYLE 0x10 - -void swf_ShapeFree(SHAPE * s) -{ - if(!s) - return; - if (s->linestyle.data) rfx_free(s->linestyle.data); - s->linestyle.data = NULL; - s->linestyle.n = 0; - if (s->fillstyle.data) rfx_free(s->fillstyle.data); - s->fillstyle.data = NULL; - s->fillstyle.n = 0; - if (s->data) rfx_free(s->data); - s->data = NULL; - rfx_free(s); -} - -int swf_ShapeNew(SHAPE * * s) -{ - SHAPE * sh; - if (!s) return -1; - sh = (SHAPE *)rfx_calloc(sizeof(SHAPE)); - *s = sh; - return 0; -} - -int swf_GetSimpleShape(TAG * t,SHAPE * * s) // without Linestyle/Fillstyle Record -{ SHAPE * sh; - int bitl, len; - int end; - U32 pos; - - if (FAILED(swf_ShapeNew(s))) return -1; - sh = s[0]; - - swf_ResetReadBits(t); - sh->bits.fill = (U16)swf_GetBits(t,4); - sh->bits.line = (U16)swf_GetBits(t,4); - bitl = 0; end = 0; pos = swf_GetTagPos(t); - - while (!end) - { int edge = swf_GetBits(t,1); bitl+=1; - if (edge) - { bitl+=1; - if (swf_GetBits(t,1)) // Line - { U16 nbits = swf_GetBits(t,4)+2; - bitl+=5; - - if (swf_GetBits(t,1)) // x/y Line - { swf_GetBits(t,nbits); - swf_GetBits(t,nbits); - bitl+=nbits*2; - } - else // hline/vline - { swf_GetBits(t,nbits+1); - bitl+=nbits+1; - } - } - else // Curve - { U16 nbits = swf_GetBits(t,4)+2; - bitl+=4; - - swf_GetBits(t,nbits); - swf_GetBits(t,nbits); - swf_GetBits(t,nbits); - swf_GetBits(t,nbits); - - bitl+=4*nbits; - } - } - else - { U16 flags = swf_GetBits(t,5); bitl+=5; - if (flags) - { - if (flags&SF_MOVETO) - { U16 nbits = swf_GetBits(t,5); bitl+=5; - swf_GetBits(t,nbits); - swf_GetBits(t,nbits); - bitl+=2*nbits; - } - - if (flags&SF_FILL0) - { swf_GetBits(t,sh->bits.fill); - bitl+=sh->bits.fill; - } - - if (flags&SF_FILL1) - { swf_GetBits(t,sh->bits.fill); - bitl+=sh->bits.fill; - } - - if (flags&SF_LINE) - { swf_GetBits(t,sh->bits.line); - bitl+=sh->bits.line; - } - - if (flags&SF_NEWSTYLE) - { fprintf(stderr,"RFXSWF: Can't process extended styles in shape.\n"); - } - } - else end = 1; - } - } - swf_SetTagPos(t,pos); - len = (bitl+7)/8; - - if (sh->data) rfx_free(sh->data); - sh->data = (U8*)rfx_alloc(len); - - if (sh->data) - { sh->bitlen = bitl; - swf_GetBlock(t,sh->data,len); - } - else return -1; - - return len; -} - -int swf_SetSimpleShape(TAG * t,SHAPE * s) // without Linestyle/Fillstyle Record -{ int l; - - if (!s) return -1; - l = (s->bitlen+7)/8; - - if (t) - { swf_ResetWriteBits(t); - - swf_SetBits(t,s->bits.fill,4); - swf_SetBits(t,s->bits.line,4); - swf_SetBlock(t,s->data,l); - - swf_ResetWriteBits(t); - } - return l+1; -} - -int swf_SetFillStyle(TAG * t,FILLSTYLE * f) -{ if ((!t)||(!f)) return -1; - swf_SetU8(t,f->type); - - switch (f->type) - { case FILL_SOLID: - if (swf_GetTagID(t)!=ST_DEFINESHAPE3) swf_SetRGB(t,&f->color); - else swf_SetRGBA(t,&f->color); - break; - - case FILL_TILED: - case FILL_CLIPPED: - swf_SetU16(t,f->id_bitmap); - swf_SetMatrix(t,&f->m); - break; - case FILL_LINEAR: - case FILL_RADIAL: - swf_SetMatrix(t,&f->m); - swf_SetGradient(t,&f->gradient,/*alpha?*/t->id==ST_DEFINESHAPE3?1:0); - break; - } - - return 0; -} - -int swf_SetLineStyle(TAG * t,LINESTYLE * l) -{ if ((!l)||(!t)) return -1; - swf_SetU16(t,l->width); - - if (swf_GetTagID(t)!=ST_DEFINESHAPE3) swf_SetRGB(t,&l->color); - else swf_SetRGBA(t,&l->color); - - return 0; -} - -int swf_SetShapeStyleCount(TAG * t,U16 n) -{ if (n>254) - { swf_SetU8(t,0xff); - swf_SetU16(t,n); - return 3; - } - else - { swf_SetU8(t,(U8)n); - return 1; - } -} - -int swf_SetShapeStyles(TAG * t,SHAPE * s) -{ int i,l; - if (!s) return -1; - - l = 0; - l += swf_SetShapeStyleCount(t,s->fillstyle.n); - - for (i=0;ifillstyle.n;i++) - l+=swf_SetFillStyle(t,&s->fillstyle.data[i]); - - l += swf_SetShapeStyleCount(t,s->linestyle.n); - - for (i=0;ilinestyle.n;i++) - l+=swf_SetLineStyle(t,&s->linestyle.data[i]); - - return l; -} - -int swf_ShapeCountBits(SHAPE * s,U8 * fbits,U8 * lbits) -{ if (!s) return -1; - s->bits.fill = swf_CountUBits(s->fillstyle.n, 0); - s->bits.line = swf_CountUBits(s->linestyle.n, 0); - if (fbits) fbits[0] = s->bits.fill; - if (lbits) lbits[0] = s->bits.line; - return 0; -} - -int swf_SetShapeBits(TAG * t,SHAPE * s) -{ if ((!t)||(!s)) return -1; - swf_ResetWriteBits(t); - swf_SetBits(t,s->bits.fill,4); - swf_SetBits(t,s->bits.line,4); - return 0; -} - -int swf_SetShapeHeader(TAG * t,SHAPE * s) -{ int res; - res = swf_SetShapeStyles(t,s); - if (res>=0) res = swf_ShapeCountBits(s,NULL,NULL); - if (res>=0) res = swf_SetShapeBits(t,s); - return res; -} - -int swf_ShapeAddFillStyle(SHAPE * s,U8 type,MATRIX * m,RGBA * color,U16 id_bitmap, GRADIENT*gradient) -{ RGBA def_c; - MATRIX def_m; - GRADIENT def_g; - - // handle defaults - - if (!s) return -1; - if (!color) - { color = &def_c; - def_c.a = 0xff; - def_c.r = def_c.g = def_c.b = 0; - } - if (!m) - { m = &def_m; - swf_GetMatrix(NULL,m); - } - if(!gradient) - { - gradient = &def_g; - swf_GetGradient(NULL, gradient, 1); - } - - // handle memory - - if (s->fillstyle.data) - { FILLSTYLE * xnew = (FILLSTYLE *)rfx_realloc(s->fillstyle.data,(s->fillstyle.n+1)*sizeof(FILLSTYLE)); - if (!xnew) return -1; - s->fillstyle.data = xnew; - } - else - { s->fillstyle.data = (FILLSTYLE *)rfx_alloc(sizeof(FILLSTYLE)); - s->fillstyle.n = 0; - if (!s->fillstyle.data) return -1; - } - - // set fillstyle - - s->fillstyle.data[s->fillstyle.n].type = type; - s->fillstyle.data[s->fillstyle.n].id_bitmap = id_bitmap; - memcpy(&s->fillstyle.data[s->fillstyle.n].m,m,sizeof(MATRIX)); - memcpy(&s->fillstyle.data[s->fillstyle.n].color,color,sizeof(RGBA)); - memcpy(&s->fillstyle.data[s->fillstyle.n].gradient,gradient,sizeof(GRADIENT)); - - return (++s->fillstyle.n); -} -int swf_ShapeAddFillStyle2(SHAPE * s,FILLSTYLE*fs) -{ - return swf_ShapeAddFillStyle(s, fs->type, &fs->m, &fs->color, fs->id_bitmap, &fs->gradient); -} - -int swf_ShapeAddSolidFillStyle(SHAPE * s,RGBA * color) -{ return swf_ShapeAddFillStyle(s,FILL_SOLID,NULL,color,0,0); -} - -int swf_ShapeAddBitmapFillStyle(SHAPE * s,MATRIX * m,U16 id_bitmap,int clip) -{ return swf_ShapeAddFillStyle(s,clip?FILL_CLIPPED:FILL_TILED,m,NULL,id_bitmap,0); -} - -int swf_ShapeAddGradientFillStyle(SHAPE * s,MATRIX * m,GRADIENT* gradient,int radial) -{ return swf_ShapeAddFillStyle(s,radial?FILL_RADIAL:FILL_LINEAR,m,NULL,0,gradient); -} - -int swf_ShapeAddLineStyle(SHAPE * s,U16 width,RGBA * color) -{ RGBA def; - if (!s) return -1; - if (!color) - { color = &def; - def.a = 0xff; - def.r = def.g = def.b = 0; - } - if (s->linestyle.data) - { LINESTYLE * xnew = (LINESTYLE *)rfx_realloc(s->linestyle.data,(s->linestyle.n+1)*sizeof(LINESTYLE)); - if (!xnew) return -1; - s->linestyle.data = xnew; - } - else - { s->linestyle.data = (LINESTYLE *)rfx_alloc(sizeof(LINESTYLE)); - s->linestyle.n = 0; - if (!s->linestyle.data) return -1; - } - - s->linestyle.data[s->linestyle.n].width = width; - memcpy(&s->linestyle.data[s->linestyle.n].color,color,sizeof(RGBA)); - - return (++s->linestyle.n); -} - -int swf_ShapeSetMove(TAG * t,SHAPE * s,S32 x,S32 y) -{ U8 b; - if (!t) return -1; - swf_SetBits(t,0,1); - swf_SetBits(t,SF_MOVETO,5); - - b = swf_CountBits(x,0); - b = swf_CountBits(y,b); - - if(b>31) { - fprintf(stderr, "Warning: bad moveTo (%f,%f)\n", x/20.0, y/20.0); - b=31; - } - - swf_SetBits(t,b,5); - swf_SetBits(t,x,b); - swf_SetBits(t,y,b); - - return 0; -} - -int swf_ShapeSetStyle(TAG * t,SHAPE * s,int line,int fill0,int fill1) -{ if ((!t)||(!s)) return -1; - - swf_SetBits(t,0,1); - swf_SetBits(t,(line?SF_LINE:0)|(fill0?SF_FILL0:0)|(fill1?SF_FILL1:0),5); - - if (fill0) swf_SetBits(t,fill0,s->bits.fill); - if (fill1) swf_SetBits(t,fill1,s->bits.fill); - if (line) swf_SetBits(t,line ,s->bits.line); - - return 0; -} - -/* TODO: sometimes we want to set fillstyle 0, as that's the empty fill - used for line drawings. At the moment, we can't, as 0 fill be considered - nonexistent and therefore not set. - these defines are a workaround (they also reduce the maximal number of - fill styles to 32768) - */ -#define UNDEFINED_COORD 0x7fffffff - -int swf_ShapeSetAll(TAG * t,SHAPE * s,S32 x,S32 y,int line,int fill0,int fill1) -{ U8 b; - U8 hasmove = 0; - if ((!t)||(!s)) return -1; - - if(x!=UNDEFINED_COORD || y!=UNDEFINED_COORD) - hasmove=1; - - swf_SetBits(t,0,1); - swf_SetBits(t,(hasmove?SF_MOVETO:0)|(line?SF_LINE:0)|(fill0?SF_FILL0:0)|(fill1?SF_FILL1:0),5); - - if(hasmove) { - b = swf_CountBits(x,0); - b = swf_CountBits(y,b); - swf_SetBits(t,b,5); - swf_SetBits(t,x,b); - swf_SetBits(t,y,b); - } - - if (fill0) swf_SetBits(t,fill0,s->bits.fill); - if (fill1) swf_SetBits(t,fill1,s->bits.fill); - if (line) swf_SetBits(t,line ,s->bits.line); - - return 0; -} - -int swf_ShapeSetEnd(TAG * t) -{ if (!t) return -1; - swf_SetBits(t,0,6); - swf_ResetWriteBits(t); - return 0; -} - -int swf_ShapeSetLine(TAG * t,SHAPE * s,S32 x,S32 y) -{ - U8 b; - if (!t) return -1; - - b = swf_CountBits(x,2); - b = swf_CountBits(y,b); - if (b<2) b=2; - if(b >= 18) { - if(b > 18 + 6) { - /* do not split into more than 64 segments. If the line is *that* long, something's broken */ - fprintf(stderr, "Warning: Line to %.2f,%.2f is too long (%d bits)\n", (double)x,(double)y, b); - return -1; - } else { - /* split line */ - int x1,y1,x2,y2; - if(x>=0) { x1 = x/2;x2 = (x+1)/2;} - else { x1 = x/2;x2 = (x-1)/2;} - if(y>=0) { y1 = y/2;y2 = (y+1)/2;} - else { y1 = y/2;y2 = (y-1)/2;} - swf_ShapeSetLine(t, s, x1,y1); - swf_ShapeSetLine(t, s, x2,y2); - return 0; - } - } - - if(x!=0 && y!=0) { //(!s)||((x!=0)&&(y!=0))) - swf_SetBits(t,3,2); // Straight Edge - swf_SetBits(t, b-2, 4); //Number of Bits in x/y - swf_SetBits(t,1,1); // Diagonal - swf_SetBits(t,x,b); - swf_SetBits(t,y,b); - } else if (x==0) { - swf_SetBits(t,3,2); // Straight Edge - swf_SetBits(t, b-2, 4); //Number of Bits in y - swf_SetBits(t,1,2); // Vertical - swf_SetBits(t,y,b); - } else { - swf_SetBits(t,3,2); // Straight Edge - swf_SetBits(t, b-2, 4); //Number of Bits in x - swf_SetBits(t,0,2); // Horizontal - swf_SetBits(t,x,b); - } - return 0; -} - -int swf_ShapeSetCurve(TAG * t,SHAPE * s,S32 x,S32 y,S32 ax,S32 ay) -{ - U8 b; - if (!t) return -1; - - b = swf_CountBits(ax,2); - b = swf_CountBits(ay,b); - b = swf_CountBits(x,b); - b = swf_CountBits(y,b); - - if(b >= 18) { - fprintf(stderr, "Bit overflow in swf_ShapeSetCurve- %d (%d,%d,%d,%d)\n", b, ax,ay,x,y); - return swf_ShapeSetLine(t, s, x+ax, y+ay); - } - - swf_SetBits(t,2,2); - swf_SetBits(t,b-2,4); - swf_SetBits(t,x,b); - swf_SetBits(t,y,b); - swf_SetBits(t,ax,b); - swf_SetBits(t,ay,b); - return 0; -} - -int swf_ShapeSetCircle(TAG * t,SHAPE * s,S32 x,S32 y,S32 rx,S32 ry) -{ double C1 = 0.2930; - double C2 = 0.4140; - double begin = 0.7070; - - if (!t) return -1; - - swf_ShapeSetMove(t,s,x+begin*rx,y+begin*ry); - swf_ShapeSetCurve(t,s, -C1*rx, C1*ry, -C2*rx, 0); - swf_ShapeSetCurve(t,s, -C2*rx, 0, -C1*rx, -C1*ry); - swf_ShapeSetCurve(t,s, -C1*rx, -C1*ry, 0, -C2*ry); - swf_ShapeSetCurve(t,s, 0, -C2*ry, C1*rx, -C1*ry); - swf_ShapeSetCurve(t,s, C1*rx, -C1*ry, C2*rx, 0); - swf_ShapeSetCurve(t,s, C2*rx, 0, C1*rx, C1*ry); - swf_ShapeSetCurve(t,s, C1*rx, C1*ry, 0, C2*ry); - swf_ShapeSetCurve(t,s, 0, C2*ry, -C1*rx, C1*ry); - - return 0; -} - -void dummycallback1(TAG*tag, int x, void*y) -{ -} - -// from swftools.c: -void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph); - -static void parseFillStyle(FILLSTYLE*dest, TAG*tag, int num) -{ - int type = swf_GetU8(tag); //type - dest->type = type; - if(type == 0) { - /* plain color */ - if(num >= 3) - swf_GetRGBA(tag, &dest->color); - else - swf_GetRGB(tag, &dest->color); - } - else if(type == 0x10 || type == 0x11 || type == 0x12 || type == 0x13) - { - /* linear/radial gradient fill */ - swf_ResetReadBits(tag); - swf_GetMatrix(tag, &dest->m); - swf_ResetReadBits(tag); - swf_GetGradient(tag, &dest->gradient, num>=3?1:0); - if(type == 0x13) - swf_GetU16(tag); - } - else if(type == 0x40 || type == 0x41 || type == 0x42 || type == 0x43) - { - /* bitmap fill */ - swf_ResetReadBits(tag); - dest->id_bitmap = swf_GetU16(tag); //id - swf_ResetReadBits(tag); //? - swf_GetMatrix(tag, &dest->m); - } - else { - fprintf(stderr, "rfxswf:swfshape.c Unknown fillstyle:0x%02x in tag %02d\n",type, tag->id); - } -} -static int parseFillStyleArray(TAG*tag, SHAPE2*shape) -{ - U16 count; - int t; - int num=0; - int fillstylestart = shape->numfillstyles; - int linestylestart = shape->numlinestyles; - - if(tag->id == ST_DEFINESHAPE) - num = 1; - else if(tag->id == ST_DEFINESHAPE2) - num = 2; - else if(tag->id == ST_DEFINESHAPE3) - num = 3; - else if(tag->id == ST_DEFINESHAPE4) - num = 4; - - count = swf_GetU8(tag); - if(count == 0xff && num>1) // defineshape2,3 only - count = swf_GetU16(tag); - - shape->numfillstyles += count; - if(shape->numfillstyles) { - shape->fillstyles = (FILLSTYLE*)rfx_realloc(shape->fillstyles, sizeof(FILLSTYLE)*shape->numfillstyles); - - for(t=fillstylestart;tnumfillstyles;t++) { - parseFillStyle(&shape->fillstyles[t], tag, num); - } - } - - swf_ResetReadBits(tag); - count = swf_GetU8(tag); // line style array - if(count == 0xff) - count = swf_GetU16(tag); - - shape->numlinestyles += count; - if(count) { - shape->linestyles = (LINESTYLE*)rfx_realloc(shape->linestyles, sizeof(LINESTYLE)*shape->numlinestyles); - /* TODO: should we start with 1 and insert a correct definition of the - "built in" linestyle 0? */ - for(t=linestylestart;tnumlinestyles;t++) - { - char fill = 0; - shape->linestyles[t].width = swf_GetU16(tag); - - if(num >= 4) { - U16 flags = swf_GetU16(tag); - if((flags & 0x30) == 0x20) - swf_GetU16(tag); // miter limit - if(flags & 0x08) { - fprintf(stderr, "Warning: Filled strokes parsing not yet fully supported\n"); - fill = 1; - } - } - - if(fill) { - FILLSTYLE f; - parseFillStyle(&f, tag, num); - shape->linestyles[t].color = f.color; - } else { - if(num >= 3) - swf_GetRGBA(tag, &shape->linestyles[t].color); - else - swf_GetRGB(tag, &shape->linestyles[t].color); - } - } - } - return 1; -} - -char swf_ShapeIsEmpty(SHAPE*s) -{ - if(!s || !s->data) return 1; - TAG _tag; - TAG* tag = &_tag; - memset(tag, 0, sizeof(TAG)); - tag->data = s->data; - tag->len = tag->memsize = (s->bitlen+7)/8; - tag->pos = 0; - - while(1) { - if(!swf_GetBits(tag, 1)) { - U16 flags = swf_GetBits(tag, 5); - if(!flags) break; - if(flags&1) { //move - int n = swf_GetBits(tag, 5); - swf_GetSBits(tag, n); //x - swf_GetSBits(tag, n); //y - } - if(flags&2) swf_GetBits(tag, s->bits.fill); - if(flags&4) swf_GetBits(tag, s->bits.fill); - if(flags&8) swf_GetBits(tag, s->bits.line); - if(flags&16) {return 0;} - } else { - return 0; - } - } - return 1; -} - -/* todo: merge this with swf_GetSimpleShape */ -static SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits, int version, SHAPE2*shape2) -{ - SHAPELINE _lines; - SHAPELINE*lines = &_lines; - - TAG _tag; - TAG* tag = &_tag; - int fill0 = 0; - int fill1 = 0; - int line = 0; - int x=0,y=0; - int linestyleadd=0; - int fillstyleadd=0; - - memset(tag, 0, sizeof(TAG)); - tag->data = data; - tag->len = tag->memsize = (bits+7)/8; - tag->pos = 0; - tag->id = version==1?ST_DEFINESHAPE:(version==2?ST_DEFINESHAPE2:(version==3?ST_DEFINESHAPE3:ST_DEFINESHAPE4)); - - lines->next = 0; - while(1) { - int flags; - flags = swf_GetBits(tag, 1); - if(!flags) { //style change - flags = swf_GetBits(tag, 5); - if(!flags) - break; - if(flags&1) { //move - int n = swf_GetBits(tag, 5); - x = swf_GetSBits(tag, n); //x - y = swf_GetSBits(tag, n); //y - } - if(flags&2) - fill0 = swf_GetBits(tag, fillbits) + fillstyleadd; - if(flags&4) - fill1 = swf_GetBits(tag, fillbits) + fillstyleadd; - if(flags&8) - line = swf_GetBits(tag, linebits) + linestyleadd; - if(flags&16) { - if(!shape2) { - fprintf(stderr, "rfxswf: Error: Additional fillstyles not supported\n");fflush(stderr); - enumerateUsedIDs_styles(tag, dummycallback1, 0, version, 0); - } else { - linestyleadd = shape2->numlinestyles; - fillstyleadd = shape2->numfillstyles; - if(!parseFillStyleArray(tag, shape2)) - return 0; - } - fillbits = swf_GetBits(tag, 4); - linebits = swf_GetBits(tag, 4); - } - if(flags&1) { //move - lines->next = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); - lines = lines->next; - lines->type = moveTo; - lines->x = x; - lines->y = y; - lines->sx = lines->sy = 0; - lines->fillstyle0 = fill0; - lines->fillstyle1 = fill1; - lines->linestyle = line; - lines->next = 0; - } - } else { - flags = swf_GetBits(tag, 1); - if(flags) { //straight edge - int n = swf_GetBits(tag, 4) + 2; - if(swf_GetBits(tag, 1)) { //line flag - x += swf_GetSBits(tag, n); //delta x - y += swf_GetSBits(tag, n); //delta y - } else { - int v=swf_GetBits(tag, 1); - int d; - d = swf_GetSBits(tag, n); //vert/horz - if(v) y += d; - else x += d; - } - lines->next = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); - lines = lines->next; - lines->type = lineTo; - lines->x = x; - lines->y = y; - lines->sx = lines->sy = 0; - lines->fillstyle0 = fill0; - lines->fillstyle1 = fill1; - lines->linestyle = line; - lines->next = 0; - } else { //curved edge - int n = swf_GetBits(tag, 4) + 2; - int x1,y1; - x += swf_GetSBits(tag, n); - y += swf_GetSBits(tag, n); - x1 = x; - y1 = y; - x += swf_GetSBits(tag, n); - y += swf_GetSBits(tag, n); - - lines->next = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); - lines = lines->next; - lines->type = splineTo; - lines->sx = x1; - lines->sy = y1; - lines->x = x; - lines->y = y; - lines->fillstyle0 = fill0; - lines->fillstyle1 = fill1; - lines->linestyle = line; - lines->next = 0; - } - } - } - return _lines.next; -} - -SRECT swf_GetShapeBoundingBox(SHAPE2*shape2) -{ - SRECT r; - SHAPELINE*l = shape2->lines; - int lastx=0,lasty=0; - int valid = 0; - r.xmin = r.ymin = SCOORD_MAX; - r.xmax = r.ymax = SCOORD_MIN; - - while(l) { - int t1; - if(l->linestyle>0) { - t1 = shape2->linestyles[l->linestyle - 1].width*3/2; - } else { - t1 = 0; - } - - if(l->type == lineTo || l->type == splineTo) - { - valid = 1; - if(lastx - t1 < r.xmin) r.xmin = lastx - t1; - if(lasty - t1 < r.ymin) r.ymin = lasty - t1; - if(lastx + t1 > r.xmax) r.xmax = lastx + t1; - if(lasty + t1 > r.ymax) r.ymax = lasty + t1; - if(l->x - t1 < r.xmin) r.xmin = l->x - t1; - if(l->y - t1 < r.ymin) r.ymin = l->y - t1; - if(l->x + t1 > r.xmax) r.xmax = l->x + t1; - if(l->y + t1 > r.ymax) r.ymax = l->y + t1; - if(l->type == splineTo) { - if(l->sx - t1 < r.xmin) r.xmin = l->sx - t1; - if(l->sy - t1 < r.ymin) r.ymin = l->sy - t1; - if(l->sx + t1 > r.xmax) r.xmax = l->sx + t1; - if(l->sy + t1 > r.ymax) r.ymax = l->sy + t1; - } - } - lastx = l->x; - lasty = l->y; - l = l->next; - } - if(!valid) memset(&r, 0, sizeof(SRECT)); - return r; -} - -void swf_Shape2Free(SHAPE2 * s) -{ - SHAPELINE*line = s->lines; - s->lines = 0; - while(line) { - SHAPELINE*next = line->next; - line->next = 0; - rfx_free(line); - line = next; - } - - if(s->linestyles) { - rfx_free(s->linestyles); - s->linestyles = 0; - } - if(s->fillstyles) { - rfx_free(s->fillstyles); - s->fillstyles = 0; - } - if(s->bbox) { - rfx_free(s->bbox); - s->bbox = 0; - } -} - -SHAPE2* swf_Shape2Clone(SHAPE2 * s) -{ - SHAPELINE*line = s->lines; - SHAPELINE*prev = 0; - SHAPE2*s2 = (SHAPE2*)rfx_alloc(sizeof(SHAPE2)); - memcpy(s2,s,sizeof(SHAPE2)); - s2->linestyles = (LINESTYLE*)rfx_alloc(sizeof(LINESTYLE)*s->numlinestyles); - memcpy(s2->linestyles, s->linestyles, sizeof(LINESTYLE)*s->numlinestyles); - s2->fillstyles = (FILLSTYLE*)rfx_alloc(sizeof(FILLSTYLE)*s->numfillstyles); - memcpy(s2->fillstyles, s->fillstyles, sizeof(FILLSTYLE)*s->numfillstyles); - - while(line) { - SHAPELINE*line2 = (SHAPELINE*)rfx_alloc(sizeof(SHAPELINE)); - memcpy(line2, line, sizeof(SHAPELINE)); - line2->next = 0; - if(prev) - prev->next = line2; - else - s2->lines = line2; - prev = line2; - line = line->next; - } - if(s->bbox) { - s2->bbox = (SRECT*)rfx_alloc(sizeof(SRECT)); - memcpy(s2->bbox, s->bbox, sizeof(SRECT)); - } - return s2; -} - -SHAPE2* swf_ShapeToShape2(SHAPE*shape) { - - SHAPE2*shape2 = (SHAPE2*)rfx_calloc(sizeof(SHAPE2)); - - shape2->numlinestyles = shape->linestyle.n; - if(shape2->numlinestyles) { - shape2->linestyles = (LINESTYLE*)rfx_alloc(sizeof(LINESTYLE)*shape->linestyle.n); - memcpy(shape2->linestyles, shape->linestyle.data, sizeof(LINESTYLE)*shape->linestyle.n); - } - - shape2->numfillstyles = shape->fillstyle.n; - if(shape2->numfillstyles) { - shape2->fillstyles = (FILLSTYLE*)rfx_alloc(sizeof(FILLSTYLE)*shape->fillstyle.n); - memcpy(shape2->fillstyles, shape->fillstyle.data, sizeof(FILLSTYLE)*shape->fillstyle.n); - } - - shape2->lines = swf_ParseShapeData(shape->data, shape->bitlen, shape->bits.fill, shape->bits.line, 1, 0); - shape2->bbox = 0; - return shape2; -}; - -void swf_ShapeSetBitmapRect(TAG*tag, U16 gfxid, int width, int height) -{ - SHAPE*shape; - MATRIX m; - RGBA rgb; - SRECT r; - int lines = 0; - int ls=0,fs; - swf_ShapeNew(&shape); - rgb.b = rgb.g = rgb.r = 0xff; - if(lines) - ls = swf_ShapeAddLineStyle(shape,20,&rgb); - swf_GetMatrix(NULL,&m); - m.sx = 20*65536; - m.sy = 20*65536; - - fs = swf_ShapeAddBitmapFillStyle(shape,&m,gfxid,0); - r.xmin = 0; - r.ymin = 0; - r.xmax = width*20; - r.ymax = height*20; - swf_SetRect(tag,&r); - - swf_SetShapeStyles(tag,shape); - swf_ShapeCountBits(shape,NULL,NULL); - swf_SetShapeBits(tag,shape); - - swf_ShapeSetAll(tag,shape,0,0,lines?ls:0,fs,0); - - swf_ShapeSetLine(tag,shape,width*20,0); - swf_ShapeSetLine(tag,shape,0,height*20); - swf_ShapeSetLine(tag,shape,-width*20,0); - swf_ShapeSetLine(tag,shape,0,-height*20); - swf_ShapeSetEnd(tag); - swf_ShapeFree(shape); -} - -void swf_ShapeSetRectangle(TAG*tag, U16 shapeid, int width, int height, RGBA*rgba) -{ - RGBA white={255,255,255,255}; - if(!rgba) { - rgba = &white; - } - SHAPE* s; - swf_ShapeNew(&s); - int fs = swf_ShapeAddSolidFillStyle(s, rgba); - swf_SetU16(tag,shapeid); - SRECT r; - r.xmin = 0; - r.xmax = 0; - r.ymin = width; - r.ymax = height; - swf_SetRect(tag,&r); - swf_SetShapeHeader(tag,s); - swf_ShapeSetAll(tag,s,0,0,0,fs,0); - swf_ShapeSetLine(tag,s,width,0); - swf_ShapeSetLine(tag,s,0,height); - swf_ShapeSetLine(tag,s,-width,0); - swf_ShapeSetLine(tag,s,0,-height); - swf_ShapeSetEnd(tag); - swf_ShapeFree(s); -} - -void swf_ShapeSetRectangleWithBorder(TAG*tag, U16 shapeid, int width, int height, RGBA*rgba, int linewidth, RGBA*linecolor) -{ - RGBA white={255,255,255,255}; - if(!rgba) { - rgba = &white; - } - SHAPE* s; - swf_ShapeNew(&s); - int fs = swf_ShapeAddSolidFillStyle(s, rgba); - int ls = swf_ShapeAddLineStyle(s, linewidth, linecolor); - swf_SetU16(tag,shapeid); - SRECT r; - r.xmin = 0; - r.xmax = 0; - r.ymin = width; - r.ymax = height; - swf_SetRect(tag,&r); - swf_SetShapeHeader(tag,s); - swf_ShapeSetAll(tag,s,0,0,ls,fs,0); - swf_ShapeSetLine(tag,s,width,0); - swf_ShapeSetLine(tag,s,0,height); - swf_ShapeSetLine(tag,s,-width,0); - swf_ShapeSetLine(tag,s,0,-height); - swf_ShapeSetEnd(tag); - swf_ShapeFree(s); -} - -void swf_Shape2ToShape(SHAPE2*shape2, SHAPE*shape) -{ - TAG*tag = swf_InsertTag(0,0); - SHAPELINE*l; - int newx=0,newy=0,lastx=0,lasty=0,oldls=0,oldfs0=0,oldfs1=0; - - memset(shape, 0, sizeof(SHAPE)); - - shape->linestyle.n = shape2->numlinestyles; - shape->linestyle.data = (LINESTYLE*)rfx_alloc(sizeof(LINESTYLE)*shape->linestyle.n); - memcpy(shape->linestyle.data, shape2->linestyles, sizeof(LINESTYLE)*shape->linestyle.n); - - shape->fillstyle.n = shape2->numfillstyles; - shape->fillstyle.data = (FILLSTYLE*)rfx_alloc(sizeof(FILLSTYLE)*shape->fillstyle.n); - memcpy(shape->fillstyle.data, shape2->fillstyles, sizeof(FILLSTYLE)*shape->fillstyle.n); - - swf_ShapeCountBits(shape,NULL,NULL); - - l = shape2->lines; - - while(l) { - int ls=0,fs0=0,fs1=0; - - if(l->type != moveTo) { - if(oldls != l->linestyle) {oldls = ls = l->linestyle;if(!ls) ls=0x8000;} - if(oldfs0 != l->fillstyle0) {oldfs0 = fs0 = l->fillstyle0;if(!fs0) fs0=0x8000;} - if(oldfs1 != l->fillstyle1) {oldfs1 = fs1 = l->fillstyle1;if(!fs1) fs1=0x8000;} - - if(ls || fs0 || fs1 || newx!=0x7fffffff || newy!=0x7fffffff) { - swf_ShapeSetAll(tag,shape,newx,newy,ls,fs0,fs1); - newx = 0x7fffffff; - newy = 0x7fffffff; - } - } - - if(l->type == lineTo) { - swf_ShapeSetLine(tag,shape,l->x-lastx,l->y-lasty); - } else if(l->type == splineTo) { - swf_ShapeSetCurve(tag,shape, l->sx-lastx,l->sy-lasty, l->x-l->sx,l->y-l->sy); - } - if(l->type == moveTo) { - newx = l->x; - newy = l->y; - } - - lastx = l->x; - lasty = l->y; - l = l->next; - } - swf_ShapeSetEnd(tag); - shape->data = tag->data; - shape->bitlen = tag->len*8; - free(tag); -} - -void swf_SetShape2(TAG*tag, SHAPE2*shape2) -{ - SHAPE shape; - swf_Shape2ToShape(shape2, &shape); - - swf_SetRect(tag,shape2->bbox); - swf_SetShapeStyles(tag, &shape); - //swf_ShapeCountBits(&shape,NULL,NULL); // done in swf_Shape2ToShape() - swf_SetShapeBits(tag,&shape); - - swf_SetBlock(tag, shape.data, (shape.bitlen+7)/8); -} - -void swf_ParseDefineShape(TAG*tag, SHAPE2*shape) -{ - int num = 0, id; - U16 fill,line; - SHAPELINE*l; - if(tag->id == ST_DEFINESHAPE) - num = 1; - else if(tag->id == ST_DEFINESHAPE2) - num = 2; - else if(tag->id == ST_DEFINESHAPE3) - num = 3; - else if(tag->id == ST_DEFINESHAPE4) - num = 4; - else { - fprintf(stderr, "parseDefineShape must be called with a shape tag"); - } - swf_SetTagPos(tag, 0); - - id = swf_GetU16(tag); //id - memset(shape, 0, sizeof(SHAPE2)); - shape->bbox = (SRECT*)rfx_alloc(sizeof(SRECT)); - swf_GetRect(tag, shape->bbox); - if(num>=4) { - SRECT r2; - swf_ResetReadBits(tag); - swf_GetRect(tag, &r2); // edge bounds - U8 flags = swf_GetU8(tag); // flags, &1: contains scaling stroke, &2: contains non-scaling stroke - } - - if(!parseFillStyleArray(tag, shape)) { - return; - } - - swf_ResetReadBits(tag); - fill = (U16)swf_GetBits(tag,4); - line = (U16)swf_GetBits(tag,4); - if(!fill && !line) { - fprintf(stderr, "fill/line bits are both zero\n"); - } - - shape->lines = swf_ParseShapeData(&tag->data[tag->pos], (tag->len - tag->pos)*8, fill, line, num, shape); - - l = shape->lines; -} - -static void free_lines(SHAPELINE* lines) -{ - if (lines->next) - free_lines(lines->next); - free(lines); -} - -void swf_RecodeShapeData(U8*data, int bitlen, int in_bits_fill, int in_bits_line, - U8**destdata, U32*destbitlen, int out_bits_fill, int out_bits_line) -{ - SHAPE2 s2; - SHAPE s; - SHAPELINE*line; - memset(&s2, 0, sizeof(s2)); - s2.lines = swf_ParseShapeData(data, bitlen, in_bits_fill, in_bits_line, 1, 0); - s2.numfillstyles = out_bits_fill?1<<(out_bits_fill-1):0; - s2.numlinestyles = out_bits_line?1<<(out_bits_line-1):0; - s2.fillstyles = (FILLSTYLE*)rfx_calloc(sizeof(FILLSTYLE)*s2.numfillstyles); - s2.linestyles = (LINESTYLE*)rfx_calloc(sizeof(LINESTYLE)*s2.numlinestyles); - - line = s2.lines; - while(line) { - if(line->fillstyle0 > s2.numfillstyles) line->fillstyle0 = 0; - if(line->fillstyle1 > s2.numfillstyles) line->fillstyle1 = 0; - if(line->linestyle > s2.numlinestyles) line->linestyle = 0; - line = line->next; - } - - swf_Shape2ToShape(&s2,&s); - - free_lines(s2.lines); - free(s2.fillstyles); - free(s2.linestyles); - free(s.fillstyle.data); - free(s.linestyle.data); - *destdata = s.data; - *destbitlen = s.bitlen; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfsound.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swfsound.c deleted file mode 100644 index d76baec51..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swfsound.c +++ /dev/null @@ -1,333 +0,0 @@ -/* swfaction.c - - SWF Sound handling routines - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2001, 2002 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef NO_MP3 - -#include "../rfxswf.h" - -#ifdef BLADEENC -#define HAVE_SOUND - -CodecInitOut * init = 0; -void swf_SetSoundStreamHead(TAG*tag, U16 avgnumsamples) -{ - U8 playbackrate = 3; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz - U8 playbacksize = 1; // 0 = 8 bit, 1 = 16 bit - U8 playbacktype = 0; // 0 = mono, 1 = stereo - U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser - U8 rate = 3; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz - U8 size = 1; // 0 = 8 bit, 1 = 16 bit - U8 type = 0; // 0 = mono, 1 = stereo - - CodecInitIn params; - memset(¶ms, 0, sizeof(params)); - params.frequency = 44100; //48000, 44100 or 32000 - params.mode = 3; //0 = Stereo, 2 = Dual Channel, 3 = Mono - params.emphasis = 0; //0 = None, 1 = 50/15 microsec, 3 = CCITT J.17 - params.bitrate = 128; //default is 128 (64 for mono) - init = codecInit(¶ms); - - swf_SetU8(tag,(playbackrate<<2)|(playbacksize<<1)|playbacktype); - swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); - swf_SetU16(tag,avgnumsamples); - - printf("numSamples:%d\n",init->nSamples); - printf("bufferSize:%d\n",init->bufferSize); -} - -void swf_SetSoundStreamBlock(TAG*tag, S16*samples, int numsamples, char first) -{ - char*buf; - int len = 0; - - buf = rfx_alloc(init->bufferSize); - if(!buf) - return; - - len = codecEncodeChunk (numsamples, samples, buf); - len += codecFlush (&buf[len]); - len += codecExit (&buf[len]); - - if(first) { - swf_SetU16(tag, numsamples); // number of samples - swf_SetU16(tag, 0); // seek - } - swf_SetBlock(tag, buf, len); - rfx_free(buf); -} -#endif - -void swf_SetSoundDefineRaw(TAG*tag, S16*samples, int numsamples) -{ - swf_SetU8(tag,(/*compression*/0<<4)|(/*rate*/3<<2)|(/*size*/1<<1)|/*mono*/0); - swf_SetU32(tag, numsamples); // 44100 -> 11025 - swf_SetBlock(tag, (U8*)samples, numsamples*2); -} - -/* TODO: find a better way to set these from the outside */ - -int swf_mp3_in_samplerate = 44100; -int swf_mp3_out_samplerate = 11025; -int swf_mp3_channels = 1; -int swf_mp3_bitrate = 32; - -#ifdef HAVE_LAME -#define HAVE_SOUND - -#include -#include - -static lame_global_flags*lame_flags; - -void null_errorf(const char *format, va_list ap) -{ -} - -static void initlame() -{ - unsigned char buf[4096]; - int bufsize = 1152*2; - - lame_flags = lame_init(); - - lame_set_in_samplerate(lame_flags, swf_mp3_in_samplerate); - lame_set_num_channels(lame_flags, swf_mp3_channels); - lame_set_scale(lame_flags, 0); - - // MPEG1 32, 44.1, 48khz - // MPEG2 16, 22.05, 24 - // MPEG2.5 8, 11.025, 12 - lame_set_out_samplerate(lame_flags, swf_mp3_out_samplerate); - - lame_set_quality(lame_flags, 0); - lame_set_mode(lame_flags, MONO/*3*/); - lame_set_brate(lame_flags, swf_mp3_bitrate); - //lame_set_compression_ratio(lame_flags, 11.025); - lame_set_bWriteVbrTag(lame_flags, 0); - - lame_init_params(lame_flags); - lame_init_bitstream(lame_flags); - - lame_set_errorf(lame_flags, null_errorf); - /* The first two flush calls to lame always fail, for - some reason. Do them here where they cause no damage. */ - lame_encode_flush_nogap(lame_flags, buf, bufsize); - //printf("init:flush_nogap():%d\n", len); - lame_encode_flush(lame_flags, buf, bufsize); - //printf("init:flush():%d\n", len); - lame_set_errorf(lame_flags, 0); -} - -void swf_SetSoundStreamHead(TAG*tag, int avgnumsamples) -{ - int len; - - U8 playbackrate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz - U8 playbacksize = 1; // 0 = 8 bit, 1 = 16 bit - U8 playbacktype = 0; // 0 = mono, 1 = stereo - U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser - U8 rate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz - U8 size = 1; // 0 = 8 bit, 1 = 16 bit - U8 type = 0; // 0 = mono, 1 = stereo - - if(swf_mp3_out_samplerate == 5512) playbackrate = rate = 0; // lame doesn't support this - else if(swf_mp3_out_samplerate == 11025) playbackrate = rate = 1; - else if(swf_mp3_out_samplerate == 22050) playbackrate = rate = 2; - else if(swf_mp3_out_samplerate == 44100) playbackrate = rate = 3; - else fprintf(stderr, "Invalid samplerate: %d\n", swf_mp3_out_samplerate); - - initlame(); - - swf_SetU8(tag,(playbackrate<<2)|(playbacksize<<1)|playbacktype); - swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); - swf_SetU16(tag,avgnumsamples); -} - -void swf_SetSoundStreamBlock(TAG*tag, S16*samples, int seek, char first) -{ - char*buf; - int len = 0; - int bufsize = 16384; - int numsamples = (int)(((swf_mp3_out_samplerate > 22050) ? 1152 : 576) * ((double)swf_mp3_in_samplerate/swf_mp3_out_samplerate)); - int fs = 0; - - buf = rfx_alloc(bufsize); - if(!buf) - return; - - if(first) { - fs = lame_get_framesize(lame_flags); - swf_SetU16(tag, fs * first); // samples per mp3 frame - swf_SetU16(tag, seek); // seek - } - - len += lame_encode_buffer(lame_flags, samples, samples, numsamples, &buf[len], bufsize-len); - len += lame_encode_flush_nogap(lame_flags, &buf[len], bufsize-len); - swf_SetBlock(tag, buf, len); - if(len == 0) { - fprintf(stderr, "error: mp3 empty block, %d samples, first:%d, framesize:%d\n", - numsamples, first, fs); - }/* else { - fprintf(stderr, "ok: mp3 nonempty block, %d samples, first:%d, framesize:%d\n", - numsamples, first, fs); - }*/ - rfx_free(buf); -} - -void swf_SetSoundStreamEnd(TAG*tag) -{ - lame_close (lame_flags); -} - -void swf_SetSoundDefine(TAG*tag, S16*samples, int num) -{ - char*buf; - int oldlen=0,len = 0; - int bufsize = 16384; - int blocksize = (int)(((swf_mp3_out_samplerate > 22050) ? 1152 : 576) * ((double)swf_mp3_in_samplerate/swf_mp3_out_samplerate)); - int t; - int blocks; - - U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser - U8 rate = 1; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz - U8 size = 1; // 0 = 8 bit, 1 = 16 bit - U8 type = 0; // 0 = mono, 1 = stereo - - if(swf_mp3_out_samplerate == 5512) rate = 0; - else if(swf_mp3_out_samplerate == 11025) rate = 1; - else if(swf_mp3_out_samplerate == 22050) rate = 2; - else if(swf_mp3_out_samplerate == 44100) rate = 3; - else fprintf(stderr, "Invalid samplerate: %d\n", swf_mp3_out_samplerate); - - blocks = num / (blocksize); - - swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); - - swf_SetU32(tag, (int)(tag,blocks*blocksize / - ((double)swf_mp3_in_samplerate/swf_mp3_out_samplerate)) // account for resampling - ); - - buf = rfx_alloc(bufsize); - if(!buf) - return; - - initlame(); - - swf_SetU16(tag, 0); //delayseek - for(t=0;tstop?SOUNDINFO_STOP:0) - |(info->nomultiple?SOUNDINFO_NOMULTIPLE:0) - |(info->envelopes?SOUNDINFO_HASENVELOPE:0) - |(info->loops?SOUNDINFO_HASLOOPS:0) - |(info->outpoint?SOUNDINFO_HASOUTPOINT:0) - |(info->inpoint?SOUNDINFO_HASINPOINT:0); - swf_SetU8(tag, flags); - if(flags&SOUNDINFO_HASINPOINT) - swf_SetU32(tag, info->inpoint); - if(flags&SOUNDINFO_HASOUTPOINT) - swf_SetU32(tag, info->outpoint); - if(flags&SOUNDINFO_HASLOOPS) - swf_SetU16(tag, info->loops); - if(flags&SOUNDINFO_HASENVELOPE) { - int t; - swf_SetU8(tag, info->envelopes); - for(t=0;tenvelopes;t++) { - swf_SetU32(tag, info->pos[t]); - swf_SetU16(tag, info->left[t]); - swf_SetU16(tag, info->right[t]); - } - } -} - - -void swf_SetSoundDefineMP3(TAG*tag, U8* data, unsigned length, - unsigned SampRate, - unsigned Channels, - unsigned NumFrames) -{ - U8 compression = 2; // 0 = raw, 1 = ADPCM, 2 = mp3, 3 = raw le, 6 = nellymoser - U8 rate; // 0 = 5.5 Khz, 1 = 11 Khz, 2 = 22 Khz, 3 = 44 Khz - U8 size = 1; // 0 = 8 bit, 1 = 16 bit - U8 type = Channels==2; // 0=mono, 1=stereo - - rate = (SampRate >= 40000) ? 3 - : (SampRate >= 19000) ? 2 - : (SampRate >= 8000) ? 1 - : 0; - - swf_SetU8(tag,(compression<<4)|(rate<<2)|(size<<1)|type); - - swf_SetU32(tag, NumFrames * 576); - - swf_SetU16(tag, 0); //delayseek - swf_SetBlock(tag, data, length); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swftext.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swftext.c deleted file mode 100644 index 62546db2a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swftext.c +++ /dev/null @@ -1,2162 +0,0 @@ -/* swftext.c - - Text and font routines - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2001 Rainer Böhme - Copyright (c) 2003,2004,2005,2006,2007,2008,2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../rfxswf.h" - -U32 readUTF8char(U8 ** text) -{ - U32 c = 0; - if (!(*(*text) & 0x80)) - return *((*text)++); - - /* 0000 0080-0000 07FF 110xxxxx 10xxxxxx */ - if (((*text)[0] & 0xe0) == 0xc0 && (*text)[1]) { - c = ((*text)[0] & 0x1f) << 6 | ((*text)[1] & 0x3f); - (*text) += 2; - return c; - } - /* 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx */ - if (((*text)[0] & 0xf0) == 0xe0 && (*text)[1] && (*text)[2]) { - c = ((*text)[0] & 0x0f) << 12 | ((*text)[1] & 0x3f) << 6 | ((*text)[2] & 0x3f); - (*text) += 3; - return c; - } - /* 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ - if (((*text)[0] & 0xf8) == 0xf0 && (*text)[1] && (*text)[2] - && (*text)[3]) { - c = ((*text)[0] & 0x07) << 18 | ((*text)[1] & 0x3f) << 12 | ((*text)[2] & 0x3f) << 6 | ((*text)[3] & 0x3f); - (*text) += 4; - return c; - } - /* 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ - if (((*text)[0] & 0xfc) == 0xf8 && (*text)[1] && (*text)[2] - && (*text)[3] - && (*text)[4]) { - c = ((*text)[0] & 0x03) << 24 | ((*text)[1] & 0x3f) << 18 | ((*text)[2] & 0x3f) << 12 | ((*text)[3] & 0x3f) << 6 | ((*text)[4] & 0x3f); - (*text) += 5; - return c; - } - /* 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx */ - if (((*text)[0] & 0xfe) == 0xfc && (*text)[1] && (*text)[2] - && (*text)[3] - && (*text)[4] && (*text)[5]) { - c = ((*text)[0] & 0x01) << 30 | ((*text)[1] & 0x3f) << 24 | - ((*text)[2] & 0x3f) << 18 | ((*text)[3] & 0x3f) << 12 | ((*text)[4] & 0x3f) << 6 | ((*text)[5] & 0x3f) << 6; - (*text) += 6; - return c; - } - return *((*text)++); -} - -#define TF_TEXTCONTROL 0x80 -#define TF_HASFONT 0x08 -#define TF_HASCOLOR 0x04 -#define TF_HASYOFFSET 0x02 -#define TF_HASXOFFSET 0x01 - -#define FF_WIDECODES 0x01 -#define FF_BOLD 0x02 -#define FF_ITALIC 0x04 -#define FF_ANSI 0x08 -#define FF_SHIFTJIS 0x10 -#define FF_UNICODE 0x20 - -#define FF2_BOLD 0x01 -#define FF2_ITALIC 0x02 -#define FF2_WIDECODES 0x04 -#define FF2_WIDEOFFSETS 0x08 -#define FF2_ANSI 0x10 -#define FF2_UNICODE 0x20 -#define FF2_SHIFTJIS 0x40 -#define FF2_LAYOUT 0x80 - -int swf_FontIsItalic(SWFFONT * f) -{ - return f->style & FONT_STYLE_ITALIC; -} - -int swf_FontIsBold(SWFFONT * f) -{ - return f->style & FONT_STYLE_BOLD; -} - -static const int WRITEFONTID = 0x4e46; // font id for WriteFont and ReadFont - -int swf_FontEnumerate(SWF * swf, void (*FontCallback) (void*, U16, U8 *), void*self) -{ - int n; - TAG *t; - if (!swf) - return -1; - t = swf->firstTag; - n = 0; - - while (t) { - if (swf_isFontTag(t)) { - n++; - if (FontCallback) { - U16 id; - int l; - U8 s[257]; - s[0] = 0; - swf_SetTagPos(t, 0); - - id = swf_GetU16(t); - if (swf_GetTagID(t) == ST_DEFINEFONT2 || swf_GetTagID(t) == ST_DEFINEFONTINFO || swf_GetTagID(t) == ST_DEFINEFONTINFO2) { - swf_GetU16(t); - l = swf_GetU8(t); - swf_GetBlock(t, s, l); - s[l] = 0; - } - - (FontCallback) (self, id, s); - } - } - t = swf_NextTag(t); - } - return n; -} - -int swf_FontExtract_DefineFont(int id, SWFFONT * f, TAG * t) -{ - U16 fid; - swf_SetTagPos(t, 0); - - fid = swf_GetU16(t); - if ((!id) || (id == fid)) { - U16 of; - int n, i; - - id = fid; - f->version = 1; - f->id = fid; - - of = swf_GetU16(t); - n = of / 2; - f->numchars = n; - f->glyph = (SWFGLYPH*)rfx_calloc(sizeof(SWFGLYPH) * n); - - for (i = 1; i < n; i++) - swf_GetU16(t); - for (i = 0; i < n; i++) - swf_GetSimpleShape(t, &f->glyph[i].shape); - } - return id; -} - -int swf_FontExtract_DefineFontInfo(int id, SWFFONT * f, TAG * t) -{ - U16 fid; - U16 maxcode; - U8 flags; - swf_SetTagPos(t, 0); - - fid = swf_GetU16(t); - if (fid == id) { - U8 l = swf_GetU8(t); - int i; - - if (f->version > 1) { - /* Especially with Flash MX, DefineFont2 may have FontInfo fields, - too. However, they only add little information to what's already - inside the DefineFont2 tag */ - return id; - } - - if (f->name) - rfx_free(f->name); - - f->name = (U8 *) rfx_alloc(l + 1); - swf_GetBlock(t, f->name, l); - f->name[l] = 0; - - flags = swf_GetU8(t); - if (flags & 2) - f->style |= FONT_STYLE_BOLD; - if (flags & 4) - f->style |= FONT_STYLE_ITALIC; - if (flags & 8) - f->encoding |= FONT_ENCODING_ANSI; - if (flags & 16) - f->encoding |= FONT_ENCODING_SHIFTJIS; - if (flags & 32) - f->encoding |= FONT_ENCODING_UNICODE; - - if (t->id == ST_DEFINEFONTINFO2) { - f->language = swf_GetU8(t); - } - - f->glyph2ascii = (U16 *) rfx_alloc(sizeof(U16) * f->numchars); - maxcode = 0; - for (i = 0; i < f->numchars; i++) { - f->glyph2ascii[i] = ((flags & FF_WIDECODES) ? swf_GetU16(t) : swf_GetU8(t)); - if (f->glyph2ascii[i] > maxcode) - maxcode = f->glyph2ascii[i]; - } - maxcode++; - if (maxcode < 256) - maxcode = 256; - f->maxascii = maxcode; - f->ascii2glyph = (int *) rfx_alloc(sizeof(int) * maxcode); - memset(f->ascii2glyph, -1, sizeof(int) * maxcode); - - for (i = 0; i < f->numchars; i++) - f->ascii2glyph[f->glyph2ascii[i]] = i; - } - return id; -} - -int swf_FontExtract_GlyphNames(int id, SWFFONT * f, TAG * tag) -{ - U16 fid; - swf_SetTagPos(tag, 0); - - fid = swf_GetU16(tag); - - if (fid == id) { - int num = swf_GetU16(tag); - int t; - f->glyphnames = (char**)rfx_alloc(sizeof(char *) * num); - for (t = 0; t < num; t++) { - f->glyphnames[t] = strdup(swf_GetString(tag)); - } - } - return id; -} - - -int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag) -{ - int t, glyphcount; - int maxcode; - int fid; - U32 offset_start; - U32 *offset; - U8 flags1, langcode, namelen; - swf_SetTagPos(tag, 0); - font->version = tag->id==ST_DEFINEFONT3?3:2; - fid = swf_GetU16(tag); - if (id && id != fid) - return id; - font->id = fid; - flags1 = swf_GetU8(tag); - langcode = swf_GetU8(tag); //reserved flags - - if (flags1 & 1) - font->style |= FONT_STYLE_BOLD; - if (flags1 & 2) - font->style |= FONT_STYLE_ITALIC; - if (flags1 & 16) - font->encoding |= FONT_ENCODING_ANSI; - if (flags1 & 32) - font->encoding |= FONT_ENCODING_UNICODE; - if (flags1 & 64) - font->encoding |= FONT_ENCODING_SHIFTJIS; - - namelen = swf_GetU8(tag); - font->name = (U8 *) rfx_alloc(namelen + 1); - font->name[namelen] = 0; - swf_GetBlock(tag, font->name, namelen); - glyphcount = swf_GetU16(tag); - font->numchars = glyphcount; - - font->glyph = (SWFGLYPH *) rfx_calloc(sizeof(SWFGLYPH) * glyphcount); - font->glyph2ascii = (U16 *) rfx_calloc(sizeof(U16) * glyphcount); - - offset = (U32*)rfx_calloc(sizeof(U32)*(glyphcount+1)); - offset_start = tag->pos; - - if (flags1 & 8) { // wide offsets - for (t = 0; t < glyphcount; t++) - offset[t] = swf_GetU32(tag); //offset[t] - - if (glyphcount) /* this _if_ is not in the specs */ - offset[glyphcount] = swf_GetU32(tag); // fontcodeoffset - else - offset[glyphcount] = tag->pos; - } else { - for (t = 0; t < glyphcount; t++) - offset[t] = swf_GetU16(tag); //offset[t] - - if (glyphcount) /* this _if_ is not in the specs */ - offset[glyphcount] = swf_GetU16(tag); // fontcodeoffset - else - offset[glyphcount] = tag->pos; - } - for (t = 0; t < glyphcount; t++) { - swf_SetTagPos(tag, offset[t]+offset_start); - swf_GetSimpleShape(tag, &(font->glyph[t].shape)); - } - - if(glyphcount) - swf_SetTagPos(tag, offset[glyphcount]+offset_start); - - free(offset); - - maxcode = 0; - for (t = 0; t < glyphcount; t++) { - int code; - if (flags1 & 4) // wide codes (always on for definefont3) - code = swf_GetU16(tag); - else - code = swf_GetU8(tag); - font->glyph2ascii[t] = code; - if (code > maxcode) - maxcode = code; - } - maxcode++; - if (maxcode < 256) - maxcode = 256; - font->maxascii = maxcode; - font->ascii2glyph = (int *) rfx_alloc(sizeof(int) * maxcode); - memset(font->ascii2glyph, -1, sizeof(int) * maxcode); - for (t = 0; t < glyphcount; t++) { - font->ascii2glyph[font->glyph2ascii[t]] = t; - } - - if (flags1 & 128) { // has layout - U16 kerningcount; - font->layout = (SWFLAYOUT *) rfx_alloc(sizeof(SWFLAYOUT)); - font->layout->ascent = swf_GetU16(tag); - font->layout->descent = swf_GetU16(tag); - font->layout->leading = swf_GetU16(tag); - for (t = 0; t < glyphcount; t++) { - S16 advance = swf_GetS16(tag); - font->glyph[t].advance = advance; - } - font->layout->bounds = (SRECT*)rfx_alloc(glyphcount * sizeof(SRECT)); - for (t = 0; t < glyphcount; t++) { - swf_ResetReadBits(tag); - swf_GetRect(tag, &font->layout->bounds[t]); - SRECT b = font->layout->bounds[t]; - if((b.xmin|b.xmax|b.ymin|b.ymax) == 0) { - // recalculate bounding box - SHAPE2 *shape2 = swf_ShapeToShape2(font->glyph[t].shape); - font->layout->bounds[t] = swf_GetShapeBoundingBox(shape2); - swf_Shape2Free(shape2);free(shape2); - } - } - - kerningcount = swf_GetU16(tag); - font->layout->kerningcount = kerningcount; - - font->layout->kerning = (SWFKERNING *) rfx_alloc(sizeof(SWFKERNING) * kerningcount); - if (kerningcount) { - font->layout->kerning = (SWFKERNING*)rfx_alloc(sizeof(*font->layout->kerning) * kerningcount); - for (t = 0; t < kerningcount; t++) { - if (flags1 & 4) { // wide codes - font->layout->kerning[t].char1 = swf_GetU16(tag); - font->layout->kerning[t].char2 = swf_GetU16(tag); - } else { - font->layout->kerning[t].char1 = swf_GetU8(tag); - font->layout->kerning[t].char2 = swf_GetU8(tag); - } - font->layout->kerning[t].adjustment = swf_GetS16(tag); - } - } - } - return font->id; -} - -int swf_FontExtract_DefineFontAlignZones(int id, SWFFONT * font, TAG * tag) -{ - U16 fid; - swf_SetTagPos(tag, 0); - fid = swf_GetU16(tag); - - if (fid == id) { - font->alignzone_flags = swf_GetU8(tag); - font->alignzones = rfx_calloc(sizeof(ALIGNZONE)*font->numchars); - int i=0; - while(tag->pos < tag->len) { - if(i>=font->numchars) - break; - int nr = swf_GetU8(tag); // should be 2 - if(nr!=1 && nr!=2) { - fprintf(stderr, "rfxswf: Can't parse alignzone tags with %d zones", nr); - break; - } - U16 x = swf_GetU16(tag); - U16 y = swf_GetU16(tag); - U16 dx = (nr==2)?swf_GetU16(tag):0xffff; - U16 dy = (nr==2)?swf_GetU16(tag):0xffff; - U8 xy = swf_GetU8(tag); - -#ifdef DEBUG_RFXSWF - if((!(xy&1) && (x!=0 || (dx!=0 && dx!=0xffff))) || - (!(xy&2) && (y!=0 || (dy!=0 && dy!=0xffff)))) { - fprintf(stderr, "Warning: weird combination of alignzone bits and values (%d x:%04x-%04x y:%04x-%04x)\n", xy, - x,dx,y,dy); - } -#endif - if(!(xy&1)) { - x = 0xffff; - dx = 0xffff; - } else if(!(xy&2)) { - y = 0xffff; - dy = 0xffff; - } - font->alignzones[i].x = x; - font->alignzones[i].y = y; - font->alignzones[i].dx = dx; - font->alignzones[i].dy = dy; - i++; - } - } - return id; -} - - -#define FEDTJ_PRINT 0x01 -#define FEDTJ_MODIFY 0x02 -#define FEDTJ_CALLBACK 0x04 - -static int -swf_FontExtract_DefineTextCallback(int id, SWFFONT * f, TAG * t, int jobs, - void (*callback) (void *self, - int *chars, int *xpos, int nr, int fontid, int fontsize, int xstart, int ystart, RGBA * color), void *self) -{ - U16 cid; - SRECT r; - MATRIX m; - U8 gbits, abits; - int fid = -1; - RGBA color; - int x = 0, y = 0; - int fontsize = 0; - - memset(&color, 0, sizeof(color)); - - swf_SetTagPos(t, 0); - - cid = swf_GetU16(t); - swf_GetRect(t, &r); - swf_GetMatrix(t, &m); - gbits = swf_GetU8(t); - abits = swf_GetU8(t); - - while (1) { - int flags, num; - flags = swf_GetU8(t); - if (!flags) - break; - - if (flags & TF_TEXTCONTROL) { - if (flags & TF_HASFONT) - fid = swf_GetU16(t); - if (flags & TF_HASCOLOR) { - color.r = swf_GetU8(t); // rgb - color.g = swf_GetU8(t); - color.b = swf_GetU8(t); - if (swf_GetTagID(t) == ST_DEFINETEXT2) - color.a = swf_GetU8(t); - else - color.a = 255; - } - if (flags & TF_HASXOFFSET) - x = swf_GetS16(t); - if (flags & TF_HASYOFFSET) - y = swf_GetS16(t); - if (flags & TF_HASFONT) - fontsize = swf_GetU16(t); - } - - num = swf_GetU8(t); - if (!num) - break; - - { - int i; - int buf[256]; - int advance[256]; - int xpos = 0; - for (i = 0; i < num; i++) { - int glyph; - int adv = 0; - advance[i] = xpos; - glyph = swf_GetBits(t, gbits); - adv = swf_GetBits(t, abits); - xpos += adv; - - if (id == fid) { - if (jobs & FEDTJ_PRINT) { - int code = f->glyph2ascii[glyph]; - printf("%lc", code); - } - if (jobs & FEDTJ_MODIFY) - f->glyph[glyph].advance = adv * 20; //? - } - - buf[i] = glyph; - } - if ((id == fid) && (jobs & FEDTJ_PRINT)) - printf("\n"); - if (jobs & FEDTJ_CALLBACK) - callback(self, buf, advance, num, fid, fontsize, x, y, &color); - x += xpos; - } - } - - return id; -} - -int swf_ParseDefineText(TAG * tag, - void (*callback) (void *self, int *chars, int *xpos, int nr, int fontid, int fontsize, int xstart, int ystart, RGBA * color), void *self) -{ - return swf_FontExtract_DefineTextCallback(-1, 0, tag, FEDTJ_CALLBACK, callback, self); -} - -int swf_FontExtract_DefineText(int id, SWFFONT * f, TAG * t, int jobs) -{ - return swf_FontExtract_DefineTextCallback(id, f, t, jobs, 0, 0); -} - -typedef struct _usagetmp { - SWFFONT*font; - int lastx,lasty; - int last; -} usagetmp_t; -static void updateusage(void *self, int *chars, int *xpos, int nr, - int fontid, int fontsize, int xstart, int ystart, RGBA * color) -{ - usagetmp_t*u = (usagetmp_t*)self; - if(!u->font->use) { - swf_FontInitUsage(u->font); - } - if(fontid!=u->font->id) - return; - - int t; - for(t=0;tu->font->numchars) - continue; - swf_FontUseGlyph(u->font, c, fontsize); - if(u->lasty == y && x>=u->lastx-200 && abs(u->lastx-x)<200 && - u->last!=c && !swf_ShapeIsEmpty(u->font->glyph[u->last].shape) && - !swf_ShapeIsEmpty(u->font->glyph[c].shape)) - { - swf_FontUsePair(u->font, u->last, c); - } - u->lasty = y; - /* FIXME: do we still need to divide advance by 20 for definefont3? */ - u->lastx = x + (u->font->glyph[c].advance*fontsize/20480); - u->last = c; - } -} - -void swf_FontUpdateUsage(SWFFONT*f, TAG* tag) -{ - usagetmp_t u; - u.font = f; - u.lastx = -0x80000000; - u.lasty = -0x80000000; - u.last = 0; - swf_ParseDefineText(tag, updateusage, &u); -} - -int swf_FontExtract(SWF * swf, int id, SWFFONT * *font) -{ - TAG *t; - SWFFONT *f; - - if ((!swf) || (!font)) - return -1; - - f = (SWFFONT *) rfx_calloc(sizeof(SWFFONT)); - - t = swf->firstTag; - - while (t) { - int nid = 0; - switch (swf_GetTagID(t)) { - case ST_DEFINEFONT: - nid = swf_FontExtract_DefineFont(id, f, t); - break; - - case ST_DEFINEFONT2: - case ST_DEFINEFONT3: - nid = swf_FontExtract_DefineFont2(id, f, t); - break; - - case ST_DEFINEFONTALIGNZONES: - nid = swf_FontExtract_DefineFontAlignZones(id, f, t); - break; - - case ST_DEFINEFONTINFO: - case ST_DEFINEFONTINFO2: - nid = swf_FontExtract_DefineFontInfo(id, f, t); - break; - - case ST_DEFINETEXT: - case ST_DEFINETEXT2: - if(!f->layout) { - nid = swf_FontExtract_DefineText(id, f, t, FEDTJ_MODIFY); - } - if(f->version>=3 && f->layout) - swf_FontUpdateUsage(f, t); - break; - - case ST_GLYPHNAMES: - nid = swf_FontExtract_GlyphNames(id, f, t); - break; - } - if (nid > 0) - id = nid; - t = swf_NextTag(t); - } - if (f->id != id) { - rfx_free(f); - f = 0; - } - font[0] = f; - return 0; -} - -int swf_FontSetID(SWFFONT * f, U16 id) -{ - if (!f) - return -1; - f->id = id; - return 0; -} - -void swf_LayoutFree(SWFLAYOUT * l) -{ - if (l) { - if (l->kerning) - rfx_free(l->kerning); - l->kerning = NULL; - if (l->bounds) - rfx_free(l->bounds); - l->bounds = NULL; - } - rfx_free(l); -} - - -static void font_freeglyphnames(SWFFONT*f) -{ - if (f->glyphnames) - { - int t; - for (t = 0; t < f->numchars; t++) - { - if (f->glyphnames[t]) - { - rfx_free(f->glyphnames[t]); - f->glyphnames[t] = 0; - } - } - rfx_free(f->glyphnames); - f->glyphnames = 0; - } -} -static void font_freeusage(SWFFONT*f) -{ - if (f->use) { - if(f->use->chars) { - rfx_free(f->use->chars);f->use->chars = 0; - } - if(f->use->neighbors) { - rfx_free(f->use->neighbors);f->use->neighbors = 0; - } - if(f->use->neighbors_hash) { - rfx_free(f->use->neighbors_hash);f->use->neighbors_hash = 0; - } - rfx_free(f->use); f->use = 0; - } -} -static void font_freelayout(SWFFONT*f) -{ - if (f->layout) { - swf_LayoutFree(f->layout); - f->layout = 0; - } -} -static void font_freename(SWFFONT*f) -{ - if (f->name) { - rfx_free(f->name); - f->name = 0; - } -} - -int swf_FontReduce_old(SWFFONT * f) -{ - int i, j; - int max_unicode = 0; - if ((!f) || (!f->use) || f->use->is_reduced) - return -1; - - j = 0; - - for (i = 0; i < f->numchars; i++) { - if (f->glyph[i].shape && f->use->chars[i]) { - f->glyph2ascii[j] = f->glyph2ascii[i]; - f->glyph[j] = f->glyph[i]; - f->use->chars[i] = j; - j++; - } else { - f->glyph2ascii[i] = 0; - if(f->glyph[i].shape) { - swf_ShapeFree(f->glyph[i].shape); - f->glyph[i].shape = 0; - f->glyph[i].advance = 0; - } - f->use->chars[i] = -1; - j++; //TODO: remove - } - } - for (i = 0; i < f->maxascii; i++) { - if(f->use->chars[f->ascii2glyph[i]]<0) { - f->ascii2glyph[i] = -1; - } else { - f->ascii2glyph[i] = f->use->chars[f->ascii2glyph[i]]; - max_unicode = i; - } - } - f->maxascii = max_unicode; - f->use->is_reduced = 1; - f->numchars = j; - font_freelayout(f); - font_freeglyphnames(f); - font_freename(f); - return j; -} - -int swf_FontReduce_swfc(SWFFONT * f) -{ - int i, j; - int max_unicode = 0; - if ((!f) || (!f->use) || f->use->is_reduced) - return -1; - - font_freeglyphnames(f); - - j = 0; - for (i = 0; i < f->numchars; i++) { - if (f->glyph[i].shape && f->use->chars[i]) { - f->glyph2ascii[j] = f->glyph2ascii[i]; - if (f->layout) - f->layout->bounds[j] = f->layout->bounds[i]; - f->glyph[j] = f->glyph[i]; - f->use->chars[i] = j; - j++; - } else { - f->glyph2ascii[i] = 0; - if(f->glyph[i].shape) { - swf_ShapeFree(f->glyph[i].shape); - f->glyph[i].shape = 0; - f->glyph[i].advance = 0; - } - f->use->chars[i] = -1; - } - } - f->use->used_glyphs = j; - for (i = 0; i < f->maxascii; i++) { - if(f->ascii2glyph[i] > -1) { - if (f->use->chars[f->ascii2glyph[i]]<0) { - f->use->chars[f->ascii2glyph[i]] = 0; - f->ascii2glyph[i] = -1; - } else { - f->ascii2glyph[i] = f->use->chars[f->ascii2glyph[i]]; - f->use->chars[f->ascii2glyph[i]] = 1; - max_unicode = i + 1; - } - } - } - f->maxascii = max_unicode; - f->use->is_reduced = 1; - f->numchars = j; - font_freename(f); - return j; -} - -int swf_FontReduce(SWFFONT * f) -{ - int i; - int max_unicode = 0; - int max_glyph = 0; - if ((!f) || (!f->use) || f->use->is_reduced) - return -1; - - font_freelayout(f); - font_freeglyphnames(f); - - f->use->used_glyphs= 0; - for (i = 0; i < f->numchars; i++) { - if(!f->use->chars[i]) { - if(f->glyph2ascii) { - f->glyph2ascii[i] = 0; - } - if(f->glyph[i].shape) { - swf_ShapeFree(f->glyph[i].shape); - f->glyph[i].shape = 0; - f->glyph[i].advance = 0; - } -// f->use->used_glyphs++; - } else { - f->use->used_glyphs++; - max_glyph = i+1; - } - } - for (i = 0; i < f->maxascii; i++) { - if(f->ascii2glyph[i] > -1 && !f->use->chars[f->ascii2glyph[i]]) { - if(f->ascii2glyph) { - f->ascii2glyph[i] = -1; - } - } else { - max_unicode = i+1; - } - } - f->maxascii = max_unicode; - f->numchars = max_glyph; - font_freename(f); - return 0; -} - -static SWFFONT* font_to_sort; -int cmp_chars(const void*a, const void*b) -{ - int x = *(const int*)a; - int y = *(const int*)b; - return 0; -} - -void swf_FontSort(SWFFONT * font) -{ - int i, j; - int *newplace; - int *newpos; - if (!font) - return; - - newplace = (int*)rfx_alloc(sizeof(int) * font->numchars); - - for (i = 0; i < font->numchars; i++) { - newplace[i] = i; - } - //qsort(newplace, sizeof(newplace[0]), font->numchars, cmp_chars); - - for (i = 0; i < font->numchars; i++) - for (j = 0; j < i; j++) { - if (font->glyph2ascii[i] < font->glyph2ascii[j]) { - int n1, n2; - char *c1, *c2; - SWFGLYPH g1, g2; - SRECT r1, r2; - n1 = newplace[i]; - n2 = newplace[j]; - newplace[j] = n1; - newplace[i] = n2; - n1 = font->glyph2ascii[i]; - n2 = font->glyph2ascii[j]; - font->glyph2ascii[j] = n1; - font->glyph2ascii[i] = n2; - g1 = font->glyph[i]; - g2 = font->glyph[j]; - font->glyph[j] = g1; - font->glyph[i] = g2; - if (font->glyphnames) { - c1 = font->glyphnames[i]; - c2 = font->glyphnames[j]; - font->glyphnames[j] = c1; - font->glyphnames[i] = c2; - } - if (font->layout) { - r1 = font->layout->bounds[i]; - r2 = font->layout->bounds[j]; - font->layout->bounds[j] = r1; - font->layout->bounds[i] = r2; - } - } - } - newpos = (int*)rfx_alloc(sizeof(int) * font->numchars); - for (i = 0; i < font->numchars; i++) { - newpos[newplace[i]] = i; - } - for (i = 0; i < font->maxascii; i++) { - if (font->ascii2glyph[i] >= 0) - font->ascii2glyph[i] = newpos[font->ascii2glyph[i]]; - } - - rfx_free(newplace); - font->glyph2glyph = newpos; -} - -void swf_FontPrepareForEditText(SWFFONT * font) -{ - if (!font->layout) - swf_FontCreateLayout(font); - swf_FontSort(font); -} - -int swf_FontInitUsage(SWFFONT * f) -{ - if (!f) - return -1; - if(f->use) { - fprintf(stderr, "Usage initialized twice"); - return -1; - } - f->use = (FONTUSAGE*)rfx_calloc(sizeof(FONTUSAGE)); - f->use->smallest_size = 0xffff; - f->use->chars = (int*)rfx_calloc(sizeof(f->use->chars[0]) * f->numchars); - return 0; -} - -void swf_FontClearUsage(SWFFONT * f) -{ - if (!f || !f->use) - return; - rfx_free(f->use->chars); f->use->chars = 0; - rfx_free(f->use); f->use = 0; -} - -int swf_FontUse(SWFFONT * f, U8 * s) -{ - if( (!s)) - return -1; - while (*s) { - if(*s < f->maxascii && f->ascii2glyph[*s]>=0) - swf_FontUseGlyph(f, f->ascii2glyph[*s], /*FIXME*/0xffff); - s++; - } - return 0; -} - -int swf_FontUseUTF8(SWFFONT * f, const U8 * s, U16 size) -{ - if( (!s)) - return -1; - int ascii; - while (*s) - { - ascii = readUTF8char((U8**)&s); - if(ascii < f->maxascii && f->ascii2glyph[ascii]>=0) - swf_FontUseGlyph(f, f->ascii2glyph[ascii], size); - } - return 0; -} - -int swf_FontUseAll(SWFFONT* f) -{ - int i; - - if (!f->use) - swf_FontInitUsage(f); - for (i = 0; i < f->numchars; i++) - f->use->chars[i] = 1; - f->use->used_glyphs = f->numchars; - return 0; -} - -static unsigned hash2(int char1, int char2) -{ - unsigned hash = char1^(char2<<8); - hash += (hash << 3); - hash ^= (hash >> 11); - hash += (hash << 15); - return hash; -} -static void hashadd(FONTUSAGE*u, int char1, int char2, int nr) -{ - unsigned hash = hash2(char1, char2); - while(1) { - hash = hash%u->neighbors_hash_size; - if(!u->neighbors_hash[hash]) { - u->neighbors_hash[hash] = nr+1; - return; - } - hash++; - } -} -int swf_FontUseGetPair(SWFFONT * f, int char1, int char2) -{ - FONTUSAGE*u = f->use; - if(!u || !u->neighbors_hash_size) - return 0; - unsigned hash = hash2(char1, char2); - while(1) { - hash = hash%u->neighbors_hash_size; - int pos = u->neighbors_hash[hash]; - if(!pos) - return 0; - if(pos && - u->neighbors[pos-1].char1 == char1 && - u->neighbors[pos-1].char2 == char2) { - return pos; - } - hash++; - } - -} -void swf_FontUsePair(SWFFONT * f, int char1, int char2) -{ - if (!f->use) - swf_FontInitUsage(f); - FONTUSAGE*u = f->use; - - if(u->num_neighbors*3 >= u->neighbors_hash_size*2) { - if(u->neighbors_hash) { - free(u->neighbors_hash); - } - u->neighbors_hash_size = u->neighbors_hash_size?u->neighbors_hash_size*2:1024; - u->neighbors_hash = rfx_calloc(u->neighbors_hash_size*sizeof(int)); - int t; - for(t=0;tnum_neighbors;t++) { - hashadd(u, u->neighbors[t].char1, u->neighbors[t].char2, t); - } - } - - int nr = swf_FontUseGetPair(f, char1, char2); - if(!nr) { - if(u->num_neighbors == u->neighbors_size) { - u->neighbors_size += 4096; - u->neighbors = rfx_realloc(u->neighbors, sizeof(SWFGLYPHPAIR)*u->neighbors_size); - } - u->neighbors[u->num_neighbors].char1 = char1; - u->neighbors[u->num_neighbors].char2 = char2; - u->neighbors[u->num_neighbors].num = 1; - hashadd(u, char1, char2, u->num_neighbors); - u->num_neighbors++; - } else { - u->neighbors[nr-1].num++; - } -} - -int swf_FontUseGlyph(SWFFONT * f, int glyph, U16 size) -{ - if (!f->use) - swf_FontInitUsage(f); - if(glyph < 0 || glyph >= f->numchars) - return -1; - if(!f->use->chars[glyph]) - f->use->used_glyphs++; - f->use->chars[glyph] = 1; - if(size && size < f->use->smallest_size) - f->use->smallest_size = size; - return 0; -} - -int swf_FontSetDefine(TAG * t, SWFFONT * f) -{ - U16 *ofs = (U16 *) rfx_alloc(f->numchars * 2); - int p, i, j; - - if ((!t) || (!f)) - return -1; - swf_ResetWriteBits(t); - swf_SetU16(t, f->id); - - p = 0; - j = 0; - for (i = 0; i < f->numchars; i++) - if (f->glyph[i].shape) { - ofs[j++] = p; - p += swf_SetSimpleShape(NULL, f->glyph[i].shape); - } - - for (i = 0; i < j; i++) - swf_SetU16(t, ofs[i] + j * 2); - if (!j) { - fprintf(stderr, "rfxswf: warning: Font is empty\n"); - swf_SetU16(t, 0); - } - - for (i = 0; i < f->numchars; i++) - if (f->glyph[i].shape) - swf_SetSimpleShape(t, f->glyph[i].shape); - - swf_ResetWriteBits(t); - rfx_free(ofs); - return 0; -} - -static inline int fontSize(SWFFONT * font) -{ - int t; - int size = 0; - for (t = 0; t < font->numchars; t++) { - int l = 0; - if(font->glyph[t].shape) - l = (font->glyph[t].shape->bitlen + 7) / 8; - else - l = 8; - size += l + 1; - } - return size + (font->numchars + 1) * 2; -} - -int swf_FontSetDefine2(TAG * tag, SWFFONT * f) -{ - U8 flags = 0; - int t; - int pos; - swf_SetU16(tag, f->id); - - if (f->layout) flags |= 128; // haslayout - if (f->numchars > 256) - flags |= 4; // widecodes - if (f->style & FONT_STYLE_BOLD) - flags |= 1; // bold - if (f->style & FONT_STYLE_ITALIC) - flags |= 2; // italic - if (f->maxascii >= 256) - flags |= 4; //wide codecs - if (fontSize(f) > 65535) - flags |= 8; //wide offsets - flags |= 8 | 4; //FIXME: the above check doesn't work - - if (f->encoding & FONT_ENCODING_ANSI) - flags |= 16; // ansi - if (f->encoding & FONT_ENCODING_UNICODE) - flags |= 32; // unicode - if (f->encoding & FONT_ENCODING_SHIFTJIS) - flags |= 64; // shiftjis - - swf_SetU8(tag, flags); - swf_SetU8(tag, 0); //reserved flags - if (f->name) { - /* font name */ - swf_SetU8(tag, strlen((const char*)f->name)+1); - swf_SetBlock(tag, f->name, strlen((const char*)f->name)+1); - } else { - /* font name (="") */ - swf_SetU8(tag, 1); - swf_SetU8(tag, 0); - } - /* number of glyphs */ - swf_SetU16(tag, f->numchars); - /* font offset table */ - pos = tag->len; - for (t = 0; t <= f->numchars; t++) { - if (flags & 8) - swf_SetU32(tag, /* fontoffset */ 0); /*placeholder */ - else - swf_SetU16(tag, /* fontoffset */ 0); /*placeholder */ - } - - for (t = 0; t <= f->numchars; t++) { - if (flags & 8) { - tag->data[pos + t * 4] = (tag->len - pos); - tag->data[pos + t * 4 + 1] = (tag->len - pos) >> 8; - tag->data[pos + t * 4 + 2] = (tag->len - pos) >> 16; - tag->data[pos + t * 4 + 3] = (tag->len - pos) >> 24; - } else { - if (tag->len - pos > 65535) { - fprintf(stderr, "Internal error: Font too big and WideOffsets flag not set\n"); - exit(1); - } - tag->data[pos + t * 2] = (tag->len - pos); - tag->data[pos + t * 2 + 1] = (tag->len - pos) >> 8; - } - if (t < f->numchars) { - if(f->glyph[t].shape) { - swf_SetSimpleShape(tag, f->glyph[t].shape); - } else { - swf_SetU8(tag, 0); //non-edge(1) + edge flags(5) - } - } - } - - - /* font code table */ - for (t = 0; t < f->numchars; t++) { - if (flags & 4) { /* wide codes */ - if(f->glyph2ascii[t]) { - swf_SetU16(tag, f->glyph2ascii[t]); - } else { - swf_SetU16(tag, 0); - } - } else { - if(f->glyph2ascii[t]) { - swf_SetU8(tag, f->glyph2ascii[t]); - } else { - swf_SetU8(tag, 0); - } - } - } - - if (f->layout) { - swf_SetU16(tag, f->layout->ascent); - swf_SetU16(tag, f->layout->descent); - swf_SetU16(tag, 0); // flash ignores leading - - for (t = 0; t < f->numchars; t++) - swf_SetU16(tag, f->glyph[t].advance); - for (t = 0; t < f->numchars; t++) { - swf_ResetWriteBits(tag); - /* not used by flash, so leave this empty */ - SRECT b = {0,0,0,0}; - swf_SetRect(tag, &b); - } - swf_SetU16(tag, f->layout->kerningcount); - for (t = 0; t < f->layout->kerningcount; t++) { - if (flags & 4) { /* wide codes */ - swf_SetU16(tag, f->layout->kerning[t].char1); - swf_SetU16(tag, f->layout->kerning[t].char2); - } else { - swf_SetU8(tag, f->layout->kerning[t].char1); - swf_SetU8(tag, f->layout->kerning[t].char2); - } - swf_SetU16(tag, f->layout->kerning[t].adjustment); - } - } - return 0; -} - -void swf_FontAddLayout(SWFFONT * f, int ascent, int descent, int leading) -{ - f->layout = (SWFLAYOUT *) rfx_alloc(sizeof(SWFLAYOUT)); - f->layout->ascent = ascent; - f->layout->descent = descent; - f->layout->leading = leading; - f->layout->kerningcount = 0; - f->layout->kerning = 0; - f->layout->bounds = (SRECT *) rfx_calloc(sizeof(SRECT) * f->numchars); -} - -int swf_FontSetInfo(TAG * t, SWFFONT * f) -{ - int l, i; - U8 wide = 0; - U8 flags = 0; - if ((!t) || (!f)) - return -1; - swf_ResetWriteBits(t); - swf_SetU16(t, f->id); - l = f->name ? strlen((const char *)f->name) : 0; - if (l > 255) - l = 255; - swf_SetU8(t, l); - if (l) - swf_SetBlock(t, f->name, l); - if (f->numchars >= 256) - wide = 1; - - if (f->style & FONT_STYLE_BOLD) - flags |= 2; - if (f->style & FONT_STYLE_ITALIC) - flags |= 4; - if (f->style & FONT_ENCODING_ANSI) - flags |= 8; - if (f->style & FONT_ENCODING_SHIFTJIS) - flags |= 16; - if (f->style & FONT_ENCODING_UNICODE) - flags |= 32; - - swf_SetU8(t, (flags & 0xfe) | wide); - - for (i = 0; i < f->numchars; i++) { - if (f->glyph[i].shape) { - int g2a = f->glyph2ascii?f->glyph2ascii[i]:0; - wide ? swf_SetU16(t, g2a) : swf_SetU8(t, g2a); - } - } - - return 0; -} - -int swf_TextPrintDefineText(TAG * t, SWFFONT * f) -{ - int id = swf_GetTagID(t); - if ((id == ST_DEFINETEXT) || (id == ST_DEFINETEXT2)) - swf_FontExtract_DefineText(f->id, f, t, FEDTJ_PRINT); - else - return -1; - return 0; -} - -static void font_freealignzones(SWFFONT * f) -{ - if(f->alignzones) - free(f->alignzones); - f->alignzones = 0; -} - -void swf_FontFree(SWFFONT * f) -{ - int i; - if (!f) - return; - - if (f->glyph) - { - for (i = 0; i < f->numchars; i++) - if (f->glyph[i].shape) - { - swf_ShapeFree(f->glyph[i].shape); - f->glyph[i].shape = NULL; - } - rfx_free(f->glyph); - f->glyph = NULL; - } - if (f->ascii2glyph) - { - rfx_free(f->ascii2glyph); - f->ascii2glyph = NULL; - } - if (f->glyph2ascii) - { - rfx_free(f->glyph2ascii); - f->glyph2ascii = NULL; - } - if (f->glyph2glyph) { - rfx_free(f->glyph2glyph); - f->glyph2glyph = NULL; - } - font_freename(f); - font_freelayout(f); - font_freeglyphnames(f); - font_freeusage(f); - font_freealignzones(f); - - rfx_free(f); -} - -int swf_TextSetInfoRecord(TAG * t, SWFFONT * font, U16 size, RGBA * color, int x, int y) -{ - U8 flags; - if (!t) - return -1; - - flags = TF_TEXTCONTROL | (font ? TF_HASFONT : 0) | (color ? TF_HASCOLOR : 0) | (x ? TF_HASXOFFSET : 0) - | (y ? TF_HASYOFFSET : 0); - - swf_SetU8(t, flags); - if (font) - swf_SetU16(t, font->id); - if (color) { - if (swf_GetTagID(t) == ST_DEFINETEXT2) - swf_SetRGBA(t, color); - else - swf_SetRGB(t, color); - } - if (x) { - if(x != SET_TO_ZERO) { - if(x>32767 || x<-32768) - fprintf(stderr, "Warning: Horizontal char position overflow: %d\n", x); - swf_SetS16(t, x); - } else { - swf_SetS16(t, 0); - } - } - if (y) { - if(y != SET_TO_ZERO) { - if(y>32767 || y<-32768) - fprintf(stderr, "Warning: Vertical char position overflow: %d\n", y); - swf_SetS16(t, y); - } else { - swf_SetS16(t, 0); - } - } - if (font) - swf_SetU16(t, size); - - return 0; -} - -static int swf_TextCountBits2(SWFFONT * font, U8 * s, int scale, U8 * gbits, U8 * abits, char *encoding) -{ - U16 g, a; - char utf8 = 0; - if ((!s) || (!font) || ((!gbits) && (!abits)) || (!font->ascii2glyph)) - return -1; - g = a = 0; - - if (!strcmp(encoding, "UTF8")) - utf8 = 1; - else if (!strcmp(encoding, "iso-8859-1")) - utf8 = 0; - else - fprintf(stderr, "Unknown encoding: %s", encoding); - - while (*s) { - int glyph = -1, c; - - if (!utf8) - c = *s++; - else - c = readUTF8char(&s); - - if (c < font->maxascii) - glyph = font->ascii2glyph[c]; - if (glyph >= 0) { - g = swf_CountUBits(glyph, g); - a = swf_CountBits(((((U32) font->glyph[glyph].advance) * scale) / 20) / 100, a); - } - } - - if (gbits) - gbits[0] = (U8) g; - if (abits) - abits[0] = (U8) a; - return 0; -} - -static int swf_TextSetCharRecord2(TAG * t, SWFFONT * font, U8 * s, int scale, U8 gbits, U8 abits, char *encoding) -{ - int l = 0, pos; - char utf8 = 0; - - if ((!t) || (!font) || (!s) || (!font->ascii2glyph)) - return -1; - - if (!strcmp(encoding, "UTF8")) - utf8 = 1; - else if (!strcmp(encoding, "iso-8859-1")) - utf8 = 0; - else - fprintf(stderr, "Unknown encoding: %s", encoding); - - pos = t->len; - swf_SetU8(t, l); //placeholder - - while (*s) { - int g = -1, c; - - if (!utf8) - c = *s++; - else - c = readUTF8char(&s); - - if (c < font->maxascii) - g = font->ascii2glyph[c]; - if (g >= 0) { - swf_SetBits(t, g, gbits); - swf_SetBits(t, ((((U32) font->glyph[g].advance) * scale) / 20) / 100, abits); - l++; - /* We split into 127 characters per text field. - We could do 255, by the (formerly wrong) flash specification, - but some SWF parsing code out there still assumes that char blocks - are at max 127 characters, and it would save only a few bits. - */ - if (l == 0x7f) - break; - } - } - - PUT8(&t->data[pos], l); - - swf_ResetWriteBits(t); - return 0; -} - -int swf_TextCountBits(SWFFONT * font, U8 * s, int scale, U8 * gbits, U8 * abits) -{ - return swf_TextCountBits2(font, s, scale, gbits, abits, "iso-8859-1"); -} - -int swf_TextSetCharRecord(TAG * t, SWFFONT * font, U8 * s, int scale, U8 gbits, U8 abits) -{ - return swf_TextSetCharRecord2(t, font, s, scale, gbits, abits, "iso-8859-1"); -} - -int swf_TextCountBitsUTF8(SWFFONT * font, U8 * s, int scale, U8 * gbits, U8 * abits) -{ - return swf_TextCountBits2(font, s, scale, gbits, abits, "UTF8"); -} - -int swf_TextSetCharRecordUTF8(TAG * t, SWFFONT * font, U8 * s, int scale, U8 gbits, U8 abits) -{ - return swf_TextSetCharRecord2(t, font, s, scale, gbits, abits, "UTF8"); -} - -U32 swf_TextGetWidth(SWFFONT * font, U8 * s, int scale) -{ - U32 res = 0; - - if (font && s) { - while (s[0]) { - int g = -1; - if (*s < font->maxascii) - g = font->ascii2glyph[*s]; - if (g >= 0) - res += font->glyph[g].advance / 20; - s++; - } - if (scale) - res = (res * scale) / 100; - } - return res; -} - -SRECT swf_TextCalculateBBoxUTF8(SWFFONT * font, U8 * s, int scale) -{ - int xpos = 0; - int ypos = 0; - SRECT r; - swf_GetRect(0, &r); - while (*s) { - int c = readUTF8char(&s); - if(c==13 || c==10) { - if(s[0] == 10) { - s++; - } - xpos=0; - ypos+=font->layout->leading; - continue; - } - if (c < font->maxascii) { - int g = font->ascii2glyph[c]; - if (g >= 0) { - SRECT rn = font->layout->bounds[g]; - rn.xmin = (rn.xmin * scale) / 20 / 100 + xpos; - rn.xmax = (rn.xmax * scale) / 20 / 100 + xpos; - rn.ymin = (rn.ymin * scale) / 20 / 100 + ypos; - rn.ymax = (rn.ymax * scale) / 20 / 100 + ypos; - swf_ExpandRect2(&r, &rn); - xpos += (font->glyph[g].advance * scale) / 20 / 100; - } - } - } - return r; -} - - -SWFFONT *swf_ReadFont(const char *filename) -{ - int f; - SWF swf; - if (!filename) - return 0; - f = open(filename, O_RDONLY|O_BINARY); - - if (f < 0 || swf_ReadSWF(f, &swf) < 0) { - fprintf(stderr, "%s is not a valid SWF font file or contains errors.\n", filename); - close(f); - return 0; - } else { - SWFFONT *font; - close(f); - if (swf_FontExtract(&swf, WRITEFONTID, &font) < 0) - return 0; - swf_FreeTags(&swf); - return font; - } -} - -void swf_SetEditText(TAG * tag, U16 flags, SRECT r, const char *text, RGBA * color, int maxlength, U16 font, U16 height, EditTextLayout * layout, const char *variable) -{ - swf_SetRect(tag, &r); - swf_ResetWriteBits(tag); - - flags &= ~(ET_HASTEXT | ET_HASTEXTCOLOR | ET_HASMAXLENGTH | ET_HASFONT | ET_HASLAYOUT); - if (text) - flags |= ET_HASTEXT; - if (color) - flags |= ET_HASTEXTCOLOR; - if (maxlength) - flags |= ET_HASMAXLENGTH; - if (font) - flags |= ET_HASFONT; - if (layout) - flags |= ET_HASLAYOUT; - - swf_SetBits(tag, flags, 16); - - if (flags & ET_HASFONT) { - swf_SetU16(tag, font); //font - swf_SetU16(tag, height); //fontheight - } - if (flags & ET_HASTEXTCOLOR) { - swf_SetRGBA(tag, color); - } - if (flags & ET_HASMAXLENGTH) { - swf_SetU16(tag, maxlength); //maxlength - } - if (flags & ET_HASLAYOUT) { - swf_SetU8(tag, layout->align); //align - swf_SetU16(tag, layout->leftmargin); //left margin - swf_SetU16(tag, layout->rightmargin); //right margin - swf_SetU16(tag, layout->indent); //indent - swf_SetU16(tag, layout->leading); //leading - } - swf_SetString(tag, variable); - if (flags & ET_HASTEXT) - swf_SetString(tag, text); -} - -SRECT swf_SetDefineText(TAG * tag, SWFFONT * font, RGBA * rgb, const char *text, int scale) -{ - SRECT r; - U8 gbits, abits; - U8 *utext = (U8 *) strdup(text); - U8 *upos = utext; - int x = 0, y = 0; - int pos = 0; - int ystep = 0; - if (font->layout) { - r = swf_TextCalculateBBoxUTF8(font, (U8*)text, scale * 20); - ystep = font->layout->leading; - } else { - fprintf(stderr, "No layout information- can't compute text bbox accurately"); - /* Hm, without layout information, we can't compute a bounding - box. We could call swf_FontCreateLayout to create a layout, - but the caller probably doesn't want us to mess up his font - structure. - */ - r.xmin = r.ymin = 0; - r.xmax = r.ymax = 1024 * 20; - ystep = 100; - } - - swf_SetRect(tag, &r); - - /* The text matrix is pretty boring, as it doesn't apply to - individual characters, but rather whole text objects (or - at least whole char records- haven't tested). - So it can't do anything which we can't already do with - the placeobject tag we use for placing the text on the scene. - */ - swf_SetMatrix(tag, 0); - - swf_TextCountBitsUTF8(font, (U8*)text, scale * 20, &gbits, &abits); - swf_SetU8(tag, gbits); - swf_SetU8(tag, abits); - - while(*upos) { - U8*next = upos; - int count = 0; - - swf_TextSetInfoRecord(tag, font, (scale * 1024) / 100, rgb, x, y); //scale - x = 0; - - while(*next && *next!=13 && *next!=10 && count<127) { - readUTF8char(&next); - count++; - } - if(next[0] == 13 || next[0] == 10) { - x = SET_TO_ZERO; - y += ystep; - } - - if(next[0] == 13 && next[1] == 10) - next++; - - if(next[0] == 13 || next[0] == 10) { - *next = 0; - next++; - } - - /* now set the text params- notice that a font size of - 1024 (or 1024*20 for definefont3) means that the glyphs will - be displayed exactly as they would be in/with a defineshape. - This is not documented in the specs. - */ - - /* set the actual text- notice that we just pass our scale - parameter over, as TextSetCharRecord calculates with - percent, too */ - swf_TextSetCharRecordUTF8(tag, font, upos, scale * 20, gbits, abits); - - upos= next; - } - free(utext); - - swf_SetU8(tag, 0); - return r; -} - -void swf_FontCreateLayout(SWFFONT * f) -{ - S16 leading = 0; - int t; - if (f->layout) - return; - if (!f->numchars) - return; - - f->layout = (SWFLAYOUT *) rfx_calloc(sizeof(SWFLAYOUT)); - f->layout->bounds = (SRECT *) rfx_alloc(f->numchars * sizeof(SRECT)); - f->layout->ascent = 0; - f->layout->descent = 0; - - for (t = 0; t < f->numchars; t++) { - SHAPE2 *shape2; - SRECT bbox; - int width; - shape2 = swf_ShapeToShape2(f->glyph[t].shape); - if (!shape2) { - fprintf(stderr, "Shape parse error\n"); - exit(1); - } - bbox = swf_GetShapeBoundingBox(shape2); - swf_Shape2Free(shape2); - f->layout->bounds[t] = bbox; - - width = (bbox.xmax); - - /* The following is a heuristic- it may be that extractfont_DefineText - has already found out some widths for individual characters (from the way - they are used)- we now have to guess whether that width might be possible, - which is the case if it isn't either much too big or much too small */ - if (width > f->glyph[t].advance * 3 / 2 || width < f->glyph[t].advance / 2) - f->glyph[t].advance = width; - - if (-bbox.ymin > f->layout->ascent) - f->layout->ascent = -bbox.ymin; - if (bbox.ymax > f->layout->descent) - f->layout->descent = bbox.ymax; - } -} - -void swf_DrawText(drawer_t * draw, SWFFONT * font, int size, const char *text) -{ - U8 *s = (U8 *) text; - int advance = 0; - while (*s) { - SHAPE *shape; - SHAPE2 *shape2; - SHAPELINE *l; - U32 c = readUTF8char(&s); - int g = font->ascii2glyph[c]; - shape = font->glyph[g].shape; - if (((int) g) < 0) { - fprintf(stderr, "No char %d in font %s\n", c, font->name ? (char *) font->name : "?"); - continue; - } - shape2 = swf_ShapeToShape2(shape); - l = shape2->lines; - while (l) { - if (l->type == moveTo) { - FPOINT to; - to.x = l->x * size / 100.0 / 20.0 + advance; - to.y = l->y * size / 100.0 / 20.0; - draw->moveTo(draw, &to); - } else if (l->type == lineTo) { - FPOINT to; - to.x = l->x * size / 100.0 / 20.0 + advance; - to.y = l->y * size / 100.0 / 20.0; - draw->lineTo(draw, &to); - } else if (l->type == splineTo) { - FPOINT mid, to; - mid.x = l->sx * size / 100.0 / 20.0 + advance; - mid.y = l->sy * size / 100.0 / 20.0; - to.x = l->x * size / 100.0 / 20.0 + advance; - to.y = l->y * size / 100.0 / 20.0; - draw->splineTo(draw, &mid, &to); - } - l = l->next; - } - swf_Shape2Free(shape2); - advance += font->glyph[g].advance * size / 100.0 / 20.0; - } -} - -void swf_WriteFont_AS3(SWFFONT * font, char *filename) -{ - if(!font->layout) - swf_FontCreateLayout(font); - - SWF swf; - memset(&swf, 0, sizeof(SWF)); - swf.fileVersion = 9; - swf.frameRate = 0x4000; - swf.movieSize.xmax = 200; - swf.movieSize.ymax = 200; - - if(!font->id) font->id=1; - - TAG *tag; - swf.firstTag = tag = swf_InsertTag(tag, ST_DEFINEFONT3); - swf_FontSetDefine2(tag, font); - - char*name = font->name?(char*)font->name:"font"; - - tag = swf_InsertTag(tag, ST_NAMECHARACTER); - swf_SetU16(tag, font->id); - swf_SetString(tag, name); - tag = swf_InsertTag(tag, ST_EXPORTASSETS); - swf_SetU16(tag, 1); - swf_SetU16(tag, font->id); - swf_SetString(tag, name); - tag = swf_AddAS3FontDefine(tag, font->id, (char*)font->name); - - tag = swf_InsertTag(tag, ST_END); - swf_SaveSWF(&swf, filename); - swf_FreeTags(&swf); -} - -void swf_WriteFont(SWFFONT * font, char *filename) -{ - if(!font->layout) - swf_FontCreateLayout(font); - - char viewer = 1; - U16 id = 1; - U16 depth = 1; - - font->id = id++; - - SWF swf; - memset(&swf, 0, sizeof(SWF)); - swf.fileVersion = 8; - swf.frameRate = 0x4000; - swf.movieSize.xmax = 1024*20; - swf.movieSize.ymax = 768*20; - - TAG *tag; - swf.firstTag = tag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); - swf_SetU8(tag, 0xe0);swf_SetU8(tag, 0xe0);swf_SetU8(tag, 0xff); - - tag = swf_InsertTag(tag, ST_DEFINEFONT3); - swf_FontSetDefine2(tag, font); - - if(font->glyphnames) { - int c; - tag = swf_InsertTag(tag, ST_GLYPHNAMES); - swf_SetU16(tag, font->id); - swf_SetU16(tag, font->numchars); - for (c = 0; c < font->numchars; c++) { - if (font->glyphnames[c]) - swf_SetString(tag, font->glyphnames[c]); - else - swf_SetString(tag, ""); - } - } - - if(viewer) - { - RGBA white = {255,255,255,255}; - RGBA black = {255,0,0,0}; - RGBA gray50 = {255,128,128,128}; - RGBA green = {255,0,255,0}; - int t; - SCOORD miny = SCOORD_MAX; - SCOORD maxy = SCOORD_MIN; - double width = 0; - U16 max_advance = 0; - char*flags = rfx_calloc(font->numchars); - double*xmin = rfx_calloc(sizeof(double)*(font->numchars+1)); - double*xmax = rfx_calloc(sizeof(double)*(font->numchars+1)); - int*xpos = rfx_calloc(sizeof(int)*(font->numchars+1)); - for(t=0;tnumchars;t++) { - SHAPE*s = font->glyph[t].shape; - SHAPE2*s2 = swf_ShapeToShape2(s); - SRECT r = swf_GetShapeBoundingBox(s2); - - // inside a definefont3, everything is 20x the resolution: - double rx1 = r.xmin / 20.0; - double ry1 = r.ymin / 20.0; - double rx2 = r.xmax / 20.0; - double ry2 = r.ymax / 20.0; - - xmin[t]= rx1; - xmax[t]= rx2; - - if(ry1maxy) {maxy=ry2;} - swf_Shape2Free(s2);free(s2); - width += font->glyph[t].advance; - if(font->glyph[t].advance>max_advance) - max_advance = font->glyph[t].advance; - } - - if(miny==SCOORD_MAX) miny=maxy=0; - if(miny==maxy) maxy=miny+1; - - /* scale the font so that it's 256 pixels high */ - double scale = (int)((256.0*1024.0/(maxy-miny))*20.0); - double overlarge_factor; - int fontsize; - if(scale > 32767) { - fontsize = 32767; - overlarge_factor = scale / 32767.0; - } else { - fontsize = scale; - overlarge_factor = 1.0; - } - - int textid = id++; - int spriteid = id++; - SRECT r; - r.xmin = 0; - r.ymin = miny*fontsize/1024; - r.xmax = width*fontsize/20480; - r.ymax = maxy*fontsize/1024; - tag = swf_InsertTag(tag, ST_DEFINETEXT); - swf_SetU16(tag, textid); - swf_SetRect(tag, &r); - swf_SetMatrix(tag, NULL); - - U8 abits = 15; - U8 gbits = swf_CountBits(font->numchars, 0); - swf_SetU8(tag, gbits); - swf_SetU8(tag, abits); - - RGBA rgb = {255,0,0,0}; - - swf_TextSetInfoRecord(tag, font, fontsize, &rgb, SET_TO_ZERO, SET_TO_ZERO); - ActionTAG*array = 0; - double x=0; - array = action_PushString(array, "xpos"); - for(t=0;tnumchars;t++) { - swf_SetU8(tag, 1); - int width = abs((xmax[t] - xmin[t+1])*fontsize/1024) + 60; - array = action_PushInt(array, x/20 +(xmin[t]*scale/1024)/20); - x += width * overlarge_factor; - swf_SetBits(tag, t, gbits); - swf_SetBits(tag, width, abits); - swf_SetU8(tag, 128); - } - array = action_PushInt(array, x/20); - array = action_PushInt(array, font->numchars+1); - array = action_InitArray(array); - array = action_SetVariable(array); - swf_SetU8(tag, 0); - - if(font->layout) { - tag = swf_InsertTag(tag, ST_DEFINESHAPE2); - SHAPE* s; - swf_ShapeNew(&s); - int ls = swf_ShapeAddLineStyle(s,20,&white); - int shapeid = id++; - swf_SetU16(tag,shapeid); - SRECT r; - r.xmin = 0; - r.xmax = 1024*20; - r.ymin = 0; - r.ymax = 256*20; - swf_SetRect(tag,&r); - swf_SetShapeHeader(tag,s); - swf_ShapeSetAll(tag,s,0,0,ls,0,0); - - /* Ç and  are good chars to test ascent/descent extend */ - int y1 = (-font->layout->ascent-miny*20.0)*256.0/(maxy-miny); - int y2 = (font->layout->descent-miny*20.0)*256.0/(maxy-miny); - - swf_ShapeSetMove(tag,s,0,y1); - swf_ShapeSetLine(tag,s,width,0); - swf_ShapeSetMove(tag,s,0,y2); - swf_ShapeSetLine(tag,s,width,0); - - swf_ShapeSetEnd(tag); - swf_ShapeFree(s); - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_ObjectPlace(tag, shapeid, depth++, NULL, NULL, NULL); - } - - /* shapes */ - - for(t=0;tnumchars;t++) { - tag = swf_InsertTag(tag, ST_DEFINESHAPE2); - SHAPE* s; - swf_ShapeNew(&s); - int ls = swf_ShapeAddLineStyle(s,20*2,&black); - int ls2 = swf_ShapeAddLineStyle(s,20*2,&green); - int fs = swf_ShapeAddSolidFillStyle(s, &gray50); - int shapeid = id++; - swf_SetU16(tag,shapeid); - SRECT r; - r.xmin = 0; - r.xmax = 1024*20; - r.ymin = 0; - r.ymax = 512*20; - swf_SetRect(tag,&r); - swf_SetShapeHeader(tag,s); - swf_ShapeSetAll(tag,s,0,0,ls,fs,0); - SHAPE2*s2 = swf_ShapeToShape2(font->glyph[t].shape); - SHAPELINE*l = s2->lines; - int lastx=0,lasty=0; - - double x1 = (1024*20 - (xmax[t] - xmin[t])*20*2*scale/20480.0)/2; - double y1 = -miny*20*scale*2/20480.0; - double scalex = scale*2/20480.0; - double scaley = scale*2/20480.0; - - while(l) { - int lx = (l->x)*scalex+x1; - int ly = (l->y)*scaley+y1; - int sx = (l->sx)*scalex+x1; - int sy = (l->sy)*scaley+y1; - if(l->type == moveTo) { - swf_ShapeSetMove(tag,s,lx,ly); - } else if(l->type == lineTo) { - swf_ShapeSetLine(tag,s,lx-lastx,ly-lasty); - } else if(l->type == splineTo) { - swf_ShapeSetCurve(tag,s,sx-lastx,sy-lasty,lx-sx,ly-sy); - } - lastx = lx; - lasty = ly; - l = l->next; - } - - if(font->alignzones) { - ALIGNZONE*zone = &font->alignzones[t]; - swf_ShapeSetAll(tag,s,0,0,ls2,SET_TO_ZERO,SET_TO_ZERO); - if((zone->x&zone->dx)!=0xffff) { - double x = F16toFloat(zone->x)*20480.0*scalex+x1; - double dx = (F16toFloat(zone->x)+F16toFloat(zone->dx))*20480.0*scalex+x1; - swf_ShapeSetMove(tag,s,x,0); - swf_ShapeSetLine(tag,s,0,1024*20); - swf_ShapeSetMove(tag,s,dx,0); - swf_ShapeSetLine(tag,s,0,1024*20); - } - if((zone->y&zone->dy)!=0xffff) { - double y = -F16toFloat(zone->y)*20480.0*scaley+y1; - double dy = -(F16toFloat(zone->y)+F16toFloat(zone->dy))*20480.0*scaley+y1; - swf_ShapeSetMove(tag,s,0,y); - swf_ShapeSetLine(tag,s,1024*20,0); - swf_ShapeSetMove(tag,s,0,dy); - swf_ShapeSetLine(tag,s,1024*20,0); - } - } - - swf_ShapeSetEnd(tag); - swf_ShapeFree(s); - - tag = swf_InsertTag(tag, ST_DEFINESPRITE); - U16 spriteid=id++; - swf_SetU16(tag, spriteid); - swf_SetU16(tag, 1); - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_ObjectPlace(tag, shapeid, 1, NULL, NULL, NULL); - tag = swf_InsertTag(tag, ST_END); - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - MATRIX m; - swf_GetMatrix(0, &m); - m.ty = 20000; - char txt[80]; - sprintf(txt, "char%d", font->numchars-t); - swf_ObjectPlace(tag, spriteid, depth++, &m, NULL, txt); - } - - /* marker */ - tag = swf_InsertTag(tag, ST_DEFINESHAPE2); - int shapeid=id++; - RGBA blue = {0xff,0xc0,0xc0,0xff}; - swf_ShapeSetRectangle(tag, shapeid, 20, 20, &blue); - tag = swf_InsertTag(tag, ST_DEFINESPRITE); - U16 spriteid2=id++; - swf_SetU16(tag, spriteid2); - swf_SetU16(tag, 1); - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_ObjectPlace(tag, shapeid, 1, NULL, NULL, NULL); - tag = swf_InsertTag(tag, ST_END); - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_ObjectPlace(tag, spriteid2, depth++, NULL, NULL, "marker"); - - /* textbar */ - tag = swf_InsertTag(tag, ST_DEFINESPRITE); - swf_SetU16(tag, spriteid); - swf_SetU16(tag, 1); - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - MATRIX m; - swf_GetMatrix(0, &m); - m.sx = 65536 * overlarge_factor; - m.sy = 65536 * overlarge_factor; - m.tx = 0; - m.ty = -miny*256*20/(maxy-miny); - swf_ObjectPlace(tag, textid, 1, &m, NULL, NULL); - tag = swf_InsertTag(tag, ST_END); - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_ObjectPlace(tag, spriteid, depth++, NULL, NULL, "textbar"); - - /* marker2 */ - RGBA blue2 = {0x80,0x80,0xff,0x80}; - tag = swf_InsertTag(tag, ST_DEFINESHAPE3); - int shapeid2=id++; - swf_ShapeSetRectangleWithBorder(tag, shapeid2, 20, 20, &blue2, 0, &white); - tag = swf_InsertTag(tag, ST_DEFINESPRITE); - U16 spriteid3=id++; - swf_SetU16(tag, spriteid3); - swf_SetU16(tag, 1); - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_ObjectPlace(tag, shapeid2, 1, NULL, NULL, NULL); - tag = swf_InsertTag(tag, ST_END); - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_ObjectPlace(tag, spriteid3, depth++, NULL, NULL, "marker2"); - - -char*data = -" var mouseListener = new Object();" -" var speed = 0;" -" var myx = 0;" -" var currentMouseOver, currentChar;" -" mouseListener.onMouseDown = function() { " -" eval(\"_root.char\"+currentChar)._y = 20000;" -" currentChar = currentMouseOver;" -" var i = currentMouseOver;" -" eval(\"_root.char\"+i)._y = 256;" -" _root.marker2._yscale=256*100;" -" _root.marker2._xscale=(xpos[i-1]-xpos[i])*100;" -" _root.marker2._x=xpos[i]+myx;" -" };" -" mouseListener.onMouseMove = function() { " -" if(_ymouse<256) {" -" speed = Math.abs(_xmouse-512)>256?(512-_xmouse)/8:0;" -" } else {" -" speed = 0;" -" }; " -" }; " -" setInterval( function(){ " -" if(_ymouse<256) {" -" var i, x=_xmouse-_root.textbar._x;" -" for(i=xpos.length-1;i>0;i--) {" -" if(x0) {" -" speed=0;" -" } else if(myx+speed<-xpos[0]+1024) {" -" speed=0;" -" }" -" myx+=speed;" -" _root.textbar._x = myx;" -" _root.marker._x += speed;" -" _root.marker2._x += speed;" -" }, 20);" -" Mouse.addListener(mouseListener);" -; - ActionTAG* atag = swf_ActionCompile(data, 6); - - tag = swf_InsertTag(tag, ST_DOACTION); - swf_ActionSet(tag, array); - swf_ActionSet(tag, atag); - swf_SetU8(tag, 0); - swf_ActionFree(atag); - - tag = swf_InsertTag(tag, ST_SHOWFRAME); - - free(flags); - free(xmin); - free(xmax); - } - - tag = swf_InsertTag(tag, ST_END); - - swf.compressed = -1; - swf_SaveSWF(&swf, filename); - swf_FreeTags(&swf); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/modules/swftools.c b/fluidbook/tools/swftools-special-swfdump/lib/modules/swftools.c deleted file mode 100644 index 6baecd105..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/modules/swftools.c +++ /dev/null @@ -1,1388 +0,0 @@ -/* swftools.c - - Math and matrix functions, misc tools - - Extension module for the rfxswf library. - Part of the swftools package. - - Copyright (c) 2000, 2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -// Matrix & Math tools for SWF files - -#include "../rfxswf.h" - -#define S64 long long -SFIXED RFXSWF_SP(SFIXED a1,SFIXED a2,SFIXED b1,SFIXED b2) -{ S64 a = ((S64)a1*(S64)b1+(S64)a2*(S64)b2)>>16; - SFIXED result = (SFIXED)(a); - if(a!=result) - fprintf(stderr, "Warning: overflow in matrix multiplication\n"); - return result; -} -SFIXED RFXSWF_QFIX(int zaehler,int nenner) // bildet Quotient von zwei INTs in SFIXED -{ S64 z = zaehler<<16; - S64 a = z/(S64)nenner; - return (SFIXED)a; -} -#undef S64 - -MATRIX * swf_MatrixJoin(MATRIX * d,MATRIX * s1,MATRIX * s2) -{ - if (!d) return NULL; - if (!s1) return (s2)?(MATRIX *)memcpy(d,s2,sizeof(MATRIX)):NULL; - if (!s2) return (MATRIX *)memcpy(d,s1,sizeof(MATRIX)); - - d->tx = s1->tx + RFXSWF_SP(s1->sx,s1->r1,s2->tx,s2->ty); - d->ty = s1->ty + RFXSWF_SP(s1->r0,s1->sy,s2->tx,s2->ty); - - d->sx = RFXSWF_SP(s1->sx,s1->r1,s2->sx,s2->r0); - d->r0 = RFXSWF_SP(s1->r0,s1->sy,s2->sx,s2->r0); - - d->r1 = RFXSWF_SP(s1->sx,s1->r1,s2->r1,s2->sy); - d->sy = RFXSWF_SP(s1->r0,s1->sy,s2->r1,s2->sy); - - //DumpMatrix(NULL,d); - - return d; -} - -MATRIX * swf_MatrixMapTriangle(MATRIX * m,int dx,int dy,int x0,int y0, - int x1,int y1,int x2,int y2) -{ int dx1 = x1 - x0; - int dy1 = y1 - y0; - int dx2 = x2 - x0; - int dy2 = y2 - y0; - - if (!m) return NULL; - if ((!dx)||(!dy)) return NULL; // check DIV by zero - - m->tx = x0; - m->ty = y0; - m->sx = RFXSWF_QFIX(dx1,dx); - m->sy = RFXSWF_QFIX(dy2,dy); - m->r0 = RFXSWF_QFIX(dy1,dx); - m->r1 = RFXSWF_QFIX(dx2,dy); - - return m; -} - -void swf_SetDefineID(TAG * tag, U16 newid) -{ - int oldlen = tag->len; - tag->len = 0; - swf_SetU16(tag, newid); /* set defining ID */ - tag->len = oldlen; -} - -U16 swf_GetDefineID(TAG * t) -// up to SWF 4.0 -{ U32 oldTagPos; - U16 id = 0; - - oldTagPos = swf_GetTagPos(t); - swf_SetTagPos(t,0); - - switch (swf_GetTagID(t)) - { case ST_DEFINESHAPE: - case ST_DEFINESHAPE2: - case ST_DEFINESHAPE3: - case ST_DEFINESHAPE4: - case ST_DEFINEMORPHSHAPE: - case ST_DEFINEMORPHSHAPE2: - case ST_DEFINEEDITTEXT: - case ST_DEFINEBITS: - case ST_DEFINEBITSJPEG2: - case ST_DEFINEBITSJPEG3: - case ST_DEFINEBITSLOSSLESS: - case ST_DEFINEBITSLOSSLESS2: - case ST_DEFINESCALINGGRID: //pseudodefine - case ST_DEFINEBUTTON: - case ST_DEFINEBUTTON2: - case ST_DEFINEBUTTONCXFORM: //pseudodefine - case ST_DEFINEBUTTONSOUND: //pseudodefine - case ST_CSMTEXTSETTINGS: //pseudodefine - case ST_DEFINEFONT: - case ST_DEFINEFONT2: - case ST_DEFINEFONT3: - case ST_DEFINEFONTINFO: //pseudodefine - case ST_DEFINEFONTINFO2: //pseudodefine - case ST_DEFINEFONTALIGNZONES: //pseudodefine - case ST_DEFINEFONTNAME: //pseudodefine - case ST_DEFINETEXT: - case ST_DEFINEBINARY: - case ST_DEFINETEXT2: - case ST_DEFINESOUND: - case ST_DEFINESPRITE: - case ST_DEFINEMOVIE: - case ST_DEFINEVIDEOSTREAM: - case ST_GLYPHNAMES: //pseudodefine - case ST_VIDEOFRAME: //pseudodefine - case ST_NAMECHARACTER: //pseudodefine - case ST_DOINITACTION: //pseudodefine - id = swf_GetU16(t); - break; - default: - fprintf(stderr, "rfxswf: Error: tag %d (%s) has no id\n", t->id, swf_TagGetName(t)); - } - - swf_SetTagPos(t,oldTagPos); - - return id; -} - -SRECT swf_GetDefineBBox(TAG * t) -{ - U32 oldTagPos; - U16 id = 0; - SRECT b1,b2; - memset(&b1, 0, sizeof(b1)); - - oldTagPos = swf_GetTagPos(t); - swf_SetTagPos(t,0); - - swf_GetRect(0, &b1); - - switch (swf_GetTagID(t)) - { case ST_DEFINESHAPE: - case ST_DEFINESHAPE2: - case ST_DEFINESHAPE3: - case ST_DEFINESHAPE4: - case ST_DEFINEEDITTEXT: - case ST_DEFINETEXT: - case ST_DEFINETEXT2: - case ST_DEFINEVIDEOSTREAM: - id = swf_GetU16(t); - swf_GetRect(t, &b1); - break; - case ST_DEFINEMORPHSHAPE: - id = swf_GetU16(t); - swf_GetRect(t, &b1); - swf_GetRect(t, &b2); - swf_ExpandRect2(&b1, &b2); - break; - case ST_DEFINEBITSLOSSLESS: - case ST_DEFINEBITSLOSSLESS2: - case ST_DEFINEBITS: - case ST_DEFINEBITSJPEG2: - case ST_DEFINEBITSJPEG3: - // FIXME - break; - } - - swf_SetTagPos(t,oldTagPos); - - return b1; -} - -U16 swf_GetPlaceID(TAG * t) -// up to SWF 4.0 -{ U32 oldTagPos; - U16 id = 0; - - oldTagPos = swf_GetTagPos(t); - swf_SetTagPos(t,0); - - switch (swf_GetTagID(t)) - { case ST_PLACEOBJECT: - case ST_REMOVEOBJECT: - case ST_FREECHARACTER: - case ST_STARTSOUND: - id = swf_GetU16(t); - break; - - case ST_PLACEOBJECT2: - { U8 flags = swf_GetU8(t); - U16 d = swf_GetU16(t); - id = (flags&PF_CHAR)?swf_GetU16(t):id; - } break; - case ST_PLACEOBJECT3: - { U8 flags = swf_GetU8(t); - U8 flags2 = swf_GetU8(t); - U16 d = swf_GetU16(t); - id = (flags&PF_CHAR)?swf_GetU16(t):id; - } break; - - } - - swf_SetTagPos(t,oldTagPos); - - return id; -} - -static int swf_definingtagids[] = -{ST_DEFINESHAPE, - ST_DEFINESHAPE2, - ST_DEFINESHAPE3, - ST_DEFINESHAPE4, - ST_DEFINEMORPHSHAPE, - ST_DEFINEMORPHSHAPE2, - ST_DEFINEFONT, - ST_DEFINEFONT2, - ST_DEFINEFONT3, - ST_DEFINETEXT, - ST_DEFINETEXT2, - ST_DEFINEEDITTEXT, - ST_DEFINEBITS, - ST_DEFINEBITSJPEG2, - ST_DEFINEBITSJPEG3, - ST_DEFINEBITSLOSSLESS, - ST_DEFINEBITSLOSSLESS2, - ST_DEFINEMOVIE, - ST_DEFINESPRITE, - ST_DEFINEBUTTON, - ST_DEFINEBUTTON2, - ST_DEFINESOUND, - ST_DEFINEVIDEOSTREAM, - ST_DEFINEBINARY, - -1 -}; - -// tags which may be used inside a sprite definition -static int swf_spritetagids[] = -{ST_SHOWFRAME, - ST_PLACEOBJECT, - ST_PLACEOBJECT2, - ST_PLACEOBJECT3, - ST_REMOVEOBJECT, - ST_REMOVEOBJECT2, - ST_DOACTION, - ST_DOABC, - ST_STARTSOUND, - ST_FRAMELABEL, - ST_SOUNDSTREAMHEAD, - ST_SOUNDSTREAMHEAD2, - ST_SOUNDSTREAMBLOCK, - ST_END, - -1 -}; - -/* tags which add content or information to a character with a given ID */ -static int swf_pseudodefiningtagids[] = -{ - ST_DEFINEFONTINFO, - ST_DEFINEFONTINFO2, - ST_DEFINEFONTALIGNZONES, - ST_DEFINEFONTNAME, - ST_DEFINEBUTTONCXFORM, - ST_DEFINEBUTTONSOUND, - ST_DEFINESCALINGGRID, - ST_CSMTEXTSETTINGS, - ST_NAMECHARACTER, - ST_DOINITACTION, - ST_VIDEOFRAME, - ST_GLYPHNAMES, - -1 -}; - -U8 swf_isAllowedSpriteTag(TAG * tag) -{ - int id = tag->id; - int t=0; - while(swf_spritetagids[t]>=0) - { - if(swf_spritetagids[t] == id) - return 1; - t++; - } - return 0; -} - -U8 swf_isDefiningTag(TAG * tag) -{ - int id = tag->id; - int t=0; - while(swf_definingtagids[t]>=0) - { - if(swf_definingtagids[t] == id) - return 1; - t++; - } - return 0; -} - -U8 swf_isPseudoDefiningTag(TAG * tag) -{ - int id = tag->id; - int t=0; - while(swf_pseudodefiningtagids[t]>=0) - { - if(swf_pseudodefiningtagids[t] == id) - return 1; - t++; - } - return 0; -} - -int swf_GetDepth(TAG * t) -{ - int depth = -1; - U32 oldTagPos; - oldTagPos = swf_GetTagPos(t); - swf_SetTagPos(t,0); - - switch (swf_GetTagID(t)) - { case ST_PLACEOBJECT: - case ST_REMOVEOBJECT: - swf_GetU16(t); //id - depth = swf_GetU16(t); - break; - case ST_REMOVEOBJECT2: - depth = swf_GetU16(t); - break; - case ST_PLACEOBJECT2: - { U8 flags = swf_GetU8(t); - depth = swf_GetU16(t); - } break; - case ST_PLACEOBJECT3: - { U8 flags = swf_GetU8(t); - U8 flags2 = swf_GetU8(t); - depth = swf_GetU16(t); - } break; - case ST_SETTABINDEX: - { - depth = swf_GetU16(t); - } - } - swf_SetTagPos(t,oldTagPos); - return depth; -} - -void swf_SetDepth(TAG * t, U16 depth) -{ - switch (swf_GetTagID(t)) - { case ST_PLACEOBJECT: - case ST_REMOVEOBJECT: - PUT16(t->data, depth); - break; - case ST_REMOVEOBJECT2: - PUT16(t->data, depth); - break; - case ST_PLACEOBJECT2: - PUT16(&t->data[1], depth); - break; - case ST_SETTABINDEX: - PUT16(t->data, depth); - break; - default: - fprintf(stderr, "rfxswf: Error: tag %d has no depth\n", t->id); - } -} - -char* swf_GetName(TAG * t) -{ - char* name = 0; - U32 oldTagPos; - MATRIX m; - CXFORM c; - oldTagPos = swf_GetTagPos(t); - swf_SetTagPos(t,0); - switch(swf_GetTagID(t)) - { - case ST_FRAMELABEL: - name = (char*)&t->data[swf_GetTagPos(t)]; - break; - case ST_PLACEOBJECT3: - case ST_PLACEOBJECT2: { - U8 flags = swf_GetU8(t); - if(t->id == ST_PLACEOBJECT3) - swf_GetU8(t); - swf_GetU16(t); //depth; - if(flags&PF_CHAR) - swf_GetU16(t); //id - if(flags&PF_MATRIX) - swf_GetMatrix(t, &m); - if(flags&PF_CXFORM) - swf_GetCXForm(t, &c, 1); - if(flags&PF_RATIO) - swf_GetU16(t); - if(flags&PF_CLIPDEPTH) - swf_GetU16(t); - if(flags&PF_NAME) { - swf_ResetReadBits(t); - name = (char*)&t->data[swf_GetTagPos(t)]; - } - } - break; - } - swf_SetTagPos(t,oldTagPos); - return name; -} - -/* used in enumerateUsedIDs */ -void swf_GetMorphGradient(TAG * tag, GRADIENT * gradient1, GRADIENT * gradient2) -{ - int t; - int num = swf_GetU8(tag) & 15; - if(gradient1) gradient1->num = num; - if(gradient2) gradient2->num = num; - - if(gradient1) { - gradient1->num = num; - gradient1->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*gradient1->num); - gradient1->ratios = (U8*)rfx_calloc(sizeof(gradient1->ratios[0])*gradient1->num); - } - if(gradient2) { - gradient2->num = num; - gradient2->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*gradient2->num); - gradient2->ratios = (U8*)rfx_calloc(sizeof(gradient2->ratios[0])*gradient2->num); - } - for(t=0;tratios[t] = ratio; - gradient1->rgba[t] = color; - } - - ratio = swf_GetU8(tag); - swf_GetRGBA(tag, &color); - if(gradient2) { - gradient2->ratios[t] = ratio; - gradient2->rgba[t] = color; - } - } -} - -#define DEBUG_ENUMERATE if(0) -//#define DEBUG_ENUMERATE - -void enumerateUsedIDs_fillstyle(TAG * tag, int t, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph) -{ - int type; - type = swf_GetU8(tag); //type - DEBUG_ENUMERATE printf("fill style %d) type=%02x (tagpos=%d)\n", t, type, tag->pos); - if(type == 0) { - RGBA color; - if(num >= 3) - {swf_GetRGBA(tag, &color);if(morph) swf_GetRGBA(tag, NULL);} - else - {swf_GetRGB(tag, &color);if(morph) swf_GetRGB(tag, NULL);} - DEBUG_ENUMERATE printf(" %02x%02x%02x%02x\n", color.r,color.g,color.b,color.a); - } - else if(type == 0x10 || type == 0x12 || type == 0x13) - { - swf_ResetReadBits(tag); - MATRIX m; - swf_GetMatrix(tag, &m); - DEBUG_ENUMERATE swf_DumpMatrix(stdout, &m); - if(morph) { - swf_GetMatrix(tag, &m); - DEBUG_ENUMERATE swf_DumpMatrix(stdout, &m); - } - swf_ResetReadBits(tag); - if(morph) { - swf_GetMorphGradient(tag, NULL, NULL); - if(type == 0x13) { - swf_GetU16(tag); - swf_GetU16(tag); - } - } else { - GRADIENT g; - swf_GetGradient(tag, &g, /*alpha*/ num>=3?1:0); - DEBUG_ENUMERATE swf_DumpGradient(stdout, &g); - if(type == 0x13) - swf_GetU16(tag); - } - } - else if(type == 0x40 || type == 0x41 || type == 0x42 || type == 0x43) - { - swf_ResetReadBits(tag); - if(tag->data[tag->pos] != 0xff || - tag->data[tag->pos+1] != 0xff) - (callback)(tag, tag->pos, callback_data); - - swf_GetU16(tag); - swf_ResetReadBits(tag); - swf_GetMatrix(tag, NULL); - if(morph) - swf_GetMatrix(tag, NULL); - } - else { - fprintf(stderr, "rfxswf:swftools.c Unknown fillstyle:0x%02x in tag %02d\n",type, tag->id); - } -} - -void enumerateUsedIDs_linestyle(TAG * tag, int t, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph) -{ - U16 width; - RGBA color; - width = swf_GetU16(tag); - char fill=0; - if(morph) - swf_GetU16(tag); - if(num >= 4) { - U16 flags = swf_GetU16(tag); - DEBUG_ENUMERATE printf("line style %d) flags: %08x\n", t, flags); - if((flags & 0x30) == 0x20) { - U16 miter = swf_GetU16(tag); // miter limit - DEBUG_ENUMERATE printf("line style %d) miter join: %08x\n", t, miter); - } - if(flags & 0x08) { - fill = 1; - } - } - if(!fill) { - if(num >= 3) - {swf_GetRGBA(tag, &color);if(morph) swf_GetRGBA(tag, NULL);} - else - {swf_GetRGB(tag, &color);if(morph) swf_GetRGB(tag, NULL);} - } else { - enumerateUsedIDs_fillstyle(tag, t, callback, callback_data, num, morph); - } - DEBUG_ENUMERATE printf("line style %d) width=%.2f color=%02x%02x%02x%02x \n", t, width/20.0, color.r,color.g,color.b,color.a); -} - -void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph) -{ - U16 count; - int t; - count = swf_GetU8(tag); - if(count == 0xff && num>1) // defineshape2,3,4 only - count = swf_GetU16(tag); - - DEBUG_ENUMERATE printf("%d fill styles\n", count); - for(t=0;tpos = 0; - switch(tag->id) - { - case ST_DEFINEBUTTONSOUND: { - int t; - callback(tag, tag->pos + base, callback_data); - swf_GetU16(tag); //button id - for(t=0;t<4;t++) { - int flags; - callback(tag, tag->pos + base, callback_data); - U16 sound_id = swf_GetU16(tag); //sound id - if(!sound_id) - continue; - flags = swf_GetU8(tag); - if(flags&1) - swf_GetU32(tag); // in point - if(flags&2) - swf_GetU32(tag); // out points - if(flags&4) - swf_GetU16(tag); // loop count - if(flags&8) - { - int npoints = swf_GetU8(tag); - int s; - for(s=0;spos + base, callback_data); //button id - break; - - case ST_SYMBOLCLASS: - case ST_EXPORTASSETS: { - int num = swf_GetU16(tag); - int t; - for(t=0;tpos + base, callback_data); //button id - swf_GetU16(tag); //id - while(swf_GetU8(tag)); //name - } - } break; - - case ST_IMPORTASSETS: - case ST_IMPORTASSETS2: { - swf_GetString(tag); //count - swf_GetU8(tag); //reserved - swf_GetU8(tag); //reserved - int num = swf_GetU16(tag); //url - int t; - for(t=0;tpos + base, callback_data); //button id - swf_GetU16(tag); //id - while(swf_GetU8(tag)); //name - } - } break; - - case ST_DOABC: - case ST_RAWABC: - break; - - case ST_FREECHARACTER: /* unusual tags, which all start with an ID */ - case ST_NAMECHARACTER: - case ST_DEFINEFONTNAME: - case ST_GENERATORTEXT: - callback(tag, tag->pos + base, callback_data); - break; - case ST_PLACEOBJECT: - callback(tag, tag->pos + base, callback_data); - break; - case ST_PLACEOBJECT2: - // only if placeflaghascharacter - if(!(tag->data[0]&2)) - break; - callback(tag, 3 + base, callback_data); - break; - case ST_PLACEOBJECT3: - // only if placeflaghascharacter - if(!(tag->data[0]&2)) - break; - callback(tag, 4 + base, callback_data); - break; - case ST_REMOVEOBJECT: - callback(tag, tag->pos + base, callback_data); - break; - case ST_STARTSOUND: - callback(tag, tag->pos + base, callback_data); - break; - case ST_DEFINESPRITE: { - if(tag->len <= 4) - break; // sprite is expanded - - swf_GetU16(tag); // id - swf_GetU16(tag); // framenum - - while(1) { - U16 flags = swf_GetU16(tag); - U32 len; - U16 id = flags>>6; - TAG *tag2 = swf_InsertTag(NULL, id); - len = flags&0x3f; - if(len == 63) - len = swf_GetU32(tag); - if(id == ST_END) - break; - tag2->len = tag2->memsize = len; - tag2->data = (U8*)rfx_alloc(len); - memcpy(tag2->data, &tag->data[tag->pos], len); - /* I never saw recursive sprites, but they are (theoretically) - possible, so better add base here again */ - enumerateUsedIDs(tag2, tag->pos + base, callback, callback_data); - swf_DeleteTag(0, tag2); - swf_GetBlock(tag, NULL, len); - } - } - break; - case ST_DEFINEBUTTON2: // has some font ids in the button records - num++; - //fallthrough - case ST_DEFINEBUTTON: { - swf_GetU16(tag); //button id - if(num>1) - { - int offset; - swf_GetU8(tag); //flag - offset = swf_GetU16(tag); //offset - } - while(1) - { - U8 flags = swf_GetU8(tag); - if(!flags) //flags - break; - callback(tag, tag->pos + base, callback_data); - swf_GetU16(tag); //char - swf_GetU16(tag); //layer - swf_ResetReadBits(tag); - swf_GetMatrix(tag, NULL); - if(num>1) { - swf_ResetReadBits(tag); - swf_GetCXForm(tag, NULL, 1); - } - if(flags&0x10) { - U8 num = swf_GetU8(tag); - int t; - for(t=0;tpos + base, callback_data); - } - break; - case ST_DEFINETEXT2: - num ++; - case ST_DEFINETEXT: { - int glyphbits, advancebits; - int id; - id = swf_GetU16(tag); //id - swf_GetRect(tag, NULL); //bounding box - swf_ResetReadBits(tag); - swf_GetMatrix(tag, NULL); //matrix - swf_ResetReadBits(tag); - glyphbits = swf_GetU8(tag); //glyphbits - advancebits = swf_GetU8(tag); //advancebits - while(1) { - U16 flags; - int t; - swf_ResetReadBits(tag); - flags = swf_GetBits(tag, 8); - if(!flags) break; - - swf_ResetReadBits(tag); - if(flags & 8) { // hasfont - callback(tag, tag->pos + base, callback_data); - id = swf_GetU16(tag); - } - if(flags & 4) { // hascolor - if(num==1) swf_GetRGB(tag, NULL); - else swf_GetRGBA(tag, NULL); - } - if(flags & 2) { //has x offset - swf_ResetReadBits(tag); - swf_GetU16(tag); - } - if(flags & 1) { //has y offset - swf_ResetReadBits(tag); - swf_GetU16(tag); - } - if(flags & 8) { //has height - swf_ResetReadBits(tag); - swf_GetU16(tag); - } - - flags = swf_GetBits(tag, 8); - if(!flags) break; - swf_ResetReadBits(tag); - for(t=0;tpos + base, callback_data); - break; - case ST_DEFINEVIDEOSTREAM: - break; - - case ST_DOINITACTION: - callback(tag, tag->pos + base, callback_data); - break; - - case ST_DEFINEMORPHSHAPE2: - case ST_DEFINESHAPE4: - num++; - case ST_DEFINEMORPHSHAPE: - case ST_DEFINESHAPE3: - num++; //fallthrough - case ST_DEFINESHAPE2: - num++; //fallthrough - case ST_DEFINESHAPE: { - int fillbits; - int linebits; - int id; - int numshapes = 1; - int morph = 0; - if(tag->id == ST_DEFINEMORPHSHAPE || tag->id==ST_DEFINEMORPHSHAPE2) { - numshapes = 2; - morph = 1; - } - - id = swf_GetU16(tag); // id; - SRECT r={0,0,0,0},r2={0,0,0,0}; - swf_GetRect(tag, &r); // shape bounds - if(morph) { - swf_ResetReadBits(tag); - swf_GetRect(tag, NULL); // shape bounds2 - if(num>=4) { - swf_ResetReadBits(tag); - swf_GetRect(tag, NULL); // edge bounds1 - } - } - if(num>=4) { - swf_ResetReadBits(tag); - swf_GetRect(tag, &r2); // edge bounds - U8 flags = swf_GetU8(tag); // flags, &1: contains scaling stroke, &2: contains non-scaling stroke - DEBUG_ENUMERATE printf("flags: %02x (1=scaling strokes, 2=non-scaling strokes)\n", flags); - } - if(morph) { - swf_GetU32(tag); //offset to endedges - } - - DEBUG_ENUMERATE printf("Tag:%d Name:%s ID:%d\n", tag->id, swf_TagGetName(tag), id); - DEBUG_ENUMERATE printf("BBox %.2f %.2f %.2f %.2f\n", r.xmin/20.0,r.ymin/20.0,r.xmax/20.0,r.ymax/20.0); - DEBUG_ENUMERATE printf("BBox %.2f %.2f %.2f %.2f\n", r2.xmin/20.0,r2.ymin/20.0,r2.xmax/20.0,r2.ymax/20.0); - - DEBUG_ENUMERATE printf("style tag pos: %d\n", tag->pos); - enumerateUsedIDs_styles(tag, callback, callback_data, num, morph); - DEBUG_ENUMERATE printf("-------\n"); - swf_ResetReadBits(tag); - while(--numshapes>=0) /* morph shapes define two shapes */ - { - DEBUG_ENUMERATE printf("shape:%d\n", numshapes); - fillbits = swf_GetBits(tag, 4); - linebits = swf_GetBits(tag, 4); - DEBUG_ENUMERATE printf("fillbits=%d linebits=%d\n", fillbits, linebits); - swf_ResetReadBits(tag); - int x=0,y=0; - while(1) { - int flags; - flags = swf_GetBits(tag, 1); - if(!flags) { //style change - flags = swf_GetBits(tag, 5); - if(!flags) - break; - if(flags&1) { //move - int n = swf_GetBits(tag, 5); - x = swf_GetBits(tag, n); //x - y = swf_GetBits(tag, n); //y - DEBUG_ENUMERATE printf("moveTo %.2f %.2f\n",x/20.0,y/20.0); - } - if(flags&2) { //fill0 - int fill0; - fill0 = swf_GetBits(tag, fillbits); - DEBUG_ENUMERATE printf("fill0 %d\n", fill0); - } - if(flags&4) { //fill1 - int fill1; - fill1 = swf_GetBits(tag, fillbits); - DEBUG_ENUMERATE printf("fill1 %d\n", fill1); - } - if(flags&8) { //linestyle - int line; - line = swf_GetBits(tag, linebits); - DEBUG_ENUMERATE printf("linestyle %d\n",line); - } - if(flags&16) { - DEBUG_ENUMERATE printf("more fillstyles\n"); - enumerateUsedIDs_styles(tag, callback, callback_data, num, 0); - fillbits = swf_GetBits(tag, 4); - linebits = swf_GetBits(tag, 4); - } - } else { - flags = swf_GetBits(tag, 1); - if(flags) { //straight edge - int n = swf_GetBits(tag, 4) + 2; - if(swf_GetBits(tag, 1)) { //line flag - x += swf_GetSBits(tag, n); //delta x - y += swf_GetSBits(tag, n); //delta y - DEBUG_ENUMERATE printf("lineTo %.2f %.2f\n",x/20.0,y/20.0); - } else { - int v=swf_GetBits(tag, 1); - int d; - d = swf_GetSBits(tag, n); //vert/horz - if(!v) - x += d; - else - y += d; - DEBUG_ENUMERATE printf("lineTo %.2f %.2f (%s)\n",x/20.0,y/20.0, v?"vertical":"horizontal"); - } - } else { //curved edge - int n = swf_GetBits(tag, 4) + 2; - int x1,y1,x2,y2; - x1 = swf_GetSBits(tag, n); - y1 = swf_GetSBits(tag, n); - x2 = swf_GetSBits(tag, n); - y2 = swf_GetSBits(tag, n); - DEBUG_ENUMERATE printf("splineTo %.2f %.2f %.2f %.2f\n", x1/20.0, y1/20.0, x2/20.0, y2/20.0); - } - } - } - } - } - break; - default: - break; - } -} - -void callbackCount(TAG * t,int pos, void*ptr) -{ - (*(int*)ptr)++; - DEBUG_ENUMERATE printf("callback(%d) %d\n", pos, *(U16*)&t->data[pos]); -} - -void callbackFillin(TAG * t,int pos, void*ptr) -{ - **(int**)ptr = pos; - (*(int**)ptr)++; - DEBUG_ENUMERATE printf("callback(%d) %d\n", pos, *(U16*)&t->data[pos]); -} - -int swf_GetNumUsedIDs(TAG * t) -{ - int num = 0; - enumerateUsedIDs(t, 0, callbackCount, &num); - return num; -} - -void swf_GetUsedIDs(TAG * t, int * positions) -{ - int * ptr = positions; - enumerateUsedIDs(t, 0, callbackFillin, &ptr); -} - -char swf_Relocate (SWF*swf, char*bitmap) -{ - TAG*tag; - int slaveids[65536]; - memset(slaveids, -1, sizeof(slaveids)); - tag = swf->firstTag; - char ok = 1; - - int current_id=0; -#define NEW_ID(n) \ - for(current_id++;current_id<65536;current_id++) { \ - if(!bitmap[current_id]) { \ - n = current_id; \ - break; \ - } \ - } \ - if(current_id==65536) { \ - fprintf(stderr, "swf_Relocate: Couldn't relocate: Out of IDs\n"); \ - return 0; \ - } - - while(tag) - { - int num; - int *ptr; - - if(swf_isDefiningTag(tag)) - { - int newid; - int id; - - id = swf_GetDefineID(tag); //own id - - if(!bitmap[id]) { //free - newid = id; - } else if(slaveids[id]>0) { - newid = slaveids[id]; - } else { - NEW_ID(newid); - } - - bitmap[newid] = 1; - slaveids[id] = newid; - - swf_SetDefineID(tag, newid); - } - - num = swf_GetNumUsedIDs(tag); - if(num) { - ptr = (int*)rfx_alloc(sizeof(int)*num); - swf_GetUsedIDs(tag, ptr); - int t; - for(t=0;tdata[ptr[t]]); - if(slaveids[id]<0) { - if(!id && bitmap[id]) { - /* id 0 is only used in SWF versions >=9. It's the ID of - the main timeline. It's used in e.g. SYMBOLTAG tags, but - never defined, so if we're asked to reallocate it, we have - to allocate an ID for it on the fly. */ - int newid; - NEW_ID(newid); - bitmap[newid] = 1; - slaveids[id] = newid; - id = newid; - } else if(!bitmap[id]) { - /* well- we don't know this id, but it's not reserved anyway, so just - leave it alone */ - } else { - /* this actually happens with files created with Flash CS4 and never. - Apparently e.g. DefineButton tags are able to use forward declarations of objects. */ - fprintf(stderr, "warning: Mapping id (%d) never encountered before in %s\n", id, - swf_TagGetName(tag)); - int newid; - NEW_ID(newid); - id = slaveids[id] = newid; - ok = 0; - } - } else { - id = slaveids[id]; - } - PUT16(&tag->data[ptr[t]], id); - } - free(ptr); - } - tag=tag->next; - } - return ok; -} - -/* untested */ -void swf_Relocate2(SWF*swf, int*id2id) -{ - TAG*tag; - tag = swf->firstTag; - while(tag) { - if(swf_isDefiningTag(tag)) { - int id = swf_GetDefineID(tag); - id = id2id[id]; - if(id>=0) { - swf_SetDefineID(tag, id); - } - } - int num = swf_GetNumUsedIDs(tag); - if(num) { - int *ptr; - int t; - ptr = (int*)rfx_alloc(sizeof(int)*num); - swf_GetUsedIDs(tag, ptr); - for(t=0;tdata[ptr[t]]); - id = id2id[id]; - if(id>=0) { - PUT16(&tag->data[ptr[t]], id); - } - } - free(ptr); - } - } -} - -void swf_RelocateDepth(SWF*swf, char*bitmap) -{ - TAG*tag; - int nr; - tag = swf->firstTag; - for(nr=65535;nr>=0;nr--) { - if(bitmap[nr] != 0) - break; - } - // now nr is the highest used depth. So we start - // assigning depths at nr+1 - nr++; - - while(tag) - { - int depth; - /* TODO * clip depths - * sprites - */ - if(tag->id == ST_PLACEOBJECT2) { - SWFPLACEOBJECT obj; - swf_GetPlaceObject(tag, &obj); - if(obj.clipdepth) { - int newdepth = obj.clipdepth+nr; - if(newdepth>65535) { - fprintf(stderr, "Couldn't relocate depths: too large values\n"); - newdepth = 65535; - } - obj.clipdepth = newdepth; - swf_ResetTag(tag, ST_PLACEOBJECT2); - swf_SetPlaceObject(tag, &obj); - } - swf_PlaceObjectFree(&obj); - } - - depth = swf_GetDepth(tag); - if(depth>=0) { - int newdepth = depth+nr; - if(newdepth>65535) { - fprintf(stderr, "Couldn't relocate depths: too large values\n"); - newdepth = 65535; - } - swf_SetDepth(tag, newdepth); - } - tag=tag->next; - } -} - -U8 swf_isShapeTag(TAG*tag) -{ - if(tag->id == ST_DEFINESHAPE || - tag->id == ST_DEFINESHAPE2 || - tag->id == ST_DEFINESHAPE3 || - tag->id == ST_DEFINESHAPE4) - return 1; - return 0; -} - -U8 swf_isPlaceTag(TAG*tag) -{ - if(tag->id == ST_PLACEOBJECT || - tag->id == ST_PLACEOBJECT2 || - tag->id == ST_PLACEOBJECT3) - return 1; - return 0; -} -U8 swf_isTextTag(TAG*tag) -{ - if(tag->id == ST_DEFINETEXT || - tag->id == ST_DEFINETEXT2) - return 1; - return 0; -} - -U8 swf_isFontTag(TAG*tag) -{ - if(tag->id == ST_DEFINEFONT || - tag->id == ST_DEFINEFONT2 || - tag->id == ST_DEFINEFONT3 || - tag->id == ST_DEFINEFONTINFO) - return 1; - return 0; -} - -U8 swf_isImageTag(TAG*tag) -{ - if(tag->id == ST_DEFINEBITSJPEG || - tag->id == ST_DEFINEBITSJPEG2 || - tag->id == ST_DEFINEBITSJPEG3 || - tag->id == ST_DEFINEBITSLOSSLESS || - tag->id == ST_DEFINEBITSLOSSLESS2) - return 1; - return 0; -} - -TAG* swf_Concatenate (TAG*list1,TAG*list2) -{ - TAG*tag=0,*lasttag=0; - char bitmap[65536]; - char depthmap[65536]; - SWF swf1,swf2; - memset(bitmap, 0, sizeof(bitmap)); - memset(depthmap, 0, sizeof(depthmap)); - memset(&swf1, 0, sizeof(swf1)); - memset(&swf2, 0, sizeof(swf2)); - - swf1.firstTag = list1; - swf_FoldAll(&swf1); - swf2.firstTag = list2; - swf_FoldAll(&swf2); - - tag = list1; - while(tag) { - if(!swf_isDefiningTag(tag)) { - int id = swf_GetDefineID(tag); - bitmap[id] = 1; - } - if(tag->id == ST_PLACEOBJECT || - tag->id == ST_PLACEOBJECT2) { - int depth = swf_GetDepth(tag); - depthmap[depth] = 1; - } - if(tag->id == ST_REMOVEOBJECT || - tag->id == ST_REMOVEOBJECT2) { - int depth = swf_GetDepth(tag); - depthmap[depth] = 0; - } - tag = tag->next; - lasttag = tag; - } - swf_Relocate(&swf2, bitmap); - swf_RelocateDepth(&swf2, depthmap); - lasttag->next = swf2.firstTag; - swf2.firstTag->prev = lasttag; - - return swf1.firstTag; -} - -static int tagHash(TAG*tag) -{ - int t, h=0; - unsigned int a = 0x6b973e5a; - /* start at pos 2, as 0 and 1 are the id */ - for(t=2;tlen;t++) { - unsigned int b = a; - a >>= 8; - a += tag->data[t]*0xefbc35a5*b*(t+1); - } - return a&0x7fffffff; //always return positive number -} - -void swf_Optimize(SWF*swf) -{ - const int hash_size = 131072; - char* dontremap = (char*)rfx_calloc(sizeof(char)*65536); - U16* remap = (U16*)rfx_alloc(sizeof(U16)*65536); - TAG* id2tag = (TAG*)rfx_calloc(sizeof(TAG*)*65536); - TAG** hashmap = (TAG**)rfx_calloc(sizeof(TAG*)*hash_size); - TAG* tag; - int t; - for(t=0;t<65536;t++) { - remap[t] = t; - } - - swf_FoldAll(swf); - - tag = swf->firstTag; - while(tag) { - /* make sure we don't remap to this tag, - as it might have different "helper tags" - FIXME: a better way would be to compare - the helper tags, too. - */ - if(swf_isPseudoDefiningTag(tag) && - tag->id != ST_NAMECHARACTER) { - dontremap[swf_GetDefineID(tag)] = 1; - } - tag=tag->next; - } - tag = swf->firstTag; - while(tag) { - TAG*next = tag->next; - - /* remap the tag */ - int num = swf_GetNumUsedIDs(tag); - int*positions = (int*)rfx_alloc(sizeof(int)*num); - int t; - swf_GetUsedIDs(tag, positions); - for(t=0;tdata[positions[t]]); - id = remap[id]; - PUT16(&tag->data[positions[t]], id); - } - rfx_free(positions); - - /* now look for previous tags with the same - content */ - if(swf_isDefiningTag(tag)) { - TAG*tag2; - int id = swf_GetDefineID(tag); - int hash = tagHash(tag); - int match=0; - if(!dontremap[id]) - while((tag2 = hashmap[hash%hash_size])) { - if(tag2 != (TAG*)0 && tag->len == tag2->len) { - if(memcmp(&tag->data[2],&tag2->data[2],tag->len-2) == 0) { - match = 1; - break; - } - } - hash++; - } - if(!match) { - while(hashmap[hash%hash_size]) hash++; - hashmap[hash%hash_size] = tag; - } else { - /* we found two identical tags- remap one - of them */ - remap[id] = swf_GetDefineID(tag2); - swf_DeleteTag(swf, tag); - } - } else if(swf_isPseudoDefiningTag(tag)) { - int id = swf_GetDefineID(tag); - if(remap[id]!=id) { - /* if this tag was remapped, we don't - need the helper tag anymore. Discard - it. */ - swf_DeleteTag(swf, tag); - } - } - - tag = next; - } - - rfx_free(dontremap); - rfx_free(remap); - rfx_free(id2tag); - rfx_free(hashmap); -} - -void swf_SetDefineBBox(TAG * tag, SRECT newbbox) -{ - U16 id = 0; - SRECT b1; - swf_SetTagPos(tag,0); - - switch (swf_GetTagID(tag)) - { - case ST_DEFINESHAPE: - case ST_DEFINESHAPE2: - case ST_DEFINESHAPE3: - case ST_DEFINEEDITTEXT: - case ST_DEFINETEXT: - case ST_DEFINETEXT2: - case ST_DEFINEVIDEOSTREAM: { - U32 after_bbox_offset = 0, len; - U8*data; - id = swf_GetU16(tag); - swf_GetRect(tag, &b1); - swf_ResetReadBits(tag); - after_bbox_offset = tag->pos; - len = tag->len - after_bbox_offset; - data = (U8*)malloc(len); - memcpy(data, &tag->data[after_bbox_offset], len); - tag->writeBit = 0; - tag->len = 2; - swf_SetRect(tag, &newbbox); - swf_SetBlock(tag, data, len); - free(data); - tag->pos = tag->readBit = 0; - - } break; - default: - fprintf(stderr, "rfxswf: Tag %d (%s) has no bbox\n", tag->id, swf_TagGetName(tag)); - } -} - -RGBA swf_GetSWFBackgroundColor(SWF*swf) -{ - TAG*t=swf->firstTag; - RGBA color; - color.r = color.b = color.g = 0; - color.a = 255; - while(t) { - if(t->id == ST_SETBACKGROUNDCOLOR) { - swf_SetTagPos(t, 0); - color.r = swf_GetU8(t); - color.g = swf_GetU8(t); - color.b = swf_GetU8(t); - break; - } - t=t->next; - } - return color; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/mp3.c b/fluidbook/tools/swftools-special-swfdump/lib/mp3.c deleted file mode 100644 index 48f03d12a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/mp3.c +++ /dev/null @@ -1,236 +0,0 @@ -/* mp3.c - Routines for handling .mp3 files - - Part of the swftools package. - - Copyright (c) 2005 Joel Yliluoma - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include - -#include "mp3.h" - -struct MP3Frame -{ - unsigned bitrate; - unsigned samprate; - unsigned chanmode; - unsigned framesize; - unsigned char* data; - struct MP3Frame* next; -}; - -// 0 4 8 C -static const unsigned BR_mpeg1[16] = {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}; -static const unsigned BR_mpeg2[16] = {0,8, 16,24,32,40,48,56, 64, 80, 96,112,128,144,160,0}; -static const unsigned BR_reserved[16] = {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}; -static const unsigned*const BR[4] = {BR_mpeg2, BR_reserved, BR_mpeg2, BR_mpeg1}; - -static const unsigned SR_mpeg1[4] = {44100,48000,32000,0}; -static const unsigned SR_mpeg2[4] = {22050,24000,16000,0}; -static const unsigned SR_mpeg25[4] = {11025,12000,8000,0}; -static const unsigned SR_reserved[4] = {0,0,0,0}; -static const unsigned*const SR[4] = {SR_mpeg25, SR_reserved, SR_mpeg2, SR_mpeg1}; - -int mp3_read(struct MP3*mp3, const char* filename) -{ - struct MP3Frame* root = 0; - struct MP3Frame** cur = &root; - - unsigned totalsize = 0; - unsigned first_samprate = 0; - unsigned nframes = 0; - int first_chanmode = -1; - - FILE*fi = fopen(filename, "rb"); - if(!fi) return 0; - - for(;;) - { - unsigned char FrameBuf[2048]; - unsigned char* hdr = FrameBuf; - unsigned char* data = FrameBuf+4; - unsigned char* frdata; - - unsigned char mpegver; - unsigned padding; - unsigned bitrate; - unsigned samprate; - unsigned framesize; - int chanmode; - - if(fread(hdr,1,4,fi) < 4) break; - - if(hdr[0] == 'I' && hdr[1] == 'D' && hdr[2] == '3') - { - /* Skip ID3 header */ - unsigned id3_size = 0; - if(fread(FrameBuf, 1, 6, fi) < 6) break; - - id3_size = (FrameBuf[5]) - + (FrameBuf[4] << 7) - + (FrameBuf[3] << 14) - + (FrameBuf[2] << 21); - fprintf(stderr, "readMP3: skipping ID3 tag (10+%u bytes)\n", id3_size); - if(fseek(fi, id3_size, SEEK_CUR) < 0) - { - /* Cannot seek? Try reading. */ - char* tmpbuf = (char*)malloc(id3_size); - int nread=0; - if(!tmpbuf) - { - fprintf(stderr, "readMP3: fseek and malloc both failed?\n"); - break; - } - nread = fread(tmpbuf, 1, id3_size, fi); - free(tmpbuf); - if(nread < id3_size) break; - } - continue; - } - - - if(hdr[0] != 0xFF - || (hdr[1] & 0xE0) != 0xE0) - { - fprintf(stderr, "readMP3: invalid header %02X %02X %02X %02X\n", - hdr[0],hdr[1],hdr[2],hdr[3]); - break; - } - - mpegver = (hdr[1] >> 3) & 0x03; - - bitrate = BR[mpegver][ (hdr[2] >> 4) & 0x0F ] * 1000; - samprate = SR[mpegver][ (hdr[2] >> 2) & 0x03 ]; - chanmode = (hdr[3] >> 6) & 0x03; - - padding = (hdr[2] & 2) ? 1 : 0; - - if(!bitrate || !samprate) - { - /* Invalid frame */ - /*break;*/ - } - if(!first_samprate) first_samprate = samprate; - else if(first_samprate != samprate) - { - /* Sampling rate changed?!? */ - fprintf(stderr, "readMP3: sampling rate changed?\n"); - /*break;*/ - } - if(first_chanmode<0) first_chanmode = chanmode; - else if(first_chanmode != chanmode) - { - /* Channel mode changed?!? */ - fprintf(stderr, "readMP3: chanmode changed?\n"); - /*break;*/ - } - - framesize = ((mpegver == 3 ? 144 : 72) * bitrate) / samprate + padding; - -/* - fprintf(stderr, "%02X %02X %02X %02X - bitrate=%u,samprate=%u,chanmode=%u,padding=%u,framesize=%u\n", - hdr[0],hdr[1],hdr[2],hdr[3],bitrate,samprate,chanmode,padding,framesize); -*/ - if(framesize > sizeof(FrameBuf)) break; - if(fread(data, 1, framesize - 4, fi) < framesize-4) - { - fprintf(stderr, "readMP3: short read at frame %u\n", nframes); - break; - } - - if(!bitrate || !samprate) continue; - - frdata = (unsigned char*)malloc(framesize); - if(!frdata) - { - fprintf(stderr, "readMP3: malloc failed\n"); - break; - } - - *cur = (struct MP3Frame*)malloc(sizeof(*root)); - if(!*cur) - { - fprintf(stderr, "readMP3: malloc failed\n"); - free(frdata); - break; - } - - (*cur)->next = 0; - (*cur)->bitrate = bitrate; - (*cur)->samprate = samprate; - (*cur)->chanmode = chanmode; - (*cur)->framesize = framesize; - (*cur)->data = frdata; - - memcpy(frdata, FrameBuf, framesize); - cur = &(*cur)->next; - - totalsize += framesize; - ++nframes; - } - if(!root) - { - fprintf(stderr, "readMP3: not a MP3 file\n"); - fclose(fi); - return 0; - } - - /* - fprintf(stderr, "readMP3: read %u frames (%u bytes)\n", nframes, totalsize); - */ - - mp3->SampRate = first_samprate; - mp3->Channels = first_chanmode == 3 ? 1 : 2; - mp3->NumFrames = nframes; - mp3->size = totalsize; - mp3->data = (unsigned char*)malloc(mp3->size); - if(mp3->data) - { - unsigned pos=0; - struct MP3Frame* it; - for(it=root; it; it=it->next) - { - memcpy(mp3->data + pos, it->data, it->framesize); - pos += it->framesize; - } - } - else - { - fprintf(stderr, "readMP3: malloc failed\n"); - } - - while(root) - { - struct MP3Frame* next = root->next; - free(root->data); - free(root); - root = next; - } - - fclose(fi); - return mp3->data != NULL; -} - -void mp3_clear(struct MP3*mp3) -{ - free(mp3->data); - mp3->data = 0; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/mp3.h b/fluidbook/tools/swftools-special-swfdump/lib/mp3.h deleted file mode 100644 index a49c9ad20..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/mp3.h +++ /dev/null @@ -1,19 +0,0 @@ -/* mp3.h - Header file for mp3.c - - Part of the swftools package. - - Copyright (c) 2005 Joel Yliluoma - - This file is distributed under the GPL, see file COPYING for details */ - -struct MP3 { - unsigned short SampRate; - unsigned char Channels; - unsigned int NumFrames; - unsigned char* data; - unsigned long size; -}; - -int mp3_read(struct MP3*mp3, const char* filename); -void mp3_clear(struct MP3*mp3); diff --git a/fluidbook/tools/swftools-special-swfdump/lib/old_rfxswf.h b/fluidbook/tools/swftools-special-swfdump/lib/old_rfxswf.h deleted file mode 100644 index be79454c1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/old_rfxswf.h +++ /dev/null @@ -1,41 +0,0 @@ -/* old_rfxswf.h - - File which defines macros and typedefs for old versions of - the rfxswf lib functions and datatypes. (For routines which - still use them) - - Part of the swftools package. - - Copyright (c) 2000, 2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "rfxswf.h" - -/* -#define DataPos dataReadPos -#define DataSize dataWritePos -#define bitcount bitWritePos -#define bitmask bitWritePos - -*/ -#define GetDataSize GetTagLen -#define GetDataSizePtr GetTagLenPtr -#define RFXSWF_ReadTag(a,b) swf_ReadTag(a,b) -#define RFXSWF_WriteTag(a,b) swf_WriteTag(a,b) -#define RFXSWF_UpdateFrame(a,b) swf_UpdateFrame(a,b) -#define RFXSWF_WriteTag(a,b) swf_WriteTag(a,b) -#define RFXSWF_DefineSprite_GetRealSize(a) swf_DefineSprite_GetRealSize(a) - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/os.c b/fluidbook/tools/swftools-special-swfdump/lib/os.c deleted file mode 100644 index c95b7775a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/os.c +++ /dev/null @@ -1,325 +0,0 @@ -/* os.c - -operating system dependent functions - -Part of the swftools package. - -Copyright (c) 2005 Matthias Kramm - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "os.h" -#include -#include -#include -#ifdef WIN32 -#include -#else -#include -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#else -#undef HAVE_STAT -#endif -#ifdef HAVE_SYS_MMAN_H -#include -#else -#undef HAVE_MMAP -#endif -#ifdef HAVE_SYS_TYPES_H -#include -#else -#undef HAVE_STAT -#endif - -#if defined(CYGWIN) -char path_seperator = '/'; -#elif defined(WIN32) -char path_seperator = '\\'; -#else -char path_seperator = '/'; -#endif - -#ifdef WIN32 -char* getRegistryEntry(char*path) -{ - int res = 0; - HKEY key; - long rc; - long size = 0; - DWORD type; - char*buf; - rc = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_ALL_ACCESS, &key); - if(rc) - rc = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &key); - if(rc) - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_ALL_ACCESS, &key); - if(rc) - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &key); - - if (rc) { - fprintf(stderr, "RegOpenKeyEx failed\n"); - return 0; - } - rc = RegQueryValueEx(key, NULL, 0, 0, 0, (LPDWORD)&size) ; - if(rc) { - fprintf(stderr, "RegQueryValueEx(1) failed: %d\n", rc); - return 0; - } - buf = (char*)malloc(size+1); - rc = RegQueryValueEx(key, NULL, 0, &type, (BYTE*)buf, (LPDWORD)&size); - if(rc) { - fprintf(stderr, "RegQueryValueEx(2) failed: %d\n", rc); - return 0; - } - if(type == REG_SZ || type == REG_EXPAND_SZ) { - while(size && buf[size-1] == '\0') - --size; - buf[size] = 0; - /* TODO: convert */ - return buf; - } else if(type == REG_BINARY) { - return buf; - } - return 0; -} - -int setRegistryEntry(char*key,char*value) -{ - HKEY hkey1; - HKEY hkey2; - int ret1 = 0, ret2=0; - ret1 = RegCreateKey(HKEY_CURRENT_USER, key, &hkey1); - ret2 = RegCreateKey(HKEY_LOCAL_MACHINE, key, &hkey2); - if(ret1 && ret2) { - fprintf(stderr, "registry: CreateKey %s failed\n", key); - return 0; - } - if(!ret1) - ret1 = RegSetValue(hkey1, NULL, REG_SZ, value, strlen(value)+1); - if(!ret2) - ret2 = RegSetValue(hkey2, NULL, REG_SZ, value, strlen(value)+1); - if(ret1 && ret2) { - fprintf(stderr, "registry: SetValue %s failed\n", key); - return 0; - } - return 1; -} - - -#endif - -//HINSTANCE me = GetModuleHandle(NULL); - -char* getInstallationPath() -{ -#if defined(WIN32) - char* path = getRegistryEntry("Software\\quiss.org\\swftools\\InstallPath"); - if(path) - return path; - else - return 0; -#elif defined(CYGWIN) - return SWFTOOLS_DATADIR; -#else - return SWFTOOLS_DATADIR; -#endif -} - -char* concatPaths(const char*base, const char*add) -{ - int l1 = strlen(base); - int l2 = strlen(add); - int pos = 0; - char*n = 0; - while(l1 && base[l1-1] == path_seperator) - l1--; - while(pos < l2 && add[pos] == path_seperator) - pos++; - - n = (char*)malloc(l1 + (l2-pos) + 2); - memcpy(n,base,l1); - n[l1]=path_seperator; - strcpy(&n[l1+1],&add[pos]); - return n; -} - -char* stripFilename(const char*filename, const char*newext) -{ - char*last1 = strrchr(filename, '/'); - char*last2 = strrchr(filename, '\\'); - const char*pos = filename; - char*name; - char*dot; - if(last1>pos) pos = last1 + 1; - if(last2>pos) pos = last2 + 1; - name = (char*)malloc(strlen(pos)+2+(newext?strlen(newext):3)); - strcpy(name, pos); - dot = strrchr(name, '.'); - if(dot) { - *dot = 0; - } - if(newext) - strcat(name, newext); - return name; -} - -static char* getTempDir() -{ -#ifdef WIN32 - char*dir = getenv("TMP"); - if(!dir) dir = getenv("TEMP"); - if(!dir) dir = getenv("tmp"); - if(!dir) dir = getenv("temp"); - if(!dir) dir = "C:\\"; -#else - char* dir = "/tmp/"; -#endif - return dir; -} - -char* mktempname(char*ptr, const char*ext) { - static char tmpbuf[160]; - char*dir = getTempDir(); - int l = strlen(dir); - char*sep = ""; - if(!ptr) - ptr = tmpbuf; - if(l && dir[l-1]!='/' && dir[l-1]!='\\') { -#ifdef WIN32 - sep = "\\"; -#else - sep = "/"; -#endif - } - -#ifdef HAVE_LRAND48 - unsigned int r1 = (unsigned int)lrand48(); - unsigned int r2 = (unsigned int)lrand48(); -#elif HAVE_RAND - unsigned int r1 = rand(); - unsigned int r2 = rand(); -#else - static int count = 1; - unsigned int r1 = time(0); - unsigned int r2 = (unsigned int)tmpbuf<<8^count; - count ++; -#endif - if(ext) { - sprintf(ptr, "%s%s%04x%04x.%s",dir,sep,r1,r2,ext); - } else { - sprintf(ptr, "%s%s%04x%04x",dir,sep,r1,r2); - } - return ptr; -} - -memfile_t* memfile_open(const char*path) -{ - memfile_t*file = malloc(sizeof(memfile_t)); -#if defined(HAVE_MMAP) && defined(HAVE_STAT) - int fi = open(path, O_RDONLY); - if(fi<0) { - perror(path); - free(file); - return 0; - } - struct stat sb; - if(fstat(fi, &sb)<0) { - perror(path); - return 0; - } - file->len = sb.st_size; - file->data = mmap(0, sb.st_size, PROT_READ, MAP_PRIVATE, fi, 0); - close(fi); -#else - FILE*fi = fopen(path, "rb"); - if(!fi) { - perror(path); - free(file); - return 0; - } - fseek(fi, 0, SEEK_END); - file->len = ftell(fi); - fseek(fi, 0, SEEK_SET); - file->data = malloc(file->len); - if(!file->data) { - fprintf(stderr, "Out of memory while allocating memory for file %s\n", path); - free(file); - return 0; - } - fread(file->data, file->len, 1, fi); - fclose(fi); -#endif - return file; -} - -void memfile_close(memfile_t*file) -{ -#if defined(HAVE_MMAP) && defined(HAVE_STAT) - munmap(file->data, file->len); -#else - free(file->data); -#endif - file->data = 0; - file->len = 0; - free(file); -} - -void move_file(const char*from, const char*to) -{ - int result = rename(from, to); - - if(result==0) return; //done! - - /* if we can't rename, for some reason, copy the file - manually */ - FILE*fi = fopen(from, "rb"); - if(!fi) { - perror(from); - return; - } - FILE*fo = fopen(to, "wb"); - if(!fo) { - perror(to); - return; - } - char buffer[16384]; - while(1) { - int bytes = fread(buffer, 16384, 1, fi); - if(bytes<=0) - return; - fwrite(buffer, bytes, 1, fo); - } - - fclose(fo); - fclose(fi); -} - -char file_exists(const char*filename) -{ -#ifdef HAVE_STAT - struct stat sb; - return stat(filename, &sb) >= 0; -#else - int fi = open(filename, O_RDONLY); - if(fi>=0) { - close(fi); - return 1; - } - return 0; -#endif -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/os.h b/fluidbook/tools/swftools-special-swfdump/lib/os.h deleted file mode 100644 index 3efd8f306..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/os.h +++ /dev/null @@ -1,59 +0,0 @@ -/* os.h - -header file for operating system dependent functions - -Part of the swftools package. - -Copyright (c) 2005 Matthias Kramm - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - - -#ifndef __os_h__ -#define __os_h__ -#include "../config.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern char path_seperator; - -#ifdef WIN32 -char* getRegistryEntry(char*path); -int setRegistryEntry(char*key,char*value); -#endif - -typedef struct _memfile { - void*data; - int len; -} memfile_t; -memfile_t* memfile_open(const char*path); -void memfile_close(memfile_t*file); - -char* getInstallationPath(); -char* concatPaths(const char*base, const char*add); -char* stripFilename(const char*filename, const char*newext); - -char* mktempname(char*buffer, const char*ext); - -void move_file(const char*from, const char*to); -char file_exists(const char*filename); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.cc deleted file mode 100644 index 7b175b36d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.cc +++ /dev/null @@ -1,2071 +0,0 @@ -/* InfoOutputDev.h - - Output Device which creates a bitmap. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include "BitmapOutputDev.h" -#include "CharOutputDev.h" - -#ifdef HAVE_POPPLER - #include "splash/SplashBitmap.h" - #include "splash/SplashPattern.h" - #include "splash/Splash.h" -#else - #include "xpdf/config.h" - #include "SplashBitmap.h" - #include "SplashGlyphBitmap.h" - #include "SplashPattern.h" - #include "Splash.h" -#endif - -#include "../log.h" -#include "../png.h" -#include "../devices/record.h" -#include "../gfxtools.h" -#include "../types.h" -#include "bbox.h" - -#define UNKNOWN_BOUNDING_BOX 0,0,0,0 - -static SplashColor splash_white = {255,255,255}; -static SplashColor splash_black = {0,0,0}; - -ClipState::ClipState() -{ - this->next = 0; - this->clipbitmap = 0; - this->written = 0; -} - -static gfxdevice_t* device_new_record() -{ - gfxdevice_t*dev = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_record_init(dev, 0); - return dev; -} - -BitmapOutputDev::BitmapOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) -:CommonOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2) -{ - this->info = info; - this->doc = doc; - this->xref = doc->getXRef(); - - /* color graphic output device, for creating bitmaps */ - this->rgbdev = new SplashOutputDev(splashModeRGB8, 1, gFalse, splash_white, gTrue, gTrue); - - /* color mode for binary bitmaps */ - SplashColorMode colorMode = splashModeMono1; - - /* two devices for testing things against clipping: one clips, the other doesn't */ - this->clip0dev = new SplashOutputDev(colorMode, 1, gFalse, splash_black, gTrue, gFalse); - this->clip1dev = new SplashOutputDev(colorMode, 1, gFalse, splash_black, gTrue, gFalse); - - /* device indicating where polygonal pixels were drawn */ - this->boolpolydev = new SplashOutputDev(colorMode, 1, gFalse, splash_black, gTrue, gFalse); - /* device indicating where text pixels were drawn */ - this->booltextdev = new SplashOutputDev(colorMode, 1, gFalse, splash_black, gTrue, gFalse); - - /* device for handling texts and links */ - this->gfxdev = new CharOutputDev(info, this->doc, page2page, num_pages, x, y, x1, y1, x2, y2); - - this->rgbdev->startDoc(this->xref); - this->boolpolydev->startDoc(this->xref); - this->booltextdev->startDoc(this->xref); - this->clip0dev->startDoc(this->xref); - this->clip1dev->startDoc(this->xref); - - this->gfxoutput_string = device_new_record(); - this->gfxoutput = device_new_record(); - this->gfxdev->setDevice(this->gfxoutput); - - this->config_extrafontdata = 0; - this->config_optimizeplaincolorfills = 0; - this->config_skewedtobitmap = 0; - this->config_alphatobitmap = 0; - this->bboxpath = 0; - //this->clipdev = 0; - //this->clipstates = 0; -} -BitmapOutputDev::~BitmapOutputDev() -{ - if(this->gfxoutput) { - gfxresult_t*r = this->gfxoutput->finish(this->gfxoutput); - r->destroy(r); - free(this->gfxoutput);this->gfxoutput = 0; - } - if(this->gfxoutput_string) { - gfxresult_t*r = this->gfxoutput_string->finish(this->gfxoutput_string); - r->destroy(r); - free(this->gfxoutput_string);this->gfxoutput_string = 0; - } - if(this->bboxpath) { - delete this->bboxpath;this->bboxpath = 0; - } - if(this->rgbdev) { - delete this->rgbdev;this->rgbdev = 0; - } - if(this->gfxdev) { - delete this->gfxdev;this->gfxdev= 0; - } - if(this->boolpolydev) { - delete this->boolpolydev;this->boolpolydev = 0; - } - if(this->stalepolybitmap) { - delete this->stalepolybitmap;this->stalepolybitmap = 0; - } - if(this->staletextbitmap) { - delete this->staletextbitmap;this->staletextbitmap = 0; - } - if(this->booltextdev) { - delete this->booltextdev;this->booltextdev = 0; - } - if(this->clip0dev) { - delete this->clip0dev;this->clip0dev = 0; - } - if(this->clip1dev) { - delete this->clip1dev;this->clip1dev = 0; - } - //if(this->clipbitmap) { - // delete this->clipbitmap;this->clipbitmap = 0; - //} - //if(this->clipdev) { - // delete this->clipdev;this->clipdev = 0; - //} - -} - -GBool BitmapOutputDev::getVectorAntialias() -{ - return this->rgbdev->getVectorAntialias(); -} -void BitmapOutputDev::setVectorAntialias(GBool vaa) -{ - this->rgbdev->setVectorAntialias(vaa); -} -void BitmapOutputDev::setDevice(gfxdevice_t*dev) -{ - this->dev = dev; -} -void BitmapOutputDev::setParameter(const char*key, const char*value) -{ - if(!strcmp(key, "extrafontdata")) { - this->config_extrafontdata = atoi(value); - } else if(!strcmp(key, "skewedtobitmap")) { - this->config_skewedtobitmap = atoi(value); - } else if(!strcmp(key, "alphatobitmap")) { - this->config_alphatobitmap = atoi(value); - } - - this->gfxdev->setParameter(key, value); -} - -void writeBitmap(SplashBitmap*bitmap, char*filename); -void writeAlpha(SplashBitmap*bitmap, char*filename); - -static int dbg_btm_counter=1; - -void BitmapOutputDev::flushBitmap() -{ - int bitmap_width = rgbdev->getBitmapWidth(); - int bitmap_height = rgbdev->getBitmapHeight(); - - if(sizeof(SplashColor)!=3) { - msg(" sizeof(SplashColor)!=3"); - return; - } - - /*static int counter=0; - if(!counter) { - writeBitmap(rgbdev->getBitmap(), "test.png"); - } counter++;*/ - - /*static int counter=0; - char filename[160]; - sprintf(filename, "test%d.png", counter++); - writeBitmap(rgbbitmap, filename);*/ - - SplashColorPtr rgb = rgbbitmap->getDataPtr(); - Guchar*alpha = rgbbitmap->getAlphaPtr(); - - Guchar*alpha2 = stalepolybitmap->getDataPtr(); - int bitmap_width8 = (stalepolybitmap->getWidth()+7)/8; - - /*char filename[80]; - sprintf(filename, "flush%d_mask.png", dbg_btm_counter); - writeAlpha(stalepolybitmap, filename); - sprintf(filename, "flush%d_alpha.png", dbg_btm_counter); - writeAlpha(rgbbitmap, filename); - sprintf(filename, "flush%d_bitmap.png", dbg_btm_counter); - writeBitmap(rgbbitmap, filename);*/ - - ibbox_t pagebox = {-movex, -movey, -movex + this->width, -movey + this->height, 0}; - ibbox_t bitmapbox = {0, 0, bitmap_width, bitmap_height, 0}; - ibbox_t c = ibbox_clip(&bitmapbox, &pagebox); - ibbox_t* boxes = get_bitmap_bboxes((unsigned char*)(alpha+c.ymin*bitmap_width+c.xmin), c.xmax - c.xmin, c.ymax - c.ymin, bitmap_width); - - ibbox_t*b; - for(b=boxes;b;b=b->next) { - int xmin = b->xmin - this->movex; - int ymin = b->ymin - this->movey; - int xmax = b->xmax - this->movex; - int ymax = b->ymax - this->movey; - - /* clip against (-movex, -movey, -movex+width, -movey+height) */ - - msg(" Flushing bitmap (bbox: %d,%d,%d,%d %dx%d) (clipped against %d,%d,%d,%d)", xmin,ymin,xmax,ymax, xmax-xmin, ymax-ymin, - -this->movex, -this->movey, -this->movex+this->width, -this->movey+this->height); - - if(xmin < -this->movex) { - xmin = -this->movex; - if(xmax < -this->movex) continue; - } - if(ymin < -this->movey) { - ymin = -this->movey; - if(ymax < -this->movey) continue; - } - if(xmax >= -this->movex + this->width) { - xmax = -this->movex+this->width; - if(xmin >= -this->movex + this->width) continue; - } - if(ymax >= -this->movey + this->height) { - ymax = -this->movey+this->height; - if(ymin >= -this->movey + this->height) continue; - } - - if((xmax-xmin)<=0 || (ymax-ymin)<=0) // no bitmap, nothing to do - continue; - - int rangex = xmax-xmin; - int rangey = ymax-ymin; - gfximage_t*img = (gfximage_t*)malloc(sizeof(gfximage_t)); - img->data = (gfxcolor_t*)malloc(rangex * rangey * 4); - img->width = rangex; - img->height = rangey; - int x,y; - for(y=0;ydata[y*rangex]; - Guchar*ain = &alpha[(y+ymin)*bitmap_width+xmin]; - Guchar*ain2 = &alpha2[(y+ymin)*bitmap_width8]; - if(this->emptypage) { - for(x=0;x>((x+xmin)&7)))) { - /* cut away pixels that we don't remember drawing (i.e., that are - not in the monochrome bitmap). Prevents some "hairlines" showing - up to the left and right of bitmaps. */ - out[x].r = 0;out[x].g = 0;out[x].b = 0;out[x].a = 0; - } else { - /* according to endPage()/compositeBackground() in xpdf/SplashOutputDev.cc, this - data has non-premultiplied alpha, which is exactly what the output device - expects, so don't premultiply it here, either. - */ - out[x].r = in[x*3+0]; - out[x].g = in[x*3+1]; - out[x].b = in[x*3+2]; - out[x].a = ain[x]; - } - } - } - } - - /* transform bitmap rectangle to "device space" */ - xmin += movex; - ymin += movey; - xmax += movex; - ymax += movey; - - gfxmatrix_t m; - m.tx = xmin; - m.ty = ymin; - m.m00 = m.m11 = 1; - m.m10 = m.m01 = 0; - m.tx -= 0.5; - m.ty -= 0.5; - - gfxline_t* line = gfxline_makerectangle(xmin, ymin, xmax, ymax); - dev->fillbitmap(dev, line, img, &m, 0); - gfxline_free(line); - - if(img->data) { - free(img->data);img->data=0; - } - free(img);img=0; - } - ibbox_destroy(boxes); - - memset(rgbbitmap->getAlphaPtr(), 0, rgbbitmap->getWidth()*rgbbitmap->getHeight()); - memset(rgbbitmap->getDataPtr(), 0, rgbbitmap->getRowSize()*rgbbitmap->getHeight()); - - this->emptypage = 0; -} - -void BitmapOutputDev::flushText() -{ - msg(" Flushing text"); - - static gfxfontlist_t*output_font_list = 0; - static gfxdevice_t*last = 0; - if(last != this->dev) { - if(output_font_list) - gfxfontlist_free(output_font_list, 0); - output_font_list = gfxfontlist_create(); - } - gfxdevice_record_flush(this->gfxoutput, this->dev, &output_font_list); - last = this->dev; - - this->emptypage = 0; -} - -void writeMonoBitmap(SplashBitmap*btm, char*filename) -{ - int width8 = (btm->getWidth()+7)/8; - int width = btm->getWidth(); - int height = btm->getHeight(); - gfxcolor_t*b = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height); - unsigned char*data = btm->getDataPtr(); - int x,y; - for(y=0;y>3]&(128>>(x&7))) { - d[x].r = d[x].b = d[x].a = 255; - d[x].g = 0; - } else { - d[x].r = d[x].g = d[x].b = d[x].a = 0; - } - } - } - png_write_quick(filename, (unsigned char*)b, width, height); - free(b); -} - -void writeBitmap(SplashBitmap*bitmap, char*filename) -{ - int y,x; - - int width = bitmap->getWidth(); - int height = bitmap->getHeight(); - - gfxcolor_t*data = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height); - - if(bitmap->getMode()==splashModeMono1) { - writeMonoBitmap(bitmap, filename); - return; - } - - for(y=0;ygetPixel(x,y,c); - line[x].r = c[0]; - line[x].g = c[1]; - line[x].b = c[2]; - line[x].a = bitmap->getAlpha(x,y); - } - } - png_write_quick(filename, (unsigned char*)data, width, height); - free(data); -} - -void writeAlpha(SplashBitmap*bitmap, char*filename) -{ - int y,x; - - int width = bitmap->getWidth(); - int height = bitmap->getHeight(); - - if(bitmap->getMode()==splashModeMono1) { - writeMonoBitmap(bitmap, filename); - return; - } - - gfxcolor_t*data = (gfxcolor_t*)malloc(sizeof(gfxcolor_t)*width*height); - - for(y=0;ygetAlpha(x,y); - line[x].r = a; - line[x].g = 0; - line[x].b = a; - line[x].a = a; - } - } - png_write_quick(filename, (unsigned char*)data, width, height); - free(data); -} - -static const char*STATE_NAME[] = {"parallel", "textabovebitmap", "bitmapabovetext"}; - -int checkAlphaSanity(SplashBitmap*boolbtm, SplashBitmap*alphabtm) -{ - assert(boolbtm->getWidth() == alphabtm->getWidth()); - assert(boolbtm->getHeight() == alphabtm->getHeight()); - if(boolbtm->getMode()==splashModeMono1) { - return 1; - } - - int width = boolbtm->getWidth(); - int height = boolbtm->getHeight(); - - int bad=0; - int x,y; - for(y=0;ygetAlpha(x,y); - int a2 = boolbtm->getAlpha(x,y); - if(a1!=a2) { - bad++; - } - } - } - double badness = bad/(double)(width*height); - if(badness>0.2) { - msg(" Bitmaps don't correspond: %d out of %d pixels wrong (%.2f%%)", bad, width*height, - badness*100.0); - return 0; - } - msg(" %f", badness); - return 1; -} - -static inline GBool fixBBox(int*x1, int*y1, int*x2, int*y2, int width, int height) -{ - if(!(*x1|*y1|*x2|*y2)) { - // undefined bbox - *x1 = *y1 = 0; - *x2 = width; - *y2 = height; - return gTrue; - } - if(*x2<=*x1) return gFalse; - if(*x2<0) return gFalse; - if(*x1<0) *x1 = 0; - if(*x1>=width) return gFalse; - if(*x2>width) *x2=width; - - if(*y2<=*y1) return gFalse; - if(*y2<0) return gFalse; - if(*y1<0) *y1 = 0; - if(*y1>=height) return gFalse; - if(*y2>height) *y2=height; - return gTrue; -} - -static void update_bitmap(SplashBitmap*bitmap, SplashBitmap*update, int x1, int y1, int x2, int y2, char overwrite) -{ - assert(bitmap->getMode()==splashModeMono1); - assert(update->getMode()==splashModeMono1); - - int width8 = (bitmap->getWidth()+7)/8; - assert(width8 == bitmap->getRowSize()); - assert(width8 == update->getRowSize()); - int height = bitmap->getHeight(); - assert(height == update->getHeight()); - - if(!fixBBox(&x1, &y1, &x2, &y2, bitmap->getWidth(), bitmap->getHeight())) - return; - - Guchar*b = bitmap->getDataPtr() + y1*width8 + x1/8; - Guchar*u = update->getDataPtr() + y1*width8 + x1/8; - int yspan = y2-y1; - int xspan = (x2+7)/8 - x1/8; - int size = (y2-y1)*width8; - - if(overwrite) { - int y; - for(y=0;ygetWidth(), btm->getHeight())) - return; - - if(btm->getMode()==splashModeMono1) { - int width8 = (btm->getWidth()+7)/8; - assert(width8 == btm->getRowSize()); - int width = btm->getWidth(); - int height = btm->getHeight(); - Guchar*data = btm->getDataPtr(); - memset(data+y1*width8, 0, width8*(y2-y1)); - } else { - int width = btm->getAlphaRowSize(); - int height = btm->getHeight(); - memset(btm->getAlphaPtr(), 0, width*height); - } -} - -void BitmapOutputDev::dbg_newdata(char*newdata) -{ - if(0) { - char filename1[80]; - char filename2[80]; - char filename3[80]; - char filename4[80]; - char filename5[80]; - sprintf(filename1, "state%03dboolbitmap_after%s.png", dbg_btm_counter, newdata); - sprintf(filename2, "state%03dbooltext_after%s.png", dbg_btm_counter, newdata); - sprintf(filename3, "state%03dstalebitmap_after%s.png", dbg_btm_counter, newdata); - sprintf(filename4, "state%03dstaletext_after%s.png", dbg_btm_counter, newdata); - sprintf(filename5, "state%03dbitmap_after%s.png", dbg_btm_counter, newdata); - msg(" %s %s %s", filename1, filename2, filename5); - writeAlpha(boolpolybitmap, filename1); - writeAlpha(booltextbitmap, filename2); - writeAlpha(stalepolybitmap, filename3); - writeAlpha(staletextbitmap, filename4); - writeBitmap(rgbdev->getBitmap(), filename5); - } - dbg_btm_counter++; -} - -static void getBitmapBBox(SplashBitmap*b, int*xmin, int*ymin, int*xmax, int*ymax) -{ - int width = b->getWidth(); - int height = b->getHeight(); - int width8 = (width+7)>>3; - Guchar*pixels = b->getDataPtr(); - int x,y; - *xmin = *ymin = *xmax = *ymax = 0; - for(x=0;x>xb)) { - *xmin = x*8+xb; - break; - } - } - } - if(y=0;x--) { - int xb; - for(xb=7;xb>=0;xb--) { - for(y=0;y>xb)) { - *xmax = x*8+xb; - break; - } - } - if(y=0;y--) { - for(x=0;x Testing new text data against current bitmap data, state=%s, counter=%d\n", STATE_NAME[layerstate], dbg_btm_counter); - - GBool ret = false; - if(intersection(booltextbitmap, stalepolybitmap, x1,y1,x2,y2)) { - if(layerstate==STATE_PARALLEL) { - /* the new text is above the bitmap. So record that fact. */ - msg(" Text is above current bitmap/polygon data"); - layerstate=STATE_TEXT_IS_ABOVE; - update_bitmap(staletextbitmap, booltextbitmap, x1, y1, x2, y2, 0); - } else if(layerstate==STATE_BITMAP_IS_ABOVE) { - /* there's a bitmap above the (old) text. So we need - to flush out that text, and record that the *new* - text is now *above* the bitmap - */ - msg(" Text is above current bitmap/polygon data (which is above some other text)"); - flushText(); - layerstate=STATE_TEXT_IS_ABOVE; - - clearBoolTextDev(); - /* re-apply the update (which we would otherwise lose) */ - update_bitmap(staletextbitmap, booltextbitmap, x1, y1, x2, y2, 1); - ret = true; - } else { - /* we already know that the current text section is - above the current bitmap section- now just new - bitmap data *and* new text data was drawn, and - *again* it's above the current bitmap. */ - msg(" Text is still above current bitmap/polygon data"); - update_bitmap(staletextbitmap, booltextbitmap, x1, y1, x2, y2, 0); - } - } else { - update_bitmap(staletextbitmap, booltextbitmap, x1, y1, x2, y2, 0); - } - - /* clear the thing we just drew from our temporary drawing bitmap */ - clearBooleanBitmap(booltextbitmap, x1, y1, x2, y2); - -#ifdef DEBUG - if(intersection(booltextbitmap, booltextbitmap, UNKNOWN_BOUNDING_BOX)) { - msg(" Text bitmap is not empty after clear. Bad bounding box?"); - exit(1); - } - clearBooleanBitmap(booltextbitmap, UNKNOWN_BOUNDING_BOX); -#endif - return ret; -} -GBool BitmapOutputDev::checkNewBitmap(int x1, int y1, int x2, int y2) -{ - /* similar to checkNewText() above, only in reverse */ - msg(" Testing new graphics data against current text data, state=%s, counter=%d\n", STATE_NAME[layerstate], dbg_btm_counter); - - GBool ret = false; - if(intersection(boolpolybitmap, staletextbitmap, x1,y1,x2,y2)) { - if(layerstate==STATE_PARALLEL) { - msg(" Bitmap is above current text data"); - layerstate=STATE_BITMAP_IS_ABOVE; - update_bitmap(stalepolybitmap, boolpolybitmap, x1, y1, x2, y2, 0); - } else if(layerstate==STATE_TEXT_IS_ABOVE) { - msg(" Bitmap is above current text data (which is above some bitmap)"); - flushBitmap(); - layerstate=STATE_BITMAP_IS_ABOVE; - clearBoolPolyDev(); - update_bitmap(stalepolybitmap, boolpolybitmap, x1, y1, x2, y2, 1); - ret = true; - } else { - msg(" Bitmap is still above current text data"); - update_bitmap(stalepolybitmap, boolpolybitmap, x1, y1, x2, y2, 0); - } - } else { - update_bitmap(stalepolybitmap, boolpolybitmap, x1, y1, x2, y2, 0); - } - - /* clear the thing we just drew from our temporary drawing bitmap */ - clearBooleanBitmap(boolpolybitmap, x1, y1, x2, y2); - -#ifdef DEBUG - if(intersection(boolpolybitmap, boolpolybitmap, UNKNOWN_BOUNDING_BOX)) { - writeAlpha(boolpolybitmap, "notempty.png"); - msg(" Polygon bitmap is not empty after clear. Bad bounding box?"); - int _x1, _y1, _x2, _y2; - getBitmapBBox(boolpolybitmap, &_x1, &_y1, &_x2, &_y2); - printf("expected: %d %d %d %d <=> real: %d %d %d %d (%d,%d)\n", - x1, y1, x2, y2, _x1, _y1, _x2, _y2, movex, movey); - exit(1); - } - clearBooleanBitmap(boolpolybitmap, UNKNOWN_BOUNDING_BOX); -#endif - return ret; -} - -void scan_bitmap(SplashBitmap*bitmap) -{ - int width = bitmap->getWidth(); - int width8 = (width+7)/8; - int height = bitmap->getHeight(); - - int x,y; - int x1=width,y1=height,x2=0,y2=0; - for(y=0;ygetDataPtr() + y*width8; - for(x=0;xy2) y2=y; - int x8; - for(x8=0;x8<8;x8++) { - if((b[x]<=0;x--) { - if(b[x]) { - int x8; - for(x8=7;x8>=0;x8--) { - if((b[x]<x2) x2 = x; - break; - } - } - } - if(x1>x2 || y1>y2) { - printf("bitmap is empty\n"); - } else { - printf("bounding box of bitmap is %d,%d,%d,%d\n", x1, y1, x2, y2); - } -} - -//void checkNewText() { -// Guchar*alpha = rgbbitmap->getAlphaPtr(); -// Guchar*charpixels = clip1bitmap->getDataPtr(); -// int xx,yy; -// for(yy=0;yy>3; -// /* TODO: is the bit order correct? */ -// if(aline[xx] && (cline[bytepos]&(1<getMode()==splashModeMono1) { - int width = clip0bitmap->getWidth(); - int width8 = (width+7)/8; - int height = clip0bitmap->getHeight(); - - if(!fixBBox(&x1,&y1,&x2,&y2,width,height)) { - /* area is outside or null */ - return gFalse; - } - - SplashBitmap*clip0 = clip0bitmap; - SplashBitmap*clip1 = clip1bitmap; - int x18 = x1/8; - int x28 = (x2+7)/8; - int y; - - for(y=y1;ygetDataPtr()[width8*y+x18]; - unsigned char*row2 = &clip1bitmap->getDataPtr()[width8*y+x18]; - if(memcmp(row1, row2, x28-x18)) { - return gTrue; - } - } - return gFalse; - } else { - SplashBitmap*clip0 = clip0bitmap; - SplashBitmap*clip1 = clip1bitmap; - int width = clip0->getAlphaRowSize(); - int height = clip0->getHeight(); - - if(!fixBBox(&x1, &y1, &x2, &y2, width, height)) { - x1=y1=0;x2=y2=1; - } - - Guchar*a0 = clip0->getAlphaPtr(); - Guchar*a1 = clip1->getAlphaPtr(); - int x,y; - char differs=0; - for(y=y1;y Strange internal error (2)"); - else if(!differs && differs2) { - msg(" Bad Bounding Box: Difference in clip0 and clip1 outside bbox"); - msg(" %d %d %d %d", x1, y1, x2, y2); - } - return differs2; - } -} - -GBool compare8(unsigned char*data1, unsigned char*data2, int len) -{ - if(!len) - return 0; - if(((ptroff_t)data1&7)==((ptroff_t)data2&7)) { - // oh good, we can align both to 8 byte - while((ptroff_t)data1&7) { - if(*data1&*data2) - return 1; - data1++; - data2++; - if(!--len) - return 0; - } - } - /* use 64 bit for the (hopefully aligned) middle section */ - int l8 = len/8; - long long unsigned int*d1 = (long long unsigned int*)data1; - long long unsigned int*d2 = (long long unsigned int*)data2; - long long unsigned int x = 0; - int t; - for(t=0;tgetMode()==splashModeMono1) { - /* alternative implementation, using one bit per pixel- - needs the no-dither patch in xpdf */ - - int width = boolpoly->getWidth(); - int height = boolpoly->getHeight(); - - if(!fixBBox(&x1,&y1,&x2,&y2, width, height)) { - return gFalse; - } - - Guchar*polypixels = boolpoly->getDataPtr(); - Guchar*textpixels = booltext->getDataPtr(); - - int width8 = (width+7)/8; - int runx = width8; - int runy = height; - - if(x1|y1|x2|y2) { - polypixels+=y1*width8+x1/8; - textpixels+=y1*width8+x1/8; - runx=(x2+7)/8 - x1/8; - runy=y2-y1; - } - - int t; - unsigned char c=0; - - /*assert(sizeof(unsigned long long int)==8); - if(((ptroff_t)polypixels&7) || ((ptroff_t)textpixels&7)) { - //msg(" Non-optimal alignment"); - }*/ - - int x,y; - unsigned char*data1 = (unsigned char*)polypixels; - unsigned char*data2 = (unsigned char*)textpixels; - msg(" Testing area (%d,%d,%d,%d), runx=%d,runy=%d,state=%d", x1,y1,x2,y2, runx, runy, dbg_btm_counter); - for(y=0;ygetAlphaRowSize(); - int height = boolpoly->getHeight(); - - if(!fixBBox(&x1, &y1, &x2, &y2, width, height)) { - x1=y1=0;x2=y2=1; - } - Guchar*polypixels = boolpoly->getAlphaPtr(); - Guchar*textpixels = booltext->getAlphaPtr(); - - int x,y; - char overlap1 = 0; - char overlap2 = 0; - for(x=x1;xx?ax2:x; - ay2 = ay2>y?ay2:y; - } - } - } - } - if(overlap1 && !overlap2) - msg(" strange internal error"); - if(!overlap1 && overlap2) { - msg(" Bad bounding box: intersection outside bbox"); - msg(" given bbox: %d %d %d %d", x1, y1, x2, y2); - msg(" changed area: %d %d %d %d", ax1, ay1, ax2, ay2); - } - return overlap2; - } -} - -GBool BitmapOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data), - void *abortCheckCbkData) -{ - this->setPage(page); - gfxdev->setPage(page); - return gTrue; -} - -void BitmapOutputDev::beginPage(GfxState *state, int pageNum) -{ - rgbdev->startPage(pageNum, state); - boolpolydev->startPage(pageNum, state); - booltextdev->startPage(pageNum, state); - clip0dev->startPage(pageNum, state); - clip1dev->startPage(pageNum, state); - gfxdev->startPage(pageNum, state); - - boolpolybitmap = boolpolydev->getBitmap(); - stalepolybitmap = new SplashBitmap(boolpolybitmap->getWidth(), boolpolybitmap->getHeight(), 1, boolpolybitmap->getMode(), 0); - assert(stalepolybitmap->getRowSize() == boolpolybitmap->getRowSize()); - - booltextbitmap = booltextdev->getBitmap(); - staletextbitmap = new SplashBitmap(booltextbitmap->getWidth(), booltextbitmap->getHeight(), 1, booltextbitmap->getMode(), 0); - assert(staletextbitmap->getRowSize() == booltextbitmap->getRowSize()); - - msg(" startPage %dx%d (%dx%d)", this->width, this->height, booltextbitmap->getWidth(), booltextbitmap->getHeight()); - - clip0bitmap = clip0dev->getBitmap(); - clip1bitmap = clip1dev->getBitmap(); - rgbbitmap = rgbdev->getBitmap(); - - flushText(); // write out the initial clipping rectangle - - /* just in case any device did draw a white background rectangle - into the device */ - clearBoolTextDev(); - clearBoolPolyDev(); - - this->layerstate = STATE_PARALLEL; - this->emptypage = 1; - msg(" startPage done"); -} - -void BitmapOutputDev::endPage() -{ - msg(" endPage (BitmapOutputDev)"); -} -void BitmapOutputDev::finishPage() -{ - msg(" finishPage (BitmapOutputDev)"); - - flushEverything(); - gfxdev->endPage(); - flushEverything(); - - /* splash will now destroy alpha, and paint the - background color into the "holes" in the bitmap */ - boolpolydev->endPage(); - booltextdev->endPage(); - rgbdev->endPage(); - clip0dev->endPage(); - clip1dev->endPage(); -} - -GBool BitmapOutputDev::upsideDown() -{ - boolpolydev->upsideDown(); - booltextdev->upsideDown(); - clip0dev->upsideDown(); - clip1dev->upsideDown(); - return rgbdev->upsideDown(); -} - -GBool BitmapOutputDev::useDrawChar() -{ - boolpolydev->useDrawChar(); - booltextdev->useDrawChar(); - clip0dev->useDrawChar(); - clip1dev->useDrawChar(); - return rgbdev->useDrawChar(); -} - -GBool BitmapOutputDev::useTilingPatternFill() -{ - boolpolydev->useTilingPatternFill(); - booltextdev->useTilingPatternFill(); - clip0dev->useTilingPatternFill(); - clip1dev->useTilingPatternFill(); - return rgbdev->useTilingPatternFill(); -} - -GBool BitmapOutputDev::useShadedFills() -{ - boolpolydev->useShadedFills(); - booltextdev->useShadedFills(); - clip0dev->useShadedFills(); - clip1dev->useShadedFills(); - return rgbdev->useShadedFills(); -} - -GBool BitmapOutputDev::useDrawForm() -{ - boolpolydev->useDrawForm(); - booltextdev->useDrawForm(); - clip0dev->useDrawForm(); - clip1dev->useDrawForm(); - return rgbdev->useDrawForm(); -} - -GBool BitmapOutputDev::interpretType3Chars() -{ - boolpolydev->interpretType3Chars(); - booltextdev->interpretType3Chars(); - clip0dev->interpretType3Chars(); - clip1dev->interpretType3Chars(); - return rgbdev->interpretType3Chars(); -} - -GBool BitmapOutputDev::needNonText() -{ - boolpolydev->needNonText(); - booltextdev->needNonText(); - clip0dev->needNonText(); - clip1dev->needNonText(); - return rgbdev->needNonText(); -} -void BitmapOutputDev::setDefaultCTM(double *ctm) -{ - boolpolydev->setDefaultCTM(ctm); - booltextdev->setDefaultCTM(ctm); - rgbdev->setDefaultCTM(ctm); - clip0dev->setDefaultCTM(ctm); - clip1dev->setDefaultCTM(ctm); - gfxdev->setDefaultCTM(ctm); -} -void BitmapOutputDev::saveState(GfxState *state) -{ - boolpolydev->saveState(state); - booltextdev->saveState(state); - rgbdev->saveState(state); - clip0dev->saveState(state); - clip1dev->saveState(state); - - /*ClipState*cstate = new ClipState(); - cstate->next = this->clipstates; - this->clipstates = cstate;*/ -} -void BitmapOutputDev::restoreState(GfxState *state) -{ - boolpolydev->restoreState(state); - booltextdev->restoreState(state); - rgbdev->restoreState(state); - clip0dev->restoreState(state); - clip1dev->restoreState(state); - - /*if(this->clipstates) { - ClipState*old = this->clipstates; - if(old->written) { - gfxdev->restoreState(state); - } - this->clipstates = this->clipstates->next; - delete(old); - } else { - msg(" invalid restoreState()"); - }*/ -} -void BitmapOutputDev::updateAll(GfxState *state) -{ - boolpolydev->updateAll(state); - booltextdev->updateAll(state); - rgbdev->updateAll(state); - clip0dev->updateAll(state); - clip1dev->updateAll(state); - gfxdev->updateAll(state); -} -void BitmapOutputDev::updateCTM(GfxState *state, double m11, double m12, double m21, double m22, double m31, double m32) -{ - boolpolydev->updateCTM(state,m11,m12,m21,m22,m31,m32); - booltextdev->updateCTM(state,m11,m12,m21,m22,m31,m32); - rgbdev->updateCTM(state,m11,m12,m21,m22,m31,m32); - clip0dev->updateCTM(state,m11,m12,m21,m22,m31,m32); - clip1dev->updateCTM(state,m11,m12,m21,m22,m31,m32); - gfxdev->updateCTM(state,m11,m12,m21,m22,m31,m32); -} -void BitmapOutputDev::updateLineDash(GfxState *state) -{ - boolpolydev->updateLineDash(state); - booltextdev->updateLineDash(state); - rgbdev->updateLineDash(state); - clip0dev->updateLineDash(state); - clip1dev->updateLineDash(state); - gfxdev->updateLineDash(state); -} -void BitmapOutputDev::updateFlatness(GfxState *state) -{ - boolpolydev->updateFlatness(state); - booltextdev->updateFlatness(state); - rgbdev->updateFlatness(state); - clip0dev->updateFlatness(state); - clip1dev->updateFlatness(state); - gfxdev->updateFlatness(state); -} -void BitmapOutputDev::updateLineJoin(GfxState *state) -{ - boolpolydev->updateLineJoin(state); - booltextdev->updateLineJoin(state); - rgbdev->updateLineJoin(state); - clip0dev->updateLineJoin(state); - clip1dev->updateLineJoin(state); - gfxdev->updateLineJoin(state); -} -void BitmapOutputDev::updateLineCap(GfxState *state) -{ - boolpolydev->updateLineCap(state); - booltextdev->updateLineCap(state); - rgbdev->updateLineCap(state); - clip0dev->updateLineCap(state); - clip1dev->updateLineCap(state); - gfxdev->updateLineCap(state); -} -void BitmapOutputDev::updateMiterLimit(GfxState *state) -{ - boolpolydev->updateMiterLimit(state); - booltextdev->updateMiterLimit(state); - rgbdev->updateMiterLimit(state); - clip0dev->updateMiterLimit(state); - clip1dev->updateMiterLimit(state); - gfxdev->updateMiterLimit(state); -} -void BitmapOutputDev::updateLineWidth(GfxState *state) -{ - boolpolydev->updateLineWidth(state); - booltextdev->updateLineWidth(state); - rgbdev->updateLineWidth(state); - clip0dev->updateLineWidth(state); - clip1dev->updateLineWidth(state); - gfxdev->updateLineWidth(state); -} -void BitmapOutputDev::updateStrokeAdjust(GfxState *state) -{ - boolpolydev->updateStrokeAdjust(state); - booltextdev->updateStrokeAdjust(state); - rgbdev->updateStrokeAdjust(state); - clip0dev->updateStrokeAdjust(state); - clip1dev->updateStrokeAdjust(state); - gfxdev->updateStrokeAdjust(state); -} -void BitmapOutputDev::updateFillColorSpace(GfxState *state) -{ - boolpolydev->updateFillColorSpace(state); - booltextdev->updateFillColorSpace(state); - rgbdev->updateFillColorSpace(state); - clip0dev->updateFillColorSpace(state); - clip1dev->updateFillColorSpace(state); - gfxdev->updateFillColorSpace(state); -} -void BitmapOutputDev::updateStrokeColorSpace(GfxState *state) -{ - boolpolydev->updateStrokeColorSpace(state); - booltextdev->updateStrokeColorSpace(state); - rgbdev->updateStrokeColorSpace(state); - clip0dev->updateStrokeColorSpace(state); - clip1dev->updateStrokeColorSpace(state); - gfxdev->updateStrokeColorSpace(state); -} -void BitmapOutputDev::updateFillColor(GfxState *state) -{ - boolpolydev->updateFillColor(state); - booltextdev->updateFillColor(state); - rgbdev->updateFillColor(state); - clip0dev->updateFillColor(state); - clip1dev->updateFillColor(state); - gfxdev->updateFillColor(state); -} -void BitmapOutputDev::updateStrokeColor(GfxState *state) -{ - boolpolydev->updateStrokeColor(state); - booltextdev->updateStrokeColor(state); - rgbdev->updateStrokeColor(state); - clip0dev->updateStrokeColor(state); - clip1dev->updateStrokeColor(state); - gfxdev->updateStrokeColor(state); -} -void BitmapOutputDev::updateBlendMode(GfxState *state) -{ - boolpolydev->updateBlendMode(state); - booltextdev->updateBlendMode(state); - rgbdev->updateBlendMode(state); - clip0dev->updateBlendMode(state); - clip1dev->updateBlendMode(state); - gfxdev->updateBlendMode(state); -} -void BitmapOutputDev::updateFillOpacity(GfxState *state) -{ - boolpolydev->updateFillOpacity(state); - booltextdev->updateFillOpacity(state); - rgbdev->updateFillOpacity(state); - clip0dev->updateFillOpacity(state); - clip1dev->updateFillOpacity(state); - gfxdev->updateFillOpacity(state); -} -void BitmapOutputDev::updateStrokeOpacity(GfxState *state) -{ - boolpolydev->updateStrokeOpacity(state); - booltextdev->updateStrokeOpacity(state); - rgbdev->updateStrokeOpacity(state); - clip0dev->updateStrokeOpacity(state); - clip1dev->updateStrokeOpacity(state); - gfxdev->updateStrokeOpacity(state); -} -void BitmapOutputDev::updateFillOverprint(GfxState *state) -{ - boolpolydev->updateFillOverprint(state); - booltextdev->updateFillOverprint(state); - rgbdev->updateFillOverprint(state); - clip0dev->updateFillOverprint(state); - clip1dev->updateFillOverprint(state); - gfxdev->updateFillOverprint(state); -} -void BitmapOutputDev::updateStrokeOverprint(GfxState *state) -{ - boolpolydev->updateStrokeOverprint(state); - booltextdev->updateStrokeOverprint(state); - rgbdev->updateStrokeOverprint(state); - clip0dev->updateStrokeOverprint(state); - clip1dev->updateStrokeOverprint(state); - gfxdev->updateStrokeOverprint(state); -} -void BitmapOutputDev::updateTransfer(GfxState *state) -{ - boolpolydev->updateTransfer(state); - booltextdev->updateTransfer(state); - rgbdev->updateTransfer(state); - clip0dev->updateTransfer(state); - clip1dev->updateTransfer(state); - gfxdev->updateTransfer(state); -} - -void BitmapOutputDev::updateFont(GfxState *state) -{ - boolpolydev->updateFont(state); - booltextdev->updateFont(state); - rgbdev->updateFont(state); - clip0dev->updateFont(state); - clip1dev->updateFont(state); - gfxdev->updateFont(state); -} -void BitmapOutputDev::updateTextMat(GfxState *state) -{ - boolpolydev->updateTextMat(state); - booltextdev->updateTextMat(state); - rgbdev->updateTextMat(state); - clip0dev->updateTextMat(state); - clip1dev->updateTextMat(state); - gfxdev->updateTextMat(state); -} -void BitmapOutputDev::updateCharSpace(GfxState *state) -{ - boolpolydev->updateCharSpace(state); - booltextdev->updateCharSpace(state); - rgbdev->updateCharSpace(state); - clip0dev->updateCharSpace(state); - clip1dev->updateCharSpace(state); - gfxdev->updateCharSpace(state); -} -void BitmapOutputDev::updateRender(GfxState *state) -{ - boolpolydev->updateRender(state); - booltextdev->updateRender(state); - rgbdev->updateRender(state); - clip0dev->updateRender(state); - clip1dev->updateRender(state); - gfxdev->updateRender(state); -} -void BitmapOutputDev::updateRise(GfxState *state) -{ - boolpolydev->updateRise(state); - booltextdev->updateRise(state); - rgbdev->updateRise(state); - clip0dev->updateRise(state); - clip1dev->updateRise(state); - gfxdev->updateRise(state); -} -void BitmapOutputDev::updateWordSpace(GfxState *state) -{ - boolpolydev->updateWordSpace(state); - booltextdev->updateWordSpace(state); - rgbdev->updateWordSpace(state); - clip0dev->updateWordSpace(state); - clip1dev->updateWordSpace(state); - gfxdev->updateWordSpace(state); -} -void BitmapOutputDev::updateHorizScaling(GfxState *state) -{ - boolpolydev->updateHorizScaling(state); - booltextdev->updateHorizScaling(state); - rgbdev->updateHorizScaling(state); - clip0dev->updateHorizScaling(state); - clip1dev->updateHorizScaling(state); - gfxdev->updateHorizScaling(state); -} -void BitmapOutputDev::updateTextPos(GfxState *state) -{ - boolpolydev->updateTextPos(state); - booltextdev->updateTextPos(state); - rgbdev->updateTextPos(state); - clip0dev->updateTextPos(state); - clip1dev->updateTextPos(state); - gfxdev->updateTextPos(state); -} -void BitmapOutputDev::updateTextShift(GfxState *state, double shift) -{ - boolpolydev->updateTextShift(state, shift); - booltextdev->updateTextShift(state, shift); - rgbdev->updateTextShift(state, shift); - clip0dev->updateTextShift(state, shift); - clip1dev->updateTextShift(state, shift); - gfxdev->updateTextShift(state, shift); -} - -gfxbbox_t BitmapOutputDev::getBBox(GfxState*state) -{ - GfxPath * path = state->getPath(); - int num = path->getNumSubpaths(); - gfxbbox_t bbox = {0,0,1,1}; - char valid=0; - int t; - for(t = 0; t < num; t++) { - GfxSubpath *subpath = path->getSubpath(t); - int subnum = subpath->getNumPoints(); - int s; - for(s=0;stransform(subpath->getX(s),subpath->getY(s),&x,&y); - if(!valid) { - bbox.xmin = x; bbox.ymin = y; - bbox.xmax = x; bbox.ymax = y; - valid = 1; - } else { - bbox.xmin = fmin(bbox.xmin, x); - bbox.ymin = fmin(bbox.ymin, y); - bbox.xmax = fmax(bbox.xmax, x); - bbox.ymax = fmax(bbox.ymax, y); - } - } - } - return bbox; -} - -void BitmapOutputDev::stroke(GfxState *state) -{ - msg(" stroke"); - boolpolydev->stroke(state); - gfxbbox_t bbox = getBBox(state); - double width = ceil(state->getTransformedLineWidth()); - bbox.xmin -= width; bbox.ymin -= width; - bbox.xmax += width; bbox.ymax += width; - checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); - rgbdev->stroke(state); - dbg_newdata("stroke"); -} - -char area_is_plain_colored(GfxState*state, SplashBitmap*boolpoly, SplashBitmap*rgbbitmap, int x1, int y1, int x2, int y2) -{ - int width = boolpoly->getWidth(); - int height = boolpoly->getHeight(); - if(!fixBBox(&x1, &y1, &x2, &y2, width, height)) { - return 0; - } - gfxcolor_t color = gfxstate_getfillcolor(state); - SplashColorPtr rgb = rgbbitmap->getDataPtr() - + (y1*width+x1)*sizeof(SplashColor); - int width8 = (width+7)/8; - unsigned char*bits = (unsigned char*)boolpoly->getDataPtr() - + (y1*width8+x1); - int x,y; - int w = x2-x1; - int h = y2-y1; - for(y=0;y fill"); - boolpolydev->fill(state); - gfxbbox_t bbox = getBBox(state); - if(config_optimizeplaincolorfills) { - if(area_is_plain_colored(state, boolpolybitmap, rgbbitmap, bbox.xmin, bbox.ymin, bbox.xmax, bbox.ymax)) { - return; - } - } - checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); - rgbdev->fill(state); - dbg_newdata("fill"); -} -void BitmapOutputDev::eoFill(GfxState *state) -{ - msg(" eoFill"); - boolpolydev->eoFill(state); - gfxbbox_t bbox = getBBox(state); - checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); - rgbdev->eoFill(state); - dbg_newdata("eofill"); -} - -POPPLER_TILING_PATERN_RETURN BitmapOutputDev::tilingPatternFill(GfxState *state, POPPLER_TILING_PATERN_GFX Object *str, - int paintType, Dict *resDict, - double *mat, double *bbox, - int x0, int y0, int x1, int y1, - double xStep, double yStep) -{ - msg(" tilingPatternFill"); - boolpolydev->tilingPatternFill(state, POPPLER_TILING_PATERN_GFX_ARG str, paintType, resDict, mat, - bbox, x0, y0, x1, y1, xStep, yStep); - checkNewBitmap(UNKNOWN_BOUNDING_BOX); - rgbdev->tilingPatternFill(state, POPPLER_TILING_PATERN_GFX_ARG str, paintType, resDict, mat, - bbox, x0, y0, x1, y1, xStep, yStep); - dbg_newdata("tilingpatternfill"); -#ifdef HAVE_POPPLER - return gTrue; -#endif -} - -GBool BitmapOutputDev::functionShadedFill(GfxState *state, GfxFunctionShading *shading) -{ - msg(" functionShadedFill"); - boolpolydev->functionShadedFill(state, shading); - checkNewBitmap(UNKNOWN_BOUNDING_BOX); - return rgbdev->functionShadedFill(state, shading); -} - -GBool BitmapOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading POPPLER_RAXIAL_MIN_MAX) -{ - msg(" axialShadedFill"); - boolpolydev->axialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); - checkNewBitmap(UNKNOWN_BOUNDING_BOX); - return rgbdev->axialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); -} - -GBool BitmapOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading POPPLER_RAXIAL_MIN_MAX) -{ - msg(" radialShadedFill"); - boolpolydev->radialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); - checkNewBitmap(UNKNOWN_BOUNDING_BOX); - return rgbdev->radialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); -} - -SplashColor black = {0,0,0}; -SplashColor white = {255,255,255}; - -void BitmapOutputDev::clip(GfxState *state) -{ - msg(" clip"); - boolpolydev->clip(state); - booltextdev->clip(state); - rgbdev->clip(state); - clip1dev->clip(state); -} -void BitmapOutputDev::eoClip(GfxState *state) -{ - msg(" eoClip"); - boolpolydev->eoClip(state); - booltextdev->eoClip(state); - rgbdev->eoClip(state); - clip1dev->eoClip(state); -} -void BitmapOutputDev::clipToStrokePath(GfxState *state) -{ - msg(" clipToStrokePath"); - boolpolydev->clipToStrokePath(state); - booltextdev->clipToStrokePath(state); - rgbdev->clipToStrokePath(state); - clip1dev->clipToStrokePath(state); -} - -void BitmapOutputDev::beginStringOp(GfxState *state) -{ - msg(" beginStringOp"); - clip0dev->beginStringOp(state); - clip1dev->beginStringOp(state); - booltextdev->beginStringOp(state); - gfxdev->beginStringOp(state); - this->gfxdev->setDevice(this->gfxoutput_string); -} -void BitmapOutputDev::beginString(GfxState *state, GString *s) -{ - msg(" beginString"); - clip0dev->beginString(state, s); - clip1dev->beginString(state, s); - booltextdev->beginString(state, s); - gfxdev->beginString(state, s); - text_x1 = INT_MAX; - text_y1 = INT_MAX; - text_x2 = INT_MIN; - text_y2 = INT_MIN; -} - -void BitmapOutputDev::clearClips(int x1, int y1, int x2, int y2) -{ - clearBooleanBitmap(clip0bitmap, x1,y1,x2,y2); - clearBooleanBitmap(clip1bitmap, x1,y1,x2,y2); -} -void BitmapOutputDev::clearBoolPolyDev() -{ - clearBooleanBitmap(stalepolybitmap, 0, 0, stalepolybitmap->getWidth(), stalepolybitmap->getHeight()); -} -void BitmapOutputDev::clearBoolTextDev() -{ - clearBooleanBitmap(staletextbitmap, 0, 0, staletextbitmap->getWidth(), staletextbitmap->getHeight()); -} - -#define USE_GETGLYPH_BBOX - -static void getGlyphBbox(GfxState*state, SplashOutputDev*splash, double x, double y, double originX, double originY, CharCode code, int*_x1, int*_y1, int*_x2, int*_y2) -{ -#ifdef USE_GETGLYPH_BBOX - /* use getglyph to derive bounding box */ - if(splash->needFontUpdate) { - splash->doUpdateFont(state); - } - SplashGlyphBitmap glyph; - double xt,yt; - state->transform(x-originX, y-originY, &xt, &yt); - int x1 = (int)xt, x2 = (int)xt+1, y1 = (int)yt, y2 = (int)yt+1; - SplashFont*font = splash->getCurrentFont(); - int x0 = splashFloor(xt); - int xFrac = splashFloor((xt - x0) * splashFontFraction); - int y0 = splashFloor(yt); - int yFrac = splashFloor((yt - y0) * splashFontFraction); - - SplashCoord*matrix = font->getMatrix(); - - if(font && font->getGlyph(code, xFrac, yFrac, &glyph)) { - x1 = floor(x0-glyph.x); - y1 = floor(y0-glyph.y); - x2 = ceil(x0-glyph.x+glyph.w); - y2 = ceil(y0-glyph.y+glyph.h); - if (glyph.freeData) { - gfree(glyph.data); - } - } -#else - /* derive bounding box from the polygon path */ - double x0,y0; - state->transform(x-originX,y-originY,&x0,&y0); - int x1 = (int)x0, x2 = (int)x0+1, y1 = (int)y0, y2 = (int)y0+1; - SplashFont*font = clip0dev->getCurrentFont(); - SplashPath*path = font?font->getGlyphPath(code):NULL; - if(path) { - path->offset((SplashCoord)x, (SplashCoord)y); - int t; - for(t=0;tgetLength();t++) { - double xx,yy; - Guchar f; - path->getPoint(t,&xx,&yy,&f); - state->transform(xx,yy,&xx,&yy); - int px = (int)xx; - int py = (int)yy; - if(!t) { - x1=x2=px; - y1=y2=py; - } - if(xx=x2) x2=px+1; - if(yy>=y2) y2=py+1; - } - delete(path);path=0; - } -#endif - *_x1 = x1; - *_y1 = y1; - *_x2 = x2; - *_y2 = y2; -} - -void BitmapOutputDev::drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen) -{ - msg(" drawChar render=%d", state->getRender()); - - char render_as_bitmap = 0; - - if(config_skewedtobitmap) { - if(text_matrix_is_skewed(state)) { - render_as_bitmap = 1; - } - } - if(config_alphatobitmap) { - double opaq = state->getFillOpacity(); - if(opaq < 0.9) - render_as_bitmap = 1; - } - if((state->getRender()&3)) { - render_as_bitmap = 1; - } - - if(state->getRender()&RENDER_CLIP) { - //char is, amongst others, a clipping boundary - rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - booltextdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - clip1dev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - } else if(rgbbitmap != rgbdev->getBitmap()) { - // we're doing softmasking or transparency grouping - boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - } else { - // we're drawing a regular char - int x1, y1, x2, y2; - - /* Calculate the bbox of this character (relative to splash's coordinate - system, which is offset from our coordinate system by (-movex,-movey)) - */ - getGlyphBbox(state, boolpolydev, x, y, originX, originY, code, &x1, &y1, &x2, &y2); - - if(x1 < text_x1) text_x1 = x1; - if(y1 < text_y1) text_y1 = y1; - if(x2 > text_x2) text_x2 = x2; - if(y2 > text_y2) text_y2 = y2; - - /* only clear the area we're going to check */ - clearClips(x1,y1,x2,y2); - clip0dev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - clip1dev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - - int page_area_x1 = -this->movex; - int page_area_y1 = -this->movey; - int page_area_x2 = this->width-this->movex; - int page_area_y2 = this->height-this->movey; - char char_is_outside = (x1page_area_x2 || - y2>page_area_y2); - - /* if this character is affected somehow by the various clippings (i.e., it looks - different on a device without clipping), then draw it on the bitmap, not as - text */ - if(char_is_outside || render_as_bitmap || clip0and1differ(x1,y1,x2,y2)) { - - if(char_is_outside) msg(" Char %d is outside the page (%d,%d,%d,%d)", code, x1, y1, x2, y2); - else if(render_as_bitmap) msg(" Char %d needs to be rendered as bitmap", code); - else msg(" Char %d is affected by clipping", code); - - boolpolydev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - checkNewBitmap(x1,y1,x2,y2); - rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - if(config_extrafontdata && render_as_bitmap) { - /* we draw invisible glyphs on top of the bitmap text for text selection. - We don't do this for clipped text, though- there's no way the pass 1 font - logic would know that the text will end up being clipped */ - int oldrender = state->getRender(); - state->setRender(3); //invisible - gfxdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - state->setRender(oldrender); - } - } else { - /* this char is not at all affected by clipping. - Now just dump out the bitmap we're currently working on, if necessary. */ - booltextdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - gfxdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); - } - } - dbg_newdata("text"); -} -void BitmapOutputDev::drawString(GfxState *state, GString *s) -{ - msg(" internal error: drawString not implemented"); - return; -} -void BitmapOutputDev::endTextObject(GfxState *state) -{ - msg(" endTextObject"); - rgbdev->endTextObject(state); - clip0dev->endTextObject(state); - clip1dev->endTextObject(state); - booltextdev->endTextObject(state); - /* the only thing "drawn" here is clipping */ - //checkNewText(UNKNOWN_BOUNDING_BOX); - gfxdev->endTextObject(state); - dbg_newdata("endtextobject"); -} -void BitmapOutputDev::endString(GfxState *state) -{ - msg(" endString"); - clip0dev->endString(state); - clip1dev->endString(state); - booltextdev->endString(state); - gfxdev->endString(state); - dbg_newdata("endstring"); - checkNewText(text_x1,text_y1,text_x2,text_y2); - gfxdevice_record_flush(this->gfxoutput_string, this->gfxoutput, 0); - this->gfxdev->setDevice(this->gfxoutput); -} -void BitmapOutputDev::endStringOp(GfxState *state) -{ - msg(" endStringOp"); - clip0dev->endStringOp(state); - clip1dev->endStringOp(state); - booltextdev->endStringOp(state); - gfxdev->endStringOp(state); - dbg_newdata("endstringop"); -} - -/* TODO: these four operations below *should* do nothing, as type3 - chars are drawn using operations like fill() */ -GBool BitmapOutputDev::beginType3Char(GfxState *state, double x, double y, - double dx, double dy, - CharCode code, Unicode *u, int uLen) -{ - msg(" beginType3Char"); - /* call gfxdev so that it can generate "invisible" characters - on top of the actual graphic content, for text extraction */ - return gfxdev->beginType3Char(state, x, y, dx, dy, code, u, uLen); -} -void BitmapOutputDev::type3D0(GfxState *state, double wx, double wy) -{ - msg(" type3D0"); - return gfxdev->type3D0(state, wx, wy); -} -void BitmapOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) -{ - msg(" type3D1"); - return gfxdev->type3D1(state, wx, wy, llx, lly, urx, ury); -} -void BitmapOutputDev::endType3Char(GfxState *state) -{ - msg(" endType3Char"); - gfxdev->endType3Char(state); -} - -class CopyStream: public Object -{ - Dict*dict; - char*buf; - MemStream*memstream; - public: - CopyStream(Stream*str, int len) - { - buf = 0; - str->reset(); - if(len) { - buf = (char*)malloc(len); - int t; - for (t=0; tgetChar(); - } - str->close(); - this->dict = str->getDict(); - this->memstream = new MemStream(buf, 0, len, this); - } - ~CopyStream() - { - ::free(this->buf);this->buf = 0; - delete this->memstream; - } - Dict* getDict() {return dict;} - Stream* getStream() {return this->memstream;}; -}; - -gfxbbox_t BitmapOutputDev::getImageBBox(GfxState*state) -{ - gfxbbox_t bbox; - double x,y; - state->transform(0, 1, &x, &y); - bbox.xmin=bbox.xmax = x; - bbox.ymin=bbox.ymax = y; - state->transform(0, 0, &x, &y); - bbox.xmin=fmin(bbox.xmin,x); - bbox.ymin=fmin(bbox.ymin,y); - bbox.xmax=fmax(bbox.xmax,x); - bbox.ymax=fmax(bbox.ymax,y); - state->transform(1, 0, &x, &y); - bbox.xmin=fmin(bbox.xmin,x); - bbox.ymin=fmin(bbox.ymin,y); - bbox.xmax=fmax(bbox.xmax,x); - bbox.ymax=fmax(bbox.ymax,y); - state->transform(1, 1, &x, &y); - bbox.xmin=fmin(bbox.xmin,x); - bbox.ymin=fmin(bbox.ymin,y); - bbox.xmax=fmax(bbox.xmax,x); - bbox.ymax=fmax(bbox.ymax,y); - return bbox; -} - -GBool invalid_size(int width, int height) -{ - if((U64)width*(U64)height > 0x7fffffffll) - return 1; - return 0; -} - -void BitmapOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, POPPLER_INTERPOLATE - GBool inlineImg) -{ - msg(" drawImageMask streamkind=%d", str->getKind()); - if(invalid_size(width,height)) return; - - CopyStream*cpystr = new CopyStream(str, height * ((width + 7) / 8)); - str = cpystr->getStream(); - - boolpolydev->drawImageMask(state, ref, str, width, height, invert, POPPLER_INTERPOLATE_ARG inlineImg); - gfxbbox_t bbox = getImageBBox(state); - checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); - rgbdev->drawImageMask(state, ref, str, width, height, invert, POPPLER_INTERPOLATE_ARG inlineImg); - delete cpystr; - dbg_newdata("imagemask"); -} -void BitmapOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - int *maskColors, GBool inlineImg) -{ - msg(" drawImage streamkind=%d", str->getKind()); - if(invalid_size(width,height)) return; - - CopyStream*cpystr = new CopyStream(str, height * ((width * colorMap->getNumPixelComps() * colorMap->getBits() + 7) / 8)); - str = cpystr->getStream(); - - boolpolydev->drawImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskColors, inlineImg); - gfxbbox_t bbox=getImageBBox(state); - checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); - rgbdev->drawImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskColors, inlineImg); - delete cpystr; - dbg_newdata("image"); -} -void BitmapOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, int maskWidth, int maskHeight, - GBool maskInvert POPPLER_MASK_INTERPOLATE) -{ - msg(" drawMaskedImage streamkind=%d", str->getKind()); - if(invalid_size(width,height)) return; - - CopyStream*cpystr = new CopyStream(str, height * ((width * colorMap->getNumPixelComps() * colorMap->getBits() + 7) / 8)); - str = cpystr->getStream(); - - boolpolydev->drawMaskedImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, maskInvert POPPLER_MASK_INTERPOLATE_ARG); - gfxbbox_t bbox=getImageBBox(state); - checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); - rgbdev->drawMaskedImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, maskInvert POPPLER_MASK_INTERPOLATE_ARG); - delete cpystr; - dbg_newdata("maskedimage"); -} -void BitmapOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap POPPLER_MASK_INTERPOLATE) -{ - msg(" drawSoftMaskedImage %dx%d (%dx%d) streamkind=%d", width, height, maskWidth, maskHeight, str->getKind()); - if(invalid_size(width,height)) return; - - CopyStream*cpystr = new CopyStream(str, height * ((width * colorMap->getNumPixelComps() * colorMap->getBits() + 7) / 8)); - str = cpystr->getStream(); - - boolpolydev->drawSoftMaskedImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, maskColorMap POPPLER_MASK_INTERPOLATE_ARG); - gfxbbox_t bbox=getImageBBox(state); - checkNewBitmap(bbox.xmin, bbox.ymin, ceil(bbox.xmax), ceil(bbox.ymax)); - rgbdev->drawSoftMaskedImage(state, ref, str, width, height, colorMap, POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, maskColorMap POPPLER_MASK_INTERPOLATE_ARG); - delete cpystr; - dbg_newdata("softmaskimage"); -} -void BitmapOutputDev::drawForm(Ref id) -{ - msg(" drawForm"); - boolpolydev->drawForm(id); - checkNewBitmap(UNKNOWN_BOUNDING_BOX); - rgbdev->drawForm(id); -} - -void BitmapOutputDev::processLink(Link *link, Catalog *catalog) -{ - msg(" processLink"); - gfxdev->processLink(link, catalog); -} -void BitmapOutputDev::flushEverything() -{ - if(layerstate == STATE_BITMAP_IS_ABOVE) { - this->flushText(); - this->flushBitmap(); - } else { - this->flushBitmap(); - this->flushText(); - } -} - -void BitmapOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool forSoftMask) -{ - msg(" beginTransparencyGroup"); -#if (xpdfMajorVersion*10000 + xpdfMinorVersion*100 + xpdfUpdateVersion) < 30207 - GfxState*state1 = state->copy(); - GfxState*state2 = state->copy(); - state1->setPath(0); - state1->setPath(state->getPath()->copy()); - state2->setPath(0); - state2->setPath(state->getPath()->copy()); -#else - GfxState*state1 = state->copy(gTrue); - GfxState*state2 = state->copy(gTrue); -#endif - boolpolydev->beginTransparencyGroup(state1, bbox, blendingColorSpace, isolated, knockout, forSoftMask); - rgbdev->beginTransparencyGroup(state2, bbox, blendingColorSpace, isolated, knockout, forSoftMask); - clip1dev->beginTransparencyGroup(state, bbox, blendingColorSpace, isolated, knockout, forSoftMask); - delete state1; - delete state2; - dbg_newdata("endtransparencygroup"); -} -void BitmapOutputDev::endTransparencyGroup(GfxState *state) -{ - msg(" endTransparencyGroup"); -#if (xpdfMajorVersion*10000 + xpdfMinorVersion*100 + xpdfUpdateVersion) < 30207 - GfxState*state1 = state->copy(); - GfxState*state2 = state->copy(); - state1->setPath(0); - state1->setPath(state->getPath()->copy()); - state2->setPath(0); - state2->setPath(state->getPath()->copy()); -#else - GfxState*state1 = state->copy(gTrue); - GfxState*state2 = state->copy(gTrue); -#endif - boolpolydev->endTransparencyGroup(state1); - checkNewBitmap(UNKNOWN_BOUNDING_BOX); - rgbdev->endTransparencyGroup(state2); - delete state1; - delete state2; - clip1dev->endTransparencyGroup(state); - dbg_newdata("endtransparencygroup"); -} -void BitmapOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) -{ - msg(" paintTransparencyGroup"); - boolpolydev->paintTransparencyGroup(state,bbox); - checkNewBitmap(UNKNOWN_BOUNDING_BOX); - rgbdev->paintTransparencyGroup(state,bbox); - clip1dev->paintTransparencyGroup(state,bbox); - dbg_newdata("painttransparencygroup"); -} -void BitmapOutputDev::setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor) -{ - msg(" setSoftMask"); - boolpolydev->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); - checkNewBitmap(UNKNOWN_BOUNDING_BOX); - rgbdev->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); - clip1dev->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); - dbg_newdata("setsoftmask"); -} -void BitmapOutputDev::clearSoftMask(GfxState *state) -{ - msg(" clearSoftMask"); - boolpolydev->clearSoftMask(state); - checkNewBitmap(UNKNOWN_BOUNDING_BOX); - rgbdev->clearSoftMask(state); - clip1dev->clearSoftMask(state); - dbg_newdata("clearsoftmask"); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.h deleted file mode 100644 index 3644a0eef..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/BitmapOutputDev.h +++ /dev/null @@ -1,236 +0,0 @@ -/* BitmapOutputDev.cc - Output device which creates a bitmap. - - This file is part of swftools. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __BitmapOutputDev_h__ -#define __BitmapOutputDev_h__ - -#include "../gfxdevice.h" -#include "../gfxsource.h" -#include "../gfxtools.h" - -#include "../../config.h" -#include "CharOutputDev.h" -#include "InfoOutputDev.h" -#include "PDFDoc.h" -#include "CommonOutputDev.h" -#include "popplercompat.h" - -struct ClipState -{ - ClipState*next; - SplashBitmap*clipbitmap; - char written; - ClipState(); -}; - -#define STATE_PARALLEL 0 -#define STATE_TEXT_IS_ABOVE 1 -#define STATE_BITMAP_IS_ABOVE 2 - -class BitmapOutputDev: public CommonOutputDev { -public: - BitmapOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); - virtual ~BitmapOutputDev(); - - virtual void dbg_newdata(char*newdata); - - // CommonOutputDev: - virtual void setDevice(gfxdevice_t*dev); - virtual void setParameter(const char*key, const char*value); - - // OutputDev: - virtual GBool upsideDown(); - virtual GBool useDrawChar(); - virtual GBool useTilingPatternFill(); - virtual GBool useShadedFills(); - virtual GBool useDrawForm(); - virtual GBool interpretType3Chars(); - virtual GBool needNonText(); - virtual void setDefaultCTM(double *ctm); - virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL); - - virtual void beginPage(GfxState *state, int pageNum); - virtual void endPage(); - virtual void finishPage(); - - virtual void saveState(GfxState *state); - virtual void restoreState(GfxState *state); - - virtual void updateAll(GfxState *state); - virtual void updateCTM(GfxState *state, double m11, double m12, double m21, double m22, double m31, double m32); - virtual void updateLineDash(GfxState *state); - virtual void updateFlatness(GfxState *state); - virtual void updateLineJoin(GfxState *state); - virtual void updateLineCap(GfxState *state); - virtual void updateMiterLimit(GfxState *state); - virtual void updateLineWidth(GfxState *state); - virtual void updateStrokeAdjust(GfxState *state); - virtual void updateFillColorSpace(GfxState *state); - virtual void updateStrokeColorSpace(GfxState *state); - virtual void updateFillColor(GfxState *state); - virtual void updateStrokeColor(GfxState *state); - virtual void updateBlendMode(GfxState *state); - virtual void updateFillOpacity(GfxState *state); - virtual void updateStrokeOpacity(GfxState *state); - virtual void updateFillOverprint(GfxState *state); - virtual void updateStrokeOverprint(GfxState *state); - virtual void updateTransfer(GfxState *state); - virtual void updateFont(GfxState *state); - virtual void updateTextMat(GfxState *state); - virtual void updateCharSpace(GfxState *state); - virtual void updateRender(GfxState *state); - virtual void updateRise(GfxState *state); - virtual void updateWordSpace(GfxState *state); - virtual void updateHorizScaling(GfxState *state); - virtual void updateTextPos(GfxState *state); - virtual void updateTextShift(GfxState *state, double shift); - - virtual void stroke(GfxState *state); - virtual void fill(GfxState *state); - virtual void eoFill(GfxState *state); - virtual POPPLER_TILING_PATERN_RETURN tilingPatternFill( - GfxState *state, POPPLER_TILING_PATERN_GFX Object *str, - int paintType, Dict *resDict, - double *mat, double *bbox, - int x0, int y0, int x1, int y1, - double xStep, double yStep); - - virtual GBool functionShadedFill(GfxState *state, - GfxFunctionShading *shading); - virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading POPPLER_RAXIAL_MIN_MAX); - virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading POPPLER_RAXIAL_MIN_MAX); - - virtual void clip(GfxState *state); - virtual void eoClip(GfxState *state); - virtual void clipToStrokePath(GfxState *state); - - virtual void beginStringOp(GfxState *state); - virtual void endStringOp(GfxState *state); - virtual void beginString(GfxState *state, GString *s); - virtual void endString(GfxState *state); - virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen); - virtual void drawString(GfxState *state, GString *s); - virtual GBool beginType3Char(GfxState *state, double x, double y, - double dx, double dy, - CharCode code, Unicode *u, int uLen); - virtual void endType3Char(GfxState *state); - virtual void endTextObject(GfxState *state); - - virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - POPPLER_INTERPOLATE - GBool inlineImg); - virtual void drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - int *maskColors, GBool inlineImg); - virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, int maskWidth, int maskHeight, - GBool maskInvert - POPPLER_MASK_INTERPOLATE); - virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap - POPPLER_MASK_INTERPOLATE); - - virtual void type3D0(GfxState *state, double wx, double wy); - virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); - - virtual void drawForm(Ref id); - - virtual void beginTransparencyGroup(GfxState *state, double *bbox, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool forSoftMask); - virtual void endTransparencyGroup(GfxState *state); - virtual void paintTransparencyGroup(GfxState *state, double *bbox); - virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor); - virtual void clearSoftMask(GfxState *state); - - virtual void processLink(Link *link, Catalog *catalog); - - virtual void setVectorAntialias(GBool vaa); - virtual GBool getVectorAntialias(); - - -private: - void flushEverything(); - void clearClips(int x1, int y1, int x2, int y2); - void clearBoolPolyDev(); - void clearBoolTextDev(); - void flushText(); - void flushBitmap(); - GBool checkNewText(int x1, int y1, int x2, int y2); - GBool checkNewBitmap(int x1, int y1, int x2, int y2); - GBool clip0and1differ(int x1,int y1,int x2,int y2); - GBool intersection(SplashBitmap*boolpoly, SplashBitmap*booltext, int x1, int y1, int x2, int y2); - - virtual gfxbbox_t getImageBBox(GfxState*state); - virtual gfxbbox_t getBBox(GfxState*state); - - char config_extrafontdata; - char config_optimizeplaincolorfills; - char config_skewedtobitmap; - char config_alphatobitmap; - - int text_x1,text_y1,text_x2,text_y2; - - int layerstate; - GBool emptypage; - - SplashPath*bboxpath; - - SplashOutputDev*rgbdev; - SplashOutputDev*clip0dev; - SplashOutputDev*clip1dev; - SplashOutputDev*boolpolydev; - SplashOutputDev*booltextdev; - - SplashBitmap*rgbbitmap; - SplashBitmap*clip0bitmap; - SplashBitmap*clip1bitmap; - SplashBitmap*boolpolybitmap; - SplashBitmap*stalepolybitmap; - SplashBitmap*booltextbitmap; - SplashBitmap*staletextbitmap; - - gfxdevice_t* gfxoutput; - gfxdevice_t* gfxoutput_string; - CharOutputDev*gfxdev; - gfxdevice_t*dev; - - //ClipState*clipstates; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.cc deleted file mode 100644 index ff57471ea..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.cc +++ /dev/null @@ -1,1305 +0,0 @@ -/* CharOutputDev.cc - implements a pdf output device (OutputDev). - - This file is part of swftools. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include - -#include "../../config.h" -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_DIRENT_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_FONTCONFIG -#include -#endif - -// xpdf header files -#include "popplercompat.h" -#include "CharOutputDev.h" - -// swftools header files -#include "../os.h" -#include "../log.h" -#include "../mem.h" -#include "../utf8.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../gfxfont.h" -#include "../gfxpoly.h" -#include "../devices/record.h" -#include "../devices/ops.h" -#include "../devices/polyops.h" -#include "../devices/render.h" -#include "../png.h" - -// linked-in font data -#include "fonts.h" - -typedef struct _fontfile -{ - const char*filename; - int len; // basename length - int used; - struct _fontfile*next; -} fontfile_t; - -// for pdfswf_addfont -static fontfile_t* global_fonts = 0; -static fontfile_t* global_fonts_next = 0; - -static int fontnum = 0; - -/* config */ -struct fontentry { - const char*pdffont; - const char*filename; - char*afm; - int afmlen; - char*pfb; - int pfblen; - char*fullfilename; - DisplayFontParam *dfp; -} pdf2t1map[] ={ -{"Times-Roman", "n021003l", n021003l_afm, n021003l_afm_len, n021003l_pfb, n021003l_pfb_len}, -{"Times-Italic", "n021023l", n021023l_afm, n021023l_afm_len, n021023l_pfb, n021023l_pfb_len}, -{"Times-Bold", "n021004l", n021004l_afm, n021004l_afm_len, n021004l_pfb, n021004l_pfb_len}, -{"Times-BoldItalic", "n021024l", n021024l_afm, n021024l_afm_len, n021024l_pfb, n021024l_pfb_len}, -{"Helvetica", "n019003l", n019003l_afm, n019003l_afm_len, n019003l_pfb, n019003l_pfb_len}, -{"Helvetica-Oblique", "n019023l", n019023l_afm, n019023l_afm_len, n019023l_pfb, n019023l_pfb_len}, -{"Helvetica-Bold", "n019004l", n019004l_afm, n019004l_afm_len, n019004l_pfb, n019004l_pfb_len}, -{"Helvetica-BoldOblique", "n019024l", n019024l_afm, n019024l_afm_len, n019024l_pfb, n019024l_pfb_len}, -{"Courier", "n022003l", n022003l_afm, n022003l_afm_len, n022003l_pfb, n022003l_pfb_len}, -{"Courier-Oblique", "n022023l", n022023l_afm, n022023l_afm_len, n022023l_pfb, n022023l_pfb_len}, -{"Courier-Bold", "n022004l", n022004l_afm, n022004l_afm_len, n022004l_pfb, n022004l_pfb_len}, -{"Courier-BoldOblique", "n022024l", n022024l_afm, n022024l_afm_len, n022024l_pfb, n022024l_pfb_len}, -{"Symbol", "s050000l", s050000l_afm, s050000l_afm_len, s050000l_pfb, s050000l_pfb_len}, -{"ZapfDingbats", "d050000l", d050000l_afm, d050000l_afm_len, d050000l_pfb, d050000l_pfb_len}}; - - -typedef struct _drawnchar -{ - gfxcoord_t x,y; - int charid; - gfxcolor_t color; -} drawnchar_t; - -class CharBuffer -{ - drawnchar_t * chars; - int buf_size; - int num_chars; - -public: - - CharBuffer() - { - buf_size = 32; - chars = (drawnchar_t*)malloc(sizeof(drawnchar_t)*buf_size); - memset(chars, 0, sizeof(drawnchar_t)*buf_size); - num_chars = 0; - } - ~CharBuffer() - { - free(chars);chars = 0; - } - - void grow(int size) - { - if(size>=buf_size) { - buf_size += 32; - chars = (drawnchar_t*)realloc(chars, sizeof(drawnchar_t)*buf_size); - } - } - - void addChar(int charid, gfxcoord_t x, gfxcoord_t y, gfxcolor_t color) - { - grow(num_chars); - chars[num_chars].x = x; - chars[num_chars].y = y; - chars[num_chars].color = color; - chars[num_chars].charid = charid; - } -}; - -char* writeOutStdFont(fontentry* f) -{ - FILE*fi; - char namebuf1[512]; - char namebuf2[512]; - char* tmpFileName = mktmpname(namebuf1); - - sprintf(namebuf2, "%s.afm", tmpFileName); - fi = fopen(namebuf2, "wb"); - if(!fi) - return 0; - fwrite(f->afm, 1, f->afmlen, fi); - fclose(fi); - - sprintf(namebuf2, "%s.pfb", tmpFileName); - fi = fopen(namebuf2, "wb"); - if(!fi) - return 0; - fwrite(f->pfb, 1, f->pfblen, fi); - fclose(fi); - return strdup(namebuf2); -} -void unlinkfont(char* filename) -{ - int l; - if(!filename) - return; - msg(" Removing temporary font file %s", filename); - l=strlen(filename); - unlink(filename); - if(!strncmp(&filename[l-4],".afm",4)) { - memcpy(&filename[l-4],".pfb",4); unlink(filename); - memcpy(&filename[l-4],".pfa",4); unlink(filename); - memcpy(&filename[l-4],".afm",4); - return; - } else - if(!strncmp(&filename[l-4],".pfa",4)) { - memcpy(&filename[l-4],".afm",4); unlink(filename); - memcpy(&filename[l-4],".pfa",4); - return; - } else - if(!strncmp(&filename[l-4],".pfb",4)) { - memcpy(&filename[l-4],".afm",4); unlink(filename); - memcpy(&filename[l-4],".pfb",4); - return; - } -} - -static int config_use_fontconfig = 1; -static int fcinitcalled = 0; - -GFXGlobalParams::GFXGlobalParams() -: GlobalParams((char*)"") -{ - //setupBaseFonts(char *dir); //not tested yet -} -GFXGlobalParams::~GFXGlobalParams() -{ - msg(" Performing cleanups"); - int t; - for(t=0;t=32 && *s1<=63) s1++; - while(*s2>=32 && *s2<=63) s2++; - if(*s1!=*s2) - break; - s1++;s2++; - } - return *s1 - *s2; -} - -static char fc_ismatch(FcPattern*match, char*family, char*style) -{ - char*fcfamily=0,*fcstyle=0,*fcfullname=0,*filename=0; - FcBool scalable=FcFalse, outline=FcFalse; - FcPatternGetString(match, "family", 0, (FcChar8**)&fcfamily); - FcPatternGetString(match, "style", 0, (FcChar8**)&fcstyle); - FcPatternGetString(match, "file", 0, (FcChar8**)&filename); - FcPatternGetBool(match, "outline", 0, &outline); - FcPatternGetBool(match, "scalable", 0, &scalable); - - if(scalable!=FcTrue || outline!=FcTrue) - return 0; - - if (!stralphacmp(fcfamily, family)) { - msg(" Font %s-%s (%s) is a match for %s%s%s", fcfamily, fcstyle, filename, family, style?"-":"", style?style:""); - return 1; - } else { - //msg(" Font %s-%s (%s) is NOT a match for %s%s%s", fcfamily, fcstyle, filename, family, style?"-":"", style?style:""); - return 0; - } -} -#endif - -static inline char islowercase(char c) -{ - return (c>='a' && c<='z'); -} - -char* fontconfig_searchForFont(char*name) -{ -#ifdef HAVE_FONTCONFIG - if(!config_use_fontconfig) - return 0; - - // call init ony once - if (!fcinitcalled) { - fcinitcalled = 1; - - // check whether we have a config file - char* configfile = (char*)FcConfigFilename(0); - int configexists = 0; - FILE*fi = fopen(configfile, "rb"); - if(fi) { - configexists = 1;fclose(fi); - msg(" Initializing FontConfig (configfile=%s)", configfile); - } else { - msg(" Initializing FontConfig (no configfile)"); - } - - if(!configexists) { - /* A fontconfig instance which didn't find a configfile is unbelievably - cranky, so let's just write out a small xml file and make fontconfig - happy */ - FcConfig*c = FcConfigCreate(); - char namebuf[512]; - char* tmpFileName = mktmpname(namebuf); - FILE*fi = fopen(tmpFileName, "wb"); - fprintf(fi, "\n\n");// -#ifdef WIN32 - fprintf(fi, "WINDOWSFONTDIR\n"); -#endif - fprintf(fi, "~/.fonts\n"); -#ifdef WIN32 - fprintf(fi, "WINDOWSTEMPDIR_FONTCONFIG_CACHE\n"); -#endif - fprintf(fi, "~/.fontconfig\n"); - fprintf(fi, "\n"); - fclose(fi); - FcConfigParseAndLoad(c, (FcChar8*)tmpFileName, 1); - FcConfigBuildFonts(c); - FcConfigSetCurrent(c); - } - - if(!FcInit()) { - msg(" FontConfig Initialization failed. Disabling."); - config_use_fontconfig = 0; - return 0; - } - FcConfig * config = FcConfigGetCurrent(); - if(!config) { - msg(" FontConfig Config Initialization failed. Disabling."); - config_use_fontconfig = 0; - return 0; - } - - /* add external fonts to fontconfig's config, too. */ - fontfile_t*fd = global_fonts; - while(fd) { - FcConfigAppFontAddFile(config, (FcChar8*)fd->filename); - msg(" Adding font %s to fontconfig", fd->filename); - fd = fd->next; - } - - FcFontSet * set = FcConfigGetFonts(config, FcSetSystem); - msg(" FontConfig initialized. Found %d fonts", set?set->nfont:0); - if(!set || !set->nfont) { - msg(" FontConfig has zero fonts. Disabling."); - config_use_fontconfig = 0; - return 0; - } - - if(getLogLevel() >= LOGLEVEL_TRACE) { - int t; - int p; - for(p=0;p<2;p++) { - if(set) { - for(t=0;tnfont;t++) { - char*fcfamily=0,*fcstyle=0,*filename=0; - FcBool scalable=FcFalse, outline=FcFalse; - FcPatternGetString(set->fonts[t], "family", 0, (FcChar8**)&fcfamily); - FcPatternGetString(set->fonts[t], "style", 0, (FcChar8**)&fcstyle); - FcPatternGetString(set->fonts[t], "file", 0, (FcChar8**)&filename); - FcPatternGetBool(set->fonts[t], "outline", 0, &outline); - FcPatternGetBool(set->fonts[t], "scalable", 0, &scalable); - if(scalable && outline) { - msg(" %s (%s) -> %s", fcfamily, fcstyle, filename); - } - } - } - set = FcConfigGetFonts(config, FcSetApplication); - } - } - } - - char*family = strdup(name); - int len = strlen(family); - - const char*styles[] = {"Medium", "Regular", "Bold", "Italic", "Black", "Narrow"}; - const char*style = 0; - int t; - for(t=0;tl+1 && !strcmp(family+len-l, styles[t]) && islowercase(family[len-l-1])) { - style = styles[t]; - family[len-l]=0; - break; - } - } - if(!style) { - char*dash = strchr(family, '-'); - if(!dash) dash = strchr(family, ','); - if(dash) { - *dash = 0; - style = dash+1; - } - } - FcPattern*pattern = 0; - if(style) { - msg(" FontConfig: Looking for font %s (family=%s style=%s)", name, family, style); - pattern = FcPatternBuild(NULL, FC_OUTLINE, FcTypeBool, FcTrue, FC_SCALABLE, FcTypeBool, FcTrue, FC_FAMILY, FcTypeString, family, FC_STYLE, FcTypeString, style, NULL); - } else { - msg(" FontConfig: Looking for font %s (family=%s)", name, family); - pattern = FcPatternBuild(NULL, FC_OUTLINE, FcTypeBool, FcTrue, FC_SCALABLE, FcTypeBool, FcTrue, FC_FAMILY, FcTypeString, family, NULL); - } - pattern = FcPatternBuild(NULL, FC_OUTLINE, FcTypeBool, FcTrue, FC_SCALABLE, FcTypeBool, FcTrue, FC_FAMILY, FcTypeString, family, NULL); - - FcResult result; - FcConfigSubstitute(0, pattern, FcMatchPattern); - FcDefaultSubstitute(pattern); - - FcFontSet*set = FcFontSort(0, pattern, 1, 0, &result); - if(set) { - int t; - for(t=0;tnfont;t++) { - FcPattern*match = set->fonts[t]; - //FcPattern*match = FcFontMatch(0, pattern, &result); - if(fc_ismatch(match, family, (char*)style)) { - char*filename=0; - if(FcPatternGetString(match, "file", 0, (FcChar8**)&filename) != FcResultMatch) { - msg(" FontConfig: Couldn't get fontconfig's filename for font %s", name); - filename=0; - } - //FcPatternDestroy(match); - msg(" fontconfig: returning filename %s", filename); - free(family); - FcPatternDestroy(pattern); - FcFontSetDestroy(set); - return filename?strdup(filename):0; - } - } - } - free(family); - FcPatternDestroy(pattern); - FcFontSetDestroy(set); - return 0; -#else - return 0; -#endif -} - -static DisplayFontParamKind detectFontType(const char*filename) -{ - if(strstr(filename, ".ttf") || strstr(filename, ".TTF")) - return displayFontTT; - if(strstr(filename, ".pfa") || strstr(filename, ".PFA") || strstr(filename, ".pfb")) - return displayFontT1; - return displayFontTT; -} - -DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName) -{ - msg(" looking for font %s", fontName->getCString()); - - char*name = fontName->getCString(); - - /* see if it is a pdf standard font */ - int t; - for(t=0;t Couldn't save default font- is the Temp Directory writable?"); - } else { - msg(" Storing standard PDF font %s at %s", name, pdf2t1map[t].fullfilename); - } - DisplayFontParam *dfp = new DisplayFontParam(new GString(fontName), displayFontT1); - dfp->t1.fileName = new GString(pdf2t1map[t].fullfilename); - pdf2t1map[t].dfp = dfp; - } - return pdf2t1map[t].dfp; - } - } - - int bestlen = 0x7fffffff; - const char*bestfilename = 0; - -#ifndef HAVE_FONTCONFIG - /* if we don't have fontconfig, try a simple filename-comparison approach */ - fontfile_t*f = global_fonts; - while(f) { - if(strstr(f->filename, name)) { - if(f->len < bestlen) { - bestlen = f->len; - bestfilename = f->filename; - } - } - f = f->next; - } -#endif - - /* if we didn't find anything up to now, try looking for the - font via fontconfig */ - char*filename = 0; - if(!bestfilename) { - filename = fontconfig_searchForFont(name); - } else { - filename = strdup(bestfilename); - } - - if(filename) { - msg(" Font %s maps to %s\n", name, filename); - DisplayFontParamKind kind = detectFontType(filename); - DisplayFontParam *dfp = new DisplayFontParam(new GString(fontName), kind); - if(kind == displayFontTT) { - dfp->tt.fileName = new GString(filename); - } else { - dfp->t1.fileName = new GString(filename); - } - free(filename); - return dfp; - } else { - msg(" Font %s not found\n", name); - return GlobalParams::getDisplayFont(fontName); - } -} - -CharOutputDev::CharOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) -:CommonOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2) -{ - this->type3active = 0; - this->xref = 0; - this->current_text_stroke = 0; - this->current_text_clip = 0; - this->config_bigchar=0; - this->config_extrafontdata = 0; - this->config_detectspaces = 1; - this->config_space_between_lines = 0; - this->config_linkdatafile = 0; - this->page2page = 0; - this->num_pages = 0; - this->links = 0; - this->last_link = 0; -}; - -CharOutputDev::~CharOutputDev() -{ -} - -void CharOutputDev::setParameter(const char*key, const char*value) -{ - if(!strcmp(key,"detectspaces")) { - this->config_detectspaces = atoi(value); - } else if(!strcmp(key,"space_between_lines")) { - this->config_space_between_lines = atoi(value); - } else if(!strcmp(key,"extrafontdata")) { - this->config_extrafontdata = atoi(value); - } else if(!strcmp(key,"linkdatafile")) { - this->config_linkdatafile = strdup(value); - } -} - -void CharOutputDev::setDevice(gfxdevice_t*dev) -{ - this->device = dev; -} - -static char*getFontName(GfxFont*font) -{ - char*fontid; - GString*gstr = font->getName(); - char* fname = gstr==0?0:gstr->getCString(); - if(fname==0) { - char buf[32]; - Ref*r=font->getID(); - sprintf(buf, "UFONT%d", r->num); - fontid = strdup(buf); - } else { - fontid = strdup(fname); - } - - char*fontname= 0; - char* plus = strchr(fontid, '+'); - if(plus && plus < &fontid[strlen(fontid)-1]) { - fontname = strdup(plus+1); - } else { - fontname = strdup(fontid); - } - free(fontid); - return fontname; -} - -static void dumpFontInfo(const char*loglevel, GfxFont*font); -static int lastdumps[1024]; -static int lastdumppos = 0; -/* nr = 0 unknown - nr = 1 substituting - nr = 2 type 3 - */ -static void showFontError(GfxFont*font, int nr) -{ - Ref*r=font->getID(); - int t; - for(t=0;tnum) - break; - if(t < lastdumppos) - return; - if(lastdumpposnum; - if(nr == 0) - msg(" The following font caused problems:"); - else if(nr == 1) - msg(" The following font caused problems (substituting):"); - else if(nr == 2) - msg(" The following Type 3 Font will be rendered as graphics:"); - dumpFontInfo("", font); -} - -static void dumpFontInfo(const char*loglevel, GfxFont*font) -{ - char* id = getFontID(font); - char* name = getFontName(font); - Ref* r=font->getID(); - msg("%s=========== %s (ID:%d,%d) ==========", loglevel, name, r->num,r->gen); - - GString*gstr = font->getTag(); - - msg("%s| Tag: %s", loglevel, id); - - if(font->isCIDFont()) msg("%s| is CID font", loglevel); - - GfxFontType type=font->getType(); - switch(type) { - case fontUnknownType: - msg("%s| Type: unknown",loglevel); - break; - case fontType1: - msg("%s| Type: 1",loglevel); - break; - case fontType1C: - msg("%s| Type: 1C",loglevel); - break; - case fontType3: - msg("%s| Type: 3",loglevel); - break; - case fontTrueType: - msg("%s| Type: TrueType",loglevel); - break; - case fontCIDType0: - msg("%s| Type: CIDType0",loglevel); - break; - case fontCIDType0C: - msg("%s| Type: CIDType0C",loglevel); - break; - case fontCIDType2: - msg("%s| Type: CIDType2",loglevel); - break; - } - - Ref embRef; - GBool embedded = font->getEmbeddedFontID(&embRef); - char*embeddedName=0; - if(font->getEmbeddedFontName()) { - embeddedName = font->getEmbeddedFontName()->getCString(); - } - if(embedded) - msg("%s| Embedded id: %s id: %d",loglevel, FIXNULL(embeddedName), embRef.num); - - gstr = font->getExtFontFile(); - if(gstr) - msg("%s| External Font file: %s", loglevel, FIXNULL(gstr->getCString())); - - // Get font descriptor flags. - if(font->isFixedWidth()) msg("%s| is fixed width", loglevel); - if(font->isSerif()) msg("%s| is serif", loglevel); - if(font->isSymbolic()) msg("%s| is symbolic", loglevel); - if(font->isItalic()) msg("%s| is italic", loglevel); - if(font->isBold()) msg("%s| is bold", loglevel); - - free(id); - free(name); -} - -GBool CharOutputDev::needNonText() -{ - return gFalse; -} - -void CharOutputDev::endPage() -{ - msg(" endPage (GfxOutputDev)"); - - if(this->links) { - kdtree_destroy(this->links); - this->links = 0; - } - GFXLink*l = this->last_link; - while(l) { - GFXLink*last = l->last; - l->draw(this,device); - delete l; - l = last; - } - this->last_link = 0; -} - -static inline double sqr(double x) {return x*x;} - -GBool CharOutputDev::upsideDown() -{ - return gTrue; -}; -GBool CharOutputDev::useDrawChar() -{ - return gTrue; -} - -const char*renderModeDesc[]= {"fill", "stroke", "fill+stroke", "invisible", - "clip+fill", "stroke+clip", "fill+stroke+clip", "clip"}; - -static char tmp_printstr[4096]; -char* makeStringPrintable(char*str) -{ - int len = strlen(str); - int dots = 0; - if(len>=80) { - len = 80; - dots = 1; - } - int t; - for(t=0;t124) { - c = '.'; - } - tmp_printstr[t] = c; - } - if(dots) { - tmp_printstr[len++] = '.'; - tmp_printstr[len++] = '.'; - tmp_printstr[len++] = '.'; - } - tmp_printstr[len] = 0; - return tmp_printstr; -} - -void CharOutputDev::updateTextMat(GfxState*state) -{ -} - -void CharOutputDev::beginString(GfxState *state, GString *s) -{ - int render = state->getRender(); - if(current_text_stroke) { - msg(" Error: Incompatible change of text rendering to %d while inside cliptext", render); - } - msg(" beginString(%s) render=%d", makeStringPrintable(s->getCString()), render); -} - -static gfxline_t* mkEmptyGfxShape(double x, double y) -{ - gfxline_t*line = (gfxline_t*)malloc(sizeof(gfxline_t)); - line->x = x;line->y = y;line->type = gfx_moveTo;line->next = 0; - return line; -} - -void CharOutputDev::drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode charid, int nBytes, Unicode *_u, int uLen) -{ - FontInfo*current_fontinfo = this->info->getFontInfo(state); - - if(!current_fontinfo || (unsigned)charid >= current_fontinfo->num_glyphs || !current_fontinfo->glyphs[charid]) { - msg(" Invalid charid %d for font %p (%d characters)", charid, current_fontinfo, current_fontinfo?current_fontinfo->num_glyphs:0); - return; - } - - gfxfont_t*current_gfxfont = current_fontinfo->getGfxFont(); - if(!current_fontinfo->seen) { - dumpFontInfo("", state->getFont()); - device->addfont(device, current_gfxfont); - current_fontinfo->seen = 1; - } - - CharCode glyphid = current_fontinfo->glyphs[charid]->glyphid; - - int render = state->getRender(); - gfxcolor_t col = gfxstate_getfillcolor(state); - - GFXLink*link = 0; - if(links) { - kdarea_t*a = kdtree_find(this->links, x+dx/2,y+dy/2); - if(a) { - link = (GFXLink*)a->data; -#if 0 - if(link) { - printf("area [%d %d %d %d] (link [%f %f %f %f]) contains (%f,%f)\n", - a->bbox.xmin, a->bbox.ymin, a->bbox.xmax, a->bbox.ymax, - link->x1, link->y1, link->x2, link->y2, - x+dx/2, y+dy/2 - ); - } -#endif - } - if(link != previous_link) { - previous_link = link; - device->setparameter(device, "link", link?link->action:""); - } - } - - // check for invisible text -- this is used by Acrobat Capture - if (render == RENDER_INVISIBLE) { - col.a = 0; - if(!config_extrafontdata) - return; - } - - GfxFont*font = state->getFont(); - - if(font->getType() == fontType3) { - /* type 3 chars are passed as graphics */ - msg(" type3 char at %f/%f", x, y); - return; - } - - Unicode u = uLen?(_u[0]):0; - - gfxmatrix_t m = current_fontinfo->get_gfxmatrix(state); - this->transformXY(state, x-originX, y-originY, &m.tx, &m.ty); - - gfxbbox_t bbox; - - msg(" drawChar(%f,%f,c='%c' (%d), u=%d <%d> '%c') CID=%d render=%d glyphid=%d font=%p",m.tx,m.ty,(charid&127)>=32?charid:'?', charid, u, uLen, u, font->isCIDFont(), render, glyphid, current_gfxfont); - - int space = current_fontinfo->space_char; - if(config_extrafontdata && config_detectspaces && space>=0 && m.m00 && !m.m01) { - /* space char detection */ - //bool different_y = last_char_y - m.ty; - bool different_y = m.ty < last_char_y - last_ascent*last_char_y_fontsize - || m.ty > last_char_y + last_descent*last_char_y_fontsize; - if((!different_y || config_space_between_lines) && - !last_char_was_space) { - double expected_x = last_char_x + last_char_advance*last_char_x_fontsize; - int space = current_fontinfo->space_char; - float width = fmax(m.m00*current_fontinfo->average_advance, last_char_x_fontsize*last_average_advance); - if(different_y) { - expected_x = m.tx - width/2; - } - if(m.tx - expected_x >= width*4/10) { - msg(" There's a %f pixel gap between char %d and char %d (expected no more than %f), I'm inserting a space here", - m.tx-expected_x, - last_char, glyphid, - width*4/10 - ); -#ifdef VISUALIZE_CHAR_GAPS - bbox = gfxline_getbbox(current_gfxfont->glyphs[glyphid].line); - gfxline_t*rect = gfxline_makerectangle(last_char_x,m.ty,m.tx,m.ty+10); - gfxcolor_t red = {255,255,0,0}; - device->fill(device, rect, &red); - gfxline_free(rect); -#endif - gfxmatrix_t m2 = m; - m2.tx = expected_x + (m.tx - expected_x - current_gfxfont->glyphs[space].advance*m.m00)/2; - if(m2.tx < expected_x) m2.tx = expected_x; - device->drawchar(device, current_gfxfont, space, &col, &m2); - if(link) { - link->addchar(32); - } - } - } - last_average_advance = current_fontinfo->average_advance; - last_char_advance = current_gfxfont->glyphs[glyphid].advance; - last_char_x_fontsize = m.m00; - last_char_y_fontsize = -m.m11; - last_char = glyphid; - last_char_x = m.tx; - last_char_y = m.ty; - last_ascent = current_gfxfont->ascent; - last_descent = fmax(current_gfxfont->descent, current_gfxfont->ascent/3); - last_char_was_space = GLYPH_IS_SPACE(¤t_gfxfont->glyphs[glyphid]); - } - device->drawchar(device, current_gfxfont, glyphid, &col, &m); - - if(link) { - link->addchar(current_gfxfont->glyphs[glyphid].unicode); - } -} - -void CharOutputDev::endString(GfxState *state) -{ -} - -void CharOutputDev::endTextObject(GfxState *state) -{ -} - -/* the logic seems to be as following: - first, beginType3Char is called, with the charcode and the coordinates. - if this function returns true, it already knew about the char and has now drawn it. - if the function returns false, it's a new char, and type3D0 and/or type3D1 might be - called with some parameters. - Afterwards, all draw operations until endType3Char are part of the char (which in this moment is - at the position first passed to beginType3Char). the char ends with endType3Char. - - The drawing operations between beginType3Char and endType3Char are somewhat different to - the normal ones. For example, the fillcolor equals the stroke color. (Because the stroke - color determines the color of a font) -*/ - -GBool CharOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode charid, Unicode *u, int uLen) -{ - msg(" beginType3Char %d u=%d", charid, uLen?u[0]:0); - type3active = 1; - - if(config_extrafontdata) { - - FontInfo*current_fontinfo = info->getFontInfo(state); - if(!current_fontinfo) { - msg(" Couldn't find font info"); - return gFalse; - } - gfxfont_t*current_gfxfont = current_fontinfo->getGfxFont(); - - /*m.m00*=INTERNAL_FONT_SIZE; - m.m01*=INTERNAL_FONT_SIZE; - m.m10*=INTERNAL_FONT_SIZE; - m.m11*=INTERNAL_FONT_SIZE;*/ - - if(!current_fontinfo || (unsigned)charid >= current_fontinfo->num_glyphs || !current_fontinfo->glyphs[charid]) { - msg(" Invalid type3 charid %d for font %p", charid, current_fontinfo); - return gFalse; - } - gfxcolor_t col={0,0,0,0}; - CharCode glyphid = current_fontinfo->glyphs[charid]->glyphid; - gfxmatrix_t m = current_fontinfo->get_gfxmatrix(state); - this->transformXY(state, 0, 0, &m.tx, &m.ty); - device->drawchar(device, current_gfxfont, glyphid, &col, &m); - } - - - /* the character itself is going to be passed using the draw functions */ - return gFalse; /* gTrue= is_in_cache? */ -} - -void CharOutputDev::type3D0(GfxState *state, double wx, double wy) { -} -void CharOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) { -} - -void CharOutputDev::endType3Char(GfxState *state) -{ - type3active = 0; - msg(" endType3Char"); -} - -void CharOutputDev::beginPage(GfxState *state, int pageNum) -{ - this->currentpage = pageNum; - this->last_char_was_space = 1; - this->last_char_y = 0; - this->last_char_y_fontsize = 0; - this->last_ascent = 0; - this->last_descent = 0; - this->previous_link = 0; -} - -void GFXLink::draw(CharOutputDev*out, gfxdevice_t*dev) -{ - int x1,y1,x2,y2; - out->transformXY_stateless(this->x1, this->y1, &x1, &y1); - out->transformXY_stateless(this->x2, this->y2, &x2, &y2); - - gfxline_t points[5]; - points[0].type = gfx_moveTo; - points[0].x = x1; - points[0].y = y1; - points[0].next = &points[1]; - points[1].type = gfx_lineTo; - points[1].x = x1; - points[1].y = y2; - points[1].next = &points[2]; - points[2].type = gfx_lineTo; - points[2].x = x2; - points[2].y = y2; - points[2].next = &points[3]; - points[3].type = gfx_lineTo; - points[3].x = x2; - points[3].y = y1; - points[3].next = &points[4]; - points[4].type = gfx_lineTo; - points[4].x = x1; - points[4].y = y1; - points[4].next = 0; - msg(" drawing link %.2f/%.2f %.2f/%.2f %.2f/%.2f %.2f/%.2f to %s (\"%s\")", - points[0].x, points[0].y, - points[1].x, points[1].y, - points[2].x, points[2].y, - points[3].x, points[3].y, action, text); - - dev->drawlink(dev, points, action, text); -} - -void GFXLink::addchar(int unicode) -{ - msg(" Adding '%c' (%d) to link %s", unicode, unicode, action); - char buf[8]; - int l = writeUTF8(unicode, buf); - while(size+l+1>=buf_size) { - buf_size += 32; - text = (char*)rfx_realloc(text, buf_size); - } - strcpy(text+size, buf); - size += l; -} - -GFXLink::GFXLink(GFXLink*last, const char*action, double x1, double y1, double x2, double y2) -{ - this->buf_size = 0; - this->size = 0; - this->text = 0; - this->last = last; - this->action = strdup(action); - this->x1 = x1; - this->y1 = y1; - this->x2 = x2; - this->y2 = y2; -} - -GFXLink::~GFXLink() -{ - free((void*)this->action); - if(this->text) - free(this->text); - this->text = 0; - this->action = 0; -} - - -void CharOutputDev::processLink(Link *link, Catalog *catalog) -{ - double x1, y1, x2, y2; - - msg(" drawlink"); - - link->getRect(&x1, &y1, &x2, &y2); - - LinkAction*actionobj=link->getAction(); - char buf[128]; - char*s = 0; - const char*type = "-?-"; - char*named = 0; - int page = -1; - msg(" drawlink actionobj=%d", actionobj->getKind()); - switch(actionobj->getKind()) - { - case actionGoTo: { - type = "GoTo"; - LinkGoTo *ha=(LinkGoTo *)link->getAction(); - LinkDest *dest=NULL; - if (ha->getDest()==NULL) - dest=catalog->findDest(ha->getNamedDest()); - else - dest=ha->getDest()->copy(); - if (dest){ - if (dest->isPageRef()){ - Ref pageref=dest->getPageRef(); - page=catalog->findPage(pageref.num,pageref.gen); - } - else page=dest->getPageNum(); - sprintf(buf, "%d", page); - s = strdup(buf); - delete dest; - } - } - break; - case actionGoToR: { - type = "GoToR"; - LinkGoToR*l = (LinkGoToR*)actionobj; - GString*g = l->getFileName(); - if(g) - s = strdup(g->getCString()); - if(!s) { - /* if the GoToR link has no filename, then - try to find a refernce in the *local* - file */ - GString*g = l->getNamedDest(); - if(g) - s = strdup(g->getCString()); - } - } - break; - case actionNamed: { - type = "Named"; - LinkNamed*l = (LinkNamed*)actionobj; - GString*name = l->getName(); - if(name) { - s = strdup(name->lowerCase()->getCString()); - named = name->getCString(); - if(!strchr(s,':')) - { - if(strstr(s, "next") || strstr(s, "forward")) - { - page = currentpage + 1; - } - else if(strstr(s, "prev") || strstr(s, "back")) - { - page = currentpage - 1; - } - else if(strstr(s, "last") || strstr(s, "end")) - { - if(this->page2page && this->num_pages) { - page = this->page2page[this->num_pages-1]; - } - } - else if(strstr(s, "first") || strstr(s, "top")) - { - page = 1; - } - } - } - } - break; - case actionLaunch: { - type = "Launch"; - LinkLaunch*l = (LinkLaunch*)actionobj; - GString * str = new GString(l->getFileName()); - GString * params = l->getParams(); - if(params) - str->append(params); - s = strdup(str->getCString()); - delete str; - } - break; - case actionURI: { - char*url = 0; - type = "URI"; - LinkURI*l = (LinkURI*)actionobj; - GString*g = l->getURI(); - if(g) { - url = g->getCString(); - s = strdup(url); - } - } - break; - case actionUnknown: { - type = "Unknown"; - LinkUnknown*l = (LinkUnknown*)actionobj; - s = strdup(""); - } - break; - default: { - msg(" Unknown link type!"); - break; - } - } - - if(!s) s = strdup("-?-"); - - if(!getGfxGlobals()->linkinfo && (page || s)) - { - msg(" File contains links"); - getGfxGlobals()->linkinfo = 1; - } - - char*action = 0; - if(page>0) { - int t; - int lpage = -1; - for(t=1;t<=this->num_pages;t++) { - if(this->page2page[t]==page) { - lpage = t; - break; - } - } - if(lpage<0) { - lpage = page; - } - - char buf[80]; - sprintf(buf, "page%d", lpage); - action = buf; - } - else if(s) - { - action = s; - if(this->config_linkdatafile) { - FILE*fi = fopen(config_linkdatafile, "ab+"); - fprintf(fi, "%s\n", s); - fclose(fi); - } - } - - this->last_link = new GFXLink(this->last_link, action, x1, y1, x2, y2); - if(!this->links) { - this->links = kdtree_new(); - } - kdtree_add_box(this->links, x1,y1,x2,y2, this->last_link); -#if 0 - printf("adding link %p at %f %f %f %f to tree\n", this->last_link, x1, y1, x2, y2); -#endif - - msg(" storing \"%s\" link to \"%s\"", type, FIXNULL(action)); - free(s);s=0; -} - -void CharOutputDev::saveState(GfxState *state) { - msg(" saveState %p", state); - updateAll(state); -}; - -void CharOutputDev::restoreState(GfxState *state) -{ - updateAll(state); -} - -void CharOutputDev::updateFont(GfxState *state) -{ - GfxFont* gfxFont = state->getFont(); - if (!gfxFont) { - return; - } - - char*id = getFontID(gfxFont); - msg(" Updating font to %s", FIXNULL(id)); - free(id);id=0; - - if(gfxFont->getType() == fontType3) { - infofeature("Type3 fonts"); - } - updateTextMat(state); -} - -static const char* dirseparator() -{ -#ifdef WIN32 - return "\\"; -#else - return "/"; -#endif -} - -void addGlobalFont(const char*filename) -{ - fontfile_t* f = (fontfile_t*)malloc(sizeof(fontfile_t)); - memset(f, 0, sizeof(fontfile_t)); - f->filename = filename; - int len = strlen(filename); - char*r1 = strrchr((char*)filename, '/'); - char*r2 = strrchr((char*)filename, '\\'); - if(r2>r1) - r1 = r2; - if(r1) { - len = strlen(r1+1); - } - f->len = len; - - msg(" Adding font \"%s\".", filename); - if(global_fonts_next) { - global_fonts_next->next = f; - global_fonts_next = global_fonts_next->next; - } else { - global_fonts_next = global_fonts = f; - } -} - -void addGlobalLanguageDir(const char*dir) -{ -#ifdef HAVE_POPPLER - msg(" NOT adding %s to language pack directories (not implemented with poppler)", dir); -#else - msg(" Adding %s to language pack directories", dir); - - FILE*fi = 0; - char* config_file = (char*)malloc(strlen(dir) + 1 + sizeof("add-to-xpdfrc") + 1); - strcpy(config_file, dir); - strcat(config_file, dirseparator()); - strcat(config_file, "add-to-xpdfrc"); - - fi = fopen(config_file, "rb"); - if(!fi) { - msg(" Could not open %s", config_file); - return; - } - globalParams->parseFile(new GString(config_file), fi); - fclose(fi); -#endif -} - -void addGlobalFontDir(const char*dirname) -{ -#ifdef HAVE_DIRENT_H - DIR*dir = opendir(dirname); - if(!dir) { - msg(" Couldn't open directory %s", dirname); - return; - } - struct dirent*ent; - int fonts = 0; - while(1) { - ent = readdir (dir); - if (!ent) - break; - int l; - char*name = ent->d_name; - char type = 0; - if(!name) continue; - l=strlen(name); - if(l<4) - continue; - if(!strncasecmp(&name[l-4], ".pfa", 4)) - type=1; - if(!strncasecmp(&name[l-4], ".pfb", 4)) - type=3; - if(!strncasecmp(&name[l-4], ".ttf", 4)) - type=2; - if(type) { - char*fontname = (char*)malloc(strlen(dirname)+strlen(name)+2); - strcpy(fontname, dirname); - strcat(fontname, dirseparator()); - strcat(fontname, name); - addGlobalFont(fontname); - fonts++; - } - } - msg(" Added %s to font directories (%d fonts)", dirname, fonts); - closedir(dir); -#else - msg(" No dirent.h"); -#endif -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.h deleted file mode 100644 index d22dd536d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CharOutputDev.h +++ /dev/null @@ -1,118 +0,0 @@ -#ifndef __charoutputdev_h__ -#define __charoutputdev_h__ - -#include "../gfxdevice.h" -#include "../gfxsource.h" -#include "../gfxtools.h" -#include "../kdtree.h" - -#include "InfoOutputDev.h" -#include "PDFDoc.h" -#include "GlobalParams.h" -#include "CommonOutputDev.h" - -extern void addGlobalFont(const char*filename); -extern void addGlobalLanguageDir(const char*dir); -extern void addGlobalFontDir(const char*dirname); - -class GFXLink; - -class CharOutputDev: public CommonOutputDev { -public: - gfxdevice_t* device; - - CharOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); - virtual ~CharOutputDev(); - - virtual void setDevice(gfxdevice_t*dev); - virtual void setParameter(const char*key, const char*value); - - virtual void beginPage(GfxState *state, int pageNum); - virtual void endPage(); - - virtual GBool upsideDown(); - virtual GBool useDrawChar(); - - virtual void processLink(Link *link, Catalog *catalog); - virtual void saveState(GfxState *state) ; - virtual void restoreState(GfxState *state) ; - - //----- update graphics state - virtual void updateFont(GfxState *state); - virtual void updateTextMat(GfxState *state); - - //----- text drawing - virtual void beginString(GfxState *state, GString *s) ; - virtual void endString(GfxState *state) ; - virtual void endTextObject(GfxState *state); - virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen); - - //----- type 3 chars - virtual GBool beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen); - virtual void endType3Char(GfxState *state); - - virtual void type3D0(GfxState *state, double wx, double wy); - virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); - - virtual GBool needNonText(); - - private: - - int currentpage; - int type3active; // are we between beginType3()/endType3()? - - gfxline_t* current_text_stroke; - gfxline_t* current_text_clip; - - // state variables for space char detection - int last_char; - double last_char_x; - double last_char_y; - double last_char_x_fontsize; - double last_char_y_fontsize; - double last_char_advance; - double last_average_advance; - double last_ascent; - double last_descent; - char last_char_was_space; - - GFXLink*last_link; - GFXLink*previous_link; - kdtree_t*links; - - /* config */ - int config_use_fontconfig; - int config_remapunicode; - int config_extrafontdata; - int config_bigchar; - int config_detectspaces; - int config_space_between_lines; - double config_fontquality; - char* config_linkdatafile; -}; - -class GFXLink { - double x1,y1,x2,y2; - int size; - int buf_size; - char*text; - public: - const char*action; - GFXLink*last; - void draw(CharOutputDev*out, gfxdevice_t*dev); - void addchar(int unicode); - GFXLink(GFXLink*last, const char*action, double x1, double y1, double x2, double y2); - ~GFXLink(); -}; - -class GFXGlobalParams: public GlobalParams { - public: - GFXGlobalParams(); - ~GFXGlobalParams(); - virtual DisplayFontParam *getDisplayFont(GString *fontName); -}; - -#endif //__charoutputdev_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.cc deleted file mode 100644 index 803c8aa51..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.cc +++ /dev/null @@ -1,153 +0,0 @@ -#include "popplercompat.h" -#include "CommonOutputDev.h" -#include "../log.h" -#include "../gfxdevice.h" - -int config_break_on_warning = 0; - -CommonOutputDev::CommonOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) -{ - this->info = info; - this->doc = doc; - this->xref = doc->getXRef(); - - if(x2user_movex = x; - this->user_movey = y; - this->user_clipx1 = x1; - this->user_clipy1 = y1; - this->user_clipx2 = x2; - this->user_clipy2 = y2; -} - -void CommonOutputDev::startPage(int pageNum, GfxState*state) -{ - double x1,y1,x2,y2; - PDFRectangle *r = this->page->getCropBox(); - state->transform(r->x1,r->y1,&x1,&y1); - state->transform(r->x2,r->y2,&x2,&y2); - if(x2movex = -(int)x1 - this->user_clipx1 + this->user_movex; - this->movey = -(int)y1 - this->user_clipy1 + this->user_movey; - - if(this->user_clipx1|this->user_clipy1|this->user_clipx2|this->user_clipy2) { - this->width = this->user_clipx2 - this->user_clipx1; - this->height = this->user_clipy2 - this->user_clipy1; - } else { - this->width = x2-x1; - this->height = y2-y1; - } - beginPage(state, pageNum); -} - -void CommonOutputDev::transformXY(GfxState*state, double x, double y, double*nx, double*ny) -{ - state->transform(x,y,nx,ny); - *nx += movex; - *ny += movey; -} -void CommonOutputDev::transformXY_stateless(double x, double y, int*xout, int*yout) -{ - cvtUserToDev(x, y, xout, yout); - *xout += movex; - *yout += movey; -} - -GBool CommonOutputDev::interpretType3Chars() -{ - return gTrue; -} - -GFXOutputGlobals::GFXOutputGlobals() -{ - this->featurewarnings = 0; - this->jpeginfo = 0; - this->textmodeinfo = 0; - this->linkinfo = 0; - this->pbminfo = 0; -} -GFXOutputGlobals::~GFXOutputGlobals() -{ - feature_t*f = this->featurewarnings; - while(f) { - feature_t*next = f->next; - if(f->string) { - free(f->string);f->string =0; - } - f->next = 0; - free(f); - f = next; - } - this->featurewarnings = 0; -} - -static GFXOutputGlobals*gfxglobals=0; - -static void showfeature(const char*feature, char fully, char warn) -{ - if(!gfxglobals) - gfxglobals = new GFXOutputGlobals(); - - feature_t*f = gfxglobals->featurewarnings; - while(f) { - if(!strcmp(feature, f->string)) - return; - f = f->next; - } - f = (feature_t*)malloc(sizeof(feature_t)); - f->string = strdup(feature); - f->next = gfxglobals->featurewarnings; - gfxglobals->featurewarnings = f; - if(warn) { - msg(" %s not yet %ssupported!",feature,fully?"fully ":""); - } else { - msg(" File contains %s",feature); - } -} -void warnfeature(const char*feature,char fully) -{ - showfeature(feature,fully,1); - if(config_break_on_warning) { - msg(" Aborting conversion due to unsupported feature"); - exit(1); - } -} -void infofeature(const char*feature) -{ - showfeature(feature,0,0); -} -GFXOutputGlobals* getGfxGlobals() -{ - if(!gfxglobals) - gfxglobals = new GFXOutputGlobals(); - return gfxglobals; -} - -gfxcolor_t gfxstate_getfillcolor(GfxState * state) -{ - GfxRGB rgb; - double opaq = state->getFillOpacity(); - state->getFillRGB(&rgb); - gfxcolor_t col; - col.r = colToByte(rgb.r); - col.g = colToByte(rgb.g); - col.b = colToByte(rgb.b); - col.a = (unsigned char)(opaq*255); - return col; -} - -bool text_matrix_is_skewed(GfxState * state) -{ - double*ctm = state->getCTM(); - double*tm = state->getTextMat(); - double m00 = ctm[0]*tm[0] + ctm[2]*tm[1]; - double m01 = ctm[1]*tm[0] + ctm[3]*tm[1]; - double m10 = ctm[0]*tm[2] + ctm[2]*tm[3]; - double m11 = ctm[1]*tm[2] + ctm[3]*tm[3]; - return (m00<0 || m10<0); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.h deleted file mode 100644 index db2f4d804..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/CommonOutputDev.h +++ /dev/null @@ -1,109 +0,0 @@ -/* InfoOutputDev.h - Superclass for BitmapOutputDev, GFXOutputDev etc. - - This file is part of swftools. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __commonoutputdev_h__ -#define __commonoutputdev_h__ - -#include "OutputDev.h" -#include "InfoOutputDev.h" -#include "../gfxdevice.h" - -#define RENDER_FILL 0 -#define RENDER_STROKE 1 -#define RENDER_FILLSTROKE 2 -#define RENDER_INVISIBLE 3 -#define RENDER_CLIP 4 - -typedef struct _feature -{ - char*string; - struct _feature*next; -} feature_t; - -class GFXOutputGlobals { -public: - feature_t*featurewarnings; - - int textmodeinfo; // did we write "Text will be rendered as polygon" yet? - int jpeginfo; // did we write "File contains jpegs" yet? - int pbminfo; // did we write "File contains jpegs" yet? - int linkinfo; // did we write "File contains links" yet? - - GFXOutputGlobals(); - ~GFXOutputGlobals(); -}; -extern GFXOutputGlobals* getGfxGlobals(); - -extern void warnfeature(const char*feature,char fully); -extern void infofeature(const char*feature); - -gfxcolor_t gfxstate_getfillcolor(GfxState * state); -bool text_matrix_is_skewed(GfxState * state); - -class CommonOutputDev: public OutputDev -{ - public: - CommonOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); - - virtual void setDevice(gfxdevice_t*dev) = 0; - virtual void setParameter(const char*key, const char*value) = 0; - - virtual void startPage(int pageNum, GfxState*state); - virtual void beginPage(GfxState*state, int page) = 0; - - virtual void setPage(Page *page) { this->page = page; } - virtual void finishPage() {}; - - void transformXY(GfxState*state, double x, double y, double*nx, double*ny); - void transformXY_stateless(double x, double y, int*xout, int*yout); - - virtual GBool interpretType3Chars(); - - virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL) - { - this->setPage(page); - return gTrue; - } - - protected: - Page *page; - PDFDoc* doc; - XRef* xref; - InfoOutputDev* info; - - /* if set, will use a user bounding box instead of the PDF's bounding box */ - int user_movex,user_movey; - int user_clipx1,user_clipx2,user_clipy1,user_clipy2; - - /* movex,movey is the upper left corner of clipping rectangle (cropbox)- - this needs to be added to all drawing coordinates to give the - impression that all pages start at (0,0)*/ - int movex, movey; - int width, height; - - /* for page mapping */ - int* page2page; - int num_pages; -}; -#endif //__deviceinterface_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.cc deleted file mode 100644 index 8faaa0b1f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.cc +++ /dev/null @@ -1,575 +0,0 @@ -/* FullBitmapOutputDev.cc - - Output Device which creates a bitmap. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "FullBitmapOutputDev.h" -#include "CharOutputDev.h" - -#ifdef HAVE_POPPLER - #include "splash/SplashBitmap.h" - #include "splash/SplashPattern.h" - #include "splash/Splash.h" -#else - #include "xpdf/config.h" - #include "SplashBitmap.h" - #include "SplashPattern.h" - #include "Splash.h" -#endif - -#include "../log.h" -#include "../png.h" -#include "../devices/record.h" - -static SplashColor splash_white = {255,255,255}; -static SplashColor splash_black = {0,0,0}; - -FullBitmapOutputDev::FullBitmapOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) -:CommonOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2) -{ - this->doc = doc; - this->xref = doc->getXRef(); - - msg(" Rendering everything to a bitmap"); - - /* color graphic output device, for creating bitmaps */ - this->rgbdev = new SplashOutputDev(splashModeRGB8, 1, gFalse, splash_white, gTrue, gTrue); - - /* device for handling links */ - this->gfxdev = new CharOutputDev(info, this->doc, page2page, num_pages, x, y, x1, y1, x2, y2); - - this->rgbdev->startDoc(this->xref); -} -FullBitmapOutputDev::~FullBitmapOutputDev() -{ - if(this->rgbdev) { - delete this->rgbdev;this->rgbdev = 0; - } - if(this->gfxdev) { - delete this->gfxdev;this->gfxdev= 0; - } -} - -GBool FullBitmapOutputDev::getVectorAntialias() -{ - return this->rgbdev->getVectorAntialias(); -} -void FullBitmapOutputDev::setVectorAntialias(GBool vaa) -{ - this->rgbdev->setVectorAntialias(vaa); -} -void FullBitmapOutputDev::setDevice(gfxdevice_t*dev) -{ - this->dev = dev; - gfxdev->setDevice(dev); -} - -void FullBitmapOutputDev::setParameter(const char*key, const char*value) -{ -} -static void getBitmapBBox(Guchar*alpha, int width, int height, int*xmin, int*ymin, int*xmax, int*ymax) -{ - *ymin = -1; - *xmin = width; - *xmax = 0; - int x,y; - for(y=0;y*xmax) *xmax = right; - } - } - if(*xmin>=*xmax || *ymin>=*ymax) { - *xmin = 0; - *ymin = 0; - *xmax = 0; - *ymax = 0; - } -} - -void FullBitmapOutputDev::flushBitmap() -{ - int width = rgbdev->getBitmapWidth(); - int height = rgbdev->getBitmapHeight(); - - SplashColorPtr rgb = rgbdev->getBitmap()->getDataPtr(); - Guchar*alpha = rgbdev->getBitmap()->getAlphaPtr(); - - int xmin,ymin,xmax,ymax; - getBitmapBBox(alpha, width, height, &xmin,&ymin,&xmax,&ymax); - - /* clip against (-movex, -movey, -movex+width, -movey+height) */ - if(xmin < -this->movex) xmin = -this->movex; - if(ymin < -this->movey) ymin = -this->movey; - if(xmax > -this->movex + width) xmax = -this->movex+this->width; - if(ymax > -this->movey + height) ymax = -this->movey+this->height; - - msg(" Flushing bitmap (bbox: %d,%d,%d,%d)", xmin,ymin,xmax,ymax); - - if((xmax-xmin)<=0 || (ymax-ymin)<=0) // no bitmap, nothing to do - return; - - if(sizeof(SplashColor)!=3) { - msg(" sizeof(SplashColor)!=3"); - return; - } - //xmin = ymin = 0; - //xmax = width; - //ymax = height; - - int rangex = xmax-xmin; - int rangey = ymax-ymin; - gfximage_t*img = (gfximage_t*)malloc(sizeof(gfximage_t)); - img->data = (gfxcolor_t*)malloc(rangex * rangey * 4); - img->width = rangex; - img->height = rangey; - int x,y; - for(y=0;ydata[y*rangex]; - Guchar*ain = &alpha[(y+ymin)*width+xmin]; - for(x=0;xfillbitmap(dev, line, img, &m, 0); - gfxline_free(line); - - free(img->data);img->data=0;free(img);img=0; -} - -GBool FullBitmapOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data), - void *abortCheckCbkData) -{ - this->setPage(page); - gfxdev->setPage(page); - return gTrue; -} - -void FullBitmapOutputDev::beginPage(GfxState *state, int pageNum) -{ - msg(" startPage"); - rgbdev->startPage(pageNum, state); - gfxdev->startPage(pageNum, state); -} - -void FullBitmapOutputDev::endPage() -{ - msg(" endPage (FullBitmapOutputDev)"); - flushBitmap(); - rgbdev->endPage(); - gfxdev->endPage(); -} -GBool FullBitmapOutputDev::upsideDown() -{ - return rgbdev->upsideDown(); -} -GBool FullBitmapOutputDev::useDrawChar() -{ - return rgbdev->useDrawChar(); -} -GBool FullBitmapOutputDev::useTilingPatternFill() -{ - return rgbdev->useTilingPatternFill(); -} -GBool FullBitmapOutputDev::useShadedFills() -{ - return rgbdev->useShadedFills(); -} -GBool FullBitmapOutputDev::useDrawForm() -{ - return rgbdev->useDrawForm(); -} -GBool FullBitmapOutputDev::interpretType3Chars() -{ - return rgbdev->interpretType3Chars(); -} -GBool FullBitmapOutputDev::needNonText() -{ - return rgbdev->needNonText(); -} -void FullBitmapOutputDev::setDefaultCTM(double *ctm) -{ - rgbdev->setDefaultCTM(ctm); - gfxdev->setDefaultCTM(ctm); -} -void FullBitmapOutputDev::saveState(GfxState *state) -{ - rgbdev->saveState(state); -} -void FullBitmapOutputDev::restoreState(GfxState *state) -{ - rgbdev->restoreState(state); -} -void FullBitmapOutputDev::updateAll(GfxState *state) -{ - rgbdev->updateAll(state); -} -void FullBitmapOutputDev::updateCTM(GfxState *state, double m11, double m12, double m21, double m22, double m31, double m32) -{ - rgbdev->updateCTM(state,m11,m12,m21,m22,m31,m32); - gfxdev->updateCTM(state,m11,m12,m21,m22,m31,m32); -} -void FullBitmapOutputDev::updateLineDash(GfxState *state) -{ - rgbdev->updateLineDash(state); -} -void FullBitmapOutputDev::updateFlatness(GfxState *state) -{ - rgbdev->updateFlatness(state); -} -void FullBitmapOutputDev::updateLineJoin(GfxState *state) -{ - rgbdev->updateLineJoin(state); -} -void FullBitmapOutputDev::updateLineCap(GfxState *state) -{ - rgbdev->updateLineCap(state); -} -void FullBitmapOutputDev::updateMiterLimit(GfxState *state) -{ - rgbdev->updateMiterLimit(state); -} -void FullBitmapOutputDev::updateLineWidth(GfxState *state) -{ - rgbdev->updateLineWidth(state); -} -void FullBitmapOutputDev::updateStrokeAdjust(GfxState *state) -{ - rgbdev->updateStrokeAdjust(state); -} -void FullBitmapOutputDev::updateFillColorSpace(GfxState *state) -{ - rgbdev->updateFillColorSpace(state); -} -void FullBitmapOutputDev::updateStrokeColorSpace(GfxState *state) -{ - rgbdev->updateStrokeColorSpace(state); -} -void FullBitmapOutputDev::updateFillColor(GfxState *state) -{ - rgbdev->updateFillColor(state); -} -void FullBitmapOutputDev::updateStrokeColor(GfxState *state) -{ - rgbdev->updateStrokeColor(state); -} -void FullBitmapOutputDev::updateBlendMode(GfxState *state) -{ - rgbdev->updateBlendMode(state); -} -void FullBitmapOutputDev::updateFillOpacity(GfxState *state) -{ - rgbdev->updateFillOpacity(state); -} -void FullBitmapOutputDev::updateStrokeOpacity(GfxState *state) -{ - rgbdev->updateStrokeOpacity(state); -} -void FullBitmapOutputDev::updateFillOverprint(GfxState *state) -{ - rgbdev->updateFillOverprint(state); -} -void FullBitmapOutputDev::updateStrokeOverprint(GfxState *state) -{ - rgbdev->updateStrokeOverprint(state); -} -void FullBitmapOutputDev::updateTransfer(GfxState *state) -{ - rgbdev->updateTransfer(state); -} -void FullBitmapOutputDev::updateFont(GfxState *state) -{ - rgbdev->updateFont(state); -} -void FullBitmapOutputDev::updateTextMat(GfxState *state) -{ - rgbdev->updateTextMat(state); -} -void FullBitmapOutputDev::updateCharSpace(GfxState *state) -{ - rgbdev->updateCharSpace(state); -} -void FullBitmapOutputDev::updateRender(GfxState *state) -{ - rgbdev->updateRender(state); -} -void FullBitmapOutputDev::updateRise(GfxState *state) -{ - rgbdev->updateRise(state); -} -void FullBitmapOutputDev::updateWordSpace(GfxState *state) -{ - rgbdev->updateWordSpace(state); -} -void FullBitmapOutputDev::updateHorizScaling(GfxState *state) -{ - rgbdev->updateHorizScaling(state); -} -void FullBitmapOutputDev::updateTextPos(GfxState *state) -{ - rgbdev->updateTextPos(state); -} -void FullBitmapOutputDev::updateTextShift(GfxState *state, double shift) -{ - rgbdev->updateTextShift(state, shift); -} - -void FullBitmapOutputDev::stroke(GfxState *state) -{ - msg(" stroke"); - rgbdev->stroke(state); -} -void FullBitmapOutputDev::fill(GfxState *state) -{ - msg(" fill"); - rgbdev->fill(state); -} -void FullBitmapOutputDev::eoFill(GfxState *state) -{ - msg(" eoFill"); - rgbdev->eoFill(state); -} -POPPLER_TILING_PATERN_RETURN FullBitmapOutputDev::tilingPatternFill(GfxState *state, POPPLER_TILING_PATERN_GFX - Object *str, - int paintType, Dict *resDict, - double *mat, double *bbox, - int x0, int y0, int x1, int y1, - double xStep, double yStep) -{ - msg(" tilingPatternFill"); -#ifdef HAVE_POPPLER - return -#endif - rgbdev->tilingPatternFill(state, POPPLER_TILING_PATERN_GFX_ARG str, paintType, resDict, mat, bbox, x0, y0, x1, y1, xStep, yStep); -} - -GBool FullBitmapOutputDev::functionShadedFill(GfxState *state, GfxFunctionShading *shading) -{ - msg(" functionShadedFill"); - return rgbdev->functionShadedFill(state, shading); -} -GBool FullBitmapOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading POPPLER_RAXIAL_MIN_MAX) -{ - msg(" axialShadedFill"); - return rgbdev->axialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); -} -GBool FullBitmapOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading POPPLER_RAXIAL_MIN_MAX) -{ - msg(" radialShadedFill"); - return rgbdev->radialShadedFill(state, shading POPPLER_RAXIAL_MIN_MAX_ARG); -} - -void FullBitmapOutputDev::clip(GfxState *state) -{ - msg(" clip"); - rgbdev->clip(state); -} -void FullBitmapOutputDev::eoClip(GfxState *state) -{ - msg(" eoClip"); - rgbdev->eoClip(state); -} -void FullBitmapOutputDev::clipToStrokePath(GfxState *state) -{ - msg(" clipToStrokePath"); - rgbdev->clipToStrokePath(state); -} - -void FullBitmapOutputDev::beginStringOp(GfxState *state) -{ - msg(" beginStringOp"); - rgbdev->beginStringOp(state); -} -void FullBitmapOutputDev::endStringOp(GfxState *state) -{ - msg(" endStringOp"); - rgbdev->endStringOp(state); -} -void FullBitmapOutputDev::beginString(GfxState *state, GString *s) -{ - msg(" beginString"); - rgbdev->beginString(state, s); -} -void FullBitmapOutputDev::endString(GfxState *state) -{ - msg(" endString"); - rgbdev->endString(state); -} -void FullBitmapOutputDev::drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen) -{ - msg(" drawChar"); - rgbdev->drawChar(state, x, y, dx, dy, originX, originY, code, nBytes, u, uLen); -} -void FullBitmapOutputDev::drawString(GfxState *state, GString *s) -{ - msg(" internal error: drawString not implemented"); - rgbdev->drawString(state, s); -} -void FullBitmapOutputDev::endTextObject(GfxState *state) -{ - /* FIXME: the below might render things (stroke outlines etc.) to gfxdev which - might end up unflushed- should be handled similarily as - drawChar() above - */ - msg(" endTextObject"); - rgbdev->endTextObject(state); -} - -/* TODO: these four operations below *should* do nothing, as type3 - chars are drawn using operations like fill() */ -GBool FullBitmapOutputDev::beginType3Char(GfxState *state, double x, double y, - double dx, double dy, - CharCode code, Unicode *u, int uLen) -{ - msg(" beginType3Char"); - return rgbdev->beginType3Char(state, x, y, dx, dy, code, u, uLen); -} -void FullBitmapOutputDev::type3D0(GfxState *state, double wx, double wy) -{ - msg(" type3D0"); - rgbdev->type3D0(state, wx, wy); -} -void FullBitmapOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) -{ - msg(" type3D1"); - rgbdev->type3D1(state, wx, wy, llx, lly, urx, ury); -} -void FullBitmapOutputDev::endType3Char(GfxState *state) -{ - msg(" endType3Char"); - rgbdev->endType3Char(state); -} -void FullBitmapOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, POPPLER_INTERPOLATE - GBool inlineImg) -{ - msg(" drawImageMask"); - rgbdev->drawImageMask(state, ref, str, width, height, invert, POPPLER_INTERPOLATE_ARG inlineImg); -} -void FullBitmapOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, POPPLER_INTERPOLATE - int *maskColors, GBool inlineImg) -{ - msg(" drawImage"); - rgbdev->drawImage(state, ref, str, width, height, colorMap, - POPPLER_INTERPOLATE_ARG maskColors, inlineImg); -} -void FullBitmapOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, POPPLER_INTERPOLATE - Stream *maskStr, int maskWidth, int maskHeight, - GBool maskInvert POPPLER_MASK_INTERPOLATE) -{ - msg(" drawMaskedImage"); - rgbdev->drawMaskedImage(state, ref, str, width, height, colorMap, - POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, - maskInvert POPPLER_MASK_INTERPOLATE_ARG); -} -void FullBitmapOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, POPPLER_INTERPOLATE - Stream *maskStr, int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap POPPLER_MASK_INTERPOLATE) -{ - msg(" drawSoftMaskedImage"); - rgbdev->drawSoftMaskedImage(state, ref, str, width, height, colorMap, - POPPLER_INTERPOLATE_ARG maskStr, maskWidth, maskHeight, - maskColorMap POPPLER_MASK_INTERPOLATE_ARG); -} -void FullBitmapOutputDev::drawForm(Ref id) -{ - msg(" drawForm"); - rgbdev->drawForm(id); -} - -void FullBitmapOutputDev::processLink(Link *link, Catalog *catalog) -{ - msg(" processLink"); - gfxdev->processLink(link, catalog); -} - -void FullBitmapOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool forSoftMask) -{ - msg(" beginTransparencyGroup"); - rgbdev->beginTransparencyGroup(state, bbox, blendingColorSpace, isolated, knockout, forSoftMask); -} -void FullBitmapOutputDev::endTransparencyGroup(GfxState *state) -{ - msg(" endTransparencyGroup"); - rgbdev->endTransparencyGroup(state); -} -void FullBitmapOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) -{ - msg(" paintTransparencyGroup"); - rgbdev->paintTransparencyGroup(state,bbox); -} -void FullBitmapOutputDev::setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor) -{ - msg(" setSoftMask"); - rgbdev->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); -} -void FullBitmapOutputDev::clearSoftMask(GfxState *state) -{ - msg(" clearSoftMask"); - rgbdev->clearSoftMask(state); -} - - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.h deleted file mode 100644 index d9eb5435e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/FullBitmapOutputDev.h +++ /dev/null @@ -1,187 +0,0 @@ -/* FullBitmapOutputDev.cc - Output device which creates a bitmap. - - This file is part of swftools. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __FullBitmapOutputDev_h__ -#define __FullBitmapOutputDev_h__ - -#include "../gfxdevice.h" -#include "../gfxsource.h" -#include "../gfxtools.h" - -#include "../../config.h" -#include "CharOutputDev.h" -#include "InfoOutputDev.h" -#include "PDFDoc.h" -#include "CommonOutputDev.h" - -#define STATE_PARALLEL 0 -#define STATE_TEXT_IS_ABOVE 1 -#define STATE_BITMAP_IS_ABOVE 2 - -class FullBitmapOutputDev: public CommonOutputDev { -public: - FullBitmapOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); - virtual ~FullBitmapOutputDev(); - - // CommonOutputDev: - virtual void setDevice(gfxdevice_t*dev); - virtual void setParameter(const char*key, const char*value); - - // OutputDev: - virtual GBool upsideDown(); - virtual GBool useDrawChar(); - virtual GBool useTilingPatternFill(); - virtual GBool useShadedFills(); - virtual GBool useDrawForm(); - virtual GBool interpretType3Chars(); - virtual GBool needNonText(); - virtual void setDefaultCTM(double *ctm); - virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL); - - virtual void beginPage(GfxState *state, int pageNum); - virtual void endPage(); - - virtual void saveState(GfxState *state); - virtual void restoreState(GfxState *state); - - virtual void updateAll(GfxState *state); - virtual void updateCTM(GfxState *state, double m11, double m12, double m21, double m22, double m31, double m32); - virtual void updateLineDash(GfxState *state); - virtual void updateFlatness(GfxState *state); - virtual void updateLineJoin(GfxState *state); - virtual void updateLineCap(GfxState *state); - virtual void updateMiterLimit(GfxState *state); - virtual void updateLineWidth(GfxState *state); - virtual void updateStrokeAdjust(GfxState *state); - virtual void updateFillColorSpace(GfxState *state); - virtual void updateStrokeColorSpace(GfxState *state); - virtual void updateFillColor(GfxState *state); - virtual void updateStrokeColor(GfxState *state); - virtual void updateBlendMode(GfxState *state); - virtual void updateFillOpacity(GfxState *state); - virtual void updateStrokeOpacity(GfxState *state); - virtual void updateFillOverprint(GfxState *state); - virtual void updateStrokeOverprint(GfxState *state); - virtual void updateTransfer(GfxState *state); - virtual void updateFont(GfxState *state); - virtual void updateTextMat(GfxState *state); - virtual void updateCharSpace(GfxState *state); - virtual void updateRender(GfxState *state); - virtual void updateRise(GfxState *state); - virtual void updateWordSpace(GfxState *state); - virtual void updateHorizScaling(GfxState *state); - virtual void updateTextPos(GfxState *state); - virtual void updateTextShift(GfxState *state, double shift); - - virtual void stroke(GfxState *state); - virtual void fill(GfxState *state); - virtual void eoFill(GfxState *state); - virtual POPPLER_TILING_PATERN_RETURN tilingPatternFill(GfxState *state, - POPPLER_TILING_PATERN_GFX Object *str, - int paintType, Dict *resDict, - double *mat, double *bbox, - int x0, int y0, int x1, int y1, - double xStep, double yStep); - - virtual GBool functionShadedFill(GfxState *state, - GfxFunctionShading *shading); - virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading POPPLER_RAXIAL_MIN_MAX); - virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading POPPLER_RAXIAL_MIN_MAX); - - virtual void clip(GfxState *state); - virtual void eoClip(GfxState *state); - virtual void clipToStrokePath(GfxState *state); - - virtual void beginStringOp(GfxState *state); - virtual void endStringOp(GfxState *state); - virtual void beginString(GfxState *state, GString *s); - virtual void endString(GfxState *state); - virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen); - virtual void drawString(GfxState *state, GString *s); - virtual GBool beginType3Char(GfxState *state, double x, double y, - double dx, double dy, - CharCode code, Unicode *u, int uLen); - virtual void endType3Char(GfxState *state); - virtual void endTextObject(GfxState *state); - - virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - POPPLER_INTERPOLATE - GBool inlineImg); - virtual void drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - int *maskColors, GBool inlineImg); - virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, int maskWidth, int maskHeight, - GBool maskInvert - POPPLER_MASK_INTERPOLATE); - virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap - POPPLER_MASK_INTERPOLATE); - - virtual void type3D0(GfxState *state, double wx, double wy); - virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); - - virtual void drawForm(Ref id); - - virtual void beginTransparencyGroup(GfxState *state, double *bbox, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool forSoftMask); - virtual void endTransparencyGroup(GfxState *state); - virtual void paintTransparencyGroup(GfxState *state, double *bbox); - virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor); - virtual void clearSoftMask(GfxState *state); - - virtual void processLink(Link *link, Catalog *catalog); - - virtual void setVectorAntialias(GBool vaa); - virtual GBool getVectorAntialias(); - - -private: - void flushBitmap(); - char config_extrafontdata; - SplashOutputDev*rgbdev; - - CharOutputDev*gfxdev; - gfxdevice_t*dev; -}; - -#endif - - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.cc deleted file mode 100644 index 53ffc75cf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.cc +++ /dev/null @@ -1,965 +0,0 @@ -#include "../../config.h" -#include "Object.h" -#include "InfoOutputDev.h" -#include "SplashOutputDev.h" -#include "GfxState.h" -#include "CommonOutputDev.h" -#include "../log.h" -#include "../types.h" -#include "../q.h" -#include "../gfxdevice.h" -#include "../gfxfont.h" -#include -#include - -int config_unique_unicode = 1; -int config_poly2bitmap_pass1 = 0; -int config_skewedtobitmap_pass1 = 0; -int config_addspace = 1; -int config_fontquality = 10; -int config_bigchar = 0; -int config_marker_glyph = 0; -int config_normalize_fonts = 0; -int config_remove_font_transforms = 0; -int config_remove_invisible_outlines = 0; - -static void* fontclass_clone(const void*_m) { - if(_m==0) - return 0; - const fontclass_t*m1=(const fontclass_t*)_m; - fontclass_t*m2 = (fontclass_t*)malloc(sizeof(fontclass_t)); - *m2 = *m1; - m2->id = strdup(m1->id); - return m2; -} -static unsigned int fontclass_hash(const void*_m) { - if(!_m) - return 0; - const fontclass_t*m = (fontclass_t*)_m; - unsigned int h=0; - if(config_remove_font_transforms) { - U32 m00 = (*(U32*)&m->m00)&0xfff00000; - U32 m01 = (*(U32*)&m->m01)&0xfff00000; - U32 m10 = (*(U32*)&m->m10)&0xfff00000; - U32 m11 = (*(U32*)&m->m11)&0xfff00000; - h = crc32_add_bytes(h, (char*)&m00, sizeof(m00)); - h = crc32_add_bytes(h, (char*)&m01, sizeof(m01)); - h = crc32_add_bytes(h, (char*)&m10, sizeof(m10)); - h = crc32_add_bytes(h, (char*)&m11, sizeof(m11)); - } - if(config_remove_invisible_outlines) { - h = crc32_add_bytes(h, (char*)&m->alpha, 1); - } - return crc32_add_string(h, m->id); -} -static void fontclass_destroy(void*_m) { - fontclass_t*m = (fontclass_t*)_m; - free(m->id);m->id=0; - free(m); -} -static char fontclass_equals(const void*_m1, const void*_m2) { - const fontclass_t*m1=(const fontclass_t*)_m1; - const fontclass_t*m2=(const fontclass_t*)_m2; - if(!m1 || !m2) - return m1==m2; - - if(config_remove_font_transforms) { - /* we do a binary comparison of the float32 - bits here instead of a numerical comparison - to prevent the compiler from e.g. removing the - (float) cast during optimization, which would break - the equivalence between equals() and hash() (as - the hash is derived from the float32 values) */ - if(((*(U32*)&m1->m00 ^ *(U32*)&m2->m00)&0xfff00000) || - ((*(U32*)&m1->m01 ^ *(U32*)&m2->m01)&0xfff00000) || - ((*(U32*)&m1->m10 ^ *(U32*)&m2->m10)&0xfff00000) || - ((*(U32*)&m1->m11 ^ *(U32*)&m2->m11)&0xfff00000)) - return 0; - } - if(config_remove_invisible_outlines) { - if(m1->alpha != m2->alpha) - return 0; - } - return !strcmp(m1->id, m2->id); -} - -static type_t fontclass_type = { - fontclass_equals, - fontclass_hash, - fontclass_clone, - fontclass_destroy -}; - -InfoOutputDev::InfoOutputDev(XRef*xref) -{ - num_links = 0; - num_jpeg_images = 0; - num_ppm_images = 0; - num_chars = 0; - num_fonts = 0; - num_polygons= 0; - num_layers = 0; - num_text_breaks = 0; - currentglyph = 0; - previous_was_char = 0; - SplashColor white = {255,255,255}; - splash = new SplashOutputDev(splashModeRGB8,320,0,white,0,0); - splash->startDoc(xref); - last_font = 0; - current_type3_font = 0; - fontcache = dict_new2(&fontclass_type); -} -InfoOutputDev::~InfoOutputDev() -{ - GHashIter*i; - - DICT_ITERATE_DATA(this->fontcache, FontInfo*, fd) { - delete fd; - } - dict_destroy(this->fontcache);this->fontcache=0; - - delete splash;splash=0; -} - -void FontInfo::grow(int size) -{ - if(size >= this->num_glyphs) { - this->glyphs = (GlyphInfo**)realloc(this->glyphs, sizeof(GlyphInfo*)*(size)); - memset(&this->glyphs[this->num_glyphs], 0, sizeof(SplashPath*)*((size)-this->num_glyphs)); - this->num_glyphs = size; - } -} -FontInfo::FontInfo(fontclass_t*fontclass) -{ - if(config_remove_font_transforms) { - char buf[128]; - static int counter=1; - sprintf(buf, "font%d", counter++); - this->id = strdup(buf); - } else { - this->id = strdup(fontclass->id); - } - - this->fontclass = (fontclass_t*)fontclass_type.dup(fontclass); - this->seen = 0; - this->num_glyphs = 0; - this->glyphs = 0; - this->gfxfont = 0; - this->space_char = -1; - this->ascender = 0; - this->descender = 0; - this->scale = 1.0; - resetPositioning(); -} -FontInfo::~FontInfo() -{ - if(this->id) {free(this->id);this->id=0;} - this->font = 0; - int t; - for(t=0;tpath;glyphs[t]->path = 0; - delete glyphs[t]; - glyphs[t]=0; - } - } - free(glyphs);glyphs=0; - if(this->gfxfont) - gfxfont_free(this->gfxfont); - - if(this->fontclass) { - fontclass_type.free(this->fontclass); - this->fontclass=0; - } -} - -void FontInfo::resetPositioning() -{ - this->lastchar = -1; - this->lastx = 0; - this->lasty = 0; - this->lastadvance = 0; -} - -static int findSpace(gfxfont_t*font) -{ - int first_space = -1; - int t; - for(t=0;tnum_glyphs;t++) { - gfxglyph_t*g = &font->glyphs[t]; - if(GLYPH_IS_SPACE(g)) { - if(g->unicode == 32) { - /* now that we have found a space char, make sure it's unique */ - int s; - for(s=0;snum_glyphs;s++) { - if(s!=t && font->glyphs[s].unicode==32) - font->glyphs[s].unicode=0; - } - return t; - } - } - } - return -1; -} - -static int addSpace(gfxfont_t*font) -{ - /* first, make sure the new space char is the only char that'll use unicode 32 */ - int t; - for(t=0;tnum_glyphs;t++) { - if(font->glyphs[t].unicode==32) - font->glyphs[t].unicode=0; - } - // createGfxFont reserves space for up to two extra characters, so we don't need to realloc. - int space_glyph = font->num_glyphs++; - gfxglyph_t*g = &font->glyphs[space_glyph]; - memset(g, 0, sizeof(*g)); - g->unicode = 32; - g->advance = fabs(font->ascent + font->descent) / 5.0; - if(font->max_unicode > 32) - font->unicode2glyph[32] = space_glyph; -#if 0 - g->line = gfxline_makerectangle(0, -font->ascent, g->advance, font->descent); -#endif - return space_glyph; -} - -static void transform_glyph(gfxglyph_t*g, fontclass_t*mm, double scale) -{ - gfxmatrix_t m; - m.m00 = mm->m00 * scale; - m.m01 = mm->m01 * scale; - m.m10 = mm->m10 * scale; - m.m11 = mm->m11 * scale; - m.tx = 0; - m.ty = 0; - if(m.m00>0) - g->advance *= m.m00; - g->line = gfxline_clone(g->line); - gfxline_transform(g->line, &m); -} - -void gfxfont_transform(gfxfont_t*font, gfxmatrix_t*m) -{ - int t; - for(t=0;tnum_glyphs;t++) { - gfxglyph_t*g = &font->glyphs[t]; - gfxline_t*line = g->line; - gfxline_transform(line, m); - if(m->m00>0) - g->advance *= m->m00; - } -} - -gfxbbox_t gfxfont_bbox(gfxfont_t*font) -{ - gfxbbox_t tmp = {0,0,0,0}; - int t; - for(t=0;tnum_glyphs;t++) { - gfxline_t*line = font->glyphs[t].line; - gfxbbox_t b = gfxline_getbbox(line); - tmp = gfxbbox_expand_to_bbox(tmp, b); - } - return tmp; -} - -gfxfont_t* FontInfo::createGfxFont() -{ - gfxfont_t*font = (gfxfont_t*)rfx_calloc(sizeof(gfxfont_t)); - - font->glyphs = (gfxglyph_t*)malloc(sizeof(gfxglyph_t)*(this->num_glyphs+2)); - memset(font->glyphs, 0, sizeof(gfxglyph_t)*this->num_glyphs); - font->id = 0; - int t; - - double quality = (INTERNAL_FONT_SIZE * 200 / config_fontquality) / this->max_size; - //printf("%d glyphs\n", font->num_glyphs); - font->num_glyphs = 0; - font->ascent = fabs(this->ascender); - font->descent = fabs(this->descender); - - for(t=0;tnum_glyphs;t++) { - if(this->glyphs[t]) { - SplashPath*path = this->glyphs[t]->path; - int len = path?path->getLength():0; - //printf("glyph %d) %08x (%d line segments)\n", t, path, len); - gfxglyph_t*glyph = &font->glyphs[font->num_glyphs]; - this->glyphs[t]->glyphid = font->num_glyphs; - glyph->unicode = this->glyphs[t]->unicode; - gfxdrawer_t drawer; - gfxdrawer_target_gfxline(&drawer); - int s; - int count = 0; - double xmax = 0; - for(s=0;sgetPoint(s, &x, &y, &f); - if(!s || x > xmax) - xmax = x; - if(f&splashPathFirst) { - drawer.moveTo(&drawer, x, y); - } - if(f&splashPathCurve) { - double x2,y2; - path->getPoint(++s, &x2, &y2, &f); - if(f&splashPathCurve) { - double x3,y3; - path->getPoint(++s, &x3, &y3, &f); - gfxdraw_cubicTo(&drawer, x, y, x2, y2, x3, y3, quality); - } else { - drawer.splineTo(&drawer, x, y, x2, y2); - } - } else { - drawer.lineTo(&drawer, x, y); - } - // printf("%f %f %s %s\n", x, y, (f&splashPathCurve)?"curve":"", - // (f&splashPathFirst)?"first":"", - // (f&splashPathLast)?"last":""); - } - - glyph->line = (gfxline_t*)drawer.result(&drawer); - if(this->glyphs[t]->advance>0) { - glyph->advance = this->glyphs[t]->advance; - } else { - glyph->advance = fmax(xmax, 0); - } - if(config_bigchar) { - double max = this->glyphs[t]->advance_max; - if(max>0 && max > glyph->advance) { - glyph->advance = max; - } - } - - font->num_glyphs++; - } - } - - if(config_remove_font_transforms) { - gfxmatrix_t glyph_transform; - glyph_transform.m00 = fontclass->m00; - glyph_transform.m01 = fontclass->m01; - glyph_transform.m10 = fontclass->m10; - glyph_transform.m11 = fontclass->m11; - glyph_transform.tx = 0; - glyph_transform.ty = 0; - /* apply the font transformation to the font */ - gfxfont_transform(font, &glyph_transform); - - gfxbbox_t total = gfxfont_bbox(font); - font->ascent = total.ymax; - font->descent = -total.ymin; - } - - if(config_normalize_fonts) { - /* make all chars 1024 high */ - gfxbbox_t bbox = gfxfont_bbox(font); - double height = bbox.ymax - bbox.ymin; - double scale = 1.0; - if(height>1e-5) { - scale = 1024.0 / height; - } - this->scale = 1.0 / scale; - gfxmatrix_t scale_matrix = {scale,0,0, - 0,scale,0}; - gfxfont_transform(font, &scale_matrix); - font->ascent *= scale; - font->descent *= scale; - } - - if(config_remove_invisible_outlines) { - /* for OCR docs: remove the outlines of characters that are only - ever displayed with alpha=0 */ - if(!fontclass->alpha) { - for(t=0;tnum_glyphs;t++) { - gfxglyph_t*g = &font->glyphs[t]; - gfxline_t*line = font->glyphs[t].line; - gfxline_free(g->line); - g->line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); - g->line->type = gfx_moveTo; - g->line->x = g->advance; - } - } - } - - return font; -} - -static float find_average_glyph_advance(gfxfont_t*f) -{ - if(!f->num_glyphs) - return 0.0; - - float*values = (float*)malloc(sizeof(float)*f->num_glyphs); - int t; - for(t=0;tnum_glyphs;t++) { - values[t] = f->glyphs[t].advance; - } - float m = medianf(values, f->num_glyphs); - free(values); - return m; -} - -gfxfont_t* FontInfo::getGfxFont() -{ - if(!this->gfxfont) { - this->gfxfont = this->createGfxFont(); - this->gfxfont->id = strdup(this->id); - this->space_char = findSpace(this->gfxfont); - this->average_advance = find_average_glyph_advance(this->gfxfont); - - if(this->space_char>=0) { - msg(" Font %s has space char %d (unicode=%d)", - this->id, this->space_char, - this->gfxfont->glyphs[this->space_char].unicode); - } else if(config_addspace) { - this->space_char = addSpace(this->gfxfont); - msg(" Appending space char to font %s, position %d, width %f", this->gfxfont->id, this->space_char, this->gfxfont->glyphs[this->space_char].advance); - } - gfxfont_fix_unicode(this->gfxfont, config_unique_unicode); - - /* optionally append a marker glyph */ - if(config_marker_glyph) { - msg(" Appending marker char to font %s, position %d, unicode %d", this->gfxfont->id, this->gfxfont->num_glyphs, config_marker_glyph); - gfxglyph_t*g = &this->gfxfont->glyphs[this->gfxfont->num_glyphs++]; - g->name = 0; - g->unicode = config_marker_glyph; - g->advance = 2048; - g->line = (gfxline_t*)rfx_calloc(sizeof(gfxline_t)); - g->line->type = gfx_moveTo; - g->line->x = g->advance; - } - } - return this->gfxfont; -} - -GBool InfoOutputDev::upsideDown() {return gTrue;} -GBool InfoOutputDev::useDrawChar() {return gTrue;} -GBool InfoOutputDev::interpretType3Chars() {return gTrue;} -GBool InfoOutputDev::useTilingPatternFill() {return gFalse;} - -GBool InfoOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data), - void *abortCheckCbkData) -{ - this->page = page; - return gTrue; -} - -void InfoOutputDev::startPage(int pageNum, GfxState *state) -{ - PDFRectangle *r = this->page->getCropBox(); - double x1,y1,x2,y2; - state->transform(r->x1,r->y1,&x1,&y1); - state->transform(r->x2,r->y2,&x2,&y2); - if(x2x1 = (int)x1; - this->y1 = (int)y1; - this->x2 = (int)x2; - this->y2 = (int)y2; - msg(" Generating info structure for page %d", pageNum); - num_links = 0; - num_jpeg_images = 0; - num_ppm_images = 0; - num_chars = 0; - num_fonts = 0; - num_polygons= 0; - num_layers = 0; - average_char_size = 0; -} -void InfoOutputDev::endPage() -{ - if(num_chars) - average_char_size /= num_chars; -} -void InfoOutputDev::drawLink(Link *link, Catalog *catalog) -{ - num_links++; -} - -/* } else if(!strcmp(key,"fontquality")) { - this->config_fontquality = atof(value); - if(this->config_fontquality<=1) - this->config_fontquality=1; - } else if(!strcmp(key,"bigchar")) { - this->config_bigchar = atoi(value); - } - */ - -char*getFontID(GfxFont*font) -{ - Ref*ref = font->getID(); - GString*gstr = font->getName(); - char* fname = gstr==0?0:gstr->getCString(); - char buf[128]; - if(fname==0) { - if(font->getType() == fontType3) { - sprintf(buf, "t3font-%d-%d", ref->num, ref->gen); - } else { - sprintf(buf, "font-%d-%d", ref->num, ref->gen); - } - } else { - sprintf(buf, "%s-%d-%d", fname, ref->num, ref->gen); - } - return strdup(buf); -} - -gfxmatrix_t gfxmatrix_from_state(GfxState*state) -{ - double* ctm = state->getCTM(); - double fontSize = state->getFontSize(); - double*textMat = state->getTextMat(); - - /* taking the absolute value of horizScaling seems to be required for - some italic fonts. FIXME: SplashOutputDev doesn't need this- why? */ - double hscale = fabs(state->getHorizScaling()); - - // from xpdf-3.02/SplashOutputDev:updateFont - double mm11 = textMat[0] * fontSize * hscale; - double mm12 = textMat[1] * fontSize * hscale; - double mm21 = textMat[2] * fontSize; - double mm22 = textMat[3] * fontSize; - - // multiply with ctm, like state->getFontTransMat() does - gfxmatrix_t m; - m.m00 = (ctm[0]*mm11 + ctm[2]*mm12) / INTERNAL_FONT_SIZE; - m.m01 = (ctm[1]*mm11 + ctm[3]*mm12) / INTERNAL_FONT_SIZE; - m.m10 = (ctm[0]*mm21 + ctm[2]*mm22) / INTERNAL_FONT_SIZE; - m.m11 = (ctm[1]*mm21 + ctm[3]*mm22) / INTERNAL_FONT_SIZE; - m.tx = 0; - m.ty = 0; - return m; -} - -void InfoOutputDev::updateTextMat(GfxState*state) -{ -} - -GBool InfoOutputDev::needNonText() -{ - /* this switches off certain expensive operations, like - pattern fill and forms */ - return gFalse; -} - -void InfoOutputDev::updateFont(GfxState *state) -{ - GfxFont*font = state->getFont(); - if(!font) { - current_splash_font = 0; - return; - } - if(font->getType() == fontType3) { - current_splash_font = 0; - return; - } - GfxState* state2 = state->copy(); - state2->setPath(0); - state2->setCTM(1.0,0,0,1.0,0,0); - splash->updateCTM(state2, 0,0,0,0,0,0); - state2->setTextMat(1.0,0,0,1.0,0,0); - state2->setFont(font, 1024.0); - splash->doUpdateFont(state2); - - current_splash_font = splash->getCurrentFont(); - delete state2; -} - -double matrix_scale_factor(gfxmatrix_t*m) -{ - double l1 = sqrt(m->m00 * m->m00 + m->m01 * m->m01); - double l2 = sqrt(m->m10 * m->m10 + m->m11 * m->m11); - return (l1+l2)/2.0; -} - -#ifdef __GNUC__ -int __attribute__((noinline)) - font_classify(fontclass_t*out, gfxmatrix_t*in, const char*id, gfxcolor_t* color) -#else -int font_classify(fontclass_t*out, gfxmatrix_t*in, const char*id, gfxcolor_t* color) -#endif -{ - out->id = (char*)id; - - if(!config_remove_font_transforms) { - out->m00 = 1.0; - out->m11 = 1.0; - out->m01 = 0.0; - out->m10 = 0.0; - } else { - double l = matrix_scale_factor(in); - if(l < 1e-10) { - /* treat all singularity characters the same */ - memset(out, 0, sizeof(*out)); - l = 0; - } else { - out->m00 = in->m00 / l; - out->m10 = in->m10 / l; - out->m01 = -in->m01 / l; - out->m11 = -in->m11 / l; - } - - if(!color->a) { - /* for invisible characters, transforms don't need to be that - precise- use only 3 bits precision for mantissa. */ - - /* 0x80000000 //sign - 0x78000000 //exponent - 0x07ffffff //mantissa */ - *(U32*)&out->m00 = (*(U32*)&out->m00)&0xffe00000; - *(U32*)&out->m01 = (*(U32*)&out->m01)&0xffe00000; - *(U32*)&out->m10 = (*(U32*)&out->m10)&0xffe00000; - *(U32*)&out->m11 = (*(U32*)&out->m11)&0xffe00000; - } - } - out->alpha = color->a?1:0; - - return 1; -} - -void fontclass_print(fontclass_t*cls) -{ - printf("[%f %f %f %f] %s alpha=%d\n", - cls->m00, cls->m01, cls->m10, cls->m11, - cls->id, - cls->alpha - ); -} - -gfxcolor_t gfxstate_getfontcolor(GfxState*state) -{ - /* FIXME: instead of duplicating BitmapOutputDev's and VectorOutputDev's transparent - character logic here, we should move this code to CommonOutputDev and - call it from all three places */ - - gfxcolor_t col = gfxstate_getfillcolor(state); - /* HACK: if skewedtobitmap is on, weirdly rotated characters will - be drawn transparently in BitmapOutputDev. In order to anticipate this, - we duplicate the logic here */ - if(config_remove_invisible_outlines && - config_skewedtobitmap_pass1 && - text_matrix_is_skewed(state)) { - col.a = 0; - } - if(state->getRender() == RENDER_INVISIBLE) { - col.a = 0; - } - if(config_poly2bitmap_pass1 && (state->getRender()&3)) { - /* with poly2bitmap, stroke or stroke+fill characters are drawn - to the bitmap and potentially overlaid with a transparent character. - duplicate that logic here. */ - col.a = 0; - } - return col; -} - -static inline fontclass_t fontclass_from_state(GfxState*state) -{ - fontclass_t cls; - gfxcolor_t col = gfxstate_getfontcolor(state); - char*id = getFontID(state->getFont()); - gfxmatrix_t m = gfxmatrix_from_state(state); - font_classify(&cls, &m, id, &col); - return cls; -} -static inline void fontclass_clear(fontclass_t*cls) -{ - free(cls->id);cls->id=0; -} - -FontInfo* InfoOutputDev::getOrCreateFontInfo(GfxState*state) -{ - GfxFont*font = state->getFont(); - fontclass_t fontclass = fontclass_from_state(state); - - FontInfo* fontinfo = (FontInfo*)dict_lookup(this->fontcache, &fontclass); - if(!fontinfo) { - fontinfo = new FontInfo(&fontclass); - dict_put(this->fontcache, &fontclass, fontinfo); - fontinfo->font = font; - fontinfo->max_size = 0; - if(current_splash_font) { - fontinfo->ascender = current_splash_font->ascender; - fontinfo->descender = current_splash_font->descender; - } else { - fontinfo->ascender = fontinfo->descender = 0; - } - num_fonts++; - } - - if(last_font && fontinfo!=last_font) { - last_font->resetPositioning(); - } - - this->last_font = fontinfo; - fontclass_clear(&fontclass); - return fontinfo; -} - -FontInfo* InfoOutputDev::getFontInfo(GfxState*state) -{ - fontclass_t fontclass = fontclass_from_state(state); - FontInfo*result = (FontInfo*)dict_lookup(this->fontcache, &fontclass); - if(!result) { - printf("NOT FOUND: "); - fontclass_print(&fontclass); - } - fontclass_clear(&fontclass); - return result; -} - -gfxmatrix_t FontInfo::get_gfxmatrix(GfxState*state) -{ - gfxmatrix_t m = gfxmatrix_from_state(state); - if(!config_remove_font_transforms) { - return m; - } else { - double scale = matrix_scale_factor(&m) * this->scale; - gfxmatrix_t m = {scale, 0, 0, - 0, -scale, 0}; - return m; - } -} - -void InfoOutputDev::drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen) -{ - double m11,m21,m12,m22; - state->getFontTransMat(&m11, &m12, &m21, &m22); - m11 *= state->getHorizScaling(); - m21 *= state->getHorizScaling(); - double lenx = sqrt(m11*m11 + m12*m12); - double leny = sqrt(m21*m21 + m22*m22); - double len = lenx>leny?lenx:leny; - - FontInfo*fontinfo = getOrCreateFontInfo(state); - - if(!fontinfo) { - msg(" Internal error: No fontinfo for font"); - return; //error - } - if(!current_splash_font) { - msg(" Internal error: No current splash fontinfo"); - return; //error - } - if(fontinfo && fontinfo->max_size < len) { - fontinfo->max_size = len; - } - - average_char_size += fmax(lenx,leny); - num_chars++; - - if(!previous_was_char) - num_layers++; - previous_was_char=1; - - fontinfo->grow(code+1); - GlyphInfo*g = fontinfo->glyphs[code]; - if(!g) { - g = fontinfo->glyphs[code] = new GlyphInfo(); - g->advance_max = 0; - current_splash_font->last_advance = -1; - g->path = current_splash_font->getGlyphPath(code); - g->advance = current_splash_font->last_advance; - g->unicode = 0; - } - if(uLen && ((u[0]>=32 && u[0]unicode) || !g->unicode)) { - g->unicode = u[0]; - } - if(fontinfo->lastchar>=0 && fontinfo->lasty == y) { - double xshift = (x - fontinfo->lastx); - if(xshift>=0 && xshift > g->advance_max) { - g->advance_max = xshift; - } - } else { - num_text_breaks++; - } - - fontinfo->lastx = x; - fontinfo->lasty = y; - fontinfo->lastchar = code; - fontinfo->lastadvance = g->advance; -} - -static char path_is_rectangular(GfxState* state) -{ - GfxPath * path = state->getPath(); - int num = path->getNumSubpaths(); - if(num!=1) return 0; - GfxSubpath*subpath = path->getSubpath(0); - int subnum = path->getSubpath(0)->getNumPoints(); - - if(subnum>5) return 0; - int s; - for(s=1;sgetCurve(s)) - return 0; - if(subpath->getX(s) != subpath->getX(s-1) && - subpath->getY(s) != subpath->getY(s-1)) { - return 0; - } - } - return 1; -} - -void InfoOutputDev::fill(GfxState *state) -{ - if(!path_is_rectangular(state)) - previous_was_char=0; - num_polygons++; -} - -void InfoOutputDev::eoFill(GfxState *state) -{ - if(!path_is_rectangular(state)) - previous_was_char=0; - num_polygons++; -} - -GBool InfoOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen) -{ - GfxFont*font = state->getFont(); - if(!font) - return gTrue; - if(font->getType() != fontType3) - return gTrue; - - current_splash_font = 0; - - fontclass_t fontclass = fontclass_from_state(state); - FontInfo* fontinfo = (FontInfo*)dict_lookup(this->fontcache, &fontclass); - if(!fontinfo) { - fontinfo = new FontInfo(&fontclass); - dict_put(this->fontcache, &fontclass, fontinfo); - fontinfo->font = font; - fontinfo->max_size = 0; - num_fonts++; - } - fontclass_clear(&fontclass); - - current_type3_font = fontinfo; - fontinfo->grow(code+1); - if(!fontinfo->glyphs[code]) { - currentglyph = fontinfo->glyphs[code] = new GlyphInfo(); - currentglyph->unicode = uLen?u[0]:0; - currentglyph->path = new SplashPath(); - currentglyph->x1=0; - currentglyph->y1=0; - currentglyph->x2=dx; - currentglyph->y2=dy; - currentglyph->advance=dx; - return gFalse; - } else { - return gTrue; - } -} - -void InfoOutputDev::type3D0(GfxState *state, double wx, double wy) -{ - currentglyph->x1=0; - currentglyph->y1=0; - currentglyph->x2=wx; - currentglyph->y2=wy; -} - -void InfoOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) -{ - if(-lly>current_type3_font->descender) - current_type3_font->descender = -lly; - if(ury>current_type3_font->ascender) - current_type3_font->ascender = ury; - - currentglyph->x1=llx; - currentglyph->y1=lly; - currentglyph->x2=urx; - currentglyph->y2=ury; -} - -void InfoOutputDev::endType3Char(GfxState *state) -{ - double x1 = currentglyph->x1; - double y1 = currentglyph->y1; - double x2 = currentglyph->x2; - double y2 = currentglyph->y2; - currentglyph->path->moveTo(x1,y1); - currentglyph->path->lineTo(x2,y1); - currentglyph->path->lineTo(x2,y2); - currentglyph->path->lineTo(x1,y2); - currentglyph->path->close(); -} - -void InfoOutputDev::saveState(GfxState *state) -{ - updateAll(state); -} - -void InfoOutputDev::restoreState(GfxState *state) -{ - updateAll(state); -} - -void InfoOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - POPPLER_INTERPOLATE - GBool inlineImg) -{ - previous_was_char=0; - if(str->getKind()==strDCT) num_jpeg_images++; else num_ppm_images++; - - OutputDev::drawImageMask(state,ref,str,width,height,invert, POPPLER_INTERPOLATE_ARG inlineImg); -} -void InfoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - int *maskColors, GBool inlineImg) -{ - previous_was_char=0; - if(str->getKind()==strDCT) num_jpeg_images++; else num_ppm_images++; - - OutputDev::drawImage(state,ref,str,width,height,colorMap, POPPLER_INTERPOLATE_ARG maskColors,inlineImg); -} -void InfoOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, - int maskWidth, int maskHeight, - GBool maskInvert - POPPLER_MASK_INTERPOLATE) -{ - previous_was_char=0; - if(str->getKind()==strDCT) num_jpeg_images++; else num_ppm_images++; - - OutputDev::drawMaskedImage(state,ref,str,width,height,colorMap, POPPLER_INTERPOLATE_ARG maskStr,maskWidth,maskHeight,maskInvert POPPLER_MASK_INTERPOLATE_ARG); -} - -void InfoOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap - POPPLER_MASK_INTERPOLATE) -{ - previous_was_char=0; - if(str->getKind()==strDCT) num_jpeg_images++; else num_ppm_images++; - - OutputDev::drawSoftMaskedImage(state,ref,str,width,height,colorMap, POPPLER_INTERPOLATE_ARG maskStr,maskWidth,maskHeight,maskColorMap POPPLER_MASK_INTERPOLATE_ARG); -} - -void InfoOutputDev::dumpfonts(gfxdevice_t*dev) -{ - GHashIter*i; - GString*key; - - DICT_ITERATE_DATA(fontcache, FontInfo*, info) { - dev->addfont(dev, info->getGfxFont()); - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.h deleted file mode 100644 index 870e6bc87..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/InfoOutputDev.h +++ /dev/null @@ -1,203 +0,0 @@ -/* InfoOutputDev.h - A special output device which collects information about a PDF file, - like fonts, Type3 glyphs and so on. - - This file is part of swftools. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __infooutputdev_h__ -#define __infooutputdev_h__ - -#include "popplercompat.h" -#include "GfxFont.h" -#include "OutputDev.h" -#include "SplashOutputDev.h" -#include "Page.h" - -#ifdef HAVE_POPPLER - #include - #include - #include - #include -#else - #include "xpdf/config.h" - #include "SplashTypes.h" - #include "SplashPath.h" - #include "SplashFont.h" - #include "SplashFontFile.h" -#endif - -#ifdef HAVE_POPPLER -#include -#else -#include "GHash.h" -#endif -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../gfxfont.h" -#include "../q.h" - -#define INTERNAL_FONT_SIZE 1024.0 -#define GLYPH_IS_SPACE(g) ((!(g)->line || ((g)->line->type==gfx_moveTo && !(g)->line->next)) && (g)->advance) - -struct GlyphInfo -{ - SplashPath*path; - int unicode; - int glyphid; - double advance; - double x1,y1,x2,y2; - - double advance_max; -}; - -typedef struct _fontclass { - float m00,m01,m10,m11; - char*id; - unsigned char alpha; -} fontclass_t; - -class FontInfo -{ - gfxfont_t*gfxfont; - - char*id; - double scale; - - gfxfont_t* createGfxFont(); -public: - fontclass_t*fontclass; - FontInfo(fontclass_t*fontclass); - ~FontInfo(); - - gfxmatrix_t get_gfxmatrix(GfxState*state); - gfxfont_t* getGfxFont(); - - double lastx,lasty; - int lastchar; - double lastadvance; - - double ascender,descender; - - void grow(int size); - void resetPositioning(); - - GfxFont*font; - double max_size; - int num_glyphs; - GlyphInfo**glyphs; - - char seen; - int space_char; - float average_advance; -}; - -extern char*getFontID(GfxFont*font); -extern gfxmatrix_t gfxmatrix_from_state(GfxState*state); - -class InfoOutputDev: public OutputDev -{ - GlyphInfo* currentglyph; - SplashOutputDev*splash; - char previous_was_char; - Page *page; - - dict_t*fontcache; - FontInfo*last_font; - FontInfo*current_type3_font; - SplashFont*current_splash_font; - - public: - int x1,y1,x2,y2; - int num_links; - int num_ppm_images; - int num_jpeg_images; - int num_fonts; - int num_polygons; - int num_chars; - int num_layers; - int num_text_breaks; - double average_char_size; - - void dumpfonts(gfxdevice_t*dev); - FontInfo* getFontInfo(GfxState*state); - - InfoOutputDev(XRef*xref); - virtual ~InfoOutputDev(); - virtual GBool useTilingPatternFill(); - virtual GBool upsideDown(); - virtual GBool needNonText(); - virtual GBool useDrawChar(); - virtual GBool interpretType3Chars(); - virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL); - virtual void startPage(int pageNum, GfxState *state); - virtual void endPage(); - virtual void drawLink(Link *link, Catalog *catalog); - virtual void updateFont(GfxState *state); - - virtual void saveState(GfxState *state); - virtual void restoreState(GfxState *state); - - virtual GBool beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen); - virtual void type3D0(GfxState *state, double wx, double wy); - virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); - virtual void endType3Char(GfxState *state); - - virtual void fill(GfxState *state); - virtual void eoFill(GfxState *state); - - virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen); - - virtual void updateTextMat(GfxState*state); - - virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - POPPLER_INTERPOLATE - GBool inlineImg); - virtual void drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - int *maskColors, GBool inlineImg); - virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, - int maskWidth, int maskHeight, - GBool maskInvert - POPPLER_MASK_INTERPOLATE); - virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - POPPLER_INTERPOLATE - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap - POPPLER_MASK_INTERPOLATE); - private: - - FontInfo* getOrCreateFontInfo(GfxState*state); -}; - -#endif //__infooutputdev_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile deleted file mode 100644 index af2c4d9cc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile +++ /dev/null @@ -1,217 +0,0 @@ -# Generated automatically from Makefile.in by configure. -top_builddir = ../.. -srcdir = . -top_srcdir = ../.. -include ../../Makefile.common - -all-local: ../libgfxpdf$(A) pdf2swf$(E) pdf2jpeg$(E) - -all: ../libgfxpdf$(A) - -libgfxpdf: ../libgfxpdf$(A) - -libgfxpdf_objects = VectorGraphicOutputDev.$(O) BitmapOutputDev.$(O) FullBitmapOutputDev.$(O) CharOutputDev.$(O) CommonOutputDev.$(O) InfoOutputDev.$(O) XMLOutputDev.$(O) pdf.$(O) fonts.$(O) bbox.$(O) popplercompat.$(O) - -xpdf_in_source = $(xpdf_objects) - -xpdf_objects = xpdf/GHash.$(O) xpdf/GList.$(O) xpdf/GString.$(O) xpdf/gmem.$(O) xpdf/gfile.$(O) \ - xpdf/FoFiTrueType.$(O) xpdf/FoFiType1.$(O) xpdf/FoFiType1C.$(O) xpdf/FoFiBase.$(O) xpdf/FoFiEncodings.$(O) \ - xpdf/OutputDev.$(O) xpdf/PDFDoc.$(O) xpdf/Error.$(O) xpdf/Stream.$(O) xpdf/Object.$(O) \ - xpdf/Decrypt.$(O) xpdf/Array.$(O) xpdf/XRef.$(O) xpdf/Dict.$(O) xpdf/Parser.$(O) \ - xpdf/Lexer.$(O) xpdf/Outline.$(O) xpdf/PDFDocEncoding.$(O) xpdf/Catalog.$(O) \ - xpdf/Link.$(O) xpdf/GlobalParams.$(O) xpdf/JBIG2Stream.$(O) xpdf/Page.$(O) xpdf/JPXStream.$(O) \ - xpdf/JArithmeticDecoder.$(O) xpdf/Gfx.$(O) xpdf/GfxFont.$(O) xpdf/CMap.$(O) xpdf/CharCodeToUnicode.$(O) \ - xpdf/PSTokenizer.$(O) xpdf/FontEncodingTables.$(O) xpdf/BuiltinFont.$(O) xpdf/BuiltinFontTables.$(O) \ - xpdf/GfxState.$(O) xpdf/Function.$(O) xpdf/Annot.$(O) xpdf/NameToCharCode.$(O) xpdf/UnicodeMap.$(O) \ - xpdf/SecurityHandler.$(O) xpdf/TextOutputDev.$(O) xpdf/UnicodeTypeTable.$(O) - #xpdf/OptionalContent.$(O) - -splash_in_source = $(splash_objects) -splash_objects = xpdf/SplashOutputDev.$(O) xpdf/SplashFont.$(O) xpdf/SplashState.$(O) xpdf/Splash.$(O) \ - xpdf/SplashBitmap.$(O) xpdf/SplashClip.$(O) xpdf/SplashPattern.$(O) \ - xpdf/SplashFontEngine.$(O) xpdf/SplashFontFile.$(O) xpdf/SplashFontFileID.$(O) \ - xpdf/SplashScreen.$(O) xpdf/SplashPath.$(O) xpdf/SplashXPath.$(O) xpdf/SplashXPathScanner.$(O) \ - xpdf/SplashFTFontEngine.$(O) xpdf/SplashFTFontFile.$(O) xpdf/SplashFTFont.$(O) - -xpdf_include = -I xpdf - -popplercompat.$(O): popplercompat.cc - $(C) -I ./ $(xpdf_include) popplercompat.cc -o $@ -fonts.$(O): fonts.c - $(C) fonts.c -o $@ -bbox.$(O): bbox.c - $(C) bbox.c -o $@ -cmyk.$(O): cmyk.cc - $(CC) -I ./ $(xpdf_include) cmyk.cc -o $@ -CommonOutputDev.$(O): CommonOutputDev.cc InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) CommonOutputDev.cc -o $@ -VectorGraphicOutputDev.$(O): VectorGraphicOutputDev.cc VectorGraphicOutputDev.h CharOutputDev.h CommonOutputDev.h InfoOutputDev.h ../gfxpoly.h - $(CC) -I ./ $(xpdf_include) VectorGraphicOutputDev.cc -o $@ -CharOutputDev.$(O): CharOutputDev.cc CharOutputDev.h CommonOutputDev.h InfoOutputDev.h ../gfxpoly.h - $(CC) -I ./ $(xpdf_include) CharOutputDev.cc -o $@ -InfoOutputDev.$(O): InfoOutputDev.cc InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) InfoOutputDev.cc -o $@ -BitmapOutputDev.$(O): BitmapOutputDev.cc BitmapOutputDev.h CommonOutputDev.h InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) BitmapOutputDev.cc -o $@ -XMLOutputDev.$(O): XMLOutputDev.cc XMLOutputDev.h xpdf/TextOutputDev.h - $(CC) -I ./ $(xpdf_include) XMLOutputDev.cc -o $@ -FullBitmapOutputDev.$(O): FullBitmapOutputDev.cc FullBitmapOutputDev.h CommonOutputDev.h InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) FullBitmapOutputDev.cc -o $@ -DummyOutputDev.$(O): DummyOutputDev.cc DummyOutputDev.h InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) DummyOutputDev.cc -o $@ -pdf.$(O): pdf.cc VectorGraphicOutputDev.h CharOutputDev.h InfoOutputDev.h CommonOutputDev.h BitmapOutputDev.h FullBitmapOutputDev.h InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) pdf.cc -o $@ - -XPDFOK = xpdf/Gfx.cc -ifeq ($(shell echo inject*xpdf.pl),inject-xpdf.pl) -$(XPDFOK): Makefile.in inject-xpdf.pl xpdf-*tar.gz xpdf*patch - @if test xpdf-changes.patch -nt $(XPDFOK);then perl inject-xpdf.pl xpdf-3.02.tar.gz;fi - @if test '!' -d xpdf;then perl inject-xpdf.pl xpdf-3.02.tar.gz;fi -endif - -xpdf/UnicodeMap.$(O): xpdf/UnicodeMap.cc - $(CC) -I ./ -I xpdf xpdf/UnicodeMap.cc -o $@ -xpdf/NameToCharCode.$(O): xpdf/NameToCharCode.cc - $(CC) -I ./ -I xpdf xpdf/NameToCharCode.cc -o $@ -xpdf/Annot.$(O): xpdf/Annot.cc - $(CC) -I ./ -I xpdf xpdf/Annot.cc -o $@ -xpdf/Function.$(O): xpdf/Function.cc - $(CC) -I ./ -I xpdf xpdf/Function.cc -o $@ -xpdf/BuiltinFontTables.$(O): xpdf/BuiltinFontTables.cc - $(CC) -I ./ -I xpdf xpdf/BuiltinFontTables.cc -o $@ -xpdf/BuiltinFont.$(O): xpdf/BuiltinFont.cc - $(CC) -I ./ -I xpdf xpdf/BuiltinFont.cc -o $@ -xpdf/FontEncodingTables.$(O): xpdf/FontEncodingTables.cc - $(CC) -I ./ -I xpdf xpdf/FontEncodingTables.cc -o $@ -xpdf/PSTokenizer.$(O): xpdf/PSTokenizer.cc - $(CC) -I ./ -I xpdf xpdf/PSTokenizer.cc -o $@ -xpdf/CharCodeToUnicode.$(O): xpdf/CharCodeToUnicode.cc - $(CC) -I ./ -I xpdf xpdf/CharCodeToUnicode.cc -o $@ -xpdf/CMap.$(O): xpdf/CMap.cc - $(CC) -I ./ -I xpdf xpdf/CMap.cc -o $@ -xpdf/GfxFont.$(O): xpdf/GfxFont.cc - $(CC) -I ./ -I xpdf xpdf/GfxFont.cc -o $@ -xpdf/Gfx.$(O): xpdf/Gfx.cc - $(CC) -I ./ -I xpdf xpdf/Gfx.cc -o $@ -xpdf/GfxState.$(O): xpdf/GfxState.cc - $(CC) -I ./ -I xpdf xpdf/GfxState.cc -o $@ -xpdf/JArithmeticDecoder.$(O): xpdf/JArithmeticDecoder.cc - $(CC) -I ./ -I xpdf xpdf/JArithmeticDecoder.cc -o $@ -xpdf/JPXStream.$(O): xpdf/JPXStream.cc - $(CC) -I ./ -I xpdf xpdf/JPXStream.cc -o $@ -xpdf/GlobalParams.$(O): xpdf/GlobalParams.cc xpdf/GlobalParams.h - $(CC) -I ./ -I xpdf xpdf/GlobalParams.cc -o $@ -xpdf/JBIG2Stream.$(O): xpdf/JBIG2Stream.cc - $(CC) -I ./ -I xpdf xpdf/JBIG2Stream.cc -o $@ -xpdf/Page.$(O): xpdf/Page.cc - $(CC) -I ./ -I xpdf xpdf/Page.cc -o $@ -xpdf/Link.$(O): xpdf/Link.cc - $(CC) -I ./ -I xpdf xpdf/Link.cc -o $@ -xpdf/Catalog.$(O): xpdf/Catalog.cc - $(CC) -I ./ -I xpdf xpdf/Catalog.cc -o $@ -xpdf/PDFDocEncoding.$(O): xpdf/PDFDocEncoding.cc - $(CC) -I ./ -I xpdf xpdf/PDFDocEncoding.cc -o $@ -xpdf/Outline.$(O): xpdf/Outline.cc - $(CC) -I ./ -I xpdf xpdf/Outline.cc -o $@ -xpdf/Lexer.$(O): xpdf/Lexer.cc - $(CC) -I ./ -I xpdf xpdf/Lexer.cc -o $@ -xpdf/Parser.$(O): xpdf/Parser.cc - $(CC) -I ./ -I xpdf xpdf/Parser.cc -o $@ -xpdf/XRef.$(O): xpdf/XRef.cc - $(CC) -I ./ -I xpdf xpdf/XRef.cc -o $@ -xpdf/Array.$(O): xpdf/Array.cc - $(CC) -I ./ -I xpdf xpdf/Array.cc -o $@ -xpdf/Dict.$(O): xpdf/Dict.cc - $(CC) -I ./ -I xpdf xpdf/Dict.cc -o $@ -xpdf/Decrypt.$(O): xpdf/Decrypt.cc - $(CC) -I ./ -I xpdf xpdf/Decrypt.cc -o $@ -xpdf/Object.$(O): xpdf/Object.cc - $(CC) -I ./ -I xpdf xpdf/Object.cc -o $@ -xpdf/Error.$(O): xpdf/Error.cc aconf.h - $(CC) -I ./ -I xpdf xpdf/Error.cc -o $@ -xpdf/Stream.$(O): xpdf/Stream.cc - $(CC) -I ./ -I xpdf xpdf/Stream.cc -o $@ -xpdf/PDFDoc.$(O): xpdf/PDFDoc.cc - $(CC) -I ./ -I xpdf xpdf/PDFDoc.cc -o $@ -xpdf/SecurityHandler.$(O): xpdf/SecurityHandler.cc xpdf/SecurityHandler.h - $(CC) -I ./ -I xpdf xpdf/SecurityHandler.cc -o $@ -xpdf/OutputDev.$(O): xpdf/OutputDev.cc xpdf/GfxState.h xpdf/Stream.h xpdf/Object.h xpdf/OutputDev.h xpdf/gtypes.h xpdf/CharTypes.h - $(CC) -I ./ -I xpdf xpdf/OutputDev.cc -o $@ -xpdf/FoFiBase.$(O): xpdf/FoFiBase.cc - $(CC) -I ./ -I xpdf xpdf/FoFiBase.cc -o $@ -xpdf/FoFiTrueType.$(O): xpdf/FoFiTrueType.cc xpdf/FoFiBase.h - $(CC) -I ./ -I xpdf xpdf/FoFiTrueType.cc -o $@ -xpdf/FoFiEncodings.$(O): xpdf/FoFiEncodings.cc xpdf/FoFiEncodings.h - $(CC) -I ./ -I xpdf xpdf/FoFiEncodings.cc -o $@ -xpdf/FoFiType1C.$(O): xpdf/FoFiType1C.cc xpdf/FoFiBase.h - $(CC) -I ./ -I xpdf xpdf/FoFiType1C.cc -o $@ -xpdf/FoFiType1.$(O): xpdf/FoFiType1.cc xpdf/FoFiBase.h - $(CC) -I ./ -I xpdf xpdf/FoFiType1.cc -o $@ -xpdf/GList.$(O): xpdf/GList.cc - $(CC) -I ./ -I xpdf xpdf/GList.cc -o $@ -xpdf/GString.$(O): xpdf/GString.cc - $(CC) -I ./ -I xpdf xpdf/GString.cc -o $@ -xpdf/GHash.$(O): xpdf/GHash.cc - $(CC) -I ./ -I xpdf xpdf/GHash.cc -o $@ -xpdf/gfile.$(O): xpdf/gfile.cc - $(CC) -I ./ -I xpdf xpdf/gfile.cc -o $@ -xpdf/gmem.$(O): xpdf/gmem.cc - $(C) -I ./ -I xpdf xpdf/gmem.cc -o $@ -xpdf/parseargs.$(O): xpdf/parseargs.c - $(C) -I ./ -I xpdf xpdf/parseargs.c -o $@ - -xpdf/%.$(O): xpdf/%.cc - $(CC) -I ./ -I xpdf $< -o $@ - - -../libgfxpdf$(A): $(XPDFOK) $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) - rm -f ../libgfxpdf$(A) - $(AR) r ../libgfxpdf$(A) $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) - $(RANLIB) ../libgfxpdf$(A) - -xpdfapp_sources=xpdf/XPDFApp.cc xpdf/XPDFCore.cc xpdf/XPDFTree.cc xpdf/XPDFViewer.cc xpdf/PDFCore.cc xpdf/TextOutputDev.cc xpdf/xpdf.cc xpdf/CoreOutputDev.cc xpdf/UnicodeTypeTable.cc xpdf/PSOutputDev.cc -splash_sources=xpdf/Splash.cc xpdf/SplashBitmap.cc xpdf/SplashClip.cc xpdf/SplashFTFont.cc xpdf/SplashFTFontEngine.cc xpdf/SplashFTFontFile.cc xpdf/SplashFont.cc xpdf/SplashFontEngine.cc xpdf/SplashFontFile.cc xpdf/SplashFontFileID.cc xpdf/SplashOutputDev.cc xpdf/SplashPath.cc xpdf/SplashPattern.cc xpdf/SplashScreen.cc xpdf/SplashState.cc xpdf/SplashT1Font.cc xpdf/SplashT1FontEngine.cc xpdf/SplashT1FontFile.cc xpdf/SplashXPath.cc xpdf/SplashXPathScanner.cc -xpdfapp_objects=xpdf/XPDFApp.$(O) xpdf/XPDFCore.$(O) xpdf/XPDFTree.$(O) xpdf/XPDFViewer.$(O) xpdf/PDFCore.$(O) xpdf/xpdf.$(O) xpdf/CoreOutputDev.$(O) xpdf/PSOutputDev.$(O) - -xxpdf$(E): $(xpdf_objects) $(xpdfapp_objects) $(splash_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE -g -I xpdf -I . $(xpdfapp_objects) $(xpdf_objects) $(splash_objects) xpdf/parseargs.c -o xxpdf$(E) $(LIBS) -lXm -lX11 - -pdftoppm.$(O): $(XPDFOK) xpdf/pdftoppm.cc $(xpdf_objects) $(splash_objects) - $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdftoppm.cc -pdftotext.$(O): $(XPDFOK) xpdf/pdftotext.cc $(xpdf_objects) - $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdftotext.cc -pdfinfo.$(O): $(XPDFOK) xpdf/pdfinfo.cc $(xpdf_objects) - $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdfinfo.cc - -pdftoppm$(E): $(XPDFOK) xpdf/pdftoppm.$(O) xpdf/parseargs.$(O) $(xpdf_objects) $(splash_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdftoppm.$(O) $(xpdf_objects) $(splash_objects) xpdf/parseargs.$(O) -o pdftoppm$(E) $(LIBS) -pdftotext$(E): $(XPDFOK) xpdf/pdftotext.$(O) xpdf/parseargs.$(O) $(xpdf_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdftotext.$(O) $(xpdf_objects) xpdf/parseargs.$(O) -o pdftotext$(E) $(LIBS) -pdfinfo$(E): $(XPDFOK) xpdf/pdfinfo.$(O) xpdf/parseargs.$(O) $(xpdf_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdfinfo.$(O) $(xpdf_objects) xpdf/parseargs.$(O) -o pdfinfo$(E) $(LIBS) - -gfx_objects = ../libgfxswf$(A) ../libgfx$(A) ../librfxswf$(A) ../libbase$(A) -gfx_objects2 = $(gfx_objects) ../libocr$(A) - -pdf2jpeg$(E): $(XPDFOK) pdf2jpeg.c ../libbase$(A) xpdf/parseargs.$(O) $(xpdf_objects) $(splash_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE $(xpdf_include) -I. -g pdf2jpeg.c xpdf/parseargs.$(O) ../libbase$(A) $(xpdf_objects) $(splash_objects) -o pdf2jpeg$(E) $(LIBS) -pdf2swf$(E): $(XPDFOK) ../../src/pdf2swf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) - $(LL) $(CPPFLAGS) -g ../../src/pdf2swf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) -o pdf2swf$(E) $(LIBS) -pdf2pdf$(E): $(XPDFOK) ../../src/pdf2pdf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) - $(LL) $(CPPFLAGS) -g ../../src/pdf2pdf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) -o pdf2pdf$(E) $(LIBS) -gfx2gfx$(E): $(XPDFOK) ../../src/gfx2gfx.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects2) - $(LL) $(CPPFLAGS) -g ../../src/gfx2gfx.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects2) -o gfx2gfx$(E) $(LIBS) - -install: - $(mkinstalldirs) $(bindir) - @for file in pdfinfo pdftoppm pdftotext; do if test -f $$file;then $(INSTALL_BIN);fi;done - -uninstall: - - -clean: - rm -f xpdf/*.o xpdf/*.obj *.o pdf2swf pdftoppm pdftotext pdf2swf.exe pdftoppm.exe pdftotext.exe *.obj *.lo *.a *.lib *.la gmon.out - -.PHONY: clean install uninstall check all xpdf - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile.in deleted file mode 100644 index 77ff347fe..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/Makefile.in +++ /dev/null @@ -1,217 +0,0 @@ -# Generated automatically from Makefile.in by configure. -top_builddir = ../.. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -include ../../Makefile.common - -all-local: ../libgfxpdf$(A) pdf2swf$(E) pdf2jpeg$(E) - -all: ../libgfxpdf$(A) - -libgfxpdf: ../libgfxpdf$(A) - -libgfxpdf_objects = VectorGraphicOutputDev.$(O) BitmapOutputDev.$(O) FullBitmapOutputDev.$(O) CharOutputDev.$(O) CommonOutputDev.$(O) InfoOutputDev.$(O) XMLOutputDev.$(O) pdf.$(O) fonts.$(O) bbox.$(O) popplercompat.$(O) - -xpdf_in_source = @xpdf_in_source@ - -xpdf_objects = xpdf/GHash.$(O) xpdf/GList.$(O) xpdf/GString.$(O) xpdf/gmem.$(O) xpdf/gfile.$(O) \ - xpdf/FoFiTrueType.$(O) xpdf/FoFiType1.$(O) xpdf/FoFiType1C.$(O) xpdf/FoFiBase.$(O) xpdf/FoFiEncodings.$(O) \ - xpdf/OutputDev.$(O) xpdf/PDFDoc.$(O) xpdf/Error.$(O) xpdf/Stream.$(O) xpdf/Object.$(O) \ - xpdf/Decrypt.$(O) xpdf/Array.$(O) xpdf/XRef.$(O) xpdf/Dict.$(O) xpdf/Parser.$(O) \ - xpdf/Lexer.$(O) xpdf/Outline.$(O) xpdf/PDFDocEncoding.$(O) xpdf/Catalog.$(O) \ - xpdf/Link.$(O) xpdf/GlobalParams.$(O) xpdf/JBIG2Stream.$(O) xpdf/Page.$(O) xpdf/JPXStream.$(O) \ - xpdf/JArithmeticDecoder.$(O) xpdf/Gfx.$(O) xpdf/GfxFont.$(O) xpdf/CMap.$(O) xpdf/CharCodeToUnicode.$(O) \ - xpdf/PSTokenizer.$(O) xpdf/FontEncodingTables.$(O) xpdf/BuiltinFont.$(O) xpdf/BuiltinFontTables.$(O) \ - xpdf/GfxState.$(O) xpdf/Function.$(O) xpdf/Annot.$(O) xpdf/NameToCharCode.$(O) xpdf/UnicodeMap.$(O) \ - xpdf/SecurityHandler.$(O) xpdf/TextOutputDev.$(O) xpdf/UnicodeTypeTable.$(O) - #xpdf/OptionalContent.$(O) - -splash_in_source = @splash_in_source@ -splash_objects = xpdf/SplashOutputDev.$(O) xpdf/SplashFont.$(O) xpdf/SplashState.$(O) xpdf/Splash.$(O) \ - xpdf/SplashBitmap.$(O) xpdf/SplashClip.$(O) xpdf/SplashPattern.$(O) \ - xpdf/SplashFontEngine.$(O) xpdf/SplashFontFile.$(O) xpdf/SplashFontFileID.$(O) \ - xpdf/SplashScreen.$(O) xpdf/SplashPath.$(O) xpdf/SplashXPath.$(O) xpdf/SplashXPathScanner.$(O) \ - xpdf/SplashFTFontEngine.$(O) xpdf/SplashFTFontFile.$(O) xpdf/SplashFTFont.$(O) - -xpdf_include = @xpdf_include@ - -popplercompat.$(O): popplercompat.cc - $(C) -I ./ $(xpdf_include) popplercompat.cc -o $@ -fonts.$(O): fonts.c - $(C) fonts.c -o $@ -bbox.$(O): bbox.c - $(C) bbox.c -o $@ -cmyk.$(O): cmyk.cc - $(CC) -I ./ $(xpdf_include) cmyk.cc -o $@ -CommonOutputDev.$(O): CommonOutputDev.cc InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) CommonOutputDev.cc -o $@ -VectorGraphicOutputDev.$(O): VectorGraphicOutputDev.cc VectorGraphicOutputDev.h CharOutputDev.h CommonOutputDev.h InfoOutputDev.h ../gfxpoly.h - $(CC) -I ./ $(xpdf_include) VectorGraphicOutputDev.cc -o $@ -CharOutputDev.$(O): CharOutputDev.cc CharOutputDev.h CommonOutputDev.h InfoOutputDev.h ../gfxpoly.h - $(CC) -I ./ $(xpdf_include) CharOutputDev.cc -o $@ -InfoOutputDev.$(O): InfoOutputDev.cc InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) InfoOutputDev.cc -o $@ -BitmapOutputDev.$(O): BitmapOutputDev.cc BitmapOutputDev.h CommonOutputDev.h InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) BitmapOutputDev.cc -o $@ -XMLOutputDev.$(O): XMLOutputDev.cc XMLOutputDev.h xpdf/TextOutputDev.h - $(CC) -I ./ $(xpdf_include) XMLOutputDev.cc -o $@ -FullBitmapOutputDev.$(O): FullBitmapOutputDev.cc FullBitmapOutputDev.h CommonOutputDev.h InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) FullBitmapOutputDev.cc -o $@ -DummyOutputDev.$(O): DummyOutputDev.cc DummyOutputDev.h InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) DummyOutputDev.cc -o $@ -pdf.$(O): pdf.cc VectorGraphicOutputDev.h CharOutputDev.h InfoOutputDev.h CommonOutputDev.h BitmapOutputDev.h FullBitmapOutputDev.h InfoOutputDev.h - $(CC) -I ./ $(xpdf_include) pdf.cc -o $@ - -XPDFOK = xpdf/Gfx.cc -ifeq ($(shell echo inject*xpdf.pl),inject-xpdf.pl) -$(XPDFOK): Makefile.in inject-xpdf.pl xpdf-*tar.gz xpdf*patch - @if test xpdf-changes.patch -nt $(XPDFOK);then perl inject-xpdf.pl xpdf-3.02.tar.gz;fi - @if test '!' -d xpdf;then perl inject-xpdf.pl xpdf-3.02.tar.gz;fi -endif - -xpdf/UnicodeMap.$(O): xpdf/UnicodeMap.cc - $(CC) -I ./ -I xpdf xpdf/UnicodeMap.cc -o $@ -xpdf/NameToCharCode.$(O): xpdf/NameToCharCode.cc - $(CC) -I ./ -I xpdf xpdf/NameToCharCode.cc -o $@ -xpdf/Annot.$(O): xpdf/Annot.cc - $(CC) -I ./ -I xpdf xpdf/Annot.cc -o $@ -xpdf/Function.$(O): xpdf/Function.cc - $(CC) -I ./ -I xpdf xpdf/Function.cc -o $@ -xpdf/BuiltinFontTables.$(O): xpdf/BuiltinFontTables.cc - $(CC) -I ./ -I xpdf xpdf/BuiltinFontTables.cc -o $@ -xpdf/BuiltinFont.$(O): xpdf/BuiltinFont.cc - $(CC) -I ./ -I xpdf xpdf/BuiltinFont.cc -o $@ -xpdf/FontEncodingTables.$(O): xpdf/FontEncodingTables.cc - $(CC) -I ./ -I xpdf xpdf/FontEncodingTables.cc -o $@ -xpdf/PSTokenizer.$(O): xpdf/PSTokenizer.cc - $(CC) -I ./ -I xpdf xpdf/PSTokenizer.cc -o $@ -xpdf/CharCodeToUnicode.$(O): xpdf/CharCodeToUnicode.cc - $(CC) -I ./ -I xpdf xpdf/CharCodeToUnicode.cc -o $@ -xpdf/CMap.$(O): xpdf/CMap.cc - $(CC) -I ./ -I xpdf xpdf/CMap.cc -o $@ -xpdf/GfxFont.$(O): xpdf/GfxFont.cc - $(CC) -I ./ -I xpdf xpdf/GfxFont.cc -o $@ -xpdf/Gfx.$(O): xpdf/Gfx.cc - $(CC) -I ./ -I xpdf xpdf/Gfx.cc -o $@ -xpdf/GfxState.$(O): xpdf/GfxState.cc - $(CC) -I ./ -I xpdf xpdf/GfxState.cc -o $@ -xpdf/JArithmeticDecoder.$(O): xpdf/JArithmeticDecoder.cc - $(CC) -I ./ -I xpdf xpdf/JArithmeticDecoder.cc -o $@ -xpdf/JPXStream.$(O): xpdf/JPXStream.cc - $(CC) -I ./ -I xpdf xpdf/JPXStream.cc -o $@ -xpdf/GlobalParams.$(O): xpdf/GlobalParams.cc xpdf/GlobalParams.h - $(CC) -I ./ -I xpdf xpdf/GlobalParams.cc -o $@ -xpdf/JBIG2Stream.$(O): xpdf/JBIG2Stream.cc - $(CC) -I ./ -I xpdf xpdf/JBIG2Stream.cc -o $@ -xpdf/Page.$(O): xpdf/Page.cc - $(CC) -I ./ -I xpdf xpdf/Page.cc -o $@ -xpdf/Link.$(O): xpdf/Link.cc - $(CC) -I ./ -I xpdf xpdf/Link.cc -o $@ -xpdf/Catalog.$(O): xpdf/Catalog.cc - $(CC) -I ./ -I xpdf xpdf/Catalog.cc -o $@ -xpdf/PDFDocEncoding.$(O): xpdf/PDFDocEncoding.cc - $(CC) -I ./ -I xpdf xpdf/PDFDocEncoding.cc -o $@ -xpdf/Outline.$(O): xpdf/Outline.cc - $(CC) -I ./ -I xpdf xpdf/Outline.cc -o $@ -xpdf/Lexer.$(O): xpdf/Lexer.cc - $(CC) -I ./ -I xpdf xpdf/Lexer.cc -o $@ -xpdf/Parser.$(O): xpdf/Parser.cc - $(CC) -I ./ -I xpdf xpdf/Parser.cc -o $@ -xpdf/XRef.$(O): xpdf/XRef.cc - $(CC) -I ./ -I xpdf xpdf/XRef.cc -o $@ -xpdf/Array.$(O): xpdf/Array.cc - $(CC) -I ./ -I xpdf xpdf/Array.cc -o $@ -xpdf/Dict.$(O): xpdf/Dict.cc - $(CC) -I ./ -I xpdf xpdf/Dict.cc -o $@ -xpdf/Decrypt.$(O): xpdf/Decrypt.cc - $(CC) -I ./ -I xpdf xpdf/Decrypt.cc -o $@ -xpdf/Object.$(O): xpdf/Object.cc - $(CC) -I ./ -I xpdf xpdf/Object.cc -o $@ -xpdf/Error.$(O): xpdf/Error.cc aconf.h - $(CC) -I ./ -I xpdf xpdf/Error.cc -o $@ -xpdf/Stream.$(O): xpdf/Stream.cc - $(CC) -I ./ -I xpdf xpdf/Stream.cc -o $@ -xpdf/PDFDoc.$(O): xpdf/PDFDoc.cc - $(CC) -I ./ -I xpdf xpdf/PDFDoc.cc -o $@ -xpdf/SecurityHandler.$(O): xpdf/SecurityHandler.cc xpdf/SecurityHandler.h - $(CC) -I ./ -I xpdf xpdf/SecurityHandler.cc -o $@ -xpdf/OutputDev.$(O): xpdf/OutputDev.cc xpdf/GfxState.h xpdf/Stream.h xpdf/Object.h xpdf/OutputDev.h xpdf/gtypes.h xpdf/CharTypes.h - $(CC) -I ./ -I xpdf xpdf/OutputDev.cc -o $@ -xpdf/FoFiBase.$(O): xpdf/FoFiBase.cc - $(CC) -I ./ -I xpdf xpdf/FoFiBase.cc -o $@ -xpdf/FoFiTrueType.$(O): xpdf/FoFiTrueType.cc xpdf/FoFiBase.h - $(CC) -I ./ -I xpdf xpdf/FoFiTrueType.cc -o $@ -xpdf/FoFiEncodings.$(O): xpdf/FoFiEncodings.cc xpdf/FoFiEncodings.h - $(CC) -I ./ -I xpdf xpdf/FoFiEncodings.cc -o $@ -xpdf/FoFiType1C.$(O): xpdf/FoFiType1C.cc xpdf/FoFiBase.h - $(CC) -I ./ -I xpdf xpdf/FoFiType1C.cc -o $@ -xpdf/FoFiType1.$(O): xpdf/FoFiType1.cc xpdf/FoFiBase.h - $(CC) -I ./ -I xpdf xpdf/FoFiType1.cc -o $@ -xpdf/GList.$(O): xpdf/GList.cc - $(CC) -I ./ -I xpdf xpdf/GList.cc -o $@ -xpdf/GString.$(O): xpdf/GString.cc - $(CC) -I ./ -I xpdf xpdf/GString.cc -o $@ -xpdf/GHash.$(O): xpdf/GHash.cc - $(CC) -I ./ -I xpdf xpdf/GHash.cc -o $@ -xpdf/gfile.$(O): xpdf/gfile.cc - $(CC) -I ./ -I xpdf xpdf/gfile.cc -o $@ -xpdf/gmem.$(O): xpdf/gmem.cc - $(C) -I ./ -I xpdf xpdf/gmem.cc -o $@ -xpdf/parseargs.$(O): xpdf/parseargs.c - $(C) -I ./ -I xpdf xpdf/parseargs.c -o $@ - -xpdf/%.$(O): xpdf/%.cc - $(CC) -I ./ -I xpdf $< -o $@ - - -../libgfxpdf$(A): $(XPDFOK) $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) - rm -f ../libgfxpdf$(A) - $(AR) r ../libgfxpdf$(A) $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) - $(RANLIB) ../libgfxpdf$(A) - -xpdfapp_sources=xpdf/XPDFApp.cc xpdf/XPDFCore.cc xpdf/XPDFTree.cc xpdf/XPDFViewer.cc xpdf/PDFCore.cc xpdf/TextOutputDev.cc xpdf/xpdf.cc xpdf/CoreOutputDev.cc xpdf/UnicodeTypeTable.cc xpdf/PSOutputDev.cc -splash_sources=xpdf/Splash.cc xpdf/SplashBitmap.cc xpdf/SplashClip.cc xpdf/SplashFTFont.cc xpdf/SplashFTFontEngine.cc xpdf/SplashFTFontFile.cc xpdf/SplashFont.cc xpdf/SplashFontEngine.cc xpdf/SplashFontFile.cc xpdf/SplashFontFileID.cc xpdf/SplashOutputDev.cc xpdf/SplashPath.cc xpdf/SplashPattern.cc xpdf/SplashScreen.cc xpdf/SplashState.cc xpdf/SplashT1Font.cc xpdf/SplashT1FontEngine.cc xpdf/SplashT1FontFile.cc xpdf/SplashXPath.cc xpdf/SplashXPathScanner.cc -xpdfapp_objects=xpdf/XPDFApp.$(O) xpdf/XPDFCore.$(O) xpdf/XPDFTree.$(O) xpdf/XPDFViewer.$(O) xpdf/PDFCore.$(O) xpdf/xpdf.$(O) xpdf/CoreOutputDev.$(O) xpdf/PSOutputDev.$(O) - -xxpdf$(E): $(xpdf_objects) $(xpdfapp_objects) $(splash_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE -g -I xpdf -I . $(xpdfapp_objects) $(xpdf_objects) $(splash_objects) xpdf/parseargs.c -o xxpdf$(E) $(LIBS) -lXm -lX11 - -pdftoppm.$(O): $(XPDFOK) xpdf/pdftoppm.cc $(xpdf_objects) $(splash_objects) - $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdftoppm.cc -pdftotext.$(O): $(XPDFOK) xpdf/pdftotext.cc $(xpdf_objects) - $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdftotext.cc -pdfinfo.$(O): $(XPDFOK) xpdf/pdfinfo.cc $(xpdf_objects) - $(CC) -DXPDFEXE -I xpdf -I . xpdf/pdfinfo.cc - -pdftoppm$(E): $(XPDFOK) xpdf/pdftoppm.$(O) xpdf/parseargs.$(O) $(xpdf_objects) $(splash_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdftoppm.$(O) $(xpdf_objects) $(splash_objects) xpdf/parseargs.$(O) -o pdftoppm$(E) $(LIBS) -pdftotext$(E): $(XPDFOK) xpdf/pdftotext.$(O) xpdf/parseargs.$(O) $(xpdf_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdftotext.$(O) $(xpdf_objects) xpdf/parseargs.$(O) -o pdftotext$(E) $(LIBS) -pdfinfo$(E): $(XPDFOK) xpdf/pdfinfo.$(O) xpdf/parseargs.$(O) $(xpdf_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE -g $(xpdf_include) -I . xpdf/pdfinfo.$(O) $(xpdf_objects) xpdf/parseargs.$(O) -o pdfinfo$(E) $(LIBS) - -gfx_objects = ../libgfxswf$(A) ../libgfx$(A) ../librfxswf$(A) ../libbase$(A) -gfx_objects2 = $(gfx_objects) ../libocr$(A) - -pdf2jpeg$(E): $(XPDFOK) pdf2jpeg.c ../libbase$(A) xpdf/parseargs.$(O) $(xpdf_objects) $(splash_objects) - $(LL) $(CPPFLAGS) -DXPDFEXE $(xpdf_include) -I. -g pdf2jpeg.c xpdf/parseargs.$(O) ../libbase$(A) $(xpdf_objects) $(splash_objects) -o pdf2jpeg$(E) $(LIBS) -pdf2swf$(E): $(XPDFOK) ../../src/pdf2swf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) - $(LL) $(CPPFLAGS) -g ../../src/pdf2swf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) -o pdf2swf$(E) $(LIBS) -pdf2pdf$(E): $(XPDFOK) ../../src/pdf2pdf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) - $(LL) $(CPPFLAGS) -g ../../src/pdf2pdf.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects) -o pdf2pdf$(E) $(LIBS) -gfx2gfx$(E): $(XPDFOK) ../../src/gfx2gfx.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects2) - $(LL) $(CPPFLAGS) -g ../../src/gfx2gfx.c $(libgfxpdf_objects) $(xpdf_in_source) $(splash_in_source) $(gfx_objects2) -o gfx2gfx$(E) $(LIBS) - -install: - $(mkinstalldirs) $(bindir) - @for file in pdfinfo pdftoppm pdftotext; do if test -f $$file;then $(INSTALL_BIN);fi;done - -uninstall: - - -clean: - rm -f xpdf/*.o xpdf/*.obj *.o pdf2swf pdftoppm pdftotext pdf2swf.exe pdftoppm.exe pdftotext.exe *.obj *.lo *.a *.lib *.la gmon.out - -.PHONY: clean install uninstall check all xpdf - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.cc deleted file mode 100644 index 8c1b3af12..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.cc +++ /dev/null @@ -1,1730 +0,0 @@ -/* VectorGraphicOutputDev.cc - implements a pdf output device (OutputDev). - - This file is part of swftools. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#include - -#include "../../config.h" - -//xpdf header files -#include "popplercompat.h" -#include "VectorGraphicOutputDev.h" - -// swftools header files -#include "../os.h" -#include "../log.h" -#include "../mem.h" -#include "../utf8.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../gfxfont.h" -#include "../gfxpoly.h" -#include "../devices/record.h" -#include "../devices/ops.h" -#include "../devices/polyops.h" -#include "../devices/render.h" - -#include "../png.h" - -/* config */ -static int verbose = 0; -static int dbgindent = 1; -static void dbg(const char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - if(!verbose) - return; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - printf("(pdf) "); - int indent = dbgindent; - while(indent) { - printf(" "); - indent--; - } - printf("%s\n", buf); - fflush(stdout); -} - -GFXOutputState::GFXOutputState() { - this->clipping = 0; - this->createsoftmask = 0; - this->transparencygroup = 0; - this->softmask = 0; - this->grouprecording = 0; - this->isolated = 0; -} - -VectorGraphicOutputDev::VectorGraphicOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2) -:CommonOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2) -{ - this->type3active = 0; - this->statepos = 0; - this->xref = 0; - this->current_gfxfont = 0; - this->current_fontinfo = 0; - this->current_text_stroke = 0; - this->current_text_clip = 0; - this->outer_clip_box = 0; - this->config_convertgradients=1; - this->config_transparent=0; - this->config_disable_polygon_conversion = 0; - this->config_multiply = 1; - this->config_textonly = 0; - - /* for processing drawChar events */ - this->charDev = new CharOutputDev(info, doc, page2page, num_pages, x, y, x1, y1, x2, y2); - memset(&this->char_output_dev, 0, sizeof(gfxdevice_t)); - this->char_output_dev.internal = this; - this->char_output_dev.drawchar = drawchar_callback; - this->char_output_dev.addfont = addfont_callback; - - memset(states, 0, sizeof(states)); -}; - -void VectorGraphicOutputDev::setParameter(const char*key, const char*value) -{ - if(!strcmp(key,"transparent")) { - this->config_transparent = atoi(value); - } else if(!strcmp(key,"convertgradients")) { - this->config_convertgradients = atoi(value); - } else if(!strcmp(key,"textonly")) { - this->config_textonly = atoi(value); - } else if(!strcmp(key,"multiply")) { - this->config_multiply = atoi(value); - if(this->config_multiply<1) - this->config_multiply=1; - } else if(!strcmp(key,"disable_polygon_conversion")) { - this->config_disable_polygon_conversion = atoi(value); - } - this->charDev->setParameter(key, value); -} - -void VectorGraphicOutputDev::setDevice(gfxdevice_t*dev) -{ - this->device = dev; - charDev->setDevice(dev); -} - -//void VectorGraphicOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) {printf("void VectorGraphicOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) \n");} -//void VectorGraphicOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool inlineImg) {printf("void VectorGraphicOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool inlineImg) \n");} - -void dump_outline(gfxline_t*line) -{ - /*gfxbbox_t*r = gfxline_isrectangle(line); - if(!r) - printf("is not a rectangle\n"); - else - printf("is a rectangle: (%f,%f)-(%f-%f)\n", r->xmin, r->ymin, r->xmax, r->ymax); - */ - - while(line) { - if(line->type == gfx_moveTo) { - msg(" | moveTo %.2f %.2f", line->x,line->y); - } else if(line->type == gfx_lineTo) { - msg(" | lineTo %.2f %.2f", line->x,line->y); - } else if(line->type == gfx_splineTo) { - msg(" | splineTo (%.2f %.2f) %.2f %.2f", line->sx,line->sy, line->x, line->y); - } - line = line->next; - } -} - -void gfxPath_dump(GfxPath*path) -{ - int num = path->getNumSubpaths(); - int t; - int cpos=0; - for(t = 0; t < num; t++) { - GfxSubpath *subpath = path->getSubpath(t); - int subnum = subpath->getNumPoints(); - int s; - for(s=0;sgetX(s); - double y=subpath->getY(s); - if(s==0 && !subpath->getCurve(s)) { - printf("M %f %f\n", x, y); - } else if(s==0 && subpath->getCurve(s)) { - printf("E %f %f\n", x, y); - } else if(subpath->getCurve(s)) { - printf("C %f %f\n", x, y); - } else { - printf("T %f %f\n", x, y); - } - } - } -} - -gfxline_t* VectorGraphicOutputDev::gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed) -{ - int num = path->getNumSubpaths(); - int s,t; - int cpos = 0; - double lastx=0,lasty=0,posx=0,posy=0; - int needsfix=0; - if(!num) { - msg(" empty path"); - return 0; - } - gfxdrawer_t draw; - gfxdrawer_target_gfxline(&draw); - - for(t = 0; t < num; t++) { - GfxSubpath *subpath = path->getSubpath(t); - int subnum = subpath->getNumPoints(); - double bx=0,by=0,cx=0,cy=0; - - for(s=0;stransformXY(state, subpath->getX(s),subpath->getY(s),&x,&y); - - if(s==0) { - if(closed && needsfix && (fabs(posx-lastx)+fabs(posy-lasty))>0.001) { - draw.lineTo(&draw, lastx, lasty); - } - draw.moveTo(&draw, x,y); - posx = lastx = x; - posy = lasty = y; - cpos = 0; - needsfix = 0; - } else if(subpath->getCurve(s) && cpos==0) { - bx = x; - by = y; - cpos = 1; - } else if(subpath->getCurve(s) && cpos==1) { - cx = x; - cy = y; - cpos = 2; - } else { - posx = x; - posy = y; - if(cpos==0) { - draw.lineTo(&draw, x,y); - } else { - gfxdraw_cubicTo(&draw, bx,by, cx,cy, x,y, 0.05); - } - needsfix = 1; - cpos = 0; - } - } - } - /* fix non-closed lines */ - if(closed && needsfix && (fabs(posx-lastx)+fabs(posy-lasty))>0.001) { - draw.lineTo(&draw, lastx, lasty); - } - gfxline_t*result = (gfxline_t*)draw.result(&draw); - - gfxline_optimize(result); - - return result; -} - -GBool VectorGraphicOutputDev::useTilingPatternFill() -{ - infofeature("tiled patterns"); -// if(config_convertgradients) -// return gTrue; - return gFalse; -} -GBool VectorGraphicOutputDev::useShadedFills() -{ - infofeature("shaded fills"); - if(config_convertgradients) - return gTrue; - return gFalse; -} - -POPPLER_TILING_PATERN_RETURN VectorGraphicOutputDev::tilingPatternFill(GfxState *state, - POPPLER_TILING_PATERN_GFX - Object *str, - int paintType, Dict *resDict, - double *mat, double *bbox, - int x0, int y0, int x1, int y1, - double xStep, double yStep) -{ - msg(" tilingPatternFill"); - infofeature("tiling pattern fills"); -#ifdef HAVE_POPPLER - // since we don't implement this method yet, - // reduce it to a series of other drawing operations. - return gFalse; -#endif -} - -GBool VectorGraphicOutputDev::functionShadedFill(GfxState *state, GfxFunctionShading *shading) -{ - msg(" functionShadedFill not supported yet"); - infofeature("function shaded fills"); - return gFalse; -} -static gfxcolor_t col2col(GfxColorSpace*colspace, GfxColor* col) -{ - gfxcolor_t c; - GfxRGB rgb; - colspace->getRGB(col, &rgb); - c.r = colToByte(rgb.r); - c.g = colToByte(rgb.g); - c.b = colToByte(rgb.b); - c.a = 255; - return c; -} - -GBool VectorGraphicOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading) -{ - if(config_textonly) {return gTrue;} - - double x0,y0,r0,x1,y1,x2,y2,x9,y9,r1; - shading->getCoords(&x0,&y0,&r0,&x9,&y9,&r1); - x1=x0+r1;y1=y0; - x2=x0; y2=y0+r1; - this->transformXY(state, x0,y0, &x0,&y0); - this->transformXY(state, x1,y1, &x1,&y1); - this->transformXY(state, x2,y2, &x2,&y2); - - GfxColor color0; - GfxColor color1; - GfxColor color2; - shading->getColor(0.0, &color0); - shading->getColor(0.5, &color1); - shading->getColor(1.0, &color2); - - GfxColorSpace* colspace = shading->getColorSpace(); - - msg(" radialShadedFill %f %f %f %f %f %f %02x%02x%02x->%02x%02x%02x", x0, y0, x1, y1, x2, y2, - colToByte(color0.c[0]), colToByte(color0.c[1]), colToByte(color0.c[2]), - colToByte(color1.c[0]), colToByte(color1.c[1]), colToByte(color1.c[2]), - colToByte(color2.c[0]), colToByte(color2.c[1]), colToByte(color2.c[2])); - infofeature("radial shaded fills"); - - gfxgradient_t gr[3]; - gfxgradient_t*g = &gr[0]; - g[0].next = &g[1]; - g[1].next = &g[2]; - g[2].next = 0; - g[0].color = col2col(colspace, &color0); - g[1].color = col2col(colspace, &color1); - g[2].color = col2col(colspace, &color2); - g[0].pos = 0.0; - g[1].pos = 0.5; - g[2].pos = 1.0; - - gfxbbox_t b = states[statepos].clipbbox; - gfxline_t p1,p2,p3,p4,p5; - p1.type=gfx_moveTo;p1.x=b.xmin; p1.y=b.ymin; p1.next=&p2; - p2.type=gfx_lineTo;p2.x=b.xmin; p2.y=b.ymax; p2.next=&p3; - p3.type=gfx_lineTo;p3.x=b.xmax; p3.y=b.ymax; p3.next=&p4; - p4.type=gfx_lineTo;p4.x=b.xmax; p4.y=b.ymin; p4.next=&p5; - p5.type=gfx_lineTo;p5.x=b.xmin; p5.y=b.ymin; p5.next=0; - - gfxmatrix_t m; - //m.m00 = (x3-x0); m.m10 = (x1-x0); - //m.m01 = (y3-y0); m.m11 = (y1-y0); - //x3/y3 specifies another (the ending) circle, not the second radius of an ellipse - m.m00 = (x1-x0); m.m10 = (x2-x0); - m.m01 = (y1-y0); m.m11 = (y2-y0); - m.tx = x0 - 0.5; - m.ty = y0 - 0.5; - - device->fillgradient(device, &p1, g, gfxgradient_radial, &m); - return gTrue; -} - -GBool VectorGraphicOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading) -{ - if(config_textonly) {return gTrue;} - - double x0,y0,x1,y1; - shading->getCoords(&x0,&y0,&x1,&y1); - this->transformXY(state, x0,y0,&x0,&y0); - this->transformXY(state, x1,y1,&x1,&y1); - - GfxColor color0; - GfxColor color1; - GfxColor color2; - shading->getColor(0.0, &color0); - shading->getColor(0.5, &color1); - shading->getColor(1.0, &color2); - - GfxColorSpace* colspace = shading->getColorSpace(); - - msg(" axialShadedFill %f %f %f %f %02x%02x%02x->%02x%02x%02x->%02x%02x%02x", x0, y0, x1, y1, - colToByte(color0.c[0]), colToByte(color0.c[1]), colToByte(color0.c[2]), - colToByte(color1.c[0]), colToByte(color1.c[1]), colToByte(color1.c[2]), - colToByte(color2.c[0]), colToByte(color2.c[1]), colToByte(color2.c[2]) - ); - infofeature("axial shaded fills"); - - gfxgradient_t*g = (gfxgradient_t*)malloc(sizeof(gfxgradient_t)*3); - g[0].next = &g[1]; - g[1].next = &g[2]; - g[2].next = 0; - g[0].color = col2col(colspace, &color0); - g[1].color = col2col(colspace, &color1); - g[2].color = col2col(colspace, &color2); - g[0].pos = 0.0; - g[1].pos = 0.5; - g[2].pos = 1.0; - - double xMin,yMin,xMax,yMax; - state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); - this->transformXY(state, xMin, yMin, &xMin, &yMin); - msg(" userClipBox %f %f %f %f", xMin, yMin, xMax, yMax); - - xMin = 0; yMin = 0; - xMin = 1024; yMin = 1024; - - gfxbbox_t b = states[statepos].clipbbox; - gfxline_t p1,p2,p3,p4,p5; - p1.type=gfx_moveTo;p1.x=b.xmin; p1.y=b.ymin; p1.next=&p2; - p2.type=gfx_lineTo;p2.x=b.xmin; p2.y=b.ymax; p2.next=&p3; - p3.type=gfx_lineTo;p3.x=b.xmax; p3.y=b.ymax; p3.next=&p4; - p4.type=gfx_lineTo;p4.x=b.xmax; p4.y=b.ymin; p4.next=&p5; - p5.type=gfx_lineTo;p5.x=b.xmin; p5.y=b.ymin; p5.next=0; - - /* the gradient starts at (-1.0,0.0), so move (0,0) to - the middle of the two control points */ - gfxmatrix_t m; - m.m00 = (x1-x0)/2; m.m10 = -(y1-y0)/2; - m.m01 = (y1-y0)/2; m.m11 = (x1-x0)/2; - m.tx = (x0 + x1)/2 - 0.5; - m.ty = (y0 + y1)/2 - 0.5; - - device->fillgradient(device, &p1, g, gfxgradient_linear, &m); - - free(g); - return gTrue; -} - -GBool VectorGraphicOutputDev::useDrawForm() -{ - infofeature("forms"); - return gFalse; -} -void VectorGraphicOutputDev::drawForm(Ref id) -{ - msg(" drawForm not implemented"); -} -GBool VectorGraphicOutputDev::needNonText() -{ - return gTrue; -} -void VectorGraphicOutputDev::endPage() -{ - msg(" endPage (VectorGraphicOutputDev)"); - charDev->endPage(); // link postprocessing - if(outer_clip_box) { - device->endclip(device); - outer_clip_box = 0; - } -} -void VectorGraphicOutputDev::setDefaultCTM(double *ctm) -{ - charDev->setDefaultCTM(ctm); - OutputDev::setDefaultCTM(ctm); -} - -static inline double sqr(double x) {return x*x;} - -#define STROKE_FILL 1 -#define STROKE_CLIP 2 -void VectorGraphicOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) -{ - int lineCap = state->getLineCap(); // 0=butt, 1=round 2=square - int lineJoin = state->getLineJoin(); // 0=miter, 1=round 2=bevel - double miterLimit = state->getMiterLimit(); - double width = state->getTransformedLineWidth(); - - GfxRGB rgb; - double opaq = state->getStrokeOpacity(); - if(type3active) - state->getFillRGB(&rgb); - else - state->getStrokeRGB(&rgb); - gfxcolor_t col; - col.r = colToByte(rgb.r); - col.g = colToByte(rgb.g); - col.b = colToByte(rgb.b); - col.a = (unsigned char)(opaq*255); - - gfx_capType capType = gfx_capRound; - if(lineCap == 0) capType = gfx_capButt; - else if(lineCap == 1) capType = gfx_capRound; - else if(lineCap == 2) capType = gfx_capSquare; - else msg(" Invalid line cap type"); - - gfx_joinType joinType = gfx_joinRound; - if(lineJoin == 0) joinType = gfx_joinMiter; - else if(lineJoin == 1) joinType = gfx_joinRound; - else if(lineJoin == 2) joinType = gfx_joinBevel; - else msg(" Invalid line join type"); - - gfxline_t*line2 = 0; - - int dashLength = states[statepos].dashLength; - double*dashPattern = states[statepos].dashPattern; - double dashStart = states[statepos].dashStart; - if(dashLength && dashPattern) { - float * dash = (float*)malloc(sizeof(float)*(dashLength+1)); - int t; - - /* try to find out how much the transformation matrix would - stretch the dashes, and factor that into the dash lengths. - This is not the entirely correct approach- it would be - better to first convert the path to an unscaled version, - then apply dashing, and then transform the path using - the current transformation matrix. However there are few - PDFs which actually stretch a dashed path in a non-orthonormal - way */ - double tx1, ty1, tx2, ty2, tx3, ty3; - this->transformXY(state, 0, 0, &tx1, &ty1); - this->transformXY(state, 0, 1, &tx2, &ty2); - this->transformXY(state, 1, 0, &tx3, &ty3); - double d1 = sqrt(sqr(tx2-tx1)+sqr(ty2-ty1)); - double d2 = sqrt(sqr(tx3-tx1)+sqr(ty3-ty1)); - if(fabs(d1-d2)>0.5) - warnfeature("non-ortogonally dashed strokes", 0); - double f = (d1+d2)/2; - - msg(" %d dashes", dashLength); - msg(" | phase: %f", dashStart); - for(t=0;t | d%-3d: %f", t, dashPattern[t]); - } - dash[dashLength] = -1; - if(getLogLevel() >= LOGLEVEL_TRACE) { - dump_outline(line); - } - - line2 = gfxtool_dash_line(line, dash, (float)(dashStart*f)); - line = line2; - - free(dash); - msg(" After dashing:"); - } - - if(getLogLevel() >= LOGLEVEL_TRACE) { - msg(" stroke width=%f join=%s cap=%s dashes=%d color=%02x%02x%02x%02x", - width, - lineJoin==0?"miter": (lineJoin==1?"round":"bevel"), - lineCap==0?"butt": (lineCap==1?"round":"square"), - dashLength, - col.r,col.g,col.b,col.a - ); - dump_outline(line); - } - - if(flags&STROKE_FILL) { - gfxpoly_t* poly = gfxpoly_from_stroke(line, width, capType, joinType, miterLimit, DEFAULT_GRID); - gfxline_t*gfxline = gfxline_from_gfxpoly(poly); - if(getLogLevel() >= LOGLEVEL_TRACE) { - dump_outline(gfxline); - } - if(!gfxline) { - msg(" Empty polygon (resulting from stroked line)"); - } - if(flags&STROKE_CLIP) { - device->startclip(device, gfxline); - states[statepos].clipping++; - } else { - device->fill(device, gfxline, &col); - } - gfxline_free(gfxline); - gfxpoly_destroy(poly); - } else { - if(flags&STROKE_CLIP) - msg(" Stroke&clip not supported at the same time"); - device->stroke(device, line, width, &col, capType, joinType, miterLimit); - } - - if(line2) - gfxline_free(line2); -} - -void VectorGraphicOutputDev::fillGfxLine(GfxState *state, gfxline_t*line, char evenodd) -{ - gfxcolor_t col = gfxstate_getfillcolor(state); - - if(getLogLevel() >= LOGLEVEL_TRACE) { - msg(" %sfill %02x%02x%02x%02x", evenodd?"eo":"", col.r, col.g, col.b, col.a); - dump_outline(line); - } - device->fill(device, line, &col); -} - -void VectorGraphicOutputDev::clipToGfxLine(GfxState *state, gfxline_t*line, char evenodd) -{ - if(getLogLevel() >= LOGLEVEL_TRACE) { - msg(" %sclip", evenodd?"eo":""); - dump_outline(line); - } - gfxbbox_t bbox = gfxline_getbbox(line); - gfxbbox_intersect(&states[statepos].clipbbox, &bbox); - - device->startclip(device, line); - states[statepos].clipping++; -} - -void VectorGraphicOutputDev::clip(GfxState *state) -{ - GfxPath * path = state->getPath(); - msg(" clip"); - gfxline_t*line = gfxPath_to_gfxline(state, path, 1); - if(!config_disable_polygon_conversion) { - gfxline_t*line2 = gfxpoly_circular_to_evenodd(line, DEFAULT_GRID); - gfxline_free(line); - line = line2; - } - clipToGfxLine(state, line, 0); - gfxline_free(line); -} - -void VectorGraphicOutputDev::eoClip(GfxState *state) -{ - GfxPath * path = state->getPath(); - gfxline_t*line = gfxPath_to_gfxline(state, path, 1); - clipToGfxLine(state, line, 1); - gfxline_free(line); -} -void VectorGraphicOutputDev::clipToStrokePath(GfxState *state) -{ - GfxPath * path = state->getPath(); - gfxline_t*line= gfxPath_to_gfxline(state, path, 0); - - if(getLogLevel() >= LOGLEVEL_TRACE) { - double width = state->getTransformedLineWidth(); - msg(" cliptostrokepath width=%f", width); - dump_outline(line); - } - - strokeGfxline(state, line, STROKE_FILL|STROKE_CLIP); - gfxline_free(line); -} - -void VectorGraphicOutputDev::finish() -{ - if(outer_clip_box) { - if(device) { - device->endclip(device); - } - outer_clip_box = 0; - } -} - -VectorGraphicOutputDev::~VectorGraphicOutputDev() -{ - finish(); - delete charDev;charDev=0; -}; -GBool VectorGraphicOutputDev::upsideDown() -{ - return gTrue; -}; -GBool VectorGraphicOutputDev::useDrawChar() -{ - return gTrue; -} - -void VectorGraphicOutputDev::updateFontMatrix(GfxState*state) -{ - this->current_font_matrix = gfxmatrix_from_state(state); - charDev->updateTextMat(state); -} - -void VectorGraphicOutputDev::updateFont(GfxState*state) -{ - charDev->updateFont(state); -} - -void VectorGraphicOutputDev::processLink(Link *link, Catalog *catalog) -{ - charDev->processLink(link, catalog); -} - -void VectorGraphicOutputDev::beginString(GfxState *state, GString *s) -{ - int render = state->getRender(); - if(current_text_stroke) { - msg(" Error: Incompatible change of text rendering to %d while inside cliptext", render); - } - charDev->beginString(state, s); -} - -static gfxline_t* mkEmptyGfxShape(double x, double y) -{ - gfxline_t*line = (gfxline_t*)malloc(sizeof(gfxline_t)); - line->x = x;line->y = y;line->type = gfx_moveTo;line->next = 0; - return line; -} - -void addfont_callback(gfxdevice_t*dev, gfxfont_t*font) -{ - VectorGraphicOutputDev*self = (VectorGraphicOutputDev*)dev->internal; - self->device->addfont(self->device, font); -} -void drawchar_callback(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - VectorGraphicOutputDev*self = (VectorGraphicOutputDev*)dev->internal; - self->gfxfont_from_callback = font; - self->glyphnr_from_callback = glyph; - memcpy(&self->textcolor_from_callback, color, sizeof(gfxcolor_t)); - memcpy(&self->textmatrix_from_callback, matrix, sizeof(gfxmatrix_t)); -} - -void VectorGraphicOutputDev::drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode charid, int nBytes, Unicode *_u, int uLen) -{ - int render = state->getRender(); - if(((render == RENDER_FILL) || - (render == RENDER_FILLSTROKE && state->getTransformedLineWidth()<1.0) || - (render == RENDER_INVISIBLE))) { - charDev->drawChar(state, x, y, dx, dy, originX, originY, charid, nBytes, _u, uLen); - return; - } - - msg(" Drawing glyph %d as shape", charid); - infofeature("text rendered as shape"); - - charDev->setDevice(&char_output_dev); - this->gfxfont_from_callback = 0; - this->glyphnr_from_callback = 0; - charDev->drawChar(state, x, y, dx, dy, originX, originY, charid, nBytes, _u, uLen); - charDev->setDevice(device); - - if(!gfxfont_from_callback) { - // some chars are ignored by CharOutputDev - return; - } - gfxline_t*glyph = gfxfont_from_callback->glyphs[glyphnr_from_callback].line; - - gfxline_t*tglyph = gfxline_clone(glyph); - gfxline_transform(tglyph, &textmatrix_from_callback); - if((render&3) != RENDER_INVISIBLE) { - gfxline_t*add = gfxline_clone(tglyph); - current_text_stroke = gfxline_append(current_text_stroke, add); - } - if(render&RENDER_CLIP) { - gfxline_t*add = gfxline_clone(tglyph); - current_text_clip = gfxline_append(current_text_clip, add); - if(!current_text_clip) { - current_text_clip = mkEmptyGfxShape(textmatrix_from_callback.tx, textmatrix_from_callback.ty); - } - } - gfxline_free(tglyph); -} - -void VectorGraphicOutputDev::endString(GfxState *state) -{ - int render = state->getRender(); - msg(" endString() render=%d textstroke=%p", render, current_text_stroke); - - if(current_text_stroke) { - /* fillstroke and stroke text rendering objects we can process right - now (as there may be texts of other rendering modes in this - text object)- clipping objects have to wait until endTextObject, - however */ - device->setparameter(device, "mark","TXT"); - if((render&3) == RENDER_FILL) { - fillGfxLine(state, current_text_stroke, 0); - gfxline_free(current_text_stroke); - current_text_stroke = 0; - } else if((render&3) == RENDER_FILLSTROKE) { - fillGfxLine(state, current_text_stroke, 0); - strokeGfxline(state, current_text_stroke,0); - gfxline_free(current_text_stroke); - current_text_stroke = 0; - } else if((render&3) == RENDER_STROKE) { - strokeGfxline(state, current_text_stroke,0); - gfxline_free(current_text_stroke); - current_text_stroke = 0; - } - device->setparameter(device, "mark",""); - } -} - -void VectorGraphicOutputDev::endTextObject(GfxState *state) -{ - int render = state->getRender(); - msg(" endTextObject() render=%d textstroke=%p clipstroke=%p", render, current_text_stroke, current_text_clip); - - if(current_text_clip) { - device->setparameter(device, "mark","TXT"); - clipToGfxLine(state, current_text_clip, 0); - device->setparameter(device, "mark",""); - gfxline_free(current_text_clip); - current_text_clip = 0; - } -} - -/* the logic seems to be as following: - first, beginType3Char is called, with the charcode and the coordinates. - if this function returns true, it already knew about the char and has now drawn it. - if the function returns false, it's a new char, and type3D0 and/or type3D1 might be - called with some parameters. - Afterwards, all draw operations until endType3Char are part of the char (which in this moment is - at the position first passed to beginType3Char). the char ends with endType3Char. - - The drawing operations between beginType3Char and endType3Char are somewhat different to - the normal ones. For example, the fillcolor equals the stroke color. (Because the stroke - color determines the color of a font) -*/ - -GBool VectorGraphicOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode charid, Unicode *u, int uLen) -{ - return charDev->beginType3Char(state, x, y, dx, dy, charid, u, uLen); -} - -void VectorGraphicOutputDev::type3D0(GfxState *state, double wx, double wy) -{ - charDev->type3D0(state, wx, wy); -} -void VectorGraphicOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) -{ - charDev->type3D1(state, wx, wy, llx, lly, urx, ury); -} - -void VectorGraphicOutputDev::endType3Char(GfxState *state) -{ - charDev->endType3Char(state); -} - -GBool VectorGraphicOutputDev::checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data), - void *abortCheckCbkData) -{ - this->setPage(page); - charDev->setPage(page); - return gTrue; -} - - -void VectorGraphicOutputDev::beginPage(GfxState *state, int pageNum) -{ - this->currentpage = pageNum; - int rot = doc->getPageRotate(1); - gfxcolor_t white = {255,255,255,255}; - gfxcolor_t black = {255,0,0,0}; - laststate = state; - gfxline_t clippath[5]; - - msg(" processing PDF page %d (%dx%d:%d:%d)", pageNum, this->width, this->height, -this->movex, -this->movey); - if(rot!=0) - msg(" page is rotated %d degrees", rot); - - clippath[0].type = gfx_moveTo;clippath[0].x = 0; clippath[0].y = 0; clippath[0].next = &clippath[1]; - clippath[1].type = gfx_lineTo;clippath[1].x = width; clippath[1].y = 0; clippath[1].next = &clippath[2]; - clippath[2].type = gfx_lineTo;clippath[2].x = width; clippath[2].y = height; clippath[2].next = &clippath[3]; - clippath[3].type = gfx_lineTo;clippath[3].x = 0; clippath[3].y = height; clippath[3].next = &clippath[4]; - clippath[4].type = gfx_lineTo;clippath[4].x = 0; clippath[4].y = 0; clippath[4].next = 0; - - device->startclip(device, clippath); outer_clip_box = 1; - if(!config_transparent) { - device->fill(device, clippath, &white); - } - states[statepos].clipbbox.xmin = 0; - states[statepos].clipbbox.ymin = 0; - states[statepos].clipbbox.xmax = this->width; - states[statepos].clipbbox.ymax = this->height; - - states[statepos].dashPattern = 0; - states[statepos].dashLength = 0; - states[statepos].dashStart = 0; - - charDev->startPage(pageNum, state); -} - -void VectorGraphicOutputDev::saveState(GfxState *state) { - dbg("saveState %p", state); dbgindent+=2; - - msg(" saveState %p", state); - updateAll(state); - if(statepos>=64) { - msg(" Too many nested states in pdf."); - exit(1); - } - statepos ++; - states[statepos].state = state; - states[statepos].createsoftmask = states[statepos-1].createsoftmask; - states[statepos].transparencygroup = states[statepos-1].transparencygroup; - states[statepos].clipping = 0; - states[statepos].olddevice = 0; - states[statepos].clipbbox = states[statepos-1].clipbbox; - - states[statepos].dashPattern = states[statepos-1].dashPattern; - states[statepos].dashStart = states[statepos-1].dashStart; - states[statepos].dashLength = states[statepos-1].dashLength; -}; - -void VectorGraphicOutputDev::restoreState(GfxState *state) { - dbgindent-=2; dbg("restoreState %p", state); - - if(statepos==0) { - msg(" Invalid restoreState"); - exit(1); - } - msg(" restoreState %p%s%s", state, - states[statepos].softmask?" (end softmask)":"", - states[statepos].clipping?" (end clipping)":""); - if(states[statepos].softmask) { - clearSoftMask(state); - } - - if(states[statepos].dashPattern) { - if(!statepos || states[statepos-1].dashPattern != states[statepos].dashPattern) { - free(states[statepos].dashPattern); - states[statepos].dashPattern = 0; - } - } - - updateAll(state); - - while(states[statepos].clipping) { - device->endclip(device); - states[statepos].clipping--; - } - if(states[statepos].state!=state) { - msg(" bad state nesting"); - if(verbose) { - int t; - for(t=0;t<=statepos;t++) { - printf("%p ", states[t].state); - } - printf("\n"); - } - exit(1); - } - states[statepos].state=0; - statepos--; -} - -void VectorGraphicOutputDev::updateLineDash(GfxState *state) -{ - if(states[statepos].dashPattern && - (!statepos || states[statepos-1].dashPattern != states[statepos].dashPattern)) { - free(states[statepos].dashPattern); - states[statepos].dashPattern = 0; - } - double *pattern = 0; - int dashLength; - double dashStart; - state->getLineDash(&pattern, &dashLength, &dashStart); - msg(" updateLineDash, %d dashes", dashLength); - if(!dashLength) { - states[statepos].dashPattern = 0; - states[statepos].dashLength = 0; - } else { - double*p = (double*)malloc(dashLength*sizeof(states[statepos].dashPattern[0])); - memcpy(p, pattern, dashLength*sizeof(states[statepos].dashPattern[0])); - states[statepos].dashPattern = p; - states[statepos].dashLength = dashLength; - states[statepos].dashStart = dashStart; - } -} - -#define SQR(x) ((x)*(x)) -unsigned char* antialize(unsigned char*data, int width, int height, int newwidth, int newheight, int palettesize) -{ - if((newwidth<1 || newheight<1) || - (width<=newwidth || height<=newheight)) - return 0; - unsigned char*newdata; - int x,y; - newdata= (unsigned char*)malloc(newwidth*newheight); - double fx = ((double)width)/newwidth; - double fy = ((double)height)/newheight; - double px = 0; - int blocksize = (int)(8192/(fx*fy)); - int r = 8192*256/palettesize; - for(x=0;x=width) - tox = width-1; - if(toy>=height) - toy = height-1; - for(xx=fromx;xx<=tox;xx++) - for(yy=fromy;yy<=toy;yy++) { - int b = 1-data[width*yy+xx]; - int weight=256; - if(xx==fromx) weight = (weight*xweight1)/256; - if(xx==tox) weight = (weight*xweight2)/256; - if(yy==fromy) weight = (weight*yweight1)/256; - if(yy==toy) weight = (weight*yweight2)/256; - a+=b*weight; - } - //if(a) a=(palettesize-1)*r/blocksize; - newdata[y*newwidth+x] = (a*blocksize)/r; - py = ey; - } - px = ex; - } - return newdata; -} - -#define IMAGE_TYPE_JPEG 0 -#define IMAGE_TYPE_LOSSLESS 1 - -static void drawimage(gfxdevice_t*dev, gfxcolor_t* data, int sizex,int sizey, - double x1,double y1, - double x2,double y2, - double x3,double y3, - double x4,double y4, int type, int multiply) -{ - gfxcolor_t*newpic=0; - - double l1 = sqrt((x4-x1)*(x4-x1) + (y4-y1)*(y4-y1)); - double l2 = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); - - gfxline_t p1,p2,p3,p4,p5; - p1.type=gfx_moveTo;p1.x=x1; p1.y=y1;p1.next=&p2; - p2.type=gfx_lineTo;p2.x=x2; p2.y=y2;p2.next=&p3; - p3.type=gfx_lineTo;p3.x=x3; p3.y=y3;p3.next=&p4; - p4.type=gfx_lineTo;p4.x=x4; p4.y=y4;p4.next=&p5; - p5.type=gfx_lineTo;p5.x=x1; p5.y=y1;p5.next=0; - - {p1.x = (int)(p1.x*20)/20.0; - p1.y = (int)(p1.y*20)/20.0; - p2.x = (int)(p2.x*20)/20.0; - p2.y = (int)(p2.y*20)/20.0; - p3.x = (int)(p3.x*20)/20.0; - p3.y = (int)(p3.y*20)/20.0; - p4.x = (int)(p4.x*20)/20.0; - p4.y = (int)(p4.y*20)/20.0; - p5.x = (int)(p5.x*20)/20.0; - p5.y = (int)(p5.y*20)/20.0; - } - - gfxmatrix_t m; - m.m00 = (p4.x-p1.x)/sizex; m.m10 = (p2.x-p1.x)/sizey; - m.m01 = (p4.y-p1.y)/sizex; m.m11 = (p2.y-p1.y)/sizey; - - m.tx = p1.x - 0.5*multiply; - m.ty = p1.y - 0.5*multiply; - - gfximage_t img; - img.data = (gfxcolor_t*)data; - img.width = sizex; - img.height = sizey; - - if(type == IMAGE_TYPE_JPEG) - /* TODO: pass image_dpi to device instead */ - dev->setparameter(dev, "next_bitmap_is_jpeg", "1"); - - dump_outline(&p1); - dev->fillbitmap(dev, &p1, &img, &m, 0); -} - -void drawimagejpeg(gfxdevice_t*dev, gfxcolor_t*mem, int sizex,int sizey, - double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4, int multiply) -{ - drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_JPEG, multiply); -} - -void drawimagelossless(gfxdevice_t*dev, gfxcolor_t*mem, int sizex,int sizey, - double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4, int multiply) -{ - drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_LOSSLESS, multiply); -} - - -void VectorGraphicOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap*colorMap, GBool invert, - GBool inlineImg, int mask, int*maskColors, - Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GfxImageColorMap*maskColorMap) -{ - /* the code in this function is *old*. It's not pretty, but it works. */ - - double x1,y1,x2,y2,x3,y3,x4,y4; - ImageStream *imgStr; - Guchar pixBuf[4]; - GfxRGB rgb; - int ncomps = 1; - int bits = 1; - unsigned char* maskbitmap = 0; - - if(colorMap) { - ncomps = colorMap->getNumPixelComps(); - bits = colorMap->getBits(); - } - - if(maskStr) { - int x,y; - unsigned char buf[8]; - maskbitmap = (unsigned char*)malloc(maskHeight*maskWidth); - if(maskColorMap) { - ImageStream*imgMaskStr = new ImageStream(maskStr, maskWidth, maskColorMap->getNumPixelComps(), maskColorMap->getBits()); - imgMaskStr->reset(); - unsigned char pal[256]; - int n = 1 << colorMap->getBits(); - int t; - for(t=0;tgetGray(pixBuf, &gray); - pal[t] = colToByte(gray); - } - for (y = 0; y < maskHeight; y++) { - for (x = 0; x < maskWidth; x++) { - imgMaskStr->getPixel(buf); - maskbitmap[y*maskWidth+x] = pal[buf[0]]; - } - } - delete imgMaskStr; - } else { - ImageStream*imgMaskStr = new ImageStream(maskStr, maskWidth, 1, 1); - imgMaskStr->reset(); - for (y = 0; y < maskHeight; y++) { - for (x = 0; x < maskWidth; x++) { - imgMaskStr->getPixel(buf); - buf[0]^=maskInvert; - maskbitmap[y*maskWidth+x] = (buf[0]^1)*255; - } - } - delete imgMaskStr; - } - maskStr->close(); - } - - imgStr = new ImageStream(str, width, ncomps,bits); - imgStr->reset(); - - if(!width || !height || ((height+width)<=1 && (maskWidth+maskHeight)<=1)) - { - msg(" Ignoring %d by %d image", width, height); - unsigned char buf[8]; - int x,y; - for (y = 0; y < height; ++y) - for (x = 0; x < width; ++x) { - imgStr->getPixel(buf); - } - delete imgStr; - if(maskbitmap) - free(maskbitmap); - return; - } - - this->transformXY(state, 0, 1, &x1, &y1); - this->transformXY(state, 0, 0, &x2, &y2); - this->transformXY(state, 1, 0, &x3, &y3); - this->transformXY(state, 1, 1, &x4, &y4); - - if(type3active) { - /* as type 3 bitmaps are antialized, we need to place them - at integer coordinates, otherwise flash player's antializing - will kick in and make everything blurry */ - x1 = (int)(x1);y1 = (int)(y1); - x2 = (int)(x2);y2 = (int)(y2); - x3 = (int)(x3);y3 = (int)(y3); - x4 = (int)(x4);y4 = (int)(y4); - } - - if(!(str->getKind()==strDCT)) { - if(!type3active) { - if(mask) infofeature("masked pbm pictures"); - else infofeature("pbm pictures"); - } - if(mask) - msg(" drawing %d by %d masked picture", width, height); - } - if(str->getKind()==strDCT) { - infofeature("jpeg pictures"); - } - - if(mask) { - unsigned char buf[8]; - int x,y; - unsigned char*pic = new unsigned char[width*height]; - gfxcolor_t pal[256]; - GfxRGB rgb; - state->getFillRGB(&rgb); - - memset(pal,255,sizeof(pal)); - pal[0].r = (int)(colToByte(rgb.r)); pal[1].r = 0; - pal[0].g = (int)(colToByte(rgb.g)); pal[1].g = 0; - pal[0].b = (int)(colToByte(rgb.b)); pal[1].b = 0; - pal[0].a = 255; pal[1].a = 0; - - int numpalette = 2; - int realwidth = (int)sqrt(SQR(x2-x3) + SQR(y2-y3)); - int realheight = (int)sqrt(SQR(x1-x2) + SQR(y1-y2)); - for (y = 0; y < height; ++y) - for (x = 0; x < width; ++x) - { - imgStr->getPixel(buf); - if(invert) - buf[0]=1-buf[0]; - pic[width*y+x] = buf[0]; - } - - if(type3active) { - unsigned char*pic2 = 0; - numpalette = 16; - - pic2 = antialize(pic,width,height,realwidth,realheight,numpalette); - - if(!pic2) { - delete[] pic; - delete imgStr; - return; - } - - width = realwidth; - height = realheight; - delete[] pic; - pic = pic2; - - /* make a black/white palette */ - - float r = 255./(float)(numpalette-1); - int t; - for(t=0;tgetNumPixelComps()!=1 || str->getKind()==strDCT) { - gfxcolor_t*pic=new gfxcolor_t[width*height]; - for (y = 0; y < height; ++y) { - for (x = 0; x < width; ++x) { - imgStr->getPixel(pixBuf); - colorMap->getRGB(pixBuf, &rgb); - pic[width*y+x].r = (unsigned char)(colToByte(rgb.r)); - pic[width*y+x].g = (unsigned char)(colToByte(rgb.g)); - pic[width*y+x].b = (unsigned char)(colToByte(rgb.b)); - pic[width*y+x].a = 255;//(U8)(rgb.a * 255 + 0.5); - if(maskbitmap) { - int x1 = x*maskWidth/width; - int y1 = y*maskHeight/height; - int x2 = (x+1)*maskWidth/width; - int y2 = (y+1)*maskHeight/height; - int xx,yy; - unsigned int alpha=0; - unsigned int count=0; - for(xx=x1;xxgetKind()==strDCT) - drawimagejpeg(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); - else - drawimagelossless(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); - delete[] pic; - delete imgStr; - if(maskbitmap) free(maskbitmap); - return; - } else { - gfxcolor_t*pic=new gfxcolor_t[width*height]; - gfxcolor_t pal[256]; - int n = 1 << colorMap->getBits(); - int t; - for(t=0;t<256;t++) { - pixBuf[0] = t; - colorMap->getRGB(pixBuf, &rgb); - pal[t].r = (unsigned char)(colToByte(rgb.r)); - pal[t].g = (unsigned char)(colToByte(rgb.g)); - pal[t].b = (unsigned char)(colToByte(rgb.b)); - pal[t].a = 255;//(U8)(rgb.b * 255 + 0.5); - } - for (y = 0; y < height; ++y) { - for (x = 0; x < width; ++x) { - imgStr->getPixel(pixBuf); - pic[width*y+x] = pal[pixBuf[0]]; - if(maskColors && *maskColors==pixBuf[0]) { - pic[width*y+x].a = 0; - } - } - } - if(maskbitmap) { - if(maskWidth < width && maskHeight < height) { - for(y = 0; y < height; y++) { - for (x = 0; x < width; x++) { - pic[width*y+x].a = maskbitmap[(y*maskHeight/height)*maskWidth+(x*maskWidth/width)]; - } - } - } else { - msg(" resampling %dx%d to mask size (%dx%d)", width, height, maskWidth, maskHeight); - gfxcolor_t*newpic=new gfxcolor_t[maskWidth*maskHeight]; - double dx = width / (double)maskWidth; - double dy = height / (double)maskHeight; - double yy = 0; - for(y = 0; y < maskHeight; y++) { - double xx = 0; - for (x = 0; x < maskWidth; x++) { - newpic[maskWidth*y+x] = pic[int(yy)*width+int(xx)]; - newpic[maskWidth*y+x].a = maskbitmap[maskWidth*y+x]; - xx += dx; - } - yy += dy; - } - delete[] pic; - pic = newpic; - width = maskWidth; - height = maskHeight; - } - } - drawimagelossless(device, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4, config_multiply); - - delete[] pic; - delete imgStr; - if(maskbitmap) free(maskbitmap); - return; - } -} - -void VectorGraphicOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - GBool inlineImg) -{ - if(config_textonly) { - OutputDev::drawImageMask(state,ref,str,width,height,invert,inlineImg); - return; - } - dbg("drawImageMask %dx%d, invert=%d inline=%d", width, height, invert, inlineImg); - msg(" drawImageMask %dx%d, invert=%d inline=%d", width, height, invert, inlineImg); - drawGeneralImage(state,ref,str,width,height,0,invert,inlineImg,1, 0, 0,0,0,0, 0); -} - -void VectorGraphicOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - int *maskColors, GBool inlineImg) -{ - if(config_textonly) { - OutputDev::drawImage(state,ref,str,width,height,colorMap,maskColors,inlineImg); - return; - } - dbg("drawImage %dx%d, %s, %s, inline=%d", width, height, - colorMap?"colorMap":"no colorMap", - maskColors?"maskColors":"no maskColors", - inlineImg); - msg(" drawImage %dx%d, %s, %s, inline=%d", width, height, - colorMap?"colorMap":"no colorMap", - maskColors?"maskColors":"no maskColors", - inlineImg); - if(colorMap) - msg(" colorMap pixcomps:%d bits:%d mode:%d", colorMap->getNumPixelComps(), - colorMap->getBits(),colorMap->getColorSpace()->getMode()); - drawGeneralImage(state,ref,str,width,height,colorMap,0,inlineImg,0,maskColors, 0,0,0,0, 0); -} - -void VectorGraphicOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, int maskWidth, int maskHeight, - GBool maskInvert) -{ - if(config_textonly) { - OutputDev::drawMaskedImage(state,ref,str,width,height,colorMap,maskStr,maskWidth,maskHeight,maskInvert); - return; - } - dbg("drawMaskedImage %dx%d, %s, %dx%d mask", width, height, - colorMap?"colorMap":"no colorMap", - maskWidth, maskHeight); - msg(" drawMaskedImage %dx%d, %s, %dx%d mask", width, height, - colorMap?"colorMap":"no colorMap", - maskWidth, maskHeight); - if(colorMap) - msg(" colorMap pixcomps:%d bits:%d mode:%d", colorMap->getNumPixelComps(), - colorMap->getBits(),colorMap->getColorSpace()->getMode()); - drawGeneralImage(state,ref,str,width,height,colorMap,0,0,0,0, maskStr, maskWidth, maskHeight, maskInvert, 0); -} - -void VectorGraphicOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap) -{ - if(config_textonly) { - OutputDev::drawSoftMaskedImage(state,ref,str,width,height,colorMap,maskStr,maskWidth,maskHeight,maskColorMap); - return; - } - dbg("drawSoftMaskedImage %dx%d, %s, %dx%d mask", width, height, - colorMap?"colorMap":"no colorMap", - maskWidth, maskHeight); - msg(" drawSoftMaskedImage %dx%d, %s, %dx%d mask", width, height, - colorMap?"colorMap":"no colorMap", - maskWidth, maskHeight); - if(colorMap) - msg(" colorMap pixcomps:%d bits:%d mode:%d", colorMap->getNumPixelComps(), - colorMap->getBits(),colorMap->getColorSpace()->getMode()); - drawGeneralImage(state,ref,str,width,height,colorMap,0,0,0,0, maskStr, maskWidth, maskHeight, 0, maskColorMap); -} - - -void VectorGraphicOutputDev::stroke(GfxState *state) -{ - if(config_textonly) {return;} - - dbg("stroke"); - - GfxPath * path = state->getPath(); - gfxline_t*line= gfxPath_to_gfxline(state, path, 0); - strokeGfxline(state, line, 0); - gfxline_free(line); -} - -void VectorGraphicOutputDev::fill(GfxState *state) -{ - if(config_textonly) {return;} - - gfxcolor_t col = gfxstate_getfillcolor(state); - dbg("fill %02x%02x%02x%02x",col.r,col.g,col.b,col.a); - - GfxPath * path = state->getPath(); - gfxline_t*line= gfxPath_to_gfxline(state, path, 1); - if(!config_disable_polygon_conversion) { - gfxline_t*line2 = gfxpoly_circular_to_evenodd(line, DEFAULT_GRID); - gfxline_free(line); - line = line2; - } - fillGfxLine(state, line, 0); - gfxline_free(line); -} - -void VectorGraphicOutputDev::eoFill(GfxState *state) -{ - if(config_textonly) {return;} - - gfxcolor_t col = gfxstate_getfillcolor(state); - dbg("eofill %02x%02x%02x%02x",col.r,col.g,col.b,col.a); - - GfxPath * path = state->getPath(); - gfxline_t*line= gfxPath_to_gfxline(state, path, 1); - fillGfxLine(state, line, 1); - gfxline_free(line); -} - - -void VectorGraphicOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool forSoftMask) -{ - const char*colormodename = ""; - - if(blendingColorSpace) { - colormodename = GfxColorSpace::getColorSpaceModeName(blendingColorSpace->getMode()); - } - dbg("beginTransparencyGroup device=%p %.1f/%.1f/%.1f/%.1f %s isolated=%d knockout=%d forsoftmask=%d", device, bbox[0],bbox[1],bbox[2],bbox[3], colormodename, isolated, knockout, forSoftMask); - msg(" beginTransparencyGroup %.1f/%.1f/%.1f/%.1f %s isolated=%d knockout=%d forsoftmask=%d", bbox[0],bbox[1],bbox[2],bbox[3], colormodename, isolated, knockout, forSoftMask); - - //states[statepos].createsoftmask |= forSoftMask; - states[statepos].createsoftmask = forSoftMask; - states[statepos].transparencygroup = !forSoftMask; - states[statepos].isolated = isolated; - - states[statepos].olddevice = this->device; - this->device = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); - dbg("this->device now %p (old: %p)", this->device, states[statepos].olddevice); - - gfxdevice_record_init(this->device, 0); - - /*if(!forSoftMask) { ////??? - state->setFillOpacity(0.0); - }*/ - dbgindent+=2; -} - -void VectorGraphicOutputDev::endTransparencyGroup(GfxState *state) -{ - dbgindent-=2; - gfxdevice_t*r = this->device; - - dbg("endTransparencyGroup this->device now back to %p (destroying %p)", states[statepos].olddevice, this->device); - - this->device = states[statepos].olddevice; - if(!this->device) { - msg(" Invalid state nesting"); - } - states[statepos].olddevice = 0; - - gfxresult_t*recording = r->finish(r); - - dbg(" forsoftmask=%d recording=%p/%p", states[statepos].createsoftmask, r, recording); - msg(" endTransparencyGroup forsoftmask=%d recording=%p/%p", states[statepos].createsoftmask, r, recording); - - if(states[statepos].createsoftmask) { - states[statepos-1].softmaskrecording = recording; - } else { - states[statepos-1].grouprecording = recording; - } - - states[statepos].createsoftmask = 0; - states[statepos].transparencygroup = 0; - free(r); -} - -void VectorGraphicOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) -{ - const char*blendmodes[] = {"normal","multiply","screen","overlay","darken", "lighten", - "colordodge","colorburn","hardlight","softlight","difference", - "exclusion","hue","saturation","color","luminosity"}; - - dbg("paintTransparencyGroup blend=%s softmaskon=%d recording=%p", blendmodes[state->getBlendMode()], states[statepos].softmask, states[statepos].grouprecording); - msg(" paintTransparencyGroup blend=%s softmaskon=%d", blendmodes[state->getBlendMode()], states[statepos].softmask); - - if(state->getBlendMode() == gfxBlendNormal) - infofeature("transparency groups"); - else { - char buffer[80]; - sprintf(buffer, "%s blended transparency groups", blendmodes[state->getBlendMode()]); - warnfeature(buffer, 0); - } - - gfxresult_t*grouprecording = states[statepos].grouprecording; - - int blendmode = state->getBlendMode(); - if(blendmode == gfxBlendNormal || blendmode == gfxBlendMultiply) { - int alpha = (int)(state->getFillOpacity()*255); - if(blendmode == gfxBlendMultiply && alpha>200) - alpha = 128; - gfxdevice_t ops; - dbg("this->device=%p, this->device->name=%s\n", this->device, this->device->name); - gfxdevice_ops_init(&ops, this->device, alpha); - gfxresult_record_replay(grouprecording, &ops, 0); - ops.finish(&ops); - } - grouprecording->destroy(grouprecording); - - states[statepos].grouprecording = 0; -} - -void VectorGraphicOutputDev::setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *rgb) -{ - if(states[statepos].softmask) { - /* shouldn't happen, but *does* happen */ - clearSoftMask(state); - } - - /* alpha = 1: retrieve mask values from alpha layer - alpha = 0: retrieve mask values from luminance */ - - dbg("setSoftMask %.1f/%.1f/%.1f/%.1f alpha=%d backdrop=%02x%02x%02x", - bbox[0], bbox[1], bbox[2], bbox[3], alpha, colToByte(rgb->c[0]), colToByte(rgb->c[1]), colToByte(rgb->c[2])); - msg(" setSoftMask %.1f/%.1f/%.1f/%.1f alpha=%d backdrop=%02x%02x%02x", - bbox[0], bbox[1], bbox[2], bbox[3], alpha, colToByte(rgb->c[0]), colToByte(rgb->c[1]), colToByte(rgb->c[2])); - if(!alpha) - infofeature("soft masks"); - else - warnfeature("soft masks from alpha channel",0); - - if(states[statepos].olddevice) { - msg(" Internal error: badly balanced softmasks/transparency groups"); - exit(1); - } - states[statepos].olddevice = this->device; - this->device = (gfxdevice_t*)rfx_calloc(sizeof(gfxdevice_t)); - gfxdevice_record_init(this->device, 0); - - dbg("softmaskrecording is %p (dev=%p) at statepos %d\n", states[statepos].softmaskrecording, this->device, statepos); - - states[statepos].softmask = 1; - states[statepos].softmask_alpha = alpha; -} - -static inline Guchar div255(int x) { - return (Guchar)((x + (x >> 8) + 0x80) >> 8); -} - -static unsigned char clampU8(unsigned char c, unsigned char min, unsigned char max) -{ - if(c < min) c = min; - if(c > max) c = max; - return c; -} - -void VectorGraphicOutputDev::clearSoftMask(GfxState *state) -{ - if(!states[statepos].softmask) - return; - states[statepos].softmask = 0; - dbg("clearSoftMask statepos=%d", statepos); - msg(" clearSoftMask statepos=%d", statepos); - - if(!states[statepos].softmaskrecording || strcmp(this->device->name, "record")) { - msg(" Error in softmask/tgroup ordering"); - return; - } - - gfxresult_t*mask = states[statepos].softmaskrecording; - gfxresult_t*below = this->device->finish(this->device);free(this->device); - this->device = states[statepos].olddevice; - - /* get outline of all objects below the soft mask */ - gfxdevice_t uniondev; - gfxdevice_union_init(&uniondev, 0); - gfxresult_record_replay(below, &uniondev, 0); - gfxline_t*belowoutline = gfxdevice_union_getunion(&uniondev); - uniondev.finish(&uniondev); - gfxbbox_t bbox = gfxline_getbbox(belowoutline); - gfxline_free(belowoutline);belowoutline=0; -#if 0 - this->device->startclip(this->device, belowoutline); - gfxresult_record_replay(below, this->device, 0); - gfxresult_record_replay(mask, this->device, 0); - this->device->endclip(this->device); -#endif - - int width = (int)bbox.xmax,height = (int)bbox.ymax; - if(width<=0 || height<=0) - return; - - gfxdevice_t belowrender; - gfxdevice_render_init(&belowrender); - if(states[statepos+1].isolated) { - belowrender.setparameter(&belowrender, "fillwhite", "1"); - } - belowrender.setparameter(&belowrender, "antialize", "2"); - belowrender.startpage(&belowrender, width, height); - gfxresult_record_replay(below, &belowrender, 0); - belowrender.endpage(&belowrender); - gfxresult_t* belowresult = belowrender.finish(&belowrender); - gfximage_t* belowimg = (gfximage_t*)belowresult->get(belowresult,"page0"); - //png_write("below.png", (unsigned char*)belowimg->data, belowimg->width, belowimg->height); - - gfxdevice_t maskrender; - gfxdevice_render_init(&maskrender); - maskrender.startpage(&maskrender, width, height); - gfxresult_record_replay(mask, &maskrender, 0); - maskrender.endpage(&maskrender); - gfxresult_t* maskresult = maskrender.finish(&maskrender); - gfximage_t* maskimg = (gfximage_t*)maskresult->get(maskresult,"page0"); - - if(belowimg->width != maskimg->width || belowimg->height != maskimg->height) { - msg(" Internal error in mask drawing"); - return; - } - - int y,x; - for(y=0;ydata[maskimg->width*y]; - gfxcolor_t* l2 = &belowimg->data[belowimg->width*y]; - for(x=0;xa; - } else { - alpha = (77*l1->r + 151*l1->g + 28*l1->b) >> 8; - } - - l2->a = div255(alpha*l2->a); - - /* DON'T premultiply alpha- this is done by fillbitmap, - depending on the output device */ - //l2->r = div255(alpha*l2->r); - //l2->g = div255(alpha*l2->g); - //l2->b = div255(alpha*l2->b); - - l1++; - l2++; - } - } - gfxline_t*line = gfxline_makerectangle(0,0,width,height); - - gfxmatrix_t matrix; - matrix.m00 = 1.0; matrix.m10 = 0.0; matrix.tx = 0.0; - matrix.m01 = 0.0; matrix.m11 = 1.0; matrix.ty = 0.0; - - if(!config_textonly) { - this->device->fillbitmap(this->device, line, belowimg, &matrix, 0); - } - - mask->destroy(mask); - below->destroy(below); - maskresult->destroy(maskresult); - belowresult->destroy(belowresult); - states[statepos].softmaskrecording = 0; -} - -//class MemCheck -//{ -// public: ~MemCheck() -// { -// delete globalParams;globalParams=0; -// Object::memCheck(stderr); -// gMemReport(stderr); -// } -//} myMemCheck; - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.h deleted file mode 100644 index 479d77b91..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/VectorGraphicOutputDev.h +++ /dev/null @@ -1,219 +0,0 @@ -#ifndef __vectorgraphicsoutputdev_h__ -#define __vectorgraphicsoutputdev_h__ - -#include "../gfxdevice.h" -#include "../gfxsource.h" -#include "../gfxtools.h" -#include "../kdtree.h" - -#include "CommonOutputDev.h" -#include "InfoOutputDev.h" -#include "CharOutputDev.h" -#include "PDFDoc.h" -#include "GlobalParams.h" - -class GFXOutputState { - public: - int clipping; - int textRender; - char createsoftmask; - char transparencygroup; - char softmask; - char softmask_alpha; - char isolated; - - gfxbbox_t clipbbox; - - GFXOutputState(); - - gfxresult_t* grouprecording; // for transparency groups - gfxresult_t* softmaskrecording; // for soft masks - - gfxdevice_t* olddevice; - - double *dashPattern; - int dashLength; - double dashStart; - - GfxState*state; -}; - -void addGlobalFont(const char*filename); -void addGlobalLanguageDir(const char*dir); -void addGlobalFontDir(const char*dirname); - -class GFXLink; - -void drawchar_callback(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); -void addfont_callback(gfxdevice_t*dev, gfxfont_t*font); - -class VectorGraphicOutputDev: public CommonOutputDev { -public: - gfxdevice_t* device; - - VectorGraphicOutputDev(InfoOutputDev*info, PDFDoc*doc, int*page2page, int num_pages, int x, int y, int x1, int y1, int x2, int y2); - virtual ~VectorGraphicOutputDev() ; - - virtual void setDevice(gfxdevice_t*dev); - virtual void setParameter(const char*key, const char*value); - - // Start a page. - virtual void beginPage(GfxState *state, int pageNum); - virtual void endPage(); - - virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL); - //----- get info about output device - - // Does this device use upside-down coordinates? - // (Upside-down means (0,0) is the top left corner of the page.) - virtual GBool upsideDown(); - - // Does this device use drawChar() or drawString()? - virtual GBool useDrawChar(); - - //virtual GBool useShadedFills() { return gTrue; } - - //----- link borders - virtual void processLink(Link *link, Catalog *catalog); - virtual void setDefaultCTM(double *ctm); - - //----- save/restore graphics state - virtual void saveState(GfxState *state) ; - virtual void restoreState(GfxState *state) ; - - //----- update graphics state - virtual void updateLineDash(GfxState *state); - virtual void updateFont(GfxState *state); - virtual void updateFontMatrix(GfxState *state); - - //----- path painting - virtual void stroke(GfxState *state) ; - virtual void fill(GfxState *state) ; - virtual void eoFill(GfxState *state) ; - - //----- path clipping - virtual void clip(GfxState *state) ; - virtual void eoClip(GfxState *state) ; - virtual void clipToStrokePath(GfxState *state); - - //----- shaded fills - virtual GBool useTilingPatternFill(); - virtual GBool useShadedFills(); - -virtual POPPLER_TILING_PATERN_RETURN tilingPatternFill(GfxState *state, - POPPLER_TILING_PATERN_GFX - Object *str, - int paintType, Dict *resDict, - double *mat, double *bbox, - int x0, int y0, int x1, int y1, - double xStep, double yStep); - virtual GBool functionShadedFill(GfxState *state, - GfxFunctionShading *shading); - virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading); - virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading); - - //----- text drawing - virtual void beginString(GfxState *state, GString *s) ; - virtual void endString(GfxState *state) ; - virtual void endTextObject(GfxState *state); - virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen); - - //----- image drawing - virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - GBool inlineImg); - virtual void drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - int *maskColors, GBool inlineImg); - virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, int maskWidth, int maskHeight, - GBool maskInvert); - virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap); - - //----- transparency groups and soft masks (xpdf >= ~ 3.01.16) - virtual void beginTransparencyGroup(GfxState *state, double *bbox, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool forSoftMask); - virtual void endTransparencyGroup(GfxState *state); - virtual void paintTransparencyGroup(GfxState *state, double *bbox); - virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, Function *transferFunc, GfxColor *backdropColor); - virtual void clearSoftMask(GfxState *state); - - //----- type 3 chars - virtual GBool beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen); - virtual void endType3Char(GfxState *state); - - virtual void type3D0(GfxState *state, double wx, double wy); - virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); - - char* searchForSuitableFont(GfxFont*gfxFont); - - void finish(); - - virtual GBool useDrawForm(); - virtual void drawForm(Ref id); - virtual GBool needNonText(); - - private: - gfxline_t* gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed); - - void drawGeneralImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap*colorMap, GBool invert, - GBool inlineImg, int mask, int *maskColors, - Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GfxImageColorMap*maskColorMap); - - void strokeGfxline(GfxState *state, gfxline_t*line, int flags); - void clipToGfxLine(GfxState *state, gfxline_t*line, char evenodd); - void fillGfxLine(GfxState *state, gfxline_t*line, char evenodd); - - int currentpage; - char outer_clip_box; //whether the page clip box is still on - GFXOutputState states[64]; - int statepos; - - int type3active; // are we between beginType3()/endType3()? - GfxState *laststate; - - gfxline_t* current_text_stroke; - gfxline_t* current_text_clip; - gfxfont_t* current_gfxfont; - FontInfo*current_fontinfo; - gfxmatrix_t current_font_matrix; - - /* config */ - int config_break_on_warning; - int config_remapunicode; - int config_transparent; - int config_convertgradients; - int config_disable_polygon_conversion; - int config_multiply; - int config_drawonlyshapes; - int config_textonly; - - gfxdevice_t char_output_dev; - CharOutputDev*charDev; - friend void drawchar_callback(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); - friend void addfont_callback(gfxdevice_t*dev, gfxfont_t*font); - gfxfont_t*gfxfont_from_callback; - int glyphnr_from_callback; - gfxcolor_t textcolor_from_callback; - gfxmatrix_t textmatrix_from_callback; -}; - -#endif //__vectorgraphicsoutputdev_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.cc deleted file mode 100644 index 06aad0275..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.cc +++ /dev/null @@ -1,160 +0,0 @@ -/* XMLOutputDev.cc - - This file is part of swftools. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../../config.h" -#include -#include -#include "XMLOutputDev.h" -#include "GfxState.h" -#include "popplercompat.h" -#ifndef HAVE_POPPLER - #include "gfile.h" -#endif - -XMLOutputDev::XMLOutputDev(char*filename) -:TextOutputDev(mktmpname(0), false, false, false) -{ - out = fopen(filename, "wb"); - if(!out) { - perror(filename); - exit(-1); - } - fprintf(out, "\n"); - fprintf(out, "\n"); -} - -XMLOutputDev::~XMLOutputDev() -{ - fprintf(out, "\n"); - fclose(out); -} - -void XMLOutputDev::startPage(int pageNum, GfxState *state) -{ - TextOutputDev::startPage(pageNum, state); - fprintf(out, "\n", pageNum, - state->getPageWidth(), state->getPageHeight()); -} - -void XMLOutputDev::endPage() -{ - TextOutputDev::endPage(); - TextWordList* list = makeWordList(); - int len = list->getLength(); - int i; - - char textTag = 0; - GString*fontname = new GString(); - double fontsize = -99999; - double base = -9999; - double color_r = -1; - double color_g = -1; - double color_b = -1; - for(i=0;iget(i); - GString*newfont = word->getFontName(); - double newsize = word->getFontSize(); -#ifdef HAVE_POPPLER - double newbase = word->getBaseline(); -#else - double newbase = word->base; -#endif - double newcolor_r; - double newcolor_g; - double newcolor_b; - word->getColor(&newcolor_r, &newcolor_g, &newcolor_b); - - if((newfont && newfont->cmp(fontname)) || - newsize != fontsize || - newbase != base || - newcolor_r != color_r || - newcolor_g != color_g || - newcolor_b != color_b - ) - { - TextFontInfo*info = word->getFontInfo(); - if(textTag) - fprintf(out, "\n"); - textTag = 1; - GBool italic = gFalse; - GBool bold = gFalse; - GBool serif = gFalse; - - if(info->isItalic()) italic = gTrue; - if(info->isBold()) bold = gTrue; - if(info->isSerif()) serif = gTrue; - char*name = (char*)""; - if(newfont) { - name = newfont->lowerCase()->getCString(); - if(strlen(name)>7 && name[6]=='+') - name += 7; - if(strstr(name, "ital")) italic = gTrue; - if(strstr(name, "slan")) italic = gTrue; - if(strstr(name, "obli")) italic = gTrue; - if(strstr(name, "bold")) bold = gTrue; - if(strstr(name, "heav")) bold = gTrue; - if(strstr(name, "medi")) bold = gTrue; - if(strstr(name, "serif")) serif = gTrue; - } - - double xMin,yMin,xMax,yMax; - word->getBBox(&xMin, &yMin, &xMax, &yMax); - - int rot = word->getRotation(); - - fprintf(out, "", - name, - newbase, - (rot&1)?yMin:xMin, - (rot&1)?yMin:xMin, - (rot&1)?xMin:yMin, - (rot&1)?yMax:xMax, - (rot&1)?xMax:yMax, - info->isFixedWidth()?"fixed;":"", - serif?"serif;":"", - italic?"italic;":"", - bold?"bold;":"", - newsize, - ((int)(newcolor_r*255))&0xff, - ((int)(newcolor_g*255))&0xff, - ((int)(newcolor_b*255))&0xff - ); - fontname = newfont->copy(); - fontsize = newsize; - base = newbase; - color_r = newcolor_r; - color_g = newcolor_g; - color_b = newcolor_b; - } - char*s = word->getText()->getCString(); - while(*s) { - switch(*s) { - case '<': fprintf(out, "<");break; - case '>': fprintf(out, ">");break; - case '&': fprintf(out, "&");break; - default: fwrite(s, 1, 1, out); - } - s++; - } - if(word->getSpaceAfter()) - fprintf(out, " "); - } - if(textTag) fprintf(out, "\n"); - fprintf(out, "\n"); -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.h deleted file mode 100644 index 414462209..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/XMLOutputDev.h +++ /dev/null @@ -1,35 +0,0 @@ -/* XMLOutputDev.h - - This file is part of swftools. - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __xmloutputdev_h__ -#define __xmloutputdev_h__ - -#include "OutputDev.h" -#include "TextOutputDev.h" - -class XMLOutputDev: public TextOutputDev -{ - public: - XMLOutputDev(char*filename); - virtual void startPage(int pageNum, GfxState *state); - virtual void endPage(); - virtual ~XMLOutputDev(); - private: - FILE*out; -}; -#endif //__xmloutputdev_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/aconf.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/aconf.h deleted file mode 100644 index 53817a488..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/aconf.h +++ /dev/null @@ -1,28 +0,0 @@ -/* aconf.h. Generated by configure. */ -/* - * aconf.h - * - * Copyright 2002 Glyph & Cog, LLC - */ - -#ifndef ACONF_H -#define ACONF_H -#include "../../config.h" - -#define SYSTEM_XPDFRC "/etc/xpdf/xpdfrc" - -#define HAVE_STRINGS_H 1 - -#define TEXTOUT_WORD_LIST 1 - -// todo: -// -// HAVE_STRINGS_H -// HAVE_BSTRING_H -// HAVE_SYS_SELECT_H -// SELECT_TAKES_INT -// HAVE_FSEEK64 -// HAVE_MKSTEMPS -// HAVE_FSEEKO 1 - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.c b/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.c deleted file mode 100644 index ac7285cc4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.c +++ /dev/null @@ -1,481 +0,0 @@ -#include -#include -#include -#include -#include -#include "../types.h" -#include "../mem.h" - -typedef struct _ibbox { - int xmin,ymin,xmax,ymax; - struct _ibbox*next; -} ibbox_t; - -ibbox_t* ibbox_new(int x1, int y1, int x2, int y2) -{ - ibbox_t*b = (ibbox_t*)rfx_calloc(sizeof(ibbox_t)); - b->xmin = x1; - b->ymin = y1; - b->xmax = x2; - b->ymax = y2; - return b; -} - -void ibbox_destroy(ibbox_t*b) -{ - while(b) { - ibbox_t*next = b->next; - free(b); - b = next; - } -} - -ibbox_t*get_bitmap_bboxes_simple(unsigned char*alpha, int width, int height, int rowsize) -{ - int ymin = -1; - int ymax = -1; - int xmin = width; - int xmax = 0; - - int x,y; - for(y=0;yxmax) xmax = right; - } - } - ibbox_t* bbox = 0; - if(xminwidth*y+x; - head_t*h = rfx_calloc(sizeof(head_t)); - h->magic = HEAD_MAGIC; - h->nr = context->count++; - h->pos = pos; - h->x = x; - h->y = y; - h->bbox.xmin = h->bbox.xmax = x; - h->bbox.ymin = h->bbox.ymax = y; - h->next = context->heads; - context->heads = h; - if(h->next) { - h->next->prev = h; - } - return h; -} - -static void head_delete(context_t*context, head_t*h) -{ - if(h->prev) { - h->prev->next = h->next; - } - if(h->next) { - h->next->prev = h->prev; - } - if(h==context->heads) { - assert(!h->prev); - context->heads = h->next; - } - free(h); -} - -#define POINTS_TO_HEAD(ptr) (((head_t*)(ptr))->magic==HEAD_MAGIC) - -static inline void link_to(context_t*context, int from, int to) -{ - // path compression - void**data = context->group; - int head = to; - assert(data[head]); - while(!POINTS_TO_HEAD(data[head])) { - assert(data[head]!=(void*)&data[head]); // check that we're not in an infinite loop - head=(void**)data[head]-(void**)data; - } - head_t*h = (head_t*)data[head]; - int x = from%context->width; - int y = from/context->width; - if(x < h->bbox.xmin) h->bbox.xmin = x; - if(y < h->bbox.ymin) h->bbox.ymin = y; - if(x > h->bbox.xmax) h->bbox.xmax = x; - if(y > h->bbox.ymax) h->bbox.ymax = y; - - data[from] = (void*)&data[head]; -} -static char ibbox_does_overlap(ibbox_t*b1, ibbox_t*b2) -{ - if(b1->xmax < b2->xmin) return 0; - if(b2->xmax < b1->xmin) return 0; - if(b1->ymax < b2->ymin) return 0; - if(b2->ymax < b1->ymin) return 0; - return 1; -} -static void ibbox_expand(ibbox_t*src, ibbox_t*add) -{ - if(add->xmin < src->xmin) - src->xmin = add->xmin; - if(add->ymin < src->ymin) - src->ymin = add->ymin; - if(add->xmax > src->xmax) - src->xmax = add->xmax; - if(add->ymax > src->ymax) - src->ymax = add->ymax; -} -static inline void merge(context_t*context, int set1, int set2) -{ - void**data = context->group; - assert(data[set1]); - assert(data[set2]); - int head1 = set1; - int head2 = set2; - while(!POINTS_TO_HEAD(data[head1])) { - head1=(void**)data[head1]-(void**)data; - } - while(!POINTS_TO_HEAD(data[head2])) { - head2=(void**)data[head2]-(void**)data; - } - head_t*h1 = (head_t*)data[head1]; - head_t*h2 = (head_t*)data[head2]; - if(h1==h2) - return; - - if(h1->rank>h2->rank) { - h1->rank++; - ibbox_expand(&h1->bbox,&h2->bbox); - data[head2] = (void*)&data[head1]; - head_delete(context, h2); - } else { - h2->rank++; - ibbox_expand(&h2->bbox,&h1->bbox); - data[head1] = (void*)&data[head2]; - head_delete(context, h1); - } -} - -ibbox_t ibbox_clip(ibbox_t* outer, ibbox_t* inner) -{ - ibbox_t i = {inner->xmin, inner->ymin, inner->xmax, inner->ymax, 0}; - if(i.xmax > outer->xmax) i.xmax = outer->xmax; - if(i.ymax > outer->ymax) i.ymax = outer->ymax; - if(i.xmax < outer->xmin) i.xmax = outer->xmin; - if(i.ymax < outer->ymin) i.ymax = outer->ymin; - - if(i.xmin > outer->xmax) i.xmin = outer->xmax; - if(i.ymin > outer->ymax) i.ymin = outer->ymax; - if(i.xmin < outer->xmin) i.xmin = outer->xmin; - if(i.ymin < outer->ymin) i.ymin = outer->ymin; - return i; -} - -static void** annotate(context_t*context) -{ - unsigned char*alpha = context->alpha; - int width = context->width; - int height = context->height; - void** group = rfx_calloc(width*height*sizeof(void*)); - context->group = group; - int x,y; - - for(x=1;xrowsize; - if(alpha[apos]) { - if(group[pos-width]) - link_to(context,pos,pos-width); - else - group[pos]=head_new(context,0,y); - } - for(x=1;xheads; - changed = 0; - while(h1) { - head_t*next = h1->next; - head_t*h2 = context->heads; - while(h2) { - if(h1!=h2) { - if(ibbox_does_overlap(&h1->bbox, &h2->bbox)) { - merge(context, h1->pos, h2->pos); - changed = 1; - break; - } - } - h2 = h2->next; - } - h1 = next; - } - } while(changed); -} - -typedef struct _circle_coord { - S16 x,y; -} circle_coord_t; - -static int compare_circle_coord(const void *_v1, const void *_v2) -{ - circle_coord_t*v1=(circle_coord_t*)_v1; - circle_coord_t*v2=(circle_coord_t*)_v2; - return (v1->x*v1->x + v1->y*v1->y) - (v2->x*v2->x + v2->y*v2->y); -} - -static head_t* search_vicinity(context_t*context, head_t*h, int max_radius, double*cos, double*sin) -{ - static circle_coord_t*circle_order = 0; - static int circle_order_size = 0; - - if(!circle_order) { - circle_order_size = (max_radius*(max_radius+1))/2; - circle_order = malloc(sizeof(circle_coord_t)*circle_order_size); - int x,y; - int i = 0; - for(y=0;ygroup; - int signx[4] = {-1,1,-1,1}; - int signy[4] = {-1,-1,1,1}; - for(t=1;tx+xx*signx[s]; - int y=h->y+yy*signy[s]; - if(x>=0 && y>=0 && xwidth && yheight) { - int pos = y*context->width+x; - if(data[pos]) { - while(!POINTS_TO_HEAD(data[pos])) { - pos=(void**)data[pos]-(void**)data; - } - head_t*new_head = (head_t*)data[pos]; - if(new_head != h) { - return new_head; - } - } - } - } - } - return 0; -} - -static void fix_small_boxes(context_t*context) -{ - double sintab[256]; - double costab[256]; - int t; - for(t=0;t<256;t++) { - sintab[t] = sin(t*M_PI/128); - costab[t] = cos(t*M_PI/128); - } - - head_t*h = context->heads; - while(h) { - h->seen = 0; - h = h->next; - } - - char changed; - do { - changed = 0; - head_t*h = context->heads; - while(h) { - head_t*next = h->next; - if(!h->seen) { - if(h->bbox.xmax - h->bbox.xmin < 32 - || h->bbox.ymax - h->bbox.ymin < 32) { - head_t*other = search_vicinity(context, h, 64, costab, sintab); - if(other) { - merge(context, h->pos, other->pos); - changed = 1; - break; - } else { - //printf("nothing in the vicinity of %d,%d,%d,%d\n", h->bbox); - h->seen = 1; - } - } /*else { - printf("area %d,%d,%d,%d is large enough (%dx%d)\n", - h->bbox.xmin, - h->bbox.ymin, - h->bbox.xmax, - h->bbox.ymax, - h->bbox.xmax - h->bbox.xmin, - h->bbox.ymax - h->bbox.ymin); - } */ - } - h = next; - } - } while(changed); -} - -static void display(context_t*context) -{ - int width = context->width; - int height = context->height; - void**group = context->group; - - int x,y; - for(y=0;ynr); - } else { - printf("x%02d ", (void**)group[y*width+x]-(void**)group); - } - } - printf("\n"); - } - - head_t*h = context->heads; - while(h) { - printf("head: %d\n", h->nr); - printf(" pos: %d/%d\n", h->pos%width, h->pos/width); - printf(" bbox: [%d/%d,%d/%d]\n", h->bbox.xmin, h->bbox.ymin, h->bbox.xmax, h->bbox.ymax); - h = h->next; - } -} - -ibbox_t*get_bitmap_bboxes(unsigned char*alpha, int width, int height, int rowsize) -{ - int size = width*height; - if(width<=1 || height<=1) - return get_bitmap_bboxes_simple(alpha, width, height, rowsize); - - context_t context; - context.alpha = alpha; - context.rowsize = rowsize; - context.width = width; - context.height = height; - context.heads = 0; - context.count = 1; - - void**group = annotate(&context); - fix_small_boxes(&context); - overlap_bboxes(&context); -#ifdef MAIN - display(&context); -#endif - - ibbox_t*bboxes = 0; - - head_t*h = context.heads; - while(h) { - head_t*next = h->next; - ibbox_t*bbox = malloc(sizeof(ibbox_t)); - memcpy(bbox, &h->bbox, sizeof(ibbox_t)); - - /* ibbox_t defines the open upper bound */ - bbox->xmax++; - bbox->ymax++; - - bbox->next = bboxes; - bboxes = bbox; - free(h); - h = next; - } - free(context.group); - return bboxes; -} - -#ifdef MAIN -int main(int argn, char*argv[]) -{ - unsigned char alpha[8*8]= - "\0\0\1\0\0\0\0\0" - "\1\0\0\1\0\1\0\0" - "\0\0\0\0\0\0\1\0" - "\0\0\1\0\1\0\0\0" - "\1\0\1\0\1\0\0\0" - "\1\0\1\1\1\0\0\1" - "\1\0\0\0\0\0\1\0" - "\1\1\1\0\0\0\0\0"; - - get_bitmap_bboxes(alpha, 8,8, 8); -} -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.h deleted file mode 100644 index 8ee94872e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/bbox.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef __bbox_h__ -#define __bbox_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _ibbox { - int xmin,ymin,xmax,ymax; - struct _ibbox*next; -} ibbox_t; - -ibbox_t ibbox_clip(ibbox_t* outer, ibbox_t* inner); - -ibbox_t* ibbox_new(int x1, int y1, int x2, int y2, int rowsize); -void ibbox_destroy(ibbox_t*b); -ibbox_t*get_bitmap_bboxes(unsigned char*alpha, int width, int height, int rowsize); - -#ifdef __cplusplus -} -#endif - -#endif //__bbox_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.cc deleted file mode 100644 index c74f743bc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.cc +++ /dev/null @@ -1,661 +0,0 @@ -#include -#include -#include -#include "GfxState.h" -static struct _rgb {unsigned char r,g,b;} -cmyk2rgb[8*16*16*8] = { -{255,255,255},{222,223,225},{191,192,195},{162,164,167},{133,135,138},{106,107,110},{73,74,75},{34,30,31},{255,254,241},{223,222,212},{192,191,184},{163,163,157},{134,134,129},{107,106,103},{74,73,70},{33,29,27},{255,253,227},{223,221,199},{192,191,174},{163,163,147},{135,134,121},{107,106,96},{74,73,65},{33,29,23},{255,252,214},{224,220,188},{193,190,164},{164,162,140},{135,133,115},{107,105,90},{74,72,61},{32,28,19}, -{255,251,201},{225,220,177},{193,190,154},{164,162,132},{135,133,108},{107,105,85},{74,72,56},{32,28,15},{255,250,187},{226,219,165},{194,189,144},{164,161,122},{135,132,100},{107,104,79},{74,72,52},{31,28,9},{255,249,173},{227,219,154},{195,189,134},{164,160,113},{135,132,92},{107,104,72},{74,72,47},{31,28,5},{255,248,160},{226,218,142},{195,188,123},{165,159,104},{135,131,85},{107,103,65},{74,71,41},{30,27,2}, -{255,247,147},{227,216,130},{196,187,112},{165,158,95},{135,131,77},{107,103,59},{74,71,35},{29,26,0},{255,246,133},{228,215,117},{197,186,101},{165,157,86},{135,130,69},{107,103,52},{74,70,29},{28,26,0},{255,245,117},{228,214,103},{196,186,90},{165,157,76},{135,130,60},{107,103,44},{74,70,21},{27,26,0},{255,244,100},{227,214,89},{195,185,78},{165,157,65},{135,129,50},{107,102,35},{73,70,12},{26,26,0}, -{255,244,78},{227,213,72},{195,184,62},{165,156,51},{135,129,38},{107,102,22},{73,70,6},{25,26,0},{255,243,54},{228,212,52},{196,183,44},{165,155,36},{135,128,24},{107,101,7},{72,69,1},{24,25,0},{255,242,27},{228,212,27},{196,183,22},{165,155,18},{135,128,12},{107,101,3},{72,69,0},{24,25,0},{255,241,0},{227,212,0},{195,182,0},{165,154,0},{136,127,0},{107,100,0},{72,69,0},{24,25,0}, -{253,241,246},{220,210,216},{190,182,189},{161,154,161},{133,127,133},{106,101,105},{74,69,72},{34,26,28},{254,240,232},{221,209,204},{191,181,178},{162,154,152},{133,127,125},{106,100,99},{74,68,67},{33,25,24},{254,239,219},{222,209,193},{191,181,168},{162,154,143},{134,127,117},{106,100,92},{74,68,62},{33,25,20},{254,238,207},{222,208,182},{192,180,159},{163,153,135},{134,126,111},{106,99,87},{74,67,58},{32,24,16}, -{254,237,194},{223,207,172},{192,179,149},{163,153,127},{134,126,104},{106,99,82},{74,67,53},{32,24,11},{255,236,181},{224,206,160},{193,178,140},{163,152,118},{134,125,97},{106,98,76},{73,67,49},{31,24,6},{255,235,168},{225,206,149},{193,178,130},{163,151,110},{134,124,89},{106,98,69},{73,67,44},{31,23,2},{255,234,155},{225,205,137},{194,177,119},{164,150,101},{134,124,82},{106,97,62},{73,66,38},{30,23,1}, -{255,233,143},{225,204,126},{194,176,108},{164,149,92},{134,124,74},{106,97,56},{73,66,32},{29,22,0},{255,232,129},{226,203,114},{195,176,98},{164,148,83},{134,123,66},{106,97,49},{73,65,26},{28,22,0},{255,231,114},{226,202,100},{194,176,88},{164,148,73},{134,123,57},{106,97,41},{73,65,19},{27,22,0},{255,230,98},{226,202,86},{194,175,76},{164,148,63},{134,122,48},{106,96,32},{72,65,10},{26,22,0}, -{255,230,77},{226,201,70},{194,174,61},{164,147,49},{134,122,36},{106,96,20},{72,65,5},{26,22,0},{255,229,56},{226,200,53},{194,173,45},{164,146,35},{134,121,22},{106,95,6},{72,64,0},{25,21,0},{255,229,28},{226,200,28},{194,173,23},{164,146,17},{134,121,11},{106,95,2},{72,64,0},{25,21,0},{255,228,0},{226,200,1},{194,172,2},{164,146,0},{135,120,0},{106,94,0},{72,64,0},{24,21,0}, -{252,226,237},{219,197,207},{189,172,182},{161,145,155},{133,119,128},{106,94,101},{75,63,70},{34,21,26},{253,225,224},{220,197,196},{190,171,172},{162,145,146},{133,119,121},{105,93,95},{74,62,65},{33,20,22},{254,224,211},{221,197,186},{191,171,162},{162,145,138},{133,119,114},{105,93,89},{74,62,59},{33,20,16},{254,223,199},{221,196,176},{192,170,153},{162,144,130},{133,118,108},{105,92,84},{74,61,55},{32,20,12}, -{254,222,187},{221,195,166},{192,169,144},{162,144,122},{133,118,101},{105,92,79},{74,61,51},{32,20,8},{255,221,175},{223,194,154},{192,168,135},{163,143,115},{133,117,94},{105,91,73},{73,61,46},{31,19,3},{255,220,162},{224,194,144},{192,168,126},{163,142,107},{133,116,86},{105,91,67},{73,61,41},{31,18,0},{255,219,150},{224,193,133},{193,167,115},{163,141,98},{134,116,79},{106,91,60},{73,60,36},{30,18,0}, -{255,219,138},{224,192,122},{193,166,105},{163,141,89},{134,116,72},{106,91,54},{73,60,30},{29,18,0},{255,218,126},{224,191,111},{193,166,96},{163,140,81},{134,115,64},{106,90,47},{73,60,24},{28,17,0},{255,218,111},{225,191,98},{193,166,86},{163,140,71},{134,115,55},{106,90,39},{73,60,17},{27,17,0},{255,217,96},{226,190,84},{194,165,75},{164,140,61},{134,114,46},{106,89,30},{72,59,8},{26,17,0}, -{255,217,77},{226,190,69},{194,165,60},{164,139,48},{134,114,34},{106,89,18},{72,59,4},{26,17,0},{255,216,57},{225,189,53},{193,164,45},{163,138,34},{133,113,21},{105,88,6},{72,59,0},{25,17,0},{255,216,30},{225,189,28},{193,164,24},{163,138,17},{133,113,10},{105,88,2},{72,59,0},{25,17,0},{255,215,1},{226,188,3},{194,163,3},{163,138,0},{134,113,0},{106,88,0},{72,59,0},{24,16,0}, -{250,214,229},{217,186,201},{188,162,176},{160,137,151},{133,112,124},{105,88,97},{74,59,66},{34,15,22},{251,212,217},{218,185,190},{189,161,167},{161,137,142},{133,112,117},{105,87,91},{73,58,61},{34,15,18},{252,211,204},{219,185,180},{190,161,158},{161,137,134},{133,112,110},{105,87,85},{73,58,56},{34,15,12},{252,211,193},{220,184,170},{190,160,149},{161,136,126},{132,111,104},{105,86,81},{73,57,52},{33,15,8}, -{253,210,181},{220,184,161},{190,160,140},{161,135,118},{132,111,97},{105,86,75},{73,57,48},{32,15,4},{253,209,169},{221,183,150},{191,159,131},{162,135,111},{132,110,90},{104,85,69},{73,57,44},{32,14,2},{253,208,158},{221,183,140},{191,159,122},{162,135,103},{132,110,83},{104,85,63},{73,57,39},{32,14,0},{254,207,146},{222,182,129},{191,158,112},{162,134,95},{133,109,76},{105,85,57},{73,56,33},{31,14,0}, -{254,207,134},{222,182,118},{191,157,103},{162,134,87},{133,109,70},{105,85,51},{73,56,27},{30,14,0},{254,206,122},{223,181,108},{191,157,94},{162,133,79},{133,108,62},{105,84,45},{73,56,22},{29,13,0},{254,206,108},{223,181,96},{191,156,83},{162,133,69},{133,108,53},{105,84,37},{73,56,15},{28,13,0},{254,205,94},{223,180,83},{192,155,72},{162,132,59},{133,108,44},{105,84,28},{72,55,6},{27,13,0}, -{254,205,76},{223,180,68},{192,155,58},{162,132,46},{133,108,33},{105,84,17},{72,55,3},{27,13,0},{255,204,58},{223,179,53},{191,155,44},{162,131,33},{133,107,20},{105,84,5},{72,55,0},{26,13,0},{255,204,34},{223,179,30},{191,155,25},{162,131,18},{133,107,10},{105,84,2},{72,55,0},{26,13,0},{254,203,9},{224,178,7},{192,154,5},{162,130,1},{133,106,0},{105,83,0},{72,55,0},{25,12,0}, -{249,201,221},{216,175,194},{188,151,170},{160,129,146},{133,105,120},{105,81,94},{74,54,63},{34,10,19},{250,199,209},{217,174,183},{189,150,161},{161,129,137},{133,105,113},{105,81,88},{73,53,58},{34,10,14},{250,198,197},{218,174,173},{189,150,152},{161,129,129},{133,105,106},{105,81,82},{73,53,53},{34,10,8},{251,198,186},{219,173,164},{189,150,144},{160,128,122},{132,104,100},{105,81,78},{73,52,49},{33,10,5}, -{252,198,175},{220,173,156},{189,150,135},{160,127,114},{132,103,94},{105,81,72},{73,52,45},{32,10,2},{252,197,164},{219,172,146},{190,149,126},{161,127,107},{132,103,87},{104,80,66},{73,52,41},{32,9,1},{252,196,153},{219,172,136},{191,149,118},{161,127,99},{132,103,80},{104,80,60},{73,52,36},{32,9,0},{252,195,142},{220,171,125},{190,148,109},{161,126,92},{132,102,73},{104,80,54},{73,52,30},{31,9,0}, -{252,195,130},{221,171,115},{190,148,100},{161,126,84},{132,102,67},{104,80,48},{73,52,24},{30,9,0},{253,194,118},{221,170,105},{190,147,91},{162,125,76},{133,101,60},{105,79,42},{73,51,19},{29,9,0},{253,194,105},{221,170,93},{190,147,80},{162,125,66},{133,101,51},{105,79,35},{73,51,13},{28,9,0},{253,193,91},{221,169,81},{191,146,69},{161,124,56},{132,101,43},{104,79,27},{72,51,5},{27,8,0}, -{253,193,76},{221,169,68},{191,146,57},{161,124,45},{132,101,32},{104,79,17},{72,51,2},{27,8,0},{254,192,59},{222,168,53},{190,146,44},{162,123,33},{133,100,20},{105,78,5},{72,51,0},{26,9,0},{254,192,38},{222,168,32},{190,146,25},{162,123,18},{133,100,10},{105,78,2},{72,51,0},{26,9,0},{253,191,16},{222,167,12},{190,145,7},{161,122,2},{133,99,0},{105,78,0},{72,51,0},{26,8,0}, -{247,187,214},{215,164,187},{187,141,164},{159,120,140},{132,98,115},{104,75,90},{73,48,60},{34,4,15},{248,185,202},{216,163,177},{188,140,155},{159,119,132},{132,98,108},{104,75,84},{73,47,55},{34,4,10},{249,184,190},{217,162,167},{188,140,146},{159,119,124},{132,98,101},{104,75,78},{73,47,51},{34,4,6},{250,184,179},{218,161,158},{188,140,138},{159,119,117},{131,97,96},{105,75,74},{74,47,47},{33,4,3}, -{250,184,169},{218,161,150},{188,140,130},{159,118,110},{131,96,90},{105,75,70},{74,47,43},{33,4,1},{250,183,158},{218,160,140},{189,139,122},{160,118,103},{131,96,84},{104,74,64},{73,47,39},{32,3,0},{250,183,147},{218,160,130},{189,139,114},{160,118,95},{131,96,77},{104,74,58},{73,47,34},{32,3,0},{250,182,136},{219,159,121},{189,138,105},{160,117,88},{132,95,70},{104,74,52},{72,46,28},{31,3,0}, -{250,181,126},{220,159,111},{189,138,96},{160,117,80},{132,95,64},{104,74,46},{72,46,22},{29,3,0},{251,180,114},{219,159,101},{189,137,87},{161,116,73},{132,94,57},{104,73,40},{73,46,17},{28,3,0},{251,180,102},{219,159,91},{189,137,78},{161,116,64},{132,94,49},{104,73,33},{73,46,11},{28,3,0},{251,179,89},{219,158,79},{189,136,67},{160,115,54},{131,94,41},{104,73,25},{72,46,4},{28,3,0}, -{251,179,75},{219,158,66},{189,136,55},{160,115,44},{131,94,30},{104,73,15},{72,46,1},{28,3,0},{252,179,60},{220,157,52},{189,136,43},{160,114,32},{132,93,18},{104,72,4},{72,46,0},{27,3,0},{252,179,41},{220,157,34},{189,136,26},{160,114,17},{132,93,9},{104,72,2},{72,46,0},{27,3,0},{251,178,22},{220,156,16},{189,135,9},{160,114,2},{132,93,0},{104,72,0},{71,46,0},{27,3,0}, -{246,173,206},{214,152,181},{186,131,158},{158,111,135},{131,90,110},{104,69,86},{73,42,57},{34,0,11},{247,172,194},{215,152,171},{187,130,149},{158,110,127},{131,90,104},{104,69,81},{73,42,52},{34,0,7},{247,171,182},{215,151,161},{187,130,140},{158,110,119},{131,90,97},{104,69,75},{73,42,48},{34,0,3},{248,170,173},{216,150,152},{187,130,133},{159,110,112},{131,89,93},{105,69,71},{74,42,44},{33,0,2}, -{248,170,163},{216,150,144},{187,130,125},{159,110,106},{131,89,87},{105,69,67},{74,42,40},{33,0,0},{248,170,153},{217,149,135},{187,129,118},{159,109,99},{131,88,81},{104,68,61},{73,42,36},{32,0,0},{248,170,142},{217,149,126},{187,129,110},{159,109,92},{131,88,74},{104,68,56},{73,42,31},{32,0,0},{248,169,132},{217,148,117},{188,128,101},{160,108,85},{132,88,67},{104,68,50},{72,41,25},{31,0,0}, -{249,169,122},{218,148,107},{188,128,93},{160,108,77},{132,88,61},{104,68,44},{72,41,20},{29,0,0},{250,168,111},{217,148,98},{188,127,84},{160,107,70},{132,87,54},{104,67,38},{73,41,15},{28,0,0},{250,168,99},{217,148,88},{188,127,75},{160,107,61},{132,87,47},{104,67,31},{73,41,9},{28,0,0},{249,167,87},{217,147,77},{188,126,65},{160,106,52},{131,87,39},{104,67,23},{72,41,4},{28,0,0}, -{249,167,73},{217,147,64},{188,126,53},{160,106,42},{131,87,28},{104,67,14},{72,41,1},{28,0,0},{250,166,59},{218,146,51},{188,126,42},{159,106,31},{131,86,17},{103,66,4},{72,41,0},{27,0,0},{250,166,43},{218,146,35},{188,126,27},{159,106,17},{131,86,9},{103,66,2},{72,41,0},{27,0,0},{249,165,27},{218,145,19},{188,125,11},{159,106,3},{132,86,0},{104,66,0},{71,41,0},{27,0,0}, -{245,160,198},{213,140,174},{185,121,152},{157,102,130},{130,83,106},{104,62,83},{73,37,54},{34,0,8},{246,159,187},{214,140,164},{186,120,143},{157,101,122},{131,82,100},{104,62,78},{73,37,49},{34,0,4},{246,159,175},{214,140,155},{186,120,135},{157,101,114},{131,82,94},{104,62,72},{73,37,46},{34,0,1},{247,158,166},{215,139,147},{186,120,128},{158,101,108},{130,82,89},{104,62,68},{73,37,42},{33,0,1}, -{247,158,158},{215,139,139},{186,120,121},{158,101,102},{130,82,84},{104,62,64},{73,37,38},{33,0,0},{246,157,148},{216,138,130},{186,119,114},{158,100,95},{131,81,78},{103,61,58},{72,37,33},{32,0,0},{246,157,138},{216,138,122},{186,119,106},{158,100,88},{131,81,71},{103,61,53},{72,37,28},{32,0,0},{247,157,129},{216,137,113},{187,118,98},{159,99,81},{131,81,65},{103,61,48},{71,36,23},{31,0,0}, -{248,157,119},{216,137,104},{187,118,90},{159,99,74},{131,81,59},{103,61,42},{71,36,18},{30,0,0},{249,156,108},{216,137,95},{187,118,82},{159,99,67},{131,80,52},{103,61,35},{72,36,12},{29,0,0},{249,156,97},{216,137,85},{187,118,73},{159,99,60},{131,80,44},{103,61,28},{72,36,8},{29,0,0},{248,155,85},{216,136,75},{187,117,63},{159,99,51},{131,80,37},{103,61,21},{72,36,3},{28,0,0}, -{248,155,72},{216,136,63},{187,117,52},{159,99,41},{131,80,27},{103,61,13},{72,36,1},{28,0,0},{248,154,58},{217,135,50},{187,117,41},{158,98,30},{130,79,16},{103,60,3},{71,36,0},{27,0,0},{248,154,43},{217,135,36},{187,117,28},{158,98,18},{130,79,8},{103,60,1},{71,36,0},{27,0,0},{248,153,28},{216,134,22},{187,116,15},{158,98,5},{131,79,0},{103,60,0},{71,36,0},{26,0,0}, -{243,147,190},{212,128,168},{184,111,146},{157,93,124},{130,75,102},{104,56,79},{73,30,51},{34,0,4},{244,147,179},{213,128,158},{185,110,138},{157,93,118},{131,74,96},{104,56,74},{73,31,47},{34,0,2},{244,147,169},{213,128,149},{185,110,130},{157,93,110},{131,74,90},{104,56,69},{73,31,43},{34,0,0},{245,146,160},{214,127,141},{185,110,124},{157,93,104},{130,75,85},{104,56,65},{73,31,39},{33,0,0}, -{245,146,152},{214,127,133},{185,110,117},{157,93,98},{130,75,80},{104,56,60},{73,31,35},{33,0,0},{244,145,142},{214,127,125},{184,109,110},{156,92,91},{130,74,74},{103,55,55},{72,31,31},{32,0,0},{244,144,133},{214,127,117},{184,109,102},{156,92,84},{130,74,68},{103,55,50},{72,31,26},{31,0,0},{245,145,124},{215,126,109},{185,108,94},{157,91,77},{130,73,62},{102,55,45},{71,30,21},{31,0,0}, -{246,145,115},{215,126,100},{185,108,86},{157,91,71},{130,73,56},{102,55,40},{71,30,16},{30,0,0},{247,144,105},{214,125,92},{185,108,79},{157,91,65},{130,73,50},{103,55,33},{72,31,10},{29,0,0},{247,144,94},{214,125,83},{185,108,71},{157,91,58},{130,73,42},{103,55,26},{72,31,6},{29,0,0},{246,143,83},{214,125,73},{185,108,61},{157,91,49},{130,73,35},{103,55,19},{72,31,2},{28,0,0}, -{246,143,70},{214,125,61},{185,108,50},{157,91,39},{130,73,25},{103,55,11},{72,31,1},{28,0,0},{246,142,57},{215,124,49},{185,107,40},{157,90,28},{130,73,14},{103,54,3},{71,30,0},{27,0,0},{246,142,44},{215,124,37},{185,107,29},{157,90,18},{130,73,7},{103,54,1},{71,30,0},{27,0,0},{246,141,30},{215,124,24},{185,107,18},{157,90,6},{130,72,0},{103,54,0},{71,30,0},{26,0,0}, -{242,135,182},{211,116,161},{183,101,140},{156,84,119},{130,67,98},{103,49,75},{72,23,48},{35,0,1},{243,134,172},{212,116,151},{184,101,133},{156,84,113},{130,67,92},{103,49,71},{72,24,44},{34,0,1},{243,134,162},{212,116,142},{184,101,125},{156,84,106},{130,67,86},{103,49,66},{72,24,40},{33,0,0},{244,134,154},{213,116,135},{184,101,119},{156,84,100},{130,67,81},{103,49,62},{72,24,36},{32,0,0}, -{244,134,146},{213,116,128},{184,101,112},{156,84,94},{130,67,76},{103,49,57},{72,24,32},{32,0,0},{243,133,137},{213,116,120},{183,100,105},{155,83,88},{129,67,70},{102,49,52},{71,24,28},{31,0,0},{243,132,128},{213,116,112},{183,100,97},{155,83,81},{129,67,65},{102,49,47},{71,24,23},{30,0,0},{244,132,119},{214,115,105},{184,99,90},{156,83,74},{129,66,59},{103,48,42},{72,24,19},{30,0,0}, -{245,132,110},{214,115,96},{184,99,83},{156,83,68},{129,66,53},{103,48,37},{72,24,14},{30,0,0},{245,132,101},{213,114,89},{184,99,76},{156,83,62},{130,66,48},{102,48,32},{71,25,7},{29,0,0},{245,132,91},{213,114,80},{184,99,68},{156,83,55},{130,66,41},{102,48,25},{71,25,4},{29,0,0},{245,131,81},{213,115,70},{184,99,59},{156,82,47},{129,66,34},{102,48,18},{71,25,1},{28,0,0}, -{245,131,69},{213,115,60},{184,99,49},{156,82,38},{129,66,24},{102,48,10},{71,25,1},{28,0,0},{245,130,56},{214,114,48},{184,98,39},{156,82,27},{129,66,13},{102,48,3},{71,25,0},{28,0,0},{245,130,45},{214,114,37},{184,98,29},{156,82,17},{129,66,6},{102,48,1},{71,25,0},{28,0,0},{245,130,32},{214,114,25},{184,98,19},{156,81,6},{129,65,0},{102,48,0},{70,25,0},{27,0,0}, -{242,121,175},{211,104,154},{183,90,135},{156,74,114},{129,58,93},{103,41,72},{72,14,45},{33,0,0},{242,120,165},{211,104,145},{183,90,128},{156,74,108},{130,58,88},{103,41,68},{72,15,41},{32,0,0},{242,120,156},{211,104,137},{183,90,120},{156,74,102},{130,58,82},{103,41,63},{72,15,37},{31,0,0},{242,120,148},{212,104,130},{184,90,114},{156,74,96},{129,58,78},{103,42,59},{72,15,33},{31,0,0}, -{242,120,140},{212,104,123},{184,90,107},{156,74,90},{129,58,73},{103,42,54},{72,15,29},{31,0,0},{242,119,132},{212,104,115},{183,90,101},{155,74,85},{129,58,67},{102,42,49},{71,16,25},{30,0,0},{242,119,123},{212,104,107},{183,90,93},{155,74,78},{129,58,62},{102,42,44},{71,16,20},{29,0,0},{243,119,115},{213,103,100},{183,89,86},{155,74,71},{129,58,56},{102,41,39},{71,16,16},{29,0,0}, -{243,119,106},{213,103,93},{183,88,80},{156,74,65},{129,58,50},{102,41,34},{71,16,11},{29,0,0},{243,118,97},{212,103,86},{184,89,73},{156,74,59},{129,58,45},{102,41,29},{71,17,5},{28,0,0},{243,118,88},{212,103,77},{184,89,65},{156,74,52},{129,58,39},{102,41,23},{71,17,3},{28,0,0},{244,118,78},{212,103,67},{184,89,57},{155,73,45},{129,58,32},{102,41,16},{71,17,1},{27,0,0}, -{244,118,67},{212,103,58},{184,89,47},{155,73,36},{129,58,22},{102,41,9},{71,17,1},{27,0,0},{243,117,55},{212,103,47},{183,88,38},{155,73,27},{129,58,12},{102,41,3},{71,18,0},{27,0,0},{243,117,44},{212,103,37},{183,88,29},{155,73,17},{129,58,6},{102,41,1},{71,18,0},{27,0,0},{244,117,33},{213,103,25},{184,88,19},{156,73,7},{129,57,0},{102,42,0},{70,18,0},{27,0,0}, -{241,106,169},{210,92,148},{182,78,129},{155,64,109},{128,48,89},{103,32,69},{72,5,42},{31,0,0},{241,106,159},{210,92,139},{182,78,122},{155,64,103},{129,49,84},{103,32,64},{72,5,38},{30,0,0},{241,106,150},{210,92,131},{182,78,114},{155,64,97},{129,49,78},{103,32,59},{72,5,35},{29,0,0},{241,106,142},{211,92,125},{183,78,108},{155,64,91},{128,49,74},{103,33,55},{72,5,31},{29,0,0}, -{241,106,134},{211,92,118},{183,78,103},{155,64,86},{128,49,69},{103,33,51},{72,5,27},{29,0,0},{241,105,126},{211,92,111},{182,79,97},{155,64,81},{128,48,64},{102,33,47},{71,6,23},{28,0,0},{241,105,118},{211,92,103},{182,79,90},{155,64,76},{128,48,59},{102,33,42},{71,6,18},{27,0,0},{241,105,111},{211,91,96},{182,78,83},{154,64,69},{128,49,54},{101,33,37},{70,6,13},{27,0,0}, -{241,105,103},{211,91,89},{182,78,77},{155,64,63},{128,49,48},{101,33,32},{70,7,8},{27,0,0},{242,104,94},{211,91,82},{183,79,70},{156,64,57},{128,49,43},{102,33,27},{71,8,3},{26,0,0},{242,104,85},{211,91,74},{183,79,63},{155,64,50},{128,49,37},{102,33,21},{71,8,2},{26,0,0},{242,105,75},{210,91,65},{183,79,55},{154,64,43},{128,49,30},{101,34,14},{70,8,1},{26,0,0}, -{242,104,65},{210,91,56},{183,79,46},{154,64,34},{128,49,20},{101,34,7},{70,8,1},{26,0,0},{242,103,53},{211,91,45},{182,78,37},{154,64,26},{128,49,10},{102,34,2},{70,9,0},{26,0,0},{242,103,43},{211,91,36},{182,78,28},{154,64,17},{128,49,5},{102,34,1},{70,9,0},{26,0,0},{243,103,33},{211,91,26},{183,78,19},{155,64,8},{128,50,0},{101,35,0},{70,10,0},{26,0,0}, -{239,89,161},{209,76,141},{181,64,123},{155,51,104},{128,36,85},{103,20,65},{72,2,39},{28,0,0},{240,88,152},{210,77,134},{182,64,117},{155,51,98},{129,37,80},{103,20,61},{72,2,35},{27,0,0},{240,88,143},{210,77,126},{182,64,109},{155,51,92},{129,37,74},{103,20,56},{72,2,32},{27,0,0},{241,88,136},{210,77,120},{182,64,103},{155,51,87},{128,37,70},{102,21,52},{72,2,28},{27,0,0}, -{241,89,129},{210,77,113},{182,64,98},{155,51,83},{128,37,66},{102,21,48},{72,2,24},{27,0,0},{241,89,121},{210,77,106},{182,65,92},{154,52,77},{128,37,61},{102,21,44},{71,2,20},{26,0,0},{241,89,114},{210,77,99},{182,65,86},{154,52,72},{128,38,56},{102,21,39},{71,2,15},{26,0,0},{240,89,107},{210,77,92},{182,65,80},{154,52,66},{128,38,51},{101,22,34},{70,2,10},{25,0,0}, -{240,89,99},{210,77,86},{182,65,74},{155,53,60},{128,39,45},{101,22,29},{70,3,6},{25,0,0},{241,89,91},{210,77,79},{182,66,67},{155,53,54},{128,39,40},{102,22,24},{71,4,3},{25,0,0},{241,89,82},{210,77,71},{182,66,60},{154,53,47},{128,39,34},{102,22,18},{71,4,2},{25,0,0},{241,89,72},{210,77,62},{182,66,53},{154,53,41},{128,39,27},{101,23,11},{70,4,1},{25,0,0}, -{241,89,62},{210,77,54},{182,66,44},{154,53,33},{128,39,19},{101,23,6},{70,4,1},{25,0,0},{241,88,52},{211,77,44},{182,65,36},{154,53,25},{127,39,10},{102,24,2},{70,5,0},{25,0,0},{241,88,43},{211,77,36},{182,65,28},{154,54,17},{127,39,5},{102,24,1},{70,5,0},{25,0,0},{242,88,33},{210,78,27},{182,66,20},{154,54,9},{127,41,0},{101,25,0},{70,5,0},{25,0,0}, -{237,71,154},{208,59,134},{180,50,117},{154,38,100},{128,22,81},{102,6,61},{72,0,36},{25,0,0},{238,70,145},{209,60,128},{181,49,111},{154,38,94},{128,23,76},{102,7,57},{72,0,32},{25,0,0},{239,69,137},{209,61,121},{181,49,105},{154,38,88},{128,24,70},{102,7,53},{72,0,29},{25,0,0},{240,70,130},{208,61,115},{181,50,99},{154,39,83},{128,25,66},{101,7,49},{71,0,25},{25,0,0}, -{240,71,123},{208,61,108},{181,50,94},{154,39,79},{128,25,62},{101,7,45},{71,0,21},{25,0,0},{240,72,117},{209,62,102},{181,51,88},{153,39,73},{127,25,57},{101,8,40},{71,0,17},{24,0,0},{240,72,110},{209,62,95},{181,51,82},{153,39,68},{127,26,52},{101,9,35},{71,0,12},{24,0,0},{239,72,103},{209,63,88},{181,52,76},{154,40,62},{127,26,47},{101,10,31},{70,0,8},{23,0,0}, -{239,72,95},{209,63,82},{181,52,70},{154,41,56},{127,27,42},{101,10,26},{70,0,5},{23,0,0},{239,73,88},{209,62,75},{180,52,64},{153,41,51},{127,28,37},{102,10,21},{71,0,3},{23,0,0},{239,73,79},{209,62,68},{180,52,57},{153,41,45},{127,28,31},{102,10,15},{71,0,1},{23,0,0},{239,72,69},{209,63,60},{181,53,50},{154,41,39},{127,28,25},{101,11,8},{70,1,0},{23,0,0}, -{239,72,60},{209,63,52},{181,53,42},{154,41,31},{127,28,17},{101,11,4},{70,1,0},{23,0,0},{239,73,51},{210,63,43},{181,53,35},{154,41,24},{126,28,9},{101,12,1},{69,1,0},{23,0,0},{239,73,43},{210,63,35},{181,53,28},{154,42,17},{126,29,5},{101,13,1},{69,1,0},{23,0,0},{240,73,34},{209,64,28},{181,54,21},{153,43,10},{126,31,1},{101,14,0},{70,1,0},{23,0,0}, -{237,37,147},{207,30,128},{180,26,112},{154,19,95},{128,11,77},{102,2,58},{72,0,33},{23,0,0},{238,36,139},{208,31,122},{181,25,106},{154,19,89},{128,11,72},{102,3,54},{72,0,29},{23,0,0},{238,36,131},{208,31,115},{181,25,99},{154,19,83},{128,12,67},{102,3,50},{72,0,26},{23,0,0},{239,37,124},{207,32,109},{181,26,94},{154,20,79},{128,12,63},{101,3,46},{71,0,22},{23,0,0}, -{239,38,117},{207,32,103},{181,26,90},{154,20,75},{128,12,59},{101,3,42},{71,0,18},{23,0,0},{238,42,111},{208,34,97},{180,26,84},{153,20,70},{127,13,54},{101,3,37},{71,0,14},{22,0,0},{238,45,104},{208,35,92},{180,27,78},{153,20,64},{127,13,49},{101,4,33},{71,0,10},{22,0,0},{238,44,97},{208,37,85},{180,28,73},{153,20,59},{127,13,44},{101,4,29},{70,0,7},{22,0,0}, -{239,45,91},{208,38,79},{180,29,67},{153,21,54},{127,14,40},{101,4,24},{70,0,4},{22,0,0},{238,47,84},{208,37,72},{180,28,61},{153,21,49},{127,14,35},{101,5,19},{71,0,3},{22,0,0},{238,48,76},{208,38,66},{180,29,55},{153,22,43},{127,14,29},{101,5,13},{71,0,1},{22,0,0},{238,49,68},{208,40,59},{180,31,48},{153,22,37},{127,14,23},{101,5,7},{70,1,0},{22,0,0}, -{238,49,59},{208,41,51},{180,32,41},{153,23,30},{127,14,16},{101,5,3},{70,1,0},{22,0,0},{239,50,50},{209,42,43},{180,33,34},{154,24,23},{126,14,8},{101,6,1},{69,1,0},{22,0,0},{239,50,43},{209,42,35},{180,33,28},{154,24,17},{126,15,5},{101,6,1},{69,1,0},{22,0,0},{239,51,34},{208,42,28},{181,34,21},{153,25,10},{126,16,1},{101,7,0},{70,1,0},{23,0,0}, -{237,0,140},{206,0,122},{179,0,108},{153,0,91},{128,0,73},{102,0,54},{71,0,30},{20,0,0},{237,0,133},{207,0,116},{180,0,101},{153,0,85},{127,0,68},{102,0,50},{71,0,26},{20,0,0},{237,0,125},{207,0,110},{180,0,94},{153,0,79},{127,0,63},{102,0,46},{71,0,23},{20,0,0},{237,1,119},{206,1,104},{180,0,90},{153,0,75},{127,0,59},{102,0,42},{71,0,19},{20,0,0}, -{237,3,112},{206,2,99},{180,0,86},{153,0,71},{127,0,55},{102,0,38},{71,0,15},{20,0,0},{236,11,106},{206,4,93},{179,0,80},{152,0,66},{126,0,51},{101,0,34},{70,0,11},{20,0,0},{236,16,99},{206,7,88},{179,1,75},{152,0,61},{126,0,46},{101,0,30},{70,0,8},{20,0,0},{237,15,92},{206,10,81},{179,3,69},{152,0,56},{126,0,41},{100,0,26},{69,0,5},{20,0,0}, -{238,16,86},{206,12,75},{179,4,63},{152,0,51},{126,0,37},{100,0,22},{69,0,3},{20,0,0},{237,19,80},{207,11,69},{180,3,58},{153,0,46},{126,0,33},{100,0,17},{70,0,2},{20,0,0},{237,22,73},{207,13,63},{180,5,52},{153,1,41},{126,0,27},{100,0,11},{70,0,1},{20,0,0},{237,24,66},{207,16,57},{179,8,46},{152,2,35},{126,0,21},{100,0,5},{69,0,0},{20,0,0}, -{237,25,58},{207,19,50},{179,11,40},{152,3,29},{126,0,14},{100,0,2},{69,0,0},{20,0,0},{238,25,49},{207,21,43},{179,13,33},{153,5,22},{127,0,7},{100,0,0},{69,0,0},{20,0,0},{238,26,42},{207,21,36},{179,13,27},{153,5,16},{127,0,4},{100,0,0},{69,0,0},{21,0,0},{238,28,35},{207,20,29},{180,13,22},{152,5,10},{126,0,1},{100,0,0},{69,0,0},{22,0,0}, -{215,240,252},{188,210,222},{162,182,193},{136,154,165},{113,128,136},{88,101,108},{59,69,76},{22,27,32},{217,238,238},{189,209,210},{163,181,183},{137,154,156},{114,127,129},{89,100,102},{59,69,71},{20,26,28},{218,237,224},{189,209,198},{163,181,173},{138,154,147},{114,127,121},{89,100,96},{59,69,65},{19,26,24},{219,236,212},{191,208,188},{164,180,164},{139,153,139},{114,126,114},{89,99,90},{59,68,61},{19,26,20}, -{219,236,200},{192,207,177},{165,180,154},{139,153,131},{114,126,107},{89,99,85},{59,68,56},{19,26,17},{221,235,187},{193,206,165},{166,179,144},{140,152,122},{115,125,100},{90,98,79},{59,67,51},{18,25,11},{222,234,174},{194,206,154},{167,179,134},{141,151,114},{115,125,93},{90,98,73},{59,67,46},{17,25,6},{223,233,160},{195,205,143},{168,178,124},{141,150,105},{116,124,86},{90,97,66},{60,66,41},{16,25,2}, -{224,232,147},{195,204,131},{168,177,114},{141,150,96},{116,124,78},{90,97,60},{60,66,35},{15,25,0},{225,231,135},{196,203,119},{168,176,104},{142,149,87},{116,123,71},{90,96,53},{59,66,30},{14,24,0},{225,231,120},{196,202,106},{168,176,92},{142,149,77},{116,123,62},{90,96,46},{59,66,23},{13,24,0},{226,230,105},{196,201,93},{169,175,81},{142,148,67},{116,122,53},{91,96,38},{60,65,15},{12,24,0}, -{226,230,87},{197,201,77},{169,175,67},{142,148,55},{116,122,42},{91,96,27},{60,65,8},{11,24,0},{226,229,68},{198,200,60},{170,174,53},{143,147,43},{117,121,31},{91,95,16},{60,65,2},{10,24,0},{227,229,46},{198,200,41},{170,174,35},{143,147,26},{117,121,17},{91,95,8},{60,65,1},{10,24,0},{228,229,22},{198,200,21},{170,173,17},{143,146,9},{116,120,2},{90,95,0},{59,64,0},{9,23,0}, -{214,226,243},{187,198,215},{162,172,187},{137,146,159},{113,121,132},{88,95,104},{60,64,73},{23,22,29},{216,225,230},{189,197,203},{163,171,177},{138,145,151},{114,120,125},{89,94,98},{60,64,68},{21,21,25},{217,225,217},{190,197,192},{164,171,168},{139,145,142},{114,120,117},{89,94,92},{60,64,62},{20,21,21},{218,224,205},{191,196,182},{165,170,159},{140,144,135},{115,119,110},{90,93,87},{60,63,58},{20,21,17}, -{218,223,193},{191,195,171},{165,170,149},{140,144,127},{115,119,103},{90,93,82},{60,63,53},{20,21,13},{220,222,181},{193,194,160},{165,169,140},{140,143,118},{114,118,96},{89,92,76},{60,63,49},{19,21,7},{221,222,168},{194,194,149},{166,169,130},{140,143,110},{114,118,90},{89,92,70},{60,63,44},{18,21,3},{221,221,155},{194,193,138},{167,168,120},{141,142,102},{115,117,83},{89,91,63},{60,62,39},{17,21,1}, -{222,220,143},{194,193,127},{167,167,110},{141,141,93},{115,117,75},{89,91,57},{60,62,33},{16,21,0},{223,219,131},{195,192,115},{167,166,101},{141,140,84},{115,116,68},{90,91,50},{60,61,27},{15,20,0},{224,218,117},{196,191,103},{167,166,89},{141,140,74},{115,116,59},{90,91,43},{60,61,21},{14,20,0},{224,218,103},{196,190,90},{168,165,78},{141,140,64},{115,115,51},{90,90,35},{60,61,13},{13,20,0}, -{224,217,86},{196,190,76},{168,165,65},{141,140,53},{115,115,40},{90,90,25},{60,61,7},{12,20,0},{225,216,68},{197,189,60},{169,164,52},{142,139,41},{116,114,29},{91,90,14},{60,61,2},{10,20,0},{225,216,48},{197,189,42},{169,164,35},{142,139,26},{116,114,16},{91,90,6},{60,61,1},{10,20,0},{226,216,27},{197,189,24},{169,164,19},{142,139,11},{116,114,3},{90,89,0},{59,60,0},{10,19,0}, -{214,213,235},{187,187,207},{162,163,180},{137,138,153},{113,113,127},{88,88,101},{61,59,70},{23,17,26},{216,212,222},{189,186,196},{163,162,171},{139,137,145},{114,112,121},{89,87,95},{61,58,65},{22,16,22},{217,211,209},{190,186,185},{164,162,162},{139,137,137},{114,112,114},{89,87,89},{61,58,60},{21,16,18},{218,211,197},{191,185,175},{165,161,153},{140,136,130},{115,112,107},{90,87,84},{61,58,56},{20,16,14}, -{218,211,186},{191,184,164},{165,161,144},{140,136,122},{115,112,100},{90,87,79},{61,58,51},{20,16,10},{219,210,174},{192,183,154},{165,160,135},{140,135,114},{114,111,93},{89,86,73},{61,57,47},{19,16,4},{220,209,162},{193,183,144},{165,160,126},{140,135,106},{114,110,87},{89,86,67},{61,57,42},{19,16,1},{220,208,151},{193,182,133},{166,159,117},{140,134,99},{114,109,80},{89,85,61},{60,57,37},{18,16,0}, -{221,207,139},{193,182,123},{166,158,107},{140,133,90},{114,109,73},{89,85,55},{60,57,31},{17,16,0},{222,206,127},{194,181,112},{167,157,98},{141,132,81},{115,108,65},{90,85,48},{60,57,25},{16,15,0},{223,206,114},{195,181,100},{167,157,87},{141,132,72},{115,108,57},{90,85,41},{60,57,19},{15,15,0},{223,206,101},{196,180,88},{167,156,77},{141,132,62},{115,108,49},{90,84,33},{60,56,12},{14,15,0}, -{223,205,85},{196,180,75},{167,156,64},{141,132,52},{115,108,39},{90,84,23},{60,56,6},{13,15,0},{224,204,68},{196,179,60},{168,155,51},{142,131,40},{116,107,28},{91,84,12},{60,56,2},{11,15,0},{224,204,49},{196,179,43},{168,155,35},{142,131,26},{116,107,16},{91,84,5},{60,56,1},{11,15,0},{225,204,31},{196,178,26},{168,155,20},{142,131,12},{116,107,3},{90,83,0},{59,56,0},{11,15,0}, -{213,201,227},{187,177,200},{162,153,175},{138,130,149},{114,106,123},{89,83,97},{61,55,67},{24,11,24},{215,200,215},{188,176,190},{163,153,165},{138,129,141},{114,106,117},{89,83,92},{61,54,62},{23,11,20},{216,199,202},{189,176,179},{163,153,156},{138,129,133},{114,106,110},{89,83,86},{61,54,57},{23,11,15},{217,199,191},{190,175,169},{164,152,148},{139,129,126},{114,105,103},{89,83,81},{61,54,53},{22,11,10}, -{217,199,181},{190,174,160},{164,152,140},{139,129,118},{114,105,97},{89,83,76},{61,54,49},{22,11,6},{218,198,170},{191,173,150},{164,151,131},{140,128,110},{115,105,91},{90,82,70},{60,53,45},{21,11,2},{219,197,158},{192,173,140},{164,151,122},{140,128,102},{115,104,84},{90,82,65},{60,53,40},{20,11,0},{219,196,147},{192,172,129},{165,150,113},{140,127,95},{115,103,77},{90,81,59},{61,53,35},{19,11,0}, -{220,195,135},{192,172,119},{165,149,103},{140,126,87},{115,103,71},{90,81,53},{61,53,29},{18,11,0},{221,194,124},{193,171,109},{166,148,94},{141,125,79},{115,102,63},{90,81,46},{61,53,23},{17,11,0},{221,194,112},{193,171,98},{166,148,85},{141,125,70},{115,102,56},{90,81,39},{61,53,17},{15,11,0},{222,194,98},{194,170,86},{166,147,75},{140,125,60},{115,102,47},{90,80,32},{60,52,10},{14,11,0}, -{222,194,83},{194,170,73},{166,147,62},{140,125,50},{115,102,37},{90,80,21},{60,52,5},{14,11,0},{223,193,67},{195,169,59},{167,146,50},{141,124,39},{115,101,26},{90,80,10},{60,52,1},{13,11,0},{223,193,50},{195,169,44},{167,146,36},{141,124,26},{115,101,15},{90,80,4},{60,52,0},{12,11,0},{224,192,35},{195,169,28},{167,146,22},{141,124,13},{115,101,4},{90,79,0},{60,52,0},{12,11,0}, -{213,189,219},{187,166,193},{162,144,169},{138,122,144},{114,99,119},{89,78,94},{61,51,64},{24,6,21},{214,188,207},{188,165,183},{163,144,160},{138,121,137},{114,99,113},{89,78,89},{61,50,59},{24,6,17},{215,187,195},{189,165,173},{163,144,151},{138,121,129},{114,99,106},{89,78,83},{61,50,54},{24,6,12},{216,187,185},{190,164,164},{164,143,143},{139,121,122},{114,98,100},{89,77,78},{61,50,50},{23,6,7}, -{217,187,175},{190,164,155},{164,143,135},{139,121,114},{114,98,94},{89,77,73},{61,50,46},{22,6,3},{218,186,165},{191,163,145},{164,142,126},{140,120,107},{115,98,88},{90,77,67},{60,49,42},{21,6,1},{219,185,154},{191,163,135},{164,142,118},{140,120,99},{115,98,81},{90,77,62},{60,49,37},{21,6,0},{219,184,143},{191,162,125},{165,141,109},{140,119,92},{115,97,74},{90,76,56},{61,49,32},{20,6,0}, -{219,184,132},{191,162,115},{165,141,100},{140,119,84},{115,97,68},{90,76,50},{61,49,26},{18,6,0},{220,183,121},{192,161,106},{166,140,91},{141,118,76},{115,96,61},{90,76,44},{61,49,21},{17,6,0},{220,183,109},{192,161,95},{166,140,82},{141,118,68},{115,96,54},{90,76,37},{61,49,14},{15,6,0},{221,183,95},{193,160,84},{166,139,72},{140,117,59},{115,96,45},{90,75,30},{60,48,8},{14,7,0}, -{222,183,82},{193,160,71},{166,139,61},{140,117,49},{115,96,35},{90,75,20},{60,48,4},{14,7,0},{223,182,67},{194,159,59},{167,138,49},{141,116,38},{115,95,25},{90,75,9},{60,48,0},{14,7,0},{223,182,51},{194,159,44},{167,138,37},{141,116,26},{115,95,15},{90,75,4},{60,48,0},{13,7,0},{223,181,36},{194,159,30},{167,137,24},{141,116,14},{115,95,4},{90,75,0},{60,48,0},{12,6,0}, -{212,176,210},{186,154,186},{162,134,162},{138,113,139},{114,92,115},{90,72,90},{62,45,60},{25,3,17},{213,175,200},{187,154,176},{163,134,154},{139,113,132},{114,92,109},{89,72,85},{61,45,56},{24,2,13},{214,175,189},{188,154,166},{163,134,145},{139,113,124},{114,92,102},{89,72,79},{61,45,51},{24,2,8},{215,175,179},{189,153,158},{163,133,138},{139,112,117},{114,91,96},{90,71,75},{61,44,47},{23,2,4}, -{216,175,169},{189,153,149},{164,133,131},{139,112,110},{114,91,90},{90,71,70},{61,44,43},{23,2,1},{217,174,159},{190,153,140},{164,133,122},{139,112,103},{114,91,84},{89,71,64},{61,44,39},{22,2,0},{217,173,148},{190,153,131},{164,133,114},{139,112,96},{114,91,78},{89,71,59},{61,44,35},{21,2,0},{218,172,137},{190,152,121},{164,132,105},{140,111,89},{114,90,71},{90,70,54},{61,44,30},{20,2,0}, -{219,172,127},{190,152,111},{165,132,97},{140,111,82},{114,90,65},{90,70,48},{61,44,24},{18,2,0},{220,171,117},{191,151,102},{166,131,89},{140,110,74},{114,90,59},{90,70,42},{60,44,19},{17,2,0},{220,171,105},{191,151,93},{166,131,80},{140,110,66},{114,90,52},{90,70,35},{60,44,12},{16,2,0},{220,171,93},{192,150,82},{165,130,70},{140,109,57},{114,89,43},{89,69,28},{60,44,6},{15,3,0}, -{220,171,80},{192,150,69},{165,130,59},{140,109,47},{114,89,34},{89,69,18},{60,44,3},{15,3,0},{221,170,66},{193,149,57},{166,129,47},{140,109,36},{114,89,24},{89,69,8},{60,44,0},{15,3,0},{221,170,51},{193,149,44},{166,129,36},{140,109,26},{114,89,14},{89,69,3},{60,44,0},{14,3,0},{221,169,37},{193,149,31},{166,128,24},{140,108,14},{114,89,4},{89,69,0},{59,43,0},{13,2,0}, -{212,164,202},{186,143,179},{162,124,156},{138,105,134},{114,86,110},{90,66,86},{62,40,57},{25,0,14},{213,163,192},{187,143,169},{163,124,148},{139,105,127},{114,85,104},{90,66,81},{61,40,53},{24,0,9},{214,163,182},{187,143,160},{163,124,140},{139,105,119},{114,85,98},{90,66,76},{61,40,48},{24,0,5},{215,162,173},{188,142,152},{163,124,133},{139,104,112},{114,85,92},{90,65,72},{61,39,44},{23,0,2}, -{216,162,163},{188,142,144},{164,124,126},{139,104,106},{114,85,87},{90,65,67},{61,39,40},{23,0,0},{216,162,153},{189,142,135},{164,123,117},{139,104,100},{114,84,81},{89,65,61},{61,39,36},{22,0,0},{216,161,142},{189,142,126},{164,123,109},{139,104,93},{114,84,75},{89,65,56},{61,39,32},{21,0,0},{217,161,132},{190,141,117},{164,122,102},{140,103,86},{114,84,68},{90,64,51},{61,39,27},{20,0,0}, -{218,160,122},{190,141,108},{165,122,94},{140,103,79},{114,84,62},{90,64,45},{61,39,21},{18,0,0},{219,159,113},{191,140,99},{166,122,86},{140,102,72},{114,83,56},{90,64,39},{60,39,16},{17,0,0},{219,159,102},{191,140,90},{166,122,77},{140,102,64},{114,83,49},{90,64,32},{60,39,10},{17,0,0},{219,159,91},{191,139,80},{165,121,67},{140,101,55},{114,83,41},{89,63,25},{60,39,5},{16,0,0}, -{219,159,78},{191,139,67},{165,121,57},{140,101,45},{114,83,32},{89,63,16},{60,39,2},{16,0,0},{220,159,66},{192,138,56},{166,120,46},{140,101,35},{114,83,23},{89,63,7},{60,39,0},{15,0,0},{220,159,51},{192,138,44},{166,120,36},{140,101,26},{114,83,14},{89,63,3},{60,39,0},{14,0,0},{220,158,37},{192,138,32},{165,120,24},{140,100,14},{114,83,4},{89,63,0},{59,38,0},{13,0,0}, -{212,152,195},{185,132,173},{161,115,150},{137,98,128},{113,79,106},{90,59,83},{62,34,54},{23,0,10},{213,151,185},{186,132,163},{162,115,143},{138,97,122},{114,78,100},{90,59,78},{62,34,50},{23,0,6},{214,151,175},{186,132,154},{162,115,135},{138,97,114},{114,78,94},{90,59,73},{62,34,46},{23,0,2},{214,150,166},{187,131,147},{163,115,128},{138,97,108},{114,78,89},{90,59,69},{61,34,42},{22,0,1}, -{215,150,158},{187,131,139},{163,115,121},{138,97,102},{114,78,84},{90,59,64},{61,34,38},{21,0,0},{215,150,148},{188,131,130},{163,114,113},{138,96,96},{114,77,78},{90,59,58},{61,34,34},{20,0,0},{215,150,138},{188,131,122},{163,114,105},{138,96,89},{114,77,72},{90,59,53},{61,34,29},{20,0,0},{216,149,128},{189,130,113},{164,113,98},{139,96,82},{114,77,65},{90,58,48},{61,34,24},{19,0,0}, -{217,149,118},{189,130,104},{164,113,90},{139,96,76},{114,77,59},{90,58,42},{61,34,19},{18,0,0},{218,148,109},{190,130,96},{165,113,83},{139,95,69},{113,76,53},{90,58,37},{61,34,13},{17,0,0},{218,148,99},{190,130,87},{165,113,74},{139,95,61},{113,76,47},{90,58,31},{61,34,8},{17,0,0},{218,148,88},{190,129,77},{164,112,65},{139,94,53},{113,76,40},{89,58,24},{60,34,4},{16,0,0}, -{218,148,76},{190,129,66},{164,112,55},{139,94,44},{113,76,31},{89,58,15},{60,34,1},{15,0,0},{219,147,64},{191,128,55},{165,111,45},{139,94,34},{114,76,22},{90,58,6},{60,34,0},{14,0,0},{219,147,52},{191,128,44},{165,111,35},{139,94,25},{114,76,13},{90,58,2},{60,34,0},{14,0,0},{219,147,38},{191,128,33},{165,111,25},{139,93,13},{113,76,3},{89,58,0},{59,34,0},{14,0,0}, -{212,140,189},{185,122,167},{161,106,144},{137,90,123},{113,72,102},{90,53,79},{62,27,52},{22,0,6},{213,139,179},{186,122,157},{162,105,137},{138,89,117},{114,71,96},{90,53,74},{62,28,48},{22,0,3},{214,139,169},{186,122,148},{162,105,130},{138,89,110},{114,71,90},{90,53,69},{62,28,44},{22,0,0},{214,138,160},{187,121,141},{163,105,123},{138,89,104},{114,71,85},{90,53,65},{61,28,40},{21,0,0}, -{214,138,152},{187,121,133},{163,105,116},{138,89,98},{114,71,80},{90,53,61},{61,28,36},{20,0,0},{215,138,143},{187,121,126},{163,105,109},{138,88,92},{114,71,74},{90,53,56},{61,29,32},{19,0,0},{215,138,134},{187,121,118},{163,105,101},{138,88,85},{114,71,68},{90,53,51},{61,29,27},{19,0,0},{215,137,124},{188,120,109},{163,104,94},{138,88,79},{114,71,63},{90,52,46},{61,28,22},{18,0,0}, -{215,137,114},{188,120,100},{163,104,87},{138,88,73},{114,71,57},{90,52,40},{61,28,17},{17,0,0},{216,136,105},{189,120,93},{163,104,80},{138,87,66},{113,70,51},{90,52,35},{61,28,11},{16,0,0},{216,136,96},{189,120,84},{163,104,72},{138,87,58},{113,70,45},{90,52,29},{61,28,6},{16,0,0},{217,136,86},{188,119,75},{164,103,63},{138,87,51},{113,70,38},{89,52,22},{60,28,3},{15,0,0}, -{217,136,74},{188,119,64},{164,103,53},{138,87,42},{113,70,29},{89,52,13},{60,28,1},{14,0,0},{217,135,62},{189,118,53},{164,103,43},{139,87,32},{114,70,20},{90,52,5},{60,28,0},{13,0,0},{217,135,52},{189,118,44},{164,103,35},{139,87,24},{114,70,11},{90,52,2},{60,28,0},{13,0,0},{218,135,40},{189,118,34},{164,103,25},{139,86,14},{113,70,3},{89,52,0},{59,29,0},{13,0,0}, -{211,127,182},{185,111,160},{161,97,139},{136,81,118},{113,64,98},{90,46,76},{61,20,49},{21,0,3},{212,127,172},{186,111,151},{162,96,132},{137,81,112},{113,64,92},{90,46,71},{62,21,45},{20,0,2},{213,127,162},{186,111,143},{162,96,125},{137,81,106},{113,64,86},{90,46,66},{62,21,41},{19,0,0},{214,126,153},{186,111,136},{162,96,119},{138,81,100},{113,64,81},{90,46,62},{61,21,37},{18,0,0}, -{214,126,145},{186,111,128},{162,96,112},{138,81,94},{113,64,76},{90,46,58},{61,21,33},{18,0,0},{214,126,138},{186,111,121},{163,96,105},{138,81,88},{113,64,70},{90,46,53},{61,22,29},{17,0,0},{214,126,130},{186,111,113},{163,96,98},{138,81,82},{113,64,65},{90,46,48},{61,22,25},{16,0,0},{214,125,120},{187,110,105},{163,95,91},{138,80,76},{113,64,60},{89,46,43},{61,22,20},{16,0,0}, -{214,125,111},{187,110,97},{163,95,85},{138,80,70},{113,64,54},{89,46,37},{61,22,15},{15,0,0},{215,125,102},{188,110,90},{162,95,78},{137,80,63},{113,63,48},{89,46,32},{61,23,9},{14,0,0},{215,125,93},{188,110,81},{162,95,70},{137,80,56},{113,63,42},{89,46,26},{61,23,5},{13,0,0},{216,125,83},{187,109,72},{163,94,61},{138,80,49},{113,63,36},{89,46,20},{60,22,3},{12,0,0}, -{216,125,73},{187,109,63},{163,94,52},{138,80,41},{113,63,27},{89,46,12},{60,22,1},{12,0,0},{216,124,61},{188,109,52},{163,95,42},{138,79,31},{113,63,19},{89,46,4},{59,23,0},{12,0,0},{216,124,51},{188,109,43},{163,95,34},{138,79,23},{113,63,10},{89,46,2},{59,23,0},{12,0,0},{217,124,41},{188,109,33},{163,94,25},{138,79,15},{113,63,3},{89,45,0},{59,23,0},{12,0,0}, -{211,114,174},{184,100,153},{161,87,134},{136,72,113},{113,55,93},{90,39,73},{61,13,46},{19,0,1},{212,114,165},{185,100,145},{162,87,127},{137,72,107},{113,56,88},{90,39,68},{62,13,42},{17,0,1},{212,114,156},{186,100,137},{162,87,120},{137,72,101},{113,56,83},{90,39,63},{62,13,38},{16,0,0},{213,114,148},{186,100,131},{162,87,114},{138,72,96},{113,56,78},{90,39,59},{61,14,34},{15,0,0}, -{213,114,140},{186,100,123},{162,87,107},{138,72,91},{113,56,73},{90,39,55},{61,14,30},{15,0,0},{213,114,133},{186,100,116},{163,86,101},{138,72,85},{113,56,67},{90,39,50},{61,14,26},{14,0,0},{213,114,125},{186,100,108},{163,86,95},{138,72,79},{113,56,62},{90,39,45},{61,14,22},{14,0,0},{214,114,116},{186,100,101},{163,86,88},{138,71,73},{113,56,57},{89,39,40},{61,14,17},{13,0,0}, -{214,114,107},{186,100,94},{163,86,82},{138,71,67},{113,56,51},{89,39,35},{61,14,12},{12,0,0},{214,114,99},{187,100,87},{162,86,75},{137,71,60},{113,56,46},{89,39,30},{61,15,7},{12,0,0},{214,114,90},{187,100,79},{162,86,67},{137,71,54},{113,56,40},{89,39,24},{61,16,4},{11,0,0},{215,114,80},{187,99,70},{163,85,59},{138,71,47},{113,56,34},{89,39,18},{60,15,2},{10,0,0}, -{215,114,71},{187,99,61},{163,85,50},{138,71,39},{113,56,25},{89,39,10},{60,15,1},{10,0,0},{215,113,60},{188,99,51},{163,86,41},{137,71,30},{113,55,17},{89,40,4},{59,16,0},{10,0,0},{215,113,51},{188,99,43},{163,86,33},{137,71,22},{113,55,9},{89,40,2},{59,16,0},{10,0,0},{215,113,41},{188,99,33},{163,85,25},{138,71,15},{113,55,3},{89,39,0},{59,16,0},{10,0,0}, -{210,102,167},{183,89,147},{161,76,128},{136,62,109},{112,46,89},{90,30,69},{62,5,43},{15,0,0},{211,101,158},{184,89,139},{162,76,121},{137,62,103},{113,47,84},{90,30,65},{62,5,39},{14,0,0},{211,101,150},{185,89,131},{162,76,114},{137,62,97},{113,47,79},{90,30,60},{62,5,36},{14,0,0},{212,102,142},{185,89,125},{162,77,109},{137,62,92},{112,47,75},{90,31,56},{61,5,32},{13,0,0}, -{212,102,135},{185,89,118},{162,77,103},{137,62,87},{112,47,70},{90,31,52},{61,5,28},{13,0,0},{212,102,127},{186,89,111},{162,76,97},{137,62,81},{112,47,65},{90,31,48},{61,5,24},{12,0,0},{212,102,119},{186,89,104},{162,76,91},{137,62,76},{112,47,60},{90,31,43},{61,5,20},{12,0,0},{213,102,111},{186,89,97},{162,76,84},{137,62,70},{112,48,54},{90,32,38},{61,5,15},{11,0,0}, -{213,102,103},{186,89,91},{162,76,78},{137,62,64},{112,48,49},{89,32,33},{61,5,10},{10,0,0},{213,101,95},{186,90,84},{162,76,71},{137,62,58},{112,48,44},{88,32,28},{60,6,5},{10,0,0},{213,101,87},{186,90,77},{162,76,64},{137,62,52},{112,48,38},{88,32,22},{60,7,3},{10,0,0},{214,102,78},{186,89,68},{162,75,57},{137,62,45},{112,48,32},{88,32,16},{59,8,1},{9,0,0}, -{214,102,69},{186,89,59},{162,75,48},{137,62,37},{112,48,23},{88,32,9},{59,8,1},{9,0,0},{214,101,58},{187,89,49},{162,76,39},{136,62,29},{112,48,15},{89,33,3},{59,8,0},{9,0,0},{214,101,50},{187,89,41},{162,76,32},{136,62,21},{112,48,8},{89,33,1},{59,8,0},{9,0,0},{214,101,41},{188,89,34},{162,75,25},{137,62,14},{112,48,3},{88,33,0},{59,9,0},{9,0,0}, -{209,86,160},{183,74,141},{161,63,123},{136,49,104},{112,34,85},{90,18,65},{62,2,40},{11,0,0},{210,86,152},{184,75,134},{162,63,116},{137,50,98},{113,35,80},{90,19,61},{62,2,36},{11,0,0},{211,86,144},{185,75,126},{162,63,109},{137,50,93},{113,36,75},{90,19,57},{62,2,33},{11,0,0},{212,87,137},{185,75,120},{161,64,104},{137,51,88},{112,36,71},{90,19,53},{61,2,29},{10,0,0}, -{212,87,130},{185,75,113},{161,64,99},{137,51,83},{112,36,67},{90,19,49},{61,2,25},{10,0,0},{212,87,122},{186,75,107},{162,63,93},{137,51,78},{112,37,62},{90,20,45},{61,2,21},{10,0,0},{212,87,114},{186,76,100},{162,63,87},{137,51,73},{112,37,57},{90,20,40},{61,2,17},{10,0,0},{212,87,107},{186,76,94},{162,64,81},{137,51,67},{112,38,51},{90,21,35},{61,2,12},{9,0,0}, -{212,87,100},{186,76,88},{162,64,75},{137,51,61},{112,38,46},{89,21,30},{61,2,8},{8,0,0},{212,87,92},{186,76,81},{161,64,68},{137,52,55},{112,38,41},{88,22,25},{60,3,4},{8,0,0},{212,87,84},{186,76,74},{161,64,61},{137,52,49},{112,38,35},{88,22,19},{60,3,3},{8,0,0},{213,88,75},{186,76,65},{162,64,54},{137,52,42},{112,38,29},{88,22,13},{59,4,1},{7,0,0}, -{213,88,67},{186,76,57},{162,64,46},{137,52,35},{112,38,22},{88,22,8},{59,4,1},{7,0,0},{213,87,57},{187,76,48},{162,65,38},{136,52,28},{112,39,14},{89,23,3},{59,4,0},{6,0,0},{213,87,50},{187,76,41},{162,65,32},{136,52,20},{112,39,8},{89,23,1},{59,4,0},{6,0,0},{213,87,41},{187,76,34},{162,64,25},{137,52,14},{112,39,3},{88,23,0},{59,5,0},{6,0,0}, -{208,69,153},{183,59,135},{160,49,118},{137,36,99},{113,22,81},{90,6,61},{61,0,36},{8,0,0},{209,70,146},{184,60,128},{161,50,112},{137,37,94},{112,23,76},{90,7,57},{61,0,33},{8,0,0},{210,70,138},{185,60,121},{161,50,105},{137,38,89},{112,24,71},{90,7,53},{61,0,30},{8,0,0},{211,71,131},{185,60,115},{160,50,100},{137,39,84},{113,24,67},{90,7,49},{61,0,26},{7,0,0}, -{211,71,124},{185,60,109},{160,50,95},{137,39,79},{113,24,63},{90,7,45},{61,0,22},{6,0,0},{212,72,117},{185,61,103},{161,51,89},{136,39,74},{112,25,58},{89,8,41},{60,0,18},{6,0,0},{212,72,110},{185,62,96},{161,51,83},{136,39,69},{112,25,53},{89,8,36},{60,0,14},{6,0,0},{211,72,103},{185,63,90},{161,52,77},{136,39,63},{112,26,48},{89,9,32},{60,0,9},{6,0,0}, -{211,72,96},{185,63,84},{161,52,71},{136,39,57},{112,26,43},{89,9,28},{60,0,6},{6,0,0},{211,73,89},{185,62,77},{160,52,64},{136,40,52},{112,27,38},{88,10,23},{59,1,3},{6,0,0},{211,73,81},{185,62,70},{160,52,58},{136,40,46},{112,27,32},{88,10,17},{59,1,2},{6,0,0},{212,73,73},{186,63,63},{161,52,52},{136,41,40},{112,28,26},{88,11,11},{59,1,1},{6,0,0}, -{212,73,65},{186,63,55},{161,52,44},{136,41,34},{112,28,20},{88,12,6},{59,1,1},{5,0,0},{212,73,56},{186,63,47},{161,53,37},{136,41,27},{112,29,13},{88,13,2},{58,1,0},{4,0,0},{212,73,49},{186,63,40},{161,53,31},{136,41,19},{112,29,8},{88,13,1},{58,1,0},{4,0,0},{212,73,42},{186,64,34},{161,52,25},{136,42,13},{112,29,3},{88,13,0},{58,1,0},{4,0,0}, -{208,43,146},{183,32,129},{160,25,112},{137,18,94},{113,11,77},{90,2,59},{61,0,34},{6,0,0},{209,45,139},{184,34,122},{161,26,106},{137,19,89},{112,11,72},{90,3,55},{61,0,31},{6,0,0},{210,46,131},{185,35,115},{161,26,100},{137,19,84},{112,12,68},{90,3,51},{61,0,28},{6,0,0},{210,47,125},{185,37,110},{160,26,95},{136,20,80},{113,12,64},{90,3,47},{61,0,24},{5,0,0}, -{210,48,118},{185,38,104},{160,27,90},{136,20,76},{113,12,60},{90,3,43},{61,0,20},{5,0,0},{211,49,112},{185,40,98},{161,29,85},{136,20,71},{112,13,55},{89,3,39},{60,0,16},{5,0,0},{211,50,105},{185,41,92},{161,30,80},{136,20,66},{112,13,50},{89,3,34},{60,0,12},{5,0,0},{211,50,99},{184,42,87},{161,31,74},{136,21,60},{112,13,46},{89,4,30},{60,0,8},{5,0,0}, -{211,51,93},{184,42,81},{161,32,68},{136,21,55},{112,13,41},{89,4,26},{60,0,6},{5,0,0},{211,52,86},{185,42,74},{160,33,62},{136,22,50},{112,14,36},{88,5,21},{59,1,3},{5,0,0},{211,52,79},{185,43,67},{160,34,56},{136,23,44},{112,14,31},{88,5,15},{59,1,2},{5,0,0},{212,53,71},{185,44,61},{161,35,50},{136,24,38},{112,14,25},{88,5,9},{59,1,1},{5,0,0}, -{212,53,63},{185,44,53},{161,35,43},{136,24,32},{112,14,19},{88,6,5},{59,1,1},{4,0,0},{212,53,55},{185,45,46},{161,36,37},{136,25,26},{111,15,12},{88,6,2},{58,1,0},{4,0,0},{212,53,49},{185,45,39},{161,36,30},{136,25,19},{111,15,7},{88,6,1},{58,1,0},{4,0,0},{212,53,42},{186,45,33},{161,37,25},{136,26,13},{112,15,3},{88,6,0},{58,1,0},{4,0,0}, -{207,15,140},{184,3,123},{159,0,106},{136,0,90},{112,0,73},{90,0,56},{61,0,31},{3,0,0},{208,17,133},{185,5,117},{160,1,101},{136,0,85},{112,0,69},{89,0,52},{61,0,28},{3,0,0},{209,19,125},{185,7,110},{160,1,95},{136,0,80},{112,0,64},{89,0,48},{61,0,25},{3,0,0},{209,21,119},{185,11,105},{160,2,91},{135,0,76},{112,0,60},{89,0,44},{60,0,21},{3,0,0}, -{209,22,113},{185,14,100},{160,4,86},{135,0,72},{112,0,56},{89,0,40},{60,0,18},{3,0,0},{210,24,107},{184,17,94},{160,6,81},{135,0,67},{112,0,52},{89,0,36},{60,0,13},{3,0,0},{210,26,101},{184,19,88},{160,8,76},{135,0,62},{112,0,47},{89,0,31},{60,0,9},{3,0,0},{210,27,95},{183,20,83},{160,10,71},{135,1,57},{112,0,43},{89,0,27},{60,0,7},{3,0,0}, -{210,29,89},{183,21,77},{160,12,65},{135,2,52},{112,0,39},{89,0,23},{60,0,5},{3,0,0},{210,30,82},{184,22,70},{160,14,60},{135,3,47},{111,0,34},{88,0,18},{59,0,3},{3,0,0},{210,31,76},{184,23,64},{160,16,54},{135,4,42},{111,0,29},{88,0,13},{59,0,1},{3,0,0},{211,31,69},{184,25,58},{160,18,48},{135,6,36},{111,0,23},{88,0,7},{58,0,0},{3,0,0}, -{211,32,61},{184,26,51},{160,18,42},{135,7,30},{111,0,17},{88,0,4},{58,0,0},{3,0,0},{211,33,54},{184,27,44},{160,19,36},{135,9,24},{111,1,10},{88,0,1},{58,0,0},{3,0,0},{211,33,48},{184,27,38},{160,20,30},{135,9,18},{111,1,6},{88,0,1},{58,0,0},{3,0,0},{211,34,42},{185,27,32},{160,21,24},{135,10,13},{111,1,2},{88,0,0},{58,0,0},{3,0,0}, -{175,226,249},{153,198,220},{132,173,192},{112,147,164},{91,121,135},{71,96,107},{45,65,75},{7,24,33},{177,225,236},{155,197,208},{134,172,181},{113,146,155},{92,120,128},{71,95,102},{45,64,70},{6,23,29},{179,224,223},{156,196,197},{135,172,171},{115,146,146},{93,120,121},{71,95,96},{45,64,65},{6,23,25},{181,223,211},{158,196,187},{137,171,162},{116,145,139},{94,120,114},{72,95,90},{45,64,61},{5,23,21}, -{182,223,199},{160,196,176},{138,170,154},{116,144,131},{94,120,107},{72,95,85},{45,64,56},{5,23,18},{183,222,187},{161,195,165},{139,169,144},{117,144,122},{95,119,101},{72,94,79},{45,63,52},{4,22,13},{184,221,174},{162,194,154},{139,169,134},{118,144,114},{95,119,94},{72,94,73},{45,63,47},{4,22,8},{185,220,161},{163,193,143},{140,168,124},{118,143,105},{96,118,86},{73,93,66},{46,62,42},{4,22,3}, -{187,219,149},{163,192,131},{141,167,114},{118,142,96},{96,118,79},{73,93,60},{46,62,37},{3,22,0},{189,218,137},{164,191,120},{142,166,105},{119,141,88},{96,117,72},{74,92,54},{45,62,31},{2,22,0},{190,218,123},{164,191,109},{142,166,94},{119,141,79},{96,117,64},{74,92,47},{45,62,25},{1,22,0},{191,217,109},{165,190,97},{143,166,84},{119,140,70},{96,116,55},{74,91,40},{45,61,19},{0,22,0}, -{191,217,93},{166,190,82},{143,165,71},{119,140,59},{96,116,45},{74,91,31},{45,61,11},{0,22,0},{192,216,77},{168,189,68},{144,164,57},{120,139,47},{97,115,35},{74,91,21},{46,61,3},{0,22,0},{193,216,62},{168,189,54},{144,164,45},{120,139,36},{97,115,24},{74,91,12},{46,61,1},{0,22,0},{194,216,46},{168,189,39},{144,164,33},{120,139,24},{97,114,13},{75,90,3},{45,60,0},{0,22,0}, -{176,213,240},{154,187,212},{134,163,186},{113,139,158},{92,115,131},{72,90,104},{46,60,72},{8,19,30},{178,212,228},{156,186,201},{136,163,176},{115,138,150},{93,114,124},{72,89,98},{46,60,67},{7,18,26},{179,212,216},{158,186,190},{137,163,166},{116,138,141},{94,114,117},{72,89,92},{46,60,62},{7,18,22},{182,211,204},{160,185,181},{138,162,157},{117,137,134},{95,113,110},{73,89,87},{46,59,58},{6,18,18}, -{183,210,193},{161,185,170},{139,161,149},{117,137,127},{95,113,103},{74,89,82},{46,59,54},{6,18,14},{185,209,181},{162,184,160},{140,160,139},{118,136,118},{96,112,97},{73,88,76},{46,59,49},{6,17,10},{186,209,169},{162,183,149},{140,160,130},{118,136,110},{96,112,90},{73,88,70},{46,59,44},{6,17,5},{186,208,156},{163,182,138},{141,159,120},{119,135,102},{96,111,83},{74,87,63},{47,58,39},{5,18,2}, -{187,207,144},{163,182,127},{141,158,111},{119,135,93},{96,111,76},{74,87,57},{47,58,34},{4,18,0},{188,206,133},{164,181,117},{142,157,102},{119,134,85},{96,110,69},{74,87,51},{46,58,29},{4,17,0},{189,206,120},{165,181,106},{142,157,92},{119,134,76},{96,110,61},{74,87,45},{46,58,23},{2,17,0},{191,205,107},{166,180,94},{142,157,82},{119,133,67},{97,110,53},{75,86,38},{46,57,17},{1,18,0}, -{191,205,91},{167,180,80},{143,156,69},{119,133,57},{97,110,44},{75,86,29},{46,57,9},{1,18,0},{192,204,76},{168,180,66},{144,155,56},{120,132,45},{97,109,34},{75,86,19},{46,57,2},{0,17,0},{193,204,61},{168,180,52},{144,155,44},{120,132,35},{97,109,23},{75,86,10},{46,57,1},{0,17,0},{194,204,47},{167,179,40},{144,155,32},{120,132,24},{97,109,12},{75,85,2},{46,56,0},{0,17,0}, -{177,201,232},{155,177,204},{135,154,179},{114,131,152},{93,107,127},{72,84,101},{47,55,70},{9,13,27},{179,200,220},{157,177,193},{137,154,169},{116,130,144},{94,107,120},{73,83,95},{47,55,65},{8,13,23},{180,200,208},{159,177,183},{138,154,160},{117,130,136},{95,107,113},{73,83,89},{47,55,60},{8,13,19},{182,199,197},{160,176,174},{139,153,151},{117,129,129},{96,106,107},{74,83,84},{47,54,56},{7,13,15}, -{183,198,186},{161,175,164},{139,152,143},{117,129,122},{96,106,100},{74,83,79},{47,54,52},{7,13,11},{185,197,175},{162,174,154},{140,151,134},{118,128,115},{96,105,94},{74,82,73},{48,54,47},{6,12,7},{186,197,163},{162,174,144},{140,151,126},{118,128,107},{96,105,87},{74,82,67},{48,54,42},{6,12,3},{186,196,151},{163,173,134},{141,150,117},{119,127,99},{96,104,80},{75,81,61},{47,53,37},{6,13,1}, -{187,196,140},{163,173,124},{141,150,108},{119,127,91},{96,104,73},{75,81,55},{47,53,32},{5,13,0},{188,195,129},{164,172,114},{142,149,99},{119,126,83},{96,103,66},{74,81,49},{47,53,27},{4,12,0},{189,195,118},{165,172,103},{142,149,90},{119,126,74},{96,103,59},{74,81,43},{47,53,21},{3,12,0},{191,194,105},{166,171,92},{143,148,80},{119,125,65},{97,103,52},{75,80,36},{47,53,15},{1,13,0}, -{191,194,90},{167,171,79},{143,148,68},{119,125,56},{97,103,43},{75,80,27},{47,53,8},{1,13,0},{192,193,76},{168,170,65},{144,147,56},{120,125,44},{97,102,33},{75,80,17},{47,53,2},{0,12,0},{192,193,61},{168,170,52},{144,147,44},{120,125,34},{97,102,23},{75,80,9},{47,53,1},{0,12,0},{193,193,48},{167,169,40},{144,146,31},{120,124,24},{98,102,12},{75,79,2},{46,53,0},{0,13,0}, -{178,189,224},{156,168,198},{136,145,173},{115,124,148},{95,101,123},{74,79,97},{48,51,67},{10,7,24},{180,188,213},{158,167,188},{137,145,164},{116,123,140},{96,101,116},{74,79,91},{48,51,62},{9,7,20},{181,188,201},{160,167,178},{138,145,156},{116,123,132},{96,101,109},{74,79,85},{48,51,57},{9,7,16},{182,188,191},{161,166,169},{139,144,147},{117,122,125},{96,100,103},{75,79,81},{48,50,53},{9,8,12}, -{183,188,180},{161,166,160},{140,144,139},{118,122,118},{96,100,96},{75,79,76},{48,50,49},{9,8,7},{185,187,170},{162,165,150},{140,143,130},{118,122,111},{96,99,90},{75,78,70},{48,50,45},{8,8,4},{186,187,159},{162,165,140},{140,143,122},{118,122,103},{96,99,84},{75,78,64},{48,50,40},{7,8,1},{187,186,147},{163,164,130},{141,142,113},{119,121,96},{97,99,77},{75,77,59},{48,49,35},{6,9,0}, -{187,185,136},{163,164,120},{141,142,104},{119,121,88},{97,99,71},{75,77,53},{48,49,30},{6,9,0},{188,184,125},{164,163,110},{142,141,95},{120,120,80},{97,98,64},{75,77,47},{48,49,25},{4,8,0},{189,184,114},{165,163,100},{142,141,86},{120,120,72},{97,98,57},{75,77,41},{48,49,19},{3,8,0},{190,184,102},{166,162,90},{143,140,77},{120,119,63},{98,98,50},{75,76,34},{48,49,13},{1,9,0}, -{190,184,88},{166,162,77},{143,140,66},{120,119,54},{98,98,41},{75,76,25},{48,49,7},{1,9,0},{191,183,74},{167,161,64},{144,139,54},{120,119,43},{98,97,31},{75,76,15},{47,49,2},{1,8,0},{191,183,60},{167,161,52},{144,139,43},{120,119,33},{98,97,21},{75,76,8},{47,49,1},{1,8,0},{192,182,48},{168,160,40},{144,139,32},{121,118,24},{98,97,11},{76,75,2},{47,49,0},{0,9,0}, -{178,178,216},{157,158,192},{136,137,168},{115,116,143},{95,95,119},{75,74,94},{49,47,64},{11,2,21},{180,177,205},{159,157,182},{137,136,159},{116,116,136},{96,95,112},{74,74,88},{49,46,59},{10,3,17},{182,177,194},{160,157,172},{138,136,151},{116,116,128},{96,95,105},{74,74,82},{49,46,54},{10,3,13},{183,177,184},{161,156,164},{140,136,143},{117,115,121},{96,94,99},{75,73,78},{49,46,50},{9,3,9}, -{184,177,175},{162,156,155},{141,136,135},{118,115,114},{96,94,93},{75,73,73},{49,46,46},{9,3,4},{186,176,165},{162,155,145},{140,135,126},{119,114,107},{97,93,87},{75,73,67},{48,46,42},{9,3,2},{187,176,154},{162,155,135},{140,135,118},{119,114,100},{97,93,81},{75,73,61},{48,46,37},{8,3,0},{187,175,143},{163,154,126},{141,134,109},{119,114,93},{97,93,74},{75,72,56},{49,45,32},{7,4,0}, -{187,175,132},{163,154,116},{141,134,101},{119,114,85},{97,93,68},{75,72,50},{49,45,28},{6,4,0},{188,174,122},{164,153,107},{142,133,92},{120,113,78},{98,92,61},{75,72,45},{48,45,23},{4,4,0},{188,174,111},{165,153,97},{142,133,83},{120,113,69},{98,92,55},{75,72,39},{48,45,17},{3,4,0},{189,173,99},{166,153,87},{143,133,74},{120,112,61},{98,92,48},{75,72,32},{48,45,10},{1,4,0}, -{190,173,86},{166,153,75},{143,133,64},{120,112,52},{98,92,39},{75,72,24},{48,45,6},{1,4,0},{191,173,73},{166,152,63},{144,132,53},{120,111,42},{98,91,30},{75,71,14},{47,45,2},{1,4,0},{191,173,60},{167,152,52},{144,132,43},{120,111,33},{98,91,20},{75,71,8},{47,45,1},{1,4,0},{191,172,48},{168,152,41},{144,131,32},{121,111,23},{98,91,11},{76,71,2},{47,45,0},{0,5,0}, -{180,166,209},{158,147,185},{137,128,162},{116,109,138},{96,88,114},{76,68,90},{50,41,61},{12,1,19},{181,166,198},{160,147,175},{138,127,153},{117,108,131},{96,88,108},{75,68,84},{50,41,57},{11,1,14},{182,166,188},{161,147,166},{139,127,145},{118,108,124},{96,88,101},{75,68,79},{50,41,52},{11,1,9},{183,165,178},{162,146,158},{140,127,138},{118,108,117},{97,87,96},{76,67,75},{50,41,48},{10,2,5}, -{184,165,169},{162,146,149},{141,127,130},{119,108,110},{97,87,90},{76,67,70},{50,41,44},{10,2,2},{185,164,159},{163,145,140},{141,126,122},{120,107,103},{97,87,84},{75,67,64},{49,41,40},{10,2,1},{186,164,148},{163,145,131},{141,126,114},{120,107,96},{97,87,78},{75,67,59},{49,41,35},{8,2,0},{186,164,139},{163,144,122},{141,126,106},{119,107,89},{97,86,72},{76,66,54},{49,41,30},{7,2,0}, -{187,164,128},{164,144,113},{142,126,98},{119,107,83},{97,86,66},{76,66,48},{49,41,26},{6,2,0},{188,163,119},{165,143,104},{143,125,90},{120,106,76},{98,86,59},{76,66,43},{49,41,21},{5,2,0},{188,163,108},{165,143,95},{143,125,81},{120,106,67},{98,86,53},{76,66,37},{49,41,15},{4,2,0},{189,162,97},{165,143,85},{142,124,72},{121,105,59},{98,85,46},{76,66,30},{48,41,8},{3,2,0}, -{189,162,84},{166,143,73},{142,124,62},{121,105,50},{98,85,38},{76,66,22},{48,41,4},{3,2,0},{190,162,72},{166,142,61},{143,123,51},{120,104,40},{98,85,29},{76,65,13},{48,41,1},{3,2,0},{190,162,60},{167,142,51},{143,123,42},{120,104,31},{98,85,19},{76,65,7},{48,41,1},{2,2,0},{190,161,48},{167,142,41},{143,123,32},{121,104,22},{98,85,10},{76,65,1},{48,41,0},{1,2,0}, -{180,155,201},{159,137,179},{137,120,156},{117,101,133},{96,82,110},{76,62,86},{50,36,58},{11,0,16},{181,154,191},{160,136,169},{138,119,148},{118,100,126},{97,81,104},{76,62,81},{50,36,54},{11,0,11},{182,154,182},{161,136,160},{139,119,140},{119,100,119},{97,81,98},{76,62,76},{50,36,49},{11,0,6},{183,154,172},{162,136,152},{140,118,133},{119,100,113},{97,81,93},{76,61,72},{50,36,45},{11,0,2}, -{184,154,163},{162,136,144},{141,118,125},{119,100,106},{97,81,87},{76,61,67},{50,36,41},{10,0,0},{185,153,153},{163,135,135},{141,118,117},{120,99,100},{97,80,81},{75,61,61},{50,36,37},{9,0,0},{185,153,143},{163,135,127},{141,118,110},{120,99,93},{97,80,75},{75,61,56},{50,36,32},{7,0,0},{186,153,134},{163,135,118},{141,118,103},{119,99,86},{97,80,69},{76,61,51},{49,36,28},{6,0,0}, -{187,153,124},{164,135,109},{142,118,95},{119,99,80},{97,80,63},{76,61,46},{49,36,24},{5,0,0},{188,152,115},{165,134,101},{143,117,87},{120,98,73},{98,79,57},{76,60,41},{49,36,19},{4,0,0},{188,152,105},{165,134,92},{143,117,79},{120,98,65},{98,79,51},{76,60,34},{49,36,13},{4,0,0},{189,151,95},{165,134,82},{142,116,70},{121,97,57},{98,79,44},{76,60,28},{48,36,6},{4,0,0}, -{189,151,82},{165,134,71},{142,116,60},{121,97,48},{98,79,36},{76,60,20},{48,36,3},{4,0,0},{190,151,70},{166,133,60},{143,115,50},{120,97,39},{98,79,27},{76,59,11},{48,36,1},{3,0,0},{190,151,60},{166,133,50},{143,115,41},{120,97,30},{98,79,18},{76,59,7},{48,36,1},{3,0,0},{190,150,48},{167,133,41},{143,115,32},{121,96,22},{98,79,9},{76,59,1},{48,36,0},{2,0,0}, -{181,144,194},{159,127,173},{138,111,151},{118,94,128},{97,75,106},{76,56,83},{51,30,55},{9,0,12},{182,143,184},{160,127,163},{139,110,143},{119,93,121},{98,74,100},{76,55,78},{50,31,51},{10,0,7},{183,143,175},{161,127,154},{139,110,135},{119,93,114},{98,74,94},{76,55,73},{50,31,46},{10,0,3},{184,143,166},{162,127,147},{140,110,128},{119,93,108},{98,74,89},{76,55,69},{50,31,42},{8,0,1}, -{184,143,158},{162,127,139},{140,110,120},{119,93,102},{98,74,84},{76,55,64},{50,31,38},{7,0,0},{185,142,148},{163,126,130},{141,109,113},{120,92,96},{98,73,78},{76,56,59},{50,31,34},{6,0,0},{185,142,139},{163,126,122},{141,109,106},{120,92,90},{98,73,72},{76,56,54},{50,31,30},{6,0,0},{186,142,130},{164,125,113},{141,109,99},{120,92,83},{98,73,66},{76,55,49},{50,31,26},{5,0,0}, -{186,142,120},{164,125,105},{141,109,91},{120,92,77},{98,73,60},{76,55,43},{50,31,21},{4,0,0},{187,141,111},{164,125,98},{142,108,84},{119,91,70},{98,72,54},{76,55,38},{50,31,16},{4,0,0},{188,141,102},{165,125,89},{142,108,76},{119,91,62},{98,72,48},{76,55,32},{50,31,10},{4,0,0},{189,141,92},{165,124,80},{142,107,68},{120,90,55},{98,72,42},{76,55,26},{49,31,4},{3,0,0}, -{189,141,80},{165,124,70},{142,107,59},{120,90,47},{98,72,35},{76,55,19},{49,31,2},{3,0,0},{189,141,68},{165,124,59},{142,107,49},{120,90,38},{98,72,26},{77,54,10},{49,31,0},{2,0,0},{189,141,59},{165,124,49},{142,107,40},{120,90,29},{98,72,17},{77,54,6},{49,31,0},{2,0,0},{190,141,49},{166,124,41},{143,107,31},{120,89,21},{98,72,8},{76,54,1},{48,31,0},{1,0,0}, -{181,133,187},{159,117,167},{138,102,145},{118,86,124},{98,68,102},{76,50,79},{51,23,52},{7,0,8},{182,133,178},{160,117,157},{139,101,137},{119,85,117},{98,68,96},{76,49,74},{50,24,48},{7,0,4},{183,133,169},{161,117,148},{139,101,130},{119,85,110},{98,68,90},{76,49,69},{50,25,44},{7,0,1},{184,133,160},{162,117,141},{140,101,123},{119,85,104},{98,68,85},{77,49,65},{50,25,40},{6,0,0}, -{184,133,152},{163,117,134},{140,101,116},{119,85,98},{98,68,80},{77,49,61},{50,25,36},{6,0,0},{185,132,143},{163,116,126},{141,101,109},{120,84,92},{98,67,74},{77,50,57},{50,25,32},{5,0,0},{186,132,135},{163,116,118},{141,101,102},{120,84,86},{98,67,69},{77,50,52},{50,25,28},{4,0,0},{186,132,126},{164,115,109},{141,100,95},{120,84,80},{98,67,64},{77,49,47},{50,25,24},{4,0,0}, -{186,132,116},{164,115,101},{141,100,88},{120,84,74},{98,67,58},{77,49,41},{50,25,19},{3,0,0},{187,131,107},{164,115,94},{141,100,81},{119,84,67},{98,66,52},{76,49,36},{50,26,14},{2,0,0},{188,131,98},{164,115,86},{141,100,74},{119,84,60},{98,66,46},{76,49,30},{50,26,8},{2,0,0},{188,131,89},{165,114,78},{142,99,66},{120,83,53},{98,66,40},{76,49,24},{49,26,3},{2,0,0}, -{188,131,78},{165,114,68},{142,99,57},{120,83,45},{98,66,33},{76,49,17},{49,26,1},{1,0,0},{189,131,66},{165,114,57},{142,99,47},{120,83,36},{98,66,24},{77,49,8},{49,27,0},{1,0,0},{189,131,57},{165,114,49},{142,99,39},{120,83,28},{98,66,15},{77,49,4},{49,27,0},{1,0,0},{189,131,49},{166,114,40},{143,99,31},{120,83,20},{98,66,7},{76,49,1},{48,27,0},{1,0,0}, -{182,122,180},{160,107,160},{138,93,139},{118,77,119},{98,61,98},{77,43,76},{51,16,49},{5,0,4},{183,122,171},{161,107,151},{139,92,132},{119,77,113},{98,61,92},{77,43,71},{51,17,45},{5,0,2},{184,122,162},{162,107,143},{140,92,125},{119,77,106},{98,61,86},{77,43,66},{51,18,42},{5,0,0},{185,122,154},{162,107,136},{140,92,119},{119,77,100},{98,61,81},{77,43,62},{50,18,38},{4,0,0}, -{185,122,146},{162,107,129},{140,92,112},{119,77,94},{98,61,76},{77,43,58},{50,18,34},{4,0,0},{185,122,138},{163,107,122},{141,92,105},{119,77,88},{98,60,71},{77,44,54},{51,19,30},{3,0,0},{185,122,130},{163,107,114},{141,92,98},{119,77,83},{98,60,66},{77,44,49},{51,19,26},{3,0,0},{186,121,121},{163,106,105},{142,91,91},{119,77,77},{98,60,61},{77,43,44},{50,20,22},{2,0,0}, -{186,121,112},{163,106,98},{142,91,85},{119,77,71},{98,60,56},{77,43,40},{50,20,17},{1,0,0},{187,121,104},{164,106,91},{142,91,78},{119,77,64},{98,60,51},{77,43,35},{50,21,12},{1,0,0},{187,121,95},{164,106,83},{142,91,71},{119,77,58},{98,60,45},{77,43,29},{50,21,7},{1,0,0},{187,121,86},{164,105,75},{142,91,64},{119,76,52},{98,60,39},{77,43,23},{49,21,3},{1,0,0}, -{187,121,76},{164,105,66},{142,91,56},{119,76,44},{98,60,31},{77,43,15},{49,21,1},{1,0,0},{188,120,65},{165,105,56},{142,91,46},{120,76,35},{98,59,23},{76,43,7},{48,21,0},{0,0,0},{188,120,56},{165,105,48},{142,91,38},{120,76,27},{98,59,14},{76,43,3},{48,21,0},{0,0,0},{188,120,48},{165,105,39},{143,90,30},{120,76,20},{98,59,6},{76,43,0},{48,22,0},{0,0,0}, -{182,110,173},{160,96,153},{139,83,134},{118,68,114},{98,53,94},{77,36,73},{51,10,46},{3,0,2},{183,110,164},{161,96,145},{140,83,127},{119,69,108},{98,53,89},{77,36,68},{51,11,42},{3,0,1},{184,110,156},{162,96,137},{140,83,120},{119,69,101},{98,53,83},{77,36,63},{51,11,39},{3,0,0},{185,110,149},{162,96,131},{141,83,114},{119,69,96},{98,53,78},{77,36,59},{50,12,35},{2,0,0}, -{185,110,141},{162,96,124},{141,83,107},{119,69,91},{98,53,73},{77,36,55},{50,12,31},{2,0,0},{185,110,133},{163,97,117},{141,83,101},{119,68,85},{98,53,68},{77,37,51},{51,12,27},{1,0,0},{185,110,125},{163,97,109},{141,83,95},{119,68,80},{98,53,63},{77,37,46},{51,12,23},{1,0,0},{186,110,117},{163,96,102},{142,82,88},{119,69,74},{98,53,58},{77,37,41},{50,13,19},{1,0,0}, -{186,110,109},{163,96,95},{142,82,82},{119,69,68},{98,53,53},{77,37,37},{50,13,14},{1,0,0},{187,110,101},{164,96,88},{142,82,75},{119,68,61},{98,53,48},{77,37,32},{50,14,10},{1,0,0},{187,110,92},{164,96,80},{142,82,69},{119,68,55},{98,53,42},{77,37,27},{50,14,5},{1,0,0},{187,110,84},{164,96,73},{142,82,62},{119,68,49},{98,53,36},{77,37,21},{49,15,3},{0,0,0}, -{187,110,74},{164,96,64},{142,82,54},{119,68,42},{98,53,29},{77,37,13},{49,15,1},{0,0,0},{188,109,64},{165,96,55},{142,82,45},{120,68,34},{98,53,21},{76,37,6},{48,15,0},{0,0,0},{188,109,55},{165,96,47},{142,82,37},{120,68,26},{98,53,13},{76,37,3},{48,15,0},{0,0,0},{188,109,47},{165,95,39},{143,82,30},{120,68,19},{98,53,6},{76,37,0},{48,16,0},{0,0,0}, -{182,98,167},{160,86,147},{139,73,128},{119,59,109},{98,44,90},{77,27,70},{51,4,44},{1,0,0},{183,98,158},{161,86,139},{140,73,122},{120,60,103},{98,44,85},{78,28,65},{51,5,40},{1,0,0},{183,98,150},{162,86,131},{141,73,115},{120,60,97},{98,44,79},{78,28,61},{51,5,37},{1,0,0},{184,98,143},{162,86,125},{141,73,109},{120,60,93},{98,45,75},{77,29,57},{50,5,33},{1,0,0}, -{185,98,136},{162,86,118},{141,73,103},{120,60,88},{98,45,70},{77,29,53},{50,5,29},{1,0,0},{185,98,128},{163,87,112},{141,73,97},{120,59,82},{98,46,65},{77,30,49},{50,5,25},{0,0,0},{185,98,120},{163,87,105},{141,73,91},{120,59,76},{98,46,60},{77,30,44},{50,5,21},{0,0,0},{186,98,113},{163,86,98},{141,73,85},{120,60,71},{98,46,55},{77,30,39},{50,6,16},{0,0,0}, -{186,98,105},{163,86,92},{141,73,79},{120,60,65},{98,46,51},{77,30,35},{50,6,12},{0,0,0},{186,98,98},{163,86,85},{141,73,73},{120,59,59},{98,46,46},{76,30,30},{49,7,8},{0,0,0},{186,98,90},{163,86,78},{141,73,67},{120,59,53},{98,46,40},{76,30,25},{49,7,4},{0,0,0},{187,98,81},{163,86,71},{141,73,60},{119,60,47},{98,46,34},{76,31,19},{48,8,2},{0,0,0}, -{187,98,72},{163,86,62},{141,73,52},{119,60,40},{98,46,27},{76,31,11},{48,8,1},{0,0,0},{187,98,62},{164,86,53},{142,73,43},{119,60,33},{98,46,19},{76,31,5},{48,9,0},{0,0,0},{187,98,54},{164,86,45},{142,73,36},{119,60,25},{98,46,12},{76,31,2},{48,9,0},{0,0,0},{188,98,47},{165,85,38},{143,73,29},{120,60,18},{98,47,6},{76,31,0},{47,10,0},{0,0,0}, -{182,84,161},{160,73,141},{139,61,123},{119,48,104},{98,33,86},{77,17,66},{51,2,41},{1,0,0},{183,84,152},{161,73,134},{140,62,117},{120,49,99},{98,34,81},{78,18,62},{51,2,37},{1,0,0},{183,84,144},{162,73,126},{141,62,110},{120,49,93},{98,34,75},{78,18,58},{51,2,34},{1,0,0},{184,84,138},{162,73,120},{141,62,105},{120,49,89},{98,35,71},{77,19,54},{50,2,30},{0,0,0}, -{185,84,131},{162,73,114},{141,62,99},{120,49,84},{98,35,67},{77,19,50},{50,2,26},{0,0,0},{185,85,123},{163,74,108},{141,63,93},{120,50,79},{98,36,62},{77,19,46},{50,2,22},{0,0,0},{185,85,116},{163,74,101},{141,63,88},{120,50,73},{98,36,57},{77,19,41},{50,2,18},{0,0,0},{186,85,109},{163,75,95},{141,63,82},{120,50,68},{98,36,52},{77,20,36},{50,2,13},{0,0,0}, -{186,85,102},{163,75,89},{141,63,76},{120,50,62},{98,36,48},{77,20,32},{50,2,9},{0,0,0},{186,85,95},{163,74,82},{141,63,70},{120,50,56},{98,37,43},{76,20,27},{49,3,6},{0,0,0},{186,85,87},{163,74,75},{141,63,64},{120,50,50},{98,37,37},{76,21,22},{49,3,3},{0,0,0},{187,85,79},{163,74,68},{141,63,57},{119,51,44},{98,38,31},{76,21,16},{48,4,2},{0,0,0}, -{187,85,71},{163,74,60},{141,63,50},{119,51,38},{98,38,25},{76,21,10},{48,4,1},{0,0,0},{187,85,61},{164,75,52},{142,63,42},{119,51,32},{98,38,18},{76,22,4},{48,5,0},{0,0,0},{187,85,54},{164,75,45},{142,63,36},{119,51,24},{98,38,12},{76,22,2},{48,5,0},{0,0,0},{188,85,47},{165,74,38},{143,63,29},{120,51,18},{98,38,6},{76,23,0},{47,5,0},{0,0,0}, -{182,69,154},{160,59,136},{140,48,118},{119,36,100},{98,21,82},{78,5,62},{51,0,38},{0,0,0},{183,70,146},{161,60,129},{141,49,112},{120,37,95},{98,22,77},{78,6,58},{50,0,34},{0,0,0},{184,70,138},{162,60,121},{141,49,106},{120,37,89},{98,22,71},{78,6,54},{50,0,31},{0,0,0},{185,71,132},{162,60,115},{140,50,101},{120,38,85},{99,23,67},{78,7,50},{50,0,27},{0,0,0}, -{185,71,125},{162,60,110},{140,50,95},{120,38,80},{99,23,63},{78,7,46},{50,0,24},{0,0,0},{185,72,119},{162,61,104},{140,51,89},{120,38,75},{98,24,59},{77,7,42},{50,0,20},{0,0,0},{185,72,112},{162,62,97},{140,51,84},{120,38,70},{98,25,54},{77,7,38},{50,0,15},{0,0,0},{185,72,105},{162,63,91},{140,51,78},{119,39,64},{98,26,49},{77,8,33},{50,0,10},{0,0,0}, -{185,72,98},{162,63,85},{140,51,72},{119,39,59},{98,26,45},{77,9,29},{50,0,7},{0,0,0},{186,73,91},{163,62,79},{141,51,67},{119,40,54},{98,27,40},{77,10,25},{50,1,4},{0,0,0},{186,73,84},{163,62,73},{141,51,61},{119,40,48},{98,27,35},{77,10,20},{50,1,2},{0,0,0},{186,73,77},{163,63,66},{141,51,55},{120,41,42},{98,28,29},{76,11,14},{49,1,1},{0,0,0}, -{186,73,69},{163,63,58},{141,51,48},{120,41,36},{98,28,23},{76,11,9},{49,1,1},{0,0,0},{187,72,60},{163,63,51},{141,52,41},{120,41,30},{98,29,17},{76,12,4},{48,1,0},{0,0,0},{187,72,53},{163,63,44},{141,52,35},{120,41,23},{98,29,10},{76,12,2},{48,1,0},{0,0,0},{187,72,46},{164,63,38},{142,52,29},{119,41,17},{98,29,4},{76,13,0},{48,1,0},{0,0,0}, -{182,49,147},{160,37,130},{140,26,113},{119,18,95},{98,10,77},{78,2,59},{51,0,35},{0,0,0},{183,50,140},{161,39,123},{141,28,107},{120,19,90},{98,11,73},{78,3,55},{50,0,32},{0,0,0},{184,50,132},{162,40,116},{141,29,101},{120,19,85},{98,11,69},{78,3,52},{50,0,29},{0,0,0},{185,51,126},{162,41,110},{140,30,96},{120,20,81},{99,12,65},{78,3,48},{50,0,25},{0,0,0}, -{185,52,120},{162,42,105},{140,31,91},{120,21,77},{99,12,61},{78,3,44},{50,0,21},{0,0,0},{185,53,114},{162,44,99},{140,33,86},{120,22,72},{98,12,56},{77,3,40},{50,0,17},{0,0,0},{185,54,108},{162,45,94},{140,34,81},{120,22,67},{98,13,52},{77,3,36},{50,0,13},{0,0,0},{185,54,101},{162,45,88},{140,34,75},{119,23,61},{98,13,47},{77,4,31},{50,0,9},{0,0,0}, -{185,55,94},{162,45,82},{140,35,70},{119,24,57},{98,13,43},{77,4,27},{50,0,6},{0,0,0},{186,55,87},{163,46,76},{141,36,65},{119,25,52},{98,14,38},{77,5,23},{50,1,4},{0,0,0},{186,55,81},{163,46,70},{141,37,59},{119,25,47},{98,14,33},{77,5,18},{50,1,2},{0,0,0},{186,56,75},{163,47,64},{141,37,53},{120,26,41},{98,15,28},{76,5,12},{49,1,1},{0,0,0}, -{186,56,67},{163,47,57},{141,38,47},{120,27,35},{98,15,22},{76,5,8},{49,1,1},{0,0,0},{187,56,59},{163,47,50},{141,38,40},{120,28,29},{98,16,16},{76,6,3},{48,1,0},{0,0,0},{187,56,53},{163,47,43},{141,38,34},{120,28,23},{98,16,10},{76,6,2},{48,1,0},{0,0,0},{187,56,46},{164,48,37},{142,39,29},{119,28,17},{98,16,4},{76,6,0},{48,1,0},{0,0,0}, -{183,28,141},{161,16,124},{140,3,108},{119,0,91},{99,0,73},{78,0,56},{50,0,32},{0,0,0},{184,29,134},{162,18,118},{140,6,102},{120,0,86},{99,0,69},{78,0,52},{50,0,29},{0,0,0},{184,29,127},{162,19,111},{140,8,96},{120,1,81},{99,0,66},{78,0,49},{50,0,26},{0,0,0},{185,31,121},{162,21,106},{141,9,92},{120,2,77},{99,0,62},{78,0,45},{50,0,22},{0,0,0}, -{185,32,116},{162,23,101},{141,11,87},{120,2,73},{99,0,58},{78,0,41},{50,0,19},{0,0,0},{185,34,110},{162,25,95},{140,14,82},{120,3,68},{99,0,53},{78,0,37},{49,0,14},{0,0,0},{185,35,104},{162,26,90},{140,16,77},{120,4,63},{99,0,49},{78,0,33},{49,0,10},{0,0,0},{185,35,97},{162,27,84},{140,17,72},{119,5,58},{99,0,45},{77,0,29},{49,0,7},{0,0,0}, -{185,36,91},{162,28,78},{140,19,67},{119,6,54},{99,0,41},{77,0,25},{49,0,5},{0,0,0},{185,37,84},{162,29,73},{140,20,62},{119,7,50},{98,1,36},{77,0,21},{49,0,4},{0,0,0},{185,38,78},{162,30,67},{140,21,56},{119,9,45},{98,1,31},{77,0,15},{49,0,2},{0,0,0},{185,39,72},{163,31,61},{140,22,50},{119,10,39},{98,1,26},{76,0,9},{48,0,0},{0,0,0}, -{185,39,65},{163,31,55},{140,23,45},{119,11,33},{98,2,20},{76,0,6},{48,0,0},{0,0,0},{186,38,58},{163,31,48},{141,24,39},{119,13,27},{98,3,14},{76,0,2},{47,0,0},{0,0,0},{186,38,52},{163,32,42},{141,24,33},{119,13,22},{98,3,9},{76,0,1},{47,0,0},{0,0,0},{186,39,46},{163,33,36},{141,25,28},{119,14,17},{98,3,4},{76,0,0},{47,0,0},{0,0,0}, -{132,213,247},{116,187,218},{101,164,190},{84,139,162},{67,114,135},{49,90,107},{25,61,75},{0,21,33},{135,212,234},{119,186,206},{103,163,180},{86,138,153},{69,114,128},{50,89,101},{25,61,70},{0,21,29},{138,212,221},{122,186,195},{105,163,171},{88,138,145},{70,114,120},{52,89,95},{25,61,65},{0,21,26},{141,211,209},{124,185,186},{107,162,162},{90,137,138},{72,113,114},{53,89,90},{26,60,61},{0,21,22}, -{144,210,198},{126,185,175},{109,162,153},{90,137,131},{72,113,107},{53,89,85},{26,60,57},{0,21,18},{145,209,187},{128,184,165},{109,161,144},{91,136,122},{73,112,101},{53,88,79},{27,60,52},{0,20,14},{147,209,174},{129,184,154},{110,161,134},{92,136,114},{73,112,94},{53,88,73},{27,60,47},{0,20,9},{148,208,162},{129,183,143},{112,160,125},{93,135,105},{74,111,87},{54,87,66},{28,60,42},{0,21,4}, -{150,207,150},{130,182,132},{113,159,115},{94,135,97},{75,111,80},{55,87,60},{28,60,37},{0,21,1},{152,206,138},{132,181,122},{114,158,105},{94,134,89},{75,111,73},{56,87,55},{28,59,32},{0,20,0},{154,206,126},{134,181,111},{114,158,95},{94,134,81},{75,111,65},{56,87,49},{28,59,26},{0,20,0},{155,206,112},{135,180,99},{115,157,85},{95,133,72},{76,110,57},{56,86,42},{29,59,20},{0,20,0}, -{155,206,99},{136,180,86},{116,157,74},{96,133,62},{76,110,48},{56,86,33},{29,59,13},{0,20,0},{157,205,84},{137,180,74},{117,156,62},{97,132,51},{77,109,39},{57,86,25},{29,58,4},{0,20,0},{158,205,71},{137,180,62},{117,156,52},{97,132,42},{77,109,30},{57,86,16},{29,58,2},{0,20,0},{160,204,58},{139,180,51},{118,156,42},{97,132,33},{77,108,22},{57,86,7},{29,58,0},{0,20,0}, -{136,202,239},{120,178,211},{104,155,184},{87,132,157},{69,108,131},{52,85,104},{28,57,72},{0,16,30},{138,201,226},{122,177,200},{106,154,174},{89,131,149},{71,108,124},{53,84,98},{28,56,67},{0,16,26},{141,200,214},{124,177,189},{108,154,165},{90,131,140},{72,108,116},{53,84,91},{28,56,62},{0,16,23},{144,199,203},{126,176,180},{110,153,156},{91,130,133},{73,107,110},{54,84,87},{29,56,58},{0,16,19}, -{146,199,192},{128,176,170},{111,153,148},{92,130,126},{74,107,103},{55,84,82},{29,56,54},{0,16,15},{148,198,181},{129,175,160},{112,152,139},{93,129,118},{75,106,97},{55,83,76},{30,56,50},{0,15,11},{149,198,169},{130,174,149},{113,152,130},{94,129,110},{75,106,90},{55,83,70},{30,56,45},{0,15,6},{150,197,157},{131,173,138},{114,151,121},{95,128,102},{76,106,83},{56,83,64},{30,56,40},{0,16,2}, -{152,196,145},{132,173,128},{114,150,112},{95,128,94},{76,106,77},{56,83,58},{30,56,35},{0,16,0},{154,195,134},{134,172,118},{115,149,102},{96,127,86},{76,105,70},{57,82,52},{30,55,30},{0,15,0},{155,195,123},{135,172,108},{115,149,93},{96,127,78},{76,105,62},{57,82,46},{30,55,24},{0,15,0},{157,195,110},{136,171,96},{116,148,83},{97,126,69},{77,104,55},{58,82,40},{30,55,18},{0,15,0}, -{157,195,96},{137,171,84},{117,148,72},{97,126,60},{77,104,46},{58,82,31},{30,55,11},{0,15,0},{158,194,83},{138,171,72},{118,147,60},{98,125,50},{78,103,37},{58,81,23},{30,54,3},{0,15,0},{159,194,70},{139,171,61},{118,147,51},{98,125,41},{78,103,29},{58,81,15},{30,54,1},{0,15,0},{160,193,58},{140,170,50},{118,147,41},{98,125,32},{78,103,21},{58,81,6},{30,54,0},{0,15,0}, -{139,190,231},{122,168,203},{106,146,177},{88,124,152},{71,102,126},{53,79,101},{30,52,70},{0,11,28},{142,189,218},{124,168,192},{108,145,168},{90,123,143},{73,101,119},{54,79,95},{31,52,65},{0,10,24},{144,189,206},{126,168,182},{109,145,159},{92,123,135},{74,101,112},{55,79,88},{31,52,60},{0,10,21},{146,188,196},{128,167,173},{111,144,150},{93,122,128},{75,100,106},{56,78,84},{31,51,56},{0,10,17}, -{148,188,185},{129,167,164},{113,144,142},{94,122,121},{76,100,100},{57,78,79},{31,51,52},{0,10,13},{150,187,174},{131,166,154},{114,143,134},{95,121,115},{76,100,94},{56,78,73},{32,52,48},{0,10,8},{151,187,163},{132,165,144},{114,143,126},{95,121,107},{76,100,87},{56,78,67},{32,52,43},{0,10,4},{152,186,152},{133,164,134},{115,142,117},{96,120,99},{77,99,80},{57,78,62},{31,51,38},{0,10,1}, -{153,186,141},{134,164,124},{115,142,109},{96,120,91},{77,99,74},{57,78,56},{31,51,33},{0,10,0},{154,185,131},{135,163,115},{116,141,100},{97,119,84},{77,98,67},{58,77,50},{32,51,28},{0,9,0},{155,185,120},{136,163,105},{116,141,91},{97,119,76},{77,98,60},{58,77,44},{32,51,22},{0,9,0},{157,184,108},{137,162,94},{117,140,81},{98,119,67},{78,98,53},{58,77,38},{32,51,16},{0,10,0}, -{158,184,95},{138,162,82},{118,140,71},{98,119,58},{78,98,45},{58,77,30},{32,51,9},{0,10,0},{159,183,82},{139,162,70},{119,139,59},{99,118,49},{78,97,36},{58,76,21},{32,51,3},{0,9,0},{159,183,70},{139,162,60},{119,139,50},{99,118,40},{78,97,28},{58,76,13},{32,51,1},{0,9,0},{160,183,58},{140,161,49},{119,139,40},{99,118,32},{79,97,20},{59,76,5},{32,50,0},{0,9,0}, -{142,180,223},{124,159,197},{109,138,173},{91,118,148},{74,96,122},{55,75,97},{33,48,66},{1,5,25},{145,179,211},{127,158,187},{110,137,164},{93,117,139},{75,95,115},{56,75,91},{33,48,62},{0,5,21},{147,179,200},{129,158,177},{111,137,155},{93,117,131},{75,95,108},{56,75,85},{33,48,58},{0,5,17},{148,178,190},{130,158,168},{113,137,146},{95,116,124},{76,95,102},{57,74,81},{33,47,54},{0,5,13}, -{149,178,179},{131,158,160},{114,137,138},{95,116,117},{77,95,97},{58,74,76},{33,47,50},{0,5,9},{151,178,169},{132,157,150},{115,136,130},{96,115,111},{77,94,91},{58,74,70},{34,48,45},{0,5,4},{152,178,159},{133,156,140},{115,136,122},{96,115,103},{77,94,84},{58,74,64},{34,48,40},{0,5,2},{153,177,148},{134,155,130},{116,135,113},{97,114,96},{78,94,77},{59,73,59},{33,47,36},{0,6,0}, -{154,176,137},{135,155,120},{116,135,105},{98,114,89},{78,94,71},{59,73,54},{33,47,31},{0,6,0},{155,175,127},{136,154,111},{117,134,96},{99,114,82},{79,93,65},{59,73,48},{33,47,26},{0,5,0},{156,175,116},{137,154,102},{117,134,88},{99,114,74},{79,93,58},{59,73,42},{33,47,20},{0,5,0},{158,175,105},{138,153,92},{118,133,79},{99,113,65},{79,93,51},{60,73,36},{33,47,14},{0,5,0}, -{159,175,92},{138,153,80},{119,133,69},{99,113,56},{79,93,43},{60,73,28},{33,47,8},{0,5,0},{160,174,80},{139,153,69},{119,132,57},{99,112,47},{79,92,35},{60,72,19},{33,47,3},{0,5,0},{160,174,68},{140,153,59},{119,132,49},{99,112,39},{79,92,27},{60,72,12},{33,47,1},{0,5,0},{160,173,58},{141,152,48},{120,132,41},{100,112,31},{80,92,19},{60,72,4},{33,46,0},{0,5,0}, -{144,169,215},{127,150,190},{110,130,167},{94,110,143},{75,90,118},{57,70,93},{34,44,63},{1,1,22},{146,168,204},{129,149,181},{112,130,159},{95,110,135},{76,90,111},{58,70,88},{34,44,59},{0,1,18},{148,168,193},{131,149,172},{113,130,150},{95,110,127},{76,90,104},{58,70,82},{34,44,55},{0,1,14},{150,168,184},{132,148,163},{114,129,142},{96,109,120},{77,89,99},{59,69,78},{35,43,51},{0,1,10}, -{151,168,174},{133,148,155},{115,129,134},{97,109,113},{77,89,94},{59,69,73},{35,43,47},{0,1,6},{153,167,164},{134,148,145},{115,128,126},{97,109,107},{78,89,88},{59,69,67},{35,44,42},{0,1,2},{153,167,154},{134,147,136},{116,128,118},{98,109,100},{78,89,81},{59,69,61},{35,44,37},{0,1,0},{154,166,143},{135,147,127},{117,127,110},{98,108,93},{79,89,74},{59,68,56},{35,43,33},{0,2,0}, -{155,166,133},{136,147,117},{117,127,102},{98,108,86},{79,89,68},{59,68,51},{35,43,29},{0,2,0},{156,165,124},{137,146,108},{118,127,93},{99,107,79},{80,88,62},{60,68,46},{35,43,24},{0,2,0},{156,165,113},{138,146,99},{118,127,85},{99,107,71},{80,88,56},{60,68,40},{35,43,18},{0,2,0},{158,164,102},{139,145,89},{119,126,76},{99,107,63},{80,88,49},{60,68,34},{34,43,12},{0,2,0}, -{159,164,89},{139,145,78},{119,126,67},{99,107,55},{80,88,42},{60,68,26},{34,43,8},{0,2,0},{160,164,78},{140,144,67},{119,125,56},{99,106,46},{80,87,34},{60,67,18},{34,43,3},{0,2,0},{160,164,68},{141,144,58},{119,125,48},{99,106,38},{80,87,26},{60,67,11},{34,43,1},{0,2,0},{161,163,57},{142,144,48},{120,125,40},{100,105,30},{80,87,18},{61,67,4},{34,42,0},{0,2,0}, -{146,158,208},{129,140,184},{112,122,161},{95,103,137},{77,84,114},{59,64,89},{36,38,61},{1,0,20},{148,158,197},{131,139,175},{114,121,153},{96,103,130},{78,84,107},{59,64,84},{36,39,57},{1,1,15},{150,158,187},{132,139,166},{115,121,144},{97,103,123},{78,84,101},{59,64,79},{36,39,52},{1,1,10},{151,158,178},{134,138,157},{116,121,137},{97,102,116},{79,83,96},{60,64,75},{36,38,48},{1,1,6}, -{152,158,168},{135,138,149},{116,121,130},{98,102,110},{79,83,91},{60,64,70},{36,38,44},{1,1,3},{154,157,159},{136,138,139},{117,120,122},{99,102,103},{79,83,85},{60,63,65},{36,39,40},{1,1,1},{154,157,149},{136,138,131},{117,120,114},{99,102,96},{79,83,79},{60,63,59},{36,39,35},{0,1,0},{155,156,139},{137,137,122},{118,120,106},{99,101,89},{80,83,72},{60,63,54},{36,39,31},{0,1,0}, -{156,156,129},{137,137,113},{118,120,98},{99,101,83},{80,83,66},{60,63,49},{36,39,27},{0,1,0},{157,155,120},{138,136,105},{118,119,91},{99,100,76},{80,82,60},{61,63,44},{36,39,22},{0,1,0},{158,155,110},{138,136,96},{118,119,83},{99,100,69},{80,82,54},{61,63,38},{36,39,16},{0,1,0},{159,154,100},{139,136,87},{119,118,74},{100,100,61},{81,82,47},{61,63,32},{36,39,10},{0,1,0}, -{160,154,87},{140,136,76},{119,118,65},{100,100,53},{81,82,40},{61,63,24},{36,39,6},{0,1,0},{161,154,76},{141,135,66},{120,117,55},{100,99,44},{81,81,32},{61,62,16},{35,39,2},{0,1,0},{161,154,67},{141,135,57},{120,117,47},{100,99,37},{81,81,24},{61,62,10},{35,39,1},{0,1,0},{161,153,56},{141,135,48},{121,117,39},{100,99,29},{81,81,16},{61,62,3},{35,38,0},{0,1,0}, -{148,147,200},{131,130,178},{113,114,155},{96,95,132},{78,78,110},{59,59,86},{37,33,58},{1,0,17},{150,147,190},{133,130,169},{115,113,147},{97,95,125},{79,78,104},{60,58,81},{37,34,54},{1,0,12},{152,147,181},{134,130,160},{116,113,139},{98,95,118},{79,78,98},{61,58,76},{37,34,49},{1,0,7},{153,147,172},{135,129,151},{117,112,132},{98,95,112},{80,77,93},{61,58,72},{37,33,45},{1,0,3}, -{154,147,163},{135,129,143},{117,112,125},{98,95,107},{80,77,88},{61,58,67},{37,33,41},{1,0,1},{155,146,154},{136,129,134},{118,112,118},{99,94,100},{80,77,82},{61,58,62},{37,34,37},{1,0,0},{155,146,144},{137,129,126},{118,112,111},{99,94,93},{80,77,76},{61,58,57},{37,34,33},{0,0,0},{156,145,135},{137,129,118},{119,112,103},{99,94,86},{80,77,70},{61,58,52},{36,34,29},{0,0,0}, -{157,145,125},{137,129,110},{119,112,95},{99,94,80},{80,77,64},{61,58,47},{36,34,25},{0,0,0},{158,144,116},{138,128,102},{119,111,88},{99,94,73},{80,76,58},{62,58,41},{36,34,20},{0,0,0},{158,144,107},{138,128,93},{119,111,80},{99,94,66},{80,76,52},{62,58,35},{36,34,14},{0,0,0},{159,144,97},{139,127,84},{120,110,72},{100,93,59},{81,76,45},{62,58,29},{36,34,8},{0,0,0}, -{160,144,85},{140,127,74},{120,110,63},{100,93,51},{81,76,38},{62,58,22},{36,34,4},{0,0,0},{161,144,74},{141,127,64},{121,109,53},{101,93,42},{82,75,30},{62,57,15},{36,34,1},{0,0,0},{161,144,66},{141,127,56},{121,109,46},{101,93,35},{82,75,22},{62,57,9},{36,34,1},{0,0,0},{161,144,56},{141,126,48},{121,109,38},{101,93,28},{82,75,15},{62,57,3},{35,34,0},{0,0,0}, -{150,137,193},{132,121,172},{114,106,150},{97,88,128},{79,71,106},{60,53,83},{38,28,55},{0,0,13},{152,137,183},{134,121,163},{116,105,142},{98,88,121},{80,71,100},{61,53,78},{38,28,51},{1,0,8},{153,137,174},{135,121,154},{117,105,134},{99,88,114},{80,71,94},{62,53,73},{38,28,47},{1,0,4},{154,137,166},{136,120,146},{118,105,127},{99,88,108},{81,71,90},{62,53,69},{38,28,43},{1,0,2}, -{155,137,158},{136,120,138},{118,105,120},{99,88,103},{81,71,85},{62,53,64},{38,28,39},{1,0,0},{156,136,149},{137,120,130},{119,104,114},{100,87,97},{81,70,79},{62,53,59},{38,29,35},{0,0,0},{156,136,139},{137,120,122},{119,104,107},{100,87,90},{81,70,73},{62,53,54},{38,29,31},{0,0,0},{157,136,130},{138,120,114},{120,104,99},{100,87,83},{81,70,67},{62,53,49},{37,29,26},{0,0,0}, -{158,136,121},{138,120,106},{120,104,92},{100,87,77},{81,70,61},{62,53,44},{37,29,22},{0,0,0},{159,135,112},{138,119,98},{120,103,85},{100,87,70},{81,70,55},{62,53,39},{37,29,17},{0,0,0},{159,135,103},{139,119,90},{120,103,77},{100,87,64},{81,70,49},{62,53,33},{37,29,11},{0,0,0},{160,135,94},{140,119,82},{121,103,70},{101,86,57},{82,70,43},{62,53,27},{37,29,5},{0,0,0}, -{161,135,83},{140,119,72},{121,103,61},{101,86,49},{82,70,37},{62,53,21},{37,29,3},{0,0,0},{161,135,73},{141,118,62},{121,102,52},{101,86,41},{82,69,29},{63,52,14},{36,30,1},{0,0,0},{161,135,65},{141,118,54},{121,102,45},{101,86,34},{82,69,21},{63,52,8},{36,30,1},{0,0,0},{162,135,56},{142,118,47},{121,102,37},{101,86,27},{82,69,14},{63,52,2},{36,30,0},{0,0,0}, -{152,127,187},{134,111,166},{116,97,145},{99,82,124},{80,65,102},{62,47,79},{39,21,53},{0,0,9},{153,127,177},{135,111,157},{117,97,138},{100,82,117},{81,65,96},{62,47,74},{38,22,49},{0,0,5},{154,127,168},{136,111,148},{118,97,130},{100,82,110},{81,65,90},{62,47,70},{38,22,45},{0,0,1},{155,127,160},{137,111,141},{119,97,123},{100,82,104},{82,65,86},{63,47,66},{38,23,41},{0,0,1}, -{156,127,152},{137,111,134},{119,97,116},{100,82,99},{82,65,81},{63,47,62},{38,23,37},{0,0,0},{157,126,144},{138,111,126},{119,96,110},{101,81,93},{82,64,75},{63,47,57},{38,23,33},{0,0,0},{158,126,135},{138,111,118},{119,96,103},{101,81,87},{82,64,69},{63,47,52},{38,23,29},{0,0,0},{158,126,126},{139,110,110},{120,96,95},{101,81,80},{82,64,64},{63,47,47},{38,24,24},{0,0,0}, -{158,126,117},{139,110,102},{120,96,89},{101,81,74},{82,64,58},{63,47,42},{38,24,20},{0,0,0},{159,125,109},{139,110,95},{120,96,82},{101,81,68},{82,64,53},{62,47,37},{38,25,15},{0,0,0},{159,125,100},{140,110,88},{120,96,75},{101,81,62},{82,64,47},{62,47,31},{38,25,9},{0,0,0},{160,125,91},{140,110,80},{121,96,68},{101,80,55},{82,64,41},{62,47,25},{38,25,4},{0,0,0}, -{161,125,81},{140,110,70},{121,96,59},{101,80,47},{82,64,35},{62,47,19},{38,25,2},{0,0,0},{161,125,71},{141,109,60},{121,95,50},{101,80,39},{82,63,27},{63,47,12},{37,26,1},{0,0,0},{161,125,63},{141,109,52},{121,95,43},{101,80,32},{82,63,19},{63,47,6},{37,26,1},{0,0,0},{162,125,55},{142,109,46},{121,95,36},{101,80,26},{82,63,13},{63,47,2},{36,26,0},{0,0,0}, -{153,117,180},{135,103,159},{117,89,140},{100,75,119},{81,58,98},{63,40,76},{39,14,50},{0,0,5},{154,117,171},{136,103,151},{118,89,133},{101,75,113},{82,58,92},{63,41,71},{39,15,46},{0,0,3},{156,117,162},{137,103,143},{119,89,125},{101,75,106},{82,58,86},{63,41,67},{39,16,42},{0,0,0},{157,117,154},{138,103,136},{119,89,119},{101,75,100},{82,58,82},{63,41,63},{39,17,38},{0,0,0}, -{157,117,146},{138,103,129},{119,89,112},{101,75,95},{82,58,77},{63,41,59},{39,17,35},{0,0,0},{158,116,139},{139,103,122},{120,89,106},{101,74,89},{83,57,71},{64,41,54},{39,18,31},{0,0,0},{158,116,131},{139,103,114},{120,89,99},{101,74,84},{83,57,66},{64,41,49},{39,18,27},{0,0,0},{159,116,122},{139,102,106},{121,88,92},{101,74,78},{82,58,61},{63,41,45},{39,19,23},{0,0,0}, -{159,116,113},{139,102,99},{121,88,86},{101,74,72},{82,58,57},{63,41,41},{39,19,18},{0,0,0},{159,116,106},{140,102,92},{121,88,79},{101,74,65},{82,58,52},{63,42,36},{39,20,13},{0,0,0},{159,116,98},{140,102,85},{121,88,73},{101,74,59},{82,58,46},{63,42,30},{39,20,8},{0,0,0},{160,116,89},{141,102,77},{121,88,66},{101,73,53},{82,57,40},{63,42,24},{38,20,4},{0,0,0}, -{161,116,79},{141,102,69},{121,88,58},{101,73,46},{82,57,33},{63,42,17},{38,20,2},{0,0,0},{162,115,70},{141,101,59},{121,88,49},{102,73,38},{83,57,26},{63,42,10},{37,21,0},{0,0,0},{162,115,62},{141,101,51},{121,88,42},{102,73,31},{83,57,18},{63,42,5},{37,21,0},{0,0,0},{161,115,54},{142,101,45},{122,88,35},{102,73,25},{83,57,12},{63,42,2},{37,21,0},{0,0,0}, -{154,106,173},{135,93,153},{118,80,134},{100,66,114},{82,51,94},{63,33,73},{40,9,47},{0,0,3},{155,106,164},{137,94,145},{119,80,128},{101,67,108},{83,51,89},{63,34,68},{40,10,43},{0,0,1},{156,106,156},{138,94,138},{119,80,120},{101,67,101},{83,51,83},{63,34,64},{40,10,39},{0,0,0},{157,106,149},{138,94,131},{120,80,114},{102,66,97},{83,51,79},{63,34,60},{40,11,35},{0,0,0}, -{158,106,141},{139,94,124},{120,80,108},{102,66,92},{83,51,74},{63,34,56},{40,11,32},{0,0,0},{158,106,134},{139,94,117},{120,80,102},{102,66,86},{83,51,68},{64,35,52},{40,12,28},{0,0,0},{158,106,126},{139,94,110},{120,80,96},{102,66,81},{83,51,63},{64,35,47},{40,12,24},{0,0,0},{159,106,118},{139,93,103},{121,80,89},{101,66,75},{82,51,58},{63,35,42},{39,13,20},{0,0,0}, -{159,106,110},{139,93,96},{121,80,83},{101,66,69},{82,51,54},{63,35,38},{39,13,16},{0,0,0},{159,106,103},{140,93,89},{121,80,76},{102,66,62},{83,52,49},{63,36,34},{39,14,11},{0,0,0},{159,106,95},{140,93,82},{121,80,70},{102,66,57},{83,52,44},{63,36,28},{39,14,7},{0,0,0},{160,106,86},{141,93,74},{121,80,63},{101,66,51},{82,51,38},{63,36,22},{38,14,3},{0,0,0}, -{161,106,77},{141,93,66},{121,80,56},{101,66,44},{82,51,31},{63,36,15},{38,14,1},{0,0,0},{162,106,68},{141,92,58},{121,80,47},{102,66,37},{83,51,24},{63,36,8},{37,15,0},{0,0,0},{162,106,60},{141,92,50},{121,80,40},{102,66,30},{83,51,17},{63,36,5},{37,15,0},{0,0,0},{161,105,53},{142,92,44},{122,80,35},{102,66,24},{83,51,11},{63,36,2},{37,15,0},{0,0,0}, -{155,96,167},{136,83,147},{119,71,128},{101,57,109},{83,42,90},{64,25,70},{41,3,45},{0,0,1},{156,95,158},{138,84,139},{120,71,122},{102,58,103},{84,43,85},{64,26,65},{40,4,41},{0,0,0},{157,95,150},{139,84,132},{120,71,115},{102,58,97},{84,43,79},{64,27,61},{40,4,37},{0,0,0},{158,95,143},{139,84,126},{121,71,110},{103,58,93},{84,43,75},{64,27,57},{40,5,33},{0,0,0}, -{159,95,136},{139,84,119},{121,71,104},{103,58,88},{84,43,71},{64,27,54},{40,5,30},{0,0,0},{159,96,129},{140,84,113},{121,71,98},{103,58,82},{84,44,66},{64,28,50},{40,5,26},{0,0,0},{159,96,121},{140,84,106},{121,71,92},{103,58,77},{84,44,61},{64,28,45},{40,5,22},{0,0,0},{160,96,114},{140,84,99},{121,71,86},{102,58,72},{83,44,56},{64,29,40},{40,6,18},{0,0,0}, -{160,96,107},{140,84,93},{121,71,80},{102,58,66},{83,44,52},{64,29,36},{40,6,14},{0,0,0},{160,96,100},{140,83,86},{121,72,74},{103,58,60},{84,45,47},{64,29,32},{39,7,9},{0,0,0},{160,96,92},{140,83,79},{121,72,68},{103,58,55},{84,45,42},{64,29,26},{39,7,5},{0,0,0},{161,95,83},{141,83,72},{121,71,61},{102,58,49},{83,45,36},{63,30,20},{39,8,3},{0,0,0}, -{161,95,75},{141,83,64},{121,71,54},{102,58,42},{83,45,29},{63,30,14},{39,8,1},{0,0,0},{161,96,66},{142,83,56},{122,71,46},{102,58,35},{83,45,22},{63,30,7},{38,8,0},{0,0,0},{161,96,59},{142,83,49},{122,71,39},{102,58,29},{83,45,15},{63,30,4},{38,8,0},{0,0,0},{162,95,52},{142,83,43},{123,71,34},{103,58,23},{84,45,9},{63,30,1},{37,9,0},{0,0,0}, -{155,83,161},{137,72,141},{119,60,123},{101,47,105},{83,32,86},{64,16,67},{41,1,42},{0,0,0},{157,83,153},{138,72,134},{120,61,117},{102,48,99},{84,33,81},{64,16,62},{40,2,38},{0,0,0},{157,83,145},{139,72,127},{120,61,110},{102,48,93},{84,33,76},{64,17,58},{40,2,34},{0,0,0},{158,83,138},{140,72,121},{121,61,106},{103,48,89},{84,34,72},{64,17,54},{40,2,30},{0,0,0}, -{159,83,131},{140,72,115},{121,61,100},{103,48,84},{84,34,68},{64,17,51},{40,2,27},{0,0,0},{159,84,124},{140,73,109},{121,61,94},{103,49,79},{84,35,63},{64,18,47},{40,2,23},{0,0,0},{159,84,117},{140,73,102},{121,61,88},{103,49,74},{84,35,58},{64,18,42},{40,2,19},{0,0,0},{160,84,110},{140,73,96},{121,62,83},{103,49,69},{84,36,53},{64,19,37},{40,2,15},{0,0,0}, -{160,84,103},{140,73,90},{121,62,77},{103,49,63},{84,36,49},{64,19,33},{40,3,11},{0,0,0},{160,84,96},{140,73,83},{121,62,71},{103,49,57},{84,36,44},{64,19,29},{39,4,7},{0,0,0},{160,84,89},{141,73,76},{121,62,65},{103,49,52},{84,36,39},{64,20,24},{39,4,4},{0,0,0},{161,84,81},{141,73,70},{121,62,58},{102,50,46},{83,37,33},{63,21,18},{39,4,2},{0,0,0}, -{161,84,73},{141,73,62},{121,62,51},{102,50,40},{83,37,27},{63,21,13},{39,4,1},{0,0,0},{161,84,65},{142,73,55},{122,62,45},{102,50,34},{83,37,21},{63,21,6},{38,4,0},{0,0,0},{161,84,58},{142,73,48},{122,62,38},{102,50,28},{83,37,14},{63,21,3},{38,4,0},{0,0,0},{162,84,52},{143,73,42},{123,62,33},{103,50,22},{84,37,8},{63,22,1},{37,5,0},{0,0,0}, -{156,70,154},{138,60,136},{120,48,118},{102,35,101},{84,20,82},{65,5,63},{41,0,39},{0,0,0},{158,70,147},{139,60,129},{121,49,112},{103,36,95},{84,22,77},{65,6,59},{40,0,35},{0,0,0},{159,70,139},{140,60,122},{121,49,106},{103,37,89},{84,23,72},{65,6,55},{40,0,32},{0,0,0},{160,71,132},{140,60,116},{122,49,102},{104,38,85},{85,23,68},{65,6,51},{40,0,28},{0,0,0}, -{160,71,126},{140,60,111},{122,49,96},{104,38,80},{85,23,64},{65,6,47},{40,0,25},{0,0,0},{160,72,120},{140,61,105},{121,50,90},{103,39,75},{84,24,60},{65,7,43},{40,0,21},{0,0,0},{160,72,113},{140,61,98},{121,50,84},{103,39,70},{84,25,55},{65,7,39},{40,0,17},{0,0,0},{160,72,106},{140,62,92},{122,50,79},{103,39,65},{84,26,50},{65,8,35},{40,0,12},{0,0,0}, -{160,72,99},{140,62,86},{122,50,74},{103,39,60},{84,27,46},{65,9,31},{40,0,8},{0,0,0},{161,72,92},{141,62,80},{122,51,68},{103,40,55},{84,27,42},{64,9,27},{40,0,5},{0,0,0},{161,72,86},{141,62,74},{122,51,62},{103,40,50},{84,27,37},{64,10,22},{40,0,3},{0,0,0},{161,72,79},{142,62,68},{122,51,56},{103,40,44},{84,28,31},{64,11,16},{39,1,1},{0,0,0}, -{161,72,71},{142,62,60},{122,51,49},{103,40,38},{84,28,25},{64,11,11},{39,1,1},{0,0,0},{162,72,63},{142,62,53},{122,51,43},{103,41,32},{84,28,19},{64,12,5},{38,1,0},{0,0,0},{162,72,57},{142,62,47},{122,51,37},{103,41,26},{84,28,13},{64,12,2},{38,1,0},{0,0,0},{162,72,51},{143,62,41},{122,52,32},{102,41,21},{83,29,7},{63,13,0},{38,1,0},{0,0,0}, -{157,53,148},{138,42,130},{121,29,113},{102,18,96},{84,10,78},{65,2,60},{40,0,36},{0,0,0},{158,53,141},{139,43,124},{121,31,107},{103,20,91},{84,11,74},{65,3,56},{40,0,33},{0,0,0},{159,53,133},{140,43,117},{121,32,101},{103,20,86},{84,12,69},{65,3,52},{40,0,30},{0,0,0},{160,53,127},{140,44,111},{122,33,97},{104,21,82},{85,12,65},{65,3,48},{40,0,26},{0,0,0}, -{160,54,121},{140,44,106},{122,34,92},{104,22,77},{85,12,61},{65,3,45},{40,0,22},{0,0,0},{160,55,115},{140,45,101},{122,35,87},{103,23,73},{84,12,57},{65,3,41},{40,0,18},{0,0,0},{160,56,109},{140,46,95},{122,36,82},{103,24,68},{84,13,53},{65,3,37},{40,0,15},{0,0,0},{160,56,102},{140,47,89},{122,36,77},{103,25,63},{84,13,48},{65,4,33},{40,0,11},{0,0,0}, -{160,56,96},{140,47,83},{122,37,72},{103,26,58},{84,14,44},{65,4,29},{40,0,7},{0,0,0},{161,57,89},{141,47,78},{122,37,66},{103,27,53},{84,15,40},{64,4,25},{40,0,5},{0,0,0},{161,57,83},{141,47,72},{122,38,60},{103,27,48},{84,15,35},{64,5,20},{40,0,3},{0,0,0},{161,57,77},{142,48,66},{122,39,54},{103,27,42},{84,16,29},{64,5,14},{39,1,1},{0,0,0}, -{161,57,69},{142,49,59},{122,39,48},{103,28,37},{84,16,24},{64,5,9},{39,1,1},{0,0,0},{162,58,62},{142,49,52},{122,40,42},{103,29,31},{84,16,18},{64,6,4},{38,1,0},{0,0,0},{162,58,56},{142,49,46},{122,40,36},{103,29,25},{84,16,12},{64,6,2},{38,1,0},{0,0,0},{162,58,50},{143,49,41},{122,40,31},{102,29,20},{83,17,6},{63,6,0},{38,1,0},{0,0,0}, -{158,35,142},{139,25,125},{122,10,108},{103,1,91},{85,0,74},{65,0,57},{39,0,33},{0,0,0},{159,35,135},{140,26,119},{122,13,103},{103,2,87},{85,0,70},{65,0,53},{39,0,30},{0,0,0},{160,35,128},{140,27,112},{122,15,97},{103,3,82},{85,0,66},{65,0,50},{39,0,27},{0,0,0},{160,37,122},{141,28,107},{122,17,93},{103,5,78},{85,0,62},{65,0,46},{39,0,23},{0,0,0}, -{160,38,117},{141,28,102},{122,18,88},{103,6,74},{85,0,58},{65,0,42},{39,0,19},{0,0,0},{160,39,111},{140,30,97},{122,19,84},{103,7,70},{85,0,54},{65,0,38},{39,0,15},{0,0,0},{160,40,105},{140,31,92},{122,21,79},{103,9,65},{85,0,50},{65,0,34},{39,0,12},{0,0,0},{160,41,98},{141,32,86},{122,22,74},{104,10,60},{85,1,46},{65,0,30},{39,0,9},{0,0,0}, -{160,41,92},{141,32,80},{122,23,69},{104,12,56},{85,1,42},{65,0,26},{39,0,6},{0,0,0},{161,42,86},{141,33,75},{122,24,64},{103,13,51},{84,2,38},{64,0,22},{38,0,4},{0,0,0},{161,42,80},{141,33,69},{122,25,58},{103,14,46},{84,2,33},{64,0,17},{38,0,2},{0,0,0},{161,43,74},{142,34,63},{122,26,52},{103,15,40},{84,3,27},{64,0,11},{37,0,1},{0,0,0}, -{161,43,67},{142,35,57},{122,27,47},{103,16,35},{84,3,22},{64,0,7},{37,0,1},{0,0,0},{162,44,61},{142,36,51},{122,28,41},{103,17,30},{84,4,16},{64,0,3},{37,0,0},{0,0,0},{162,44,55},{142,36,45},{122,28,35},{103,17,24},{84,4,11},{64,0,2},{37,0,0},{0,0,0},{163,44,49},{142,37,40},{123,28,30},{103,17,19},{84,4,5},{64,0,0},{36,0,0},{0,0,0}, -{76,202,245},{68,178,216},{56,155,188},{45,132,161},{32,108,134},{17,86,107},{5,58,75},{0,19,34},{82,201,232},{74,177,204},{62,154,178},{50,132,152},{35,108,127},{19,85,101},{5,57,70},{0,18,30},{89,200,219},{80,176,193},{67,154,169},{54,132,144},{38,108,119},{20,85,94},{5,57,65},{0,18,27},{94,199,207},{82,176,184},{70,153,160},{56,131,137},{41,108,113},{22,85,90},{6,57,61},{0,18,23}, -{98,199,196},{85,176,174},{72,153,152},{59,131,129},{43,108,107},{24,85,85},{6,57,57},{0,18,20},{100,198,185},{88,175,164},{74,152,142},{61,130,122},{44,107,101},{25,84,79},{7,57,53},{0,18,14},{102,197,173},{90,174,153},{76,152,134},{62,130,114},{45,107,94},{27,84,74},{8,57,48},{0,18,10},{104,197,162},{91,173,143},{78,151,125},{63,129,106},{47,106,87},{29,83,67},{8,56,44},{0,18,6}, -{107,196,151},{93,173,133},{80,150,116},{65,129,98},{48,106,80},{30,83,61},{8,56,39},{0,18,3},{109,195,139},{96,172,123},{81,149,107},{66,128,91},{49,105,73},{31,83,56},{9,56,34},{0,17,1},{111,195,128},{98,172,112},{82,149,97},{67,128,83},{49,105,66},{31,83,50},{9,56,28},{0,17,0},{113,194,115},{99,171,101},{84,149,87},{68,127,74},{51,105,59},{33,82,43},{9,56,22},{0,17,0}, -{115,194,102},{100,171,90},{85,149,77},{68,127,64},{52,105,51},{33,82,36},{9,56,15},{0,17,0},{118,194,89},{101,170,78},{86,148,66},{69,126,55},{53,104,43},{34,82,29},{10,56,8},{0,17,0},{119,194,77},{102,170,68},{87,148,58},{69,126,47},{53,104,35},{34,82,21},{10,56,4},{0,17,0},{121,193,66},{104,170,57},{88,148,48},{70,126,39},{53,104,28},{34,82,13},{9,55,1},{0,16,0}, -{85,191,237},{76,168,209},{64,147,182},{52,125,156},{38,103,129},{23,81,103},{7,53,72},{0,13,31},{91,190,224},{81,167,198},{68,146,172},{55,125,148},{41,103,123},{24,80,97},{8,53,67},{0,13,27},{96,190,212},{85,167,187},{72,146,164},{59,125,140},{43,103,115},{26,80,91},{8,53,63},{0,13,24},{100,189,201},{88,167,178},{75,145,155},{61,124,133},{45,102,109},{27,80,87},{9,53,59},{0,12,20}, -{103,188,190},{90,167,168},{77,145,147},{63,124,125},{46,102,103},{29,80,82},{9,53,55},{0,12,17},{105,187,179},{92,166,159},{79,144,138},{64,123,118},{48,101,97},{30,79,76},{10,53,50},{0,12,11},{107,187,168},{94,165,148},{80,144,130},{65,123,110},{49,101,91},{31,79,71},{10,53,45},{0,12,7},{109,186,158},{95,164,139},{82,143,121},{66,122,103},{50,101,84},{33,79,65},{10,52,41},{0,12,4}, -{112,186,147},{97,164,129},{83,143,112},{68,122,95},{51,101,77},{34,79,59},{10,52,37},{0,12,1},{114,185,136},{99,163,119},{84,142,104},{69,121,88},{52,100,71},{35,78,54},{11,52,32},{0,11,0},{115,185,125},{101,163,109},{85,142,95},{70,121,80},{53,100,64},{35,78,48},{11,52,26},{0,11,0},{117,184,112},{103,162,99},{87,142,85},{71,120,71},{54,99,57},{36,78,41},{11,52,20},{0,11,0}, -{119,184,100},{104,162,88},{88,142,75},{71,120,62},{54,99,49},{36,78,34},{11,52,13},{0,11,0},{121,183,87},{105,161,76},{89,141,64},{72,120,53},{55,99,41},{36,77,27},{11,52,6},{0,11,0},{122,183,76},{105,161,66},{89,141,56},{72,120,46},{55,99,33},{36,77,19},{11,52,3},{0,11,0},{123,183,65},{107,161,56},{90,141,48},{73,119,38},{56,99,26},{37,77,11},{11,51,1},{0,11,0}, -{94,180,229},{84,159,201},{72,139,175},{59,118,150},{44,97,125},{28,75,100},{10,49,69},{0,7,29},{99,179,216},{87,158,191},{75,138,166},{61,117,143},{46,97,119},{30,75,94},{10,49,65},{0,7,25},{103,179,205},{91,158,181},{77,138,158},{63,117,135},{48,97,112},{31,75,88},{10,49,61},{0,7,22},{106,178,194},{93,158,171},{79,137,150},{65,116,129},{49,96,106},{33,74,84},{11,49,57},{0,6,18}, -{109,178,183},{94,158,163},{81,137,142},{66,116,121},{50,96,100},{34,74,79},{11,49,53},{0,6,15},{111,177,173},{96,157,153},{83,136,134},{67,115,114},{51,95,94},{34,74,73},{11,49,48},{0,6,9},{113,177,163},{97,157,144},{84,136,126},{68,115,107},{52,95,88},{35,74,68},{11,49,43},{0,6,5},{114,176,153},{99,156,135},{85,135,117},{69,115,100},{53,95,81},{36,74,63},{11,48,39},{0,6,2}, -{116,176,143},{101,155,125},{86,135,109},{71,115,93},{54,95,75},{36,74,57},{11,48,35},{0,6,0},{117,175,133},{102,155,116},{87,134,101},{72,114,86},{54,94,69},{37,73,52},{11,49,30},{0,5,0},{118,175,122},{104,155,107},{88,134,93},{72,114,78},{55,94,62},{37,73,46},{11,49,24},{0,5,0},{120,174,110},{105,154,97},{89,134,83},{73,113,69},{56,93,55},{38,73,40},{11,49,18},{0,5,0}, -{122,174,98},{106,154,86},{90,134,74},{73,113,61},{56,93,47},{38,73,32},{11,49,11},{0,5,0},{123,174,86},{107,153,74},{91,133,63},{74,113,52},{56,93,40},{39,72,25},{11,48,4},{0,5,0},{124,174,75},{107,153,65},{91,133,55},{74,113,45},{57,93,32},{39,72,17},{11,48,2},{0,5,0},{125,173,65},{108,153,56},{92,133,48},{75,113,38},{58,93,25},{40,72,9},{11,48,1},{0,5,0}, -{100,170,221},{89,151,195},{76,132,171},{63,112,146},{48,92,121},{32,71,96},{12,45,66},{0,3,27},{104,170,209},{92,150,185},{79,131,162},{65,111,139},{50,91,115},{33,71,90},{12,45,62},{0,3,23},{107,170,198},{95,150,175},{81,131,154},{66,111,131},{51,91,108},{34,71,85},{12,45,58},{0,3,18},{110,169,188},{97,150,167},{82,130,146},{68,110,125},{52,91,103},{36,70,81},{13,45,54},{0,3,14}, -{112,169,179},{98,150,159},{84,130,138},{69,110,117},{53,91,97},{37,70,77},{13,45,50},{0,3,11},{114,168,169},{99,149,149},{86,129,130},{71,109,110},{54,90,91},{37,70,71},{13,45,46},{0,3,6},{116,168,159},{101,149,140},{87,129,122},{71,109,103},{55,90,85},{38,70,65},{13,45,41},{0,3,3},{117,167,149},{102,148,131},{88,128,114},{72,109,96},{56,90,78},{39,69,60},{13,44,37},{0,3,1}, -{118,167,139},{103,148,121},{88,128,106},{73,109,90},{57,90,72},{40,69,55},{13,44,33},{0,3,0},{119,166,129},{104,147,112},{89,128,98},{74,108,83},{57,89,67},{40,69,50},{14,45,28},{0,2,0},{121,166,118},{106,147,103},{90,128,90},{74,108,75},{57,89,60},{40,69,44},{14,45,22},{0,2,0},{122,165,107},{107,146,94},{91,127,81},{75,107,67},{58,89,53},{41,69,38},{14,45,16},{0,2,0}, -{124,165,96},{107,146,84},{92,127,72},{75,107,59},{58,89,45},{41,69,30},{14,45,10},{0,2,0},{126,165,84},{108,146,73},{93,126,61},{75,107,50},{58,88,38},{41,68,23},{15,44,4},{0,2,0},{126,165,73},{109,146,64},{93,126,53},{76,107,43},{59,88,31},{41,68,15},{15,44,2},{0,2,0},{127,164,64},{110,146,55},{94,126,46},{76,107,36},{60,88,24},{41,68,8},{14,44,1},{0,2,0}, -{106,160,213},{94,143,189},{80,124,166},{67,105,142},{52,86,117},{36,66,92},{13,41,63},{0,0,24},{109,160,202},{96,142,179},{83,124,157},{69,105,135},{54,86,111},{37,66,87},{13,41,59},{0,0,20},{111,160,191},{98,142,170},{84,124,149},{71,105,127},{54,86,104},{38,66,82},{13,41,55},{0,0,15},{113,160,182},{100,142,162},{86,123,142},{72,104,121},{55,85,100},{39,65,78},{14,41,51},{0,0,11}, -{115,160,174},{101,142,154},{87,123,134},{72,104,114},{56,85,94},{40,65,74},{15,41,47},{0,0,7},{117,159,164},{103,141,145},{88,122,126},{73,103,107},{57,85,88},{41,65,68},{15,41,43},{0,0,4},{119,159,154},{103,141,136},{89,122,118},{74,103,100},{58,85,82},{41,65,62},{15,41,38},{0,0,1},{120,158,144},{104,140,127},{90,121,111},{75,103,93},{59,85,75},{41,64,57},{15,40,34},{0,0,0}, -{122,158,134},{105,140,118},{91,121,103},{75,103,87},{59,85,69},{42,64,52},{16,40,30},{0,0,0},{123,157,125},{106,139,109},{92,121,95},{76,102,80},{59,84,64},{42,65,47},{17,41,26},{0,0,0},{123,157,115},{108,139,100},{92,121,87},{76,102,72},{59,84,58},{42,65,41},{17,41,20},{0,0,0},{124,157,104},{109,138,91},{93,120,78},{77,102,65},{60,84,51},{42,64,35},{16,41,14},{0,0,0}, -{126,157,93},{109,138,81},{93,120,69},{77,102,57},{60,84,44},{42,64,28},{16,41,9},{0,0,0},{128,157,81},{110,138,71},{94,119,60},{77,101,49},{60,83,37},{43,64,22},{17,40,3},{0,0,0},{128,157,72},{111,138,63},{94,119,52},{77,101,42},{60,83,30},{43,64,14},{17,40,2},{0,0,0},{129,156,63},{112,138,54},{95,119,45},{78,101,35},{60,83,23},{43,64,7},{16,40,1},{0,0,0}, -{110,150,206},{97,134,183},{84,117,160},{71,98,137},{55,80,113},{39,60,89},{16,35,61},{0,0,21},{113,150,195},{99,133,173},{86,116,151},{72,98,130},{56,80,107},{41,60,84},{17,35,57},{0,0,17},{115,150,185},{101,133,164},{87,116,143},{73,98,122},{57,80,100},{41,60,79},{18,35,53},{0,0,12},{117,150,176},{103,132,156},{89,116,136},{74,97,116},{58,79,96},{42,60,75},{19,36,49},{0,0,8}, -{119,150,168},{104,132,148},{90,116,129},{75,97,110},{58,79,90},{42,60,70},{19,36,45},{0,0,4},{121,150,158},{105,132,140},{91,115,122},{75,97,103},{59,79,84},{42,60,66},{19,36,41},{0,0,2},{121,150,149},{106,132,132},{92,115,114},{75,97,97},{59,79,79},{42,60,60},{19,36,36},{0,0,0},{122,149,140},{107,131,123},{92,114,107},{76,97,90},{60,79,73},{43,60,55},{19,36,32},{0,0,0}, -{124,149,130},{107,131,114},{92,114,99},{77,97,84},{61,79,67},{43,60,50},{19,36,28},{0,0,0},{125,148,121},{108,130,106},{93,113,92},{77,96,77},{61,78,61},{44,60,45},{20,36,24},{0,0,0},{126,148,112},{109,130,98},{94,113,85},{78,96,70},{61,78,55},{44,60,39},{20,36,18},{0,0,0},{127,147,102},{110,129,89},{95,113,76},{79,96,63},{61,78,49},{44,60,33},{19,36,12},{0,0,0}, -{128,147,90},{111,129,79},{95,113,67},{79,96,55},{61,78,42},{44,60,26},{19,36,8},{0,0,0},{129,147,79},{112,129,69},{96,112,58},{79,95,47},{62,77,35},{44,60,20},{20,36,3},{0,0,0},{129,147,71},{112,129,61},{96,112,51},{79,95,40},{62,77,28},{44,60,13},{20,36,1},{0,0,0},{130,147,62},{113,129,52},{97,112,44},{80,95,34},{62,77,21},{44,59,6},{19,36,0},{0,0,0}, -{114,140,199},{100,124,177},{87,109,154},{74,91,132},{58,74,109},{42,55,86},{19,30,58},{0,0,18},{117,140,189},{102,124,167},{89,108,146},{75,91,125},{59,74,103},{43,55,81},{20,30,54},{0,0,14},{119,140,179},{104,124,158},{91,108,138},{75,91,118},{60,74,97},{43,55,76},{20,30,50},{0,0,9},{120,140,170},{106,124,151},{92,108,131},{76,91,112},{61,73,92},{44,55,72},{21,31,46},{0,0,5}, -{121,140,162},{106,124,143},{92,108,124},{77,91,106},{61,73,87},{44,55,67},{21,31,42},{0,0,2},{123,140,153},{107,123,135},{93,107,118},{78,90,100},{61,73,81},{44,55,63},{21,31,38},{0,0,1},{124,140,144},{108,123,127},{94,107,110},{78,90,94},{61,73,76},{44,55,58},{21,31,34},{0,0,0},{124,139,135},{109,123,119},{95,107,103},{79,90,87},{62,73,70},{45,55,53},{22,31,30},{0,0,0}, -{126,139,127},{110,123,111},{95,107,96},{79,90,81},{62,73,64},{45,55,48},{22,31,26},{0,0,0},{127,139,118},{111,122,103},{95,106,89},{79,90,74},{62,72,58},{45,55,43},{22,32,22},{0,0,0},{128,139,109},{111,122,95},{95,106,82},{79,90,68},{62,72,52},{45,55,37},{22,32,16},{0,0,0},{129,138,99},{112,121,86},{96,106,74},{80,89,61},{63,72,46},{45,55,31},{22,31,10},{0,0,0}, -{129,138,88},{113,121,77},{96,106,65},{80,89,53},{63,72,40},{45,55,24},{22,31,6},{0,0,0},{130,138,77},{114,121,67},{97,105,57},{81,89,45},{63,72,33},{45,55,18},{22,32,3},{0,0,0},{130,138,70},{114,121,59},{97,105,50},{81,89,39},{63,72,26},{45,55,11},{22,32,1},{0,0,0},{131,138,62},{114,121,52},{97,105,43},{81,89,33},{63,71,19},{45,54,5},{21,32,0},{0,0,0}, -{117,131,192},{104,115,170},{89,101,149},{75,84,127},{59,67,105},{43,50,83},{22,25,55},{0,0,15},{119,131,182},{105,115,161},{91,101,141},{76,84,120},{60,67,100},{44,50,78},{22,25,51},{0,0,10},{121,131,173},{107,115,153},{92,101,133},{77,84,114},{61,67,94},{45,50,73},{22,25,47},{0,0,6},{122,131,165},{108,115,146},{93,101,127},{78,84,108},{62,67,89},{45,50,69},{23,26,43},{0,0,3}, -{123,131,157},{109,115,138},{94,101,120},{79,84,103},{62,67,84},{45,50,64},{23,26,40},{0,0,1},{124,131,148},{110,115,130},{95,100,114},{79,83,97},{63,67,78},{46,50,60},{23,26,36},{0,0,0},{125,131,139},{110,115,122},{95,100,107},{79,83,91},{63,67,73},{46,50,55},{23,26,32},{0,0,0},{126,130,131},{111,114,115},{96,100,100},{80,83,84},{63,67,67},{46,50,51},{24,26,28},{0,0,0}, -{127,130,123},{111,114,108},{96,100,93},{80,83,78},{63,67,62},{46,50,46},{24,26,24},{0,0,0},{128,130,114},{112,114,100},{96,99,86},{80,83,72},{63,67,57},{46,50,41},{24,27,19},{0,0,0},{129,130,105},{112,114,92},{96,99,79},{80,83,66},{63,67,51},{46,50,35},{24,27,13},{0,0,0},{130,129,96},{113,113,84},{97,99,72},{81,83,59},{64,67,45},{46,50,29},{24,27,7},{0,0,0}, -{130,129,86},{114,113,75},{97,99,64},{81,83,51},{64,67,39},{46,50,23},{24,27,5},{0,0,0},{131,129,76},{115,113,66},{98,98,56},{82,83,44},{64,67,32},{46,50,17},{23,28,2},{0,0,0},{131,129,69},{115,113,58},{98,98,49},{82,83,38},{64,67,25},{46,50,10},{23,28,1},{0,0,0},{132,129,61},{115,113,51},{98,98,42},{82,82,32},{64,66,18},{46,49,4},{22,28,0},{0,0,0}, -{120,121,186},{106,107,164},{92,93,143},{77,78,122},{61,61,101},{45,44,80},{24,19,53},{0,0,11},{122,121,176},{108,107,156},{93,93,137},{78,78,116},{62,61,96},{46,44,75},{24,20,49},{0,0,7},{123,121,167},{109,107,148},{94,93,129},{79,78,110},{63,61,90},{47,44,70},{24,20,45},{0,0,3},{124,121,159},{110,107,141},{95,93,123},{80,78,104},{64,61,86},{47,44,66},{25,21,41},{0,0,1}, -{125,121,152},{111,107,133},{96,93,116},{81,78,99},{64,61,81},{47,44,62},{25,21,38},{0,0,0},{126,121,143},{112,107,126},{96,93,110},{81,77,93},{64,61,76},{48,44,57},{25,21,34},{0,0,0},{127,121,135},{112,107,118},{96,93,103},{81,77,87},{64,61,70},{48,44,53},{25,21,30},{0,0,0},{128,121,127},{113,106,111},{97,92,96},{81,77,82},{64,61,65},{47,45,49},{26,22,26},{0,0,0}, -{128,121,119},{113,106,104},{97,92,90},{81,77,76},{64,61,60},{47,45,44},{26,22,22},{0,0,0},{129,121,111},{114,106,97},{98,92,83},{81,77,70},{65,61,55},{47,45,39},{26,23,17},{0,0,0},{130,121,102},{114,106,89},{98,92,77},{81,77,64},{65,61,49},{47,45,33},{26,23,11},{0,0,0},{131,120,93},{114,106,82},{99,92,70},{82,77,57},{65,61,43},{48,45,27},{26,23,6},{0,0,0}, -{131,120,84},{115,106,73},{99,92,62},{82,77,49},{65,61,37},{48,45,21},{26,23,4},{0,0,0},{132,120,74},{116,105,64},{99,91,54},{82,77,42},{65,61,30},{48,45,15},{25,24,2},{0,0,0},{132,120,67},{116,105,56},{100,91,47},{82,77,36},{65,61,23},{48,45,9},{25,24,1},{0,0,0},{133,120,59},{116,105,49},{100,91,40},{83,76,30},{65,61,17},{47,45,4},{24,24,0},{0,0,0}, -{122,112,179},{109,99,159},{93,85,138},{80,71,118},{63,55,98},{46,38,77},{25,12,50},{0,0,7},{124,112,170},{110,99,151},{95,85,132},{81,71,112},{64,55,93},{47,39,72},{25,13,46},{0,0,4},{126,112,161},{111,99,143},{96,85,125},{81,71,106},{65,55,87},{48,39,67},{25,13,43},{0,0,1},{127,112,154},{112,99,136},{97,85,119},{82,71,100},{65,55,83},{48,39,63},{26,14,39},{0,0,0}, -{127,112,147},{112,99,129},{97,85,113},{82,71,95},{65,55,78},{48,39,59},{26,14,35},{0,0,0},{128,112,139},{113,99,122},{97,86,107},{82,71,89},{65,55,73},{49,39,55},{26,15,31},{0,0,0},{129,112,131},{113,99,114},{97,86,100},{82,71,84},{65,55,68},{49,39,51},{26,15,28},{0,0,0},{129,112,123},{114,98,107},{98,85,93},{82,70,79},{65,55,63},{48,39,46},{27,16,24},{0,0,0}, -{129,112,115},{114,98,101},{98,85,87},{82,70,73},{65,55,59},{48,39,42},{27,17,20},{0,0,0},{130,112,108},{115,98,94},{99,85,80},{82,70,67},{66,56,54},{48,40,38},{27,18,15},{0,0,0},{131,112,100},{115,98,86},{99,85,74},{82,70,61},{66,56,48},{48,40,32},{27,18,10},{0,0,0},{132,111,91},{115,98,79},{100,85,68},{83,70,55},{66,55,42},{49,40,26},{27,19,5},{0,0,0}, -{132,111,82},{116,98,71},{100,85,60},{83,70,48},{66,55,35},{49,40,20},{27,19,3},{0,0,0},{133,111,73},{117,98,63},{100,84,52},{83,70,41},{66,55,29},{49,40,14},{26,19,1},{0,0,0},{133,111,66},{117,98,55},{101,84,46},{83,70,35},{66,55,22},{49,40,8},{26,19,1},{0,0,0},{134,111,58},{117,97,48},{101,84,39},{84,70,29},{66,55,16},{48,40,3},{25,19,0},{0,0,0}, -{125,102,173},{110,90,153},{95,77,133},{81,63,114},{65,48,94},{48,31,74},{26,7,47},{0,0,4},{126,102,164},{111,90,146},{97,77,127},{82,63,108},{66,48,89},{49,32,69},{27,8,43},{0,0,2},{127,102,156},{112,90,138},{98,77,120},{83,63,102},{66,48,84},{49,32,64},{27,8,40},{0,0,0},{128,102,149},{113,90,131},{98,77,114},{83,63,97},{66,48,80},{49,32,60},{28,9,36},{0,0,0}, -{129,102,142},{113,90,124},{98,77,109},{83,63,92},{66,48,75},{49,32,56},{28,9,33},{0,0,0},{130,103,134},{114,90,118},{99,78,103},{83,64,86},{66,49,70},{49,33,52},{28,10,29},{0,0,0},{130,103,126},{114,90,111},{99,78,97},{83,64,81},{66,49,65},{49,33,48},{28,10,26},{0,0,0},{130,102,119},{114,90,104},{99,77,90},{83,64,76},{66,49,60},{49,33,44},{28,11,22},{0,0,0}, -{131,102,112},{114,90,98},{99,77,84},{83,64,70},{66,49,56},{49,33,40},{28,11,18},{0,0,0},{132,103,105},{115,90,91},{100,77,78},{84,64,64},{67,50,51},{49,34,35},{27,12,13},{0,0,0},{133,103,97},{115,90,84},{100,77,72},{84,64,59},{67,50,46},{49,34,30},{27,12,8},{0,0,0},{134,102,88},{116,90,76},{100,77,65},{83,64,53},{66,49,40},{49,34,24},{27,13,5},{0,0,0}, -{134,102,80},{116,90,68},{100,77,58},{83,64,46},{66,49,33},{49,34,18},{27,13,3},{0,0,0},{134,102,71},{117,90,61},{101,77,50},{84,63,40},{67,49,27},{49,34,12},{26,13,1},{0,0,0},{134,102,64},{117,90,54},{101,77,44},{84,63,34},{67,49,21},{49,34,7},{26,13,1},{0,0,0},{135,102,57},{118,89,48},{102,77,38},{84,64,28},{67,49,15},{49,34,3},{25,13,0},{0,0,0}, -{127,92,167},{112,81,147},{97,69,128},{83,55,109},{66,40,90},{50,23,70},{28,3,45},{0,0,1},{128,92,158},{113,81,140},{99,69,122},{84,56,104},{67,41,85},{50,24,66},{29,3,41},{0,0,0},{129,92,150},{114,81,133},{100,69,116},{84,56,98},{68,41,80},{50,25,62},{29,3,38},{0,0,0},{130,92,143},{115,81,127},{100,69,110},{84,56,94},{68,41,76},{50,25,58},{29,3,34},{0,0,0}, -{131,92,136},{115,81,120},{100,69,105},{84,56,89},{68,41,72},{50,25,54},{29,3,31},{0,0,0},{132,93,129},{116,81,114},{100,69,99},{85,56,84},{68,42,68},{50,26,50},{29,4,27},{0,0,0},{132,93,122},{116,81,108},{100,69,94},{85,56,79},{68,42,63},{50,26,46},{29,4,24},{0,0,0},{132,93,115},{116,81,101},{101,69,88},{84,56,74},{67,42,58},{50,27,42},{29,4,20},{0,0,0}, -{133,93,109},{116,81,95},{101,69,82},{84,56,68},{67,42,54},{50,27,38},{29,4,16},{0,0,0},{133,93,102},{116,81,88},{101,70,76},{85,56,62},{68,43,49},{50,27,33},{28,5,11},{0,0,0},{134,93,94},{116,81,81},{101,70,70},{85,56,57},{68,43,44},{50,27,28},{28,5,6},{0,0,0},{135,92,86},{117,81,74},{101,69,63},{84,56,51},{67,43,38},{50,28,22},{28,6,4},{0,0,0}, -{135,92,78},{117,81,66},{101,69,56},{84,56,44},{67,43,31},{50,28,16},{28,6,2},{0,0,0},{135,92,69},{118,81,59},{102,69,48},{84,56,38},{67,43,25},{50,28,10},{27,6,1},{0,0,0},{135,92,62},{118,81,53},{102,69,42},{84,56,32},{67,43,19},{50,28,6},{27,6,1},{0,0,0},{136,92,56},{118,81,47},{103,69,37},{85,56,27},{68,43,13},{50,28,3},{26,7,0},{0,0,0}, -{129,81,161},{113,70,142},{99,58,124},{83,45,105},{67,30,87},{51,14,67},{29,1,42},{0,0,0},{131,81,153},{114,70,135},{100,59,118},{84,46,100},{68,31,82},{51,14,63},{29,1,38},{0,0,0},{131,81,145},{115,70,128},{100,59,112},{84,46,95},{68,32,77},{51,15,59},{29,1,35},{0,0,0},{132,81,138},{116,70,122},{101,59,106},{85,46,91},{68,32,73},{51,16,55},{29,1,31},{0,0,0}, -{132,81,132},{116,70,116},{101,59,101},{85,46,86},{68,32,69},{51,16,51},{29,1,28},{0,0,0},{133,82,125},{116,71,110},{101,59,95},{85,47,81},{68,33,65},{51,17,47},{29,1,25},{0,0,0},{133,82,118},{116,71,104},{101,59,90},{85,47,76},{68,34,60},{51,18,43},{29,1,21},{0,0,0},{134,82,111},{116,71,98},{101,60,85},{85,48,71},{68,34,55},{51,18,39},{29,2,17},{0,0,0}, -{134,82,105},{116,71,92},{101,60,79},{85,48,65},{68,34,51},{51,18,35},{29,2,13},{0,0,0},{134,82,98},{117,71,85},{101,60,73},{85,48,59},{68,35,46},{50,19,31},{28,2,9},{0,0,0},{134,82,91},{117,71,78},{101,60,67},{85,48,54},{68,35,41},{50,19,26},{28,2,6},{0,0,0},{135,82,83},{117,71,72},{101,60,60},{84,48,48},{67,35,35},{50,20,20},{28,3,4},{0,0,0}, -{135,82,75},{117,71,64},{101,60,53},{84,48,43},{67,35,30},{50,20,15},{28,3,2},{0,0,0},{135,82,68},{118,71,57},{102,60,47},{85,48,37},{67,36,24},{50,20,8},{27,3,1},{0,0,0},{135,82,61},{118,71,51},{102,60,41},{85,48,31},{67,36,18},{50,20,5},{27,3,1},{0,0,0},{136,82,55},{119,71,46},{103,61,36},{85,48,26},{68,36,12},{50,21,3},{26,3,0},{0,0,0}, -{130,69,155},{115,58,137},{100,48,120},{85,35,101},{68,20,83},{52,4,64},{28,0,40},{0,0,0},{132,69,148},{116,59,131},{101,48,114},{85,36,96},{68,21,78},{52,5,60},{28,0,36},{0,0,0},{133,69,140},{117,59,124},{101,48,108},{85,36,91},{68,22,73},{52,5,56},{28,0,33},{0,0,0},{134,69,134},{117,59,118},{102,49,102},{86,37,87},{69,23,69},{52,6,52},{28,0,29},{0,0,0}, -{134,69,127},{117,59,112},{102,49,97},{86,37,82},{69,23,65},{52,6,48},{28,0,26},{0,0,0},{134,70,121},{117,60,106},{102,49,91},{85,38,77},{68,24,61},{52,8,44},{28,0,22},{0,0,0},{134,71,114},{117,60,100},{102,49,86},{85,38,72},{68,25,56},{52,8,41},{28,0,18},{0,0,0},{134,71,107},{117,61,94},{102,50,81},{86,39,67},{69,26,52},{52,9,37},{28,1,13},{0,0,0}, -{134,71,101},{117,61,88},{102,50,75},{86,39,62},{69,26,48},{52,10,33},{28,1,10},{0,0,0},{135,71,94},{118,61,82},{102,50,70},{85,39,57},{68,27,44},{51,11,29},{28,1,7},{0,0,0},{135,71,88},{118,61,76},{102,50,64},{85,39,52},{68,27,39},{51,11,24},{28,1,5},{0,0,0},{135,71,81},{118,61,70},{102,51,58},{85,40,46},{68,28,33},{51,12,18},{27,1,3},{0,0,0}, -{135,71,73},{118,61,62},{102,51,51},{85,40,41},{68,28,28},{51,12,13},{27,1,1},{0,0,0},{136,72,66},{119,62,55},{103,51,45},{86,41,35},{68,29,23},{51,13,7},{26,1,0},{0,0,0},{136,72,60},{119,62,49},{103,51,40},{86,41,30},{68,29,17},{51,13,4},{26,1,0},{0,0,0},{137,71,54},{120,62,44},{103,52,35},{86,41,25},{68,29,11},{51,14,2},{26,1,0},{0,0,0}, -{131,55,149},{116,45,131},{101,33,115},{86,20,97},{69,10,80},{52,2,62},{27,0,38},{0,0,0},{133,55,142},{117,45,125},{102,34,109},{86,22,93},{69,11,75},{53,2,58},{27,0,34},{0,0,0},{134,55,135},{118,45,119},{102,35,103},{86,22,88},{69,11,71},{53,2,54},{27,0,31},{0,0,0},{134,55,129},{118,46,113},{103,35,99},{86,23,84},{69,12,67},{52,3,50},{27,0,27},{0,0,0}, -{134,56,123},{118,46,108},{103,36,94},{86,24,79},{69,12,63},{52,3,46},{27,0,24},{0,0,0},{135,57,117},{118,47,102},{103,37,88},{86,25,75},{69,13,59},{52,4,42},{28,0,20},{0,0,0},{135,58,111},{118,48,97},{103,37,83},{86,26,70},{69,14,54},{52,4,39},{28,0,16},{0,0,0},{135,58,104},{118,49,91},{102,38,78},{86,27,65},{69,15,50},{52,5,35},{27,1,12},{0,0,0}, -{135,58,98},{118,49,85},{102,39,73},{86,28,60},{69,15,46},{52,5,31},{27,1,9},{0,0,0},{135,59,91},{118,49,80},{103,39,68},{85,28,55},{68,16,42},{52,5,27},{27,1,6},{0,0,0},{135,59,85},{118,49,74},{103,40,62},{85,28,50},{68,16,37},{52,5,22},{27,1,4},{0,0,0},{136,59,79},{119,50,68},{103,41,56},{85,29,44},{68,17,31},{51,6,16},{26,1,2},{0,0,0}, -{136,59,72},{119,50,61},{103,41,50},{85,30,39},{68,17,26},{51,6,11},{26,1,1},{0,0,0},{137,60,65},{119,51,54},{104,41,44},{86,31,34},{68,18,21},{51,6,6},{25,1,0},{0,0,0},{137,60,59},{119,51,48},{104,41,39},{86,31,29},{68,18,15},{51,6,4},{25,1,0},{0,0,0},{137,60,53},{120,51,43},{104,42,34},{86,31,24},{68,18,10},{51,7,2},{25,1,0},{0,0,0}, -{133,40,144},{117,30,126},{102,17,110},{87,4,93},{70,0,76},{53,0,59},{25,0,35},{0,0,0},{134,40,137},{118,31,120},{103,19,105},{87,6,89},{70,0,72},{53,0,55},{26,0,31},{0,0,0},{135,40,130},{119,31,114},{103,20,99},{87,7,84},{70,0,68},{53,0,52},{26,0,28},{0,0,0},{136,41,124},{119,32,109},{103,21,95},{87,9,80},{70,1,64},{53,0,48},{26,0,24},{0,0,0}, -{136,42,119},{119,32,104},{103,22,90},{87,10,76},{70,1,60},{53,0,44},{26,0,21},{0,0,0},{136,43,113},{119,34,98},{104,23,85},{87,11,72},{70,2,56},{53,0,40},{27,0,17},{0,0,0},{136,44,107},{119,35,93},{104,24,80},{87,13,67},{70,2,52},{53,0,36},{27,0,13},{0,0,0},{136,45,100},{120,36,88},{103,25,75},{87,14,62},{70,3,48},{53,0,32},{26,0,10},{0,0,0}, -{136,45,94},{120,36,82},{103,26,71},{87,15,58},{70,3,44},{53,0,28},{26,0,7},{0,0,0},{136,46,88},{119,37,77},{104,27,66},{86,16,53},{69,4,40},{52,0,24},{26,0,5},{0,0,0},{136,46,82},{119,37,71},{104,28,60},{86,16,48},{69,4,35},{52,0,19},{26,0,3},{0,0,0},{137,47,76},{120,37,65},{104,29,54},{86,17,42},{69,5,29},{52,0,13},{25,0,1},{0,0,0}, -{137,47,70},{120,38,59},{104,29,49},{86,18,37},{69,5,24},{52,0,9},{25,0,1},{0,0,0},{138,47,63},{120,39,53},{104,30,43},{87,19,32},{69,6,19},{51,0,5},{24,0,0},{0,0,0},{138,47,57},{120,39,47},{104,30,38},{87,19,27},{69,6,13},{51,0,3},{24,0,0},{0,0,0},{137,47,52},{120,40,42},{105,31,33},{87,20,22},{69,6,8},{51,0,1},{23,0,0},{0,0,0}, -{15,192,243},{14,169,214},{11,147,187},{8,126,160},{5,103,133},{1,81,106},{0,55,75},{0,16,34},{18,191,230},{16,168,202},{13,146,177},{10,125,151},{6,103,126},{1,81,100},{0,54,70},{0,15,31},{20,190,218},{18,167,191},{15,146,168},{12,125,143},{7,103,119},{2,81,94},{0,54,65},{0,14,28},{22,189,206},{19,167,182},{16,145,159},{12,124,136},{8,102,113},{2,81,90},{0,54,61},{0,14,24}, -{23,189,195},{20,167,173},{17,145,150},{13,124,129},{9,102,106},{3,81,85},{0,54,57},{0,14,21},{24,188,183},{21,166,163},{17,144,141},{14,123,121},{9,102,100},{4,80,79},{0,54,53},{0,14,15},{24,187,172},{22,165,153},{18,144,133},{15,123,113},{10,102,94},{4,80,74},{0,54,48},{0,14,11},{25,187,162},{22,164,144},{19,143,125},{15,122,106},{10,101,87},{5,80,68},{1,54,44},{0,13,7}, -{30,186,152},{27,164,134},{22,143,117},{15,122,99},{11,101,81},{6,80,62},{1,54,40},{0,12,4},{40,185,140},{37,163,124},{27,142,108},{16,121,92},{11,101,74},{6,80,57},{1,54,35},{0,12,1},{49,185,129},{44,163,113},{32,142,99},{18,121,84},{11,101,67},{6,80,51},{1,54,29},{0,12,0},{57,184,117},{48,163,103},{38,142,89},{22,120,76},{12,100,60},{7,79,44},{1,54,23},{0,11,0}, -{62,184,104},{52,163,92},{40,142,80},{24,120,67},{12,100,52},{7,79,37},{1,54,16},{0,11,0},{66,184,92},{55,162,82},{41,141,70},{25,120,58},{12,99,45},{7,78,31},{1,54,10},{0,11,0},{69,184,83},{57,162,73},{43,141,62},{27,120,51},{13,99,39},{7,78,24},{1,54,6},{0,11,0},{71,183,73},{60,162,64},{45,141,54},{29,119,44},{15,99,33},{7,78,18},{1,53,2},{0,11,0}, -{19,181,235},{17,160,207},{14,140,181},{11,119,155},{7,97,128},{3,76,102},{0,51,72},{0,9,31},{21,180,223},{19,159,196},{15,139,171},{12,118,147},{8,98,122},{3,76,97},{0,50,67},{0,8,28},{23,180,211},{21,159,186},{18,139,163},{13,118,139},{9,98,115},{4,76,91},{0,50,63},{0,7,25},{30,179,200},{25,158,177},{21,138,154},{15,117,132},{10,97,109},{4,76,87},{1,50,59},{0,7,21}, -{37,179,189},{30,158,168},{24,138,146},{16,117,125},{10,97,103},{5,76,82},{1,50,55},{0,7,18},{40,178,178},{33,157,158},{28,137,137},{19,116,117},{11,96,97},{6,75,76},{1,50,51},{0,7,13},{42,177,167},{36,157,149},{30,137,129},{21,116,110},{13,96,91},{6,75,71},{1,50,46},{0,7,8},{45,177,158},{38,156,140},{31,136,121},{23,116,103},{13,96,84},{7,75,65},{1,50,42},{0,7,4}, -{49,176,148},{42,156,130},{34,136,113},{25,116,96},{14,96,78},{7,75,60},{1,50,38},{0,6,2},{56,175,137},{48,155,120},{38,135,105},{26,115,89},{15,95,71},{7,75,54},{1,50,33},{0,6,0},{61,175,126},{53,155,110},{42,135,96},{29,115,81},{16,95,65},{7,75,49},{1,50,27},{0,6,0},{66,174,114},{57,154,100},{46,135,87},{31,114,73},{17,95,58},{9,74,42},{1,50,21},{0,6,0}, -{70,174,102},{60,154,90},{48,135,78},{33,114,65},{18,95,50},{9,74,35},{1,50,14},{0,6,0},{74,174,90},{63,154,79},{50,134,68},{34,114,56},{20,94,43},{10,74,29},{1,50,8},{0,6,0},{76,174,81},{64,154,71},{50,134,60},{35,114,49},{20,94,37},{10,74,22},{1,50,5},{0,6,0},{77,174,71},{66,154,62},{53,134,53},{37,113,43},{22,94,31},{10,74,16},{1,49,2},{0,6,0}, -{23,171,227},{21,151,200},{18,132,174},{14,111,149},{10,91,124},{5,71,99},{1,46,69},{0,2,29},{26,170,215},{23,151,189},{19,131,165},{15,111,142},{10,92,118},{6,71,94},{1,46,65},{0,2,25},{29,170,204},{25,151,180},{21,131,157},{16,111,134},{11,92,112},{6,71,88},{1,46,61},{0,2,22},{40,169,193},{33,150,171},{26,131,149},{18,111,128},{12,91,106},{7,70,84},{1,46,57},{0,1,18}, -{50,169,182},{41,150,162},{31,131,142},{20,111,121},{12,91,100},{7,70,80},{1,46,53},{0,1,15},{55,168,172},{45,149,153},{37,130,134},{24,110,114},{13,90,94},{7,70,74},{1,46,49},{0,1,11},{59,168,162},{49,149,145},{42,130,126},{27,110,107},{15,90,88},{8,70,68},{1,46,44},{0,1,6},{62,168,153},{53,148,136},{43,129,118},{31,109,100},{16,90,82},{8,70,63},{1,46,40},{0,1,2}, -{66,167,143},{56,148,126},{46,129,110},{34,109,93},{18,90,76},{8,70,58},{1,46,36},{0,1,0},{70,166,134},{59,147,117},{49,128,102},{36,108,86},{19,89,69},{8,70,52},{1,46,31},{0,1,0},{73,166,123},{63,147,107},{52,128,94},{38,108,79},{20,89,63},{8,70,47},{1,46,25},{0,1,0},{75,165,112},{65,146,98},{53,127,85},{40,108,71},{22,89,57},{9,70,41},{1,46,19},{0,1,0}, -{78,165,101},{68,146,88},{55,127,76},{41,108,63},{24,89,49},{10,70,34},{1,46,13},{0,1,0},{82,165,89},{70,146,77},{57,127,67},{42,107,55},{27,88,42},{11,70,28},{1,46,7},{0,1,0},{83,165,80},{71,146,69},{58,127,59},{43,107,48},{28,88,36},{11,70,21},{1,46,4},{0,1,0},{84,165,70},{72,146,61},{59,127,52},{45,107,42},{29,88,30},{12,69,15},{1,46,2},{0,1,0}, -{36,162,220},{32,144,194},{28,125,170},{19,105,145},{11,87,120},{6,67,95},{1,42,66},{0,1,27},{42,161,208},{37,143,184},{31,124,161},{23,105,138},{13,87,114},{7,67,90},{1,42,62},{0,1,23},{48,161,198},{41,143,175},{34,124,153},{25,105,130},{15,87,108},{7,67,85},{1,42,58},{0,1,18},{55,161,188},{46,143,166},{38,124,145},{28,105,124},{17,87,102},{9,66,81},{1,42,54},{0,1,14}, -{61,161,178},{51,143,158},{42,124,138},{30,105,117},{18,87,97},{9,66,76},{1,42,50},{0,1,11},{65,160,168},{55,142,149},{45,123,130},{33,104,110},{19,86,91},{10,66,71},{1,42,46},{0,1,7},{68,160,158},{57,142,141},{48,123,122},{36,104,104},{21,86,85},{10,66,66},{1,42,42},{0,1,4},{70,159,149},{61,141,132},{50,122,114},{38,104,97},{23,86,79},{10,66,61},{1,42,38},{0,1,1}, -{74,159,139},{63,141,122},{52,122,106},{40,104,91},{25,86,73},{11,66,56},{1,42,34},{0,1,0},{76,158,130},{65,140,113},{55,121,99},{41,103,84},{25,85,67},{11,66,50},{2,42,29},{0,0,0},{79,158,119},{68,140,104},{57,121,91},{43,103,76},{26,85,61},{11,66,45},{2,42,23},{0,0,0},{81,158,109},{69,139,95},{58,121,83},{45,103,69},{28,85,55},{12,66,39},{2,42,17},{0,0,0}, -{83,158,98},{71,139,86},{59,121,74},{45,103,61},{29,85,47},{12,66,32},{2,42,11},{0,0,0},{85,157,86},{74,139,75},{61,120,65},{46,102,53},{31,84,40},{13,66,26},{2,42,5},{0,0,0},{86,157,78},{74,139,67},{61,120,57},{47,102,46},{31,84,34},{13,66,19},{2,42,3},{0,0,0},{87,157,69},{75,139,60},{63,120,50},{48,102,40},{32,84,29},{14,65,14},{2,42,1},{0,0,0}, -{49,153,212},{43,136,188},{37,118,165},{25,99,141},{15,82,117},{9,63,92},{1,38,63},{0,0,24},{57,153,201},{50,135,179},{42,117,156},{31,99,134},{18,82,111},{9,62,87},{1,38,59},{0,0,20},{64,153,191},{55,135,170},{45,117,148},{35,99,126},{20,82,104},{9,62,82},{1,38,55},{0,0,15},{67,153,182},{58,135,161},{49,117,141},{38,99,120},{23,82,99},{10,62,78},{1,38,51},{0,0,11}, -{71,153,173},{61,135,153},{51,117,134},{40,99,113},{25,82,94},{11,62,73},{2,38,47},{0,0,7},{73,152,163},{63,134,145},{53,116,126},{41,99,107},{26,81,88},{12,62,68},{2,38,43},{0,0,4},{76,152,154},{66,134,137},{55,116,118},{42,99,101},{28,81,82},{12,62,63},{2,38,39},{0,0,2},{79,151,145},{67,133,128},{56,115,111},{44,98,94},{29,81,76},{13,62,58},{2,38,35},{0,0,1}, -{81,151,135},{70,133,119},{58,115,103},{46,98,88},{30,81,70},{14,62,53},{2,38,31},{0,0,0},{82,150,126},{71,132,110},{60,115,96},{46,98,81},{31,80,64},{14,62,48},{3,38,26},{0,0,0},{84,150,116},{73,132,101},{61,115,88},{47,98,73},{32,80,58},{14,62,42},{3,38,21},{0,0,0},{86,150,106},{74,131,92},{62,114,80},{49,97,66},{34,80,52},{15,62,36},{3,38,15},{0,0,0}, -{88,150,95},{76,131,83},{63,114,71},{50,97,58},{34,80,45},{15,62,30},{3,38,10},{0,0,0},{90,149,84},{78,132,74},{65,114,62},{51,97,51},{35,79,39},{16,62,24},{3,38,4},{0,0,0},{90,149,76},{78,132,66},{65,114,56},{51,97,45},{35,79,33},{16,62,18},{3,38,2},{0,0,0},{91,149,68},{79,131,59},{66,113,49},{52,97,39},{36,79,27},{17,61,12},{3,38,1},{0,0,0}, -{62,143,205},{54,127,182},{47,111,159},{35,93,136},{23,76,113},{11,57,89},{2,33,61},{0,0,21},{67,143,194},{59,126,173},{50,110,151},{39,93,129},{26,76,107},{12,57,84},{3,33,57},{0,0,17},{72,143,185},{63,126,164},{53,110,143},{42,93,122},{28,76,100},{13,57,79},{3,33,53},{0,0,12},{75,143,176},{66,126,156},{56,110,136},{44,93,116},{30,76,95},{14,58,75},{4,33,49},{0,0,8}, -{78,143,167},{67,126,148},{57,110,129},{45,93,109},{30,76,90},{15,58,70},{4,33,45},{0,0,5},{80,143,157},{69,125,139},{59,109,122},{46,93,103},{32,75,84},{16,58,66},{4,34,41},{0,0,2},{82,143,149},{72,125,131},{60,109,114},{47,93,97},{33,75,79},{17,58,61},{4,34,37},{0,0,1},{84,142,140},{73,124,123},{61,108,107},{49,92,91},{34,75,74},{18,58,56},{4,34,33},{0,0,0}, -{85,142,131},{75,124,115},{62,108,100},{50,92,85},{35,75,68},{19,58,51},{4,34,29},{0,0,0},{87,141,122},{76,124,107},{64,108,93},{51,92,78},{36,74,62},{19,57,46},{4,34,24},{0,0,0},{89,141,113},{77,124,99},{65,108,85},{52,92,71},{37,74,56},{19,57,40},{4,34,19},{0,0,0},{91,141,103},{78,123,90},{66,107,78},{53,91,64},{38,74,50},{20,57,34},{4,34,13},{0,0,0}, -{92,141,93},{79,123,81},{67,107,69},{53,91,56},{38,74,43},{20,57,28},{4,34,8},{0,0,0},{94,140,82},{81,123,72},{69,107,60},{54,91,49},{39,74,37},{21,57,22},{5,34,3},{0,0,0},{94,140,74},{81,123,64},{69,107,54},{55,91,43},{39,74,31},{21,57,16},{5,34,2},{0,0,0},{95,140,67},{82,123,57},{70,107,48},{56,91,38},{39,74,25},{21,57,10},{4,34,1},{0,0,0}, -{73,134,198},{63,118,176},{54,103,154},{44,87,131},{30,70,109},{14,52,86},{3,28,58},{0,0,18},{76,134,188},{66,118,167},{57,103,146},{46,87,124},{33,70,103},{16,52,81},{4,28,54},{0,0,14},{79,134,179},{70,118,158},{60,103,138},{48,87,117},{35,70,97},{18,52,76},{4,28,50},{0,0,9},{81,134,170},{72,118,151},{61,102,131},{49,87,112},{36,70,92},{19,53,72},{5,28,46},{0,0,5}, -{83,134,161},{73,118,143},{62,102,124},{50,87,106},{36,70,87},{19,53,67},{5,28,42},{0,0,2},{86,134,152},{75,117,135},{64,102,118},{51,87,100},{37,70,81},{20,53,63},{5,29,38},{0,0,1},{88,134,144},{76,117,127},{64,102,111},{52,87,94},{38,70,76},{21,53,58},{5,29,34},{0,0,0},{89,133,136},{77,116,119},{65,102,104},{53,86,88},{39,70,71},{22,53,53},{5,29,30},{0,0,0}, -{91,133,128},{79,116,111},{67,102,97},{53,86,82},{39,70,65},{23,53,49},{5,29,26},{0,0,0},{92,133,119},{80,116,104},{68,101,90},{54,86,75},{39,69,59},{23,52,44},{6,30,22},{0,0,0},{94,133,110},{80,116,96},{69,101,82},{55,86,69},{40,69,53},{23,52,38},{6,30,17},{0,0,0},{95,132,100},{81,115,87},{70,101,75},{56,85,62},{41,69,47},{23,52,32},{5,30,11},{0,0,0}, -{95,132,90},{82,115,79},{70,101,67},{56,85,54},{41,69,41},{23,52,26},{5,30,7},{0,0,0},{97,131,80},{84,115,70},{71,101,59},{57,85,47},{42,69,35},{24,52,20},{6,30,3},{0,0,0},{97,131,73},{84,115,62},{72,101,52},{57,85,41},{42,69,29},{24,52,14},{6,30,2},{0,0,0},{98,132,66},{85,115,55},{73,101,46},{58,85,36},{43,69,24},{24,52,8},{6,30,1},{0,0,0}, -{79,125,192},{69,111,169},{59,96,149},{48,81,127},{35,65,105},{19,47,83},{5,23,55},{0,0,15},{82,125,182},{72,110,161},{62,96,141},{50,81,120},{37,65,99},{21,47,78},{5,23,51},{0,0,11},{85,125,173},{74,110,153},{64,96,133},{51,81,113},{38,65,93},{23,47,73},{6,23,48},{0,0,6},{87,125,165},{76,110,146},{66,95,127},{52,81,108},{39,65,89},{23,48,69},{7,24,44},{0,0,3}, -{89,125,156},{77,110,138},{67,95,120},{53,81,103},{40,65,84},{23,48,64},{7,24,40},{0,0,1},{90,125,148},{79,110,131},{68,95,114},{54,81,97},{41,65,78},{24,48,60},{7,24,36},{0,0,0},{92,125,140},{79,110,123},{68,95,108},{54,81,91},{41,65,73},{25,48,55},{7,24,32},{0,0,0},{93,124,132},{80,109,116},{69,95,101},{55,80,85},{42,65,68},{26,48,51},{7,25,28},{0,0,0}, -{94,124,124},{82,109,108},{69,95,94},{56,80,79},{42,65,62},{26,48,47},{7,25,24},{0,0,0},{95,124,115},{83,109,101},{70,94,87},{56,80,73},{42,64,57},{26,47,42},{7,26,20},{0,0,0},{96,124,107},{84,109,93},{71,94,80},{57,80,67},{43,64,52},{26,47,37},{7,26,15},{0,0,0},{97,124,97},{85,108,85},{72,94,73},{58,80,60},{44,64,46},{27,47,31},{7,26,9},{0,0,0}, -{98,124,88},{85,108,77},{73,94,65},{58,80,53},{44,64,40},{27,47,25},{7,26,6},{0,0,0},{99,123,79},{87,108,68},{73,94,58},{59,80,46},{44,64,34},{27,47,19},{7,26,2},{0,0,0},{99,123,72},{87,108,61},{74,94,51},{59,80,40},{44,64,28},{27,47,13},{7,26,1},{0,0,0},{100,123,65},{87,108,54},{74,94,45},{60,80,35},{44,64,23},{27,47,7},{7,26,0},{0,0,0}, -{86,117,186},{75,103,164},{64,90,144},{52,75,123},{39,59,101},{23,42,80},{7,17,53},{0,0,12},{88,117,176},{77,103,156},{66,89,137},{54,75,116},{41,59,95},{25,42,75},{8,18,49},{0,0,8},{89,117,167},{78,103,148},{68,89,129},{55,75,109},{42,59,90},{27,42,70},{8,18,46},{0,0,3},{91,117,160},{79,103,141},{69,89,123},{56,75,104},{43,59,86},{28,42,66},{8,19,42},{0,0,1}, -{93,117,152},{80,103,134},{69,89,116},{57,75,99},{43,59,81},{28,42,62},{8,19,38},{0,0,0},{94,117,144},{82,103,127},{70,89,110},{57,75,93},{44,59,75},{29,42,58},{8,19,34},{0,0,0},{95,117,136},{83,103,119},{71,89,104},{57,75,87},{44,59,70},{29,42,53},{8,19,30},{0,0,0},{96,116,128},{84,103,112},{72,89,97},{58,74,82},{45,59,65},{29,42,49},{8,20,26},{0,0,0}, -{97,116,120},{85,103,105},{72,89,91},{58,74,76},{45,59,60},{29,42,45},{8,20,22},{0,0,0},{98,116,112},{86,102,98},{73,88,84},{59,74,71},{45,59,55},{29,43,40},{9,21,18},{0,0,0},{99,116,104},{86,102,90},{74,88,78},{59,74,65},{45,59,50},{29,43,35},{8,21,13},{0,0,0},{100,116,95},{87,102,83},{75,88,71},{60,74,58},{46,59,44},{29,43,29},{8,22,7},{0,0,0}, -{100,116,86},{88,102,75},{75,88,63},{60,74,51},{46,59,38},{29,43,23},{8,22,4},{0,0,0},{101,115,77},{89,102,66},{75,88,56},{61,74,44},{46,59,32},{29,43,17},{8,22,2},{0,0,0},{101,115,70},{89,102,59},{76,88,49},{61,74,38},{46,59,26},{29,43,11},{8,22,1},{0,0,0},{102,115,63},{89,101,52},{76,88,43},{62,74,33},{46,59,21},{30,43,5},{8,22,0},{0,0,0}, -{90,108,179},{79,96,159},{67,83,139},{56,68,118},{43,52,97},{27,36,77},{8,10,50},{0,0,8},{92,108,170},{81,96,152},{70,82,132},{57,68,112},{44,53,92},{28,37,72},{9,11,46},{0,0,5},{93,108,162},{83,96,144},{71,82,124},{58,68,105},{45,53,87},{29,37,68},{9,11,43},{0,0,1},{95,108,155},{84,96,137},{72,82,119},{59,68,101},{45,53,83},{30,37,64},{9,12,39},{0,0,0}, -{96,108,147},{84,96,129},{72,82,113},{59,68,96},{45,53,78},{31,37,60},{10,12,36},{0,0,0},{97,108,139},{85,96,123},{73,82,107},{60,68,90},{46,53,72},{31,37,55},{10,13,32},{0,0,0},{97,108,131},{85,96,115},{73,82,100},{60,68,84},{46,53,67},{31,37,51},{10,13,28},{0,0,0},{98,108,124},{86,96,108},{74,82,93},{61,67,79},{46,53,63},{31,37,47},{10,14,24},{0,0,0}, -{100,108,116},{87,96,101},{74,82,87},{61,67,73},{46,53,59},{31,37,43},{11,15,20},{0,0,0},{101,108,109},{87,95,95},{75,82,81},{61,68,68},{47,54,54},{31,38,38},{11,16,16},{0,0,0},{101,108,101},{88,95,87},{75,82,75},{61,68,62},{47,54,49},{31,38,33},{11,16,11},{0,0,0},{102,108,92},{89,95,80},{76,82,69},{62,68,56},{47,53,43},{31,38,27},{10,17,6},{0,0,0}, -{102,108,84},{89,95,72},{76,82,61},{62,68,50},{47,53,37},{31,38,22},{10,17,3},{0,0,0},{103,107,75},{90,95,65},{77,81,54},{63,68,43},{47,54,31},{32,38,16},{10,17,1},{0,0,0},{103,107,68},{90,95,58},{77,81,48},{63,68,37},{47,54,25},{32,38,10},{10,17,1},{0,0,0},{104,107,62},{91,94,51},{77,81,42},{63,67,32},{47,54,20},{31,38,4},{9,17,0},{0,0,0}, -{94,99,173},{83,88,153},{71,75,134},{59,61,114},{45,46,94},{31,29,74},{8,5,48},{0,0,5},{95,99,164},{84,88,146},{73,75,127},{61,61,108},{46,46,89},{31,30,69},{9,6,44},{0,0,3},{96,99,156},{86,88,139},{74,75,120},{61,61,102},{47,47,84},{31,30,65},{10,7,41},{0,0,0},{98,99,150},{87,88,132},{74,75,114},{62,61,98},{48,47,80},{32,31,61},{11,7,37},{0,0,0}, -{99,99,142},{87,88,124},{74,75,109},{62,61,93},{48,47,75},{33,31,57},{11,7,33},{0,0,0},{100,100,134},{88,88,118},{75,75,103},{62,62,87},{48,47,70},{33,31,53},{12,8,30},{0,0,0},{100,100,127},{88,88,112},{75,75,97},{62,62,81},{48,47,65},{33,31,48},{12,8,26},{0,0,0},{101,100,120},{89,88,105},{76,75,91},{63,61,76},{48,47,60},{33,31,44},{12,9,22},{0,0,0}, -{103,100,113},{89,88,98},{76,75,85},{63,61,71},{48,47,56},{33,31,40},{12,9,18},{0,0,0},{104,99,106},{90,87,92},{76,75,79},{63,62,65},{49,48,52},{33,32,36},{12,10,13},{0,0,0},{104,99,98},{90,87,85},{77,75,73},{63,62,60},{49,48,47},{33,32,31},{12,10,9},{0,0,0},{105,99,90},{91,87,78},{78,75,67},{64,62,54},{48,47,41},{33,32,25},{11,11,6},{0,0,0}, -{105,99,82},{91,87,70},{78,75,59},{64,62,48},{48,47,35},{33,32,20},{11,11,3},{0,0,0},{105,99,73},{92,87,63},{79,75,52},{64,62,42},{49,48,29},{33,32,14},{11,11,1},{0,0,0},{105,99,66},{92,87,56},{79,75,46},{64,62,36},{49,48,23},{33,32,8},{11,11,1},{0,0,0},{106,99,60},{93,87,51},{79,75,41},{64,61,30},{49,48,18},{33,32,4},{11,11,0},{0,0,0}, -{97,90,167},{86,79,147},{74,67,128},{62,53,110},{48,38,90},{33,21,70},{10,3,46},{0,0,2},{99,90,158},{87,79,140},{75,67,122},{63,54,105},{49,39,86},{33,22,66},{11,3,42},{0,0,1},{100,90,150},{88,79,133},{76,67,116},{63,54,99},{49,40,81},{33,23,63},{11,3,39},{0,0,0},{101,90,144},{89,79,127},{77,67,110},{64,54,94},{50,40,77},{34,24,59},{12,3,35},{0,0,0}, -{102,90,137},{90,79,120},{77,67,105},{64,54,89},{50,40,72},{34,24,55},{12,3,31},{0,0,0},{102,91,130},{90,79,114},{77,67,99},{64,54,84},{50,41,68},{34,25,51},{13,4,28},{0,0,0},{102,91,123},{90,79,108},{77,67,94},{64,54,79},{50,41,63},{34,25,46},{13,4,24},{0,0,0},{103,91,116},{91,79,102},{78,67,89},{65,55,74},{50,41,58},{34,25,42},{13,5,20},{0,0,0}, -{105,91,110},{91,79,96},{78,67,83},{65,55,69},{50,41,54},{34,25,38},{13,5,16},{0,0,0},{105,90,103},{92,79,90},{78,68,77},{65,55,63},{51,42,50},{34,26,34},{13,5,11},{0,0,0},{106,90,95},{92,79,83},{79,68,71},{65,55,58},{51,42,45},{34,26,29},{13,5,7},{0,0,0},{107,90,88},{93,79,76},{80,67,65},{65,55,52},{50,41,39},{34,26,23},{12,6,5},{0,0,0}, -{107,90,80},{93,79,68},{80,67,57},{65,55,46},{50,41,33},{34,26,18},{12,6,3},{0,0,0},{107,90,71},{94,79,61},{81,68,50},{66,55,40},{51,42,27},{35,26,12},{12,6,1},{0,0,0},{107,90,65},{94,79,55},{81,68,45},{66,55,34},{51,42,22},{35,26,7},{12,6,1},{0,0,0},{108,90,59},{94,79,50},{81,68,40},{66,55,29},{51,42,17},{34,27,4},{12,6,0},{0,0,0}, -{101,79,161},{89,69,142},{77,57,124},{64,44,106},{50,29,87},{35,13,67},{10,1,43},{0,0,1},{102,80,153},{90,69,135},{78,57,118},{65,45,101},{51,30,82},{35,14,63},{11,1,39},{0,0,0},{103,80,145},{91,69,129},{79,57,112},{65,45,95},{51,31,78},{35,14,60},{11,1,36},{0,0,0},{104,80,139},{91,69,123},{80,58,107},{66,46,91},{51,32,74},{36,15,56},{12,1,32},{0,0,0}, -{104,80,133},{92,69,116},{80,58,102},{66,46,86},{51,32,69},{36,15,52},{12,1,28},{0,0,0},{105,81,126},{92,69,110},{80,58,96},{65,46,81},{51,32,65},{35,16,48},{13,2,25},{0,0,0},{105,81,119},{92,69,104},{80,58,90},{65,46,76},{51,33,60},{35,17,43},{13,2,21},{0,0,0},{106,81,112},{93,70,99},{80,58,85},{66,47,71},{52,33,55},{35,17,39},{13,3,17},{0,0,0}, -{106,81,106},{93,70,93},{80,58,80},{66,47,66},{52,33,51},{35,17,35},{13,3,13},{0,0,0},{107,81,99},{93,70,87},{81,59,74},{66,47,60},{51,34,47},{36,18,31},{13,3,9},{0,0,0},{107,81,92},{93,70,80},{81,59,68},{66,47,55},{51,34,42},{36,18,26},{13,3,6},{0,0,0},{108,80,85},{94,70,73},{81,59,62},{66,47,49},{51,34,37},{36,19,21},{13,3,4},{0,0,0}, -{108,80,77},{94,70,66},{81,59,55},{66,47,44},{51,34,32},{36,19,16},{13,3,2},{0,0,0},{108,81,70},{95,70,59},{82,59,49},{67,47,39},{51,35,26},{36,19,10},{13,3,1},{0,0,0},{108,81,64},{95,70,53},{82,59,44},{67,47,33},{51,35,21},{36,19,7},{13,3,1},{0,0,0},{109,80,58},{96,70,48},{82,60,39},{67,47,28},{51,35,16},{35,20,4},{12,3,0},{0,0,0}, -{104,68,156},{91,58,137},{80,48,120},{66,35,102},{52,20,83},{37,4,64},{10,0,40},{0,0,0},{105,68,149},{92,59,131},{81,48,114},{67,36,97},{53,21,78},{37,5,60},{11,0,36},{0,0,0},{106,68,141},{93,59,125},{81,48,108},{68,36,91},{53,22,74},{37,5,57},{11,0,33},{0,0,0},{107,69,135},{94,59,119},{82,49,103},{68,37,87},{53,23,70},{38,6,53},{12,0,29},{0,0,0}, -{107,69,129},{94,59,112},{82,49,98},{68,37,82},{53,23,66},{38,6,49},{12,0,26},{0,0,0},{107,70,122},{95,60,106},{82,49,92},{67,38,77},{53,24,61},{37,7,45},{12,0,23},{0,0,0},{107,70,115},{95,60,100},{82,49,86},{67,38,72},{53,24,57},{37,8,41},{12,0,19},{0,0,0},{108,70,108},{95,61,95},{82,49,81},{67,39,67},{53,25,53},{37,9,37},{12,1,14},{0,0,0}, -{108,70,102},{95,61,89},{82,49,76},{67,39,63},{53,26,49},{37,10,33},{13,1,10},{0,0,0},{109,70,95},{95,61,83},{82,50,71},{68,39,58},{52,26,45},{37,10,29},{14,1,7},{0,0,0},{109,70,89},{95,61,77},{82,50,65},{68,39,53},{52,26,40},{37,10,24},{14,1,5},{0,0,0},{109,71,82},{96,61,71},{82,50,59},{68,39,47},{53,27,35},{37,11,19},{13,1,3},{0,0,0}, -{109,71,75},{96,61,64},{82,50,53},{68,39,42},{53,27,30},{37,11,14},{13,1,1},{0,0,0},{110,71,68},{97,61,57},{83,51,47},{69,40,37},{52,28,25},{37,12,9},{13,1,0},{0,0,0},{110,71,62},{97,61,51},{83,51,42},{69,40,32},{52,28,19},{37,12,6},{13,1,0},{0,0,0},{111,71,56},{97,61,46},{83,51,37},{69,40,27},{52,29,14},{37,13,3},{12,1,0},{0,0,0}, -{106,56,150},{93,46,132},{81,35,116},{68,22,98},{53,10,80},{38,2,62},{10,0,38},{0,0,0},{107,56,143},{94,47,126},{82,36,110},{69,23,93},{54,11,76},{38,2,58},{11,0,34},{0,0,0},{108,56,136},{95,47,120},{82,36,104},{69,23,88},{54,12,72},{38,2,55},{11,0,31},{0,0,0},{109,57,130},{96,47,114},{83,37,100},{69,25,84},{54,13,68},{38,3,51},{11,0,27},{0,0,0}, -{109,57,124},{96,47,109},{83,37,95},{69,25,80},{54,13,64},{38,3,47},{11,0,24},{0,0,0},{109,58,118},{96,49,103},{83,38,89},{68,26,75},{54,14,59},{38,3,43},{12,0,21},{0,0,0},{109,59,112},{96,49,98},{83,38,84},{68,27,70},{54,14,55},{38,4,39},{12,0,17},{0,0,0},{109,59,105},{96,50,92},{82,39,79},{68,28,65},{54,15,51},{38,4,35},{13,1,12},{0,0,0}, -{109,60,99},{96,50,86},{82,40,74},{68,29,61},{54,16,47},{38,5,31},{13,1,9},{0,0,0},{110,60,93},{96,51,81},{83,40,69},{68,29,56},{53,16,43},{38,5,28},{13,1,6},{0,0,0},{110,60,87},{96,51,75},{83,41,63},{68,29,51},{53,16,38},{38,5,23},{13,1,4},{0,0,0},{110,61,80},{97,51,69},{83,41,57},{68,30,46},{53,17,33},{38,6,17},{13,1,2},{0,0,0}, -{110,61,73},{97,51,63},{83,41,52},{68,30,41},{53,18,28},{38,6,13},{13,1,1},{0,0,0},{111,61,67},{98,51,56},{84,42,46},{69,31,36},{53,19,23},{37,6,8},{13,1,0},{0,0,0},{111,61,61},{98,51,50},{84,42,41},{69,31,31},{53,19,18},{37,6,5},{13,1,0},{0,0,0},{112,61,55},{98,51,45},{84,42,36},{69,31,26},{53,19,13},{37,7,3},{12,1,0},{0,0,0}, -{108,44,145},{96,33,127},{82,22,111},{70,8,95},{55,0,77},{39,0,60},{9,0,36},{0,0,0},{109,43,138},{97,34,121},{83,23,106},{70,9,90},{55,1,73},{39,0,56},{10,0,32},{0,0,0},{110,43,131},{97,34,115},{84,24,100},{70,10,85},{55,1,69},{39,0,52},{10,0,29},{0,0,0},{111,44,125},{98,35,110},{84,25,96},{70,12,81},{55,2,65},{39,0,48},{11,0,25},{0,0,0}, -{111,45,120},{98,35,105},{84,26,91},{70,13,77},{55,2,61},{39,0,45},{12,0,22},{0,0,0},{111,46,114},{98,37,99},{84,27,86},{70,15,72},{55,3,57},{39,0,41},{13,0,18},{0,0,0},{111,47,108},{98,38,94},{84,27,81},{70,16,67},{55,3,53},{39,0,37},{13,0,14},{0,0,0},{111,47,102},{97,39,89},{84,28,76},{70,17,62},{55,4,49},{39,0,33},{13,0,10},{0,0,0}, -{111,48,96},{97,39,83},{84,29,72},{70,17,58},{55,5,45},{39,0,29},{13,0,7},{0,0,0},{111,49,90},{98,39,78},{84,30,67},{69,18,54},{54,6,41},{39,0,25},{13,0,5},{0,0,0},{111,49,84},{98,39,72},{84,30,61},{69,19,49},{54,6,36},{39,0,21},{13,0,3},{0,0,0},{112,49,78},{99,39,66},{85,31,55},{70,20,44},{54,6,31},{39,1,15},{13,0,1},{0,0,0}, -{112,49,71},{99,40,61},{85,31,50},{70,20,39},{54,7,26},{39,1,11},{13,0,1},{0,0,0},{113,49,65},{99,41,55},{85,31,45},{70,21,34},{54,8,21},{38,1,7},{13,0,1},{0,0,0},{113,49,59},{99,41,49},{85,31,40},{70,21,29},{54,8,16},{38,1,4},{13,0,1},{0,0,0},{112,50,54},{99,41,44},{85,32,35},{70,22,24},{54,9,11},{37,1,2},{12,0,0},{0,0,0}, -{0,182,240},{0,161,213},{0,140,186},{0,120,159},{0,99,133},{0,77,105},{0,51,74},{0,10,34},{0,181,228},{0,160,202},{0,140,176},{0,119,151},{0,99,126},{0,77,99},{0,51,70},{0,9,31},{0,180,217},{0,160,191},{0,140,167},{0,119,143},{0,99,118},{0,77,93},{0,51,65},{0,9,29},{0,179,205},{0,159,182},{0,139,159},{0,118,136},{0,98,112},{0,77,89},{0,51,61},{0,9,25}, -{0,179,194},{0,158,172},{0,139,151},{0,118,129},{0,98,106},{0,77,84},{0,51,57},{0,9,21},{0,178,184},{0,157,162},{0,138,142},{0,118,121},{0,98,100},{0,76,78},{0,51,53},{0,9,17},{0,178,173},{0,157,153},{0,138,133},{0,118,113},{0,98,94},{0,76,73},{0,51,48},{0,9,12},{0,177,162},{0,157,144},{0,137,125},{0,117,106},{0,97,87},{0,76,68},{0,50,44},{0,8,7}, -{1,177,152},{1,157,134},{0,137,117},{0,117,99},{0,97,81},{0,76,63},{0,50,40},{0,8,4},{2,176,142},{2,156,125},{1,137,109},{0,116,92},{0,96,75},{0,76,58},{0,51,35},{0,7,1},{4,175,130},{3,155,115},{2,137,100},{0,116,85},{0,96,69},{0,76,52},{0,51,30},{0,7,0},{5,174,118},{4,154,105},{3,136,91},{1,116,77},{0,96,62},{0,75,46},{0,50,24},{0,7,0}, -{6,174,107},{5,154,95},{3,136,82},{1,116,69},{0,96,55},{0,75,39},{0,50,18},{0,7,0},{7,174,95},{5,154,85},{4,135,73},{1,115,60},{0,95,48},{0,75,33},{0,50,12},{0,7,0},{7,174,86},{6,154,77},{4,135,66},{2,115,54},{0,95,42},{0,75,27},{0,50,7},{0,7,0},{7,174,76},{6,154,68},{4,134,58},{2,115,48},{0,95,37},{0,74,22},{0,50,2},{0,7,0}, -{0,173,233},{0,153,206},{0,133,180},{0,114,154},{0,93,128},{0,72,102},{0,47,71},{0,5,32},{0,172,221},{0,152,196},{0,133,170},{0,113,146},{0,94,122},{0,72,96},{0,47,67},{0,4,28},{0,171,210},{0,151,185},{0,133,162},{0,113,138},{0,94,114},{0,72,90},{0,47,62},{0,4,26},{1,170,199},{1,151,176},{1,132,154},{0,112,132},{0,93,108},{0,72,86},{0,47,58},{0,4,22}, -{2,170,189},{2,151,167},{1,132,146},{0,112,125},{0,93,103},{0,72,81},{0,47,54},{0,4,18},{3,169,179},{2,150,158},{2,131,138},{1,112,117},{0,92,97},{0,71,75},{0,47,50},{0,4,13},{3,169,168},{2,150,149},{2,131,129},{1,112,110},{0,92,91},{0,71,70},{0,47,46},{0,4,9},{3,168,157},{3,149,140},{2,130,121},{1,111,103},{0,92,84},{0,71,65},{0,46,42},{0,3,4}, -{4,168,147},{3,149,130},{2,130,113},{2,111,96},{0,92,78},{0,71,60},{0,46,38},{0,3,2},{5,167,138},{4,148,121},{3,130,106},{2,110,89},{1,91,72},{0,71,55},{0,47,33},{0,3,0},{6,166,127},{5,148,112},{4,130,97},{2,110,82},{1,91,66},{0,71,50},{0,47,28},{0,3,0},{7,166,116},{6,147,102},{4,129,89},{2,110,75},{1,91,60},{0,71,44},{0,46,22},{0,3,0}, -{7,166,105},{6,147,93},{5,129,80},{3,110,67},{1,91,53},{0,71,37},{0,46,16},{0,3,0},{8,166,93},{7,147,83},{5,128,71},{3,109,59},{1,90,46},{0,71,31},{0,46,10},{0,3,0},{8,166,84},{7,147,75},{5,128,64},{3,109,52},{1,90,40},{0,71,25},{0,46,6},{0,3,0},{8,165,75},{7,147,66},{5,128,57},{3,109,47},{2,90,35},{0,70,20},{0,46,2},{0,3,0}, -{0,164,225},{0,145,199},{0,126,173},{0,107,148},{0,87,124},{0,67,99},{0,42,68},{0,0,30},{0,163,214},{0,144,189},{0,125,164},{0,107,141},{0,88,118},{0,67,94},{0,42,64},{0,0,26},{1,162,203},{1,143,179},{0,125,156},{0,107,134},{0,88,111},{0,67,88},{0,42,60},{0,0,23},{2,162,193},{2,143,170},{1,125,149},{0,106,128},{0,87,105},{0,67,84},{0,43,56},{0,0,19}, -{4,162,183},{3,143,162},{2,125,142},{1,106,121},{0,87,100},{0,67,79},{0,43,52},{0,0,15},{5,161,173},{4,142,153},{3,124,134},{1,105,114},{0,86,94},{0,67,73},{0,43,48},{0,0,10},{6,160,162},{5,142,144},{4,124,126},{2,105,107},{1,86,88},{0,67,68},{0,43,44},{0,0,6},{6,160,152},{5,141,135},{4,123,118},{2,105,100},{1,86,82},{0,67,63},{0,43,40},{0,0,2}, -{7,159,143},{6,141,127},{4,123,110},{3,105,94},{1,86,76},{0,67,58},{0,43,36},{0,0,0},{7,158,134},{6,140,118},{5,122,103},{3,104,87},{1,85,70},{0,67,53},{0,43,31},{0,0,0},{8,158,124},{7,140,109},{5,122,95},{4,104,80},{1,85,64},{0,67,48},{0,43,26},{0,0,0},{8,158,114},{7,139,100},{6,122,87},{4,104,73},{2,85,58},{0,67,42},{0,43,21},{0,0,0}, -{9,158,103},{7,139,91},{6,122,79},{4,104,65},{2,85,51},{0,67,36},{0,43,15},{0,0,0},{9,158,92},{8,139,81},{6,121,70},{4,103,58},{2,84,45},{0,66,30},{0,43,9},{0,0,0},{10,158,83},{8,139,73},{6,121,63},{4,103,51},{2,84,39},{0,66,24},{0,43,5},{0,0,0},{10,157,74},{9,139,65},{6,121,56},{5,103,45},{3,84,34},{1,66,19},{0,43,2},{0,0,0}, -{2,155,219},{2,138,193},{2,120,169},{1,101,144},{0,83,120},{0,63,95},{0,38,66},{0,0,27},{3,154,208},{3,137,183},{2,119,160},{1,101,137},{0,83,114},{0,63,90},{0,38,62},{0,0,23},{4,154,197},{3,136,174},{3,119,152},{2,101,130},{1,83,107},{0,63,85},{0,38,58},{0,0,19},{5,154,187},{4,136,166},{3,119,145},{2,101,124},{1,83,102},{0,63,81},{0,39,54},{0,0,15}, -{6,154,178},{5,136,158},{4,119,138},{2,101,117},{1,83,97},{0,63,76},{0,39,50},{0,0,11},{6,153,169},{5,135,149},{4,118,130},{3,100,110},{1,82,91},{0,63,71},{0,39,46},{0,0,6},{7,153,158},{6,135,140},{5,118,122},{3,100,104},{1,82,86},{0,63,66},{0,39,42},{0,0,4},{7,152,148},{6,134,131},{5,117,114},{4,100,97},{2,82,79},{0,63,61},{0,39,38},{0,0,1}, -{8,152,139},{7,134,123},{5,117,107},{4,100,91},{2,82,73},{0,63,56},{0,39,34},{0,0,0},{8,151,130},{7,134,114},{6,117,100},{4,99,84},{2,81,68},{0,63,51},{0,39,29},{0,0,0},{9,151,120},{7,134,106},{6,117,92},{4,99,77},{2,81,62},{0,63,46},{0,39,24},{0,0,0},{9,151,110},{8,133,97},{6,116,84},{5,99,71},{2,81,56},{1,63,40},{0,39,19},{0,0,0}, -{10,151,100},{8,133,88},{6,116,76},{5,99,63},{3,81,49},{1,63,34},{0,39,13},{0,0,0},{11,150,89},{8,133,79},{7,116,68},{5,98,56},{3,80,43},{1,62,28},{0,39,7},{0,0,0},{15,150,81},{11,133,71},{7,116,61},{5,98,50},{3,80,37},{1,62,23},{0,39,4},{0,0,0},{19,150,73},{15,132,63},{7,116,54},{5,98,44},{3,80,32},{1,62,18},{0,39,2},{0,0,0}, -{4,147,212},{3,130,187},{3,113,164},{2,95,140},{0,78,116},{0,59,91},{0,34,63},{0,0,24},{5,146,201},{5,129,178},{4,113,155},{2,95,133},{1,78,110},{0,59,87},{0,34,59},{0,0,20},{6,146,191},{5,129,169},{4,113,147},{3,95,126},{1,78,104},{0,59,82},{0,34,55},{0,0,15},{7,146,182},{6,129,161},{5,112,141},{4,95,120},{2,78,99},{0,59,78},{0,35,51},{0,0,11}, -{8,146,173},{6,129,153},{5,112,134},{4,95,113},{2,78,94},{0,59,73},{0,35,47},{0,0,7},{8,145,164},{7,128,144},{6,112,126},{4,95,107},{2,77,88},{1,59,68},{0,35,43},{0,0,4},{8,145,154},{7,128,136},{6,112,118},{4,95,101},{2,77,83},{1,59,63},{0,35,39},{0,0,2},{10,144,144},{7,127,127},{6,111,111},{5,94,94},{3,77,76},{1,59,58},{0,35,35},{0,0,1}, -{11,144,135},{9,127,119},{6,111,104},{5,94,88},{3,77,70},{1,59,54},{0,35,31},{0,0,0},{12,143,126},{10,127,111},{7,111,97},{5,94,81},{3,76,65},{1,59,49},{0,35,27},{0,0,0},{12,143,117},{11,127,103},{8,111,89},{5,94,74},{3,76,59},{1,59,44},{0,35,22},{0,0,0},{13,143,107},{11,126,94},{9,110,81},{6,93,68},{3,76,53},{1,59,38},{0,35,17},{0,0,0}, -{15,143,97},{12,126,85},{10,110,73},{6,93,61},{3,76,47},{1,59,32},{0,35,11},{0,0,0},{17,142,87},{12,126,76},{10,110,65},{6,93,55},{4,75,42},{1,58,26},{0,35,6},{0,0,0},{23,142,79},{17,126,69},{10,110,59},{7,93,49},{4,75,36},{1,58,21},{0,35,4},{0,0,0},{29,142,72},{21,125,62},{10,109,53},{7,93,43},{4,75,31},{1,58,16},{0,35,2},{0,0,0}, -{6,138,205},{5,122,181},{5,106,158},{3,89,135},{2,72,112},{0,54,89},{0,30,61},{0,0,21},{7,137,194},{6,122,172},{5,106,151},{4,89,129},{2,72,106},{1,54,84},{0,30,57},{0,0,17},{8,137,185},{7,122,163},{6,106,143},{4,89,122},{3,72,100},{1,54,79},{0,30,53},{0,0,13},{8,137,176},{7,121,156},{6,105,136},{5,89,116},{3,72,95},{1,54,75},{0,31,49},{0,0,9}, -{9,137,167},{7,121,148},{6,105,129},{5,89,110},{3,72,90},{1,54,70},{0,31,45},{0,0,5},{9,137,158},{8,120,140},{6,105,122},{5,89,104},{3,71,85},{1,54,66},{0,31,41},{0,0,2},{10,137,149},{8,120,132},{7,105,114},{5,89,98},{3,71,80},{1,54,61},{0,31,37},{0,0,1},{14,136,140},{9,120,123},{7,104,107},{5,88,91},{3,71,74},{1,54,56},{0,31,33},{0,0,0}, -{18,136,131},{13,120,115},{9,104,101},{6,88,85},{4,71,68},{1,54,52},{0,31,29},{0,0,0},{21,136,123},{18,120,108},{12,104,94},{6,88,78},{4,71,63},{2,54,47},{0,31,25},{0,0,0},{25,136,114},{21,120,100},{14,104,87},{7,88,72},{4,71,57},{2,54,42},{0,31,20},{0,0,0},{29,135,105},{24,119,92},{17,103,79},{8,87,66},{4,70,51},{2,53,36},{0,31,15},{0,0,0}, -{32,135,95},{26,119,83},{19,103,71},{10,87,59},{4,70,45},{2,53,30},{0,31,9},{0,0,0},{35,134,85},{29,119,74},{22,103,63},{11,87,53},{4,71,40},{2,54,24},{0,31,4},{0,0,0},{38,134,77},{31,119,67},{23,103,57},{12,87,47},{4,71,34},{2,54,19},{0,31,3},{0,0,0},{41,135,70},{34,118,61},{23,103,52},{12,87,41},{5,70,29},{2,53,14},{0,31,1},{0,0,0}, -{8,130,198},{7,114,175},{6,99,153},{5,83,130},{3,66,108},{1,49,86},{0,25,58},{0,0,18},{10,129,188},{9,114,166},{7,99,146},{6,83,124},{3,66,103},{1,49,81},{0,26,54},{0,0,14},{12,129,179},{10,114,158},{8,99,138},{6,83,117},{4,66,97},{1,49,76},{0,26,50},{0,0,10},{13,129,170},{12,113,151},{9,98,131},{6,83,112},{4,66,92},{1,49,72},{0,26,46},{0,0,6}, -{15,129,161},{13,113,143},{10,98,124},{7,83,107},{4,66,87},{1,49,67},{0,26,42},{0,0,2},{16,129,152},{14,113,135},{11,98,118},{7,83,101},{4,66,82},{2,49,63},{0,26,38},{0,0,1},{18,129,144},{14,113,127},{12,98,111},{7,83,95},{4,66,77},{2,49,58},{0,26,35},{0,0,0},{22,128,136},{16,112,120},{12,98,104},{8,82,88},{5,66,72},{2,49,54},{0,27,31},{0,0,0}, -{27,128,128},{20,112,112},{15,98,98},{9,82,82},{5,66,66},{2,49,49},{0,27,27},{0,0,0},{32,128,120},{27,112,105},{18,97,91},{10,82,75},{5,66,60},{2,49,44},{0,27,23},{0,0,0},{38,128,111},{31,112,97},{22,97,84},{12,82,69},{5,66,54},{2,49,39},{0,27,18},{0,0,0},{42,127,102},{35,111,89},{25,97,77},{13,81,63},{5,65,48},{2,48,33},{0,27,12},{0,0,0}, -{45,127,93},{37,111,81},{28,97,69},{15,81,57},{6,65,43},{2,48,28},{0,27,8},{0,0,0},{49,126,83},{41,111,72},{32,97,61},{17,82,51},{6,66,38},{2,49,22},{0,27,3},{0,0,0},{51,126,75},{42,111,65},{32,97,55},{18,82,45},{6,66,32},{2,49,17},{0,27,2},{0,0,0},{52,127,68},{44,111,59},{33,97,50},{19,81,39},{7,65,28},{2,48,12},{0,27,1},{0,0,0}, -{9,121,191},{8,107,169},{7,92,148},{5,77,126},{4,61,104},{2,44,83},{0,20,56},{0,0,15},{15,121,182},{14,106,161},{10,92,141},{7,77,120},{4,61,99},{2,44,78},{0,21,52},{0,0,11},{21,121,173},{19,106,153},{15,92,133},{9,77,113},{4,61,93},{2,44,73},{0,21,48},{0,0,6},{26,121,164},{23,106,146},{18,91,127},{10,77,108},{5,61,89},{2,44,69},{0,21,44},{0,0,3}, -{30,121,156},{25,106,138},{21,91,120},{12,77,103},{5,61,84},{2,44,64},{0,21,41},{0,0,1},{33,120,148},{27,106,131},{22,91,114},{12,77,97},{5,61,79},{2,44,60},{0,22,37},{0,0,0},{35,120,140},{28,106,123},{23,91,108},{14,77,92},{5,61,74},{2,44,55},{0,22,33},{0,0,0},{38,120,132},{31,105,116},{25,91,101},{16,77,85},{6,61,69},{3,44,51},{0,22,29},{0,0,0}, -{41,120,124},{35,105,109},{27,91,95},{18,77,79},{8,61,63},{3,44,47},{0,22,25},{0,0,0},{46,120,116},{38,105,102},{29,90,88},{19,76,74},{8,61,58},{3,44,43},{0,23,21},{0,0,0},{49,120,108},{41,105,94},{32,90,81},{21,76,68},{8,61,53},{3,44,38},{0,23,16},{0,0,0},{51,120,99},{44,104,87},{34,90,74},{22,76,61},{9,60,47},{3,44,32},{0,23,10},{0,0,0}, -{53,120,90},{46,104,79},{36,90,66},{23,76,55},{10,60,42},{3,44,27},{0,23,7},{0,0,0},{56,119,82},{48,104,70},{38,90,59},{25,76,49},{11,61,36},{4,44,21},{0,22,2},{0,0,0},{57,119,74},{49,104,64},{38,90,53},{25,76,43},{11,61,31},{4,44,16},{0,22,2},{0,0,0},{58,119,67},{50,104,58},{39,90,48},{26,76,38},{12,60,27},{4,44,11},{0,22,1},{0,0,0}, -{19,113,185},{17,99,164},{13,86,143},{10,71,122},{6,55,100},{2,38,80},{0,14,53},{0,0,12},{26,113,176},{24,99,156},{18,85,136},{13,71,116},{6,56,95},{2,39,75},{0,15,50},{0,0,8},{33,113,167},{29,99,148},{23,85,129},{15,71,109},{7,56,89},{3,39,70},{0,16,46},{0,0,3},{38,113,159},{33,99,141},{26,85,123},{17,71,104},{8,55,85},{4,39,66},{0,16,42},{0,0,1}, -{43,113,151},{36,99,134},{29,85,116},{19,71,99},{8,55,81},{4,39,62},{0,16,39},{0,0,0},{46,112,144},{38,99,127},{31,85,110},{20,71,93},{9,55,76},{4,39,58},{0,17,35},{0,0,0},{48,112,136},{40,99,119},{33,85,104},{21,71,88},{9,55,71},{4,39,53},{0,17,31},{0,0,0},{50,112,128},{43,99,112},{35,85,97},{23,71,82},{10,56,66},{4,40,49},{0,17,27},{0,0,0}, -{52,112,120},{45,99,105},{36,85,91},{25,71,77},{12,56,61},{4,40,45},{0,17,23},{0,0,0},{55,112,112},{47,98,99},{37,84,86},{26,70,72},{13,56,56},{4,40,41},{1,18,19},{0,0,0},{57,112,104},{49,98,92},{39,84,79},{28,70,66},{13,56,51},{4,40,36},{0,18,14},{0,0,0},{59,112,96},{50,98,85},{40,84,72},{29,70,59},{14,56,45},{4,40,30},{0,18,8},{0,0,0}, -{61,112,88},{51,98,77},{41,84,64},{29,70,53},{15,56,40},{4,40,25},{0,18,5},{0,0,0},{62,111,80},{52,98,68},{43,84,57},{31,70,47},{16,56,34},{5,40,19},{0,18,2},{0,0,0},{63,111,72},{53,98,62},{43,84,51},{31,70,41},{16,56,29},{5,40,14},{0,18,2},{0,0,0},{64,111,65},{55,98,56},{44,84,46},{32,70,36},{16,56,25},{5,40,9},{1,18,1},{0,0,0}, -{37,105,180},{34,92,159},{27,79,139},{19,65,118},{9,49,97},{3,33,77},{0,9,50},{0,0,9},{43,105,171},{38,92,152},{30,78,132},{21,65,112},{10,50,92},{4,34,72},{1,10,47},{0,0,5},{47,105,162},{41,92,144},{33,78,124},{23,65,105},{12,50,86},{4,34,68},{1,11,44},{0,0,1},{49,105,155},{43,92,137},{35,78,119},{25,65,101},{13,50,82},{5,34,64},{1,11,40},{0,0,0}, -{51,105,147},{45,92,130},{36,78,113},{27,65,96},{14,50,78},{5,34,60},{1,11,37},{0,0,0},{54,104,140},{47,92,123},{38,78,107},{28,65,90},{15,50,73},{5,34,56},{1,11,33},{0,0,0},{56,104,132},{48,92,115},{39,78,101},{29,65,85},{16,50,68},{5,34,51},{1,11,29},{0,0,0},{58,104,124},{49,92,108},{41,78,94},{30,64,80},{17,51,63},{5,35,47},{1,11,25},{0,0,0}, -{60,104,116},{51,92,102},{43,78,88},{31,64,74},{17,51,59},{5,35,43},{1,11,21},{0,0,0},{62,104,109},{51,91,96},{44,79,83},{32,65,69},{18,51,54},{5,35,39},{1,12,17},{0,0,0},{63,104,101},{53,91,89},{44,79,77},{32,65,63},{18,51,49},{5,35,34},{1,12,13},{0,0,0},{65,104,94},{55,91,82},{45,78,70},{33,65,57},{19,51,44},{6,35,29},{1,13,7},{0,0,0}, -{65,104,86},{56,91,75},{46,78,63},{33,65,51},{20,51,39},{6,35,24},{1,13,4},{0,0,0},{66,104,77},{57,91,67},{47,78,56},{34,65,45},{21,51,33},{6,35,18},{1,13,2},{0,0,0},{67,104,71},{58,91,61},{47,78,50},{34,65,40},{21,51,28},{6,35,13},{1,13,1},{0,0,0},{68,104,64},{59,91,55},{47,78,45},{35,65,35},{20,51,24},{7,36,8},{1,13,0},{0,0,0}, -{50,97,174},{45,84,153},{36,71,134},{27,58,114},{15,43,94},{5,27,74},{0,5,48},{0,0,6},{54,97,165},{47,84,146},{39,72,127},{30,59,108},{17,44,89},{6,28,69},{1,6,44},{0,0,3},{57,97,157},{49,84,139},{40,72,120},{31,59,102},{18,44,83},{6,28,65},{1,7,41},{0,0,0},{58,97,150},{50,84,132},{42,72,115},{32,59,98},{19,44,79},{7,28,61},{1,7,37},{0,0,0}, -{59,97,142},{51,84,125},{43,72,110},{32,59,93},{19,44,75},{7,28,57},{1,7,34},{0,0,0},{61,96,135},{52,84,119},{44,72,104},{33,59,87},{20,44,70},{8,29,53},{1,7,31},{0,0,0},{62,96,128},{54,84,112},{45,72,98},{34,59,82},{20,44,65},{8,29,49},{1,7,27},{0,0,0},{63,96,121},{55,84,105},{46,72,91},{35,58,77},{21,45,61},{8,29,45},{1,7,22},{0,0,0}, -{65,96,113},{56,84,99},{46,72,85},{35,58,72},{21,45,57},{8,29,41},{1,7,18},{0,0,0},{66,95,106},{56,84,93},{47,72,80},{36,59,66},{22,45,52},{9,30,36},{1,8,14},{0,0,0},{68,95,98},{58,84,86},{47,72,74},{36,59,61},{23,45,47},{9,30,32},{1,8,10},{0,0,0},{69,96,91},{59,84,79},{48,72,68},{37,59,55},{24,46,42},{10,30,27},{1,8,6},{0,0,0}, -{69,96,83},{60,84,72},{49,72,61},{37,59,49},{24,46,37},{10,30,22},{1,8,4},{0,0,0},{70,96,75},{61,83,65},{50,72,54},{38,59,43},{25,46,31},{9,30,16},{1,8,2},{0,0,0},{71,96,69},{61,83,59},{50,72,49},{38,59,38},{25,46,26},{9,30,11},{1,8,1},{0,0,0},{72,96,63},{62,83,53},{51,72,44},{39,59,33},{25,46,22},{10,31,6},{1,8,0},{0,0,0}, -{59,88,167},{52,76,147},{44,64,129},{35,51,110},{22,37,91},{7,20,71},{1,3,46},{0,0,4},{61,88,159},{54,76,140},{45,65,123},{36,52,105},{23,38,86},{8,21,67},{1,4,42},{0,0,1},{62,88,151},{56,76,133},{46,65,116},{36,52,99},{24,38,81},{9,22,63},{1,4,39},{0,0,0},{63,88,145},{57,76,127},{47,65,111},{38,52,94},{25,38,77},{10,22,59},{2,4,35},{0,0,0}, -{64,88,138},{57,76,121},{48,65,106},{38,52,89},{25,38,72},{10,22,55},{2,4,32},{0,0,0},{66,88,131},{58,77,115},{48,65,100},{38,52,84},{26,38,68},{11,23,51},{2,4,29},{0,0,0},{68,88,124},{58,77,109},{48,65,94},{38,52,79},{26,38,63},{11,23,47},{2,4,25},{0,0,0},{69,88,117},{59,76,102},{49,65,89},{39,52,75},{27,39,59},{12,23,43},{2,4,20},{0,0,0}, -{71,88,110},{61,76,96},{50,65,83},{39,52,70},{27,39,55},{12,23,39},{2,4,16},{0,0,0},{72,88,103},{61,77,90},{51,65,78},{40,53,64},{27,39,50},{13,24,34},{2,4,12},{0,0,0},{72,88,96},{62,77,84},{51,65,72},{40,53,59},{27,39,45},{13,24,30},{2,4,8},{0,0,0},{72,88,89},{62,77,77},{52,66,66},{41,53,53},{28,40,40},{13,25,25},{2,5,5},{0,0,0}, -{73,88,81},{63,77,70},{52,66,59},{41,53,47},{28,40,35},{13,25,20},{2,5,3},{0,0,0},{74,88,73},{64,76,63},{53,65,53},{42,53,42},{29,40,29},{13,25,14},{2,5,1},{0,0,0},{74,88,67},{64,76,57},{53,65,48},{42,53,37},{29,40,24},{13,25,9},{2,5,1},{0,0,0},{74,88,62},{65,76,52},{54,65,43},{42,53,32},{29,40,20},{13,25,4},{2,5,0},{0,0,0}, -{66,78,161},{58,67,143},{49,56,125},{40,43,106},{27,29,88},{12,12,68},{1,1,43},{0,0,2},{67,79,154},{59,68,136},{50,57,119},{41,44,101},{28,30,83},{13,13,64},{2,2,39},{0,0,1},{68,79,146},{60,68,128},{51,57,112},{41,44,95},{29,30,78},{14,14,60},{2,2,36},{0,0,0},{69,79,140},{61,68,123},{52,57,108},{42,44,91},{30,30,74},{15,15,56},{2,2,32},{0,0,0}, -{70,79,133},{62,68,117},{52,57,103},{42,44,86},{30,30,69},{15,15,52},{2,2,29},{0,0,0},{72,79,127},{62,68,111},{52,57,97},{42,44,81},{30,31,65},{14,16,48},{2,2,26},{0,0,0},{72,79,120},{62,68,105},{52,57,91},{42,44,76},{30,31,60},{14,16,44},{2,2,22},{0,0,0},{73,79,113},{63,68,99},{53,57,86},{43,45,72},{30,32,56},{15,16,40},{2,2,17},{0,0,0}, -{75,79,107},{63,68,93},{53,57,80},{43,45,67},{30,32,52},{15,16,36},{2,2,13},{0,0,0},{76,79,100},{64,69,87},{54,57,75},{43,46,61},{30,33,47},{15,17,32},{2,2,10},{0,0,0},{76,79,93},{65,69,81},{54,57,69},{43,46,56},{30,33,42},{15,17,27},{2,2,7},{0,0,0},{76,79,86},{66,69,75},{55,58,63},{44,46,50},{30,34,38},{16,18,23},{2,3,5},{0,0,0}, -{76,79,78},{66,69,68},{55,58,57},{44,46,45},{30,34,33},{16,18,18},{2,3,3},{0,0,0},{77,79,71},{67,68,61},{56,57,51},{45,46,40},{31,34,28},{16,18,12},{2,3,1},{0,0,0},{77,79,66},{67,68,56},{56,57,46},{45,46,36},{31,34,23},{16,18,8},{2,3,1},{0,0,0},{78,80,61},{68,68,51},{57,57,42},{45,47,31},{31,34,19},{16,19,4},{2,3,0},{0,0,0}, -{72,68,157},{62,58,139},{53,48,121},{44,35,102},{31,20,84},{17,4,64},{2,0,40},{0,0,0},{73,69,150},{63,59,132},{54,48,115},{45,36,97},{32,21,79},{17,5,60},{3,0,36},{0,0,0},{74,69,142},{64,59,124},{55,48,108},{45,36,91},{32,21,74},{17,5,57},{3,0,33},{0,0,0},{75,69,136},{65,59,119},{56,48,104},{46,37,87},{33,22,70},{18,6,53},{3,0,29},{0,0,0}, -{75,69,129},{65,59,113},{56,48,99},{46,37,83},{33,23,66},{18,6,49},{3,0,26},{0,0,0},{76,70,123},{65,59,107},{56,49,93},{45,37,78},{33,24,62},{18,7,45},{3,0,23},{0,0,0},{76,70,116},{66,59,101},{56,49,87},{45,37,73},{33,24,57},{18,7,42},{3,0,19},{0,0,0},{77,70,109},{66,60,95},{57,49,82},{46,38,68},{33,25,53},{19,8,38},{3,0,15},{0,0,0}, -{78,70,103},{67,60,90},{57,49,77},{46,38,63},{33,25,49},{19,9,34},{3,0,11},{0,0,0},{79,70,97},{68,61,85},{58,50,72},{46,39,58},{33,26,45},{19,10,30},{3,1,8},{0,0,0},{79,70,90},{69,61,79},{58,50,66},{46,39,53},{33,26,40},{19,10,25},{3,1,6},{0,0,0},{79,70,83},{70,60,73},{58,50,60},{46,39,48},{34,27,36},{20,10,21},{3,1,4},{0,0,0}, -{79,70,76},{70,60,66},{59,50,55},{46,39,43},{34,27,31},{20,10,16},{3,1,2},{0,0,0},{79,70,69},{70,61,60},{60,50,49},{47,40,38},{34,27,26},{20,11,10},{3,1,1},{0,0,0},{80,70,64},{70,61,54},{60,50,44},{47,40,34},{34,27,22},{20,11,7},{3,1,1},{0,0,0},{81,71,59},{71,61,49},{60,50,40},{47,40,30},{34,28,18},{20,12,4},{3,1,0},{0,0,0}, -{75,57,151},{66,48,134},{57,38,117},{46,24,99},{33,11,81},{19,2,62},{2,0,38},{0,0,0},{76,58,144},{67,49,127},{58,38,111},{47,25,94},{34,12,77},{19,2,58},{3,0,35},{0,0,0},{77,58,136},{68,49,120},{59,38,104},{47,25,89},{35,12,72},{19,2,55},{3,0,32},{0,0,0},{78,59,131},{68,49,114},{59,38,100},{47,27,85},{35,13,68},{20,3,51},{3,0,28},{0,0,0}, -{78,59,125},{68,49,109},{59,39,96},{47,27,81},{35,14,64},{20,3,48},{3,0,24},{0,0,0},{79,60,119},{69,50,104},{59,40,90},{47,28,75},{34,15,60},{19,3,44},{3,0,21},{0,0,0},{79,60,113},{69,50,99},{59,40,85},{47,28,71},{34,15,55},{19,3,40},{3,0,17},{0,0,0},{80,60,106},{69,51,93},{59,40,80},{47,29,66},{35,16,51},{20,4,36},{3,0,13},{0,0,0}, -{80,60,100},{69,51,88},{59,40,75},{47,29,62},{35,16,47},{20,4,32},{3,0,10},{0,0,0},{81,61,94},{70,52,82},{60,41,70},{47,30,57},{35,17,44},{20,5,29},{3,1,7},{0,0,0},{81,61,88},{71,52,77},{60,41,65},{47,30,52},{35,17,39},{20,5,24},{3,1,5},{0,0,0},{81,61,81},{71,52,71},{60,42,59},{48,31,47},{35,18,35},{21,5,19},{3,1,3},{0,0,0}, -{81,61,74},{71,52,64},{61,42,54},{48,31,42},{35,18,30},{21,5,14},{3,1,2},{0,0,0},{81,61,68},{72,52,58},{61,42,48},{48,32,37},{35,18,25},{20,6,9},{3,1,1},{0,0,0},{82,61,62},{72,52,53},{61,42,43},{48,32,33},{35,19,21},{20,6,6},{3,1,1},{0,0,0},{82,62,57},{73,52,48},{62,42,39},{48,32,29},{36,20,16},{20,7,4},{3,1,0},{0,0,0}, -{78,46,146},{70,37,129},{60,26,113},{48,12,96},{36,2,78},{20,0,60},{2,0,36},{0,0,0},{80,47,139},{71,38,123},{61,27,107},{49,13,91},{37,2,74},{20,0,56},{2,0,33},{0,0,0},{81,47,131},{72,38,116},{62,27,100},{50,14,86},{37,2,70},{20,0,53},{3,0,30},{0,0,0},{82,48,126},{72,39,110},{62,28,96},{50,16,82},{37,3,66},{21,0,49},{3,0,26},{0,0,0}, -{82,48,121},{72,39,105},{62,29,92},{50,17,78},{37,4,62},{21,0,46},{3,0,22},{0,0,0},{82,49,115},{72,40,101},{62,30,87},{49,18,72},{36,5,58},{20,0,42},{3,0,19},{0,0,0},{82,50,109},{72,41,96},{62,30,82},{49,18,68},{36,5,53},{20,0,38},{3,0,15},{0,0,0},{83,50,102},{72,41,91},{61,31,77},{49,19,64},{37,6,49},{21,0,34},{3,0,11},{0,0,0}, -{83,50,96},{72,41,85},{61,31,73},{49,20,60},{37,7,45},{21,0,30},{3,0,8},{0,0,0},{84,51,91},{73,42,79},{62,32,68},{50,21,55},{37,8,42},{21,1,27},{3,0,6},{0,0,0},{84,51,85},{73,42,74},{62,32,63},{50,21,50},{37,8,38},{21,1,23},{3,0,4},{0,0,0},{84,51,79},{73,43,68},{63,33,57},{50,22,45},{37,9,33},{22,1,17},{3,0,2},{0,0,0}, -{84,51,72},{73,43,62},{63,33,52},{50,22,40},{37,9,28},{22,1,12},{3,0,1},{0,0,0},{84,52,66},{74,42,56},{63,33,46},{50,23,36},{37,9,24},{21,1,8},{3,0,0},{0,0,0},{84,52,60},{74,42,51},{63,33,41},{50,23,31},{37,10,19},{21,1,5},{3,0,0},{0,0,0},{84,52,55},{75,43,46},{63,34,37},{50,24,27},{38,11,14},{21,2,3},{3,0,0},{0,0,0}, -{0,174,239},{0,154,211},{0,134,185},{0,114,158},{0,95,132},{0,74,105},{0,49,74},{0,3,35},{0,173,227},{0,153,200},{0,134,175},{0,114,150},{0,94,125},{0,74,99},{0,49,70},{0,4,31},{0,172,216},{0,153,190},{0,134,166},{0,114,142},{0,94,117},{0,74,93},{0,49,65},{0,4,28},{0,171,205},{0,152,180},{0,133,158},{0,113,135},{0,93,112},{0,73,89},{0,49,61},{0,4,24}, -{0,171,194},{0,151,171},{0,133,150},{0,113,128},{0,93,106},{0,73,84},{0,49,57},{0,4,21},{0,170,184},{0,150,162},{0,132,141},{0,112,121},{0,93,100},{0,73,78},{0,48,53},{0,3,17},{0,170,173},{0,150,153},{0,131,133},{0,112,113},{0,93,94},{0,73,73},{0,48,48},{0,3,12},{0,169,162},{0,150,144},{0,131,125},{0,112,106},{0,93,88},{0,73,68},{0,49,44},{0,3,7}, -{0,168,152},{0,149,134},{0,131,117},{0,112,100},{0,93,82},{0,73,63},{0,49,40},{0,3,4},{0,167,142},{0,148,125},{0,130,110},{0,111,93},{0,92,76},{0,73,59},{0,49,36},{0,3,1},{0,167,131},{0,148,116},{0,130,101},{0,111,86},{0,92,70},{0,73,53},{0,49,31},{0,3,0},{0,167,121},{0,148,106},{0,130,92},{0,111,78},{0,91,63},{0,72,47},{0,48,25},{0,3,0}, -{0,167,110},{0,148,96},{0,130,84},{0,111,70},{0,91,56},{0,72,41},{0,48,20},{0,3,0},{0,166,98},{0,147,87},{0,129,75},{0,110,63},{0,92,50},{0,72,35},{0,48,14},{0,3,0},{0,166,89},{0,147,79},{0,129,68},{0,110,57},{0,92,44},{0,72,30},{0,48,9},{0,3,0},{0,165,79},{0,147,72},{0,128,62},{0,110,52},{0,92,39},{0,73,25},{0,49,4},{0,3,0}, -{0,165,232},{0,146,204},{0,127,179},{0,108,153},{0,90,127},{0,69,101},{0,45,71},{0,1,32},{0,164,220},{0,145,194},{0,127,170},{0,108,146},{0,89,121},{0,70,96},{0,45,67},{0,2,28},{0,163,209},{0,145,185},{0,127,161},{0,108,138},{0,89,114},{0,70,90},{0,45,62},{0,2,25},{0,163,199},{0,145,175},{0,126,154},{0,107,131},{0,88,108},{0,69,86},{0,45,58},{0,2,21}, -{0,163,188},{0,144,166},{0,126,146},{0,107,124},{0,88,103},{0,69,81},{0,45,54},{0,2,18},{0,162,178},{0,143,157},{0,126,137},{0,107,117},{0,88,97},{0,69,75},{0,44,50},{0,1,14},{0,162,168},{0,143,148},{0,125,129},{0,107,110},{0,88,91},{0,69,70},{0,44,46},{0,1,9},{0,161,157},{0,143,140},{0,125,122},{0,106,103},{0,88,85},{0,69,65},{0,45,42},{0,1,4}, -{0,160,147},{0,142,131},{0,125,114},{0,106,97},{0,88,79},{0,69,61},{0,45,38},{0,1,2},{0,160,138},{0,141,122},{0,124,107},{0,105,90},{0,87,73},{0,69,56},{0,45,34},{0,1,0},{0,160,128},{0,141,113},{0,124,98},{0,105,83},{0,87,67},{0,69,50},{0,45,29},{0,1,0},{0,160,118},{0,141,103},{0,124,90},{0,106,76},{0,87,60},{0,68,44},{0,44,23},{0,1,0}, -{0,160,107},{0,141,94},{0,124,82},{0,106,68},{0,87,54},{0,68,39},{0,44,18},{0,1,0},{0,159,96},{0,140,84},{0,123,73},{0,105,61},{0,87,48},{0,68,33},{0,44,12},{0,1,0},{0,159,87},{0,140,77},{0,123,66},{0,105,55},{0,87,42},{0,68,28},{0,44,7},{0,1,0},{0,158,78},{0,140,70},{0,122,60},{0,105,50},{0,87,38},{0,68,23},{0,45,3},{0,1,0}, -{0,157,224},{0,138,197},{0,120,173},{0,102,148},{0,84,123},{0,64,98},{0,40,69},{0,0,30},{0,156,212},{0,137,188},{0,119,164},{0,102,141},{0,84,117},{0,65,93},{0,41,64},{0,0,26},{0,155,201},{0,137,179},{0,119,156},{0,102,133},{0,84,111},{0,65,88},{0,41,60},{0,0,23},{0,155,192},{0,137,170},{0,119,149},{0,101,126},{0,83,105},{0,65,84},{0,41,56},{0,0,19}, -{0,155,182},{0,137,161},{0,119,141},{0,101,120},{0,83,100},{0,65,79},{0,41,52},{0,0,15},{0,154,172},{0,136,152},{0,119,133},{0,101,114},{0,82,94},{0,65,73},{0,41,48},{0,0,11},{0,154,162},{0,135,144},{0,119,126},{0,101,107},{0,82,88},{0,65,68},{0,41,44},{0,0,7},{0,153,152},{0,135,135},{0,118,119},{0,100,100},{0,82,82},{0,64,63},{0,41,40},{0,0,2}, -{0,152,143},{0,135,127},{0,118,111},{0,100,94},{0,82,76},{0,64,59},{0,41,36},{0,0,0},{0,152,134},{0,134,119},{0,117,104},{0,99,87},{0,81,70},{0,64,54},{0,41,32},{0,0,0},{0,152,125},{0,134,110},{0,117,96},{0,99,80},{0,81,64},{0,64,48},{0,41,27},{0,0,0},{0,152,115},{0,133,101},{0,117,88},{0,100,74},{0,82,58},{0,64,42},{0,41,21},{0,0,0}, -{0,152,104},{0,133,92},{0,117,80},{0,100,66},{0,82,52},{0,64,37},{0,41,16},{0,0,0},{0,151,94},{0,133,82},{0,116,72},{0,99,59},{0,81,46},{0,64,31},{0,41,10},{0,0,0},{0,151,86},{0,133,75},{0,116,65},{0,99,53},{0,81,41},{0,64,26},{0,41,6},{0,0,0},{0,150,78},{0,133,68},{0,116,58},{0,99,48},{0,81,37},{0,64,21},{0,41,2},{0,0,0}, -{0,149,218},{0,131,192},{0,115,169},{0,97,144},{0,79,119},{0,60,94},{0,36,66},{0,0,27},{0,148,206},{0,130,183},{0,114,160},{0,97,137},{0,79,113},{0,61,89},{0,37,62},{0,0,23},{0,148,196},{0,130,174},{0,114,151},{0,97,129},{0,79,107},{0,61,84},{0,37,58},{0,0,19},{0,147,187},{0,130,166},{0,113,144},{0,96,122},{0,79,101},{0,61,80},{0,37,54},{0,0,15}, -{0,147,178},{0,130,157},{0,113,137},{0,96,116},{0,79,96},{0,61,76},{0,37,50},{0,0,11},{0,147,168},{0,129,148},{0,113,129},{0,96,110},{0,78,90},{0,61,71},{0,37,46},{0,0,7},{0,147,158},{0,129,140},{0,113,122},{0,96,104},{0,78,85},{0,61,66},{0,37,42},{0,0,4},{0,146,148},{0,129,131},{0,112,115},{0,96,97},{0,78,80},{0,60,61},{0,37,38},{0,0,1}, -{0,145,139},{0,129,123},{0,112,107},{0,96,91},{0,78,74},{0,60,57},{0,37,34},{0,0,0},{0,145,130},{0,128,115},{0,112,100},{0,95,84},{0,77,68},{0,60,52},{0,37,30},{0,0,0},{0,145,121},{0,128,107},{0,112,93},{0,95,78},{0,77,62},{0,60,46},{0,37,25},{0,0,0},{0,145,111},{0,127,99},{0,111,85},{0,95,72},{0,78,56},{0,60,41},{0,37,20},{0,0,0}, -{0,145,101},{0,127,90},{0,111,77},{0,95,64},{0,78,50},{0,60,36},{0,37,15},{0,0,0},{0,144,91},{0,127,80},{0,111,70},{0,94,57},{0,77,44},{0,60,30},{0,37,9},{0,0,0},{0,144,84},{0,127,73},{0,111,63},{0,94,51},{0,77,39},{0,60,25},{0,37,5},{0,0,0},{0,144,77},{0,127,66},{0,111,57},{0,94,47},{0,77,35},{0,60,20},{0,37,2},{0,0,0}, -{0,141,211},{0,124,187},{0,109,164},{0,92,139},{0,74,115},{0,56,91},{0,32,63},{0,0,24},{0,140,200},{0,123,178},{0,108,155},{0,92,132},{0,74,110},{0,56,86},{0,33,59},{0,0,20},{0,140,190},{0,123,169},{0,108,146},{0,92,124},{0,74,104},{0,56,81},{0,33,55},{0,0,16},{0,139,182},{0,123,161},{0,107,139},{0,91,118},{0,74,98},{0,57,77},{0,33,51},{0,0,12}, -{0,139,173},{0,123,153},{0,107,132},{0,91,113},{0,74,93},{0,57,73},{0,33,47},{0,0,7},{0,139,164},{0,122,144},{0,107,125},{0,91,107},{0,74,87},{0,57,68},{0,34,43},{0,0,4},{0,139,154},{0,122,136},{0,107,118},{0,91,101},{0,74,82},{0,57,63},{0,34,39},{0,0,2},{0,138,144},{0,122,127},{0,106,111},{0,91,94},{0,73,77},{0,56,58},{0,33,35},{0,0,1}, -{0,138,135},{0,122,119},{0,106,104},{0,91,88},{0,73,71},{0,56,54},{0,33,31},{0,0,0},{0,138,126},{0,121,112},{0,106,97},{0,90,81},{0,73,65},{0,56,49},{0,33,27},{0,0,0},{0,138,117},{0,121,104},{0,106,90},{0,90,75},{0,73,60},{0,56,44},{0,33,22},{0,0,0},{0,137,107},{0,121,96},{0,105,82},{0,90,69},{0,73,54},{0,56,39},{0,33,18},{0,0,0}, -{0,137,98},{0,121,87},{0,105,74},{0,90,62},{0,73,49},{0,56,34},{0,33,13},{0,0,0},{0,136,89},{0,120,78},{0,105,67},{0,89,55},{0,73,43},{0,56,28},{0,33,7},{0,0,0},{0,136,82},{0,120,71},{0,105,61},{0,89,50},{0,73,38},{0,56,23},{0,33,5},{0,0,0},{0,137,75},{0,120,64},{0,105,56},{0,89,45},{0,73,33},{0,56,19},{0,33,2},{0,0,0}, -{0,134,204},{0,117,181},{0,102,158},{0,86,134},{0,69,111},{0,52,89},{0,28,61},{0,0,21},{0,133,194},{0,116,172},{0,102,150},{0,86,128},{0,69,106},{0,52,84},{0,29,57},{0,0,17},{0,132,184},{0,116,163},{0,102,142},{0,86,120},{0,69,100},{0,52,79},{0,29,53},{0,0,13},{0,132,176},{0,116,155},{0,101,135},{0,85,114},{0,69,95},{0,52,75},{0,29,49},{0,0,9}, -{0,132,167},{0,116,147},{0,101,128},{0,85,109},{0,69,90},{0,52,70},{0,29,45},{0,0,5},{0,132,158},{0,115,140},{0,101,121},{0,85,103},{0,69,85},{0,52,66},{0,29,41},{0,0,2},{0,132,150},{0,115,132},{0,101,114},{0,85,98},{0,69,80},{0,52,61},{0,29,37},{0,0,1},{0,131,140},{0,115,123},{0,100,107},{0,85,91},{0,68,75},{0,52,56},{0,29,33},{0,0,0}, -{0,130,132},{0,115,115},{0,100,101},{0,85,85},{0,68,69},{0,52,52},{0,29,29},{0,0,0},{0,130,123},{0,114,108},{0,100,94},{0,84,79},{0,68,63},{0,52,47},{0,29,25},{0,0,0},{0,130,114},{0,114,101},{0,100,88},{0,84,73},{0,68,58},{0,52,42},{0,29,20},{0,0,0},{0,130,105},{0,114,93},{0,99,80},{0,84,67},{0,68,52},{0,51,37},{0,29,16},{0,0,0}, -{0,130,96},{0,114,85},{0,99,72},{0,84,60},{0,68,47},{0,51,32},{0,29,11},{0,0,0},{0,129,87},{0,113,76},{0,99,65},{0,84,53},{0,68,41},{0,51,26},{0,29,5},{0,0,0},{0,129,80},{0,113,69},{0,99,59},{0,84,48},{0,68,36},{0,51,21},{0,29,4},{0,0,0},{0,130,73},{0,113,62},{0,99,54},{0,84,43},{0,68,31},{0,52,17},{0,29,2},{0,0,0}, -{0,126,198},{0,109,175},{0,96,152},{0,80,129},{0,64,108},{0,47,86},{0,23,58},{0,0,18},{0,125,188},{0,109,166},{0,96,145},{0,80,123},{0,64,103},{0,47,81},{0,24,54},{0,0,14},{0,124,178},{0,109,158},{0,96,137},{0,80,117},{0,64,97},{0,47,76},{0,24,50},{0,0,10},{0,124,170},{0,109,150},{0,95,131},{0,80,111},{0,64,92},{0,47,72},{0,24,46},{0,0,6}, -{0,124,162},{0,109,142},{0,95,125},{0,80,106},{0,64,87},{0,47,67},{0,24,43},{0,0,2},{0,124,153},{0,109,135},{0,95,118},{0,80,100},{0,64,82},{0,47,63},{0,24,39},{0,0,1},{0,124,145},{0,109,127},{0,95,111},{0,80,95},{0,64,77},{0,47,58},{0,24,35},{0,0,0},{0,123,137},{0,108,119},{0,94,104},{0,79,88},{0,63,72},{0,47,54},{0,24,31},{0,0,0}, -{0,122,129},{0,108,112},{0,94,98},{0,79,82},{0,63,66},{0,47,49},{0,24,27},{0,0,0},{0,122,120},{0,108,105},{0,94,91},{0,79,76},{0,63,61},{0,47,44},{0,24,23},{0,0,0},{0,122,111},{0,108,98},{0,94,85},{0,79,70},{0,63,56},{0,47,40},{0,24,18},{0,0,0},{0,122,102},{0,107,90},{0,93,78},{0,79,64},{0,63,50},{0,46,34},{0,24,13},{0,0,0}, -{0,122,94},{0,107,82},{0,93,70},{0,79,58},{0,63,45},{0,46,29},{0,24,8},{0,0,0},{0,121,85},{0,107,74},{0,93,63},{0,79,51},{0,63,39},{0,46,24},{0,24,4},{0,0,0},{0,121,78},{0,107,67},{0,93,57},{0,79,46},{0,63,34},{0,46,19},{0,24,3},{0,0,0},{0,122,71},{0,107,61},{0,93,52},{0,79,41},{0,63,29},{0,47,15},{0,24,2},{0,0,0}, -{0,118,191},{0,102,168},{0,89,147},{0,75,125},{0,59,105},{0,42,83},{0,18,56},{0,0,15},{0,117,181},{0,102,161},{0,89,140},{0,75,119},{0,59,99},{0,42,78},{0,18,52},{0,0,11},{0,117,172},{0,102,153},{0,89,133},{0,75,113},{0,59,93},{0,42,73},{0,18,48},{0,0,6},{0,117,165},{0,102,145},{0,89,127},{0,75,108},{0,59,89},{0,42,69},{0,18,44},{0,0,3}, -{0,117,157},{0,102,137},{0,89,121},{0,75,103},{0,59,84},{0,42,65},{0,18,41},{0,0,1},{0,116,148},{0,102,130},{0,89,115},{0,75,97},{0,59,79},{0,42,60},{0,18,37},{0,0,0},{0,116,140},{0,102,123},{0,89,108},{0,75,92},{0,59,74},{0,42,55},{0,18,33},{0,0,0},{0,116,133},{0,102,116},{0,88,101},{0,74,86},{0,58,69},{0,42,51},{0,19,30},{0,0,0}, -{0,115,125},{0,102,109},{0,88,95},{0,74,80},{0,58,64},{0,42,47},{0,19,26},{0,0,0},{0,115,116},{0,101,102},{0,88,88},{0,74,74},{0,58,60},{0,42,43},{0,19,22},{0,0,0},{0,115,108},{0,101,95},{0,88,82},{0,74,68},{0,58,54},{0,42,39},{0,19,17},{0,0,0},{0,115,99},{0,101,87},{0,88,76},{0,74,62},{0,58,48},{0,42,33},{0,18,11},{0,0,0}, -{0,115,91},{0,101,79},{0,88,68},{0,74,56},{0,58,43},{0,42,28},{0,18,7},{0,0,0},{0,114,83},{0,101,72},{0,88,61},{0,74,50},{0,58,38},{0,42,23},{0,19,3},{0,0,0},{0,114,76},{0,101,66},{0,88,55},{0,74,45},{0,58,32},{0,42,17},{0,19,2},{0,0,0},{0,115,70},{0,101,60},{0,87,50},{0,73,40},{0,58,27},{0,42,12},{0,19,1},{0,0,0}, -{0,110,185},{0,96,163},{0,83,142},{0,69,121},{0,53,101},{0,36,80},{0,13,54},{0,0,12},{0,109,175},{0,96,156},{0,83,136},{0,69,115},{0,53,95},{0,37,75},{0,13,50},{0,0,8},{0,109,166},{0,96,148},{0,83,129},{0,69,109},{0,53,90},{0,37,71},{0,13,46},{0,0,3},{0,109,159},{0,96,141},{0,83,123},{0,69,104},{0,54,86},{0,38,67},{0,13,42},{0,0,1}, -{0,109,152},{0,96,133},{0,83,117},{0,69,99},{0,54,81},{0,38,63},{0,13,39},{0,0,0},{0,109,144},{0,96,126},{0,83,111},{0,69,93},{0,54,76},{0,38,58},{0,13,35},{0,0,0},{0,109,136},{0,96,119},{0,83,104},{0,69,88},{0,54,71},{0,38,53},{0,13,31},{0,0,0},{0,109,129},{0,96,112},{0,82,97},{0,68,83},{0,54,66},{0,38,49},{0,14,28},{0,0,0}, -{0,109,121},{0,96,106},{0,82,91},{0,68,77},{0,54,62},{0,38,45},{0,14,24},{0,0,0},{0,108,112},{0,95,99},{0,82,86},{0,68,72},{0,54,58},{0,38,41},{0,14,20},{0,0,0},{0,108,105},{0,95,92},{0,82,80},{0,68,66},{0,54,52},{0,38,37},{0,14,15},{0,0,0},{0,108,97},{0,95,85},{0,82,74},{0,68,60},{0,54,46},{0,38,31},{0,13,9},{0,0,0}, -{0,108,89},{0,95,77},{0,82,66},{0,68,54},{0,54,41},{0,38,26},{0,13,6},{0,0,0},{0,108,81},{0,95,70},{0,82,59},{0,68,48},{0,54,36},{0,38,21},{0,14,2},{0,0,0},{0,108,74},{1,95,64},{0,82,53},{0,68,43},{0,54,30},{0,38,15},{0,14,2},{0,0,0},{0,108,68},{2,95,58},{0,81,48},{0,68,38},{0,54,25},{0,38,10},{0,14,1},{0,0,0}, -{0,102,179},{0,89,158},{0,76,138},{0,63,117},{0,47,97},{0,31,77},{0,9,51},{0,0,9},{0,102,170},{0,89,151},{0,76,132},{0,63,112},{0,48,92},{0,32,72},{0,9,47},{0,0,5},{0,102,161},{0,89,143},{0,76,125},{0,63,106},{0,48,87},{0,32,68},{0,9,44},{0,0,1},{0,102,154},{0,89,137},{0,77,119},{0,63,101},{0,49,83},{0,33,64},{0,9,40},{0,0,0}, -{0,102,147},{0,89,129},{0,77,113},{0,63,96},{0,49,78},{0,33,60},{0,9,37},{0,0,0},{0,102,140},{0,89,122},{0,76,107},{0,63,90},{0,49,74},{0,33,56},{0,10,33},{0,0,0},{0,102,132},{0,89,116},{0,76,101},{0,63,85},{0,49,69},{0,33,52},{0,10,30},{0,0,0},{0,102,125},{0,89,109},{0,77,94},{0,63,80},{0,49,64},{0,33,47},{0,10,26},{0,0,0}, -{0,102,117},{0,89,103},{0,77,88},{0,63,74},{0,49,59},{0,33,43},{0,10,22},{0,0,0},{0,101,109},{0,88,96},{0,76,83},{0,63,69},{0,49,55},{0,34,39},{0,10,18},{0,0,0},{0,101,102},{0,88,90},{0,76,77},{0,63,64},{0,49,50},{0,34,35},{0,10,13},{0,0,0},{0,101,96},{0,88,83},{0,76,71},{0,63,58},{0,49,44},{0,34,30},{0,10,8},{0,0,0}, -{0,101,88},{0,88,76},{0,76,65},{0,63,53},{0,49,39},{0,34,25},{0,10,5},{0,0,0},{0,101,79},{0,88,69},{0,76,58},{0,62,47},{0,49,34},{0,34,20},{0,10,2},{0,0,0},{0,101,72},{2,88,62},{0,76,52},{0,62,42},{0,49,29},{0,34,14},{0,10,1},{0,0,0},{1,101,66},{5,88,56},{0,76,47},{0,63,37},{0,49,24},{0,34,9},{0,10,0},{0,0,0}, -{0,94,173},{0,82,153},{0,70,134},{0,57,114},{0,41,94},{0,25,74},{0,6,48},{0,0,6},{0,94,165},{0,82,146},{0,70,127},{0,57,109},{0,42,89},{0,26,69},{0,6,45},{0,0,3},{0,94,156},{0,82,138},{0,70,120},{0,57,103},{0,42,84},{0,26,66},{0,6,42},{0,0,0},{0,94,149},{0,82,132},{0,70,115},{0,57,98},{0,43,80},{0,27,62},{0,6,38},{0,0,0}, -{1,94,142},{0,82,125},{0,70,110},{0,57,93},{0,43,75},{0,27,58},{0,6,34},{0,0,0},{3,94,135},{2,82,119},{0,70,104},{0,57,87},{0,43,71},{0,27,54},{0,7,31},{0,0,0},{5,94,128},{4,82,113},{1,70,98},{0,57,82},{0,43,66},{0,27,49},{0,7,28},{0,0,0},{5,94,121},{4,82,106},{1,71,91},{0,57,77},{0,43,62},{0,28,45},{0,7,24},{0,0,0}, -{6,94,114},{4,82,100},{2,71,86},{0,57,72},{0,43,57},{0,28,41},{0,7,19},{0,0,0},{7,93,106},{5,82,93},{3,70,80},{0,57,67},{0,44,53},{0,29,37},{0,7,15},{0,0,0},{8,93,99},{6,82,87},{4,70,74},{1,57,62},{0,44,48},{0,29,33},{0,7,11},{0,0,0},{9,93,93},{7,82,80},{4,70,68},{1,57,56},{0,44,42},{0,29,28},{0,7,7},{0,0,0}, -{9,93,85},{8,82,73},{5,70,62},{2,57,51},{0,44,37},{0,29,23},{0,7,4},{0,0,0},{10,93,77},{9,82,67},{6,70,56},{2,57,45},{0,44,32},{0,29,17},{0,7,2},{0,0,0},{10,93,70},{11,82,60},{6,70,51},{2,57,40},{0,44,27},{0,29,12},{0,7,1},{0,0,0},{11,93,64},{13,82,54},{6,70,46},{3,57,35},{0,44,23},{0,29,7},{0,7,0},{0,0,0}, -{0,86,167},{0,75,148},{0,63,130},{0,50,111},{0,35,91},{0,18,71},{0,2,46},{0,0,4},{0,86,159},{0,75,141},{0,63,123},{0,50,105},{0,36,86},{0,20,67},{0,3,43},{0,0,1},{0,86,151},{0,75,133},{0,63,116},{0,50,99},{0,36,81},{0,20,64},{0,3,40},{0,0,0},{0,86,144},{0,75,127},{1,63,111},{0,51,94},{0,37,77},{0,21,60},{0,4,36},{0,0,0}, -{2,86,137},{1,75,121},{1,63,106},{0,51,89},{0,37,73},{0,21,56},{0,4,32},{0,0,0},{8,86,131},{6,75,115},{1,64,100},{0,51,84},{0,37,69},{0,21,52},{0,4,29},{0,0,0},{12,86,124},{10,75,109},{2,64,94},{0,51,79},{0,37,64},{0,21,47},{0,4,26},{0,0,0},{13,86,117},{10,75,103},{3,64,89},{0,51,75},{0,37,60},{0,22,43},{0,4,22},{0,0,0}, -{16,86,111},{11,75,97},{5,64,84},{0,51,70},{0,37,55},{0,22,39},{0,4,17},{0,0,0},{19,86,104},{14,75,90},{8,64,78},{1,51,65},{0,38,51},{0,23,35},{0,4,12},{0,0,0},{22,86,97},{16,75,84},{10,64,72},{2,51,60},{0,38,46},{0,23,31},{0,4,9},{0,0,0},{23,86,90},{19,75,78},{11,64,66},{3,51,54},{0,38,41},{0,24,26},{0,5,6},{0,0,0}, -{24,86,83},{22,75,71},{14,64,60},{4,51,49},{0,38,36},{0,24,21},{0,5,3},{0,0,0},{26,86,75},{23,75,65},{16,64,54},{6,51,43},{0,38,30},{0,23,15},{0,4,1},{0,0,0},{27,86,69},{24,75,58},{16,64,49},{6,51,38},{0,38,25},{0,23,10},{0,4,1},{0,0,0},{28,86,63},{24,75,53},{16,64,44},{7,51,34},{0,38,21},{0,23,5},{0,4,0},{0,0,0}, -{12,77,162},{8,67,143},{7,55,126},{3,42,107},{0,27,88},{0,11,68},{0,1,43},{0,0,2},{13,77,154},{10,67,136},{8,55,119},{4,43,102},{1,28,83},{0,12,64},{0,1,40},{0,0,1},{14,77,146},{12,67,128},{8,55,113},{5,43,96},{1,29,78},{0,13,61},{0,1,37},{0,0,0},{14,78,140},{12,67,123},{10,55,108},{5,43,91},{2,30,74},{0,13,57},{0,2,33},{0,0,0}, -{15,78,133},{13,67,117},{10,55,103},{6,43,86},{2,30,70},{0,14,53},{0,2,29},{0,0,0},{20,78,127},{17,67,111},{11,56,97},{6,44,81},{2,31,66},{0,15,49},{0,2,26},{0,0,0},{24,78,121},{20,67,106},{11,56,91},{6,44,76},{2,31,61},{0,15,44},{0,2,23},{0,0,0},{25,78,114},{21,67,100},{12,56,86},{6,45,72},{2,31,57},{0,16,40},{0,2,19},{0,0,0}, -{27,78,108},{22,67,94},{14,56,81},{6,45,68},{2,31,53},{0,16,36},{0,2,14},{0,0,0},{30,78,101},{24,67,87},{16,56,75},{7,45,63},{2,32,48},{0,17,32},{0,2,10},{0,0,0},{32,78,94},{26,67,81},{17,56,69},{8,45,57},{2,32,43},{0,17,28},{0,2,7},{0,0,0},{33,78,87},{28,67,75},{19,56,63},{10,45,51},{2,32,39},{0,17,24},{0,3,5},{0,0,0}, -{34,78,80},{30,67,69},{21,56,57},{10,45,46},{2,32,34},{0,17,19},{0,3,3},{0,0,0},{36,78,73},{31,67,62},{23,56,52},{12,45,41},{2,33,29},{0,17,13},{0,2,1},{0,0,0},{37,78,67},{32,67,57},{23,56,47},{12,45,37},{2,33,24},{0,17,9},{0,2,1},{0,0,0},{38,78,61},{32,67,52},{24,56,43},{12,45,33},{2,33,20},{0,17,5},{0,2,0},{0,0,0}, -{28,68,156},{19,58,138},{17,47,122},{7,35,103},{0,20,84},{0,5,65},{0,0,40},{0,0,0},{31,68,149},{23,58,131},{19,48,115},{9,36,98},{2,21,80},{0,5,61},{0,0,36},{0,0,0},{33,68,142},{27,58,124},{20,48,109},{11,36,92},{3,22,75},{0,5,57},{0,0,33},{0,0,0},{33,69,136},{28,59,119},{22,48,104},{12,36,88},{4,23,71},{0,6,53},{0,0,29},{0,0,0}, -{33,69,129},{28,59,113},{22,48,99},{13,36,83},{4,23,67},{0,7,50},{0,0,26},{0,0,0},{34,70,123},{29,59,107},{23,49,93},{14,37,78},{4,24,62},{0,8,46},{0,0,23},{0,0,0},{36,70,117},{32,59,102},{23,49,88},{15,37,73},{4,24,58},{0,8,42},{0,0,19},{0,0,0},{37,70,110},{33,59,96},{24,49,83},{14,38,69},{4,25,54},{0,9,38},{0,1,15},{0,0,0}, -{39,70,104},{34,59,90},{24,49,78},{14,38,65},{4,25,50},{0,9,34},{0,1,11},{0,0,0},{41,70,97},{34,59,85},{25,49,73},{14,38,60},{4,26,46},{0,10,30},{0,1,8},{0,0,0},{41,70,91},{35,59,79},{26,49,67},{15,38,55},{4,26,41},{0,10,26},{0,1,6},{0,0,0},{42,70,85},{36,60,73},{28,49,61},{17,38,49},{5,26,37},{0,10,22},{0,1,4},{0,0,0}, -{43,70,78},{36,60,67},{28,49,55},{17,38,44},{5,26,32},{0,10,17},{0,1,2},{0,0,0},{44,70,71},{37,60,60},{29,49,50},{18,39,40},{5,27,27},{0,11,11},{0,1,1},{0,0,0},{45,70,65},{38,60,55},{29,49,45},{18,39,35},{5,27,23},{0,11,8},{0,1,1},{0,0,0},{46,70,59},{39,60,50},{30,49,41},{18,39,31},{6,28,19},{0,11,5},{0,1,0},{0,0,0}, -{37,58,151},{30,49,133},{25,38,118},{14,25,100},{5,12,82},{0,2,63},{0,0,38},{0,0,0},{40,58,144},{33,49,127},{27,39,112},{17,26,95},{6,12,78},{1,2,59},{0,0,35},{0,0,0},{41,58,137},{36,49,120},{27,39,106},{18,26,89},{7,13,73},{1,2,56},{0,0,32},{0,0,0},{41,59,131},{36,50,115},{29,39,101},{19,27,85},{8,14,69},{1,3,52},{0,0,28},{0,0,0}, -{41,60,125},{36,50,110},{29,39,96},{20,27,80},{8,14,65},{1,3,48},{0,0,25},{0,0,0},{42,61,119},{37,50,104},{30,40,90},{20,28,76},{8,15,60},{1,4,44},{0,0,21},{0,0,0},{44,61,113},{38,50,99},{30,40,85},{20,29,71},{8,15,56},{1,4,40},{0,0,17},{0,0,0},{45,61,107},{38,51,93},{30,41,81},{20,30,67},{9,16,52},{1,4,36},{0,1,13},{0,0,0}, -{46,61,101},{39,51,88},{30,41,76},{20,30,63},{9,16,48},{1,4,32},{0,1,10},{0,0,0},{47,61,95},{40,51,83},{31,41,71},{20,30,58},{9,17,44},{1,5,29},{0,1,7},{0,0,0},{47,61,89},{41,51,77},{31,41,66},{21,30,53},{9,17,40},{1,5,25},{0,1,5},{0,0,0},{47,62,83},{41,52,71},{33,41,60},{23,30,48},{10,18,36},{1,5,20},{0,1,3},{0,0,0}, -{48,62,76},{41,52,65},{33,41,54},{23,30,43},{10,18,31},{1,5,15},{0,1,2},{0,0,0},{49,62,69},{42,52,59},{34,41,48},{23,31,38},{9,19,26},{1,6,10},{0,1,1},{0,0,0},{49,62,64},{42,52,54},{34,41,44},{23,31,34},{10,19,21},{1,6,7},{0,1,1},{0,0,0},{50,62,58},{43,52,49},{35,41,40},{23,31,30},{11,20,17},{2,6,4},{0,1,0},{0,0,0}, -{46,48,146},{41,39,129},{33,29,114},{23,15,97},{10,3,79},{1,0,60},{0,0,36},{0,0,0},{47,48,139},{42,39,123},{34,29,108},{24,16,92},{11,3,75},{2,0,57},{0,0,33},{0,0,0},{48,48,132},{43,39,116},{34,29,102},{25,16,86},{12,3,70},{2,0,54},{0,0,30},{0,0,0},{48,49,127},{43,40,111},{35,30,97},{26,17,82},{13,4,66},{2,0,50},{0,0,26},{0,0,0}, -{48,50,121},{43,40,106},{35,30,92},{26,18,77},{13,5,62},{2,0,46},{0,0,23},{0,0,0},{49,51,115},{44,41,100},{35,31,87},{25,19,73},{13,5,58},{2,0,42},{0,0,19},{0,0,0},{50,51,109},{44,41,95},{35,31,82},{25,20,69},{13,5,54},{2,0,38},{0,0,15},{0,0,0},{51,52,103},{43,42,90},{35,32,78},{25,21,65},{14,6,50},{3,0,34},{0,0,11},{0,0,0}, -{52,52,97},{44,42,85},{35,32,74},{25,21,61},{14,7,46},{3,0,30},{0,0,8},{0,0,0},{52,52,92},{45,43,80},{36,33,69},{26,22,56},{14,8,42},{3,1,27},{0,0,6},{0,0,0},{52,52,86},{46,43,74},{36,33,64},{27,22,51},{14,8,38},{3,1,23},{0,0,4},{0,0,0},{52,53,80},{45,43,68},{37,34,58},{28,23,46},{15,9,34},{3,1,18},{0,0,2},{0,0,0}, -{52,53,73},{45,43,63},{37,34,52},{28,23,41},{15,9,29},{3,1,13},{0,0,1},{0,0,0},{53,53,67},{46,43,57},{38,33,46},{28,23,36},{14,10,24},{3,1,8},{0,0,0},{0,0,0},{53,53,62},{46,43,52},{38,33,42},{28,23,32},{15,10,19},{3,1,5},{0,0,0},{0,0,0},{54,53,57},{47,44,48},{39,34,38},{28,24,28},{16,11,15},{4,2,3},{0,0,0},{0,0,0}}; -// START - -#define PC (16*16*8) -#define PM ( 16*8) -#define PY ( 8) -#define PK ( 1) -#define RC (7) -#define RM (15) -#define RY (15) -#define RK (7) - -static inline double clip01(double x) { - return (x < 0) ? 0 : ((x > 1) ? 1 : x); -} - -void old_getRGB(GfxColor *color, GfxRGB *rgb) -{ - double c, m, y, aw, ac, am, ay, ar, ag, ab; - - c = clip01(color->c[0] + color->c[3]); - m = clip01(color->c[1] + color->c[3]); - y = clip01(color->c[2] + color->c[3]); - aw = (1-c) * (1-m) * (1-y); - ac = c * (1-m) * (1-y); - am = (1-c) * m * (1-y); - ay = (1-c) * (1-m) * y; - ar = (1-c) * m * y; - ag = c * (1-m) * y; - ab = c * m * (1-y); - rgb->r = clip01(aw + 0.9137*am + 0.9961*ay + 0.9882*ar); - rgb->g = clip01(aw + 0.6196*ac + ay + 0.5176*ag); - rgb->b = clip01(aw + 0.7804*ac + 0.5412*am + 0.0667*ar + 0.2118*ag + 0.4863*ab); -} - -int check(float c, float m, float y, float k, float r, float g, float b) -{ - GfxRGB rgb2; - memset(&rgb2,0,sizeof(GfxRGB)); - GfxColor col; - col.c[0] = c; - col.c[1] = m; - col.c[2] = y; - col.c[3] = k; - old_getRGB(&col, &rgb2); - - double dr = r - rgb2.r; - double dg = g - rgb2.g; - double db = b - rgb2.b; - if(sqrt(dr*dr+dg*dg+db*db) > 0.5) { - printf("%f %f %f %f -> %02x%02x%02x / %02x%02x%02x\n", - c,m,y,k, - (int)(r*255),(int)(g*255),(int)(b*255), - (int)(rgb2.r*255), (int)(rgb2.g*255), (int)(rgb2.b*255)); - return 0; - } - return 1; -} -void convert_cmyk2rgb(float c,float m,float y,float k, unsigned char*r, unsigned char*g, unsigned char*b) -{ - c = c<0?0:(c>1?1:c<=1?c:0.5); - m = m<0?0:(m>1?1:m<=1?m:0.5); - y = y<0?0:(y>1?1:y<=1?y:0.5); - k = k<0?0:(k>1?1:k<=1?k:0.5); - - int cc = (int)(c*7.0); - int mm = (int)(m*15.0); - int yy = (int)(y*15.0); - int kk = (int)(k*7.0); - - float rc = c*7.0 - cc; - float rm = m*15.0 - mm; - float ry = y*15.0 - yy; - float rk = k*7.0 - kk; - - int pp = cc*PC + mm*PM + yy*PY + kk*PK; - int pc = cc>=RC?pp:pp + PC; - int pm = mm>=RM?pp:pp + PM; - int py = yy>=RY?pp:pp + PY; - int pk = kk>=RK?pp:pp + PK; - - int rr = (int)((int)cmyk2rgb[pp].r - + ((int)cmyk2rgb[pc].r - (int)cmyk2rgb[pp].r)*rc - + ((int)cmyk2rgb[pm].r - (int)cmyk2rgb[pp].r)*rm - + ((int)cmyk2rgb[py].r - (int)cmyk2rgb[pp].r)*ry - + ((int)cmyk2rgb[pk].r - (int)cmyk2rgb[pp].r)*rk); - int gg = (int)((int)cmyk2rgb[pp].g - + ((int)cmyk2rgb[pc].g - (int)cmyk2rgb[pp].g)*rc - + ((int)cmyk2rgb[pm].g - (int)cmyk2rgb[pp].g)*rm - + ((int)cmyk2rgb[py].g - (int)cmyk2rgb[pp].g)*ry - + ((int)cmyk2rgb[pk].g - (int)cmyk2rgb[pp].g)*rk); - int bb = (int)((int)cmyk2rgb[pp].b - + ((int)cmyk2rgb[pc].b - (int)cmyk2rgb[pp].b)*rc - + ((int)cmyk2rgb[pm].b - (int)cmyk2rgb[pp].b)*rm - + ((int)cmyk2rgb[py].b - (int)cmyk2rgb[pp].b)*ry - + ((int)cmyk2rgb[pk].b - (int)cmyk2rgb[pp].b)*rk); - *r = rr<0?0:(rr>255?255:rr); - *g = gg<0?0:(gg>255?255:gg); - *b = bb<0?0:(bb>255?255:bb); - - int t; - float r2=0,g2=0,b2=0; - for(t=0;t<16;t++) { - int p2 = pp; - if(t&1) p2+=(pc-pp); - if(t&2) p2+=(pm-pp); - if(t&4) p2+=(py-pp); - if(t&8) p2+=(pk-pp); - float rrc = t&1?rc:1-rc; - float rrm = t&2?rm:1-rm; - float rry = t&4?ry:1-ry; - float rrk = t&8?rk:1-rk; - float f = rrc*rrm*rry*rrk; - r2 += cmyk2rgb[p2].r*f; - g2 += cmyk2rgb[p2].g*f; - b2 += cmyk2rgb[p2].b*f; - } - - if(r2<0)r2=0; if(r2>255)r2=255; - if(g2<0)g2=0; if(g2>255)g2=255; - if(b2<0)b2=0; if(b2>255)b2=255; - - *r = (unsigned char)r2; - *g = (unsigned char)g2; - *b = (unsigned char)b2; - - /*f(!check(c,m,y,k, *r/255.0, *g/255.0, *b/255.0)) { - for(t=0;t<16;t++) { - int p2 = pp; - if(t&1) p2+=(pc-pp); - if(t&2) p2+=(pm-pp); - if(t&4) p2+=(py-pp); - if(t&8) p2+=(pk-pp); - float rrc = t&1?rc:1-rc; - float rrm = t&2?rm:1-rm; - float rry = t&4?ry:1-ry; - float rrk = t&8?rk:1-rk; - float f = rrc*rrm*rry*rrk; - //printf("%d%d%d%d %f %02x%02x%02x\n", !!(t&8),!!(t&4),!!(t&2),!!(t&1), f, cmyk2rgb[p2].r, cmyk2rgb[p2].g, cmyk2rgb[p2].b); - } - }*/ -} - -// END diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.h deleted file mode 100644 index 1efb467dc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/cmyk.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef __cmyk_h__ -#define __cmyk_h__ -void convert_cmyk2rgb(float c,float m,float y,float k, unsigned char*r, unsigned char*g, unsigned char*b); -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.c b/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.c deleted file mode 100644 index eeb83c659..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.c +++ /dev/null @@ -1,26585 +0,0 @@ -#include "fonts.h" - -int d050000l_afm_len = 9381; -char* d050000l_afm = -"StartFontMetrics 3.0\nComment Copyright URW Software, Copyright 1997 by URW\nCom" -"ment Creation Date: 10/19/1999\nComment See the file COPYING (GNU General Public" -" License) for license conditions.\nFontName Dingbats\nFullName Dingbats \nFamily" -"Name Dingbats\nWeight Regular\nItalicAngle 0.0\nIsFixedPitch false\nUnderlinePos" -"ition -72\nUnderlineThickness 36\nVersion 001.005\nNotice URW Software, Copyrigh" -"t 1997 by URW\nEncodingScheme FontSpecific\nFontBBox -1 -143 981 819\nCapHeight " -"691\nXHeight 567\nDescender -143\nAscender 691\nStartCharMetrics 203\nC 32 ; WX " -"278 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 974 ; N a1 ; B 35 71 939 617 ;\nC 34 ; WX" -" 961 ; N a2 ; B 35 81 927 611 ;\nC 35 ; WX 974 ; N a202 ; B 35 69 939 615 ;\nC 3" -"6 ; WX 980 ; N a3 ; B 35 0 945 691 ;\nC 37 ; WX 719 ; N a4 ; B 34 138 685 566 ;\n" -"C 38 ; WX 789 ; N a5 ; B 35 -13 755 707 ;\nC 39 ; WX 790 ; N a119 ; B 35 -14 755" -" 706 ;\nC 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;\nC 41 ; WX 690 ; N a117 ; B " -"35 137 655 556 ;\nC 42 ; WX 960 ; N a11 ; B 35 122 925 568 ;\nC 43 ; WX 939 ; N " -"a12 ; B 35 133 904 559 ;\nC 44 ; WX 549 ; N a13 ; B 29 -10 516 706 ;\nC 45 ; WX " -"855 ; N a14 ; B 33 59 820 632 ;\nC 46 ; WX 911 ; N a15 ; B 35 51 876 641 ;\nC 47" -" ; WX 933 ; N a16 ; B 35 141 899 550 ;\nC 48 ; WX 911 ; N a105 ; B 35 49 876 636" -" ;\nC 49 ; WX 945 ; N a17 ; B 35 139 909 550 ;\nC 50 ; WX 974 ; N a18 ; B 35 103" -" 938 588 ;\nC 51 ; WX 755 ; N a19 ; B 34 -14 721 706 ;\nC 52 ; WX 846 ; N a20 ; " -"B 36 -14 811 706 ;\nC 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;\nC 54 ; WX 761 ; N " -"a22 ; B 35 0 727 692 ;\nC 55 ; WX 571 ; N a23 ; B -1 -69 572 660 ;\nC 56 ; WX 67" -"7 ; N a24 ; B 36 -14 642 705 ;\nC 57 ; WX 763 ; N a25 ; B 35 0 728 694 ;\nC 58 ;" -" WX 760 ; N a26 ; B 35 0 726 691 ;\nC 59 ; WX 759 ; N a27 ; B 35 0 725 690 ;\nC " -"60 ; WX 754 ; N a28 ; B 35 0 720 685 ;\nC 61 ; WX 494 ; N a6 ; B 35 0 460 691 ;\n" -"C 62 ; WX 552 ; N a7 ; B 35 0 517 691 ;\nC 63 ; WX 537 ; N a8 ; B 35 0 503 691 ;" -"\nC 64 ; WX 577 ; N a9 ; B 35 96 542 595 ;\nC 65 ; WX 692 ; N a10 ; B 35 -14 657" -" 702 ;\nC 66 ; WX 786 ; N a29 ; B 35 -13 751 705 ;\nC 67 ; WX 788 ; N a30 ; B 35" -" -14 752 703 ;\nC 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;\nC 69 ; WX 790 ; N a3" -"2 ; B 35 -14 756 707 ;\nC 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;\nC 71 ; WX 79" -"4 ; N a34 ; B 35 -14 759 705 ;\nC 72 ; WX 816 ; N a35 ; B 35 -13 782 707 ;\nC 73" -" ; WX 823 ; N a36 ; B 35 2 787 719 ;\nC 74 ; WX 789 ; N a37 ; B 35 -13 754 706 ;" -"\nC 75 ; WX 841 ; N a38 ; B 35 -14 807 706 ;\nC 76 ; WX 823 ; N a39 ; B 35 -12 7" -"89 706 ;\nC 77 ; WX 833 ; N a40 ; B 35 -14 798 706 ;\nC 78 ; WX 816 ; N a41 ; B " -"35 -13 782 705 ;\nC 79 ; WX 831 ; N a42 ; B 35 -13 796 707 ;\nC 80 ; WX 923 ; N " -"a43 ; B 35 -13 888 706 ;\nC 81 ; WX 744 ; N a44 ; B 35 0 710 691 ;\nC 82 ; WX 72" -"3 ; N a45 ; B 35 0 688 691 ;\nC 83 ; WX 749 ; N a46 ; B 35 0 714 691 ;\nC 84 ; W" -"X 790 ; N a47 ; B 34 -15 756 706 ;\nC 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;\n" -"C 86 ; WX 695 ; N a49 ; B 35 -16 661 706 ;\nC 87 ; WX 776 ; N a50 ; B 35 -7 741 " -"698 ;\nC 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;\nC 89 ; WX 792 ; N a52 ; B 35 -" -"1 757 720 ;\nC 90 ; WX 759 ; N a53 ; B 35 0 725 693 ;\nC 91 ; WX 707 ; N a54 ; B" -" 35 -11 672 704 ;\nC 92 ; WX 708 ; N a55 ; B 35 -14 672 704 ;\nC 93 ; WX 682 ; N" -" a56 ; B 35 -3 647 694 ;\nC 94 ; WX 701 ; N a57 ; B 35 -13 666 708 ;\nC 95 ; WX " -"826 ; N a58 ; B 35 -18 791 716 ;\nC 96 ; WX 815 ; N a59 ; B 35 -16 780 705 ;\nC " -"97 ; WX 789 ; N a60 ; B 35 -14 754 704 ;\nC 98 ; WX 789 ; N a61 ; B 35 -14 754 7" -"04 ;\nC 99 ; WX 707 ; N a62 ; B 33 0 674 717 ;\nC 100 ; WX 687 ; N a63 ; B 36 0 " -"651 688 ;\nC 101 ; WX 696 ; N a64 ; B 35 0 661 693 ;\nC 102 ; WX 689 ; N a65 ; B" -" 35 0 655 681 ;\nC 103 ; WX 786 ; N a66 ; B 34 -14 751 703 ;\nC 104 ; WX 787 ; N" -" a67 ; B 35 -15 752 704 ;\nC 105 ; WX 713 ; N a68 ; B 35 -13 678 709 ;\nC 106 ; " -"WX 791 ; N a69 ; B 35 -14 756 707 ;\nC 107 ; WX 785 ; N a70 ; B 36 -14 751 701 ;" -"\nC 108 ; WX 791 ; N a71 ; B 35 -14 757 708 ;\nC 109 ; WX 873 ; N a72 ; B 35 -13" -" 838 705 ;\nC 110 ; WX 761 ; N a73 ; B 35 0 726 691 ;\nC 111 ; WX 762 ; N a74 ; " -"B 35 0 727 691 ;\nC 112 ; WX 762 ; N a203 ; B 35 0 727 691 ;\nC 113 ; WX 759 ; N" -" a75 ; B 35 0 725 691 ;\nC 114 ; WX 759 ; N a204 ; B 35 0 725 691 ;\nC 115 ; WX " -"892 ; N a76 ; B 35 0 858 706 ;\nC 116 ; WX 892 ; N a77 ; B 35 -14 858 691 ;\nC 1" -"17 ; WX 788 ; N a78 ; B 35 -14 754 705 ;\nC 118 ; WX 784 ; N a79 ; B 35 -14 749 " -"705 ;\nC 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;\nC 120 ; WX 138 ; N a82 ; B 3" -"5 0 104 691 ;\nC 121 ; WX 277 ; N a83 ; B 35 0 242 691 ;\nC 122 ; WX 415 ; N a84" -" ; B 35 0 380 691 ;\nC 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;\nC 124 ; WX 392" -" ; N a98 ; B 34 262 357 705 ;\nC 125 ; WX 668 ; N a99 ; B 35 263 633 707 ;\nC 12" -"6 ; WX 668 ; N a100 ; B 36 261 634 705 ;\nC 161 ; WX 732 ; N a101 ; B 35 -143 69" -"7 805 ;\nC 162 ; WX 544 ; N a102 ; B 56 -14 488 705 ;\nC 163 ; WX 544 ; N a103 ;" -" B 34 -14 508 704 ;\nC 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;\nC 165 ; WX 667" -" ; N a106 ; B 35 -13 633 706 ;\nC 166 ; WX 760 ; N a107 ; B 35 -13 726 705 ;\nC " -"167 ; WX 760 ; N a108 ; B 0 121 758 570 ;\nC 168 ; WX 776 ; N a112 ; B 35 0 741 " -"705 ;\nC 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;\nC 170 ; WX 694 ; N a110 ; B" -" 35 -14 659 704 ;\nC 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;\nC 172 ; WX 788 ; " -"N a120 ; B 35 -13 754 706 ;\nC 173 ; WX 788 ; N a121 ; B 35 -13 754 706 ;\nC 174" -" ; WX 788 ; N a122 ; B 35 -13 754 706 ;\nC 175 ; WX 788 ; N a123 ; B 35 -14 754 " -"705 ;\nC 176 ; WX 788 ; N a124 ; B 35 -13 754 706 ;\nC 177 ; WX 788 ; N a125 ; B" -" 35 -13 754 706 ;\nC 178 ; WX 788 ; N a126 ; B 35 -13 754 706 ;\nC 179 ; WX 788 " -"; N a127 ; B 35 -13 754 706 ;\nC 180 ; WX 788 ; N a128 ; B 35 -13 754 706 ;\nC 1" -"81 ; WX 788 ; N a129 ; B 35 -13 754 706 ;\nC 182 ; WX 788 ; N a130 ; B 35 -13 75" -"4 706 ;\nC 183 ; WX 788 ; N a131 ; B 35 -13 754 706 ;\nC 184 ; WX 788 ; N a132 ;" -" B 35 -13 754 706 ;\nC 185 ; WX 788 ; N a133 ; B 35 -13 754 706 ;\nC 186 ; WX 78" -"8 ; N a134 ; B 35 -13 754 706 ;\nC 187 ; WX 788 ; N a135 ; B 35 -13 754 706 ;\nC" -" 188 ; WX 788 ; N a136 ; B 35 -13 754 706 ;\nC 189 ; WX 788 ; N a137 ; B 35 -13 " -"754 706 ;\nC 190 ; WX 788 ; N a138 ; B 35 -13 754 706 ;\nC 191 ; WX 788 ; N a139" -" ; B 35 -13 754 706 ;\nC 192 ; WX 788 ; N a140 ; B 35 -13 754 706 ;\nC 193 ; WX " -"788 ; N a141 ; B 35 -13 754 706 ;\nC 194 ; WX 788 ; N a142 ; B 35 -13 754 706 ;\n" -"C 195 ; WX 788 ; N a143 ; B 35 -13 754 706 ;\nC 196 ; WX 788 ; N a144 ; B 35 -13" -" 754 706 ;\nC 197 ; WX 788 ; N a145 ; B 35 -13 754 706 ;\nC 198 ; WX 788 ; N a14" -"6 ; B 35 -13 754 706 ;\nC 199 ; WX 788 ; N a147 ; B 35 -13 754 706 ;\nC 200 ; WX" -" 788 ; N a148 ; B 35 -13 754 706 ;\nC 201 ; WX 788 ; N a149 ; B 35 -13 754 706 ;" -"\nC 202 ; WX 788 ; N a150 ; B 35 -13 755 706 ;\nC 203 ; WX 788 ; N a151 ; B 34 -" -"13 754 706 ;\nC 204 ; WX 788 ; N a152 ; B 34 -13 754 706 ;\nC 205 ; WX 788 ; N a" -"153 ; B 35 -13 754 706 ;\nC 206 ; WX 788 ; N a154 ; B 35 -13 754 706 ;\nC 207 ; " -"WX 788 ; N a155 ; B 35 -13 754 706 ;\nC 208 ; WX 788 ; N a156 ; B 35 -13 754 706" -" ;\nC 209 ; WX 788 ; N a157 ; B 35 -13 754 706 ;\nC 210 ; WX 788 ; N a158 ; B 35" -" -13 754 706 ;\nC 211 ; WX 788 ; N a159 ; B 35 -13 754 706 ;\nC 212 ; WX 894 ; N" -" a160 ; B 35 58 860 634 ;\nC 213 ; WX 838 ; N a161 ; B 35 151 803 537 ;\nC 214 ;" -" WX 1016 ; N a163 ; B 34 151 981 537 ;\nC 215 ; WX 458 ; N a164 ; B 35 -128 422 " -"819 ;\nC 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;\nC 217 ; WX 924 ; N a165 ; B " -"35 140 890 551 ;\nC 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;\nC 219 ; WX 918 ; " -"N a166 ; B 35 167 884 526 ;\nC 220 ; WX 927 ; N a167 ; B 35 28 892 664 ;\nC 221 " -"; WX 928 ; N a168 ; B 35 129 891 562 ;\nC 222 ; WX 928 ; N a169 ; B 35 129 893 5" -"61 ;\nC 223 ; WX 834 ; N a170 ; B 35 154 799 537 ;\nC 224 ; WX 873 ; N a171 ; B " -"35 97 838 594 ;\nC 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;\nC 226 ; WX 924 ; " -"N a173 ; B 35 82 889 610 ;\nC 227 ; WX 924 ; N a162 ; B 35 82 889 610 ;\nC 228 ;" -" WX 917 ; N a174 ; B 35 4 882 688 ;\nC 229 ; WX 930 ; N a175 ; B 35 83 896 608 ;" -"\nC 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;\nC 231 ; WX 463 ; N a177 ; B 35 -1" -"00 429 790 ;\nC 232 ; WX 883 ; N a178 ; B 35 70 848 621 ;\nC 233 ; WX 836 ; N a1" -"79 ; B 35 43 802 648 ;\nC 234 ; WX 836 ; N a193 ; B 35 43 802 648 ;\nC 235 ; WX " -"867 ; N a180 ; B 35 101 832 589 ;\nC 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;\n" -"C 237 ; WX 696 ; N a181 ; B 35 44 661 651 ;\nC 238 ; WX 696 ; N a200 ; B 35 44 6" -"61 646 ;\nC 239 ; WX 874 ; N a182 ; B 35 75 840 613 ;\nC 241 ; WX 874 ; N a201 ;" -" B 35 75 840 613 ;\nC 242 ; WX 760 ; N a183 ; B 35 1 725 690 ;\nC 243 ; WX 946 ;" -" N a184 ; B 35 159 911 532 ;\nC 244 ; WX 771 ; N a197 ; B 34 36 736 655 ;\nC 245" -" ; WX 865 ; N a185 ; B 35 209 830 483 ;\nC 246 ; WX 771 ; N a194 ; B 34 36 736 6" -"55 ;\nC 247 ; WX 888 ; N a198 ; B 34 -18 853 711 ;\nC 248 ; WX 967 ; N a186 ; B " -"35 123 932 568 ;\nC 249 ; WX 888 ; N a195 ; B 34 -20 853 710 ;\nC 250 ; WX 831 ;" -" N a187 ; B 35 113 796 578 ;\nC 251 ; WX 873 ; N a188 ; B 36 116 838 576 ;\nC 25" -"2 ; WX 927 ; N a189 ; B 35 149 891 542 ;\nC 253 ; WX 970 ; N a190 ; B 35 75 931 " -"615 ;\nC 254 ; WX 918 ; N a191 ; B 34 99 884 592 ;\nC -1 ; WX 334 ; N a95 ; B 35" -" 0 299 691 ;\nC -1 ; WX 234 ; N a88 ; B 35 -14 199 705 ;\nC -1 ; WX 234 ; N a87 " -"; B 35 -14 199 705 ;\nC -1 ; WX 410 ; N a86 ; B 35 0 375 691 ;\nC -1 ; WX 410 ; " -"N a206 ; B 35 0 375 691 ;\nC -1 ; WX 509 ; N a85 ; B 35 0 475 691 ;\nC -1 ; WX 3" -"34 ; N a96 ; B 35 0 299 691 ;\nC -1 ; WX 276 ; N a91 ; B 35 0 242 691 ;\nC -1 ; " -"WX 317 ; N a94 ; B 35 0 283 691 ;\nC -1 ; WX 317 ; N a93 ; B 35 0 283 691 ;\nC -" -"1 ; WX 390 ; N a90 ; B 35 -14 355 705 ;\nC -1 ; WX 390 ; N a89 ; B 35 -14 356 70" -"5 ;\nC -1 ; WX 276 ; N a92 ; B 35 0 242 691 ;\nC -1 ; WX 509 ; N a205 ; B 35 0 4" -"75 691 ;\nC -1 ; WX 278 ; N .notdef ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetric" -"s\n" -; -int d050000l_pfb_len = 45955; -char* d050000l_pfb = -"\x80\x1\xb6\x12\x0\x0%!PS-AdobeFont-1.0: Dingbats 001.005\n%%CreationDate: Tue O" -"ct 19 1999\n% Copyright URW Software, Copyright 1997 by URW\n% URW Software, Cop" -"yright 1997 by URW\n% See the file COPYING (GNU General Public License) for lice" -"nse conditions.\n% As a special exception, permission is granted to include this" -" font\n% program in a Postscript or PDF file that consists of a document that\n%" -" contains text to be displayed or printed using this font, regardless\n% of the " -"conditions or license applying to the document itself.\n12 dict begin\n/FontInfo" -" 10 dict dup begin\n/version (001.005) readonly def\n/Notice (URW Software, Copy" -"right 1997 by URW. See the file COPYING (GNU General Public License) for license" -" conditions. As a special exception, permission is granted to include this font " -"program in a Postscript or PDF file that consists of a document that contains te" -"xt to be displayed or printed using this font, regardless of the conditions or l" -"icense applying to the document itself.) readonly def\n/Copyright (Copyright URW" -" Software, Copyright 1997 by URW) readonly def\n/FullName (Dingbats ) readonly d" -"ef\n/FamilyName (Dingbats) readonly def\n/Weight (Regular) readonly def\n/Italic" -"Angle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -72 def\n/UnderlineTh" -"ickness 36 def\nend readonly def\n/FontName /Dingbats def\n/PaintType 0 def\n/WM" -"ode 0 def\n/FontBBox {-1 -143 981 819} readonly def\n/FontType 1 def\n/FontMatri" -"x [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding 256 array \n0 1 255 {1 i" -"ndex exch /.notdef put} for \ndup 32 /space put\ndup 33 /a1 put\ndup 34 /a2 put\n" -"dup 35 /a202 put\ndup 36 /a3 put\ndup 37 /a4 put\ndup 38 /a5 put\ndup 39 /a119 p" -"ut\ndup 40 /a118 put\ndup 41 /a117 put\ndup 42 /a11 put\ndup 43 /a12 put\ndup 44" -" /a13 put\ndup 45 /a14 put\ndup 46 /a15 put\ndup 47 /a16 put\ndup 48 /a105 put\n" -"dup 49 /a17 put\ndup 50 /a18 put\ndup 51 /a19 put\ndup 52 /a20 put\ndup 53 /a21 " -"put\ndup 54 /a22 put\ndup 55 /a23 put\ndup 56 /a24 put\ndup 57 /a25 put\ndup 58 " -"/a26 put\ndup 59 /a27 put\ndup 60 /a28 put\ndup 61 /a6 put\ndup 62 /a7 put\ndup " -"63 /a8 put\ndup 64 /a9 put\ndup 65 /a10 put\ndup 66 /a29 put\ndup 67 /a30 put\nd" -"up 68 /a31 put\ndup 69 /a32 put\ndup 70 /a33 put\ndup 71 /a34 put\ndup 72 /a35 p" -"ut\ndup 73 /a36 put\ndup 74 /a37 put\ndup 75 /a38 put\ndup 76 /a39 put\ndup 77 /" -"a40 put\ndup 78 /a41 put\ndup 79 /a42 put\ndup 80 /a43 put\ndup 81 /a44 put\ndup" -" 82 /a45 put\ndup 83 /a46 put\ndup 84 /a47 put\ndup 85 /a48 put\ndup 86 /a49 put" -"\ndup 87 /a50 put\ndup 88 /a51 put\ndup 89 /a52 put\ndup 90 /a53 put\ndup 91 /a5" -"4 put\ndup 92 /a55 put\ndup 93 /a56 put\ndup 94 /a57 put\ndup 95 /a58 put\ndup 9" -"6 /a59 put\ndup 97 /a60 put\ndup 98 /a61 put\ndup 99 /a62 put\ndup 100 /a63 put\n" -"dup 101 /a64 put\ndup 102 /a65 put\ndup 103 /a66 put\ndup 104 /a67 put\ndup 105 " -"/a68 put\ndup 106 /a69 put\ndup 107 /a70 put\ndup 108 /a71 put\ndup 109 /a72 put" -"\ndup 110 /a73 put\ndup 111 /a74 put\ndup 112 /a203 put\ndup 113 /a75 put\ndup 1" -"14 /a204 put\ndup 115 /a76 put\ndup 116 /a77 put\ndup 117 /a78 put\ndup 118 /a79" -" put\ndup 119 /a81 put\ndup 120 /a82 put\ndup 121 /a83 put\ndup 122 /a84 put\ndu" -"p 123 /a97 put\ndup 124 /a98 put\ndup 125 /a99 put\ndup 126 /a100 put\ndup 161 /" -"a101 put\ndup 162 /a102 put\ndup 163 /a103 put\ndup 164 /a104 put\ndup 165 /a106" -" put\ndup 166 /a107 put\ndup 167 /a108 put\ndup 168 /a112 put\ndup 169 /a111 put" -"\ndup 170 /a110 put\ndup 171 /a109 put\ndup 172 /a120 put\ndup 173 /a121 put\ndu" -"p 174 /a122 put\ndup 175 /a123 put\ndup 176 /a124 put\ndup 177 /a125 put\ndup 17" -"8 /a126 put\ndup 179 /a127 put\ndup 180 /a128 put\ndup 181 /a129 put\ndup 182 /a" -"130 put\ndup 183 /a131 put\ndup 184 /a132 put\ndup 185 /a133 put\ndup 186 /a134 " -"put\ndup 187 /a135 put\ndup 188 /a136 put\ndup 189 /a137 put\ndup 190 /a138 put\n" -"dup 191 /a139 put\ndup 192 /a140 put\ndup 193 /a141 put\ndup 194 /a142 put\ndup " -"195 /a143 put\ndup 196 /a144 put\ndup 197 /a145 put\ndup 198 /a146 put\ndup 199 " -"/a147 put\ndup 200 /a148 put\ndup 201 /a149 put\ndup 202 /a150 put\ndup 203 /a15" -"1 put\ndup 204 /a152 put\ndup 205 /a153 put\ndup 206 /a154 put\ndup 207 /a155 pu" -"t\ndup 208 /a156 put\ndup 209 /a157 put\ndup 210 /a158 put\ndup 211 /a159 put\nd" -"up 212 /a160 put\ndup 213 /a161 put\ndup 214 /a163 put\ndup 215 /a164 put\ndup 2" -"16 /a196 put\ndup 217 /a165 put\ndup 218 /a192 put\ndup 219 /a166 put\ndup 220 /" -"a167 put\ndup 221 /a168 put\ndup 222 /a169 put\ndup 223 /a170 put\ndup 224 /a171" -" put\ndup 225 /a172 put\ndup 226 /a173 put\ndup 227 /a162 put\ndup 228 /a174 put" -"\ndup 229 /a175 put\ndup 230 /a176 put\ndup 231 /a177 put\ndup 232 /a178 put\ndu" -"p 233 /a179 put\ndup 234 /a193 put\ndup 235 /a180 put\ndup 236 /a199 put\ndup 23" -"7 /a181 put\ndup 238 /a200 put\ndup 239 /a182 put\ndup 241 /a201 put\ndup 242 /a" -"183 put\ndup 243 /a184 put\ndup 244 /a197 put\ndup 245 /a185 put\ndup 246 /a194 " -"put\ndup 247 /a198 put\ndup 248 /a186 put\ndup 249 /a195 put\ndup 250 /a187 put\n" -"dup 251 /a188 put\ndup 252 /a189 put\ndup 253 /a190 put\ndup 254 /a191 put\nread" -"only def\n/UniqueID 5020164 def\ncurrentdict end\ncurrentfile eexec\r\x80\x2\xa5" -"\x9e\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93" -"\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6" -"\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd" -"fA-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e" -"\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9d" -"n\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13" -"\x1d\xee\x0[AX\x5\xa1m\x8a\x12\x36\xdc\x4\xce\x1a\xf8,\xb5\xf0\xbf\x35\xab\x8b\xe7" -"\xfc\xffr\xacm`o!VUt\x85\xf5\x0\x30-\xaf\xf8\xef\xe1Y3y\x17\x38\xf1\xd6\x15\x31\xd6" -"\\\x16V\xd8 \x9f#\xf0\x9e\xd1\xc0u\x93\xc6\xdd\xd3L\xf9\xf8\x15\x6&~D:g\xa9\xbc\x95" -"Y\xb7\xcf\xdcn\xf0\x31\xe7\x90\xc4\xdf\xf2\x7\xae\x44\x18\xd0\xc6\x1f\xa0\xbe\xbd" -"\xb2\x9d\x14\xe6\x86\xe3\xd8\"O\xe9\xf4\xf6\xe6\x32\xadU\x7f\x43\x1e\xb5 \x95\xb1" -"\x1f\x92I\xb5'\xfcK\xf8\xe0\xcd\x41\xaa\xbe\x44\x8f\xb\xa0m\xb\xe3u\xcb\xa2\xffp" -"\x8b\xeai\xd1\xe2\x1e\x8a\x9b\xad\xc1\x34\xdc\x82\x61\xdb\x9e\xe\x44\xf\xf6/\x8b" -"\xa7\xcb\x31Ky\n0\xefs=\xb5\xe3\xc4\x9f\xfa\xc9gR|\x92Zb\xeb\x4\x8d\xec\xc0\xa6\xc2\x44\xf9\\p\xe3\x3\x99t!\xef" -"\x88\r\xcd\x9c\xf1\xd1+\xb3\xd0\x96\x7f\x33\xb2\xff\xae]\xb6\x16o\xfd\x1au\xa2\x95" -"5\x12\x65\x8c\x95\xc2g\xc6\x15S:\xfd\xca\xb1\xe5\x96\xbf\xea\x46, 1\xd1\x7f\xdc\xef" -"R\xb4\xabZxv\x84\x95q\xce\x1b\xafv\x97M\x0\xc8\x65\xf5\x64\x80\xcb>\xc4\x43\xc4\xff" -"\x6\xdf\xf1\x90W\xbc\xdc\x87\xed\xf8\x9dnK\x6Y8\xdb\x92\xfc\xc9\x91\xdf\xf2\xb1\xd7" -"\x10\x19~|\x1f\x9f\xa4\x15\xbf\x10\x9dm\xaf\x7\xaf\xd7>\xc2\x8f\xfb\xf4\xc3\xd1\x13" -"\xdf\x45H\x8c\x62\xd0\xf2X6\xe0t\x17\xf\x62\x33\x9e\x9c\xc0\r\xe9\xc\xcb\n%y\x1b" -"\xda\x7W\x2\x1\x30U&\x6\x33\x5\xde\x8c\x5\xe5\xde\xey\xe3tN\x11\xac\xc2M`\xf3\xb8" -"\xf2hJ3\x18\x61\xa5hK\xc6\x8e\x84w\xe5\x30\xb8\x8b\xa5\x8cn\x8\x11\x8d\xc5\xd4u\xa1" -"\xf8\xb2\xc2 /\xf8\xce\xa6I\x11\x41#V\xb9\xe9x\xba\xdc\x35OGhw\xa6y\xbd\xb3;\xa0" -"\xf9\xfb\xda\x11l\xbe\x4\x8c\x2\x6\xb3\x9c\xeb\x34h\x9c\xc6\xef\nG\x93\x6\xc7@\x17" -"\xd2\xa8*\xb7'\xbe\x61\xfb\xf1Z36\r\xea\x36\xdd=\x87\xf3\x32\x19\xfb\x41\xe8\xc6" -"\xa9\xb6.\xd0\xae\xc1\xb\xad\x41\\\x3\\\x89o\xd5!\xa3\xff\xc2m\xba\xcc:3_\x8\x1e" -"\xa6\x9d\n\x80\x89?\xc9\xd9\x12Y \xf1\xa1\xd5\x81\x9e]\xf6\xee\x87'-]O\x1e]i\xd9" -"\xc\x2\x35'\xe\xa6xzBW\xa8\xd2\x16\x8d\x12\x99\xca\x31\xbau\xb1\xdbx\xec\x42\x35" -"\xbd\x83\x87\x37G\x80\x1f\xc6\x14\x1d^K\r\x10\xba\x8c#I\xcc\x3\xf4\xb7i\xa9\x8g%" -"n\x8b\x84g2.\xb6Z/\x8b\x35\xab \xc9\xa4\xc9_\x5\x91\xf8\xf5\x97o\xcb\xb6\x94\xc5" -"\x18\xec\xa7\xa9s\x94\xce\x61\x44\n\x19\xce\xe3\x16\xeb\xd8\x12\xd5P\"|\x6\xbe%\xc" -"\xfd\xbc!(\x11\x0+0&A\xd3\x35\xaa\xe3\xd0\x38\x91-ly\x11\xdf\xd6\x98N\x95\x89/\x8a" -"\xb2$`\nK\xf7\xe4\\\x90\x4N6\xaaY\xf3Mp3\x86\x44)2\x82\x95\xd6_\"\xd3\x15\xbe\xe2" -"\xe7\x84\xf4\n\xbc\xb5\xdaK\x99\x94\xb7L?\xc2u\xfe\xb7\x37\xc0\xc\xa2@\r\x4\xa1|" -"\xe6|:U\xec<\xe3\xcf\x62\x65\xa1\xe9n\xed\xe\x9f\x43\xe9\x61\x12\xddptQ\x1cW'\xe1" -"5\xc7(\x8bq\x3\xb4\xff\xb\xcf\xa0\xd1\x96\x17\x9a\xd3\x5n'4I\xeb\xad\xf2\xb9\x82" -"X\xabT\x9f\xbe\xae\xf5/\x94L\x6\xb5n\x93H;5(\x82!\xabS\xa1\xeb\xdc\xe9x\x9d\x82\xc3" -"1\x9d\xfe\xe8\x8b\x39\xdc\xe8l\xbZ_\x1b\x62,8[`e\xe5\x94\xb2-\xbb\xc1qP\x16\xad\\" -"\xca\xb5\xe6\xe4;\xbb` \xf9;\xfd\x65\xba\xe2j\xe4\xa2\x39q\xe7g\x95\x18\x61\x99\x98" -"b\xb6\xe\xe5(!t:D\xba\x98)\x90\x89Hi}\xfe[\xfa/\x8d\xa0\xc6\\\xe7\x46~6\x9a\xc6W" -"$\xe0\xe2\xe9\x44\x18[\x19Z\ra\xa2\xe5\xcf\xc7\xedK3\xb3\xbc\xb7\xc0M\xb1\xfa{y\x84" -"O\x10V\xf7\x1a\xd5T\x8e|*\xb2\r\xf5\xb4\x30\x37\xc8\x8\xbd)Q\x95\xe7\xd9\x41\x7\x90" -"\x16{\xe5\x42[\xeb\xfc\x84u\x91`R\x9bo\x97\x15\xbb&0\x1fs\x1\x2s\x93V\xf4\x90+\xf4" -"mh\xc5\xd3\rqz\x7\x18\x8avI\xd8\xd1\x43p\xb9\x9\xfe\xb2u )\xfb\x91%\x86\x7f=i\xcf" -"\xc\x43=,v\xa2:3\xaa\x83\xe9\x99j\x81;\xb4\x34\xd0\xff\xb0\xde\xb4I=+\xee\xda\xed" -"\x9a.Ih\x82R\x6\x11\x16Z\xaf\xb7\xfb\x9Q\x1f\x1e\xf1\xa3\xe3\xbd\x33\xd2\xddV\xba" -"\xa0\xceN\xa1X('*(t\xc2\xe7\x36l&\x13V\xd1\xf3\xe2\x8\xccP\xab\xb3\xf1\xc3\xaa\xbd" -"\xce\xda\x35_O\xdf\x1b\xb7{\x89\xab\x8f\xcb\xd3\x62W\xfc\x8a\x18\x92\x8cHTQx\xcd" -"X>\x9\x8b\xe0\xf1h\xd4\xd1)P\xfa~\xdc\x32\xf7\xab\x66\xe9\x88\xd7K5\x2\xcc\xfc@\x8a" -"X\x14\xc4\x36\xb9\x38\xac\x2\x1e\x39\xf6\x0\xf6\x1c\x14$~\x8a.\xe9\xdf\xf0\x10\xef" -"\xad\x42\x8b\xf3\xfd\x1\xcd\xe7M;\xa1\xe9(\xf2\x30\x89Ou\xf8\x11\xf\x32\x96\x1c\xd8" -".\xc6&\xc9\x36 \x9aR\xf3q\xf2.\xc2\xa6\xb9\xf7,\x9f\xfb\xf0I\xf4P\xabZ\xa8\xca\x30" -"\xec\xc8\xb0\x14\x41^\xcb[\x3\x97\xf7(1=+\x1c\xae\xc\xb\x38\xf2\x85\x9b\xc7\x2h\"" -" S\x95\x5\xa9\\\x9b\x0\x1c\xee\xf1l*\xa5\xc8\xbc\xdd\xdf\xcbj\x87\xc5\x32n\xa5\xa7" -"\x91\x82w\xf6\xee`|\x91\x85\xc4\xd1\x65\xcc\x9d\xaf\x31v\"x\xa0\x89\xacM\xfe\x64" -"\xb\x9a\xc8\x41W\x1e\x9c\xd2\x86\xf6\xcf\x7f\x83\x66R\xd6'\xb5\xd7pg\xb5\x1e\xa7" -"\xeeZ>\xfd\x38\xc4\xb\xc3Mu\xf5\xbc\xcdG\xa2~U\xf2\x1b\x8a\xb0\x99\x41\xfc\xaa\x91" -"\x1e\x1b\x9b\xd3.\xcd \x90\x8fw\xc0\xacu\x95\x65\xa6`\x83\xf0\xb\x33\x1d\x85=,T\xe5" -"\xee:\xb6\xac\x97\x13\x39#\xe9\x65>0\xde\xaf\xd7\x65l\xa4\x9cmrV\xeb\xe0\xdf\"\xd9" -"\xc\x1a\x82\x7f\x8a\xc8z\xc0\xdf\x39\xb1\x5\x7f\xfb\x92-\xf5\xf0\xce\xf8;\x5Z\xb5" -"\xd5\xce$\xd4\x8d\x85\xf6i/\x9\x89\x14\xaeX\x93#\xa3\xe2\x87k\xef\x80\xc0\x1c*[\xb1" -"\xc8>\xc6\x7f_\xdb\xcc\x44\x45\xb\x9f\xd1\xd9\xe7\xde\x97\x35\xbb\xf8y\x9a\x87\xd6" -"*Q\xb/|[\\\xfc\xfa\x41\x89\x93\xf5\x64<\x9\x99\xfcj\xfe\x2\x85>6\xdaq]x\xaa\xb0\x11" -"\x11\x39\x92\xe2\x14\xba\x10&I\xf1\xe5\xaa\xa0W\"\x1c\xe6 w5\xa6\xe4\xf8\x12\x45" -"H34c\x8cG\xd7<\x13\x93M\x10kVS\xd2\x37\x8d\xd5\xc\x44\x37\xbL\x1e\xdc/]\xf5Y\x97" -"v\xee\x91\x0\xf2\xa5\xa3\xdb\x81v\xf9\xc2qQ\xa8\xb3%\xef\xe4\xeb\xa4\xa9\xa2\xf2" -"\xf9\x30\x10+c\x8a\xb9\x1dSm\xbcp|\x8d\x0\x9a\xda\x89\xf1K\xd6\xd4\xe3\x83\xff\xd4" -"\x94\xcazD\"*\xe2\x8aqEZp\x14I\x97\x6\xf3\x3`kF\xe3\x9\xe5R\x91\x8d\xd7\x91\xb2\x92" -"\x4\xe5v\xc5\x8c\x9b\x3\xca\xad\xf1\xc1\x9\xb2\xe7Z\x9e\x9c\xdf\xe1Md\x89\x36it\xc7" -"\xb9\x63\x1\x98\x7Y\x6\x32\xe9\x84R\xdb%\x62k\xb2\xcb\x63U\xdd\xa8\x87\xa3\xd7\xda" -"A|\x90l\xba\xf5\xac\xb5\xf8\x32\x32\xe6*\xcc\x1\x16\xb1\x34\x99~\xd1" -"\x8a\xdd\x64\xa0\xa7\xafN2=\xdc\xb\x91\xe7:*\xfd_\x8d\x9\x9Iks\x88m\x86\xfd\xaa\x80" -"S8\xe4\x43$\xf9G\xb2\x46\xd4n\x7V\x85\x86\xaf\x8fh\xc0?qX\xc4\xe8\r\xf2\xa5\x46\xbe" -"m\xd1\xd5<\xfe\x80\xb0n\x9d\x85\xf8\xe1\xa4\xb3\"\x2\x13,\x0\xc3\xe6\x9d\x1c\x8e" -",\xe1\xf2S\xfd\x41L./\x1f\xb1\xf9\x86\xa5\xe6-\xeM\xb5\xa4X\x9+L\x9f\x8b\xe6\xb6" -"l\xe5\x93\xb2\xf\x41Z\x91\x1f\xc1k\x92\x8d\x96\x43\x3-,\xc3\x90\x85\x12+\x8d\x39" -"\xbd\x7f\xaf,\x18\xb\"\x97`l\xba\x1a\x65\xd9;M1Rq+\x84ol\x84\xc5 9 O\xc7\xde#\x92" -"\x90X\xb8\xc9\x10?*\xa2\xce\x97i\xedy\xd4\xec\xa8Hk\x14\xd0\xa5\x66H\xf5\x9c\xd2" -"\xfc\x88N2\x84\x1ek\xe1\xa4]\x8e\xbd\xf9\xa5\x0^\x89\xba\xf\xf6\x86\x61\xdc\xba\xea" -"\xc6\x66\xfa\x99\x1d\x93\"\x9\xb3\xf4\xc8\x62\x87Un\x9d\x1a\x13\xd2\xfc\xff<\xe5" -"\xf\xea\xbf\x3\x82\xf7\x80\xce\xe3\xb7\xc9\xa8[\xa4\xfc\x6\xcf\xb3\xa2\x30\xe7\xb2" -"\xea\x65\x18Y\xc7s+\xd5\x7f\x5\xbd\xc1\xc6i\x1c\x18\x38y\xcb\x39v\\\xad$\x6\xb1\xc2" -"/J\xd2\xb3\xdb\x11\xfa\xf5\xa5\x42\xd4\xdf\x16\xbb\xa1\rn\xab<\xfd\xf7G\xe\xc\xcf" -"\xcb\xc5lTL\xb8}(C\x84\xd6\xad\x8\xe2\x88\xd3}o\xcf\xea[\xcb\xa2\xbb\x82\xfa\xd0" -"10\x3\xaf[\x1d\xa4\xe6\x0\xad>\x1a=[G\x1c\xad\x46r\x80\x1en,F\x1d\xbaxP\x8cS\xf5" -"\xc3\xa0\x1b;\xd2\x43\x94\x13\xed\xf1\xd3o\xff\xa1,\xfd\xe\x92GO\x80yjR\xd0\x8d-" -"\x81\xc7\xbf\xae\xa5(\x90\xaa\xf0\x8a\x94\x35\x93\x62\xf2G\xb\x36\xb6\xdc*\xa7\x84" -"\xf0\x64\x7f\x18\xe3\xc3\x61\\\xa7\xdap\x97\x1f'd!]P\x97\xfc/\xd9\xac\x2\xb2>9\x8e" -"\xa4\x9f\xcd\xd4\x12\xcb\xb8Z\xdd!\xd5\xa5\x30\x31\xf8X\x9e\xf\xb\xa5\x9c\xcc\xfb" -"\x9d\x3\x33\xdb\xf3\xf2\x94\xebVm\xda\xb5?k\xc1\xfb\xc1\x1b\xca\xac\x98\xbc\xddu" -"\x98\x44\xc5\xa0\x1aG~+\x0\xe\x96\x7\xfc\x16\x84\x87\xee\xab\xce\xa0\x1\xa3v\x93" -"\x99\xde\xe4\xab\xc6\xc3\xb8\x38\xd8\xc1kq\x8\x2\x18\xa0H\xb0+\x9d\x10\x42\x35\xc8" -"_\x8f\x86\x13j,\xa7\x15O\xc8\x97\xaah\xdb\xd9\xd6\xd3s\xc2\xf0\xfa\x45\xe\x13\xdf" -"q+\x96X\xd0\xc1\x15\x9e\xe3\x0\x84\x94`\x8\xa8w8\x9c\x96\xceT\xd4\x8M\xb5\xfb\x80" -"5\r\xbb\xb5[\xc4\xb8\x1d\xf6\x3`\x96\x39\x8d\x8d\x10\xd8\x8eMb\xcf+\xea\x44\x96<" -"\x15\xd4\xc9H,\xd2<\xf1\x35\x80\xfa\x1e\x62\xe1\xeb\xe1\x99\x38\x45\xc1\xb2:\xb5" -"\x1b\xc3\xa3\xf2\x18\x9d\x97\xab\xb9\xcc\x66\x63\xc7\x17Sj\xcc\x41\x8\x4*\xc6:\x94" -"\xd6\xad\x81\xca\xe1\x93o'nm3o\xcc\xec\xf0\xbd\xf6\xd9\x42\xc4Y#\xa9^$Ez<\x8a\xcb" -"\xd7\xfe\x39\xf3\xbb\xfa\xb3\xe0\x84\xb9g\xce\x31\xc5\xf1\x9dn\\JR\xcf\xcb\xe3\xe6" -"\x14\xc7\x90\xf6:\xef\xf1\x35\xa7\x96\x99\xf3\x92\x15\xfb\xf5\x2\xbb\xf4\xa5\xbd" -"m\xd4PDz\xc4\xed\x46Q\xdc\x9d\xa3 \xf7\xe3Zy\x89'\xc2\xfa\x66\r\x43\xcf\xf5z\x8e" -"N\xeaq\xa8\xb?\xe2\x33\x1\x90\x80\x32\xa4(P\rQ\xed$\xbd\xe\xc1\xb3\x90\n\x8aj\xb" -"\x93\xfdy\x98\x95!T\xd4\xd3\x99\x41u~[\xd1\x38\xeb\x39\x35\xf8\xc3\xb1\xa2\xf6\x17" -"\x5\x9b\x1d#\x17\xe4\xb2\xcb\xa2/%\xad\xa5'\x1e\xcf\x63)\xa7\x85\xa0|\xd1?O2\x3\x8f" -"\xc8\xcfPq\xc\x1dix\xe2\xf4\x97n\xd7\x1b\x94\x63x\x9b\x81\xd3\x65Y\x16\x46\xda}7" -"0\x1b\xb7\xab#\xf1\xe3\xe1\xa4&\x9e^D\x1b\xb8(a\xe4l\xc1\xe5}\xd4\xb2\xa8\xf7\xbc" -"\x10)\xb3@\xf\x90\xed\xc3\x99s\x1ct\xfcq\x1f[D\x9c\x37\xab\xf6r\x15`\xc8\x86%\xe4" -"\x94pY\x9a=$\x87\x80h\xa9\"M\xbe`\xd4\x14\xa3\xb4~\x11\x94\x13\xdd\x95V\x8a~\x17" -"\xac\x44K\xee\x95\x9b\xa6\x66\xca:\xd0icg\x85\x16T\xd8&\xfb\xc6\xee\x66\x85\x80\xde" -"\xf3\xe0\x30\xbf\x81\xd1\xa1\x89}\ry\xe3p\x84-\xfc\"\x10\xaf\xabO\xfb\x97\x30V\xf6" -"/\xc1\x45\x93\xfb\x10\x41\xf1QBK|\x7f\xf6\x9d\xabvMRk\xe0n\x95\xc9\xd5\x9a\x9a\xfd" -"f\xa8j\x92\xd3\x35iY\xdb\x61\xe2\x64\xd8\xd0\xe4\x46P8\x1e\x96\xd9G~\xa4\xc4\xa2" -"\xa9\xd9\xde\x8a\xd2]K\xffpw\x0\xa5\x17\xe0~^\xc7\xd4\xfS\xac\x32\xb6\x82\xe\x64" -"\x99\xeeTL\x1c\x96\xd8sJM\xa1\x83\xdb'5c\x93\xe2<\xb3\xbf\xe7\x9fv\x95q\x16e" -"\xda\xc3\xcb/\xe2\xa6\xe9t\xd9[\x8\"\xa0\xce\x31wHjn\xce\x97\xd1?\xcc\x1b\xef\xe2" -"\x83\xabv\x9f\x1a\xe0\x7f\xf5\xc8\x13\xb4\x30'\xbc\xb2\xa2\n\x13x\xce\x89\xbd\xde" -"\xa4\xdcraJdg\x7\xcd\xed\xa6\x19\x91-nS3\xfe\x35\xe0\xa6|.\x97(\xab\xac\x39\x10\xb8" -"\xb8\xe9*\xf0\xb9\x18?%\n\xc5\xcc-\"dn\xaf\x82\x39\xa0\xe2\xdf\xc1=[m\x1a\x9f\xf7" -"\x1a,\xf3k\xbb\x1\xc5\xa6\xf6\x99P\xc2$\\Om\xfc)\"\xccy`\x16\r\xb9s\x1e\xads\xf2" -":\xda\x9\xae\xb3V\x98K\x3\xe1\xb3\xc9\xd0\x10(\xe6\xf0\xab\xe2k\x1c\xd0hX\r\\\xf5" -"\xd7\xce\x87\xfe\r>0\xfd\xc~\xa0\xed\x92\x39\xa9\xc9G\xb3:R\x86\x87\xef\x42l\xba" -"/\xfa\x96\x16?0qE6\xda\xf9\x80\xdb\xa6p\xe4\xeb@H\x90-\xd3\xd9\xe9\xf3\n\xedn\xba" -"s\xa6\xf9GcH\xc5M\xd3>\xf3\x19Z\x82!\xfdQ\xa1\x90\xc8\xfc\xf9\xe6\x93\x9f\x8,W\xb1" -"\x97i\xb4\xd1&\x1aX\x9a{\xa8\x41\xa1 zKP\x8aL\xcex\xb6\x13\x11\x13I\xa6\xa0\x36\x10" -"X#\x80\xb3\xef\x30\x30~\x90\x66^W\xa5\xedlg/\xa1Gnw\xb2'\xef\x98:\x19\xc3!9\xe9\x90" -"\xf8 \xe2\xe4\xa2\x33\x16\xe9s\xebN\xec\xe\xba\xe1\x1a\x1c\xe5Ro7\x95\xae\xaaO\x8f" -"\xb7N(\x94\x19&\"\xd4j\x9bLY\xba\xe5\xf3\xd9\x35\xbc\x97G\xb6\xbf\xa7\xea\x5}\xfd" -"bJ\xb2>\xed\xf3\xee\x8f\xc0\xdf+s9I\xc5#\x1f\x12\xee\xe3\xfc\xef\xf2'\xa5\xa2\xec" -"\xb3\x9e\x3\xeb\xb5w\xd4-\n\xacJ\xbe\x8\x86\x38[\xf9\x5\xc7\xd8lX8\xc4\x45\xb5Q3" -"\x16\xc8\x1fN3X\x3\x86\x1b\x80?\x90\xcfn\xff\xa7\x86T\xa5+\xa8\x16\xc3\x45@\xc7\x1d" -"\xecS\xe9\xcfM!f\xec\x4\x82\x5\xe5\xc2\xbe\xb7\xc2\x39\xec\x95\xda\xf1\x8b\xcd\x9" -"\xc3=\xe8\xf1}\x8c\x39\x0\x83]==f\xc\x84\xe\x12\xb\x95\xbe\xc9}49\x17\x85\xdeO0T" -"\xcc\xb=\xae\xd1\x81\xb6k\\\xb3\xae\x13\xff\xd8\xf7\"\x83\x34\xd8\xe3L\x8d\x98S\xfe" -":\x11\x8e \x97\x9a\x39*\xa3\xc3\xfcL\xf0\xd7\x95Yp&\x8\x30\xcf\xf7\xb2\x30\x91-\x11" -"\xbcR\xc6\x16\xba\xfb`\xd8r\xbcNT\xb4J\x14\x90S\x89\x14S\xa6&\xafVR9\x8d*\xa9\xfd" -"s\xf5{\xaa\x4W\xfd Ma1\xd3\x66\xd2\xb8\x8d`\x85\x91\x8d\xf5-\xdbmg\xe0\xde\xd4P\xaf" -"\xc9U\x98i3\x92\xd2\x96\x34w\x19\x33\xcf\\P\xeal\xcc\xd9\xd2\xb4\x13\xdc\xb\xed\x36" -"I\x8a\x16@y\x99\x18\x13\x99\xac\xf1\x38\xb\x9f\x19=\xf0\x8a\x93\x63\xa9\xdd\xd5\xb5" -"\x8b\xc8\x93\xa2\x32\xf8\xfa\xe3\x93'p\x11\"\x31M\x8\x92\xa6\xad\x31\x11\xc1k\x90" -"CI\xc2M!ux\xf9}nS\xee\xf5\xb2x\xafO><)\xb7\x62\xd6\xd0I\xa7:\xc9K;\xe0\xe1K\xf5\xe9" -"\xaa\xa0gnu\xb8\x64\xcf\x8a\xcfX\xa9\x9e\xed\x91\xc4 \x8f\xb3&Hv\xcd\x46\xcd\xdb" -"\x8S`\xe9]e&\xa8/\x84\xff\xf0\xf3y[5?\xc\xef\xc5Q\x1\x8bK\x8f\x64\xf9\xce\xc0/x[" -"*]\x9b\x6\xc7\xc0\x8a\x12\x87LO.5\x92\x8a\x1\xca\x0\"\x9c\xb0N\x92\xe3)&T@\xceo\x5" -"\xbanh\xfe\xb9\xd1\x2lU\xb2\xbf\xdb\xe0\xfe\xa8\x9dN\x93\xb\n\x1a\xc0\xbd\xccY\xe" -"\x5ZS\xfe\x97\xb9G\x84\x45\x94rLr\x7\x43\xb4\x5\xcd\xb1\xdb\xad\xa2\x1e\x45\xb9\xf3" -"v\x13\xc$\xd8\x86\xcd,\xab\xab\xd8\x62W\x16\xec-\xa6rA\xac\xfe$\"\xa9]\xe6\xa7\xdd" -"\x94z`p\x9b\x90\x4\xa3\x7\\u\xb8\x15U\xa1\x9f\"!\xb2\x90\xb3\xba\x43\x39\x96\x8e" -"\x95\x97\xee\x64w\x15\x84\x4\xde\r\xd7g3\xcelI\x4\xcf\xc2\xa1\xdb#\x80\xf8\xbc\xee" -"\xa1\xc7\xc0z\xf\xdb\xe9\x36\xf2_\xfa\x83to!\xa7\x4\xbb\x31M.\xa8\xa3{\xc2]\x9e\xf0" -"\"\x94\xf2\xfd\xd7\x31]'\xae)ag\x18\x64\xac\xc2\x9W\xddsw\xc4\xd4\x9d\x89\xad\x10" -"\x8\xe8>\xd7\xff\xcd}\xa3\xb5\xd3_\xdf\xfd$|\x11\xaf\x85t\x94qQ\xd5\x45\xbb\xd8g" -"\x1f\xe6>\xc9x\\j\x94\x90Y8\xc9\x9d\x8a\x93\xdc\xd8\xdc\x1a\x83\xf6\xbe\x81\x8e\x8a" -"\xa4\xf8\xe6\xe3\x82R&dv\x95\x14\x1e\xa4\xbcL\x3\xe6\x11\xce\xd3\x8e\x7\xd9NFh\xb1" -"\xfH\xb1&\x83\x96[\x97\xe7\xe5\xdd\xb2\xc0\x99\xa4\xb8\xac\x88.1\x9a\x14\xacH\xcd" -"z\xf1\x19\x45\x98v\x17\x14NI\x9e\x1a\xb7\xf1!K\x93(\r\x97'\xf8\xa9Go\xaf&\xae\xe3" -"\xcd\xd2Q\xce\xffiS\xfd\"\xea\x8b\xf6\xbeM\xd7\x9c\xa1,5\x84meMG3\xe2\x9c\x64\xcc" -"\xc5\xce\n\x9d\xba]\xb0\xa3\xf7U}2\xb1\x87ic\xc5:\xe0\x8eR?r\xe5\xe3\xe2\x44\x9\x9d" -"\xdc\xb5\xba#\xa0\xaf{\xb4x%\xdd\x9a\x87\xae\x61\xf3K\x98\x95\xac\"\x31\x80\x62\x0" -"s1$\xb1\xac\x10\xb4@\x87\x19\x66\x43\x37!0\xf0\x97\x8e=\xbc\xba\xa2\x36\x42\xe1\xa4" -"}\xe0\xf4\xf1,\xbf!=\xc2\xbd\xf6\x43\x81\xd3W\xe.V;J\xef\xc9\x65\xe6\x32\xf8\xbb" -"Z6t\x11i2\x9aj\x15\xa0Q\xa5\x82\x17.\xe1\x8c\xc3\xea\xd5\x11~\xd6\x1dGr\xdc\x89\xfa" -"M!\xdb\x8c\xf6?\xcc~\xcb\xbd\x8\xc5i\xba\xc5\x10\xb8\xe9\xf0: ,\x98J\xb0\xeb\x9d" -"I\x10\x0mPr\x87HE\xf2\xae\x98\x3\xd8lH\x9a\x4\xa4_\xdf\x85\xff\x62g\x3.<\x9b\xfc" -"\x80\x61'\xef\xa5[5\xfc\x64.\xa9\x95\xd8\x9e\x41\xee}g\xdb\xa1\xea\xf2\x9e\x1f\x36" -"\x1c\x94\xd6\xa4\x30UE=g)\xd6\x88\xc8\x87*q\xf4KL\x9\x8f\xae}\xa6\xe4~4\xb1\x63\xa0" -"\xf9\x9f\x7\xa3\x33\x81\xdc\xd6\x96R\x11\xa7\xc3\xfd\x1a\xf\x32\x98\x8f\xc2\xfbr" -"\xddz\xe8 \x95\xd6Y\x4'\xf8\x0NN\x2\x8d\x61\x1d\x45G\xd3\x9a\x87}\xdf\x1a\x8f\xe8" -"u\xe\x6\x44u\xc0\xc0,\xb\x44vr#l\x8f>\x93\xa2\xb5I\xe\x44#X^'\x8]\x15\x86\x5x\xb1" -"l\x0O\x5\xeeU.\x1\xfd\xc6\x1c\xde\x89\xc5\x9c.\xc9\xcap\x4\x1\x9aG\xcd\x9c\x8\xa6" -"@\x83\xab\xd1\x1/x{\x7f\x83\xf6\x1aO\x84\x1dV~O\xb5\x46\x13\xd6\x0gKF\x9d\x1c*_\xff" -"B\xaaz\xb2o\xcb\xaf\x9d\x5\x44\xc1\xa6m\x94Q%\x8b\xdes`\x6\xc5\x88\xb0\x62!\xc0\xd8" -"\xb4\xaaTh}\x8\x9f\x8bH\xb2\x65\x34PB\xe\x82\x13\xae\r\xe9\xb7\xc8\xcc\xe4\xd1\x9d" -"l\x86l\x14\x42\x30\x8fI<\xc1\x1f\xf6\xcc\xb3>]\x95\xc8;$\xb1\xee$\x9d\xce\x93 w#" -"\xa7\xb1\x97qQ\xe3O\x18.\x9by4\xf4\xbd*&\x97\xc0\x64\xe6w\x13\xc\xf1\xe\xa3W7\xe2" -"q\x17\xc7\xe5\x96IS\xc0\x41\x39\xec\xcf\x1f\x1e\xc9\xdd\xce\x1b\x30@\x90\x41\x9a" -"C\xb4\x12\x1\xb2:\xa1\xd7\x9b\xf8^\r\x0\xe\xccN\xdf\xdfI\x9c_\x1d\x37\xc\xd1&\xe7" -"\xda\xdb\x7f\x81\x9c&\xdb\x98\x8M*\xf6\x84\x42\xf3\xe8\x45\x34\\Z\xf2\x37+7\x8e\x11" -"G\xb7\xb4\x8f\xf0\x9c\x9a\x92\r\x83\x97\xf8\xac\x8az\xa2\x35\xe0\xc6\x98\xe7\xf1" -"V\xb8\xeaw~\x8f\xe6\x39\xd2\x6\x7^\xcdw\x8c;x_\x6\xb2\x16p\x90Q*H\xf8\xbc\xb2\x9b" -"J\xf7w\x11\x87M\rl\xc2\x95P\xed\x81\xb8\xc6\xca^q6\\\x19\xc0\x97\x0\xe9\xee\x30\x39" -"U\x7f\xf2\x8f\x1dG\x93\xe5Z\x8a\x45m\x80+\xa8\x41&\xff<\xc6\x12q\xe2\xe9`\xc7IB\xf5" -"cj!ob\xac\x80\x16\xc9RB7\x87\x83\xd2\xc9\xce=\xcd\x37\r\x9b\x10\xb4\\O\x9at<\x2j" -"6\xab\x99XG^\"]\xc4\x64\x3\x3O\xd2\xbb\xae\xa0\xcf\x1b\"\xb9\x31\x0\x83qi\xb5\x16" -"\xef\xf5\xf6\xc9\x95R0\xc0P6\x8a;\xaf\x10\xd3\xe0l(\x5\xb8\xefq]\xfdU\xaf\xc\xd6" -"Pa\xe7\xa1\xbc_|\xc7\xb8\x2\x6\xc9>I(V\xa4\x1b`/\x1b\xa1\xe9\x8c\xfe\x15+\xd6y\x98" -"]\xef\xf5\xb8r\xb8\xdd\xe0\x37\x5_\xf9\xc\xfe\xej\xe6\xecn-\xde\xf9\xc3\xc5\xff\x32" -"\x5\x4\x8c\xe7uD\xa1\xcd\xd7\xea\xe4\xb6<\n\x13_\x81t\x7f\xf1\x99\xa8&g\xee\xe4\xd8" -"0\xae\xa2\xa2\xd9\x19<\x94\xed\x9d\xd0\xe\x9f\xb2\x6:\x96\x18r\x99=\xa8L\xbf\x61" -"\xa0\x89o4\r\r\xeb\xadi\x1a\x31\x85\xa6\xcc\xfc\x97\x38:h\x3\xa1\x7f<\xa5\xa0\x13" -"\xd9\x33\x99R9`\x1b|?H\xaa\xdf\xb4\"\x1b]\xd7\xe4\xaf\x86\xa7^\xbb\x8b\xc9P^\x82" -"\xe7\"\x95\x1\x8b,'\xfa\xf3\x92\xf6\x86\xc0\xd3uc0\xa2jc\xb%\xae\xd6@6\x5P%1\x9e" -"\xa2\xfc\x1ar\xad\x14\x9f]_u\x15=\x84\x80\x41>\x14\xa2'^\xf0\xa1\xef\x39\x17\x44" -"\xe3\x43\x88\x6\x17\xd1\xce\xb7\xb0\x2Q\xacys\xde%R\xcb\xb8{\xae\x7f\xad\x10\xb8" -"N\xb3\n\x4\x9\x5\xd3\x42\x83\xd9\xf\x43y\xc2'&\x80\x1=\xf1M\x6\x65\x1e\"X_\x80\xcf" -"\xb6\x9c\xea\x1b\x10\x1d*\x7f\x7G\x92\xfc\x8e\xb6\xeb\x8f \x8c&\x80&\xa5\xc3\xdf" -"a;\x8f\xf1\xa3;A\x87\x1f\x64x\xfbq\xc8\x9\xcc\x32\xc7\xbz\x1e\x83%O\xfa\x8\x9f\x35" -"\xd5\xa1+\xc3\"\x7\xa6\x1b\xc4\xbbTI\xbc\xf4-\x8f\x8f\xa3\xe9\"\xa1\xda\xc8%\xab" -"a|\xaduwx\xe0n\x98\x36g\x94(\xf7%=e-\xd8\xf4\x14\x97t7\xce\x7\x9qe\xe8\x9\xbf\x45" -"k\x99\x1c\xe9\x9a\x9c\x9e\x8f\xe2{B'K\xae\x39\xec\x88\xba\xc9\x8e\xea\xc9\xf8\xf3" -"H\xff\xef,^):\xe7I\xf0%\xcb\xf2\xd8W\x1c]V\xec\x1f_r7\x13\xacX\x16\xc4\xe\xacJr\x89" -"z\xf0~\xaa\xe3{\xf4\xf0\x8dW\x80 \xce\xc4\xb2Gl\x9d\xf8t\xb6\x14\xeaP\x15\x63S\x9e" -"\xd8\xbdRA\x19r\x1c;\x1f\x46\x1c\xf4\x87\xce\x8\xf8\x84\x8c\xc*\xd0\x9aPJ\xe8\xe0" -"e\xc8Z\xc1\x98\x81(\x8e\xc6\x19\xd4\x15\xb8\x62g\x84>\xb9\x19\xac/\xf1\xfe\xe2\x11" -"_\x1d-\x1fU7\x15\xac\xfc\xfb\xea\x18\x87\x9f\x9d\x8b\xa6\x99\xa1&\xde\xf7\xa3\xfb" -"\x1d\xb8`\xb3\xab$3\xe3\x66u\x1b\xc0\xb6 p\xa3\x6\xf\xc7jr\xeau\x80\x44\xb2\xde\xf" -"W\xd9\x39\xe\\\xfryO\xb3\xde\xbe\xbe\x9e\x41\xa0\xb1V\x80\xe3\xa1\x62G8\xbb\x66\xfd" -"F\xabx\xd7|zL\x14\x1f\xfbWpvC\xc9\xb7\xdd\xd5L\x8b\x1d\xc1\xe5\xae\x9d\x8fs\xee\xaa" -"\xd2\\\xfd{\xca&\xe9R\x84s\x19\xef\x6\xb2\xe\xbbq\xba\x9bVz\x9f)\x97\x63\xf7\x37" -"\xaa\xcf\xa9z\xce\x6\xfcg]\xbe\xc0\x11\xec\x44\xba\x9d\x6\xf2m\xcdr\x9f\x93Yr)\x8e" -"\r\x94\xdf\x8\xf5_\x93\x62\xdf\n\r?O\xe7\x9bl\xb3\x15\x1c\r\x43\x45\xe5\x31\xd0Q" -"\xa9'\xb9\x46\x7f\x31\xa2\x4`,\xdem\x98\x1b\x9c\x6\xe1\x1c\xe\xc3z\x82\xe1\xe8\xbf" -"\xc4\xaa\xd0\x6\x43\x90\x12?\x0\x33\x97\xa4+\xbe<\xd9\xbb\xf3\x36\xf1\x31\xe9\x41" -"\xf2#\xb5\xab\x34\xec\x37Q/\xba*w\x90Q\xad\xc9\xc2\xf3\xc\xb\x9x\xa2#\x14\xd4\xcc" -"wo\x11h\xabY_~\x6\x98@\x81\xe2\xf1'}\xbf\x12\x1f\xf0\xe0\xb\x45\xeb\x30\x1e x\x95" -"Pt\x85\xc1R\xd5Q\xd8\x83+\x88\x1a\xc3\xbcU\x8a[\x15n~\xfe\x86\x80\x10\xeb\x14#{\xd9" -"D\xe5\x41\xb2\x19\xc\x1f\xcM\xa4\xa6\x9d\x90\x80\x38\xf9\x8b\x31\xa2\x9fw\xa4T\xef" -"s\xe0qZ\x9a\x44N\xb6\xa3\x92\x1c\x33\xa0\xff\xb2N\xf4\xf1\xe0\x38+\xb8\xc1Q\x7f\xc6" -"\x14\xb0\xb7\xa0\xf3\xf0\xab\x1d\x30.m\x96VBl\xdb\x1\xb4\xd3:\xf9\xef\x7f\x44\x34" -"\xfe\xbd\x1d\x63\xcf(\xae\x64\x81\x80\xd0\xd0>\x9a^\x1e\xa5\x81|V\xf3\xc5\xc7H]\x95" -"9\x95\xbc\x93\x32\xa3\xf0\xbc\xbb\x32l\x9e\r\xefYJ0\x7\x37*\xf8\x0-e\xd1\x91\xe5" -"c\xa8\xc7\x9cW\x8a\xf2\x18Q\xbe\xbe\x91\x82?.\xc4\xed>U\xb6S\x16U\x6\x13\xa1*\x8" -"r\xdaJ\xb5\xf\xca\x44\xffO%|\xc4\x9\xe6\xe2\x99[\xc4?\x99_6\x7f;\x95\x41\xb\x34\x5" -"\xb4\xf7K>j\xd4\x93\x6y\x8b\xc4Q\xf4\xba\xaf\x13\xcdI\x86\xd8u7\xf=J\x1aW\x82\x8" -"=Q\xeb\x91[\x7f\x32\xa4\x61\xb2\xb8\xfc%n!)_\n\x1b\xac\xb1s\x98L,\x88\x9eL\x1dv\x0" -"\x5\xaa`\xe7G\x14\x11\xd1Q\xd3z\x94\xed\x8d\x14\xbf\xf0\xa0\xa8\x38\xb7=\xeet\\\xc2" -"\xf0\x17\x15w\x8cW\xd1\x45(\x5_\xb2\xd0\x31j\x8b\xe\xe9\xfb\x1f\xba\x6\x3\n\xa7\xed" -"\xc4\xcY\xe7\x11>\x95\x89\xb6\xd0\x88\x1f\xb3\x99\x61J\xfI)\xaeK~\x91/8i\x89\xce" -"\x13\x7\x2)\x18\xfP\xf4\xccZq\xf0\x14.\xe6T\xc2\n\x45\xf\xb5q\xa7LY\xfc\xc2\xdd\x42" -"\x8e\xe3\x14\xde\x30\x90\xf7\xff\x12\x5\xe7\x1e\xc4\x96g{\xcdV\xfc\x9c\x91\xd2\xb5" -"\"\xf4\xdc-\x14\x82\xae\xfe\xb6\x81\xd7\xab\x87\x36\xe5\xeb@~~\xfe\xf4\xc0 \xe4W" -"{P\x1c\x9fT\xd7\xde\x19\x45qQi\xaco\xc7\xf5R\x92\x6T\x8a\x62\x2\xde\x12n\x87\x9\xe0" -"\x1eo+\xc3\xe8M\x9c\x81?sgK\xc9\xdbTo\xb7\xab\xbaR@\xc4\x16m9\xa6\xbbk>\xdb\x88\x98" -"\xcf\xek\xa8\xa5[#\xc0\x33\x7f\xf1\x34\xc5\x5m\xeKN\xa1\x7f\xbf$\xdas{'\x1\xd7\xa4" -"\xda|\xba/\xa4\xa1\x39\x46K\x8=l}\xae\xd6\x30\xfa\x6\xc2\xb5\xe2\xc2\x6\x81\x1a " -"\xdc\xc4\xbu\x88\xb4_\x95^\xa6\xb6\x33\xc6,\xbf\x36\xcd\x93\xb\n\x38\xda\xf0\x9b" -"Cc\xcb\x6\xa5u\x92\xb0\x7\xdd\r\xc2\x14\xc1\xect(^\x9e\x9c\x6\xf2 \n\xc0\xf6\x9\x90" -"#\x4T\xee\x0\x1a\x85\xebr\x10\x11\x30Pi\x9a(\xc3\xe3\x1Q\xf\xfa)\xde\xb0\xc6\x4\x84" -"\xd3\x11\xe3KWRm&\n\x94\x31\xbc\x80\xe1\xd9\x18\x3\xdeR\xecY\xed\x35[\xd5\xfe\xc" -"`\x86l\x1d\x38/\xce\"\xe0\xb6\xd8\xc1G\xeeQ\x1c%\xaf\xb0q\xd6\x95\x8e`\xea\x18\x45" -"F\x96\x83\x46|\x1a\xa7\x0vb\x9c J\x3=\x94\xe2\x94\x8b\xb0\x45\x88\xb7~\x99\xdd\x13" -"\xe0u\xfa\xeaq\xfc\xf1\xb7ST\xdc\xe0TsB\x9d\x8fk\xbe!\x8e'\xe3\x8e\x33\x13\x83:1" -"\x9a\x84\x42\x95\x5\x88HK/\x9bH\x81\x80\xf3\xc2\x92\xa4\x8dpF\xcfx\x1es&\x7f\x88" -"\xba\x64\xadJ:g\x95\x34\x8al2\x1d\xd5\rP\xba\x99\\T\xda\xf\xf8VW\xe\x1f\xc1\x18\xe9" -"\xbb<\x10K\\m\x9e\x11!\xdfK\xda\x33\x66 /1\x97\xcc\xa7\xb3\x65\xa9\\\xdf\xf6\x97" -"{\xa9\x65\xe2\xa6\x86x\x9\xf4\x8a\xfd\x63{\xd4UZ\xdf\xce\x32,\xce\xe9n\x9d\xe2.w" -"\xd8\xf6\x32-\xd8+\xf\x62~\xc2'?(\xdf \xa2\x1\x19*\x1d\xea\xfd\xb8\xca\xbe\x17\x98" -"\x12Q%}\xcbq\xb4\xb1\xa6r7\x86\xe4\xac\xbc\xc1*n\xd6\x61\xfa\x1c\xdc<\x8dN\xdcP)" -"ldf!\xfd\xfdW9\x8c^\xe4\x8eh\xc5\xce?\xa7\x9dP\xb6\xd6\xcd\xcd\x65;I\x12\xff\xaf" -"\rTSP\xe\x65\x97\x1\xfd\x8\x11\x93\xf4x\xae\x9b\x88\xef\x15\x98\x33\x85\x97\xd9\xcf" -"'\xabh\xbb\xe7\x89\xa2\xce&?\xbfJ1\x87\x81\x1\x37\x92\x36\xa3\xc9|\xfe\xfd\xadr?" -"I\xd2L8&Mn\x1e\xa8\xc3\xc5\xc9\x5o%\x1\xe5\x37\x90\xa0\xf6O\xe5\x91\xd5\r\xe4\nm" -"\x9f\xd0(N8\x96U\x1e\x96\xb7\xc5\xc0&\x96&\x1b\xcz\x99\xa4\xc7)a\x90)\xe0\xae\xdf" -"6\xc1\xed\xbe\x42\xd6\x99\\\x1aJ\xcb\xb1\xea\xcc\x9f<\r\xeb\xb9\xedX+\x81\x1f\xec" -"U\xf2\xfe\xaa\x37G\xe5\xe2\x83?-\x98\xfb\x1dXq\xa0'\x83xA\x91:+P\xcdQe\xc3\x1c\x9a" -"\xf\x1d\xecZ\xbK\xf1\x85\xd2\x3\x7f\xd0K'\xc4\xbfpz\x92=\xe0\xc2\x8bo\xeb\xae\xbc" -"\x9fx\xbc\x9c\x11\xccGi\xc1\x8b\xae\x18\xbc\x42\x32\x95z\x1\xa4\xb8\x85\x91\x10\x64" -"l\x86\xcf\x34\x99\\\x82\xdb\xf0\n@E\xec\xe0\xc3\xb5\xb9\xb3:z\xbdW\xab\x87:of\x14" -"\xb6@\x91n::n8\x88\r\xda\x39\x98\x9c\xe4$\xad\xb9\x66\x1g)\x8eu\x86?\x7\x5/\xfb\x99" -"\xa8\x5'\xc4\xa8\x3Iu6\xae\x17\x45\x98\xb8\xba=%g.\x16\n\x3\xc4\xfc\xb0\x66\xb3\xc3" -"\x14\xfez4\xa0\xa7\x11?\xa9/s\xef\x44n!\x8d\xc9\xfd\xa4L\x93y^\xcd\x9\xe6\x1a\xfd" -"\xde\xb3sZl\xd9\x3\xa7\x89\xcb\x9c\xb4\xfdxQB\x85\x0:~4\x97r\x81k\x0\x37\xb8w\xd5" -"\xfe\xe\x15:\xf7i5kn\xa5\x9f\x7fk\xc4\r\xf9\xfe$5\x15< \x1ajkOR\xc8\xe3\xb1\x10\xb6" -",Z\x8e\x89\xa5\xf8{\x8b\xbf\x9b\xbb\xccPZ\xba\x8a\xc0\xaej\x8m*D\xf2\xcd\xa0\xeb" -"\xd6\x41#\x1bO\x7f\x8e?oO\x19\x0\xbe\xacP\x14[.\xa9=$\xb6\x8a\xc1\xd2l\x95\x94u\xca" -"5x\xc7\x99\xb8R\r\x12\xb3\xce\xe5\x93\x19L\x1c\x4\x66Q\xb0\"G#i3\xe2\x5\x42[p`\xf5" -"\xb4r\xb5\x1\xbc\x31\x90\xaf\x11\xf0\xb4\x91\xcc\xb7\xe\x44\x88\xa0\xbc\xb0\x63H" -"\xf1\x7\xfa:\xb8\x66\x66\xa9Rk\xa1\xd3r\xb4\x1\x66Jb\xe2\xa5\xf9SJ\xf5\x3\xd0\xab" -"\xa0\xb1\x12\x97\xd3\x36+\xca\xf7\x9b\xde\x1em:\x13\xbb\xaa\x39\xdc\x8e\x83\xc4\xe9" -"\x1b\x98\xba\xb3\x0y\n\xfb\xf3[@\xf2R\xe1\xdbyQ\xe1\x7\xbb\x39^\x9aj\x96\xe5\x46" -"\x96\x81\x3\xa0\xe\xae\x92\x30\x44L\xee M\xa9\x91\xa6\xd3\xf1\x6\x3%\x0*\x11\xd1" -"\x10\xb8\x14\x19\x9c\x8d\x45\xf6\xf6\xa1\xf6\xe1\xd6\x13\x89\xf1z\r\xfeS\xbem\x3" -"n\xce\x85\x1f\xa2\xe2\xe\x1a\x41+\xe7\xa3\xb5\xb4O\xdb\x9f\xa7\x7\xf4\xff\xfd\xab" -"3\x6\xdd\xce&\xad\x2\x95\x38(\x87\xf9\xd5'\xcd\x4|\xb5\x83\xd2\x0?A\xae&\xfa\xd6" -"U\x9b=:\xea\x92/\xda\xf6\x91-\xcc\xf1\x86\xeb\xde\x3\x17\x82\xcd\x14Z7\xaf\xbc\x30" -"\xb6\xe]\x9d\xfc\x10VkV>W\xb8p\x96x\x8mlHdY\xf9#GN2\x1d\x7\x37\xf9W\xb9\x42\x96}" -"\x4\r\xca\xad\xd8\x32\xd4\x9f+\x82\x16\xd1\xda\xa3\xa4\xee(\xb\xaa\xf8\x63\xcc:\xea" -"\xae<\xb8TI\x0\x84\x8d},\x90\xb2\x1aL\xed\xab\x9e\x61|\xf7\"\x14\x0\x35\xc6*\x9c" -"\xcf>[7Uv\xe8\x12>K\x1\x9e\x9#\xd2\xe8\x15\xff\x36\ny\x8b#0\x8a\x32\xa9\x19\x42\xe4" -"X\xa0\xf1\xaeM\xb8\xcf\x31)\xcc\x33\xc8\xaaJ\xb8\xf3\x33\x61\x66\xae\x1d\x14k\x7" -"c\x12\x1bM~)\x90\xf1\x92\x6M\xb7\xfb\xd9\x64u3/\xf7\x0 \xcd\xe6\xf\x0\x14\x9c\x35" -"QWT\xd2$\xd1\x91u\xcf\xa7\x91\x64#H\xce\x9b\x8b\xa3\xde\xe2\x10\x63*i\xd7\x8e\xb4" -"U\xf5\x87\xf8\x96J\x9fL\xeb\xe1\x1b\x9d\xc6\x14\x9b\xef}\xf7\x81\xb1\x97\xec\xbf" -"K\x9a\xdax\xf1x\xc0\xce\x1a'\xd7\x7f\xac\xce\x96\x32\xc0\xf8u-\x88R\xfe,Z\x6\xe1" -"G\xd1@\xf\xf5\xb4\xb9\xffK\xf0\xc5\xc4\xbe\x13P\xd9\xd2\xfd\xe1\x7f\x12w\x90zl0\x88" -"\x4*Cr\xca>k\x82\xb6\x88\xe3 /D\xf\xfc\xc1j~\x10U\x1c}\xdd\x34\x35\xb9\xb5\x9e\x9a" -"\xda\xaf\xe3\xb8}\xe1O=\xc3\x1d\x1b\x87%\x1d\xd4<\x94\x83\xf8\xa4\xc6\x12@\xed\xac" -"\x88\xeP\x87\xdd\xdf\xcd\x8_\xf\xcc\xfd\x1b\x16\xde\x94\x63&\x2\xf1L\xbf\xe7\x6\x31" -"b\xfe\x66Ph\x8f\x93\xeb..\x9e [7\x86\x9b\x15\x6U\xf2*\xcbO\xb3\x44\x63v\x99y\x1b" -"\x94r+\xc3+\xb7\xb4\xf6\x3\x90\xe4\xd1K\xa4\x92\x45&\x84\xca\xdd\x33\xe5p\xac\xb3" -"\xaa\xdd\x96\xf\x89#\xff/:)\xe4G\xa0)\xa3\xb9.%\xfc\xa0\x17\xa1\xc5\xbdO\xaa\x8c" -"\xab$\xe9\x14\xf5\xf\xabY\x6\xfaP\xb3\x39\xa0\xd5\xa8\x39\x89w\x1f\x41\xa3\x91\x3" -"\xa9#\xd5\xc9V>[\xean\xe3n\x1bJ6$\x18\x4\r\x35\xc6\xb0\xdb\x2\x38\xce\x97/\x95\x15" -"\xc6/=eapL\xa5p\x81\xca\x41\x98_\x17\xdd\x86\x13\xa2\x92\x9b\xa1s\x99\x31\xaa&\xc" -">d\xebM\x94\x98\xd6\xcc\x14\x80\x13\x66\x9e(.\x96\xf5]\xa0\x1a\xed\xa6\x94\x99Q~" -"\xdcLR\x0\n\\t\xd2\x93\x8d\xfa\xf7`_&\xf7\x99\xdf&zX\xa0\xb9\xfb\x30z\xc2\x6\x83" -"k\xf7\xe0\xb1X\xcb\xd3i\x95v\xdegq\x7f\x0\xdd\x38\xc3\xcd\x8Yd\xe8\xc5x\x7f\x9d\x32" -"^\xb2\r\xc0\xb2\xea/\xc8y\xe7\xa4|\x14\x9e\xd8\xfa\x8e\xde\x30\xfb\xf1|\xfc\xd3\x9d" -"\xe5\x16% \x1f\x90G\xc5\xc\xa3\xc4\xefZ\xe0]\xb8\x1c\xda\x36\x34\x93NH:\xaf~\x9{" -"\xdf\xe3\x88\xcc\xc6X[\\\x92\x8f\xfa\xb4\x13\xc7v\xa8\xb5\xa7\x9f:\xa7&\x89\xde\x1d" -"G\xf0\x2\xda~\xfa\x84\xd8\xea\x99\x36\xc2\x32\x12\xd7\xf0@\x98\xdf\xca\x1c\xf1\xe0" -"GdW3\x85\xd4K\xe7\xde\"+\x80\xe1\xe\x11Hm,\x12\x18\xe9+n\xbf\xd1KI$\xd7\xedrfK\xf3" -"Ec\x99j\x96\xe5\x63\xef\x62\xec\xad\x11\x81\xf8\x44@\xf5\x8f\x41\x16\x34\x9\xd3\xf1" -"\x1+t'\xaf\xaf\x31\x37\x97\xcc\x10\x9f\xda\x1\x7\x39\xb4\x44Tq\x7\x93\x10R\x5\x44" -"\x19\xe\x6\x15\x8aX\x86\xd2\x97\x39\x33\x85\xbbX|pA\xca\x2\xe4\xd9~74}O\xdf\xa3\xcc" -"\x1c\x42\x30\xac$u\xe5\xb2\x81\xbf\x84N\xa7\xa9\xb1M_\x8a\xb4\xed*\xa0\xe9\xe2\x91" -"\x80Z\xfa\x66HA\x1b]\xeb\x86\x35sg\xc3t\x99\xc8\xcb\x91\xf1\xcb\xeb\x2\xbf<\x10\x8e" -"\n\xcf\xa1\x11\x8aS\xbcv\xf1\xd3\xa6\x5/\xf8\x17*\x8\xe4&\xa4r\x89\xd1\xe8\xc1\x35" -"\xf8\xb2\xdc\x9e\xa5\"\x99\xf3\x7\x43\x99z^u!fP\x7f>\xae\x9f\x9b\x9f\xd7\x94\xef" -"\x1e\x89\xcc\xff\"\x42\x87|\xc1\x80\xf9\xab\xb\x8c\xc0\x64%\xc6\x93\x5\x45W\xa3L" -"\xaa\xab'\xa6\x81\x8\x1\x82\xb4\x8c\xae\x13^ \xf9\xb6\xf6ht\x1e\x35m1\xb4\xdcY\xc4" -"z\xc1\xe6\xdd\xfb\xcb\xa4&FlM\xdf\x89\x1c\xd4\xf3\xd2#\x6\xfd\x86p%6XFQ\x1\x17\x19" -"\x1N\x9e\xfe&\x8bLdb\xa8\xf4\xef\x97v8\xef\x31[\xff\xd8\xa8 \xd6/\xbb\xbe\x63L\xfa" -"2 \xb3\x66Ws\xe2W'\x9\xc6l\rOL\xd7\x8d\xe4\xc0.\xab\x9L\x9aN\xdc\x9aY\xaf\xa4\xb3" -"\xb0\x8\xb0'\xb0\x8b>\xfc\xba\xe6\xe8\xa5\xd9\xe6\xd9\x18jT)$}|\x9d\x82\xdb\x9e\xca" -"\xe8H\x13\xae\xc3T\x18y\x18\xd9\xee\x11\x86\x1d\x61,e\x3`\xb3\\\xba\xe9\x97G\xd7" -"\xf8k:!\xda]?.D\x84\xd8)\xcfx\xa7\x1e\xe7\xab\x1ei\x11\x18\xcb\x9c}A\x18M\xe1\xa0" -"\xed\x91PAh\xff\xeaVe1tMA^\x92\xda%\xc6\xb6z\xfa\x98O\xeb\xd3*\xc8,<\xc2\x11S\x87" -"\x93Y\xec\xad\xf3Ma\x0\r\xd7$\x10&\xfd\x97\xed\x95\xe\xb4\xe2*U\x8a\xa4g9\xc2\xee" -"\xf2\x33>\xfc\x88\xa8\x32q\xebX\x8c\xe1'\xe2\xc9\x18o\xac\xd7Pl\x8f\x31<\x9f\x98" -"\xc3p\xdeU~c\xe6>D\xfbO\xfd\x9c\x85\x39\xf0j#RZ\xcb\xbc\x91\xe9\x2\x66\x94@\xebU" -"\xc5\xff\x1a\xe\x34\xb7\xb9\xe1\x12\xeR\xf3\x91\xb2\xf8\xbe\xf7\x63\x8c\xc2\xf4\xca" -"\xb7\x94\xea>\x8c?\x14\xc2y\xec\x36\xfd\x9c\xa3\xa0\xe9\x7JjY\xe6\xf8\xd2\x90\x94" -"\xcbV}\xb1\xf7:\xb5\xf4\xee\xac[\xeb\x31\xe8\x37\xe4\xafG\xe8|\x98\xd0H\xc3\xd5\xd7" -"S\xf2\x30\xbb=\xb5'C/N\xdb\x7\xa6\x36\xa1\x45\xb2\xe\xcb+5d\xee\x9c\x6/\n(\xc7\xd3\xa3\xaf\xd1\xa9\x1b\x37N\xb5, \xc8\xfb\x18/\xdd,\xbe" -"}\x88\x18\x82(.\xdd\x9cG\x86V\xdd\xb5\x9c{\xb2\xff\xa4\xc4@{SV\x9e\xc2*\xaf\xba\x9e" -"\x19xI@\xf5\xc6t\xce`s\xbe\x8f\xd3u\xcf\x15\xc0\xcc\x88\xab\xc9! \xba\x2\xec\x83" -"tdd\xfdrm\x9c\xb{\xb9X\x9f\xcc\x34\xaa?F?\xbb\xe0(\x7f+<\xbfz\xfe\x3\xce\xc2\xc7" -"*\x4I\x3\xc3$n\x94K)#\xdf+L|X\xed\x5\x66H\xb5)VJ\xeb\x1c\"\x87\xd5\x62\x98\x8\xb0" -"\xce\xa3sN\xdb\xeeM\xb3I8\xda\x8e#\xc0\xd4\x39\xae\xa4\xbe#\x87\x96\x42\xe7UH\xdc" -"T|\xfe\xa6\x94\x13\xfc\x9d]D\xf0\xb6%\x18\n\x8\x35|\xe4\x85\xdc\xfcw\x85\x36\x9f" -"%\x8e\xeer=~/\xcaq-\xb0\x95[Y\xbc\x94\x88\xf4\xeb\x9e\xab\x1d\xe\x8b\xe8)/\x91\x1" -"\xce\xae\xd0\x86\x80\x92\xba\x9et=R\x83L\xd4\xaa\x1a\xf0\r\x95\x91:\xfaO\x1d\xba" -"\xef\x9dh\xb0\x1b\x63\xd0N\n\xd2X\x8bL\xc2\x3\xee\xe7\x18s\xad.W\x92\xbe\xb3\xcb" -"i\xad\xde\x9f\x99Z{6\xf1\x3\x94?\xc4\x93\x66\xaf_\xee\x96\x8dj?\xaf\x39\x36)\x95\xa2\x2\x9ext\x9e" -"\x89os\x94\x86\xb2/\xce\x11\xa4:hUF\x8e\x7V%\xd5\xe8\xc4\x89\xebX\xb0\xfc^\x1a`\x94" -"[\xf5\xa6\xea\xa0\x19\xf8>\xbf\xacTs\xfa&B5\x8e\x16/\x1d\x8b\x30L]\xc0Y\x89K\x85" -"\xf1\xfb\xf5\xc7\x1e\xcb Mm\xf\x1d\xcf\xf0\x90\x9\x91\x6\x1ez\xc4\x92>\x80\xe6Q|" -"`><\xa4\xf8X\xbd\xb7t\xa0\xc6/W\\1_{g\xa6\xfa;\x4\xdc\xb2\x92\x32\xfd\xb5\x94^\xf2" -",E\x1a\xa2\x1e\xa4\x8b\x98%\x42ys\xc\x87\x96O\xb\x45\x8fG$\xbf\xd9\x8f\xe2\x9e\x46" -"\xa3\x63]*b\x8e<)\xcf\x87\xb1\x34\xe0l\x97x\xcc\xdc\xb2z=\xd5\xe5&\x16W\x90%\xd8" -"B-\xb7\x85\xab\xc7\xa4M\xad\xa4\x5\x99Y!`j#\xa6\x1a\x36\xfdh\xa3/\xae\x31\xdd\x66" -"\x1a\xeb\x31\x33\xc5\x1a\x86\xed\x85\x16\x94&\xa9\x90\xe\x82\xd7;\xfd\xd8\x5$^\xe6" -"6\xccwy\x85\x46\x39O\xf1j\xb4\x1cp\xdfh\xa2\x7\x8a\xfd\x14\xewH:2bo\xf\xff\x30H\xf6" -"|\xff\x6q\xcd\xbf\x64;d;\xf4\x3\x7\xb8S\x8b\"<\r)\xd3$\xbf\x80\xbc\xce\x8\xa2\x9c\x63\x9e\x92\x89# \xb6z\x98\xbb" -"\xd3^\x9\xa0\x30k\xaaY\xbc@\x1c?\xbe\x9a<\xf8\xa4\x45\x1f\xcc\xb7o\xae\x8c\x91\xb7" -"\xb?\xff\xac\xd3\xb5\xa1\x62`x\xe4\x4`\xb3\xec\xe5X?*\x97\xf9=\x8f\xca\xdf\x61W\x1a" -"[p\x8b\xdb\xa5\x88\x1c`#\x7\x19\x7f\x96\xfb\xeb\x14\xaa\xc5\xb1\x1f\xc0\xe9\xe7t" -"Mnj\xf2\xdd\x97\xd0\x0W\xdf\xe7\xf9] \x15\xae&9\xf9\xdc\xb9\x9c|\x10\xf0\xb4\xb6" -"J\xd6\xe1~O\x2\x8b[\x11h\xe4\xebJ\xea\x96\xf3\xd2v\x92\x9b/\xd2\xa4\xffl\xb2\xde" -"\x3\x8\xd2\xfa\x7\x33\x1d\x35\x62\xfd\x18\xd7$\xfZu\x86t\x83\xb0\xe0V\xbd\x9f\xec" -"w\x82\xd6}\xdf%\xe:\xab\xac\x1-y\xd2O\x15,\\\xd0\xbs\x90\xcd<\x87\xdb\x8bq\xb2}M" -"-G\xac\x82\x43\x44\"*u\xa4\xfe\x12\xad\xd4\x80v<\x91\x17\x95s\xa7\xd0\xb8pc\xc7\x8" -"\xce\x1\xf2\\U-\xc1\x0\x30\xb4v\x19P\xfe}\xf2\xcf\xc3\xd8h\xa2!a\x1}\x1e\xd6]\x11" -"\xa9\xadN\x7fL\x91\xc8\x7\xf1\xa3\xb2\x9e\x36\xe6\x8c:\xdb\x98\xb8\xe7\xcf\x30o_" -"Z\xbcT\xe3\xfd\x83>\x8d\x86\x42\x1f\x5\x0*\x9f\xcf+O\xef\x30\x45w\xda\x43M\x9e\xab" -"\xbb\xef\xcb\x98\xde\xb0\xa4\xb4@\xe7_&~\xa7\xeb\x92Zq\xca\x94x\xc7\xd6~Y/\xdf\xea" -"h\xb6\xb4\x35Y\xf4\x9e^\xde\x82\xed\x83\xb2\n\x8b\xb1\xba\x96\x86\xbb\xee\xef\x33" -"E\xcf\xa4\x46\xc5\x41|\x12;\x9f\xa7\x9d\xc6\xcb(\x94%\x65 \x94\x35^\x12\xe4\xbf " -"\xd2\x42\xe0\"\xf0\xa3j\x1c\x19.{\x81\xcc\xd2\x92\xc5\x0\xab\xc0\x19\xepM\xe2m\x93" -"\xaf\x82\xd4\xe1\x61*\x7f\x34\xb3\xe9gO\x90\xcc\x8c\xd1h\xfc\xc5\x9d\x37\xbd\xbe" -"-9\xd0\xa3\xde\xba\r\x94}\n\x4\xeQ\xc6mj\xb1WP60Mgt)\xb2\xd7x\r`\x6\x5%\xff\x34\xc8" -"\xf4g\x10.\xe4\x64\xe2\x42\x8R1L\r\xb2\xe5\x17t\x4&Z\xe\xcd\xd0\xea\x2<\xd5\xc3\xe3" -"\xeb\xc5\x1\xb6YsW\xf3\x1e\xf1on\x8d)\xcd\xe7\x0\x13\x1el\x87\xa6\x18\xcb\xc2\xba" -"\xfa\xda\xee\x8f\x9d\xces(\xdeG\xf4L4\xf2\xdf\xc7\x90_KUKO\x10 \x2\x8cK\x94!<\x0" -"\xa3\xdb\xb\xd2\xabj\xd9\x13'\x86\xba\x38M\xa8\xc0\xd1\xc\xb\x97\xb5\x3U}\xba\x7" -"\xeb\xe9|O?\x88\xf2\xbe\x1d\x88\xbf\x8b.'lm`\x9d\xf7\xe2\xb7m\xfa\x33\x8d(\xa9\xd3" -"\xd6%!T\xd9\xd0\x30\x85\x16\xcf X\xc0Y$m/\xb\xbc\xd1\xc8`e\xf6\x41\x33\\Z\x1b\xfc" -"\x1b\x66\xbd\xc9\xd2?n\x82\xb8 \xb1\x80nq\xafO\xc2\x44\x33\x8aK\xa0{\xe5\x19l\xa9" -"c\xc1\x1eq\xe2\x99\xcQ\xaa\xf5\x8d\x31\xc4\x8d\xfe\xb2\x0\xb8\xa1\xff(b\x1a\x9b\x15" -"\x8e\xbbU\x85i\xd6\xc2\xc8\xf8\x33\x46!\x83\x7f\x9c_\x19\x32\xc0\xeb\xc5\x1a\xe4" -"\x1aPF`\xde\x31H\xe8I\xf1\x32G\xdcs~\xbd,\x8\x15\x61t\xc0\xf9\xffx\xbb\xf6-\xd5\xd2" -"\x0\x2\xb6OIhT\x8aZe\xcdl)\x1d\xe4\xef\xde]\xb8\xf7v\xec\x93\x13\xd7v\xd9\x36\xdc" -"\x2\xc5\x61K1;\xfe/R\x82\xb2\xc2\x2l\x4\xca\x93\x1\x99\x62\x9cs\xa2V\xb8\xc5\"\x94" -"\xc3\x63\xf4\xa7@J\xdbm\xcb\xf2x\x13\xea\x8d\x8d\x95\x12\xdf\x10\xc7\xec|\xbd\xce" -"F]\x9dLx\xe7/:.\xfa\x66\x14\xf0\x1e\xde\r#\x4\x1cO\xc1l\xe4PK\xeb\x17\x6:\x97\x5" -"-\xec\xe3\x1b\xec\xe5\xba\xa5\x82\x14\x44\x7f\xa9*u\xb9\xae\xe8\r\xe8\xc5\xae\xb8" -"D\x16\x10\x6\xb4P\xc2\x9bul\x1d\xe7q\xb3\xff\xd0\x92\xbb\xed\x88\xc1\x31\xe5N0\x91" -"Z\xf3\x1a\x12\x9a\x15\x42o7k\x7M[\x85^\x19\x99Z\xb0\xbe\x1c\xb2\xbd\xe4#h\r&\x87" -"\xbb\xfa\x66G\xc3\x96pA/yR7:F\xc1\xf1\xad\xf9\xc2\xdc\xca\x37\xb3`#C\"\x6\xb\x38" -"\x18\xca\xcdP\x99\xc3\x80\x14\x96\xc2\xf0\xd6\x5\x61\x84$\x10\xba\xfd\x9e\xf4\xa0" -"n\xf\xa0\xbf\xb1\xae\xf8|\x81+d\xda\xae\xf7\x1\xad\x1f\xd5\x38\x10\x86\xf1\x1&28" -"\x1d\x7\xab\x95T\xd0\xac\xa3\xe\xd1\x1a \x8[\x14\x1f\x8d\x94m\x91\x83L\xbe\xce\xb0" -"\x92zp\xaa\x62\xc2\x92\xec\\'E\xa8\x1b\x9c\x8b\x9a\x90\x13 \x17*\xe1t\x1f\xaaR\xdc" -"\x9f('\xba\xc1\x8b\x1b\x5\xeb%{8\xb8\x44\xf5\xff\x4\x42\x41Y\x1f\x5+\x91h\"\"\xb3" -"\xcc+?n\xe1r\xb\x1c\xf9\xa2\x8e\\\x9b\x91\x15\x18\x45\xab[\xffte\xe1\x8f\x35\\\x0" -"\xd6W\xce\x61\xb0\xf2&\xa5\xcd\xda\xd9O\xf\xdd\xfa\xc9P>\x16\x87\xb2\xbb\xf7w\x1f" -"m\x8e\xec\x8e\xc5\xa3\x37}\xdc\xc7'X\x5\xa6\xc\xe2l\x1a\xce\x8b\xcd\x8f\x64\x6\xcb" -"\x0\xad\x46\x45]\xf9\xdf\x46\xde\xfe-\x8b?\xf7\x33\xdd\xb1\x4\x96R\x9a\xad\xee\x8b" -"\x9\xb9\xf9\xd8r\xbe\xfb\x9b\xbb(\x98X[\xf4N\xfe\"}\xf\xa9\xec\xf6\x34\x30!6`T\x89" -"\xec-$dj\x1|^\x82|\xc7\xe6\xb5'\x17{H\x1\x9c\x91\xe8,\x80\xe0\x64\x8\xccRM\xbe\x12" -"U\xdf\xab\x32\xe9\xa2\x1f\x39\x38\x32\xf1\xc7|\xdbt\xdc\x11)\xe3\xe\xb8r\xea\xf8" -"\xc0\xb1O\xbc\xb4\xc7\x7jR\xf2\xb2\xfdK\xdd\xd6%\xb1\x1f\xc2\xd7\xd7\x90\xff\x4\x15" -"\x19\xb6\xf8\x31m\xc1\x8f\x89\n\x8e\x80\xc2\xe5\xce\xe9\xfd\x19\xec\x9b\xa6;\xa9" -"\x17v\xdb&\xeb" -"\xb9`\xd3R&Z\xfa]`)w\xe9\xc\xf\x9d\xe8)\"\xa6\x9e\xe6\xaf\xfb\xd7R\x16\xc7\xf5:\xc" -"n\x11\x9bR\x4\xce\xaeJ\xd9\x94\xdb\xdb\x65\xf0i\x99\xe0`E\xdaV\x86\xe0\xf3\xd2\xbd" -"!\xbd\xd3\xf9\xce\x1c\xbc\x9b\xb6U\xf0\xd2\x95\xa7\xa4\x98qc9\x81\xd1w\xc9\xc8i4" -"Ps\x89$\xd9TG\xb9)\xb4\x63X5\xe9\xcd\xd9 \xb0\xf7\xe2\xc3*\xf5\x85\x34\xe2\xe4\x38" -"\x96\x7f\x1c\xfe\xf4\xfc\xc3l\xe\xf7?I\x99\x8c\x14\x97\xb7N\xd2\xd4\x37G\x9d\xc7" -"X\xb2\r\x8b\x8e\xcaO\x89\x36\x8b\x8dJ\xb3\xdaS\x8fo\x88\x12\xd4\xf8Z\x15\x7P%\x80" -"fvy\xf2\xb0\x65\xe3\xe8\r\xa2\xad\x87\xafZo\xc7\xe\xa1\xfd\xd2\xf2\xab\x91v\x92\xb7" -"\xb2\x92\x89v\x1Y\xa2\xcf\x95\x88\xc5\x87\x91\x10\xd4\xb2\x1e $\x1c\xc3\xb\x37\x9d" -"\x13\x85SH\x97\x0\xa0\xff\xf3\xf6\x35\xe2 w\xff\xaa$W\xa3\\\xf1\xab\xf7\xc6$\x82" -"\xf1j\xa5\xad\x99<\x8c\x1e\xfc\xa7\x9c\xf5\x18o\x1e\xe2\x82\xd3\x0\x8b\x80Z\xf\x17" -"\xed\xaa\x33\x0.iI\xa0\xb8\xc4^\xb5u\xc3\xf4\x8f\x9b\x83\x39.\xeb\x37\x96\xdf\x6" -"l\xb6\xf4\x1c.,\xdb\x39H\xd0\xab\x8a\x12\xd2\x1f\xf1qxL\xc1\r\xafJ\xf5\x38\xceg\xff" -"C\xf3\xc5 X\xedi\xc9\xea_\xe9\xcay\x94\xa9\x87\x9\x45|\x80\xdak1\xfb\x63O\xf4zZ\xa2" -"K\xe0\xcb\x39\xf9\xe\xc4\xb6\xb1\xb8\x82\xaa\xd8)\x9f\x11?\xa4\x88\x1e\xa0\xc5\xc1" -"\xae\xe1\xeeH\xc4\xed\x37\xe7\x3\xd4\n\x41\xc6\x8e\x1c\x8f\xf8\xee\x17\xdfy\xb7\xc4" -"Jv\x1a>\x94\xcdO\xcg\xddZMp\xce\xb2\xc3\x9cU\xc0\x0\x15\xb\x32\xed\x99\x38\x1c\xae" -"'n\x88\xf4\x39(\xe1\x13\xdd\xfc\x95\xd9S\xee\x30\x46\x1fY\xa2.\xb8(\x9e*BJ\x95\xf1" -"\x95\x5\x1chp\xbb\x90\x38WY\x9\x15\xc4\xca\xdb\x39\xa8\xad\x9e>8\x9d\x1a\xec\x37" -"W\x84]\xa5\x17\x65S\xc6\x1d\x88\x99l\x9d_\xe1P\x87\xd5\x1\xbd\x6\xfe\x44\x9b\xb7" -"\x85\x1cs|\x96|\x9dLT\x9\xa2\x7fp\xdb|,\xb6]?\xd0\x35(\x8eZ\xe0\xfd\xf2\xe4\rRj|" -"\x80Y4]\xda\x30\x6\x45\xa4\x5\xa5\xfd\xc\xcf\x1f\x9\x41)\x80\xff\xb/\xfbn\x81N)x" -"S\xeb>$\x3(\xcJ\xfe\x1e(~]}2\x18\xe2\x98\x62Y\x86\xfco\x7\x8b\xec\xdf\x95\xc4\xba" -"!+\x87}e\xae_a\x92\xf5\xd0\x99\x1a\x9a\x35v?\x97y>a\xa7\xf1\x2\x9f\xa5\xe9[\xdbl" -"\x9c\x8aQ\xa1~_\xa7\xe2\x8f\xdbG\xedX\xbd\x17\xf4|d5\xc9\xb4\xd9L\xab\x9bo\xe9\xaa" -"\xd8\x86n\xb4\r\xf2\xd1\xd1\xf2,\xaa\x96q&\xdf\x87\xa4\x35\xc3\x18\x6J\xa0\xb4;1" -"F$\xd6\r\x43_x\xc0\xf0\xe\x62\x39\xfe\x9OANg\xc2\x9b\xdf\xd5\x95\x8a\xf8\x3\x91\xc5" -"X+nd\x91\xf2\xd4\x89M\xa1\x15\x6\xa1\xfb\xde\x3:\xc9\\\xde{\x1d\x37k\xf5\xc2\x63" -"\x98\xb9\x9b\xf9\xdd\x95#\x85I\xee\x8b\xa1\x11\xfbx\xbd\xfcI\xd0\x5\x99\x81\x63\x64" -"P%v\xb5\x83\xc\x46\x90\x36\xac\xdd\x1f\x2\x5\xdd\xb5\xadh\xcf\x9b\xaa%vzh[\xb0S\x6" -"\x1a\x0\xd9(\xd7\x1e,B\xad\xe1\x61\xb7\xfa\xc0\xcbM\xd3\xb9&2\xd0\x93\xe2\xed\x95" -"\x90\xa2\x14\xb8\x41\xe5\x33\xc2L:\x8dg\x17\xb8\xc\xb6\x1a\x1e\xa6I9=\x83\xc0\x90" -"(\xb1\x16\xa2\xda\xd7\x14\x9b\x17z\xc0\x0\xbf\xf1\xcf\x31Sj\xee\x64\xc8\",\xf7v " -"\x86\x84\x95)\xf4\xd9\x43\xbd\xb5H\xeb\x1c(\xf1{u\xf9\xb1\xcdt\xdc\x93\xefL\xfb\xb9" -"2\xa2[_\"\xe7p\xd2p\xc7\xde*\xd9v\x92{\x8fu\x5\xc3\xfal\xc8\xba\xec\x8\xf6\xb4\x84" -"\x1f\xa8\x1d\x16`\xc7\x11\xa4\xf\xe7\xfeP)\x10)\x7\x37\x44\x41\x31\xeb\x93\x19~\xea" -"\xe8\x0\x89\xfc]2D\x0\xf2\xdcKC\xd5M5`\xbe\x9e\x8b\x9c\x1f\x96\x13<\xaa\xe4\xa4\xa1" -"P \x7f\xb\xa3+jm\xdb\xcc\x9f\xe2\xc3\x31\x3\xb1\xf7\xcc\xde\xab\xa1x\n\xf8\xfe\x61" -"c\xc5\x14?[\xa8s\x2\xde\x83\x97\xee\x8b\xde\x46\xe2\xd9\xe9\xa9:\xc8\x83\xc6xb\xc1" -"\xcd\x9a\x94j\xe0\xd5\xcdu\x9\xcdY\x14\x1d\"\xb9\xedR\xaf\x36w\xaf#\xeanC\\PU\xed" -"F\xad\xd9-+\xc6\x88\xc0\xc7\xab\xf\xe1n\xd2\x84\x98n\xe4\xa4\x18\xe5\xda\x8\xa2\xc5" -"\xc0\x63\xff\xd3NG\x2O\xd2\x83KC\x1\x33\xfe?\xa7\x86\x1e\xda\xf9%\x1a\xce\xf0-\xb3" -"\xf2\x65\x1\x12G\x5WGz\x15\xa5\x85\xa4\rRe\x1L\x12Oc\x99ye\x89\x90v\xd9\xd1!.\xeb" -"\x16J\xb0\x9e\x95\xff\x84\xc9#=\xb6uB\xad\xa3|\xe7\x9c} \x17\xe0~]=KD\x3`\xe4\x98" -"\xc1\xe\x33\x31\xda)\xfb\xff&\xde\x8c\xa7\xc5>0j\xef\xee\xbb\xc5\x15\x1a_\xa1\x90" -"Z\x94\xed\x81\xc0\xdav\x8f\xee\xc1\xb9.0f\xc3\x39\xff\xb5#$_q;\x93\xdb\xda\xb6\xa4" -"8\xfe\xbe\xfb\xa3\xa0\xd0\x86\x18n\x1d\xff\xf2\x95\x35\xe9\xa7\x13]\xb1\x1d\x34\x6" -"\xe8\xc9H&:\xac\x97\x94\xf2\xa5L:\xc3)\x86\xb5\xe3\x11\xf9\x92(NS\xee\x6\x9b\x8e" -"\xf2\xd8m\xb6\x39\xd1\xf7\xa0\x3\xcb\xbe\xdb\x1c;\xd9\xc2^\x1c\x15Vx\x12\x4o\x82" -"H\xdd;\xd7\xbo\xb4\xd0\xddoNX\xde\x66\x19\x96\x85\x81\x13(o\xcf\x45\xf7.\xa9\xd1" -"\xf1~|\\\xc9\xbfu/T\xc0M\xbd\x85\xa7-\xf2(\xed\xb1?\xb0\xd4\x99\xa0\x82\xa7/r-\x9b" -"\xacV^\xdf\xdb\xdb\xab\x1aZ\x7l\xb\x92zW,\xba\xf0\xd1\xe6Z\xeR\xac|\xa7\xea\x91\xc1" -"r\x8c\xd3\xa0\x82>\xa3M(S\x8cu\x1e\x1Nka\x19\xdbo2A\x7f\xbc\x37\xdd\x39\xf8yi\x7f" -"\xb3\x95\x3PD\xef\x92n\xe9\xb2\xf0x\xdf\x8d\x9eK\xf7\x14\x36\xe1\x90\x89\xaa\xfb" -"R\xc1\xb9i\nc\xc4!\xf0\xc2\x66\xdc\xa9\xdc\x1c\xd5\xc5\xea\xae\xf1\xb6\x63\xf=\xc1" -"\x81\xfc\x9d\xf0\x43\x9fQ)\xad\xe1\x37\xed\xf9\xaf\x0X\xec\xdb\x46\xd9M\xe2t\xae" -"\x8e\xbf\x91\x7\xaf\xb5RaV\xed\x35\x64\xfbU\xb7iu\x1c\x92\x9cX7\xf2\xd0\x17\xf6\x12" -"\"IPa]\xa2\x3\x38\xca\xe6\x36\"l\xcf\xe5\xbf\xeeL\xc1\x93UJ\xc1\x63\xe4\x93\\\xea" -"\x9b\xd1\xa7\x1apNb.\x2\xfe:eD'\x2\xf2\x46\x31\x98\x42k\x1d\xf8\x39\xeai\xc4\xaa" -"\xf9\x30\x18\x41*z\xd0H8\xf2\x0\xde\xad\x98\x17\xe1yl\xcb\xe4\xf0\x1\xe4\xec\x3\xef" -"\x16\xef\x9dkP\x18\x17\xac\xf4\xcd\x12.\xb7v\x8f\xd6\x32\xf7\x98\x92\x13\xdd(\xfd" -"\x19M?\xf8J;\xff\x1\x37s\xa7\x7f\xc\x8e\xf7\x83\xa8\x1a\xb5\xbf<\xba\xc9\x4\x19\x88" -"\xdd\xe3>\xe#\xa9\x11\x84`\xae\x8b\x14\x93q\xddN1\xcd\xee\x3\x16\x1b\x36\xa0\x85" -"\xdewO\xb4\xb7\xa2\xbf\x14\xee\xc9\xd5\x99\xf3\x99\xa8Y\x9f\x86_\xe0\xb3}\x8e" -"T]\x88=?\xc8\x33\xd9\xe6\x97\xe9+g\x19\xfeJ\xf3\xef\xaf\x93\x82\x82JK\x99\x12#\x90" -"\xb7Zo3/\xd6R\xe7\x46\xafg\xe5\xdb#\xb2:g\xe4\xb3\xb0@\xa7\xda$\xecQ\xe8\xf\xbf\xc4" -"\xf2\xf9\xe3\x62&pdO\xe1\x11\xffG\xa8 \xfe\xc5\xb7!\xb9\x44\xbb\x31\xe0\xd4\x81\xc1" -"T\xde\x1bz\xe0\xe5\x3\x8b@\x18\x38\x33\x34\x81\x81\xa7\x17|J\x2u\x1b_x\xe6\xc2\\" -"\x1d\xa2\xc1j\xe4\xf0\xc6\xdb\x5\x7f\x1cP\n\xdf\xe3$\x83\x38\n\xad\x8e\x98\r\x43" -"U!N\\?\xf2\x2\x17\xf4P\\\xf7\x8d\x9a\x39\xeb\x87\xfc\x9aG1\x16\x42\xec\x8f\xf7\xcc" -"\xa0\xf2\xe3\x8e\x99;\x4\x9c\x1e\xb3;\xaan5Q\xb5;\xa6\xf3\x39\x44'`8JEb\xc0\xd4&" -"a\xbf\x62[\xa8\xeMY1\xcb\xb8\x97\x94\x85\xa3;Xoxs0\x0\xab\x4Z\xe5J\xa1\x1b\x31\x88" -"U\x98`\x9a\xec\xf-LE\xb{\xc6\xac \x91\xc4\x85\x9b\x83\xe8\"YOYy\xda\xbb:\x6\xd1\x9a" -"d8\xf5\xf5\xdc\xd2\x6o#\xae\x1\x11\xd7t\x1f\xcd_};9\x15\xd5\xeb\x9fuEc\xda\x1/\xdb" -"\xacL\xe4?\x18\xbfm{\x5\x9aK\xee\xa6s\xf3\x1e\x8e\x7\xae\xf9\x8\x38\xf2\xe9\x8a!" -"L%\x10m]\xcd\x15\xdb\xef\x8b\x7f\xe1})~7P$\x9\x1c\xa8k\xd9\x9c\r\xe5\xa4\xbe\x1b" -"\x90\xa6q\xc4Q>\x82\xed\xd9\x42\x96\xf3\xf5\x91\x8e\xe1\x88\xe4\xc9\xc2\xdd\xd0\xf5" -"y\xfc\xa3&\x14\xbaV\xb4\x84\xbf\xf5\xa3\xea\x11\xf5\xb7n\xe7\xf5\xbf\xb1\xb8\xe1" -"\x0\xcc|I\x95s\xb9\x61\x46.VDT\xb7\xb2h\x93\xf0\xf9\x92\x9a\x9f\xde\xfa\x2\xfd\xa1" -"B\xc5.\xdb\xb9_x]\xb3\x86G\xd8vg\xc8\xe0\x95\xacw\xd9\xda\x34\x18\x7f\x84j\x16KS" -"\x7f\xec\x8c\x99\x1d+\x0\x9a\xcc,F\x88G\xf7\xd5\x98\xe1\xbe\xc5I\xb6\x81\x64\x42" -"\xd7\xb6H\x96\xd0pj\xad\x33w>\x91h;\r\x9a\x12z\xa2h\x18\x84H\x89\xdd&\xe0\x86\x9f" -"\xae\x9$\xa4\xe2\x89?b\xb\x34.\xec\xfd\\\x3.\xec\x31\\\x1b\x92\x97\xe7\x33\x81\x9b" -"\xeb\x4mP\x91p3\xe4k\x1dqqQ\x8d\xa1\x1c\xdd?k\xc0jN{0\xe4$\x2\xda\x19\x1\x30\xa7" -"\xd4\xd7\xa9\x30\x84\xdaY\xfd\xe4\x98\xf0U\x84&\xb7\xbe\x30\x1er:\xca\xfa\xa1T\x9f" -"\xa3\x41\x90Zjj\xa3m6\xcfLgx\xeb\xbd\xc7q\xc5\x33\x35~\xca]R\xa8\xe7\x87\x32\xdc" -"4\x18:\xb9\xd6\x41\xf0K\xf0\x37\x38\xa4\xbf\xa3l\xd1%s\xcb\x63U-?\x8b\xef\x43[H\x8b" -"\x7f\xfa\xec\xa0\xfbg\x13\x46\xb8\xaf\"\xbf\x63\x4\xa8\xb8\xb0v\xe5\xe0\x6\xe2\x30" -"\x9\xc9>\x7=\xf2\xa0\x1e\xbci\xc5\xbb\x80\x84\x9b\x85\xfc\x63]\xcdG\xfb\xfd(v9,\xd1" -"\xb6\x9c\xc2\x38?F\xef.\xc5/\x1e\x44\x7\x86\xe0\\\xd2\xc6g\x88\xd3\x5\xe1h\xb\xe" -"\x9f\xeb\x94OH\xa7Ph\xae\xcc)\xac\x0\x15#|4Kz\x16\xd7\x66\xf0\x45\xb1\xdc\x34\xb1" -"\x16h6@Ne\xc7\xdeP\xf3\x30\x39\x83\xf0\xb1Y\xdb\xe8\x83\xbc\xd9\xf1]\xd4\xb0\xf3" -"O\xe1N?Ee\x92<\xaaz\xd7\x10p\x10Q\xb3\x86\xf8g\x19\xb3H\xc5\x9c\x9f\xe2\xee\xf3J" -"\x16\xfe\xe\x33\xb0?\xe5m\xf6\x65S\xbc\xb\x30\xdb;\x96\xa1\x1a\xe8\xe2\xcc\x36u\x4" -"\xe9\xf9\x11)\x1e\xea+\x92\xf6\nZ\x9d\x92\x2\xc1R\x9f\x39\xbc\xa8\x61\xbc\x37\xc5" -"`)\xbf\xbcp\xd3\x9e\x66\x34\xb1\x1b\xad\xcamx\xf7\xb8\xc7\xce\xfb\xf8\x1\x32wp=\xfb" -";\xbn-?\xef\xc6\xa5W\xe1K\xfe\xd0*8\xd6\x13\x43=\xbd\"\xfd\xa5\xa8\xe7\x9e\x0\x98" -"\x82\x62>\xb8im\x9dr\x9f\x92\"\x1c\xf0\xde\x45\n\x97\xd5\xe5\xbd\xf4\xc2\x6=\xd5" -"\xbc\x62\x15#\x8\x94\xacoe>\x99]\xc6\x1a\xd8\xc\xc5U\xa9G\x96\x5\xd2\xfc\x42Vi\x8b" -"\xd3\x17u\xf9\xff\xee\xfb-\x8aR\xa5\x15=Z\x92p\x11\xcb\xc-\xcck8\xe\xad\x6RtKL\xdb" -"W\xcd}\x98\x81\xe8\x5i\xff\\\x83\xe9\xabT\xf8I\x16]z\xef\x96\x7i\xf0\x92\xc0\xc1" -"\xe4@\xc3];\xe6W\xe7\xbb\x88\xcd\x61\x19\x31\xbJwu\xe7\xe5_\x13\xd8\xc2\x81(\x1b" -"\xaa\x65\x16\x43z\xbe\x9d\x90\x2\xc6q7#\x9d\xae@\xd9\xe4\xedlj\xde#\xbcnk=,\xb0g" -"=\x18y\xf8\xb3\xe5\x89\x85\x9c\x9d,#\x89\xdb\xed\xd2p\xe6J\x3(\xb7\xad\x43\xe4Z\xea" -"\xe5\xac\xea\xe5S\x9e\xc0\x18\xbb`\x3\x92\xba\xaa\xef\xd5\xf\xc1m\xe0\x1a\x18-\x94" -"z\xef\x11Z\xa3\xd5\x32\xbfW\xb7\xc1\"R\xe8\xf0\xda\x91\x8f\xbfqh\n\xb5\xc\xff\xcd" -"a9u'\xf2\xcc\x1\xed\xef\xcbG\x6\xf3\x4\xed/\x8f\xb4`\xc2\xf9)yv*}\x98\xc8Q%i\x9f" -"\x14\xec&C\xf6\x90\xe6\xe5\x1d\x94|'\xca\xe3n\xc6G\xe1\x82\x3\x99\x86h\r\x2\x90v" -"\xf|\x95\xf8+\xb0.\xe9%TH\xb7\xa2_o\x80\xd5\xb5\r\x31\x39\x82~\xc5\xc1\xab\xe6_\xda" -"\xe\xfaS]<\xf2\x1b\x4L\xe9\xc\x8b\x7fK\x8d\xa3\xca\x38$\xab\n~\x87\xf3\\\xdb\x35" -"\x1du\x85\xbf\xa7\xaf\xfc\x1cM\xev\xec\xfan\x3\xdf\x84\xe2gN,@\x1\xa3\x18?\xbc\xfa" -"\xe9\xc9\xb9\x6\xd2\xc2o\xbc\xd0OpL.\xad\xa7p\x12\xfb`\xc5\xe2\x92L\xa2\\\x19\x8b" -"Qf\xf5n\xe9\xe3L\xb6\xe7G\x89\xd8 \xec\x41\xc3\xe1\xd1\xbf\x38\xc7Q\xba\x9d\xa7\xfd" -"\xb9\xcc\n\x38\xcdO\x8a\xa4\xa1\x9f\xf3Geh\xe8&\xcb\x9d\xf6\x10\xbf\x96\x9c\x3\xea" -"SNm\n-\x97}\x81\xf5\x66\x32\x43\xd5\xba\xe8'\xf8\x5\xb\xeek7\xe1\x1f\r\xfd\xfe %" -"S+\x6\x39G\x1a\x46Y\xba B\xc4lD\xe3[\xb1\x34\xf3\xe6\xcf\xf4 ,\xcblg\x83\x61i\x9" -"(\xe6\x99\x83\xac\x90\x7f\xfbi\xbe\xdahg\xf5-%<\x12\x63'5\xc9\x9c\xd1qoF\xe8\xb9" -"\xb5\x96\xfc\x1b>l\xda\xe8\xbe\x34\xac\xe2\x98|eF\xebN\xdf\xc0\x9d\xabH\x9eO\xaf" -"\x9eN\xff\x9eP\xfb\x89\x5\x96g9\xae\x94\xfdP\xe3\xfaz\x8ak\xe0T\xb8\xb2U\x9\xbc\xc5" -"B\xf8x0\xc6\x1d\x38\x5\xd5\x98\x93\xaf\xb5\x96\xc5W\x8d}\xee`\xf1\xe6\xc9\xc8,`7" -"b6\xc2\x12\xc4\xb1\x36h(\xb8\xac\x8d\xa8\x9fN\xf1|8\xd8\xb0\xfe\xb4\x65|\x95\xd7" -"c(QqW\x3\xdb\xbf\x11\x63y\xa3\x38R\xf8\x85LH\x8a\x1\xe7\xad\x81l0B\xf\\\x12O+\xf1" -"`\xfeH&\x16\x9b\x97\x85\xb5GX\x0\x33\x64\xe1\x32\xd2<1\xa2vr\xb7u\xb5\\\x89;\xac" -"B\xd0X-tc!\xac{a$r\xa8\xb1\xa6\x37\xcc\xd0h\xa8gs\x6u\xeb\xd1\xb6\x0\xf2\x37\x65" -"T\xdd\xdb}\rt#\xf8\x4\xb3\x4T\xd4\xddz\xaa\xa8\xd7\xf9}S\xd8\xce\xe2\x36\x37t\xd7" -"\xe6\xb2\x81=\xa6\x4!Z\x8b>a\xcf\xf1h\x1rviT\xc2\xc5\xbf#N\x98M\xd8\x9b\x18\xfb\x95" -"}\x81~\x89\x95LE\xf1\xff\x8aT>\x84\xfa\xc6\x31q\xc6\x9a\xda\x1TLn\xd7L\\\xa2\x84" -"\xbb|\x96\x82\x8a\xb2\xc3s\x8\xd9#rw\xb2\x1esW\x14UM\xc0\xb9\xcb\x96N[8\xfxW\xe9" -"\xe1rO?\xf6,\xd5\xe1r\xa3\x62\x18\xf1\x1\x7fT\xe2\xf2\x7f\x8\x1bN\x7\xa8\xa3\x6\xd4" -"\x99K\xef\xc3\x37K\x7\xd7&\x14X\xc7\xa6)\xdd]#i \xdf\x81\xa8\xcd&\x98Y\x19\xaaY\x8f" -"\xa2u^\xec\x82\x12\xf9\xd2)\xb3.\xd5\xaa\x83U\x1f\xc4\xd6\x97\xef\xc\xfaTa\x16\x1e" -"i\xd1\x6\x7\xf4^\x84$Jy\x9b\xad\x91\x31#[\xc6\xf7\xb1\xa3\xb6\xcc\r\x85+\xd5\x99" -"\xd8Ti\xbb\x9a\xa6\x16\x61\xd8\n\xf8\xd4n\xc1\x1e\xb4\x91Z&Q,\x0\x8\xc4\xca\x38." -"\xb6\xcd\x1aRa|\x93\x16]\xed\xc\x90\xcdt\x7\xfer*\xfc*[\x92j#\xf5\x4W\x85\x96+;w" -"I\x95\xe4\xe3\x8b\x64!}\xcbP\x17\xfd\x38\xb2W_\xa0L{<\xc0\xb5\x1f|\x90\xd7\xe8\xfe" -"\x89\xb3^So\x6\xb4\xf3\x1b\xdb\xcc\x31\x6[\xdd\xc8\x9a\xb\n\xbck\\*+\x8M\xee\xd7" -"t\xdd\xc0\xf2X\xca\x9a\x9\xa7\x95\xe5\x32\xe6\x62\xd7hR\xc7\xc2[\xeb\x9bqU\xf1*\xab" -"\xd7V\xb3\xee\xe3\xaai?\x7f\x96\"\x8a\xca\x62\xef;rP\x85\xb3\x9c\xa0\x35\xa8P\xf" -"D\xd4\xcf\xb2\x10\x64\x6\xc1N6\x1f\x85\x3\xc2\xcd\xffN:v\x1d\xf6\xd6\xfd\xdb\x90" -"\xfd\xb3\x94\xc6\xee\xe6\xa8\x34\xba\x66\x3>Y^\xd5\xdd\xec\xb4\xf4\xa6z\xe6\xb9\r" -"\xea\x98qbp\xbe\x19\xd8\x16\x7NNO9\x84q\xfd\xbe\x9c\xb0\x95\x41\xaa\x96\x8d\xdc\xba" -"\x9e\xe6\x34S$6`[hF\xfe\x94\xae\x1(DfHo\xe3X\xa3\xd7v$\x8f\xd5~\x5\xdf\x94\xe8\x44" -"w\x1ak\"\xab\x13\xd3N\x96w,A\x93\xeaN\xe2sM\x9tQb\xb5\x33i\xc5\xcdg\xad:}\x85\xac" -":\x1f\xe8\xbf\x3\xf\x62pu\xb1\x41\xd3\xe\xf2\xf3H\xf0\x32\x38X\xb2=\x9d{\xa8\x8b\x9a\xa2\xaa/%<" -"\x12J\x1f\xd2\xab-+\x9b\x1b\x8d\xf9\x8b\x84};\xfb\xd8\xbb\x13\x14\x65\x88\x9b\x19" -"P}\x85\\\xac\x90\x33\xb\xcb>\xd2\xc\xb5\xf\xbe/\xb9\xf3\xf3[j\xcao\x90\x9e\xf4&x" -"\xa3\xd4s\xbet\x15\x4\x90TiO\xbfg\x1e\x38\xfe\x65\x64\x1e~$\xc0\x14N\xa2\x8d\xe8" -"\xb8Q\xf5\xefG\xe5<\xc1\xad\xed\x9a;\x94L&!3\x87\x89\xd0\x38\xa1\xec\x95]\x93k\xba" -"aw\x95\xfdO\xe5\x17\x17\xdf_\x8a.9\xf4\x15\x35\xf6\xc7\x87\xbe\xdf\xc2\xae\xd4\x37" -"\xd0\xeb\x81\x1c\x91\xcd\x1a\x14_\x4?,\xe7\x6\xe3\x9f\x30j\x92\xb1P\x1c\xd2\x39t" -"\xe7mD\xdc\xe1\xac\x81\xce\x96\xfc\x8bX>V\x5\x33\x35v\x12pe.K\"\xa3\xd7\x12\xb2\xe6" -"\x1e\xa2/N\xdd/\xe0K\xe1\\>\x9a\x8e\x9f\x44\xd4\xfe\x90\xf3\xf7P\x9a\x62\x8a\xf4" -"\xb4\xde\x43\x15h> M_H\xf\x8f\xc9\x14\xbc\x96>\x12\xf\x1d\x16\xben\xcc\x92\xa7\xe3" -")s\xcc\xb5\xbaq]pj\xc8\x6^\xda\xfb\xbe*\x91\x64\xe9\x8a\x8bpa\x87\xb3\xbe\x7|\x9" -"\xf7G\x82\x85\xbe\x1b\x1b\xa0\x89\xec\xeblbk\xcd|\\L\x2\x62\x9d\x7\x8e\x9a\x93\xf4" -"\xe2\x2)\x12\x1frz\xa8\x1c\xa6\xac\xca\xe5\x86\xab\xb3\xc0\xae\x2\x16\xf6\x1e\xb0" -"\xb1^\xfa\x96\xfaPaj\xb0\xa2Y\x1e\xdd{J\xb0\x9a\xc8}\\$\xde\x37H\x92\xa6\x8e\x2j" -"y\x1b\x45\xef\x30\x8\xff\xcc\x6R_\xf8\xb5\xf5\x46]\xeb\xcd\xd0\xc6w/3vW\x17W\x1d" -"\xc2\xaa\xb6\x61W\x99R\xcb}\\JIF\x14\xbf\xe5\\\xb5\x1b\xfc\x82\n\x9'\xae\xc3\xf4" -"\xca\xfaSm\x98-\xd9m\xbeG\x88\xb8&.j_\xea\x61\xbf\xbdj\x80\x94|\xfb\xe5\x38\xc7\x17" -"\xd4p\x1fu\x80\x31\xb9\xeb\xf8Y\xcaq\x97\\q\x14\x84\xb3*\x6GW`};\xe6\xfa\x32\x1a" -">\x1\x89\xc3\xd5\xf9\x16\xd6\xc1'Q\xc0\x64\x41\xfd\xd8\x33\x14\xe3\xeb\xa0\xa2)\xa2" -"\xa6v0Z\x13\xe1\x9e\xb6#\x93\x8\xdd\xbb\xdb\xbd\x38\xa5V\x17\xbc\xd4\x82>G\xb0y\x3" -"\xe1\x8cn\x83\xf8]U}\x1f\x15\x9d\xf6\xce?\xcd\x63\xf1\x82\xbc\x45\xd0\xb6\x8f\xe3" -"\xab\xf1\x19\x7f\xb2\xb0xI\xc5\xa5Q\xacJ}3r\xd3o\xd0\"\xe\xf3\xeb\x16{\xcd\x95Xi" -"\xb8\x5\x87\xd1p=\x8f\xe7vA\x18\xbd\xd2t\x8\x1c\x8d\xd5\xad\x8d \xda\x66\xa4k\xc2" -"\x96\xc7\x80\x7\x88\xff\xe2\x1eR\x10\xa7\x8f\x16\x7f\x38r\xde\xfa;\xe5;\xf\xd0\xd4" -"7\x18\x7\x16\x1b\xe1/\xae\x19V\xe2\"\x45l\x99|\xe5. \xf3\x65H\x8e/h+}\xce\xde\xa4" -"\xff\xd4v\xb1\xfc\xe\xff\x1fL\xacVS\nE\x9f\xbfm*\x80V\xed\xdc!\x1e\xd4k1Q\xbd\xa1" -"\xda:\xb\x81\xa3Z8C\xf0vL\x9c\xe8\x36i\x11q\xe3v\"\xda.\xe\x8e\xd2~\x9c\x66\xef\\" -"\"\n\xc2\x31\xb2\x8b/V6#\x1f=\x7v\x95\xd8\xfa\x5\xbc\x3K\x13\x90\xd7\xdf\xe1KuG\xc2" -",>\xff\x1b\x8d\xa0\xed\x34\xa1\x3\x64\x15\xfa\x35\xc8:A\x1c\x88\xfb\x5\xa2\xb4\xaf" -"7\xc2 \x94->\xferF\xa1qH\xdd\x97\xbf\r\x1dN\xe1\xee\x89\xb5W8\xb7\x16\xee\x1\x1a" -"3(3\x82 D-\x84|i\xd6\xaf\x46\xe8]\x17~0\xc7\xe9\xc5\xd9-\xe6\x1a\xde\xc5\x65\x10" -"1R\x80\xf3\xb7\xf4\xb0p}7\x9b\xde\x95U\x8d\x16\x8cP\xfa$\x2\x15\x9a\xe8\x9a!\x8a" -"\xc9_\xb9\x82\xfc-N\xe8w\x9f\xb0\xb9i\xd9N\x97\xc4\xce\x94\x93p\x94\xd2\xc3\x0\x96" -"\xcd\xb4;5\x7f\x11\xdc\xba\xc4\xd8\xe0\x2\xe3\xa6\xeb\xa6=\xaa\x9ew\xf1\xdc\x14\x88" -"0\x86\"W\xa1\xb0~\r\xbf$\xc6\x8\xf3x\xf9!hj\xe2\xc6|d\xc6\xc3|d1\r\xd0\x84\xe\xe5" -"\x94\x9d]\x1a~$p\x9\x19\xee\xdfx\"[F\x12p\xd1\xf1\x6]\xe7'J\x17J\xc4\x98\x1e\x93" -"\xa8\xd6\xb#\xa7\x31\x96\x39\xdf\x9d\xe8\xce\x8c\xe5\xde\\\x3I\xdb\x11\xa9\xd5\x84" -"\xc5\x8d\xc5\xd5>\xeb\x44\x9\x10\x36\x1e\x8b\x43\x44\xa1\xc8\x1d\x99\x38\x94\n\x90" -"f=\xcd)\x1a\x16+xd\xb9\xc0R\xe4]M\xa7\x11+\xd2\x44\x99\x0gp@\xd3\xce\x35\xc1\x8\xfa" -"Y\xb2\xa1\xa5\x10\xc8\xa2\x81\xbd\xb3hx\xb7\xf8\xf3\x9bJ\xa8\xa1\x1\xd9#GBI\x85\x87" -"7\xf2T\xe3\xcdut\x90Z=\x6\xf3\x17\x3(K\xf3\xe3\xbd\xb1X\xae\x44\x8esh>\x1b\x14h:" -"u\x9d\xb6Z\xca]\xf\xe6!P5,\x9dG\xd8\x61\\\x65\x97\xd8GT\xbf\x2\xf2\x1\xb7\x65\xcc" -"x\xf3\xa0O\xe0\xa7\x97\x8\x44/\xb2\xf6\xda\x97\xc5\xfc\xa3\xc0\xdbP\xb8\xeb;\x82" -"\xee\xbcPO\xb0\xcc\x42\xb&~.\xe5\x1d\x82\xef\xbc\x8f\x30\xd4\x38\xa0\xc0\x2]\x8a" -"\xdf\xb)\xed\xdf\x42\x16m\x95\xe8\xc4o\xeb\x63,\xfb^\xfd\x96\x80\x11\x9d\x1e\x38" -"\x8Q\xd2\xde\x3\xea\x38]\xc0(U!\xb9\x85\x9d%\xd8\x43\x15\x15\x19\xc5\xfaK~\xed\xdc" -"\x81\x96H\xdd\x8f\x9c\x17\x19\xd1\x8f\x34\xd0 U\x85\x84\x8c\x95(=H\xc5;\xee\x86G" -"\x1c\x81\xd4\xf0U1\xfb\x44v\xfe\x8W\xd7\x1cW|\x13:%\x84\x38\x43p8#R\xec\xe2y\x8f" -"\x16`\xa2T6\xdd\xc4\xb\x94\x7j\x9d\x14\xba-\xf0\x4n\xd9\x16\xe8\xf0v\xe8\xe7\"`e" -"E\xf9\xc4J6Y\x1b\xb1\xbd\xe1\xa2\x3\x8c\xcc\x14\x1f\xab\x66P\x86:\x10\x1d\xb6\xbd" -"\xcb\x95\x8a\x1f\x42\xe5\x96\x1c\x10\xc9x\xc0\xa6\xb6/\xfe\xd9kL\xf7_T\x82>\x9a\xb5" -"{! \xbe\x1f\xbb\x8f]\xe4\xc0\xf1N\x16\x9H\xa5K\xd0\xa3\xe9\x8\xca\xeb\x64\xb5h\xfc" -"*\x4\x39\x83\xe6\x61\xd7]\xad\x80\x65\x1fj\xb9\xdb/\xc\xae\xb\x81#\xa7\xfe\x9dj$" -"\x2\x99\r\"i\x2X\xfbjd\x97\xa1\x35*V\x8f\xb7\x8c\xcd^`\xae" -"\xca\x9\xf9\xcc\xccY\x11v\r\x82\\Y]\xdf_8\x91\x61\r\xe8\xeb\x35\x13\xdeGRmk\x88\xee" -"\x8e\xff\xd3\\\x16*\xe7\xd0\xfc/k\xb5\xfd\xeaO\xdb\x0y\x2\x7\xd7y_\xb3\xba\xa3\xf8" -"B\xa5\xd0\x1a}\xfc\x41\xea\xf3R!\x91\xb8Zd\xe6u\xd6\xcc\xf6y\xb6]\xf5\xe6Y\xc3\xcb" -"\xbe\x3\xfb\xe7M\xc0\xb8XS\xd5\x63\x92\xbe\x16^L\x8e\x8f\x9b\xfb\xe6G|\xd9\xa3g\x8f" -"P\x89\x44\x99\xd5\x1c\x15\xb7\xed\xd4\xf4\xec\xdfy\xa1R\xa9#;\xfc\xb1!=\xcb\xab\xa9" -"\xbd!k\x83$\x1e\x9c\xd5\x9\xaa\x1d\x8a\x34=R7\xa5\xb0\x91M:\x84\xd3\xb9lW$\xbe=r" -"\xe5\xf5/\\\xb\x82d\xc1*\xc9" -"3\x5\x95\x7\xf9gDS\xdc\x18v\x11\xd9{\x8c\xcbs\x1e\xd5\x91\x9d\xda/\xa9\xca\xdc\x16" -"\xae\xec,\xc1\xa4P\xc0\xf5\xd1tN\xc3\xcb\xbb\xb2\xe3\x13\x36\xe9\x8ez\xa2\xd9\xb1" -"'zy\xd9\x42\x39\x16\xc9\x15\xe6\xc6\xb5\x1/\xd5\x7\x92\x44#\xdc\xd5\x5K\xc4\xe3\x95" -"-B&Ji\x85k\xe4\xbf\xd2\x66\x88T\x93\xab\n\xae{W-\x17\x1)5\xca\xf8;\xfb\x88\x1d.x" -"\xd0i\xd8ji`\x81\xd3\x1f\xc3#\xe1\x87\x1e\xe4\x41\x97rj=k\xc3:\x1c\x95\xe5%\xcd\xb5" -"Z\x91\r\x6\xe6\x8f\x90\xe4R\x5#\xad\x8c\x1e\x82\xc5\x42\xc3\xc3\xd6\x85!<\xda\xde" -"\\\xcc\xeb%\x92\x98v\x8ct-\x7\x98\x1e_\xed\xc1\x42\x4IZ#t\x92\x10\x37\x35\xda\xe" -"\x99\xe1\xf9\xc7>\xee\x0\x33\xcd\x36\x9f\xac\x43\xa2\r\xb2y\xca\xaa\x91\x37\x88\xcb" -"W\xcc\x87\x93\x83\x14\xcf\x80\xf4#\xfc\xfd^\x87\x1f\x31\x83/A\xc7\xa4z\x84\xaa\x15" -"\xf1\x1\xf4\x1c \xf\xea\xd5\n\xc4\x35[\xa8\xa3\x0Q\xb\x8c\x9e\x9c\xa6\x80\xda\x9a" -")9\xd1(\xe6j\xe1&\xb9\x18\xd5\x62\xbf}\xdf\xcbqC4\xc3\xb5\xb\xf9 \xc\x17\xe7P7\x9b\xa9\xaf" -"h\x98\xe4SG\x7f\xb3\x38W\xa3v\xc6\xb3=\xe0\x1c\xf8|-\xcd\xe5\xaa\xe6\r\x1\xc5\x91" -"\xdd\xa0\x87SA5\x8dv\xb0\xc5V[o\xf9\xa6N\xc3}\\\xa4\x1b\x98\xa4\xc4\xe7\x87\x9fR" -"%a\xcbZ:\xe9&2m?\x8dr\xa6t\xc3\xd6\x61v\xcc=\xd4\xdf\xec\xb4\x44|2\xa8\x8c\x9c\xc7" -"W\x91]\x1c\")\x18r\x0)T\x1c\x41\xa7\x65\xabR0\xb6\x17s{\xdb,\x7f\xce\x42\x12\x5g\xb\x90\x9a\xb7\xd6\xd7NTq\xaf" -".d\xa4\xb8\xf5\x6[\xe3_\xc8\xb\xd6\x42\xf3[7ia\x99\x8L\xf8\xeb\xb3\x81\x41!\xa2\xb9" -" |\x12\x32\xfcz\x1f\xd5\xa4\xc1\xc5U\x89\x17\xc6\xba \xc2\xe6\xc9\x1d\x13\x63\xa3" -"\xe1K\xc9+\xb6\xc7\xfb\x61\xc0\x3\xdf`\x14\xe1\xf1\xbf\xe5\xe3\xa2\xf0\x87^\x8f," -"\xf4.\x6i\xd9O\xd4|\xa6\xc1\xe6\xb6\xe3uW4@\xd9q=\xac\xefi\xed\xd2\xe5\xc1\xbe\xc8" -"[I\x93\xed\xb4tY+\xbf\x15\x93\xdeO\xe4\xe9\xc9\xff\xf7\r\x1ck\xefo\xa3\xcfM\xb2\x13" -"\x95\x89g\xa9\xf\n\xd2\x64\x81\x85\x94\xa1\x92\xb8\x83\xa2U\xd8O\xc5\xca\xa8\xc5" -"\xdf\x35Y\xa8\x15\x8a\xc9\x11\xcd#\x9f\xd1m\x19\xc9\xfe\xb4\x1b\x1bK\xee\"\xc9\x9c" -"\xa2\xae\xf4\xa9\xdc\xa9\xcd|1\xa8\xd8\xbb\x1h\xc0\x31G\xc1\x90\x89\xf3\x93!\xfd" -"\xfd\xe1J\x97{5rsU\x84\xb3\x6\x82<\xc3\x65t\x3\x43\x31\xf0hz\x89\x81\xc2\x12\x1d" -"\x1b\xcfn\xa5\x9a\"?R\xeaq\x95\xb7\x3\xc\x9c\xe\xdb\x31\x9b\x85%\xb9\xe9%\x38_\x7f" -"\xfft\x13QQ\x8d\xb7\x14s\xbcYFX\xdc\xf4M\xf7l\xf2]\x11\x8d\x44r&3q`\xf\xfc\xb3\xbf" -" \xc6\xa3{\xbcj\x13\xf0\x99\xfe\xa7\xe5r)\x8e*\xf1\xea\x1c\xfe\xca\x85\xe7x \xea" -"p\x1f\xc4@\xf2-\xd8\x7fo\xe0\xb0\x96\xb\xf0\xaa\xaa\x12\x9b\x10\xdaN\xd2\x7f\xb2" -";\xd8YMSJ\xb7v\xa6\x36\x42\x93K\xb\x6\xa6\xdb\xb7\x85$r\xe3\xc5\x82\x90\xb7\x8f\xe4" -"\xca\xfe\x84\xeb\xb9{\x89\x94\x98\x99\xa7\xed\x18\xcf\xeeP\xb-\x13\x81\x90\xe8\x9" -"\x84\xfbU^\xcb*O\xbd\xdaL$ a\x94\xd5\xaa|A,\xc9!\x13\x39\xf8\xf6x\xb1\xad\xc9N;\x8" -"\xd6*\xb5\x0\xb9\x92\xb9\x35\xf7;\x9ct\x12p+\x6\xd6\xd0\x36\xb6\x8\xb3YHI'\xefV)" -"f\xae\x7f&\xb9\xce\x37\x9f\x97W\x10\xcc#\x16P\xe\x37W\xc\xa2\x1a(\xe9`\x19\x5\x39" -"\x85P\xc2\x1d\x13\x12_\x9f\x46\x65\xec\xbd\xba\x9a'\xb0o\x9b\xca\x8\x61\x1b\x1c\x86" -"DE\xe4u\xc5\x91\x66\xfa{\xfc\"\xc4\xbd\xdau\xf3\"w\xa9=-\x90\xd3\xf7Rpq\xfa\xe6#" -",\xd8\xd4\xb0\xac\x81\xe9\xfek\xf6I\x80\xe3\xe5\x82\xa7\xa1\xddg\x92\x9e(\x17\x9a" -"\xe7t\x4w?\x92\xb7\x41\xcdM5\xea>\x7fZ`v\x9\xeum^/\x1bQ\xce\x99\x88s\x6z\x15\xfb" -"\x14\xb2\x16\x4\x18\xcf\xd0%\x97t\xb3\x32\xac\x12K\x90\x8d\xe7\xa3\xae\x62\x8b\xf9" -"|.\x9a\x86xu\xe4\xb2\xd8X\x4\xfe\xfbZ\x88\xfeZ\xce\xfe=[\xa2\xc5:\x1f\xf9\x83\x81" -"\x16k|\xbd\x1c\xcf\x90\x15\xd9:\x7L\xfh\x88\x32^\x2\x90^rs\x91t\xf0\x1d\xdb\xa1\xff" -"\x1f\x66\xfbh\x1e\xf2\xa2\xfb\xd2:\xf6\xb8\xaf\x8cvk&\x94\xbb\xce\x32\x39\xb9t\x82" -"X\x9d\x31\x99\xb1\x36\xe4LT\xec\x34\x8a\x1b\x9dV\x99\x93\x81sN\xfaJ\x8c\x8a\x39\"" -"yWX\xd9\x9b\xb0\x1c^z\xc7\xc9\xe0GA\xb9\x36\x96\x9dw\x16\x12\xbc\xf9)\xe7\x0\x34" -"\xef\x9dx\x9a\x66\x87\xee\x9dq{\xca\x31\x39\xe1\xb1\xae\xfb\x9e\x13#\xe9\xb8\xbe" -"uP\xf3H\xe\xeeJ\xf7\"\xbc\xd7\x80\x8e!\x10@+\xc1\xdf\x63\x1a\"\x88\xe9n\xf8\xd8\xc1" -"Z\xde\x87\xf2\xe2\n\xee\x9ejW\xd4\n\xc4\xda\x8!V$\xc7\x65\x6N\x9d/F\x89\xf6\xb6\x41" -"\xf0\xeb\x32\xc0\r=M\x93\x62\x98\xe9\xfb\x0\x10\n\x93\r\x9\x32\xf2\\\x19O\x9d\xfd" -"\xa3\x96\xe\xd8\xd3\x15\x86_\x17:Q=L\xfa\x9e\xd3\x9a\xaa\x9\x90\x35\x85!\x89\xd2" -"`\xeb\xcG\x7\xb;\x8f*|\xa3k\xfd\x7\xc1%M\x90\x95\xde\xa7#8\xc7]\xbd\x8bj\x0\xf0*" -"io\xe6o\x85\xc8\n=ZU\x19\x4Q6\xcc\xb4S(\xf\x91V\x8j;\x8f\xb4\xd3\x63\x94\xa2h\xa0" -"yBK\x1d/\xb7\x85\x36\r\x7\xaaH\xda\xd4\xdf\x45\xe5\xa8\x86\xe6\xad\xc9\x9c+9Ph\xe4" -"\xdf\xa3\xf3\x1f(\xcd\x81\xe2\xe4L\xf\x35\xc5#\x0\xb1\x8f\xbd\xdc\xd8\xcd\xe4\x82" -"\xb7\xba\x91\x38G\xf5\x1\x89\x10\xbaZ\xa8\xd6\x8a\xbe\x46Y\xa2\xdd_\xfd\xa1\x2\x99" -"\xc\x1\xcf\xb2\xdd\x16\xc9\xedpa\xf5[\x12\x42\xafn\xfa\x7f\x61\x7\xa3\xf\x4\x96w" -"\xfe\xc3vM\xe4\x94\n\xc6\x62?\x3`\xfZ\xe\x17\x3\x98\xbd\x9-\xcb,t\xea\x9c\x9d\xd1" -"Ii\xcb\x63\"\xd3\xcb\xd3\x9c\xb7\x32\xbb{\xf3\xa0\xe8R0\x9\xb3\xbd\x1e\x39wB\xde" -"\xa6\xfe\x12PW.\xfb\xdb\xe4\x15\xab\xa3V\xea\x92\x9f\x6\xda\xb0\xb6\xb3\xa2\x8f\x65" -"e\xb6\xed/\xe7\xa4\xfd\xen*\xd2\xa4\xc2\x7f\xb9\xc0\x39M/'\x18\xc5.|\xfc\xce\x39" -"\xc5\xce?\xbe#\xf2\xac\x7\xc6\xbax\x17\x44\xa1\x6\x12\xf2\xdcM\x8a\x93\x83\xe\x43" -"\x17>\xd5I]-\xf\x1\xccL\\3\\\x14\xfa\x7\xd4q\x1e\xea\xd4I@\xbf\xd7\x88\xf2\x95N\xc9" -"\"\xac\x32\xe3 \xc6\xf2\xec#\xd5\x11M\xd2\x38\xd2o\xf2\x9fN[\xf6:\x1f\x3\xbb\xde" -"\xb8&\x9f\x36\x8\xc3\x45\xe2\x15l\xd3\x42rc\xe4\x43}\xcc`\xd7\xc9T\x3\x5K\x84\xd5" -"\x9c\x83\xeb<\xe9\x7f\xebV\xa6\xd2l\xf5\xa0`w\xa2\xdf\xdb$\x0\x37\xac\x30\xd4\x33" -"|\xf1\xd0\xd6\x1b\xa6\x1a\xd8\x8a+\x90,q^\xcc\xdd\x8e\x80\x11\x8b\xf9\xce\xb6\x88" -"%\xf3\xd4\"\x93\x12\x99X\x17\x96\xf7u\xc3\xd1\xd4\xda\xb0\x2)j\x9fmC\xc7\x89\x5\xba" -"NH\xd8h\xe1\xdf\xcd\x61y$3\x99\xafPL\xb\x61\xdd\x32\xfa\x99K\xc6\x39\x1b\\\x35-F" -"\x16\xfn\x1f|\"\x19\xd3\x87\xe0No\xa6\xdc\x8c\xb\x84\xed\xb8\x94\xb\xb2\xaa\x1c\x3" -"\x7\x7f\xae\xbb\xba\xa2\x36\x11\xa9+^\xeeN\xe6\xfbv\xf1v\xb8\xfa \x1dk\xdb;\x8e\xec" -"fA\xd9\xb7w\x17'\xfeq\xd1&\xe0\x7\x9c\xc9\x14\x8a\xa4X\xea\xd2\xf0|/f9\xa8s\x9a\xe9" -"\xb1\xc6\x89#\xa9%\x14\x91\x4+\xbb\xe9\x9f\xafkP\xd6q)\xd2s\xf1k\x9~\xab\xe8\x81" -"~=\xaeO \"\xf8\x63\xd8\xec\x96J\xac,'\xbd\x99\x9a\x85\xa5\x7\x91\xa7&\xbbt\x8c\xe9" -"\x2\x98U\x80\xe8\xb5;=\x1b\xbd\x99#;}T\x1f\x8c\x9e\xdc\x8d\xe0\x4kWh\xd6\xc8\xb1" -"\xff\xd2\x12\x97\x14\x82\xd5\xa3n\xb1\x43\x32\xb3\xd6\xd7\x1b\x96\xf2\x8c\xe6\x9b" -"\xb1zZQ\x8a\xd5\xde\xdazG\xe2\x10n\xa3R\xe9$\x8c!\x91(\xfc^\x97O\xe4\x12\xb7\x84" -"\xf\x1d\xfc\x5\xac\x9a\x8c\xc3$\x2\x14\x6Q\xe5;\xf\x9d\x94V\xf0N\xfbY\xae\xba\x33" -"\xdd\x8[z.\xf8\xd4N\x14\x1b\xb8\x62\xc6\xbd?\x95\x8d\x5o\x9d\x61\x30\x98\xd9\xe\xe8" -"\xed\xbc\x9:\x1f\xd2\x66\xa5\x1b\xb8N\xc\x6#+\x8c\\I\xe3\x3\x8e\x89\x64\x96\x1\xe3" -"\xe5?K\xff\x8b\xca\x4\x0^rz\xd0K*\xfbS\xcbY\x8O\xe6\x98\x7\xbc_7\xc3\xda\x82K\x93" -"&\xfbS\xc7\x90\xc5\xf8p}g\xca\xd2\xbd\xb7;\xf1V\x1\xed\xa8\xc6<\xa0q\x9a\x42\x9d" -"+\xda\xe4)\x14\xbq\x6\xee\xe3%\xbd\xc4\xcf\xa1\xdbG\xf1\xe7\x90Y\xc6\x45'\xa2\x62" -"\x86\xadt\x8ay/\xf5\xce}\xdc\x9biaV\xef\x3\xfb~\xf7\x34\x37\xee%\xd5\x37\xb8K!\x8a" -"\xe2z{\xc7\x42\x16\xb4\x90\xc3\xa0\x83\x36k1\x14\xe9\x99\xca[\x80Ml\x16\xca\xef\x84" -"\xf7\x12\x88yS;\xf5\xa0?\x88\x41\x8f_\x19\x8a\xc0o\xd9\x35\xc5\xf0\r\xf6\x45\x6x" -"=\x84\x81\xccG\x8x-\x95\xf5\x7f\xc8\x8e\x1b\xbb\xe7\\\x4\xda\x44 \xc\xc5\x1\x44\x19" -"\xad:\xe2\xb9#\xe7\xb2\x8eY\x89\x11,\xefH\x88\x41l0s\xb4\x1a*\x81N\xad\x6\xeb\xe" -"\xe1\x9b\xe2\x96\xfb\xcc\x1d\xbe\xfaY,\xc\\\xa0\xfc\xf1#\x7f<\xab\xb\xc6\xdf\x38" -"1\xd4\xe2#\x96\x83\x8f-#jW\xd8:\xe7jJ\xf7\xf\xd1\xd5\xcd\xb3\xc9\x9c\xc0" -"\x81}x\x14r\xcf\x7f\xc6\x1\xa1+,\xa1\xc8\xf5\xa1\x30\xa1|h\x80N\xe4\xb5\x19\x0\xbd" -"!8\x97\xb\xe7\xb1\x36\x43\x62\x90Q\xd6\x44\x4\xb0\xda\xfc\xce?\x8b\xb9K\x8e\x41\xc7" -"\xe3\xbf>\xea\xc3I\xc7l\xcc\x13,\x83\\ P\xc6\xe4\x65\xddR\xd5\x63\x1f\xbaY:\xa9\xee" -"a\x0\xa9\xa3?\x1c\x12\xa3\x92u\xaa.x\x99\xbaZ\n`\xac\xd9\xc3\x91\x9b\x8\x66\x65i" -"d\r>\x82\x65\x0\xbf\xb1\xce\xec\xc8\xe0^!s\x1\xb6\xa6N\xe8\xec\x8f\x89G\x0\x87\x82" -"\xf0\xf1}2?\xb6\x17\xd2\x1d\xbc\xd3)lw\xcb\x6R\xc0\xc0\x19\xe8z#\\F=`\xf8\xde\x9b" -"\x80:{\xfd\x30\x97#\xd2\xde+\xb5O\x84\xb5\xd1?R{\xcd\xe9\xae\x18t\xea\xfc\x95T\x88" -"\xed,Z.\x88\x1d\x9a\x8e\x94\x90\x9d\x81\xac_\xbd\x16\xf2\x98\x92\xb6\xd8\x18\x65" -"\xdeR\xfcg=\x8d\xc4` \xc1t\xb6g\xf1\x84R\xebq\xe2$~N\xe5\x4[\xf5\x85za\xd1g\\y\x13" -";\xb6\xdd;9A\x1c\x98m?F\xc7\xa2\xda%\xe5\x9\xca\x89z\xe1\xde\xf8\x90\xb7)\xe4\x8f" -"\xe3\x94\x8e\x97\xa3\x62\x95\xb\xf2\x8a\x61\xf0\x83@(\xdb\x36\xecN\x90Y\xdd&\xaa" -"\xc4\xff\xf5\x83\x90\xf0\x7;\xf4\xbf\xb4\x86\x45\x6\x1a\xa5\xe2\x94\xbc\x11\x66." -"\xc9\xfi\x5w\xca\xc4l~'\x8d\xd7\x87\xd6\x6\xac\xbf\x43\x0\xb9W\xc0`\xe0\x81\xecm" -"\x19;m`\x8bxR\x99\x18\x41\x41\x18\x9f\x11\x3\xeen\xa5\xd7\xfbi<\x9a|{\xfcy\xb\xf0" -"\x14!\x8d\xfd\xa2\x7Y\n.\x98\xf5=yOY\xd7\xf2\xa9\x8\x18\xa4_\xe0\xb6/\xb2\xac]\xd0" -"\xd3I\x1e\xe9[\xb0;\xeb\xc\x80^\xc5\xc3\xcc\x62\x6\xec\xc1\xbe\x90)\x96I$k\x7f\xd0" -"\xe5\xfe\x16\x63rO1\x9\x32\xf4G\xa9T\xf7\x92H\xbf\x7f|\xba\x8e\x0\xdf%\xcf\x43\x1b" -"y\x7\x44S\xed\xf5\xe3L\xef\x8f\xc2\xbbSZ\\?\xf6\x9\x34 \xdc^\x91\x19\x62\xac\xdb" -"\x83\xfb#\xfa\x93\xcb\xee\xb7\x8a/\x8eT7?\x97\x18\x87}\xa7\xfc\x1a\xe8\x8as=W\x1d" -"\xe6\xf0\xa4u\xa3=\xb9Sb\xdcr^\xcf=\xdcK\x80\x91\x4\xcf\x9c'y\xa8\x19\xc9\x12n\x8c" -"\xbd\xa4\xe7\xab\xaa\x1e\xce\xf5\xc\xca\x61\x33\xf2\xe5\x37\x81\x1e\xee\nJ\x92jM" -"\x5K\x83\xba\x87\x31\x30\x7\x39Q\xc5\x9f>\x9\x15\x7f\"M\xe0\xd4I\x80\xe>*\x81\x9d" -"\xc9[\x81\xce\x93N\xe7\x31\x33{\x90\xeaS\xa0\x19%\x9e@\xb4\xad\x31\xe6\xc8)\x91\xbe" -"\xd5\xe7~\x7\xc3niGI\x8b\x34\x64\x46!\xa3`\xc2\x14Ye\xc1\x9f \xaal\x98\xce}\xc2q" -"\xa2u}\xb5q\xf6\xf3\x8e\x80\xc0\x87q<\x8c!\xd9\xcc\x4\xe1\x87\xbe\xf6\x7f\xfa\xe" -"\x13?)w\xb0u\xf6\x82\x1a\x8c\x8bO\xd8[\x81\x16Zo\xa3|\xb7N.\xc\x62\xbb\x8f\xf6|\x18" -"x\x9fyK\xa2xG\x81\x2\r\x31\xe6\xfc`\xf8\xc7\x96\xbe\xcf\xbb\x99|\x9_p0\xc1\x95\xdd" -"\xd8\xd6\xab\xdd\x91\xdd\xb0\x11yq\x2\xf5\x7\r\x9\x86\xd4\x63\xaa\xa7\xfb\x12pBf" -"1\x0\\{\x91\xe5\x46\rI\x8f\xbf\n\x1\x42\x42\xb\\\x96Iv\x5\x1\xb0;\xfd\x85\xd7\x4" -"\xc8~\xce\x8e]\xbb\xb3.\xc4\xa3\xdb\x90$\xb0ZK\xe4\xc9\xe8\xc8@\xc3]8h\xe2\x34\xcd" -"\x80\xac\xf8\x1d\xe8\xb6\xc8\xa3W\x81\x17\xd8\x9aG]:\xf3gIn4\x7\xfc\x96\x86o\x1d" -"f\x8e\x90\xc7\xe6\xe6\x8e][\xb8R\xba\xf\xb2\xdf\x43\xf2\xbe\xb8\xcb\xb4\x66\xd7\x45" -":7x\xb5\xb2\xa7,\xcc&w\r\"\xc0?@\xd6\x80\x2\xf7g\x82\xb4\xe0\xa6\xa3\xfd,<\x0 \xfc" -"p\xbes%\xae`\xbe\xf3\x5\xad\x89\x1b*\xdd\x61m\x1b\x37\xfY\xb2\x99\xd9\xc\xd4\x5\xbe" -"\x1al\x2\x81\x7\x80\xcdQ\x80\x80\xf9Vw\x1c{Q\xfa\x8f\x32\xfb\xb5\xc0!\xe5\xd9.\xfa" -"\x14\x1f\xbd\xd2\xb8\x91\xa8\x43\x61t\xb4Z\xee\x93\x80\x8c\x66\nO!\x81#\x8b\xc2\xd7" -"\xf5z\xf3\x7f&L\xb6\xca\xad\x8c\xf4\x85\xa5\xab\xb5X\r\xed\xc0\x2\x89\xc5\xed\r\xce" -"~\x4\xd0\x2Y+\xbb\xee\x15\x81\xba\xe2\xf7\x98)\xb5ke\xc4\xe9P\x80\xe8\xddY\x7\xf4" -"D\xb9\x9I1\xcbX\xd7\x62\xaa\xfdqY3P\xda\x9b\xbf\x8\x34`\xfc\x87\x88p\xb6\xb4~\xc8" -"\xf1\x41\x0Zc\x83\x30~\x4:\xe8\x8e\x1dG\xb8]\x80\xc\xc1|0\x9f\x36g\xba\xbS\x99>S" -"\x96\xdd\x9d\x10\x8c\x35\x11t,\x9f\xf6\xf2\xb3\x1c\xda\x90\x44\xb2\x9e\xd3;f\x2\xea" -"R\x97\xaf\xf7'3y7\xf5Z\x98\xaa\xd0x6x\xcb\x7f\xce\x87\x82\xdb\xee\xfaJ\xe2\xfc\x39" -"\x8ft*\r<\x85\xdeY\xf1\xc4 n:\x19\xcO\x1b\xe2Y\xff\xaeX\xe9<\x2\x96@\x97\x14r\xf1" -"\xe2\x91&\xbb\xe1\x98k\xb2Vm.\xa7\xd5\xd3M\xca.\x1d\x16\xc\x99\xfa\x0\xce\xb4p\"" -"6\xdd\xbcn\xd3\xba\x0\x92\xa2\xaa\xed\x18\x11\xbf\x45\xda\x9d\xeb\x45\xde\xa4\x66" -"9\xa7Z\x4g\xc\xd6\x96\xe8J\xe2\xebh\x98\xd3\xc7\xb5\x45\x33\\\xa2\xc4\xdb\x65\x97" -"\x4O\x84\xeb\x90\xee\xaerl<\xa7/\x88\x64U\xbd\xd8\x4>\xb2\x18\x17\x90\xae/\x83\x1c" -"74-\xe2\x44\xa5\xb3\xba\r\x19Jw\x8czJS\xc5\xe\xd3\x8e\xed\xfd\x15\xbdR\x85\xff\xa9" -"F\x8e\xe0\xa1P\xbb\x81\xfb;\x8f\x93\x16\x95\x18\xe6\x17j\xe4Y\xf5\xea\xaf\xa7\x81" -"\xc5\x4\xec\x83\xd9`\x99\xeb\xcf\x89%K\xb6&\x1c\xc7\xfb\xf0\x94\xd0\xf6n\xa3\xe5" -"\xb2\x42\x9d\x8e;\xec\x8c*{\xc1|\xd7\xe6\xf4?\x3\xdeG.Q\x5\xf4\xfa\xc\x1d\xb4\x16" -"?\xfd\xck)\xf9\xe2n\x8f\xcf\xb9Ie$yI\x6\xac\xd8M\xbb\x89\xebv--\x83\xa4\xce\x1b\xe9" -"\xcc\xbb\xcb\x19\x9/\xa5\xd8\x1f\x96\xeeY\xbe\xf0" -"\xe\x64{\xfbU\x84\xc4\xb8G(\xef@Q\x96\xb6\x3u$\x19\xee\x12\xcdp\x8e\xb7\x46\x9e\xac" -" \xc6\xa7\x62\xc3n\xec\xf1<\xb9\xf6(\x82\xd3+\xcf\xb0\x92\x9d\x94\xf5.\xf7\x42\x94" -"\xfbwpx\xba}8J\x1.k\x5\xbb\x3U$\x16\x81\x99\xfcH\xeb\x5\xdf\xcb\x45\xc0\xbe\xa3:" -"\xbb\x42\x36~l\x86\x38\x8f\xdc\xb3\xbe\x18\xbfs~\x98\xf1\x14m)\xa8(7\xf5\xf9\xcb" -"\x7f\x11\x30\x9an_\\\xa8+i[\x94\x1aY\xcb#m\xb4\x1d\xad:\x96,\xac\xc4\xf7\xaei`Av" -"\xb6=\xa4\x16\xba\xc7\x1f\x6h\x8am\r\xce\xbc+e@\x1aMzdI\xd7Q\x88V\xbh\xe7\xd4\xed" -"S\x83!\x9c\x33\x6/\x85\xf0\xd8\x1b\xa3l\xdd\xc2\x87\xbe\xb0\x87\xee\xfd\xf7\x91\xd9" -",\xb3\"U\xb5?\xde\x3\xa0@\x80\xcfN\xf1\xf9\x42\xdb\x43.\xb4\x8\x19\xa1\xcc\x5\xd5" -"\xb7\x85\xd5_\x9c\x99\x91\x80\x87\xbehI\xff\x2q\xa0\x14$\xaa\xeX\xff\x89\xcb\xf0" -"\xbd\x95*P\xbak\xfc\x91\x8f\xc6\x8\x43\xd1u\x1duC\xec\xb0\xc5?\xe2U\x7\xef\x33\xb7" -"Fi\xba\x1b\xd1\xd6,\x95\x37J\x99\xaf\x32\xec.\x9a\xfd\xe9T\x8fk\x9a\xf7Su\xc7\x88" -"s\xe5\xe4\x85z[\x13gj\x9d[[\xd1\xf6\xf1\x45OHE\x1a{\x85uK\xfd\x62Vm\xee\x12`\xd4" -"B\\&\xa6\x1x\xb8\xe8\xf8\xb9\x39;\xbc\x4\x0I\xe7h\xb2\xf7\x45,\x96\xeb\x8a\x9ez\x96" -"\xf7;\xf2\xca\xad\x83l\x98\x1c\x34m?\xed\xa0\x42*(\xfb\xf8\x9a\x0\xa9\x9a\xf0\x34" -"\xcf\r]X\xd2\x41\xee\x8fOIY\x9b+=i\x16\xd9\xdb\xda\xb6\xa4\x38\xf4G\xff\x9c\x14\xc3" -"\xe4\xe6\x81\x9a\xfd\x4\xf0\xbd\x32\xb\x92Pf\xfc(Y\xeb\xe6\x43\xad\xd4H\xf6\xa4\xe6" -"\xd2\x9f$\x8a\xf5,\xd0\xcf\xfa\xfe\xbf\x5\xce\xb4\xec\x46y\xd4\xf2\xd8\rg\x19\xe9" -"\xd9\xe2\x34$)\xcf\xba\xd1\x9d\xf8\x1d\xa3\xda]\x95\xed\xee\xd6R!^4l\xadoF\xb5\x88" -"\xd8\xe4\x81\x9f$r'H\x91\xf2\x17\xdb~\xd7\x89M\x9f\x1b\xfa\xdcK\x8d\xd7\xec\x9dY" -"\x87\xb\xe7\x9f^\x8$\xaf\xb0\xb5>\x12\xe0\xf2yJ\x5\xe0\xb\xe4r\xc3\xad\xb5_J\x80" -"4\x86xt\xe\x99$\xf8H\xdf~\xda&\xbb\xeas\x81\xc8i$,\xd2\x8f)R\x9a\x35\xf4\xb\x14<" -"_o\xad>J?%\xb7\xeS\xc4\x85R\x9f\xc0\xef\x13\xb1\x9f\x35\xeb\x44\x37\x46t8\xdc\x1b" -"a\xca\xa4\x34\xaf\xa2ZD\x9c\xee\x8b\x19\x8e\xc7\xcfJ!\xe9Vp\xf5\xac\r\xd5M\xfa\xe0" -"\xd4\x63\x9b\x61j\x81\xb2\xe1\x83\xec\x63\x1c<\x90;\x11W`\xa2V\xec\xe5\x12\x87\xc3" -"V\x91\x90\xa9\xe9\\\x94\x36\x8a\x8c\xff\xf6\x66\x1a\x46\xf7qCfb\xebr\xab\xb4 7B\x88" -"\xb3\xd4Y\xbcP\x86\xcf\xe6\xd1\\\xe9\x41\xdb\x96Uh@\xfb\xc9m\xa4w\xc5\x9a\x15H\xd5" -"\xd1\xec\x1e{\xbf\xdah;w\x1f*\x9f\xb4m\xd7\xba\xf0\x17\x2\xc9X\xf4\x30\rz\xea\x36" -"\x8\xfb\n\xa5Vb\xd1\x12w/\xd7m\x1e\xb5\xb3\x8a*-\x84\x96\xe9\xb8\x30\x90-x\x2\xfe" -"5\xb3\x34\xb4t\x9b;\xa2n\xc5\x8b/5Et\xae\xa8\xf4\xd7\x65;\xce\x99\x19\x8d/\x9b\x6" -"\xbb\x81\xa4\xf7V\xb8\xe5\x89\xca\xc5}r\x7\x30\xa2\x17\xc1Y\x87\xb5\x9e\xe5M'\xaa" -"Ak\xb6\xeeQ\xfa\xa8\xdcq\xcb\x7\xa4\xda\xb5\xf2\xa4\x64\xb\x82\x61\xdb\x1c\xads\x83" -"N\x93,f\xe4\x12y\x5\xaa\xea\xe7\x99\x43$6\xdc\"\x85}\xc`\xd1\xd9\x7[\x1c\xe7\x81" -"\x89\xe5/R\x9d\xed\x81\xf8\x7fx\x19;\x16i\x17\x38\x97\xd7\x9a\x3\x97\x97YZ`+jH;I" -"\x0\x17\xa2\x87Y\xf9\"\xe2U\x1d(\xde\x9b\x19]\x81\xa4\xbc\xf1\xd8\xcc\x1b$3\xc0`" -"*z\xa7\xa8\xd2\x8e\x88\xff\x9f\xf2\xac\xb5\xc7v\xe5T|\x9b\xef\n\x81\x44\xfe\xe9\xc7" -"5)F1\x1\xc7\xcf\x19\xe\x64\x1c\xe3\xe0X*\x5\x96\xfd\xda,\xd3\xa8 \xbb\x37\x86\x0" -"\x81%\xa5\xc2vBM\xb\xbc\xa5\x7f\xc4\xe9\xf1:b+\x95\xa5\xf1-/9{\xf7\x16\xcf\x2\xf9" -"\x81\xe0r\xe3\xeb\xd3/\x0\x90\xd2x\x88[\xf5\x19\x6{\x9e)\x9f\xe9\xee\x12V\xc3\xcc" -"\xad\x63\x9b\xb1\xa6\n\x18\xb7\x3\x31\xbaKt\xb0\x98\xfe\xa7\x3j\xcfh\xd8m#\xco\xfb" -"\x9\xb3\x1a\x8b,\xe6\xa4\xa2p|\xc7\x93\xc3;\n;\xec\xb8\x1a\xc7\x93K\xe0\x86\x0\xba" -":\xf5\x97\xbd E\xe4l\xb5\xd9\xb9\x34\xfd\xe3\xcc\xb6&P\xc7\x87\x85\xb1\xb9\x0\xf7" -"6|\xd7\xbb\xd7\x31)\xbf\xfe\xcd\xfbX\xbaP\x97\xf0\x89!\xe8\x14\x9a\xce\x1c\xe0\x19" -"\xf9\x98\xf2\xa5\xf3\xf7\xcd\x81!\x97\x11\x7\xb9\x1b\x12^\xcdP\x1a\xd5\xbd'\x4\xb7" -"\x8e^\x81$\xf3\xfc\xca=\xe9\x61\xbe\xa4\x39\xf7%\xe8\xc5\xe6\x9d\xb9n\x99\x38\x81" -"\xad!\xcc\x9e\nK,\xfc\x91\xc\x86\xe2\x83\x9b\xf\x32\xb7\x97\xe1o{Eq\x88\x11*\xb8" -";\x94\x86\x96\xfdu\x4}\xf2\x12\xc0tf\x7f\xe1\xa1\xdam\x83}~\xc5\xdd)\x8c\xf4\x0\x11" -":4\x91\xf5\xe0\xd9\xaf\x1\x16\x9d\xbc\xf0\xf2\x36\xc2q\\\xc5\xa4\x8a\x13\x37\xb1" -"\x1e\x9c\xaf\x6\x37\x2\x8\xae\xffk\xd4\x16g;\xe6\x17\xaf\x15\xc6j\x90\xc9={\xcb\xcb" -"l9\xc7J\x19\x1evz\xe2w\x13\xa8\xee\x1b\xf6\xb8\x8c\xd3\x10\x9b\xb6\xfb\xdc\x85\x61" -"$1\x81h\x91\x9d\xf1u\xed@\x10/\x8\xc7Oh\xdd\xc7\x1e\x8a\xf1\x31\xc9\xd1\x93P\xd1" -"\xfe\xdbT]9l\xe3=\xe4\xc7\xe6\x83\xbc\xad<\xd6? u&P\xf2\xb1G\xbe\xc5\x1b\xcf\x9a" -"?\xe\xea\x1aO,\x2\x5\x8\xdb_\xaf\x8a\x6\xda\x9b\xa2\xd6\xbb\xb0\x8c\xc1\x62\xabo" -"p\xf0\xde\xcf\x45\x9fX\x94\xe7`!a\x91\x42\x42\x31\xbe\xd5U\x1f\xf3\x15S3\xf8\x8f" -"=\xf9o\xe0:\xf7\xae\x41\xda\x8eJ\xe4\x10\xc\x13s\x9\xe2\x61\n\xad\xa9\x13`\x82\x1a" -"\xca\x30\x9en\x99 \xe5\x8e\x81\xb5\xe5^w\xf2i\x7f\x39\xa0Y\x12w\x0\xfd\xdf\x31 \x11" -"\xf1\x9f\x94\xf8\xbd\xab\xcd\xf7\xa3\x83\x66\x61\x46W\xa5{\xb0\xaa\x1\x84)\xb7\xbc" -"hk\x1f\x44\xb6\xbbL\x2\x6\xeaO.\xb4@\x4\xae\xe8\x10\xbd\xd9\x1f\x1b\x8f\xfa\xa6+" -"\xf3\xb4\x89\xd5\x46\x98\xf1\x85\xf1]aK8S\"N\xd2M\xe3\xaa~\x9d@r\xfc\xad\x9b\x9\x88" -"\xa7\x94\xf8\x16\x7\xf0\xdb*\xe2\x43\x61\x62\xda\x63W\x89\xe3;\x98\xb6\xb5\xa2me" -"\xc8p\x8e\x9f\x99\xac\x8d\x9b\x46)\xe1i\x17\xeO`\xbeW\xb8i\xf0H\x17\x96\x2p\xb5\xfa" -"\xfehtN8\x3\xd4|\x96\xa2tU&\xfa^41G\x8a\xdfi\xab\x30\xb5\x90up\xa9\x81@\x80\xb0=" -"\x81\x10so\x86s\x8d\x98\xc6\xc6Y$\xf%\xe6\x89\xfb\x19z\n\xe7\xd0?N\xf\xb7.\x86\xc4" -"5<\xfa\x44\xd2\x44\x89\xd4\x15!]\x92\xa0|79\n\xeb\x43\x44\xc4\xa7\xe\x0)-\xcc\xb3" -"g2\x15\x92\x9a\x36\xb9g{&\x9?\xa8\xe5\xb1\x36nq\\\x1dy\x1f\x62\\\x18\xaf\xad\xce" -"1\xbc-\x96Ijh\xef\x32@\xca\x91\xac>+\xcd\xbe\xfe\x31q\xcb\x6\xc9\x3zu\xf1Z\xb9\xd3" -"\xb1\x91\xfa\x3$\xdc\x95>\x18\xe8\xc8\x35\xf8v\x91\xf0\x33\xf2\x8a\xda\xbe\x15\x36" -"\xb5\xdd\xf0T9\xf6.[\x15\xd8\xa9\x34\xd2>N,\xaa\x85\x8\x62\xa4\xae[\xb8)\x13\x16" -"\x1\x62\xf9[\xb5\xc\xbcX\xe9\xca\x95\x13\x7\xacW\xa7\xe8q\x97\xa9(\xa8\x8e/\xec\x42" -"\xfe*6\x81\xca\x39\x37u\xfc\xf\x39*@b\xb1\xf6@\x9e\x36\xcd\x45\xa5\xfb\xd9$JSX\xf8" -"#V\n\xb3\x3\x87\x42h\x15Z\xe1\x84~B\x11S7\x89\xa7{!\xa4\xb5\xb8\xfb[\xeew\xcL\xdd" -"\xeb\x88\xf3\x41\xf1Z\x9\x5\xab\xdfZ\xc8\x38P\xc4\x64\xfaY`N\xc0\x34+-\xea\x0'@\x87" -"R[\x7f\xeb\n\x3\x83\x18\xb0\xe6\xf6\x8b\x88\xc7\x61\xb6\xbf*,\x12\xb1\xae\xc7\x3" -"\x91\xb4\xc9Y\x8?L\xda-\x8f\x33UR\x1a\x8a\xd2q\xef\x93\x8f\xf6\x64\xfc\x80\x64\x12" -"Z\xb0x\xeJ\x18\\\x1e\x80\x4\x0\x1f\xd2\xd5\x13\xac\x9e\x1b\x18\x80\xa4\xc6\x62\xee" -"_\xe9\xee\x7f\r\x1d\x98\x13\xf2\xd6\xe2\x2q`\xdf\xf),G\xe0\x66\xae\xb0\xed\xd0:\x16" -">\x83XE\x12\xc0\xe1\xcd(\xdd\xce\x95\xa6\x37\xd6\x34\xfb\xdb\xa3z)#\x9c\xcd\xb8\xa2" -"TO\x18Zs=\xad\x41q\xb3Zi\xd3\xd8s\\\xd9\x14\xda%~U[\xac\xf6;m\x9f\xdc\x8\x8f\x9b" -"\xb6\xed\xa9\xd7\x9e\xe7\x66@?|\xd1\xd7R}\x8a\xca\x91k\rx\x98K\x8dO>F\xdd\xf\x8a" -"\xd8=\x15\x37\x35\xfe\x95\x63\x8\xc2\x98\x7f\xff'\xc6X\xe9\x96\\\xd0\xbd\x12N>>V" -"\xc6\xcb\x13$\xb3\xc\xf3\x1b\x64,\xc8\x6i\xab\xba^\xc9k\xf\xe3\xff\xb9g\x1d\x92\xac" -"\x99k\xeR\xb8\xcf+ \x10\x64\x83k\x9\xcN\xc4\x8d\x13\xca\x17v\xeb\x11\x89\xbd\x83" -",\xd7\x19\"\x9b\x62R\xd8\xd1\xcf;\xbc_K\xfaRd\x86L\xd4\x8\xa0\x8d\xcf\xdc/\xcb I" -"\xc5\xca\xc6\xa5L\x7fT\xa6\x17\x61\x88\xd5R\x13\x12\x81\xc7U\xa4\xb4\xf8\xa4T?\xf7" -"r@\x8b\x93\x5\xfe(\xfa\xae\x97OZ\xae`k\";\xb2\xdf\x83k.\x9\xe7\x13\x34\x81Oe\x19" -"d\x9b\x8c\x42\x99\x93\xa8\xadz\xeb:\x19\xb4\xfei+\xef\xa9-\x96\x44\x16\x84\xe6O\xf2" -";\xd6\x61`\xd3\x1b\xf\x41\x1\xe0\xc8\xee\x46\xde\x8c\x5L\xfaS\xb\xf5\"u=Al\xcf\xdc" -"%\x89\x35\xc5\x63\xb5\xc9\x63rf\xd5\xf5 \xad&\xbe\"\xb3t\xc7;N\x9\x61\x62/\xde\x1" -"\xb6i3\x19\xc8\xbc/\x81\x1fw\x13w-\xc0\xc5\x88\x9b\xf6\x8a\xf5\xa3\xe7o\x8fkkNu\x11" -"S{9\xf\x87\x83h\xbf\x41\x8b|\xd9_\xea|\x19\x88\x18\x84\xae\x65\x18\x2t\xe0\xe9\x80" -"\xb0\x37\xb9\xcfh6\x9\xf2L\"\xd4\x9b_f\xf3\x83\x94\xb6\x8aP\x95\x45\xac%!\xfai\x10" -"\xf\xf1\x9bIv\xf8'K\xa6 \x9e\x1dH\x8f\xfc\xf2\xf8\xed\xca\xae\xffy\xf\x1b\xff\xb1" -"w\x9e\x3\x1\x10\xad\xab\xca\xbb\x37>ri\xbf\xb0\xfb\x8a\x8aY\xc\xc5\x36\x86\x18\xda" -"\x2)\xee\r\xeb`\xfpY\xde\xb0\x94h\x9\x3\x17{b\xcc\x1a$\xbf\xa6pe\xe4\x1e$\xb1uKJ" -"\xc2>Y\xf4V!\xdf\xfb\xab\xbb\x83\x10\x94\xfu\xd4\x8\x8&q\xdc\xf6\xb6\x12\xb5\x4\xd3" -"\xc0\x10\xf\xb6\xb1\x93\x1cG\x1a\xfb}A8\xaa\xb9\x1fp\xb2\x8d\xca\xa3*\x8a \xa3\x5" -":|k\xaf\xd2\x93\xaf\x2\xf\xfc\xf4>\x97W\x8fp\x13\xca\xdb\x61\x32)\x85\x8a\xe5o\n" -"I\x1a\x9\x1fl\x9\xb\x82\xc9\xf9\x88\x8a\x83\x31:\xd6\xc6\x7fo\xaa\xf3\x7fS\xdd\xbd" -"\xf6\x8cv,\xf3\x2\x12\x7\xaeL3\xaf\xe2^\x7\xdd\xf3\x41'\xd5\x12<\xa7\xcb\x45\xcc" -"<\xa9\xcd\xe4\x15\xc5 Y\xc2\x39\x3s\xfd;C\xa1x\xc8o\x9a\x32\xc6Z\xf5\x17\xc4:#\xf8" -"{L\x14\xd1\xad;\x16\xef\xfe\xa2\x43\x6[\xdd\xa8u\x13#4H\x1dh$[\xb6\xc5' \x7fS\xb2" -"\x1\xee\xd4\xf5N\xf4\x80\xae\x5\xa6QlIzs\x82!\xd8Y\xb2xSIx\x3)ES\x12\xf8\x6uT-m\xe5" -"\xa1\x62\xe6\x62k\x82\x1\x1e\x1a\x31\x30\xc2\x8eMlf\xbe\x1d\xc\xe3\xe:\xf0PK\xcb" -"\xc6>IVN&\xa7\xc1]\xe8\x85\xb0\x7)\x85g\xb8\x83\xb4yq\xe8\xa5\x8f\xf1\xca\xdb\xd1" -"z\xdc:\x3\x19~\xca/K\xf7\x9b\\\xcd\xa3\xba\xd8\xde\x41\xb3\x7\xa8\x8\xdd\xb5\x94" -"ka;\xf6\x64\x7f\xed\n\xff\x1f\x33\xfb\xb5\x86\x87\xdd\xcb*qg7G72F\x9c\x3\x4\x9c\xe7" -"O\xb7\xa3\\\xbr\xcf\xb1%\xce\xcf\xf3\x9e\xf7\xbf\x94\x87\x33\xd7sx\x10X\xc5\xf2\xc1" -"\xc0\x34&B?b>\x1f\xfc/\xca\x7L3\x10\xd4\x7f\xe5\x66&\xa0\x91\x41\x9b\x9b\x15k\x1e" -"\x15\xa5\x1d\xad\xe4\xad\xfb\xaa\x1f LP\xb7T?\x9e\x33\x12\x9\xdf\x33\xb7@j\x80\xc" -"\xe3\x81\xf7=\\\xd9\xb0\x85M\xc8\x44\\\xda\xe9\x88i\xbe\x15\x7f\xc0\xa8\x14\xbcL" -"\xde[D\xa2&\xf9xbh\xd0PJ[X\xac\x4Z \xf9TB^l\xcd\xd1\x43\xda\xfd\x30\x88\x95m\x9b" -"\xb6u\xdd\xd5\xee&\xf9\x97\x33\xa2\x1c\xddp\r+i\xa1\xb0\xc8nR_\x9a\x1z4\xa1\x8a\r" -"\xf6\xcf\x33\xf2\xeb.\x91u\x99\xf4@\xaf\xfaw6\xee\x34\x61\xca\xed\x83\xef\x66\xfe" -"2p9\x90\xca\xef\xf9\xcf\x44\xdf\xd1 L\x93\xf2\x8a\x8d\xfa\xd8\n*dV\x98x\xde\xf5\x86" -"WN\xeag\xc8\xf0\x13\x1dM\xd0\x38\xeeSx\xff_\xd5QL\xd0hI\xa8@\xb6\xc8\xe9\x1c\x63" -"\xa5\xb\xc6\xcf\x92Y\xf3\xf4\x90s\x7f\x8dN\xf4\x93\xf2\x16\xc\x9e\xf2\x99\xff\x98" -"8\x8c'L\x9e{8_\xb5\xf0\x45\"\\\x94\xbb\xf3\xccIvu\xc4\\u\xdfJ{X\xdc\xaf\xac,\xeH" -"Y\x17r\x97+/`}\xbe\xed\xc\xd7\xb2i\xddi+\xb4\xfb\xeex\x1f-\r\xd6\x31\xeftb9\xbf\xcc" -"|a\xdc\xd1\xb8Xk\xce\xd1*N\x1awe\xb2\x31\x46\x87\x65|\xe6VW\xb3\x37H\x82o\"a\xa0" -"\xd9\x7)C\xae\xe\xaf)B\x16\x66\x9bX=';>\x9<\x94\xf1\xc5\xa1(\xb8\x13y\x1c\r\xb7\x93" -"\xe0\x17Uk\x9c\xff\xdb\x84\xcf+\xc5#\xb0w=|YT\xa3\xd7\xb4\xe4\x39\xec\x66\xc9\xda" -"\x84Y\xfc}Z\x9ej\xe7\xf6[\x84\x11\xa8\x1d\xc3l\xbe\x3\x12\x9cG]?*\x90\x96\xe6\x8d" -"\xa4\xd3\xae\x1d\xbc\x85\x89=(\xe4\x83\x86\x1p\x98I7z\xb2\xb2\x2\x87\x5\xc7\xac\x13" -"\x0y\x7f\x16\xc5\xea\xf1,\x1b\xab\xed^\xcd\x5\x93i\xab\x32o\xe5\xa3\x46\x43\x10\xb0" -"\x8b\xa0\xc\x92\xff\xe7\x14\xc3\xb9R(#\x1b\x82\x9ex\xf5\xd7W\xc8\x9>?\x8e,)\xfd\xd5" -"9\\]\xac\x93\xf{\x89,i\xc4\"\xc\xe3\x91\x61\xa6\x11J\xd9\xfaOu\x15'\xaa\x1\xfev\x5" -"WPH\x83R8\x3\x0'\xff\xbb\xb2\xef\xd4\xbc\xd2 \xbb{\xd3\x94X\xa2\xa1\x14\x1exq\x6" -"7\x8\xc6tQ\x87\x41\x17\x9a\xc9\x39\x8e\x36\xe3\x9a\x8e\xe5\xadV\xefutw\\>,\x95\xa0" -"\xb9.\\\xc7\xeu\xbc\xd0X\xd3\x4\x9\xf4\x31\x34\x99\\\x8f|\x11\xa6\x13\xfd\x80\xab" -"?c)\x9e\xaa\xc3\x44\x12\xd1\x62\xa9\xd3\x86\xf3\xe9m\x98\xa2\xe7\x14\xce\xa6\r\xa8" -"\x9e\xd2\x90i;}\xa7\x8b\x92\xaf\xbd\x9c\x7\x16*\x3pb\x97\x8fs\xa9\x64\xbb@\xaao$" -"\xfc\xf0\x44$\\\xdc\r\x81\x89Q\xd3h@\x15\x15.\xee\xbfn\x1\xc4\xc4\xf6\xd8RR\xa1\xea" -"(\x4\x18\x2\xfc<\xc3\xc6\x1e\x1f{\xb6\x6Ww\xeb\xc4\xc7G~\x89\x9aZ\xf5\x10\x82GJ\xda" -"\xdc\x99\x8e\xca\xca}\x14\xe2h\xc6\xe3\xe\xcb\x66\x36\x45\xfe\xa3[o6\x89\xeb\xfb" -"\\\xa2\xa1\xc4Mz\xddM\r\xd2\x2(\x9f\x33\xad\xdf\xe2\rH\x99.\x9dib\xba&6\xb6\xc3\xc8" -"$\xbd\x63k\xb\x37\x1a\x9f\xb1\xe5\xaa\xc4<#\xe0\xa8\xd5\x1f\x96\xed\xf6N\xf1\x66" -"\xb\xa7\xed\x81\x1b\xa3~\xd4(\xe\xc3\xe0\x9fh}\xc7\x87\x31\x1a\xd8\xcc:\xcd}\xf4" -"A\xc0\xaf\x33\x86\x32\x66\xfa\xc\xca\x34\xf3\x0tm9\xe8\xc4^\xe1\x12\n\x1d\xdb\x1f" -"\xb9U\xe3\xcf\x87G\xaf|6\x10&\xcbV\x10\xee\xc4>\xbc\xdd\xd1R{\xdc\xe2>^\xdf\x45\x98" -"\xf1`)P\x5\xcbK\xe6\xe2\x1c\xeb\xa0t\x94\xc1\x2\x34\xf7\x82\xf2n\xe3\x5Z3P\xadP3" -"\xc}AZ\x80H\x86\xe9\xefn\x84\xae\xdf&%\xa2z\xc2\x43\xc7\xe1\xbf\x1d<\xa6\x97\x35" -"\xf\x88\x1b\x89\xe1\x9k_II^\x9\xe1vS\xbd\xa2\x8e\xca\xba~\xb7\xd8\n\x35\xbb\x98\x42" -"w\xf7;4\xdf\xd1\x8e\x32\"\xbd\xc9v\xa1\x8e\x0\x35\xd7\x33\xb1\x9d\xa7\xeb!\xe9j\x7" -"A\x84G\xfe\xdd'7\xc,~\xe3M\xa3\xf2\xf7@\x87\xb9\x99#\xc8\xc0\xee^\x1c\xde\xc\x36" -"\x1d\x41\x8f:\xa9J\x1b\xbf\xd1\xe1\x89\x66\x96\xff\x32{\xbe\xb0\x6\xd8~\xf9g\xc6" -"Z\xc7\xc7\xed\xb5\xbf\xc4\xa5\xb1\xa2\x1e\x9\x8a\xad\xcc\xf5s I\xa7\xdc?%\xd4\x1f" -"\xd4<\xef\xc2\xfe\x1c\xfe\x44\xc9\x41\x1a\xac\x1b\xd7]\xb5\xa4'\x15\xfd\r\xbb\x38\xd6\xf6\xd6\x10" -"P\xf8`\x9e\xe4\xcd\x84\xcd\xa6\xd2\\\x17\x65za\xab'F\x1e\x33\xf4)\x94LS\xb9X\xbf" -"\xde\xf1\xb4\xa2\xa6+\xaa\x33^\x92*\x1p\x7\xcd\x8e\x38\\\x99\xb4\x31\xab\x13\xb6" -"|\xcd\xc1\xd3#\xcc\x46\x30\xa8\xbc\xdd-\xd7\x32\x8d\x91,\x9e\xd0\xdf({]k\xe6\x64" -"F\xcb\n\xa0\xc2\x62\xa4\r?\xa7g\x15\xcd\xa7O\x19\xd3Z\\\xfb\xa5P<\x8e\xf8k\xd5\xcb" -"\xd9\n\xaa\xc5,\x4\x1bQI\x11\xab%\xd3/\xabLO\x97\x16\xc7OVViI\x9c/\xdd\xf2\xcf\xdd" -"q\xbd\xcb\xaeV\xcf\x9v\x85\xb6ku\xb8\x14\xbe\x9a\xe\xc6:\xb1\xe6G%\xe1\x95\xb8*<" -"\xab\xc6\x13\xe1\xf3l\xfe\x65\x2\xa2\xb3\x11W\x14\xf6v\xf4x\xa2u\x96>\x9f\x66QO\xd1" -"\xaf\x33\xa7$\xa5\xd4\x65\x88\x18;\x8e\x30KO\xc=\x95\xc2\x9QR\xac\x35V8\x96}\x9d" -"\x93\x34\x89\xfc\x1a\xfe\x9a=L\x8d\xfdk\r\x11U\xeb\x19\x8f\xaf\x5\xbe]\xe4\xb5?\x84" -"v\x94hn\xeQ\xbd\xb8\xe8\xd1\x18\xf9\x88N\xad/'\"\xd5 \xba\xdbk\x0\x96?\x1e^\xd5\x35" -"\x7f\xe5\x5\xe2\xbfY\xa3\x84\xbao'\xactep&\x10\x66\x37\xb4N\xdd\x9e\x14\x8b\xda\xb8" -"\xcbJ\x9b\x9e\xe7T\x16\x88X\xc6\x44\xec\x63GY\xc8V\x7\xb4\x8\x1\xe9\xda\xe3\xb0\x1b" -"x\xeb\xf\x65v\x90<\x12}\xb5\x93}\xeh\xe8\x18R3`i]C\x14\x18\x85k5E6\xd0\xa1\x1\xcf" -"\xa1\xbd\x9f\xd6\x9c\xea!,\x1\x1a]\xc3g\xb1~\x1e\xb>\xdc\x32\xfa\xfeX\xd1\xc3\x8" -"o7\xfc\xbc}\xfb^\x19\xad<\xae\xc8\xe\xd1\xd0j\x97\x9e\xb1\n\xf9\x31\xf3z\x98\xc3" -"\xce\x15\x8\xfc{\x8c\xc9M\x16%\xd0m\xcb\x96\x1e\x8d!\xf9:\xfe\xf3\xacq\x1\x10&\xcd" -"\xf8\x62\xdb\x89V\xf7\x1e;;acu\xda[\xa6kp\x1e\xdf\xac\xe0\xc8\xbb\xe6\xe5\x1f\x9b" -"\x99\x1a\xeeGi\xd9\xe6\x17\xfd`\xfe/\xb9\x30\x93\xf7\xf1p\xe5\xcc\xb6\xb0\xa1\xa9" -"\xb1\xc8U!\xf\x96\xff P\xb5\xe7Gh\xc7\x65\x1e\xceo\xce\xc2\xa2\xa6$yy\xed\xbb\x65" -"\xd1sZ\x5{\xe8&\x82\xdc\xca\x16\xb1\x90i\xf8\xb5\\\xec\xdf\xf9GSi\xf8\xb0\xc1\xcc" -";\xfc\x45\xad\x8a\x5m\xd6\x65\xee\"\xc7\xa2O\xc\x8c\xaa\x97&o\x93\xe9\xf0\xdd)^\xb5" -"\xf9}\xdetMR\x8a\xf7\x99X^\xed!o\xd3\x1 \x7\xaa\x39+\xff\x33\xcb\x2k\xfe\xc0\xac" -"\x7-AA\xfc\xa8\xc\x15\xeb+-0J\xb7\xcd\x5?R&6(\xb9\x8f\xd4s\xda\x93\x41_b\x8bM\x0" -"wzp\xbb\x41 \xa5\xd1mF\x9a \xce=\x4\xa4\xc1\xd2\xde\x84\xc7\xe3\xde\x14\xd4\xe0\xa2" -"I\x16\x7f\x32\x9\xcf{v\xbb\x9c<\xc4m\xa4\xd6\xc7\x63%P\xe2\x62i<\xd4Q\xb7\x12\xdc" -"\x1\xc8\x89\x61\x9a\x8<|7\xb6)\xed\xf1/\xc4\xb4*#\x1d\xc5\x6\x15\x8a\xa0\xc8:\x1c" -"\xe4}\xdd\xa9\x1yJ\xa1\xe9\xc1\x97J\xf8\x18\xefZ\x19\xc4\xf7?\x89\x88\x3\x46O\xd6" -"|\x8a\x1b\xf0\xcb\xb2\xbe\xd5\x16\x1e\x9c\xca\x12\x30\x19\x91\xd0W\xe5\xe9?Ux\x87" -"\x8c\x98Q\x80+\xe4\xff\x9e\x45n\x1_\x17\x32\xd3<\xd2\xc6\x5\x86\\\x90i\xef\xc4\xb5" -"\xf7\x2\xe2jUlb\xd4uId<^>Q\xf6\r\x61\xe4\x88\x39J\xc1\xb4\x5\xa0\xcc\x30\x91\xa8" -"\xc1+\"D\xec'\xb\xb2\xa6\xc5\xa6\xf\x43\xb)X)h\xd2\xf6\\\xfb\x9bj\xd2\x92\x1c\xfd" -"}^\xbd\xbc\x33,\xfdV\x8a\xde\xc5Oa\x0j\xdd\r\x64|S\xff;\xd3\xa0\xc5H\x98H\xc5\xfc" -"\xee\xc0\xbch\x95\xdcj:\x8c\xfd\x64\xc9Qc\xab\xb5\xf8\xac\x5\x38\xa8\x80\x8d\x19" -"\xe6\x1b(\xfax\xfa\x1a\xe2&\xb4\x8f\x38\xfd\xc4\xbb\x38\xc5&]\xa7s$\xbe\x5s\xbf\x86" -"\x9b\xa5\xe3`\xe4\nq\x8\x9a\x1c\x8cm=\xaa.\xecr\x7\xcbiF~\xea\xb3rB\x89-\x8c\xd5" -"\xb5\xed\xb3\xf2\xf7\xb0\x11\xd9\x15\xc0\xe8\xbc\x3\xc6\xdf\x4\x99\xea\xff\xb6\xb5" -"\xc6\x41\x80j\xcaI$`\x87\xc0\x38\xad&E:\xf2\xaa\x39R\xf2+\xce\x83\x5j\xe\xb7\xf5" -"s\x8e\xc1\xb5\x63\xc4\xd5z\xc2\x8e\xea\x8\xc4\xe4\"r\xbe\xb6\n\x8\xbe\xd0m:\x80\xaf" -"\x90\x45\xa9\xd6\xec'\xe2\x65\xc2\x64\xb2\x7f\x92\xe6.\xe2\x43\xd4\xdb\xb1\x62:\x15" -"\xff]" -"\xd0\xf6\x10\xc4\xffrm\x84V\xcd\x88\xda\xba^\xfa\xdf.Y\x1dg\xe9\xdc\xb4\xfdMEuy\\" -"\x1a\"~\xe9\xd2\x98\xbfM.\x4\xb6\xe1\xf5\xd8\xc3\xb5j\xa9\x8f\xea\xaa\xfOxl\x15\xd8" -"#i\x12m\xfd\x7f\x84J\xf6\x62\xfb\x62\xafn\x0\xd3\x9f|[\xae\xd5I_\xe\x66\x81\\\xbe" -"\x9d\xff\x82O\xbeJ\xd0\xd2\xa3\x37\xd2M\x91u\x4\x8d\x5\x35\x81\xd7!j\xac\xba\x90" -"\xab\r\xd7_X\xa8\xaeL-D\xf1!$#\xab\x1d\x0\xd0)\x19P\xab\x4\xac\x34\x1c\x16\xef\x66" -"\x93\xa4\xc4\xce\x8e\\\xa5\xa7%\xdcg\xd8\xe7\xa2\xbb{s\xea\xde\x64\xe4\xd7 \xd8\xcb" -"\xa7\x1\xb6\xe9\xba)-\xc4\xf7H\xbe\x14\xba#\x90\xb2\x91\xe4K\x99\xc\xa0He\xf7T4\xf0" -"\x94\x85\xaa\x34O.\x86\xd3\x6(\x9e\x90\x94*\xca\xf8J\xe6hn\xeb\x6\xa1}H\xdeH\xf8" -"\x88\xa5\x9W\xf9\xb1\x18\xa8\xa7\xf2\x82\xf4h\xa9\xe1\x0,\xb5\xa0o\xb7N`\x98Ht\xe9" -"\xf3\x43\x63\xd2\xe8\xc5\xe5\x63\x7f~\x18\x42\x34J\xbb\xbf\xa0\x35j\xc8\x19\xf5\xad" -"\x8d.\x92\xbf\xec\xa9\x1d>y\x8dz(\xaa\x8l;\x19\xf0\xd2\xf4\x8a\x97\xd0#4\x8\x38\xdb" -"\xa5\x5U\xc\xb3\x8e~\x7f%qT\xa1\xf0I\x8f?\xc8\x96\x35\x9f<3l`\xa9\xa4\xff\xd7\xbb" -"Q\x8e\\Q\x91\x3\xb0/\x84\xf\xb0`\x91m\xe-\x89\x33\xb9\x64.}\xa8\xd6\xc1\xaf\x1b\xe1" -"\xfd\xd5\xd0\x2?\x97\xdf\xc9\xd6\x94\xf2\xe8\xcb\x91\xa4R\x89\xc0\x1b\x46\xf4\x94" -"\x15\x45*o[9\x83\x6}\xe6\x97\xd2'\xceTx`\xf5\x16\x8fke\x9c&g\x6\x9f\xcc\xd0\x11o" -"\xa9\x2\x8b\x9c\xa6\xdc\xba\x81vn\x83\xf5\x1c\x94\xaaR\xba\x98\xc8\xdf\xfc\xcd\xef" -"#\xa2\xab\xda\x1c\xa9\xf5)\x8d\xc3\x9a\x95-\xd1\xb\x93\xb2\x43\x34\x36\xbc\n\x13" -"\x85\x8c\x8c>.\xd3K\x9f\x6\x0\xa0\x96\x87\x16|B\x15\xcesHC\xd1\xa2M\x8f\x12}M\xcd" -"53\xea\xd3\xd1g\xd3=W\xeb:\xb9\xe2\x90\x83X6:\x9f=\xf1TW\x1b\xd9\xbdN\x90\xca\xf4" -"*\x0\x8fL!\x8a}\xb0\x96Gp\xa3p\x0|L\x93\x1'\x1d\xa1\x89\x19\x1f\xbb\x8b\xb3\xf2\x89" -"M\xc\xcd\xd5\xb4\x44\xaf\xe4\xa0\xa5\xefG\xfd\x8d(\x5\x83\xfb/\xb5\x94\xb0\x46\xbe" -"\xfa\xe4\x0\x80=gB\x9c\x8d\x15\xf5s\xae\x18\xd1\x8c\x10\xac\xfb\xc0\x1d\xf9\x11@" -"\xb3\x96o\x5\xb4\xe0m\x1e?\x7\x42\xb8\xa8\xabM'J\xa6\x81\xa7\xd1-5\xbf$\xe9\xfa\xc4" -"\x8cp5S[\xe0\xd4\x19\xbc\x9a {w9ads8\x82s\xf6H%\x9c\xe\xa5\x9cum\xc\xe1V1\xf6\x9b" -"\x90\xf4\x31\xbd#\xfd\x8f\xe5\x96\x0-\xab\xab\xc7\xf5n2\x9fSjq\xd2\x89Q\xebR\x8b" -"r!^\xa3WwZ*\xc6\x93\x98\x8bk\"\xc3\xfc\xa3!U*\xdc \x93\x1c\xb4\xdbIq\xd9\xec$\xd2" -"t\x0\x46\x46\x62z\xa1\xc1 \xe&%\xff\x96!\x9c\xcc\xe1\xa1*\x8di\xef\xd1\xe7\x34\x13" -"!\xf\x91H4\xe8Mm\xed\x8d\xe9m\x3\xf5\x8cIb\x17\xa7\xb7/\xb1\x0Y\x5\xe7\xcag~\x9G" -"4=6\xdc\x17\x86\x86\xb1\xfe\xde\xe4\xc4\xb5\xb3P\xf2 \xbe\x8e\x5\xd5L9\x9d\x86\xbe" -"2\xef\x11!\xbd][\x1c\xa5\xbb\x11\x90\x13\xdf\xb6\xaf\xf9Nk\\\xaaQ\xe3\xdc\x1a\xe" -"\xac\x95Mu/\xf3\xb3\x12Q\xcd\x17\x97ly\x8b\xfd\xcbk[\xfa\x1aJD\x9d\xea\xa4/\xf7\x1a" -"\xc5\xb3\x97\xdb\xdb\x64\xab\x9a\x9ax\xf7U\xa0\x14\xca\x44\xa3\xa2\x82@\xc7\x8=\xa7" -"\x16\xe7\xa9GP\x8c\x5\x1aKp\x2G\r\xd2\x9b\x65\x37\n\x1f\xe0\x31\x1b_\xaa\xcf\xda" -"n\xa7\"\x97\xecz\xa4,0^\x7\x98.^\xado\xcfZe\x9\x10\x1s\\\xb1\xd0w\xc8\xc5\xd5\x64" -":\xb0\x86\x82\x9ej\xf2]\xa5{7G\x99\n\x61\x8b\x98\xa2\x8b\xa3\x95|\x95?\xf9\x9a\xdb" -"Q\xb9\xab\xd2M\xb7\x87\xda\x85\xb0\x30\xed\x64$\xe3k\x87\x38K\xa9\x1b\xf5\x44[^2" -"5\xb5\xf3\x38\x39\x86\xc4\x13\xcb\xf2\x83\xf\x45\x3_\xd1(-\xc6\xf6\xc0\x90&\xbe\xe8" -"\x1c\xc2\xd3[\xbb\x86Z\x13g\x17X\xd4\xc3\xb8G\x84\xf9R\xa2\x42\x44\"\x39s\x8e\xea" -"%\xcf\xa9\x9b\xc1\x8e\xc4\xd1\x35\xc5\x35r\x89S=\xcb\"_\xd5\xab\x33M\xb7\xbd\x7f" -"\xc9\x39\x64\x46\x9cJ\x6\x37\x65\xc1\x7fn\x2\x99\x38\x98\xe6\x39\xb6\xf3\xc7#\xcf" -"\xbb\x5\x0\x97\xa7:\xf9\x94/M<\x11\xeb\xa1{)KV\xb\xce\x19>.9\xb7\xa0\x17\xf5M\x85" -"\x92\xd6\x35 \xe5(\xf5YW\x8en\x95\x0~\xf6\xe6\xbe;\xdf|G\xc\x18s\xe9X4.\xca\xb9/" -"\x2\xae\x42\xb4\x5S\xef\xb4\xebOY\x8e\xc8\xcaq\xad&\xea\x1a\x17\x46QA#q\xe6\xcb\xba" -"\xd5\x82\x96\xc7:\x12\x63\x14\xc1\xbc$x|\xf9LtsF\xb6pC's\xb9\x9a\x87\xc4\x9f( \xb1" -"\x1e\xa1\xff\xad\x64\xa3Y)\x82\xe9.\x91\xe1\xb8\x8c\x32Sx\xf6\xddm\xcf\xa8\xe7\xb7" -":B6%^\xe9!\xb4y\xa0\x1a\xf6\"\x9b\xce\xf6[\n\xf2\xca|L\xb1^\xc5\xf8\xfd\xa4\xd1\xa7" -"\xd7\x42\xf7\xb9\x1ch\xaa\x61\xf8z\x86I\x93\x8e\x8b\xa9*Ku\xc9?\x81\x9\xb3w\x8e\xe2" -"#\x92_\x81\x19\x17\\\xbe\xab\x90&@\xb7P\xd8\xc2\x30\x8\xf2<\xc\x10\x96\x13\x35\xb8" -"\x7\xcf\x83\x30\xfd\x41\x8e%\xe1\x84\x8f\xcd\x8d\r\xb1\x84\x18\x11\xb3\xb0\x39\x1d" -"9\xebVkz\xb8\xc2R`\x9d\x13N\xb7\x92\xba\x36\"\xe6\x30K_\xe7Y\xb3\"H\xdf\x9d\xda\x84" -"*\xa0\x8m6\x8c\xc8G\x88+\x1d\xf\x95\x16\xb5\xb6\xaa\xdd\xc1\xa8 \xb4\x86\xaf\x34" -"\x88rI\xb2Q\xe7\x8d>\xd2\x85\x65t\xc7\xb2\xb8\x1c\xaao\xccq\xdb\x34\xa2\xcc\xfc&" -"\xaf\xb1\xbd\x12g\xf2\xad\xb1\x42\x9cM\x93K\x10\xcb\xfd\x38\"\xa1\xdd\xc5\x8a\xe7" -"_\xb1L6\x17\x8e\xf5\xae\x4\x7\xe1\xbb\x99\xe4gt\x17\xba\x7f\xe6\xe5\xfc\xb9\xe6\xf4" -"-\xc3\xf4ou\x0\x62\x90j\xb9H\xe0\xd6\x96\x18\x8b\x19\xe1\x6\x10\xa8\xab\xdf(s\x9c" -"Nh9\xaf\xf3H2\x19\xf3\xb2\xdd\xdc\xaa\x9d\x0\xf6z\xfb\xf1\xbbo\x1d\xfa\x7\xa5*\x85" -"(\xe7\xf5\x97\xc1\xbaiH{\n\x9b\x13j\xfd\xd7\xe0\xcc%+\xeW\x85\xec\xc1\xfe\xc\xab" -"\xcf\xb9\x90m\xb9\x32\xa9\xa7\x66\x89\xd1\x62\x18\xd6\x95?\xc\x37H\xda\xee\xcdo\xf7" -"\xa5\xe5\x85\xab\x34\x62\xe\x1b\x7\xdb|\x1d\x66O\xf1v\xf4M6!6\xd3o\xb\x7\xf0\xa1" -"Yc]?\xe3\x15\xedv\x10\xc5\x5\xb9j\xf2\xc4\xed%\xf6\x13\xdf\xc4?\xee\x39\x1d%\x43" -".k\x8a\xa1\xefr\xb0\x8f-F\xc7\xc4\x84\x8f\x32{U\xa9_\xea\x83y\xd9+\xb3\xd0\xd9\xd7" -"v\xb7\x8\xec\xa6\xeb\x3\x9b\x45\xa0\xb5\x64Jz\x9dm\x4\xcf\xddL\x13\xf6\\\x82`\x1d" -"}|\xeet,L\xf1\xf8\xe5\xea\x12\xc1\xc\xeeQ\xf0\x41\x7\x6\xc7\xab\x9f\x4\xe7\xd1\xb8" -"\x81\x5\xa6\x9bH\xb3\xa0\x45\xf3\x1d\x36\xdf\xb8\xf3S\xac/\xd6:\xad\x15\x66\xe7m" -"$u\xb7\xca\xb4\x98m\xe0\x8d\x95\x1\xf0\xfa\xa0\x41\xb3\xd2x\xa9\xcf\x63v\xaa\x89" -"\x95\xc0\xb0\x39\x30\xfd\xeb\x8b\xcb\xaa\x1dz\xad\x34\x9a\x31\xdf\x1dRY\x93\x1bT" -"h\x8d\x95\xcb\x36\xe4\xe0@A\xf9zrm'\x8H\x8e\xd6\xdb\xe3\x1e\x92g\xc9\x46`\x8a\xe7" -"H(\xc8\xefK\xa3@#\xe8N\xa8\"\xbb\xcc\xab\x19\x63 MY\x91\x9a\x82\x99\xca\xe9\x88\x14" -"/Bp\x84\xe9\xb6\x32\x9b(:]\xbbJli\x9a\x94\x6\xcZ\xd6^\xbb\xaf\x44\x9d,\xea\r\xcb" -"\x9c\x99\x66\xfa\xa6\x39~\x8f\x99j\xdf\xaa\xfc*\xaf[+\x93\xb6\x7f\x41-%M@\x8d$.\x1c" -"\xc7\xc8/\xc6\x18\x94v\x88\x34.\x82[\xacn: `\x84P\xd6\x31*\xc5\x8c\x8c^\xc0-\x1\x9" -"4\xbb*\x92\x32\xd9\x1f\xe4V\x83l\x15\xbe\x3\xc5\x6kW\xe5\x18\xae\xa7\xec\x9\xd0J" -"1P\x8cm\xc\"\xb7\xfe\xe3Mw\x92\"\x1\x65\x85\x1\xa3\x9\xc8\xdc\xcfOM\xef\xdc\xf9\xa8" -"j\x8b\xd4N\x18h\xee\xa7I\x86\x82,\xb9o\xc7\xd0\x17\x82\xe7ME\xddLh\xed\x64\x8e\xdd" -"\xd1!\xb7'\xe8\x9bU\xdb\xce\x35\xc3\xeeMh\x98\x9f\x1e\x90\xbb\xbe\xabo\xcd\xa7\x85" -"\n\xeb\xfev\x12\xa1\xc6\xb3\x9b=0\xb0\xb4\xe5\x3\x1d\xd2\xc7\x88\x32J\xf5\xca\xf7" -"\x97Q\xe2\xda\xa2\x32\xcbr\x91\x96:\xaeO&\xe\xc6ju\xcaY\xa7\xb\x91\xf9\x9T\xc7\x45" -"\xd8\xe`H\x8a\xb1\xf3\x1c\x1cv\xd6\xe6\xc7=\xea\x17\xd1(4\r\xac\x0\xbe\xce\xeb\x64" -"|\xe\x90\xd5\xd3\xac\xd4\xd1\x16\xfd\xe7w\xb6)\x19\x64\xe6\x12\xda\x14\x65\x9e\x9f" -".|\x18\x42\xd8\x9e,\xe5;\x4\xa6\x1d\x80\x18\xd1\xa0x\xd4\xd4\x44\xaa\x15\x5q\xca" -"\xbfi\xe5R,\x99\xb0jS}\xa3\xe7\x31R\x1fK\x14O@;\xcb>\x93X\x1c\xc3\x66\x94\xe3\x9b" -"\xec\xc\xae\xc\x3\x65V\xa3\xe1\xd4\xbb\x33\xd9\xdb\xac\x66\x45\xabXb\x10\xbd\x9f" -"\xd2\xbe\x62\xe9x\x9b\x1dR\x9d\xcd \x95\xe6\x1l\xdd\x80\x91s\x9c\xdf\xc\xb2\x12\x82" -"\xa2?\xe9V\xe5\xa4\x8c\x12\xfb=\xc7\x63\xe7\xb6g\xe5(\x92\xb3\x95\xd3\xad\xeb\x82" -"\xc3\x8fx\xdd=\\\x10\xbf\x9f\xcc" -"\xea\x1c\x19\xb\xc8i\xdcm\x1e!gmj\xfe\x8\xe9\x8bO\xc2\xd2Z\x14(\x95I\xc7\x90\x9f" -"vp\xbc \xb3\xcfU\x9c\x30p\xa9)\xb1\x5\x83\x94\x87M\xd9\"\xaa\xc1\x93\xce\x97\xc7" -"E\xac\x17\xb9*]e/\xa7od\xd1\xa9\x62\xe3\x98U\xb3\x4\x96\x1f\xdc\xc6\xf\xee\x9d\x3" -"\xf8Va\xf0\xe1\xde\xe5 &s\x11\x38Y\xa5\x9dx6(\xc8\x1fq\x5\xa8\x5g \x80\xd0\xd0\x87" -"\x93\x1d\x39]\x86\x66RA\xf8<5\x16\xe8\xd0\xb4\x96\x0\xecs\xe5\xf3\xc9\x66\x0\x92" -"\x12w\xfc\x9c\x45\x94\x86\x91\xf9\xab`i1B\xd0\xb1\xc4\xaa!\xa3\xbe\xe9\x5+\x7\xb8" -"\xb:|\xd6\n\xe\xe9$[\xdb\x61\x10\x1b\x63\xc9\xf7\x63\xe5\x43\xf0\xda\x90\x16QM\xcc" -"\x12\x86\x12\x66\x4\x18\x9\xa3\xc8[o,)>\xa3\x1e\xd8\xc0\x7f\xe\xf8\x84\xd7\x1b\x90" -"\x7f\xcc_U\xfd?\xa5\xb1(\xd0w}@c\\\x86\xd2\x88\x66ih\xef#\xde\x31\xd1\x1\xca\xd7" -"\xd5\xbd\xff\xe1W\x9b\xca\x42\xeeK\xaa\x92\xe1z\x80S\xc2\xd5i?\x95,\xa2\xf9\xc8\x46\xd3" -")\xdf*\xaa\xec\xe3v,'\xef\xa0\x14\x9e\xe4?\xbb\x38\xf6r\xfa\xb2jK\xc3\n\xc4\xb5\xc2" -"\xf6\xc9\xa5\xc2!g\x9b\x87\xb3\xe9\x11\xa5\x61\xc1\xad\x62IdPJ\xce^7\xf9+a\x4\xba" -"\xa2Q!\xc8\xce\x7f\x86\xb4\x98'\xc9\xfao\xf4\xc3\x96\xc8\xba{$J\x8c\x8e\xf6\xbfv" -"\x84<\xa8\x3\xdeyc\x9dh\xfa\x81\xf7\xfb\x12\x43\xd7.\xa4\xde[\\\x83\xd8s\x17|f\x8d" -"P\xe5~\xc6\"\x1\xa0v\x9bL\xf3\xa8\xdf\xc2\x15\xec\xb7\xae\x65q\xbb\x33|\xff\xb0\xb3" -"\x8b:LPoOJZ7\xc0\xba\xb7\xb7\xac\xb9]\x5+\xc0\xf\x7\xb5\x5\x9\xdb_\xc5\x19\xd0lX" -"\xc3\xfb\xfc\x97\xce\xb0\x31\x88\x7\xaa\xeb/t\x11\x65\xb7\x9\x1e$o8f\xdb\x42\xed" -"\xf7\x35\xc0\x39\x83>\x18-\xc9\x4\xb8\x1b\x87)\x17\xdc)\xd0\xd1\xef\x36?~ \x7Z\r" -"\xe6=\xf9\xe0\x9br\xc1\xa7{\xcd\xdf\xb\xaf\xaa\x3\xc9\xcdg\xe7\xa0\xad\x8\x99\xe5" -"%\xea\xaa\x0GW\xf8,h\x80\x9c\xe4\xda\x96\xdfP\xb7\xd8@\x1u$\x88nc\x2<%\xb4N\xaf\xa9" -"\xf2\x9c+\x12Z8\xe8\xebh\x86\xdf\x9f\xb9\xc8\xf8\xeb\x42\x64\xc1G\xaa\xd9~\xbf!6" -"\xde\x44\x13\x1f\xc6\x33J\x89\x9f\xc\xb3\xd8\xaf\xa5\xf0\x9c\x89\xc6\x4\r\xd6\xc8" -"~\xa2;\xd1:1\xe6~\x93\xaf\x3gzH\x1\xc7ix\x90\xcc\xf8\xfc\xbdV%\xb/\xe0\xc9\xc9\xd3" -"K\xff\x1c\x85\xc1\x9f\xa5\xb3\x80 6\xb2\x9eYY4\xe2R\x8a\xb9\xeb\xedT\xcc\xe7\x6\xa9" -"\x99&\x16k\xc1\xbc\xb0\xf1\x34\x44\x9e\xd1\x86\x6\xb8yE\xf5\xfd\xfc\xa8\xbe\x38T" -"\x9a@$d\xcd\x8e@w\xe6\xb\xcdn \xd5\x11\xb0\xe2w:\xe2\xd3\x1f\xe9\xb5\x17\x93\xb8" -"}\xac\xcc\ny-\xfc\xbd\x9c\xd8\xa6\x8b\xd7\x41<\x8b\x5\x9e\xe6z\x10y\xef\xf8\xbd\x8c" -"p\xf2\x8a\x0$\x8a\xfe:\x8a\x8cn\x82\x9b.\xc8\x1cx\xb5\xf3\x4Y\xc2\x1bG/\x87\xc7\x8a" -"\xac\xd1\xf2x\xdeT\xe4z|.\xa6\xa9\x8a\x8f\x8e&\xbf\x82t\xa2\x7\x33\x3\x34\xea\x94" -"\xbf\x9d\x12\xf0\xb9\xba\x9e~\x8eq\xb5\xd9\xb3Y\xa4o\x9\x43\xf2U\xb5\x1a\xbd\xd8" -"\xa6\x1\x14(C\xcd\xf2\x12\xde\xca\xa5\xe7\xa5?\xa8Ig^\xa5\xd5\xa6\x44\x46\x9d\x36" -"\xb8\xb0\xab\x9e 6`\x9b\x81O\xf8mbb\xb3\x96WV\xce\x64\xdb\x39,*\xe3\x9dti\xed\xec" -"\x93\xa0\xca\x86\xdfs\x0}\x19\x9f\xf7\xd5\x1fXL\x12P\xe4\x33\x0N\x2\x80\xde\x93\xfd" -"\x13}\x80\xa7um\xe6Y\x95}\x9b\x39g'\x2\xd5\x80\x92>\xf7|\x81" -"\x92\xcdX\xc9\x5\xb9\x6\x86M.@\x13\x84\x37+\xc7\xac]\x3\xea\r<\x7f'`q\x1\x8c\xae" -"\x13}\xe4'\x1a\xf9\xf9\x8V\x7\xd9\x8e\x65\x87h\x9a\x44\xdd\xbd\xb0\x88\x3\x11\x82" -"I\xb2\x7f_{\xae\xef\xa8\x10\xea\xe6\xf6\x2|\n\xa7\x2\xcb\xc1\xe7\x10\x35l\xd6\x81" -"F#\xb3\x35\x91\x90\xc3\xc2%,)\xe9\xbf\x86\x8d;\xa4\x1e#[\xa1\x89\x87\xbeH\x9a\x9d" -"\xdb\xc3|\xf0*\x1\x1fV\x19M\xd0\xb4\x7f{\xe5\x17\xda\xb\x37\xa2\xc0\xf9\x16s\x10" -"\xe\x8bZP\x94j4\x2\xcd\xca;\x95\xb3\x11\xd1\xbf\xa1\xa3\xc7\x18\x0\x61\x90\x19\x15" -"\xc0\x9cL\xd0M\xe1\x44\x80\xceX\xc3\xf6n4o~R\x9e\xa0{Ra\x85\xa6\x46\x43\xa2\xf8\x1c" -"\x9c=x|&U\xfa\x31\xe8\x43Q\x92\x95\x11\x6@\xab&\x85<\xc\xfc\xc\xeb\xbcU\x16\xb4\x1d" -"\x98\xba\x5\xac\xfe\xb\x96\xe5\xd6\x9c'\xd8\xbd&!AR\x9e]q\"/\x1e\x82}G\x9b^\xac\xbd" -"\xee/\xef\xc9IK\xc8\xd7\xb3\x8c]X\xd5\x13\xed\xceVgDU\xb0\xe2g\x11\x65\x8e\x36\x36" -"6+k\xa2\x1e\x66S=\x88\xfb-\x17\x5%H\xbf\xb0\xd7\x18\xc<\xe0\x80\x1a\x9d\xaa\xa4\x8d" -"p\xb3\xec\x94\\\xdb\xabJ\xf1t\x3\xaf\xd5\xc0\x1cM\xa0\x9b\xef\xc3s\x84\x12\xf3\xd2" -"\xa9\xf4\xd2\"^`\x8d\x11/\x94\xd0\xb6\x33\x65\x80\x61\x39\x15Z\xe0\x80N\x1f\x1X\x14" -"\xbf\xae\x85\x38\x64]\xfd\xbe\x1d\xd9\x37+=\x1a\xf4\xf5\xd1#\xae\xba\x34\xb2\x42" -"\xcf\x11\x41\x9\xadL?\x5\xb\xdbv\xff\xbcw\xae\x8I\n,\x1c\xf9Ve%c\x7\x1f\x9fH\x84" -"\xbb\x2\xe7\xfb\x1eg\x1a\x7\xc0\x94\xd7|z\xe5/\x92\xc6\x1b\x8f\x30\xe8\x85,Y\xbd" -"\xdb\"\xae\x5$\x1c\x8/\x91\x9fG\xc5\x8c\x35\xcM\x13Uz\xf1\x35\x33\xfd\xca,\xfe\x12" -"\x9c\x94\x14\xd6H\x92\xab\x1b\xa5\xa6h\xe9kJ\xc5\xc8\xda\x0\xee\xe\x16\x97\xc2\"" -"\x1ZM\x1G\xae\x18\x99@\xbU&\x97\xa0n\xe6\xa9\xd8$G21\xfch\xf6\x9b\x35\xd7\x8b\xe9" -"\x8c\x39\x1d\x83H\xb\xcd'\x95-\x96\xf5\xe0\xb4\x42\xec.\x6[,\xcf\xaaR\xb2\r\xfe\xe1" -"\xc4\x9b\xea\x41\x81\x14i\x96\xd9/\xc5\xcc\xd8H.\xc7\xc\xa6\xa0\x1%Jd\xc6=\xf0\x1" -"t\x91%\xcc\x66\x85H\x8d\xcd\x13\xca\xd4\xa4\xe0\x38`\xf9\xe1o\xfc\xa4\xf4v\xc7W\xf5" -"\x16\x8e\x99\x6%\x9b\xfc\xcb(\x8\x36\x9fy\x85\x8a\x88\x87V(yOG\xc6\n\xb1\xb9\\.t" -"\xd1\x30\xdaPj\x92\xb2P\xa4?\x82\xce\x1a\x5#b9\n/\xefI\xcb\xdaN\xbc\xa4?\xa9)\xb3" -"\xadP\x9d\xce\x91\x8f]\xc3\x9d\x65x\x14]\xff;+\xbb\xd1\xe9'|\x80\x81\x8e\x13\xb6" -"\x19\xf1\xe\x82Y-\xf3L\x88\xe3\xa6\n\x66\xd0x\x1b\xd7\x63\xfag\x1c\xca\xa7\xc6\xc" -"\xb2\xd5 \xce\xd2\xda\xe8\xdd\xf1\x95\x96\x1c\xaf$1\xb5nO\xb5w\xaa\xb3\xeID\xa1\x39" -"\xea)\xf3\xa4JG\x19\xe4\xe1\xd8w)\x98\xf2\xbft\xaa)\xc1\xc4\x1aG*\xfc\xd1\x34\xaf" -"ra\xe1\x9e\xbx\xb3N;\xf2:\x90\x8a^\x96\xad\xc3\x41\x15g\xbf\xd0N\x16\x9e\xcc\xa0" -"@\xb2\xb0\x41\\\x2l\xe6\xd0\xc9\xe1\x5\x8e!s=\xa3\x8d'o\xad\x38\x10\xea\x1e\xdf\x96" -"\xee\xfa\xb9\xa0z\x99\xeb\\\x9d\xda\x97.\x1e\xb\x83<\x8c\x45\xf4`g$9\xe7N\xb8\xfa" -"\x1c\xd0\xdc\x93\x13\xb\x9eY\xb9&{J\x9d#\xc2]\xe6\xcd\x9c\x38\x0\xfb\x33\xa5\x17" -"\xb5\xebJ\xd2\x37\x9c\xb7p\xe0\x83\xa7" -"\xcd:\x93\xee\xe6\x15sD\xe5g-\xa5\xee\x42\xab\xfbNj\xf4\x98\xb5\x43Q\x8aj]1;\x1a" -"\x85\x45#0\xb0g\xd9Ln\xc2\x9\xf2/\x7f>\x9c\x10\x9a\xd7\x8f\xdd\xa9 \x14\xd8\x46\x98" -"\x87K\xb8\x33\x1f\x97,F\xa3\xda\xb9\x43<\x6\x34\xee\xd2\xa9&\x17\x4w]\xe2U\x10\xf1" -"\xe1?\xf8\x92\x8cJ\xa2\xf\xc4\xbbY\x16\x43\x80t\n\x86\xbdL\x9a_\xfd\xe\x35\xbe\x9a" -"K\xe*\xa4\xc6j\xe1}\xe8|\xf4\x4\x9b\xd7\xa4\xa2x\xe6\x88\x90\xday\x1f=\x0*\xb1\x12" -"\xeb(\xf7UM\xfd|M\xc3\x98\xbe\xd5\x93^(P>-\xc4\xe7\x10Yqp\xbf`\xae\xc8\x8fh\xe7l" -"\xc3\xbc=\x12\xd9NYa\xe0\xdd\x1d\n\x92\xc4\x38[)?g9\xe5\x8\xf1%(w/\xf5o|H*xy\nV\x89" -"Xh\x18;)\x9e\xbe\xad\xce\xf9\xe4\x99\x36\x31\xf1\xa7\xcb\xf3V#\xd7\xd8`\x1e!\x8c" -"\x2Q\xf2\xf8\xdf\xd8\x1b\x92\x8#\x91\x7\xc2v\xa5V\xe\xf7k\xaf\x91ZI\xeI\x4\xe4\x97" -"\xf1\x9c\x3\xf7\x1\xfb\xeG\xec\x38\x88\xc0:u\xb6$Z\xdb\xe\x87\x8b\x4}}\xeb\x88T\xfd" -"\xfc\xaf\xac\xd0m4\xe9}\xcc\x43\xd2\xfb\xf3\x81\xcf\x19PJ\r\x96\x84\x64@JF\xc7!\xee" -"\xd8m\x1fv<1\x1\xeck\x83\x8e\xa6\xa3\x94'\xf4\x7\x1c\xee\x96\x12\x1b\x1a\xf6\xab" -"t\xdd\xeekNK\x15\x66|\x96\xf1\xcd\x1d\x1\xdc\xef,\xd5\x30\x36\x7f]*\x97\x88^&i\xda" -"R\x17\x9d\xc4\xd7.K\xa7Q,aY\xb7\x1fO\x93\xeb!\xbdOb\x1cV./H\xbf\xda\xb3\x9eq;\xd6" -"N\xb1z\xf6I\xef}\xf8@\xa4\x39\xdf\xb\x1.\xfa\x81\xf1\x66\x62\x14\xc5\xb4P\xf0\xa4" -"\xf7\x6Z\x97\xbl\n\x84\x6yp0\xd6\xee\x94}\x97\x1dx{ba]hZ'\xd3\xae\x3\x85.\xf8.\x1e" -"Qzv\x12S\x84\x8\xcai\x83\x14\x19\x33\xc4\x85\x2\xfb\x2\x36\x62\xe2)\xfd@w~>\xd9\x96" -"\x8dM>\x99\x44_\xc\xdd>\xbe{\xe5.\xd2\xcb\x83y\x5\x41\x64\xf0\x0\xb2\xec\xba\xc4" -">\x1\xc8\x81K@\xfaK|\xb4P\xa9\xc4_\xcc\xb6\x11,\x9f\xc8\x9\xea\x18\\\xd9\x15g\xcd" -"h\xa4\xe8\xf\n\x35W\x86(\x8eO\x8e\xdc\xa8\x16m\\\"\xe1\xdd\xf4\xde(kA|\xf7\xf3t\xa4" -"\xb0\x99j\x13\xf6GD\x95!\xcb\xc3z\xec\x62T\x1c\xabm\xab\xdc.\xc9\xf4q\xdaT5\xea(" -"\x9a\xfd\xf2\x34\xefI\xa2\x0\x43\xa7\xfe\xa4\x38\xed\xa1\xd8\x44\xd3P\xf0\xdeI\xc" -"\xb4\x36\xe7\x14\xb5\x65\x5\xdd\xff\xa9\x9ajw:\\\x92\x42\x8\xad\xb8\xa8\x65\x90\x1b" -"\x9b\xfd\x16k\xd9H\x8a\"\x8d\xb8VC\xf1Y\x81\x8f>\xb9\x38O\x83\x9d\xc4mK\xd7\x9a\xcf" -"~c\xe\x99\xeb\xf0\xb2\x5\x85O\x9b\xf1\xf0z\xd8\xc2\xce\xd1\xbf 5\xaekD\xbc\"\x81" -"\xfe\xda{\xff\x65\xaf^C\xb6R\xee\x17!1IG&\xdam7\xcbJ\xce\x43\x9d\xe1\xcb\xee\x9a" -"\x7\xb\x1f\xb9T\xe\xa4\xf7\x13\x8c\x37\x10\xd0Hg\xed\xb8[\x95\xdd\xdc\xea<\xf2\x33" -"\xc7\xb8;\xeb*\r\xfe\x43\xc7\x8?\xb9\xde\x10[m3\x88\x8f\x1bk\xf8I\r\xa0\xc2=\xa2" -"S\xb\xc2\x43\nPj\x97\xe8\xcd\xcf)#D\x8a\xb2\xabN&\xc3\xc5\xbf\xbar\x1d\x65\x8c\x80" -"\x9c\x1\xf0\xa8Jb\xc1\xb7#d~K`&`k\x8e\x43\xea\x1e\xaf\xd3\x12\x1d\x85w\x93U#\xa9" -"~\x7f\xd1\xd2\x98l6\xb2P\x96\x97T`\xc8\x91\xe8\x11If\xd4\x39}\xd8\xcc/\x1d\xd5H\xee" -"\x2\x45\x16U\x9c\xcct\x7f\x91$\x8a\xae\xfb\xbfW\x83VX\x84\xb3\x38\x97\x1T\xc5\xe3" -"1\xe2\x94/L\x94\xed\xbc\xd3:\xd1\xb9W\xf2\x98\xc4\xf9\x7f\xf\xe\x11\xf2$\xdei\x86" -"vR~\xb0wmo/4\xe9\xb7,\xdc\x1c\xf8v~\xa1 \\x\xc5\x19+\x97\xbb\xe8gQn\xd4\xcd\x32#" -"\xb3\x96\xb3!\x8b\xe1\xf8\x8e\x97o\xeew\x4\xa2\xdb\x84/\xb1\xaf^Ne\xbb\xcb\xa5t\x8a" -"\xfc\x1bow\x96\xce\xda\xaag\xd7t\xb\xc9\rU\xac\xbaI\xf\x8d~\xc9~\x16\xdbo\x4g?" -"\xdc\x89\xf3X\xbb\xed`\xce_GS\xa9\x86z\xe6\x61\x66\xc6$\xcf%\xe3\x9d<\xd1\xc1\xad" -"w\xe9&P\n.\x14\xe7\xe6\x15\x46\x94\x44*\xad\xdb\xb4\xde\n\x1\xc4\xbb\x1a\x66\xbd" -"\"\xa5\xc2rn\x8\xf7\x31\x85T\xa2\x96\xc9\xc9\x44\xbb\x1f\xeb\xd6y+_\x99g[?I\x4\xb8" -"p\xf3%\x1fk\x86\xfc>\xdaRL\xda\x9e>\x11\x4\xf4`;e\x5\xaa\n[\x14\x8f\xd5?T\xf6\xc4" -"F\x8ahf\xepP\xc8\xbe\xeb\x63\xb/(\x98@m\xc2\xa3\x16\x9a\xc1y\x9\xa5\xbb\x9\xe4mF" -"\xf4\xeb\xc1L\xed\xd8\xd7\xe1?_\x7!\xb3\x96\x37\xde\xf0h\x89\xcd\xdd\xd2Rc\x8f\xe8" -"\x89\x99\xc3\xd7\x1_\xeb\x37\xdf\x98\xc5|\x17O\xd4m\xa3k\xea\xc0\xd8\x7\xba\x9c\x39" -"\xb2\xb9\xf\xfb\x91\xc8\xa8\x63\x66\x37\x8e\xc\xed\xda\x99\xa9\x82\x1e\xb4\x61\x17" -"\x9d\xd3w\x90\x43\x98\x13\xf1\x31\xe0\xac\xf0\xa7\xee\xd5\xa6}\x88\xe4\x35\x12\x93" -"\xdc\xd4M e\xf0\x19\\S\xd7\x7V\xaf\xd5L\rV$\x1\xa0\xf2q\x7\x8f;\xe7\x34Y\nW\xad\x46" -"m\xde\xf0R.%\xf0\xf8^\x9\n\n.N7Lm\x10X\x8e\xbc\x32\xc9\x90\xe\xeb\xb6\x2\xd5\x44" -"\xb0y@6\x12\x0\x8a\x39\x33\x5\xc8\xb0\xc5\x36\xcb\x8\xa3\x9c$`5\xbaV\xd9\xcb\x35" -"\xa2\xd6u\xfd\x33\x98\x9c\x13\x3\x43\xc2\xa1\xaf\xd1\x9e\xf6\xf7u\xb8\x10z>\xb3\x1b" -"\x9an\xd3\x85\xa4\x86\x84\n\xb\xd0\x15-\xa1\xa6NF\xcfG\x1e\xd8\x11'\x86>\xb7\x1a" -"!\x8\x32\x97>\xa6\xfa\x32\x65\x99\x90\xe9?\x7H\xdaz\xd2wO\x81\x63\xfa\xed\xf1S\xf1" -"v\r\xc9\xeaW\xe\xc0\x34zD\xf6\xf8\xee\x44\xa9J\xc\xd0\x94\x8f\x34\x1a\xe2\x33\xf3" -"\x19|\xab%\xb\xd9o\xa7`\x92\xe8x`\xb5\x18\xb8Qj$\xa3\xe2zI\xce\x8c\xe9\x36\xd5\x91" -"S\xe_0\x94`\n\x19\xe9\xebq\xad+\x14\x8e\\\x0\x95\x96\x97w\xf4\x63\x1\xf5\xce\xd7" -"\xb3\xba\xb5\x96\x65\x94?\xec\xa8\xb8\xd5~\x15\xe3\x39h%#t\xdd^@}I\xf2,:\x14\x84" -"^s\x98\xaa\xa2\x1fs\xef\x80x\xd7,\x94\xf2\x91\xda'\xbd\x8a(\xe8\x83\xe1r\xf8&\x80" -"|\xb4}\xa3#=\r\xef\xe\xfb\xf9\xf1\xa0\x7\xe3U\x8fo\xfcR\x1d\x66\x9a\xb8\x45VX\x4" -"e}\xa8\x31S\xd6:\xd0\xed\xb4\x43\xc$\"\x91\xf\x91\x14[\xa3\xd6\x92\xbe\xac\xd4\x46" -"\xae\xf8\x14 U\xfa\xb1\x36V\xba\x9b\x33I\x1b\xd1)>\x16\xbc\xbd\xdb\x62HJ\x99\x92" -"\xdf\x98n\x89,X\x93\x1a\xd5X>\x1a\xc3\x80u\xf8o\xeb%\xc1\xac\xb3\x94\xbd\x1c\xbd" -"\x8f-{8\xc5\xa9\xd8\x82K\xd0\x81\xeesW\xf7\xcd'\xad\xa7\xea@2\xee\x1d;\xee\x65\x91" -"\"\x11{\x87\x4\x66\xfb\xc7\xa1\xe5\xc%\xffP\x6\x8d\xb3N\xce\xa6\xf1\xef\xa1\x9^e" -"\x12\x42\x18\xaf\x0\x44m\xa1\xb9\x8f\xcbo\x9a\x32IM\x7f\x13\x12\xeb\xef\x41\x32x" -"\xbe*\xcbLp\x15p\xd9V1h\xf0\xc9i\xba&\xb7\xfa\r\x34\x86*\xa4\xa0\xa0\xf2\x1fk\xdd" -";\x98\x95\xc5\x9f\xfd(\x95\xde\xd8\x1f\xc5\xa1\x33\xdc\xd2\xdb\x30\xfe\xd8i#\x8f" -"\x1\x9a\xc\xc4O5\xc6N\xf2\xd8\x42\x85\x3gv\xd6P\x93\xeal\x82\xa8W}z\xb2\xc8\x96l" -"(\xb\x6\xd5\xf0\x66\x5Mlkd\x83\x33\xf5\xcf/'\x1bjK2\xb3I\x1b}N\x7\x94\xc2t\xf8\x9e" -"M\x91\x91\x34\x1c\x85\xc7\x8f\xa7yq\x8a\xd5\xdc\xe5\xe3\r\x44H\xd3}%\xc7\xc4\xc1" -"w\x9e\xeN\x16\x9b\x8al\x9a\xe4TJ1'\x1f\xc6&\x91\xc7\x9b)\x8f\x31\xc4\xc4}\xc\xfd" -"hhq\xf0\xc3\x9f\xec\xb\xfa'Dy\xf\x90[X\xd2_\xbf\xb1\xdc\x98\xf\x11\x85\x17\xc2\x19" -"W\xc9\x8cMnYk\x9b\xc2\x46\xfd\x9a\x96\x1e:\xb2\xd3\xf4\xd7\x37\x9\x92\x93Q\xee\x13" -"\xf3\x64\x8d\xc\xac\x93_\xf9\x8b_#\xff\x86:\xefM\xb9$\n(\xad\x1\xa0\xbe,7\xa7\xe7" -"\xe\x34\xc\x91\x14\xb2,\xe7GU\x96\xa1\x32\x3\x87y\xd9%\xf9\x19\xe9\x30\xf4\xa8\xb8" -"\xa2\xf7_\x6\x1d\x5\n\x92\x18YM\xf9\x9e\x8fz\xd8\x85\x46Y<\x94Ir\x88OllI\x7f_\xff" -"\x1f\xe0\x9#\xcd\xf5\xd1\xe3\xb9\xa2\xcc\xce\x3\xe8\x15s\xe0\xb6\xf8\x11/Y\xa9\x12" -")\xf2\xf2\x1b\\&i\x7f\xc4\xc6.\xdc\xe9\x35\x65\xeV\xb1\xaf\xc7u\x7~\x8c\xbe\xb1\xdf" -"\x1b\x1b\xe5\xd1\x38\x8e\x33\x12\xabG\x1cH\xf8\x42\xb5\xb8%%\xd0\x39s\xba^\xbd\xa3" -"\xf1\x37y\xa6\xc1\x9d\xda\xcb\xc8-_AVJ\xfc*\xae\x90\xde\x85(\x1bt\xf8\xf2\x86\xe8" -"\xf`j\x9e\n\xdd\x5\xbf\x90[\x9a\x3\xffN!L\xb4\"\xed\xc\x8c]\xa7\x65\xcfpWtbQM\r>" -"z\xfb\xc5\xa0>\xc5\x35\xd5\x42\xd3\x8d~\x9e\xe6\x9g\xaa\xd3\x8e\xcf\x18\x94\x44`" -"_7w\xac\xbc\xbe\xce\xf6\x19}o_0W\x8b\xd5\x89~\xf2*|V/T@z\xb1\x0S}\x12\xb3r\xecy\xbe" -"\x1b\xe6\x15\xbc\x1c\x89&> \x8a\\\x16\x96\r)5\x87\xac\xbb\xd9\xa0\xd4\x95\xfe\xa8" -"\x14\x8b\xe7\x43q\xc1\x39\xeb\x1a\xf1*\xa1\xcd\xb9\xb6\xfb\x92\xb6trx\xf4\xaf]\xf4" -"\xe2/\x9fq\xee\xb3\xa5Irg\xc4\xf9xB\xa4\x91\xe5\x66\x8e_0y\x8\x13\xadK\xed\x38\xca" -"\xfa\xa4Lr]#\x9b\xf2\xc6\xf\x83\xec\xde\xe4\xabj\xed\xd7G\x1b\xa4\x99t\xae\x3\x16" -"F\xc6\x37\xd5\x43\x66\xae\xa0\x87\r@{Y\xf1\x9e\xa2\x81\xf2\x12\x35\x1f\xb4.m\x98" -"\xb7\xa1\x36\xdb\x8a\xd9\xf3\x5Or\xed\xc\xa0\x45\x1e\xfb\xd1N3\x8\x94\x0T\xfd\xfe" -"\xc9\xaa\x8\xef\xe9U\xcf\xaa\x42\x16\xd8.\xc6vt2\xc1Q^\xbaP\xe7\x30\xffX\x1e\xc1" -":\xfd\xd9\xfb\x9bI\x15\x7f\x95\xae|\xad:\xf3~]\x1\xc3\x17\x7\n\x5\x66J4\x9a\xe1r" -"\xb2\xd3\xc4\x98\xab\xbc\x82\x1b}\xad\x91\xfa\x8cG\xe3\xd2\xc2\xba\xb3\x1d,&I01!" -"\x84\xc\xe=\xf0\xee\x1\xf0\x1|\x88\xe5\xc9Y\x8b\xca\xa0\x98\x91\xab\x36Z\xf9\x6\xca" -"\xec\x82\x9c\xa6\xd2j\xe4\x1cM\x84\xc7\xb6Hz#/ `\x3\"\xc1hF\x7\xdd\\P\xeaO\x94o\xd0" -"\n\xae!\r\x1fM\xea^\xd7\x9\xfd\xeaz\xe7.\xaa\xfd\x14\x7\xf0\x8d\x8b\xbe_\xaa.\xc2" -"e\xf5\xff\xeZ\x1d\xcK/ H\xe9_\xffjX\x1b\xd0{-\x81\xc4Uj\x15\xf\xf8\xf8\xbN\x96\xa3" -"\xbb\xb4$\x12\xeb\x37\xd1\xc9\x1b\xca\xc4\xfcs\xbd!\xdf\x9e\xf4k\xc2\xd0\xcat\x3" -"'b\xfb\xef\xfVY(\xe7\xa0\x8bh\x1b\x86\xcew\\\x9c\x87\xd7\x98S\xa0Y\xff\xb2\xb2r\xee" -"\xab\x39\x8b\n\xc4\xe0\xb8\x92\x1f\x89\xab\xf2\x41)A\x8c\xaf\x9f\xed\x0\x45\xd6(" -"\xf8t\xd7I\xbe\xd0\x9f]y\xf1\xed\xc8T\x7\xcc\x1a\xb6{1\x3\xfb\xd2\xc4?\xd0\x66\xf2" -"\r\x91\xb5\xe9\xed\x86\xe9\xe3!\xe0\x8a\xd1\x13\x5\xff\x83G\xaa\x9\xeb\x31\x80\xf9" -"Qj\xbe\r\xf5X\xa5hVD\xf4T_s\x89(\x8e\x5?41\xd0\x8a\xfe\xbd\x84\xb0\x5\xb5\x9b\x18" -"\xe7\x43\xed;\x1c\xa4\x43\x88\x1f\xb9\xbd)\x9c\xa0=\xa3v\xe4\xe8\x1f\xe2\xc3\x91" -"\xfdH\x6\xc3\x9a *_)\x85\x91\xa9@F\xa0'\xe3\xd6\xd3\x1b\xfb\xfa@\x6=\xd5\xd2\xd8" -"\x98\xd7\xd0*\xa1\x45\x63-8\xb\x33s]-\xf5\xf\x45\xc\x8\x1d!z\x9b.\xd6\xf\x81\xec" -"2\xd6\xf1\x9f\x9d\x64\x1\xf9\xb6-\xa0\xad\xc6\xe7\x5\x85\x89P\x1c\xd3\x13\xe9\xcf" -"X\xb5\xdc\x34\xe1 G\xe2P\x12\xa8\xac\x95\x85\x2\x62\x81\xbe\x33\x44\xdb\xce\xaa\xc5" -"\x98\x33\xe5\x31M\xc4\xd4\x45,\xb\xbc%\xc6\x65\x8c\x35K\x1c\x4\x16I\xccq\xd3\xe2" -"\xacw@n\x19\x3\xed\xd2\x1a\x91\xd2\\*e\xb1\xb2\x16g\xba,\xa4:\x11\xec\x43\xf3\\L" -"c\xae\xc3\x97\x91\x1c#h&\xbb\x7f\xb9\xab\x86\xfa\xdf\x9c\x9e\x18t\x7\xca\xed\xa7" -"\x82\x2\xb0\x97\x95\xed\xf2m\xad\xdfWH\x0\xc3\x92\xbeQt\x8f\xc2\xbdg\xe4l`\xe8;\xec" -"^\xf8T%K6X\xe2T[\x1b\x62\xa5\xda\xc0\x8e\xa0\xaa\x8a\xe3\xc4\xc1\xcb\xb1\x89\x64" -"\xba\xf7\xa0?\x93\xeb\xeb\x8a\x61j\xdc\xe5\xc5\xcf\xfb^\x1d\xa8\xa1L\xe1\xbb\x43" -"\xf7\x1c\xb8\x98\xda\x1\xb2t1q\xe4\x99N\x7f\xf0,\xa8\xef\xdd\xffH]\xd1\xfd\xab?\x9f" -"\x1f\x38\x87\x3\x33:?\xee\xb7\x99\xc4\x1a\xffw\x0\x0\x1f\xc8\x9e\xc4\xb4\xba\x45" -"\xa2\x98\xbc\xf8\x12\x12vI\x8c\x9f;\x19:\x16\x10\x94'\xdc\xd7\xa1Z\xf2S}\xa6\x15" -"lE}\xe6\x18!S\xf8\xd0\x91\xa8\x94\x65Mn\xe3#\x82\x81\xe\xb8\xf0^\n\xb0\x99q\x3 \xd3" -"\x19\xad_\x97\x9aJ\xb8M\xef^\xf1\xea\xf1RK\x90#\xbbI+\xbc\x89\x5\xc5\r\xdf\x45\xe6" -"\xd1v\xed\xb2\xc8\xc7\x9bMN\xc\x84\x83\x98\xcd`\xdd\xa8\xf3\x46\xe1\"\x31\xbf\x95" -"\x7f\xee\xdd\xbe\xd7\xa4\xbd\x91\xac\x45s$\xfd\xb2\x86\x66\x86\xfb\x18@U\xe7\xf\xf5" -"\x87\x1e\xdd\x1\xcaO\xc8\x45{\x87\xbdw\xe2\\:x\xe6V~\x90Z\xc3U\xd9\xa4\xe\xd2Y\x84" -"\xb2p&\xb7\xca\xd4\x30\xc\x88=\xee\xc8\xd4\x9@^;\xb5 A\xd5\x1aU\xee\x10\xfV\x5\x37" -"O\xb0\xa5\x35\xe6\xba\xff\xb9\x86.@\x9a\x43q\xae\x2\x12\x1n\x8bi\xe4\x8a*\xdd\xb7" -"\xa3&f\x1\x86\xa3\" " -"h\xa9:A\x17\xc4;2Yt\xd4\xf+U-\xfd\xe5\r\xb7g\xcc\xa8\x9e\xa3(\xdapG\xbeL\x90-\x1e" -".vb\xb5\xba\x30(\xc7\x8a\x95\xe3\x15\x64\x1d\x89\xb0\x35R%\xdf\xc3\xac\xc6\x9f \xca" -"9x\x96\x15\xcf|\xa7\xe\x30\x9b\xddVn)\xfer\xba;L\x1e\xab\xc1\x37T\x5\x8e}K\xc9\xe4" -"\x8\xf8\xec\xec\xb5\xe1\xceU1\xa4g\x80y\x9f)\xed\xd0=oV|w\xc1\x93\x13\xe2\x90J\x8f" -"\xc0\xd8\xcc)\xf8\xbc\xb6\x9dNq}\xf7\xf5\xf2-\x92\x1e\xbb\x43zl\x1d\xe1\x2\xeb,\xf2" -">0\xe9H%\xd2;\x1d\xc0\x62\xcf\xd3_W\xc0\xaf\x1f\xd0\xe4\xdd\x11J\x83\"\x8fS6u\x9e" -"@\xa4Qh\xb\xe6\xe5\xd6\x9e\xce\xa3\r\xb8\xb6\xbf\xa1*\x94\xb8\xe5?\x1d\xfb\xc2\xe5" -"\x98:\xe3\xb2\x11\xb3\xd1\xe9\xd7\xae\xec'\xee\xf3\x98\x66MNB\x9fP[\xc2\x1\n\x1d" -"\xa8L\xea\x64\xb9G\xda\xdf\x34\x94\x61\x97\x33=\x1a\xf4\x39t\xac\x64\xb\xa0|\xba" -"/bp\xc1\x1b'\xb7\xbc\x9d\xf4\x1dNv\xcd\xcf\xf5\xe5\xf3\xedN\xbc\xfW=1\xfe\xe2\x89" -"\x5\xb1\xbc\xf\x61p8p%+\xda\xba\x64\x4\xd5\x9J\xedh\xfaL\xa0k \xacya\x99\xce*\xc4.\xa2\xe8\xcf\xe7" -"\xae\x6\x19\xb1\xde{<\xc9{\xb5\xb3@s\xe1\xa4y\xaf\xc4\xa0\x92&\xed\xb4\xc7\xfe\xa4" -"\x90\xee\\\x83&\xb6\x34\xbb\x93\xf\xfc\x95Q\xba%\xcf<\x88\xa6\x8d\x8a\xa8JY\xf2S" -"$W\x84\x46/\xe4J\xe\xb3\"R\xbb\x38Q\xb9]A<\xb5\xbfX\x1a\xfd##y\x16\x32\xc7\x65\xc0" -"\xa3y\xd1\x84\x9c;\xedKf\xe1N\x9\x1b\x1fi\xd3\xf\xea\xd1\xc3\x95\xc1\x95Y\xb?<6\xe7" -"\xde]=\x1b\xe1\xc7\xa6MI:\x1b\xde\xe9*\xb3\xe3M8\x9d\x8f\xc3\xbf\xbcv\xe4\xab\x62" -"<\xa7\xb7\xfe\x1f\xc9\x5\xbc\x8dq\xeb\x1c\xe6\x63\x9a\x61L\xf\xcc\x35|\xcc\x1b\x61" -"M\xbc\xf5qr\xe8\xf5R\xd8\x43\x9\x7fZD\x90\xeTu<\x1a\x90\x5\x32':>\xc4=f+P\x11\xce" -"A\xe7\x30\x35N\xec\\,\xc2!\x9f}X\xac\xde\xa6\xab\xa7Hu--v\x85t\x95\xf5)b\xe5\xf8" -"\xc1\x65\xcd\r%M]\x84\x37\xb5\xd5\xbf\xe6\xc9[\xc8\x88*O\xd2\xeb\x86_\x9a\xb5L\xc3" -"\xf1J@u\xd0\x7f\xd4\xb3\xaf\x98\x17\x1f\xb7>\xc2\xd7\x64z$n\x16\x1b\x98t\rtCq\xf3" -"flz}\x12\xf6\xd7\xd1Vm\x11%\x42$U\x82\x44\xc8\xc\xf1\xfa\xc5\x1\x96L\x97\x62\x61" -"\xdb\x85\xf6\xf7St\x1b\x8bZ&\x8aV\xa5\xc5\x8e!B\x1b\xa9\x84\xda\xda\x83\x8c\xdd\xd8" -"l\nr\r\x1d\xe4\xb0\x8f\xb9\xf4\x9e\x7<\xc5\xc1\x92\xb9\x9o\xc4\x30\r\x3\x8c\x1f\x32" -"\n\x3\x95\xfc\x11\x37\xd5\x8c\x82\x62\xbc\x41\x12\x9b\x14-\x87\xf4\x35\xc5\x88\xee" -"\x1cx\x2\xe7\x42[9\x91\xf8Ox\x80/\xb1\xbfg\x94\xeb!\xe\x41\xcdMiQ\xe1\x45\x7f\xb3" -"\x1a\x85\xbc\xda\x84\xf7\xd6\xde\x8cWb\x87+\x9\xe\xcf\xech\x1d\xe4\xe7\xc1{\xa1\xd3" -"\xc0\xc7\xcf~\xac\x95\xe9\xc2,X\x7f\xf7\xab'\n\x8e\x85\xdd\xb4\x82\xef\xec\xd6\x85" -"\x9dn\xcVe\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" -"000000000000000000000000000000000000000000000000000\r000000000000000000000000000" -"0000000000000000000000000000000000000\r00000000000000000000000000000000000000000" -"00000000000000000000000\r0000000000000000000000000000000000000000000000000000000" -"000000000\r0000000000000000000000000000000000000000000000000000000000000000\r000" -"0000000000000000000000000000000000000000000000000000000000000\r00000000000000000" -"00000000000000000000000000000000000000000000000\r0000000000000000000000000000000" -"000000000000000000000000000000000\rcleartomark\n\x80\x3" -; -int n019003l_afm_len = 31763; -char* n019003l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusSanL-Regu\n" -"FullName Nimbus Sans L Regular\nFamilyName Nimbus Sans L\nWeight Regular\nItalic" -"Angle 0.0\nIsFixedPitch false\nUnderlinePosition -151\nUnderlineThickness 50\nVe" -"rsion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development\nEncod" -"ingScheme AdobeStandardEncoding\nFontBBox -174 -285 1001 953\nCapHeight 729\nXHe" -"ight 524\nDescender -218\nAscender 729\nStartCharMetrics 316\nC 32 ; WX 278 ; N " -"space ; B 191 0 191 0 ;\nC 33 ; WX 278 ; N exclam ; B 124 0 208 729 ;\nC 34 ; WX" -" 355 ; N quotedbl ; B 52 464 305 709 ;\nC 35 ; WX 556 ; N numbersign ; B 14 -20 " -"542 697 ;\nC 36 ; WX 556 ; N dollar ; B 26 -126 518 770 ;\nC 37 ; WX 889 ; N per" -"cent ; B 29 -20 859 709 ;\nC 38 ; WX 667 ; N ampersand ; B 52 -23 637 709 ;\nC 3" -"9 ; WX 221 ; N quoteright ; B 64 497 157 729 ;\nC 40 ; WX 333 ; N parenleft ; B " -"73 -212 291 729 ;\nC 41 ; WX 333 ; N parenright ; B 38 -212 256 729 ;\nC 42 ; WX" -" 389 ; N asterisk ; B 40 441 343 729 ;\nC 43 ; WX 584 ; N plus ; B 50 -10 534 47" -"4 ;\nC 44 ; WX 278 ; N comma ; B 87 -147 192 104 ;\nC 45 ; WX 333 ; N hyphen ; B" -" 46 240 284 312 ;\nC 46 ; WX 278 ; N period ; B 87 0 191 104 ;\nC 47 ; WX 278 ; " -"N slash ; B -8 -20 284 729 ;\nC 48 ; WX 556 ; N zero ; B 43 -23 507 709 ;\nC 49 " -"; WX 556 ; N one ; B 102 0 347 709 ;\nC 50 ; WX 556 ; N two ; B 34 0 511 709 ;\n" -"C 51 ; WX 556 ; N three ; B 32 -23 506 709 ;\nC 52 ; WX 556 ; N four ; B 28 0 52" -"0 709 ;\nC 53 ; WX 556 ; N five ; B 35 -23 513 709 ;\nC 54 ; WX 556 ; N six ; B " -"43 -23 513 709 ;\nC 55 ; WX 556 ; N seven ; B 46 0 520 709 ;\nC 56 ; WX 556 ; N " -"eight ; B 37 -23 513 709 ;\nC 57 ; WX 556 ; N nine ; B 38 -23 509 709 ;\nC 58 ; " -"WX 278 ; N colon ; B 110 0 214 524 ;\nC 59 ; WX 278 ; N semicolon ; B 110 -147 2" -"15 524 ;\nC 60 ; WX 584 ; N less ; B 45 -9 534 474 ;\nC 61 ; WX 584 ; N equal ; " -"B 50 111 534 353 ;\nC 62 ; WX 584 ; N greater ; B 50 -9 539 474 ;\nC 63 ; WX 556" -" ; N question ; B 77 0 509 741 ;\nC 64 ; WX 1015 ; N at ; B 34 -142 951 741 ;\nC" -" 65 ; WX 667 ; N A ; B 17 0 653 729 ;\nC 66 ; WX 667 ; N B ; B 79 0 623 729 ;\nC" -" 67 ; WX 722 ; N C ; B 48 -23 677 741 ;\nC 68 ; WX 722 ; N D ; B 89 0 667 729 ;\n" -"C 69 ; WX 667 ; N E ; B 90 0 613 729 ;\nC 70 ; WX 611 ; N F ; B 90 0 579 729 ;\n" -"C 71 ; WX 778 ; N G ; B 44 -23 709 741 ;\nC 72 ; WX 722 ; N H ; B 83 0 644 729 ;" -"\nC 73 ; WX 278 ; N I ; B 100 0 194 729 ;\nC 74 ; WX 500 ; N J ; B 17 -23 426 72" -"9 ;\nC 75 ; WX 667 ; N K ; B 79 0 658 729 ;\nC 76 ; WX 556 ; N L ; B 80 0 533 72" -"9 ;\nC 77 ; WX 833 ; N M ; B 75 0 761 729 ;\nC 78 ; WX 722 ; N N ; B 76 0 646 72" -"9 ;\nC 79 ; WX 778 ; N O ; B 38 -23 742 741 ;\nC 80 ; WX 667 ; N P ; B 91 0 617 " -"729 ;\nC 81 ; WX 778 ; N Q ; B 38 -59 742 741 ;\nC 82 ; WX 722 ; N R ; B 93 0 67" -"9 729 ;\nC 83 ; WX 667 ; N S ; B 48 -23 621 741 ;\nC 84 ; WX 611 ; N T ; B 21 0 " -"593 729 ;\nC 85 ; WX 722 ; N U ; B 85 -23 645 729 ;\nC 86 ; WX 667 ; N V ; B 30 " -"0 645 729 ;\nC 87 ; WX 944 ; N W ; B 22 0 929 729 ;\nC 88 ; WX 667 ; N X ; B 22 " -"0 649 729 ;\nC 89 ; WX 667 ; N Y ; B 13 0 661 729 ;\nC 90 ; WX 611 ; N Z ; B 28 " -"0 583 729 ;\nC 91 ; WX 278 ; N bracketleft ; B 64 -212 250 729 ;\nC 92 ; WX 278 " -"; N backslash ; B -8 -20 284 729 ;\nC 93 ; WX 278 ; N bracketright ; B 23 -212 2" -"09 729 ;\nC 94 ; WX 469 ; N asciicircum ; B 44 329 425 709 ;\nC 95 ; WX 556 ; N " -"underscore ; B -22 -176 578 -126 ;\nC 96 ; WX 222 ; N quoteleft ; B 65 477 158 7" -"09 ;\nC 97 ; WX 556 ; N a ; B 42 -23 535 539 ;\nC 98 ; WX 556 ; N b ; B 54 -23 5" -"23 729 ;\nC 99 ; WX 500 ; N c ; B 31 -23 477 539 ;\nC 100 ; WX 556 ; N d ; B 26 " -"-23 495 729 ;\nC 101 ; WX 556 ; N e ; B 40 -23 513 539 ;\nC 102 ; WX 278 ; N f ;" -" B 18 0 258 732 ;\nC 103 ; WX 556 ; N g ; B 29 -218 489 539 ;\nC 104 ; WX 556 ; " -"N h ; B 70 0 486 729 ;\nC 105 ; WX 222 ; N i ; B 66 0 150 729 ;\nC 106 ; WX 222 " -"; N j ; B -18 -218 153 729 ;\nC 107 ; WX 500 ; N k ; B 58 0 502 729 ;\nC 108 ; W" -"X 222 ; N l ; B 68 0 152 729 ;\nC 109 ; WX 833 ; N m ; B 70 0 762 539 ;\nC 110 ;" -" WX 556 ; N n ; B 70 0 487 539 ;\nC 111 ; WX 556 ; N o ; B 36 -23 510 539 ;\nC 1" -"12 ; WX 556 ; N p ; B 54 -218 523 539 ;\nC 113 ; WX 556 ; N q ; B 26 -218 495 53" -"9 ;\nC 114 ; WX 333 ; N r ; B 69 0 321 539 ;\nC 115 ; WX 500 ; N s ; B 34 -23 45" -"9 539 ;\nC 116 ; WX 278 ; N t ; B 14 -23 254 668 ;\nC 117 ; WX 556 ; N u ; B 65 " -"-23 482 524 ;\nC 118 ; WX 500 ; N v ; B 10 0 486 524 ;\nC 119 ; WX 722 ; N w ; B" -" 6 0 708 524 ;\nC 120 ; WX 500 ; N x ; B 17 0 473 524 ;\nC 121 ; WX 500 ; N y ; " -"B 20 -218 478 524 ;\nC 122 ; WX 500 ; N z ; B 31 0 457 524 ;\nC 123 ; WX 334 ; N" -" braceleft ; B 43 -212 276 729 ;\nC 124 ; WX 260 ; N bar ; B 100 -212 160 729 ;\n" -"C 125 ; WX 334 ; N braceright ; B 29 -212 262 729 ;\nC 126 ; WX 584 ; N asciitil" -"de ; B 75 268 508 438 ;\nC 161 ; WX 333 ; N exclamdown ; B 121 -205 205 524 ;\nC" -" 162 ; WX 556 ; N cent ; B 52 -120 510 628 ;\nC 163 ; WX 556 ; N sterling ; B 26" -" -23 535 729 ;\nC 164 ; WX 167 ; N fraction ; B -174 -20 336 709 ;\nC 165 ; WX 5" -"56 ; N yen ; B 11 0 545 709 ;\nC 166 ; WX 556 ; N florin ; B 11 -212 542 738 ;\n" -"C 167 ; WX 556 ; N section ; B 43 -213 506 729 ;\nC 168 ; WX 556 ; N currency ; " -"B 67 133 489 551 ;\nC 169 ; WX 191 ; N quotesingle ; B 48 464 142 709 ;\nC 170 ;" -" WX 333 ; N quotedblleft ; B 48 477 299 709 ;\nC 171 ; WX 556 ; N guillemotleft " -"; B 98 106 455 438 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 91 106 243 438 ;\nC 1" -"73 ; WX 333 ; N guilsinglright ; B 85 106 239 438 ;\nC 174 ; WX 500 ; N fi ; B 1" -"2 0 436 732 ;\nC 175 ; WX 500 ; N fl ; B 17 0 430 732 ;\nC 177 ; WX 556 ; N enda" -"sh ; B -5 240 561 312 ;\nC 178 ; WX 556 ; N dagger ; B 38 -177 513 709 ;\nC 179 " -"; WX 556 ; N daggerdbl ; B 38 -177 513 709 ;\nC 180 ; WX 278 ; N periodcentered " -"; B 87 302 211 427 ;\nC 182 ; WX 537 ; N paragraph ; B 48 -177 522 729 ;\nC 183 " -"; WX 350 ; N bullet ; B 50 220 300 470 ;\nC 184 ; WX 222 ; N quotesinglbase ; B " -"64 -128 158 104 ;\nC 185 ; WX 333 ; N quotedblbase ; B 47 -128 300 104 ;\nC 186 " -"; WX 333 ; N quotedblright ; B 49 477 302 709 ;\nC 187 ; WX 556 ; N guillemotrig" -"ht ; B 98 106 451 438 ;\nC 188 ; WX 1000 ; N ellipsis ; B 115 0 885 104 ;\nC 189" -" ; WX 1000 ; N perthousand ; B 9 -22 993 738 ;\nC 191 ; WX 611 ; N questiondown " -"; B 95 -217 528 524 ;\nC 193 ; WX 333 ; N grave ; B 22 592 231 740 ;\nC 194 ; WX" -" 333 ; N acute ; B 92 592 301 740 ;\nC 195 ; WX 333 ; N circumflex ; B 20 591 30" -"7 741 ;\nC 196 ; WX 333 ; N tilde ; B 5 613 319 717 ;\nC 197 ; WX 333 ; N macron" -" ; B 28 631 302 701 ;\nC 198 ; WX 333 ; N breve ; B 15 597 316 732 ;\nC 199 ; WX" -" 333 ; N dotaccent ; B 115 612 219 716 ;\nC 200 ; WX 333 ; N dieresis ; B 30 612" -" 296 715 ;\nC 202 ; WX 333 ; N ring ; B 79 579 255 754 ;\nC 203 ; WX 333 ; N ced" -"illa ; B 39 -214 287 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -35 590 348 740 ;\n" -"C 206 ; WX 333 ; N ogonek ; B 57 -205 265 0 ;\nC 207 ; WX 333 ; N caron ; B 19 5" -"91 306 741 ;\nC 208 ; WX 1000 ; N emdash ; B -9 240 1001 312 ;\nC 225 ; WX 1000 " -"; N AE ; B 11 0 950 729 ;\nC 227 ; WX 370 ; N ordfeminine ; B 37 303 333 742 ;\n" -"C 232 ; WX 556 ; N Lslash ; B 0 0 552 729 ;\nC 233 ; WX 778 ; N Oslash ; B 30 -2" -"3 744 755 ;\nC 234 ; WX 1000 ; N OE ; B 43 -20 959 741 ;\nC 235 ; WX 365 ; N ord" -"masculine ; B 40 303 324 742 ;\nC 241 ; WX 889 ; N ae ; B 34 -23 845 539 ;\nC 24" -"5 ; WX 278 ; N dotlessi ; B 94 0 178 524 ;\nC 248 ; WX 222 ; N lslash ; B 0 0 21" -"2 729 ;\nC 249 ; WX 611 ; N oslash ; B 18 -30 529 539 ;\nC 250 ; WX 944 ; N oe ;" -" B 40 -23 899 539 ;\nC 251 ; WX 611 ; N germandbls ; B 126 -20 566 729 ;\nC -1 ;" -" WX 722 ; N Udieresis ; B 85 -23 645 914 ;\nC -1 ; WX 722 ; N Uacute ; B 85 -23 " -"645 939 ;\nC -1 ; WX 667 ; N Scedilla ; B 45 -214 621 741 ;\nC -1 ; WX 611 ; N T" -"caron ; B 21 0 593 940 ;\nC -1 ; WX 667 ; N Scaron ; B 48 -23 621 940 ;\nC -1 ; " -"WX 722 ; N Rcaron ; B 93 0 679 940 ;\nC -1 ; WX 722 ; N Racute ; B 93 0 679 939 " -";\nC -1 ; WX 667 ; N Sacute ; B 48 -23 621 939 ;\nC -1 ; WX 778 ; N Otilde ; B 3" -"8 -23 742 916 ;\nC -1 ; WX 556 ; N ucircumflex ; B 65 -23 482 741 ;\nC -1 ; WX 7" -"78 ; N Ohungarumlaut ; B 38 -23 742 939 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 8" -"5 -23 645 939 ;\nC -1 ; WX 666 ; N Yacute ; B 13 0 661 939 ;\nC -1 ; WX 722 ; N " -"Eth ; B 20 0 667 729 ;\nC -1 ; WX 722 ; N Dcroat ; B 20 0 667 729 ;\nC -1 ; WX 6" -"11 ; N Zacute ; B 28 0 583 939 ;\nC -1 ; WX 722 ; N Uring ; B 85 -23 645 953 ;\n" -"C -1 ; WX 556 ; N gbreve ; B 29 -218 489 732 ;\nC -1 ; WX 556 ; N eogonek ; B 40" -" -204 514 539 ;\nC -1 ; WX 556 ; N edotaccent ; B 40 -23 513 716 ;\nC -1 ; WX 55" -"6 ; N ecaron ; B 40 -23 513 741 ;\nC -1 ; WX 722 ; N Ugrave ; B 85 -23 645 939 ;" -"\nC -1 ; WX 666 ; N Thorn ; B 91 0 616 729 ;\nC -1 ; WX 556 ; N eacute ; B 40 -2" -"3 513 740 ;\nC -1 ; WX 556 ; N edieresis ; B 40 -23 513 715 ;\nC -1 ; WX 635 ; N" -" dcaron ; B 26 -23 648 729 ;\nC -1 ; WX 500 ; N ccedilla ; B 31 -214 477 539 ;\n" -"C -1 ; WX 500 ; N ccaron ; B 31 -23 477 741 ;\nC -1 ; WX 500 ; N cacute ; B 31 -" -"23 477 740 ;\nC -1 ; WX 556 ; N aogonek ; B 43 -205 596 539 ;\nC -1 ; WX 556 ; N" -" aring ; B 42 -23 535 754 ;\nC -1 ; WX 556 ; N atilde ; B 42 -23 535 717 ;\nC -1" -" ; WX 556 ; N abreve ; B 42 -23 535 732 ;\nC -1 ; WX 556 ; N egrave ; B 40 -23 5" -"13 740 ;\nC -1 ; WX 556 ; N agrave ; B 42 -23 535 740 ;\nC -1 ; WX 556 ; N aacut" -"e ; B 42 -23 535 740 ;\nC -1 ; WX 556 ; N adieresis ; B 42 -23 535 715 ;\nC -1 ;" -" WX 722 ; N Uogonek ; B 85 -205 645 729 ;\nC -1 ; WX 556 ; N ugrave ; B 65 -23 4" -"82 740 ;\nC -1 ; WX 556 ; N uacute ; B 65 -23 482 740 ;\nC -1 ; WX 556 ; N udier" -"esis ; B 65 -23 482 715 ;\nC -1 ; WX 308 ; N tcaron ; B 14 -23 321 800 ;\nC -1 ;" -" WX 500 ; N scommaaccent ; B 34 -285 459 539 ;\nC -1 ; WX 611 ; N Zcaron ; B 28 " -"0 583 940 ;\nC -1 ; WX 556 ; N ecircumflex ; B 40 -23 513 741 ;\nC -1 ; WX 722 ;" -" N Ucircumflex ; B 85 -23 645 940 ;\nC -1 ; WX 556 ; N acircumflex ; B 42 -23 53" -"5 741 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 28 0 583 915 ;\nC -1 ; WX 500 ; N scar" -"on ; B 34 -23 459 741 ;\nC -1 ; WX 667 ; N Amacron ; B 17 0 653 900 ;\nC -1 ; WX" -" 500 ; N sacute ; B 34 -23 459 740 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 21 -285" -" 593 729 ;\nC -1 ; WX 667 ; N Ydieresis ; B 13 0 661 914 ;\nC -1 ; WX 555 ; N th" -"orn ; B 54 -218 522 714 ;\nC -1 ; WX 667 ; N Emacron ; B 90 0 613 900 ;\nC -1 ; " -"WX 778 ; N Ograve ; B 38 -23 742 939 ;\nC -1 ; WX 778 ; N Oacute ; B 38 -23 742 " -"939 ;\nC -1 ; WX 778 ; N Odieresis ; B 38 -23 742 914 ;\nC -1 ; WX 722 ; N Ntild" -"e ; B 76 0 646 916 ;\nC -1 ; WX 722 ; N Ncaron ; B 76 0 646 940 ;\nC -1 ; WX 722" -" ; N Nacute ; B 76 0 646 939 ;\nC -1 ; WX 556 ; N Lcaron ; B 80 0 533 729 ;\nC -" -"1 ; WX 556 ; N Lacute ; B 70 0 533 939 ;\nC -1 ; WX 278 ; N Idotaccent ; B 92 0 " -"196 915 ;\nC -1 ; WX 333 ; N racute ; B 69 0 331 740 ;\nC -1 ; WX 278 ; N Icircu" -"mflex ; B -1 0 286 940 ;\nC -1 ; WX 556 ; N ohungarumlaut ; B 36 -23 526 740 ;\n" -"C -1 ; WX 556 ; N otilde ; B 36 -23 510 717 ;\nC -1 ; WX 556 ; N Euro ; B 2 -23 " -"543 709 ;\nC -1 ; WX 556 ; N ocircumflex ; B 36 -23 510 741 ;\nC -1 ; WX 351 ; N" -" onesuperior ; B 61 284 222 709 ;\nC -1 ; WX 351 ; N twosuperior ; B 19 284 326 " -"709 ;\nC -1 ; WX 351 ; N threesuperior ; B 16 270 322 709 ;\nC -1 ; WX 278 ; N I" -"grave ; B 1 0 210 939 ;\nC -1 ; WX 278 ; N Iacute ; B 71 0 280 939 ;\nC -1 ; WX " -"278 ; N Imacron ; B 20 0 274 900 ;\nC -1 ; WX 278 ; N Iogonek ; B 66 -204 234 72" -"9 ;\nC -1 ; WX 278 ; N Idieresis ; B 9 0 275 907 ;\nC -1 ; WX 778 ; N Gbreve ; B" -" 44 -23 709 931 ;\nC -1 ; WX 722 ; N Umacron ; B 85 -23 645 900 ;\nC -1 ; WX 667" -" ; N Kcommaaccent ; B 79 -285 658 729 ;\nC -1 ; WX 556 ; N ograve ; B 36 -23 510" -" 740 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 48 -285 621 741 ;\nC -1 ; WX 667 ; N " -"Eogonek ; B 90 -205 652 729 ;\nC -1 ; WX 556 ; N oacute ; B 36 -23 510 740 ;\nC " -"-1 ; WX 667 ; N Edotaccent ; B 90 0 613 915 ;\nC -1 ; WX 222 ; N iogonek ; B 25 " -"-204 190 729 ;\nC -1 ; WX 556 ; N gcommaaccent ; B 29 -218 489 817 ;\nC -1 ; WX " -"556 ; N odieresis ; B 36 -23 510 715 ;\nC -1 ; WX 556 ; N ntilde ; B 70 0 487 71" -"7 ;\nC -1 ; WX 556 ; N ncaron ; B 70 0 487 741 ;\nC -1 ; WX 667 ; N Ecaron ; B 9" -"0 0 613 940 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 90 0 613 940 ;\nC -1 ; WX 500 ;" -" N scedilla ; B 34 -214 459 539 ;\nC -1 ; WX 333 ; N rcaron ; B 48 0 335 741 ;\n" -"C -1 ; WX 667 ; N Egrave ; B 90 0 613 939 ;\nC -1 ; WX 667 ; N Eacute ; B 90 0 6" -"13 939 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 44 -285 709 741 ;\nC -1 ; WX 722 ; " -"N Rcommaaccent ; B 93 -285 679 729 ;\nC -1 ; WX 667 ; N Edieresis ; B 90 0 613 9" -"14 ;\nC -1 ; WX 556 ; N nacute ; B 70 0 487 740 ;\nC -1 ; WX 556 ; N uogonek ; B" -" 65 -204 521 524 ;\nC -1 ; WX 556 ; N umacron ; B 65 -23 482 701 ;\nC -1 ; WX 72" -"2 ; N Dcaron ; B 89 0 667 940 ;\nC -1 ; WX 292 ; N lcaron ; B 68 0 305 729 ;\nC " -"-1 ; WX 722 ; N Ccaron ; B 48 -23 677 940 ;\nC -1 ; WX 722 ; N Cacute ; B 48 -23" -" 677 939 ;\nC -1 ; WX 722 ; N Ccedilla ; B 48 -214 677 741 ;\nC -1 ; WX 606 ; N " -"degree ; B 151 383 454 686 ;\nC -1 ; WX 667 ; N Aogonek ; B 17 -205 692 729 ;\nC" -" -1 ; WX 584 ; N minus ; B 40 197 544 267 ;\nC -1 ; WX 584 ; N multiply ; B 95 3" -"4 488 427 ;\nC -1 ; WX 584 ; N divide ; B 50 0 534 472 ;\nC -1 ; WX 667 ; N Arin" -"g ; B 17 0 653 953 ;\nC -1 ; WX 1000 ; N trademark ; B 63 292 938 729 ;\nC -1 ; " -"WX 333 ; N rcommaaccent ; B 65 -285 321 539 ;\nC -1 ; WX 222 ; N lacute ; B 63 0" -" 272 939 ;\nC -1 ; WX 556 ; N omacron ; B 36 -23 510 701 ;\nC -1 ; WX 667 ; N At" -"ilde ; B 17 0 653 916 ;\nC -1 ; WX 278 ; N icircumflex ; B -7 0 280 741 ;\nC -1 " -"; WX 278 ; N igrave ; B -5 0 204 740 ;\nC -1 ; WX 556 ; N ncommaaccent ; B 70 -2" -"85 487 539 ;\nC -1 ; WX 222 ; N lcommaaccent ; B 63 -285 163 729 ;\nC -1 ; WX 58" -"4 ; N plusminus ; B 50 -11 534 623 ;\nC -1 ; WX 869 ; N onehalf ; B 61 -20 844 7" -"09 ;\nC -1 ; WX 869 ; N onequarter ; B 61 -20 849 709 ;\nC -1 ; WX 869 ; N three" -"quarters ; B 16 -20 849 709 ;\nC -1 ; WX 278 ; N iacute ; B 65 0 274 740 ;\nC -1" -" ; WX 667 ; N Abreve ; B 17 0 653 931 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 58 -" -"285 502 729 ;\nC -1 ; WX 778 ; N Omacron ; B 38 -23 742 900 ;\nC -1 ; WX 222 ; N" -" imacron ; B -16 0 231 701 ;\nC -1 ; WX 556 ; N emacron ; B 40 -23 513 701 ;\nC " -"-1 ; WX 556 ; N amacron ; B 42 -23 535 701 ;\nC -1 ; WX 278 ; N tcommaaccent ; B" -" 14 -285 254 668 ;\nC -1 ; WX 500 ; N ydieresis ; B 20 -218 478 715 ;\nC -1 ; WX" -" 500 ; N zdotaccent ; B 31 0 457 716 ;\nC -1 ; WX 500 ; N zcaron ; B 31 0 457 74" -"1 ;\nC -1 ; WX 500 ; N zacute ; B 31 0 457 740 ;\nC -1 ; WX 500 ; N yacute ; B 2" -"0 -218 478 740 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 65 -23 530 740 ;\nC -1 ; W" -"X 556 ; N eth ; B 36 -23 510 743 ;\nC -1 ; WX 556 ; N uring ; B 65 -23 482 754 ;" -"\nC -1 ; WX 778 ; N Ocircumflex ; B 38 -23 742 940 ;\nC -1 ; WX 333 ; N commaacc" -"ent ; B 116 -285 216 -60 ;\nC -1 ; WX 737 ; N copyright ; B -13 -22 751 742 ;\nC" -" -1 ; WX 737 ; N registered ; B -13 -22 751 742 ;\nC -1 ; WX 667 ; N Acircumflex" -" ; B 17 0 653 940 ;\nC -1 ; WX 278 ; N idieresis ; B 3 0 269 708 ;\nC -1 ; WX 48" -"9 ; N lozenge ; B 16 0 462 744 ;\nC -1 ; WX 711 ; N Delta ; B 10 0 701 729 ;\nC " -"-1 ; WX 548 ; N notequal ; B 32 -25 516 486 ;\nC -1 ; WX 542 ; N radical ; B 7 -" -"36 512 913 ;\nC -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ;\nC -1 ; WX 667 ; N Aac" -"ute ; B 17 0 653 939 ;\nC -1 ; WX 584 ; N lessequal ; B 45 -11 534 639 ;\nC -1 ;" -" WX 584 ; N greaterequal ; B 45 -11 534 639 ;\nC -1 ; WX 584 ; N logicalnot ; B " -"40 86 544 375 ;\nC -1 ; WX 711 ; N summation ; B 17 -97 694 760 ;\nC -1 ; WX 490" -" ; N partialdiff ; B 22 -15 458 750 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 76 -28" -"5 646 729 ;\nC -1 ; WX 556 ; N dcroat ; B 26 -23 557 729 ;\nC -1 ; WX 260 ; N br" -"okenbar ; B 100 -212 160 729 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B 80 -285 533 7" -"29 ;\nC -1 ; WX 667 ; N Adieresis ; B 17 0 653 914 ;\nC -1 ; WX 556 ; N mu ; B 6" -"5 -220 544 524 ;\nC -1 ; WX 278 ; N .notdef ; B 191 0 191 0 ;\nEndCharMetrics\nS" -"tartKernData\nStartKernPairs 998\nKPX A C -36\nKPX A Ccedilla -36\nKPX A G -35\n" -"KPX A O -33\nKPX A Odieresis -33\nKPX A Q -32\nKPX A T -93\nKPX A U -37\nKPX A U" -"acute -37\nKPX A Ucircumflex -37\nKPX A Udieresis -37\nKPX A Ugrave -37\nKPX A V" -" -75\nKPX A W -51\nKPX A Y -99\nKPX A a -4\nKPX A b 4\nKPX A c -11\nKPX A ccedil" -"la -10\nKPX A comma 5\nKPX A d -8\nKPX A e -16\nKPX A g -10\nKPX A guillemotleft" -" -44\nKPX A guilsinglleft -40\nKPX A hyphen -3\nKPX A o -13\nKPX A period 5\nKPX" -" A q -8\nKPX A quotedblright -56\nKPX A quoteright -65\nKPX A t -16\nKPX A u -12" -"\nKPX A v -31\nKPX A w -21\nKPX A y -34\nKPX Aacute C -36\nKPX Aacute G -35\nKPX" -" Aacute O -33\nKPX Aacute Q -32\nKPX Aacute T -93\nKPX Aacute U -37\nKPX Aacute " -"V -75\nKPX Aacute W -51\nKPX Aacute Y -99\nKPX Aacute a -4\nKPX Aacute b 4\nKPX " -"Aacute c -11\nKPX Aacute comma 5\nKPX Aacute d -8\nKPX Aacute e -16\nKPX Aacute " -"g -10\nKPX Aacute guillemotleft -44\nKPX Aacute guilsinglleft -40\nKPX Aacute hy" -"phen -3\nKPX Aacute o -13\nKPX Aacute period 5\nKPX Aacute q -8\nKPX Aacute quot" -"eright -65\nKPX Aacute t -16\nKPX Aacute u -12\nKPX Aacute v -31\nKPX Aacute w -" -"21\nKPX Aacute y -34\nKPX Acircumflex C -36\nKPX Acircumflex G -35\nKPX Acircumf" -"lex O -33\nKPX Acircumflex Q -32\nKPX Acircumflex T -93\nKPX Acircumflex U -37\n" -"KPX Acircumflex V -75\nKPX Acircumflex W -51\nKPX Acircumflex Y -99\nKPX Acircum" -"flex comma 5\nKPX Acircumflex period 5\nKPX Adieresis C -36\nKPX Adieresis G -35" -"\nKPX Adieresis O -33\nKPX Adieresis Q -32\nKPX Adieresis T -93\nKPX Adieresis U" -" -37\nKPX Adieresis V -75\nKPX Adieresis W -51\nKPX Adieresis Y -99\nKPX Adieres" -"is a -4\nKPX Adieresis b 4\nKPX Adieresis c -11\nKPX Adieresis comma 5\nKPX Adie" -"resis d -8\nKPX Adieresis g -10\nKPX Adieresis guillemotleft -44\nKPX Adieresis " -"guilsinglleft -40\nKPX Adieresis hyphen -3\nKPX Adieresis o -13\nKPX Adieresis p" -"eriod 5\nKPX Adieresis q -8\nKPX Adieresis quotedblright -56\nKPX Adieresis quot" -"eright -65\nKPX Adieresis t -16\nKPX Adieresis u -12\nKPX Adieresis v -31\nKPX A" -"dieresis w -21\nKPX Adieresis y -34\nKPX Agrave C -36\nKPX Agrave G -35\nKPX Agr" -"ave O -33\nKPX Agrave Q -32\nKPX Agrave T -93\nKPX Agrave U -37\nKPX Agrave V -7" -"5\nKPX Agrave W -51\nKPX Agrave Y -99\nKPX Agrave comma 5\nKPX Agrave period 5\n" -"KPX Aring C -36\nKPX Aring G -35\nKPX Aring O -33\nKPX Aring Q -32\nKPX Aring T " -"-93\nKPX Aring U -37\nKPX Aring V -75\nKPX Aring W -51\nKPX Aring Y -99\nKPX Ari" -"ng a -4\nKPX Aring b 4\nKPX Aring c -11\nKPX Aring comma 5\nKPX Aring d -8\nKPX " -"Aring e -16\nKPX Aring g -10\nKPX Aring guillemotleft -44\nKPX Aring guilsinglle" -"ft -40\nKPX Aring hyphen -3\nKPX Aring o -13\nKPX Aring period 5\nKPX Aring q -8" -"\nKPX Aring quotedblright -56\nKPX Aring quoteright -65\nKPX Aring t -16\nKPX Ar" -"ing u -12\nKPX Aring v -31\nKPX Aring w -21\nKPX Aring y -34\nKPX Atilde C -36\n" -"KPX Atilde G -35\nKPX Atilde O -33\nKPX Atilde Q -32\nKPX Atilde T -93\nKPX Atil" -"de U -37\nKPX Atilde V -75\nKPX Atilde W -51\nKPX Atilde Y -99\nKPX Atilde comma" -" 5\nKPX Atilde period 5\nKPX B A -21\nKPX B AE -21\nKPX B Aacute -21\nKPX B Acir" -"cumflex -21\nKPX B Adieresis -21\nKPX B Aring -21\nKPX B Atilde -21\nKPX B O -7\n" -"KPX B OE -5\nKPX B Oacute -7\nKPX B Ocircumflex -7\nKPX B Odieresis -7\nKPX B Og" -"rave -7\nKPX B Oslash -1\nKPX B V -41\nKPX B W -25\nKPX B Y -44\nKPX C A -32\nKP" -"X C AE -33\nKPX C Aacute -32\nKPX C Adieresis -32\nKPX C Aring -32\nKPX C H -12\n" -"KPX C K -10\nKPX C O -8\nKPX C Oacute -8\nKPX C Odieresis -8\nKPX Ccedilla A -31" -"\nKPX D A -42\nKPX D Aacute -42\nKPX D Acircumflex -42\nKPX D Adieresis -42\nKPX" -" D Agrave -42\nKPX D Aring -42\nKPX D Atilde -42\nKPX D J -5\nKPX D T -45\nKPX D" -" V -51\nKPX D W -29\nKPX D X -53\nKPX D Y -63\nKPX F A -69\nKPX F Aacute -69\nKP" -"X F Acircumflex -69\nKPX F Adieresis -69\nKPX F Agrave -69\nKPX F Aring -69\nKPX" -" F Atilde -69\nKPX F J -51\nKPX F O -22\nKPX F Odieresis -22\nKPX F a -33\nKPX F" -" aacute -33\nKPX F adieresis -33\nKPX F ae -29\nKPX F aring -33\nKPX F comma -10" -"8\nKPX F e -24\nKPX F eacute -24\nKPX F hyphen -14\nKPX F i -10\nKPX F j -12\nKP" -"X F o -21\nKPX F oacute -21\nKPX F odieresis -21\nKPX F oe -23\nKPX F oslash -21" -"\nKPX F period -108\nKPX F r -35\nKPX F u -33\nKPX G A -6\nKPX G AE -3\nKPX G Aa" -"cute -6\nKPX G Acircumflex -6\nKPX G Adieresis -6\nKPX G Agrave -6\nKPX G Aring " -"-6\nKPX G Atilde -6\nKPX G T -44\nKPX G V -50\nKPX G W -28\nKPX G Y -62\nKPX J A" -" -32\nKPX J AE -31\nKPX J Adieresis -32\nKPX J Aring -32\nKPX K C -51\nKPX K G -" -"51\nKPX K O -48\nKPX K OE -45\nKPX K Oacute -48\nKPX K Odieresis -48\nKPX K S -3" -"8\nKPX K T 20\nKPX K a -11\nKPX K adieresis -11\nKPX K ae -7\nKPX K aring -11\nK" -"PX K e -32\nKPX K hyphen -47\nKPX K o -29\nKPX K oacute -29\nKPX K odieresis -29" -"\nKPX K u -19\nKPX K udieresis -19\nKPX K y -62\nKPX L A 17\nKPX L AE 20\nKPX L " -"Aacute 17\nKPX L Adieresis 17\nKPX L Aring 17\nKPX L C -41\nKPX L Ccedilla -37\n" -"KPX L G -42\nKPX L O -41\nKPX L Oacute -41\nKPX L Ocircumflex -41\nKPX L Odieres" -"is -41\nKPX L Ograve -41\nKPX L Otilde -41\nKPX L S -19\nKPX L T -105\nKPX L U -" -"35\nKPX L Udieresis -35\nKPX L V -105\nKPX L W -68\nKPX L Y -121\nKPX L hyphen -" -"125\nKPX L quotedblright -141\nKPX L quoteright -149\nKPX L u -7\nKPX L udieresi" -"s -7\nKPX L y -56\nKPX N A -9\nKPX N AE -6\nKPX N Aacute -9\nKPX N Adieresis -9\n" -"KPX N Aring -9\nKPX N C -3\nKPX N Ccedilla -3\nKPX N G -2\nKPX N O 0\nKPX N Oacu" -"te 0\nKPX N Odieresis 0\nKPX N a -5\nKPX N aacute -5\nKPX N adieresis -5\nKPX N " -"ae -2\nKPX N aring -5\nKPX N comma -7\nKPX N e 0\nKPX N eacute 0\nKPX N o 2\nKPX" -" N oacute 2\nKPX N odieresis 2\nKPX N oslash 4\nKPX N period -7\nKPX N u 0\nKPX " -"N udieresis 0\nKPX O A -35\nKPX O AE -39\nKPX O Aacute -35\nKPX O Adieresis -35\n" -"KPX O Aring -35\nKPX O T -42\nKPX O V -45\nKPX O W -23\nKPX O X -46\nKPX O Y -59" -"\nKPX Oacute A -35\nKPX Oacute T -42\nKPX Oacute V -45\nKPX Oacute W -23\nKPX Oa" -"cute Y -59\nKPX Ocircumflex T -42\nKPX Ocircumflex V -45\nKPX Ocircumflex Y -59\n" -"KPX Odieresis A -35\nKPX Odieresis T -42\nKPX Odieresis V -45\nKPX Odieresis W -" -"23\nKPX Odieresis X -46\nKPX Odieresis Y -59\nKPX Ograve T -42\nKPX Ograve V -45" -"\nKPX Ograve Y -59\nKPX Oslash A -33\nKPX Otilde T -42\nKPX Otilde V -45\nKPX Ot" -"ilde Y -59\nKPX P A -78\nKPX P AE -86\nKPX P Aacute -78\nKPX P Adieresis -78\nKP" -"X P Aring -78\nKPX P J -78\nKPX P a -28\nKPX P aacute -28\nKPX P adieresis -28\n" -"KPX P ae -24\nKPX P aring -28\nKPX P comma -135\nKPX P e -31\nKPX P eacute -31\n" -"KPX P hyphen -40\nKPX P o -27\nKPX P oacute -27\nKPX P odieresis -27\nKPX P oe -" -"28\nKPX P oslash -27\nKPX P period -135\nKPX R C -16\nKPX R Ccedilla -16\nKPX R " -"G -15\nKPX R O -13\nKPX R OE -11\nKPX R Oacute -13\nKPX R Odieresis -13\nKPX R T" -" -23\nKPX R U -17\nKPX R Udieresis -17\nKPX R V -39\nKPX R W -27\nKPX R Y -43\nK" -"PX R a -15\nKPX R aacute -15\nKPX R adieresis -15\nKPX R ae -12\nKPX R aring -15" -"\nKPX R e -12\nKPX R eacute -12\nKPX R hyphen -2\nKPX R o -9\nKPX R oacute -9\nK" -"PX R odieresis -9\nKPX R oe -11\nKPX R u -9\nKPX R uacute -9\nKPX R udieresis -9" -"\nKPX R y -8\nKPX S A -22\nKPX S AE -22\nKPX S Aacute -22\nKPX S Adieresis -22\n" -"KPX S Aring -22\nKPX S T -28\nKPX S V -42\nKPX S W -28\nKPX S Y -48\nKPX S t -3\n" -"KPX T A -95\nKPX T AE -97\nKPX T Aacute -95\nKPX T Acircumflex -95\nKPX T Adiere" -"sis -95\nKPX T Agrave -95\nKPX T Aring -95\nKPX T Atilde -95\nKPX T C -44\nKPX T" -" G -45\nKPX T J -100\nKPX T O -42\nKPX T OE -35\nKPX T Oacute -42\nKPX T Ocircum" -"flex -42\nKPX T Odieresis -42\nKPX T Ograve -42\nKPX T Oslash -41\nKPX T Otilde " -"-42\nKPX T S -24\nKPX T V 12\nKPX T W 16\nKPX T Y 20\nKPX T a -100\nKPX T ae -97" -"\nKPX T c -90\nKPX T colon -133\nKPX T comma -100\nKPX T e -95\nKPX T g -89\nKPX" -" T guillemotleft -121\nKPX T guilsinglleft -117\nKPX T hyphen -77\nKPX T i -3\nK" -"PX T j -5\nKPX T o -92\nKPX T oslash -87\nKPX T period -100\nKPX T r -92\nKPX T " -"s -92\nKPX T semicolon -129\nKPX T u -91\nKPX T v -95\nKPX T w -93\nKPX T y -100" -"\nKPX U A -36\nKPX U AE -39\nKPX U Aacute -36\nKPX U Acircumflex -36\nKPX U Adie" -"resis -36\nKPX U Aring -36\nKPX U Atilde -36\nKPX U comma -27\nKPX U m -4\nKPX U" -" n -4\nKPX U p 3\nKPX U period -25\nKPX U r -4\nKPX Uacute A -36\nKPX Uacute com" -"ma -27\nKPX Uacute m -4\nKPX Uacute n -4\nKPX Uacute p 3\nKPX Uacute period -25\n" -"KPX Uacute r -4\nKPX Ucircumflex A -36\nKPX Udieresis A -36\nKPX Udieresis b 3\n" -"KPX Udieresis comma -27\nKPX Udieresis m -4\nKPX Udieresis n -4\nKPX Udieresis p" -" 3\nKPX Udieresis period -25\nKPX Udieresis r -4\nKPX Ugrave A -36\nKPX V A -71\n" -"KPX V AE -78\nKPX V Aacute -71\nKPX V Acircumflex -71\nKPX V Adieresis -71\nKPX " -"V Agrave -71\nKPX V Aring -71\nKPX V Atilde -71\nKPX V C -43\nKPX V G -42\nKPX V" -" O -40\nKPX V Oacute -40\nKPX V Ocircumflex -40\nKPX V Odieresis -40\nKPX V Ogra" -"ve -40\nKPX V Oslash -33\nKPX V Otilde -40\nKPX V S -35\nKPX V T 15\nKPX V a -59" -"\nKPX V ae -55\nKPX V colon -66\nKPX V comma -89\nKPX V e -57\nKPX V g -50\nKPX " -"V guillemotleft -83\nKPX V guilsinglleft -80\nKPX V hyphen -38\nKPX V i -5\nKPX " -"V o -54\nKPX V oslash -50\nKPX V period -89\nKPX V r -42\nKPX V semicolon -66\nK" -"PX V u -41\nKPX V y -20\nKPX W A -50\nKPX W AE -56\nKPX W Aacute -50\nKPX W Acir" -"cumflex -50\nKPX W Adieresis -50\nKPX W Agrave -50\nKPX W Aring -50\nKPX W Atild" -"e -50\nKPX W C -23\nKPX W G -22\nKPX W O -20\nKPX W Oacute -20\nKPX W Ocircumfle" -"x -20\nKPX W Odieresis -20\nKPX W Ograve -20\nKPX W Oslash -13\nKPX W Otilde -20" -"\nKPX W S -24\nKPX W T 19\nKPX W a -38\nKPX W ae -34\nKPX W colon -52\nKPX W com" -"ma -56\nKPX W e -32\nKPX W g -25\nKPX W guillemotleft -58\nKPX W guilsinglleft -" -"54\nKPX W hyphen -13\nKPX W i -1\nKPX W o -29\nKPX W oslash -25\nKPX W period -5" -"6\nKPX W r -28\nKPX W semicolon -53\nKPX W u -28\nKPX W y -6\nKPX X C -48\nKPX X" -" O -45\nKPX X Odieresis -45\nKPX X Q -44\nKPX X a -15\nKPX X e -36\nKPX X hyphen" -" -51\nKPX X o -33\nKPX X u -24\nKPX X y -61\nKPX Y A -96\nKPX Y AE -103\nKPX Y A" -"acute -96\nKPX Y Acircumflex -96\nKPX Y Adieresis -96\nKPX Y Agrave -96\nKPX Y A" -"ring -96\nKPX Y Atilde -96\nKPX Y C -58\nKPX Y G -58\nKPX Y O -56\nKPX Y Oacute " -"-56\nKPX Y Ocircumflex -56\nKPX Y Odieresis -56\nKPX Y Ograve -56\nKPX Y Oslash " -"-54\nKPX Y Otilde -56\nKPX Y S -41\nKPX Y T 23\nKPX Y a -88\nKPX Y ae -84\nKPX Y" -" colon -87\nKPX Y comma -111\nKPX Y e -89\nKPX Y g -83\nKPX Y guillemotleft -123" -"\nKPX Y guilsinglleft -119\nKPX Y hyphen -84\nKPX Y i 3\nKPX Y o -86\nKPX Y osla" -"sh -82\nKPX Y p -54\nKPX Y period -111\nKPX Y semicolon -88\nKPX Y u -63\nKPX Y " -"v -36\nKPX Z v -33\nKPX Z y -38\nKPX a j -4\nKPX a quoteright -23\nKPX a v -21\n" -"KPX a w -13\nKPX a y -26\nKPX aacute v -21\nKPX aacute w -13\nKPX aacute y -26\n" -"KPX adieresis v -21\nKPX adieresis w -13\nKPX adieresis y -26\nKPX ae v -16\nKPX" -" ae w -10\nKPX ae y -20\nKPX agrave v -21\nKPX agrave w -13\nKPX agrave y -26\nK" -"PX aring v -21\nKPX aring w -13\nKPX aring y -26\nKPX b v -11\nKPX b w -3\nKPX b" -" y -15\nKPX c h 1\nKPX c k 7\nKPX comma one -100\nKPX comma quotedblright -41\nK" -"PX comma quoteright -50\nKPX e quoteright -18\nKPX e t -10\nKPX e v -15\nKPX e w" -" -9\nKPX e x -27\nKPX e y -19\nKPX eacute v -15\nKPX eacute w -9\nKPX eacute y -" -"19\nKPX ecircumflex v -15\nKPX ecircumflex w -9\nKPX ecircumflex y -19\nKPX eigh" -"t four 1\nKPX eight one -48\nKPX eight seven -33\nKPX f a -9\nKPX f aacute -9\nK" -"PX f adieresis -9\nKPX f ae -5\nKPX f aring -9\nKPX f e -15\nKPX f eacute -15\nK" -"PX f f 22\nKPX f i -2\nKPX f j -4\nKPX f l -3\nKPX f o -10\nKPX f oacute -10\nKP" -"X f odieresis -10\nKPX f oe -12\nKPX f oslash -9\nKPX f quoteright 0\nKPX f s 0\n" -"KPX f t 24\nKPX five four 1\nKPX five one -76\nKPX five seven -26\nKPX four four" -" 5\nKPX four one -84\nKPX four seven -56\nKPX g a -5\nKPX g adieresis -5\nKPX g " -"ae -1\nKPX g aring -5\nKPX g e 0\nKPX g eacute 0\nKPX g l 0\nKPX g oacute 3\nKPX" -" g odieresis 3\nKPX g r 0\nKPX guillemotright A -50\nKPX guillemotright AE -54\n" -"KPX guillemotright Aacute -50\nKPX guillemotright Adieresis -50\nKPX guillemotri" -"ght Aring -50\nKPX guillemotright T -126\nKPX guillemotright V -93\nKPX guillemo" -"tright W -66\nKPX guillemotright Y -133\nKPX guilsinglright A -44\nKPX guilsingl" -"right AE -48\nKPX guilsinglright Aacute -44\nKPX guilsinglright Adieresis -44\nK" -"PX guilsinglright Aring -44\nKPX guilsinglright T -121\nKPX guilsinglright V -88" -"\nKPX guilsinglright W -60\nKPX guilsinglright Y -128\nKPX h quoteright -15\nKPX" -" h y -18\nKPX hyphen A -7\nKPX hyphen AE -11\nKPX hyphen Aacute -7\nKPX hyphen A" -"dieresis -7\nKPX hyphen Aring -7\nKPX hyphen T -80\nKPX hyphen V -46\nKPX hyphen" -" W -19\nKPX hyphen Y -92\nKPX i T -7\nKPX i j -3\nKPX k a -2\nKPX k aacute -2\nK" -"PX k adieresis -2\nKPX k ae 2\nKPX k aring -2\nKPX k comma 0\nKPX k e -21\nKPX k" -" eacute -21\nKPX k g -16\nKPX k hyphen -41\nKPX k o -19\nKPX k oacute -19\nKPX k" -" odieresis -19\nKPX k period 0\nKPX k s -3\nKPX k u -11\nKPX k udieresis -6\nKPX" -" l v 0\nKPX l y -5\nKPX m p 5\nKPX m v -13\nKPX m w -7\nKPX m y -18\nKPX n T -96" -"\nKPX n p 5\nKPX n quoteright -14\nKPX n v -13\nKPX n w -7\nKPX n y -18\nKPX nin" -"e four -3\nKPX nine one -43\nKPX nine seven -37\nKPX o T -99\nKPX o quoteright -" -"21\nKPX o t -10\nKPX o v -18\nKPX o w -10\nKPX o x -27\nKPX o y -22\nKPX oacute " -"v -18\nKPX oacute w -10\nKPX oacute y -22\nKPX ocircumflex t -10\nKPX odieresis " -"t -10\nKPX odieresis v -18\nKPX odieresis w -10\nKPX odieresis x -27\nKPX odiere" -"sis y -22\nKPX ograve v -18\nKPX ograve w -10\nKPX ograve y -22\nKPX one comma -" -"74\nKPX one eight -65\nKPX one five -67\nKPX one four -81\nKPX one nine -65\nKPX" -" one one -118\nKPX one period -74\nKPX one seven -90\nKPX one six -62\nKPX one t" -"hree -67\nKPX one two -69\nKPX one zero -62\nKPX p t -4\nKPX p y -16\nKPX period" -" one -101\nKPX period quotedblright -41\nKPX period quoteright -51\nKPX q c 8\nK" -"PX q u 4\nKPX quotedblbase A 30\nKPX quotedblbase AE 30\nKPX quotedblbase T -75\n" -"KPX quotedblbase V -69\nKPX quotedblbase W -34\nKPX quotedblbase Y -91\nKPX quot" -"edblleft A -52\nKPX quotedblleft AE -64\nKPX quotedblleft Aacute -52\nKPX quoted" -"blleft Adieresis -52\nKPX quotedblleft Aring -52\nKPX quotedblleft T 9\nKPX quot" -"edblleft V 15\nKPX quotedblleft W 27\nKPX quotedblleft Y 5\nKPX quotedblright A " -"-53\nKPX quotedblright AE -66\nKPX quotedblright Aacute -53\nKPX quotedblright A" -"dieresis -53\nKPX quotedblright Aring -53\nKPX quotedblright T 11\nKPX quotedblr" -"ight V 15\nKPX quotedblright W 26\nKPX quotedblright Y 7\nKPX quoteleft A -67\nK" -"PX quoteleft AE -79\nKPX quoteleft Aacute -67\nKPX quoteleft Adieresis -67\nKPX " -"quoteleft Aring -67\nKPX quoteleft T -5\nKPX quoteleft V 0\nKPX quoteleft W 12\n" -"KPX quoteleft Y -9\nKPX quoteright A -72\nKPX quoteright AE -85\nKPX quoteright " -"Aacute -72\nKPX quoteright Adieresis -72\nKPX quoteright Aring -72\nKPX quoterig" -"ht comma -60\nKPX quoteright d -20\nKPX quoteright o -26\nKPX quoteright period " -"-60\nKPX quoteright r -18\nKPX quoteright s -18\nKPX quoteright t -7\nKPX quoter" -"ight v -2\nKPX quoteright w 2\nKPX quoteright y -6\nKPX r a -5\nKPX r aacute -5\n" -"KPX r acircumflex -5\nKPX r adieresis -5\nKPX r ae -1\nKPX r agrave -5\nKPX r ar" -"ing -5\nKPX r c -6\nKPX r ccedilla -9\nKPX r colon -22\nKPX r comma -69\nKPX r d" -" -1\nKPX r e -11\nKPX r eacute -11\nKPX r ecircumflex -11\nKPX r egrave -11\nKPX" -" r f 26\nKPX r g -4\nKPX r h 0\nKPX r hyphen -47\nKPX r i 1\nKPX r j 0\nKPX r k " -"6\nKPX r l 1\nKPX r m 0\nKPX r n 0\nKPX r o -6\nKPX r oacute -6\nKPX r ocircumfl" -"ex -6\nKPX r odieresis -6\nKPX r oe -8\nKPX r ograve -6\nKPX r oslash -6\nKPX r " -"p 8\nKPX r period -69\nKPX r q -3\nKPX r quoteright 1\nKPX r r 0\nKPX r s 4\nKPX" -" r semicolon -22\nKPX r t 28\nKPX r u 2\nKPX r v 29\nKPX r w 31\nKPX r x 20\nKPX" -" r y 24\nKPX r z 9\nKPX s quoteright -22\nKPX s t -3\nKPX seven colon -77\nKPX s" -"even comma -119\nKPX seven eight -28\nKPX seven five -30\nKPX seven four -93\nKP" -"X seven one -53\nKPX seven period -119\nKPX seven seven -4\nKPX seven six -40\nK" -"PX seven three -23\nKPX seven two -28\nKPX six four 1\nKPX six one -43\nKPX six " -"seven -30\nKPX t S -8\nKPX t a -1\nKPX t aacute -1\nKPX t adieresis -1\nKPX t ae" -" 2\nKPX t aring -1\nKPX t colon -28\nKPX t e -14\nKPX t eacute -14\nKPX t h -3\n" -"KPX t o -12\nKPX t oacute -12\nKPX t odieresis -12\nKPX t quoteright -1\nKPX t s" -"emicolon -28\nKPX three four -2\nKPX three one -49\nKPX three seven -33\nKPX two" -" four -37\nKPX two one -36\nKPX two seven -25\nKPX u quoteright -8\nKPX v a -18\n" -"KPX v aacute -18\nKPX v acircumflex -18\nKPX v adieresis -18\nKPX v ae -14\nKPX " -"v agrave -18\nKPX v aring -18\nKPX v atilde -18\nKPX v c -16\nKPX v colon -23\nK" -"PX v comma -69\nKPX v e -21\nKPX v eacute -21\nKPX v ecircumflex -21\nKPX v egra" -"ve -21\nKPX v g -14\nKPX v hyphen -12\nKPX v l 0\nKPX v o -17\nKPX v oacute -17\n" -"KPX v odieresis -17\nKPX v ograve -17\nKPX v oslash -17\nKPX v period -69\nKPX v" -" s -9\nKPX v semicolon -23\nKPX w a -15\nKPX w aacute -15\nKPX w acircumflex -15" -"\nKPX w adieresis -15\nKPX w ae -11\nKPX w agrave -15\nKPX w aring -15\nKPX w at" -"ilde -15\nKPX w c -7\nKPX w colon -23\nKPX w comma -50\nKPX w e -12\nKPX w eacut" -"e -12\nKPX w ecircumflex -12\nKPX w egrave -12\nKPX w g -6\nKPX w hyphen -1\nKPX" -" w l 0\nKPX w o -9\nKPX w oacute -9\nKPX w odieresis -9\nKPX w ograve -9\nKPX w " -"oslash -6\nKPX w period -50\nKPX w s -5\nKPX w semicolon -23\nKPX x a -17\nKPX x" -" c -23\nKPX x e -28\nKPX x eacute -28\nKPX x o -25\nKPX x q -20\nKPX y a -22\nKP" -"X y aacute -22\nKPX y acircumflex -22\nKPX y adieresis -22\nKPX y ae -18\nKPX y " -"agrave -22\nKPX y aring -22\nKPX y atilde -22\nKPX y c -19\nKPX y colon -27\nKPX" -" y comma -70\nKPX y e -24\nKPX y eacute -24\nKPX y ecircumflex -24\nKPX y egrave" -" -24\nKPX y g -17\nKPX y hyphen -14\nKPX y l -4\nKPX y o -20\nKPX y oacute -20\n" -"KPX y odieresis -20\nKPX y ograve -20\nKPX y oslash -19\nKPX y period -70\nKPX y" -" s -12\nKPX y semicolon -27\nKPX zero four -2\nKPX zero one -46\nKPX zero seven " -"-39\nEndKernPairs\nEndKernData\nEndFontMetrics\n" -; -int n019003l_pfb_len = 36026; -char* n019003l_pfb = -"\x80\x1]\x6\x0\x0%!PS-AdobeFont-1.0: NimbusSanL-Regu 1.05\n%%CreationDate: Wed D" -"ec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development\n" -"% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPYING" -" (GNU General Public License) for license conditions.\n% As a special exception," -" permission is granted to include this font\n% program in a Postscript or PDF fi" -"le that consists of a document that\n% contains text to be displayed or printed " -"using this font, regardless\n% of the conditions or license applying to the docu" -"ment itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) readon" -"ly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the" -" file COPYING (GNU General Public License) for license conditions. As a special " -"exception, permission is granted to include this font program in a Postscript or" -" PDF file that consists of a document that contains text to be displayed or prin" -"ted using this font, regardless of the conditions or license applying to the doc" -"ument itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by (UR" -"W)++ Design & Development) readonly def\n/FullName (Nimbus Sans L Regular) reado" -"nly def\n/FamilyName (Nimbus Sans L) readonly def\n/Weight (Regular) readonly de" -"f\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -151 def\n/" -"UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusSanL-Regu def\n/Pa" -"intType 0 def\n/WMode 0 def\n/FontBBox {-174 -285 1001 953} readonly def\n/FontT" -"ype 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding Sta" -"ndardEncoding def\n/UniqueID 5020902 def\ncurrentdict end\ncurrentfile eexec\r\x80" -"\x2\x35\x84\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2" -"5\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9" -"%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3" -"&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed" -"\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95" -"\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b" -"\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>nc5+\\3v,\x8eI\xd4\x35L\x99:v\xa0L$" -"l\xa4\xdb\xac\x98\xba:\xd1s\"\xce\xf1\xde a\x93\xe6\x94S\xd9\xfc\xc7\xe3\x98\xa7" -"\xc4\x9c;\x93@QcIzL\xa8\xfd\xe2\xea\x36kGy\xe5\xa7\xbd\xf2\xb1\xa0\xa7\xb\xe8\xa3" -"\xb3Z\x90\x66\x63\x85Y\xed\xba\xb5\xc0\xb\x30@\x1f\\\x64\x9b\xd8\xcf\xe0\"\x83\xd8" -"\xf2\x19\x5\xac\xfc\xed\xcc\x43\x81K\xe7\x17#\x80\xe6\n\xd9\x92\xbc:\xcb\xa3\xf3" -"n\x7\xfets\x89gA\xb4\x19h\xe0\xd0x\x1c/R\x1c\x9\xd2\xc8\xf5\x8\x5\x65\xbd\xe4\x81" -"'R>{q\x95\xc2\xb9\x7f\xc3\xb1'\xd3\xf1\x1\x8f\x89\x12\xf8X\xf9\xec\xe9\xe3\x92J<" -"2\xa6\x1e\x11u\x90\x97\xec_l1H\xda\x35G\x87\x82\x83\xado\xa5q\xb2\xad\x41\xf0j\xe8" -"\xe9L\xfc\xdd\xe0.\xa6=\xf9\xcd\x31@\xeb\x88\x92\xf0\x0u:l\x9bN\xbc:\x8f\xd8\xc7" -"\xdd\xb6\x8\xaf\xa7oW\x12\x88\xbb\x4o\xc5O\x84)\xc3\xc5z\x5\x8b\xfcX&\x93\x11wf\\" -"\xbcRsR\xec\xf3\xb8\xfe\xd5\x37N\x8c\xd2p\x8a\xc2\xa2_[\x87\xf\xe6\r\x64+\xa5\xee" -"\x18m)\xdf\x66\x8d\x9f\x7f\x8b\xae\x34\xa0\x64I\xc3m4b\x8b\xc3}\xe7\x8a)\xf2\xe5" -"\xc6y\xad\xf2\xecV\xa6\x9a\x45\x12\xf5\xea\x8d[\n\xf8\x82\x1\x43\x1f\x31\xb9\r+\x1a" -"\x91\x82\x7f\xedN\xe4\xe9y\xac\x99\x10<\xbb\x16:\x93Pa\xc\xe6\xa4\x34\x63\xdd\x66" -"\xcf\xa4\xa1l4\x10\x63\xbb\xc3\x84\x9c\x63\xa7h\xb7hU\xb8\xac\xe8\xb8\xc5\xe9\x88" -"n\xbb\x98\xf7\x85\x8d\xdf\x94\x44J,\xb3\xfb\x4\x96\x8dkM\xf5j\xc4\xc8\x8d\x1er6q" -"\xb1t\xb8L\xdc\xf9\xab\x41\x94\x1b\x63\x96$\xa2\xc2\x5\x33T\x19Q2\xce\xdb\xcb\x91" -"\xe9\x32x\xf8gt7\xf7Q\xdcl\xa2\x1b\xf7\x46\xf6x 3\x18\xf4\xf4\x8b\xf\x41\x34IF\xfc" -"\xdc\xdb;\xe6\x12\x80\xc1@4i]\x81\xc6=\x91\x83UW\xa3\x32}_S\xec\x95\x45\xb5\x9\xf8" -"\xcc\xfe\xd3\xefi\x1a\xff\x90\x8a\x99m\xaf\x16\xf7\x8ag\xe1\xb5@\xe4H\r\xdcK,\xaa" -"\xfe|z\xfa\xd2l\x98\x88m\x83r+\x90\x88\x45\xe4\xeiP\x7f\xfa\x1d\x13\xb7~\xeeW\x11" -"439\x98\x9\xe1>P\x9d*U\xfe\x8cz\x1b\xf1\xfbl\xc6\xd8\xccW?g\x88\xca\x66\xa5^\xeb" -"b\x11\xfc\xfc\xfe\x92U\x8a\xb7:8\xef\xff\xe1\xd6\xd3\xcb\x62n\xe8s\xe\x89\xcc\x42" -"\xa5\xfd\xce\xb3\xdd;L\xd6\xf0\x13\x15\xe0\x83\xa0\x1a\x8f\xf1\x17\x64\xe1\xc4\xc6" -"\x1f\x62\x89;\x17\xe0\x1\xecx\xc5\xf3\x9a+[D*@d\xc4?\x5\xd9\xf9\x1a\xea\xb9\x99\x8d" -"i\xc8~\x9e\xda\xd3\xbdZ\xe4\x96\x86\xc9\x63\xa8\xa0&\xe3\x43\x9a\x96\xd9\x9b\xe4" -"\x5p\xd6\xe0\xfa\x1c\x33\xda\x80\xa9\xa9\xb9\x44\x11\xdbO\xb4\xc9\xae\x85h\x5\x8f" -"\xb2r\x8f\x2\x61\xa3\x1d.\x89j\x9d\x33%\xb0*Q\x98\xce\xa9\x94\xb8=\xe6\xcd\xbdpx" -"\x8d\xa3\xc\xb7\x90\xe0P)x\xf1\xaa\xee\x7;\\:\xb\x93\xd8\x43\x65\xfe\xe2v\xbbT\x96" -"\r??G\xb8HBo*\xe9\xdf\xf9\xba\x4\x31\xe3\x38\x8e\xcd\x15\xf4\xd2\xee\xcb<\xa8\xe1" -"\x8d\xf7\x64\x2\xa8\xd7\xfc\x1\x85\xf9/w[\xfdJr\rb\xff\xed\xb3r`\xe8\xad\x89\x4\x1b" -"\xee.\xf\xc5+\xd9&H\x8a~\xf1Y\xf7l;\xe4\xfdI\x1dx\xd1\xf9\xa5\x36@\xbd\xbaU\xbb\x80" -"I?\xd6l\xa1T\xa6O\xfa\x1e\x87\xca\x93v\xbc\x18\xf9\x63\xebW\xae\x8cjK\xf7W\x9e\xac" -"\x8e\x10\xbfl\x80\x9c\xf5J\xe7w,\x11\x9b\x88\xb0nX\x86Q\xfb{\xd1\x82oFh\x8b\x1d\x87" -"\xbcG{\xc1?\xb3#_Q\"P|p%B\xdc\xc4\xf6-T\x4\x41J\x81`\xc0\x8dSM\xe9\xb4\x18\xe\xe8" -"\xc8\x35\xb0W\xd5\x95;\xa5\xc9\xaav\xb1\xb,^E\xe5\xd0\xcd\x32\xfa\x8flO?\xb2\x8a" -"\xf3-\xfc\xd7\x9b\xe5\xf\xd7\xae\xd0T\xee\xea\xc8\xf4\x90\x7\xcc\xe2\xc1\xb9\x9b" -"\x8f\xf8U5 e\x1aK\xf1\x63\xe4\x8dq\xac\x12\xf4\x18\xae\xc1\n\x9\xf7\xb7\xd4g.\xa0" -"p\x14`\xb5\x61\xc2\xa7<),\xdb\xe3\xa6u\x14\xa0\xe9\xfb?hN\x85\x1f,\xb4\x9a\xbd\xf" -"e6\x84\xf0J\xb4i\xbd\xa3m\x80t%\xda\xef\xbf\x9a\xfd\x80\xb7myG\xef\xf8\x35\xa0\xad" -"\xb7ve\xee\xd2t\x86\xc;\nu\xa3\xc7\x17\xaa\x5\x95\xd5\xefZ\xa5*\xccp\xc9\x1b\x87" -"jH\x7\x8\xb0\xb\xf4\xd8\xb3\xaf\xd0\xa0\x2\x9b\xf\xe5 \xdd\x3\x36S\x9d\x94\xfcV\xdd" -"\xf3\x41y\xd6\xe8\x89\x9a<\x1a\xa5W(\\\x85\x81uJ[U\x1b\x90\xe4\xc1\xc4\x9e\xd4=p" -"R\xf0\xa8$'\xfb\x83\x83\x1bp\x89S]P\xf3\xc7;X\xf4\xbc\x92=\xde\x9f;\x4\x1\x9c\xe0" -"'\xfc\xeeS\x8c\xee\x80\xb2\x80h\x80pC\xa6\x87\xf9\x1\xb1\xd0\x7\x42R$\xa8\x8a=\xf4" -"\xd1T\x17\x66s\x80\x37\x9\xc6P\xc3\x38\xf2^\x97\xbbJ@\x8c\x9c\x88\x30\x8f\x0\xa1" -"S\xbd(\xb7\xd7\x31R5\xcd\x9c\x81$0gHA\xe8\"\x61\xd1\x65\xeb\x46{\x0\xb0\x38s\xb\xea" -"9\x12\xf7\xef\xe2\x43\x16\x36\xe1\x9b\xc9\xce\xa7\x95(y,t\xf9U.Z\xe8\x8\xaaJ(\xdc" -"r=\x86\xf3/\x81[H\x12\x8d\x1b[\\\xf6\x83\x62^g4\x8a(\xcc\x8a\x65oL\xa5\x19\xc9\xe8" -"\xb2N\x10\x36#g\xdb\x7f\x6\xb8`\x95wK\x86\x85$q\x17v\x82\xa9\x1c\xcd\x93\xa6\xe8" -"V8s\x9\xe2\x41\x44\xce:H\xb8\xf0pt,\xd5\xe4N\x80\x10\xf5\xd4\xd8\x99&2x\x11(\x94" -"\x8a!\x8e\xda\x86\x1\xbf\x9fU\xd2\x13q\xe8\xf7\x88\x98\xe7\"\xb9\xae\xb3oc\xa6\xf7" -":\x85\xd5YQ\x3T>\x88)\xb\x8a\xb6\x38\x8d\x30\xfc.#\x9c`\xcc\xfc\xd6l\xef\xfeY\xe" -"!\xa8\xc2\xc6\x64\xab;0\xda\xc1uT\x6\xb7\x93\xaa\x65\x93\x41\xedr\x1e\x39Xh\x11:" -"\x90\xbb\xbfm@\xf3\x94O\x97\xb9\x8a\x94\x15\x9f\x18\x9\x17\xe8\x9c\xd5'\xb9\xc6\xcc" -"\x82\xcby\xb6tn\x85n\xdf\xe \xb2\x12h\xe\xfd\xb\xa3\xa1\x14\xdb\x98@\xfb\xea\x18" -"\xa1\xa6\xd6\xe8mb\xb3\xc3\x0\x19\x1\x85\xf8\x46-\xc\xda\x1dLRP\xd0\xd3\xcd\xa8\xb1" -"2\x98\x36\xcc\x61\x66\xf2!\xf3.\x8a\xfb;\x88\x42*\xa7\x2\xf0\xcf;\x9d\r\x97\xf7\xf1" -"\xffG\x8\x1\xb1\xd1P'\xfa\xb3\x94\xa1\xcbK\xc5(\xffw\xca\x9e\xf3?\xf4\x9b\xa3\x80" -"Y\rh\xc^\x99\xd1\x66(\xc2\x39\xc4\x96\x14^}\xd8O\xa5\xc3\xa7\xf8\x15z\x1e\xc7\x8f" -"\xa6\xee\xa9\xa9\xc2\x80_F\xdd\x32\xa4\x35\x88\x89\xf6\xec\x66\xfa\xbr\x7f\xc6\xae" -"v\xdem,G\xa1y%M\xcd\x90\xe4\xa0\x89\xa5\x16q\xbf\x1f>\xca\xca\x66\xa1\xef\x91\x8" -"\x1]\xc0\x37^\x15\x93\xf4pCQ\xe7z4\x1c\x2\xb8\xf6\xf7\xbe\x63#\xa0P\xf1\xa6\xb8\xb6" -"\xeeW\x1e\xc6MN\x18\x97\xab\xfd\x9b\xe6\xa7\xf0\xac\x61\x1e\xe0\xb7\x17\x9b\xcf\x8d" -"te\xff\xce\x87\xd8j\x9c\xab;\x8f\x86\xc9\xc9h\xec\x8c\x9e\x80\xaa\xd1]\xd2X\x1b\x13" -"Q\xfd_\xa4@\xf5\x81\xec\x92\x93\xdb\xb7\x44[\x93\xa8m9\x85\xc0\xf8\xcc).\xb\xd3)" -"C\xa5:\xbb<:\x5(\xc0\x13\xa3\xbf\x81\x1d*\xfe\x61\x8co\n\x94\x18\x85\xa6\xd4x3\x14" -"p\xd5\x31\xa4\xd0r\x1b\xd4P\xa2\xf2\x61\xca|\x1a\x30\x14\xcd\x89\x8e\x9aR\xe0T^\xf3" -"\x80\x95\x8d\xb0I\xbf\xf\xed\x1c\x92\x82\n\xe8\xe8(\rn\xa1+\xa4\x11\xa0\xe1\xae\xe0" -"\xa5!\xc2\xca\x12\x63\x80@\x10YSs\xabU\xd2\xdb#\xd2;\x84\x9f\x64w\r|\x95m\x8b\x1" -"7\xec&\x9et\xf4\x1b\x61\xff\xdf\xcb\xe\x66\xd1\x19V\xef/\x1d\x0\x8\xda\xbb\x61\xc5" -"\x97\xc6\x7f\x9b\xf\xf1\x82\xa0WE\xd0UqZ\xa9\xd1^\xb6\xa4Y\xa1\xb2+\x9eu\xad\n]." -"#i}\xc5,\xc}\xadQ$H\x90\x1f`D\xd5\xaf\\,.\xb\xaa\x8c\xfa\x9ci\xdf\xf4\xee\xf4\xbb" -"\xd9+*\xe0N;\x7S\xe0\x44\xc7\x84\x7;HvF\xce\xba\x92\xd6\x92\xfd\xb9\x46*-o\xa3\xe" -"|\xed\xf6\x89\x1f\xc8\x7\xdd\xc7\xf0\xa7\x8b\xc5\x41\xc7\xdd\xc6\x8a&\xe1\x1dz\x9e" -"\x1\xc9]\xf\x8e\xd6m\xd9\xff!\xb8M \xbf\x83\x11\x16\xb7\x9d\xa7\x99\x1a\x1e\x99\x9a" -"\xf4tG\x99\xa4o\x92\xaak\xff.5\x15\xee[N\xc9\x97\x19\x63\x9f\xdaw\xaa\xa0\x35`\x8b" -"\xb2\xf5\xdf\x7f\xac{\xf2|\xca\xea}I\xcf\xc0\xa6\xcd\xa9*\xe2\xa4\x9f\xce\xa4:\x89" -"\xd5\x9s\xa6\xab\xbd\xe5\xe9\xe5\xda\xc5\x98\x98\x32}\x89`\x9a\x9\xc3:\xf\xe5\xa1" -"\xe7&\x17\xc8{\x7fZ\xf3\x19;u\xf2\xdaUb\x17\x9\x10K\xdb\xf\xfbw+\xa2V\x15\x37S\x9a" -"\xb\xed\x90\xdb>\\\xcd\x88\x45\xb6\xba\r\xe\xa2\xec\xd7\x10^\x8O\xdf\x9ai\x81\x2" -"\xffG-x\x8f\x18\x14\r@f\xc9\x61\xbf\x46\x8f%\xaa\x88\xd5SU\x80\xe1\xd3\x46X,.q\x1a" -"\x1a\x32Sz\x8\xed\xb3\x62\xc\x87\x1\xe\xa3\xe5\x63o#\xed\xe4O\xacK\x2\x88\x33\x90" -"\x8aS{d}\xb2\x99\x85\xa7\xba\x95q@\x5o9\x10\xbd/\xb1\x10u\xd5k\xe3\x8fp#\x9f\xd5" -"\"\xed\xad\x8a\xe8\x82\xa5\x9f\xbc\x9d\x5g\x9d)\n5jh\xc1\xf9\xcf\x39\xf2\x95\x9c" -"\xa7\xc6\xfa\xb6\x16\xf9\x35\xe\xac\xaa\xaa\xbd\"\xf8Sv\xb3\xdc'\\\x95\xee_\x8a\x46" -"7\xef\x45\xb\xdcy\xd1\xfd[\xa0\xa7\x80;\x7\xd5N`=\x88!\x1c\x31\x85QK_9&\xcdG\xf8" -"\xcd\xcd\x18\xd1\x8ww\xb7\xe2\r\x38\x90\x37\x65SxZ\xdb\xed\x4Q\xc0\x1d\xcc\x92\xb8" -"\x88\xd5\x44\xfd\x87\xa7\xb8\xb4\x9f\x9c\"\xf3\xd9sq4\x19\xbc\x4'\xb9\xd9\xaf\xab" -"iAoQ\x8b\r\xc2Q\x5\xab\x8f\xa5\xa3\x8a" -"*{\xed|\x19\x7\xdd\xf5J;\xa9\xec\xc4v\xb5!h\xf4T\xd2\x98\x1\x12\xae?\xb7\x9b\x6\n" -"\rW\x3\x6\x63$\xcc\xe8\xb4\xd3\x44\x83\x38\x9\xcb\xec\xd4\x1d\xe5\xae\xc7\x45_}\xf" -"\xd0\xda\x63\xbaj\xc3\xdd\xf9\xaf\xa8\xd2\xd9\xa3\nu\xc\xba>\xa0\xcd\xce\x97s\xca" -"\xedkX\xb5q\xc9\x30\xf7m\xd4\\\x1f\x88\xbe\xc8'\\\x13\x9c\x39\xb\xc2@\xda\x6\x1c" -"\xbd#\x8[\xe7_\xe2\xfc@P(\xf9\x63q\xdf\xcU\xc9\x42\xac\xa5u\xdb\x86\xd6\x33)\xa0v\xaf\x0\x93V\xde" -"\xb6\xf2\n_TSZ\xb1\xe1\xfds\xaf\xb4\xd9\x35\xb0\x9f\x36\xa2Y=\xfe]\xd9\n\xac|\xec" -"\x8e\xed\xaa\xf2\xa3\xfb\x63\xb\x42\x8d(\xa7\n>s2\x8f\xe5\xb9:\x87|\xf5\x41\xbc\xb0" -"\xd3\xb4p\xa6\x88\x64\x83\xc5\x8f/'\xb7\x6\"\xc6\x1d\xedK7\xcc\x1f$\xc7\xfc\xcd\x88" -"\xd6\x91\xaf\xcbQD\xd5\x41\x2\x93\x87g`R\x8e'\x93\x3mc\xf3`aM1UmI\x9b\xf4\x9f\x8c" -"\xc2\x30\xe5\xc1\xd2\xee\x65g\xb1\x11\x9\xe0<\xaf\x96/\xa6\x90\xd6\x37\xc2\x13\xc7" -"\x95\xb4\xdbH\xc0k\xb9(@\xa2\xa0\xa0\xd6&*{$\xea\xb5\xaf\x9e\x96\xac\xf6x\xd6\xf5" -"\xeaoJ\x87)\xec|;N\xc9\xbb\x6\x37U:5\xa7.\xc7Kg\x88#*C!\xe\x9f\xd1\xb3\x8a\x30\xde" -"\xef^\x1a\x8a\xbd\xd4\x37\x11\xf1\xe5\xb7\xda\rH\xa6\xc4\x41V\x8ez\x87\xe9U\xcb\x14" -"\xbe\xf7\xcbn\x95\xfd\x9e\xd4O\x9b\xdf\xafi\xb4\xec\xf9&YS\xe2\"\xc1\xab\x7f\xd8" -"SG\xb7\x9a\x61U\x8b\xf7\x9c;\x10O\xed\xad\xa1\xe8\x93\xbej\x1)\x1fX\x11\xa8\x9f?" -"\x1dY?2\x8^\xc2\xa8\x43}\xf5\xf0*\x16\xa5n\x81\x1ek\xca\xf1\xcf\x41\x92*\x8c\xf8" -"F\x10\x81\xe6~]\xcfND\xb\xbe\x8f\x4\n\x96\xbd\x14\xa3t(\xf`Ge&\xb2o\xca'\xccm\x88" -"\xcc=\xa1\xaa\x92`\xce\xf5K\xdc\x18\xdd\xa1\xa6PX\xa7\xef\x9\xdf\xba\xe\xf6S\x8\xe7" -"\x5\xdb:\xfa\xe7\x12{\x1\x90y\xee\x85\xa8\xca\xba\xb1\xd3\x82\xce\xc2r\xb&\xe8\n" -"~\x2\x7\xbdH\xfe\x80g\x16\xc\x82YwR\xae\xde\x88\x95\x3\x95\x80\xce\xa9\xa3\xb\xd8" -"X\x17P\xd8\xa0\xa6\x12\xa8.\xf3\xca\x87\x62\x0\xd5\xfbK\xecO\xe2;\x94j\x85[_\xf4" -"\xec@\xef\x1\xe1H,\xc1\xb4,\x7f\xab'\xb8" -"\x6\x43\xca\x89\x8b\xaa,\xfa\xd8g`O8}\x86n0H\x84y%\xf2\x9e\xab\xb4\xe8\x61\x85\xb2" -"\x1\x8ex5\"P\n\xf2~\xc'\x93\xf2\x38\xd8\xcc\xad^\xbbi\xdb\x66j\x1bl\xfe\xd9\xbe\x86" -"\x19\x1d\xf3@\xea\xf1\xd6\r\xa4v\x9b\x34\xd1!w\x83\xc;[D\r%\xa9i>\xc3Ju\x98[\xca" -"(\x80\x85Q\xfe\xb3\xc6\x3\xfc*\x13\x7f\xc9\xc4\xb0\xc0\xb8\xa6\x18\x1d\xe0g\x9\x15" -"\xc2i4>\xc7\x94\xa2\x84\x8a\x42\xb4v\x95/\xd2\xf0QZb\xdb \xd0\x65\xca`\xd0\x35\xe6" -"\xacp\xe1\xb1\xb5\xc\x99qX'qX\xab\xben\x9fU4G\x17\x10\xb6\xc\x89Mx\xb5\xeb\x1c\xea" -"\xb4\xe6;{\xb4\xae\x81\xd8\x86\xc9M\xf8\x7f\x39\x63\x42\xba=\x13\xd2\xf6\x97GL\xbe" -"Q_\xde\xeb\xaa\x19\x39<\xe6io\xe4\xcf.ts\xd0$\xf\x30\x8e !\xfd\x8d|#\xa1\xa9\x39" -"\x1c\xad=K\xact^\\\"\xf0\xb6\x19\xc\x1f\xcM\xa4\xa6\x9d\xbcU\xa4\xd4\xa7\x11/\xb4" -"\xa4\x32n\r\x8dNd\x8e\x30\xb8g\xf5sC\xbd\xa8\x9\x62\x34_\xd4\xef\xf8TX\xc3.H5\xe6" -"\x12\x9b\xb6U\xce\x15\x81\x1\x61\xb3p\xd8\x8f\x94\xfeho\x10\xb1\x1aW\x1e\x46\x1f" -"\x8c_\x82\xc1&\x9cO+1\x16\x9\xff\xf4\xde\r\x61\xac\xc9(?x\xd9\x82\xda\xff\xca\x89" -"\x9e\xdd\x64\x93@\xe\xa4\x0\xe1\xe5\xa2ta\xdb\xf9\x1c\xd4l:8\xfdt\xcan\xbeT[\xec" -"\x2\xc1\x45\xecz\xce\x1b\x8a\x4K\xd7\xdd\xa3\xb3\x37\xc0\xe0\xf4~\xba(nOSp\x6\x63" -"\xa8R)<\x93\xc0\xa0\xb\xd1\x9bU3\xbb\xd3^\xafu\xf5\xcaW\xfe\x80~f&\xc1%\x30\x3W\xe3" -"^\x18\x5\x17K\xac\xca\xbc{\\3)\xfc\xbf\xd8\x94\xd1\xda\xa7\xa8\x13\xe3\xdaU\xb0\x9" -"\xeb\x4\xb7\xdb\x9fh\xc%\xeeQ\x85\xe6<\x14\xb5\xaf\x66[\x13\xadk\x15\x11\x84\xdb" -"_\xa0\xb2~\x8e^}\x95\xc5\x16\xbd\xea\xe3-\xd4g/{>\x0&\xde\xe4\xed\x90\xaf\x97 \n" -"0\x3^8\x8a\xfej\x12K\xbb\x18\xa4|}s\xbc\xaa\xfc~\xa1 :hk8\xbc\xb6\x1b\x3\xe6\xde" -"\x12\x91W\x92\xc4X\xc4'Kl\xf\x87\x89L4a{6\xb8\xea\xbf-p;\xe3\x82O\xdek5\xf1\x8\xfe" -"\x1c\x1e\x1i)\xd6\xcc\x83\x8\"\x1Q\xcd\xd7l1\xb2 >\xd9\xbf\x9f\x14\xdas\x95\x43G" -"\x83^\xa4^\x16\xda.\x1f\xdc\xd6\x3\xcev\xf7$\x16\x81\xd3\xea\xa0\xc8;!\x85\xb\x63" -"\xf7\xe9\xe9\xb5\x15\xe6\x39`\x87\xe2\x93\x8c,9p\x10\xa1\xc0\xe5\xbb@j\xc7\xf9\xfe" -"ht\\0\xb\xa2\xfb\x19\xa6\x3\x1f\x1g\xb0\xe5\xb6o\x9c\xb3\x15\x46\xf4G\xf\x8d\xc9" -"\xa0\x36\x38\xe2\xe4u\xc0\x97rR+\xde\xa3\xc\x9a\x31\x41\x9d\xe0h\xd3\x1e\xdd\x32" -"\xdd\xfe\x93\xc8l?mS\x1M14\xb2y7\xc3@\xa4zs\xc0\xc2\x35NFK\xd5\x8b\xff\x62\x9c\xfe" -"\x81\xd0\x98\xbe\x34\xf1\xff\x36\xb7\xde\x1c\x16h[\x3\xb\xbf\x8d\x97\x1b\xe9,\x14" -"\x2=j[\xd1\xcd\xbf-\x84\xfa\xc1g\x5Q\xcb^\xff\xe>\xc7\xcc\xfdw\x92\x1cy\xf5u\xfb" -"\xe4\xd2.\x0_!\xbf#\xb5\xa4~&\xdc\x9\xe8\xf7U\xc1\x9d\xbc\x80\xfd\xe4\xc8\x1aI \xad" -"\xdeh\xcc\xae\x80\xb0\xff\xf8\xf6\xfb\x83\xdf=\xf6\x1\x85\xc2?A\x99\x38\x8cI7-\xda" -"\xef\xf\x8b\xe\xff\x13p\xc7\x1a\xa1\x8e\xc6\x95\x8bz\x8d\x87\xaa\x41\xdd\xdc\xb9" -"\xb9Q\xdf@\x4\xa6\xed\xc2\x86Z\x7f\x42[\xb0\x1c\xbf\x93\xdd\xcfv\x5.&\\\x6\xce\xdd" -"\x98\x85\x62\xc3\xc4U\xbd\xe3\x31\xa7\x7\xde\x15\x19t\xed;\xcb:\x9c\x7f\x3>\x87\xdf" -"\xab=\xca\xaf\x9\xcc\xe2\xe3\xe1\xfc\xcb%\x92\xc\xb8\xd9\xd2\x87^\x9fl\x7\x98\xf5" -"\xc4\x81\xe2\xdf}\x8s\xa4\xee\x4P\xe4\xc4\x46\xab\x5>\x2\x64\x8c\x2\xbc_v\xdf\x83" -"D\xe0\x5\x2\xd2\xbe\xe6\x41\xabS\xa4\xf5\x3\xc0@\\E\x5\xb0 \x7\x97\x84\x17\xac\xfb" -"\x86\xdc\xa0\xd8\xf7`\xe8\x8e\x9f\x35\xb7\xa8\x3N\xdfy\xdd\xfd\xc6\xb7\xc2\xea\r" -"\xb3IH\xe\x8e\xfbw\xf8\x65\xa5Z\xb\xd0\x9d:F\xd8\xfc\xcd\x2,\xf\xcd\\\xed\xa5\xec" -"\xea\x12\xe\xe0>\xab\xfa\xeb)\x6\x99\x85\xf2\x62^\xa0\xb5\xb6+\r0\xae\x17\xa1\xf0" -"\xd3\xf7\xc4s/\xdd\x42'n]\x9\x64k\xb6\x2{^\x3^\xbcH/\xed\xe\x63\xf9\xb\x8d\xf6\xa0" -"\x9|\xa8\x97\x82sw\xec\xfc\x18\xac\xe8!a\xd3\x14\xb3,\x1\xa6L\x1b[\xddW\x92\x1e\xb" -"\x1c\xf8n\xd8?=9\xbb\x92\x8c\xb6\xa4\xb5-\x88\xcf\x16\xa5\x9b\x3zD\x7f\x8c\xc8\x8b" -"\xd9\x8a\xf4\xdd\x30\x62\xcd\x98\xa8p\xc1=\xbc\xe5 N\xed\x82Wx\xa2\x1b\x7\x31\x10" -"\x8e\xab(\xd1$\xa8\x89o\x91\xe7\xde\xb2\xf3\xa5\xa8y\xba\xc5S\xf3\xe1\x98(\xbd`Q" -"\xc8\x39\xb0\x94X}R+L\x1\xfc\x9axp\xdf\x64\xb0n\x1a\xa5P\xd6'\xea\xef\xa5-\x9a\x99" -"\xa4}\x10p\x8a\xc3-\xd4s\x9f>\xdc _\xaez\xd9\xf4Y\xc5@\x82/\xday%\xd2\xad\x1a\xae" -"\"]Q%\xa3\xce\xf2\xb6I9>S\x1\x39\xbe\x17\xdb\x8a<\xb @\x18\xa7\rqY\xc\x4\xd5\xf8" -"\x97\xd3s\x1e\xc2\xe0\n\xc1\xf0\xf5\xf4X\xf5\xf\x1e\r\x87\x10'\x83W\xd8\x65\x9b\xcc" -"\x81\n\xa0\x10\xaf&\xac|\xeb\x42\xbf\x31\x94i\x11\xae\xd6|\x12\x9b\xbc\x0/\xe5\x37" -"\x90\x99g\x19+\xdc\x1b\xb2\x8a\xe2\xbf\x8e\x9f&}Q\xfU%Pq\xf5N\x82\xbe\xa4\xfb\xe2" -"u\x7f)\xe5\xb9\x45\x44\xee;\x11\xf2iN/n\xe9\x0\x6\x64\x98!0\x7f\xfe\x1x\xf6\xe6\xca" -"4\xb9>\xc9\xef\x1U;\x8a\x4\xc9_\x12\xa5\xbd-\xbd^A|p\x8f-\x12\x8e\x2\x86\x17\xdc\xcc\xc3`\x8e" -"\x84i\x8d\xce\x1a\xe9\xf0y.\xd1\xc5T\xcd\xde\x8f\xaa\x8b\x86|\xf4\x9a\xd3q2\xbf+" -"\x11wY)\xb1$bdSO\xce\xc4\x34\x91\r\x8a\xea\xa2\x87{X\xcf\x1f\xf9>\x9d\x92\xd8\x15" -"\x1fl\xc3\x2)\x87\xf1\xd6\x1e\x8d\xc9\xd0\x91\xf6z\x9b\x83\x44'\x9e(&\"\xfalv\xf0" -"D\xd1X]o\xcd\x93\xdaV\xd7\x32\x90]\x9\xb1\xa8tx\x9a\xe6\xc7\xd9\x18\x80\x14\xc5\xb1" -"\x84\xb4.\xa5\x14n\x17\xc1\x91\x9\x82\x81\x3/%\xd2S\x82\xe0z\x3:\x9a\x3\x3\xff\x19" -"(:\x82\xe3\xb8oo%M*\xf6\xf7tg\xc2\"\xc0\xc2\x36\xad\x5\x85\x61\xb4\xe0\xc\x44\x8f" -"&;$\xf5\xbaU?V\x97\xefo\x2\x9e\x65\rH\r!\x1>\xd9\x9\xfa\xb7\xbc\x13U4\xb7\x39\xbb" -"U\xd8N\x2\xf4\xd6%\xa8\x9Hd\x99\x88\x11\xce!$\x97\x1a\xa1\x1b)c\x1f ,7\xb4_GR+\xd9" -":\xd9\x6\xc7\xac\x13\x9b~\x94\x41\x9cu+\x92\xe\xd9I\xe7\x0\x14\x9\x8b.\xbb\xd9|\xa8" -"4\x99\xd5\xb6P\xde\xa3\xa1\xa3\xf7\x1c\x17x\xce\x30\xce\x36\xc7\xab\xa3i\xf9|\x9" -"\xbb\x87\xef\x99\xdb\xe3l,i\x89M.l[\xf5\xc1\xfa\xf8\xd9N\xac\xe7\xc4\x1z\xdd\xc3" -"\xd3\xbc\x7f\x1e^\xcf\x66$\xba\xa6\x32\x82UC\xd0\xf6\xda\xd2\x80$F\x15\xb3\xe3\xe5" -"fV\x9c\"\xed\xf3\xc9\xb6\xe9[\xa1HP\xe2U\xfc\xek\xcf;\x98\x12\x8f\xce\"\x1a\xb5\x9b" -"\xbc\xef\xf\xff=(\xb3\xe5qV&\xd7\xaf`\xd9/\xe6\x9e\xba\xa3\xd2\x8b=T\xb4\xe8\xa0" -"Jr\xb0n\xc9\x37XU{\xb0\xf6\x7\xa1\xa8\x88K\x95\x94\x46\x83\xda\x89\xb7;d\x92\x16" -"L2/\"\xc4\xbb\xca\xe2\xf1L\x0\xea\xe1 f\\\xea\x6={\x15\x88\x9a\xea:W\xc9\xae\xb3" -"d8\xb9M\x2\xf5\x61\x94\xcb\xb7\xae\x97Hz}\x1f(\xce\x39\x1b\xef\xcd@v \xe2\xe1_\xa4" -"\x91\x8b\x8b\x96\xd0[Dl\x95\x46\x8a;\x82Z\xb8\x41\xda\xc4g\x94\xa3\xca\x9c\xf5\xce" -"s?\xd0\x8er\x14\xfc\xc5;\xe2|\xee\xe5i\xef\xd0\x96\xd1\x63\xfe\xb3\x81\x65\xbf\x13" -"\xed\xb~E\x5 ;\xa1\x1e\xe0\xb1t\x92\xa0)\xf7\xcf\xae\xc6\x11\x94\xca}\xb4\xc6\x90" -"\xe3[\xf3*CR\x9a\x89H\x1\xef\x34\x96O\x3\xa2t]`k\xbet-\xcd\x35\xe8\x1f*\xcf\xf1g" -"\x9f\x17\xd2\xf5i\x7\xc\x62\xef\\\xb3}\xc5_m\x1e\xd1\xe3\x81\x87.\xfd(\xad\x5\xef" -"\xd4\xf?\xe5T\xcf\xc\x9a\xa1\xe9\x35\xa6\x80p\xfc\xf5\x8a\x92\xe5\xeb#\xee\njh\xf2" -"\xc0`\xaa\xe7\x8d\x1c\xee\xc8}\x11\xe6\x17K\xfa\xc1\x8d\xec\xc5pSE;S\xe2N\xfc\x9c" -"&\xc8q\xd9Y*\xfe\x1d\x64\x88\xfb\x66<\x99@)\x9f\x92\x1d\x81\xe\x1\xb5\xc7o\x16h-" -"\x9f\x2~\xe6\x30\x10\xe6\xa4~\x9b\x89\x1c(\x93\x95\xd9\xd2\x83u\xe6\x9f\x94'\x81" -".1\xda\x8d\xd0\xdf\xdf\x35\x81;\xd9\x7\xd1\"\xf3\x2\xff\xb6\\\x16\x18\xc7\xbb\x46" -"\xf5\x65\xac\xe8>\x1X$\xa4KA9\xe8\x9b\xfe\xa5\xea\x41:?\xd8\xa4'\xcd\xb7\x15\x66" -"\xc\xc2\xdd\xacU\x9dN\xf2Zn%\x8e']`\xbc\x89\xe9^\xbd\x86\xb3\xb9\xf0\xa9\x1f\x62" -".V1j\xf9\\p\x1f\x92\xd6\x15J\x8a\x9bI\x91\x42\x92m\xbe\xc4(\xb7\x6\xa1\x17\x86Y4" -"]6\xddV\xee\xf7|\xe8\xceo\x4\xdd\xbb\x3,\xf0\xdd\xa9\x7f\xd7\x33\x81HI'\x89\x39j" -"D\x89\xd0\x46\xc4\xd4\xa7Y\xebH\x1c\x5\xba\xeb\xc8\xf(\xb6\x86\xbL;7C\xaa\x8a\xb5" -"\x95}\x0\xa6\x1f\xc6\xcb\xb1H\x1\xba!\xe3\x62\x1c\xe9`\xb8\xd9i\xb2h\x8\xda\x97j" -"]\x12\x9f\xe9\x82\xd4\xb2\x9d\xf4\xc2\x37\x8d\xf<\xfc\xaa\x17\x63\xe6\x43\x9d@\xd3" -"E\x98m\x96\xb7\xa5\"\xf8\x66UK\"<\x1c\xc6\xa8\x66\xaf\xb\xfd\xc5\x1e\xd5\xbbKj\xcd" -".\xd8[\xb0\xab\xe1`\xdc\xdd\x39\x66t\x1\x13\xc2_b\xb3\xbd\xfbY\xf5\xff\x1e\xdai\x17" -"\xfa\x9e\x2j^\xa7\xb1\x43u@F\x80\xf4@\xd9\x93\x85|pn\x11\x42Y\xf9\x94.;\x7f\x33&" -"-\x95\xe3@\xa0\x32\x9b\xc\x87\xeb\xfap\x97\x65\xb6SC\xf8x\xf2-\xa7\xb0\xa9\x39\xc3" -"\xa8+\xfd\xb4NU\x8a\x80\x18\x9?\xa3\xe8\xba\x66\xa3/xFG\xb0<\xa1X\x12\x94\xa0Y|\xc" -"\xeb \xe6\xcfRe\x80\xddK\xa7\xc4{hg\xac\x61,J{\xa3\x9f^\xcd\x9a\x12\xbbT_\x8d\x85" -"5\x96\\\x35\xc2\x38\x1eYC\xf4\r>9\x83)\xef\xdbR|\xe7\x62z?,\xc9/\x86\xbe\xdd\xd1" -"\xbc\x9e 1\xe\x7f\x9a\x81\x7f^\xb7$\x16\x8a\xda\xe8\xa1qk\xc8\xd9\n\xdb\xfasSs\xcc" -"\xf3\xc5\x1\xc3\xd5\x99\x0\x66sQ\xd9\xe7\xd3\xeb\xb4G\xfd\xca\xc6_\xd5\xeaW*\xb8" -"\x89\x43\x38\x0\x36\xec`S\x13\x95\xd3\xf4\x34\x38wq\x96mo\xe\xd7\xf6\xedl\xb3~T&" -"\xdb\xb7\x1e\xeb\x10\x9\x0W\xc0\x13\"-\xcc\xedJA\x96\xb5\xdds\x8e\x61 \xb4\x95\x15" -"\x1em`\xec\xed\x35\x9b\x93;\x9f\x46\xf8\xe7(\xa7\x98\xa1\xfe@\x1a\x9e\x37\x83:\xfd" -"\xb4\xbb\xaa\xb0|O\xf3\xf4\xae\x19\x1a\xdf\xf9\xf5\xdb\xfw\xd4\x61\x36\xcb\x46\xba" -"\xa9\x42\xd6\xfb\x17\xdc\xae\x0\x7f\x61\x36\xe6\xce]\x7}\xaa\xe4~k\x8f\xb0\xe3\xa7" -"n\xff\x9a\x96>\x9d\x1c\xe2\x0\xc5J`\xbd\x31O1\xda\xc2\x15\x10\xab\x1d\xd5\x81#\x94" -"\xb3\x15\x86\x2M?\x85\xed\x15\x99\xfd)\xb9\xe2_f\xe3\xe\xbc\x30\xc6\xbd\xf1j\x0\x34" -"\xbd\xf4l\xfb\xc3\x80\xc:\xb9\xe1\x65Z\xbb\x19\xa5\x84\x9c\xb4\x88\x8a\x35\x30p\xe6" -"\xbe\xe6\x1\xef\x9f\x95\xe9\xd8\xc6;\xd7L\xe9PE1\xa4\xc8\x14\x82xY\x90\x15p\xf6\x0" -"\xfa\xf4\xb4\x93\xc2\xe5\xd4\xb3,$\xdc\x19\x1ah/\xbd\x83\xf2\xd3\xdb\xf6\x37\x15" -"Oq\x99\xba\xe1\xf4\x36\xe1\xe7\xe8\x1c\xde\xc1\xdb\xa0\xb6\xb4\xf5\x93\x33y\xe6\x31" -"\xfa*\x9d\x8dO/\xef\xbb\xd3\x97\x15\xf3\x88wr$\xfa\x90\x90\x19/\x17-\x5\xba\x3\x9a" -"GGJ`s\x88\x8e\xee\xbd\xa7\xc8+\x19\xd1\x1az\xadN\xe2j%\x82\x9f+\xfeWJ\x12\xc1\xc0" -"t\xd5\xac\x15\x1bn3\x1d\x99\xee\xea\xc4\x30\x92\x45\x93\x97J<\xca\\\xcb\x89\xba<" -"s\xf2\x19\x9f\x43\x43\xe6\xdd\x62\xba\xa5\xde\xf2\x96\xce\x31w)~\xfa\xe9j\xfcv\xfd" -"\xe5K\xe1\x95k\xf9\xa8\xed\xbd\xa1\xa3\x97\xb8\xbfu\x7fJ\xb6\xe2\xb\x19\xa0\x3\x9d" -"\xef\x9f\xd7\r\x90\x16G\x9f\xe9\xd9\x84\x42-B\x82\x0r\xb6\xa9\nx\xd7\xfb\x8e\x83" -"\xcd\xc4\xad\xa7\x9f|\x85\x3_j\xc8>I%\x95\x32]-\xef\x98Q\xea\xd2\xd9\xa4\xc9\xc6" -"\xb4n\xb9\xbf\x9d \x81\x36V\xfb\xd8\xf2\x92\x8a\xb2u|3\x13gB_\x83)o\x85H?\xe3\x43" -"\xd5\xbe]b\xbbnw)\xc3\x80\xc8\x1d\xe5\x89[\xf5\x19\xfc\x93u31\xe3\x0\xc2x\x14SI\xca" -"\x83\xa6\x88\x37\x6\x88\x8c\x8b\x15Gh;\xb6w?%\xb8\x1e\x95\xe1\xb0\x42\x9a\xf\x9d" -"\xc8W\xb0\x8\x35\xd6\xd2p\xd5\x45m\xd5 C^\x19\xbaY\xad\x8a\xef\xc9T\xb2P\\\x13u\x1a" -"`p&\xd2\xb3\x18v \xfa\xb9\xa5\x9d.F[\xa8\xfc\xdc\x85\x46\x35\x94\xba\xe9\xa6\x89" -"\x9d\xfd\x15\xf6$'S\x1aP\x95\xf9\xf6\xf3o\xbb\xc\xfax\xa1\x19\x8c!\xe0\x44\xed\xb5" -"\xad\x85,\xbd\x82\xc7\x85-z\xdf\xbd\x10\x9bQK\x7~I\xce\x66\x45\x87\xd7HRc\xa2\xc9" -"T\xcd\xd8\x88\x90\xa6\x14\x42\xcf\xe2\xfb{\xc3\x65\x5Q&\x7\xe0\x85\x9a!\xaf\xad\xee" -"\xdb\xab\x15\x5l.\xae\x8c\xfb\n\xa1\xc0\x9f\xeb\x38\x84x\x84Z\x8f\x85\x15{\xb\xe0" -"Z\xa3:?\x84\xce\xee\xc3\x97\xf6)\xd2Y\xad\xe5\xc4\xf\xf0\xc0\xfa\x10\x96\x31+7l\xf7" -"iSZs\xf0\xa3:\x12\x1f\xd8\x98\x30Ln\xae\xf0\x43\xa5\x8a\xf3\xdb\x31\x91\xdf\xd0\xc1" -"\x5\xcboEr\xc5\xea\xbe\xf8U\xcd\x86\x9?\xc6\xac\x7f\x36p\xe6\xd9\xa4\xad\x9c\xb2" -"\x86\xc8\xb6\xc0u\xde\n\xdd\xcf\xc4\xdd\x17\x35%s\xc9\x1w\xc8KW&\xca\xa6[\xf5\xd2" -"\xc3Y\xc9Z\xe3K\xa8\x9b\x96\xd9\xdc\xe2\xb6\xf2\x2\x66\xf1\x10\x11\xc`\xac\xd2\x91" -"\xb5\x80>N2\xd2O^[\xff\x0\xff\x62\xa4U\xb7Q\xe5\x41\x81\x8\xa6\xab\x7f\x6^\xd7\xee" -"\x94\x5\xcb)\xe4\xc\xfb\xcfj\x1f\x5\x8d\xcd\xd3-P\x19m\xb5'\xfa\x62\xf2G\xbc\x65" -"\xd8\x99q\xbbU\x10\xad\x93\x34 \xd2\x64G\x97M]\xef\xd3xq\x91\x99\xf2!\xf2\x16\x5" -"9\xa2'\xa2;]d3u2\xedSO\xa5|P\x1e\xea\xb8*\xef\x37O\xb9\xbf\xab\x43\xb2\xe\xcf\xda" -"\xa1\x0\xber\x83\x39\xda: \xfb\xfb\xefG$\xc1\x8/\x9c\x7f\xea\xdd\x36\x16T\xad \xd7" -"\xcf\xb9VOf\x18\x3\xe8\xb9\x93\x61p\x95\xe8\x13\x16\xe0\xc3\r\x8d\xb\x39p\x86\x8b" -"\xea\x64\x12&!\xc2\xeene@\xd5\xa2`,\x82l\x97\x63\x16\x9dk\xa9(<&\x9d.;\xc9\xc\xc6" -"M\xb3z>\x1b\x1f\xee\x1c\x11\x9aX\xc9\x1e\x9e\x8b\x99L\xb6\xce\x8d\x1a\x64\xcd\xd9" -"\x1a\x97\x18\x63\x11\x33\x66\xed\x45\xfc\xc8\xef\x9bs+\x10L\xf2\x4\xb5\xdc\xd2\x32" -"\xeb\xe8\x2\x1ezI\xb6\xf\x41\xbf\x15\x63~\x8d\xa8\xcd\x1c\xbc\x87\xe8<\xf7!A8]\x80" -"\xd5\xb2\x1a\xd4\x8d\xe9\xa3\xf5\xb5\xdc\xae\xb2\xca\xb8\xcbw\x82\xfb\x6\x9a\xa6" -"\x9cs\x14\x63\x16\xe7\x97\x98\x8az\xbf=}-\xcc\x9f\x88\xd8\x85m\xa7h\x9f\xfa\x32\xf2" -"\xc8\xe3\x83\xd6\xe6\xaa\xd7\x19\xa8 \xf2&\xda\x64\x95\xf7\x82_\xaf+\xaa`\xee\xa7" -"h4\xc0h\xczi\x96<\x4x\xd7+b\x19{\xf5[\\\x87\xb\xe7\x9f^\x8$\xaf\xb0o\xee\x63\xb7" -"d8\x17\xf0\xcey\x8d\xc5\x46\xa5\x7\x91\xb8\x9f\xbc\xa8\xce\xc9\x3\xe9\xab\xcbj\xdf" -"\xdbQ\x8a\xb1\x86\x41\x1fI\x9b\x9\xcd\x8f\x12\x66\xa3\xf2OR\xf2\xcc\xeby\x84\xd2" -"\xacL\xcf\x96\x9:T\xda\xc7M\x80\x13\xa5\x4W\xc1\x6\xe9U\x82\xec#G\xa9\xd9\xd5\x34" -"gAdV:+\x85\x38\xfd\x37\xad\xf9\x36*\x12\xcd\x64\xb0}\xe1\x32\x2\x32\x9b\x0#X\x96" -"\xc0\xaa\x65\xdd\xc2R\x83\xd8\xe\xe\xeaJ^\xf1\xba\x94W\x1.S\xe3\xbd\x11\x44U\xac" -"\xfd\x98\x82\x83\x8\x83\x1e\xdf\x89y\xc2\xc7r\x91\xac$\x18\x6g\x95_pQ\xf0\x16\xb7" -"\xb2t\xaf\xf0\x1fzB\x8e\xe\xc8\x36,\xa4_\x5\xa9\xc4\x98wG[\xd1Q\xe\x15\xbdS\xa4\x19" -"1\xb1\x5\x86\xab\xeb\x98\x7fq\xf3'\xc7\xc7\\\xae\x19\xd2\x92\xbc\x1c\x0\xadX?li\xaa" -"\xc1\x89\x1f\xbe\xbb\x1e\xa9\xc8\x8\x9cK\xc9\xe3\x9fV4\xd5\xc5\xb8-x\xc9\x8c\xfd" -"\xf3\x8f\x61\x1c\xd6PC\xac\xd4\xc6 R\xcdG\x18\x1cR+\xf2\xfd\xa6\xb3 \xf7\x45\xe1" -"\xd1\x89}3O\xaa~\xb7\x16\x30'\x1d:!\x94*g\x9aJ\xe0\xb0\x1e\xfc\xec}\xde\xc7\x89\x19" -"]uf\n)\xec\xc9\x45\x82\x17\xbaQ!\xcc\x66\x84'\xca\x1\xeeg\x98-`,sQ\xac\xf9\x94\xa9" -"w\xeb\x9a\x8c\x85\xb0\x7\xd1\x13]\x87\x32\x33\xd3q\xb2+\x80\x1eJ\xf8\x93\x19\xf6" -"\xb0\xca\x89%\x89\xa6N\xc0\x2\x17\xea\xa5\x1fz\xc3:\x81\x94\x7f\xae\xb4\x4\xa7\x8b" -"\xd7\x65\xa8\xfc\x80i\xd4\xd1\xf6\r_\xe9+:\xf=\xe3\x8b\xb\xad\xe7kFh\x80|#\x8b\x11" -"\x16\xf2\x34\xa8\xde\x90\x1a(-\x95\xe3@\xa0\x32\x9b\xc\x4\xf4\xf7\xe9\x97\xe2/<\x11" -"O\xdc[\xb7 P\xcfP\x99" -"\x8\x1b\x3\x8b\xb1\x18\x11\x34\xcb\x88Gn2*\xbS\x6v\xb7Z\x9a\x81\x17\x97ZU\xaa\x95" -"\x94\x1f\x1b\x86\"\xa7\xa5\xd1\x9a-^\xc3\x42!\x90\x8f\xc6U\x0\xc9Z\xf2.\xd4m\xc\xbe" -"\xf0\xdc\xab{XZaR\xabQs1&p\x9f\xf0\x83\xb8k\xd3y\x1e\x18)\xafx\xde\x86\xa4\xe\xd5" -"\xdb.I;\xd3\x18\xb3z\xb9\x83\xd6\x87\xad\xc5\xee\xc6\xfc\xddKN\xa0=\xe7,;\xe2\x88" -"!\x90\x61oy=\xb3\x13\xe0\x81\x31\x1c<\xbc\xd1/KXv\xf2$VD\xa1v\x8\xf7w\x1a\xd5\xba" -"(\x1f,\xadQH\xcfT\xc8\xe0\xa9\x82\xc4W\xce\xbd'S\xed\xfc\xc3+!-\xd9\x94R+\x19'\xd0" -"\x8\\\\x~\xde\xc8\xde}\xed\x88\x66" -"\xc4`\xe3\xb1\x8a\x45\xd6\xf5\x16\x7\x8crW\xf7\xf3\xe4\xf5J;!\x86\xcaw?>\xdf\xae" -"\xcb \xd4\xb6\xeam\xa0Q\x1\xea\x98\xca\xfct\x91\x1\x9d\xab\x30\x8d\r\x61" -"\xf9\xe9\x9a\xb2Y\xd5y\xe4\x18k\x95\x1d\xf7J\x82 Rp\x1bH\xb8\x1f]\xf1\xa4u\x1a\x41" -"\xea\xbbz\x16\x44XdI7Z\xaa`\x87p^\xa9n\xa7\x98\xb8\xaa\x66\xb4\x93\xf5\xa9\xcb]\x15" -"\xa8\xf\xb6RF\xd9>6\xa7'g\x93\xd1\xa9O\n\x8c\x99\x85\x14\x9d\x4\xc^\x94\xc3 \x7f" -"h\x9e\xba\xc3Q\xd1K\"\x11\x80h\x83\x82?C\xd2\r\x1fL\"\x9c\x62\xe6\x8c\xa7\xcc*\xf1" -"$\xf2\xb7\xfd\xd2\x7f\x19\xe6\x35x\x11t\xa4\x16\x3I\xf8}Q\xacv\xaaT\x88%\xaeuv\xf9" -"\x3U\xdb\xde\xe\x80\xa6\x9c\xe9\x32k\xff\x63\xa7^\xe3\x35\x39u]\xa7\xaaQ\xcck!\x11" -"x\x9 \x2\x9e\x8c\x9e\xca\xbe\x45\x8e\x13\xae\xfb\xad\xce\x66\x36\x87lJ\xf1\xfc\xb5" -"\x1d\xfb\xf3?\x12.\xf9\xd7\xed\xe3\xa6\xf2,\xa7\xed\xb6\x65\xef\xee/X\x97\r\xf\x81" -"V\xbb*\x10\x44\xb6\x16\xc6\xa5\x39\x65\x30\x37\x98\xf6O\xf\xe4+n\xfa\x32\xee\x0\xb6" -"Fy\xe1_\xfe\xa9O\x1bV\xfc\xb6\x1e\x39\r\x7\xfc\xafl\xe0\xb9\xdeY\xb1W5=\xad\x9a\xe4" -"\x3`i\xb8++\x80\xfd\x4n\x86\xe8\xe6<\x83\xba\x87Z1\xda\xde\x2\x98\xfa\x44X.ypx\xf9" -"d\x9c\xf3\x86\x85\xadz\xfc\x36\x1d\xae/\xfe]\xad\x9d\xa0\xb4Y\xa2\xb4\xe6\x1a\xe3" -"d\x9e\xce\x9fyH\xcdy|\x93\xe5\xc3\xc3\xac\x32\x8c\"}\xf1\x98\xaa\xb9=\xf3\xf\xb2" -"\xc3\xc2H\xa2\xee\xf7Vg\x92\x98=v-\xf5\x97\xe1)\n\xb8J\xfa\x62Z\x99\xe9\xdb\x89\xc4" -"1Q\x9d\xfb/\xd0S\xb3W\x8d:lRu\x8b\xbap\x8a\xaa,-s\xed\xc1\xe2\xc2\x1\x81mC\xa0k\x82" -"\n:\xe3qwP\xcb]x\x9b\rL\xe1%\xe1\x43\xa3\x85\xd8N\x10\x32\xf6\xa2 p\xe\xa7\x8\x41" -"h4\x9f\xea$W\x83\x1a\x92\xa9#\xc7\x9dTi\xbbV\x91\x46\xd8\xb6\n\xf1g\xd5\xdf+\x84" -"\xde\xde\x37\x65%\n\xdal\xd0HQ\x8c\x6\xbe\xc3\x81\x94\xd7q;\xe1\x5K\xae\x98\x61\xf5" -"EB w\xa2#G\x8f\xce\x39\x13\x64\xee\x8e\x9c\x8@\x3\xe9\x8f\x63\x87\xd0\xc8\x64\xea" -"\x81V\x8[\x18\xb2\x44\x12\xac\xc8g\xec\xa2\x8\x32\xc2\xc0\xbd\xb2\xb6tB\xbdlw\xf2" -"\xed\xe3\x8fW\xe*O\xb0\x15!*J\x16\x9e\x42x\xfd`\x11\xd0\x0\x39\x97\xae\x80\xab\xf3" -"%\xa1W\xad\xc6X\xd4\"\xe3\x6\x83\xa7Z\x8c\xac\xbd^\x8a\x35\x7f\x1a:\x92\xf\xf1\x63" -"\xe2\x8a\xbb\xaa\xec\xac\xffum9G\x0\xa3\xfb\xbap\xb8\xf8+\xe3\xd3\x5\x0\x9dJPL.\xb8" -"\xd9\xe6\xf7\xeco\x9b\x1b\x31\xf1v\xeL\xdc\xf1\xcb\xd9L\x92W\xe1\xfbM\xa3o\xc3\\" -"dc\xa1T\x98\xa0\x12\x1dU\x8f\xa5\x39\x4\xa1\x93G\x16\xd3r\xfd\xc2)nq\xd5\x66\x65" -"\xf1\x90\xe7\xc0\xbd\xb7\\<\x98\xb1\xbb\x88`?\xa1_\x9\x65\x1\x10-O\xcf\xd4\xb6\x98" -":\xed\x12\xa6`,\xc2\x43\xa6Q\x8e\x66\xfcX\xa2 \x89:\xb4\xa3\xd4S\xb7\x81\xa7\xb9" -"\xd5\xc8\xe\xab\x66(\xfc\x1e\xdf\xa5\x36r\xf8\xb5\x14\xb\x82\x4\xb2)\xc8\x44\x9y" -"R\xaf\x18\xd3G\x89\x37\xc2\x31\r\xf2\xd0\xe6\xe8\xbcMZAU\x18\x9f_fI\x16\x13\x87N" -"<}\xf0`\xcP\x1b\xcd\x32}\xbc\xbf\x66[\x0\x89gv|N@\xf1\xef\xa4\xbf\xc6\xee&\xb2V\x94" -"b\x8a\xc4\x8e\xb4\xfe\xa0\x85\xb8\xf6\xe9\x7f\x1b\x97\xb\xdd\xa2&)\xd8*\xa5\x33\x46" -"\xa5\xa4\xf9\x14})\xe2\xa6\xb5\x96).\xb1#\xba\x88\xf4\xbcn\x8b\xe8\xb\x33\xb2 \xf" -".\x8f\xd5\xa7\x10\xe3\x61)\xc6\x33\xd1\xab\x42\xbc\xcb\xa1(\xfb\xe4\xae\xa4R\xaa" -"\xb5\x1a\x81\x87\xff\xf6\xc1\xfc#\xbb\x1a\xb5/o\x9a{\x88\xc2\xc1S\xf5Ne%\n\xd9\xf" -"\xf1\xbd\xe5\xc1\x42\x8d\x62\xa3-\x7f\x99y\xbe$\xa6\xa4\x44\xd0\xf7\x31%g\xc9\xfc" -"\xdb\xc6\xe5\x97\x43\xfb \x1b\xefV\x14p\xe5\x81v\xe8!\x1c\xecsL\xd0\xd2\xab*aom\xdb" -"\xaa\x11r\xa0NDZ(\xf5\xcc\x7f\xb3\xa5\xa8>\xf4:\xf4\xe2\x9aI\xd2\xce\x41\xfb\xdf" -"\xd6T\xed?\x85\x63{\x17\x12\xef\x12\x44\xbc\xa7\xaf\xfe\x83v~\x8a]\x9e\xb3\x31x\xa7" -"\xcc\xc6\xf5\x33WF\x1e\xaaO-\xda*M{\xed\x8a\xa1\xd0\x64\xaf\x91>\x1f\x8d\x6M\xf1" -"/7\x95\xa0\x89\xc5>I\xed\x8\x30\xc0\x1e\xe0\x1e\xf5\xea\x9a\x35\x95\x34\x1\xd6%\xeb" -"\xb2\xe1\xb2-\xcd\x30\x1b\x45\x1cY\xfc\xe2\xbcX\xd0\x9f\xef\x36%\x37U\xdc\x95\xba" -"!\xf6>!2m\xfc*EQW\xb1Q\x15\xa7\x95~\r\xd4\xb1\xf3gxg\xd4^X\x14\xb4\x93N\xc7\xe`V" -";\xc1\xab\xb7h\xa2\x16\x63\x30%\xd7\xfkF\xaas\x1d\xee\xdb\xe7\x88\x43\x30\xef\xb2" -"\xbb\x66Y\xa1u=41\x93\x9f\xfe\x93P\xe\x91{\x9a\x4L\xfc\x44\x8d\x85Y`\xc6\xe0\xe1" -"\xd8\xaf\xd0i[H\x15\x38N\xfe )\xd7\xcbK\x4\xf1\x98W\xbf\x36v\xd6;\xb6\x34\xa5\xad" -"\x86\xb6oLp\x85z\xc5\\w\xc7{\xd2s\xc4\x7f\xf9\xb0\xf0oG\xa1UVq\x2\xc6]0Qr\x19\x1d" -"\xcb\xc9\xa4U*\xf1y\x6\x93pA\xdc\xe5\xd2[\xe8\xf7\xb8\x9e\x34\x63m*\x96\x16\xc9\x0" -"F\xc3x\x8\x5\x8f\x86\x9a\xe9\xc3\x99\xb8\x12h\xf3\xa0\xb7\xf1RG\x17\x6\x35\x96\xdd" -"\xf8\x16]%5\xe1\xfe\xef\x13\x1\xdf)\x18\xb6\x8cXZ\x1e\x9b\x1d\xc7\x7<\x80\x87*\x9PQ\x8eL\xe7|\x8\x90\xa1\xc7\xc8" -"\xa0\xe4\xfe\xb3\x13\x89\x91\xe\xa6\xbc`M}\xd5\xc6\x10\xab%}\xb7\x64}\xfb\x88\xc7" -"\x8\xe1\x1b\"\x63\xbb_\x7f\xb3\xe9\xb\xd8\x8e\xa0 B1\xe9$\xf9\x35\xa7\x39\xf0\xf9" -"\xce\x5n\xc9m\xc1\xa2#Q\xa4\xdfNr\xb9\xa4o\xcb\x41\xbaz_\xca%\xdaN\xe3\x17\xa0\xa1" -"\xb5)\xcf\x94\x61\x14q\\\xc3\xbb\xe5\x61\nv\xa7\xb7\xafLA\xdd\x31WL\xa3\xe5\xab\xc3" -"U\xc6\xbcU\xec\x16sp\xdcn\xd5\x31\nT\xef\xbb\xe3\x36\x11\xde\xc1\xad$\xf4\x91#N\x8e" -"w\xa7\xca\xac\xb6\x8b\xc3\x64\"Y8y\xfc\xdc\xd1\xeb\x9d\xf7Gz\x18\xf\xf3QV\xa4u\x7" -"\x8a\xd3\xf5]7\x80\x98\xcf\xc0\xea\x10\xcb\xb4\x83/\xea\x38W\x1%\xb?\xc5\xf2\xb4" -"\xc6w.j\xb\xd0\xb\x81HR\xbb\xae\xc1\x82r\xc\xe4\xa8W\xd9\x1d\xf1\x64r\xd7\xab\x94" -"f\xdfI\xc0#\xe7\x33p[\x97\xd3\xefw\x15\xa2\x11\x45Rz^\xd3\xff\xb7\x33\xde\xe9\x11" -"\x1a\xb5i\n\xae\xc2\x35\xe2IYF\xbd\xe6\x45\x85\xa5]\xdf\x31~nC\x8R\x90Y.\xb6Z;l\xbe" -"KI\x89\xf0\xee\x44\xaf\x66\xad(\xe7\xd9\x9e$\xe5\x1c#\x8a\x97\xeaMdE7\n?\x1e\n\xe7" -"\x1bsq0\xc3@%\xaa\xa0y\x1b\x11@\xe4\x81?\xae\x17Z\x84^ZA\xd7\x9c\x6\xcdl\x81\xca" -"\x88S\x17 m6hD\xafP\xf9.\xc6O\xbe\x64\xb7,\xe1\xed\xb\x8a\x34%ox\xa7\xd4\x94r\xbc" -"Hg\x1a\x35\xff.\x1f\xb5\x1f\xbf\x1dR\x96%&T\xcb\xef\x34\x43\x4~Z\"\xc3\x42\x83\x16" -"\xf7\xfe^#\x4\xf4\x96\x8f\x93\xbb\x13\x84\x64\xfbU\xa9\xfI\xa6\xd4\x17\x42\xbb*\x2" -"\xd8\xc5O\x0\xc9\x37.\x9e\x95\xac]}#\xed\xf9\nl\xb7G3/\xe1\xe3\xfc\x91\x86LZ@\x95" -"\x86\xbb\x85,y\xc2\xde\r\xbc\x1f\x83k\x17\xb7\xfc|\xdb\x15\xac\x81\x81_\xecX\xfe" -"\xb6\xc6\xdd\xb6\x35\x3\xcf+\xe5\x46\r\xf2\x95\xc9\xcd\x39\xd9}\xf7\x8a\x45\xf3\x1b" -"\xdaM;\xcc\xc2\xe0,\xd7\xd6\x90\xd2s!\xdc\x5T`\x88T~A\x8\xb7\x1c\x84\xeam\xccU\xf5" -"\xd5\x12!7\xbd\x1bn\xe5\x30?Yy\x9d\x8a\xe0\x8f\xba<\xdb\x93\xc7\xf7\xbf\xf9)\xba" -"\x97\x12\x80\x9f\x85\x86^N\x81v\x98\xa4\x62\xc1\xe\xc8\xf9\xf7\xaf<\xda\xdc\xe2\xfe" -"m\x87U\x9d\xc0\xeb\x9eL\x86\xd2\x92\xb1T\n\x8e\x39\x8c\x37\x15\xa1\x63\x42\xd8\xf8" -"<\x8\x93G\x8b\xf7\xbe\x85\x94p$\x8a\xeT\x94g\x92_\x7f\x82\x45\x1fq\x1c\x7J\x9c\x5" -"\xa1|\xbb\x38\xe7{\r\xe7\xb4n\xb9{\x9d\xca..A\xafKY\xbey_p\"@m\xf0\xe3\xc3Up\x9d" -"\x9b\x89\x8a\xc6\xbf\xef\xe0\xc8\x62JS\x8e\xef\xbag\x88\xa8Z \xb3w\xd5-\x90\xe3\xe1" -"\xce\x94\xb2\xf1mp\xe4\x16\x89\xa9\xcc\x36;Y\x4|\x12\x8b\x83\xae\xbb\x9c\x64\xf " -"''\x8bK<\xd2%Q\xee\x8c'#\xde+n\xef\x14\xcaz7^3\xbd\"\xc8\x9f\xafl\x8\x30\xee\x37" -"\x1c\x30\x16\xf1\x9d\xbc\x35\xe4\xbc\x80\\\x8e\x80\x44q\xeb\xb8\x95L:\x90\xeex\xc5" -"\\\x97\\^t\xa9\x9b?@nE\xff^\xe4\xfb\xe\xb9\x13\x81\x13pk\xf4\xf\x13\xc1\x98Yy\x12" -"x\xfe-\xa4\xb5\xbe\\\xffW\xc7\xa4\x65^\xecp\x83/1\xd1\xcb\xcfr\xa7W\xee\x4\x6\x15" -"Lt\x14M\x88\x90\xc4j\xf6S\xd8\x7\x64O\xa8\xedi\xe3\xb4\x81\xb6\xd7\xc9\x45\xc0\xce" -"'\x86\x97\x1d\xd0\xed\xce\xe6\xce\x7fjj\x89\x41l\xcc\xc5\x42\x89K\xfa_\xab\x8f{\x9e" -"m\xbdi_\x9a\x1a\x94O\x17\xea\xb9\\\x82\x44Q\x82\x15\xb&\x93\xb6\x7\xa6~\n\xea\xb7" -"\x81\x7f\x18\"~\xb\xfd\x2\xce\x8d\xf3J\xdb\x2Z\xce\xe6\xaf\xc4\xe2\x82\xd2\xbaR\xe" -"\xed\x98~\xc8\xe7\x0\xb1\xeb,\xce-p\xa8*`b\xb5\x9d\xf6\xb3\xe2|\x9a\xfe\x46\xef\x1f" -"X\xa1\xf9M\xfc\xf5w\xc4n\xcaQD:\xed\x42'\xc2\x97\x2\xbf\x81\x4\x80\x11lB\xee`\xca" -"\xf8`3QA\xb8\x39\xf3\x35\xf8\x86\xdb\x61l\x8f\xbe\x4w\xc2\xa6\xb9%\xb9\xae\xe8\xfb" -"Y\xfb\xf0[\x8e\xa3\xe4\xfe\xb3\x13\x89\x91\xe\xa6\x93\xbfySl\xfe\xc3\x30L\x89{\x8a" -"P\x8e\xd3\x83\\|\x4h\xd1\x30KZ\x92\xe8\x9a+\x81rv\xab\xa0 a\x9\xc8\x89u\xb\xe5\xbd" -"eC\xbe\nt\xbd\x41\x35?\xac\x87\xb0\xcd\x86\xa9\xe3L\xc5\xec\x9c\xd4u\xab\x6z\x3\xea" -"[\xb5>1\x7f\x17M{\x18\xfa\xd3`\xcd\xca\xc5\xaf)KbNzR\xb6\x38\xdb\x1c\xb1#\xcc\xff" -"iW\xa5\xba)9U\x9f\x96\x9e\x9c\x38\xdb\xa8\xfc>\x81\xd5\x66\x3\xee\xd0,$\xc7}\xbf" -"\xcf\x3\x8aY\x16\xc3Q\x88\x1c\x62~\x7fg\xdf\x63\xb1X,\xe2\x1\xe7\xc1\xcb\x8c\x35" -"\xeb\x8b\xaa\nO\x8\xe1-q\xe9\x64\x95@\xc8\xd3\xc4\x41\xc6\x99\xdb\xad\x87z\xd5\xa5" -"\xe6\xd5K3\xa5\xe7>\xdbG\xa4\x96\x1cQ\x0\xb6\x6\xa2\x31\x9c\xe1\xf3\xfd#\xb0h\xac" -"\x13\xe8\xde^D\xd2>\xa6\x46\xe6i2*\x81\xd4_H\xcd@\x9a\xe9\xf4\x8f\x7f\xda\xf4\xb9" -"\x98Nj\x9fIl\x9fJ\x4\xa6\xa2\x63\x9e\xb0\xb1\x97:\xc9S\xe1\xf7\xab\x95\xdd\xf3p7" -"\xd4$\\\x0\x11\x9b\x9d\r\xe9>\x17[\xe8\xcd\xce\xbe\x33\x82\xe\xa5\xd7x\xe1\x0\r\xbc" -"`\xab\xb1^\x8b]l4\xdf\xb9\xe7\xf\x63\xc5\xd6:\xee\xe5I\xcb\xc8v\x1e&!\xcfJ\xa7.<" -"u\xd3+\xdf\xc\x1d\x1d\xb\xc8\x1a\x8e(\x9c\xbc\xfe\xd7\x2}\x94\"\x8d\xd8\xe1\xb5\xaf" -"f`\x98\xf7J/X\xa0\x33'\x7f`K\x87\x10\\\x0\x38\x10\xf1\xf8\xfb\xaf\xcb\xac\x13<`%" -"\xd1.\x13\xd9\xde]j\xaf\x9e\xfcO\x8b\x89\x6\xc6\xa7\xe3\xd7\x17}\xfb\xe2\x83\x11" -"\x7}\xa0\x30\x93\x8ehE\xd6\xaa\xb4:\x1d\x1c|%\x0-\xd1\x32\xb4\x12\xfaV\xf0\x8cm\xdf" -"\xbfL\xc6\xe0o\x7fN\xc9\x38\x65\xbf\x90\x90\xc7R\xb1\xfc\x34\x10\xdb\xc4\xc8\xc7" -"\xe9\x1e\x13\xf6\xa3\xe7#\x9\xa6\"Y\xf2\x1d\xe4\xdc\x84HFBp\xd9\x0\x9f\xaf\xff\x15" -"e\xde\x45[\xaa\xea\xe1\xa2\x11\xe9\xc1w\x1f\xdf\x46\xd3\x13\xb7\xcb\x4\n\xd1\x61" -"~\x1e\xc0`wB=x\x86\xb2P\x9c\x8a\xa0\xf9']\x1f\x36\x7\xdd\x9e\xd1x\x13\xf9\xd2\xe" -"\xa2\xdd!\x93^bc\"\\MKu\xd9\x7\x19\xf1\x14\xa6\xb7\xb7\xe3\xe6\xb4.\xa4\xdb\x97\xe7" -"\x12*\xd2\xbb+\xf6\xf2\x98\x0={\xe5pg\xe\x9f\xce\xa4|@!\xa7\x8bQ\x94\x18:M\x1c\xa1" -"V\xa3\xbav\x98\x42\x82r\x2\xfa\xab\x9b\xad\xa3\xa1\xc7\x64&\xcb\x9d\xe3\xe1\xbd\x16" -"\x15\x83\x80%u\x2t}oL\xa1\xba\xe3\x9\x17\x14:\xd3\xf9\xc8\x1a\xfc\x9e\x99+\xb9\xb2" -"G//\xb1\xda\xb\xd6?\xf4\xb8\xa2]\x1b_2\xcc\x9e\xc7\xa4\xaf\xbbQm\xab\xb8%\xafhS\x7f" -"i\xd2$\xa3\x5\xecj\x1f\x2\xdd\x9b\xa9V\xae\xb2\xe2u\x9d\x4\xaa\xf0\xa3 z\xc0\xb7" -"\x9du~kou\x9f\xdb\x45.\xfa\x0\x85\xe3Z\\\xed\x65\x12\xe4)?,\xfb\xc6\xa3\x82\xa2\xb6" -"\x96+\xf1\xe3\xc1\x9f\x13\x16\x8f\x37\xc1\x90h\xbz\xae\xc1\xde\x17\xe\xda'\x94\xd4" -"\xa9\xa3\x30\xc3\xe2IC9\x7\xc8?yNz\x8\xe1\xf3\xf0\x38\r\xfe\xf3\xb4HL\xe6t89\xed" -"r\xee\xe4-\xc4\xc9\xc\xa1}\xfew\xef\x90\x3\xaa\xa5\x8a\xe0\xc1X\x94\xc\xc8l>\x98\xb1\xa1\x7m&\xdb\x35\x13V\x95\xae" -"\x98\x83\xf6\xfe\x4\xd9\xf6\xbcZK\xb9\x35&y\x16\x18\xbf\xd2\xd2q\xe9\xe6)\x11\xf" -"\xe\xea\xb1\x84\r\xbe\"\xb4\xea\xca\xbf\x1b\xf5\x81\x12i\xdc@\x8e\x12\x16\x8pb\x19" -"Pv?\x9c\xf7o?\xb1-1\x15\x84\xf4p\xc5\x1d\xb5\xd7s6]\xf2n\x91#\xb\x19\xa8\xb1&\x89" -"\x85\x33o\x8c;\xfd,\xaa\x33_\xb4\xc1\xf2@\x1b\x8e\x19\xee\x30kO\xf4\xaf{\x8e\x4\x99" -"\x8c\xedgK\xaa\x9a\xcd\xe7\x9e@\xc5\xd8\xee\x9d\xd5tV\xca\x8d\xd6\x9f\x8d\xcdQ\xbb" -">\xd0\xce+A\xa5\xb4\xd8+fGo\xb9\x1e|$h\xfd\xa2\xd2\xad\xcf+X@(M\xe5\x97\xfdj8\x7" -"d\x89\xb6\x1f\x3\x6l\xde\x17\xed$\xc9\xccq\xb4\x1dJR#~\x1b\xbc:\r8PDhf\x1f\x39\x1b" -"\xa4\x45\xb2\xe\xbf\x3\xb0\xad\xea\x11\xafPL\xa9\xf8o\x9\xe9\x43\xde|{\xe9\x1c\x4" -"\xd7F\x81r+wE\xad\x16\x1a\xf3\x9e\xf2@z\x18\xc5\xfa\x93\x1a\xca\xe3\xc0" -"\x89\xe8\x1b\xdc\x35\x94\x17\xa8\x16\xd3\x18\xdc\x35\x42\x9cz\xab,\x83\x8f\x31)\x6" -"\xca\xa0\x5n[\x12pjuru\xee\x10\xb3H\xe8\xda\xb8\xfa}\x93ZO\xd7mz&\xf6\x18\x1e\xb8" -"U\x9e\xcf\xa8\xab\x64(\x8b\xeb\xfbo\xe9\xa0vn'\x98yA\xde\xc9W\x9aK\n\xe7K4\xdd \x91" -"\xdd\xf7\xc5\xf8\x19\xe4\x30\xb4\xc4+#\xd1\x33\x1e\x93_\x94\xf2\xa5\x8aJ\x11\x8d" -"D\xce\xb6\xe1\xfev\xa5WFw\xe4\xe9[\x1f\x84\x92+\n8\xf0~AU:\xa7\x46\xfc\xa8[\x9\x1e" -"\x8d\xc\xaf\xac\x81\xa3\xbdH\xbf\xe2\x5G\x8f\xb0\xaa\x8e\xb4\x82q#\xef\xc2\x8b\xd7" -"\xe4\xbe\xe5\x90\x97U\x0$@\xd2]\xb3\x3+\xd1\nG\xc7\xbb\xc0\x32\xdb\xc8`\xf4m\xdb" -"_Ot\xbf\x37\x87\xc6\xc5\x8d-\x93\xbe\xda\xbc|GS+Kk3\xc0)5\xb\x42\x46\x8\x43\x93J" -"\xad\x10\x84\xa9`\x92G~\xa4\x9e\xd8\xca\xa1.\x8\xa4!\xea\x86\xa8.a\x18\xd5UpOe\xc8" -"\xe7\xf9\x9d\"\x80\xbcU.\xcd\x4\xe2(\xc4\x8c\xb1\xbev\x85\x63n\xbb\x30 \x94\x93\xc3" -"e\x1a\xe9U\xa4\xdb\xfdz\x6O\xe6<\x5\x3\x9\x38\xc1\x8aK\xe5X\xd0\xbd,\x85\xcb\xd6" -"l\x96l@\x88;gL/9\xb9:\xaa\xc7\xe7y\xd6\xb5\x0\x80;m$\xe7$\xf2\x61J\x80+/l\xaf:\xb" -"\xc0\xcc\x1d<\xcf\x82<\xa5\xe9\x64\xc8\xf7'\xf0(\xb\x64r\x99\x99\xbex\xb4\xc2\xe6" -"~\x0X\xfb\x9b\xe3\xf4\xd7\x8e\xbbY\x13\xaaS\x18\x99\xd8\x62\xb\x97\x65\x87w\x16'" -"\"\x1b\xae\x17\n\xd5\xa2\x33\x80m\x9c\xd1\x36\xef\x65\x64\x84\x64!R\xea\x3{nq8\x83" -"{vN\\\x85\xd8\xc2}\xc1;\x8e\x42\xe4Pd\xb6\x9Uy8\rC+x\r\x10\xd8\xb9\x1c@\xa4\x35\xa1" -"\x5R\x9b\x0M`\x84\xe9L\xc9\xf4\xa6\xd9\xebk\xcf\xf\xf7@e\x89\xd4\xf6\xb5\x33@\x8f" -"=s2Yk {JdY:=y\xd8ZL\x9e\xc2\x10\xe5\x8\xbf\x1b\x9b\x61\xd9\xdd\xfe\xde\x31\xae\xc9" -"w\xf1\xa7\x19o\x19\xb2\xc6^?]\x80\x32\xfc\xe0\xb5\xc\xb7\r\xf1\xd8\xd5\x31\x16\x8a" -"\xc0\xc6\xd5uw\x8b\x0\x8ck\xa6\x16\xab\x12\xb6\xfa\xc2\x9b+5\x1\x87\x8d\xba\x0\xe1" -"\xdb\x9bK\xef\xa0\x8a\xc0\x91\xf4\x93\x7ov(\xde\xe0\xe6\xe7\x9f\x86\xdf\xba\x81H" -"F\x9e\x14\xbf\xd5\x84\x9<\xce)@\xf3\x37\x90\xdd|\r\x19=\x8a\xdd\xd2\xad\x66ub%PN" -"v\xc4\x30\x1b\x2\xcd[\x10\x89\x91_\xf3NBn\x86]\xc8\xba\x1e\x64\x7fJ\x8b\x8b\x4\x2" -"\x8f\xcc\x1\xcc\xfc\x8b\x19j\xeb\xf4n>!.*E<6s\x83;\x9bP\x16\xee\xc4\xcf\xf0\x89>" -"\x8d\x65\xa7\xcHN\xec\x8f\xef&na(9\xb8\xfaU1]\x6\x17u\xc5\xbe\x4\x87\x8a\xa5=\x6" -"X\xc1\x11\xd0\xcfV<\xe4_wI\xb4\x7f\x16\xa7\x36g\xe4\xfb+\x19\xdc\x9b\x35\xc2\x36" -"R\xc1\x33\x39\xe2\xb5\x41\x45\x5\x7\x9f|\x8c\xc-\x14\xc3\x88\xf2\xbd\x36\xf1\x7f" -"3\xe8m\x81pfZ\xbb\x36S\xa4Y6\r\x9kOn\x6\x94\xb7\xd8?y\xc1K\x2\xf0$\xebS\xb=J\xc1" -"\xb0W\xb7m\xb0\xc0\x61\xcb'\x96%\xfeNI\x9f \xc2\xce\xcd\x5\xc5\xb9\x4\xf4&\xe\xe1" -"Sg\xd7!):\x96\x9c\xe1\xea\xc3+\xba\xe0\x9c\xec\xa9\xd9\x93\x39\x8c\xb3\x41'\r\xb5" -"\xea\r\xfa\xd4nn\x1cj\xb4\x1d\xa9%\r\x62\xf5\xa9H\x9dv\xb8\xdc\xa7&\x9a\xdc\xdeQ" -"y\x7\xe3\xf7\xd4T/\xac\xf0\x1f\xccw\xa8\xa5\x12?\x7\xe7\xa1\xfa\xb7\xf1$\xdc@\xb" -"\xcc\"k\x85\x81\x1c\xd3\xa6\x30p\xee\xe2\x1e\xa7\xa4lBw\xb9\x61\x64O%\xb4z#\x87X" -"\xc3\xc8\xbd\xd1\x39\xd5\xc0\xf2\xa9\xc6\xb2\xcb\xda\x1e\x9bvH\x8a'\"$\xdb\xffY\xa2" -"h9\x14\n Tg&ZOYT*\xb1H\x88\xe7\x1a\xc7X\xd6)\x13\xff+\xb1}/'\xf1-\xba\x82:9\xf9%" -"(\x9c^\x9d\x1\xbdO4\x4\x19w\xdaI%\xcfI\xf7Q\x83>\x83\x30\xaaL\x98$\xcc\xac\xac%\xff" -"\xe6\xea\xef\x9a\x98\x92\x9e\xa4n\x1e\xff\xb1,p\xff\xed\x18\x6\xb0\xf6\x8c\xcb\x14" -"\x16\x62#Rio\xe4np;*\xe6\xe3\xaf\xdb\xe2\xf1xP\x3Oy\xaf\x30\x8f\xda\x1f\xcf\xbc\xd7" -"[\xf2\xc1j$\xe1\xf4\x5\x9bvL\xab\xe2\x82\x1d\xf0\xd3\x7f\xac\x84\x9\xff\x31h\xd4" -"S\x4\x44\x95\xd2k\x10\xa9\x9e!\xcy)\xe2/z\xa9\xa4\x17\x32\xf5\x1\xee\x1c\x9f\xec" -"j\xc0\x5o\xe6(\xc2\xde\r\x43\xf5$\x8c\xd7\xca\x86VV\xddsb)O\x95Q>T\xbb\x9b\xfdO\x19" -"\xd7\xf\xca\x64G\x90\xa9\x1e\x44\xee\xef\xad\xfc\xc3q\x7f\xba\x1d\x12G5\xf\xe9\x87" -"\x8c\x86\x0\xe8}~+f\xb9T\xa2\n\xbd\xad\xa4\xe5\x1b\x1d`\xc5\xbdX^\x9aH}\x8aR\x6\xa5" -"\xfe\xfb\xb5\x13\xd1P\xdcu\xde\xb\xd0\x9c.\xdc\xc2\x92\x11\xea\xf6\xa5L\xe\x9\xd5" -"\xa4j\xb7#S\xc4\x9a\xc8\x1a\x65\x1f\xf7\x1\xe4\xd5\xf3\xbc\x35K\xe0=\xfa\x8d'z\x3" -">\\.Q\xf2\xfo\xc2\x19K\x11\x92,\xc2-@,\x98\xe0\xbe\xe3\x4\xe3\x0\xde\xc3\xa0iC\x14" -"B\x19\x64\x2\xce\x82\xb9\xa3\x93\x18\x8d\xfc\x15\x89QW\xfb\xe6*\xaf\xb6\xceg\xf\x4" -"\xf1=\x16\xfb\x82\xbc\xb6\xbf\x1a\xb8&4\xac\x16\x89N\x94\x5\xea,\xb2\xc5 aD\xc2\xaf" -"\x1b\xb&\xd4R+\xf5\x89\x8c\xecK\xe1_\xb0\xd9\x83\xf4\x64\x8e\x35\x87|\xcf~\xcc\xa0" -"\x6\xc4\x9e\x10\x9\x1f\xaeqO\xdb\xb5V\xf0\x16\x1f\xc7p\xe5\x1f\xa4\xec\xfa\x97\xed" -"\xaaHC\xc7\xfc\x30\xdc\xb7kF\xd4\xf2\x1e>a\x8b\x8\x11\xf6\xc3\xd7\xa6T:\x98-x[\xa5" -"\x9d\x46\xa4H\xd6\xc\xfc\x65\x96\xf%W\xb4\xb8v\x2\xb7\x85R\xeb\x5?(\xd9\xfb\x9a\x1b" -"i\xf7mK~\x6\x30\xe8\xaa\x81\x31\x92\xd5\xdc\x9c\x9e\xc5\x10\x11\xe\xde\xe3T\x19Z" -"%cu\x9d\x46\x33\xc2\x8d\xd6\xe0\xb4lw\x8fZ\xa3\xc2\x8b\xf5\xeb\x9e\xbc\x88~\xee\xb5" -"]\x0>\xb6\xbc\xe8\xd1\xf4\x2n\x7\xe5\xc5\x13|\xea\x82$\x14\xd8\xf5\x61\x98\x31pj" -"\x1b\xb3\x32\x98\x84\r\r\xdf\x9f\xb8\x9cR\x9f-\xa5&\xc7\xe8\xe4\xe0\xec\x42\xd5\xb1" -"\xf4\x5\x86x\xb6\r\x13\xe4\xde\xc5\xe1\x1d^\x8c\xba\x8e\x6G\x89\x61\x30$\xfe\x1\xf2" -"tr\xf2{\xc0\xd1\x11H\x94\xab\xdaU\x91\xf3\xba\x82\x1f\xd9\xec\xe0%\x17\xf\xba\x66" -"I\xf1ZO5\xc4Sz#C}\x3\xde\x7\xb5\xf4\xf4\xf9\xcf\r\x41\xb5_\x8c\x18\x93\x97\xb9`\xe7" -"\xa2\xf5\xdc\x16\x9b\xf1\x84u\xe5\x92\xce!\xd1.>0\x2\x38/l5\xef\x97n\x9c\xb0\x8k" -"@\xc2o\x97_\xe9\x85\xadJG\xed\xe5\x0\xa9\x81\x80\xb7\x18X\xeb\xa0{K~l0oQ\xb9Nvg\xfb" -"(E*\x7f\x8\xb9\xf6Z\x16\xb3\x7\xd9\xb1\xa5\x90\x90\x4S\x18\xbe\x64\xa1\x13L\xd9\x62" -"U\x81\xaf\x37\xa2\xdd?\x8dh\xe6{4\x98\xa8i\xc4\x94\xb6(4Y8M,A\x98\x34#g\xa9\x15\x17" -"d\xc0m\xf1\xe5\xcf_\xce\xeb\xa9\x7f\xbe\xc3\x8cN\x18\xb6zN\x8\x13\x8aW\x80.\x7\xbd" -"B\xd3\xbb\xdf\x1ay\x9b\x42iA2\xea\\\xf9#\x14\x89\xfc\xf0J\x15\"\xbe\x1b\xd6\xb8\xea" -"\xda\xb4\x17,t.`d\x10\x11\xf3\x1b(\xf9\x1b\xe3\xd8\x19\xe4\xc3\x8\xb4\xf4\xaf\xde" -"\xfc~\xb5\xd1\x82\x81\x45\xeb\x1c)\x14Tx\xa0\xcc\x13\xe5V)`\x9c\xdb\xfb\xa2\xdf!" -"\xfc|\x8b\x32\xaa\\\xf9\x33\x9d\x44H\x8dX\xdb\xd6\x98\x7f\x9k\x6\xa9!u\x98~4\x17" -"\xf0\x1e\xd4\x66{\x4JC\x19VY\xab)\x9-~\xca\x93\xadjV\xa8\x39\x83\x1f\x1a\x8d\x11" -"\xe]\x98Z\xac\xd1\xc5\xd1\xe2\xbc\xe0\x2yGA\x8c\x41\x8\xa0\xa4\x88\xfe\x38\xa2\xbf" -"\xcf\\\xa0\r+\xf4\xad\xf3\xb1m\x99\x8c\xefO\xe5yz]\xda\xb0\xae\xbcv\xb9@{\x7\x46" -"\xe9\xb\xef\n\xc1\x85\xa4\x91\xf9\x94\x96\xda\xdeW\x88\n?\xca\xa2\xbdT\xc9Y7]\xe0" -"\xd2 \xa2\x37\xe7\xa2#k?\xd5\x9a\xf8\xe2y{\xb5,\xa0V\xc4\"\xd6'\x91\x1e\x85\xb3u" -"\x18:\xd9\xed\x1f\xdb\xeb\x5\xd7H\xe1\xe8q)?a4\xd3j:\x83`\x1\xcb\x63Y\xfc\xba\xf" -"\xf7\xe9\xf8\x95\xdf\x64\x9f\xe5\x99\x1b\xa0\xf2\x92\xd5\x13\xb3Y\xfe\x34I\xf3V\x86" -"\xddu\x83\xfeK\xc0\xa3\xa3\x8bw\xd3\x83k\xc2\xd6\xc4\xfc\xcdo\xed\x37\xb0\x7\xa5" -"\xb\xad\xb9\x1dg|\xd9\x45\xc3h\xbf\x89xL\xa0\xda\xdb]\xeh\xcOg\x9\xd6-\x2\xddW\x8e" -"^\x19\\\xaf\xb0\xee\xa9Oa\xae\xee\x5\x10\xd8$|\xff\x7\xac\x13%\xa5$\xd6v\x16\x1b" -"\x9b\xfd\xcd\xddVFCk\xcc]\xba\xc1\x84\xdc^\xb9\xae\xaa:\xb5\xa5\xf4\x6\x8b\x93\xdf" -"\x1aJ\xcf\xa1\xba\xc5\x82\x82\xb3\x8a\x92\x3\x46\x6##cS\x8f\xf4\x8e\x7\x93M\x1a\x9f" -"p \xf2\x95\x99\xff\xdd\x37\xd6|9\x8e\n\x86gg\x83\xa9\x1\x94\xb8\x18\xc8}\xdc\x44" -"\xbf\xf8\x19\x66\xe8\x45!\xfe-\x1a\x11\x98M\xed\x9eoH\xcb\xd6\xa3\xfc\x15K\xdf\xac" -"a\x16\x8d\xa2O1\xd5\xce\x10\xb1\xe>\xcey\x11v\x8b\xf9IA\x13|\xef[V\xa2&\xc0\x90K" -"\x9e\x99l\xbfY{\xfcPZ\x8f\x1c\x9b\xc\xac\xdd\xc0q\x12,\x99\x87\xef\x9b\xe5\xcb\xd1" -"2\xbf_{\xa9\xcf(&\x88T\xf3\xf8\xb3\x8e\x9(\xc7S\xdf\xb\x90\x2\x9b\x34\xe0\x9b\xaa" -"U\x9e\xfa\x99\xd5sED%\xbb\xc3q\x14\xdb\xe9&\xac\xd1\xc2\x8e\x98\xc2\xad\xb2\x99\x1f" -"\x86\xd5\xee\x1\nu\xc4\x85\x19\xce\xa7\x1f\xf1\x8b\xd3\xeN\x81\x85\xe9\x8e\x95w\xde" -"\x92\x9\x2 \xa9\xf5\xd8@#\x95^h\xc3t\xa1\x8\xe9_\xae\xc5\xe1\xcfs\xf2\xe2V\x1aT\xe4" -"\x87\xb0\x1cq\xec\x34\x1f\x8fP%\x94)\xa2\x8f\x66W\xc7ow\xb6\x97\xc4\xf4\xb9p\xe0" -";\x8b\xbaS^\xca\x15vz\xc0\xa0\x35\x9b\x8e\x93\x99\x39\xe7?i\xfd\xf+z\xa7h\xfb\xc0" -"\x8b\xdfo\x82\x0\xd6\xac\xfb\"\x32\x80\xc6\x18\xc1\x81O\x11.\xe0.\xf3\x32\xa5(\xb6" -"\x0\x9a\xa9~.2\xb7q\xf9\x9\x15\xe7\xe0\x94\x90qST(\x18~(,\"l\x19#v(\x9a\x94\xa3\xa6" -"\x16\x7\x95%\x1c\xeb\xe0\x1d\x7f%\xa3!n\xa2\xf6\xfcx+/\xc8\x8d\xdc\xa7\x35\xf5\xc2" -"@\xaar\\\xad\xa2W.nT^\xc3\xfb\xb6\xdc\x6\x33\x33\x98\xf1\xcf\x9a\x89R\xad\x42\xf3" -"I\x8e\xac\xf1\xbeT\x94\xdc\xf_=\x1a\x7f@\xa6\xf8Tf\xee\x12Z\xe9\x42\xe3\x99\xde\x39" -"\x9a\xbd:X\xe5\xeb\xba\xda\xea\x91\xd4\xbb\xe5\x16.\xa7\xbd\x1dw60e\\\xa2\xe2\x94" -"am\xf4\x35\xdf\x85\xb1\xa0z\xa2*\xac\x98'\x2+\xe2\x8d\x12\xb6\x8\xc1\x99\x8V~\x15" -"N \xc7\x39\xc2\xdf.\xeb`q`z\x87=\xba\x37\xc8\x1c \\\x13\x41\x19\xf7mY\x8\xb9\xf7" -"\x3\x9\xdb\xaa\x33\xd0\x6\nj\xeew\xcaN\xee$\xa9\x8f\xd6\x3\x44R\xb4\x33\xfc\x32\x8f" -"M\x83m \xfc\x9c\xbfM\x18rS\xecUs\xb7\xc9z?\x8\xa7\xd6T\x9bs\x3t\xf5%\x1c\xa0\xf5" -"a\x96-\xee)\xe1hy!w\xd1\xc3`\x14\x80:\xfe\x98\xf5\xb2\xee\x9b\xa6/\x3\x15k`_\xb0" -"\xb2\xe4\xb5x\x0\xdb\xb9T\x19\x16\x1a\xc6\x65\xcfU\x92\x32\xaf\xb\x33=1\xc6l\x9\xba" -"\xf1\xd2v\xf6\x61\x61\xd8\xaa\xb2\xa1\xae\x5\xab\x98L\xea\x2\xcf]`T\xc0\x16~~\xce" -"%\xaa\x17p\xaf\x8b\x35IX^\x94$]\x9e\xd8\x17~\xe5\xb0\xa8\xfdMC8%\x90w\x13\n\x31\x36" -"\x8ah\xf9L\xe1\xc2\xc8\x9b\xc5+\xfd\xa3\x30\xf8\xa2\xdf\xee\x31\x15\x37\xcd\x8b\x35" -"\x9eSm\x7\x86-0\x90\xac\x8a\x81~Nx\xde@Ab\x86R?\xa5S\xa1\xf1J?\x87&\xce\x87j\xfa" -"\x8e\xbc!`\xcf\x0t\nF.1e\xe7Vwn\x89\xbdn\xcd\x44\x19\xc8\x9c\xabS\xcb\xb3\xb0r0a" -"\xcdt\xec\xce+'\x8e\xc1\x80\xdf\x0oQ\xaan03m\xd2\xe0\x4h\xe2\xca\xa5\x2\xda\x1e\xf2" -"1Y\x96\xc8\x9a\xe6Hb\\I\xcd\xf7\x96\xb2K\x19\x8d\x64\x0i}\xc0\xc5\xd4\x96@&'i\xed" -"\xe6\x11\x9a\xa5\xdb\xc4\xfb\xbbyzUTH\x85.\xc2\x87x7\x1\xb3o\xcf\x90\xabl\xf9\xe7" -"\x1a\x93'\xc9\xb4\xb3\xa1\xf6U\x12\x42\xd7\x87\xb\x10\x1\x31\x88]\xb8\xd0\xb7*\x2" -" \x2k\xa6\x0(\x6\xe4\xf0\x45\xd5\x89\xc4\xe1y\xfai\x80X\x16\x98\xf7\x8dJ?\x8a\xf5" -"\x6l\xfbG\xcd\xef\xa4\xc9\xe5:\xce[\rI\xe5=\x7f\x3\xbc\xbc\xd5\x62u\x9c\xd5\xb4r" -"\x9c \xbf\x45\xa8\xf2/\xce^\x7\xf9)\xf5>V\x9c\x7z\xcb\xc2\xe0\xf5\x15\xa4o\x8c]\xb0" -"\x13\x86\x8b\xcz\xda\x83\x81\x8a\xa5(\xca\x62\xe7\xa0\xbe\xe1mzpbk2\xf7>\x96UC\x95" -"24\xcf\xc8\x9f\x1bZ\x8e\x83\xcf\xdf\xeawAP\x96!\xe0\xe5\xc1\x9d\x61\x11l\xae '\xe9" -"\x97\x8b\x37\x92\xaa\xd7\x88\x85 \xef\x14\xd1\x34\xd8\xbb\xef@g\xae\xccv\xa3\xbM" -"\xcf\xfb'\x12\xbdlU\x83\xf\xb3\x64\x45\xc7!X\xd8N\xa9\xb7)\xf9\xbsc\x95!{\xbc\x86" -"Xx\x98\xd2\x42\xea\x65\xd5\x43w=T\xe6\xa1;I+p\xb2\xda\xd0 I\xb1\xb4\xc3\x11\xb\x9a" -"\xea\x4\xb\xda\xf4\x17Y\xd8X\x12\x35\x93p`v\xd6/L@\xef\x30Wm\x1c\"\xef\xf\xa5\x15" -"\xa0\xf6\xaaz\x80\x91\x42.\x99;Wx\x95\x9a\xb5\x1eu)TT\x8c{G}\xea\x63\x5\x7f~\xb\xef" -"8\x9e\x94\x1b\xcb%\xfb\xf9)\xf4\x90\xc9\x93\xa8\xfe,\x1KY]\x99\xefk\x7\xe7\xe8\xf4" -"\x89\x4\xcc\xb4\x16\xe8q8\x1a\xd3\x6\x36}\xf7\x96\xa4i \xfe\xd2\xc7\x81\xb0S\xaa" -"S\xcb)\xc4%\\\x89?wI\xc4\x46\xafn\xd1\xfc\xbb\xc0\xac\x90\x19\xbe\xa7\xedu\x8cz\xf6" -"\xc5\xf\x63\xa3X\xae.\x88S\x1d\xd7\xae\x95\xc1\x98\x8b\x87\x17\xa8#9>I\xd2\xf\x5" -"\xe\x31\x1cp\x8e\x1c\xef$\x6wW\x1c\x65\xc5\x36\xcf\x1d\xf6[_e\xcc\xbc\xc5\xf4.\x14" -"\xa7\x11$23\x18M}\x99\xec\x3L\x9e\x8d\xf2\xc3$S\xfe\xd3\xae\xa9\xf0\"\xf9\xc9\xf4" -"6\xcb\x62\n>\x1d\xe8\xc9\xa6\xf3Yw\xb1\x37\xdcH\xe1\xa5\x8e|\x97\x17Qd\x7fNS\xe3" -".\xb4r\xa6\x8f\xb7`\xd8J\x94w\\\xd7\xc0\xda\x45i\x8\x8b\x6\x10x\xc9\xd5 !\xd2\xdb" -"\xb2\x82Zf\xd1\x41).L3\x81\x44\x61\x88\xac\x97Pc\xb1:\xad\xe4)\x15Q\rk\xdcm+\xae" -"\xc1\x1c\xbb\x9e\xab.\xca\xae\x98\xe9\x98\x89\x15&gZ\x97\x62\x90.\xd2~3=\xa7\x98" -"\x85^\x16\x44i\n\xb4Z\xff\xca\x84\x82\xa6\xd3\xdf\"\x30\xf0\x16\xact\xa8\x19\x3r" -"\x12\xafo\xf++S}\x84\xff\xc4\x1awc\xac\r\x63\xe\xa1W\xf7lv\xac\xa4\xdc\xbb\xa1\xcf" -"\xa4\xda\x15\x16\xc9\xebV/e\xc3\xdb\xc2\x89\xd2\x15\xb\x81\x41\xc9\xcc=Kn\xd2\x8" -"\xf2\x37\x8f+@\x9f!!R\x8d\x42\xbf'\x18\x80\xfb\x46\x89m:\xc7!C\xdf\x3\x42\xe3\xac" -"=\x94\xc8\xe6\x10\x0lZ\x8a\xae\xf3Z\x1a\xc2\x83t0:f\n\x89@c\x83,\xd5\xd9\xf7\x39" -"\xeb\xbd\x30-\x14\xf2\xab]\x83\xee;\x12~\xd2\xf4\xa2\xf\x91\x14\x84<\xdd\xf1\x93" -"*&\xb6\x99\xa3\x5\xcf\xc\xeeH\x90?\rU\xcf\xe7\x3\xa8\x1f\x0I\x4'\xb8O\xccS\xc9\xc9" -"\xd4\xe1v\xb5\r\xb9\x83\x41\xc8\x1a\x66\x8f\xea\x1b\xed\x8c\x66\x5\xef\xdf`2U\xb5" -"\xa8*j\xdf\xa8\xc0]\xee\x3\xa4\x5\x5\x46x(F\xc3#\xf7'\xd5\x46\xb3\xd5\x1b\x38\xa2" -"\x8\x19\x10\xae\x9d\x8e\xc1\xac\n\xb6\x93\x41;\x1a\xb7\xa3\x9a 0\xf9\xd9S3\xc8\xb1" -"\x6\xde@\xd7'\x1e\x9f\x37?s\x1c\x4\xcb|\x6&\x1aTN\xab\\\x4\xc0R\x7\x90\x66U\xcm\xc8" -"\xaf\xe0<\x88\xfe\x41\xc5\xc8\xd8\xb9\x8f\x18\x7f\xceQ\xab\x8fr\xb\xc9@\xfb[\r\xf8" -"\xd8\xc8\x14\xe6\xe6\x19\x8a\x8f\xf2\x9b\x1e\xfe\xca\xff\x31\x92\xf0\xf1#\xf\xcb" -"\x97\x6\xb\x82\xe4}\xc1\x80\xd7\xdaV\x10\x62\x98\x12\xbc}\xcf\xb9\xc6\x85\x42v\xff" -"t\xb1u\xd6\x9cQY \xfa\xcf\xa0\x2\x18\xca\xcb\x9f[\x9a&\xdc\x3\x42\xb2R\xc\xe2\xe0" -"\xb7T;-\xa2\xa6+\xea,,\x9c\xec\xa0U\xdaT\r[\xa6]\x13\x9a\x3\xa1\x61," -"\xdc\x4\xd4\x44\xa1v\x88\xe6\xa3\xba\xfe\xa5\xb2\x1a<\xc6\x88\xc2\x33\xe5M\xb6(\xba" -"U\xbe\x66\xb8\x82\x8b\x43\xdf\xb8\xd3\xc0J\x1e\x96l\x84\xcIk\xd1\xa8\xb2X\xeb\xe3" -"\x19\x87\x9b]\xbd\x7f\xf3\xfd\x8d\xb5\xf9Ra\x1bp\xef\xea\xed\xd5|\xb6\xf1\xd5\x8a" -"-\xed\xdb\xa0\x33\xf1y\xf9\x9c\xc0\x1d\xcb;rC\xb3\\:\xf6@\xab\xf4\xb5W\xb4\xcd\x94" -"\xfbl\x1d\xff\xb4\xff\x15pWN\xac\xb9\xafM\x10#M#[_\xf7\x1b\x18\xe2K#\xf8\xbf+F\x91" -"%\x15i\xc4{\xa8/\xc4&\x6\xd9\x83\x45\xfe\x9d\xe6\xc0UA\xc0\xdb\x42>\x7\xe5\x5\xc4" -"T\x1a^y\xf6\x14v\x16\x34\xe7\xa0\xc1\x82\xfb\x17\xf1\x84\x65y\xdb\x2\x42\x1c\xca" -"O~\xbc&M\x1\xder:E\xbcI\x84\x1f\xd8[\xf4\xfdQ\x8c-\xc8\x1d\xa5\x33Y\xde,\x2\xd8\xbe" -"\xd0\x1c\x9e\x96\x96o\xa7\x4\xb\x8e/\xf3\xfb\xc1p\xddN\xbc\xdd\n\xfcnh\xc5 \xf7\x15" -"\x14?\xc0\x98\xeb\x8a\xbaT\x9e?oj9}\x87!\xbe\xf6j\xe0,\xe1Q\xc9\x32\xb7\xda\x39\xc0" -"\x83\xd8\xf1k\xe6^'\x3\xe2\x12\x87v\x1as\x86\x84\x8eQ\xb2\x2\xe5\xe7^\xc3\x12\xca" -"\xde\x18[\xd3\x8b\xcf.d\xceJ\xc0z\xa3\x96o\x96\x7f\x94\x1bU\xc4\xb1\xe8>Z\xb\xd1" -"\xc7l\x15\x6\x8e\x0\x8f\x2\x5\x9a:\x7\x8c\xce\x80\x65\x83\xbc\x8bT\x8c=\xe8\x98\xf0\x9f\xe2~n\xfb\x85y." -"x\xe8\x1d\x9c\xe0L\\6\r\xd0(\x9e\xa0\x81.\xecy\xab\xae\xac?\xe7?\xbc=\x7'A\x14\x1a" -"\xec\x9a\xbe\xb2\xbd\xe1\xf6\x85\xa2\xe\x8e\x85\x8a\xab. \xc4\xc3\xa2\x86\xdf\xf5" -"\x6\x1f\x34\x8c\x94\x33\xf2\x13S]C\xe\xb9\xddx\x5\xdb\x99.{\xef\xa8{\x9e)\x90\xa8" -"ow\xbc<\xf6t\xa8\x38\x96\xe6)<\xfa\x0\x90'\xc4\xdd\xa0\xecV\xd3\xf2\xb7\x1c\x38\xba" -"\x12\xb8\xe\xb2+\x11\x82\xa3S\xc3\x98\xf7\x42\x87W|\xfb\xb1\x42\x19\x8a\xdd\x8a\x9a" -"\\\xdb}\xe8\x63\xa3\x94\x2\x80]8~\xec\xad\x3\x7o\xd2\x6^f\xec\x82=\xd3\x31\xdbY\xb8" -"\x8b\x8d\")#FX:\x8a\xbf\x35\xd5\xa1z\xff\xe4*`]r\xf8\x15\x8f\x80\x33\xfc\x13\x9f" -"*\xe\xd3\x99\x1b\xbbHjB\x5\x87v\xc0\x92\x9di\x1b\xd0\x82\x91\xde\x41\xfdH{\x96O0" -"sn\xf9\xfc\xbb\xdfj\xc4\r\xbdgM\x6w\xd9\x7\x5VP\xb8\x9f\xfdr\xcb\x64\xc9\xc5v\xc8" -"*\n?Y|ry\x95X#\xf2\xb8S\x19\xf0\xbb\xe5\x66\xb1\xf3\x41;\xf0i\x1c#c~\xe8\x1a\xb4" -"\xd1\xd0\x1f>*\x10\x1f}\xee\x65S\xbaG\x9b\xc4=vkd\x9b\xda/\x95\xc6\xae\x83\xbe\x1c" -"{\x95\xc8\xe\x86\xb1\xd3\x94\x82\x44}z\x0\xd4\xbf\x10(\xc2\x9a\xde\xf2W\x3\xdd{\xe6" -"\xd7[\xe9\\q*\xca?\xc5\x87\x92\x34\xad\x61\xf8\x86\x36\x9c\xbf\xf0\xda+B\xa1\xf8" -"\xaa\xf4>SLJi\x7fzp\xc6Q\xb2<\xc3\xbT9\xe4\xaf\x1a\xe\x13)v<\x8a\xa4\xbeg\xcf\xca" -"*X\x92\x36T\rNn\xfc\xb5\xb0/CG\xfbJ)<\x8e\x35O\xcaui\xed\xcctH\xc8]\x8a\xb3\rM\xd6" -"\xc5{\xff\xc3\x36\x62O\xba\xd2\x98\x15\x61\xa9\xb1\xbe\xc2\xc1\xdd/!& l\x97\xb3Q" -"\xct\xb9]\xda\xcb\xac\x16 \xbc\xe6\xd6\x81\xea|\x9b\x12\xad\xca\x34?A\x16\x1c\xe4" -"\x1x\x14\xd6\x93p\x8e^\rc\xdf\xedm\xab\xf4gal\xa0\xa5\xe3\x4\xc7\x9a\x8b\xc0\xad" -"\x86\x1c`\x15\xf2\xc1\xd4\xe2\xb4\xe4\xfbn \xee\x42\xc2\xd1\x82\xee\r,}\xf2\xc5\x8a" -"'B\xf0\xdf\x5\xc1<\x1a\xfcYa3${\xd8\x42\xdc\xb6S\xb3\"\xe3\xa9\x7\xe4X\x5SE\xf5*" -"A\xa4S\xe6$\xc6\xca\xed\xf8\x8e\xaa\xda\x98\x45\xf7\xd4\x4\xc8\x18}\x15\x8b,\xb4" -"4\xc4V/\xea\xf\x8b\x1d\x83\xba\xc8\x13\xe5\x8b\x12\x9fO\xb8\x1\xea>\xc1r-#\xe8\x92" -"\x3\x8f\xa9\xfb\xc\x1a\xa9$M\x91Z\xca\xe5H\xb4\xa3\xec\xf8\xc8%\x4\x95\x8;z\xda\x61" -"\x14\x94\x61\xf0%y\xf1\x98\xf0j?+]\x84\x1e\x34\xae\xf7(\xdd\xf4\xeb\xee.\xf0\xdf" -"&<\x5\xe5\xb2\xaf\xc(~D\x96\xcd\x0\x6q\x17>Hd\xbc\xc2u\x11\x81\x89\x95i\xacj\xf9" -"|%\xd7\xd3T\xf4\x1\xde\xf4\xcb\xdf+\xd4\xe0QG\xad\xdevL\xe4\xe6\x65\xf2w\xb8\xed" -"[\xb0m\xf6\x91\xc2Q\x6\xda:\xc2\xf5u\xf4\xa9y\xff\x4\xf1][]\xa7@a\xfe\xc5\xb0\x80" -"\xc5\xe\xdd\x9\x0n\x6\n\xe1\xc6i(\xfe%\x14\xc1\x9a\x90\xb.\x80\x33(\x9\x0\xd2-1Z" -"G\xe4m\x1b\xa2\x2.\x92\xc0\xfe\xcc+X\xb2\x8f\x85P3m\xa1K\x9e\xc1g?\xab\x4\xbbzR-" -"z\"\xe0\x1d\x85\xed\x8f\x1cV\x8\x87|_f\xa7\\v\x91\xb7*\xd4\x42\xbd\x66\xd3\x36\x39" -"\xc;\xa5\x88{\xb4\xcfk\xe8\xa6\x8a\x17\xd9\x31v+p\x1d',m4\xdf\xba\x9c\xda`\x11\xa5" -"\xd3\xfc\xa2M\x9\x9\xf6\x8b\xed\x66)\x8c\xa7o0\x12\xd7\xfe\x83\x3^<\xf5\x8eM,\x2" -"\xee\x80^\x8f$;\xd3\x2\xa0\xee\x32\xe9or\x10\xce$g\x13\xe3\xee\n\x9a\x87\x14K\xa2" -"3\x80\xd6\xd2\xc3\xc2\x1d\x9a@\x84\x12\x87\xae^\xcf>\xc3\x1c\x30\x91\xae\x41'\xb4" -" \xb2\xf7z\xc3U\x1\xb9\xb0-\xe5\xb2\x99\xe0\x2\xcb\xd3{\x91I\xd3\xae\x62\xfe\x94" -"(\xd4\x85\\\x15\xa3\xc0\xfa\x87\x9a\x16\xc7m\x86\x8b\xaf\x4R\x1e\x39\x0\xb8\xf9\xb2" -"Tz(\xef\xd0{\x9c\\\x65\xde\xaf>\xf5\xde\xe9W\xa1\xa7\x33\x86\xc1\x11\xfdX\xesV~\x15" -"\x8e\xb8\x11g\xd5\xf3*[\xcd\x45\x91\xa2\xff\xca\x88z\x84\xddP}\x99\xfc\xc5\xa9NH" -">\x9f*\x1c\xf1x4\xe\xcc\x9a\\\x32\xbat\x12u\xd3\xceRX\xfe\x9b:\xb9\\\xe0-\xa4\x9a" -"\x1\x19\x9c\x62\x35\xb9\xa0\x10\x9\x11%\xf8\xe8\xd7\xbc\xf7\x8e\xd3\x1f\"\xf8\xb0" -"\xc1\xd0\x9eze}q\xeb\x97\x36g\xcb\x33n\x98\x45\xa9\x44q\xb2\x92IM\x9\xa1{\xe0yPB" -"\xa5\xdc=\xba\x96l\x91\xbf\x83\xaf\x46\x32\xc6\x91_\x9c~G\x8eIC\x9aV\xa3\xcf\xf5" -"\x6n\x8e\x38\x3\x14Y\xe9\x1c\xea[\xb7\xc1;\xe8\x7\"\x93\x94zD\x5\xd2\xc2\xc4\xef" -"do\x14\x9b\x61\x41q\xda\x10\xb8\xf8\xa5\xcb\xad\x8a\xb3$\xc8\xda\x19\x18g\x3\x8b" -"\xf6\xa2\x97\x93\x8a<\x98n\xd1\x87\"\x1e\x2\x9e-\xc8.\x91\x19)\xd2\x3\xf2\xf8\x64" -"\x87\xd0\xad\xb8\xce\xc9\xba\xc1O3\xbf\x97\x87\xb1\x18\xfb\x8c\x42\x87,B$^#\xfcg" -"^h\x9d\xc\x1d\x1f\x97\xd9@\xb7\xab\x12\x94\xcc\x34\xa4\xe8\xe3$\xbe\x44\xc4q\xf9" -"]\xcd\xeb\x95\xb9^>\x94~\xe0\x94`\xe3=\xb0\x66\xb8\x9d\xe8\x84\x16\xba\x10\xa8\xa0" -"\xa1\xfcZ\x1b\xae\"H\xf8H;4\xf0\xe\x9ck\x85\xba\xfa\x1c\xb8\x34\x63L\x9\x97\xf1\xae" -"\xc9t8L\xfa\xf2\xe4\x66\x84\x19\xfb\x14\xb3\xf3Y\xa9\x63\x9c\xc0\x98\x81@\x17\x13" -"G\x7f\x1f\xdb\xe3/\x94t;w&\xd3\xca\xe5\xbcib).\xbagU\xe3X\xf0\xedJ\xfb\xb8\xb9\x1c" -"1\x87\xa1!~\x4\x9a\x9e\x32\x9c\xb5\x9aQ\x98`^y\xb\x45\x88Zd\xe3=\x85\xe0\x9c\x88" -"\xad\xeb\xad\xb5\x12\xe\xde\x63Qm\xa8j(\x9e\x93\xf2\x1b\xdb,W\xf\x99\x15\r\x33w\x96" -"\x4\x96}Qp\xb7\xf9\xd2T\xc3mL\xbcY\x14\x1a\xba\x5\xdb\x9f\x32\x65\xc2\x2-\xb5\xf9" -"05t\xf2\xf3,\x94\x62m\x11\xf6\xb6+{\x85\xf3\x91\xe8\x80S\x95\xc7\x0(RA9\xb6\x97\xc0" -"t^1\xce\x16&\xd8\xf3N\x8cg\x19\xf0\x8f\xb0\xb6.\x88`Gc\xce\xb7\x37\x1a\x18M\xb1\xd3" -"\xbd\xe4,\x12\xb2j\"\x95\xe9\x0g46}?\x81\xb6\xc9\xb8x\x90~\xb6_\xa7\x43P\xb1\xa4" -"tN\x92\xfd\xd5K\xdd\x8c\x7f\x84H\xeb\xb1\x84\xbeK\xcf\x1f]mX\x9e\xb9n\xbd\xbb\x3" -"7{\xbb\xc0\x99\x32Nn\x81\x91\xf1\xb5\xff\xfc\xe4i\xf4\x96\xc1\xde\xe5\xd0\xa3\xfd" -"\xa4\x10\x97H\xf2Uc%\xd3\x1a\x1e\xa5\x7f\x8a\xa0r\x8d\x1e\x8b\x86\xa2y\xec\x9c\x2" -"\xe4\x30\x5(\x7\x8?\xdc=\x98\xacX\xa1\xd8R\xd9\xe9\xdf\x35\xaa\xa9nN9\xdb\x16\xab" -"\xb_$L\xee\xa4\x18xqS\x7\xed\x9a\x92\xc1\x41\x80\xed\x8f\x1c\xda-I\xd7\xcd\x38\x34" -"\xa2\x0K6N\xda[r\xde\xfd\xcc\xdc\x1d\x15^X\xbb\x6\xb5!\xd5\x39\xf6\x2Q|\xe8\xb5\x9a" -"\xa5\xca\x83\xd1R\x8d\x8e\xf5\xb4\x33\xf3@\xe3\xb\xc8\x87\xee\xa6\xb0\x88T\xdf\xc3" -"\xd1\x32\xb3V\x98\x9c\x61\x94\x18'(+\xe3?\xdeL\xfe\xf2u\xf6.r\x4\x9d\x10\xab\x37" -"\xbb/(\xee\x17\xed\xff\x43P\x90\xd4\x8f=o_[\xba\xca]d\xc9OS3>o\rm\x93\x1a\xa4\xe5" -"\x1f\x41\xd8\xc\x85\xf9K\xd0R#9T\x80Pf7]\xb0-^\x82\xe\xf3\xf9T\x7fM\x9a\xa4\xdf\x99" -"\xbf\xc3\xee_*\x3\xe2v\xda;\xfbu\x99\xb0.Z\x81\x30\xf4\x33\x95\x45 \xadM\xb9\xc6" -"\xa7\x34\xfc\xdf\xde}\xda\xa7)\x92\xc1\x98\xac\xb4~>\xf8\xbb\x1a\xa7\x9d\xf9\xcb" -"\x13v\x90<\xd8\x97\xc7\xfc\x46\x33\xd0\xe4\x1e\xa4]A\xc5\xee\xf2Z\x7*m\\\xf9\xf2" -"\x91\xc9\x36\xcfL1\xe4]]\xe2\xae\xbe\x84\xe9\xe4t\x1d\xb6\x98T7a\xd5\"x\x15\x9d\x13" -"4\xe5\x8a\x8c\x82\x37\x8d\x0\x87\xdc\xc9\xf0\x33\xe8\xc4\x62\x84\xc5\xdb\xd5.d\xfa" -"\xa4\x37\xce\x8f\xaa\xe9U\x93/\xcd\xb5\xe0\x85\xc1\xcet\xd5\xd8\x98l\xc\xa5\x38\xc8" -"W'\xc6OVDg\x16\x64\xd0\xbd\x1d\xcd\xc2V\xcd\xdd\xf5\x39@\x11\x42^\x5\x43\xb4!\xd0" -"y\xf3t\x1b)\xd7\xd5\xd6:\xecV\x1b\xd8\x63-\xc2\xae\xd5\x17&~\xb0\x64\xff\xcb\xba" -"\xb2Iz\xb9P\\v\xee\xbc\xe\x6\xdf\x31\x34\xd9(\xaa\xb9\x5\xbb\xfd\xf6\x83\x4\x97\x83" -"D8\xb0`=\xbeu2\x92Y\xc7i\x93\xaa\x30\xd1\xab\x32\xb7\x15\xef\xa6\x1\x9djX#\xe1=\x83" -"\xcc\x84\x3\x9aq\xbd\xa6\x9\xb8\x41\xa6\x86q\xb3%\xb2\x1d\x93\xe7yE\x95\xeb\x39@" -"\x3\xf\\\xad\x84\x36\x92\xe9\xa4\x8b\xd9\xe7\x8a\x85\x17\xc2\xd2\xcc\xa0T\xc8\xab" -"{_\x9b\xac\x1a\xe8\x1e\xa6\x64\xb4\x99\xd0\x8c\xf5\xf5\xf0Pm\x98\xd7\xfb\x8f\xa7" -"\x9e\x90\x5\xc\xe7\xe1 bf\xd5t\xd9\xdf\x32-\x2M\x1f\xe0\x1\xad\xf7\x61\xf3!SKH7\xc5" -"\x1e\x36\xcI\xb9\xcc\x86\xd2\xff\xe4\xc4\x12\x9c-4,\xa7T\x1a\xd7K& \x0\x32Z\xe8\xea" -"_\x19\xa7\xda\xee\xff\xce\x8b\xc\xf0\xe7\x43\x44L?\xb0\xb0?\x82\xf9\x91M\xdb\xce" -"\xe8\xed\xba!7\xef;o\x9a\\o\x19\x8\x30L\x7\x64\xc7\x64\rN\xb4y\xee\xee f\x88\n\x1f" -")M\xbc\x38\xc8_\x99\x17\xd2\x32\x8a[\x8b\xc8\xbb\xa4\xec\xa7\x90\xab\xef\n\x95\x33" -"4\xb0\xb4\xac\xc0\xad\xbfL1o\x86!\xbc\rPg{GD4\xd0L2\xf4\x90>\xf6\xe8\xd8Ol\xea\xd3" -"\x1e\xe9\x19\x8a\x31\x1\xc3O\xd1\x80\xb3?dTi\xfcGk2%\xa3SL\xadX\xe8\x9c\x37P\x80" -"\x8f-\xf6\xa3\xb6h\x1c\x63\xbch\xa7\x42=F\x1c:\xa8\xc1\x62\xc6\x93\xb0\xf3\xa4\x43" -"eh\xe\xd2\x38|\xe0\x91\xd0\x63Pw\xf\xf4\xe1\xed\xeQ\xe7\x96\x44\x37 WC\xe9\xb1^\xde" -"\xbbx\xa1@`\x13\xa2TQ\x7ft\xac\xcd}\xd0\x84\x9cK\x1e\x13\xfa\xc4\x18\xe0Y\xdc!\xae" -"\xec;j\x87\xc1\xab\xa0\x88\xd6\xd5\x1a\xbe\xeer\x3Ko\x85\xd0\x64\x1f\x30\xfcR\xc2" -".\x1b\x4\xc0`\x1a\xec\x8d\x34|\x8e\xf6JK5\x88O\xf9\xa9\x65\xbcikm\xbf\xdc{\xfd,\xe0" -"\xb6\x5\x90;B\x8f\x95U\xc3,\r\x18\x94Yl\x80\xc\xf4j|i\xb6\xbc\xb0\r\xf2\xc0\xa1\xc7" -"h\xfc\xf2:\x8d\x8e\xff\xf3\x85\xd9xln8\xb4O3\xd3\x7f_\x16\xdb\xdf\xc9\xee\x13\x6" -"Q\xc\xf7U\xfd\x1e\x8\xfd\xb2\x11\x8e\xe4\xc9\xca\x8b\xf0\x7f\x12\xae\x9d\x82\xfe" -"v\x15\xe9\xe8\r\"\xe8^\xda>O\xd8\xc\xc5\x14\xef:\xee\xc6\x37]\xe2=]\xedS\xc6\\\xcb" -"\xed\x35\xe7\xb9\x8d\xc0\xd7\xa0\xd0\xfe\xf9p`\x81,;v\xdcy[TZbU\xed'\x89\xbd\xd3" -"\x90,+#\x84\x31\x9f\x8a&\x4\xa8\x36\xf2\xe5\xd9;\x8a\x4-\xb6 \x10V\xc6Tv^\x10\xa1" -"4H\x9a\xf\xbd\x61QB\xe5\x31jzF\xaf\xcb\xa9\x1br\xd7\x44\n{\xc\x1e\xca\x62\x94M+\x91" -"T\xa2\xa9O|?A\x86\x95\x1c\xd1\xdd\x97p\xad\xd3Z\x6L\xb1\xa6JE*\xc9\n\xdc\xd3G\xc2" -"\x0&\xe1\x36\x89t\xac\x34\xe2U\x2\xb8n\x8f\x9a\x5\x62\x66\xbcj\xb5\x96tYO\xefu\xbb" -"\x3\xe3\xe3\x89\xddQ6\xd9\xb9\x80p';\\2ik\x0\xa5m\x1e\xbc\xaa\xb5(C\xb9\xb3?\xcf" -"\xed\x37\x64\xd1\xfc`T\xe4\xca\xde&\xe8\r\x96\x10\r\xc\xe9Nf\xf7\x39\xba\xd1\xf7" -"\x1\x65\xa8\xdb{>\x80\xf8\xb1\xc1\xbaX4\xf6\xa2x\xd4px\xd6t\x18-V\xa8HH`\xa7\x4\xee" -"\xd5\x1d\x8c\xb0Il\x8f\xf6\xad\x38\r\xfb\x3\xe4\nQ\xc7J\xfa\x66'\x7fv\xe2\x8e\x63" -"\xb8\x39\xb8\x2Yd\x87pUE\xc9@\xd3\xf4Y\x18\xd8\xd6G\x7\x61\xe1/\xae,\xfa\xe2m\xb2" -"\xcb:\x80W\x8d\x7%\xa5\n\xda(\xc2\xdc\x35O|r\x2\xebkx\x8\xd9\x62\x36\x45\xf5\x31" -"Od\x8a\xaf\xd0\xac\x97\x91\xf9\x61(\x10\xdbL\xc7\xa3\xcc\x34\xf8R\xa6\xa6\x96\x81" -"\xca\x9b\xd6<\xdb\xcd\x9e\xd0\x5\xae\x85s\xab\xa5\x8a\x12\x31\x63;\xe4\xe0Z$3\xbd" -"i\x8e\xfb\xf2\xa6[A\x1e\xef\x14\xb6\xde\xa2\x1d\xa0\xf2\x98\x12\xb\x97\x14\x37*\xce" -"\x81\xbf\xecM\xc6\xda\xcf\x82?\xc5\xd1k\x1a\xd1\x15'\xa7\x1c\x30\xca\xc8:\x14\xd2" -"_\xc0m\x8d\"\x86\x1a\x12\x30\xeb@\xc0\x1c\xda\xa7\x7\x1eM]N(\x7f\xcc\xa3J\x94\xa1" -"\xaf\xab\xd1\x9f\x84\xc2\xd2\xdb\xcd[\xf0\x2\\\x1d\x14\x37\xee\xcb\xf\x96T|:\xb5" -"\xf0\x43\x5|\xf\xe7n\xa0\x88\xc0+\xdc\x8\x97uFgC\"\x1e\x36\x4sw\x95\x9b\xc1W0.\xcf" -"\xb9\xb5\xf1\xf9rR\xdc\xdd\x9\x1\nq\xf3\x7\x9w\xaf\x8f\xcf\x42\x64\xf\xbd;\xea\xb9" -"b\xc2\xad*\xf6~\x91\xec+\x91\x82\x44\xa0\xfc\x9b\x37\x4*\xc3\xdb\xe8Z\xdf\xcf/\xd2" -"C,\x8d\x84\xe3\x16'\xf1^\xf9'\x9+[\x16\x8ex\x6\xaf\xf1\xe7\xf1\x61\x7\xa7\x16Q\xca" -"n;\xac|*\x3\xcf\xf5\xa9\x8e\xb9S\xc8\x19\xfd(3\x9\xe9\x6\x64W\xa4VZ\xbd\x42+\x2\xc7" -"\nT\xe\xd6\x32\xbb\xc4M\xce=g\xbb\"u\xd8\xaa\x11\xb3\x90\xe5\x80\xe8\x9c\xdd\x31" -"NX\xe9\xe9\xc6\xe\x98\xc5\x13Vk\xc6\xa9\xa2N/\xc5\xba\x1e\\\x31H\xee\x12\xb0\x84" -"\xbb\xc5\x1aY\xd2\xa6\x42\x30\xacm\x14\x83\x41\x63T\xc1z\x9a\xfe\x88M\x9\x93\xe3" -"D|\x92n K\xec\xce\xf2\x85\xe2\xc6\xc9H\xaf!\x8a\xa8\x45\x83_\xa5\xe2\x91\xe0\x89" -"<_\xa3\"\x8d\x1c!\x82R\xdfTe\xd7\x33\xc3\xecx\x5\x62\xb3\xbb\x18t\x95\xdd\xb8\x93" -"\x9d\x15\xf6\xc9\r\x6V\xdb=\x8\x1c\xe9\xcdx\xaf.\xea\x94)\x95\xe\x41\x36\x98\x4O" -"w\xc9\xef\x13\xc7\x7f\x19\x8b\xdc\x2\xa8(\xde\x5\xc3\x9b\x7f\xe2?/<&\x99$\n\x90\x64" -"\x1b\xe7/\xc8\xae\x9d\x83[\xe3Y;\xd5\xf7\xc4\xc3\xcboqy`\x3K\xef\xd8\xe9\x9\x31\x1e" -"\xb2\xf7\xe&=`NS\x9\x1f{MC~\xef\x80\x31\xb4\xf9\xcbKF\xd0*\xb0^!\xaf\x93\xa4\\\xbb" -"P^\xee\xbd\x41k\xe6\x41\x7\n\xe1\x81\xb4,7\xaa{\xa9\xa0\xb4\xa8v\xc7\x11\x88RN*W" -"\xe9\xdd\xbe\x1eV\x1e\xa0\x8cVU\xdf\xf9\xc5\x93+\n}\xc7n\xb9\xfepj1ts\x1f>\x18\xad" -"\xba\x33\x8\xa7\x87|\xef\x16v_\xe5\x36\x46\x8d\x99\xbe\x7t\x8b\x8c\x87-\xb8\x39\x88" -"\x1d\xa2V\\{R#z7Rs\x1f\x35\x15?@\x80sT\xec\xa1UI\x80\xe1;7\xfe\x19&\xe\xb8W\x2P\xe4" -"s*\xfb\x80\xbf\x45$7s\x10y\xe8v\x88s\xd2\xe9\xc0\x85\xbb\xb0\x83\x1a\x14\x90\x18" -"\x90\x30\xf2o}<\x13\xad\xe4\xe2\xf6\xee\xaa\x7\xe4\xc4g\xac\x96\x4Hm\xcc\xfaI\xac" -"\xea\x33G\xb3%\xca\xbc\x42\xec\r\xf3\xe3\xa3t\x83\x35|\xb9;\xf\xfe\xe1\xd0#)*\xa1" -"!\xe1{\xc5\xef\xae\x9b\x9b\x95\x2\xf4\xa0\x1fS\xf8\xb7\xb6\xea\xb1n\xa4\xb6\xb1\xc1" -"SXz\xc\xd1<\x90\rK\xde\\\x2~_\xfa\xe7h\x13\x9c\xc9*2xd\xac\x85\x64\xa6\x0\x86\x9a" -"`\x86\x32\xd9.\xd9\x84\xc4*W\xa5\x89\x8a\xe0\x97G\xd3w\xec\x9\xec\xd5\x18:\"\x94" -"\xcd\n\xca\x19\xbe:\xa7\x80\x99\xc2\xcf\x8fJBb`?{\x3\xb0\xc2\x9a\xc8u\xf9\xccv\x99" -"\xf7ZqS\xf5&\x0\\`\xd3\xbb\xc0\xf9\xec\x5\x80\x9d\xddkf\xc3X\xc0\xb1\xfa\xb0\x12" -"bK\x83\x4\xf3,X\xd9r\xd7\x81-R\xa2\xa7Y~\x7f\x19\xeZ}\x3-\xd6\xd5hG\xeb\xf5\xfd\xdc" -"d\x5\x8e\x1c\x9f\xfa\xb5*\x13\x96S4^\x17\xeb\x87;7\xdd\xf0\x61\x8\x19p\xfb\xca\xcb" -"|\x1\xaa\x43\xdb\x93\x66\x8.\x9a\x64\x82\x13\xf4;\xea\x64\x1e\x4\x9akj\xf7\xd4k\x87" -"E}`\x9d\x61\xf9\xbd:\xe1\x81\xae\xe3\x11\x7\x14\xe6\xe3 I3P\x2\x84\x43\xc6\xea\x1c" -"\xb1me\xe7\xc0\xfbU\xd3*\x83O\xb0\xa6\xaav\xd9j\x8a\xdb_\xc~\xcb\xcd\x6\x8a\xba;" -"\xf\xeeu\xf\x30)cn\xf8\x17\x8fKr\xde\x7\x1d\xeb\x39w\xa5\x13\x8axW\xa8\xfaO\x81x" -"\xb0(\xca\x1b\xc3\xee<~}a\xff\r\xd6\x80\xcfR\xd4\xde\xec\x45\xe3\x93\xc9\xc7\xc1" -"\x94\xe8\xb4\x86\x13.{\xf1\x95\x90T\x4\n\x62\x31s\x14%\x84\xbd\xb1O\xd6R\xbe\xe4" -"\xa6\x1e#\x1e\x13J7~\x16\x30\xb7\xc0\xe7\xee{5m?\xee\xc8\x17\xfe\xc4\">\x98\xafO" -"#\xc3 \xdaU\xab\xd7|0\xfbR\xa5#\xa6\xa4\x38kr\x94\x87w+\x91\xbe\x94\x8bz\x9b\xf6" -"\xf4\xc\x9eqfP\xbc\x16R\xde\xf7\xff!i6\xee\xcb\xd4-\x82\x42!n\xc4\xde|\xd3)\xd7\xbb" -"z\xbb\x90\x19\x80\xe\xb8\xb8yG)\xd6\xe1k\xadm3\xb\x7f\x17{\xeb\xbc\x9e\x1\xaaqr\xa8" -"a\x9d\xe^8\xa9\x97h\xbe\xe2\xb9\xbf@\xc0nKWop\x18\xfeU\x0\x19\x95\xfa\x1c\x45U'\xbb" -"\xa9P\xe5j2\xf6\xd4:\xb0\x84\x96v\xfb\x42\x9\x3\x1\xd5\xdd{\x8\xd2\xea\xd9U{\xb5" -"\xab\xa3Xf\xffYq\xaa\xc3s&U\x11\x9a\xf\xc4\xa9\xcd\x66\xca{v(\xe4/\x87\x14\x87\x63" -"\x9f\x82M\x7\x82\x7\xdd\x92t\x9\xf0\x4w\xf\x8e\xeb*MQ\x8d\xf5\xfe\x96\xdb\xbb\x62" -"\xdc\xb6\xb9Y\xd8\xc4\x7\x43\x2\xd6\x34\x9c\xed\xfb\xcf\x94\x8b\xad\xba\x1d\x36@" -"\x10L\x87\x15\x1e\xec\x9c\xb0\xcd\xde\xf9\xb7\xee)\xf4\x44\x7f\xd8\xa6P\xcd\x1\xc3" -"\x94U\x0\x19Y\xfd\xff\x63\x93\xcd\x85mg~\xc8\xa7\xd1x\x2\x1a\x83\xfesy\xa2gB\xfc" -"\xf7\x85\xc8\x94\x0\x8.\x1a\x90\xee\x8b\xb\xd2\xf0Q\x84\xed\xcc\xb5<\x9e\x11n\xc9" -"0\xbf\x19\xd9\xe6\xfej\x1f\xf3{\xbfY\x95\xef\x30\xe9\xd1\xca\x1d\xd6\x61?:\x11\xf0" -"\xc6\x95'\x1c\xeb\xd2J9\x99\x8b\x88\xed\x8d\xce\r.\xbdK\xb3Txu\xbaO\xa0\x93q\x1c" -"[\x1f\x6t\x15\xd8\x90\xfeY\xd5\xa3\xad'G\xea\x32\xfe\xb4\x1c\x61\xf6\x8eH\xd8Kl\xff" -"\xe2\xb8\"\xd9$\xe6{\x10\xf1yzF\x86\xb2\x82_\xfe\xee\xb7\xdb\xb8]~Dd\x88s\xd6WO\x16" -"\xc9J\x8e\x88\xb3\x2\xd0n\x12+\xf8g\xaa\xb\x45\x8d\x8e\xf4\x82\x41\xa7\xcb\xc3\x11" -"7{y\xdfU\xe6#\x9a,\xe7\xa9\xe7\x87\xc>\xec\xc6\xc3\xec\xf5\xcf+\x9c\xa9'\xfc&\xad" -"\xc1\xce\xc5\xd5\x85\x84\xc5\x0\x9c\xab\xc2\x14\xa3\x89\x16\xee\xa2\x11p\x10\xdf" -"\xc2\xb9\xe1\xef}o\xf0\x0U\x85l\xc1\x1\xef\xe2Mh\x1ew\xb4U\xa2}\xaa\xe1\x43*\x12" -"\xd1sv\x92R8\xb0>\x88\xe5\xd1\xf0\xaa\x19\xff\xe6\xa2MY6\xaa\xa0\xce\xb6\xdf\xfe" -"po8\x1ag\x8e\x36qx\r6\xf4\x66\xc4\xfa\x80\x87\xa3\xf4\x8d\xde\xe3\x9a\x65\xd2\xbb" -"L\xf\xa7\x80m\xac\x99\x1\x99\x83\xf7z\xcb'\\_\xf1z1$\x8c\xc7X\xc4\x42\x1b\x13\x8d" -",<\x97`N\xd3\x1\xad?\xa9\xe2\xb8\xa3\x31\xf6:\xf2VO:\xcc\xd5\xcd\xfcM;\xc5\x89\xe6" -"\xc7\xbc~\xfc=\x8\xc9\x97\xfa\x9e\xf7[<\x1a\x36\xc9\x99o\xf5\x46%\xd0Sc>\xa3\xe5" -"\xc2\x80\xa8V\xdf\xe7\xa0\x84\x12g/\x6\x30\xa6\"\x15\x86l\xacw\x8fx>\xd6\xc2 {\x1a" -"B\x95wC\xe7\xa3k\xf7\x10\xd4\xa3\xe5\x6>S\xd9$\xe9\xb9V\x82h\xfc\x30)\x13\x10\xa5" -"\xf5[\xc7r\r6\xf2\xa2)I\xedo\xa9\xfc\xdc;'\x5\xa3w\x8e\xfbz6\xe4\x12%\x9e`\xbP\xad" -"\x95\x9a\xc1}V`\x8dm\xfb\xd6\xb9ZuM\x7f\xd5\xdb\xc8\xc6\xf6\xc7\xdb\xc7j\x1c\xf2" -"\x9a\xba\xba\xff/U%\x14\xc3\xb4\x46\x9c\xd9W\x9a\x46\x99=\x1b>\xca\xd5?e\xc8}P\xd5" -"\xcf\x33I\x95n\x83\x39\xe6\xdb\x3\x80\xa0\xd9\xc1\xf7\x1fZ\x15\x1aG\xb\x7\xae\x87" -"\x81s.\xa4\x88]1)\x18\xa7M\x84\\\xd1\x8f\xab\xec\xf6%>\xfe\xe2\xec\xc1\xa3+TE\xed" -"w\xfb/\x98\x8fgF\xfb\xeb%\xbb\xbe\xd1\x63\xea\x44\xe5\xcd\x4\xa3\xc7\xd1TL\xf4\x18" -"\r\xbf\x44\x8j>_S\xa3\xacq\xd6\x2\xc0W\xe9!\x1d%\xc7-\xf3thsN\xa3`\x1b|F\xc4\xbf" -"\x2\xf0r\xeb\xdc{\x91\xb\xbb\xab\xa8\xf0T\xc7g\x18\xd2|U!\x16\xda\xd8\xd2`\x6\x35" -"\xba=\x6\xd3mQ\xf9\x14\xd0\xce\x9a\xe6\xffk\x99o\xf3\xbe\xee;\x5^\xf0\x44\x33\xa2" -"\xeaV'^\xa8\x37\x30\x1e\x9f\xed<\xf0\xf6\xfb\xfb\xd7\xf9\x1bW\xf8^G\x8b\xcf\xe2\x66" -"F\x89\xbd\x1dVG\xa8\x0\xda\x91\x9ep\x7\xe5\x1e\x18\x35\xd9\xe\xd1\xd6\x12G\xb1\xcf" -"s$R:\xa3\x3\xc8\xf4\x31\xdd*\xb4t\xcf%\xa4\xca\x90\x8fV\xd9\xf7\xedu\x90\x91\x6." -"q\xfa\x43\xa7\x8e\xe8|%\x91+E|\xc4qL\xa5U\xb:\xf9\xf3\xb9\x64\xd4,\xc8\xfe\x83\xc4" -"O\x18\xad\x5[Kof\xcc\xa3\x95=C\x4\x13P\xed,!\xf9\x1f#FX\x11\xfcq\x1c\xe0x\xd4\x13" -"\x6\xec\xc7z\\<\x97\x33\xc6\xd4\x11\x42/\x2\xa1\xcd\x89\xf6\x8d\x91\x33\x1d\xadv" -"q\x1c\xdfR\xd9\xb6-D\x2\xf1\xa1\xe0\xf\x9c\xa3@w\x14\x30\xefT\xa5R\xed mi\xca\x42" -"\xb7\x9eR\xfaW0\xe4x6\x9e/\xc8\x8\xe5\x99#\xd8\xfd\xa9\xf6\x1aYX!\xb\xfe\xd7\xd6" -"%yr\xe7R\x9c\x8f\x15\xc4\x1/\xc2\x8f-\xd6\xb4\x1e\x82\xee\xc7\xd8\x5\x8a\x83\x91" -"h\x19`\xa4T-D\x1c\xb3\xaa\xd0\xf2\x42\xa8\",\xe\x1f\xd8G\xb1\xf2\x8b\x36V\xbb\xc2" -"~\x84\x4\xb4{\xe4\xc2\xad\xce\xc6\x30\x6\xdd\xba\xe4\xa2\xc5\xb5\xd4\x1d^\x3\xe\xfd" -"\x88\xcc%(,\x4\x7f\xc1}W\xa7\x8;\x95\xec\xa7~\x9b\xc8W*Gj\x1fY\xb\x80[4Q&M\xd2\xcd" -"S\x83\xa6\x92\xffH\xc1\x42\x14\xfa\x9\x64)m\x9c\xb1\x16\xee\xaa\xe9\xdf\xca\x13\xb8" -"\x5\xf2\xbb\xe2\xc5\x14\xd5\x34\x80_\x82\xc1\x91>\x85\xb9V\xa7g\x15\x9d\x85\x98s" -"`\x1d\x9)\xcd:\x4\xbaq\xe2\x6\xf|\x16x\xe8\xa9\xae\x44\x9e\x93[\x87\xbb\xb8\xceL" -"\x1\xd7~\r\x15\xc3\xaa\x7}\x98\x19\xac\x95\x41\xc4==\x9d\xe2|k\xb8\x65\xf2l\xd0\xa5" -"\xdf\x8e\x87\xc9/f\xd8\xbc\xbd\xa9;hm\xf8\x18\x14\xbe\xcb'\x1f\x44?R\xfc.h\xef\xab" -"P\xa6\x84\x88/Z\xfa\xe7J\x1-+\nC\x8\x31.\xbcj\x9c\x99\x61\x64/S\x95\xe\x90\xcd\xa1" -"\x2V)\xc5p\xebQ\x19\x80\xb3\\V&\xc1\xaf\xc3@\xb9\x9f\xed@c\x97\xed\xff\xee\xde\x32" -"\xf7\xab\xec\x18$\x97\x10\xc2\xd8\xe3\xe1\x9a\xa0\xd7Vc\xaf\\\x17\x37\xc8\xf3^\x85" -"\xd8\xba\x7f\xdf\x2\xa6Mj\x5\x1f\xf8\x64]\x91\xda\xb1\xa7\x2\xc9V\xb5(\xe0\xd6\xd9" -",\x89\xbcU\x81\xeek\xb3ug#\n\xe0\xd7X1\x7f\x66?\xb4w}F\x1e\x98\xa1\x97\x33\xa1\xd3" -"\xc8N\xc1\xc9\xc7\xfe\xd0<\xc0k\xef\xb\x8a\x6\x8d\xf4\x45\x16\xd0\xa6~\xd1\x97\xc8" -"$\x7f\x8f\xa1y\xd2\x1d\xd1\x41\x34\x9c\x64\x7\xed\x42\xff\x1f\x33\x31\xbbT\xa3\x11" -"\xb5\x9c\x93\x30\x63\x9\xdc)d\xa3Q*\xc0\x1e\xd1\x65\x98\x9aKt\x10%\xc3\xc2\x4\xe7" -"\xb1\x35\xa1\x88\x42\xe2\xeb\xb4\xf6L\xf6\x63\xc8\xe3\x17v*\xbe\x99\xb8\x90\xeb\xc3" -"\x1a\x1e\x86\x1c\xed\xef\xb4\x94\x1a\xcb\x64\x42\x36\xbf\x37;\x11=K7]\xdaV>)\xd3" -"7\x3J\xfd\x2\x32\xf0\xb4\xfc\x80Q0$\xc\xb6\x1fV\xf6V\xbe\xb2\x37\xde\xcd\x9d\xb5" -"\xaa\xc7\x43\x1\xf1\x31V'P\xb5@\xccKz\xa6\x1\x45\x45\xcb\x85\x38rU\xe\xa0\x42\xca" -"\x81\xf5\xc\xfa%\x1a\x8a\xbcw\x89\x81\x5\xc6\xef\x10\xc\x84\x9_\xaf\xd2\x1eQHw/Y" -"\xb5!\x7f\x9a\xdf<_\xdc\xa1\x8b\xda\x91\xf6/\xac/.\x1f)\xef\xd2Zx\x18X\xc3]\xe\x9f" -"\x18\x9b\x87}\x5\xd8\xa6\x37\x63\xce\xc\x80\x39\xca\x8\xb4\xc7?'\xa6hD/]\rlV\x7f" -"\x9d[\x15R\xa1\\\x45\xeQ\x88\xf7\xe\x33\xbd\xde\xf0\xd2\x0 \x8\x11\xc7\x81>\xaf\xb9" -"\xad\xfd\x82\xf5\xcf\x85\xf8<\xc2\xbe\xf6\xcb\x1\x97\xa1\xe7\xdd\xa4\xbc\xfa.\x92" -"a\xa3%\x9f,\x14\xf2nf\xb\x17K1\xe4\xae\x8f\x42u=u*\x8f\xdd\x0\xcd\xeb:>\x88\x88$" -"w8\xa6\xf7\x7f\x8a.\xd4,\xa1\x9b\xfeg\xf4\x88\xd8\x93\xc7\x32\xf2\x19\xac\x1c.\xed" -"D\xe5\xb4\xe3\xce^a?\xcb\x8ex\x96^\x9c\xd3\xc5\x38&G\x11\xbd\x8f\xc3\x9d[\xad\xb6" -"\xdf~\x1\x19\x9e\x9e\x38\x37\xdc\x31hHv@\"\xb8\\\x36\x41\x1b\xab=r|UI\x88\x83p/^" -"k)y8S-\xb\x0\xc8\x9co\x11{$\xde\x43\xee>\xa0]\xb5\x90l\xc}i3N\x0\x1a\xa2\xe7Y\xe3" -"J\xa7\xbb\xab\xde\x81\xfa\xd7|01\xb5\xb9\x62\xb2:\xc6\x9d\xf5=\xd7\xc2\xc3\x2?\x84" -"\x1c\x17\x2{\xb6\xed\xe6\x8d\xb4\xaf\x1d\xd1\xc2\x38\xe1\xc8_W\xfa\x15\xa7\x89\xbe" -">$\xea.\xbf\xdfl\x13\x65\x90Gq\x92\x8\x85l\x4\x45\xc4-\xb3\xc0]\xa7_\x83\x14\xd4" -"(\x7\x2+#\x94\xc4\x90\xa3\xa0\xb2\x46\x43\xcmp\xed\x9e\x61\x2\x90[\xd7Y~\x9c\x86" -"I2F;\xbf\xc3\x38)\xa7\x18t\x1dK\xf6\xde\x8c\xf9\x39\x3\x63\x9c 4:_\xca\xf8 Zf\xd9" -"Y\xbe\x1f\x39:\x1b\x90\xc2\xea\xef?\xf2\xfg\xeb\xe3\x13\x9b\xeb\\\"\xa8 ^\x9e\xb6" -"8\xfd\xe2<7\xd8Y\x1aJf\xeb*l\x85|Z\x1e\xf9\xf\x6\xfbyGa\x93S/d\xadZ\xee\x17U\x1d" -"_4\xbb\xf7^\x18\xd2G3?\xf6\xf0\xb5\xd0\xcc\r\x10G\x92\xd2\xa6I\xe6-\xf9\x13\xb1\xc2" -"\x1c\xd6\x90\x9c\xd9\x3:E\x11\x87\xa0\xdb~<\x97\x19,\xe6]\x6ZU\x8d\xe7nM\xbc\x98" -"}\x92\xccI*\xb7\x91\xf0\xab\x65\x32\xc7\xf1\x45\xf9\x30\x66\xc2g\x15\xa1[M\x6\xed" -"uo\x17\xf6sS40b\xea\x9(\xd0\x8d,\x11\xf7i\xc3\x88\x30-\x0\x6\x43\x1b\xbf\x8a&\xfe" -"\xd4\x9d\xe9\x6\x1b(\xbf\xb0@\xf7\xf2\xcq\x82`\n\xd8\x46\x0\x15\xe6\x96U\xc0\\\xfd" -"j\xf7\x5t\x8b\xef\x83NM\xfc\xe6\xf8\x8e\x9a\xc4\xa6r\xbd\x63\xc7\xeQ]\x0\x32 \xb0" -"z0\xe0\xeS\x3\x82:/\xdf\x86\xaa\x30\xb8\xc1\xf7\xe1U\x88\xf3\xac\xc1\xf5\x2X\x94" -"\x1d\xe4\xcfi\x8b\x42\xe8<7\xf8(\xd4\xd7\xc4\xf0Z\xeb\xf4\x1e\x8d\xb6\xf7=\x19\x5" -"v\x8c\xc4\x8e\xd0\xcaY\x4\x9b\xd1\xfb\xe4m\xa6\x87P\x9R(\x3\xde\x13\x96\xec\r\xf8" -"\xdeV\x1e\x1f=\xb2\xf3`\x1d\xa2\xf9\rG\x19Q\xb3\x92\x44v.Kf\xfe\xd7\xd4q=\xfe\x41" -"\xa0\x30\xba\xed?\xd7\x85\xb8V\xfe\xa6\xb1\xb5\xab\x85\xf5V\x94\xb8\x8bO\xd7\x31" -"\xce\xa4\x35\x45\x39\x8b\x9e\xae\x1du\x8c\x35.\x87\xf5\x32\xb1t\xfbu\xa1\xae\x1e" -"\\\xa5\xd5\xf9\x33L\xc4pM1c\xf3+\xcc\xff\xb0\xf5\xe\x4\xcb\xa9\xa2\x91\x12:'o4\x83" -"\xab\x90l\xab\xc9\xe4=\xe1\xf6.\xec\x4\xfa\xb3\xde@\x98\x83\x64\x9f\xa1\xba\x35`" -"\xc6]\xda\xf0\x84Z\x1dZ\xe9\x63\x37\xad\x96\xbd\x64m\x8c\xfa\xe4\xf9\xd4\xb7\xb8" -"7\x6nb\x16\xf9J\xf8\x14i\xca\xf8\xc2,\xac+\xdd{\xd9\xb5\xc9L\xc4q\xeb\xca+\xa9\x90" -"\xfa\xd7\xf2~\x3\xb0\x9f\xbe\x86\xfb\xe3\xcf\xab\xf4kZ\xcdY\xdf\xb4\x36\x16\x8fK" -"N-\xca\x9e\xf9W\xa6~\xc9\x86\x43\x8a\xcd~\n\xa1\xc\xe6j\xbd\x32\xc9\x88i)\x9d\xba" -"E!\xdf\xe9\n\x8aw\xd4\x8d\r\x8e\x43iV\xc3\xc8\xba?s\xb4r_uw\xb7\xbd$\xe7\x8bn3L\xb8" -";@V\xc1\x99\x17\xd5\x45\r`r~\xa7\x85\x9e\xfejIn|w\x17:\xc`\x96\xci\x9dK{\x99\xe5" -"%J\x83\xdb\x0\xc3\xb8\xc2\x8\x14\x9b\x80\x0\xcf\x30\xbd\x45\xeb}\xf7\xc8\x31\xfd" -":\xd2\x35^\xef\xdc\xdd{\xbb\x62\x0T\xa3Uv:C\xee\xfa\x17\xe0}\xc6\x6\x9dV\x7\xc0\xe5" -"\xa0RY\x86\xd5J\xe9\xbel\xb3y\xcd\x84\x11\x14sJQ\x9O\x9b\x45\xbaj\xa6z{Z\x97\xb7" -"\xbfx\"lj58\x1bPE\x97\x39\xf3\x4\xb7\x33v\x1\xc4Z\x10h\xb0i\x5:\xaal=\x98\x42\x2" -"\x17\xa5\x32\x63\x65\x7\xcd\xc7\x17\x1d\xbb\xf0O\x18\x32P0%\xa8M\x10\xcf^\xe6n\xc1" -"\x87\xec\xa1\xcc\xe4R\x98\x8d\x63\x1f\xf!&np\x7f\x8\x90\x10\x16\x16]h\\Evg\r\xc2" -"\x1a\xf\x8\x16u\xafw/\xdd\x46\xb1#\xf8#C\xae[e\xae\x45\x18\x9f\xb9\xc5$d\x90P\xb3" -"V\x84\x89RJ\xd8\x34\xd4UD\xb&K\xbf\xb9\x8f\xf1\x83Tt\xcd\xd9\x33\xb3\xcf\xff\x87" -"\xd8\xcb\xb2\xb0I\xb0R\x9f\xc0\x98\xabj\xd5\xd1\xed\xad\xff!\x87u\xdb\xcd\xe8\xb8" -"\xaf\xb=\xc2\xb\x64\xf9?\xf3i\x92\x8c@\xb8\x62\xad\x44\xef\x9a\x42'\xf3\xf1\x38?" -"\x9d*\xe6\xeaU\xcd\xb0\xa2NP\xaf\xf0\xf2\xd0\xcbv\xa6\xfcYX\x0\x38\x80\xd0j\xc7\xe5" -"\xe7\x97\xf9\xd1\xfd\x99M\xfe\x84\x62\x1a\xfb\x7\xa5\x9d\xc1\x1c\xc9\x1b\x95\xb5" -"\xd3\xf7\x9f.P\xba\xdc\x86&wJ\x1d\xdbL\xa3\xe8)\xe5, LK\xcf\x99\xdd\x85\xb8\xb5\xed" -"\xea\xd2P\x12\x14\xb9y\xba\x35y\xbe\xb0QEr\x9e\xf9\xd7\x86\x9f\xc4\xb3\xd8\xb1) " -"\xd5\x12\x9f\xa2\x8a\x43T)n\xd7\xb1\xe4\xcf\x1e\xf3\xae\x94zY\xfc\x1f\xdb\xb5\x37" -"54\x9f\x85\x66\xd0\x1f\x82\xe7\x9d\xfa\xf\x90\x98?l\xbf\xe2\x44\xb1\xa9\xc0\x83\xd0" -"\xde\xd2\x42\x1e\xcc\x1d\xe0\xec\xc3\xc5\x37\xb0z4\xa7\xf1\xa5)\x1d\xe9\xbe\xbb\xea" -"B\xe2\xf6\x82\x0\x8bp\x88\x12\x9e\x46<\xc5\xec\xb5\xbb\xea\x8d[\x1d\xe8r \x94\x46" -"\x90r\xb\xf9j\xd6#\r\xc7\x8\x43\xa1\xbf\x15\xe\x37\x35&\xcfU\x9\xda\xf3\xea|=z4\n" -"\xf5\xd4)\xdc\x18\xfd\xb3N\x8c\x12\xe4KCM/\xe6\x63<~Q\xd0\x38\xf8\xe5\x65ZS`\xb8" -"[\x9d\x38\xc\x9d\x8d\x42Wj\x9c\x16\x94\xa6`h\xce\x66K\xcc^\x9e\xc4\x8f\xb5\x7\xa3" -"\x11z\xf1\xc2\xa1\x61\x9b\r\xd8 D\xb3\xc4\xe8Lou\xe4\x7\x9\xdc\x14JP\x8a\x41\x1c" -"-\x9f\xd1\xc4UJ`\x89+\xb9\x0\x13\xab\xb1\x61\x89\xe4\x8c\xf1\xd3\xc9\x45\xc8\xb5" -"\xcaKln\xe7@3\xd6\xb8\x9d\xa0\xe2,\xf2k\xa9H\xa8\xc2`\x92\x9[\xd4\xa0\xf\x66\xe1" -"\xcc\xd0\"\x41\x92o\xe2\xae\xcd\x14\x65\x89\xdb\xc3\x17\xa5\xa7ytE\x9axxFz\xe9_<" -"\xaa\x46;\xac\x4\x33\xf6:W\x8b\x4\x62\xa1(\x18\xa1\x4\xc5zO\xb2\xc2\xcaN\x89\xf6" -"\xb4{\x87+\xfax\x5\xa5`\xae\xab\x17\x85\xf3\xe\x83\xa4\xabrQ9X\x10 \xc8\x10\x6\xc7" -"\n\xe4\xd0\xfa\x11}\x8M\xa7\xe7\xb6\x65\xac|\xd4\xbe\x94\x9b\x37\x1\xdd\x8b\x38s" -"\x10\xa8J*|a<\xb4M,\x84\x18i\x8bS\xcc_\xe9\x1b\xd6z\x19\x33\x37\x9c\x99\x9kS\x89" -"\xb9\x8d\xda$LN\xb\xb7v\xfe\x61'\x97\x8a\xba\x66R\xbb\xdb\xc6\xb4\xc8\xc4\x81\xeb" -"\x8f\xdf\xb9\xd8\x32\xa9pX\x6\x86\xbc\xb7\xe9z\x1f>\x9e\x98\xb0G\xea\xce\xc3{\xc8" -"\x10xQr\x1f\xf9\xa8?\x9e/\x9e\x62\x31\xe2l\x98loJ\xcdwf\xa6\xe3\xab \xfe\xe2ihkY" -"\xdaiCO\x1bG\xcc\xbe\xcb\xad\xab\x81p\x6\x92\xc5n\x8b\xcc\x5#6\xc0Q\x0!\xbZ/~j\xfa" -",\x8d\xc4\xb6\x85\x12\x90\x16\x42`\x2Ww\xa4\x93\xf5\xdez\xe5M>\xd7k\xcc\xb0\x8@\x3" -"\xeb\xb5\x45\x64p\xb9V\xca\xe5\xb4\x99\xaeXk\xcf*\x7\x80Z\xb9\xdew6\x1a\xf5\xfb\x44" -"\x8f\xb8\xbb\xd7\xd7\x1c\xf1\xb0H0\xbe\x43\x82w\rA\xa9\x9e^\x9\x8z\x89\x64$/\x91" -"\xbf\xae_\xf4\x39\xefS\x19L]9\x80\x1a\xf0!\x9bi\xe2\x66P\x10\xd9(/\xc6\x89\x8a\x8f" -"\\\xb1\x88\xee\x9f(\xf\xc6\xba\x62\x66\xe7@\xc5qO\x81\x36\x87\xdfT\xedz\xe\xd2VX" -"\xef\x9d\xaf\xec\xa9X:\xc9\xde\xff\x89\xf7\xc3\x8a\xb4P\xb5\xe\xcf\x17N\xaa\x4P\xf1" -"\xa4\xc6m\r\xd8\x1b\x8f\x1b}\xd7\xd5(\xed\xca\xa2\x8c\xdb\x10\xbeQ\xc5,a\x9f\xad" -"\xef\xf3\xf7\x9d\x9fI\xfbX^\xb5\x18\x2P\xda\x39\r\xce\xfa\x8f\x16\xe2\x84\xea\xe4" -"\xc9\xd9\xa2\x36\xb2\xc0\xbb\x33n$P\xbdwz\xe7\x11\x5\xad\x93\x92>\xb0#\xbd\x42\x2" -"$\xa3\xa1n\xfe\x6\x64\x33*\x9f]\x4|\xaf\xdd\x8\x82\x1rB64\x1b\x14\xd1\x8a(\x8b\xe5" -"\xb2\x41\xa8\xa4=i>\xf5\x16`\x6\x44\x8d\xbaz\xa5\xb8\x99\xdcvW\xa2\xf8\x63<,A\xcc" -"\xa9\xf5\x63\x99\x98\xc9\xb0\xb5\xc6\xd7\xb2w\xf9\x81Oi\xa0\xb8\xf7\xbfgK\xb2\xb3" -"\x12p\x93\x37\xe\x94\x9b\xe7\x1a\xfe\x30\xd1P\x1b\xf7}6%\x1c\x9\xb4\n ,\x8dk_\x19" -"\x91\xdb\xfb\xe7\x63\xe0`\xdd\xda\xbd\xf6\xa5w\xc2\xd6\x88\xab\xffx\xd8\x63\x34\xc0" -"\xec\xc0mm\xb6i\xc5H\xf3(\xfVP\x85\xaaL\xfa\x9^8g\xc6\xfd\xbcm\x4\xfa\x93\xbby]\xff" -"J\x16\x35t\xeer\xf2\xff\xd8\xfd\xc5\xe\xb\x10\xb3q\x8b\x17\xb1i$\xcf}\x8d\x32\xe1" -"u\x13\x1c\x8c\xc4\x87\xf7z\xe\x8c\x9c\x7f\x9dZ\xf3\x97\xb\x63s\xcf\xadZ^X\xd4\xa6" -"\x92\xa4;\xba\xd6T\xbc\x61t\x9d\x98\x19|\xfb\xba\x93\x44\x64\xbcx\xa7\xfe\xe6/\x8c" -"5c\x4\x87\x41#z\xdbw5\x9#\x87\xc9\xaest\x4\x94\xedy\xf5\x0\xc8tsvmLf5}|x\xe1\xcc" -"\xc5\xb1\xdd\x3\x19\xaa\x66\xc7\xb9\xe.\\\x1c$\x88 \x86\x1e\xd5\x37\xd7\x90\x95:" -"\x9c\xb\xb3)\x14\xb0\x19\"\xf1\xceuu\xc4g\xb3xp\xcb\x66\x62(\xe4\x2\xf\x98\xc8:k" -"\x94N\xa0\xd0/IX\x1fhL5Gf1-z\xf3\x39\xd4\xf8\xa7Y\xed\xc\xfc\x91Vs\x7f m\xacp\xab" -"CUOl\x11z\xae\x98\xe4\xc4\xc8g{\xe2\x87Q\x4\x8e\x86\x39\xc4SN\xab\x38;u\x94|Y\xf6" -"\xc6\x1a\xad\x10\x10/*\x9d\x7\xb7\xf8\xfa@\xcf\x8c\x6g\x8f\xb8\xc4J!3\x91\xcdv\xda" -"\xf8-\xb6\x1b#c\xd5\x16\n\xe3\x45\xb2\xf5\xdb\xd0\xca\x96i:\xd1\xd6\x65\xf2\x97\xef" -"\x96%\xe5\x1dX\xad\xea\x39\x1\xa0\xc2\x64m?%\x0\x14#(18\x10\xbcx\x1c\xf1\xd1\xdc" -"t\xc5\x1e\xf2\xeaWm&\xaa)\x89\x82\xda\xbfSq\xe1{\xe8Ue{\xa1Z\x19\x7\x46\xe5\x86\xb0" -"Lz\x1e`\xdf\x89m\xd8\xdcw\xb6\xcd\x1d\xc2\xbd\xa2\"[\xab\x8dT\xb5>\xa4\xb0\x1c\x13" -"{!\xb\x8a\xc0/\xfaMZ[\x1d\x1f\x95\xba.\xe0$\xee\x17r\x80\xc2\x5\x0oS\xbd\x35I\\\x9b" -"\xb5\x14\x64\x9e\x1bH\xed\xcb>'\xc3\xae\x4\xf4\xef\x8b\x81/\x13\x63{\xe6N\x13Ut\x13" -"?\xc2\xc4%\xdd\xeb\x38&\x10!\xdd\xbc\xde\x93r\x15\x9fMc\x19\xc3\x1a\xda\xd4\xdc\xbc" -"Y(\xaeh@:\xc7\xd2\xeb\xfd\xde|\xbf\xdf\x90's\xe9\x9f\x89Z\xe1T-\xf9\xba\xe5\x9a\xea" -"x\xeb\xe1\xaa\x43\xfc\xde\x9f\xf2)e\x9e\x9d\xbe\xaf\xabq\x14o\x12\xffz\x17\x92\x42" -"\xa3\x1bi\xb4\xd8.\xc7\x63\xa9yn\x96u:\xa8\xb9\xd4\xf\x63\x4\x31\x96\xba\xa2W\x4" -"n\x13_\xb2\xff\xaf\xfd\xb6\r\x1\r\xe4;\xb2 h\xf6\xaf\xe4\xc3\xbb\xef\x8bm\x13\x44" -",\x84T\xc0\xd6[\xe9:S\x11\xdc\xfe\xf6\x7$\x12\x15\x86;\xe2\x2\x8a\xf6\xec\xb3V\x17" -"K\xfd\xe7\x32J<\x9d\x80\xc9q\x17\xcd\xb1\x14\xd1\xed\xfb\x8a\x38[7\x89\xe7\xcf\xb7" -"AP\x95\xb6\xda$i\xfe\xedS\xbf\xc5T\x12\xa2\xef\x7\x0o\xe1\x1e\xff\xf0\xde\xbe\x15" -"f\x6\x82@\xfe\x1e\x66\xbc.\xa7\x38\xe7\xb7/\xfa\x8\xd9\x63}A\x94\xccK]\xef\x32\x8e" -"\x90\x65\xb5|3\xdbh\x87\xfc(\x16\"\x3\"\xc\xd4i\x1b\x8e\x8c\xdc&\x86\x9cI\xef\x34" -"\x1aq\xb4\x1d\xd8Q\xe0\xa7\xe7%V\xbb\xff\xcc\xab\xc4\x96\x1f`\xbc\xe2\x15\x9e\xcb" -"\xf1.\xc4\xe3\xa3QB\xbb\xb2\x9clmX\xb2\xc6\x44\xda\xb0&\x16*\xfe\xd9\xe2\xbc\x93" -",c\x9c\x9a\xdc|\xbf\xb3\xdd\x15\x1f*8\x97\x46\x7v\xa4\x64\x1c\xd4\xcaP5\xfc\x45\xa0" -"m\xf4WK\x90\x1f\xf5H=\x8r\xcb\xb7\xbb\xceM\x19\x46\x2\xa2}8{@\xb3\xbj\xbcr\xc7\x9d" -"'\xeb\x36\x9b\xae\xa9\x99\xf2 @QJ#\xb3\xfc\xfe\x86\x39\x92\xef\xbb\xf\x88(\x9d\x66" -"\xed\xd3\x9\x65\xd9',l\xf0\xd1}\x1b\x1b\x16\xc\xbb>\xcd\x1d\xab\x7f\xc8\xfb\x30\xae" -"1\x88\x82\xe1\xf3\xd8\x41\xa9\xad\x8d\x65\x84wt\x8c\xfe\x36|\x1e\xb8MA\xe0SH\x7f" -"\xae\xbc\x18\xb2\xa1\xa1\x97\xcfH\xe8\x11\xfn[\xc0\xbe\x80\x65L\x7f\x14\xcb\x2h\xb5" -"\xd4\xf0\xc5~\xc1\xbd;\xa6\x36Lp\xfd\x44O60%'\x84\xf5\xfe@\n<`G\x10/e\xc5I\x8a\xd6" -"g\xb9^%N\xbd\xb0\xbf\x64mF\x99\xc1=\xbc.\xb4H\x8e\xd4\xe0\x8bw,\xbf\x1d\xaeyQ\xa8" -"\x19\x38+q/\xb3;\xfc\x34\x13\x8d\x10\xb1P\x7\xfe)\xaf\x41\x42t\xbc\xc2\x84]\xda\xaa" -"\xaehh\x80\x15\xc1\x41\x80\xc3\x44\x98h][\x1e\xe3\x16`\xb7\x62\x19\x12\xb1-\x88\xfc" -"V\xf3\x9d\xcf\xb3\xeb^\xdd\x8fL\x1f\x64\xa0\x8\xd4\xb9\xcfH\xdc\xe4\xb6P\x16\x80" -"\xf7\x8\xd6\x9\x9\xcb\x18)P\x89\xb0\xb0\xc\xf5\x9b\xb6\x8c\xa7\xae\xec\xe2k\x1c\x16" -"^r{\xde\xe\xc2\x15_\xb7\xf3\xc1\xb6\xd6\x46\xc7Q\"\x86n\x9cyS\x95t\xc2\xc4\x9e_\x4" -"\xa4`\x17\xa2\x99\r\x88\x46h\xc1nWA\x86\xee\x44\xf4\xfc\x33\x9e\xa2\xf0\x10\x88\xf3" -"\xed\x31\xa4\xd4S \xbd\x10\xd9\xcfX\xc7\x1e\x8d\xa3\xd4GQw\xbd\x5n#]R5hqT\x96m\x8b" -"B\x87\x8f\xa1(\x91\xda\x91\xab\x87v\x1a|\x7\xe\xa7Q@\xe0\x39\xcd\x8b\xe4\x1d\xb3" -"D9\xd1\x7\\\x8d:y\x90\xf9\xfa\xc5V\xc0[\x6\x7\xa7-\x14,\x84K\xaa\r.\xf7\x32\xfa\xd3" -"\x81\xd2\xe4\x61\xc8\xb1\xd3\xe8U\x80\xba\xd0\xc2P\x81OU$\xdc\xf3\x38\xfa\xea\x1a" -"|a\xc3\xa6\x18\xf1\xae\x94\x89\x1a*/P:!\xb3\xf0\x14n\x17\x95\x17\x88\x98I0C\x91x" -"\xcc\xcaY3\x83\xba\xa4J!\x3\x95\xeb\xa8^m(\xc2\x37\x82\xf1\xc6Q\xa8\xe8\xb4\xd7\x80" -"\xb7\r\xcbN\xaa\xde&\xd6=\xe3\x17\xc1\n\xc1\x8b\x93#\xeeL\x86\xf\xe6\xf6X\"\x19%" -"\xb4qUi\x7 \x9e\x81\x94\xaf\xf8\x99Mc\x8t\xb8\xf8\x1iR\xe9{'\xfc\xaaNuQ&\xc3\x15" -"\xc2\x8ey\x2V\x1d)\xc2\xa7\xf5\x86\xda\xf4xg\x2\xc6\x17\x65/nn\xc6w\x8a\xb5\xd0M" -"\x8eI\x1e\x6`\x13`\xb8r\xfa+\xc1\"\xed\xf6l\x18\x9\x37n\xebK\xcd\x17\x85\xd1i\x85" -"\x14\x5J\xf5S\x5\x9e\xd6\x1\xff\xae\x5#Q\xe9\xfe:Ej,\xa1.}\xd1\xa7\xf2\x3*5HL\xbe" -"\n\xa4\xa8\x32\xaf{\x9bj\xfdM\xbb\x80\x96g\xfas\xf9\x1fir\xf8\xcfH\x97\xbb\xbbv\xa0" -"\xb0\x61\x5q\x16\x80\x11\x87[y!\x88\xb7n\xfenk\xf2slL\x8ftV6\x84\xa5\xa8\x34\x39" -"\xc1\x1e\x8\x94\x34\x9c\xcd\xfb\xa8Z\x97\xc4Z\xa1\xd9\x89\x46K\xa2\x1c\xe0R+\x8b" -"r\xfa\xc4\xa5\x66\xda.\x2\x93\x65\x11\xf2\xc5\xc1\x1a:\x9aR\xe0|\x89\x1d>\x94\xd3" -"\xedK\xbd\x1b^\xb3\xf1h\xe3\x2^\xeb\x8d\xe0>\xd1\xab=\x80\x39pv\xb2\x10\xd9\xf9\xf2" -"\x14\xf8\xba#\xd1\x35\xd4\x9fq=K\xe5\x8b\x1g\x18}%HWbb)\x2\x8a\xbc\x8\xfb'\xfe" -"*!\xf9r\x5\xb\xf2\x91\xc2\xc9\xe8W\x9d\xc3\xd7\xe7\x9c\x31\xe\xe7+J\x8c\x61\xf5]" -"\x8f\x95S\xe9\x1d\x61\x6\"\xac\xc8\xbc\xf8!\xf9\x43\xe7\xde\xb\xbf\x8e\xf4~\x81\xd0" -"\xe\xbd\xdc\xd9 7+\xe4\x61\r\xe3p\xb4\xd6;x\x0\x18\xdd\xb4\xc8\x0\x88\x18#\xba\x11" -"\xfe\xff/\xea\x80#]\xec\xb3\xf2\x12^\xc6\xe9\x41x\xcc\x13\xdd\x87\xbe\x8c\x93We\x89" -"\xd5*\xa1J!O\xb4\xe8G;B\x9b\r@s\xa5\x63\xc4\xa7\xd9s\xff\x36><|\nui\xd4g%\x18\x91" -"/\xa8\xad\x98\x64\xb8\xab\xdc\x8a\xc9\x15{1\xf3\xf3k\xdd\xa1\x9(\x9\x61#\xfd\xd8" -"\xc1\xe2\xbd\x1dK^\xd2\x9c\x1a\x46\x19%j\xeb\xbax(l\xdfG\x95\xb8\xc1\x1d\x95\xdf" -"+C\xc2H\x1c#\x88\x3\xc4\x3\xc3\xc9\x91\x6\xc0%\x37.\xce\xbd\xd1\xdcw&~w\xe3\x1a+" -"\r\xa0\x83)w\"\xa8Ww:'\xd0\x35\x63\xd0\x1c\x1f\xfe\x63\x19\r\x63'\xf1_G&5$E\x8b\xfc" -"\x6\n\x84\xdf\xe0\x1a#\n\xc6\x7f\x14$\x5\xedq;5=\xcf\x88\x5\x81\xbf\xd0?g\xe7;\xc1" -"r\x1e\xbb\xbd{\x9a\x81\x65\x98L\xc9\xb9v\xe3\x1_r\x0\x11\xcvD\x8d,\x8\xdbg\n\xc3" -"Kx\xad\x8eyq\xae[\xa8\xc7+\x2\x17T\xe2\xff\x6\xbd`~E\xb0\x5\x46\x98\x8e?8\xb3=\xe9" -"\xa4j\xc9q\x10\xd0\xe3.o\xa5\x66h\xa6\x7f@\xed\x84w\x96\xebKx\xb9\x3\x14\xaf\x95" -"\x88\xdf\xe8\r\xa2\x37\xa1\x15\x4\x9d\x4\x8eUI\x8c-\xf7\xfe\x31\x32-\x1e\x8d\x13" -"}\xc\x93!C\x8a\xc4\xc8\xeb\xe7\xcd\xffiS\xd1\x8a\xd1\xc2W3\xd4\x3Q\x16\x9e\xe2\"" -"_\xcd\"Z\xb1\xfc\x4\xd7\xee\xcc:\xe6\xee\xd0\x44\xc6#~\x9d\x88z\x19\x19\xdc\x94\x97" -"\x8e\xaa:\x1e\xac\xcb\x46\x7\x66O\xd1(\xd5\x8fH\xcfI\xd3>\xbf\xca\xc7\xbd\x30\xc4" -"\xad\x14md42\xf7\x9a\xadT\xaa\xb6)\x12\x13`\x85\x98\x88\n\xc\xd1Uv\x90,h\x9cSZF`" -"\x9d`]8\xa6M\x80\xbb\x0\xf4\x8cQ\xa6\x7\x17\xf5\xf5\xdd\xd2\x9f\xfd\xd5\xb\x10V," -"\xa6reo\xe3p\xb9l`}\xc4\x97Ys\xf9,5\x83\x82\xb9L*\x4\x8b\x63\x36\xa8!\xchuW\\\x8" -"\xe2\xc\x2?\xf3\xa5\xc1'\x10N\xab\x17\x6\xe3'\x7f\xcf\xcf\xe8\x6\xce\xf2?\x8eL\xf" -"V\xb1\x91\x99X\xa2\xdf\x6\x9a\x1R\xadW\xc\xe\xf8\xf0\xe3\x85tQ4\x15n8\xac\x65n\xcf" -"\xa1\x61\x98\x93\x66\xcd\xd3\x38\x41\x17\x82\x63P\xe\xff\x95\xe2\x9\xee\x41Y\xca" -"\xc1\x86\x35\x7f\x1b<0\x88ON\xd0\x3\x8\xa8\x36\x6\x63\xd2\xb\xf5\x85>]\x9aY\xf\x38" -"\xa0\r\x98\xd7\xe2\x8e \x8f\x34\x2\xd4\xa0\xc4\xea\x38\xb0\x14\x83\xaa\x42\xd9\r" -"\x10U\xf0m,\xe7\xf4\x30\x98\xde\x1a\xd9\xc9\x66\x95\xfeP1\x95\xda\xdf\xc\x97\xf4" -"a\x89\xbdY\xfci;\x2:\x14\xc3\xe0\x88\xa5\x41_2\x19\r\xd9\xae\x46\x9b\x88\xd3\x95" -"\x15\xe\xc2\xd0X\x12\x80\xbf\x1d\x9bmZ6i\x93\x1bR\xd8\x85\xa0p\xea\xb2?A\x80O\xad" -"_\xdd\xec\x32\xd6\xd7\xc5\x9cL\x1f\x7f\x8\x83\xe0\x90\x66l\xb0\x16\xda\x80\xc3\xab" -"\xfa\x62I\x2>AE\x7f\x98,S\x1\x95\x1f\xcc\x8f\x81\xe5\x30\x80\xa2\xa9\xf1)\xbc\xd1" -"\x8e\x80\xb2\x16\xc2s'\xdf\xf8Z\xc5\xd7\x44\xb5\xb0\x61z\xd7\xf\xe8\x82\xb9\xeb\xc9" -"yg\xcd\xbd\xae\x1e\xae\x9f\x1f\x1\xe!\xf3\xa0\x64\xd9r\x88\x9d*\xb9Z<\xb6\xdd\xa5" -"\xb9 \xfb!\x8\xc1\x99\xd5\x8b<\xefk\x95\xfeZ$\x9bY\xfaP\x1b\x63\xf7Z2l@\x90\xc4\xde" -"g\xa1\xc6;\xe\xb5\x44\x89\x36\x17\xd9\x39\x88!@\xffpnu.\xe3\xa9\xde\\v\x8\xa1x\xf2" -"\xc7\x5\xef\x34\x42\x11\x92\x9c\xc5J\x15\x94\x16\xe4\xb1O3\x8b\x45\xf4:\xec\xfa\xa2" -"\x0\xf1\xdf\x91\x1c\xe5\x7f\x89\x35\xde\xf6jd\x9b\xdc\xc5\xa4\x39\xcd\x98\x95?g\xc1" -"\xe4\x38K\x8d\x9b\x8e\xf8)\xc9t\xa7v\xaa\x3(\x1b\x90R\xc5\x90\xbb L\x96\xbeH%\x91" -"I\xc8\xf6wU\xeb\xa2\xf1\n\x97\xca\xd7\x10\xa0\x33o\xc6\xab`\x8a\\\xd3J\x9f\xef\xf4" -"\xdf\xdbM\xdf.\x4n|{5\x86;;\x93\x16\x61\x90\x1b\xf2l\x87\xf:hH\x9d\xed\xef\x1d\x34" -"\x1d\xd9\xba\xdcka%a\x83\x33\xf!\xb\x8b\xf\xedJ9@w\xaf\xcc\xcd\x82\xcf\xc2\x33\xc6" -"\xf\x97i9Qb\xd0\x39\x6\x39\xf3\x19Ql\xe2\xb8\xd1\xf2v\xcfO\x99\x92j\x87+\xf\x1bs" -"\xea\xbf\xf6\x19\xc9\xb3\xf7\x95\x9b\xe8\x9a\x43\xd3\xf0\xd6\xd9\xac\x1d\xa4\xfb" -"\xfI\xde\x66\xf0\x6\xa7\xc3I\xb0\n\xddv\x84\x36\xf7\x8e\x9b\xc1\xd2\"\x1e\xd4\x17" -"?\x7\xb9(\xf9nE\x13\x44\xbc\xec\x1f{\xba\xb4\x81\xd0\\i\x8\x8a\xe\xa1\xdb\xe8\xb6" -"\xa2}\x8/\x1b\x87\x87\x61\xc6\x8a\x1f\xab\xb2j!s\x14\xc7.\x16N\x89\x34\x13\xdb\x1b" -"\xa3\x62\x64\x63kp9\xbe\x13\xd7HfJ\xfc\x66t;A\x93\x10 \xe\x80\xbb?>`\xc2qW\xec\xa0" -"nZ\x80\xf\x9\x42\x35\xcf\x2\x15\xed\\\x1e\xf3\xdc\xf4\xec|\x3l5\xf8\x86\x17\xe$\x17" -"\xcd\x39\x17\x1e\x17)\xdc\x32\xcb\xdf\\\xf8\xee\n\x86\xfd\x9\x36\xe8\xdd\x64\x99" -"\xaf\x39J?\xf5\xf7\xea$i\x14^\xca\xd6\xe9(\xea\xe8:U\x1dnP\xc4\x91\x10;l-L\x14\x39" -"\x8f\x32\x92\xc2\xe3\xe\x9\x1b\xc=\xbe\xca\xed\xee\xa3&\xe2\xa4=\xbf\xc8\x61\x0\xfe" -"\x99O\x12\xcb\x65\xd0\x44\x94\xac\xa0\xa7\xb0\x61\\\x36\x9dR}\x87\xd3\xcN\x18\xa2" -"\x92\"\x9b\x62\xe1\xf6ut\xbc\x34\x9e\x97\xbc\xe\xf1\x3V\x7f\x98\xfb\xa5\x1c\xeeP" -"\xfa\xcbI\x8d\xd0\\w'\x5\"\xf1\x44V\x97\xad\xc6\x36\xd4\xbd\xc3\xf5O\x11\x61W\xa9" -"Y\x1e\x10*s\xb5\x62\xb3\"\xf9\xc3jVP\xb8\xc7}$\x19\x64\x8e\x84Q\xb3\xa9\x33$\x8c" -"\x90\xa7\xce\xd7Q\xc5\xeb\x61-\xef\x45\x9f\xd8\xf8\xc3\x86\xb1\x66\xa1#J\xdf\x39" -"\x11\x82\xff<\xb8}\x13T4\x86|e\x9?\xb7g\x89\x5\xea\xd5\xd4x\x1dkN.\xaf\x9r\x1q\xca" -"\xa9\x98\xeeK\xa3\xf4\xfb\x61\xb1\x19\xc2\x32\x15K?J\xeb\xd0\xafv*1\x1eh\xd2\xf3" -"S.\x85\xb7\xbb:\xe9\x0\xb3\x0\xfd\xbe^w\xec\x41\x14\xdc\x91\x8b\xd1\"\x9f[\xd8T\x94" -"\xc2\xa6\xbc\x91X\xaf\x99\xc6\x1f\x98\xcb\x90\xc7\x12#\x84\x64Uy\xc8\x8f\x88\x8e" -"n\xf5\x39^\x7sA\xb5\x19#lk,Q\xe1\xb5\xe4\xb7\xfb\\\xa6i\x8aRb7^\x86\xf9\x9e\xe/\x86" -"h\x91\xe0\x13\x33\x36\x3\x80\xc6\xb4\xe3X\x8b\xee}\x1b\x93\xb2\xe1\xfd\xfb\xad\x36" -"C\xc9\x63\xc7\x1ci{\xab\x8d(\xb1\x30\"\xbe\xac\xac\xc7\x18\xf5\x90^\x14\x9e\xc8\xc9" -"\x84\x81\x8b\x66\xc9\x8a`\xb5\xbe\xed\x90\xd7\xe\x96\x66\xc9\"\x34\x1d\xd5\x3\xf5" -"/!\xf6\x9f\x46\xcf\xd4\xb0\x44\x31#f\xd9O;-\xc0^y\xf6\x94\xfc\x46\x35\xde\xfek\x8b" -")\x8\xc5\xab\xeb\xe9\x66\x11\xe7\xde\xeb\xdb\xc3\xe6\xc3W\xcd;s\x96\r\xd4\x1b\x97" -"a\x99\x9c\xbc\xa7\xa5%\xe3\xf5\xf3+P\x1d\x9d\x86#\xb7\xe7\xdc@$y\xe1\xd5\xe5\xd1" -"\xff\xf0\xdd\xa4=Qs:j\x84\x8fU\xdd\xeb\x5\x97 `B\xc0\x38v\xb3\xdd\xad\xc4\n\x8U;" -"(\x15U\xf5\x30%\x31\x0\xa1\xc5\xc9\x80\xcd\x41\xab\xbd\xc0\xe8\x32\x44\x37\xd2\xe6" -"4Rx\x1b\rZA\"#\xaf\xad\x4\xe2'\xaf\xf0HA\xc\x12\xeekB\xd3\xeey\xa5\x65\x93\xe3\xf1" -"YV\n41-\xa0\xfb\xc0\x1a\xbd\xeb\xa1\x15TI\xaeG\x91\xfd\x9-\xa6s\xb7<\x8q\xfd\xe5" -"\x87'\xef\xa4\xaby\xc5gWj\x93\x1f\xb5\x41\x9d\xe3\xd0\x39\x0+\xf0\xfe\x11\xf1x\xa9" -"\xacZ\xc7 \x89\x83\x66\x13\x89\xab\xaaW2\x14k\xdf\xea\xdc\xc2\xf5\x3\x8aHJ\x2\xe7" -"\xa0\x99{\\\xbe\x1a\x42\x62\x81\\q\xe9\x6\x9f\xfd\x85H\xc2O\xce\xb4S\xb8\x1e\xcb" -"\x10\xc3\xcc%\xac\x61\xdd\x97[!\x95\xcf\xf8\x66\x0\xc6\x44\x8\x98\x1b\x94-\"\xf2" -"\x1c\xac\x10\x39\x80\x33=s\xf8\xb8(\xd9\xdcZy\n%\x6\x93\r\xff\"\xb4\x1d\x8d\xf0N" -"\xcen$\x9b\x44I}\x16\x46O\x0i\xa7\xdd\x4\xb4\x16'o\x98p\x90G\xc3\x66\xd0\xe3\x5\x1b" -"\xb1;\xa2\xfa\x8b\x9b\xab~M\x17\xadUD\xd3\xf9\xbate5\xf6&(p\xb2\xf3_\xcc+\x81\x9c" -"\xec\x1a\xae\x1\xed\xae\x61Y\x98\x82\xb0\x2]%v$\xb3\xeeZ0\xbd\xe\xd5y\x2\x81\xde" -"\x88\xf0%\xdc\x3>\xe7\x42R\xca\x15\x32\xb2Tp\x1c\xd1\xd3\x65\xe2S\x1c\x30j'g\x6\xe8" -"2\xbo\xf0\xfb\\\xb3\x34-\xe8\xfe\x95sX\xa3^\xb8M\xb7R\x83\xb8[\x1e\x44\xcc\xacy\xc3" -"\x93\xf3\x8fs\\\x17\xdf\x38\xadg\xcb\xc5\x18\x46\xbf\xdc\xd2\x94o\x8_\x86u\xd0=S" -"\x16\x90\xff\xf2\xc1}c\xf9\x9\x12\x46\xb2\x66I\xba\xd6\x12\x36w\xa7\xac\xea\xf4\xb8" -"\xb9\xa1\x89Z\xe9i\xc5\xf8X\xadL\xa3M\xd7z)>\xf8Y9\x96\x4K\xc1\xf6&{\x9fN\xa0\xdc" -"O\xaa\"s\xef\xac\xdd\xb9\xdb\xae\x1a\x18 \x1b\x9e\xe1\x4\xd1\x83J\x6\xc5\x30\xe1" -"\xec+\xc0\xd7`\xdap\xab/\xf8\xd6P\xce<\xe4\xdf\"\xcf@\xceu\xb7\xd6\x9d\x2\x1a\x37" -"\xc7\x9b\xb6\xaf\xb9\xf9\xea\xaf\x62\x1c[\xf1 \x99\x4\x8b\x92\x64\xdb\xa6-\xe5\x46" -"1\xd7\x97Mh\xa4\xf3\xbc/\xb0\x38\xfc\x2\xb9\x96\x90\xed\x8f\x35HWb\xd4P\xf5\xce\xf0" -"c#\xff\x63&M\xc2\xf6\xc6u\xc1\x8a\x9f\xfeM)\x83\x3\xa6\x11\xa3\x14\x36\x6 \xc\xae" -"L\xc5\xa9\x3\x43\x11\\iH\x11\x16\x3)\xb7Hq\xe5+\xb3\xa9\xd6\xa7Yc\x1aU\xe7T1M\x1c" -"\x0\x35\x85\xe8\xbe>\xc0\xe;\x9\x94vh/5i1\nb\x1f\xb6{\xb3K\x1e\x45\xd7\xd3\xde<\\" -"c{\xab\x17\x91\xc3>\x9azWcQ<} \x5\xa8\xcd\xfe\x96\x9\xb6\xa1\xdd\x64\xe3p\xaa\xbd" -"&\xa6\xe0\x39Pig\xd8\xd2\x1\xf9\x3\x9f=\x7\xeb\xdc\xad-\x1c\x45\x9f\xb8\x82N\xba" -"\xf0\xec=\xc3\xac\xa7JS\x1e:\xac|\x8a!\x80\x10X:p\xf\xbe\xf6\xe0\xc7\xa8\x8a\xaf" -"\xc7\xf1\x97\xeb\xbf\xc0\x9c^s\x91\x1f\x11\x12\x2u\xf4\x8\xda\x8f^\xe8\x62u\x1f}" -"\xf\xd1\xb8\x31\x6\x96\xcc\xab\xe\x36\xaa\x42\xaa\xdbv\x98-\xed!2I\xd1\xf\x7:F\x13" -"\x85z\x8d\xc5?\x4\xb5\xe2\xa4){@)\x1d\xba\x7\xa7\x89\xc6\x8b<\xe3\x62\x62\x18|\xf4" -"\x9a\x85\x45\xa7\x62\xcf\x1dx>\xc7\xb1[C\xf0\x37Ue\xc5s\x1b`\xcc\xa3\xac\x62[z\xa9" -" \xc7`\x1ds6\xf4\xbd\xfan\xaa\xa3\x66\xbar/y9\xb7R\xd9,&%\xc1\x33\xe2\xb9=\xa3p\xc5" -"hd\xa2\xdfy\xd9\x41\xf7\xd5%\xa2\xe8\x97\xfe\x7f<\xaf\xb1w\xbc\x18\xa9_\x9c\xa8\xfd" -":\x9dn\xa2n\xcc\x36\xf1\xc7\x8b\xd0\xfe\x32\xb2\x62x\xfd\xbe\\\xf7-K\xf0\xafx\xee" -"MY\xd0\xed\xc8\xb5\xb8\x66\xbf\x5G\xc5\xffV\xf8\xe2\x1X\x18}\xd4|\xde\xc4\x45\x97" -"d\xf8\xd6\xb0\xd3\xe1X\xc8/\x16p\xe3 \x81\xa9\xf4\x83\xe8\x92\x6'\xbbi&\xd1\x6\xa8" -"\x9a-\xed\x36\x91W\x14\x15\x1d)\xce\x9d\xedH9+{\xf2\xe1}!\x94\x36\xcb\xda\xd6\xae" -"\xe2\xcd\x99\x41\xe4U\x92\xaa\xb1M~\xc9V\xe5\x43\xb1\xe2\xc3\xe4\xbd\xcd\xf4\xfc" -"\x6Z\xed\xbe\x8c\x3uu\xd0\x10\xf5\x81\xb0\xe1\x97\x66\xaeOG<\x8e\xfb\xd7" -"\"\x8a\x8e[\xa2\xfa\x2\x7f\\?\xa6\xc3\x35\xe9\xc6\xe3/\xbcU\xc9\x13\xa1\xe9\xb\xe6" -"\x81\xeb?$\xb6\r=\xa7\x96\xc6]?\xb6\xe9z\xc4\x89Q\xf5\x1cH\xf6h:#\x99+\xae\x3\x95" -"Un\xf2\xbe\xae!\xc2\x8+\x96V\xe7\x63M\xaf\x1d\xf9\xb9\x2O|\xb9 \xe9\x97L)\x9b[\xb8" -"\xf4\xd9\x18\xd1*&i\xd6)\xe6{\x17\x43\xe4\x9\x13\x16\xf\x18\x43\x9a\xb0\xd8\x43\x8f" -"\x18\xc1\x8a\xd6\xf0y$\x8do\x1dYq\xe5\xeb\xa6\x7f\xecGQ\x1f\x30\xc1L2\\j\xe\xd5$" -"#\x1c\xf0\xca\xf\x98\xb0\"\xa9m1\xa3\x8e\xe4\xe8\x9c\xd1\x98\x39\xf3\x8f\xa9\x41" -"\x86\x5\x95\r\xea\x62w\"`p\xad\x65\x83!\x9fh=p\x81\x9c\xe0\x14\xb2\xd5\x61r\x99;" -"\xf2\x1d\xa9\x39\x35O\xbb\xee\x33\x45\x10\xde<\xca\x9f\xb5OrQ\xdd\xc3S\x12o \x89" -"\x96\x3\xa7\x1e\xb\xab\xef\xb6s\xa7\xc4H\x8c\xe3\x0\x7\xc9}f\x8f\x36\xecOg\x8c'\xb1" -"J\xfd\x6\x44\xf8L\xb9>%}DkG\xcc}\xbd\xdc\xcd\x66\xf9\xb4M\xf9?Sf\x84\xc8\x44\x18" -"\x9c.\xe1 /\xa5\"K\xa7\x89\xf8=\x8e\xfd\x62P,\x1c%.V\xba;+.\xc4\xe3\x38\xa7Zoz!\xae" -"\xda\xf1\x8b'\xdd\xed]\xf1\x9c=\xca\xd3K\x11\x9d\xee\x44\xd4\xa3R\x9d\xf1\xe9\x7f" -"\x1c(\xce'\x8d\n}\\|^~\xb1\xe5\xb9\xfb\x17Z9u\x80t*p\x2\xe8\\\x83\x7\x18\xd4\xc5" -"'=<\xec\x99\xde\x4\xfb,\xbb\xe0\x90\xd9\xee\x85\xde\xe7*{x\x3{\xaf I(\xde\xca#!Q" -"\x9f\xc8\x11\x5\x66Z\xc\r\x8d-\x1b=\x95q\xd0\xf3x\xe0\x9as\x7f\xcd\xa1\xd1\xa1G," -"\x87?\xb0\x9gk<\xfa\x42\xe8^w/L\xc4\x1a<(\x1\xdbI \xb8\xfa.K\x8bz\xe7\x1a?C\xe9`" -";\xb5\r\xcb\x1c;e\x10\x88:o\xbf\xd1\xf1R9\x1e\x98\x1c\xdd\xa2\xeb\xa6+\x1a\xa3\xde" -"\xf1g\xa1\x8b<\x7\xb3!\xcf\xa0\x8}(\xc8\x82\xe7\x37gF\xc9\xcf\x9fw\x9a\xef\x91\x1b" -"\x81\xf4\xff\x34\x1e\x45S\xa8S\x9d\x9f\xe]\x88o\x10\x63\x96\xc8\x8b<\x9[\x96\x17" -"\xb7\x84/{\xed\xealK?\x5\xc2\xb6\xf6\x38\xa9\x15\x80\xe7\xac\x33\xc5P\xbd\x7\x62" -"q\xed\x8\x44\xfbR\xb5\xd3\x2\x9\x0\xd8I\xa3\xe2\x8d\x65\xbe_\xe6\x45j\x8\xa3\x1d" -"\x7\x97\xc7\xd0\xdf\x8d-\xe7\xfb-\xf4\x17\x43\xc0Pd\x93\xc4\x64\xb2\x44V\xad\xa7" -"\"\x9c\xe3\x14\x61\xcf\x31\x32\xb3\x62S\xe2\xa5W\x7f\xbc\x45\x8b\x38\x9f\xce\x42" -"#Ewo\xeU=\x1b\xed\x9c\xe7\xdc\x5\x7f\x96\x19]\x4`gE.#\xe5\x66\x62\r\x7\x9b\xc4\x86\xc5\xb7" -"K\xea\x18\xf4RGAXo\xe6k\xa6.5\xaa\xd6|Q\x15\xadl\x9b\xb3\xc3V\xf3\x6.\xe8\xb5\xfd" -"\xa3\x7\xf8\xfa\xfe\x31\xdd\xbf\x41\x64\x1e\xbc\x87\xfa\xc\x95\xc7l\xdd\xce\xa9\xff" -"\xb2#\x9b;\xbcJa\x2\xa8\x8d \x2\xca\x45\x97\x3\x8&\xc7:\xe8\xc0\xcf@\xd8\xb4u\xf" -" \x98\xa4G0\xdc\xe4\xa7\x96\x7f\x65\xa9\xcc\xcd\xd6k\x12\xd9\xe4\xb6\xf7]\xec\xb1" -"\xb2\x92\x5;f\x8e\xa3\xfc&\xb1t#\xcb\xe4\x36\x42\x9\x9a\rT\xb7I\xf7\xfb\xf1\xd2\x41" -"i\xaeu\x9a\x9a)\x13\x9e\xe7`\xbc\x1b\xaf\x95\xc5\x96\x89\\\x9c\xaf]\xb8*\xc3\xcd" -"h\xfaVY\x11\xd1OB\\W\x93\xb3\x38\x95\xf5<\x9a\x84\xe0\xc3<\xdd\xc5\x46\x45\x9a\xa3" -"\x7f\x13\xa7\x9c\x44L7\xc2\x13\x2\x46\xa7\xb6\x91\x43s\xbd$\x7\xe4\x62\x17\x42u\x8b" -"Q\xb1\xdf\xbfnJ\xb9\x31\xb7\x17\x41\xdd>\xa1\xc2\xb7 \x14\x45\xc4\x84\xef\x38\xe8" -"&:\xee^b0\x7\xf8u\xfc\xfc\x1f\x38\xd3\x14\xd4\xd6\xb8\xbe\xf3\xc0\x5J\xc6\x80O8\xfc" -"0\xc0M\x9ft\xba\xe2\xa3yuMg}&\x89\xc\x12\x38#\xe9\xf4\xc7\xbe+X\x9e\xf9+ \x1eX\xb6" -"\xb9I\xfd\xd1\xbd\xf5\xfcHB\xd1\xc8\x80\xcdk\xfcx\x88\xbx!\xe8Y\xb8\xf0J\xadu\x9" -"\xb9\xd0\x8d\xde\x8d\xcb\x9a!\xff\x3\x82sFmp>L8\xb9\x38\xc0%n\xb1\x10W\x9\x1d\xf6" -"\x13\xac\x44\xbf\x8f\xbb\xac\xb1\xd7\x19\xea\xd2\x93\x5\xc0\xe3,@\x97\x98XU\xd3L" -"\xe2Qb\xcd\xaa\x34\xb7\x7\xf6->)\xaeOY\xa9\xfa\x9f\x83\x90\xb3\x31\xb0\x99gm\x19" -"\x0\xe1?\xe9\xe8\x34\xd4\x8e\xf4\x64\x87\xac\xc8\xff\xad]\x82\\[\xf3\xd9\x41\x8\xc0" -"{\x9a\xe2\xe3 \xa7\xba\x4\xa9+b\x86\x64\x30\xd5(\xe0m_\xc2~\x1\xae\x9f\x45gib\xb3" -"\x16\x84\xbcK\x86%\xac\xba\xcd\xfd\xb4\x10\x39\xd2\x1d\x41\xba\x1e\xaf\x8a\x89\xd3" -"g\xca\xe@i\xe6\xc9\xf0\xe0[RS1h\xa8\xa9\xbc\x9fTJYH\x8f\x18\xa9\x9b\xb6\xa7\x2\x18" -"\x14\xe5nx\x9e\x34\xaa\xa2\xadO]\xc5\xe4\x92\xdf\x9a\xee\xe1,m\xb4\xfbp\x86\xa1I" -"_D\x9f\xa1\x63=\xb8\xb5\x88\xf5M\xcb\x9f\xa5\x38Q\xf0/&#N5\x3H\x92\xdf\xbfQsT6\xb2" -"\xaa\x1c\x7U\xe9\x8cWYV<\xe7;\xe7Sb]\xd6U\x4\x45\xe2OL,g\xc0(\xc8\x8b\x89\x38\xb3" -"\xa6\xb\xaf~)\x8c\x85\xc6\xc6(\x83\xc4\xcfHm\xd5\xb6\xeap\x5\xe2&)e\xf8\xe3\xd5\x35" -"\x15\nj\xb2H\xec\xfb\xa9\x91\xde\xb9\x64V%\xe2$\xe2\x96s\xc1\xdf\xeb\xf4\xe\x63i" -"D\x3\xcb\xe7m\x90\xee@R2Vl\xee\xcb\xbe>\xdc\xa0\xcb\x99\"\xb4\xa3\xef\x9aGa\xf9\xc6" -"\x9e\x65\x18\xde\x2Z\xd0\x42m\x8I\xb4iP\xd4\x63\x37\x61\x9f\x86\xaf\xce\xa5\xa1\x37" -"b\x0?Vi\x9\x8f\x41\x81\xdbRb\xc4$\xf1\x8e\xa3\xfa\x63Qr\xd3\xff\x36\xd1\x9a\xb5i" -"\xad\xe4\xd1\xe4\xa5\x91\x1a\xbcq\xce \x91\xce\x98;\x8d\xe6\x30u\x80\x2\x89%\xbd" -"x\x82\xd1\xf6\xa4\xdb\x15\xbd\xc0&`[0\xf4\xaf\x31\xb9>\rp\n\xa6r[Y\x5y\xeb\x89\xe3" -"K?\x95\xa4\x9f\xdf\x15\x12Xj\x9a\xf1\x3\x31\x8b\x37\xbd\x96\xc9\x38\xdf\x91\xe6\xb3" -"\xa6\x15\xdd\x42\xb2\xef\xa3\x9d\xf5\xf\xa5\xdf\x96\xc1\xed\xd5\xccz\x98\x8b\xcc" -"L\x1d\x1a\x7wAL5\xf\xaaj\xc8\x10\x66\xb1\xb0\xf8\x35\"\xe6\x88\xeam\xcc\x43:\x14" -"\xec!\xcd\x5)\xf4>\xc\xe6\xff\x0\xf9\x36!\xf\xad\x46\xa7\xae\xeeJ'\xf2\xa9\x96\x1b" -"\xb6q@\xc1\xd8\xcbM\x8f\x7f\xf2\x16\xf9\xc2\xa6\xb0\xcf\x98o\xd9$\x81\xf7\x12Y\xa4" -"$)\n \xa3v4\x2\xf8#\x2%\xcf\x65q\xf1\x17\"\x18\xd5u\xbb\x30\x38\xce[H\xcd\xeb\\\xc1" -"\x17\xe2\x1a\xa4\xe3\xa4O\xacg\xbb\xe\x65\xc9\x90\xcaRe_\x9c\xfd\xc3}\xb4Ox\x97\x81" -"\xe3\x66\x35M\x2\xff\xa1\xa9\x7\x84\xab~\xda\x8\xf1L\xb6\xfalu\x93./)\x8c]\xff\x8a" -"\x7f\x45\xab\xeek\x82\x97\x1\xca\xe3\\\xee\x16\xffh\xf0\xe8\xaf\x7f\x3)Vo\xf4\xb" -"uOLO\xfd\xc9\x94\xc0\x42TVv\xb7\xf7\x1b\xd0\x12J\xd4\xed$'\xeb\xe\x5\xeHO\xc3\x95" -":\x85\xc4\x33Q\xe1m\x5\xbe\r\"\xecm\x19=\xf3\x37\xfd\xee\x17+\x1d\xf1\xc3\xf0\xf" -".\x1c\xb1\xca\xc4Q\xe1\xfb\xe5=S\x1c\x6\xa2\x87\x7f\x30\x17\x82\x1f\xb0\x7f\xe7\x1d" -"\xfd\x8a\x38\xc8\x93\x81\xb0\xfc{w\x86\xcb\x92\xe5\xb9\xa8\xd5q\x91\xba}\xb7.\xcc" -"\x1c\xd8\x9e,o;F\xcc\xbe\x34\x65\x4N&T\xe9\xcf\xeb\xd5\x96\xed!i\x83\xbc\x66v;\x80" -"\r_\x89pN\x89\x36\xa9\xee@\"d\x5\x82\xc9re\xf2\x9c\xf8\xad\xed\xe8\n\xb3\x85\x37" -"\x91-\x11>_+\x82\x8dhn\x8aZz\xb9\x80\x32\x32WJB\xa0\x30\x7f\xc1\x86\x8b_=\x16l\x13" -"\xad\x35\xbb)\x5\x11\x36\x91j\xb5&3]\xd2+\n\x80\x80\x1c\xc0\xab\xc3\x11m\xf7\xc9" -" \xb3\xa7so\xe\xd5\x13\xdf\x45H\x8c\x62\xd0\xf2-\xb0R\x9c\x39}\xb8\xd8\x32\x89l\xd1" -"L\x8\xb1t\xda\xf0~\xebs\xb2\x90s\xb4R~RYy\"<\x88P^\xadn\xefRp[\xfb\x83\x64:\xc1\x1" -"3z\xe5\xff\xc5\xf4\x62T\x17\xbe\x88m\xa8\x9{\x1e=\xec\x92\x65\x9a\x61]\xf7\xc5\xca" -"%\xe3\xca\xec$\xfe\x45\x44\x65\xd8>h\xce^\xfdio^\x17\xaeQ\xab\xd5\x1\x8d\x1f\x92" -"\xfc\x9eXLk\xc8\x82\x88\x1f\x6v\x94|\xf9n\xd7u\xe9\xbbN\x80v\x1f|\xecs%\xf4\x88\xd0" -"t\"i\x8jU\xa4\xe2\xae\xca=\xdc`3\xae:\x18<\xfe\n\xb8\x91\xd1\x7\x99Jh\xa1\x1e\xf7" -"\x12\x8en\x12<1Z\x15\x1b=8A\x1d\xbc\x64t!\x1dgb\xf\x41#_\x1dJp\x80\xe1\xdd\xb0\xe5" -"\xf4\xf5\x96\xbe\x2\xec\x17\xdd\xd9\x38\x8e\x45\xab\xbf\xa6\x62[\x81\xa1\x41\xc3" -"\xda\xe6\x11\xf8\xb7\x44W\x1e \xd8\x80Y7M\xcf\xaa\xa1\xfaY\x8a:.\xfb\x31\xb0\xac" -"dRn\xa0\xa7\x82\x8f\x81\x7\xe0m\xaa\x1c\xa6|YF\nI\xf6\x16L\xf4K|\x18\xd7\x8e\x10" -"\xc4V_Jen\xe\x6\xdb\xd9\x11J\xd8\xadI\xd4\x8f/Y\x91Pg\xf0\r\x9c&+&G\xaa\xdc\x8f\xe2" -"\x9f\xc1\x8f\xb0 ><\x1f\xdcW\xe\x5\xe3\xc3\xfe\xee\x8c\x30>\xac\xbb\x1a\xd8\xc5\x9b" -"l?\xb0\x32\x1d\x44\x1ak\xbc\x12\xc2l\x8a\xd6\xe1\xba\xc3\x31\xad\x1f:\xf7\x8f\x2" -"\xb\xe5\x19}\x11\xa2\x62\x62S\\5\x86\x42H5k\xb4\xb3H[\xc0\xab\xb8\xa7\xbb\xc5V\x5" -"C}7\xcd`A\x9d@\x97o\xfb\xe0\xf%\xc2\xd1\x97\x80\xc0\xa4,0 \xbb?\xbe\x18P\x8\x1a\xa8" -"\x15\x5\xa3\x65\x82\xa3\xa2\x33\x15\xd4?\\\xa1\x62\xba\xdfv\xe1\x7T\x8b\\TP\x6t0" -"\xa1\xa4\x19\x8c\xe0\x17\xb9\xf8\xb|\xe1\xe5K7\xb4\x8cm\xaf\xb9/\xc1\x44I\x19m\xf5" -"IVN\xc8\x63-o\"\x1c\x9d@\xcf[\x9e\x9e`\xc7\xe5~As\xd7\x1d\xf\x0\xaa\xaa\xd8\x44\xb4" -"\xa5\xc4\xee,\xaay\x94\xb5\x8a$#9\xf3\xfc\xd7q\x91I\xa3\x8b\xbaZn\x15\x1a,g\xefU" -"\xca<\xef\xf4\x96\x45\xf8\xee\x95=\xb0|\x84\x83\x9\xc2\x5\xf8\x14\xb7\xb2\xfa\xb2" -"\xd3\xda\xb8\x31\x30\x15\xd3\xf1\x98\xec\xee\xdaJ\xc2\x1b\x41~1\x88\x7f\x89\xa5v" -"-\x13\xea\xaa\x84\xd2\x35\x3\xcqfJ\xf4\x9f\x18\x17\x89\xfd\xfd\x66\x93\x3\xea\xe9" -"%\xb1\x81\xbe\x88\xc4\xd3\xb5kh\xfe\xd6\xbb\xd6*\xc9\x9dP3[&\x9c\xb2O-3\x1e \x18" -"W\r\"w\xee\x15\x8\xf7\xd6i\xc5\xa4\x9d\xd8\x0\x90\xce\xd7\x1a\xad,\xdewtd,\xbb\x1" -"\xa1\xcd\xe2\xb8\x1a\xb7\xd9\xf\xf3\xbf\xf2\x11L\x7\xd9\x35n\xc7@A\xd8/TZ\xf1\xc9" -"\xce\xe\xee\xc2Z\xd4I5\xb9k\x8d\x13\xd6\xec\x83\xd9\xc5\xff\xe2\x46\x63\x16\x97\x5" -"\x8c\x14\xce\xd0\x9f\x9c'\x4\xe9q1-\xdd\xe2\xb7\xe5\x85-L\xe7yw4\x95\x8a\x18\xb8" -"\xd0;\xffW\x89w\xa6l\xd2'{5\x8b\xba\x82m\x8\x81\xe6\xfb\x95\x4s\xf0\xeb\xe7\x6\x30" -"n\x1a\xd7\xfb\xc5\x2\xb1v\xa5\xed\xd0( -\xf2\x81&F\x82\xd7^\x1e\x8f\xde\x36\xb\x38" -"\x18\xc4\xc7\xf1\xc2\xf9\x46\xf\x92\xb2\xa1\x1f\x99>\x9bg\xb6nZf\xbc\xb6\xc2\x10" -"\xafh\xf0 \xa2|ju\xab!K3\x99\x44!*\xe2\x6\xab\xd7\xa4+\xf)\xca\xaf\x64$\xb6\xfa\xa5" -"\x16\x95IX\xf0\x1bN\xff\x82\x9f\xb3\x4\xaa\x7\xd3\xe7\xd2\xd6tS\xc1\xff\x85,\x85" -"\x99hs\xc9y\xfbr\xafQF\xce\x63\x65\xda\xbb\x87Q\xf0\xd4\xdcX\xa0ks-\xa7\xd7\x31\xab" -"\n\x8a$\xa7\x64v\xec\x8b\xfb\xa2\xa6?}\x8fZK\xbc\xe2LS'\x1f\x84\xd6\x14\x31s\xd1" -"\xca\xef\xc1]]{\xa5\x44N\n\xf7\x30\xe6\xa0\x9e\x8e@\xf9\x94\xa8Z1\xfa\x65\x9e\x5" -"\x94\x36\x9a\xa7\x13\xf9\n\x95\r\x89\x12\x41\x38H\x18\x42\x64\xfc\x0:\x15X@\xcd\x80" -"\xfa\x9aj\x16wS\x94\xa3\xcex\x9\x96\xc9\xeag97\xcc:\x95T\xce\x38\x34\xcf\x61\xec" -"\x1\x30\x92\xc7\xab\x9d\x34\xc6mL\xec\xa7\x39`\x9c\x1b:j\x9d\x33'\x1c|\xd7G\xae'" -",\x9a\xd4\xee\x81@-\xe6\x19\xe0\xc9\xe5\x85\xc3\xa7\xfe\x98\x9d\xf3\xaa\xee\x93\x18" -"Pm\x93\x4[\x19I\xc0La\xb6\x9b\xa9\nh`\xdc\x93\x9e\xc7" -"\x87\x5\x37\x62;\x93K\xc2\x10\x44\x87\xcf,O\xb6\xc7\xc2@\xef\xab\xd6|\xac^nQU\xe9" -"\x15~\xb4:\xba\x84\x94\xce\x85:\xc\x6k\x9d\x9\x39\x92\xe\x8f:RK\xb9\xf0\x33\xe3\x41" -"\xaa\x93/\xc3_\x9b\x4!\xd1\x8\\q\x96\xe3\x41W\x18x\xe4\x4\x66\xf3\xad[\x9f\x8d\xb" -"\xcc{\xe\x66\x35%yI\xd7\x8f\xe6\x31\x7f\x81\xdb\x31z\x18j\x8d\xfdR\xbdT\x9e\xde\xb4" -"\x97\x30z\xc6\x7Z<\xdc[\x2\x41\x1f\xf9\xb5\x43\xeb\x42*\x1\x89k\xfc\x35\rh\xd8\xe1" -"\xc1s|S\xfcq_q|\x3\xd8\x96\xf9XbG|\xdd\x8e\x46\x99\xc7\xbf\x30\x98I\x8dx\x98o\x97" -"@\xa6\x62\x95\x33\xabG\xd4\xbf\x85\xff\xa6#Z\xb5\x31\xb5Syj5a\xeb\x81\x93\xbd\xd2" -"\x7'g\x97\xa6P,\x14\xef\x1d_L\xf4(oI\xeajw\xf4\x95\\G\xc8\x64\x85\x90\xe9\x33\x2" -"\x8d\xd8\x2\xfa\xc4\x42W\x13\x97\x42\x9av\xbfv\xb8wB\n%'oC\xf5\x7\xb1[\xa8\xaa\xba" -"\x95\xdb\x92kA\x8c\xbb\x92\xbf\xe6\x89\x9c\x0\x97\xe\xca\x34z\xdd\x1b~\xbeT\x7f\x10" -"\xf4\xf1\xfd\xa8\xc6\x97\x8\xf8_\x99\x14LK\x1eT\xfc\x16\x80J<\x89\xabTc@\x9a\x81" -"S\xbf\xd9\xc6\x44\"#D\x88-I\x92\xfa\x32\xfb\xa5\x45'\xc5S\xfb\x9a\x80-\xbc~\xd7(" -"]\xc7\xe\x41\xe9Kf\xb5\xce\x1e\xae\xa1\x46\x36\x30\xfb\x19?\xcb\xeb\x7:\x82\x12\x15" -"\xa0)o\x96\x38\x15\xce\x97\xaa\x66.}\x89\x0\xdd_>0\xa8#d\xc9\xd7\x3\\\xe8\x7r\xfa" -"{\x81\x31\x41\xe7\xf4x^\x4W\x19\x9c\xbe\x95*\xb8\xaf{{j\xa8\xa0<\x90\x15\x99m\xf3" -"\x81\xf3\x88v\xc3\xc9g\x95\x1d\xfd\xcc\x3\xcf\xe5S\xecK\x5\xa8pn'\x15\x80\xef\xed" -"\x12\xc9\xf9S\xec\xd4\xe0\xe0\x63U\xd9\xb2\x4\x10\xf8\x8b\xd0U\xa7\x83\xaeN\x7f\x1f" -"\xe9\x7\xa5\xb7\xaf\xeb\x64\xf0\xea\xfd\xc6K\xad\x11Hr\n\xd6\xa5\xb3z\x8e(\xfe\xba" -")\xd2\xfb]\xbc\x11\x3\x12?k\xe7\xa0rI\xe1\x44-\xd0\x36Y\xbe\xd1_\x13\xc1~\x15\x83" -"\xce>i\xa2\xfb\x1a\x8b\xf8\r\x10\x6\x33U\xb\x8k\x93$0\x9e\xe0P\xac\x63z\xc9\x1eQ" -"\x8am\x99\xc8.\xdf\xa5\xd4\xad\x1e\x3%&\xb0z*#R\xb\x33\xf0\xa4n\"\xd4\x12+\xdb[\xcb" -"\xd1\xa6}\xc0\xd8\xe7\x2\xd5\xcf`(\x4\xc1(\xd1\xf5n\x80-C|3\xfc\x8f\xda\xdb\xc4;" -"=Q7\xa7\xc|G\xb8+G\xda|\xb4\xab\xd9\xb4\x10\x42-\xf6#\xb8\xd9\x16Q\xd4\xf6_Bc\x7" -"\x88\x2\x83-??Ugx\xba\xee\xb2\x84+\x85\xe3_\xf2=\x7G\xff\x35\xbd\x30\xd0\x4\x82\xac" -"\xa8\xdc\"}\x1b>\xcb\xd5\x98\x93\x18\xe4\x95\xc4\x4\x97\xc3\x8f(l=CH\x9b\x16\xe3" -"\x99\x0*\x86i<\xe\x61\xb4\\\x16\xcbP\xc6YU9\xd2\x65\xd6\xbbp4\xc7\xe3\x34ur\x87\x9a" -"\x99\xd6\xe9\xdf\xd3TYk`\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30" -"0000000000000000000000000000000000000000000000000000000\r00000000000000000000000" -"00000000000000000000000000000000000000000\r0000000000000000000000000000000000000" -"000000000000000000000000000\r000000000000000000000000000000000000000000000000000" -"0000000000000\r0000000000000000000000000000000000000000000000000000000000000000\r" -"0000000000000000000000000000000000000000000000000000000000000000\r00000000000000" -"00000000000000000000000000000000000000000000000000\r0000000000000000000000000000" -"000000000000000000000000000000000000\rcleartomark\n\x80\x3" -; -int n019004l_afm_len = 31595; -char* n019004l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusSanL-Bold\n" -"FullName Nimbus Sans L Bold\nFamilyName Nimbus Sans L\nWeight Bold\nItalicAngle " -"0.0\nIsFixedPitch false\nUnderlinePosition -155\nUnderlineThickness 69\nVersion " -"1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development\nEncodingSch" -"eme AdobeStandardEncoding\nFontBBox -173 -307 1003 949\nCapHeight 729\nXHeight 5" -"40\nDescender -217\nAscender 729\nStartCharMetrics 316\nC 32 ; WX 278 ; N space " -"; B 214 0 214 0 ;\nC 33 ; WX 333 ; N exclam ; B 112 0 262 726 ;\nC 34 ; WX 474 ;" -" N quotedbl ; B 50 470 424 729 ;\nC 35 ; WX 556 ; N numbersign ; B 3 -32 553 697" -" ;\nC 36 ; WX 556 ; N dollar ; B 22 -126 527 763 ;\nC 37 ; WX 889 ; N percent ; " -"B 22 -20 863 709 ;\nC 38 ; WX 722 ; N ampersand ; B 55 -23 694 723 ;\nC 39 ; WX " -"278 ; N quoteright ; B 66 469 201 729 ;\nC 40 ; WX 333 ; N parenleft ; B 40 -200" -" 303 729 ;\nC 41 ; WX 333 ; N parenright ; B 22 -200 285 729 ;\nC 42 ; WX 389 ; " -"N asterisk ; B 23 407 357 729 ;\nC 43 ; WX 584 ; N plus ; B 50 -10 533 473 ;\nC " -"44 ; WX 278 ; N comma ; B 64 -174 214 146 ;\nC 45 ; WX 333 ; N hyphen ; B 26 207" -" 298 342 ;\nC 46 ; WX 278 ; N period ; B 64 0 214 146 ;\nC 47 ; WX 278 ; N slash" -" ; B 2 -14 275 714 ;\nC 48 ; WX 556 ; N zero ; B 29 -23 517 724 ;\nC 49 ; WX 556" -" ; N one ; B 68 0 378 709 ;\nC 50 ; WX 556 ; N two ; B 30 0 515 724 ;\nC 51 ; WX" -" 556 ; N three ; B 29 -23 516 724 ;\nC 52 ; WX 556 ; N four ; B 24 0 522 709 ;\n" -"C 53 ; WX 556 ; N five ; B 27 -23 517 709 ;\nC 54 ; WX 556 ; N six ; B 32 -23 51" -"9 724 ;\nC 55 ; WX 556 ; N seven ; B 29 0 528 709 ;\nC 56 ; WX 556 ; N eight ; B" -" 22 -23 525 724 ;\nC 57 ; WX 556 ; N nine ; B 28 -24 516 724 ;\nC 58 ; WX 333 ; " -"N colon ; B 113 0 263 520 ;\nC 59 ; WX 333 ; N semicolon ; B 113 -174 263 520 ;\n" -"C 60 ; WX 584 ; N less ; B 40 -10 529 474 ;\nC 61 ; WX 584 ; N equal ; B 50 52 5" -"34 411 ;\nC 62 ; WX 584 ; N greater ; B 40 -10 529 474 ;\nC 63 ; WX 611 ; N ques" -"tion ; B 64 0 556 744 ;\nC 64 ; WX 975 ; N at ; B 27 -138 947 745 ;\nC 65 ; WX 7" -"22 ; N A ; B 26 0 703 729 ;\nC 66 ; WX 722 ; N B ; B 82 0 666 729 ;\nC 67 ; WX 7" -"22 ; N C ; B 44 -23 685 741 ;\nC 68 ; WX 722 ; N D ; B 77 0 681 729 ;\nC 69 ; WX" -" 667 ; N E ; B 79 0 624 729 ;\nC 70 ; WX 611 ; N F ; B 74 0 586 729 ;\nC 71 ; WX" -" 778 ; N G ; B 42 -23 711 741 ;\nC 72 ; WX 722 ; N H ; B 68 0 657 729 ;\nC 73 ; " -"WX 278 ; N I ; B 63 0 213 729 ;\nC 74 ; WX 556 ; N J ; B 24 -23 486 729 ;\nC 75 " -"; WX 722 ; N K ; B 74 0 717 729 ;\nC 76 ; WX 611 ; N L ; B 80 0 579 729 ;\nC 77 " -"; WX 833 ; N M ; B 66 0 776 729 ;\nC 78 ; WX 722 ; N N ; B 68 0 661 729 ;\nC 79 " -"; WX 778 ; N O ; B 40 -23 742 741 ;\nC 80 ; WX 667 ; N P ; B 76 0 633 729 ;\nC 8" -"1 ; WX 778 ; N Q ; B 43 -54 745 741 ;\nC 82 ; WX 722 ; N R ; B 80 0 677 729 ;\nC" -" 83 ; WX 667 ; N S ; B 32 -23 633 741 ;\nC 84 ; WX 611 ; N T ; B 14 0 598 729 ;\n" -"C 85 ; WX 722 ; N U ; B 76 -23 654 729 ;\nC 86 ; WX 667 ; N V ; B 24 0 647 729 ;" -"\nC 87 ; WX 944 ; N W ; B 13 0 932 729 ;\nC 88 ; WX 667 ; N X ; B 22 0 653 729 ;" -"\nC 89 ; WX 667 ; N Y ; B 27 0 650 729 ;\nC 90 ; WX 611 ; N Z ; B 30 0 578 729 ;" -"\nC 91 ; WX 333 ; N bracketleft ; B 66 -200 308 729 ;\nC 92 ; WX 278 ; N backsla" -"sh ; B -12 -14 289 714 ;\nC 93 ; WX 333 ; N bracketright ; B 18 -200 260 729 ;\n" -"C 94 ; WX 584 ; N asciicircum ; B 61 270 522 695 ;\nC 95 ; WX 556 ; N underscore" -" ; B -22 -189 578 -120 ;\nC 96 ; WX 278 ; N quoteleft ; B 67 469 202 729 ;\nC 97" -" ; WX 556 ; N a ; B 28 -23 524 549 ;\nC 98 ; WX 611 ; N b ; B 59 -23 575 729 ;\n" -"C 99 ; WX 556 ; N c ; B 34 -23 522 549 ;\nC 100 ; WX 611 ; N d ; B 29 -23 545 72" -"9 ;\nC 101 ; WX 556 ; N e ; B 22 -23 525 549 ;\nC 102 ; WX 333 ; N f ; B 14 0 31" -"3 729 ;\nC 103 ; WX 611 ; N g ; B 34 -218 541 549 ;\nC 104 ; WX 611 ; N h ; B 67" -" 0 541 729 ;\nC 105 ; WX 278 ; N i ; B 67 0 207 729 ;\nC 106 ; WX 278 ; N j ; B " -"4 -218 210 729 ;\nC 107 ; WX 556 ; N k ; B 59 0 548 729 ;\nC 108 ; WX 278 ; N l " -"; B 67 0 207 729 ;\nC 109 ; WX 889 ; N m ; B 60 0 824 549 ;\nC 110 ; WX 611 ; N " -"n ; B 63 0 546 549 ;\nC 111 ; WX 611 ; N o ; B 35 -23 569 549 ;\nC 112 ; WX 611 " -"; N p ; B 58 -218 574 549 ;\nC 113 ; WX 611 ; N q ; B 28 -218 544 549 ;\nC 114 ;" -" WX 389 ; N r ; B 63 0 370 549 ;\nC 115 ; WX 556 ; N s ; B 29 -23 520 549 ;\nC 1" -"16 ; WX 333 ; N t ; B 14 -23 301 674 ;\nC 117 ; WX 611 ; N u ; B 58 -23 541 540 " -";\nC 118 ; WX 556 ; N v ; B 14 0 536 540 ;\nC 119 ; WX 778 ; N w ; B 5 0 766 540" -" ;\nC 120 ; WX 556 ; N x ; B 16 0 535 540 ;\nC 121 ; WX 556 ; N y ; B 9 -219 538" -" 540 ;\nC 122 ; WX 500 ; N z ; B 21 0 468 540 ;\nC 123 ; WX 389 ; N braceleft ; " -"B 37 -200 317 729 ;\nC 124 ; WX 280 ; N bar ; B 100 -200 180 729 ;\nC 125 ; WX 3" -"89 ; N braceright ; B 72 -200 352 729 ;\nC 126 ; WX 584 ; N asciitilde ; B 60 14" -"2 519 314 ;\nC 161 ; WX 333 ; N exclamdown ; B 66 -186 216 540 ;\nC 162 ; WX 556" -" ; N cent ; B 36 -124 522 634 ;\nC 163 ; WX 556 ; N sterling ; B 31 -23 537 715 " -";\nC 164 ; WX 167 ; N fraction ; B -173 -20 337 715 ;\nC 165 ; WX 556 ; N yen ; " -"B 5 0 552 704 ;\nC 166 ; WX 556 ; N florin ; B 21 -220 535 744 ;\nC 167 ; WX 556" -" ; N section ; B 33 -201 518 723 ;\nC 168 ; WX 556 ; N currency ; B 26 100 530 6" -"04 ;\nC 169 ; WX 238 ; N quotesingle ; B 50 470 188 729 ;\nC 170 ; WX 500 ; N qu" -"otedblleft ; B 71 469 433 729 ;\nC 171 ; WX 556 ; N guillemotleft ; B 88 72 468 " -"481 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 83 72 250 481 ;\nC 173 ; WX 333 ; N " -"guilsinglright ; B 80 72 247 481 ;\nC 174 ; WX 611 ; N fi ; B 9 0 548 729 ;\nC 1" -"75 ; WX 611 ; N fl ; B 12 0 546 729 ;\nC 177 ; WX 556 ; N endash ; B -9 207 557 " -"311 ;\nC 178 ; WX 556 ; N dagger ; B 31 -194 523 709 ;\nC 179 ; WX 556 ; N dagge" -"rdbl ; B 28 -194 520 709 ;\nC 180 ; WX 278 ; N periodcentered ; B 64 169 188 292" -" ;\nC 182 ; WX 556 ; N paragraph ; B 19 -191 529 729 ;\nC 183 ; WX 350 ; N bulle" -"t ; B 50 175 300 425 ;\nC 184 ; WX 278 ; N quotesinglbase ; B 66 -135 201 125 ;\n" -"C 185 ; WX 500 ; N quotedblbase ; B 72 -135 432 125 ;\nC 186 ; WX 500 ; N quoted" -"blright ; B 73 469 440 729 ;\nC 187 ; WX 556 ; N guillemotright ; B 88 72 462 48" -"1 ;\nC 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;\nC 189 ; WX 1000 ; N pertho" -"usand ; B 11 -22 990 739 ;\nC 191 ; WX 611 ; N questiondown ; B 51 -204 544 540 " -";\nC 193 ; WX 333 ; N grave ; B 17 607 213 757 ;\nC 194 ; WX 333 ; N acute ; B 1" -"21 607 317 757 ;\nC 195 ; WX 333 ; N circumflex ; B 8 607 326 757 ;\nC 196 ; WX " -"333 ; N tilde ; B -9 621 345 749 ;\nC 197 ; WX 333 ; N macron ; B 16 640 315 719" -" ;\nC 198 ; WX 333 ; N breve ; B 35 605 299 748 ;\nC 199 ; WX 333 ; N dotaccent " -"; B 112 621 222 743 ;\nC 200 ; WX 333 ; N dieresis ; B 18 621 314 743 ;\nC 202 ;" -" WX 333 ; N ring ; B 77 590 257 770 ;\nC 203 ; WX 333 ; N cedilla ; B 27 -220 29" -"4 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -44 610 340 757 ;\nC 206 ; WX 333 ; N" -" ogonek ; B 45 -234 268 0 ;\nC 207 ; WX 333 ; N caron ; B 9 607 327 757 ;\nC 208" -" ; WX 1000 ; N emdash ; B -7 207 1003 311 ;\nC 225 ; WX 1000 ; N AE ; B 1 0 966 " -"729 ;\nC 227 ; WX 370 ; N ordfeminine ; B 31 262 329 729 ;\nC 232 ; WX 611 ; N L" -"slash ; B 0 0 597 729 ;\nC 233 ; WX 778 ; N Oslash ; B 31 -39 755 749 ;\nC 234 ;" -" WX 1000 ; N OE ; B 28 -23 970 741 ;\nC 235 ; WX 365 ; N ordmasculine ; B 23 262" -" 343 729 ;\nC 241 ; WX 889 ; N ae ; B 27 -24 857 549 ;\nC 245 ; WX 278 ; N dotle" -"ssi ; B 67 0 207 540 ;\nC 248 ; WX 278 ; N lslash ; B 0 0 252 729 ;\nC 249 ; WX " -"611 ; N oslash ; B 11 -38 598 557 ;\nC 250 ; WX 944 ; N oe ; B 23 -23 920 549 ;\n" -"C 251 ; WX 611 ; N germandbls ; B 67 -17 575 729 ;\nC -1 ; WX 722 ; N Udieresis " -"; B 76 -23 654 922 ;\nC -1 ; WX 722 ; N Uacute ; B 76 -23 654 936 ;\nC -1 ; WX 6" -"67 ; N Scedilla ; B 32 -220 633 741 ;\nC -1 ; WX 611 ; N Tcaron ; B 14 0 598 936" -" ;\nC -1 ; WX 667 ; N Scaron ; B 32 -23 633 936 ;\nC -1 ; WX 722 ; N Rcaron ; B " -"80 0 677 936 ;\nC -1 ; WX 722 ; N Racute ; B 80 0 677 936 ;\nC -1 ; WX 667 ; N S" -"acute ; B 32 -23 633 936 ;\nC -1 ; WX 778 ; N Otilde ; B 40 -23 742 928 ;\nC -1 " -"; WX 611 ; N ucircumflex ; B 58 -23 541 757 ;\nC -1 ; WX 778 ; N Ohungarumlaut ;" -" B 40 -23 742 936 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 76 -23 654 936 ;\nC -1 " -"; WX 667 ; N Yacute ; B 27 0 650 936 ;\nC -1 ; WX 722 ; N Eth ; B 0 0 681 729 ;\n" -"C -1 ; WX 722 ; N Dcroat ; B 0 0 681 729 ;\nC -1 ; WX 611 ; N Zacute ; B 30 0 57" -"8 936 ;\nC -1 ; WX 722 ; N Uring ; B 76 -23 654 949 ;\nC -1 ; WX 611 ; N gbreve " -"; B 34 -218 541 748 ;\nC -1 ; WX 556 ; N eogonek ; B 21 -234 525 549 ;\nC -1 ; W" -"X 556 ; N edotaccent ; B 22 -23 525 743 ;\nC -1 ; WX 556 ; N ecaron ; B 22 -23 5" -"25 757 ;\nC -1 ; WX 722 ; N Ugrave ; B 76 -23 654 936 ;\nC -1 ; WX 667 ; N Thorn" -" ; B 76 0 633 729 ;\nC -1 ; WX 556 ; N eacute ; B 22 -23 525 757 ;\nC -1 ; WX 55" -"6 ; N edieresis ; B 22 -23 525 743 ;\nC -1 ; WX 707 ; N dcaron ; B 29 -23 720 72" -"9 ;\nC -1 ; WX 556 ; N ccedilla ; B 34 -220 522 549 ;\nC -1 ; WX 556 ; N ccaron " -"; B 34 -23 522 757 ;\nC -1 ; WX 556 ; N cacute ; B 34 -23 522 757 ;\nC -1 ; WX 5" -"56 ; N aogonek ; B 28 -233 548 549 ;\nC -1 ; WX 556 ; N aring ; B 28 -23 524 770" -" ;\nC -1 ; WX 556 ; N atilde ; B 28 -23 524 749 ;\nC -1 ; WX 556 ; N abreve ; B " -"28 -23 524 748 ;\nC -1 ; WX 556 ; N egrave ; B 22 -23 525 757 ;\nC -1 ; WX 556 ;" -" N agrave ; B 28 -23 524 757 ;\nC -1 ; WX 556 ; N aacute ; B 28 -23 524 757 ;\nC" -" -1 ; WX 556 ; N adieresis ; B 28 -23 524 743 ;\nC -1 ; WX 722 ; N Uogonek ; B 7" -"6 -234 654 729 ;\nC -1 ; WX 611 ; N ugrave ; B 58 -23 541 757 ;\nC -1 ; WX 611 ;" -" N uacute ; B 58 -23 541 757 ;\nC -1 ; WX 611 ; N udieresis ; B 58 -23 541 743 ;" -"\nC -1 ; WX 385 ; N tcaron ; B 14 -23 398 829 ;\nC -1 ; WX 556 ; N scommaaccent " -"; B 29 -307 520 549 ;\nC -1 ; WX 611 ; N Zcaron ; B 30 0 578 936 ;\nC -1 ; WX 55" -"6 ; N ecircumflex ; B 22 -23 525 757 ;\nC -1 ; WX 722 ; N Ucircumflex ; B 76 -23" -" 654 936 ;\nC -1 ; WX 556 ; N acircumflex ; B 28 -23 524 757 ;\nC -1 ; WX 611 ; " -"N Zdotaccent ; B 30 0 578 922 ;\nC -1 ; WX 556 ; N scaron ; B 29 -23 520 757 ;\n" -"C -1 ; WX 722 ; N Amacron ; B 26 0 703 898 ;\nC -1 ; WX 556 ; N sacute ; B 29 -2" -"3 520 757 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 14 -307 598 729 ;\nC -1 ; WX 667" -" ; N Ydieresis ; B 27 0 650 922 ;\nC -1 ; WX 611 ; N thorn ; B 58 -218 574 729 ;" -"\nC -1 ; WX 667 ; N Emacron ; B 79 0 624 898 ;\nC -1 ; WX 778 ; N Ograve ; B 40 " -"-23 742 936 ;\nC -1 ; WX 778 ; N Oacute ; B 40 -23 742 936 ;\nC -1 ; WX 778 ; N " -"Odieresis ; B 40 -23 742 922 ;\nC -1 ; WX 722 ; N Ntilde ; B 68 0 661 928 ;\nC -" -"1 ; WX 722 ; N Ncaron ; B 68 0 661 936 ;\nC -1 ; WX 722 ; N Nacute ; B 68 0 661 " -"936 ;\nC -1 ; WX 611 ; N Lcaron ; B 80 0 579 729 ;\nC -1 ; WX 611 ; N Lacute ; B" -" 80 0 579 936 ;\nC -1 ; WX 278 ; N Idotaccent ; B 63 0 213 922 ;\nC -1 ; WX 389 " -"; N racute ; B 63 0 370 757 ;\nC -1 ; WX 278 ; N Icircumflex ; B -19 0 299 936 ;" -"\nC -1 ; WX 611 ; N ohungarumlaut ; B 35 -23 569 757 ;\nC -1 ; WX 611 ; N otilde" -" ; B 35 -23 569 749 ;\nC -1 ; WX 556 ; N Euro ; B 6 -23 546 724 ;\nC -1 ; WX 611" -" ; N ocircumflex ; B 35 -23 569 757 ;\nC -1 ; WX 351 ; N onesuperior ; B 40 284 " -"242 709 ;\nC -1 ; WX 351 ; N twosuperior ; B 16 284 328 718 ;\nC -1 ; WX 351 ; N" -" threesuperior ; B 15 271 329 718 ;\nC -1 ; WX 278 ; N Igrave ; B -10 0 213 936 " -";\nC -1 ; WX 278 ; N Iacute ; B 63 0 290 936 ;\nC -1 ; WX 278 ; N Imacron ; B 2 " -"0 274 898 ;\nC -1 ; WX 278 ; N Iogonek ; B 34 -233 237 729 ;\nC -1 ; WX 278 ; N " -"Idieresis ; B -9 0 287 922 ;\nC -1 ; WX 778 ; N Gbreve ; B 42 -23 711 927 ;\nC -" -"1 ; WX 722 ; N Umacron ; B 76 -23 654 898 ;\nC -1 ; WX 722 ; N Kcommaaccent ; B " -"74 -307 717 729 ;\nC -1 ; WX 611 ; N ograve ; B 35 -23 569 757 ;\nC -1 ; WX 667 " -"; N Scommaaccent ; B 32 -307 633 741 ;\nC -1 ; WX 667 ; N Eogonek ; B 79 -233 64" -"8 729 ;\nC -1 ; WX 611 ; N oacute ; B 35 -23 569 757 ;\nC -1 ; WX 667 ; N Edotac" -"cent ; B 79 0 624 922 ;\nC -1 ; WX 278 ; N iogonek ; B 34 -233 231 729 ;\nC -1 ;" -" WX 611 ; N gcommaaccent ; B 34 -218 541 853 ;\nC -1 ; WX 611 ; N odieresis ; B " -"35 -23 569 743 ;\nC -1 ; WX 611 ; N ntilde ; B 63 0 546 749 ;\nC -1 ; WX 611 ; N" -" ncaron ; B 63 0 546 757 ;\nC -1 ; WX 667 ; N Ecaron ; B 79 0 624 936 ;\nC -1 ; " -"WX 667 ; N Ecircumflex ; B 79 0 624 936 ;\nC -1 ; WX 556 ; N scedilla ; B 29 -22" -"0 520 549 ;\nC -1 ; WX 389 ; N rcaron ; B 54 0 372 757 ;\nC -1 ; WX 667 ; N Egra" -"ve ; B 79 0 624 936 ;\nC -1 ; WX 667 ; N Eacute ; B 79 0 624 936 ;\nC -1 ; WX 77" -"8 ; N Gcommaaccent ; B 42 -307 711 741 ;\nC -1 ; WX 722 ; N Rcommaaccent ; B 80 " -"-307 677 729 ;\nC -1 ; WX 667 ; N Edieresis ; B 79 0 624 922 ;\nC -1 ; WX 611 ; " -"N nacute ; B 63 0 546 757 ;\nC -1 ; WX 611 ; N uogonek ; B 58 -233 564 540 ;\nC " -"-1 ; WX 611 ; N umacron ; B 58 -23 541 719 ;\nC -1 ; WX 722 ; N Dcaron ; B 77 0 " -"681 936 ;\nC -1 ; WX 369 ; N lcaron ; B 67 0 382 729 ;\nC -1 ; WX 722 ; N Ccaron" -" ; B 44 -23 685 936 ;\nC -1 ; WX 722 ; N Cacute ; B 44 -23 685 936 ;\nC -1 ; WX " -"722 ; N Ccedilla ; B 44 -220 685 741 ;\nC -1 ; WX 606 ; N degree ; B 151 383 454" -" 686 ;\nC -1 ; WX 722 ; N Aogonek ; B 26 -233 723 729 ;\nC -1 ; WX 584 ; N minus" -" ; B 40 172 544 291 ;\nC -1 ; WX 584 ; N multiply ; B 79 18 505 444 ;\nC -1 ; WX" -" 584 ; N divide ; B 50 -11 534 474 ;\nC -1 ; WX 722 ; N Aring ; B 26 0 703 949 ;" -"\nC -1 ; WX 1000 ; N trademark ; B 71 273 929 729 ;\nC -1 ; WX 389 ; N rcommaacc" -"ent ; B 63 -307 370 549 ;\nC -1 ; WX 278 ; N lacute ; B 67 0 278 936 ;\nC -1 ; W" -"X 611 ; N omacron ; B 35 -23 569 719 ;\nC -1 ; WX 722 ; N Atilde ; B 26 0 703 92" -"8 ;\nC -1 ; WX 278 ; N icircumflex ; B -19 0 299 757 ;\nC -1 ; WX 278 ; N igrave" -" ; B -10 0 207 757 ;\nC -1 ; WX 611 ; N ncommaaccent ; B 63 -307 546 549 ;\nC -1" -" ; WX 278 ; N lcommaaccent ; B 67 -307 207 729 ;\nC -1 ; WX 584 ; N plusminus ; " -"B 56 -16 527 608 ;\nC -1 ; WX 869 ; N onehalf ; B 40 -20 846 715 ;\nC -1 ; WX 86" -"9 ; N onequarter ; B 40 -20 850 715 ;\nC -1 ; WX 869 ; N threequarters ; B 15 -2" -"0 850 718 ;\nC -1 ; WX 278 ; N iacute ; B 67 0 290 757 ;\nC -1 ; WX 722 ; N Abre" -"ve ; B 26 0 703 927 ;\nC -1 ; WX 556 ; N kcommaaccent ; B 59 -307 548 729 ;\nC -" -"1 ; WX 778 ; N Omacron ; B 40 -23 742 898 ;\nC -1 ; WX 278 ; N imacron ; B 7 0 2" -"66 719 ;\nC -1 ; WX 556 ; N emacron ; B 22 -23 525 719 ;\nC -1 ; WX 556 ; N amac" -"ron ; B 28 -23 524 719 ;\nC -1 ; WX 333 ; N tcommaaccent ; B 14 -307 301 674 ;\n" -"C -1 ; WX 556 ; N ydieresis ; B 9 -219 538 743 ;\nC -1 ; WX 500 ; N zdotaccent ;" -" B 21 0 468 743 ;\nC -1 ; WX 500 ; N zcaron ; B 21 0 468 757 ;\nC -1 ; WX 500 ; " -"N zacute ; B 21 0 468 757 ;\nC -1 ; WX 556 ; N yacute ; B 9 -219 538 757 ;\nC -1" -" ; WX 611 ; N uhungarumlaut ; B 58 -23 559 757 ;\nC -1 ; WX 611 ; N eth ; B 35 -" -"23 569 744 ;\nC -1 ; WX 611 ; N uring ; B 58 -23 541 770 ;\nC -1 ; WX 778 ; N Oc" -"ircumflex ; B 40 -23 742 936 ;\nC -1 ; WX 333 ; N commaaccent ; B 112 -307 234 -" -"60 ;\nC -1 ; WX 737 ; N copyright ; B -14 -22 751 743 ;\nC -1 ; WX 737 ; N regis" -"tered ; B -14 -22 751 743 ;\nC -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ;\nC" -" -1 ; WX 278 ; N idieresis ; B -9 0 287 743 ;\nC -1 ; WX 489 ; N lozenge ; B 16 " -"0 462 744 ;\nC -1 ; WX 729 ; N Delta ; B 8 0 721 729 ;\nC -1 ; WX 548 ; N notequ" -"al ; B 50 -69 534 528 ;\nC -1 ; WX 542 ; N radical ; B 7 -36 512 913 ;\nC -1 ; W" -"X 722 ; N Agrave ; B 26 0 703 936 ;\nC -1 ; WX 722 ; N Aacute ; B 26 0 703 936 ;" -"\nC -1 ; WX 584 ; N lessequal ; B 45 -10 534 639 ;\nC -1 ; WX 584 ; N greaterequ" -"al ; B 45 -10 534 639 ;\nC -1 ; WX 584 ; N logicalnot ; B 40 86 544 375 ;\nC -1 " -"; WX 711 ; N summation ; B 17 -96 694 760 ;\nC -1 ; WX 490 ; N partialdiff ; B 2" -"2 -15 458 750 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 68 -307 661 729 ;\nC -1 ; WX" -" 611 ; N dcroat ; B 29 -23 605 729 ;\nC -1 ; WX 280 ; N brokenbar ; B 100 -200 1" -"80 729 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 80 -307 579 729 ;\nC -1 ; WX 722 ; " -"N Adieresis ; B 26 0 703 922 ;\nC -1 ; WX 611 ; N mu ; B 58 -220 573 540 ;\nC -1" -" ; WX 278 ; N .notdef ; B 214 0 214 0 ;\nEndCharMetrics\nStartKernData\nStartKer" -"nPairs 998\nKPX A C -33\nKPX A Ccedilla -33\nKPX A G -35\nKPX A O -34\nKPX A Odi" -"eresis -34\nKPX A Q -35\nKPX A T -81\nKPX A U -32\nKPX A Uacute -32\nKPX A Ucirc" -"umflex -32\nKPX A Udieresis -32\nKPX A Ugrave -32\nKPX A V -66\nKPX A W -51\nKPX" -" A Y -90\nKPX A a -1\nKPX A b -1\nKPX A c -14\nKPX A ccedilla -14\nKPX A comma 1" -"9\nKPX A d -13\nKPX A e -9\nKPX A g -14\nKPX A guillemotleft -43\nKPX A guilsing" -"lleft -40\nKPX A hyphen 7\nKPX A o -16\nKPX A period 19\nKPX A q -12\nKPX A quot" -"edblright -65\nKPX A quoteright -61\nKPX A t -18\nKPX A u -12\nKPX A v -37\nKPX " -"A w -23\nKPX A y -35\nKPX Aacute C -33\nKPX Aacute G -35\nKPX Aacute O -34\nKPX " -"Aacute Q -35\nKPX Aacute T -81\nKPX Aacute U -32\nKPX Aacute V -66\nKPX Aacute W" -" -51\nKPX Aacute Y -90\nKPX Aacute a -1\nKPX Aacute b -1\nKPX Aacute c -14\nKPX " -"Aacute comma 19\nKPX Aacute d -13\nKPX Aacute e -9\nKPX Aacute g -14\nKPX Aacute" -" guillemotleft -43\nKPX Aacute guilsinglleft -40\nKPX Aacute hyphen 7\nKPX Aacut" -"e o -16\nKPX Aacute period 19\nKPX Aacute q -12\nKPX Aacute quoteright -61\nKPX " -"Aacute t -18\nKPX Aacute u -12\nKPX Aacute v -37\nKPX Aacute w -23\nKPX Aacute y" -" -35\nKPX Acircumflex C -33\nKPX Acircumflex G -35\nKPX Acircumflex O -34\nKPX A" -"circumflex Q -35\nKPX Acircumflex T -81\nKPX Acircumflex U -32\nKPX Acircumflex " -"V -66\nKPX Acircumflex W -51\nKPX Acircumflex Y -90\nKPX Acircumflex comma 19\nK" -"PX Acircumflex period 19\nKPX Adieresis C -33\nKPX Adieresis G -35\nKPX Adieresi" -"s O -34\nKPX Adieresis Q -35\nKPX Adieresis T -81\nKPX Adieresis U -32\nKPX Adie" -"resis V -66\nKPX Adieresis W -51\nKPX Adieresis Y -90\nKPX Adieresis a -1\nKPX A" -"dieresis b -1\nKPX Adieresis c -14\nKPX Adieresis comma 19\nKPX Adieresis d -13\n" -"KPX Adieresis g -14\nKPX Adieresis guillemotleft -43\nKPX Adieresis guilsingllef" -"t -40\nKPX Adieresis hyphen 7\nKPX Adieresis o -16\nKPX Adieresis period 19\nKPX" -" Adieresis q -12\nKPX Adieresis quotedblright -65\nKPX Adieresis quoteright -61\n" -"KPX Adieresis t -18\nKPX Adieresis u -12\nKPX Adieresis v -37\nKPX Adieresis w -" -"23\nKPX Adieresis y -35\nKPX Agrave C -33\nKPX Agrave G -35\nKPX Agrave O -34\nK" -"PX Agrave Q -35\nKPX Agrave T -81\nKPX Agrave U -32\nKPX Agrave V -66\nKPX Agrav" -"e W -51\nKPX Agrave Y -90\nKPX Agrave comma 19\nKPX Agrave period 19\nKPX Aring " -"C -33\nKPX Aring G -35\nKPX Aring O -34\nKPX Aring Q -35\nKPX Aring T -81\nKPX A" -"ring U -32\nKPX Aring V -66\nKPX Aring W -51\nKPX Aring Y -90\nKPX Aring a -1\nK" -"PX Aring b -1\nKPX Aring c -14\nKPX Aring comma 19\nKPX Aring d -13\nKPX Aring e" -" -9\nKPX Aring g -14\nKPX Aring guillemotleft -43\nKPX Aring guilsinglleft -40\n" -"KPX Aring hyphen 7\nKPX Aring o -16\nKPX Aring period 19\nKPX Aring q -12\nKPX A" -"ring quotedblright -65\nKPX Aring quoteright -61\nKPX Aring t -18\nKPX Aring u -" -"12\nKPX Aring v -37\nKPX Aring w -23\nKPX Aring y -35\nKPX Atilde C -33\nKPX Ati" -"lde G -35\nKPX Atilde O -34\nKPX Atilde Q -35\nKPX Atilde T -81\nKPX Atilde U -3" -"2\nKPX Atilde V -66\nKPX Atilde W -51\nKPX Atilde Y -90\nKPX Atilde comma 19\nKP" -"X Atilde period 19\nKPX B A -32\nKPX B AE -20\nKPX B Aacute -32\nKPX B Acircumfl" -"ex -32\nKPX B Adieresis -32\nKPX B Aring -32\nKPX B Atilde -32\nKPX B O -11\nKPX" -" B OE -2\nKPX B Oacute -11\nKPX B Ocircumflex -11\nKPX B Odieresis -11\nKPX B Og" -"rave -11\nKPX B Oslash -5\nKPX B V -39\nKPX B W -27\nKPX B Y -51\nKPX C A -29\nK" -"PX C AE -17\nKPX C Aacute -29\nKPX C Adieresis -29\nKPX C Aring -29\nKPX C H 5\n" -"KPX C K 2\nKPX C O -6\nKPX C Oacute -6\nKPX C Odieresis -6\nKPX Ccedilla A -28\n" -"KPX D A -37\nKPX D Aacute -37\nKPX D Acircumflex -37\nKPX D Adieresis -37\nKPX D" -" Agrave -37\nKPX D Aring -37\nKPX D Atilde -37\nKPX D J 2\nKPX D T -17\nKPX D V " -"-35\nKPX D W -20\nKPX D X -35\nKPX D Y -56\nKPX F A -63\nKPX F Aacute -63\nKPX F" -" Acircumflex -63\nKPX F Adieresis -63\nKPX F Agrave -63\nKPX F Aring -63\nKPX F " -"Atilde -63\nKPX F J -25\nKPX F O -16\nKPX F Odieresis -16\nKPX F a -15\nKPX F aa" -"cute -15\nKPX F adieresis -15\nKPX F ae -17\nKPX F aring -15\nKPX F comma -76\nK" -"PX F e -7\nKPX F eacute -7\nKPX F hyphen 11\nKPX F i -7\nKPX F j -9\nKPX F o -14" -"\nKPX F oacute -14\nKPX F odieresis -14\nKPX F oe -8\nKPX F oslash -15\nKPX F pe" -"riod -75\nKPX F r -27\nKPX F u -24\nKPX G A -8\nKPX G AE 4\nKPX G Aacute -8\nKPX" -" G Acircumflex -8\nKPX G Adieresis -8\nKPX G Agrave -8\nKPX G Aring -8\nKPX G At" -"ilde -8\nKPX G T -17\nKPX G V -36\nKPX G W -20\nKPX G Y -56\nKPX J A -32\nKPX J " -"AE -20\nKPX J Adieresis -32\nKPX J Aring -32\nKPX K C -53\nKPX K G -55\nKPX K O " -"-54\nKPX K OE -44\nKPX K Oacute -54\nKPX K Odieresis -54\nKPX K S -30\nKPX K T 1" -"3\nKPX K a -3\nKPX K adieresis -3\nKPX K ae 0\nKPX K aring -3\nKPX K e -25\nKPX " -"K hyphen -44\nKPX K o -33\nKPX K oacute -33\nKPX K odieresis -33\nKPX K u -23\nK" -"PX K udieresis -23\nKPX K y -65\nKPX L A 9\nKPX L AE 21\nKPX L Aacute 9\nKPX L A" -"dieresis 9\nKPX L Aring 9\nKPX L C -26\nKPX L Ccedilla -26\nKPX L G -30\nKPX L O" -" -29\nKPX L Oacute -29\nKPX L Ocircumflex -29\nKPX L Odieresis -29\nKPX L Ograve" -" -29\nKPX L Otilde -29\nKPX L S -2\nKPX L T -95\nKPX L U -24\nKPX L Udieresis -2" -"4\nKPX L V -90\nKPX L W -68\nKPX L Y -112\nKPX L hyphen -12\nKPX L quotedblright" -" -141\nKPX L quoteright -138\nKPX L u -7\nKPX L udieresis -7\nKPX L y -55\nKPX N" -" A -5\nKPX N AE 7\nKPX N Aacute -5\nKPX N Adieresis -5\nKPX N Aring -5\nKPX N C " -"9\nKPX N Ccedilla 9\nKPX N G 8\nKPX N O 8\nKPX N Oacute 8\nKPX N Odieresis 8\nKP" -"X N a 13\nKPX N aacute 13\nKPX N adieresis 13\nKPX N ae 13\nKPX N aring 13\nKPX " -"N comma 15\nKPX N e 18\nKPX N eacute 18\nKPX N o 11\nKPX N oacute 11\nKPX N odie" -"resis 11\nKPX N oslash 11\nKPX N period 16\nKPX N u 12\nKPX N udieresis 12\nKPX " -"O A -37\nKPX O AE -26\nKPX O Aacute -37\nKPX O Adieresis -37\nKPX O Aring -37\nK" -"PX O T -20\nKPX O V -36\nKPX O W -21\nKPX O X -36\nKPX O Y -59\nKPX Oacute A -37" -"\nKPX Oacute T -20\nKPX Oacute V -36\nKPX Oacute W -21\nKPX Oacute Y -59\nKPX Oc" -"ircumflex T -20\nKPX Ocircumflex V -36\nKPX Ocircumflex Y -59\nKPX Odieresis A -" -"37\nKPX Odieresis T -20\nKPX Odieresis V -36\nKPX Odieresis W -21\nKPX Odieresis" -" X -36\nKPX Odieresis Y -59\nKPX Ograve T -20\nKPX Ograve V -36\nKPX Ograve Y -5" -"9\nKPX Oslash A -32\nKPX Otilde T -20\nKPX Otilde V -36\nKPX Otilde Y -59\nKPX P" -" A -65\nKPX P AE -54\nKPX P Aacute -65\nKPX P Adieresis -65\nKPX P Aring -65\nKP" -"X P J -44\nKPX P a -7\nKPX P aacute -7\nKPX P adieresis -7\nKPX P ae -8\nKPX P a" -"ring -7\nKPX P comma -94\nKPX P e -8\nKPX P eacute -8\nKPX P hyphen 0\nKPX P o -" -"14\nKPX P oacute -14\nKPX P odieresis -14\nKPX P oe -8\nKPX P oslash -17\nKPX P " -"period -94\nKPX R C -5\nKPX R Ccedilla -5\nKPX R G -6\nKPX R O -6\nKPX R OE 3\nK" -"PX R Oacute -6\nKPX R Odieresis -6\nKPX R T 0\nKPX R U -4\nKPX R Udieresis -4\nK" -"PX R V -26\nKPX R W -17\nKPX R Y -37\nKPX R a 0\nKPX R aacute 0\nKPX R adieresis" -" 0\nKPX R ae 0\nKPX R aring 0\nKPX R e 2\nKPX R eacute 2\nKPX R hyphen 15\nKPX R" -" o -4\nKPX R oacute -4\nKPX R odieresis -4\nKPX R oe 1\nKPX R u 0\nKPX R uacute " -"0\nKPX R udieresis 0\nKPX R y 5\nKPX S A -20\nKPX S AE -8\nKPX S Aacute -20\nKPX" -" S Adieresis -20\nKPX S Aring -20\nKPX S T -5\nKPX S V -31\nKPX S W -17\nKPX S Y" -" -43\nKPX S t 1\nKPX T A -87\nKPX T AE -75\nKPX T Aacute -87\nKPX T Acircumflex " -"-87\nKPX T Adieresis -87\nKPX T Agrave -87\nKPX T Aring -87\nKPX T Atilde -87\nK" -"PX T C -20\nKPX T G -22\nKPX T J -87\nKPX T O -22\nKPX T OE -11\nKPX T Oacute -2" -"2\nKPX T Ocircumflex -22\nKPX T Odieresis -22\nKPX T Ograve -22\nKPX T Oslash -2" -"3\nKPX T Otilde -22\nKPX T S 3\nKPX T V 18\nKPX T W 24\nKPX T Y 16\nKPX T a -73\n" -"KPX T ae -73\nKPX T c -74\nKPX T colon -97\nKPX T comma -67\nKPX T e -69\nKPX T " -"g -75\nKPX T guillemotleft -101\nKPX T guilsinglleft -98\nKPX T hyphen -48\nKPX " -"T i -1\nKPX T j -3\nKPX T o -76\nKPX T oslash -73\nKPX T period -67\nKPX T r -71" -"\nKPX T s -74\nKPX T semicolon -98\nKPX T u -72\nKPX T v -82\nKPX T w -77\nKPX T" -" y -80\nKPX U A -34\nKPX U AE -22\nKPX U Aacute -34\nKPX U Acircumflex -34\nKPX " -"U Adieresis -34\nKPX U Aring -34\nKPX U Atilde -34\nKPX U comma -7\nKPX U m 6\nK" -"PX U n 5\nKPX U p 7\nKPX U period -4\nKPX U r 5\nKPX Uacute A -34\nKPX Uacute co" -"mma -7\nKPX Uacute m 6\nKPX Uacute n 5\nKPX Uacute p 7\nKPX Uacute period -4\nKP" -"X Uacute r 5\nKPX Ucircumflex A -34\nKPX Udieresis A -34\nKPX Udieresis b 6\nKPX" -" Udieresis comma -7\nKPX Udieresis m 6\nKPX Udieresis n 5\nKPX Udieresis p 7\nKP" -"X Udieresis period -4\nKPX Udieresis r 5\nKPX Ugrave A -34\nKPX V A -71\nKPX V A" -"E -59\nKPX V Aacute -71\nKPX V Acircumflex -71\nKPX V Adieresis -71\nKPX V Agrav" -"e -71\nKPX V Aring -71\nKPX V Atilde -71\nKPX V C -36\nKPX V G -38\nKPX V O -37\n" -"KPX V Oacute -37\nKPX V Ocircumflex -37\nKPX V Odieresis -37\nKPX V Ograve -37\n" -"KPX V Oslash -31\nKPX V Otilde -37\nKPX V S -21\nKPX V T 21\nKPX V a -47\nKPX V " -"ae -48\nKPX V colon -65\nKPX V comma -69\nKPX V e -43\nKPX V g -49\nKPX V guille" -"motleft -74\nKPX V guilsinglleft -72\nKPX V hyphen -21\nKPX V i -5\nKPX V o -50\n" -"KPX V oslash -48\nKPX V period -69\nKPX V r -34\nKPX V semicolon -67\nKPX V u -3" -"4\nKPX V y -10\nKPX W A -54\nKPX W AE -43\nKPX W Aacute -54\nKPX W Acircumflex -" -"54\nKPX W Adieresis -54\nKPX W Agrave -54\nKPX W Aring -54\nKPX W Atilde -54\nKP" -"X W C -20\nKPX W G -22\nKPX W O -21\nKPX W Oacute -21\nKPX W Ocircumflex -21\nKP" -"X W Odieresis -21\nKPX W Ograve -21\nKPX W Oslash -15\nKPX W Otilde -21\nKPX W S" -" -12\nKPX W T 25\nKPX W a -29\nKPX W ae -29\nKPX W colon -53\nKPX W comma -45\nK" -"PX W e -24\nKPX W g -30\nKPX W guillemotleft -55\nKPX W guilsinglleft -53\nKPX W" -" hyphen -3\nKPX W i -1\nKPX W o -31\nKPX W oslash -29\nKPX W period -45\nKPX W r" -" -24\nKPX W semicolon -54\nKPX W u -23\nKPX W y 0\nKPX X C -34\nKPX X O -35\nKPX" -" X Odieresis -35\nKPX X Q -37\nKPX X a -5\nKPX X e -25\nKPX X hyphen -27\nKPX X " -"o -32\nKPX X u -25\nKPX X y -40\nKPX Y A -86\nKPX Y AE -74\nKPX Y Aacute -86\nKP" -"X Y Acircumflex -86\nKPX Y Adieresis -86\nKPX Y Agrave -86\nKPX Y Aring -86\nKPX" -" Y Atilde -86\nKPX Y C -52\nKPX Y G -54\nKPX Y O -54\nKPX Y Oacute -54\nKPX Y Oc" -"ircumflex -54\nKPX Y Odieresis -54\nKPX Y Ograve -54\nKPX Y Oslash -47\nKPX Y Ot" -"ilde -54\nKPX Y S -29\nKPX Y T 22\nKPX Y a -66\nKPX Y ae -67\nKPX Y colon -81\nK" -"PX Y comma -78\nKPX Y e -63\nKPX Y g -68\nKPX Y guillemotleft -98\nKPX Y guilsin" -"glleft -96\nKPX Y hyphen -50\nKPX Y i -3\nKPX Y o -70\nKPX Y oslash -67\nKPX Y p" -" -45\nKPX Y period -78\nKPX Y semicolon -83\nKPX Y u -48\nKPX Y v -27\nKPX Z v -" -"11\nKPX Z y -9\nKPX a j -1\nKPX a quoteright -11\nKPX a v -19\nKPX a w -5\nKPX a" -" y -17\nKPX aacute v -19\nKPX aacute w -5\nKPX aacute y -17\nKPX adieresis v -19" -"\nKPX adieresis w -5\nKPX adieresis y -17\nKPX ae v -21\nKPX ae w -7\nKPX ae y -" -"19\nKPX agrave v -19\nKPX agrave w -5\nKPX agrave y -17\nKPX aring v -19\nKPX ar" -"ing w -5\nKPX aring y -17\nKPX b v -20\nKPX b w -7\nKPX b y -20\nKPX c h 0\nKPX " -"c k 3\nKPX comma one -73\nKPX comma quotedblright -33\nKPX comma quoteright -30\n" -"KPX e quoteright -12\nKPX e t -4\nKPX e v -19\nKPX e w -6\nKPX e x -21\nKPX e y " -"-17\nKPX eacute v -19\nKPX eacute w -6\nKPX eacute y -17\nKPX ecircumflex v -19\n" -"KPX ecircumflex w -6\nKPX ecircumflex y -17\nKPX eight four 10\nKPX eight one -2" -"3\nKPX eight seven -6\nKPX f a 1\nKPX f aacute 1\nKPX f adieresis 1\nKPX f ae 0\n" -"KPX f aring 1\nKPX f e -3\nKPX f eacute -3\nKPX f f 21\nKPX f i -3\nKPX f j -6\n" -"KPX f l -3\nKPX f o -9\nKPX f oacute -9\nKPX f odieresis -9\nKPX f oe -3\nKPX f " -"oslash -9\nKPX f quoteright 10\nKPX f s -1\nKPX f t 21\nKPX five four 6\nKPX fiv" -"e one -29\nKPX five seven -10\nKPX four four 9\nKPX four one -50\nKPX four seven" -" -28\nKPX g a 3\nKPX g adieresis 3\nKPX g ae 3\nKPX g aring 3\nKPX g e 8\nKPX g " -"eacute 8\nKPX g l 0\nKPX g oacute 1\nKPX g odieresis 1\nKPX g r 1\nKPX guillemot" -"right A -51\nKPX guillemotright AE -39\nKPX guillemotright Aacute -51\nKPX guill" -"emotright Adieresis -51\nKPX guillemotright Aring -51\nKPX guillemotright T -108" -"\nKPX guillemotright V -78\nKPX guillemotright W -60\nKPX guillemotright Y -111\n" -"KPX guilsinglright A -46\nKPX guilsinglright AE -35\nKPX guilsinglright Aacute -" -"46\nKPX guilsinglright Adieresis -46\nKPX guilsinglright Aring -46\nKPX guilsing" -"lright T -104\nKPX guilsinglright V -74\nKPX guilsinglright W -56\nKPX guilsingl" -"right Y -107\nKPX h quoteright -14\nKPX h y -21\nKPX hyphen A -1\nKPX hyphen AE " -"10\nKPX hyphen Aacute -1\nKPX hyphen Adieresis -1\nKPX hyphen Aring -1\nKPX hyph" -"en T -57\nKPX hyphen V -27\nKPX hyphen W -9\nKPX hyphen Y -64\nKPX i T -4\nKPX i" -" j -2\nKPX k a -2\nKPX k aacute -2\nKPX k adieresis -2\nKPX k ae 1\nKPX k aring " -"-2\nKPX k comma 7\nKPX k e -15\nKPX k eacute -15\nKPX k g -21\nKPX k hyphen -25\n" -"KPX k o -22\nKPX k oacute -22\nKPX k odieresis -22\nKPX k period 6\nKPX k s -10\n" -"KPX k u -1\nKPX k udieresis -1\nKPX l v -5\nKPX l y -2\nKPX m p 6\nKPX m v -19\n" -"KPX m w -6\nKPX m y -18\nKPX n T -80\nKPX n p 5\nKPX n quoteright -12\nKPX n v -" -"20\nKPX n w -7\nKPX n y -19\nKPX nine four 4\nKPX nine one -21\nKPX nine seven -" -"17\nKPX o T -84\nKPX o quoteright -17\nKPX o t -8\nKPX o v -23\nKPX o w -10\nKPX" -" o x -25\nKPX o y -22\nKPX oacute v -23\nKPX oacute w -10\nKPX oacute y -22\nKPX" -" ocircumflex t -8\nKPX odieresis t -8\nKPX odieresis v -23\nKPX odieresis w -10\n" -"KPX odieresis x -25\nKPX odieresis y -22\nKPX ograve v -23\nKPX ograve w -10\nKP" -"X ograve y -22\nKPX one comma -42\nKPX one eight -37\nKPX one five -43\nKPX one " -"four -56\nKPX one nine -39\nKPX one one -85\nKPX one period -42\nKPX one seven -" -"65\nKPX one six -37\nKPX one three -44\nKPX one two -47\nKPX one zero -34\nKPX p" -" t -5\nKPX p y -20\nKPX period one -73\nKPX period quotedblright -32\nKPX period" -" quoteright -29\nKPX q c 4\nKPX q u 4\nKPX quotedblbase A 12\nKPX quotedblbase A" -"E 24\nKPX quotedblbase T -75\nKPX quotedblbase V -73\nKPX quotedblbase W -51\nKP" -"X quotedblbase Y -92\nKPX quotedblleft A -68\nKPX quotedblleft AE -57\nKPX quote" -"dblleft Aacute -68\nKPX quotedblleft Adieresis -68\nKPX quotedblleft Aring -68\n" -"KPX quotedblleft T -2\nKPX quotedblleft V 6\nKPX quotedblleft W 16\nKPX quotedbl" -"left Y -9\nKPX quotedblright A -69\nKPX quotedblright AE -57\nKPX quotedblright " -"Aacute -69\nKPX quotedblright Adieresis -69\nKPX quotedblright Aring -69\nKPX qu" -"otedblright T 1\nKPX quotedblright V 7\nKPX quotedblright W 17\nKPX quotedblrigh" -"t Y -7\nKPX quoteleft A -73\nKPX quoteleft AE -62\nKPX quoteleft Aacute -73\nKPX" -" quoteleft Adieresis -73\nKPX quoteleft Aring -73\nKPX quoteleft T -7\nKPX quote" -"left V 2\nKPX quoteleft W 11\nKPX quoteleft Y -13\nKPX quoteright A -77\nKPX quo" -"teright AE -66\nKPX quoteright Aacute -77\nKPX quoteright Adieresis -77\nKPX quo" -"teright Aring -77\nKPX quoteright comma -46\nKPX quoteright d -27\nKPX quoterigh" -"t o -30\nKPX quoteright period -45\nKPX quoteright r -15\nKPX quoteright s -22\n" -"KPX quoteright t -4\nKPX quoteright v -5\nKPX quoteright w 1\nKPX quoteright y -" -"3\nKPX r a 6\nKPX r aacute 6\nKPX r acircumflex 6\nKPX r adieresis 6\nKPX r ae 4" -"\nKPX r agrave 6\nKPX r aring 6\nKPX r c 0\nKPX r ccedilla 0\nKPX r colon -27\nK" -"PX r comma -57\nKPX r d 0\nKPX r e 4\nKPX r eacute 4\nKPX r ecircumflex 4\nKPX r" -" egrave 4\nKPX r f 22\nKPX r g -2\nKPX r h -4\nKPX r hyphen -35\nKPX r i -4\nKPX" -" r j -6\nKPX r k 0\nKPX r l -4\nKPX r m -1\nKPX r n -2\nKPX r o -1\nKPX r oacute" -" -1\nKPX r ocircumflex -1\nKPX r odieresis -1\nKPX r oe 5\nKPX r ograve -1\nKPX " -"r oslash -4\nKPX r p 0\nKPX r period -57\nKPX r q 1\nKPX r quoteright 14\nKPX r " -"r -2\nKPX r s 3\nKPX r semicolon -27\nKPX r t 22\nKPX r u 0\nKPX r v 21\nKPX r w" -" 26\nKPX r x 17\nKPX r y 23\nKPX r z 9\nKPX s quoteright -12\nKPX s t -1\nKPX se" -"ven colon -63\nKPX seven comma -88\nKPX seven eight -3\nKPX seven five -21\nKPX " -"seven four -62\nKPX seven one -14\nKPX seven period -87\nKPX seven seven 9\nKPX " -"seven six -13\nKPX seven three 0\nKPX seven two -4\nKPX six four 7\nKPX six one " -"-21\nKPX six seven -3\nKPX t S 0\nKPX t a 6\nKPX t aacute 6\nKPX t adieresis 6\n" -"KPX t ae 7\nKPX t aring 6\nKPX t colon -25\nKPX t e -3\nKPX t eacute -3\nKPX t h" -" 2\nKPX t o -10\nKPX t oacute -10\nKPX t odieresis -10\nKPX t quoteright 4\nKPX " -"t semicolon -25\nKPX three four 6\nKPX three one -27\nKPX three seven -10\nKPX t" -"wo four -9\nKPX two one -16\nKPX two seven -3\nKPX u quoteright -2\nKPX v a -15\n" -"KPX v aacute -15\nKPX v acircumflex -15\nKPX v adieresis -15\nKPX v ae -16\nKPX " -"v agrave -15\nKPX v aring -15\nKPX v atilde -15\nKPX v c -20\nKPX v colon -32\nK" -"PX v comma -51\nKPX v e -15\nKPX v eacute -15\nKPX v ecircumflex -15\nKPX v egra" -"ve -15\nKPX v g -21\nKPX v hyphen 0\nKPX v l -5\nKPX v o -22\nKPX v oacute -22\n" -"KPX v odieresis -22\nKPX v ograve -22\nKPX v oslash -20\nKPX v period -50\nKPX v" -" s -17\nKPX v semicolon -34\nKPX w a -7\nKPX w aacute -7\nKPX w acircumflex -7\n" -"KPX w adieresis -7\nKPX w ae -8\nKPX w agrave -7\nKPX w aring -7\nKPX w atilde -" -"7\nKPX w c -8\nKPX w colon -27\nKPX w comma -33\nKPX w e -3\nKPX w eacute -3\nKP" -"X w ecircumflex -3\nKPX w egrave -3\nKPX w g -9\nKPX w hyphen 11\nKPX w l -1\nKP" -"X w o -10\nKPX w oacute -10\nKPX w odieresis -10\nKPX w ograve -10\nKPX w oslash" -" -8\nKPX w period -32\nKPX w s -9\nKPX w semicolon -29\nKPX x a -9\nKPX x c -22\n" -"KPX x e -17\nKPX x eacute -17\nKPX x o -24\nKPX x q -20\nKPX y a -14\nKPX y aacu" -"te -14\nKPX y acircumflex -14\nKPX y adieresis -14\nKPX y ae -15\nKPX y agrave -" -"14\nKPX y aring -14\nKPX y atilde -14\nKPX y c -21\nKPX y colon -31\nKPX y comma" -" -51\nKPX y e -16\nKPX y eacute -16\nKPX y ecircumflex -16\nKPX y egrave -16\nKP" -"X y g -21\nKPX y hyphen 0\nKPX y l -4\nKPX y o -22\nKPX y oacute -22\nKPX y odie" -"resis -22\nKPX y ograve -22\nKPX y oslash -20\nKPX y period -50\nKPX y s -16\nKP" -"X y semicolon -33\nKPX zero four 5\nKPX zero one -19\nKPX zero seven -10\nEndKer" -"nPairs\nEndKernData\nEndFontMetrics\n" -; -int n019004l_pfb_len = 35941; -char* n019004l_pfb = -"\x80\x1W\x6\x0\x0%!PS-AdobeFont-1.0: NimbusSanL-Bold 1.05\n%%CreationDate: Wed D" -"ec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development\n" -"% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPYING" -" (GNU General Public License) for license conditions.\n% As a special exception," -" permission is granted to include this font\n% program in a Postscript or PDF fi" -"le that consists of a document that\n% contains text to be displayed or printed " -"using this font, regardless\n% of the conditions or license applying to the docu" -"ment itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) readon" -"ly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the" -" file COPYING (GNU General Public License) for license conditions. As a special " -"exception, permission is granted to include this font program in a Postscript or" -" PDF file that consists of a document that contains text to be displayed or prin" -"ted using this font, regardless of the conditions or license applying to the doc" -"ument itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by (UR" -"W)++ Design & Development) readonly def\n/FullName (Nimbus Sans L Bold) readonly" -" def\n/FamilyName (Nimbus Sans L) readonly def\n/Weight (Bold) readonly def\n/It" -"alicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -155 def\n/Underl" -"ineThickness 69 def\nend readonly def\n/FontName /NimbusSanL-Bold def\n/PaintTyp" -"e 0 def\n/WMode 0 def\n/FontBBox {-173 -307 1003 949} readonly def\n/FontType 1 " -"def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding StandardE" -"ncoding def\n/UniqueID 5020904 def\ncurrentdict end\ncurrentfile eexec\r\x80\x2\xe6" -"\x83\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93" -"\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6" -"\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd" -"fA-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e" -"\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9d" -"n\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13" -"\x1d\xee\x0[AX\x5\xa1m\x8a\x12>ne\x92\xe5\xa3\xb7\x9fh\xc9m\x82\x10\xcd\x36\xcf\x35" -"tL=7By#m\xea\xae\x63wW\xf3\x15\xa4\x1{\xcd\xaa\x87\xb0\x15\xf5\xc6\xb4\xcb\x91\xd4" -"\xeeG\xf0\x38nq.!\x98^1&\xd9:K4!}\xd5U\xe\xb0\xb6qR\x96\x18\x85[\xd1\xbe\xfa'n\x4" -"\x19\x84\xa6\xcf\xd7_\x9a\xf3\xbd\xf3\x92\xa7\xf8\xcf\xa3\xe2\x9c\x8\x10\x2\xe7\x41" -"\x99{\xfb\x13\xcez\xee\xb8\x99\xc/\xa6\x7f\xc\xc1\x95\xbc\xe6\xdbQ\xce\xa8\xc5\x15" -"6y\xe2k\xc8wb\xe0\xff\xf5Q\\e@\x7\xacL\x90\xedo\x4\xf9\x7\xf7\xea\"\xc3\xc7\x80\xe5" -"*\xa2\xc6\x83W\x9c\x30K\xcb\x44\x86T\x99\xa7Z~\x86\x83\x43\x32\x35\xcf<\x12\xb0+" -"cv\xd0n\x16\xd2H%\x9b\xd7\x83\xa4\x91\x8f^\xd7\x8b\x17\xbe\xbd\x14\xf2 \x9(\x14\xb4" -"\xaf\xf6\xb7\x36S\xe0\x63|>T\x9\xd0+\xc6\x84\xac\xe7\xaaO\x12#^-\x15Q:\xb0\xe4\xa2" -"\xfN0\xbar&\xec\x15\xc5\x8\xcf\x10\xd9\xc8\x1b\x66\xf4\xd7\xa9\xb.4\x1fk\rw\xc8\xa2" -"2\xf3\xa2\xc9\x9a\x66SLj\xef-\x13\xf@?\xbe\n\xcbgO\xed b\xac\x98\x9b\xb6\xb8\x81" -"\x9c\xc8\x46\x1fP\xe6\x8\xea\x96\xf4\xcf\xd2'x\xba\x9d\x12\xad\x84\xc0\xdcx\xf7\x0" -"\x94\xba\xef\xe5\x8c\xd1\x85\xcf\x96\x98\xfbh\xe7\x83I\x4\xe6L\xbc\"V\xf8\xdd\x10" -"$\xbd\x80\xd5G\x17M\xda\xa1G|h\xac\xa8\xf2\x7fz\x2\xc5\x14g!6\xa0\x8\xe1\x90\x64" -"\xd5Tk-\xde\x6\x1c\xef\x1f\xc6\xe8\x96\nM\x83\x64\xcb\xf2^C\x93\x36\x36(\xfd\x15" -"\x92\xbf\xc5\xc5\xff\x8e@\xce\xee`\x10\x6\x97{9\xd8\xb\x45,\xed\xe5|Zs\xf9o\xa5\xe1" -"\xe0\x44\x88\x65\x9fp\xa9r\xcd\x7f\x99\xa3{\xc7\x1\x9e\xfd\x90\xaa\xfa\xc0\x37[\xc6" -"\xc9\x16'\x97\x64\x1c\x98H\xa7\xe\x8b\x0\x9d\xb4\x30=$\x89\x80\xfd>\x91zF\xf7\x0" -"\xfb}Hf\n)\x1b\x84,\xc\x9b\x12\xd1\xb9\xffy\xe\x17^z\xa6\xa2\x91\r\x1f\xbd\xb3x\xbe" -"\xf3\x80\x8b\x87\xd3\xc8\xeb\xc4X\xde\xc7,\xa5v5\x89\x13Z\x15\xba`\xb0\xaa\xf5\xce" -"z\xd3J\xce\xa4L[\xb4\xae^\xdb\x8c\xa0\xdc\x5\xb\xe1W\x9dt\xaa|\x2R\xbb\x83k\xf6\xfb" -"\xf\xdf\xe3\xf4\xe1\xbb\xe9\xe9\xbem^\xe2\x10,\xd2\\\xbd\x43\xcb\xfd\xfb\x9f\xa2" -"\xd1;\xd1\x95\x12\x1c\xd7\x3Q\xc\xb2\xd2u\xc1{O\xf9\x5\x1exg\xfb\x1\x6\xa1j\x1d\xc6" -"w\xa8\x9c \xb0\x9d\xeeN\x99S\r\x89\xa0\xee\x8e\x7\xa4w\x1d\x4\xa0zT\x7f\x14\x64k" -"\x90Slu\x9f\x1d&\xf0\x44\xf7\x90\x2J\xaaRW\x0\x4\"\x8\xa1\xa1\xcc\xaeHG\xe2\x41s" -"\xd2\x1O\xb\xab\x1b=h\x3\x64\x95\xa5\x8d \xbc\xe2;\xca;\x93\xf\xa7\x34\x66\xb8H\xbc" -"O\xffI\x9f$8\xb1i\xf9\xe6\xbc\x9c\x18X\xba\x9\xd6\x14\xc6ygf \xc4\xd2\xd4\xcfn\x18" -"\xd6<\xf4m\xac\xbb\xa6]\xff\x7\xc9\x66\xb6\x1b\x1\x18\x83\xf6\xe5\xa4\xb5<\x9a\xbc" -"=BR\xea\x42)\x19\xac\xda\xaf,\xf9Jm\xfe\x87\xd7\x11\xe2\x9a\x39\xc5r\xd0\xb9\xcb" -"`\xf5\xa5\x8d\x84g2.\xb6Z/\x8b\xc6k\xd8:3\xc2qe3\xc6\xc3\x8a\x1c=vkH\x12\x1b\xd2" -"\x84\xa5\x92\xe4Y\xc3\x9cw\x8b\x31\xf9I\xb0~\xf1\xbd\x46m\xc4\x9d\xb3m\xf1\x65\xea" -"\xdd\x8\x31\xca\r\xea\xbe!9\x8f\xda\xef=\xd2{x\xcxU\x9e\xc6\x8d\xfai\x8e\xb7\x0\xf7" -"\xfc\x9c\x10\x95\xf\x93M\xad\xbbg\xef\x97\xcd\xddM\x90\x62H\xfe\xaa\"h\xe3\x65\xb0" -"\xc0\xe5U\xca\xa4\x9cO\xa9\x2)\xfd\xda\xb1\x66\x5\x80\x80\xd4/b\x9b\xde\x82\xa5\xa2" -"7\xfclU\x11\x85\x9f=\xaf\xab\xa5\x7ii\xf9\x9a\x80\xca\xa4\xf\xe2\xe3\xbj\xe4\x12" -"8\xd7\x16S\xb2g\xad\xd9\xd3\x45\xe\x65\x2\xa0\xed\xff\x8\r\xf1\x1b\xe3\xb2u\x98k" -"\xb8\x31m&\xaf\xeb\x98>qWW\xc5\x94\xfc^\xec\xbe\x80\xf4\xf0\x30z6\x91\x94\x1b\xd8" -"^\xb2?d[\x18\x8e\x2\x93':\xc1H\xed\xb6.\x86\xe4\xe0k\xcf\xf7\x8\xb6\xdc\xd5\xc4\x7f" -"}uU\x18H\xf0\xc\x95\xc6\x84&Y-\x7\x63}\xc9\xe\x8a\x98\xa3p9\xff\x93\x82w\xae\x84" -"\x8f\xd4\xf\x8aX\x80=\x87H\xae\x41\x1f]\xff\xe2-2K =;\xc8t\x1c\x94U\xb4\x80\x94\xd2" -"\x92\x66\xc7\xcbI\xfd\x9f\xfd&\xfV?\x19\x83R\xfe\x14\xcd=\xe0\xe\x9b\xaf(\"N\xbX" -"\x8c\xc6\xfe&\x88@@\xb\x86\x85\x83\xfcPb\xe4r?\xc5\x1b\xb3G/\xc4\x8a\x1e\x95\xc3" -"\xee\x1c\xc8\x17\xa1\xb8It\xe4\xe1T\xa6\x12\xc9\\waW\xb2\x64L$\xc2\xa9\xc3\x85\\" -"\xec\xeb_*\x7f\xdb\xa1\x8xO|Q\xa8\xb\xc7\x33%\x32\x43 \x2\xb5\x87@\xdc\xc4\xba\x98" -"L\xc2v<# \n\x91\x1a\xe1G\xccZ\x94\xce\xeczl\x9cg\xc9ZQ\x8aN\xa3\x44\xa6`\xcb\x5\xde" -"\xdcI$\xf4\x83;6\xb\xf6{\x98\x96\x38\xa3x\x97\xaav\x1e~yYn\xca\xc3t\xa4\xf9T\x80" -"\x4\x64-\x4\n\x8c\x1c-\x9d\x92jqNZ\xe9n\xec\x38\xa4\xd7Lx\xf6U_\x88\xa9Z\x19\xe4" -"\x8c]\xb0\xad\xf7G\xde\x44V\r\xcb}c\xadGk\xee{\x15\x88^\xba\x61\x9e\xbf\xf8\x99\xa1" -"F/\x86\x86\x61\xc3V\xc6\xa9\x88x\x6\xa0l\xb\xb8y\xd4\\\xe5L\x92\xd6\x1b\xdck\xe3" -"\xfd\x98\xc5\xef\x8_\xff\xb1 \xd3k\r\xf9\x9f&\x15\x33$\x81\xe9\x81\x46\xa7\xf3\xaa" -"\x81\x12j\x7fP\x6!\xf5\xad\x8c\xf4P\\E\xa3\x8d[8\xcb\xc8]\xab\x92\xa3\xb1\xa8voP" -"\xb6\x8c\xd0\x8d\xd8\xca\xec]\xdc\x62\x83\x16\x31\x0;\xej\xdc\xcc\x42\xb1iL9\xfe" -"\xf\xba\xac`\xed\x88\xbb\xa4\xd0\xf1\xfb\xb0\xc7\xf6\xb6\x89\x45\x4\xd0\x8f\x43\xcc" -"X\x2\x13\xbe\xb5\xe2\x83\x66\xb\x83\xc0,\xd7Q`\xf3Rp9S\n<\x9b\x16\r\"\\\x15\xae\x84" -"\xa6@\xf4\xeeP\x8d\x19\xb0/\x8f\x6=?b\xd1\xd4\xc5'D4\xde,-N(6\xab{\x80\xdc\x80\x38" -"B\x11\x8\xc0w\xcf\x9\x89\xb1=\x83\xcb\x7\xc6jm\xfd\xc1\xa8\xbcPa\x15\xf3\x36\xf2" -"\xf\xf7\x15\x91\x39\x1c\xa1-9\xf1\x94\x13\xeb\xa1\x9c\x9c\xd6\xdd\xb1\r\x9dxl_\x97" -"\xa2\xe5\x85\x12P\x11G~\xdd\x99\xd8m\xc8\x8f\x11\xfd_\xa1\xd5\xcf\x7f<\xae\x82@w" -"\x19\xf1>}\xdfvc0\xb6XL\xcf\x45\x64\xd0\x4:\x15\xe2\x87\x3y\x92\xf6m.u\xe4\x38\x98" -"\xfc\xebq\x95\xf6\x7\x9\xb'\x86\xe5\x84\x8d}\xc\x7f\x84r\xfa:\xe7\"I\xcc\xb2l\x14" -"\xe6;\xce\x8a\x93\x63\xd2\xfa{\xf3\xe\x87\xd5)\xab\x63\x85\x99\x64'z\x9a\xfd#9\xbd" -"P\x6\xb9=\xae\xb9\x14\x9a;\xbf\x90\x37\xa1]\xb6,\xb7\"\xfe*\\\xdb\xbb\x43T\x2\x7f" -"y\xad\x30\x88\x37r\xack\x11\xa9\xae\xcf\x10\x94$\x9b\xad\x80\x43\x90\xe0\xf2\xd8" -")g\x15\x2\xb3\x83\x7f\x35^\xee\xf\xc6\x86\x7&\xe1\x89?Y\"\x14\x10\xc1s,\xc6y\xba" -"\xdf\xafm\x1b\x30\xc9I\x9e\x9d\x35\x41(\xed~\xe8\xf7\xffm\x8a\xe3\x9ej\x7f\xfdoG" -"\xbb\xca\x8d\x8e\x8c\x9a\xb3qL:\xbb\x80\x88\x65m>\xca\xcb\xb7\xe5p\xe7\x46\xad\xfb" -"\xb9o\xc8\x44\x15\xa7q\r\xbb'v\xfb\xb4\x18;\x9d\xe8\xca\x1b\x9a\xe5\x44\x9d\xbc\xf4" -"\xd2\xb4{\x97\xaf\x80Ni\xb1\xad\xa0L\xb\xb9#\xa9\r\xa0\xb8\xbb?ae3\\.\xdf$B\xfd\xfa" -"\xe5\xed\x8c\xc4\x8f\x1d\xbe\x46\x1J5-K?\xcf\xb2\xc9|\x6\xde(vx\x88\xd2;*\x5\xd4" -"&\x93\x38\xfc|\x98l\x84\xf1\x35\xa1\x8k\x85@l\xc4\xb1\xb1\xe5\xeeS\x15\xc3\x16:^" -"\x1ai\xbf\xe2R\x86\xd9\xa9T;z\x81\x1e\xf9H\xcft\xa7#\xdb\xd1\xaa./\x1d\x14\x1d\xda" -"`F\x17\x43\x12\xf4\xd3\x9bm_\xc5\xe1\xbb\x12\xd0\x81\x1e\xeb\xae+\x1f\xb3\xae)c\xee" -"\x86\xdb\x9f^\xf8\x93\xb7L\x19\x83\xf2/\xf7o\x91\xa4\x81_\xfe\xb7n\xea\xaf\xde\x90" -"XCF\xdb\x96\x8bSVV\xe3\x97'\x88\xf6\xfe\x0\x88\xdd\x2\xac\xc8\nZK\xe5J\xd4SV\xfb" -"Z\xfb\x5\xf1\xc\x88\x98\x83\xa0\x7\xb1\xba\xca\xee\xba\xb8\x32\xef/\x2\x44`\x1a\x18" -"Hwh?(_\x1\x99\x46\x61j5az\xa1\xd9\x35\xb\x12\xe3\x84;_\xc1\xb3\xf\x31\xac\xfa\xd7" -"U\x13\xaaV7\x4\x80\r\x63\x8bN\x1aRXXUJF\xa2\x37:\xb5M\xcb\x90\xb7I\x92\xb3O\xfb\x62" -"s\xefO\x1}x\xdb\x18\xb8\x80-\xb6\x1am\x1eO\x91\xac\xd9\xca:\x9e\x35\x9c\x64\x14%" -"\xa5\x83\xa9\x18\xd3\x39\xc1\xdfI\x17\x44\x97Hb\xcf\x10\x1d\xd3.k\xe\xe7\x8\x2\xc4" -"?_R1\nU\x99\x65\x8f\x95[\xf7?86\xe0\xeb\x1f\x46l\x9b=\x93\x9fo:*\xfa\xd1\\$\xe7\x9e" -"\xcb\xf3\x33\x30mM\x80\xef\xc4\x1b\x86\x36\x96\xfe\x1fP}\xa6\x41l\xe7\xd5\x89\xf8" -"\xe7\x1\xf1\xf8\xc1\x87?\xa2\xab\xf1\xad\x34\x32L\xf7\xa9\x44?5\x87\xbd\xd4\xcd\x96" -"\xee\xea\xa8\xfa\x39'\xe6\x31\xb1\xf3J\xd4\x44\xc5\xfan#\xa2\xeb\x89\x34\xe3\xde" -"\xcb\x2\xc6\xe0\xa1\x9b\x83\xb0\xfdt\xf9UKo\xaa+\xb6y\xa8<\xc5\xbb\x1b\xff_\xd4\x45" -"\xee\xe3\xb5\xce\xd6!v\xfc T\xf5\x81p)\xff\xc4\xcf\xc\xbb'~\xc1\xd8\x19u\x2\x99&" -"c\x9d\x38\xe8\x11n\x8b\x39\x1\xf8\x46G1\x9c?\xb8\x1emI\xd4\xf4\xd9/}\xa2;\xcf\xb4" -"\xfbZRy\x4>h\xff\xb9\xde\xdb\x7\x17q\xa5\x45\xb5\x9c'\xfd\xc2\xf8\x33\xc7\xd6\x2" -"\x5G/B\x8c\x85'\xd2\x9\x83\x4\x61\xa4\xea\xd1\x91\x97\x94\x9bi\xeetN\xb2\x98\xb9\xb9j>\x0\xaf\x9d*\xf2rj\xb1n'\xc2\xde\x95" -"\xfu\x9d\xf2\xe8{]\xa1s\x82\xc0;\xfd\x8d\x94?mx\x8fSj\xd8\x4\xe7\xda\x10\xabG1\x8c" -"7i\xd4\x8fW7u\x10,\x16\x14\xaf\xb9\xa8\x13:\x9c\xc9\xaa\xb2#0\x8\xc9\xd5g8\x1f\x19" -"MV\x2v\x1e\xf9;\xbe\xc6\x44&\x16\xa2\xde\xc8J\xaf\xbd\x92\x0\x7fr\xf7\xf!\x1e\x9" -"\xf6\xf4\xcf\x80\x31\xa9\xa4\xeb+\xdc\r[\x92\x43\xec\xb7\x39\x45\xe8)t\xd0\xbd\x3" -"\x6@'\x99\\\x89\xeb>D\xb7\x8cP1l\xe1\x62W\x91\x38\x37~\xfe\x39\xf1\xcc\xd6Y\xba\xa9" -"\xdc\x65\x1bO\x9a#E\xbc\xa1\xc7\"\x31\xf0\xc4\xe8Xu)\x8c\xfb\x8a\xd0\xdb\x63\x35" -"\xfcJk'\x1a\xc3\xd3X&T\xc2uI\xc0\x38\xb0\xcb\x65\x17\xfeT\xf2\x89" -"\x8dM\x82\x1\x46\xb7`F\xe2\x3V\x10\x18\xf0\xceq\x9e\xc4x\xed\xc\x87p\\\x19(\xcb\xc8" -"\xcb\x39\xe1\xe0\x41\xb2\x9f\x39\xbd\xb4#\xfd\xa4S\x9f\x1c\xc4\xd5\x17\x44\xa4]\x98" -"Y\xd2\x86)\xde\xc7]*\xe\x8b!J;\xe3\xe4\x17\x1d\x31\xa9\x8f\x0\xc\x85\\\xd3\x64\xab" -"!\xfa\x62\xcdT\x82\x65&\xa9\xab\xbbI\x1c\x41;\\\xc4\xec\xee\xc2\x81\x19J\x84\xa9" -"\xec\xef\x95\xbd\x83\x9c\x14&\xb2\xb\xb6\xccz_\x98KuN\xcb\x15\xb9\x9e\x42\x97\x88" -"|X\x3\x35\x64|F\xf8\x1fq\xe3~j\xcZ\xfe\x1\x63!q\x8f.\x98\x8b,Isq\x1e\x64tR\n\xcf" -"\xea\x1fL\xea\x82ZM\xdb\xb5h\xf4\x9d\x45\xac\x9eId(\xa0J\xcf\xca\x93m\x8b N\x9b\xda" -"\xdc\xb1R~p\x8d\x92\xe3\xdcx\xa5\x31\x61\xcb\x12\xd6\xae\x30OinU\xb0\x8bg*\x11\x98" -"\x9e\xc3\xb9\x7\x63\xbc\x34I\xab\xc9:u#\x0\x96\x80\xbd\xa2\x84\x8\xa3H.\x8f\x4\xb" -"\"\xf3~\x8f\xeb\xd4\x1a\x32r\xaar\xf4{\xc4\x34\xba\xeaLM\x14\xeb\xfc@2}\x8b.:\x8e" -"\xff\\x\xc\x63\x12\x9b\x5\x91,.!\xb2\x15\xc4\x18\xe4^\x85\xfe\x8e\r\xcd\xb4\x1f\x8f" -"\x9fW\x87\x37\x5\x1cr\x89\xa5?n\x85\x43\x8\xcc t\x85\x9e\xb4\x93\x13\xb8\xe8\xd7" -"\xaam\xa0@\x1cTV\x7\x1b>F\x3\xd5\x1d\xbf\xaf\xb2\x91\xd8~\xfb\x1e\x87~\xff\xf2\r" -"#\x12\x34\xe9\xccSU\x6\xf9`\xa3#7\xb1\x5_\xcd\xfb\xd8\x13Nz\x8f&96t[\xa7\x9f\xcb" -"wb\x11u\xda\x81\x34\xdb\x98\xf\x91\x19\xfa\xc6\xa3\x95s\xe6\xceh\x96\x8d\xecH=M\xcd" -"\xdd\x17\xc8\x8e\xe1\xdb\xc5=\xc4\x88\x32\x66\xb\xaa_\xed\xbe\x64\x32uO#\xebw\x1e" -")\r\x9e\x17t\xa0\x95\xaf|\x18\x44\x8f\xc6\x39\xe3!\x9f-y\x2\x9c\x1d\x33\xcc\x95@" -"S\x1c\r<\xa0\x99\xde\xb7\x1a\x9f\xfd\xa1S\xedr8\xf6\x82\xe\x18\x14w\x87\xbb\xc2\x1" -"\x95\xf1\x66 \xe6\xff\x65^u\xee\x88J\x82HU\xd2q\xfd\x3v\xfeY\xd7\x9e$\xef\x13\xd6" -"Y\x1fm\x81\xfe\x97UW\x8c\x34x\xdd_\x87)\xf3\xa8-H\xca\x82\x9a\xed\xde\xce\xc3\xdb" -"\xc\xdb\x39\x30\x7f\xbd\xbd\xfa\x62\x9f~T9\x17\xf7\xb1\xa5VsH~\xf9@i\xdd\x5\xf3\xf4" -"\xac\xa8vV~\xce\xc3\xd8\x1f\xddW\xdc%\xa0\x32\xb0P\x9a\x62\x96\x13\xa3\xa7\x66T\xdd" -"z\xd6\x92s\xb8\x39\xf8=\xa3\xc9=\xd3\xad\xb2\x0\xc6\xbd\x1e\x1bN&F\xa5\xc9\xb\xaa" -"\xb8\x89\xe9@\x8aU2\xc\\\xc6\x84\xe4r\xdfT]!\x1bR\x9fM7}M\xb7G4\xfa\xd1PO2\xdc)\xf" -"\xd5\"+w\xb5\x1b\x94\xd9\xb4\xa7\x6\x93xX\x90\xd0\xf2L\x19\x9d\xb2\xb5\x12\x45\x86" -":2M\x18\x8c\x8e\x1aH\xaa\xc3\x80_\xdf\xce\xc5\xa8\xbc\xd4)\xc7\x4!\xbf\x9b_:~~\xcf" -"X\xcf;H\x7f\xe5[\xb6W\x18<\xbfs\xf2\xfb\xca$\xca\x8bh\x8c\x6\x64\x38\xc6\xda,\x8c" -"\x8a\xd0\xd5\x1eo3$\xe9h\x1d\n\xd2=\xc7\x9\x66\x92\xf0*\xceQ\x9e\xdb\xb8\xac!)\xdf" -"\x13`ga\x80\xc2\x99'\xe2.3\xcc\xe6Q\xce$U}\xa3\x1a\x46\xfd_+\x91\x16\x45\x41\\!\xc8" -"\xc2\xad\xbe;\x2~\xb9\x15g\x5\xd5\xc3\x66LY\xf2\xe5\x15\xa8\x9fqE\xd6-\xd8\xb4 d" -"?-\x88\x95\x15\x4w\x8c\xc6\xca\xd1\x42!\x85\xf2^*\xe9\x88[!\xe0\xf4\xfe&\xe0\x8\x11" -"1\x11\x43\xa6\xbb\xbe\x37,T\xeez\xc4\xfbx\x9cu1\xff_p\xdf\xdf\x66K\xa6\xdb\x13uS" -"!\xd3\rM\x6LGpg\xbe\x33\xee\xef\xfc\xf9\x46\xc6\xda\xdb\xc1\xa6\x97 \xca\xdbY\xb7" -"|\xb7\xa8Y+\x80\xa6G5\xba\xc6Q\x89\xba\xb\xd3\x66\x95\xad\x99\x12\xa0\xdaUhm\x8f" -"Y\xbe\xb5\x31\xa0v\x3wUIl\xcd\x16\xde\xd2\xe2ox]\xfa~\x96\x88~\xf8\x17\x19\xe7\xf0" -"\xc6\x19\x16\xc2\x91 f\x8\xa7\x91\rj\xf9\x85G\x1d\"\xfd\x17\x89\x93\xc5\xd8%\x8f" -"\xc6\xef\x10\x98\xdf\x95X%\xa4\xcd\xa2\x19\n|J\xe\xbbV\xe9\xb7\xb4\xe5\xb7h\xeaK" -"\x1f\xce\x97\x86X\xf2)\xa8Y\xcc\x37\x15\x93\xbb\xf2\xbe\xe6\xadq\xa8\x14\xc5l\xc5" -"\"\x14M\xb6\xbc\xeW\x95\x11\xe0\xa4\x38GI\xa7\xd8\x8e\x5\x12\xd6\n\x45Z\xee\xb3\xc" -"\xddna\xfa\x8\xb8W\xff\xe5\xf1\xc7\xc3vi\xcd\x87@\x1\x9c\x3r}\xe0\xabV\x17`\xe6\x87" -"\xc3\xbf\x89\xcf\xb1\xf7\x38\x8#\x11\x2\xe2\x17\xdc\xc1\xc6\xcb]1\xc\xba\xd5\x87" -"3)\xb2J&FI_\x9c\x63,\x6\xbf\x8e%\xc0=7\rl\xbb\x86Y\xb7&\x2\xc4\xc4\xa9\x1b\xc7\x88" -"\xfc\x91L\xea\xfc\x91\xbe\xccVql nw\xf5\xcf\xb0\x10\x80\xa6\xd8/\xec\x93\x7)\xfa" -"3\x1f\x95\x86'qf\xe8\xde\xa1\x18\x62\xe2\x12\x30\x95\xe2]u\x8f~\xe3\x80\x8c~V!\x86" -"\x18\x1f\x8c*0\xd5PB\xca\xb5\x63\xbf\x88\xac\xd2n\xc1\x9by@\xb1\x86\xc2\xa1\x36\x81" -"\x7f\xc5\xc7U*\xf5\x41[\x7f\x30\xb1\xca\xbbn\x9\xe9\xa7\x84\x87\xcb\xc5`\xb3%w}R" -"\x1d\xa1@\xc4\x93\xe7,\x7\x16\xc6y\x1\xcf\x1a\xb4\xdd\xf4\x39-\xd8\xbd\xb7\x4\xd0" -"2\xc4\xe9iq\xe6\x35\x45{\xa0\x95\r\xcb\xd5\xa9\x45\x44~\xfb\xa1\xf6\x62\xd1$4U}#" -"\xee\x97\x90\xa3\x65M\x8\x96wj<\xd7\x14\xbexl\xa4m4\x16\xb1GM\xea\xb4\x9l\x1b\x91" -"\xb6\x65~.F-\xe0Gs\x9a\xc\x92\xefn\xc7\xbewyH\xe4G\xa8\xce>\x8dN\xf3\xf9\x37JwRq" -"#\x12\xb8s\"\xdc-}\xed\xb5\x83\xb2\x9MuH\xbd\nO\xeb=\xcd\xf8\x35\xd4\x9a\x1dn3~5" -"Pm\xbfoB\x9bk\x94:,q(B\xb9S`&(\xfa\x17\xea\x42\xc4\r\x8b>\xd3\xde.\xfa\xd9;\xbb/" -")\xbd&4J\x15\x61\xdb\xae\xa9\x8a\xf\xe6O\xad/Q\xd2!\x8f\x80\x18\x34\xe2_\xd7\xe5" -"\x8\x1a\x85\xa4\x1d\x83\x6\xd6\xe0\x4y\xf7=o\xb6\xe9\xe0+ \xc8\xe7\xfd\x9f\xab\xa2" -"\"\xad\xf\xd1\xee-t~Q\x90RA>\xf1\xfe\xa4\xce\xcfT\xca\r\xb9\x1f\x83\xe9\x2[\x84\x88" -"\x1=\xcc\xaf\x1c>\x18\xaf%v/\x91\x1aU\x3\xfd.\x86!\xa2\x5\x45\x16\x46Lo\xbd\x41I" -"\xc6Vg\xec\xabV\x17`\xe6\x87\xc3\xbf\x87X\x90\x8dQ>\xb9g\x0+\x94\xd9\xf4\xca\x39" -"\xb8\xde\xc4\xc5H\xca\xf7\xcf\x9b\xad\x7\x61kl\xb0\xdd+\x7f\x1b\x85\x9f\x13\xcf\x62" -"z\xdb\xc3\x0\xb7\x39\xbb/}{\x96I\xd4\x81\xdc\x91\"\xb7\xcbV\x1d\xb1\xe8\xa9\xff(" -"4\x13\xa4\x13\xa9\xff\xe8\xb4\\%\xfe\x36\xb2\x86~\xb\x88\x16\x9a\xaaR\xf\xcb\x8}" -"\xb\xab\x1bR\xc8\x37\xeb@N&J\x11\x0{\xcf\xda\x8\x30\x65\xbc\x1<\xc1\xfb\xfa\xd8\x35" -"4\x92\x8\xb6\xb4\x81\xd5I\xe8\xc1\xb3x\xa9\x89\xb7\xce^\xa7\xe4xs\xbe\xad\xa4\x91" -"\xde}\xf6\x38-\x15\xf8wP\xf8lt\xbaJr\xbc\x89\x16\xfeO_\x94rL\x1b\x42\x14K\xde\x88" -"\x1a\x65\xe0\xac\x1#^\x81\x0\x64\x2\xf1\x92{}\xe4&\xe7\xc2\xe7\xee\xe6\xd1N\xbf\xb9" -"\xc1l\x8b\xdd^\x97\x63\xa4\xafy\x9e\xb1\xa5\x66\x4\x9dX\x8f\x80t\xff\xdbq#h\x85\x65" -"ebQ~,y%\x95\xa5,\x9b?\xba\xbb\x90\x17\xe6\xe9\xd2\xb0\x9\xb0\x8e\x81\xdfk7`\x80\x43" -"\xb7\xa2#\x4wC\xfd\xf1\x12R]\x90\xcc\xcf\xd8\xa8~\xc7\xd1\xcb\x41\x0N\xd9\x66\x1" -"\xb1\x90/#76y\xac\x8e{\x3g)\xda\xb8>\x8c\x88O\xbe\xe5\x11\x1e\xe7\xd2\x42\xde~\xcd" -"\xd2.'{\xa6\xce\nW:\x81\x84\x8bR1}v\xfb\xeb\xa1\x6\xdd\xa0\xd1\xdf\xf6\xb9\xaf\xfa" -">\x99P\x91L\xb0Ks66\xb7\xdc\xe1s\x80\xf8\xaf/\xe5# \xbf\x9J,\x4\x32kD\xc4\xf0\xbb" -"\xc1\x64\x96\xf4\xd4\xc6\xb5\x36s\xe3\xf3\x8c\x35\x1e{\x18\xbf\x8=D\xafT\x90\xbe" -"jQ\xc3\xfdq\xcc\xfe \xb1\x87J\xf3'\xf\xccg\xc1\x30\xc2\xa2\xf\xc4J(\xec\x8b\x8c%" -"\xea\x80\xad\xa7\x8ex\xa6T\xdbz\xe\xe/\xc6~\xba\x7t\xb3 \x9\xc0\xf7\x95\x38ZV\xb2" -"\x1f\xa5{U\xbc\xa1\n\xa8\xd7\xdf\x14\x9e\x8e>\xce\x84\xbe\x0&S\xc9\x4\xc7i\xa6~\x81" -"\x84(\xcc\x15\x85\xe3\x34'\xb2%\xb8v\x90\xa7Y\xe2\xad\x19\x81\x1;\x1f\x93\xd4\x9b" -"G\xdb\xb0\xba\xady\xb1\xaa\x90\x88\xef\x87\xb5\x16\x5\xb0\x8c\x84\xb3\xa4g\x1aJ\xf5" -"}\x80\x80\xfbx\xbc\xd8\x0\xee\xf2\x62{\xaf\x10\xbeP\xae#\xcd\xd6\xbc\x65\x7f\xbf" -"kS\xc3\xc8\x1c\xd9\xe7\x61\xcc\xbbiha\xef\x18\x64N\x80\xe5}I\xe9\\\x3\xb9\x85\x15" -")\xf5o\xb5'\xa3S\xb7\x1e\x82\xd1\xa5<\xcf\x9e\xf\xb9\x9bL\xc\xf\xe2\x9em\xd2\xc9" -"\xcf\x8c\x46\xdb#z\xb9\x8a\xfa\x8gE\xd8##\xfd\xc6@B\x8cs8\x6\xf6\xe5\xc\xd5\xe0/" -"\x3\x93{\xb0\xe4\xad\x65>\x6\x9f\xa2\xf0\x84\xbcz\xbb\x8a\x19\xa4=\x89\xac\xd8\xed" -"\xea\xa3\x94]\xc3\xde\x30\x5\xad\xe5\x9d\xf6\xc9\x1a\x8\xdf\x9e\xe2\x16\x96?\x93" -"\x1cm\xda\xbb\xc2|;\xfcqY\x8f\xcc\xe6h\x88\x64\x2\xad;\x1f\xe6\xfbv\xf1\x19y\xc7" -"tNT\x16\x95\xb7=\xfu\x16t\x92\x5\xdc'\xa2\xec\xdf\x89y\xc2\xc7r\x91\xa4\xa5\x41)" -"\xdf*4\xca\x9c\xfb\xdb\xa9\xcf\xe2\xdeg\xfe\xbeL\xb0Q|\xce\x15\xd2\x62\xd3&\x8b\xff" -"\xea\xb8\xc8&\xd8\x11r\x8c\xb1H-V\xeu\xd1\xac\xae\x42\x43\xe8\xe6\xeb\xa7\xa5\x86" -"\xccH\r\xfc\xff\xccl\xcf\x45\xcf\x63\xd6\xbc[\xeb\x0)\xf1\xf4\xec\xd2\xc0Y\x98\xbd" -"\xab\x17\xa5\x9e{F\xca\xc8,`7b6\xc2\x12\x1e\xf0\xd3\x1b@e\xc4\x1c\x42\x81\xc6}i\xd0" -"\xe0\xc6\xd8\r\x89\xe0\xea\xe7\xbb&\x82L\xcd\xbd\xe6\xac\x17S\xe7\xd9\x85^\x1\x80" -":.\xba\x63)s\x0\xcd(\xe5\xbd\xb2\x9a\x9a\xa4\xd7\xa1\xd9t\xb4\xefgc\xb5\xc6$\x18" -"\xd8\xbd\xe3oE\x99\xbc\x8d\xa5\x86\x2\xca\xcd\xed\x84\x7fk\x8a\xed\x99@\xa8\x1a+" -"V\xe0q\xc1\xfd\x80\xc2/\x2\x1f\r\xefN\xf5\xfb\x31\x61Q\r\x10Q\xe4\x85\x5\x89\x10" -"\x86\x61\x80\x44\x44\x8c\\\x82\x87\xbe\xd2\x13\xe1\xa2\xf2\xd5}\xc0\xdc\x97n\xc1" -"e\xa8\xe4\xd3W\xe6\x90\xb8\xa5\xd8x\xa7\xbdl\xab^\xa6*.\xb3\xd1\x66\x35\"\xf\xb9" -"\x84\x95\xb2\x64\x19\xcf\xb6\xae\x39\xee\xca\x15\x37\xb5\xa3\xb7(#\xde\x1f|f\xff" -"xM\xc3\xfa\xdd\xd5#\xfeq\xf\xf6\x1dv\x9d ,\x4\x9\xbd\xc0_\xcf\xf\x8d\xc4~\xbb]?\x92" -"\xfe\xd2;\x1d\x61\xf0\x83*FY\xb6\xc\xe2\xf2N5&a\x94M\xe1\x3\xb9*>\x1d\xf0\xc1\xc9" -"\x92\xaewe{\x87\x30Z\x90\x14\x14g\xa7\x12\x7\xad\x66\x30\x14y!E\xdc\xb5^\x91=18\xec" -"/y\x96{\xed\xbf\xae\xbc\x88\xd0\x13\x8eo\xaf\xc8\xf0\x92\xc5;\x80\xc9m\xf5\x17\xb4" -"\xea\x9b+\xe0\x82\xc9\x84\xfc\xd8\xf5\x1a\x8c\xdc\xfc\x44\xaf\x18\x9a\x5\xd4-\xe9" -"\xc6\xb6\x14\x92k\xeb\xcd\xae.\xe6\xea\x1f\xbf\x97\x1c\xca\xe4\x87\x15NL!\xba;/\xd9" -"\xdd\xe\xb9\x38\x13\x1a\xfa\x1d\x8a\xfahL%*\xa2\xe7\xcd\x5\xc0\xfa\xfK8\x3Q\x12R" -"\x84J\x19UR\xa5\x30\x82\xd3\xf4\xb0\xb5\x45Tb\xfeR\xbd\xff\xc1\xd8\xcf*\xb8V\xa2" -"1.CS\xb1\"\xc8\xe1\xf5\x17\xa2.8\xc7\x89\x43\x8b\xa5\x7\x2\xa9\xc9\xef\xa8\xcb\xc4" -"\xd0#L2D\x97I\x98h\x80&\xc7\x1ei\xb5\x36\xfd\xfaO\xfa\x35\xbe\x10\x81\xa7\xc1\xe3" -"\xd8\xa0\x64$\x9b\xd9oZM\xbu{`;\xd0\xa3\",=\xd8\xba\x89\x85\xed\xbd\xf\x1\xb0w|1" -"e)\xb5\xc1OL\xfbv\x14\xc8Y\x9\x9b\xb3\xe6\xf3\x6\xec\x12\xf6 \x83\xaf\x31\xcd-\xc6" -"\xaf\x65\xe4!\x86\x1f\x92\xec\x34$>\xc8H-\xe8\xbd\xbd\xf5\xc9\x97}\x82\xep\xcb`\x5" -"5v\xfe\x31_\xf8\x62Z\xdc\xfh\x91\xa9\xba\x80i\xa4ksx\x13\x19\xd7QTd\x98\x8f\x2ZZ" -"8\xa9\xf9>JJ*\x6\x1f]@\x9e\xce\x66HH$\xc6\xcc\xdf\xa2Qe\"?\xb0\x33\xbe\xf8\xe5\x82" -"{\xb6\x8e\xa6\xe3\\P\xae<\xb1\xbc\xdd\x41 \xe3*\x83\x88w\xd7\xd9\x9c\x18\xbf\x96" -"7\xb1\xab\xd2\x31iA\xe3\xd3\xd7\xa1\xe4\xf9\x6\x34\x13&\x17\x9c\xad\x9by\x9do\xf2" -"\x8f\xfe\x98$-\xa2[U\xd0X\xd0Q\x93N\xb7\xa1\xb6\x83\x85\xb1\xc4\xbf\xdf\xe8\x8\x82" -"\x85\xf9\x65V&\x89\xab\x42\x37\x2\xdcUBK\x15\xa7m\xc4\xa4\xfc\xcc)8bT\xde&`aD\xb0" -"_\xf3\r\x9c)\xeb\xbb\xf3+\xe5\xf6p\xf6\x11H8\xb3\x33\xef\x11\xaf\xc1\x84\xc3\xbc" -"Mp\xa8S\x84I4\xd8\x43\xfa\xc0\x65@+f\x7\xef\xa1\x1e\xe0\x1d\xed\xe]F\x18uc\xa7{\xd2" -"\xa3\xfq-\xb3;\xe4\x19vw\xaer$\xb0\xca\x1\x88\xf\xb9\x8d\x8e@\x5i\x9b\xb=}P-q\x9c" -"\xf3\x7\n\xf3o;\xbfJ\x93o\x8Xt\x15\xae\x89\xbc\xda|\x12+{F\xe8 l\x4\xb7\xc5*:\xcd" -"\xc8\xfa\xc\xff\x16\x14z\x85\x9b\x82\xa4\xd8iWmD3%\xe4\xcaW\xac\x65I\x88\x39\xcf" -"\xd7\xb3\xaa\xf7)\xb\x33\xc5\x30\xf1LD\xe6\x64\x1f\x38\xdc\xe6\xc\xcai}\xdd(zK\x8e" -"\xbf\xf3h\x9d\xa8]\x9\xd6\x1c\xa0\xdeg\x1b \xbf\xfb\x17|Q\xb1\x45\x66\xdb\x84\x45\xba\xda@\n\xba" -"@\xad\xff\x97\x9c\x8c\xbb\xa4_\x83.4\x85\xa4\xc2\x1b\x38\x9f\x41\xbd\xe\x9\x64\x90" -"\xe1\xe7O\xe7\xd7\xc9\x32\x84\xd6\x12\xde\xcc\xb\x16vyK\xfe\x8\xdfH\x96G\xfa\xff" -"6M'\x10\x31\xbbH\"^\x11\x6@\xa8\x1c\x8f\xb4\xefN\xe\xa9\x13\x8dS\x97Wg}\x93\xad\xe1" -"E\xce`\x83\xc5\x65\xdc\xc9\xe0\x7f\"\x8a\xd4p\x80\xb2\xe0.u\xe5!T\x7f\x18p\\\x84" -"\xb3\x15\xa8,J\x88\xb7\x66#\xf0z5\x2\xda:\xa2\xb1\x1f\x35\xbb\xe7\xec\xdd\xdan\x7f" -"0\xe6\x1ep\xfd\xa6\x45\x6W\x92\xfb_:H\xdf^\xc{\xc7\xa0\x91\xfc\x92`9b\xd5>\xc8\x90" -"1v\xfa\xee\x9f\n\xbJ\xe9\x96\x8cO\x91\xa1\xb\xd5W\xd0\xa4]\x1d\xfd\xc6\x9f\xa7Y\x14" -"E\xe9\x35U%\nF/\x16\xc7@E\xbb\x87\xf7\x44\xd9\x65I\xb1\xa9\xabH\x96\x5\x91\x9e\xfb" -"`K\xdc=y$Jh16\x8e\x65\x39\x64\xe6^-\x9e\xc7\xb8\x61\x93\x99\x8c\x9a\xf6\x46\xe1\x9c" -"\xe3\xa9\xecL\x94?WDWC\xe7)\xb2{2\xcf\xc2r\xbd~\x89\x8b\xa3\xa2\x35\xe7\x95\xa2\xd3" -"!\x93\xdc\xae\xaf\x8fLe=.\x81\x42\xc5s\xb9\x15w\x9dz]a\xf9[\x95\xd8\xb3Q\xe4\xd7" -"\xe0'b\xa6V\xc0\xe1\xe6-\xc9\xda\xc4\xebj\xa2%\x36\x6P?\xa1\xe7\x4\xff\xce\x32\xdf" -"\xff\x62\xda\xd5`\xd1\x1f\xa0\x43\x9a\xe6L\x86\xb9\xc2\xfb\xcb_\x15\xd0\"\xa8G,(" -"\x1d\xae.\xf9\x8a\x63-\xa2\xe3\xbc'\xf9\xc7,\xee?\xe7\x84\x96\x92l\xcb\x19\x5\xb2" -"\xa9;=|R\xf6p-e\xc7\xa5\x90\xd6\xc8\x17\x42J\xab\x87wQ\xe1\xbf\xe1\xdc\xd5\xba'd" -"S\x18\xdf\x42Hm\x1d|\xc7,\xfc\xcb\xc7&\xbf\x39\x95\x86\x9a\xb1\x66\xc9\x61\xbf\x46" -"\x8f%\xa8(be\xf8\\\x46\xb6\xd7\xe\xb0\x17\xfb\xde\xb9\x41|\xbd\x10o\xb1\xa5\x91\xdf" -"\x8d\x64\x98\x8f\xaa\xd8[\xa7\xafn7[*\xaf\x8aK\xbf\xbe\xee\xba\xb8\xf6?+\x3\x35\xb3" -"Lu\x86J\xa8\x7\x1b\xbf\xd1\x9c\x1a\x39\xb1\x9fV-\xb5oC\xc1\xa3\xa7x\xc2\x66\xe7\xe1" -"\x19\xa2\xc2U\x16\xc0\x8a\xc9\xa3\x10)\xf8\xe4]Z \xea\xd3\xcd-\x85\x9bU\xb9#\xb1" -"o\x99\x9a\xcb\xe2+\x15\xdcw\xbb\xd7\x9\x95\xdf\x0;w\xecs%\x83\x33\xed^rSe\xf0\x7" -"\xe6\x8c\xb3S\xb1\x8b\\=/\x95-\xbfw\x1f\xf8\x94\xd0/W\x87\xb7l\x1e\xe1\x8\xde,yf" -"X)7%\xd3j\xe5Xw\xae\xc7hnr9\xae\x98+\xce\xa0\x64g\xff\x19\x9cs\xfc\x8f\x97\xcc\xfb" -"\xf0\x2K\xb9`\x87\xf2\x36\xb0I\xcc\x83l\x97X\x8\x96;\xd2\x96\xd8\x4!\xad\x8d^\xb0" -"\x91\x1a\xd6Z^\x18Ms\x83\xd4\xb4\x89\x9b\x2\x15LX\xe6G\x1f\xc0J AS\xb9J/\xe6\xc3" -"\x92\x34\xdf[\xd6#+\xbsK\xd7\xa5\\\xcc*\xed\xde\xf7\xfb\xa2Tj\xb2\xd7\x1b\xe9\xde" -"c\x3\xd0V\xcd\xc1\xfa\x9e\xbf`+>.\x13{\x1d\xb6\xff\x17\xb2\"\x94UF\xd0G*\x1\xfe\x93" -"\xea\x14\xc8\x92\x46\x6\x32\x86\xe2\x19\x3\xa3\x8b\xb\x39\xf\x41\xd5\xd9\xcc\xeb" -"\xbd}\xf3\x9d/a\xfc\x97\xe2\x9f\xa6\x98\xb4\x85]\xcb\xf3\x42\xa5;>\\\xe\xb0\xa0\x42" -"\xe4i\xd7x\xcdX\xce\xdd[m\xe6\x37\x9fN\xcbv%\x85\x90\xf5\xf3(O\x9a\x18\xf6W\xf4\x9d" -"\x2X\x82\xce\x1\xa6\xbd\x9\x63\xe9\xe\xfa;\xd3\xfbZS\x8\x33\xa1\x91\xbd\x45\x31\x8b" -"k\xc7\x4\x45\xf9*B\xf1\x32\x33\xc8u>}\xc\x16\xf8\xe*\xbb\x8bq\x3\xea\x90\x12\xad" -"=\x9e\xf3\xc4\x86\x99\x33\xbb=7:\xed\xc7\x8a\xc0\xce\x99g\xd9\xe7\x2&_\x84\xbch\xb3" -"\xd2;\xe\x1f\x41\x1c~h\xe6\xcd\xf6\xf1`[\xf2\x97\x87w\xef!\xf4{\xa8}U\xc5$1}\xeb" -"\xab,\x9e\x9b\xd6Pg\x2?\xe1\xab\xdc\x11 \xbfT\x86jL\x7f\xd3\xd4\xd3\xa6\x8bx\"\xd3" -"\xdd\xdb.\xd5\x82\x14\xb1\x61()\x82\xc9`\x3\xf3\xcc\xeb\xfa\x41\xa1>\xf3\xe4Tl\xa8" -"@i\xd6h\xe9\r\xb9\x98_\x1d\x7f\x3\xb1\x17\xd5g\xb0\x31\x18\xc2\xc8\x8a\x95Z`T\xdc" -"\x10S\x2\x84\x4\xca\x1d\x5MYj\x8d\xe8]\xde\xa6\x43U\xc8]\x90\x87\x80\x95@\xc4\x2" -" \xbd\xc\xbe\xdb\xc\xea:\xf8\xe\x18&30\n\xc7\xed\x96\x90\xb2\xd7\xe*<\xa5\xe2w\xb1" -"\xdcV\x8b\xaa\xe2l\xe7\x88\xbf\xae\xff\nXOk\xcc\r\x81\x9b\xb2\x7f\xf6n\xdb\x8gFy" -"\xa3\x9e\xbf\xe2'{\x91i\xd3\xf3lb\x96\x9ag\xcb\xe}\x99$z\xa8[\xbc\xe4\xc8\xdd\xf4" -"\"2P\x96&y\xc4\x94\xd4$\xd7\x64u[--\xd6n\xb2\x41\xd9&\xb7lWr\xd6\x8^\x8eQC\n\xbb" -"x\x15mX\x9\xa6\x8d\x46\xfa\x81\xad(\xa8\x9f\xb9\x9\x88\xb\x99\xd9\xb5+\xdb\x8c\xdf" -"\xfa\xe0\x15N\x86\x89\xe8\xcb\xcc\x4\xfb\xadq-g\xb2\xbe#s\xc8P{y\xb2\x1b\x30\x35" -"\x9a\x66i\xf9\xe9\xdd\x38U\x5\xf1\xa5\x89\xb2\x41\x85X\xc2\xc2)\xb7\x43\x19\x8e\x81" -"\x1b(\xfb|\xc7\x83 \xf5\xc2N+6^S\xe\x41\xb7Vy\xe2\x3\xc3Qd\xdc\xc9\xe0\x7f\"\x8a" -"\xd4p\xef\x8a\xa5\x85\x90%\xb6%`\xf8\x13\xc0\xb2_r\xb8\xf4\x32]G8i^\xed\x42\xe0," -"\xe9\xa2~\x8b\xber\x89\xe4\xf0\x9b\xcf\x30\xb0\xde@\xce)\xfb\xba\xb8\xd6Z\xd9/\xd6" -"b\r\x0\x41\x1e_5E)Lc\x97\x0\xb\x7\x38+\x4\x8a\xb9H\x87\x31\xb8\xcbG\xb7G9\xd9\x14" -"\xe5i\xf0LT\xd5\x90w\xb8\x82z\xf2\x65\xc8\xdbr\x18\x97\x18\x19\xc5\x86$\xf4\xf\x94" -"^\x7\x44\xa1\xedY)\x92\xca\xea\x1f{8T\xfe\x18M\xa3O'p\x19\xc0R\xb8\xb3\xce\xaf\\" -"\xea|E\xffP ^\x93\xa9\xed\xfe\x82\xee\x33\xf1\x36\xda\xbb\x12O\x8c\xbf\x10\xa5tX" -"\xa9\x33\x7\xc5\xbb\x0\x1f\xf3{)#~\xc6\xb1\xb3\x41\x86Uhvah\xc6W,U\xc7\xea\xb0>#" -"i\x82T;\xa9\xf6\xc\xea(T\xe5\x31\xda\xcd%\xaa\xad\x82y\xbb\x34\x2\xe1}QU{\x1f\x65" -"\xf8\xdf\xde\xb8K%\x1b:R'\x85\xf7;N\xec&Q\xc5$\xc\xa1\x15\xb1\x80\x39\xd2\xc3\x95" -"i#\xc9-\xdb\xf2,\xd7\x85r\x85\x63i\xee\x81\xae)\xb2n\x97\xd5\xca==\x0\x4\x5{\xf9" -"\xdc\x32\x8e\xa1\xaf\x80\x11\xf5\xf0\x8b\x83\xb\xc9I6~d\xa0Q\xe7'\xb\xec\xc6Wt:m" -"\x86\rTy\xa7\x1\xbb\xe4\xc8\x9\xa8\xb7\xf9\xfe\x4+\x95\x36,[yv\xb1\xaa\x9d\xf4\xb4" -"\xcd\xa1\x8e\x1c\xf7\xc4~q\xb8\xe8\x42\x44\xca\xcb\xce\x9a\xc1\xffi\xf8\xef\x94)" -"Y-\xc0\x1b\xd0\x37\xf6\xe7\xfc\xb6\xee\xdd\xdb\xd1\xa7^D\xea\x8\x8c\x1d)+\x1a\xc8" -"\x94/\xf0\x89\xeb\x92}\xda\xde/Z\xf3\xda\"\x5~\x16\xc7\x30\x92\x17\xd5\xbc\x45\xfc" -"\xd0\x5vV\x82\x62\xb2(\x9b\xa7\xe1)\xed\x87\xfa\x1a\x31\x96\xc0O{Z\xbf\x82\xb7-~" -"\x7\x36\xf7\x4\xe8\x17\xd2M\xe4\x91\x5\x84\x44\x44I\xdbv\xa3!\xed\xe5\x7f\x95l\xb" -"\x10\xb1x\x19<\xa5\xfb\x1d\x85t\xf3^)\xd4\xea\xf9\xa4^TT\x86I\x94\x91\x33T\xc7\x64" -"o\xf1\xd7X\xda\x80*^\x91!\x86\xa9#\xcb\xe9\xc6\x89T\xf\x83:7\\\x5\x8d\x61\x35J\xc5" -"\xf7L\xe7\x93\xe8\xba\xb9\xb5\x6\xa5\xa9p+\xe4%\xf8\x62$\xd0\x4\xe3Z\xb8\x6\xb,\n" -"\x8b{T\x92\x11\xc2]\xb3mF\xef\x1d\xd0\xce&=j\xe5\xa1\x84\xf4\x64\xd0\x8}no\x12w\xed" -"\x9f^\x7f\x93\xa9\xb7J\xef?]8 *P\xa8\x91-\xeau\xcd\x1a\xec\xb6\xbf\xa4\xc8py\xce" -"\x9a\x1e\x30\x84[Q\xc2]\xb\x66Jaj6P\x8e\xab\xe3}\xa4\xd6J\xbbY\xb8TS$-\x0o5{\x17" -"O\x86\x30lN^\x8c+\x1b\x80\xe1\xcb\xf5\x10\xacwg\xb2v\x9e\xa3\xb3\xc2\xc\xa9\xac\xde" -"\xdd\xa9[\xaa\x33\x7\xb8\x95hz?\r\xea\x8b\xd1\xb1\x82@\xa9\x9\x5\xa0!\x12\xfe<\xf3" -"\x6\xf8\xb9]\x8dh/\xb1\x34\x8bT!26\xf9x\xd3p\x8bt\x80\xfd\xee>F\xddXO\xaa\xb1\xbd" -"\xb6\x90\x8e\x45\xaf\xe3\x10\xa4\x9fs\xc4PsS\xb2\x19\xfb\x11\x64\x92\xd7\xb9\x66" -"\x99\xf4\x8b\x10mT \xe1\x0\x99\x7fY\xcaI\xc2\xf6\xd0\x66\x61\xec\xb6\xc6&\xf2\x36" -"\xb8\x19\xee\xf2\xa7\x1b\xa9\x37\x2*\x92\xcf\xbb\x31\xd9\x43).#1\xcf\x38\\\xb2\xe8" -"\x2\x66\xa0\xc5R\x3(\xd9=\xfaX7\xc9n~+\xa3\x10\xaf\xfaW5Z\xb2\xd5\x1d\xb2K\xbf\x35" -"\x18\x10\xa1\x9a\xcf\x31\xab{\x1c\xd5\xe5ZG|\x18]\xe3\x80\x1!b$W-?l'\xf9\xca\x82" -"s\xac\xff\xf2\xf3\x8\xb7\n\x82\xf3\x81,\xb7\x9\xac>[\x9b\xc2\xd5Zs*\xbc\xc6\x8b\xd8" -"\xd7_\x8d\x33hA\x19\x80\xdf\xb3\xa9N\x17\xadj\xe1\xdb\x65\x93\x35\xf6\"\xeg|X\xc8" -"\xc9\xcb\xd3\xd9\xc3\x94\xff\xda\x8b\xa0\xb0\x2\x41\x45$Y\xfa{o\x2\x8a\xde\x9c\x9d" -"\x4\x45J\x9\xfa\x1e\xe6\x5\x43\x3\x66\xe3\x32\xf5\xd5\xff}\xef\xd5\x19\x99\x9c{D" -"u\xa9\xcc\xb\xc8+\xd7QP\xcf\xa8\x6\x94\xca\x83Pj\x14Z\xc8\xf7\x7f\xea\x9d/B\xfdo" -"\xc8\x8a\x9\xf8\xda\xa7\x88=\xc7\xb3\xff\xdf\xebq\xb1z\xb6\x12l\xba\x13\x1c\xc5I" -"\r~\xab\x8c\x63\xe\x6\xa4p\xc2\x88\xaf\x65Z\x14\xa8\xa0\x89\xa6\x1f\x98\xae\xe3\x30" -"\xc3\x90\xea\xa1\x96s\xda\x8c\x65\xad\x17V\xdf\xf4M6\xb5\xe6\x17_\x11\xb(N\xd3qX" -"[}\x99\xfe\xbe\xba\xfe\xe6\x14\x4#\x8b\x95w\"\xb4g\nmv\x9\xd2\xe6\x1c\x46\xac~\xb7" -"\xc9\xbf\xb4G\xbd\x9bq`A\x90_ml\xf3!\xc2H\xb9\xcb\xe1\x1f:\xec\x45\xa3\x42\x16\xbf" -"\xe|c|\x81p\x15\xec\x0\xb6\x1cT \xf0\x11\x7f\xcc\xec]\xcc\xfa\x8e\xd1\xc4\xe0\xaa" -"\x2pk\xb2\xc2\xc7\xd0]\xebp:$\x0@\xc9\xe7\xef\x93\x8v@.T\xc9\xf2\xa3r$.\x9\xf0\xfd" -"w\x88^Fp\x9\xdeU\x87\"\xad\xf5K\xfd\xcc\x93mc]t\x96I\xb5\x82\xc0\x63\xedn\x9c\x8a" -"\xff\x9fjx\x16\xd6\x9\xf\x1a\xcd)<{l__\xf8\x18\x43\xbd\xfe_\x15\xb2K(\xf8\xbd?\xc1" -"\x98\xa1\x31\x2\x32(b\xe1\x1c\x9d\xce\x7fPQ5\xe7X\xaf'\xb6\x46\x83\x8c\xbf\x32\xd8" -"9\xce\x7\xa6\x6\xb7\xd0\xdc\xb\x9a^r_\x92\r\xa5\xb1\xb1\x9b\xfe\xbaR\xaa\x63\x2&" -"\xba\x30\x8d\x34\x9e\xb\xa3\x31\x36\x9e$\xf6\xf\xf1\xef\xaf%\xfc\x84\x1f\xccb" -"\xbb\xf5\xd9\x2\xf7\xb0\x90\x8]\x9f\x1\x14 \xef\n\x95.\x8e\xc1\xdc\xc5\x17\x42\xab" -"?\xb8OH\xf9\x15\xc1\xe2\x80\x1d\x38=\xaf\xc3\x3\xc4v\xf3X\x8cU(\x19M\xa5\x8d\x97" -"\x1fW\xa8\x7\xc\xa8\xf4V/2\x1d\x0\xdb\x9a\xd2\x2\xb7z\xf3\x5\x36\xe0\xc5\xf9\n\xa3" -"\xf\x7\x46x\x8f\xe5\x44x\xb7\xb4/+\xc3\x9bj9\xb2\x10p$NjM;8U\x8c\x62V|\xfe\x37S " -"\x82\xfc\x15\x66l\x17\xe8i\xa5\xb1k\xe4\x64:\xbe\xb8~\xd2\x98\xedH\x91\xda\xb2.2" -"a\xa6\xa2\xd9\xe0\x80\x9e\x87\xf1\x7\xeaS\x99\x18[\xe1\xa7\xfc\xe6(&e\x9cz\x87\xd2" -"6\xcav_\x82\xe5\x11q\xdb\x30\xf3\xd8Z\xffQNT\x1e\xa0/\xbb\xaa\x82\xc5\x90K\xd2\x17" -"\x9\xf0\xc7\xdc,\xc2\xa8\xf9}d\x8dz\xd4\x88|W\xb\xb2\x63\xd0u\xab\x92%L\xb4^\x84" -"\xc8\xd7L\xce\xce\xe3\x95k!\xd2\xe1\xe6\xbei\x9\xba\x17\x18\x9d(1\xb\\\xb3\x92\x99" -"F9\x81(\rFqM\xef\x37\x9c\x19\x42\xcd\xc2\xc9P\xe5\x9?w5M-(\xd2\x8c\xcb\xb7*\xc\xed" -"\xb0\xf3\xaa\xbe(e_\x8f%\xc8\x9e\x65\x7\x9b\xda\x87^KZ`\x95\xc3\xf1\x36,\xda>\xda" -"`(\xd0\xdc\xee\x89s\xa8\x1cgf\x12\xae-\x92\x5\x1?dX\xae=\xe5\xcd\x93HN\xdf\xe3\x62" -"\x14\xcb&\x1f\xd6\x1f\x1e\xe5\xe5\x39\xadh%\xdc\x61\x9cp\xf2R\xd1\x1dk\xc0\xde\xab" -"\xbe\x36\xa0v\xb0/\xb9>/\xe8\xdb>\x91\xcb\x85'\xd3\xf9\xf2O\x9b`\x9a\xcG\x7tK\xcd" -"e\xb3|\x15}\xd0\xd9]\x8e\xff\xba\x95%M\x98\x8f;\x86Y\xdd\\\xe8\xc6\xc2h\x19\x6\xbd" -"W\n\xbdZ" -"\x1f<\xc5\x9a\x98\x30\xaa\xd9\xfd\x94\x89\xd4\xc5H\x9e\x64S\xdf\xd0)\x92^\x14]\x88" -"\xcav.\xca\xce\xf5\xba\x41\x15\xd9/\xe7\x3\x32\x8\xf\x17\x1a\xe\"\xd8\x9f\xba\xd6" -"[bE\xb0\xba\x12\x35\x34\xce/\xf7\x95\xe5)0n\x6w\xf0\x81\x4;z\xb0\x85W\xadH\x9aZ9" -"~\xce\xcby\xe0%\xc3\xd5GC\xa3q\x12\x92\x9e,}\x2X\xe0V\xfc\xd1\xb7:\x83\x87\x83\xc0" -"\x7g\x88\x9\x14{~\xb3\x7f{\x4\xde\xf0\xa7\xe6s\xf\xc4\x38\x10\x8e\xbd\xe8\x83\x12" -"\xac\xa1Ir\\\xe3Q\xd7\xd0\xe6\xa8>\xbc\xc8Q\x8a$\x8\x9e\x15<\x89\xf0\xe4@\x94#\n" -"\xcc\xbf\xf0\x14.\xbe\xcf_w\xf6\x1\x8c\xcf\x43\xb9g\xcb\x18\x88\xc1\x41\x10\x30\x66" -"\x12\x8c\x4\x9\x41\xb6 \xd9\xc9|\n\xf8\xfb\xeb\x8b\xa8\xa8\xd7\xe0\x42\x46:3\x1d" -"\xd0\x12\x85\xdfj\x5\x34\xa3\x1b\x9\xc7\x16\xbf\x45\xa7$\x18tjs\x16\xaf\x38\x8e\xc5" -"\xd8?\x1c\xd4\x98\x45\x8#\x5\xef\x94\xe1~lQ\xcb\xbaq=\xe3\x33;\xaaw\n\xdb\xeb\x8b" -"\x91y\xd9\x85\\_\x11\xcI.q\xdd\xad\xf\x16\x91\xc4\x1e\x33\xa1\xf6o\x93\x1f\xebk\xbb" -"\xa6j\x1e\xd6\xb3\x18\xb2\xda\x99@\x3\xa7\x39\x41\xb1\xd0J\xf3\x1a_]\xa4\x62iZ\xc4" -"\xf8`[\x8Y\x92\x8a\xe5\xf2\x90W\x8cM\xb\x88\x32\x35V\xbc\x8c\xf1\x87\x61\xcdm\x8f" -"^\"\x95\x99QC\xc6$7\xfb\x46\x19\xcf\x9f\xd0\xdd\xb3\xc1\x9a\x6{\x9a\x5IH2\x82\x18" -"\x7\x46\x32\xf6\xbb\x6\x39\x32\xc9\xa7\x38\\\x9cJ/C.u8\x99\x39]j\x1f\xdb\x3\x82:" -"\xd3\xfbM\xdd\r\x9d\x6\xe0\x92\x8fz\x9a\xfd\xab\x46\xd2\xba={x\x9\xfc%\x13x\xde\xc6" -"\xca\x5\x98\x85\x98\x1Q\x91\xf6\x90\x8\xaa\xc0\xef=x,\xbbZ\x9a\xadid\x1\x9e\x88}" -"K\xa6\x87\xc1\x42\xd0\xc6\xe3Q\xf9\x92_\xb9\x63I\xef\xdc" -"\x15\xe6\xdav9E*d\x4\xa2\x87\xdc\xfd\xf1\xb3\x64\xcb\x42:\x7.\xea\xa2h^\x12\xa4\x83" -"}\xd1\x41\x8d\xe8\xa3\xf0PM\xc6\x9.S\xf9'\x83X\x14\x46\x35\x42\x1c\xe9\x1a\xe\x65" -"\xa4\x13\xf8\xbe_[S\xa7\x5\xaeW\xa2\xe6h\xf3\x8d\x65zM\x89\xc1\x13\x8aJ\x16\x92&" -"\x98\xbd\xae\xdd\xfb\x9a\xd5+\"\xbd\xf2\\\xfbV \x12\x19p\xa3\x1f\x97$ut\x90\x5\x65" -"\xee`\xf4\r\xd3\x90\xa1!\xbd\x9b\x63\xbdY\x84?\xe0\x88\xf8\xc4\xc1T\xf2\x16\x31\x8" -"\x6\x8e\x42R?}\x98,\x82\x35\x8e\xd5q\xba\xc\x66\x6\x9d\xf8\xbf\xdc\x99im\xbes\x96" -"\x83QU\x80\xe5v\x1e\xeb\x0\xb1\xaay\xc5\xf3\xf3\x81\xb0\x5W\xdfz\x1b\xd4\"\x13u~" -"\x16\xceG\xc3\xfc\xc6\xd0\xc0\x9d.\xe1\xc5x\xa9\x16s\x96\xa9\xd0vr\xf5\xd1\x85\x83" -"\xf\xf0\xe3\xae\x12\xc1\xc3\xcc\x46\x19\\\x9\x62\xba\xb1-$v\xa6\xc6\x34\x18\x42Z" -"c\xcd\x66\xe5\x9c\x1d\x19\xc5m.\xef\x8e}iE\xb5\xdd\x97)\x10\xb9\xa4p88\xacI\x0~\x9e" -"\xaf\xaf\xcd<\x82xb\x86mc\xf7#\x1c^\xe4P\xc5\x16*C\xc8+\xce\x91_\x94\xf3Q\xde\xaf" -"S\xf5(g\xd5_\xe0\xbd\x1f\xad\xd0\xb0\xaf\xce\xbe\xca\x31n\xb5~i\x3OpI4\x10\x6\x7f" -"'\xdd:\x19*\x7kc\x15\x14}\xbf\xe2\xaa\x34\x7f\xa3\x9e\xec\x1e>/\x14\x38\xff,\x98" -"\xcf\x1en\xe8\x9d\xafOo\x6\xec\xa4\xb3 \xbd\xa4[\xfcu\xba\x86\x36\x84<\xe0\xc7\x7" -"\xc3\x5\xb.y\x14\xa3\x83\xf4\xe7WJ\xa1T-{#\xd3l\xcbhB\x97(\xe3\x0V\xcd\xda\x9avK" -"+\xeb\xaa\xcf;C\x10q\x83\x30@\"Q-\xb6\"\xdd!\xbb\x1a\xed\x97\xd9w[v]\xeb\x44\x34" -")$\x81\x1dh\xfe\x8a<\x84\x18\xb3\x2\x13w6\x3\xfb\x45nn\xd6\xa7pg\x86zZ\xaa\xf1\xf3" -"\xb9\xe7V?\x9f\x3\x18\x8a\xa8\x41\xe8n\xef\xe8\x14\x34I\x10\x63\xbd\x94.\x88\xa9" -"\xc0\xed\x99\x33Ze\xdd\xb6M\xe\xf2\xcb\x1a~\xa8\xd3Gl\x81\xa0\xde\xec\xa7\xf2/\xbd" -"Z\x87\x9f\x2^\xdc\xf3\xa8\x90\x16\xdc\xcdn\xb5\xc2\xc1\x8e\x19\n\x95o\x94\x41%\x9b\x88\x7f\xe6r\x19\xcf\xcd\xad\x6tK\xae" -"u\x8bG\x8e\"\x9b\x1f\xb4\x8d\x44\x9dP\xe9\x62$\x19\x64\x8f\x35\xc2\xbc\x43\x1dH|" -"^V\x9d\xd1\x45\xc7]-\xde\x19^\x9a\x82\r\xbe\xbb\x45\xed\x45M\xf0l\xd9j&\x1e\x90\x88" -"\x99\x8e]\xad\xbe\x8c\x8d\x84\xc9\x38Q\x86\xea\xb4V\xb3\xb\xef\x82%<\x1b\x6\x38\x8f" -"W\x17\rK\xac\xa6\x3\xe6\x92.\xf3\xe\xed\xb8`\xce\x1e\xbf*j \x14$\xfd\x8a!C\x11\x13" -"\x1e\x45\x95\x64\x8f\xb0\xc6\xe\x0\xbc\xab\xb3\x8\xf5\x8c\xea\x45\xfe\xd0.!\xfb\"" -"\x9c\"&F\x81(\xf4\xc0\xcf\xec,Tt)*\x14\xb2w\xd4\x5\x85!\xd1T\xb0\xe2\x99\x96\xed" -"\x12\x91\x11\x34\x8b!\x8f\xf7x^r\xcb\xec>\xb2l\x9b\x35Q\xa4\x66\xe3\x88\xc7\xc1\x93" -"\xc8\x8a\x4L\xf3?\xb6\xec\xac\xd4\xe8K\xea\x61\xa9\xf0rJr\xb8\xbe\x10\x89yf=\xdf" -"*!\x1c\xe3P\xd6:\x8\xef\xb\x96p\xd1\xd2s\xebl^t\xc8\xb1,\x7\x1f\xd5J\x98\x90V|\xdc" -"\xacM\x2<\xcd\xa7\xea\x41\xd0:X\xc3\x92\xc7\xd7\xa3\x99\xbd\xaf\xdb\x97\x17p\xb9" -"nb\xc2\xfcZ\x8\xba\x9d\x12\x89\x87\x99\x97\x86Hl(\xf1\xbe\xaa\x87M\xb\x18_\xa6\xfd" -"s\xc3\x85v\xfe\x35\xc1\x5\x82\xb0\x1dS\x2\x10\xeb\xd8\xe7{\xd4\xb7\xfa\xed\xd9\n" -"\xe4\x1\x97k\x9\x9\x5t\xdf\x9c\xf\x63\x1f\xe1'\xbb\xb9\x39\xb8X\xf3\x12\x33\xf1\xc0" -"\x83\x91\x81M\xe6\x97\x5\x1a\x9d\xad\xe4\xb6N\xd3\x16\xd8\xe1\xafs\x9a\xe1U\xe8\xe3" -"\\\xbd\xda\x94^8\xb8\\\xb7&\xb2\x1b\x9c\xa6_\x6\xe4?\xaa\x4\xf \x13\x13\x93\xb1\x7" -"\xef\xc2\xee\xf1\xe2*\xe5\x38\xb9\xa4K`\x9\xf3\x14W\xb\xd0oc\xf3l5*\xa9\x45\xb6\xf2" -"h\xf8\xef\xcc\xe6\x65\xd2\xfd\xfa;\n\xcfk\n6\xf3\x86`q\xbb\n\x1b\x66\xef\xa7?\x18" -"{\xad\x96H\xd4G\xc9\xc4\xfb\x88\xbe\x1f,\x7\xaa\nH\xfa\x93\x99\xd6o t\x10\x63\xd1" -"\x5\xa7\xd3\xeaJb5y\xea\xf0\x14\x33\xcb\x95\x45\x0\x37\x9f+\x1f\xf\x82\xaeQ.\x95" -"\xaf\xddh\xf9\x9d)\xa6Yuj\"\x8\x84\"\xdb\xcb\xaa\x1d\x87\x8b\xe8\xf2\xb7\xd1,H\x18" -"\x8f\xdc\xe9\x34G\xc5v\xba\x66\xe3\xcd\xf1\x87\x61\xb0\r\x12p&\x96\x99ZB\xaa\x41" -"\xb4G\xe6\xbf\xf4`\x82\xc5\xfd\xbbwS\xb5X?\x8\x93\x17s\x8c\xfb\xf5I\x88\xd6\xa6\xaa" -"h\x4\xbf`\xf\xc0\x0\xc8\xf8\xcf\xfeV\xa9\x61\x9c!\xcc\x88Qr\xa3\xfb\xd5\xc4;\xd8" -"\xbfW\xc1\x93^\xfa\x89\x83\xca\xbb\xb0oH\x15\x9c\xf4ii\x85\x39\xd3\x9a*\x0\xb0O\xba" -"\xfb\xea`\xe8\xf4\x45\x42\xfc\xa9\xa8W\xb1\xd3ml<\xb1\x7f+*\x9\xd0\x80\xcd\xac({" -"\xb3\xee\xe5\x7\xde\xe6\xf4\nmr\xaf\x98\x82\x91\xb1\xe4\xd6\xa9i\xf2\xb6\xcd\xab" -"\x86\xccM1\xbb\xc3\xc5\xc6\x5\xe3\xbf\xa0\xb9}\x8_\xe6\x8d\x5\x16\xa0\xf7\xabU\xc5" -"\x9bz\xcfs\xee\\I[\x8e\xec\xd3\xff\xb\xdf\x91g^O\x80*\xde\xb7x\x11\x8c\xdd\xda\xfc" -"v{\xf3\xc6\xb8\xd7\x96\x4,\xc_\xf1\xc4U\xbfg+\xa3gCO\x3\xb2\x0\x64NQQ*\xc3\xe1=4" -"v\xecZ\x3\xf9H\xba\x9a\x91\xae\x31\xa5\xc2\xebk\xbe\x1a\xd8(\xdcv\x95\xcb/\xf1\r" -"\x91S~\xce&G\xef\xe6\xe6\xf2w\xe8\x3W=\x89q\xd7\xa9|y\x92\x8fK\xe3&i6:\xd2\x8d\xce" -"\xb8\x9b\xe0\x35\x39$\xa7L\r|q,\x13g\x8o\xde\n\xe6\xbd\xd6\x85j\\BI\x93\xe0=\xd3" -"k\xee\xc0Q X\xdd\xa6\n\xab\xd1U\xd7l\xc9P\xde*\xc2]\xc1\xb4\xba\x17\xb7\xfe\xf6\xc8" -"\xc8\x32\xe0\x1a\xa3\x30\xb1>VoD\x10K\x15P\xca\xf3=m<\xba\xbb\xf6\xf1\x95\x39.8\xb0" -"b\n\x95\x33\xb9\xda\x62v1?\xe\xd9\x4:\x12;\xe\xe5\x86\x91%\xed\x96~(\x1f\xd2\x19" -"\x84\xd2U\xda\xab\xadr\rT\xd6\x30\x18\x1c\x96\"\xc7\xeV\xcc\xb5\xbb\x86r\xaf\x44" -"\x91V\x87\xd2\x36\x97\xec\x63\xd4\x8d|[\x13\xc:8\xb8wL\xbb\x92\xb8s\x3T`\xd5\xfa" -"\x93\x44gp\xc3\xddt1)\xebG\xef\x5q\x9\x8a\xcf\xae(OJ\x9ar\xbc`/\xfb\xe0\xe0\xccj" -"\xadqjLo\xddVd\xdb\x96h\x99\r\x34ShRF0h\xc5\x1b\xc6\x12\xfc\xca\x90\xd7\x8e)\x9d" -"\xdd\xd8PNVI\x16m\x9r\xd7\xd0<\xad\x45\x93\xd3O\xa2\xff\xc5\xfa`\xffR\xf2\xdc]\xd1" -"\x90\xe8K\xe7w\xbe&\xa2\x5\xf9o\xd2\x1b\x10\xa4\x93^\xd9.)\r\x81\x62\xaa\xe5jM*\xd6" -"\xcb\x32]\x9c\x43\xbf\x19WAYq`\xf9\xeb{\xbf\x87\xbf\xadN\x19\x9f\x13\xddG\x93ke\xd9" -"B8\x11\xe6\x7f\x19\x61\xdc\xc1@>\xa9L\x9b\x96\xcc\x8d$O\xb5\xac\x45\x1dO\xb6\xaf" -"i\xd8\xc0\xa1\x33\x8f\x9f\xec\xa2\x9c\xf7\x8c\x65\xf\xe0\x66\x1b\xe0L\xf1\x31\x12" -"k,\x8c($\xe8[b\xc1\xca\x66\xa2\xf6\x98\x41kWO\x1c\x92.\xbf\x8d\x4\xdb\x7\x92)%H\x12" -"\xd3Y\x5*e\xea\xf8q7\\\xad\x35g\xc4\xbd\x18W\xc4xA\x17\xaa\x1b\x5\xd3\x92\xdf\xf3" -"\xab\xcf\xccl\xc8\xcd\xee\x8f\xa8\xab/n\xab\xe8%\x9b\x1\x8e\x8*\xa6O\x7f\x8f\x8c" -"\xd0rQ\x18s\xc6\xba\xae\x35i\xaa\xe9\x31\xef\xfa\xb6\xc1\x3\xf9\xca\xdbrZ\x96\x9d" -"\xe0\xe3#\xe\x45\x85 \x12\x8b\x9c\x7\xdaR\xf\xee\xeb\x35\x87\x9c\x38\xd8\x87\xca" -"\x82\xac\x3\x9fw\xfe\xa1\x13\xemn\xf4\x84\x18\xfc\xcf\xc9\xbe\xc4\xfe\xfd\xf4;\x8e" -"\xc8iQRe\x16\x65\x37m\xbb\r\xbf\x98\x31\xb3\x7f\x12\x1d\x1a\xa5\xd9*\xd1{c\xe5\x43" -"D\xf8\rX88\x85^X\xa1]\xc8\xa9\xe6\x91\xedQ[G\x19h\xbd\x82\xf4\xee\xc3\x18q\xbe%\xc8" -"\xc1\x9c\xcd\x91\x10\xda\x6o\x16X>1\xed\x16IS\xe7X\x8a\xb\x91\x64\x36ZC\x81 \x1f" -"g\xbf\xb3\xb\xb1\xb6\x93\xb0\xa4\xc9\x99\x1a}\x95\xa3\x38\x5\xe0\xf1\xc8\xfc(\x13" -"\xe7\x9c\x8\x90\x8a\x0\x30\xf9\xe6G\x15'\xb5\xc0\x8b\x99\xce\xff\xed\xca&\x4\n\xcb" -"KMC\x4\x9\xc\xeb\x39\x36yNT\xf2\x35\x42\x42\xb7\x31\xf3\xb2\x99y\xed\x65\xf8\x8M" -"\x96\r\x85\xdfL\x9\x93\xea\x11?6\xf2\xf3\x4\xb9\xa4\xf2\x11\x16\x19\xf5,\xae\xf\xd7" -"\x13S\x18h\x6\x46^>C\xed=\xe0\x84\x64\x81\x88\x1c\x7x\x95\x36\x1dG\xeb\xdc\x7f\xe2" -"\xdfK\x1c\x34\x9a]\x19\xc2\xd6\xf2-\\\x3\xf8\xc1];;\xe3\x89\x80\x92\xb2#\xcd\x1d" -"\x4{QC\xda\x35Z$\x1ej\x95\xaa@\x17\xdc\xa9#\xfd'\xd9 \xa8\x90\x17\x41?\xe2\x8fs\xc" -"\x82|&\xde\xac\xf1\xa5>\xb3%=\x93\xc8{:\x11\x92\xf9\xbb\xc6\xcdy\xca\xb2\x92\xa5" -"\xc5\xe4O\x82\x36\xf5Y8\xc3\x62\xb5\xfeJ\xe2\x1a\x16+\x85=\xb8\xa5\xc5\x9d\xecr\xec" -"\xb2\x3\xf7\xf2%\xfc\xdf\x3\x32\xb6U~Z\xe0&W\xd0\xde\x13[\x13\xb9\x1b\xeb\x87r\xdf" -"\xc5\x42\xe4q\x9\xe7x\x7\xc8U\x86;x{\xf9U>\xe6}7\x1e\x85`o\x12\x30'\xdf;\xfd\xd5" -"\x97G\x8f\x8a\x10Z\xfc\x9eGx \xc1\x18\xb9\"!\xff\x8cU\x11\xaf\xe2\xc7\x2\x35\xeb" -"\x3/\xb6\xfd\xb6\xb5\x94\xce\x9f\x1a\xd1\xaa\x8aMh{\xcb\x1b\xaa\xe6Jsx\xb4\xf4\xc0" -"\xe9\x9N|C\n\xe5\xd1\xaf\x95y\x17x\xb9\x32\xe7\x1a\x9\xfv\xf3\x98\xbb&\xecl\x96@" -"\xc9\xac\x8a:\xc2\xa7qb\xa6J0\xf4\xb'\x9\xce\xf4>S\x9e\xf3m\x9a[\xc6\xa3\xc0\xf6" -"U\x88\x35\x41\x9\xbaw\xb7\xab\x66\x1a\xceJ\xfaq\x9b\x82\xb3\x80\xaf\xa3y\xf3j\xb4\xea\x93~\xdd\n\xfc>l\x90\xf5" -"\xc9,ho\x12-\xf3\xb5\xfd\x61i\xb9\xc1\xb7:\xa3\xc2T\xc0\xeb\xba\xbe\xf4\x6\xa3\x1e" -"\x9aX{\xa5\x64\xfeW\x80q\xf^*\xb3\x8d\xa7I\xb4\x36\x1a\x42\xe3\xdb\x3\xae\x30\x38" -"\xb3N\xc8V\x98;\xc7\xad\x87i\xc3\xe3\x14\xd3\x1f\xe7@d\x3\x9\xbd[\x89\x1c\xfe\xf8" -"\xda\xa8\xfr\xa6\xbc\x44\xa2\xa8\x65H\x17xaM7+\x4\x37\xcb\x6\xf2\x0:\r/\xddWfae\x5" -"8h\xba\xb9r\xf3w\x2\xc0\x8a\x0\xe0\x42\xf7\xdd?,\xb3\x9b\xf5\x0'\x88!\xb0*L\xe)\xff" -"_\xd9\x87\xc\xff\xdf\x61-4\\\xfe\xc6\xe3.,\xdb)\xd8\xdfU\xe9\x96\xe5\xe5m7\x9c\x65" -"~\xe7#\xb9\xb4$\x92\x64\x9\x97\x31\xf4\xa5\x35\xc0\xed\x43\x36k\x7\xeb\xad\xca\xc4" -"Yg\xa1^\x1d\xce\x43\xb6=\x8e\xfd\x9e~\xbe \x4\xc7\xb\x30\xdd\xdf\xba\x15\x90\xda" -"G\xad\xfem7\xd4\x1d\xbe\xecu#NJ\xbd\x82\xf2\x7\x16\x61\xcaPP\xc1&\x3/\xca\xeeI\x9e" -"SVwz.\xae\xed\xa2-t:c\xd2\xa6\xd8\x18\x15.\x9f\xfe|v\xdbu\x1f\xac\x65(\xad\x90\xe8" -"3\xf3\x97$\xc5\xee\x10\xd2)\x8d\xc7#\xfb\x1\xc5\x43\xa7\xa0\xe1\xfc\x99\xc7\x15\xe9" -"\xd4\x66&\xd4\xcd\xaf\xef\xb3\xd1\xd6\xb7\xe\xa3\xb\xe6\xf4\x64XS\x10\x31\xd1\xd0" -"\xbei:P\xd6\xd9\xe8:l@\xd9\x1a\xa3\xd6\x8a`|\xf3\xcc\x62\xc4\xcb\x8Z(\x82\xa8\xdc" -"\x8f\xfe\xc7\"\xcc\x99}]b\xa3\x8c\xf6\xd8P'Y\x91\x9c\xef--\xc3i\xc\x1\x90\xd2\xcd" -"\xdd\xbb\x15\x7f\xd0>\xbf\x0rw\xe9\xd5rw\xa8\xdc\xd2\xf2\x61\xd5\xb4[jH\xee\x30\x65" -"\xe4\x13\x34\xc9hE!\xd3!4\xbeQ\xb7\xd9$l\x1c\x92\x36\xe5\xa3\xda\x97\xef\xe5n\x4" -"I{J0\xa9\x14\xb6\x64\xac\xee\xb8I\xad\x9d\x87\x32\xa0\x93\x86\x89\x6\x46m\xb5\xb2{[M\x1f\xb8Uf\x1d\x1f`et#=\xeb" -"C@c\xb\xe5\xda\x8c\x19\x9\xe8!q\x9a\x19X\xed\xb9\xcc%\x84\xdeJ2G*\x2" -"c\x91\xc\x91\xe6\xdf\x15@\xf\x35T\xf0\x43W\xff\xb5P\xe4K1\xb2'M\xcbX\xe6\x8b\x89" -"\xf2\xc7\x8d\xba\x92M\x19\xa3\xcd\xb6\xf1\x35uX\xd6W9\xa2\x9d\xda\xd5\x19p\xfd\xdf" -"w\xce\xe3\x33Y\x1f\x65\xd5&6\xd2'8\x7W\xc\xef\xcb+\xf7\x92\x66\xf4\xbej\xb9\xb9\x14" -"\xf]\xc9\xae\x8d}x\xc5\x90\xbd;\x9\x8c\xceS\xdf\x66\x10j'Ze\xd4I\xda\xez\x16u\xc2" -"&\xf4R\xa5\x1dQPk\xecj\xa9\xb\xb\x66\xfd\x41K\xfc\xdb\xee\x1c\x1a\xa8W`\xca$\xf1" -"]s\x9e=i\x1fW\xf4 \xe6\x43\xfd\xce@\xa8\xab\x97\x80\x9\x1d\x1\x87\xcaV\x5(\x1d\x82" -"\xc5`*\x95\x82\x9c\x91\xc4\x31N8\xec\xc0\xdf\x12\xa9`\xc=\x15\x19\x18\x9cW\xd8\xe1" -"\xc2_\xc7\x45\xcd\x39\x19q\xbe\xd4\x81\xb3\xc9\xcdN\xfd\x85L\x80\x82uL\xb1\x19\x90" -"\xc5\xc1\x87\xe1M^y\x9a\xcf\xddV)\x6{lAP\x19\x89\x42\x18\xe4s\xf9\x37\xbc\\\xd1\xfd" -"N\x82\x8d\x32\x38\x82\xfb\x90w\x5\xe1\xf5\xf3\x63\xe4\xf2\xef!u\xcd\xa6\x86\x9d\xf9" -"YBB+XS\xc0\xac`\\*\xa9\xdf\x86\xbfOt\xf\xb1\x35:\xb5\x9c\xa4\xc7\xa2\x33\x82\x61" -"m\xd1\xc7\xd9\x97\x89\x8c.\xcf\x1c\xea\xe0n\x82\xdd)y\x1\xabna\xcb\xfe\xad\xf9>\x17" -"\xcbGI@\x1c\xee\x43\xa3\x9c[\xd7\x9f\x8d\x41\x91I:5\xc9\xd6\x46\xdf,\xb4\xcb\xcf" -"\xc3\x3\x38Ix\x81h\xf9\x86\x38\xf1S6`\xfe\xc5\xf3{\xf1\x9b=\x19P\x4\xb3\x64\"\xee" -"\xc2(\x1eM\xa5\xf7V\x4{\xe7\xf6\xdc^\xa2n\xd9\xd5\"rb\x8f\x12\xf3\xe7\x43L\xb7\xf3" -">\xaaM\x8e\xbb&\xe2\xb/\xe" -"<\xb4\x3\xc8\xcd`\xb6\xacL]>\xf5\x96\xbb\xbc\x91\xad\xb7\x98\xe4\x9a\x11]d\x8c\x8f" -"\x84\xa7\xe7\xb0h\x13\xc2_H>i#en\x92J\xb1\x99\xa2\x8by\x7fk\xd4l9\xfa\x37.Z\xa2\xc8" -"\xf5\x86\x31\xfc\xe6\xf2\x8d\xe0\x1aPP(\xc2kM\xd3\x32No\x10:\xf5~\xd0\xf5\xb6\xae" -">\x1cuN\xeb\xc5JN_:\x8|\x9f\xaa\xc7\x46\xa8N\x94^\xc2$\x3\x9a\xba\xf9\xc6\xb7\x1e" -"=\xb0\xc0o\xb4\x4\x95\x18\x9b(9W\x9c\xc1\xd9J\xd5\x9b\x64\xe\xef\x83\xf1O\x9c`M\xb3" -"\xbd\x36]S\xd6\x88\xf1)\xe3\x8d\x42\x9b\x8e\x92\x8\x9f\x6KXHp\xf7\xfd\x66\xcc\x91" -"\xcau\xe0\x80{\xdc\xba\x38\xf7.|\xee\x33\xcf(\x10\x64v\"\xab\xfb\x1J\x9a\x1f\xd4" -"\xe3\xa4%H\x8a\x81\xeb\xc4o\xd1\r\xc5\x31\xf7\x16\x1c\xfd\xd9\x1b\x97\x81\x92\x32" -"p \x10\xa3q\xce\xb7M\x10*[\xc5\xa6]\x8\x94\xc5`\x1K\xf1*\xad\x96$z9Mu/\xceX\x88)" -"\xc0\x64\xd1\x97\xa6\x35\xc9,\x7f\x97\xe3\xef\x65(r\xf1\x1cm5\x8.L\xf4\x7L\xe8\xe4" -"\xde\x1eQ\xee\x88\xd9\xcf\xa6\xee\xea\xe3\x63?\xd2\xb9\x8e\x83\x14\xfd\x2t\r\x8f" -"\xe7\x95W\x9d\xfe\xf9;I/\xee\xf5i\xfe\xb5\xb3\x8c\xcb\xb7.\x10\xa4g?\xe1J9\x89\xc9" -"\xb8M\x8e\x37\x4\x80\xf5O\xda\x92\xed\xf7\xd7\xd2\x12\xcd\xe4\xb\xday\x1\x15z\xf5" -"\xc0\x85\xfa\x91\x13\x9a,\x9dM\x2\x4\xf6\xaa'g#\x1a\x8a\xc8\xc\x9\x8b_\xafi\xa9\x95" -"\xf9\xd3v\xe\x64\x9b\n\xdag2n\x93n\xd6\xd2j[\x0\xd0wO\xb\xdb?\x97\x8aix\x86\xb5}" -"Xq\x9a\x43\x8d\x7f\x12\xef{\x84\\\x85\xcf\x66I\xa4\r\xc2u\x98\xf}U\xda\x38\x19\x39" -"|~\x16\x9bw\xda\x86+\x1e.\xf2\x1a\rU\x1f\x94\xed)\nT\x8d\"\x8c\xd4 \ri\xe1\xa1\xf" -"Y\x18\xab\xb%\xb5\xc4=\xb7\x8b\xdc\xbb\xaf\xfa>\x99P\x91L\xb0\xb5\x18\x6\xfd\xda" -"~bLi\xc0\xdfv\xbf\xe4KW\xfd\xfe\xe6\xd1\x8c\xb6\x17\xd7!\x97\x32\"\xb5\x9f\x1b\x82" -"4k\xe7\x37V\x94\xdc\xe4\x9e\x61\x35\n\xfb\xb9G\x17P\x13\xcaO\xf0\x8a%\xb6\xb2\x42" -"\xe3mo\xc9\xd1\x45.\x9e<\\A \xa3\xf6\xfr\xe9\xa3\x9b\xa0\xc5i\x1e\xaaH\x17!\x95\xee" -"I\xe4\xe7X\x87\x31\x90\xc0\x80\xbaW\x2\xfe\xcdmP\xb7\xdes\xbd\xb9w\xe3\x98\xa4\x8e" -"Wa\xd9\n\x0\xd0\x12\xf3\xb3\xf\xc2Vu\n\x6\xed\x9c\xce\xaa\x32\x90Nz\xc5\x35\xfY\xc9" -"\x97\x5{\x92\xc9\xd4M\x83\x15p\xa9\x8d\xcf\x7.\xc9\xb4\xb4o\xe4\xbd\xd1\xbe\xcbO" -"\x8X\xe0\xd9\xb6@\xd6\xd1\\\xf2\xf0/\xee[\xbaz_\x9d\xd6\xf1\xff\x96\xa7-\x88\xe7" -"\x1bNh\xf5\x83po\xf4I\x82\xe0s[L\x9eQY\"F\xd3\x8as[\xf8\xb\x9\xc0\xec_C\xdc\x92\xb3" -"\x9b\x5\xb1H\xc0Z2\xe2\x1d\xec\xbb\xd1g\xfdR\xe1\xfb\x9\xac\x61\x18\x1f\x66\x33\x1e" -"\xfd\xa9\xfa\xa2v\xe1\x44\xacOnEv\r\xf1-iE\xaf\xb5\x19\x1aQr3\x0\xea\x98sZ\xed\x88" -"u2\xcc\xcc\x41\xcd,mr\xee\x34\x11\x9f\x15\x9e\x9c\xea" -"\xe9\x95\x33\x65\x5\xb0\xbb#U\x92z\xde\x33\x17\x39h}\x1c\xa9\xfb\x1c\x13\x1b\xf1" -"\xee\xf4\xa7#\n\xa1\xe7\x8bu2\xf8 \xdbLp\xda\x84\x18\xbcs\xbc\xd8\x16@\x1c`\x97^" -"a\xb7\xf8\x90\xbf\xe8\xb0p\x6l)\xb2!I*\x9?\xf5\x88g1\x0H\xf0L\xb\xea\xb2\r\x1bI\xce" -"{@\x14\x43\x9c\x8a\x9f\xf6\xba\x35\xcf\x1e\x1d@\x13\xbd\xac\xb5\x99\xab\xd6\xdc\x63" -"\xb3\xd1%\xc0\x10\x80\x17k\"{F\xa6H\xa1QJ\xbc\xc4\xa6\xcb\xd4\x8\xab\x8a&\xdd.\x9" -"!\x95L{\x7f\xf2\xb9X\\\xf8\x61>1\xaf\x65\x45[\xbf\xfcz\xe3:\xea\x83\\kC\xca\xd9j" -"T\xc4.\x8l\xbd\x36S\x3VI\xbd\xc\xc0M\x9\xfbm\x15\x30\x1d\x35Y\x96R\xe8\xc5qp\x95" -"8\xe3\xb2\xe1\xea\xfp\x83\xa6#8\xdf\xa6s\x8d}\x8d\xfe=\x91q\xbd.M\xa3\xa2\xb3\x36" -"\xac\xc1\x63\x41T\xfe\xb8\x61+E\x11\xb0*\x90\x95\x62u2\xf6\xa3\xc8\xcb\x8b\x63\xd2" -"\x81.\x11\xe8>\xc1\xf3\xee|\x1\xc0\xf2\x8bGd\x1a\x43\xbf\xec\xc2\xc3\x91\x88\xcd" -"K4\xea:\xe9\"\n\x45\x31\xab:\x9c\xe8\xc3\x64\x92\xe9:\xff'\xbb\xda\x86\x1f\x7\x7" -"\xa6\xb4!\x9ci\xe3>\xc3Xp\x9\xf2z\xd5\xb2\xac\xe3v\x98+\x1d\x32\x19\xa9\x17l\x16" -"zSM\xe\x46o\x1f\xb5\xef\xc9\x8b\x46\xe6\x1b\xdd\x3@\xa4\x9c\x41\xb7\xae\xc3\x6\x9e" -"\x9c\xf9\xc9\x16Z\"e\xc5\xf2\x82\x19\xd8\xb0\xbc\x11r\xccI\xdc\x1f$|\x8e\xbcK\xd8" -"4-\x85\xe5\xda\xd0\x8b%\xdf\xf\xad\xfe\xd3&T\x1c\xbd\n\xa5\xdf\xdd\xc2\xa5U\xe1\xe9" -"\x84\x91\xf0\x8b\x0\x7f\x98\x1\xc9W=\xc6$\xc8\x4\x9f\x10\xf9\xcb\x30m\x85~\xd1\n" -"\xf0\xae\xe3\xb3\\m$;\xeb)a\xbe\x7f\xd5\x0k\x8f\xdc\xa0\xdf<\\\xd7'\x9 \xab\x11\x1e" -"\x97_9f\n\x16\x13j\xc5\x8e\xe5\x98\xd1\x44\xedQ\xcc\x4\x2>9\x6>`\xd9\x5\xe1<\x8a" -"\x98\x82O\x5\xe5[x\x82\xd6\xa3\xb7$\xd9q\xacg'/\x92Sw\xcaQ\xa1\x42\xdc\xe6`\xab~" -"\x1f;+\x14\x17\x45\xa1\xfd\x84i\x82\x19\xfd\x99\xa6\x9d\xc2\xfcO2\x1a\xf2`\xea\xff" -"_L\xe3\xb>5J\x8f\x91\xdf\x44#\x9\x93|\x82\xf2Q\xa5\x7\x96=\x1fx\x8f\x62\xfc$\xeb" -"\xcb\x41\xbeq\xacmf\xba\x9qC\xd1G\xcc\xd3\xef}\xda\x46&[\xe9Ic\xdd\x1e\xda\x9c\x43" -"\xdf\x41GNW\xf2\x82\xa1\xde Io\xe2\xb9\x37K\xf\x2\xe0P=\xaf\xd5\xa3\xc6n\xf4\xf4" -"|\xee\xd6\xc3,\xb7\x90v}\xb7\xd4\xdf{\xe?Y\xeb\xb5y\x18\x8e\xba\x88\x8djI\x86Q\x98" -"\xcd\\\xe6(2\x9e%\xe2\xc0'\x94Z,,\x1c\x96\xfd\\\xd8\xca\x2\xae\x36:\x7\xdd\x87\xf4" -"\x14\xb1\xdd\x7f\x16\xda\xefx\xf4Oe\xdb\xa6\xdd!\xd2\xd2\x61\xf2\x4\xe6V\xf6Y\xc6" -"\x94\x8c\xdc\x4\x9b'\xba\x9b\xcb\x97\xb8\xc8\xde\xc3\xb8\xc6\x66!uJ\xc5\x17z\x11" -"\xc4\xb0\x66\x9f\xc9\x42t\xe3\xf8\x17n2t\xa9\xb9\xad\x8b\xddv\x98x\xff^n\xf5\x92" -"\xd5#\x7kx\xee.\xac\x10\x34(\x12\xcd\x31#\xa0\xae\xe6\xf3\x30&\x99\xeb\x42(\xa1\n" -"b\xe3\xbe\xf8\xa9\x42\xb8\xa4\xb8\xc0v\xe2\xce\x46T(]\"sD\x9f\xe7\xd2\xba\xd3\x41" -"\x99\xe$\xae\x8d\xebQ\xfdN\xf6\x43\xbe\x9e\xc0}g\x84\x5]\xc5\xed\x65\x43L\xdc\x8f" -"\xa9\xc0\xb8tk\xaf\x86>\xa4\x92\xf0\x9d\x85l\xdc\xef\x84\xccG\xe2\xc5\x8e}\x8d\x1d" -"\xf5\xbc\x96\xe9\x1\xc\xd6\xc3j\xc2,7\xc4\xc2_\xff\xf5\x90\\\xf6\x2\xe9|\xa8{\xba" -"\xc8\x14\xb7q\x8c\x34L\xbb\x1fW\x99\xcb_A\x92!IKM\xa2\xe3\xe3\xfaI\x16\xbc\x84\x1b" -"Xk@\x10-\xb1\xb6,u^\xe2\xec\n\xe2\x64\xf7i\xec\x97\x42\xd4\x8a\x8c\x84\x80\xd9\x13" -"\x7f\xe5\xff\x6\xf7\x33h\x8\xa6\x30\x8a\xaa\x9c\xa3\x9#*\\\xc7o7C\x11\x97\x17L\x8a" -"\xe0\xab\x34y\xec\xc4\x16\xf4T\x11'\xc3;\x10\x8c\x19Yh\xf0\x45Y\xb0\xadvJ\x7f\xbd" -"\x91\x9d\x80\xd7\xa0\xc5}\xd9\xc8.H])\xd9\xeap#H\xadG#A\xc6\x31\x9cP\xa0k\xff\xa5" -"\xd6IG\x3\xdb\x39\xc3\x6\x45\x9a\xfa\x39m6o\x5\xca\xae\xa1\xa9\xe5\x16\xf1\x13\xe8" -"\xaby\xc3\xe5\xf3\xcd\x8a\\\xea\x83?\xb4n8\xb2=\xb7_O\xcc\x8e\x37~\x2\x98\xc5\x93" -"\r\xaeJ\x96\xa1\x9e\xf1u!N\xb3\x92\xaa\xd2!\xd6\xa8 \xe5\r\x65\xa6\x96\xb1\x37\x1f" -"J\xdex\xca\xb9\x39V\xde)\x9f\xe1\x65\xda\xac\x89\xc4V\xf3\xd8IX\xd1M\x13qj\xe5\xc8" -"A\xea\x6\xb7n\xbc\x61\xcd\xd4\xcb\xdf\xd7\x33,\x95\x46S-\x84\xe2\xf0\x43y\x0Q\xb" -"c\xdb*YG\xffR\xb9\xe7\xfa\xd9\xe0\xf9@\xe3\x9c\xd3\xd4\xdb\xf\xb6\x37L\xa3\xf7\x0" -"\xf1\x45}\xe5wA\xe5\xf4\xb8R\xf3NHb+mS^q\x80{E\xa8\xf1\xf8\xa7j6{\xb2\xea\x83,\xac" -"\xa6/\xa2\xfe\xbd\xa8\xd8\xbe\x62\xc5\xba\xd7n\xa9x\xdbm]\x8ZQ\x1e\xean\x8d%\xb3" -"\x8e?f\xe3=\x90\xa0\xa0v\xf0\xbct\xc4\xb0\x42\xab\xa8*\x14\x6z\xe1\x46\x34\x0l\xf8" -"uN\xb3\xc6''\xb4}\xd0\xf0\xa8v\x85\x15\xe4\xf8\xf3\x34\x0\xeah\xa9\xa9\xf4\xca\x66" -"\xf8\x39\x46\xdb\xaf:\xe5o\xe5u\x1\x2\x46\xa7N84\xce\x96 `91T\xd7M\xa8\xee\xeb\x93" -"\xbc\xdf \xad\x1e\x95\xf4}\xd2q\xa5\xef\x5v\xc7\xdd\xd2\xeb\xba\xdelT\xea\x93m\x8b" -"1\xe6\x9f\x1aQ\xa7\x9as\xd6\xae$\xc1Q\x11\xae\xe8`\xe7\xed\xb9\x36.S\xb2\xa3\x87" -"fB\x82\x8e\xaaU\xc7\xea\x8e\x9f\x65nC\xdb\xe0%\x36\xe4v\xba{\x97\xcf\xaa\x96\xaf" -"u\xb0\x87\xb5}\xe3[\xc1\xcb\xfb\x4\xce\x17\xf0(D\xd5\xa0o4\xde#5b\xf2n\xa5\x85O-" -"\xa4\xb3Z\xbd'\x9aV\xb3[\x19\xdc\x32\xeb\x9c{N\xda\x9f>L\xc0w6\x6\xa5\xac\xd4\xb8" -"\xf3)\xf5_|\xc3\")\x1K\xe7\xd5\xe7S\xfa\x83Z.\xb7\xf7\xcc|\xc9\xbf\xa3\xdc-\x8a\x9b" -"\xd3!\x7f\xd4\x1e\x30\x1c\x3\x9a\xbb\x30TB*n8~\x92[\x87 $\xb8;\x80\xe6\xe3,\x99\xc5" -"8\xb\"\xcc'\x93\x92\x12\xdb\xd2\xc9k\x8dN.\x4\xe5\xb6N\xd3\x16\xd8\xe1\xafs\xaby" -"d[b\xf1]9\x1e\xf2\x45\x4\xb1w0\xf8\x1\xc3o,\x7i\xce^\x87\x6\x11\x33\xf9 \x17\xed" -"\xda\x1c#\xf7P&:\x92\xc8\xc2\x88\x8a\xe9\x37\x94\x43LcQ.\xb%t\xd9\xad\xe9\xea\xf6" -"\x0\x8dK\xaem\x1e\xe3\xa8'u\x8b\"\xf\xdbI\x14\xf2\x15H\xd1z\xc5\xe8t\xc9q#|\x7f\x0" -"\xf1\xf3\xc3.[n\x1\xa0\x13\x35H\x8a\xc3\xbbH\x10\xdc\xd0\x61\x41\x91\x42\x7f\xbf" -"\x6\xacp\xe3&>Be\x14\x1a\x14i\x5\xe/\xe5\x1d*\x96\x9\x96\x42\x1b\x85\x43\x12\xd0" -"d\xa5|>\xd3\x98L\xf9g\xed'\xa9\x4\x91!\xf7\x41/*\x91{\x97\xa9 *\x5\x5\xb7\xe9\x37" -"\x89\x8a.\xdc\x9a\x95\xf9\x36\x5\xbc\xe7\xb5\x80\xbX\xb\x82z\xb2\x61\x8ft\xf1\xc4" -"c\xcb{*\x7\x41\xae\xf4:\xce\xbf\xbc\xc8\xbR\xf8\x94\x80l\x9d\x6\xa2\xa0\xea\x8b\xab" -"\xec\xdf\x11\xfc\x1f\xfe\xe0Zc3]\xe1\xe1W\xab\xc8Q$f\xc2\xcb\xb9\xf7#f\xc0L\xaf\xb" -"5\xad\x8a|\xf8\xf5\xe4O\xfd\xdd\xb9\x62\x62\xc7\xef\xcb\x36\x9\x64\xdf\x89\x42jM" -"\xeb\x87\xee\x98\xee\xcM\x82\x31\xa0\xf0\xaf\x9ao\x91\x11\xda|+T\xa3\xd3\x9e\xc8" -"{\xaeM\xe6 J\xae\x11\xfd\xc4\x82\xb5N\xa5#\x95\xdex\x6\xb4\xa2Ic\x84\x17\x98\xa9" -"\xa4y|\xc6tz'\x85\xeb+[\xf7~7\x14;.X\"\xf1(A\x15SU\x8f`%\xf2\xd7\xeb\r\xd8hN\x12" -"\x15LX\x6\x1e\x18\xc9\xa8\x66\x9\xc7\\*!\xb8\x1e\xbegM\n\xaa\xffQ\xd4\x80\xcdT{\x16" -":!\xa7\xed\xe4g\xb2\xff\x2\x8a\x87\xd6K\x8b\xd0\x99\xb9'\x98\x1f/\xa7o\xdcsNS\xb3" -"\x9\x65>\xd6&<\xd1x.Xa\xb\xe7\x9b\xea\xb7\xcb\xbb~\xdb\x8a\xab\x8d\xe9\x8dsB\xaa" -"\xff@yZNBHBY\x13\x8d<6\x6\xae\xf6JS\xdc\x66\x45^F%>\x7f\x12\xb8\x10\xac\x37\xec\x63" -"\xde)]\x6\x12^\x82\xfa_\xf5!t~t\x96\xc5hj\x1a\xaa\x7\x90\xe6Z\xee\x5nB\x85sT\x1e" -"?}K}\xc3q\x83g\xc5\x8aSx7\xd7\x83\xce\x36(\xc\x8a\xb3\xd2\xce\xc3\xd9 \x95H\xcfR" -"\xcf\x30\x45\x89\xcc\x39\x6\xc8:\xc0tEG\x9f\x80\x84S\xbc\x1c\x81T\xd0\xc7\x9OE\xe" -"\xff \x1d\xb7Y>.\xfa\xaa:\xc8\xd9\xc6T\x12\x9f\xad<\xa2\xf9\xc4\x92\xc8\xa7nq\xea" -"F>\xb1.M<\xf\x33t6\xdbX\xf8\xb4\x94#\xcc\x9e\xfa\xe7\x16U\x8b\x90\xa5?\xdb< c\xfd" -"\xc4\xec\x95N\x99\xde$v\xa0\x64\x89\x9a-j\x16\xef@%\x85\xf3\x16\x7f\x93(Gw\x84\xf5" -"\xd7\x8b\xba\x42\x8d\" \xdc\x37[\xf0\xc5g\xbe\xae{\xf7\xd2|\xdd\xc9\xcasM_\xf5vF" -"\x6`\xc\xfa\x3\x91\\\xf7\xa9\x37\xbe\xb1H.\xab-\xa6_\x91\x37J+rwn\x9d#<#\xfd';\xfb" -"WMM\x19\xe5\x41\x8\xfeMg\x1f\xc5\x1a\xec\x63\xe4=\xfb;\xda\xa3\x38\xa3\xe0\xc1\x93" -"w\xb1\x1aUl\xa8n\xd0\xe1\x81\x46\x1d\xc9h\xc7\xe3\x8c\xc9\xa5U\x1c\xfb\xf0\x8e\x10" -"\x19\xdd\xc3\x89\x34\x95\xd0\xc7\x36\x37\x13\x1f~|\xcb\xf5\x9b\xe7\xcdZd\xf6\x7\xa1" -"\x8c\xd1\xd6>\\6\xe\xbN\xc2\x8d\x1a\xbc\x92\x7\xec$\xd6U\x99Gu\x4S\xb9g+\xde\x83" -"\xf0#*\xabs\xd9m\x3+\xd3Zk\x1d\xc3}8\xdd\xe2\xb1\xbd\x88M\xda\x95\x9=\x6K\xei\x1c" -"\x8a\x6\x13\xbf\x42\x46/RM\xcb\xa9\xaa\xdf\x99\xb0;x\xb8\xb9\xe8>7D=\xc9,\x95qt1" -"(\xd1\xa7\xdd\x9du\xb9\xa7\xc6s\x83\xca\xe3h\xa2\xce\xc2}\x9d\xcd\x35\x4\xe2\x37" -"X L\x7\x9a\x89\x44\xab\xb0U\x3\x89v`,x\xd4\xf6\xee\xa2:U\xb7\xa7\xc1\xafJ\xbb\x18" -"I\xd3\x1eyf-\xa7&\x91J\xbb\x98}#NP\xd3?\x1bwU{\xc8ra\xee\x98@\xa8\x14\xdf\xc5\xc4" -"\xc5\xe0\xe5\x89ZJ\x14.\x8c!\xde\xfb\x15\xf9\x9f\xbd\xa4\xad\xb6\x95g\x95\x80\x96" -"\x18\xa8J184\xe9\xe3I\xd3:Y>\xe7\xdatb(\x8e\xda`\x84\xcT\x9cj\xf6\x9a\xd2\xfeuA9" -"\x17\xd5\x35\xc1\x87z\x82\x90y\xb4\xc0W>\rt\x17\xb5\x43\xbf\nW$\xaf\xd9\x98R\x7f" -"\x6\x94g\xdc\xfb\xef\x1\x62l\xb8\xb4Y\xee{-\x9a\x43\x95O\xdc\xeb\xa4\x9f\xa0\xdb" -"\xed\xbc\xecU\x99\xc6\x91\x37\x3\xfeN\xb3\xd6z\x8%\x0\x9e\x1d\xef:Z\xde\xa6\x15\x1f" -"\x1b@\xd8\xdf\x82X\xf4\x32{w\xa3\x1f\x11\x7\x9c\xb\x8e\x92l\xaf\x33\x46\x8\x37\xe" -"\xe8\xa0\x8b\xfa\xae\x13wi\xec\xaa\x18!ox\xb6\x81\xa0\xdft\x1b\xb2\x80^3\x8\xf3\xe1" -"k\xb1\xd2\xffV\xd1\x86\x94\xa6K1\x2\x9dJm6F\x97)\xfb\xec[\xb\xbe\xb7\x0\x90\xe7\xf7" -"\n\xd2\xe7\x94~Oa\xe7\xecg\xcf\xd4\xbc\xe9\xb6\x9a\x17YVr1}\x87\x8c\x1d\xb,\x9e\x1d" -"\xba'\x89\x1\xe3>\x16\xd5\x9f`\xb0m\xb8\x42\xde\x61j\x92\xc0\x1b\xc7\x81\x65S\x87" -"\x2\xcd\xf4\x99\x7!\xbc\xdc\xce\xab\xed\x42w+3*\xab\xce\x8$\xfe\x1\x37k\xa6\x64*" -"\xff\x89\xe7\xa2\x35\x8\x18\xfa\x1d^a\xe1\x1eXs\"v\x9f\xed\xe4\x42\xd6\xf8\x18\xee" -"Ds\x82\x90\xa8\xfc\xdc,\xbb[M\xf3\xf\xdb\xf3\xb6\xb3\x98\xba\x13\xd4\xed\x8a\xc5" -"4e\xd2~@\x81\xce_\x85\x42:\xe5q\xc4\x1b\xd2\xea\x7\x8a}T\xb6\xb6p\xf3\xf5\xef\xda" -"|\xa0Gh\xd0\x9c\xc0\xd6$m\x15H\xcf\x37oG\xf3\xea\x9c\x8e\xc4(\x16\x81O\xa1\x61GX" -"\x9a-=\xad}M\xac\xb8\x89^\x2\\\xd6\xb+\x2\xfdhb\x81\x12\x8du\xdc\x16\xa8{N\x8\xca" -"\xe5\x9e\x83\xa9\xb4V\x1a\xb0\x90\xb4\xa7\xd0\xe2\xb5\x31\xd5\xfb\xe6(\xd1\x99\x1d" -"\xe7qzW\x89\x42\xc2&x\x99rne\xc6\x12\x11\x98\x62\x34\x96Q\x18N\xa0\x1aU\x18\x3\xd0" -"6\x80 \xf0{\x1\xcf\xbb\xc1&\xc1\x42\xe2s\x8ep\xc1\xf7\x88\xf7\xf2\x1b\xe\x8b\x1b" -"J\xaaj\xcf\\\x9f\n\x37\xc2\x8a\xea\xd2\xfb^\xfc\x19\xbc\xcd\x9a)tz\xc9\x8\x0\xd7" -"VsC\xff?\xd3\x11\x91^\x94\nq9\x8d\xb4\x63V \xb\xac\xd8\xc9\x9ex\xa8\xdbQ\xe6@rV\xa0" -"\x13\xd7\x8c\xb6\xd1\x3\xcd\x10\xca\xb4\xee\xcf}\xec\x0\xfdx#\x3\x81\xa7#\x1d\x90" -"\x94\xff\xb1\x93\x15\x1e?\xaa\xc1\xf1\x11\xa2\x39\xbc\xbb\xbc\x9\xc7\x81@\x18\x8a\x39^\xf\xf7h\x85\xf9\xdfJX\x89\x39" -"\xfb@6$P\xbe\x66)>]\x8dM!\x8d\xc\r\x10\x11\xe1\xf5i\xa4\xc0\xe\xe8\x1f\x19\x9eYU" -"\xf5\xaf\xf8\xc\x1d\xa8\x38\x8f\xd4\x7\xf0>M \x87\x36\xe9?+e\x1a?\xd7%\x91\x9e+`" -":\x3\xe9\x17\x0\xcf\x66\xbeK\xbd\x46\xe8\x8\x1a\\_\x14p\xfa\x13y\xe0\x98\x2\xbfK" -"\xe4\xa5{\xdb\x39\xf0/h\xc8\x13\xcf\x1d=i\xfby\x85\x42\xd3T\x8\\;\xb1\x36^\x18\x46" -"\x7\xdc\x1a`\xc1\xd3\x42\xc9\x43\"\xee\x8f\x96\xfc\xcf\x92\x85WoOG\xce\x11\xa1xj" -",\x9e\x81{\x90\xeb\x43\xdfXf8\xb5\xc4\x9fVA\xe9\xfe\xf2\x42\x32\x42}[\xf\x42=\xcb" -"\x97\xd7v\x11\xcd\xe8\x44\xb6\xe\x89\x46>\xe2\x13\\-4\xcf\xaf\x1d\xa8\xb\xc1\xa6" -"\xcb\xf4n[\x8a\xdf|Q.\xe3\xe9\x0\x94\xa9-VM\xad\xbf\x7\xa8\x33#\xac\xf2\x5\xb\xb1" -"\x99O9\x15\x4\xa1\rg\xb4\xb3-\xb4\xab\xd8\xce\xf7\n\xb9\xd1\xbc\x94\x91m^\xf2\xa9" -"\x97\xe3u_\xce%~\x85\n\xf0\x90\x1a\xd8\xfd\x89\xb7\xdb\x38\x15\xd1\x65R\xc2\x33;" -"\xc4\xa1\xa7\x32\x61\x95_<\x84,\xdf\x9f\x8d\xe9\xc8\xbfK\xab/\xe4\xf2\xb6\xeb\x65" -"\xb\xb8\x8c\x3\x92\xff\xfd\x9d\x33\xa7{\xe1\xbb\xa1\x1e\xdbk\xce\x33j\xfd\x61J\x98" -"oS\x9dJ\xb9\x9y\x17\xa5\x98\xac\xdc\x34\x1e\xcb\xdb/\xadtH\xee\xd3\xbf\xb4K\xf0?" -"\x18\xd4W\r]\xbb\x98\x99\xfb=\xf1\x8b\x37\\\x80%\x83\xdc\xea\x90\xac\x38>D\x87\x83" -"[\xdb}\xaa\x93p\xce\xd3\xfd\xe2\xa7\x2\xbagC\x97\x63\xf8\x1b\xd0\xf4\x9a\"\x81\x19" -"\x15\xc4\x0\x9f\x95\x87_4b+\xb1\xdb\xc2TA\x9e\x1e\x36\xc6\x36\xbc\x32\x1a<\x1fv]" -"\xdet)\xde\xa1P\xbrW\xf4\x90\xb5<\x1a\x65\xbfU\xd9X\xd0,\x6\xe6\xdf\x8b\xe7.\x9d" -"\xe0t{\xb8\x13\x85\x7f\x88\x84\xf5\x38\x18\x43\x12\xb7\xa0\xc4I\xbb\x95\xe,w\x90" -"\xffK\x18\xb6y\x1O\x3\x3\x37\xf0\xad\xc5\xea\xdd\x12\xf7h\x8b\x2\x90\x9c\xd1\x1\x31" -"\xb7\xf0K\x88\x8bk@\x91oAm\xf9%;C\x8\xed\xef\xd9\xb0/\x1a\xec\x8e\xa0 \xb2)\x12^" -"\xe0_!\x3\xa8O\x11\x89`\x7]\xf1\xb4\x1b\xda\x1\xd7w\x86\x1c\xc7\xfe\xb4P(U@\xe8\n" -"\xfc\xca\xf8\xe0\xbd\xfd\xda\xb3\x1e\xc4N]%\xc3\x83\xa2k\xe6.\x1d\x41)\xe1\x63\xd9" -"\x8d,\x96\x91\x85\xa1\xe2\x1f\xda@\xf6\x1d\xd5\x9c\xde\xbfV\xa1\xa5`\x1c\xe7(\x18" -"\x9a\xfa\x62\xcc\xf3\xef\xb2\x8e\x94\xa4Vj\x1f\xf6T\xa9\xc7\xc3K|4\xd7\xc6\x31\xd6" -"k\xaaH\xeb\xe5\x1a\x46\xfc\xc9\x63\x10\xd3\x19\xd3\xea\x1b\xb6\x9b\x14\xd0\x5\xaf" -"s\x8f\xb1\xe2\x7\xbe?\xf9\xb5m>\x8\x7\xe8\xc7\xbcNN)r0\x82\x38H\xfa\xab\xe5P\x16" -"cNWQ(Y\xb8LG`\xd9\xe0\x9d \x99\xf8\x62q\x18\xefM\xc5\xf1$\xfd\xf7\x41\xcd\xbf\x37" -",\xc6@\xcf\xa9\x1c\xf7\xbf\x6\x8f-~\x7f\x16\xd5|1dv;\xb0\xd9\x9d\xf5\x14p3\x9f\x2" -"\xb8\x93?'\xf0\xf6O\xf6\x82\xac\x8e\xde\xc3\xf3\xb0\x43Q\x4S`S\xac\xc5\xc0\xff\x62" -"\x6\x1f\x8c\x9e\xebq=\xbc\xb5\xb5\xdf\x4\xd9O\x99\xf3\x14P\x1d\xfelC\x14\x46\x8\x39" -"\xf8\x94\xcc\\\xbf\x87nN\xdfi5\xb3\xb2\xe2\xbbW\x10%\xf1Q#\xd5\x8a\xb+M]<&\xa1(\xe3" -"\xae[g\xcc\xdd\x88LPzZ7\xfdo\xd8\xf6u\x9f\x9d\x92z\xfd\x8a\x82\xb0\xaaxI\x8c\xe0" -"\x99\xf8\xe7\xb\xb1\xb0\x88\xbd\x8f\xe9\xb\xecpO\x8e\x84\xe8\xe1V\xe9`\xbe\xd5\xb3\x10\xa1\x90V\xca\xf9\x7f\x62\xd6 \xf0\x30i\xf6\x9" -"\x13&\x0\x86=d\xc7&\xc9\x83\xb3\x37\xff\x9G\x8f\x8f\xf6\x39\x89\x8e\xb=\xca\xf8M" -"\xco\xe2\x9b\xda\xab\xfc\xb1\xb6\x35\x64v\x9b\xec\xf6\xd5\xdd\x92\xa2\x88\x3L\x5" -"-\xb4\x63\x95-%\xe1S\x9c\xdb&dk\x8c\\\xaf\x44\\\x19\x90\xd3\x86\xc8W\x4\xf7\x61\xdd" -"\xee\xd3\x11|*\xa3p-B\xc3\xad\xcf\x9b\xc2\xaf\xb1K \xc5 \x1b\x34\xeaT\x9f{\x85\x8b" -"U\xadM`\x85\xed\xb3\x1e\x65.\xe6)\x1c\xf2\xfe\xeb\x32\x4\xd5\xe3\xa6n1y\x92\x64\xbc" -"\x9cV_\x5n\xe/&\xb2\x37\x64\x2\x1a\x33\xfa\x81\x34|:\xe7\x91\xae\x8d\x35\xae\xc4" -"\x1d\xcd\x89$Y65\xe2\x8d\xaaZ\x3z\xc4\x84k\x0\xceXx\xe3N\xec\xfe\xec\x89\xa5I\xaa" -"M\x3\xb3\xc0\x3LTd`\x1\"\x64%\xfb\x1bs\xbb!\xeb\x83**\xe2_\xd4\xf9\xf1\xa3g%\xf3" -"\x18\xf5.\x16\xe5\xb7\x81\x31\x9d\x8f\xafmW\xb0P\x9c\xa5\\@\xfa\xf8\xc5\x98RR8\x3" -"\xb9\x87!\xe5\xef\x32`\x85\x1\xf2\xd9\xa6O\x92\xb8\xa0\xcd/\x12\xf8\x85\xb6\x35\x1c" -"\xb7\x82\xdb\xc5\x99\xee\xd6\x16\xd4V\xed\x10\x10\x6\x98\x1c{\n\xfaL\x83\xb9g\xae" -"\xc9l\x93\xf8\xa5\xe4\xed>k\xbd\x90\x61\xa3\xc1\x2\x31\xc2\xd1\xe5g\x91\x7f\x62\x65" -"j^\xa3\x45xW|\xce\xd1\x8c\xd5\xee\x1f\xa0\xb3\xf7\xdd\x15\xb2\x9d\xc1\xe4\x14q\xc1" -"q9a\xd3\xc9\xb6\x64\xa9\x4\xb8\x8a\xa0\x87\x66\x2\x96$\xc\xfb\xed\x15w\xb0\xcd\xe9" -"\xa4\xeekzss\xaf\xa8,>\x6\xb2\xddo\xff\xef\xff\x92le2](\x97@\xf1\x99n:!BG\xcc(JT" -"Z\xc6\xc3\xd3\x8f\x62\x83\x33\xac\xf\xfd\x19\xadR\xd2\x34\x8c\xa8\x38\xb3\x64\x42" -"\xd6\x9b)k\x80\xe6\x0\xba\xe6\x32\xe3\xf0X\xdb\x43\xe4\x11\x7q\x94L\xac\xa9\x90\x66" -"\xdd\xcc}\xb8\xcb\x31\xbf\x1b\xacG0\x86\xea\xf\xebh\xeI\xdd\xeb\x96\r\n\xee\x5M\xb2" -"\xad\xc7\xba\xc8l\xaa\xaa\xc0\x8f\x8c\x90\x86-\xe1\xf8q\x5\xc1#\xf7W:\xfei3\xad\xf3" -"\x8f\x30\x1a\xf5\xf\xd2\x1f\xb5\xdcr')h\xe5\xcb\xe|\xba\xd4\\\xd8\x44\x9b\xd7\xad" -"\x1a\x9c\xb5\xee\x80\xa9LA\xad\x38\x9eg\x98\xd5S\xa7\x41\xa6)\xf3s\x15\xdb\x92\xe2" -"I\x9bG9_6B\x92'\xe2t\xd9z4\x85=,\xcf\x16\xd3|\xad\xa2\xb\xd1\x1e~\xfc\x18\x1c\xa0" -"\x4.\"\xbf\x4\x1c\xd5H\xa5\xeY|\x2 \x89\x14\xd5s\xaf\x85H-\xf6\xd9\xc1\x64\xbbH\xe5" -"]\xab\xfd\xb3\x8b\xd5\x45\x1e\xf3\x5\xe1\xca\xd3\"\xaf\xa8\x14\x44\x88kJ?\x94|\xb1" -"QA\x9a\xb9\x2\x30&\xc3\xbd\xef\x10To\x9a\xbeVp\xeJ\xc4g\xe8V\xff\x1f\xa1h!\rX\\W" -"{\xed':\xcb\x7kC\n\xe2K9\xe7;m\xab\x1a\x4\x9d\xfd\xa1\x92\xf6\xc6\x34\x61\x1Q\xb4" -"\x14\xacH\x1e\x83\x90Wo\xbd\xe?\x1b\xe2\xb2\xaf\x9a\xdfs\n\x18\x61\xd4l\xe0:)\x89" -"v\x17\xac\xf6U\xffILx7\xfb\x85\xb1\xb9\x34mt\xc7V\xa1\xab\xce\xcdGf1P\x12\x11\xeb" -"\xac\x65\x89\xc8\x15IA\x1b\xf3\x65W[\xec\x7f \x9eg\xf\xef\x1\xc0\x8\n\xbd+\x85,K" -"\xcf\xa4+\xcJ\xb9\xf\xdf\x99\xe3\xde\x19V#\x13\xe8\xaa\xd6\x97\xbe%\xbc\xa2\xba\x9e" -"\x86\r\x9c\x97\x2\x10\x8e\x80\xdd\x7\x1\xa4\x88\x66?\xaf\x8b!P\xd7h8\x1f\xac\xf3" -"\x98\x87<\xd9\xb4l\xd9<\x9b\xea-Wl\xab\xdd\x91\xbf\xe<\xf8\x6\x36\x9b\xd4\xc3\xe9" -"\xdf\xe0\x61p\x87\xeb\x3= d\x80\x61\x10\xa0V\xb1Q\xc1_\x89[l\x9a\xc6\x18?\x17\xda" -"\xc9\x41\xf1\x6\xem\x12v\xa0\xce\xd4\xd1~\x84K\xc6\xa2Xs\xc4\xff\x83\xf1\xb5\xa5" -"[\xd3\xeb\xf6\xe5\x65\x9a\xfa\x8#p\xb\x61\x31\xb9\x9b\x9a\x92\xaf\x31\xe6\x80N\xe" -"]\x88RJTedg\xf\xa2zk\xd3\xc0\xfd\xb6P\xbcw\xe1\xd6\x87\xd2\xe9\xb1\x1dw\xa5m\x4\x41" -"@\xa0\xe3\x8c\x9a\xb4i\xf6\xa9Y}/\xd9q\x85\xc8\x62k\xec\x11\x83\xf1\x64\x11\xc1\x1a" -"\x19\x36\xdd\xb9O\xe\xb8n\xa0\x34,H\xd9s\x8f\xd5\xd1\xdc\xfb\x9b$Q\xdb\x44\xbc\x63" -"\xc5\xe5\xc\x1d_g\xf0]_hi\xfP_\x1f\xd0\x9a&\x5\xb3%\xb8@\xc8\xfe\x97\xe1\xca\xf5" -"B\x86\x8f\x65\xbb\xec\xbe\xc7\x17\x1dh\x9a\xf\x8f\xad\x45|`_\xa5\xb1\x44)\x99g\x1" -"d\x8e\xa1o\xfY\xcb(\xbc\xd1\xa2\xc0w\xd3\xc5\xc7&{\xef\xe1\xf4\x63\x37\xfd#K\xc8" -"+\x83\x19\nkW\xcb\xf7\x41u\xae\xf0\xd3\x90\xad\x9c\x30\xa7\x9f\x32\x87\xf9\xffg\x13" -"\x11?C\xa5\xb6\r\x9f!\xeb\xec.=y\xbb\xc9J\xd0[Wb\x13\x34\x9d\xe2\x38\xdf\x93Q\xfd" -"H\xf6i\x15z\xa4S\xc1\x6,\x8fI\xa2m\xcf\xaa\xa0\\\xf7\x1ai\x81\xab\xb9\x39\x94\x2" -"\xc3\x32x\xfd\"J\xf\xa7o>\x9\x1cP\x86\x95\xccz\xfc\r\xf6\x94\x9a\x43\x64\x1e,\x91" -"\xac\xce\xc,f\xfc\xb5\x38\x17>\xd1\xc3\xb5\x17\xd0|1m\xd8\xce\x38\xa4\xee\xe4\x81" -")\xd5z\x1b\x98\xa9\x11\xf\x13\xed\x11p5{\xbe\xad\xfb\xd0\xf8\xe4\xd3\xe2\xcc\xfa\xcc :\xf7" -"\xb5K\xa5\xbf\xb9\xdb\x30T\xa3\x9f\xd6\x81\x91=\xd8\xd9\x4\xfa\x44\x33\xb6%i\xbc" -"\x8\x35\x63\xfd\x19\x9d\x8e)\xf3\xea\x16\xd9\n\xd8z\xf6\xe4KK\x18\x5\xd2\xdd\xc2" -"T'\xd7V\xf3\x8d*\xbfy\xcd\xcf\x33\x1f\x37\x61&\xc0\xb9'F\xe8&\x7f\xa7\x8bW\x96]\xb" -"#}\xe4V\xe8K\x8f\x32\x14N\xd8]\xf5\xeb\xb\x65\x9c#\xa5\x42\xd5?#\x8e\x32\xc0\x1e" -"\xca]\xfd\xdb\x5\x42\xef\x45\xfe\x64-\x8d\xfc\x11\x8d\xc6\x88y\xaaH\xa1\xd4\xc5\xb7" -"dX:\x99\xd6\xa1\xff\xdb\xe}\xf5i\xe7\xcb\x1d#\xf1\xf1\xe7\x93\xe5\x61\x88-\xe7\x34" -"\xdaw\x97\xb1-\x5\x7fW'km\xf8Y\xd1\xe9\"\xd7\xf2j8\x1c\x95\xe5\x4\xe7\x8b\xca\xad" -"Tn\xc6L\xea\x96\x89+\xef\x87\xf1\x1e\x4\xb3%#vn\xd6\xc0\xfb\x17\x9c\x88u\xb8 \x14" -"\x9c\xf8'\xb5\x88\xee\xda\xcbK\xba\xef\xe3`1\x89\xd6;\xa5O\xb0\x32\xcf\xa4.R4\xcd" -"\xd1\xda\r|\xc2j\xd0\x93\xe5\x9s\xc1\xd8<\x1a\x94s\xdd\xf6%\xefx^\x85\x9d\xae\xce" -"\xd5\x96\x10\xb2\xc1\xea\x91\x80\xba\xa5L\x8f\r\x17\x8c\xa3\xec\x39\x63^\xd8\x9d" -"\xcc\xc5\x41\xe1\xc7\xf7\x1e\x9d\xc3\x43\xcb\xfe\xa2\x8b\xa0\xa5\xe0n>x\xe3\xac\xa3" -"\xd3\xb9s\x1dub\xf3$\x1b\x35l\xe9\xb1\xa4\xfa\x9fOj\x2\x97\xde\xd2uu\xbb\xd7\r\xd3" -"S\xa9\x9b\xd4*\xcck\x9e\xf\xe2\x66\xfb\x1a\x45\x94\xc\x95\xf7\xbb^D\x10Y\xa4`+\xdd" -".\xbe\x32\xa3\x36@}\xb0n\x85\x3\xec:\xf9\x80\x92\x31Hf2\x0\x64\xbe\x36\x41N\xf2\xfc" -"n\xfe\xfd\xad\x1f\x37\x97\x95\xde\\n\xa1\x83\xa9\xb6\xd0\xf\xaf\x63,(\xc2\x13\xea" -"\xc7ZP\xb6\x1a\x10\x0\x13\xaa\x61\x43\xbc\xd6o\x81\xdb\xde\x19\x64\xcb\x16\xeb\r" -"P\xca\xaf|\xf5\x39\x95L\xe7>\x1bU\xb6\x30\xd9\xb6\xf1\"\xce\x97\x82\xa1]\xb0\x6\x18" -"{\xf2\x4\xc7\x92 \xf4Gt\x8b?\xe1JL^o\x93ye^\xb1\x43{\xf2\x86\xe4}\x8c\x89\x98\xca" -"A\xa5\x18\xb5\xf8\xd0\x65\xcf]\xf7\x84n\xdc\xee\x85\xe2.\x96\xe\x84S\x9c\xa2\x44" -"\xbe\xb3\xde\xf6G\xd4y\xa4\xd4\r\x84\xc8\xad\xbe\xa4\x31\xa4\xbbTk\xc0\xfe\xb\xfb" -"S\xcata[\xe0|,\x87\xadg\x16\xc\xa1\x9a\xb4\xa0l\xe\x3\xba\xc9\xbb\xf0\x62\x84\x9a" -"b\xe0\x39\x82\xb0\x1c\xe7)\xec\x85H}/\",\xdf\x85\x96\x8f\xcbO\x1f\x87\xf6\xb1&?\xa9" -"\xa0O\"\xa0\x65\x0\xfa\x85R\xda\x33.\xf7\x99\x18\x10\xa5\xb2\x9a\xe7\x8d\x1cKS`{" -"\xcT\x9\xe2\xcc\xad\xa7\x31\x37*\xd7\xf3n\xf0\x93l\xdb',\x8c\xc8\xf6\xe2\x99\x19" -"\x93__\xffW\xd9.x\xfa\x8e\xb2\xd0MCp\xf9\xed\x43\xc0\xcf\xee\xe1\xb8\x86\x45\xa6" -"\xf5j\xc4\xf8\xfa\xdd\xb3@\xe3\xa0;>P\xb9\x90WN\xebU\x8\xe7\x88L<'\xb4\x5\x8e&>l" -"\x98\x9e\xc6\xa3H\x94\x94\x87\xbeOJ\x88\xe8XY\x0\xef@\x94\xc0\xdbm'L\xc0U\xaa\x94" -"dx\xb7\x89s\xe0\x64\x8cu\xfa\xb\x46t\x9\x46\x14\xcf\xd8\x5\xaf\xbc\xfb\xb3\xcc\x18" -"\x6Q\xad\x15\xadI\x6;O\x1doP\xb1S\xfdHa\xb2\xc7\x42\xf5\xce\xc4\xee{\x17T\xcd\xdf" -"\x5\xd3\xfb\x30T\xdf\xf4o \xcb\xb5\xaf,]\x1e\x10\xee\x90}\xf6x\x7f\x64\x1c\xb7{\xc8" -"\xe8.\xb3\xfe\x66]\xdc\xc4\x8e\xc8+\xd0\x1b\xdeZ\xbd \x1e\xa9\x33\x63\xaa-\xf2\x44" -"M\x1f\x18\xae;\xe6T\x12\xa3\xaf\x64\xa2\x1eg\xb8\xd1\x46\xdf\xb1\x61|\xf9\xca\xc8" -"?\xefyaW\x12?\xeb\xe6\xd7\x1c\xcf\xe0\x96V\xb4\xc8z\xbb\xe2\x31\x15\x1x\x18\xfa\x6" -"_*kE\x99\xf1L\xef\"\x90\xe7\x1b\x9b\xe5\x1c\xb9\xeb\xd0\xc2\xf0^\xfcH\x81\xac\x13" -").jJ\xf7n\xd1L\xb4\xeao\xdc\xf0s?L%\x9e\xf5-r\xbc\x11\xc9\xa3\xe4\xc2\x90\xdf'\x10" -"\x98?j\xff\xac\xaf\x0W\xefV\xa5I\x8\x1b/t\xca\x7\xdf\x9a\x4\xd8\x85[\x1c\xaa\xeb" -"\x15\x95\xb1\x9Lc\xc9-\x18H+\x1a\xb3#\xdd)#fclj\xdb\x9c\x8\xc9\xcb \xa2\x99\xed\xf1" -"\xcf&\x9a\x61\xae\xc4R\xdb=\xd4\xa0W\xae\xbc\x7\x19\x14\xb2\x8c\xe4w\x1dH9\x17u|" -"S\xbe\xd2\x87\xea\xda\xb5\xa8\xb3$\xae\xe9\x81\xee\xf8\x8c\x18\xc1\x8a\x98\xe8\xd9" -"\x86H\xb0\x90zbP\x8b\x1e\x19\xea\xfaLg\xc9)\xde\xb2\xcc\x19\xee\xef=\xec?{\x91o\xc1" -"k0m\xb5\x39\x91\x1fv\xa6\xe8xq\xdf\xa4\x91\x84/x>(u\x85\x83\xfe$u\x92\x2.V\x15\x9d" -"\xd7n\xa0n\xaa\xad\xb9\x65\xbe\x83\x9d\x7f\x92\x63m\xf2\x98\x38\xcf\x32\xfd:\xfc" -"TY]\xcb*m\x4\xa7\x11X\xf4n\xcc\xda\xdb\xce\xf2\xdb\x8b\xa7\xc\x94\xa8\xd0\xfe\x9f" -"~\xab\xe0&*\xf4\x95\x89\x9e\xe\xef\x98i@\xa8\x41N^\xe3\x38+\xbe\xd1\x45M\xbh\x2\xb1" -"\xc7\xdb\xf2h\xeb\xd1\x82\x10\x82\xc5\xd8\xc7g\xc\x31\xba\x9c\x1d\x97%!V\x98\x44" -"\x1+\xab\x16\x9e\xbbu\xf5\x5\xed&S\xd7\xb2\xb9\xf5%\x8dNN2\xbe\xb9\xd5\xb7W\x92\xe0" -"\x91\xce\xcd\x8a\xc1\x11\x97\x32\x83\x42\xdb\x17\xaf>\xca\xa2\xffy\xb9\xf\x93\xf6" -"\xb5\xd2\xa9\xea\x18\x1b<{\x1\xbc\xe2\x8fh\xf6\xa6\xe9\"\x64NJ\x8c\x85\x39\xf6\xc0" -"\xbd}\xae\x91\xd5\x9b\xc9\xa9m\x93K*[m\xfb{\xd0\xc5\x91\x8\xec\xd2!\x10\xa3\xae\x0" -"\xa2K\x93\x16i80\xc0\xc7\xfa\xfe\xaeO\xe\xc0\x87\xb9x\x80\x64\xf0;\xf8\xc6;U\x8c" -"\x11\xbb\x18M\x90/\xd5\x43\x18k\xa0\xbc\x1f\xdf\xd6<7&gqz[\xde\xd4\x6o\xbc\x32\x91" -"2\xa2\xe1\x15\xe5\x30R=hv@\x8d\xfc\xc7\xe6|\x94\x65\x90\xf6\xc1+\xe5&xO\xed\x8ek" -"U\x6\x16\x17:_h\xba&\x18\x96[\x1a>\x6\xec\x99\xff`\x88\x8f\x5\x9dN_\xeaq\x8b\x80" -"\xb9\x93\xe3\xe7\xeb\xd7\x89#U\x7f\xd4\xb8\x1%\x9a\x0\x4\xf1t\xb8\xb\x14\x6o$3\xbc" -"\xe0y,\xa7>\xf4\\q5\xc3\xc,U\xa3\xaf\x9c:\x1c\xda\x8cs\x95_~\xe1\xd6!\xb5\xc4u\xa0" -"\xb6\xa6\x15\x9c\xb7\x96\x1d\xf7\x12\xd1\xed\x18\x35\xdf!\x89K\x9dPZW\xb3\xda\xff" -"\xf6\xcc\x9\x1dk\xc7\x33\xd7G\x2`E\x1c \xd3\xc6\xa5\x38J@`7\x9\x8f\xd4\xa0\x16\xb4" -"1\x4\xc5\n\x33@)\x10\x80\xc8\xef\x12\xc2/@\x8e\xc9x\x16\xc3\x80\xe2\r\x17\x9d\xea" -"\xbe\x32\xbe\x8pF6au\x17\x8e\xd2\xe2n\xaa\xc4\x2\xcb\x43lT_\xa1\x34\xd0\xbf\xf0\x11" -"M\x18\xad\x1dlT\x81\xc4\x34o+\x1d\x34\x15n@\xe5.\xd7\x30\xe9\xbb\x81\x9ai\xdd\xb3" -"\xbc\xdf\xec\xeb\xa9!h\x9c\xdd\xea\x1f\xc1\xdd\xd0\xcd|\xdd\x62S\x11\xe7\x91\x91" -"\x9\xf3\x42_z\xd4\x1f\xad]\x91\x45\xf6S\x98 \x91\xb8,\x16\xe0\xde\x8a\xb5\x0\x88" -"\xf6\x91sTM\x9e\x9\x8e\xa1\xc4\x97\xac\x46p\xc5u&\xaa\x83\xedJ`hf\xcf+\xad\xc\x97" -"\xd9\xbf\xb4\x30\xcf\xcb\x1f\xe3\x12\x96\xb7`\xc2T\xf4\xd5\x62\x14\xf1\xb9\xd3\x35" -"\xdb\xe8\x43\xdeu\xc6\x8c\x10Y\"\xcbGc\xf1\x9a\x5\xd8\x8agr\x6\xb4\xd9M\xdd\xb0\xf4" -"\x82\xe7\xe9\xcd\xc8\xf1\xfa\xc0[\xc6\xde=]\x6\xcf\x87'\x0\x8f\x43\xe3,Et\x3\x8a" -"\x9e \x85~\xd0\xaa\x39\x39\x95/'\xf0\x3\x44\xad\x36w\xb3j\x9c\x91\xcd\x42\xfe\xdd" -"\xea\xaa\x33]\x86\x66\xf3\xd7H\x6\xfaN\xd3\\\xc3\x9a\xce&\xa1-\x89\x18\xcc\xcc\x9" -"\xdc\xa0m^\x88+%\xc0\x89\xe3T\x9a\xe9)\x83\xbb\x1c\xa2\x8hI\x7\xf\x94\x84\x91\xe0" -"\xf4\x38?w\x96\x95\xc9\xa9iD\xc1\x45\x93\x82\xe5\x42\xa7\x1\xed\x9e\x43*\x85h\xf7" -"\xf3\xb8\x8f\xb5\xb5\xf0\x9b\x9e\xa2\xc6\xf4>:\x80%\x9e&\x89\xf9\xbc_Z\xa6#T\xb9" -"\xb7yL@!\xe6U\xe9\x8c\xb7\xb8\x93\xc3\r\x9f\xfa\x7f\xa6@\xadM\xde\xa0\x10\x65\xa4" -"\xc5\x1f\xd2\x84)\x90\xc2\xb0\xd7\xcc&\x8e\xd9\x98\x9dysS\x82(N\xab\xd0\xbeQ\xf0" -"\xb5_\x9f>\xce&\x83\x8e\xd6\xedNV\xd6\x64\x30\xa0\x34\xf3\x94\x87\xba\x90\xd0*\xaf" -"\x92\x8e\"\xaa\xf6\xf3\xd4-O\xadP\xa5\x62\xf5s\x84M\xd2!\xc8\xb0\xec\x15\x99\x10" -"\x8b\x10\x44\xde\xae<\xf5\x92\xe\xc9=\xf8\x37\xc8P!w\xee\xe7\xb9{\x11m\x94\xfb&\x93" -"\x14\x14G^\x9e\xe4\x97.\x95\xbf\xa4\xb4u\xf5\xcd\x99\xb2\x13\xbb\xddj\xf8\xf0\xd9" -"\xe8\x10\x81\xb3\xa6\x99\xa5\xc2,\x88\xa7\x9\x1dnQ\xcc\xef]\x14\x31\x9e\x11\xe1&" -"\xa0\x7f\xf0\x11g m\xe2\x90\xe1pn_1h\xf3\xf2%j\xd7K_Z\x8a\xf9v+\x89\x8c\xfc\xb\x12" -"(E5\x1f\x1e\x85+\x8c\xd9\xc5\x94\x9dly\x86\x95K\xf1\xd3\xd0\x8\xa3\xca\x90g\xdc\xae" -"Z%\x12\xfb\x9av\x9c\x39\x61\x66\x4\x9f\x9d\xfc\xb4\xf4o\x1a\xce\x9c+\x85h\xcb\x37" -"\x13\xff|\xd8gn\x82\x1a\xd6rH\xf8\x19\xd8\x1e\x87\x34\x90:vX\xd2\xe5)\x99\xcc\x35" -"s\xb7\x8a\xcd\x97O$\xf7\x1e\x35U\xd3J\xc5\x19Z\xad\xe9\xa9]\x9e\x98\x1d\xaf\xd5\x3" -"Pmws->\x17\xfd(\xa4\x9f)\x5\x98\x82\x38\xb\x66\xb7\xef\xc3V\\X\xdcl\xdfs\xad'%8\x9a" -"z\xe3\x83-<2\xb9\xd1\xa7\x9b\x90M\xe3\x9a\xe\xd4\x96\xc1\xe5\xe2\xab\xbfn\x86\xdb" -"l\x16\x1d\xad\xeb\xde\xdd\x5\x62\x90\x45\xb8:\x86\x88\x96\xe7\x31\x16~q\xf4\xcf\xeb" -"R\\l\xc0\xda\xd7ii\xb1\xef\x9e-\xa6\xa7\x88.\xe4\x99{\x91\xc4t\xdf\xe1\xa4\xe7\xef" -"\xc6\xb3\xcbMk\xf[\xfe\xe4T\xff\xc5\x41\xec\xf.+\x86\x9e\xce\xcd\xd1\x86" -"z\xe3I\xae\xaf\xe6\x35\x1d\xde\x9e\xa8\x17-\xbe_\xc9=H\xd6\x7f\x10q\xa2\xe5\xd6\xd0" -"\xc6/\n@\xb\n\xe5=zkf\xc8\x30\xf3XuL\x1bT\xf0\"\xf6\xff\x41\xdb\x95\x86X\xc9O\x16" -"|\xf4\x9\x66\xb1g\xdb\"\x89O\x93\xd5^\xc7\xfeU\xc1?\x1e\xda\\jv\x19\xa3\xbb\xa3\xd4" -"\xe6\xed\xc8\x96\x1e\x9d\xd7\xb9\xc\xa7\xf8\x16I8)\xa9\xef[%=\x1a\x9b]t\x1a\x9f\xd0" -"\xc1\xc7\x8e\xf0)\xd3H}\xf7\x8c)\xfd\xc5I$\xbd\x8c\xe3\xac\xb8'?b\x91'\xda\xdaXE" -"\xfc \x1bM\xa5'+\xb1\x39\x83L\x94\x88\xb2\x61\xaa\xf1\x8d\x9b\xebu\x96\x6G\x1X~\x9d" -"4\xba\xb6\xd9\xel\xa8\x9b\xe8M\x1\x8e\xf0\x84\xf5\xd4\xc1\xfd\xe6K\xe6\xce\xe0\xdb" -";\xbbY\xf6Z\x87\x1aG\xb3\xaaj\xb8\xa3\x4p\xd1\xb9\x32\xe2\x66\x38Pl\x90\xac\x37\x98" -"/uf\xd0K\x90\xc9\xcc \x98\xd1`]\xcc\xacv\xa7U#\x18O\x81\x8aZY=\xb4\x89t\xe2\x8cI" -"\x17\xf2V\x8e'\xa8HK\x3.hf\x7\x85zk\xdf.\x1e\xfc\x3k\xed\x8=\xe8\xfb\xfe\xe3\x5\x94" -"D\x96\xae\xfd\x9\r\xf1\xbf\xc9\xbc\xc7\x96\x89ln\xfb\xa6\x85\x15\x9|n \xf6+\xd1\x44" -"\xd5\x9a\xa2:&]\xdb\xe3\x95\xb0\x64\x18\x43\xbcg\nh1\xad\x33\xebvZ\xe0\x9c\x9c\xff" -"{\xbb\xb7\x9c\xeb\x91+\xd9\xb7\x42@D\xc0\xda\xe8\x36\x9f.NSPu\xc8nC\xf8\xe0\xa0Q" -"Hb\xfd\x35\x95\x38L5\xe8\xf0\x44\xea\xff\xceT\xae\x16.\xa6\xa4Y\x83j\x92NK\xc9\xd7" -",N$\xbf\xe8\x43\xcc!,i}\x91\xfa\x63\xd6 ,\xfd)\x8e\xb9PyC\x87)\xe7^\x81\x93+Qm\xf9" -"\r\xdb\x9c\x1a\xfd{eQm#\xf6\xd7\xfd\xef$?9w\xb6To7du\xcc\xd0\xd5\xf8T\xd8=e\xb8\xe3" -"\x5\nm\x8\x7f\xce\x65\x42i\xb3L\xba\x96\x95v\x84\x16\xf8m\x93\xe4\x39Ni+\x8e\xda" -"\xb1<\xf5s\x94\x1e\x95`\x3\xd1\xa1\xa0yV6'\x7`\xa3\xe3!?\x1d\x9b\xb7\xf0\x9b\xab" -"\x81<\x97\xdb\x8d\xab\x81\xc4\xd1h|_\n\xbc\xca\x8b\xa6_]D\xd7\x17\xe9\x8b\x7f\x88" -"\xc5\x61\x90L\x16UC\xb7\xfeL\x96\x9f\x17\xcf\xe9\xcd],\xd3L1L\xb6\xde\xb1\x93\x1f" -"\xd5w\x83\xb5\xd2\x9\xf8\x92\xae\xa0\x66\xe\x19\\sfN\xe4\x81\x88\x38\xe6N3\xa6\xcb" -"7k1a\xab\x9d\x44l\xf0\xd5L\xa7\xfeONx\xe2\xfa\xc0\xdd\x13^V\xd4%\xd7L0~\xbc\xdd\xbb" -"&[\xcc\xe5\xfa\xd5\xa2\xd4\xca\x97\xf5\xca,\xe9\xe5Y\xce\xff\xb4\xf7\xcdU\x12[\xe4" -"8\xe8\xb5\x15\xab\x2r5\x94\xfa\x33GI\x1\x36\xcbO\xdd[\xc2\xbd\xedpy\xb6\xbd\xcf|" -"\xf5K\x9d\xba\xf2\xcf*;\x99\x9f\xcb\x81YV\xe5y\xcdq\x3\xab&1\x9d\x30\x82\xb3\xed" -"i\x9e\x80H\xf0\xbb\xbe\xe1'\xf8\xc7\x4\xf2\x14\xa0\xa2\xb1\xb1Z\x10\x41X)\x9i(\x1b" -"\x89\x1\x82\x4n4\xf6\x44Z\x92\x84\xbe\x62\xfeL\xf4\x39\xc8\xb9\x63\x96\xe6\xa4\x8b" -"\xe6\x8f\x2\xbf\xe5X}\x10w\xd7\x94n\x91\x63\xe6\x86\x10\xa1\xe6\xa9\x1c\x37\x16`" -"5\x98\x45\xf1\x64\x92\xf4\x1;\xc4X\x9f\xd5v\xa3%\x0\xb0\x1\x99*\x99\xbe\xd7\x98Y" -"k\x9f\xea\xc5\xc6\xd0O\x1b#5'\xbd\x39\xc5\x61\xeby\xb5\x45T[\xaf\x16V\xde\x1uF\xb2" -"\xc6\xc5\x9b\xf5\x1\xb7P\xbc\x87\xb\x80\xd7uj\xdan\xd0\x98/O'\xa1\xda\xfa+\xb7?c" -"\x94@'\x9fZ^i\xbd\x10\xf3t\x88U\xc6\xe3\x1bh\x96\xb3\x14y\xd7\xfe\x92\"\x5\xb5\xc" -"C\xa5\x82\xe\x10$\xab\xfa\xc7\x9b\xf2 \x96\x86\xc\x1b\xee\x30o\x9b\xcf\xe5\x62\xc7" -"\xad{}\xc8!\x8dur\xf6\xe7\xeb\xf\x43\x16{/\x5U\xcbJ\xb6\xc7\x9b\x62\xf\xc9\xf0\x14" -"\xb7\x10y\xf8\xf0j\xde\x36U\xe8\xec\xa1\xf6|\xaf'\x86(S\xfb\xb7\xd0\xdc\xf9*\xae" -":\xb5\xa6\xe5\xf\xde\x64\x8:\xa7\r\x34\x8bx\x82'\xf6\x9e\x1c;\xd8\xb\xfc\xa9uMO\x8a" -"\xf\x1a\xf7\xe5q\x9e\x62\xfc\x36\xb\x30\x8d\xf9\xbc\xc\x91\x46\xc\x8am\xb7/{\xcb" -"\x89\x44\x14]\xcf\xc4,<\x1\x80\x19K\x3\x9b\xa5\xb7\x98\x92\xc5\x33\xa2\x9fi\xb4\x81" -"e\x8d\xbf\x64hG\x82\xe4\xd6\xd8\xf3\x37n\xb2\xf4\xc5\xb0\x14\xd3\x66\xcf\x1c\xb\xff" -"$\xbe\r\xc3\x6]W\x9c\x63\x19\x89\xc7\x94\xb5\x64j\xa2m\x9egV\x95\xa0\x98\xe0\xdf" -"u8M\x8\x6\xe7\x8b\xe8rl-\xa7\x15Q\xb7\x1f\x92kC\x93\xa0\x44\xa4\xf6\xe4\x6\x95\xc6" -"\x90\xfa\x14\x7f\x7f\x2\x42\xa1\x8f\x1a\xba_\x8f\x90_\xae\xe6\xeb`\xf3\xe7\x94;\xdf" -"\x8e\xad\x8c\xcb\xab\x99\xaa\xb3#\x8e\x89O\x96.#6\x86\xcb\xbb\x93n\x86i\xea\xa2!" -"=\x1c.7Z\x5\x37\x45K\x8b\x8e\xf5\xb0\x1f@[\x17\x90\x19\x9f\xb\xb9@\xe4R\x9f\x65\xea" -"\xc\x1foO?7\xaf\xbdoA\x8e\x30\x66\x14\xa3\xd0=\xd4\xd8w\x12\x7f\"\n\x33\x8f\x1as" -"?\x94U\x8a\xf\xbd.\xda\x91\xa9\xe2\x43\xba\x32~\xcd\xcbV97\xff\x30VZ\x9c\x32\xfd" -"\x88O\xdd}&N\x94\x92TG\x83\xae\xccm\x9f/\xd0W1\xb9\xe3\xc%#\xfdX({d\xd0{].\xd6\x32" -"\x9e\xb6^\xd0\xecVoA\xd7\xf4\x94\xa0\xf1\xee\x7f\x98!\xe1\x9b\xc0\xae\xa3\xfb\x1a" -"\x87\x8a\x16`\x8a\xf7y\xe4\xc8\xc4\x9f'F\x94\x87$w\xdey\xd8\xc1\x39\xb5\xd1\xd0\x32" -"+\x8\xc6\xf8\xce\x1b\x92\x35p`(\xf8\xea\xf3Rn\x80\xa2\xb0!\xc7\xe8\x8c\xb7\xf8\x11" -"J\xa0<\xf8\xb7\xa0\xa2\xa6\xf5u\xf6\xb3\x7fh\xc3\xdf\x43-!z\xa0\x86\xf7\xb9|O\xf9" -"\xdc\xbf\x98y\x6]\xb\xfe\x8a\x8b\xa2:\xe6!\xcaw\xc8Z\x1d\xb4\x0\xb0\x19Q\x85~\x8e" -"A\xec\x65\x4\xd4\x19s\xf4\x87\xd4\xc1\x65\xf1\xca\xd3\xe9\x36M-:U\x9e\x8\xa9\xe7" -"\xa8\xdd\x9a\x1f\x85\xf9\xa5{\xf0)B\x18\x97\x9\\\xf3\x61\xd1\xd8\xf4\x8]a\x85U\xe0" -"-C\x17\xf3%z\x88\x2\xb1\xcc\x17\xd4\xac\xbc\xf3\x8c\xc4\xa1s\xa9\xad\x86O\xdc\xb3" -"J \xd4P\xf0!d\xac\x84\xa6\xc8T\xa1;\x9f\x13\xf3\xf\xe7l6J\xdd\x8fX\x1f\x86i\xc0Y" -"~\xf\x94\x11\xe9\xc8\xf0\xb8\xe2\xf1\xe5 \xe0\xf0\xf5\xc(\xfc\x88:U\r]\xa4\x61\xf8" -"\xe5;K\xa4\x92\xa7\xc8T}\x14\x65\x97\x88\xd3\x46\xee\xe2\xf8=\xf0\xa6\xa2J\xaf\xaa" -"\x2L&[\x1\x8eXJL\xa5\xb0\xb0^\x9e\x8\x41\x13]\x4n(A\xe4M\xc9\x87=\x5\x1c\x66\xfb" -"\xba)g[\x80\xce\x1a\x85\xc0\xd5T\xe6\x1\x8e}\x86sc\xe4\xe1o\xf2\xd2\x83t\xcf\xad" -"V(oU\xef\xf0V^\x88\xdc\x66K\xfe\x9c\xdb\xfaV\xc3\xf1\xbf<\x9cYd\xc2\x63\xcc\x42@" -"\x83\xc2\xba\x9b\x15kB\xd5w'\xd3\x8b\x9e\xe2S\xf3\x94y\x9e\xb0\xb6\x13\x1c\x9b\x33" -"\xb6M\x3\x33^G\xf8@\xac\x8e\x1\r\xf1.\xe5Rxh\xa7\xc2\xef\xde\\\x0\x45\x10?g\x92\x83" -"6\x8a\x8e\x8}e4<\x1f\xf8\x13\xde\xee\x96\xca\xf6\x9f\xba\xeaW\xb9\x8e\xaf\x0\xb\xd6|X\xce]\x1e\xa6\x3\x1\x99\xa4>\x86" -"\xc4\x1`\xd2Oj0\xd4Z&\xff\xb3\x9\x6\xa9\xa8\xe/\xa2?\xe\xceL\xb6>;\x1a\xa9\x94\xcf" -"i\x89\x33[\xafl\xbd\xe3\x81\xbe\xbdY\xb2\xebjVE\xa2\xe5~\x88\x8b\xe\xa2_\x1c\x8e" -"\x92\x44\xbd\x2S\x0\xcaj_\x6\x1a\x92\xc0\xad\xc7\xd6\x0\xb4\xe9\xdd\xcf\x97~\x83" -"I!m~\xd3\xcf\x88)\x1fZ\xd1qxf\xb$\xbd\x15RK\x8c\x7\x32M9H\xc8mu\xeas\x1`Q\xba\xb5" -"\x6\x95Sw,\x14\xa1\xc9\xb2<\xd4\x34L\xdf\xfb\x8d\xce\x1e\xaax\xa9\x14\x64,\xe9/\x5" -"\x99\xd8Gf\xeb\x92\xf\x1eY\xe6I17C)\x82\x61\xc\x84\xd1&l\xc1k\xc\x89\x99/\xde\x8a" -"\xf2\xf8pLB\xd6\x8e\x19\x13?\xa9\xc5)\x9\xe9\x91j7\xff\xee\x33p\x98oC\xc9\xbb)\xdb" -"\xf5\x9d\xab \x7\x96\xf7\x61\xb2\xb9g\x99\xe4\x98\xbe\x1b\x86\x8fm\xd4\xdd.\xf3\xa2" -"\x94\xfe\xc7\x7\xdaU\xceY\xdc\xae]\xa7\x84\xad\xffU\xfd\xde~#\xd1\xfd\xc4\x1fsS\x2" -"F~t2\xc0\x32\x45\x89\xbd\xca\x1d\x9eT!(F w\xeaTZ\x9\xec-,\xc5T\xd0\rw\x8f\xa2\x9c" -"\xc2~\x8bv\xbeKtvJ\x1d\xb7=\x82\x9f\x39\xf0S\xe\xe0\x32u;y\x8d=lW\xe5\xe8\x90\xe4" -"y*L}CO\x84\xfa)\xd3\x9a\"\xch\x91\x36k\xf6\x14\x12\x7f@p\xd3@!+_\x15\xff\xa1\x14" -"\x9c\x1?\xb8\xce\x17\xc2ih\xcc+3J$\xc8\xff$\xc0\x39\xb3\x61\x98\x1b\x15\x9bL\xc8" -"\xeaJ:zt\x9b\xf1\x9a\xe3\x30=7?UlM\xf6\xbam\xaeP\xad\xee(\xa7\xc5\xfa\x16J\xb9\x39" -"\"\xf8u\x89\xc4\x18\x1\x8d\xe9T\xbc'\x1a\x43j\xe7\xa3\xd8\xf8\x80 P\x18\xf8L\xa0" -"\xe3G\x1d:\xd7\xc8\x1b\x19\x61\x15\x42\xe3\x44}\xc\x1\xa3\xf0\xb7\xfa\x89\x8e*5\n" -"\xa8:t.\xaam\xe2\x33\xcav\xd9\x8e]\xea*E\x9am\xb1\xea\xd8\xd2\xc\x93\x98\x46\x8b" -"P\xfd\xa3]%\xeb|\x10\xae\xfc\xce):\xfb\x8b\xe2\xda?\xeb\xc5\xf6\xfa\x8e\x0\xb3\x94" -"\xc4\xa7\x8di\xfe\x43\xbOw\xf6\xe1-\xab!\xa1\x91#\x9d\xe0\xd2\x66\x35\x43Y\x9ek\xdb" -"3\x94\xd5\x8b\xd0`\x1d\x88yOv\xa1>\x9c\xeaW\xcf\xfc\xce\x19\xc4\x14\x42\x99\xd7Q" -"*{|RC \x93Z'I\xf3\xe9\x9a\xa5\xed+\xab\xf6\xb1\xcf\xd9\x83\x36\x7f\x62\x32\xd6\xe7" -"\xe8i\xef\xf1+}\x83\xfb*\x6? hF\xd0^\xf\xbf\xf9\xc0\x89\x46\xb7\x43\xff\x90\xdbR" -"\x14\x5\x63\xdd\x92\x64\x33\xdc\xac\xc3\xf8\x9a\xa9\xab\x1f\x8c\x2\xd0u\xd1\\\x8e" -"\xe1\xc7\xc9\x37\xed\x82\x37\x85q\x7fP\xfd\xf7%\x19\xcb\x90\x87\xc5\x86\xef\xff\x8" -"\xeb\xb1\x61K\x17\x38\xd2\x93\x15\x96Xm\xa4\xc5\xc\xb7\x8dm\n\xc8\x1f~\x9\xd4\xb" -"Z\xdf_5\xc3\xe1\xdav\x15\xb8\xe4\xe8\xe5\xd7\x1al\x86\\\xc\x36\xc8\x35\xc6\x1b\x4" -"\x94\x8e\x96\x42`\xffxb3{\xb4\xa2u\x7\x33\r\x1e\xe9\xc6\x45\xc5_Hr\x97\x84/\xa2\x9e" -"\x8bnRj\xd0\xbd\x1\xc8G! \xc2\x9eL\xae\x19\xab\x5\x43Qi3\xbf\x15\x9\x15\xe2@\xfb" -"\xb9r\x83\xdd\x1cX\xbcQ\xe2_\xde\xde`F\xf5\x37\xd5R\xec\xf1z\xd2\x8b\xf4\x84\n`\xfc" -":\xee\x18\xc5\x8d\xee\xfb,\x1\xfc\xf6'\xa3{b\x96\x33G\xc5Ua\xa9\x9d\x9\x1a\"\x1e" -"P\x81k:z\xf\xba\xbd\xdc\xe0\x16\xa2v%v\xff\x8a(*X\"\x81\xae\x6iX\x1a\x8d\x9d\xd3" -"K%C\x8;\x82\xa8l\xb1\xb2\xc7\xc6\xb7(\xd6:\xdc\x82\xe7,\xab\x87\x87q\xc1\xd3\x88" -"GW\xba\xf6k\x80\x7\x30\xa6\xc3\x1c;\x10\x91\xc1\x19W\x99s\xc5\xbe\x7\xb4O\xc1\xf" -"C*\xc7\xb3\xda\x94\xff\xd1!\xe0\xf2\xd6\x94\xcd\xdb\xd1\x80g)\x10;\xe8\xca\xbc\xce" -"6\x10\xff\xcf\x9a\x11w=ci\xa8\x9\x94\x34\x95#\"9\xa4\x1b\x8a\xa6+\x2\xf0\xea\xd4" -"4\x86\xb0\x31P\x4\x91\xf3\xe\"\xfe\x2,o\xa0^\xf2\xc9\xb1.\x14\xd7\x8w\xf\xbe\x13" -"\x9b\x8d\x83:\x91\xaaHlQI\xc6\xfe\xb1\x64G\x9an<\xf9[\x8e\xa0\xdd\xcc\x17\x5\x37" -"\xf4\xa6\xcd\xaaky\x94\xff\x8b\x2\xdc\x92\x30\xea\xe1\x1a\x87?\xb8<\xb5\x15Y&\xa2" -"5\xff\x81[.e\xcc\xa3\xac\x1d\xc4*\xcd\xd2\xda~]\x9e\xde\x43\x93\xae\x1\xe2\xca~p" -"\xa2&Nrs\xb1\x9f\x90\xc1\x35\x65o\xee\xf5\x84\x1e{\xb2\xb9m\x8a\xc4N\xc9\xed\\<\x11" -"l\xe0\x0\x8c\xc1\xe4\x99l\x8d\xe2\xbc\xa3w?r\x1a\x5\x9e\xc9\xfbw\xc6S\xae\xb6\x64" -"\xfd\x9f\x4m\xc0\xfa!!\x9\xc8K;\x96\xa7\xf4\xcfY,\x1b\x42<\x1c\x65\xc1\xc\xa1" -"\x5o\xcak\x2K3;_\xb8\xd5+io\xcf\x87\xa2\x31O\xe\x8rT\x5\xcdWu\xc4L\xc3\x8d\xe9\x39" -"a@\xe\x81\xfdX\xb6%\xf7H\x81\xe8\xea\xdc\x33\x31\xf9\x16\x9c\x11\xdc+V\x1\xff\xf" -"\x91\n\xf5@\xcaP\xfb\xc9\x44\xa0\x9dW;\xb0w\x8P0\xd1\x1d\xf2\xac\xd5\xc1\xae&\xd4" -"53\xa0\xe1\xa0\xcb%O\xaf\xbc\xa0\x14\x1dt\x1\xa8-\x6\x14\x96\xd5\x32\x37\x35\x45" -"\xe9\x11L4\x13\x3\x43\xa3\xce~\xa3\xfc;\xe0\x2s\xfe.\xeb\xe0,5\x82\xa9\x7\xfa\xee" -"b7@\xc6\x0\x66\xf1 \xa1\x95\x1\xb5\n\xbc\xe1$\x8b\xf2\xdeY\xcc)k\xd8\xd6\x9a\xe3" -"R\x8a\xfe\xbb\xe\xf6\xacpGj\xf6i\x8a\xe\xbd\xa8\x81\xa8|Z(n}\xb1\xa4\xe3\xc4\x82" -".Tb|Q\x83z\xab\x65\x97\xec\xcco(G|fs\xe5\xcf\x36=\xa2\x80\x1dS\x3\x8f\x1\xfb\x10" -"\xb7\xe5\xb8\x83\xe4\xf7X\x1fJ\xceG0\x8a\x38\xa6\xaa%:\x1d\xae\xe5i\xe8\x3\x0\x87" -"\x17w\xb8L\xf3:\xba\xe7\xc4\x8d\x91\x92\xb3R\x93\xc0\x6\xe4\xc1\xc8]}\xe3~\xf8\x7" -"A\x98\xf6\x9b\xa4\xc4i\xafH\xe5\xdd^S\xef\xaeG\xc0>\x98U\xa1\xc2\x17T;\x10\xee^G" -"Q\xfc\x9d\xb0\xb#k\x15q\xfc\x0\xa0\xf7\x12\xcb!!b'\xc2\x91hB3\x98\xe4\x83\x8fu\x1" -"i\x1c\x4%\xa7[\xaf\xa3\xd9\x1d\x32\xd0\xf6\xb7\xbb\x98Q\xbd\xd3=\x81waa\xf6\xeb\xc3" -"b\xf2?\x7\x8c\x37M\x84\x16\x3\xee\xe9^\xfd\r W\x7\xe\xae,B\xdds\xfdx\xe9\xbei}+\x9" -"\xbb\xa8\x37\xd0#\xb8\xbb\x94\xf6\xbf\x8b\x89\xee\xc8\x91K\x82\">\xf7M\xe9I\xd5\xe3" -"\xe0RY\xa7\x90\xff#\xeetu\xce&\x96\x18\xc7'\x1b\xb6\x66X\x97\xa4\x6\x41\xd1\xe0\xdb" -"\x93\xbdj-\x87\xec\xddL\xe2\xfa\x17\xe5\xf+\xff{\x14\x62\x11\x81\xfb+\x86;\xd5\xdb" -":\x9b\x39:\xac\x1a~\xd6\x95\x99\xb1\xd6\x36\x1c\xd4G\x11\xe8\xa2\xba\xf1\xev\x9c" -"\xc1\xd8\x7f~\xd3\xbcT\xd3\x42/;\xc9\xae\x9aV\x9a\x91\xbcI\x99\x82\xb2\xce\xd2\xd6" -"\x84\xe7\xccy\x17\x63\xe4\xc8t\xfbo#n\xc_!LED\xb1%\xbaUC0MO\xf7\xb3\xfa/\xbc\x30" -"\x2\xc4\xe8\x30\xfc\xd9\xabV\xe4\xf3\xc7\xb8\x61r\xc6\xff.{\x9e\xa1\x8c\x63\xb9\x82" -"\xba\x8c\x11o\xe3\x91\x15\x9W\x10\x33\xf5\x98(\xd9\x38&\x13]\x88\xd8\xabst\xe4\x85" -"\xe9\x82q,\xe5\xdc\x88\x63\x35\n}\x9d\xf4g\xd2\x6\xbb(\xd5\xfa\xcf\xf2\x8d\x7\xa8" -"\xa7`\xf1|\xfb\x62LH\x90\xbb\xf7q;\xc4\x8aY\xb\xf0\x44\x1an\xe5(\xfb\x5\x82|\xc2" -"\x9c\x0g\xf5\x46\xf1\xe2\xfe!\xe1\xd9\x80\x8f\x2\x83\x89z\xae\xf7\xba\xeb\xae\x81" -"\xce\xa9\xf5\xc7X\xf0\x0\x10\x86\rK;m\x10\xc4\x44?\x98-\xd4Wc4\x97\xda\xcb\xd5\xb2" -"\xa3@\xaf%`\x97\xcd\x2\x44\xfb\x36\xdd\x8c\xdf\xa3\xac\x86\x86\x44K\x80\xdfv\x86" -"F\x9b\xf6\xb7\xbd\xacv\x16\xaa^\xa7\x7\x36\xe0\xb3\xc2\x9d\xbev&\xe9\xc1x\xfa\x9d" -"\xef\xa2S\xd2]\x95/\x8\x9c\x6-#l#N\\WN\xf1\x9b *\x8a\xb4\xa5@\x8cY\xadg|H\xd6\xc8" -"\xb4\x11\xd7 \xd4\x65\xf1O\xa6\xaf%\xbb,\xc2\x85\x9\x9f^\x4\xbb\xcf\xce\xff\x1\xb4" -"\x7f\xa3>K8\x1c\x31?\x80p\xa0N-W\xe2\xc1\xe\x93\xc3\xb2\n\xed{l\x0\xb8\x65#\x94\x94" -"2V\x92k\xe5 \x87\x1a\x1b\xc8\xe0(1\xa0\xf\xa1\x90gx\xabj\r\xf7{\xes\x18\n(\x98\\" -"C1a\x19\xd1\xe4\xbd\x65\x8e\x9em\x14\x85~\xb1\x83=\xd2\x97;>}DO\"\xec\x89\x32\x80" -"\x80T[\xb7\xe\xaf\xddJ\xe2\x9cO\x14\xc\x15\xde\x91\xc\"\xc\x98\x8d>y\xe9\x13\x1d" -"\x9\xe1\x14.=h\x96\x30\x88\xd2\xb9\xca\x5\xd6\xdc*\x19\"\xd8\x17\x35\x16\xd8\x80" -"Ar\x8d\xba_\xa4\xd3\x14\xad\xf8\xfc\x1a\x80\xe1\xb8\x80\x44=\xac\x8b\xac\xd5\x65" -"\xcf\xaa-\xc1\xcaNA\x80\x44\x65;q\x4\x34\x1\xf0~\xd2\x10\x93\xc7\xca!6\xc7Q\xf2\x63" -"\xfcyf\x18\xfd\x8e\x65\xc9O\xe0{;OM\x89\xc6\x4w\x2-=r\xfd\xd8\x8b\x9e+\xa9\xb5\xca" -"\xdbJ\xe5\xb5\x84\xc3\x11K\xbe\xb2\xd0\x2\x45\x33\xe5\xe5\xb3}\x81\xd7\xc0\x5\xe8" -"R\x18\xcf\xe4\x95\x16\x30\xf3\xd0\xa0\x81\x39K6\x92k\x93\x94\xba[y7E2NQN/i\xe8y\x94" -"7\xfb\x6\x94\x8d\xa3\xft\xd9\x8b\x89\xad\x93\x61\xf1\x1d\x80\xa0<).\xb7^3\x93\xa7" -"\xb9\x19X\xfb\xf\xf1\xfc\x32z\x8aX\xe2\xe\x3\xa8\xcd\x30\xa0i\x6\x83\xce\xa5\xce" -"\xf1h\xca\xef\x1bu\x1d\xd2\xe4\x4\x5\xa5\x18\xa0kWl\xc3\xe2\xc0\xf8\x16N\xc3\x1a" -"b~\xa7\xf1\xed\xe0*\xb5\xa4\xd5\xf9\x7\x8d\xeL\x98p\xae\x9a\x90\xe6R\xeIm\xa6\xe" -"\x8bG\xf8\xf3s-\xdf\xe8\xb\x8f\xe3|\xff\xdb\x98>@j\x99t\xf9\xd6\x66]\xf5\x16\x0\xb1" -"&T\xcc\xec\xe1\xdb\xa5N\xd0\x8a\xbd\xfb\xec-\x82#\xe0u`s\x9d\ri\xba(\x9c\xef\xc5" -"6\x89zB\x1eh\x7\x12\x1c\xef\x82\x88\xb0\x8c\xb6\xe2T\n\xa9\xab\x42\xf1\xbf\xee\xd8" -"\x81\x80\x7\xd0\xde\xf5\x89\xc6\x11\x80\x1a\xf7\x87\xc\xa5\x85\x9a\xbbP^\x6\xd4Y" -"Y|\xd2\xbbN\xfc\xa6\x85\x61\x9b\xab\xf3*D\xbel\x9c\xea\x1a\x1eY\x5\xdf\x12)N9\x8c" -"kX7\x98\x9f\xac\xb5\xb4\x34!\x87\xab\x66\x19\xc\x8a \xff\x12\xc7V\xbf\xa2\xbf@`8" -"\x8$\x85\x12\xb5\xe3#\xbb\x96\xfd\"\x9d\xc5\xa5\xa2G\x8c\x46\xf1\xd5\xab\xf8\xad" -"v\xb3\xea\xb4\x9cjc\xe\x8dJ(\xeb\x62\xe3\xa0\xbe)#b+\xbd\xc3\xde\xdd;\xbe\x6\x42" -"-\x1c\x7]\x84\xed\xa2\xd6\xef\xa4\x1b\xae\x1c\xcf\x96\x44\xc6\x8f\x85#L\x9a\xe0\x6" -"\x8e.\xe5\xc7\xe7\xbez\x86\xa3\xc4\xcdk\xd2\xdf\xae\x8eR\xad\x43R_\x16Y\x17\x86\xb4" -"\xa9\xa5\xc9\xdf\xc8\x9d\x86\xde\xb5\xd3\xe1\xbf\xf3\x12*\x9a\x9d\x95\x34\xc7\xbf" -"\xfe\x16\xad\xe9\x92\x9bVX\xff\xbe\x10\xeb\xf6oz=gZ\xf5Z\xab\x18n\xbe\x89\x11$#B" -"\xfb\xba\x8f'\x84\xc7\x80\xbc\xdb\xb2\xfa\xdb\xe8\x1b\x1b\\\xd9/\xf4'\xe9\x66\xef" -"\x13\xfc\x8a\xd1\x66\xdb\xef\x1f\x12\x8d?7\x7\x81#\x8f\x98\xcc\xa3\x42N\xf9\x7\xee" -"\xaa\x42\xa2\x9a\xf5\x35\xbdPB\x89\"\x95z\xe1\x83M\xb4\xb0\xb\xe5\xf7\xb8\x43\x8b" -"\x8d\xe9\xc6\\\xb9\xfb\r\x89?y\xf3\x9b\x16\xfb\xe7\xc6w\xb\xf6Li\x88l\x2\x2\xb9\xcd" -"\xa7\x12\x8c[C\x7f\x1b\x80L\x9f\xcc\xe7\xc0\xc8\xae\xb6\xc0\x1d\xd7\x93\xe8\x37=" -"\x2\x1e~\xb8\x10\xf8\xe9\xfX\xff\x1\x5\xb4$\xe2G\xe1|\xb3\xa9\x7f\x2\x66\x0\x19\x9d" -"w\xfd\xec\x94\x8f\x1\\\xe8\xe3\xf7\x93Y3\x14\x63\xf1\xc9\xcaV\xf5\xc7\x12 GP\xf6" -"\x85\xb0\xdc\xe\x41'\xd7R\xb3= =1\x90\xee\x92\xa3}\xab\xdb\x44L\xe9" -"8\xbd\xdex?b\x3\xf0\x32\xd3\xc1\x8e\x84\xde\xfa^$\x14G (\xcdZ\xd2\xa4rH\xba\xaa*" -"m\xdb\x81#\xdf\xea\x8c)4\xd5\xf7\x46\xf7,+\x19\xf7\xd2\xc5\xd1\xc9\x6\xd0\xf3\xa8" -"_*\xdf\xf8\x16\xd6V\x19\x44\xb8\xa8?ANC\xd2\xf9\xac\xb3\x0\xadu\xa1V\xa6\x87\x42" -"\x8c\x45\x8bS\xa2$\xc\x9n\xa1$\xfd\xa5\x1dX\xbd\xa5\x41\x5\x1c\x9d\xd4\xab\xb4;1" -"\xa7\xa2\xbd\x92J@\x95\xca\xcfi\x7f\x61\x12\xce\x82\xe6|\xf0\x96\xa3\x7f:\x9f\xfa" -"\xd9\x62\x90\x10_\xf2\xdd\xd0\x12\x0R\x94\xf6\xfd\xf5\x9d\x9b\xcf\xef\x84\x85\xaf" -"\xe9'\x9dV\xe0\xb\x31\xef\x12*\xc1\x15\xb0\xe9\x98s\x8d\x8e\x39\x98\x85[\xca\xa5" -"\xb\x92\x1b\x65Z(\xa0\xe1[vr7?\x99LT\xd4\xec\xd1\xf9\x46\xa8\xd7\xb6v!\x87\xad\x11" -"\x6\x37\xd4\x8c\x63^432\x98\x82\xc8\x9cu\xb3\xd9\xe?5yD\xb3\xb\x3\xee\x84\x88\xef" -"-f\xfe\xfe\xeb`\xd2\xa4\x0\x98rT\xa6\x83\xc1?\x81\xcdY\xec\xf0\x31\xa4\\n^\xb8\xef" -"Q\xa2\x46X\x9fg\xb5\xfc\xef )p\xd5\x84\x45\x1aR\xf6\x9\xb\xfa\x42\xce\xbf\xcc\xc0" -"\xbb\xb0(\r\"\xa2\xe5\x38\xfc\x8c\xf\x43G\xd3\x9a\x4\xfa\xb9\xe0:\xed\x94\x91\x11" -"\x1f\xa3\x99\x34\x15-Z\xad\xe2r\x91s\x11\x39x\xbfG\x8f\r\xb9|E?\xf5L\xaas\xf7\x9b" -"B3,HH.\xf4\x93\xca\x61\xd0\xbf\xb5\x1c>\xfc\x9c\xd5r\xd6oX\x1e\xefl\xc4\xca\x1>b" -"\xce\xa2\x8bn\xda\xa4\x1f\x10\xbc~\x95\x38X\x10\xf5\xe8\xe5\xb0\xb2+\x19t\x6M\x85" -"\x94\x1e%|\x87MP\xb3\xc4\x86<\xb{\xbb\x91\x65&\xa7\xcb\x9a\x82\xe7\x10Q(P8O+\xfG" -"\x1e\xfc\x83\xa4(\xbb\x2+I\xe5\x12\xce\xb3\x84lK\xdc\x15\xdb\x1a\xe\xe0wKy\xc\xb6" -"\".\x10\xfa|\xb7.\x17 \xf8\x3\xb3&\xf8\xb6\x4\xc9_zj\xcf\x2\x84\x32\xa9\x4\x89\xa9" -"\xd0\xb4\x93u\xd0\xac\x94\x12\x84;\x82\xc9\n\x94\x66\x81\x15\x16\x18\x88w\x9c\x31" -"\n\x7f\xb0\x17\xa5\xca\xa2\x8an\xe9\x90\x8Y7\xc5\xc4\x82I;\x1b\xd3\xbf#\xd4\x87q" -">\xc4Rjh\xd0<\x11\x88\xa1-&\xf7\xd1V\xf8Q\xc1\xc2\xa3\xd6$.\xa9vc=\x8d\xb8|\xa7\xe6" -"\xffX\x1a\xe9\xb9\xed\xf5\xe6\x98\x34t\x90\xe5\xe2\x87\xe9\xf2>\xeiG\xdc\x87\xa9" -"\xf7\xb\xeb\xa1\xdf\xaa\xa1\xd6\x98\xf9\x62\xa6\x32\xd1O5>\xcd\xe6>\xc2ZNE\xe5\x9c" -"\xb7\x1e\x62\x18\x1aMl<\xec\x7\xb1\xfdn7\xe9Q41\xe0\xa1\xd6\xb6\x33\xcf*\x7f\x8a" -"\xb1'\x8a\xcd\x87\xc5u\xa8\x18\xa5-\xd4\xf5\x8a\xbb\xa1l_\x1d\xeb\xe1\x9c\x1cQ|d" -"[\xbf\xe5\xb6\xc1\xc3\xd4!W}7v\xc0\xb7Z6\xb9|\x1e$\xc6$\x0\x64\x81\x81\x95j\x86Q" -"\x2\x0\xd8\x1dSV\xb4j8\xb4Kx\xb\xc5O2\xbe\x1eU\xe2\x84\xc7\x1f,|U\xd2\x8d\r\x66%" -"0C\xd7n\x8f\xb1 8\xac\xa0\x93\xd1\x39^.e\xdf\xa6\x65\xea\xd7U\x9\xd4m\x93\xd0<_\n" -"\x8d\xbd\xef \xf2t-s\xb0\x35\xd7\xdb{X\xe2\x98Xl\x1f\x13\xdb\x81oS\x1\x1eMY\xd1)" -"\x83\x96y%\xf?e\xd3\x64V\x91wJ\x1c\xc8\xe8\xfe\xae\x4\x66\x80\x9e\x34\xc6)fo\x6\xa0" -"\xcc\x99qW\xc5\xc8\x7f\x85\xe3\x61\x93\xcd\xda\x42\xf1}\x1a\xec\xe2\x9c\x42\xc3\xd1" -"\x9e\xd0\x63\xc4\x1eH\x5\xcdND\xc\x8a\x13P\xddI\x19\x33\x8e\xbdV\xddi?\x16\xee\xaf" -"\xb8\x12\xc8>\xaa\x98\x0\xadU\xa6\x93\x93\x89\xe7\xf2\xac\xa8\xda\x36%'\x1b\xf0\xb5" -"7\xe5\x17\xce\xc3\xae\x17\x66\xf2\x9e}\x1a\xd7\xfe#\xaf|\xe0\xb1&\xbf\x34\xc1L\xfe" -"b\xf8\xec\r\x9c\xcdJ\xc8hx\xc9\xd4\xa1\xc6\xcd]\x91\x19\xb3\xae\xb5\x33\x63\x98\xce" -"\x4\x89>a\xe8\xd4\xd9\xa3\x43\x93 X'!\x83wE\xd2\"\xdd\x7f\xb5\xc5\xbco\x1f\x1\x98" -"\xbf\xd5\xden\x10\xda\x63\xba\x8btO\x84\xc5K,\xf5K>\xb1\x97lc\xb3\xb4\xc\x66\xeb" -"\xb8\x8f\x92~\x19\x84 \x7\xe9Hp\xbaGOd\x89\x9d@.g\xcd_\xfd\x34%\x45w\xe1\xd5\xcb" -"P\xdc,\x4\x9a-*[\x10Wr\x83\xcf\xa9\x8\x32\xeb\x6\x61\xec;7\x1f\xe7\xce\xcf'\xd5z" -"\xb4-\xe5s\x11\x7lR\x81_B\xa4\xccV\xd9\xb4l}\xf8\xc1\xeb\x14\x84\xe0(\x4\x39r<\xd9" -"\xcd\xa4\x80\x9f<\xef\x1fjo\x6\x35y\xeb\x8f\x12\xfc\x32N\x8a\x39\x6s:\x92\x96l\x99" -"\x0\x7f\x45\x97\xad\xe1\xe7\x41\xb0,\xac\xef\xae\xfbtt\xd8\xa4PW\xa4m\xab\xb2\xe6" -"f?\xf0;\x3\x80\xaf\xec\x7f\x34_\x90T\x1d\xdc}\x89\xb8&m\x1dRvV\xf2\x66\xf0/;g\x3" -"\xa3\x6/e=Cq\xc0m\xa8\xf8]naA\xde\xb6\xc4\x8{Ne?\xa7+.|[\xfa\xediI~\xdb\x92Sm\x9e" -"\xc9\xf3\xbf\xf\x34\x92\x8\xe7s\x9c\xb1\xac\xa7\x8\xa3*Z\xc7\xa9\x9b\xa0?\xcb\x8" -"\xaa`Y+\xc8\xb2=\x17\xb\xb3\xa7L\xce\xc7\x1\x1e\x64\xc9\x9d\x11\x18\xe5<\x83I5\xad" -"'\x15=\x17\xff\x8c\x1f\x43N?\xf2M\x3\x18\xb8I\x18\x32\x61\x99\xaa\xcd\x62rK\x10W" -"\xd9\x1c\x66(\xad\x42\x63\xa8X\xa4o\n\x1e\x84.x\xa3\x16~\x13\x91\x43\xfb\xe\xda\xcc" -"d4\x84\x2\x7j\x80\x3\x63\xba\xed)\xbe_\n\xf6\xfe\x14\nj\xe5\xeH~#\xfe\xe8\xb5\xea" -"\x9f\xa9\x16\xb1\x8f\x89\xc\xca\xca\x45\xc9ho\xd4\xaf^f\x8c]\x10'4\xce\xd7\xc5\x8b" -"\xby\x6\x66\x15>;T\xfc\xd9\xab+\x1c+\x11#)>\xa2\xdfMu=}\x87\xbe\x81,uj\x9e\xeb\xfd" -"\xd9\xa5,.\xc0Yk\x4\xd4\x99=\xcb\x87wq\x1em\x9\xa3\xf7\xd1\xa6\xe7g\x97z\x8eX\xe4" -"\xbb\xc1\xac\xb0\x34Lu\xf7\x19\x1b\x8bh\x9b\xf1\x95\xce\xd6\xd4\xdf\x1b\x89\x44\x8" -"\xf5;6A\xde\x10\x8av\x3t\xa3u\xd0J*\xcbG\xb7\x8a\xd5&V\xc8\x9e\x85\x1f\xfd\xde\x61" -"D\x9c\xe7\xac\xa8\xe8\nQl\x95\x94\xb7\xc1\xc0\xeb}gk\xb0\x81\xf5\xf0!h\x1c\x1@/\x8a" -"R\x1fV\xe8\xc0\xf\xdf\xde\xc\x61\xbd\x19\x42 \x9c\xb9\xaau\xeg\xab\xa1\xf3m\xcb\xc2" -"\x95\x3k\xb8\x99 [\xdbs6\x18\xf0\x31}\xb8\xfe\x1f\x81\xab\x41\xfe\xab\x1\x8b\x19" -"\xdb\x35\xbf\xb6\x92\x88\xf1\x9fK\x9\xb1\xa2\xfe-s\xb2\x92\x8e\xc9\xc1\xc5\x30\xdc" -"\xed\xcb(\x80\xdf\x1f\x3.\xce\xcbu\xec\xcbI\xf0\x81\x12\x9d\xed\xb9\xa6U\xee\xa3" -"\xe9\x8a_\xa2\xb4\x37U\x88\x18\xfb\xf0^\x9a\x84\x8a:\xfd\x44r\x90\x1d\xb1{\xdd\xc4" -"\xc0\xb3\x39\x1e\x12\x9eQ0\xe3\x99\n\x17\xe4\x8c\x8a\xd5\xe1\xae\xa5\xbb$\xe4\xaf" -"\x97@Tw^\xaeR\xd8Y\xe4\xbb\x6\x98^;\xed\x4GU\xd0\x11\x31/\x9f\x14\x46\xe4\xa9\x91" -"x_N\x9f+\xc7\x14\x38L\x98\xfe\xe7\x8@X\xf9\xd5\xdaMy\xa0\xa5\xfd\xcf\x9\x98\x87\xad" -"\xa2\x2\r\x92I[\xcc\xefj\xc7\x37\xfi\xa9\xd4+\xaf\xda\x90(\xbd\x0+q\xc6\xd0\xe1J" -"\x14\x1aRsSoc\xafq2\x9d\x87|%\xc4\xe9T~\x12\xa1\x36\xc5\xa0]RD\xd1\x46\xae\xd3\x5" -"\xa5\x8c\x41/\x19=\x9aT\x3\xa0\xdb\xe9\x15\x41\x41\x46\x1f\xbdV\x16\xab\xa8\x1c\x18" -"j-\xed\x30~\xe1\x66@{\xc3:u\x8d\xb\x10\x7\xda\x8e\xc3\xa0\xa6\xb1\x7f\xa3u\xady\x97" -"CI\x9a\x61\xa4\x1f\x9d\x98\x90\xe2\xe6\xe5\x9a\x8b\xb7\xb3r\xe6\x13\x1\x43\x1f\xfc" -"\x11\xd2\x80\xf1\xd5sZYIDzs\xd7#\x8co\xbe\xb0\x42\x84\x34q\xeav\xb4\xa2\\\x16t\xe1" -"m\x1d\xdc\xd6\xf2\x92\x93M\xcct\xbb\x3\x0\xee\xca\xb1\xfb\x92\xfbt\x91\xcc\x64\x88" -"\xb9\x97u\xc8\x8d\x8f\xe6\x15I|v8w\x86\xbas\xbf-bm!\x0\xd5x\x8e\x8d\x30\xe5K\x9b" -"\x9f\x96?\xa9h\xe6\x93\x9a\xd4\xb(\xb2gA|S\xb0\xc3\xe2{\xb3,u@\x93]\xb1\xc3\x64tkU\xf9\xac\xf7\xca" -"k\x9e\xc3Z\xc3$\x8d\x42\xa8\xcfQ\xa1\xd8\xf9\x33\x19i\x8b\x92\xffq~\x11\x17\xf0\xe0" -"r`P\x92\xdbG\x0\xab\xab~\xf4\x89\xbf\xc3^\xc6\x8a\xd6=\x95\xfa\x16\xb6\xa2\xf0\x18" -">\\;[\x1b\xdd\xba\x31\xe6\x4\x82&z[\xf2\xde$DR\xfd\x8\xd7\xd9\x2\x9c\xf\x42\x9ev" -"\xd5\xc4\xd6\xc8R\xf8\xedw\x1d\x8a\xc6\xbf&\x7f\xf0\x98lf\xb9?\xd6\x1c\x81\xb\x9" -"\x1c\xa8PX\xad\x63\xa9\x8e\x86O\xc2J%\xaa\xff\x38\x93\x46\xbe\x38\x64\x42x\xf4\xbb" -"\xdb\xbN!!_Q\xad\xb\x1c@\x8\xd8\xf1[`\xeb/\xc1\x7\x88>$\xe4Q\x1f\x9e\xef\xba\x9c" -"\xd1m\xae~ExD\x3\xb7\xc6\x9c`\xc7IM\xc0#\xaaV'\xb1r\x8e\x81\x95\xcb\x1b\xde\x34\xf8" -"\xfd!\xa0\x91\x4\x64\x66]\xca\xa5|\x82vgq\x9e\xd0|#@\xee\xf\xbe!\xf5\x98\x13\x80" -"\xcb\x82\xd7q@\xf7\x2T\x92\xa7\xde\x8\x0\xcd\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30" -"000000000000000000000000000000000000000000000000000000000000\r000000000000000000" -"0000000000000000000000000000000000000000000000\r00000000000000000000000000000000" -"00000000000000000000000000000000\r0000000000000000000000000000000000000000000000" -"000000000000000000\r000000000000000000000000000000000000000000000000000000000000" -"0000\r0000000000000000000000000000000000000000000000000000000000000000\r00000000" -"00000000000000000000000000000000000000000000000000000000\r0000000000000000000000" -"000000000000000000000000000000000000000000\rcleartomark\n\x80\x3" -; -int n019023l_afm_len = 32114; -char* n019023l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusSanL-ReguIt" -"al\nFullName Nimbus Sans L Regular Italic\nFamilyName Nimbus Sans L\nWeight Regu" -"lar\nItalicAngle -12.0\nIsFixedPitch false\nUnderlinePosition -151\nUnderlineThi" -"ckness 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Devel" -"opment\nEncodingScheme AdobeStandardEncoding\nFontBBox -178 -284 1108 953\nCapHe" -"ight 729\nXHeight 524\nDescender -213\nAscender 729\nStartCharMetrics 316\nC 32 " -"; WX 278 ; N space ; B 213 0 213 0 ;\nC 33 ; WX 278 ; N exclam ; B 124 0 363 729" -" ;\nC 34 ; WX 355 ; N quotedbl ; B 177 464 455 709 ;\nC 35 ; WX 556 ; N numbersi" -"gn ; B 54 -20 649 697 ;\nC 36 ; WX 556 ; N dollar ; B 69 -126 613 770 ;\nC 37 ; " -"WX 889 ; N percent ; B 134 -20 895 709 ;\nC 38 ; WX 667 ; N ampersand ; B 83 -23" -" 644 709 ;\nC 39 ; WX 222 ; N quoteright ; B 166 477 309 708 ;\nC 40 ; WX 333 ; " -"N parenleft ; B 113 -213 446 729 ;\nC 41 ; WX 333 ; N parenright ; B -7 -213 325" -" 729 ;\nC 42 ; WX 389 ; N asterisk ; B 169 438 471 729 ;\nC 43 ; WX 584 ; N plus" -" ; B 92 -11 591 473 ;\nC 44 ; WX 278 ; N comma ; B 55 -150 214 103 ;\nC 45 ; WX " -"333 ; N hyphen ; B 97 240 351 312 ;\nC 46 ; WX 278 ; N period ; B 87 0 213 103 ;" -"\nC 47 ; WX 278 ; N slash ; B -12 -20 434 729 ;\nC 48 ; WX 556 ; N zero ; B 98 -" -"23 598 709 ;\nC 49 ; WX 556 ; N one ; B 208 0 498 709 ;\nC 50 ; WX 556 ; N two ;" -" B 34 0 620 709 ;\nC 51 ; WX 556 ; N three ; B 71 -23 599 709 ;\nC 52 ; WX 556 ;" -" N four ; B 63 0 573 709 ;\nC 53 ; WX 556 ; N five ; B 70 -23 629 709 ;\nC 54 ; " -"WX 556 ; N six ; B 93 -23 611 709 ;\nC 55 ; WX 556 ; N seven ; B 137 0 671 709 ;" -"\nC 56 ; WX 556 ; N eight ; B 74 -23 604 709 ;\nC 57 ; WX 556 ; N nine ; B 83 -2" -"3 599 709 ;\nC 58 ; WX 278 ; N colon ; B 110 0 326 524 ;\nC 59 ; WX 278 ; N semi" -"colon ; B 78 -150 325 524 ;\nC 60 ; WX 584 ; N less ; B 87 -9 635 474 ;\nC 61 ; " -"WX 584 ; N equal ; B 74 111 609 355 ;\nC 62 ; WX 584 ; N greater ; B 48 -9 596 4" -"74 ;\nC 63 ; WX 556 ; N question ; B 184 0 630 741 ;\nC 64 ; WX 1015 ; N at ; B " -"80 -142 1036 741 ;\nC 65 ; WX 667 ; N A ; B 17 0 653 729 ;\nC 66 ; WX 667 ; N B " -"; B 79 0 711 729 ;\nC 67 ; WX 722 ; N C ; B 112 -23 770 741 ;\nC 68 ; WX 722 ; N" -" D ; B 89 0 759 729 ;\nC 69 ; WX 667 ; N E ; B 90 0 751 729 ;\nC 70 ; WX 611 ; N" -" F ; B 90 0 734 729 ;\nC 71 ; WX 778 ; N G ; B 109 -23 809 741 ;\nC 72 ; WX 722 " -"; N H ; B 83 0 799 729 ;\nC 73 ; WX 278 ; N I ; B 100 0 349 729 ;\nC 74 ; WX 500" -" ; N J ; B 47 -23 581 729 ;\nC 75 ; WX 667 ; N K ; B 79 0 813 729 ;\nC 76 ; WX 5" -"56 ; N L ; B 80 0 551 729 ;\nC 77 ; WX 833 ; N M ; B 75 0 916 729 ;\nC 78 ; WX 7" -"22 ; N N ; B 76 0 801 729 ;\nC 79 ; WX 778 ; N O ; B 104 -23 828 741 ;\nC 80 ; W" -"X 667 ; N P ; B 91 0 733 729 ;\nC 81 ; WX 778 ; N Q ; B 104 -59 828 741 ;\nC 82 " -"; WX 722 ; N R ; B 93 0 770 729 ;\nC 83 ; WX 667 ; N S ; B 89 -23 714 741 ;\nC 8" -"4 ; WX 611 ; N T ; B 158 0 748 729 ;\nC 85 ; WX 722 ; N U ; B 124 -23 800 729 ;\n" -"C 86 ; WX 667 ; N V ; B 185 0 800 729 ;\nC 87 ; WX 944 ; N W ; B 177 0 1084 729 " -";\nC 88 ; WX 667 ; N X ; B 22 0 794 729 ;\nC 89 ; WX 667 ; N Y ; B 168 0 816 729" -" ;\nC 90 ; WX 611 ; N Z ; B 28 0 737 729 ;\nC 91 ; WX 278 ; N bracketleft ; B 19" -" -213 405 729 ;\nC 92 ; WX 278 ; N backslash ; B 147 -20 280 729 ;\nC 93 ; WX 27" -"8 ; N bracketright ; B -23 -213 364 729 ;\nC 94 ; WX 469 ; N asciicircum ; B 115" -" 329 496 709 ;\nC 95 ; WX 556 ; N underscore ; B -59 -176 551 -126 ;\nC 96 ; WX " -"222 ; N quoteleft ; B 163 477 308 709 ;\nC 97 ; WX 556 ; N a ; B 65 -23 568 539 " -";\nC 98 ; WX 556 ; N b ; B 54 -23 588 729 ;\nC 99 ; WX 500 ; N c ; B 76 -23 554 " -"539 ;\nC 100 ; WX 556 ; N d ; B 73 -23 650 729 ;\nC 101 ; WX 556 ; N e ; B 84 -2" -"3 580 539 ;\nC 102 ; WX 278 ; N f ; B 89 0 413 732 ;\nC 103 ; WX 556 ; N g ; B 3" -"2 -218 601 539 ;\nC 104 ; WX 556 ; N h ; B 70 0 574 729 ;\nC 105 ; WX 222 ; N i " -"; B 66 0 305 729 ;\nC 106 ; WX 222 ; N j ; B -65 -218 308 729 ;\nC 107 ; WX 500 " -"; N k ; B 58 0 584 729 ;\nC 108 ; WX 222 ; N l ; B 68 0 307 729 ;\nC 109 ; WX 83" -"3 ; N m ; B 71 0 852 539 ;\nC 110 ; WX 556 ; N n ; B 70 0 574 539 ;\nC 111 ; WX " -"556 ; N o ; B 80 -23 576 539 ;\nC 112 ; WX 556 ; N p ; B 7 -213 586 539 ;\nC 113" -" ; WX 556 ; N q ; B 71 -213 607 539 ;\nC 114 ; WX 333 ; N r ; B 69 0 436 539 ;\n" -"C 115 ; WX 500 ; N s ; B 61 -23 520 539 ;\nC 116 ; WX 278 ; N t ; B 97 -23 366 6" -"68 ;\nC 117 ; WX 556 ; N u ; B 88 -23 594 524 ;\nC 118 ; WX 500 ; N v ; B 122 0 " -"598 524 ;\nC 119 ; WX 722 ; N w ; B 118 0 820 524 ;\nC 120 ; WX 500 ; N x ; B 17" -" 0 583 524 ;\nC 121 ; WX 500 ; N y ; B 8 -218 590 524 ;\nC 122 ; WX 500 ; N z ; " -"B 31 0 557 524 ;\nC 123 ; WX 334 ; N braceleft ; B 91 -213 431 729 ;\nC 124 ; WX" -" 260 ; N bar ; B 54 -212 315 729 ;\nC 125 ; WX 334 ; N braceright ; B -16 -213 3" -"24 729 ;\nC 126 ; WX 584 ; N asciitilde ; B 137 268 594 438 ;\nC 161 ; WX 333 ; " -"N exclamdown ; B 76 -205 317 524 ;\nC 162 ; WX 556 ; N cent ; B 96 -120 585 628 " -";\nC 163 ; WX 556 ; N sterling ; B 44 -23 628 729 ;\nC 164 ; WX 167 ; N fraction" -" ; B -178 -20 486 709 ;\nC 165 ; WX 556 ; N yen ; B 100 0 696 709 ;\nC 166 ; WX " -"556 ; N florin ; B -32 -212 696 738 ;\nC 167 ; WX 556 ; N section ; B 63 -213 58" -"9 729 ;\nC 168 ; WX 556 ; N currency ; B 110 133 593 556 ;\nC 169 ; WX 191 ; N q" -"uotesingle ; B 173 464 292 709 ;\nC 170 ; WX 333 ; N quotedblleft ; B 146 477 44" -"9 709 ;\nC 171 ; WX 556 ; N guillemotleft ; B 147 106 548 438 ;\nC 172 ; WX 333 " -"; N guilsinglleft ; B 140 106 336 438 ;\nC 173 ; WX 333 ; N guilsinglright ; B 1" -"09 106 307 438 ;\nC 174 ; WX 500 ; N fi ; B 83 0 591 732 ;\nC 175 ; WX 500 ; N f" -"l ; B 88 0 585 732 ;\nC 177 ; WX 556 ; N endash ; B 46 240 628 312 ;\nC 178 ; WX" -" 556 ; N dagger ; B 127 -177 620 709 ;\nC 179 ; WX 556 ; N daggerdbl ; B 51 -177" -" 620 709 ;\nC 180 ; WX 278 ; N periodcentered ; B 166 192 293 295 ;\nC 182 ; WX " -"537 ; N paragraph ; B 145 -178 677 729 ;\nC 183 ; WX 350 ; N bullet ; B 120 220 " -"376 470 ;\nC 184 ; WX 222 ; N quotesinglbase ; B 37 -128 180 103 ;\nC 185 ; WX 3" -"33 ; N quotedblbase ; B 20 -128 322 103 ;\nC 186 ; WX 333 ; N quotedblright ; B " -"150 477 452 708 ;\nC 187 ; WX 556 ; N guillemotright ; B 121 106 518 438 ;\nC 18" -"8 ; WX 1000 ; N ellipsis ; B 115 0 907 103 ;\nC 189 ; WX 1000 ; N perthousand ; " -"B 93 -20 1024 738 ;\nC 191 ; WX 611 ; N questiondown ; B 86 -217 531 524 ;\nC 19" -"3 ; WX 333 ; N grave ; B 179 592 357 740 ;\nC 194 ; WX 333 ; N acute ; B 218 592" -" 458 740 ;\nC 195 ; WX 333 ; N circumflex ; B 146 591 433 741 ;\nC 196 ; WX 333 " -"; N tilde ; B 130 611 471 719 ;\nC 197 ; WX 333 ; N macron ; B 160 627 450 696 ;" -"\nC 198 ; WX 333 ; N breve ; B 165 594 471 729 ;\nC 199 ; WX 333 ; N dotaccent ;" -" B 244 612 370 715 ;\nC 200 ; WX 333 ; N dieresis ; B 159 612 446 715 ;\nC 202 ;" -" WX 333 ; N ring ; B 216 579 396 754 ;\nC 203 ; WX 333 ; N cedilla ; B 1 -214 26" -"4 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 91 590 505 740 ;\nC 206 ; WX 333 ; N " -"ogonek ; B 35 -205 246 0 ;\nC 207 ; WX 333 ; N caron ; B 176 592 463 740 ;\nC 20" -"8 ; WX 1000 ; N emdash ; B 42 240 1068 312 ;\nC 225 ; WX 1000 ; N AE ; B 11 0 10" -"87 729 ;\nC 227 ; WX 370 ; N ordfeminine ; B 107 303 441 742 ;\nC 232 ; WX 556 ;" -" N Lslash ; B 75 0 570 729 ;\nC 233 ; WX 778 ; N Oslash ; B 32 -24 867 741 ;\nC " -"234 ; WX 1000 ; N OE ; B 101 -23 1108 741 ;\nC 235 ; WX 365 ; N ordmasculine ; B" -" 114 303 452 742 ;\nC 241 ; WX 889 ; N ae ; B 59 -23 915 539 ;\nC 245 ; WX 278 ;" -" N dotlessi ; B 94 0 290 527 ;\nC 248 ; WX 222 ; N lslash ; B 62 0 312 729 ;\nC " -"249 ; WX 611 ; N oslash ; B 19 -30 639 541 ;\nC 250 ; WX 944 ; N oe ; B 85 -23 9" -"66 539 ;\nC 251 ; WX 611 ; N germandbls ; B 126 -23 655 729 ;\nC -1 ; WX 722 ; N" -" Udieresis ; B 124 -23 800 914 ;\nC -1 ; WX 722 ; N Uacute ; B 124 -23 800 939 ;" -"\nC -1 ; WX 667 ; N Scedilla ; B 89 -214 714 741 ;\nC -1 ; WX 611 ; N Tcaron ; B" -" 158 0 748 939 ;\nC -1 ; WX 667 ; N Scaron ; B 89 -23 714 939 ;\nC -1 ; WX 722 ;" -" N Rcaron ; B 93 0 770 939 ;\nC -1 ; WX 722 ; N Racute ; B 93 0 770 939 ;\nC -1 " -"; WX 667 ; N Sacute ; B 89 -23 714 939 ;\nC -1 ; WX 778 ; N Otilde ; B 104 -23 8" -"28 918 ;\nC -1 ; WX 556 ; N ucircumflex ; B 88 -23 594 741 ;\nC -1 ; WX 778 ; N " -"Ohungarumlaut ; B 104 -23 841 939 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 124 -23" -" 806 939 ;\nC -1 ; WX 667 ; N Yacute ; B 168 0 816 939 ;\nC -1 ; WX 722 ; N Eth " -"; B 89 0 759 729 ;\nC -1 ; WX 722 ; N Dcroat ; B 89 0 759 729 ;\nC -1 ; WX 611 ;" -" N Zacute ; B 28 0 737 939 ;\nC -1 ; WX 722 ; N Uring ; B 124 -23 800 953 ;\nC -" -"1 ; WX 556 ; N gbreve ; B 32 -218 601 729 ;\nC -1 ; WX 556 ; N eogonek ; B 84 -2" -"05 580 539 ;\nC -1 ; WX 556 ; N edotaccent ; B 84 -23 580 715 ;\nC -1 ; WX 556 ;" -" N ecaron ; B 84 -23 580 740 ;\nC -1 ; WX 722 ; N Ugrave ; B 124 -23 800 939 ;\n" -"C -1 ; WX 667 ; N Thorn ; B 91 0 708 729 ;\nC -1 ; WX 556 ; N eacute ; B 84 -23 " -"580 740 ;\nC -1 ; WX 556 ; N edieresis ; B 84 -23 580 715 ;\nC -1 ; WX 650 ; N d" -"caron ; B 73 -23 810 729 ;\nC -1 ; WX 500 ; N ccedilla ; B 76 -214 554 539 ;\nC " -"-1 ; WX 500 ; N ccaron ; B 76 -23 563 740 ;\nC -1 ; WX 500 ; N cacute ; B 76 -23" -" 575 740 ;\nC -1 ; WX 556 ; N aogonek ; B 65 -205 571 539 ;\nC -1 ; WX 556 ; N a" -"ring ; B 65 -23 568 754 ;\nC -1 ; WX 556 ; N atilde ; B 65 -23 583 719 ;\nC -1 ;" -" WX 556 ; N abreve ; B 65 -23 582 729 ;\nC -1 ; WX 556 ; N egrave ; B 84 -23 580" -" 740 ;\nC -1 ; WX 556 ; N agrave ; B 65 -23 568 740 ;\nC -1 ; WX 556 ; N aacute " -"; B 65 -23 570 740 ;\nC -1 ; WX 556 ; N adieresis ; B 65 -23 568 715 ;\nC -1 ; W" -"X 722 ; N Uogonek ; B 124 -205 800 729 ;\nC -1 ; WX 556 ; N ugrave ; B 88 -23 59" -"4 740 ;\nC -1 ; WX 556 ; N uacute ; B 88 -23 594 740 ;\nC -1 ; WX 556 ; N udiere" -"sis ; B 88 -23 594 715 ;\nC -1 ; WX 319 ; N tcaron ; B 97 -23 492 801 ;\nC -1 ; " -"WX 500 ; N scommaaccent ; B 61 -284 520 539 ;\nC -1 ; WX 611 ; N Zcaron ; B 28 0" -" 737 939 ;\nC -1 ; WX 556 ; N ecircumflex ; B 84 -23 580 741 ;\nC -1 ; WX 722 ; " -"N Ucircumflex ; B 124 -23 800 940 ;\nC -1 ; WX 556 ; N acircumflex ; B 65 -23 56" -"8 741 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 28 0 737 914 ;\nC -1 ; WX 500 ; N scar" -"on ; B 61 -23 547 740 ;\nC -1 ; WX 667 ; N Amacron ; B 17 0 663 895 ;\nC -1 ; WX" -" 500 ; N sacute ; B 61 -23 545 740 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 158 -28" -"4 748 729 ;\nC -1 ; WX 667 ; N Ydieresis ; B 168 0 816 914 ;\nC -1 ; WX 556 ; N " -"thorn ; B 7 -213 586 729 ;\nC -1 ; WX 667 ; N Emacron ; B 90 0 751 895 ;\nC -1 ;" -" WX 778 ; N Ograve ; B 104 -23 828 939 ;\nC -1 ; WX 778 ; N Oacute ; B 104 -23 8" -"28 939 ;\nC -1 ; WX 778 ; N Odieresis ; B 104 -23 828 914 ;\nC -1 ; WX 722 ; N N" -"tilde ; B 76 0 801 918 ;\nC -1 ; WX 722 ; N Ncaron ; B 76 0 801 939 ;\nC -1 ; WX" -" 722 ; N Nacute ; B 76 0 801 939 ;\nC -1 ; WX 556 ; N Lcaron ; B 80 0 551 729 ;\n" -"C -1 ; WX 556 ; N Lacute ; B 80 0 551 939 ;\nC -1 ; WX 278 ; N Idotaccent ; B 10" -"0 0 389 914 ;\nC -1 ; WX 333 ; N racute ; B 69 0 498 740 ;\nC -1 ; WX 278 ; N Ic" -"ircumflex ; B 100 0 454 940 ;\nC -1 ; WX 556 ; N ohungarumlaut ; B 80 -23 683 74" -"0 ;\nC -1 ; WX 556 ; N otilde ; B 80 -23 583 719 ;\nC -1 ; WX 556 ; N Euro ; B 1" -"2 -22 636 709 ;\nC -1 ; WX 556 ; N ocircumflex ; B 80 -23 576 741 ;\nC -1 ; WX 3" -"90 ; N onesuperior ; B 205 284 393 709 ;\nC -1 ; WX 390 ; N twosuperior ; B 100 " -"284 468 709 ;\nC -1 ; WX 390 ; N threesuperior ; B 123 270 455 709 ;\nC -1 ; WX " -"278 ; N Igrave ; B 100 0 378 939 ;\nC -1 ; WX 278 ; N Iacute ; B 100 0 479 939 ;" -"\nC -1 ; WX 278 ; N Imacron ; B 100 0 458 895 ;\nC -1 ; WX 278 ; N Iogonek ; B 2" -"8 -205 349 729 ;\nC -1 ; WX 278 ; N Idieresis ; B 100 0 467 907 ;\nC -1 ; WX 778" -" ; N Gbreve ; B 109 -23 809 928 ;\nC -1 ; WX 722 ; N Umacron ; B 124 -23 800 895" -" ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 79 -284 813 729 ;\nC -1 ; WX 556 ; N ogra" -"ve ; B 80 -23 576 740 ;\nC -1 ; WX 667 ; N Scommaaccent ; B 89 -284 714 741 ;\nC" -" -1 ; WX 667 ; N Eogonek ; B 90 -205 751 729 ;\nC -1 ; WX 556 ; N oacute ; B 80 " -"-23 576 740 ;\nC -1 ; WX 667 ; N Edotaccent ; B 90 0 751 914 ;\nC -1 ; WX 222 ; " -"N iogonek ; B 0 -205 305 729 ;\nC -1 ; WX 527 ; N gcommaaccent ; B 3 -218 572 81" -"3 ;\nC -1 ; WX 556 ; N odieresis ; B 80 -23 576 715 ;\nC -1 ; WX 556 ; N ntilde " -"; B 70 0 589 719 ;\nC -1 ; WX 556 ; N ncaron ; B 70 0 578 740 ;\nC -1 ; WX 667 ;" -" N Ecaron ; B 90 0 751 939 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 90 0 751 940 ;\n" -"C -1 ; WX 500 ; N scedilla ; B 61 -214 521 539 ;\nC -1 ; WX 333 ; N rcaron ; B 6" -"9 0 486 740 ;\nC -1 ; WX 667 ; N Egrave ; B 90 0 751 939 ;\nC -1 ; WX 667 ; N Ea" -"cute ; B 90 0 751 939 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 109 -284 809 741 ;\n" -"C -1 ; WX 722 ; N Rcommaaccent ; B 93 -284 770 729 ;\nC -1 ; WX 667 ; N Edieresi" -"s ; B 90 0 751 914 ;\nC -1 ; WX 556 ; N nacute ; B 70 0 580 740 ;\nC -1 ; WX 556" -" ; N uogonek ; B 88 -205 594 524 ;\nC -1 ; WX 556 ; N umacron ; B 88 -23 594 696" -" ;\nC -1 ; WX 722 ; N Dcaron ; B 89 0 759 939 ;\nC -1 ; WX 307 ; N lcaron ; B 68" -" 0 467 729 ;\nC -1 ; WX 722 ; N Ccaron ; B 112 -23 770 939 ;\nC -1 ; WX 722 ; N " -"Cacute ; B 112 -23 770 939 ;\nC -1 ; WX 722 ; N Ccedilla ; B 112 -214 770 741 ;\n" -"C -1 ; WX 606 ; N degree ; B 291 383 594 686 ;\nC -1 ; WX 667 ; N Aogonek ; B 17" -" -205 663 729 ;\nC -1 ; WX 584 ; N minus ; B 81 197 601 269 ;\nC -1 ; WX 584 ; N" -" multiply ; B 113 34 568 427 ;\nC -1 ; WX 584 ; N divide ; B 92 0 591 462 ;\nC -" -"1 ; WX 667 ; N Aring ; B 17 0 653 953 ;\nC -1 ; WX 1000 ; N trademark ; B 208 29" -"2 1096 729 ;\nC -1 ; WX 333 ; N rcommaaccent ; B 5 -284 436 539 ;\nC -1 ; WX 222" -" ; N lacute ; B 68 0 463 939 ;\nC -1 ; WX 556 ; N omacron ; B 80 -23 576 696 ;\n" -"C -1 ; WX 667 ; N Atilde ; B 17 0 680 918 ;\nC -1 ; WX 278 ; N icircumflex ; B 9" -"4 0 406 741 ;\nC -1 ; WX 278 ; N igrave ; B 94 0 330 740 ;\nC -1 ; WX 556 ; N nc" -"ommaaccent ; B 70 -284 574 539 ;\nC -1 ; WX 222 ; N lcommaaccent ; B -1 -284 307" -" 729 ;\nC -1 ; WX 584 ; N plusminus ; B 50 0 625 633 ;\nC -1 ; WX 947 ; N onehal" -"f ; B 202 -20 965 709 ;\nC -1 ; WX 947 ; N onequarter ; B 205 -20 938 709 ;\nC -" -"1 ; WX 947 ; N threequarters ; B 123 -20 938 709 ;\nC -1 ; WX 278 ; N iacute ; B" -" 94 0 431 740 ;\nC -1 ; WX 667 ; N Abreve ; B 17 0 683 928 ;\nC -1 ; WX 500 ; N " -"kcommaaccent ; B 58 -284 584 729 ;\nC -1 ; WX 778 ; N Omacron ; B 104 -23 828 89" -"5 ;\nC -1 ; WX 222 ; N imacron ; B 66 0 373 696 ;\nC -1 ; WX 556 ; N emacron ; B" -" 84 -23 580 696 ;\nC -1 ; WX 556 ; N amacron ; B 65 -23 568 696 ;\nC -1 ; WX 278" -" ; N tcommaaccent ; B 55 -284 366 668 ;\nC -1 ; WX 500 ; N ydieresis ; B 8 -218 " -"590 715 ;\nC -1 ; WX 500 ; N zdotaccent ; B 31 0 557 715 ;\nC -1 ; WX 500 ; N zc" -"aron ; B 31 0 557 740 ;\nC -1 ; WX 500 ; N zacute ; B 31 0 557 740 ;\nC -1 ; WX " -"500 ; N yacute ; B 8 -218 590 740 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 88 -23 " -"683 740 ;\nC -1 ; WX 556 ; N eth ; B 80 -23 576 743 ;\nC -1 ; WX 556 ; N uring ;" -" B 88 -23 594 754 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 104 -23 828 940 ;\nC -1 ;" -" WX 333 ; N commaaccent ; B 57 -284 205 -60 ;\nC -1 ; WX 737 ; N copyright ; B 5" -"5 -22 836 742 ;\nC -1 ; WX 737 ; N registered ; B 55 -22 836 742 ;\nC -1 ; WX 66" -"7 ; N Acircumflex ; B 17 0 653 940 ;\nC -1 ; WX 278 ; N idieresis ; B 94 0 419 7" -"08 ;\nC -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ;\nC -1 ; WX 712 ; N Delta ; B " -"10 0 701 729 ;\nC -1 ; WX 584 ; N notequal ; B 74 2 609 480 ;\nC -1 ; WX 542 ; N" -" radical ; B 102 -36 705 913 ;\nC -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ;\nC -" -"1 ; WX 667 ; N Aacute ; B 17 0 667 939 ;\nC -1 ; WX 584 ; N lessequal ; B 45 0 6" -"59 584 ;\nC -1 ; WX 584 ; N greaterequal ; B 56 0 626 584 ;\nC -1 ; WX 584 ; N l" -"ogicalnot ; B 99 86 619 377 ;\nC -1 ; WX 711 ; N summation ; B -18 -97 760 762 ;" -"\nC -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ;\nC -1 ; WX 722 ; N Ncommaac" -"cent ; B 76 -284 801 729 ;\nC -1 ; WX 556 ; N dcroat ; B 73 -23 695 729 ;\nC -1 " -"; WX 260 ; N brokenbar ; B 54 -212 315 729 ;\nC -1 ; WX 556 ; N Lcommaaccent ; B" -" 80 -284 551 729 ;\nC -1 ; WX 667 ; N Adieresis ; B 17 0 662 914 ;\nC -1 ; WX 55" -"6 ; N mu ; B 18 -220 593 524 ;\nC -1 ; WX 278 ; N .notdef ; B 213 0 213 0 ;\nEnd" -"CharMetrics\nStartKernData\nStartKernPairs 998\nKPX A C -41\nKPX A Ccedilla -41\n" -"KPX A G -41\nKPX A O -37\nKPX A Odieresis -37\nKPX A Q -38\nKPX A T -103\nKPX A " -"U -42\nKPX A Uacute -42\nKPX A Ucircumflex -42\nKPX A Udieresis -42\nKPX A Ugrav" -"e -42\nKPX A V -81\nKPX A W -57\nKPX A Y -104\nKPX A a -16\nKPX A b -5\nKPX A c " -"-16\nKPX A ccedilla -16\nKPX A comma -4\nKPX A d -14\nKPX A e -22\nKPX A g -17\n" -"KPX A guillemotleft -51\nKPX A guilsinglleft -47\nKPX A hyphen -8\nKPX A o -19\n" -"KPX A period -2\nKPX A q -15\nKPX A quotedblright -60\nKPX A quoteright -68\nKPX" -" A t -22\nKPX A u -18\nKPX A v -40\nKPX A w -29\nKPX A y -44\nKPX Aacute C -42\n" -"KPX Aacute G -42\nKPX Aacute O -38\nKPX Aacute Q -39\nKPX Aacute T -103\nKPX Aac" -"ute U -43\nKPX Aacute V -81\nKPX Aacute W -57\nKPX Aacute Y -104\nKPX Aacute a -" -"16\nKPX Aacute b -6\nKPX Aacute c -17\nKPX Aacute comma -4\nKPX Aacute d -15\nKP" -"X Aacute e -23\nKPX Aacute g -17\nKPX Aacute guillemotleft -51\nKPX Aacute guils" -"inglleft -48\nKPX Aacute hyphen -9\nKPX Aacute o -20\nKPX Aacute period -3\nKPX " -"Aacute q -16\nKPX Aacute quoteright -68\nKPX Aacute t -23\nKPX Aacute u -20\nKPX" -" Aacute v -40\nKPX Aacute w -29\nKPX Aacute y -44\nKPX Acircumflex C -41\nKPX Ac" -"ircumflex G -41\nKPX Acircumflex O -37\nKPX Acircumflex Q -38\nKPX Acircumflex T" -" -103\nKPX Acircumflex U -42\nKPX Acircumflex V -81\nKPX Acircumflex W -57\nKPX " -"Acircumflex Y -104\nKPX Acircumflex comma -4\nKPX Acircumflex period -2\nKPX Adi" -"eresis C -42\nKPX Adieresis G -41\nKPX Adieresis O -38\nKPX Adieresis Q -39\nKPX" -" Adieresis T -103\nKPX Adieresis U -43\nKPX Adieresis V -81\nKPX Adieresis W -57" -"\nKPX Adieresis Y -104\nKPX Adieresis a -16\nKPX Adieresis b -5\nKPX Adieresis c" -" -17\nKPX Adieresis comma -4\nKPX Adieresis d -14\nKPX Adieresis g -17\nKPX Adie" -"resis guillemotleft -51\nKPX Adieresis guilsinglleft -48\nKPX Adieresis hyphen -" -"8\nKPX Adieresis o -19\nKPX Adieresis period -3\nKPX Adieresis q -15\nKPX Adiere" -"sis quotedblright -60\nKPX Adieresis quoteright -68\nKPX Adieresis t -22\nKPX Ad" -"ieresis u -19\nKPX Adieresis v -40\nKPX Adieresis w -29\nKPX Adieresis y -44\nKP" -"X Agrave C -41\nKPX Agrave G -41\nKPX Agrave O -37\nKPX Agrave Q -38\nKPX Agrave" -" T -103\nKPX Agrave U -42\nKPX Agrave V -81\nKPX Agrave W -57\nKPX Agrave Y -104" -"\nKPX Agrave comma -4\nKPX Agrave period -2\nKPX Aring C -41\nKPX Aring G -41\nK" -"PX Aring O -37\nKPX Aring Q -38\nKPX Aring T -103\nKPX Aring U -42\nKPX Aring V " -"-81\nKPX Aring W -57\nKPX Aring Y -104\nKPX Aring a -16\nKPX Aring b -5\nKPX Ari" -"ng c -16\nKPX Aring comma -4\nKPX Aring d -14\nKPX Aring e -22\nKPX Aring g -17\n" -"KPX Aring guillemotleft -51\nKPX Aring guilsinglleft -47\nKPX Aring hyphen -8\nK" -"PX Aring o -19\nKPX Aring period -2\nKPX Aring q -15\nKPX Aring quotedblright -6" -"0\nKPX Aring quoteright -68\nKPX Aring t -22\nKPX Aring u -18\nKPX Aring v -40\n" -"KPX Aring w -29\nKPX Aring y -44\nKPX Atilde C -43\nKPX Atilde G -42\nKPX Atilde" -" O -39\nKPX Atilde Q -40\nKPX Atilde T -103\nKPX Atilde U -44\nKPX Atilde V -81\n" -"KPX Atilde W -57\nKPX Atilde Y -104\nKPX Atilde comma -4\nKPX Atilde period -4\n" -"KPX B A -28\nKPX B AE -29\nKPX B Aacute -28\nKPX B Acircumflex -28\nKPX B Adiere" -"sis -28\nKPX B Aring -28\nKPX B Atilde -28\nKPX B O -14\nKPX B OE -11\nKPX B Oac" -"ute -14\nKPX B Ocircumflex -14\nKPX B Odieresis -14\nKPX B Ograve -14\nKPX B Osl" -"ash -2\nKPX B V -49\nKPX B W -27\nKPX B Y -56\nKPX C A -43\nKPX C AE -44\nKPX C " -"Aacute -43\nKPX C Adieresis -43\nKPX C Aring -43\nKPX C H -22\nKPX C K -20\nKPX " -"C O -18\nKPX C Oacute -18\nKPX C Odieresis -18\nKPX Ccedilla A -44\nKPX D A -50\n" -"KPX D Aacute -50\nKPX D Acircumflex -50\nKPX D Adieresis -50\nKPX D Agrave -50\n" -"KPX D Aring -50\nKPX D Atilde -50\nKPX D J -13\nKPX D T -56\nKPX D V -54\nKPX D " -"W -31\nKPX D X -58\nKPX D Y -74\nKPX F A -78\nKPX F Aacute -78\nKPX F Acircumfle" -"x -78\nKPX F Adieresis -78\nKPX F Agrave -78\nKPX F Aring -78\nKPX F Atilde -78\n" -"KPX F J -59\nKPX F O -30\nKPX F Odieresis -30\nKPX F a -45\nKPX F aacute -45\nKP" -"X F adieresis -45\nKPX F ae -41\nKPX F aring -45\nKPX F comma -113\nKPX F e -33\n" -"KPX F eacute -33\nKPX F hyphen -20\nKPX F i -19\nKPX F j -19\nKPX F o -30\nKPX F" -" oacute -30\nKPX F odieresis -30\nKPX F oe -33\nKPX F oslash -30\nKPX F period -" -"113\nKPX F r -44\nKPX F u -42\nKPX G A -14\nKPX G AE -11\nKPX G Aacute -14\nKPX " -"G Acircumflex -14\nKPX G Adieresis -14\nKPX G Agrave -14\nKPX G Aring -14\nKPX G" -" Atilde -14\nKPX G T -53\nKPX G V -53\nKPX G W -31\nKPX G Y -72\nKPX J A -39\nKP" -"X J AE -39\nKPX J Adieresis -39\nKPX J Aring -39\nKPX K C -56\nKPX K G -57\nKPX " -"K O -53\nKPX K OE -49\nKPX K Oacute -53\nKPX K Odieresis -53\nKPX K S -48\nKPX K" -" T 14\nKPX K a -23\nKPX K adieresis -23\nKPX K ae -20\nKPX K aring -23\nKPX K e " -"-46\nKPX K hyphen -53\nKPX K o -42\nKPX K oacute -42\nKPX K odieresis -42\nKPX K" -" u -32\nKPX K udieresis -32\nKPX K y -76\nKPX L A 8\nKPX L AE 11\nKPX L Aacute 8" -"\nKPX L Adieresis 8\nKPX L Aring 8\nKPX L C -52\nKPX L Ccedilla -51\nKPX L G -53" -"\nKPX L O -51\nKPX L Oacute -51\nKPX L Ocircumflex -51\nKPX L Odieresis -51\nKPX" -" L Ograve -51\nKPX L Otilde -51\nKPX L S -28\nKPX L T -112\nKPX L U -46\nKPX L U" -"dieresis -46\nKPX L V -115\nKPX L W -77\nKPX L Y -128\nKPX L hyphen -140\nKPX L " -"quotedblright -145\nKPX L quoteright -153\nKPX L u -17\nKPX L udieresis -17\nKPX" -" L y -68\nKPX N A -19\nKPX N AE -16\nKPX N Aacute -19\nKPX N Adieresis -19\nKPX " -"N Aring -19\nKPX N C -15\nKPX N Ccedilla -14\nKPX N G -14\nKPX N O -11\nKPX N Oa" -"cute -11\nKPX N Odieresis -11\nKPX N a -17\nKPX N aacute -17\nKPX N adieresis -1" -"7\nKPX N ae -13\nKPX N aring -17\nKPX N comma -15\nKPX N e -11\nKPX N eacute -11" -"\nKPX N o -8\nKPX N oacute -8\nKPX N odieresis -8\nKPX N oslash -4\nKPX N period" -" -15\nKPX N u -8\nKPX N udieresis -9\nKPX O A -43\nKPX O AE -47\nKPX O Aacute -4" -"3\nKPX O Adieresis -43\nKPX O Aring -43\nKPX O T -54\nKPX O V -48\nKPX O W -25\n" -"KPX O X -52\nKPX O Y -71\nKPX Oacute A -43\nKPX Oacute T -54\nKPX Oacute V -48\n" -"KPX Oacute W -25\nKPX Oacute Y -71\nKPX Ocircumflex T -54\nKPX Ocircumflex V -48" -"\nKPX Ocircumflex Y -71\nKPX Odieresis A -43\nKPX Odieresis T -54\nKPX Odieresis" -" V -48\nKPX Odieresis W -25\nKPX Odieresis X -52\nKPX Odieresis Y -71\nKPX Ograv" -"e T -54\nKPX Ograve V -48\nKPX Ograve Y -71\nKPX Oslash A -47\nKPX Otilde T -54\n" -"KPX Otilde V -48\nKPX Otilde Y -71\nKPX P A -86\nKPX P AE -93\nKPX P Aacute -86\n" -"KPX P Adieresis -86\nKPX P Aring -86\nKPX P J -85\nKPX P a -39\nKPX P aacute -39" -"\nKPX P adieresis -39\nKPX P ae -35\nKPX P aring -39\nKPX P comma -138\nKPX P e " -"-38\nKPX P eacute -38\nKPX P hyphen -45\nKPX P o -34\nKPX P oacute -34\nKPX P od" -"ieresis -34\nKPX P oe -38\nKPX P oslash -35\nKPX P period -138\nKPX R C -21\nKPX" -" R Ccedilla -21\nKPX R G -21\nKPX R O -17\nKPX R OE -14\nKPX R Oacute -17\nKPX R" -" Odieresis -17\nKPX R T -33\nKPX R U -21\nKPX R Udieresis -21\nKPX R V -49\nKPX " -"R W -27\nKPX R Y -54\nKPX R a -21\nKPX R aacute -21\nKPX R adieresis -21\nKPX R " -"ae -17\nKPX R aring -21\nKPX R e -16\nKPX R eacute -16\nKPX R hyphen -4\nKPX R o" -" -13\nKPX R oacute -13\nKPX R odieresis -13\nKPX R oe -16\nKPX R u -13\nKPX R ua" -"cute -14\nKPX R udieresis -14\nKPX R y -16\nKPX S A -31\nKPX S AE -31\nKPX S Aac" -"ute -31\nKPX S Adieresis -31\nKPX S Aring -31\nKPX S T -38\nKPX S V -52\nKPX S W" -" -31\nKPX S Y -58\nKPX S t -11\nKPX T A -104\nKPX T AE -106\nKPX T Aacute -104\n" -"KPX T Acircumflex -104\nKPX T Adieresis -104\nKPX T Agrave -104\nKPX T Aring -10" -"4\nKPX T Atilde -104\nKPX T C -53\nKPX T G -55\nKPX T J -108\nKPX T O -50\nKPX T" -" OE -44\nKPX T Oacute -50\nKPX T Ocircumflex -50\nKPX T Odieresis -50\nKPX T Ogr" -"ave -50\nKPX T Oslash -42\nKPX T Otilde -50\nKPX T S -32\nKPX T V 2\nKPX T W 7\n" -"KPX T Y 10\nKPX T a -107\nKPX T ae -104\nKPX T c -96\nKPX T colon -152\nKPX T co" -"mma -105\nKPX T e -102\nKPX T g -94\nKPX T guillemotleft -126\nKPX T guilsinglle" -"ft -123\nKPX T hyphen -82\nKPX T i -12\nKPX T j -12\nKPX T o -99\nKPX T oslash -" -"94\nKPX T period -105\nKPX T r -98\nKPX T s -98\nKPX T semicolon -140\nKPX T u -" -"98\nKPX T v -106\nKPX T w -103\nKPX T y -110\nKPX U A -45\nKPX U AE -48\nKPX U A" -"acute -45\nKPX U Acircumflex -45\nKPX U Adieresis -45\nKPX U Aring -45\nKPX U At" -"ilde -45\nKPX U comma -35\nKPX U m -17\nKPX U n -16\nKPX U p -8\nKPX U period -3" -"2\nKPX U r -16\nKPX Uacute A -45\nKPX Uacute comma -35\nKPX Uacute m -17\nKPX Ua" -"cute n -16\nKPX Uacute p -8\nKPX Uacute period -32\nKPX Uacute r -16\nKPX Ucircu" -"mflex A -45\nKPX Udieresis A -44\nKPX Udieresis b -8\nKPX Udieresis comma -35\nK" -"PX Udieresis m -17\nKPX Udieresis n -16\nKPX Udieresis p -8\nKPX Udieresis perio" -"d -32\nKPX Udieresis r -16\nKPX Ugrave A -45\nKPX V A -77\nKPX V AE -84\nKPX V A" -"acute -77\nKPX V Acircumflex -77\nKPX V Adieresis -77\nKPX V Agrave -77\nKPX V A" -"ring -77\nKPX V Atilde -77\nKPX V C -50\nKPX V G -50\nKPX V O -46\nKPX V Oacute " -"-46\nKPX V Ocircumflex -46\nKPX V Odieresis -46\nKPX V Ograve -46\nKPX V Oslash " -"-34\nKPX V Otilde -46\nKPX V S -44\nKPX V T 7\nKPX V a -71\nKPX V ae -66\nKPX V " -"colon -76\nKPX V comma -94\nKPX V e -64\nKPX V g -57\nKPX V guillemotleft -88\nK" -"PX V guilsinglleft -84\nKPX V hyphen -44\nKPX V i -14\nKPX V o -61\nKPX V oslash" -" -57\nKPX V period -94\nKPX V r -51\nKPX V semicolon -75\nKPX V u -52\nKPX V y -" -"28\nKPX W A -56\nKPX W AE -62\nKPX W Aacute -56\nKPX W Acircumflex -56\nKPX W Ad" -"ieresis -56\nKPX W Agrave -56\nKPX W Aring -56\nKPX W Atilde -56\nKPX W C -30\nK" -"PX W G -30\nKPX W O -26\nKPX W Oacute -26\nKPX W Ocircumflex -26\nKPX W Odieresi" -"s -26\nKPX W Ograve -26\nKPX W Oslash -14\nKPX W Otilde -26\nKPX W S -31\nKPX W " -"T 11\nKPX W a -46\nKPX W ae -42\nKPX W colon -62\nKPX W comma -62\nKPX W e -39\n" -"KPX W g -32\nKPX W guillemotleft -63\nKPX W guilsinglleft -60\nKPX W hyphen -19\n" -"KPX W i -10\nKPX W o -36\nKPX W oslash -32\nKPX W period -62\nKPX W r -36\nKPX W" -" semicolon -62\nKPX W u -36\nKPX W y -15\nKPX X C -53\nKPX X O -50\nKPX X Odiere" -"sis -50\nKPX X Q -51\nKPX X a -27\nKPX X e -51\nKPX X hyphen -57\nKPX X o -46\nK" -"PX X u -36\nKPX X y -67\nKPX Y A -102\nKPX Y AE -108\nKPX Y Aacute -102\nKPX Y A" -"circumflex -102\nKPX Y Adieresis -102\nKPX Y Agrave -102\nKPX Y Aring -102\nKPX " -"Y Atilde -102\nKPX Y C -68\nKPX Y G -69\nKPX Y O -64\nKPX Y Oacute -64\nKPX Y Oc" -"ircumflex -64\nKPX Y Odieresis -64\nKPX Y Ograve -64\nKPX Y Oslash -55\nKPX Y Ot" -"ilde -64\nKPX Y S -49\nKPX Y T 15\nKPX Y a -100\nKPX Y ae -95\nKPX Y colon -97\n" -"KPX Y comma -117\nKPX Y e -97\nKPX Y g -89\nKPX Y guillemotleft -128\nKPX Y guil" -"singlleft -124\nKPX Y hyphen -89\nKPX Y i -6\nKPX Y o -93\nKPX Y oslash -89\nKPX" -" Y p -63\nKPX Y period -117\nKPX Y semicolon -97\nKPX Y u -73\nKPX Y v -48\nKPX " -"Z v -44\nKPX Z y -44\nKPX a j -10\nKPX a quoteright -23\nKPX a v -26\nKPX a w -1" -"6\nKPX a y -33\nKPX aacute v -26\nKPX aacute w -16\nKPX aacute y -33\nKPX adiere" -"sis v -26\nKPX adieresis w -16\nKPX adieresis y -33\nKPX ae v -26\nKPX ae w -15\n" -"KPX ae y -32\nKPX agrave v -26\nKPX agrave w -16\nKPX agrave y -33\nKPX aring v " -"-26\nKPX aring w -16\nKPX aring y -33\nKPX b v -21\nKPX b w -10\nKPX b y -28\nKP" -"X c h -7\nKPX c k -1\nKPX comma one -105\nKPX comma quotedblright -47\nKPX comma" -" quoteright -55\nKPX e quoteright -20\nKPX e t -16\nKPX e v -26\nKPX e w -16\nKP" -"X e x -35\nKPX e y -33\nKPX eacute v -26\nKPX eacute w -16\nKPX eacute y -33\nKP" -"X ecircumflex v -26\nKPX ecircumflex w -16\nKPX ecircumflex y -33\nKPX eight fou" -"r -6\nKPX eight one -55\nKPX eight seven -43\nKPX f a -20\nKPX f aacute -20\nKPX" -" f adieresis -20\nKPX f ae -15\nKPX f aring -20\nKPX f e -21\nKPX f eacute -21\n" -"KPX f f 12\nKPX f i -10\nKPX f j -11\nKPX f l -12\nKPX f o -18\nKPX f oacute -18" -"\nKPX f odieresis -18\nKPX f oe -20\nKPX f oslash -16\nKPX f quoteright -8\nKPX " -"f s -8\nKPX f t 16\nKPX five four -7\nKPX five one -83\nKPX five seven -32\nKPX " -"four four -3\nKPX four one -88\nKPX four seven -65\nKPX g a -17\nKPX g adieresis" -" -17\nKPX g ae -13\nKPX g aring -17\nKPX g e -11\nKPX g eacute -11\nKPX g l -8\n" -"KPX g oacute -8\nKPX g odieresis -8\nKPX g r -9\nKPX guillemotright A -58\nKPX g" -"uillemotright AE -62\nKPX guillemotright Aacute -58\nKPX guillemotright Adieresi" -"s -58\nKPX guillemotright Aring -58\nKPX guillemotright T -132\nKPX guillemotrig" -"ht V -96\nKPX guillemotright W -68\nKPX guillemotright Y -137\nKPX guilsinglrigh" -"t A -52\nKPX guilsinglright AE -56\nKPX guilsinglright Aacute -52\nKPX guilsingl" -"right Adieresis -52\nKPX guilsinglright Aring -52\nKPX guilsinglright T -126\nKP" -"X guilsinglright V -90\nKPX guilsinglright W -62\nKPX guilsinglright Y -131\nKPX" -" h quoteright -19\nKPX h y -31\nKPX hyphen A -12\nKPX hyphen AE -17\nKPX hyphen " -"Aacute -12\nKPX hyphen Adieresis -12\nKPX hyphen Aring -12\nKPX hyphen T -86\nKP" -"X hyphen V -51\nKPX hyphen W -24\nKPX hyphen Y -97\nKPX i T -16\nKPX i j -10\nKP" -"X k a -14\nKPX k aacute -14\nKPX k adieresis -14\nKPX k ae -12\nKPX k aring -14\n" -"KPX k comma -13\nKPX k e -33\nKPX k eacute -33\nKPX k g -26\nKPX k hyphen -49\nK" -"PX k o -30\nKPX k oacute -30\nKPX k odieresis -30\nKPX k period -13\nKPX k s -14" -"\nKPX k u -22\nKPX k udieresis -16\nKPX l v -11\nKPX l y -15\nKPX m p -3\nKPX m " -"v -24\nKPX m w -14\nKPX m y -30\nKPX n T -103\nKPX n p -3\nKPX n quoteright -19\n" -"KPX n v -24\nKPX n w -14\nKPX n y -31\nKPX nine four -12\nKPX nine one -55\nKPX " -"nine seven -50\nKPX o T -106\nKPX o quoteright -23\nKPX o t -17\nKPX o v -27\nKP" -"X o w -16\nKPX o x -35\nKPX o y -34\nKPX oacute v -27\nKPX oacute w -16\nKPX oac" -"ute y -34\nKPX ocircumflex t -17\nKPX odieresis t -17\nKPX odieresis v -27\nKPX " -"odieresis w -16\nKPX odieresis x -35\nKPX odieresis y -34\nKPX ograve v -27\nKPX" -" ograve w -16\nKPX ograve y -34\nKPX one comma -82\nKPX one eight -73\nKPX one f" -"ive -72\nKPX one four -88\nKPX one nine -71\nKPX one one -125\nKPX one period -8" -"2\nKPX one seven -98\nKPX one six -71\nKPX one three -75\nKPX one two -78\nKPX o" -"ne zero -71\nKPX p t -10\nKPX p y -28\nKPX period one -106\nKPX period quotedblr" -"ight -48\nKPX period quoteright -56\nKPX q c -2\nKPX q u -5\nKPX quotedblbase A " -"21\nKPX quotedblbase AE 21\nKPX quotedblbase T -80\nKPX quotedblbase V -74\nKPX " -"quotedblbase W -39\nKPX quotedblbase Y -96\nKPX quotedblleft A -58\nKPX quotedbl" -"left AE -70\nKPX quotedblleft Aacute -58\nKPX quotedblleft Adieresis -58\nKPX qu" -"otedblleft Aring -58\nKPX quotedblleft T 1\nKPX quotedblleft V 10\nKPX quotedbll" -"eft W 22\nKPX quotedblleft Y -1\nKPX quotedblright A -60\nKPX quotedblright AE -" -"72\nKPX quotedblright Aacute -60\nKPX quotedblright Adieresis -60\nKPX quotedblr" -"ight Aring -60\nKPX quotedblright T 2\nKPX quotedblright V 9\nKPX quotedblright " -"W 21\nKPX quotedblright Y -2\nKPX quoteleft A -74\nKPX quoteleft AE -86\nKPX quo" -"teleft Aacute -74\nKPX quoteleft Adieresis -74\nKPX quoteleft Aring -74\nKPX quo" -"teleft T -14\nKPX quoteleft V -5\nKPX quoteleft W 6\nKPX quoteleft Y -17\nKPX qu" -"oteright A -76\nKPX quoteright AE -88\nKPX quoteright Aacute -76\nKPX quoteright" -" Adieresis -76\nKPX quoteright Aring -76\nKPX quoteright comma -68\nKPX quoterig" -"ht d -25\nKPX quoteright o -31\nKPX quoteright period -68\nKPX quoteright r -24\n" -"KPX quoteright s -23\nKPX quoteright t -14\nKPX quoteright v -10\nKPX quoteright" -" w -5\nKPX quoteright y -14\nKPX r a -16\nKPX r aacute -16\nKPX r acircumflex -1" -"6\nKPX r adieresis -16\nKPX r ae -11\nKPX r agrave -16\nKPX r aring -16\nKPX r c" -" -11\nKPX r ccedilla -11\nKPX r colon -31\nKPX r comma -77\nKPX r d -8\nKPX r e " -"-17\nKPX r eacute -17\nKPX r ecircumflex -17\nKPX r egrave -17\nKPX r f 17\nKPX " -"r g -8\nKPX r h -8\nKPX r hyphen -54\nKPX r i -6\nKPX r j -6\nKPX r k -2\nKPX r " -"l -7\nKPX r m -9\nKPX r n -8\nKPX r o -14\nKPX r oacute -14\nKPX r ocircumflex -" -"14\nKPX r odieresis -14\nKPX r oe -16\nKPX r ograve -14\nKPX r oslash -14\nKPX r" -" p 0\nKPX r period -77\nKPX r q -10\nKPX r quoteright -6\nKPX r r -8\nKPX r s -4" -"\nKPX r semicolon -30\nKPX r t 21\nKPX r u -7\nKPX r v 18\nKPX r w 21\nKPX r x 9" -"\nKPX r y 15\nKPX r z 0\nKPX s quoteright -24\nKPX s t -15\nKPX seven colon -84\n" -"KPX seven comma -123\nKPX seven eight -34\nKPX seven five -37\nKPX seven four -9" -"5\nKPX seven one -58\nKPX seven period -123\nKPX seven seven -11\nKPX seven six " -"-44\nKPX seven three -29\nKPX seven two -31\nKPX six four -7\nKPX six one -52\nK" -"PX six seven -40\nKPX t S -17\nKPX t a -10\nKPX t aacute -10\nKPX t adieresis -1" -"0\nKPX t ae -7\nKPX t aring -10\nKPX t colon -37\nKPX t e -22\nKPX t eacute -22\n" -"KPX t h -14\nKPX t o -19\nKPX t oacute -19\nKPX t odieresis -19\nKPX t quoterigh" -"t -7\nKPX t semicolon -36\nKPX three four -9\nKPX three one -57\nKPX three seven" -" -45\nKPX two four -43\nKPX two one -45\nKPX two seven -38\nKPX u quoteright -14" -"\nKPX v a -30\nKPX v aacute -30\nKPX v acircumflex -30\nKPX v adieresis -30\nKPX" -" v ae -25\nKPX v agrave -30\nKPX v aring -30\nKPX v atilde -30\nKPX v c -22\nKPX" -" v colon -32\nKPX v comma -76\nKPX v e -29\nKPX v eacute -29\nKPX v ecircumflex " -"-29\nKPX v egrave -29\nKPX v g -20\nKPX v hyphen -19\nKPX v l -8\nKPX v o -25\nK" -"PX v oacute -25\nKPX v odieresis -25\nKPX v ograve -25\nKPX v oslash -25\nKPX v " -"period -76\nKPX v s -17\nKPX v semicolon -31\nKPX w a -26\nKPX w aacute -26\nKPX" -" w acircumflex -26\nKPX w adieresis -26\nKPX w ae -22\nKPX w agrave -26\nKPX w a" -"ring -26\nKPX w atilde -26\nKPX w c -14\nKPX w colon -32\nKPX w comma -57\nKPX w" -" e -20\nKPX w eacute -20\nKPX w ecircumflex -20\nKPX w egrave -20\nKPX w g -13\n" -"KPX w hyphen -8\nKPX w l -8\nKPX w o -17\nKPX w oacute -17\nKPX w odieresis -17\n" -"KPX w ograve -17\nKPX w oslash -14\nKPX w period -57\nKPX w s -14\nKPX w semicol" -"on -31\nKPX x a -30\nKPX x c -30\nKPX x e -36\nKPX x eacute -36\nKPX x o -33\nKP" -"X x q -28\nKPX y a -36\nKPX y aacute -36\nKPX y acircumflex -36\nKPX y adieresis" -" -36\nKPX y ae -31\nKPX y agrave -36\nKPX y aring -36\nKPX y atilde -36\nKPX y c" -" -28\nKPX y colon -40\nKPX y comma -80\nKPX y e -35\nKPX y eacute -35\nKPX y eci" -"rcumflex -35\nKPX y egrave -35\nKPX y g -26\nKPX y hyphen -24\nKPX y l -14\nKPX " -"y o -31\nKPX y oacute -31\nKPX y odieresis -31\nKPX y ograve -31\nKPX y oslash -" -"30\nKPX y period -80\nKPX y s -23\nKPX y semicolon -40\nKPX zero four -11\nKPX z" -"ero one -56\nKPX zero seven -50\nEndKernPairs\nEndKernData\nEndFontMetrics\n" -; -int n019023l_pfb_len = 38314; -char* n019023l_pfb = -"\x80\x1n\x6\x0\x0%!PS-AdobeFont-1.0: NimbusSanL-ReguItal 1.05\n%%CreationDate: W" -"ed Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developme" -"nt\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COP" -"YING (GNU General Public License) for license conditions.\n% As a special except" -"ion, permission is granted to include this font\n% program in a Postscript or PD" -"F file that consists of a document that\n% contains text to be displayed or prin" -"ted using this font, regardless\n% of the conditions or license applying to the " -"document itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) re" -"adonly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See" -" the file COPYING (GNU General Public License) for license conditions. As a spec" -"ial exception, permission is granted to include this font program in a Postscrip" -"t or PDF file that consists of a document that contains text to be displayed or " -"printed using this font, regardless of the conditions or license applying to the" -" document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by" -" (URW)++ Design & Development) readonly def\n/FullName (Nimbus Sans L Regular It" -"alic) readonly def\n/FamilyName (Nimbus Sans L) readonly def\n/Weight (Regular) " -"readonly def\n/ItalicAngle -12.0 def\n/isFixedPitch false def\n/UnderlinePositio" -"n -151 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusSanL-" -"ReguItal def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-178 -284 1108 953} rea" -"donly def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly d" -"ef\n/Encoding StandardEncoding def\n/UniqueID 5020908 def\ncurrentdict end\ncurr" -"entfile eexec\r\x80\x2\x14\x8d\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a" -"\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9c" -"t\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4" -"\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5" -"Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d" -"\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7" -"\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>ni\xcb\x85\xd4" -"\x8bZ'p\xc8\x41\xe1\xcf\x6\x95\xf4\x9c^\x87\xb\x15\xf5\x17s\x15\xa8IN\x13\xc9\xcf" -"\x8c\x64wuNP\xa6\x98\x5t\x15\xa2\xbf\xf\xdd\xc8\xdd\x1\xd8t\xd4x\x1a\x1f\xdc\x9c" -"\xda\xe0\x9d\xea\xdav\x1d.\xb5M\x83\xcb<*\\\xcc\x92\xefz\xe\xa2Ux?\xd4yu\xb8\x98" -"\xc4\x36\x91\xc7\xd4\xea\xday\x85\xd1\x46\xff\x18\xa1\xc9\x9.\xe4;Z\x1b\xf\xfd\x11" -"\xea\"(\x1d\xd0\xd0\x8a;\xac\x19\x9S{\x98*\x8d\n\xef\x2\xe3R\x13-\x17\x41\xbf\x13" -"\\\xca\xee" -"\xe\x33-\x80\x88O8\x94\x34\x14s\xa9[\xeb=YM|\xe2\xd4\x7\x8c\xcbG\x89\x91\xc0\xcf" -"x\xf5\x83R\x96\xfa)3g\xa3\x1c\xc2w\x88O\x5<\x92p9\xdbSB\xd5\xa8\xfe\"\x41\xbf\xfb" -"i\x7f\x2\xcd\xa4\x35\xd5\x34\xe8\xcc\xc4I\xf4`2\xeaZ\xd9i#\x6\x1c\x38^\x94\n\"\xc5" -"\xd1\x37l\xf2\x7f\xa0Q\x12\xaa\x12\x7f\x5\xff\xbfI\xeb\xcd\x8c'\x9d.\xafg\xe6\xc4" -"\xad\x93Ju\x15\xba\"\x90\x12\x6\x5\x42\x66_\x8\xd5\xf2Y\xbe\xed\xbb^\x97\xd6\xe3" -"\xca\xe7n\xcb\xf3\xdb\x1\xac\x65>\x7\xa9\"\x3}\\\xe4\x81\x9e~\xb4\xe4\x38\xcd\x98" -"\x9e\xb1\x64W;\xa0\x63m\x16\xe8\x9b\x41\xce\xd7\xab-\xd7\xacL\xf7t\x92\x82\xddH+" -"\xe5\x99\x38`|c&\xd2\xd9\xb8R\xcao\x98\xe3\xfe\x43\xe2\xaf\xdf\xd6\x9\xe7]vt\xf5" -"\xa9\xf3\x66\x63Q\x9aJ\xba}\x4\x5X\xc8\x80\x1c\x2H=)\x86\x81@\xc6\x2\x5\x19\x43\x11" -"\xce\xbc\xee\xff\xa2_\x1f\x9b\x92vM\xa9rI\xcc\x8e\xec\xefu\x92\xd3\xf3\xff\x63\xf0" -"\xc8\x43t\xc\xa9I\xd5\x90N\x85\xc4\x2r\x90\x30\x80\x99-aJN\x89\x5U\xdc\xdc\x19n\xbd" -"\xbb\xcX8\xdb|\\\x86\xc3\xfa\x35\x63J\xfe\x3\xdd\xf7[I\xf4\x97\xce\\\xf8@\xc6\xdb" -"V\xf0\r\xba\xda\xb0\xa3\x3N\x9c\xae\xa6&\xe5t\x80\x1\xebP\x8aup\x18|\x89h\xc9\x1d" -"\xd8\xb2\x33\xf\x36\r\x42\x8d?\xcc\x93w\x18\xc\xd3z\x8bR\xfc\xdc\x43\xd7\xd7\x85" -"\xf9\xfR\xa8@\xf2|\xda\x99\xe0\x9f\x8e\xef\xbe\x8\x64|\xf2\x37\x98\x61\n\xd2\xe6" -"\xc\x9c\xa4%\xf3\xc0.W\x10mC\xce\xcX8\xed\xbe\x10\xeb\xd3\xfe\x9ay\x9d\x14 o\x4\x43" -"\x8b\xc4Z\xcd\x43\xd7\x7f.\x80\xe6\x8e\x1b\xe6\x98\xef\xde\xd5\x80\xea`\xa3^\x9f" -"7U'\x9d\x43\x89p\x87G\x81~\xf7\xf9h\x7f\x33\x31\xea\xcb\xe1\xd3\xf0&R|\xe\"\x3U\xd6" -"F\xf0\x0\xe3\x30\xd3\xb7\xdd\xe9\xc8=\xd4\xc8\xacLv\xd5\xef_Z\x4\x6\x9a^k\xce\x65" -"?\xbc*\xca\x8f\xeeI\xa6+\xc6xv\xe4@Bn\xa8\x99\xd3\x9a=\xa7^\xb0\x93Gk(\xf8\xb4\xb9" -"h\xeb\xca\xbb\x8a\xb1\x8c\x99Q+\xda\x16\x15na\xe6\x46\x6\xbd\x96\xd7\xa4\x85\xaf" -"\x91\xc5\x39x\xd0\x43\x1f\xe0n\xc8\xf2\xe0\x9en\xc4\x63\x1b\x1bu\xf0\x1a\xd0\x1d" -"\x91P\x3\xc8\x85\xe5w\xe9\xa4\xf9~\x97\xb7i\x91\xfbph|\xd6\x97\xf7\xe0q\xb8\xb9\x1f" -"\xbf\xd4w\xc5*\xf2\xc0UW\x95.Zx\x2\xfe\xff_:\x16T\xbay\xd8\x80\x92\xe0\x15Y\xf1\x84" -"\xa9U?\xe1H9\xa3\x64\x89\xcc\x65\x43\xaa\xcbs\x82X(!u\xc0\x85\xa8\xcd\xfd\x6\x65" -"\xdd\xc7/\xe8\x37\\\xb9?\xc5)\x14\xa6\xdfs\xa7X\xae\xc4\x31HA\xca\x88\x82\x8fi\xc2" -"`\xc6p\xd5\xeb[\xe\xe8\xbbw\x80\x9c\x1c\x1a\xddt[\x2\xa7\x91\x15\xf3\x9f\x8a\x92" -"\x87 ?\xce\x98\xe0|." -"\xacz\x80\x1f\xbe\xe4\xc7&\x8\x1d\xef\x32$SK\x17\x4\x17\xf3\xc2.o\xba\x8e\x9b\"r" -"\xdd)\x98\xf5\xdb:\xd1\xa2\x16\xf\xac\xd7\xaf\x4\xd3\x8\x91\x17O\x96\x15\xc3\x93" -"k\xd4\xf\xf1Gh*\xa7\x8d\x1Z\x4\x8e\xa8\xa5\xbd\x31\x10X_n\x91\xb4\x8@\xa0\xca\x36" -"\"P\x97~ :\x8f\x94^\x88\x3\x66\"\x99O\xda$\x0\xae\xea\xbb\xb2>\xc9x\xbdw\xae\x1d" -"m\xf8\x82\x61\x87\xa6\xacmA(\x12\xccn\xd7\x99\x8a\x1b:GkFyab\x0^~\xa6\xbd\x1f\xb8" -"$\x11\xec\x61\x35\x43G\xa0\xf6\xed\xa7|\xb1\x0\xb1\xd6\xf2\xce\xa9\xcb\xaeW66\xa8" -"\xaf\xb1<\xbes\x2\x8\xc\\?s<\x96\xa4\xea\xe2\x1e\x64\x39WD\xf0mg\xbb\x9d(\xcb>Z\xe8" -"1\xb3\xe7\x9f\xf3k\xb5\x66\xd3\x9f\xf1~\xe2\x1d$\\\x98\x35\xb9\xfe\x8fv\xf5\x5\x2" -"\xcc|\xe\x31\xd8\xfb+\xf\x91\xf6\xe4z\xcd#\x83V\xcc\x12\x89`\xdf\x38\x13\xfe\x12" -"\xa2\x42\x86\xb7\x8a<\xa5\xa9J\x88j\xbe\xa0\xedp\xbd_\xed\x0\x19\xdd\xaaRz-\xd1\x44" -"p<\x7fM\xd8[\xfaO\xe8ji\xe4\x87\xe3\xdc\xaa\x8e\x44XW<\xfd\x8e G%\xeb\xfb\xcf\xc7" -"6\x5\x9di\xf6\xb8\x65}\xbb\xb9\x34<]\x9b&\xa3\x8d\xe6\x32\xcb-\x8e\xa1\x93h\xf5\xbe" -"\xec\xc3\xdd*=U\xa9\xd8\x1f\xbf\x62\xcc;\xd7Y\x6\xe8\\\n\x1c\xaaPj\x10\xd1XuZ\xfa" -"U\x88\xbfI\xcc\xf9\x14yy+\r3\xed\x3]n1T\x95\xe2\xd6\x86\xe2\x42\xf8=\x93\x0g\xba" -"\xd2\x37\x9e(Q\xf1\x1b\xd0\x65\x15\x13\xe8l\xaa\xb7\x96\xd7?\xa1y5\xb1\x8fRT\x1c" -"\xda\x96\x3g7\xfdZH\xc7\xd9W\xbe\xaf+\xfd\xc1\x90)\xc7\x88mo+\x1c\xb3\x46/\xce\x34" -"\xb1\xe9\x1c\xb0\x33\xc2w/\xf6oF\xdb\x8fi\xd7l;\xbb\x42\x9a\xd5\x35\xe3\\T\xa2L\xc5" -"\x97\xb3\x95\xdf\xc\xac\xa6\x17\xc8\xe7\xe7\x9a\x99\xea\x44\xe8\xee\x46o\xc1\xa1" -"\x83\x94t\\\xc0&D0To\x99;un\xce\xe7Z\xf6\xdan\xe3\x38\xff\x1ck\x9a\xdc\xb\x8b\x8" -"\x2\x2\xce\xe9\x84\xedt\xb0S\xfb\xc6\xa8-\xd0\xea\n\xd9\xa9\xfd\xf5\xe2i\xb0h\xf9" -"uh*\xe3]F\x3#y\x89\x96\xdc\xd3\x36\xd8\x8\xc6L^f\x1b\x88?\xed\xcf\x10\x10\xb3v\x8" -"\x98\x18\x43\x39g\xba\x45\xaa\xde\xea\xc7\x41\xbdh\x1d\xfe\x98\xa3i\xab\xf2\x90\xae" -"v\x8b\x62\xba\xce\x11\xae\xccps\xec\xf3*S*\xf4:\x85S\xf\xf0\x93p\x95\x88\x84\xee" -"#\r\xc1[\xb0\xcaY\xa5\x9d\x93`\x8e\x66\xa6\x9b\\Vo\xc9\x8f\xae\xe2\x66|\xfe\xfb\xd6" -"\xaf\xaf.|\xd8\x1a\xec\x92\x8f\xc1\x18\xf2\x14\xb5\xb5\xac>Mx\xe1\xc7Tp\x87h\xa5" -"\x85\xf3\xf8\xac't6\xf2\x96q6\x7f'q\xbc\x16\xef\xfe\xaf\x9e\xe9!\xec\x33!}\xc3~\x8e" -"\\:\xd3\x1b%\xb0P\xf6\x95\r\x8b\xf9l\x95\xe6j\xab\xf6\xc8\x9\xf7\x89\xed\xafVv4\x97" -"\xac\xe2H'\x96\xf7\xfc\xf5\xdaO\x96\xe2\xa7\xfeW\xc0*\xbd\xa5\xf4\xda\xb6\x81\x1b" -"\x10'\xfd\xa8\xec\xe0\xeb\xb0\xdb\x80\xa3\x92\x11~)_\xa4\x87\xba\x99#V\x1d\x95\x9d" -"\xa5\x34\x85{\x9d\xa3\x66\n\xac\xd8wB\x1\xb6\x43\x9c\x6\xdc\x36\xe7\x1a\xdb\x99\x0" -"\xd2\x9c\x5\x37\xdd*\x0z\x18\xae=\xe9\xb5*\xca\x92\xfa\r\xf6\xc\xa4\xd9\xb0K\x97" -"o^\x9c\x82$l\x7f\x99/N\xdc\x12q^;\x92I;\xb6\xf3\xe1.\xd3\x91\xcd\xed!DN\xe3r\xba" -"W\xa5\xa8\xc7\x33\xf7\xf5\xedV\x93\x1f\xf5\xdbo\xa0/e\xfa\x1f.\xec<\x1cT\xa7\x5\xae" -"C\"\xbf\x90;d\xd1-\xa9\x4vqO&>\xaf\x11\x81\x3\xce\x8a\xfc\xec\xfa\xef\xc|\xb9\xe2" -"\xa7`\x14*\xbfVK\x90\x8{\xcb\xc8\x83\xd6)j\xe7k\xecK\x0\xb4\xf8\xe0m\x9fG]\xb8\x8a" -"\x90\\\xbaH\xd7,\x92\x8fT\x9f\xbd\xf1\\\x33\x0\x1c\xb6k\xbb\x9f\x83\xe4\xb0\x65\x1a" -"\xe5\x16\xae\x1d&\n%\xe7\xc6\x9e/\xf7|'=a@\x9c\x9b\x92/\xe6\x9c\xc9\x61\x17\x44\x65" -"\x9f\xb4\x30\xfcu\xa1\xc\xb5\xd8\x84\xb9\x36\xa0-\xc1\xed\xc5x\xf2=i\xd3s\xe2\x42" -"\x98\x82!:\xa7\xee\"\x19\x87\x14({\x87\xd0\x9ft\x9\x10#$\xa9\xc6\x9a \x9c\xc\xe9" -"\xf9N\x19\xa8\xd4\x96\x99\xb5v\xf7\x8cR!\xe4\xbf\xc0\xd9\xa8U\xf2\xfc\x65V\xc1\xcc" -"j\x1c\x88\xea\x84\x85\x90\x66\x0.\xa3\x13.\xb8\x46\x19\x4\x13\x19\x32h\xdc\xc4\x81" -"\x9a\xc6\xc\x8a\x32\x5\xf2R\xd2\xfdt_Z\xc0}|\xd3S\xd9\xa6\xbb\x1b\x9\xd5\x96\x1a" -"\xf8\x86K8\xb\x37\x88\xbm]\xc2?_\x9d\x11~\x8\xc4j\xee\x9a\xe9\x63qy\xc8$\xefw\xc0" -"\xcaR\xb7\x16k\xbe\x82WJs\xde\xf8\x9c\xe3/\xc2\x64\x95\"\xb0\xf5\x98\xbf% \xeb\xe2" -"\xeb\xfcV~o\xb4j\x8a\xdc\x37\xe6\x14\xd3\xcc\x30i\xbeh\x89\x9b\xaclY[3]0\nGZ\xa9" -"\xf5\xf7\xc6\xbd\x0j\xbc\x86*F\xa9\xac\x10\xb5\x5\xf8\x36\x44\x1d\xb7\x32G\x82\x14" -"\xa4\xaa\x87\xd2\xd2K\xb3Mt\x90\xf6\x34\xf0\xb7\x98\xb1nV\x17\x39\xa7\xce\x66\x9" -"\x80\x8e\xc\x31\xa5\x89\xd0p\x94'\x92\xdf\xe0\xa9\x13\xfc\x45\x10\xf9\x62\xc2\xe4" -"\xe8\xd1\x30\x82\xb4\xfcT\x9f\xaa\xc0O\xbf\xbe\x3\xb5'A\x88\xab\x1\x9\xe9\x10\xca" -"gpg\xd5\r\xedqP\xb3I\x16u\xf5z\x1c*\xc7u\xf5\xed\xbf\xa7h\xf6\xdf\x34\x9an\x9a\xd2" -"\x1a\xd8\xd8\xa3\x85\xa8\x98\x9b\x84\xdc\x89\x45t\x96\x89\xf4\xd0\x44t\xac\x97\x65" -"2\xe\xc7\x37\x7f~\xbd%\xe5\xd0\xf7\x32\x17\x90\xc4\xf1\x9a\x9\x99\xb9@\xeei\xd4$" -"LK-\x15\xf8\x8e\xeb\xf8\xdf\xc3 )\xfe\x35\xb9qr%5\x8\xa2U\xc6\x65\xfc\x10\xe1\xa8" -"P\x19T\xd2:\x10\x34\xb0\x9f\x44\xb2o\xb3`\x8e\x44\x95Y\xf4`&'\xcav\x86\x8f\x64\xc8" -"\xf0I\xce\x8a\x41\x86\x35\xe7\xb\xbc\xb4w\xb9O\xac\xfd\x9d\x61[\xbb\x16\x39\xb0\xc8" -"Sa*3\x7G\xa5ww\xa9)L\x97#\x92\x99\xff\x9foU\x93!n\x95o&\x85\x3 \xdf\x8a\x88\xa8\xa0" -"\xc8\xde\xd0\xc3\xfd\x90\x9f\x2\x39\xf1\xc5\xbf*\x82Mx\xe9x)\xcd\xba\x30_\x9b\xb6" -"\x8\x7~\xff\xca\x86\xd4\xfd\x42y\xb9\xc9\x35\x91\xb9\x82\x31\\\x19]\x11\x1dN9\x95" -"r\xcaQ\xea\\\x1\x94_3\xba\xbd\xd6\xfbJ\x93\ny\xa4\xa6\x66I*F\x18\x83Y\xf9~\xca\x32" -"6q\x87QL\xe2\xe2\xfe\xa2\xc4\x1a$xV#h{&\xe6\x1c\xf7\xca\x45\xe5\x91\x9a;6f\xad\xe0" -"f41`35X\x8f\x8e\xa3I\x2\xa8i\xc7\x63\xe8z\x7fJ\xb1\x64\"\x1f\xc6\xe5\xb\x15|\xf7" -"\xd7\xff\xd0\xaaK\x9c\x92h\xf7\xa2\xc3\x6\x19V3\x11\xcaN\xb2\xc1sW\xd4\xe1\x15OS" -"\x13c\xa7\xc4\xa5]\xb3\x86\xb6\x97\x5^+`\xfa\xb9" -"\xb4l\xf2\x44\x43\x9c\x87Q\xa1\xdc\xf1\xad\xb9\x63UA]\x8blB\x6\x65*\x97\xfH\x7f\xc4" -"\xe1\xd6I\x12\x9cs\xd0\x9c\xc8\x35y\x95(F\xb0\xad\x9e\xc\x62\xe\x4\x11^b\xa8`\xc7" -"|\xdf\xc3\xfb\xc3:\xd2@\"\x8c(\xda\xe2\x1c\xbf\x90 ?&$\xe6\xcd\xd6.\xb5\xbc\x84\xb" -"\x87\xf9\xfdPQ\xb3\xd7\x43\xaf\xef\xd9\x90\x13N\xabj\x8a\xf8\xdb\\\x1\xf9\xaf\xf0" -"\xf1\xd2\x96@\x14)\xf4Y\x8f\xda\xa4\xc~\xf\x99\xeb\xb0\x34\xa9|B\x8a\x39M)]-\x97" -"\n$}\xda\x61\xe5\xf0+\xe2\xb8\x8e\x1L\x9a${\xc3\x42\xef\x8\xa6\x92\x7f\xc8k\xe1\x99" -"\"\xb5~\xb3P\xde\xc0i\x8f\x8b\x9fH\x7fWY\x81\x5\x1c\x83\x30\xed\xc6\xdd\xe9\x39\x38" -"p\xbb\x37@!\xf9\x82h\xdcx\x81\xc1\xfb\xa6/\xe3\x46\x1b\x85\x92\xaa\x34\x1\x1c|\xd3" -"\xf2\xb9\xab\xdd(\x11\xdd\x91\xeb\xa0\x1b`\x1Z\x15\xeaLg\xc3\x64\x9b\xe9X-\xec\x41" -"\x1d\x12M\"#\x9\xf5\x1cw\xb5\xed\xc2\xc8\xfe\xee\x19\x90tCU\xfe\xb1\x9f\xd7\x0\x7" -"\xd0w\xb7\xc2\r\x85\xc6\x8bw\xd0\x42\xf7\x9czlC\x8\xdc\xab;+}#>\x1bY9z\xd3\x8\xc7" -"\x9a\x18\x89\x7f-\xbdJ\xac\x34_ \xb2\x1e\xcf\x83\xe0\x14L\xd6\x91\xb6m\x9\x64u\xb9" -"\xf1\x95\xa0\xf1\xc4\xe9\xbd\xc4\xa2\x1a\xef\xdb\n\xa2\x91\x86\xbc\xc0xV\xc9\x9e" -"t\xdd\x32\x7f\xf9\xe2\xdfn~-\xbd\xf1\x90?\xb4-\x9c\x18\x9e\x46\x95\x62W9\xfc\xe9" -"\x9b\x64\xd5o\xa5\xd8\xb6\xa7\xd6w\x9f\x8\xb8#\rB\xf7\xc4\x9e=\xea\xcc\x66\x1d\x6" -"\x82\x8d\xce\x13\xd4\xfbrz\xdaJ\xef\x42gt\x9f\xbd\xf5_JeFGx\xe5\x80\xf3\xc9\x1b\x81" -"\x87?P\x84t\xf\xcf\xcd\xef*\x8b\xe0*Jk\xfa[\n\xba\xfI>?\x0\"W\x99v\x9e\xed\x4\xe8" -"\x0T\xbe\xa0t\x96)\xf8]\"\x90S7\xa7\xf%\xf5\x9c\xd3\xff\xdf\x89L\xaaJ\xd7\xbb\xb0" -"\xf2t\xb8\x1e\x8c\xdf\xd1\xb9#+#\xd9_\x6\x82P\x16\x9\x1b-\xcaX\xa4\x5\xec\x61Z\x2" -"\xf7\rQL\x9\xd6\x8e\x80\xd1T\xe0\x95]\xf1\x1e\x36!\xb6\xf7\xcfJ\x14\xd8!E\xbd\xfb" -"\x16j5#cu\xc3\xb0S%7\x2\x39\x12-\x7\x90\xfc_\xc1\xe3R\xe7\xf6lt=\xeb\xb9`\xe4\x8d" -"\xf9\x6SW\xb8J\xebi\x81\x36\x9fs\xael\xd3kg\xe1\xe+U3ex\xb9\x86K@\"bj2\xb6\xe4\x18" -"I\xe0\x31\x8e\xc4qn\xfb\xd5\x1f\xbd\xaf\xe1\xe5\xc9\x65\xdf\xc8\xe8\x18\xbb\xf2l" -"\xe3\xbc\xc5\xe8\xf\x14\x33\xc3\x3\x8b\x97\xde\x96\x8\x96\x44 4\xd7\xd7\xbb\xa9t" -"\xf2\xbd\x1e\xf3yq(\xcd\xf1\x2%\x8eX\x18\x4'\xcck\xde\x16j\xce\x1c!\xd0r\xf4\xaf" -"~\r\\\x9b|=k\x91\x83\xf1\xdb\xd8\x43\xe6\xe8\x3\x30'}m6\xd1\x39X\x10\xd6\x9f\xc7" -"?l\xca\x39\x8?\xf2\xcb\x39P\x13\x9\xa7\xf3'n\x8\xa3s\x96\x33\xdb\\\xbb\xa6\xe6G\xd5" -"tA\xba\xea\xbe\x84\xb1N\xcb\\\xc4\xf7\xec\x18*\xca\x15\x43\x34\xef\xbf\xa8p!HR|\x15" -"\xd1\xcb\xee\x9a\x5}\xca\xa4\xf1\xc\xe)\xc]r>]\xa4\x7f\x36\x95\xa5\x9d\x4\x19\xeb" -" -$\xb6*\xe8ph\xc8\x97\\\xd8\xb8\xae\\G\x0\xa6\xea\xba\xda\x9c\xcaO\x9aPW$6\xec\x34" -"\xd7\xd3\x16\xf0\x1d\xb5\x4'\xec\x7fyO7;\x93\xed\xaf+\xd2\xd3/\xd9< \xcd\xbe\x95" -"\x96\x97\x66r_\x88\xbf$\xf9\x99\x16\x1cI*M\xb9\x31~\x11\xe7%\xd7\x33\xd1\x97\xd5" -"\x8f\xd4\x16YGH\xd7-1\xc8>\xbb\xfa\xcfO\x6TVF\xf8\x41\x98\xbd\x12\xd7Y\xa1\x17\r" -"\xa0\x7f,\x1f\x36\x37\xd4\x8c\xaf\x8a!\xf1\xc5\x11)' \xf5\xe1\xe5\xad\x63\x2i\xf3" -"-\x81zGv\x86\xba\xf4\xc5\xc8\xdf#\xad\xbe\xbbk\x9f\x7fW\xe3\xb5\x34\x42\xbe\x8T8" -"\xeeL\x8fK2I\xcf\xb0r\xf2\x13\xe5\x66\xafN\xcd\x34\x34\x61\r;\xb1\x33\x80\x33\xaf" -">\xca\xf0\xd4n\x7f\xc3\xe1\xe7#P\xdd\xcf\x4p\x1\xf0\x7\xf3,\x80\xb3\xe0\n`(`_\xfd" -"|\xbf'\xa7\x8e\xc0\xff\x9e\xa0\x31\xf8\x34@\x11\x4\x90\xcaXj\xbc\x9e\x1e\x36\xb2" -"\x88S\xde\xeb\xb0\xc4\x66\xe1\x43\xb0\x41\xbb\xbf\xcf\x9b\xf8\xc5\x18~\xd1\"\x7\x17" -"\x1dxc\x89\xe8\x9c\xae\x5\xea\x13\x14\x96\xe1\xbJ\xc4{zR\x6\xf\x2\xc0\xacw\xa0\xd5" -"\x89Q\x84\x33\x84x\x19\xee\x7fm\xc5\\\xfG\x5\xeb\xca\xd5\xc6\x1e\xa4\x93.<*\xeb\xe1" -"s\xf2\xbb\xc0\xce\xaa\xbc\x63\xcdX\xe7H@3\x4\xad\xd9\xe7\x8e\xd4xYA\x81\xbb\x8a\xd7" -"\xfd\xb6\x37\xf9\x1b\x92U$\xb\xbc\xe9\x43\x15v\x5\x14$\x1\xb3\xce\xa0\x39\xdf\xb0" -"\xf7\xe2\xc3\x7f\xb8J\x1f\x83\xb1s\x5\xbe\x3\xb0\x9f\x33\xf0_\x9e\x45q\xc4\x66\xaf" -"\x19\xfd\x1d\xda\xbd\x84\xa5\x7KX2\x2\xcc\x39\x95\x2|\xf6\xfc\xf6l(\xe1\xa2`Jr\xff" -"\xc6\x98\x2@\x6\xe4\x46\x61(\xf\xf8\x99+_\xee\x92\x30\xf5vYL\x8b\"\xdbi\x3\xcb\xa0" -"\x8c\x10\xb2M\xab\xa9\xbc\n\x35\xcc\x61\x89\x10K\xedP\xfa[\x7f\x11\xe4\x34J\xbc\xf" -"g{\x9b\xc0i\xa8\xbe\x8f\x82r'\x1f/>>\xc0\x97\x36No4A\xf3\xfd\xf7\xf7\xd1{\xdalun" -"0\x95\x80\xd5\x33JR>8\xc9\xc3\x34\xce;P\xf0\x17\x9b\x1\x31\xa3\xc3\x98\xc1\xd7\xf5" -"B N\xd5\xe5\xb6\xf0\x35\xc5[$U(n+u\xfd\x9b\xea\x16\xb3\xfd\"g\xe4Z\xbb\x9f\xfb\xec" -"+\x1c\xd8\x92\x18\xa7\x99\xd0\xa2wG\xdd\xb5\x14\xbe\xc2u\x8fN\xd4\x8d\xf8\xe2\xc3" -"\xae\x1dX\xe2\x7f\xf1\xd9\xc6\xa0\xecI\nu>p2\x18\x44@\x9f\xc9S{\xc0\xf9\xad\xd2\x8" -"\xc0\x42\x90\x66\xee\x18\x38\xc8\"\x90\x9d\xb7\xcd\xcdg\r\xb2)\xd1\xb8\x1e\xf\x8f" -"z\x17\xd4\x36\xbf\x9b\x87\xc\xcfJ\x8f\x3\xe0\x1d<0\xb3\xd6k\xbe\x34\x19\xf\xdf\xd7" -"\x83o\xe7\x42x[`\xa4?\x93\xa5\xcc\xca\xf1=\xd4\x61|\x94\x9c\x15=\x80\xee\x32\x8f" -"\xeb\x6\x92\xaasH\xb8\x93\x8a\x8c\xd1%\x9e\x1b\x6\xbd\x13\xc6\x1P\xd5\x35\xa7\xd7" -"T\xe6\xf2\xa1\x1d\xc7\x61<\xc4\x14Or\xc4L\x85\xca\xc7%\x10\xa3T\x14*\"\xa7\x8b\x88" -"X}\xf4\x7f\x95\xa6\xdaOT\xbe\xda\x8e\x30\xd2\xd3\xe0\xa8\x7fH\x84\xe7\xdd\r\xfe\x5" -"h\xe2\x12~y\xb\xeb\x1a\xc4'4\n\x1a\x37\xe0\x14\x8c&76w\xd1)\x83~n|=\xdbW\xe0\xc8" -"I\xf8\xbf\xb9\x6\xfby\x1c!A(t$\xe2\x5kf\xf2\x9f\xb4\x1fl_\xa5\xb1&M\xb8r\x98\x93" -"7w\x1fUf\x11\x89\xf7\xeb\x80\x82\xab\x8av(ER\xf6\xdcT\xfdw\xddz\x6&\xb9\xe8\xc2\x10" -"\x8fR\x1d\x84\x96\xce\x2\xaf\xff\x61\x3\x88\xccN\x0\xf\x66\x16X\xd0'T\\QS\xfdp\xa4" -"a\xd8\xd6uO\x1b\x66\x7\xe\x42YM\xdc\x1\x91\x89\x2\x3\x80\xf\xd6L\xe2\xf8\xbb\x1c" -"*\x1\x9c\x30\x8e\x83\xbf\x87,N\x2\xc\xb5\x10]\xd5\xe4\xe9\xfc\x1f\x41<\xaf\xd2\x36" -"\xfd\xd8$\xe7\xc7\x9d\x35\x12%\x81ppB\xe7\x36\xff\xe2hO}\x96\x1l\"\x96\xce@nM\x92" -"\x19\xedX\xbd\xa5\x93HE%o\x1a< t7\xa0&\xfdp#\x85\x37\xbc\x99\x9e\xa5\xddnzp\xae\x97" -"\xad\x14\x9aG\xfc\x9c\x93\xc3\x85\xa1/\x17\xf2\xd0o\xbc\xc9\xc0\xb1\x14\xec\xa1\xf6" -"\xff\\\x9a\x94)w~JMVhp\xd6^_\x17\xc8\x32-ld\xd0\xda\xb2\xd1\xee\xb1\xaa*\xe6\xae" -";\x89\xf8~\x11S\xf7\x95\xa6\xf2\x42\x64!\xf0\x9<`\xc9n\xee\xfb\xb8\xc9\xb0\xfa\xaf" -"o*s\xde!\x8d\xdf::\xe9~\xfaxT\xc7\x4\xa4\x2\x1d%\x35\xf5\xc1\x12\x93V\x89\xdc\xf5" -"Y\x16/\x19\x1a\x97\xb\xf4\xd8\x66\x92\x45\xa3\xc7\x10\xb3\x3\xc7*3\x98\xf5~\xef@" -"\xe6o\x95\x11\xce\x92'\xd3\xae\xc0\xe6\xc5X\xd6\xa8J{\x87w3\x97h@\xa4\xd7\xa6\xc9" -"\nny\x1c\xbd\x85\xbfI1\x82\xd4~\x6\x9f\x7f\xf3Ox \\\xeb\x63k\x82I\xa8\xa6\xa8\xd3" -"\x89\xb8>\xc3\xdal\x2\x66S\x98z\xf8\xeb\xed\xf2v\xda@\x8c\xf1#t\xf0\x86xI\xc4\xf1" -"\xc5l\xb0/(\x17S\x17YR%\xab\x85\x5SlB\xc4\x44K\xbe\xcb\x7f\xbd`\xe2\x17!R\xa7xA\xcb" -"\x10\x35\x33\xf0jbGs\xc3\xea\x99\xd7\xca\xc6s\x16W\x81\x2\xaf\xc\xb8\x97\x8f\x9c" -"\x10`e\xf2\xf9V\xe0{C\xb\x9c\xea\xabt\xa2\x38@G=\xfb\xa9\x4i\xe2)\xdc\x7f\x5]\xdf" -"jn\xab\xe3\xc3\xf7\xa0\xcahMb(f\xdf/\xad\x34\xa1\xc\xcf\x8u\xbc\xbb&\x98\xff\xe3" -"\xf7,}A\xc8\xccP\xe2\xcSE\x9c\xd0T\xd7M\x97\xf7\xba,\xbf\x80tu\xfe\x1c\xee\xee\x86" -"\x10\xec\x94\x1dUa\n\x8o\x18\xfck\xcd\xb7\x45\xab\xa1\x1c\x62\xba\xdb\x83\x1a\x44" -"\x7f\xc3\xe8\x1a]\xc5\x45)\x10\xbb\xc3\xf2\xb5\x87\x87\x33G\xcf\xbc=\xe6\xaa~\x14" -"\xe4G.\xe8\xae\r\x34*\xc2\xad\x9et\xaf\xacG\xf7\xe8\x85\x31\x64z\xa8O\x85Y\x80\xd4" -"\xf2 \xdc\xca\x12\xaf[\x90\x99\xe\xe5Ufi\xdf\xafV\x99\xeb&\xc2M\x98\xcb\x80\xeH\xfd" -"\xfb\xc2}\xc4\x64h\xfap\xe2G\xcf\xa0\xbb\x82\x91\x42\x17\x3\x97\x6\xf\xedL%\xbc\xee" -"\xfa\x1b\x4%\x89G>\xf2\xd6\"\x41l\xe3\x41\x12\xb5\x95i\xe3\xd0\xd5M\x8e\x9\xa8\x38\x44\x9cr\x9e\xd2\x66\xcb\xa3\x92\xc5:\xdd\xd8Z\xf5<1\x90\xc8\x17\x16\x37" -"R\xad\xc2\xa6y\xd3\xb8\xe6\x94\xdc\xb2\xc6\xb4z\x94|?\xf2s-\r\x17\x97\xb7\xfav?\xfe" -"F\x16\x11;\xf3-{\x18\xbb[\xdb\xee/\xc8\x10\xf9\x14\x90\x9a\xc0o91\x96K\x9a*\xe9\x30" -"\x14\\\x65\x81\xd7\xc1\x97\xa6\x15gw\xbaK\xfc\xc4\x17\xe1\xd4v\xea\xf8[\xa6\xa6\x45" -"\x90\xb1`>\xef\x89l~35\xa9\xe8>(\xba(\xdc\x8e\x96W\x98\xfa\xd0\xfd\x83;'\"\x7\xcc" -"\xd9\xbfu\x1\x13\x98\x9dhlQ\x96g\x9d\x17;\xa4v9.@k\xe9\x18\xbc\xbb\xb9\xfeQy\xaa" -"\xb1\x7f\x10\x32\xc8,\x84\xe2\xcegZq\xd1\xf1\x6\xa8\x7f\x1di\x89\x62\xe0~l\xc7h\xbc" -"\x98\xc8\xa5*r\xf2h\xc4\xfxe \xdc\x88xd\x88\xff\xfe\xd2yW7Z$J.\xab{\x1c\x33I\xb3" -">\x8M\x9\x8d\x8c\xdc \xc1\xd5\xf5Y\xd3\x91w\"\xa2\x63\x41\xaaZ\xc2\xdc\xe2\x66\x86" -"fq\x8d.\x99|\x11\x8au\x96\x9b\x80\x35\x15\xbd\xb7\x42\xd7\x85\xe1\xd0\xe5\x6\x8e" -"\xd5\xf4\x13\x13\xb2X\xae\xaa\xa2m\x9-\xd8\x92x\x1d\x1d:\x2\xff\xce<\xecy\xc7\x65" -"Z\xb0&F\xe5\xba\x32\x8e_\xejk\xb5\xf3\x8c\x11\x99\x34\xff\xae\x98\xfe\x16\xb5\x30" -"lA!o\xc6\xbcoQ\xc2v\n\x9eZ\xd4\xc3\xc\xa4\xb1\r\x9f\x18\xc3\xfcl\x8a\xa5\x9d\x62" -"6\xff\xa9\xb0$\xc7@\xb0\xae\xa2\x89i\x97\x90\xce\xa9T(\x84J\xd4\xe4\xd0\x36\xc4\xb" -"P\xab\x94\xb0:\xd4\x80!p\xcU$}\x8e\xf0r\xe3'\xe8\x81\xf9\x94\xb1\xc0\xc4\x8f\xe3" -"d+\xfc\xa5\xe8$\xf2~\x8e\xd7\x14\x92\x19\xc8\xd6\xcbi\x16gW\x7\xcc\x37\x42y\xec\xbe" -"O\x14\xe8\x66w\xa7\xf3&Kq\xdd\xdeL\xe6\xb5w\xb2T\x97!2\xe5~n^\x93\xc3\xcf\xea_\xe4" -"\xc0\xcfv\x1e\x92\x9d\x18\xfb\x61\xeb\x80m\x12\xb4\xa6%+ps\x8e" -"\xb1-\xa1\x90\xf7\xb7\xa0z\xdf\xe9s\xd6\xdd \x92\xc3\xc9\x37~\x85\x41H\x9c+\x4\x15" -"\xec\x11\x81\x37\xcb\xf8\xb8\xe4/\x5g\x1dX4\xae\n\x98\x92(\xf4t\xc4N\x0N\x16{-O\xb9" -";\x10\x87/\xf8\x8fi\x6\xce\xfc\x46\xa8\xd1\x95\xe4=p\xdc\xda\xc3\x14g\x97\x38\x8" -"s\xd4\x62\xda\xb\xd1\x61\xc7P\xb0\xd9\xa2\x10_\xc2\xd8\x98\xdf_\xa0\x35#:\xdd^v\xc3" -"\xd5@\x1X\xc2\xf2<\xa5i\n:a\xd0\xf6rz\xc3\xba\x11\xe8\x96\xc9\xfa\x1c/\x12\x30\x44" -"\xd2>[\xa7\xf0\x39\xaf\x14\xb3\xbc\x18\xb9*T\xfc\xf8g\x97-\xc0\xad\x37 Y\x1\xc3\xc8" -"Z@X\xe9v{v\xa5\xd2$#I\xd5\xdf\xc[\xff\x35\xf8\xa1\xf0m\xea\x17\x82y\x19\xff\xe4\x62" -"\x92\xe8\xf1tW\x13\xc2\xad\x98\xf7O\xd0\x37\x43\x1c\xbf\x6\xf0\x8d\xb\x81\x39\xc" -"g\xb6\x1c\x83_J\xfe\xe0=Fk\x17S\x9fS\xd6\r\x39\x80[\x15\x43J\x1\x9a\x9V\xf4\x18\x1f" -"\x8e\xd8\x81\x9e\x41t\x1e=\xe9Q]A\xac\xf2\x38\x8by#\x95z\x15\xd1\x1c\xf2\xcK\xcc" -"\n\xd5j\xd4t\x1f\x99\xed_\x9d\x0]b*\xe6\x33Z>_\x81\x66! \xfdv\x9a\x9c\xe6\xa9\xad" -"\x7f\xf8U\x12\xc1!J\xae\x2\x8f\x66\xdc\x1c\x37\x2\x36\x1f\xbf\xbf\xe8\x36<\x1f\x38" -"\xc1\xae\x39\x46\x45;\xa1\x8f\x0\xa3G0\xb3H\xff\xe4\x8\x87\x37\xb\x5\x66\xad&\x94" -"\x1d>\n:/\x8d\x83\x9b\xc" -"\x98\x4\"\xda\x61\xc\x84\xbb\xf5.{F\xb8\xb3\xcfz\xb0QH\xa0wlf\xc5\xa7\x98\xa8\xb8" -"b\xdf\x31K\xc;C=\xd2\xb3\x1\xf5~\x97\xf4\x41\xb7\x33W\xcaT\xf0=\xb2 \x94\x36\x13" -"\xda\"GY\x85\x65G\x96\xc1\xf5sW\xf4\xf5\xae\xcd?\xdb\xf3\x88\xaa\xfd\x39\xb1\xed" -"\x8c\xde\xb8\xf0P\xde\x7f(|)\xfd\x43\xf8.\xf7!\x1Jb\xa5\xbb\xb1\xfb\xc\xd9\xe3\x9d" -"4\xa9U\xd7MU\x16\x92#\xe1\xd2\xc9$*\xa4yaOrg\x96\x1aN\x16\x97\xaa\xfc\xcf\x12J\x8c" -"\xf0\x44\x88\xb1Z\x8d\x8f\"$\xfbX\xe6\xed\xacnB\xd8,F\xfU\"\xfd\xf8\rr\xca\x9eo\xe3" -"\xfb\x13\xabo\xb9v\xba]'\x98se\xe}\xa0*\x97\xd3\x84\xf3~\xf0\x87s#\xa1g{\xcc\xcd" -"\x88^\x94\n\xb1y\xc9\x35\xaf\x90\xcf\x2\x11\xc2\x1d\x32\xf0\x4pgE\xb7=|*\xb1\x1e" -"|Z\xa0\x8c\xab\xe3P\x8f\x62\xeeh\xa0Y\xc2\xcb%GO\xdc\x1b\x87\xcb\xa3\xd4\xeb'M\x1d" -"\xab\xef\xd3\x1b]+\xd1\xcrN\xcd\x89\\M\xcn\x7Hm9\xdd\x38\xfe\xbe\x5\xe5\xa8\xc7\x96" -"\xc1@<\xa3\x9b\xb9\xcb\x3\xff\x9e|\x1bm\x9\x82\xf4\x62\x11\x0\x93\x90\xca\xf3\xdf" -"X'\x8c,\xf1\x91\x95y\xc0\xea\xc1\x8b\x14\xb4\xb1^G\xb4\xf3\xafm\x11\x89\r]\xe9$\xac" -"\x90\x63\xff\x90\x34\xdc\xa7\x8b\xeaz\xd9\xce\xcw\x85\x99\x80>\x9b\x91\xe7\xac\xb2" -"M\xe2\xc7i\xe6\xee\xb!\xde\x36\xa1\xd3-\xc1>\xf7\xd3" -"^(\x81\x4\x8e\xb5\x8c\xf7\xfe\xf8=\xb4\xa1M\xb6k\xd4\x93I\xbe\x33\x44\x8d/b\xd8\x9f" -"\xaf#\xa1nd\x3\x98Y\xac\xbc%\x31\x7f \xbd!&iR\x96\xb7\x32\x66\x8d\xfc?;v^\xd1\x1d" -"\xb8\xa6\x17:\xcc\xfc\xcb\xab~\xee\x4\x17\xb\xe4N\x2\r<\xcb\xfc'^sq\xe6\xd0\xa1/" -"\x94\x14}d\xba\xdeRp\xe3\x10\xd0\xbb\xc3\xe5\x1b\xd2\x46\xf0\xf7<\xfd\x86\x8d\xc4" -"H\r\xbd\x86=;ua\x83\x95\x11\xdd\x65&V\xaa\xe9\x33\x41\xefW\x87:`M\xb0\x8b\xb4\xd7" -"\xa9\xb3\x16\x45;k\xb0\xc8\xcaM\x1c\xa4*On!\xa5\xf7izin\xc0\xcb\x11\xad\xe5;W\xc6" -"4-s\xf2\x9e\x1a\x66\xb8\x64\x5R\x8f\xeaLt\xd4\x88VhB\xc1\x2\xbd\x17g\xa0{k\xa4\x82" -"\xaa\x61\xe6\xdc+\xbf\xed\xb0\xf2\xc4\x90\x30\x46JG&\x9e\x88\x92$m\xe0%z\x9\x1f\x32" -"\xef\xcf\x7t\xc7\x1a\xc4\x32h\xa5g\xc4\xa1\xbc\xcd\x8f\x2:'\x8b\xc1\xe8\x30\x9c\x42" -"_\x0r\xd9\xd9\xcf\x8c_\x1f\x65\xf2\xc0\xfn\x19+\x98\xde\x91\x62\xc3\x1d\n\x41\xeb" -"\xd0\xccmq\xa2\x9b\xcc\x62@\xff\xe8Z\xd5\xd8\xbc\r\xeb\x85\x99\x8f;)\x84\xe7:\xb2" -"\xc4\x86\xb2\xd7\x93Q'\xee\xfa\xc7\xfb\x7f\xb1\x6_C[\xe8\xa3\xe8\x32{\xd2\x11\xd3" -"\x96\x7\xc3\xcb\x7\xf2\xe1w\xcc)R\xe3T\xf0\xbax\x8a\xc1#\x99\x38\x83\x9c\xdd.u\xfa" -"\xabqs)\x1d!,\xc4k\xe1U\x1f\xf2\xd7#\xbe\x91j*\xc4j\xcf\xe1\x8d\xd4\x92\x7f\xb0q" -"\xd2\xc1\x89\xcb\x1a\xc1\xce\x9a\xd1\xfb\xcf.\x8^P\x17I\xb1\xef\x64\xa9\x84W\xf4" -"\x1f\xa4\x8d+\xe9\xa8\x5M=kcY\xd5\x84\x97\xecq\x3\x37\xbb\xff\x63j=6\xd8\x18\x1d" -"g\x82\xec\x88\xeb\xc3\xcb\xb3,\xd8\x43q+GQw]\xfa\x16\x33h\xb9G\xf3\x90\xd8\xab\xde" -"J\xb1V\xfb\x42Q\x9bM\"!&\xb2\xf6\x95\xf1\xa7\x12\xdc)\xe1[\xca\xed\xa0\xb5\x90\x13" -"\xd1\x41\xad\xd7\xcc\xdeN\x1e;\xb3\xb0\x12\x37\xb2\x5\xa3\x87\x8P\x8e\x30M\xd7%\xd3" -"\xaf\x8^\xee\xb0\xd9RR\xf4\xf4+f\x2\x0\x96\xeaQ\x9f\"\xa4\xe8l\x5\x16Qk{\xdb\xb\xb1" -"Xa\x9e\xda\\\xb9\xde\xf8Z\xe0\x8eVWm!H$\x17\xf6\x41*\xb6*\x19!\x97\xc4\xb8\x31\xd7" -"\xb2\x8b!~\x93mH?\xb2Mt\xb6\xe\xa4\xe2w\xa9\xcc\xef\r%\xf9\xba\xfc\x8e\xd0[\xfa\x80" -"2\\<\x2\xa0\xa6\x33\xc4$\xd6s\xf7@\xdc\x1b\xbe\xeb\xd4\x9alMg\xea\x0P\xa3N\x97\x99" -"}\xd6w&j9\xb3OK?B\xca\x6\xbe:\x7f+a9\xcd\xb8\x8\xb8\x98\x13\xa9K\\(s-`c;Y\xc2\xdb" -"\x99\xe2\xa5P\xf9\x88\x19!{\x19^\xc6\xe4zy\r\x94\x15\x8c#G7\xa8\xce\x1f\xcd\xa8\xc" -"H\xcf\xba\xfa\x13J\xef\x15k\xf3\x39\x11\x8d\x98\xd1\x14\xec\xea\xe9\xe2\x1\x8f\xe" -"|`\xec\xa7\xba\x88\x1f\xbe\x7f{\xb5V\xfc\x15\x84-iM\xf8\xb2\x3m\xa1\x9\xd0\r\x19" -"\xcf\xeb\xf7\xc8\x99;\xb9/\xd2\x9dW\x8d\x1\x45N%\xfc\xf5\xfa\x7f\x36\x1asB\x99\xd5" -"%\x16\xc1\xae\xc6q\xb\xe7!\x89\x80\x86\x90\xed\xd5\xb3i\xd1\x9e\xf3\x7\x1e\x8b\xfd" -"\x83K\xdd[d\xdfjo\x8f\xaa+\xd4U\xf\xdb\x9a\xe6\x8e\xca]RV\x93\xa6\xad\xa5;\x93\xc7" -"\xa5sn\x93\xaf\xaf\xce\xed&\xa7*\xdcM\x9e\x37\xb3-\xd7;\xa3\xbe\x87\xf8z\xce&\xa4" -"w$I\xea\x89x\xee\x16w\x9f^\xe2\xd7\x83\xee\xfd\xb4\x90=\xedZ\xf5\x85\xc9\x38\xa8" -"\x1V\xb9w\x82\x98\xb4g\x8a\xb6`\x94#AY'\xbd\x61\x8c'\xbcn\xf7\xe1\xeeh\xf3\x8f_\xfe" -"\xeb*\x1b\xd6\xa1\x9f\xbc\x14K)f\xf7/\xda P*\xeb\xef\x92\x12\xe5\xc3\x7\xf7\xc8\xb4" -"w\xff\x89\x65O\x90\xf7\xbeZM!\xb2M\r\x86v\"\x97\xee\xe1\xa0\xcbX\xad\xaf\xc6\xba" -"'\xd3%\xdf\r\xf6\xbf\xba\xf0?\x82\x97\xc9\xe4\xef\x1e\x18N\xff\x9c\x82\xec\x7f\xdb" -"\x2/\xa1~\x83\x4\x9d\xbax\xe3y\xde\xab\xf3\xe4y\xe8u\xfO\x10zG\xf5\x1b~\xc5\x82\x62" -"\xe5*0\xcc\x93\x43\xcf\x9b\x92\xcf\xcbOn{[k;a\xabt\xea\"\x8d\x8e\x3\x14\xff\x46\xd8" -"\xby\x85\x12l\x2\x42\x6xk\xd6\xf3g\xfd!\x1fq\x98j\xe4\xddW\xab\xd8\xae\x83\xcdh6" -"\xa2\xd8\xe5\x9dP\xe1\xa6\xe7*\xd7\xbc\xea\xddr\x5\x8c\xa2\xa5\x61\x89@\xf\x12\x94" -"\xe1\xc0\xacg\xe9\x11h@\xd4\xcc\x15\x9eXH\xb3\x6*\xdb`?\xb3\xbau\xd0#\x8\xd1\x36" -" \xaf\xbbs\x6^Qq\x83\x39\x8e\x81Np\x1aS\xd9P\xce\x9c)\xc5\x99\xf0\xe1\x4G\x7\xa2" -"\xe1\x83:^\x9b@\xfd\xec\xd6h;j\xd2\xf4\xd8\xc3J\xf8\x92\xcdZ\xa1\x9e\xe8I\xd2\xba" -"\xb2\xd4\x91\xea\x1b\x1b\xd1\x82\xe7|\xab\x13\x14\n\x41o\x3\xe9\xd2:\x9f\x33\xd8" -"\xfa\x82Os\xe3|x.=Bal\x1c\xa5\x89K\x4\xb4\x97z\xb8O`e\n#\x96\x88\x7\xb6\x8f\xf0\xb7" -"J| \xe0\xa0\x43v\xe8\xd7SSZ\xe2\xe8\x8f\xe1\xb7\xc6\x88\x44\x18\xc2q\x16\xe2\x32" -"u\xe1\x81hO7[E\xf2\xb4\xf8IH\xcf\xac\xfe\xc\x35\x2=\x80,\xb2\xa0supKF6?\xc5\xaf\xed" -"\xe3Pit\x84\xac`^2(\xa3\xe5'\xa6G(\xec\xef\xea\x8c\x4\xc9\x46\x46\x35\x9d\r\xb\x9a" -"\xb8W\x8b\xda\xb5>L\xa7\x1f\xf2\x36\xd9\xdc/\xdf\xa7\xca\xc2_\xca\xdc\xe1\xa4\xd8" -"\x6\x39\xd5\x1d\x82\x85\xbe\x86t\x14\x8e\xe9\x9c\xe8\xbdOW6\x7\xc6\xc9\x39\xf7m\xc4" -"\xdc&\xaa\x85\x1c\xed\xef\xb4\x94\x1a\xcb\x64\x1f\x9f\x31\x2/\xdc\xc9\xf7g\xc6\x97" -"\xd4\x11}L\x1a\xae\xb\xe3\xc8\xfe\x93{f\xd6 \x19\xf5\xad\x8cZz\x87^\xd9\xae\xea\xca" -"\x10\xed\xf0\x6iL\xdd\xfe\x9cm\xd1\xca\x35\xa7\xc1\x99\x9bK\xd4SZ{\x80Yx}\x8f\xe5" -"\xd7\x42\xc8\x11\xaaJG\xb\x32\x86\xc6y\x8e\x44" -"\xec\x46\x6mU\x18=\x8e\x96\x18\xb6\x66-8o\xb0\x42\xa8\xadI\xbfS\xbd\x1f\x44\xc8X" -"\xc7\xf4\xc2(\xe8s\xf3<\xf6\xc5\xa3\xc3\xfa\xd6\xe9\xe8\xb3\x13\xb1k\xe5\xe0\xb1" -"\xacN\x6\x96\xf4\xf8\nX\x16\xd6\x9d\xffh\xccz\x8b\xb\xd9\xe6\x10\x2l\\\xb4\xbaR\xf0" -"\xb9h\xb1q\x8c\\\xa0_\xd9\x19\x1d\x2\xd3\xcf\xab\xdb\x96\xc7!BQQ\xbf=\xa0\xe7\x0" -"\xe\x14\xfb\x15^u\xd8\xe1\xb9\xa5\x9d\x6R@\x1aV\xd2\xc2s\xb0\xd2\x37\xd6+2\x7\x5" -"\xa7\xb0^\xcc\xda\xdeis.\x17W\x1\xe9\xed\x8br;/\x8b\xe3\xad +1\x16r\x81\\\xb\xea" -"\xff\x85mq\xe2-|2\xddj%\xed\x64R\xad\xf5\x38\xd2h\xef\xd0\xba\x1\xf7S\x4\x61\x92" -"j\xe9\x65'\xc8\xe4\x1\xf8\xc7L\xf1{\x9b\r\xfc\x31\xc2/\xb5r,\x12\x3g\xffn\x9y\xd6" -"\xca\x11\xf\x30\xd1\xef\x9f\x7\xa4\x90\x81/\x4\xf7\xa8\x2\xd3{\xb7\xb4\x62p\xc4O" -"\x11\xe8V\xd0\x82\xee=\x18\x81{<\xad\x46\x64\x8c\x8a\x38H\xb0\xdf\xdc\xe4G\xcf\xf2" -"\xee%\xe8'\x9b+\xc9\xa5\x9d\x90m\xebzy\xa7\x8aP\xa0\x85\xbf\x9alj\x82\xda\x85*R\x8" -"O\xc4\xc8\x15\x63\xae\x80\xfe\\v\xf5\x98\x12T\x7f\x37\xe3\xbdg\xc5\xf3/\xf5~\xbd" -"\"\xff\xe2M\xeb*R\x6X\x98\xa9\x38\x3\x66\x4\x61\xa8\xe3\x62,\xb0\x1a\x0\x43 \x12" -"\"\xa5J?\xedR\x6\x93\xca\x4K_\xcc\xda\x83~m\xa4\rm~'Qj\xd8\xb1\xc5z\xb7W\x88\xe7" -"N(\xa9\xb7\x85\x11z\x8a\xee\xc1\x90\x9f\xa7g\xa5\x6}\xfe\xccw\xa7\x1b?%4\x8b`\xe8" -"\xaa\xa9\x32\xdc\x9e\xfe;\xc0*\xa5\x8f&\xbfn\x1f\xbf\x85(\xe1\x8cT@v\xbf,O\x9b\xe9" -"\xbdw\xa7\xb3\x1.\xeb\xff\xde\xa9\xd0\xfe\xb1\xaa\xa2\x1c\xbd[b\xc6W\x1b\xb8y\xa8" -"\x95\x99\xf8N\xcd\x17\xb3Q\xacTS\xb8\xce\xa2;\xa5_M\xce\x15\x82\xb6\x9\x42\xfb\x89" -"\xd2G\x91+\xf7\xe8\xee\x1f\xf6\xb8\xce\x43\x84\xd8\xb9\x0\xb3\x5&\xd7#\x86\x83[=" -"\xbe\xc7i\x97\xf6\xda\xdbU\xb1\x9\xf6\x16\x8\xf[\x1c\xf1\xdb,4/He\xf1;.Ofd\xa8\x35" -"B\x90pXl\xf7\xbc\xc5\xec\xea\xe5\xecrQ\xb0W1Te:|\xf1\xd8)%c\xdf\xa9\xe8\x45\r\xcb" -"\xf6 \xe7\x17}\xc1\x16\xee&\xd5\x7f\xea'\xb0\xab\x86P:\xd3#\xdf\x92\xe4\x18JN5\x9b" -"\xe6\xa7o\x1\x34\xd0t\xe6\xe6\xa8\xda\xc6I\xb1\x9b\xd8\x8fT\xf3\xd1\xd7q\xa6\x87" -"\x2\xc1\xda\xcc\x34\xe5\xa4\xc5\x8e\x96\xac\xaf\xd7\xec~\xdf\xe3\xb1\xc4\x44\x3\xdb" -"\xa6i)w=\xd0'8\xd3\xb7\x80W{c\xa7\xfb\x36\xd6\x10\x39\xc9\xed\xe8N\x8u\xfciW'\xcb" -"\x92\x84\x64\x7f\x8a\xc4\xf4\x9a\xca\x94\x10\xa7\xc9\xfe\x9b\x1c\x35\xd2v\x9d\xc6" -"vY\xf7Z\x9f\x88\xe6?\xd9 d\xe8\x18;?H\xd6\x88P\x16\xd6\xaa\x91\x6\xa4\x1c\x8f\x1d" -"_\xc5\x3\\\xfcpQ\xf2\x11?UzV<\xd8\xc4\xf3\xbc\x43\xc1\xfc\x84\xc8\x42\x14\xc3\xe5" -"VP\x8a\x82\xd4:}\x11_:\x2vq\x8a\x1c\xd9\x96\rT\xac\xee\x38\x12Q\xb4\xf5\x2\xd1\xee" -"2\x90\x4\xc0\xbb\xf7o\x93\xad\x38.\x16\xf6\xfe\xf1\x89&\x16\xa7\x95V\x82\xe4Oc=k" -"\xa1\xaa\xad\xee.\xb8\xec\x45\xe5\xf3&\xa3\xfe\xa3\x8e@\xc1\xf1\xd0\x9\xcd\xe6\x15" -"\x11!9$\x1e\xf9\x16zR\r'\xd9\x42r\x1d|\xfc\xa2\xc8\x94\xc9\xd2Q\x86[Gq$\x9b\xc0\x92" -"\x3\xa2\xc8SY\x16]P\xda\xc<\x8d\xc\xe4u\xf4:\xf0\xb4\xae\xd4\xd8\x31o\x92Zj\xbcY" -"\xbeY*\xb5\xf7\x5\x1\x80\x66\xf0\xc2u\x1b\xe6\xf4U\xb4\x8b\xb4\xb6mFL$\x96\x63\xff" -"\x1c\xde\x8d\xbe;\xf1$\xe9\x8c\xbe<\x8c\xa7\x8d\x10\xee\xe5\xb4\xe7\xf0HY\xb2m\xa7" -"ab\x8c\x11\xc7\x41\xd5)\xc5\xc1\xfo\xbb\xb1(-\xcf@C+\x12\xef\x1\xd5\xfe \xbd<\x3" -"\xa2\xd4\x1cx\xc1\xfb\x82\xfd\xe7\xe8^$\xeb\x36N\x84=+\xbe?\n\xb9$\xfb\xe1xf\x7\x42" -"\x5J\x8f\x6Ow\xdf\xb7\x93\x6\x35xmJ\xdc\x89~\xdc\xc1\xaf\x91\xf2!\xdcQ\xe3\x32\x30" -"\xa3\x2k7\x80\xa1\xd9\x99\xcfs\xf1\xd6\xf\xcf\xb1\xb6\xd2jr\xf8\x82\xa7\x43\xab\xb8" -"8\xa2\xf5v\xff\xbb|z\x9b\xd1\xba>3\rD\xb7\xc8,`\x99]A@\xf0\xc0\xe9\x13W\xa1\xee\xc8" -"tH\xc5\xae\xc1\x1e=\xbW\x6\xc7\x14\xa5J\xa6z2\x90(8\xd7-\xd4^\xa6\xc8O\xc3\x85~\x91" -"\xec\x87&\\\x13\x15\x5\xe\xdc\xc0M\x1a\x64x\xa7\x97\xc3\xa4\xf2z\xa9\x92\x91\x96" -"\x1f\xb0\x10\x98\xe2\x9a~\x1e\xdf\xfd\xce\x97zI~xkS\xfa)\xa8\x13=\x12\x9dJE?\xd0" -"V\x91\xbd;\xde\x33!\xbe\xe5!r`\xec\xe8\xe9%\xf0\x1c\x1a\xd1\xf1V\x90q\xd3\xee\xb0" -"\x95k\xfcJ\xcbt\x92\xc4l\xac\x86\x10o\xe9t\xc3\xe7\xf1\xe0\x99\x34s\x1f\xdd\r\xc" -"\x9\x87\xff\x1e\xf8\x8a\x9c\xd5\xaa#\xe6\x91\x18\x99\x80\xb\x35\x17\xf4\x99\x9a\xa9" -"\x0\xdd\xc1#\x8b'\xd3h\xc8X0X<\xf8Y0\x83\xab\xe0\x45\x45\xb5\x9e\x1a\xf3]\xa1\xb1" -"u\x9e\x96\xd5xM6\xa9oSW\xae\xa2\xc9v\xf2H$N\xb3\xfdk\xc8^\xe4\x87\x19\x95\x62\x14" -"[j\x98\xebI9\xf0\x9a\x89\x15\xd2t\x80H\x8\xc9\x80\xcf\xc1UQ\x95\xe9\xe6\xb!\"(G\xcc" -"\xe5\x31!\x1c\xa4\x95\x6P\x19\xe1\x18\x90\xfe\x8dy\x88\x8d\x17\xea\xc3_a\x9c\xd2G \xe5\xcc{\x8e\x94QK8\xfe\xa8\x83*U" -" ^\xec\xa5i\xc1+\x8a\x8\x1b\xed\x10\x17\xde\x66\xc3\x46\x7f\x63\xe9\xffM\xd3\xcf" -"\x7fZe\r\x7\xce\xd1M\xd6\xc2\xdd?^%\x83\xfe\xafs\xce\x13\x33R7y\xb6(\xf7\xaayv\x86" -"F\xd5n$\x2]>\x19\x4\xcc\x9c\x1f\xc7\xd5\xaavcT\xcb\x62\xa1\x62\xe7\\\x84\xaas\xf6" -"\x82\xd6S\xb0\x16\xbXo~\xb4\x43<\x13J\xf8\xa2\x17\xf4\xb6\xe8\x6\x35qq\x3\x9d\xa5" -"\xf6\xde|\x6\xdb\xf7\xf4\x9e\xc0\xf0\x43\xeb\xaa\x33Y*\xb6\xe8\x8a\xa1n\x9d\x1d\xad" -"\xcbu\xc\xe5;\xaf\xa3r\xe6\xd1\xd7p`\xae$\xf9\xe6NH*\x1f\x39w\xfa\xc6\x8f\xa1\x35" -"\xf6\x18\xf9\xc5X\x9d\x80\xdb%\x10\xc6\xd1(\x83\xdc\x7fl\xad\x37,\xbf\xfb%\x87\xa3" -"gk\x15\x43\xd8\xa7_\xe5\xc0gk\xd3\x31\x66\x0K\xbb\x99\r\xe3\x4\xab\xd5\xf9\x11\xd2" -"b\xc8\xea\xed\x80KW\x99h\xab%I\x14\x97\xe0\xf\x8b\x8b\xdc\x90*\"\x18\xfd\xf1\x90" -"\x8b\xbdw*\x3+\xcz\xc1N\xca\xfcT\xf5H\x95\x9d\xbd\x87\x8\x42\x80\xd1\xde\xdc=\xd7" -"\x17\x18\x89\xa5vO\x8f\n\xd0\xbd\x64\xca\xce\xcb\x5\xce\xf\xf0\xf1\x9e\x16Yk\xc9" -"6\xc6\x45\xc8\x15o\x80\x8\xbaW\xa0\\/\xb3v\\N_A\xf1\xea\x83\xdfy\x5G\xff#\xc8`\xc2" -"3\x85\xa5>M\xa8W\xff\xeP\xfb\x33\xd1\x84\x80\x7f\xb1\x64\xd0\xeeU%\xca\xde\xf8\x62" -"&E\xf2\x66`\xba)\x1a\xd8 \xa5:\xce\xf2\x38\x65\x93\xf2\xa7\xae\x45mqp\xb4Q>\xf1\x89" -"\x10\xc8\x46\xcb\x32\xeaV\x89\x36\x7(\xfc\x81\xaa\xc8\x66\x1c\xbf\x16,m\xd6r\x8b" -"5\xc8L\xc3\xfd'5\xa6l\x9c\xd5<_\xab\x39\x80V\xbf&\xef<\x87|\xc2\xf1q\xb0R\xc7_(\xed" -"\xda\x8e\xe1\xaaK\xad\x4v\xec\x85\x66\xe\xfc\xb7\x1\xa4T$\x7f\x99\xa9\xee\x1fog\xa0" -"\xd6]\xc9\xad[F<\xd0;d\x16\xf3+hm/m\xfc\xf6kk\x5\x13;\xf4\xdd'\xd5\x7\xd7\xff\xc" -"\xbg\xa6U\xf9Q\x11\xecwd{l\xebNhO<\xc8\xf1IZ)\xc0\x83v\x1d`\x13\xd2\x2\xa4\x5\xa4" -"f-\x8\xd7\x7\x17\xfw\x9e\xc6\x99@\xb4\x9d.\xf-/0I&\xed\x7\x95\xefYR\xc6O\xd1\xb8" -"\x8d}\xb5R}\xa6\xff\xaf}>^\x3uEr\xcb\x4\xe9\x85\xed\x12^f\xec\xc0x\n\xf1\x89>\xe9" -"\xda\xaa\xe0\x1d\xa8\xc1\x8a\xf7\x38XK&\xc0\xcb\x34+\xde\xf1\x8d\xa5Z`\x80\xa9\xea" -"\x1c\xca\x34\x93\r\xe8\x30\xbb\xe8n P\x1d\xfb\x89\x93\xcc)D\xe4q/e\x81\x8d\x38\x9b" -"\x80\x80\xabZ\xfd\xc3X!\xbe\xe7\xd3r\xc5\x8a\x82\x38\xcd~;\xeb\x87\x92\xac\x82\xa5" -"\x16\xa7Q\xbb'vV\xe1\xec\xb5\x6\x7f\xc8\x4\xd3\x16\xa7T%6;,\xa1TpJX|\xa6\xc8x\xdb" -"\xb6\xccp\x9aOD\xb2j$\xbd\xc5\x36\xe3N\xb6p\xa5\xa5\x46\x16\x61T\x93\x39\xb5\x95" -"\xfe\x8c\xdd\x92\xabp\xbdR\\\xe7\xe4\xb7\xa7\xda\xf7\r\x38\x62\xb6\xee\xc4\x16\xf4" -"\x8\x93\xa7\x11\x81\xd7\x98\x92\x1f\x8a\xce\xc\xd2\x16\x37T\x87\x3-\x18\x63\xb4\xb6" -"\x15\\\x9f\x8b\xed\xf4\"\xcb\x13\n(\xc3\x39\x8e\xd5x\xc\xc4\"\xb0X\x9c\x9e\xa2\x8d" -"_\xab\x5\xd7*\xe2\xa3@\x8bJ\xd5?(\xac\x99\xbf\xd8\x31\x33\x5KK\xff\xbd\xef\x18\x14" -"_G8\xd7\x32\x12\x94\x94\x63\r\xae\xda~\x9b&uodVK\xac|\xd9\xd2L;\xed\xe6\x7(\x14\xf5" -"\x8ai\xa8\x64:\xea\xd0\x9c\x3\xdb~)\x1d\x1\x1a\xee\xb3\x14\xdc\x9uG\x1e\xcd$\x9c" -"\x1bJ\xe1\x85\xfcmF\xf3\xcb\xe5\x62(Tc \xd2\xac\xf4\x99-\x8b\xc4\xcfu\xc8\xcal\xe6" -"\xe4K\xdc\xa2\xa1\xd6\x44\xe0\xfe\xad\xe1\xce\xf1\xb4\x88\x9d\xe1U\"\xc4\x1e\x9e" -"jU)\x9b\xee\xca\x7f\xbfG\\H\x1d\x9\xdc\x5\xf2\x46\xf5\xb6s\xd0\x8f\x36\x8c\x84\xb0" -"D\x0\r\x6G\x94}\xf7=\x7f\xd0\x85\xa5qs\xc7\xec\xd7R\x87\x8cgt\x8a\x8d\x63\x13L\xe4" -"\xf8\x33\x93\x80\x82\xee\xc2:\x7f\xa2\xbcr\xf6\xa8\x42\\\xb2\xcf\x45\xcd\xd5\x1d" -"\x9j\xa3p\xeaw\x8d\x7f\x1d\xc\x34\x1a\x15\xacxt\xa9\xef\x10\xae\xbc\xcb\xd3\xdb?" -"&\xfd\x97\xe8\xa3i>\xccpq\xfe\xeb\xfe\x63\xccQx\xe5\xe4\xcd\xabG\xe8R\xf3+\xba\xf" -"-\xed\xe2\x95\xd5\x8e\xbe\x8f\xf7r4\xa1\xa2V\x8d\xaf\xa3\x2\x5\x44\xa5\xa8\xf5\xe8" -"\xfe\xeaq]\n\xcc\x33K\xaf+\xf4!a\x89-\xde\x39\xe2\xba\x2\xffg\xa6*VVC\xee\x84h\xbd" -"\xda\x9b\xfc\x33L\x92\x8b\xe6\x63\xb8+_:\xc3z\xcf\x8a\xba\x14\xed\x13\xdcN\xab\xf" -"Ae\xa4M\x90}\x8b]^I\x3\xdc\xec\x65r\xe1\x8dq\xd0\xd3\xbf %m:\xf9\x14\xe5\x8c\x9a" -"\xecz\xbd\xaajV\x9e`\xb2\xb8\x1f\xa9\x61-\xd3\x9cv{s\x8eY\xc2\xbd$\x19t\xc0\xf2\xe8" -"\xe7\xa6\xff\xb2\xef\xd7\xa0 \x83\xfb\x17i\x9bNW}\xd3\xebs\xebXE\x8a\xe5\x95\x1a" -"\xed\x11Z\xe9\xd4\xc6v(\xf7\xca\xb0/\x95M\x9c\x1c\xe1\xd6\x33W\xda;\xcd\x43\xc\xa4" -"\xce\x82\xf3\xf4\xd0:,AD\xdbQ\x92\x46\x89\xff\x45\xe4\x1f\x46u\x19Sh\xf2\xf\x36m" -"M\x9c\xb7\x9c\\\xb9I\xd0\xbh\x86\xd1\xd5u\x93\xfdSi0]o\xbd\x81\x85\xb\x9bk\xf4\x33" -"\x81_\x8\xa1\xec!\x17,\xaa|\x7\x61\xdb}\xf4\xbd\xe1\xdf\x64\xa0\xa2\xfb\x12T?\\\xf0" -"x\x1b#\x84\xcf\xc4q\xbfv\x2\x61\n\xb7\xf7 6\x8e\x35l\x98\xcd\xe6h#\xe3\xb0\xf0n\xb9" -"\x17\x14yi\xef\x83\x19U\xfa\xa5\x91\xdb\x99\xaa\x11<\xd1\xda\xd8\xc8\xfa\xbe\xa8\x86\xc2Yd{\xcck\xab\xe6\xe\xf6\xbc\xce?\x17\x17\xc8" -"\x1d\xb9\x19\x9c\xc5\x92\x96q\x1f\x82Je\xe\xf6\x1e\x89\x94\x87\x6\x1\xf4^\x8f\xce" -"\xb9O\xee\xbf\x8a\x61~\x92\xe\x19\x7fXY\xb7\x90\xb2\x44\x30X\x11\x46\x9f'\r~\xae" -"\x8d\x35\xf1n\xb0\xb2\x12)\xa5\x83hD\xf2-b\xd1\x63\xc7Z\x1e\xa3\xcf\x1b+\x81\x1c" -"t\xc3]}\xc7h\x13\x15\x1c\xc8\x14\xb1\\\x80\xa2vN\xbb\xd6\xf2\x46\x0\x37{GRS\xc9k" -"\xf7\x8f\x39/8\xfa\x8e\x7f\xf\x3\xfv\x96\x9e\x9e\xcb\x43P\xd8\x8f\xd2\xee\xbc\x9d" -"'R\xdeknnA\xd7|\xbd_\xe9\xfdW\xcR\x89!\x8dX^\xe5\xa5U\xea\xe8\xca{i\xf6\xd2&\x6%" -"hAZ\xe9\xc3\x86\x84L\xd4G\x5\x39\x9e\x31\x1a\xe\x15re\x0\xf6\xd2\xb3\x15q7\x11\xb0" -"\xf8\n\xf6\xdb\x14/\x9d\x94I{\x8aHw\xa8\xa7)\x6\xa7\"\r\x38sO\xf8h\x4\xc6\x94:\xd4" -"\xa2\xf8\x95\x95\xc5\xf\xf8\xd8\xa3\x9c\xe1\x9XYtC_2\x4\xc5\x10\\geG\xef\xb\xce~" -"\x8e\x80\xc3\xc8\x1c\xe7\xab\xaa\xcb\x90M`N\xfe\xac\xee\xfb\x2Xai\xdc\xd3~\xc5\x7f" -"l=O[kZ?5El\x97\xde\xb6\x14\x66zJ\x1c\xb9\xb6^\x99\x97\x88\xee\x2Z\x11Q\xb7I\xcaK" -"\x95\n\x1a/\xfe\x5\x13\xe7\x1a\xc4\xdd\xb2\x4\xe0n#\xf4\x43\x1e\x38\xac\x41\x91\xe1" -"(v\xd3\x32\xc8\r\x9c\xf9,\xe9>V\x1e\x31\xc2\x17_\x82V\xe2\x32:\xdc\x8f^:\x2s\x90" -"\x81\xc\xf8\x98\x7\x85\xc2\x91\x2yN\x8b\x8c\xdd \xc4\x43\xbe\xea\x34\xcd\xb6g\xc6" -"\xb7\xdb\xc8\x1c*\xb3\x16\x19\x1d\xab\x1c\xe@F<\xb5\x9e\x13\x9a\xdc\xfbm\x9e'\xbb" -"\x8d\xb8\x64\xc7\xf2tgB\x7f\xd7L\xeb\x82\x81\xc6\x6L[\x19\x1a=\xce\x10\xda\x43\xf0" -"\xc8\x83\x87\xad\xf9\xa9v\xaa$\x0\xdb\x9b\xfd\xb4Y\xe4,\xf6\xb0\x9b+\xdf[\xe0\x8" -"a\xca<\xe8\xa2\xf2=cC\xfK\xf2{7\x89\xfb\x1\x98k\xd3?\xa4\xad\xedx\x98v\xc9!\x2KU" -"\xfcm\xa1\xdd\x34\x9b\xabL\x8a\xdcKt\x97tz\xd3w\x2\xeb\xe0\xe6\x1f\xfb\xe2\x7\x64" -"\x83\x33\xa7\x5\xf3:>\xf1\x32\xc6\xb3\xa9\xe7\x18\xa9\xb3\xa9\xe4\xd7\x85\x39\xc3" -"\xde\x9b\x3\xcb\x13\x84\xc6\xbfl\xf7>a\xe4\xf>Z\"%\xe5\xdeHzT\xef\x99\xc4\xee\xad" -"H\xd8K[U\xfd\xfb\x86\x9f\xfd\xb1\xabO\x9b;\xd8\xff\xe5\x98\x83\xc8\x19;QN\x9b\x80" -"u\xc5\x82\xb5\x9f\x19i)e-\x87\x99\x86\xe7\xee\x8\xf9\xa7v\xcf\xe0\xe3\xa0\r\x7f\xc3" -"\x86\x94\xc1\xb2\x62\xab\xfd\x81X/2\x13\xf9\x99\x63\xa5\xe\x9c\xaf.\xf4\xee\xc3\x18" -"q\xbd\xe0\xbd\x14\xd5\x8bT\xd3\x1d\xe2_\x12\xa5\xfb\xab\xec/\xbb\xf4_\xf0\xe7q\xd6" -"k\xda^\xc4+\x5\x8b\xe8\xa2\xe4\xa4[B*_T\xb8{.\xf2\xfa\x64\xe\xc0Q\xcd\xedW\xb7\x8e" -"0dn\xa9\x61\xc7t\xe5$I\x12G\x6\xc1\xa4\x4w\x8e\xff\xe6_\xba\xa1{\\e\x13\x5\x1`\x92" -"\xa7\x35\x5\x1f\xe\x18\x0z\x86\x61\x1\xce\x8\x10\x1f\x61\xf5\xc9}\x7f\x9e\x38\x86" -"\xd3\xd3(y\xa5\xf5H+R]e4.\xcc\x8b\x64\xc7\x38\xed\xe5\xbf\x1d\x63.\xd6\xd8\"G$\xdd" -"\x95\xf9\xf9L\x93\xd3v\xe\xa5\xd1\xa3\x17G\x93\xe4\xdb: P\x86\xb\x1c\n\x41\xb9\x65" -"\x19hX\x1d\xe3\xb1R\xa8\xf7.c\x9eo\x8f$\xa5z\xd8\x16\xa0\x33\x14\xb1\x3K\xfb\xb4" -"7\x8b\xd7\x43s\x0\xfjm\xa5\xfcJ\xd6\x9b\x12\x18h\x8ci\x99\x38\x63\x1b\x10\xb5\xd8" -"\xde\x64R\x88\xbaH\xe9\x8f\xa2\xbe\x17\x33\xf7\x14\x97\x7f\x61\xc4\xa3\x8i^f\x0\xb0" -"\xb6\x1e\xca\xf9\xdd\x87\xb8\x16\xa3\xf1\xd8\x93S;6\xc3\x3\xc6\x85S\xc9\x1c\xe8\xf3" -"qq4\xda\xf1\xd0\xa0\x65\x46&\xfb\xd6\xa3\xc6S|~3\x96#\xb4\xc4\x62-\x1a\x91G@\xb7" -"\xe9\x61\x1f\x35\xb1h\xf5\xd1\xc1\xf4]\xex\xbf.\xc3\xe2\xf1\x6y\xb1i\xa2G|\x9d(l" -"\xa6\x9e\x39\xf\xb3\x14I\xc1\x93\x8ay\xa6\xcd\\\xdc\xc\xd2\xe\xd6yw\xbf\xe4&\xfd" -"\x96-\xef\xceH\x1aV8\\\xdet\\\x84\xef\x8e\x13\xc4\xe8\xa4\xe4M\xc0\xf4\xd8Ia \x8f" -"b\x99\xf5\xd5\x84\xfd\xae\xfcg{\x3wh\x84<\x11\xe1\x3\x13\x10\x15\xdb\xb7?\xf1\x62" -"\x9a\x93\xb7#&\x90\xcf\x10;\xafV#J\x96\x13\xfd\xc7X\xf0\xe\xfe@\xd0\x80\x63\xd8W" -"\xcaoA\x9c\xef\xc8\xf0\xa7]\xa1\xda\xc\x94Y-X\xd6n\xdf\xc4\xb1Z2\xdep3\x87\x0>|}" -"\xb0Q\x1:\xa6\x66\xa7\x45+#\xce\xe8&\x7\xf2\xc6\x92\xf7\x9\x17\xfa\xce\x96\xc3\xc7" -"\xa0{\xd6\xadN*5\x86\x6\x10~R\xf7\xd8|W\xf6\xca\xa3\x46\xa5\xbe\n\xd6i\r\xec\x1p" -"{h`\xd7\xf8\x6\xf5\xe9\x15\x8d`\xe1#\x6\xb8N#\x87\xc9o\xe6\xca\xac\x42\xedmk\x8c" -"\x15\xcf\xd6KI\x90t\xc1\xeb\x63H\x9f\xab|(\xdc\xa5)u\x9f\x84\xc2\xc4 \x0\xe1\xde" -"89\x96\"\x7\x8d\x9c\xab Q\x9\x1a\xfa\xc1\xbf\x1e\x44\\$A\xb4V\x9\xb5\x82\xe7\x93" -"\xe8\xb8S\x8a\x32\x63\x1d\x9c\xd1rW\xc9h\x93M6g[!\xa8\nh\xaeQ\x7\x4+\x6\x7f\xa8\x1" -":\xcc\xbe\xa4\x11\x1f\x9d\x8\xe8M\xdd\xa1Q\xf7\x97\xdf\x1f\xa3\xdc-~\xa1yy,\xc2\x9e" -"9\xf8\x9d\x98\xdf\xb1\xa7w \xed\xe4\xf\x92\xc3;~\xd5&\xd5\x81\xe0<\xa5(!\x86\xa9" -"*|\xa1s(\x94\xe_5\xadI @\xb5\x87\x39\xfb;\xfe\x8\xf2\x5\x9e\xea\xf8\x91\xbb\x42\x90" -"\x8eN\xb0\xdc\xc5\x1c\x7f\xb8\x10\xe5~\x99#_\x1dn\x1a\xd7;\x9\x84_\x3[Uj\xb2\xd9" -"\x81\x91\x1d>\xc1\x99\x97<\xe9%\xeb\x8fq\xc9\x18X\xd4\xe8\xbe\xfd\x98J\x85\x18\xda" -"|)\x87\x92Y\x19/\x81\xc5\xb7\xc2\xb\xdfX4\x11W\x8f[0\x8eh\xb3kt1\xea\x33\x39\x42" -"\xab\x1f\x9\x1d\x86K\xad\xf2\x46\xc3_\xd7\xe8\xe4\x9e\xd0\xdc\x94j\xcc\xc4\xff\xec" -"\x17\xe2;\x10J\x9b\x10\xc1\xfa\x8e\x63\xb4\x66\x1c\xf6\x1fi\xf3\x94\xfa\x1b\xc\x97" -"\x2\x31?\x9e\xae}x\x8e\xe\"\x44\x1d}9\x1d\xaeN=\xf4\x1dU\xaer\x91\xc2\xc4\xb2\xbb" -"/Ra_O\xe0\xbc\x1eJ\xfa\x45\xc6\xf6\x42\xf8\xf5\x66\xcf\xea\x41\xbe~\xd4\xb4\xea\x9e" -"\xac\x35\x84X\x7\xf3\x42\xea\xdb|\xf2\xe1\xb5\xe3\xe6\xca\xce\xa8vQ\xba\x4q\xb8\x9" -"a\x93\x13\x43)\xd9`Q\xc6\xbf\xed.\x96\x3\"\xe5m\xe4\xd1\x8c\xdc\x35#\xcb\xc0\xa5" -"t\xda\x3\xca`\xe0\x8diP\xe3\x32't\xb2\xe4'\x1b\xe9\xe\xc9\x61{w\x8d\xf5\x94\xcb\xac" -"d\xbdG;\xec\xbf\xd2(\xcb\x8d\x8e\xa6\xd3\x1b\x44\x16\x63\x8c;\xb4W\x9h\x8e\xd2\x1f" -"|\xd9\xac\x8d\xfd$\xb0\xbb\xb8\x65\x63\xb\xbbR+2\x99[2\x8b\x14\xb1\xcd\xba-\x89\x87" -"\x15\xb5\xbb\x1c[\xd9X/0\xb\xcd\x42\x9e\xf7H\x8e~\\\xac\xea\xed\x9\xc0\xa7+\xc3\xa5" -"\xe6JVm\xaf\xe6\x65zU\x1bX\xd0\xde\xa9\x98H\"\xa3\xac\x8c\xec\xf8x\xfa{\xfc\xc6\x84" -"\xab\x34h\xc2\xedSZ\x8e\x13\xb\x46\xd3\x1d\xbe\xa0rp\xe4\xfd\xa1/p\xabh\x8c\xf5\xc8" -"\x82\x64\xf2\xb2g\xe6~\x82\x64\x8f\xb0\xb7\xfc\xeb\x32\xd3\x37\xc2\xef\x7fv\x90N" -"_\x98\x96\xa9\x45SC'\x9c\x93\x9d\x85\x16\x18,\xa5$''\x5\xcd\x2VJh\xe1\x31\xb1\x64" -"\xe2\xb1\x89\xab\x6\x30Y~\xa3=m\xee\xf0\x43&\xacT\np\xe8\xc7\xb8\xc0\x3\xdc\x13O" -"\xe9L\xf7\x62\x92|\xfc\xcc\xd8\xa2#\x1d\x9c\x42O\x82t\xd7,b?\xa5K\xc4\xe3\xaf\x38" -"[\xd2\xa0\xf1;Q\x82\xe4\xd9l\xa0\n\x94\xcc\xa7\x9c$-\xe3\xd7~4\xad\xe8_\xf5\r\x17" -"=qX\x8a\xc\x19jZ\xf3\x31\xed\xeb%\xf8\xd6\xb1Z\"g\x19\xb1\xa9\xca\x39\xe0\xd7\xda" -"\xc8\x98y*\x12Zv9\x3\x90\xd5m\xb8\xaa\xfanN\xfe~drk-d\xa0\x5\x9f\xd2N\x9eT\x0.\xea" -"P\xb5\xef}\xfa\x3[\xac\x8c\xc2\xab\x41>N\xfe^\xb\x36\x32\xf2\x39!\xb0\xc7M\x95\xe3" -"\xb7\x98\xda}\r\x13\x42o\xae\x3\xf0\x18\xf5\x64\xd7\xcdN\xb9'\x13\xcb\xbf\xd9\x5\xeb\xc8i\x96\xbbv\xe3`\x80\x1e`.&>.\xe8,M\xed;" -"yk\xc6\xad&\x3_\xbd\xd4\x8a\xccL\x1f\xee\xc4\xdc\x99\x19\x64\x1f\xe6\x88\x95he\x97" -"\x7f\"$\x90\x86\x80\xdcIon^\x18-\x93\n-\xc3\x8b\x33l\xdc\xb\xd1\xd5\xce\xec=48\xa7" -"U\no\xf1\x46\xbe\xf1\n\xa0\x1a\x8I\xf7\x15\xdaRZ\xbf\xc0\xcc\x31\xbd\xb1\x87\xe9" -"w\x82z\x8f\xd2l\xd7tWMV\xb9\x44\xd0\x94\x88\\y\xc6(\xb\x98\xc4\xdf\x88\x1a(\xc2\xab" -"\xf8iY\x7\x31\x8d\xed[8\xc2\x99\x9e!\xe9H c\xc3\xfen'\n-\xfa\xe0R\xe2\x96\x11\x95" -"\xf6\xe6mP\xc0\xeftHUb\x3\\\xf5\x65\x90\x62\xc2\xd2\xfa\x4\xa5\x99}%9\xc6\xea\x7f" -"\x9d\x37\x1a\x7f/YL\xf5\xda\x34\x64\xc3\x0\"\xed\x9\xf\xf\x37\xd3\xbf\xek\xcY\x82" -"\xfd\x14\x6U\x88\x16\xc4\xed\xe0\x82\x12`\xce\x92\x1a\xa3\xd8\xd5\x87\xf9\x65\xfc" -"{g\xbe\x99m\xf9\xcc\xe6i6cV5it\x9fz\xf\xca\xfd\xb\xb1:\x90\xb8\xb3\xa8\x86\x42\xf9" -"\xf1\xe6\x65\xff\r\x84\xc5G\xcf\x38\x30H\x93\x8et>\x1aS\x9c\x12v\xde\x42\xc8\x95" -"\x5\xd1\xc5\xe5\x91\x66\xc2-g\x91\xa7*1\x9\x88l\xc9U\x99wh\x89\xfd\xc6&K\x14\xae" -"\xfc\xd9R9w\xd9\xc8\x91\x8fXi\xf3\x98\xe3\xaeP\xb3\x8a\xb1`}U\xe5\x97\xbe\x61_\xeb" -"-\x3\xa6\x1cW\x98\x99\xe5\xd5\xae\x9c\x15G\xa4\x1bvrY\x15T\xee\"+Z\xe0l\x9c\x89@" -"\xb7\xb8\x4\x39\xda\xd4\xc9\x85\xca\xd4\xb4\xe7 \xcf^\xc0\x88>T\x9b\xed\xd0\x39L" -"\x1c*\xb6\x90\xe4\xf9%ZH\x97\x7\xef|c\xbf\x86\x7\x90mf\x82\\Qeh\x16\x41@\xcc\xd9" -"\x0(\xfb\xcb\xe8sR\x0\x7\xa4\r\xcz!vAU\xbd\x9a\x2i\xee\xb4MR\"\xf5|\xfa\\\xcb\x84" -"\x85\x93\xf5\x34\xdb\xab\x0]\x8aO\xd5\xc8\x97\xa4R\x19\x46\xd0\x15%z\xbd\"\xd4r\xb5" -"1V!s\xaa:\xcc\x93,\xeb\xfd\x17\x8\x8b\x45\xdf\x2\xe9\xd1\xde\x9ev\xc9\\/\x8d<>\xf4" -"\x11\x18\xf4\xd6\x84\xac`a\x98;\x16\x44z\xa9Jz\xde\xbe\x8f\x95\\\x1c_\x8\xc5J~TC" -"\xb8\x91\xfal\xb1!\x3\xc5\xb6\xd6}y\x88\x44\xde\x88\xfb\xf2\xd6\xb9O\x12\x34\x89" -"\xae~P\x89\x63\xe\xd3\xff\x9c\xf3I\x1fo \xa7\xaa\xb8\xab\x39^FC=\x9d\x83og\x1d\x63" -"\xd9\x89\x9V|\x82\xa4i\xc1\x16@\x17\xd4G$\xc9\x16|\x7f\x90M:O\xe2\x93/\x9ev\xa8\x84" -"h\x96[\xd3_j\xc7s#aTf\xe\xb4\"\xc2U\xd4\x8e`\x99\x64I\xa0\x18\xbb\x19$\xdd\xbHl7" -"\xa5\x95\x9coXX\x8I9\xb1\xd3!\x15\xd9\x5\xd9\x17\xa0W)\xa3\xcd\xd2J\xa6\x9c\\\xff" -"\xd4\x1f/\x80\xab\x10\xe6\xc3\xaf\x88\xcc\xba\x66\x1f\x8b\x39\x7\x11(\x9c\xed\r\xda" -"\xf\xa7\xa0\xd0\xc2x\xbb\x85\x83i\xd6\xd3|X\xd6\x1d\x38o\xc7\x8f\x65\x33q\xe5\x6" -"\x82#S\xa8k\xc7\x34\x82]\xbeW\xe4\x1a\xe6\xcf=\xa4\xd1\xf8\xd6\xc\xad\x81\x61\xed" -"\x94\xc5\xbK\x99\xabL\x88s\xed\xbaK\x1fn\xba\xe3\xafO\xfdn-\x1b\xa6\xe7\xc3?'y\xcc" -"\xae\xa3i\x16\x34\x65\xa5\x31\x93\xbbhR\xf3\x90\xe5Z\xbd\xe1hG\x81\xa9\x63\x6Z\x5" -"\xb4|\x7f\x16\xbe\x88+7\xa2\xc3\xa5&\x98T\xbb?'\x1f-\xd8\xb1\x33\xca\x8b`.\xc8\xbf" -"1U\x5<{\x9a\xf6\xc6u\x92\x42\x8e\xf8\xd4+\xa0\xc4\xd4\x65\x14\xd7H\xdd?\x87\xa4\x62" -"\xaa\xc4\xb0\xa1\x1dLM\x16$\x97\xbe\x96\x8b[#\x1d\xbc\x9a\xe7:6\x93\xe\xde\xf0\x11" -".\x10\xea\xce\xd6\xe8}\x5\x11\x92u\xa6T\xfd\xff#\xb\xc6P(\xcfN\xb5sm\xcd]\xdf`\xfc" -"yVn\xfb\x92\xfaj\x7\x62[\xa1\x1f\x42\x0lhT:`v\xb9\xf1\xc5\xf\xc9\xd4G^(6\xbc\x83" -"\xbb\xc5\x14\xe\x99\xfa\x84\x3\x65\xbb\x7\x1f+^\x12\x45\x89\x15\x10\xa4\xc2 4\xf7" -"\xb0\xc0$V\x98\xe9\xd9\x84\x42-B\x82\x0\x41(\xd3\x8f\x1\x9b\xeb\xb7\x9dJk\x9b\x98" -"Z2<\xf4\xa7\x94zjV\xe9\xfe$\x9b\\\x8f\x87\xe2p\xe5\x96\x4(`\x82\xa7#\x8d\xa7\xfa" -"\xc8\xd0\x3\xfbr\x17\xacp\xd8\xd9\xd0%\xa3'\xcao\xd9(e\xac,MQW\xf1\x32\xd2K:\xa4" -"\xad\xf4\xa3\x95\x41\xbfL\r\xaf#\xf\xe2rj\x6\x9f\x33_\xc7\xd7\xe5\xf8!\x8dX\xc\x7f" -"\xfaM\xe6\x99\xb0\xc8L5\xa5\x10\xbf~dDi\xaf\x32\xa2\x61\x64\xc8\x9\"\x9f\x91\x92" -"\xd5:\xaa\x99\x82\x8c\x7:\x9c\x82\x8eYl\x12.;\xb0R6Li]\xe6\x8c\xca\x93u\xbf\xf9\x82" -"\xe1\xa0h\x1\x7f\xb9\x39][\xba:\xd8\xea\xcb\x66\x31\x8b?\xbc\xb1qQ\xed@\xc5\x3I)" -"\x93\x43\xb7\x97\xf9\x46\xec\xb7[\xd3l{\xb8\xc3\xd4\xd8\xd9\x9e\xb1\"y\x94W\x3y\xf6" -"\x8\xd2\xb1\x65\x44}\xaa\x63\xfa\xdc\xf8\xd6\x34\"\x16\x9d\x97\xb0\xacpe\xbd\xe0" -"\xec\xdco\xcb\xbf\xbcs\x8c\x88\xe6\xe8\xa2\r\xd9S\xc9\xc0\xb4\xb8\x8e\x1@+\x8\xd6" -"K\xdf\xc3$\x5\x7\xa1\xc9=X\xbc\xd8 \xc7\xf8\x86)L\xbd\x6\x13\xe8{\xf6\xd0\xf4\xc2" -"\x9u\xab\x63\xae>\x1b|\xe1\xae_\x1\xc2\xec\xc1\x8e\x89\x33\xc5\xbb\x9bs\xe6P\xff" -"\xb7\x1d\xea\x15>\xa0\x63\x37giC\xa9y\x8e\xd5\xca@\xf7\x4\x92\x30\xdd\x9e\x8\x33" -"C\x14\x83=/)\x8eK\xd3\xd5\xfb,QVl\xc1yo,>\x1b\xb5\x62#[\x91o\xea}8ro*\x18\x91\xdc" -"\xe\xe7\x4\x31\x36\x83=\x91|\x15\xcZ\x7f\xdf\x41\xdc\x18?\xec\xc1\xdd\x6\x13\x66" -"\xb\x0\x0\xfa\xc5\x11|\xe2\xcc\xba\x18\xd1l\xdaI\xc2\x1f\x85N\xb7\x97k\xdb\xb\xa9" -"T\x1c\xa5S\x1e.<\xef\xb5\xf8w{\x98\x9f\x9f\x82^\x82\x1a\xc5\x96\x16\x34<\x9f\"\x8d" -"\xfb\x4\x99\x96\x7f\x44$$\xa4\x3\x9b\xba\xc6\x1b=p\x14\x8a\x38\xa6n\x89\x8|\xce\xf8" -"F\xd5\x83\xdc\x8ej7\xb0\x31\xe5:\x94\x3\x8bV\xb\x5\xca\x16\xee\xc3g\xa3\xb2X\xa6" -"\x96\x1f\x9aH\xc3\x8b\xb6\xdd\x98\x86\x6\x1e\xec\x86\x3\x9f\xe5\xf8\xf7\xa8\xaf\xa9" -"7\xf2\x13w\xc\xc0\x62\x9d\x61\xc7\xb0#\xf0\xf9\xb1?\xf4%\xa0\xb2\xdc\xe1\xfen\xb7" -"rK\x0\x1a\xa4\xc1\x87\x93H\xdf\xca\xd1\xc5\xc9\x35SD\xa6\x9e\x98\xd6q\xed\x81\xc4" -"!MtT\xd5\x7f\x36p\xa1\x14\xf6\x97\x38\xc\xfdz\xedo8g\x92\"\x43Mt\xa5\x93\x10\xfc" -"\x99H\xf3\x15\xf\x80\x8\x96\x1a!\x9e\xfi\xe4\xa4\x10\xf0\x13\x64)\xac\x97\xe\xa1" -"\x94\xed\xac\xcf\xe5X0\xa7lk$\xac\x44\xb3+L\xcb\xa0\x1#\xf8@I\xb8Y9\x10\xc7\x14n" -"\xa1z\xac\xe0\x85\x9e\x8f\xff^\xe1s-6B\xcb\x35\x9d\x41\x91\x97\xf7\xdc\x1f\xf7I\xd4" -"i\xf8\xe8\x8a\xeb\xbe\xab\xb9_W9z1\xc9\xfa#N\xf8\xfa\xac_\xee\xa2w\xb7\x8a|\x6\x13" -"\xf1\x84\x45\x8b\xe7#_z\xfe\xd6\xd8\x82L\x1e\x84\xe3\xd1\xda\x9a\xed\xc6\x1d\xe2" -"'+\xf7\xa6\x33\xd6\xa3\x3\xe7w\x12\x34\xb6\x83r\xb4U\x3l\xb1W/ j\xad\xf9}N=\xb7\xc8" -"H\xf5(\xb5\x83\xbaY\xd9\xf7\xc3$b\x93\xeb\xfb\xef\x15\x9\xfe[\xe5\x41\xd9s\x81L\xac\x45\x86mk" -"\xc3&X?\xf4R\xb\xab\xa7\xd1\x7{\xd0\xd9\x1b\x95\xby\xf7\xab\xd9\x8a\xbd\\\xfat\x94" -"\x11\x65\x1d\xcf\x62p\xfb\x9dK%\xa9\xe3\x43\xf1\x33\xb4\xd7\x87\x95j!\xf4\x37**\x13" -"\xb6\xc1\xa6\x11\xb1\x8d\xc5\xb6\x19J}\x94\xf6\xc0G\xd4\xd5\x4peCR\x9cU\x19\x62\x8a" -"fF\xa2\x9a\x9f u\xea\xe8_8\xc2\xcb\xaf\x98\xf5\xd5\x96\xfd\x32p\xce>\xb0\xf\x61H" -"\xde\x89\xa8G\xdfYu\xda\xfe\xe9L\xfa\x33\x1c\xfb\x0`\x12\x8\xc\xc5\x32~\xd0\xb2\x17" -"\xd4\"\xdfv+\xbf\xdc\x66\xd1\xa3&\x7\xe0\x30\x1e\xcf\x7f\xc7q\xc7\x18\x44\x3\xed" -"\x1a\x6\xea$\xe9\x8c\x6\x45k\x82\x9d\xffxhs\xc8\xd9\xeb\xd1y\xb3K\xd0\xcf\xb9\x1b" -"r\x9b\x93\xb\x8b\x1v\x85\xf2Y^\xc9\x8dq=p\xf\x44\xf3\x88\x1f\x8a\xf8\x5\x8d\xf6\xe3" -"\xb0\xfb\xbe\xf0\xa0q9mfY\x84@\xaa\x83\xa1\x61\x8e'\x80\n\x99;vJ\x8r\x5\x89\xc9t" -"u\xcfP\x7f\xfb\x8e{\x9e\xc5\x92\xf0\x1f\x97i\xb9\x9fT|\xe6\xf1+fQ\xed\xc7\xc3\xe" -")^\xbb\x83\xdf\x9c\x9\xe2Nq\xf3\xe9\xd3\xc3h\xf9-{\x0\x81\x88\xac\xda\xc2\xba\x61" -"y\x8\xfL\x1f\x87}\xb2=\xa7\xe9>Sm\x83\x96\xc3\xfb\xfe\xf9\x43\x1c\x81\x45\xe7\xe8" -"\xb9\x80s\xb6\xbd\xdf\"\xa6\n\x1b\x95p\xb2\x1f\xfa\x32\x9c\x11\x17\xba\x80\x3\xf8" -"\x9ck\xdb\x3\xb7\x1c\"\xc9P\x94p\x1a\xf5\xa3\xca\x1\xe6\x9d?xe\xbc/\xe1\xae!0\x99" -"\x85jaC2\xfb[\x2\x43\xca:\xc8\x16\xce\xef\xb4\x2\x9a\x46\x3=\x9dG\xbe\x96\xc1@B\x19" -"\x7\xc1\xf0\x13\xb4\x89l\x92{\xe7}\xec\xb9\x8bW\xf1\x46\x1a\xa5\x92T6(\xc8<`I\xf6" -"\x1f\xaa)\xc4\xa5\xe\xee\xb8\xfc\x42,(f\xae\xc2\x32\xaf\x44\x14\x4\xf2\x36\xd4\xb5" -"\xc7\xf0^\xd1x\x1dY\xda:\xa3\x45pLI\xe3\x81p\x86\x8e\xa3\xf7\xc2\x9cK\x98\xd5\xc6" -"C\x96h\xcck[\xfb\x9]\x84\xad\xe1\xb4\xc4;\xff ^exR\x19}\x89\xd9\xcc\xf5&\x8e\xcc" -"\xe2\x8f\xf0\x96\x14\xb6W6>\xe7\xc3\xe7\x2\x43\x81\xc7\xc5\xa1\xc1\xbbZ\xc6l\xfd" -"\xa3\xd3\xdc\xdfVh\xa2\x82H\x3\xb3\xa3\x94\xb6\x1c\x9c<\x89o\x9Y:\xce\x45\xca\xb6" -"\x97\x64\x41\xd7'j gx\x1b\x18Q\x4\x8\xdf]\x9\x61^\"T\x7\x5\xe\xc9\n\x7l\x10\xd0\xae" -"6\xd3M\x16\xe1\xaa\x3\x1d\xf7\x31Pe\x1d\xcfN\xf7\xc4\x9a\x39\xc:\x6\x83\x97\xdf\x87" -"\x11\xea\x9b\x1c\xad\xbcIj)p\xb4g`4\xb6\x12\x39s`\x99\xcc.p\xdf\x8c\x64\x6\xcb\x1d" -"W3\xc\x39L\xcc\xf1\xc4\x85\xd2\x35\x13\xb3\xfb\xe4N\xb0\xe4\xa1\xbd\x9b\x13X=\x17" -"\xfc\xc5T\r\xc0I\xfcn#8\xf8\xfb\xc1%\xfe\xf3o\x1b\xe2=\x9a\xd3\x88^\xc3\x31\xd2\x41" -"(Sf\xb4\xa4.\xdd\x8\xb2\x97\xc1\x15\x8c\x9e\x65\xd7#^\xac\x13\x8f\x5\xba\x97\xd7" -"\xf9[\xba\x37\x5z\x9\x41,?\x91\x91,H\\];\xednP~;|fx8U\xed\xe3kU\xa0z\x16\xda\xe\x61" -",\xea\x93<\x6%\x14,3]\xfb;\x9d\x89\x42I\x8e\x8f\xab\x15\x94Q\xc4\xc1\"\x98\xab/Y" -"l\xaa\x5\xbf\x8e\xba\xf4'\xb5>5\xd6\xba>\xa6\x30\x80\x66>-\xb7[\x11g\xca\x92]zK\x5" -"\xd1\x9dqr,8\x8a\xaaNV\x90\xc1\x9c\x36T\x6\xe4\x35m{w\xef\xd9\xe6VD\x98\x44\xfd\x64" -"|\xd1\x96\xf9\xf1Y \x9d\xb5\xaf\xd8\x9f\x66Lj\x1f\xf6\x1f\xaf\xd6\xb7N\xb \xf6\x89" -"\x93R\x87\xac\x96\x1b\x83\x1b\x32\xfb\xe4\xc1\x9d\xbf\xe2\xb3\xdf\xdfN\xd4u\xc6\r" -"w\xc3@\xc6w\x87\x3\x61\x84|?U}-\x8f\x87\xd5\xe8L\xfc\x8e\x1e\xec\x98\xa8\x81P\xe5" -"\xb1\x62\x15\x3\x19\x1d\xf9\x89\xd4\x8d\xc3\x5\x2\xdc\xfe\xe2\xf1-V{\r;\x1f\xa4\x19" -"\x98\xd5\xfc\x9d\xc\x1d\x1f\x83\xf8V\x3\x38\xbb\x10\xe#2\xb0&\xa3\xcd\x1c%\x1fU\xac" -"\x8e\x42\x61\xbd\x9b\xba\xbfv\xa0p@\x2\x39gl\x1au\xb\x34J\x8ch\xff\x46\x8d\xa0\x3" -"\x15\xbc#\x1e\xad\xb2\xde\x89\x99\xcc\x66\xb\xa3\x3\xa8\x61G\x14\x66g\xe3,\x96J\xf6" -"J!m5\xb8\xaa\xe3s0\x8cu\x2HW\xc1\x1f\xba\xa5W\xd9x\x13\xf\x42r\xc9\x92\xbb\xe5\xff" -"[7\xbf\x18\x93\xba\x93lj]\xac\xb1\xfev\xb1\xae\x1\x11w\x16\x33\x80\xb\x9f\xdd\x8d" -"\xf2\x8b\x86\xef\x38\xf5\xbf\x6\xf7=\x9u\xaf\xcam\xae\xd4\xb4p\xd5\xd4NRx\xe\x2\xed" -"\xeb\xaa\x8e\xc0rL\x92\xb3O\xfb\x62s\xefOT_\x11WS\x7\xa5o\xf2\xa3\xb4\x88\x3@PQm" -"9k[\xd8k\x3KN\x81X\xc9\xc5\xed\x8d\xdfg\n\xf2\xce\x38\x8d.\x1eg\xb5\xbe\x11\xd8\x41" -"\xc0\xe6\x94\xe5\x34\x9e@\xe7\xa3\xb5\x34\xd9\xd6Y\x8dp\xef\x19\x1d;\xd9\x5\x85\xc0" -"\xab/Z\xcey\xcb\x6\xb4\x9b\x45\xf7\xc7m\xffu\xa8;(7O\xa4\x64\xb9\xf2\x9dPy\x8\xba" -"\xd0\xa7\xcf\xea\xa9\x13\x8\xeiE6\x15\x65\\\\\x8f-H\x9cv\xf7l\x80\x12i\xecG\xe5\x33" -";X\x8aJo\xa6\xd1>\x3\x9fR\xa0\x95!\xa7\x90\xd2g\xa9\xd2:\x16\xd6\xd8\x1b\xdcN\x6" -"\x6\xec\xfc\x66\x87\xf0\xbe\x8d\x9\xa2\x90\xad\xe3\xe7\xf0\xa7\xf2<\x9e\x36\xac\x1e" -"\xe1&\xe2\x18M\xa7\xf2\x92\x36\x8a\x8e\x87\xc3l\xb9\xbj5\xe3HQ\xf1^0.\xe3.\x8f\xb" -"M\x16\x33@\xa1z\x11~%\x14\x33\xff\x95p\xba\x8dq\x92\x35\x93yc\xbbM.4\xc5(b\xe4\x4" -"<\xf2\xc2\"\xdd\xcb\x85\xd1N\xe3\xab{\xb9\x66\x2S\xbf\x6!!\xdc\x65\x33J\xe2\xe2\x39" -"\xda*[\x6JU\xfc,\xe6\x34\x3\xc6\xaf\x32\x66\x1c\x33R~\x83\x97\xb3\xa3\xe9'\x97\xf0" -"TpWj\xe3\x15\xc5Q%\xbb\xb4\x37\x81(\x0\x1d\xcd\x64\x9c\xf8Y9c\"O\xc4R\xae\x8a\x84" -"\xac\xbe\xe6\xb0\x46+K\xa5\xe6\xba\xb2\xfd]\x9b\xbe\xc7Tqk\xfc\xc5t\xdf\x34\x0r0\xde" -"\xderL\xd0T\x90|$\xb7\x4\xda\x1d\xc5\x84\xbf\xd2\x88\xbd\xb4\x1aNe:\x0`b\xc1t\xbf" -"m\x4\xe4\xb5\x8c\x9fG{\x16\x35\x43\x65\x18\x97\xd2\xf\xe0\x90\xf7U\x99\xab\xc1\x83" -"\x98&\xaa\xec\x7f\xee'\x16%\xab\x8\x6-\x18&\xad\xbd\xfc\x89\x66\xd9^F\x19\x11\x84" -"G\xca\xb0\xfb%\xef\xff\xde\xb7\x30\xb6\xe\x1\xb3\xce\x33\xad#\x8cV\\+E~d\x88\xf3" -"\xea\x5\xc0H!\xd4\xc7qP-P\x7{\xe9\xaa\x16\x90KW\x97*4\x18\xcbV\xfa\x42 \xcdS\xbd" -"\xaa%\xbb\xb2\n\xe6kj\xd4\xfc\xfe\xd0\xf5\nV>w\xf9\xf4\\\xca\xbd\x87>\xd3P\r\xb6" -"\x9a\x15\x7\xd2\x1cZba\xe1s~\xbd\xe5\xdd\xd7\x2\x9aU%\x10\xdc\\\xf4\xa4>\x18\n\x61" -"&\xaf\x5\x8b\xac\xd0\xb7\x99{n\x89\xa1\xefN\x94\x9\xf6\xaa\xcbr\xe0O\r\x4\x94\x30" -"k\xb7\x31\x6\xb4\x9f\xc6\x8b\x89\xb4[,\x97Z\x84\x2\x7,r\x8c\x66]\xf4mE\xe1\xfe\x33" -"\xe5\xf1\xe9g\x88\xc9\x95\x8\xc9\x35m\x81\x31\x4g\x2\xfd\x80\\\xc9\xaf%]o-\xd0\xb2" -"\x19\x9a{@j\n\xeb,=\xda\xb2Y\xea$[t\xc8i\x1a\x87\xad\xe3\xa5\xafUzQ\x1\x63\x36\xfb" -"\xef\xe1\xbd\x9e\x91\x91U\x99y\x90'\x91\x16H\x87\rte\xe7=\xe1p\xd3\x6\xe0\x85\x7f" -"[\x15\x34\xa3PG5\xe2\xe8\xe\xb8\x9fG\x82$;|\xfe\xd7Y\x3\xce\x13I\x7fU\x16\xc9\x84" -"\xcc\xcb\x9a*w\xb0\xcc\x83\xb4\x8d\x83\xe3\xb1Js\xce\x8x\xffW\x19\x30\xe6\x44\xab" -"L\xfa\xbcT\x13\xf3M>\xb1\xcb@\xca\n\x34\x8b\x9b\xcd\xe3\x95 \xa5@\xf1\x39g\xfc\xdd" -"\x9aV{#l\xceQ2\xf6#\xddx7\x1\xea\xe1\xc8-\xce\xee\xa7)\x13\x38\xde\x32\xe9\xca\xe7" -"s\xed\xa4\x85\xdd\xb7\xc7N\xdb\x14\xcb-j\x17\xaf\xdf\xec\xb0Q\xb2\xb2\xa8\x66\x34" -"H\xba\xbb\xae\xddT\x84\xef\x65Jf\x1d\xe0@C\x84\xcbpp\x7fO\xf3\xeb\xbc\xcc\x85h\xba" -"4B|\xff\xc1va\x95\x88\x94\xa7\x10\xde\x89\x41\nm\x85\xf6\xdc\x83\x61V\xc1\xe5\xa2" -"\xa2\xe7\xea<\xc7\xaeg\xeb\xf3\x9b\xb0\x9bs\xdd\xa5?D\xb6\x90W\x4\xcf\xc9\xac\xd4" -"\xe0\xc3o\xff;*\x90\x34\x39\xd2\xc6W\xfav\xd2\xac\xf\xeJ6H\x8b\x90]o c\"\xf6L\x9a" -"\xc5\xe4\x3<\xd4\xb3\xc1\x62k\xaaqo\xba\x7\x7\x14:x\x88*3\xac[AZ\xcd,\xed\x7$\xb8" -"%KS[\xd2\x18'j]\xf\xa4\xeaq\xe8\x11@\x83\xe2\x15\xcf\x86\x0\x8c\x90\xa2\xc8\xd9?" -"\x17i\xb9\x16\x0\x62\xad\xd4\xd1\xa3\x10\xeb'\x1e(\xe2\xb9\x7\xf0\x15hq\xfc\x82;" -"\xc6\xe\x12)\xb\xe1\x88\xc4H\xb5\xe9\xc2\xb2\x7h \xdd\x32\x1c\xd9m\\q_\xf\x1b\xb6" -"\xff\xf3\xfb\x33~6Y\xbe\x98\xee\x64\x34;G\x9c\x7f\xdd\x97t\xf0\x81t\xe4y>\xa5$\x1" -"\x5\xec\xcc\xbc>\x1d$\xb6\xf4\xbf\xe1\xae\x85Ys\x12\x35gv\xb4Rj\xe6Ozq\xad\x7f\x87" -"\xbe\x80\xc0\xd4=P`\xb7;g\x9\xc\x44\x1a\xb1\xd0\xbdu\x88\xab{\x18\x10\x32\xdd\x33" -"\xce&\xce\xef\xb0\xd8\xb6\x30\x92@f\x9\x9b\xb2\x62\x7T{\xc6\x1b\xft\xfdsO\x96g,j" -"\x93\x6l] \xe0@\x97\x1d~\xd4\x61\x38\x9a\xff\xd9\xfc\x34\x32\x44\x91\xf1\xd3o\x14" -"\x84\x6\x8e\xb1\xec \xb2\x12\xfa\xcc\xd2U/\xd7\xdc\x45\x8e+$\xf8\x9c\x15\xdf\xb0" -"\xa1\xee\xc(\xad\xb4\xaeI\xe4\xa8 \xdf\xb1\xbb\x0\x9b\xa8P\xa0\x96\x7f+~=\xe2\xf7" -"\xda\x6\x88X\x6\n\x19\x87\xed\xe2\xf4\xea\xe7^\\W\x92U\xe2\"\x9d\xaa~&\xb2\x3(\xf6" -"P{\x1b@\xde\x30\xa8\xe1\xe6\x14\xa5\xd3zs\\e#\xfe\xc8\x64\xa6W\x14\x1b=?\x95\x9c" -"\xca\x62X?\xe9;}bxe?\xaerm\xb3\x17?*XH\x86\x12\xd2\xf1\x38\n\x95\x14*\x4]\x19\x95" -"\x9b\x80\xa6\x2\x61!\x96\x16\xee\x89\x0R\xe8\x13#)\x9b\xf7\xa4\x3\xfe*\xa0\xc1y\xed" -"\xac\xad\x1e\xb4\xc6\xa4\xb9\x12\xf8~\xfaW\xc6\xd4\r[\xfe*\xbeh&,\xbc\xd2\x96he\xb6" -"\xffV\x4\xb0\xb5;\xff\xb7Od\xc8\x62\xa3\xce\xfdk\x9c*\x7f\xb9)@\xc2\x9d\x37\xcd\xc4" -"{\xedy\x89\xdc\xeeG\x1a\x18* \xfd\x32\x2\xf3\xb1\x65#\xe9\x63X\x9a\xb\x45\x12[\xbc" -"\xebUm\\Y\x8f\x88\xd0\xe0\xce\x9c\xedV5\x16Z\x99}\r\xc8\x33\xf2\x97ZU\x81\x89\xc4" -"9\xb0\\L\xca\x64-Y\xf8\x1e*\x89\x34~qv4\xa9\xbd\x9fUnU\xb1\xb5\xde\xab\x9b\x2\x62" -"\x85\x89\x8c\x0\xb2\x1a\x7f\xa6-:\x86\x19`\x8b:\x18\xfb\x83\xd1\xd0k\xea;\x9c?\x9d" -"<\x1\x82\x37\x9d&4\xff\xcc\x11\xbb#@@\xd6\xcf\xc7\xe5\x88\xe9\xb0\xbe(V\xfb\xc1\xa6" -"\xa8\x91Q0a\xd3\xce\xf7\x8d\xb4*\x92\xb6\xb4\x12\x9c(\x5\x7f\xff=\x15O\xce\x8a\xb4" -"\xf4u\x1f\xd0\xf9\xc0R=\xbb_\xb1\x30K\xdf\xbe\xe7qY\xac\xd9IHcn\xb3\x91%M\xf6_\xd3" -"{\x11\xe5O\xfb\xb2:\x8e\x8b\xdb>\xad\x80\xed\xb7\xf2\xef[\xf5\x2@\x93\xd1\x98Y\x99" -"\xd7&\x0\xbc\xf7\xf3\xce\xe8\xd5&&\xf\x4\x8aJ\xdcpU\nW\x99\r\xbd\x13[\xee\xa9\xba" -"\xf6\xc6\xc6\x80\x43^\x8f\xc6\xa7jy\x1e\xec/\xc5\xee\xfd\x65\xf8\x63\xe7\x44\xa7" -"\x7\xda\xc1\xee\x8d\xe7\x85Q\xf4;%\xf2\x64\x65q\r\x19\xd4\x8eh\x11\xaf\xc7^\xd5\xe4" -"S\x16\xd4\x14\x7I4\xc8\x99\xbd\xae\x65\x88\xd9\xfa\xa2\xa4\xf4l\xbf\xb3]I\xfa%n\xe" -"\x3\xff\xd3\xa3z\x1dO\x89\xc3hj\xa1\xaa\x5\x96\x0\xde\n\x8e\x80\xb\xd2\x6\xad\x16" -"p\xe1\xf`\xe6\x1fO\xc7\xeb\xea\xa6;\x87\x1b\xc0\xb4,\x80\xc#1\xbc\n]\x11\x9d\x82" -"U_W\xde+M`\xcb\x34\xd5\xb4\x18\xc4\x9a\x32\xc2<-)\x90\x9b\xda\xb9W\x2\x1bi\xe7\xd1" -"\xe2\x83\xceZ\x9f\x38\x62 \xa1\xff\xe3\xe7\xfbg\x6s}b5W|\xdf\x9c}f}\xc\x5(7\xc8[" -"6x\x8b]_\xa3\xbd\xb9Rj\x19\xfb\xd5\x87\x0\x9ax\n\xee\x45N\x9e\xe9\xaeV`1\xdc\xaf" -"%\xba\xc4\xef\x11Z\xb6\x11i\x8a\x44\x81~\xe9\xba\x61\x46\x66\x30\xfcx\x9fn\xcG\xea" -"\r\x85\x43\x34\x98i\x3\xae(\xc9$\xe0.\xb0\xcf\xd9\x84\r\xec\x82\xdb\xaeu \xe4QS\xe5" -"wQ\xf9\xfb\xdcn\xf9T\x9ft2\x1d\xc8\xeb|\xa9\x93Q\x7\x96\x17g\xc5\x8c\xa5`P(\xc5\xc5" -"\x3\x15\xd8\x37\x85%O\x9f(Z\xa9<\x19 \xc6\xed\xe9\xc8l\x82 -\x94\xfby\xad\x99m\xe6" -"\xf4\xc8\xb6[t\x13\xcd\xa6\xb\xa4\x9\x7\x63\x9\x7r\xe9kA}\xfe\x33\x1d\x7f\xb4\x44" -"\x7f,\x9\x88\x97\xer\x9^\x14O\xf9\x2\x46\x10\xad\x80\x9b\xbcT\x1f%\x1b+\x98\x1c\xdb" -"\xcbo\xc6\xd5\xda\xd0\x89\xc8\xe8\x34AhFz\"\xae\xc3\x86\x44_P^\x2/\xc8\xf8$\x8f\x62\x82" -"[b%\xf3[\x1d\xdb\x3M\x1e\xac\x19\xe5\xae(\xbe\x81ko\xe8\xe9\x42\x84\x80m\x84\x1b" -"\xd7\x87\x45s\x9c\xd6\x32\xde\x8aT]\xccwT\xb2\x4+?\x1f\x39\xd1\xfdr\xb9\x2\x8a/s" -"\x85\xfa\xfb\xb3\x64\xc1}\xa1~\x8b\x8fj#\xcc\x1cY\xe7X\xa6\xfe\xe4\xe5\x86\x13{(" -"Z\x8cq\x4\x14K8\xe3I\xf0\xe&Il\xc8\xc3G\r\xde=}\xc7\xa4\x9b\xbc\xd0\xbf\xe2\x37\x83" -"\x0!\xab.l\xbd:\xacY\xd1\x8f%\xb6\xad\xb3)\x8bx\x83\xe0\xda%U\x93\x31\xb1\xc5\xa1" -"\x9b#\x2\x41\xaa\xd2\xde\xc0\xff\x45R\xe9~\xd4?_q#)\xcf\xc7\xf3\xbe\x8ck7\x12V9\xb3" -"\x87\xf4-\x85T\xe3\x33\x32\xcc\x41[,}\x82\xa1\x80\x37\xd2\xd6\xb\xc9\xbb\xe9\x36" -"\x89\x9d@\xe7\n\xca\x10@|f\xc8]\x96\x38 \xa4\xa4\x1d>\xf8\x37\xa4\x44\x66\xbc\x16" -"\xec\x17\x98\x9c\x10\xbd\x8bpo\xcd)H_W\x98\x1e\xa5%~\xc7\xe3\xcc\x95\xb7,.\xfa\xdb" -"\xf7\xe3\x8c\xea\x9\x66\x9b\xec\xbev\xd0\xd9\xa6\x9d\x44\xe\xea\xd1X5\xd2\x1d\x45" -"[\xd7G\x8@V\xc6\xbcg\x9\x2rb\x85\x17\x7f\x16)\xab\xf2\x8f\xfcw \x9bY\xb0\x39\xf2" -"\xb5\x34\x80\xe0\x9e\xf0\x30V\x6\xf9\xce{\xbf\x0\xd9\xc0R\x7f\x95v\xc9j\x9eo\x9b" -"\xdeX\x8e\x63,\xa3\x38\xfb\x91\x88\x9d#\x12\x8d\x97\x64\xd5\xa0\xf0\xb2\xe3;\x16" -"k\xdf~p\x9f\xc8\xe7\x9f\x62\xff\x33t\xb5\x83\xdaN\x8f\x45\x10(\x17=\x8c\x38v\xf5" -"Z\xe4\xfc\x8fg\xaf\xe0\xcaL\x17\x81\xdb\x13\xbeX\x89\x1cq\xed\xc9\n\xb1'q.\x80\xe9" -"||\x0\x2s\x7f,\xbdz|:\xd3R7\xc3\x91\xf3H(xc\x89\xd6\xcdYAY`\xf4\xc6\xffwQ\x90%u\xe2" -"\xc4\xf7\\\xe\xa5NX2\xa6\x31/\xea\x90 KM7,\xa1qo\xfb\xc8\x33!\xd6\x5v\x14\xe8\xfd" -"\xed\xe1\xae\xa5'\xce \x17\x9do\xab\"\xcd}[\x12\xbc\xae\xcd\x30\xcf\x34$\x85\x43" -"<4\xde+n\x7f\x3I\nP\x11\x87\x7\x8a\xb9\x0\x62lt\xc9\xfaLK\xa7\xb9\xa0\r\xe5\x15\xe5" -"Rn\xb\xaf\xb5v\xa4t~k\xa2\xa0\x96\xc3\xa5\x83\xe2\xf9\xba\xb0H\xf9V\xe3t<\x17\xc0" -"\xd2_\x1a\xa6\x13T\x16\x82\xed\xcfP\xdd\x10*\xaag\xd8\xbcV)?\xebI5NSJP\x83\xc7\xc3" -"z\x8b\n\x8q\x1f\xf7\xdbk\x0\x8f\x12\xec\xa7u.\x4w\xcc\xb1\x6\xa7\xeb>\"w\x9a/\xf2" -"\xda\xb3\xdd\xe3\x8d\xfc\xdf\xd3\xba\xbf\xfc*\xc0<[\x8e\x1d\xef\x18\xfe\xa3h20\xf" -"T\xd6M\x1a\xb9\xe4\xd9\xd2P\xfb\xc7\x35q\xdc\x96%\x18\xb4x\xb\xc9\xf7\n\xa4\x33\x90" -"r\x8a\xa9\xa0j\xd6^\xb0\xdd\x1eykyp\xf6y\x8c\xca\x98\x9\x99\xc6h\n\xb4%\xb1\xdc\xac" -"\xd4.s\x9f\x7f\x9ex\xaf\xbdNJ\xe4l\x13\xf8\xe4\x11\x17\x93r(R\x5z\xe1\xbdT}\xa5\xb6" -"\xa0=\xa2\xd4\x12\xe8\xa6\xa1\xb|\xfe \xd2\x33\x45WTz-[\xa1yI\xb8\x41\xd1\xbe\xf5" -"\xd6Y.\xe2!\x18N\x7f\xcdy\xaa\x8c\xa5\x17\x8dr\xe1\x2]\xe\x9\xf1\xaa&\x8c\xce\x62" -"\xadS\xe9~\xb8\xbc\xa0\x90tb)\xbe\xc\x66\n\xd3\xc5\xa4W\x8\xc3\xfa\xa2{1\xd5p\xf1" -"DTbW\xb5\x8f~r\xf6\x9as[\x94I\x81\x31\xd9\xfc\x41\xe7JR\x9f\x8a\x43m=n\xb8Ht\xe0" -"Y_\xf7\x99_\xd4\xea\x66j\xc4\xb\xdd\x6]o\x1f\xb2\xc2\xe0\x9a\x36~j\x91\xef\xf7\xc6" -"\x14\xe4\xbb\x4\xe\x89J(+V\xe0|t\xb5\xec\xdc\xb8\x38@\x81\xa7\xbc\x32\x14\x7f\x86" -"x/J\xc8\xc6\x8eGO11\x15\xf\x31" -"\xd8%}\xaeh\xda\xf7\x88\x80\xc9V\x93zb\xd0\xba\xec\x88\x37J\x96\x8b\xf0\xb4J\xd7" -"racn\x85\xe9p_}s\x8b/\x0@\\\x97\xafp\"\xb3\xcfY\xa9-\x92&\xfcY\xa9K\xaf\x14\x42\x9f" -"\xe7\x11\x8c`R\xdd\x12\xc8\x9e\xcaP\xc4\xfb\x34\xbf\x34HJT\xdf\xb\x66\x1\xf1h\xe8" -"\xc1\xf2\x9\x19\xed\x1d\xa0v\x98<\x18\xael\xc\xa1\x7\xee\x46\xd5\xc2\xf7qY*\xdf\xaf" -"\x9cN\xd4\xeb\x64L\xb2\r\x33j\xe6\xe8\xbc\xc7\xf1\xc\xbf\x9c\x1f\xca\x8f\x99\x8d" -"\x7\x83\x91\x1f\x46\xc4\xd5L\xfdP\xe9V\x1d\xe6s\x9f\x13\xad\xf0\xd9\xda\xea{3\xfd" -"\xc7\xec\xc\xc8\x11\xbcJi\xe9\xf8|\xba<\x8f\x97\xae\x8d\xc8\x14\x63\xb6\xc\xbd&r" -"\xdb \x95n\x8f\xb2\xc9\xd5\x0\xae\x62O\xb0\x19\xc6\xee\xe0vrf\xc7\xd0\xa1\x8a\x99" -"9\xb1Y\xe3\xedJ\x3\xe0TpH\xc8\xb3\xa5\xccq\x83\xec\xeeZ\x81\xa0\xa8\x62\xcb\xf1}" -"\xe0U*\xda>\x14\xbc\xf7\x46\xfb\xd2\xb4\xcc\xd0\x9f\xbd|\x4\xc2]1|\xe7\x1c\xab\x43" -"\x9f\x9c\x66\xcc\xa9J\xeb\x14.\xdaM\xe2\xdbV-\x87\x85\xc7\xf1\xb1\xd1\xb1X\x9c\\" -"t\n/\x1d\xae\x38\x62\xceo\xc4\xc5\x66K\xfbX\x9f\xaf\x16\x30\x8aVr\xc3|\xd8\x12\xec" -"\xa0\x34\x8f\xe\xff\x8a\xf0\xe3\xea\xac\x99`sp\x85\x90\x84&\xf9\x38\xe3\xcf\xc5J" -"F\xf4nC%C\xc2\xb5\x34\xff\x41\x90\xee\x11tk\x12\xc3\xd5\xeb\xbf\xd4\x9a\xaeW2\x10" -"\x89n\xc9Uo?\x88\xb8\x9\xc2\x15\n\x41o\\\xf0\xdc[\x6\x98I\xd4\xc6\x38\x83]\xcd\xa1" -"\xd8\x94\x84\x92\x9aG\x8b\x98\x1a\xd0\xa9\xdc\xfd^\xcdm\xd5H(\xc4LN\xac\"v\x2\xb4" -"\xaf\xa0O4\x95\xf4\x16G\x97\xa9O\xda\x64\x9eS\xcty\xdcv\xac\xdb\xb2>\xcb\xa6\x3\xce" -"eO\x93\x38k\x81h-\xea\x1f\x1cG\x98\x30\xc5I\xd5\xfaH\xa4\x17\x8b\x80\xba\xbf\x61" -"\xf7\x80\xd2\x94\x7f*\xff.\xaey\xa8\xcb\xf8:\xf3.?+A\xdbm\x9cPf\xc1\xb2U5\xa9\x17" -"\xd9\x30\xa2O\xe\xba\x6\\\xa3Z\xf9\x42+Q\x9d\xebz\xa3\x80\xfe\xc8\xf4\x17S8I\xb4" -"S\xa0\x84\x45\xe8\x9c\xef\xe1\xdf\xb5\x1d&\xbc.\xf7(S8Z\x99\x1f\x31\x8b\xc6\xc2\xf1" -"\xbbs\xa9/\x89-\xb7\x10\x19\xa8\x1f\x8d\x88\xc2\xf3!<\xd4/\xfd\xd4\xa2u3\xf0\x1z" -"\xaf\n\x9b\x3\x39\xab\x17&p\xa4\xe4\xb9\xb4\x1r\x0\xc7!\xea\x8d\xc0\xb{Y]\xa0\xab" -"=\xc0\x2\x46Ho\x80\x3\xaf\xd6\xcd\xb1\xc\x37\x12w&\x1d?\xe1$\x12\x3\x19sD\x19\xb7" -"U\xaf\xaf\x43q\xbd\x19\xba\xc5\xd9\x9d\n\xd5\xc7*t\xac\xed\x1d\xf8\x85\x62\x8e\x1b" -"\xfd\xb9g(\xfc\xc3\xe3\xc7\xa6~\xefz)\x85\xea]\xf8y\xa8~\x0\xe5X\xe\x35\xa4\xdf\x91" -"K\xe9\xf8\x1e\x8b~D\x8c\x83+}\x18\xbdQ `\xac\x89\x1d\xd1U\xb2\x2\x88N\xa8\xdbp\xa1" -"\x81\x84\xb7\xe8'/\xb7\x89\x90\x63\xc1_\xf7\xc;\xdc\x7f\xefi]\x96\xf8\xf9\xe\x37" -"o\xc0\xd1\x8f\xbe\x30\x7f\xca\xb0\x4\xbc\xae\xfdt\xd6\x12~\xa3\xcbq\xf1KU\x86\xf0" -"r%\xcd\x1^ZS\x2\x65\x34\x95W\xae\xa8g\xbf\xe5\x3\x37\"\xc4\x9b\xf0\x8e\xf6\\\xbc" -"p\xd5@\x1c\xaf\x8d\x1e\x6\xc9\x32-t\xaa\xd5\xe2\xf5\x91\x9d\x38\xac>\x99_\x1f=\xc1" -"[4\xea\xfbQ8\xb\xe1|DW,\xc6\xc6\xfa\x95\xa2\xcbTM\x7 i\rx\xdf\x38\xa2\x17u\xa8(\\" -"\x9bQR\xf8\xe0\n\x7\xc5\xc5\xfv<\x9aM\x5\xef\xb8y\xad\x38\xde\xbb\x8b\x83\r\x85\x99" -"\xacp^V\xf4\x82\x45\xc6\x13\xac\xc2\x63\x30\xdeJ\xd0g(\xde\xe8\xc0\xb4@\xcc\x32\xe1" -"\rt \x9~\x9a\xd9J\xa5\xe5\x92\x1\xeb\xbe\x30_\xd0}\xee\x33\x66\x39\xa7yR9\xa6\x88" -"\xb\x94SG\x97\xd1\xa0\xb7.\x2.2\x1e\x89K.:a[Q\x99\x17p\x9d\x18W" -"\xc3\x1d\x7f\x87\xa7\xa4\xdc\x46^m\xa2\xe(=`\xa9\x42\xf8\xca\x93\x99\xd9\n&\x8a," -"\x1b\xb9vX\xe1xek\xe0lq\xc0+\x82\xae\xbf\xce\xdbQ\n\x80\xa1\x85\xcc,\\\xb4S\x93\xb5" -"\x1e\x98\x6\xa8\x32 ,\xc4\xca\x81\x3\xb9H!_\x13:\x8e\xf7\xb5\x86__5!\xc1,<\xb3x\x86" -"\x94\x64\xcd\x1d\x8f\xb4\xe5\xb9\"\xf3-\x87\x81\xed\xc7)\rh\xe8+Y\x8a.\xb0\x9aU\x90" -"\xdb)8\x1e\x14\x88y\xb6]#\x1}\x82\x14\xf3\x42p\xbeG\x8atUo\x1\xf6\x9b\x80\xf\x43" -"I'mN~\xc9<,\x93\x37 \xeaj\x10\xfe\xd9\x9e\x6\x1d\xf9\xb2\x4H\x7\rU\xb1\x38H|\xcd" -"\xff>\x98^\xbf|\x8\xcc\xd2\x90[\xe7\xd2(LD\xaa)\x0\x93u\xdbH\x82L\x93\x8b\x14t:\x9" -"l$\x8eWg\xd6\x88\x1c\x64\xbe\x93ZJ\x88\xf9\xf5V&\xaa\x5\xa0\x85\xeco\x8c\xd3\xcb" -"\xb4\x91\xd2\x66\x37\xe0n\xaf\xc4\xbb\x81\xa0\x46\xd6\xb\x8d\x35 I\x8fG\x0\x5S\x1c" -"\xae\xe0vd\x8e:]\xe1\nu\xb2\x65\xf\xde\xe2\xe0\x30\xd9\x81\x34\x94\x36/)\x18]U\xb3" -"\x16\x92Z,IW\x91\xf0\xfa\xc8\xaf\x85\\\x64\x33\x0\xbc\xbd\x4\xdb\x15\x18\x17S\xbf" -"\xf8\xc8\xc0yB\x83\xbdP\x12\x16\x9b\xfb\x41\xfe\xb3\xba\x8c'\xe4\xc6t\xe7\x6\xff" -"^\xb9\xb8\x8bJX\xc5\x89\x38\xa4\xfa\xce]\x80hx\xfd\xc8Q\xcc]T\x96\xc8{U\xdd\x85@" -"\xd0\xe\x87Mjx\xccq\xe9,\xb3k\xce\x33\xc6\xf9\xa7\xf3\xb5\x6\x8fIRFd\x93\xad\x1d" -"\xc2\xd8\xcb\xcbV*'\xfe\x18\xcd\xdbz\x1eT\xbd\xeb.\xb3^\x87\xa6v\x9b\n/`!\x8a\xe6" -"\x15\xd6\xd5\xe4\x9b\xado\xa9\x85\xc2\x1e\\\xa0\x33\xfeQ\xc3(4\xf6\x9c\xc5\xfck\xa8" -"\xa9%i\xac*v]\xc6\x15\x9c\xe \x13,\xc9g\xb3qf\x1X\xb2\x8f\xc8X\x94\x39\xa1=x\xd9" -"rq\x9b\xbaG\x6\x36\x91\xcf\xea,\x8c\x82q\xa5/$HJ0w_\xc1}\xb2)F\x9bp|E\x8d\x1b\xfe" -"+\x11\xfcMS\xbc&,v\xb8\x84\xc5L3\xee,1\xfa\x9b'\xf4,\xa9\x1b\x8e\xf9L!m\xe6V\x99" -"\xe9\xfa\x3m\x0\xea\x9e\x9\xed\x36$yL\x95\x63}\x15\x96\x8a\xe3\x98Q\xb\xc7'3\xb4" -":\x3\x9a\x9e\xbe\x43\xee\x6\x95\xf2\x8d\xbe\x12\xe4\x10\xdb\x16w\xd1\xe2\x1b\x83" -"\xc\x3\x37\xaa;\x6\xa1\xe3\x0\xc\xd2\x82\x1c\xe0H\xff\xb0/\x12.q\x18\x38\r\x0}\xc5" -"X\x3\x16\xf0\x0\xfc=8\x9\xb0\x2\x5w/\x3\xda\xc6US\x9b`/\xc8k\xe1\xf1*\xe3\xf8,\xd9" -"N\xcem\xdb\x42}Z\xf7<\xc2\xac|\xab\x12\xd3O\x19\xab\x36\xf6\x99\xd2\x34\xcd\xf9\xb5" -"UD\xd4\x31\xc6~#%\xfbp~\xd9Rn\xd0T8\xad\xb9\xbc\xb3\rkw\x1\xa4\xa6\x30\xab\xb0\x91" -"_L\xfe-\x7f\xf7\xe0\xa1\x7\x99\xf5\xfb\xaf\xf0\x63\xf3\x36;2n\x1bX\x4(\x97\x14\xc8" -"\xfcx\xfa\x7f\x45\x9a\x65\x99\x1b\x96\xa3\x99\xcb\xd7\x92\xfe\x38UU\xe\x42\xac\xf" -"E\xba\x15@k\x8a\x13\x7\xd9\xadn\xadsl\xd8\xf\x2\x8\xdfH\x92\xdf\xc4\xdf\xe1i\xf8" -"Q\xb2\x8f-\xa7\xba\xccj\x1d;\x1ftI/\x8e\x7f\xd1\xc7\x99\x3\xf5Q\xa1\x89'\x8e\xe3" -"J@As\xd4\xc7\x45\x1f/\xd3\x16\xf2i\xc4\x8d\x36\xe4\x16\xf1mt{CXLAF\xb4\x16\x82\x41" -"\xf3;\x8f\x45r\x9ag\xe2\x98[\x18\xeb\xc8'\x7f\x42\xe7\xed\xfd\xe8\x8d\xa5\x38g \xd6" -"\xb3\x10\xc5\x64\r\xa8\x8b\xd8\xe4\x9cU\xbc\x1bh\x1f\x15[\xab\x9f\x9\x9e\x16\xd0" -"\x15\xb9|\x1b\xe9\x19Vc\xb3\xe4t\xe6\xd0[\x19\xfdsI \x82\xcf\"(\xb8o\xc8j-$\xef\x66" -"\x8d<\x8d\xe\xe4\xb6RI\xcc\x45\xc0Q\xd2\xc5\xde\xed\x96\x66\xe7\x1c\x3\xa5\xe7\x1e" -"\xfc\xc3\x35\x3\x80\xb2\xa2\xd6\x86P\xf9{\xee\x8f@\x1b\\\x63\x9c\x82\x64\xda\xd6" -"\xcf\xdb\xc5,\x3\x92G\xb7 \x9\x1f\xc4\xe7\xc\x62m\xcd/ \xfc\xaa\xc\x31\xf0\xa8\\" -"\x0\x1c\xe9t\x9b\xa3\xa6g\x1f\xa2g\xe3\xb5\x46\x93/\x6\x6**\x88\"\x7\x43\x1a\xb3" -"J\x7f\xde\xdc!\xcdQ\xb\xec\xe5\xcfu2\xb0\xb7\xc1\x1\xaf\xb2\x63 \xfa\xc6\x95$\x8c" -"\x80J`)p\x8c\x9a\x80\xce\x61\xc9\x9aT\x13\xco5y\xe2RO\x13\x46\xcb\xa9(\xe6\x11\x9b" -"H\x82]\xd9\xbe\xcb\x6\x9b\x9a\xcd\xd5\x88\xe1\x31\x16M\x1b\x8d\x86\x3\x83\xb6!\xe" -"\x14R'\xfe\xc0;\xc1\xfb\xe\xb2\xcd\x39\xeb\xe0\xdar\xa5\xee:\xd9!\xe7Q\xe9\x65\xc2" -"\xaau\xfdh\x9a%\x2\xb9\xfa\x31\xc6\xe5\xc2\xe4\xa5\x88m\x14\x39\xb9W\xa4I\xd7\xba" -"(\xb9\x8b.\x0\x66\x9e\xf6\xe8]\x12\xcc\xbb\x19\xb7,\x95\xd8\xdb\x86\x7\xde\x44\x89" -"\x8a\xe0\x83\xfaJ\x85\xf5\xad\x1c\xf.\xd0\xec\x9c^*TY\x17\x42.\xb3\x4\x44Wik\x12" -"\x98\xe2\x33\x8c\x96\xbb\x1bY\x15\xc\xd0;8c\xa8\xad\xef_F;\x8f\x4Xq\x91\xb8[\x5\x95" -"\x11V\x0?~}\xbb\x9b:\xca\xbe?s\xf4\xbb\xbs\x8c\x9d=P\x1\x36\x97@\xb3\xec\xeb%s\xcb" -"\xf8\xda\x93\x17\x42*\x90\x1\xbe(\x1f\x0\xb0\x99X\xe5\xf3\xdd\x87\xb4\xb8\x35\xc7" -"\xdeG.\x9b;\x2\x30\x5I\x99\x17\x9e\xe1YQ\"\x6\xda@\xa1\x18'[\x81\x88\x97J\xed\x43" -"\xde\xf9 a$\x9d>bB\x16\xecw\xe4~\xc6\x8\xb6v5T\xb8\x1\x45\x86) \x1b\xbe\xb3\xf9k" -"\x99(E\xc2\x7f\xa1\xf9\xdb\x1b\xe\xf9h\x80y\"\xe6\x95{\xe7\x81\xd4\x89\x37\xa4\x46" -"\xf7yp\nY\x9b\xfc\xcc\xd5\xf7\x4\xb7\x8\xa8\xda\x10\x0w\xcc\xe3\x83\"ge6\x8\xe0\xe4" -"\xe2\x8\xf2\x9f\xd0\xd1\x85K\xf8_\xaa\x65\x9f\x18\xe2\x9c\n\xa3;v_\n\xe5\xf8lc4\x8f" -"|p\x19m\x14;\x17}^\xd1`\xa6\x33}\x5\x1d\xd3\xe8\xae\x64\xd7\xd7\x35\x61\x10\x16\x11" -"&\xe8[\xe8)\x7\xba\xa2\x4\x35\x45\xf\xd4\xc\x18'\xcb\xdc\x3\xe1i!\xe5\xd6\xf2\xfe" -".N\xb5\x1e\xb6\xe5,h@\xcau\xbc|\x2\x11\xa5\xa6~\xf6\xbb,\x1e>\xe1\xf3\xc2\xed\x1b" -"F\x95\x8\xb7L\xff\xc9p8`9v\xc1\xbb\x8d\xb8\xdc\xd6\xe5N\xfd\xb\x10=OH\xfa&\xa1g\xb5" -"\xf6*\xc4\x12\x99\xc4H\xb9\x32\xd3\x8c\x8cJ\xf2\x93\x10KA\xeb\x13P\x9a\x8d\xef\x61" -"\xec\xe9\x1ez\xff{\xee\x44\x87\x8d'&\x98\x86(I\x9f\xee\xe\xce\x15\xc7\xa9\x2+U{6" -"}\x8d\x8\x19*\x6\xe1\xcel\xb4\x46\xdb\x9bJ\xde\x1e\r\xc4\xc4\xd2\xc7\xe7\x1a\xfe" -"\xf2\x9f\xb1\x8f\x98}\xbb\xa4\xcf 3)/\xe0\x39\xdc\xf5s\xb5\x9\x65]\x0^\x86\xe4\xa7" -"\xbd\xa3\xaa\xa8\xec\xc4Vmv%_\x8e\xa4\x66\x37\xd4}\xfb\x44@v\x9b\x32\x1e\x63\x86" -"\x2\x8f@WrJ\xd6\xd1\xac\x61QT\xa0\x87\xe\xbd\xe6\x32\x6\x63\xe8\x34I\xbb\xb5G\x7f" -"\xe8\xda\x41\xd4\xbaj\xfdY\xec\x63\xc3\xa5y\xaeW\xc\x65\xde\x1b\x8d\xad\x84\xd2\xc9" -"\x17\xe2&\xcc+qE\x90\xa5(\xa7\xb7\xf5m\xadP%\xc2\x8f\xa7\x95\xcfqt\xf4\x44\xf\xbc" -"\xd9,\xa2L\xb9\x9el\x7f\x82\xb3\x91\x7\xc6\xb1\x91;\xa5\x38\xf0\x9f\xf8\xe6\xef\xa5" -"\x9e_pQ\xf0\x16\xb7\xb2t\xfa\x38\xa1\xc8{\xe6p\xbf\xf0w\xb4Y\xe3\x91=\x15\xc\x5\x10" -"\xaa\x44\xe3JI5mv\xe3G\xb0\xf\x85\x83\xd2?\xef\x82\x1c\xcf\xb0\x37\xf8/\xaf\xf3?" -"t&:\xd3{\xcco\xd7\xb4]:(\xebL\x14\x18G\x19\xe\xc8Y\xcf\xa9\x1a].X+\xedG\xfe\xff\xb2" -"\xaf\xb7\x9d\xfd\xfd\xcc\n\xa5\xd1\x7f\xfa\xef\x9b\xc9y\xf5\xae\xe9'\x94\x1d\x30" -"\xbe\x8b\xb0\x5\xe3+\xb1h\xed\x16\x87\xd5\x30\x31-\xa1`\x8c\xc6\xa5\xcb\xb6W\xc5" -"k\xf4\xf9\x3%\xeb\x86J*\x9d\x8\xdev\xb8\x3\xdb\xbd" -"\xc3\xab\xcc\x80\xe4;\xd6Y-\xc\xd9\x1f#_b\xe2\x83qT\xf2Z1\xf2\xba\x9b\xa2\x89q\xbd" -"\x1d?+\xbc\xe1\xfb\x42L\x97R\x94z|\xd4y\xb\x1f\x39h\x8f\xf\xb7n\xc5\xb4\xf9r\xd3" -"h;\xca@(2\x16\xe5)\xde%\x0\xb7r\xe5\x12\xd6\xe5\x61\x1d\x8f@k*M\x11\xc\xc7U~\x1a" -"ECe\xda\x8e\x1d\x61\x42\x31q\x10)]Y\x8a\x85g4E\xf1\x97\x88\xb1H\xa1K\x11V\xe8\xd4" -"?\xeb\xf9\xc7=\xb5\xd7\xe6\xfc\x84\x14\xbc\xa8\x86\xb4\xa7\xafM\xf5\xe8\xba@Uo)\xad" -"\x83\xa2>\xed\xbd\xba\x6\x5x\x1\xe6\x86\x80\x93)\xb4xn\xd2\x11\x34\x8b\x82\x8a\xc7" -"Y5J\xf4z\xc\xdf}\xa7\x9dZ\xf0U]qV\x1fw\xcd\xb\xef\x82/M\xf4p\xe9/\xcc()S\xa9\xa3" -"F\x5\xd3'\xb1L~r\xe0Y\x95\xd0\xf2\x18O\x92l?\xf8Y^\xee\xc0\xe1t%\xa0\xc3\x8c\xb9" -"X\xbc\x42\xeN#\xb9\xe5\xe5\xdc\xc3\xf5r\xaeU\x95\xfe\xa6\xe3${\xc9_\x1dMo\xa1\x15" -"$\x5\xb0~\xd6L\x1d\xa1\xe9\x8\xa2\xda\xaa&\x1c{\xd4\xc0\xa0\xd7:\x8X\xd4\xe4.\x97" -"\x92Z:\xc9\xe6\xa7|\xd2@\x83\x8f\"\xbc!\xa4y\xc\xa4\x94\xad\xfb?\xf2\xb3\xe6\x46" -"K\xb9\x9b%uB\\\xe7%\xcb\xde\xca\xcf\xb6o\xb&\x1b.\xe1\xe8\xae\x17}a\x9b:s\xcc\xca" -"\xfe\xf2\x15\xdfnl\x83\rn\xc5>\xa9\x9\xa3\x9fM\xe8\xe7t\xfb\xcb\x9e\x8c\x46\x1\x8" -"\xcc\xc1\xd9(\xbdNY\xdd\xea)M:\xcd\x82\xc2\x37@4\x9fLp\xe8\x65\xf0\xa3\xc5\xc1\xe3" -"1\x99x1\x7\xe1t\xd9\xc4\x15\xf2rQ\x91\xa4\xbe\xb2\xf3\x33\x1\x41\xda\x1b\x63\xb4" -"\x2\xb2_\xc6R!\xb6YC\x17^\xfc\xd4\xf0%\xec\xa4%g\xde\x9a\x13\x9a\xc4\xf7U\xf3r#T" -"\xd2\x46\x82\xf6\x94\xb7\xca%[\xf5p\xd2\xa8<\xa9!\xef \xe8\xc7W\x15\xc3\xe7s(3\xac" -"\xd7t70\xe5\xf7Jq\x8et\x9b\xc1WgK\xef\xcc\xe4\xd5\x45:~\xd2\xc2\x2\xf2\xe6h\xbd\xae" -";}jA\x85\x13\xcd\xcc\xaa\x37\xf0\x9dz\xd8\xbf\x94\x1d\xe1M\xc5\x0&\xfd\xf\xa5\x9a" -"\r\xf\x9e\xe2\xbc{\x11U\xc5\xa5\xe\x89\xaa\x1bw\xbf\xae\xd7\x9\xde\x1d\xfe\x37q>" -"Q*\x10\xbb\x1a\x44\xb5\rof\x9w\xd3\xd9\x99,\xcc\x84\x99\x19\xcf\x17\xa4\xb5W\x11" -"\xc5\xc7\xae\xd6\x2\x41v\xd6\xe6q?\xec\x30\xa7~\xe9K\x1d\x31<\xf5\x45\xf2\x1e\xec" -"\x7\xa8\xe6\xebl\x14\x16s\x86\x80u\xc6o\x16\xed\xd7,\x84\xe3S9\xa7\xb5\xe7\x64O\xd1" -"\x94\x10\x42\x37i\xeb[FR\x83\xa5\xe4\xdc\xf2P\x13R\x19:\xe1\xc9\xd4\xa7\x98\xac\xfe" -"\xcev\x90\x94\x9a+\xa0\x33\x81g\xd8[\xf8\xabl4p\x1a\xc9\xb5\x8b\x94h\xf8@\xcc\x84" -"\x13>\xdb\xbd\xbf\xb1\x63%+\xeb\xf1\xbd?\xce\xb8\x33=H\x7K\xc1\xd2\xdd\xb4\x4P=\xce" -"m{\x19\x34\x8e\x7f\xd3\x91\xda\xfev$~\xe8\xcb\x9d\x7\x94X\xbc\x85\rHT\x19\xa9>\x3" -"X\x1c!T=\x1e\x82\xac\x8a\xaf\x41\xa1\x9bGqP\x15\"mv\x8f\xe6\x99\xf8=\x8a\x14\x42" -"\xdd-\xa1i\xc9\xff\x96\xd8\x9b\x33\xa6\xf9\xed\xd9\x42\xf5\x0\xb\x35h\xcbl,\xf4P" -"|}\xfc\x65\x81*v\x8a\xec\x13\xad\xb7L\r\x10\xfe\x14\xdc\xde\x61\xae\xacm\xbb\x9f" -"\xa3\x1d\xa4\xfb\xc2\x43Knl\x5\xa9\x9e\x33\x16\x37o\xbb\x39\xab\xce\xf3\xa8\x95\x96" -"\xb4\x95\x0\xd5\x66\xcc{\xf2\xb3\xee\x42/G\xf5\xe4\xe7\x66\xe4\xa4y\xc0\xb1\xa0\x9" -"\xdc\x38\x8cl\x1a\x9dZN@\x82\x1e\xc:\xc2\xbd\xc8\xb3\xdc\xb1\x87:\xbb\xe9\x62\x97" -"m\x10\x94m3\xe9V~\xa3\x5\xca\xc\x8a\x33\xcf\xc8\x92\xfd\"\x9c\x1b\xa0\xdf\xfa\x92" -"\x10\x84\x8\xa9\x9b\x1b\x9a=\xfTtg\xc6\xde\xde\xa1O\xa7G|!\x1e|\xc4\xdao\xf8\x12" -"\x10\x63\xd8\xbaU.\xb2\xb8'\x97\x7f\xdc\xc0\n\xcr\xfdY\xb9\x9bZP\xdf\xf1\xba\xe2" -"]U0Om\xfd{ i\xd9\x9c\xd8\xeaq=\x81\x16\xd5\xd3\xdf\xd0\x33\x92\xf7\xff\x36\xae\xa8" -"\xbc\x8\xe6x\x93X|\xd7L\xec\x9c.\x4*ljRX\xca\x8e/,I5\xa8\xd1\xf8\x1f" -"\xd2}\x12\x62\xe5\x84V\xa2\x90\xb7\xe4\xe2+2\xd7\xfct|\xd9\x62\x9t\x98\xf1\x14K\x9d" -"\xb3\xa6|\xe5%?\xe5\xb2\xe4 5\xb7K\xe4Y\xb3zh\x8d\x66\xc\x19\x65_\xccT\x84\xad#\xf" -"\xbcNM\xcd\xc3\xa4\xb1l`\x14\x61\x8a\xaey\xf6Q\xe6\xf5\x36\xd5\xe6x(\xa3\x37\xf6" -"eP\x8aP\xf0\x1cl\xd4\xbd\xe8\x99'\xf2\x65\x9b\x92\xfa\x8f\xeb\x64\x36\xf2V\x94\xc9" -"cV\xe5\x97\xb9\xbc?\x89g\xb9<\xbf\xa9:\xa9\x93\x98" -"<\xc7\xd5(\x19Rm\x8\x31\xa1\xb3\xb7r\x17u\xfbw\xfc\x3\x6)\xddMg\xd1\xe6\xe5\xea}" -"\x8bgCG,\xa4\x8f\xf\x38\xe9\x30\"\xa9\x9e\x84\x8d\x90\xd4\xfe\x8\xca\x90\xe1\xe1" -".m4\x9\xa0\xa5\xb5\xacV\xb6\xa6Y\xefQ#XMZ5\x8j;\x8c\x15i\x87\xd7\xa7X\x1)Z\x1c\xfd" -"\xa9}\x14\x13\xee`=\xa8\x9elP~8\x93\\ \x87\x85#5$\xc\xa8\xa2R\xcb;;\xbd\x1l\xbez" -"\x9a\xbf\xca\xe0\xc3\xc6\xd2}\x87\x44W\xe6\x37\xb3\xbb\xbd\x39\xae\xff\x34\xbd.[" -"\xf5\n\xd0\x15\xf4\xc2]\xe5\x2u>\xc1X\xb6_\x81]\x90\x43&\nM\xfb\x42\x85\x99\x0Q\xc5" -"\xf6\x8\x35.y\x80\xd3\xdf\xeb\x45\xfb\x16\xce%\xacp\xb7\xe1\xdd\xc5\x91\xa5\xf\x17" -"\xa7\xf7\xe6\xb9\x1c\xbd)\xb1\xee\xd7WE0>`\xach\xcb\x11\xbf\xf6V\x9e\xc9>\x91(\xbc" -"++=n\xd4\xec\x66\xd5\x80\xbb\x7\x1\x8c\xd0p~\xf9\x64\xb3\xba\xd2\xfc\xdb\xe1?\x82" -"\xd1m\xa3\xc2\xc2\xf(%s\xe7\x1flz\x10X1i'A\xcq\xb3\xc8\xee\xb0W%&E\x1e\xe5\rgH\xfc" -"\xa5MP\xa2\x17\x3%\x11LY\x85\x12`\xe8\xb3P\xe8\xe4\xf3\xe1\"\x65-\xc6\xdb?\xbcs\x88" -">\xf8@qY\x88\xab\xf6\xa5\xf\xa4\xf\xd9\x14\xc\x33\x7l\x11/\x7f\xd8\xf5sq\x8\x81\xd6" -"u\xeeOr\rS\xde\xf5\x15\x13\x32\x32\x81\n?b\x10\xc2\x8e\x37[\xff\x8a\xcb#\x15\x89" -"\x7f\x87R\x14;o\x8c\x43K\xfbpE\xc9\xd9\xbb=\xe3\xd9\xc7\"\xba\xc7\xe4XX\x11\x1a\xe" -"\xb0\xaf\x1e\xa1/m\xf0(\xe8\xeeN\x8\xfd\xfe\xe2\xfb`\xca\x65K\x5\xa7\xf8\xe\x32\x14" -"\r\x83\xca\xe2\xbaP&\xa1\x9e\xb4\x5\x94\xf5\xd2\x8d\x82\xe3\x1d~\x89\x92\x62\x94" -"3\x86\x95\x3\x9\xd3\x86\xf9\xa8]\xbf\x8\xacW\xaez\x14''_\r\x88\x1a\x33\xf4$\xfeG" -"~\x89\xc7\x88 \x94\x89\x62~\xaa\x80\x91\x9\xe7\x94\x94\xc\xb8\xd2\x17\x9\xa4s\x6" -"\x19\xaerB)\xea )O\x13\x10u\xd0\x8\xe\xb4\xc\xda\xdb\x1d\x6\xbbg\xb2\x18&\x4\x9f" -"U\xfe<\xb3\x1an\xbf\xd7\x1b\xcfN\x8\x44\xf\x11@\xc7w\xb6@\x11\x45\xb4^\xd2\x8e\x13" -"\x96\xd2R\xc7\x9f\x36\xb9\xb2\x83>Xj\xf1h\x9f\xe7||\x8b\x87\xb1SM\x91\xael\xcb\xde" -"\xaaJT\x8a\xa6\x18\xa9\x8e\xe2(@m\x84\x9c\xe5\xa5s[\xbe\xc0\xae&\xf3\xdf\xb9\xc1" -"$'KH~\xa5\xf0\x9f\xf4\x9f\x8c+\xacu}\x1b\xb2\xc6\x3\xef\x65\xcdqU\x9bO\x99K\x99\x0" -"\x4\xb1\x15\nS\xe4\x80\xd0\x84U\xbd\xf4\xfbzr6p\xc6\r\xf4\xb6\xa8{\x87\x9e\x9a\x64" -"\xbc\xe5\xa5\x37\x92\xa0\xae\xb0\xe8Uu\xc9OM\xa1\x8d\xfc\x33\xfd\xe8&\xd4\xe0\xf6" -"J\xb7\xc9\xeb\x42\x5\xb9\x1c\xa1\x35\x43\xeb\xa0GK\xe\xb3<\xc4\xde\x1a\x80\xb3\x11" -"U\xb7\xea\xcd\xd4Z\x99\xec\xca\x13\\\xcf\x8a\xa7\xe6\x8\xdeq5\x95\x8e\xe~f\xa8\x82" -"\xed!M\xae\xf4#4!\xff\x99\xbc\xac-T\xff\x8c;\xa9\xbcL\x5\xe5\x10\x17" -"{\xe1\xda\xdb\xc0\xcd\x8bR\n\xd8\"\xdc\x4\x98\x9f\x37U\x81w\xb2\x4M\xb0g\xa9\x94" -"Tp\xd2\xa1*(\xa6\xee\xce\xd3$i\x9d@\xf7\xc8K\xfbR\x19\xcN\r\x8a\xfc\x9b\x8fj\xc9" -"\xb8\x9\x7fG8\x10\xef\x18\xb6x\xa3x\xd0\xf6\xf6H\xceS\x1c\xbd\xdb\x34\xc5\xd2\xe6" -"OG\xaa\xc0 V\xe1\x1eycC\xef>%\x5\xf5\xb7\x42K.\x7\xe4\xdb\x88\xec\x3\xa7\x9c\xaf" -"\xee#=\x1f\x9fN8i\xfc\x35\x8e\x89\x93\x1\x9e\xe2\x89\x41\x87\x16\\\x33\xdd\x8e\xb7" -"\xf8@\xe3W|\x3\x1c\x1aRRl\xef,\xb\xce\xbe\xbb\xafS\x1c@S\x11tb\xe6\xbc\xe6\x46\xc1" -"py9\x1b\x1e\xb6\x91`\xe6\xbc\x66\xb6\xd8t5\xa3\xcf\x36[h\x1\xee+\xb4\x3\xfd\xa0&" -"\x19\x81\x86\xec\xd3\x87\xaa\xb3\x37p\xe4>\xca\xf9\x8f\xdbZ?6\xf9\x65\xf4%\x16G\xa3" -">\x9X\x1e~\xe2]\xf3uNp\n\xe9\xc8\x87\x43\xea\ns(\xd7\x6(\xcb\xb5\xf8kL\x94\x98\x61" -"\xc4\x9d\x63\x1cY\xa3\x38QtSa%\xb3u\x8\xf1\xf8\x9b[\xd4\x16\xf1\xd5\x1f\xb0i\x9b" -"b\xbe\xd1\xcb\xcdR\xce\x30\x88\x97\xee\xbc\xbd\xb1\xb0m\x15\xe1Xh\xb0\xd3\x30\xff" -"&\x82\xf7\x1e\xeb\x30\x88\x1e\x90\xd9\x65\x13\xa0j\xb8U\xd3\x93\x19\x95\xaei\x8\xe4" -"w\xc8\n\xe8\xb6\x4\x12\xd5\x9eQ\x89\x7\xa5j!\xc2\xec\x0\x95\xe1\x64\xf7\x98\xf8\xfa" -"G\xd7.\xc7\x2\x2\x89\x9cy\x96\xc6\x1c\x92\xd2\xf1\x9f\x5\xf7\xb0\xfc\x65I?bf\xf2" -"\xaf\x95\xb6\xc0V~Q@)4yV\xbcZ~\x89\xe3\xed\x19\xbb\xdc\xf9\x19\xd7\x81)\x11(x\xd8" -"\xfd\x97\x82\x33\x43\xc0\x32\x45%\xd1\xe9\x18\x44\xc2*<\xde\x8\x83\x6\xe3\x34\xb0" -"\xb5\xc1\x7f%p\xa5\xe8\x6\x42H\xda\x41\x1c\x44\xcc\x8e\x66$\xe0\xfe\x11y\x99 =\xe7" -"+pVRhwK\xcfx\x17w\xc0\x8\xdd\x87\x89/\xd5\xc\xa3\xec\xff\xb1\xf6\xcb\x81\xbb\xd8" -"{\xdf\x4qV\x6'\x4\xb\x30\x45\xc6\xc1\x12\x9b\x46\x37\x8a\"h\xf6{\xa8\xf1\xd1V\xec" -"\x8c\".!\xc\xc1\x32\xc8\xbd\x1e\xea\x1d\x3Z\xc3HG\xb\xefU?)\xa9\x9f\x34\xc2\xbe\x85" -"\x17\xdf\xf6~4\xa7\x80\xd2R\xb8;|\x9am\x19Ur\x15k\xca=\xdb\xbc\x88\x65\xcb!\xf5\xa2" -"\x3\x41\xf8\xefO\xcd\xfbNTc\xc2\xf1\xd0\xf6\xd8\x1a\x3\xc8-k\x97\xc1\x30\xf8\x83" -"1\xc7\xa5\xb\x90qN\x13r\x8f~*\xba\x12\xe6\x1d\xfa@\xe1\xe7\xeaI\xaa\xbau\xae\xee" -"\x4\x63\n\x16G\xed\xc\x83\xcbw\xab\x38\x82\xdbh\xdf\x12:\xaf\xe9\xf6.\xe \x8d\xc6" -"\x97\x8c\xac\xf2]\xf1t\xbbRp\xd4R\x1c\x98_%H\xad\x80\xb9\xffg4\x1fJ-\x3\xf8\x9c\xe" -"\x9b\xba?\xee\xb3\x62vi\x85\xfan\xcd\x12\xb0\xda%\x8f\r\xfbo0j)F\x5\xa5\x64\x8e\xa4" -"L\xa4\\m\x91\xf5\xe9'\xf3\x83\xd6\xe8\xfe\xe8\x39\xe2\xb3ud\xe2\xaa\x7\xf7H\x92\xf9" -"\x19Y\xf3\xb0m\xde\xa0\xdfp1-\xd5\xda\x9e\x1b\x44P\x7fJ\xa3\xa0\x19w&L\x1d\x86\x5" -"\x7f\x12\xf3\x9c\xe4&\x3z\x1b}\xf8\x33#\xba]\xb3\x7\n\xeb\xd2\xeb\xd7s&\xfc\x3\xde" -"9\x1a&\xde\xc4%\xf0Wv\xfb@-\xf2\xe9\x1't!v(\xa8W\x83\xa3\x1K\xf\x7f\xdbUl\xc8\xdd" -"P/Wn\xd0\xc9![\xb7\xdc\xa0o\xd8\x61\x66Ms\xf4o\x8e\x96\x32.\x19+\x91\x13\x65M\xf4" -"5\x92\xd3|\xa6\xbf\xd1\x13\xc7\xcf\xce \xe5\x89\xeekk]Cu\xf2\xf\xd7 @\xae&\xca\xfd" -"{\x89\x5\xc0\x82\xbf\x82[X\xb0\xe3\xe1\x41\x64\x0&\xd5\xe9\xd1\x9c\xd9\xe5\x14\xaa" -"\x9f\x90\xe9\x97\x8eQ\x95tu\xb5q\x86: \xc1\xa0\xa3\x14Z\xa8\xc5]\xa6V`\xce\x10\xe5" -"D'r\xf0\x61O\xd4\xa9k(d\xa1\xc8\xe9\xfd\xf6\xbd{\xaa\x9b\xac\x87\x1b\xcd\xe3\x90" -"dy*Ka\r$\xe5}Y\xe\xacY]\x94l\xe6o4\xcaw\xdf\xfLB\x4\xfa\x39\x42\x44\xcd\xd6\x32\x39" -"AUg\xe9n\xd4\xddwu\xcg\x7fH\xe5?\xb1\xd4\x34\xfd\xabY\x5\xfeY\x10\xf2\x9eJ6\xbdy" -"37\xbd\x35\x43\xd2\xd5\xc0\x10\xa2&\x11\xd4R\xf8\x66\xbd\x85\x37\xe5u^\xaa\xd3\xc2" -"\xd9\xec\xbb\xa5+\x1b\xa4\x8e%\x18\x80\x66\xe6\x90\xd2~\x92*\xadtMhS\xdfKV%\xbb\xf9" -"\xef\xae\xf5\xb8\xdb\x8d\xa9\x1d\xbb\x92\xdeH,\x8f\xb5S{y\xcf\xd1\xaa\xdf\x8a\xd4" -"&r\x17\x30\xad\xb7\xfd\xc2M\xbd\x9fX\xb7J\x1\x32:\xc6\x8d\xa4\xa1\x80\xf2\x13\x1" -"\x96H\xfb\x42~<,\xeb\xe0{*\xf9\x8e\x84\xe6\xcbw\xaf\xc2\x18\x84\xbb\x8d\x83\xa1t" -"\xf2:\x0\xc5\x96\xd5\x90\xa0W\xeb\x94}c\xb\x84\xc1\x18\xd4\x46\x0m/\xeb\x83\x85\xa8" -"\xccG\xbb\xe8'\x96\x38\xa0\xdf`\xadM+\xfc\x45{\xd9\xea\x89l\xbd%NPa\xc8\x37j\xe4" -"\xd8\xdf}\xe8\x10\r-[n9\x18\x36\x43\xc0y\xaa\xd1\xdd\xb1\xc2\xf9N\xca\x45\x19\xbf" -"`\x90\x9bj\x97\x18\xc3\x16\x87\xb4\x9\xb4\x9\xde\r\x18\x42\xe0h\xcb\xe7\x37V<\xd0" -"\x97U\x7f_+\xb2)\xd7\xb0}\x89O\xeb\xb0{3N\xf1\x10\xfe\xc9\xd3\xd7\xc1\x46/\x92\xf1" -"\x13\xb0\x82\xd8\xf2\x10\xd3\xaa\xb4t\xd4\xf4w\"\x84|\x88\xc9\xc0\xa2.\xfb}p\xb3" -"i\xb7\xee\x34J,\x1e{\x14\x3\x39\xbc\xe7\xbf\\\xc7rb\xd6\xf3\x86\x8b\xf3\xe0O7\xa8" -"\x1c\x9dPR.\x9a\xd6\xfb\xb4\xf6\x18:q\x92_\xcb\xf7\xb!\x89\x39\xc2tE=9XwZ\xa6\xc1" -"\x9c\xdewRk\xfbs\x95s\x19\x30g \\\x3\xcc\x8d\xe2\xc1\x8a\xfcyf\x9f\xe3\xad\x90\x35" -"\xe9\xc8\x35/\xce\xb9Z)Kf\xecT\x93\x65\xf6\xc2\"O)\xec\x31\xe2\x30\xfb\xf9)8S\xb6" -"\xdaiC\x9\x1\x12\xf3\xf8]vGT\xc3z\x9c$Nml\xce\xcf\xa3\x88\xb*\x93P~\x92\xcdp\xeb" -"v\xfd'\xc5\x64\xb\xb1q9J7\xc1\xea\xf7~m\x7f?\xd0\x8b\x95U\xde@mf\xb4\xcf\x6\xad\xdd" -"W\xed\x85\x33\xf9\xf0\x44\"\xa4\x15\x42\x7fu$[\xfd\x3!\xfe\xd3\xe4X/T-5;(m\x94/\xf" -"r\xd1\xb7\xa5\x88]\x85\xa8\xc6\x9e+\x88.\xd6\xfx\x89\x32" -"P\x2\x80\xf3\xfcqlF\xadli\x8d\xf1\xfbsY\xe6\xe2]\xa6\x1c\x85\xe1Q\x10\x81\x9d\xb3" -"\xd2\x65\x44\x1d\x96J\x11\x90\xc#\xb0\xdc\x1\xa4H\xe0\x41\xe6u\xf4o\xe2\xc\xc4k\xf1" -"<<\xc9\x62Ju\xc0\x1c\xa7\xca:\x5\x1cs\xaa\xbfK\xb1%\x85Q\x80m\xa6\xa6\xe2t\x8d\x85" -"\x3\x32\xf6\xad\x63MJ\xfc\x66\xd2u\x9e\xfd\x86\xc3\x8d\xfeRB\xe4\x41\x11\xbc\xe5" -"\xfc?%_\x11\xcf\xfb[\x12\xfd@Oh\"u\xa4\xba\x1a\xd7\x7f\x12\xa7s\x88(\xddhNk\xee\x8b" -"\x7\xbcN\x6YQ\x81)\xeb\xd3\xb2.\x90\xcd\xe1\\\x65'FVi\xe5*\x2j\xbe\xe0i\xc5\xd3\x7f" -"36\xa7')\x81\xa7\xe8m\xd5\x1d\xda\xac\xe\x16h)\xa0\xeah\x98:h\x7\xbf.\xc0\x2\x91" -")Kk#t3r\xd5i=*\x1a\x1cP9O\xbf\x30-|\xe4\xbl\xa0\x18\x9at\xee\xaf\xba\xe5\xa2\x11" -"\x1c\xe8\xd4\xfe^\xdc@?m\xa4\x63\xe8u\x11\xdb\x9e\xba\nn8\xbc\xff\xcc\xf9\x87\x8c" -"r\xf4\xf8\x65)\xdf:\x9e\x46\xf0\xe0\xfc'j\x96\xd4\x16\xdf\xbb\xd3\x82\xda\x92n\x84" -">\xcfZ\xbd\x1cO\xb4\x91\xdc.J\xabs\xec=\xde\xe1\x43\x32\"\x64\x90\x38\x30&7u\xec" -"\xdd\x2\xa6\x2p~\x4\xd9V\x1\xa0\x32\x46P\x3\xa5\x31\xe\xf8\x43u-\x18\xd0l\xf3\xe0" -"\xa9-i1\xa4\xa7\xed\x9a\x12\xff X\x97n\x12\x1av\x95j\xa2\x3\xf4Y\xae\x45@bP\x83\x3" -"\x17\xad\x85\xee\x1a\x1a\x91\x3/\xb3h),\xa8\xe\x38\xc3\xb4\x9\xd9w \xd9\x9\x1=\x16" -"-y\xc3\x85 \x8c\x9\xb0\xbb\x8c\x1e\xc9\x1a\xc0\xfa\x66\x83\x1f\x10o\x93q\x7f\x66" -"\x7f\xf7\x98z2\x5\xb4R[\xacL\xb2\xe6\x34\x9c\x8d\xc5\x89\xac\xa3\x89q\x8c\x97M\xa8" -"e\x8c\x90\xec\xe1\x62\xf2@\r\xd9\x64=\x14\x46\nv\xd1\x92\x43\x9d\x85z\x14\x84R\xa6" -"W\xdd\xb1\xa3Q\xc2\xe8\xaaj\xad\x66V.\x92\xa0\xb\xb4\xf9\xac\x33\xf7^\xc7\xc9\xc2" -"\xbf~x\x98\x1f^\xdc\xf4\xe5T\xfe\xd6\xfb\xcc\xba\xab\xb\xf3\xf1\x93\xbf\xe7\xf3\x99" -"\x17]\xe7\xd0\x89\xda\xce\x9b\xbb\xa3\x46\xacht\xa6-\xfc\x44\xb8\xcd\xf5\x81W\x80" -"f}\x19\x1fr\x8dJ_xMLdv\xbc\xd8\xb0q\xe7\xbc\x34\xd0;\\N\x14\xc6\x96\xc7\x95\x1e\x61" -"\xba\xb9\x87\x14\xe1h\xc7WF-]#\xeao\x98\xef\xbdRI\xb6\xde\x8a\xe0\x8c\x8d\x83\xc" -"7\xfckb\xfb\x9\xd4j!,\xf5\xe0\x0\x38\x37\xe7&\\3\x9cN\xd8\xca=z\xcb\x1a\x45I\n\x1" -"\xf1\x8b\xea\xc6u\x86o\x1c\xb0\x92\x10\x8e\x2\x13\xf9\xc9\x64R7.,\xd2\xc0\xb9\x91" -"V\xa6\xf\xaa\xdepV\xf\xf8]\xbf\xc1\x44\xc4\x9aN\x17H\xac\x9b]E\xb4N\xaa\xc5%i\x90" -"\xb4\xa7P\xc7\"\xafS\xd4.\xec)\xa9Q\x0h\xb3\x82W\xbe\xf5\x16\x9b\xd8\xbc\xe9\x64" -"9\x8c\x1c\xee\xd6|q?\xe8\x3\x9b\x15\x8c=\xaa\xb6\xae\\\xb9j7\xc5\xee\xe4\x9e\xf1" -"C)k\xc1\x86@+\x11;\xa0\xddm\xd9\xf1\xa6^\xe8\x1\xbfO?B\x19'\xa7\x8c\xc3\x33\xe\x17" -"],\xf4\x1euK\xc6O?pY\x1b\x8e\x91\xfb\x1f\x8b\x66\xf0\x1a\x14?y\xbem3!\xb7\x7\x18" -"\x86Y7V\xec\x0t\xaf\xa2Q\x9c{M!\xb6\x12\x38:\xd6n{\\\x8a\x88\xd1\xb0,V\x92\xfam\xc5" -"\xdb\xba\x85z\x9a$\x1bsa\x85-/\x7f{\xcc\"\xf3xPG\r\x6|\xa1\xdc\x87GLI\xa8+o\xec\x89" -"\x9bh\xcdS\xb0\xadY\xbf\xc8P\xeaI\x80\xed\xa9=\xff\xfd\x9e\xa8\x8f*\xf1\x16\x12\x7f" -"\xa8\xf6\x9e\xb9n3\xa3\xb4\x95\xf2\x9\x9f\xa8\x9b\x14\x7f\x9a\xd0\xe5\xa7\xf\x97" -"Orp$p\xd0\xfa\xe4\xf0\x1a\xa0\xbc\x32;\xb5<\xc2,\xb6\xea\xa2iv;\xd3\x82\x36\xb3\x4" -"}9\r\x80\xcf\x9d\xcb\x62\x19\xf9\xe0\xaa[\x94_\xd3\xad\xc0\xc1p\xfb\xe6\xf9m]Ps\xbd" -"\xca\x99\xdfY\x0\x38\x18\xe2\xfd\x36&\x9f\xf9\x62\xc\x84!y\x1e\x80\xc4\x18\xe1Px" -"\xfb\x1e\xdb\xf2\x17)\xc7\x1d\xc3\x8c\xe2%\x1f\xbe\x17\x16\xbav\xaf\x15#\x99\xb9" -"\x8K\xbc\xc\xb1\xe5\xdeii\x12u\x81\x32zd\xf3v\xd2kZv\xdc \xfc\x2\xa5\xf9\xedi4\x9c" -"\x89\xa9n\xa2\xfh1\xc0sD\xcf\xdbo\xdfwv\xcfJ\xefN`\x14r\x8c\xbePvr\x2\x84\xfb\xc8" -"\xa1V\xdb\xf4\x8c\xa2\x63]\xd7+\xf9\x8fh\\Vm\x93\xe7M\xf9\xdbH\x8c\xa4r8Y\x7{\xe5" -"Q\xd4\xb8\xeb\xbe\xe5O\x9a\x7X\x8e\xabw\xee\xf\xa7@\xcdL\xe\xa0\xb6\x1dz\xcd\\\x65" -"\xad\xda\xb2\xe9\x42(\x17\x35)2\xcd\x4\xce\x7f\xedG\xa6\x93\x83\xe3\xa9\xf0\xf7\xfb" -"\x84\xea\xb4\xbb\x80\x16W\xccO\x92\xcc\xf9\xca\xa2\x8c\x17\x8a\x43\x81\xf1\x41K\xd1" -"XX\xae\xa8\xb\xdaY\xad\xdf\x43p6'\xc9\xda\x45-M\x16\xf2!\x7fl\x82\xf8}\xfv\x18\xa8" -"E\x15R5O\xf1\x93\xca\x9a\x37\xf1\x8d\x46\xde\xd9>\xb\xc2Z\xab+\xa1\xbf'i\x15\xe9" -"\xc4'\x8\xc1k&\xba/\x95\xbe\xb5\x2\xfe\x7f\x93g\xc\xa4t\x9b|\x18x\xcf\xf0\x34{\xa4" -"'0T\xc8\xed\x7\xf2/}~[\xf9\xeb\x15\xf5\x93\x3\xb6U\xcf\x86\xa3\x0\xd1\xa0\xbdL\x0" -"]\x98\x9c\xb7\x32[\xd6\x9`x\xa7z\xce\xafp`\x1b!<\xb5\xa1\x89\x84\xd8\x1f)\xb\x84" -"u\x5P\xe8\xb5~\xf9J&\x18\x43\x13\xae\x18y\\PO\x0\xfc\x19\x15\xa4\xaf\xd6\xd8#\xe4" -"\xf1\x12\xa8\xa7i\xf0\x0r6\x87\xc7\r\xc\\\x36J\x2\xd5;\x89\xb5\xd0\x62\x1\x81\x19" -"\x9bW\x92=w\xc1o\xc3\xad\x61\x35`\xda\x30g\xb6o2\x16\x99\xdf,\x8e\x8l\xea\x9e\xb8" -"<\xecL>r*\x1b]\xd0\x10gZW\x8a\xedW\x3sH\x8bl\xde}VC\xe6]&\x3U\x4\x1d(\x84\xb3\x9d" -"\x1@O\xdb\x5\x87\xc3\xff\x1al\x11(\xcf\x99\x9fj\xd3T\xf9n\xae\x34m\xa9\xed\xb8tS" -"\xd9\xe3\xf9\xfeP\xdf\xf3nG\x11\xd6\x45/\xe3\xeN\x96,Y\x7\xc\x9e\x34\x84\xbfq\xd7" -"\xe3\x10\xf4$w\x12\xf\x84'h\x12\xf2\xb7\x9d^Q\xfc\x93\xb4k3\x10\xa0\x8a\xc6#!\xf1" -"\xafg\xef\x33v\xf8\xd5\x89\x94\x8\x42\xc9\x99\x8eL\x82\xb9\x14R\x17u\xe1\x9a\x2\x99" -"\xfew\xe8\x33\xe2\xb7\xc0\x43s[\x82\x83\xb3\n\xf8T\xf3\xae\x7O\x10\r\xa4 \xa1\xba" -"\xf1\xef'@*/\xa1[\xf6OL$\xedo::\xc5;\xf9\x81\xfe\x86\x8a\x1\xf9\xe4}\x9f}UPH\x88" -"\x95?Bn\x13-;\xc\xcd\x45\x31*\x80u\xf4\xa8}\x1f\xaa\xf7q[\x93\xbf\x43\x8\xf1\x32" -"@TS\x84\xe3mp!\xf3vmx\x1do*\xa9\x9bRx\xc5\x1\x82\xbf\xe7\x1b\xed\xea\xb8\x99\xe1" -"\xb2L\x10'\xc0\x39\xe3O\xfc|\xf3\x8a\xe7\x10!j\x97\xdb\xe\xfc\xe\xed\x8b\x9dIV\xb7" -"\x7f\xa3\xe2\xa8\x9fj\x94\x1e\\U@\x0X\xb7\xdf\x34KY+[\xb5\xbdS\xfd\xa7\xb2\x39g\xd4" -"\xd2u\x8d\x2\x8d\x63\r\x42\x1b\xbbOb1\x1a\xc9\xd6\xda'\xc3\xa2g\x81\xfag\x13G\xd9" -"\x9\xac\xf6\xa8\xacu8#\xba\r\x39p{_\xddM\xde]\x9a\x42%#6\nF)\xb1l\xd3\x45\x98\xdc" -"\xa1\xc5t\xb\xd5\xec\xe\xc0\xc0\x8f\x8a\x39\x42\xc6\xcc\x5\xaf\xd4y\xe\xdc\xf4\x46" -"\xc6\xfb\x8a\x8c\xd8\xdb\xdat\xbb\xa6>\xd5\xc0Y@\x92[\xc2\xc2\xa3\xdc`\xd6\x9b\x42" -"Zp2\xdau\xce,dhL\x88u\xf7\x35\xdc\x9f\x87\xf{f\xe9x\x98\xdf\xc9.\x9d\xa1\x35\x1d" -"~\x83\x66O5]\xf1\xa1\xc8\xd0\xbf\x8a\r=+\xb6\xfb\xc0\xe1\xb9,\xbe\xbe\x11\x88\x91" -"\x15\x32\xb5\xf4:\xc8&>\xbc\r\xaa\xfb\x90\xf0\xa7\xde\xc7\x1eV\xc3\r\x39\xdbYE_\\" -"\xb0Xr\xa6\x9d\x9c$\xd7\xfc\x9c\xf3\x9bO~\x16\x64\x2\x92\x34\x19y\xf9\xc\xbd\x3\x13" -"\x88\xac\xf1@\x1d\xff>\x9d^\x82\xb8]\xf6\xcb\x14M\xae\xdbt\xe4\xe6?\xe9\xdb/L\xdf" -"\x16\x6\xf7/\xdfu\xba\xf5s\xac\xb0z\xfe\xbc\x8cW\xa8H\x92\xe6\xfb\x17H\xe\xf3\xbd" -"\x9e\xcf\x8a.7\xbd\xc3\xf8\x90\xfd\x82\xfc\xd2\xdd\xbf\x8c\x11:\xe9o@\x13Y\xc7Y\xaa" -"\xf3\x92L\xde\x30n!\xe3\x8\xf0\xf8\xab\x0\xc0\xc7\xe5\xe4M/k\x8a\xaf\xc\xdeQ\x91" -"\x93LR<\xa6/\xe1\xa8\x16u\x90\xa5\x12\x35\xf4\x95\x15\x43\xe9\xf{Do\x8f\xc8\xcd\xbb\xfd\xc\xf0G\x8b\xab\x42\xad" -"\xa6\x10k!\xfe\x16\x9b\x16\x30\x41Hr\xb0\x8|C\x88\x6:\xb4L\x8f\xf3K\xa2\x8b\x38\x30" -"\xeb\x35=\xe7\x8e{\xe0\xfa\x83\xe3\x37\xbf\x8e\xcb\x99\n\x9a\xa2\x16\x9f\x3h\x9d" -"\xa7\x7h!\x1f\xd0\xc5\x19\xb2\n\x97\xe2\xb\xa3%,GE\xd9i\xa4\x94L\xfb\x9e\x6\xfc\xa9" -"\xff\x8}\xe3\xe8\x16\x17-\x7\xa5\xfeG\xeb)T\x9c\xe2\xeb;\x85\x86\x62j\xb2>@\xe2\xb9" -"')_\xd8\x64\xbc\xd6\xcam\x85\xd3\x65\xe\xec\x16\x91\xca\xf0\xad\xc3\x17\xb5\xd5O" -"\x87\xa4m\xb4\xce\x9f\xb8\xad\xcf\xd1\xb4\x15\"@\xf7.\xb2/>.{\x16\xffS\xbbLv\xe0" -"\xc6s \xe8\x32\xdc\x92\x94;\xac\x94\xb5N\x90\x7\x39h\xe8\xfe\xf6\xf6\xbag\x88\xd2" -"+\xda\x92\x91\x9b\xecs\xf1\xba\xa3\xcd\xdf\xff\x84\x12\x43$\xccI\x1a\xa9\x9Qp\"\x0" -"%\xd8x\xb3\xbct\xd8\xc2\x41\x43\x8bT\xb7):m\xd8\xea\xa3\x1bs\xe0\x0\x1a\x83\x45v" -"\xd8\x8b\x93M\"\x97\xc9\xdf\xbaq\xda\xc3\x3SJg\x80_\xdc\xbc\x86^rjg\xf1\x36\x3\xf0" -"\xe9\x30\x44\xd3)\nI\\H`\x9a\x85\x19\xb1\xd9k\xca\r\x0\x80\x0\xc7V\x1f\x0\xe7\x37" -"M\xe1;\xaa\x1f\xe0\x3%\x89p\xae\xcc\x15\xc9$\x11\x81q\xa7\xe0\xc\xf0\xd4kM\xe8\x42" -",\x14\x82x\xb6\x86\x19\xe9\x82`\xc6\x8e\xde\xf3\x9f\x7f\xb5\xc5\x1e\x33\x30\"\x0" -"\xabne\xa1\x39\xc6+\xb3q\xb\x43\xc2\x64\x16\xe1g\xf7\xef\r.\xe\xdc\xd7@*\x18\xd3" -"R`R\x85\xcb\xbe\xe8\x1K\xe1\x35\x65\xbd\xd6\x91\x45\xa7\x9a\xb9\xeb\x10\xf4 \xe3" -"\xe4\xa8\xe7\x0\x82\xf0\xc0\x66\xfc\xe6\xe0.\xdd\xeb\x45\x10\xc9\xb7\xcb )\x94\x8c" -"\x8a\x5\nh\x9a+XxX\xb3\xb6!\xca\xef+P\x11\x61\x9f\xa2\xfc\xd9\x99\xa9\xf8\x63\x7" -"\x4:,k}\"\x92=m\x1\x5\x1b(\x1\xf8\x36\xfd\xe2sU\xbe\xce\x38\x32\xe5 g\xa5\xdc\x18" -"\xad\x15\x88\x31\xeQbT\xf8\xa8\x17\xef&o\x1dK\xce\xfa>\x84\x8f\xc1\xc6\xdbq-\xf6" -"|\x8e\xfd\x7\x9c\xcd\xf4(\xff\x62\xd0\xf9\x1d\xb6\x91\xe0P\xba\x4\x1a\x64\xe2\\\\" -"3\xd4\x0\xb1n\xbb\x91\x36U\xa8(p\x8c\xdd.\x12\x13\xde\xbdT\xeb\xae\xeb\xe3j\xe9\x33" -"\xef\x45\xc7\\\x1e\xf\xd8'/\xb5\xa8\xd4\xbe\xcc\xd9\x1c\x98\xcbX\x5;\x0\x9c\xc6L" -"\x17\xc2\xd9\xfb\\\xf6\x87\x35\xc3\x87_TA\x95~\xdc\xa5z\x9cY\xe1\xb9\xf2\xaf\xd6" -"P\xcd\x7\x45\x41\x46\x7}C\xa8\xa3\x45\xf8\"\x0u'\x84\x90\x38\x91 ON\xbe\x91\xe9\x13" -"\x86\x91\x9dX\x1a\xaf\x0\xec\xa8\x9e\x33q\xea\x97\x82\x33P\np\x6+\xfd\xd3\xb7\xd2" -"\xdd\xfb`]\"q\\\xe7\x11\x89\xa2\x38\x39m\xcd[\xd2]Q(=\x15={l\x1b\xdf`=.[\x6j\x19" -"bS\xf4\x4\x80v\xb6\x92\xec\xef\xac\x65\xe1\xc3\x17\xfb \":\xc9\x8a\x66MJ\xde\xdf" -"{t\x1d=\xbb@%\x89\xdd\x62\xfa\x98<\x9aY}\"\xffr\xf5\xda\xa3\xef\x32IT\x1\x31\xfa" -"Yz\xcb\x98hsv\xeb\x0\x13\xb4\xe9\x15\x19\xb2\xd8\xd5\xaf\x45\x10\xf0\x66'D\xec\xb6" -"\xcc\xbd\x9c\xe3h\xf3\x9d\"\xfa\x36u\xf1\x38o?\xa0\x8cw\x88(Q\xf6\xa2uP\x95\x30G" -"@\x81\xf0\xd3\x7u?\xc5\x8\x1e\xde\xee\xd9\x38\x86`\x96\x14\x13\x1e\xea\x9aK\xa8\x85" -"\xe2;l\xc\xa0#\xf5\xb1*v\nk\xa3\xe7w\xc8\x36I\xd7\xee\x96\xe2\xeai\x97=J\xc\x65\x15" -"\xa2\xdf$M\xd5j \x15\x33P]\xee\xd1\x64\x96PH\x4\xb5\x1d\x87\xc6\x15M\xc5M\x14\xea" -"\xdd\xbe\x8d\x98\xc4\x95}\xfa.\xea\x9b~\xe8o\x83\xecS\x9f\x90\x82\xb3%\xfb_0xe\n" -"\x3\x89\xaeT\x8e\xfe\xf5\xdb\x87\x90\xe9\xc5\xbf\x89\xa9\xb0\x88\xbd\x9e\xc3\xb6" -"\xa4\xe6\xbe+&\xcez\xf2\xf8&T^o\x17\xe6O\x17(\xd0/\xc8$>S\x19\x66\xe\xc0\x66\x31" -"\x91\x91\xd8\xb1\x18\r\xcc\xc5\xe7\xde\xd5\xc9\x34\xc9[\xbd\x1f\x14\xcd\x9c\x19`" -"~\xed>\xba\xd9~\xea\xb5.5):\x15\xfc\x36\xaa%\x95\xe8\x18G:\xc0]lD\xa3\\\xb2|\xa3" -"\x10vP0\xed\xe3\xa8@\xe9\xa2TU\r\xe8+|z\xf5\xe2\xb9\xfc\x46\x44\xaf\xa2J\x92\x6\x99" -"\xbb\x18\x10\x7f\xfcLe\xbe\x2U\x97\xa2\xfayJ\x9a\xd4#\xe4\x2?'\xd6\xccmtx\x7fg\x93" -"uM\rE0\x1b\x85R{Y4\x1e`\xb4\x1dM\x6\x9dp4 \xe:\x16\xe3\x90\xdb\x8f\xba\x36'o\xcc" -"ZS\x8c\xb4Y\xce\xe0s.\xc7\xa4\x8a\xdbKR\xed\x41J\xd4\x8\x34\x8fp)%\x7f\xf9\xe0\x9d" -"i&\xac\x96\xf8\xaa\xe1\x3\xb9\xby\x90\xde\xa8\xe6 \x0\x9a\x38\xecUo\x82\xb4\xf6H" -"r\x8f_\xbb\xb4S3\x8a\xf7\x8\x81\xed\xe8=)\\V\x1b\xe9\xf3\x1c\x33 }\x95*7\x9b\x66" -"\xf\xe3`\xc0\x14\x10\xbc\xe1[\xd9`&\xce\xcf\xfe\xa6\xd7\r\xa2\xa4pY\x95\x1d%J\xa5" -"\xcb\xfe\x8bt\xf\x41\xc2_\xcaL\x7fqX\xfa(\x14\x89|\xa4\x16_\x94\x0\xe2\x3\xfe\x30" -"\xb1\xd9\xefN\xfe\x31\x8f\x9a\x36\x41H(\xb4}\x84\xa3Px-6-nd\xac\xee\x8a\x86#>\xb2" -"I\x9d\x32\xfb\x5\x97\xb\"$\x8a\xdd\r\x80\xab}\x97\x90\xf1!,\xb0\x91\xd6\xce\xc5\x37" -"\xb9\x15O(\xcc\x6\x66\x97HdQ\xec\x6(\xde\x63\xa3@\xb7\x11-\xf5\xb7\x33\xf7\xb4\xc3" -"\xe6\"\x6\x1f\x94\x12\x45_\xf2\xb5\xd0\"\x98MK\xef\x64Y,<\xe2\x19\xbeOhY\x19\x1Y" -"RA\xa1\xab\x81\x9d\x38p.\xdcp\x6\x8V\xe1\x41z\xa0q5y\xa4\x30\xaa\xa6|\xb3\x3,\"]" -"\xef|\xe8\x8c\x65\xc5\xccp*\xfb\xb6\xba\x81\x86\x2L\xd1\xaflcG?p\xca\x43\x9d\xbb" -"5\xe3>\xa5l\xc9U\xcf\xde\xb7\xder\xb6}\xc3\x39\x1fTz3\xb5\x1a\\\x8a-0[GF\xcd\x8c" -"8\x8n\x7f\x18$4\x8f\x5x\xf\xda*A\xbb.J\xb5\x87oT\x1f]\xe\x9d\xac+A\xc2T!l'~\x8eT" -"\xb1\x17K\xda\xddr\x4&\x0\x9b\x2rI\x87sD\xad\x44\x13\xfd\x97\x9d\xe9\x8c\x19Gg\x8" -"\xea>`\x8f\xfb\x87_\x85\xed\xa0\xdcj\x5\x35zg\xb9\x8f\xd6\xfdU\x1a\xddq\"\xd2\xf8" -"Q\xc\x46%\x3r\x99\x84\xf0\x6\xf1x\x9f\x9e\xce%\xda\x89\xb5LZ\xa3\x98\x9d\xd4ycj\x95\x39:!\xe6\x62x\xe2jn\xaa" -"\xe9\xa4\xd6\x13\xf0\x9\xd4\x82\xf5\x1e\x2`\xee\x19\x39\x34\xcft\xc4\x16\x13G\xb1" -"5\xe\x7\x10\xa8\x14\xaf\xde\x11\xe6*\x9d\x8eg)\xdb\x33M\xd7\x36\xc4n$\xf3\xd7\x10" -"\xce\x18\x9e\x64[\x99>=\x7f\xfd\x45\xe5\x88\xf7\xf0\xce\xa7\x8d\x46\x46\xb=\x14\x2" -"U2\x15\x85\x1aR\xd3{\xed|\x1c\xa6\xd2\xfbWt\xfa\xa3zD\x8bRKf\x11U\xdfl\xc6%\x8b\x9b" -"\xa4\x9aI3K7[\x1c\xfb\x94)R\xc5\xf2\xd2\xb7\x5\x32\x7I\xc4\x30i\"*T\xbd-\xfU3H9l" -"\x15`\xd7\x7f\x17\x1f\xcfX\xa7\xbc\xcc}f\xc\xa4:\x12\xdf\xd7\xcfZ\xae\xff\x1e\xf0" -"s\x90\xbd\xbd a)\x97\x81\xb3\x86\x8a\xaa\xa2\x7f\xb7\xcb\xee\xad\xf1N\xc1\xeb\xbe" -"I\x15;,p\x98\x19\xec\x81@\xf5\x88\x94\x8b\xe6n<\x90\xd8\xf3p\xdfn\x18`\xc7\xc9\xc0" -"\xee\xb4\x95\xbe\xc6\xd9 \x15\xa9\xcb\xd6$\xc2L\x84\xc5+\x85\xce\xc9R\xe9m/\xe3K" -"6*@\x3\xa3\x2\xd0\xce\x1e\xc3'\x11\x85M\x1euz%\xd4PY\x93\xf0sb\x8f\xf1\xc5=,\xe0" -"\xc0\xf0(\xee\xd0\xa0\xbd*\x0\xc6\xaa\xaa\xa2\x9f\xa9i\xd8.\xc3*\x3\xbch\x18\x61" -"p$\xdc\xe9\x44\xb9\xaa\xd5\x98\x31\r\x32t\xdb\x99M\xbc\xe0\x91\xd9\x8a\xfc\x89wJ" -"\xb0\xedn\xa5\x7\xa0V\x88\xf3w\x1d\xd7N\xf4\n.f<7\x97\x9b\xb0\xba\xc5w\x8e]\x85]" -"m\x18\x86\xb5\"u\x5(\x94\xc3g\xf0i-\x95`E\xc\x1f\xdb(\x7\x1e\xc6k\x15\xb5\xc6\xa9" -"\xfe\x66\xfa\x66_\xb2.t}k\xf1\x5\x15\xee\xd2\xc\x17,6\x90\xbe>\xd9\xfe\xey\x17\xa8" -"\x91\x87\xb1\xca]d8L/R\x96\x85\xf9\x8c\x38\x9a<\xe1\xd4Q]\x16\rt-\xcb\xdd\xed<#\x92" -"js\x97k0\x86\xd5\x96\xd3\xd5\xe6\r\x7f@|H\x9c\xecr\x1f'?b\x91%ke\xc~\"5v\x19\x43" -"Cm;m\xb6\xed!.+\x14\x95\xe5\x3\x87Qzv\x16\xf8\x0\xff\x66\x3\x46\xcb\x12\xf4\xba\xd4" -"GQ\xf3MC\xeb\xed\x1a\xb3\x92\x8c\xc9\xec\xdcL\xa7\xdc\xc1\x16\x5G\x8b\xd4\x83\xf5" -"\xa5\xa1\xe5\x90\xb4IFX\xdbY\xaey@St\xe0\xcd_\x11}V\xec`\x1ak[\xc8\x66\xbd\xea\xe1" -"{$i\xb9u\xbb%\x93\x0\x10\x1\xaf$\xc'\xbaK\xfcz\xc6\x89\xaa\x38\xf2Q\x9bHX\x84\xd6" -"|~\x8cYs\xf8i\xab}\x1c\x38-\xb9\x6\xb0\xc1\x85\x8\x45\xde\xd7\x94\xbf\x61\xf5\xe5" -"\xf1s\xab(\x1c\xc3\xd8\xa8\xe5\x89\xc4\xa4\ru\xcb\xa4)\xd1\x89\x9c\xd7\x11\x14\x80" -"A\xd1\xbb\xd2\xfc\xa4x\x97ri\xbc|\xa8\xdf\xbc\xf3\x9a\x8f\xb7'R\x13\xf7\xa9\xa3\xce" -"\xbc\xf\xcc\xcd\xdf(\xf0\xf9<^!\xdd\xbc\xf7\xe7\x84\x10;t\x8d\xe2\x87\x61\xd9\xe" -"\xcf\xd9,\x14\x17\xe7v\xe2\"h\xd7\xf0\xcd\xa4$\xa2\xccJ\xbc\xd4L\x6x\xf5\xe4\xfc" -"\xc2~\xde\xdc?$\x8b\x36Wr\x9b\xa4w\x0L\xf9\x45\xa9y\x84\x94OoSy\x19\xf4\xd9\x35\x91" -"\xd6\xda\x9\x64|{R\xc2\x5\xa0\xa2k\xcb\xfeX4\xaf\xe9\x81\xbf\xde\xb8\x13]\x99g\x15" -"\xe2\x43:\xa9x1h\xb5\xe7\x90\xdc\x82\xab!-\xff\x87\xc9VUP%\xc5\xd1\x36\x3\x2\xe9" -"\x98\xc'\xc4\xb2#-\x10v\xab\xc9\xbfG\xc1\x66\xfb'\x0\xedk\xb2\xfc\x8b\xeb\x8d\x8f" -"\xf9\x90\x1c\x14\x9a\" Ane\"\x9d\x19\x63\xa7\x92Q\x7 \x17\xc4|Z\xeaV\x14\x1d)X\xcf" -"Ax\x93\xaa\x5\xc1\xedp:\xdb\x82p\x17Y\x1d,\x9e\xa7,c\x83\xd0\xee\x81|\x2\x93\x86" -"\xc2\xcaR\xba\x7f\x32\x8b\x12\xcd\xc8=\xf1\xdb\x15J\x97\xc0\xcc\x92\x7f\xa4\xaf\xf4" -"\x7fh(K\x14\xdd\xc9X\xb4\x3\xf6\xe\x62!\xbc,0^IH\xe7\x62L8\xcaoz\xa4\xf1U/7S\xc7" -"\x1bN\xe2\x6Qq\xf7O\xc8\xf0\xd0\x0\xdd:\x18\x19\xad\xe6\xbe\xae\xf\x41@\x85\xf4\x63" -"0\xbf\x99\xd7\x7\x65%\xc3\x3i\x15\x4\x9b\x42\x1f\xf0\xc4J\xd1\x7\"\xf3\x14\xd4\xfa" -"\xcb\x10\xfaM\xc\x66:\x10\x64\x91mL\xa7\xefh\x98 \xb7\x7f\xca\x4\x88\x8e\x62\x98" -"\xc1\xe\x31z\x9\x16X|\xb9\xbf\xb0o\xe3\xe4\x8bY\x10\x9a\xcc\x87\xcf\xbaI\xd5.RA&" -"g^4\x5\x66.FX\xcf\xe8\"\x32\xe5\x42\xda\xc2\x1?^\x1f\x3m|\x3\xc1\x16g/\xc0\xa3\x80" -"!\x4]\xc0\x9c\x95\xc9R\x9c\x45q\xa4\xb\x80\xca\xc4\x9f\x9\x9\x91\xf2l\xf9\x8a\xdb" -"B\x17v\x18_E\xcc:a\xca\xb6w\"B\xcb\xf\xde\x44@/\"P:\x80\xc8w\x8\xc5\xe\xff\x8bR2" -"Q`\x9cK\x8\x14\x39$76X\xd2\xe4s\x10\xb4\xf3\xee\x45\x95\xe2P\x1c\xe6\xb8$\xf8\xc7" -"\x0\xce\x61P\xfc\xa2\xc8#$\xed\x34\xd1\xc2+$\x9b\x2&)\x16vd\xe7S\xf0\xc6\xdf\x33" -"\xbe\x44\xa0`{\xcb\x1f\xdd\xb5\x9f\x9e#k\x9cS$\xaa\x17Y\xda\\O\xfa:\x8oD\xd3\x89" -"\x88\xcd\xd3O\x90\x6\xfe~{\xd4_\x95\x9b\x8a\xc4\x7\x81\xe7\xdd\x84\x1cV9a\xce\x17" -"\x7G\xe\xf]\xfc\x1f\x96\xc6\xab\xed&\xc6\x9f\x1b\xf9\xc1\x7f\xb8\xccNmi\xf0w\xa3" -"C\x12_Y-\xb2\x0\x93\xb6\xf6\x39\xe8\x96v\xe4Z\xd6\xc7\xc5\xe5MX<1\xc\xb9+:\xdd\x4" -"\xf0\xb0\x80\xba=\xb\x43K\\0\xfc\xech\xe3'\xd4\x43\x35\xb9" -"n\xeb\xb2\x41X\xec\x84\xf9\x1\xf9\x34Hw\xe4\xf\x83\x10\xdcO\xe\xdc\x85\x1\xe0\x18" -"\xbb\x1b\x8dX\xf1\xe3\x83\x1f\xf2I\xc0\xc5\r\x65=\x86\xf5\xfa\xc3\xf7\xd0\x8c\xd4" -"\xa5\x61\xd5x;\xe3\xf2\x42\xd6\xda\xa2\x1es\xd5\xe1\xfa\xd5\x92\xbb\xbd\xb4\xa0\x0" -"\x1\xb6\xa8\xb9Y\x1b\x66\x14\x0\xe4\x61\x12\xaaly\x98K\xc1\xf4XY0\xab\xb1\xad\xd2" -"\x98\xf-\xcf\x98\xf1\xba\x19_\xe1pr\x87\xcb\x85\xd6\x86\xeal\xd5y)2\x84Z$\xdb\xe4" -"V\xf4\x64\x5\xc5\xb9\x30\x8c\x45\xac^\xc3\xb1\xc0\x30\xd2\xd9S\x9fm^\xf8#\x6\x8c" -"uhE\xbc\\\x19\xe2\x4o\\\x85n]@i\xd8\xeG\x80\xfc\x8a:\xab\x82\xe7\x45\xd1\x9b\x96" -"DT:\x82<\x3\xd5\xb4Yx\xf3\x42U\xcd[^\x18|\r\xd6 \xc5R?Vo\x88T\xc7\x9c\xc0VU\xee\xc2" -"\xb1T\xd8\x10W\xdb\xd0\xb1\xa0\x1c\x9dW\x85\x35\x80\x1a\x9cI\xac(\xae\x31\x14\x1d" -"\xb8\n\xcV\x1a\x4\xee\xf8 \xbf\xbf\x82\xd7\xd1S\x82\x45=\x9fh\r\xb1$0\x8a\xf3Xz\x12" -"(+\x17\x5\x3\x1f\x2`\xb1+\xe5\x85\xf5\x66L\x1c\x95[\xb2\xe7t\x8dipL\x82\x8\x66\xf7" -"{\x1b\x8a\xe6j\xc8\x3\xda\n\xd8\x33\x1\x93\xb1?\xadH\xc1zj\nx\xek\xbcp\xd4\x86\x8e" -"\x94\xf8\xa9\x81'\x97\xea\x98\x5u\x16\x86\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30" -"00000000000000000000000000000000000000000000000000000000000\r0000000000000000000" -"000000000000000000000000000000000000000000000\r000000000000000000000000000000000" -"0000000000000000000000000000000\r00000000000000000000000000000000000000000000000" -"00000000000000000\r0000000000000000000000000000000000000000000000000000000000000" -"000\r0000000000000000000000000000000000000000000000000000000000000000\r000000000" -"0000000000000000000000000000000000000000000000000000000\r00000000000000000000000" -"00000000000000000000000000000000000000000\rcleartomark\n\x80\x3" -; -int n019024l_afm_len = 31901; -char* n019024l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusSanL-BoldIt" -"al\nFullName Nimbus Sans L Bold Italic\nFamilyName Nimbus Sans L\nWeight Bold\nI" -"talicAngle -12.0\nIsFixedPitch false\nUnderlinePosition -111\nUnderlineThickness" -" 69\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development" -"\nEncodingScheme AdobeStandardEncoding\nFontBBox -177 -309 1107 953\nCapHeight 7" -"29\nXHeight 540\nDescender -217\nAscender 729\nStartCharMetrics 316\nC 32 ; WX 2" -"78 ; N space ; B 245 0 245 0 ;\nC 33 ; WX 333 ; N exclam ; B 112 0 417 726 ;\nC " -"34 ; WX 474 ; N quotedbl ; B 177 470 579 729 ;\nC 35 ; WX 556 ; N numbersign ; B" -" 33 -32 660 697 ;\nC 36 ; WX 556 ; N dollar ; B 59 -126 628 763 ;\nC 37 ; WX 889" -" ; N percent ; B 129 -20 903 709 ;\nC 38 ; WX 722 ; N ampersand ; B 89 -23 720 7" -"23 ;\nC 39 ; WX 278 ; N quoteright ; B 165 469 356 729 ;\nC 40 ; WX 333 ; N pare" -"nleft ; B 84 -200 458 729 ;\nC 41 ; WX 333 ; N parenright ; B -21 -200 356 729 ;" -"\nC 42 ; WX 389 ; N asterisk ; B 145 407 478 729 ;\nC 43 ; WX 584 ; N plus ; B 8" -"7 -10 596 473 ;\nC 44 ; WX 278 ; N comma ; B 27 -174 245 146 ;\nC 45 ; WX 333 ; " -"N hyphen ; B 70 207 371 342 ;\nC 46 ; WX 278 ; N period ; B 64 0 245 146 ;\nC 47" -" ; WX 278 ; N slash ; B -1 -14 427 714 ;\nC 48 ; WX 556 ; N zero ; B 81 -23 614 " -"724 ;\nC 49 ; WX 556 ; N one ; B 172 0 529 709 ;\nC 50 ; WX 556 ; N two ; B 30 0" -" 628 724 ;\nC 51 ; WX 556 ; N three ; B 67 -23 613 724 ;\nC 52 ; WX 556 ; N four" -" ; B 57 0 599 709 ;\nC 53 ; WX 556 ; N five ; B 59 -23 641 709 ;\nC 54 ; WX 556 " -"; N six ; B 85 -23 625 724 ;\nC 55 ; WX 556 ; N seven ; B 131 0 679 709 ;\nC 56 " -"; WX 556 ; N eight ; B 60 -23 620 724 ;\nC 57 ; WX 556 ; N nine ; B 68 -23 611 7" -"24 ;\nC 58 ; WX 333 ; N colon ; B 113 0 374 520 ;\nC 59 ; WX 333 ; N semicolon ;" -" B 76 -174 374 520 ;\nC 60 ; WX 584 ; N less ; B 77 -10 630 474 ;\nC 61 ; WX 584" -" ; N equal ; B 61 52 622 412 ;\nC 62 ; WX 584 ; N greater ; B 38 -10 591 474 ;\n" -"C 63 ; WX 611 ; N question ; B 168 0 672 744 ;\nC 64 ; WX 975 ; N at ; B 73 -137" -" 1032 745 ;\nC 65 ; WX 722 ; N A ; B 26 0 703 729 ;\nC 66 ; WX 722 ; N B ; B 82 " -"0 762 729 ;\nC 67 ; WX 722 ; N C ; B 107 -23 793 741 ;\nC 68 ; WX 722 ; N D ; B " -"77 0 776 729 ;\nC 69 ; WX 667 ; N E ; B 79 0 762 729 ;\nC 70 ; WX 611 ; N F ; B " -"74 0 741 729 ;\nC 71 ; WX 778 ; N G ; B 107 -23 819 741 ;\nC 72 ; WX 722 ; N H ;" -" B 68 0 812 729 ;\nC 73 ; WX 278 ; N I ; B 63 0 368 729 ;\nC 74 ; WX 556 ; N J ;" -" B 59 -23 641 729 ;\nC 75 ; WX 722 ; N K ; B 74 0 843 729 ;\nC 76 ; WX 611 ; N L" -" ; B 80 0 606 729 ;\nC 77 ; WX 833 ; N M ; B 66 0 931 729 ;\nC 78 ; WX 722 ; N N" -" ; B 68 0 816 729 ;\nC 79 ; WX 778 ; N O ; B 106 -23 828 741 ;\nC 80 ; WX 667 ; " -"N P ; B 76 0 747 729 ;\nC 81 ; WX 778 ; N Q ; B 109 -54 831 741 ;\nC 82 ; WX 722" -" ; N R ; B 80 0 785 729 ;\nC 83 ; WX 667 ; N S ; B 76 -23 725 741 ;\nC 84 ; WX 6" -"11 ; N T ; B 142 0 753 729 ;\nC 85 ; WX 722 ; N U ; B 119 -23 809 729 ;\nC 86 ; " -"WX 667 ; N V ; B 179 0 802 729 ;\nC 87 ; WX 944 ; N W ; B 168 0 1087 729 ;\nC 88" -" ; WX 667 ; N X ; B 22 0 802 729 ;\nC 89 ; WX 667 ; N Y ; B 182 0 805 729 ;\nC 9" -"0 ; WX 611 ; N Z ; B 30 0 733 729 ;\nC 91 ; WX 333 ; N bracketleft ; B 23 -200 4" -"63 729 ;\nC 92 ; WX 278 ; N backslash ; B 138 -23 285 709 ;\nC 93 ; WX 333 ; N b" -"racketright ; B -25 -200 415 729 ;\nC 94 ; WX 584 ; N asciicircum ; B 119 270 58" -"0 695 ;\nC 95 ; WX 556 ; N underscore ; B -65 -145 550 -76 ;\nC 96 ; WX 278 ; N " -"quoteleft ; B 167 469 357 729 ;\nC 97 ; WX 556 ; N a ; B 50 -23 578 549 ;\nC 98 " -"; WX 611 ; N b ; B 59 -23 640 729 ;\nC 99 ; WX 556 ; N c ; B 77 -23 597 549 ;\nC" -" 100 ; WX 611 ; N d ; B 79 -23 700 729 ;\nC 101 ; WX 556 ; N e ; B 64 -23 591 54" -"9 ;\nC 102 ; WX 333 ; N f ; B 90 0 464 729 ;\nC 103 ; WX 611 ; N g ; B 26 -218 6" -"56 549 ;\nC 104 ; WX 611 ; N h ; B 67 0 629 729 ;\nC 105 ; WX 278 ; N i ; B 67 0" -" 362 729 ;\nC 106 ; WX 278 ; N j ; B -43 -218 365 729 ;\nC 107 ; WX 556 ; N k ; " -"B 59 0 651 729 ;\nC 108 ; WX 278 ; N l ; B 67 0 362 729 ;\nC 109 ; WX 889 ; N m " -"; B 60 0 911 549 ;\nC 110 ; WX 611 ; N n ; B 63 0 629 549 ;\nC 111 ; WX 611 ; N " -"o ; B 82 -23 634 549 ;\nC 112 ; WX 611 ; N p ; B 11 -218 637 549 ;\nC 113 ; WX 6" -"11 ; N q ; B 72 -218 659 549 ;\nC 114 ; WX 389 ; N r ; B 63 0 487 549 ;\nC 115 ;" -" WX 556 ; N s ; B 60 -23 589 549 ;\nC 116 ; WX 333 ; N t ; B 101 -23 414 674 ;\n" -"C 117 ; WX 611 ; N u ; B 88 -23 656 540 ;\nC 118 ; WX 556 ; N v ; B 129 0 651 54" -"0 ;\nC 119 ; WX 778 ; N w ; B 120 0 881 540 ;\nC 120 ; WX 556 ; N x ; B 16 0 648" -" 540 ;\nC 121 ; WX 556 ; N y ; B 37 -219 653 540 ;\nC 122 ; WX 500 ; N z ; B 21 " -"0 575 540 ;\nC 123 ; WX 389 ; N braceleft ; B 84 -200 472 729 ;\nC 124 ; WX 280 " -"; N bar ; B 57 -200 335 729 ;\nC 125 ; WX 389 ; N braceright ; B 29 -200 419 729" -" ;\nC 126 ; WX 584 ; N asciitilde ; B 97 142 581 314 ;\nC 161 ; WX 333 ; N excla" -"mdown ; B 26 -186 331 540 ;\nC 162 ; WX 556 ; N cent ; B 79 -124 598 634 ;\nC 16" -"3 ; WX 556 ; N sterling ; B 49 -23 629 715 ;\nC 164 ; WX 167 ; N fraction ; B -1" -"77 -20 489 715 ;\nC 165 ; WX 556 ; N yen ; B 107 0 702 704 ;\nC 166 ; WX 556 ; N" -" florin ; B -21 -220 690 744 ;\nC 167 ; WX 556 ; N section ; B 56 -201 596 723 ;" -"\nC 168 ; WX 556 ; N currency ; B 66 100 644 604 ;\nC 169 ; WX 238 ; N quotesing" -"le ; B 177 470 343 729 ;\nC 170 ; WX 500 ; N quotedblleft ; B 171 469 588 729 ;\n" -"C 171 ; WX 556 ; N guillemotleft ; B 135 72 571 481 ;\nC 172 ; WX 333 ; N guilsi" -"nglleft ; B 128 72 351 481 ;\nC 173 ; WX 333 ; N guilsinglright ; B 96 72 319 48" -"1 ;\nC 174 ; WX 611 ; N fi ; B 85 0 703 729 ;\nC 175 ; WX 611 ; N fl ; B 88 0 70" -"1 729 ;\nC 177 ; WX 556 ; N endash ; B 35 207 624 311 ;\nC 178 ; WX 556 ; N dagg" -"er ; B 109 -194 626 709 ;\nC 179 ; WX 556 ; N daggerdbl ; B 35 -194 623 709 ;\nC" -" 180 ; WX 278 ; N periodcentered ; B 143 182 270 282 ;\nC 182 ; WX 556 ; N parag" -"raph ; B 121 -191 684 729 ;\nC 183 ; WX 350 ; N bullet ; B 111 175 367 425 ;\nC " -"184 ; WX 278 ; N quotesinglbase ; B 37 -135 228 125 ;\nC 185 ; WX 500 ; N quoted" -"blbase ; B 37 -135 462 125 ;\nC 186 ; WX 500 ; N quotedblright ; B 173 469 595 7" -"29 ;\nC 187 ; WX 556 ; N guillemotright ; B 103 72 533 481 ;\nC 188 ; WX 1000 ; " -"N ellipsis ; B 92 0 939 146 ;\nC 189 ; WX 1000 ; N perthousand ; B 72 -21 1021 7" -"39 ;\nC 191 ; WX 611 ; N questiondown ; B 52 -204 556 540 ;\nC 193 ; WX 333 ; N " -"grave ; B 175 607 339 757 ;\nC 194 ; WX 333 ; N acute ; B 247 607 475 757 ;\nC 1" -"95 ; WX 333 ; N circumflex ; B 135 610 453 757 ;\nC 196 ; WX 333 ; N tilde ; B 1" -"17 622 500 744 ;\nC 197 ; WX 333 ; N macron ; B 150 642 467 722 ;\nC 198 ; WX 33" -"3 ; N breve ; B 188 611 455 754 ;\nC 199 ; WX 333 ; N dotaccent ; B 241 621 377 " -"741 ;\nC 200 ; WX 333 ; N dieresis ; B 147 621 469 741 ;\nC 202 ; WX 333 ; N rin" -"g ; B 214 593 398 773 ;\nC 203 ; WX 333 ; N cedilla ; B -13 -220 270 0 ;\nC 205 " -"; WX 333 ; N hungarumlaut ; B 82 610 498 757 ;\nC 206 ; WX 333 ; N ogonek ; B 23" -" -233 248 0 ;\nC 207 ; WX 333 ; N caron ; B 167 610 485 757 ;\nC 208 ; WX 1000 ;" -" N emdash ; B 37 207 1070 311 ;\nC 225 ; WX 1000 ; N AE ; B 1 0 1104 729 ;\nC 22" -"7 ; WX 370 ; N ordfeminine ; B 96 262 451 729 ;\nC 232 ; WX 611 ; N Lslash ; B 5" -"4 0 624 729 ;\nC 233 ; WX 778 ; N Oslash ; B 34 -39 906 749 ;\nC 234 ; WX 1000 ;" -" N OE ; B 90 -23 1107 741 ;\nC 235 ; WX 365 ; N ordmasculine ; B 92 262 471 729 " -";\nC 241 ; WX 889 ; N ae ; B 54 -23 927 549 ;\nC 245 ; WX 278 ; N dotlessi ; B 6" -"7 0 322 540 ;\nC 248 ; WX 278 ; N lslash ; B 50 0 372 729 ;\nC 249 ; WX 611 ; N " -"oslash ; B 12 -38 709 557 ;\nC 250 ; WX 944 ; N oe ; B 71 -23 986 549 ;\nC 251 ;" -" WX 611 ; N germandbls ; B 67 -23 654 729 ;\nC -1 ; WX 722 ; N Udieresis ; B 119" -" -23 809 920 ;\nC -1 ; WX 722 ; N Uacute ; B 119 -23 809 936 ;\nC -1 ; WX 667 ; " -"N Scedilla ; B 76 -220 725 741 ;\nC -1 ; WX 611 ; N Tcaron ; B 142 0 753 936 ;\n" -"C -1 ; WX 667 ; N Scaron ; B 76 -23 725 936 ;\nC -1 ; WX 722 ; N Rcaron ; B 80 0" -" 785 936 ;\nC -1 ; WX 722 ; N Racute ; B 80 0 785 936 ;\nC -1 ; WX 667 ; N Sacut" -"e ; B 76 -23 725 936 ;\nC -1 ; WX 778 ; N Otilde ; B 106 -23 828 923 ;\nC -1 ; W" -"X 611 ; N ucircumflex ; B 88 -23 656 757 ;\nC -1 ; WX 778 ; N Ohungarumlaut ; B " -"106 -23 841 936 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; B 119 -23 809 936 ;\nC -1 ;" -" WX 667 ; N Yacute ; B 182 0 805 936 ;\nC -1 ; WX 722 ; N Eth ; B 73 0 776 729 ;" -"\nC -1 ; WX 722 ; N Dcroat ; B 73 0 776 729 ;\nC -1 ; WX 611 ; N Zacute ; B 30 0" -" 733 936 ;\nC -1 ; WX 722 ; N Uring ; B 119 -23 809 953 ;\nC -1 ; WX 611 ; N gbr" -"eve ; B 26 -218 656 754 ;\nC -1 ; WX 556 ; N eogonek ; B 64 -233 591 549 ;\nC -1" -" ; WX 556 ; N edotaccent ; B 64 -23 591 741 ;\nC -1 ; WX 556 ; N ecaron ; B 64 -" -"23 593 757 ;\nC -1 ; WX 722 ; N Ugrave ; B 119 -23 809 936 ;\nC -1 ; WX 667 ; N " -"Thorn ; B 76 0 721 729 ;\nC -1 ; WX 556 ; N eacute ; B 64 -23 591 757 ;\nC -1 ; " -"WX 556 ; N edieresis ; B 64 -23 591 741 ;\nC -1 ; WX 722 ; N dcaron ; B 79 -23 8" -"82 729 ;\nC -1 ; WX 556 ; N ccedilla ; B 77 -220 597 549 ;\nC -1 ; WX 556 ; N cc" -"aron ; B 77 -23 607 757 ;\nC -1 ; WX 556 ; N cacute ; B 77 -23 597 757 ;\nC -1 ;" -" WX 556 ; N aogonek ; B 50 -233 578 549 ;\nC -1 ; WX 556 ; N aring ; B 50 -23 57" -"8 773 ;\nC -1 ; WX 556 ; N atilde ; B 50 -23 612 744 ;\nC -1 ; WX 556 ; N abreve" -" ; B 50 -23 578 754 ;\nC -1 ; WX 556 ; N egrave ; B 64 -23 591 757 ;\nC -1 ; WX " -"556 ; N agrave ; B 50 -23 578 757 ;\nC -1 ; WX 556 ; N aacute ; B 50 -23 587 757" -" ;\nC -1 ; WX 556 ; N adieresis ; B 50 -23 581 741 ;\nC -1 ; WX 722 ; N Uogonek " -"; B 119 -233 809 729 ;\nC -1 ; WX 611 ; N ugrave ; B 88 -23 656 757 ;\nC -1 ; WX" -" 611 ; N uacute ; B 88 -23 656 757 ;\nC -1 ; WX 611 ; N udieresis ; B 88 -23 656" -" 741 ;\nC -1 ; WX 404 ; N tcaron ; B 101 -23 578 829 ;\nC -1 ; WX 556 ; N scomma" -"accent ; B 60 -307 589 549 ;\nC -1 ; WX 611 ; N Zcaron ; B 30 0 733 936 ;\nC -1 " -"; WX 556 ; N ecircumflex ; B 64 -23 591 757 ;\nC -1 ; WX 722 ; N Ucircumflex ; B" -" 119 -23 809 936 ;\nC -1 ; WX 556 ; N acircumflex ; B 50 -23 578 757 ;\nC -1 ; W" -"X 611 ; N Zdotaccent ; B 30 0 733 918 ;\nC -1 ; WX 556 ; N scaron ; B 60 -23 597" -" 757 ;\nC -1 ; WX 722 ; N Amacron ; B 26 0 706 901 ;\nC -1 ; WX 556 ; N sacute ;" -" B 60 -23 589 757 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 142 -307 753 729 ;\nC -1" -" ; WX 667 ; N Ydieresis ; B 182 0 805 920 ;\nC -1 ; WX 611 ; N thorn ; B 11 -218" -" 637 729 ;\nC -1 ; WX 667 ; N Emacron ; B 79 0 762 901 ;\nC -1 ; WX 778 ; N Ogra" -"ve ; B 106 -23 828 936 ;\nC -1 ; WX 778 ; N Oacute ; B 106 -23 828 936 ;\nC -1 ;" -" WX 778 ; N Odieresis ; B 106 -23 828 920 ;\nC -1 ; WX 722 ; N Ntilde ; B 68 0 8" -"16 923 ;\nC -1 ; WX 722 ; N Ncaron ; B 68 0 816 936 ;\nC -1 ; WX 722 ; N Nacute " -"; B 68 0 816 936 ;\nC -1 ; WX 611 ; N Lcaron ; B 80 0 607 729 ;\nC -1 ; WX 611 ;" -" N Lacute ; B 80 0 606 936 ;\nC -1 ; WX 278 ; N Idotaccent ; B 63 0 388 918 ;\nC" -" -1 ; WX 389 ; N racute ; B 63 0 500 757 ;\nC -1 ; WX 278 ; N Icircumflex ; B 63" -" 0 467 936 ;\nC -1 ; WX 611 ; N ohungarumlaut ; B 82 -23 710 757 ;\nC -1 ; WX 61" -"1 ; N otilde ; B 82 -23 639 744 ;\nC -1 ; WX 556 ; N Euro ; B 21 -23 648 724 ;\n" -"C -1 ; WX 611 ; N ocircumflex ; B 82 -23 634 757 ;\nC -1 ; WX 444 ; N onesuperio" -"r ; B 210 284 438 709 ;\nC -1 ; WX 444 ; N twosuperior ; B 124 284 499 718 ;\nC " -"-1 ; WX 444 ; N threesuperior ; B 147 271 490 718 ;\nC -1 ; WX 278 ; N Igrave ; " -"B 63 0 368 936 ;\nC -1 ; WX 278 ; N Iacute ; B 63 0 489 936 ;\nC -1 ; WX 278 ; N" -" Imacron ; B 63 0 466 901 ;\nC -1 ; WX 278 ; N Iogonek ; B 7 -233 368 729 ;\nC -" -"1 ; WX 278 ; N Idieresis ; B 63 0 483 920 ;\nC -1 ; WX 778 ; N Gbreve ; B 107 -2" -"3 819 934 ;\nC -1 ; WX 722 ; N Umacron ; B 119 -23 809 901 ;\nC -1 ; WX 722 ; N " -"Kcommaaccent ; B 74 -307 843 729 ;\nC -1 ; WX 611 ; N ograve ; B 82 -23 634 757 " -";\nC -1 ; WX 667 ; N Scommaaccent ; B 76 -307 725 741 ;\nC -1 ; WX 667 ; N Eogon" -"ek ; B 79 -233 762 729 ;\nC -1 ; WX 611 ; N oacute ; B 82 -23 634 757 ;\nC -1 ; " -"WX 667 ; N Edotaccent ; B 79 0 762 918 ;\nC -1 ; WX 268 ; N iogonek ; B 0 -233 3" -"51 729 ;\nC -1 ; WX 611 ; N gcommaaccent ; B 26 -218 656 854 ;\nC -1 ; WX 611 ; " -"N odieresis ; B 82 -23 634 741 ;\nC -1 ; WX 611 ; N ntilde ; B 63 0 646 744 ;\nC" -" -1 ; WX 611 ; N ncaron ; B 63 0 629 757 ;\nC -1 ; WX 667 ; N Ecaron ; B 79 0 76" -"2 936 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 79 0 762 936 ;\nC -1 ; WX 556 ; N sce" -"dilla ; B 60 -220 589 549 ;\nC -1 ; WX 389 ; N rcaron ; B 63 0 533 757 ;\nC -1 ;" -" WX 667 ; N Egrave ; B 79 0 762 936 ;\nC -1 ; WX 667 ; N Eacute ; B 79 0 762 936" -" ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 107 -307 819 741 ;\nC -1 ; WX 722 ; N Rco" -"mmaaccent ; B 80 -307 785 729 ;\nC -1 ; WX 667 ; N Edieresis ; B 79 0 762 920 ;\n" -"C -1 ; WX 611 ; N nacute ; B 63 0 629 757 ;\nC -1 ; WX 611 ; N uogonek ; B 88 -2" -"33 656 540 ;\nC -1 ; WX 611 ; N umacron ; B 88 -23 656 722 ;\nC -1 ; WX 722 ; N " -"Dcaron ; B 77 0 776 936 ;\nC -1 ; WX 384 ; N lcaron ; B 67 0 544 729 ;\nC -1 ; W" -"X 722 ; N Ccaron ; B 107 -23 793 936 ;\nC -1 ; WX 722 ; N Cacute ; B 107 -23 793" -" 936 ;\nC -1 ; WX 722 ; N Ccedilla ; B 107 -220 793 741 ;\nC -1 ; WX 606 ; N deg" -"ree ; B 240 383 543 686 ;\nC -1 ; WX 722 ; N Aogonek ; B 26 -233 703 729 ;\nC -1" -" ; WX 584 ; N minus ; B 77 172 606 292 ;\nC -1 ; WX 584 ; N multiply ; B 102 18 " -"582 444 ;\nC -1 ; WX 584 ; N divide ; B 77 0 606 462 ;\nC -1 ; WX 722 ; N Aring " -"; B 26 0 703 953 ;\nC -1 ; WX 1000 ; N trademark ; B 213 273 1087 729 ;\nC -1 ; " -"WX 389 ; N rcommaaccent ; B 8 -307 487 549 ;\nC -1 ; WX 278 ; N lacute ; B 67 0 " -"474 936 ;\nC -1 ; WX 611 ; N omacron ; B 82 -23 634 722 ;\nC -1 ; WX 722 ; N Ati" -"lde ; B 26 0 739 923 ;\nC -1 ; WX 278 ; N icircumflex ; B 67 0 426 757 ;\nC -1 ;" -" WX 278 ; N igrave ; B 67 0 322 757 ;\nC -1 ; WX 611 ; N ncommaaccent ; B 63 -30" -"7 629 549 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 11 -307 362 729 ;\nC -1 ; WX 584" -" ; N plusminus ; B 50 0 630 633 ;\nC -1 ; WX 1055 ; N onehalf ; B 210 -20 1050 7" -"15 ;\nC -1 ; WX 1055 ; N onequarter ; B 210 -20 1032 715 ;\nC -1 ; WX 1055 ; N t" -"hreequarters ; B 147 -20 1032 718 ;\nC -1 ; WX 278 ; N iacute ; B 67 0 448 757 ;" -"\nC -1 ; WX 722 ; N Abreve ; B 26 0 703 934 ;\nC -1 ; WX 556 ; N kcommaaccent ; " -"B 59 -307 651 729 ;\nC -1 ; WX 778 ; N Omacron ; B 106 -23 828 901 ;\nC -1 ; WX " -"278 ; N imacron ; B 67 0 424 722 ;\nC -1 ; WX 556 ; N emacron ; B 64 -23 591 722" -" ;\nC -1 ; WX 556 ; N amacron ; B 50 -23 579 722 ;\nC -1 ; WX 333 ; N tcommaacce" -"nt ; B 62 -307 414 674 ;\nC -1 ; WX 556 ; N ydieresis ; B 37 -219 653 741 ;\nC -" -"1 ; WX 500 ; N zdotaccent ; B 21 0 575 741 ;\nC -1 ; WX 500 ; N zcaron ; B 21 0 " -"575 757 ;\nC -1 ; WX 500 ; N zacute ; B 21 0 575 757 ;\nC -1 ; WX 556 ; N yacute" -" ; B 37 -219 653 757 ;\nC -1 ; WX 611 ; N uhungarumlaut ; B 88 -23 697 757 ;\nC " -"-1 ; WX 611 ; N eth ; B 83 -23 633 744 ;\nC -1 ; WX 611 ; N uring ; B 88 -23 656" -" 773 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 106 -23 828 936 ;\nC -1 ; WX 333 ; N c" -"ommaaccent ; B 43 -307 217 -60 ;\nC -1 ; WX 737 ; N copyright ; B 54 -22 837 743" -" ;\nC -1 ; WX 737 ; N registered ; B 55 -22 837 743 ;\nC -1 ; WX 722 ; N Acircum" -"flex ; B 26 0 703 936 ;\nC -1 ; WX 278 ; N idieresis ; B 67 0 442 741 ;\nC -1 ; " -"WX 489 ; N lozenge ; B 95 0 541 744 ;\nC -1 ; WX 729 ; N Delta ; B 8 0 721 729 ;" -"\nC -1 ; WX 584 ; N notequal ; B 61 -74 622 544 ;\nC -1 ; WX 542 ; N radical ; B" -" 102 -36 705 913 ;\nC -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ;\nC -1 ; WX 722 ;" -" N Aacute ; B 26 0 714 936 ;\nC -1 ; WX 584 ; N lessequal ; B 35 0 657 624 ;\nC " -"-1 ; WX 584 ; N greaterequal ; B 44 0 627 624 ;\nC -1 ; WX 584 ; N logicalnot ; " -"B 103 86 632 376 ;\nC -1 ; WX 711 ; N summation ; B -18 -97 760 760 ;\nC -1 ; WX" -" 490 ; N partialdiff ; B 22 -15 458 750 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 68" -" -307 816 729 ;\nC -1 ; WX 611 ; N dcroat ; B 79 -23 746 729 ;\nC -1 ; WX 280 ; " -"N brokenbar ; B 57 -200 335 729 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 80 -309 60" -"6 729 ;\nC -1 ; WX 722 ; N Adieresis ; B 26 0 708 920 ;\nC -1 ; WX 611 ; N mu ; " -"B 11 -220 655 540 ;\nC -1 ; WX 278 ; N .notdef ; B 245 0 245 0 ;\nEndCharMetrics" -"\nStartKernData\nStartKernPairs 998\nKPX A C -36\nKPX A Ccedilla -36\nKPX A G -3" -"8\nKPX A O -37\nKPX A Odieresis -37\nKPX A Q -39\nKPX A T -91\nKPX A U -37\nKPX " -"A Uacute -37\nKPX A Ucircumflex -37\nKPX A Udieresis -37\nKPX A Ugrave -37\nKPX " -"A V -74\nKPX A W -57\nKPX A Y -96\nKPX A a -11\nKPX A b -10\nKPX A c -17\nKPX A " -"ccedilla -17\nKPX A comma 9\nKPX A d -17\nKPX A e -10\nKPX A g -20\nKPX A guille" -"motleft -48\nKPX A guilsinglleft -44\nKPX A hyphen 2\nKPX A o -19\nKPX A period " -"13\nKPX A q -13\nKPX A quotedblright -71\nKPX A quoteright -67\nKPX A t -21\nKPX" -" A u -17\nKPX A v -42\nKPX A w -28\nKPX A y -41\nKPX Aacute C -37\nKPX Aacute G " -"-38\nKPX Aacute O -38\nKPX Aacute Q -40\nKPX Aacute T -91\nKPX Aacute U -38\nKPX" -" Aacute V -74\nKPX Aacute W -57\nKPX Aacute Y -96\nKPX Aacute a -11\nKPX Aacute " -"b -10\nKPX Aacute c -17\nKPX Aacute comma 9\nKPX Aacute d -17\nKPX Aacute e -11\n" -"KPX Aacute g -20\nKPX Aacute guillemotleft -48\nKPX Aacute guilsinglleft -45\nKP" -"X Aacute hyphen 2\nKPX Aacute o -20\nKPX Aacute period 12\nKPX Aacute q -14\nKPX" -" Aacute quoteright -67\nKPX Aacute t -22\nKPX Aacute u -18\nKPX Aacute v -42\nKP" -"X Aacute w -29\nKPX Aacute y -41\nKPX Acircumflex C -36\nKPX Acircumflex G -38\n" -"KPX Acircumflex O -37\nKPX Acircumflex Q -39\nKPX Acircumflex T -91\nKPX Acircum" -"flex U -37\nKPX Acircumflex V -74\nKPX Acircumflex W -57\nKPX Acircumflex Y -96\n" -"KPX Acircumflex comma 9\nKPX Acircumflex period 13\nKPX Adieresis C -37\nKPX Adi" -"eresis G -38\nKPX Adieresis O -38\nKPX Adieresis Q -39\nKPX Adieresis T -91\nKPX" -" Adieresis U -38\nKPX Adieresis V -74\nKPX Adieresis W -57\nKPX Adieresis Y -96\n" -"KPX Adieresis a -11\nKPX Adieresis b -10\nKPX Adieresis c -17\nKPX Adieresis com" -"ma 9\nKPX Adieresis d -17\nKPX Adieresis g -20\nKPX Adieresis guillemotleft -48\n" -"KPX Adieresis guilsinglleft -44\nKPX Adieresis hyphen 2\nKPX Adieresis o -20\nKP" -"X Adieresis period 12\nKPX Adieresis q -13\nKPX Adieresis quotedblright -71\nKPX" -" Adieresis quoteright -67\nKPX Adieresis t -22\nKPX Adieresis u -17\nKPX Adieres" -"is v -42\nKPX Adieresis w -28\nKPX Adieresis y -41\nKPX Agrave C -36\nKPX Agrave" -" G -38\nKPX Agrave O -37\nKPX Agrave Q -39\nKPX Agrave T -91\nKPX Agrave U -37\n" -"KPX Agrave V -74\nKPX Agrave W -57\nKPX Agrave Y -96\nKPX Agrave comma 9\nKPX Ag" -"rave period 13\nKPX Aring C -36\nKPX Aring G -38\nKPX Aring O -37\nKPX Aring Q -" -"39\nKPX Aring T -91\nKPX Aring U -37\nKPX Aring V -74\nKPX Aring W -57\nKPX Arin" -"g Y -96\nKPX Aring a -11\nKPX Aring b -10\nKPX Aring c -17\nKPX Aring comma 9\nK" -"PX Aring d -17\nKPX Aring e -10\nKPX Aring g -20\nKPX Aring guillemotleft -48\nK" -"PX Aring guilsinglleft -44\nKPX Aring hyphen 2\nKPX Aring o -19\nKPX Aring perio" -"d 13\nKPX Aring q -13\nKPX Aring quotedblright -71\nKPX Aring quoteright -67\nKP" -"X Aring t -21\nKPX Aring u -17\nKPX Aring v -42\nKPX Aring w -28\nKPX Aring y -4" -"1\nKPX Atilde C -38\nKPX Atilde G -40\nKPX Atilde O -39\nKPX Atilde Q -41\nKPX A" -"tilde T -92\nKPX Atilde U -39\nKPX Atilde V -74\nKPX Atilde W -57\nKPX Atilde Y " -"-96\nKPX Atilde comma 9\nKPX Atilde period 11\nKPX B A -41\nKPX B AE -30\nKPX B " -"Aacute -41\nKPX B Acircumflex -41\nKPX B Adieresis -41\nKPX B Aring -41\nKPX B A" -"tilde -41\nKPX B O -18\nKPX B OE -9\nKPX B Oacute -18\nKPX B Ocircumflex -18\nKP" -"X B Odieresis -18\nKPX B Ograve -18\nKPX B Oslash -17\nKPX B V -46\nKPX B W -30\n" -"KPX B Y -63\nKPX C A -34\nKPX C AE -23\nKPX C Aacute -34\nKPX C Adieresis -34\nK" -"PX C Aring -34\nKPX C H -1\nKPX C K -4\nKPX C O -12\nKPX C Oacute -12\nKPX C Odi" -"eresis -12\nKPX Ccedilla A -34\nKPX D A -40\nKPX D Aacute -40\nKPX D Acircumflex" -" -40\nKPX D Adieresis -40\nKPX D Agrave -40\nKPX D Aring -40\nKPX D Atilde -40\n" -"KPX D J -4\nKPX D T -24\nKPX D V -37\nKPX D W -20\nKPX D X -40\nKPX D Y -62\nKPX" -" F A -68\nKPX F Aacute -68\nKPX F Acircumflex -68\nKPX F Adieresis -68\nKPX F Ag" -"rave -68\nKPX F Aring -68\nKPX F Atilde -68\nKPX F J -33\nKPX F O -24\nKPX F Odi" -"eresis -24\nKPX F a -23\nKPX F aacute -23\nKPX F adieresis -23\nKPX F ae -26\nKP" -"X F aring -23\nKPX F comma -84\nKPX F e -12\nKPX F eacute -12\nKPX F hyphen 4\nK" -"PX F i -15\nKPX F j -17\nKPX F o -21\nKPX F oacute -21\nKPX F odieresis -21\nKPX" -" F oe -16\nKPX F oslash -24\nKPX F period -82\nKPX F r -35\nKPX F u -32\nKPX G A" -" -17\nKPX G AE -5\nKPX G Aacute -17\nKPX G Acircumflex -17\nKPX G Adieresis -17\n" -"KPX G Agrave -17\nKPX G Aring -17\nKPX G Atilde -17\nKPX G T -28\nKPX G V -41\nK" -"PX G W -25\nKPX G Y -65\nKPX J A -38\nKPX J AE -29\nKPX J Adieresis -38\nKPX J A" -"ring -38\nKPX K C -59\nKPX K G -61\nKPX K O -60\nKPX K OE -51\nKPX K Oacute -60\n" -"KPX K Odieresis -60\nKPX K S -45\nKPX K T 5\nKPX K a -17\nKPX K adieresis -17\nK" -"PX K ae -17\nKPX K aring -17\nKPX K e -38\nKPX K hyphen -52\nKPX K o -45\nKPX K " -"oacute -45\nKPX K odieresis -45\nKPX K u -35\nKPX K udieresis -35\nKPX K y -74\n" -"KPX L A 0\nKPX L AE 12\nKPX L Aacute 0\nKPX L Adieresis 0\nKPX L Aring 0\nKPX L " -"C -35\nKPX L Ccedilla -36\nKPX L G -40\nKPX L O -39\nKPX L Oacute -39\nKPX L Oci" -"rcumflex -39\nKPX L Odieresis -39\nKPX L Ograve -39\nKPX L Otilde -39\nKPX L S -" -"14\nKPX L T -104\nKPX L U -35\nKPX L Udieresis -35\nKPX L V -102\nKPX L W -79\nK" -"PX L Y -121\nKPX L hyphen -20\nKPX L quotedblright -147\nKPX L quoteright -143\n" -"KPX L u -17\nKPX L udieresis -17\nKPX L y -64\nKPX N A -15\nKPX N AE -2\nKPX N A" -"acute -15\nKPX N Adieresis -15\nKPX N Aring -15\nKPX N C -1\nKPX N Ccedilla -1\n" -"KPX N G -2\nKPX N O -2\nKPX N Oacute -2\nKPX N Odieresis -2\nKPX N a 5\nKPX N aa" -"cute 5\nKPX N adieresis 5\nKPX N ae 4\nKPX N aring 5\nKPX N comma 7\nKPX N e 10\n" -"KPX N eacute 10\nKPX N o 1\nKPX N oacute 1\nKPX N odieresis 1\nKPX N oslash 2\nK" -"PX N period 8\nKPX N u 4\nKPX N udieresis 4\nKPX O A -42\nKPX O AE -33\nKPX O Aa" -"cute -42\nKPX O Adieresis -42\nKPX O Aring -42\nKPX O T -32\nKPX O V -40\nKPX O " -"W -24\nKPX O X -43\nKPX O Y -65\nKPX Oacute A -42\nKPX Oacute T -32\nKPX Oacute " -"V -40\nKPX Oacute W -24\nKPX Oacute Y -65\nKPX Ocircumflex T -32\nKPX Ocircumfle" -"x V -40\nKPX Ocircumflex Y -65\nKPX Odieresis A -42\nKPX Odieresis T -32\nKPX Od" -"ieresis V -40\nKPX Odieresis W -24\nKPX Odieresis X -43\nKPX Odieresis Y -65\nKP" -"X Ograve T -32\nKPX Ograve V -40\nKPX Ograve Y -65\nKPX Oslash A -34\nKPX Otilde" -" T -32\nKPX Otilde V -40\nKPX Otilde Y -65\nKPX P A -71\nKPX P AE -62\nKPX P Aac" -"ute -71\nKPX P Adieresis -71\nKPX P Aring -71\nKPX P J -52\nKPX P a -14\nKPX P a" -"acute -14\nKPX P adieresis -14\nKPX P ae -15\nKPX P aring -14\nKPX P comma -103\n" -"KPX P e -13\nKPX P eacute -13\nKPX P hyphen -7\nKPX P o -22\nKPX P oacute -22\nK" -"PX P odieresis -22\nKPX P oe -17\nKPX P oslash -26\nKPX P period -101\nKPX R C -" -"12\nKPX R Ccedilla -12\nKPX R G -13\nKPX R O -13\nKPX R OE -3\nKPX R Oacute -13\n" -"KPX R Odieresis -13\nKPX R T -12\nKPX R U -12\nKPX R Udieresis -12\nKPX R V -38\n" -"KPX R W -22\nKPX R Y -50\nKPX R a -4\nKPX R aacute -4\nKPX R adieresis -4\nKPX R" -" ae -5\nKPX R aring -4\nKPX R e 0\nKPX R eacute 0\nKPX R hyphen 10\nKPX R o -9\n" -"KPX R oacute -9\nKPX R odieresis -9\nKPX R oe -4\nKPX R u -6\nKPX R uacute -6\nK" -"PX R udieresis -6\nKPX R y -4\nKPX S A -26\nKPX S AE -14\nKPX S Aacute -26\nKPX " -"S Adieresis -26\nKPX S Aring -26\nKPX S T -15\nKPX S V -36\nKPX S W -20\nKPX S Y" -" -54\nKPX S t -4\nKPX T A -93\nKPX T AE -85\nKPX T Aacute -93\nKPX T Acircumflex" -" -93\nKPX T Adieresis -93\nKPX T Agrave -93\nKPX T Aring -93\nKPX T Atilde -93\n" -"KPX T C -29\nKPX T G -30\nKPX T J -95\nKPX T O -30\nKPX T OE -20\nKPX T Oacute -" -"30\nKPX T Ocircumflex -30\nKPX T Odieresis -30\nKPX T Ograve -30\nKPX T Oslash -" -"36\nKPX T Otilde -30\nKPX T S -7\nKPX T V 9\nKPX T W 15\nKPX T Y 7\nKPX T a -77\n" -"KPX T ae -78\nKPX T c -79\nKPX T colon -104\nKPX T comma -75\nKPX T e -72\nKPX T" -" g -79\nKPX T guillemotleft -107\nKPX T guilsinglleft -103\nKPX T hyphen -53\nKP" -"X T i -9\nKPX T j -11\nKPX T o -81\nKPX T oslash -80\nKPX T period -73\nKPX T r " -"-76\nKPX T s -81\nKPX T semicolon -105\nKPX T u -78\nKPX T v -91\nKPX T w -85\nK" -"PX T y -89\nKPX U A -40\nKPX U AE -30\nKPX U Aacute -40\nKPX U Acircumflex -40\n" -"KPX U Adieresis -40\nKPX U Aring -40\nKPX U Atilde -40\nKPX U comma -17\nKPX U m" -" -3\nKPX U n -5\nKPX U p -3\nKPX U period -12\nKPX U r -5\nKPX Uacute A -40\nKPX" -" Uacute comma -17\nKPX Uacute m -3\nKPX Uacute n -5\nKPX Uacute p -3\nKPX Uacute" -" period -12\nKPX Uacute r -5\nKPX Ucircumflex A -40\nKPX Udieresis A -40\nKPX Ud" -"ieresis b -4\nKPX Udieresis comma -17\nKPX Udieresis m -3\nKPX Udieresis n -5\nK" -"PX Udieresis p -3\nKPX Udieresis period -12\nKPX Udieresis r -5\nKPX Ugrave A -4" -"0\nKPX V A -75\nKPX V AE -65\nKPX V Aacute -75\nKPX V Acircumflex -75\nKPX V Adi" -"eresis -75\nKPX V Agrave -75\nKPX V Aring -75\nKPX V Atilde -75\nKPX V C -43\nKP" -"X V G -44\nKPX V O -44\nKPX V Oacute -44\nKPX V Ocircumflex -44\nKPX V Odieresis" -" -44\nKPX V Ograve -44\nKPX V Oslash -42\nKPX V Otilde -44\nKPX V S -31\nKPX V T" -" 12\nKPX V a -51\nKPX V ae -52\nKPX V colon -74\nKPX V comma -76\nKPX V e -46\nK" -"PX V g -54\nKPX V guillemotleft -81\nKPX V guilsinglleft -77\nKPX V hyphen -26\n" -"KPX V i -13\nKPX V o -56\nKPX V oslash -55\nKPX V period -74\nKPX V r -43\nKPX V" -" semicolon -77\nKPX V u -42\nKPX V y -19\nKPX W A -59\nKPX W AE -50\nKPX W Aacut" -"e -59\nKPX W Acircumflex -59\nKPX W Adieresis -59\nKPX W Agrave -59\nKPX W Aring" -" -59\nKPX W Atilde -59\nKPX W C -28\nKPX W G -29\nKPX W O -29\nKPX W Oacute -29\n" -"KPX W Ocircumflex -29\nKPX W Odieresis -29\nKPX W Ograve -29\nKPX W Oslash -27\n" -"KPX W Otilde -29\nKPX W S -22\nKPX W T 16\nKPX W a -34\nKPX W ae -34\nKPX W colo" -"n -61\nKPX W comma -53\nKPX W e -28\nKPX W g -36\nKPX W guillemotleft -63\nKPX W" -" guilsinglleft -59\nKPX W hyphen -9\nKPX W i -9\nKPX W o -38\nKPX W oslash -37\n" -"KPX W period -51\nKPX W r -33\nKPX W semicolon -63\nKPX W u -32\nKPX W y -9\nKPX" -" X C -39\nKPX X O -40\nKPX X Odieresis -40\nKPX X Q -43\nKPX X a -17\nKPX X e -3" -"3\nKPX X hyphen -33\nKPX X o -43\nKPX X u -35\nKPX X y -48\nKPX Y A -91\nKPX Y A" -"E -81\nKPX Y Aacute -91\nKPX Y Acircumflex -91\nKPX Y Adieresis -91\nKPX Y Agrav" -"e -91\nKPX Y Aring -91\nKPX Y Atilde -91\nKPX Y C -60\nKPX Y G -61\nKPX Y O -61\n" -"KPX Y Oacute -61\nKPX Y Ocircumflex -61\nKPX Y Odieresis -61\nKPX Y Ograve -61\n" -"KPX Y Oslash -58\nKPX Y Otilde -61\nKPX Y S -39\nKPX Y T 14\nKPX Y a -71\nKPX Y " -"ae -71\nKPX Y colon -90\nKPX Y comma -85\nKPX Y e -66\nKPX Y g -73\nKPX Y guille" -"motleft -105\nKPX Y guilsinglleft -101\nKPX Y hyphen -55\nKPX Y i -11\nKPX Y o -" -"76\nKPX Y oslash -74\nKPX Y p -53\nKPX Y period -84\nKPX Y semicolon -93\nKPX Y " -"u -57\nKPX Y v -36\nKPX Z v -21\nKPX Z y -19\nKPX a j -7\nKPX a quoteright -14\n" -"KPX a v -23\nKPX a w -10\nKPX a y -24\nKPX aacute v -23\nKPX aacute w -10\nKPX a" -"acute y -24\nKPX adieresis v -23\nKPX adieresis w -10\nKPX adieresis y -24\nKPX " -"ae v -21\nKPX ae w -7\nKPX ae y -23\nKPX agrave v -23\nKPX agrave w -10\nKPX agr" -"ave y -24\nKPX aring v -23\nKPX aring w -10\nKPX aring y -24\nKPX b v -23\nKPX b" -" w -9\nKPX b y -25\nKPX c h -9\nKPX c k -5\nKPX comma one -79\nKPX comma quotedb" -"lright -39\nKPX comma quoteright -35\nKPX e quoteright -13\nKPX e t -9\nKPX e v " -"-22\nKPX e w -9\nKPX e x -25\nKPX e y -25\nKPX eacute v -22\nKPX eacute w -9\nKP" -"X eacute y -25\nKPX ecircumflex v -22\nKPX ecircumflex w -9\nKPX ecircumflex y -" -"25\nKPX eight four 2\nKPX eight one -32\nKPX eight seven -15\nKPX f a -6\nKPX f " -"aacute -6\nKPX f adieresis -6\nKPX f ae -6\nKPX f aring -6\nKPX f e -6\nKPX f ea" -"cute -6\nKPX f f 14\nKPX f i -13\nKPX f j -15\nKPX f l -13\nKPX f o -16\nKPX f o" -"acute -16\nKPX f odieresis -16\nKPX f oe -11\nKPX f oslash -16\nKPX f quoteright" -" 0\nKPX f s -10\nKPX f t 14\nKPX five four -3\nKPX five one -37\nKPX five seven " -"-17\nKPX four four 0\nKPX four one -55\nKPX four seven -33\nKPX g a -3\nKPX g ad" -"ieresis -3\nKPX g ae -4\nKPX g aring -3\nKPX g e 1\nKPX g eacute 1\nKPX g l -5\n" -"KPX g oacute -8\nKPX g odieresis -8\nKPX g r -3\nKPX guillemotright A -56\nKPX g" -"uillemotright AE -46\nKPX guillemotright Aacute -56\nKPX guillemotright Adieresi" -"s -56\nKPX guillemotright Aring -56\nKPX guillemotright T -115\nKPX guillemotrig" -"ht V -84\nKPX guillemotright W -65\nKPX guillemotright Y -117\nKPX guilsinglrigh" -"t A -52\nKPX guilsinglright AE -42\nKPX guilsinglright Aacute -52\nKPX guilsingl" -"right Adieresis -52\nKPX guilsinglright Aring -52\nKPX guilsinglright T -110\nKP" -"X guilsinglright V -79\nKPX guilsinglright W -60\nKPX guilsinglright Y -113\nKPX" -" h quoteright -15\nKPX h y -25\nKPX hyphen A -7\nKPX hyphen AE 2\nKPX hyphen Aac" -"ute -7\nKPX hyphen Adieresis -7\nKPX hyphen Aring -7\nKPX hyphen T -64\nKPX hyph" -"en V -34\nKPX hyphen W -15\nKPX hyphen Y -71\nKPX i T -12\nKPX i j -7\nKPX k a -" -"13\nKPX k aacute -13\nKPX k adieresis -13\nKPX k ae -15\nKPX k aring -13\nKPX k " -"comma -3\nKPX k e -19\nKPX k eacute -19\nKPX k g -26\nKPX k hyphen -31\nKPX k o " -"-28\nKPX k oacute -28\nKPX k odieresis -28\nKPX k period -3\nKPX k s -23\nKPX k " -"u -8\nKPX k udieresis -8\nKPX l v -14\nKPX l y -11\nKPX m p -1\nKPX m v -23\nKPX" -" m w -9\nKPX m y -23\nKPX n T -87\nKPX n p -2\nKPX n quoteright -15\nKPX n v -24" -"\nKPX n w -11\nKPX n y -25\nKPX nine four -6\nKPX nine one -30\nKPX nine seven -" -"23\nKPX o T -90\nKPX o quoteright -19\nKPX o t -13\nKPX o v -27\nKPX o w -13\nKP" -"X o x -30\nKPX o y -29\nKPX oacute v -27\nKPX oacute w -13\nKPX oacute y -29\nKP" -"X ocircumflex t -13\nKPX odieresis t -13\nKPX odieresis v -27\nKPX odieresis w -" -"13\nKPX odieresis x -30\nKPX odieresis y -29\nKPX ograve v -27\nKPX ograve w -13" -"\nKPX ograve y -29\nKPX one comma -51\nKPX one eight -47\nKPX one five -50\nKPX " -"one four -70\nKPX one nine -47\nKPX one one -92\nKPX one period -49\nKPX one sev" -"en -72\nKPX one six -48\nKPX one three -53\nKPX one two -56\nKPX one zero -44\nK" -"PX p t -10\nKPX p y -25\nKPX period one -80\nKPX period quotedblright -39\nKPX p" -"eriod quoteright -35\nKPX q c -3\nKPX q u -3\nKPX quotedblbase A 7\nKPX quotedbl" -"base AE 19\nKPX quotedblbase T -79\nKPX quotedblbase V -77\nKPX quotedblbase W -" -"54\nKPX quotedblbase Y -96\nKPX quotedblleft A -72\nKPX quotedblleft AE -64\nKPX" -" quotedblleft Aacute -72\nKPX quotedblleft Adieresis -72\nKPX quotedblleft Aring" -" -72\nKPX quotedblleft T -11\nKPX quotedblleft V 0\nKPX quotedblleft W 9\nKPX qu" -"otedblleft Y -15\nKPX quotedblright A -72\nKPX quotedblright AE -64\nKPX quotedb" -"lright Aacute -72\nKPX quotedblright Adieresis -72\nKPX quotedblright Aring -72\n" -"KPX quotedblright T -7\nKPX quotedblright V 1\nKPX quotedblright W 11\nKPX quote" -"dblright Y -14\nKPX quoteleft A -76\nKPX quoteleft AE -69\nKPX quoteleft Aacute " -"-76\nKPX quoteleft Adieresis -76\nKPX quoteleft Aring -76\nKPX quoteleft T -15\n" -"KPX quoteleft V -4\nKPX quoteleft W 5\nKPX quoteleft Y -20\nKPX quoteright A -80" -"\nKPX quoteright AE -72\nKPX quoteright Aacute -80\nKPX quoteright Adieresis -80" -"\nKPX quoteright Aring -80\nKPX quoteright comma -53\nKPX quoteright d -30\nKPX " -"quoteright o -34\nKPX quoteright period -51\nKPX quoteright r -20\nKPX quoterigh" -"t s -27\nKPX quoteright t -11\nKPX quoteright v -11\nKPX quoteright w -4\nKPX qu" -"oteright y -9\nKPX r a -1\nKPX r aacute -1\nKPX r acircumflex -1\nKPX r adieresi" -"s -1\nKPX r ae -2\nKPX r agrave -1\nKPX r aring -1\nKPX r c -6\nKPX r ccedilla -" -"6\nKPX r colon -36\nKPX r comma -64\nKPX r d -5\nKPX r e 2\nKPX r eacute 2\nKPX " -"r ecircumflex 2\nKPX r egrave 2\nKPX r f 15\nKPX r g -7\nKPX r h -12\nKPX r hyph" -"en -40\nKPX r i -12\nKPX r j -13\nKPX r k -8\nKPX r l -12\nKPX r m -8\nKPX r n -" -"10\nKPX r o -7\nKPX r oacute -7\nKPX r ocircumflex -7\nKPX r odieresis -7\nKPX r" -" oe -2\nKPX r ograve -7\nKPX r oslash -12\nKPX r p -7\nKPX r period -63\nKPX r q" -" -2\nKPX r quoteright 4\nKPX r r -10\nKPX r s -4\nKPX r semicolon -37\nKPX r t 1" -"5\nKPX r u -8\nKPX r v 12\nKPX r w 17\nKPX r x 7\nKPX r y 14\nKPX r z 2\nKPX s q" -"uoteright -12\nKPX s t -9\nKPX seven colon -71\nKPX seven comma -95\nKPX seven e" -"ight -10\nKPX seven five -28\nKPX seven four -70\nKPX seven one -21\nKPX seven p" -"eriod -94\nKPX seven seven 2\nKPX seven six -21\nKPX seven three -7\nKPX seven t" -"wo -11\nKPX six four -1\nKPX six one -29\nKPX six seven -13\nKPX t S -9\nKPX t a" -" -3\nKPX t aacute -3\nKPX t adieresis -3\nKPX t ae -5\nKPX t aring -3\nKPX t col" -"on -41\nKPX t e -5\nKPX t eacute -5\nKPX t h -9\nKPX t o -15\nKPX t oacute -15\n" -"KPX t odieresis -15\nKPX t quoteright -3\nKPX t semicolon -42\nKPX three four -2" -"\nKPX three one -34\nKPX three seven -19\nKPX two four -16\nKPX two one -24\nKPX" -" two seven -12\nKPX u quoteright -8\nKPX v a -21\nKPX v aacute -21\nKPX v acircu" -"mflex -21\nKPX v adieresis -21\nKPX v ae -21\nKPX v agrave -21\nKPX v aring -21\n" -"KPX v atilde -21\nKPX v c -25\nKPX v colon -41\nKPX v comma -57\nKPX v e -18\nKP" -"X v eacute -18\nKPX v ecircumflex -18\nKPX v egrave -18\nKPX v g -26\nKPX v hyph" -"en -5\nKPX v l -12\nKPX v o -28\nKPX v oacute -28\nKPX v odieresis -28\nKPX v og" -"rave -28\nKPX v oslash -28\nKPX v period -55\nKPX v s -25\nKPX v semicolon -43\n" -"KPX w a -11\nKPX w aacute -11\nKPX w acircumflex -11\nKPX w adieresis -11\nKPX w" -" ae -12\nKPX w agrave -11\nKPX w aring -11\nKPX w atilde -11\nKPX w c -12\nKPX w" -" colon -36\nKPX w comma -38\nKPX w e -5\nKPX w eacute -5\nKPX w ecircumflex -5\n" -"KPX w egrave -5\nKPX w g -13\nKPX w hyphen 7\nKPX w l -8\nKPX w o -15\nKPX w oac" -"ute -15\nKPX w odieresis -15\nKPX w ograve -15\nKPX w oslash -14\nKPX w period -" -"36\nKPX w s -15\nKPX w semicolon -38\nKPX x a -22\nKPX x c -27\nKPX x e -20\nKPX" -" x eacute -20\nKPX x o -30\nKPX x q -23\nKPX y a -20\nKPX y aacute -20\nKPX y ac" -"ircumflex -20\nKPX y adieresis -20\nKPX y ae -20\nKPX y agrave -20\nKPX y aring " -"-20\nKPX y atilde -20\nKPX y c -26\nKPX y colon -40\nKPX y comma -58\nKPX y e -1" -"9\nKPX y eacute -19\nKPX y ecircumflex -19\nKPX y egrave -19\nKPX y g -27\nKPX y" -" hyphen -4\nKPX y l -11\nKPX y o -28\nKPX y oacute -28\nKPX y odieresis -28\nKPX" -" y ograve -28\nKPX y oslash -27\nKPX y period -55\nKPX y s -24\nKPX y semicolon " -"-43\nKPX zero four -3\nKPX zero one -29\nKPX zero seven -21\nEndKernPairs\nEndKe" -"rnData\nEndFontMetrics\n" -; -int n019024l_pfb_len = 39013; -char* n019024l_pfb = -"\x80\x1h\x6\x0\x0%!PS-AdobeFont-1.0: NimbusSanL-BoldItal 1.05\n%%CreationDate: W" -"ed Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developme" -"nt\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COP" -"YING (GNU General Public License) for license conditions.\n% As a special except" -"ion, permission is granted to include this font\n% program in a Postscript or PD" -"F file that consists of a document that\n% contains text to be displayed or prin" -"ted using this font, regardless\n% of the conditions or license applying to the " -"document itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) re" -"adonly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See" -" the file COPYING (GNU General Public License) for license conditions. As a spec" -"ial exception, permission is granted to include this font program in a Postscrip" -"t or PDF file that consists of a document that contains text to be displayed or " -"printed using this font, regardless of the conditions or license applying to the" -" document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by" -" (URW)++ Design & Development) readonly def\n/FullName (Nimbus Sans L Bold Itali" -"c) readonly def\n/FamilyName (Nimbus Sans L) readonly def\n/Weight (Bold) readon" -"ly def\n/ItalicAngle -12.0 def\n/isFixedPitch false def\n/UnderlinePosition -111" -" def\n/UnderlineThickness 69 def\nend readonly def\n/FontName /NimbusSanL-BoldIt" -"al def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-177 -309 1107 953} readonly " -"def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/E" -"ncoding StandardEncoding def\n/UniqueID 5020910 def\ncurrentdict end\ncurrentfil" -"e eexec\r\x80\x2\xd5\x8f\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3" -"[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r" -"\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff" -"++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93" -"\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81" -"nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff" -"\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>o/\xe1\x84\x83_\xa9\xb8" -"\xbaw[\xe9\x42[{'\x83\xc5t\x9a\x80\xcbG\x86\x32\x98\xcc\x95\x11\xc3>\x13\xe1\xb6" -"Y\xacx\x95\xf1\xf2\xd6O\xa9\xb8\xbf\x65\xbd;i\xa7\xd2\x1d\x8c\xf7\xce\x10\xe6\xaf" -"\x8aTE\xaf{j\xb8vm\xd0\x7/\x11@\xc9\x87\xb\x61\x39\x9d:\xfbr\xa8\xb8\x11uK\xa9\xd9" -"\xb4\xb6\\\x66\x46\x1cJk\xaf\x8a\x93\xda\x10\xfb\x44@\xc0%\xf6Q{\xf0\xb4\xaa\xa3" -" \xea\xb6\xcb\xad\x8a:\x5\xaa\xb4\x11J4iN\xf8\x61\x93\xa6\xfa\xed$\x8e\x1c\xadS\xb1" -"nz3\x91=\x91\x44\xb2\xfc\xa9>\x9cu\xac\xcbp\xdcU\xda\xbb[\x1e\x84\xf0\xbay;\xe4T" -"\x17)S\x12\xea\xd0\xe8\xb7{\xae@\xe2He\x81Q\xb2\xe5,T\xe6i\x9fV\xf3#\x19k\x8d\x62" -"\x0\xc2\x9a\xb2V\xc6\xc2\xf0?\xdf\xf7\xe4\x81\xc5\x1e\x8c\xad%\xf0Y\xd7\x96\xf7\x8a" -"g\x16nqj\"\xf\x63\xdf\xe3\x94\xd8Y\xf9s=\x84\x8b\x1d\xf3iXnc\x83\xea\r\xe1\xe0\xaa" -"\x13\xa2s\x9fh\x94\x8a?\xf2\xe6\xf6:H\xb6O1\x90R\x96\xfb>\xe1\x82\x93\x95i\xe0\x33" -"\x8c\xab=\xbf\xf4\x36v\xb4V7\xbd\xd9\xa9T\xbdp\r\xfb\xcb\x61\x44\x90\xc5U\x88n5\x92" -"\xda\xc0\x80\xf8\x90\x82\x97%#\x9d\x32\x6\x8e\x1f\x81:3\x5\x30\xc9\x2\xeb\x8f<\xe8" -"\xa2\x93\x8a\xc2\x35\x92\x80\xdc\xc7RZ\xaa\x7f( \x0\x16\xf6\x8aT\x16\x94\xdb\x9c" -",\x14\x84S\xfe\x35\x3\x61\xad\xdc\xc6\xb7<6\xe0\xe4\xfaH\x8e-3\xe2\xcc\xf9\xc8i\r" -"\xd2\x7\x8e\x98\r\x1ch\x18\x41=\x8auf6\xda\xfaH \xd8\x98x\x9f\x62\xccL-6\xc5nH\xa9" -"\x82\xae\xc4o\rVYv\xb8i\x17\x89z>\xa6R\xdd\x1b\x3k\x18\x1b\x8e\xa3G\xcdK\xfa\x34" -"@FN\x97JK\xbcGsi0\x8a\xc6{\\\xcT\xb0%\x65h\xb7\xb4\xe5\xd4\x5 \xe\xa1\x37\xfe\x99" -"\xa7\xca\xd6\x4\xe8\xa8\x3t\x91\x99 \x10\xa6\x9b\xe0\xc3\xf4\xf2Q\xa2\x63\x42i\x2" -"\xd9\x9c\xfcQ,\xeeQj\xd3NZ\xa9\x9b\x31:\xacRd\xf0\x5\x8d\xe5\x83\x64nB\x89\xf4\x41" -"\xfa\r\xba\x0\x37\xf0J\x85\x7f.\xfd\n\xf8\xe7\xfe\x45RV\xd5so\x1a\xb1\xd9\xb5\x62" -"\xe9%\x12\x4\xa9vR\xe2\xf8\x16{}\xce\x38\xf3\xe1\xca\x8\x1d\x8\xdf\xa7\x89vNHP\x16" -"\xd6\xe9\xd6\x89\x63k`\xf9\xc\xee\xf1gm\x10\xc8\xad\xd4 \xce+\x9d\xecO\xe7'3\xbf" -"\x6\xfc\x65\xafJx0\xcc\xfc\xd6\x64t\xbd\x45\xdf\xe8\x11r\xbd\xe4\x37\x9f\x5\x8cv" -"\xfb@\xc3$\x9c\xa8\x0\x5\x61\xd2\xf1\x19\x9bR!\xe8\xa6@O\x90\xfa\x8f\xed\xc0\x84" -"\x8f\x1\xf\xd5\x1b\xe1\xcf>\xf6\xfe\xde\xd2\\\x10\xa7\x37@?\xb4\x80;\xd6\x35\xc0" -"\\\xa8\xd5\xcf\x9b\xcc\x9c\xf5\x32\x32\x45K\x91\xbd)9\x87n\xd5K\x18\x1d!*6\x95\x31" -"\xc4\xf3\x8aV\xf5\x9c\xb4\x84\xa2\xf9*i\xca\xd3\x7f\xee\xb9r\nIVn\xdf\x37\xee\x38" -"\x8a\x99\xc2X\xdc\xdeY\x98\xe5\xd8Q\xe1\xc1#\xd7\x4\xb3\x7f\"\xe0jv\x1a\x63\x41\x63" -"\xc2\xac\x41[\xcb\x83\x2=#Y\x94Z\xc0\xb3\x1d!\xccN\xd0`\xa0\x34\xff/;`P\x81\xd4h" -"\x92\x8e\xb7/\xb5^\xc\x1a\xbe\x9!\xaa\x4\xd2\x15@\xa9'*ST\x87\x63k\x8a\xd3\x98\xa1" -"\x9c\xba\x9a+g[{\xd5\xfbV\xfc\xfc\x4k\xae\xb0\xac\xc6\xe6\x83\xe@.)\xb3\x6w\xf5\xcc" -"l\xd6\x0\x8x:\xfb+\xdb#DY\x90\x43\x9a\xe1\xf3\x37\xdc\x41\x8a\xbd\xb4\x46$;v\xd4" -"(\x0\xe7\x7f\xc5\xf4\x80\xc8\xf3\x3}\x8aWYv\xb5k\x9f\xce\xc9\xf2\xdet$\xdd\x7f\x85" -"\x5\x90\xcf\"\xdak\xd5\x62\xea\xc3\xc0\xbfM\x1f\xfc\xbd\xf8\x1f\x1d_\x9fQ\xe3nMO" -"\x1\xa4\xb6q\xedy8\xd0K\x12\xc7\x84\xe4\xac\xbc:J\x2\x37L\x82\x38\\\x8=\x7\xaf\x13" -";A\xbfIuI\xfd$\x16\x9a\x87\x15\"nj\xda\xca\x39\x82\xb\x33P\x82\x63\xeb\xdb\xacqx" -"\x8d\xaf\x9e\xf8\x41\xb0\xd1\x92\x30\xd8\xafy\x98=Qv\x12\x1d\x9b\x82\xd7\xba\xc7" -"\xcf\xbd\x83\x11\x6\x39\xa9\x99\x9a\xaa\x35\x15z\x1d!\xea\xe6\x36\x8a\x8d\x35\x15" -"\xfe\x8e\xb0=\xa2\xb3 \x9e\x17\xf2.O%\xb\x1a\"\xd6\xcf\x37\xa7\x86@`\x89\x46\x93" -"\x93}\xd4\r\x83\xc3\x16]v\xc2\xf7\x7f\xb5\xbc-\xc8\x4i\xd7\xf3y\xc9\xbf\x31[\xcb" -"\xc1\xb4\xc0s\x8c\x33\xb5M\xf0\x8cx?\xeas\x8a\xf1\xea\x81;.\xbb?>\xa4.\xf8\xdb\xc3" -"#\x98?\xe3yb\xc8\xd1\xbc\xbf\xf4\xde\x8d\xdc\x95j\x8eK\xc2xW\xa5Q`x\x87\xeeW\x9f" -"h\xe4(\xf8\xf\x1f\xb7\x10\xb1\xd8\x8\\\x0\xd5\xfepWn\xa4#\x92\xae\xacx\x95\xfbY+" -"p\xd9n\xcdG\x17\xee[1'\x9c\xd2}\xdaR\xe4{\x94\x31\x43!\xc0J\xe8n\xf9\xaa\x17\xce" -"#\xb4\xac\xb0\x61\x9b\x98\xf6^\xe7J\x81k\xd9\x63Ku\x99\x36/\xdc\x9b\x7\xe\xe2\x62" -"0\x13-+B{\x85\x83\xb9nz{b\xad\xe6\xa5R\x84\xadv\x8e{nJ\xad\xf7y\x95\x96m\xf9\xc\x86" -"j\\'\x17* \x2\xc4\x8d\xa7\xb3\x81\x41\xdf?Yj\xbf\xebQ\xfe\x99\xba\xd3\xab=\x6\x9c" -"#\xad\xa0\xa8\xcb\xa1,\xb7\x11'@h\x9e\xb6\x1\x66\xb1q\x82\xa8y\x9f\xbb\xd8$\x2\x1b" -"\xbf\xcc\x14\x6P\xfe\x7\x64\xb9\xdb'Gd\xc5\xc1\x5\xf0\x18\xc0\xa9\xba\x8b<\xe5S\x91" -"\x1d\xe2ir9\xcf\xb5\xd9pG\x97\n\x8f~\x3'\xb7\x16y\xdaz!]\x91\x82|\xb1\x61\x88\x93" -"\xb7\x8a\xec\x87\x43\xdf\xfc\xc5\xb4\x0\x4\n[\x8b\x13\x8e{\xd4\n\xf3w\x9f\x9e\xc4" -"\xc5\xb2\x64\x10\\\x66\x98\xbf\x8o<=\xf8M\xbaqc\x98\x94\x97?\x86\xdd\xee\x99\xbf" -"\x8e\x33O\xb0\xdc\x8f#\x5\xad(R\xf1\xcft+\xbf*\x98i\xf4[mKv\xd2\xe5\x1a\x15\x1c\x14" -"\x9e\x1do\xa7\x1f\x8aO\x4\xf0\xeb\xd0ov_\xe\xf6\x80\xa1\xab\xf1t\x81VDQ\x0\n\xe\x4" -"\xa8]\x1b\xb2\xfc\x31XkEL\xcf\xde\x1c\x35\x9f\xfe\xd6\xae\xc6\x31\xe1\xf0k\x8eq\xfc" -"\x1a\xec\xd7\xd0x\xb3\x94\xa2\\:\xa5\x88\x84\x97\xf4\n\xa5\x7f\x64\x36juMo\xa9\x39" -"~1{D\xd9\xaa\x41\x94^\x6\x99K\xa2\xdd\x43}\xe4^D\x8d%\x9d\x12\xb3\x37\xda\xda\x82" -"\xa9*\xfb\xd4\xbe\xf#\xfc\xe5\xd0/\xc4\x89\xeb\xe0\xc1S\xc1\x7\xb0\xbcu\x6\x83\x9c" -"&\xd7\x8f\x19\xc7\x17\xfb-\xa7JS\xd2\x37^/7i/\xc6w \xbd 2&\xe9+z\xe4l\xfa\x91\xdf" -"*\x9al\x6H\xd5!\xeG\xbdS\xb3\xd9m\x9\xe\xa8\xf8\xa1\x9a\xa5P\xa1\xfa\x9f\x8d\xd1" -"o\x80\xedP\x8\x15\x96\xc\xa8,f\xf4\x9e\xa0\x17S\x88\xe8\x65\x80\x1aZ\\\xeb\n%\xb" -"\x1f^x4\x13\x8a\x16\xe9\xf8^5\xcd\xee\n\x8aS\xb\xfb\xce\xc9\xdd\x15\xe1\x95\xa3\xa9" -"l\xa3\xad\x5Z\xe2\xe6 >\x1vfA\x95\x1e\xe5WO]\xa6\x9f\xaa\xd5%|\xde\xed\xd1\x88\x9f" -"\xc5\x19\x6\xbb\xf6L\xa6\xbf@\xf0\xea\x37#\xa0\xea\xdb\xfa\xadx\xcf\xef\xf5\xdd\xab" -"\x90\xd2\xeb\xfe\xa4u\x87\xdc}@0\xe3 E9v**\x1a\x8f#.\xbd]\x99\x4\x83\xc9\x1b'9\x0" -"nx\xe1\xe4\x86/\xf8|%\xadg\xd9)\xce\x8b\xe7\xed\x64\x85\x9\xa4\xa1\x42~\xf7\xea\xd0" -"\x8d\xb8\x3\xd0\xc3\xd6\x87\x9\xa7\x9SH\x7fTd\x9f\xa4~q\x19/\x15\x90\xbc\x89\xf3" -"IM\xb6\"\x9a\x87S\xce\xac\xc4\x61\x6\xb3\x15\x65\xb4\x99\xbf\xdbnh\x84\xd0\x83\x0" -"M\xf3\x37;\x8e?\xf2\xef\xf7\xdb\x37\x31\xd5\x8e\xda\xb6 \x9a\xdb]>2K\xd8 L\x16\x82" -">\xc0l=B\x82\xea\xd2t\xc\xc6\xd8\x8\x5\x18\x94=\xfe#\x91\x1c\xb3\x12\x39\xe9l\x9e" -"\xd3\xd4\x9c\xaa,\xeb$F\x11~~a\xb3M\xe4\xfeu\xb8\xba'j\xb2\xd4\x1b\x81*\x11\xddP" -"r\x9c\x10\xfc\x19\x9b\xe2|\xd7\x1c\xdf\x37\xa9\xb5tf\xcd\x11\xb5\xa3\xcb\xbd\x98" -"\xad\xbe\x9c\x61\x0\x14\x15\xf?\x82\xbf\xee#~\xe9\x9d\xa6\x92\x5J@\x89\x90\xc\x8b" -"\xb9\x61\xf5\x7ph\x87\x6.\x84\xf8\xd0\x43\xa9>\x7f(\xda\x45:P\x14\x98\x92-\xf5s\x19" -"\xbbR\x10=\xb8\x62J8\xd6\xf9\xad\xe9\x9e=\x89\xae\"_\x95O\x83\x6\xeb_\xe5\xc7>\xdb" -"\x9UZ\x13\xe6\xdb\xfe \x1b\x1c\x9fOZ\xad\xc6\x1a\xed\x85\xf5\xed\xe0gY\x8e\x1b\x8d" -"\xc4\x88nH\x90\xff\x43\xca\xbc\xce\x4\xe2\xfe\xfb\x42\xf\xc4\x45\x18\x45\x9b\x12" -"\xda\x39O\xf3_B\rS\x13Z\x85k\xa0U\"32\x8e\xd1~\xadz\xde\x36=\xa2\x14\x86\xdc=|\xb" -"\x9b\xb4\x8d\xbd\xf1]\x8\xa7\x1d\x42\x8b\xc2O\x8f@t\xb9l\x17\x34\xf0\xba\xf1\xa9" -"-\xf3\x91\x31iZ\x11\xcck\xf6\xfa\xdc\xac\x39sP\x95\xa3\x1b\xbf<\xed\x4\x96\xf4\xe0" -"\xda@\xa1\xf3tx\xd9\xf8\x46\x13\xfIi5\xd1\xe3\xd2\x8d\xfb\x83\x1au\x94\x8ch;\xcf" -"\xe4t\x12\x1b\xa5\x33\xb5Zd\xee\xb6\n\x46\x7f}\xdb<\xf5V\xfa\xd6\x8c\x63Ig\x11\x33" -"E\"\x16\x95\x66Z\xe0!\xf5Q\xcb\xbf\xeb\x1d=\xc9\x12\x99\x9c\xf8\x61\xf0\x30\x98\x11" -",Ad\x88\xde\xff\x64QaR\x11\x91\xe0\x8f\xe5\x64\xe5.\x88-P\xa9\n\xa1\xe8S\x2\xac\x8e" -"\xe5V\x1fjy2-\xf0\x61\x9\x1\x93\xf9\x1d\x9d\x89\x8c*]\x8c\xd5\xa7\x33\x66\x9e\x1d" -"\x9f\x45\x9e\xa1\x1\xes\xe1Js\xc3\xf1\xfb\xfc\xf\xd8\xc6\xaa\x82\x36h\xf7\x31\x85" -"\xedGar\xf8\xad \xf0\xbc\x2\xa0\xa3\xf6P}\x17\xf\xd5\xb8\xac\xda,:\xbf+>\x92U\x92" -"&\xfa\x6{\xba\xe8\x38:\xe0\x8a}\x84\x8e^\xb4\xaa\xf_CG\x1f.\x85*\xaa\xac\x41\xa8" -"B$e\xc7\xdf\xf2\x93\x98\xca\xb9\xc9\xb1\xb9\xb1\x41\x1\xa8\xfb\x99\xc0\xf\x61\xe1" -"yT\"\xb\x99\xe8\x9e\xf5W\x17\xbf\xbe\x8d\n\xe4\xdeg\xb2\xd5,\xf5M~\xfc`\x12\xc7\xc8" -"\x9c\xbp\xf7\x65M\xb9\x92#T\x1\x82p\xfd\x8bx[:z\x1d\xcc\x45\xbd\xct\xce\x10\x2r-" -"\xaf:\xe4\xd6\xaf\xad\xfd\x1b\xc2\xd1\x30\x8e\x8e.\x8f\xf8\xba\xf3K\xcd}4\xad\xb8" -",\xfc?{\xfc\x44\xfb\x1e\x11\xe9\xa3\x8b\x8a\xf7gc\x9f]\x15\x9eG{ \x8d\xef\xee\x12" -"\xb1\x33\x8JC\xf8\xafH?\x9b\x13\x13\xbc\x42\x92^\xd4\x36\x44\x8\xff\xed}\xab\xc7" -"J\xa4T\x8\xf9\xd2xsJXVc\x98\x9\x8f\x8e\xe6\xf2\xce\x80\x38\x9#\x93\x94\xec\x18\x37" -"\xa0\xc5>X{\xc8\x7\x19p\xfc\x33\xfe|VYa\xc2\xa0\x10q\xdc\xfb\x43V\xab_/8\xd7\xfW" -"\x3\xe7\x64J0\xb0\xe6\x1f\xd1U\x99\x31\xaf\xb2\xd8j\xf6\x19\x64\x7\x8\xc0\xb9\xdf" -"\x10\x86\x84Q\x93\xeb\xe4\xae\xe\x43-\xb8\xc7\x97\x61U\xc3\xa0\xdb\xea\x41vI\xf9" -"\xf9\xd8\xf9\xa0>\x93ri\x1a\xaeY\xb2yIj\x13\xf0\x1f\xc2\xcdI\xdb\xca\xd8\xbe\x8f" -"\xde\x97\xb6_\xd6\x9\xda\x87\xec$\xda\x8f\x9f\x92\xbb\x32\x4\x61\xf6hM\x7\x99w/{" -"\xe0\x99%\x3\xa8u\xceJ\x11g\x9a%\x1f\xe0.\xa6\xc5\xff?\n\xde\x1e\xb4^\xd2_\xf4\x99" -"\x95\x15\xe1=\xfc\x4\x9cN$\xa0\xe7\x61\xaeM\xad\x97\xebY\xea^\xee\xbej\x81\x13Lk" -"s`\x84\x13\xb8\x36\x93\xe5\x65#\xei\x1\x17~4\xe3\xf1\x8f\x1b\xfb\x8c\xec\xf\x15\xb8" -"\x1f.\xd5\x1bzF\xd6\x91TxUoFhp\x11(\xedkpr1%DF\x9b\x36>g\x1\xa4\xcc\xfd#T\xaf>\xdc" -"7\x95\x46\xd7'\x1e-](\xb7\xc7|\x86\xf2\xbd\x95n\xb0\xa3]\xf6\xb8>H\xb7\xd8\xcf\x1d" -"\xb\x9b\xf1\x5\xe\xb\xd6y\xfd\xbd\xad\xc0\xe1\xce[\x15mj\x9d\r\x92\xfe,\xed^\xd2" -"\xa6*\x9d\xa9\x41O\xe2\xe6\x7Z\x16\x39\x15\x90\xc1\xa2Uj\xa0T\xe\xfbk\xeb\xda\xa5" -"\x1f\x3\xd5\xb6U\xef\xe6\xb\xfc\xe0^dY\x88G\x6\x86\xb3\x9f\xa5\x39\xf\xd9\x6-tn\xc9" -"\xc0Y/\x99\\\x63\xe1p\xfd\x12?s\xb4\xe7\x34\x1e\x10\xf7\x37si\x1d\xfa\xba#\xd7\x97" -"j\xc2W\xbaVo\xcf\x39\xf6u\xa1\xf8\xbb\xf6Z\x17S\xa2\xe2:\xdem\xb\x92\x5s_\x81J\xe5" -"]\xab\xfd\xb3\x8b\xd5\x45\xfe/\xfc\xd5\x1c\xca\x1b?\x18\xeb\xc1rXN\xe1i\xcf\x98}" -"N\xa0\x37\xf4\xa4\x45?p\xad\x32\xf4\x97\xc3}\xc0 \x88\xbc\xc1\xf9\xde\x0\xf3\x37" -"\xd7M\xdb\xe7\x9d\x61\x1e{r\x82\xb8\x39\x31t\x99\xcfQ\xbdQ\xb0\x99\x4\\\x8f\xd2\x8f" -"\xed\xd9\x9d\x81\x10%}\xd0\xb8M\xea\xda\xf9Z-\x1f\xc7\xf7m\xf5\x95?\xd4T\xef\xae" -"^\xb8\x88\xea\xfc{M\xad\xa7p\x88\x37\x91\xb4#d8!\x16\xa5\x93\xa4\x45\xbft\xa7\x31" -"\xc2\xb\xa3\xf8\x1c[1F\xa3\x10\x95\xcf\x61\x14`\xc5T\xb8\xbZ|\x81l\x1b\xd3hB\x9f" -"\xdc\xdc\x16\xa2.\xf6\x11\xadW\xdc\x42\xb6y\x4\xf2\x33,\x83Z\xc0\xadZYa\xdf/\xa6" -"\xf0^w|\xf2\x10\x38N\xfc\x65\xb8\x66\xc7|\xcc\xad_\xa2\xcd\x9e\x35\x98\x7f\x9e\xba" -"\xbbt\x10>\x13\x93?\x4\xf9\xa2\xdd\x4\x42\x93\x88\r\xb2\x16\xe9\xcaZ7M\xa7i\xc4\x9e" -"\xd9\x11\xd3\xf6I\xa7/\xf9{\x1a\xe9y'\x9b\xc1\xe6\r\x4g$\x82\x8f\xa3R!}\x8f}\xe2" -"\xe0\xc6\xbby\x96\xcd\xdf\xfb\xb8\xaar2\x96\xe0\x0\x46?~\xe2o.\x8a\xc4\xea\x9a\xd4" -"YI\xaf\x98\xfa\xc0\xe1\xc1\xf0\xaf\x10\x64~h\xad\xb4\xcb\x7f\x37-\xd0\xcc\xe\"\xde" -"\x16\x9di}\x5Y\xea\x0\xe\xc8mr\xf8\x85\xb6M\xa2\x37w\xdfv-\xcfoE\x94\xf0\x99\xb8" -"\xfa\x36g\xb\x10\xf6\xbe\xd0\x3OX\x10\xb7r\xfe\x37Ri\xbd_\x1f\x7\x90\x81\xb3Y&\x4" -"\xea\xad\xd9\xc2\xe5\xa8\xc4vAl\x7\xa9\xf3\xa4$\xd5\xe1\x41\xc7\xc\xf3\x43\x18@\xde" -"\x12\xfb\xf0|\xf9\x31i\xd4;\xdev\x11\x44\xe0\n\x1c\xa8\xe8\xab\x1fJ+\xac" -"q\x7f[\x97\xae\xb\xc5{\xb2\x46\x4\xe\x17\x30\x42\xcb\x34\xb1\x2U\x9N@\x84\x62\x92" -"\xa8\x44\x41\x11Z\xfXP\x96+Vp$\xb4+\xc9r\xb8\x1a\xe5'\xe8\x33i4\x83y.M'\xc2 a\x1a" -"`O~\x99\x44\xd3\x1b\x84RX\xff\xc\x91\x16\xbb\r\x0\x46\xd2\xb7>L\xee%\xa2IK#\xf4s" -"~\x1dL\x88\xfb\x9a#\xb8\xbbJFA=\x17L\xd8\x41\x84\x37n\xb0 &\x6\x35\xefK\xf7\xa1t" -"&63\x13qC>\xf9\xa1\x14\xf9\xc7\xa7\x15\xcfMe\xdb\"\xdc\xfb_\xed^\x9b\xd2'^\xdd^B" -"\xd3\xd2\x89v\xd7\xf5\x4\x88\x32)\x16\xe\xb3\xdf\xb\x30L+`V\xe4\xc9\xa1\x92\x10\xae" -"\xa6\x31\xd3\x3\xf1\xf5\x1\\\xe4\xb3\xfe\xafZm\x89\x88\xd1\xda\xc9\x9\xcf\n\x16o" -"\xa0/o\xc/\xcd \xf8\xb5;\x1c$\x1f\x4\xb9\xb0<\xf4\xb3\xb1\xc6X[\xefr!2\xf6,\xbe\x18" -"; \xe5\xdd\x14\xbfu\xe7\x1b[np\"\xc6m\xe7\xd7\x19`\xc9\x30!/re\x7\x89\xd0\x1d\x1f" -"\xf0\x42\xdc\xb7\x83\x42\x44\x44n\x1aQ\xb3\x15t\xb2\xfa\x8aq\xc5\xd3~\xb3\xc6\xce" -"7I\x92\xee\x37<~\xd9\x42\x6\x19\x62V\x88\xcaolX\n\x81\x10\x1\x1f\xb8\x61\x6\xec|" -"t\x8a@A\x8c\xa7\xa7\x80\xb7\x9cI\xdf\xad\x86\x91\x43Z$\xcf\xf5/\xe2~'Ai\x1c\xdc\xac" -"` +\x1c\x9e|\x12\xb3\xd1\xc0\xf6\xfd\xf6\xfd\x99[U\x83\x1b\x32\xeb\x18\xc6\xfcm>" -"\xf9\xaa=)\x18\xe5\x84\xd5|'\x2\xcerk\xf0(\x2p\xa7\x62S\xba\xa0_\x19\xe7\xbfk\xfd" -",\xcb\xef\x43\x9e~\xce\xbc\xf8l\x12\xdd\xe\x85\x85\x12\x89h\x15\xfb\xeb\x16`\x16" -"\xc9\xb1(K\xf2n@G\x9e\xbeN\xdd\xb2R*\xd4\x44g&\xe2\r~[r\x7f\x9c\xd1R`q\x12\x83 \xab" -";\x8O\xc0\xee\x46\x87\xc5|jfl&\xfe\x41\x81\x83\x33\x3\x9d\x1e\xf4q\x13\x45#\xfc\xe4" -"\x96\xac\xc5\xd3\x4k\xbaI\xf6\x65\x46\xb'\x92\xee\"{\xc6w\xb4\x2\xcfT\xcd\xbc\xc1" -"\x95\x9a\x9\xb5\x44\xbc\x1d\xd0\xd3Ye\x94\xf4\x81&J:\x81\xbb\xea\xf4\x87\xb2\xa1" -"\x5U\x8e;\xd9\xff\x64\xbe\xcb\x66\xd9\xd4\xe7%\x34\xbc\x62\xac?\x8d\xc5\xa5\x93\xb4" -"\xes-9\x86\xbe\xee\x9b\xaf\x32\x1a*\xf2%n\xa0\x95\xf5\xa9\x1e\x96\xfd\xa2M\x87\x65" -"\xf6\xaeN\x1f\xb2\xd0J\x1\x1a\xe3?\xa2\x10\r\xf8\xd2\x84\x8e\x2\x9a\xb1\x98\x98\x6" -"\x1\xab%\xa0|Ga\xcam\x1e\x14\xf]2\xb8\x86\x8\x87\x9f\xd9\xf5@'\xc1X)cr\xd8\xb9\xf6" -" \xfa\xe7W\x1f\x95\x42\xfc\x6\xcb\xc1).\xc3\x87\xba?K7\x13K\xfe\x41\x31O\xa5/\x5" -"\xf3\xc\xd6g\xa8\xbf\xfbyDE3#\xac" -"\xbe\xaezS\r^\x8\x9a\x1f\xf5\x1c\x1c\x30\x1d\xf5$\x6,\x1f\x8a\x9b\xee\xcdIh\x92\x94" -"d\xab\x12\xb0\x1f\xdd\xa3G6\xd7\x38=#Tj$\xc6\xfc\x9av\x8c\xec\xf5\x1c\xe3\xa6\x8d" -"\x16\x63\x1\x8aP\xe1+\x9e\x88U\xe3\x65?)\xa7~'\\\x7\xaf\x98VY\x12\x30\xb5l\x9e\xcc" -"g\xef+\xc\xa3N\x85\x83\xaa\x61\xb3\xc3\x9fKz\xd4\xa7\x81O\xaa\"\xd4\xa5\x12\xf6M\xdf\xd1\x9f" -"\x1c|T\\]nY\xd4}\xe5I\x9d\xf5z\xe4\xa3\xc2\xd0\x88u\x95\xa0\x5l.\xab\x80R\xf7\r\x34" -"C\x9\x17\x1c\xbfKZh\xf5\xdfq\xfc`\x9f\xe2\x44\x9e&X\xb7\x41\x43\x99&\xf0+\x1dQ\xad" -"\xfeu\xe1\xc6\xb0\xeaVP|=\x9d\xc9\xdd\x97\xd2\x8d\xc5\x93\x11I\x9d\xb2\xa6#\x1f\xf7" -"\x7fW\xa1/Xa\xf3W\xe3\x2\x8\xe2l\xa7\xde\xbe\x36\xa8J\x81\x83\xb6\xad\xf7\xdc\x31" -"\x92\xc6P\xfc\xd7\xd1\xf8\x12t\xb3\xa2\xe \xe7.\xba\x31\x87\xac\xb1P\xa0\xb4\x33" -"\xf1\xc7i\x89\xde\x8eT5`\x9a#U\x1\xeb|\xc5u\xabv;f\xc3p\xb6\xef#\x93-\xb9\xda\x87" -"\xcb\xaa\xcf\x85\xd1\xc8\x41&l\x1f+\xbf\x84\xd5\x7\x11\xb3o\xb0\xa2\x88\xc4\xf0O" -"\x11\x34\xfe\xd4\x1b\x8.\xcd{\xc5\x98\xe7\x81\x35Ub\x3\xc1\xdc\x97\xd6\x1e\x38\xef" -"j\xdc\x61\x32\xe6\xb9\x11/\xce\x17\xacO \xaf\x66\xa4V\xa2\xd1\x38\x2\xfY61\xe2M" -"\xf4\x80\x80\xde\xb0\x1bH\x84O\xb0\xe2\x18\xe9\x14\x37\x42\xbf\xf5\x1f\\\xe8\xd4" -"\x82L\x8d\x46\xc0?\xe1,I4\x3\\\xca\xc9\xa2\xca\xa2\x83\x44?n\x97\xday\x96\x38\x5" -"c\xbfz\xc9\xbb\xc3\xa5\x82\xd7\xa2\x62Y\xbc\xff\x3\x97j*\xdc\xf7\x83\x8\xa9\xbf\xc9" -"\x8\xa2\xba\xc4\xb3\xf6v]\x91\xc5\x64\xb0\xa0\xf8W\xab\xfa\xca\xe3$p[\xe0u\x1b\x1d" -"~\xf\x92\x1b\xd8-\xdf\xa7\x9d\x31\xf0\xb4Ph/\xf7&\xd8\"\xe0\xd1\x9f\x0\r\xf9\x1e" -"\xae\xd9W\xe9h\xeal\xc4\xfd_\xc0%\xad\x33\x1fK\xf9m\"P^\xc7\xc1\xde\xb8|\x10\x95" -"\xdc#\x99\xff\x83\x9d\x1d]c$\x3\x35\x45\xb0vg\xdf\x36\x36\xc4\xf5\xc2!\xa3\x66\x30" -"G\xcf\x4\x93\xb3\xab\xab\xb9\x11\x18\x96[\x87\xf7\x17>\x8b\xc4\x90\x82\x1c\xc3\xe5" -"E\xd8\x1\xd1\x46\xe\x11\x89\xd7\xba\xcf\x8cj^\x3\x8d\xc1\xf1\x3\xf6\xfd\xf3\xd9\r" -"#+V\n\xd1&\xc0\xd2\xf0Wd\xe6\r\xa1(/G\xab\xc9\x89\xd5+\x96\xcf\xd9\xf5*\xbe\n\x37" -"Z\xc4s\xc0\x45+r\xfb\xda\x64\xey\xa9\xf7\xb0?>\xe5()_=A\xbf\xd9\x36\xcf\x9\xc4\x31" -"\x12\x96\x11\xd2\x98\xec\xe4\xac\x98K7\x19 \xc1\",@\x18\x33\x46\xa8\xbc\x18\xfd\x46" -"\xce\xca\xf9\xb2\x82\xd3H\\\xa7X\"\xb8i6\xd3\xdd\xba\x3\x1e\x45\xbe\xda\x8a\x92\x36" -"\x18\xabi;\x8b\xb0\x32\xc3\x91\xa0\x18\x5\xc7v\xde\xdc\xc0\xc1Iv\n\x80\x1a/\xcf\x94" -".{\xb9\x8e\xbd)\x81UN\x9d\xd3\xbf\xc7\x61IQ\xc7\xbc\xf6\x44\xe1\x66]\x8c\x44\x32" -"\xaf\xfc\xbf\xb7\xa2(\xa5\x84\x8e\x3\x85\x88~\n\x0y\\7\x11\xf3\xcb !\xaf\xf1\xa8" -"\xab\xf2\xc8\xe1\xc8\x83\x1d\xf6\x31\xf\x83\xeb\x8b\xe0\xb6\xed\x9ap\xac\x8a\x88" -"\x10y\x1d\x86\x13\xa8K\x11\xdf\x1bX\xc6\x41\xd6\x5\x1eG\xeb\xe7\xe0\x97\"<\x19\xb2" -"5\x11\xf9\xc6\x37\xe6\x80\xf5=\xbf\x91@~C\x8f(\xbdM'\xfWY\x15\xb0v~28\xbe\xf4T!3" -"\xe1\x65\x62\x18 q\xdb\xab\xe9.\xf7q\xbb\xf8\xe1\x8d\xdfU\xc4-$M\x9d\xbc\xaa\xe0" -"\xd9\x11\x8f\x1e\xa0\xd6O;\xf0,b\xdb\x46\xfd\xad\x36i [g\xfd\x9f\x85\x98\xadOu\x11" -"\xe6\x9f\x97\xe7\xd9w]\xddX}\xdc\x8c\xf2W#\xd6h\x1\xbd\xd8>$\xcf\x85\\\x8e\x8a\xab" -"L\xaa,\xed\xb3J\x7f\xe6'\xfb\x43\xe4\x38\x7,\x9b\xeZ\xdb\x90ZRn\xfe\xef\xd4N\xaf" -"(p\x8e\xf6\x90)\xeaj\x15l\xb2\x10=\xb4\x94\x8dS\xce\x37 -\x96\x86\xfdq6S\xd8\x39" -"^\x92\xa1\xdc;X\xa4\xd8\xf0\x1c\xb9\x7f\xa4\xac\xce\x1d\xb8\x88\xd4RrQA\xffz\xe6" -"}\x7\xbf\xd4^\x99\x31k\x2X\xc2\xc\xe9\xc9\xd4\xa0\x17\x9b\xdd\xe6RM\x9d\x91\x80\x18" -"\xd6\xb7\x10\xe5\x6\x41\x38\x35\xf7\x32\xaeP87\x18\xc2\xe0!\xf9x\xbd\x64\x92\xf7\xba" -"a \xf8jBR\x14\xcc\x14\x64\x61Rf\xf8\x82`\x98\xe9P\xe0\x9\xd9\x18,\x2\x8a\xeb\x42" -"mR\"E\xab\x9\xe8<\xd1\x66\xf2\x44^\x2\xb\xa8\xb1\x0\x94\x7f\xd9\xc0\xaa\x9\xe\x95" -"P\xc7\x1\xc8\xac\xf7\x44\x11\x91k\x90\x917E\x80`Q\x81\xae.\xd9\x3\xe7\xb5Gi\xb3" -"\xc3\xde\xad\xdc\xa8l\x11?#\x9b?\xdd\xb4mcC\xfb\xea\xf4\x41\x35\xf7\xef^\xa2\x17" -"\x90-;\xe6\xe4;\xaa+\x8f\xfd\x8e\xa0\x65r\x9b\xa4\x62\xfd\x19\x65\xf8\xe5\xbcY\x9d" -"aF\x10\xc3\x43\xccJ=1\\\xa0\x2\x4\x1e\xf8\x9\xa3x\x9c\x35\xf7\xe\xd6\xbe\xf7\x1e" -"\xea\xed\xc8\xfa\x92\xed\xe9\x6\xc3\xdf\x1fO\x9e\x93g9\xd8\xf3\xbe\xcd\x44\x1a^\x7f" -"I\xb\xbdz\x6;d\xc1\xea\x82\xbd\x44\x45\xa7\xd2)\xc2\xdb\x61\xbdoP\xd6\xc3\xe3\xf0" -"(\\\x15\xd5\xa4\x80\xa1\xc9\xb2\x31v.s\xfe\xe5t\xa8\xb3\xc5\xbb\xec\x36\xb2\xbd\x38" -"\xc8:)\\E\x1a\xb1#\xbeW\x86\x32\x80\x82\x4\xe2\xc9\x8c\x9d\x87\xdclo\x91)c\xc9\xb2" -"XL\xe1I\xd2\x87'\x1a\x91\xf4\xb\xe4\xbb\x3(\x1b\x19X.\x92{\xc\xb8\x1a\x4w\xec\xa4" -"\x83\x8a\xa3\x10^\xee\x92W\xac\x7\x63\xce\x1c\xeb\x30\xfd\xae\x1cIk]\xe|\x9d\x6\xb3" -"\x7\x16\x13V\xc2\x43\xf8\xb2J\xc0\x16\xb8\xe6\x5+t\xa4\x18\x66\x86\x64\x65\xad\x9d" -"\xfd-\xd6\x31\xb0\xbw\xc0}\xcc\x63\xb8\xa8\xcfv\x94uP.\xa2\xab\xc4\xb\x64\xa4\x30" -"\xc0\xaau\xc1\x8bQ\x19\x85,\x8e\xa2t)\xf\xce\xe7\xeZH\xb7N7; \xf8\x91\x36\x38\xa8" -"mH\xea\xe5\x62\xcfYq\xe1\xaa\x1dsy_\xad\xea\x9\x84q\xfa\x36\x62\x63\x32\x8\x9d\x85" -"\xf3\xf3\x8aW\xfd\xe8\x6\x0\x41<\xb4\xb2\xc0\x39\x81\x36^~\xff>\x95Q\xec>`\x95]\x1f" -"\xd5\x61\x18\x33\xd4}\\\xc\xf5\xcaSl\xb3)'\xa3o\xf5\xbb\x92\xa9k\x14j\xdf\xbe\xa8" -"\xf5j+\xcaH\xa4\xc0\x8b\"\x99\x9e\xd5\xb3s\xe1g\x98r\x84\xff\xf7\x95\x65\x61*Q\xf5" -"P\xb6V\x9d\x6\xd3\x9a\x61\xb6y\xed'\x80t\xe\x94}]\x19\xc1\xef'V\xb0\x44\x65\x9b\xaf" -"My\x1e\xc7\xf9>\x85\x8dt\x9f\x9a-\x92\x1\x46\x36\x80\xc1\xce\x8e\x61y\x0#\x8bN\xdc" -"f\x9b\xe3\x98\x84\x95~Z\xe3\x34\x39\xc6\x84\x18\r\xea\xcb\xf5\"\xe4\x85J'Lt{k\xb6" -">\xc2\xa1\x7f\xc7z$\xd5\xfc\x81\xe9\xb9G)m\xa1[`d\xe0\x80W\xeb\xbc\x84\x18\xb5\xff" -"\xdc\x93\xcd\xe1y\xe6\x38\x16\x8f\xd9Z\xb9\xde;\xa8I\xb9\xab+\xdd.\x15\x82\xbbj'" -"\x12*\x8b\xa4\xd8\x1a\xe3\xd3\xf9mt\xb0\xfc\xd1\xf5\x41\x2\x13v\xb7\xf3&V\x1a\xb5" -"\xc3\xf5\xe3\x64\x85\xb5\x0\xdf>\xdc\x91\xf\xcf\x36Te\xc2s\x1e\x42\xbd\xcd\xbd\xbd" -"\xe2\xbc\xaek\xe6\x41\xb2\x1e\xeI\xa9~\xa1\n\x6~\x1d\xe1\xa9ia1\xea\xf5i\xbb\xab" -"\xf1\x36r\x84\x7f-\xc~\xd9X\xe1\xc8,r2\xec\x8\x9a\x82\xe9_\xf4\xe3\x36\xfb\xbd-S" -"\x3\xa6\xd3\x35[\xbd\x85\xd6ma`\xc3\xb2\x44\x82\xbe\xf8\xfb\xeb\xf2{a\x7f\x98\x87" -"-\x15\x88\x9/6\x91\xd9\xf9\xa8\"?{\xaa\xbf\xc9Y\x2\xb\xb2_\xeb\xce\x1c\x41\xa7\x87" -"\x8d\x8a\x38\r?\xcc\xe5\x90\xd3)\xacV+\x88\x99\x87\xc2\x8a\xf2\x18\xd0\x96\xfc.\xe4" -"\x1\x1f\xee\xeb\xa6\x30\x35\x39[w1J\xfb\xc0\x92\x1d\x9d\xa7\x90\xda\xb3>z\x1d\xaf" -"}\xd4\x94j,0\xd6\x34\xf0\x9d(\x5r,\x4\xf1\x9a;9\x4T\xe9\xc4V\xf8\x34\x9c$\x94\x64" -"\xd3\xe2.\x18\xcf\xcf\x90/\xa9\n\xd8\xb4\xb7\xb2\x92\xb8\xba \xbd\x15\xa1\xb5\xe6" -"e-j\xe1^MJ\xa2L\x0\xbe\x8c\x9e\xde\xcf*P^?P\x88\x32\x97\xd8M\x11\x1c\x88\xdb\xc2" -"Rs\x93\xe4\xd7\xf5\xafR\x1ck+\xf4i\x14O-\xd1\xf6\xe0]\xb4\x4\x0\xe2]p\xa1\x65\xc4" -"\x1c\x95l\x90\xd7=\x1a\x83\xc0S\x8d\xf2\xf8Z\x9c\xa5\xa7\x86\xa8\x12\x16\x2\xcd\x9e" -"\x1cT\x4\xb\xb8{\xbb~\xcak\x99/\x83\r\x83\xda\xdb\xc2\xd9\x1c\xe0\xb6\x46$\xc6\xc7" -"u$\xca:\xe6\x13;vW\xc5\x12\x8cT\x1b\xf0\xbb\x97\xb1\x3\x1b\xda\x0\x1y\x2x\x83vN\xc5" -"\xc6\x92\xf0\x44~^\xde\x18\xf8U:}\x7f\xc8\xdd\x95\xb8\xfau\x9c\xfc\x35\x90 \x9a\xac" -"F\xdfM\xe9\x82y\xed\x8d}\xec\x9e\x43\xf0\xc0\x18\x98\xbf\xe4\x7f\xa6\xe\xf3\xb8\x8c" -"\xd9K\x16\xbd\x5\xfd\r\x9b\x42\x42\x6s\xf3q\xc6\xf5\x85\xb6!\xfc\x39\xf6\xf\xab\x42" -"\xb1\x1b\xf7MYj\xf4\x34\x8amC\xc6v\xf\xae\xd5\xf\xc8\xc9\xb3\xb3\xf5\xe8\xa4\xf2" -"\x1b\x86\xa8\xb6j\xe5|\xd4J\x0\xa2\xf1\xb7z\xbb\x42\\T-\xfc\x8b\xd4\xebH\xb3\x35" -"5\xe0>N\\\xa5\xf0%\x41\x62_K\xcf\x80\xcf\xab\xdb{\x87\x9a\x5Y\xc8\xd8\xaa\x9c\xe2" -"\xea\x0\xd5\x19\xf2UJ\xc5\xa9\x87\xe2\x81+\x8c\xa4\x2\x82\xb2\xe6\xbex-\xc5\xee\xf9" -"F\x89v\x82\xb3\xc9\xec\x9d\x80M6\xd4k\x16n\x1f&\rd\xa8\x94\xaaiW\xa5\xd7\x1c\x85" -"u\xc0\x8d\xac\xe0\x38+(\x12\xba\x94\x1c\x14\xaa \x99\x88>R\xde\x8bv\xe7\xed\xaa\x16" -"\x8aSc\x1d\x89\x8\x82\x83\x65\x14\xf5\x97\x14!\xbb\x66\x89\xc5+\x1\x8e\x46\xeb\xe6" -"\xc4|\xda\xe3@\x9d$\x2tF\xb0H\x1e\xf3H\xa1\x9\xe8;A\x10\x64\xa1Pf\x1b\xf7sd\x8d;" -"\x97\r,\xb8\x8\x46\xfc\x93\x1e\x96U\x94\xe0\x36O\x1d\x43\x17\xff\x65\xa5\\\xa2\xce" -"5q\x1b\x8c\x15\xeb\xb9\xa3\xb5\xb6\xcand\x90\x44\xcf\xd4\x96\x33\xd6h\xd7\xf6\x8e" -"\xc1VSp8HS\xc2\x99+\xea\x36hX\xbb\xa9\xef\x7\x9c\xf6\xe4\x66\x45//\x82z8\xea\x31" -"%\x6\xe8N\xcc%\x84\xff\xf4g\xae\x15\x87K|BNL\xfb\x8a\xdb\xd1\xe3\xf9\xaeJ\x10\x1d" -"\x1c\xe2#U\x89\x19-\xb9>\xbc\xe5\xd8\xe8\xeb\x10\x8cRu\xc\xcf\x92\x94\xf8\xea\x90" -"\x91\xa1n\x9a\x7P\xaf\x38\x36\n\xcb\xdaK\x8f\xd3\xe\xbf\xd8\x19\xe_>\xe8\xcbk\x15" -"\xb2\xf5\x30\xd7\x83\x6\xbb\n\x10/ 7\xfb\x45\n\xba\xa9\xf;\xf0\x2.fUy\xca\x99\xd0" -"\x1a\x14\x1a\x84!<0\xfc\xe2\xd9\xb0\xf8\xfe\xc5UmwrX\xa7\xbc!C\x9e\n\xdc)oY\xfch" -"\x9c\xbasij\xd0\xecu\x1f\xda'\xf3zA\xbe\x3h\x90\x8f\n@\xcf\x39\xdb\x91\xdd\xc2\xf1" -"\x8dg\xbf\xed.Eb\xec\xe1&\xf\x66\x99\xd9\x45\xa6\xe2RCX\x95\x8e\xf8\xe3\x81\xa4\x45" -"\x85x\xdb\x1dW5\x98\x0\xc2\x18LyO\r\xdd\xa4\x8d\x9a\xf4K\xf4\xc0\xe1\xc0\xd2l\x11" -"@\x12\x96\x9bV\xe1mD\xb\x32\x61\x43\x95;\x7f\xe5v\x82\x16\xd5\xa4\xddYvD\xceVth7" -"\\\xf1Terw\xb\xba\xcc\xe%\xb7\x42r\x88\n\x91\xac\xc7\xc9\xb4\xb9\x85\xc1t>\xa5\xd8" -"\xf6\x8f\xe3\x0\x36>(\xc8\xab\x16\xdc\xc7/W\xf8\xc1\x64m\xa3H\xc\x85{~/\xe2j\x2>" -"\xcb\x5\x1\xdf\xbc]\x80\xe8/\xb7\xb0N_\xfb\xcc\xad\xa7\x9fn\x81;\xf2\xe9\xb0\xa8" -"a9\xac\x1aw\xa5\xa2-7F\xbd\xdc\x39\xf1\xae\x4RMy\xc6\xf9\x90\x63\xd8\x43\x2\xc5\xb8" -"E\x10\x8a\xc7^\xd6$)rI\xed\xd9^ \xdf\xe\xf1\x83\xc5\xf1\xc4\xa8?\xba\x2,\xca\x31" -"\x81\xf2\x8a\xae\xda\xa8Wx_t\x6\xa4\x65\x9d\xe5\xaf-]\x18RtQY\x7}\x3R\x18\xe3\xef" -"Y\x1\xdc^\xef\x33\xa1\x62\xbd\xbdM\x90\xf1\xbc%\x9e\xf6\xf\xbe\x11q\xdd\x9c\xa9\x91" -"\x82\xe5\x9\xccq\x9b\xf6R\x98\xa8\xeb\x41\x81\xf1\x64\x61HQ\x1e\x9\xf8\xe2\x1e\xf9" -"\x7\x89\xb\xc4\xbf\xaf\x9a}ea\x81\xea\xfc\xdb\xe9\x0\x15\x9\xc1\xffiy\xee\x90\x10" -"p\xa0$\xd6\x98\xd5\x19i\x12\xee\xc2v\xe3\xa5\x11sP\xe8\x8\x6r-\x98}\x19\xf7\xc5\xc7" -"\xf1\xcc\x13\xed\xc5w\xed\x3\xd6\x30(\xc2\x9\x1c\x86\xdb\xca\x8bS\xf3\xe0\xb6q\x9" -"\x84\x93=g\xa6\xe0\xd7p\xa1\xb8\xdaIM\xcc\xbf\xdf\xc1\xc9\x8e\xe6\x86\xb4\xac><\xbf" -"\xf1jV\x9c\xc2\x35M{r\\Q\x1fkO\xf5\xeep\\\xb8\xe8\xe5\x8d_\xbf\x8c\xb9J\xc\x80\x7f" -"K\xa9\x8e\x37\x11\xf3\x8ek\x8e\x3\x15\xf5#k\xe4\xf4\x45\xb2/<\xef\x9bV\x96\xf1\x9" -"\xcbw\xew\xed\xfa\x30\xce\xb4\x16\xfb\x30)\xad\xcf\xe5\xc2\xc5\xcb-K\xdaN\xfcu\xcb" -"i\xb8\x97I<5 \x87\x1c\x10\xa7\x34\xa3X\xeeqS3\x96\xac\xde\xe7h/\xac\xb6\x1b\x1b\x43" -"\x9\xbe\x34\x84\x8f\xea\x0\x15\xcc\xdb\xc3\x7\xca\xe\xb2,\x91\xab\xce*w\x88\xf4O" -"\xe2\x17\x5`SP\x7\xcd\x95\x9\xa0\xb\xd8\xc\n\x81\xce\xd0\xc6\xe2\x88\xe9\xc6mx\x3" -"z\xb1\xd6\x10\x12\xcf\x98\xd9v\x80\x33\xc4\xdf\x64\xbf\x19\x16\x1\x99\xee\x85.8`" -"\\\x1f\x91\x31'~\x83=\x19\x30>\xd8\xbd\xd9\x42\xd5#$\xe5|Aq\xc1\xcb\xcfV}\xe3\xbb" -"\xe4\xcf\x14\xafVd\xbc\xb5\xa7\x16\x63\xb8\x30\xa2\xb0\xa2#LG\x86\x44\xd8\xc4\x8a" -"\x8fZ\xbd\x86\xcb\xf\x8c\xde\xed\x11\x80x\x8e#\x15Y\xdb\xd1\xfbq>\xe6\x33\xa7\x34" -"\xe7\xb\x85\x8d\x35\x7f\x18VDL#\xf0{\x4\x8a=\xd3\xfb\x19\x15^,\x97\x19.\x8e\x1f\n" -"\xe8\xacno*\xdc\xf1\xd8g2E\xd3\xb7\x93\x87\xf2\x65+*\x8e\x1f\xf3\x34\xc3\"\x10/\x98" -"\xdd+\"\xcf\xfb\xd7\xdex\\\xe1u\xb9!i\x7f\x9d\xe0\x61'\x19\x0\xf3(_\\\xa3[Gn\xc5" -"Wyu\xe0\x45\x9f\xca\xfcH\x8\xfd\x36\xd3\xce\x81SN\xe4\x37\xe8\xccp\x14\x6\x38\xac" -"\xfa\x46+\xb[A\xc7\xa4\"\xb\x4\xd0\x2\xad\x66\x4\xae\xfb\xa2\x9\x66\x89l\x90\xbb" -"<\xe4\xe1\xdc>\")\xa7\xe0\x30\x92&\x9\xe0\x39z\xb0\xc3\xb9\x1\x84\x90\xab\xbaKi\x1" -"\x17-\xcemJ\xfe<\x8e\xe7\xeb\x63\xc1\r\xaa\x80\xc\xfah\x1d\x31y\x81Z\xcb``8pX7#\xd3" -"\x96&\xf1\x5\xde\x63Vi\xf2<1$\x5\xb0X\xac\x10l\xc4\xd0\xbe\xe9|\xe1]\xf7\xf0\xd9" -"\x7fq\xa7\x19\xf2\xaezS\xff\xf7\xe5\xb\xba\xe6\xe3\xff\x15\xa0\xcf'\x8a\x8dOshE\xe3" -"!\x91\x61S\xa4\xc9\xb1\x80\x94\x66\xbf\"@\xe2\xa7\x1c\xc5>\x96\xe0\xaf\xe8\x35z~" -"\xe7\xe7[;\xe4\x38\x9c\x31\xf2\xbd\x5M7\x1c\x9f\x9b}q\x11\xba|\xa0\xea\x1c\x34\xe7" -"\xe5\xd1#\xbf\x65?&kb\\ra\x2\x62\xb9\r\x8a\x90\x43\xa1\x19\xeb\xa1\x65,*\xc\xef\xe8" -"\xc3\xe8\xe6\x64,\x9f \x9b\xd6\x97\x9c\xf4|\x6\x89S\xcd\x5T\xe0\x42\xa5\xf7\xbb\xa8" -"\xabJQ\xcV\x7f\x65\x35\xbd\x37?\xbbk\xd8\xdc%,6\xf1\xe\xcc+\xcc\x35\x41\"}\xf8\xf6" -"\xf4\x8eM7\x1b\xd4\x1e\xc0\xe7\x61\x6\x8c-\xa4\xb4\x91Sl\xef\x9d\x61\x9e\x17\x39" -"\xcbt_\xb5\xc7\xe7\xb5\x8c\x9f\x90\xc9$\xce\x3\x80W\xec%|\xbe\x33\x66 f\x84\xd3\xdc" -"${\xce\x1a\xb4\x31\x1a\x9a_\x9c\xdbr]\xed.\xe6\x62\x1e\n\xf8R.|\x86\x9f\xf\xec\x14" -"\xaf\xaeL^>\xcd\x95^G\xfb-X\xd5mW\xe8ms.\x8c\xa6\xcd\x8b?\xb7|\xb2\x9c\xbd(g\x16" -"*\x1fUd\x11v\x16\xf9'\xab:L\xa5#\xe2\xc0\x9c\xe3OV\x1c\xf\x16\xf1\xb4\xe^\xbb\x1a" -"?\xcb\x1f\xc8\xfd\x43Z\xd5\xb1L\x80\x38(\xf5\xa8\xba\xc8'\xc6\x10\x87\"\xee\x85\xe5" -"K\xda\xd7\xa6\xdf\x94\xe#\xfd\xf8\x8cR\xec\x84\xc8\x8cN\xcbG\x8d\xd1(\x13]\xf7\x46" -"\x99\x43\x41\xa3~\xc5\xfb\x30\xc6\x8d\xfa\xa3\xd4\xcb^\x17\x32t\xf4\xc1wd\xac=U\xe5" -"\xcd\x43\x45\x1c\x0\xe0\xa6\x80\x9d{\x7\x14P=\xc1\xaf\x1f\xff\x30\x7.\xce\x43\xea" -"\x87l\xc5\xf\xa0\xc3q~a\x9fh\xfb\x3\xe6\xb8\x84\xc6\x8a\xfe\x30\xa6\x5\x19\x13\xc3" -"\xf2X\xc9\x94\xc4\xb9m@C\xe6NL\x8\x65:\xbcO&\xee\x89\xe4\xf3\x1c<\xb6\x62\x39\x33" -"i\x9e\x9cl\xc0\x82y)\xf4\xe5\xbe\"@\xa9\x13<\xa8;Z\xba\xe1l\xa7\xb8\xeeQ\xfb\x92" -"\x84~'\xb3\x11\xc9\xf0\xcb\x9a&\xa9:F\\\x10#=\x7|#q\x8e:\x89\x43\x91\x83\xc7\x11" -"\x96\xec\xbf\xe6\x7run?\x98\xcf\xe9\xa1w\x1e\x30\x98\x84y\x2\xcb\xc6G\xe\xd7\xba" -"\x91\x7f\xdd\x1e\x1``|\xc3Y\x86\xbe\xb8\x9cQ\x15\xca]\\$\xd3\xb2^<\x83Otb\x8b\xf6" -"\xaeZ\xc1sZ#\x8\xbfw\xa3\xfb\xad\xd4\x83\xcb\x82\x82%\xd6!fY\xa8\xaa=\x9c\xcdi,\x12" -"\xaf\xf1S\xc7\n\xaa\x39J\x0\xd2\xe2\xfc}~\x10\xba\x8fT%\xab\xc7\xa1\x46\x91\x92\xfc" -"-\xffl\xf\x10\x7\x41\x10\xbf\x19\xa2_\xb6\xd5zt\x94~\x1e%\xc9\x8e\x92\x97\x93\x41" -"X\x9fjNd\xe9\xa5\xb1\xcf\xe7\x81\xcf\xfeI\xb3`\xbd\xc5\xfd\x87\x42\x5 \xcf\xee\x45" -":\x8es]3\x8b:\xc3?b\xde\x8e\x12\x91\x88i\x7-\xe1\x35\xee\xc2Qh)\xbe\xd5\xcGh\x1e" -"9\x98pw\xc7\x1a\x38\\:w\xde\xe0\xe6X\x1c\xc4+a\xda\x64N\xda\x8e\xb6\xb5\x88>2\x85" -"\xe.\x11\x2\x9a\xc\x37\xfc\x46\x34\xc6\x9c\x9\xf6\xb2\xa5\xfd\xa8\x19\xb3\x10\x16" -"\xfa\r\x9c\x80-J{|\x92\xe1\xb0^}\xab\x44\x41\x61\x10\x34\xe7+\xe\xdd\xe3\xfbO\x9c" -"\xd6\r\xe0\xb4\x64\xec\xc5|T\xeJ\xa4\xeb\xaa\xc9v`\\MT\x98\xad\xb8\x83\xe2s\xb0x" -"\x5\x33\xfaph6W\xe3*^\xb6\x1f\xc#+\x3<\x6\xcd\x1c\x9c\xb9\xea\xed\x9a\x86\x8f\x41" -"\x87\x80\xaeM\x7K$5r\xb5\xa5y\xec\x88\xe8\xb8\xb3PY\xfb|Q\x17\xa9\x46\x1c\x92\xde" -"q\xd4OX\x8\xfg(*\xb2\xf5\x11\xcc\xf6\xd5\x8eU\xa9\x1a\x13t66\x8b\x5\x30\xda<@\x1a" -"W\xe1r\x1\xdb|\xb3\x8f.\xd4V\xf7:r\x4\x8f\xd3S\xb7\xae\xc9R\x9b\x98:\xd6\xcd\xe3" -"\xaax\xf7\x90\xc7K^\xd4\x63\xb7\xc8mh\x9c,\xb4\xea\xa7\x35\x95\xe5\xef\x14\x8cq\xbd" -"Y\x18\x37\xf4\nIH\xcf\x38\xa4^\xa2\x43\x46\xd0\xcd\xdaR\xc4m\xd0\nlR-:3Pu`\xfe\xc3" -"\xe9\x31#l_;/\xa2q\xbe\xa8\x0\x89\x6\xed\xa2\x87\x1f\x91\x9e\xeb+:\x8d\x9e\xd3\x93" -"\xcf\x30~@\"\xbf\xfb\xaa\x2G\xc5\xee#<\x98|+\xb7\x90qc\xbe\x12\x43\x99\xd3\x8b\x97" -"\xc6\x1d\xad\x97\xb9\xfa\xb8K\x93 \xab\xb9\x96\x9b\xfa\x65\x9d\x8a\xd9O\x1b\xf7\xe" -".\xf\xdf\x33\xb8o\xc4\xd0to\xf9\xe1\x12x\x1dS0\x9a{?\x95l#\x1dZ\xd7+\xd4\x89}\x90" -"7\xbc\x9c\x2\xb4\x13\xd1|ko\x88\xcawhB\xc2\x3\x7f\x65\xd9?\xa0\x92k>\xc\x84\xdf\xe8" -"\xa9>\x81\xde\x63\xb9\r\xd0'\x17\x44\x36\x83 y\x1\x8c\xa7M^\xee\xbe\x9en\xe4\xe2" -"|\x17O<^O]\xd2\xce \n\x1d\x43\x80`#\x95\x11\x9\xcf\x14\xed\x13\x92@+7\x88\x97\xa5" -"og\x14x\x10\xf4\xcb\xe6\x1d\x32\x5\xd2q\xfc\x6\r\x9aU\x8a\x46\x96\x5\xe5pa\\\xe5" -"\xa6\x62\x9a\x38\xf6\x36\xcc\x63\xeaYL\xdb\xb5\x9aN8\x10Rf\x91@\xe1\x19\x5\xf6v\x95" -"\xaf+<\xe0{\x84\x15W\x2\xa7\x84t|[\x93x\xf6\xe1\x1#\x14?\x5\xd9\x94\x8f\xe5(\xf0" -"\xb8\xfdX\xb2?\x8f\xae\x12P\xd5\xee\xf4@\xcf\x45u\x99\x99\x84\x41/\xfd\xec\xf1.\xa2" -"\xb8\xe4Q<\xf2,\x80\x87\xea\x64\xa9\x8b\xca\xb9\xadg\xbb\x65>\x13q\xbbW\x86\x15\x8" -"c\xd5\xe1L\\\x8b\x11'K\x92x&\xabOY\xec&\xe3h\x92!\xba\x9f\x37I\xdc\x64\xf\xcc\x80" -"\xd9\x94\x8dI\x1f\x9bN[\xbdx\xd8\xd3\x19\x83\xb6\xa9\xdb\x0\xdf\xd2\xe6\xdd\xb0\x8a" -"D\xfb\xb1\x7f\xa7Y\xd2ME\x8\x4\x39\xb3\xafsu\xb9\xf4GG\xb9\x1d\xe3Z\x93y\xda\xc\xef" -"4\x1c\xfc=\xc5|K\xf8\xcd\xbd\xa0\xe0\xe\x90\x8f\x86\xef\x5\x19\x8b\"=\xa3\xd0=%\xd8" -"\x98\xd9\nU\xbe\xe\x6\xe4\\\x9e\xa6W@\xd7\xce\xdd\x1\xfe\xf9\xe1\x43J\xd4~\xb6\x90" -"|krV\x93\x34\x33\xdeUy\"l\xeb-\x1a{\xf\xf8\x85\xa3\x43\xa3z\xe2|\xdd\xa6T\xb4\xce" -"w\xe8\xc5\x9d\x13\xbbO\x94\x81\x46\x13\x32\xf7V5S\xcd\xcf\x15{\x89\xb3'&\xe7!\xe0" -"\xdbX\xae\x80\x34v\xdd\x7f\xb6r\x81\xc0\xd6\xea\xac>\xc9\x88\x9a\x15\x34\xad\x7f" -"a\xb0_Kf6\x8d\xf8\xd5\x1a\x66\xf5\xde\x2<\xb5'p*\x18\xab\x9b{\xc8\xf7\x3\x7f\x43\xc7\xfd\xfe\x66\xfb\xbfL\xc9\xe5Oh\xec" -"=3\xeb\x10\x37\x3\x85\x44\x15\xa8\x38\x96\xff(\x14\x89:\xe8\xbc\x13\x84\x66\x8b\xb" -"\\1\xd5\"\xd3O\xca\x88\nl\xf3\x1d\xc0\xab\x12\x35\x66u\xe2-\xe0\xec\xe2\xc9\x87\xc9" -"-[\xdd\xdb\xd3\xf7\xfa\x81s\xb\xa2)\xa4~T\x93\xae\x14\xbb\xf9\x36\xe6\x6x\xf9\xc2" -"u\x9bl%u\xdb\"\xe3\x63\xcd$\x15\x39\x97\x95 \xa9\x3\xe9\xac\x8c\xf2\xc3\xc7^\" \x98" -"S\x8e?Xh\xf6Jj\x89\xdf|\x83\x32\x82\xdc\x83\xc9%\xe6\xdb\xc1\x30\x88\xc7\xa6\x92" -"\x9d\xd9\xa9\x9c\x91V\xc5\xf5.\xf0HS\xf8x\xc5S\xd7\xe0N\xce\x87\xc1\xa5p\xa4\x36" -"eIA;\xf6\xd1h\xeb^\x19\xb3\xd1\x98\xc3\xedG8\xe6\xcd\xde\x3\xdb\xb8\xb3\x19\xacL" -"\xda\xacM{\x0\x93\x65\xcfo\xa2z\xa8\x11|\xf1\x19\xb7J\xa0M\xfb\xab{\xa1[\xe\xd1\x8b" -"&R;\xc5\x8a\xffx\xef\x90o6\"\xa0\xfaZ\x18\x32\x10V\xa3\x9a\xb1\xe7\xccg\x1f\x13\x16" -"\"\xc0\x10\x36\x1aQ\xf0*a\xd5N\x80\x9e\xa3\xf2%\x43>.\xcctk1\xfb\x2\xc9\xf5\x8\xde" -"d\x8:\xa7\x1e\x8b\xa4m\x9a\xe8\xcK0\xf3\xebIZ\xdd\x95\x83\xe6\x1f\xb5\xb8l{\x90+" -"\x8fQlhA\xd9\xc3\xb1\xdd\xb6\x1e\xb1\xef`\xa4\xd0\x42\xbbt\xfaO\xc\xd0\x14\x8f\x2" -"\x9\x87\x19\xc8\x66/\xea\xc4zM\x89\x1f\xfc&\x9d.s\x18\xb7(\x9e&\x12\xee\xaf\xfeZ" -"\x88\x80\x30\xe6yf\x1b\x3\xd7\\\xd2Qp\x1b$/S\xc5\x32~\rOB\xe4vI\xaf\x18\xa8-~\xa4" -"\xbcQ\xf9\xd1{J\xb2\xd0\xf,=\x1f\x7f$M\xc6j\xa1\xa4\xdfQ\xbf\xe\xfbWG\xfd\x1fzr\x19" -"i\x7f,\xe0\x63\xb9]\x4\xe\xb8\xab\x39\xb1$oT\x11\x9c\x1e\xe\x96\x86\xf7#\xc7Ol\x9a" -"\xc4\xb9pEB<]\xb0\xe3\xd5#\xco\xb0\xe6\x84\xb3\xb6\xc3t\xb0\x61\x8eMt(\x10\x7f{<" -"\x91\x1\xf1W)?\xea\xbf\xfe\xca\xab\"]U.MK\xab\x37\x31\x65\x84\x8d\x9f\x62]\x80\xe3" -"\xde\r#2\xff\xc0\xe\xbb\xf4\xf6\xd8}\nC\x7+v#\x1l\x6\xe6\xf5\x36N\xe5\xc7{,\x1d\xc9" -"/0\xba\xcc\xe7\x83\xc4\xc}\xb8~IL\xe0\xb5\x64\xbe\xbe/\xf3^\x1dHl\x0^j\xacZ\xe1\x93" -"\x1e?\xf7\x35\x8f\x15-H6\xecz\xdc~'\xc5\x36\xe7\"\xcc\x9a\x1d+]h_\xdd&\xcf\xcb\x61" -"pL\xf1\xe6\xea\x9x[\xf8\xe7\xf0\xc6\x94\x30\x1f\xe7Q\x82\x8d\xe0q*\x8e\x83\x3\xeb" -"k7\xf8]9\x89\xdc\x5s\xf5\xda\x42Y\x81n\x89\x44\x5\xf2\x8a\x1e\x34\x8e\x7flYl\xe8" -"\xc5\xf2\xae{\xf6\xbd\xfe\x1d\x35\x92\xab\xa7\x4\x5\xd1\x88\x80\xbf\x45\xe6\x31\x9" -"G\x92S\x8a\x8a\xeb\x32\xa1[\xd5z\x7\xc6\x1\x8c\xb7\xac\xc3\x65\xe3\x8\xa2\xb0\xcf" -"\xbe\xcc\xf6\xc6\x63\xbc\x1c\xf0\x4\n\x19\xb0\xbb\x39\xa8Qgr\xcc\xca\x9b\xfb\x7:" -"c\xd3\x30R\x12\xfm\x90\x66\x35Gw\xd5\x11\xdd\xac-!y\xfc\xb1W\x15\xdd\x63\xa1O\xe7" -"\xb\x42\xb3\xe,\xa3\x38\x91\xe4[\xa4!\x86\x66\xac\x1c\x9f\x10\xd6\xcc\x82?\xb9\xe6" -"$\x7\xef\x9b\xff\xa0y\xc0\x62\xdb\x8f\x82\x80\xac$\x15&\x8b;\xfe\xf9\x31XkEL\xcf" -"\xde\x1cq5\x83\xd6z\x3\x31u\x90m\xb6\x95\x85g\xfd\x1f\xd0$\"w\x84\x1bZ\x98\xe6\x8b" -"\xc4\xe\x9a\x99L\xeb\xc0\x61\x9d\x87\xc4\xa2\x90\xf6\x2v\x80\xf9\xce\x11V\xebK4\x14" -"K\xd9\x9\x6\xb8_\xf8*\x4H\x2\xc7\xf8}\xff\x66\x42\xce\x94\xfe\x1e\xdc\x43\xfa\x98" -"m\xfd\xe2\x96\x66\xf5\x6y\x93\xfc\xc2\xfu*u\x1at\xcf\xd8\xe7\xd5\xfd\x7fN\xb0\x66" -"\x16\x11\x14\x85\xf1\xa8\xe2\\\x35\x12\x62\x9f\xbe\xa5\x82\x18ts\xc>v\x1f<\xb\xb3" -"Q\xfc\x42I\xc2.(\x8qJ\xe9)\x89\xc3\x82\xe8\xfa\xc2\x95\xe\xe4\x33P\xdc\x31\x9a\xa8" -"?\xa4\x3\x9c\x18\x96\xf6[\xf0\xd3\xf9\x9c\xb2\xc0\x1e\x35\x82%@\x94\r\xa4\x87\x86" -"IF\x12\xc7\xba\xc3I\x5(\x8~\xc5\xefN\x9b\x98\xb8\xb5\xfa\xd1\x19\x43k\xbe\x8\xba" -"\x8X\xd4\x36\x83I\xbd\x83\x7f\x9\xc0\x8d\x97p\xea\x45\xb8vn\xbc\\\x5\x1f\xe0\xf6" -"8hfJ\xb5\xee\xfc{\x82\x5u\x3\xeb\x97\xe0\xe1\x38l\x94\x90i\x8Y\x95\x1d\x8c_\xbdJ" -"\xb4\x37+$\x8dJ\x9d\x1e\xb2\xa5\xee:,\x81(6u\xf4\xba\xc0\x13{\xfe\x9f\xea\xfcM\xd1" -"\xf6\x39\x8e\xd3\x3M\xb0g\xa1\xd9\x65y\xc9x\xb2\xcb\x30\xa4\x66\xf4\xf1\xc1\xcc\xa8" -"\xd9\xeap\x17\x45\x9f\xa9;/\xbd\xff\xf2&\xf5\x82\xf\r&\xb}\xeb\xa7\xebW\xa3Z\r\x8e" -"}\x1cpC\xee\xb5\x1c\xe9\x1b\xda\xc4\x12\xd5\xda>+e\xad\xce\xed\xce\x18\xd4\xe\x97" -"0\x1dI;\xcf\xad\x62\x9p;\xc2\x1a\"\xc4i\xd0\x84\x43\xe9\xcc\xd1Z\xd1\x1\xfd!\xc6" -"\x8e\x39\x82\xc5X\xf6\xfb\x11\xe4\xf6\x82\x65\xc0\xdd\xff\xa6\x82\x18\xdfX{\xd5\x34" -"\xf0\xed]\xf9\x88\xbf\xca@\xc7\xbfs\x85\xc9\x93\x65\xea.@A\x9a\xcao\x18\x97\xd8\xff" -"\x11\xd5\xbc\xa1\xee\x80\xd7o\xee\xb0\x8f\xcb\x38\x12s\xb6\x98\xe\xf3H}I#\x1bOz\xc7" -"\xac\x97\xd0+\xaa\xf1\x41-RZ\xe6\xee\xec\xde\x89K\xbc\xa8\xb1zp\x1\xec\x95\xbb\xc9" -"b`\xc3&\x93\xb1\x12\x65:\xe0\xf2nG\x1f\x92\xfGY\xcb\xc2\x99]\xb0\xde\xb5\x39\xc\x88" -"\xd2\x83>n\x13SS\x7\xef~\x91\x41\xf1\xf8\xd0\x4\x7f\xd4R\x9j\xd6\x87\xac\x30\xb0" -"k\xd6\x95\x12\xe7\xcd\x0\x9a\xa2\xc7\xf4\x37Thz,\xdc\x5\x85\x35\xef\xack\xedN\x9" -"\x99\x44kU1\xb5;w\xb6\x7\x2\x91\xd0\x89\x2\xcb\xfb\xee\x1c\x6\x31\x9e\xab\x17\x32" -"\xa1\xee\xd5Vs~K\x4\xb0=D`\xf5\xb8\x14\xfew0\x1a\x9bX\x9d\x12\x10\x96\xe2y\xf6\xaf" -"\xee&1y\xeqH\xfc\xc9N\x1f\xa8m\xdc\xe4\x86\x9f\x96{$m\x94\xb1&\x17\xab\xae-\x95\xad" -"\xd1\x2\x89\x8d\x34\x33\xae}\xe4\xdd\x1a\xb x\xb6\xa6\x8dn\xe\xe1\x83.]6\xb8\x30" -"\x8d\x93@\x8eo\xcb\x8a\xe9\xf4\xc6\xb5%X1\x14y[\xbb\xea\x39\xdf\x3?\x8f\xa9\r\xba" -"\xc3\xa4\xeeU,~\xd7\x1\xe1\xf5\xa7\xdc\x41\x1a\xa9\xb5'\xa2IV2j\x86\xc3o\xda\xb2" -"\xdak=e^\xfe\xab\xb6\xc\x89\xfd+P\xef\xd6\x88\xb7\x61\x12\x92_\xd9Of(\x9f\xdc\xad" -"\xb\xad\xea\x45\xc3(\x9b\x7f\x14}E\xcby\xab\x8\xfdH\x90\xfb\xf5\xcb\xb8\xea\xbf-" -"p;\xe3\x82o_\xd5\x83\xc9*\x89L\x1e\xc9\xdd\x85\x34\xa0=c\xe1\x86\x9aq\x93\xe3`F:" -"\xdc\r}\xe4\xb9\x30\xce\x6\x31\xf2\xb7\x39t\x13\x80\x9f\x1e\x31\x43\xe6\xdb\xff\x12" -"q\xec\xea\xfaq\xdb\xf7\x17U\x9f\x65\xf6Oa\xad}\x99\x31\x31\xe2\xb5\xc4\xe3&\xec\x1" -"3\x89\xb5\xdb\x81\xe1t(\xef\x97\x16\xe8\x46yM\xbd\x83\nt\x0\x97\xedY\x8bZ\xf0O\xcf" -"O\x86\\\x89ru\xf8\xd8\xa1\xfe\xd7\x7f[\x16\xcc\xf1\xd2!\xe9\x19%i5\xfb\xab:\xb0\x2" -"i>\xf7\xf7\xd8\xcb\xe1\x9d\x94\x42\xe2\xf4\x82\x89q\x91\xf6w\x4\x41\xab\x62\x92P" -"9s[\xe0J\x9\x31\x94tF\x18~j\xa5u\xebM\xf1\xb8\xb3\x13\xb7\xdeWN\x81W~fHc\xe5\x42" -"\xc0\"\xa4\x45\xa3()>Nx\x8b\xad\x66P\xbf\xb9\xb6\xc8\xa7u?\x88`\xc7\xb3\x81:\xa3" -"fH\xbd\xef\xa3\x93$tDc\xf3\x87\x31oq\xf\\\x8\xdb\x31\x92\x9d\xdc_\xed.\xf5Z\x11\xee" -"\x1d\xb3\xbf\x32\xe7\xa7\x37\xba\xb9\x33\x30:}\x7\x62\x8f)>9\xf6\x33\xe0$\xc9\xdf" -"\x82u\x9b\xeb\x43~N\xde\xc5\x66\x80\x39\xeb\xa7#\x15\x8e\xf4\xf7\x99\x8bhj\x86\xa5" -"\x1\xdd\x2\xd9\x87.M\xbb\x84gD\x8c\xac>B\xdf\x84\xec\xb9*`0\xa1=2\x86g\xef\x97\xdf" -"\x7v^\xf3\xb9\xa3\xf2\xa6G\xed\r\xee\xf5\x9a\xee{\xc8\x83\x0\x9e\x32\xc3\xeeS\xda" -"B\x13WHn:\xcd\xc3\xa2\xfat\xa7\xce\x17\x83\xeb\xe5O\xfd\x38z\x93\xf9\xb3\xd2Xe\xec" -"\xc1\xc2\xa2P\xa2\xca\xae\x87\xe5JF[e\x1b\xb4`\x88J\xa7\xcb\x85|\xce\xb5\x90\x31" -"\xc9\x37\xed)\x1a\x93:\x3\x2\xaf\xc1}\xa7x \x12\r:\xfa\x7\xd5\x2\x11\x37R\xcb\x61" -"\x95\x6\xff\xeagD\x96\x81\x6\xc8\x9c\x84\xe9)\xf2\xef;\xa2\x17\x11g\xdd\xf1Y\n\xf4" -"\x1d}\xd0\xa0i\xb9k\xfc\x66\xb9\x14\xfc\x1b\xdb\xc\xef\x99\x31Mx\x99\x13\x0\xb3\xc0" -"P]\xd1u\xa8\x36\xc0\xb5\x99\x9d&ffL\xee\xc5 \xb4\xe9\x85w\xc9\x82\x97L\xac\xe0\x87" -"/\xc1\x1X\xce\xec\xe2\x32'\x1\x88\x8e\x64\x85t\xf5\x14vW\x4x\xbdk\xa8\xc3!\x8e\x96" -";Z\xd9\xfag\xa1\x88#\xaf\\}\xe7\x9b\xa1\xb\x2\xa1\xe6\x88\xe5\xc2\x9c:J\x9al^\xad" -"k\xb7\xbfZ\x1b\x0\xb2\x15\x15\xbe\xa7R\x8lQ\x85Sr\x9\x6P\x9d\x8fK\xeb\xbe)?\x8cz" -"\xa2\xc4T\x98Z\x12\xa6\x62\xfe\xff\x7fo\xaa\xee\xfe\xbe|m}E\x88\xe1\x46;\xab\xe8" -";\xd9\x3\x15\x10\x12\xcd\x34\xf9\\\x9c\x97v3\xca\xb6\xb3\x64\x99\xb2_@\x8d~b\xb1" -"\xf8\xa9\x2}Q\x1d\x89\x6\xa3\xa8*\xba,\xa2\x8b\x12\x8c\x97L\xf2\xc2\xde\xd1h\xce" -"\x8a\x1d:\x97\xc8U\xc1,Q\xf8r\xc8\xae\x33\xea\x97\xbc\x95\xcc\x13\x15\x9f\xe9<\x97" -"\x9a\x32\xb0^2n' D\x1b\xee\xc5\x65\xc3\x8\xf2\xe8\x88\x0\x16\xb9\x89\xc3%U\xa5\x62" -"\xba\x8\xf3\xc5\xb0\x42\x89\x9b\x1f\xaf\x93T\xf1\xf0\xda\xc4\xb0\x9c\x32\x1e\xcb" -",f&y\xd6\xb6\x92\\\x1d\x61[\x10\xf6\x34\xea\\\xeaIV\xa2\xc0\xdf 8\xf0\xa8]\xea\xb7" -"\xb6\xc1V\x19\x91\xf8q\x98\xd7\xbc\xed\x45\xcd\x15\"\xf6\x9f\xc8^gV\x1biJ@\xdbL\x9b\xf2\x9d\xdc\x39#D+\x9b\x16\x9c=\nSP\xd8\x10\xdf\x19\xe6" -"F\xf2\x30^N\xeb\xa5\x61\xbf\x85\xea\xea\xe5\x1eM{\x81\xd3\xad%n\x95\xebj\x1f\xa9" -"*\xa4)\xd7\xe2YZl\x87\xa9\x94RYP\x3&\xc3\xdb\x1fY\xd3\xeb\x8c\xc1\x1c\x7f\xeb\x8a" -"k\xf1\x82\x46\x86\x31\x66\xa0\x9ez\x8c\x8f/T;\xbd\xb5\xa5\x85\x92(X\xd8~\x87\x96" -"#\x13\xe7/\xf2\x82?\xb0&(e\xab+^\xba\x8a\x8f\x1c\x82@\xa3\xd3\x86N\xa1\xa7\xaat:" -"\x98\xe0\x9ej\x81m\xd7\xe1\x7\xd1PG\x12\x64\xa8\x5\r\x2>\x4\xfaH\x15xA\xf\x99j\xfc" -"!O\xa6\x46\x8d\x18JY\x10\x31\xd5rc\xff\xab\xf3\x32\xddp*\xc4\xff\xb0\xa2\x82u\xad" -"9\xa4h\x80Z@\x4)\xfa;\xf2\xee?\xfc\x18\x13g\xab\xeenW\xc6zM\x95\xd5\x1j\x81\x8f\x1d" -"\x8b&\xe0\x38\xe1\x1b-\x13\xe5K\xa4\xc2\xf9+\xff|P,Z\xce\xffXJ=\xa4\x2\xf6\xc7\xd4" -"=\x4\xe0\xf2\xf6\xc4\x16\xae\xb0\x97\xff\x42:\xf2K\x9e\x1d$\xe1\x30\xd9\x81\xc1\x37" -"\xb7v\xeaYQ\xae\x1\x3\x95\xca\x30\x80\xddSw\x1e\xe\xce\xb\xfd\xae\xf8\x31)'\xb5\xc7" -"7|I\x80\x93R\xe9\x11\x35y\xb9\x43-\xb7\x9a\xf8\x8a\xe\xf9-;\xae\xaf\x8c\x3R\x12*\xd4\n" -"8\xb4\x8c \x12\xe0\xea\x44\xe7T|\xb4I\xf5Q;\xadGK#8\xbd\x91\x95\xce\xe4*\x8f\x9e" -"U\\8\xfa\x1f{\x95\xfc\x2<\x1a\x30-R\xccO\xb2\x41\xd6\x2\xc4'1_\xdb.\x4G\xdc{\xfd" -"\xa8\x93\x9a\xa8\xda\xcd\x33\xd6\xc4\xe4\xf5\xf4\xc9\xeew\xa2\xfa\xbb.\x1n\xd1\x32" -"Jw\xf8\xc2\xc\x1f\xb6!>\\\xa5\xec_\xec?`\x97\xa9\x9ch:\xee'k\xf3\x19~\xbeT\x7f\x10" -"\xf4\xf1\xfd\xb0N#\xdd\x9d\x91\xcc\x1b\xb5-cl\xa6\x45\x9c\xfd\x61\x0M\xcaZ0eY\xc6" -"\xe4\xa7\x3\x91T\x8f\xba}(\x8\xfb\xa5\x4\x18s#UO\xbdT\xee\xc1\xb7 X\xde\xb6i\x9b" -";\xf7s(\x16\xbd\xfb\x65\x14\xbcM-\xed\xe8\x88\xf6\x3\x1\x6P\x9di\x1au\xe7\xd8\x8f" -"\x8f\x31\x43\x9d|PV6\x8d\x89{\xd4\xd6\x1di\x1a\x83\xb5\x45\x37xQ\x16\xe1\x64\x9a" -"\xa8\xdbO0\xc1\xda\x1f\x45?~\xd7\x85\xe9\xccW\x8\xd9\xb0\xca\n\xda\x30\xc9S\xe1\x96" -"\xde\xd7\xa4\x66$\x96\x90\xa0\x35\x35\xb2\xf9\xec\x9d\xf1\xcb^`H\xe3\xc5\xd6\xfa" -"\xff\x46\xc7\xec\x1f\xc7\xbb\xd5\x30\xf9\xfe/;\x93\x16\xfc\xd8\xe9m\xe3\xe/N\xfb" -"$4\xe9H#K.\xe7>\xf6\x87\xc6\xf2\xf6+\x5;\x4)\x9b)\x81~\xf3\xd2\x88\xf\xe5\x7fs\xe9" -"\xdc\x91!\xab\x99]?\xfd\xca\x8dsg\xc0\xf2\x1\xdd\xe1\x6\x9f\x65\xa2'\xabH&\xd9\x9c" -"\xee!\xa0P\xc9q\x82+zU\xadn=\xea\xe6\xbc\x81\xb7|g^\x1a\xbdt\xfe\xe7\xe6\xcf\x10" -"7\x94\xc2\x9a\xef$\xe5\xf5%\xcf\xcd\x85\xd9\x85\xd6{L\xedS\xfa\xe8\x61\xb3G&\xf9" -"\x13\xd9\xcc\x83W\xf0\xcd\xf0O\x1di\xed\xe6\xfa\x44l!nPE\x7\xf0R\\\xc3\x62Y\x18." -"\x8f\x3\xd6}\xa3S\xe\xd9\x8f(K\x97_\xd3\xc1\x0\xd5\xf4\xd8~\xa5\xa4\xc0\xe6\xc8\xc8" -"\x19\x99\xeepM\xf7\x85q\xe1\xb7\x90\xf6v\xc9\x96\xc4\xe9o\xe2\xaa\xa6\x9a\x9f\xcf" -"\xdd\x2\xb2*\xf2\xa3\x16\x93z\xf3\xe9\x8aO\xe7\xd2\x35\x64i\xa4'\x2\x12\x44\xb2\x46" -"\xd5\x93o\xa0m\xe8\xd2\xdd\xc\xd5\x9e\xbdM\x8e\x37\x4\xaa\x1b\xdbv\xa7\x97\xf3L\x4" -"Nx#\x9f\x35\xc4\xb1\x88\xcd\x19`1D>\xc7\x6\xde*\x2\xe3$\xdd\xf7\x34\xdf\xc0\x45\x89" -"\xa7\xfc'\x2%y\xc9:Qo+\";\x90Sl\xac\xc2\xa7\x8c\x46\xe5\xa0J\xf;\x17$J\xc5\x0&\xfd" -"\xf\xa5\x9a\r\x43\x0x4\xde\xeb\xf0\x87\x65o\xf3o\xae\xb0xj\x8=,\xfd\x97@3\xc8\xdb" -"f\xc3\xf0R\xb4\x9eu\xddi\x11.\x9b\xd0$S\x9e\xe0\x15\x36\xa9\x97\x19\x83\x97\x9b\x10" -"\xb\x84\x15,\xf6\x1d\xa5\xc3\xdd\x43\x81\xd2\x5\xf8\xe\xf1#v\x89I?|\xbd\xb6\x9f\x85" -"\x9\x8$I\xec\xb9\x46&\x8c,\xf3P\xb3\xfdKfN\xe1\xb\x63\x36\x43'\xb1\x1cj\xd9)^\xfc" -"|\x92\xa5}~\x92\xbfxk|4p\xfan\x18\xce\x64\x85\x9c$\"X\xb8]aF\xf0J[\xe1\xf8v\xc9\xde" -"\xf3o\xc8i\xdbz4G^Q\x1fSJ;\xed\xd6\x9f\x1c*x\xc0s\xaf\xcd~\xfeX\x80\xffM\x8c\x5\x90" -"\x8e\x45\xcd^-\xf8\x10\xa1\xea'\xb8rz\x7l\x2\x45n\x3k\x9f\x85\xcf\x9c\xb9n\x83\xf8" -"|\x8c\xbf\xbf\x65\xa4\xdenx\x85\x61\xae,\x5\xa5P\x12\x1\x99\x91\xbb\xf4\xef\xcb\x93" -"\xa1\xd5\xf7m,7:\xe4\xc7\xe2~7\xcdJ\x8b\x10?\xb4\x11\x8b\xc6(\xee\xd5I\xf\xdf\x9b" -"\x5 (\xeeO\xac\x83\xdeGm\xb0\xbdx\xe8\xb2\xd4\xdf\xc5\xbd`\xdas\xb0\x31\xcb\x8e\xf" -"\xed\x97\xd9\x97l\xf7\xb3\x92\x8b\xbd\xdb\xff\xf1\xb4q\xa9\xe7\xdf[2e\xa2\xe2Q8\x9a" -"\xfc\xe6\"\x66\xd8\xb2\xff\xcd{\xbb\xf4=\x80?z(uY\x80\x99R\xbc\xa7]\xa0\xb4\x35\x66" -"\x1b:\xd6\xd2ZL\x3\xc5Wq\xed\x42\x32\xf0k7\xc4\x19\x4WCq\xd2\x7fh\x3\x99\xab\x14" -"\xcd|u\xee\xda\x10N\xd5\x19XH9\xce\x3\x39\xbfk\xc5\xcc\x42\xa5\xc4\xdb\xccY\xb4\x38" -"d\xc7\xac\x85\x9d\xfb\xf3\x62\x1d\x19(F7\xc4\x39\x9f\xfe\xb7\xcf\xdc\x8d\x2\x1\x1b" -"X\xbc&\x9b\xac\x8c\\\xec\xbaH\x9a{\xdf\xca\x42\x8\x6%\xc5\x66\xfe\x16\xf1x\x9K\xce" -"z8-\xcf\x85\x90\x90\x99\x1c\x85\xca\xba\xd2\xb7J\xf1\xe8\x5rDF\xac\xab\x13\xd7^O" -"\x94$\xf3\xaf\x64\xa6\xf0\x1f\r\xb9\xb6z\xa0'$\xff\xf5\x1c\xc\x1cn\xb8>\xb3\xf9\xd3" -"T~A\x8\x98\x1dsF+\xd3\x38=\xa8\x35:\xef>\xb3\x1f\xdb\x34\x90\xc1L\xcf\xbbS\x1a\x83" -"\xbf\xa6\xbf\x96\x9f\xf\x65\x8c\x64!b\xfb\x93\x86\x66\x9b\xd1\x9b\xc8\xee\xeaw\x7f" -"\xf6\x30\x18Xq\x9aZ-\xf8\x82\n\xb9\xe8\xbe\"P\x1\xf0}\xe1\xd0U\x8e\xa2\x36`Y>\x1" -"-O\xe1;\xf0\x1a\xdd\x65\xce<~yB\xecR\xdc\x81KBO\xd6W&\xdfvji\x13\x41\x92\xd4\xd6" -"\x81?\xa5\x37\x0\xc1\x8cg\xffv\x9f\x7f\x1a\xf0mH\x6\x1a\xc7:>9 \xaam\x1a+C\xd7\xd5" -"\x82\xd3\x8c`9\xb1_\xca\xae\xf6-C\xf9JfWE\xe2\xec N\xa0\x88;B\xc4\xb\xba\x1a\x95" -"\x89\x1c#\xeb\xb9\x1a\xe1\x7\x11\xf1w\xc9\x65\xf2\x8cI[\xbc\xa2\xd5W96<\xc\xec\x61" -"\xa6\xeeH\xa7u\x96\xba\xc\xd6\x34i'jH\xc4\x89\xf1\xf2\x65tz/$\x18x\xa7\x6\x44#C:" -"\xa7zv\x8a=\xab\x5\xce-\xf1\xee\xe4:\xdfq\xa0\x18\xee\x44\x90\xf8\xe9>\x0\x16P^\xf" -"\xb6\x95\xa3\xcc\x9fk\x92\x88\x9dM\x92sQ^0\xca\x61\x8a\x64\xa1\x13'\xa6\x95\x42Z" -"\x85\n\xbd\xdb\xc0\xe1\xb2\xc2h\xc9\x98R\x9c\x41\xe\x37\x1aQ%\x1f\xd2\x7f\xeb\x64" -"tMd\xd8\x6\xeb\x9dv\x86tw\x9c\x1d\xdb\x15t\x0\xc8\xe6YQ\x18\xb7\x45\x18\x12\xb1\xe6" -"\\Y'GR\x96\xd0\xad\x9eT\xe8`\xfe\xea\x7\xff\xee\x65\xbe)\xce\x5\x89\xa5\xd3\x95\xb7" -"\xa9=\x9M\x8f\xfc\xbd%\x8d\x92\xa8'm\x2\x9d)a\xde\xd8\xe9\x39\x10\xb2T^\xaa\xc2x" -" \xd4\x98\xb7\x92\xaao&\xb6\x30\xdbI\x8c\xdc\xa1\xf8\x12/\xda\x99\xfe\x16\xb5\xf5" -"\xb3\xban@\xfbH\xc2\xce\xe2\xa1#\xbb\xa7p\x1f\xc6\xe3\xf\xb4*\x18\x13i\xfe\xb1\xb2" -"\xba){\xddZi\x2\xf6\xe3\xa3}_\xb6\xdd\x0\n\xb5\xa9\x17|\"\xc\x2u\xa8\x9a\x34L\xa6" -"\xff+\xb1\x87\xad\x19\x46*c\xfb\x93\xed\x31S\xa1#\x87\xb9#\xcc\xbds\x17\xac\"-e\xc5" -"\x92\r\xb5]~\xbe\xb9\x18\xb3\xee\xc5\x83SbE\xa0\x3n[\x4&:\xe9\x87\xac\xd5\x4\x4K" -"2\x7\xb7\xa1\xad\x1v(\xd7Z\x99(\xc1\xaf\x34)\xf5\x63T\xa2\xc9\xbf\x1\xe2\xb1x\xaf" -"\x18X\x8eR\xf\xb5Y\x8\x45\xc8\x45\x61\xd3\xda\xePL\xd7\x45N\x99\xcey\xb\x7f:\xae" -"\xf4\x99;\xafu\x12u\x9a\x98\xf0\xe7\x43\x82v\xf4\xf8\xec\x62H\xe3HL\x84'u\xad\xae" -"\xab\x6T\x11\x89\xf0\x98\xb0K\x1dHt\xf1\xf2\x32\xf9\x31\xad\xde\xc\xe1\x42\x65\xa8" -"\xb2\x98\x61\x44I\xb1\xa7T\x88\x83\xc0N\xfd\x89\xe0\xc8\xe8\x83,\x14\x43\xc8\xb9" -"\x14\x88\x9c\xaa\xbd\x87\xbe\x9a`\xb~\x97\xce\xad\x30\xa6\xf8\x5\xe7\xa5\xd6\x1\x17" -"\xab:\x17\xc\x1e\x38m\xce\x89\x16\xff\xbf\xd7\x31;\xda\x1\xa9\xb3KC2\xbd\xeb\x85" -"\xa1\xb2\x9\xa5\x1\x33\xe3\x96\xd8\xf1\x8bO3$}\x94\xe4\x99\x19\x42l\xa4\x9\xa6\x1e" -"H\xb7\xf0\x30={fW\xd5\xae\xfd\x18\x80\x8f\x9d\xcb!\x1a%\x38\x97\xa5\x98\xdf\x12\xf" -"\x12\xee\xbf_\x13z\xea \xea\xb4V\xf6\xd0\xe4\x5\x8f\xb3HG\xb6\xce\xc4\xdc\"\xeaU" -"\xf9\x44\xa9s\x82\x8d\xcfRA\xed\x8ah\x12\xe0\x13\x18\xd6\xd5\xd8\x9c\"\xb1\xfa\xdc" -"\xac\x39sP\x95\xa3\x1b\xbf<\xdd\x92\x36\xdf\xed\x16)_5\xb8\x0M7wZQ\xb?\x9a\xa8y\xb2" -"\xb2\x8eJ;\x17\xfd\x95]\xee\x8b\x8b\x92\xad\x16\x18\xe9\xa3G\xf3\xd6t\xb9\xbe\xe9" -"\xf6\xf7\xbe\x11+\xcc\x88\xbb\xb5!@L\x14\xe4\x10\x63\xfc\x9b\xde\xea" -"\xa0\xa2|\xea\xb&A\x80\x92J\xff\xda\xe5\xd2 ^\x9e\xbd\x45\xee\xa4h6\xe7\x87)\x95" -"\x1f\x10\x1d\x89\xe9\xa2\x86\xd7!OT\xc9\x82\xda\x32H\xa0S\xec\xbf\xbdN\xe8\xca\x18" -"\xf1\x82\xef\x86[\xe4\xf4\x88\xf6\xb1\x84K\xa3\x46=\xd3\xbf\xb9\x1a\x83\x2\xb7\x13" -"#\xc5\x9e\x4$\xfd;\x6\x8a\xd6\x98\xbe\xa3\xb9\xe2\xb5\xa8S3\xef\x93<\x6%\x14,3]\xea" -"\x0%\x9ds<\xd0q\xe6\xd7\xecp\x84\x7f@VH\xe9\xd5\x98\x16\xc6\x9b{\xeb@\x18\xfa\xd4" -"Ro\x1d\xbe\xc8\xc1\xca\xf4\xe8\nKRH\xf9\x46\xb\x95}K\x19R\x19K\xae\x1\x9a\xd3\x83" -"\xfa\x85=\x80(\xe8\xe1\xbf\r\x98,\xd1\x1\x82\xfd\x9e\x9fk\xf6\xb9\x43<\x14\x9f\xca" -"u\x9cS\x8d\xde\x62I\xe2\xb4\xe1\x37\xf3\xa6)zK\x18~o$M\x97.Io\x2\x17\xb4*n0\x94o\xc\x14k\x9dP~\"\x14Vi\x9fM\xca" -"\xb0\x35\xbb\xcc\xd1\x90\xb8\xbf\xcb\x0\x4m\x96O\xc3^\x1f\xe9\xa2\xeeLN\xd1\xf3p" -"\xb7)\xd6\xbb\xad;\x7\x82:\xcf\xd2\xfa\xd4\xed\xfa\xaa\xda\xfe\xe7\x8e\x1d\x8d\xee" -"\xc\xd6\x8c\x32i\xe1:\xe8\x9c\xd1\xc7\x2\xb0\x8f\xc1\x88\xddo\xb3\x86\x1e\xd5\x37" -"\xcf\xe4\xb3!\xaf&\xcc\x92" -"\xf9@,/8T\x7\x61\x99J}G\xcc\xad\xdb\x42g\x9dS\xe5$4\x1d\x86\x46\x8e\xe7\xb4\x12\x9c" -"U\xc0\xa3\xe6\x8\xe1\x90\xfc\xe9\x42\x13\x87\x90\xc7\x8f\xc7p#\x8b\xfc\xf7\xaf<\xda" -"\xdc\xe2\xfem\xe0\xb3\xd6Q\xfa\xfe\x9\xe6|\xe\x88\x7f)C\xaaX\xf9h\xc1y+\x1e\x8at" -"\x81\xc5T\xe8r|\xe8\xfe\x1d\x13i\xbdR\xb5Y[3:\x6\x63\x1e\xb\x11W\xa2\xaf\xa8(<\x15" -"\x14\x38\x30\x87\xf5nY \x8e\xa8\x3\x8f\xa5\x16\xa7zKU\xe\x1eW\"6\xc8\xc9\xc7\x9b" -"\xe3\xba\x37\x2\x15\n\xf3\xc1\xaf\xec\x8b\xc\xf8\xa5\xa7\xe1\x99M\xc6\x1d\xe0\xd9" -"\xa2W!\xcal\xff\xdc\x88\x89\x16\xdf\xd8\xcbQ\xd1\xfc\x18\xd0y_\xc0WHg\xe7\xd0W\xb2" -"F\xbb$\x8c\xb7Y\xe5\xf8\xbb\x98\xe5\xa2\x93\x42\xd4\xc8\x8v]=\xd9g\xb7\x11\x8s\xbd" -"0\xae\x9a]>\xe8RW\x1a\x63\x5\\r\x85\x4T\xe3\x19O\xe4\xb\xd0X\xd7\xb7\xa6$\xa2N\x9a" -"fA\x13'\xdcU\xac\xba(1p\x82\x14\xe5\xaf\x96,\xfd<\xb4\xf0\xd7\xae\xce&HFf\x19\xc8" -"\x9c\xf9\xe\x9f\xef\"\x8aP\x9f\xae'\x86s\xcd\x16\xd3\xad\xae\x95\xb4\x37)\x1v\xb3" -"\xe0\xb5\x46iI\xd4\x31\x1c\xdf)\x8a\x15v\xc1\xc8\x1\xec\r\x43[\x85\x14\xa8\xab\xbc" -"WN\x1d=??\x97\xdaS\xda@]\x98\x32\xe2Rn6\x16\xa5=\xd4\"\xd1~\xe6\xf4\x66\xf1\x1\x8b" -"4?\xfd\x8a\xa9\x61\xb0\x35\xf8\xd6\xb2\x99'Ux\x98\xab@\x1f\x0\xb9\xc6K:\x1a\x89\xcb" -"\xea\xa4O\xc2\x11Y\xef\xfc\xc2\x91\xb0T\x12\xc2\r\xbd\xcfW`H\xb_`\xab\xa3\x10\x1a" -"\x19\xbctE\xc3\x9e\x86\x4\x7f\xe4\xd4\x92\n\xad\x1f\xca\x8e\x8b\xfdtC\x1c\xd0\x17" -"\xb5\x2\xdau\xd2\x9W\x13\x80\xe7W+\xa4\xc1\xf8(I\x98\x31\xc8\x88 \xac}\xe1\xcbK\x9c\xe1\x13\xf6\"\xeeWj_M\xfe\xa7\x81\xe0" -"\xd1\xb0]\xc6\xad\x39\x89\xb3\xb8\x30\x8a\x38\xe9\xcc\x93\xb9\xae\x11\x63\x82\x10" -"\\0\x9\xd9\xf8\x36\x7f\xcd\xe3\xd8O\xb]\xa6p\xe1\x33\x1d>h\xbf\xe2\x18\xe\x4\xa1" -"l3\xa2X\xf0rD\xad\x9c\xf5jO\x9d\x46\xf0&D\xfd*\xfb\x91\"\x44;\x6\r\xb8\x99\x44\xf9" -"\x0\xd7\x7f\x37\xfd\xaf\x7f/m\xeaU~\xb6\xbe\xb\x10%\xe1\xe7\x42\xd0\xf5\x10\xdc\xa8" -"e\xa5q\xa6\x31\x32\x9f\xd1\xc8GPE\x89|\x85U\xa5\xa1H\x9b\x84Z\x1chY&\x8\x84\xf1\x93" -"\x96\xc5\xb6\xbe\xfc\x12\x16Wtg\x8bO\xc7LV\x95\xf7\xe7<\x84&\xe9\x88\xbc\xa8\xb9" -"\x8eQC=\xd7n\xb\x94\xbe\xd5\x5\xd7\xc8\x10\x8bU\xdf\x1a\x81\xdc\xa3\x8c\xff\x88Z" -"\xa0\x45\xda\xe\x9d\x92\x1e\xb0\x13\xe6\xaa\xfa\xb5\xac\x15(\xbf\xf1\x10\x9d\xa7" -"\x1d\x85>\xb8\x35\xcd\x90\xe9\xc2Y\x9ds\xc8\x12\xe8)Y\xd7\x41\x66l\xb6\x13\x31\x85" -"\xc8\x39Z\xc6\x97\x32\xa4\x9es\x87K={qS\x1O\xdd\xdb\x90q\x12\xbb-\xa5\xe4\x61\x62" -"\xa1\xd6\x7fR\x88\xa0\xf7@\xab\xb4\xe4\xbb\x33\xb7\xda\x8\xd8\xf3\xdd\x15\xdc\xab" -"\xe7\x30'\xf4\x18\xb8\xb6lytZAU/\x95\xf7\x84\xdd\xf4\x62\x33\xa5\xa6\xe7;\x9bo\xb2" -"\xe0\x9f\xe\x90\x9R_\xd4I\xae\xc9;\xc9\xe2\x14\x89\x90\x16Xn\x90\x80)\xa3\x98\xda" -"Y\xfG\xf3\xb5\x13\xec\x8\x17=qX\x8a\xc\x19jX:j\x2\xec\x34\x18\x3\x31R\xbc\x35\xe7" -"\x11\xf0\x33um\x80=\xdf\xa6z\x10>A\xbdT\xf8\xcc\xa2R\x83\x8~j\xee\xb5>\xfa@\xceo" -"\x11\xc0S\\\xf0scO\xe0\xb~\x17\xd7q|\x9e\xb7\x8cKB\xb3\xda\xc3\x98U\x93\x1e\x89\x36" -"\xd1V\xac\ry\xdb\x34\xc9Z\x84\xcd\xfa\xcc]~\x10J\xb8\xbfV\xd6<\x8d|\xbb\x66\xa8\xa2" -"N\x93\xb0-Y{\x16\xe6\x87\xbd\x30\xf1\xc3\x42\\\x41\\\x17s2v7\xff\xebL\x2\xcb\r]\xf5" -"\xd8\xf5\xb0\xfd\x85\x7f\xabG\x96\x44 \xb7\xa7\xd2\x66sv\x91,\x4\xd4\x8c\xc3;\x17" -"x\x16\xe8;\xff\xbcz\xda}\xcf\xfcL\x17\xee\xf1%\xc9\x8eS&\xc4\x94\x90\xde\xf7\xb1" -"\x88Og)2\xba;\xacU\x1j\xe0\x65\x95\xfb\xd6\x1a\xee\x42\x81\x17\x1dqm\xd7\xba/<\xde" -"\xc5\x92\x62\x84r\xfe\xc0K\xd0\x12\x43Ml\xe8\xd1\x1e\xf2WVN\xa7\x11\xfaNq\xf0\x64" -"\xaa\xef\xe9\xce\x41G\xa9\xcd\x1cO\x12\x14^G \xcb\x36\x96\xb1\xc1\xfb\x0\xfc\x87" -"T\x96 \xc9\x88\x8d\xe3\xbd\xb4\xeeR\xd9\xb8v\x96\x1P3i7?\x9a\x9b\x33\xba\xb4\xc9" -"t{V\xa0\xb3V\xe9; \x81\xb4\x32\xbe\\nG62\xcd\xdc\xd2\xc2\xc7\xc4O\x87\xebJ\x17\x46" -"\xbe \x9cSp_\x4\x87h\x9d\xa1\x35\xeb\xd2\x9cS\x9c;\x9c-\xcb\xb5\x33(\xb3\x11J\xf" -"\xc9r)\xef\x94~\xaap\x11\xe9\\H\xe9\x64}{\x10\x65\x13\xfeW\xfb\x0\x5-\x13\xf3Y\xe4" -"\x7\x9\xd4+\x9d\x7O\x17\xbb\x33\xb7\xda\x14\xb\xed~\xf8\xde\xb7\xe1\xce\xff\xd7U" -"\x89\x91\xe2\x86>\xf4\x43i\x1fi\xf1\xee\xfa\xac\x64vb\xac\xda\xe\xbc\x8a\xa7\xcf" -"\xeek!\xb3\xceq\"\xc8\xc6\x11\x98\xfd\xf9\xc\x1b\xb9\x43(\xfc\xc8\x96\xc4\xbb\xe6" -"\xe0\xa7\x1d\xa4\x41XB\xc0\xa0\xddo\xac\xbbK\r\x9cj\xb5H\x91\x8b=\x97\x90_Xu\xbd" -"51\xb2\xb5\xf0\xee\xf6!\xb8\x10\x64\xd2\xfaQ\x17\xb6\xfet\x8c\xbara\x1f\x64\x61\xc0" -"\x8a\x9d\xd5ni\x86\x9e\x96[@\xe4/Q\x5\x62\x9b\x1b\x89 \x99\xd4\x87\xd9\xf8\xe1\x16" -"Xz\"\xebNCs!\xd8\xe5\xc9\x9b\xa8\x93\x8dO\xc1\x1d\x89\x86\x10\x8f\xa0\x9a\xd1\xad" -"k\xde\x1a\xc5\xb3\xd6\x80^\x93\xdc\xa2\x83o\x98\xaf\xe8\xa1\x13\x37\x84\x95\xca\xb6" -"x\xa2\xdd=h\x89\xf2\xa9\x66\xd5\x80\xb9\x1e\x15$W\xba\xe\xa2\xed\x31\x95G\xd3\x36" -"\x84<\xf0Oz\xb8\xe7\x1a\xe7\xca\x1a\x9f\x9d\xb0\xd7\xf0\x87\xab\x0\xaa\xc5\x85\x19" -"\xed\xb2NK\x9b\x35\xc0\x62\xc2%&,,|-p\xe2\xb1\x1d\xb4\xc5\x16'm\xb5\x1c\x9b\x66\x64" -"\xc6|\xa3\x9\xc6\xdaw|\xc\x8\x88\x1c\xc\xf\xadl\x85G)/\x4\x42U\xa9\xd2\xddT\x6U\xe4" -"\xaa\x43v\xca\xb\x33O(\xda\xfaG\xaePn}\xfc\x9b\xdf\x91G\xf\x1fPF\xea\x97/em\xc7\xf5" -"q\xc6\xe\xd8\x12\x9e\xce\xeZ\xf5x\x5\xa1\xf9\x65\xda\xd8|\x8e\x1e\xbaO\xec\xad\x1f" -"o2Y\x16X\xf4\x66j\xfe\x30\xbc\xdf~dV|\x9d\x80\xd1\x82\x9d\xff;\xa3\x97;\xb3\xeb\x18" -"}`\xad\xbf\xb0?G5[\xe2\xb5L\xe4\x95\xe3\xbe\x43\x84T\x11\xa1\xa6\xbf\xc1\x7\xbf\x8b" -"+K\x9a\xf6\xfb\x33\x63\xc]\x15\xe9\x1b\xa1K\xa1\xe9)\x15-1\x9cV'zv\xb\x85]e\xa6z" -"\x84\xb8\xa5\xfd\x31l\xe7y\x8dt~\xb9K\x0\xfct\x9e\xea\x1d=\xee\x8\xc0\"\x8e\x84." -"\xcb\x99\x6\x0\x8\xf4\xe7HZfk6\xce\xc2/\xcf\x9b\xe9\xdeR\x9b\xb4XXe|\xaa\x2RV\xb6" -"\x7\x9e\xffT\x7\xda\xc2\x19\xc4P>\"\xce[\x0\xeat'I\x90\x97\xd8\x6\xb4(m!\x14\x94" -"\xf3\xff\x13xG}\xe\x8e\xb0\x80\x33\x8cq\xab\x89\xd5\xfb\x9c\x92p\xda\x3j\xfe\x82" -"{\xed\x8d)\xa0)\x88\xe7\x86\x94\xf4\xd0\xcb>\xad\x82\x43]2\xc7t5\xc9\xdfS\xde\x5" -"\xe1_^D\x1b\xcf\xb2& \x80\xe6\xceS\x0\x32\xe7\xa7\x84Z\xf2\xdb)\x8a\xa8\xf8\x17\xd1" -"\x1a\x19\x37\x39G\r$\x88\xca\xb2\x83\x81qKJ\xb0\xb3\xf3\xcf\x38N\x3<\xdeV\xe9x\xaf" -"O>\xf7G\xbj\xa8\xf3\xe6x\x4\xde\x83i\xf1\xaa\xc0k\x13\xd7}\xce\xe4\xa3%\xb6\xec\xba" -"\"\xf1?iZ\xcc\x1a\xbc\x34\xf5~\xed\x15\xa6\x95\xb5\xcb^_2\xa7\xd1\x1\xcd\xb5\xe1" -"\x13\xff\xf7\x8f\xca\x36In\xe3\xe\xb7\x43\x98\xd1\x43\xa4\x32\x9bJg\xff\x94V}\xd3" -"\xf9\xb3\xd4\xf4-\x86\x64\xf5\x66\x32\x0L\xd3\xf8\x8a\x8f\x8e\xc5\x87W'\xc3\xe3\x63" -"\x87\x62\xe6X\xfc\x99QQ*\xc3\xe8#\xac\xee\xc4\x42\xachG\xf2\xb3)\x1d\xe6\xc8Wh\xf2" -"\x1f,\xcc\x15\x1eJ\xfe\x9e|M>V[\x8\xf0\xa3\xa0\x92\x94~\xd3\xce\x9e\x94\x5\xaf\xee" -"\x95\x11\xe1\xdb\xd7\xb7\xa8\x30,d\x8f\x98\xec\xad\x8c\x87\x9c\xb7\x45\xa4;\xffW" -"\xfe\xea&\x19\x90\x41z\xec@\xcf\x8a\xe9\x19\x1e\xe4\xa5O\xbaPe\x13\xbbI\x18&l\x94" -"\xf7\xa2\x1dM\xa6\x88\xdcLKi\xb2\xf0\x12\xf0\xe2S\xba\xae\x61\x91T\xb0\x9f\xa9;\x7" -"CY\xd9R~\xfc\xd3\x8bzc\xfa\xfc\x34\xc6\xe5\x0\xb8\xa3\x90>Z\xfa`yC\xa9\xbc-E(\xc5" -"n\xed%<\x8cy\x95sj\x1fH\x95\xcf\xd3" -"\x2\xebU\"\xce\xf9\xa3\xd1iy\xd5\xcd\x38\x46z\xa9\xc9\xb7\x94\x82n~\xf5\xb\xce\xc5" -"\xa2\x86h;O^Z\xfb\xe0\x97[E\xc4\x8fP=\xe0K\x15\xf8\x6\xf4\x7\xdc\xee\x8b)\\\xa5\xf6" -"\xfl\x90|\x0\xb1yW\xe2#>o\xe3\xc1\x61\x31\xff*\xf:\xdb|\x6x|s\xb4^\xda<\xf7\xe8\xd8" -"S\xcd\xa7\xce\xa4\xd5\xe7Zb\xfgj\xbfQ~0\xfcR\xf9}\xaeM\xf5\xad\xf6\x93\xd6\xd4\xc3" -"\xe9\xbe\x9\xfxM|\xacr\xc6\xde\x17_\xe4]\xeb\xdb\x7\x1\x81\x89\x0\xf2Q\x90]\xe1\xd2" -"\xf9\x91\xd6\xfe\x87$\x8d\xf0\xf7\xff\x46\xfbXMo\xe1\x8d\xbe]@#\x1dI\xfe\xc6\x85" -"\x1f\x35mh\xf0?.\x1\xe5\xe\xe6\x15^\x9bZ\x1f\x80\xd0%\xb7\xa7\x65i\xb5\x18\xb4\xa3" -"\xc4g2\xd9\xae<8\xda?6C\xdd\xc6\x35%T\xf0v\xe5\xc1~e\xa9-#O\xa8\xa5\x9f\xc0\n~GV" -"uQ\xec\xab\xd7\x38\x2\x80\x96\x16\xbe\xdaZ\xeb\xbf\x35\xda\x9f\xd2\xce\x9cH;f\x1" -")\xfcv\x17\xbd\xc7\x89\x6\n\xb6%\xef\x38\x9\xf4\x34\xac\xc1\xc5\xf5\xb7\x6\xfej\xd8" -"\xad;\xab\x38\xc7M\xees$C9:=b\x96\xd6\x8c\xf8\x1\x0\x9\x9\xa0\xc\xda\xed(\xca\x38" -"CV#_\x85mh\xa1\x19\xdd\xf1\xcb\x41o\xa9\x8\xc2}\xf5\xda\xe0\x93\xab\x5k(\xc6\xc0" -"A\xb2\x9e\xe5!\x87\x9eO08[\x9f\x8dj\xe7?\xf0j\x9\xae\xd4\xf3\x8d\xa9\x84\xfd\x1b" -"\x10<\xbf\x89\xdf\xfc\xba\xad\xfe\x1a\xf8\x35\xb7\xbb\x63\x7fj,\xe1\x1e\x14\xe5\x98" -"\x13\xfb\xc\xdf\xc9\xa3@\xea\xc6\x82\xd0~\x9b\x80wF\xc1\xe8k\xb5\xa6\x39 \xc8\xa4" -"Lni\xc8\x1d\xc3\xb5\x86:T;)|\xfd\x14WM4 \xf2]\xef\xe6\xe3\x86`\xd4\x15\xa8/\x1d\x1b" -"\xa2\xdd\x85\x9d\x0\xdc\x19\xc1\xf8;\x6\xfd\xa0\x44\xc9\xa3\xc4#\xd4\x37oD\r\n\xc2" -"6ON\xaf\x61$\xf2M*\xd6\x35\x2\x87\xee\xbe\x31\xc0)\x89Je\xbe\xc8\x9c\x36&7~\x13\x16" -"%\x1f\xd3\x19?\xcc$\xaaq\xf8\xc1\x94$c\x13\xd5\x65\x43\x0\x8e.\xe3\xe1\xecZ=\x87" -"\xbb\xa7p\xfa\xe7\x7fq\xb4Y\xffKo\xf2;\xd7\xaa\xe5\xe2r\x1f\xdd\xc4\x34\xa7\x14!" -"n\xfb\xeb\xe6\xefk\xb2\xde\xe8\x85=\x17\xf\xff\xc4\x64\xb9\x17\x14yi\xef\x83\x19" -">C\x1fTY\x1bN\xeb\x1a\xb0\xae\x42\x95\xaa\x9f,>\x94k;\xd5y\x88W\x8\x1f\xe\xf2\xf1" -"\xb5\xa8~\x1f&.\x2\x16\x4\x18\xd7\x18\xed!Zg{A\xef\xa3\x89-\x80\x89\xbb\x39\x94\xad" -"c\xd6(ki\xdfI\xc2\xd5\xc5\x43\xc8\x33\xbf\xc8\xf7\xbf\xb7\xb4\xdb\xc1\x38" -"\x9N\xc4T\xae?>\xac\xb0v6\x99\xd8\xfc\xb0\x1c\xe0\x0o\xfd\x3\xeb\x81N\xbb\xc2\x9c" -"\xb0\\\xf8\x9c\\l\xbc\x9d\xa1\x13\xb9Hc\x84\\\x36\x63yG\x9a\xbb\xe6\x97\x98>O\x14" -"F>\xe4+ j\xe7\xb7\xae\xb0\xf7\x9c\xfc\x91\xbdv\x2\x37m\x8ap\xe2\xa3\x9b\xccWd\xdc" -"\xeb\xa3\xd0H\xb7\xea\x6 \x80\xf3\x17\x6\xee\xf2\xf2\x18\xdf\x97\xf\x12<\x8e\x13" -"\xb1\xfe'b\xe8\x34\xbc\x96\x15V\xbf\x99\n\x44\xed\x98IO\x80,NK\x8b@\xf\xd1\x35\x7f" -"q\xad\xab\xe9/\x9\x11\x6\x9e\xfc\xbc\x13\x6\x9b\xe5\x17\x18\xb0\xbdH\x88V>>=}\xc9" -"\xf3\x41_\xf7\x16\x41\xb\xc0n%\xeb\x8fkX]\xf2\x10\x9a\xe2\xd8\xd9\xa9\x9ci\xc9q\xdd" -"\n\xc0\xaa\x31\xf2\x7f\xd0\x12\x8d\xec\x42\xd9\xc7\x64\x9a\xe9JIq\xc4\xcc\x0\x66" -"\x6\xa6\x93\xc1\xcb\xc8\xca\x61\\\x31+p\xd5\xdf\xdcx\x8a\x91\xb9\xae\x96_a\xf\xea" -"\xce\x99\x82\xb1\xaa+\xf7,B?\x6\x1e\xfb\x61\xffG\xebXH\x0i\xa1\xbc\x1\x42\x8a)\xf7" -"+?/\xd5\x8b\xba\n\xe2Wg_\x14\x63\xab\xff\x37\xae\xcdi\x18 \x2\xd4\x36\x34\x61VzG" -"o2\x9d\x10\x38\xb4\x11-1KuM\x95g\x15`\xff[\xaa\x66\xfe\x44\x4\xab\xbb\xb5\xfd\x97" -"\x6\xb1#jDG\xd0\xe2 \xe\x45hLc\x93u\xa1\xe\xcc\x37\x0\x8d^\x2w=\x8b?\x5\xcf\x86\xec" -"\x8aw\x9d&J4\x19\xee\xa6\x3\x13\n\x45\x85\x39%^E\xc4'p^$.\x1\xc0\x44[VuZ(Y\x8f\x8c" -"\xd5\x15\xcf\xda%\xdeH\xf4vx\xed\x32\xef\xa2\xe3\xbe#\xe8\x87y\xdd\x5\x33s\xe2\r" -"\x1c\xffV.x\x8\x5\xa8z\x12\xc3\x1b\xb1\xd9qK\x92\xe1\x80\xae K\x99\xa9y\x8f\x9\xc" -"\x81\xd9\x91\xd5\x65\x3\x99\xa1\x43\xb2\xb\xc4\x38l{\x9a\xef\xe2\x33\xec{\xd4\x8b" -"\r\xdc=&\xc9\x5gh&\xfb\x35*\x88\xe9\x81X ~p-2rj F*\x10t\xd0\x9b\x37\x82\x9c\xe\xdc" -"\xa1\xe4\x99U\xdd\x13\xab\x30\x45M\xea\xb2\xf6\\~<\xb4\xb5ni`\xbeS\xd6\x93\x7f~c" -"\xa0\x80\xdf\xde\xfe\xde\xce\xa0\xd8\x8e\xd6\xca\x8a\xb8\x4\x66\xe3\xf4\x65U\xbd" -"b\x8f\xfch\xc5^a\xe9\xd6\xd7\x89\x66\x30\xb4\xea@\x8a\xaa\x63\xf1\xca\x8\x41Iy\xdc" -"2\xa1\x99\xb3\x43\xae\x99g\xb2\xb3\x97\xdc\xc4}\xe3\xbe\xfc\xc\xb8\x85\xc1\xf8J\xac" -"\xfa^g\xf9$\xedr\xee\x17\xaa\x62\xa4\x83\x7fm+\x4y\x83\xc\x1f\xa4n\xac\xfe\xfdI\x5" -" \xa1\xc8\x89\x36\xfc|\xb9\xf2\x38g\x3\xf7\x12\xe4WY\xbf\x6\xb4\x3!\xe2\xd0#\xae" -"@\xe1.\xeI\x6\xc3\x87\xd8\xee\x95O\xe3\xc6\x35q\xdd\x9et\x11\xc\x6\xb3\xa5N\x19\x38" -"\xb5p5\xd7\xc6V\x8a?\xbd\xc5\xc9gb\xec\\\xa3x9K\xe9\x87\xbbkP)lJR\x89\x7f\x87-\xfe" -"\x8a\xb4\xd3\x84`h\xac\xc7W\xb6\x11\x9f\xdf\xb8\xd6\x8d\xaa#\x91rU\xfb\xcc\xc4mj" -"\xd6\xf\xc5\xcehj\xa1O\xa3\x8d\rk\x9c\xc6\x11\xe3\xe3\xf7\xe8q\xf2\xc4\x62\x46\x31" -"\xe6Pn\xcc\x8by\x4\xef\xbe\xb2\xdc\xf1\x81\x1c\x87\xf5\x12\xfbhS\x8d^\xc0\xdf\xea" -"J\xf4{(\xcb\xc4>+\xc4\xbc\xcc\x85\xe\xe9\xc0\xcb\x1b\x80\xc4\x99i\xf2w\x9bL\xf6\x64" -"\xef\xc7\xf8\x61\xbfs\xc2s\n\xc2\xeb d\xac$\xf/;\x86m\x14\xe3ml\xbd\xcb\x97\x3\xd3" -"3\x9d\xe0@D\xb5O\xd8UD\xa5\x8a\r)\x8e\xf\xbb}\xf\xa3\x5\x39\xd4^Fl9N(\xa4\xb3\xf1" -"\xadn\x16^\x16\xfe\x91\xf2J\xb6|\x9f\xed+p1\xa4\xf0\xd0/\xa8\xd8\xb4\xe3-\xa0\xc3" -"w<\x92;G\xe8\xd1oN\xc5v'\x8f\xee\x14\xf4\x0vXj\xa4\xab\x91\x81\x8d$E\xfdZ]\xf1\x84" -"\xfc\x30@%c\x83-|\xa7Ih\xe0\xf5}s\x98\x83\x1c\xc1\x9d\x91\x90\xc8\xe8\x65\x63n\\" -"\xfauz\x13\xac\x63?\xd8\xb7\xddo\x1a\x7f\x66>q\x12\x90\x31\x36\xf7\x85\xad\xd7\x12" -"!\xc2T\x19\x84\xb9\x8d\"\x15\x9c\xa2\x45| \xe0\xa0s\xeb\xe7\xf9\xb9yj\xf5 \xe8\xef\xba\xe6" -"\x98\xbb\x8b}\xb2\xe9\xc6U5GN\xeb\xa2W*\xf5\xadU\xf2J\x99\x65\x1a\xfa\rw]Z\"\x97" -"\xeb\x93\x83^\xc0l\xa9\xf7\xa8\x42\xf4\x15\x9c\x0?\xdf\xed\x37mv\x90\xf2\x5\x8c\x9" -"pm\nc\xa8u\xa4\x96\x94pg\xec\x4\xca)\xce\xb8\xb5\x62\xdfO(\x9fg\xb6\x1a\xa1\x16\x46" -"\xb2\x81\x14\x11\x19\xcf\x2X\x98Z\x9f\xcb-#pO\xbq!\xb9\x18\xc7\xe6\x92\x83\x4\xdd" -"\x8f`;\xa6o\xac\x82\xd2S\xd8%Rg\xc8\xf0\x1h\xea]\xc9\n\xe4\xc9t\xf9\xc0I\x8fj\xe9" -"u\xcc\x33\xd6}\x8c\x8c#\xe5\xa6 \xf4\xfd\x87\xfd%<|&@\x13\x9b\xad\xad\xd6\xd4\xde" -"\xe7\xfb\xf4\xc0\x8f\xa0\x96\x61\xa6.FO\xe6SR\xf5nx.\xce\xf0\x0\xf6k\xee\xc2\xd4" -"D5\x9\xc6\x92\x83\xbd(r>cEY7\xd8\x86\x9d\x44\x97\xcf\xd9\x9S\xf4\xd8\x96\xc7}A:\xe7" -"\xbn.\x8\x1f\xe1\x8eZ\x9b\xe1\xfbrmH\xc5\x1c/LIvUI\x19xK\xd5Y\xd6\xf1;\xa9\xff\xf3" -"BP\xda\xa5\xcb\x35\xfev\\\x88\x0[\xad'HTt?\xc7\x9c\x10#<\xf1M\xeb\xb\xe4\xe1.\x8b" -"\xe\xf6\x1c\xcd\x18\xc7\xebIu!lm\xf3\x9e\x82\xa6S\xdd\x13G5\xb4\x62.\x1e\xe3\x1d" -"\xeem\x80\x44\xc2<\x18\x80K\xa0\x94\xccl7\xea\x1c\xce\xb9%\x65,\x9\x13\x85)\x98\x10" -"\x8aJ\x1ck6\x15w\xe2\\\xc\xea\xa5s_\xc2\x61Ho\xb0\xeb\xa5-\x95\xcw\n\x4\xa2\r\x31" -"\xe3p\xc9\xb5\x8\x1r\xfb\x96\xfb\xb2\x3`\xc6+\xf8\x14(|'\xd6+\x15L\xcf\xd9\xae\xcf" -"\xc9\xfb\xbJ\xdbj\xca\xd0R\xc\xd4\xb6/\x10\x66Y\xc7/>\xac\x43\xb7\x11\xfc\xa5w^Y" -"\xea\x3\xd0/$!\xf9\x1b\x90\xaa+\xca\xcc\xee\x12\xa9\xe5\xfe\x32p\xb0\x1e,\x85\x8e" -"|-\xf\x10\xec\x39\xdd\xc2\xf5)1\x90\xb6\xd7\xb\xe3}\xad\xaeoK\xabl$8#\"\n\xcc\xfd" -".(\xcc\xb6Y/2V\x91\xf2\xd2\xf4\x84\x9c\x16\xd6s\x6\xda\x8d \x18\xb4\xa7;\xeaM7;\xca" -"\x12\x96\xd5%\xa5\xd1\x41%\x14\xe9\x5 =\xb8X\xbc=\xc6t\xb7\xf0W\xf1*\xf2\x99\n\xfe" -"M5\xd0\xce\xbf\x82};c\x14kA%\x7f_H\xc6\x33XZi\x12\\\xe5\xaf\xb2\x36\xd3T\x94\xf3" -"\xff\xef\xb0\xc2Q+H\x6\x37\xdf\x3\xce\x1fU\xec\x65\x39\x8f\xfb\x16\x30m\x16\"U\x88" -"\x98\x1f\x41\x6\xfe\xfbM5i\xf8[\x92\xdc\x90\x88x\xc8\xcd\xc\x87K=3\x9c\xb2\xa7{D" -"HA\x18\x9c|\x94`Zw\x19\xc7\xc1h\x9d\x17\xa8\x8a\x65\xdd~\xb4L#\xfb\xb2t\xfe\xd9Z" -"nDg\xd1~\x8ftK\x92\x96\x1b-\xbd{\xc7\x8a\x7T\xb5\xde=\n\x9bR\x13\xac\x90\xa1\xb\xf9\x1cV\x16\x94\xdd" -"\xfb\x80\xcd\x99\xb7\xff\xbf%\xd9\x9e\xde!\x82]\xdf:-\x8d \xc8\xa1\xe6\xbc\xc9\x93" -"\x14\x61>\x1b\xfd\xa2|\xc2\xfc\xa6\x96\x0\x9\xf8!\xd2\xe0\xa9\x86\x9b\xca,s\x93\xb1" -"\x91\x46\x9\xdanZ\xde\xd7\x1a\x8b\xf0\x87\xd8\x9d\xb8\xd6\xe0\x8{\x8T%\xf6W\xb9\x85" -"\xad\xcdt\x93]\xff-\xa1__\xf9\xdf\xa6\xaa\x8V\x1c\xe5\xdbw\x89\xa8\x87\x9a\xbe^}" -"\x4\xe9;z?+\xce\xe4\xd6Qx\x9b \xc1\xde\n\xb8\xa9\xd8\xb2_\xd5\x38\xf1KI\xe4]\xb8" -"g\x9\xc5\xfb]\x94?\xe2\xb3\xe6M\x9an\xfe\x42U\xe7\xf5=\xf4\xd7\x82:|\xa6\xf6\xb5" -"\xce\xac\xb5\x92\xe0]\xe7\x18\x8d\x8a\xc4\xd2&1\xdd\x9dKU\xd3\x30\x8cWsK9\xe0\xd3" -"\xbb\r\xe6\x39)\\\x87;MG\xf0\xcc\xf2\xecKi\x2/\x89\xa4\x87kp\x5\x8d\xb\xb\xf9\xfe" -"|\xcf\xc1\x11\xf6\xfe\x9b]\x9c\xaf\xe8\xec\x35\x8bw\xcb\xc8'\xc6\xf6\xb`\x15\x96" -",\x80\xb9\xc9\xbf( \xfak\xdb\xd6Z\xf5\xde;;\xab\xfal^\xc8\x1e\xcd\x84o\xae\x6s\xb0" -"\xenT*\xf4\x4\x96\x81\xd7\xb1\x85\xac;|\xc9U?\xfc\xfc\xa8\x37\xe5\xb1~\xf3\xe2&\x8f" -"\xe2\xd3\xc3\x8c@\x8c\x99tg\x91\x1e\xc5xR\x1V\x16\x1d\xb8\xa3Z+e\xa7%\x19\xdd\x94" -"\xb7\xab\xb8\xe7^L\x84\xdd\x63\xc7\x9c\xc0V\x1f\x9a+\xe6z\xef\x39R\x10R\xd7J\x94" -"\xf4G\xa9qu\xe1\x46\xd4=km4\xe1\xa4\xed\x94\x45\xa9\x99i\x9b:\x1f\xdd\x39\xbf\x99" -"\x82\x37\x65\xf7\x83\xf0.q 1$J\x9e\xd8\xf2#\x1ch\x91\x94q\xe0\xcb\x8!5\xe7X\xbd<" -"\xc1W\xbf\xf2\xc0Z\x7f\x66\x9d\xfa\xeaK\xeb\xcb\x0\xa0\x9e'\xae\x95x\xbe(\x91%\xe4" -"\xf9\x1\x61\xffq@\xff\xbc^\xab\x39\n\x9c\x44\xd1\xae%\xedHt\xcb\xc6\xd8}\xf7\x32" -" o\x15\xaeM\xc7\xc2M\x18]\xe7\x8e\x1c\xaa\xab\xfd\xf3j\x1a\xa9\xa6\xc6\x9\x38\x39" -"{\xef\xd3\xa1\xe #rV\x89\x81\x2\xdb\x46\xe1\xcax\xbb{j\xa0)8\x8a\xd0t\xe6\xaf\xe" -"\xf2V\xe8\x95\xc5\x1a\x1c\xb1G\xfa\x8d\x8e.\xc2\xbe\x15\xdbo\xba\xef\xcb\xef\x9f" -"}\xf0\x1e\xac\xa8\x96.-NZ\xfa\xc0\x36+[\x8b+\xa2\x99o\xcdoD\x1e%\xa6\xed\xb7\xb9" -"Xe'\x88\xf5\xab\xf\x32|\x91\xe2\x65\xcd\x1c\x9dQ\xc1\x1c\xdc\xcfz\xb5\x82\x8bN\x98" -"vn\x16\xaa\xeb\x41\xe8-2j\xed\xe2\x42{\xde\xcb\xfe\xfcu\xa4\r\x18\x35\x43\x93\xf1" -"\xe4\xb0\xe7[\xf5\xd7|e\x9%\xaf\x93\xffs}\x9d\xc3\xc\xf7OW\x0\xc3\x37\x66\xbas\x1c" -"\x8b\xc4\x8f(=\xe9\xad\"~\xb8\x8e'\x99\xc3H\x90\x14\xf8Qw\xc6\x99\x8b\xa7\xd6\x90" -"\x87\xd7\xa7\x19\xe5\xe1\xb8\x7'0\x1t\x10\x94\xb3\x34\xd1\xb\x1c\xe5\xd9\x1a\xb1" -"\xc7\x39\\\xc0\xd0\xa7\xe7Yr\xb\x1a\x8eU:\x9b~\xbaN:,\x9eO\xd3\x35\x66q\xbV\x9f\xdf" -"\xfbs\xf3\xbcV.\xe9\x83\xd1=\xa0\xb3\xea\xdb\xe1\x35\x16\xdb\xdd\xce\x18Y\xd1y\xb0" -"^c\x9f\xdd\xdb\x8\x0\xb]\xc3[\xb6\x8c<\x7\x9b\x16]m\xf2\xa2\xa1\xb7\x83\xf3\x6;\xa5" -"\x9a\x93\xfaQp\xee\xfa\xfa)\x17\x44Y\xb3@45\x1e\x3m\xf4\xaf'\x94\x32\x97\x33/\xdb" -"\x94\xa0\xd9n\x8[\xcd\x1a\x8f\x5\x88\x10\xe4\xe4\xf3\xc3S(\x14\x12\x3\xe7\x88\xd7" -"\x1eh%\xc0\x80\x9b$m\xa9H%\xd2\xc8\xfe\xf1\xa9\x95\x37\x13\xa1\x62\xd8!S\x9a}Zt\xb1" -"G!\x8c\x98}fN\xd4\xb6\xe1Xh{\xc4\xf\x1a\xbb\xe4\x88\xcc\xadl<\x93^V\xc0q/\xef\x63" -"\xc\xfe\x46\xe9\xb2\x39\xe8\xf1{\xa9\xe2\xe8\x80\xcf\x39\xb6\x11\x81\xc3\xb6\xc9" -"=f0\xcf\xe5xv\xc7\xed\x9f\x30\xcdL\xb1n\xfb\x8e\x90\xc5_\xe0\xf8Q[\xf7\x44*\xadu" -"T\x81\\K\xe0\xf6{V{\x1c*.\xed\xd2\xd3(\xae\x14R\x8e!\xe2S\xc1\x99{\xa9\x17\xea\x9b" -"b\x93\xf1\xbb\xdf\xfe\x99" -"A[\xc4#\xadh\xee,\xdc:\xda\xd8\x1e-*\x9\x18\xf7\x87\xeb}F\x9\x9f\x86h\xc0$\xee\x85" -"11\xd3rB\xce\x81}-I\xd7\xb1\x65\xb6\xfa\x1d$@C\x98\xb8\x84\x7\x64'\xaa\x42\x32]\x94" -"\xb2\x63\xd5N\x93\xc2\xf2\xc\xf0\xe1Q\xc8\x62\xb0\xc1\xad\x15\x8b\xb7\x7f\xde`P}" -"\xem\"\x14\xd8>\x91j\xb3\x84\xa4\xa0\xa9\xe7\x99\xc3\x39\x1Pr\x9d\x39P\x82\x2\x45" -"\xce\x9\x45\x63\xce\xa5\x8exl\xdcx \xea\xb1\x41pR\xdb\xe3\xbbh\x86\xef\xea\x84\x39" -"\x9f\xe7I\xab\x3\x9f\xa2\x91\xa0\xd0\xf0n~}\x1d\xacoU\x96+>s\xda\xed\x7\x63\xac\x30" -"\xe3\xdb\x80\xd6\x34\xa5{\xd5\xb3\xa4\x44\xb9\x4\x9b\xf6\x39\x33\x31\x41(v\\\xca" -"f\x94\x10h\x80\xce\xa6\x1fL\xb0\xb2\xc0\xed\x1d\x62\x80\x1e?ef\\\x11S]\xc6S\x1f\"" -"l#E\x5\x8b\x9a\xda'GL \x80}\xc2gK\xb0\x84|\xb\xe9!\"0\xd7\xad.\xe5\xe2o\xe9\xf7\x9a" -"\"R\xf2\x1b,7\x95\x17\xf3\xc4\xb7\xe7\x81\x35\xac#t\x7\xfb\xd4\x16\x41V\xc:\xd7`" -"D0\r\xda\x61\x84\x31'\xaf#1L\xec\x80\xe3\xc1\xaf\xaa@\xa2\xd0r!\xf7\x9f#\xce\xfe" -"\x83^]\x11>/W\r]\xbd\xf6&\x10\x0\x94\xb9|\xed}\x1d-\xa2\xcd\xef\xba\x16\x83\x9\xc9" -"\x1b\x0\x1\x4\xaaw\xfd\x1bM\xed\\`\x82?P\x84\xfa\xc7\x39\x2\x1e\xa1+H\xd6\x33\xc0" -"-\xea\xba\x42\x81~\x9a@\r\x1c\xc4_\x16[\x80\xb\xc3\x63\xfcHM\x87\xc5\xf4SW\xd0V\xec" -"F\x10\x7\x19X-\x1f\xb0\x95s&\xe2W-\x8e\x9d\x8c\x5\xb1\x17xYiw\x83\x80\xae\xb6i\xa7" -"\xfb\xf1\x81\xea\xc9\x39\xd1\x16wD\xa3\x8a\x1c(\xd7\x82\x86\xe7\xe7\x94\x95\xab\xba" -"\x8dS\xa3/V\x12\xbb{z1\n\x9d\xcf\x2\x13\x9\xcd\xc8\x92\xeg\xc6\x89\xf8I\x8d\x1c\xc" -"\xb3x\xec#q\xe9\xf1\xef\xc9\xe5v\x7f\xc7V\xc2\xbd\x95\xa3*\xd8U{?l\xb6\x85p\xed\x38" -"\xcer.x=0\xc1\xb8s3\xda\xc9\x83\x12#sJ\xbaS \x7\xb0\xca\xeb&\xca\xa5\xf8\xb5\x1d" -"\xb5\x39R\x10n\xbe\xb1-x\"\xdd\x34\x4\xe4\xc3g_\xce\xd9\x62\x8b\x1\xecoG\xc8\xc3" -"\xee\xc\xa1\xb9wA<\xb4\xc4$\xa1w\x7q\xf4\x9e\x30\x44>\xdb\xd9-2\xf2\x7f\xe5\x8c\xd1" -"\xe7%+\xa8\x9e.\x9f/\xa0\x1d\xe4\xfbT\xa0\x61<\x18\x87l\x8d\x9\xd5\xdb\x9d\x86\x92" -"\x81\x9f\xb2\xf9\xccZU\xbc\xf3\x32\xb7[\xdd\x6\xf7p\x1b\xb0 \xa8\xf9\x38\xa4\x64" -"g1v\x0\x90\xf0\xfe\xf9\x35\x8b\xeb\xf7\xa5\x8\xae\x8c!C.\x99\xb7\xf9\x9bX\xf9_\xc6" -"\xe3\xcf\xb7\x35p\x17\x99\x9e\xc2\xc8\xef\x81\xf6\xdc\xff\xbf\x30\xab\xbe\x42\xe1" -"\x9d|\xb4>\xb6@6\xbb\xd7R\xc8'M\xce=\xb6;\xef\xf0\x11\x14T\xbd&+\xc5\x90\x1a\xb2" -"3Eg\x96\xf2\xab\x8d-\xeb)/\x7\xb6\x7\xb4I\xf3!D\xa7\x86\xe5\xcf\x90\xf\xd4\x3ib\xba" -".^\xb\x39^)+\x8a\x9m^\xd4\xb7\xa4\x1dgz\x93\xbbw\xe0\x8b\x39\xbaw\xa4mFSh\xdeN\xbe" -"\xf8\x9e\x97\\\x81\xfc\xbe\xff\xd8\n\xc1\xe7\x1\xa4\x16\xe5\x66V*\xdc\x89\xcfi\x8c" -"a\xb8\xad\xbaz\x8d:\xb0|\x92\xe5x\x9eK'\xcd\xc7\xd2\xe8\xa5\xf0\xbe\xf7\x98i\xf\xf" -"\x9a\x45\x31&\x1d_\xdc%\xe7\x92\xa5[\xa2\xb7.\xc0\x9\x96\xb4\x0o;vlk\x89\x96\xf\xc4" -"\xc3\xd9\xe7\xf7\xf3\xa7}\xdb\xea\x36\xe5\x13\xdf\x8dWo\xec\x8bG\x3\x1c/\x90\x14" -"\xbf\xbbJ\xbd\x91\xd4\x66\xaa\x89\xfcR\x1eNa\xcd\xaep:\x19\xa0\x2\x1f\x33\xcc\x31" -"\x9b\xb7\x36\x34$;\x1c\xa4\x8d\x38\x3\xd0\xa3\xb0Z\x82\xbU\xfay\x80\x17\xbf\xf\xdd" -"\x13\x45\xb\xfc\xb2\xd6\x8b\x99\x9b\x92SJ\xaf\xc\x14(\xe\x1aT\xf4k]\xd0y\xdd\xae" -"\xc9w\x81\xf2\x86\xabx\x99\xa1\x2JF\x3\x3U\x5s\xd7\xa4\xb4}\xfc\x82(\xbb\x1e\x12" -"\xa8\x86\xe3\x31\xdb\xc6\x34\x7\xc1K\xab\x9a\xff\x81\xcb%\xcc\xc8'M8\xd7\x39!\xf3" -"\xa8\xd5\xa7\xf3\xaf\x38\x93\x65zg\xa5:*<0\x18_\x89\xba\x99*:?\xa8\x13Z\xb0u\xeb" -"\xc8\xb8\xcf\x34%\xceH\xf5\x42g\xfe[\x9d\x1a\x81T\x15w\x9a\x92\x8c\x8a\x7f\x7f\xc6" -"s=\xb4Z\xf1;\xa4Wb\xb1\xc\xe8\xd1\xb3\x36\x8f\xaf\xd4\xbb\x30\x1f\x95)iRLfo\x11\xb0" -"\x0\x90\xd1\xb8\xfd\xa5\xaa\xbc'\x8c\x38\xd9\xf4\x1c\x61\x62&\xac\x46t\x90y\xefV" -"g\xfa\xbf\x1f`D\x99j\x9X\xf4\x14\xea\xbd\xdc\x8b\xa9Pw\xb\xdc\x9c\xb6%\x9\xd9\xb" -"\r!n\x14>Q\xf8\xbf\x7\xc5\xca\x19\xb0\xb\x8e\\\x46\x31Vs\xf0\xd1\x11\xc0g\x5\x9c" -"\x87\x61\xad\xdb\x85\x36\xdd//e\x81\xae_\xc3\xda\xf2>\xd3h`qC\xb2\x9eX\xc9\xb8\x66" -"V\x12\x35=Y\xbb\x15R\xef\x1d\xdf\x11\xa5P\x8b\xc2\x1bm\xec\x1b\xcb\xd5\xae\xf8g\xa6" -"E\xf9\x80\xb5\x9a\x98\xfa\xbc\xc9`H\x8e[$\x3\xf9\x84+\x9!\x1c\xe1i\x19|\xe\x81\xc4" -">\xdbS\x91\x81W\xa1\xf7p\xb5\xf3\xe5?;\x8f\xb9\x8a\xdf\x63{\x94\x1b\xee\xb4\xc5\x96" -"\x0M\xf1\xba\x32\xa5\x11\xb7\x9a\xfd\xa8 \x8cS\xc0H\x5\x1d{\x81\x38\x91\xfcjv\x90" -"H\x2\xcb\x8e`\xe8\x87q-\xa9\xe0\xb9\xfV\xea\"\xd2\xf5\x99\x34IL\xe0T4C\x88T\x5\x18" -"\r\x86\x97\xe2/\xd4P\x86\xf5\x15\xfdm/\xfe\x87\x36.\xf7\xa7\xe5\xc\xc1z\xc4\x38\xc9" -"\x83J\x85\xc9\xf4\x82\xe2\x17_\xc0\x16H\xeai\xd3qv\xa0h\x2\x9c\xcfR\xa1\xb3\x94~" -"J\x96\xdb\x43\xd6\xaa\xf0r\x8b\xeb\xc2\x3\xb3\xb9he'Y\x5r\xc2\xe4^\xb\xea\x33\"Q" -"GW\xf8s\xa1\xb1\x8a\xf5\xb1\xf\xcb\x9c\xaf\x17\xa7\x45\x10\xdd\x62\xde(V!\x14\xc" -"\xcc\x9b\xa0\xe2\xd9%\xcc\x35&\x19\xef\xa5_\x1c\xc8~G\x98h&\x90\xd6\xee`\x86\x1\x31" -"\xd5&\x99\xaeHU[\xa8V\xb8NSp=\x0\x9c\xd2\x10G:\xfe\xcd?\x1a\x8fwe\xda\xf8\x8a=\x12" -"\xd6\xb8\xa2\x7f\xdb\xb8\xd1\xc6\xdbu\xd8kX\x8b\x1bg\xc2L\x89k*#\x9d\x65\x61\x39" -"\xbf\xc2\x9aO\xff\x8a\x1d\x8#twwU\xa7{G\xb1\x1c\x9a\xb1M\xad%\x33G\x7f\xd4\xe6\x9a" -"\xfb#\xc6\xfcg~><\xa3\xa9\xf4\xa0}Q\x89^:L\xcaWg\x9bG\x8c\xe7\x16\x8e\x8n\xa2\xf8" -"$\xd9+\x8b\x98~LW\xf8\xc4\"\x61{\xe2\x9c\x1d\xcd\xd0\xed\x8d\xc2\x1d\x9c\xc6\xf3" -"O\xd6\xd4\xcc\xfa\xde>;\xbf\xb4\xc\xe7-\xae\xb0\xb4K\x4\xa2\xee\x1fu\xa1J\xa0\x46" -"%\xb4\xf1\xdb\xe8\x61\xbd\x45}\x17O\xcb\x0s\xfa\x32'F\xa1\x9c\xbf\x1bH\x10\xccrB" -"\x6~D\xd5\xd1PCo\x91:d\xaf\xedG\x5\x36#\x99\x8cn\xb0U\xc2X\xab\x16I\x95\xfa\xa5\x17" -"\x80\x8a\x13\xf1t\xd5\x9e\xbf\x92;}\xb2\x0z:L\xed\x9dm\xcfNX\x85\x93\x8m\xfk&\x15" -"a\xe6\xdf\xfa\xcf\x61r\x91<\x8e\x13\x96\x92\xb\x62\xf1\xe0\x80\xc0U\x3\x87#\x84\xc1" -"\xf3\x64V3\x8d\x63\xf8M%\xed\xbcM\xb9\x88\x9f\xbf<\xb5Y\xef\xe2\xc4\xdb\xcdk4\xe5" -"\xd1\n\xb5\x91\xaa\x98\xbfU\x9b\xf3\x87\xb8\xaa\x39\xab\xd8:\r\xd0\xad\xac\x17\xe5" -"\xeX\xa7J\xbb\xf7\xfch\xb1qD\xc1\xa5g\x1e\x96\xf9\xc6;$\xc8w\xa8|\xa1\x94;\xd9\xf9" -"p-\x87\xea<\xfa\x64\x18\xceQ\xf0]\x9d\xc\xc6_\xb9\n\x1c\xbbL\x16\x83\x86\xac\xe8" -"c\xae\xc9\x46Q\xa9\xa7\xc5V\xf3\x62\xbu\nl\x92\x46S\xae\xb9u{\x94\x32\xb9\x9bN\x9f" -"^x\x97\xf1\x85riv\xd5\xce\x34\xff\xb5\xfa\xb6\x13\xc1~,\xd3\x30l\x1d\xda\xd4S1\xa8" -"y\xf3R\x14\x17W\x13\xab\xce\xa9\xf8uN\xe0$0u1\x5\x3j\x1b\xcf\xea\xecp\xb6\x18\x9c" -"\xd5\x46\xd3<\xc\x8dn\x94Y\x96z\xeWG\xe\x46\xc1\"t\xe8\x15\x9e\xad\x30\x83\xf4?b" -"\x88>\xe9\xb1\x97\xddY\xc5\xc\xa8\x83(\x1b\xb4\xfx\x83\x9fH\xbe\x35\x32\x66\r\xf4" -"\xa9\xd7\xf2]'\x2\xe4{\xe4\xe0\xde\x1b\x9a\xfet_\xdd\x97\xd5\"\xd9\x42z\xe0**r\xf1" -"\x7fx%>>9\xb4\xca\x39k%R\xbd\xc1\x88\x9a\xe4\xb2\xfajS\xb8\x33+\x99Ro\x8d\xc\xaa" -"\x88\xae\xd3(\x8a\xbd\x39\xf3Q\xb4\"\xfd(i\xe6\x66\xecSo#9\xa5\xd5 \xdf\x82\x85\xcb" -"\xb9w\x90[oe\xefYj|W\xd9j\xec;wP\xfb[\xe6W\x88\x1b,\xd0\xc7\xb1\x14\xc5\x9d`\xfe" -"rJ\xbe\x9b\xf2\x81\xf2n\xab\xf1\x3P\x10\xa3\xbb\x1\x8c\xf1\xe9\xc6\x33\x4\x82\x97" -"\xfbV\xb7\x1j\xd3\xeeQ\xf\xd0\x39\xedHE\xe2\xc5\x16\xba\xb4to\xf9\xe2\xc5\xfc\xdc" -"\xfa\xb3\x37g\x1b\xeer\xbf{\xd1\x95i\x1a\x65y\x5[\x19g\x12_\xc8\xc4\xceV_\xdc\x11" -"o\x80G\xff\x83*\x11-\xdc\x42P\xf5\xc8\xc3\x46\x4\x66\xc9\xf9\xe6\x15\x19\"\x33\xc1" -"\x9b!%\xa7\x30wtE\xc9\x9epXt\"Fz\xb1\xf4\xba\xea\xa2=\xdf\xf4\n\x94\x10\x94\\o\xcb" -"g\xa8\x62\xdf\x95\xe6\x66\x3\xf9\x45kW\x9dO\xc2\x8c\xab\xfd\xdf\xcemKy\x16.\x7\xb" -"{\xe6Rn5P\xfeL\xd2 F\\\x15\x34ZY\x9b\x93\xb6J=\xef\xf6\x8bn\xff\x9c\xac\xe8|\xd0" -"\x8c-\xb\x8b=\x95\x8c\x63\xb2\x13\x14>4\x9a\xef\x61\xc4\x9d\xe7N\xabI\xaf\xa0\xe2" -"\xd4\xdaZ\xe8\xa9\xe4\x36\xbf\x9b\x1f\x8c\xeaZ\xa3qc\x8fL\xb9\xdd\xd7\x32\xfd\x8e" -"\xa7\xf5\x8d\x45\xd8\xf8\xf8+\xf6\xca\x37L\xe9\xea\xa3\x93\xc1\x8e\x1c\xf4\xad]8" -"r1\x18\xf0\x89\xfe\xd4\x13\xc3GG{\xe2\x4\x31/D\x8d\x82\x1a[\x5\xa1\xb6\xef\xb6J\x9a" -"N\xb2\x34\xf0\xb3\xb4w\x85{`0\xdf\x0\x8a\x9b\xea\xc3Lq\xa1\x5\x89\x46\x17\x1a\xe9" -"\xaa\xdf\x2\xafJ\xb3W\x86\x8cI\xce\x83x\xc8X\x1d\xe7\xb7~Q\xab,H\xf0\x31\xb5q|\x8d" -"E\x9c\xf\xc3\xa4\xdb\xc6\xe3_~\x91`x\xbeLH\xda\xbe,\xb0\x0\x10|;\x84\x63\xb5k<\xe6" -"f\xef\x89K\x6\x15 \xd1\x88=\xe4v\xab\x15\x32\x41I\x4\xc2v QF\xe0;\xfG{\x9dmr#\x8a" -"\x16\xa6\x1b\x43\x43\xce\xd7S\x7f\xea\xfb\xed.eSx\x9t\xdb\xa8*\x10\x45\xa6\xcc\xf7" -"\r\xee\xdb\x94\xad\xc6\x44u\xe3\xe2\xd5\xe7\xe3\x97\x2>,\x91v\x1a*\x92\xff\x1\x9e" -"\xad\x83\xf4\x63\xd5\xec\x8d\xc9\xdb\xd5\xe6\x6\xe1\xf9\x93\x1fvA\x18\xc2#cK\xd4" -"\xe0O\x9c\x1c:|\x1a\x65\x43{\xf\xb9\xef\x1e~\xeb\xf3@\xca\xb5\x13\xe3N\xbb\xaa\r" -"\x90\x1a\xe3\xef\x7f\xa4\xef\xcc\xa3\xc\x35\n[G]!wu\x80\xfc\xa9$\xb4H\xb2h\xc8z/" -"l.\xca\x1\x9e\xc3\xfe\xf8\x5\xdb/\x5\xb0\xbb\xc6k\xae}\x9f\x46\x8c\x19\x32\x9e\xbb" -"P\x5?t\xf6t\x4\x15\xaf\xe4\x83w\xc8\x34U\x90 \x97\x1d\n\xdcl\xdfT\xf4\x34\xbc\xa3" -"\x11_\x2\xe\x91|\x15`\x95\xf3\x90\xf1\x90V\xba\x37\xa0\x1\x99X\xbb\xb7\xbb\x87t\x81" -"&\x94\xe5\x45W\xf0\xb4\xaa\x45\x9a\xfb\xbb\xa9\xf7\x42{\xb5{\xfdP\xeb\x85\xddTJ\xf0" -".WM6)\x5gX\xa3-\xcb\xc6\xd0n\xdfZ\xbc\x6\xef\x85\x87\xc9\xef\x90\x44\x38\xfa\xcb" -"\xbe\x18\x96\xe3&\xef\xbbvS\xaf\x2yS\xbcgD\xe4\xdc\x15\xad>@\xcc\x85\x1fP\x12`\x1e" -"w)r\x7f\x0\xe8T\xfb" -"\xc2\x5\xe5\xdd\xd1\xf5\x65\x2^\x87\xc8\x61\xeb\xedy\x86\xc7\xdc\xad\x30\x62\x1d" -"\x7u\n\x8ev\x96\x8a\xd3\xc8\xd4\n\xac\x4\x82\xac\x9e\xb2\xe6\x15\xf6\xb8\x8a\x13" -"\xd5\x8\x7f\xe3\x83\xb9\x94\xaf<\xab\x98\xef\x89\x98\xf0\x33\xa1\xe0\x8f\x5\"\xf4" -"\x83|%\xd4\xa3\xc3\xfa\xe-.\x7\x38\x9di\x7f\xe9\x65\xac\xc5\x91\xf\x80\xb2\x87H[*\x8c\x91" -"\xe1\xf9jJ\x8e\x80\x41\x63\x5\x46\x87\x80\x82\xc3\x92\xda\xa1\x1e\x6\x63\x83\xec" -"2u}\xcb\xc7\x9b\xe2\x82P\xac\xcd\x1a\x38\x1f?\xce\xa9\x5\xc8\x62\x9f\x1e\x81\x39r+\x8cs:\x94\xa4\x3\xd6" -"\xa1\xdb>\x1c\x85\xe9\xc7+Ev\xb7<\xc8\x85\x36h\x8f\x8e,u\xd7\x46\xc\xe1\xc9\x87>" -"c\xe7\x32\x87\xc2\x9c\xd1\xe4\xbdv\xaays\x9cM\xbc\xdc\xa3\xa9\xcezK\xefm\x9e\xc6" -"\xe\x61p\xcc!\xdb\xc4\xd9\xe3\xc1\x32\xad,\xfbS}\xf6`\xe1j\x0y\xbeT\x16\xc4,\"0\x4" -")\x83\xbe\xa5\x39\xe5\xe0\xd5#S\x3\rpF\x8cU\x9d\xd7\xe\x66\x9d\x8a\x36\x87\x35V\xf5" -"F\x93\x2\x11Vs\x9b\xd3\xe1O\xc9\xd9'\xc3\x80\xb8]\x12\xc2x[\x1c\x42)t\xf4\x8d\x91W" -"\x1e\r\xe0\x0\xc9\"\x93\xff\xecX+\xcf\x93>~S1M\xdf!\x19ye%\x88\xd1\xa2\xb3\x39\x2" -"\xf7\xe3\x80\n\xe5=\xcco\xf1\rx\x6\xa3\x95u\xf8\xec{{\xf5\x30'S\x0\x95\xbe\\\xdd" -"\x6\x9a\xcc\x8c\xf0\x16\xb1\xfe\xab\xc1\x7\x85\x7f\xf2UU\x8f\xba\x65\x1e\xb3\x0R" -"\x84G \xa4\x9?\xe1\xf7\xc4\xb6\x3\xbz\xa9\xd4\xe5\xb1\xf6_F\x1b:$\xb\xcf\x42\xb!" -"\x84\xf8\x94\x9b,\xe9\xb8}FU\xba\x8b.\x17\xe2\xc9\x95\x13\xd4UF\xe8\xc3v|]nw{X>H" -"\xc4\x92\xd1Z\x86\xca\x3\x36T\\S\x8\x94P\xe4\x89\x92 M\x85\x8e\x8f\x96\x89\x80\xf9" -"\xc7\x9b\xdd\x37=7\xf9\xd4\xff\x6\xab\n\xd0\xf3/\xe6IJO\xc0\xa2\x96\x17\xd4`\x8d" -"\xc2\x1a\x83\xe6\x8b~\xe3\xc9\xa7\x3K\xd0]\x83\xcf\xc2\xff\xed\x1fV\x1c\x95,M2\x8d" -"|\xd4\xc9\"t\x8fl\xea\x15\\\xc3\x1cnF\xdaw\x10\xbf\xdd\x87\x10\x34\x42\xe5\x91J\xfe" -"J\x91\xb2h-\xf4l\x8a \x8f\xc3\x33m}\x15]=p\x1M\xef\x6\xaa\xbaN\xda\xac\x1f\xe8\xeb" -"5\x8d\xfb!\xd3\xe8\xccR\x92\xf3\xd4K\x19\xb0\xda\x15\xb8n5\x80\x45\x88\xf5\xf3\xa0" -"\x1f\xed\x8em7\"\xde\xef\x91\x1a\xb2\xd5N\xe8\xb6\xc5,a\xf9\xf9\x8b\x34!\x16\xf9" -"\x80\xd4k\xc6\x8a\xa3$\x8a\x44`a\x90\xba\x94\xa5W\x84\xad\x90\x84pQ\x8a\xe9\x98V" -"#d\x83x-p\xc5\x7f\x8aO\x82\x8W\x1b\xa5\xdbZ\xab\x17=\x7k\xe7\xca\x13\xc4\x9\xcc\x45" -"dc\xd4\x4\xf3^<\xe6\xa9\x9a\xbb\x7\"\xa6v:\xbf\x34\xaf[\xa8\xea\x62\x86\xb4\xa0\x96" -"\xf2\x15\x15\xec\x1d\x9f\xc6\xe4\xab\x1fk:\xd2\x9a\x9c\xfb\x33\x3*s\xb0\x9fQ\xb2" -"E_\x1e\x8b\x9b\x2\x9bg\x1a\x19\x93\x42\x63\xd1\x11\x65\x83\xab\xd3'R\xca\x9d'6\x84" -"\xcblF\xf4\xb2\x10z\xcf\x9a\x8cvd\xb8\xd3\xdb\x8cx\xb\x0 Kf\xd2\x1f_\xc6\xcdG\xfa" -"\x84/M\x81\xf9\x4\xae$P1\x96\xa2\xe\xce[\xfa\xa7\x17\x19\x93m\ntH\x1b\xb;X\x85\x96" -"\x8f\x32\x97\x93s\xc4\x30\xf2\xb7\xf9\x99<\xebr\xaa\xfe\x6Q\x2W\x91%\x1a(\x82\xf4" -"\xb1\x43<\xe0\xa6\xd1tz\xa3\x14\xc8\xb3[y.\xe4(\xd0\x62Z9\xc7\xb\xe6oy\xd6\xb9v\xe0" -"\x1f\xc5\xd3\x86x\x8a:\xca\x7f\xd9\xa9\x34J\xa5\x66\xe7\x96\xcb\x64\x41NV\xb1\x85" -"\xe4\xb9o\xd7\x97\x45\x8b\xb1\xd5Z\xf4'r\xa9\xd8\xf7\x9a\xc8\x37\xb3\x38j\xbf\x10" -"H\xb6\xbYT\xcaz\xadP\xb9)\x9f\x38XXJ\xf3\x91U\xbb\xb0\x1b\xf0\x8c\x10\xbbVg\xe4\xe1" -"E\x7f\x14V4g\xac\xbh\xf1\x8\x8e\x8d\xf8\x66\xdd\x12\xa3\xd4\x97\xfd\xd1\x33=8U~{" -"\xa3\x93\x93\xb\xf3^\xc9'\xd4L\x8e_\x12$O\xb1R\r\xbbT\xd4Mr~\x94\x97\x2\xeb\xe5\x39\xf0}\x85\xd0=\x18\x85\xd0" -"\x1f\x9fh\xf4x\xbb\xbf\x65%v\x1c\x91\x35Ua5\x81.\x4\xf8Q\x88Na<,\xc6\\\x41\x63z\xa0" -"\xfd\xed\xeen\x9c,\x14\x15\xba\xd4+z\xc6\xc4(\xf8\xa4\x81\xf6\x9a\xd1\x82\x8\xc9" -"\xb6G\xb1\x61\xee\x39r\xd6_\xbc[l\x12\xb6tw{85\xb1\x46\xc3O\xba?\x12]\xbf$\x91\x1" -"\xc7;\x1d\xf4\xa1\xef\x86\xec\x9f\x9d\xe1\xc2\x9ey0\xb2\x1b\x17\x9bi\x1d\xfc\xbd" -"\x81\n\x97\xf1\xde\x18\xc0\xa6\xd8\x9f\x7f\xad\x8c\x12\xfa\x9b\xf0\xe3\xc7\x37\x39" -"#bGY\xefR\x97\x9U\xc8<\xb1Y\r|X\xa5\x41\xed\x61\x7f\xbf\x41\x96\xe7\xfd\x32\x6\x39" -"\xfd\x9c{mB\xd0\xc5qvm\x18,\xd8#B7\x7f\xclR\xeev\x0\xc8\xb1\x8b\x92S\x96\xc2!\x1a" -"C'\xb6\"\x38\xfa\xb5)\xe0\xce\xd2\x2\x8f\xbc\x41\xa4\xb2p,\\)i\x13<),\xf1\xda\xf9" -"YL\xf1\x91\x36\x12\xb6\xfb\xef\x7f\x9b)R]\x9c>\xcaS\x82{\xbf\xda\xb6Q\xf3\xebN\x1d" -"\x1c^\xcf\xa2\xd9\xd9\x7\x61\xdf\xf9YP\xfbJ\xf6\xfd.\xf6\xe1\x92\x3\x45J\x7\xb1\x37" -"8\xec\x8a\x61m%\xe4\x42w\x11\xc,\x80\x7fhH\x15\x8b:\xb1H\xc5\x33\xd8v\xa4oB4\xbc" -"\xfc\x5\x45\xd7\x64\x8ep\xcd\xad\x35\x83\x0|\xfc\xdfj\xc\xfX\xc9\x8b&I%\x86\x96^" -"\x7f\x46\xbf\xd9\x30\x42q\x1\x15\xd2\x92\xf1ZW\xde\x91\x9\xc\x9cn\x16\xb8\x46Xi\xe8" -"\x96\x4Q\xaah\xb5\x8\x33+\xa2!wT\x8c]\x15\xbc\xa2g\xdf\x9\xe9\x18|\x83\x8a\xa3\x96" -"\xacoy\xee\xcb\xb0\xf0G:k@\xc\x98\x84\xda\xaejq\xa8\xb2\xf5Wz\xbfX\x8a\x9d\x31\x38" -"\x9c\xb6w\x4\xd6\xf\xff)Op\xea(x\x91\x30\xbc\xab\xc3\x89\xe6\xcd\xb7R\x0\xfc\xc1" -"\x9c\x81\xcb\x8c-\xe0;\x99M\x8b\x1bU0\x83\xca\x45\xed\xb7\xb6\xd4\x63\x66\x1eO\xb8" -"\x9d(\xb5\x12\x1f\x81H\xe8\x33\xb4\xad;\xe4\x87\x12\xbe\xfd\xee]\xbap\xf7\xa4\xf6" -"C0a\x8c\xbf\x89P\xe5~\xd0g\xe9@\x16J \x10Q\xf5!1\x4=h\xb\xe4\x7f~\\\x13\x12\xa6&" -"Y\x4\xbcQ\xee\xa1\x9d\xdb\x96@\xe8 J\xf0\xd2\xb9\x8f\x15\x2\x1duP\x1d\xe9\xe5\x90" -"\xf0\x64\xf9,\x15]\xc2\xa0\xf6\xaa\xf3\xae\xe9\x1e \xbc\x5\xb9\x41\x34\x44\x36\xd0" -"\x1f\xaa\xf5\xc4~\xa3\xa4\x84\xbf\xb6xS\xe2\xc0_+e&/\xa3\x6\xa8\xb1\x12\x8b\x1e\xb9" -"YQ\xb3v^\x8a\x9f\xd3\x6\x1cJ2\xcn6\xe9\xb5=0\xf9n\xa4k\xbau\xab\x86x\xd4\xc;X\xd8" -"\x0\xbf\xec |\xd0)\xfb\xc\x30\xca\x9c\x91r\xf3\x30\xf7\x63\x1b\x94\xc5\xd3\x41\x9" -"\x7fuY#\x9c\x9\xa5\x96-9EPeF\xc`,u#\xcd\xaei|\xfb\x1a~`l\x98ut]\x83\x7{>\x1d\xd7" -"\xcc\x3\x9yun\xc1;V\x11\xa6,\x16\xd3\xee\x32s\xfc/;\x1bG'\xfcs-vo\x82\xf3\xa4\x8a" -"~\xf9\x16\xc\xa8\"\x93\xb9\xb5\x10\x8f\xed\x88\xe2>\xfer0\xd8\xf7\xbe\xa9\x6\xdd" -"+\x1f\xdew\xa0\xbb\xad\x95\x90\r\xb4\xa1Ov8\xdd\x17\x7f\x91\xe7\x85k\x90jW\xdf\x88" -"\"\x19\xae\x12\xc7\xa1\x99P\xed\xdb\xa7\xcf\xce\x11\xd4\xa1\xd5\xc\x89Wd\xf0\x0\x1a" -"n\xc5T \xbb\xbf\xfd\x97\xd4\xfb\x86\x43\xa5T\xff\xb5taA\xe4\x36\x99\x1c\xe5\x7+k" -"\xa6 '\xf2\xd1\x89\x11\xb\xee\xf7\x83W$)\xe3\xfd\xa6\x86\x44\xbc\xa3'\xef\xe9\xcb" -"\xbb\xe8\xf9^\xfb\x36\x88\x94\xf4\x19\x97\x41\xda\x9\xb3\xaf\x8d\xffsQI\xb2\xa2\xa5" -"\xff \xcbP\x96\x96M\xe5\x86\xf7\x46x\x8a\x39\xe0Vt0\x17\xfb\xf4\xa4NB\x11U\xf0\x0" -"\xb5=\x9a\xe3t\r\xa4\x5\x95;'\xb\x15Pe)\xb0\x93T\xd5\xff)\x93\xb2q\xca\x82\xeb\xdf" -"=\xcb\xa1\x98\xd7/Q\x9c\x5\xe2\xe2 \xae\x63\xc2\"k\x1c(\xe0\xa2\x37V/\xcf\\\x36U" -"k\xd9\x39G3\x96r\xa4\x18R\x8d\xfd\xf9`\x19\xfb(\"\xaeM\x85\x43\xb\x62W\xab`\xdf\x45" -"\xd1\r\x62+\xd6\x37\xa0\xbc\x8a\x93\n\x9aQ/.\x14\xb7\x1cn\xba\xee\xe6\x9bM\xa4?\x8e" -"\xea\x32t\xb0\x9` \x9f&y\x9fz\xedVw\x83\xbfl\xb4\x7\xce\x80\xf5W\xda\x13\x12n\x1a" -"=\xfe\xe4\xe1\xea\x9x[\xf8\xe7\xf0\xc6\x96\x42\xa7\x90\xc\xd9\xcd#P\xb0\xff$\x17" -"\xfd\x8c#\xac\x90iK\xbe\xeb\x87\xab\xbf\xe1\x41%gK\x8\xfc\"\xb1Z{eP\xe9\xce\x91\xfb" -"\x5G\xde\x31&D2O\x84\xbf\x4`\x8d\xfb\x1e\x9b\xfc\xdb\x65\x45\xb9G\x8a\x84%\x91s2" -"C\xcd\xa4iVpK\x86\xe6N6\xbd/\xa5\\\x39\xc5\xbdI\x92h\xa4s\xa7W{\xa1\x8f\xfc\xd2\x95" -"\xb2\x19u\x89\x81\xac\x91\xa6\x38\xa3\xf6\xe4\xf6\xbf))?-\x6\x1a\xd4\xb4G\xca\xf5" -"\x12[\x11\x1d\x13\x8c\xac\xc7x\xb0\x91\x64`B?8\xb3\x30\xd3\xa1\xbbZ_wxi\x1cO\x1c" -"\xdd\x43\xda<\x11Mw\xd1~\xaa\x35\xbd}\x13\xdb\x10\xc\xb5\x63w}\xd4J\x9e\x5\xbe\x9" -"\xe9\x32\x34\x8b\xd9[p\xc\x1a\x5\x96|\x8e\xf2Z\"\xcd\x8b`Vt\x7f\xc9'SYX\x1bH\"\x80" -"\xed\xa3\x14\x1d-\x98\x43\xba\xc3\xcc\x61pfn\x97\xadj\x12\x42\x1f\xaa\xbN'\xe2\x61" -"\xd4V&\xbb)6m7\x19T-\xdd%\x43\xe7\x3,\x99\xe4\xf6\xe8\xe2\x8cV\xe7\xdf\x19`\xcc!" -"\xbb\xe1\xac\xee~?\x2\xc7P\xad&\xecuY\x1\x82\xe7\xebh\x80\x61\xef\xa1\xbd\x41{\x97" -">\x9b\xd9\x9d\x90mB\xd3\"\xb5V\xea\xba&\x8a\x46!\xbe\x8b\xe4\x1b\x17\x8b\x31|\xd2" -"z\xfe\x64\xaa\xa7\x98\x36$z\xb9\x3\x61\xad\xe3\xad\x80\x37\xa3.d\x94\xc8\x39vMx\x7" -"\x1q\xb0\x94O\xca?\x1a\x8c\xee\xa7\xa0\x83z\r\xd1\xea\xd1\xb\xccZ\x88\xef)\xf6\xda" -"\xb2\x8f\x9bzr\x10\xa2O5\x15\xc8\x9d\xa4\x41\x64{\xf4\x19\xc7\x90\x87\xe9\xb6\x16" -"S\xa8\x83\x89\xd3\xbd\xd0\x42\xd3\x46\x42\xda{\x9b$\xf5K\xdd\xf5Q\xd5\xf5\xb8\xc0" -"\xb6\x63\xc3\x9f\xe\xf1\xdb\xca\x91]5h\x89\xf4\x38\xfc\xeW\xdd~\x9aK\x85\xd9q\x8b" -"2\xe8| jr\x15!\x15\x86\xf9\x12\x62\xc1\xe0\x31\x8\xae\x9f\x9as\x19\x2\xcf\xa4{\xc6" -"3\xd4w\xe\xd9\xff\xde\x8a\xff'\xb6\x39\x7\x84V\xfb\x84\xc7\xc2\xdc\xb2r\xc0\\\xf4" -"\xe0]\x83\x87`7\xf2\xb1\x42{\xcW\x1d\x9e\xf0J\r\xb6\xa6\x97\x89w\xad\x0`\xd9\xd2" -"\x8a\x45\xeah=\xf1S6\xd0zx:\xb5z\xf4_\xbf\x93\xfe\xed\xa3\x9c)M\x12\x7f\x31\xd8M" -"\x13&\xe9\x3\x42\xfc\xb4-\xa2\xe8\xf5\xc9Y\xcf>\x94\xc9\xab\xa2\xfd\x9e\x7f\x83\x8f" -"\x92}\x15\xb4os\x0&|\xea@\xad\x8b\xcd$\x1c`\x88@sUK\xd0\x8b\xc1\x45\x10g\x97\x9b" -"\xca\xa9.&\xd0\r\"\xedu\r\x12\xa6\xe2\x9R\x85\xfd\x5\x9d\xacR\xc1\x80<\xa3\xfa+\xdf" -"\xc9\x9a\x9e\xca\xe6\x85\x9fJ\x8f\x62\xb3]mb<\x80\x1b" -"qiP\xf9\x31NR\xbe\x4U\xd5*\xe9m*\x11\xae;\xb\x1a}\xc\xf8?\xa8R\x18X\xa5\xd3\xc3\x38" -"I\x8en\x9d\xd8\xea\x17\xa7!\xf3\x36\xd0zI\xd9\x9b\xa1\xfc\xe8\x61\xb8\xaf\xe2Y\x9f" -"\xee\x93r/\xb5\x65\xe7\xab-\xe1\xc8\x87\xd9X9``9B\xdf\x37w5\xc4\"\xd7 \x1bm\xba\xe3" -"\xd5\x30\xd2#R\xf8Yq\xacH\xa2\r\xb2\xcf\x37Qh\xbe\\^\x98\xa4O)\x97\xa5\x92\xc5\xbb" -"\x81\xbf\xf3\x9?\xa1\x15\xbdR\x9fo\xd0\x8f*\xc1Y\x8d\x2\xfc\xb0\n\xed>T\xd0\x34l" -"\x8b\x10\x8cUK\xe8\xa8\xac\xb5\xfd\x84/\xc9\x9b|\x8e\x38\xa3;zI\x2T\xc5P*\xb9y{p" -"\x9cjn\xcq\x99\xc6\x13\xa8i-&\xa8^\xd2=\x90\x45\xb4\x97!\xbe\xba\x11\xf5\xeb\xbc" -"\x8f\xd7\xe0&\xec\x1c\x90\xee\x15\xb1>\xf2W\xbb\xc5@ \xa5\xe9\x7f<\xfb\x12\xfe\xd9" -"`\x90\x8d\xa6\xcf\xed\xf5pAC\xce\x7\x83\x97\x39\xbc T\xd6\x82\\\x31\xc7P;P\xb1\xfc" -"\x16\xbc\x83\xd9\x99l\xd0\x95\x88\x6\xb5\xfe\xa4U\xbe\x64\x6\x66\xc6\xf5 PppE\xd2@\xe7\xf6\x63\xd8\x3J\xf0\xe5\xf0\x33" -"\xc3\x1\xe\xde\x82'\xb1\x3\x90\xf5Z\n\xc7\x16\xe0\x41\xaf=\xfa\xe0W\x93\x9c\x2\xf6" -"\x8cw\xc0\xe6\xb2\x9fQ\x85y\xfd\x2\x1f~dbo%~\xae\xe7\nn.3;\xda\xd8\xf8\x17\xb9J9Q\x1f\xf" -"\x11\x0U[+x;\xc4\x1c\xc1V\xf0\x31\xc2\x17\xf0\xec\x65\xdf\xa9\xca\x1f\xb3\\\x66%" -"5\xa6\x7\xcb\xe3t\xa6\x81&\xb0w\xa6\x11\x38\x13;\x9cx\xaeU\x89\x8fK\xa5\x37\x81Y" -"\xaa]\xd6\x9Wqt\x8e\xe\xcb\xc7\x90:\x1et\xd5\x30\xd5\x1aS\xfe\x38\x66m\x1f\x9\x99" -"\xc0\xa2\x84Q\xdb\xa7z\x1c-<4q\xa6'\x4\xcb\r\x9a\xc5\x1a\xfd\xa3\xcg\x9\xab\x41y" -"'\x96Ys\xcc\x80lC\x93\x1b.m\xc3}w\r\xae\x94 ;\xf8\x8a\xfa\x8e\xea\xcb\x13 t\xcd\x11" -"[U\x9a\xf3\xb\xc2\x8fr\xc1\xcdL\xbc\xd0\x4\x0x`\xff\xd5\x87\xe5\xdd\n<7\x96\x87\xce" -"\x1a\xed\x32\xc3,\xb8\xe0\xf\xac\xcd\x9f\x93\xe2\x8d\xca\x95t^\xe7\xb1\x4\x2\x14" -"\xc8\x41M\xf2\xe8M-\xc4\xd8\"\xd5\xdc\x45\x91\x85\xf0\\\x9b`\x9a\xa7qM\xe4\x8\xee" -"n\xea\xf7=;I\xb6\x9d\xb8=\x8e`\xd8\xc9\x90\x44\x84\x6\xdf\xea(\xc5p'}\xe4\x8b\x1d" -"\xb3\x15.;V\x13M\x12\x66\xa9\xd3\xfb\x95\xccm7\x7f\x9\xa1\x7fN\xb6\x8c\x42\x93\x82" -"\xc\x1e\xb6/\x8bV'\x91;t\xf6\x10\x97\x92\x84\x0`\xc9\xd4\xd6\xf2T\x93\xfb\xea_\xb1" -"\xd2g\xbf\xf0\x43\xbb\xd3\x91\xfb%VH$Z!\xda\x38\xb4\xaa\xbc\"p\xd8\xb\xd8~\xe5\x1f" -"\xc8-\x8b%\xef-\xc\xde`tR\xca\xab\x95o\xa3\x11\xf2\xe3HK\x95\x36\x9d?\xf7\xf8{\x8b" -"V&\x15U\xdc\xd5\xddK\x91\x33\xcdt\"\xc2\xbe\xa9\xc\xe8\x8e;q\xcc[\xa3\x80\xe3qS9" -"\x1d\x9fx4\x16\xfe\xfbo\x3K\xccz\xe2\xa2\xc6+$#P+pY\xd0\xd0\xf1L0\x5\xc\x7\x0\xe7" -"~\xaf\x14\xba\xd6Z\xb8|!\xac\xcb\xc9\xca\xe3\xf0\xc1:\xa3$\xe3\x83\x36|ZE\xe3}P\x85" -";\x97\xb6l\x89\xe5+g\x13|f-3/\x8\xe1Tb\x15J\x8a\x7\xd0\x1f\xed\x1c\x41\x86\x66\x95" -"\x8e\xccR\xd6?)\xfd\xb4\xd1~c0\x98gTG\xfa\x96\xf7\x35.\xf4\x9bj\x1c\x88\xd0\xb2\x13" -"\xca+\xb2\xe\x1aj\x87\xc9\xda\x43\xca\x66\x9a,|\x9a\x3\xee\xe8\xc3\xfb\x66\x8d\xed" -"\x19\xcc\x92\xdc\xf6x\x93\x88/\x1\n\xc1\x15\x9f\x43\xf6\xfb\x17\xc1\x9a\x17\xee\xa0" -"%F\xb3v\x93\xca\xdf\xa3\xad\xf5\xae\xec\xd2\xe0\xf7J\xa7q\xbe\xba\x83\xd4\x18\xc1" -"\x8c$\xe1\xa6\x8\xc8\x31w\x5\xe9\xa4\x38\xcf\xc8,\xc0\xf0\x8f]\x6P\xf9\xc4\x96\x33" -"n\x15\xe8\xee<\x0@\xfc*z\x80I\xdbI[\x9b\xe1\xd1\xb6\xfc\x1d\xc4wdrl\x85\x1al\x8c" -".\xf0\xc5N\xe9oZ\xf3G@\x14\xdc\xfd\xb7\x1f\xa1\x9b\xc\xf6\x18\xf7@\xe\x87)\x1cZ\x1" -"\x8e\x6;\xce\xee]\xbckZ\n<\x9c\x98\xa6l`\xfe[\x86Z\x1cR\xbb\xc2\xdcL\xbb\x33(\x86" -"Q^\x10{M\x9e\x31\x10|\xd3n\xe1\xc9=\xe8\x1\xf9\x96\x42\xbS\xe\xff\xe1\xe1/\xa6\x90" -"U\xe4\xce\x8b\x39\xd9\xc3~\x97x9&z\x17\xb2\xeb\x18\xd0\xb2\xb3\x94$\xe9\xf7^\x82m\x18\xaa\xbf\x90\xfc\xde%\x18jhO\xc1\x91\xe0\xbf\xfc\xe7" -"\xd8<\xdb\xcd\x9e\xd0\x5\xae\x85\xe\xa0\x1Z1\xc3\x8f\xdd\xc5Y8N\xe8\x8e\xb6\xd8\x35" -"i=\xa9\xa5\x46\x6\xf6\xb4\x61\x4J2\x8e\xa7\x1b\x4\x98\xc6H<\x90\xf5v\x8bv\xaf\x8" -"\x3\xe7q\x5>R\xf2\x8cH\x8f\x11@6M\x9c\x8e\x8a~\x4*\x19Wj,wI\xf8$\x11\x13N\xaf\x1" -"Z\x93M\x3\x46\xb7\x6<\x97\x8a\xd6~\xab\x45\xfc\xd5\x1d\x41p\xd1\x5\x10Jo\xb8\xd3" -"\xf1\x64\x30:!\xeb#N\xe8\x9e\xfc\xa5\xee\x41P\xa8\xd0\x81\x43p\xdd\x82\x64\x8di\xbe" -"'\x98\xb=\xe1\x43%G\xf\x84-\xfb\x43\x1a&l\x17k~\xb\xdc_>\xb9\xe\x90\x94O\xed?\x8" -"\x8e\xfb\xe3\xc7R\xb1\x1c\x9a#\xed\x9b\xd8:\xb8N\xdf\x9a\x84\x33\x0\x45Qp>\xcNg$" -"o\xde\x38\xaaz\x13Hy\x9f\xd3u\xfb\xf8\xe4S\x1\x45\xd8\xb\xa7\x81\x3X\xfb\xa3\x12" -"7!9\x98\x8b\xda\xd9lv\xf5\r\x32\xa6V\xbf\xb9\x36\xc2\x0\xc0\xce\x33\xff\xde\x8d\x97" -"x\xf1vP\x89\xca\x14y\xe1\xa9\xf4\xdaws\x14\xaa\xc9\xbd\xd8\xfe\x38l\x80 E|l\x1\x13" -"&\x9d\xa3\xdd@\xe4\xef\x95\\H\xf8_-\xba\x0\xd5\x8c\xfc\x32\x37\x9d \xd7\x63It\x8d" -"\xc9\xaf\xdc\xcf\x83\x9c&\xc7\x9e\x85:\xc\x15\x12\xd0\xa4\n\xa1]\x6\x46\xbb\x99\xa5" -"\xbd\xcd\xc9\x39\xc6\x62\xf0\xed\x7\x88_/\xc4\xd7\x15\xfb\xdd\x92\xc1\xf3\xa9m\xf" -"\xc0\x41\x7\xc5P\xa0\x17\x18\xd7\x10M\x14\xfeX\x84\x30\xf3\x83\xbb\x9a\xf5\xa2\xb1" -"\x80\x35]S\xf5\xfb`!_\x8a\xa2?\x9fp0\xfe\xd7\x2\x18\x34\x44\xfb\x38\x30\x4\xc9\xfa" -"\xcdp~\xc1\x17\x36\xfb\xda\xc2\x95\xe4\x8d\xd8|\xf7\xd6TK\xd2*\x81\x97\n_A\xf6\x1b" -"4M\xe0\xf0\x1e\\\x1at-\x5\x62\x12\x10\xefMPL\xb3Iw_M\xcY\xba\xcb$\x1b\xdb)\xacKC" -"\r\xe0\xcd\x61s\xfe\x17\x1bJi{\x6$\xe1h\xd0))(\xaa\xdcx\x97\xc4\xd4\ni\x84;\xf\x30" -"\x1b)b\xf1~\x12\x80 \rm\x8\x66\xd2J[\x7\x93\x41\xf7\x62\xaf\xa4\x2}?\xc7\xee.\x1c" -"9\x5\xbe\x93Q\xab\xc4\x8a|\x1\x14\xa3\x41\xa4\xed]\x97\xcb\xcb\xbe\x62\x9\xa0\xe4" -"\xb2\x8c\xdd\x45\xa1\x18\x8d\x7\xfj]\x83mq\x1e\x5\xcdrH\x99\x6\xf9\xc3\xb8\xd6\xcf" -"\xb6\xb3\x31\x18\xe8\x16\x17\xef^;X\x87\xbSNX\xd6\x35\x1e\x31\xd3\x96(\xb1\xe8\x9c" -"\xf2n\xf3z_\xc9\x65[!a>\x92\xd2\x1d\xd1\xcb\x33\xfa\xb2\xbb:\x98\x89\xc0\xd3\x13" -"\xbbt\xc2\x2\x1b\xa4^YU\x14\xcdn\xe2=K@\xf5\xccU[\x1b\x4\xb4\x88\xf7\xb5\x1o\x8\x63" -"nc=\x82\xe1\x91\x98\xd3\xa8\xdc\xf9\xe0\xd0g\xc\xa2\xf1`'\x5\xb8\x34\xe9\xb0\x39" -"\xe2\x92u\xf0\x61\x35\xb5u\xb3_\xdc\x63\xccp\xd9H\xf8\xc6>R\x5Y\x7\x8f[\xf6\x8b," -"C\n\xe1R\x11\x42\xea\x99\x8a\x42\xd3\x63\xde\x64:\x1f\xa1/\xeb\xb3\x81\xab\xbbZ\xfc" -"\x1d\xcb\xe2\x87\x63$e\xcb\xcf\x32l\xa2\xf:it\x16\x41\xa7\xc4\xfe\x89Pu\xa2\x9b}" -"sr\xd8\xd0\xfb|\x84\x99('\xce\x3\xd8\xa7\x89\x4\xeb-Y\x86\xb5\xbdHo\xb\xbd\x31Y\xa0" -"\xdb\xc3\xb3H\x86\x14\"\x1a\x85\x3\\\xcd\n\xfe\xe3\x9V\xc2\x64\x18\xe3\xe4\x9aqo" -"\xaa\x46\xd6\x8e\x32\x39\x8f\xce\x1a\xeb\x2\x3\xc\xc\xb6\x8e\xeek\x1b(\xae\xdcT_" -"^\x95\x8)\x86\xd3?\xecl\x8d\xa8t\xc4hN\x97\xc3\xd7\xd2+Gd\x92\xae\x14\xbd\xaa\xf2" -"W\x92\r\xec\xfc\x9f\xa8\x11T\xb3\x80\x95\xc2_\xa3\xc4\x96\xcd\x7f\xa1\x13.\xeb\xc" -"t\xa5lc\xd1\x83\xa9@\xd6k5g\xa9tw{jf\xc9\x10\x4\nR\xe5\x36P\xa4\x11\x32\xe1\xe7\xec" -"\x5\xa8+f\xd8\xab\xba\xb8N-\xd4N\xa2\xe3\xc0\xd7\xb3}\x86\xe1s\xd6^I\xf4\xa1\xf6" -"\x9f\xf1u\xa0mc\x3\x8e\xb0\xb3\x84z\xe\xec\x63vy\x5\xc3\x8b\xf0L\x10!\x8fQ\x9\x99" -"/4{$\x17\x9bn\xb1I\x1K\xb6\xe8\xe6\xbb\xdb\x10:*%\xff\x95\xb5\xf2\xb4O\x8b\xb6U\xf1" -"L\x80\x33\x1b\xcd\xb1W\xfw\xd0\xf4\xf8n\xeO/\xb\xfa\xefl6\xec\x19;\x18l\xf8\x9f\x66" -"VTi}\x9b\xcb\xd4\xe6\xa6\xc2z\xcc>\xe7\xb9\xb2u\xba\x9c\xbd\xa5\xe8\xe5\x90\x17@" -"\x96%\xb8\xc7\xbah\xaf.\xab\x63\xcc)\xc4\xce\x12\x10\xaa\x93\x9\xa3\x64_I\x1b\x45" -"\\%\xc1,\xdakb\xafG.\x8f\xc4\x9f\x45\xf\xcf\xe0\xcd\xf3&\x1d\xc7\x93\x61\xb7\x83" -"\xc0\x30sz?\xd3\x64\x44@Q\xd3\x89WU\xea\x9\x92\x1f\x5V\x8d\x9bpH\xf8\xc5\xb8\r\xed" -"ye2\xe3\x66\x30\xc6\x1b\x98\xdf\xaa`r\xd7\xa0\xf6\x83\x18\xb6@g\x14q\xd3K\x8\xff" -"\xdd\xac\xed\xd5_\xbd\x31\n\r\xaf\xc\x1b.\xda\xa0\xe$\xc9)\x86\xaf\xb\x14\xba'h)" -"\xb5$\xd1\x41\xf6\xfc\xcf\xff|\xac\xaa-\xfc\xcf,\x1a\xbb\x94\x66+\xcfW!\xfa\xff\xca" -"\xa3\xafxn\xc2<\xe1\x36\xe5\xc9\xf3R\xfd\x1d\x1d\x30\x93\xc1\x8a\x80\x1\x14\x2\x0" -"\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" -"00000000000000000000000000000000000000000000\r0000000000000000000000000000000000" -"000000000000000000000000000000\r000000000000000000000000000000000000000000000000" -"0000000000000000\r00000000000000000000000000000000000000000000000000000000000000" -"00\r0000000000000000000000000000000000000000000000000000000000000000\r0000000000" -"000000000000000000000000000000000000000000000000000000\r000000000000000000000000" -"0000000000000000000000000000000000000000\r00000000000000000000000000000000000000" -"00000000000000000000000000\rcleartomark\n\x80\x3" -; -int n021003l_afm_len = 31943; -char* n021003l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusRomNo9L-Reg" -"u\nFullName Nimbus Roman No9 L Regular\nFamilyName Nimbus Roman No9 L\nWeight Re" -"gular\nItalicAngle 0.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineThi" -"ckness 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Devel" -"opment\nEncodingScheme AdobeStandardEncoding\nFontBBox -168 -281 1000 924\nCapHe" -"ight 662\nXHeight 450\nDescender -217\nAscender 683\nStartCharMetrics 316\nC 32 " -"; WX 250 ; N space ; B 125 0 125 0 ;\nC 33 ; WX 333 ; N exclam ; B 130 -9 237 67" -"6 ;\nC 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ;\nC 35 ; WX 500 ; N numbersi" -"gn ; B 5 0 496 662 ;\nC 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ;\nC 37 ; WX 8" -"33 ; N percent ; B 61 -13 772 676 ;\nC 38 ; WX 778 ; N ampersand ; B 42 -13 750 " -"676 ;\nC 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ;\nC 40 ; WX 333 ; N pare" -"nleft ; B 48 -177 304 676 ;\nC 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ;\n" -"C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ;\nC 43 ; WX 564 ; N plus ; B 30 0" -" 534 506 ;\nC 44 ; WX 250 ; N comma ; B 56 -141 195 102 ;\nC 45 ; WX 333 ; N hyp" -"hen ; B 39 194 285 257 ;\nC 46 ; WX 250 ; N period ; B 70 -11 181 100 ;\nC 47 ; " -"WX 278 ; N slash ; B -9 -14 287 676 ;\nC 48 ; WX 500 ; N zero ; B 24 -14 476 676" -" ;\nC 49 ; WX 500 ; N one ; B 111 0 394 676 ;\nC 50 ; WX 500 ; N two ; B 30 0 47" -"5 676 ;\nC 51 ; WX 500 ; N three ; B 43 -14 432 676 ;\nC 52 ; WX 500 ; N four ; " -"B 12 0 472 676 ;\nC 53 ; WX 500 ; N five ; B 32 -14 438 688 ;\nC 54 ; WX 500 ; N" -" six ; B 34 -14 468 684 ;\nC 55 ; WX 500 ; N seven ; B 20 -8 449 662 ;\nC 56 ; W" -"X 500 ; N eight ; B 56 -14 445 676 ;\nC 57 ; WX 500 ; N nine ; B 30 -22 459 676 " -";\nC 58 ; WX 278 ; N colon ; B 81 -11 192 459 ;\nC 59 ; WX 278 ; N semicolon ; B" -" 80 -141 219 459 ;\nC 60 ; WX 564 ; N less ; B 28 -10 536 516 ;\nC 61 ; WX 564 ;" -" N equal ; B 30 120 534 386 ;\nC 62 ; WX 564 ; N greater ; B 28 -10 536 516 ;\nC" -" 63 ; WX 444 ; N question ; B 68 -8 414 676 ;\nC 64 ; WX 921 ; N at ; B 116 -14 " -"809 676 ;\nC 65 ; WX 722 ; N A ; B 15 0 706 674 ;\nC 66 ; WX 667 ; N B ; B 17 0 " -"593 662 ;\nC 67 ; WX 667 ; N C ; B 28 -14 633 676 ;\nC 68 ; WX 722 ; N D ; B 16 " -"0 685 662 ;\nC 69 ; WX 611 ; N E ; B 12 0 597 662 ;\nC 70 ; WX 556 ; N F ; B 12 " -"0 546 662 ;\nC 71 ; WX 722 ; N G ; B 32 -14 709 676 ;\nC 72 ; WX 722 ; N H ; B 1" -"9 0 702 662 ;\nC 73 ; WX 333 ; N I ; B 18 0 315 662 ;\nC 74 ; WX 389 ; N J ; B 1" -"0 -14 370 662 ;\nC 75 ; WX 722 ; N K ; B 34 0 723 662 ;\nC 76 ; WX 611 ; N L ; B" -" 12 0 598 662 ;\nC 77 ; WX 889 ; N M ; B 12 0 863 662 ;\nC 78 ; WX 722 ; N N ; B" -" 12 -11 707 662 ;\nC 79 ; WX 722 ; N O ; B 34 -14 688 676 ;\nC 80 ; WX 556 ; N P" -" ; B 16 0 542 662 ;\nC 81 ; WX 722 ; N Q ; B 34 -178 701 676 ;\nC 82 ; WX 667 ; " -"N R ; B 17 0 659 662 ;\nC 83 ; WX 556 ; N S ; B 42 -14 491 676 ;\nC 84 ; WX 611 " -"; N T ; B 17 0 593 662 ;\nC 85 ; WX 722 ; N U ; B 14 -14 705 662 ;\nC 86 ; WX 72" -"2 ; N V ; B 16 -11 697 662 ;\nC 87 ; WX 944 ; N W ; B 5 -11 932 662 ;\nC 88 ; WX" -" 722 ; N X ; B 10 0 704 662 ;\nC 89 ; WX 722 ; N Y ; B 22 0 703 662 ;\nC 90 ; WX" -" 611 ; N Z ; B 9 0 597 662 ;\nC 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 " -";\nC 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ;\nC 93 ; WX 333 ; N bracketri" -"ght ; B 34 -156 245 662 ;\nC 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ;\nC" -" 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; " -"B 115 433 254 676 ;\nC 97 ; WX 444 ; N a ; B 37 -10 442 460 ;\nC 98 ; WX 500 ; N" -" b ; B 3 -10 468 683 ;\nC 99 ; WX 444 ; N c ; B 25 -10 412 460 ;\nC 100 ; WX 500" -" ; N d ; B 27 -10 491 683 ;\nC 101 ; WX 444 ; N e ; B 25 -10 424 460 ;\nC 102 ; " -"WX 333 ; N f ; B 20 0 383 683 ;\nC 103 ; WX 500 ; N g ; B 28 -218 470 460 ;\nC 1" -"04 ; WX 500 ; N h ; B 9 0 487 683 ;\nC 105 ; WX 278 ; N i ; B 16 0 253 683 ;\nC " -"106 ; WX 278 ; N j ; B -70 -218 194 683 ;\nC 107 ; WX 500 ; N k ; B 7 0 505 683 " -";\nC 108 ; WX 278 ; N l ; B 19 0 257 683 ;\nC 109 ; WX 778 ; N m ; B 16 0 775 46" -"0 ;\nC 110 ; WX 500 ; N n ; B 16 0 485 460 ;\nC 111 ; WX 500 ; N o ; B 29 -10 47" -"0 460 ;\nC 112 ; WX 500 ; N p ; B 5 -217 470 460 ;\nC 113 ; WX 500 ; N q ; B 24 " -"-217 488 461 ;\nC 114 ; WX 333 ; N r ; B 5 0 335 460 ;\nC 115 ; WX 389 ; N s ; B" -" 51 -10 348 459 ;\nC 116 ; WX 278 ; N t ; B 13 -10 279 579 ;\nC 117 ; WX 500 ; N" -" u ; B 9 -10 479 450 ;\nC 118 ; WX 500 ; N v ; B 19 -14 477 450 ;\nC 119 ; WX 72" -"2 ; N w ; B 21 -14 694 450 ;\nC 120 ; WX 500 ; N x ; B 17 0 479 450 ;\nC 121 ; W" -"X 500 ; N y ; B 14 -218 475 450 ;\nC 122 ; WX 444 ; N z ; B 27 0 418 450 ;\nC 12" -"3 ; WX 480 ; N braceleft ; B 100 -181 350 680 ;\nC 124 ; WX 200 ; N bar ; B 67 -" -"14 133 676 ;\nC 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ;\nC 126 ; WX 5" -"41 ; N asciitilde ; B 40 186 502 320 ;\nC 161 ; WX 333 ; N exclamdown ; B 97 -21" -"8 204 469 ;\nC 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;\nC 163 ; WX 500 ; N s" -"terling ; B 12 -8 490 676 ;\nC 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ;\n" -"C 165 ; WX 500 ; N yen ; B -53 0 512 662 ;\nC 166 ; WX 500 ; N florin ; B 7 -189" -" 490 676 ;\nC 167 ; WX 500 ; N section ; B 70 -148 426 676 ;\nC 168 ; WX 500 ; N" -" currency ; B -22 58 522 602 ;\nC 169 ; WX 180 ; N quotesingle ; B 48 431 133 67" -"6 ;\nC 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ;\nC 171 ; WX 500 ; N gu" -"illemotleft ; B 42 33 456 416 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 " -"416 ;\nC 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ;\nC 174 ; WX 556 ; N" -" fi ; B 31 0 521 683 ;\nC 175 ; WX 556 ; N fl ; B 32 0 521 683 ;\nC 177 ; WX 500" -" ; N endash ; B 0 201 500 250 ;\nC 178 ; WX 500 ; N dagger ; B 59 -149 443 676 ;" -"\nC 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ;\nC 180 ; WX 250 ; N periodc" -"entered ; B 70 199 181 310 ;\nC 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 " -";\nC 183 ; WX 350 ; N bullet ; B 40 196 310 466 ;\nC 184 ; WX 333 ; N quotesingl" -"base ; B 79 -141 218 102 ;\nC 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 " -";\nC 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ;\nC 187 ; WX 500 ; N gui" -"llemotright ; B 44 33 458 416 ;\nC 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 10" -"0 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ;\nC 191 ; WX 444 ; N que" -"stiondown ; B 30 -218 376 468 ;\nC 193 ; WX 333 ; N grave ; B 19 507 242 678 ;\n" -"C 194 ; WX 333 ; N acute ; B 93 507 317 678 ;\nC 195 ; WX 333 ; N circumflex ; B" -" 11 507 322 674 ;\nC 196 ; WX 333 ; N tilde ; B 1 532 331 638 ;\nC 197 ; WX 333 " -"; N macron ; B 11 547 322 601 ;\nC 198 ; WX 333 ; N breve ; B 26 507 307 664 ;\n" -"C 199 ; WX 333 ; N dotaccent ; B 118 523 217 622 ;\nC 200 ; WX 333 ; N dieresis " -"; B 18 523 316 622 ;\nC 202 ; WX 333 ; N ring ; B 67 512 266 711 ;\nC 203 ; WX 3" -"33 ; N cedilla ; B 52 -215 261 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -3 507 3" -"77 678 ;\nC 206 ; WX 333 ; N ogonek ; B 64 -165 249 0 ;\nC 207 ; WX 333 ; N caro" -"n ; B 11 507 322 674 ;\nC 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ;\nC 225 ;" -" WX 889 ; N AE ; B 0 0 863 662 ;\nC 227 ; WX 276 ; N ordfeminine ; B 4 394 270 6" -"76 ;\nC 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ;\nC 233 ; WX 722 ; N Oslash ; " -"B 34 -80 688 734 ;\nC 234 ; WX 889 ; N OE ; B 30 -6 885 668 ;\nC 235 ; WX 310 ; " -"N ordmasculine ; B 6 394 304 676 ;\nC 241 ; WX 667 ; N ae ; B 38 -10 632 460 ;\n" -"C 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ;\nC 248 ; WX 278 ; N lslash ; B 19" -" 0 259 683 ;\nC 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ;\nC 250 ; WX 722 ; " -"N oe ; B 30 -10 690 460 ;\nC 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ;\nC " -"-1 ; WX 722 ; N Udieresis ; B 14 -14 705 834 ;\nC -1 ; WX 722 ; N Uacute ; B 14 " -"-14 705 890 ;\nC -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ;\nC -1 ; WX 611 ;" -" N Tcaron ; B 17 0 593 886 ;\nC -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ;\nC -" -"1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ;\nC -1 ; WX 667 ; N Racute ; B 17 0 659 " -"890 ;\nC -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ;\nC -1 ; WX 722 ; N Otilde ;" -" B 34 -14 688 850 ;\nC -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;\nC -1 ; W" -"X 722 ; N Ohungarumlaut ; B 34 -14 688 890 ;\nC -1 ; WX 722 ; N Uhungarumlaut ; " -"B 14 -14 705 890 ;\nC -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ;\nC -1 ; WX 722 ;" -" N Eth ; B 16 0 685 662 ;\nC -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ;\nC -1 ; W" -"X 611 ; N Zacute ; B 9 0 597 890 ;\nC -1 ; WX 722 ; N Uring ; B 14 -14 705 923 ;" -"\nC -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ;\nC -1 ; WX 444 ; N eogonek ; B " -"25 -165 424 460 ;\nC -1 ; WX 444 ; N edotaccent ; B 25 -10 424 622 ;\nC -1 ; WX " -"444 ; N ecaron ; B 25 -10 424 674 ;\nC -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890" -" ;\nC -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ;\nC -1 ; WX 444 ; N eacute ; B 25 " -"-10 424 678 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -10 424 622 ;\nC -1 ; WX 600 ;" -" N dcaron ; B 27 -10 599 683 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ;" -"\nC -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ;\nC -1 ; WX 444 ; N cacute ; B 25" -" -10 412 678 ;\nC -1 ; WX 444 ; N aogonek ; B 37 -165 444 460 ;\nC -1 ; WX 444 ;" -" N aring ; B 37 -10 442 721 ;\nC -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ;\nC " -"-1 ; WX 444 ; N abreve ; B 37 -10 442 664 ;\nC -1 ; WX 444 ; N egrave ; B 25 -10" -" 424 678 ;\nC -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ;\nC -1 ; WX 444 ; N aac" -"ute ; B 37 -10 442 678 ;\nC -1 ; WX 444 ; N adieresis ; B 37 -10 442 622 ;\nC -1" -" ; WX 722 ; N Uogonek ; B 14 -165 705 662 ;\nC -1 ; WX 500 ; N ugrave ; B 9 -10 " -"479 678 ;\nC -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ;\nC -1 ; WX 500 ; N udier" -"esis ; B 9 -10 479 622 ;\nC -1 ; WX 278 ; N tcaron ; B 13 -10 300 676 ;\nC -1 ; " -"WX 389 ; N scommaaccent ; B 51 -281 348 459 ;\nC -1 ; WX 611 ; N Zcaron ; B 9 0 " -"597 886 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ;\nC -1 ; WX 722 ; N" -" Ucircumflex ; B 14 -14 705 886 ;\nC -1 ; WX 444 ; N acircumflex ; B 37 -10 442 " -"674 ;\nC -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 834 ;\nC -1 ; WX 389 ; N scaron " -"; B 39 -10 350 674 ;\nC -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ;\nC -1 ; WX 38" -"9 ; N sacute ; B 51 -10 365 678 ;\nC -1 ; WX 611 ; N Tcommaaccent ; B 17 -281 59" -"3 662 ;\nC -1 ; WX 722 ; N Ydieresis ; B 22 0 703 834 ;\nC -1 ; WX 500 ; N thorn" -" ; B 5 -217 470 683 ;\nC -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ;\nC -1 ; WX 7" -"22 ; N Ograve ; B 34 -14 688 890 ;\nC -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 " -";\nC -1 ; WX 722 ; N Odieresis ; B 34 -14 688 834 ;\nC -1 ; WX 722 ; N Ntilde ; " -"B 12 -11 707 850 ;\nC -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ;\nC -1 ; WX 722" -" ; N Nacute ; B 12 -11 707 890 ;\nC -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ;\nC" -" -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ;\nC -1 ; WX 333 ; N Idotaccent ; B 18 " -"0 315 834 ;\nC -1 ; WX 333 ; N racute ; B 5 0 335 678 ;\nC -1 ; WX 333 ; N Icirc" -"umflex ; B 11 0 322 886 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 470 678 ;\n" -"C -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ;\nC -1 ; WX 500 ; N Euro ; B -16 -1" -"4 477 674 ;\nC -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ;\nC -1 ; WX 300 ;" -" N onesuperior ; B 57 270 248 676 ;\nC -1 ; WX 300 ; N twosuperior ; B 1 270 296" -" 676 ;\nC -1 ; WX 300 ; N threesuperior ; B 14 262 291 676 ;\nC -1 ; WX 333 ; N " -"Igrave ; B 18 0 315 890 ;\nC -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ;\nC -1 ; W" -"X 333 ; N Imacron ; B 11 0 322 813 ;\nC -1 ; WX 333 ; N Iogonek ; B 18 -165 397 " -"662 ;\nC -1 ; WX 333 ; N Idieresis ; B 18 0 316 834 ;\nC -1 ; WX 722 ; N Gbreve " -"; B 32 -14 709 876 ;\nC -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ;\nC -1 ; WX " -"722 ; N Kcommaaccent ; B 34 -281 723 662 ;\nC -1 ; WX 500 ; N ograve ; B 29 -10 " -"470 678 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 42 -281 491 676 ;\nC -1 ; WX 611 ;" -" N Eogonek ; B 12 -165 611 662 ;\nC -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ;\n" -"C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 834 ;\nC -1 ; WX 278 ; N iogonek ; B 1" -"6 -165 278 683 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 736 ;\nC -1 ; W" -"X 500 ; N odieresis ; B 29 -10 470 622 ;\nC -1 ; WX 500 ; N ntilde ; B 16 0 485 " -"638 ;\nC -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ;\nC -1 ; WX 611 ; N Ecaron ; B" -" 12 0 597 886 ;\nC -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ;\nC -1 ; WX 389" -" ; N scedilla ; B 51 -215 348 459 ;\nC -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ;\n" -"C -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ;\nC -1 ; WX 611 ; N Eacute ; B 12 0 5" -"97 890 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 32 -281 709 676 ;\nC -1 ; WX 667 ; " -"N Rcommaaccent ; B 17 -281 659 662 ;\nC -1 ; WX 611 ; N Edieresis ; B 12 0 597 8" -"34 ;\nC -1 ; WX 500 ; N nacute ; B 16 0 485 678 ;\nC -1 ; WX 500 ; N uogonek ; B" -" 9 -165 500 450 ;\nC -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ;\nC -1 ; WX 722 " -"; N Dcaron ; B 16 0 685 886 ;\nC -1 ; WX 348 ; N lcaron ; B 19 0 348 683 ;\nC -1" -" ; WX 667 ; N Ccaron ; B 28 -14 633 886 ;\nC -1 ; WX 667 ; N Cacute ; B 28 -14 6" -"33 890 ;\nC -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ;\nC -1 ; WX 400 ; N de" -"gree ; B 57 390 343 676 ;\nC -1 ; WX 722 ; N Aogonek ; B 15 -165 786 674 ;\nC -1" -" ; WX 564 ; N minus ; B 30 220 534 286 ;\nC -1 ; WX 564 ; N multiply ; B 38 8 52" -"7 497 ;\nC -1 ; WX 564 ; N divide ; B 30 -10 534 516 ;\nC -1 ; WX 722 ; N Aring " -"; B 15 0 706 915 ;\nC -1 ; WX 980 ; N trademark ; B 30 256 957 662 ;\nC -1 ; WX " -"333 ; N rcommaaccent ; B 5 -281 335 460 ;\nC -1 ; WX 278 ; N lacute ; B 19 0 290" -" 890 ;\nC -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ;\nC -1 ; WX 722 ; N Atilde" -" ; B 15 0 706 850 ;\nC -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ;\nC -1 ; W" -"X 278 ; N igrave ; B -8 0 253 678 ;\nC -1 ; WX 500 ; N ncommaaccent ; B 16 -281 " -"485 460 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 19 -281 257 683 ;\nC -1 ; WX 564 ;" -" N plusminus ; B 30 0 534 568 ;\nC -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ;\n" -"C -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ;\nC -1 ; WX 750 ; N threequarte" -"rs ; B 15 -14 718 676 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 290 678 ;\nC -1 ; WX " -"722 ; N Abreve ; B 15 0 706 876 ;\nC -1 ; WX 500 ; N kcommaaccent ; B 7 -281 505" -" 683 ;\nC -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ;\nC -1 ; WX 278 ; N imacro" -"n ; B -16 0 292 601 ;\nC -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ;\nC -1 ; WX" -" 444 ; N amacron ; B 37 -10 442 601 ;\nC -1 ; WX 278 ; N tcommaaccent ; B 13 -28" -"1 279 579 ;\nC -1 ; WX 500 ; N ydieresis ; B 14 -218 475 622 ;\nC -1 ; WX 444 ; " -"N zdotaccent ; B 27 0 418 622 ;\nC -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ;\nC " -"-1 ; WX 444 ; N zacute ; B 27 0 418 678 ;\nC -1 ; WX 500 ; N yacute ; B 14 -218 " -"475 678 ;\nC -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 479 678 ;\nC -1 ; WX 500 ; " -"N eth ; B 29 -10 471 686 ;\nC -1 ; WX 500 ; N uring ; B 9 -10 479 711 ;\nC -1 ; " -"WX 722 ; N Ocircumflex ; B 34 -14 688 886 ;\nC -1 ; WX 333 ; N commaaccent ; B 9" -"7 -281 236 -38 ;\nC -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ;\nC -1 ; WX 76" -"0 ; N registered ; B 38 -14 722 676 ;\nC -1 ; WX 722 ; N Acircumflex ; B 15 0 70" -"6 886 ;\nC -1 ; WX 278 ; N idieresis ; B 11 0 269 622 ;\nC -1 ; WX 494 ; N lozen" -"ge ; B 18 0 466 740 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 564 " -"; N notequal ; B 30 -3 534 509 ;\nC -1 ; WX 549 ; N radical ; B -2 -65 526 924 ;" -"\nC -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ;\nC -1 ; WX 722 ; N Aacute ; B 15 0" -" 706 890 ;\nC -1 ; WX 564 ; N lessequal ; B 28 0 536 628 ;\nC -1 ; WX 564 ; N gr" -"eaterequal ; B 28 0 536 628 ;\nC -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ;" -"\nC -1 ; WX 713 ; N summation ; B 14 -123 695 752 ;\nC -1 ; WX 494 ; N partialdi" -"ff ; B 26 -10 462 753 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B 12 -281 707 662 ;\nC" -" -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ;\nC -1 ; WX 200 ; N brokenbar ; B 67" -" -14 133 676 ;\nC -1 ; WX 611 ; N Lcommaaccent ; B 12 -281 598 662 ;\nC -1 ; WX " -"722 ; N Adieresis ; B 15 0 706 834 ;\nC -1 ; WX 500 ; N mu ; B 36 -218 512 450 ;" -"\nC -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ;\nEndCharMetrics\nStartKernData\nSt" -"artKernPairs 998\nKPX A C -51\nKPX A Ccedilla -57\nKPX A G -57\nKPX A O -60\nKPX" -" A Odieresis -60\nKPX A Q -60\nKPX A T -54\nKPX A U -62\nKPX A Uacute -62\nKPX A" -" Ucircumflex -62\nKPX A Udieresis -62\nKPX A Ugrave -62\nKPX A V -131\nKPX A W -" -"113\nKPX A Y -81\nKPX A a -6\nKPX A b -20\nKPX A c -29\nKPX A ccedilla -29\nKPX " -"A comma -3\nKPX A d -28\nKPX A e -27\nKPX A g -20\nKPX A guillemotleft -64\nKPX " -"A guilsinglleft -74\nKPX A hyphen -23\nKPX A o -40\nKPX A period -10\nKPX A q -2" -"1\nKPX A quotedblright -91\nKPX A quoteright -116\nKPX A t -20\nKPX A u -28\nKPX" -" A v -81\nKPX A w -73\nKPX A y -83\nKPX Aacute C -51\nKPX Aacute G -57\nKPX Aacu" -"te O -60\nKPX Aacute Q -60\nKPX Aacute T -54\nKPX Aacute U -62\nKPX Aacute V -13" -"1\nKPX Aacute W -113\nKPX Aacute Y -81\nKPX Aacute a -6\nKPX Aacute b -20\nKPX A" -"acute c -29\nKPX Aacute comma -3\nKPX Aacute d -28\nKPX Aacute e -27\nKPX Aacute" -" g -20\nKPX Aacute guillemotleft -64\nKPX Aacute guilsinglleft -74\nKPX Aacute h" -"yphen -23\nKPX Aacute o -40\nKPX Aacute period -10\nKPX Aacute q -21\nKPX Aacute" -" quoteright -116\nKPX Aacute t -20\nKPX Aacute u -28\nKPX Aacute v -81\nKPX Aacu" -"te w -73\nKPX Aacute y -83\nKPX Acircumflex C -51\nKPX Acircumflex G -57\nKPX Ac" -"ircumflex O -60\nKPX Acircumflex Q -60\nKPX Acircumflex T -54\nKPX Acircumflex U" -" -62\nKPX Acircumflex V -131\nKPX Acircumflex W -113\nKPX Acircumflex Y -81\nKPX" -" Acircumflex comma -3\nKPX Acircumflex period -10\nKPX Adieresis C -51\nKPX Adie" -"resis G -57\nKPX Adieresis O -60\nKPX Adieresis Q -60\nKPX Adieresis T -54\nKPX " -"Adieresis U -62\nKPX Adieresis V -131\nKPX Adieresis W -113\nKPX Adieresis Y -81" -"\nKPX Adieresis a -6\nKPX Adieresis b -20\nKPX Adieresis c -29\nKPX Adieresis co" -"mma -3\nKPX Adieresis d -28\nKPX Adieresis g -20\nKPX Adieresis guillemotleft -6" -"4\nKPX Adieresis guilsinglleft -74\nKPX Adieresis hyphen -23\nKPX Adieresis o -4" -"0\nKPX Adieresis period -10\nKPX Adieresis q -21\nKPX Adieresis quotedblright -9" -"1\nKPX Adieresis quoteright -116\nKPX Adieresis t -20\nKPX Adieresis u -28\nKPX " -"Adieresis v -81\nKPX Adieresis w -73\nKPX Adieresis y -83\nKPX Agrave C -51\nKPX" -" Agrave G -57\nKPX Agrave O -60\nKPX Agrave Q -60\nKPX Agrave T -54\nKPX Agrave " -"U -62\nKPX Agrave V -131\nKPX Agrave W -113\nKPX Agrave Y -81\nKPX Agrave comma " -"-3\nKPX Agrave period -10\nKPX Aring C -51\nKPX Aring G -57\nKPX Aring O -60\nKP" -"X Aring Q -60\nKPX Aring T -54\nKPX Aring U -62\nKPX Aring V -131\nKPX Aring W -" -"113\nKPX Aring Y -81\nKPX Aring a -6\nKPX Aring b -20\nKPX Aring c -29\nKPX Arin" -"g comma -3\nKPX Aring d -28\nKPX Aring e -27\nKPX Aring g -20\nKPX Aring guillem" -"otleft -64\nKPX Aring guilsinglleft -74\nKPX Aring hyphen -23\nKPX Aring o -40\n" -"KPX Aring period -10\nKPX Aring q -21\nKPX Aring quotedblright -91\nKPX Aring qu" -"oteright -116\nKPX Aring t -20\nKPX Aring u -28\nKPX Aring v -81\nKPX Aring w -7" -"3\nKPX Aring y -83\nKPX Atilde C -51\nKPX Atilde G -57\nKPX Atilde O -60\nKPX At" -"ilde Q -60\nKPX Atilde T -54\nKPX Atilde U -62\nKPX Atilde V -131\nKPX Atilde W " -"-113\nKPX Atilde Y -81\nKPX Atilde comma -3\nKPX Atilde period -10\nKPX B A -51\n" -"KPX B AE -44\nKPX B Aacute -51\nKPX B Acircumflex -51\nKPX B Adieresis -51\nKPX " -"B Aring -51\nKPX B Atilde -51\nKPX B O -24\nKPX B OE -18\nKPX B Oacute -24\nKPX " -"B Ocircumflex -24\nKPX B Odieresis -24\nKPX B Ograve -24\nKPX B Oslash -23\nKPX " -"B V -65\nKPX B W -59\nKPX B Y -68\nKPX C A -23\nKPX C AE -15\nKPX C Aacute -23\n" -"KPX C Adieresis -23\nKPX C Aring -23\nKPX C H -2\nKPX C K -10\nKPX C O -12\nKPX " -"C Oacute -12\nKPX C Odieresis -12\nKPX Ccedilla A -27\nKPX D A -67\nKPX D Aacute" -" -67\nKPX D Acircumflex -67\nKPX D Adieresis -67\nKPX D Agrave -67\nKPX D Aring " -"-67\nKPX D Atilde -67\nKPX D J -41\nKPX D T -10\nKPX D V -71\nKPX D W -57\nKPX D" -" X -64\nKPX D Y -74\nKPX F A -71\nKPX F Aacute -71\nKPX F Acircumflex -71\nKPX F" -" Adieresis -71\nKPX F Agrave -71\nKPX F Aring -71\nKPX F Atilde -71\nKPX F J -13" -"\nKPX F O -10\nKPX F Odieresis -10\nKPX F a -34\nKPX F aacute -34\nKPX F adieres" -"is -10\nKPX F ae -36\nKPX F aring -34\nKPX F comma -51\nKPX F e -19\nKPX F eacut" -"e -19\nKPX F hyphen 3\nKPX F i -13\nKPX F j -20\nKPX F o -21\nKPX F oacute -21\n" -"KPX F odieresis -21\nKPX F oe -21\nKPX F oslash -21\nKPX F period -58\nKPX F r -" -"10\nKPX F u -11\nKPX G A -26\nKPX G AE -19\nKPX G Aacute -26\nKPX G Acircumflex " -"-26\nKPX G Adieresis -26\nKPX G Agrave -26\nKPX G Aring -26\nKPX G Atilde -26\nK" -"PX G T -21\nKPX G V -23\nKPX G W -18\nKPX G Y -26\nKPX J A -53\nKPX J AE -46\nKP" -"X J Adieresis -53\nKPX J Aring -53\nKPX K C -43\nKPX K G -49\nKPX K O -51\nKPX K" -" OE -44\nKPX K Oacute -51\nKPX K Odieresis -51\nKPX K S 1\nKPX K T 0\nKPX K a 2\n" -"KPX K adieresis 2\nKPX K ae 0\nKPX K aring 2\nKPX K e -19\nKPX K hyphen -63\nKPX" -" K o -31\nKPX K oacute -31\nKPX K odieresis -31\nKPX K u -19\nKPX K udieresis -1" -"9\nKPX K y -86\nKPX L A 0\nKPX L AE 6\nKPX L Aacute 0\nKPX L Adieresis 0\nKPX L " -"Aring 0\nKPX L C 2\nKPX L Ccedilla 0\nKPX L G 0\nKPX L O -3\nKPX L Oacute -3\nKP" -"X L Ocircumflex -3\nKPX L Odieresis -3\nKPX L Ograve -3\nKPX L Otilde -3\nKPX L " -"S 5\nKPX L T -73\nKPX L U -26\nKPX L Udieresis -26\nKPX L V -115\nKPX L W -89\nK" -"PX L Y -100\nKPX L hyphen 25\nKPX L quotedblright -100\nKPX L quoteright -125\nK" -"PX L u -10\nKPX L udieresis -10\nKPX L y -56\nKPX N A -28\nKPX N AE -21\nKPX N A" -"acute -28\nKPX N Adieresis -28\nKPX N Aring -28\nKPX N C -16\nKPX N Ccedilla -16" -"\nKPX N G -19\nKPX N O -20\nKPX N Oacute -20\nKPX N Odieresis -20\nKPX N a -27\n" -"KPX N aacute -27\nKPX N adieresis -27\nKPX N ae -27\nKPX N aring -27\nKPX N comm" -"a -14\nKPX N e -17\nKPX N eacute -17\nKPX N o -21\nKPX N oacute -21\nKPX N odier" -"esis -21\nKPX N oslash -20\nKPX N period -21\nKPX N u -25\nKPX N udieresis -25\n" -"KPX O A -58\nKPX O AE -50\nKPX O Aacute -58\nKPX O Adieresis -58\nKPX O Aring -5" -"8\nKPX O T -9\nKPX O V -69\nKPX O W -54\nKPX O X -55\nKPX O Y -72\nKPX Oacute A " -"-58\nKPX Oacute T -9\nKPX Oacute V -69\nKPX Oacute W -54\nKPX Oacute Y -72\nKPX " -"Ocircumflex T -9\nKPX Ocircumflex V -69\nKPX Ocircumflex Y -72\nKPX Odieresis A " -"-58\nKPX Odieresis T -9\nKPX Odieresis V -69\nKPX Odieresis W -54\nKPX Odieresis" -" X -55\nKPX Odieresis Y -72\nKPX Ograve T -9\nKPX Ograve V -69\nKPX Ograve Y -72" -"\nKPX Oslash A -58\nKPX Otilde T -9\nKPX Otilde V -69\nKPX Otilde Y -72\nKPX P A" -" -90\nKPX P AE -91\nKPX P Aacute -90\nKPX P Adieresis -90\nKPX P Aring -90\nKPX " -"P J -52\nKPX P a -17\nKPX P aacute -17\nKPX P adieresis -17\nKPX P ae -18\nKPX P" -" aring -17\nKPX P comma -94\nKPX P e -23\nKPX P eacute -23\nKPX P hyphen -37\nKP" -"X P o -25\nKPX P oacute -25\nKPX P odieresis -25\nKPX P oe -25\nKPX P oslash -25" -"\nKPX P period -101\nKPX R C -41\nKPX R Ccedilla -41\nKPX R G -44\nKPX R O -45\n" -"KPX R OE -39\nKPX R Oacute -45\nKPX R Odieresis -45\nKPX R T -34\nKPX R U -56\nK" -"PX R Udieresis -55\nKPX R V -73\nKPX R W -67\nKPX R Y -76\nKPX R a -2\nKPX R aac" -"ute -2\nKPX R adieresis -2\nKPX R ae -5\nKPX R aring -2\nKPX R e -23\nKPX R eacu" -"te -23\nKPX R hyphen -52\nKPX R o -36\nKPX R oacute -36\nKPX R odieresis -36\nKP" -"X R oe -31\nKPX R u -24\nKPX R uacute -24\nKPX R udieresis -24\nKPX R y -37\nKPX" -" S A -37\nKPX S AE -30\nKPX S Aacute -37\nKPX S Adieresis -37\nKPX S Aring -37\n" -"KPX S T -19\nKPX S V -27\nKPX S W -21\nKPX S Y -30\nKPX S t -20\nKPX T A -53\nKP" -"X T AE -45\nKPX T Aacute -53\nKPX T Acircumflex -53\nKPX T Adieresis -53\nKPX T " -"Agrave -53\nKPX T Aring -53\nKPX T Atilde -53\nKPX T C -8\nKPX T G -11\nKPX T J " -"-18\nKPX T O -10\nKPX T OE -4\nKPX T Oacute -10\nKPX T Ocircumflex -10\nKPX T Od" -"ieresis -10\nKPX T Ograve -10\nKPX T Oslash -10\nKPX T Otilde -10\nKPX T S -10\n" -"KPX T V 14\nKPX T W 20\nKPX T Y 11\nKPX T a -77\nKPX T ae -80\nKPX T c -87\nKPX " -"T colon -87\nKPX T comma -74\nKPX T e -86\nKPX T g -91\nKPX T guillemotleft -114" -"\nKPX T guilsinglleft -125\nKPX T hyphen -73\nKPX T i -18\nKPX T j -25\nKPX T o " -"-90\nKPX T oslash -89\nKPX T period -82\nKPX T r -50\nKPX T s -73\nKPX T semicol" -"on -87\nKPX T u -93\nKPX T v -105\nKPX T w -106\nKPX T y -102\nKPX U A -65\nKPX " -"U AE -58\nKPX U Aacute -65\nKPX U Acircumflex -65\nKPX U Adieresis -65\nKPX U Ar" -"ing -65\nKPX U Atilde -65\nKPX U comma -31\nKPX U m -33\nKPX U n -31\nKPX U p -2" -"8\nKPX U period -37\nKPX U r -27\nKPX Uacute A -65\nKPX Uacute comma -31\nKPX Ua" -"cute m -33\nKPX Uacute n -31\nKPX Uacute p -28\nKPX Uacute period -37\nKPX Uacut" -"e r -27\nKPX Ucircumflex A -65\nKPX Udieresis A -65\nKPX Udieresis b 21\nKPX Udi" -"eresis comma -31\nKPX Udieresis m -33\nKPX Udieresis n -31\nKPX Udieresis p -28\n" -"KPX Udieresis period -37\nKPX Udieresis r -27\nKPX Ugrave A -65\nKPX V A -124\nK" -"PX V AE -104\nKPX V Aacute -124\nKPX V Acircumflex -124\nKPX V Adieresis -124\nK" -"PX V Agrave -124\nKPX V Aring -124\nKPX V Atilde -124\nKPX V C -63\nKPX V G -66\n" -"KPX V O -67\nKPX V Oacute -67\nKPX V Ocircumflex -67\nKPX V Odieresis -67\nKPX V" -" Ograve -67\nKPX V Oslash -65\nKPX V Otilde -67\nKPX V S -47\nKPX V T 10\nKPX V " -"a -88\nKPX V ae -89\nKPX V colon -90\nKPX V comma -105\nKPX V e -85\nKPX V g -10" -"1\nKPX V guillemotleft -109\nKPX V guilsinglleft -119\nKPX V hyphen -69\nKPX V i" -" -20\nKPX V o -89\nKPX V oslash -88\nKPX V period -112\nKPX V r -56\nKPX V semic" -"olon -89\nKPX V u -51\nKPX V y -54\nKPX W A -113\nKPX W AE -98\nKPX W Aacute -11" -"3\nKPX W Acircumflex -113\nKPX W Adieresis -113\nKPX W Agrave -113\nKPX W Aring " -"-113\nKPX W Atilde -113\nKPX W C -53\nKPX W G -56\nKPX W O -56\nKPX W Oacute -56" -"\nKPX W Ocircumflex -56\nKPX W Odieresis -56\nKPX W Ograve -56\nKPX W Oslash -55" -"\nKPX W Otilde -56\nKPX W S -41\nKPX W T 17\nKPX W a -80\nKPX W ae -81\nKPX W co" -"lon -81\nKPX W comma -89\nKPX W e -72\nKPX W g -91\nKPX W guillemotleft -97\nKPX" -" W guilsinglleft -107\nKPX W hyphen -56\nKPX W i -13\nKPX W o -76\nKPX W oslash " -"-75\nKPX W period -96\nKPX W r -47\nKPX W semicolon -81\nKPX W u -43\nKPX W y -4" -"5\nKPX X C -52\nKPX X O -61\nKPX X Odieresis -61\nKPX X Q -61\nKPX X a -7\nKPX X" -" e -28\nKPX X hyphen -54\nKPX X o -41\nKPX X u -29\nKPX X y -96\nKPX Y A -74\nKP" -"X Y AE -67\nKPX Y Aacute -74\nKPX Y Acircumflex -74\nKPX Y Adieresis -74\nKPX Y " -"Agrave -74\nKPX Y Aring -74\nKPX Y Atilde -74\nKPX Y C -68\nKPX Y G -71\nKPX Y O" -" -69\nKPX Y Oacute -69\nKPX Y Ocircumflex -69\nKPX Y Odieresis -69\nKPX Y Ograve" -" -69\nKPX Y Oslash -69\nKPX Y Otilde -69\nKPX Y S -44\nKPX Y T 13\nKPX Y a -99\n" -"KPX Y ae -102\nKPX Y colon -109\nKPX Y comma -96\nKPX Y e -103\nKPX Y g -113\nKP" -"X Y guillemotleft -135\nKPX Y guilsinglleft -145\nKPX Y hyphen -98\nKPX Y i -17\n" -"KPX Y o -107\nKPX Y oslash -106\nKPX Y p -88\nKPX Y period -103\nKPX Y semicolon" -" -108\nKPX Y u -78\nKPX Y v -86\nKPX Z v -48\nKPX Z y -50\nKPX a j -26\nKPX a qu" -"oteright -40\nKPX a v -30\nKPX a w -31\nKPX a y -32\nKPX aacute v -30\nKPX aacut" -"e w -31\nKPX aacute y -32\nKPX adieresis v -30\nKPX adieresis w -31\nKPX adieres" -"is y -32\nKPX ae v -27\nKPX ae w -28\nKPX ae y -30\nKPX agrave v -30\nKPX agrave" -" w -31\nKPX agrave y -32\nKPX aring v -30\nKPX aring w -31\nKPX aring y -32\nKPX" -" b v -29\nKPX b w -30\nKPX b y -32\nKPX c h -15\nKPX c k -19\nKPX comma one -52\n" -"KPX comma quotedblright -29\nKPX comma quoteright -53\nKPX e quoteright -30\nKPX" -" e t -10\nKPX e v -27\nKPX e w -28\nKPX e x -35\nKPX e y -30\nKPX eacute v -27\n" -"KPX eacute w -28\nKPX eacute y -30\nKPX ecircumflex v -27\nKPX ecircumflex w -28" -"\nKPX ecircumflex y -30\nKPX eight four 0\nKPX eight one -64\nKPX eight seven -1" -"5\nKPX f a -25\nKPX f aacute -25\nKPX f adieresis 12\nKPX f ae -25\nKPX f aring " -"-6\nKPX f e -34\nKPX f eacute -34\nKPX f f 6\nKPX f i 15\nKPX f j 8\nKPX f l 44\n" -"KPX f o -38\nKPX f oacute -38\nKPX f odieresis -1\nKPX f oe -36\nKPX f oslash -3" -"7\nKPX f quoteright 17\nKPX f s -21\nKPX f t 10\nKPX five four -8\nKPX five one " -"-70\nKPX five seven -36\nKPX four four 14\nKPX four one -75\nKPX four seven -42\n" -"KPX g a -17\nKPX g adieresis -17\nKPX g ae -18\nKPX g aring -17\nKPX g e -25\nKP" -"X g eacute -25\nKPX g l -7\nKPX g oacute -26\nKPX g odieresis -26\nKPX g r 11\nK" -"PX guillemotright A -62\nKPX guillemotright AE -61\nKPX guillemotright Aacute -6" -"2\nKPX guillemotright Adieresis -62\nKPX guillemotright Aring -62\nKPX guillemot" -"right T -114\nKPX guillemotright V -117\nKPX guillemotright W -95\nKPX guillemot" -"right Y -138\nKPX guilsinglright A -72\nKPX guilsinglright AE -71\nKPX guilsingl" -"right Aacute -72\nKPX guilsinglright Adieresis -72\nKPX guilsinglright Aring -72" -"\nKPX guilsinglright T -124\nKPX guilsinglright V -128\nKPX guilsinglright W -10" -"5\nKPX guilsinglright Y -149\nKPX h quoteright -38\nKPX h y -30\nKPX hyphen A -2" -"6\nKPX hyphen AE -25\nKPX hyphen Aacute -26\nKPX hyphen Adieresis -26\nKPX hyphe" -"n Aring -26\nKPX hyphen T -77\nKPX hyphen V -82\nKPX hyphen W -59\nKPX hyphen Y " -"-108\nKPX i T -28\nKPX i j -36\nKPX k a 1\nKPX k aacute 1\nKPX k adieresis 1\nKP" -"X k ae -1\nKPX k aring 1\nKPX k comma 4\nKPX k e -19\nKPX k eacute -19\nKPX k g " -"-12\nKPX k hyphen -65\nKPX k o -32\nKPX k oacute -32\nKPX k odieresis -32\nKPX k" -" period -2\nKPX k s 5\nKPX k u 14\nKPX k udieresis 14\nKPX l v -28\nKPX l y -25\n" -"KPX m p -9\nKPX m v -30\nKPX m w -31\nKPX m y -31\nKPX n T -55\nKPX n p -13\nKPX" -" n quoteright -39\nKPX n v -30\nKPX n w -31\nKPX n y -31\nKPX nine four -7\nKPX " -"nine one -63\nKPX nine seven -6\nKPX o T -91\nKPX o quoteright -34\nKPX o t -9\n" -"KPX o v -36\nKPX o w -36\nKPX o x -36\nKPX o y -41\nKPX oacute v -36\nKPX oacute" -" w -36\nKPX oacute y -41\nKPX ocircumflex t -9\nKPX odieresis t -9\nKPX odieresi" -"s v -36\nKPX odieresis w -36\nKPX odieresis x -36\nKPX odieresis y -41\nKPX ogra" -"ve v -36\nKPX ograve w -36\nKPX ograve y -41\nKPX one comma -48\nKPX one eight -" -"68\nKPX one five -37\nKPX one four -72\nKPX one nine -61\nKPX one one -78\nKPX o" -"ne period -55\nKPX one seven -78\nKPX one six -66\nKPX one three -41\nKPX one tw" -"o -34\nKPX one zero -54\nKPX p t -6\nKPX p y -28\nKPX period one -61\nKPX period" -" quotedblright -33\nKPX period quoteright -58\nKPX q c -7\nKPX q u -12\nKPX quot" -"edblbase A 12\nKPX quotedblbase AE 19\nKPX quotedblbase T -60\nKPX quotedblbase " -"V -104\nKPX quotedblbase W -76\nKPX quotedblbase Y -87\nKPX quotedblleft A -86\n" -"KPX quotedblleft AE -91\nKPX quotedblleft Aacute -86\nKPX quotedblleft Adieresis" -" -86\nKPX quotedblleft Aring -86\nKPX quotedblleft T 14\nKPX quotedblleft V 1\nK" -"PX quotedblleft W 7\nKPX quotedblleft Y -1\nKPX quotedblright A -94\nKPX quotedb" -"lright AE -99\nKPX quotedblright Aacute -94\nKPX quotedblright Adieresis -94\nKP" -"X quotedblright Aring -94\nKPX quotedblright T 11\nKPX quotedblright V 0\nKPX qu" -"otedblright W 6\nKPX quotedblright Y -2\nKPX quoteleft A -110\nKPX quoteleft AE " -"-115\nKPX quoteleft Aacute -110\nKPX quoteleft Adieresis -110\nKPX quoteleft Ari" -"ng -110\nKPX quoteleft T -9\nKPX quoteleft V -23\nKPX quoteleft W -17\nKPX quote" -"left Y -26\nKPX quoteright A -130\nKPX quoteright AE -135\nKPX quoteright Aacute" -" -130\nKPX quoteright Adieresis -130\nKPX quoteright Aring -130\nKPX quoteright " -"comma -71\nKPX quoteright d -56\nKPX quoteright o -54\nKPX quoteright period -78" -"\nKPX quoteright r -44\nKPX quoteright s -47\nKPX quoteright t -43\nKPX quoterig" -"ht v -47\nKPX quoteright w -47\nKPX quoteright y -45\nKPX r a -1\nKPX r aacute -" -"1\nKPX r acircumflex -1\nKPX r adieresis -1\nKPX r ae -3\nKPX r agrave -1\nKPX r" -" aring -1\nKPX r c -8\nKPX r ccedilla -8\nKPX r colon -7\nKPX r comma -41\nKPX r" -" d -10\nKPX r e -6\nKPX r eacute -6\nKPX r ecircumflex -6\nKPX r egrave -6\nKPX " -"r f 19\nKPX r g -15\nKPX r h -6\nKPX r hyphen -46\nKPX r i 20\nKPX r j 14\nKPX r" -" k -10\nKPX r l -18\nKPX r m 20\nKPX r n 22\nKPX r o -8\nKPX r oacute -8\nKPX r " -"ocircumflex -8\nKPX r odieresis -8\nKPX r oe -7\nKPX r ograve -8\nKPX r oslash -" -"7\nKPX r p 25\nKPX r period -48\nKPX r q -10\nKPX r quoteright -19\nKPX r r 26\n" -"KPX r s 0\nKPX r semicolon -7\nKPX r t 23\nKPX r u 19\nKPX r v 20\nKPX r w 19\nK" -"PX r x 17\nKPX r y 22\nKPX r z 2\nKPX s quoteright -38\nKPX s t -15\nKPX seven c" -"olon -68\nKPX seven comma -72\nKPX seven eight -40\nKPX seven five -59\nKPX seve" -"n four -63\nKPX seven one -56\nKPX seven period -79\nKPX seven seven -20\nKPX se" -"ven six -46\nKPX seven three -35\nKPX seven two -31\nKPX six four 12\nKPX six on" -"e -74\nKPX six seven -29\nKPX t S 2\nKPX t a 10\nKPX t aacute 10\nKPX t adieresi" -"s 10\nKPX t ae 9\nKPX t aring 10\nKPX t colon -8\nKPX t e 0\nKPX t eacute 0\nKPX" -" t h 10\nKPX t o -8\nKPX t oacute -8\nKPX t odieresis -8\nKPX t quoteright -29\n" -"KPX t semicolon -8\nKPX three four -6\nKPX three one -75\nKPX three seven -28\nK" -"PX two four 0\nKPX two one -60\nKPX two seven -16\nKPX u quoteright -36\nKPX v a" -" -24\nKPX v aacute -24\nKPX v acircumflex -24\nKPX v adieresis -24\nKPX v ae -24" -"\nKPX v agrave -24\nKPX v aring -24\nKPX v atilde -24\nKPX v c -37\nKPX v colon " -"-20\nKPX v comma -69\nKPX v e -36\nKPX v eacute -36\nKPX v ecircumflex -36\nKPX " -"v egrave -36\nKPX v g -41\nKPX v hyphen -28\nKPX v l -31\nKPX v o -38\nKPX v oac" -"ute -38\nKPX v odieresis -38\nKPX v ograve -38\nKPX v oslash -38\nKPX v period -" -"76\nKPX v s -21\nKPX v semicolon -20\nKPX w a -27\nKPX w aacute -27\nKPX w acirc" -"umflex -27\nKPX w adieresis -27\nKPX w ae -27\nKPX w agrave -27\nKPX w aring -27" -"\nKPX w atilde -27\nKPX w c -33\nKPX w colon -23\nKPX w comma -64\nKPX w e -31\n" -"KPX w eacute -31\nKPX w ecircumflex -31\nKPX w egrave -31\nKPX w g -43\nKPX w hy" -"phen -24\nKPX w l -33\nKPX w o -35\nKPX w oacute -35\nKPX w odieresis -35\nKPX w" -" ograve -35\nKPX w oslash -34\nKPX w period -71\nKPX w s -23\nKPX w semicolon -2" -"3\nKPX x a -11\nKPX x c -34\nKPX x e -32\nKPX x eacute -32\nKPX x o -45\nKPX x q" -" -26\nKPX y a -32\nKPX y aacute -32\nKPX y acircumflex -32\nKPX y adieresis -32\n" -"KPX y ae -31\nKPX y agrave -32\nKPX y aring -32\nKPX y atilde -32\nKPX y c -37\n" -"KPX y colon -23\nKPX y comma -66\nKPX y e -35\nKPX y eacute -35\nKPX y ecircumfl" -"ex -35\nKPX y egrave -35\nKPX y g -48\nKPX y hyphen -27\nKPX y l -32\nKPX y o -3" -"9\nKPX y oacute -39\nKPX y odieresis -39\nKPX y ograve -39\nKPX y oslash -38\nKP" -"X y period -73\nKPX y s -26\nKPX y semicolon -23\nKPX zero four 12\nKPX zero one" -" -55\nKPX zero seven -5\nEndKernPairs\nEndKernData\nEndFontMetrics\n" -; -int n021003l_pfb_len = 46026; -char* n021003l_pfb = -"\x80\x1m\x6\x0\x0%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.05\n%%CreationDate: We" -"d Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developmen" -"t\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPY" -"ING (GNU General Public License) for license conditions.\n% As a special excepti" -"on, permission is granted to include this font\n% program in a Postscript or PDF" -" file that consists of a document that\n% contains text to be displayed or print" -"ed using this font, regardless\n% of the conditions or license applying to the d" -"ocument itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) rea" -"donly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See " -"the file COPYING (GNU General Public License) for license conditions. As a speci" -"al exception, permission is granted to include this font program in a Postscript" -" or PDF file that consists of a document that contains text to be displayed or p" -"rinted using this font, regardless of the conditions or license applying to the " -"document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by " -"(URW)++ Design & Development) readonly def\n/FullName (Nimbus Roman No9 L Regula" -"r) readonly def\n/FamilyName (Nimbus Roman No9 L) readonly def\n/Weight (Regular" -") readonly def\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePositio" -"n -100 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusRomNo" -"9L-Regu def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-168 -281 1000 924} read" -"only def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly de" -"f\n/Encoding StandardEncoding def\n/UniqueID 5020931 def\ncurrentdict end\ncurre" -"ntfile eexec\r\x80\x2\x35\xab\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a" -"\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9c" -"t\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4" -"\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5" -"Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d" -"\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7" -"\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>m\xb3\xdc\x98" -"4<\x9c\xd2\xd0\x9b\xa4\x31\"%\xf6}\xc6\x9b\x9e\xbfg\x88\xf6\xeb)n\x97+f\x10]\xf\x9b" -"r\xa7iZ\xb1O \xcauD\xf6\xdfnH1I\xad\x93\rQ\x9e\x44\xc6\x32\x33\xf6n\x8b\x13\xd5\x18" -"\x14\x61\xceV\xc0h\xc0\x15\xdf\x16\xd7R\xf5\xae\xcc=D\x1b\x5\x93\xbb\xd5R\xf4\xc4" -"\x10G\x1a\xae\x82\x31\xbf\xe2\xfe\xdf\x61\x9e]L\xc6\x15\xbd$6\xac\xa5\x7\xfa\xa7" -"\xec\xbd\x97\xaa\xc2T|D\x7f\x8\xa4\xff\xb2\x8e\x12\xc5\xb6\xe3\xd5\xf1\x10'{9\xb6" -"\xc5?\x3\x1a; 44Y;UF\x9d\x1a\x9f\xf\x82\x37\x38\xca\x84\x91\xc3\xf0\x35\xcbtQqw," -"F\x0\xbe\xce\x86\x45\xc5y|\"\x98\xc7\x8ex7\xd6\xf9\xb1\x8b\xa8m\x3p(\xa8\x19p\x9a" -"\x3\xa1\xad\xe4o\xd4\xc9\x12\xd8j\xcf\xc4\x31\xb5\x9c'\x7\xf6\x63\xed\xcc\x19K\x90" -"K\xf0\xac\xdf\x91\xb6\xf7h\xfa\xf9\xf3g\xb3\x88\x42\xaf\x9f\xcd\x35l\xc5\xb6\xf7" -"\xdd\xb7@]\x6/'E;\x98\x9e\xe9\xba\x16h\x5\xec\xe7\x7\x32\n\xa5\x4)\x14L\x1d\x97w" -"\x9a\xb4\x62q U\xa7\x43*=I\xbe\x61\xaf\x9bm\xe8\xa9\xc8 \xc0\xe7\r\x43\xe5\x1d\x9" -"\xb8\x37 \xc9\xd2\x6\xde\xe1\x37\x84\xcd\xc\xb2\x15\x12\xf7\xe0\x41\x8a\x90q\x97" -"^[i\xa5Z\x97UVv\xe8#\xe9@\xf5\xa5\xe6\xe6{@\x5\x41\x99\xa5\xf8\xae\x97\x41\xd2\xd5" -"RqS\xf9\xcd\xc0\x8e\xb9\xd9\\M\xdd\xfb\x9H\x5\x19S\xf3\x9cm-\x81\x1d?\xfd\xc2_xn" -"\x7+*\x8a\x1fH0\xf9\xe5V\xd7\x8a.\\\xcq8\xe0|\xd5\xa9\xc2\xc8\xa7\xa6\x1e!\xd9(\x1f" -"\xa6\xe6\xd5\xd4\xd1\x9d\xeb\x81:\xe4MJIp\x9e\xf\xc5\x63&$a\x5\x33'ZQ\xe9;Pw~\x12" -"\xd9\x35\x9d\xbb>\xc<\x8f>3\xd4\xe1M\x3\xad\x88RA\xc8\x94\xd3\x64\x7\xf9$\xff\xc1" -"\x1\x12\xb8\xe1\xfJ_\x1cG\x87\xd6kDA\xed\x83\x62\x18\xc0\x44m J\x89\xbc\x15|Jl8E" -"\x18\xe5\x30\xab\xda\xae\x8c)\xd3\x97\x38\xdeK\xaeZ\xc6\x8d\x62\x34\x3\x16#\xa5s" -"z\xd7V\x7fQl\xf3\x61\xbc\x42\xdb\x14\x10\xc2\x81*\xf\x7f\x11\xed\x81y\x7f\xf5\x9f" -"%\xd0\xac\x1b\xb7\x13\x89\x84\x90\x61\x12\xf7G\x95k\xb8\x65\xee\xb5]\xd4\xf4\x8b" -"\xaeu\xffw\x88Q\xdf\xbf\xf7\x1e\x9b;\xe5\x91~\xdbt\xe7\xael3BR\xe8\xdd^\x1f\x2\x87" -"\xbe\xd3\xfb\xdc \xf9[x\x91\x1e%(\r\xf0\xb8\xc8g\xb3W\x9b\x9c\xdb\x19\xeH\x2\xd7" -"\x14\x83\x18|i\xd3\x61&\xb8\xbc\x8e\x30\xeci\x6+\xcb\x62\xea" -"\xc1\x82\xb1\xff\xc5qx\xdd;\x16\x89\xdf\xd5~\xf6\x45^L\xbdL\xee\xd0\x62\x99\x9e?" -"\xef\xe3\x94l\xa8\x37\xb0\x87\xb8@\xc3\xe6RE\xea\xc4z\x87\r\x12\xc\x44\xb0\xe8N\x17" -"\xe8\x85\xd0\xfd\xa7H=\xa2\xfb\xd0\xcd\xb9\x19,\xbb\xa4i1Zo2^m\xcb\x13\x65\x9c\xdf" -"\x9c\xf8\xd9\xa3\xe6\xf2.=:;\xcf\xb6]\xb1\xa1\x6\x46\xd0\x8a\xa2\x1c`\x8f\xab\xce" -"gV\xca\x1e\xd8\xec\xeb\x61;=^v\x7\r\x39H6\xbb\xa9\x7\x9S\xb1\x7@\xbb\xb3\x18$\xf9" -">d\xa9\x90\xfd\x8a\xfa\x98\x9e\xb8\xba\xc\x43R\x16V3\xe7\x9b\xc9\x9b\x7uy\xf8\x7f" -"}T~\xac\xc4\xf4\xb6\x9c\x8a\xfc$\xc#\xb3\x1\x82%\xc\xdb\xe4\x61\xfe\xc4\xc2\xe6}" -"9\x7f\xb2\x8d\x8dN\xc0x\xb9|C\xe7\x1d\xa9\x3\xea\xe\x80\xc8{e\xe3PN\xef\x84\x95\x14" -"\x8a\x0(/\xa2\x46\xf7\xd6 !\xe0]&$\xb0\xb\x9f\x7f\x62q+\x8aY\xe\xcc\xd3\xf8\x1f\x99" -"\xda^n1\x8c\xa3\xdb\xeb#<\xf0?\xdb\n\xf8\x1c\x83\xb9\x9|\xe\x8e\xd1\xa7\xa2\xadx" -"\xd7\xe1\xba\xf3\xfd\xf2\x11\xd5\xfe\x83\xf1\xe\x42n\x13\xe2\xec\xf3\xfd\xdc\x14" -"\x9cUa\xcfy=\n\xd4X\x8f\xeb\x34\xd1T\x5\x3}\x92\x12\x43\xa3\xae\xb3\x31\xcc\xd8\xc5" -"\xa9I\xfb\xb5)\xf1WS6\xef\x66\xfc\xf2@)\x1e\xe3\xbd\xd2\x96\x42\xb0\x61%\\\x93\xec" -"\xd9J\x9eOo\xa0\x9a\xe6\x9c\x14\x96\xa8\xbe\xa5\xf4\x8c`\xe3puFf\xb2\xf8\x65w\x16" -"\x8d\x86\xb9\x8d\xe5g\xfb\x37\xe8\xf7\xb\xee\xf4>\xcc%\xbb\xcN\xe7\xc\xab|,(X\xa0" -"\xd6\x39\x16\x1d\n\xcb\xf9|l\xc5\xe1\xc9g\x90\xe1\xe1\x80\xca\xfa]\x9\xb1\xc6R\x7" -"\x3\xf3\xfd\xb3\xd1\xa8\xc7\xb8)\xe7\xb7&<\xe0tk\x96\xef\x1a\xe6\xfd\x46\xcc FI\x9b" -"cW\x94\x9fU\nG\x95\xe8\xb4\xe9\xa4\x18\x46\x38\x1d\xc9\xd1\xe0\x93Y\x9a\xb0\x35\xa3" -"\xd9\xe3U\xde\x38n*r\xfb\x0\x95(\xf3ny\xd3\xb2\xb7hv\x83!\xf4\xf5\x97\x1d\x63p\xe6" -"R3\xb7h\xd6xC.\xa9\x61\x31\xe8\xd6\xd5\xe8\xf2\x81\xdfi0;)\xd0'^\x10\xf9U9\x9\n\xb2" -"\xea\xbf'n\xcc\xe0y\x80\x93\x3\x16Su\x14\xf9\x63\xb0\xf2\xd8 GH\xe7\x15(F\xba\x13" -"$\xc8\x97$\x9f\xc6\x95v\xcd+\x14\x38\x91\xebi\xee\xde%\xa0\xc5\x8c\x9f\x2\xed+\xde" -"\xad\xc4\n\x8U;(\x15Y8\xcd\x65/\xdb\x1fY\xf4~\xa3\xaf\x8f\xbf\xc\xe\xd8\xf3\x91\x8d" -"\x1d\xcb\x92\x0\xdd\x61\x1a\rJ\xa2\xa1\xb2\xce\xa3\x64\x1f\x12\xfc*EQW\xb1\xc9\xd0" -"5\xdc\xf9\x11\xb9\x41\xa5\x0\xcf\xba\x9f\x65\xe7mh(\xec\x84\xd2u\xc0\xfeg^\xc6\xe3" -"p\xb9O\x19\xa5\xc5\xb5\xd5\x39K\xc7\xd9^\xf9&\xe4\x63\xf`\xdd\xc5\xb0\x62vhL-eIP" -"\x6z\xbd\xe1\xc3z\xa4\xec\x91s\xa9\xcbQ\x87\xee\x10\xd7\xe1:T\x84/\x14z\xe6\xeeJ" -"\xfbP\xb8O\xfc\x83mZ[\x89>\xaa\x18\xb9\x8a\xe9\xfatQ%\xf5\x1bZ\xcb~\xea\xaa\x83\x8e" -"\x11\xaei\xe8U\x1a\xb6\xea\xaa\r\x4\x9d\x98\xdcS\xdds\xb3\xa0\x30~\x1e\x8b\xfa\x33" -"\x82)\xc9\xf3\xbbV\xd0<\xdatk\xa5\xae\xa5\xf2Tb\xb4r\xd2\xc3\xc6~q\xd8\xbe+r~\xe" -"v\xb8\xb5~L(\xa4\xa1w\xdc\xd7\xd3u\xcdt\x9e\xca\xe8)\xf9\x9f\x87\x7iU\xc6\xa2\xc5" -"j\x1a\xd5\x8f\xdb\xd3\x31\xc9\xf4Y%\xef\x8e\xb5\xbfRpj\xd2`S&!\xf1\xc1\xb1\x9a\xc7" -"\xcb\x81s\x2\x64ti\x7f\x1d\xb6\xe5_.\xbb\xa3\xf5\x13\xebo\xf4\x1e\x41\x66\x80\xac" -"\x7f\xab\xb5\xb\xd0\xbc\x8\x96\xf6\xc\xb3\x4\x31j\x94Sp\xcf\xa2;\x17\x39\xb4\x85" -"\xa1v\x13\x42\xa3\x9f_d4\xc9\xc7\x9d\n\x10\xa4\xea\xa3\x66\"\xd2\x31h\x93\x9\x11" -"a(R\x84\xfe\xbcygKO\xcc\x14\xb6\x62\x92o4\xff\x61l\x9eH\xb5@\x80\x84\x4wD\xc1N\xda" -"<\xf0\x9a\x42\xa4@\x8f\xc0\x3<\xee\xf6\x44\xed\xc7\xa8\xf\x97\xe2\x81**2\x94\xff" -"0T\xe\x9at\xcbym\xa3\x95\x18\n\xbb\x6n\xcbz\xfc\xd5\xaa\xe3O\x89\x84nZ\xdfwFZ_\x9b" -"\xd2\xe4\xfb-H(\xf0\x65jK\x2\xe5\x62\xf1^c\r\xcb\x0\xfb\x8bT\xff\x10\xda\x11\xca" -"\xc0\xfb\xb4\xb4\x8b\x2\xdc\xeb)\xd1\x84\xaa\x9a_\xb\x0\xcb\xe1! \x85i\xc4\xaf\x9c" -"\xf7\x15\x13\xd8U\xcd\xc3\xba\xa7\x9b\x7\x65\xdb\x44$\xa7\x35=\x9a\x36j\xfav\xcc" -"\x17\xe\xa6=\xdc\xf9\x8c\x86\xee]!\xdb\xd3M\x81\xc3\xb\xba\xa8\xbf\xca\x63\x43\x97" -"r<`M\xf9\xa2\x9d\xc8+\x98\x1a\xc2\x95\x10~xx\x94\xdb\x41\xfe\x1e\x37\x81\x89\x9b\x1\x90\xcd\x9ciD\xcb\r\x34!\x90\xa4\xf9" -"\xa5\xa9Y\xa1O^\xc9\xe3%\xd9\x34\x98\x8\xaf\xb0\x95\xdf\xac\xbd\xf1\xd2\xf9}\xbc" -"\xdd\x1dK\x13\x84\x15U@3\x82\xf6\x18G\xa3\xcdL\xdc\xcdut\xaa\x8d\xe3\xb0\x33\xe1" -"k\x9d\xce\x0\xcc\x9c\xb9\xf6vP\xcezq}\x7f\xb1_|p\xfe\x86\xdc\x15\xe6\xb0RX\xda\xee" -"\xb7I\xet{?@\x82(\x1fW\xadO\xb0:\x92\xc4\xb0\xb8\xf6\x17\x3\x31G\xa0\x19\x43\x91" -"\xb5\rU\xf4\x7f\x9amhm\xedQ\xa3\xc7<\xdb[\xbc\xa8\xc8H\x96\x30 \xa5\xb1)E\x16sM\xb9" -"\xb9\x1drp\x1a\x4\xcd\xe8\x88\xf8\x89g\xcf\x82\xc5G\xce\x1f\x1a\xea\xff+5\xa4X\x1a" -"\xb3\x42k\x88\x8f\xd3K^\xd9\x9d\xf0\x1\xd2\xe4\x84\xad\xf6HD\xf8\n\xe2W}!\x1c\x80" -"k\xf6\x15\x66\x0\xf0\x9a\x16\xda\xc7>\x1c\xfe\xd7\x41x\xe6\xaa\x94\xaa;\xfc{\x13" -"\xees\xd2.\xaf\xd4\xd3'\xc7\x8fW\xdb\xec\x80\xd7\xba-\x9b\xe8`\x3Y\xc3\xc3q\xd0)" -"\x11\xf1\xd5\xe3\xfc\x32\x42\x7-s\xd6{e\x84\x6v\xb6\x93wS\x94\xd5\x9e\xef\x80k\xd5" -"?B\xbb\xea\xac\xb4o\xaaov\x8d\x14\x38j\xc\xb7\x37\x81\x14\xbd\x37&\xf3sK\xd3[\x9b" -"M\x96\x32\xb9{\xacq\xb2\x9a\xaeO\xfc\x83\xa9\x33\xdf\xa5\xab\xaa\x12>\x9eV\rO\xee" -"Gr;]8\x7f\xa0\xee\x6Q\xf8\xf1\x4\xb6\xd7\xb\x90\xff\n\xe6\x18\xbb\xdf\xc9\xb4\xfe" -"\xbd\xb&\xda;\x90\x9ci>\x8d\x32\xcaTC\xd9\x86T\xf7\xc\x8a\xdb\x4\xfd\xd1\xf\xa5\x12" -"\x9b\xf4\xa7\xe1\xd5\xba\xd8\x99\xf5L6\xb2\x35)\xf8\x8\xec\xa5\x9d\xfb\x1c\x98\xc7" -"W\x87\xa7\xd9\x39\x32\xe5\xd1\x15\xdd\xf5\x8c\x9a\x99\x95\xd8\xa8\xec\xe2\xb7\x37" -"H'\xae\x96\x3k\xd5\x87/\xed\xdaxE$\xe0\xbb^\xc0&\x80\xd8\x34\xb1\x80\xebU\x97)\xba" -"\xfbP\xf8\xe7\xb9\xf2\x61\xb3\x94\xad\x16mx\xe5\xd9\x17\xa2\xc0\xb5\xcb\x16\x7f\x45" -"p\x1\xb8\xcf\x63\x39\x92\xdd\xbb\x45\xea\x13\xc9\x9c\x65\x9c\xf\xca\xdb\x36l\xd0" -"(:k\xbb\x9b\xfd\xf1l\xe4\x98\x18L\xe2\\+\xb6j(}+\xa9*l\xe6\xbd\x44\x0\x86\x32~\x13" -"{\x8d\xe6\xa2;A\x8f\xf1i\xeeK\x87\xa4p\xb\xd5\xd4\xe\xa4\x63\xce\xf5\x8b\x5\xdfh" -"\xf3-g\x9e\xefp\xe8\x85q\xac}\x8d\xe9\xfa\xc6\xd4\x65R8`I\xd5\x9a\xe3\xa9#\xe6,\xdb" -";\x98\xeL=\xc8\x9dx\x92SV\xf0\xf6\xef\x1?io\x6\xbb\xa6\xe6\xed\x89\xbdP\xc0\x9e\x1c" -"|\r\xb5}\xb6\xcd>\x1f\x1d\xae\x42\x94\xef\x8b\x42\x8b\xc4\xad\xcb\xb0\x30\x15j\xfa" -"\xc0\x6K\xcd,\x8f\xed\xf4`xgY\x89t\x94\xcc\xa0\x33(`M\xe6\x87\xfo,+\x7\xd8\x92n\x83" -"\xe)\xbb^\xd5\x42\xb\x38\x9c\x97\xe5\xbb\\\xcf\xc4\x44S{\xe3\"\xec\xb3\xc7\xd5\x89" -"\xb1\xcfv\xf8\xa0\xbd\xcfX>\xfb\xe1\xff\x38V,\x7f+\xadSz[V=6\xf1\xfc\xa9SR4j\x96" -"\xd2\xe2\xe6\xcf\x10\x37\x94\xc2\x9a\xef?\x7f\x86\x31@\xbb\xa6\xca\x95\x92\x9d\xf2" -"\xd2?\xeb\x97Mo#\xc2\x14\xb9\x36\xc3\x97\xe8\xfa\x3\x7r\xc0\xdc\xf7Ng\xc5\x13\x9c" -"Sc\xc4\x87{f\x98\xf0!\x2\xdc\xb'\xcd\x99\xac}t\x8c\xf0\x86\x95\xa3\xaa?:\x13\x88" -"\xdfV\xf8\xdf\xa9\xf4v\x9f\x9chlUd?\xe4\xba\x9e\xa1\x35O>\xa2\xab=\x9a\x37\x81tM" -"\xeex\x87T\xe0\r\xf0u\x9cJ\xe9Z0\xe2\xaa\x4\x9a\x98\xb\xd1g\"\x10v\xcf\xdc\xec\x91" -"IB\xb1\xe5\xb3\x8b\xd3\x2\x86\xe0\xa8\xb3\xe4\xa4\xa0\xc2\xca\xbc\xee\x19\xe2z\x6" -"mk\x8f\x92:\xe3K\x82\xbc\xfc\xd7s\x8d;Mh\x7`\xc1t!n\xa7>\xf0\x36&\xcc\x1c" -"\xfa\x36\x9bV@\xc2=v\xa6\x9d\xce\xe8\x38\x1c\x65\x93,\xab\xf3&,\x8bp\x12k\x9a\x1b" -"\xb7\xe5\x85\x96\xcat\xc9\xb7\xe9\x1c\xa3\r\xa0\xf&\x9f\xb3\x85\x86\xb0\x46\xe8\x94" -"__\xe3\xf4\x96\xa7\xb\x14\x12\x31\xd5Vk\x1ch\x8d\xf5*R\xa9\xf\xe6)z\xb4s\xa2\x83" -"\xa4K\xc7\xc9\x8d\xe1jM\xc5\xf1\xb0<\xda>\xe1M\xbd\x8br\xb0\x18\x85y!\x9\xb2_\xd8" -"\xec\xfdk\x13\xd2s\x1d\xe7\x6}\xfc\xeeR\xe2\xc0\xab\xb]\xdc\xa7\x96\x13\"\xf9\x19" -"&6\x17\x63\xb8\x93\x1_H\xeegG\xf0\x1\x1fiQ\x18\x65s$\xab\xa0N\x86\xf4\x1d\x9b\xcb" -"A`\xac\xea\x9a\xa6\x36Z\x1c+z\x18.\x7\xf2\xc5\xd4\x81\x90t}rwv9\xba$l\xaa(\x4\xaa" -"<(\xa7\x18k\x1b\xf9\x8d\x99\xe6\xa8;\xfeJ\xc6\xf8H\xeb*Xp\x1d\x13\x89\xaen\xd4tf" -"p\xac\x62\xea,\x9\x9e!;\xa4{m\x81(\xea\xd9\x8a\xf1gi/\xad[?\x8e\x44$\x92\xe7\xa8" -"\x9d-\xf0\xa0\n:\x11z\xf0\x86\xf5\x1^C\xb5\xa5jP/)2\x9e\xca\xe4r\xdb\x8f\x96=\xbc" -"\x89\xa2\x38\x31!H+w'\x1f\x8b\xf2JQ\xeb,\x8f\xae\xf5\xba\x41\xd1t\xb8Z<\x89\xdc\xb8" -"\n][\xcb\x85q\x97\xaf\x86\x37\x41\x30\xe0\xe7\xa9\xba\x42^\x8\x1b\xb1\xcfm\xbf\x87" -"0\xf2\xa4\xab \xae\xf9\x64.\xed\xbc\x8W\xdcO\x81\x85\x4\xd8i1%sA\xee\x80\x43!\x8e" -"w\xdb\x94&\xb4\x83\xd9?\xf1\xc2\x1\xc8\xb1\xa7\xad\xe2\x1f\x92\xf1\x9e\xfd[\xb6t" -"A6\xcb\xad\x10#un\x10\xc1\x7\x18\xe9tY\xbd\x1b\x5\xc5kt\x1c\x99'\x80p\xba\xcbt\xb7" -"\x7\xab\x92\xa7\xa8g\x99\xc7\xe5\xb3.p\xe3\x8d \xea\x38\xf6\x8g\xa9\xc1z\xb3\xe3\xdc\xac\x7f\xbe\x5\x42\x9e" -"\xbf!i\xa8\x9.{\xc\xc9\xb8$\x0zz\x11>\xe1\xa2=\x8d\n\x62nna\x84}\x2\xd9g\x9f\x94" -"V\xcd~\xcb\x1cqX\x9e\xaa*\xecR\xe3\xa4\xf8\x18\xc7\x8d\xd4r\n>\xa1\x36\xf8%k}\xcc" -"\xa0\xaa.$5\xf0\x33.\xe6\xe2\xb7\x19S\x82\xc6@\xfd\x9a\x1f\x15\xa2\x64\x86\x2|\x4" -"3\xed\xb6\xea\x13\x46\xce%\x86)\xad\xaf" -"\x93\x16\x1$\xb5&\x10\xab\xb7W\x8c)\xc0\xf3\xff\x83\xb3\xe5%t\xf2\xbc\x94\x96\x4" -"\xd6\x35\xc0Z\xd2\xad\xa4\xd0\x17\xa8K\xc\x83\x32\xc0\xab\x91\xc3 C\xdc\x42\x11\xfa" -"\xff\x9\x9\xe7${\xe7\xce~r\x6\xc1kv\xb4\x63&\xbb\xe3\xd9z\xbcP\x99\x16\xe7:\xba\x81" -"\x84s\x90\xe0:\xcaz+\xae!#f\x8a\x64x\xd2\xb5O\x12\x7U\x9d>\xdc$\xf1<\x9b\x92\xa8" -"\x8b\xf6w\xe3`%\xb8\x41\x43^\xc1\xfd\"\xe3\x1\xdd/\x7\x8\x92\xf3\xd6z4\xf7\xa7\x9c" -"+}S\x8,\xc6;\xc6\x64\x16\x9b\x32\xef\x7f\x10\x30s\x8dw\xab\xc2\xdb\x30\xb1\xb2\x41" -"\xdeP0^j\x9c\x19\xb9\xd2O\xdd\x85\x9f\xb8H\xbdzQ2)y\x85v\xfb\x9d\x9ds\xea\x96\xfe" -"\xf2\x82\xc5\\\xad\xb6\x9d\xfa\xc9\x9e\x61\x14\x5\xa2\n\xf6\x44\x87\x15\x9b\x66\x37" -"8\xe9\x18\xb1~\x14\xf8p.\x94rZQ\x1e\xbf\x1f\xd9\x99\x8evB\xe8\xc6\xfc\xf6\x18 \xca" -"\x87\x11-\x1b_I\xfa\xa0\xcb\xfe\x85\x34\x1d\xf9\xa6\xd2\x9a\xb6\x31\x38\xe3:\xa0" -"\xbc\x84\x6\xeb\xa6\xe9\x84]\x1\xd4\x41T]\xd1\xec\x9a\xa6)x\xaf\xd3LM\x8d\x8\xd3" -"\x99\xcaQv+Q\xfa\xb6\x98\x42\xf6\x8b\xec\xb6\x9a\xad\xd4\xbd< \x1z\x94\x11\xbf\x92" -"M\xe0\x16\xf8\xb4\xc7\x7_\xeb}\xce\xe4t\xa0y\xab)\x0\x35\xb/\xeav[h\xe5\x9e\x3\xbf" -"\xea\x93xG\xa2\x10\x88\xee%\x19\xb0\x9bI\xb3\xa8\x8f\x10\xbb&\x87\x1a\x9\xd6\xec" -"\xae\xd6\xf3\xb1\x38'2\xfa\xae\xd0\x42u\xb4\x9e\xe1|gM\xfd\xedN\x1c\x82\x98\xb3\xfd" -"!\xd1\xfeG\xd7\xd0\x1V\xc3(sdU\xbc\xd1\x32IpI;\xdb_POi\x1a|\xac\xc6\xf0\xf7\xc1*" -"8\x86\xe6%\xfdX\x82>\xb9\x1cI\xf3\x8m?\x93U{\xdd\xfb{\xb0\x8d'\xf5\xca\xd8\xe5s\x95" -"\x7\x1f\xbb\x8a%|\x95\xdb\xb9\x94\xe1\x88\x8e\xfd\x2\xe0\xc7\xa1,\x5\xc0\x30\x44" -"\xc5HFF2z\xfc\xa6\xd3\xd6\x88+\xf5\xe8r\xf3\xf4\x94\x39\x8b\x88\x1fP\xf8\xf9\x9e" -"\xa4u\xe8\xcd &\xee\x2\x81\x98\xdf\xd7H\x8d\x96\x1f\x8e\x80\x16\xa5k(\xce_}\xef\x36" -"\x8d\x9$\x85\xe5\x97\xcb\x6\xa9\xc2\x35\x0\x3\x95\xdd\xe1\xc3\xcb\x95\x1a\xf9l\xa4" -"G\xa3I\xcf\xe6\xaa\xd3\x99@W\xf3\x39\xa9\xffI\xcc\xd1m\x91<+\x1\x16\x65\x15?F\xeb" -"j\xd4:\xed\x8eHGdj\x88\x42{\xc6\xaf\x61\x8\xea\x80\x37\x89\x11x\x9b\xae#\x1c\x89" -"\x8bvH\x9d$\x9ere|\x1b\x88P\x6n\x97\xe6\x63\xfd\x86\xeape\xc\x84\x97\x98u|\xab\x43" -"\xfdl\x97\x33\xc2\xad}\x9\xde\x36\xb9\xc6\x8\xa4w\x1pEU^B\x4\x99~\x85\xdf\xa6\xee" -"\x8d\x1b&\xcf\xc\x80$\xe2\x95\x97I\xe6\x10\xd0,\xad!\x8di0*\x8bJ\xd3\xf6\x88\nUH" -"\xe4\x11.\xb5P^\xba\x2\x1b\xb0\xb\xec\xa2#\x14=t0\xd6R\x1c\xa7<\xf7\x89x~\xdd\x1c" -"\xaajd\xaf\x4Q1\x19L\xe5\xcc\xd4\xfa\xe5\x4\x1d\x1azoY\xdc\x8a\xf2YYGR\xfa.9\xa5" -"\x8e\xa6\x34v@\xa3\x3O\xed\x9\xbd\x85\xbcR\x13\xfcv%\x9e%\x86\n>\x8c\x45\xef\x15" -"\x1d\xaa\x84\xc3\xf9\xfb\x95\x1e\xc6\x36\xe1\x42\xf7\x84XW\x13X\x90l\xe3P\xbcL\x84" -"\xc9\xf\xb0\xe7\xc3\x66\xcaoQ\xca\xba\xafo\xf\x96tu:j\x97\x31\xd4\xa4\x93\xfa\xb5" -"\xbfTJ\xc6\xf0\xe9\xfd\x1e=c\xce\x12\xcd\x37Y\x91J\x19\xcf\x9cY\xb=A\xfa\xa2G\xca" -"\xc5\xc3\xb7\\\x64\xbxc.)\x93\x63x\xfa\xd6\x9fS\xc5G{\xbez>\xc0\x1\x94\xcf\x1\xb6" -"\xb4\xd1\x8b\xe7\x13/\x2\x46'\xc5\x93'>\xa9\xac\x13GD\x7\xfa\xf0\xf3#\"r\xd7\xa9" -"\xc1\x31#j\"\x9b\x1e\xc2\xa8/\xc1\xa7\xc2U\xa8\x1'\xb\x11\x39\\\x99\x42]Z>Y\xa6\x97" -">\x88\xbfz\xd7\x43:S\xa9;P\x8c\x99\xf\xd5\xdd\x14\xd8\xab\xfb`\x7\xf5t\xd7\x18\xda" -":\xaf\x86\x30\x19\x91\x86\xea\xb5\xba\xc3\x97Xzm\xa9\xed.\xa6\x63J\xaf\xca\x34vg" -"Q\xbe\x83\xd8\x61\x39\xcb*-\xbd\xbc\xe5~\xff\xc5$\x13\x38\x9e\x88\xf6\xb7\x9e\xba" -"\xb3\xd1\xd4\xf4K+\x9d\xa8\x64u#/\xe\xf8/D\x85Y\x81Wb$\x5\xd2\x44,\xd5\xdah\xf9\x92" -"\xb4t\xa4\x84\x45\xc4nT}\xff\xaf\xa5\xf9\x8c\xdd\xb5~q\xf1\xea\x9b\x96\x31\"\xa1\xab\x39(\xbf" -"pk-\x85\xd5\xb8,\xffn\xbc\xd4\x36Kv\x19\x87\x19\xc2r\x8d\x18S\xd0\x19]^t\xd4\x88" -"\xce\x61\x9f\xc1\xb\xbf\xbd\xcf\x13N\x1d\xed\xa3\x12?V\xf9\x96~C\x95\x84\xbf\xb2" -"t\xc4\xd2)\x9at\xf2\x41\x5\n\rwW\xa4\xbc|gK\x84\xca\x45\xea\x4N\xdf\x64K\xf8\x89" -"\xcb\xc2\xcf\\\x8d\x1e\x82\xb2[y\xez\x8\x0\xde\xe0\x6\x9f\xf4\x4\x18\x1a\x87J\x9c" -"\x8c,n\xb\xbe=\xe5\x13N\xc4\x9e\xa8\xdbn\xc\xc7i9\xe9\x93\x80n\xb1\x8e\x1bM\xa5\x18" -"\xf5\xad\xaf\xbc\x84\xbeHI\xad\x39y\xd2\xf4\xaa\x17\xc6\xd7\x39\xca\xe~\x14.4'\xa9" -"/\x9c\xe0\xcb\x9d\xed{\xd5\xc1\xfe\xff\x38/\xa7J\x8_\xdd+\xe7\x1e\xa8\xe2\xf4\r\x99" -"\x6\xd0{\xd8\xe6\xc8I\xf8\xbf\xb9\x6\xfby\x9e\x1\xab\x83\x39\xf6\x85\x45\x44p\xfc" -"\xb1\x39\x14\xc9\x15\xd8\x13\x63\xaf\x82\x8d\x46\x83\x8bh\xb0i\x0\x6\x9I\xca\xf6" -"k\xf1\x43?FD\x9e\xe4\xb3\x9d%\x9e'\x89\xedt\xcb\xf1\x63\x64\x61;I;t_\x97\x33\x16" -"\x93kKV\x8e\x61V\xb3k\x1cO\xef\x9&Q\x8b\xe0\xf5\xac\x86\x5\xed\x1e,\xb6\xe0v\xd7" -"W$\xa9\x64\x9f\xd0\xa0\xc0\x9f\x19\xe9\x33\x65\xb3H\xc0\x1f\x66\xe4\x92\xc7\xf1\xa0" -"\"_^\x96\x93\x8eh\xfc\x8e\xa3=\xaf\xa8\x9f\x10\xeb\x16\x8\xb3|)\x3\xf6\xff\x36\xf9" -"\xc5)\xef\x32\x94;\xf1\xc3\xcc\x6\xd2\x18.\x9d$H\x82\x89\xe6\xb8k\xae\xfdw\xaa\x61" -"\xca\xe2\xc5\x5t\x87\xbf\xc\xfa\x62\xfc\xe0\x9e\xb8Z\xf8\xb0\x30_\xbe\xb2\xfd\x88" -"\xc6\x9a\xc5\xe1\xbf\xcb\x9d\xe7/\xcdZ:\x4\xf8*\xc8q\xb9K\xac\x8eO1\xb8\xf8\x9f\xdf" -"\x17rU\xb1\xd6\x93T\xf7M\xb6\x98\x44*N\xa1\xd8\xeV\xf5\xbeh!\x93\xe6\xb+_\x1d+\xd5" -"\xc3?\xd1\x84\x9c\xfd\x19\x7\xc7\xc8\xae\x10\x1c\xfc\xd2\xca\x43r\x8c#\x80\xd7\x1c" -"\xdd\x63\xb9\x33\x86UR\xb6\xb9\xf9\x98u\xd5\xa7\x37\xd6\x82\xc7\xe3/R\xa7\x95\xb1" -"\x8e\xfd\nO(\x97\x7\x92\x61\xef\x35\xa1\xea\xb5~=\x94\x96\x1a\x3%\x61\xf5\x86\x84" -"\x90\xa9\xe3\xb9\xc9\xe6\x3\xae\x97Z\xc3j\xb9\x84\xbc*(\x8c\xb6'\x1f\xc8\xce\x7\xd0" -"A\xfc\x95\x8ezn\xebL)\x18.\x83\x9f\xcf\x97\x91\x63\x1b\xcb\x0\x8fm\xb5\x9\xb0n\xd8" -"6ZW\xb5\x30\xc1q\xf0p,\xcd\x8a\x94|\xa7\x90g\x8c\x9\x1f\xe4\x9f\xae\x7\xfc\x45\xae" -"\xe1\x11\xe7Qn\x8a\x8e\x96\x35=\xf8\xbf\x43\x6\xaf\x12\xba\xb7\x32\xad!\x1b\xe8\xac" -"\xa4o\x92p\x1b\x8c\xe9\xb+\xa7L}\xcb\x8dr\x86-\x87\xae\xe5\x39\x1f\x5\xc1\xf5P\x5" -")\xb9\xc5\xf7\xb\x99\\\x61\xd1\x63\x83\xa6\xe7\xc7K?\x6|\xc1\xdf\x9f\x31\xca\x80" -"\xd1N\xd8\x17\x30\x12\xb6\xf4z\x7u\x7'i?\xb\x6\xcc\n\xed\x11\x84$\xe2\xd8\xcb\xfd" -"\x1\x97\xfd\xc7\x95\xeek|:TKA;\xa7J-\xda\x80\x8d\x36ZthCr7gy\xb2\xed\x46\x81]MK7" -"\xe6\xe5\"\x1e\x36up\xcc\xb7\x9eM:\xbb\xa7\n\x32\xf1\x6\x8b)\xb8\x1a\x98\xc\x9fX" -"\xb5\x91\xb3\xd1\xff\xd9\xec\x1a\xbd\x9c;`\x95\x18\xeb\x34\x15\xd1\x11Y\xd5\xdb\xb" -"a\x84&g\xed^\xc1.8\xce?b\\W\xbc/\xc8\xe5\x15!2W\x8bj\xc7&o\xef\x82\x39\x12\xcc\xdd" -"MF\xaa\xa7\xae\x96\x1d\x4\x14\xa7\x9dh\xd0\xf3\xd9\xb0\x65\x11\xce\xc9\x5\xa4\x66" -"T\xf\x38\xe1\x7\xa2\xedp\x93\r\xc4=\x0+\x98i\xcb\xc1wN\xa3\xad\xca}\xc9\xb6\"J\xd9" -"\x9ckR\x98\n\x9bk\xe\xcaY\xfd\xae\x1a\x1_\x14\x2\xe2_\x97\xc7\x85\xf7\x80\xd6\xa3" -"\x98 \xf9\xe9-\xef\xa6\x61\xde\xffrh\x11\x12X\xd1\x37\xe8\xed!\rL\x1a\x4\x34\x6\xd1" -"\x8e\x93\xff\x65\xe3\xa3\xbf\x37\x37u|\x1a\xb0\xf5-\x91\x45\xf1\xa1\x93\xc6\xe5!" -"j\x2\x35\x62T\xb6\\r^<\xfb\x38\x10\xcf\xb2\x0\xc\x93\xc1\x81\xa5;\xc4\xb1i\x1#=Q" -"\xbd!K\x17\x8f\xd3\xb1\xa3/\xe6\xe5\xd0t\x0\x6\x1aJs\xa4\xd8<\xd3\xe5\x9a\x98\xd1" -"\xda\x1eN\xc8\x98k\n\xd3\xf9\x95RRR\xd4\x44\x1a\xf9\xd0\xd4}\x82\xe6RY\xcaX\x7f\x1d" -"q\x8b\xd3\x81X\x99\xf7\xa6\xe4\xd5r\xc9\x96\xf8\xf6&\xdf*\x9c\x9b\xb8\xfb" -"\x1b+\x96\x85W;\xda\x32\x9d\x9dMk\xb7\x2\"\x41O\x1\x2\x61\xd1\x31\xb4\xd2\xa5\xe6" -"\xa0\x5\x98\xc\xc2\x8f\xff\xf0@P\xcc\xf1\x66\x19\xaf\x7\x85\xe9\xc)@\xb7\xfd\xe6" -"\x8c\x18PXV\x1d\x1b\x33\xf8\x9ew?P\xba\xce\xea:e\x1cg\xb0\xc9\r\x0\xbd\xcb\x65\xe3" -"\xbc\x14\xf4_rE\x8b\x0Q\xf\xa6t\xc4\xd3r>\xed\x99\xe3g\xbb\xf3!-\x83\x90\xed\xb5" -"\x8e\xa4\\\xec*\xfb\xb2\xdd\xb5\x9cx/\xbd\xb6\xcb\xd8\x45J\xfc\xaa\x1d\x5\xd9\x1b" -"\xd4\xb3\x95\xc5\xdb\x8\x66\xa7\x4+SH4\x1e\x98\xab\xd6Ps\xfd\x82,\xb2\xe\x36M\xc5" -"R,|\xaa\x10\xd0\xdb\x38Y\x9b~\xab\x8fx\xfa\x87\x8e\xdd\x87I2\xdc\xbfr\xb5\x8f\x17<\x14):\xf9\xd1\\\xb2\x31z\x10<\xa0\xeb\xd0\xbc\xa4\xf7\xaf.\xf9\xed" -"Z\xc3\n\x7\xbb\x85\x93'mR\xa8\xba\xf3\x98\x83\xae&\x13\x61)\x90\xee\x63\x1a\xee)" -"\xa9\xfd\x87\x8dl\x98\xaax\x1f\x9b_gB\xe6\r_\xb0$\xca\xa4\xbf\xee\xd2\xbe\xe\xc6" -"\xd1\x98\x93\x17\x1d)\x96\x1f%O\x7uZC\xbe\x1e\xb3i\x3\xd8\x2\xc\xd2\x63\xd0\xc4\x33" -"c\xa6\x8d@\xfc\xd6\xd9\xb3!\x85\xdb\x9a\xbf\xe1T\xf3W\xba<\x19\x43\xb8t\xcf\xb7\xde" -"q\x7K\xe8\xf1\x46\x99\x93~\xc5\xe6\xf\x61\x99\xf6\xab\xc\xb8\x12\xc7J'\xa3sK\x8\xb2" -"\xabZ.\xc0\x93\x46\x4\xdf\x87\x91H\x6\x45\x4`Z\x4\x81\x63\xf4,\x1b\x86}-\x10\xc9" -"\xd2\xe6\xa3\xe2\x93\x8f\x9a\x1a\xb0P}$ %wBw\x7f\x62\x1f\xad\x9bH\xec\x9c\x1,\xef" -"t;\xe1\x1d\xd7\x3$\xb2\xae&bJ\xf8\x19\xeb\x30\xcf\x39\x95\x32\xedw\x8b\xa9\xea\x1c" -"7A\xed[\x19k^\x13\x37\x86\x15\x1f\xd0kD\xe9\xd4G7\x85\xcau\xaa\x15\xdfy\xcd\x15\xc7" -"G\x9b\xd6\xab\xc6\xd1\xa0\x31\x86<;5\x4o+\xd4Y\xbfw\xa2.\x97\x81\xd0\xe7\xb3(\xdc" -"-\x1e\xfb&\x9\x39\x14Z#\x1\x96\xe8+\xd5\xa4\xa3\x38\x9e\xf\x1e<\x1c\xa2\xa2\xf0S" -"=\xd7\x93G\x8a\x9b\x16w\x90\xd0@G&b\x6\xd5-t\x84\xcf\x42I\xed\xca\xb4\xb9#\xd2\xd9" -"R\x85\x84o\xa9\x8e\xfb\x9b\xbf\x86\xb6 )\x87T\x92\x4\xac\xa0\x41\x13\xed\xb9\xec" -"Q\x1d\"Y\x1U\x8\xad*1)\x1\x42\xc1\x92\xf8-\xd9HL\xda\n\xb2o\xc8\x96j)^i\xa4\xad\xf7" -"n\xd0l\x85\xc5\xb8\x4\xdd\xad\xd8\x11\xdbTA\x90Z\xc8\xb3jP\xa2\xffu\xd5\xe1\x64\xb4" -"Qz\x93\xe9ws\xf7\xa4V\x7\n,Z\xd3K\x7fz6\x16CK$\xb5\x98-e7e1\x3\x44M\xad\xa7t\xc6" -"F4w\x7:\"@\xfc\xcf\xa6\x43K\xe5\xee\xa1\x7f$\xfc/\x80&\x8b\x83]<\x97nd\xc2N\x8b+" -"\xb1\xc6\xf5\x16\xf1\xb]\x85u\x99}k\x8a\xe1\x4\x62\"\x1e\x1a\x87-\xde\xe2\xfa\x9e" -"E\xcb\x87#\xd4\xd6pl\xcc\x5@\x1d\x35\xb2\xf3\x19\xd7\x33\xd3r\x96\xce\xe1\x11\x3" -"\xa3k\xd1,\x18\x1a\x8e\xeb\xc6w\xd6\xc3\xfc\xdf\x0\x35\xee\xa5\xe0\x1dS\xf6\x89?" -"m\xa4J\xf7\xe4?C\xaf\xbd" -"\xc3\xc6\xdar.\xcf}\xb1L\xd4M\xdc*\xfa\x37\xbbT\xc4\xaf\xb0\x86+\xe1\xbd\x9c\xbe" -"\xa9`\\\xb9\xb5v\xf4\xa0|\x96\x37\xd3\xa4\x9a\x16^6\xb8O\x4\xb7\xcc\x18\xfbyc\xe0" -"L\xbbu\xe1\"GNt_\x16p\xec\x9f\xd4\x42\xbd`,\xf8+OW)S\x9fJa\x96\xb0\x9c\xb7\xfeJ\xd1" -"\x14\x7ny\xfd\x9b\xa3t\x85\xb0\x9c\xa6\x9e\xa7\xdf\xafO\x2\x45\xfd,1\x6\xf\x13\xc9" -")\xcf\xad\xeb\x19\x37\x9\x37\rsAd\x91\x6\x82\x3\xcb\x8\x39\xd8\xf8\x84\xc9x\x18\xe4" -",\xbd\xcf\x31\x96\xb9\x88\x33\xdf\xc2\x1cRTQ\xbc\r\xde\xa5nP\xe5\xeb\x87I\x1a\xfc" -"\x80\xb6\x1c\x63\xd1\x63t\x2uY\xa8\xb3\x84?Er\xe9\xd7\xb1T\xd2\x85\x11=\x1a\x12." -"U\xf7\x6\x4t\x85\x6T}W\xb9\xee\xb3\xab\xcb\x38\xc0pD\xc8:2\xa7\x12\x34:\xa5w\xdb" -"\\D\x1h\"N\xc4\x35\x97\xc8'\xd1\xce\x64\x1c\x83\x0\xc5\x94\xfd~\x6?\xaah\x8b\xb2" -"X\xcf\x46wZ#\xf7\x39\xc0\xef\x93h{RJ9h)\xf1\xfd\x1[\\\xa2\x9a~s*\xec\xb4-\x6\x90" -"\xf9\x99\x17\xa1\x90/S\xe4\xa1\x88\x9bT\xdc\xc9\xab\x1d*J$'j,\x9a+\xc1i\xf9*\x89" -"\x6xu\xb3YL\xec\xcfq\xb8\xa4L\xcb\x6\xb7\x4\xfeG\xd4\xa2!u\xf1\xa0\xa3\x8f\x34_~" -"n\xb5}\x5\x9\x8c:\x4,\xcc\xa2\x64?\xd0}\x8fn7'\xdc\x13G \xe0\xbc\x62\xd9\xa2\xb0" -"\xd4\xf3\xf5\x94\xe3\x63,w\xbd\xc7\x92XG3H\x18\xbc\r\x8e\x16\xff\x9d\xa8\x44=\x96" -"\x15\x83!\xa8\xc2\xa0\xdb{\xd3|\xaa\xae\xdbU+\\\xe\xfc\xa9\x44\xa2-BGQ\xe1Q[gPL\xd9" -"]\xd5\xc6\x8fM!\xbf\x43j\x86@\xe8\xed$\xe\x8e\xcf\xcb\x43v\x9d\xb2\x1\xc}\xe7\x95" -"rw\xaf\xc6\x37[\x14\xc1S\xae\xa9\xec\xd1\xf\x30x\xd0*\xa9\x8d\x1e\xaf\x8e\xeb\x63" -"^\xbb\x7\x18\x92\xe9\xc3LF\xbeo+\x1e\x98w\xd7\x15H\xb\xdc\x9\xbar\x7f\x96\xbc\x84" -"\xb3\xe9\xf\xea`]\xc6\xae\xc1:\xf3\x87\xd0\xf2\x10\xb9\xd7\xb1\xb7\xe0\x4\x1e\xf6" -"zU\xedM\x1f\"\x36\x66\xfb\xbb\xab\xe9\x41\xc4\xf2\xc4m\x17\x88\x63\xfa/\x2mgx\\\xb1" -"\xd2\xdf\xf8\xc2\x32\xd1S\x95\xc8]\xc6\x8c\xfa'\xfdT%\x89\x39\xd0\xc3J\x9d\xcc\x46" -"\x16\x15'C\xf4\xcx\xbc\xf0_\x2\xba\xf1G\xbf\x9b\x87!k\xcf\xd6\x44V\x8cP\x18!\xaf" -"\x80WxiL\xd2\xef\x0\xfaL\xcd}/\xb1_\xa3y\xc2\xc3\x42\x65\x62\xcf\x11\xa6\xacq\xb0\xdb\x7f\x99\x8f\xe5@\x81\xc6\x37\xa7" -"\xe8/\xfb\xae\x30\xe8\xc0\xadL\xb0_\xc5\xb9!\x0\xe5_\xae\x9c%%#\xa7\xb2\xa7\x9a\xbe" -"\x9a(\x8e\xcco\xf0\xaf=O\xea\xeaz\x9\x93\xf\xb8\x81\x10<\x83\xcc\xad\xbdr\xa3\x8c" -"tp\x85\x44\x95YX\xc4\xf0\x1f\xf9)\x92\xa2\x93\xcf\xac\xfc<\x87\x65\xc3\x44.\xb8\xca" -"\xb0\xf8r\xdd\xefr\x2\x62\x7f\x33(\xd1V\x1e\xef\x39o6\xaf\x15\x0\x0.tcH\xd9\xdb\"" -"D\"\n\x9?'\xad'l~\xbe\x9b\xce\xe6~hg\xe3\x9c\xe\x1aV\xb6\xcc\x81\x88\xc0\x8f}\xae" -"\xaa\x39\xa2\\`\x1e\xaf\x81\xef\x65\x81\xc6\xa8Vu|_\x8eJ\xe8\xa2\xf2;\xd0n\xcb\x1" -"8\x3\xafy\xa9\xde;_\xb0\x3\xce\xfd\xb1*\xb9Y\xe9\xc9\x46Q\xe2\xcf\x14\xac+\xe8\x86" -"\xd9\xd9\x2'P\xe3\x85G`Iv\xb4*D&\xf4\x1e\xb3\x8e\xf3\xa1\xdd#\xaa\x94\xd4l\x9a\xed" -"\x97y#\xfc\xa3\xe9\x84\x19\x98-r\x90\x7\x1\xb8\xfb\xf9\x9c\x2SI\xa8h\xc4\xff\xc4" -"XE\xd6\x46k\xf4$#/\xf2\x98\xcaP\x1f\xffS\xca\x2\xfe,\x91$l\"6\xb4\xf2\xf\xb4\xbf\xbc\x61\x88v$\xdc#x\xd8M" -"\x1f\xc5\xd3ys\xe2\xfc\x84L\x87\xc5\x8b\xe5Y\xd0`\xb6\xf0M\xcd<\xd7\x11\x95\xf1i" -";\xb5\xcd\xc9_?\x1a\xb8k\x8c\x18\x65\x61\x92Y/\xd0\x45\xbb\xfd \xb7\xaa\xd6\x91\x39" -"\xe1\xad\xa0\x37\xa5u\x3.Z\xd0\x19Rz\x95\\X@\xe7\xcf H\xc6P\x90\x1\xf9\xe7\xa0\x14" -"\x90!4\xaf\xf7V\xff&Eu\x94\xc6o.\xb9\xe4\x1e\xb0\x18,g\xee\x5\xb6\xca\x1u\xb6\xa9" -"7\xdc\x86\x43o\xa1$Nc\xd6\xa6(\xbc\xd9\xd5\xc2\x83>-\xf6\xdd\xea\x7\xa6\xf0m^&,P" -"\xef\xd3LN\xf0[A\xb1HF\x94\x92\x15\x12\xf7\xde\x93\x33\x7f\xc1\xb7v#\x6\x1e\x16\xd0" -"G/7\x80\xdc\x9a\xf3\xf8\x39H\x82\x1e@\xd1`\x8f\xb9\xfd\xd5\x38\xf6X\x83\xd5q~\xe6" -"'\x8fG6\xa0\xc0\xc6\x62`E\x82w\xf2\xb2\x85S_\x8d\x8cg\xe5\xdfR+\xc9|\xb4\x89\xf8" -";<\xad\x0Y\x96,H$$\x6P\xe1\x9\xeb\xf1\xc4P6\xdb\x87\x86pM/t\x93\x80\xedo\xd8\xd2" -"\xff\xe9\xd9w]\xddX}\xdc\x8c\xf2\x1c\xb7\xa1\x19\x9z\xc2\x66+\x9b\xf8\xb3\xffr\x1c" -"\x8a+\xfc\x37\x9aH\xa2\xca\xb1\xe0\xa4\xc7\x90\x85M\xd8\x6\xff\x8c\xf8'\xfe,\xcf" -"\x4\xfd\xb3\x9b\x9e\xb3W\xa0l\xd6~%\xf3\x1N\xae\x9d\x7\xce\xed\x88\x85Re\x19s\xba" -"\xe2\x7-\x95\x1e\xd1\x1a\x1c\xc5\xdc=\x10\x17P\x1cI1\xe1\xbdr\xfe?\xf9=\xb5\xf7\xa9H\x6\xd7\x63" -"\x97\x8a)0\xa6\xe3\xcd*\xce_\xea\x4V)X\x3\x39\x95-\xf7!Y\xd8k\xee\x84\x9b\xe3\xd5" -"\x96\x43*\xe\x31\xed~\x8a\xb6\x36\x44\x84'H\x9d\x1\xe4\x46w\x1a\x33t\xfdNQ\x90\x62" -"\xc2\xcf\xb2|\xdb\xb2\x43\x9\xf\xb7\xf\x94\x2\\\xaa\xdb\x4\x8e\x62\xa3l\x87\x9f\xe0" -"\xb5-\xf\x1b;a~\x6\x11\r\xe5\x10\x61\xcc\xce\x9f\xfb\xe3{d\x95r;\xc9<8\x80\x8d\xc" -"\x1d\xa6\xcbQo\x82\xcf#\xc2\xa9\x1a\xab\x97\xcb\xa9t\x18\x10=\x84~C\xc5\x4ZS|6u\x4" -"\xce\x1a\xc6\x13\x8f\xea\xe1\x9a\x61Y\x89\xe3\xae+t%]\x9d\xec\xeeo\x9e\x9f\xcd\x65" -"\x13\x9b\x82\xfe\xc3\xc3\x62\x87\x44\xe\xf3\x94K\xbbN\r$T\x9b\xce\xdc\xe5\xb0\x88" -"C\xf\xae\xdf\x97\x6\x35w\x1e\xffrmL\xfd*\x9b\x64\xe5k\xb1s\xb\x9e;\x3\x98\xaf\xd9" -"\r\xd9\xc1\xea([\xc3\xee\xf9\x18`-\xd6\x66\xf3??\xd1X\x16\xe0\xe9\xdb\xe6q1\x16\xc8" -"\xb9xL\xfb\xb3\x9f+;\xbd\x8e\x9e:?\x84\xce\xee\xc3\x97\xf6\"tT\xb^ \x8ch\x91\xef" -"*~=\xebSVa\xeb\xdf\x9az\x98\xf3]k\x99\xf2=(\xaa\x38y\xca[\x9aN\nP\xa5\x97M-\xe\x14" -"/\xf0\xe\xe3Y\xea\x64\x16\xd9\x1c\xec\x8a\xb2\xcaR\x3\x1e\xb3)\x82\xce\x16X.|jkL" -"\xb7\xb4)\xadW\xaf\x9d\xcf\x94\xe3;o\x1a'\xcb\r\x7\xe0\x63Mi\x9el\xa7\xf4\xeath\x9b" -".\x13\xc3\xdf\x41\x91\x62wd\x8cN\x88\xdc\xf0\x8f(8\xac\x8$B4\xe4\xc6\xb0\xeaVP|=" -"\x9d\x43\x9z\xed\xbf\xcdj\x3\xd5\xe0\xb9P\xa2\r\xe5M\x18\xf8\xe1\xb3P\xe1<\xaf\xe3" -"2:\xf\x86\xa7/X{\xa9\xa1\x1aMLWe\xc4\xad\x10\xbc\xb4\xc3\x8b\x97\x1b\xfb\xf3+\x6" -"\x1ex\xc5Lq\x8b+7\xf7@*hw\x86\x86\xe7\xca\xc\xcd\x80[\xad%\x42\xd0\xed\x94\xdb\xee" -"\x1a\xa6N\xf9zwCio\x82\x35\xc\x12\x62\"\xf2\x17\xc1\xfaZ\xe0S\xa9+\x95\xb4\x80<\x1c" -"@\x15\xbeu+Y\x1d_T:\xb9\xc3\x88\xb5!\xa3\x1Q\xe\xc7\xfa\xd6\x46\xec\x17\xd0\xce\x83" -"\xd9.\xae\xea\xc8<\xf8\x8f\x45i\xf1\x86\xb+\x90}\n\x6\x31\xe3\x85\xf2\x93\x97\xaa" -"\x88\n\x14l\xc5\x16\xac\xd8\x9\xe5\x8f_\xe6\xfe\x89\xf2K\"F\x95\xde\x81\xfd_\xe3" -"\xa2\xcc\x64\xb\xf2\xb2\xfa\xaeP\xe9\x8\xa4\x36 }\xa9\x16\x92\x18\xd7\xe\xf8\x7f" -"\xd2\xb9S\x9\x82\x32N7\x7\x9ekD\xa5\x6\x41\xd5\xb3\xdf\x5\x8\xc4\xd3]\x87\x9dt\x89" -"\x10\x61J\xfeK\x81\xf\xbe\xf8\x17\xdc\xe1\xba\x41\xe5\x10\xf1\xb1\xc1\x14Q\xcc\xee" -"\xee\x8dh}~#\xeb\xd2\x42\x7f\x97\xf5\x84\xa2\x10\x9d\xc1%\x1f\xa8\xed\xfc\xf1\x37" -"3\x9d\xe3Q\x8f\xda\xe4\x9dqglwk&\xa6\xd8<\x99\xf7,F\x96\xde:WIL\xab\xa0\x63#4\xbb" -"T7\xf7Vq\x91)\xdc\xd5\x8d\x17`\xc7\x11\xa4\xf\xe7\xfeP|\x9a\xdf*Ze\x9c\x91\x8e\x13" -"\xaa\\\x1dtT\xf7|\x98\xd7\xf4\x8a\xed\x17\xdb\xeb\xac\x45G\xce\xd6-\xb\x18\x4\"{" -"\x1f\x17\xe9n\x13\xcdY(\x8f\xb2\xf3\x17\"\x0\xdf?\x14\xed{\xa8Z\xa0\x30\"\xa8\x61" -"\x1b\xb4\xac\xb\xc7\x9b\x34\xb4\x89\x30h\xe0w\x16\xd1\x63Zx\xa3\xf5\xe5\x83\xc6\xe8" -"Y\xb2\xa6\x46Y\xb8\x39xi\x9b\x88\x1f\xfa\x93\xf5?\xf5Y\rp\xb\xe8]g`Q`w\x83\x30\xef" -"\x14\xcf\x15\x89\x93\x90\x32\xad\xcd\xb7\xc3\x93" -"\x10\x96\xd4\x16\xe0\xb7\x8\x85\xb7\x80m\xfa\xd1\x30~!\x8b'\xdd\xfc\n\x8c\x32\x10" -"Z\xaa[b\xef\x81\\l\xa4\xdeN\xfb\x93l~\xcf*\xe7q\xf_\x10\xbe\xf2\x7\x38\x61\\Y{\x8" -"\xde\xc7&h\xfc\xf2m\xbb\x9a\xcdVY\x18\xf9\xed\"#\x1a\x80\x38s\x8d{UV\r\xb1\xd2\x61" -"#jd\xcd\xe;`\xcf\xb4\x15x\xdb\xa1\xaa$\x1c\xe7JT\xde\xcf\x38\xb5\xf6\x87\x45H\xe8" -"\"\xd4\xeO4\xeal\x8ci-\x18\xe4\xd1\x92.H\xad\x34\xab\xa0Hy\xfcH\xeb;\n\x80\x8c\x88" -"O\xe\x7\x38\x66\xab\xab\xbf\xc2[3L\xfa\xf4\xef\x43\xf7\xc7\xdc\xce\xc4\xd9\x87NF" -"0\x19Z\xa6_N\xcf\xca\xf1\xc3![67EV5\x94\x1byD&\x0\x36\xdd:cj\x1c\xbf\xa0\x2\xd9\x8f" -"\x15\xb8\x85\x12\x46\xce\x0*\xebx\xb1&/\x7f\xf6J\xa7\xbc\xb>\xeb\xc2\xd4\x63\xa4" -"a\x9e=r\x91%\xde\xbf\xc)t S\xcf\x94\xfep|7rD\xae\xchp\xceq\xfd\x95\xc0\xec\xa7;\xd1" -"9\x19\xbaq\x9c\x14\xd8\x8a^\x8a+\xca\xce\x8c\x96\x17\x16\xaev\x16:'e\xc3^iw3,\xcc" -"ik\x1c\x30%\x96\x37\x17o\xfb\xcb\xe1\xc6\xcb.\xef\x93\x31\x99Z\xf7\x2\x80\xcc\xe0" -"\x18W\xb0\xd9 x@\xd6\xdd\xf\x83<`\xd7\xd0\xdd\xb6\x9d\x1#`\x11\xfL\x96\xe6\xdd\\" -"\xbew\xce\xd6\x38\x83Q4\x16\xdd\xdf\xb9y\xac%\xf3zNM\x1d\x90\x11\xdf\xee\xaa'\xad" -"\x91\xc4L(\xf1\xd5\xf6\x98`cd\xfd\xf8\x19;\n\x4\xb3g\xd8\xa2\xc\x9f\xe8Z\x83]F\xa6" -"\x9d\x1cM\x10%\x2\xa4]\xa8\xbb\x96\xda\x9d\xb5\x38i\xd4=\xad\x46G\xe6\x31&\xf2\xc8" -"8\xc7\x5p\x97Y\xae\xbe\xa3?\xbf\xee\x44\xf7\xa1\x98-\xa6\xc8\x1f\xc7\xc1\xe5\x33" -"\x1e^\xa9w\x1a\x61\xe4\xe2\xd0\x13\x42\xa3\x8f\xe6\x80\x32\xb7,4\xed;Vj\x9bkS\x8b" -"O\\\xb6\xda\x9f\xa3v\x18L\xfb]\xa5\x42\xed#\x5\xdc\xed/\xcb!\xb0\x34Z\x1f\x33\xf1" -"/\xe8\x4\x90\x11\xadL_\"\x98nR\xa8\xb3\xac\x44\x65\x0w\xb6h\xfb\xce\xce\x86\xd8\x8e" -"\x8c\xcew\x1c\x1d\xc7#T\x15\x35!\xf5,\x9cg\x8d\xd8=\x9f\xa4\xf6\x9a\x1dW\xec\x1b" -"\xc\x91\xf2\xf\x30\xa6\xa1t\xbe\xb4@h\xbd\xd7\xe\xba)\x19\xe9\xae\x6\x19\xb1\xde" -"{<\xc9\"\x80\xf5\xa7K\xd6\x43\xa5\x61\xdc~\xac\xb2\x9\x1d\x12*\xbb\x1e\x38\x95qk" -"\x18\xd1\x46\x97Y\x93\xe6\x8d\xa3\xe1\xec\x61#n\xcb\xbbm\x9a\x1b[\xf\xe3~\xea\xbc" -"a)\x88\xbcg\xe9\xf2\xd3\xbc\x8d%!\x11\xe8Y\xafU.\xb2\x4\x7\xbc\xfb[\xdc\xe3\xdf\xec" -"\x19\x64\xc5\xa9\xe7m\xf6\x33\xa5\x8c\x0\x89\xcd\xbc\xf9\x7fi\x17\x37\x16I>\x1cU" -"\xbb\xa4\x8eZ#\xcb\xa3\xc5:\xdc\xc0\xaa\x9\xe\x95P\xc7\x1\x35Q\xca\xd0\xa2q\x6\x45" -"\x9e'\xb3\x12U\xa1U\xf\x8a\xccK\xe0L\xdf\xc0\xc8/\x17X\xd1xj\xd3\x9a\xe1\xe3\xdb" -"\xed\xb9z\xceG\xc4\x1e\xea|\xd0\x1e\xff\xc8\xdf\x9c-R\x13\xc9z\x16\xdc\x6\xa9\xc1" -"\xac\x42\xb7[\xfcv~bvu|\x4K\xc7\x31\xd3*\xf7\xcbj\xf3]*\xa9\x11n+U\x82\xd7\xb3%<" -"M\x8\x38+\xd6\xd9\xdb@\xbe\xa9\xbdW\xfa\xd3\xc4\xbe\xe0-\x87\xd6\xbe\xe0.\x18\xbd" -"\x1d\x8c\xc2,qM\x8c\xbewn\x96\x12P\x9a\xe4oQ\x16\x4,\x8e\x64\xd6q\x9e\x86Jt\x87z" -"\xb5#\x80\xef\x17}\xed\x7f\x12\xff\x89\x1a\xacp\xcd\x89\xde\x42\x45\x83\x16~u\xb3" -"Y\x80\xca\r\xff\xaf\x62\xd9\xdf\x33S\xf6O\x9>\xeb\x86\xedH6v{\xa4\x8d\x8f\xbf_\x1b" -"\xfa\xf8\x43\x13\xa8\x9e\xc4\xa4\x62,\x1a\x1a\xf1\xc6\x42\x9e{\x9b\xb5\xb2\x64\x39" -"\x9d\x90\x1f\x1d\xf3(\x88\"\xee\xa3\xe7\x19-\xaa\ro\x9e\x1e\x9f\xe\x9f\x9d{\x9a." -"Mc\x10\xd4\x38\xd7Ka{H\x15Yw\xc0\x95\x92\x32\x19\x8d\x1fI%,\xa5M\xd5\xbf\xe8\xb0" -"\x1ck=\xbe\x65\xb7\xa6\xa0\xdc\xb6\xecN\xf9}x\x80\xd9\x3>\x8a{^\xe7\xac\xad\x96\x8f" -"\xb4\xfdnB\xd8,F\xfU!\xc9q\x98%\x19\xa3\xa6(\xd3\x2i{A\xd5HL\xe8\x36\"\xf8\xb\xbf" -"nD&\xcbp\xaa\xe0\xc1\x64\xb5\xc3\x9\xa8\xfc\xa6\xee\xca\n\x80\x9f\x8e\xf0\x9d\xac" -"\xcc\xc6t\x82\x1c\x90\xa6\x17YV\xc5Nb6+\x85i\x85vI\xc0\xd8\x1c\xc3\x86R\xeai\xd8" -"\x8a\x34\xc\x83\x65\xafNL\x89\x5]\xc1Tv\x9f\xde\xb9\x63=3\xf6\xf4\xc1\x97iu\xadz" -"\xc9\x4\xe7~\r@\xb7\xde\xd2\xec\xb0\x95Y!\xf6\xdd\xe7\x99\xab\x85\x16u'1Q\xb\xac" -"\xe6\xc6\xc0\x43\xc4|\xeb\x61\xe\x17\xc9i X=\xc5\x93\x39W\xfa\x1b\x35\xca_\xf\xd0" -"\xe8P\xb1P\x83U\xbc\xfd\xfc@U\xb\xd5j\x99G\xdc\x94\x6\xde\x86\xd9\x4\xd2\x92!\xff" -"\x9$\xdb\x8d$\xa2\xb1\x98\x65K\xc\xb8\xb5\xea\xdd\x62\x93\xab\xb2\xba&2\xa5&\xca" -"8\xba\xf2\xc8\xe9\xd2\x97{\x1fs\xb2!?G\xb1Z\xb4_\xff\x99\x44\x7fTH\x9-\xec\xcb\x9e" -"\xc7\xe3P0\xf1\xe1\xe9\x80\x9c\xe9\xbe\xf6\x43L\\\xb5\x82\x39\xd1\xe4\xe4\x4\xcc" -"\xaa\x91\xfe\xa4\xef\xbe\x8bq.\xa4\x46\xc4\xad\x12\xc3\x14gE\x8d\xf6\xb6\xf6\x9d" -"\xa1\x31\x8c\xbe\x12M\x0\xb4\xaf\x87q\xaf\x41\\\xca\x1p\xe0\x14\xfe\x8f\x31\xa5\xe" -"\xef\xcav\x17\xb8\xce\xb9\xaaM\x9\x9a\n\xa9\xe7\xfe\xc2\x1bN\x9e\xfe#\xfd\x65\x34" -"Z?\xe6\x1b[\xa1\x36\x9d\x32\x4\xd6n\xb0\xfe\x9a< \x1b/\x1b\xfcTc\nE\xd2\xbe\xe2\x93" -"\xf0\xc4z\xdd\x11\x37I*\xba\xcb\x90\xa8sv\xe5\xbbIq\x9dJ\x2~@g\xbf\x30\\\r\x44\x3" -"\xe1;\x82\xe6\xb0\x93\xd5\x8c\x17\x84m\xe1\xd6p[t\x4\x8e]\xa2j\xc7\xd0\xab\xd2\xf7" -"\x99\x9e\x8b\xe6\xf2\x94\xb3\xf2o\x9e}Q\x2\xee\x96\xe1\x61\xb7\xc6\xcd\xa4\xb8\xd5" -"v\x9\x85\x1b\x62.\xae^\xc4\x81\xd8\xe9\xef\x87\xb2T[\xc1\xde\x8d\xae\xa2\x19\x2\xbe" -"\xd7\x14\xb4\x7f;Qu\xcL\xc5\x13\x80\x36\x90\xb0\x9o\xdd\x1c\x1d\xfe\xbd\xd9;\xec" -"\x88\xd1\x11\x8e\x30\xce\xa0\xf5\xb5\x8{\x19\x62X\xe2\xbd+*!\xbaI\x8aH\xbeY=9\xde" -"v\xb1i\xfb\x7\xffj}\xda\x84gR\xfe\x31]:\xf8\xdd\x34/k\xd1\xf4\xda\x62\x93\xa5\x81" -"\xf0\xc5\x90\xd7\xfb\x9eQ\xe0\xef\xd1K\x89\x1\xd5q:Y\x92\x9b.\xda\xff\xf6\xf3\x3" -"\x13\xc1\xb0q\xeH\xe1\xef;>\xbf\xda\x65\x38\xee\xa2[\xb7\xc0\xd5\x2\xf5.p>\xb6\xf3" -"\xf2w#\r47o5\xb7u\xd2\x17\x97\x94\x31\r\x61tWc\xfc\xef\xb5\x93\xe2\xde\xad\xc7J{" -" AJ\xf2-=\xc0\x43#\xf9\xba\xe2x@L^\xdeO\xd5\xccG\xcd\rV\xa1T\xf2\xf5\xd7\xbc\x62" -"$A1\xcc\x94h\xaeN)\xe7\\[\xfa\xeb\x19\xb\xd6\xe1\xeb\x8b\xbe\xec\x39\xdcmOL\xa3U" -"\xec \xfa\xd5\xf8\x1a\x91\"\x16\xad\xe6\x8a\x98@\xa6\xac\x9!\xb5(\xfcI\xab\x61\x9f" -"f\xf0\xee\x35\xfd|\xffJ\xe7\xbf\xbb\x34\xea\xbaOq\xad\xb1\xd8\xa2S\xbd\xac-\xa7*" -"^t\xe2W\x12\xe4\x36\xf2\\K\xc7\x32\x1f\xcf!#\xc4\x63\x7f\x46'\xd5\xeaw8\x0\xfcP\xe4" -"\x6\xfd\xa3\x93\x5\x33\xff\xbf\xa7\xd3\x87\xae\xa9\xe5\xc0$\xdb\x8e\x32\x9f@v ,\xee" -"\x11\xd0\x1c\x37+?\xd5\xf% \x8b\x39\xf8\x19#\x8e\x80\xa5h\xf5\x92\xe6\xbdwb" -"\xa8k:\x9cP5\xac\x1m\xacx\xf\x33\xae]kJ\x4(\xd7\xf3\xa6v\xb7@\x9\xd1\xe4\xd6\">/" -"\xc3*\x97/\x92\xb7\x61\x1e\x13\xeR\xa1\x38\x36\xc4s\x8bjR\xff\xeSnH\xfd\xf9\xde\x9e" -"U\xeb\x84\x7\xc7\xf. i\x9d\xf9\xc5\x8a\xd6\x1c\x36Q\xe2\xae\xe0\xcb\x61\x80\xd5\xd4" -"\xe2\xc2\xaa\xeb\x9f\xa0\xf1v\xcd\x4#\x8\x96\x84~\xed\xd1\nsLR\xfe\xc0X\x9dr|\xa2" -"\xbdn\xda\x12\xf\x1e\xab\x3!\xd2\x44\x82\x41]\x94\x8c\xff`$\x11\x1a\x1f\xe6\x10\\" -"#\x90\xb5\xb2\xfa\x66\xcc\xf1\xff\x2I\x99\x1f_W\x93\x9d]\x5\xe5@\x12M\x19/\xe4\xf" -"\x94\xb0\xab\x86\xb0\n\xa7\x12\xcf\xa5\x84\x7f\x44\x81\x93\xa3\x7(\n\x1d\xf1\xb0" -"\x93w\xc3(\xc6R\xe7\x32l@\r\xce\x97\xd3\x38Jj\xef\x32*\x8a\x94\x87\x97S\x11!\xdd" -"E\x9d\x8c\xdb\xc5\xa5\xcc\x97\xbd\xda\xeb\xf5\xdb\xc3\x46\xb\x9aJg\xf7\x8a\x8fX\xc2" -"\xe3VV\xcc\x9f\x8d\xbc\x66\xbeW\x94Z]\xf1?R2\x9du\xb4\xf6\xdf'\x16\xd1\x65v\xa4\x8c" -"\xa6kQ\xc\xe6\x35\x37\x64\x87\x8\xb\x18\x95o\xe7\xc8 \xd6\xcf\x43\xbe\xa6\x44\x87" -"\x1b\x11\xbe\x44\x46\xad\x45nE[\x3,\xc4 \xcf@\xfb\x9dP\xeb\x18:\x9eO\x15s+ \xf3\xb3" -"\xc6nn\x80\xcc\xae\xab\x95\x8b\x6\xd9wM\x94K\x8f\x7\xe7\x4\xb8Q_\xa0\xc6uF\x6\xac" -"Hq\xc4\x1c\xd9\xe7\xef\xffM\xb\x91\x17\xd0j\xef~\xcd@\xadk>\xdc\x43\x39%\xcb\r\xa9" -"\x9$]\xe5\xfc\x93\x88\xb2\x42\xcf\x9b[\x93\xcc\xf2\x1d\x96\xa2\xf0\xd5\xb2\x32\x39" -"jE\xc9l\x85\xcf\xdd\n\x1dL\xfe\x92\xcb\xd2H\xe4\x1c\xcfO\xa9s\x13\x43r\x97\n\xa9" -"\x93X,\x7f&\xe1\xcc\x99\xc4\x30\xef\xf1I\xae>f\xaem\xe4\x84\x84\xda\xab\xa8\x36\xf4" -"a\x83\xa6q!Q\x93\xfe#\xf8h\xc5\x9+\xe0\x89t]\x94\x7\x8G\xf7l+\x8d\xa3L\x1b\x10\xb6" -"\x1e\xb3\xb9\x0\x91\xda\x43\x81\x9e\x9f\x8c\xc8\xf0\xdc\xfd\x44\x9c\x9a\x1c\xfd\x46" -"?n\xbb\x9c}\xeb\x86\x2\x37<8\x15\xa6j\xci\xef\xf5\x18\x98NO+\xfe\xe0\xe9\x2t\x81" -"o\x1fx\xdd\x93Ml\x1e\xf6\\\xa1\xb0\x39\xa3\x84\xec\x95\x84pc\xfb\x99+\x97\xae\xe0" -"Q\x17\x89\xd1\x88\\i\x3\xfa\xef\xadxj.|O-wk\xc0k]\xb6\x4\xc7\xbd\x1d<\xfc/}S\x96" -"\xffPgs(\xb0\x86\xf5\xfa\"\x41\xd0\x9a\x41~T\xd6\x11mQ\x11-\xcc\x34\x35\x9a[\xd0" -"\x8\x1d\"Hh\x7f\xbdV\xa8\x89\xca\xffR6\x17\xc7\x18\xed\x82\x8e\xf9\xde\xb5\x61Lm" -"q\x8eL\x87I2\xf0\xf0\xbd\xc0)\xec\xfa\xc5\xe1\xca\x37\xcf\xd6\xc8\x82 %U\x95\x9e" -"[\xaa\xe6\xf3\x17 \xb6\xacR\x82\x93\x97\x8a\x1a\x14w\x5\xf\xda\x8c\xcf\x8b\xc2\xf3" -"\xb2@h\x14\x35u\xa3\xfc\x9e\x80\x10O\xce\xe0]?\xcb\xbc\xc1]\xdf\xe9\x1e\xa7\xf\xaf" -"\xb3\x12\x98\x61\x43r\x9b\xda\xdb\x42\xd2\xaa\x12\x39\x44\x10\x1cg\x0 zpNR\x6\x19" -"\xa8\xcb\x31\x31@\xd5~ \x82\xe1\x4\x37\x33\xd6\x9e\xfc@\xb7qV9\x2\n\xe2\x8e\xcc\x0" -"W\xaa\x35>\x91\x12\xbf\xfc{\x12!dZ\xec \xd3\xb3\xcf\x63\x7}\x9e\x9d\xa9\x63.\xb\x1c" -"+\x80\x1c\xf@k%3=0b\xcd\xf0?\xc6\xa4\xc2\xfe\x8c\x87\xd6\xad\xf8\xcu[\xb8\xf0\x0" -"9\xfe\x1c\xf8\xfb\xce\x11\x9cY\xe8W\xf1=\x1\x89\x1e:\xfa\xc3#9;p\r\xb3\x36ZY']\x11" -"\x8c\xcf\x9b\xc2\xaa\xfdp[u\x9+0H\x80i\x1f\xf5\x88\xf3\xf2\xc2\xdb\xc6<\x89\x93\xd1" -"\xae\x86T\x12\xce\xb8\xfd\x0\xc8-:\xa6\xd2\xb\x12\xe6\xf6M\x16\x42\x6\xb3\\\x10\xf8" -"\x81\xaeH\xc2\x33!\x5>\xb9$[\x1c\x38\xdb\x9a\xa7K\xc7\x19\x86\x90\xf4\x32\xde\x85" -"\xd9\x0ze\xf\x8c\x42\x43\xe0N\x9t\xc5\xc\xf4T.N4\xafS\xc2\x38\xc0\xb0=\xe\xc2\xc9" -"\x1c\xaf\xa1\x8a\xf5nz\xf7\x97\xd8\x61\x18_\xdfK\x90\x9a\xaaK\x85\xf6\xc0\x8f\"\xb0" -"\x1c\x7\x42\x85U\xcc~Y\xf7\xb1\xd4\x90\x9f\x15\x4\xe\xc1}\xb2\x63\x31\xeb\x66\xcd" -"\xe8\xb0\xa8\x39\x18\r\x13\x84\xd5\xfd*\xe1\xb8\xed?\x84\xe8n\xa7\xe1<}V\xb7p+\x4" -"\xcfu\xeb\x63\xc6/W%\x86\x6s%\xac\xef\xdf\x87\x30\xc4\x0\xa1&'$\xf5\x9b\x94\xb5m" -"\xe9\x9e\x9aQu\xa1\x1c\xf9\x32/\x86\xa2\xf3\x11\x87\x90\xf9\x88l\x1d\x94\xcb\x61" -",b\x9e{\xb8\x1e\xb8\xfd^+\xd9\x46\xe9\x9c\xf(A\x8b,)\x8d\xabh\x10\x99\xb9<\xb7\xc3" -"\xcf\x98\x34\x96\x91\xcf\xe0\x1el@\xb1}@\xdd\x96\x6z\xe7\x15\xb1\x10\r\xfm\xc\xa6" -"~\xdf\xa6\x43\x34\xe3\xed\xa2#\xb4\xfb{\x82\xb0\xfe\x6\xee\xc2\x30\xceL\x82+A\xf1" -"\x88\xe0\xcfs\x82\x83\xce,bjJnY\xf2\xabMUY\xad\x87\xcfM\x8f\x35O\x9fo@\x8c\xae\x1e" -"\xdd\x9d<\xf8\x90\x2's\xed$~\x7\x9f\xbe\x9f E\x1fg\xce\x9c\xda\xa2\xb3\xec\x9c\xd8" -"\xc\x46[\xd3O\x8f\xdd\x30kf\xb9\x35^\xc5\x61\xe8\x9f\xf4SI\xf0\x30\x9e\xa8\xa5\xf0" -"\xa7\xae\x83\xcb|\x89H\xf8#\xc3$cSyc\r\xfe\x8b\xd9\"\x17\xc2\xd9\xab\xdf\xcd\x14" -"\xce\xb8\xe5+';{\x0\xd0h\xb@\xef\x2\x12\xa3\xeb\xfb\xe8\x82\xac\xa2_\xb6\xf6g$\x1c" -"\x1fG75&;\r\x1b\xfb\xeaY\xd9QA[\xc2\x39\x9c\x41\xdfL\xf9\x97\xb9\xd2\xfc\x10Q\xe5" -"\x92\xd4#\xb7K\x14w\xe7m8`\x17\xce\xdf\xdc\x9c\xcb\xd3\xf3\xa9'6\x82\xb[\xbc\xa6" -"\xe8\x63\xfeM\xfb\xc5\x85g\xd8\xb3\x62ON\xeb\xc5|F\xdc\x13|j\xbb\xb5\xf9\xc_\xb3" -"\x17\xfa\x34\xaf\x30\xeaj\xc3\x5\xd9\x82\x7f\xf1\xc1\x10\xd7\x61\xebR\x10<;3d6_-" -"~\xc4'\xe6\xc5o\xeb!\xee\xd5\xc4\xc9\x14\x99\x46\xd1\xc1\x42;\xc\xb3\xe5\xe9\xa6" -"\xc1;;i\xd5\x1f\xd1\xa4\xdc\xd5\x85\x32V0\x8cl\xc6\x34\x9em\x9\x19\x9b\xa1\x8e$\xb9" -"\xdd\x87\x7f'\x9f\xf3\xc9\x33'2\xe\xb7L\xe8\xbe\xde\x97\xa1\xc1\x84\xe1\x4\x10\xf6" -"aM\x90\xe7+\xa4\x35\x1a\xe9W\x3T\xcay\x9c\xc2\xf1\x45\x97\x19\xb2\xd3[uy\xa8\x95" -"\xa9\x5\xd0z\x2\xbb\xde\xb7\x65\x9dq\n\xd6\xb8\xe2\x8e\x8b\x5\xdc\xc7\x13&\xcbM;" -"\xb6\x94\xa3\xda\x64\xa4\xa4\xba\xb3_\xa3\xedW\xbe\x14\xcb\xf3\x4\xb1\xb0-zkA\x1e" -"u!'\x6\x1c\xc3\x0\xf5\x8e\x2\xf3\x33\xcag\x17 fJn\xb6\x62~\xd3\xad\x6z\x8c\xe5\xbd" -"{oI\x12O\x8fj\xcdiUv\xc\xbd\x96\x93\xe1\x0\xb0\xe0\x91MW\xde\x84\x32<+\x6\xb1\x89" -"\xcb|\xb8\xd7n\xe3\xa3<\x94\xa3\xb9\xdbm\xd7\xe8#SN\xb6\xb8jq*Q\x98\xd8\xad\x45\xa2" -"\xa1\xe4\xe4\x62\xbeMB\x93\xcd\x8e\xc<8\xcf[\xce\x19 \x9\xe\x44\xbeH\xf%|Q\x1c\x80" -"\xfb\x39\xa9\x9e\xecL~A\xd2\xc0\x30\xde\xad(\xef\xd5\x18)h\xc1\x38\xc8YWt\x89\\\x8f" -"\xc4\x9\x44\xe8\xd8\r[\xd9\x6=\xf8\x8e`\xec\xe3\xa7+\x3\x12\x16j\xe8\x90\xc5\xd1" -"ul\x9c\x1b\x64\xe6\xaf\xac\xaf\x9b\xe9\x9at\x4z\xbcu\xb0GW&\xac\r\xb9.\xca\xa2\xce" -"\x81\x18Z\xf8\x6\x7f\xclS\xf6\x89\xa9Y\x17\x9e\x3\xeb\xa0\xeagI\xedMU\xaf \xb7\xe2" -"\x1c(j\xb0\xf7\x8e\x66\xe\x84\x85\xaf]\xd4\x84\xb2\xf7\xaa\x32)\xfco1\x8d:\xce\xa4" -"?kk\xa2\"\xc1\x96_W\xf4\x9Th\xd5\x33W\\\xcb\xb8\xe2\x42\x42\xc5\x9f\x32(\x8f#k\x7f" -"\xbd\xcb\xa4m>\xe\x41\xfd\xca\xca\x62\x82\xe1\x80O\xdb\x4\xdbk}$f\xe7\xfc\x38\xd9" -"J\xc8\x3L\x1d\xd9\xc8\xdfg\x9a\xe5\xba\xa5i&-U7\xfd\x96Y\xc4=\x2\x0X&s\xca\xe\x9a" -"hozX\xd7'\xbb\xec\xca\x32(\r\xb5'\xf\xd9\x17\xc7\xe9/\xe7\x92\x84\xf2Z~\\\xda!\xe7" -"\xd7\x85\x85\xc2VN\x4\xa5\x14\xd5\xd8\xdb\xbe\xea\x1d\x3\x82\x63\x9csj\x12\xf1|\xe9" -"8\xf0\n\xaa\x35\xe1\xe2\"\xfa\xa4\xd2(\x7f#\x16\x7\xc7\xdc\xd9\xa9\n\xbc\xe9j\x9d" -"\x9c\xe9\xcd\xb\x0QB9\x9d]4\x13O\xcX\xbcj6\x90\xeb\x86\x88\x0\x7f\xd7\xe8NC\x91\xfb" -"\xb9 \xa3\xb0\x82\x39]\xe5\xeb\x16\xefx\xd4_B\xf\x37\xb8\x82)\xa7V\x19\x1d\xf8\xc0" -"\xbdW\xf4\xf7q3m\x98\\\x9e\xcf=\xe9\xb6\xf4?\xa6\x1e\x90\xa2\xb7\xdey(\xdekzx4\x7" -"YGO\x85\x32\xd3k2\x9a\x39M\x92X\xfe^N\xed\x1b\x87\xf8\xa4?\xe5?\x10\r\xe3)\xf2\xb" -"\x91@\x8c\x9a^n)a\x85\xd6q\x5(\xb8\x33\xe4\x11\xff\xb5L1\x9c\x14\xf7\x8\x3\x98\xe1" -"\x88\xb9\xfdxA\xb7J\xca\x86\x1a\xaa\xbd\xe1\x8aZ\xf8\x13\xfb\xed\xebJ~\xe2\xaa\x17" -"C\xb2\xdb\xcf\xdc&\"\\r\x3\"\x7f\xc7s\xb1G )IVk\xa7\xc8\x1fZ\xd3-\xfe<\xe7\x83\xd1" -"p\x8c{\x9b\x8c\x9b\x43s\x4,|\x8f\xd0\xde\x2\xf9\xcf\x42\xf2\x38\xe4\xb5\x1a\x91~" -"Kc\xd8\xc3\x1a\xc6\xe1\x8f\xdc\xe\xa1$\x9f\x31u\xe6Yd\x9a\xa0\xf2\xd3\x7\xdf\x86" -"\xfd\xa4-\x80\xa3\xbd\x46\x97\xda[\x1b\x5\xd3\x46\xb3\xfa\xee\xd2\xc8\xd2\x1f\xc7" -"\xaaG\xba>*\xed\xde\x0U\x9c\x94\x86H\xe9\xd1\xb7\xbb\x16\xe6\x1b\xa8{N\x8\xca\xe5" -"\x9e\x83\x91y\x0\xef\x41\x80\xe4\xd7\x33\xd0\xe0\x1cT\xea\xaf\xdf\xb5QO3\x84\x8a" -"\xeb\xd0\x97 \xf6\xf7GlC\xf\xe\xda\xf6\xc6-\x83\x14\x9b\x3\xb5\x13.$\x1crs\xa2\xf3" -"\"3\xc2\x12\xc6\xfa\xe8\x97>\xc9\x8f\x87\xb7\xe3)\xa9\xebg6\xad\x5\xe6\xe3\x5\xf7" -"\xd3\x84\x13U\xbf\xf6\x9f\xbd\xf2\xcd\xfc\x41\xc9\x42\xbc)z\xbd?7\xba\xcbS\x10\x9d" -"c\x89G\xd2\x8d\xb9ws\xb6\xfd\r\x1b\xd3\xb1\x12\x46\xa3\x8a!\xdb\x4@n\xf\x95\x87t" -"[\x9a+\xe9\xeb\xcc\xf1\x5JP\\\xab'\x5\x88 \x90\xd5\x38/o\x99\x64\x8f;\x1\x9e\x62" -"G\x14\xb5\xfb\xb1\xf9\xe0\xc8\xd1]G\xe5\x85L\xab\x9\x35\xcd\x1a\xf2\x13\xb2\x8\xb6" -"\xac%\x11z!Lj\x91\xf6@\x1a&\xed\xb3\xd7<\x93u\x11\xeex_DK\x8f\xfe\xce\xeb\x8b\x8a" -"\x3W\xb3\x9\xdf\xc0\xe9\xbc\x18\x63\x14\xce|\xfb\x9b\xef&9\xa2\xd3\xc2\x12\xd7\xd6" -"fh\x6\xd7\xaf\x8b\xa5\x2#\xe3\xe0\xb2Q\xbc\x96\xca\xddHx\xa2\x9dU\xd1\x41\xb7\x65" -"x\xed\x37Z\xa5\x17Z\xba\xe6u\xd9o\x3\xc4\xde\x61\xcc\xb1\x98\xce\xe3z\xc4\xd1\xf9" -"\xdep\xd5;\rI1=\xce\xef\x64\xa9\xb5-n|t\xe7Zo(\xf8/\xa2Y\x2\xae\xb4\x9f\x81\xb8N" -"M09R\xc3\xab}\xbdX7\xee\xca!\x1f\x1b\x82\x34y\xe7k\xe3t\x13\x8c\xe6\xce\xe4K\xa9" -"\x94\x1c\xca\x39\xdd\xa6\xd6\xc9\xb4\x1\x9a[=\xaf\xe5\x45\x46I\x1e\x12\xd9\xd4\x39" -"\xd4U\xad!\xfd\xd5\x4\xa3\xe5?u;\xb3_>\xcd\n+<\xeaO\xa6\xcO\x8ct\xfb^U\xb1\x7\xb7" -"\x19\xdb~\"\xcc\x0\x7f\x7\xc6\x86;W\xdc\xdb\xca\xa2qjrx\xda\xe\x93?yx\xeP\x86\x98" -".\xb0'V\xdbG%\xb\x89\x7f\x43o\xd2\x7\xe9\x88\x88&(\xec\x7f)\xe6r\x17<\xe7\xbe\x7" -"/k\n\xe5\x9d\xe0\xdd\x1b\x8\xd0\x84\xac\xad\x1a\xb7w\xb8{\xf3\x0\x83\x1\x95[\xa7" -"\x19\x18\xd6\xdcg\xd6\xe8\r\xd1\x38\xa0v\xe7\xc5\x32J\x1d\x1b\x2\xa7s!\xbb\xb3 \xe7" -"\xd4|xQ\x83\xc5\xe1\xee\xb1\x9cl\x9c\x92\x46\xf8\xdf\xfa\x1a\x9P\r\x9bX\xaf\x8d\x1b" -"\xa8\x91\xd9\xdd\x3ux\x8f\x39Iu\xc9(\x6\xf8\xb4\xf4\xb2\xc2\xb0\xb1]\xf8\xcb\xb2" -"\x14\xcc\r\x7f\xb1}\x8c?.\xf5\x37\xed\xe0\xc8\xed^\x84 )RF\x18\xc5\x6\xaa!\xc1\xbb" -"\x97\xea\xb0\x19\xe8\xfa\xde\x46\x88\x81S\xa0s-\xc8\xc3\\\xb0\x86qC \x94\x1b\xa5" -"\xab\x1c\x82\xc6_\x8c\xa7\xc0\xe4\xf0\x41U-\xff\xb3\xcf\x61\xdb\xfb\xa6\xbc\x7\xdc" -"m\xff\x4!\xbb\xb0\x2\xa4\x32\xc1\x66{e\xe\\\x96\xf7|mj\x88\xcb\x11\xb2\x0\xc8\x99" -"7\x8!5(\xaa\x7\x8d\xc8\xaa\xb0\x1\x46\xf3U\xd5%\xed\xc4\x38q\xb7nw\xb5\xbe;\xeb\xa7" -"dgm\xbf\xfd\xc6\x1\xd6\xfa![\xe5\x33\xd6\xfe\x91\x8a\x6\xd0\xc6\xbf/\xdb\xd2\x8f" -"\x8a\xb4\xe5\xc5>?\x83\x8dgc\x94\x61\x66\xb3\nn\xac\xb9|\xf3\xebl\x9fL*\x1d\x9^#" -"\xaa(\xe0{DM\x7\x90x\xa2';\x8d\xf6\xb3\xa4z\x13[\x8a\xbc\x81\x37\xda\xba\x91:^W\x80" -"\x90\xe4\xc2\x63&gU\xb0|\x1e\x96\xc4X\x87\xf1\xab\x88\x34\x82\xa8\x92\xac\\^~\xb6" -"\x12\xaf\x8dq\xdd\xb6\xa2V#\x4\x89y\xc5\xf8\xd1\xd5\xfa\x97\xe1K\xc3\x8f\x85\x33" -"J\xa7|\x91\x34]I\x1d\xf9gd\xbb\x14\xf2g\x1a\\!\x19\"/\x83\x88\xa6\xdb\xa2gR\xf4!" -"\xae\xeb\xfb\xd6\xc4s\x14\x9bo!Y\x9d\x16\xa2G\xed\x41\xaei\x5s\x11_8T\xf8\xab\xde" -"\xbaU\"70\xe3" -"m\x9c\xd4\x12\xca@\x9e*}\xbbx\xbf\xd8\\W$\xc\x30\r\x86\x10\x90\x13!\xba\xfe+\x0P" -"\x8d%\xe2\x12\x39Iy\xfd\x4\xcc\x1a\xf1\x64\x7+\x92\x8f\xa2\x43\x81\x63\xeL\x93\x42" -"k\x16-\xed\xfdj\xc8^\x9b\x9\xa0w{\xef\xab$\xfd\x95\x19T\xf0\x1a\xc8\n\x44\x85\xa4" -"}M\xe6=U\x93\xa9\xa8\x37X\x9\xc5\xb8\xd9#\xb1@\x13\xf5UO\xcb\xbdN.8\xac\xc7\xa1\xb3" -"\xd7\x9dT}v\xfe\xde\xef\xb1\x0t\xd3\x30\xf4\xfd.\x9f\xec#\xd1\xae\xc2\xdd\xcc\xc2" -"M\xec\xd4\x95IO\xc1\xf8\xc\xcf\x8d\xbd\xdft\xf5\x0'\x99i\x1a\x91\xac\xb2ok%hI\x13" -"\xc4.\x1f\xee\xa2\x9d\xb8\x33\x1c\x61<\xbf\x9e\x9dJ\x13\x1_F{D\xdb(\xa9\x41\xf8\xda" -"\xf0\xc8\xd1,C\xe8\xc6\xf9\x66]~i\xfe\xd9r\x9\xd5\xa6v\xde\x3\x46!`\xee\x42\xa3\xbe" -"\x1a!Ag\xb0\xb1\x9a\x8f\xa3j\x9a\x8c\xb4;\r\xe9\xdeom\x83pkaz\x8aZ(\xce\x8d\xfe\xae" -"\xcf(/\xf4#@\xae\x16\"\xbel\x99\xfb+\x82\x18\x80Z\xfd\x7f\xf\x37\x83x\xe7y\xc8Ju" -"\xbf\xe9SpWh\xc8(:\xc9\xc7\x62\xf8\x43\x92\xee\xb6\xd5{\x99X\x82n\x10\xa3\xe3}q\x10" -"B\x2\xfb?g}\xc4\\\xf9\xc7\x9\x1eLN6hJ\xc7\x85\x4\x98I\xedY\xaa@\x13r\x9\x7\xe8\xd6" -"L\x99\xe9\xcaN\xb8\xcd\xd1\xda\rm\xf0@r?\x1e\xe7uI~\xe0U\x9c\x1\x12>\x97S\xfa@W\xee" -"X|\xc6\xba\xbf\xf8\x81\xcf;\r\xd4\xbb\xff@\xa3\xb8\n\xc\x46\xa1V\x8\xb9\x13\xf6\xe1" -"\xeb\xa3\xe9\xde\xe6\xfb\x65\x62\x41\xb8G\xffP_\xe9\x1e\x14\x33\xa5jK\xb3\x1c\xb3" -"h\x98\xf6\xa4\xff\x43\x0\x1c\xd3\x8a\xcaW\x81\xae%L\xef\x32\xa4q\xeb\x15!0SY\x1a" -"(\x12\x84\xc0\x96\xdaK\x8f\xa1_\xec\xf1U\xaf\x9f/\xbfKks`\x84\x13\xb8\x36\x93\xca" -"\n\xbc\x15t\xd7\xa9\xbdY\x8f\x36\xf3{\x19\x94\x43\xc8\x62\x46o\x86\x32\xfe\x99\x86" -"\xbe\xeb\x83\xf6\x46\xadt\x85\x8a\x90\xd2\xc8XN\xf7\xa7\xe8}\x10\xed\x9O\x0\xc5\x82" -"\xe7\xd0\x91\x8at\xf0\x9e\xac\x9\x31I\xf8,\xc7\xa2\xde\xe0\xbc|\xfb\x62\xc7KP\x95" -"\x14]\xb2g\xd3\xaa\x1f^q\x8c\xc5\xa1\xf0\xad\xb6\x8c|i\xb2\xe0\x30\xd0\xe8\xd1\x5" -"\xa1i\xac\x9\x97\x0K\x1at\x92\xf6,\x1c\xcdV\xb5\xcb\xd9h\x90y%\xe4+\x7\xcf\xab\x65" -"\x16\xbf\xf1'\x1e\xf8\xefWc1\xe[\x1c\xdb\x15\xe8\xd0\xc0\xf7\xd8\x41g0\xaf\xe4,\x93" -"\xe5\x1f\xd6\x99\x89\x61\xc%\x14H%\xfa\x36\xbc\x37\x34\x62\xd1\x85\x86\xecM\x87/" -"\x82\x8fY(\xed\n)\x19(\xee\xf5\x9ap@\xcb\x91\xaa~\xecVn\x9c\x41r\xd0\xe1\xdf}4.\x81" -"\xa4\x16\xba\xef\"\xa1\x97Tt\xa1\x11\x7f\xb2\x97\x66\"\xd1\xb8\xcc\xb1\xbe\x17\xa8" -"\xdf.\x1d\x81+@\xb7[\xc2l\xe8\xbb\xcbm)\"\x92\"mX\x10/jvL\x4\xd0\xda\xcf\xa9\xa9" -"\xfc\x98\x89\x92\xb9\x8e\xdb\x14\xa4\xda\x1ai\xf1V\\\x7fPS\x8d\x39\xef\x62\xa8\xa0" -"\xf0\xc1\xa3\x14}\xe4\xde\xb6\x44\xa1" -"_\x2[\xde\xc3\x83Mi\xfd\xc5\xb7 OW\xf3\xc9\xae\xa8\xf7#\xc2\x45\xbf\x18\xde\xbc}" -"\xe1\x33T\xb8j\xfd*\xeb>|\x7f\x8d\x42\xc0t\xe8\x86\x0\x35\xb6\xc0\xcc\xd7\xbc\xc8" -"\xab\x93=(\xf7\xbb\xba\xf7\xfzw\xd7(\xf6\x10\x8c\x10\x45\x44]\xab\x80j\x81" -"\x1b\x9b\xb9\x38\xb3q*\xb6[>\xa6\xb1qF\x97\xd3\xb9m\xcbg\xc2,\x89yV8\xb9\xd3\xee" -"\xb5\xaf\xab\xe6\x9f\xf4\xb9\xb2uSUf\x8a\xe3\x2)0B\xfb\xc1\x92\xb7\xd4\x9f\\\xe5" -"*r\xa9\x62\x89J\xba+\xbb\xb9\xb5g\xea\xd4[\xac.$\xc6\x96\xb\xf7\xee\xb4\x85\x11z" -"\x8a\xee\xc1\x90\x9f\xdc\x33\x88\xf5\xaf\x85\x46[g\xd8\x34\xa0/\x96\xe1S\xef[\xed" -"\xe8Z\xec\x13}\xafvi\xab\xf\x35\x14\xb4\xac\xea|\xcb\xb3\xf9\xda\xdb\x8d\x10\xb9" -"\xa8\x7\xe5\xa6\xce\xd7\x95]\xae)d\x9a:\x8cw\xf\xcc\xd4\xca\xb2\x1\xe9(\x97W@k\xb2" -"E\x15\x9c\xf3\xa3\x35\x37\x83[{|7\x1f\x38m8\x1c\x39\xd6\x8b;\xb\xa0\xc4W\x95\x33" -"}\x8a\x45j\xf5\x2\x84\xe7\x9d\x10\x86a\xe4\x64@R\xf6\x66\xb6R\xb7<\x8e\x3\xdf\x6" -"\xc3\x9e\xcai\xf9\x87\xfd(7A\xe7\x10#\x81po\xcT\xe3\xa6p\xb9\xc2\xb0\xce\x8d\x90" -"\x16\xa8\xc0\x9e\x64\x33\x84u\xe8\xe1l\x81\xb8Y\xc7\x90\xa2\xc7\x1co='E\x97\xfb\x36" -"eM\xb8\x4%u\x15\xd5z\xf8'_\x19\x8\xb0\x45;\x7\x17iT\xef-\xeK\x7f\x9a\x45\xb7\x30" -"\x8b\x94\x18_\xebg\xa8\x8e\xa9\x9e\x66\xbe\xd9\x42\xcLs\xeb\xe3\xa3\x9a\xe8\x4I\xe2" -"\x12\xdf/\xf\x90\xf7\xe1?\xf8\x92\x8cJ\xa2\xf\xc2&:z\x8e\x91W!\x9fz\xd0\x10\xd0Z" -"\x89m\x1d~\x82\x93\r\x1f\xde\x19\x7f\x80\xff-*~\xe4\xf7\xae\x8\xd8\xa2\\\xd8\x5\x62" -"\xf6\x14\x83{\x8bg\x16_\x8b>x'fj\x8d\xe5U\x9c\x81\x9f\x0IF`\xed!J\xc4\x8c\xb8\x93" -"X\x91\xe4\x19\xec\x17\x9\x9dm\x0\x8a}q\xd6k\n\x19<\xc8\x92\xfe*V\x80\xe3\x81\x80" -"M\xad\x90\x45\xb9\xc0\xda'%\x17Y\x8e\xeaU\xb2TG\x92q\xb9\xf1=\xd0\xa8\x6\x9e\xf9" -"e\xa8\xff\xa6\xccKw\xea\xd9\xfc\xfa\xc2\xa6[\xeu\xa7t\xab\xa9\x85\\\xd6\xfb\x9f\xaf" -"F`\xa2\xc8\x1a\xe7\x9d\xf8\xcaQ\xe9\xdb\xe2\x96I\x8fS\x89\xb0\xd9\xe4\\\xed\xb6\x1" -"^\xe3L\x9e\xc0\x9f\xf5\xdc%\x8e!Dt\xc7\xec\xe7\x33O\x3s\x3\x13\xd1\x18g\xbbO\xa4" -"\xf8\xaa\xc2\x35\xbc\x86\x36\x88\xb4>\xfc*\xde\x7f\x8e\x98\xf0\x8\x95\xfcK3\x84$" -"mcr9F\x8cQ\x8bKu*\xd3(\x18\xac\x17\xe1\x9b\x96\xc1\xba\x0\xb9\x16\xf7\xdc\x99\x81" -"a\xc5*\x14\xd6\x9aj\xd2\xe4\xe7\x46\x19\x96@\xfe\xb1\xb3\x33s\x8f\xa0\x66\n\xa2\x44" -"\xe4\xc4s\x8c\x11\xfd\x38\x64\x9aqw\x5\xa6\xc5\x66\xca\xed\xdb\x35\xe6\xb9\x41\x14" -"\xeez\xb7\x36\x10\x13\xf1\xab.*H`\xb7`\xfe\xea^\xfa\xe6\x39\xc3\xce\xa7\xd8\x83\xf7" -"!\xc5-jc\x1c(R\x82\xb\x80| \xea\xb7\xe6\xd6\xcb\x99q\xed\xc7\xb9\x85\x33Q\xb3VvH" -"H\x9c\xad\xfd\xdd\xec~\xcc\x63[\x9c@\xc0\xd2#\xff\x10\xfe\xe\"\\\x88\x19\xa6\xd9" -"\xec{\xfa\x1b\x11\x2\xbf\xb2\xb7_\x9bQ\x17\xbdm~\x8l\xa7~6k+\xd6yF\xca\xcb\xe9P\x88" -"\xb0\x19\xc8!\x87\x93\xc\xc9\xff+C\xef\x65\xe2\x90\x44/\xfa\x30Z\xec\x95\xfr\x1f" -"\xb0\x34\xe8\x12 \xed\xd7\xf1\x7\x1dTm\xaf\x91\xa7\x18N\x10\xf5\xfa\x8\xa9\x34\xa2" -"=\xa0\xbf\x6\x64j\xacN\xb2\xf8\xa9\xf5\xfc\xa3\x9b\xed\xd4\x31\x18\x44\x86\xcc\x8c" -"R\xa6>\xe0\xe4\\\xeaj(\xce\xec\xd5Q\xd5iT\x1f\x2\xed\xb4{\xec\x18\x33\xd9-\xd7t\xe1" -"\x1d\xba\xf9\x0\xee\x17*d\x1\xcU\xe1" -"HC\xea\x66\x2\x90\x10\xcb\x9d\x64\x43\x8\x34\x86\x80\xc3\x8w\x9\xff\xf6L\xa5\\\x84" -"n\xb3\xea\x15\xd6\xa0\xd4\xe3\xfc\xc\xf8\x81\x14\xdf*^\xa6\xee\xbb\xa0\x36\x1fYA" -"X\x99\xaa\xef~S\xaf\xd5\xce\x30\xc2\xbe\x93\xf2\xdc\xf2\x35V\xa6\x9d\xea\xf2\x9f" -"\xb0\xd2\x97O N5'\x7f%[\xf2\x0\xed\xb1\xdd\xe1V\xef*oO~=\xf9\"\xb9\x46k\xed\xca\x9a" -"5y*!\x1a\xb1!\xf7\xb7\xf5\xc\x9c\x1f\x5m*\xff\x16Z\x11(=\x9c`\xd8\xb3\x8f\x9a\x61" -"\x8b\xf4M\xc8@\xec\xb8\x17I\xbf\xcc\xb9\xa7\x83vG\xa5\xb7\xb6\xecJ\xd8\x30\x80X#" -"\xb7\xa7\x83xb\xc2\xd8\x86P\xa3\xd3\x8b\xf9\xc1.77o>\x4@`\xf2\xd0\x95\xe1\xf2\x1b" -"\x94\x92\xef\x80r\xe\xe2X\xdc\xd1ibA\xda\x35_,\x91\xa8RPy\xb9}\x0v\rK\xb2\x34\xf9" -"^Qu Q\x82Tl\x12\xa5\xf6ke\xb3\xfd\x95\xdf\x30u\x88\xd0\xa5\x0\x8\x61,a\xa4\xad^)" -"Jo=\x98\xeb\xbd\x8b*\x4/\xab\xffH\xa7\x5\x9e\x97\xfc~z\xab \xf1\xfa\x9f\x9c\x7fr" -"Jw\xdf\x7f\xc5>RQ<\xf1\xd9\xdc\x95\xca{\xc2X\xf1P\xa7\xf0\x94\xe7\xdb\x91\xe9\x91" -"\x8\x45\x2\xf1q^\xb5\xb7\x85\xd2\xabhc\xaa\x89\x97\x2+\xf8\x16RO\x0\x81\x6\x16\x80" -"\xc2=\x83\x7\x9au\xbc\xc6\xad\x9b\xacW\x8f&\xea\x9aK\xd4N\x9f\xcd\xd0\xff\x82\n\x42" -"D\xb\xf2\xf2)i\x80MZ\x88\xd3\x8c\xc#\xd1\x45\x38]\x89\x63\x83\xb4\x95\x6\xfaW\xb5" -"\xea\xa5\x80\x64\xae#\xe5g\xfck<\xfdv\x97>\xc0'\xdf\x12Hv\x85s\xeb\xbe\xd1\x8t\x0" -"\xcd_LY\x10#3\xc6\x7f\x1a\xde\xbg\xe0\x30\xbb\xd2\x10\x36\x37\x9\x96\xae\xa3\x0\xba" -"\xb9\xe$\xd1\x96\x65\x8av:\x8e\xc4(\xce\xe0\xb9G\xd2\xe5\x6\x9a\xd4\xfc\xa2\xc0u" -"99\xcd\xe6\xe*\x96)0\xd3\xd0\xc3\xaa\xbcu\xac\x1c\x62\xc0]\xc0Y\"M\x9eU\x97{\xdc" -"\x88\x12\xf6v\x7f\x32?\xcc\xc0\x18\xfe\xcdv\x1d!\r,~P\x84\xc5\xd8\x7f\xaal\xd3\xc2" -"\x7fQ\xc4\x3\x39\xbb\xd7\x17\xba\x38\xd5:\xa0\x32\x17\x14)\x9b\xbe\x1e;\x9f\x14\xf8" -"fg\x7}\x17_\xeds\xef\xfa\xfd&\x17\x66\xe7\x85\xe1n\x87\x84\xf0\x99\xddQp\x3\xed\xef" -"b\xaa\x43\x91\x1e\xeb\xe1Q<\x86Jb*R\xc6\x44\x8\xf4\xdc\x33\x5\x1c\xd5^PP\x8f\xa2" -"\xcfV\x8d=f1\xa7r\xd0\x11\xe1\x1T\xc7=yp\x11\xb5\xe8'!\r\x1b\x31\xb4W\xc7\x1d\xa7" -"d\xdb\x62=\x1e\n\xf4\x37\xb8@Yv\xf6\x44\xd6<#\xdd\xda\x83\xfaM\x14\xd6\xe1\x83\x92" -"Y\x7f\xe5\xa1\x45\xdc\xd8\x12\xfd\xad\x35\xbdoq\xcf\x11\x92\x1a\x0\x1fh\xb0\x43w" -"\xe9\xda\xd8\xe9\xbe\xc3\xdf\x1b\x92\xc2\xf1\xe7\xef\xd1\xac\xea%\xc2\xac\xb9!\x99" -"\xd9\xb1 \x91Q\x83\x63h\xd1\xa2!Zr\xeb\xc\xd9\x8bl\xaa\xc0(pciX\xfc\x8a\xae|\xac" -"\x3\xa9\x12Z;\x90\xce\x13\x1d\xa8\xa2$=\x9d\xcbg\xd3\xbb\x43\xdf\x16\x92\x1d\xc8" -"\xb2\x0S\xd6\x45!\x1a\xe8.\xfdx Q\xc6)\xa8\x85\"\x19T$\xa8\xba\\\xb4N(`\xe5\xf6@" -"\xcb\xf3\x1d\xc7.@xS\xd1\x11g\xd4]\xf6?dB\xa1\xd0\xa4\xf6\x89\xddn\xa7\xd1\xde\x97" -"\x8d\x8\xf8\\W\xdev\\\xd6\xb2\xf3@0/\x1a]\xa2Z\x1a\xe5\x43\x1d\x1d\x8d\xc3\x1f\x9c" -"\x82m\xd1\xb4\xd5\xa1\xd9\xff\x2;\xb1R\x1e\x39\xd8\xd2\xdb\xc8m$Vo*\xb\xa6\xeb\xa6" -"<\x99\x1f\xfd>\x82\xa6l\xf9\xe0\xe8\xc4\x33\xc6\xf/\xbf\xf8i\xb0\x84\xb\xe2\x10\x13" -"3\xc0\xe3\x43\xbb\x16\x44\x99\x61\x83;\xa2\x92=\xe\x2\xaa\xe2X\x10\xe4k\"\xcf\x80" -"yui\xaa\xf4#\xc3\xe3\xa9\xfe\x18R\xeej\xc2\x44\xcbh\xf6\x94U\x96o\x8bX\xaf~J\xc4" -"s\xd6SX\xf2\xe0<\xe\x3\xde\x15\xb8\xc0\x36\xf6R\xa6\xab\xb\xc2\x98\x30\x4\x18\xfd" -".(\xe2\xf3n\xe8\xc8\xf6\xec\x31\x1c\x10\x1p\x80\xe0\x7f`\xc4\xc9O[\x1bT\xcd\x17" -"\xe2N4M\xdf\xf7/\xbb\x88\x8e\x9d\xed\\]I*\x84\x38\xef\xc0\xa0\x1\x1\x37\xd4\x6z&" -"\xc2\x33\xa3]\xc\x5\x30`x\x92\x12\xed\x92\\U\xe4\xb0\xdf\xe\xce\xca`\x91\xc0/\xdc" -"\x0ij\x85\xa9\x30H\xc1\r\xac\xd7\xf2T\x85\xc0w\x9b\x19>a\xfd\x8fyM\xa2\x99\x45_," -"\xc4\xe4\x87\x42\xc1n]\xe6\xff\xdb\xd8\xd7\x9\x9Y0\x15\r\n\xb4h+\xb5\xa4_\x98\xa8" -"\xffp\x9f\x41=\xf1\x30\xcdMS\xb4\x7f\x91\x35\x8\xff\xa7\xa3\xfc~\xf9\x1c\xc3WN\xb5" -"\xc9\xa4\x83\x64\xf4\x81\xcf\xb4\x9b\xfb\xcc\xf9\x42\xbfq\xa5\x8dZ\xd9,\xae\x65\xbf" -"\xfeW<\xd6\x66\x9e&i\xd2\x10\x36\x8d\xaa\xff\xf5\x66j\xd0\xb6\xf7\x10\x5\x30\x9a" -"\xfc\xc0\x32\xf5\x96-Ip\x13\xb1\x84\x9b\x1dO5\xb\xc2\x37\x61\xfe\x83\xcc\x85\xc9" -"\x5R%\x8d\x5\x93\xed|\x9e*\xb4\xb0\x83\xe0\xa4\x4\xa0\xe1\xfe\x35\xbe\xc0\x97M\"" -"\xddy\xae\xdbS{\x13j\xc4\xd3\x7f\x8d\x98.\xc0\x1d^\xaah\xcc\x88\x9d\xcbrY^\x19\x35" -"\x97\xe1\x1e{\x9\xfcP\x19\x81\xcJ\x10\xfd\x95\xb8\xe1~\x83i\xf9\x31\x1\x84\x10-\x16" -"M^\xae\xaf\xa8\"\xad\x0\x44\x30@2vV\xb0\xd2\xdcjM$\x85\x98\x97\x1c\xc4u\x11oQ\x87" -"\x9c\xb1\x93z[#\x6\x5:\xb7l\xb\x64\xc9\x7\xaf\xb3\xdc]\x91:\xdd\xb1\xbc\x34\x90\x98" -"\x6\x80\x39\x91\xe1y\x1d\xf0\x9bJ\x17\xae\xff\xdb\x9\x41\x66\x2\xbb\xc3\xa8wQy\xa4" -"\xa7\x7\xb\x9a|\xcb\xf1\xdf\xaf\x95$K\xc}\xbe\xe1\x1f*\x90>\xbc\x38 \xf6\x8e\x89" -"Dl\xfd?\xa8\xefs\xa5\x35\xc7\xb9\x82Q\xe4\xb7\xbe\xfa\x10_j\x85\xf7N\xc\x19G\xcc" -"\x89G\xec\x41K\x9f(\x17p\x10\xb2\xf5\xcd\xf7\x33\x7\xba\x15\xd5 \x1\xc5\x65\xf2T" -"\xf4\x88/0\xb3W>a=]\xe4\xcf\x8fH;\xcfy\x95u\xb\x80\xdd\xcf\x81\x97\xe6\x90\x82\xb8" -"q\xcb\xee\xb\x9f/\x97\x35l\xf3\xfc\xe8\x39:\x9\x18\x3\x99\x80\xe6\x1\xe6Y\xd5\xf3" -"\xa3\x43\xca\xe0_\xea\xc3Q\x80\xb7\xa7\x33\"\x8b\x4\xfe*\xfa\xb5\xe9\xf0=\xcf\n\x61" -">\xdc\x10\x81\xf7;\x9b\xfaN\xe4\xf8\xa6\x3\xf4\x16\xb6\x9e\xaf\x9f\x46\x18z\x82\xf2" -"\xc5\xd2\x18Z\x0-1daP\xaa\x9b\xf8\x86\x63\x18\xb9~\xfd\xeJ\xdd\x1d\x97\x44\x0\xa8" -"\xc2\xd1\xf9\xd7_e\x9\x5X\xcd\xd4\xb5\x37\x35:\x98o\xe3\xbeZw\xe5zyd\x86\x32\xc0" -"+H.6P\xd9 o\xb5L\x11\xed[\x5\xd8\"\xd2'\x0\xba_\xfcY\xf7i\xd0g1\xc1\x1\x1d\x1f\xbe" -"g\x93\xb0{~\x1ex\x9f\xe7\xc3[X\x85\x8a\xf0\x9c\xb6\xc5\x84;\x87I\x15X7O.:~\x87*\xe8\x1e\x16\x8a\x7v<\x9a\xb9\xce\x66\xfa" -"\xbfQTEr\x99\x41mt\xed\xd6*\x7fw\x19\x7f\xd3\xcp\xea\x80\x9e\xb3\xb7\x97\xb2\\\xf8" -"\xf3\xe3z\x15\xc7G\x99\x7\xf2\xda\xe8\xd9%\x98^\xb7\xcd\xb7\xa7\x8e\xd3\xee\xee\xaa" -"\xf2\x1d\x9a\xaeu\x90|9p\x12\xd6\x13\xf7]G\xbe\xeeP]M\xa0\x87 yj>\x9\xf5\xd2\x7\x8\xd3\x91" -"p\xce~S<\xfa\xa7\xf8Hn\x4\xf3\x92\x16~\xa0\xa0\x93\xfe\x99\xb8)|+\x13\x98\xc6!]K" -"P\x92S8\xbaYW\x8c\x99\x1\x65^\x92.\x18\xb4\xef\xc4\xb4&\xdb(\xc5\x7\x33<\xe4\xf6" -"\x9\xc3\xb8\x89\xfgv\xcd\x86\x86\xb9T\xf0<\x8\xe1\xff\x99h\x0\xef\xe\x8f:m\x96\x9b" -"(3\xff\x15oH\x1d\xbe\x41_\xb3\x45\xb6?\xfc\xec\xd8l\x86\xbc\xb3\xa4\xdf\x3\x5\xd3" -"\x17\x64OI\xff\x1fUg\xb^\xfb\xde\x62\xc0\xd3\xf\xc3\xa9\x8e\x12\x1f\x9dYM\xba\x13" -"z\xb4\xd6\xfe\xafz\xc8\xee\n\xdf\xb2\xb7 n\xf2\x86\xd4\xd7\x9tareC\xff \xd3\xad\xca" -"F\"\x17\x99\xd9\xca\xceh\x8fJZ\xe\xc2`\x3\x1a\x34\x11N\xad\xa8\x7f\x99\xcf\x41L\xa8" -"\x84\x6\xe7X\xb4v\x0\x83\x9a\xeb\xe4\x41-\xdf\xef\x9f\xf0\x1b\xb0\xa1\xb8\xc2M)<" -"n(?\xaa\xa1>)\x1b\x8b\"\xcb(\xc7\xcK\xbc\x38J\x85\x36\xbe>\xe2\x8\xf5\x16\x17\x65" -"{\x85M\x7\x8\x96\xa2\xa6\x86l\xcZ\xf6\xee\"l\x9c\xb\xcd]\x85\xbbn\xc3\xa1\xa3\x0" -"\xb\x32\xe0\xea\xe0\xb5o\xa3V(\xb6\xd4\xb6\x84\x90\xb6\xc7\x18k4\xfa\xad\xa4\x82" -"rS=\xe4\x5\xa7\x33\xad\xac\xd4\x90\xc5\xea\xad\xc7\x32\x90\xa2WB\x8c\\z\xe1n\x19" -"\xf8\x15[U\x10\x9f\xb0\xa0\xe9p\xe8\xf1i\x91 .^\x18\x42\xfc\xae\xddq\x1d\xca\x36" -"\x1e\xbf=\x14I\xc0\xdc\x1d\xf0\xc2\xa8\xc0\xca[\x2i\xae\x31O\xb0\xb4\x2\xc2\x91\xa2" -"\x18\xb2)I;5\xf6\x19:\xe2]\xbb\x66Y'\xf9{\x19(RMfn\xc3>\x7f\x3K\xa8\xbf\xac\xdap" -"P\xd2=\x94T\xda\xd8Z\xd7\x11\xb1j\xc\xc1L/5\x1b\xed\xae\x8e\x94s?\xe7\xeb$\x1e\"" -"BO>k\xd8\x83\x8b\x95hp\\a\xde\xc5\xde\x37H\xd9\x18\xe8\x82\x1f\xf0\x33\x45\xca\x86" -"\xaa\xc4R\xc8W\x6W%\xaa%\x10\xdf\x8a\x6\x0\xca\xa6\xc0\xc9\x8c\xdam\xd5\xf5#\xb2" -"o\x17\xdb\x8d\xa8*\x0\xe4\x9d\x37jPM\x86\xf7\x8\x8f\xf2\x90\x12\x99\xcb\x63\x90\xe8" -"\xed\x62\xc9\xa4\x9d\x2\x1f%\xd8\xdb\x8e\xc0\xc8\x94@\x4\x64!\x95\xee\x1d\x11\x0" -"\xee\xcd\xffsx\xe6\xe9\x89o9\x1aj[\xaf\xb8\x88\x9\x86\x10\x90\x13!\xba\xfe+1\xb6" -"\n`\x87`\x9J\x91\x81\x95\xa5\x30\xe9|\xec\xa1\x14\xa6Z~=\xa5\x35\x95\x7.\xf8\x1a" -"\x95%\x92\x13g\x0\x7\x8a\xce\x18i\x3\xfdg*g\xcbz\x88\x33_\xb5W\xd2)\xff\xd0\x38\xc6" -"\x97\xa1\xae\xe6\xf6\x0\x62\x66\xe6\xbf\xd3\xe4\x9a\x33\xbf\xb\xe5\x8\x15\x2\xe8" -"'[t\xfbZ\x9cn\xb3\x92=\xd8'4\xd4G\xa5\xdfs\xfc\xe0\x36\x97\x15\x9d\x8e\x8e\xd1\x43" -"\xe2\\\x62\xfc\xce\xf\xc3\xf0\x1d@\x5\xb7\xc1\xdf\x9a\xdb\xc8\x1a?%]\x85'n^G\xf7" -"\x84\x17x\xed\x94\x39\x64s\xc2T6\x4\xab\xb2\x8c}\xd6O\x12R\xd1\x7\x11\xbbLv3\xee" -"\xfe}\xe3\xdb\x9a\x83'\xe8\xfct\x19\xc9ml\x9n\xe5\x42\xddl\x89\xeb\xa3\x94\x1e\x8a" -"\x86\xa4*\x8a\xca\xec\x9b\x11\xe8$\xd1\x15\"y\x82\xc3\xe1'\x8M\x19\xcbV\xeq>\xde" -"M\xed|\x90\x99\xe1\n\xf2w0\xca\x63\xac\x1d\x8duX\x87\x10\xb7\xe6\xa2%\x39\xabph\x80" -"\xcf\x38\xf3j,R\x98\x39\xf5\xa5\xda\xc4\x86\xb5\xe7\xfc\xa8t\x8e\x85\xcdO\xe7+\x92" -"\x6x+\xda\xf7\xb7\xe1\xd9\x1fQ\x99n\xa6\xa3IC\xcd\x9f\x90J\xfe\xc7\x13\r\xe5*I\x91" -"\x93LQ\x1f\xa6\x89\x36M-\xff\x6n[\xee\x37[~\x1\x1\xa8\xb\x2\xc5\xaa\x36\x8e\xe\xa4" -"\xfc\xa4\x34\xd1\x81\xee\xa3\x43\x9e\xa6\x39\x8ar` '\xf4\x15\xca\xc1\xcf\xb8G1\xa1" -"\x9_\xa1\x13\\\xb7\\O\xae\xe7\x14\x84?a\x17\xab\x1e>h\x84w\xd8\xcf\x9d#\x18\x44\xa3" -"\xb0\x0^b\xf\x9f\xba=\xbc\x93\x8cn\xb5\xe1\xf0k\xed\xae\xec\x97\x8d\xe8\x1\xfc\x94" -"\xb0%|j\xc5\xcdS\xe0\x64\xc1\x91<\x14\xdd\x1c\xdf\x90\xebx\xc2\x16\xb0\xe3\xc0$\xcf" -"5 n\x9b_{q\xe1t\x10(\xefjY/\x83>\r\xf3\xaf\xe0NGJ\x2\x36v\x6\xac\xad\xde\x30\xda" -"\xe4\xe6G\r\x5\xeb\x33X\xfe\xa0#\xb0\xab\xf8\x64\xca\xc7^K\xdc\x38\xdb\xf7\x64X\xa4" -"Y\xbf\x38\xae\xfb\xc3\xc4\xc7\xc2\xc8\xb8$I\xbb\x15v\xaf\xca\xce\x81\x19@\x89\xb9" -"\xa6\x83\xbe\xc4\x62\x62\x31&\x7\x1b\x1c\x44\xc3\x36\x44\xf5\xb0]\xf5\x9b\xb0Y\xdc" -"1\xbeo\xd5!u\x84\xed\x9b\x17\x65\x7f\xa3)\xc0\x8f\x34\r\xf9\xb6\xc[\xe4\xea_%R\xa8" -"\xec\x2\x9c\xfb\x98\x63I\x8fN\x9\x87\xa7%\x9d\xf5\r\x87'\xa5]\xc5\x38K\xe1hEGJ_\xc4" -"\xe0\x98\xd5\x6\xa7\xa8\x4u\xda\x85\x83o\xe4\xd6:\xf6\x86\x8e\xfe\xda\x1d\xdf\x88" -"\xad,\xc3\x83\xbbY\x99\x63\x18\x81\x30|q\x10\x86\x6\xc8\xcd\xc9\xf8\xb6&\x96\x15" -"p\xc2\x32\xd5v\x8\x42\x65_\xed\x46\xd4\x95*O\x1c\xd6\x8a \x2\xc3/\xe6\x39\xc5\x66" -"4\xc8=\x9d\xe7\xe4\x64\x3\xeb\xa4\x1X\x9dt\x14U\xdfl\xc6\x1b\xf4\xb5\x99\x93\xe\xcc" -"cG[\xbb\x8c\x46\xd4v\xdd\x8]\xbd\x14\x2\xd3\xd9\x63\x38\x35\xb1\xe1\x4M\xb5-\xc4" -"\xa3\x13y\xfd\xa9\xf7\xbf\xa8`U\x4\xdb\x1j\rHQ\xa6\xd5Z\x86\x13\x42\xf5\xe6\x39W" -"y\x81\xe7\x32-\xe7\x91\x97g\xc9%\x9cSS~\x97\xa1\x43\xdf" -"\x84W\xaa\xa0\x84\xa7\xf1\xef\xb3r\xd9\xce\xe2\x1d\xcf\xdeY\x80ge/@\x11\x45W\xdb" -"\x89P\xf9\x99\xb6\xdc\x83\x14\x12\xcb\xdf\xff\xa0\x8f\xfa`\x86\xa1\n\xf5K\xeb\xe1" -"\r\xcdH\x1f\xc9\x41N@B\xdf\xb5\xa0\x93\xefT:\xe1N*\xb4\xfd\xfd@\xc3\xe\xd1\xb4\n" -"4h\xec\xc8\xe1\x94\xf2(N\x1d\xf4\x9asQ\xd4\xd8\xa7\xfc\xb0vM\xc7\xd3\xe7\x80\xe5" -"\x5\x44\xb0\xd2\xc1\x36%\xc2\xb9\x38\x3\xf6:\xa2\x8d\xa8\x1c~\xa9\"\x12\xfa\x96\xca" -"\xc2\xf6Gc\xe4\x66\x66\xec\x0o\x8b\xf\xdb\xcco\x19\xc1#\xcb|\x91;u@b\xfd\x84\x12" -"*\"\x13\x38\x89\x19\x8\xe4W\xa1\xf7\n\xd7\x92\x3\x92\xb6\xb\xc2\x8b\x92\x97\xf8\xb6\xb[\xe4\xac\xf\x42xtc\xb5S\xf2\xeb\x3" -"Y\xdb\xbe\xe5\xe3\x17s^;\xbf\xa5[s\xc6\xc5\xe1\x65\x86o\xdc\x13\x84+\xd2U5\xd1\x86" -"\x1d\xf4\xf7\x13\xeW\x1d\xfa\x35\x86\x1\xe6\xa6\xf8p\xb3#\xf4\xdf\x9f\xab\x19[\xa9" -"\xdf~\xf\x8c\xed\xeb\xbc\x34P\xeb\x97-\xdf)=\xcb\xb8\xdf\xde\x33\x7\x81\xe\xf0\x9c" -"0S\xa6\x1\x14\xd0\xfatxS\xfamB.\r\xc2u\x8f\x34I.9\xb8\xf1\x45\xbi\x8e\x61\x33\xcc" -"\xe3\xd2\x63\xbb\xc2\xa8{X\xe4/@\x87\xd5\x88\xba\xfa\x35\xff\xf5m\xb4\xadG\xef }" -"\x94\x62p\x19od\x9an\x9b\x65z\xca\xc1\xe9\x2\x9a\xb5\x1d\x96\xed\xba\x15m\x16\xf8" -"G\x84^\xffM\xeb\x66\x8f\x9c\xdbz\xb7$i\x8cQ\xa9\xef\xf4\xbd\xc3\xc4#H\xe9mV\x89\xdc" -"]\xea\xf6\x38\xc0\xb2@\x18Mfj\x82\xf\x9\xec.\xb0\xd5\xa8\xa5l0QN\x16yVh2\x9f+\x14" -"8\x1b?\xb7\xe4.\x84\x9b\xa3\xda\x19h\x8eG[\xe\xe6\xce\xfa\x43\xa9\xbc\xd2\xff\xb5" -"\xf3\xe3\xaa\xddlGz\xc3\x9e\xfe\xf1\xd2\x11\xdb\xc3\x39I\xf7\xfb\xc9\xf2\x8b\xbe" -"\xee\xb7\x64\x85R\xf4\x38\xc7\xcc\x63\xe4\x1=T\xa9\xc\x81\x39\xeb[\x15xe\xbbr\xc0" -"\xb9\xe9\x1a\xcf\xe2\xe1\xc2\xcc\x96t\xa5\xc3\x39\xf8\x8c\x1a\xec\xee\xaax\xdc\x83" -"\xc2\x82\x2*\x91p\x15\x83,\x9a\xce\x7f |\x0\x1d\x80\x37\x9b\xf9\x92\x5\x3\xdeX\x88" -"\x90\xb6\xa0\x17\xe5\xda\x8a\xf3\xe9\xe7\x9a\x7f\xb0\xac\x43x\xf4\xfd\xa4m\xe}3\x9b" -"|e!\xb3\xbcN\xbe\x41\xef_\x93g?\x87\x14\xee\x43\xbc[]\xe9\x1bn=`\x9a\xd3\x34rz\x80" -"\x5\xbf\x7QI\x6\x1a\x18T\xd1\xf1\x93\xf1\xbb\x95#\xe3\xa6\x1d\x14z\xf4\xf8\x86\x9c" -"\xad\x2\x8b\x93X\xf1\x9b\xfe\x36\xe6\xe7\x1f\xf4L\x1a\xbd\x63\xcb\x46`q\xbfy\x9d" -"a4\x9b$\xa7<\xd2I)\xa9u\xa3\x1\x32\x8c\xeb%J\xd5\x19\x63\xa8\x1f\x30\x99\x7\x43\xe0" -"\x5\x80\x12l\\\x91\x4>^\xcd\xb7jK\x8e\xa6(A\x84\xdc\x8d{>R\x8\xcd{iW\x87-\x15*\xa6" -"|U\x5Mc\xca\x80\x89I\x8c\x83O\xc`U\xa1\x83\x38|\xfc\xacSM\xaa\xdf\xd0Xn\x93\x12\xb0" -"\xb3\x93~\xd1\xc9\xa6\x1c\x96\xcfWj\xa4\x1b,\x1f\x32\x89\x65\x1f\xb8\xce<\xa3\xf5" -"\xd0\x17vj\xc\xd3\xd9\xde\xaf\x8d\xf6u\xa6\x9e\xc7qe\xd6 \x87Uo`\xfb\x17\x91)'7|" -"L\x7fi\xad\r\x13\xb7\xc2\xd2*>1\x87\xbf\x19H\xfb}\x6\xbaT\x11&\x96m\xea\x84\x1)(" -"a\xd2\xe4\\p<=8\xd2\xa0o\x88\x90\xe6L\xbb\xe1v\x2J\xa6\x8d\x9f\xc4\x31\x16Y\x11\xec" -"\xd2\xde\x10\x8c\xec\xe4\x98\x18\xec\xf8\x9f\xfd\x32\xc7o\xe7\x11\xea?\xd8\x34\x35" -"\rV\x8fL\xcbn\xa3\x96\xfb\xd7\xb\x61z\x88/%\xc1\xb5\xf4\x13xI\xa3t\x89U\xe0\xe8%" -"\xae\xda`\x11\x15_;\x8b@6\x9l&\x94\xdb\xba\xf8\x82\xf8\xde\xb0@\x94O\x3\x34\xed\xd6" -"\xef\xf\xde\x98\x95\x38\xa7\xd7\xa0\x62\x9\xd2\x9\xf7\x9c\xeb\x9\xbeQBL\xd0\xb3\x8b" -"\x9e\xea\xff,Ib\xddj\xf3\xfb\xe8\x90\xc7\xf4o\x97}zz\x8\x1\xd2\x12|\xd0=\x4v\xe5" -"j#\x1d\x9d@rq!\xdd_\xaco\xad+q\xad\x34\xf0\xee\x44\xc0\x88\xf5\xe1\xd7\xec?b\xf/" -"RQz\x8b\">\x8?\x97\xa6\xc8\xbo\xf7\x42\x44s\xbb\xfe\xa5T\x8e\x17\x6/&B^\xdf\xdb^" -"\xb3'\xa1n`H\xfc\xa4?\xa6\xa3\xb5\x7f\x62\x81\xb2\xa1.\xfe\xdf\xbeN\x94\xf4\xc8\xd8" -"\xb1{\xf0\xc3zk\xfb\xe1\x32P&\r\xc8\xab\xfa\x80\xb0t\x9a\x9\xf2\xee\x7f\x66\x7\x17" -"\xe0]z\xcfii\x0}\x8c\x9fS\xb0ta\x1a\x94\x10\x92I\xef\xc9\x86\xd5V\xc5\xe3\x1eH\xe7" -"\x1\x1e\xa3JR\x87-\xfc\x66\xd5\x85\xae\x31\x80\x35\xa9^j \xb&.\xca\x94\xcc\x61\xa5&O\xa5\xbd\xa9Q\xa8\xaaZ\xb7\x44\x8e" -"6<7\xa0\xfe\x1a\x14\x81\xdc\x98?3\x92\xb8\x36P\xbb\xf5\xb\xd8\xe9o~\x1f\xc6\xe3\x9b" -"\x91\xe4\xe3\\\x17\xc2:\xf\xfa\xa5\xf9\xb8\xd2+\\w\x99M\x92\x2\xf9J\x84\xa9+j\xa1" -"\xd6:\xbf@\xfb\x62\xdck\xc2%\x42S\x86\x0u\x16\xb9]\x8c\xf2\xb6\xc9\x9c\xb8\x0\x86" -"8\rI\x1bI9;\xf0n\x80\x9bk\x8aW\xec\x8b\"mL\x7\xee\xb\xf3L\xba\xa3\\\xe3\x94\x6\xe" -"\x83=\xbd>{\x89\x32\xdc\xcb(\xdaHjY\xeb\x9by\x15\xe6V\x1d\x42V\xe0\xb0\x88{\x3u\x97" -"\x14\"\xa7\xb4\x80\x8e/\xb8Y\xben\xdb|\xbb\xd3\\\xad]\x98\xff\xe5\x17\xd0_j%\xb9" -"&a\x81o\xcfl\xdc\x98\x8eQH\x3\xa4\x36\x34\xd3\xb2\xb1\x83_\x12\x46_\x18\xbe.8\xb2" -"l(\xd3\xd8\xc5\xf8(I\xea\x19m\xe3\xb6\x1a\xe4\x8d\x1a\x32\x32\xb1\x63\xb0\x46V\x11\x30z~\xdd" -"\xb3U\xa4n?\xc2\xd2\\\x98\x31\x4\x46\x94Jj~\xe4\xd3X\xf3\xe3\x86\x46\xfe\x8b:d\r" -"\xb7\x37\xd0$\x8cVL\xc7\\\xeM~\xc1\xc7#\xb3\x30\x64>\xe9\xcb)r\x9a\x8\xa9\xb3\x36" -"\x94\x95IA\xc9\xfe\xafK\xef\x97\xf8\x82\x6\xbck}\xd8\x8\xc5\x38\x96\xf\xe6\xb9\x8a" -"\xe9\xcfZ\xb3,\x9b\xda\x1a\x12\xda\xbep^\xc1\xd4Q_\xa0H\x4|\xb&Dy\x10\x9a\xbaQY\x93" -"\xc7>\xd3\xe\x0\x15JM\x15\x3\xebr7\xf7\x8c\xcd>>W\x5$D9N\xd9\xae\x98\xf4\xb1\xe3" -"\x91\xdf\x36\x94\x1eV=]I$\x95\xf8\xc7$\x9a$\xc2\x42\x9f}\xb1\xc4\xa4\x31\xb4\xa2" -"\xb1\xe8\xdc\xbe(E|\xe7\xb4\x14$^:\x17z\x17\xc\x87\xae\x12\xad\xcf\x96\xf4u}\x11" -"[\x16\xcb\xf\xd7\x88\xc7z\x1f\x9f\xb3hk\xdb\xc9'\x5\x1c\x46x\xf8>\x8d\xc3\xb9\x64" -"h\xc5\xa8\xca\x83\xa4l{\xe6&c\xbb\xad\x17\x9d\xbd\xc5[\xa0\xbem\xc1\xdeW5\xa0\xd0" -"&\x10\x30\x94\xbaW\xc1U\x1\x9e;\x86\xa2`\xfc{?\xc2\xa0\xad\xad\xa5\xb9\xfbV\x2\x9a" -"(#W\xf5\xcf\xd4\xce\xe0+1\xac`\x1bW7d\xdd\x5\xfe\xb4\x2\x34\xc7\xf2\xb9^\xc8\x1\xcf\xb6:\xa3[eQB\x1d\xe7" -"q;\x1a\xefG\x6\xd2\x46R\x10\x7\xee\x35\x81\x99\xe7\x7f?\xd3\x92\x38\xf8\x1f\xe6\x88" -"\xf\x35\x44\xd1\xc8\xa7\x97;C\xdc\"\r\x19R\xa2\x90\xae\xd7\xf\xf3\x30\x0x\x89\xa2" -"\"\xa8\x30\x85u\xc5\x2\xa2\xa2)\xb0i+i\xb2\xf6\xb1x\\\xbc\xa2\x8f\x1b\xab\x88\xf8" -"\x96`\xc1\xc4\x66\xab\xa3\xecv\x1f\xf6\x1d\xe2\x5\xe0\x95\xc6\x44N\xe9]\x2\xf4\x45" -"\xe0\x96W\x99\x1a\xd1\x81\xd1\x32[$\x8e\xc,\xf4\xb\xf2Y\xee\x36$\x9f:2\xb8\x64" -"\x96\x44y\xa2\xaa'\x92\xb5[\x81\xb7\x5\x6\x42.\x84~Pcf\xf\xf5\xb1[\xc1\x9e\x64'I" -"gP\x8a\xb5\x35;d(\xab\x17\xba\xc7\xfe\xe2\x12\xd3!\xc9\xc6\xde?\xe8\xa3GI\x1\x8e" -"_W\xf1\x95\x3\xcd\xd1\xe0\xe5N}\n\xa3\xc8\xf8\xfe#_G>48(\xed\x33QO\xf1\x1bmn_\xd8" -"L\xae\x88\xe1h\xd0\xc1\x12m\xad\x64\x9\xc0\x98\xadK\x10\x62\x89\xcb^9h\xf5\xd3\xda" -"K\x13([t\x9b\x81*\x1bW$\xa4\x33\x37\xb9\xf6\xcd\xfc}\x1a\x98\x81\xfep\xdc\xdb\xcb" -"\xb1\xcd\xed\x41\xaa\x15$\x8a\x9c\x37>,\"\xbfW\x0n\xd5X\xbf\xe9\x85\xd5\x33\xf4^" -"X\xed\x18\x84\xf3G\xf4\xc3\xb2M\x15\x9cI\xcf\x8aI\x13S\xaa\xe8\x1d\x0\xf9N\xc8\x99" -"\xf2\xc6\x39\x3R\x83\x1f\x84\xb5&\x6\xff\xdf\x14\xa2\x30\x18\x32\xfd\xb1\x17\xcc" -"\xdd\xa2*\xf5(\x8e\xf1\xcf\x92\x95\xbbw\xffT\xf0\x14\xcc\x81\x7\xca\xc2x\xba\xcd" -"\x1e\xd4\xa9\x84\xec\xb9o\x2\x30\xc5\x33\xfcHt\x15\xbd;\x8aP\xb6)\x9a\xfe\xcf$*t" -"z\x92\x8\x1b\x7f\xae\xdc\xec>\xb3\x84x\x9c\xa1\r\xff\x4\xba\x99\x34\xb6\xf8~O\x6" -"\x90[\x13\x41\xa6\xae\x2\x81\xa3\xa6\x45\x98\x44\x8fz\x1d\xc7\xdd\xf6\x30\x86S\xf6" -"Iz\xb1\x33\xe3\xaa\x85\x10\x0U\x13\xcd\x9b\xb5\xad\\\\\x17\x8\xd4\xa2\xf4\x84\x37" -"[`0:\x9f(JC7\xc2\xef\xaa\x3v`\xb5\xf2\xbd\x61\xa5\xab \xc8+\xb5\x82\xce\x90*\xfc" -"4W~\xb8\x82\xbb\x91\xdb\xfa\xd6\xfd\xbc\xe5\x12u\xaa\x63V\x95&\xb5;\xd2\xff\x81\xbb" -"\xfe\xd3\x38\xe7HH\xf6\x14JjG\x14\x91T*i\xf4\x8dp\xfb\x98\xc3\xed\x83\x42\xf0\xea" -"\x7f\xeeW\xfc\xealdl\xad\x11\x88\x11\xe3\xe2rE\xca\x83\xaa\x92\xad\xa5\x6\xb9\xde" -"M\x5O;\x7\x87\x93\x99}[\x80\x41\xa9\x99]\r\x8a*c`\x18\x61\x8b\x9f\x6\xf5~\x80\x95" -"m\x1?\xb0@.\xf2i\x17Y\xac\xcb\xfd\xb1~\xa5\x84\xbaW\xc5P\xf7\x8b\x9c\x30\x81\x37" -"\x87mF\x1b\x36V\x9c\xd5\x7\x13\xe\x8f\xf\x94\xfe\x32\xb0\xe4\xe1\"\x92\xc\x1e\xaf" -"yd\xbc\x31\x6\xa3\x16\xe2N\xf\x11\x8T7s\xee\x33s\xb4svzJ\x90\xec\x31\x35\x2\xc5;" -"L\x19\x90\x19\xb1\x35\x7\xbf\xe4\xba\x32\xb4\xa8T\xae\xbf\x84\xc8z\xeb\xa8\xc8\x1d" -"!\xa3o\xa3\xe3\x11\xf9i\xf9\xad\x9\x43\x1dz\xb8OSZ\xedgJ\x1c\xf0\\Gtu\xaa\xcd\x43" -"\xac\x1a\xb7\xea\x13\xc4\x8a;${\x18\xe2\xf8\xd8,\xa2\x97\xe1?\x1b\x63\x41\xa8\xb9" -"\xfa\xab\xfb\xdch\xc6\xeb]\xa2-r8|\xeb\xe0\x61\x65\xc6:\xbe\xf\xd9\xcc\x92\xb7j\xcb" -"\xb7x\x7f\xa3\xec\xfvA\xb8x\xbdv\xeb\xd2x,\x93\xeb\xabRQH\xd8>\xe9;\x1csK\xc2\xb9" -"KQ7\xeb\x1fY^jN\xa5\x12\x9eQ\x9aIT1&\rB\xac\xbc\x62Q\xf\xe0[\xdd\xfa\x9a\xd5\xdf" -"\xb3`c\x1\xaem\x7f\xcb+W+\x8eV~$o\xff\x65\x8a\xbc\xe1\xc2\x85\x9c\x1a\xe5lB$\xfb" -"S_\xb1ulq\xc9\xb5\xefw\xe9\x82_\xcc~\x83\x15\xf5\xcf!\xf1\x1e\x38\xa5 \xa0\"@\xf9" -"\xba,5I\x2~V\xf5S\xa8vr\x17\xbe\xf2\x4\x91\x7\x42\xc7\xc7\xc4\xc7_\x95\xef\xa3x\xf" -"\xba\xca\xfb\x41\xc0\x9b\x2\x11\x5\x41\x3\xee\xda\xcb\xdc@\xeb\xb9\x42\xb3\xae+\xd3" -"\xd9&\xf\x1d\xdb\xab\x91nc\x8f\xd1\x8\xe2\x86\xa0S\xb3\xc4\x63\xa4\xe4YU$GE\x8d\x92" -"\x19\xe0\x98y7\xa9@ \x3\x15\xdd\x90\xdd\x1f\xd3\xa9\x88\xf2\xe0\x8c\xc1\x41(5\xd3" -"\xd4\x62\xa7\x1f\xde\xf5JO\xda\x8 zYh\x97\x85\x36\x96(L\xf9\r\x1e\xa7\x94\xb6V\x18" -"\xc3\xa4\xc5\x10\xfe\x95\x45\x90\xa0n\xd5\x15\xbb~p\xaelM\x1a\xed\x39<\xf1tN+\xc1" -"I\xcd\xae\xbd\x9cK:\x13\xd6zf\xaf\r\xd0Sde\xf0gupLs\xad\xc9\xfb-;\x88\xde\xbf\x44" -"\xe4\x2\x8b\x86\x7f\xf5]S*\xdf\x33\xddWg\xb4\xee\xb6\x89\x1\xc4\xaaG\x12i\xa2\x18" -"\xa1\xcb\x3\xfc\xb9\x45n\x9aP~W`\x98(\x92\xe4R\xd4\xa6#\xae|\x8b\xdc\x8\x1e\x46\xe8" -"\xc6\x66\xed\x80s\xf0\xac\x82yh\xa2]\x1aZ\x8f\xb6\xae\x6K\xe1\xe2\xb8\xfd\x88\xbe" -"%@e\x15!\xd4\xe6\xc<\xe2@\xee\xf1\x92\xfa\xea\x9e\x38R)fi\xf9w\xd0\x92\xd7Nn\xbf" -"!\x93!\xc9\xb\xc4\xb4\x97\xbe\x45\x8d/\x9a\xba\x3\x95s\xf3ra\xdfL\x9e\xe8\xfc\xd9" -"\xbaG\x13\x5\xa2\xa9\xce\xda\xe6st\xbe\xf9\x1f]\x94\x8e+\xd1\xbfgXv\xf7\x8ak\x99" -"\x8f\x32\xe9\x6$\xe\xc3\xae#o\xb\x62\x1a\xd6\"\x11\x9d\xda\x90\n\xb4\xe7\xdb\xd9" -"jm\xc\xba\xa1\xe5\x65?\xc6\x95\xac\x33VW?<\xc7\xd4J\xfe+\xb6\xc3\xc8\xa4\x83Ky\xe4" -"C\x91\x41?B\xff\xf\x39\xbf\x1e\xc\xf3\x92\x99\xb5\xdd\x80 >O\x85\x13\x93K\xeao\xfc" -"\x81\x6\xf6^{x(0=>\xd9\x35\x13Sd7wR\xcj \xfe\xf5\x8e\x18\xbf\xe5\x44\xd0\x61\x31" -"\xd3K\xb1\xd0\xb8^\xb7Ye\xce\xb7\x1e\xfb\x8b\xf1\x3O\xcdG\xd9\xf#\x8a\xe1\xdd\x88" -"\x9b\xe8\x42\x33\xccS\xffH\xb8'\xd5\x7f\xa0\xd2\xad\x33\x83\xc1\xcdR\xa0\xd9q\xc4" -"~\x80&tG\xed$\x1c\xcb\x34n\x8aHFm`\xae\xb8\x62\x30\x33S\xd3\xb\xd6<\xe9\x65u=]\xcd" -"\x2\x7\xf1j\"Oe\x80U\x80\xf4\xeb\xff\x87\xb9\x88\xfc\xec\xe2\r\x41\x1b#\x18\xce\x87" -"\xbaz\xe7J\xe7\x46\x62p\xbbTO\x86\xf1\x7\x6\x37\xcd\x45\xfd\x30\xa2p1\xce\x42WZ\x8e" -"X\xff{\xe9]oD\xd7\xb\xb7oI\x15o\x1c\xda\x9\x12:\x15Y\xcf\xc4\xc5\xce\r\xc6\x97\x4" -"\x18^\xd7VYm\x8b&\xde\xd8:>\x18\xa4\x14\xa1\x32\xa7Z%\x1aX\xc6/0\"jzd\xc9\xbf\x30" -"\xad~r\x1X}\x17\xe4=\\nf@\xc5\xc7\x96\x8d<\xab\x1\x30\x35\xf0\xf3U\x1e\x80g\xba\xb5" -"af|\xe8\xcd(\xb\x84\xb7\xd6\x7\xff\xeP\x4j\xfb\xfe\x98\x46\xeb\xa6\xc1\x18\x97,\xc3" -"\xc1\xb9-P\x11\xf6\xb1\x1e\xf0\xd1\xe8[\xae\xb6\x37\x1e\x62=\xd8\xdd\x85\xe6\\jE" -"m\xeeoH\xf0\x85\xef)'\xa8\xb3\xc4\x30N:\xe8\xbe-2\xc2\x32\x9f\x9aP\xd8\xb5\x89\xe9" -"WYg_\xbb\xa8\x84\x18G\x82\xa0\xf7;\xa0\xcf\x85\xd4\xe0\xf9 L\x1e\x9d\x9b\xb3\x37" -"\xab\xec\x34M\xee\xac\xc8\xedQ\xd9:\x85[c\x1b\r\xf3\xd0\xf0w\x89\xac\xb\r\xc4\x39" -"A\x8b\x8e\xf3\xcX6J\x99\xf7\x64\x42\xc~1~\x8c\x8'\xcb\x30\x1bKM\x92%\xd0pN\xd1?\xf4" -"\xaa\x81iI\xf8\x45R0\x9e\xb2\x19#\xf7&\xf6\xea-(\xc1v`\xc\xd6\xef$\xc4)\x96\xe3\xb" -"m\x9e\xb3=\x1ewKg>\xd8\xc5\x96\x99\x8e\x97\x92\xfalS\x1eZ\x9c\xb2\xcb\xf8\xa5\xfc" -";\x9\xb4\xdf'\x1d\x62\xfe\x8c\x1e\xce\x1a\xc0\xa1\xd5\xb1\xc\xb1\x9d =!\xb5\xc9\x93" -"Y/((\xad\x8aK\x19\x9e\xc6\xd8\x91k\xfbk\xb5\x17\xb5\x93\xae\x2\xc2\xf7_\xd4\xf3\xd7" -"l\r\x9b\x86\xa7\x0\x95\xf2\x90{\x2\xc\xd8(\x7^\xf8\x86\x90\x33\xfc\x9d\xcf\x14:\xf0" -"\xf5\xfd!7sw\xd9\xe3\xe3\x61\x4>oK-j\xcf\xdd@\\A\xd9\xbd\xc2kE\x3\x3\xf4\xa4\xfe" -"y\x0\xea\xc6\x33\x92S\x8kGL\xd8I(\x82\x36\xb1\xfe\xb6\xefM\x97\x5s\xadi\xc9\xc8-" -"\x97\x15\x7h\xb0\x8\xec\x39@\xf6\x96\xac\x65\x7\xcf\xf8\xa8\xa5\x9f\xdb\xce\x82\xf4" -"\xd4i{\x5\xe7+\x81{\xd5\x66\x9f\xa8\xbf\x1\xec\x9fu\x6&Ti\xe5{\xd0\xa4T\xa5N{7t\xe2" -"\x8b\xabY]\x81\xc3,\x4\x8e\x66\xetJ[\xdb\xf4\x0\xfm\xdb\n\xebvx\\\xc3_6\x18\x94\x66" -"\xde\xc0\xcf\x1\xc6\x8e\x1dX5\xd0\xb7\xb7\xfb^\x2\xe4\xdf\xe5\xd6-=J\x93\x91\xe9" -"\x19\xa6\xb7S\xc3\xd9\n\xe7\x1dJ~\xfe\x66\xca\xb6\xff\xfd\xca\x92\xf7\xc4\"\xae\x38" -"\xda\xe2\xc9\x31/\xe2\xfct\x12:\xa9\xe4/\xd7\x2\x1e\x94\xfJ\xab\xa9\xd1_\xfa\xa3" -"\x86$?;\x9a\x2\"\xff\x14\x86\xf9\x8c\x9c\xe3\x5\xb4\xa8\x39\x94<\x92\xa6\x31\xcb" -"\xc5\xf4\x7f\x93\x9e\x32\x9h\xe7\x11\xf2\xe8\xb6+h*\x3\xe6\xf0\x88)\x80\n;\x17\"" -"\xa1\xf9\\$%\xdf\x81\x42\xa8\x9cv\xaf\xd7Y-~uG\xbc[mw\xb2\xb3\xca\x9c\xd1\x7fg\x15" -"u\xfb\x33\x90gu@\xddv{\xcd\x34;0.E-\xf5V\x90#d\xe7\xcc\xc7\xc8\x3\x9bpy\x1b\xa2\xb0" -"\xda\xaf>f\xed\xcd-[+\x10he\x99\xb0\xb2\xaa\xfa\x9e[\x8a\xb7\x6\xa3\x12<+\xc\xd4" -"\x1b\xd2\x0r\xbd\x8d~\xcf\x9d_\xf0\xc9\xf8\xc8\x87\xa7\x9c\x2\xdc\xdd\xda\xb\xb1" -"\xa2_S\xd5\x88\x1K\xcf\xf4\xa7\x93\xa6\xa2\xf8\x39\x18\xb2,WT\x8e\xaa\x96}<)\x84" -"\xa3z\xdfR\xbf\xdbIk*\x98\xbd\x38\x6h$\x9\xe6(H\n\xd3\x1e\x45\xba\x88\x10\xac\xc6" -"\x97w\x0w\x1d\xd0r\x9aV\xa9\xa7\xf9\xa8)\x97Gr\xc3K$lb\xe2\xd3\x61\xb2()\xdc\xab" -"\x4\x84uj\x11W%\xa0Wy?\xb3k\x5\xbc\x15#V8\xe0n\xea\xc9%\x8c\x35Y\xf4\x4\xc3\x9,0" -"dCt\xbc.\xe\xf1\x9\xb6\xa8\x96)\xc7\xafm[\xb4\xd5\xf7;/W\x8a\x62\x9c[\x95\x85M{\x94" -"-w\x9c\x1c%\x1bg(s\x9b\x8a\x82\x42K\xbN\xce#S\x93\x8e\x8e\xea\x1e\x45\x9e\xe8\xcc" -"T\x9e^2D\xa3\x45\x30\xa9\x88 %\x9a\r\x35mH5|5\x8e\xda\xc1\xa3l\x5\xd0W\xa5\x96\xa6" -"q,\xd4[ \x7\x15\x13YU\xfd\x37\xaeR\xa6\xf8\xbc\x86\xaa\x95\xd9\x30\x88\xb8\xa3\xd3" -"M\"=\xf6\xe8\x82\xf4/\x9e+c\x1bY\xb1\x1cM\xde\x8am\xf5\xac\x6\xe6\x80-\xdf\x90M\x84" -"j\x1f[\xcb\x96\x63\xf7\xd7\xd6\xc1\xf3x\x14\xd1\x90=\\P\x9u\xb7\xe4\xb4i\xca\x81" -"\x96\xb0\x34\xba\xe2-\xfa\xc4z\xfd(\xad\x8a\xf\xf3\xfe\x1di$\xe6\xa4H\x84\xda\xc8" -"\x99\xe0\x30\x32M\xbX\x8.\x93\x8b\xb7\xea\x1f[\xc2\x86\x9b\x8f\x12W\x93\xe7\xa2g\x7z\xb0\x9d\x41\xe0\x12" -"\xb0\xf0\xf6\xb0\xd8\x8b\xf7\xa9\x98\xee<\xe3X\xaf?\xba\xf3On&\x8c\xe4\xe1\"\x1d" -"\xa7V#MK\xc7\xfe\xac(\x1f~G\xb8R6\x9d\x84\x10\x9aXh\xb2\x1e*\x86\x93\xb9\xcf'\x15" -"\x1a\x19\x16\x11`S\xe1(\x7\xe5\xb7*{\xdd\x12\x37\x35\xfdR\xca\xa4\x82\x61\n`E\xd8" -"\xf8$r\x89\x1f&53\xc6V\xa0[\xbd&\xd4\x1c\xcf[\xb9\x64\x80\x85\"/\x85i\xf5\xaa\xe0" -"S\xfbG8\xdf\xc0<&\xe4n<\x9a\x8b\xa7\x8e\xd0\xe3\x9\xf8\x8fKU\xceP\xce\x87^\x13\xc9" -"}b\xaa,\xefmF\xb8\xc8\xc5n\x2\xb1J\xc3\x8bN\xab\x34\xbc\x8b\xac_\x1f|\x96<\xfc\x17" -"\x16\x7fN\xb7\xc6\x80\xcfQ\xd3\xa5\xfb\xf0\xa0\xe1\xb0\xbf\\r0\x16'-~\xa3\xbf\x9f" -"\x91\xa2\xefk\xe6\"vR\xb2\xf7\xc9\xe9\x32\xbc\xd6mY\xd4\x31\x83\x90\x63\xd9\x9d\xd0" -"\x87\r\x93\xcb}h[oG\r&\xbe\xe9\xce\xce/\xe4\x98iF!7^\x95\xf3H\x8e\xa7$\xab/=\x89" -"]!#\x8c\\\x6\xe6\xe8\xd3\x8\xb9\xfb\xf\x14\\\x1a\x66\xaf\xef{\xcc\x0\xbf\x38\xd3" -"=N\xa3\x2\xef%\xae\x8cJ\xb\xe2\xcd\x99\xda\x8a\x88\xba\xdcU\xfb\x9bJ\x1\x15\xa3\x6" -"\x9d\xdf\x1er\xc1\x8\x93\x63\xd9\x16\x10*\xd2\xc0\x9e\xd3\x1d\x13\xec\x9d\xc5K\xbd" -"%\xee\xf8\x84\xff\x8\xb5Yn\xab\xf1\xb9KP^*\xcf\xe3\xbeJJG<\xd3\x1e\xbeM\xf8\x9c\x30" -":\xc7\x9d\x83\xe6\xd3\xea\x4\\\xb3\x82{\xc0\xdc\xe0\xb3\xb8N!\xb6\xca\x63'\xb1\x3" -"8\xd8\xbf\xac}-C<%\\\xe6\xd1-m\xf1_n\xf5\xef\x8b\xa1\xad\xf4=Ml\xa7\xdc\x98\x92\x4" -"\xbwp\xd9;g*\xe7\x0/2\x91\xa4\xf8:V\xd3\x8b\xba\xc6\xaei\xe4:?@\xa3\x62\x90\xd5\x85" -"\xe3\xd5\xe3v\x92\x42\xc1q\xc6\x86HMP\xe3\x89\xca\xbb\xd8\x8c\xbeM\xff\xd7\x87\xd1" -"'\xb1gM\xd4\xb\x46\xccrQ\xbazv4K\xbe\xfe\xe8\xb\xb9\xa0\xd2\x8a\xe8\x36\x9f\x9d\xbf" -"\xb3\xa7\x80$#\x8d\xf6yQ\x18\xefM\x10\xb5\xb2\x8c\x8N\xbe\x41\xe6\x97\xd6\xd6\xb1" -"\x83\xf1u,\x92\x31\x14\xb8\x45\xcb\x9a\xd5\x62\x33\x46\xa2\x44\xef\xbe\xd3\x8eK\x89" -"g\xa0\xb2Z\x9d)\xc9^P{\xd2{\xfbZ\xe6-\x9a\x44\x6\x81o\xcc\xe\x94\xf9&7\x89\xa4\xa9" -"\x81\x95\xbe\x81\x7\x65\xc3X\xe2l\"w\x1n\xe6\xc3,\x9d|\xba\n\xf0\x8e\xb5\xbc\x84" -"\xaf\x15\x10i \xf\x1en\xc2\x9aZo:Q_\xe7$'g\xd1\xed\x83U\xdf\xb4\x66\xf0\xff\x44\xf" -"\x89/\xd2\xd1 \xd8\xda\xbf\xf4o\xc3\x95\x97\x9e\x34\xeb\xc1\x10\x81lc&\xed|\x14\xe1" -"\xcd\x8e\x80(\nO\x1f\x93^U\xb9x\xe2\x66\xd0\xe\xa5\x7y~\xe5\xf3<\x86\x36!\xcb\x66" -"\xa2\xde\xdfvH\xc1\xa5\x92`\xe8.\xe7v\xc3\xf8U\x94\xfa\xb5\xc3\xe2\x80\x93\x88r " -"?5\xf1.'\xb9Nf\xbd \xe2V\x3\x92\x9b\xc!\xac|/\xab+\x3\x82\xf4)a;\xd0\xcc\xc4\x80" -"\x15\xf1o\xfe\x8a\xf8\xca\x10\xefT\xa2G\xe7\xdc\x86\xa6Ws\x11\xae\xfa\n\x1f\xe3P" -"\xe7\xad\xae~!\x94\xfa\x13\x5\x35\x8b\xbe\xdd\x35\x1f.d\x6\xe8\xde\xc9\xc\xdb\x41" -"\xf0\x84\xa5K\x1@\xb4\x13^=\x12\x8f\xe5\xa9\xc4\xb3\xf0\x66o\xb5\xf0.\xf0\x14\xa5" -"9\x12\xc2\x9dM\xc!We\xea'\xf3\xb4\x6?\xcb\x10\x94\xcc\xab\x9f\x99\xb2\r\x9e\xa0\xdc" -"\xec}\xfa\xaa\xd7\x81\xc6Z\xa6\x6j.N'\x5\x36*`\xd8<\xef\xf0_\xee\xfa\xbc\xb\xfd\xf7" -"\xb7\x84*u+\x87\x61\xbf\xf3\xce\x91MTL\xb8&\xda\xde\x7f\xfb\xfd\x90\xaa&5\x17\xbc" -"\xe0\xd2G$\x8d\x3\x9a\x35\xfe\x30\xfa\xce\xc\x7\xe5_\xe0\x95\x6M\xe9-VT~mE\xc8?)" -"\xf5\\\x89@\xe5\xd4\x80\x1b\x1b]3\xcb\xe5\x91Y\xc3~i\xd4\x33\x6h\xf6\x8b\x87\xb8" -"\n\xeb\x9b\xcf\r\xb3\xca\xcd\x8f\x96\xbeS\xecm\x0\x42`}\xa9$\xff\xba\x12\x30y\xfc" -"|\r\xee\xba\xc5m8\xae\x8c\x1e^{\x9f\x93\xeayU\xd5\x81\xf6\xe\x93\x1e~\x1\x83t\x1e" -"VI\x8c\xa3\xb3\xef\x98\x8c\xeZ\xba\xd7\x34w9\x80@\x8an\xe7\xa9\xe8(wdr\xd1s\x95\xd4" -"\x17\xfdu\xa6(\x7f\x36\xf7\xfb\xfcG\x8\xa9\x92\xc8\x7f\x5\xc\xa2\xc7\x84/\xca\xed" -".7\xe3U?\xed\xbb\xb\xbe\x86\x7fn\xa2z\xcb\x63\x10<\x9aP!\x8a\xd8\xa1" -"&x\x96\xa4\x83\x1ei\xb3\x4\x1c\xfe\xcc\xc7hX\x17\x9e\xf8\xd2\x43\x86\xf6\xfd\xf3" -"U\x85\x34\x86\xc9\x9c\xe0k\"\x1a\xcf|\xe8Pwg\xe2\xf9\xac]\xfP\x88\x65\x41:\xb4\x6" -"\x9c;\xb1\x11#3sOk\xef\xeb}Ph\x90p\xb5\xd0TH\xee\xc2z<\xdf\xcb;\x98\x97\xd2\x6\xfa" -"\x88\xa5\x35_0W!\xe1\xc3\xf3\xa7rEot_\xe6\xe5W\x19\x87.\x87\x0\xbc\xb3\x99Q\xe6\x83" -"\\w5.\x8\xf5\x31\xc7\x13_Y\x83\x9d\xbe{|\xec\xa6Z\x86\x80\xbb\xa2\x43\xa9\xa0\xb7" -"-\x12\x91K\x9b\x44<\xa1\xc0\x65\x0\x98\xcd+\x8f\x13\xfa\xea\xf3\x37'\xbf\xd8m=\x1" -"E\xe1\xe2\xf5\xe2x\xc1\xb8\xcd\xc1\x2\xa9HV\xe6\n\x19\x66\xdf\x38\x8e!\x9f\x5K]\x11" -"\xb1\x11\x63\xd9\xf2\xbbq^n^r\xc8\xcd\xe6\xd5q\xb4=\x15\xdc\x45\xab\xee\x9aN\xe0" -"\xe5\xa5,\xc0p\xd2j\x84\xeaY\xad\x45\xb2\xa7=\xbf?>\xed\xcb\xab\xc0\xe1 q\xff\x8" -"\x1c\xff\xea\x66\xc6^\x1a\xb7\xa2r\x9d\xf3+v\xdf\x44\x45\x9a\xe0\x98\x9e\x9c\x36" -"\xfco\xfsK\xc8ZC\x83\xf3\x80\xc7p\xad\xa2n\xddu\x17T\x1e\xd0\x46\x97\xd3\x7fM\x85" -"\x91\xe5\xf7\x85\x10\xc5\xe0\xe2\x98\xa4\x19\xe4L\xfe\xd0\xc1\xf0\xd6\x35\xd9%\xed" -".\xdcN\x12\x81o\xae\xab\x87\x99\x8f\xfc\xa0O\x85\xb8\\\x8\xd0m'\xc3l\xb9\x39\xa1" -"DU\x87\x13\x93\xd9\x5}g\xa3@\x1g\x1ctyj\xf2\x89\xdb\x1al\xd9\xb\x12\x9aZ\xa3\xcd" -"hp\xed=\x88\x92+\xc4\x63\xb3\x8f\xc9X\n\xb5o3\xe6\xb5\x89\xbu\xc9\x83\xba\xae\xf6" -"\xe8\x92<%\x86g\x8d\xfd\x41\xc9\xd8\x66\x41\x1\xb8\"#o\x93\xa0K\xd5\xcc;2\xe\xe3" -"`ezX\x84\xe1_\x7\xcb\x9b&\x8c\x96tw\x80\x38#\xf9gf\x89<,*[\xb8{\xf1\x1c\xb4v\x9d" -"fX\xd4\\\xdb\xa2\x99\xd4\xa6\x3\x9b\xbf\x2~l\xb0\xa3H\x9a\xd3GER\xe5\xa2\xfd \xda" -"-\xda\xfd\xe5Y'\xdd\xb0\x87\xab\xd1\xd7'\xe5\x11x\x1L\x98\x36\x96*\xe2-\n\xb2\x34" -"0Q\x96\xf2\x10+~\x1e\x1cJ^\x8e\x38'w\xd5\xbc\x42\xe9w\xe\xc2O\xca\x8e_\xcdK\xc7G" -"R_\x7f\xa3\x91\xdeS\xb2\x94\x37n\xd3\xd2m\xc7\xd4\x1aJ\xbb\x12\xddp\xe0I\xf9\x95" -"\xf6\x12\xc2@\xc8\xf0\x17\xe6q\xb4z\x85\x9d\x39_@)2\x89\x8e\xcf\x8b\xe3\x8c\xd2\x14\xb0" -"\x8\x9a N#\x13\xe1\x31\x35\xbfl\xb\xc2\xa2V\xff\x89\xc8\xc2p\x90V]\xe6_\xe7\x9;\xe7" -"\x98\x9eS\x11,\x3(\xb\xc2uPvfR|8z[\xedP\x1f\x1f\xa7i\xcd\x44\x44>5PU\x81\xc9\xa3" -"\xc0\x8d/\x8d\xafO\xa3\xf4\xcf\xba\x13W\xd8\xe4\x9f\xf8#\x14\xef:\xba\xd4\xd9wu\xd9" -"\x1e\xb4\x8c\xefQ\xc1L\xa3\x1e\xd9\x46\xd9lJ>\xaa\x39\xc5\xc7\xa3\xfc\xd0\x91M\x9b" -";\\\x12u\xbdrO\xa3,\x17\x8\xc2\x1f]\xb2\xba{1-o\xa2\xf3=p\x90\xd3\x31\x96\xbd\x94" -"u\xc5\x8bJs\xdb\x13\xdf\xe2\x46T\xa1\xf1\xc7\xb3^\xb5\xe1\xe3\xa3pF\x1a\x97\x9c\n" -"\xd5\x62v\xab.Tp\xf0\x65\x88\x39\xfe\xc\xec\x33\x66\x95n\xe9\xe0\xb5rl\xb6\x8d\xb2" -"9\x9c\xe1n-W\xf8\xdf\xdbJo^I\xeb\xe2\x8b\xd3\x63\xb9z\x8\x63\x9\xb4\x96JP3\xb6\xd7" -"\x82\x35p\xb\x1a\xc4\xfb\x8b!\xe\x64szl\xeaMX\xd4\xcb\xa2\x87\xeb\x65\xdb\x38\xf7" -"\x8cZ\xda\x0\xeb\xaa\x35\xb4\xe\x92\xfc\xa8%\xee\xd5\x63R\x16\xcdr\xe9\x3$`hs\xd0" -"\xaeH\xec\xc2 hF\x8a\xec\x18\xd6G\xa6\xda\x9d\xe1\x8f\xd0|\x9 \x98,\xd3\x1O\xa4\x46" -"\x87\xa5\xae\x36\x5\x86N+\xfe#\xe3V\x1e\xca=\x97VC\x81\xb8\x45\x46\xb0\xad\xd8@\xdb" -"O\x92\xc6\x8f\x66\xf5\x33)\xfdU\xbd\x9a\xa7j\xb\xbd\xb2\x90\xf4\xd6\xd2p@n\xdbVI" -"NF2\xbaMp\x18\xb!\xe\xdfY6\xc9\x87 \n\xfd|}\xcb\xc0\x36S\x9b\x8e\xa2\x46\x13\x36" -"\xc0\x31'd\xb0U}\xcdKV\x15\x91\x31\xa2\xdd\x35-6d\xa4\xed\x34\x3n\xb\xc4\xcf\xc0" -"\xff\xdb\xf2\x8c\xb\xd8\xc2\x46\x8f;\xecZJ!y\xb8\x9c\xe0\x11\xc6\x9c\x45\x1f\x80" -"\xc3\xbf\xb7\xf\x63\x1d~$\xde|\xab\xd7\x82Kf\x8cv\x86\x37\x94\xc4J\xb7\xcc\x9d\"" -"M+'xz4Q\xd0L\xd1\xd7\x61\xa2\x2\x5\xe7%X\x8f\xf3\xf1\x33\x61n\xfd?\x85\x43\xc7\x31" -"\xcdg\x18\x31\xd8\x8d\x8c?s\n/\xee:)\xdd\x4wM\x80\xbcK\xa8\x85\xd3`\xf7\x9d\xa2 " -"\xf9q\x3\xda\xc#\x2\xf7\xe2\xf3\x8c\xa2\xdb\x9f\xae\xa4\x88Z9t\xb3\xc6]\xd9\x18\xfc" -"\x1eh\x12\xe5k\x83\xfe\x8b\xdb\x1c\xbb\xc8\x8b\xfdv\xca\x38/\x10\x41\x16\x82S\xbd" -"\xb7\xf0\x62\x35%@\xe1\xd8\x38\x8a,\xd7'E\xe\x8dX8%\xfd=\x18p\xf1\xda\x4\x30/\xd0" -"\xc2O\xf0$\x14-(\x9f\\\x88\x83\x8m\xd4\x13M_\"\x87\x94}\x80\xde SObYr\xf3\x18@\xb5" -"\xa5:\xf4\xe0\xf7\xe7\xd4\x66\r\xf8\xd0P\xd5\xa7\xd0v\x99^dt\xb9\x84\x9c\xb3\xaa" -"\xc2@\xd0\xb5J%h\xbbX\xcb\xc8\xe0xC\xd3U@\xf3\x87\xf8\x8bH6\xea\xf8(\x8f\xb0\x34" -"t\xde\xacJ\xdb\x7f\xf6\xb7\xc3\xf1\xa7\x14\xa5\x5:\x84\x35HT\xe5\xc0\xb\x9a\xfe\x9" -"_\xdf\\\xcd\xf9\x14\x31\x64[:\x9c\xf0\x13\x93r:w\xc0+\x7\xe\xcc\xd2\x8d\x89{\x9d" -"u\xd0\xc3\"\xa9\x92K\x1bo\x8a!\xfe\xc3\x87t\xb5\xf1\x94\xaa\xd0}\x81\xc6\xf3h\xa8" -"\xab\xc1,\xce\x9a\xb0`\xc6V\xb5'\xaa\x97\x99\xb3\x63\xf0\x32R\x1d\x10\xbb\xe3\xda" -"\x1d\x81\x1e\x30\xfR2\xa7\xef\"\x8d\xd0\x9d\x95n0@\x96\xb6\x3\xb6x\xdc$\x1a\x12\xdd" -"hh\"o\xe4\xad\x97qh\x9a\xb9xQ\xe7\xac\xc5\xa2\xcf=A#'\xd8\xf5+i\x8dS\x9c\x11\x1d" -"\xe0\xe2VX\xd2\xfb\x86\xa4[\xe9\xeb+\xad\x85\xe0h\x92\x94\xa6\x15\x85n\"\x5\xfa/" -"\x94\x96r\xdd\xc3\x87\x13.\xb8T\x13\x61{Ri1L\xe3\xc0\xf3\xa1\x8eT\x81\x7f{\n\xb4" -"\xb6%;\xfb\xaaJ\x16qi<\"\no\xf2\xec\xbf\xfc\x9d\\K\x4\x8c\xcd\xf4\x95uAd24\xa8mV" -"d\x8c\x2\xb9\xbf+d8#\x85\xbf\x43\xd0\x89\xab\xf1\xae\xaa\\\xfd\x9b\xd9\x46\xc3\xe1" -"a\x9c\x7fW\xde\x41\x65\x9f\x88!/\xb3\x9[\x94\xf2\xd6\xd6\xc5\xba\x13\xc5`Q\x9d\xf6" -"\x95U\xc9\xb7\x12lo\xf4\\\x61\xba\x46|)\xcd\xf3\xce\xa6\xe9\x10\xaa^\x16\x1aJ\xfa" -"\xf6\r\x39%\xd0\x1d\xe9j\xf0\x96\x94\xfdYp7X\x91\xd3Z\xbf\x64)\x8\x9b\x9d\x81i;p" -"\xe9\x8c\x18\x1Z\xe9\xcd\x3\xfd\x46{\xde\xa6\xbc\x9\xdc\xe2!a\xed\x97k=\xa2\xa8\xc" -"\xf0J\x83\xc5\x3`\xd6\xa2 \x0\"\xc0m\x99\x98\x9a\xda.'\x5\xbe\x9d\xc5\xa6\xce\x32" -"\x1\xe2\xd2&\xa0\xed\xaeP.\xf2r\xed\xdb\x88\xcf\x7f\xb3\xf2\x91\x16\xc5Y\xee\xf8" -"@^w\x5\x64UE\x2\x85'E\xd3\xd4\x8b\x1a\xd7\xc3M\xeb\xf5\xf1\x90\xfd\x2\xbc\xacyl+" -"\xe3\x80\x17ri `K\x19\x84\xec\xb3 D(\x18y\x7f\xa1@\x3\x11\x8d\xf2\x1f\x99\xab\xc9" -"\xdeO\xfd\xfd?\xa6\xba\xcc\x45X\xce\x63\xe1\x89\xcd\xb8\x5w[\xf2L\x8fo\xe5\xb6,\x13" -"\xde\xbc\x8d\x8\xec\xc6N\x4Y\xd8T\xda}\xe0\xfb\xe7O\xe7&s\xbc\x92\x12T\xf9\xe1\xd8\xb1\x39n\x82\x98\x89\x1a#\xe3\xd4u\xcf" -"J\xab\x97\xedyEXx\x9cTN\x84\x9b\x1\xa3\xa1t\xe7\x8f!\xf3~\xcc\x1d\xe2\x41\xad\x32" -"{[\xcd\xca\xc1\xea\x99[\x9f\x8\xdex\xa2\x82\xcc\xcb,\xbf\xca|\x0\x98&^\xdd\x8d\xcf" -"V\x3Z\xc0\x64nw\x11\x38\xb9S\x18\xa5\xef\xdc ,\x90h:\x93\x61\xbc\xab\xac\x2\x87\x1f" -"\x1eg`\x88\x8e\x14`\xbf\xec\x1a\x8e\x9c\x9d\x63\xbavRt\xd4\xf5\x2j\x8b\xb=\xadh\xbd" -"\xf9\x11[\xa8\xbb\"\xd0H\xfe\x8b\xaa`\xe9\x86\xf7|&,\x92)\r\xe8\xe4\x66\xf8\xb1\x9a" -"P\x1dKZ\xee\x1a\xb3{(\xe4\xd2w\xe1()\xbc\x46\x46Iu\x82\x62\x88PE\xb2\x9\xb1\xfe\xe7" -"J\xaf\xe1\x43\xf0,\xe5\xf3\x7fO\xbao\xe6\xb1\x34#'\xe8\x8f\xbc\x1b\xc0\xb4\x93\xb4" -"\xe1\xa3&T\x9c\x94\x8bo\xb8\xc4>\x80\xbd\x8c\x10`P\x9b\xf5py\x9c\xd6\x3 \x9aL\xb3" -"B\xe\x80\x7f{'b\xe2\x1d\x98\xaa\xb1\xbd\x63\xe8\x81R\x18\xf\r\xb9\xe4\xfd\xe5\xc3" -"e\x96\x14\xa1<\x9\xb5\xe1<\xdbx,\xdd^2\xa0\xdd\xf3\x9H,x'\x1c\x62\x97\xeey|n\x19" -"\xa5\x8e>P\xe0\x1c\x9fJ\x18I\xbf\xc\xee\xea\xe9\x1f\x64\x8b\xb0`|K}\x10\xa1)7\xea" -"\xe4\x9c\"\x99\xdf\x39\xbb\x10\x92\xc6\xdd\xdc\xde\xa4\xa5\x85%k\xa5s\x9b\xc1w\xb4" -"\x11\xeb#j\xf3\xebl0\x12\x83}\xc9\xef-\x83\xed'\xf6\xbe\xd0\x66\x97P\x8f\xc3\xad" -"\xd6\xa4n\x97\x46\x1a\xffu\x92\x66m\x91\x30JJR_ \x94\xa7\x83$\x0\xa8{!\xb1)b\xf0" -"c\xa9*l\x8c\xfe]z\"\xabh\r\xfc\xaf:nL\"\x11\xcf\xe2q\xfdS,P\xd2\xf$y\xc5\xf0\xe4" -"qs\xec\x8cr\xda\x8e\xaa\x96>kY\xb0\xeb\xb4\x9cM\x1fW,oC\x19\x65\xb9\xe2!z\xc1\xc2" -"L\xd2\xbf\xd8\x14\n\xe1}\xe9\x62\x63\xa6y\x90\xbm\x8b\",n\xbb\x93\xd1\x2\xab\x35" -"C\xc5\xc5\x3\xd1\x36w#\xc1\xe0>\x81\x8f\x61[Pf\xb5\x82v[\x6\x3\x86\xbf\xc3\"\xe1" -"\xd7\xce\x39z@[P\x13\xe3G\xcb\x13\x42\xd1\x38\xe6\\\xd5\xa9\x3\x39t\xd0>\xc3u_z\xc0" -"\x92\xc5\x9f\x32\xca>k\xcfM,\xa9\xda!\x0\x9c\x90[o\xd2\xd2\xd1\xe8\x9b\xc8@\xab\x2" -"]\x3PQ.\x3\xcf\xb0\xe9\x38\"\xa4\x9b\x38\xc0\x82\xaf\xc5\x34\x10\xbp\xba \x97\xff" -"\x12\x8e\xf\xa5\xb2]gi\xf1\x62\xed\xa8\xae\x80\xa4(\"\xaa\x2[j\xd3m\x1a\x63\xb9R" -"\xee\xda\xd0\x8d\xfaSm\xba\xb1v\xb8\xb7\xd4\xdc\xd0\xce\xb8}\xa4i\x16\x64\xe3s\xb5" -"\xc2K\xc2\xb2\"\xe7\xe9\xca\xe2\xbb\xc4\xd2\x31\xeb^}\xd8z\x12\x63,[o\x8e\xd0\x31" -"7,R\xd2/\xfa\xf2\xc5\xfe\x17\xca\xed\xe0\x1b\x65,\x86\x9$\xec\x85\x61\x44\xef\xa8" -"\xd1\x94\xed\x13\xd2.\xd0/!\xe3\x62\x13\xdf\xda\xf0P\x9f\xbc\x96g\x12\x1b\xe4S\xc" -"\x9fh\x1a\x1c\xa5\xe7K\xe0\xb6\xc4\xc0\xc8\x63\x96o\x9f-u4tKk\x95X\x7\x8d\xbevr\x9d" -"iCqK\xf8m\x8b\x9dL\x11\xf9J\xa6\xf8\xf1\xa3\x66\x5(mb\x95\x7f\xf1\xeb~\xc5\x32\xf3" -"\x81\xaa\xe1l\x9a\x1b/\x8e\xaa\xc3(\xb2\xc5\xe4\xf8\xa9R\x8a\x8f$\xc7w&\xb8\xc2\xc" -"{.M\xaaM\xc0\xa6\xcd\x90\x1bU\x8b\x7\nWa\x84\x90\xed\xea\xad\x36t\x83\x37;\xf8\x97" -"\xc3\x46\rK\xdaM\x88@\x3\xc5\x62s\x87\x36\xab\x1b\xf9\x14\xf2\xcb\xb5\x89\"\xf0P" -"\xf6Z\r\xed\x96\xd3\x42\x81\x9c\xac\xe6\x19_L\x93%\x1v\xb5\x14Q\xbe\x3\xde\xf3\xfa" -"S\x18\xdb\xde\xbf]\xb5\xe1\x10\x16\xf0\xb2q\xa0\x6\x46u&\xdch\x8e\xcd\xda\x88!\x11" -"4H\x8b%\x17#\xa6\x42\xeds\xd6\xa9\x10jwP\xbe\xeb\x3\x8\xe1\rJ\xbc!\x8b\xe2\x30\x8e" -"`\x89\xb0Z\x11'\xf8\x1c\xc3\x4\x96#6\xf3\x8b\xa1s\xf8\x5\xe8H\xc9@sn\x16\xfa\x82" -"\xac\ni\xac\x37\xfc\xb\xe2M9\xae\xd4\xdb\xf9\xc7\xb0\x8f\xb9\x42\xd9k\x8c\xcb\x39" -"a\xf4&v\x1f\x41\xde,\xa4\xe8\xeb\xe0\x39\xec\x64\x1c\x9d,\x19\xc7s\x9a\xf1\xa3O\x1f" -"*\xc1X\x80\x88j\xe6Z\x10\xf4\x82\xde\x12\x1aX\r\xc8\x30[;\x8d\xdb\xb8\x34\xf1\xba" -"m\x1\x36\x44\\\xf7g\xe\xe0\x1bi\x1\xe3\xda\x11\xdd\xa6u\xb3\x1c\x9\x96/\x17\x83\x45" -"\xd2%\xd0\x1c\x91\x6\x99\xd6\xfd\xf0|0\xb7n~:~\xec\x65\x83\x32(>\x5\x8c\xca\x83\xcc" -"t\xe2\xafl\xd1\xb5[\xb3\xeb\x88\x9c;\xec\x30\xed\xb\x98\x9a)\x92JR\"\xb9\xb1\x9\x9e" -"\xab\x1fu\xda\x7f\xf5\xc6\xa9\xbcT\xcd\x62\\\xe0\xa4\xb1n\x96(\x97I}\xe$\xc0\xbX" -"\x2O&:~\x97H\xed\x1eM?'\x3\x5\x95\xa4\xea:\xf3\xb7\xd3\xa7\x6\xd5\x81|\xa8\xfb\xbd" -" \xb\x90\xa3\xf0\x35\x6\xeI\xad\xb8\xc\x35Y-A\x9fK\xa3;\x1\xa2/\x87=\x19\xea\"t." -"\x8d\x1c\x7fsY*\xc1\x42\xc7\x8e\xde\x65z\xa5\x8c\x1f\x8ev\xce\xeaZ\x3\x8a\xe3\x83" -"\xb8\xea\xf9\x90\\\xf5\x7f\xe3!\xda\x19\x5*\xf9\x65\xf2\xf2\x9\x34\xca\x6\x99\xc4" -"\xfc\xdf\x1f\x65\ru\xb2\x15\xf5\xa4L\x1e\x5\xf2i\x8bU\xe5\xd0\xc7\x92\x38i\xce\x9b" -"h\xc8\xa2\x64\xb5\xad\xc1\x38\xde\xaf\x45\xc2\xa2|s\xeaL\x6\xc3-\xb3\x9f\x39\xe4" -"N\xb4\xb7\xef\xb7k\x90\xc4\x19\x19I\xcc\x11\xe1\x95\x9a\xbb\xf2\x17V\xc2\x17\x65" -"G\rXa\x8a\xed\xf3\x43\x39=q2\x4\xde\x92pSo\x10\x9\x44h\x1f\xc0:\x84K.\xd8O\x16\x85" -"\xf6\x7f\x81\x39J5\xa2\xc6]v\x81K\xf\x35,\xae\xe1&\x80\xe3/\xb\x86\xde\x65$P\x1f" -"\xc5\xbbJ\x11\xe\xaaI\xad\xd6\x92\xcb\xa0\xa1\xd4\xf6Kha\xf8\xe8\x8a\xe1N\x13\x9a{\xce" -"\xddL\x88>2\xd3[\x5mDv\xdbY\x90\xbc\xd8\xe6s\xfes}\xa6\xe1\xce\xfe+\x9eog\xc1QA!" -":\xa3\xd8\x1c\x13\x3\xfcLC\x15w\xc\x14\xe9\xa1,\x5 \xb5*\xb2L\xd3\x15\xbc\x35\x1e" -"\x5\xf1p\xf5,\x8f\x34\x7f\xf9\xcb}.\xddw\xf0\xf4\xcfP\xcf\xfb\x84\x63*sbz\xfb\x4" -"\xcf\xdd\xc1\x1btI/)\xca\x61\x41\x86o\x9c\x8t\x1bX\x9e\xa0,U\x4\x7~\xe2\xc6\xef\xd0" -"\xb5\xa0\x81J\x85?\xa9V\xdf\x10\xd1\xbe\x66w'C\xe1\xed\x8d`\"\rH\x82k,\xfb\x65\xbf" -"5\xfe\xba\xd3\x95O0x\xef\x6\xf3i\x1d\x7\xc5\x61\x84\xbe\x7\xfa\x19)R\xf3\"\xcc\x45" -"W\x11\xc0\x9d\xcd\\?\xab~.\xe2\x1a!pOs\x9c\xa1\xa4J\xb7\xfa\x83`oC\xcc\xb6\x18\xca" -"r\xa1\x85\x10\x8b\x91kNi\xb9I\x90\n\x65J\x8c\x31\x1d;<\x8f\xe0\x30\xff\xbf\x11\xab" -"\xce\x1b\x8a\x86\xbc\x37\x98\x32\xca\x18\xa3j\r\xc9\x61\x36\x1d\xcf\x61\xa5\x96\x37" -"\\&J\x8b\x37\xf0i\xc0\x8aP\xfa\x87\x9a\xd2\xfeG*\xbf\xc9\xcc\xe5~\x9b\x14\xe3\x15" -"p:\xf3\x9I\x14\xf0\xbdv\xba*\xb4\x46\x94\xe4t\xa9'\xd3\xfd\x9b\xbf[.\xa2\x8f\x34" -"\xeb\xb3\x66\xa5\xe\x5\x31\xe9(Z\xc3\xda\xc9{\n{@\xbd;Q\x1aU\x89\xf8\xe2\xf2\xb3" -"\x84Q\xf6Z-&\xaaN\xa2K\xe6\x33\xbb\x96\xd8\xfa\xe\x19\x8f\xa2|\xecw\x8b\xa6\x8e\xf2" -"\xb3\x9d\x80h\x9c%\xbd\x44\xcd=\xa6\xfd\xd5\x8cz\x8b\"\x5\x37\x9b\xa5\x84\xab\x11" -"j~\x18\xd7\x9\xb5^\xec\xcf\xa5\xdd\x0Jr]\x9e\xec\xb5z\xf1!\xe4i^\x8e\xf6\xb5\xc6" -"\xf1\x15\xd7\x87\xad\xda\xfd\x64<\x9a\xfe\xd6t{\xef\xbcK\xf6\xeb\x97Tr\xe9\n\x88" -"\xda\xd9\x9c\x61\xf\xf4\xa2\x9e\x9f\x10\xbb>1\xfeQr*\xac\x41\xb5\xab\xf2\xdc\x32" -"\"\xb1\xb4t\x2\"\x32;\n\x17Z[K\xa0\xa5\x4\x64\xfb\x97\x0\x30}m\xdc_\x89\x8f[\xf3" -"\r\xbc\xee\xc0\xef\x18\xa1\x1c\xa7\x95\x99\x3\x7(\xb3/\xfc\xcb\x3\xddr\x96\xc2|\x18" -"\xcc\x4\x7r%\xc5\xe7\xaa\xf\x15\xdf\xb8; 4\x4\x96\x14\xf4$\xf3\xfbH5\x99\xd8\xa8" -"\n\x1\x7v{\xe7\xa0\xea\x37\xfe\x84\xab\x38\xf5\x86K\x17j\xe2\x97\x11m{\xff\x35\xe" -"\xf0\x87\xbb\x19\xea\x66\xb3\x1d*\x82x\x18\x18\xabh\xb3\x46zP\xc0Q\xa3\xfd\x14\x38" -"\x1\xe4hD1\xf3%\xf0\xe2\xae@\xc3\x96\x12\xf7\xad\x91\x1a\x35\xad\xec\xce\x6T8\x9d" -";\xcd)\x97\xff\x95\xa3GbA\x1ar\x16\\\x9\x44\x15\x35\x8c\xa9\xba\xfb/3\x84\x7\xbe" -"\x1dy\x1ekquuV\xa4MtK\xb5:&_\x18}QV\xda\x61\xd5\x42\x8aS\x99\x64S\xb8\xcd\xf3\x39" -"*~\x89\xa3\x1\xd1\xc0\x37\x38\x97U\xe7\xd8\x9a\x80\xe2\x9a\xd7\xa0\xc\x83\xd4\xa2" -"K\xfd\"\x86[\x6\x95\xeb\xf7S\x87\x38\x9\x95GD\x98\xcb\xaa\xehC\x8f\x41\xee\xa9]w" -"\xf6\x61N(\xc6L\xb0@\x9k\xca\xab\xad\xfd\x9a\x9b\x64" -"\xa1p\x0\xf2\xe\x1a\xad\x16\xcf\r\xfb\xcb\xf5\x4\x83\xc2\x8e\x13\x13\xc\xe2\xf4\xe8" -"yww\x0\x1f\x2\xa3\xdfT\xbe\n\xfc\x94v.\x8e\x31\x93\xb8\x84\xa3\xed\x95\xce\xda\xa2" -"-\x80\x32\xb9\x8a\x80\xe2u\x96\x86\x83\\\xef(\xe5%\x10M\x1a\xa7\xe7\xd0\x85\x4\x1" -"\x17l\xb6\x93\x42n@6\x9d\x39*q@\xc0\xa4t\xf\\X\xd7\xe5\x9\x8f\xb2\x1e\xc5\x61%\x36" -"2\x1e\xf0WQ\xa5\x13\xeb\x7\xde|\x8b\x9a\x66\x8eJ\xd2\xb3@9\xb8G\xcb%\x93\xc5\xc8" -"f\xc7\x19\xa1\x18K\xf3\xf\x97\x9e\x31~b\xfbK\xd6\xe6\xf3\x35\xf2\xf2|K\x8d\xfd\xe9" -"\x9fL\x90\xef\x8bu\xe2\x9e@R\xdb\xf\xcd\\\xc7\xb6L\x98T\xc9$c@\xb5\xdeo\xd9\xb6\xd7" -"\xcd\x1c\x8b\x8.\x81\xee\x8\xe8\x9<\x14\xdf\xd4\\G\xb\xf7\x87ZtR\xb2_m\x86\xa8\x6" -"\xef\x45=`l\xb4o\xa6=\x94V\xf9\x9a\x17\xabm\x98\xa4\xc3+\x7\xb3\xb9o\x10\xfe\xaf" -"\xc9\x97\xa1'\x1bT\xabIC\xb\xda\xb5\x87\x1b\xacsOE\xd3\xcc\xa5\x1fRB\x9eS\x93Jv\xf3" -"\xc4\x16\x9\xda\x9c\x46m\x89\x35\x1b\xa8\xf8\xb6xmcu\xe3 \xda)\x97\xd6\xc9Q\x8ap" -"!\x5\xdbm\x91\xe2\xbc\x9^W,\x9dg\xc\xf1\x9f\x8\x88\xcf\x1c$.\xd2%\xe3\x65;*N\x7\x82" -"\xb\x81\x5\x12{\xf0N!\x97\xa5\x7f\xec\xb4\x62\x81\r\xe\xf4\x15\x38\x93\xc6\xff\x92" -"\xec\xda\xb4|\xd9\x1b\xdb\x6N\x1a\xa0m\xb6\xd2\x3\xf2\xc8\x9a\x9\x15>\r\x8f\x81)" -"J\x89\xbb\x83U\xe0\x15N\xb6\xd8\xc8s\xb0I\xd2\xec\x99\x8c# \xdb\xa6*Gj\xa4#\x5\xa8" -"7\xeeGuq\xf\xaa\x43`\x9\xcd\xe4\x89T\xfc\x8\x8f\xb8\x97\xe5\x65\xa5\xdf(\xb5s0\xdd" -"\xeb\x14\x97\x13\x8d\xa7S\xa2\x8\x8a\xfa\x90\xf1li\xe\xaa\xb2\xb7\x1e\xe5\xf9T\x90" -"\xe5\xc4]./\xf3L\xc0\xec\xcd\x94\xed\x9\x19\x0\x95\xc0\xf2&'%a\xd3I\xad\xf2\xa1\xf5" -"\xeb\xe3\xec#\xfbmCC.\n\xcb\x38\xc3\x94\x85\x96\xb4\xbc\xfe\x66\\\x34\x1c\xe0\x6" -"\xa1\x97\x9e\x89'4d\x5\xbcy\x1f\x8?\xa4\xa4\xa0\x14\xa7\x8)\xaf\x99\xf5J\xdbt-$\xa1" -"\xbf\x81\xa6\xd6)\x86\xdch\xf1\xf2)\xf6\xf6\xd1\xbf\x18\xb4R\x9aT[ \xa8\xe6T\xbf" -"A\x17\xb4\x8\xb6\xb8o\xf\x8a^\xe9?!!^\xe6\x9e\xbb\x98\xcbx:\x87\x84\xee;\xefK3\x9d" -"\x84\x39\xa3^\xdc\xfe\x98\x9a\xfG'kw#\x13@\x87\xc4LDM\xd0\xd4\xa4\x1c\x62\xc1\x8" -"\xe0\xd9^\xad\x8f\xa3\r\x90\xa8\xd8\x7f\x9a\x10\x86\xf3\x11\x83\xe4zTJ\xa9\xc6\xb7" -"\xc6\x31\xbc#\xb3\xe4\xdek\xd0R1H\x92o\x18\xfc\xe8\xa7\x84\x1cs\xb4v\xfa\xc1\xf6" -"}#\x94\xf4\x65\xe1\xdf%\xa2\xec\x14]\xff\x15\xb8\x31\x95\x30%\x1a\xf1\x81S\xaf\xfc" -"\x15Q\xd7\xb3\x81\xcdM\x19\xab\xa0\xb4\x97w\x9b\x42\x2\xb8+\xf4\xac\xbfL\xd2L\x9e" -"\x12\xf6\x5\r\xc8\x45\xae\xd8\xb\xed\xf0\xb0\xb2(\x2\xce\x89\x35w\x6@o\xd5\xf2j1" -"\xb5l6\x88\x16R\xaa\x34\xd0\xa3\x1f`\xe8\x44P\xd4\x92\x99&\rp\xc9xh\x9c\xec\xab\x19" -"o3\xd2 '\x91\x42\xff\x39=0\xac\x8f\x8f\x95\xa2(\x13\x17\xf6L\xfd@*h\xafW1r\xcc\\" -"k\xac\xc5M\xfe%\xf4&\x6\xcco\xf7\x7f\x15\xe2\xdd\x42\xe7\xca\x9f\xef\xe4\nY\xe9\xfe" -"\x99\xb-\xdePt<\xc2\n\x16\xa0V\xf8\x0\"\xbcm2\xc6\xc9\xf3\x95\x99\xb6iyo\xf4\xef" -"\x8c\n),\x15\x8d\xff\x87'D\xea\x1e.\xd2K\xc5\xf8\xeO*9\xe4]/\xca\xd1\xd9\xf3\xaa" -"\xed*:\";\x99LU\xdb\xd8|\xe8\xc7\x8n\x88\xa1\xf1\x12tG4\xb3:p}\xf7\xac\xf0_t\xd7" -"EEZ\xc8\xd8\x33\x93\x87\n.\xfc!\x19?\xf4\xe3\x10K\x89\xb6\x7furY\xa5\xd3*\x90v0R" -"s\x1bT\x9f\xc9\x17\x97J\xf2^\xc3\x33\x66\xad\xea\x18\x9\xb6\xa2ui\xeb\xd0g8\xfb\x89" -"\x1e\xe7\x17\x8c\x45\xaa\x46\xc3\x97\x14\xbz\xe4r\x85]\x83p\xfbilH\xe3\xd8\xd1\xf7" -"\xc3\xbd\xadN\x0\xbd\xd0\x97\x2\xbc<\x9a-ul4K(ak\xa3I\xfb\x9ey\xd8\xb1\xa1(\x16\x4" -"\x81\xc5\x3\xe9\xf8\x88_\xbbo\xfay\x8f\xbf]\xd1\x80\x9b\x4\xc8VF\xe6o\xc\x34o\xd7" -"\xd4\x66\xb8>e\xa4\x87\xdc>K\x15\xbf\xd2\x4\xb5s\xa9\xf1\xc6\xc9I\xd3sH:\x15 \xeb" -"\xc7\r\xfe\xe0\xa1\xe3\x83\xf0\x61\xd9GQ\xaa\x14\x8f\xdby\xf1\xae\xf2\x12\xf7\xde" -"\xfd\xc6\xf4\x1f\x33Hp5X\xf1lE\xfd\xb\x43\x92\xb4\x17\xcf\xc1\xb2\x1d\\N\xd1|Gp\x96" -"\xce\xcf\x8e\xe7\x86\x88\xd7\x7N0\x9b\xe9\xb5\xcah\x1a\x10\x98\x15\x8e\\\xdc\x16" -"Tu\x9b\xaa\x5\x82\xc7\xc3\x62\xec\xaa\x0\xe5\x1\x91\x13l\xfb\xac\xfc\x10G,\xe3L2" -"]u\x9b+\xf2m~\x6\x97\xaf\nu$w\xb2\x9b\r\x9\xec\x31\x95\x8\xff\xe6\x90\xf8\x46\xfc" -"\xa2\x9d\x7f\x7f&Vf\xd7W\x9b~\x8f\x1a\xce\x9\x86\x8c\xfd\xc7\xad\x92\xe7\x1a\x9b" -"'>\x2\x9b|'\x81\x64\xf4+\x6\x7fI\xc7\xc8\xba:\xc4\xd7\x5\xde\x83\xe8\\\xa2\x11w\xf3" -"\x8f_\x1e\x9a\xcao\x90\xbf\x38\xd8_\xae\x32N\x1a.\xb3u\x8d\xe4>\n\x91\r\xb6\xcd:" -"yF\xc4\xfe_\xab\xa6\xf2\xf2\x11\xf4/\x10\xa8\xd3\xe1\xf7\xa6\xbcl\xb9){\xa3;\x4v" -"7a\x82\xb7\x8b\\\xf5\x88\xfd\xc3ut\xcbo\xe6`\xa6\xd0\xc5O\xb4\x90\x86\xfbT\x86J\xc0" -"\x8\xa4\x7fg&3)]`\xce\xd2\xff\x9av\xf8\xaa\xbc\xc4\xc4\x5}\x11\\\xe\xe9GN|\xe6\xaf" -"\x8e\\\x9a\xcf\x30\xca\xf8\xd2l\xfd\xa1j^\x9a\xb7\xeb\xb4\n\x9e\xa9\x34\xaa\xeb\xcc" -"\x1d\x2\xd1^_\xea\x5\xb\xf3\xdb\xe0\xa3\x9\xa6\xbb\x38s\x96%\x1e\x36'\x15V\xc5\x3" -"\xf9\xd1\x99\x8e\xcd\x9c\x9a\xb8\xb6\xe8\x8c~\x1f\x32Yl\xe1\x83\xc3\xe6\xc8q\x9b" -"\xcc\x4\x94\xa5r0\xe7\xfa^\xf9\xb7\x85\"\x90\x13\x8f`\"\xf6\xd3\x0N(\xaeQ\xea\xb1" -"\x13\xc0\x99\xed\xe4\xabms\xaa\x1f\x8d\xd5\xa4\xff\xbb\x88\xd6\x92\xb0\x17\xe3\x13" -"KU\xcb\x41lq\x1>:\x7f\x4\x92\xa7y\xcf,\xd0\x30\x82\xee\x64=%8\xe0\x93\xec\x92\xad" -"q\xcc\x99\xa0\xc6\xb2z\xe5\x2=\x97\r\xc1\xa9\x99%\xe5\xebL\xa8\xd5\xd8>\xb1=.\xf8" -"}f\x13\xc4M`\xd2\x9f\x8c.\xa6\xb0\xc0\xb2Nxn\n\xea\xd6\xb6\x45\xcb\xb6\xe1\x1c\x96" -"\xe2\xd4ls\xde\x38xb5\xd5m\xb6\xbc+xm\x9d\xd8\xe1\xdc<\x8b,.\x82\x8e\xe0\x11\xa1" -"\xf8\x16\xda\xe7\x8c\xe7\xfc\xcd\xee!\x2W\xf\xa9\x86\xe8^U\x81\xb1\xa8\xb8\xed\x8d" -"k\xd9\x8a\xf\xe4\x8c\x98\xb0\xef\x14\xf1\xd2ML\x82\xbf\x8aG\xb2L|\xab\xc1\xd3}&\xec" -"Sz\xabk7Q\xdd\x8f\x1\x81\xac\x8\x1b\xa0\xb1\xfe':\xc1\xe1\x9bP\x8c\x65\xd4\x7\xb9" -"\xc6\x61\xd4nd\x1\xa5s\xc7\xad\xe9\xa6\xf6H]U\xda'\x87\xe7\x9f\xe0\x8c\x14?\xd9\xd2" -"\xa7\x46\x2O\xa4'<\xea\xff@\xe9\xb6\xc8\xa0\x10Q\xf4\x82\x88[\xb8\xce\x46\xe4\xd2" -":\xeb\x88\xb1\x66/\xa3m\xbf\x41\xfep\x96\x82r9\xf4'\xbe\xef\xc4\xc4N\x14\xe5\x46" -"\xefR\xbdMhZ\xb4\xe6\x4\x0\x14\xf1\xa5*^q\xa2U\x6\xf5\xa2\x16\x33\x1\xfa_f\x19\xd2" -"eM\xb0:\x90\xc6\x84\xff\xa9{\xbc\xad\x46w^\r\xeb\xea\xf\xb9\x8\xf0\x88\x46\xc5\x9b" -"\x95\x14\xe1[\x8cI\xb9S\xe6\x43\xf4Q\xd2K\xf\x15\xbb\x93\x10\xd6r\xe3\xd8\\]~\xcb" -"\x4\x39\x8c\xf1w\x8al%\xc6L\x13G\x9\x32\xc8Q\x1dwBw\x1f\xa4\xe^\xbd\xb4\x38T8\x6" -"L\x9d\xfb\xb7\x95\xa8\xe0U\x84\x39\xd9p\x94\x86N\xf0\x8c\x82\x9a\x94\xc4\x97\x83" -"\x97\xa9\x1\x1b\xc\xcc\xa9\xd4*)\xe4;w\x11\x8a\xec\x94\x84\x91\xbc\xb9\xd4v2\x8f" -"\xad\xfe\x5\x82:\xf4\x89Jw\xea\xebXC#\xbf%\x30\xfb\xb5\xa0\r\x30w/\xbf\x97\x8\x19" -"\x82\xc1Z1(Rw\r\xab}\x9b\xc1\x9a\xb7JMkvSz\xefj\xc8h&\xce\xbc\xc3\xa7\x7f\xaa\xf4" -"#\x8d\xfb\x4\xa0/(\x8a\x63\xc4\xf3\x90\\\x8NL\xd0\xff\x35\r\x1c\xef\xac\xe9+\xe1" -"\x95\x91\x8e\xc3\x32\xc8i\xa9\xcd\xa0\x8d;s\xa2!\xce\x99\xaa\xd7Z\xdb\xf1\x95\x9f" -"|\x10o\xdd\x98\x14%\xdf\x9c\xc0\xaa<\x15<-\xa6y\xef\x34\x8f\x13P\xc4j\xb7O\x10U7" -"\x99\x1f\x0\xe6\x8e\x4\x64\x91^OSp\x7R\xc0\xbrA\x10\xb2\x61mGr\x6\xef\xc4\x17\xec" -"#\xf{_\x15\x8f[pn'1\x8c\xdb\x1W\x8\x96\xdc\xdf\xfe\xf0s\xfb\x9b\xca\xcb#\xd4\xba" -"\xee\x95\x39\x7f\xe\x98\xe3\x98\x61\xdfG\xa5\xcb\x1!\xac\xc2'\xd5\xd2\xab\x8c\xfe" -"\x4\xa5\xde \xa1r\xe1\x14\xec\xa6\x9a=\xfd\xf3\x86\xf0\xa6?~j\x89$\x87M\xe6\x8f\xd4" -"\xd2\xe0T\x17\xa5H\xc7T\xec\xd5\x95\x42\xd3]E\xad\xfc\xd2\x96\xf8\x8d\xccR\xa0\x9e" -"\xb9\xe7t?\x88\xebs\x18\x66\xac\xddO\xd2\xf2\xee\x4\x13\x61\x42\xe5~\xc2\x93L_o\xcd" -"\xa6}'\x1a\x3?\xa1\xd8\x8e\xb7\x94I!o\xcd=-\xe7\x1a\x31.\xdc\xff\xff\x9c\x5`E\xa0" -"6\x9f\xf7\x33\x87\x14?\xf5~0m\x99\xac\xdd\xb6\xdc\x30\x8f\xf9\xa5\xb3\x8a\x90\xbd" -"\x8bm\x9cz\x80+n\x11\n\xc3\x92\xae\xd8\xd8\xbc\xaf\xa6\x31\\\xfd\xe8\xca\x7\x36\xde" -"\xa3\x37\xabV\x91\x1\xb7\x9\x85\xc1?\xd5\x98\x15\xb3\xd2'\xd8\x4\x1$\x17\xcdK\xda" -"\x9b\x34\xf8\xf1\n\xc9\xde\xdfM\x8a\xdb\x30\xee\xaf\x3\x9V\xd7G\xf5\x8b\x36%\x1d" -"\xf2w\xac\xbb\x19\xe5\xd4\x36\x34\x98:Z\x16^S\x82q\xae\x35#\xc2K_u\x8a\xdd\xa5\x63" -"\x5\xff\xfbz\xb0\x62\x15\xe1\xce\x4\x1b\x8{\xb3\xf6x\xf8#\xac\xe8\xe2\xb1\xd0\xbb" -"\x90o_@@\x80\x1egk\xe1\xda\xc3j\xc6{\xb9\xf0\xa4\\\x66\x38!m0\x83L\x1o\xbf\x63s\x1a" -"\xf9<`\xa1\x46\x92\xbf\xc3\xef\x8e\xf7^\xed<\xac\xdc\x86?a\x9a{\xbd\xce\x44\x1\xcb" -"\x1e_L\xc8\x30\x1e\xaf&\x19\x9f\xd3\x17\x1d\x97|7\xda\xde'&\xb7\xf1\x8cv\x8d\xed" -"\x89R\xf\xdf)4\x9\xd2\x9\x10q\xb9\xcc\xcb@\nlvT\"5\xcd@\xf9\xe9\x35\xbb\xaa\xda\xc0" -"BC\xbb\x42\x34\x30\xe3\xcc\x4%\x97\x94\xd6P\x7f\xdcx\xd2\x34\x92\x80)xji\x82(\xad" -",yql\xb2\xb0\xa2\x9t\xb3ijx\xe9\x96Vo\xf8\xe8\xbc\xd4|\xd7\xc\xac\x9b\x80\xb6\xf5" -"\xad\xca\xfe\x8<\xf2\x9a\x41\xa7\xb7\x61\x64\xac\x41\x7f\xdb\x66\xc\xf2\xe6\x4&}" -"3!\xabS\x1f\x9c\xb4\x34\\\xc5\x45\xbc\x36\xdc\x34\xe4v\xa9\x84S\xdb\xce\xca\x98\xf7" -"ukX\x16\x8f\x9f\xfbWS~\xd8\x37\x1e\x1b\xef\xa7\xb5\x37\xe9\x1c\x1d\x11\x45\xaf\x41" -"`\xe5i\x1a\x32\xa2\x1f\xa0\x11Z\x9e\xf7Q\xb1\x63X\xb6Hg`\x1*\xdf$\xed\x30\xf6\x61" -"\x3\xb1\x8a/pQ\xc0\x1c\xd1\xa2\xe0NZ\xbcy\xc0\x99X\xb0\x8b\x31Lj\x97\x8a\xcb\x1b" -"\x88\x5\x7W}\x2\xd9OwS\xb7\xa1\xf2!\xc7\xe3\xf3\xb2\xa5\xaa\x96\xd5\xf1\x8e\xbf\xf2" -"w\x1aU\xed:)-\x8\x9d\x85\x61l5\xf0\xb8\n/{I\x9d\x88\xf2\x0\xdf\x44\xb2\xdar\xe7\x99" -"]1\xfe\x38\xac\"@\xee\xda\xd4\x5\x94\x14\x37.e\x9b\xcau\x17\xc4\xcc\xff}\x8a\xf9" -"/\x89\x3\x42\xf1\x3\x19\x15o\xf9\xb3<\x8f\xdc\xf6\xf7T\xde\xfb\xc5\x8bt5\xd7\x19" -"\"l{\xf9\xbd\xe4\xc6G\xbd\xd3\xb1\xf1\x42\x61\x37\x9b\x43(\xfd\x1b\xfa\xaf/z\x80" -"4\xbf\xbf\x45\xf\\_uE\xb\xc1\xa3\x99$N\x8f\xe\xff\xb1Tq\xb\x85\x4o\x19{4z]G\xea\x97" -"\xd0\x1ck\x80\xb8\xe1G\x15\x9c\xc2\xb9oc\x17\xd8\xc3\xf4\x65NY(2\x8f\xb8\x44\xc6" -"\xae\xbb\xc4\x87%\x7f\xab\xc2\xcfv\xd3_|w\xb7\xee{\xa0\x35\x88\x8d\xc8\xa1\x15q!" -"\xb\xa2\xb4l\xc2\x3\x65\x64.?t#\xbd\xfc\xe2\x97\xd0\x83\xaa?2}\x97\x1\xf1O\xa6I\xf8" -"v\x93\x1f\x16\x34L\xe8\xc8@\xd4\xe3\x81\xed\xf3\xb8\x15\x34\x88\x87\xfd`|Cs\xd1\x87" -"\xeb\x86,\xd4\xbd\x15\xb\x64\x89\xa3q\x8c\n\xcb\xdb<]\xcc\xe9)\xa3\xc8\xd0s\xb7L" -"\x82\xdc\xfd\xd7\xac\x31<]\xc3\xa0\xf8\x4?\x8e\xbc\xeb\xa4\x34\xe3yU\x8e\xe8\x8c" -"\xf9\xce\x1d\x91\xcaY\x8fL\xda\xa2\x94?\xe7m\x9a\xae\x39\x8\x7f\x86v\x97\x32\xb0" -"\x15\x1c*\xec\xcf\x1dZr\x89\x62I\xad\xd5-<\x94\xd3\x16\xea\xc1!\xd1#]\xd6`\xf6\x42" -"v|\x14\x8b@\x11\xbc-\x8bW\xd3\xa3\xbb\x65M#\xc7\x64`\xc9\xa7\x82>g\xcc\x6X\xd9\xa5" -"\x1eO\xd4\xfe\x31\xf0\x37\xd3u\x3\x90\x11\xadL_\"\x98n\\\xb6=\x2\x36\x31\xb8=\xf8" -"\x0\x92\x46\xa5\x88\x19>\xe2\xb5\x62\xff\xe2\xea,'\x13\x94m/G\x9f\xbe\xdc\xea\x97" -"\xe1\xa9\x80g\x1b:+\xfc\x8e(uU+>\xb7q\xea\xfv\xdfO\xca\x15\xf!\xe2\xd9\x82\xbb\x1f" -">\x85\xc7z\xe3\x7lsoN \xdd\xf9 \xb7\xd0\xd0\x91\x96\xd5\xf7&\x8b\x83\xb4\xf6Wm\x8" -"%\x90\xc6)\xa3t\xe6\xe9\x35\x88p\x90tw\xda-\xb8\x1f\xad\x82\xa4Hz\\\xcfZ\xc1\x86" -"*\xbb\xc9\x85\x19\x11\x35t\xa5\xb0h\xbd\xbc\x13\x87\x82\x33\x37\x8a\xd4\xed\xc0!" -"\xc1\x9e\xe3\xa1;\xbb\x9$\x8e\xb4\x31\x4^\xed\xd0\x8b\x95\xee\x5\xd5\x11\x6\xb0\xff" -"\xc5\x8b\xff\x9c\xa7|\xd2\x63\x8\xc4\xd0?@\x18\x80\x9e\x86\x80\xbc\xd9\r\xf5\x82" -"3!\xd6\xadw=\xc1\xf0\x63\xf3{\x82\xfc'\xbeP]\x12Ku\xe5\x92\x41\xed\xc\xff^\xa1\xd8" -"\x1d\x45\xe9\xe0\x34\\.m\x99\x15\xb6\x33\x5\xb1\x33\xacz7\xf\x8bm\xd3q\xd5\x7\x1e" -"\xb7\"\xcc\x32\xcc-\xa3\xe0\x8b\xb2\x17\xb1Ga\xca\xe8\x1k\xbb\xf5\x65\xf0&\x95^\xeb" -"=4$9\xc7\xf4\x7,\x4\xe8kq\x15\xc5$\xcf\x80\"\xed\x1\xe6H\x96\x3\xff\r\x93L\xbbY\xfb" -"\xf3,\x89\xcc\xb2\xdf\xf3+RZ\xb2\xb1\xd3\xc8\x1e\x84\xbc\xc3~2N\xfe^\xf5\x80\xdf" -"\xe9\xfbMb\x91w\xc7\x82\x5\xe3\xfa\xf0@\xd6\xa3\xc\xb5\xc-\x88\xa0y\xb\xb6-U_5d\x18" -"\xf4\xc7]\xfej\xf6N\xc5\x8b\xc9\x5\x42S\xf0\xcb\xc1{\xe6l=-[PYu1\x11\xbdh\xb2\x82\x8ev\x18\x61\x8L\r\xbb\n\xfb\x1d)\x92\x8b\x91\xc\x10" -"1\x17\x91tr1\xc4\xa8\x87\xec\xd3\xb9\x92\r\x45=\xee&P4nQ\x0~\xe9\xc2h\xfep\xdfn\xe\xb8\xf4\x12\xa1\xe0txw\xf6#[Qmz\xb6" -"\x8b\x2\x9f\x8f\x43i\xec\xe8jw\x1b\x89\xe9\x8b\xbe\xf2\xb4<\xf6\x99\x45\xc0\x1e\xf6" -"\xe.4\x9/\xc5\xfb+\x14m\x8c\x1d\xba\x83\xb8r\xbb\xda\x95\x84-\x11\xac\xc7\nU\x1d" -"\x8e\x95Q\xce\xa0\x18\xda\xf8\xbf\x32\x92xZ\x9b\xff`l\x1fs\\\xf4:\xbd\xf\x64\x19" -"\xcfu\x92\x9e\xfe\x45\xab\x66R\xa6\x31\x45w\x9 \xf7\x39\x81L\x6\xb9k\x15\x91\xfa" -"d~\x92\xc5\x63\x3\xaeZ\x82\xa1r\xfc\x9dN\xb9\x36\xeb\xa6$\xd0\x16X\xc\xc9\x8c@\xa9" -"\xa7\xba\xa9\xde\xe4\x94g\x15\xab\xfd\xd7\x99\x93V\xb8\xcc\x39\xea\xdc\x0\xf4*\xad" -"\xc0\xb1n\x17\x8c.f=\xa2\xf4\x64\xc1\x80\x96\x44\xab\x17\x96\xeb\x82\x90\xf7\x6\x84" -"\xa6\x17k\x8\x14\xe6\x89\r\xa6\x94g\xa6?t\xdch~\r\xd0\xf9\xa7\xa1\x84\x85\xd1\xa6" -"\x85\x9|2\x84\x81\"\xc7\xa2\x11\xc2\xdar\x84R\x0\xc1\xbe\x63\xfd\n\xf2\xdc\x8a\x10" -"\xb5\xc8\x80pM3\x97]\xcc\xfc\xa0P\xf0\xd4Z\xad\x98\x7f\xb7\xfa\x62\x9c\xc2}\xfe\x90" -"\xec\xe1\xf5R\xea\xe5\x46\xca\x8b.\xe4}\x9e\x34\x9d\xa3.\xe\xb\x14S\xe6<\xef\xe7" -"\x2\"\x34\x99?\x82\xe3\x5n\x4_\xae\xd9W\x12&\x1d\x33){\xcf\xa9\xcf\x11v\x8d\x81\x16" -"\xd1\x43\xe6S\xc6O\xe8\x98'\x90\x86G\xc7\xb1\x94@.\xcbH\xa7\x32\xe7@$\xf7J\xac\x33" -"\xcf\xf6\xec\x9c\x97\xdf\xab\xaa\xf7\x35\xadVE\xb5\"\x30(h\x8c[\xf8\xba\xdf\x9c\xf6" -"Q\x9bo\x8\x7\x63\xfc\xc4\xaa\xab\x8dJb\x95\xe1\xe7\xf7:\x6\xa6\xdb?\xd2\x86\xec\x63" -"9(\xa2\xbd\xd3\x31x9\xda\xb9\x8a\x85\x1d\xdf-\x8c^s\\\x8d\xe\xff\x4\x62:\x9c\xb2" -"g\x9b\\\xf8\x46.\xed\xfb\xa9\xc3r\xf6J\xf9\xa4\xc8\x0;f\xa8\x15\xf1O\xd7\xcc\xff" -"\x14\xad\x1a\x9c\xdd\xd1\xaf\x80\x5\xc5 \xdd\xe0\xa8\xed\xa0\x7\xa4J\xaa\xdb\x82" -"\xecR\xb4\xdb\x31\xc3\xd7\xb1%-.\x7f\x80\x46\x1a\xa9G\x9e\x9d\xf2\xdd\x37\x1f\xf1" -"\xca\x90\xb0#\x94T\xbc\xd1\xd5\xcbK`\xb2v!\xe7t!\x9b^T\xe\x6\xd8\x63\x13U\xb7\xdd" -"& \xbb\x1c\xb6\x43\xd3\x87\xd8\x80MT\xf8\xf7\xaf<\xda\xdc\xe2\xfem\xab<\xed\xa6t" -"\xd3\xaf\x4\x35\xd2\x97\x96\xd0\xa4_\r\x9c\x18\xcb\xe6\x41K\x9c\xd5\xe3l\xae>\xbc" -"7\xce\x15\xad\\\xaa\x9ch\xcak\x1e&\xe5\xcd*\x92\xc3\xf4/A\x1\xacKi\r\xfe\xc2\x90" -"\xb0\xc8i\x9b\x3\xae\x91\x9f\x8eSZ\xd0~\xb6\x9\xc8\xa7\xac\x12\xc6@\xe7,rs\xcf+\xff" -"jYs];\x11\xae\x90n\x83\xdb\xea'\xck\x11\xea\x83\x7\x8f\x81\xf\xa0\x46\x3\xa6\xb0" -"\xd9rv\xe7\xadw(\xfdN\x99\xeb\x39\x12\x7;\x6vI\x11`\x1\x8b\x0\x8a\xfc\x80m\xbdl\x98" -"\x92\x15\xf4n}\x4\xa9\x61V\xf2Y\xa0JMD\xb1\xe9)_G\x1e\x9!\xdf\xc6\x1a\x63\x1e-p\x8c" -"1\x87\x17X\x3\xf8\x4\xf6\xfb\x11\x97\x33\xa8Z\xc3Pi>4\xfa\xea\xccK\xbc]\x9\x1c\x38" -"\xfa\xb4\x46\xe9\x13\x9f\x62|8R-\xab\x91\x64S?\xaf\xce\x83\xf8\x11\x18_&\x8e\x30" -"\xec\x43\xff\x46\xe5k\x0\x43\x95\x8fR\xf1\x44\x3V\xb4I\xc7\x80\xdbyl&\x95\xbe\xfd" -"\xfe\xbe\x92\x86\x90\xcc\xe1\xb6\xa5\x30\xb0\x42{N3\x89\x10\r\xc8\x61\xa5\xe\x1d" -"\x9e\x4\xbfq\xb4\x9d\x90\x1b\xb\x9d;\xec\xbe\xcc\x33\xef<\x83\xeeyf8|d\x0\x82\x99" -"\xac\xde\xb2\xf1\r\x81\x9f\x0\x37\xc5\x6\xbe\xf9\xee\x35\x33\xaf\x88\x6\x14\x33" -"\x9d\xe2,\x88\xd4\x16W]T\x5\xe3\xfe\x1f\x39,\xa3\xa1\x88\xcfo!\x18\x45\x15\x12M\xed" -"\xc6\xf2/\xb5\x3\x3\x80\x9f\x11\x8b}\xf3\x38HZK\xc8\x7sq?L1k\"\xbe\x1b\x8c\x1c\xb4" -"\xa2\x81\x19\x39\x8e\xf2\xdd)\xe8\x9z\xf9\xf8\x34\x15\xa8\xc9K(\x1d_\x81%\xec\xb6" -"V\xfa\x9d\xc4\xaf?\xbf\xba\xf6\xf2$\xe7$\x1b\x1d\x62\xe8\x42\xd9\xcf\x1b`\xd2w\xba" -"yEA0\x9c&\xa4G\xe9_\xe9\xc4\xa9\xe5Jl\x81\xf8\xdd \x19HF3\xdd\x98\xcb\xa0(\xbblj" -"\xe3V\x1d\x3\xeb\xad\xc6\xfbxs.\x1c\xa8\x17\xe1+j\xcf\x46\xe2\x14*\xae/\x88\xc9\xc9" -"\xc3\\\xf6\x64\x1e\xba\xffp\x94MX{:\x84\xa8\x9f\xc8\xd6\xafk`\xdc\x96'\xd1\xaf$\xe5" -"mS\x19\x8fq\xbc\xe3S\xd3\xdb\xd2nTs\xd6\xc\xa5%K2u`\x0\xaf\x3,\x4\x96\x81\r\x9b\xb7" -"\xef\x8e\x83]\xe8\xf1\xa2\xd6y\xa4\xec]\xd8\x63\xa5\xa3\xb5\xd0\x9\xdd\xdb\x9\x64" -"\xa5\x13\x88Up\x2\x31\x33\xa9\x94\xb0\x4q\x1\x91|\xba\xde\x92n\x91\xdf\x34\xb0\\" -"\xee\x4<\xc5\x85S\xcf\xcf\xcd \xe3\x83\x83\x17J|\xe2{\xe3\x37\x16\x15\x41\xf1\x1b" -"\xffk\xa9\xc5\xe7`\xf6\x45\xef\x33\x96=\x94\xdc\xc9\x13\xdf\x0\xae\x32p\\\xfb\xf7" -"\xa1\xb3\x95\x35L\xeb\xb0u\xe7v|\xf3O\x88R\xe7\xc1\x99\x90@z\x8e\x96\xee\xf5\x9d" -"\"\x1f\xd3=\xccqUM\xa8\xaaG.\xd3i\xd8h\\\xf5x\x0u\xdf@\xf4TDJy\xebNu\x87\x84\xa9" -"\x14\xadS\xbbO\xe9U\x9a\x1cz\x89w:\x9c\xa1\x82W\xfeh\xce\x91\xcf\xcb\xb8+N\xd5vl" -"\xb4\x65+\xb3\xc6\x45|\x7f\xf6\x9d\xabvMR\x99\x61K\xc0@D\x9\xd5\x6\x8\x8e\x12\xa5" -"\xce>\x9c\x7fJ\xa5jN\xc7\xeb\xe6\xa7\x86z\xc\x14\x66\x65S\x1eX\xcd\xcd\x36\x66\xfa" -"\x96T\xfa\x9e\x45\x35\xb5\xcf`\x1n\x16\x1fU\xe8\xb1J\xb9\xb2\xa8:W\xac\xdd\xe9\x8e" -"\xf2\xb2\xcf \xc2u\xac\xbf\xcf\x44u\xa0\xbc\xcc\xa3\x14\x43\xfe\x32w\xa2@\xd3=\x14" -"\xa4S\xb2\x14\x32\xc7\x97<\xa2\x41\x91\x9\xd3\x86\xbar4\x9fJd\x18\x44\xe1\x8f!\x7" -"\xec\xbd\xd2\xbe\x63q\xcfTy\xb0!Xe\x7f\x91\x0k\xae\xab\\\xe4\x2\x98\xf0p1\x16\x90" -"n\xda\xbd\x18\xd1\xadg\xdd\x82\xc\xcf\x32+'\xd1\x1H\xf5\xae\x31n\xd6\xce!\xaaP\xca" -"\x6\xa8\xf0\x9f\xe0\xd3\xe9\xab\xd9\x15\xad\x1L{#\x7f\xa2 \xbc\x17\x97\x8\xc7\xb" -"\xad\xcb\x7f\xec\x85\xfQ\xf7\xe9pR\n\xdcL=\xe7\x91K\xd5\xbe\xbc\xa7\xc2\x84\x9%\xb9" -"}6Y\ny3\xa4\x43%\xb1h\x99\x9e\x31\xeb\xdf\xe1\x98\x39L\x86Rs\x9d\x9f\x9anT\x14\xc4" -"\xe2\r\x63\xb9g#v7U_)3\xe6\xb2\x4\xa3\x41,\xc1\x96\x18\xc\xe5\x81K\x1G\xc2\x88\x5" -"i\xc8_\xee\x35\xd7]X\xbb(\xdb\xf2\xd3\xd9\x3\x93\xe1\x36\xaa\x8e\x39\xfd\xe1\x19" -"i\"\x92\x2\xba\x61X#\xe2\xdb\xb7\xb4\x89\x12\x97G\xab\xcb\xb1\x1a\x1d\xf0\xc4m\x1b" -"b\xc6\xce\x82\x9\xc6\x42r\n\x7f\x45\xe9\xb3n\xd8\xc6/\xc2\x35~\xe3\xf4|\xc2\x95=" -"\xbd\xad\xb5\xa3\x1cH\xfd\xb1\x1\xc8\x44\x45\x94\x17\x89\x61\x93\x2\xeX\x96N\x11" -"wnX\xe0yu\x1\xa5\xcam\x82+h\xd4\x13\x34\x17\r\xa1\xf5r\xfay\x4\xe2y\xad\xcf\xb8\xec" -"\x9b\xcf\xaa\xa5`*\x9b\xfb\xde\xdd\xbd\xad\xdd\xed]%\xdb\xbb(\x98\x8f\xb1N\xc3\xaa" -"\xa1\xca\xec\xbb\r\xfc GC\x6w\xcb\x35\x19\xd9\xb\x62\x32\x0\xba?Cq\xfb\x63\xe1\xd4" -"H\xe8\x61\xc5\x35\xab\xb5\x86\x82\x1f\x2\x43\xfa\xe9w;\x1c_\xc0\xc3\xe6k\x7nw|\xe2" -"L\xc;\xb6\x46\xb1*\xdc\x15\xbf\xc6)S\x16I\x9e\x38\xfd\x94\xdf,\xc1l@\xb2\xd9\xe7" -"\xf6\x31\x98\xd5g^\xb0\xca\xb6\x9d~\xe9+\x1b\xfb\x9fj\x87\x33\x97\x8c\xf6\x8ck\xc3" -"\xe9\xd4\xf9h\x91\x81\x8b\x8d\x8\xe4,\xad\xa1\xda\xe7\xaeX\xed\x10\xacR\xa1\xf7\x42" -"\xbc\xbe\x66\xac!\xa2{\xcc\xd7\xd2KEG\xcb\xa2'\xcd\r\x99\x9d\x88\x38\xd1\x62\xed" -"\x5\x2\x8\xb9\xb1%\x18\xcc*\xaa\xb3\xf1sG2\xae\x14Mg\x13\xac\x10 \xfcg\"k\xd0\xec" -"#\xb0\xc2{\xab\x90\x8f\x32u\xd8\xea'\xfa\xa4\xe6\xd9Y\xa6\x8b\x15>\x6\x88\xb5\xc7" -"\xa8\xd1U\x88nmF\x8e\xf2\xba\xcb\x81\x9\xa6\x9a\xd2\xd6\xd1N\x95Z\xe4\xb5\xd4\xc3" -"/\xdfnJ9\xb5<\xcW&\xe9\x86\xd4\x61\x10\x1a\xb1\xc8\xfb\x92\xbcPV\x89tN\xd3^\xc2\xba" -"g\xe8\xd9\xe8\x16l\xea}\xc0\xdd\xf6\x10\x66\xfc\xbb\xf0l\xdf\x1f\xc9\x81\x31\x92" -"I\xf9\xa5\xec\xc3\x85L\xbc\xa3\x12@\x1\x32L\\CFM\x99L\x1d;-\x1\x1e\x81vE\xbeLAH\x13" -"\x19\x16\xbcM\x18P\xf1\x9d\x85K1\x8bu\xa6\xa6\xea.\xf8L/\xf1xI\x1\x5\xcf\x80\xc6" -"\x18\xc1\x81O\x11.\xb8\xbf\x6\xae\xcf\x92\x6\x99\x7fMa\xf4\xc9\x9\x11\x9d\xb6\x44" -"8\xc3\x7z$(\xbe\xb3\xfa\xe6\xf0w2\xf7\x35\x82y\xfe\xc\xf7\x1e\xe4\x80\xcf\xe4 \x84" -"%\xc9#g&EY\xa5\x84\x87`\xbc\xb8\xcc\xf6\xcaq/j\xcaMw$\xba\xe4=k\xe2\xcb\x94\xc0#" -"\xe6\x18jB\x4`\x19w\x1c\x88\xa5\xaf\x8e\xb1Yl\x13\xe0(\x4\xc4\xfe\x1b\x1fVUxk\xb6" -"\xef\xdbpZ\x2\xff/\x1\x8a\x1e\xe\x35V1\xeb\x84g\xf5`\x1b\xf6(\x17\xdf\xd6W\xb6\x8c" -"Z9\x82\x34{\xf6\xe5\x88P\xcf\x96Z!\xef\x86\x83\xe7\xe4\x46\x1f\x10\xb8Zh\xca\x15" -"si\x95Y\xf2\xd8\xa8\x9e\r\x8f<\x99\xf6\x19\x99x\xd8Y\xfc\xed\x9e\x61\x42\x98\xc9" -"\x7f\xf6n\x17\x41Vn\xc5\xd6[\x9f\xc\x38\xf6\x30[\xbd\x8c\x44\xa3\x9a{\x2\x6\x99\x0" -"_l\r\x10u\x98&\xdd\x8f\xef\xd7\xa9\xc7*oEg_\x80\xc\xd6lQ\x85\xfdw\xb4\xcf\x9f\x92" -"e\x8cp\x13\x34k\x3\x64\x15$\x9a\x62\x1\x35\x8e\xec\xea\x44\xf0\xfcN\xfcQ\x1\x15\x83" -"b\xc9\xd2\xd2\x93}\xea\x8~\xe0\xe\xb1\x15^\x84\xf8\xfc\x16!\xf7$;Z\x7\xaf\x2\xd6" -"\xfbm\x96\xe\x9b\x99\x6~T#\\$\x1e\x36Vb\xf6\x44|&\xebm\xe9\r\x7{\xbR\xfe\x18OE\xb1" -"#\xf0\x1dQ\xb1\xca\xa7J\xe2\x95\x8d\x9a\xe4\x97\xa8\x9d?\xfb\xb5\xc8\xc7^D+o\xa7" -"\xc0\xf9\x89\xf3\x1b?\xc7\xa1\xea\x9b\xa4\x83\x41l\n\x7\xd2;\x82\x6\xe0\x8b\xff\xbe" -"=\xd3\xfe\x30\x99_\xa3\xc\xdc\x8a\x4i\xab\x14\xbc\x83[\xc5\xfaky\xb9m\xcb\x80W7\xfe" -";\xeeM2\xee\x4\xf9\n\xbb)\x9a\x34?\xac\x41\xfd$\nRrd\x17\x89=\xc1\x97\xd6\xb6\xc9" -"{F\xb9sO\xee[\x8e*!@n\xc5\x86\x89\x92N*e\x1a\x2\xc6\xd7U\x8d\x9c\x87/\xaa\xb7\x42" -"\x90\"\x33\x62\xa7q\xfd+\x89?`t\r5\xd1Y\x3h\xd3,\xa7\xeatjz\xa2\x97\xd6\x96\x19\x41\x15\xfa\xe9*Z\xf3o&\xa3\xa7;\xc4\x13H" -"\xfcz\xb3\x9\xd3S\x88\xd6u\xec\x61\x18\xf8\xb8\x9f-\x93_OfU\xb4'\x85\xfc\xec#J)\xee" -"/\xc0\x1c%\x91\x97\xc2\x1e\x42x\x9b)-H\x0\xf6\xec\x96\xf5\x8+\x8d\x46\x33\xb4(\xa7" -"nr\x83\x96N\xd4\x93\xb8v\xfb\xd9\xc8;7\xab\xc5\xf8\xc4\x34\x14\xca*\x6\x93`]\x13" -"\xee=a7\xed\xa0+\xd6\xa9\x7\xad\xd1\x65\xa0\xc1\xe2\xc5n\xa5\xc8\xf8\"\xc5\x33\x92" -"\xda\xa6_\xc\x85\xddp\x0kF\xfpn\xc5g\x8b\x43\x96(\xb4\xae\\\xb5\xa0\xa3\xf2\x95\xb9" -"\xe8\xf6\xe2\x8e\xccgi\xd9\x88\x89\x45W\xaf\x34\x85\xef\x3g\x15\x11\x84\xdb_\xa0" -"\xb2~\xee\xb0k\x98\xa1\xb9\x95\xba\xb5\xc4\xc1\x43\x9e\xfe\xc6\xe3\xa7\x14qw\xec" -"4V\x84\x33\xf5OW\x9a\x6\xd8\x31I\x9a\x84\"\xcb\x91v\x86\xbdX\xc7\x43\xd6U\xd6\xf1" -"`\x7f(\x1d\xfa\x15z\x97\x16_\xba\x9f\x66\xe5\xf\xbd\xe8!\x9b\x41\xc\xa2s4\x19\x8a" -"\xe5\xaf \x11\xe3\xe8\xbK\xf\xc2\x84\x37s\xcb\xb5,\xc2\x6\xbd\x94\xd7tw\xb6\xbc<" -"4J\xf2\xdb\xb2o\x9\x83\x98\xff\x14{0\xba\xa6*\xef\x99\xfc\xf7\x8f\xfd\x93\xda\xb2" -"\xfc\xa2#V\xe6\x1d\x3/\x1c(\xe0\xa6\x9e=\xe0\x84(\xcb\xf9\x15\x8f\xb0 `s\xa8\xf6" -"\x8f\x92\xff\x19\xfb[z\x88\x98\xf7\xb6\x9\xe0\x1a\x8c\xb5\x82\xc\x1e\x16l\xe3\x18" -"f\x8b\x4g\x14\xc0\x95\xe5\xd2\xde\xb3q}\x13\xcc\xbb\xb8\xf:N\xa7\xe5I\x1d\xe9\xe1" -"\x8a\xf6\xa4\xf2o9r\xf5\xf5\xb7x\xa5\x66\xf7\xd0wO\xb4\x8d\xb6<\xe6\xfe\x81\x9f\xd9" -"lX\x98\xe7\xb1\xea\xd3*RKp\xd5\x3\xa3\x41\x18\x35,w\xe2`Y}\xc5\x9f\xdb\xb1\xbf\xfc" -"\\y\xd5\xe8\xf8G\xad\xa5\xe1\x86\x97\xf\x6\x80\xe7>\x7f\x91\x1c\x7f<\xc4\xcf\xbb" -"\xb\x9bt4\x86\xe0\xa3\xeby\x84\xda\x91I\x98>\x1\xce\xe0\x19\xc2\xbc\xa3\xea\xd0i" -"\x1e\xe6\x43 >\xae\xcd\xa9\x9c\xb\x90\xda%\xe2\xdaL\xca^kJ\xb2\x9\xd5\x41\xce\x1f" -"H\xb4\x88\xd9\xe2\xdc!X\xbc\x18\x98\xbb\x63\xa7\x2\"\xe3\x66\xad\x37\x9fr[\x96\xed" -"\xdb+\x90\xe0\xf0\x12\x3\xf6\xd3\xb4\x42\xdcVz\x9f:\xa3G\xe\x44\xd3k\x93\xdf\x89" -"\x11&{\xa8|\xec\xe1v\xe0\xca\x7\xcd\xf7]0]\xb4\xc\x1e\xc9\xe5\x65\x1ah\xfc\xa8\x45" -"\xa5G\xcbPekP\x88,\xf3\xfbW\x2\x31~\x92\xee\x9p\x8ei\xf5\xaf\xaf\x36\xe[\x9b\xb1" -"cw\xa1\x1eT\xb6\xa3\xb9\x95\x8eR\xf0\x16\x4\xb6\xd9\x4\xe0\xff,~\x86X?x\xdeLf\xc8" -"`\xa5]\xd3\x93\x1e\xf2L\x15\xc8i]\xb8\x81\x16\xce\x5;\xbfJ\xba\x90\x10\xca\x14\x61" -"o\x9b\xc7\x19\x0\x4\xd7\xff\xde\xb7{\xa4\x63\x62\xd2\x5\xfakG\x80\xafnS\xaeZ\xb6" -"W\xfd\x33\x61q\xad\x9e\x1a\xb3\xaf\xc4\x97\xac?\x14\xc2\xd4\xf\x64\xf6\xc1\x9d\xf7" -"\xff\xe\xe3\xc8TYy\x10\xad^EUL,^F\x8a\x33'\xdbU7>W\xab\x39-\x7\xf*M\xf5\xa6\x66\xe3" -"Qy\xc1\x1f\x36l\xa3\x1d\xc0\xe2\xd7U\xd6T(m\\,-\x8e\xce\xc3-\xd8\x8e\x32\x1c\xb2" -"E\x92\xd3L\xbd\xb8}5\x97Y\x91\x96\xb3\xd4\x38\x14\xf9\xa3\x3O\xbd\xd3\x1f)\xbb[\"" -"\xe5\xdf\x1btE7#\xe2}+\xe\x10\x87\x80%\x91/\xd4\xfcZz.?\x10\x9c\xca\x1b\xf9\xf3y" -"\x9d\xaa\x42<\xecn\x2\x95#\xd7M\x15\xec]\xbd\x95\x86Y\xb5\x4\xaa\x92\xb8\x32\x14" -"\xca\xf2\xf8\xb8\x99O\xf9\xfd\x1c\xb1]:\xa5\xc1\xb4Z\xc9\x80\x1z\x1c\xbc\x8\xcd\xfc" -"0\x8c$*\x92\xda\x45\xdeh\xfc\xe0;\x9b\xa3\xf6\x31Vl\xf3Rk`N\xf5\xf3#\x5\x1\xccGJ" -"^6g3\xa1Y$\xb1%\x4\xf5\xac\x46\x37Y3;'\xdf\xf6\x3\x99$R\xc8\xbb\x31\x8fVL\x92\xce" -":*\xfc\xfc\xc5,\x18\x33\xbe\x0\xf4\x9f\x92\xc2\xd0oH\x18\xae\xe2\x33\xa5;\xb6P\x90" -"G\x9by\xf5\xf6\xef[^\xcf\x5o\x8e\xc5\x98l\x17\x2(0\x8d(\xad\x5mC}m\xed{\xb6\x86\xf7" -"\xa1\xc5\xc0\x19\xdeX\xb7\x8f\xb0\xa8o\x8a\x10k\x8a\xec\xa8\x87]\xa6\xe1s\xfcK*\x13" -"J-!#\xeeL\x1a\x1b\x4\xf7\x32\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30" -"00000000000000000000000000000000000000000000000000000000\r0000000000000000000000" -"000000000000000000000000000000000000000000\r000000000000000000000000000000000000" -"0000000000000000000000000000\r00000000000000000000000000000000000000000000000000" -"00000000000000\r0000000000000000000000000000000000000000000000000000000000000000" -"\r0000000000000000000000000000000000000000000000000000000000000000\r000000000000" -"0000000000000000000000000000000000000000000000000000\r00000000000000000000000000" -"00000000000000000000000000000000000000\rcleartomark\n\x80\x3" -; -int n021004l_afm_len = 31889; -char* n021004l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusRomNo9L-Med" -"i\nFullName Nimbus Roman No9 L Medium\nFamilyName Nimbus Roman No9 L\nWeight Bol" -"d\nItalicAngle 0.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineThickne" -"ss 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Developme" -"nt\nEncodingScheme AdobeStandardEncoding\nFontBBox -168 -341 1000 960\nCapHeight" -" 676\nXHeight 461\nDescender -205\nAscender 676\nStartCharMetrics 316\nC 32 ; WX" -" 250 ; N space ; B 125 0 125 0 ;\nC 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ;\n" -"C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ;\nC 35 ; WX 500 ; N numbersign ; " -"B 4 0 496 700 ;\nC 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ;\nC 37 ; WX 1000 ;" -" N percent ; B 124 -14 877 692 ;\nC 38 ; WX 833 ; N ampersand ; B 62 -16 787 691" -" ;\nC 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ;\nC 40 ; WX 333 ; N parenle" -"ft ; B 46 -168 306 694 ;\nC 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ;\nC " -"42 ; WX 500 ; N asterisk ; B 56 255 447 691 ;\nC 43 ; WX 570 ; N plus ; B 33 0 5" -"37 506 ;\nC 44 ; WX 250 ; N comma ; B 39 -180 223 155 ;\nC 45 ; WX 333 ; N hyphe" -"n ; B 44 171 287 287 ;\nC 46 ; WX 250 ; N period ; B 41 -13 210 156 ;\nC 47 ; WX" -" 278 ; N slash ; B -24 -19 302 691 ;\nC 48 ; WX 500 ; N zero ; B 24 -13 476 688 " -";\nC 49 ; WX 500 ; N one ; B 65 0 442 688 ;\nC 50 ; WX 500 ; N two ; B 17 0 478 " -"688 ;\nC 51 ; WX 500 ; N three ; B 16 -14 468 688 ;\nC 52 ; WX 500 ; N four ; B " -"19 0 475 688 ;\nC 53 ; WX 500 ; N five ; B 22 -8 470 676 ;\nC 54 ; WX 500 ; N si" -"x ; B 28 -13 475 688 ;\nC 55 ; WX 500 ; N seven ; B 17 0 477 676 ;\nC 56 ; WX 50" -"0 ; N eight ; B 28 -13 472 688 ;\nC 57 ; WX 500 ; N nine ; B 26 -13 473 688 ;\nC" -" 58 ; WX 333 ; N colon ; B 82 -13 251 472 ;\nC 59 ; WX 333 ; N semicolon ; B 82 " -"-180 266 472 ;\nC 60 ; WX 570 ; N less ; B 31 -12 539 518 ;\nC 61 ; WX 570 ; N e" -"qual ; B 33 107 537 399 ;\nC 62 ; WX 570 ; N greater ; B 31 -12 539 518 ;\nC 63 " -"; WX 500 ; N question ; B 57 -13 445 689 ;\nC 64 ; WX 930 ; N at ; B 108 -19 822" -" 691 ;\nC 65 ; WX 722 ; N A ; B 9 0 689 690 ;\nC 66 ; WX 667 ; N B ; B 16 0 619 " -"676 ;\nC 67 ; WX 722 ; N C ; B 49 -19 687 691 ;\nC 68 ; WX 722 ; N D ; B 14 0 69" -"0 676 ;\nC 69 ; WX 667 ; N E ; B 16 0 641 676 ;\nC 70 ; WX 611 ; N F ; B 16 0 58" -"3 676 ;\nC 71 ; WX 778 ; N G ; B 37 -19 755 691 ;\nC 72 ; WX 778 ; N H ; B 21 0 " -"759 676 ;\nC 73 ; WX 389 ; N I ; B 20 0 370 676 ;\nC 74 ; WX 500 ; N J ; B 3 -96" -" 479 676 ;\nC 75 ; WX 778 ; N K ; B 30 0 769 676 ;\nC 76 ; WX 667 ; N L ; B 19 0" -" 638 676 ;\nC 77 ; WX 944 ; N M ; B 14 0 921 676 ;\nC 78 ; WX 722 ; N N ; B 16 -" -"18 701 676 ;\nC 79 ; WX 778 ; N O ; B 35 -19 743 691 ;\nC 80 ; WX 611 ; N P ; B " -"16 0 600 676 ;\nC 81 ; WX 778 ; N Q ; B 35 -176 743 691 ;\nC 82 ; WX 722 ; N R ;" -" B 26 0 715 676 ;\nC 83 ; WX 556 ; N S ; B 35 -19 513 692 ;\nC 84 ; WX 667 ; N T" -" ; B 31 0 636 676 ;\nC 85 ; WX 722 ; N U ; B 16 -19 701 676 ;\nC 86 ; WX 722 ; N" -" V ; B 16 -18 701 676 ;\nC 87 ; WX 1000 ; N W ; B 19 -15 981 676 ;\nC 88 ; WX 72" -"2 ; N X ; B 16 0 699 676 ;\nC 89 ; WX 722 ; N Y ; B 15 0 699 676 ;\nC 90 ; WX 66" -"7 ; N Z ; B 28 0 634 676 ;\nC 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ;\n" -"C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ;\nC 93 ; WX 333 ; N bracketrigh" -"t ; B 32 -149 266 678 ;\nC 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ;\nC 9" -"5 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333 ; N quoteleft ; B " -"70 356 254 691 ;\nC 97 ; WX 500 ; N a ; B 25 -14 488 473 ;\nC 98 ; WX 556 ; N b " -"; B 17 -14 521 676 ;\nC 99 ; WX 444 ; N c ; B 25 -14 430 473 ;\nC 100 ; WX 556 ;" -" N d ; B 25 -14 534 676 ;\nC 101 ; WX 444 ; N e ; B 25 -14 426 473 ;\nC 102 ; WX" -" 333 ; N f ; B 14 0 389 691 ;\nC 103 ; WX 500 ; N g ; B 28 -206 483 473 ;\nC 104" -" ; WX 556 ; N h ; B 16 0 534 676 ;\nC 105 ; WX 278 ; N i ; B 16 0 255 691 ;\nC 1" -"06 ; WX 333 ; N j ; B -57 -203 263 691 ;\nC 107 ; WX 556 ; N k ; B 22 0 543 676 " -";\nC 108 ; WX 278 ; N l ; B 16 0 255 676 ;\nC 109 ; WX 833 ; N m ; B 16 0 814 47" -"3 ;\nC 110 ; WX 556 ; N n ; B 21 0 539 473 ;\nC 111 ; WX 500 ; N o ; B 25 -14 47" -"6 473 ;\nC 112 ; WX 556 ; N p ; B 19 -205 524 473 ;\nC 113 ; WX 556 ; N q ; B 34" -" -205 536 473 ;\nC 114 ; WX 444 ; N r ; B 29 0 434 473 ;\nC 115 ; WX 389 ; N s ;" -" B 25 -14 361 473 ;\nC 116 ; WX 333 ; N t ; B 20 -12 332 630 ;\nC 117 ; WX 556 ;" -" N u ; B 16 -14 537 461 ;\nC 118 ; WX 500 ; N v ; B 21 -14 485 461 ;\nC 119 ; WX" -" 722 ; N w ; B 23 -14 707 461 ;\nC 120 ; WX 500 ; N x ; B 12 0 484 461 ;\nC 121 " -"; WX 500 ; N y ; B 16 -205 480 461 ;\nC 122 ; WX 444 ; N z ; B 21 0 420 461 ;\nC" -" 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ;\nC 124 ; WX 220 ; N bar ; B 66" -" -19 154 691 ;\nC 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ;\nC 126 ; WX " -"520 ; N asciitilde ; B 29 175 491 331 ;\nC 161 ; WX 333 ; N exclamdown ; B 82 -2" -"03 252 501 ;\nC 162 ; WX 500 ; N cent ; B 53 -140 458 588 ;\nC 163 ; WX 500 ; N " -"sterling ; B 21 -14 477 684 ;\nC 164 ; WX 167 ; N fraction ; B -168 -12 329 688 " -";\nC 165 ; WX 500 ; N yen ; B -64 0 547 676 ;\nC 166 ; WX 500 ; N florin ; B 0 -" -"155 498 706 ;\nC 167 ; WX 500 ; N section ; B 57 -132 443 691 ;\nC 168 ; WX 500 " -"; N currency ; B -26 61 526 613 ;\nC 169 ; WX 278 ; N quotesingle ; B 75 404 204" -" 691 ;\nC 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ;\nC 171 ; WX 500 ; N" -" guillemotleft ; B 23 36 473 415 ;\nC 172 ; WX 333 ; N guilsinglleft ; B 51 36 3" -"05 415 ;\nC 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ;\nC 174 ; WX 556 " -"; N fi ; B 14 0 536 691 ;\nC 175 ; WX 556 ; N fl ; B 14 0 536 691 ;\nC 177 ; WX " -"500 ; N endash ; B 0 181 500 271 ;\nC 178 ; WX 500 ; N dagger ; B 47 -134 453 69" -"1 ;\nC 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ;\nC 180 ; WX 250 ; N peri" -"odcentered ; B 41 248 210 417 ;\nC 182 ; WX 540 ; N paragraph ; B 0 -186 519 676" -" ;\nC 183 ; WX 350 ; N bullet ; B 35 198 315 478 ;\nC 184 ; WX 333 ; N quotesing" -"lbase ; B 79 -180 263 155 ;\nC 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155" -" ;\nC 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ;\nC 187 ; WX 500 ; N gu" -"illemotright ; B 27 36 477 415 ;\nC 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 15" -"6 ;\nC 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ;\nC 191 ; WX 500 ; N que" -"stiondown ; B 55 -201 443 501 ;\nC 193 ; WX 333 ; N grave ; B 8 528 246 713 ;\nC" -" 194 ; WX 333 ; N acute ; B 86 528 324 713 ;\nC 195 ; WX 333 ; N circumflex ; B " -"-2 528 335 704 ;\nC 196 ; WX 333 ; N tilde ; B -16 547 349 674 ;\nC 197 ; WX 333" -" ; N macron ; B 1 565 331 637 ;\nC 198 ; WX 333 ; N breve ; B 15 528 318 691 ;\n" -"C 199 ; WX 333 ; N dotaccent ; B 103 537 232 666 ;\nC 200 ; WX 333 ; N dieresis " -"; B -2 537 337 666 ;\nC 202 ; WX 333 ; N ring ; B 60 537 273 750 ;\nC 203 ; WX 3" -"33 ; N cedilla ; B 68 -218 294 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B -13 528 " -"425 713 ;\nC 206 ; WX 333 ; N ogonek ; B 90 -173 319 44 ;\nC 207 ; WX 333 ; N ca" -"ron ; B -2 528 335 704 ;\nC 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ;\nC 225" -" ; WX 1000 ; N AE ; B 4 0 951 676 ;\nC 227 ; WX 300 ; N ordfeminine ; B -1 397 3" -"01 688 ;\nC 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ;\nC 233 ; WX 778 ; N Oslas" -"h ; B 35 -74 743 737 ;\nC 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ;\nC 235 ; WX 3" -"30 ; N ordmasculine ; B 18 397 312 688 ;\nC 241 ; WX 722 ; N ae ; B 33 -14 693 4" -"73 ;\nC 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ;\nC 248 ; WX 278 ; N lslash " -"; B -22 0 303 676 ;\nC 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ;\nC 250 ; WX " -"722 ; N oe ; B 22 -14 696 473 ;\nC 251 ; WX 556 ; N germandbls ; B 19 -12 517 69" -"1 ;\nC -1 ; WX 722 ; N Udieresis ; B 16 -19 701 876 ;\nC -1 ; WX 722 ; N Uacute " -"; B 16 -19 701 923 ;\nC -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ;\nC -1 ; W" -"X 667 ; N Tcaron ; B 31 0 636 914 ;\nC -1 ; WX 556 ; N Scaron ; B 35 -19 513 914" -" ;\nC -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ;\nC -1 ; WX 722 ; N Racute ; B 26" -" 0 715 923 ;\nC -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ;\nC -1 ; WX 778 ; N O" -"tilde ; B 35 -19 743 884 ;\nC -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ;\n" -"C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ;\nC -1 ; WX 722 ; N Uhungaru" -"mlaut ; B 16 -19 701 923 ;\nC -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ;\nC -1 ; " -"WX 722 ; N Eth ; B 6 0 690 676 ;\nC -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ;\nC " -"-1 ; WX 667 ; N Zacute ; B 28 0 634 923 ;\nC -1 ; WX 722 ; N Uring ; B 16 -19 70" -"1 960 ;\nC -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ;\nC -1 ; WX 444 ; N eogon" -"ek ; B 25 -173 444 473 ;\nC -1 ; WX 444 ; N edotaccent ; B 25 -14 426 666 ;\nC -" -"1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ;\nC -1 ; WX 722 ; N Ugrave ; B 16 -19 " -"701 923 ;\nC -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ;\nC -1 ; WX 444 ; N eacute " -"; B 25 -14 426 713 ;\nC -1 ; WX 444 ; N edieresis ; B 25 -14 426 666 ;\nC -1 ; W" -"X 665 ; N dcaron ; B 25 -14 665 691 ;\nC -1 ; WX 444 ; N ccedilla ; B 25 -218 43" -"0 473 ;\nC -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ;\nC -1 ; WX 444 ; N cacute" -" ; B 25 -14 430 713 ;\nC -1 ; WX 500 ; N aogonek ; B 25 -173 500 473 ;\nC -1 ; W" -"X 500 ; N aring ; B 25 -14 488 750 ;\nC -1 ; WX 500 ; N atilde ; B 25 -14 488 67" -"4 ;\nC -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ;\nC -1 ; WX 444 ; N egrave ; B" -" 25 -14 426 713 ;\nC -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ;\nC -1 ; WX 500 " -"; N aacute ; B 25 -14 488 713 ;\nC -1 ; WX 500 ; N adieresis ; B 25 -14 488 666 " -";\nC -1 ; WX 722 ; N Uogonek ; B 16 -173 701 676 ;\nC -1 ; WX 556 ; N ugrave ; B" -" 16 -14 537 713 ;\nC -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ;\nC -1 ; WX 556 " -"; N udieresis ; B 16 -14 537 666 ;\nC -1 ; WX 400 ; N tcaron ; B 20 -12 400 691 " -";\nC -1 ; WX 389 ; N scommaaccent ; B 25 -341 361 473 ;\nC -1 ; WX 667 ; N Zcaro" -"n ; B 28 0 634 914 ;\nC -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ;\nC -1 ;" -" WX 722 ; N Ucircumflex ; B 16 -19 701 914 ;\nC -1 ; WX 500 ; N acircumflex ; B " -"25 -14 488 704 ;\nC -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 876 ;\nC -1 ; WX 389" -" ; N scaron ; B 25 -14 363 704 ;\nC -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ;\nC" -" -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ;\nC -1 ; WX 667 ; N Tcommaaccent ; B" -" 31 -341 636 676 ;\nC -1 ; WX 722 ; N Ydieresis ; B 15 0 699 876 ;\nC -1 ; WX 55" -"6 ; N thorn ; B 19 -205 524 676 ;\nC -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ;\n" -"C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ;\nC -1 ; WX 778 ; N Oacute ; B 35 -" -"19 743 923 ;\nC -1 ; WX 778 ; N Odieresis ; B 35 -19 743 876 ;\nC -1 ; WX 722 ; " -"N Ntilde ; B 16 -18 701 884 ;\nC -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ;\nC " -"-1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ;\nC -1 ; WX 667 ; N Lcaron ; B 19 0 6" -"38 691 ;\nC -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ;\nC -1 ; WX 389 ; N Idotacc" -"ent ; B 20 0 370 876 ;\nC -1 ; WX 444 ; N racute ; B 29 0 434 713 ;\nC -1 ; WX 3" -"89 ; N Icircumflex ; B 20 0 370 914 ;\nC -1 ; WX 500 ; N ohungarumlaut ; B 25 -1" -"4 509 713 ;\nC -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ;\nC -1 ; WX 500 ; N Eu" -"ro ; B -36 -24 478 671 ;\nC -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ;\nC " -"-1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ;\nC -1 ; WX 300 ; N twosuperior " -"; B 0 275 300 688 ;\nC -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ;\nC -1 ;" -" WX 389 ; N Igrave ; B 20 0 370 923 ;\nC -1 ; WX 389 ; N Iacute ; B 20 0 370 923" -" ;\nC -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ;\nC -1 ; WX 389 ; N Iogonek ; B " -"20 -173 505 676 ;\nC -1 ; WX 389 ; N Idieresis ; B 20 0 370 876 ;\nC -1 ; WX 778" -" ; N Gbreve ; B 37 -19 755 901 ;\nC -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ;" -"\nC -1 ; WX 778 ; N Kcommaaccent ; B 30 -341 769 676 ;\nC -1 ; WX 500 ; N ograve" -" ; B 25 -14 476 713 ;\nC -1 ; WX 556 ; N Scommaaccent ; B 35 -341 513 692 ;\nC -" -"1 ; WX 667 ; N Eogonek ; B 16 -173 737 676 ;\nC -1 ; WX 500 ; N oacute ; B 25 -1" -"4 476 713 ;\nC -1 ; WX 667 ; N Edotaccent ; B 16 0 641 876 ;\nC -1 ; WX 278 ; N " -"iogonek ; B 16 -173 388 691 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 81" -"1 ;\nC -1 ; WX 500 ; N odieresis ; B 25 -14 476 666 ;\nC -1 ; WX 556 ; N ntilde " -"; B 21 0 539 674 ;\nC -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ;\nC -1 ; WX 667 ;" -" N Ecaron ; B 16 0 641 914 ;\nC -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ;\n" -"C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ;\nC -1 ; WX 444 ; N rcaron ; B 2" -"9 0 434 704 ;\nC -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ;\nC -1 ; WX 667 ; N Ea" -"cute ; B 16 0 641 923 ;\nC -1 ; WX 778 ; N Gcommaaccent ; B 37 -341 755 691 ;\nC" -" -1 ; WX 722 ; N Rcommaaccent ; B 26 -341 715 676 ;\nC -1 ; WX 667 ; N Edieresis" -" ; B 16 0 641 876 ;\nC -1 ; WX 556 ; N nacute ; B 21 0 539 713 ;\nC -1 ; WX 556 " -"; N uogonek ; B 16 -173 556 461 ;\nC -1 ; WX 556 ; N umacron ; B 16 -14 537 637 " -";\nC -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ;\nC -1 ; WX 396 ; N lcaron ; B 16 " -"0 396 691 ;\nC -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ;\nC -1 ; WX 722 ; N Ca" -"cute ; B 49 -19 687 923 ;\nC -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ;\nC -" -"1 ; WX 400 ; N degree ; B 57 402 343 688 ;\nC -1 ; WX 722 ; N Aogonek ; B 9 -173" -" 822 690 ;\nC -1 ; WX 570 ; N minus ; B 33 209 537 297 ;\nC -1 ; WX 570 ; N mult" -"iply ; B 48 16 522 490 ;\nC -1 ; WX 570 ; N divide ; B 33 -31 537 537 ;\nC -1 ; " -"WX 722 ; N Aring ; B 9 0 689 948 ;\nC -1 ; WX 1000 ; N trademark ; B 24 271 977 " -"676 ;\nC -1 ; WX 444 ; N rcommaaccent ; B 29 -341 434 473 ;\nC -1 ; WX 278 ; N l" -"acute ; B 16 0 297 923 ;\nC -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ;\nC -1 ;" -" WX 722 ; N Atilde ; B 9 0 689 884 ;\nC -1 ; WX 278 ; N icircumflex ; B -36 0 30" -"1 704 ;\nC -1 ; WX 278 ; N igrave ; B -26 0 255 713 ;\nC -1 ; WX 556 ; N ncommaa" -"ccent ; B 21 -341 539 473 ;\nC -1 ; WX 278 ; N lcommaaccent ; B 16 -341 255 676 " -";\nC -1 ; WX 570 ; N plusminus ; B 33 0 537 568 ;\nC -1 ; WX 750 ; N onehalf ; B" -" -7 -12 775 688 ;\nC -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ;\nC -1 ; WX " -"750 ; N threequarters ; B 23 -12 733 688 ;\nC -1 ; WX 278 ; N iacute ; B 16 0 29" -"0 713 ;\nC -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ;\nC -1 ; WX 556 ; N kcommaacc" -"ent ; B 22 -341 543 676 ;\nC -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ;\nC -1 " -"; WX 278 ; N imacron ; B -27 0 303 637 ;\nC -1 ; WX 444 ; N emacron ; B 25 -14 4" -"26 637 ;\nC -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ;\nC -1 ; WX 333 ; N tcom" -"maaccent ; B 20 -341 332 630 ;\nC -1 ; WX 500 ; N ydieresis ; B 16 -205 480 666 " -";\nC -1 ; WX 444 ; N zdotaccent ; B 21 0 420 666 ;\nC -1 ; WX 444 ; N zcaron ; B" -" 21 0 420 704 ;\nC -1 ; WX 444 ; N zacute ; B 21 0 420 713 ;\nC -1 ; WX 500 ; N " -"yacute ; B 16 -205 480 713 ;\nC -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 537 713" -" ;\nC -1 ; WX 500 ; N eth ; B 25 -14 476 691 ;\nC -1 ; WX 556 ; N uring ; B 16 -" -"14 537 750 ;\nC -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ;\nC -1 ; WX 333 " -"; N commaaccent ; B 84 -341 249 -40 ;\nC -1 ; WX 747 ; N copyright ; B 26 -19 72" -"1 691 ;\nC -1 ; WX 747 ; N registered ; B 26 -19 721 691 ;\nC -1 ; WX 722 ; N Ac" -"ircumflex ; B 9 0 689 914 ;\nC -1 ; WX 278 ; N idieresis ; B -36 0 303 666 ;\nC " -"-1 ; WX 494 ; N lozenge ; B 18 0 466 740 ;\nC -1 ; WX 612 ; N Delta ; B 6 0 608 " -"688 ;\nC -1 ; WX 570 ; N notequal ; B 33 -13 537 519 ;\nC -1 ; WX 549 ; N radica" -"l ; B -17 -35 535 916 ;\nC -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ;\nC -1 ; WX 7" -"22 ; N Aacute ; B 9 0 689 923 ;\nC -1 ; WX 570 ; N lessequal ; B 31 0 539 642 ;\n" -"C -1 ; WX 570 ; N greaterequal ; B 31 0 539 642 ;\nC -1 ; WX 570 ; N logicalnot " -"; B 33 108 537 399 ;\nC -1 ; WX 713 ; N summation ; B 14 -123 695 752 ;\nC -1 ; " -"WX 494 ; N partialdiff ; B 16 -20 472 743 ;\nC -1 ; WX 722 ; N Ncommaaccent ; B " -"16 -341 701 676 ;\nC -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ;\nC -1 ; WX 220 " -"; N brokenbar ; B 66 -19 154 691 ;\nC -1 ; WX 667 ; N Lcommaaccent ; B 19 -341 6" -"38 676 ;\nC -1 ; WX 722 ; N Adieresis ; B 9 0 689 876 ;\nC -1 ; WX 556 ; N mu ; " -"B 33 -206 536 461 ;\nC -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ;\nEndCharMetrics" -"\nStartKernData\nStartKernPairs 998\nKPX A C -73\nKPX A Ccedilla -77\nKPX A G -6" -"8\nKPX A O -68\nKPX A Odieresis -68\nKPX A Q -68\nKPX A T -59\nKPX A U -66\nKPX " -"A Uacute -66\nKPX A Ucircumflex -66\nKPX A Udieresis -66\nKPX A Ugrave -66\nKPX " -"A V -130\nKPX A W -116\nKPX A Y -74\nKPX A a -5\nKPX A b -22\nKPX A c -35\nKPX A" -" ccedilla -43\nKPX A comma 1\nKPX A d -28\nKPX A e -32\nKPX A g -7\nKPX A guille" -"motleft -53\nKPX A guilsinglleft -67\nKPX A hyphen -30\nKPX A o -37\nKPX A perio" -"d 0\nKPX A q -38\nKPX A quotedblright -76\nKPX A quoteright -108\nKPX A t -27\nK" -"PX A u -30\nKPX A v -84\nKPX A w -79\nKPX A y -83\nKPX Aacute C -73\nKPX Aacute " -"G -68\nKPX Aacute O -68\nKPX Aacute Q -68\nKPX Aacute T -59\nKPX Aacute U -66\nK" -"PX Aacute V -130\nKPX Aacute W -116\nKPX Aacute Y -74\nKPX Aacute a -5\nKPX Aacu" -"te b -22\nKPX Aacute c -35\nKPX Aacute comma 1\nKPX Aacute d -28\nKPX Aacute e -" -"32\nKPX Aacute g -7\nKPX Aacute guillemotleft -53\nKPX Aacute guilsinglleft -67\n" -"KPX Aacute hyphen -30\nKPX Aacute o -37\nKPX Aacute period 0\nKPX Aacute q -38\n" -"KPX Aacute quoteright -108\nKPX Aacute t -27\nKPX Aacute u -30\nKPX Aacute v -84" -"\nKPX Aacute w -79\nKPX Aacute y -83\nKPX Acircumflex C -73\nKPX Acircumflex G -" -"68\nKPX Acircumflex O -68\nKPX Acircumflex Q -68\nKPX Acircumflex T -59\nKPX Aci" -"rcumflex U -66\nKPX Acircumflex V -130\nKPX Acircumflex W -116\nKPX Acircumflex " -"Y -74\nKPX Acircumflex comma 1\nKPX Acircumflex period 0\nKPX Adieresis C -73\nK" -"PX Adieresis G -68\nKPX Adieresis O -68\nKPX Adieresis Q -68\nKPX Adieresis T -5" -"9\nKPX Adieresis U -66\nKPX Adieresis V -130\nKPX Adieresis W -116\nKPX Adieresi" -"s Y -74\nKPX Adieresis a -5\nKPX Adieresis b -22\nKPX Adieresis c -35\nKPX Adier" -"esis comma 1\nKPX Adieresis d -28\nKPX Adieresis g -7\nKPX Adieresis guillemotle" -"ft -53\nKPX Adieresis guilsinglleft -67\nKPX Adieresis hyphen -30\nKPX Adieresis" -" o -37\nKPX Adieresis period 0\nKPX Adieresis q -38\nKPX Adieresis quotedblright" -" -76\nKPX Adieresis quoteright -108\nKPX Adieresis t -27\nKPX Adieresis u -30\nK" -"PX Adieresis v -84\nKPX Adieresis w -79\nKPX Adieresis y -83\nKPX Agrave C -73\n" -"KPX Agrave G -68\nKPX Agrave O -68\nKPX Agrave Q -68\nKPX Agrave T -59\nKPX Agra" -"ve U -66\nKPX Agrave V -130\nKPX Agrave W -116\nKPX Agrave Y -74\nKPX Agrave com" -"ma 1\nKPX Agrave period 0\nKPX Aring C -73\nKPX Aring G -68\nKPX Aring O -68\nKP" -"X Aring Q -68\nKPX Aring T -59\nKPX Aring U -66\nKPX Aring V -130\nKPX Aring W -" -"116\nKPX Aring Y -74\nKPX Aring a -5\nKPX Aring b -22\nKPX Aring c -35\nKPX Arin" -"g comma 1\nKPX Aring d -28\nKPX Aring e -32\nKPX Aring g -7\nKPX Aring guillemot" -"left -53\nKPX Aring guilsinglleft -67\nKPX Aring hyphen -30\nKPX Aring o -37\nKP" -"X Aring period 0\nKPX Aring q -38\nKPX Aring quotedblright -76\nKPX Aring quoter" -"ight -108\nKPX Aring t -27\nKPX Aring u -30\nKPX Aring v -84\nKPX Aring w -79\nK" -"PX Aring y -83\nKPX Atilde C -73\nKPX Atilde G -68\nKPX Atilde O -68\nKPX Atilde" -" Q -68\nKPX Atilde T -59\nKPX Atilde U -66\nKPX Atilde V -130\nKPX Atilde W -116" -"\nKPX Atilde Y -74\nKPX Atilde comma 1\nKPX Atilde period 0\nKPX B A -34\nKPX B " -"AE -32\nKPX B Aacute -34\nKPX B Acircumflex -34\nKPX B Adieresis -34\nKPX B Arin" -"g -34\nKPX B Atilde -34\nKPX B O -12\nKPX B OE -4\nKPX B Oacute -12\nKPX B Ocirc" -"umflex -12\nKPX B Odieresis -12\nKPX B Ograve -12\nKPX B Oslash -11\nKPX B V -45" -"\nKPX B W -46\nKPX B Y -44\nKPX C A -25\nKPX C AE -22\nKPX C Aacute -25\nKPX C A" -"dieresis -25\nKPX C Aring -25\nKPX C H -2\nKPX C K -6\nKPX C O -14\nKPX C Oacute" -" -14\nKPX C Odieresis -14\nKPX Ccedilla A -33\nKPX D A -55\nKPX D Aacute -55\nKP" -"X D Acircumflex -55\nKPX D Adieresis -55\nKPX D Agrave -55\nKPX D Aring -55\nKPX" -" D Atilde -55\nKPX D J -40\nKPX D T -7\nKPX D V -60\nKPX D W -50\nKPX D X -51\nK" -"PX D Y -59\nKPX F A -79\nKPX F Aacute -79\nKPX F Acircumflex -79\nKPX F Adieresi" -"s -79\nKPX F Agrave -79\nKPX F Aring -79\nKPX F Atilde -79\nKPX F J -42\nKPX F O" -" -7\nKPX F Odieresis -7\nKPX F a -50\nKPX F aacute -50\nKPX F adieresis -22\nKPX" -" F ae -53\nKPX F aring -50\nKPX F comma -59\nKPX F e -51\nKPX F eacute -51\nKPX " -"F hyphen -34\nKPX F i -1\nKPX F j -26\nKPX F o -54\nKPX F oacute -54\nKPX F odie" -"resis -24\nKPX F oe -51\nKPX F oslash -53\nKPX F period -60\nKPX F r -7\nKPX F u" -" -10\nKPX G A -27\nKPX G AE -24\nKPX G Aacute -27\nKPX G Acircumflex -27\nKPX G " -"Adieresis -27\nKPX G Agrave -27\nKPX G Aring -27\nKPX G Atilde -27\nKPX G T -41\n" -"KPX G V -33\nKPX G W -35\nKPX G Y -33\nKPX J A -30\nKPX J AE -27\nKPX J Adieresi" -"s -30\nKPX J Aring -30\nKPX K C -61\nKPX K G -56\nKPX K O -56\nKPX K OE -46\nKPX" -" K Oacute -56\nKPX K Odieresis -56\nKPX K S 13\nKPX K T -2\nKPX K a 6\nKPX K adi" -"eresis 6\nKPX K ae 3\nKPX K aring 6\nKPX K e -20\nKPX K hyphen -47\nKPX K o -25\n" -"KPX K oacute -25\nKPX K odieresis -25\nKPX K u -18\nKPX K udieresis -18\nKPX K y" -" -83\nKPX L A -1\nKPX L AE 1\nKPX L Aacute -1\nKPX L Adieresis -1\nKPX L Aring -" -"1\nKPX L C -11\nKPX L Ccedilla -14\nKPX L G -5\nKPX L O -5\nKPX L Oacute -5\nKPX" -" L Ocircumflex -5\nKPX L Odieresis -5\nKPX L Ograve -5\nKPX L Otilde -5\nKPX L S" -" 2\nKPX L T -74\nKPX L U -29\nKPX L Udieresis -29\nKPX L V -106\nKPX L W -87\nKP" -"X L Y -89\nKPX L hyphen 24\nKPX L quotedblright -37\nKPX L quoteright -69\nKPX L" -" u -11\nKPX L udieresis -12\nKPX L y -49\nKPX N A -19\nKPX N AE -16\nKPX N Aacut" -"e -19\nKPX N Adieresis -19\nKPX N Aring -19\nKPX N C -22\nKPX N Ccedilla -22\nKP" -"X N G -16\nKPX N O -15\nKPX N Oacute -15\nKPX N Odieresis -15\nKPX N a -16\nKPX " -"N aacute -16\nKPX N adieresis -16\nKPX N ae -18\nKPX N aring -16\nKPX N comma 1\n" -"KPX N e -13\nKPX N eacute -13\nKPX N o -16\nKPX N oacute -16\nKPX N odieresis -1" -"6\nKPX N oslash -15\nKPX N period 0\nKPX N u -17\nKPX N udieresis -17\nKPX O A -" -"55\nKPX O AE -54\nKPX O Aacute -55\nKPX O Adieresis -55\nKPX O Aring -55\nKPX O " -"T -9\nKPX O V -60\nKPX O W -54\nKPX O X -51\nKPX O Y -59\nKPX Oacute A -55\nKPX " -"Oacute T -9\nKPX Oacute V -60\nKPX Oacute W -54\nKPX Oacute Y -59\nKPX Ocircumfl" -"ex T -9\nKPX Ocircumflex V -60\nKPX Ocircumflex Y -59\nKPX Odieresis A -55\nKPX " -"Odieresis T -9\nKPX Odieresis V -60\nKPX Odieresis W -54\nKPX Odieresis X -51\nK" -"PX Odieresis Y -59\nKPX Ograve T -9\nKPX Ograve V -60\nKPX Ograve Y -59\nKPX Osl" -"ash A -52\nKPX Otilde T -9\nKPX Otilde V -60\nKPX Otilde Y -59\nKPX P A -81\nKPX" -" P AE -94\nKPX P Aacute -81\nKPX P Adieresis -81\nKPX P Aring -81\nKPX P J -68\n" -"KPX P a -19\nKPX P aacute -19\nKPX P adieresis -19\nKPX P ae -22\nKPX P aring -1" -"9\nKPX P comma -85\nKPX P e -29\nKPX P eacute -29\nKPX P hyphen -39\nKPX P o -33" -"\nKPX P oacute -33\nKPX P odieresis -22\nKPX P oe -30\nKPX P oslash -33\nKPX P p" -"eriod -86\nKPX R C -36\nKPX R Ccedilla -37\nKPX R G -30\nKPX R O -29\nKPX R OE -" -"22\nKPX R Oacute -29\nKPX R Odieresis -29\nKPX R T -26\nKPX R U -37\nKPX R Udier" -"esis -37\nKPX R V -53\nKPX R W -55\nKPX R Y -53\nKPX R a 7\nKPX R aacute 7\nKPX " -"R adieresis 7\nKPX R ae 4\nKPX R aring 7\nKPX R e -19\nKPX R eacute -19\nKPX R h" -"yphen -30\nKPX R o -24\nKPX R oacute -24\nKPX R odieresis -24\nKPX R oe -21\nKPX" -" R u -17\nKPX R uacute -17\nKPX R udieresis -17\nKPX R y -27\nKPX S A -24\nKPX S" -" AE -21\nKPX S Aacute -24\nKPX S Adieresis -24\nKPX S Aring -24\nKPX S T -16\nKP" -"X S V -9\nKPX S W -10\nKPX S Y -8\nKPX S t -10\nKPX T A -46\nKPX T AE -44\nKPX T" -" Aacute -46\nKPX T Acircumflex -46\nKPX T Adieresis -46\nKPX T Agrave -46\nKPX T" -" Aring -46\nKPX T Atilde -46\nKPX T C -17\nKPX T G -11\nKPX T J -43\nKPX T O -9\n" -"KPX T OE -3\nKPX T Oacute -9\nKPX T Ocircumflex -9\nKPX T Odieresis -9\nKPX T Og" -"rave -9\nKPX T Oslash -11\nKPX T Otilde -9\nKPX T S -2\nKPX T V 11\nKPX T W 9\nK" -"PX T Y 11\nKPX T a -65\nKPX T ae -69\nKPX T c -88\nKPX T colon -85\nKPX T comma " -"-63\nKPX T e -85\nKPX T g -68\nKPX T guillemotleft -99\nKPX T guilsinglleft -113" -"\nKPX T hyphen -73\nKPX T i -16\nKPX T j -40\nKPX T o -88\nKPX T oslash -87\nKPX" -" T period -64\nKPX T r -61\nKPX T s -59\nKPX T semicolon -85\nKPX T u -89\nKPX T" -" v -106\nKPX T w -107\nKPX T y -104\nKPX U A -54\nKPX U AE -52\nKPX U Aacute -54" -"\nKPX U Acircumflex -54\nKPX U Adieresis -54\nKPX U Aring -54\nKPX U Atilde -54\n" -"KPX U comma -17\nKPX U m -23\nKPX U n -25\nKPX U p -28\nKPX U period -18\nKPX U " -"r -29\nKPX Uacute A -54\nKPX Uacute comma -17\nKPX Uacute m -23\nKPX Uacute n -2" -"5\nKPX Uacute p -28\nKPX Uacute period -18\nKPX Uacute r -29\nKPX Ucircumflex A " -"-54\nKPX Udieresis A -54\nKPX Udieresis b 10\nKPX Udieresis comma -17\nKPX Udier" -"esis m -23\nKPX Udieresis n -25\nKPX Udieresis p -28\nKPX Udieresis period -18\n" -"KPX Udieresis r -29\nKPX Ugrave A -54\nKPX V A -113\nKPX V AE -113\nKPX V Aacute" -" -113\nKPX V Acircumflex -113\nKPX V Adieresis -113\nKPX V Agrave -113\nKPX V Ar" -"ing -113\nKPX V Atilde -113\nKPX V C -70\nKPX V G -64\nKPX V O -63\nKPX V Oacute" -" -63\nKPX V Ocircumflex -63\nKPX V Odieresis -63\nKPX V Ograve -63\nKPX V Oslash" -" -65\nKPX V Otilde -63\nKPX V S -25\nKPX V T 8\nKPX V a -87\nKPX V ae -90\nKPX V" -" colon -94\nKPX V comma -94\nKPX V e -86\nKPX V g -86\nKPX V guillemotleft -98\n" -"KPX V guilsinglleft -112\nKPX V hyphen -68\nKPX V i -13\nKPX V o -89\nKPX V osla" -"sh -87\nKPX V period -95\nKPX V r -60\nKPX V semicolon -94\nKPX V u -58\nKPX V y" -" -56\nKPX W A -98\nKPX W AE -102\nKPX W Aacute -98\nKPX W Acircumflex -98\nKPX W" -" Adieresis -98\nKPX W Agrave -98\nKPX W Aring -98\nKPX W Atilde -98\nKPX W C -58" -"\nKPX W G -52\nKPX W O -51\nKPX W Oacute -51\nKPX W Ocircumflex -51\nKPX W Odier" -"esis -51\nKPX W Ograve -51\nKPX W Oslash -50\nKPX W Otilde -51\nKPX W S -24\nKPX" -" W T 9\nKPX W a -70\nKPX W ae -73\nKPX W colon -81\nKPX W comma -72\nKPX W e -67" -"\nKPX W g -70\nKPX W guillemotleft -79\nKPX W guilsinglleft -93\nKPX W hyphen -4" -"9\nKPX W i -12\nKPX W o -70\nKPX W oslash -69\nKPX W period -73\nKPX W r -49\nKP" -"X W semicolon -80\nKPX W u -45\nKPX W y -44\nKPX X C -63\nKPX X O -56\nKPX X Odi" -"eresis -56\nKPX X Q -57\nKPX X a 0\nKPX X e -27\nKPX X hyphen -43\nKPX X o -32\n" -"KPX X u -25\nKPX X y -90\nKPX Y A -64\nKPX Y AE -62\nKPX Y Aacute -64\nKPX Y Aci" -"rcumflex -64\nKPX Y Adieresis -64\nKPX Y Agrave -64\nKPX Y Aring -64\nKPX Y Atil" -"de -64\nKPX Y C -71\nKPX Y G -65\nKPX Y O -64\nKPX Y Oacute -64\nKPX Y Ocircumfl" -"ex -64\nKPX Y Odieresis -64\nKPX Y Ograve -64\nKPX Y Oslash -68\nKPX Y Otilde -6" -"4\nKPX Y S -26\nKPX Y T 7\nKPX Y a -83\nKPX Y ae -87\nKPX Y colon -103\nKPX Y co" -"mma -80\nKPX Y e -93\nKPX Y g -86\nKPX Y guillemotleft -111\nKPX Y guilsinglleft" -" -125\nKPX Y hyphen -87\nKPX Y i -14\nKPX Y o -96\nKPX Y oslash -95\nKPX Y p -72" -"\nKPX Y period -81\nKPX Y semicolon -103\nKPX Y u -76\nKPX Y v -78\nKPX Z v -45\n" -"KPX Z y -44\nKPX a j -39\nKPX a quoteright -34\nKPX a v -39\nKPX a w -40\nKPX a " -"y -44\nKPX aacute v -39\nKPX aacute w -40\nKPX aacute y -44\nKPX adieresis v -39" -"\nKPX adieresis w -40\nKPX adieresis y -44\nKPX ae v -34\nKPX ae w -35\nKPX ae y" -" -37\nKPX agrave v -39\nKPX agrave w -40\nKPX agrave y -44\nKPX aring v -39\nKPX" -" aring w -40\nKPX aring y -44\nKPX b v -39\nKPX b w -40\nKPX b y -42\nKPX c h -1" -"7\nKPX c k -18\nKPX comma one -12\nKPX comma quotedblright 9\nKPX comma quoterig" -"ht -23\nKPX e quoteright -19\nKPX e t -10\nKPX e v -29\nKPX e w -30\nKPX e x -19" -"\nKPX e y -31\nKPX eacute v -29\nKPX eacute w -30\nKPX eacute y -31\nKPX ecircum" -"flex v -29\nKPX ecircumflex w -30\nKPX ecircumflex y -31\nKPX eight four 11\nKPX" -" eight one -19\nKPX eight seven 0\nKPX f a -17\nKPX f aacute -17\nKPX f adieresi" -"s 14\nKPX f ae -21\nKPX f aring -15\nKPX f e -29\nKPX f eacute -29\nKPX f f 12\n" -"KPX f i 22\nKPX f j -1\nKPX f l 33\nKPX f o -32\nKPX f oacute -32\nKPX f odieres" -"is 11\nKPX f oe -29\nKPX f oslash -31\nKPX f quoteright 18\nKPX f s -8\nKPX f t " -"-3\nKPX five four 1\nKPX five one -28\nKPX five seven -9\nKPX four four 13\nKPX " -"four one -35\nKPX four seven -16\nKPX g a -15\nKPX g adieresis -15\nKPX g ae -18" -"\nKPX g aring -15\nKPX g e -20\nKPX g eacute -20\nKPX g l 0\nKPX g oacute -20\nK" -"PX g odieresis -20\nKPX g r 1\nKPX guillemotright A -40\nKPX guillemotright AE -" -"46\nKPX guillemotright Aacute -40\nKPX guillemotright Adieresis -40\nKPX guillem" -"otright Aring -40\nKPX guillemotright T -100\nKPX guillemotright V -102\nKPX gui" -"llemotright W -84\nKPX guillemotright Y -106\nKPX guilsinglright A -54\nKPX guil" -"singlright AE -60\nKPX guilsinglright Aacute -54\nKPX guilsinglright Adieresis -" -"54\nKPX guilsinglright Aring -54\nKPX guilsinglright T -114\nKPX guilsinglright " -"V -116\nKPX guilsinglright W -98\nKPX guilsinglright Y -120\nKPX h quoteright -3" -"0\nKPX h y -34\nKPX hyphen A -18\nKPX hyphen AE -24\nKPX hyphen Aacute -18\nKPX " -"hyphen Adieresis -18\nKPX hyphen Aring -18\nKPX hyphen T -74\nKPX hyphen V -72\n" -"KPX hyphen W -54\nKPX hyphen Y -83\nKPX i T -18\nKPX i j -36\nKPX k a -3\nKPX k " -"aacute -3\nKPX k adieresis -3\nKPX k ae -7\nKPX k aring -3\nKPX k comma 0\nKPX k" -" e -33\nKPX k eacute -33\nKPX k g -4\nKPX k hyphen -47\nKPX k o -38\nKPX k oacut" -"e -38\nKPX k odieresis -38\nKPX k period 0\nKPX k s 5\nKPX k u -5\nKPX k udieres" -"is -5\nKPX l v -22\nKPX l y -19\nKPX m p -16\nKPX m v -32\nKPX m w -33\nKPX m y " -"-33\nKPX n T -56\nKPX n p -14\nKPX n quoteright -28\nKPX n v -31\nKPX n w -32\nK" -"PX n y -32\nKPX nine four 2\nKPX nine one -26\nKPX nine seven 10\nKPX o T -88\nK" -"PX o quoteright -27\nKPX o t -10\nKPX o v -42\nKPX o w -38\nKPX o x -29\nKPX o y" -" -42\nKPX oacute v -42\nKPX oacute w -38\nKPX oacute y -42\nKPX ocircumflex t -1" -"0\nKPX odieresis t -10\nKPX odieresis v -42\nKPX odieresis w -38\nKPX odieresis " -"x -29\nKPX odieresis y -42\nKPX ograve v -42\nKPX ograve w -38\nKPX ograve y -42" -"\nKPX one comma -16\nKPX one eight -34\nKPX one five -16\nKPX one four -56\nKPX " -"one nine -9\nKPX one one -27\nKPX one period -17\nKPX one seven -56\nKPX one six" -" -47\nKPX one three -10\nKPX one two -2\nKPX one zero -35\nKPX p t -11\nKPX p y " -"-34\nKPX period one -21\nKPX period quotedblright 5\nKPX period quoteright -27\n" -"KPX q c -13\nKPX q u -15\nKPX quotedblbase A 19\nKPX quotedblbase AE 20\nKPX quo" -"tedblbase T -59\nKPX quotedblbase V -98\nKPX quotedblbase W -75\nKPX quotedblbas" -"e Y -73\nKPX quotedblleft A -59\nKPX quotedblleft AE -78\nKPX quotedblleft Aacut" -"e -59\nKPX quotedblleft Adieresis -59\nKPX quotedblleft Aring -59\nKPX quotedbll" -"eft T 9\nKPX quotedblleft V 15\nKPX quotedblleft W 13\nKPX quotedblleft Y 15\nKP" -"X quotedblright A -72\nKPX quotedblright AE -91\nKPX quotedblright Aacute -72\nK" -"PX quotedblright Adieresis -72\nKPX quotedblright Aring -72\nKPX quotedblright T" -" 4\nKPX quotedblright V 5\nKPX quotedblright W 4\nKPX quotedblright Y 6\nKPX quo" -"teleft A -92\nKPX quoteleft AE -111\nKPX quoteleft Aacute -92\nKPX quoteleft Adi" -"eresis -92\nKPX quoteleft Aring -92\nKPX quoteleft T -22\nKPX quoteleft V -17\nK" -"PX quoteleft W -19\nKPX quoteleft Y -17\nKPX quoteright A -91\nKPX quoteright AE" -" -110\nKPX quoteright Aacute -91\nKPX quoteright Adieresis -91\nKPX quoteright A" -"ring -91\nKPX quoteright comma -34\nKPX quoteright d -31\nKPX quoteright o -34\n" -"KPX quoteright period -35\nKPX quoteright r -26\nKPX quoteright s -17\nKPX quote" -"right t -19\nKPX quoteright v -25\nKPX quoteright w -23\nKPX quoteright y -22\nK" -"PX r a -6\nKPX r aacute -6\nKPX r acircumflex -6\nKPX r adieresis -6\nKPX r ae -" -"8\nKPX r agrave -6\nKPX r aring -6\nKPX r c -15\nKPX r ccedilla -10\nKPX r colon" -" -16\nKPX r comma -67\nKPX r d -13\nKPX r e -11\nKPX r eacute -11\nKPX r ecircum" -"flex -11\nKPX r egrave -11\nKPX r f 11\nKPX r g -5\nKPX r h -15\nKPX r hyphen -1" -"8\nKPX r i 6\nKPX r j -12\nKPX r k -15\nKPX r l -14\nKPX r m 6\nKPX r n 4\nKPX r" -" o -14\nKPX r oacute -14\nKPX r ocircumflex -14\nKPX r odieresis -14\nKPX r oe -" -"12\nKPX r ograve -14\nKPX r oslash -14\nKPX r p 4\nKPX r period -68\nKPX r q -15" -"\nKPX r quoteright -8\nKPX r r 0\nKPX r s 0\nKPX r semicolon -16\nKPX r t 9\nKPX" -" r u 9\nKPX r v 8\nKPX r w 7\nKPX r x 11\nKPX r y 9\nKPX r z -1\nKPX s quoterigh" -"t -17\nKPX s t -7\nKPX seven colon -64\nKPX seven comma -57\nKPX seven eight -18" -"\nKPX seven five -34\nKPX seven four -54\nKPX seven one -25\nKPX seven period -5" -"8\nKPX seven seven -6\nKPX seven six -37\nKPX seven three -20\nKPX seven two -21" -"\nKPX six four 13\nKPX six one -43\nKPX six seven -7\nKPX t S 11\nKPX t a 11\nKP" -"X t aacute 11\nKPX t adieresis 11\nKPX t ae 7\nKPX t aring 11\nKPX t colon -12\n" -"KPX t e -1\nKPX t eacute -1\nKPX t h -4\nKPX t o -4\nKPX t oacute -4\nKPX t odie" -"resis -4\nKPX t quoteright -31\nKPX t semicolon -12\nKPX three four 9\nKPX three" -" one -33\nKPX three seven -15\nKPX two four 14\nKPX two one -29\nKPX two seven -" -"7\nKPX u quoteright -25\nKPX v a -23\nKPX v aacute -23\nKPX v acircumflex -23\nK" -"PX v adieresis -23\nKPX v ae -25\nKPX v agrave -23\nKPX v aring -23\nKPX v atild" -"e -23\nKPX v c -40\nKPX v colon -23\nKPX v comma -56\nKPX v e -35\nKPX v eacute " -"-35\nKPX v ecircumflex -35\nKPX v egrave -35\nKPX v g -22\nKPX v hyphen -27\nKPX" -" v l -16\nKPX v o -40\nKPX v oacute -40\nKPX v odieresis -40\nKPX v ograve -40\n" -"KPX v oslash -39\nKPX v period -57\nKPX v s -16\nKPX v semicolon -23\nKPX w a -2" -"3\nKPX w aacute -23\nKPX w acircumflex -23\nKPX w adieresis -23\nKPX w ae -25\nK" -"PX w agrave -23\nKPX w aring -23\nKPX w atilde -23\nKPX w c -36\nKPX w colon -23" -"\nKPX w comma -50\nKPX w e -33\nKPX w eacute -33\nKPX w ecircumflex -33\nKPX w e" -"grave -33\nKPX w g -22\nKPX w hyphen -23\nKPX w l -16\nKPX w o -36\nKPX w oacute" -" -36\nKPX w odieresis -36\nKPX w ograve -36\nKPX w oslash -35\nKPX w period -51\n" -"KPX w s -16\nKPX w semicolon -23\nKPX x a -2\nKPX x c -30\nKPX x e -27\nKPX x ea" -"cute -27\nKPX x o -30\nKPX x q -32\nKPX y a -32\nKPX y aacute -32\nKPX y acircum" -"flex -32\nKPX y adieresis -32\nKPX y ae -34\nKPX y agrave -32\nKPX y aring -32\n" -"KPX y atilde -32\nKPX y c -42\nKPX y colon -28\nKPX y comma -56\nKPX y e -40\nKP" -"X y eacute -40\nKPX y ecircumflex -40\nKPX y egrave -40\nKPX y g -31\nKPX y hyph" -"en -29\nKPX y l -19\nKPX y o -42\nKPX y oacute -42\nKPX y odieresis -42\nKPX y o" -"grave -42\nKPX y oslash -41\nKPX y period -57\nKPX y s -24\nKPX y semicolon -28\n" -"KPX zero four 11\nKPX zero one -31\nKPX zero seven 7\nEndKernPairs\nEndKernData\n" -"EndFontMetrics\n" -; -int n021004l_pfb_len = 44729; -char* n021004l_pfb = -"\x80\x1i\x6\x0\x0%!PS-AdobeFont-1.0: NimbusRomNo9L-Medi 1.05\n%%CreationDate: We" -"d Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developmen" -"t\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPY" -"ING (GNU General Public License) for license conditions.\n% As a special excepti" -"on, permission is granted to include this font\n% program in a Postscript or PDF" -" file that consists of a document that\n% contains text to be displayed or print" -"ed using this font, regardless\n% of the conditions or license applying to the d" -"ocument itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) rea" -"donly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See " -"the file COPYING (GNU General Public License) for license conditions. As a speci" -"al exception, permission is granted to include this font program in a Postscript" -" or PDF file that consists of a document that contains text to be displayed or p" -"rinted using this font, regardless of the conditions or license applying to the " -"document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by " -"(URW)++ Design & Development) readonly def\n/FullName (Nimbus Roman No9 L Medium" -") readonly def\n/FamilyName (Nimbus Roman No9 L) readonly def\n/Weight (Bold) re" -"adonly def\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -1" -"00 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusRomNo9L-M" -"edi def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-168 -341 1000 960} readonly" -" def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/" -"Encoding StandardEncoding def\n/UniqueID 5020933 def\ncurrentdict end\ncurrentfi" -"le eexec\r\x80\x2(\xa6\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3" -"[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r" -"\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff" -"++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93" -"\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81" -"nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff" -"\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>m\xb1\x7f\xae\x18\x99$" -"\x3Jin\xf2`\x15\xa8\xe3h\xa7\x91\x66$:Y\xba<\x9c \xd7\x5\xb1\x8c\xb8\xef\x7kx\\M" -"\xa7 y\x92~\x1c\xfe\xb1r0\xd5\xe8g\x1eZb \x8d\xf9\xcc%\x66%;\xdbk\xd6\x81\xc6\xb9" -"\xbGTN}fR\x1c\xf1\xb4\xdc\xda\xe1z\x9a\x87\xbd\xeb\x82\x87\x97\x9bO\x1e\x9l\xd3\xbc" -"\xb8\x32\xed_\xb6\xc9\xf1\x91\x86\xba\xcd\x9f\x9c\xf2\x1f\xdb\x16\x0\xbd\xac\x1\xfb" -"\xba\x1bQ)@dS\x12X%P\x13\x64\xa9@\xae\xcb\x65\x8bY\xdb\x81\x12~\xcd\xd5\x39\xcc+" -"\x1\xbf\x32\xe3\x98\x18\xc6\xd6\x81wA-\x9b\"\x88\xa4\xcd\xa1\x99\xce\x15\x15\xfa" -"\xbdnL\xb3Z\xf8\xc\xc5\x92\xd1h\xed\x81\xa1\x41\x81\xab\x2\xbaI\x18\xed\xf2\x66W" -"\x94#\x14^\xcbg\x12\xb7\x30w\xc3\x34\x89\x81\x94\xf6\xb7\xf8=\xf4\x1dl\xd3]I\x10" -"\xfd\xc6\"\xd3m\xa6\x8b\xc1\x14^8\xda&\x9b\x88\x93\x9c\x31y\xec\xb4)\"\xfc\x81\x8" -"\x18ns\xe3m\x10u\xc3\x34/\x88\xa9\xb3\xbd\xb6\x8\x84\xb8\x32\x97\xef\xff\x61\x98" -"\xc5\xb\xd6\x1a\xb4\xb8%\x8b\x1arO\x7f\xc8l\xdc\xb1G\xc6\xea\xc2@\xcd\xf6\xb3\xdc" -"a\xfd\xd2\xe4o\xa7\x0 <]\xbb\x30\x64\xc4Q\xb4\x12\xbc\xea\xca\xd0\xbe\xde(zOhY\xb" -"y\x93\xb7\xfa\xdc\xf3\xfd\xcbx]\x98?C\xe5\x0~\xe6~N\x97=9\xc4\x8f\xf8/w\x2\x63\xd3" -"\xf1\xf0\x19\xe7g\"\x9I\xc5\x0\xb9\x10W\x83g\xb5\xc3\x92\xc4\x99\x41\x65v\x5\xe3" -"sj1\xb5\xb2\xe9\x13\x38-\xec\x85\x92\xdekv\xfap\xb8\x8d\x89U\x1c\xb9Xgt\xcb\x97\x64" -"\x18W\x84\xce\xcd\xbe\x33\xff\x19%\x1a\x4_\xc2\xe5Q\xccqC\x10\x1f\x36\x43W1\x91\x91" -"\xf2\x1e\x31\xc5\x13\xb\xf9\xef\x34/hVv\xb4\x2\xf8;\x5\x88\x11\xdbr\xc\x80,\xe3\x84" -"\x1b\xac\x9fI\x82K\x8\xf7\xa6Sg\x1b\xcK\x80\xa7\xf8\xd2!\x14\xdb\xa2J\xccV;q#\xd8" -"\xb1z\x14l\xd6\xbc\xbf\xd2\xdd\x10\xad\x37\xd8\xa9'N5^\x17\xbc\xf\xbf\xce\x8d\xe1" -"\xfc\xc5\xaf\x63\x8e\x4\x39\xc4\xfa\xad\x6\xe0\x98\x37S\xbbW\xb0\x4.\xb3\xa9\xe4" -"\xf8\x1d:d\xd7\x61\xe4\x9b\x16\xa8S\xb3\xe1\xd2s\x1d\x3\xa7\x96_)\xd3}`Y\xeeY[\x83" -"\xc6\x1e\xec\xa5\x85\x3\xf\xfe\xce\xaf\xb1\xec>jf7\xfd\xd2\x8e\x97y\xf\xf0\x1\xbb" -"\x16\x30\x38)\xe5\xaf!HT\xf3$\x1\xc8\x90\xb5\xccP}\xe5\x64o\xcf\xfb\x1d\x1e\x5\xe7" -"4\xa5\xbf\x0\xc3\x62\x8c\xae\xa5\x8aO:)\xe9u\xac\x19\x42\x8c\x33\xfb.\xc0u\x5v\xf3" -"b\xe5\xff\x66\x33\x17\xc7$K5T\x1\x88\x1d/\x85\xaa\x8e#\x5\xcb\xff\xb9\xab\xb0\xa3" -"\xd1\x89\xb6\xe1\x1cRn\xc2\xd6\xf4m\xf3\x62\xcaw\x1c\xc6\x92\xc9\x37V\x81\x16\xb4" -"\x7f\x82\x95\x4?-\xb2\x86\xfa-\xe5\xa0\x14\x1e\xbd\x34O\x16\xb0\xc8\xf4\x9c\x12\x44" -"N\xa6^\xe5\x65\xd1\x15\x2t\x8a\x30.\xc4\xd7\xbatm\x94\x87\x9b\x1c\xdd\x89\xd4O\x9b" -"\xb9\x46\x44\xc3\xe1\xa7T\x4\xd8\xf2\x8d\xa3)\xd4G;,\x95G`\xe6\x9ej\xa1\xa9\x8c:" -"\xb8\xb6z\x9d\xa4:\xb3\x65\xc8\x9d\xfb\xa9`\xcd\xb5\xed\x61+1\xd6S\x96\x2:H\xed\xbf" -"\x10\x81\xb1\x17\x9b\xcb\x8e\xf8\xef\xf1\x85\xf7l\x92\xc3\xc8IN\x8b\x61\xa0\xe6L" -"0\x96\xc7\x7fT\xe7V*\x9e\xa6\xfe\x9d\x8d\xca\xf1\xcc\xa1\x94\xcd\x43m\xde\x81-\x7" -"\xf5\x81\x90L\x7fO\xc3V\x8eIGLw\xbd\x85?qv'\x8a\x87g\xf2\xa0;kS\x19\xd5\x7g\xa2\n" -"\xf4$\xd1iy\x18\xb3\xce\x87\xc0\xa0:\xc2\x8f\n\xb4\xd8\xcb)H\xd5\xabV\xf2JH\x5\xea" -"\x9\x16\xb2\x33$)\xc9\x66\x1a\x9a\xa2(BWH\x18\xd8\xe2\xe3\x30\x62\x1b\x16,\xd2\xac" -"W\xc6.\xce\xf6\x8a*:Q\xc6\x41\xd6\x5\x1eG\xeb\xe7\x92\xbb\xb\xf7\x9f\x15\xad\n\x61" -"=\xda\xc@V\xe4\xe9\x12\xcf\xfd\x92\x38`}\xa3t\xf8\x12j\xe3V\x89\xed>\x87%\xa8s\xd7" -"\xbd\x1e\xcf\x17Z\xe3:\xc8\xc1\xb2\xd7\x41\xdc\x9d\xc3\xf7oEz\xe5\x37\xf\xdc\xf8" -"5Z\xbb\xa2!\xd1WAZ\xcb\xb8\x66\xf3\x14\x8a\xe2*M\xbe\xc6\xe1\xe8\xa7\x15\x92\xb4" -"!g\xb3\xe3\xe3\xa2\"\x18\xa7r\x8\xa3jGX\x6\x88\x35K\xbm\xe1\xb9\xfe\x91\xfb\xa8\xec" -"\xd0^\xd2\"\xb~Y\x1c\x61u\xca\x94\xb2[\x88\xb6\xa8Yl\xf1\x1\xf5@\xfd\x13\xf0\x35" -"\xf\x9a\x97\x8e\xecP\xad\xc2\xc7j\x9c\x89\xef\xd8\xab<\xf6<\x95q\xad\x12oJ{\xd8\xca" -"\x1d\x92\x62\x1b)\x9f\xc6R\xc7\x83\x14LT CH)\xd4\xc\x61\xc9\x63\x44\xfc\xc4@\x85" -"\x5\xdfN\xf7o\xfdG\x1d\xc4}\xf0\xf9\xa1\x11!\xf9>\xfe&/\x89\x8c\xf3+\xaf$\x18\xe0" -"\xc3\xb2\xf1\xb5m\xa0\xf7\xcf\xe1\xc6\x9%\xc5~K\x82U\xb9 <\xd2Q\xcd\x81\xcb\x8a\xfc" -"\xe3\xf5&\xd8\xf3(\xa8\xf\x33\xbc\x43\xfbQ{.\xcd\xc1o\xb8\x64\xa1\xb1\xca\x36\xb0" -"V\xa2|\x1\xd6\xa7\xf6U@\x90\x64\xec\x92,\xb5x\x1dp\xd9\x8e\x81\x92\xbe\xc6|\x9f\xbb" -"\xa6]\xe2\xbc\x84K!sf\x13\xe0\xdf\xa6\xf9\x1\xda\x62q3\xecg\xce\xed\x63w\xa3/m]\x10" -"\xf8\xd4\x1b\x15__\xb}\xaf\xfc\x1\xfa;\xe0T\xa7\xd9\x98\xc0\xf6\x91\xff\xc0\xee\x45" -"\x17\x61(\x7f-z|\x8\x44\xb6\xdc\x10U]'\x83\x66k\xb5\x17\x8a\xc4\x61\x61o\x16i\x9c" -"\xe1\x1d\xd5\x44l\\\x18\x2{q\xbd\xff\xd0\x39\x92\x64t3\xe5\x85\xce\x31vd\x9b\x1a" -"Ly_6\x95\x30\xc1\x99\x45\x3\x46\xad\xeb\xef\x1e\xd2\x17Q\x10\x91:\x8e\x8/R\x11\xf5" -"s@\xa4\x61\xa7\x90\xe8\xa8@N\x2\x45\xc9\x32#\x11xe\x10\x63K]\xa2\xe1\xbc`\xa9\xa7" -"#\x1\xf1\x39\x46\xbb\xd6\x9@5?\xb3\x9d\x84\xc6ueGU\x8b\xd1\xa6}\xf\xee\xc9\xc6\xf6" -"\x2>C\xb4>\xe2w(\xe6G\x2\x3\x8c\xed\xa4\xc7\xb9\xe7\xaa\x3l\xa3\x10Z`\xb9\xe8\xd0" -"\xd4\x5\x2x\x15\x1b\x42\xb6\xc3\x64n&\xa5\x88\x66\xd9\xba\xf5-\x1\x32\x12\xb9q\xc8" -"g\xe\xb6Vxc\xf9?Xi\x8a\xb2\xa4\xe7\x31\x9bmG\xf5\xa0\xb1\xd5\x18\xf'k\xbf\xb6^w\xf5" -"\xca\x65\xeb\xcf\x15\xcah\xd7U\xc3\x8a\xd2\x96's\xac\xac\x8f\x8\x8c\xeT\x1\xc6'\xf5" -"\xe7v\xcf\x1Z\x90\xa6\xad=\xde\x8\xf4.\x9Po\xac\xa1:\xad\x66\xefmk\xdcQ\x10\xca\xab" -"J\xddx\x96,\xfc<\xa0Y\xa7\x8c\x34\xc9j\x10\xc8X':?\x94\xa9%\x1a\xfb\x81P\xfe\xac" -"\r]F\xb0\x14*\x11}\xa3\x96.\x84r\x91\x38\x12\xf2\x34\x9c\x91\xef='\xddq\xfb\xe1p" -":\x1c\xdc\xdcV\x8@\xab\xe1h0\x10\x88\x99l\xad\x88\x87\xf7\xe2\x37\xe0@\x96\x13\xed" -"D\x94!\xe5\x32\xc6`L\x5\x9c\xe0\x17\x8c\x1b\xdb\xed\xf\x31\xfc\n\xd7\x35\x88\xdd" -"\xc6\x63\xe2\xad.k\xb7\xb2\x94\x19\x37j\x9e\xac{\x88q\x9a\xb3\x8e>\x3LRD\x82\xdf\x1b\xe1\x81" -"\n\xe5\xad\x86\x46\x91\x9f+\x1d\xf3\xaf\x66\x63\xd8(3\x82\xb\xdd\xa7\x82y\x96\xc7" -"\x80\xb5\xb9\xf2\xbc\x94(\xad\xb1\x85\x8e\xcd\xdbz\xec\x66\xa6\x63\xed~\xfc\xb6V" -"-\xaf\x80\xc8\x18`{\x1b\xac\xbfO\xd5S\x11\xe4\xb7\xc\xael\x8cv\r<_\xdb\xe7\x83\xdb" -"\xb5\xd3\xc9\xf7\xe8\xf6\x19\xac\x65\x8f\x7&\x1a\x66\xc3\x11q\xf6H8\xe5\xf2\x87P" -"\x11\xfb\xae\x39\xe0{Pb\xa7\xa4\xfe\x96\xfc\xcd\x5M\xa4\x17\xa7#\xa3\xff\x1c\xec" -"e\xd4\x98\x17\xb9\x8a\xcc.\x93\xb1U\x1eu\r\xeb\xfc\x63=\x13\"\xf7KM\xc5\x81\xd1\xc0" -"]{\x91\x38^\xf5\x82v\xbb\x1dZ\x1dxs`\x1c\x17R\xce\x8\xce\x88 T\xe0\xeb\x17\x1\x19" -"\xe9\xf\xf7\xc8\x46\x15\xe3j\xb2\xebj*\xa2\xdeo9\xcdY\x91\x30I-\x9\xa6\x84-g\x0\xa8" -"(\x3\x32\xba\"R\x1al\x16G0\x4\x66#`%Y\xc5\x5\x96\xb9\xff\x0\xaer\xf9\x42\x2I\x82" -"\xc2S%\xe7l%Yf\xe3\xc6\x1c\x82\xa5\x7\x37[\xb5\xf6\xcbV'\xbfqI9BB9\xc6\x18\xf1\xda" -"\xde\x35O\x15p\x81n\xd4\x0\xef\xd3sR\x92^\x4\xde]\x18\x7\x0\x8d?,\x1>\x2l\xfKl\x0" -"\xf8\xf4\xf6\x19?\x96\x8e\xea{\x18jm3\xf6\xb\xf\xb5\x37\xd4\xe4\x9y\x96\xc6<7\x91" -"&fBz\x9d\x9b\x10}\xaf\xba\x38m\xe6\x44\x1fkX_\x13\x32\xee\xe8\xc3.\x93\xb2\x3\x6" -"\xb0\xa9\xf5\xc3\x37\x1e\xbb\xc5\xb2S\x83Y[(I\x83\xc5\xf4\xbc\x85\x42\x4jL$\x87\xca" -"Y\xc0\xae\xab\x9b\xf7~J\xbb\xec\x83\xe7\x1f\x1c\x84\x84\xc1\xae\x9c*\xed\x42\x15" -"\x89\xd9\x98\r\x93\xdb\xd0\xb\x32\xb9\x8a\xef?_f\x91\x8a\x43\xd2\xf9\x30\x8_\x9d" -"\xdc\xa4!Ic=\xf4\xb0\x89\xf6\xb2\xc7\x9b\xbd\xac\xabp\xe1\xff \x87\xaf\xbe\x8c\xca" -"C\xf2m\xbf\xafN@a\x15\x5\xfa\xeaOkE\xe6:\x1f\xe5I\x84\xdb\x13`c]|\x0\xee\xf\xbf\x7f" -"D\xa7\x37\x66\x62@\xf2\xdf\x1\x9\x81\x1a\xb7\x8f\xac$\xe9\xa8\x5M=kcY\xa6\xbb\xeb" -"\x93\x92\xee@\xbex\xe1\xba\xd8\xef\xc4\xb5\x9c;\xbdQ\x13\xe4\x1aq\x91\xdb\x61\x13" -"\x96P\x11~ewj\xbd/\x8e\x9b\xab\x18\xefW\xf7~\xf4\x1fl\xf8\xc0\xfe\xbc\x85\x9c\xe" -"\xb1\xba\x1f\xb2\x42\xde\xe5\xaajZ\x8f\xd0\x9d\x38\x97\xec\xbf\xeaJgzC(C\xf2\xeb" -"*^\xd8\x7\x99\xbb\xdf\x1{8o\xf5\xf\xda\x9b\xdbOj\x98\x11Yt\x95\x85\x1f&7/\x1c\"\xf7" -"/s7qu4\x96\x4\xfb\xb\x90\x7f\xf9\x98(\xe\xd3\xcf\x37R\xad\xe5\xcf\xfc[\xb9\x95\x39" -"|\xc2Q\x9!WYz(\xdb\xcc:Mhb\xf0\xee\xa2\x80\x98\x8\x8a\"\xee\xd1\xbc\x8c\x9v\xdc\xd9" -"\x4\xdc(\x6\xda\x95<\x2jzb[\xbe\xcc\xbc\xa9\xbd\xfa\xeeY\xe4&\xe5\xbe\xcbuF\xb0;" -"=y\xce\xb7\xab\xe9\x62@P\xd4\xdf\xda%\x15Io|\x98\x8b\x92n_\xc0\x80\xb9\xfd\x9e\x85" -".\xcaO\x5\x13y\xa7R!\xd2\xa3w*\xdd\xad\xa1\xd1\xca\xa8\x0\xbaIas\xc4\xd4\x83S\x91" -"UX\x84\xef\xaax\xa1\xa2\xad\xff\xa6\x13\x84W\x84(\xaf^\xdd\xe7\x66+\xfaS\x9e[\xd9" -"Wx\x98z\xd1\x7flh\xb1U\xaa\xd4r\xa4\xe3t\x4\\\xbb\xcb\xde\x30\xfd\xcf\x80s\xdd\x9a" -"\x9e@\x81\x30\x62\x90\xc1\x8e\xdf\xab\xc7\xa9\x9e\xe3\xfd\xe7\x1f\x86\xd1m8s\xe8" -"\xd9\xa6,Y\xcaS9O?\x15\xb2\x14\x0\x8\xf\xc3X\x12K\x88\x39\xeb\xc9l\xaf\x62\x64\xf0" -"[\x94\xcd\x1a\x1c\x82S\x16\xd8\xe9\xc8?\x17\x84Xm\xba\x45{\xed\xf2\xe8V7s\x98\xbb" -"y\xfb\xe4W\x91\x92\x98\xbd\xf1\x31\xe6\\\x91\x80\x6\x66Q\xae\x99\xa8\x8b\xccP\xc1" -"\xba\x46\xd0\xc2\x3\xebge%\x9fU\xa3@\x12\xe9\x7\xf5z[\x10\xb0\xf9O\xbdS\xec\x98\x41" -"\xc2Iz\xf9k\xef\x44i}E\xb7\xe3v\x14\xab\xf1{\xb7\xb0\x34Rvy\x8f\x1a\x88\x85\x99\x4nJm\x84U\xfd\xc1?/-\xdbR\x9d" -"\xfe\xa2m\xbd\x11r\xc1\xb5;\xe4'\xbd\xf9\xd4+k.\xe3h\x9eHN\xaa\xda\xaf\xf4\x1b\n" -"\x84\x65\xd2\xe6`\xa6\x98\x45\xc1\x1d\xfc\xc4k\x15\x13\xf9*0m\x1a}\xd5\x8e\xf0*|" -"\x16O]\xabyZ%\xa2\xbb\x46-!N\xb\xec\xa3\xa5$\x94\x94\x44\xee{I\x18\x8f\xf8\xf\xaf" -"\xb9\xd9\xd1`\xb9\xdb\xdb\xf2\xb2\xe7\xb6\xf4w\xec\xb\xa5\xcd\x9b\x92l<\x9a\xf8\x9d" -"\x84S\x93ysa\xba@\xff\xeaq\x9d\xe7\xcf\x8d!\xb7G\x1\x99/\xbc\x4\x32m\x91+\xed\xab" -"'$\x93\x88\x9\x32\xab\x1\x30'Apf\x9e\xe\x87\x66\x89\xae\xe1\x6\x85\x12\x45g\x1fY" -"\xcd\x36\xc4\xaa\x62\xf\x3\xcd\x86~qe\xeap\xb4\x81\x89\x62\xda\x9f\x33J\x1\xfb\xbc" -"\xaa\x99\x94\xe9\xeei\xc2T3\xccJB\xf6G\"_m\x95\x19I\x8f\x65 \xc*{\xc\x10\x46\xcf" -"\xac\xef\xc0\x9d\xe1\x85\xe8\x64V\xb9\x93\xffI\n\x93\xa2\x1d\x1\x66r\x4\x90\xa1$" -"\xa7\x19\x6\n\xcd)R\"\x0\xca\xc8\xeeq\x82\xec*\xe\xb7\x8b\x15\xc2\x99*m\xf7%[F\x3" -"\x4`F\x8e\n\xb1\x62\xc\xf5\x17\x15v&\xdb_\x7f+\xc4\xa8\x12=\xfa\xd2t\x97\x35\xdd" -"\xa8\xfa\x5,\xc9qB\x19\x97\xb3$h\xf9\xdc\xb3n\\\xee\xf7\xac\xbb\xa9\x9a\xda X\x8f" -"\xe7I\x87x\xddX\xe6G\x91I\xf0K\xb3\xc\xba`\xc4\x33\x9b']\xe3GN\xb\x89'\x9a\x8b\xe5" -"^\"C\x11\xea\nl\xb5\xbe\x32\xe4\xd9.\xd2\x42\xf2\xa1\x36\x42\xbfGu\xa1\x1\xab\xed" -"3\xb5\x97\xf1\xd5+\xe4)\x99\xef\x66\x19\xd5;8\x19\xa8\x13[\xa0\xab\xa2\x89\xe5\xaf" -"\x15?\x9dL\xbay\x0Jbm2\x99\xfe\x88\xfct\x9a\xe!\x8bK\xa7\x7\xb7\xca\x1c\x93\x9e\x99" -"\xb5\x62\x82T\xb5\xfem\xb0\x33\xdb\x42\xf7>\x9b\xd5+\xf7\x97\xe2\x13\x8fH\xc6o\xb5" -";J!\xb9U}A\x9a\x17\x30<\xa5H\xab<\xcaL\xae\xb6\x16\xf9\x35\xe\xac\xaa\xac\x12t\xc" -"3qjG\x8<\xef\xaa\x1a\x34\xcc\xa4\xea\xb6N\xdf-2y\x9a\xac\xee\xa4\xfb\xfb\x41\x95" -"y\x0Q*\xf\xd5\xb\xc9\x6ZT\x97\x30\xa0Y4\x9d\x19\x46\xe2\n\xad\xbfnyE\x1a\x90\xc9" -"\x14\x8b\x84pJ\x18\\\x19x\xe4!1-\xef\x6^\xb2\x17j\x8d\xa1\xcc\xd9\xa7\x63\xd5u\xaa" -".\xbb\x91\x9f\xa5\x80\\\xe1\xd7\xa3\x8\x98O\x1a\x6\x9f\xbf,\xcaON\x84)\xa6\x62\xef" -"3\xa8!3\xfPR\xb4>B\xa8\xaa\xed\xde\xd4\xfcPp\xc8\x89TuT\x97T\xa5\x3\x8d\x9c\x8[\xac" -"\x95\xe0\x30\x66T\xa2\x96\xd8\x9b\x13\xb8\xaa_\x1d\x41\xfa\xe2\xb9\xa8[/f\x1f\xfe" -"&\xb4\x88'[\xab\x96\x8d rx\xf1\x44[\xf7=d\x8d\x63\"\xea\xf5\xf\x19\xdc\xd9\x18\xbc" -"b~}\x1fX\xa5\xfd\x89\xf1\xb\x88=\xaa\xef\xa1\xb2v\xaa\xb7*\xba.\xe7\xd4\x43v/\xc8" -"\xe2\xad\x12^\xa6\xc6|\x4\xb4\x45Z\x1d\xf4\xe0\r\x64=\xe9\xa0Z\xb3\x81\xcf\xd7Y\xae" -"\x11\xec\x92\xab\xd3\xf5g\xd8\xa2\xcd[\xee\xc6\xfc\xddKN\xa0:W\xb\xdf\xb3\x38\xac" -"Wy\xae\xf6\x38\xa3\x0\x44\x90\xcb`4\xa3\xe;4\xe6(\x2\xf2g\x13;\xadmo\x8d*\xe1\x0" -"\xaf\xc5\xd0\xc7\xc8\xb6\x14y(\xa0\xe0\xf4\x83\xa6{\x1P\xe3l\xb6\x18\xcd\x9f /\xb2\x31\xba\xd3\xe\xc1" -"\x89\x99\x39\xe3\xe0\xee\x36/6\xe\x8e\x9chh\\\x10\xd9\xfc\x1dZ\xc8)\x80<'u\xa5\xb9" -"\x1e\x36\"\x9a\x13\x41\xf2Q\xd6@\xb1\x62&\xb9\xa1\x39\xcd\x9f\x95S\xa0\x10\xae\xde" -"\xac\xe0\x1e\xb0\xb7\xed\xbd\x9b,\x8\xb0\x64\xbd\xc7:\xd1\xa8\x11k\xce\x92<\x1c\xc3" -"\xeaP\xb8\x0\x94\x93\x92\xe2\x1d \x80\x5Z\xc6=m\xa1\x1f\xe5\xe3\xdczhn$\xda)\xc4" -"0X]\xf7\xc7\x88q\x9a\x1d\x61\xd0\x36$\x15X'\xca[\xd4\xf3\xbb\x39\xee\xf4\x1f\xbd" -"xx\xe\x12\xca\xb0\x0\xdf\x9f\xa8\x44\x7\x1aZ\x15\x4|Y\xb8\xa6\xf4[4\xc5\xd9\xe3\x3" -"\xa3\xee\xa9}Ct\x1f\xa6\x31\x30\xf4\xecL\xd6Ng\xd5l\x7/\xaf^\x9f\xefr\xbd\\\xf4\x63" -"\x86\xd6\x97\xab\xec?\xd9\x37\xb\x41\xc3j\xe1\xe4\x97\xdfnE~-Zu\xe0\xe6\xac\xfc\x90" -"5\xe\xfc\x42\xda\x44\x2\n\x4Y9\r28{\xb8&x1\x1a\x9d\x95\x41o\xbe\xea\x9d\x18\xc7\xf2" -"\xc6\x9du\xec\x32\x62\x33\x8c\xd1\xc7v?q\x15\xb8\xa7\xac\xec\x1\r~6\xcf\xa4\x1c\x9e" -"\xa6N\x4j0&\xe1\xb3\xe9O/\x9eqZ\xe2\x14\xc0\x98\x9\xc1\x66\xb7\xdbH\x85\xff ]56\x1e" -"\xa8\x42\xd4\xdcl\xe9\x1b\x83\xaf\xf0\xef\xfc\x1a\xb6PidD\x87\xb7\x86\xa6*\xa5\x94" -"{\xa6\x2\x87\xe9T\x96\xb9\x1b\xcfI\x8\x33\"\x17\x63\x95\xb9ze\x2\xbfj6\xf4\x66J=" -"\xe9\x43\x15)\xc\xb5h,|5*H\xc8L|\xb9V\x85?D\xfd\xf5Y#e\xa4Q0\x2\\\x9f\x8\x42\xd3" -"'^W\x5\xf7\x93I\xa1\xe7\x96\x93s\xae\xc4\x35\x1aSJ\xdc\x0r\x96#\xe5\xaa\x6\x65=\xef" -"\x1a\xa0\x38 o\xdf\xff\xb9n<\x88\xa0\x93\xd0\x44\x11\xb5G\x97'\x4\x94\xfd\x43\xb1" -"\x1b\x1fkeU\x3Qe\x3\xb5\xf8\x45L\x9:\x86\xd1H\xe0\xbe\xfc\xb1\xdf\x14V\xd2\xe9v\xcc" -"\xe2\x7\xd7\xfc\xd7\xa6\x89\xf3\xcd\xe8\x32\x1\xf5\xc1\x43\x84\x8fO2PkA\xf5\xf6\\" -"\\\xc8\xec\xca\x81\xed\x1d\xcf\x61\xfa_\xea\xdc<\xd9\xc3\xe6\x97\xea\x13\xc4'\xce" -"\xd7I\xb8\xfd\xfd\xde$\x8d\x35\x8c\x81r\xbd-9\x8b\xe3\xc3\xe3\xcfg\xbc_\xe8VK\xf9" -"\x8e.\xd4\x3\xa4\xd8\x18\xf\xf0\xd0\xcf\x33\xb5UV\xfb\xd6\xd1:!\x91\x8;\xb5\xf1x" -"\xcb\x8cjbC\xbb\xe7|\xbd\x33.\xb5v@\xca>:\xe8k\x82p>*\xddl\xd2 \xb8.C\x96\x12\xf5" -"\xf\xe1\x9f:9\x4\xee\"Kw\xc1\x45\xd4\x88W\x85\xd4\xd1\xf0}W\xd2q\xdf#4\x85\xc\xc7" -"Cv\x1a(\xf1\xf0\x91\xfb\x37\x6\xep\xf7]h\xb7|\xb\x34\xc3\x42\xd1\xd9\x85g\xf9\xa6" -"\xb1\x18\xb\x45\xf2Qr\x1c.l\xeb\xa6\xe8\xf4\xb3\x8b\xc4u\x11*\xba\xe8\x31o\xe0zD" -"?\xd1r\xbc\xdb\xb3\xe9(\x8wq\xd3P\xbe\xf7\r\xec\xb6\x19z\xa9\xfe\xb\xe4x\x9a\x14" -"\x1a!3C\xbd\xf5\x87\x15\x13\xe1\xc3rc\xc0t[\xa6\xda\xd4\xe0-\xaa\x7\x15\xf2\x90\x1" -"k\x9c\"(e\x8ci$T\xde\xf3}\xc2\x1d\x9\xbbGZ\xcd\xda\xc2\x87\x88PK\x9,&\xe1 \xe4S\x94" -"i_\x93\x9a\x1ci\xa6\xd2\x1c\xe3\xec\x38\x96\xdb\xcb\xbaS\xd1/\x15\xb7<\x11\xc2\x1" -"l\x1d\xdc\xa3\xc0\xdd.E.\xf8,LF\xe8\x37\x18\x34\x82\x10\x6\xac\xbd\xe6$<\xcc`I\xeb" -"\xf5\x93\x41\xbb\x6\xcf\x7f\xc8;\x13\x30\xa3i\x2\x2\xbe\xda\x8f\xb2\x9\xe8\xc0\x62" -"B\x0\xb2@\x1a[\x98\xa6\xf9\x98\xfa\xb8\xb7\x4pj\xba\x97@2\x15\xa3>\x82\x9f\x9bK[" -"\x9b\xb6p\xf4\xb\xbf\xcc\xb4\xac\xf5\xe7\x8b\x5\x82\xd5L\xd7\x45\xebK=\x89\x85\"" -"\xf0\xb8\x89\x84\xe2\x30V5\xca\xee\xcbYd\xa9\x7f\xdb\x8\x4\x97\x8\x11\x3[\xd9\xc7" -"\xad\x10]\x96n\xf3WB\xb9^h\x99\xfbi\xa5\x7\xce\x98\x1\x84\x44vz\xa6\x89\x10!\xed" -"\xa4\x82\x42\x9d\xce\xf3\xdb\xf0\x80\x31\x91\xacg\xdf\x9a\xdf\xaey\x18\xee\xe9\x4" -"\xc\x1a\x92G\xe:\xd7\xf1\x2,\x97\x0Xq\xd2\xd4G>+\xd1\x66}\xe6x\xa1\x41\x17\x17\x82\xfd[2Q\x97\xf0\x8b.\xd6\xda\x3;\xe0}o\xd6\xf5\xddq2\x1d S\xe2" -"\xb3\x80msQ\xa4\xa7\x8f\xc2\xbfw\xde\x11\xc\x86\x11y\xae\xd5\x8c+&4\xeaL\xe3jI#\xd1" -"\xef\xe2\xed\xc9w\xbaVT\xb3\x1b+\xc4\xf9\x32\x61\x1c\xcb\xe9K\x87\r#]\xc4\x90\xef" -"'+\xfe\xb8\x9d\x43\xbb\xb2\x85~c\x7\xcfL\xa9\xf5yO\xab\x1b\xba\x11\xd4\x65\x18`\x8a" -"\xc5\xd9\r\x8a\xbf|\xec\x15.)b+\xedTd\xft\xb0{\xcd\x90ZQ\xd0\xb6T\xe5\xea\xe4j\xf5" -"\xf5\xf1\x99\x9a&\xf\x97\x65\xc0<\n<\xbe\xe6$\xfc\x12\x5o4;\xe7\xac\x85^\x9c~\xd6" -"+\xc8.q'#\xdf\xf3O\x95,\x1cVZ\xae\x8d\x91?\xfc\x1c\xe6pU\xc0W\xcb\xeb\n\x18\xeb\xa9" -"\xfb;5\xb4\n\x89\x1a}\xd9`7\x88\xce\xac\x9b\x97M>d\x19\xa8\x14T\xb2\xb3\xb7 n\xf2" -"\x86\xd4\xd7\x9\x92!\xce\x31\xbdu\xf5\xcb\xa4\xb4.\xc3{\x13\x4\x62\xca\xc1\xc6\x15" -"BY\x12\xb4-\xba\xc9X\x1f\x66S\x8a\xab\x39\x92\xe5\xef\xe6x\xa7Q\xea\xda\xd0_\xda" -"\xe\x8azk\x8d\xb0\xcb\xa5\xd6\x43\x13\x46\xc8\x84\x31\x8d\x43\xca\xb5\x5:\x17\x89" -"\xd4\r+\xf7\x62\x6L%\xe0\xf5m\x8a\xea\xa8\x39\x30\xbeMBa\x91I\x12\xe\x63\xe3\xb9" -"|\x8b\xb0\x8c\xdc\xfag}\x89\x80\xaa\x4\xd5\xfeG:?\xd7\x99}\xf1`\xeb\x87\xcb\xef\xe5" -"j\x12.\xda \x8d\xf8\xf7\x9\x98\xfb\x18\xd9\xa7\x66\xe2Z8\xf6/\xdeI\xb0\xc\x9\xb9" -"R\xa8)\xc9\xcc\x8d\x6\x64\xeelv\x1a\xa2\xe1\xa5$\xe7\x63\xc8\x34\xa1\xf4\x97\xab" -"\x10\x6\xe8P\xb0\xaf\x63\xa5*\x8b\xb5\r\xfa\xe0\xd4\xf0Pf\xfQn\x80[ \xea=\xcb\x18" -"\xb1\xdf_\x8b\x13'\xdb\x94\x1aG@\xdbR.N\xf8\xa5\xf0\"\x83}r\xf\x7\x9d\xc\x1e\xb4" -"\xc3\xdc\x9awVl\xbc\xd6\x38\xb5h[\xc4\x90O\xf7\x4\x95\x9f&\x8c\xf1\xfc\xda\x92\xc1" -"J\x93@\xb7\x9e\xc1\xe4\xf7Z\xe2\xf7\x90\x99\xdf\xff*\x3\x41\xf9\xa4\x85\xbc\xdc\x7" -"`]vGq\x87\xdf\x8e\xb9\"o,\xb7\xc9`*\xc1\xf\xeaG`\xe3\x11\x92L\xfe\xd5\x9ck\xa8\xc0" -"}\x1f\xf5\x1a\x34\xf2xL\x8e\xe9\xc5P\x9cNB3\x0i(\x3r,z>v[7\xc6\n\xf2\xe3\xb9q\"\x9" -"A\xb7RI\xcc\x8aR-o\xe6\x9a\xdc.E\xdd;\xf0\xfe\xad\x12jw\x91Z\x85\x87%P\x1e\x38\xf" -"Tj\x8a\xabu\xa1\xc1\xe5\xfe\x93\x1f?\xaa\x1b\xf2;7L76E\xa9\xce\x85\xe0\xda\xf7\xa5" -"D\xfd\r\x7f\x1e\xb\x66r\x1e\x19\xdc{2S\xfdq\xd8\x8fM\xeej\x93/o\xba\xae\x9b\xaaQ" -"{\r\xfe\x66\x4]\xa0\xac\xfd\x14\xa4(\x7f?Y\x11\x9d\x9a\x13Ki\xa9\xbcLD\x81\x6\x7" -"\xbcZ\xbbL\xec ^\x84\x99\xd8\xa4\xc8G\x18\xec\xe2\xa8\x94\xdfr\xe2\x97\xf4\x9d\x37" -"\xa4\xc2i\x86\x8fIg\x10\x9e\xa1\xca\x1a\x9c\x80\xd8Q\x8f\x86\xd5\x36\x88\x97\xd3" -"\xad\xa8\xb5\x13\xb5\x92U\xa5\xdd\xe8\xc9l\x18Q\xd8i\x9f\x96\x11\xda\xe5\x65[\xcf" -"\xdf\xf2\xd9\x8\x61\n\x95l\xa7v\xa0\x0\x88\x1\xbb\x45\x7\xae\xeb\xce\x8a\xd1\x10" -"\xa9\x63\x17\x90p\xd3\xb8\x0\\\x41\xa6\x12[\xe\xd9\x46\x92\xa2(7\x7\xc9\xfb~\xdd" -"\xad\x1d\xd5\xb7\xc6+\xc7\x14%/\x7f \x84\x1f|m\xa0\x1X\x93\xe2\xd1\xc6\xad\x44K\xfb" -"\xdb+\xb0\xfa\x35*\x88\xe9\x81X ~\xce!?GM\x8:h\x9\x32\xbx\xd6\xc0\x80\x1a^]\x87\xbc" -"*7\xcfz\xd0K\xf3\xca\x9b\x0\xdf\xfe\x96Tz\xb8\x83\x3\xaax\x9b\x63\x81[\xac)Y\xdf" -"m\x92\xa2\xae\xecl\xe3-\"z\x95\x37\xae\xf4\x9e\xb2\x83j\x97\\Q\x96\x97\x62PE%\xb8" -"\xdam\x9b\xacR\x98\xa1t\xb7Nd\xb8\x83\x8a\xe8o\xff\x37\xc6hys\x9f~\x84\x9d\x39\xf6" -"\x7f\xdb\x5\xb1J\x9b\xc8\xd4\x34\x34\x46\x43\xf8O\xd1\xa7\xaf\x80\xb9\xaf\xcf\x88" -"\xd7.#?-\x15\xee\xd7\xd6\xa7\xde\x18\xdbt\xe2\xf0#\xcf&Tw\x91\xc9i\xf1#\xe5m\xe4" -"\xd1\x8c\xdc\x35#\xe4!\xd8\xb9\xd5\x1\x84\xe7h\xe5L\xb2\xca\xfe\x81\xfa\xd1\xcd\xe7" -"\xd7\xe1:\xdc\xf5\xa1\xbeR%\xfb\xe1,::\x1e\x9c:Bk\xc7\xeX\xb4\xd0\xe1\xac\x9d\xea" -"\x9\x5O%\x15_\x97\x45\x82\x8a\xc6 \xa5\x1\x99\xd5\xd3\xa5\xaf!\xfc\xbaM\xab\x64\x9d" -"\x1a\x13\xd2\xfc\xff<\xe5s`xV\xc2\xd2jj\xa1~9L\xe\xad\x30y\xa8\xf3[\xb\xfb:-0\x1e" -"\xfb\xef\xb4\xfcW)I\xdd;\xf9\xf1Oa\xc0\xd2\xc\x90Xe\xe2\x14\xeb\x91O)`\xb1\x7\x12" -"\xbdl\xfb[\xfH\x91\x7\xda\xd1/P\xbb\x7!\x9f\xb4\xc3\x61\xcj\xc\x8b\xd0g\xc8n\x17" -"\xe2\xceK\x8(\x9jLIm\xb8,;a\x85\x85\x9b!/~*\xe7\x1a\xbf>E\xd9LD\xcd\x97`6\xc1r\x2" -"\x8b\xc6[\xcd\xbb\xa3}\x3\x44\x90+\xcfp\x17\xcb\x92\xf6h\xa5\xea\x4\xa2\x43\xaf'" -"\x84!\x5\x15\x1e>a>\x6\x1er\xf6\xcc\xa5\xeb\x65\x86.v\x16\xdbZ/y\ne\xae\xcb\xc8\xe5" -"iJ]\xfb\x98\x97\x17\x94\xc1\xcc\xecntY>\x7lx*}G!\xa3+\xf0yboN\xb7\xcb\xca\r\x1e\x8f" -"\xd8\xfa?\xc5\xb5)\xcf\xac\xcf\xed\xcf\xe8\x37\x15\x16\xcaH\xf6\x92\xca\xa0\xc4\xcd" -"\x96(\xef\xb1\x16:\x90\x8dpK[T\x80{\x1e\xda\xc1ht\xd1N\xea\x9f\xa0\x89\xf7\x32\r" -"\x1b\x9b\xa2\x94hL\xf9\x8d\x1b\xa7\x30\xea\xec\x1b\xdc\x13\x3\x30:\xec\n\xfa\x41" -"7\xa4\x97\xe3\xf9\xb5~\xc4q\x12\x7\xb3\xb8\xed\xce\x84\xf3\x32\xfbP]\xb3\xa3\xdd" -"\x93\xe2\xd5[w\xd0\x62\x34\x94\x1\x1d\x8b\x63\x0\x8b\x15n`\xd6\xd2\x80]\xad\xa9\"" -"w\x82\x30\xe2\xd5\xeb\x64g\xa5\xddzf\x1\x17\x10\xef[\xd0\xccg\xfa\xd7\xf0=\x13\xab" -"\xb3\xc9\x45\x12\xf\xb8/\xbcMg\x91\xff\xaa#V?\x94\xbf\x91}d\xf9\x93\xb8\x82\xb6\x15" -"i\xd6$\xf2\x43\xd9\xe0\xb5\x42^j\xb6\xc0r\xc2\x2\xb3\xac\x97\xd2\x9f_\x82\x8b\xdd" -"6\xe0;\xb3\x32n\x18\xe5n\xba\xfa\xd4\x8f\xf1\r\xe2\x7\x8e\x17\xfa\nv,M8c\x96\xc9" -"o\xed\x9c\xb0\x12\xd6|\x8\x10\xa6\xff\x84\xe2/P\xc2\xa4\xc3\x10\xdc\x82:\xaa\xca" -"\xb9<\xb8\x1c\x8c\xb1\xdf\n\x8b\xeb,\xfa\xc9\xdfm\xb\x9b\xa5\x9d\xbU\xf8\x34)0\xa7" -"Q\x93h\xfe\x63\xa6\x8c\x1bu\xaa\xa8\xf3S]\x83S\x82|\xcd\xdb\x33\x5\xbcUZ\xcb\x1e" -"\xa6pB \xe3T\xee\x14\xa5.r\xad;\xb\xe2s\x8b\xb7\xbd-a\x8e\xeb\x95[\xa8\xc3\xe8\\" -"\x89\x38\xe3\xd8\x41\xa9\xd8\xf9\xfdr\xee\xee\xf4\xdd\x1f]\x96\xfb[\xaf\xd9\xb0\x81" -"jo}!\xe6>`\xa2\x19\xc7\x9d\xf6\r\x9cj#}-\x11\xec\xa8\x15x`\xb5\x88\xe7\x43S\x5O^" -"@\x95\xen\xc2\xf7Vy\x1d\x30\xec\xfd\x1c\xed\xe8\x98<\xcb\xfbvT\xcc\x8~\xf8\xd6\xaa" -"\xc7\xac\x31\x9b\x84O/\x93\x89\xeb[T\xbf\xd6q\x9e\xbc\x35\x87RO\x18\x1f\x30Guk\xfc" -"- _\xab\x64\xbaR{J2p\xe3@n\xff\x42\xa4\xdf\xd3wB\xfd\xa0/:o\xfdW\x97\x87\xd1\xd0" -"\xa8l\xb9\x17\x14yi\xef\x83\x19\xb4\xab\xb0\x37\xc7P\xabG\xfc\xcb\xac\xcd(\x92\xf0" -"\xcf\xb1\x63\x88=%\x82\x92\xf8_\x1f\x9a\xf3\xeax\xe1\x13\xbc\x61\x8d+S\xe1vTGD@K" -"\xa9\xf4\x34)\x8a\xee\xed\x9c\x84\x44GQWXk\xde\x6\x6.\x1\xe8\xc5\xe5\xc6!\xf\x9a" -"\xb6\xcb:\xec\xba\x1f\x15\xa3\x32\x7f\xc2\x43\xb1\xa4\x8Q\xc5\x9\x4Hs\xb6\xafs\xf1" -"G\xfe\xf1\xd6\xaa\x91\x94\xb@\xb6\xd5\xa8\xbf\xbc\xa4\x36x\x3\xae\xc1\x43\xaf\xc8" -"Q\x86\x80\xdc\\\xd6\xff\xb3\xb0m#\xd4" -"\xac\xbd\x8c\xc9\xf4$?l\xbeL\x91\xb2\x19-\xa3\x1d\x8a\xc5\x7f\xee!4\xb1R\xcb\xa5" -"\xdb:\xc8\xb2]\x80\x34\xcf,\x9b`\xc\xaf>,\x1e\x1\xefT\xdch\x9d>)\xda\xe1J\xd3\xa4" -"\xb7\xd1%\xe6\x92TN'\xf9R@\x8\x16\x37\xf0'U\xaf\xac\x86\xdc\x1\xcf\xc6V\xcd\xc1\xe9" -"\x97\xa9\xb7\x45\xf6&\xb2\x9\x1a \x82(\x14\xf9\xf4\xf1\xdb\x94\xcb\x90\xa6\xec\xb2" -"\x1f\x1d\xf0 \x88\xbbKz\xac\xa1\x1f\xe0\x84&Iohe\xc3\xadJ\xc8|\x83\x84)\xc7\x9\xef" -"zdRx\xfc\xdd*\x17\xb7\xa9\x42\xb7@\x0\x0'_\x11\xcf\xfb[\x12\xfd@CJ[[\xbdR\xf5\xaa" -"\x9e@8\x8e\x87\x81\xcc\x43\x9a\xd5\x1c\xa0]\x6\xd2\x44\x12%\xf1w,\x9c\x96\x32\xa5" -"\x17\xff\xbd\x97\xea\x11\x9c\xa6{\xeb\xb4/d-\xd9\x8a\x7f\xc3\x87\x93\x9c`\xef:\xc3" -"\xaf\xc3\xc0>cq\xa3\x44X\xd9\x1\x94\xd3Rk/T\xe7\x34YO\x1 \xe8\x19p\x14\x11\xd9\xcf" -"h\xc7r!\x16HD\xc3s\x10g\xd3R&4\x87N\xdd\x36\x6\x9d\xfb\xed\x3\xfb\xbb!\xe7\xc9s\xb2" -"\x8al\xd4\x31\x84\xd0+{\xc8\xae\x1a\xa5j\xd3Q\x2]\xe1\x9e\xe7\xc8\xbb\xab\xa2\xb8" -"\x96\x39\x96\xac\x8a\xdbp'n\xa7\xf2\x17\x34H\xd1#\x8d\xdd\xa1\xa2$\xb2\x93J\x9b\x97" -"\x16o,\x9d\xe9\x1\x7@\x1b\xed\"\xa9\xe8;|\x85\x1a\\\x1c\x9c\xb5\x35!\xc7\xcb\\\x62" -"'\x9d\xf\xa0t\xbf\x8f\xea\xc4\xf0\xa7\x65\xbf\xc7\xd3\xd2\xddh\xce\x1a\xe6\x34\x9" -"F\xd2\xceJVc]\x12\xe1/\x81\xe5#\xd0\x42\xbe\x8f\xceV\x93\xbf\x41\x9d\xb4M\x6\x89" -"C0#yY\x9ay;\x15\x14.\x11`zK\xf7v/U .\xcb\x46\xdb\xb9\xe2qqx\xb4\xf4\xfc\xd7*\xa0" -"n\x86\xba\xd3\xc2\\&){\x82\xe7\xfd\x44\xf8GM\x81\x8a\xfb\xa0n?G\xad\xf7\x9b\x93\x37" -"\xa9\x9a\xd0\xd8\x41\x1c\x84\xb7^\xd7\x1byw\xdb\xco,\xc2\xa2MW[\xae\xe\x42\x34\x7" -"<\x90\xb5\xae\xff\n\xb6\xd2\xe2s\x89'P\x1c\xbfs&\xb7\xae\x91\xa5\xddh\xe1HC\xb5u" -"\xc4\xaa\xc7\x93\x13)\xf2\x16\xe7\x82\x87\xb\xf5\xc0\xe8\x9\xc1y8\xdf\x30\x9e\xce" -"\xd9\xe6/\xe9\x18\n\xea\x17[\xe6\x1d\x1fw\xa1L1px\xd3\xac\x1bqN#\xb7V\xd3\x8f\x83" -"\xb\ry\xae\x61@\xd0\xbaP\x5\x65xD\x88Z\x96kx\x80\xac\xfc\xf5\xdd\x46\xa5\x9b\x8f" -"D\xf7r\x6\x10\x6\xb1\xed\x98\xbc\n\x88R\xff\xaf\xe\xd8\xce(\xa4\xfb\x96\xb4\xcc\x98" -"Z\x5q\xe6zR\xc6&\xf7\x1e\x93\n\xc3\r\xbb\xc1\xe\x10\x86\x65\xaf\x90\xa0^\xdd@\xb2" -"\xb2Y\xe4\x32\xc3$\xea\xda\xb1\xea-\xe9\xf4\xdc\xa2=\x4r\xdd\n\xa1h\xb0\xf<\x11\xe8" -"\xc2\xa1\xb9\x43Z\xafG\xc7\x65\x9a\xcaX\xb\xb5\x88\xd3\xe8\xdc\xc9\xc4<\xa5\x11\xc" -"\xec\x64t\xd1iV\x4<&\xd4\xe7\xd4g\xb2\x87\xef\x62\x19\xf1\x61\xcb`\x8\x8e=D\x9a\xac" -"\xa4\xc9\x16\\\x61\xc1\xeet\xff\x3o\xae\x95\x2\\WW'fVe\xc8yX,\x86\xfe\x31\x99\xf2" -"7\x17\xb3:\xc1\xa0\xb%\x99\x89\x1b\x0\x63(\xfb\x91\x34`heO\xba\x12\xe8\xe4\xd3\xf4" -"LE\xa5y\xc9\xb5\xea\xa3.k\xeb#\x7f{\xff\x19\x36=lX\x88)\xbe]&\xd2\xa1\xce\xf5\x99" -"\x12Kr\x17\x33\x8f\x4\xfc\x42\xff\x94\x42\xd3\xb8\x87\x46\xcbQ\xc3&\xf7\xd4\x86\x9f" -"[\xfc*\xc7\xdb\xc\xd9G\xc7qN\x93r\xb6\x6\xac\xc7yD\xc7y\x13\xa7J\xf3\xb5\xcc\xaf" -"\x8\x7f\x42\xd0\x38\xd0\xb6\x16\xa3\x9f^\x9f\x7\xabt\x2\xcc\x62t\x82!@\x98\x83\x12" -"0\xc2\xb3\x1\xf3\xd9\x9c\x63\x61 \xb\xf8\x8e\x1d\xcb\x36u\xc7\x9d\xf3\x82z\xf3\xb4" -"hy.\xcd\"\xd0\x86\xf7\xe8pa0\xea\x17\xa1w\xa3\xa0\x8f\x5\x43\x91\xc0\xfaZ\xfc\xbc" -"\x93\xce\x36-\xa9\x9b|t\x8e\x8c\"\xc6\x34\xael^\x86\r\xae\xfe\x94\xc7\x17\xeeR/\xa7" -"/\xe3\x93=\xbc\x38\xf7\xe4\xb3\xff\xc5\xa4!\xee\xe\\\rW\xb9\xf3\x62\xf8N\xb6J\x8d" -"{\x8cs\xc7X|\x3\x91\x88*\x1a\x15\xd1\x82\x96\xa2\xd9g\x2\xca\xe\x92~\xf7\xd8S\xd4" -"\xe9\xc4G\xc7\x9a\x32\xd8\xa9\xfb-\xd2\xb\xcc\x18\xc1\xc1\x1b\x96\xf1/\x8a|e\x87" -"\xe5\x46\xc6\xe4\x33\xa5\xc5\x91\xef\xf5T\x8f\xb2~\xf4\xdb`gj\xd2\x11i\xfa\x1+Gc" -"\x8d\x66\xfb\xe9\xa3]\xae>\xd1i\xfe\xe\xf2\xba\xeb\x8\xfc;d\xb0\x91\x65\xfe\xa8z" -"\x84=b-2\x1f\xb4\x95K\xbc\x19\x64\x8d\x8eS24j\xdb,9\xa4%\x37\x88\x98T\xf4\xa7\x91" -";\x13\x8S\xa2[H\xf8\x84P\xae[\xda\xd3\x16\xb8\x3\xc3\x8b\x89#\x82*\x5\xec\x36\r\x85" -"trZ\xc0\xcdY\xbf\xa6\x43}\xa2\xb7$mN\x9d\xee\xff\xd7\xb1\xfd\"\x33\x1b\x90\x9e{\x6" -"\xd6O7\xb5NW;[\xbb\xees\xee\n\xad\x14\xa6\x14\x8b\x94\xca\xc0\x6\x0\xa3\xbc\xb5Y" -"\x9c\xd3+2s\x4\x35\xb9\x99\xd0\xe5\x8]\xa4l3\xf1\xa7\xae\xf\x1f\xb2w\xbe\x9fI.M\x13" -"CI\xf4\x94\xf8sL\xe4\x1b\x8f\xfc\xdd\xdfR\x8d\xa2\xa0\xc2\xec\xb6&\x9dI\xc4L\x93" -"\xfd\xe9\xd0\xf2\xe0\x2\xbb\x18\xe\x99\x6\x8f\xcc/\xea\xaf\xe8\xb5j861F7\xb8\x0\xe0" -"JC\xa9\x9f\x3\xfbW\xd2o\xa0\x88\xf0\xfb\x8b)\xd4\xe4\xeb]\x8bsp\xd2\x7f\xc8\xa7<" -"\xbc\xda=\x93\xc\xbe\xb5\x34>\x88\x3 \xc5\x9b\x1e\x9\xe4\x4O\x8b(\xfc\xca\xd9\xba" -"\xaf\x46\x16\x9c\x41:6\xe8\x10unFqH\xe6\x9a\x33\xb8:\x84t\x8e=&\x91\xff\xe6\x3\xa6" -"\xe0\x83\xbd\xdb\x9dJ\x2\x98\x8c\x83L\x12]\x97\xf7\x14\x9fL\xbf\xde\x12G\xea\x64" -"\xa9|\xd5`u\x9c\xca\xb2#\xb2\x8\x6\x8eH\x1e\xab\xcb\xca\xc8\x99\x34=\x13\x61\x99" -"{6\x8c:\x95\x30^\xee_\xd1\xf7\xec\x84\xfc\x43\xb2\x61\xe1\xb2\xa9\xcb\xedR\xd7; " -"\n\xe2\x1d\x4\x4\xdcsA\xb5z\xff\xfd\xe\xfb_\xdd\xca\xc5\x62\xd9|P\xd1\xf5\xa8\x41" -"\nT\xfc*\xc5\xc1\x84\n\xdap\xe3(G\xb3\xce[o\x1b\xa6\xb2\x9d\xdb\xb9\xbe\x9f\x9\x1a" -"\xbd\x36\xfe\x99\xd9\x11\xf8\xc6\xbd\xa4?\xcf\xaf\xb1\x86^V\xf5GA/\"\x4\x9-\xc2\r" -"[\x9c\x35iN\xab\xf8\xd6|\x85u\x1e\xd2>\xdf\xf1\x11\x82\xe7\x8e\xa0\x8a\x44Gn\xa2" -"\x1a\xde~zE{\x95G\xf2=\xb5\xc4\x66\x95k\xf6\xc2\xfbu\x84\xe\x61\xd8Gt/rn\x85\x11" -"\xa7\x86IZ\xaa\xc9+\xc0\x61ts\xcaH\x1d\xa6\xbds\x94\xbf\x1f\xc7\xd0m?\xcd\xdf\x9d" -"\xf8z\x1a\x39\x33\x17km/\x9f\xa0\xb7\xaf\xe7\x39\x38x\xe3\xa8\r\x33L\xf5\x45\xbc" -"\xf1\x44\xa9\xdbY\x1e/\xe6\x41\xb8\x36\x9b\xa9\nh`\xdc\x93\x9e\xe0\x9f\xe8\x45\x8" -"N\xba{\xa9\xb4\x9a\xc5\x99,\x1a%(\x99\xfd\xc5\x8b\xd7\x38\xa1\xe5N)\xf6\x9b\xa2o" -"\xb5\xe7\xee\x15\x1e\xe9\x9a\xe1#\x9b\xb\x93/\xd7\x8a\x35\x83:\xbb=\xa6\x95\x6\xf7" -"\x15\x88*\xf3\x90\x19\x9c(@\xa2\xf3\x30w\xe6\x31\xa0Z\x1d#\xb5\xb5\x83\xab\xa3\xf3" -"\xbf\xdcI\x88)\"\xdd\xa5\x1a{652\xdf\xe1\xb9\x65\x95O\x86\xcf\x5\xb8\x94T\xd9\xcf" -"\xa0\x86\x90M?N\x94\x83u\xfd\\L\xde\x14\xa1lU\xf4\x7f\xc1\xca\xfd\x3\x8e\x88/\x5" -"\xce@yQ\xa4HPm\x98\xda\xfcQx\xf2t\xf3\xa5\xaf&f\xcc\xf1S1K\x7\xa8\x96\xaa\x9c&\xb3" -"\xf3\x3\xbd\x98\x9c?\xd8\x0\x9dt\xab\x11\x10O\xc-\xb6@$l\xe9\x83\xc4\x2\xff\xfd\n" -"K\x8e\xc4\n\x8b\x9d\x35\xe8\xae\xfc\x8bo<\xf5u\x98\x18\xc9\xe7\"\xb7\n\xc5\x9c]5" -"jf\x1b\x61\xac\xd5\xaf.|h\x8a\xf1\xf4<\x7 G:NAJ\x7f\xc8\x65\x65\xb0[\xea>\x89\xa3" -"k\xd5\xd2\x85\xffs\xb1\xf7\xaeLjN\xa4\xa9lim,\xf5\x1c\xf6\xde\x86\x8bGC\x97\xfd\x43" -"\xe8\x44\x4\x5p\xca\xac)1\xc2\xd3Y\x85\xff\x8f\xc2.\xff\x9W\xb2\xa1<\xcc\x8b\x93" -"\xff\xfb\x85\x83\xb9\x9d\x9b\x86\xeft\x87\xc6\x15x\x87\xa7NA\xbe\xb0rbG\xcdz\xb4" -"m\xa2\x99\x32'\x82\x12\xf0\x63\xa2\xb8\x41\x2(\x6}\x8e\xdd\x81\xe5\x92\xf6#\xc2-" -"\xdf\xf0\x1d\xc1\xa3\xfe\x8\x80{9!\xeczV=\xe6\x1a \xf5\x62\xa5\xb3\x9a\xee\xc6<\xd3" -"S\xe1\xd1\x91\x8e\x86\xda\xac\xb8`P\xbar\x1a\xf4@\xe7\xd8\xcfxIa*j\x8d\xcc\xa5\xf8" -"S(\x1a\x19\x85\x15\\\xfd\xc5[\xd9\x46~])\xc1\xf4\x44\xceM\xe2lv\xb6g\x16\xc\x19\x1d" -"vi?\xbc\x92\x86\x37?\x91\x9c\x6\xbc!\xa0Ua\xea\xe4\x0\r\xde^^\x93\xf9\x5\x97J\xb" -"7\x7\xe0\r\xb2\x0\xec\x4_Q\xe6\x1a\xa7\x64\x39\xaa\x18'\xbf\x33\xe4\x65\xca\xddm" -"\xcfg\x9\x38\xf8t\xd7\x93{\xf0\xa4\x35\x11\xcc\xc1\xbcv\x9a\xda\xa7\\\x10\x81UK4" -"\xbb\x13\xa1m\xd0\x17Z\xee\xb2]=\x1a\x6\x86:\x9d\x6\x6n\xba\x80\xcd\xd7\x44>\xfc" -"\xee\xd6\x16\x15\x1j\x9;\xe\xcf\x14\xed\x13\x92@+7\xd6\xc\x1c$\xe\xb2\x96>\xdc" -"\xf9\xd0\x46h\xab\xb0\xf2\xf5\x31\\\xaf\xc2>\xd4\xf9\xcb\xcd\xb5\x80\x6\x90\xba\xd4" -"\x8d\xf4y8b\xfd\x8f\xb7W_o\\\xec\x17\xf4\xde\x3*\xe2yc\x85r\xde\xad\xa5|\\$j\xe4" -"\xe7\xd8\xe7\xd9#M\xcl\x82\x1fi\xa1Wc\xda\x65\xd5m\xb0t\x99\x42\xae\xb7I\xebR\x15" -"+\xb0K\xf5\xa3\x9f\xef-|\x83\xa7T\xa6i0`\xeI\xda\x17\x66\xc1\xa9o\xa4\x9c\x31\xde" -"\xeez\xb6\xbe'<\xef\xc6\xdf+\xc8\xf7\xe\xaa\xf9\xf8\xc3}1!\x97$\xb5!\x14,\xc9\xe3" -"\x8%\xe3\xc8N\xfd&\xfe\x64\xa1\xb1\xca\x36\xb0V\xab\xa6M\x87)z#*6\x10`\xb3\xaa='" -"zC\x9d\x85\xb3\xf1\x9b\x65\xdd\x95\xa6\xaa\x85\xd1\xa7\x9b\xa9\x85\xb3\x5\xf1\xe1" -"\x85\x64+*\x97\x1a\x9\x19n\xe7\x7\x6)7j[\xb7n_\xe1t0\xdd@f~\xa8\x9c\x14K)f\xf7/\xda" -" _\x3\x45\x38\x12\xbd\x13\x1\xf1$\x89R\xee\xb7=\x0\x1\x10\xf\x10}~\x7f\x18r\xa7u" -"\x9a\xd8\x43=]\xfc$\xa0\x41R)j\x8a\xf5\xe6\xcb[A<\xd0\x42\xf0\xa9\xf8\xdd|\xbe\xbe" -"\x95$\xdd/\xe4\x4\x8a\x11H`\xf\x97\xc0\x1f\xb2\xf5\x5\xcc\x82\xe8\xb8\xda\x19x3\xa0" -"\xcf\x88\xae\xa3\xec\xaeg\x1eG\xc1\r\xe6\nS\x9dS\xee[Z\x97\x9a\x93\xf2@\xc1\x91/" -"\xb4\x64\x0\x9aV\xde;\x8f\xa7G\xc6\xd9\xff\x8f'H\x85\x7\x63\"\xe8Q\xdf\xdf\x13\x15" -"\xc0\x97\xf1\xeb\x83^q\xb8%\x2\x91\xf0\xc6\xf6\xaa\xfc\xe7\xa1\x9f\x9a\xcd\xc8g\x15" -"\xa8\xb8Z\xdbzr\x92\xaa\xd8\x1e[A\x86\xe8\x65\x15\x13\n\x62\xdd\xdc\xb1\xbb%\x1a" -"\xc6\xd9#\xf8\x3\xaa\x95\x33\xde\xea\x8d\xe7@\xa4\xc1\x32\xf1\xf0P|\x8a\x32$\x11" -"+o/Xu0\xd1\"\x14\xa3\xbc{\x5\x84\xd9\x43\xf3&\x9\x84\x9\xe5N\xcc`G\x88_A\x5\xddh" -"\x91\x30\xbcV\x93\x17\x1c\xa3\xa4\x43\x9c;\xf0\xbc\x0j\xc9q\xc3@FX\x80\xd2&\x0\x13" -"o!'6\x15\xd7\x80\xd7\x62\x9f\xe3'X\xc7\x85R\xe5\xb1\xb7\xf4\xc1\x64\xd8\xb1t\xb0" -" \x1i\xb5 \xb4\xbd\xf5\x96|\x8bH\xdf\xdf.\x1dy\xd4k0\x88\x88\x90\x92\x86\x36g:\x3" -"\x1cN\xb0K\x1c\x41\xf1\xbf\x34GK\\2\xeb\xee\xd8&\xc0\xba\xd2\xed\xe0y\xd8\xfb\x17" -"\xfd\xb1\x1d\x19u\x3\xf1n\x13\xe5\xc2+\xbe\xe1\xa7\xa9|\xaan\xe4\x1e\xda\xb\xf6\x8c" -"\xc9\xdf\xb1'\xe8l\xc8s\xed\xce\x66I\xf7\xb0\x10\x9]\xfc\xe6\xc1\x32\xef\xc3_\"\\" -"\xc4\x90\x82\xbaS\xcdxz:\xa4\x64\xe1\x44y\xde\x9e\xbf\xb9\x8c<\xe0\x6\xf1Y\xd3)\x9b" -">z\x8e'1l\x14q\\\xc3\xbb\xe5\x61\n\xd9\n\\\xff\xec\x8eG\x2M4H\x18\x1e\x8f\xd0\xd6" -"\xa1!H\x4\xe\x31\xc0\x44Z\xfd~\xa2\x3\xd3\x34,\xc0\x64\xe7\x63\x65\xf3\x14=SGT\x83" -"\x1aU\x8b\xcc\xdd\x1d\x39\x93W\xea\x9e\x95\xf1\x45},\xfd\xdd\xef\x9a\xc2\xb6g\xe1" -"Jd)\xe8\xb6_\xf4\xb4\xdf\x34#=\x7\x13\xa6T\xad\xf3\xc1\x11\x9dhp\xf1\xd8`\\L\xf2" -"m\xd7\xbcOM\x1f\xc8\xe7\x11h;<\x12\x15XC\x89V)\xc1jF\"\xeR\x92\x38\x65]/9:\xceP\xa9" -"\x8e\xe5<&\x18],\xf3`\x13[\xf1\x16\xdd\x8a#\xad\xd0N;\x4\xbe!lJ\xd7\x85\xf9i\xb6" -"$H\xd4 \x14\xdf+#\x1d\xa5\x64,\x83\x61\xd3\x33\x61\xd5\xd6\xcb'\xf9\xfa\x4W\xee\xc0" -"\xe0\xe4iuD\xf5M\xd2 5\xd1\\\x1c'\xd9\"\xc7\xf9\xa7\x84\x3l\xee\x80\r\x65\xf\xe2" -"C\xcbM>o\xb0\xfc\xffxlb4\xfb\x98\xdb\x81\x92\xdbz\xf5\xc1\x96K\xea\x15\x13\x36\x16" -"\x8f/U\xa4oIZ\xd5\x44\xfe\xbc\xd1\x1bPh\xca\xcb\x83\xcc\x1c\xbem\xf8X\x99\xa0\x88" -"B\x93\xbd\xeb\xe7\xca\x36\xf9\x1f\xbf\x93\xd6.\xde\xea\x7\xd8\xe\x16<\xb3\xb7\xbc" -"z\x7\x17=qX\x8a\xc\x19j\x2\xec>Z\xcdjU\xed(\xfa{\x10\xb4\x86^\x9eZ5\xd5\x43\xa9s" -"\x92]o\xb4o\xb0Q\xbe*\xd0l\x88p]\x4Y\x1b\x7f\xe7\xc1Q\x0\x89I\xe2\x0\xb5\xa6\xd9" -"\xd7\xbb\x8dI\x1f\nq\xc5\x39\xd6\x7\xd6\xa7@\x92\xa7\x10\xa9\xa8\xa4;s\xf5<\xcd\x98" -"l\xb8\x8\x30\x9b\xeGUy\xa4\xc9K\xe7;e\x9fJ\x8a\x8a\x8a\xeb\x12r\xd1\x91\x65ll=\x85" -"\x8d \x11\x9e\xccZ\xb\xac\xcc,?9\xd2\x92KJ\xa3\x1f\x9d\xf8\x82\x8a;\xf\x85K\xdf\xc4" -"I\xed\xcbv\xe2\xed\x80Z\x9b\x39>\x14\x82Q\xf5\x9a\xc5\x91\xe0\x15\xe6\x12M\xd6%\xef" -"\xca\x18>\x89\xa7\xfa\x85\xa0\xc1\xa6nb{\xfb}Q\x90\x30\xfc\x9a\x8bQ\xbb\x8d\x45\x14" -"\xbd&\xf0\x41\xe0\xeeM\x8c\x6\xc1\x8c\x31\\\xd2\x39\xe<\x90\xc2N\xd4\x8b\x19 \x18" -"\x17\xdayx0\xb5\xdcu\xf0\xc6\x34\xc4\xde\x83\xfe\xff\x85\x94[5\x95\x65s\xb6~\x1e" -"\xde@\x0*U\xe9\xcd\x80\xc0\x96O\xc3\xca\x35+\x2\x1c\xb9x\x9c\xb1.\xfd)6\xc1\xb5\xe" -"\xab\xd6!\x16\xed@*\xf\x46\x2}\xde\x11\xc0\xcc\xc0\xfv \x84\xf5\xa7Y\xa2\xff\xbe" -"P\x8f\xfd\xc4}u^\xa3\xa4\x9f\xc\x9d\xa7\xcdS{\xf2\xa6{Z\x1e\x5\xbc\xd9\xe8s\x5\x1c" -"sy\xfa\xc3Vo\xdd'aGw\x1f\xd9\x89\xabn\xd0\x17<\x6O7\x97\x8\xba\xa7\xf2!(\\\xf0TN" -"\xe7\xe4\x9d,\"|\xd7\xac\x9e\xd6\x9d\x15\xf8\x16\xe3\xf0\xbb\xa5\x97\x5\xb2\x8eR" -"\xd5:\xe4qGM\xd9\xb2\xda\x65\x16tV7\xa9\xcd\xa2\xcc'\x80\x3\xcd\xa2\x14)\xe2\x1f" -"\x9a\xae\x44\xe3\xe9\xf0\xb5O\x9o\xf7/\xfc\xe6X\x2O\x80\xf2\x9\xa1\x92\xdd`Pe\x6" -"\xed\xe0\xac\x36$\xc6}\xc9\x39\xc7\xb4\xae\xbd\xa5\xd1\xcf\x8c\x89\xcd\x8f\xc7\x5" -"\x14I\x7-\x8a\x98\xde\x1b\xdeS\xcc\xb9\x1dn\xcd\xa3\xb5\x44u\xfe\x45\x4J\xa6\xa1" -"?\x5\xa3_\xfe\x41\x1c\x36\x8d\xc8]\x12\xeb\x8c\xfl\x81\xaaR{\xd7j{K\xea\xa5#_}\xe5" -"b\xe2\xa0\xd9\xf\x8f\xb8\x96\xd5\x15;\xd6\xef\x62\x36]+\xf5\x45O\xe8q\xcf\x43\xf0" -"\xe6P=g;g'\n)\xc\xc7uh\xc9]\x9a\xfe\xcb|\xbcJ\x4\x9b$1\x85QV\x1e\xe3 \xcf\x1a\x36" -"\xd6,i\xf6,\xfe\xc5\xbb\xa3\xfaP\xc9\x97=\x3ZVl\x6\xcd\xb6;\xa2\xb5\x86k\xf2\xdf" -"Gy\xf8r~\xa8\x8c\x44@b\x1d\x15s\x9c\x88\x1e\xf3\xa3O=kOj\x11\x2\xf2\x2\xe0\x94\xed" -"=\xed\xda\xe2\x94\xda-\xab\x1\xc2\x97\x7U\xac\xf1/\x16\xa5\xbe\x9a\x5\x85\x81\x12" -"P]\xef\xe6\x89\xe4\xf6U6\x10$\xb\xa6&gJ\xd7\xf4\xaf\x34SR\xb2\xf6\x61ou\x3\xb3l\x12" -"\x1b\xb8\x65|iY\xb1\xd3\xa3\x97\x66U\x1\xd4\x12\x42\x39\x1)\xd4\x9e~\x9a\xfc\xa9" -"\xf6\xe6nu\xfa\xf\x63|\xe0\xdb\xb4\xc3\xab\xe6\x34\xd0{\x8\x46\xa3LI\xf0\xe9\xca" -"\xcf\x8a\\\xeb\xf0\x17\x7(\xdfnTc.#\xab\xc6l\x93\xa0\xe5\xcb\x64\xb3x\xa9\x8b\xa5" -"\xf4\x12JZ\x8\xc2q\xd9\x3N\xe8pL\xed\x15\x35\x35\xea&\xcb.\x96\\\x63\xbd\xf\x7\xfd" -"K\xcc\x84\xf8\xdd\x35\x18\x82\xdb\x95\x7\xce\xfdw\xedw\xfc\";>yE\x14\x1b\x63\x1a" -"&\xda\xc4,\xf2p\x92\x64\xfe\xa6z\xaf\x94Heh\xdb\xc6\x2\x93\xaa\xc0\x4l4\xc2Y\xe7" -"1\xaa\xa4\xca\x9a\xb9\xf0\xcc\x99\x3o\xe6\xc3\xff\x66k8\xd0\xa0\x1d\x1\xd3\xc1_t" -"\xfc\xc0\x98\x8d\xe8&V\xd6\x82\xbf.\xaf\xc1+\xbf\xc5rc\xaf\xdat5\xc8lwq<\xe2\x15" -"\x86\xf0\x4_O\x8f\xfd\x44\x1\x99\xed\x91\x9eU%~\xa5\xd3L\x92\xd2\x12q^;\x92I;\xb6" -"uG\xf1\xe8\x9b\xd2\xd6\x44\xec^P\xaf\x4\xac\x98\xc7\xf3\x95\xc7\x8d\xfb\x65\x34\x8e" -"e\x98\xb8\x35\xa0\xb9=\x8cQN2!\x12\xd6\xf8Nc\xa5\x41s\xef\x14\xd9\xb2\x30ub\x90g" -"\x92\xce\x1aX?\xf0\x19\x1e\xe8YN\xc8\x95|\xf8\x0\x35\x61u3\xe9\xad\xfc\xcc\x85\x81" -"\xfe\xb9\x99\x8ds\xf4o+)Q\xdb\x85\x87\xf2\x96\x8b\x84\xc6\xd8\\\xd8\xfb%\x15\xa5" -"\xf4\x9e|[\xfe\xbe\x1f\x86\x66\xe5\x9b\xdb\xf8\x9f\x81\x12}\x86\xda\xd3\xael\x9z" -"\xe4\xfa>*X\x90\xf2r\xdc-\xa8\xf0\x10\xbf\xf4\xabH2\x1a\xbd:N\xec\xd3\xb7\x1bx\xed" -"\x8dL\x7{\xaa\x33\x9b\xd7t\x15\x16`\xfc\xa5\xc2\x38\x1f\xc4\xed\xc9\xb7\x35/\xb\x32" -"7q,WV7\xa9\xcd\xa2\xcc'\x80\x1kh\xf8\x8f\xb1\x12:\x12\x15}\xe1X\x15\x5q\x86\xcc\x36" -"{\x85[\xa7\x38\x32\xa6\x8b\xd8UR\xceSd\xd8Jt\xad\x30\x4U\x88y\xe9\xaeh%\xe3\x63\x0" -"\x7f\xb2\x12\x88\x87R\xbb\xe8\xe\xd6\x1f\xbcV$\xb9\xf3\xa7\xdb\x87>\x86\x1!\xc4\xbf" -"\x9cSn\x4\x15\xba\xc8\x8b\x1d[\xc0\xa9\xf9\xa1\xe0s\xf\xfS\x9c\x8d\xb4\x11\xaa\xc5" -"\xb1\x2\x1f\xe3\x90\x98\x66\xc0\xcc\xe1\xe0I\xdao\xb5\x32_\xe7}UN\xa8\xb6\x83NE\x12" -";\x14\x44-\xb\xf5\x85?\xba\xbaJ\xa4\xfc@\xaf\x96vWAQ\x87\x96\x1b\x9f\xda\xeb'\xd0" -"\xfcx\xf5\x84)E\x8\xa5\xa5\xd8]y\x14\\\xf5\xde\xb3\xe7\x84\x31\xe2\xf5\xd2',\xcc" -"x\x18V\xff\xa9\x8d\x87\xd8\x43-\xc4^3\x18\xcf\xd3\xc5\xff\x17\xb5\x1d\xd1o\xa3\xe0" -"2\x16pX1\x1eO\xaf'\x10\ru\x0\xf0SkW\xe7\x9a\xc9\xf9$&\xd9\x18=6\x85/c\xc6\xa3\x94" -"T4;\xce\xec\xbb\x92\xdcN\xda\\r\xc6\xf8\x8c\xa1\x46\x34\x16\x43\xf0\\\xdf\x14\x81" -"\xa7\\I\xe2\x30\x61\x99\x94\xa5\xae\x18\xc9\xfa\x83\x0W\xa9p?\x80&*\x1Z\xe\x8a\x9a" -"D\x95\xd2\x6-\xa1\xd8i\xb1\xed\x85\x62J\xeb\xd0\x91\x11\xd5\xc7\xdd\x37\x82\x9b\xd6" -"X\xc\xd2\xae\xf6\xeb\x31:d\x18\x61\xa0j]?\x8d\xde\x18\x13\xa8N2n\xab\xfc\xbc=\xbd" -"\xcbz#l\xf5\x35\xd8X*\xbd\x94}N&\x7f\xeb\x98\xc1\x81\x1e\x13\x45\xdd\xea\xa7=\xc" -"\xd5\xeb\xe3\x8e\xb7h\xa7\xd5\xfa\x7\xd5\x8\xbf?c\x14&\xac\xc8#\xfW#95GF\xff\xf4" -"\x5\x37\x82?\xd1)\x12x\xdesl\xc2\xde\xc5\x8\x4\x65\xd1\xb1\x88\x88\x1d\xa6\x1cr\xfe" -"\xe6\x65\xf1\x14];\x14(\xb9\x92@Gb&\xb0x\x1f\xae\xee>\x1f\x1b]\xd4\xa5\x5ug\x8b\xba" -"\xb5*\xbe\x30\x39\x9e\xb4j\xe4\xa5\xab\xea\xa6\x4\xe1!\xcxVkX3\x82\x11\x62<\xb5\xd6" -"\xa5/\xbb\x86\xb3/\xdd\x9byV\xbc\x8\x44\x38\x34q>\xb5\xd4\x11\xcd\xeb\x19\x17\xa4" -"%&\xbdS.\x1b,\x9d:\xd9TC;\xe9'\xd3\x32s\xe2\x1e)\xd2\x95\x93\xee\xb8\x96\x8\x16\xf3" -"\xc3\r\xeb\xa2\xac\x17?\xe4\xb6\xdf\xd1\x93@\xad\x18\x44[i\xf7'\x7f\xd2\xd5\r\x45" -"c\xf4\xfa\xa9\x97\x62\x66%\xdf~S\x90v\xa7\x34\xbd>\xa3\x2\xa8\xc6^}L`t\xdf?\xee\xd3" -"\xdc\x1e\xfc\xe8=\xd4\x1e\x7f\xa1\xc6\x88\xdb\x10\x8e\x6'n \x8f(\x12" -"\xf6\x7f\xd3\x38j\xa4\xaf\xd2\xaa\x6\x98\x9d\xc8\xf0M@\xbbh/\xe7\x93$\xb1\xae\xc1" -"\xb9j^LKG\x93Xe\x16\xdex\xc8\xfd\xf1\xfc\x8a\xc3\xb5\x8c)\x13If\xe3x\xe0\x83\"\xfb" -"\x9f\x89\x8b\x5q\x8a\x3[`\xe\xcb\x9a\x8e\x85\xc5\xf3j?e\x8\xf1R\xf7\xa8\x8f#\xb8" -"D\xaa\x86\x34\xfbk\xac\xd6\xadv+J\xd1z\x86.\xcd\x8f\\\x9cY:h\x9a\xbc\x2\xb5v\x99" -".\xd4\x81\x45\x2\xdc\x62\xb4\xdd\x36.S$\xf1\xbc\xc2\xfa&\xe4\xcc\xfa\xaf\xfa\x80" -"t\xf7\xcb(-\xaa\xa0\x91\x66\x32\xa8\xd2\x15R\x82\x33\xbb\xe1\xb0\x9\xaf\x11\x64\x99" -"7\x7\xdc\xe5\xb4]\xc7\xb3\xd8\x99\x65[\x95\x46o\xce\x4\xcf\xca\x17\xd4\xa3=\xb2\xf9" -"\xbcq\x16KOK\xc1\xbc\x63W\x11#6\x16/\xfc`\x6\x46\x4-:9C\x8d\xbe\xa6\x3+c\xba\xcb" -"\x9a\xe1I\xb7\xd5\x8\xad\xf6\xab\xcf\xc5\xb0\xaa\xf2\x90\xcl\xe\xc7\x80\x64\x1e\x8c" -"+`\x8d\x98\x32\xb3{\xaa\x11\x4\x32\x11\x65\xcd\x64\xb8\x31\x8e\x45\xe0\xf7\x8l\xeb" -"\x13\xca\x18\xb7\x82\x63\xf7\x4)GN.e\xcf]\xab\xb1\xe8\x1a\xf6\xfb\xf4MT\xa2\xca\xb9" -"n\x83\xff\xb4\x12\x9d\xf0\x44,~\xef\xf0\xe3\x95-\xd6\x97\xb8\x33!\x8\x14\x8b\x92" -"x\xc8,0\x95\x35\x66\xe5\xb9\xba\xa0\xdb\xc7`\x81\x8b\xb0?\x7f\xd9\x5\x8vZg\x1c\x9" -"\x83\x13N\xc9%\x11\x8M\xd7\x46~u\xa3\xef\x38\\z\x93\xc5\x92\xec\x98\x39\xf9T\x80" -"\x96\xbf``8\x2\x87\xcdi\rqDR\xd9\xa6\x7f\xdb\xed\xa0\x63\x13YS\xf5\x44\xd9\xf3\"" -"\xf5\x9b\x65s\xb9\xd9\x30\xf0w\x0\r\xbf\x11YU\xfb}[h\x84\x38\xa9\xddT\xcc\x81$'\xc8" -"\xd1\x66\xe0\x30\x65\x92\xfa\xb9+lYK&\x14O?nl\xd5\xe4\x45\xb\xb5\xf3q\xcf-G\xfe\x93" -"2w\xf1\xca\x65\xa9\x8\x12\xb4\xc6\xf5\xbb\x42NDT\xed\xa5\xee\xd3\x34\xd5w&{k\xdb" -"E\xd4$X\x2\xd8\xae\x38\xca#|\x87'\xab\x8d\x44\x66W\x81\x1dx\xf2\x3\x94\xfb\x0\xf2" -"L/\x91L~\xbf\x42!\xf4\xe5\xf6\xf5\xb1\xe7\xfbM\xd2\x1a\xa3\x42\xf\x9e\x8dU\\\xb1" -")T2\x86\xf5\x9c\xaf\x43\xb1\x32\x1e\xc6\x63\x95\x5\xb7\x1e\x35\xc6I,\xf3\x14\xfa" -"\xf2\xb0\x89q\x6|\x13\xe8\x82j2\xe5\x96\xe7\x9b\xef\x30\xfd\x1c\x62Vl\x81Z\x97\xe" -"-IB\xca\x7f\x81\xcb\x1d\xc7>H$\xe1\xb<\xa4\xb3iy\xd7h\x91\x93\x95|/\xb0\xf7\xc=~" -"\xbd\xe5#w.\x3\x1a\x91\xb0\x97\x7:'\x8c\x84\xd6\xa4\xb1YG\x91\xb7\xc4\x44\xdbj>\xc4" -"H\xb7\xf7\x33\x9bW&\xb3\x84\xc6TW\r\xbW\xef>:6!\xb7\x30\xc7\x9fp@\n\xd2&\x8f\r\n" -"=\xd6\x61\xe4\xc5\xfe\xd6\xe8\xad\x12\x38\x33RjHd\xe9{9xK\x8\x35o\r\x96\x1e\x80\xc" -"0L\x84\xb6\xd6\xf5\x4^\xf3*Y\xac\x88&\xb\xa4\x1b\xa6\"\xad-\xbb\xe1\xbf\xaf\xd2x" -"r\x96*\x1d\x9e\xa3\xf5\xa2\x1d\x1e\xb8\xa1,\xbb\x1aID\xa5\xff\xfaZ\xad\xa1\x6\xa6" -"\x7f\xd4)\xc8w\xe9r!\xb1\x42\xda\x8e$\xd9\xe5IC\xd6%%\xe5\xe\xfaw\\a\xf6\xcc\xe5" -"\xfe!%\xf8\x1b\x9f\xf1\xe4\xce\x15Y\"\xd5~\x9f\xde\xf4\xe5\x10)/\xb8\x1eR\xfc\x1b" -" \xa3\xee\xed\x82Q\x3(U\xea\xa4\xf5\x7H\x2\xf0\xc3\x8d(N\xe2\xeb}\xccm\xa8\x88\xd0" -"\x11/5\xda'\x9d\x1f\r\xe1\\SF\xaa\x2o\x1f\xfb\xe9\x8c\x5K,7\xe9\xbd\x33\x39\xce)" -"\xb4\xe\x36\x98\x33~\x96\x9\r\x3ZT\x8b\xa2)\xc8\xab\xf6\xec&[\xf5\x9e-c\xaa\xe9\x1" -"\x1ax\xbf>\x99O6\xdf\xf\xca\xadm\xa5\x64$\r\xbbI\xd2O\xc2\x45\xba%I\x2K@O\xc6\xa9" -"\xff\x16\x9\x45\x2P\x8r\xb4\x97^U\xd7\xe7\x7f\xa3\xca\xc5\xa1_\xc3\xcb\xb1\xe6\x14" -"\x18\xf6r[\xddx\x83\x65\x92\x43Q\x1f\x94\x86\nm\xc\xa1\x3Z\xe4\x39\x9d\xe1\x97+\xab" -"w*\x86*\xd7\x14\x8b\xea\xb3!\xcc^\x9eq\xca\xafZ\x17\xd5\xcdL\x7\xc6\xb3\x39\xdbY" -"\x1a\xa3R/\xcc\x19\xae\xd6s\x12\xed\x35i\xa6\xfe\x87m\x9\x96\xbf\xf7\xf9_K\x7f\xda" -"~\xd8\x33\xab=EeMT\xc8\xa3\x98\xd2|>\xe7\x9a\xb7|\xaf>:2L\xc\xd6s\x9c\x38\x96t\x6" -"J\r\xeb\xe8{\xde\xdc\x88\xc8\xc8)\x95\x32\xc5\x94\x3V\xe6YI`\x8a\xe0\x1d'\xc8\x15" -"\xb5\xda\xb3\x9aU\x9b\x99\x95!N\xb3I.6\xb0\xf4\xda\x4\x5\x1e\xe4\xaf\xc4\x3]'\xb9" -"G\x93\x96\x11l\"\x15\x5<\xf8\xd9\xf5\x1f\x85\xf9\x35\xedr\xa7\xdc\x43\x11\xe\x80" -">\x1e\x8d\xac\x83\xe\x30<\x1\xaaM\x1a\x9d\x38\xf3U\x3qp\xa7\x8e\xa2\x1a\xca\x42m" -"\xb4\xbc\x12\xde\xab\x80\xe2\\n1\x8b\xcf\x19\x1a\xdfR\xf\xe6\xb0\xbb\xf\x2\x1dwz" -"\xd1\x8c\x87\xc9\x82\x6\xbf\xad\xcd\x31h~\nqSL\xa5\x62\xa0j\x98\xadl\xc1\xbc\x92" -"\x83\xe4\x9c\xde\x80\x9f\x17\x10\xbd\xec\x90\xe9\x6\xa6\xb8mL\x1d\x88|\x97v9\x1b" -"\xb3\x7\x93v\x96\xaa\x8b&D\x13$\xa2(/<]G7\xefy\x92\x5\xcc\xeb\xe2\x80p <\xf1#(sO" -"\xa3\",\xdan#\xaa\xc2m\xb5'\xc2\x9c\xaa+\x98z\xc3\xc2\xc5\x87\xf0\x63\xa2x\x98V\xe" -"\xd8\xf\x8f}z\x1cK#\xfa\xb3\xa7\xf4%\xeb\x85\xde\x8e\xf7(7\xed\xef\x96\x18\xad\x41" -"\xda\xaet X\xa6r\xc3\xfd\x31p\x6\x1\x11'\xd2\x86\x90\xf8\xe;d\x96\xe4x^V\x92\xff" -"N\xf5\x97\x30\xe9[\x92\xd4\xc\x38Ujf\x1e\xd4\xf0w\xf9\x1f\xff\xe\x8ci>\xf6\x8f\x0" -"\xc7\xc9\x16\xdf\x1c-\x17I\xdc\x63\x45t'\xd9\xd6\xd6\xec\xec@<\xa6\xe\xf3\xae\x43" -"Ms\xeb\xf8q\xaf\xfeRe\xef\xeb\x93'\x8c\x30\xcc\x96\x9bgY\xcc\x3\xc\xbd\xfc\x36tH" -"\xeb\x7f\xe9\xd1\x91\x8c\xd1\xa5\x16u\xfe>\xcc\xc9\x86I)\xb1\xe2\xacY-\xa5\xa7Hu" -"-\x3\x1d\xca(s\xbd\xbc<\xdd[\x83\x5*9G\xa2\xesb\x15\x7\xe4OR|\xed~\xf1\x88\x13r;" -"\xecv\x8c\x97S\x9c\xc3\x1cq\xe7\x1\x37/\xde\xb0\xd0\xez\x99\xd3,\xfs\x1dt\xfbO\xae" -"\xabn\xc5\xd3\xae\xf8T\xf1\x18\x14\x1c\xe7\x15\xb9zP\x8b\xecNg\xf7\x35\xde\xb8\xd4" -"\xd5`\xb8\xbe\x62j\xa8\xd1\x86\xfc\xd7\x11\x7f\xccs\x85\xa6\xea\x84\xe3i%\x8\xd4" -")\xc6%\x85w\xd0\x87\x7\x1f}\xe\xc2\x17\xa3\x85,\x82\xe3\xcf\xda\xfb\x62\xbag\x9a" -"MMn}\xca\xc2ON\xcb\xb3_\x1e\x81@J9\xfd\xb2s\xb6\xe0\x8fQ\xe7\xd3\x85\xf1\xea\x0\x13" -"h\xa8\xcepJ\xe1\xc3\x14\xd7\x9e\x11\xbe:\xfa\xf3\x8c\x14\x65\x93\x1bP\xeo\x8bMM2" -"\xf2\xf7\xc0\x2\x31\x9d\x0\x8\x66i\x19P\x8b\x1b\xc5\x86\x8b_\x93#\xd9\x93\xee\x8f" -"~+\xfc\xb7Os\x81\xe7\x31;o\xf5\xb7\xa3q8 \xd6\x15\xba\x8a\xe4\xc8xs\xdc\x9aW\x3\x44" -"\xfek\xb2\x0\xf2#\xf2\xf5:\xd5\xfe\xdc\xb1\x96\xe\x83\xd0\x16\x93=\xcd\xcd\xbe\xb2" -"\xf2\xe0z\xb4\x2\x41\x14\xdb\xc1\xd9\xbf\xad\xa2s0q=\xf7\x5Hg\xcX\x91\x99W\xcb\xdf" -"\xc0\xc4M\x83\x96\xd6\x1fk2\xd2\xee\x14\x1c\xe5\x45\xcc\xf3*\xba]\xf5z\x15\x13\xc9" -"=\x1d]\xe4\xf6\xeb\xc4\x8fg\xfd\x1\xb5\xfe\xc1\xbf\x8dr\x9b\x1\xaf\xf0\xf5\xce\x83" -"\xf4\xf6\\H\xecT\x9f\xe9\x42r\x2\x39\xa1\xb5\"\xe3\x9c\xa1\xb2-z\x8e\x19\xc1\xe6" -"\xa8\xea\xa1\xb8O\xa8\xe9}:\x4\x8c\xb\x9f\xb4\x33\xaf\xcb\xfb\x10\xf0\x15\x9cg\xd4" -"\xab~\xca\x6JHC\xc8\\\x38\x81\x12\xde;\xdc\x8a\x94\x1cWO\x84~\xe3/r\x5g.\xf5\x93" -"b\x3\xba\xeb\xdc\xcb\xf\xe3K\xc9\xcf\xed\x62\x11)w\xb0\xed\xac\x8M!'{\xc7\xc1\x44" -"\xcd?\xcN\xe7jd\xbb\x89\xeb\xa1\xf7\xc8,C\x9y\xdf\xedp\x9dsv\x96\xd0\xf3\xf1H\xeb" -"\x92\xe3\x13-cA\x96\x12\xf8\x9e\x63\x10&\xc\x95^1[r}*\xe2\x38\x90\xad\xfb\xf1\xac" -"f|\x11\xe7\x99g\xa7\x9f\x65\xec\xa6\xe7-\x8a\x0\x36T\x6u\x1c\x31\x8bv\x96JQ\x9a\x81" -"RwlSY\xd6\x96\x12^cLq\xf8J\x9b\xe9HTW\xe0\x80&\xd1z\x80mH\x87\x96\xc1\xd5h!\xb\xcc" -"\x96\xe7}\xc1\x13Z\xa9Wt\r}/\x87\xc6\x66\x63\xe9S1n\x16\xc3y\xb\xa7 \xa4\xf6\xbd" -"\x8b\x37\xdf\x4\xc8\xe\xae\x2nSk\xa2\xf\x98\xe0H\xef\xa3\xd6/\r\xf1l\xd6\xc0\xb3" -"\x88\xed\x6\xa2\x38h\x8cZ\xdd'}\xeb_~\xbg\x9c\r_\xe0.\x9cG\xf7K\xbd\xb2<\xb1-\x80" -"\x1c\xed\xdc'\xf7\x16\x1c%\x1H\x17\x41\xf2\xb)9eh\x14\xff`\xdf\x15h\xc4\xb1]e\x1f" -"\xa8\xb7 LT\x14\xadK\xa5\xd4j\x88o\xc7\x62\xff\x41\xa9\x3\xfdV3W\xdb\xf8\xce\x31" -"/\xc2\x18\x61+\x19n\x7f\x63\x9d\xabm\xbf,A\xa3?E\xdf\x66\x84\xd3\xdc-}\xe9\x98(\xe" -"\x9c\x19\x9e\x8c\xb6\xe2\x19\xf4\xb9Yd\xcfIk\x95\x66\x41\x9a\xaf\xbe\n'\xbd\xbd\x39" -"\xed_\xd5\xc5~\x7\xc0\x13\x12\x87[\xea\xed\xd9H\xaa\xef\x9\x32\xe2\xcf\x94|\xc6\xf4" -"\xf0,g\x17\xde\xbf\x90\x30\xee\xa1\x8e\x61\xe7\x97o\x1a\x96n\xf3L, \x10\x98\x35\xf9" -"n3;\x4\xae\xc0}\xa2UN\xd1\x92\xfb\x7\x87\x33k=\\1T\xca\x1ft\xad\xa0K\x94\xa5\x9d" -"n\xf\x63\xaa\xa3\x41\x3&^\x8e\x8b\x92\xc1_\xc9\x1a\xe1w1[v\x8c\xb4\x88\xa0\x18h\xf8" -"dr\x11N\xba\x84\x93!\xe2\x10Te\xe7\xb0\xab\xb3\x87\xaf\x96\x6y]\x0\xc7P8\xc4\xe0" -";\x9c=c\x9c`\xe8\xc7\xfd\xc5\xa2?\x96\xbe\x99&\xff\xe3N+\xcd\xe9\x1d\xf7\x94\xe4" -"\xd8\xd0}\xba\xec\xf3y\x7f\xae\xe5\x91y\x7\xddL\x14\x1a\x19\xcdO9\xc5\xd6\xe0u\x93" -"p3\x9a\xae\xb8w\xb3\xfc\xf2\xb7\x33\"\xcf\xf3\xe0S\xbe\x86\xe5Y\xb3}\"\xe5\x87\x66" -"\xbb\x35W\x88'\xf\xb5\x66\xfa\xcd\xc8\x9e\xb1\xe5\x87\x8c\xf3yZ\x5\x14\xfb\xcb(E" -"\xb3\x8f\x8ei\x16\xd6\x16L\x16\xe1\x38V'[\xf1\x9c}\xc\xba\xc9\xdc\x1\xd1Qv+\xf3\x9c" -"~\x18K\xfdvR\x92l\x10M\xdbz\x8e\x33\xac]\x3\xc8\x4\x9eo!\xd3\xefL\xe7\xde\xef\x0" -"\xa8\x86\x14\xab\x39\x42\xd0W\x94\xea\xae\x38\xbc\x8\x8e~\xa8\\\xc\x8c\xe5\xa1\xaa" -"\x4\x8\x9eTD\xd7\x2\x82x\xb0\x9b\xff\x9f\xeft\x11\xa6=\xba\xdf\x64\x89\xc1\xfa\xc8" -"\xbd|4\xb6\x98HO\xee\xedi9\x8a\xbb\"K\xe0\x42\x1c\xb0,\x0\x9f\x11\xf\x9f?\xfc\x7" -"\xea\xac\xbc\x96V\xaa\xfb\xfa\x0\xf3\xa9$K\xa8\xa6\x87\x1cl%+\xa5\xfd\x99\x91\x39" -"\xa2\xceN\xf9\x18\xcd\x92\xe\x32\x84\x8d\x37\xb8\xf2\x62\xe5\xaa\x90\\\x16\x8b\xec" -"\x82V\xf0P\xdb:\x83=\x95\x97Z\xce*\x94\x1b\x65\xd5\xb1\x7R>CJg\xad[\x16=\xc2\xcd" -"\x9\xe5\\U7\xb0\xc3\x1f[,\x19\x37\x61\xeb\xc6:9\xac\x19,\xb4\x8c\xd1Vl/\xdc\xf2." -"\xb7lj\x17olH\xeb\x95\xd2\x15\x30\x38\xed\x62\x8a\x8d\xa6/\x98\xe5\xde:\x99\xc3\xdb" -"*\x90\x80\x43@QF\xc8\xe0\x15 S\x15\x80O\x93\x91\xff\xfa\x8a}\xf6\xc9\xdf\x13\x46" -"\x98\xf8\xf7\xb0[\xc1\xa2\x38\xc8\x1c?.2\xd0<\xe0\x9c\xf7\xe2\x88\x64\xc1\x9d\xe9" -"r\x19\x66\x17\xa8\xcbM\xff \xfb-\x96\xc8\xf9\x96\xfa\xb6\xf0\x1c\x13\xff\x45\x0}" -"\xbT}.\xa1n\xa9\x81\r\"\xf6\xdb\\\x9e\x9f\xc\xdf\x32\x3\xb\xaf\xa1\x95\xe1\x34\xce" -"b>k\\\xe0L#\x89\xd1\xaa\x32\x13\xa3\x8cy\xd7\xe0\xca?\x81\x34\x4\x87\xc4\xe4\xf4" -"\x7f\xcf\x7f\xe\x4_\n\xeQJUNB\x96\x8b\x99\x89\x30\xd7\x64{\xe4\xd2\xecx\xb0\xdb\xb4" -"\xd4\x92\xba\x4\xfc\x36\xe5\xd7TO\xfa\xfe\x42\xea\x45\xa6\x91\x34\xf9l\xd4#\x86\xc2" -"4\xa9\xe6\xfaT\xeev5\xd0\x1c\xf1~\x92\xb2\x8e\x8p\xd6\xdaQp\x96uX()7\x1dK\x15\xef" -"\x4\x85.\x96\x64\x88R\xfdp{@\xed\xef\x1d\xda\x30\xda\x95\xb5\xa2NIt\xc+\r\x84\x80" -"\xe0\xea{`\x9eo\xc3\x90\x14\x1c\x18\x33\x38\xe5\x39\xe6\x9e\x19\x95\xb6\xb2\xbc\x93" -"E\xc0\x9d\x94QX$\x1dU\xac\xfc\xc1\xdb\x35\xc6\xe1N\xf1\xe2\xfa\xf5:\x94\x38\xe0\xb1" -"\x8a\xf4\x11K\x94]5\xf5M\xc1\xd1\x9c\xa9\x1\xe8;\x99I\xd0U\x8dY\xd0j\xe2\xc9\x99" -"\xc1\xb5\xc8\xbd\xb\x1e\xd7\x45\xc4\xe\xc9\x11\xf0\x41/\x9b\xfa\x90\x87\xc2\x1\x39" -"\x1\x9e\x61\xf6\xa9g!s\xc3\xa9Hh\x17\xcd#\xfd\xdd\xff\xb2,\xe\xad)\x15\x80\x39\xb4" -"\xc7'n\xcb\"\x80\xaf\xe8\x11>\xc2\xfb\\\x1fu\xe8\x3\x87\x19\x6\xf2\x87\xa7\xc5\xc1" -"0\xab\xa6\x36\x81(\x1e\xce\x9f\xb5\xb5Q\xcf\x19\xbeO2{a\x86\xba\xb9\xacx\x12\xb5" -"\x6\r\xfa\x1c\\\xba\xfc\xe\xc9\xfd\xfd\xf7\xfc\x65\xa1\x31`\xb8K!\xf0\xa7s\xf0\x9" -"\x8f\x83\xe8\xb4\x1b\xcc\xa9`\xd1)\x95\x83\x8c\xfb\x8f:\xe1;\x86\xe7v\xd1q\xc5\xc" -"?A\x81\x84\x7pUR\xb6\xf6\xc0\x8b\xb1\xe2\xaeK\xc1s\xed\xc2\n\xf6\x82l\x95\xf1\x46" -"\x8a\x38,\x8aik?\xd4\x34\xfd\xe1\x32\x9b\x7f\xc5Ri9\xe2?*b\x2 !\x13\x66t~7\xa4\xcb" -"L\xbf\xe7\x1d\xbf\x31Ws\x11\x9coW\x4\xce\x63I0??j[\x1a(\xa8\xc3\x61\x61:\x2\x85r" -"\xd6\x1a\xfa\xb8\xb2\xb2\x1\x8a:/\x86\xd5\xbd\xad\x8c-g5\x9f\x8f\xf6\xe0X\x7\xbe" -"T\xa5\x86w\xaaU\x96\x8e\xba\xe8\xae\x92\xbd\xc1\xe8\xda{-\x17\x13~\xff\xb5\x1d\xa2" -"\xd2\x1bY\xc6'\x12\n*\xe4\x61\x41\xe9k3\xd6\x31\xc5`\xd1\x9d\xef\x8co\xcb\xdd\xf3" -"2a_*\x97\xd3\xf6`\xee#0\xc7\x9eK\xfaMw u\xe1\xa0\xb3sA\x18\xe4}4\xe1\x96_\x92\xa5" -"\xaf\x37;\xb0\xe5\xf9\xc\xbc\xf7\xb0.\x1b\xd6,\xbeW\\i\x9a\"\xaf\x3\x5\xa3\xb]#q" -"~\xcc^E\xb1u_\xb7x\xf\xc5@\xcd\xac\x33\xc\xab\xe4|\x15-t\xa9\xa6\ni\xc4\xac\xb5\x85" -"\xe4SxC\xde}\xbb\x5\xd1\xa4mE\xf0\xb8\xea\x62\xa8J\xc5\xb5\xb1q\x9c|\x7f(\xd3iE\x9b" -"e\xcd\"G\x8e\n\x63\xf7\x8f\x34`B\x1e\x4{-\xcf\xf\xb6\xacI\xe1\xc4;\x15\xdf\xa9\xed" -"\xe+\x85\xba\x80\x1e\xd6,\x87\xff,uJw\x98\xe9\x7|\xf3+\xdb\xae\xaf\xfc\x16t\xf3S" -"]\xabI\xe \xab\xeb\x42\xcav\xc7\xbf\xcb\x8e{\xcb\x1f#X/#\x2\xd4\xa4\x1f_\x9c\xbf" -"\xe8TGJ\xdf\x84W\x8b\xcb\xa5\x9al1m\x1b\xfcq\xca\xb3\xf7\xcdO\x81\xd3\xd3:\x6\x35" -"t>\xa0\x9c&\xb9\x1fz\xed\x88\xd7\xb7U\x99,\x10\x16\x34\x13\x17\xff\x96\xeb\x8a\xf0" -"\xf9\x39g\xb5\xa7\x41\xb2R\xf7\xcb\xa2\x66\x0\x18\x6\xa7\xf4\xfeJ\xf5\x9d\x4;\xe0" -"\"\xb0\x8ai\xe8\x64\x38\xabnZ\xc3\xca\x92\xc0\x65\xa0\xc6\xea\\\xc6\xa7\x94\xf7\xfd" -"\x7fQX\n]\x1a@&^\x80.\x97\xf3\xa1\x83\"\xe9\xb\x9c\xa1 F,\xa3\xe1\xf7J\xa6\xec.\x11" -"\x96\xd0$\xa9\x10!9H#7\xe5\xc6\x86g\xc0\xdd\xa5u\x1b\x0\x10\x13^n_&;@\x2\xf0\xfc" -"\x8a\x92\xe4{\xb3\x8c\xe4{\xaf\x8d#\xbf\x18^\xf5\x10-\x9cv\x16\x9Pg9\xb2\x5R\xcb" -"i\xeM\x9dkDRn$`\x92\xed\x1c\xbb\xef\x64\xfd\xb0K<`\xb1\xd0\x9e_w\xad]\xbr\xfa\x36" -"\xeb\xb5\x31\x17\x63\xec\x10\x38L\x94\xb3\xc7ln\xa4\xf6\xf9\x36\xb0I\xcc\x83l\x97" -"X\xdf/\xa6\xfc\x14\x62\xb7Gb$\xf\xe3\xd5\xfZ\xe2\xd4\xcao\xed\x66q\x82\x81\xb3\x9c" -"l\":\x85\x9b\x62(\x91]?Q\x92>\xeeW\xf6\x1at\x8e\x1\xe3w\xd9NT@\x83MQD\x9f\xd2\xbc" -"\xad\xeb\x11\x9bq\x1e\xb6\xfd`\xbz\x95z\x8c_\x97\x8d\xb6\x9d\xe9\x8a\x9c\xda\xfe" -"?\xa9\xf2\x63\xac\xb3\x14\x80\xc/\x16\xdfm\xe1\xa8\x19t\xcd\x32O\xd1\x81\xc8o\xfd" -"\x91\xde\x43\x93\xa9\xe0\x8V}\x5\xd2\x92\xc5\xf3\xaf\x80H\x88\xd5%\x9HM\xba\xa0\x18" -"\x14\xda\xb0\x82\x1b\xbc\x82\xd4*u\x9f\xb7\xf3\xc5v\x8e\xa5\x18\xf8\x34;\xcc$\xb3" -"\xb4-\x84\x95\xb1\xe\x93\x98\x38\x33o[_\xf5q]\x4\x9b\x90\\\x89|\xebX\xe2\xd0\xe0" -"F\xf4Q\xb7Rf\xdf\x15-\x96\xb8\xf4L\xad\xf6\xb3*\xcci/~}\x18\xd1#\xd5\x8a\x2\xe4M" -"\xf5\xb6\xaa\\\xcf\xe8\xef\xf\x83K\xe4\xd5\xec^\xf6\x18M'\xe6\xec\xf3\xbf\x30\x95" -"[\xe3\x9f?\xed\xb6\x8\xc1x\xb9\xcf\xc7\xf5\x97\x39\xf2ns\x18\xc8\xaf\x7f\xe1\x1b" -"\x9d\xa1\xb\x34,\xa9\xa5\xf8\x41\x1\x4\x98i@R\xb5\xb5\x95\xc4<\x88\xd2\xec\x32\xb4" -"f\xd2\x1c\x9b/\xb1\xb6\xf2\x1b\x1a\x80\xbbh\xb9N\xd8\x17\x7\x38Vb\nx\x95\x9\xbf\x9a" -"\xfc\xa6\xd4\x61\xf7\xdbz\xc2\"\xbfOuC\x1cP^E\x14\x9\xf0X\x14<\xce\x19P\xfc\xaf\x45" -"\xa1\xcb\x99\xde\x9b\x34\x9\x64\xf1*b\xfd\x11\xa7T\xf\x82\x32\xbc\x7fvY\xf1\xb8\xd6" -"s\xc9\xebX\x5\xd5\x30(^h\xc7Ia\xfevu]\xa7\x1b\xa1\x31\xdf\x30_\xc5\xfb\xf5\\\xb$" -"\x99\xe\x12\x1\x91\xb1\x33~\xf7\x3\xe6\xfc[f\x99\x80\xf7\xb3\xe1\x82*\xf9\xa3l'\xc3" -"\x8b\x43\xd9TN\xa8tj\n\x90S)l\x8d\"o5\xa9\xfHc\xad[$\xd1=\x80\xaa\xda\xe\xc3K{\x9c" -"\x98\xd6\xc9\xbe\xbd\x1.z\xaa\x63\xa6\xff>\x93H\xd6\xea\xa6\x81x\xfe\xcf\xa0:55 " -"c}E\xbb\xc8\xe7!\xc1^\xf9^\xb7\x90O\xbbQe!\x18\xac\xd7\xbc\x62\xd2\xbe\xbe\xb1\xf7" -"\xb1\xff\x17\x87J\xa7\xcc\xcd\x7f\x9a\x64\x90q\xb4\x65\xe\x99\x46\x32\xf1\xa9Q#$" -"\xbb\xd1\xe3\x1\xb9\xb3\xb6\x10x\xae\x5\xa7-\xd1 \x1\xf8l\xa9\x31S\xde\xfb\xbct\xd5" -"V\xad\xe5r\"h\xfd\x35\x15[\x12J\x98\x99\x93\x14\x17<\xda\xd8\xa6gz\x90\xe5\xdc\xa3" -"\x9bIali\x9a\x30V\xf1\x9b\xac\xa4\x63i\xce\xacN\xd9JwfNS*\xdd\xacH\x83\xf5\x17\xb5" -"\xc3\xfe\x89\xa0\xa9\xc1\x94\x18\xafr\xd9V\xb2\xa2\x66\x0-\x6`\x95\xb7\xd5\xde)\x6" -"\xf6-\\\r\x9d\xb5\x30\xac\xfb>[\xef\x8d{\x94$D8\xee:\xce\x34\n\x1\x17~\x8dR!dL\x14" -"$\xfb\x87\x2\x17\r\xe9w\xbb\xac\xc1\xb1\x6\xe4,Ors\x18\xeO\x17\x1f\x82\x7f\x8a\xc8" -"z\xc0\xdf\x39\xe2\x32\x16\xf9\x92\\\xa1\xa2\xed\x43/\xfc \xb7\xc7n:>y\x80\x9b\x0" -"\xed\x30\x6/5W\xd0Pb\x10\xc4\xd9{\xc3\xd1\xf1\xc9:n-\xc3\x3\xf0\xe5\xea\xdb\xbc\xb3" -"1\xe5zT\xcc\x87Q\xe2\xde\xcV\x4p\xa0 \xdd\x9e\xb8\x36\xe8\x9^\x1e\x4\xad\x36\xc\xd0" -"\xf9\xdb\x94sp\x1f\xb1\x94\xb5]\xa0\x15\xbf\xb8\xed\xae\xf2!Y\xda\xc7\xb2w\x16}\xe5" -"\\\n\xc8\x8fw\xb6\xf5}\x84\x8d\xab\x7f\xf9,\x16\xe1W=M\xc2\xfc\xa7\xaeLx\xb5\x9\x97" -"\xe5\x1d\xf5\x96\xdc\xff\xf1\xe9\xc9\x91\xb9\xc8\xda\xa7+6h\xca\r\x34\xc2\x39\xc4" -"\xfe\xe9\xc0\x80\xfe/\xb1\x8aQ\x80\x44\x80\x18I\x92\xa1\x17\x83\xf\xaa\x89\xc4J\xfd" -"r\xb2\x39\xea\xb5\xb1\x1b\xc7\x88\x32\x0\xe9\xa3\x46\x66 \xb\x11\xa8\x8e\xa8v\x9d" -"N\x95\xedG\x3\x82\xb4\x17\xaf\x88\x41\x9e)x=\x89\xd5n\x9d\x81N\x1a\x13\x95\xd3\xdc" -"\xc3\x98\x41\xec&\x0\x9f\xe9\x2\x86\xc8\xd4\x82\x34\xf5\x8a{\x8f\xa8\xdf\xe9\x39" -"\xd3`\xb3\x93\xdc\x88\x92j\xb1\x16\xc6\xa9\x2\x8\xe7If\x3]\x81\xdc\xc2&Ups\xf2\x84" -"h\x7f\xce\x8U\xf2Xw\xe1\xe\x44wq\xe2\xcb\x8drk2[\x1a\xfbr\x82'=\xabOd\x82\xf8\xd5" -"]\xf9\xc3\\\xdfi\xef\x9b\xe5\x65*`\xcd\xe\xbf\xe0\xc8\xf5\x1e\x9c\xc9>\xdb \xd0\xf" -"\xa7\xa4\"\x7f\xb0\x64\xed\xc2\xb6\xbf\xa6\x8\xb8\xea\xc4\xfdhn-Z[F}\xfa\xb9K\x1e" -"Cs<\xadhF\xd6\x87\xd1\x7\x7f\x82\xb3\x81N\n\xa4\xfy4\xeb\x65n\x87\xe0\x36\xb7\x66" -"i@$\xab\xf1\x19lu\x8c\xeeI\xa7T\x83\x85\xe8\x30\x65v$\xf2\xc5\x35\x44\xc7Gh\xca\xbc" -"w\xcc\xf0\xa3g\x9e\xf7\x1dK|\xb3\x1f\x82H\x84\xa1U\xb0\x10\xa9\xee\xd4I$\xf1\x43" -"Qu\xc9(\xce\x3\xe9G\xad/\xe3\xd8\xb7&;\xc3\xb9\xda' `G\x98\xc9'\xd2\xc4\x89\r\xae" -"\xfb<\x4\xdf\xc6\x64\xf7\x87\x8d\x3(\xd6%\xf0\x9a\xca\xc5m\x1b\x35\xb3)a\xba\xeM" -"\xcf:\xf5\xda\xe6\x46\x1c\xf1\xe7\x44~\ry6\xbf\xf\x32\xfe\x9c'\xaf\x9b\x14-\x15n" -"\xc0\xb8\xf4\x81\xb7\x80l\xca\xf3\xd8p\xbc\x37\xce\x15\xb4\xb9|\xc8&\xd5\xce\x9c" -"\xa8\xc\x44\no\xdc\x9d\x19\xe8\x9e\xd2\xe4[\x8b\x93<\xb8$\xff\xf2T\x18\xd6r\xf3\xa0" -"\x5\x8a\xf5\xcf\x98\xa3$C\x5\x5\xfc\xbb\x36\x84\xe6\xc0\xe1\x12?\x1awf0C\x8f\xb9" -"P\xc6\xbf`\x1e/O \x89{\xd6\xb9\xc\x36\x61l\x93\xbfv:\x8b\x4[\xd0_:)\xe1\xef\x1f\x82" -"\x88\r\x93>\x87\x36L\xf0N\xd3,\x19\x31J\xc6sk\xb2\x89\xb1g\x6U[\xbaS\x98\xcbx\x7" -"z\x9eK\r\x12\x45\xfd~\xfXl\xbf-\xfa\x33\x10\x13\xe7\x7\xcf$\xf4\xddUw\xfa\x44\x16" -"\x7f\xb3Q\xcf\x9b_nS\x8\x8eS\xc7\x2\x4=P\xd4\x83{'\x7K\x9b\xac\xd4\x5\xc9\x31\x91" -"\x4\xc7}\xba\xc6\xaa\xcf\x8\xe\xc4\x91\xbe\xff\xc0\x65\x99\xde\\p\xc7l\x15\xef\xe3" -"\xd3.[|@5p\xba\x41\xd2m\xbf\x9a\x1e\xd0\xa4\x85\xa8-\xdf|\xd6\x9\x36s\x1f\xb1\xc1" -"\xec\xc6\x34\x92\x96+h_\xe8\xb2}\n\x15\x8\x99]\xf%\x66\x14\xa9+\xb0\xac'+\x19\x17" -"\x80\xe6\xe6\x1c\xf3\xde\xbc\xac\x32\x61M\xff\xc0\xf1\x30\xfe\xfa\xce\xd5\xaf\xb5" -"\x1e\x84\x44\x97l5\xd7\"\xe4\xfd\x1ap\xb7;q/\xc4ur~\xb1[\x1a\x1bk\xa9$\x80\xfa\x11" -"\x12r\xa1\xd1\xd6\xa3\xb1\xd6\xb6ZJ\x90X\xef\x33\xab*\xce\xe7\x96\x13\xdd\x66\xea" -"5\x9b\xdb\x6\x86\xb\xb1\xd3\xa2]\xb1\xe7\xd8\x8aR\x8g\xef\x1ap\x88\xf7j!\xa3\x11" -"pD&\xf4\xb0\x38~2\x80&\xc9\x15\xcb\xf1x\xd2\xdf\xb1\x12\xbcl,\x1f\x38G\xc7$\x3\x94" -"\xf3\xcf_\xde\x89\n\xc6\x2\x4\x8a\xe9\xa3t\xe4\xa6\x2Gk^\x15\xbb\xfeWJ_\x90\x9\x0" -"\xbu,\xfa\xd5\xd2\x89k\x19\xaa\xddo\xc7<|^\x1e=\xe4\x95\x11N_~\x9b\xd6\x36\xe\xf8" -"\xffq\xd3;r\xc8>\xe\x18\xa2\xc5\xab\x1c{\x89\xfd\xd8\x12\xb2\xd4\x39\x95\xe5\xef" -"\x14\x8cq\xbdY\xcb\x86\x1\xeb\xae\xbci\xe4\xc7PMP\x9b\xc1\x87\x8fq\xfav\x5\xb5\x39" -"NZ\xf\xbf\x93\xda\xf6T\x1ao<\xc3\xdbG*.M\x82Y\xad\x8e\x8f\xaf%\xdb;mg\x96S\xa7\xd1" -"d\x1c\x11\xc0\x34w_`\xda\xcf`\xe0\xce\xf0\xb2\xb6\xe1*\xaa\xc5\xb1\x1f\xce\x42\xe8" -"\xdb\n\xda\x33\xa4\x63\xd0:\xb3\x36SL\xe2L/\x89\x8c\xf8)\xc\x32[\xbc\xbduC\xbf\xf4" -"~\x95\x9a\xfXh\x90\xd6\x6m\xbe\x99\x8b\xf7\xea\x84L\xf0\xdc$\xc\x88\x93HC\xff\xaf" -"a,\xb8\xa2\xca\xce\xa4\xaa\x32O\xa2}\xb2\x7\x8d\xfc\xc4\x37\xdd\xee\x39\xa7\x0\x39" -"J\xe0H\xfb-\xcf\x9b_\xc2\x1e\x89\x14\x64j\x7\x88\x99\x6\x63\xd7\xd8\x8bJ\xa2\xbc" -"\xe8\x86[\x8b\x18\x37\xac\x30T\x93*'\xcdT?\xe3/\xfds\x92\xf3\xd9<\x14\xf5\xb5\x9e" -" \x6Z\xeaq\x8c\x87}\x84\x46\x34\xc\x85\xb2\x9a\x32_\x9eh\xd8\xe8@?\xaf\x80\x38\xc0" -"}\xfa\xc5\x4\xb6\xc0\x99\xe4\xd8k5\x80\xe5\x18\"\x19\xcfsp\x88\x18" -"{\x15<;e.\xda\xdf\x37k<\xb8V\xd8\x9b\x45W\xc7\x19,n\xaf\x8c\x8f\xc>;\xe8\x43\n\xc9" -"~\xf2\xd1\x8a\x15Z\xe8>H)\x15\x61(i\x17\x3\xdc~\x8bS9\x90\xc7\x81\x8G+i\x9f\xe8\xff" -"\xd2\xdc#\xf\xcb\xe2\xe0\xaf'\x84|B\x94\x89\xb1\xd7\x1j[\xa0\x87\xbe\xef^M\xa1\xda" -"\x18\xcd\xf0\xc4\x18\x33*\xbak\x7f\xd5\xb0\x13\xf3\xd5\"\xe4\x8d\r\x8a\x63m3P&\x87" -"Y\xc6\xbe\xfa\xfd\xe5\x8ci[\xb2>\xcfN\xf8\x96\xd2\xba\xbe|\xbc\xb8\xe5\xf8\x93\xec" -"sY\xac@\xc6(\\\x16\xfa\x32\x31tE\xb8\xb1r\xf7\xdbY\xf0\xbd\xf0\x16\xd8\x4\xac+\x7" -"\x93M\xb8\xf9$\x8a\xdc\xc0\xb\xcb\xbdo\xcbh\xb2\x94\xc2\x94\xcb\xad_,@8\xe3\xb5\xfc" -"\xe8\xfc\xae\xe5\x9f\xea\x64LM\xbd\x96\x89\x4Kq\xf7\x84\x2\x0\xa9\x89\xc6\xe8\\\xee" -"\xa5\x61]\x6\x11Q\xf8\xc0s\xbeN\xb8\xb1\xc3\xee\xdbK`\xaf\x66\xa1)\xeb)\x19\xd9\x45" -"\xa2KS\xe5:E\n{\xf3i\x0\xfc\x90\x1a\x64$\x86\xa4\xfe\x41\xb7\xd7I\xe2\x0\xdb\x17" -"2\x1\x14M\x1d\xc3\x6\xb9v\x9\x33Y\xd7\xa8Z\xb3=\xc7\x98\xe1\x8d'k&\xad\x95\x84.\xb5" -"V\x12?hV\".\x6\xe\xafL\rV\x90\x41\x41&<\xfe\x37K\xbc\x15\xb4\xaf\xf8$\x9d\x35\x83" -"\x1b \xb3\xb0\x32\x86%\xc\xa1VB\x17\x1cK\xe9\xcb\x8ap\x88yP\x19\x9f\xa8\x43\x86X" -"\xd3\xb4(\r\"\xa2\xe5\x38\xfc\x8c,\xd0L\x97\xc1\x65m\xa4.\x9e\x86\xf1\x8d\x1c\xc0" -"0N\xef\xca\x7f?I\xcaP8\xb6\x1e\x38\x94\xd3\xb9\xfb\x81\x31\x4\x7f\x61\xbfz\xd6\xa6" -"H#\xe\x95KJm\xa6\x61~\xaawv\xdd\xf0\xc1P\xe7\r\x1e\xd9{ZZ\xbb\x87\xfa\xf3Wx\xbc\x95" -"\xa8\xec\xac\x9a\x9bSS,\xbc\xde\xb3\x44\x36\xeM\xa5\x61\x84\xbe\x96wC\xe6\xa4)\xc1" -" \x4<\xf2&\xe2\x13r\xfe\x9a\xf0\xe6}\x96\x41\x85\xb8T\x1y\\\x98q\x1c\xf7\xba\x65" -"1\xdak:\xf0(\xfc\xda\xc0\x1b\xa2V\xdes\xfc\x1b\xc7\x45jm\xe5}9P\xfam\xce\xe4\xcc" -"\xc9\xa7\xdb\xc3\x9a\x65\x7\x1bu\"\xac\x91\x7$r\xe2\x8b\xb2\x99\xa1\xa4(\x85)F\x8b" -"\x1bv\x1dI\xb4\x8\xd8`JN7\xaf\xdf\xb3\xf2\xabY\xe3m\xe3\xd9\xed\xe4\x30X\xc2\x98" -"\x17K\xb0\x1\xb1\x80\xec\x0\xcd\x80\xa5\xddK\xc1\xe8\x1c>\x87\x9a\x66[\xb.\x3\xfe" -",c\xb1p\x8bx\xf6\xab\xefO\xbf\xa2\xd8\xc1\x6-3K\xe5\x65\xc1\xf3\x42<,\xea\xe0\x19" -"\x82\xbaQze\xd8]}\xd1jG\xc3\x65\xc7SY)8\xe5\x7S5\x1dQ\x0y\x9f\x7\xfbgN\xe3}\x1b~" -"\xc\xe3\x38\xde\xf6\x91\xde\x8\xa0\xeX\xee\x8d\x8aoY\xbe\x38\x3Wp\x1c\xcf\xb9\xaa" -"{\x9f\xeNl\xed\xb1\x95\xeU\xbd\xf8\xd5>X\xdar\xe0\xf1g\x9c\x9\x8e\x99\x9cX\xa2\xb" -"\xee\x86\xae\x90\xb0\xe9\x38\xbf\xd6X\x95Z>\xe7\x9b\xb8\x30\xa2\xf6\x9a\xad\xe4\xb1" -"\"\x11o)\x12\xbb\xc\x7f\x87\xcd?\xb4\x8b\xe5\x16s&\xe1\xad\xda\x90gN\xcc{\xd3\x9d" -"&\xd0Q\x82\x4\xc9>\xcf\x93\x11\x44\xc6\xe4Hi\x13Q\x13\x66\xe7\x64\xf4\x36>\xfa\xb9" -"R\xbd\x6\x97\xbay/m`\xdd;\xa0\x90yf!~\xc9\x9\x8a}\xd2\xcb`]i88\xcf\x92?\x1b\x38I" -"\xe1\x95\x9e\xbf\x3\xdc\xa7\xbL:\x11\xb0\xb7\xd7\x19\x35\xef#\xb9\xe5\xc8\x94\xce" -"U\xeb\xc7\xa9\x10\xf2\xe1\xf2\xe4\x1e\xb2\xbf\xa6O\xb0\xaf\xc4\xc0\x2\xc6\xaa\x45" -"\xc1\x3\xf\xfb\xe9\x8d\xef\xad\xfep\x9eZ[XS\xaa{\x9b\x13\x8d+Qq\xf2u\xdb\xcfV\x9c" -"@&\xe\xf2\xbe\xdd\x64\xea]]d\xcaN\xf9[l\xf1\x8a\xb\x63\x95\x91\xc8\x83\x44\xd1\xc8" -"/\xb0\xaf\xc3\x8f\xd9\x33\xda\x90\xd3\x83\xfe\xe2\xcb\xe9V``\xe2\xd6\xa9\x97\x65" -"\xb1-\xb3\x82\\\xb0\x9i\x2\x9d\xdb=s\x96\x84\xdc\x1e\xa9\x9b:\xc7i(\xe3)\xe8\x1f" -"+\x1f@\xfc\xdf\xe9k\x84\x1c\xfdx\xdf\xddx\xaa\x19\xff#\xf8\xa4\x98N\\l\x85\x88\xf2" -"\xe0\xcb\x38\x63\x9d\xa2L\x19\x96\xd9M#\xca\xcc\xd6\x12s\xb1\xeX\xa4\xe2\xb\xab\xe1" -"\x0\xe\xf0\xac\xb2\x9fH\x1e\x7\xe9\xe5\x80\x7f\x8b$|\xb5\x91\x85T'\xf1\x90\xd1W\xae" -"Q\xcb\xe2n,\xe0\xed\x85\x36[7k\xb/\x93\xfa\xb2\xddI\xa3\xa7\x1\xd5VWw=H\xae\xbe\xd5" -"\xf3\x96t\x92\x18\x9e\x16'\xdc&\xc1GaN\xb0JK\xe2\x85\x82\x2%\xdb&\xbe\xe5\xefm\x1e" -"\xdd\xe9\x1a\x11\x85\x11r\xd9ke\x7fP\x96\xb9,\xa9>'}\n\x91\xea\x35\x8d\x8f\x8b\x80" -"\xcb\xe1\xf4.s\x9b\x64\x85\xed\x81\x61\xc4;>^\x10\x64\"\x89\xeO\xb5M\x91\xf9\xfc" -"\x4\x34\xc7\xf5\xce\x87\xf6%\xb7\xfc\x33\x9f\x8a\x10\xde\xd6\xee\x1e\xc5nU\xde\xaf" -"6\xb6u\x11Y\x8e\xc6\xc5\x37\xc5\xf\\T\x6\x14\xdd\x88!'=I\x1f\x1\xa2\x3\xc3\xb0\xe" -"2&\"\x92\xa9\x1c\r)\x9\x35\x9b\xec\x38\xd1\x33\x95\x92\x90\xa9\x38\xd9G\x81\x33Y" -"\xee\x36$\x9fy\xbf^\xc3\xabI\xb4\xbl\x17h\xa9\xb\x11\xfnN\x14\x1e\xeb\x1d\x14\xdc" -"\x4o\x8b\xc\xa3\xe\xd5\xec\xccSz\x85\xbb?\x6\x37\xa7\x43\xc3\x34\xf9V\xf7\x35H\xc3" -"\xa3yS\xfd\x88\xf9x\xe4\xc9<0}\xdcLg\xaeIx\xa4\xc0g\xa1\xc1\x7\xeck\nT\xce\x3*vN" -"\xc5\x1c\xb2\x93\x8c\xc8\x37\xab\xc\xcc\xe2\xe\xab\xa3\x1e/\xcb\xafjw?\xf6\x1a\x34" -"\x80\x1d\x4\xf1$/\xf3!\x88\xb6]:=\x9a\xa6y\xd9\xce{L2\x9a}\xf5P\xaa\xb5MG\xe2\xa9" -"/FL\xe4\xc6\xb7p\xe4 \x16\x30\x3\xb6\x80\x85W>C:L\xb8\xc6\x6\x11\xf3\xac\xfeGu\x9b" -"A<\xd6\x8c=\xc9\x18\x90\xc8 w\x1f.\x8a\xcf\xd0\x9a*O,\xb0Lt\xb2\x90]\xch\xe0)u\xf" -"\xbe\"\xd4\xed\x7\x97\x33`Mj\x7fY\x4\xd2\x30\x14\xf8\x18H\x8b\xfd\xb\xd5\x8c<6fa" -"\xa0\x8c\x80\xa4\x8aO\xff\xd9L\x16\xf4M((\x17[\xf3\x83=g\xd0\x9f\xc4P\xa1\xc7^-\x8f" -"\x9\xd9\xc0\xc1{\xab>\xb1\x8\x94^7\xbdW\x14\xc7\x9a\xd2\xa5\xc2+\x98\x45\xf2\x93" -"\\H\xd8\xbf\x88\xb1\xb8X\xf7x)\x16\x5\xdc/RR\r1;\x9d*\xea\x1!\xbf%)\x88\x1e\x86\x94" -"bnB\xb1\x37Q0\xe9\xe4\xa5\x6\x9f)I\xee\x8e\x9f\x65&G\xae\xd0I\x82~\x16\xdf\xf7\xcd" -"\xba\xac\xe4\xa2>\xc4\xda\xd3L\xce=\n_8@\xb0\xe9\xad\xee\x8a\xd6oa\xa9\xc\xef\xb3" -"\ry\x17wzd\x89\x62\x19\x93\xa5h\x99.\xe5\x9fI\x12\xf0\xc1\xc1\x18_\xdf\x9b?}\xc8" -"\"\x86\x1f\x85\x38\x33\xc6\xad\x7f\xdb\n\xb9\xdd/\xfe\xf8\xc6\xb3s\xe1t\xcb\xfa\x42" -"\xbe\x0sB\x2\x9cK\x3\xf5\xbd\xfa}\xcc\xdb\x1\xb0\xb6`}db\xb8\xfb\x86\x84\x83\xec" -"\xc2\xae\xee\xa3\x41;6\xc3\x3\xc6\x85S\xc9\x1c\xe8\x9b\x10\x7\xff\x65_9\x7J=\x8j" -"%m\xde\x8b\x98\xfd\x1c\xaf\xc0\x98\xc5\r\xbf\x92\xc\xcf\x3\x95\xcc>\x1f\x34\xbe\x9b" -"\xd4|\x14\x94\xfc\r'\xb1,6A\x9\x6:\xde\xe0\xfa\x61v;\xce!\xc9}\xaf\xfd\x32\xa0 \x9a" -"a\x87\xdaIg7\xf0\xee\x10\xd1W\xb1WO_|\xe7\xf5\xe4\xd9+\x1b\x8a\x14\xbf\x1a\xeb\xd0" -"\xce\x99\xf1^\xfe\\\\_\x7\x37\xe6\xd6\xc8\x45\xb5\x1f\x9b(2p\x7fn" -"\xb9\x11\xb9\xcf\xc5\xfe\x2\xd6\x8d\x8e\xcb\xe3!\x95\xbd\xf2\x83\x6\xc8\xfb\xf0{" -"\x83\x33r\xaa\xec#\xf9\x82\xc0\xc6\xc1\x8f\x64\xcPN\x7g\xe\x99\xb9\xba\x41\xbf`x" -"\x2\x85\xb2i\r\x1$\xfd\xe6\x65\xd9\xe7\xdf\xb8\xf4\xc2S'\x8f\x8\xf8p\xa3\xe6\x9f" -"\xc9\xbb\xd2\xbd:}\xc8<\x10\xc8\x64\x93:\xe7\xaf,\xc8\xb3Vg\xf1\xc3\xab\xd6\x8c\x39" -"qT}k\xd7u\xc7k\x86\x10\x82\"\x17\xe3R\xafy\xe2OsZ^]\xf6\xf7U/\x82\xa6\xc3\xcf*\xe1" -"B\xcf\xe7\x96o\xce\x9f\x7f\xf3\x9b\x66\x3I |\xc8\xb\xab\xb9@\xfbLrF\xe6\xad[\x91" -"\x13\x0\xe6\x89\x1d\xce\xaf\x93V\xdd\x99\xf6\x33QR8\x1\xc1\xc6\xcb\xd8\x15\xb9VU" -"\xfc\x1d\x44r\x11\x95\x64\x61?\x8ak\x14\xc0\xd2^\x11\x13\xb0\x7f\xeb\x9cy\xbe$\xcb" -"\x2\x18\x2\x64\xc6\xf2\xf1\x93\x30\x0\xd2\xb2@\xea\xae\xee\x32\x1f\xe1\xf7\xaak\xbe" -"\xc6\xef\xb4\xd9\xd4\xa0N\x8e\xc4\x99\xf4\x36\xc2\x99\x9c\xc5\x8f\xb8\x8f\x9d\n\x97" -"lN\x9\x38\xd7\x84g\xcf\x97\xad\xfb\x9d\x97\xc6\x1&\xec\xf8\xe5\xe7%\x84\xcd\x91\xd7" -"S\x9c\xabKFO\xd8\x90\xb8\xf6\xe4\xa8\xe4\xf7\\,O#:\xb7\xdd.\xca\x8d\xf6g\xe2\xf4" -"\xe1\n\x95\xce\x38\x63\xa4>\xd0\xb7!|\xd0\x35\x0\xeb\xbc\x11\x8e\x8\xc4\x93\xe6\x63" -"\xd8\x80\xab\x19\xea\x8x\xe3\xf4%\x34\xa7\x33X\xae\xe5\xc2\x19\x1b\\Z%\x15\x63\xc2" -"t%\xab\no\x90\xa9\xfc\x98\xc4l\x92\xab\xfbW\x8\x1f\x87\xaa\x9c\xb0\x36\xbb\x89\xdd" -"\xe\xe2H\x17\x88\xe6\xf\x3}t6\xb1'\xc6\xd0;uSW\xfd\xc5\xb5\n\xe\x37\x99\x86'r\xb2" -"A\xd6\xb2\x99\xba,\xde\x64\r\xb5[\x11\xdb\x99\x1b\xbf\xea\xd8\x7\xf\x37\xe7\xd7\x1d" -"\xbb\xe8\xb2\xe1l\xcc^\xfd\x87\x0\x82mBj_\x8b\xbb\x1b\x37\x1b\xe6\xde\xdf\x61s\xbe" -"\xf6\xd3|D\xe6\xa9\x65\xb9\n\x65\xa8S1.\x8f\x4r\xb1\xb1\xd8\xa4\xcv\x9a\x35\xed#" -"\xe5\xbfq\x15\x9e\xa0\x1f\x6&Xh1\xf3's=r\xbby\xe\xca\x15\x8c\x97\x37\xd9\x9\xda\xe6" -"\xad\xc7\x8f\"\xf0\xd2\xfe\xcbv\xe\x11\x8b\xb8S\xe5Y\xe7\xea&\x1f\x1b\xe3\x8e\x4" -"\x83{\xf7\xb6=\xc2\xeaQ\xb1j\xe6\x91\xe9\xdb\x45\x81pc\x8\xb1l'\xb4X\xbe]\xee\xaf" -"}\xdd\xd1\x9a\xe0\xc2(\xd7\x7f\x1d\xc3\xb7\x84\xa0\xf6\x96\x96\xa6hN\x9ew\x9]\x8e" -"m\xa7-\xa8\x66\x88)\x10n[T\xa6\xbd\x12\xc0k\xc\xd2\x4Y\xb1\x10\xd7So\xfeV\xad\xed" -"\x1f\x44\xec\x98'q]\x8d\xc2\xed\x1a\x96\x6\xe9\x39\x17\xa9\xb7N\xe4V{_N\xd8\xb4\xe4" -"6\xb1h\x85\x8f\x93\x93\xaf\x9a\xa5\xe6\r\x80\xefjz\xad\x11X\x9cW\x83\x16\xe1\xef" -"\x8d\xdeU\n?|\x82\xd0\x8c\rV\"\xcd\xee\xc6\xe1J\x92l\xe2u\xc9U\\\x9c{\x90`\x3\x8a" -"\xe6\x33\xe;\xd3\xc4lR\xed/\x1d\xd3\x8aW\xab\n\xd8\xaa\xaf\xa7\xdf\x11^\xa0\\\xc3" -"\xad\xe5\xb3\xa1\xf3#\xda\x0\xac\x18\x43\x99\xbb\xad\xa9\xa3\x42\xee\x3 \x7f\xc3" -"\x95K\xf0\xb3\xb7\xaa\x65\xf\xd7\xef\x8a\xcc\xfa\x8b\x64\x18s\x9d\x88\x31w.\xa2x" -"\x1\x14\x61\xef=\xb7\x18]\xe3\xbc\xee\x86\x43\xf4\x32S\xaf\xac#\n\xeci\xad\x8c\xe6" -"\xd0\x30\x8a-\x7L\xfc\x8c\x8bI\xc4\xf4\x43\xca\xbc\x85t\xd7\xfbY\xb1\x8d\x8c+\xb3" -"\x2;\x3\x9f\x9c\x32Y\xb8\xfc\xef\x31^\xc0W\xcct\x1d\xc5\x8d\xf4\xb1{\xc\x8b>\x3{" -"P\x91 \x87K\x1a\xa9\xdfIw\x18\xf3\x7fJ\x8e\xd3\x80\x10\xba\xd6?p\x85\xfa?]&8Z\"0" -"\xb4g6\x92\xa3\x8\x89\x2Gn\xbb*\x14\xb8\x66\xcd\xe\xfb\xcd\xfa\x62\xcf\x93\x89-\xfc" -"\xad-%\xbe\xe5>\xde\xff\x65]\xc5\x3\xeb\x8f\xbb\x12\x84\xb0`r\xda\xec(p\x3\x8c\xcd" -"\xcf\\\x90\x8c\xcaQk\x85\x19&\xf7\x36\xd1jd\xc3\x2\x0\x94\xdc\x1dw\x8e\xf8\xa2\xb0" -"\xdb\x44\xd3\x8eK\xb\x64\x96\xd7\x97S\xa8\xe0\x62\xda\x37\x11\xa8\xd3\xbc\x8eZ A" -"R\xd5\x64\xbe\xdb\x1'1\x97\x8f\xf9\xf1\x9b\xdb\x6\xc7>bM\x95O\x8b\xf0\x83\xf9\x11" -"\xbc\x10\x8c\xd5\x44P\xdb\xd1\xa9\xd8\x86\x9fq\x15\xcc\xff@\xee\x15R\xff\x7\xc9\x66" -"\xb6\x1b\x1\x18\x97\x11\x36\xf8\"\xd1\xf5k\x19_\xc4*\\\xa7\x62\xf4\xb8^\x13)\xf4" -"\x98o\xbd\x7f\xe6\x83\xb\x88\xd9\x1a\xea\xb3\x93\r|FF\xac\x8b@\\\xf:1#\x13\xc9.>" -"RAJ\x9b\xe1\x9\x94\x8a\xe5\\Yk\x13\xb7\xafG\xbf\x4\xce.u^\x9a\xd7-\x91\xfd\xe2R\xd1" -"@\x86*\x8d\x30\nw\x3\xde\x8c\x41\x64\xbc\x63VT\xab%\xcfW\xf3\x35\xa4\xe6\"\xd1\x7f" -"e\x1eI)\xcbN7#\x7\r\xac\x39\x94;\xef\\\x9c~4z1\xd4.\x17\xcc\xac\x9\x81\xad\xb5y\xd3" -"\x14\x7f'\xcc\xda\xa2\x99 \x1d\x95\x14&\x18\xcb\xb1l\x95>W\xc6u\xbd\xd0\x84q%\x3" -"\xb2#\xd4\xd6\"\xd6\x19~\xd1-Q\xb0\x34*\x97\x16\x46:\xc5Me\xc3\xd5\x1d\xf6-f\xad" -"\xfa\xc2\x7n<\xda,\xa9\xb9\r\x85un\xbb\x96\xb5\x2\x86\x92\xdc\xf7\xab\xa1\x9e\xa2" -"\xab\xb1<\xe2\xf9\xb4\xde\xb4\x1a!\xbe\xe5Q-ps$\xcb\xb\x38ZA\xb3\x37\x62\x98\x16" -"X\x8b\xf6\xac\xc8;\xa2\xbe{@\xbdSa\xb1)h\x81\x46\x61\x15^\xa9\x94\r\xb6\xb4\xc5\x88" -"x\x9c\xca\xb3T\xe3\xe4\xe4t\x6\x42\xf7\xa5.0<\x9d)0\xe2\xc6w H\xbc\\\x8gAq9\xc1" -"!\xa0H\x8b)\x8e\xc1*\xe2T\xdf\xcb+\xc1\xbf\xac\xee\x43h\xb6\x1bi,\xd6\xd6\x65]\x97" -"\xaf\r\xb4X\xff\xbd\xa7\x7\x3Y\"R\xc3\xbf\xc\x6\xc\x85\xcf}\xbd\x41\x10\x7f\xf0\xef" -"r5\x90v\x94n\x8\xf6\x6\x42TQ\xef\xe8\x2\xb6\xd1\xf7GL\xc8\x3<\x8f\xeb\xec\x80M\x15" -"\xc0\xfe\xf5\xbb\xe<\x2\xfb\xa9\xf3\xcS\xeb\xfe\xb5\x95\x4\xb9\x9bH\x2\x8eK~\xe8" -"\xec+\xad#&\xf2\x83\xc0t\xe9_\xfc`\xfd{\x8fLB\xf8\x8b,\xb0\xd4{xpK[\x87\x44\n\x97" -"\x8c\xffx\x19\xf6?\x97t\x2\x63zV\xee\x85\xe1\xfe\xeb\x62\xedmj\x9cK\xd4\xab\x34\x94" -"h\xd1\xc8:Su\xd9-d\x1c]%j~\xb1\x11TdD\xc0Q\xa4q\xf2\xb8\xc7:\xe9\xd2Yl\x99\x45\x90" -"\x7f\x6q\xb0\x95\xe6$\xcb\\\xc6\xc6\x1c*\x97\x19\x92\xf3+o\xcc\x6]\x9c\x37\x41\xfc" -"\x17\x91\x86<\x1e\xce\x9f\x14\x35\x2w\xd1w\x85Q\x7\xeb\x99\xdb\xcb\xe0\xef}o\xf0" -"\x0U\x85l\xd7\x8e\xc7\x6\xb\xc4\x1f\xfdv\xb6U\x6\xea\xacRu\x80z\x81\"\x12_\x18\xa3" -"\x3_;I:\xff|@\xfc\xe0TC\xc3\x18\xef)L\xcf\xbf\x1b\xb7\x7f\x43\xc5\xb7,\x14\x43u\xa2" -"\x80\x9c\xc5\xed\x83\x3\xa5\x81xH\xbc\xb8\xf7h\xfe\xc3pe)Q\xf2\xa3+\xf9{@\xd6~}\xea" -"\xac\x1a\xe5\xf0\xc5:\x0\xeb\x19M\xdd\xd5\x9b\xcb\xbf\xe6\xad\x9d\xb8?\xae\xe2\x36" -"\x99\x62\x92\x87\xb0\x1a%\x98\x99rIeft\xd2\r/\x8e\x66\x10-\x9e\xea\xd5\x37q\xf7\x80" -"\x15P\xa2\xc0\x31\xb0\xc8\xc3H/]\xff\x99\xbc\x5\x85{\xb4\xd7*\x98\xc7-j\x85\xdf;" -"g%\xe3+\xc6\x89\x64\xd7\x9\xc2\x6\xfe\xa7\x7f\x45\x11\"gP\xc8Q\x8b\xff\x9e\xf\xb0" -"9\x18\x80\xb3\x86\x97\xcf\xb1\xa6\x80-\x2\xec\x85u\xf7\xec\xf0u\xae\xf5\xe9\xc2>" -"Rf\xd5\xd4\xd9\xb3U\xa8\xb1\x84&\x2\x98Y\x9e\xa6M\xf6V\xc5$\xe1\\~]\xd0\x88\xa2^" -"\xf7\x85\x1b\xd4\x34M\x19\x1fX\xb9\x19x\xd8V[\x16\\),\n\xfc\x7f\x9e\xae\xe2~\xa7" -"\xcd\xa3\x9f\x9a:f\xaf?\xfb\x82\x30;\xd9=-\xbc\xb0n\x1d\x46U;\xd1\xd0i\xe7!\x4\xc7" -"\x9e|\x2\xb4\x33!B\xed\xd8[\x7fN\x93\xc\xa3\xe7\x6G\xaf/\xcaPt\xb1\xee\xec\xfd^F" -"\xc4\x96\xf3\xc0\r\xdd\x38\xed\xe9\x19\x8a/M\x8+q\x1eq&8p\x1b\x96{U\xfb\xe7o\xca" -"\xe3olk\xca\x44\xc3\xf7\xa7&D\x87\xc0-\xd2w\xb7\x99H\x9c\xbe'\xa4z\xb0\x35\x63\x42" -"\xe4Ht&\x99\x1br5=&]\xbfo[\x4RpZ\xb1\x99\xcdt\xe1\xc0\x17\xe3\x36P\xe2O\xa5\xdd\xf" -"\x7f\xc0\x32\xa8q\x19\xfb\xc8\xd0\xd3g+\xb6\xedM.V\x94\xb7Hn\x1\xf0\xf2-\x8b\xd8" -"\xbc\xaa\x84\x83\xe7\xfar+\xe\x42\xb0\xc3\r\xed\x8e\x9\xb0\x91\xa3\xdc;dt\x1fJ\xc7" -"\x7f\xbe\x34\xea\x38t\xc4\x87\xfa\x1c\x4\r\xc2\xe\x84\x66\xac%\xd3\x86,|\xdb\xcd" -"qW\x1c&\xe\xbe\xea\xcc\xde\x2\x92\xc0\x1a\xea\xedu\xe4x\x16\xe5\x9b\xe6\x31\x9b\xf3" -"\xd8^$%v!`6\xc\xd7\xd3\x89\x81\xe3+Q\xb7\xa3NK\x86\x9erv\xa5\xcb\xc3\xc9\xe6\\zN" -"\xfd'f(\xf3\xe2\xc6\x7\x0O\xcd\xa7\x98\x61y\xa9\x35\x38\x9b\x46\xc\x87\xb\xec\x64" -"\x84\xeb\xe1]\x17\xefqJ(U\x92\x97(\x94\x9c\xf4\xa3\xe3\x94\xcf\x8a\x1c\x44\x80H\xcc" -"\x98\x1dNJ\xde\x84\x9d\xda~c\x83\x88\x61\x9e\xba(x\x95\xb3\x83)\x8b\xd7x8J\xce\x34" -"\x17\x16\xbdlt9\x8\xad\x34g\xbb\xf0\x36\xc8v\x2\xa1\r?e\xdflo\x2\x1bU5;JI\x3\x4\xbd" -"\x0\xcc\xd0\xe7\x9dR\r\xf2\x18\\\x14l;%H\xa3\x85\x8b\xda~\xfc\xcc\xdd\x1\xb7\xf8" -"o\xa1\x88\xd5\xb2\x84\xd2\x8b)\x95\xd0\xdf\x35\xaa%\x9b\xea}\xa1\x92\xd2\x3!D\xd6" -"#t\xcb\x44/%\xa3\xf9\xf4\x10&\xe3\x8\xf9\xb0'\xae\xdd:\xd3\xcc\xf3MJT|,\xee~\xba" -"A\xc2,\xf7\xb9\x18\x89\xc4\xb0\x92\x19\xfa\x30\x12L.\x98\xef`\xb6\x10\xd6\x37Q\xb8" -"\xcd\x89)Y\x13\xa5\xb4\x9>C\xca\x97T?E\xae\xae\xb\x62\x31\x98\x14\x87\x37\xc8\xa6" -"\xae<\x7w\xe5w\xa0\xb6\x3Z<\xe0\x32\x61\x1f\xab\xb2XC\xfc\x1c\x82\xf2]1\xcc\x87\x94" -"\xb7w\xc7\xe4\xf8t2\x87\xa1\x33\x10\x14\xbf\x3&\xfb\xd9\x9d\x8d\xb7^\x2\xc7\x90)" -"\x85\x80\xea\xbd\xe4\n\xda\"\xf8\xb\xe5\xc3t&\xa3k\x14\xe7\x86\xc1\xef\x8f\x37\xde" -"\xa2<\xcb\xf7\x41-\x1ell\x11\x1\x1\x38\x2\xd7'\xa3x\x9e\xda-\x9c\xbd\xf8\x45\xc8" -"P\x93\xf\x82><\xa2\xd4\x87;1\x1\xd1\xb6\xc9@bq\x7U*\xea\xbaG\xb6@\x80\x43h\xe1,\xed" -"pZ\xf2\x46\xec\x33_\x91\x2O\xca\x8-\xbf\x1b\xc7M\xdd]\x93\x65s\xb7rV\xeb\xd9\xea" -"\xb5\x9b\x80v\x8b\x45\x62U\x5\xe8\xcd\x19<\xe9%\xdfNNa\xfd\xcf+\xbe\r\x83)C\xf2\xac" -"\x95\xf5\xbeH\x91\xcdXK\x19\xef\xf=\xf6\x91\x9b\xaf\xa4\xd7\x19\xfa\x13Y\xe2\xce" -"\xb5.&|>\xf3\xe9<\x6\x1bZ\x1e\xb9\xfe\x81#axO\xd7\xf\x33)\xbeyg\xccG\xd2\x34p\x6" -"\xb3\x96\x9f\x80\x9e\x91\xd9\xa7\xb5|\xdd\xe7/\xc9X\xc2\xa5%\xe1@]n\x8f\x0\x7\xf4" -"\x6\x87v\x81\x91\xd2\x1c\xac\xf3 \xffi]\xdc\xe1\xa5`\x4\n\x8f\xd3\x98\x2\"g-\xb0L" -"\x8d\x30\xb6.\x13W6S\xdb\xaa\xc2\x84\xe8\xf6>9\xfe>\xad\x86%\xa8)F\xcd\xfd\x91\x92" -"\xe\xcc+\"F}\xca\x84[\xae\xd9Iu1w\xfe\x98\xa0M_Y\xf3s\xb9\nz\xe7&\xdc\xcdT\xf2\xe6" -"\xb0<\xf1&A\xb5\x80X<\x84k*;%\x8\xf7\x8\x9b\x45\x8f\x64\xd8\x12\xbc\xf1\xc1`a7\xab" -"\x88\xe3Q\xb4\xcfl \x99\x8d\xcal\x1d'\x84\xcd\xc9\xc0\xf7(((\xe9\x31xa8\xd9\xec\xd5" -"Z\xe5\xff\x88\r)#\xbb\xc3\x84\xc1\x39\xcbP\xe7\x90\x9b\x61\x8eK9\xb\x42\xae\x9b\xe" -".f\xa5\xe4\x45?\xe9\x9d.^g\xcfz=\x8f\xc7\x86J}|\xa1;\x18\x65\x11\x1cm\xec`\xca\x36" -"\xc5\x3<\xf0\xad\xc\xa0\xd5\xec\xcd\xb8\xb5_\xec\xd6\x63P\n\x9b\x17\xf6\xd9\x1b\x9b" -"Hw3\x91\xbb\x44\x93L\x15^\xd4\x43ON\x9a\xc7\xb1NRu\xe9\xe5l9hN#\xd7\x8c\xab\x80\xbb" -"/\x10\xcbl\x17\xdd\x62\x9c\x83\xfaT\xd6\xc5\x32\xbcU\x8\x16?\xd6I.3iy\xac\x8a)y\x9c" -"\xde\xfa\xaa\x1e(bo\x1d\xbc\xec\x1b\xc9-77\x80\x8e\xa9\xc0\xa7T\xa6\x10%#V\xfa\x96" -"\xe8?7\xe7\xb7\xbf\x1b\xcf\xb9x\x8f\x34\xe0\xa1\xe8\x8e\x39\x35\x33\xaaKk\x99z\xc9" -"\xd8ofS\xc3\xc7\xfb% \r\x96\xea@-\x9c\x43\xd4haj$\xa2t\xe5\xf0\x1b$\x6\x9b\x88x~" -"I\x99\x93\x38_i\xef\x2\xce\xf1*\xc1\xbc\x36\xf8{\xb0\x1bX\xd0\xec\xbe\xd6\xf0\xce" -"n\xad\xc2\x64.iB\x96\x16\xf2\x1d\"\xe0\x30X\xfc-\xe9u}\xb6\x84\x96\xf3\x8c!*\x84" -"\xe8 \xa8\xf9z\x9c\xbf\xfa\x84\x9e\xcb\x35\\m~_{\x19\xee\x82\xf0\xfytb,\xa1:e\x82" -"\x2\x17\xd7\x4<3\x0\x6#O\x1c\x87\xbaPi\x8aZ\xa7\x19\xdb\x8f\x7f\x97\x8e\x93\x1d~" -"0Oz\xf\xbet\xbQn\xe6\x83\x32,RWu\x89|\xc7i\x7\x0\xed\xcf\x32t~\xa1Jw\xa5\x36**\x8a" -"\xa3\xca\n\xd7\x30vc\xfc\xe9R}\xb0\x8e\x1c\xf1w\xbe\x1f\x6\xae;\x9f\xfc\xb\xaa\xc6" -"\xff\x16\x65\\\xc2\xecQ-!\xd3\xc1\x8b\x43\x93\x1e;\xbb\xd8\x30\xabt\xe3\x61\xbdW" -"B\x86\xb9\xf0o\xf2\x36\xe8\x39\x10\xe8\xba\xae\xft\xa1\x9`V\x14\xfbv-x\xcf\xb5\x12" -"\xf7+)\xb\x16\x34\xd8\x1e\x6\x80{o3\x16\xd1\x86\xe1$\xe8(\x9b\x64\xae_\x1b\x41t\xed" -"\xa1\x96R\xe2lG\xfb\xbd\x1b\xda\xa2\x80LT\xa5\x1ak\xf8\xcb\xf1\x45\x93\x19\xda~\xf8" -"\xde\x45m\xed<-\xc6>\xef\xec\x63\x1d+\x1f&\xcaZ\xb\xfc\x38\x8yRQx\x13\x41\xa9\xff" -"\xaa\xfb\xae\xea<\x10\x62\xec\xf4\xbf\x94\x9e\xe3\xb2\xd6\x89\xce\xf0\xbbr\x18\x11" -"\x1b(u\xfdO_:b\x1\x84\x66\x87)\xf4\x9f\xa8\xd6\x61\xfd\xd4\x1bl\xcc\xaa\x16\xe\xd6" -"Q\xe6\xf6W\x1d\x85?'\xa0)\xa5^\x8f\x7fI\x1d\xf3\r\xc6\xa5\x97\xd7\xafi\x9`\xb2<{" -"a\x88\xcd\xae;\x81\x18\xe2\xd0\x8f\x31ot\xcf\xb9q \xd5l+\x97{W\x16\xbe\xaayDH\xd9" -"N>\xcb\xffN\x6\x34\xf7R\x86h\xdaqe\xc1p\x9dm\xd3.\x95\xb2V\xfb\n\xf1\xe\x1d\x1e\xbe" -"\x11\x1bi\xfc\xd8=r!\xbaR\xff\x65\xd2}\x96\x9f\xb5l\x82\x41\xaf\xe8>\xcb\x11@\x6" -"\xff\xfd\xf0\x9f\xb9\xb9\xe5T\xc9q\xd8\xd4*\xb1\x17\x43\xa6\x9e\xed\xaf\xbw\x12\x5" -"\xa2QP\xadh\\\xb0|\xb5\xc9\x3\x15\xa1\xa7\x8e\xd3\xcc\x95\x63\xb4\xee%\xe3\xdf\x8c" -"\x96\xa9x\x92\x16\x31\x0\x43w\xe8\x1d`>\xc6kD{\xa6\x37n\x18J\xa7Y\xf9\x15\xf7u\x18" -"9DU@\x7fR\x1d\x1d\x46\xc6x\xfd_)KY\x9c\x1a\xc7\x8f\xab\xa7o#\"\x82%\xc1}\x8d\x8f" -"*\xda\xd5_\xa5\xf1\xb5\xf0}\x81\xf3\x61SB\xa3\x94M\xe0=(sRy\xb0)\x6\xd0\x39\x94\x9d" -";\x93\xbb^\r\x2\x46Q\xd4G\xeb\xf1\x9c\xa4\xe6\x1eM\xce\x9d\x89\xf0\xa1Sjj\x9e\xe9" -"\x8d\xd8\n\xb5\xeb\x1ayRd,\xc5\xcaw\x82\xfb\x6\x9a\xa6\x9csKHJ\xdd\xd5\xc3<\xb4w" -"\xf3N\xd5\x8d\xf9\xf6+\xdd\xbd&\xbeT\xc1\xd2\x9\xc1\xca\xef\x6\x62h8\x3\x5\x13\xae" -"I\x18\x17\x10\xe5,\x16\xb4\xf7N6\xec\xac\xc2\x9e\xaa)\x96&\xc0\x87)Cl\xa1\x45\xb0" -"\xa9\x62\xd4)U[\xfd\xaf\x34\x43\xc8\xa3\xfa\x9a\xbb\xd7\xb1\x19.\xa8\x9e],\xe8\xa5" -"=\xde\x16=M\xf1y\xc6\x1e\n-rUT\xa1V\xad\xb\xc7\x5\x4\xbcr\x3^\xbd\x3[1\xc1\xe7t(" -"\x1\x91W8\xa4\x1d\x1d 0Z\x1dP`@\x3=\x1d\xa3\x7\x97\xf8\x33y\xee!\x7\x19\xa4+\xf6" -"\xa3\xe5\x12o\x15\x1bO23\xda\x8e\xcc\xd8\x88\x42#\x94\xdd\xd6\x42\xd7\x62 p\xe1." -"\x15\x16\x35\x9\xfb\x9\xc9\xaf\x92\x98\xcf\xefZL$\x95\x35\x65\x95s\xbc\xc0\xf\x9d" -"\x8b\xdc:\xff\xb\xce\x66K\xabN\xd2w\xdf\x93\xa9\x19\xed\xebZ\x11\x9c<\xb0U{\xeaK" -"G\x83\x1\x83\x15\x92\xc7\x99\x4k\xa5#\x88\x33\n\x99\xb0oI\xd7\x12\xb1\x89z\xb2\x8e" -"\xc9*\xc1\xef@\x80n\x18\x91\x7f_\"\x1z\xad\xb3\xc7\x7fS\x9cu\xe9Uii\xde\x9dM\x7f" -"|\xcd\n\x84\xff\xcd\x8d\x42\xd3\xab\xaa\xb0V\xb\x92\x9fY\xd8\xda\x45\xdd\x7\x11\x9a" -"\xa8\xf6G\xa8\x9a\x44\x62/@_\xea\xa7\xf8y\xfd\xedj\xcc\xef\xddk\xe1\xc6v\xa6y\x2" -"l\xe9\x97\xb6\xf7\xbe\xf0\xc5-)\xf7\xea\xc7`\x1bXe\x1e'\xcc\x30\x31\x8f\xa6K\xbd" -"S\xa3\x37\x41\xeb\xef#_\x97\x1b\x9d\x33\xf2\xb3#\xef\x86\xab\x45\xf3\xbd\xdf\xe1" -"\xb0\xc4\x9\x92\xd2\x63*\xe4\x35q\x95\xda\x8d\xd4\xef\x83\x10\xa6\x18KR\xa4!=\xe8" -"\xf2\xd1\xa2~\x1f\xa6\xb0\x34\xe7\xed\xb6i\xa4>b}\xe2\x4\xad\xbeJ\xa3\xad\xed\x18" -"EH\xefG}\x1e\xca=c\xb4 {\xf3\x98\x18\xe6\x15;9\xc\x3\xf\xe6\xfd\xab\xc6\xd5\x8a\xab" -"\x92\x38y\xd9\xe9\xfe\xb3\xd6\xd6\xf8=\x8a\xc6\x85J\x12\x1c\xb8\xe4\xdcP\x9e\x90" -"\xac\x87\xe0'\x80y\xfd=&~v\xdc\xfa\x83*\x99Q\xa8\x96n< \x7f\x8c`y\xa7\x11%{R\x9f" -"\x7fp\xb4\x9a\xd8}\xd1\xc6L\x8f\xc6\x84\xc6\x9c\xf6w+\xd8l\xfa\xbb\xa9Q#b\xfc\x16" -"0\x87\x46\xb4&\x85(\x86\xe2?&\x6\x9d\xa9\xb3=E\x9\xceL\x10M\n\x5Q\xc7\x0~\x14X\xa8" -"b u2p\xd0\x6\x8b\xad\xa2\x8e\xf8\xf5\x92\xef\x90\xb6\xfd\x82\xc9$\xa8s\xa4\x4\xac" -"\xbb\xe4\xbe\x33\x92\xb7\x96\xb1\x12\x98*\xab\xee\xcb\xe1\x9\xc9\xe3\xf0\xdc\xfa" -"\x97P\rZ\x1\xdc\xc\x8c\xca\xc8\xbf\xac\xfc\xf0y\r*O6\xa2t\xe4m\xf6\xfc\xae\xd9\x84" -"\x80(\xe0Y\xc6{\x1d\x99\xd3\xb6\xf0\xe9\xb7\x94Xj\x9c\xd1\x1c\x84\xf2\xbv\x5v$)?" -"36\xd5v\xd4\x8\xe\x1f\xb5\x44k\x84\xcc:\xf7\x94\x81\r\xc4\xfeP\xde\xfe\xafs\xf4\x3" -"VH\x8c\xde\xcfi\xd4\xb3\xd6\x43\xcc\xb1!\x87\xad\xeb\x44\xf5\xb3\xafY\xb6\xafg+k" -"\xb3k\xb6\x43\x89\xa9\x65u\x95\xee/\xab\r\xc2x\x7\x9c\xd0*{PI^\xb4\xe2\x15\x95m*" -"\xba\x90\xcc\x61$I3\xabX\xb0S\xf3^\xa3\xeb\xc1\xe5p\x90\x8a\xdb\xe6\xa9=ALl\x5\xc6" -"\xd5\x30\x8a\x8c\x91Wh\xa6\x64\xbe(\xdfq\x85#%\xc4\xe1\xcb\x93\xec\xf3\x8c\x43rK" -"\x98\xc2\xa0\xa4\x82\xba\"\xb0\x19\x89T\xb5\x92\xe4\xc5\x16\x6\xb8\xceRyNP\x7f\xe5" -"8\x8\x9cG.`\x8d\x14\x45{B\xbd\xa7\x15\x4\xd1\x43p\xc9\xff|\xda'\xf5\x36\xc9\x1cg" -"\xca\x98\x9d\xbf\x84\xff\x41}\xe9\x3\xce\xa6\x43\xf8G\xd7\x1aLz\xa0\xac\xcf\x8f\xe8" -"\xb9\xe3\xca\x62\x19\xe2\x1a\xb3\xb4\xd2\x99\x96\xfb;\x92\x34\x8f\xe7J\xe5\xb8\xce" -"~\xe6\x8a\x9a\xc5\xb5\xce\rr\x0\x36l\x94\xaa\xfa\x7f\xb4\n\x42\x35\x1\x95\x14\xed" -"\xd1\xcc\x62\xfd\xea\x43\x42\x8co\xec\xd2\xe2:\x1b:`=\r_\xdd\xed\"\xc9}7U\x99P\xab" -"C\xaf\xbc\x41\xb2;3V\xb5:\xf4\x35\xc1\xc\x84oe\"\xda\xe\x9M\x8d\xc8\x9d\x2\xedLE" -"\xb8r\xf5\xe6,\xad\x39N\x8a\x80\xf6W\xde\x6;\x18\x9b,(\xd6\x1f\x97\xcd$\x80\xe)p" -"x\xb3Q\xe1.\x9e\x1c\xc4\xba\x34\xe5h\xbbM\xe2\xec\xc5\x1b\xe1\xed;0\x1c\xcd\xe6\x33" -"\x99\x81U\xe\xe9\xd4V\xb2N\xce\xac\xf6#u\xcf\xa8N\x95\xb3\xbf[|.J\xcf\x1e#\xd4\xbd" -"\x9ct\xd3\x1f^\xa4\xb3\xbc\x13\xa9\x87$\x17\xa6\x15m\x9cWj\xce\xd2\x32&\x1c\x11x" -"\xf4\xec@\x95\xc9O\xf8\xd0\xe0\x9b\x12\x37T\xf7u%\x7\xde\xd1\xbao[\"\xeb\x5\xdb\x81" -"\x1c\xb3\xbc\xb6\xc2\x43\x9a?M\x91(O\xa9\x11\xc8\x15\x64\x85\x8}\x17\x1b\x42\x9\xec" -"\xd7i\xdb\x18\xd4\xfc\xc2\xea\xa8\x9d\xc3>#(\x1c=\xbbH\x81^B1g\x19\x8a\xd5\x33\xa1" -"\xe3^J\x92ri\x87]\x18\xbf.}\xaai\xdb\x8d\xa6\x8d\xc1#\x7f\x66\x35\xe7R[\x1d=\xb2" -"\xec\xdf:\xce\xf1nN8\xc1\xd5n\xb\x90 \x13\\\x13\xf3S\x91\xb3%\n\x4\xbd\xb5Qa}q-<" -"\x10g\x10\xf4\xb1\x83\x12\xd7\x42\x8cO\x94\x34\x61\x32P\xf8=\x9f\xa3RX\xb5\xe8\x0" -"\xad\xd8\x45\x98\x5\xbd\x38\xa9\xb9P{z+\xa7WS\xae\xfd`\xf7\x43\x3I\xe3\xecZ\xe2r" -"\xeeS\xa9_>\x15\x80\x18\"\x36U\x12`\xb7\xb8\x36\xe2\xd9\xa0\xb5\x9\xe4\xd3\xdb\x62" -")\x11\x38\x39\x13\x8f\xdb\xb5\x81*\x8a\xb4\r\xef\xfe\xf9\xa8\xab\x93\x92\x11\xde" -"\x8e\xcc(F\xd2\x42\xdb\x9d\xb5Q\xdc~E\x3K\xb9\x10|JRN[\x89\xac\x87\x39\xa8\xb6" -"\xd4(]\xa7\x2\n\x1e)\xe9\x95\xbf\x3\xa0\xee:\x14\x1c\"\nZ\xc3\x61\xfa\xa7\xa5h\x6" -"c\xee\xf9\xf5X\xae\xad%\x14l\xd6\xf8\xfe\xcf\x37Y\xf.\rO\x9e\x88s\xc6\x8a\x64Q\xb9" -"\x17>V\x14I\x9c\xf1\xfd\xf0\x5\xdf\x80\xcb\xb5\xc6\xe4:\xc1\xce\xb1\xa0*!\xb9\xfc" -"k\x18\xaf\xb7\x87\xd4\xb6\x86h\r\xe6\x98\xcf&\xb2\xa7T\xb\xf0\x1a\xed\x42\x17/O)" -"\x10\x38H\xb7\xf7^\xf;\xd9\xben|\x8b\xdc\xaf\x8d#\xdb\x46\xe3\xe9I\xa7k\xb0o\x15" -"X\x1a\xf1\xfc\xb6;\xb0h!y$\xd4qN^'Xh\xccnf\xe3`\x8d\xa6\xd7W!\xf7\x8bu\x14i\x98y" -"Zu\x83\xd4\x43\x1e\xd9[\xf3N\x94\xba\xa6\x8dz\x9b\x9c\x15\x12::9\xd2\x87\x8a\xce" -"\x82\xd1\x11\xbc\xc3\x93\x18Q\x2\x45=\xb6\r\xa0\xb0\xb7\x83\x90\x85\xe7\xb2&'Y\xc2" -"\xa4\x93@\x12'\xc1\x18Ze\x8c\xd6\xd7s0\xd2\xc4Xm\xa8I|\x1`\x13Ub0\nW\xf8\xb0\x9a" -"\xb4\x1b\xb0M\x8f)\xbe\x8bTYS\xa3\r\x7&q\x9f\xc6\xaf\x81#\xf3:]\xf9^Z\xec\xfe\x8" -"\x12\xe7\xe5\xa6\x7fZwk\x95\x39\xd2*\xd9\x1f\xe0\xcdwq\xa5\xef\xebs\xb9\xce\xab\x98" -"\xa5\xe5\"\xff\x62\xae\x84\x98\x44'\x3gZ\xf2\x1c\x45.\x0\x8f\x66z\x88\x46\x62\x11" -"i_\xe=\xa6\x1a\xe1;\xe6\xb3\x41\x7\x98\x45Q\x6\xc1&\x1foH\xf1\xf1\x9\x1f\xe7\x37" -"V\x5|J\xf5\xd4\xee\xed\x8f\xe0\x9c\xc0\x8e\x32~\xd0\x80\xcfM\xf2\x11#\xa6$\x8e\xa5" -":\xd9\x9d\x14\xfa\x1e\x7f\xc0\x1d\xcb\x45\x43\x3\xe5\xb0\xe3j\"th\x1d\x8a\x38\x86" -"wTA-\xc5r8\xcb\xc0\xac.\xca\x8f\x8f\xbe/\xfe\x8a\xb\x3\x83\xf3\xee\xaf\xd3{\x3\xa7" -"0G\xd7q\xc9\x8a;\x3\xab\xc4\xa4O\x89^]C\xc2X\xe5m,\xa7\xa6\x98\xd3k&\xc9\xf6\xfd" -"\x80L+\x14\xd9u\xa7\xc6\x84\xab\xdc\xb3\x91g\xf1\x5\xb9-5\xa9\x93PV>i\x13\xea\xce" -"\\lA\xd3\xeb?N\xce&\x6,U\xc1\x34w-v\xef\xca$\xd9\xfa\xaa\xe1\x33\xea\x84&\xe8hZ\xea" -"\x84\x32\x96-\x9e\xbc{\xa3\xe6L\xf9\x19\x85\xc5\x6\xed\xb7\x94l\x93\xbd\x39k?\xf0" -"\x1fw\x95\x9d@+E\x9d\xe2\xf!\xc0M\x14\x66.\xc\x31\x18\xa6)2\xfc\x2x\xd2.j\x1e\xc6" -"\xf6y\xa8\xf6h\x97\xf1\xbd\xb2gr\xb4\xb\x45m\x1a\x15\xcb\x17\x63hp\xce~N\xf\xde\xfb" -"\x80TT\xd0\xac\xa6^\x0%\xd6\xc8\xfbzH7x;\x13\x66\xc6`\xa7\x43uCl\x1d\xf9t'qg\x82" -"(\xd8\xcc\x1e/CP\x85q\x81=\x9\x34#\xe9\x31\x11\x90\x9aS\x1c\x31<\x15\xfe`\xc1\x85" -"5W\x9c\x4\x95\x12\xcf\xd3\x7n\xe8\xfa\xbf\xf2\xa9\xee\x61\xed\x8d!\x8b\xb5\xbc(\xd8" -"\xe3\x4z\xec\xe3I\xbcg]\xc7\xcd?l\xb4J\xa2\x42\x81>\xc4\xfJ\xb1`\x1c\x91\x85\xd6" -"\x1a\x31T6\x14^o\xba!\x1e{N\x86x\xcb;i\xd7\xb3\x9fG\x88\x8f\xe1\xff\ry\xb7\xb0\x16" -"u\x9au\x13\xce'\xf\x41$\xe8Zlsr\xbf\x86@$\x7\x9^\xc2\x93\x37\xcd\x10\xb2\xecX\xad" -"\x10\x44,\xfe\x10n\xb5\xa8\x36\xe4\xce\xa4\xa5\xb2\x9a\x82\xe7\xfa\xe0\xcd\xb4Tw" -"\xad\xacR\x8\x43t\xev\xe8M\x82\x8\xbb\xbb\xb7\x9d\xeam@R\xacs\xdd\xc7u\xc8\xe\xfd" -"\x6\x38\xb2\xae\xed\xb<\xf1\x17:\xd9\xa2,\x9oVk{\xa8\xc6\x94\xb6\xa0U0\xf1\xbc\xee" -"\xe8\x31U4\x92\x18\xc5\xd1\x8a\x1a}\xbb\x9d&\xe2;\xed\x7f\x84\xc7>\xbb\xf7\xe2\xde" -"\x0.\xb4i%mk\ne\xa5\xd1y\xej\xb3\xde\xdaM\xcgo\x94\x94q\xa3\xc4p\xe2v\x80\xd2\xbe" -"\x8\x8aM\x82\xd2o\x1\x7$\n=k<\xd0>p \xb\xbb\xf5+\xf9\n\xba\x31\xce%\">JV.\xbf\xb6" -"\xd4\xf7\x9a\xa3,\x13\x98R,WAR\x14\x1d/\xe6\xbf\x6\xf6\xa4^6\xfaq\x8\x91\xb4\x2/" -"\x5\xe\xfe@\x99\x7\xc\x96\x61V\xde\xa6\xe2\xf7\xaaq\xc4q\x8c\xc6\x6O\xe2\xf9\x12" -"\xccs\xb5\xc\xff\n/\x99\x99z\xb9\x9c\xf8\xb5\x1b\xbd-\xf7s\x1d:\xe8z1>\xeI\x9f,\x89" -"O\xf5:\x98\xfO\x94\x8b\x9d\x84\x12W\xab\x31\x1c\xa3\xfa\x8cg?\xe2\x2\xa6xr\x80\xea" -"\r\xeeH\xfe\xe6N(\xd0\x9e\x17R+\x9d+4]^m\x92\xffU\x13j\x9d\xab\xfc\x33J\xbb\xd4\x1" -"\x8d\x96\xc5\xd4\x82\x9f\n+\x9a\xd2]M'\x99\x81X\xcfX+\x12o\xdfRD\xe8\x92\x36.\xa6" -"\xb3\xc0@\xd1\xda\xed\x8f\x10\xddz\xcc\x6\x1fuC\x16\xf3>J3o\xb4\xda\xff\x93\xd4\xb1" -"\xce\xac\xf8\x66;\xa1\x35\xf6\xb4X\xca\xad\xe6\xa4\xf1)\xfc\x9f\xfd~\x8a)\xae\xe6" -"\xc7\xa9&9u\xb9\x98K\xc7\xc\xbc\xf5\xc7\x84\x89\xba\xa7\xaez\xa7\x16\xb\xbd\x98k" -"m\x95\xb6#\x97\x18/7\x8f\xeb\x39\xee!uA\xa4\xc1\xef\xa0\x81\xca\xa2\x39\xb1\xd1\xce" -"\xcb\x9b\x5\xca` \xb\xfc\xadu\xc5\xc8j#\xcfw\xac\xee.v\x1d\xac\x8b\xc6\xb7\xc8\xf1" -"\xb1L`\x8b\xf8|r *@\n\x83\xda\x8e=y\xae\x94\x95\xa7&V\x4 C]']\xf9\x98?\xfe\x41<\x9e" -"\xc9S(\x5\xe5\x34\xd8\x15;\xf7\x99!\xc2\n\xbd\xe6\xa5\xd9\xae\x88{ &Zb\xdb&\xf8\xa0" -"KZ\x86\x3\xaa\x87n_\x81\x13\x46\xc8\x7\x9dW\xb3\xe\x9\x66\xc5\x32\xa8\"\x92\xaa\xa5" -"1\xd6\xe0\x92;\x18\x9f\xfe\xab\x43;\x5\x9e\x8\xf\xe9\xd1\xa7\xec\x8b\x65\x2SB\x1b" -"\x8c\xe3;T\xf3|\x8d.\xc6\xba@\xcb\xb4\xe}\x85S\xb5\xb7\x15\xe7\xc5\xa5\x8a\xb8\xef" -"j&nN5a\xf1\x18)\x98\x7\x9f|\x8e\x9\x90\x8cZ\xf0\x9\xa6\x12\x65\xa6\x18#\xd4\x33\xca" -"\xe2\x8f\x14\xab\nT\x97\xc7\x7\xdd\xfe\x81'\xe3\xc1\xf0\xd1\xf3'\xf1K\xc6^\xf3\x34" -"\x96\xd3\x1d\xe2\xa3\xe4OF\xc\xec\xe5l;\xceM@)\x9a[\xf7\x46%lQ\xf9\xa9\xac\xd6\xa3" -"\x8ci\xbdK\xd3&\xdc \x8b\xdc\xb5\x80.\x7\x9e\x9e\xc0\x1b\xef\rZ\x87\xd9&I\xed\xb5" -"\x8d\x18\xc2\x14\xa2\x30\x99~\xe6\xb\x9\x9=}c\xa7LTNe/[\x9e\x8e\xd0M\xc8\xbd\x1\xf3" -"\xdb}\x89+[\x93\x1bl\x7f\xcc\x38\x80\x9b\xce\x30\x62\x8bYN\xc9\x41\xca\xcf\xde\x64" -"S\xe8\xe4\xb5<\xe1\x30\xb0j#\xa0\xf6*\xa5\\^A\xd9\xc6\x2\x1\xebN\x91\xd5\xdd\x38" -"U\xa8\x99\xbeg>\x1d|vW~\x9b\x96\x46\xd8~\xa1\xdb\x1e#\x9f\x94\ru\xa0y\x8b\xf9\x84" -"u\xbb\x8e\x32\x1a\xfe](q\xc5\"\x1f]O\xec\xdd.\xb[\xdd\xcf\x86\xc9\xbb\x65\xb7\x39" -"q~\xae\x8\xa4Z\xef\xff\x82|\xef\xcfi\x1d\xb4\xb6\xf\x7\xf7\xd8'v\x16G\x8" -"\xc1\x1f\x33\x43\x9c\xac;\xa8\xcc\xa0wR\xbc\xb4\xd9&\xf7TeZ<\x86(\xb0\x11l8\xed\x15" -"!\xcb\xa0\xb6L\xb7\x2\xaa\xd8\xa0\xcd~\xe%}\xb1\x83\xa2\n\x7\x32<\x9d/B\xd2z\xdb" -"=\x2\xa3=\x8\xd0\x88\x8f\x61\x1a\xf3\x4\xec\xb2\x8fo\xeb\xf\xf0W1\xa8Tk\xf1\xa0\x86" -"l\xe1+:\x5\xc7\xd3\xfe\xa5\x9d\x0\xdf\xfdZ\xda\xf0\x99\x1e\xdf\xc5\x1e\x8e\xdcHN" -"#\xc7\xc7Q\x85_\xdf:s>\x84\xf4\x12\x41\x5$\xecq\xf8\x1a\x8e\xc\x92Q\xddLh\"\xa8\x98" -"50W\xa6\xda\xeb.\x8e\xcbL\xe3*3K\xca\x95;6w\x88>\xb5\xf0\xb1PV=\x2\x1b\xd5\xe3\x8e" -"\xb5\x14\xce\x34\xc8\x9a\x9c\x43\n\x98g\xa4y\x0\x9cg}\xe2\x41\xe0\x64hl\xcal7^\xcc" -"\xf2O\xa1]`\x98~|\x4\xb6\xd3\xe3\x88\xc7\x8e\x16-}\x13\x9a\xe3\xf8\xbb\x36\xe1\xb5" -"\xab\x64\x16\xf3V\xfe\xf1\xbe\x1f\xa7\x88\xa4\x35Z\xd5\xfa\x90\x45%\x9eQY\x8cp\xae" -"\x1cG\xe9\x13\xda\x83\xa6\xbd\xc9\x80K\xa5\xed\x31q\x92\xe5\x18\x16\xcb\x93g\xfa" -"\x80\xfb\xe5\xb1\xd0\x42=\xfi7'd\xf\xed\xb6\xf8H\xa1\x8\xcb=\x9eK\x8cY\x93\xb4\x80" -"\x87\xc1\xf4\"M\xcbjq\xbfhr\xcc\xbf\x80\xbd\xef\x33\xf5.\xcaI\xe4?gU\x12\xaf\x9f" -"\xaa\x38\x17\xde\xaa$\xb9\xb5\x17\x8\xdb\\\x9e\xa7\x65\x33\x97\xf0I\x7f\x62\x1f\x11" -"r\xe2H\x84\x19\xf1\x82x\x82\x8cH\xd2\x84\x97\x34\xe5\xf9\xdd\xccT\xb5\xc6\x13)\x0" -"\xd4\xe8JY\xa0'\x7f\x91\x8e\xcdLS\xfe\xdc\x8d\xc1\x9e\xfj\xfaS\x81mvs\x83\xa5\xf9" -"\xf0~c\xbd\x8f\xcb\xfe\xf5<\x90Y\xc0\x63\x9c\x9b\xc1#z[\x15V\xd6\xc1)\x7\nU\xc7\xeb" -"X\xc3 p\xa3*\xe2\x93\xff\x7Q#9G\xbe\x19\xf9\x1\x10L-=\xadg\xfc\x1e\xd7n\x9f.]H\xa5" -"\xbb\"\x89\xbewLlV\xf7\x13\xc3\xd3\xfdGJ\xc9\x97P~\xfd+^\xc3\x16\xd0\xce\x9f\x1b" -"}\rQ\xdc\x83R\xc1\xd4R\xc0q6\xa8\x3\xdc%]\xec\x37\x43\xcb\x91X\xc8)\xd7\x63\xf0?" -"\x1d\x32\x3T\xdc\xd8\xaa<\xcem\xc7\xd4\xe\xcb\x15\x34U\xa4<\x11\x8\xadP\xe1<6\x6" -"fb\xad\xe\xe9\xfbz0\x93m0b\x8b\xe3\x8fqM\xbd\x97\xc4\x93\x90S\xdc\xfaK\xc5J\xd1h" -"\xc7j[\x16\xd4\xf7\x18/\xb9\x8dm\x8)\x94\x62\x9d\xb6\xf2I\xe2\x89W\x1X\x8e\xc2}\x8" -"(<\x94\xc3\xcd\xa3j\xcf&\xbf\xdd\xe#?\xd7\x1\xa3M\x83\xa5\x17_\xbc\xe8\x1f`\xb1\xe3" -"\xae\xf8T\x80\x8b\xcb\xe2\r\xec\x1d\xa5`\xfcH\xe\n_\x2\x95\x14\x1b\x98\xab\x36\xeb" -"\x17+F\xb3\x93\xd0\xa2\x7f\xd3.m\xbe\xe6\x33W\xd6\x62\x98\xfd\x15N\xce/u\xb5\x16" -"jQZ\xf4\x83G\xa4y\xa4=/4\xf5\\\xd8\xbc\x8c\xfd\x36\xd3\x1e\x63\x1cI\x11\xb9\x1c\xcf" -"\x90\xd0\x2\xe8\xbfK\xf4g\x86\x9b\x13K\xf5#i/\xc5oi\x84\x66Z\x81;\xb3\x7f\x94\xcdm\xa3\xd5Y\xa0\xd0\xed\xe6w\x19o\x9a\xfb\xf6s\xb4\x83m\xe2+\x98" -"\x8d\x92\xb7\xb4\x9a\xc1\xc(\xed\x8e\x37\x91\xfd\xbfV\xcf?-\xae\xb\xb4\x91S\xc2\xc8" -"N[\xe3g\xb0\xe\x43>S\xb2\xf2%\x15\xd0\x39\xa5\xb7\xc9\x9a\xa3\x63\x13\x97RP\"\xb9" -"\x8a\xec\x93\xc5\x13\xdc?\x88\x42w5\x91\x31\x9f\xff~'\x7\xb7\xad\xc0\xcd\xd5k\r\xbf" -"\x97sOD86%\x94\xa3\x81iC\xa5:3\xfb\x99\x8c\x17s$\xc2\xbe\xee\xdd`@k\x15\xe3\xdc\x99" -" ?\xa6\x12\x64\x33\x16\xcb\x42\n[}\xa8\xcd\xdcJ\xbbr\x85\xfdSs\x8f \xd2K\x8d\x63" -"$\xdf\xf5~\xc5\x34\xf9\x0\x9a\xf\xd9\xdb\xd4\xf4\x1dj\xdd\x9dZ\x90\xf5\x90r1\xd6" -"@\x95'n\x96\xfd\xb8\xc5\x9f\xadu9\xd4[\x97\xcf\xdes<\xbb\xa5\xdbO\x8\xab+@\xe4]\xb1" -"\x1\x42H\x11Q\xccY\x84\xe8\x96\xc\x93\xbc\xaa\x8d\x86\xb8\xe6j\xdf\x9a\xfd\xfd|O" -"\xf4\x36\xb5\xe7\x9d\x41\x31\x64hv|\xae\x64\x8f\xb\xd4\xee\xbd,:E\xc0\x8c\xcf?Xd" -"\xe1\xe2\xb3\x8c(\x84\xa2\xd2L\x81\xbc\x8a!d~\x6\xac\xfc\xfc\x63^\xc9\x8a\xa2\xf8" -"\x99\x90*HVu\xf5\x4s\xf3Zv\xe8w\xda{Iev\x91\x16\xc6\xa4\xa5\x7f\n%\xf0k\xe\xe6s\x4" -"\x93oax\xcb\xb2L~\xd0\xe0\x33\xc4\xe2\xd9\x17\xa9\xb4\xd5\xe\x66\xd2\x82ya\x89\xce" -"D\x7'\xedh\xde\x10\x96X\xce\x33sy\x8eY\xa6\xe\x46 N\x88\xe7\x97\xcd\xa8\x82\x15n" -"c\xa8\xf1\x36P\x8b\xaf\x14\xc2\x42\x92@\xa5\xaeq\xef>*\x88j\xd8\xc3\x19ic\xbb\x7" -"\xe1.\xf8\x1b\x97\x16\xfa\xea\x85\xca\xa2'3\x82\xbd\xe\x4s\xc7\x38\x6\x18\xc8\xe7" -"\x16\xf7zn\xdbs?\x82\xb9\x2I\xedy\xb0\xa0\xea\x10\xf5\x1\x9\x39\x85\x95\xb5\x8d\x90" -"\xfa\x39\xdc\x81\xca;\xd4j~\xfd\x42\xbb\x30\x1b|N\xb9\xd3\xe5\xbd\x0\xb0\xd6\x9b\n\x34" -"\x8d\xf5\xc2\x62\x45\xb0\x32\xc9\xe7\x36\r\xa5\xd6lvV\xc4\xb\xd5\x41\x44I\x96.P\x83" -"\xa4\xc8\xae\x0m\xac\xdb\xa0\xd1X! \xe1\xd3l\x5\x34\xcd\xac\x81O\xc6\x8\x12|}\x4" -"<\x13Sw[\x8cr\xfc\xd5\x96\xb2\x34\xc5{,_\x1b\xf4\x97\xfa\xc1\xfd\xe6\xfa$\x7f\x85" -"\xac\x8fS\x85~\xb9\x82:\xa4\xf4\xbe\x36*\x1c\x46\xdb\xc2\xdf\x9ai\xaf\x9eo\xcd\xa3" -"\xd7\x63\xfd\x3\xcb\xc7\xf9\xd6& \x1c\xd6\xfeR\xfK\x96`\xa5zG.Y\xf6\x39\xae\xb5\xcc" -"\x88\xa3\xcf\x94\xaf\x18:\xb6\x94\x64\x62R/`\xd7\x95\x93\xe3\xe2\xcd\xcdP\x88vb!" -"\xb]\x19=\xbf\x45q`\xfo:\x13\xb1}\xca |Q\xf6M\xc2\x1a\xd7\x93\n&&\x1a\x66\x42\x16" -"\xf3\xc4I\x6$\n\x94\xe7T\x1f\xb8\xf4\xc0n\xa3H\x15\xf0\xe5\xd1\xb1N\xe1\xc7\xf5\x82" -"yJ\xff\xaa\xf8\xe8\x1b\x43|\xba%\x8a\xa1\x42\xec\xd9\x35\x37\x93/ F\x9c\xbc\x33\\" -"S9x0\x86\xcc\xc6\xd1\\\x37I\xbS\xa4K\x1e\xb3/F[\xe1\xf5\x3=\x9e\xee\x96\x31%\x4\xdb" -"\xd0ZX\x1d\xc7\xdc?N\x90\x1d\xc1\x1e\x9c{\xe3g\xc1\x9b<\x10\xbb\xa1\xa7\x8b\xe8N" -"\xa5uH\xbczK\xa7\r\xbf~Od\xd1Y\xc\x65\xb5\xa9<\x87\x17\x1f%\x94M\xd0\xe1\xeb\xed" -"\xd4\xdb\x99(\x91\xaa\xd7\xb5\x7f%\x97 \xc6H\x93\xfd@\xc\x1a\x43\xda\xb7\xa7\x96" -"t\x7N\x86<\x8f\xe9-j@\xb2\xaf\x1dS?\xee\xc9\xae\x3~-\x92\xab\x43\xd0~\x85V\xfc\x0" -"K\xde\x9e\xfa}\xdb\xe2\\t\\\xd5@\xd5\xf4V\xb8\xec\x15\x38\xe1\xb7\xf4\xc5\x89\x12" -"WE\xea\xff\x96*\xd5\xad\xdc\xfc\x3\x42\xb2h\xe0\x30\xbc\x31\x1a\xfe&\xf7\x16\xbe" -",\x96\x35\x0#\xd3\xebL\xa2\xdc\xcd\xb9 \xc2\xccZ\x88'\xacOQ\x97\x93\xc1G\x9ej\x9" -"\xb4\x32\x4\x9c\r\x14\x9\xa9\x42\x39\x5X\xab<\xd9\n\x8cSR\xb1\x1cU\xc0\x9e\x97%\x4" -"B\x9f\xdd\x11\xf5\x2\xcfW\xcd\x84]'\x93\xa9Z\xa5\xc4\xda!\xfe \x16p\xaa\x34+C\xca" -"\xf8,D\xa5&\xc7\xb6x\x96\xf0\xc9vW\x8a\xd7\x66\xda\x10\xb8?\xe5>\x16\xfc\xa6\xa5" -"\xc\"\xcd\xe6\xa2\xb9=\xd0\x99\xbbz\"!\xf9\x0\x10\xe4\x82\x9a\xc6\x64`Y6\x19;\x98" -"\xb7\xd2\x99\x37|6[\xce\x1c\xd6\xd8R\x10sz\x1f\x15\x33\xc6\x84\xce\x33#T\x7f\x82" -"\xfe\x9e\x1a?\xfe\x9c\x97\x7\xd4\xc\x1bL+\xaew<\xdc\xb1r(\xcd\xa6\xe0\xbd\x8urX\x1c" -"\xca\xd3\x17z\xca\x5\xd6\x97\x19h\xa2\xec\"p9\xe2}s\xc8\xc5\x90\x16\xaat\x8f\x93" -"\x81\x9f\x39\x61\xee\xd0\xdb_\xd0\xe6T!\xa3\x87\x11m_\x8f\x92\x37\x94J\xe1\xb5%\x95" -"a\x1b\xdfq\xa5\xbe\xf8\xd7\xdc\x62j\x17\x8d\xc5\x39\n\xaf\x1c\xf3gK\xb2t^\xa1\x8" -"\xc7\x32rJfyfa.:b\x9d\x9a\x89U'\xb\xa4\xaa\x1b\x32l\xf0\xee\x9a\x14\x96Lm\"\xb8S" -"\xe3\x96q\xb8\x82\x5\x45X\xe3\xebr\xf0\x1b@\xe8\x83\xb7\xe5\x87\x15\xba\xcbWo\x9d" -"<\x9fuK\xb2\x11\xa6\x81\x87\x99\x34z\xc8mu\x1a&\x15 \x8a\x42&\x7f\xc\x8a\x63\x9c" -"\x8cW0\x90\x62\x1c\xbc\xc8\xb1\x87\xc9h\xef\x30\x9f;@\x8b\n\xe2U9\xd6\x84,V%\xe6" -"\xf8\xbe\xa0~\xe0\x3\xea\xf0\x7{\x82S\x1cYE-~_}\xb1\xe1\xfd\x1b\x1b\xf1/\xb5\x34" -"w\xb4Q.\x1f\xec\xe3\x9bp[\xaah\xbc\xb\x84\xb3\xee\xa4\xdc\xc\n\xeb\x9d@Nq\xcc\xad" -"\xf0'Z\xbdK\xd2\xb3+_I=O\x93\x96\x8\x81\x2H\xf5\xb1{]\xcc\x38[\xe7g|B\x2\xb1\xa7" -"\x1e\xf2\xe7\xd6\xdcL\xd8\xef\xe1\xb2\xfb\xear\x1\xbc\x32\xd5&\x3\xd9\x39\xa7.Z\x7f" -"x\x12o%7,\xeb\xce\x94\xf\x31\xa7o\x8b\x8a\xfd\"\xf9\xd8\xbc\xb\xf0\xa4\xdd,\xb0\x38" -"\xb8\x1\x18\x10Z+C?\xd5\xcd\xe9\x18\x93\xd2\xf0\x13\xc3T!\x8c\x1b\x64\x64\r\xac\x35" -"\x9a\xe1G\xd7\xfe\x4`$\x95\xd3\n%\x8d\xe1\xfa\x1a\x32\x0\xe3O+\r\xc4\x34s\xf\x65" -"\xed\xaf\xf0s\xae\x36\xfa\xde\xed\xe7q\xcdxm\xf9H\x6\xe8\xd5\xeb\xe5^\x9\x2\ng\x9d" -"\xd0\xf5\xe1Ua\xbfoa\xa9k\x1a\x11\xf6M\xbc\xe5\x88\xa7\xba\xad\xcc,\x7`\xbd\xf4\x92" -"N\xcf\x5|\xb3\x34y\xe5nW\x89\x62{\xe0\x9c\xd5mgN\x12\xd1\x39\x94\x82Q\x82\xbaO\xb7" -"\"f\\;`\xba\xcd\xaf\xa9\xc8\n\xc9\xd7\x93\x15>\x99{P`\xbf\xd5\xf7=6\xc0;\xc2M\xd3" -"\x8d-\xce\x1b\xfdy\xb6*\xd6\x13\xbaT\x8e\xbc\xf3\xab\x6\xc3?B\xd7g\"\xf6\xeb\x5h" -"\x0\x9b\xa3\xa5ZO\x94$\xf3\xaf\x64\xa6\xf0\x7f\x63\x2\xde\x9cK\xed\x18>m\xf6\x8a" -"\x1d\xfa\x8cYU\xee\x38\x1b\xe5[#c\xfc\xdc\xe5\xcb\x99\xda\xe6O\xa5}@1\\*\x7f\xc3" -"\xcd#2U\x15\xcd\xc2(Yvr\xcf\xfU\xc6w\xd6\x2w9d\xd2\x6\xb8&c1\xccG\x6\xc9\x82\x3\x30" -"\xef\xd8\xf4%\xb1\x1e$\xd8\xe5\n\xfaKP(\x81\x1d\xea\xef$\xee=\x5\x1.\x94\x1a=K\xc4" -"\x96\\\x9b\xa7\xbbT\xfd\x93>\xae\xb6Ptp/yJy\x18\x1b\x8\x32\x3\xd1\xbc\xc4\x32\xe6" -"\xdb@^'\x9\xc4\xfc\xb6\x84\xf7\x8e-Ug\xbc\x7\x9fs\xe8\xb9\xc7l:<'\xef\xb2O\xa1\xe2" -"\x8f\x10\xfc\x0\x97\xe1\xa7\x9d\x7L0\xfb\x88\xd4\xe0rm\x10\xd0\xe4\x88Jep\x14\xf5" -"\xe8\xf2\xe7u\x80\xac\xb4\x41\xbd\xf5\xcd\x89\xd3\xc3\xb8\x8f\x9dw/nP\x98\n~ob\x81" -"\x94\xad\xf6\x91\xaa\x31T\x99\xe0\xc7\x19\x15\n\xee\x3\xe8:\x8a\x39\xa6\xd6\x86\x1d" -"\xd0\x34W'3\xb1Y#.F\xad\xa8?\xc7^\x9f\x15\xdb\xc0\xf5\xd3w\xa7\xf3\xd5%W\x8fv\xc5i\xbe\x80\xceR\x15" -"\xa9J\xbc\x7\xce\xc7$\xb0m'\xca\n \xe9xe\xdb\x44\xd2\xf2\x38N\xad\xaa\x19\xfd\"\x1a" -"\x7f\xf0U\x89$\x8\x15OX\xf9\x1e`\xbb\x65\nH\xbf\xcf\x1b\xe6\x81XaYL[\x9b\xc3\x8b" -"B\xd4h\xe8\xbb\x38n\x85q\xc5\xd6t\xe3\x16\x45\x96\x91_\xf/\xfd\x9\rQ\xdd\xfb\x0\x88" -"\xf6$x_\xba`H\x9a\n\xb0\xaf\x19\xed\x91|I\xc7\xd4\xb5\xb4\xb2\x95\xdbx\x3\xb8\x46" -"\xf0\xf3P\x84\xfa\xd8'T\xfe|\x94\x8e\xba\x35\xf9$\xef\x10\x93\xfb\xc2\xb8\xb1+\x4" -"\xf1\xf6\xca t\xaayi\x17 \xac\xb1\xcb\x99\x8dvC@\xce\x95yR\x83\x99\xe8k\xd0\xfb\x94" -"m'\xd0\xeb,\xe3\x96\x9b\x86}5\xa4\x66\xf7\xa9\xf3\x4x\xb1\x9c\x13\x9d\x33\xe7\x9d" -"!\xc3,\xb\x84u$\xfc\x18\\h\xf5r\x86?\xff\x97\xcc\x45\x8\xcb\xdc\x45\x8\xe5\"\x36" -"\xe\xba\xf8\x7f\xe8\x98\x84\xfb\xb2\xaf\x33>\xda:|-\x6\xf3\xdf\x6~.\xeb\xa5\x13\x1f" -"\xa3\x86=\xd4\xf7)d-\xbdk\xc4\xa4\xaf\x63\xf7N\x96\xbe\xc5T\xb7\xeb\xe2s\xdf\x30" -"u\xb4:v\xeeG\xd2h\xbd(\xd6\xa2\xfe*AS%d\r\x85\xa1o\xfd\x84l\x3l\xf4[\xb6\x66\xf0" -"\xd7[\x86\x8f\x91\x35\x83\xb4\x9fJ'\xdc\x8e-[3\x90q\x7\xde\xc0\xa2u\xff\xe3\xcf\x9b" -"&M\xe1\xad\xf7\xd8\x8e\x61\xa2\x9d\x9d]roK\x9en?\xe6\x18\x98p\x11'" -"\x10\x94\xc5\xd5\x64\x66\x9dT\xc5\xe8\xe8\xa6\x37\x8f\xcd\x66S\xe7SH\xfaX\nr\xda" -"\xb\xb5\xe2\\\x0\xa8_G\xbd\xbc\x64\xe8\xeaoV\r3O\xfb\x8e\xdd&\xd1\xa5\x8f\x2\xb6" -"2;\xb5\"\xf3\xf\xf7\\\x82\x92\xe7\x91\x9b\x0\x89\xed\x83\xae\xbe\xba\xafM\xb2\xce" -"\xec\x84\x10z\x9eWl\xe1\" Y\x82l\xed\xc3\xa1%\xbb\x4\xda\x8b`J%)\\\xa2\xb7\xb4\xf1" -"\xca\x13!\x87\x90\xe1\xc3}/T\x82\x99\xb0\x62-F\x8e\x82\x13\xd2\xe>\r\nZ\x8f\x9a\x15" -"@\xad\xfe\x38~eO\x80/\x83\x90\xf4[QC\xeb\x19m\xf5\xf\x4\x4W\xf8\x8e,\xbe\xae\xaa" -"\xfaRS\x2\xd0,$\xaf\x12ZX\xca\x99\xc\xbe\xed%\xe7\x2@h\x1b\x18\x95:H\xaf\xf4\xf4" -"A\x96\x61j\xe5Q\xd8\x35\xceG^\xa4\x63,\x1\x90,\x9b\xef\x99\xc1\x3~\xbf\xeb\x8c\x88" -"\xefQ\x19R\xd4+\xdb\x1e\xe2\x1;\x15`5\xcb\xd9L\"\xe2)\x19\x98\x1b\xa2\x7\x1b\xf\xaa" -"\xa6l\xf4\x36\x9fU\xcd\xb6_C\x8c\xe2\xb1~\xf5\xf7\xe3\"\xa8\xb0\x65Hj\xcc\xe>c\x88" -"\xae\xde\x9f\xcd\x85\x9y\xb.is\xc6\x65KWg#\xd6\xd0\xb5\xd7\x86\xa8\xd5\x9b\xed\x30" -"FI+\xe9\x89\xef\xc8]\xc2\xdb\x98\x37(d<%\x1\xab\x8a\x80Rv\xba\x1>-\x19\xbav\xde\x16" -".\xa5_\xa3\xa1\xcdWI\\n\xd0\xbb\xa4\xe9\xf8I'\xd9@)\x8e\xa6\xdd\xa4\xce\xba\\\x96" -"\x12\x8e\\\x9d\xbak\xf1\xa7\x30\xd6\xbd\xa2M\x8a\xeb\x8f\xf7\x46\x85\xe4W\xdd\xe" -"\xef=}<\xa1:\"\xd5\xe9\x9c\xf1^i\x8\xc3\xa6\xf6g7\xba~}\xcb \xc7\xa3uO\x1e\xed\xe4" -"\xf4\xc5\x91\xcb\x80LN\xc3\x93,\x8\xdc\xa5\x83\xbfy^O\x91\x99Kk\xcd\xb3\xc6gP\x1e" -"\xb3+)\xdeJ\xe9\xdb\x85\xe4Z\xb9\xcas\xf3\x8a\x15v\x98\xca\xed\x62\xc4\x81\xad<_" -"Z\x8M>=\xec\xcc\x8c\xe1 \xa1\xd0\xef\xfa\xa1\xd2\xfb\xfa\x14\x64\xafz6\x93\xcf\xe6" -"\xf7\x8b\x38<\x9f\x8c\x15\xf7\x92\x80L\x8c\x32\xaf\x13\xbf\x1a\xdb\x1f+o\x98\xb7" -".m\xbc\xf4\xe1Z.CE>\xbe\x65\xd3\x9\xaf\xe8\x65\xf\xb2\x30\xcf\x43\xde\x61#\x88#\x99" -"oD\x1e\xbf\roE\xc6(\x90)&]\x18\xcc\xd8\x9d\xcaK\x18\xc6\x45\x45k|J\xfy\"\xc3\x8c" -"\xa2\xa8\x30\x97\xa1\x64\x30\x62\x35@y\x19/\xc5\x8e+t\xbd\xd2\x6\x1G4K9`<\x94\xa9" -"\x2\x34M\xd5\x9a\x35;\x83`Nz\x16KjQ\xfb\x11\x86\xb1%\xder95c\x81\x1c?\xa9^\xa0\xd5" -"F[\x85w\xb8w\xa9*\xad\xfe\xb9\xfd\xfc\x11\x96U\x8c\xefR\xa1\xe6\x90\x1by\xcfz\xed" -"|\xc1\xa9\xd8\xa1\xe7\xa5\x1e\x85\xf4\xa6\x3\xec\xc5\xeb\xf7\x90\xcd\x39\xec\xa9" -"\xc2.\xe1\xa5\xf3\x87\x63/\x9a\x10\x0\xe2^\xda\xef\x9\xaf\x62\xfa\x1\x7\x63&\xea" -"\x1aM\x1e\xa7z\x9f\xb8|\xc2\xda\x1d\x98\xba]\xb9\x9b| \xc\x13\x11GH\xabu\x8b\x31" -"\x83W\xaaX\xec\x1f\x13@]\x1c\x63\xa7\xfbH\xbf\x0\xb7\x9d\x66\x39\xc8\xc7uf\x14\xa9" -"2\xc5\x93\xf0S\x88\xb0\xee{\xec\xff\x99\x82\x13\xf4\xeei\xe8Qie\x1d\x86\xa5\x3Tw" -"\x9a-\xc0\x44\x6\x17\x9bV\xd1\xce\x36\xceUa-5\x16-\x9d\xed\xf3(~\xec\xf1p-]w\x1a" -"\x97\xc0\x8a \xd4J\xc9\xd3\xbc\xcf\xbe\xc1Z\x9f\xbc\x94\x9f\x82\xb4\xdfP\xd9um\xe7" -"\x11\x9b\xdd\xb5\x90\x16\xb\xb2\xb3\x30U\xdc\xb5\xfd]\xedN\n\xf4 \xf0\x8e\x91\xb4" -"\x10\x0\x87\x83\x8f&\xa3\xca(\xf3l\x7/\xbf\xc5\x15\x9a\x4\xae\x11\xe2\xb5\xbe\\\xad" -"\xfe\x36\x37p\x9a\x9\xb2\x35\xc\xb1\xc5k\xb4J\xa5\xaf\x8bP\x80-\xa9\xfe\x9cxC\xf8" -"3G\xce\x1b$\x88\x1c\xa2\xee\xfb\x11\xbc\xc2\x19\xb4-\x8fj:\xcc\x9e\xcf}\x10\x42p" -">\xe1\x5\xf0\xef\xd5\x65\x98\xf4v\x1f\x1a\xb5\x41\x61\xccR\x19\xfa\xad\xfd\x41\xba" -"\xd4\xd4\xda\x0\x91S\xb3\x89\x8esz\xd9\x1e\x85\x19\xf2g\xc8\xff\xcf\x92P\x9c\xc8" -"\x1fI\n``\xb?\xa3\xe8\xba\x66\xa3/x\xb9\x32\x93~\xbf\x8\xa5\xa3{\xd2\x36!\xb9\xa3" -"\x0\x31\xc6\xc5\xf3\xe7\xc0o\xfe\x8f\x64\xad\x89\xa3m\xfb\x86\x34\xe3\xb9\"\x9a\x62" -"\xefv\xd4\x42\xae\xf4\x4\x63Q\xd8\xab\xc3\xa4\xd7\x9a\x44\xf\x88(\xf7\xc5\x1f\x91" -"#\xa6Ndh\xa9IA\xa4\x66\xa5\x1d^|\x93\xe8\x44\x82\xc4\x1c\xb7N\xbb\x80\xe9\xf4.\xdc" -",\xeb_\xfe\x94G\xab\xf3\x38kf5\x9f\xb\xb3\xe8j \xd3\x90\x8b\xe3\xae\x9f\xca?\xbc" -"V\xb3\x3\xa3\x35%\xd4\x4\x3\xb0\x18\x9cO\x17\xca\x94`\xa1RA!(\xab\xee\xab\xe1L\xceX\x15" -"\xd1M\xc5\xff\x9c\x8c\xfd\xd9\x33l\xc8\xd4X/\x8f[0pV\x4\xa2\x9c\x5\xc3\x3\x9fu\x1" -"\xdd\xff\xf5\xe5\xd0?\xa5\x8c\xbf=x\xf5\xe9\xce\rm{\x15\x1f\xe1\x64\x83\xb\x0t\x90" -"E\x13k\x6\x41\x96Q\xd9\xef\x9e\xe0/@t\xb9&\xe1p\x92\x43\x9c\x82\x35\xde\xd6\xee\xa3" -"\xfc\"\xff\xf9\x8e\xb1\xf4/\xde\x8f\x37<\xf2;\xb2p\xae\x1c.<\x9f\x33\xd8\xfa\x82" -"Os\xe3|'\xef\x8d\xe2\xf5\x8f\xa6M\xa7\x32y\xed\xb7\xf8<'\x98\x0i}\xe7\xbb\xc0\xf0" -"\xf1\xe7\xc9\xec\xe2\xd7\xfc'\x8fM\x4\\\xe4/\xdb\x61\x85ZS^\nJJZ\xfa\xec\xc1I\xd1" -"\xe0\xc7\x95\xbg@d\xbdVx%j\xdb\x31\xcb\xab\xf2\x33]-\xa3\x37\xae\xb7\xb8\x1a\xad" -"\x82\xcdM\xbb\x15\xf0q\x1e\xa9\xc\xaa?\x9c\x65\xcd-;\n\x85\xaa\xa8\x63\xfb\x81t\xad" -"\n\xe\x42\x38\xb3\x30\xc9T/\x6\xf2\xdb\x87nz[\xb3\x19\x95\x8\x66\xdd\x32Z)\x80v\xb2" -"I\xa1_\xb9#\x8f\xce\x14\xa5g/dQT\xac\\R\x89\xde\x85\x42moB\xf2\xbe\xd5\xa9y\\\xab" -"\x1e\xd7\x9c\r\xb5\xd9\x85y\xf3\x30\xe0X\x8b\x1\x63\xf8\x31\x1c\xc9Y\x86\x81\xe8" -"\xdfg\xa4\xd1\xef\x45-`Ur\x97\xa7\xdd\xe4\xcb\x63\xbc\x65\x35T\x9b\xdf\xfft^ !<\x84" -"\xe7\xde\xe5\xcd\x18\xe4\xd7\xe2$D\xf9\xd5\x81\x1f\xfJ^\xff\x99\xa9\x1c\x1e\x8b%" -"\x14N\x1dg\x7f\xa4\xa4>\xca\x11\xf\xa7\x87#\xa8[\xaa \xef\xde\xfe\xc1 {&\xf3\xb\xda" -"!\xab\x8c\x8a\xd7,\xac\xaf\xae\x81@\xbf\x96[^\xc6\xf4oI\r\xe3\xff\xe3\x1e\x8d\xd5" -"\xdeK*\xf6-\xfc\x66\x6\xfe\xde\xf1\xf2\x8d\xe9\xcd\x18\x1c\xc3\xa8;\x86UN\xd3\x5" -"\xee<\x8d\x0\x37\xe9J*V\xda<\x89\xca\x92\x9am\xeb\x8xq\x7\x0\x82\x94\xf6I \x88\xd7" -"\xa3\x92\xbfiE*\xfd\x42\xc2X\xe0\xfaL8\xab\xc8\xfa\xc2\xb4\rh\x99\xc2T=Y\xe1\xbf" -"h\x1\xc5\xa6,\xd3\x9\xea\xd2\x8a\x38\x62\xbf\xecT\x87i\xf0\x1f\x93\xa1\xa4\xd5\x93" -"p\x92\x10y\x1d\x93#\x1\x14K\xb\xa2\xc7\x8a\xf7k\x86\xf8zag\xa1\xc0\x92\xd7\x86\xfc" -"5\x96\xe9\x8a\x13\xec\xde\xb9K\xec\x96\x10~d\xf6\xdd\x91\x8am\xf9=Ry\xea\xea)\xfd" -"[\xb8\xca$|\xb1\xa1\xd8\x85\x8b\xa9\x84\x7f\x34\x90\x8\x9b@\x17\xb7\x66\x45\xe4L" -"\xdb\xc6\x9f\x42\xe8\xeb|\x6\xcf\xca\xe9\xe8*\x81I\xaa\xc5_\xf7\xb8u\xa0\xc0\x45" -"\xf8\xcct7\xb4r\xe5%\x12\x94\xdbH\xfat\xd8\x92w\xb7@\x9b\x1d\x86\x9e\xb2\xe6{-\x6" -"\xa1Y\xe1\xce\xec\xe2\xdb\xfe\x18\xfc\x88\xb1~X\xb7tQ\x15$\xdd\xb4\x2;8\x7f\xe\xb3" -"\xc2\n\xe6`\x91.\xac<&b\x8b\xa0\x65'\x97\x19#\xae\xd2\xf9\xe6\x8c?~xC:s}e0\xf2(\xad" -"M\xc6Hl\xf0\xa9I<\xdd\xc1\xef\x36\x45\xef\xc4o\xc9P\x87\xdf\xba\x9d[5\xc6\x99\x9e" -"\xfa\x9b\xbb\xcfQ\xc9\xcd\xeX\x3\x14 \\\xe5Q\xe9\x1f}\x10\x99\xde\xb3\x2\xad\x80" -"+;\xd1\x8f\x11\x37\xb2\xec\xb~[$/P\xdb\xa4O\xff\x19\x45\x17\x93\x3\x9a\x82t\xe0/" -"\xf9=\x18\x5\xc3\x34\x32}\xa1h\xc9\xc3\x32?p\xec\x32\x8e\x18\xdf\xc3!\x2\xd0\x33" -"\xad\x4y\x9e\xb9\xf1\xbe\xf1V\"m\xd1\xec\xa8\xb2\xc1? \x8aq\xc0\x8e.8\xbf\x16\xf6" -"$\xaf%>\xf0.\x80-b\xc1\x37K\xfb\xd2\xb0\xe5\x9d\xe5\xb7\x45H\x19\x15\x87\xe2h\x1c" -"\xac]\xa1\xaa\x66\x99oUX]\xff\x10>\x8b\x7f\xab\x85y\x1d\xb1\xe3*\xbcn\xfe\x10\n\x83" -"\x89\xbf\x9e\xd3\x41\x8f\xaa\xb9\xfc{\xd2\xfd\x38\xa5\xa0\x8c;K\x80PA\xd8\xdb\xe7" -"\xe8)\xb5\x84\xc7\xa9\x46\x41\x43R\xb3\xd2*\xe4\x7\xb5\x43\xbe\xe4~\x17j\xcf\xe5" -"\xb2`\xfb\xf6\xaa\xddK}\xda\x45\\\xaeR\x12\xa2r\xfe\xa8)\xfb\x31\xed\xb8\xb9\xb0" -"k\xbe\x95\x64\x1d\xd8\x37\x95\xa2\x65\x14\xfc\x17\xd4yx\xce\xfe\xa5\xf3\x1a&\x17" -"\x8d\x8c\x17\x5\xaf\x43\xc8UY\\\xc8\"\x61\xb8\x7\x8e\x62\xf1y\xb9M\x86\x39\xd5#\xbf" -"\x9\x1d\x83\xa9\xec\x66\x8b\xb\x8 \xa7-\x1f\x9e>\xad\x31I\x86\xe2j\xa8\x39min\x1a" -"\xd7\x43\x91\x36\xc4\x89\"\xa6\x41\x62Q3s\xf3s\x5\x18y\xb2\x8f\x92\xf3(\xfe@M\xc8" -"\xa3\x9b\xc0\xb8\x41\x8b\xce\x7\x32\xee~vF/\xb\x41Z\xa7K\xc3\x41\x41\xe3\xa3\xea" -"+\x19j\x8d}\x80\xeb\xb\xcfn\xa7=\r@/<\xaf\xc7z\xed\xd2\x89\xf9\x11* \xc1\x45U\"\xbd" -"\xc6:\xcc\"$8\x96\xf7}]\xb3X\x9d\x32\xb0'\xc1\x84+7\xfe\xb5\xdd\xfd\xa4\x1b\xf0\xa7" -"\xf2}*'\xfb\xac\xb2\x9b\x94\x87\x30r\x18\xae!LW\xb1\xc4&\xa5\xdc\x7f\x6\xcf\xe1\xa0" -"\x92\x30I\xd6I\xf4\xf6\x1d\xd0\x14\x32u\xbd\xf4\x18\xbc\xc7\x30\\\xa5\x66\xa1\xbc" -"EE\xe9\xb2\x1f\x85=\x9\xb6\xf4\xee\xe4\xb1M\xa3\xe4\xb|\xe2\x2\xf5(/g\x9e\xbf\xcc" -"[\x88\xd2W\x91\x30\x6\x84V\xe1\xdd\xc3\xe\xf6\xf3\xa0\x92mH\xb6=\xaaK\x2\x95\x16" -"\xb3\xc4\xe2\x15\x18.@\xa6\xcb\xde\x98(.\x10!f\xf0\xf7\x15\xfe\xe6q\x84\x17\xa9." -"Q8\xab\x80?#y\xa2W3$\xc7\xf5hX\xf4@\xcd@\x1\xf8\xfakL\x94\xe\xe7\xc3\x32\xd8-\n\x15" -"K\xe5\xdd\xdb\xdd\xd7\xcf\xf6\x88:\x2GO~\xad\xd1\xab\xa4\xfa\xdc*+\xb6X*{JG\x8dq" -"\xcc\xe1\x63\xca\xd5r\x89\xdd\xe7\xa0\x10\xc8\x9b\x90w\xea\x94\x84L\xce\x98\xa9\x91" -"63N\xbd\xf2\x63\xb2\xd0W\xfb\xf1\x9d\x98!\n\x8c\xf5\x85\xa2\x41_\xc6\xbf\xe9&\xeb" -"\xc5\xd3\xb1\xf6\x34-\xcc\x35\xbe\xb2\x43;]Q\x9fR\x82{\r\x88XP\xc0\xca\x39\xf2\x83" -"\xfc\x33\xa1\xf\x18\xc4l[\xbcm5T\xde_I3P\xde\x87:3i \x99]\x91\xe2jT\xfc\x8d\x9c\x9e" -"\x1ay>8\x9a\xb9>\"X\x7f\xc8\x39\x61\x81O\x8f\x37\xb2w\xd5[\xc3N\xa6\x30i*B\xfd\xc4" -"\x95\r\x1b\x41 \x10\\\xc6\xb8lf-i\x7\x31\x0g\x1c\xaao\xe0\x33<\xfc\x11`&\xda\x37" -"\x5\xcd\xad\nJ=\xe7\x7f(\x5\x1aw~\xbd\xd7xf9C?\xbd\x16\xa2\xfcI\x5\";\xfa|\xcf\xe6" -"\xbd\x93\x43\x98\x8fi\xd1\xc7\x9d+\x18\xb7$\x81m\xb0\xe\x86~\x8c\xc7\xf3\xc2|\xea" -"\xb8\x81\xea\x46\xb1\x4\xf6\x33\x98\xcc\x35qBd\x8c\xe1\xae(\x9bh\xeb\xfd\xdd\xff" -"I6\x1e\xd3k\x8a\x96\x8c\x3\xa1\xc1\xed\x1ev\x95\xc0\xd6\ru\x16\x7f\x80V\x1\x34n\xce" -"\xd5M\xb6\xe6za\x96\x43\xf3Ns\xe\x93\xfb\xa2\xda\x33\xc5Ql\x95\xe6\x2\xd9\x46\x89" -"+\xb5\n|\x1\xc9\x9c\xba\x63\xc2\xe0\x8d\xb1\xc2\x9e\x35\xeeZQ\xb0:\x1v\xae,\xbf\xe0" -"\xd3\xe4\xb0\x2\x43\xb3W\xa5\xaa\xda\x86\x9a\xdaK\xa3LA\x1c\"\xb1\x35\xf4\x2\x88" -"\x86\xdak`\xcb\x10\x9\x89\x1b\xf1<%\xf2w\xa4Y\xabv\x14\xe4<\xaf\xcdL\x1a\xc3\x14" -")\\S\xf4t\xc0\x9d\x38\x10\xc6\x65\x39\xe1\xedyN\x80\x9aV\xfe*9\xbc\x9b#VSu\xf7\xc4" -"\x99\xc1\x3\xce[\x8d\x94!\xc8jJ}\x9;\xb0\xa7\x61P\xcf\xeatR\x1\x37]Y\xb6u\x7\xc3" -">\xb1\x11\x46wv\x81\xb4[q!\"\x9a\x87>\xeeG\x80\x8e\x8f\xf1\xff\xf8?\xdbJ\x95\xd6" -"`\xb4\xa6\xa6\xb9\x7uct\xfa\xb\x97M\xa1x\x6\xcQ.\xe1\xad\x97\x86\x16\xe2V5\x9b\xaa" -"\x1c\x41\x17G\x98\x84z\xed\\\xdf\xe6\x8a\xad\xf2\xa7%JO\xa6,\xb0\xe7\x12xz%uv\xc5" -"'&$ \x82\xc4\xa1t\x96\x17\x63\xb\rirD+\xc2\xeaOUF\xd8\x31\xd4\xbe\x5\xc7\xb1\x43" -"\xc9l\xe9\x66[9$\x86\xe1\x99\xf7\xc*n\xe4[\xab\x9a\x17~\x90R#\x8a\xce\xa1\xbe\x45" -"a\x8a\xe3\x1e\x81\x32u\xcVf\xbc\x9f\x33\xfe\xa6\x31\x62\x1f\x3\xf9\x37?\x19\xa7\xdf" -"_7o\xd3\xcdjF\x11\xb2\x65\x8d\x41\x8b\x99\x36\x16\xce\xd1\x96\x95\xc1Us\xdcm\xd4" -"\xaf\xd0(\xff\xc1\x9b)}/\x9doG[\xe1\x83\x34\x44TRmb\xb4r\xdb\x43\x13Rs\x9b\xb0\xf9" -"Ye\xc7\x1f\x8f.P\xc0oV\xcL\xf8\x42_\xd0\xa0\xd9\x41\x2\x9b\xe6\x36\x10\x38\x19Y\xc9" -"\xfa|\xf0\x98\x44l\xc/\xde\xa8\xc4\x39n\xc$q\"h\x8e\x3zc\x7\r\xb0xD\xc5\xdcN?B\xf2" -"X\x86\x88#\x92\x94\xaf\xe2\x1c>2\xd2{\x9e\xb2\x2\xc\x90\x8e@o\x1b\x34\xb8\x94}U~" -"v\xc7\xb7\x15'\xep\x7\xb8\xcb\x39\xb4\xf6\x11Z\xdc\x1d\xaf\x46\x10\xbcL\x85\xe2\xea" -"\xdc\x0i@\xda~\xb0\xef\xed\xba\xaa\x14(A\xb0(jkws\xfdg\x0SI\x1#l\xec[\xe4\xbd\x18" -"\xe3\x11\x12\xea\x8b_u\x10\x17\xe\xe4#\x96<\xf1\x3\x82\xd3\xe0U>\xb\xe9?\x88J\xbd" -"\x1=2\xd3\xf9\xa4\x62\xceq\x3^M\x89\xdcl\x1Z\xa2~\xbd\xf7\xeb\x2~\xfe\r-#\xc6\xb7" -"\x12\x8a\x86\xf2\x18Sa\xe8l\xbb\x16\xcc?\x1a*\xbe\xf5\xd0\xcc\xe1y*\xb4\xca\xf8%" -"\xc4\x97\xc6\x87\x30\xbe\xec\x85\x1c\xec\x65\x9a\xe6g\xd3\xd2\x85\xee\x7w+\xc5p\x95" -"\x7f\xfe;\xabH\x0\x83\x88\x81\x9f\xb9\x98\x88\xf\xe3\xb2\x14\xb4\x12\x1bv\x82\r\xe9" -"w\xbb\xab\xa1\x11\x85\x32\xbdl\xa0\xb0,\xca\x17\x92S\xf5\xf4`Zf\xd9*\x94\"\xeb\x8c" -"\xc3\xe3\xe5\xb5\x8b\xfa\x8\xb1\x82\x41\x42\x2\x1b\x18\x13\x85q1g\x9f\x46\xa4_\\" -"\xbc\xd3\xc4\xf8#O\xe6#y\xfb=*:{9\xef\x62\x36?N%#\xc1sr7\xcf\xf1\x17\xa6\xedp\x9" -"\xee\xfo\xd8j\xb9\xa8\x66\xcf\xda\x33\r\xf1<\xf7=&g\xe7J\xf6\x18\xce\x46\x99=\x87" -"\xd6P\x7f\xb4%L\xa2\x37w\xf\x63\x39%\xba\xf\xc1\xb8\xc8\xb3\xbe\xd3\x31p^\x82\x17" -"\xdd(3\xc7\xff<\xf5\x1\xb1\xea\xc2G\xbd\x9dZ$iz\xd6\xa4\xf1\xba\xc5\xcd\xe7\x87\x36" -"'\xdb(\xe4\xfa\x42<8\xb8\x32\xae\xb6\x34\xd6\x83I14\xee\xd9\xd5@\x9e\xdc\x39\xb4" -"+\x97\x8a_\xe\xa7\xb\n\x8e\x9dl\xea\x46\x16\xf5\x9e\xd4n\x95,\x14\xc3Tl\xbeL\xbe" -"\x11v\xda\xddQ\xe7\x31\x11l\xb5\xf4G\xa7y\x17\xbe\x1e\x92\x18\xf9#\xd7JPh\x90%\xdc" -"Zs\xa8?\x13T;c\x1a\x64S\xe6\x88\x99\xd7T\xb4\x32\x91\xe3H\xefQ%r\xd7\xc5_\xe2\x2" -"e\xb9\x30G\xdf\x1a\x16\xa8q{ \xda\x96i\xcb\xbf\x9b\x95\x12\x45\xbe\x83\x92\x89\xab" -"3\xccKV@\xed\xd7\x92=\x13\xd4\x63\xda\xfc\x16\xfe\x39\xda\xc\xb4\r\xbf\x2\xed\xb5" -"\xb0H\xfal\xe5\x14\x46\xa8J\xd6\x97\x85@\x8d\xf0O\x4\xc9\xb7v\x5\x84\x9a\xa6\x43" -"\x80\x1d\xafQV\x92\x9b\xb9\x34I\xfcU\x1a\x85\x1f\xa5&\x92ST\xedp\xd9\x15\x19\xd0" -"\x9\x82\x6\xa0,\x1a\xef!\xce\xef\x83\xa2\x1b\xe8<|\x99-\x81J9\xef\xbd\xb5\"\x83\xe6" -"\x2Z$g\xe8S\xa8\x9e\xfNk\xb3\x30s\xf6\xe9\xee\x9c\x46\xe9\x31\xd3\xcb\x9f\xe0\x83" -"\xd0?P.}\xbf \x8c.\xbe\xde\xf0t\x6\xb2\x2\x86\x8c_'o\x9f\x44W\x99\x2\x41\xb2'\xb9" -"\x16\x32\x9c\x90\xb8R52\xc4\xb7\xb9\xdfm(\x89\xd9\xc4\xca\xe6\x18?\xc4\x99\x63\xfb" -"\xc0\x1b\x14V\xbe\x30\xb1\x44`\xc6\x14\x14\x17R\xf6x\xa1\x91\xc4\xfa\x87\x8e\xe7" -"N\xc0\xf4\x2\xa3Y\xdb\xa6\xf5\xfO\xd1\x91\xdf\\\xb2!\xf9\xd8\x16\xa7\x12<\xa7=\xbc" -"\x8a\xde\xdc\xdb\xe9SIn\xdc\xb0\x7f\x18\x9d\xb\xbb\x15\x9a\x7fL\xa7\xeaJ\xae\xf6" -"\x83R\xa5\x41\xad\x43!\xf2\x33\xc0\x92\xca[\xb0\x41\x9c\xa1U\x83\xae\xd9\xfd\xf4" -"b\n\x1f\x1f\x81\xe9\x4\\\x18#\x18\xbb\xd8\x1f\x89\xdd\xb8\x1e\xec\x65\xad\xe3\xbc" -".:\xee\x38G\xb7\xbb\x8\xda\x38w\xef\x80\x9mlP\x94k\x1\x4\x82,PsL\x92\xe0\x5\xfc}" -"\xbf\xccw\x96\x9a\xad\x7ux9Z\x99\x33\xc1\x7f\x64\xa9\xbf\xae\x10\xd6\xf4[\\AF\xbe" -"O\x88S\x8b\x8b\xbe\x96\x7\x84\x8d\xef\xe0\xbdP\xc7\x98kKf\xc5@\xd8\x45\x37~E\xfe" -"\xeb\x1fQL\xdf\xbc\xabq\x90?ht\xb7u\x9e\x15\r\xdc\x8b\x91\xd5\x9\x13\x62\x8c\\\x89" -"G\x95Hvk\x85\xef\x8d\r\xe2\x88R,[\xa7\xa5\xa7\xd8\xd6X:L\xab>\x15\xe9\x41\xd1\\\x9a" -"0z\xd7\xe1\xa8\x8aJv\xdf\x36t<\xe5g\xfaO\xc4\x99\x33\x3\xaf\xdf=\x86+\x89\x46=\xc7" -"\xa5\xbc=a\xc3\xe7\xba\x30O\xf3WS\xc2\xa2r\xc1G\xdb\x42\x9d;\x12\x45\xe0\x3\xe3\xa9" -"\xb7@\x2\\\x32\xd2\x91\xd9\x93\x44P\xcbK\x9f\xeb\x7f\xde\x46\xb4\xa2\x81\xaa\xbf" -"\x4\xealDTCOn\x3\x14\xb2\x30\x1\xc5x\xc0\xb4m}r]o!o\x8d\xe1\xe0\xf1\ri\x14\xf\xb3" -"\xbe\xd2\xb9\x43V\xfe\xbe\xcbX\xa9\x61\xce\x82\xd9g\x13\xdc\xcc\x64\xa7h^\x88\x43" -"\xf6\r _\x8e\x42\x8a!\xfb})\xfa;\xfe\x6\xb9\x95~\xfc\xe1\xf7\n\xc4;\xb1\xd4u\x1f" -"\xfe\xc2\x13\xd5\\KLC\xea\x46\xc6xB\xfci\xb6\xc7\x97\x7P\xdfZH\xdejn\xb5\x34\xb|" -"\xa9]1\x90|\xae$\x11\x16\xaf\xd0\x83:Y1n\x8f\xe1\xcfV,\x9dTu\xaf\xdd\x46\x1a\xba" -"\x19p\xf8\xcc\xec\xb1\xe1\xba\xe2\xa8\x64\xe1\xb4\xdf\x8b\x61\xfd\xed\x89\x87X\x4" -"\xedN[\xb3\xf1\x9\x9cI\x3^\xf3Z6\x2\"\xb9\x97\x33\x86\xcf\x98\x16\x9e\x7f\xed\xa4" -"\xc9h5\x8d\x1\x97K^+\x99\xf2\x8e\r\xbc\x14\x88:Zu\xa1\xbd\xb6\x66\xb2\"\xf4\x65\x61" -" \xf8\xe2\xf4\x9b>\x96\x61|I\x98+\xb6Q\xf8\xdeS'\x81\xfa\x7fU\xa0\xe6\x3\x91!\x14" -"\x12\x95\x42\x7f]\xe8\x4\x8f\x17\x61\xc3\x80\x1bS\x87\x33\xd4)\xe2\xdc\x9\x14\x34" -"\xeb\xd3t)\x14\x45\"ZQ \xe\xdbZ;$\xbb`(z\x1Ufz\xf2uPj\x1b\xef\xa0\xe3\x46XF\\\xf3" -"\xbb\xb1\xbd" -"\xf9\x95\x64w\xfa.\xfc.\xbf\x17\xc3vKW\x1f\xd8\xc1\x8c\x81\xde\xe5\x45\xe6\x41\x9e" -"\xd4\xd7X\x82\xeez2N\xb2\x16{\xae\x32V\xed\x45\xb2%\xebU\xd8\xefT\xac\\&D\xa6\x37" -"\xe9+\x91HM\x8d\x85\x7f\x66h\x15\x86\x35\xb7)U\xd4\xfa\xc3\xa9Y7yB)\xdb\xb5\\$\xf2" -"+\xf7Z\xbc\x61\xbb\xf\xcf\x1e\xef\x13L\x86\x1e\xa1;\xf\x33\xbc\x11\xf3P\xd0\x9c\x84" -"\x7L\xf3\xab\x83\xc\x62\xa3\xc5Z\x1\x9f\xa3Q\xef|\xb8\xe4\x1f\x31\xf4\x33\x1fZ\x97" -"\xd5?\xcaI\x82\xe2Z\xb3\xbc\xac\xa4\x9d\xab\x9c*3\x4RJ(\xe2\xb9\x10\xe0\xb8\x92." -"4_Z\xe9\x96\xa7\xed\xf7\xf9\x80\xbb\x39s3#\xe2\x44\xfe\x98\xc6\x8a\x8b\xf2j\x9dz" -"\xa9\xe8\x15\xa5\xc3<>%\xabG\x7f=\x15\x91\xba\xd5\xf5`,\x97~\xf5\x33\xc7\x6I4\xfb" -"S\xb\xac\x7f\xbd\xbb\xa2\xf0\x30k86\xfd~\x14\xe\xf5W\xeb\xde\xef\x1eQ\x15u\x9K\x86" -"K3^\xbe\xfeSZ\x1c\x35\x3\xd6\x1a\xbb\x85)\xee\xfa\x13_\xe7\x33+]0]r\xf8\x1d\xb4\xa2" -"V\n\xe1va:\xbd=v\xcey\x11\x31\\\x7f\xfc\xd0r\xf2\x36s\x8b\x39\xfa\njj\xd8Q0d+\xf9" -"[\xe1\xdf/\xeck\x92\x42\x36N\x87\xb6&\xd4\xf2VwU\xe1\x5\xa7\xf0N\xd5\xe4.\xe4\xbb" -"\xe2\x81k\xbd\xb3\xb9iu\xf2\xbe\xbb^\xde\xb1\xc4K\xa9\xab\x42\x32\xa8\x8d\xab\xca" -"\x92n\xbaq\x12\x9d\x66\xb0\xba\xa0)\xe3O%\x1b\x8c.\xa8J\xd8+\xd3\x66j\xaa\x5\x9e" -"\xd7L\xc2\xbc\xedK\xcf\x1\xee\xbd\xb5\xbb\x97\xa4\x9\x97\xe8\x42\xa1\x36\x63;\xf4" -"]\x83\xec\xa6 \x7\x9e\xeb\x65\x14\xda\xa3X\x99\x8a\xe2\x88,\xab\x98\xcf\xf\x9e\xbc" -"[\xc4\xa9\x7\xc6\xb8v\xfc\xa2\x8c\x98\x38\xbe\xc6\xc\xe1\x93u\xf8\x36\xa1,\x1aq\x82" -"b\xa2RC\xc3\xd8I\x8\x32\x41\xf2\xef\xc1\x1f}\xfd\xf4\xc\x80\xe4QJ\xc\x8bR+N\x3n\x95" -"n+\xffv[q\xe\xfb\x8fw\xce\x7\xee,\xa3{%\xf3\xd3H\xb4\x4\xef\xac\x94I\x15\xe5(\x6" -"\xc2\xf5\x32\xc5G\xef\x65\xe9k\x9).\x0\xe5\x8c\x83\xc6\xd1\xd6\xa5SDQ8\xe7\x41\xf5" -"\xfa\x17\x63\x8c\xe7\x11X'\xe3\xca\x3\xf0J\xc2\x15\x18,@\xf0P\xf5\x64\x11\xd4L\x9d" -"\xa2lNE\x86\x3\xc3%\xf6\xb2\xbe\xb7T\x15\xa1\x33;?f(\x8e\x1b\x65\x66\xa9|Y\xa1\xeb" -"1\x9c\xb0\xa5\x34\x89\xd4\x86\x96\x9cI\x9a\xa4p\x3\xb\x8T\xd6\xe5\x1f\x99\xcc\xa6" -"I\x84\xac\xba\x94\x90\xbf\x9d\x0\xb5\x1b\x64\x14\xdc\xef\x8fpnr\xbc\xedm\x94\xa5" -"\x8e\x1c]\x94N\x99\xd2\xfd\xc5\x8f\x97\xa7\x97RU5U\xd8\xcb\x4\xf9\xc7\x9cw\xd9\n" -"\x93\xe2\x7 \x0n\xc4\x61`\xde\x1f\x11\xeds\x1a\xcb\xed\x64x\xed\xfb]\xbf\x92'\n\xd1" -"\xf6\xb3\xd4\xa1\xb9\xbf;\xb2M@\xe7\xcc\x86\x8a\xbb,\xe5\xb2\xc1\x45\x30\xa8\xf8" -"3\x80\x8e\xe0\x5K\x16\xb0ZL\x93\xf3\xa8\xec\x9f\x1b\x41P\xf9\x8e\xfd\xb1.\xa7\xda" -"\xe3\x63\xc0\x9fXB85\xd0v\x8bT\xb4\x46Q\xf8\xaf\x15\x61\xb5&\x4\x9d\x18\xd5\x9eP" -"|~\xdf\x17\x9a\xe4\xe4\xdaSU\"\xcd\x9b\x1c\xf0\xd9\x0\x2\xa3x\\E\xdc\xc1te\x1bn\x1f" -"\xbdo_\xa1\x1a\xdb\x6\xaa\xdcV\x94]A\x11v\xad\x98{0\xa0\xf5\x37\x35\xab\xf6\x46\xc3" -"\n\xe9\x97\xa0\xc3M\xf\xf5z>De\xdbTE\x95\xd1\xea\x95)\x1l\x85\x65\xce\x32U\xef\r" -"\xca$\x93=\x5\xff^6j\xaf\xaeR\xdd\xc0\xfe\xcb\xcb\x18=C\x11\x8e\xd3\r=\x90p6k\xc6" -"^\xcd{\xfb\x82s\x9d\xde\xe9\xd9\x91\x19\xd8@\xdc\x16\xba\x11\xe0\xdd\xa5\xd7\x8e" -"w\x1\xe\xd8\x38\x12\xd5\x91\x98\x88V\x8d\xe4\x1f\xcf\xbf\x81\xca\x19\x1J\xcc\r\x10" -"\xf\xdc>\xa5`\xb5+U\xc4!\x1c\\\xad\x64\x18\xd2i\x2\x1dN\xfc\x90\x42P\x4PV\x81\xe2" -"\xa5\x13\xe7\xfd\x63\xb9,,\xaa\x2\xdeO\x2znl\xdd\xccy\x85\x83\xca\xe\x9c\x7\xc7z" -"\x4\x93 \xff\xcc\x42\x98\xd6\xf6\xd7\xddY\x85?\xe5\xe7\xe\x7\xbb\x5\x35\xd4\xf3\x94" -"\x1e\xd4\xe7M\x90\xa0\xc0x\xfc\xa5\x5\xdes\xb3\xa9\x95\xda\xcc\xa2:\xde\x2\x15\xdf" -")M\xc4\\n\xe4\xac\xe0\x88\x1c\x1b\xa3\x85}\xb5\x7f\x34\xc1\x8c\xb7V7\xbf\x10\xff" -"j09\xd9\xc8\x11\x80\x91\x8c|P\xac\x5\x93\x16\xcf\xfb\x61\x4\xe0\xbc\x84\x93Z\xb3" -"\xc5\xbcGj\x19\"\xa3\x98\x99\xb\x64(\xa7!\x1c\xc2\x90~\x9d\xfd\xeck\xf8\xb3U\xf6" -">\x0\xae\x81\x9d\x17\x1c\xfau\x1b-\x84+\xde\x61\xc2\x90\xc2X\xb9\xbb\xd7\x1\xde|" -"VF7\x1c\x1d\x9b\x10\xc5+^\xda\x15\x99.\x8c\x11_\x92k\xb8:\x81\xe7\xcR\xe6\x63\x1c" -"O\x8e\xba\x8f\xa6\x88\x41\xcb\x8ev3_a\x6" -"\xa9\xab\x18\xfe\x4pf\x97\x18\xd4\xfb\xfa\x99=\xffmK\xd8s\xfd\xa4MVHv\xf0\x81z\x9d" -"\\\xf4!E\x7f\xb4G\xf\xcd\xa3Q\xfd\x81\xa5KI\xa4U%`?[\xa2\xb6\x87]\xa5:\xf6\x9d\xd1" -"\xd0{_\xd8g?\xcd\x35\xe0\xb1\x38\x42\x8a\x95\xd2\x45\xa5\x93\xbc?\x99\x19\xf0\xf9" -"\x83\x80\xe6\xa0\xf4:\xc6\xd0\xb4%\xea\xbe}m\x7f\x9d\xbf\xd8\xdb\x8b\x19\xe1R\xf3" -"QC?\xe3\xb1\x4&\xccy\xdf\x8e\xab\x18#6M\xae?\x11\xc7\x97\x89'\xe9'4\xe0:\xbd\xac" -"S\xf1\xc3\xe8\x9a\xd8\xf9\xe8\xe1\xaa\x0\xc5\xbd\xb\xde\xa2\x12\xe7vQZ\xb6\xdb\x81" -"\x9d*\xe2\xbb\x9aK'\xa5\xfa\xd8\x85\xce\xa4\xc4\x87\x35\x98\x11p\x89\x13\xc1\x80" -"\xe4\xd3L\x9aI\x3\xfd\x96P\x94\xb6\x44:\x7f\x36\x99&\xd6|\x87\xcd\xa6?\xe0\xcbJ\xe2" -"3\x88Q\xb3\xa5X\x10.\xfc\xfb\xf2\x62\xf7&YBp\xca\x96\x34Q.\xc8\xa6\xf3\x87\x39\xec" -"nB\xbb\xee\x46\x13\xeaK5\xc5\x5\x19T\x11\xb#e\xf7\xd9\xe2\xc0'\xfd\xb9\x82v\xfe'" -"\x97\xcd\xc0\x6\x1QI\x85S\xfcY\xc7V\x92\xe1U\xe8\xf3\xbf\xac\xc8\xf1\x98\xd9\x8b" -"\xf8\x31\xc3\xe7\xefou!\xb7\xa6\xa6M\xa8\x42\xd5w\x9c\xd5,v\xa7\xfd\xa2'\xad\xdc" -"\xf1\xa1-\xb8\x7f\x82\xeb:Ea0%#e\xf4\x42\x17\\v\r1\xa3\xc\x44!\x86\xb6\x39?\xce\x1a" -"fl\x0\xde|\xc1\xe4\x41\x7f\x31\x11\x9\x93\x66\xf2\x93\x19\x1c\xe2W\xea\xe4\x91\x46" -"\x84\xb3tq\xca\x96\x1c\xb3\xdeH\xa6S<\xda\x42N\xd7\x35\xfd[\x83\xa3*\xc0\x61\xcf" -"=lhE<\xe6\x38\xff\xaci\x8e\x9a\xb7o\xb6x`\xe2\xb7\x30\x9a\x92H\xf7\xfe\x10\xc1O\x17" -"\xe8\xeag\xe\x44\xcc~\xf2\xa8\x81\x17\x62\xe9\xa6?!'\xc2\xffS)8\xcf\xecR\x98\xe7" -"x\xa3R\xf9\xc7\xdf/\x17\x94\xf6`\\\xbe\x63\x8d\x9a\xfb)l\x7fR\xc\xaf\xd3U\xe3\x94" -"\xe3\x91\x9a`\x7f::\xad\xa4\xc8\x93\xbk\xf6\xeb\xaa\xb\x91\xe8\x38\xdfSJ\x87\x7\x32" -"\x3^\x95:O\x15N\xc2\xe0\xddq7\xe5\xb\x7\x38\xcf\x97\xc0,\x88\xcb\xf7.\xccT\xb1\xad" -"\xee\xfa\xbf\x97\xd0\x32\x44\xb4\xb6Vv\xcb\x9$\xc6\x41\xc\x11~t|\xf9\xce\xeb.\xb3" -"\x1b'\x80\xbf\xf1\xe&\xf\xbb\x8a}[;D\xca\xf9\xe7[d\x82\xc5k\xee,h\xf9\xf8g^\x9e\x15" -"k\xdc\xd9\x93Y\xa7@\xa6h\xfd;\xd1\x1e\xa9\xd4\xef\xeb\x1b\x9c%\xe7 +3\xf5%=\xe8y" -"\xa4\x82\xffw\x99,\xc8w\xf0x\xd1\xf0p\xb5\x41G?\x82R\xe3O\xa9\xce%RQCM\xce\xc0\x46" -"\xb3N/\xd3\xbdP@\xd0\x8e\xf1\x89\xad\xcc\x31\x44\x1a\x18\x95\x10\xe1\x8d\xce\x97" -"\xbb<\xee\xba\x7f\x5\xae\xa7\x1\xda\x1f\xd9\xff\x84\xe1\x61\x89\xbb\x91\xf9=\xea" -"S\xa6\xb0\xc\xc4\xe3\x93\xcc}\xc7\xfe\xb8\x5\xe5\xd3Q-e\x8d/1\x9b\x39\x18\xdf}\xed" -"~\x88\xa5:\xaa\xe3\x81\xe1(\xf\x65_\x7\xe1\x97\xd6\x97\xdb-\xd7\r\"\xa8\x8d\x9f\x9" -"\x2\x83V\x94\xfc*\x10\x31\x8f\x34\xdc%\xa7>dR\xc8M\xa1\x61\x39\xd7)\x1d\x8d\xb\x9d" -"\xb8\x63\xed\x8c\xaa\x8e\xc2\x94\xea\xc2\xe3\x87\xf1l\x8e\x38\xf0\x42\xf\xd7\x9f" -"\xb9\x16\x13\xacj\x84\xbd\x32qP\xe6.I\x14\xf7\x1a=\xa1\x9a\x38\x98\xe6$\xd2\xea\xb0" -"\xd2\xe1\xd2~Xa\xae\xbe\xc4@\x8\x9bK\xed\xfc\xb3\xef\x89\xe4\xa5(N\x9e\xcd\xdd\x11" -"\xf7\xc3\x9bv[\xb9\xe1\x36\x97\xe5&\x19\xf0\xf7\xeb\x92@d8\xae\xcc\xe\xbf\xda\xc9" -"S\xfd\xfa\xb6h9\xe7\x97\x9e\x98\xce\x16\x1bS\xe2}\xda*m\x93\x1c\xa9@'\xc6\xc9_\xca" -"\xb8\x9c@f\xb0\x9\xd3\xb0\xfa\xb4\xedVzafh\xf0\x1e[y\n(\x86\xec\x37,\xf7\x8d\xa1" -"\xfc\x34\x19\xce\x33\x30\xff^\xaf\x8cx\xc2\xdf\x9a\x2.s\x1f|0\xf5\x99\xd7\xc5\xd3" -"R\x80V\xef\xde\x87W\xbd@r\xa8\x97<\xcc\xf8\x17\x45U\x9d\xf\x91\x9a^\x9b\xe3r\xe5" -"yx\x89\xb4\xcaj\xed`\n\x84[\x5\x1\x81@ft\x1e\xf7\x83\xdb\xb1P/j\xbc\xab*A2\xf9}\xe8" -"\xda\x83&\xbeIP\xf1h\xc1\xd5\x9aYL\x87i\x11@2\\\xcb\xecNN\x8d*\xce\xe6.;\xd6\xd1" -"Q\xb7\xbao\xbd\x98\x39`hc\x99TLS\x8b\x31\r\xc} \xb6\xfbn\x86\x9eQ1y9\xc6l\xf7o4\x8f" -"`R\xb0N\xa1\xf1\xa2\\?p\xb1\x1d\xa8\xa9)\x88\x1en\x4P\xab\x17\xc1" -"\x12YS]\xd6\x90\xbe\x86\x15*?\r?\xbd\x31\xfa\xc9\xa2\xeb\x34\x63\xceL\xea!@N\x90" -"\xb3\x94\xeV\xa4\xc9uI\x84\x11\x12\x93H\x6\xbf+c\x82\x34 \xea<\xb5\x9c\xfbi\x8f\xac" -"P\xf4\xe\x7f\x14\xc4\x45ww\xa6\xee\x8e\xe4\xf1$(e\x18\x87\xd9\xd4\xf3\x37\x95\x65" -"\xe0\xdd\xb5Y\xe5O\x10\x13L%#h1sz\x88\x5L\n\x17;\xcdp5\x18\x93\x9f-\x2r\x16+\xce" -"A6\x15&\xc1\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" -"000000000000000000000000000000000000000000000000000\r000000000000000000000000000" -"0000000000000000000000000000000000000\r00000000000000000000000000000000000000000" -"00000000000000000000000\r0000000000000000000000000000000000000000000000000000000" -"000000000\r0000000000000000000000000000000000000000000000000000000000000000\r000" -"0000000000000000000000000000000000000000000000000000000000000\r00000000000000000" -"00000000000000000000000000000000000000000000000\r0000000000000000000000000000000" -"000000000000000000000000000000000\rcleartomark\n\x80\x3" -; -int n021023l_afm_len = 31920; -char* n021023l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusRomNo9L-Reg" -"uItal\nFullName Nimbus Roman No9 L Regular Italic\nFamilyName Nimbus Roman No9 L" -"\nWeight Regular\nItalicAngle -15.0\nIsFixedPitch false\nUnderlinePosition -100\n" -"UnderlineThickness 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ De" -"sign & Development\nEncodingScheme AdobeStandardEncoding\nFontBBox -169 -270 101" -"0 924\nCapHeight 653\nXHeight 432\nDescender -205\nAscender 683\nStartCharMetric" -"s 316\nC 32 ; WX 250 ; N space ; B 125 0 125 0 ;\nC 33 ; WX 333 ; N exclam ; B 3" -"9 -11 302 667 ;\nC 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ;\nC 35 ; WX 500" -" ; N numbersign ; B 2 0 540 676 ;\nC 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ;" -"\nC 37 ; WX 833 ; N percent ; B 79 -13 790 676 ;\nC 38 ; WX 778 ; N ampersand ; " -"B 76 -18 723 666 ;\nC 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ;\nC 40 ; W" -"X 333 ; N parenleft ; B 42 -181 315 669 ;\nC 41 ; WX 333 ; N parenright ; B 16 -" -"180 289 669 ;\nC 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ;\nC 43 ; WX 675 ;" -" N plus ; B 86 0 590 506 ;\nC 44 ; WX 250 ; N comma ; B -4 -129 135 101 ;\nC 45 " -"; WX 333 ; N hyphen ; B 49 192 282 255 ;\nC 46 ; WX 250 ; N period ; B 27 -11 13" -"8 100 ;\nC 47 ; WX 278 ; N slash ; B -65 -18 386 666 ;\nC 48 ; WX 500 ; N zero ;" -" B 32 -7 497 676 ;\nC 49 ; WX 500 ; N one ; B 49 0 409 676 ;\nC 50 ; WX 500 ; N " -"two ; B 12 0 452 676 ;\nC 51 ; WX 500 ; N three ; B 15 -7 466 676 ;\nC 52 ; WX 5" -"00 ; N four ; B 1 0 479 676 ;\nC 53 ; WX 500 ; N five ; B 15 -7 491 666 ;\nC 54 " -"; WX 500 ; N six ; B 30 -7 521 686 ;\nC 55 ; WX 500 ; N seven ; B 75 -8 537 666 " -";\nC 56 ; WX 500 ; N eight ; B 30 -7 493 676 ;\nC 57 ; WX 500 ; N nine ; B 23 -1" -"7 492 676 ;\nC 58 ; WX 333 ; N colon ; B 50 -11 261 441 ;\nC 59 ; WX 333 ; N sem" -"icolon ; B 27 -129 261 441 ;\nC 60 ; WX 675 ; N less ; B 84 -10 592 516 ;\nC 61 " -"; WX 675 ; N equal ; B 86 120 590 386 ;\nC 62 ; WX 675 ; N greater ; B 84 -10 59" -"2 516 ;\nC 63 ; WX 500 ; N question ; B 132 -12 472 664 ;\nC 64 ; WX 920 ; N at " -"; B 118 -18 806 666 ;\nC 65 ; WX 611 ; N A ; B -51 0 564 668 ;\nC 66 ; WX 611 ; " -"N B ; B -8 0 588 653 ;\nC 67 ; WX 667 ; N C ; B 66 -18 689 666 ;\nC 68 ; WX 722 " -"; N D ; B -8 0 700 653 ;\nC 69 ; WX 611 ; N E ; B -1 0 634 653 ;\nC 70 ; WX 611 " -"; N F ; B 8 0 645 653 ;\nC 71 ; WX 722 ; N G ; B 52 -18 722 666 ;\nC 72 ; WX 722" -" ; N H ; B -8 0 767 653 ;\nC 73 ; WX 333 ; N I ; B -8 0 384 653 ;\nC 74 ; WX 444" -" ; N J ; B -6 -18 491 653 ;\nC 75 ; WX 667 ; N K ; B 7 0 722 653 ;\nC 76 ; WX 55" -"6 ; N L ; B -8 0 559 653 ;\nC 77 ; WX 833 ; N M ; B -18 0 873 653 ;\nC 78 ; WX 6" -"67 ; N N ; B -20 -15 727 653 ;\nC 79 ; WX 722 ; N O ; B 60 -18 706 666 ;\nC 80 ;" -" WX 611 ; N P ; B 0 0 605 653 ;\nC 81 ; WX 722 ; N Q ; B 59 -183 699 666 ;\nC 82" -" ; WX 611 ; N R ; B -13 0 588 653 ;\nC 83 ; WX 500 ; N S ; B 17 -18 508 667 ;\nC" -" 84 ; WX 556 ; N T ; B 59 0 633 653 ;\nC 85 ; WX 722 ; N U ; B 102 -18 765 653 ;" -"\nC 86 ; WX 611 ; N V ; B 76 -18 688 653 ;\nC 87 ; WX 833 ; N W ; B 71 -18 906 6" -"53 ;\nC 88 ; WX 611 ; N X ; B -29 0 655 653 ;\nC 89 ; WX 556 ; N Y ; B 78 0 633 " -"653 ;\nC 90 ; WX 556 ; N Z ; B -6 0 606 653 ;\nC 91 ; WX 389 ; N bracketleft ; B" -" 21 -153 391 663 ;\nC 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ;\nC 93 ; WX" -" 389 ; N bracketright ; B 12 -153 382 663 ;\nC 94 ; WX 422 ; N asciicircum ; B 0" -" 301 422 666 ;\nC 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;\nC 96 ; WX 333" -" ; N quoteleft ; B 171 436 310 666 ;\nC 97 ; WX 500 ; N a ; B 17 -11 476 441 ;\n" -"C 98 ; WX 500 ; N b ; B 23 -11 473 683 ;\nC 99 ; WX 444 ; N c ; B 30 -11 425 441" -" ;\nC 100 ; WX 500 ; N d ; B 15 -13 527 683 ;\nC 101 ; WX 444 ; N e ; B 31 -11 4" -"12 441 ;\nC 102 ; WX 278 ; N f ; B -147 -207 424 678 ;\nC 103 ; WX 500 ; N g ; B" -" 8 -206 472 441 ;\nC 104 ; WX 500 ; N h ; B 19 -9 478 683 ;\nC 105 ; WX 278 ; N " -"i ; B 49 -11 264 654 ;\nC 106 ; WX 278 ; N j ; B -124 -207 276 654 ;\nC 107 ; WX" -" 444 ; N k ; B 14 -11 461 683 ;\nC 108 ; WX 278 ; N l ; B 40 -11 279 683 ;\nC 10" -"9 ; WX 722 ; N m ; B 12 -9 704 441 ;\nC 110 ; WX 500 ; N n ; B 14 -9 474 441 ;\n" -"C 111 ; WX 500 ; N o ; B 27 -11 468 441 ;\nC 112 ; WX 500 ; N p ; B -75 -205 469" -" 442 ;\nC 113 ; WX 500 ; N q ; B 25 -209 483 441 ;\nC 114 ; WX 389 ; N r ; B 45 " -"0 412 441 ;\nC 115 ; WX 389 ; N s ; B 16 -13 366 442 ;\nC 116 ; WX 278 ; N t ; B" -" 37 -11 296 546 ;\nC 117 ; WX 500 ; N u ; B 42 -11 475 441 ;\nC 118 ; WX 444 ; N" -" v ; B 21 -18 426 441 ;\nC 119 ; WX 667 ; N w ; B 16 -18 648 441 ;\nC 120 ; WX 4" -"44 ; N x ; B -27 -11 447 441 ;\nC 121 ; WX 444 ; N y ; B -24 -206 426 441 ;\nC 1" -"22 ; WX 389 ; N z ; B -2 -81 380 428 ;\nC 123 ; WX 400 ; N braceleft ; B 51 -177" -" 407 687 ;\nC 124 ; WX 275 ; N bar ; B 105 -18 171 666 ;\nC 125 ; WX 400 ; N bra" -"ceright ; B -7 -177 349 687 ;\nC 126 ; WX 541 ; N asciitilde ; B 40 186 502 320 " -";\nC 161 ; WX 389 ; N exclamdown ; B 59 -205 321 474 ;\nC 162 ; WX 500 ; N cent " -"; B 77 -143 472 560 ;\nC 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ;\nC 164 ; " -"WX 167 ; N fraction ; B -169 -10 337 676 ;\nC 165 ; WX 500 ; N yen ; B 27 0 603 " -"653 ;\nC 166 ; WX 500 ; N florin ; B 25 -182 507 682 ;\nC 167 ; WX 500 ; N secti" -"on ; B 53 -162 461 666 ;\nC 168 ; WX 500 ; N currency ; B -22 53 522 597 ;\nC 16" -"9 ; WX 214 ; N quotesingle ; B 132 421 241 666 ;\nC 170 ; WX 556 ; N quotedbllef" -"t ; B 166 436 514 666 ;\nC 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ;\nC" -" 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ;\nC 173 ; WX 333 ; N guilsing" -"lright ; B 52 37 282 403 ;\nC 174 ; WX 500 ; N fi ; B -141 -207 481 681 ;\nC 175" -" ; WX 500 ; N fl ; B -141 -204 518 682 ;\nC 177 ; WX 500 ; N endash ; B -6 197 5" -"05 243 ;\nC 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ;\nC 179 ; WX 500 ; N d" -"aggerdbl ; B 22 -143 491 666 ;\nC 180 ; WX 250 ; N periodcentered ; B 70 199 181" -" 310 ;\nC 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ;\nC 183 ; WX 350 ; N b" -"ullet ; B 40 191 310 461 ;\nC 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 10" -"1 ;\nC 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ;\nC 186 ; WX 556 ; N q" -"uotedblright ; B 151 436 499 666 ;\nC 187 ; WX 500 ; N guillemotright ; B 55 37 " -"447 403 ;\nC 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ;\nC 189 ; WX 1000 ; N" -" perthousand ; B 25 -19 1010 706 ;\nC 191 ; WX 500 ; N questiondown ; B 28 -205 " -"367 473 ;\nC 193 ; WX 333 ; N grave ; B 121 492 311 664 ;\nC 194 ; WX 333 ; N ac" -"ute ; B 180 494 403 664 ;\nC 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ;\nC" -" 196 ; WX 333 ; N tilde ; B 100 517 427 624 ;\nC 197 ; WX 333 ; N macron ; B 99 " -"532 411 583 ;\nC 198 ; WX 333 ; N breve ; B 117 492 418 650 ;\nC 199 ; WX 333 ; " -"N dotaccent ; B 207 508 305 606 ;\nC 200 ; WX 333 ; N dieresis ; B 107 508 405 6" -"06 ;\nC 202 ; WX 333 ; N ring ; B 155 508 355 707 ;\nC 203 ; WX 333 ; N cedilla " -"; B -30 -217 182 0 ;\nC 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ;\nC 20" -"6 ; WX 333 ; N ogonek ; B -20 -169 200 40 ;\nC 207 ; WX 333 ; N caron ; B 121 49" -"2 426 661 ;\nC 208 ; WX 889 ; N emdash ; B -6 197 894 243 ;\nC 225 ; WX 889 ; N " -"AE ; B -27 0 911 653 ;\nC 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ;\nC 2" -"32 ; WX 556 ; N Lslash ; B -8 0 559 653 ;\nC 233 ; WX 722 ; N Oslash ; B 60 -105" -" 699 722 ;\nC 234 ; WX 944 ; N OE ; B 49 -8 964 666 ;\nC 235 ; WX 310 ; N ordmas" -"culine ; B 67 406 362 676 ;\nC 241 ; WX 667 ; N ae ; B 23 -11 640 441 ;\nC 245 ;" -" WX 278 ; N dotlessi ; B 49 -11 235 441 ;\nC 248 ; WX 278 ; N lslash ; B 37 -11 " -"307 683 ;\nC 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ;\nC 250 ; WX 667 ; N o" -"e ; B 20 -12 646 441 ;\nC 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ;\nC" -" -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ;\nC -1 ; WX 722 ; N Uacute ; B 1" -"02 -18 765 876 ;\nC -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ;\nC -1 ; WX 55" -"6 ; N Tcaron ; B 59 0 633 873 ;\nC -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ;\n" -"C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ;\nC -1 ; WX 611 ; N Racute ; B -13 0" -" 588 876 ;\nC -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ;\nC -1 ; WX 722 ; N Oti" -"lde ; B 60 -18 706 836 ;\nC -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ;\nC " -"-1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 706 876 ;\nC -1 ; WX 722 ; N Uhungaruml" -"aut ; B 102 -18 765 876 ;\nC -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ;\nC -1 ; W" -"X 722 ; N Eth ; B -8 0 700 653 ;\nC -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ;\nC" -" -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ;\nC -1 ; WX 722 ; N Uring ; B 102 -18 " -"765 919 ;\nC -1 ; WX 500 ; N gbreve ; B 8 -206 502 650 ;\nC -1 ; WX 444 ; N eogo" -"nek ; B 31 -169 444 441 ;\nC -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ;\nC " -"-1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ;\nC -1 ; WX 722 ; N Ugrave ; B 102 -1" -"8 765 876 ;\nC -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ;\nC -1 ; WX 444 ; N eacute" -" ; B 31 -11 459 664 ;\nC -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ;\nC -1 ; " -"WX 521 ; N dcaron ; B 15 -13 641 683 ;\nC -1 ; WX 444 ; N ccedilla ; B 26 -217 4" -"25 441 ;\nC -1 ; WX 444 ; N ccaron ; B 30 -11 484 661 ;\nC -1 ; WX 444 ; N cacut" -"e ; B 30 -11 458 664 ;\nC -1 ; WX 500 ; N aogonek ; B 17 -169 500 441 ;\nC -1 ; " -"WX 500 ; N aring ; B 17 -11 476 707 ;\nC -1 ; WX 500 ; N atilde ; B 17 -11 511 6" -"24 ;\nC -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ;\nC -1 ; WX 444 ; N egrave ; " -"B 31 -11 412 664 ;\nC -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ;\nC -1 ; WX 500" -" ; N aacute ; B 17 -11 487 664 ;\nC -1 ; WX 500 ; N adieresis ; B 17 -11 489 606" -" ;\nC -1 ; WX 722 ; N Uogonek ; B 102 -169 765 653 ;\nC -1 ; WX 500 ; N ugrave ;" -" B 42 -11 475 664 ;\nC -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ;\nC -1 ; WX 50" -"0 ; N udieresis ; B 42 -11 479 606 ;\nC -1 ; WX 278 ; N tcaron ; B 37 -11 378 66" -"6 ;\nC -1 ; WX 389 ; N scommaaccent ; B 16 -270 366 442 ;\nC -1 ; WX 556 ; N Zca" -"ron ; B -6 0 606 873 ;\nC -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ;\nC -1" -" ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ;\nC -1 ; WX 500 ; N acircumflex ;" -" B 17 -11 476 661 ;\nC -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ;\nC -1 ; WX " -"389 ; N scaron ; B 16 -13 454 661 ;\nC -1 ; WX 611 ; N Amacron ; B -51 0 564 795" -" ;\nC -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ;\nC -1 ; WX 556 ; N Tcommaaccen" -"t ; B 59 -270 633 653 ;\nC -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ;\nC -1 ; " -"WX 500 ; N thorn ; B -75 -205 469 683 ;\nC -1 ; WX 611 ; N Emacron ; B -1 0 634 " -"795 ;\nC -1 ; WX 722 ; N Ograve ; B 60 -18 706 876 ;\nC -1 ; WX 722 ; N Oacute ;" -" B 60 -18 706 876 ;\nC -1 ; WX 722 ; N Odieresis ; B 60 -18 706 818 ;\nC -1 ; WX" -" 667 ; N Ntilde ; B -20 -15 727 836 ;\nC -1 ; WX 667 ; N Ncaron ; B -20 -15 727 " -"873 ;\nC -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ;\nC -1 ; WX 556 ; N Lcaron " -"; B -8 0 596 666 ;\nC -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ;\nC -1 ; WX 333 ;" -" N Idotaccent ; B -8 0 384 818 ;\nC -1 ; WX 389 ; N racute ; B 45 0 431 664 ;\nC" -" -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ;\nC -1 ; WX 500 ; N ohungarumlaut" -" ; B 27 -11 570 664 ;\nC -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ;\nC -1 ; WX " -"500 ; N Euro ; B 57 0 668 693 ;\nC -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 66" -"1 ;\nC -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ;\nC -1 ; WX 300 ; N twosu" -"perior ; B 33 271 324 676 ;\nC -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 " -";\nC -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ;\nC -1 ; WX 333 ; N Iacute ; B -8 " -"0 403 876 ;\nC -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ;\nC -1 ; WX 333 ; N Iog" -"onek ; B -8 -169 384 653 ;\nC -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ;\nC -1" -" ; WX 722 ; N Gbreve ; B 52 -18 722 862 ;\nC -1 ; WX 722 ; N Umacron ; B 102 -18" -" 765 795 ;\nC -1 ; WX 667 ; N Kcommaaccent ; B 7 -270 722 653 ;\nC -1 ; WX 500 ;" -" N ograve ; B 27 -11 468 664 ;\nC -1 ; WX 500 ; N Scommaaccent ; B 17 -270 508 6" -"67 ;\nC -1 ; WX 611 ; N Eogonek ; B -1 -169 651 653 ;\nC -1 ; WX 500 ; N oacute " -"; B 27 -11 487 664 ;\nC -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ;\nC -1 ; WX" -" 278 ; N iogonek ; B 49 -169 278 654 ;\nC -1 ; WX 500 ; N gcommaaccent ; B 8 -20" -"6 472 706 ;\nC -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ;\nC -1 ; WX 500 ; N" -" ntilde ; B 14 -9 476 624 ;\nC -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ;\nC -1 " -"; WX 611 ; N Ecaron ; B -1 0 634 873 ;\nC -1 ; WX 611 ; N Ecircumflex ; B -1 0 6" -"34 873 ;\nC -1 ; WX 389 ; N scedilla ; B -2 -217 366 442 ;\nC -1 ; WX 389 ; N rc" -"aron ; B 45 0 454 661 ;\nC -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ;\nC -1 ; WX " -"611 ; N Eacute ; B -1 0 634 876 ;\nC -1 ; WX 722 ; N Gcommaaccent ; B 52 -270 72" -"2 666 ;\nC -1 ; WX 611 ; N Rcommaaccent ; B -13 -270 588 653 ;\nC -1 ; WX 611 ; " -"N Edieresis ; B -1 0 634 818 ;\nC -1 ; WX 500 ; N nacute ; B 14 -9 487 664 ;\nC " -"-1 ; WX 500 ; N uogonek ; B 42 -169 500 441 ;\nC -1 ; WX 500 ; N umacron ; B 42 " -"-11 495 583 ;\nC -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ;\nC -1 ; WX 278 ; N lc" -"aron ; B 40 -11 395 683 ;\nC -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ;\nC -1 ;" -" WX 667 ; N Cacute ; B 66 -18 689 876 ;\nC -1 ; WX 667 ; N Ccedilla ; B 66 -217 " -"689 666 ;\nC -1 ; WX 400 ; N degree ; B 101 390 387 676 ;\nC -1 ; WX 611 ; N Aog" -"onek ; B -51 -169 707 668 ;\nC -1 ; WX 675 ; N minus ; B 86 220 590 286 ;\nC -1 " -"; WX 675 ; N multiply ; B 93 8 582 497 ;\nC -1 ; WX 675 ; N divide ; B 86 -11 59" -"0 517 ;\nC -1 ; WX 611 ; N Aring ; B -51 0 564 904 ;\nC -1 ; WX 980 ; N trademar" -"k ; B 30 247 957 653 ;\nC -1 ; WX 389 ; N rcommaaccent ; B 35 -270 412 441 ;\nC " -"-1 ; WX 278 ; N lacute ; B 40 -11 376 876 ;\nC -1 ; WX 500 ; N omacron ; B 27 -1" -"1 495 583 ;\nC -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ;\nC -1 ; WX 278 ; N ici" -"rcumflex ; B 34 -11 328 661 ;\nC -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ;\nC " -"-1 ; WX 500 ; N ncommaaccent ; B 14 -270 474 441 ;\nC -1 ; WX 278 ; N lcommaacce" -"nt ; B -21 -270 279 683 ;\nC -1 ; WX 675 ; N plusminus ; B 86 0 590 568 ;\nC -1 " -"; WX 750 ; N onehalf ; B 34 -10 749 676 ;\nC -1 ; WX 750 ; N onequarter ; B 33 -" -"10 736 676 ;\nC -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ;\nC -1 ; WX 27" -"8 ; N iacute ; B 49 -11 356 664 ;\nC -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ;\n" -"C -1 ; WX 444 ; N kcommaaccent ; B 14 -270 461 683 ;\nC -1 ; WX 722 ; N Omacron " -"; B 60 -18 706 795 ;\nC -1 ; WX 278 ; N imacron ; B 49 -11 384 583 ;\nC -1 ; WX " -"444 ; N emacron ; B 31 -11 467 583 ;\nC -1 ; WX 500 ; N amacron ; B 17 -11 495 5" -"83 ;\nC -1 ; WX 278 ; N tcommaaccent ; B -21 -270 296 546 ;\nC -1 ; WX 444 ; N y" -"dieresis ; B -24 -206 441 606 ;\nC -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606" -" ;\nC -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ;\nC -1 ; WX 389 ; N zacute ; B " -"-2 -81 431 664 ;\nC -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ;\nC -1 ; WX 500" -" ; N uhungarumlaut ; B 42 -11 570 664 ;\nC -1 ; WX 500 ; N eth ; B 27 -11 482 68" -"3 ;\nC -1 ; WX 500 ; N uring ; B 42 -11 475 707 ;\nC -1 ; WX 722 ; N Ocircumflex" -" ; B 60 -18 706 873 ;\nC -1 ; WX 333 ; N commaaccent ; B 7 -270 146 -40 ;\nC -1 " -"; WX 760 ; N copyright ; B 41 -18 719 666 ;\nC -1 ; WX 760 ; N registered ; B 41" -" -18 719 666 ;\nC -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ;\nC -1 ; WX 278" -" ; N idieresis ; B 49 -11 353 606 ;\nC -1 ; WX 494 ; N lozenge ; B 18 0 466 740 " -";\nC -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC -1 ; WX 564 ; N notequal ; B 30 " -"-3 534 509 ;\nC -1 ; WX 549 ; N radical ; B -2 -65 526 924 ;\nC -1 ; WX 611 ; N " -"Agrave ; B -51 0 564 876 ;\nC -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ;\nC -1 ;" -" WX 675 ; N lessequal ; B 84 0 592 628 ;\nC -1 ; WX 675 ; N greaterequal ; B 84 " -"0 592 628 ;\nC -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ;\nC -1 ; WX 713 ; " -"N summation ; B 14 -123 695 752 ;\nC -1 ; WX 494 ; N partialdiff ; B 26 -10 462 " -"753 ;\nC -1 ; WX 667 ; N Ncommaaccent ; B -20 -270 727 653 ;\nC -1 ; WX 500 ; N " -"dcroat ; B 15 -13 558 683 ;\nC -1 ; WX 275 ; N brokenbar ; B 105 -18 171 666 ;\n" -"C -1 ; WX 556 ; N Lcommaaccent ; B -8 -270 559 653 ;\nC -1 ; WX 611 ; N Adieresi" -"s ; B -51 0 564 818 ;\nC -1 ; WX 500 ; N mu ; B -30 -209 497 428 ;\nC -1 ; WX 25" -"0 ; N .notdef ; B 125 0 125 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 9" -"98\nKPX A C -50\nKPX A Ccedilla -50\nKPX A G -44\nKPX A O -45\nKPX A Odieresis -" -"45\nKPX A Q -44\nKPX A T -14\nKPX A U -57\nKPX A Uacute -57\nKPX A Ucircumflex -" -"57\nKPX A Udieresis -57\nKPX A Ugrave -57\nKPX A V -81\nKPX A W -75\nKPX A Y -21" -"\nKPX A a -4\nKPX A b 0\nKPX A c -18\nKPX A ccedilla -28\nKPX A comma 8\nKPX A d" -" -4\nKPX A e -17\nKPX A g -25\nKPX A guillemotleft -44\nKPX A guilsinglleft -43\n" -"KPX A hyphen -13\nKPX A o -17\nKPX A period 8\nKPX A q -12\nKPX A quotedblright " -"-92\nKPX A quoteright -92\nKPX A t -6\nKPX A u -9\nKPX A v -50\nKPX A w -44\nKPX" -" A y -57\nKPX Aacute C -50\nKPX Aacute G -44\nKPX Aacute O -45\nKPX Aacute Q -44" -"\nKPX Aacute T -14\nKPX Aacute U -57\nKPX Aacute V -81\nKPX Aacute W -75\nKPX Aa" -"cute Y -21\nKPX Aacute a -4\nKPX Aacute b 0\nKPX Aacute c -18\nKPX Aacute comma " -"8\nKPX Aacute d -4\nKPX Aacute e -17\nKPX Aacute g -25\nKPX Aacute guillemotleft" -" -44\nKPX Aacute guilsinglleft -43\nKPX Aacute hyphen -13\nKPX Aacute o -17\nKPX" -" Aacute period 8\nKPX Aacute q -12\nKPX Aacute quoteright -92\nKPX Aacute t -6\n" -"KPX Aacute u -9\nKPX Aacute v -50\nKPX Aacute w -44\nKPX Aacute y -57\nKPX Acirc" -"umflex C -50\nKPX Acircumflex G -44\nKPX Acircumflex O -45\nKPX Acircumflex Q -4" -"4\nKPX Acircumflex T -14\nKPX Acircumflex U -57\nKPX Acircumflex V -81\nKPX Acir" -"cumflex W -75\nKPX Acircumflex Y -21\nKPX Acircumflex comma 8\nKPX Acircumflex p" -"eriod 8\nKPX Adieresis C -50\nKPX Adieresis G -44\nKPX Adieresis O -45\nKPX Adie" -"resis Q -44\nKPX Adieresis T -14\nKPX Adieresis U -57\nKPX Adieresis V -81\nKPX " -"Adieresis W -75\nKPX Adieresis Y -21\nKPX Adieresis a -4\nKPX Adieresis b 0\nKPX" -" Adieresis c -18\nKPX Adieresis comma 8\nKPX Adieresis d -4\nKPX Adieresis g -25" -"\nKPX Adieresis guillemotleft -44\nKPX Adieresis guilsinglleft -43\nKPX Adieresi" -"s hyphen -13\nKPX Adieresis o -17\nKPX Adieresis period 8\nKPX Adieresis q -12\n" -"KPX Adieresis quotedblright -92\nKPX Adieresis quoteright -92\nKPX Adieresis t -" -"6\nKPX Adieresis u -9\nKPX Adieresis v -50\nKPX Adieresis w -44\nKPX Adieresis y" -" -57\nKPX Agrave C -50\nKPX Agrave G -44\nKPX Agrave O -45\nKPX Agrave Q -44\nKP" -"X Agrave T -14\nKPX Agrave U -57\nKPX Agrave V -81\nKPX Agrave W -75\nKPX Agrave" -" Y -21\nKPX Agrave comma 8\nKPX Agrave period 8\nKPX Aring C -50\nKPX Aring G -4" -"4\nKPX Aring O -45\nKPX Aring Q -44\nKPX Aring T -14\nKPX Aring U -57\nKPX Aring" -" V -81\nKPX Aring W -75\nKPX Aring Y -21\nKPX Aring a -4\nKPX Aring b 0\nKPX Ari" -"ng c -18\nKPX Aring comma 8\nKPX Aring d -4\nKPX Aring e -17\nKPX Aring g -25\nK" -"PX Aring guillemotleft -44\nKPX Aring guilsinglleft -43\nKPX Aring hyphen -13\nK" -"PX Aring o -17\nKPX Aring period 8\nKPX Aring q -12\nKPX Aring quotedblright -92" -"\nKPX Aring quoteright -92\nKPX Aring t -6\nKPX Aring u -9\nKPX Aring v -50\nKPX" -" Aring w -44\nKPX Aring y -57\nKPX Atilde C -50\nKPX Atilde G -44\nKPX Atilde O " -"-45\nKPX Atilde Q -44\nKPX Atilde T -14\nKPX Atilde U -57\nKPX Atilde V -81\nKPX" -" Atilde W -75\nKPX Atilde Y -21\nKPX Atilde comma 7\nKPX Atilde period 7\nKPX B " -"A -23\nKPX B AE -35\nKPX B Aacute -23\nKPX B Acircumflex -23\nKPX B Adieresis -2" -"3\nKPX B Aring -23\nKPX B Atilde -23\nKPX B O -14\nKPX B OE -6\nKPX B Oacute -14" -"\nKPX B Ocircumflex -14\nKPX B Odieresis -14\nKPX B Ograve -14\nKPX B Oslash -14" -"\nKPX B V -32\nKPX B W -29\nKPX B Y -39\nKPX C A -14\nKPX C AE -30\nKPX C Aacute" -" -14\nKPX C Adieresis -14\nKPX C Aring -14\nKPX C H -13\nKPX C K -21\nKPX C O -1" -"9\nKPX C Oacute -19\nKPX C Odieresis -19\nKPX Ccedilla A -18\nKPX D A -36\nKPX D" -" Aacute -36\nKPX D Acircumflex -36\nKPX D Adieresis -36\nKPX D Agrave -36\nKPX D" -" Aring -36\nKPX D Atilde -36\nKPX D J -32\nKPX D T -9\nKPX D V -42\nKPX D W -36\n" -"KPX D X -40\nKPX D Y -50\nKPX F A -72\nKPX F Aacute -72\nKPX F Acircumflex -72\n" -"KPX F Adieresis -72\nKPX F Agrave -72\nKPX F Aring -72\nKPX F Atilde -72\nKPX F " -"J -60\nKPX F O -40\nKPX F Odieresis -40\nKPX F a -77\nKPX F aacute -78\nKPX F ad" -"ieresis -52\nKPX F ae -82\nKPX F aring -70\nKPX F comma -95\nKPX F e -83\nKPX F " -"eacute -83\nKPX F hyphen -45\nKPX F i -36\nKPX F j -41\nKPX F o -79\nKPX F oacut" -"e -79\nKPX F odieresis -52\nKPX F oe -75\nKPX F oslash -80\nKPX F period -99\nKP" -"X F r -52\nKPX F u -50\nKPX G A -17\nKPX G AE -29\nKPX G Aacute -17\nKPX G Acirc" -"umflex -17\nKPX G Adieresis -17\nKPX G Agrave -17\nKPX G Aring -17\nKPX G Atilde" -" -17\nKPX G T -13\nKPX G V -5\nKPX G W -2\nKPX G Y -12\nKPX J A -40\nKPX J AE -5" -"2\nKPX J Adieresis -40\nKPX J Aring -40\nKPX K C -55\nKPX K G -53\nKPX K O -46\n" -"KPX K OE -45\nKPX K Oacute -46\nKPX K Odieresis -46\nKPX K S 6\nKPX K T 21\nKPX " -"K a -5\nKPX K adieresis -5\nKPX K ae -5\nKPX K aring -5\nKPX K e -18\nKPX K hyph" -"en -57\nKPX K o -18\nKPX K oacute -18\nKPX K odieresis -18\nKPX K u -10\nKPX K u" -"dieresis -10\nKPX K y -89\nKPX L A 44\nKPX L AE 32\nKPX L Aacute 44\nKPX L Adier" -"esis 44\nKPX L Aring 44\nKPX L C 6\nKPX L Ccedilla 4\nKPX L G 11\nKPX L O 10\nKP" -"X L Oacute 10\nKPX L Ocircumflex 10\nKPX L Odieresis 10\nKPX L Ograve 10\nKPX L " -"Otilde 10\nKPX L S 20\nKPX L T -13\nKPX L U -8\nKPX L Udieresis -8\nKPX L V -55\n" -"KPX L W -48\nKPX L Y -20\nKPX L hyphen 47\nKPX L quotedblright -92\nKPX L quoter" -"ight -92\nKPX L u 12\nKPX L udieresis 10\nKPX L y -26\nKPX N A -20\nKPX N AE -32" -"\nKPX N Aacute -20\nKPX N Adieresis -20\nKPX N Aring -20\nKPX N C -21\nKPX N Cce" -"dilla -20\nKPX N G -14\nKPX N O -20\nKPX N Oacute -20\nKPX N Odieresis -20\nKPX " -"N a -22\nKPX N aacute -23\nKPX N adieresis -23\nKPX N ae -27\nKPX N aring -23\nK" -"PX N comma -13\nKPX N e -28\nKPX N eacute -30\nKPX N o -25\nKPX N oacute -27\nKP" -"X N odieresis -27\nKPX N oslash -27\nKPX N period -16\nKPX N u -24\nKPX N udiere" -"sis -25\nKPX O A -38\nKPX O AE -70\nKPX O Aacute -38\nKPX O Adieresis -38\nKPX O" -" Aring -38\nKPX O T -3\nKPX O V -45\nKPX O W -39\nKPX O X -41\nKPX O Y -51\nKPX " -"Oacute A -38\nKPX Oacute T -3\nKPX Oacute V -45\nKPX Oacute W -39\nKPX Oacute Y " -"-51\nKPX Ocircumflex T -3\nKPX Ocircumflex V -45\nKPX Ocircumflex Y -51\nKPX Odi" -"eresis A -38\nKPX Odieresis T -3\nKPX Odieresis V -45\nKPX Odieresis W -39\nKPX " -"Odieresis X -41\nKPX Odieresis Y -51\nKPX Ograve T -3\nKPX Ograve V -45\nKPX Ogr" -"ave Y -51\nKPX Oslash A -38\nKPX Otilde T -3\nKPX Otilde V -45\nKPX Otilde Y -51" -"\nKPX P A -79\nKPX P AE -116\nKPX P Aacute -79\nKPX P Adieresis -79\nKPX P Aring" -" -79\nKPX P J -89\nKPX P a -74\nKPX P aacute -74\nKPX P adieresis -64\nKPX P ae " -"-80\nKPX P aring -74\nKPX P comma -118\nKPX P e -79\nKPX P eacute -79\nKPX P hyp" -"hen -64\nKPX P o -73\nKPX P oacute -73\nKPX P odieresis -64\nKPX P oe -67\nKPX P" -" oslash -74\nKPX P period -121\nKPX R C -26\nKPX R Ccedilla -25\nKPX R G -20\nKP" -"X R O -26\nKPX R OE -18\nKPX R Oacute -26\nKPX R Odieresis -26\nKPX R T 0\nKPX R" -" U -36\nKPX R Udieresis -36\nKPX R V -31\nKPX R W -28\nKPX R Y -19\nKPX R a -3\n" -"KPX R aacute -3\nKPX R adieresis -3\nKPX R ae -3\nKPX R aring -3\nKPX R e -15\nK" -"PX R eacute -15\nKPX R hyphen -29\nKPX R o -15\nKPX R oacute -15\nKPX R odieresi" -"s -15\nKPX R oe -15\nKPX R u -7\nKPX R uacute -7\nKPX R udieresis -7\nKPX R y 0\n" -"KPX S A -2\nKPX S AE -14\nKPX S Aacute -2\nKPX S Adieresis -2\nKPX S Aring -2\nK" -"PX S T 1\nKPX S V 5\nKPX S W 8\nKPX S Y -1\nKPX S t -13\nKPX T A -33\nKPX T AE -" -"45\nKPX T Aacute -33\nKPX T Acircumflex -33\nKPX T Adieresis -33\nKPX T Agrave -" -"33\nKPX T Aring -33\nKPX T Atilde -33\nKPX T C -15\nKPX T G -7\nKPX T J -39\nKPX" -" T O -20\nKPX T OE -8\nKPX T Oacute -20\nKPX T Ocircumflex -20\nKPX T Odieresis " -"-20\nKPX T Ograve -20\nKPX T Oslash -20\nKPX T Otilde -20\nKPX T S -2\nKPX T V 4" -"1\nKPX T W 43\nKPX T Y 33\nKPX T a -81\nKPX T ae -81\nKPX T c -86\nKPX T colon -" -"84\nKPX T comma -70\nKPX T e -90\nKPX T g -102\nKPX T guillemotleft -102\nKPX T " -"guilsinglleft -101\nKPX T hyphen -68\nKPX T i -16\nKPX T j -20\nKPX T o -87\nKPX" -" T oslash -89\nKPX T period -71\nKPX T r -87\nKPX T s -74\nKPX T semicolon -92\n" -"KPX T u -86\nKPX T v -72\nKPX T w -69\nKPX T y -70\nKPX U A -50\nKPX U AE -69\nK" -"PX U Aacute -50\nKPX U Acircumflex -50\nKPX U Adieresis -50\nKPX U Aring -50\nKP" -"X U Atilde -50\nKPX U comma -35\nKPX U m -28\nKPX U n -29\nKPX U p -32\nKPX U pe" -"riod -39\nKPX U r -41\nKPX Uacute A -50\nKPX Uacute comma -35\nKPX Uacute m -28\n" -"KPX Uacute n -29\nKPX Uacute p -32\nKPX Uacute period -39\nKPX Uacute r -41\nKPX" -" Ucircumflex A -50\nKPX Udieresis A -50\nKPX Udieresis b 1\nKPX Udieresis comma " -"-35\nKPX Udieresis m -28\nKPX Udieresis n -29\nKPX Udieresis p -32\nKPX Udieresi" -"s period -39\nKPX Udieresis r -41\nKPX Ugrave A -50\nKPX V A -66\nKPX V AE -102\n" -"KPX V Aacute -66\nKPX V Acircumflex -66\nKPX V Adieresis -66\nKPX V Agrave -66\n" -"KPX V Aring -66\nKPX V Atilde -66\nKPX V C -48\nKPX V G -42\nKPX V O -48\nKPX V " -"Oacute -48\nKPX V Ocircumflex -48\nKPX V Odieresis -48\nKPX V Ograve -48\nKPX V " -"Oslash -48\nKPX V Otilde -48\nKPX V S -15\nKPX V T 32\nKPX V a -67\nKPX V ae -72" -"\nKPX V colon -82\nKPX V comma -76\nKPX V e -74\nKPX V g -84\nKPX V guillemotlef" -"t -82\nKPX V guilsinglleft -81\nKPX V hyphen -45\nKPX V i -16\nKPX V o -70\nKPX " -"V oslash -72\nKPX V period -80\nKPX V r -45\nKPX V semicolon -79\nKPX V u -40\nK" -"PX V y -16\nKPX W A -57\nKPX W AE -85\nKPX W Aacute -57\nKPX W Acircumflex -57\n" -"KPX W Adieresis -57\nKPX W Agrave -57\nKPX W Aring -57\nKPX W Atilde -57\nKPX W " -"C -39\nKPX W G -33\nKPX W O -39\nKPX W Oacute -39\nKPX W Ocircumflex -39\nKPX W " -"Odieresis -39\nKPX W Ograve -39\nKPX W Oslash -39\nKPX W Otilde -39\nKPX W S -17" -"\nKPX W T 30\nKPX W a -53\nKPX W ae -58\nKPX W colon -77\nKPX W comma -58\nKPX W" -" e -60\nKPX W g -75\nKPX W guillemotleft -68\nKPX W guilsinglleft -67\nKPX W hyp" -"hen -32\nKPX W i -18\nKPX W o -56\nKPX W oslash -58\nKPX W period -62\nKPX W r -" -"40\nKPX W semicolon -74\nKPX W u -35\nKPX W y -11\nKPX X C -50\nKPX X O -44\nKPX" -" X Odieresis -44\nKPX X Q -42\nKPX X a -3\nKPX X e -15\nKPX X hyphen -41\nKPX X " -"o -15\nKPX X u -7\nKPX X y -67\nKPX Y A -27\nKPX Y AE -39\nKPX Y Aacute -27\nKPX" -" Y Acircumflex -27\nKPX Y Adieresis -27\nKPX Y Agrave -27\nKPX Y Aring -27\nKPX " -"Y Atilde -27\nKPX Y C -52\nKPX Y G -45\nKPX Y O -52\nKPX Y Oacute -52\nKPX Y Oci" -"rcumflex -52\nKPX Y Odieresis -52\nKPX Y Ograve -52\nKPX Y Oslash -52\nKPX Y Oti" -"lde -52\nKPX Y S -15\nKPX Y T 32\nKPX Y a -72\nKPX Y ae -75\nKPX Y colon -78\nKP" -"X Y comma -64\nKPX Y e -78\nKPX Y g -94\nKPX Y guillemotleft -93\nKPX Y guilsing" -"lleft -92\nKPX Y hyphen -60\nKPX Y i -16\nKPX Y o -75\nKPX Y oslash -77\nKPX Y p" -" -52\nKPX Y period -65\nKPX Y semicolon -86\nKPX Y u -58\nKPX Y v -32\nKPX Z v -" -"12\nKPX Z y -28\nKPX a j -22\nKPX a quoteright -28\nKPX a v 1\nKPX a w 4\nKPX a " -"y 2\nKPX aacute v 1\nKPX aacute w 4\nKPX aacute y 2\nKPX adieresis v 1\nKPX adie" -"resis w 4\nKPX adieresis y 2\nKPX ae v 2\nKPX ae w 5\nKPX ae y 6\nKPX agrave v 1" -"\nKPX agrave w 4\nKPX agrave y 2\nKPX aring v 1\nKPX aring w 4\nKPX aring y 2\nK" -"PX b v -10\nKPX b w -7\nKPX b y -3\nKPX c h -30\nKPX c k -29\nKPX comma one -40\n" -"KPX comma quotedblright -39\nKPX comma quoteright -39\nKPX e quoteright -21\nKPX" -" e t -16\nKPX e v 0\nKPX e w 2\nKPX e x -10\nKPX e y 4\nKPX eacute v 0\nKPX eacu" -"te w 2\nKPX eacute y 4\nKPX ecircumflex v 0\nKPX ecircumflex w 2\nKPX ecircumfle" -"x y 4\nKPX eight four 13\nKPX eight one -50\nKPX eight seven -1\nKPX f a -26\nKP" -"X f aacute -27\nKPX f adieresis -2\nKPX f ae -30\nKPX f aring -17\nKPX f e -32\n" -"KPX f eacute -34\nKPX f f 30\nKPX f i 17\nKPX f j 13\nKPX f l 42\nKPX f o -29\nK" -"PX f oacute -30\nKPX f odieresis -2\nKPX f oe -24\nKPX f oslash -31\nKPX f quote" -"right 18\nKPX f s -20\nKPX f t 18\nKPX five four -5\nKPX five one -71\nKPX five " -"seven -28\nKPX four four 12\nKPX four one -69\nKPX four seven -27\nKPX g a -41\n" -"KPX g adieresis -42\nKPX g ae -46\nKPX g aring -42\nKPX g e -45\nKPX g eacute -4" -"5\nKPX g l -46\nKPX g oacute -41\nKPX g odieresis -41\nKPX g r -21\nKPX guillemo" -"tright A -25\nKPX guillemotright AE -51\nKPX guillemotright Aacute -25\nKPX guil" -"lemotright Adieresis -25\nKPX guillemotright Aring -25\nKPX guillemotright T -77" -"\nKPX guillemotright V -76\nKPX guillemotright W -67\nKPX guillemotright Y -81\n" -"KPX guilsinglright A -24\nKPX guilsinglright AE -50\nKPX guilsinglright Aacute -" -"24\nKPX guilsinglright Adieresis -24\nKPX guilsinglright Aring -24\nKPX guilsing" -"lright T -76\nKPX guilsinglright V -75\nKPX guilsinglright W -66\nKPX guilsinglr" -"ight Y -80\nKPX h quoteright -31\nKPX h y -4\nKPX hyphen A 3\nKPX hyphen AE -23\n" -"KPX hyphen Aacute 3\nKPX hyphen Adieresis 3\nKPX hyphen Aring 3\nKPX hyphen T -4" -"6\nKPX hyphen V -43\nKPX hyphen W -34\nKPX hyphen Y -53\nKPX i T -10\nKPX i j -3" -"1\nKPX k a 12\nKPX k aacute 12\nKPX k adieresis 12\nKPX k ae 9\nKPX k aring 12\n" -"KPX k comma 27\nKPX k e 5\nKPX k eacute 5\nKPX k g -27\nKPX k hyphen -27\nKPX k " -"o 6\nKPX k oacute 6\nKPX k odieresis 6\nKPX k period 26\nKPX k s 7\nKPX k u 8\nK" -"PX k udieresis 8\nKPX l v -12\nKPX l y -11\nKPX m p -4\nKPX m v -6\nKPX m w -4\n" -"KPX m y -3\nKPX n T -41\nKPX n p -7\nKPX n quoteright -34\nKPX n v -10\nKPX n w " -"-7\nKPX n y -6\nKPX nine four 2\nKPX nine one -64\nKPX nine seven -5\nKPX o T -6" -"3\nKPX o quoteright -24\nKPX o t -15\nKPX o v -18\nKPX o w -15\nKPX o x -33\nKPX" -" o y -10\nKPX oacute v -18\nKPX oacute w -15\nKPX oacute y -10\nKPX ocircumflex " -"t -16\nKPX odieresis t -16\nKPX odieresis v -18\nKPX odieresis w -15\nKPX odiere" -"sis x -33\nKPX odieresis y -10\nKPX ograve v -18\nKPX ograve w -15\nKPX ograve y" -" -10\nKPX one comma -52\nKPX one eight -57\nKPX one five -55\nKPX one four -69\n" -"KPX one nine -61\nKPX one one -69\nKPX one period -56\nKPX one seven -60\nKPX on" -"e six -50\nKPX one three -55\nKPX one two -50\nKPX one zero -41\nKPX p t -14\nKP" -"X p y -4\nKPX period one -39\nKPX period quotedblright -38\nKPX period quoterigh" -"t -38\nKPX q c -13\nKPX q u -11\nKPX quotedblbase A 1\nKPX quotedblbase AE -13\n" -"KPX quotedblbase T -64\nKPX quotedblbase V -96\nKPX quotedblbase W -84\nKPX quot" -"edblbase Y -69\nKPX quotedblleft A -88\nKPX quotedblleft AE -141\nKPX quotedblle" -"ft Aacute -88\nKPX quotedblleft Adieresis -88\nKPX quotedblleft Aring -88\nKPX q" -"uotedblleft T -19\nKPX quotedblleft V -17\nKPX quotedblleft W -15\nKPX quotedbll" -"eft Y -25\nKPX quotedblright A -94\nKPX quotedblright AE -147\nKPX quotedblright" -" Aacute -94\nKPX quotedblright Adieresis -94\nKPX quotedblright Aring -94\nKPX q" -"uotedblright T -21\nKPX quotedblright V -22\nKPX quotedblright W -19\nKPX quoted" -"blright Y -30\nKPX quoteleft A -78\nKPX quoteleft AE -131\nKPX quoteleft Aacute " -"-78\nKPX quoteleft Adieresis -78\nKPX quoteleft Aring -78\nKPX quoteleft T -9\nK" -"PX quoteleft V -8\nKPX quoteleft W -5\nKPX quoteleft Y -15\nKPX quoteright A -87" -"\nKPX quoteright AE -140\nKPX quoteright Aacute -87\nKPX quoteright Adieresis -8" -"7\nKPX quoteright Aring -87\nKPX quoteright comma -73\nKPX quoteright d -79\nKPX" -" quoteright o -78\nKPX quoteright period -78\nKPX quoteright r -57\nKPX quoterig" -"ht s -63\nKPX quoteright t -49\nKPX quoteright v -28\nKPX quoteright w -26\nKPX " -"quoteright y -28\nKPX r a -29\nKPX r aacute -29\nKPX r acircumflex -29\nKPX r ad" -"ieresis -29\nKPX r ae -36\nKPX r agrave -29\nKPX r aring -29\nKPX r c -26\nKPX r" -" ccedilla -17\nKPX r colon -28\nKPX r comma -68\nKPX r d -31\nKPX r e -35\nKPX r" -" eacute -35\nKPX r ecircumflex -35\nKPX r egrave -35\nKPX r f 23\nKPX r g -21\nK" -"PX r h -17\nKPX r hyphen -52\nKPX r i 8\nKPX r j 4\nKPX r k -15\nKPX r l -21\nKP" -"X r m 17\nKPX r n 16\nKPX r o -28\nKPX r oacute -28\nKPX r ocircumflex -28\nKPX " -"r odieresis -28\nKPX r oe -23\nKPX r ograve -28\nKPX r oslash -29\nKPX r p 13\nK" -"PX r period -72\nKPX r q -31\nKPX r quoteright -4\nKPX r r 4\nKPX r s -17\nKPX r" -" semicolon -28\nKPX r t 12\nKPX r u 11\nKPX r v 30\nKPX r w 32\nKPX r x 7\nKPX r" -" y 33\nKPX r z 0\nKPX s quoteright -20\nKPX s t -12\nKPX seven colon -88\nKPX se" -"ven comma -79\nKPX seven eight -32\nKPX seven five -53\nKPX seven four -65\nKPX " -"seven one -47\nKPX seven period -83\nKPX seven seven -11\nKPX seven six -37\nKPX" -" seven three -42\nKPX seven two -13\nKPX six four 17\nKPX six one -64\nKPX six s" -"even -37\nKPX t S -9\nKPX t a -6\nKPX t aacute -6\nKPX t adieresis -6\nKPX t ae " -"-10\nKPX t aring -6\nKPX t colon -29\nKPX t e -13\nKPX t eacute -13\nKPX t h -11" -"\nKPX t o -11\nKPX t oacute -11\nKPX t odieresis -11\nKPX t quoteright -19\nKPX " -"t semicolon -26\nKPX three four -9\nKPX three one -76\nKPX three seven -15\nKPX " -"two four -12\nKPX two one -45\nKPX two seven -22\nKPX u quoteright -31\nKPX v a " -"-24\nKPX v aacute -26\nKPX v acircumflex -26\nKPX v adieresis -26\nKPX v ae -29\n" -"KPX v agrave -26\nKPX v aring -26\nKPX v atilde -26\nKPX v c -26\nKPX v colon -4" -"8\nKPX v comma -46\nKPX v e -30\nKPX v eacute -32\nKPX v ecircumflex -32\nKPX v " -"egrave -32\nKPX v g -36\nKPX v hyphen 0\nKPX v l -29\nKPX v o -26\nKPX v oacute " -"-28\nKPX v odieresis -28\nKPX v ograve -28\nKPX v oslash -29\nKPX v period -51\n" -"KPX v s -30\nKPX v semicolon -48\nKPX w a -26\nKPX w aacute -28\nKPX w acircumfl" -"ex -28\nKPX w adieresis -28\nKPX w ae -31\nKPX w agrave -28\nKPX w aring -28\nKP" -"X w atilde -28\nKPX w c -28\nKPX w colon -49\nKPX w comma -47\nKPX w e -32\nKPX " -"w eacute -34\nKPX w ecircumflex -34\nKPX w egrave -34\nKPX w g -38\nKPX w hyphen" -" -4\nKPX w l -30\nKPX w o -28\nKPX w oacute -30\nKPX w odieresis -30\nKPX w ogra" -"ve -30\nKPX w oslash -31\nKPX w period -51\nKPX w s -32\nKPX w semicolon -49\nKP" -"X x a 6\nKPX x c 0\nKPX x e 0\nKPX x eacute 0\nKPX x o 1\nKPX x q 2\nKPX y a -12" -"\nKPX y aacute -12\nKPX y acircumflex -12\nKPX y adieresis -12\nKPX y ae -17\nKP" -"X y agrave -12\nKPX y aring -12\nKPX y atilde -12\nKPX y c -15\nKPX y colon -48\n" -"KPX y comma -21\nKPX y e -19\nKPX y eacute -19\nKPX y ecircumflex -19\nKPX y egr" -"ave -19\nKPX y g -34\nKPX y hyphen 7\nKPX y l -18\nKPX y o -15\nKPX y oacute -15" -"\nKPX y odieresis -15\nKPX y ograve -15\nKPX y oslash -16\nKPX y period -25\nKPX" -" y s -19\nKPX y semicolon -45\nKPX zero four 14\nKPX zero one -50\nKPX zero seve" -"n -3\nEndKernPairs\nEndKernData\nEndFontMetrics\n" -; -int n021023l_pfb_len = 45458; -char* n021023l_pfb = -"\x80\x1~\x6\x0\x0%!PS-AdobeFont-1.0: NimbusRomNo9L-ReguItal 1.05\n%%CreationDate" -": Wed Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Develo" -"pment\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file " -"COPYING (GNU General Public License) for license conditions.\n% As a special exc" -"eption, permission is granted to include this font\n% program in a Postscript or" -" PDF file that consists of a document that\n% contains text to be displayed or p" -"rinted using this font, regardless\n% of the conditions or license applying to t" -"he document itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05)" -" readonly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. " -"See the file COPYING (GNU General Public License) for license conditions. As a s" -"pecial exception, permission is granted to include this font program in a Postsc" -"ript or PDF file that consists of a document that contains text to be displayed " -"or printed using this font, regardless of the conditions or license applying to " -"the document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999" -" by (URW)++ Design & Development) readonly def\n/FullName (Nimbus Roman No9 L Re" -"gular Italic) readonly def\n/FamilyName (Nimbus Roman No9 L) readonly def\n/Weig" -"ht (Regular) readonly def\n/ItalicAngle -15.5 def\n/isFixedPitch false def\n/Und" -"erlinePosition -100 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName" -" /NimbusRomNo9L-ReguItal def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-169 -2" -"70 1010 924} readonly def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0" -" 0.0] readonly def\n/Encoding StandardEncoding def\n/UniqueID 5020937 def\ncurre" -"ntdict end\ncurrentfile eexec\r\x80\x2\xec\xa8\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1" -"\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1" -"fK\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88" -"\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3" -"\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2" -"P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81" -"\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>m\xb5" -"\xb9\x9c\x8d_\xab\xb6\x6m\xe5\x99\x4\x92\xcd\xee\x63\x62k\xf\xaf$u\xd8\xb5\x8f\xc4" -"\x3\xfd\xcf\x43\xc0\x34\x80u\xd6l\xbai\"\x95\xaa\x62\x63\x8f\xaa\xbb\x42\x8f|\x9c" -"\xc2*/?\xb8\x1f;\xc2\x66\x9d\x2\xdb\xf7\xd2-\xb2\xa9\xdf\xa3I4\xde\x3\x8e\x82\xdf" -"BkG3\xd3\xff\xd3\xef\xb0\x8\xc3\xf6\n+_\xa2v=\xad\xd8`d\xc3\xde\xb8\x81\xfa\x33\xe0" -"\x82\xf2x\xfe\xe6\x8b\x46\xf6\x10\xb2VT\xae\x96 }\x81H\xe0\xf5N\xf9\xbbx)c\xfe\xeb" -"l\xbd\x36\x64\x18\x42\x19[K\x1e\x42\x17\x39rra\xe5\x7fJP\xf6)i\x87\xde\x8f\x66_X" -"#8\x88\xaf\x1f\xfb=\xbdW|\x97pS;\xac\x6\xa0\xe3\xcb\x91\xdf\xb6\xe0\x31\xe\x8d\xf1" -"\xda\x1f\xdb\\\x32[\xba\x61$\x4\xb3\x98\xe3\x92\xcd\xec\x45\xa4W\xd1\xe2\xb7/M\xad" -"\xceMH\xc4\x39U\xd4\xc1\x94\xde\xf0\xc1\xd5\xf3\xb4\xb\xc5<\xcf\x66\x8w\xac\xca\xec" -"%\xcd\xe6;3\xc3\x8c\xf4\xe7'\xd8LT\x18\xbb\xedr\xafQ\x11\xea\xa1S{\xcbi\x83\x10\x45" -"\x1d\xb0\xecQ(a\xae\xde\xce~H\xf2\xe4\x8bR\x81#\xe0T]\xba\xc9\x61\xf6\x8f\x46\x2" -"\xcd\r\x94\xd4ux\x87\x8eQ\xc0j+C\xc9\xed\xef)\x19\xa6\x8fx\x9d!\xcd\x7\xe9\xa3\xdd" -"\xe4;v\x1d\x33\x88/\xfds\xcb\xd2\xa6\x44\xeb\xe9\xc1\xea\xf6\xfd\\\xeeH\xb2+A}}\xb7" -"\xf3\r\x8f\xf9\xe7\xd7\xb1\x8a!\xad\x85\x9a\x1f\x4\xee\xa0\xfb;P\x87)\xa5\xfe-c\x82" -"\xf2\xb0\xf8\xe0x\x80:\x9d$SU\xda\x2\xd3\x1j\xb2\xc8\xb2X;Mw\xd3\xac\xfb\xc3JU\x9d" -"5\xbb\xd0\x37\xe9\xc5p\\\xe7'\xc2\x64\x94 w{ C\xdc\x95\xe3&\x84\xe5\x9e\x30\x0\x95" -"E\xce\x0\x8eX\x91\x89\xf\x30\xe5\x9b\x9\x85\xc1j\xb2\x18\xd4\x37K\x99\xe8\x14G\x4" -"\n\xc6x\xbb\n\xa5\x84? h\x85G\x9c\xce|\xdbS?\xaa\x80\xd6%\xf1Y\xc2\x7f\x86\x41\xbd" -"\xc7\x65\xf7\x8\r\x35\xbd\xbc\x9c-\x15\xa3\x1c\x66\x87\x8)\xa7\xe\x7f\xcf\x61H\x89" -"5\xe5\x35\xb6r\xecW(\xc6}\xe8\xce\xa9!\xb4\x93\xd0\x8d\xd3;\x90$\xa6\xa2W\xac\xbc" -"\xff=\x9a\r\x62'\xdf\x1e\x8c\x8c\xf1\xb2\x14\x9a\x9e\xaf\xa1\x62\xf1\x8bZ\xe8I\xc7" -"\xa9imLq\xaf\x9b\x46,|\r\xa5G\x1b\x18\xbb\x99\xf2\xaevU\x16\xfa\x3\xb9\x87V\xb7\xdf" -"v\n\xc4\xd0\xb9\xf8\x85+\xbcg\x86\x96\xff\x9c\x95|d\xb2\x93\x9e\xcdm\xdc\x18\x85" -"]\xe0gG\xb2\xf5\xf5\xc4\xfc\x4Q\xf6\x9f\xa6\x10\xech\xbf\xe\x92=\xcf\x36\xb5}2\x92" -"\xf2\x91\xf4M3\xc5\xa6\xb5\xbe\x7fPe\xe4\x1cl\xaf\xb0\x65|,\xf8\xec\xf8\xc6\x42\xa3" -"\xb1\xe1\x1e\x9a\x7f\r\x44\xb6Zg\x8b\x1d\xe0\xeb\x5\x19\xa2\x31\xae^\x96m\x8e\x84" -"\xc6n \xf2\xdf\x99\x0\xf7\xdc\x83\x85\x98 \xe8\xf6\xd0\xd7\xfa\x8a$.\xbd\xff\ni\xd7" -"p\xc6\xca\xe\x35\x8e\x7n5\xe0\x63\xbK\x9e\x93\xb6I\xab\xd9\x8f\xe2\x9e\x46\xa3\x63" -"]*c^(l\xb7\x32\xe4\xe0\x32G\xda\x2\x45u\x16N\x16\x97\xaa\xfc\xcf\x12J\xf3\xc0h(\xfa" -"z\xef\x4\x64\xf8\n\x95U+O+\x95R\xc8\x6\xaf\x86\x80\xce\x1e\xac\x41\xa1\xa5Y\xe5\xd0" -"\xe2{R0\xe\xfd\xb9\x91\x8cmHF\xb6\x2\xe7\x94\xb\xad\xe0\x81\xb9\x96\x5\xa1\xf4\xad" -"Nof\xf0\x32~\x8dZF\x87\xee_\xdc\x6W\x1f\xbcso\xd8\xcaP\xcf\xfbn.\x8b\x87\x1b\x96" -"\xfdN\xf<\xdfY\xac\x88\x8&\xa8\x98\x8e\x1f#z9\xef>\xcd-+V\xbd\xf/\xc2\xd4\xf9\x11" -"g]\xeb\x9t\x19<\x7f\xd6*\x83\x96G\x9d\xad\xf9\xddP\x6\xaf(g\xael(}\x16\xf9`\x7\xaf" -"\xa6Z\xf4\xfb\x64\xeaI\xd4\x85\x36\x81i\xd5P\x5\xa0$J\xe3[E#x]\xa7\xaf\xf8\x14TD" -"\xa2\xc6\x12\xda\xdd\xbb\x9\xf2Z[\x1d\x96?HX(\x96\x37t\xd2&\xc9\xb3\xfb\xbf\xe9\xdf" -"=\xd3}Y\xfdM\xba\x19@\xac\x1fS\xa8\xefH\xb8M\x0\x1f\\\x97\xb6X\x1d\xbb\xe3\x19_\x6" -"\xc3Xw\x17\xc2\x9f\xee\nN?d\xa9\x95\xc6\xd0w\xe0\xdf\x80\xae\xbb\\\xa9\xb4\xc4\x97" -"\xad\xee\x9a\xde\xc8\xcb\x81|J\xd5&`:\xe5\x1f\xf4\x42\x66\x32\xf2\xf6\xfb\xb6\x80" -"\xbb\xf\xb0\x87\xe0Y\xc1rx\xb4\x30\x13\xda\x6\xff\x41\x18\xec\x96Q\xc4p`\xc7\xf\xa5" -"\x8a\xc\xe1,\xf2/\x8d\x2\xbe\x7\xad\xcc\x9cV#\xe7\xdaSE>\xe1\xe6r\x8c\x7\x1f\xc3" -"\xfa\x65t\xe2\xca\x1c\x35\x92\x95\xc7\xd2\x96 t3J\x84@\x88_,\x85(\xc8\x83v\xc6\xf9" -"=W\x8bG\xfa\xbb\x11\xf5\xf0S\x8f\xffTqc)\x9a\x8!\xe4,\x97\xcc\xa2\xcc\xd7\xb1)\xe4" -"'\xfdz\xba\xfeZt\xa5\xa1\xdfH\xbb\xd1r\xcc\xe6\xcd+`\xec!&_\xafP\xec\xa1\x86\xab" -"\xa6\xceo\xb6=p\x7\x43#\x1d\x30\x33\xbe\x61\x1c\x8a\xd1o\xa9\xa2\xf5$\xf1\x1d?\xc3" -"g\xe4\x61\xab\xf5\x65\xbd\xde\xab\xaf\x38[\xb0\xff\xb6\x34[x6\x95\x30\xeIa\xe4?>" -"t5\xb7\x95W\x9e\xe3Q\xd9\x97\xdaX\x11\xcd\x45j\xc4\x16U\x19\x12\xa8\x9d\x32s\x9d" -"\x3\xe8\xe2\x43\xcw\xce\x97\xacw\xb3\x8a\xe5\xbb\x3\xe3\xa6~\xef\x8f\xb2\x7\xac\xb0" -"\xe1\xdd\x11GGbb\x4:d-f\xa4\xfd\xac\xfb\xe\x9a\xbf\xda\x12\x18\xdd\x62[d\xfc\xe5" -"\xd4\xb2L%\x4\x5\n\x88\x1c\xa0~\xce\xa1;g\xc3\x82'r\xb6x\xe7\xfdR#\xb9V\xd9\x45\x80" -"\x8f\x9b\x97\xc7\x35\xa3\xab\x88\xdb\x31\xa8\xb1L*\xc6}\xa0\xc5\x17O\xc4\x9f\xe4" -"\x1b\x61/\xcc\x5-\x8\xc1v\x4\xab\x43\xdb\xe2\x6>9\xe2y\x9d\xb1\xe7k`;\x8\xf3J!\xfe" -"C\x0\xaa\rz\x91\x1c\xfa\xe6\xce\x35)\x16\x45\xaf\xbe\xd9\xcd\x0 N~\xb0\x34;eG\xfc" -"\xce\x9c>s\xdc\xe4\x18\xdc\xba\x81\xd1\xa0?\xce\x87\x32\xdeT@\xff\x98\x35l\x6\x34" -"\xa1%\xc6H\x81\xdc\x5I\xe2\x9a\x82\xc8.\xb4\xaf\x99\x98\x7fo\xfdQ_\xbeW\xd3\x90\x86" -"w'S#\x9f\x92\x36\xa2\xb6\xaa\xbb\xdb\xc4\x19\xef\xe2\xbd\xaa\xc+\xde\x84\xc4\x33" -"\xf4\xd7S\xf6\xcc\xf\x3\xe7\x9fZY!\x0\x82\xcb\xbdm\x84\xacL\xaa\"\xea\x30\xf3\xdf" -"Mk\xb4 |\xbc\x1bg\xe4\x9\x86\xcdO!5\x4\xb0\xcc\x32\xfe\x84-\x89\x65\xa9\xe3\xb5\xf2" -"8\xbf\xe2\xfaOXr\x83\xeeu\xb0\xc6\xf1\x8f\xec\xc1\xce\x37\x34\x87,\xdb\xa5\x30\xe9" -"y\\\xbe\xd2\xc7\xca\xa8\xe2\x92!\x17\xab\x1W\xa1\xd9z\x8a\xd9\xedL\x84[GzR\xf0\xbe" -"}\"\x14\xe9\x1d\xdf\x98\x1\x0l\xf6\xfd~N\xf8\xbaJ\xc3\x11\xb5u\xf<\xea\x17\xe6\xf6" -"\xeb\x6\x8e\x9a\xd2\xcb\x30\xd4\xa4\xe0\xaf\xdc:\xa7\xaa\xb2I\xf7\x6\xde!h\x10\x88" -"\x4\xa4\xdc\x1b\xf5\"\xb8`\x92\xe5\xc9\x90\x98\x34^\xb2\x12\x37h\x9c\x91L\xda\xcd" -"\x8eR\xa8\x7\x41}CA_\xc0k\xe\xc1i(\x1fo\xcayA\xd7\xcc\x38\xb0\x9d\xfe^<\xd9\xee\x84" -"\x12\x90,\xb8\x8d\x44\x31\x9f\xba\x90G\xe9\x3\xc3\x46~Q\xd9\x1\xeeGO\xc8\xae\\\xc9" -"\xfc{J)\xff\xb9\xe5\x3&D,\x14\x94\x8fy\x80\x66Z5\x82\x33\xc6[\xda]o\x6T\xd9\xb8u" -"\xe9\\\xa8\x16\xa9\x15q\x80h\xfe\xb3[\xa1\x18\xbe\xb4V\x3\xa3\x98\xe0X\x5\x7\x63" -"u\x2G\xaaI\xa1\x8f\x12\x30Xy\xe2\x30\xe5\xaaZ\xc1t#\xa7\xc1{\xbe\x83\xafV\x90(#\xcd" -"8\xfd\xf5<\x81V\xdd\xd1\x96Ym\rR\x81\xc2\x98\x42\x18\xbcNR\x1\xe5\x88\xd5s)\x7f\xe1" -"\xe3K'~\xb4\x11\x46\xcc\xbd\xa3p\x82\x80\x86\xff\xb6\x83\x7\x83\x93\x89N\x9e)7&y" -"88\x85(\xc5+g\xe7\x8d\xcd\r`\xaf\x90\xc8\xf1\x95\x34\xcai\x17 C\xe\r\xe1'\x8c\xd5" -"h\xa9\xaaq\x1e\x31\xc5vxy\xaam\xda\xbc\xfb)\x84\xbe~\xf3\xd8\x9a \x10\x62\x38M\xb" -"k\xca\\wc\xb2\x83Y\x18\x65\x18\xd1\x1}\xe\xf0\xf4\x97\xd6\x9c(\xe0\x43\xc0\xbd\xb3" -"\x88\x34\xa8\xfc\xe1r\x9bX/\xf5'sE\x14T/\x1\xe4\x85\x7fY\xdb\xa8``\xe9\xf0\x99\xfa" -"q]\xec\xe2k\xe\xfa\xc4T\xc5@\xe1\xae\xb8S\x1d\xa9\xe8|/\rz\x3o\xe4H\xd2\x61\xaf\x1a" -"\xde\xbb\xc6\xe7zt\xaa\xd6\x46\xfaS;\xee\x10\x91K=;+q\xff\xdf\xf6\x64u\xe9\xfa\xea" -"\xc8\x9a\x64\x43\x95\x9f\xae\xf4\x33\x37\xee\x16\x87\xe2\x17\x13\x33\x8\x1b\x92\x0" -"\x96\xa0`\x93)o\xd3\xc4\x66\xe2p\xb0\x15orZh\xf4\xcG$\x16\xb3\x13\x5\x84\xc9\x63" -"#\x19\xb2S\xdb\xb3)@\xbe\x16\x17\xb0\x11\xa1\x1d+\xad\x11\x62\x2\x44\x34\n\xea\xc1" -"\x87\x1\x45PJb*e\x8f\xcf\x9f%x\xa3\x30`\x1b\xed\x12|p\x18\xc5\x98\xeb\x37\x99\xce" -"\xdd\x13,U\x1a\xbb\xdd\xeb\x38\xa6~\xccW\xc5\x84#\x1a\x82(\x4\x97\\Ic%\xe5IoT\xef" -"z\x0Q\xffj\x11\xe7\x38\xd4^\xde\xce\x8a\x92\x43\xe3\xd1\x66\x97\xc5\xff\xbc\xeb\xc4" -"\xc4\xbd\xaa\xed\xfd.\xbf}H\xdb\xbe\xd9Q\xbe\x96\xec\x19\xe8\x62\xa1\xc3\x80\x33" -"\x99\x9c\x98\x9d\xc0\xcd\xaa\x30\xa0\x87\xc5\x8ev@\xea\x8b\x32\x44\xaa\xe1\x37v\xa9" -"\xb8\x64\x38\x34^\xd1\xc4\xebp\x9d\x5\xaa^\xc0\xd3j\xa6\xdcl \xb3Z?+\xa9[\xc2S\xcc" -"#\xc\xdct\x18\xe8\xd6\x38\x36Q[\x8d\xe\x14\xa2\x6\xf4\xac\xd6x\x7f\x9dLM\xc9\x43" -"\x15\x32\xd7[\xc\xb4X\x96,\xae??\xceJ.D\x85m\xda\xd0\x84~\xfe\x44\xc7\x2\xb0\xde" -"=\x93r\x18\xb8zg\x81\xdd\x38\xb1\xa4\xac\xe4\xb1$\x11\xb\xea\xd6\xfew,\xf2i\x4{?" -"\xe1\x14<\xc1\x84\xc9v\n\xba\x9c\xbe\xab\xde\x34qm\xd5\xba\xc4\x83\x30\r\x65\xb\xbd" -"\x1e\x19\xb5\xc7\x38\xf9\xb1\xb0K\xed\xa4P*\xbd\x12\xe6\xb3\x2\x97\x62LQ\x13\x1M" -"\xcc\xe4z\x8a\xba\xe0\xf4\x66\x1f\xd2\xcf\xdf\x35\xad\x44\"\xb2\x8c\xf2\x87\xa1R" -"" -"\xc7\x64\x13\x94\x19\x37\x39#\xd5j\xd2]\xd4\xa8\x5\x8e\x91\xe4Pi\xbc\xb0\xa3\x37" -"\xe5L\x3\xd5l\xed\x11\x11Z\xf7}\xb5?\x80Z\x87?\xfd`\xf5\xa3\x83\xd3\xde\xc5\x8b\xc" -"O\xd9:\xac\x8\xfb\xdb\xfc\xb9%/\xcc\xda<\xd2\xa9\xc1\x93\xcb\xe,\xba,n\xb2\n\xe\x0" -"6\xfc<\xd9\xe2\xfd\xe3\x84\n\xa4-\x11\x97T\xda\xebL\x88\xc6\x6\xd7Q\xe9T\xc8\x18" -"\x8d\x1d\xe4\xe9\x61\x39Q\xaa\xcf\x66\xc8\x9;\n\x91j\x4\x1d\xb5\x44\xf6\xd2\x2\xe9" -"\x81o\x86\xd9\xe1#t%C\x8\xf6Y\xd2pDp\xf2?\x1c\xc4^\xe5\xb7)\xeeP*\x86$\xfcl\xc\x94" -" +\xa4`2\xa8\x16\x89\x1\xec~+\xb1\x39\x15t\\\x7f!\xf1+\xf8;\xeT\xad\xa5s\xff=@\x9c" -"\x86\xfc\xaf_\xab\xaa\xea\xe9\x98\x8\x6\xe4\x3y\xf4\x18\x6\xb7\xc3\xd7\x32\nnk\x2" -"SuC\xc6\xe3\x9e\x82T\xed\xfb\xac\xc5\xe3\xe9Ir\x7\x31\xdc\xe4\xf7\n\"\x1e\xec\xd4" -"%\xff\x9c\xd9\x95\xde\xaf\xe9\xe0\xb\x1\xfa\xd7p]\x8d\xfa\xe1\xa4lU\xb\xae\x9\x97" -"\x9c\xb4\xc1?\xddw\x15\xed\xde\x1a\xd0\xb2`\xd2W0\xf8y\xcfg\xa7\xf4\xab\x46\xdc\xad" -"\n\x6\x88\xe0X\xab\x32\xe2\x1bq\x8f\xcb\x38\xc8I\xb8'\x8a\x81\xf0T\xbc\x8c?i\x93" -"\xb\x65\xcf\xb7\xbb\x93[\x1a\x11{\xffPXCc\xed\xb2\xet[&\xcd/\xa9\xd7\xc4N\xa4\xbe" -"\x12\xbd\x86\xfeL\xd0\x39\xbb\x45\x80\x39M\xdb\xb0\x64\xbb^o\x16\xa2\xc5\x1d\x96" -"\x8e\xc\xd8\xdc\xa0\x43\xdb@\x19\xbc\x81\"\x65O\x3\xf9\xbf\xf9\xc5\x1b\xa3\x66\xd4" -"*\x86\x18\x94\xbb\x91y\x7fh\n\xfb\x3{\xb6'\xe0\xfb=\xe8\xca\x37\x4\x8o\xa4\x17\x81" -"E\xdc\x1a\xc8\xc0\xd9H\xfb\x90Z)b\x1d\x12\xf2\xd9\xf8_\xdb\xee\x98&\xda\x1\xdd\xf" -"\xe1\xb0\\\x8e\xad\x9f\x9e\xa9\xdc\x1f/'\x94\x1cX\xe4\xf5\xb\x90m\x8e^~\xf9\x1a\xc1" -"\xac\x38\xf\x35\xcb}N8.*H\x15\x9d\xddOM\xfc\xbcr\xb8+\xc4\xe4\xed\xdd\xd3\\\xc4\xdd" -"8w\x86\x80\x9a\xbc\xa2\x12\x9f^\xc2H\x94\xff\xec\xda\xb2\xd4\"\xaa\xdaPa\x1f\xc0" -"\xf2[\x4q=_\x1c\x87yOBV\x2\xb\xf2\x19+\x95\x94\x62sg\x4\x85,\x8c\x9a" -"\x13K[C\xdf\\\xe8\xd3\x9d\x61\x8fOvas\x92!\x85=\xfd\xfa\x7\xfe\x94\x1\x1a\xb\x87" -"e)\xa1u\xe\x1d\xf3\xfc\x94T\x8d\x37\x39\xb2`\xcc\xea\xd2\x2\xaa\xbaqN\xea\xf6\xb" -"\x11\xb3\xc1\x18\xc2\xbc{:E\xd6\xff\nj 2q\xb9Xb\x11\x31\xd0\xf1\x19\xdf\x86\xb6/" -"F\xe3\x84\x8bsg\xdfh\xc3\xde e\xa7rs\xb3\x62\x2mM\xea\xdd\xbai#\xfd\x8cn&\xcf\x9f" -"\xb0\x3\x9d\xa5\xf6\"\xf9\x31J\xfe\x42\x85\xc7\x31\x35\x13:\x1c\x84\x36\xd7\x11y" -"\x1U\xe1\x7\xa4>\xf4y\x5\x8e\xc3 \xec\xbd|\x97\x93\xc9\xa5h\xc4\x2\xe5\xb6N\xd3\x16" -"\xd8\xe1\xafs\xb8\xb8)\x85\x96\x39\xfe\xf4\xeb\xff\xff\xbbtd\x0:\x1b\xe4\xe6x\xaf" -"h\xff\xdb\x41i5\xbf\xd2\xb3\xb7L\xf6\xfa\x8d\xf\x19\xa6\xc8\x91\xc4\xd8\x97\x33y" -"\xd1\x44\x8d\x9a\xdd\x63\xff\xcc\xe9\xad\xf1\x16\x9c\x1f(\xcf\xc4\x89\x32\x99\x9c" -"f\xcf\xc0{YO\x1a\x91\x1f\x39\x15\x38\xe0h\xab\xa6\x84\xac^\x85\x31\x7fH\xf2p8hN\x1b" -"F\x9/\xbe\xefx\x14O7\x1f\x16\xa4~\x87\x1f:\x89\xb4\x13\xfc\x97\xcc\x45\xea\x81\xbc" -"m,\x1a\xf8\xf7!\x3\xf1\xa7\x41-!E\xefM\xb3\xf9\xb3~\x13\x98\x0\x83\x1f\xd2Z\x9a|" -"\xcf\x7\x16\xc4\xe0\xac\x33\xb3i\xeb\xfa\x1b\xab\xc1:K\xed\x15\xf2[\xea\xe9\xaf\x30" -":\xdf\xa5U\xf1\xa0\xe6\xc5\xe3\x17\x1b\x41\x93jf\xaf\x8d\x1f)\x8fk\x8b\xe4\xc4\xdb" -"\\\x98l\xad\xd0\xd0o\xe7Jp>>\x8f>\xfd\xbb\x95m-tx\xb*\xc2\x93-\x11\xa2\x17t\xe8\x2" -"F\xd6&\x9d\xd5\xb9\xfe\x30\xb4\xfe\xb6\xd7\xa4\xaa\x90\xb2r:@qX\xc7h\xf7\x95\xc6" -"\x89\x19\xfb\xc1\x66/e\xc9Nc#\x1d\"\xb8~a\x85\"w@\x89\x31\xdct\x85\xe7\xe\x8c\x80G\xe8P~\xf8\xd6\x8d" -"W$pE1%;\xfa\xd3\x18\rO$-\xf7Q\xe7\x5\xe9\xda\xe3-<=\x17~\xad\xf9\xbb\x1a\xe6\xf5" -"q_\xdc\xc3w\xb1\x41\x96G\x17\xa1\xfw\x92\xdd\xbfO\xcb\x46\xd7'\xa6\x63\xca^\xfb\\" -"\x8c\xca\x32\xf\x14I\xd3\xe0\x11)\x84 \xd1Q\xc7\xb1\x1e\xd3\xd5\x84\x84\xe5^3\xe1" -"\x86\xc1\x1f\xbf'\xd2\x6X\xd5\xa2?xM/\xe1\xc>:\x9\xff\"\x96\xa4\x10\x5\x12,;\x92" -"\xbb\x96\x0\xc9\x96\x83\xc0\xbeq\x80\xb2\xe3\xdf\xe4\xda#\x98/\xba\xc3r\x17u\x85" -"\xf9\xb7\xfa\xfaq\x89R\x1cx\xae\xf4}\xe1iK@\x86\x3\xa0\x34\xfd=\xe5]\x97\r\xf7\x9b" -"\xc4\xd1\xaf\x63\xaa \r\xd6\x85\xdep\x16\xc0\x87\x61+4\x88\n\x96t!\xa5\x8\xd1}\n" -"Gc\xf1\xd4\x91\xd8\x88i\x1e\x45R\xa6\xa7\xc4?U-\xae\x34\xfK\xca\x14`2\x12\x42\x87" -"\xaf^;\x96z\xc5\x63r\xf1yt\xa6\xbT*\xdb\xd6\x31\xae\x13\x43KM\xce\x44\x82\xe9\xba" -"\xd1\xceL\xb6\xad(\x19\x19\xff\xb8\xe\xe1\x66\xccLM\x11\xa9\x8c\xbb\x63Y\x17\r.+" -">;g\x19\xb\xf6\xfd\xa3\x9f\xefS\xecI\\\xb9\xb9\x8d\xe\x31(\x98s\x82\r\x46LC:\xad" -"\x8d\xbd\x44\xf6\xf2\xe0/\x8b\xf0%\xec\x90\xaah\xb9\xa5m\x1d\x11J\x9\x63\xe5\x91" -"\n\x6-\x99Qz5\xbc\x45\x18\x16\xd0\x43:\xf5\xde\x89\x9a\xa4>\x91\x98\xc\x46k>\xc2" -" \xc7\x19\xb6:\x97@\xac\x31\xce`\xd2\x18\xa8\x99n\xcd\xdc\xeb\x98\xc2If\xa8\xe2\xd0" -"\xb7\xcb\x98\x95\x18\xb5I=~5\x7<\x97\xbd*9\xa8\x13\xfcH\x91\xb4\x9e\xfc\xa3J\xbe" -"~\x91:\xcf\xc7\x97\xeb\x1\xa8w\xc8$.\xee\xdft\xc1\xb8\xa5(\xd5\x9d\x8c\xd7Q\x8\xcd" -"\xd5\xb3\x17\x38\xfa]\x97\x37\x1fQO\xfe\x0\xc1\xaa\x1b\xe3\x41\x89\x8dx\xfb\xfb\x9" -"\x1f\x44\xabV\xf5\x34\x98-\xef\x61\x18\x9ar\x12o[#+\x0\x5\xa5\\g\x17P%E\x3\xbb\xc" -"\xafM\xf4\x41R\xe6\x10\xaf~\xa1\\\xa3$P\x81\x7\x6r\x9a\xb4\xc9\xba\xfe\xea\xbb\xa1" -"2\x1e\xde\xb\xfe]T\xa6\x1f\x1fk~`\x8e\x6\x4\x63\xd2\x34*\x0\xe6\x2\\\x1cGqM\xb0\x91" -"\x9b\x66\xc5\xf9&\x95\xfa\xa3\x35\xdd\xce\xdf\xaa'\xaek\xbc\x62\x8dm\xd9\xed,m&\xda" -":\xc2u\xee\x39\xf4'\xbf\xf7\xba]\x86\x1c\xd4+\xed\xb3\xb9\xb1!2>#\x88\xe2\x62+\x81" -"f\xea\xce_\x18\x91\xe5\x41\xcxV\xd5@\xb6\x14s\xd5!&\x1e\x5\xb1\xd7h\x8e\x9\xf5)\xe3" -"\xb6\x9b\x89*\xa4?V\xfe_\x85\xbc\x4\x2X\xdb.`\xdb\xa9\x7\xb5\xb\x15\xe5m\x1f\x8f" -"\x2\xd7\x89.\x18\xe9\x18\xb6\xe5\r\xeb\xcf=@\xb0\x3\x9d\xe5\x82\x9P\xae\xb0\xd8\x9e" -"{\x1d\n\x1d\x88\xee!\x12_yO\xbc\x44\xd4\x1b\xd7\x1f\x80Jy\x17\x5\xbc\xd9\xe8s\x5" -"\x1cs\xfc\xb1SZ\x6\xc5?\x9c\x31$\x98\xac\xfe\xf6\xfa\xacm\xe9\x41\xc9\xad\x61%\xa5" -"b\x91Oy\x3%[9t,\xea\x99\xed\x4G$\xc2\xc8ml\xecW\xff\xe8L\x98\x36>\xa4\xb8\x31\x16" -"\xd2\x97\xc7\x61+*\xfc\xef\x84\xe0<`\xbep\x13v\xc8{*\x99\x19\xb9x\x82\xe8\xf1:\xb3" -"H5\xccO9>S\x1\x39\xbe\x17\xdb\xcb\xe7\xeb\x1f\x9eO\xa5\x12\x1\x4\xd5\xf4\x82pi\x91" -",X\xd5\x9c\x1b\x37\x9fyt\x1eM\xf1\xd6\xd5\x6\x42q\x89\x93\x10\xb9\x37\xa8P\xc7\"" -"\xafS\xd4.\xec'\xe6\xe8[\xb8\x93\xf\xaa\x87\xa5\xc\x93{P\x86\x95\xf1Fj\xe8" -"\x3\xb1\x10\x62\"\x9d\x8b`\x1d\xb8\xc3\xa3\xa5\x8e\x15\xe2\xc9\x8\xb9V\x2\xf4\x65" -"\xd1\xadK /\xaa\xb0\x43\xcc'/\xa6\x7\xc4\x89\xd6UTy_8\xfe/\xd8\xb5\xc7\xd4\x8\x17" -"\x9b\xc9\x89\x36\xdb\x13\xa9:\x84\x16\xde\xf7G\x9e\x6p\x8b.\xf4\xfd\x61W\x16wH\x8b" -"^D\x87>\xfd\xa2\x93\x38\xbZ\x4\xa4\x93\xf6\x37\xff\xbbh-\xf4l\x8a \x8f\xc3\x14@S" -"\xd4\xcaj-h\x12\xd4go;\x1a`\xdc\xf2~\x87\xb2\x18m\x93\x1d\x91 \x91\xe!U\xadO\xfd" -"djN\xa0\xe4$,c\x88m\xa7\x0n\xb5\xc0\x4\xb5O6n\x18\xb4\x96\xacw`C\x18O\x97\x80\xb6" -"}\x11\x92J\xaf\x0V^\xb0\xe7\xf\x93\xaa\xd9y\xd9Sgt\xd6\x82\xc6\xcd\x11#\xcb\xa5>" -"\x92\xcb\xdft\x86\xac\x8a\xd3\x84\xb4{\xcc\xe8\xa5\xbf\x31+\xa4\x34Y\xbbOe\x88\xfc" -"3\xa4ht\x7fVyj\x8f\x43\x42Q\x7f\xd7U\xa0\x8d\xceg\x13\xf6RH\xab\xaf\x7\x92\x1v\xa6" -"v\x19\\\x66\x9ey,\r\xfe\\\xb9Zz\x1a\x13\xb7\rn\x82\x2\xb9\xd1\x46Z#\xe0" -"\xb\x10\x13\xd4\xaa\xbc|V\xc2x\xac\x81\xf8\x38\x33G%\xf3\x85\xe6\x36\xf8,kI~n0\x82" -"\xd3\x9eq-\x8c\xafT\x0\xd4\xd5@_\xe\xf0\xee\xc7\xb1%\xc0lWjt\xd4\xd6\xdd\xee\xf3" -"mk,\xba\xcbLlb\x8d\x63!\x92_{\x99\x13\xd1\x95\xa1^\xadl\xdfI\xdc\x86\x4\x36\ny'\x1e" -"\x13j\x82\xf7\xe2%\x11\x42\x16\xdd\xb4j\xbe\x92\x7\xb0\xb8\xd5K?\x83\xa2\x30\xc4" -"\xc\xdb\x98%\x39\xbd\xf4\x35\xa4\xd0\xd8 4\x8f\xb4\xe5\x83\xb8\xe\xc6\xa6\xc9\xe1" -"m\xc5\xab!b\xce\x97\"\x91\x15\xbdn\x9b\xdf\xce$d\xd6\x43h(\x82\x11t\x9eZ[XS\xaa{" -"\x9bt\xaa\xbd~Y\xecg0\xa1\xd2\xe5\xb1[\x5%\xd2\xd4\xaa\x8e\x19\xd8\xd6\x8b\xa6\x61" -"\x84\xcHX\x5%,D\x8-\xb8\x18\xc1t\xa7\x3p\xd8\xd3\xc3\x66\x66\xef\x61g\xdb\x36ShT" -"\xc1\xd3\x44 [VA3\xd4\xf0\xf5!\x85\x7f\xa3\xfc\xb7g\xbe\xfc\x65\xb2\x43\xf4\xd5(" -"\xf1w,\x9c\x96\x32\xa5\x17\x8ch\xad\xa7M \xf3\x17 O\x82\x1eJ[r\x97\x1c%;Z\x5[\x9e" -"\x90\xf5+\x19z\xb3\xc\xe1S\x91J\xf9l\xed\x96\xbf\xcc\x64{\nz\xe1\x3qK\x11\x31=\xe1" -"\x99R\xf4'\x80\xa6\x6\x87Q9\xdb\xbd\x8d \x91\x31\xef\xd3\xae\x97\x9by\x9c\xd9\x18" -"6y%\xb1\x12\xfd/\x8c\x34\xf7QSs\xffk@\xdb\xe6j\xf0gY\xdf\xaa\xe4N\xae\x1eJ\xeaR\x8" -"\x18\xbY\xb8(\x9a\x84\x91\xec\xa6~X\xed\x91\x92^\xd7z;ee\x1c\xdf\x7fz\xe9YLh\x80" -"%\xbaOn\xab\xb4he\xa4\xae\x41h\xac\x9f\xc7\xeaU\xe4\x9|\x82\x8:\xf9\xfd\xf9\xa0\x1b" -";\x94\xc8\xf4\xd2\xee\xca\xb6\x88\xdf\x38\x64\xbf\x8a\x14\xabnU\xb0\xb8\xa1\xf6\xfd" -"\x94/\xb2_\x19\x9c\x7\xb3\x65\xaf\xb8:Zx\xe6\x8c\xb0\xde\xa6Vh\x8]~\xd7\xe5\xb7\xd4" -"\x98\xf,%\x8d\xcd\n\xf2\x99\x5\x62\xbc\x36\x35\x99\x36\xf0\xae\xda\xecl+>\xc9xk\xe1" -"\xf6\xcc\xa1\xec\xc8\x6\x32\xbeS\x7\xe9yx6\xca\xb\x1dR\xa4\xa2\x86\xf4\xbc\x36\x32" -"N\x1a\xe9H\xc6\\\x36\x31\xd4N\x81\xa0nI\xd7\x81<\x85\x15\xe0\x85\xdf\x14=5\x96\x63" -"\xef\xe2\x8c#O\xa2\xe0u\xb9\xfe\xeaU^\xac\xa4\xd7\x8d\xac\x10\x8c\xa1\xff\x94\xf0" -"\x88\x8b\x1a\x92\xef\x94\xae\xa9\xda\xda\xf2\xffp\x8a\xffh\xa8<\xfc\xf7H\xbeG\xa6" -"\xc4\xd0\xd5{\x9\xef\x8f\xf4\xc6\xaen\xc\xcb\x32g\xb2\xbe[\x81x\xe6\xf2\n\x17\xa9" -"}5is\x1f\xe4\xab\x89\x33\xf9\xba\x88\x9b\xbf~)\xdfW\x82\xde\"Y\xc1O\x16\xa0\xe2\xeb" -"\x6\xfc\xef\xac\x8a\xb5\x8d\xcb$H\xeb\x99z\xeeo\x82\x9c\xce\x98{*\xb4N\x94\"\x61" -"\x8c\x8c\xb6M\xcf\x39ms\xf5\xc\xfc\xf9\xc\xbd)\xe6!\x93X\x1e\x39X|\xef\xec\xb6\xef" -"\xccQ\xb5<\x0\xde\x8f\x82?BIsf;nn\xf6\xfb\x64\xc2\xbf\xbe\x15\xe5\x14\x33\xcd\xf1" -"\xa3\xed\x82\x61=\xad&\xc6\x85+\x99\x93\xf2\xd9\x92\x44\xa5\xef\\\xbe\x62\xf5\x4" -"\x1en\x17S!#\xa3\xa7\xa8\xd0\x35z[\xd5\x43\x99T\x1aLp\x9b\x9a\xd3\xb7v\xfb\x0\x86" -"\xe2\xce\x1c\xb7KFj\xfd\xc4 }I!\xc4\r\n\x9e\xaf\xb6\n\x90\xfa\xafQ\xbe<\x1f\xee\xda" -"\xe7\xce\x14\x62~\xfb\xe3\xbe\xfd<\xeb\xc6o\xcd\x0s\xaf\xfa\x32\x64\x8d\x81j\x10" -"\xb0\xa3Q$\x96Gx)m\x6\xcd\x41\xaa\x18}\xee\xc0\xcc\xcfn\xf'\xe1\xb5lE\x11\xc\xaa" -"\xf1\x43\xca\xc6\xd1o\x84\x9\x1fq\xbb\x36\xd9NR\x9f\xa6\x7\x93\xe8\"\xa3\x9e\x10" -"|w\xdb\xdb\xfe\xe4\xfa\x1e\"\xc4Pv\x1b\xca\x92\x87\xca\x88\xd8\x19{\x11\xe1\xb0\xaa" -"\xd1\r\x63\xe9/\x9X\x15\xdc\x7Q\xa9&\x10\x46q\xe8H\x14NL\x96\xeep+c\x83\x1cO\xcb" -"\x8f\xff\xa5\x66\xcb\xd1\xfO{ \x93\xd8\x36\x87\x9dg\xf9M\xfc\x9b\xe|\x81'\xbeL\xd6" -"l\xa3\x1c\xc7\x66\xf2\xae\x36\xeb\xb6\x9b\x5\xa2\x44\xdb\x7f\xe\xd1&\xc8T\xbd\x8" -"o\xa4i\x8e\x1c\xa3\x16\xca\xe9\xb6\x82S0\x9a\x9\xbe\x1b\x8a\x61\x32\x88IX\xf2\x2" -"owv\x88\x9f'\xeaZ2{\xdeX\xd9\x34\x32\x9\xc7\xfi\xcb\x94\xd1i3(\xb9R\\\xa4\xf5WvD" -"\xb\x98\x64\xe7\x45\xc8\xcb.C\xd3\xecn\xac\x82\x1f\x83r(B:\x3\x41\xae\xfd*#\x88\xfa" -"\xfe\xfa\x1d\x42$\x1e\x8b\xbe\xc3\x35\xda\x34\xe1\x9i\x9e\xbb\xcf\xda\xdd\xf3\x81" -"\xf3\x37 \x17\x3:`\xe\xd4\xcam\xa7%r\x84(\xba\x45\xfe\xb5\xe7\xc4\xa1&N\xe6I\xe0" -"\xf0\xe\xf3\xbcp\x85\\\r\xfd\xd0#\xe9!kaj\x1\xe3z\xdf\xe6\x65\xbd\x13\xd5\x1a\x13" -"\xa0W\x10\xbc\xe3\x80\x63y\x8fzmK\x80\x8e\xf4\x2N\xad\\\xbf?^=\x89:\xde\xa0\\\xc2" -"\xa9\x64(q\xfb\xd4\x1d\xd7\x15l^\xd8J\xf8\xad\xc4\xde\xd1\x33\x1a\x8a\xcf\xd5\x1d" -"\xd8\xf9\xd9($\x9f\xe1\x81P1N\xca\xa4\xe2\x91\xeb\x13\xe7\xbb_\xdb*%\x91x\xe5\xf1" -"7\x1f\xe7\x80\x7f\x83\x82\xad\x14\x91\xf8iX\xdb*\xf\xc1\xd7\x2\x81%\xf9O\xb7#`\x8" -"\xe7\xb\x16\xbb;g\x15\xces\xf6\x32\xe\x7f\xbc\xe9\x8f#\xa1\xd7\x1bVV\x13\x11\xd1" -"\x9\x33\x96\x1c\xe1\"M\x2\x1\xb9[\xc7\xf8\x62\xa2;(\xdc\xb7G\xbe_\xe3}kBfv\xae\x9a" -"\xf4\x87G(>\x1d\xf0\x9a\xfd\xe4\xa2i\xd6\x32\x95\xc7\xc1_:E\xf5k'\xe7\xd2\xcd\x63" -"\xaf\xb0\xac\x8a%\x63\xa4\xb6\xcc\xe4\xff\x33\x6\xa2\x8b\x30z\rK\xd5\x7\x1f\xb1\xc6" -"[\x94\xf5\xde\x32\xa5\x85\x9c\xcb\x82o\x8c\x89G7\xbf\xe6\xa3\x32\xc3\x84\xc2\x1f" -"n\xd7\xa3\xaf\xcb\xf\xce\xe2\x37\x86\x8c\x95)cOj\xa9\x15+\x16\x8b;\x5\xeezv\x8d\xb3" -"\x8b\xc4\xef\xcd\x36\xe4\xf3\x81\xc2r^33\xfam\x5R%\xe1\xde\xaf\xfb\x9f\xcf\x46\xd1" -"$\xbe\xf\x86\x64u&\xb3\xb0\x11\x36o\x1a\x19\xde\xba\x97&\xf7^x\xb3v]B\x1c\x91]t\xdf" -"\x1e;FK\xe5\x1kt\x11\x62\x33\xe8\x31\xbdh\xa9\xd0L\xb4\xba\x46\x8a\x19\xc2\xf1\xc7" -"\xed\xb3_]\xefT\xe7\xc1\xe7\x8b\x8d\x83'9\x81\x88\xf5\n\x85\xb4\xc0\xd4,i\x7fR\xcf" -"\x1e\xab\x42\xc6\xf2\x44\xf6\xb0\x9b-\xf3lz\xd4\x18\xdc\x11?S\xecP\xc6\xb1\xc9,\x97" -"\xe9\xd3(\xa6\x80!'a\xa2{\xd3\xbe\x97mIc\xbf\x18\xd6\xd3\x4O5\x8e~l\xec\x1c\x94\x16" -"\xb6\xc1\xc4\x9c\x96\x9\xf4\xea\x1e\x6\x81\x1b\xc6\x9a\xde\xa3\xd3\x0\xad\x99{\x92" -"\xddO\xf8/\xfc/UW\xd8W_p\xcc\x34\xa7\xf9\x91g\xc0\x34\x91\x99\x9a\xa9r\x84]\xb3w" -"=\x98\xd2T,\x9e\x8c\x1d\x35M\x1clY\x86\xe6\xfa\xb3\x8f\xe9HU},\xb6\xc5\xc0\xb8\x18" -"=d\x9d\x92\x66\xbe\xb9\x64G1\xbd\xa5\x80\xbdG)Qe \xc7!R\x5\x80H\xa2\x7\x64\x32\xd6" -"]\xe1\x13uZ\xa3)(\xa7^\xd4\x88\x8!\xcc};\xc0Q\xbb\xbf\x44\x3\x65\x0\xe7\xa6\x62\xa7" -"i\x14\xab(\x92\xce\xc2\x7f\x19Pr\xb7\x89X_\x11\xf2J\xb0\x98g!D@\xf3\xca\x15\xdb\"" -"\x80\x10\x8b\x1b%H)\x16\xaf\x8d\x39Yi\x9e\xd4\x43\xd8g\xd3\x93\x7\x96\xce^\xd4\xb7" -"1\x7f\x9f\x80\xc3 ZBP\xbdz2\xb4\x39\xa8\xfbV\x0\xca\xeb\xe2\xed?\"|\xfb\x61\xb5\xfc" -"\xf0\xd1^\xf#:y\x10\xe3\x61w\xfq\x12\xd3WA,\rk\xfd\xc8?e\xb0\xe6\xbfzb\x8eu\xde-" -"\xed\xa6\x64 \xc2\xcb\x7f\xeb\xf7\xc1\xe0\xd8\x43\x14@\xbb\xb8^\x94\x92\xfdj\x91" -"\x82\xa6\x87\xb4=\xd2\xe1\xdd\xfc!Y\xb8\xb0sK\xb\xdc\x36\xee\x8f\xec\xe6\xd9Z+zD" -"\xbc\x17\x16\xc1L\xc0o\x4\x7f\xf6\xbc\xa7\xd2\xb3\xf8\xcb\xfe\xa4\xa5\xd4\xf4\xf" -"\xacg\x1b\xc4\xe3\x8e\x9\xd1\xcf\xa5\xc8&|\xddn\xbf\xbe\x9co\xb2\xb8H|$f\xc2\xf5" -"\xdb\xd4\x98=\x88\x9b]\xb9h?\xaf)\xc8m\x87\x65\x36\xb5W\x7\xf5\xd0%n\xc2\x90\xdd" -"WE\xc6\x14)\x90\x7f\x12:\x9c\x13:\xe2\x13\xa9\xab+\xca\n\x39\x11\xb8\xd9\x93\x62" -"\x1c\xa0\x9;\x88R+\x83\x17\x95\xe9\x8R\xa4\x98\x5\xa2-\xc4\x1b\x66\xffiSxL\x8e\x97" -"\xbc\xb5I\xef\xa7\xc4*Gz\xa5Y\xa6\xb8\x8d\x8b\xdc\xdb`j\xb8\xb3\x5\xe5\xaaiU\xa3" -"=\xa7\x9au*<\xc5\xfa\x5\xb2\x18\xe1\xf4\x43\x44\xc3\x84\x1a\xfa\xdf\x7fx5)\xbb\x13" -"\xc1<\x8eup\xda\x98\x3\xcc\x11\x36\xc8\xc9\xbf\xc5\xad\x9d\xaa\xf1\x82\x9a\x13>T" -"\x80<\xab\xb6\x43Q\xb4k\xec`\xc2}\"\xfc\x1a\xa2\xeeX0\xde\x10\xaf\xb7~[\x81\xfd+" -"SlS\xc1\xe3Q\xce\x8ez\xb5\x84z\xb1\x5?M\xcd\x13>\x2\xd6\x12;6tv\x9f\x46u\x3\x83_" -"\xfd\x4z\x92\x1f\xd5gx-WU(\x88\xe0\x94*\xe7Y\x0_\x7\x94\x34k\xa9\x37\xcdO\xfe&\xd2" -"\xa5\xaf\xf3Nq\x89\xa3\x4\xb5w\xbdvs\x81\x34\x1c\xd3\xab\x19\x18\xa4\xb0\xdeOa\xa3" -"\xe5\x8c\xc8\x5\xde\xe6\x64\x1e\xb7\xcf\x42\x31\xd3\x16\xed\x13\xdf\x3\xc9\x97ge" -"@\xc5.P\x14\xe5\x4\xed\xbd\x39\x84\xb4u\xc0\x44+Me\xdd>\xaa\xa8z\xd3|O{\xfc\x9\r" -"\xa7\xbb\x42\xc8\xaatN\x98x\xcdZ\xb9\x32\x1cxG\xa3`Y,nc\x2T{\xe4\xaa\x12\xeew\x17" -"\xfb\xb8M\x8e\xbc\x66\xf4\xc4\x9\xc\xc4\x14\x13\xdb\xd2\x8f\x31\xef\x37\xaf|\xc1" -"T\nw?W\x1at\xfd>jDN_\x19\xb5\x8\x43$\xe2\x15\xa4\x11Lp\xf\xbb)\xdf/\xb1\x82'a\x94" -"\x8\xb1\x37w(X\xd1\xa8\x9a[\x12x\xd0\xbbW\xf\x85\xc8\xf\x63\xac\xbf\xe0p\x3\x3@\x93" -"\xc3g\xee\xf\rW-\x86\x1cz-d\x4`\x83\x82\x8b\x8e\xdfkm\x15\xcf\x8\x87\x83\xb8\xd7" -"\x9d\xc3\xb9\x9d~h\x1a\x9b\x31\xd0q\x3\xec\xf7\n\xc4;\xb1\xd4u\x1f\xde\x18Q\xd7\x98" -"\x91/\xdd]\x1f\x88j\xc8X\xea\x44\x14\x1e\x0\xfa\xf4\x87\xd1v)\xb7\x6N\xaa\xe9O\xf" -"\xec\x46W\xd6\x9f\x1d\x88kq\xd5\xc8\x42o\x88\xf\x8c\x9!\xd7\xd1\x15\xc2L\xa0T\xd4" -"^w\xce$\xb5T\xa6u\xd3\xf7\x95\\\x92\xden!b&\x9d\xd8N\x8f\xd2 \x8e\x93\xf9\xeb\x32" -"C\xec\xffS\x94\x1d\xc0K\xf3\x84\xf5\x35\xf5\x8e\xda\x33\x62\x5\x7sG\xf7\x3\xb3\xa6" -"0\xf4\xaf\x8b\x84\xec\xe7\xf1\xdc\x84\xe9\xaaq\xe2\x11\x34SQN\xe\xbe\x4\x18]S\x1f" -"\xa5\x96q\x8c\xe3\xea\x7fg\xe6_\x93\xf2\x86\xf9\x30\xda\n\xca\xf8\x31\xc9\x1f?`v" -":\x5\xd1\x82\xa9\x38\xdd\xfbR\x90x\xe2\xa3\xb6\xc8\xa3z\xd0v\xe9\xa4\x19\xf0\x8a" -"\x83H8\x9d\x30R4InC\n\x1a)W\xd3\xff\xa2U\xa1m?\xf6\x8\x33K\xb3\xb1\xa5\xc6\xbcz\xac" -"\xe9\xae\x95\x9f~Q\xbbQ3NJur\xf1\x1fp+\xc2~:f\x98\xeaZ\xe5@]aw\"\xf9\x99\xaa\x46" -"_\x81hm\xf1k(\xd4\x97\x31^\x10\xb8\xda!\xb4:\xefL\xf3;?>\x8\xe0}:t\x6\x86o\xa3\x8b" -"\xc8\xb3<\xc1;\x88\x9e\xfe\xd6\xa6\xcd.\xbc\xab\x42\xd1\xb7\x94M\xc1\x5J\xe\x65H" -"\xc6\x13\xec\xf1\xa4\x81\xcd\xf9\xb0\xc4\x1e\xcd\x30\x36H=\xec;D7J\xc2\xf7%\x94\xf6" -"\xa5S,\xda:>5\x16\xb9I\xb4\x61\xa7\x11\xf4g\xbf\x82\x32\x1f\x35\xf9\xb2\x42\xcc+" -"W_@\xfb\x93\x9b\x42\x8b\x11/\x1a\x12\xbb\xdc\xb6\r\xca\x81\xc0m\x1a\xa4\x0\xae[\x98" -"7\xa5\xef\xb1\xf1\x89\xde\xf4\xf8\xa0X\xbb\x8a\xf6\x1\xf0\xf0\xdb\xd5\x91\xa6\x17" -"\xect\x3s<\x89\xd2p\x8\x16\xed\xcah\xff\xfb\xbd\xd6\x83\xda\x66\xe8\xea\xa1-/\xb8" -"\x18\xa2\xc6\xb7\xc0\x3\x9a\xbd\xad\x87\x89\x15(g\x0?W\x6\x1a\xd3V\x84_\x81\x9c\x1d" -"s\xdc\xe4\xc7,\x13\xac^\x8c\x97\xd0/\x83-y\x8b\x5\xc0@?\x85\x85\x82\xa7Tw.\xabl\xc8" -"Hd\x85\xec\xb6.\xad\x89s\xaew\xb3+.\x81\xb3\xf4 \x13\xcd\xbc(\x8f\xb1W\x9a\x85j\x14" -".\xba\xc0P@\x99~\xd2Y\xf9-\xbfIPO\xce\xdd\xee\x84\xe1\xcd\xdc\xaa\"+K\xc6w\xfb\x91" -"\x81\xa0\x9e\x90\xc4\x8\x3)\x93\xefV\x9b\x96\xa7O\x96o\xd3S\\LM\xfeh\xb6\x12s\x17" -"r\xdb\x99j\xd7\x10\x90\xd7\xff\xfdj\xca\xb9\xbf\xd4\xcf\xd2~h=\xb1S\x1c\xce\x1a\x8" -"\xa9o\xc4+\x96\x15@\xd4]?\x9b\x39\x0_\x17jqr\x9f\x9\xba\x38\xa0\xc3 \x16\x9f\xf2" -"\"B\x82\xba\x19\xe9\xb5/)\xc4\xa4\xa9\xf8\xef\xeb\x14\xcb\x82\x66\xb~\x86\"\xadS" -"\x1a\x95s\xcc\x39\xe8\xa6\xac\x3\xbcI\xddH+&\xc7+\xcf\xb7'\xf0\xd2\x99\xcf\x9c\x2" -"\xb4\xc1\xc5 <\\nX\xd3\xe8L\xf7\x62\x92|\xfc\xcc\xd8\x1\xf\xc8I\xcf\x95\xc4\x1e\x8d" -"e\xcan\x99 Qm\xeb;r\xb5\x32G\x8e\nl\xdd(\xbaWD\xd5[kK\x8d\x46\x8fi\x10\xfc\xcf\x2" -",F\xbbp\xfd\xbeq\xa2\xad;\nh\xa1\xf8\x8d\x15\xe4NK7\xc7\x1d\x8a\xb7\x18\xdd\xc7\x1f" -"\xf1OX\xf2!\x1f\x8fP\x17{<\xdaW\xd4.\xbcV!\xdc\xf6\xe \xb2\xd3\xb8_\xe5\xeb\xe1&" -"\xd8\xc0\xcb\x4\xa4\xe]\xd4\xc2\x1e\xbf\x66\x8d\x15\x83{\xdd\x9V\x5\xa3z09\xeb\x16" -"}\xf9\xf5\xeb\xfd|\xb5\x85\x1\x8\x12Z\xfe\x10\xb6\x8a\xbdr\x95\xf4R\xfaN\xf3\xfb" -"\xf2K\xd3\x9et8\x17``%\xb3\xa0\xec\x8f\nnM&\x95<\x11\xac\x10\x9d\x19\x65\x8b\xd2" -"x\xe6v\x96\x15o\x4\x1f\xda[;\x1b\xa1\xcc?Z\xc3y\x8zs\xd2\xf7\xab\xea\xad\x43y\xcc" -"\x9a\xca\xd2\x1\x92'\x1d\x10\xfc\xe1\x4_R1W8\xc8\xef\x16\x66\xca\x8b>\xe1\x41\x1d" -"\x81\xcd\xae\xd3\xf\xf6\x32\x1a\xe3\x0\x43\x35/ml\x5\x17\xdb\xaf\xcbU\xbf\x98\x31" -"g0\xf6\xcf\xb9\xea\xaey\x81\xdc\x88\x46\xd9\x32\x8d\x92\xf2/e\x86\xa9\xf3\x38\xba" -"\xfa\x81*\xf5q\xfcI|5+z(&\xce\xa8\xa8U^P\xe3\xb3\xfc\xc7RN\xe5S\x93\x1\x9e\x1e\x4" -"\x7\xdd\x13\x43\\\x5\xf8\x14 \xf3\xccztd?\xed\xa3X\x17\x1e\xae\x13H\xd1\xfdx2\x8a" -"v%\xaa\xfa\x39\xc6\xe\xe1S\xa0\x8b\xce\x1c\xdb\x2I\xc1&\xbe\x8\x1et\xedtd\xce\xcf" -"\x4\x95\\%\xcb\xc^\xc1uC\x1c\xb1\xb6r\x98\xa8\x96O\xde\x98\xe1?\xa1\x19'8\x9f\x1e" -"\x87m\xe3\xd0l\xc2\xce\xe5\xcft\xb\xe6\xd8_\x8fov\xf7\x37\xd8\x97\x8a\xabm@\xb6\xa5" -"\x2{\x1fY\x92\xfb\xc1},\x7I\x97\xac\xf4\x8a\x8d\x44;\xcc\xb3\x8cpO\xba\x1e\"\x9f" -"\xe\x8e\xff\x1b\x44\xd7\xa5\x92\xe8\xa5\"\xb6\xe0~\x1e\xa8\x89\xe0nOz\xdd\xaeT\x15" -"k\x9e|\xc8\xc0\x41\x8d\x82\xf5\x45\xa0\xd1N\xc1\xac\x1c[a\x7f^\xf8w\x96\x17\x8c\x43" -"v.\x81\xfb\xad\x43\x82\x17\x9\x7f\x85\x82SNW\xdf\x99_\x87\x33\xbc\x44\x30\xd1\xa1" -"\xbb\xdb\x91\x91.\xc5\xcdw\x8c(ctv>\x17\x18\x32\xda\x9\x43\xd2T\xfe\x64\xbe\xe\x5" -"U\x9d\x9f\xcaw\x18\x46@\xf6\x1c\xc\xa8\xc2\xa3\x1e`B\xdb\xcd\xbd\x19\xbd\xb6\x66" -"\x9e\xac\\QX\x86\xfal\xa4\"X!D\xd7\xcc\xe8\x7fI\x90\x87(\xba\x9a\x84\xe\x37\xa7\xd4" -"\xcdT\xd2\xb0\xb9\xc9\xae[l\xeb+*<*\xd8Y\xcf\x34\xf8\\Z\xae\x81q\xe2\xca\xd9OG\xf5" -"\xe0\x34H63\x1a\xc3\x86\x13Q\xb6\xb6\xae\xbc\x41\xcc\xfc_(\xfa\\\xe2X\xbc\x8e\\J" -"\xed\xa6\x14\x62\x45\xc5i\x15SiF\xe1\xa0\xff\x87j\xee\xb9\xc1\xde!IrL\x8a\xe6\xf0" -"\xb\x91\xab\xa3<*\xde'p\xc7\x41i\xf7\xd1\xe0\xe8qDI\xde+\xa0\x3{y\xe3m?\x5\xca\r" -"\xffZ\xb1I\x89Qn\x88\xc\x61\x3\xc3\xbe\xf7\xee\xbdRWf\xe5\x8f\n\xf3;\"@\xd2W\x11" -"\n\xb6?\xfe\xe2\x30\x8f\xf9\xeai\xba*R\xf2\xa7$\x1a\x7fRI\x8b\x3\x1f\x8f\xfbj\xe0" -"\xd2q\xf3\x0$\xc0H\x7%\x81\x8\x3\xc0\x16k\x98\xf3^on\xe2J?7^|T\xbd\xe1\x1\x8a\xad" -"\x84\x62\x16\x19\x10&\xa9\xbe\xd7K\x9a\xd1\x1e\\\x7fR=@~\x98\xad/$b\x3\x66\xf2\xc" -"\x19\x16P\xf8\xb4\x13N3\x1\x89\x9d)\xb4o\xa5)\x85\xda\xd3\"\xf9K\x9d>R\x89\n\xbc" -"\xd1\x88\xd0\x9f\xe4\xd1\xfc\xc0\xb7\xa5\xf\xe2\x63\xbb\xe5\xeeS\x15\xc3\x16:^\xee" -"0R\x83k\xe6\xa1\xae\x1\xe\xcc\x80H\x12\x18\xde\xd4H\xf0\xbdz\x12\xe7\xd2\xb5+l.\xcf" -"\x8d~\xae\xd6#g\xa9\x9H\x83\x11l\xc9\xef\x4\xaa\xf5&\xa9\x92\xa2\x8\x8c\xf9\x2z_" -"\x84\xael\r\xd5^F\xdazG;\xcb\xe4\x83\n\xb5\xd2\xe2j\x82\xaeL^S\xbd\x1\x1\x81\xda" -"\xc9\xb9VE}{d\x80\\\xdd\"\xbe\xb6\x84\xe3\x17\xcdYP\x9\xe5,\xceP\x1f^3\x91\x35\x90" -"\x7\x98p\xc0+3\xae\xda\x96\xc0\xda\x8c\x32\x82\x8b\x94\xe7\x86]\xa5\x93\x9b\xfa\x43" -"_\xe5\xe9\xc8\xce\xdf\x17\xc9\xb0\x91N&\x87\x11\xc3\x1f\xe5_|\x9e\xc4\xef\xa5\x11" -"\x9d\xbb\x41:\xed\xe8\x1_S\xddY\x94QL\x8c\x87\x14\x8d\xd1\xf3\x45n\xe3\xaa\xee\x9a" -"\xa6w\x86;\x3\x97\xd5'c\xeb\x1\xfaz\xa5\xbe\xea]\xfc\x9eG\xc\xbf\xcc\xfb\xe5`\xa0" -"\x14\xa2\xb7X\xc\x82\xf7[\xbe\xc\x32@\x86\x9Q\xc7\x14?\xcb\x3\xb9\xa0\xe4\xbb\xb8" -"\x1c\x89\xe7\x83\xa6\xa4os\xcc\xe5\xe9_x\x8d+\x13\xeb\x1f\xe8\x66\xabq\x6\x5\xb4" -"c\xfe\xd1\xa0\x1b\x10x\xcd\xb3l\xfaRN\xaaI\xa5\x2\x88\x9e\xdc\xdd\x32N\x11-\xa8n" -"\x1a\x97\xc3\xbdO\xca\x34\x37\xe8\xd5\x61\\@B\xcd\xce\x88\xf6\xe4\x64\x66:\xf7\xa1" -"MPBY\x17\xfc\xb5\xea\xc6\xfbJx\x9e\xb8\x8f\xc1\x92?\xbf\xc0\x1\xda\xf3|\xf3\x9b\x84" -"\\\xf6s==\xa5\xcaZ.\xf7h\xbdwn\xee\x1e\xa4\xb5\xb4N]\x11\xb0\x83\xe1z\xa5\xf2\xf" -"%\xb1\xe2\xd0\x38.\x90\xdc\x91\x9\x93\x9b\xee\xb4Q\xe1\xd0\x81\xd5\x8d\xa9\x32\xb2" -"R;\xaf\x12\xc4\x66\x94\xe\xd1\x36\xf0\\\xd2hb\xaah\x85\xe8R\xfa~b\x87\xd0\xfb\xd3" -"\xbc\x15\x65\x7f\xcc\x99\x1c*\xe3LF\xc2\xa7\x63\xda\xff\x66\x42\"\xb8\xd7\x84\x65" -"\"R\xdat8IU%'\x80\x8d\xcc\\p\xb1,\xb9\xf2\x88{\x8d\xab\xe3\x3\xf2\x1c\x10\xb6w\xb1" -"\xb5I\xb\x43\x90\xed\xed\x64\xc8P\xee\xa3\x66\x96\xe0\x17\xde\x1c[\xe0\x10\xa1]\x8" -"\xa9\x8a\x5\xda\x37\xd8\xf2\x38\x83gI\xb8\x42\xec\x17\xednv\xfb\xad\\W\xb1\xf7\xc5" -"'/vc\x6mv\xac\xb1\xef\x8eu\xbap\x98\x44\x97\n\x42\xba\xb4N\xedsz\xa4\x14\x9e\xdf" -"\x80\\\xd0=\xd4\x14T\xacL\xa9(@\xd9\x65\xe5\x11\x9f'b\x93\xeb\xfb\xef\x15\x9\xfe" -"=X\xc7\xae\xeb(\x1\xb8\x85\xb3#\x9b\xa4\x9d\x9d&\xdc/\xfe\x30{\xe4\xa3\xdb\x96I\xef" -"u!\xd2\xf5\x8ej{3\xf1\xd9\xa3\xe7\x92|\x14T\x1c\xe2\xec\x94\xd8\xf6\x1d\xb\xb3\\" -",B\x97\x9\xa6Gl\xbf\x11\xc9\xf3TE\xaaO\xc8\x36n\x98\xb2V\xe2)2\x9b\x66\xd2<\xed\xe3" -"_\xdb\x19q\xbd\xe1\xa6(\xfc\x91\xfe\xde\x30\xfa\x4va\xc3\x8\xc0\x37:|\xac\x1e\x11" -"\r\x9c\x45\xb1H&\x92\xe8\xc4H~\x1fu\x3v\xe3\xa1\x35\xd6\x82i1\x7\xd1.r\x1bn'\x88" -"{h\x9c)]\xb7&\x1\xd2G \xc6\xcc\xb4\xd5\xf2\x90\x84+\x8e{\xd5\x3R\xc9\xaf*\xed\xef" -"\xbb\x0In@\x16+\xa9\xa8j\x1d\xea\xe1\x38\xc7\xfa\x83\x17\r\xac\x10^\xf2\xfdL>s:;" -"7\x15\xec^\x97\xe0\xf0\xb4M\x87\xd1\x84\x65\x35\x93\x93X\xd6y\x88\x18\xc7\xf0\x0" -"u\xe7z\x6\xa2\xec\xbq\x18\xb3$M\xebZs\x18\x0\x4\x84\x8c\x84\x39Gv\xf9\xff\xf7\x30" -"s\x1d]\x8a\xf0\xa5\xe4\xee\x45\x1\x9b\xa6\xff}\xf4yp\x95\x44\x36\xf\xd9\xb1$\x1d" -"F\x84\xde\xf7\x8\xa7\xf7<[\xe5\x41\xf\x36\x7f\xc1\xd7K\xde\xa7y0\xf4\xd2\xc\x1f\x43" -"\x12\x85u\xe9\xf1]:IC\xd4\xc2\x86\x4\xe0\x44g|\xc7\x0\x61i\xe2S\x6\xe0\x64hc\xca" -"\xef\x93\x13\x46\x1\xfbrk\x87msh\xd4\xc9\x1d\x1b|\xbc\x96\x83\xe0\xed\x86\xa6\x12" -"y\xd5\x44\xef'\x85\xf7\xc4(\x88/c\x8e\x11 |\xbc\x62\xf3ik\n\xf9\xf2P8\x91\xf!\xcc" -"*\xd3G\x8e\xc2y\xe6\xff\x83\xd3\x41zu}k3Kk\xb3\xbf\xe3\xbd\xcc\xe6\x89w\xc4$\x2\xbd" -"|\x97\xe6\xcd\x9dx\xaa(\x99\xde\x5\x95Z\xc4\x31\xc8\x93`}\xf8\xe5\xd4\x83\x1f\x87" -"\xce\xf6\xa6\x12\x62\x30\xb7\xb9\xf8\n\xd0\x98\x82W\xb0\xc7\xb\xee;\x17\xf8\x38\x96" -"\x89.\xb6\x9fz\x9e\x7f\x4\xe8\xee\xb7\x64\xe9?\xad\xd0\xa3\x8\x35\xady\xfb\x7f\xcc" -"l\x9e\x1c-\xd8\xbe\x12\x38\x99\xc4j\xa2\xd5\xc4@\xa6/u\x80tS\xcax\xe4\x65\xc6\xb2" -",\x87\xd3\x95\x91\xa6&\xc9$\x13\x99\x9f\xb7g\x1f=\xcb\x14\x1f\xa3\xee+\xe4MzJ\x2" -"E\xd0;\xee\xb3\xdd\xea\x95\xe8\xccIU\x88H\x9a\x80\xa3\xb6\x8#\x1d) \xb2n\xf2\xce" -"\xccI\xb1\xd6\x9b\x96\xd0\x7f-a\x8e\x9nj\xbb\xb8\xb9\xc0z\x8e\xb7\xb0\x92\xa1\x64" -"^M\x10\xdf\xe0\x7\xe8\x17\x8f?\xae\x9d\xda\x42\x37\xfe\x8c\x36=\x9e\xac\x41M\xb4" -"4\x0\xeb\x1b]aa{U\x7f\xc3\xfbWE9\xa0\x41mj\x10\xe3Z\x10\x96\x38\x45|Vr\x2|\xb9\x9" -"<\xd0)1\x93+\xe2|M\xa0JX\xdc\xa7\xf7:W\x12\xfe\x96\x35\xcc\xd9Y1]\xe7\xceV\xf\x44" -"h\x5\xbcl~kL:\xee\x41@I&\x1e\x9b\xe2\xf7k\xbb \xf0\xdf%\x34\xaf\xd6\x17\x91+\x83" -"g~\x9\x1d\xceR\x1c\xd1\xfb\x17\xc8\x1e\xe7\xa3\x1e\x45\x10\xf5\x19\xabjD|\x85qjb" -"\xf3'\xa1\x1\x8a\xc6\x91x.\xb7\xa8\x7\x17$u\xf1\xa3\xc2\x64\xdf\x12\x64\x84w\"\x3" -"\xf3\xceu~\x2\x66\xb\x81\x92\xf3tc\xdf\x15\xe7\x1~\xf3\xd7s(\xcbT\xef\xda\x16\xbc" -"\xa2\x33\x6\xfc\xc2\xed\xf2\xd2\xcb\xff\xa7}\x88\x82\x81\xba\xfe\x6\xe6MxQJ<@\xa1" -"\xc1uj\xd2\x32\xc5V\n\xbb\x83\x38\x8f\xe8\xd0n\xd8\xe4K\xc7\xb0\x8e\xb8([>\xea\xac" -"X+;\xfd\x1a\xb0N\xb\x93\x94\x4\xce?)\xff\x8.\xbbiM\xb7\x19\xe4\xfe\xdb\xa7\xf8\x2" -"\x1f!\xb6\x1d\xd8\x11 \x12\xd9\xd0\x4$\xd6\x1f\xfb\xb8_\xdc\x5\xb0u4\xe7\xa7K:\xed.R\xa9\x89W" -"\xc4\x10\xfc\xbb\xe2\xf6J\xa3\x38\x31\x93\x8e\x93\x92\xde}\xf3\xe9\xa8Rio\xfe\xbb" -"\xb6\xba\x17\xd3\xafK\xca\xb5\xf9\x9\xab\x46\xaeX7\x8f\xd3i\x9a\xd2}l\xef\xfbk\x7" -"(\xea\xfd\x88\x99\xc1\x32\xde\x33\xe8J\xd9\x43-\xfa\x8\xff\xb2G\xc7\xa6\xf7\xe4\x33" -"\x3\xa1*\x8c:\xf\xd7\x1a\xae\xe1T\x1a\xb6\xb5\xef\"\x12\xe4\x64\xb7\xb1\xa7=\xba" -"r\xed\xc0\xaai\xa7\xd8\xbf\xfb\x64\xf9\x7f\x66\x3\xbf\xc4\xeb\x17h\xc6\xcb\xd4\x17" -"\xf3\xe4\xff\x8e\x17\xd0\xdf\x42s\xc2\x41\xb7\xf6\x83\rgq\xf1\x3\xb9\x17\x9do\xd2" -"\xc8\x92\x9f\x92\x1\x39T\xfa\xa8pl\x10\x82$\xf\xed\x34\x8c\xb9\xc1\xe4]\xa6\xb2:" -"\xe\xa9\xbc+\xb7x>\x87\xf3\r-U;\xd7H\xbc\xb5\x17\xee\x83 \xa9\xd3p\xbb\x1a\x17\x92" -"\xd2\xf9\xeaZ|i\x90t[j\x82N\xff\xe9L--n,5\x1f\xf9\xa5\x63[S\x2\xf8L\x1\xe8[x\x95" -"e6\x8a\xa9\xf3r\x8d\xf4O\xda\xc4\xba\xc4\xf0\xab\x43\xda\x43\x9d\xef\x9b\x16\xd4" -"\xa8\x90\x31>pYN\xb5\xc3\x7@\x9f\x9a\xb3PW\xb5\xb0\xd5\x94\xfd\x61\x42\xbf\xc4<\xd4" -"\x96\x65\xa7\"\xcb\x35\xa0##\xdd\x10\xd9\x9f\x16\xbe\xee\x42\x64\x98\x98\xbf&\x7f" -"-u4\xc5HdH\xfc\xd5\xf\x15\x2\xd1Z\x10\xbe\xc9\xb6\x1b\xc3>#b\xd5\xa8\xe0\x1c\x8a" -"\xa8\x7\x85\xf0\xf0\x12\xd7Rqj\x1!\x1d\x66Y\xb5\x1/Th\xee\xbe\x9f\x1e\xba\r\x35\x19" -"\xab\n\xbe/\xa3\xb0\x2\x33\xac\xa4\xbc\xe5\xd5\xfbO\xf1\xa9\xbbk\xda\x13\x62l\xa9" -"\xd7\x43>\xf2\xbb\xf\x6\x9a\x9d\x61\x85\x64Oi\xc8I\\\xe1\x93\x91\x33\x8cQ {\x1\xbe" -"{\xdby{`\x11\x85\x2(u\x90\x30^\xb0\xcf\rT\x93\x62\xf1\x7T\x1e\x13\xc0y\xdf\xe3\xc0" -"]\xce\xf9\xc8\x6>\xfe#\xc7\x1f\xe1&vI\r\xa4\xf8\xa9R8\xac\xe\x5\x65N\xaew\xff\x62" -"\x92G\x80\x2\xa7\x8c~\xb8R\x9c\xef;\xbb{\xec\r\xe2\xaf\xc5\xf7'B\x0\xdbq\xa6)7\x89" -"L\xa4\x91xX\xb3;\xea\x8d|\xfc\x88\xee\xde\xea\xb7\xcf\x1b\r\x1a\xdb\x99\x86\xe8&" -"\xb6\xd9\x8dY\xc\xe2\x16\xac\xd6N\xdc\x87\x33\xea\x8c\x1a\x14\xbe&\x1f\xb5\xff\x94" -"\x80\x1e\x91_\xf1\xfc\xc9\xb1\x8b\xdf\xcbZ\x9dK\xbd\xe0.\xa5.\xd2\x2\xf9\x8d\x0\xfd" -"\xfd\x17Qi\xe8;\x9e\xd1\xb0I\x91J9\xee\xcb\xbb\xc9\x5\x96\xefl8\xe6g\xde\xa6\xa5" -"\xd0\xd0\x9d#\xfc\xd6\x99~\xea\x17Q\xb3\xfdu\x8bS\x96\xb0\xcd\x5\xed\x99\x86\xf4" -"\xddM\x1d\xad\x62\xc7\x7\x97Ze\xb\xd4\xf0\xf1J\xd6\x8f\x62\xb4\xa6v\xc0\xd6\xa9\x95" -"{\xfd\xbf\x39P\x82\x42\x96\xc8\xb7\xd1\x19\x19P\x8b\x32\xc>\xd5y\x1\xc7\xac\xf2\x7" -"\x12_\xc9\x91\x15\xf7(#1\x8e\x10\x45\x36\xd8\x1a\xc4}\xec\xc4\xd5\x80\x1d\x19\x7" -"b\xc8\xc8\x14\xfd\x8e\x6:I\xedX\xd0ON\xea\x87\xe7\xb8\xd0o\xa7\xc3\xf6\xcf!\xe4\x42" -"\x12\x1b\x17\xcf\xf0\x89y.\xb5\xaa~z\r\xa9\x9\x31\xd7\x9e\xe0x\xe9\x34j\xc2\x18T" -"\x90\x84\xe6,\xbbVT\x7f\xb4\x62\x8b\x9b\xdb\xd9\x6\xabZ\xae\x63t5\xbd\x1b\xcb\xbc" -"\x83\"\x3\xcc\xd6.\x17\x44\x81\xa4\n\xcct]{$W\xee$\xc9\xa2\xc7\xbd\xa3Wu\xe8\xe9" -"\xc7\xbd\xcc\x8f#\x8alL\xc9\x8b\x81\xc8l4\xe1=\xb0\xa0\xaeR\xae\x9cJ!)\x81\xfe[)" -"8\\9xN\xa7t\xca\xd2\xec\xa4X\xdd\xf1S\xf0\xc6\\\xfa\xe3\xfbT.i4\x4&\x9\x33\x19{q" -"\xed\x10\xcf\xc3r\xdf\x1c\xfd]H\x1f\xec\x65\xaa\x30\xefP_$o![\x8e\xed\xcb]\x84/\xa3" -"V\x8c\xa2\xd2\x96\xaf\x85R\xdb|Q\xd1\xf0\xfb\xd7\xc5\xc8^\x9c\xa9\x63\x5\x65\xad" -"\x7f\xb8\xe2\x5\x46\xc1\xcb\xdb\xf6n\xefP\x1e\x33\x5\x33\xc3J\xe8\x39\x98\xfb\x88" -"?\xca/3E\x1b/\xa7-#i\xcd\xca_\xf\xe2\x11\xf6\xf5\xc5\xec\x38w\x9d[\xc4\xa8\x8a\x8e" -"\xcb\xf0\x3\xf8\x66X\x19/\xa1\x98\x34\xb\x8a\xbd_\xf9\xd0&xh-\x93\xc2\x9d\x85\xa3" -"\x19Z\xdb\xd4ZKC\xa3\xbe;\xbcJ\xa6\x87\xb1\xecYH\x82:\x17m\x83\x87\xca\x42\n\xc5" -"\xa7\x1f@&*\xd7xXO\xb0\xb2\x5x0;H\xbf\x97\x66\x10\xbf\xf5\xef\x8e\x34\xca\x32\xe7" -"JD\xfcU\x92\x46&h+&\xfd\x5\xc8\xfcv\xd9\xf1\xe4;Zh/\x1fM\x14\xff\xb1\x19G\xb0\xd0" -"\xd7\xc8\xe7k\xe5 \n\x99U[\xdb>p[S!\xc\\\xd7\"\x8d\xe4\x32(T\x8e\x0\x80\r`\xb\xd5" -"\x1e\xd2\xea\xa3 J\xda\xfb*\"U\x7\xbd\x92M\xeb\x84\x9f\xf6@\x18\xac\x97\xb6\xaa\x99" -"\x84?\x7f\x1bZ\x12\xf\x8e\xae\xcd\xa4k\x81\x0\x65&-\xc4\xc2\xca\xc3xQ\xda\x16@\xff" -"9\x1b\xab\x38k5\x7f%\x87-W{\xba\xe1\xa2\x44\xdb\x8a\xb2J\xdd\x35\\\x1\xc4\xf7\r\x11" -"W%b!\x93\x31x\xf7\xe4\xa7\xfc\xe\x38\xb9Pw\xfb\x44\xeb\x9c\x7\xaeLt\xe9G\xfb\x94" -"z\x84\x9a\xb\x14P\x12;\x81\x9a\xdb\xc5\x19\xdbI\x1f=\x8a\x12\x90\xee\xa1\xc2\x45" -"r\x1a<\x8fu\x80Q\xcc\x1a\\\xaf\x6\xce\x36\x61\x7f\x8c\xf7_d\xffp\xa4-J\xdb,\xe9g" -"\x81|#\x1a\xd6\xc4\xa5I/al\x96X\xe3 2\x91\x7fY\xf8;\x99\xa7\x8a\x61\x12\x86x\xb0" -"\xee\xab]\xbc\xee\xe\xa0\xeb\x98g\xcc+Gf\x2\xe\xf3\xf7\xb3\x85\xcc<^\xee\x13>\xa0" -"\x83\xe0Jo\xfez$\x6w\xd7\xf1\xca\xb4\xfe\xf7m}\x13\x13\x84,8kRP\x9a\x43\xdawsW\xbe" -"\xa7@\x84\x15\xc4\xaa\xe7\x45\xeeJ\xf3\x84\xfc\xec\xf1\xa9\xc7T0\xb9I\x89G\xae\x10" -"\xb8\x6\xc9\xb\x7f\x96\xfd\xa4\xff\x65\xfd\xfe-\x19\xca\xb6=\xbe\x96\x33Mz\xces\x94" -"+\xce\x46\xc2]\xc8J\x9c+\xc4\xef\xd7\xa3\x44\xb6\x82\xdeR~@\xba\x30\x63\xa6[\x9a" -"\x1c\x1b\x39w\x81\x32\x98;\xcaU\x13&\xf4\xf4\x18~)6T!I\x9c\x10Z\x9b\x12\xf4\xe2\xde" -"\xb8\xaeu\x1en_^V\x9d\xd1Y\xa4n\xc6\x9bn\xa5\x95\xf2z\x94qvw\xc8\xb8\xdeNiP4(\x86" -"\xf3\x31\xec\xae\xa8*\x16\xf0\x41\x37\xaf\x39Z\xb5\xc3\x12X\x82\xbd\xed\xf1\xfd\n" -"\xc2\xbe\x66%\xd8(\xc\xf5\x8cOk\x93\\\x86\x8\x7f\xa5\x6G\xf9(\xdc\xb7\xfc\xd9\xe4" -"\x9a\xf9\xae\x32\xfc\xa4Q\xa3\x11\x6\x37\x91\x9d\xb7\xa0l\x97`J\xe2v\xfau\xc3\xea" -"M\xcc\xd1t\x8c_\xb1\x37\\\\\xa4\xc3\x4\x3\x98m\xe2\x42\x8c\xaa\xbb\x96\xe6\x62\xf5" -"\xd4\xb6\xb7\xc9\x46q\xf0\xb2{\x7\xe2\x63\xe0\xab\xb5\xd2\x0\x95\xf0\xc8W\xc0\xc3" -"\xee\xd5J\xd9\xe2+==\x9c\x46\xdd$j\x4\xd0%@R\x8bg6\xab\xf5\x62\xa7?\x1\xf3\xb\xcc" -"\x9\xcd]\x16\xf0\x65\x7f\x61\xe9\xedn\xc3y\xe0|,\xf9\xad\xa1\x46\xc4\xba\xad\xb\xa1" -"OE\xcd@lp\x1e\xfd\x9d*\xd4\xeb\xeb\x38o\x1e\r\x34\x7R\x14\xac\xa3u\xea\xa7V\xb7\xbd" -"\xd8\xdb\xa5\x9eV\x19\x0\xc7\x0G\xcb$J\x9a\x9b\xfb\xdc\x11\x36%\x89`+\xa4v\x9d\xa8" -"\xf\xa9\xf8![h*\xca\x36\x36\n\xc9\x9b\x1a(Y\xc0]?\xba\xfc\x80\xc0\x45\xb3\xb\xa3" -"\x6\x37\xca\x84?\x12\xe4\xa3\xd5h\x1a\x30m\xc3\xe9\xcb\xf2\xd7\x30\xb5\xb0\x62\xda" -"5\n6\xaa\x9d-B\x94-XL\x13\xd2\xecJ\xcd<\xdb\xbe\xf0\x16\xa7\xff\x13\x63\xa9\xf0\x10" -"u2\x4\xdc\xda\x61\xeeP\x1e,f\x8e\x96Y\xf6\xb7\xfe^\xc\xe0\xfdm\xdf\xfx\xf4\x1b,\xac" -"`u\x8b>@\x1dGf`e\xb5\xd6\x16]|\xe5\xe\x16\xfaGY8\xb2\xa1\xc1\x14\x2\x13\x8f=\xcb" -"\xdci\x9d\xa3\x1\"\x88Ju\xda\xad\x41\xb7\x15\x1a\x36\xc2\xfIh\x9f\xec\x15`\xa4\x1" -" \x82\xa1\x0\xe4\xbb\xda\xb0\x83\x7\x1c\x89\xdf^\xe8\xaf\xef\x36\xb9\x8d\xb6\xd4" -"\xef\x44\x4\n\x10\xcc\xb7\xc3\xb5\xca\x80?\x3- N\xc4|\xfe\x62SOW\x0\xc3\x1dm\xdf" -"s\xff\x9d\x1b Z\xc4o\x1ezQ\x99\xda\xe7\xc0\xb3\x42G\\\xdb\x62l\\\xcf\xdb\xc4\x43" -"}\x12^\xb1\xf7\xf4\x16\x1a\xda[tE7h\xe4Nk,b\xb3\x98\x81\xc\x37\x37om\xaa\x1e}E8]" -"\xeb}g\x96m\x9eu\xd5u\x9c\x83\xb1'\x1e\xcfp\x4#\xfd\xbf^\xc8\xa2@\xd9l\n\x9a-\xc6" -"f\x19\xefo\x81\xed\xa9\x10s\xa1\x36p\x1\x39\xbd )\xd0*\x86\xd3IT\xf8\x80\xfc\xd4" -"\x9a\x19\xf3\xeb\x91`\xd2\xcd\xf4{\xc8of\xe4\x8en\x15\xe5.e\x90 !/x\xe3\xd8\x41\x1a" -"%\xf2s5\xa6\xe4\xf8\x12\x45H3r*\xe^Bl)LM\xc0,\x99GCb\xack\x9c\xd9.\x9cm\xee:\xdf" -"\xc7\xf1\xa8'?\x90*&[\xe6:*/\xc8td\xcd\xc3]\x1b\x31\x7\x3\xbf'Q+\xd0\x12\xba\xf8" -"d\x1\xa3\x4\x63Q_\xef\x83\xc6\xce#\xe0\x13P\xe9\xc4\x1dY\x89\xd0\xfc\xac\xd4\x43$\r\xae\x82\x35\x64\xf2\xc\x1f\x30\xd9\xa8QI" -"\xa6, B\xf8\x6\x87\x18T\x9d\xe1\xd4\x98pf\xf6\xab!\xc6R\xf2\x44\x86\x9b\xca\x4\xed" -"\x4\xa7\xa5\x1f!\x4[\xf!r\xeb&c\xbb\x8d\xe8Z\xf0*\xdcP\xc7`C\xe1\xc7$\x3\x82;|<\xf6" -"\xd4\x35\x83\x33\xc1\xb2\xb9\x8\x41{\xb8\xa8/\x9c~\x9b\xc2\xc9\x11t{\xf5\x1c\xd2" -"5,Z\xff\x35\x94\xaf\xe8<`Q\x2\xb5\xb7@\x1b\xb4Kk8N\xe9I%IW\xf9\xc7r\xaev\xd2 \xac" -"o0n(v~\xa5K\x1f\xbe\xf6\x16xb\xa9\x87\xd1S\xaeh-\x99\x30\x1a\xe7\x8e\xf3\xbf\x3\xf8" -"\x1d\xc1\x62*\x8a\xbeW4\x84\xbb'\xdc\xd6\x43\xfcz\x84\n\xf0\x61\xe3\x89o\xf2\xf5" -"\x6\xe3\xdb=g\xa2\x46\xb3\xd9\xd7\x64\xf1\x8J\"V\xc0\x45?\xe9\x96\x62['\n\x81s\xf0" -"\xd6\x9\xfdQU=\xb\xa9\xc9\xe2j1\xf3\xa3\xcf[\xfX\xb4\xc2P\xf2\x14\xdfz\xf8\x12>\xc6" -"j&\xf8\x8\xb\xf8k\x9e\xe5rT[\xe8\xf4\xc6\x19\xd9\x37\x8f\x87\xa1\xe9nf\xd9J\xd2&" -"l\x1*z\x9e}\xb8,q#\xd1=\x13\"\xec\x11.(-\x85\xc1\x1\x18\x94\x9e\xa6\xe7n\xbf\xf3" -"5:\xaa'\xd4\x7\x87\xcc\xc0t\xf5\xfc\x8c\xbd\xe3#\x91\xd0R\x8c\xb7i \x92\xc9\x80|" -"w\xa4\x82\x97rj\xc2\x7f*JR\xf5\xdc\xdb\xaa\xac\xc6\x61\xd9u\\\"\x85\xf0\x11^c\x8f" -"!y\xe7\x2\xcd\x35\x84/:tG'O\xc5\x8czt,\x10\x93\x4\xc6J{\x4\xea*\x85\xdbz\xb1\xba" -"\"\x9\xd9\x65>k\xa6\x14\xbf\xa0\x85\x19\x9e\xaf\x1\x3\xb8w\xdb\x8e\xa8\xef\x10\xf7" -"sq 8\x12\x1f\x33\xdc\x35\xa3\x89\xcd\x8b\xc0\xbb\xe7\xacH\xf1\xbeN9\x97\x9a^\xcc" -"\x93\x8f^\x88\xfe\x35q2\xc4sJ\xf0\x9d\x7K\xf1\x33\xae\x8f\xb1:z\xe0O\x4\x15mhOJ#" -"\x81*H\x84\xf3\x1\xd7\xb6!\xad\x63?\x9b\x0\x95\xc9M2X\xa9\xa4O\xb\xcb\x1e\x82\x9b" -"\xf5\x63\x17izKz\x90\xb2-x\xf9\xdf\xc8\xfb\xb5\xe3\xe5ZW\x97\xe1\xe5\xa8\xb4g\xf6" -"\xa0Z^S\xb0\xf8\xedYij1\xf9\xa2\xd0\x5\xcu*\xfb\x9c\x97\x9f\x94gvA8\xe1\x1a\xb8\xf7" -")\xd9\xa7\xabg\xd0\xc3\xcezK\xe8nJg\xe9\xf4S\xf1\xa5&I\x9c\x82\xfd\xb7\xae\x34\xeb" -"\xe7\x90\x1\xae-\x9d\xc1\xc2\xad\xe1\x8f\xa0\x90\xb8\x36\x1d\x44\x85h\xdaX\xe4\x9c" -"\xa7\x98\x1c\xe9\x86\x87\x8b^!!Kt\xb1\xde\x63\x83PV\xd1\x5\xe9\x13\x42\x95\xfc\x34" -"!\xc6\xdcQ\xc\xac\xb6\x1c\xcf=\x4\xbc\x1b\xa6\xcf\"\xc2h\x0\xf4\x1e\xf1\x11\xc1\xf3" -"\xed\xfd\x1e\x1a\xe2\xcc\xc9\xcc)\xf\xc9\xdc;\xb8\x61\x1e\xdb\x66\xeb\xbb\xcd\xc3" -"/\xf1K\xb6&*\xe8\xa9Jb&7\xeb\xc\xdf=\x8a\x9e\xb2\xe6\x87Q\x99~\x96\xf9\xed\x80\x17" -"T@?i\x1f}c\xc9\x17\xc8&&_\xba&P\xab\x8d-\xda\xd4s\xf\x12\xca\xf\x9f\xbcp_A\x92\x65" -"\x94\xad\x9e\x19\x14\xf0\x85\xef\x83\xec[\xc6U\x84\xd6\xa4\xd3\xc9\xa0j\xca\x80y" -"\x1f\xfc\x1f\xf8X;>\xb6Q^p\xb7\xd3\x34TX7-tZ\xb5sL\xf4\xe\x8d\x30o\x97\xc2\xb3\xb2" -"7\xc6\x92^\xc\xb5\xbd\x96\xc6-\x94\x14\xf4\x3I\x92\xbf\x16\x30\xc7y=\xe\xa2\x85z" -"\xac\x64(\xc3j\xf7\"\xe5\x8d\xacjUn\x9e'\xbuc\xd3\xe6\x9f\xbc\xcc\x8b\xe6\x9d\x8a" -"M\xaf,k\xb\xff\x18\x8bz\xd3n\x0H\rD\xdc\xa7K\xfa\x1d\x1c\x2\x9fS4O\xf2;\xf5\xb0\x10" -"\x13\x1b\xbd\x91\x38\xf5@\xd7\xbb\x41\xd3\xdf\x8e|\xc5\xb8\x4\xec[,\xa5!b\xa7\xe6" -"\xc8Isf\xd8\xab\xbe~1\xbe\xef\xb3\x18\x9d\xb4\x43\x89\x32\xc6p\xff\x64\x63\x90\x14" -"L/E\xb5\xfb\xbc\xe\xf9\x81\xc7o2'a\x9a\xd8\xc6\x87\xe~\xaf\xa8\x65.%/\xe8\x46\x13N>\x7\x15\xec\xe3xx\xb\x6\x66ns\x8cN\xb1" -"\x80><\x1e\xf4-\x93\xdf\x45\x10\r\x7w \x9bK\x6G\xba\xd5\xbb_\x8d\n\xe3\xa6\xf4\x62" -"\xf5i\x17\xb0\xbb\xe2\xf4\x9b\xb3\x9c\xf3\x99Mh\xb4\xc3\xe3{]\x88\x12st4\xc5\xb5" -"\xda\xcaV\r\xb3\xd1\xb0\xc1\xfd\x86\xcv\xb:\x11\x83\xd5YA\xce\xc0\xf9\x97\xb8\xd6" -"\x96\x94\x11]\xae\xd6\\\x1b\x38|\x8eke\xc0\x99\x61\x39\xc1\xa7\x14\x6\xf\x64\x39" -"\xe9\xcc\xa6\x12T\xfatV\xfa\xe3)\xa7\xb1gK\xa5\x85\x30\x87\x62\xd6\x9e\xde\xa1I/" -"--\xe8G2\xd6\xf1\xec\x1\xdf)\xf4\x42\x0`\xae\x80\xa4\xeb\xb\xde\x61\xc5\x37\x2@\xa0" -"u*-\xdaid\xcc\xa9\x0\xee\xf8t\x81\xc2\\\x61\x10\x44\xf2\xe3\x12\xc7so8@:\"\x14\xdb" -"\xbbw\xc6\x9e\x88\x2\x88JR\xad\x12\xa5\x1cuz\xb0\xe0\xd2\x9aI\xaa\x82\x38\x86\xca" -"\xee\xe4=\xa9\x8b\xb4\x83\xfe\xc2Z\xfc&F\xd4\x39\x61,\xd0\x2\xbazU3\xab\x35\xe8\x87" -"\xce\xa1\xde\x97\xe9`\xac\x92S5\xf3[\x91\x82\x45Mmo\xb Q1\x19\x31\x91\xc9\x8fY0_" -"-\xb1\xa6\xbdw\xac\xe7\x9d\xb\xb3\x31\xfd\xab\x15\xbc\x1eK`\x1a\x9b\xc0Q\xa3\xc\x9b" -"\xc2\x9#W\xd4.:S\xaez\xd9\xf4Y\xc5@\x82U#\x12\x81l\x97\xac\x37\xf4\xb1\xe6^\xc6\xea" -"\xa9\xff\xc2(\x10\xd1\x9f\x38`\x16\x89\xb7;\xd7Q\x16\x96o\x8b\xc5\xfd\x88R\x17\x86" -"\x81\xf5<\xb3\xe5'\x94\x37i#,wzb\xc4\xdf\x10\xeb\xd7msl\x7fI\xc0\x1c\x8\xb5j)\xe4" -",\x98\xb1\xe0\xfbn&\xe4m\xcc\xe3\xdd\xfa\xdb\xa9\xfe\x4\x46\xaej\xfe\xcb.\xa0\xec" -"m\xf7 ,\x2\x88<^I\xb6\xa3z\xd6\xca\x37\xa3\xbd~\xcc\x1a\xcf\x63\x15\xc5\xea\xb0\xac" -"\xed\x83/\xe5\xe8\x81.\xda\xe4\xba(\xea\xbe\xab\x94\xba\xb2\x63\xfa&\x80\xa5\xa1" -"\xe7\xfe\xa4\x1\x32\xf\r?\xfZ.s\xbd\xb\xff\xbf\x98M\x8b\xca-y\xc4o.?\x0\x84\xc3\xdd" -"\xb2\xaeu<\xcdNR\xd6xI.\xf0\x63=s\xc0q\xce\x11\x1d\xb4\xefR^\xd3\x82\xf\x46\x64\x82" -"#\x92\xb8\x4\x33*\x80H\x8b\xdf\xcc[+\xbcua\xe2Q\xeM\x4G;&\xfd\x8d|U,_\xb5\xac\xff" -"\x10\xee\x83\xf5\r\xb1!\xb0\xe4S\xbd{\xea\xceZ\xb6\xbc\x43\xf2\xb7\xcf\xad\xb1\xab" -"c\xffr\x8a\xb6\xd2\n*\xfe\xfd\x19k\xe0\xd3\x43\x98\xcav\xf8\xc3\x8c\xa8\x46\x8e\x61" -"g\x8bN\xe4\x15\x46\xab\x9e\xf5\x14\xb1\xc4\x91\xaahy0QK\x9b\x83\x61\xa0G\xe2\x91" -"\xe6\x88\x1c\xe1\xbh\x8a\x17\xd0\x9Ss,h\x14\xe5\x35\xc9\x18\x9e\x41gn^\x19\xab/\xb3" -"\n\xe6W\x99HC\xbb\x19}\x8dP}e\x8a\xe2\x89\x35h\xd8?\xc4\xe5\x82n\xbe\xea\x1bP\xd1" -"g\xf0\x7f~\x9d\xa5VZ\xe\x15\xbbq\xee\x8b_\xe5\xfdg\x5\xcc\x33i\xf5\xa5\x96~Az5\"" -"\x10\xd0\xa2\xb1\x17\xf2lSi\xa9I\xf5\x83\xbd\x9b_\x9d\x17\xec\xf\x7f[\x9a\x42\xf6" -"\x8e\x13h]\xfb\x1\xd7\xda\xfa\\\xb0\x1a\xc4l\x81\xc7\x0\xb3\xd8y\xc7$Lm\xdd?\x92" -"u\x8d,ZC.\r\x9dR\x16\xb8\x9e\\OC;\x9br`N\xc9\xcf\xe7\xa6+]\xb\xf9%\xec\xde\xfb\xf6" -"\x9b\xc4\xf9\xb\x44\xf2{\xf7\xacgh*\x8b\x9a\x63'\x81\x82\x16X\xa9\x8f)-8\x1bH\x89" -"\xa8o\xb6xob\xf7\x42i\x1a\xba*\xcf\xe9\xed\xb8\x80\xa6W~\xb4<\x1c\x81\x64\xba\x99" -"\xf2\xadRZ\xc6\xcd\x39o\x19\xfd\xde\x9W\xcf\xec\xd7\x0\xd0 8\xb0\x81\xb7]j \xc6\x6" -"X\xd6\x1eN\xc1\xbf\xfe\xd0u19\xb\x61nm\xab#\xdfm1\x0\x94(\xef\xc4\x45\x7f\x1c/\n" -"\x8b `\x9d\x9`\x96\x34\xf0gQ\x1c\xb2I\x8f^\xdfn\xc\x13\xaa\xffu\xb7\x3\xec\xf5[\xbf" -"\x89\xe2\xc9v\xa7t1\xbai]\x5\xab\x80\x43%\xcc$3\x9d\x8f\x95$\xe3p\xb5\xb6\x30\x3" -"\x14\x5`\xfb\x45\xf2\x32\x89\xe4\"\xb1\x94\xe7\x1au!\xa7\x8d\x1d\xc9\xc1\x61\xa7" -"L<\x8c\xed\xa5\xb2IKt\xd4_p-\xf1\x98\xf4\xed+\xda\xcb\xfb\xcd\xad\xf6\xae\x39\x88" -"T\xfc\xca\x46\xc\xc7\x1dM\x9\xed\x15\xbf\xcb\x1d\xc5S\x15\x88\xa8\x84\xd6\xad\x9a" -"q\xf4\xce_Z\x4\xa7t\xb8P5~\x13s\x0\x7\x34x9DXS\x94\xd4\xe8p\xb5z6\x1d\xd6?\x3+S\xed" -",.\x95\x39\x8c\xb\xe9+\xd8\xf8\\\x17\xe3r\xdd\xa5\xf1\x18=\xc0\x1d\x31\x85\xd9y`" -"\xfd\xe\x19q\xa6\x4\xf\xe1\xcf\x98\xc1\xdb#D\x9aS+\xaa\x45\xf2\xdbY^\x1f\x85\x30" -"R\x97\x4\x8v\xfbZ\xbc\x36`\xc7\x38q\xe2\xfd\xe1[\xca\xf4\x34\xe4\xa9\xba_8\x18\xa1" -"\xbaId\xbe\x12\xf5wuH\x16\xb8\xdf\xe6)v\x19\x8e\xfb=)\xf4=W\xf7\x7\x18I\x8fO\xac" -"\xfa\n\xb4\xf5\xeh\xa3\xb3\xc8\xbbs\x1d\xb0R\xdb\x93@\x93\xd2\x94\xeb\x13V\xa4\xd8" -"\xfb\xce\r\xafr\x4\x2?\xd8\xf6g\\Od\xce\xfe\x8a\x84\x8c\x90'\xb0\xc5\x12N0;\xe7\xd0" -"\xb2\xdc~\xddW\xdf\x17V\xe8\xc4?\xe1\xaf\x15\x9d\xab\x14\xbc\x3\xb3\x11\x99\x97-" -"x\xbeq\xd1n\x8c\xd7\xa1\x83\x42\x9f\xa5(\xcb\xcc\xb1\xdf\x12TZ\"%\xd7\x87\xe0\x92" -"\x94\xb8\x46I\xac\xc8\xb6]UzA\x7f\xb3\x8\x8e\x1\x1e\xfa\xb3\x1fwx\x83\x32\xf4\xb7" -"Y\xb7?\xaf\xde\xb9\x98O\xca\r\xee\xc8yt\xc9P\x9cK\r\xd2!\xf8\x89\xcdU\x91\xf1\x1b" -"\xcc#k\xef\x81\x39\x94\xc4+e}\x8c\xac\x66\x31\x1b\x87\xb7\x8cR\xee\xf2\x85!l\xfa" -"c\xd7\x1f\xf7.\xa4Y/;\xc4+\xccO\xa1z|\x3\xc4q\xe3\x65\x1d\x17\xfb\xd3\xa1\x8b\xfc" -"\x5\xb7\xd7\xf8\xda.\xbb\xa0\xc0\x35\x14'A\xd7\xf6\x1dV\xady\xc0Tr'\xde\x9f\xf9\x61" -"G\xf7\xf2\xa1i\xd4\x83\xe8pX2\xb2\xa3\x41+\x9b\xd9\xa6\xff\x7f\x83\x98\x41\x41T\xe2" -"\xf\x16~\xf2\\`B\x99+=[B\xda\x61\xed\x84N\xc3\x99\xbb\x8e[&\x81<\xc2}\x95]\xeb{E" -"\x1c\xd0\xe0\x89$\xad\x99!\xe5\x1b\x2\x80\xec\xe0s\xe3\x16+\xe1\xb9\xb9\xeb\xf4\xbb" -"\x9b\xae\x14<\x98\x1e\x10\x15\x9a\xea=\xa3\x9d\x7\xce\xed\x88\x85Re\x19\x9e\xc8T" -"w\xa7\xfe\xf0\xd6L\x99\xd3\x9a\xf7\x9f\x97\xed\x1e\x89\xa8\xd1\x63\xed\xd7\xa8Wg" -"j\xe2\xfc\xb2(\xb\x0\xa3/\xa4;\xe\x37\xa6\xc2|\xee\xc\x19\xe8\x81\xa8~:f\xe9\xab" -"T\xb8\xe4~\x7\xc4\xaf\x9c\n\xea\xae=\x9a\xca\xeb\x93\xa2$\xa7!\xf2rq\\\x90\xf2Nj" -"T\xc!\x1a\x7\xc9\x18\xd3~\xa7\xdf\x85\x41H\r\x8aR#s\xb9\x30\xcc\xd5\x8c\n\xdb\xfa" -"\"<\xf6\xe1pvTg\xd5\x64\xf3hG\x82\x9f\x1btX\x87\x35\xb8\x33\xc3\xc5\xe3\xe4\x90\x93" -"C^\xecw\xbd\x39\x82\xb3\x44\xe1\x46\x81Zt\xdb\x34\xb2\x91\x1b\xce\xfd\x87\xf1\xc" -"\x93\xbdn\xf0\xbc{\x83S\x4G6/\x3\x65t\xd4\xc5\x6\xb8\xe7\x8f=\xac\x8c\x65\xef\xb6" -"V\x14<\xd5\xbcsq\xf4\n\xa3\x18\x96\xc6\xde\xbb\xe3\xdf\x9d\x86\x99\x66\xc2\x85l\xde" -"%\x82\xea\x92\xf5\xff#`\r{\xaf\xa0\xd9\xfaY?\xe7\xc6\xf5\xcdsaD\xe0$\x9d\xc6\x93" -".\xe1\xe6\x0\x7\xb0\x1c\xb9\"W\x1b\x8e^\xdc\xf8\x34q\xb0\xad\xc0W\x99\x8eo\x8c\xce" -"\xa3Ur\n\x85=A\xa6\xab\xac\xe3I\x8a\xc4\x97\xb5\xe4\x8cX\xa3\x12\xef!\x5\xc8\xd4" -"\xa9\xeeY\xa1/k\x6\xb8\"\x39\x30\x30\x1a\xd5\x39\x16@P\x6\xfc%O|6ip@\xa2\xc6\xe7" -"\x9\xe\xe0\x39\x44\xca\x6\xe7\xdb)\x94\xb5w\xdf\xe6S\xb3\xc6]\xc3\xad\xc7\xbd\xb8" -"\xe2\x83\x2\x39\xf3\x36\x35i\xb0kr\xcbn\\\x8\x10\x66V\xb4\x95\xd7\xe8;\x1e\xa6m\x9a" -"\xcf \xe9*r\xec\xf0\x9c\xdc\xa6\x8f\x82)\xd3\x32\x9f\x14*\x18\x19\xd7\xa0G.\x8b\x17" -"\xb5\xde\x1b\x8dZA2&\xae\xbe\xd2W\rs\xc5+\x1eG6N$P\x8dr\xcf,K\x8\r\xa7\xb2\xc1\x65" -"3\xdd\xc7!\xfb\xe|\xd4\x8\x41O\x93\xd8\xdd\x14\xbcr\x8a~\xb3\x8e\xc9\x91\xb3\xd0" -"\xf7\x80v\xeb\\\x91\xe7x\xd2\xf\x38\xf9\xbdwiI\x81\x17Un\xfc\xfa\x9\xf0\xd7\xe9\xd6" -"\xb6Zj\xfc\xb4\x63u\xf2\xd2\xcf\x97\n\xebg\xa2\xb3L\x18z\xb3\xc\xe1S\x91J\xf9\x85" -"aW;/L_\x6\x31\x9b\x37-D}\xaa\x1c\x93\\j\xaa\xb6\x95\x1a\x39s\xb7|\xaa\xe\x31\x87" -"s\x96N\xfb\x0\xc4\x9c\x16\x36\xa7p u\x9bl[E\x7~M\xbd\xb8\xcf\xb4\xb4\xcb\xb8v\xe3" -"\x2-\x83Je\xd3\xc\x14\x6\xcd\xca\x14\xb0\xf6\xa8o\xd2\x61\x9b\x9fKNO\xc2/\x9\x93" -"\x10\xfc\xb7\xb6\x15\x9f\x87\x63\xc0k\x1a\xe4\x98\xccZq\xa2\x87\"\x62\xc4\x1f\xe6" -"\x8c\n\x97\x90\xa1\xe2\xba\xab\"\x18\x83Sy\x95\xdd;^\x17\x61q \xb2W\x9c\x33\xf7:" -">/\xdcoC[\xe9\xb6\x87\xbdHn\xfe\xd6\xde[\x9dT\xd9\xcb_\xf4\xc5\xfZ(4\xba\x9d\x8c" -"\xb6\xf2m\x99\xd6n\xb1\x36L\xcb\xf9)BwQ\xe4\xdc\xfb 4\xc5\x1a@Z5[\\8\xa7\xf0\xc5" -"\xdf\x89\x8d\xf7\xd9=\n\xd1\x8a\x13\xd7\xf\xbe\x66\xa3\x4\xefmO;i8\\.\xcc\xd0\x1e" -"\x9fZ\xaf\x17\xb1\x7f_\xa6@\xeb\xe6\xe5sqn\x95\xadz\xe2\x1d\xf8\x12\xee$\xc6U\xb3" -"\xe6\xc5\xd6\x43=\x8d\x46i\x1d\xecz\x11(\xc8\x34\xe\xf6\x2\xf6\xc4\xa5`D\xcb\xe\x36" -"q\xd5\xfa\xf6\xcd\xe6\x96SH\x96\xf7\xa9v\xc3-\x93%J\xab\x9f\xaf\x11$\xb6\xb\xa9$" -"\xdc\xa7Z/\xdb\xe7\xd9tHu\x16\xfc\xcb\n\x8d\x1d\xfe\xa3\x82{gU\xdc\xb9%L\x7f`m\xea" -"%\x80@\xc7\xd9I\xed\xee\xcc:\xc6\x62\x88\xcf\xbc\xfd\x1bS\x8c\xdd\x8azy\x3\x9a!k" -"\xf4\x15?\x84\xe2\x9e\x19i\xdc\xef\x35\xfdP\x99\xb6\x80\xdc\x1f\xe9Z\x14\x95\xe5" -"\xf7Q\x8a\x94\xbf\x91\xde\x85\xd0\xed\xdbI\xe8w/\xf0\xe6~\xe1\x94;\x0\xf9T\x80(\x99" -"\xef<\xa2S\x1d\xae\x11R*\x9\xf9\xd0\x30\xc2\xd3\xb0\xc9\xd5\xca\x18\x17\x62p\xb6" -"\x99*\xb7\x61V\xb\x93\xe2\x42?#8\x87\xf7\"\x83u\r\xeb\xd9\xbc\xcc\xe9\xd0\xddY\x6" -"\x0\x89\x98\x8b\x66Y\x8b\x96\x87v\xc0\xddL\xa5\x1f\xfb\xc5\xde$)\xec\x9>z\xf7\xee" -"\x93\xe\xa2\xe6p&v\x9aO\x3\rK1;I:\x8d\xa1\x8e\xae\xbc\x86\x9e.\xb4\x34\xdb\xf7,\xcb" -"\x8f\xf4\x45\xad\x94\x1o\x14\x81\x35\xa8\x83\xbf\x18\xdf\x2Q\x81\x93\xa4K\xb3\x43" -"V\xe5\x9f\x9b\xb8\x8e\x11\x1\x84GC\xbX\x18\x99\x37\xc7p\xd6G\x9c{B_\xfd\xc7\xee\xb5" -"\xfds\xc4\xf\x11]\x91\r\xcd\x14\x14\x65><\xe6<_\x1c\x17q\xda?BcMr\xde\xf5T\x95{i" -"\xab}\xc6\x1f\xe9\x84\xaa\xde\x36Qw\xc4\xbei~\xdbZ\x83\\q\x14\xb1\x13\xd8\x0\x1e" -"\xc7i\x1a\x8c\xc0\xf2\x9c`.\xd7G\xcaY0(\xba\xfaR!\x9d\xc5\xeo\xa0yS\xf\xef\x9f\xde" -"H\xd9R\xb4\x3\xb2\xf3\x39Y.n\xa8\xe5\x9bj\xe6\x11\xec\xa5\x1e\x9cw\x90\x0\xe5\xc8" -"\xb4|c+\xc6\xb1\xa1\x7\x17\xb4\x92\x10&1*\xbf\xf2\xbb\x9e\xc9\xc7!\x7f\xed]\xd5\xc1" -"\xa4\x94v\xc6\x9c\xaeP\xdd\xbe\xa0^\xc2\xb9(\xf8\xd4\xd9R\xe8\xa5p\xa9\xc7\xe3\x45" -"\xfc\x86\xd9L\xa8\xb3\x93\x32\xb2/,C\xc3\x15\xd6\xcc\x12\xd6\xc1\x8\x8f\xac\xf6\xd9" -"p`a\x96\x4\x1f[6\x1a\x45\xae\x0\x32\x42[\xef,\xb5\xaegN\xe6\xb2\xb1\xbd_&\xa1\xe7" -"'\xfc\xbf\x17\x16\xbc\x83\x10\x84\xa0){\xcd\x90)\xe2\x95\xc9\xbe\xeb\xa9 IU'K\xf3" -"\xeI\xabp\xca\xc0\x85\xc0v\xc1\x9e\xd0tARP)\xa6%\xf4W\x90\x1d\x65\x38\x43\xa0]\xce" -"#\xe9\x44\x39j\x1d\x15I\x1a\xf9\xd9p\xa7\xb6\xac\xf7\x9a\xb\x98M\x11\x94\x10\x9b" -"\xb5R\x17N\xf0\xfa)\xde\xc2\xa9\xc4oV\xeb\xbd\xe9\x66\n\xe9\xf2\xe3\xe5\x80\xcd\xf8" -"\xe9\xb9\xea\xcf<0\xe6\x96\xbd\xd3\x14\xe4\x62\xfc\\\x9fy\x9e\x35\xc2\xff\xe4Z\x7" -"\x13i\xe\x42\x7\xcf\xdfp\x8c\xb0\xa4\x65\xd0\x45\xe7Yn\xfb\x16\x41\x39\xcbl\xe7\xd4" -"\\k\x83!$\xd8\x95H\x8c#\xd6\x34\xc3\x5\xc3\xa3\xe1\xeeP\\\xa8\xa4\xb4:\x8e\xa7l\xcc" -"\xae\xb8\x97\xd1`\xf1&\xd7\xb2\xb\x92I\xdf\xd6\x62\x8f\n\x83\xef\xa9\"\r\x14r\xf6" -"@K\x1a\xa6\x3\x36\xdb\xa6\x1b\x88\x87\xd6i\x92\x9Xn%Y\x90\x8\xb3k\xcf\x15\x1f+\xd2" -"\xfd\xaa\xf6u\xdb]z\xc6\xf5\x1f\x9b\x80\xdc'%{\xc0zi\xbf\xb8i\x96S\xb1\x92\x11\xbc" -"\x16\xfe\xab\xc2\xd3H\xed\x88\x88'\xdc/\xe7\xe0\x31\xe9\x14MN`\xe7.\x91\xd8\x6-\x12" -"\xbes\x90\xfam\x96\xa6V\xd7\xfa\xc7l\xb2\x42\xa4\x34\xc9\xbe\xcc)\xab.\xa9\x90\xf9" -"\xfc\x4\xc6\xf0\xb\xdd\x11\xdb\xc0\x10\xe3\xd6\xea\x99/\xf8\xabs^e\xda\xf9\xd9\x89\x1a_\\L\xca?X\xaf\x1f\x66\xd6\x9\x38\x84" -"\x4g\xdf\xcczM0\xc8\xf0\xfc^\x90)\x4\xbc\x41K\xf0kQ!\x92\x84\xed\x45\x18\\\x9aSW" -"*\xd9\xd9\xd1\xa6\xe2\xf9S\xbc\x12\xf5Y\xc1)\x82\x87\x3Vm\x7K\xd0v\x3\xeb\x3\xac" -"\xb6\x34Z\x1a\xc*\xde\xef\x96\xe5S\x5(d*\x1d\x93\x9e\\\xba\x62\xcd\"!\xd6\xee(\xd1" -"P\x83\xe4\xad\xf9I+\x8f\xc7\xc5\xeb\xee\xb6\xed*^(\xf0\xfd\x2\x8a;T5\xf5`\xe1\xdb" -"\xef\xaf\x44\xf3\xda\x19\xf7sa!\xde\xdd^\x9cJ\x15\xeb\xe7\x37\x5\x1cUbZ\xd1i\xcb" -"B\x1a\x11\xfe\x8a\xb0\x80\xe0\xa0\xd4J\x9e\x65\x8c\x8f\xd6\x37\xd1\x61\x66\xd8qi" -"KV\xafY(\xb7\xd2l\xc3`#8\xc7O\xf1;k\xe0-\xfc\x18\xbb\xdbo\xd9m\xc3\x8f\xdb\xbd\x82" -"\x9f\xdare\xe8\xac\xf0\x6\xae \xc7\x3\xb\x8eR\xfa\xa3Qg\xa4\xc7\xc0\xc7\x90\x8f\xe1" -"\x91\x16\xf2V\x14\xa0\x34\x90\xff\x2Zr\x91\xdaq6\x92\x17\x9a\xb5\x36\x8f\xf4\x14" -"\x81\xd6(P\x0\xc5\xd7\"\x11\xe1<\xf5\xba(n$\xec\xbdP\x84\x37\xda\xda\xa0s\xed\x8f" -"moB\xf1-h\x96\xb1\xc8\xd9\x39k$pR*\x8a\xb9\xc0\x66\xe1R|\xbd\x93\x85\x1a_\x15\xc6" -"\x9c\xf2k\xa8\xe2\x7\xe\x13\xa6\xaf\xd3\x64\xcc\xcc\x10V\x81\x1b\xe4\xf1z;[\xcd\xff" -"\x1e\xb\xd7`\xfb\x42M\xdega\xd7\xd7\"\xdb\x82\xfe\x34\x1f\x1a\xdb\xa2NJ\xae\x90\x9f" -"\xaf\xc0$\x96i\xdb\xejD\x99\xa4;\x10\xb4\x9e\x9\x1a\x2\xc7\xf8\xd1\xc7=\x93\x87k" -"\x8f\xc6\xfWX\x1c\xa6\x89ho?&;\xc0\x2\xc8\x36we\xa2\x87\xb3\x16\xf0iI\xd0\x8d%\x11" -"Z\x2\x83\xc2s\x12\xe5\x14\x8b\xc7\x19S\xba\xa9M\x1b\xda\x84\x1f\xf3\xc0\xb4\xe2\x99" -"0\xb0Yk\x84mq\xe2-|2\xddj%\xaf\xeev\xe8\xcb=PM-%Q.\xf2\xcf\xa1}\x2;\xe4\xea\x8e\xa7" -"\xe5\xba\xc5\x9f\xa7;H\r\xa6\x8}N\xc3+ \x87\xea\xcc\xc\xa4N\x8c\x1d:\xbfL\x10\xc1" -"\x83$_\x1bs<\x17m\x7f\xba\xby\x17\xc8\x44\x45M\x94=\xca\xbb\xa5n\xf2\x86\x3\xc3\x7f" -"b\xed-l4\xf5\xc8im\x7f\x10\xc7`\x99\xc5T}\xc0\xcf\xa5\x80o\xf8\xc8\x66\x9e\xb2\xde" -"\x84\xb7\x8\xce\x90\x95\x45\xa0\x7/\xd5\xda\x35\x96>\x9f!\x94\xc1\xb4\x86\x42\xf2" -"\xf3\x95\x9\x12\x45!\xc1\xc\x13\xdd\xb\xfc\r\x91UKi\xfa\x13\xf9\xefz\x80\xfa\x9d" -"N\xab\xa3\xbb\x8Tl5w\xe8z\xde\x93\xd4\xe3\xfb\xb4\x8b\xeb\xe7\xa8\xe6h\xc0\xb5Lj" -"\xe7qw>\x86\x87\\\xa4\xfc\xc6G]7x0\xb8#J\x8aU\xd4\x44\x11\xd2;_!(9Q\x90\x1e\xb6\xc6" -"\xf4wu\xcb\xd5\x9e~\xbdr4\xd8\xe4Ym\xda\xc5\xb8\x36\x37\xe7\x36./\x83\xe4\xa0z\xdf" -"\xeb\x8c\xdf\xa7\x7l\xea\xc0j*\xdbr\xe7\xcb\x92\xaa\xc7&\xbc\xa8\xf5\x37\xda~w\x18" -"\xe?\xc7\x1e\xfc\xba\xc0\x35'\x1e\x33}\xc8\xd6$\x80\xd5\x61\xea\xabW\x90p\xbe\x8f" -"\xd7\x63\xb3\x81\x44\xc6\rQ\xf2Vh\xb7\x88\x62QU\xf2\x9c\xa6\xd6\xab\xe3\x6Ot\xde" -"v\xb6\x1d\xad\xb2\xb\xac\xe6\xe1\xbe\x31[`\xaa\xc9\x33\"k\xcc\xe5\x32$\xbcP\xe@\xbb" -"w\xd2\x7f\x88\xd5k\xd1T\xf3kM\xa9G\x17)\x8c\x8d\xe2r\xee\x14\x6h\xeb\xb\xd8!\xf8" -"\xb9\x95\x82\x63[\xc3\x16!\xc2\xc5\xdc\x14\x90/:\xf2\x89\x1\x66K\xcd.\x11\x9f\xdf" -"\xe7\x0\x42;\xa6'\x89\x8aNT\xe2\x7\x1e\xbf\xa6\xbc\xf4\"\xc9\xa4\xa4k\xcb\x42x\x86" -"pH\x9d\xa5\xc4\x89\xb6\x11\xb2(\x93\xee\x11\x42\x9c\xdfH\xaa\x8b\x63\x9bO\xf5h}\xd4" -"5\xe0\xee\x14\xe9W70\xdb\xe7\x5\xf8mD\xfa\x65\xf\x61\xf2\xd3+\xad\xa6]\xbf\xc\x0" -"\xeb\xa9\xde\xf3\xc6?\xa1\xd7\x87i\x9\xcaZ^\xfc%\x2\xe8\x8d\x9f\x94)d\x15\xafr\x14" -"\x87\x85\xaa:\xbfZ \xa8\x13\xdf/p\xf3[\xdc\xee\xda\xebQMD\x10P\xda\xbx7\xff\x37h" -"uc\x15\x87\xc5\xd5\xdf\x9d\xe5\xa2\x36\x33\x89\xaa\xb4\xe2\xd9\xbfO'\xe1j\xfeJ\xc3" -"\x1fX5\xeb\x46\x9bHWQ\x97.\n\x94p\x3'\xbc\xaa\x43\x41\x1dJ\xc6\x5\xd4\x42\xc9\xef" -"r\xb3\xa8\xea\x8IV\xc\x81Z\x17\xc3\xf0\xf\xcf\x8cjc\xbf\x38\x17\xa7\x63\xf2\xc\x61" -"Y\xd1U\xf3&{V1\x11\xe4\xcbp8KZ\xbb\x65\x85(\n\xae~\xef\xc6\\}(\xbd\xca-2O^\x5\x9e" -"M\xcd\xe0\xec;\xba\x9bv\x7\xf5\x90x\xcb\xb6XQ&\xf5\x30+\x8r\xadUw<|\xaf\x63i\x1a" -" \x9d\x97NqG_\xd7\x0\xc7i\r\xb\xc\xa4Hd \xa4\xc0\xa2\xe4 c\xe1\x39\x7f*\x89\xd9\xa3" -"j\xfc\x1d,\xb\x19`\xb2\x86\xc9~\x15\x89O\xa9\x61\x5\x9dT\xf4\xb6\xdc\x4O\"phfg\x98" -"\x97(&\xf4\x87\x8f\x62\xb9[\x87`F)\x81\x19\xb3\xe2\xcc\x9aML\xe7?P\xef\xd0$\x91z" -"\xf0z\xc9\xee\x89\x2H\x99\xbc.=\x10\x45\xf2\xb5[\n\x10Z\xb2\xa9\x1ao\xe8l\x99\xd1" -"s59\xc1\xf0:\xad\x15\xd3\x87\xdau\x19@\xfa\xf0\x1ap\xf9G\xec\x64\xe7I\x4\x10\x43" -"}\xff\xcc\xc8\xd6xM\x8b\xcdv\x94\xe4\xb5\xe\xa4\xd6\xe5\xf2\xd6\xef\xdb&D\xb9\x9e" -"~T,\xbbnP\x94I\x10{\x10\xc1\x95\x36\x14\xe^\x80\xa5\x94\xe9\x9J\x8bO\xc8{V\x90\x6" -"W\xf0\x18\xff\"w|\x1fm\x90\xce\x16\x17\xa3\x18\xf{8\x90\xeeS\xe4\x1d)\xf0L\xefhY" -"\x9d\x9d\x16\x16\xce\xf0\xcd\x1e\x1cXv7\xaa\xbe\x97\x81\x38i\x96\x88\x12\xa1\xe1" -"\xb2\xbb\xbc\x9e\xf1\xca\xb0#\xf2\xf6\xfa\xb0\xeei?8T\x96\x43\xa7\x61J\xbd\x33\x82" -"\xba\xab\xce \xa4\xe4\xb7\x93X_\xf4\xcfg\n\xed\x8e\xf6\x32\xf5\x8c\x9f\xc9\x17\x13" -"\xa9\x8e\xe4\xa2t?z5\xc7L\x85\x1K<7`c\"\xfb\xff\xf1Jr\xf3\xb6\xd8\xc1\n\x9\xe4\xeb" -"\x94\xa1/R\r\xc7\x2\x0$\xcb\x80\x19\\\x9e(1\xd3M\x1c&\xc5\xfcN\xa4Gfk\x82\xe8N\xc6" -"E\x4M?#3\x95G\xbe\xbc\xab\x8\x32\xef\x7>5\x97\x83\xb3RT\xad\xd0\xa0\r\xe1Kw\x0\xca" -"DJ}qS\xef\xa5\x65\x8)p\xa5\xc9\xf6$a\xf1\xe3\x42-x2c\x4\xd7ix\xb9!\xaa\xf1H\xcb\xa8" -"\xb1H\xd1\xe7\x3\xd3J\xf5\xba\xa5\xdd.\x17\x63L\x88%\x8c\x83\xe\xd0\xd8{\x84\x8c" -"b\xddw8\x19\xcIW\x9\xa6[\xad*\xcdr\xcd\xe9\x37U`\xa8\xa2^\xdcR)!T\x14\xac\x13\xfa" -"[\x1e\xc2\xe3\x87\xa5\xdf\n%\x3\xdd\x93\xd2n\x18\xe2\x19\xa0\x12\xb5U\xe2\x45 \xda" -"|\x88\xba\xb4\xc{#S\xfL\xe2\xfc\xd1\xeb\x1;\x1f\xfd\x97\x8f\xe4\x34\x9b\xe7}\x98" -"u\xa6\xe1-\x96$\x94\xbc\xabX\xaa\xa5m\xf\xf8*\xa8'\xad\xb6L\\\xff\xe8i^4\xd7/\x88" -"\xa2\xbfn\x8b\x83\xb1\x36\xb4\xff\xf0%k\xa1\xe\x8e\x41\x66\x37[\xd0\xe1\x8b\xb7'" -"n\x91\x9e\x9c\xc0r\x1c\x33\xb4\x1a\x9f\xfcq\x18\xdc\x66\xf2\x6\xfa\x91\xed\x30\x9f" -"\xad\xf5\xcd\x95n\xe9\x18\x1a\xee\x35\xb8\xae\x92\x17\x8dy\xf9\x8f\xc7\x1c\xc5.p" -"\xe3\x11\x87!Fb\xa2\xfc\xf5\x0w.\x0\xa8\xdd\x83\"l%\xc3&CC\xab\x97\xd9\xa8\x88\xcc" -"\x80\xb4/\xcc\x14\xc3\x4V\xc0\xaa\xf3'}\xde\xf0\x33\xe6\xb5\x61\x14\xf9\xf1 \x80" -"xAS\xf6\xf7/\x80\xf1\xd7\x99\x82\xabh\x8\x9\xfbYj\xf0\xc\xf\\}c\x88\xf8[\x93<\xdd" -"\x10\xeb\x8c\x92\xd9s\x84\xf5\x9f\x37\xbc\xec\x8c\x86\x9e\xd6>\x2\xc0\x2O\xa2\xab" -"\xe0\x46\xa3\xae\x97U~\x80T\xb1\xc9;L,\xe3K\xfb\xe3\xc2.\x0+\x9b\xe\x32\xa3\xfc\xe4" -"BQ\x9bOC\xca\xc2L#\xaf\xa3\x90!\xca\xee\xd2\xa2<\xb6l\xd3\xe\xc9\xcbM\x98\xc8\x91" -"\xb9\xa7\xf2\x8a\x1e\xdcRG\xf6y&\xc3\x5>\xb0\x35J}[1]\x9f\xaf\xdbO Gl\xa0\xa6\xf3" -"#\x91\xb0z\xe8Z\xa3\xed\xa2\xaf\xbe\x39\x88`%W\xaa\x8a\xb6I\xc8\x93Q\x91r\xda\x17" -"j\xcc\xc0\xa6\xf0\xf0\x34qa\xa7\x82u\x81u\xc\xb9\x97\x9b\xe6\x80\xb4\xb3\x10\xd5" -"\xd6\x36\x1\xe0\xe0]J\xb0\xbf\xf5\xa7\x88\xb1\xbe\x8a\x42\x46\xa9\x8e\xd8*\x1a\xb" -"\x15\x1b\x1d\xa7#\xcf\xdd\xf8v\xd0\xcd\x1d/\xba\xa0\xc2\x13\xd6!j\xfb-\x17\xa8\x9f" -"+\x98\x62\xa1$E6\xe7\x91\x46UcUS\xed\xe9\xcc\xd2}\xe8\xce\xa8\x61MQ\x85\xd0-\xea" -"\x3\xd8\x90\xff\x37\x97\x41GjX\x83\x7\xc4\xf\x86\x19\x8d\x84:\x14\xdb\xc8\x43\x8c" -"\xfcu\x97\xfbq\x97\x83\xf1\xbc\xc6q\x19\xc5\xdd\xc6\x7fl 7\xe4\xd7G\xbe\xc1p\x94" -"!\xf0\xc9\xda\x14\x4\xea\x8b\x8d!\xc7\xa1\xdd\xe8\xbc\xed\xfa\x65\xfc\xae\xf1\xba" -"p\xba\x17\x17\xfb,\x95\xc4\x64\x19Ot\x8e\xf7\xaaSI\x8b\xec\x31\x7f\x39*\x87\x1a\xa5" -"\x97!\x9bv\x85\xfe$`\xa5\xdf\xaf\xb8\xe8Ltd\xddZ\xef\x9j\x83\xd6i\xc9\x43\x5\x9d" -"\xc7\x38\xf7\xf7\x85\x43~\xd4\xf9.\x10\xf\xae\xaf>\xa4\xea\xbc\x19\x9c\xe,e\x13\x9c" -"8\xae\x9c\x64\x35\xc7\xd3\xe0\xedQ\xc0\xa0?\xc9:\x1a:\xf6\xc7\xce\xbf\x14\x1bO\xa9" -"\xe7\xd8\x41\xc3\xdan)r\xd1\x94s\xd8\x38\x83-(W\xfe/\x8\xf2\x8b\x8dG\x12\xbeHB\xf9" -"g\xbbq\xa2\xa5\xa9\x65\xe8x\x11r`\\\xb6\n\xd1)\x1d\xc0\xab\x91\xdbI\xde\xe2\x97\xd1" -"\xd9\xd0\x5\xad\x9d\xf7l~\x9cK\xc3P\xb5\xaa-\xae\r\xe9\x7f\xbcI\x94\xac\xa2l\xe2" -"\xd1\xb1\xd9\xa7\x97\xab\x14\xe9\xc5\x8es\xc1K\x9c\x1e=k\xf3\x9=\x9d\x43Z?\xf7JZ" -"\xe9\xd2\x9e\xc0\xa9\x83w\xbat;\xfa\xf4\x9b\x8dhC7W\xf1\xc9<\xb5{JvW\x88\xba\xfd" -"\xf9-Y\xfWS\xa4\x83\x3\xb4\x85L[\xbe\x1d\x36\x8b\x87?\xf8\x15\xf9p6\x9bv\xdc\xc1" -"J\xe3\x8\xa9\xde\x8e\x6W\x9c\xf6\x65\xfe@t\xe2\xf2\x10|\r\x1a\xa1\xb4n\xb8\x9f\xf1" -"\xe4\x13\x81\xed\xba\x93\x9e\x42\xf9=\xb9u\x8\xed\x9b\xf0\x1bN\xf\x88\xee\xb9\xc9" -"T\xa6\xb6\x30-\x1e,\xaf\xe3p\x9b\x33|\x1'\x8\xf1\x93R\\ c]\xba})iV\x14\x43\xaa\x35" -"W*\xbb]z$\xda\xb1o\x13\xd9\xd0\x94T\xc5\x36\xac\x30)\x9e\xd2\xab\x97\x92N4\xbb[\x94" -"_\xd2X\xf3&\xa6\xbd?p\xb2\x80\xe7[8\xd7IO\x11\xf6>\xfdO|=\xa9\x8b%\xb8\xd9\xd3U\xbe" -",e{\x93\xec\xc1\\\xcc\x82\x84\x9c\\\xea\x96\xf4\x1b$q\xac\x8[\x14\x43\x45\xb8\x8f" -"K\xe0\xef\xb6\x17\xf3N\x89\xbc\x92'\x1b\xc9\x66\xc:\x18%?\xc0n\xeb\xd1\xe3\xad\x1f" -"\x17m\xec\x30=\xbb]\xe4i\xb7\x6\x93:\x17\xfb\xf0\xbf\x19jT\xbbqk\x95#\\\x92\x85\x43" -"nXh\xe7Vx'\xbapwF\xe3\x17[\xb6\"\xb9>:\xbf\xb8\x61\xe9tD\x3V\xc6\xec^\xb0\xce \x8b" -"{\x9e\xc5\x92\xf0\x1f\x97i)\xadlap\x9e\xf6\xa8\x89\x99\x8f\xfe\xb1Tl\xd2\xc9\xbe" -"\xcc\nJ\xd0\x45\xa1W\x8d,F\x89\x43\xae\x4]\xd8\xd4\x8cZ\xdf\xb0\x92\x97\xafX\xd2" -"%Y\xbf\xa6\xec\x1aJ\xdd\xd4[\xe0\xea,\xb3U\xa5\x1f\x9\x1c\xf3\xa0\x1c\xed\x7f\x4" -"4\x99\xbd\x80\x15\x10p\xb2\x14\x83\xcepn\xfcZ\xb2)UT\xfa\xec\xff\x38\x35\x65\xdc" -"\xb2\xa5\x96\xb6`\xf1\xc5\"\xcfm7\xe7\x14LRL\xf7\xc8I\xfc\x1c#\xdaj]\xb5\x1c\x92" -"\xd9\xc8\x41\xc7\x85\x1a\x94\xef|\x8ch\x8d\xfc\xbb\x3\x6r-b\x8Q\xf\xc3\x1d\xd8\x10" -"\xb0\xd5\x33L\xf5\x8b%I\x0\xcdu51}Z3\xd1\x96\xf7\xc4\x1b\x9al+\xd8W\xb1\xf6\x87\x86" -"M\xa6W\x7f\x7,\xa0\x99\x98\xb+\x1c\xb4\xeeRj.\xae$f\xc6@\xcbI\xc'\xb0\xbd\xb4\x45" -"\x3\xa5\xd9\xb5\xe9\xef\xf6\x93\x17\xd2>\xecG\xbd\x2%{`\xa8\x43\xaaj\x1d\x30\x35" -"\xd3\xba`I\xa3\xb9\xa8(Z,D\xdc\x36\xc2\x36'/\x12\xedsK\x3\x44\xed>Y\xe7i\xc\xf9\xed" -"\xaf\xd0\xd3\xe0R\x6\x30\x90^[\x89\x46\x45\xde\xafr)\xa5NHkY\x86\xd0\xa9n\xf6\xd6" -"\x9c\x14;\x1bw\xe4\x1f\x8b.1\xec\xf2\x35Y5\x4\xf\xac\xb6\x6\xa3\x8d\x14nkkL\x9a\xdb" -"`XA\xb3\xf2\xacp^\xcf\xef\xc6+\x12\xd1\"\x15\x8cr\\\xa6\x0\xc1\x37I\xf6:\xf0\x96\xa9\xd3\xf\xf2\x8f\xba\xcb\xd0" -"f\x9\x8a\xf0\x16N\x8c\xe0\x31YZQi\xd7\xb7\xfd\xc8\xb\xf8\xc4\x10\xafU\x9c\x1a\xc6" -"\x86,\x86%\xfa\x8c\xa9\x83\xf1*\xfb\x11\x30\xb\x92\x46\x32\xa1W\x3\x45\xd9&\xa1\xcd" -"\xb3\xb6\x66\xa3\x82\xa0)\xd5\xc3Z\xa8\xa5\x83\x83\r\x99m\xdct\xa9\x17{\x97\xbd\x8c" -"\xce;Rc\xa7\x14\x8cy\x9d\xc2\x19\xb8\xa1\x95\x8c\xae\xe1Y\x8e J\xe5\r\x85\x87*\xae" -"\x9\x30\xb9\x65\x13uPD\xddX\xcd\x9a\x8d\x85\x38\xcc\xe4\xa4\xcf\xaaL\xca\xd5\x43" -"\x5\x16\xdb\x8f\xe7\xf0i\x16g\xac\x12\x2W\xd2^M\x11" -"-\x84\xb2p\x94\x9e\x0O\x18U\x1c\x95\xc\x88t\xa9\xce\xeb\x61\xd4nJ\x7f.\xc8u\xc9\x5" -"\xf5\xdd\xc6\xf4Yj\x17H_\xab\xdd\xb5\x61\xd1\x44\x19\x41\xc7]w\xa4\xb4\xcfK\xe4\xc4" -"x\xd9\x62\xe5o\xa5\xe0\xb3\xe\x87\x36\x1d\xae\xd0\xca\xb2`\x83\xcb\xae\xb9\x38\xf2" -"\x3\x10\x86\xea\x91N\xed\x1c\x38\xd2\xe8\x65\x18\x6\xf6\x15\xd5z\x9cYc\x1d\x46\x36" -"\xb2h{@\xb1r\x99\x17&z\x9\x63\x89\xb0\xa8\x1\xce\x30\xe5\xee\x3\x36\x8c\x16\xf5\x41" -"\x86\x9e:\xe9\xcc{`\x9;\x18\x66\xb6\xcbq\xa4\x1f\x8\xa5\x1b$\xf\xfd\x98\xb3\xd9\xa5" -"~\x81\xb9-\xa1j\xcb{\xeq\xfc\x84\x6\x1a-h\xb\x7\xbc\x34\x87\xc8\x8c\x66\xef\x10\x2" -"\x4\x31\xd7-\xbd\x36h\xc2\x85\xb1l\xdcm\x85\x35\xc8\x9f\xde\xdd\xffx\x2\xff\xbb\x30" -"\x82Tr\xcbp\x9cxk\r\xef?\xbfx\xfb(wcnE\xd2$\xb3\x85\x3\xaa_\x17\xe9\xee\xc7YO9\xca" -"\xc1\x32\xe\xe2\xda\x89\xe6\xd3\xb0\x31\xc8\xec\xfbZ\xd6T(m\\,-\x8e\xf3\x83\xb$:" -"\xb5\xb7\x13\xb4\x92jU\x96\x5\xd6\xe0\xa4g^\xe9\xcb\x42\x9a\xer\xa8\xc6~\xc0\x9a" -"\xd1\x9f+\x93R\xaev\xa0\xe8\x81\xda\xc1I\x8c\xba\xa6\x42\xd1\xb6\xc7P\xa8m7,\xc0" -"\xe8K\xca\x86'\x19\x91O\xbd\x8bO\x8cg[\xb2\xb4\xfb\x86\xd7\xb7\xc8\x8d\x10\xae\x46" -"\xb8\x9\x1aY\xe~\rF\xfb\x15\xe\xb1\xed)\x95\xef\xbd\xc0\xb3T<\xd8\xb1\xd9\x46\xfd" -"\xe7,hh\xa4V\xd6\xf8i\x88\xaa$\xd1\xd3\xaa\xa8\x86\xa8\x7J\xd6\x92\xc\x91.\xaf\x1b" -"\x1e\x34\xb9/<4\xbW\xc1\x9d\x92\x9e\x9a\xb9k!\xfe\x42\x96\x89\xec\x30\xa1\xff\xe7" -"\xa6\xdb\xae\x13&\xedGm\x3\xfH\xad\xca\xb3\xe3\xe2\xdb\xc8\x1f{\xb6\x64\x1b\x63\x14" -"x\xa8 \xe0\x96\xe9\x87\xf5\x1e{\x92\xc9\xf4\xa8\xcd>\xf;a\x80\xa7\xe7\xe9\xa5\x1b" -"\x7z6\xd4^\xea\xc8\xb9\xb6\xeb\xe2\x86\xfc\x9d\x8a\x15}\xd3\x39\xa1\xf2\xabj\xfc" -"B\xb7\xd2\x16\x34x Qn\x7\x0%T\x1fh\x92\xb8\xd4\x2\xa7\xf5=\xa3\xbc\x84\xa4\xb0\xa0" -"{\xe8\xb0\x94\xcf\xe2\xae\x9a\xfe\x13xQ\xf0*-UI\xdd\xdc\xf6#\xbb\xe5\x7\xd2\x15!" -"`K\xe0\x19\xa5\x1f\xf[5?a5\x15h\x96\x63\xcc@@\xbd\xa5\x16\xb6`0\xcm\xb6\xf0\xbdr" -"\xf6'\xfe\xb1^h\xf1\xb0K\xdc@\xb5LL&\xc4\x6\x1a\x89\xfb\x93G\x13\x84y\xb3\x8aY\x91" -"\x8a\xe5\x62\xee\x32\xd9\x31\x90*\xc2\xa0\xb5\xae\xafk\xf4\xb2\xb0\xaf\xe1\xb5\x13" -"\xa3Zn\x9f\xa2\x44\x89]\xb3\xdax\x98\xf1\x1e>\x95\x31\xfe\x9c\xbb\xb4\xb0\xe6\x65" -"\xed\xc4\xc6\xb5g\xfc\xea(\xa5\xef\x14\x9\xa2H\x99\x4S/P\xc9\x1b\xcdo\xe7\x4,G\xfa" -" 2\xf2S\xf6t\x98\xf7\xd7nd\x12]\xc1\xaf\x7\xd1\"\xaek\x82x\xe1\x46\x8b?\x86\x6s%" -"\xb1\xb6\xfb\x64\xd1\xb9K\xec\x96\x10~d\xf6\xec:c\xafsO9\xd6M~\xb2\xc4\x15\xc9\xfe" -"1dsnk\xb3\xd5\xb2\xd2\x46_KyL\xa0\x85\xc7\x62\x7f\x88-\x87\x11\xa4\x1e\xd1H\xfd\xd5" -"7!\xb8\x10Q&\xfeX\x4#W\xbbI\x91\xfd\xf3\x33&\xdf;\x1b$\x80\xe0\x8eS!]\xebQ6\xce\n" -"\xab\xc6@\xaa*gi\xac\x37\x89\x8c\x0\x87V\xae!{Y\xc6\xe8\xfb\n\xdcl\xdc\xf9\r\xb8" -"\x4\xe5\x1e\x84\xfe\xac\x91\xeb\xa7K>\xe1\xbe\xec\n?\xa4O\x18\xa3\x3@\xbb\xc6\x17" -"i\xf6\x62\xec\xf0\xb1k\x1c\xbc\xf4\x5\x9f\x38\xfe\x93>\xea\xbd\xd9'p\xf4\xde\xfd" -"\xfc\xd8\x44\x1f\x7fYm\x1d\xc0\x95\xf9'Y]p\xb8\x9d\xa3\xe9u\x94\xb3:3h\x9fH\x8d|" -"\xfbzls\xbe\xc4\x62\x35h\xdd\x17\xcf\xa3\x98\x45\x61\xeb(UQ\xaf\xde\x35\x38\x1a\xeb" -"\xe\x82V\xbd;\xa5\x8d\xfl\xd3\xa4\xa9\xc8\x7=AK\xda[y&(\xfeZ\xc\x89M3\xebyv\x8\x17" -"\xc2\xaf\xea\x3j\xba\x15\x5\x9b\xcb\x81L\xf2\xee\x9d\xa9\xea\x14\x33\x90vO\x95\xce" -"#]\xecI(\xe5`\xf5)\xb5\xa0\"\x61\xe9Z\x4\x8\xc4\xf4(\xc5\xf1\xc8\x63zj\x87\x8f\xe2" -"M*l\xbb\"\xaa\x7\x8d\xc8\xaa\xb0\x1\x46\xaf\x33\x89\xbe?\xfb]l\xd9\x6\x98\x43\x8f" -"[Z\xf7\xda\x8\x99\xbf;{\rO\xa0O\xe2\x63\xe9\xd7(\x1et\xae!\r\x8aJ\xe7\xb2\x90\xde" -"\x17\xea\xee\x36\xcf\x35\x89\x9b\x15u\xdd\x62s\xdcP\x9d\x8c\x15\x6w\x96\x82<\xac" -"\x82\xd7o3Y\xf8\x2\xcf\x1ci\xdc$\xffv\x5\x45\x39\x38\xa6\xac\x8b\xbc*\xdd\xf2\x8f" -"'\xc9\xba\xfa*\xfa\x1\xab\x43\x99z\x81\x93\x33\xf6\xa4\x96\x62\x86\xe7\x98\x41\x7f" -"/\xbf\xbc\x14\xc4\x38\xe\xe9\x65\xed!:\xa5\xca\x64\xdc\x9e\x61\xd4Q\xd1\x7\x43\xb0" -"R\xc3\x9f\x3>\xcd\xee\xfd&\x8f\x42\xbd\xd3~\xe3\xc2\x9f\x8a#\xd5\xf4\xb8\xf7\xdf" -"\x19m5\xa2\xfa\xfb\xd2\x88\xe5U$r\x16IC\x3Lt\x10\xf3JB&g\xea\xf4R\xb6+\xda`\xe9\xc0" -"\x8e\x9ar9\x1b\x12]|Ji\xfd*\xd5\xb8\xb\x66\xb0H\x9b\ny\x8d\x62\xb1\x31\xfe\xbevA" -"\x87t\xd4\xaa=\xbcG\xb4\xbe\x9a\xa1\xd8\xf4\xc6#\xb4L\xfe\xd8\x66\x30\x5qM\xb6_\x1f" -"^\xe3\x83\xfbX\x90\xdf\" B<\x88>\xf7n\xdd`\xc5\x9O\xca\xc6\x12\xc0\xb0\x1cNMt\xc" -"f\x8d\x12z\xf2t\xcd\xcd\x1aV\xcfO\xea\xa7\xa8r\xd7\xc9w\xa1\x44\x0,}-\xad\xf1\x6" -"Mx\xeb\x35\xe7s\x8d\x99|\x5S\xfft\xdb\x30\xf1\x94>!\xe6\xe4x\x17r\x1\x34K\xd5\xd9" -"\xb5\rr\xbc\xdf\x1\x62\x8fw\xf8\x9e\xe5\xf7T\x99u\xear9\xb2V\xa2\xf3\xec\x8e\xae" -"\x2\xa8\xb4\xd2\x8\xddY\xed\x45\x8\x63\x43\xeb\xa7\xfe\xee\x15\x13\xd0\xd6G\r\x84" -"O\xc3\xf4\x62Z\xcf\xdb\x2\xado\x1c\xbd:7{\xc3\xb4\xc\xaf\x1a\xf0\x88q\xab;\\\xa4" -"\xe8\x38_\xfb\x31v\xa9\xc~\xce\xd2\x83\x91\x2:\xd4\xc5\x15p\xe5p\x11\xa2\xcd\x8e" -"\x9^M\xb0\xb0\x89\x99v\xea$\x11\x5\xcc\\\xe7?\x96\xa8\xcd\xd3\xc5\x10\xbd\x9a\xb9" -"t\xdf\xee\x1c\xf8\x8d\x84(\x9a\xb1\xe9\x5\xf7,\xd1\x41z\xb8\x63\xc2\x61_\xff\xe8" -"\xd5\xf5Sv@\x4\xf6\x41[Y\xe4\r\xb7\x11\x10=\xb\xddu\xb9\xb8\x18x\xac\xad\xc8\xab" -"\xe1\x12\"\x65:\xf4\xdc\x64\xc5\xd1\x5\xb5\x3\xcd\x85\x45)\xd5\r\\\xb4\x36\x3\x39" -"\x95\xe4\x6L\xd4\xdcY\x3\x81\"\x10\x46\x44\xbbV5\x11\xe1[)\xd3\x91\x93-yt\x10\x8c" -"\xa9\xb~\xec*\xe3\xe4q\xa3&L\xf3\xd0\xe9&\x9e\xa5~Z\xe\x38z\xae\x85\xad\xc\\\xba" -"\xfd\x83\x84\x43\x86\x95=\x8dy\x1f\xb0\xac\xf3\x87\x98\x1b\xa0\xa8\x91\xb\x17\x64" -"\x8\xf7\x64\x17\xc8\x9f\xbc\x45\xb2q*\xc5\xde\xf8\x63\xf3\xc8k\xd0N?\xd5\x86\x38" -"\xbc\xef\x83-\x81\x16\x18\x4\x8c\x30\xc9\xdf\xc8\x30s\xc2\x38\x9bm()\xa5.\x92y\xbe" -"\x98\x66\xa8\xd6#x\xd0\x0\xb3\x8|\xe0\x9c\xe9,\xbf\xd0\xa4`\x92\xbf\x4\xcb\xab\xfe" -"\xd2\xd7H\xaa\xa9\xfa MD\x8e\xb6\xce\x63\xab\x7f\x46k\xd8\x9d\xffP\xcew\x9dv\xe$" -"\x7f\x7f\x18\x31+\xe4\x1b\x33n~\xc1T\xf3\xf4\xfc\xd6\xbe\xe1\x41\xba\xb0]\xb7q!\xa0" -"\x3\xa1`\x7f\xe6\xb3*\x0\x80\xbc\x95\xb8hkS%\xb8\xe1\xaa\x41\xf8\x16\xa7\x7f\x16" -"\xe2&n\xac\xd9\xb5\x91\xe$\xaa\x6\xdd{\x96\x90;\x97\xdf)\xe0\x97\xdc+\xdcG@e\x8d" -"`\xf2\xb8\xda\xcdN9\x8 \xb1O\xb9\x61&\xeb\x97\x91\xe4\x66K$\x4\xce\xe4\xea\x14\r" -"\xeb\xc5\xff\xaa_8\xb7o5NI\x97\xaa\x42\n\x80\x35\x31\x45\x46\xc\xc9J*\\\xb\xc7r\x15" -"T\xf2:\xc7\xda\xcf\x0\x8b\x12H\xc1J\x85'\xad\xd8\x36i-<\x2\xf0\x88\x92\xc7\x9e\x63" -"\xcc \xec\xa2\x9b\x98\xc3W7L\xff\xca v\xfb\x5\x33\x97m|\x3\xb\x8e\x7\xecK\x18\xe" -"$,`\xb3\xd6\x12\xc0\x8d\x66\x44\xdc\x30\x7f\xef\x9a\xaa(\xc0\x81I\x9a<\xbf\x41\x9b" -"J\xd5\xa0\xa6\xfh\xa9\xd6\x13\x11w\x19\xda\nG\xd0\x42\x44]\xc3I\xe\x9a\x1dx\x15\x90" -"\xed\xda\xd4=\xd4\x61,\xa4\xf\xd4q\xe5\xa4N\xc\xbe\xc@\xae\xe2\xb5\xc6u\xdb" -"u<\xb9\"&86\x1d\xfb\x18VyO\xc\x38;LR\x8a\x80\xe8\x18\x9c\xb1\x89\xbcIg\xfek\x1e\x84" -"5\x19\x14\xea\xcfx\xb2$\xe5\x8d\x8\xbe\xe7PnlP\xb1#\xc1\x82QWQ\x1f\x83\x11\x8bp\x85" -"\xfe\xf3=1\x1c\x93\xe1\xa5\x1ev2Y\xfc\xb6:\xe4%\x8fI\xed\xa1\xed\x9s640\x5\r.ER\xb6" -"U\xe3\x8e\xe6\x15\x15\x44\x97\x44\x44\xda\x9a\x4\x42?\xe9\xb6\x44\xa0't||\x15\x2" -"\x9e\x4\x15X\\;\xc8\xbb\x91\xcb\xac\x33P%\x1eKfB\x1a\x12v+7\xc7\xc4\xe8\xca\x94\x39" -"\x90\x33Zf\n^\xbb\xca\\{+F:&\x3\xb0\x87;}\xcayO\xa2\x9a\x1*}FJ\x89\xbc\x88\x8b\x96" -"\x9bq\x1c\xda\xab\x92\xacI\xb7\x1bi\xf6\xae\xbe\xe7\xb8\x80\xe8\xf2\x1cG0z\xe5Y\xc6" -"\x95\xdc\xaf\x11_\xbb\x1b\\\xa3j{\xa9+\x9f\x30\xfe\xd6k\xd9)\x91\x32\xeb\xe8$zS\xd7" -"\xc0q\xd3\xe5\x31\x63@\x10\x83\xe1\xe4Jw\xedG\xaf{\x95\x34\xe2\xd2P\x83\x37\xa4\xe2" -"7>k\x84\xea\x34\x99X \xbd\x31\xcf\x99\xdeG\xcc\x34>\xe7\xac]yV\x86\xffm9F\xf6\xa7" -"\x18\xa2\xb4\xe1\x38\x8ej6a;\xd0\xb\xe9\x8c\x1\x7\xafV\x90\x43O\xb0\xf8\xd6\x41\xdc" -"X\xf4u\xa3\x82\xb2O\xe1\x84\xb9\x6\xb0\x1\x14\x62\xd8\xdaXu\xd2\x92\x84y\x99\x9c" -"\xc0\x1b\xca\xfb\xc\x15\xeb\xd5\xaf\xc4\x12\xcb\xf4\x11\xd1\x1c\xd2\xf3xy\xa1w\xd1" -"\xeb\x1e\x19Qk\xc\x87N\xaa\xa5\xa5?\xb4\xc\xe3\x37S\xe2\xe9\x93\x61\x87\xe4\xdeQ" -"HhrG\xb\x15\xbfT\xc6t[C\x86\xd5h[\x81\xf\xa7\x1f\xa6\x8f%\x8\xfb[\xa2\xce\x9b)u\x8b" -"m\xa5#\xb8\x95\xd6|\x1\xd3\x1c\x98\xdfM\xeei)d8\xe7 \xbe\x38t&\xc7\xd6V\xd2v.Z\xcb" -"\xc2\xa9\x84m.\xfa\x8eI@t\xa1\x81Gs\xbc\xca\xaf\xfc\xb2\xc\x82\xd7\xf7(\xa9\xcd\xee" -"\xb9\xc4\xc7\x31\xe7tO\x94W\xf5\xb5u\xeb\x8b\x19 \xd2Y\xc0\x9[6\\\xaa\x35I\x8\nQ" -"[\xb4\xa2\xe1\xed\xb5\xda\x8\xe\x12\xb2\xd6\x5\x41\xa7\x12_6B7V\xe\xca\xf4\xa3\xb6" -"\xd4\xb5R^\xa1\x14L|\x1d\x66\x9b\xdb\x14\x62U?\x9a\x1\xb5\xd1\xe0\x37\xd6\x12\xda" -"\xd9\x5\x9a=\x7fpm\x8d\xe4\x9b#N\xb\xac\x63\xdb\xf6\xed\xd7\x8a}\xe2\x0\xdch\xfe" -"\xd3\xde\xb9\x1c\xb2u\x86\xe0\x46\xb7\xeb\x1c);\xc0Kf\x8c\x13\\\x17\x64\xbc\xbe\xfe" -"\x4\x9c\xfd\xfdHi\xd6$\xbb\x88\x45\xaa\xb8\xaa\xda\xd9\xb1\x82^\x83\x19\x15\xc6\xbf" -"'\x96\xd5\x9b}\x9\x3 \xa7\xd5@\x7f|:\\\xde\xe2\xabt\x8dT\xe1\x18W\xf6\x41\x9b{\x1" -"i\xfb\xd1Uk\xfep\x1fR\xb5J+\x82\xea\x1\xf0\xc8\xa1\xa1\x61\xb4\x9a\xe4\xcbq\x11\xab" -">\xfc\x90\xf7\xbe\x35\x99YM\xdak\xc7\r\x36\x45\x39\xfao\xfa\x4-st\xdc$\xbd\x86\xba" -"\xf9\xbe\xae[\x11\x10\xa5\xa4\xaeM\xee\x32\xfc\x66\x7HRos&,\xe7)7\xd8\xdb\n\x34\xaa\x91" -"\xb2\x30t_Jg\x91\x1eN\x80\xb0Hd\x8e\xcd\x8a\x8e@\xb9\xb\xea\xebr\xaf CB/f\xe3\xa5" -"\x91\x96*t\x9b\x95G\xe0\x95\x16\x1fwB1\x85\xeeTNs\xd1T\x94\x18\xd1\x90\xb1\xc5\x81" -"\x95\x1f\xf3\x62\x1\xeb\x81t%\xa7s#\xd8\x4\x16\x2I\xdb\xce\x89\x8d\xe3\x95\xf5\xce" -"\xff\x17?$\x89\x64\n`\xe5)\x2\xab\x80[\x93\x61H\xa4\xee\xcbg\xeb\xf3\x9b\x93x\xbc" -"\xf8\x81\xa2-\xe9`\x84\xd7\x18\xa2\xd0\x44{~U\xc1\xb\x8em\x9d\xaa\x65M\x96\xce\x11" -"\x13\xf6\xbd\xd0\x45\xe4\r\xd8\x85\x34=m\xefSW\xf1\xaf\x85\x85\xcf\xcd\x1em#\xd9" -"\xfd X\x82T\x9a\x61\xby\xe\x61\x80\xac\x84.:6\xda\x8c\xb5\xe5\x90\xf9\x10^C\xd8\x95" -"@q\xdf\x6\x8f\r\xba\xac\x1f\xa3\x96#,Y\xe0\x8\xd8\xc8\x86\x9b\xd8\x11rA\xb1\x7$T" -"V\xc9\xf6\xf7\x44g(\xa1\xac!\xd4\xa8\x38\xdf\x85\x96\xe0\n\x98\x14\xad\xc8\x88\x2" -"z\x90T\xcf\xc8\x61~\xaf\x1d/\xeb\x66\xbc\x31\xd0*\x93\xad\xa4\xccX(\xcc\xd6\xea\x5" -"U\x1a<1W\xf\xf8\xc7$\xccoc\x97\x32\x8f\xb7\x8c\xf6\x10\xb6?\xd1\xee\x82;\x9cu\xf0" -"2\xe0\x18Y<\xcaw\x19u\xff\xf\xe7\xc1\x61\x65\x36\xf4[\x9a^)\x85\x39\xe3\x43\x36\xfc" -"\x9d\xa7\xb2\x4\x2\xb1\xd3\xf6(]\xec\xf5\x4U\x0*y\xb8\x82N+{\xa0\x6\x9f\xf3\x9b=" -"A\xf0S>\xa9\xd7\xea\xd7 \x14\x65n\nbPa\xe8(#_\x11-cc*\x19\xdd\x80\x8c&\x91\x18\x4" -"\xdb\xa1\xc7Q\xb3x\xf9\xd3(\xe8\x41\xd3\x94(\x9\xe4\xd9!\x5\xf2,\xf4\x15Uk\x9b\r" -"]j\xf4>,b\x1d\xe6\xba\x34\xf5\xb0@&\x89\x61\xbeV\xed\x89\x13\x10\xd8\xbc\xe7x\x9b" -"\xe4\r<\x9f!F\xfb\xd9\x8cmj\x87\xce\x61\xf6P|\x8d\xb4o\x1f\xf4PGm\x16\xa8\x14\xae" -"dS\x88N\x1b\x6\x15\xeeG\x2\xcd\x85\x66\xb3\xeaU\xcb\x13\xadr%\r\xa1\x9e\x96k\xbf" -"\xc2=\x9f\xa7=\xd4\x35~=S\xf9'c#\xa9\x39\x8\xc9g\xb2\xb0\xcc\xb3\xc4\x81Z\xe8\x12" -"=\xc8\xe0(\x7\xbc\x6\xc2\xfd\x43)\x8d*\xbfqZ\xaaPp\xd3J\x94X\xb7\xc5\xfa\x31\x37" -"\xef\x11\xe4\x81\x9c\xc5\xbe\x17\xcd*\x17\x61]d\xc6\xfd\xbe\xc6\xdc\x61\xf5\xd6\xe3" -"\x81\xa9\x66\xf0\xfe\x99\xec\x62\x13Ua#\x5\x83\xf4\x5|\xfc\xca\xba:e\xd2\xfb\x30" -"\x92\x13\xc2\x8d\xd1\xd1o\xe9\x8etY4\xc\x86\xdaV\xec\x83\xf6oY\xa3~\xad\xd5#%\xb5" -"A\xe1\xb9]\x91\xa5\x91\x17\xe0\x38\xd2\r\xb8/\x3j\xad\x19\xf6\xcc\xca\x3#f\x9e\x65" -"\x11P\xb4<\x91`s\xf5<\xe\xfe\xe9\xdc]\xc8\x86&$\xb7=[\xc3\x31\x35\xcbr\x8f\x15Vj" -"~d\xf8\xde\xc3\xed\xb6\x16\xf1.#\xf2Z\x8d\xafl;\x9x\xd7\xa5\x1a\x33\xbc\xf1\xfd\x9e" -"O\xed\xb\x5\xb8\xee\x95<7\xa8#\x8c\xe6\xff\x43\xd9\xb7\xe0\xf0\xa4\xa4\x1e\x10\x64" -"\x1b\xa5\xf2\xfe\x8d\xe\xbd\x43\xfbo\xd6\xfc\xca\x41\x95\xd6\xf9\xb3V\xf6\xb7]\xcb" -"\xb8\xeaj \xffP\xe5v\xdf\xa6\xdb\x1c\xcd\xd7\x64t\xc9\xb2;\xea\xa5\xd0\xfeqc\x5\xad" -"ma\x1b-\x81\x17T&\xa6]\x1e\xf3^\xbf\xb6\x16\x0\xdb\x18Q\x16\xaf\xd3\x16\xa7\xaf'" -"\xca<\x1f\xaa\xdc\x5\x1c\x46\xbe\x46\x1\x18u~\xa1Y\xd8@eSx\xa6(\x91>\x8f\x8b\x9e" -" \x6Kv\xd7/v>\x8c\xf3\x1d\xe\x84\xf5\x81\xcf\x65\xd8\xa9\x17\xef\xadt\xef\x3\xca" -"\xe\xfc\xc2`R\x15\x34$WE\x1e\xfd\xcb\xfc\x1d\xa6\x1f\n\x81\xd5\x8b\xc9<\x7f\x12\x39" -"\x97\x2\x16\x1f\x32Y\xfa\xd6\x8e\x98V\xa2\xeb\x64\x92[^\xff\xcc\xba\x1\xc9\xdc\x11" -"5\xb\x41\xcagt\x0\x1ft\x87l\n\x5Na`T\xbf\xf2=s\xfe\x4\xeb\x86y\xb3\xb2\xd2\xfb\xd1" -"\xaa\xd1\xab\xb0\xe0Z\x84\x63\n\xad\x1c\x64\xbf\xffL\xb9\xb3\x1d\x8a'\x15'u\xeb\xd2" -"\xd3Hb\xc8O,\x8e>\x11\xa4\x15\x61\x1f\x92\x91\x8u\xb9\xcd\x86\x15\x83\xb2\x83\xcc" -"\xfc\x9e\x80qF\xb3\x9b\n\x42\x9a\x80\xc2\xc6O\xdfpQ\x2n~w:\xe1\xf\xf5OH\xc6}i\xb7" -"\x5\xea`\x98\xae\xd8\x8f\xfb\x83\x97z\xc6\xa2 \xea!)}\xb2\x2\xce\x91I\xd0\x7\x9a" -"\xee)\n\xe0\x8c\x63\xfa\x1a\xbb\xe9\xc1\xee\x0\xc6\xf1${\xf7\xc4\xbb\xe0\xc5.\x2" -"0\xeasc\xa4v\x96\xa3\x31\x8ao\xd8\xe3/\x1b#\xdas\x1a,\xc\xc1y\x4\xc8-\xf9\xe7\x10" -"b\x19\xd8`\xe\xbeLK\xac\x34\xfdX\x9\x65\x96\x9c!\xfe\x63\xefmbss\xbd\x95'\x93\n\xde" -"\xe2\x66\xdf\x36K\x9a\x8b\x3\xf3\xf4\xc6\x1e\x85\xf9K?\x17\xc2\x12\xc3\xa1\xe6{\\" -".\xea\xda\xbb\xf7 \xe9\xdd\xb9\xb1\xaf\xa4\xa1=\x9f\xc0\x41,\x15\x17+\x15\xe5\x9a" -"\xbbgQM-\x18 0\xabG}\x1c(=\xe1\xd0g}\xc6\x93<<\xf5*\x11\x88\x19\x96z\xe5\xec\x16" -"\xd2\x90.\xb4\x9f Y*3\x97\xb0\xb6\xadg\xd2l.\xb6\x8e\xf4G\x12\xe4L\x16\xc8\xbf<\xec" -"\xfa\x36S\xa4\x3\xb5\xff\xc7}k\xcd\x80\xea\xa5\xc4\x80lg\xee\x6\xcfib5\x82\xcd~\xb4" -">I@T\x9at\x7f&\xbe\xdd\xd6\nm\x1a\xdbW@%)\xa9\xba\x64p\x87\xa5o\x96Z\x93Qk\xcf.'" -"\xab#~+\x9f\x61\xcc\x89\xd5\xc6\xcb\x0o\x6g\xd1\x42\xbe\xe8\x9a\xf8\x0\x9aV\xffM" -"\xc2ie{\x11\xf0\xbfW\xf1\xfd{\xea\xc2z\xf3\xfb\xe8[\xf3\xff\xf1Uf\xac)N\x18#\xf5" -"`BW\x8K\xb7\xad\x38\x38\xee\xe6\xcc\n\xa0\xc1\xdd\xcfqz\x92\x14\x61\xa4\xedV\xa5" -"\xbay\xaf(6\xd3\xc2*Gq\xb3\xf0\x85\x14\x83,\xdd\xb0\x96T\r\xa6>\xb9P3\xd0\x7f\xf6" -"\xa0\x46\xe2\\\x98y\xdf\x7f\xf7\x62\x7\xd2\x1c\xff\x63\x97\x1f\xf8u\x2\xf9\x13\xa6" -")\x83\x84T;\x13u\x12[J\xdc=\xdd\xb9\x31\xdd\x88\x1a\xa2\x81\xc8\xb7K\x99\x94!c\xc8" -"\xd9<\x1a\x16\x61\x42\xc4\x31V\xf6\xa4\xe8\x15\xe2\xad;\xd2\x91\x34\x9b\xabS\x9a" -"\xa8\xfc<\xf0+\x2\x18\x9d\x15\xb8\xf7+\x1e\xc7\xcb\x95:\xbf'\xce\x1q\xca\x63hCN\xd5" -"\xc3\x9fZM\xfb'\xb2\xa8Pb\x6\xb9 1\xbf\xb2\xdc\xbb%\xeajP\x92$\x14\xcf#\xa2\x8d\x8c" -"\\\x13\xef\x1\x8b\xba\xf4\xac\x95H\xe0\x43\x42\x61\r\x9e\x9f\x37\xd2\x85\x85\xb6" -"\xd5\x91\x63\xed^?j\xbf\x3)\xe2 \x8b\x95/-*\x1a\x8c\x11u+\x5x\xac\x88(Fb%z^!\x83" -"\x80\xd3]5fl\x1d\xe9,7\xca\x37\xc1\xdagv\x80\xbe\x63\x4\xf6\xfy\xf\x1e\xeeM\x4\xf1" -"U\x0\xce\xbel\xdd\xc9\xb3\xe7\xb6sH\x8b\xcb\x4\x92*\xd7\x19\xf1$-\xd9O\x97\x91\x42" -"mf\xa2\xba\x8\x41\xc5\x63\xc9\x9eWeG\xcd%\xe2\x8d\xb\x90\xc5\xab\xec\"\x18\x9b\x43" -"6\x85\xdbt\x1a\x96j\xb3\xe\x15\xb8-\xcfI\xa8\xd9\x15\x85\xc8\x8e\xc\x31\xc0'o\x7f" -"\xb9\x18\x9e_\xb3I\x1f\x15\xbe%\x9c\xd5\x2\xe9\xb4[G\xde\x10\xbc\x87\x8c\xe|[L\x88" -"\xeb\xe0\x90q\xed\xff.$\x10\xe9\x14\x1b\xdd\x5Z\xb4I\xe0\r\xe8\x1\x45\x92O\x17\x16" -"\xd4\x1T\xf6g\x93\x13k2P\x81\xe7\x31[\x87\x94Or\xf2Vf\xe0'\x10\xcb\x96Y\x99\x8a\xb5" -"\x8d\x90\x84\x88\xb6%+\xd5\xef]\xc3\x8\x61\x97\xcb\x9\xbf\x88\xfeS>\xfa\x8\xd0\xa8" -"=t#\xb9\x8\x8a%\x9d\x35\xaa\x8G\xb7\xe9\x13\xa5\x43\xc2\xad]\x2\x11\xc7\xa1\xc0\xe0" -";q\xdd\xca\xc5\x17[\x96v \x11\xff/\xd4\x16\xdc\x8e\xf9\xbbn\\D\x8f\x84\xa6^\xf2R" -"\x8f\x8c\xd3L\xab\xbf\xdfh\x8f\x14\xb0\xdd\xe9O\xef:I\x4O\xf2\xe2\xcc\xb1\xc8-9i" -"\xa7\xca\xf2\x8f\xee_e\x10\x0\x35*E\x1d\x3[h))*\xc0\xaa\x64V\x91\xb0\xa5\xa6]\x19" -"\xf0|\x9d\x88\x42&\x8a\x10\xf1\x1e\xcd\xe1&X\xd7\xa1\xd9\x97V\xeb\xf5x\x8f\x3U\xff" -"\x1f\xe4\"]\xad>\x19wZ\xfc\xf7\xea\x92\xbf\xcd\x37\x4\x83\xc2\xf_e\x85\x1d\x14\x41" -"\xae\x94\xd2_^x\xbf\x17S\xb6\xd3\xb\xc1\xd5@\xe5\x45\xa9\xa5\xe4\x98I\xfa\x18^\xae" -"\xa3 \x1f\x12\xf1\xf9ZLM\x98\x44\x39\x95\xb6\xff\x84\xd7t\x86\x65@\xc3\x1\x64r\xf8" -"\xde\x1c\x62\xaeJX\xa3\x9a:\xcb\x42\xc5\x6\x86\x39'\xebX(\xe7_\xeV\xb4\xa2\x87\xf6" -":\x99\x88Jamw\xe0_K\xd0\x17\xea\x5\x7f\xd5\xf6\x91\xa6'w\xe3\xbaK(@\x86\x1a\xbb\xce" -"\xea\xde\x83\x39\x16\x33\xe4\x9\xa1\x34#\xc3`\x9e\x86\x2\x11\xc6\x82\xca\xed\xfc" -"n\xe7\x81*M\x97\xf1,\x13l\xe\xfd\x89\xa9\x38l\xf1\xa6}\x8\xc0m_\x94\x83\xdc\x44\xb" -"wr\x8dv\x6\x9d\xae\xde\x8e\x14\xf0\x89^\x90\x97\xb6\xb9 &`\x99\xa2\x10\xa7\x15\x92" -"7\x1a\x8f\x30\xb1\xb3\x9d\xa9\x41\x43/\x99\x12\xf9\x9a\xc4Q\xa7\x65s\x10\x38\x91" -"&\xe0/\x1a\x45\x64U&\xe7\x18\xad\x38u\xfc\xfu]\xbd\xe9\xdc\xb9\x8b\xe7\xc6\x3Ngu" -"\xc2\xf1\x33\xeag=\x8cO\x0zb!\xef\xf0\xd8\x91\xcf\x93\x94\x4\x8b\xf9_\x88\x5\xdf" -"1Q\xb0\xe0IL\xf4!d\xae^\xf3\xe6\x81\x35\xb3'\xe0\xe2\xa7\xfc\x8e\xf5~\xba\x31\x15" -"\xb5t>\xeb\xe8\xa9\xe0\xdfRUN\xe2-I\xe4\x9\xb9kS[\xfa\xe\xb1\xd2wD\xbe\xe8\xc9w/" -"\x18\xb9\x98\x91\xd0\xc6\x92\x9d\"\xfe\x1fY\xb7\x92\xc6\x95\xe0\x82\xdf\x16W\x8d" -"\xf8h\x8b\xd4\xf5\x90\x64xX\xad\x43\x44\xef\xd0\xba\x62\xf4\x38\xe0#P\x16\x46\xd4" -"\xf0\"\xb1\xdb\xabgG\x8f\xf2\xfb\x65'`\xa5\xe0\x8b\xf4\x2\x1e[,w.\xa9\xa1^vtq\x19" -"\x18\xee\xc2\xd5\x1b\xfb\x32;\xd0yY\xbb\xa5\xdb\xa6\x1b\xbb\"\xf0z;\xd1r.0\xf6\x86" -"'\x80\xf6\xeaic\xed\x42K\xf5\x10P\x1f\xc3\xb3\xca\xb6\x10\x34\xec\xa4U\x5\x9cG%\x91" -"\xc3\xc9\xd5N\xc4\x46.\x1cn\x8f\xb9\x2$`J]\x1a%\x12\xe6\xfc\xcc^h\x9e\x6\xf9\xcf" -"x\xea\xb2\x9d\x61\x65\xba+\xdb\xe9\xb9\xc2!O\x3\x17w\xe3Qu7\x9c#s\xaf\x98.\x15\x8" -"AY\xff\x8d/\xe6Uo\xc3\x65\xc5\x7f`\xca\xe1\xe\xf1\x8d\xa3K[\xbe\n\x81Hz\r\x1c\x9a" -"kkF\x8f\xd8~\x10\xe4\x7f\xcd\xfeq\x10H\xef\x15\x0u\xc\xfdZG|\xc4\x1c\xe3\x9\x1ek" -"\x9\xd2i\xdd\xed\x66jE[\xd3(\xa9m\x8b>\xa4\x38\x14P>\xe9\x1c|m\xb0#\xb6\xf5\xb6\xd6" -"\xa3\xbb\x10\x66\x88\x36\xd9\xf3_o]4\x9s!\xa4\xcdZ/\x6\xf9\x42\x18\xbdR\x87\xd3\xb7" -"\x5\x65q\xbd\xd9\xc0O\xff\xbe\xe3\xeak\x2\xef'\xe1\x17\xb6\xebVa\xe2\xfa\x45\"\xd4" -"I\r\xd2\x4\x1d\x9di\xee\xe5\xdb\x1a}q\x85\xca\x32\xf2\x8Q\x84\xdd\xae\xc6\x8c\x11" -"\xa9\xe9\xe8\xc1\xf1\x36\xd9\x38\xdb.\xf\x8f\xe8\xe5\xffr\xe1\xfe\xb6l\xb5\xaeqC" -"\x10\x15\xeb\xa6\x0\x41\x92\xbc&\xdb\x9e\x45\x65\xec\x1a\x1fv\xa1\x86\xa8\xac\xef" -"sw\xadm\x92y\xfc\x91\x94\xe2\x84\x66\xce\x66\xe|8g\x1\xecWd\xf7\xed\xdcU\xec\xa6" -"\x8a\xc1\x8c\xc5\x31Zp\xb9\x17\x8eq\xcf'Q\x1c\x1c\x98\xf4\xe\xdb\x1a\x1d\x62\x17" -"v\xeb\xbd\x1b.7\xd8k\n\xc6j\xc5\xa5~\xe\xc6\x9\xf7\x12\x80]\xae\xa5\x84,-\x80\xc7" -"2\xc1\x12\xee\x8e\x38\xd9Y\xf2\xc7w\xa1\x89$\x14\xae\x82:\xf0\xe4\xba\x8a\x4\x63" -"\xddG\xaf\xd5{6\xf\x2\xdd\x42\x86\"\xef$\xf2\x1ay\xcdi\xb4\xf4\xe1\xcc\x4\x1f\x88" -"\xe7=\x8a\xfd\x13\x12\xe7\x64\xfe\xc8\x41\x18\x46\xce\x92S\xdfO\x89\xe9\xa2}\xe6" -"H\xaf`5C\x1a\x46\xa8TZ\x88\x33|\x89\x8d\xda\x8d*,\xbf\xd8\x32\x93\x7\x98\r\xe1\xa0" -"\x88\x35+\xe6\x18\x63\xce\xd7\xc5*\x9a/\xcc\xd5\xe7\xc4\xfd:?\xf8\x19\x1e\xbf\xdc" -"\xdd\x96g\xbc\x89s\xa0.\xf6\xcb\xe9x\xac\x9b\x1c\xd4\xcb\x94\xb2\x33\x36\x38\xe0" -"bY\xfd\xbfyQ\xe9\xed\xb9\x33\x0>PQ\xc9\xb2\x65\xa7\x9cx0\xb\xef\x42\xee\x42\xf3\xbe" -"_\xb4\xad\x88\xb3\xa2\xb6r\xfb+\xd3\xe1\xdf\xb8\xeb\xc7\x17\xe\x1a\xa3\xd2\xb4Y\xa3" -"\xbbT\xadLU\xb4\xa3\xc2\xfd\xb2\x98tc`\xeb~\x9d\xf2\xad\\\x99{y\x6\x14\xb8\x9b\x18" -"\xd9\x44\xa1\xe9\x10\xc9\x1\x43\xe7\x36_\x88wBM\xc0(\xdf\xa8\x91\x82\xf8\x9b/\x1e" -"\xe6:AX[\xe6\xe0\x99\x44\x88Q\x81\xb9\x1\xbdN\x3\x1cn%#\xe7$\xbb\x8Mp;\xc6\xcc\xdc" -"\x9\x43\xcf\xc9L\xb2\x11U\x81Sv\xa9Qd_\x8a\xd8\x16\x96-\x1eQZ\x8f\xcf\x9dg\xd0\x11" -"6\xcd\x85\xd4\xff*\xdd\x96\xbcR\xfcYJ\xabo[\x10\x32\x8c\x13\n\xe3\x61\x86\xadq\xa2" -"\r\xc2\x45`\xf6v\xa4\xd9W\x10\x17=\x88\x82\xbc\x10[\xc6\xcb\xf6\xda\x46\x87 \xb5" -"\x5)l/\xb9S)r\xd2\x92-\x1c\x96G\xce\xd4}\xa3#\x9\xc1\x15\x46\x1c\x18\xcfTL\xa4\x8a" -"9\"#\xf7_\xa9\xe\x90?\x85\xc6VcRw\xb8?\xfb\x30\xc4\x9c\x9\x8b\xf3\x64\xef\\t\xe7" -"\xed\xdc\x43\x9d\xe6\x85\xde\x9en\x96\xa7\xa7\x43\xe8\xa9" -"\x8f\x30_\x84u\x97\xa5\xb0\xc5\x43x\x95\xd9s\xa9\xc0\x8c+\xe7R\xbb\x11\r\x5'\xee" -"\x9e\x94^\xeb\x5\"\xae\x34\x44\xa6\xf0\x6\x30\xb4\xeaGdLSl\xa7\x66N\xbe\x3\xf0h\xe" -"\n\xa6\xf7\x8fw^s \x7\x17\xc0\x96\xda\xbb+\xd5\xbe\xca\x18\xa3]k\x80\xd5\xf2(\xed" -"\xac\x1e\xf1\x36\x17p\xc5\x44\xfa\x8aJ{\x83 !\x6\x9e\xd3\xe0\xa9\xee\xbe/\x0\xb2" -">\xb3\xbra\xfe\xej\x1a@-\x9f/\x7f\x1f\xb7\x1d\x9b\xed#\x3q\xef\x1f~/d\xf0Q4or\x86" -"\x5k\xc9\x8f\xc9\xe5\x7f\xcaP\x84\x9b\x41}b&\x82\xe\xaf\xf\xa9z\xc2\xe7\xb9N2\xf7" -"\xe5\x1\xfe\xe3S#\xef\xcd\x9d!\x3\r)\xfe\xf6\xfdj\xefSAe\xd3\xfb\xe6\x4\xab*\xdc" -"\x8d\x9b\x1f\x1fP\xad\x86\xfb\x80\xf\x9;\xc6\xd1\x32P\xa4\x65o\xbc\x8f|H\x81\x1c" -"\xf4R\xd9\x64\xf1\xd7nk \x90\x9'x\xd6\xdeV\xa8\xe3\x89\xef\xbb\x4\xc7\xab\x90\xa2" -"BZ\xce+n\xc0\x42\x15\xbf\xfeVY\xc8\x2Q\x8\x4\x1d\x6o\x9a\x30\xdc\xa5\xdf \xe5\xc5" -"\xc4\xe2\x31\xc1\xaa\x1a\xa1g\x96\xf4\x89\xba\xbd\x45\xb7\x88\xd3x0\x9b\x8e'\x87" -"\"\x15Z\xf3M(u\xd4\xe6\xe8>\xda~\xc4h\x85^\xaf\x1d\x63;\xac=\xcap\xe8kG\xe2&%\xfe" -"\xc8\xf3*;\xa5\xb9\xdc\xe3\xb9\x2\xe1%\xd4\x95\x66w\x93\x97Nh\xc7\x86\x887m\xf\x94R\x9aW92\xecshU\xc7x\xeb\xbev\xc5U\xed" -"{ \xdes\xe1\xd3\x7f\xd4\x1b\x61\xaf\x1b\x42\xdb\xb7!\xe4\xff)SO}&\xb8\xf1\x94\x34" -"\xcd\x99~\xcd\xbe\xe3Y\x4\x5\x4\x9c\x9\x84\xc\x91\xf1\x7f\xb7\xbe\xb2\xde\x1fX}e" -"L\x93\xb8\xb8S4\xb3z\x1b\xb6\x66\xf4\x46`n\xb2N8g/\x8d\xe1/\xa0\xd2\xe9\x38>\x2\xa3" -"\xde@\xf7^\xbb\x18Wl\xd8)\xdc\xfe\xc5\xbe\x1e\xb9\x36q\xd8\xee\x16i\n\xd4\x45#\xaa" -"M\x95\x10r\xe2\x83\x12\x7f\xf0u\xa1\x8fU\x95\xd5\xbc\x96!\xfa\x18K\x81\x8f&\x9fX" -",j\xe\xd0\x9d\x86\xf3\x87\x11\xc4S\xb9\x12=\xa0\xda\x11\x43\xca\x33\xaf\xc5\xbbU" -"\xe6G\xa6\x12~\x19\xcd\xb2\xf0O\xc9gF\xa3?\xc3R\xfb\xed\x41\xaf\xca\x8d \xae\xb4" -"\xe7\x1e\xcd\xed\xd7\x96%\x43\x3\xa2\x41\x9a\x37\xa4!\xb8\xc2\x8bl#ub\xb8ksZ\xa7" -"\xa2\xa8\xe1^\xb5\x80\xb8\xc8\x39Q\xb5P\xb4\x19O\x95!\xc5\x66\x1ew\xfdg[\x9b\xfc" -"P\x19\x16\x94\xdb\xea\x42\xcc\x38\xf7\x87=)\xcc\xdd\xe3\xfa}\xb7\x61~F\x97\xe4\xbc" -"6\xde\xaf\x7\xd7,\xec\x1c\x82\x64\x9c\xea\x10\x7O\xd2\xfd\xf3R\xb1\x15(,\xe3Z\xcf" -"\xc2J?\xe6\x13!\x86\xac\x82\xce\x8b\xfe\xab\x9bP`\x88\xdb\x9c\xd8\xd7(\xb8\xce*z" -")<\xb0\x19\x2,\x3\xc9\xe6\xa6k\xee\x1f\xeem\xe\x80\x64\xec`\x18\x45\x66\x39\xd4\x1d" -"\x9c[7eA\xed\xa7\x7\xac\xc9 ?y\x9f\x42\x12\x33\nS\x93H\xaf\xa4\xd6)~\x1\xdb\xb4\xe2" -"\x7f,\x84\x2\\\x1dg\x8b\xe&\x7\xa2\xa7\xda)\x9cY\xa0\x94\x9f\x38O$z+[\x19\xf2i\x16" -"\x88\xb7g\xc0\xc1\xff\x8e\x7\xe2/\x95\xaf\x66\xbb\x3\x37{\x9d\xdb\x30\xf9~kA\xbd" -"\xad\x8\x90\xe1z?\xday\x9f@\xf5\x41\x61\xf1\xb7G\xb9\x45\x1a\x80u%\xff^K\xdf\x1d" -"\xf9\xa3H|\xca:KQ\xb2\x85\xb4\xcf\x14\x7f\xdd\x88t}\xbcQ\xa1\xd4\x1b\xb7\xa4\xd9" -"\xf1v\x1\x81\xc1\x91\x46jd\r\xc7\nt\xbd\x33\xe9\x10\xb9&\xe4\xc8@\xbd\xfc\xcd\xb" -"\xb2\xab\x1\xd9\xa4\x8c\xf7\x85\xc1\xdb:\xfcIVZ\xad\x18\x91_\x9d\xac\"\x8b\x9bsV" -"(\xce\x61OP\"\xb7\xbc\x1d\x8e\x9b\x90\xfd\x7f\xf4\xa5Vg\x3\xda\x9e\x44\x6\x91\x9d" -"\xcb\xbe\x31{N1\x5\x2\xd0\xde[\xec\x87\x95p\xaa\xf5\x94!-\xd4\x9{\xeb\xc1\x95Yh," -"\xa7\xd5\xba\x66'yU\xaf=\xd2^X.#r\x98{m\xbf\xc9\x16\x8d\xf8j\x12\x35\x2\xa2\xff\xa7" -"\xa8\x8e\xe9\x87\xfbL]\xd1\xc0\xf2\xb5\xd3\xb7\x35|m\xe3\x1f\xbd\xf0\xa1\xb5\x9e" -"aMfL\x1a)\xdd\xb7\xcf\xc5\x90\x18\xd5\\\x36\x64o\xe2\x1b\xc0-\x8e\xd5\x33\xdc\xe" -"\x8d\x85\xf9\xda]%\xf3\x4\xba\x1f\xad\"t\x1\x1d\xc9qs\x96h\xd5\x9a\x16\x1eh\x80\xb2" -"\xc7Ww\xb1\xee\n\x86\x34u@\xa9s\xc4\xbd\xa4\x30jlth\xbe\x82\x41\x5\x1b\x80\xd5\x1d" -"8\xb6\x6s\x19\x0\xeb\xac\x8b@b\xc5o>wK\xec\xe6}\xdf\xad)~\xc3\x14\xfe\x5\xf\xaf\x8" -"\xe5\x80\xba\x1a)\xbf\xd4\x7\xb5\xc8\xed^};\x87!\xc4\xd3\x8e\x86\xb\x45W\x10\xe4" -"q\xe3\xcd\x82\xbf\xbb\xd1\x7\x90=\x92\x65\xd5\xfd\x1d\x45>\xd8\xf7]M\xe0\x43\x32" -"\x12oq\x9|\xf8T\xc2\xd6\xfesb\x7!`-\x84\x95|K\xd6\xbe\xee}\xdb\x6\x97T\x81\x85\x12" -"\xf7\xad\x93 \x97\xaf\x96;>\xc0%\x36qA\xb7@\x13\xd5\xee\x33\x63=|6\xa0\xaamrh7\xf4" -">\xac\x3g\x15\xec\x18\xfdo\xac\xae\x33\x61\xf5L\xd0\x37\xbf\x82\xff\x9\xd5\xf4\xe0" -"\x3\x92\xccL\xcb\x90pz`Pw\xcc(\xae\xa0\x62[4\xe8\xea]*\xc\x1e\xe0\xf1_\xa1q\xcc\xcd" -"\xea:T\x85\x87\xc2\xa9|;\xefz=\xf2\xef\x90<\xa4u\xbd\xc0\xc9\x44\xb8M\xba\xc6\x9a" -"`\x88\xc7\xd1\xda\xc5\xf1\xf7\x15N\xef\xf\x1f\x85/{\xa8\xadU\xb8h\xe0\x80G\xea=\xdd" -"\xa0\xd0\xb0\xec\xba\x7\x38\xf\x93.a\x1f\xc7\x36\xd8\xa7\x35\xd5\xc0\xf3\xa0\x64" -"\xc8r\xe\xfi\x8e\x1a\xe6\x8c\x7f\x3\x62\x44\x3\xbco\x84/\xfd\x94@\xa4\xa0`\x17\x81" -"ZL1\xc8\xa0\xa1u\xd0\xef[\xbf\xef#y\xf6I\xc9-\x9c\xaf\x94\xa3\xa7j\xdf\x80\x94\x63" -".\x1d\x81\xee\x63\x14\xc1\x90t\xb2\xfeU=\x83\xcb\"\xb1\xe8^\xc2\xf0\x94\xab\x6\xd4" -"\x88\xc2{\x90'\xc8\xe7\xb4\x8\x63\xe3\xce\x9f\x66\x8a\xd3~\x8c\xa2\x4\x15}\x9c\xe6" -"\xf2\x92\x9\x0\x89\xee\xc1\xb6\x31tb[\xaa\xd7\xdas\xec\xebn\x80}be{\xb3t\xed\xc2" -"\xfe\x15Tl7\xfd\x35\x9bh\xde\x46%\xa9j\xc2\xb7\xb\x94:B\xa1\x9f\xba\xdd\xa9j \x82" -"\x9e\x80\xc3\xfd\x7s\xb0\xf5!?K\xf\xc1\xfdN\xa1\xd3\xa6#cC\xbay\x18\xe5\xd8\xf3\x15" -"\x8\x15\xe9\x9fr\x9f\xe0\xdd\x96\xbd\x10\xd2\xa1\xa0\xd7(\xd1QO!\x8apGT\x1fp\x90" -"y+\xde\xf3\xfd\x46\xf7\x39\xa7hv\x86\x1f\n\x99\xdd\xe9\x33w\xf9\x85+C\xc8\xafGDG" -"E\x92q\xec\xa4*\x12\xa3r\xe2\xc9)Kt\xb8\xa8\xb0Q\xe2\x83\xb?\x1\x9f\x9b\xf0\xe9\xb3" -"\x10\x93`MA\x1d\x91\xda\r\x9e\xf2\xa7\x86\xd3\x66\x64\x97\x9b{\x90\x83\x89\x9c\x8" -"\x1a\x33\x8d[\xff\x3\x61g\xa5L0\xc3\xb1\"K%o\xdciK-\xd9\x9f\x14t\x99`\xf0V\xff)D" -"\x2\x38m\x98\x16\xa7\x8c\xec\xe1\xf7(pO\xf5\xd2\x8g\xd4\xc6\x13\xddh\xeeW\xf2\xc9" -"\xe3\xdb\x81\x1e\xce\xef\x95\x8e\x6;jx\xa5v\x1e\xec\x62tf\xa4\xa5<\xect\xe9\rK\xe6" -"\x89\x9c\x61\x1a\x8a;\xbao\xcb\x3\x9d\x10\xca\xe4\x89\x8b\x93:\xa4\xc1\x41\n\xfe" -"M\xbe~D\xd5\n\xc\x84\x8d\x33v\xce!$\xaaH\x13J\xe6\xd2\xe5\x46\x8c\x31H\xcdZ\x9a\xeb" -"\xa7\x88Z\xaf\x32\xe6\\\xa7\xc1\x62\xc2[\xb8\xe6\xc3\x81\xa3\x97\x0,\x1e\x14m\xb4" -"\x18\xba\x3\xa8\x8d'VP\x1e\xfe(M\xf3\xeb\x31\xbc\xf8O\xccGG\xa8Gm\xe7\xb0\xa0\"\xc" -"\xc6>\x8e\xb\x93\x19\xa6\xb1\x8f\x87\x0\x37\xdc\x17\x45\xb0\xfb\x34G\x8c@x\xfd\xe5" -"@\xba\xa6r\xc4\x87\x33p\x5\xc3\xc\xb6\xcb\xa1\x13\xfa\x94\x9f!.q\xec\xc3\x9eqy\x8" -"\x1f\x64\n\x18\xf0\xd8\xd4\xbbt\x91\x90\x2S\xbb\x13X\xc\xad\xa0\xa6\x37\x95\xc4\xc6" -"\xae\x17\x1d\x80\xbe\x8\xef\x0Pv\xd9\xb1-\xed\xee\x18S$ry\x11\xeamu[\x1\x14\xb6G" -"\x4j+\x0m{\xce\xd2\xb1$0K\xec\x42\xcdoba\xe8\x5\x98\x8f\x19\xfb\xe1\xe8\xaa\xe1\x7f" -"\xc8\xfc\xcb\x64\xfc\xc7\xf5|\xe0\"\xcb\xdc\xe6\x8e'\x18?|\xae\x61\x61\xa5\x11\x1f" -"@[S\xb2\xad\x82\x37!\xed\xd0\xba\x94\xb5\xd3\x0)\xd5K\x8f\xc7\xb0\\\xf7\xfb\xefh" -"\xa5X\xa0!vAU\xbcN\xed\x3\xf1\x80\x9d\x9x\xeb\xd5\x8b\x7\x38\x1e\x95\xe9]\xe\x66" -"\xf1\x87\x3]C\xfcH\x1dG\xfe\x86\xd6\x85\xbf\x92\xa0k1\xdbn\xb8\xc0\x93\xdfx\x88@" -"\x17\xa0\xe3\xa6\xcbm\xde\xa0Q\xdeW\x8l^X{\xb2'7\xf3\r\xb3\xa6\x15\xb0\xa2i!\xa4" -"\x9er\xc3\xfb\x80q:\x2\x9e\x96n<\xa9\x31`\x93\x64\xb4\x91\xf0\xc2\xfa\xd5\xd6\xd3" -"\xd6\x93\xc\xednb\xdd\x11\xb7I\x89\x16%\r\xa9\x39\x46\xcf\xa8Y\x85\x8cp(\xc1\xd2" -"\xb5\xe9Z\xc9\x12\xee\xe3\x16Q%\xea\x3\x34\x42j\x8\xbe\xa0\xff\xdc\xf8\xa9\xa1\x89" -"\x84\xa8Y\xf0S\xe3|NO\n/\xc2\x39\x31\xd8\xad\xa6\xda\xc6\x4n\xe2\x98)\x8a\x0 \x88" -"\x17\\\x13\xb8\xc0{\xa1<\xe4gr\xeeJ\xb4\x89\x98\xb4\x37\x34`\xc2\xb6:\x8c!\x90?\x1" -"6\xe5\xb3=\xdb\x8d'uf\x97\x88\x14\xc1k\xbf>\x8exJ'1\xe0\xfc\x0i[\x98\xa8\x30\xd6" -"1\xe9\xa8\xd3z\xad\x38Z'B;q\x12\x7\xcaIp\x4 \\D\xda\xcf\n\x8tM\xbd\xcf<\xd6\x14\n" -"\"\xbd\xfe\xcf\x19\x8a\xa5\xc2\x8d\x9\xff\xec\xa4\x1e\x8e#\x15x\x9c\r\xe0\xfe\xe9" -"\xddS>\xa6\xb7\x2{\xe6\x11\x30\xa7\xf0\x94`\x94\xedq\xbb\xabz\xfa\xae|\xa2\xc6\xca" -"\xdfiX4\xd4\x9d\xcc\xd3\xafu\x1c\x94\xd8O\x1\xdfuN\xd5\x8\xbe[\xf7\xd2\x90\xe0\x41" -"\xf9\xc7z\x94X\x9c\x93\xc5\xc4w\xab\xa0m\x89\x98\xb6/`\x92\x8b\xbaUw\x91\xb1\xef" -"\xb\xcX\xb0\x8f\x65\xf9\xda&~\x83\x44G\xa7\xce\x45\xaf\xc9[\xc6\xbc\xe2N.\xa2Py\xde" -"\xf5\xcc\xf1\xc0\xf1\xce\x36,\xc9\xa7\x1\xf5\x88\\P!<\xdf\xf\xa6\xdf\xce\x80\xbd" -"^\x12[]\xa8\xeb\x8c\xfd\xd9\x1b\x15\x8eZ\x8a\x1e\xf0\x32\x8d\xb4,N\x19\xf7\xb4\x84" -"\x10\xe1\xbe\xd5\x92T\x9d\x99\x1f\xf\xa2\x7fS2qu\xed\x8e\x1,\x13\xd6\xd0\xd9\x8a" -"\xbf\x81\xa8\xc0\xcc\xa8\x84\xdc\x12\x63\xecwo\x15\x9a\x63\x43\x61\x9a\xfa}\x12;" -"P\xeP\xb1\x16g\xba\xcf^\x7\xd3q\x90M\xbc@I2\xdf~5]\x1az\xc2>#zj\x85\xcd\xfz`\x15" -"\xc8\xe3\xb3\xb5\x62\x7\x31\xe3l@uJ\x93\x9c\xa9\x12*\xfc\xc6\xf2\x16\xc9\x97/N\xe6" -"1{\xa9h\xcf\x1f%\x12\xa9 \xf5\x93\x1e<\xdb`\xd0\\\xc2u\x2>\"\xc3\x31/F\xa9\x62\xcc" -"\x6\xbb\xaf\x6\x85\xfeQ9\xff\x8d\x9b\x9\xf1\x89\xad\x19\xc0'\xba\x61\x63)\x0)\xe5" -"M\xb0\xb1\x32\xaf\x3$\xcd\xd4k>\xf4K,\xe9\x16\x91_d\xad\x96=\x1\xebI\xa9`\xbf\x65" -"\xf9,T\xcc.\x86\xbd\x13\x99\x8cgoV3\xd4\xe7\x94\x64\xfb\xcc\x89\x95\xe1N\xecmZ\x16" -"\x80\x92\xe2\x2\x13\x33\xdb\x8ey\x8a\x7\x42\x44\x61\xab\xad\xa6\xf5\xc8O2'\x95\x12\x9er7J\x9c\x9f\x9a\x97\xf9\x91" -"\n\x1f\xc5\xec\x6\xc\x88\x32\x92\x9c\xb8\x61\xa9mx\xb6TA~\xdcV\xd9\xb2\x88\xe\xa4" -"?z\x13\x9\x97\x81\x15\xd0\x83\xd3[\xc6Y\xb1\xb0\xd4\xae\x5\x19\x1d\xc1\xa3\xb3\xef" -"\x1e\xb3p\x9e\xd6\x46ql\x17\xf2\xf6X\xedJ\x14;\xc2\x38M\xbe\xf8J\x8f\xfc\xe1\xd3" -"-Zqy\xd0%\x98\x1d\x7f\x9f\x88WT\xb2\xc5s\x80\\\x62\x14\xfO,P[\xb0}\xe9\x80R\xb\x92" -"mnB\x7\x30\x3\x63+\xfb\x11\x16\x97/V\x1_y\x7f\x89pf\x95t;\x91\xf8\x33j\x85[\xd2\xf0" -"\xa2\xf8\x4\x15\x46-\r\x12\xe4\xc5\x7\x83$\xfeY\xd9W=\xd1\xa1\xf9\xb2\x46\xa5\x7" -"}\xf0\xc5\x2\x8fM\xaa '\xb5;i\xba[\xc8\x89[\xab\xa7\x19_.cD\xf6\x18\x1c\\S^\xc9\x9" -"\xf2\x19\xaaoq\x83IX\xb9\xfb\xe0\xccr\xb9\xaa\xbf>\xc7 \x1b\xdf\xben\x13\xe9\xaf" -"1O\x9f\x36\xfa.5\xd7>\xeb\xfc\x30tO\x10\xa4]HT\x90|c\x15\x61\x34\xaaI\xa5\xce\xa9" -"\xe4\x30\xea\xad\x63\x38\xec\xcc,\xd7\x86S.\x86qz\xa0\xb4\xb3\xaf\xad\x46jC\x12\xc6" -"<\xe6)`5\xef\x85\xcd\x9c\x3LBgXVp,\x9e\xae\xd6\xce\xe2M\xf\xc3z\xf3\x46ne\xf8\xb4" -"\xff\x37<\xb8\x9b\x45%\xcbMRE\x1e#\x17\xa0\x8f\x96q4\xfb\x66\xef\x81\xe8\xe8JD\x98" -"}.\xeai&W6\x8fH\x8d\"%\x7\x87@\xec\xd8\xb1\xb\x99\x7\xc4\xc8\xef\xedk\x9c\x10\x8f" -"\xc3Lv\xe1\xc0\xd2\xe0\xf1\x82z\xd6\x8d\x65\xe4\xc6l\xce\xc9\xb3\x1dHF\xbf\x37\xa4" -"\x9fy\xc3\xa8Q\xe3\xcc'\xb4\rg\x93`\xb5\x33Yt\xd3\x84\xcc\x98o\xcd\x62US\xae\xdb" -"\xbe\\\x13\xa3\xdd\xe7\xefUSl\x81\x46\xad \x90Kk\xb1\xc1`\x9\nU\x12?\x9b\xfd\xa5" -"\x9d\x92rw\x5\xceU\xc0m\xe3\x30\xa6\xf1y\x9e\xa2\xa4G(\xf9\xbe*o\xf7\x33\x45\x1c" -"0\x97qE\xcfZ5\xeb\x88\\\xe0~\xb1\x17@\x5\xed\x46}\x8f\x96Q.\x84\x36\xed\x9f\xb2V" -"\xd9\xb4\xbb\xdc\x62;\xdd\xa6\x34\x1c\x37\x41!C\xed\xe7$\xfbj\x1\xe1H\x8d\xbe\xe9" -"^\xf5$YM*\xc8\xc4\x9e\x1a\xa3\xc5\x82\x82[\xbe\xda\x65*[b\xeaz\xda?\x3/\x83\x46&" -".\x9a\xcd\x8c\xda~\x9e\xd4Qy\x5\xddN\x7fZ\x0\xa1\x42M\xc8;\xa1\xd8\xcb\xc4\x11h\x9b" -"\xb8$}\xd9\x33\x65\xcaM\xde\xf0>\xe5\xf1iZ\xf.cb\x89T\xbfvW\xf8\xcai\xf9X\x84\xaf" -"\xcc\xc0\xe3\x46\x91{@\xe5\x14\xa2\xe9\x32\xbd\x2\xd9\x66\xcd\x12\xde\x85}\xe9=U" -"\xc7\xe9\xa7\xc0:r^\xf0\x16\x87\xa1\xed\xb4\x6x\x5\x45\xc\xfbu*\xc4h\xf1\x38\xc1" -"5#\x8;\x9cZ\x3\xea\x90oj\xc4\x2S\x18\xb8\xb1\xd2\xcd\x33\x9b#\xcc\x41-\xf`\xa7\xfb" -"\xde\x8\xe\x66/MC\xa5\xfd-\xee\xf9&\xe7\x86\x9ax\xbc\x61\x32\x2\xdf\xb4\xbP<\xf0" -"\x85\xf9\xae\x85p\xc[\xcf\xea\xa1J\xb8\xa0\xd0\xbe\xb4(\xa8\x9d\x0\xc1\n]F\x93\xb5" -".P\xbeT\xfe\xcdG\x93[1y\xbc\x2\xf8\x35HmXb\x1d\xd9\x86jICD~\x1cq\xdd\xc4\x33\x46" -"\xb7\x45\xf8h\xde\xdaz\x86\xe5\xf5\x46]\x83\xeb\xd1\x65\x82W|.\xb0\xbe\x1a\x62 l" -")\xc8\x94@\n\xffU6\xd8\xbd\x2s\x80\x64\x1f\xd5$- \xd3\xbb/Y\xc9\xca,\xf2+\xb0h\x81" -"\xd7\xa2W\xb2\x1L\x12\xf5\x88?\xa3}ijX\xc3\xda\x34\xf1\xb2\x5\x96\x0\xc9\\,\x9f\x98" -"\x80\xb8\x6\x9e+\xe\x88\xf4s\x1b\xe4\x95\xb3\xa0\x86\x46\xfd>:m\xbf\xb4\xfdW\x9a" -"o\x93H\x8b\xac\x8blo\x7\\z\x0\xfb\x81\xe4\x30-\xb3\xed\xe6\xa9\x64\x30\xe0X6\xa6" -"\xd1\x9e\xec/(J\x95\x80\xc\xb1\xaf\xf0\xaevv\xf7\xacwT\xd8\xe4G\xb4\x1d\xe6j\x1a" -"\xfd{\x18\x8f@\xbuB\xdcM\xf8\x90\x93\x90\x14\x16\x16~\xa1\x35\xe9\x86\x82J{\xa6\xf8" -"\xf7w\xb3\x81u\xb0\x13\xe7\x82\xf7\xa4G\xba\xaf\xfr \x81\xb6\xfe\xe\xe9\xcc\xb6\xe0" -"\x4\x19\xc8\xc6\x31\xeb\x61\xae\xe5PHz\xe1Qv\x1e\x7yu\xa3\x18\x15'\x92%\xd5\\\xa4" -"\x1\xd7\xb8\x93\x12" -"\x3\x39\x6\x39/\r\xc\xd8\xe8s\xe3\xf3\x92\xf7UP\x12\x84^H\x3\x91#\xc0o\x1f\xea\x9b" -"\xb0\x32;`\x88+\r\xf4=7\xa3$\xe3\xc6t\xb7\xe4M:\xb1\xf6\xdd\x32\xcf\x9e\x8fqWf\xb6" -"\nHZ\x9c\x65\xa9\xc9\x9f\xddZ.\xb3l\x80]\xd5\xb6\xceH\xbc\x0w\x8a\xbe\xb\x46\x8f" -"q\x8d\xf9\xbb\xa2\xfc\xce\xa3\x13\xcf\xfcw>5(\x88\x1f\x34\x85?\x82x\xfeu=0\x8/\xfc" -"\xc0\xb9\xad\xf7\xb0\x63\xa8p`\xa5\xf8\x9b\xfb\x88|\xeb\xcf\x85\x83\xe7\xa2Pd\x18" -"\xcb\xd1\xdf\xd0\x83s\x9dL\xaa\xc0\xf1|A\xae\xa7\xa7/\x8e\x8\n&p\xc7\xe3\x1a\xe8" -"H\xcc\xd1\xa5+QE\x14\xdb\x81\xa5\x9d\xc6t\x1aHw\xf4\x95ujD\xb\x81t\x16>p7\xcdP@0" -"p=\xe5\x7\x34\x31's\xdd\xc4\x6u\x97\x15\x4N\xcc\xf6Gh\x9cj\xfa\x45\x45\xdc\x62:\xda" -"\xba\\\xf8U\x1dt\xb0\x1c\x61\x1e\x8c\x16m\xa2\x46Ns\xa4\xa5\x7]/\x8c\xd7\xfa\xb0" -"\x4\x41\xe5-<\xe3\x97`\x12Q\x89|C0\x7f(4\xb9qK\xb6V4\xcf\xa0\xeb\x36'B=\xfd\xf\x82" -"N\x89\xeb\xb9\x8fm\xd3\xbd\xafqq\xa4\xd5\xcf\xaa\xbf\xbe^\x8fY\xa2\x33\xd7\xee\x41" -"\x9e\xfc\xc5!\xac\x64\xd0}66H\xa3^P\xd8'\x19\xcc=\xb1\\\"\x35^N\xfd\xde\xf{\xbb?" -"\xae\x36\x83\x8HjZ=\xa6\x38\x11~\xb5X\xe3\xba\x17HaJ\xd4\x1c\x33\x93\xce\x89\xd5" -"\xf8/\r\x80\xaf\x4\xc7\xf9\x13W\x8f\xa4j\xcb\xd5>&\xc4\xf0\xf\xf6\x1c\xa2G\xe5\xef" -"\xd4ZU\xa2\xe2\x11\xdd\x10\x8c\xa4\x1c\xc8\x9a\x11\x8a\xd9~c\xca\xbf\xa1\x85\xd2" -"\xe5\x33w\xa8\xee\xd6\xf3\xb6\xf9\xd4.M=J\xa4m\xc7_\x8a\x30\x1b\xc7\x35\x9e\xee\xa1" -"wB\xce]\x3]\xbd\x46k\x9d\x1q\xdc?\x3w\x2'\xbb=F&>\x96\x88\xe3\xf9\xc5\xfe\x18-\x1c" -"\xc0*jj\xb4\x36\xc4\x37_\xfc\xda(\xea<\x9d\x93\xb8\x1c\x3\xc2\\ic\xce'\xa3|\xa2\x81" -"\xcaIj(\xa7\xd7(\xda\xa7h\xdf>\xc6\xb2\xe3\x8b\xf6\x11\xc1Q\xbaLVPx<]\xa9)\x12\xd2" -"!\x7\x18\xd5p\xbd\xcem6Pb\x97\x89\xc7\x83\xd8\xfa\xc3\x6\x9a\xb6\xaf\xf1J\xc7\x34" -"\x4q6S\x1e\x8b\xb2\xcf\x62\x30\x2\xa4]\x2\x9f\x1c~*F\xc2\xa1\x10\x17\x35\xf9?\x8" -"\x95\xe0\x7\x8e\x1e\xe3\xc4\xc1m\x91\xc3\xd7\xb0\x89\x41\rX\x4\xcb\x13\xd7\xf4L=" -"\xfd\xfSb\xeeXL\xf1\xfa\xcf\xft(G\x15\xfe\x1\x65\xe0\xcf\xfd\x94\xa2\xe1G\x86\xfe" -"\xd7\x34O\xce\xad\xac\x96'\xe\"\x92{\x86\xe9o\xe4\xe6\x93y.G\xb7\xcb\xc9\xa0\x9b" -"u\xb7\xd6w\x91\xaa\x12\xf0\x33\xa1\xd5\xd2\xe\xbf\x85\xac\x33\x66\x30\xc2\x91\x12" -"\x83v\xa1\x87\xccR\xe1\x86\xe9n\x0\x86\x1e/\x17 9Zqur\xe8\xf8\xfe\x93\x9b\x99o\xbd" -"~\x3\xb8\xfa\xc7\xfa\xf3\xa9P\xa5)\x99\xa5\xdd\x1e\x7f=\x7\xd8Z\x19\x8cW\xa2\x94" -"\xd6\x34\xa5\x8dN_#eY\xc7\x12]\n\xea\xbb\x91\xb0\r\x89\xa9\xc4tc\x92\xe8\x62\xe8" -"#\xc1\x7\xfey6\x4\xfe\xd7\xfd\xe\x44$\xd2W\x81=\xdb\x31\x66\xe7\xf7MCot\xe5\xac\x96" -"\x14\n\xa7\xd7`\xd5\xff\x43\x98\xf7\xca\x9\x12kw\x97\x99o\n\r4&\x7f\x8dLY\x93>\\" -"\xeb\xddSe\x87&G%\x18\x9b\"\xa8\xc8\xacu\x3O\xe3\xf5\x81\x9\x46\x65\x66=\xe8Im\xa0" -"\x9bXV\xb7S\x90\x8a\xab\x1a\x32\xa1q&\xfat\x15\x3\x37\xc6R|\xe8\x83\xaf\xe0\x9ai" -"\x9eK)\xfc\xd4\xfb\xb3\xc9?J\x8/\xf2\xd0\x19\x61\xa9\x1e\x64\xb6<\xbf\x15\x9a\x16" -"\xb9}\x9bs\xb7;\xb9Y!\xc2\xb7\xa5\x18\xe5\xfa\xeb\xca\xee/\xa2\x86<\\q\xa1\xd7\x14" -"\xdc\xc1\x30\xc\xa0\xa8\xd8\x17\xd4\x2\x46\xd6$L\x81\x85\xe9\x8e\x95w\xde\x92(\xef\x7Y\xd2" -"D\xa4\xf7\xcd\x17\x15\x16\x64\x37\x3\x8dx\x93\xfI-v\xbl\x14;\xa0\x33\xc\xffK8hzR" -":\xd0'U\x11i\xe7\xad\x97\xf6\x91\xafX\xf2\x9d\x9\x87\x88h\x1c\xc2\x82\xa7\xa7\xcf" -"\xf8\xc9\x1\x9f\x1\\\xa8\xac\x2\xc4\xcb\x87\xf2\xfa\xf0n?)\x9e\xbd\xff\xc1\x9f\xbd" -"/I\xa3\x80\x9c\xcf\x63<\x82\x1f\xdf\x0\x9d\x39\x84v\xc8\x97*\xff\xff\x14\x1b@\xc9" -":\x2\xb9\x8a\x88\xa9lJ4\xfa\x32\x44\x86\x43M\xd4R\xaa\xb4:\xc5\xbd\xb\x11\xce\\#" -"\x96\xebg q\xeb\x5\x88{\x9e\xb2\x95\x7m'P\x89\xb4\xdf\x99\xe0\xf8\x37P\xb3\x19\xfa" -"\xefV\xe5\xe4\xe4#\xe4\xdf\xd8\xf6p\xe6;\x82\xaam\xc4\x87\x7f\x95\xa5\x7\xb0\xe9" -"\xed\xa9S\xb6.}\xf7\x8f\xbcZ\x98@Z>\x8d\x1\x1e\xa3\xc5\x4\xb1\xf7W\x92n\x12\x1b\xef" -"W\xeb\xa5\xa9\xbcw\xabNM\x83\xf2@\xba\x1c\x12\xb5\xe0\x95=\xe9\xe0~ \xfa\xc7\x17" -"`\x8dG\xc4\xcf!\xd5\xa9\"=Vt?#7b\xacQ\xbd\x8v?8\r\xb3%W\x8c\xbe\x14\xfaY\xe2\xf\xce" -"\xe5\xd7P\xect\xa0\xe0{\xb3\r\xa4\x83\xb3\xb\xb9\xd9\xc8?\xfcV\xc8\x46\xe3\xd6\x88" -"\xf7\x65\x15K\"M\xfd\x99\x12r\x14\xdc\x32WG\x6\xd6K\xfe!h(\xdd\xb7\xcb\x8c\x5\xc5" -"\x1G\x94\x1c\xc9\x0_0?oM\x84\xe7W\xd2 \xf1\xfd\x1e\xa3\xb3\xc2\xce\x8f\x9fo\xbb," -"\xe1\x18\x9e\x1e\xd9v\xdc\xab\xeb\xc9y\x1a\xdd.\xb7\x66\x1f$8\x97\xd1@6V\xe8\xd0" -"\xc8T\xbf$\xc!\xc3W\xa9\xdf\xd3t\x9f?&\x1a\xaa\xe8}\x97\xb8\x92\xd8:\xcf\x9e\x8c" -"x\xe2\x9a\xb2\x3\x36WF\xec\xd2sv\x94]fYN\xc1\xc8\x43\xef\x86~\xec\xef\xd1^\xd6\xb8" -"\xcf\xe0;\r\xdc\xdc\x88\x62\xc9\xfa\x4\x87\"\x8fr>K=\x87\x81\xb3\xdf\xb2zd\xec\xc7" -"\xc0\x87pH\x85V.\xd0\x41\xcf\xc7\xd2{\x9d\x16j\x8\x8c\xae\xf9\xbbv\xe\xf0\xad\x83" -"\xa4iP\xca\x34\xb5\x64%\xc0\x11\x81\x41\x38\xf8\xd8QC\xf2Q\x16]\xec\x6\xdf\x98\x35" -"\x9e\xeb\xc8\x90\n\x30\xc2\xa5\x8\x13\x14s\x90\x85\x36^#\xdf\xc8\xab\x95\xc6\xc5" -"\x1cr\xd2lo\x83_\xcf\xb1\xfeq\xc6\x14\x31\n\xfb\xad\xd5\xc8\x8d\x17\x8f\x64*\x89" -"\x8d\x99\xfd\xd8z[=\xba\x7\xccj5\xee\xa7\x62\x11\x8a\x8e~\x3\xbd\x38\x16\xd7\x34" -"\xf3\x66\xaa\x98\x16\x8b\x15s%9\xa3\x8c\x63H\x9b\xb5\xfd%\x12\xa9*\x1\x9a\xabX\xfb" -"x\xa9\x1f\x9\xe7\xec\xc7\xff[\x92\x45\xdb,\x12\xb8\xbc%\xb4\x1f]n\xd3\xb7\xd6\xa8" -"\x87\x8\xbe<\x8b\xc6\xc0>mJx1[W\xd4\xd2|\x91\xc2\xb7\xad\x8H\xbd-&\xbd_x\xa2\xf1" -":3\xd6\xbz%\xb3^\xc5`.\x81\x14\xd7\xb6V\x9d{D\x15L\xe2\x99\xc\xe9\x9b\x99\xdf\x14" -"\x8eJ\n\xfd\x46\xba:g\xcf\x31I\xb0$\xd7W\xeb\xe4i^\xe5g*!Q\xbf&\x1e\xef\xf9\x16Q*\xb5/e`\x1dXr&" -"7\xd4\xffg\xa0\x42w\xee~\xf2\xd0\xc9\x9e\xce\xa4\x1e\x63Ui\x95\xa7\xb4\x90\x90\xac" -"$4\x8\x5w\xf3\xec\x42Uli\xcd]\xf5M^\x7fJ\xfd\xc3\x92\xc2\xb1\x13\xe5\xf0|\x8b\xb" -"!\x8c\x39*\xf8S\xfe\xb3\x96K\xb9\x8e\xa5\xf\x7\x33\xab\x32\x64\xb5\xa2{]\x3\xdf\xf7" -"|)&\x99\xa7\x17S\x8dgo\xb9/\xdc\xae\xe1\x66O\xcc\x37\x16\x7f$\xe1\x16i\xb0\xb4?\x4" -"\xee\x8f\x8f\x89:\xa7;^\xf8\x45\x9c\x8c\xdb\xff\xcd\xb5\xc7\xd5\x88OGr\xd8\xa4\xb4" -"k\x85\x32\x62\xfd\r<\xcb\xb3\xe4\xda@\xd0\x1d\x2\x8f\xcan;\x19\xda\\\x1e\x91\x8c" -"\x5\x38\x97\xab\xa5\xbby\xac\xa1\xc6\xf5g\xe8\x99]Fk\xf2\x1d\x61\x61\x81\xdb\xfa" -"\xfb\xfe\xb\x97\xa7\xc2\xb3\x66\xcaQC\x8b\xf0\xffw\xa5\xbc\x31(\x14=\xdf\xe7\xd2" -"\xecJ<\x1f\xb0\xdfOO[\xf1\xc8'D\xd3u\x84\xb\xc8*\x6\x64\xbe\x0\x80}\xf6[\xe5\x97" -"\x8e'\xe9!\x8f\xe4\xcaV\x9c\x13\xd8I0Rv\xcd\x9a\x1\xe9\x12\xf5K\x9\xddJ\xd5\xed\xb0" -"\xff\x9f\x84\xe4\xbd\x7f*\x85\xec\x8\x86\x9Qt\xbb\x12S\x9c\x35l\xea\xb0\xfe\xff}" -"\xc9\x63\xf4K\xcc\xe\x16\x12\xf7\xde\x9b\xd8\xc0\x97|\xb3]\x87\xb9\xa7_3\xfa\xf6" -"\xe\xf8*t\x93\xc0\x92GP\xef\x9a[k\x98\xf9\xbd\xce\x8c@\xd0\xe5\xa6\x10\x62\x9c\x39" -"7\xad\x0{\xb3\xb2v\x14K\xb3\xe7~d\x84SQ\x14q12\xc5V}\xd6.\xdc$\x10.Q\xe9\xa0&E\x83" -"l_\x94\xb0\xff\x9d\xd9\x66\xa3h\x19\x13\xa8\x12\x9fk\x15\x16HSK\xf5\x36\xee)\x93" -"]i\xf2\x8e\r-\xff\x17(b\xbb\x88\x89\xe2\x46p{#]>w\xa3\x8\xfc\x31\xa1_\x84\x9f\xc4" -"\xb0\x14V\xa8\xeb&a*\x99tO\x82\xc1\x44\x86$o\x8f\xe4\xe2\x10\xec\xbd\xc1.$\xc8U&" -"\xfc=!\xa3\xf3\x5^7\xc0\x97\x86Zt\xc7\x35\xe2\xef\xb2_,\x88\xe6Ti\xbf\x66\xa8L\x80" -"\x3\\\n\xcc?\x81\xd2\xcc}\xe1\x85\xe5T\x88\xc0\x14N\xd6\x8d\xf3\xee\xfa\x17\x1a\x34" -"\x81\x7f\xf8r\x93\xca-\xe4\xf8>\\\x80\x1a\xfb\xdc\x43\x9a\xce\x43\xc4`\xe9\xa0vj" -"\xc6_p\xbe\xf\x19(v\xd7\x88tU\x86\x35\xe1H$\xbc\xeb\x45=.\x87\x39\xd9\xbdW\xa4\xd6" -"\x85\rm\xd5\xcf\x38\xde\xce\xc1\x9\x81\x39\x82\xa1+\xe3\"\x7\xfe\x1\xb4&\x8b\x80" -"\xc5\xc4t\xb6\x4\xc0\x12\x1ep\xc6\x34\x43\xb5Q<\xe1\xa1\x1c\xd0\xcf\x9\x37I\xcd\xca" -"\x15\xfx\xcf\x1a\x85\xf7\x5\xd8\xe8\r\xaf=\xfa\xb\xc3*\xc3\x89\xd5\xf5\xc7\xd6:\xac" -"\x7\xc1$\x8\xc7\x9b=j\x5\x8\xf7\xc9\x36\x12\xb7\x99\xa4\xc7\x97\x9\x81_\xe9\xc1\x7" -"\xa4\xdbm\x8c\xd9\x11\xcbvt\xf3Nv\xc\n\x89\x17\x1\x19I\xaa\xf0\xc7@\xf1\x39)\xce" -"\x1b-6C\x83w{\xe3\xb7\xb8\x34}\xd9\x37\x45V\x82\x1b\x92\x37\x8=`t\x10P+\x1f\x12\x8d" -"\x87L\x1d\xfbo\xc1\xcf\xa6\xd5\xbc\x1\xccv~4\x11\xe1\xa8}\xa4\xe9!\xe0\x64\xeaX\xfc" -"\xad\x3^Tp\xf3\x92\xc3\xb6\xc7\xb7\x6\xf7ZW&\xe5\x16\xe2\xbc\x7k\xcf\xb3\x6w\x85" -"6\xe2|\x93\xa9\xdc\xd0o\xde\x1f\x88\x3\xc5\xf\xf7\xcft\xee\x89\xe9\xd3\x4\xe6\x9c" -"r\xc3\xe3\r\xdeq\x4\xb2#\xd8\x12\x4\xf3\xf6\xaf\x64\x66\xbd=\xec\xfb\x7\xfc\xa0\x65" -"\x6\xc9\xd1\xc8!\xc0\xd1\xb6\xba\x8e\x35\x0\x1a\x38:\x90\xeb\x46\xa5\xc3\x8e\x81" -"\xf3\xc5@1\xdeo\x5\x30O\xb5\xd1\x36\xb9\xf8\x64\xd9,\x14\x46#\xea\xc6\x7\x30\x14" -"\xd8\x6\xe1\xee\xb5H0\xa5\xe0\xce\xe3\xd3\x1c\xcd\xa9\x33\xe9\xb8\xa3t\x1a\x80<7" -"\xe\xf9\xe1\x38\x16<\x8a\x8e\xedX\x15\x97\x86\xe5\x1d\n\x9f^\xb2_U\xdcJA\xf3X\x18" -"\x9dR[/0L\x12\xe2\xb9\xa6U\x89\xa7\x9Jf\xf9\x62^#\x8p\xce\x65[K\xf5?c\xa4\x8c\x95" -"$a\x1\xf\x94\xe3\xe6\x96\x1\x83\x14\x98\x64\x15\x3\xa8\xbf'\x8a\xf\xa5\xec\x9\xba\x9dg\xfb\x63 \x8d\xae)\xbe\r\x3\\o+\x82\xd0go\x11\xd1" -"\xfc\x1bZ1\xf6\xe3\xbd<\xc3\xf4\xe0+|\xfb\x32\xafg21\x16*LU\xc7\xef~\x6\xb3\x80\x91" -"d3\xb\xc4\xa2\xba\xaa\xb3\xec\x8\x45\xe5O\xd9=\xc6\x0\xae\xae\xe5\x8f\xf3\xe\xbf" -"\xa0o\xf0\nz\xbbU\x94\x63\x91\xd3\xf4\x7\x96!\xe0\x14\xb6\xb\xe6\x9d;d\x12\xdc\x8b" -"\x8c\"\xd3\x64\x35\x33\x63ve\xf1\x17\x37\x81\x95k\x15k\xb6\xbc\x1e\x7[\xbf\x5g\x1f\xfd\xbe\xeb\x2\x0\xa3\x8b\xd2G`\xcf\x83q\x80" -"\xa8X\xe9-\xb8\xb5\x1f,\x84vRu\xb1`\x18\x8b\xf3\xdc\xb5\xe3\x84\xdf\x82\x8c\xcd\x9a" -"V\x1\xda\xec\xc6j\xc1\xb2\x92\x38\x15\x7f\xf0\xf3K\xed\xd7\x18\xec\x8a,%\xb6/B\xef" -"\x7f\x44\x44\xccv\x8d#\xb4\x10\x87\xc9\xc9\x1bYC%0\x1\x42&K\xd5\xc4\x38i\xb4\xe3" -"\x1e\xb7&\xc6\x15\xa5\x9foVM\x95\x19\x4\x66\x10*}fJ\x9d\x1cw\rl\xf\xa2\xdd\xc5\xb9" -"\xaa,\x87\xf1\xd0\xb0N\x8a\x39\x8c[\xda\xab\x96\x90\xed\xb2PidD\x87\xb7\x86\xa6\x16" -"\xa4T>M\x90\xfc\xcc:\x87\xc1(&\xf7:\xdc\x34.\xbe^\\H\x19_ok\xa5\x10h!\xc8\xc4\x8e" -"\xda\xd0\xa4\xcd\xf4\xb9\xcc\xbb\xdf\xb6\xcah\xc0VlF7\xc4\x39\x8f\xc7\xaaN\xb7,c" -"\xbf\xb4\x1bv\xe8.9\xa8\x13\xfcH\x91\xb4\x9e\x8b\xfaq\xc2V\xcfKO.\xa5O\x93\x32N^" -"WV\x9\xd4%h+\x14y\xf1\xdbM\x90\x9f[\x9c\r(\xc9\x62@0\xe3\xfdO\x11\x35g\xf9\x64\xdc" -"\xaa\xb8\xb\x89\x19\x8co\x7f\x61\x95\xe5><\xc9\xceH\x8b\x63\xd7\x92)\x9c\x17\xc9" -"\xea`D\xd7\xf7QQ9\x8b\x14\xa6R\xa1\x94\xc8\x81\x9f\xd1\xd4\xc3}\xf6\x44q\xdb\x13" -"\xf2L3\xe3\x8f\xd4\x1a\x96]\xea|V\xf5l|\x91T\xc2?\x90\x38\x16\xd2\x19\x12\x6\xa2" -"\x7f\x4\xc2\x18!\x9fQ\x85\xa3\x83\x32\x96\xc2T\xd4\xe3\xc3,\x1e\xec\x1e\xbd\x1c\x9f" -"\xb5\x81\xd1\xce\x1e\x8\xdd{pn\xb7\xb7\x1\xed\x9e\xb3\x1a\xeb\\\x45\x1d,BQ\xe3\xb4" -"I\xd3\xc1\"\xac\x16\xb8#L>\xeb\x1d\x13\xb6\xa7\xdbTVg\xb8\xba=\x16\x46\x14k}\xc4" -"T\x99*\xe2^\xc3\xc4\x99\xbf\r\xf1\xfe]\xae\x3\xe8\x1f\xf8\xebj\xe4\x31\xe\x1d.\xe" -"\xd3\x30\xab\x8cy\xe3 \xb1\x41\xea\xa1j\x16\xc4\xab\x94\xc1\x1b(yp$q\x99\x86\xa2" -"\x9d<+\x12\x95\xf2\x38\xc3\xb9y?\x96\xf5\xca* \xc9\x14\x8dy$Q_\x11\x96~\xe1\xa5\x98" -"e\x91\x43\xd4\"\xf9\x39\x65\xfcv\xac\xf1\xc4\x4\xbd\x87R\x2_\x13`/\xfa\xbd\xe7S\x1c" -"\xdd\xba\xd9\xa5\xaf^\x92\x1a\x11\xe9N\x94\xa4P\xe0!\x1b-,\xf:7\xc2\xdd\x43\x41P" -"TIEt\x4\x91!(n\x13\xfe\xaaV\x8.\xd4\x8d\xc2-E\x80y\x1a\xfe\x92i\x85\x2\xbdW\xa5\x98" -"9\xe0\xc3\x16Gk2\x83\x8c\xcd\x1b\xd6\x85\x62\xae\xe7\xa5G\xa5\xc2\x92\x88\xc6(^\xf4" -"\xa4\x96\xb7\xa8&~\xc8\xf6]Mz7\x1\xcd\xb7$\x98\xe9\xe0\x6\xbO\x17\xe3kq\xa4\xc8\xcf" -"\xba\xf4\x92\x14\x8a\x9f\x62\x8q\xb9:d\x0\x64#\xb9io\x17\x8e-,Q\xf8\xf0\xd3\xa7`" -"\xa9M\x18\x83\xa4\x38;)\xc0\x41\xfb\xc0\x90\xcdgS\x11u&Ij,\xc9\xfd/r\xb4\xfd\x2\xe8" -"?]\xa8,T\\Sn\xef\x8\xef\x88\xf3`\x7f]2\x85\x35\xbb\x11\x83)\x1f\"\x5\xde\xd2\x88" -"oS\x92\xe5J\xf3\xeb$\xb2\x36m\x96\xb\x1bTm\x7f\n{}iU\x84\xe\xaf\xc8\xc2H\x1d\xc6" -"\xf@E\xe6\xfav(\xeb\x8f;\x97\xd4)\xf5\xaf\xa5I,\xb0\x9c\xca\xef\xf0\x13\xe6\x8c\x98" -"\xa6T x\xfa\xdf\x43\x9f\xfe\xf7\xc3\xce%\xa1S\xf7;\x9a\xe3\xd1KV\x92\xf2.wd\x5\n" -"\xfZxR\xea\x0\x37P\x93\xd4\x97\xfe\xf4\x9d\x30\xe2mmG\xf7\x39\xae.u\xed\xc2\xc2w" -"a\x17\x32\xc8\x14\x44\xf9\x43N\xd8\x97\x43\xa3\xb4\x11kCm\xd8\xd2\x42\"\x45" -"/\xed.\x81\x8e>W\r\xa2\xc7{\xf0\xf5\xdf/\x18\xcdk{h\xb3O\xd5\xc1\xf7\xe4\xab\xc9j\xc6\x81\x1b}Y\xc\x3\xa1\xaf" -"\xbc\x32\x8e{m\xad\x7f=\xeeg\x1a\xb1\xcf!1SUz\"\xf5\xe4{{\x1\xb1\x90\x9f%\x19\x89" -"\x9fO\xbf(6\x14\x13\x1\xfd\xd8\x9c\x93\xec\x35\xaeQ{]\x16\xc8\x90\xfe\xbg\x3Y]z\x9d" -"\xc1\xa3\x62\xf0\xa9\x14\xe4\xbe+\x9i\xdb.t%\x17\xcrTd?\x98\xee\xc9Q\xd8\x1cvS\xcb" -"\x1f\x7fM\xea\xea\xb1}\x9d\x61Z\xea\xf0\xa8\xf\x83/)\xf6\xfc\xea\xf9W#\x6\x93\xf4" -"m\xd6\x36\x2\xab\xd0\xb0\xd2\xcf\xf4\xb1Ri7\xe3\xa3\xc8T\x92\xfa\x65\xee\x11\xa8" -"\xa1n\x94\x1c\xd7N\x9dP\xc9\xeaG\x8d\x17\xb7\x95\n\x30\xb3\x46\x7f/\x5\x6\x1d\xed" -"\xbbq\xc8S\xd9\xc3=\x8\nk\x1a\x85mB\x91\xb5\xd1<\xe0\x15\xd8L%]\x1f\x43)\xfe\x92" -"\xc8\x14R\xf4\\\x9d\xbf\x66^\xbcg\xd3\xc9\xd2\xbcnO\xe4'cUO7\x19\x98x~\x5Gz\xac\x65" -"*5'_\x9e\xaa#\xf0\xf9_\xb3q\xe7X\xacs\xd2\xd6\x7\xc1\xac\x8c\x46\xc6\xce`ZfW\xfe" -"\x91\x2\x44\xa8\xdc\x8a=\xfc\xba\xfc'[\xa9\x8\x84\x84T\xd5\xd2\x1a:d'\xd6\xa7\xe3" -"\x90\x16\xebY\xbc\xd7\x16\xca\xae\x8a\x64\x2\xbc\xd7\xb0K\xafV\xfe\xff\x7\x1b\xd8" -"\xce\xe8\x2\xad\x8a\xf\x6~\xd0\x1c\xa9\x45\x38:\xc8\x97\x80\x16\xf0.\x2w\x17\x87" -"\x12\xe9P\x13\xb0\xc0\xf4\x94\x98\x8bM)\x18\x87Z\xd6*V\x86\xb4K<\xdf\x32\x92Jm\xea" -"[E53\x18=\xd5\x98\xec\x37\xfa\x8b\x63\x38]\x88\x98gJ\xe5l,R\x8a>c\rF\xfc\x94R\x84" -"\xe3/7\xb1\x9b\x8d\x92\xac\xc7\xbb\x83_\x9d\xcbo)\xe6\xb7\x94\x3\xeUj\x80\x42\x15" -"\xfd_)d\x8\xf6\x80w#L\x13\x1e\x5\x98h\x98&\xabU&'\xaa\x7f\xdf\x15~T\xeb\x91 \xa9" -"\x13\xef\x18\\\xcc\xdf\x94\xd3\xd2\x88V\xa8\xfdl\xea\xc3Q\x95oV\x80\x9b\x3\x35\xb6" -"\xd8\x8b_w\x99\x6\xca\xe6\xbe{<\x89\x18KKj\xa6\xb6\x82\x98\xe0\x36\x4\xad+=\x19-" -"\x95\x1d\xd7w!m\x9c=Y]\xf8%\xf5\x1a\x0\x18#og\xbc\x10\x36\xbeW.\x8\x83\xd7/\xd4~" -"@:Y\xcd\x15\xf1sZ\x91\x41\xbf$\x94\xcd{.\xa8>X\xf7\x7(\x92\n\x9c\xc2o\xc3Z'\x16P" -"$\x89\x9a\x4\xce\xfd\xb0\xf0\x89p\xb8\x97\x87\xf9\xdc\xda\xcc\xa8\x4\xf6\xdf\xd7" -"\\\xcc\xe5\xc6\x34\x16\xaa\x37r\xf8.\xaa\x8c\xf8\x15\x33\xe\x46+\xe4\xa7?\xe4\x9" -"@\x8 A\xb6\xaa\xdc\xcdx\xb7\xa7z\xd7\xe3v\x9f\xf5\x0\x64\x14\x8\x9\xa8\x99O\x97\xe" -"\x83JvBN_L\xf4\x65\xb8\r\x15J\x80\r\x7f#\x8d\x3V\xd2<\xe1\xcc\x19\xddH[~\xccS\x8e" -"T\x15\xddW\x8f\x8d\xe8\x15\x42\x65:\x1e\xeaJ\xc0\x9^\x1f\xbd\x35r~F\xaeg\xf0\xa3" -"+Fm\xb8g {+\xa3\x93\x9cl~\x92\x87_\xf\x80\xcd\xed\xe6G\xbb\n\x9e\x14|\xe7\x1\x36" -"F\x8b\x2\xbc\xf3\xce}\x9c\x9-\xfaH;\x80\xabO\xc3z\x13(O\x3\xf6\xf0\x9\xd9\x8a\xbc" -"?x\xd3\x93\xb1\xf3\xa4W\xac\xd3\xacL\xed;\xbc\xe0\xe7\xfe\x85Y\xda\xcb\x9d\xdc\xb0" -"\x99\xc3\xe6\xbe\xd9\xa3R\xae\x92:\xba`C\x1an\x2\x9I\x9fH.!\xe5\xe5\xd5\xee\x94\xc0" -"\xa4j6\x87W\xdblS\x9a\x64\x93\xdd\x14r\xd1j\xa8\x9e\x36&\xc5\x42\xf4@\xe8Y\x9aJ\xfa" -"\xeb\x97{D\xea\xea@\xa4\x8d\xef\x1f\xd1\x1a\n\x87U\xcdR\xbd\x84" -"ts\xb6P\xc6t\xe7\xbc\xd4\x1\x35\xab\xbcS2\xab\xea\xa1\xd8\x61\xa0\x36\x7fsK\xb4}" -"|\r\xb0\x5T\xfe\x84\xe2O\xde*+\xc4\x98\xd2t\xad\xc1\xd9z\xfdx\x1c\x96\x2\x81x\x98" -"2\xdfZ\xe5\xe1\x81\xfd\xd8\x37\xe5\x13\xb7\xd3\x4\xb7\xf8\xf0\xe5\xc8\x97\xb2?\xc7" -"\xb2\xda\xff\x9e\xdd\xd5[~\xffk1\x1e:\x4\xc0\xac\x8a\xcd\xba\xddw\x14#xj\xf0\x83" -"\xe4\x45\xc2/\xca\xd3\x7f\xc4\x98\xad}t\xbd[~A\xb3\xb7<\xc1\xa7!\x9\x9\xe7\x66\x18" -"\x1b\xccU\x88\xfa\x1c<\xd6\xbf\xcd\xa4I\xc5G\xb8\xa5\xcfR\xd9\xd7P\x9b\x65\xb5\xaf" -"+\xdcsd\xc2\xfe\x10\xf1w\xe\xb1\xc\x14\x98\xd0\x82\x9\xbb,\xb6\xfbj\xfd\x8b\x62\x84" -")\xd3\xcd\x44\x86\x97\xedh\xb3:l>\xc0\x1a\xfb\xcc\xb5<\xe7\x35N\xad\xb6:&\xbbK\xa0" -"\x1b\xbb\xef\xbc\rQ3e\xf6\x34\xa8\x96.\xf0\xdb\x61\x8e\xee\xdfV\x14\xdf\xe5\x85\x19" -"\xdft\xcck\xbe\xf\xde\xadu\xde;\xccQ\x12?\x9\x39\x92\xc9\xc3\xda\xd9M\x94'\xfd\x13" -"\xdc\x16\x1e\xfbH\x14\x7f$\xbe\xb9\xcc*8{\xd2#\x9e\xdb\xf1\xaf\x9b\xb0n\xb7\x84\xe" -"\x14>\xb8\xf0\xaap\xb7$\xc2n\xe6\xb3\x62\xf9\xf9\xa1jF\x9b\xbfKu.\x10T\xb9\xa0Jg" -"\xc7\x8dy\xd3\xc{:\xdc\xab`\xad\n\x9a\x89\r\xb0=\x94\x6t\xebx\xbb\x45&\xb5zJj\xd6" -"\xbd'W\x96\xdc\x82\xa1\x97Ls\x1\xcd\x33\xf1\xe2+\x9\nr\xa8\x11\x46\xc8\x38\x46\xd3" -"\xd4\x13\x13\xe2\x6\xf9\x32\xb7@\x94\xc5z_\x86z\x18#O\xc2\xb\xf1-\xf6?\x1\xa5\xd5" -"\xde\x38\x18\xe4s\xe0|\xcdp\x1e\xbe\n\xfeX\x80@\xeb\x9d\x8b\xcc\xcf\x8\xac\x5nW\xbe" -"\xc6\x82\x96\xdc\x8e\xd0\x9b\x44\x16}\xa9\xef\xe2\x11\xff\xa4\x88\x45\xc0\xa7\xff" -"\xb7T\r\xd3\xdau\xea\x81\xf7W\xdb\x43\xe3\xc9\xb1\xa1G\x93\xde\xa9\xd5\xaa\x93\xef" -"*u)\x8c\xbd\xc8RM\x89\xc3\x9b\x10\xee$\xbe\x83\xc2\xci\xc5\xd2\xbb\xf5\xd6\xf6\xb2" -"\x9dKMF~\x1\xb4\xeb\xb3\xc6+&\x7o\xe4\xb0\xc4\xc6\x64\x96@\xba>A\x8f\x7f\"{\x88;" -"\xec!$\x99vhD^\xb4\x35w9\xb5\x91\xf1!D\xfc\x38\xdck\x8a\xb0\x7f\x7f\x85rh\x87&\xbf" -"u\xe\x91\xedU\x93\xd1W\x9d\x12\xb4h\xa7\xeeRc\xe2\xbe\xb4\x66\xf7\x64\xa1\xa6\xae" -"P_\xbb\x44_\x18\x7f\x39,\xf0U\x9c\x36\x9a\x6\xbe\xe2\xb0\x88o\x93\xfb\xcM\x9f\x84" -"\x8b\x7f\x11\xc1\xda\xc3h.\xa0\x37\xb9 \xca\xc2\x97{`\xe5\x96\xfb\xca\xdf[\x8c\xcd" -"\x90\xc0\x89\xd5\x86\xcd\xc8;\x0\xc4\n\xec\xf3/\xf1&\xbdO\xd8\x81\x42\xed\xf4-\xd2" -"N\xfa+\x95j+I%U!`\xd8\xb2\x35\x15\xde\xe4\xae\x44\x33\xe7(u\xd0\x38h\xbf\x87\x63" -"\xd7\xc4\xe8\x9f~\xc0sz\xca>\x85\xed\xb9\xcf\xe\"\x19i%uC\x2\xd5\xfc<\xd7Gw\x9f\xd1" -"\xc9\xc5LX\xcf\x7f\xca\xdd\xfd\x93\x89\xf8\xf9tu-of\xb5>j\xc3\x8c\xaaS\x89\x19\x1e" -"v\xa5\x5_ox\r*\xa7\xf5\xfdp\xb8\xfa\xf5\x64\xe6\xaf\x38& I\x4\xd9\xb7\x1b\xec\x11" -"W\xfb\xe\x1d\x18\xe3\xdah(\x12\xba\xb3\x37\xa8\xc1\x45\xd6\x94\xa2\xc9:\x9exn\xe8" -"\xfa\xf8\xc5}*\xc8\xf9\x9c\x7f\xe1\x8\x35\x46R\xa6\xd0\xa6\x9b\xc3\x44\xd6`\xce\xfd" -"pg\x17\xab\x8a\xa5\x1\x81\xe0\x8b\xc5\x85/s\x9\x9dO[\xcc\xc\x46\xa8\xe1\xdd\xd0\x13" -"\xec\x62\xa2\xa7\xb0\x83\x9dM\xe6\\U\x83\xe4\xe3\xee\xc1\xdd\x42n8\x8f\xad\x89!\x98" -"\x8f\x9cZ\xdb\xde^=0R\x80\x35\xc7G'g\x9a&\nl\x3\x90\xach\xa8\xf0\xa6\x8a\xbb\xa1" -"\x95\xb6?\xbem=\xdb\xf8\xfc'S\xa7\x13\x9\xbb\x7f\x18&L\xf3\xdcG\xe7\xfe\xaf \xd6" -"\x83\xa2k\xbd\x62\xed+\x9e\xd3\xa5\xb6\x8aJ\xa3@\r\xd1\x6i\xb2\x1a\x1b\xbfi\xb2\x89" -"\x90\x3\xb3\xbc{\xe1Tg\xdc\xe6\xe+\xa5\x7fQ\\Bt\x98\xe\xc7\xaa@\xf2\xd2U\x6\xa0\x2" -"\x1\x99\xf1N@\xc\xed\xb9X5\x18\xe0\xcf\xf7\xf2\xb3\xac\xbw\xcaP\xa7L \xd2\x8d\xff" -"\xd9\x86\x0\xc7\"\xefzf\\K^P\x8b\xa6ZH\x9b\xfe\xbf\xc1\x5\xc3\xc0qUT2\xcf\xbd\x66" -"Zh\xad^\xda\xb1>I\xb6\xeb.'\xb9\x89\x89\x64\xb0\\\xc2\x90\x64\x97\xaa\xd7\x89\xca" -"\x8e\xe0\xb8\xb4w6\xd2\x98>~2l\xeb\xef*n\xa3'\xd3\xab\xd5\xcd-~\x9a\x62\xa2\x1)\xae" -">K\xa0\xc7\xcf\n\x92\x42\xb0.\x95W\xb6~\xa9G\xedwQ-f\xd8\x8b\x82\xec\xe6'(r \xdb" -"2\x82\xe6\x11\x38m\x8e\x94\xfd_\xb2\x84\xf1\xcfQ\xd6\xfe{\xa5\x34$x\x8\xabu\xe\x41" -"\xb7y\x97\xbb\xf5L\x13\xb4y\xefR\xfe\xd7\x1e\xe1\xce\xe4\xa8\x89\x12y\xb4\x5\xe\x8f" -"\x81/K \x7 |g|\xbd\xcd\x1c\xc1\xd0\x37\xe8@8}\xee\xd9\x7f!\x4\x1f\xc7\x8aR\xcfp\"" -"o\x90\xec\xc2\x8fH\xee\xa5I\x97w\x86\xa0\x2\xe1L\xeb;r^\xa9\x38\xd6>u\xaa\xf7\x7" -"2P\xfct\xb3)\x10{\xfe\x34\xab\xcc\x96$\xae\xb7\x82M[\nk[^\x9a\x19\x37\x44\x63\xc7" -"}\x9c\xbb\xaf\xb9\xcK\xd8\x11\x1d\x66\x1e\xb3\xad\xac\xcc\xeb\xf9\x95\xa4\n\x96\xa6" -"\x1f\xe\xbd\xfe\xd4W\x87\xfe\x1ej\x4T\x95\xf0nB\x16\x7fW\x1e\xbb\xdcS\xa4'\xf1\xd6" -"\xc5\xa5\x97`\xfd\x14J\x14oxO\xbd\x87\xee\x93\"\xb8\x96\xa3\xec.}AW\x9c,\xeaP}UH" -";/\"\x8a/gs,\xf3<:\x1b\x31\xda\x9c\xcd\x8fz\xf8\x84\\\xf7\x8d\x9f\x94\xdd\xb8JAQ" -"\xee\xa1\xad\x17;q7\x15\x17;\xf1k\x8cl\xe7\x1e\xc6\xef\x33\xec\xb9TDT'-br\xbf\x41" -"\xda\xc1\xb3\xba[\xc1\x34\x82}\x4\xe1\xdb\n\xbcSj\xfc|\xfag\x1Y\x6\x38\xa8\x0g\xbb" -"U\xeag\x9b\x87\x19\xe3\x30\x84\x94Sm\x9dK\x9\x44~t\xfGF\xe7\xc6\xe6\xb2\x0\x9b:&" -"\xdd\x94\x94\xd1\xc9\xbK\xa2p\x8eV\xc\xd6/\x81u-\x2-\xf2\xbc\x8aT\xe4\x2I\xffr\xc6" -"\xcf\x88\x91\xd1\x4\xf8\x83wz\xd1\x64\x86\x45\xc4\xfb\xac\x33\x45\xb2\n\xb9\xc4L" -":\xfe\xde\xe6\xa7\xb6\xc5\x9a\x8d\xf8\xca\xa9\xa3\x9c\xbb\xe6\xca\xe0\x32\xe5\xaf" -"\x88\x9a\xd1`\xce\xbd|\x8c\xc0\x7\x1\xd9\xf3\x32\x45Q%E8v[\x2\xb0\xbc\xc0Q\x1d\xd9" -"g\x86\x17k \xc5\xea?Z_\xc8\xb1\xc5M\xd9\x38V\xc5\x91?\xfb\xd2\xa8\x9c\x9c\xc7XL\xbb" -"\x93\x19\xd4\x38+\x9b\xe2\xc5\xb0\xd2\x1\x2\x84'\xect\xe9\xe0\x1eK\x4\xa6\xbb\x8f" -"\xe4\x39!\x97&\xca\xe7*\x9d\x41\xa4\xb\x32\xd5\xad\xa6#\xe4zDXz\x6Re\xaa\x87\xd5" -"D\x83\xfb\xe\x96\xd4\xa5\xd2\xbd\x7|Lr\xffs\xe8\xd6`XHQ\x7JN*d\x1e\xe4O\xcdN\xfb" -"X\xebj\xd6\xe0\x7\xe\xc1\x63\xcd\xb2\xf0\xafZ\xf0\xbeK\xdai\xbcx|;?\x1a!\xf1l\x13" -"\xb3\x61\x62\x1fo\x10\xc1\x9e\x90\x9a\x43\xae\xb1\xbc\xdbg|\xefk\xc7\x45\x35\x97" -"\xa1\xf2\rsT\xc4\x31\x38\xec\x2\xca\xfb\xc3\xdd\xd8%\x85\xc1H.\xc7.^\x5%/\xa1\xa8" -"#\xaf\x81\x1e'X\x15:\x11'\xf6kL]7\xd5\x8cS\xf5\x15)\x14\xec\x95\x81\x31\x3\x45\xa9" -"cC\xe5\xc7k\xe3\xcbJ\x4\x13=\x10\x12\x82\xd4\x31\x9e\xf3\xb6\x8b\x2\x96}\xf9\xfd" -"q\x1f\x61\x97\xa6\xae'\x82\x39\xca*\xf8@L\xd0&\xca\x85\xcd\xce\xd7\xa0\xd5\xc1\x8f" -"\xf1i\xda\xcc\x89\xe1\xd1\xbc\x9\xf0\xbc\x30\xe4\xc;\xb9\xa2\x65\xf3\x36\xcd\x65" -"\xa8ol3\x5\xa1i\"\x81\xf8\x38p\xf9.\xed.\xef\x32\xcb\x15\xbf\xc2\xd2\xbd\x9d\x7\xa6" -"/\xaaoDg\\\xdd\xe0\x10]\xc9\x17\x43\xc6\xdf\x86h\xa0@\x1cTV\x7\x1b>1\xac\xb9`\xb2" -"\x97N\x98\xf8(\xabz\xf9|\x93\x86\x3\x8fv\x86\xea\xd0\xe\xf\x9dl\xc6<\\\xcc@@v=\xd6" -"\xaa\xd3\xcb}\\4\xc\x36\"^S$\xa2\xa7\xdf\x82\xc1p\x9d\x96\xcd\xc2$m\x4o\x83\x34{" -"C\xff\xcezI\x8d_\x4\xb4\xc\x62\x87\xc8Gv&\xfa\x35\xf5\x61\xcbPP^\xe6\x91\x44\xae" -"6p\x81\x9a\xb8\xc9N\x1a\xbf\x95\xd3;\x83i\xc7\xa6\xbfId\xa7\xfa\x1a\x9d\xb6\xf2$" -"\x9f\xbb\xa5\xf0\xf2!\xc0\xc1\xc8\x80\x98\xf\xa1\xb4\xb0\xe0t\xf2\xa8P\xe3\xc2\xdf" -"m\x18\x1d\x14W\xed\x36\xa9\xc1Xxc'\xb\xbb\x16\x15\xae\xef\x37\x95\xc6\x9d\xe5wD\xaa" -"ma\x91\xdf\xc5\x3&\xd7\xae\xe4\x10Q-\xd0<\xe|&h\x2\x4\x80\x35V\x96\xb2\xf5\xfb\xbb" -"xCj]lF*\xa1\x96\xa7\xdc\x33\"\xd5w\x84\x7\xda\x44\xf7\xc5\x94\xa3\xf5\x86S\xad\x83" -"a?\xbfq\x6\x1b\x33\xe8/\xaa-\x99+\xca\x1d?.&\xbb\xe4\xdb\x3\xea\x92Ut:\x82]\xea\x36" -"{z\xa6u\xf5\x36\xba\xc2\xcb\xe0\x31RcV\x0}\xc9\xb9\xedO\x96w\x9b;\xcaqs\xc0s\xff" -"]\x14\xa1\x35\xaaT\xfb\x35\xe5L\xfey\x7u\xf7N\x83\xa0\x84\x86\xe7y\xa1/\xc0\x34\xc" -"l[\xcd\x80\xfd\x14\xa5\xb5$\xad\xfbp\xb7;\x5i\xb5\xe8!OX\x87pm\xd9.\xd4\x0\x8em\x5" -"*\x81\x30\x19L\x1a\xe8\x1\xdd\x11-/C\xef\xc9\x11\xbd\x9cse\xf\x37\x5\x31u\xee\x62" -"*\x85\x9b\xbcL\xad\xf4\xee\xa3\x41j\xf0`o\xfe\xc9R\x1c\xa8\x8f\x82\x2g\xa6Q\x8f\x84" -"\x4\x36\"G\x13.a\x99Y[d\x90<\x5\xa9n\xa7=b)\x14n\xf8\xf2\x8f\x9a[\x1dxV\xf7\xaf+" -"\xdb\x13X2.\xf3\xaa\x8b\xcf\x39\xd9\x98\x38\xc8\x80\x0\xbe\x98\x30\x85!\x9\x84\xcd" -"r\xa0q\xbe\xd3\x7/\xb2\xd9\x3O\xf9\x41\x39\xd5\xee\x87\xb5\xe2N\xc\x7\x6\x94}\xb" -"$\xaeJx\x94\xf\x1cM\xfdt\xb1\x7w$V\nZ\xf1-h\xcfP\xec%\x82\xf1n\xbc\xcf\x10\xb6\r" -"\xf8\x98g\xbe\xad\xe6:\xf0^9\xd8\xe3rp\x12\xa9\x98>\xc6\"\x7R\xcb\xbf\xa6R!Z\xa6" -"\x83\x8e\x8e\"m\xbb" -"P\x88\xba\xe0\xaah\xab\xa1\xc9\x8a\x9eP\xa3)c\xd6J\xf5\xf6\xc5&/\xaf\xa9\xf6\xdf" -"FF\xb9Z\x1f\xce\xe4\xb9\x18\r>o^\x8d\xd9\x41\xeb\x8a\x39\xbev\x84\x13X\xf4 f9&7G" -"\xbc~2\x91z\x5\xa0\x15\x9f\r<\xaa\xc9n\xfe\xa0\x31\xfe\xd7\xd2\xa1\x7\xcb\xa1\x8e" -"\x10XZ\xff\xdc(\xaf\xbf \xe0\x61\x19\x93\xd5\x12\xdf$\xaa:\x3\xc\x15\xf3;:3D\xe9\x0\xdd\xd8\xbc\xd4\xaf\x91\xd2\x6\xee\xc3\xafI\xc0/\xd0\xdc\x43" -"j\xaf\xdb\xde\x33\xb9n\xf2Oz\xaa\xe7\xd9-\x1b\x8aG9k\xb0\xe1\x30\x45\xfdS`\xdb\xd9" -"\xbc\x95\"m*\x9&%\xbe\x1{\xb4\x8\xc8\x7f\xb1\x63\x32n4\x18\x14\xa2zy\x81h\xa7\xbe" -">\x4\x38u)\x17\x45\"+\x15\xad\x19\xfb-\xc1\xcb\xeev\x9e\xa8\xd2/\xe8\x6\xcc\x6\x17" -"O\xa4\x82\x35:\xe4S\xe7\x9a\x61\xd2\xde\x96\xa2\xe6\xf3i\x1es&\x1b\x46\xd3\x30\xd0" -"\xbaxH\x12\x9e\x8e\xa2\xf8\xc2\xc9\xe2\xd2\xfd\xa6\x3\xd8 D\x92\xb\xe6\xf5'i\xf8" -"\xc5\xf3@c\xccw\xdd\x8aS\x98\xe2\x80\x7z\xc3\x9a\xb6\x35\x18\x90\x41k8\xfe\xb9P{" -"\x8e&}5@\xf1\xce\xe9\xb4\x95\xfb\xfb\xd9G\xba\xaf\x8f\x93\x0\x5\xdd\xd2T?\x96T\x18" -"[\x9fN;\xf3\xc5}\x81xc\x8b\xc4=\xf7\x7W\xd7\x1b\xc3\xe\x82\x9e\xcel\xf\x95\x42r\xe8" -"\x2g\xfb\x9\xdc\x85+L\x19\xc0\x36\xe3\xb3\xe0\x99y(\x91\xa3\xd6\x85\xdfKGg(\xe2\xa4" -"\x9dW\xd3\xc7\x36)\xda\x99\x3\x1e\xe0\xd5\x13y\xea\x63\x92$0`\x12\x90\xc6\x94\xb8" -"d\x6\x31\xb9\xe8}`}\x7\xc7x\xbe%\x81\xf\xe1%\xb5Gk\x96\xb0\x1d\xdb\x30\xde\x8d\xb7" -"N\x90=\xd2\x34y\xa3X\x1b\xc1\xb9\x30\xdb\x9aj9\xdb\x65\xe5\xe8\x8f\x35te\xde\xc<" -"\x99^{O\x96\xbf\x99\xba\x99\xa2\xc?\x1f^\xd1\x87~\xf9uF\x97\x1e\xbe\x82|J#,\xc2\xb" -"&\"\xe8U6\x99\x3\x6\x1a\xc7\xfao\x7\xf6=\x81\xf2\xa9\x42\xb3\x1c\xfd\xcdQ\x13G\x1f" -"\x6\x9c\xea@\xbf%\xf7\x31\x9d-I\x80G\x6n\xf0\xaf\xb2 \xfe\x1b\x14\xf8\xf4\x87\x61" -"\xf2\x94\x35\xc7\x42[v\x84\xd4P\xd5\xa5\x8c_b\xcc)DW\xe8\x80T\x9b\x5~\xa2\x95\x42" -"\xefQM\xfa\xf3mmR\xc\x1&ia\xe\x99\x61\x85\xbc\x11\xf2\x37\x81`\xc9\xc3\xfd\xa5Or" -"p\xb7\xb\x7fiD\x82\xbc\nU\x11v\x8bJ.\xf7\xc9/\x84\x3\x98\xbk\xa3m\x13\xdd\xaa\xc0" -"!0\x92\xb9\xfb\xf1\xd9@>\xcc\x7,\x18\x12\xf2\x84\xdd\x1b$\x5\x96$kQK\xe*\xdb\x99" -"\xf2\xa0\xcd\xc3\x11\x11\x9f\xd6P\xaa\xfd\x81\x19I\xd8r2\xc0\xba\xce\x9b\xa5\x85" -"J4\xc4g\x9[{\xd8\x81\x1b\xf3\x61\x16\xe8G\xa1\xcf\x8b\xf9\xcf\xf9\x66\xd2\x7f\x7f" -"\x80\xb0\x9e\x9ej\x19\xfd\xf7\x19\xb2\xec?\xb7\x64\xef\x41\x42\xe5\xcb\xb9!oO:\xf" -"\xb\x9eI\xd3\xd7\xc\xd8\xf3\x8f\r?\x11\xab\x1f\xecL\xb2\x1?m\xd6\x9a\xb3\xee\xf8\xe7\xed" -"\xc3v\xce\xb1Wv[\xaf\x32N\xc!\xa1\xb\xaf\xcfQ\x12\x63\xb3\xa7j\xee\xbc\xd5Ij\x11" -"w\xa2&\x9a\xe2\xb\xf9\xe7\x32\x9f\xe6\xb5\x41\xf5\xe\xc4;\xec(oc\x9c\x97\x9c\x6%" -"\xe0\r\x32!\xc7\x85\x37g\xba\xf\xe2MA\xd9\x41\x66\xadgO\xdf\x61\xee\x8b\xf5#\xd5" -"\x91\x1b\xa9\x98\xefOH\x94\xf6\xbf\xed\x8\xa0\xaa\xd2\x8b\xce?\x83\x61\x1e\x6\xf" -"\x3\x1aRI\xe5RD\x9f)R\xe8~\xd8U\x1d\xa9\xbb\x94rl\x90:AI\xa9\x87\x1\xf9\x1a\xbc\x98" -"\xa3Pj\x10\xac*X/\n\xe9\xa8\x81\xff\xe\xc6n\x12\xe6Y\xf1\x9e\xbfpW?I\x2[4\xd0h\x9c" -"\xbc\xedhH.R8\xdb\x89)\xf2\xe3\x89\x12J\xb0\x38\xce\xd3\xab\xe2\x62~\xfe,\x9b\x8" -"N\n(\xf5\x16\xf4\xf\xa8}-$%\xbf\x18z\x92\x0\xc9\xda\x44\xf\x8fM\xf0\x36\x11^\x90" -"i\xf2\xde\xf3?\x94i\x90`\\CA\xff\xde\x61\x84\xf2\xa7G\xcb\xbeMZ\x8c\x16\x33w\x14" -"\xb4\xf3\xe1\xb1\x15\x8f\xd2X\x8b\xbe\x14\xb4\xe9\x31\x9c\xf8\xbc\xa7U\x8b\xc3\x95" -"\xc3\xbd\x9c\xe\xcd>\xc7S&\x18\x8e-=\x8c\x44h\x9^\xedTI\xc6\x31\x9f\xdd\n+\xe7\xa0" -"\xef]\xb3\x16\x84\x83o\xb6\xc6\xfa\x45\xf9\xc1\x85\xe3s\xb3&\xb2[\x14\xa6\x96\x31" -"I\x9f\xb0[\xb3p\x1\x66\x6\xb0\xb4pd.?W_L\xd1\xc5\xc6\x43\xcd\x44\xca\xc8\x86\x1f" -"`\x87\x45\xeb\xc1\x39\xc2\x95\xecM\x11TBot\xb2\xd0[\xe6u\xb1\xd2/hpf\x17\xf^\xff" -"2j\x16\x63\x61\x31=\xc4\x46\xfb\xe3\n\x1e\x10\xa0\xc2-J\xae\xb3\xb1\xff\x93\xb1\xb4" -"\xcd\n\x6 P\xd1\x94y\xb8+(x9\xb5\xba\xe1\x13\x66\x2\"\xb4\x37\xda/Iw\x95\xa3\x8d" -"\xb9!*S\xbf\x45i\xab.\xad\xf1\xd4\x92\x7f\xdb\x45U\xd1M\xf6~CT\xe3\xf1\xd7-n\x86" -" \x94\xcf Pq\xa4\x38,=\xceL\xa5\x15{\xa1\"\xc9\x8a\xd3\x33\xc\xf3\x97\x8eS\xa3x\xf4" -"\xdd\xaa\xb4\x9c=\n\xea\xc8GFxX\x89\x8a\xd5p&\"LE\n\xce\x9f\xd1\x10\x5\xef\xb2\xcf" -"J\xb0\xbc\xc4<\xa6\x87\xb8\x9f\x31\xbfi\x80\x63\xad\x87\xa5\xeb[\xa0\x43\x1c\x91" -"\x8a\x87\x18L\xd4\x82\xa3\xc5}/H\xc6W\xb8{F-\x0y&G\xc9\xdb\x8eH\x2\xc8\xe6\xa9/\xe4" -"\xe3\xcd\xbc\x99 J\xa6\xad\x13\x9b\x39os\xa4H\xffK\x8f\x7f*\xf0Le\x1e\xccn\x12\x13" -"\x9f\xe3\n\x90\x45g\xff@\x8b\x7f;\x15\x5&\xa0\x8a\xe5\xc6\x66\xf6\xe0\xc4\xe2\xab" -"\xc8\xb9\x93z\xac\xfb\xd4p\x5Q\xf4\x94\x89\x8=\x11\x14\x11\x86\x15pB\x87\x46\xa8" -"r4\x89\x33\x1a\xd6\x86$O3\x18\xe0\x15\xaahY\xc\x32\x98\x64\xcf\xd4\x9ct\xfcQE\xf6" -"\xaf\xe4\x8d\x10\xd1\x90\xd4\x1e\xee\xd2\x98\x18\x99\xdd=\x83\xee\x44\xe8S+,\xd4" -"\x12\xe9\x66\x8d\x8f\xbbo\xb7L\xeb\xcf\xfd\x3Za\x9c\x12\xb3Sn\xce_\xdf\x1du\xb\x1c" -"AP\xae\xce\x1b\x63\x98\xf6\xea\x9b$Q\xdb\x44\xbc\x63\xc5\xe5\xc\xe4K\xc0\xa9\x1c" -"?\xe6\xd0" -"\xba$\x18\xf5\xdb\x9a\xaeT\x19\xe0\xb4?\xc3\x9XI\r;Q\"IMxX\xe1\x33\xa6\xf5\"\x6\xf1" -"\xf1 \xe6\xaf\x97\xba\x99\x92P|\x3q\xd1\xd6r\xeb;\x4\xb9PhKN\x87N\xe1\x81+?\x15>" -"\x0\xa8\xbf\xfc\xd8\xb5\x93\x34\x9bO\xb4\xbb \x95TF\xb4\xb4\x11(\xa6}Q\x3,\x5\xe7" -"\xd4%\x14\xc9\xdf)t\xf9\xfe\x45LH\xdc\xab\x35\xb8\xb9\x9eHzw\xde\xaas\xc1\x34\n\xbf" -"\x1bye\x1fM\xa7\xbb\x92\xee\x84\x1fZ\x92\xea\xce\xb4\xb5\xba%\x84\x62\xb2\xfa\xea" -"\xe8\xed.'g\"\xd8\xa5\x8d\xdd\xab\x8d\xe9\x63\xdev\x18nv\\\x9d\x82\xa6 \x1eV\xc\x81" -"\x82L\x8b\xca\x1c\xc9\xd9\x6-\xb9X9<;\xdc{\x14\xa0\x65\x93Y$\xae\xe2\\\x85\x43\xed" -"\x82\x91\x85\xd0\x1f\xad\x61q\nE\x91vh\xb2\xfd\x8a\x7f\x8e\x3\x30\xe1\xee\xfa\x8d" -"N\xe7\xb2w3\x99\xc0\xf1\x65n\x87'\xf\xe7\xf7\x10\xf\x88\xc9Oj\x89\xb8\x94\x97\x8b" -"\xe0\xe1\x85\xeb\xe9\xc1\n\x99\xb9\x87\x34\x87\xf\xbak.8\x1b$\xbbq\xa3\xf8\xc1\xf1" -"5\xb2\xed\x7\x17\x9bv\xc3\xd9\xbc\xda\xc1\xb8XNB8\x9\xad|\x11\x19\x6\x8c\xbb}\xfc" -"\x8d\xf2m\xa8\xfd&\xd9\xbf=A\xb8\x14\xb8\xdd\xe8\r\x46.\xf1\xc5\xcf_\xaf\xb1\xf1" -"(\x8e\xe3\xb3Y\xed\x85y\xb2P\xdcz\xcf\xcd\x46\n\xa1Ww\xbf\xe7\x9c\xda\x66\x81\x0" -"n\x9f\x8fh\xa4>\x89\x13\x1f\x8e\xa0\x1e\x61\xe6}pN\xd3\xf1&=\x81\xac\x1d\x88\x46" -"\xb3\xeam\xe8q\xa0*\xa8\xb9@W:\x1\xd7\xbfN\xcc\x9eZ1+\xb5\x97v\x8\xb8\xb8\x87\xb5" -"\xfenb\x8c\x44\xc5\r\x0\xed\x88\x81\xca&W\xa8\xf\x1c\xfb(\x8eU@u\xf6I\x1b\xe9Y\xf1" -"A\x8fT\xf0\x43Y\xdf\xa0\xd7<\x19\xb6x\xda\x31z\xa3\x8)h\xbeR\xf2\x32)\xa3\xa1\xa1" -"\x14\x91\xa2\xc1g\x9b\xdd\xe7\xf8\xec,|.t\xaf\x2)\x8f\xd6\xfa\xab\x98Zn\xb0\xd2\x1e" -".\xc8\x87\xba\xc7\xa2\x83\x37\"\xf\xe2w\x3`/\x84LM\xc8\xe\x99\x93\x7\xea\xd9\x13" -"\xcf\xb5G\x9c\x16\xee>\xcaw\xea\x41\x91\xbd\x34\xce\xf7r\xc4v\xa7\x8e\xc1\xa8\x12" -"\x84\xe8z\x18\x95\xd2]\x1d\xd3'Qg\xce\xd1\xe3\x80\x93y\xfa\xd3\x18\x99S\x97\x96\xd2" -"3\xde\x46V\xe4\xcc\xc1^\x4\x44\xd2\xe8g\xa3\xf9\xef\x95\xaaR\xd5\xbe\x93\x9c \xf6" -"\xa8\xa8\x12\xc1\xcc\x2|\x87\xe8t~\xcc\x95\xbfs\xea\xbf\x9d@)I\xef\xcbP\xd3\x18\xe" -"ulmB\xc6\xef\x8d\x65\xe8_\x17\x99\xbc\xef\xfc\xb8\xb8\xcc\xf9PL.\xc3\xb3]\xd2\xde" -"\xd9\xfc\x15\x8dm\x97P\x7\xbfn\xfc;\xe0/\x92ow\xb9\x1a\x87\xb\xab\x62\xaf=\xa8\x98" -"1\xf0\x1\x1bO\x14\xb0\xa6\xe5\xf\xde\x64\x8:\xa7=\xba\xb3_\xdar\xeeT\xeeyS\xb7\xf6" -"\xff\x8b\x65,\xb8k3\xd0\x62\x12j)\xf1n1*\x4\xbb\xd5\x97:P\xe3lc @\x6\x95\x13n\x5" -"\xa3\x66k\x92\x1b\x42\xcd\xeb\xba\x1b\xa4>\n!:\x91\x15\x86\xd4\r\x19PI\xbc\xdap\x96" -"Yr<\xfe\xc3\xb1\xfeZ1LY'\xbf\\\xa1\xc2\x1b\xb3\xec\x84\xcdZ\xd7\x9fj\xc2\xe3#\x12" -"\x96\xf6{\x8d\x93\x93l\xdf\xb4\xf3_}d\x97wKPJ\x9a\xa1}\xa9:\n\x9e\xfdi\xbc\\\xd8" -"*\x3t\xd8\xd9\x1c\x1bi$1\xa2\xd2\xd2$@\xa4\xd7\xda\x34Z\xef\x91`\xf2\xdd\xe9\xe0" -"]\x99\xcah\xea\x46\xe5\x9fk\xa4\xbcL\xfa>\xf9-\x8d#\xf\x9-\xf6\xf4W\xc4-\x7\xa5\xf9" -"\xfe\"\x9b\xect\xfb*;\x5\xa9\x7f\xe2\xc4\x94\x34@#w41\x5!q\xf9\x87\xfaz\xbf|\xec" -"\x83k\xeb\xa6Y\xebGP/O\xc0\xee\x38\xd2\xa8\xbb\x8\x46\xe\x1c\xb4\x33\xf4\xd9>\xf7" -"\xae\x65vl\xdc\xc3\xe2\x34?\x18\x41\xa4\xd7\xdf\xbd[\x99\x97\x85\x15\xbd+:\xac\xc6" -"\xd4!$\xe4\x12\x64\x30}\x9b\x34\x14\x94\xbd\xec\xb\xe6\xde\x1f\xf8h\xb9\xbewb\xde" -"\x9c\xde\xd1^\x9f/\x8a:\rYoN\x1d\x93\xe0p\xe9\xab,<\xf6\x1\xb9\x45/\xd3\x64\x11\xcf" -"(c\xb1K\xee\xf6\x9an\x99\x10o\x15w\xa9>\x12\xc0\x61{\xcf\x81\xf5?\x8c\xf6\xf2g\xb3" -"W\x15\x1e\xce\x86\x4\x9f\x80p?\x86\xd9Z\xc0\xc8\xd2U\x88\xf1h\x92$\xde\x35\x1fH\x9" -"\xe8\x11\xe0\xca.R\xa0\xeb+<;\xe6\x87\x63_ \xd1\xbb\xba\xff\x41\xce\x8d\x6\x62#\xb0" -"U\x91\x8f\xe8v\xec\x97\xca\x6$\xca\xd9\x1d^\xb8\x8b\xacp\xd7\x5\xc4\xd3\xf5\x31\xd0" -"tgsm\xf6\x1e+~\xd6\xb\xc1[PQJ*\xaf\x36\x6g~\x9d;\xf5sC\x1d\x2\x9\xb9&8\x94\xd4y\xaf" -"\xc\x7\xa5\xe\\\xe5!M\xcf\xa8t\xdd\x88\x7(@rC\x1e\x32\xd3$y\x8c\x85\xe6\xc7\x46\x4" -"\xc4P\xb3\xddj\xe2\x8d\xeb\x33?o7\x9b: \xe1\xc'\xff\xc5N\x11\xaa%H\xc6!\x1c\xd7\x7f" -"\xfa\xf2u\xcf\xb1\xfb\x7f\xd7\xff\x5\x98\x14\xc1#\xca\x62G\xf7\x1a/\xbc\x94\xbc\xaf" -"\x8eQ\xb6\xbf\x90\xb4*n\xda\x9co\xe7\x1c\xf6\xd1\xe9\x42\xbf\x9fqD~\xf4\x8f\xfat" -"\xf2TN\xe4\x5\\\xac{\x82\xf4\xa1\xbc&\xc3Z\xf9\x3\xd2\xc3\xca\x99\\\xb7\x36\xcc\x32" -"Gj4\xdc*e\x97\xb\x2\xbe\x39xY\xd7\xe9\xe0'\x87\xdd\xe3\x14\x9a\x18\xf9\x9d\x9bg\xc6" -"`%~F\x8f\xcd\xe6(\xd0\x1c[\xe\x8f\xf5\xf6\xc8\xba\xb4\xe5\xa2\xe2\xe6\xb3\xa1\xe3" -"&\x9e\xd8\x4\x83\x34!\xb5\xd3\xe7\x97I?e\xe7nDuY\x9e\x32\x8d\x4\xdbTJ\xebY\xb3\x38" -"d\xc3N\x6\xdau\xaf\xf5rF\x1e\x99_g\xcdY\xc5\x96\xbd\xde\xf0\xd1\xb0\x41lf\xb2\"\xad" -"\xa4\x2\xbc\xbQYh;\xb8\x39\xa1^l}_X\x86\x30u\xac\x88\xd9\xd8\x91_\xbc\xa2\xed\xb4" -"\xb5\xfb\x10)\xc1o\xe8\xd4\x93\x43j\xb1\xa0/QL\"&\x3\xc8\xf0\xfeQ\xf9y\xdd\xf2\x14" -"\x0\xfaX\xefl\xe3-\"z\x95\x32\xa0RNI\xa4\xd6\xc6\x93\xeb\x34\xf5s/\x8a\x8f\x7f\xa2" -"\xd3\x1\xb1\xad\x95\xc6:\xecN\x9a;\xa9\x42\xc5\x81\xb6\xf7KO\x0p\xa9\xb4\xf2; 0X" -"t\xd4\xae\xc9g\x4\xbd\x46}wRhU\xfat\x97]\x1c\xd5\xe7\r\x1\x85\xa6\x11\x9f\x11\x18" -"\x95\x94\xe9\xf5\x96\xc6" -"\x6Sp\x1f\x5\xf0\x8d\x12\xda\xc4\xc7\xdaL\x85\x0\xc9\xa9\x5q\xad\x5\xfe\xe.\xa6\xe2" -"\xfdr\xec\xeb\xc0~W\xb5\xd6\x98\x35\x31\x61\xb2\xd1/\xcfG\xf3+U\xf3\xcc?\x1a\"ZV" -"\x8f\x8avlP\xb7\xf7\xc2\xca\x7}\x80\x42\xc1W2l\xbah\xf0i\x1a\xd0\xbc\xb6\xb0\x0\\" -"E\x9e\x9a\xc7j\x8e\xa1$\x11\x65\x8b\x88\xa4;\\\xf4\xaa<\xf4(\xa3<\xf9\x66\xf0R\xf1" -"O\xaa\xe7\x31\x82[k^\x82\x9a`q(\x98\xde\x92L\xa3\xd6R\x14\xb7\xc2\xeb\xd1\xef\x94" -"\x2,l\xe0\xb1\x81\xe6|\r\xdc\xaf\x6\x3ZML^\x1a\x92\xcax\x18\xa6\x7\xf5\x81U\x19\x65" -"\x80\xedx\x14^\xf8\xd6\xbcK\x4\x8b\x87\x43\x17\xba\xb8\xe9\x43\x89\xba\x38\xf6u\x94" -"\xc7\x17\xeeR/\xa7+\xae[;\xae\xf5\xe0\xce\x1d\xd7O\x1c`\x1^\xae\x64J\x99+\x8b\xe9" -"\xaf\x44\xd9\x89\xbc\xae\xcc\xb8\xa3\x43\xbe\xf0`\xb9i\xd4\x43\x8a\x98\xde\xe0\xa9" -"\xf6\x42\x66\x10k\xcbv<\xf2r1\n\xca\x9d\x9c}{\xa1\x41\"\xf\x16\xfa\xcf+5x\xcbg\x0" -"\xc6\xee\x32%\x35T4\xf3'\xbc\x31\x1dh/\x9a\x1e\x18]\xeez\xffi\xa0\xc1\xd0$i\xdal" -"\xeb\xd0\x17y\xb6\x30\xbbm5\x1f\xe0\xb6\x1d\xe5\x43\x84\xa3\xd7\x46\x12\xa0\xbf," -"=\xab\xb\xf0i\xa9\rs\x1e]\xcb\xb8\x66\xf3\x14\x8a\xe2*1\x83\xa9*\xb1\xad\"\x39u\xbd" -"[\x5\x61Q\rb\xf8\x81\xb6(\xef~\xda\x13\xbe\xea\x2\x64\xd3\x9e=\x3\x89%\x3\x89i&\xfc" -"\x81\xcd\x88\x87\x8a\x18\xad\xe0i\xce\xd5i:x\x83\x66z.\x1bH\x16\xac\x86\xcdj\xc6" -"O`\xff\xeb;\xeb\x93\xb7\xc9\x4 \xffK\x8a\xd0\xa1\x80\xf0XO\xbf\r\x45\x1c\xac\xc5" -"\x94\xed\xf\x95\xe0\xb1\xd0O1\x16\xc2\x98\x36\xf9>\xdb\x99\x42\xb6\xd1\xc2\x9b\xbc" -";\xa6\xa8\x9\x98V\x6\xaf\xcb\xdb\xacz\xc3\xfa=I\xb1h\xcf\xcd\n\xf0\xc\xff\xc9l\x99" -"\x95Vv1\x10\xcf\xcbM\xce\xb3\x9\x3\x46\xf\xb8\x33tk\xe3\xf9*~b\x5\xfc\xe0\xce\xd1" -"s\xc9\x30\x8f\x1d\xf5\xe5\xa0\xef\x5\xca\xfd}\xa9g\xde\x31\x95z\x1f\\N\xbfK\x84\xfc" -"\xf6\x1b\x1d\x81u\xba\xe4\x9d\x66OR\n~+qN:\xcb\xbe\x3\xa6\x2\xa0\"\xad\x96\xefp(" -"ky\xe5\xd3\x63\xee{\xc6\xe9\xdcRW\xcc\x7LL\xad\x8a\x1a!\xc'-&\xc2mL\x11\xfe-\xa7" -"M|p9Y\xd8\xbb\x82\xcbo>\xe0\xe3(@\xe9\x95\xcb\x1d\xc5\xa1Q\xef\x8f\x92\x81Zk\xaf" -"\xed\xc3\x99\xc8\xb3\x6\xfc\x16:C\x13\xc5\x8d\x9f)\xb5\xb5\x16\x4\xbe\xc0\x8b\x85" -"\xc5j'K\nE\xc\x89Ij~\x8d\x7\xd3\xeb\xaa\x99\x86\x66\x90\xc8\x8d(\x82\xee\xf4\xb6" -"\x98\xbb\x17\xdd\xce_\xc2\x82%\xb3i\n\xbf\xa1\x1a\xceh]}\x15=\x9`mk\xfb\n\x63\xc3" -"H\xb4\x45\xb1;\xfl\x8a\r\x96w \x94\xf2:\x1e\x80\x97l\xe3\xd3\xc3\xaf\xad\x8i\x0:" -"\xc6.\xfc\xe5;hVr\xe5\xb5\xdd\x3\x43\x9a\xf4\xc5\xb7\xdcY\xd7\xa5u\xff\xafTo\x13" -"\xf0\x14\xeai\x1\x35k\xa3\xac\xb5QL\\\x1c\x4\xd7hf\xf6\x30\x99,@o\xa0\x17\x8\xd1" -"\x1f)1\x99\x97u\xffgU\xa8xK\x81\x1a\xc6\xc5ol\x96\xb9P\xda\x83\xc8\xca\x33\x33\x62" -"\xae\xb0\xd0@\x16\x34]z\x17\x38\xfbi\x99\x96\x39\xf3\xf3\x93\xe4\x33\x12\x8\x65\xac" -"\xc3\x84\x46\x8b,\xae\xf1\xb2\x10\x9\x97O\xfc\x61\x46\x5\x31\x8d\xbb\x42|\\\x96\xe7" -"\xad\"\x34\xeaZ\x9b\xb4\x10R\x0\xbb\xaa\x36\x95\xae\xdc\xb\x64\xe6G9\xe7M\x1e\xe5" -"]\xf5\xbb\xd8\xd6\xb0\xfd\xe9\xee\xf2S\x9fu\x1d\xc7\xc3-\x14W1up/N\xaa~\x9\x0\x95" -"\xb3\x8e\x12\xaa\xde\xf8\xf3\xe3\xda%\xb\x8b\x2\x83^t\x85\x97\xcdR\x97\x9c\xd3mv" -"$\x18\x91+\xb9\xf8M\xdc\xb3\x8a\x7wY\x8c}\xd6$\x13\x94\x9f\xa3\x1f\x84\x65\x7\xcf" -"\xf5\xd5\xfd\xeb&\xac\xe3\x1d\xc7\x8\x62\x8d\xfc\"\xf7\xcc'\x99\x7\xe3\x9bh\xaa\x61" -"oJ\x90U*\xab\xdaU\xceU\x11\xa8@M\xa1\xcd\xe9\xc4\x8d\xfc<\xa9\xb9S\xca\x37\x66\x9b" -">\xb6tY\xc1\x99\xb0\xce\xf0\xd9y,Y}\xfdH\xce\xf6\x18\x9f\x11\x81\x19,\xc4\xdb\x32" -"o\xc1\x90\xc\x10QQo?\x3\x1c\x9b\xba[\xd6\x61\x83\x6\x84\xdeZ\xd2\xd0r\xa9@\xaa\xf9" -"&\xe4\x43I\xd2_F\xb1R.\xda}sP\x14Sm\x83\x99\xb6\xec\x98\xca\xaf\xb7\x99;\xa7y]4\xcf" -"\xc5(\xa6\xe3\xa1O\x8bZt@\xe\x17\\~\xc3\xec=\xe7\xc0\xba\x86\x65\x18\x64\x8a\xa5" -"\xea\xaa\xa7\x8e\x62\xba\x46v\x86\r\xf\xdf\xc7V\xb5x^\x1c\x8eN\xae\x0\x13\x3\xc0" -"\xa8\xac\x17$\x1b%\x9d\x19\x93\x46\xb2\xd3\x46\xe\x65h\xc6\xe7\x31\x9cG\xf2\x45\xd1" -"\x9dr\x15\x44\x8a}/\"\x2\xach`\\\xbd\x99\x98$\r\xf6\xcf\x18I\xe6\xb9\x96\xdb+\xba" -"\xef\x97Y\x93m4\xec\xcf\x14\xee/\xf0\x44;\x4\x65\xc3\x8b\x88\x34\x99\x42'\xfd{\xc1" -"\xfd;7\x80\xd6\x9bJ\xdf\x31k\x99/\xa7<\xfb\x8fX\xd5\xb3\x91\xa5\xd2\xdf\x7|R{a]w" -"\xb4\xe3\x14\x98\xca\xc8\xbb\x61\x91\x4@F\xfc\xce\"\xe4\x95y\x9c\xe1\xce\x32\xe5" -"\xc6\xc0\x43\xc4|\xeb\x61\xe\x9c\xfb\xe4\x8a\xd1\x84\x2-K\x8\x1/\xaf\xe9`\xd2\xf8" -"\x89\x1\x8a\xa4\xc9\x13SWe\x1Y\x16\xbf\xed/\xb8,<52\xbd\\\xac\xe1\xe\x8f\xae\x8a" -")gI\r\x8e\xdas\xfa\x30\xe2\xf1\x9d\xdc\x1g\xff\xe4\xe0\x12\xc7\xb1\x9f\x1b\x1b\xe5" -"T\xd3Q\x9\xae\xe9m=\xc3-\xe5\xf7z\xbe\x35\xb2\xd6uH;\xc6\x8a\xb1\x1e\xc6y\r\xa9\xa6" -"Ej%,Jh8\x0j<\x11j\x18M?\xbd\x5\xaf\xd1\x8d\xf5o1\xb4\x37\x9f=\x8b\x41v\x8a\xa8\x15" -"9l1\xaaG\xf8M\xae~J\xc9\xc4\x1\x15P\xa8n\n\xfa\x1\xaf\xb0!\x90\x41\x19\xb2\xbdL\xa9" -"\xdeY\xf0\x83>\x91\xd0\xf8\xcf\x89\xf4R\xcf\x17\xd3\x31$1wW\xca!\x8\x93\xd4\xea~" -"\x93\xa2Q\xd3\r\xafxw\xf9\xb2t\xc&\x9e\x84O\xff\x85\xf2\x13\x1a\x87\xc5\x9b\xa4~" -"\\x_\x1\x1e\x8d \x1ckS\xf3\x18\x9e\x89\xab!n7VP\x93\x46\x12\x8e\xba\xaf\x8\x93\x92" -"\xbc\xbe\xb9\x82\x9b\x34\x18\x8bY\xcc*\xb2\x1f Gx\"mplT\xab\x61G\x98\xbc\xfc\xd4" -"\xee\xbb\xf0r\xc0\xb\xa2\xfa}:!&&A)@86;\xc0\x1a\x8fh\x96\x95\x9e\xdb\x9a\xad\xd8" -"F\xe1:\xfb\xf5+\x8d\x31\xb1\xce\x37\xf5\nt\x1aX\xc2\xe3x\x1c\x6\xc0\x14\xf2\xd2\xd9" -"\xa3\x9eY\xbf*e\xa3T\xc0\xdc\x14$'\xef\x4\x35\xfe\xbb\xe\xb3\x80\xb1v`\xc\x94\xfe" -"\xcf@P\x14\x97%\xee\xe8;\r\xa1\xdf\xe8|\xcf_\xa0\xc9H\xb9\x2;\xea\xd0L\xf2\n\xf4" -"\x91\xce\x10\xc5\x65?W\x12\x66<\xecg\x17\x9a\x97(\xa5\xc7\xae\x19\xc3\xd1\x9\x9\xc2" -"\x1e\x85`\r\xcb{\xe3\x18\x38\xf1\xab\xf8\x83\"*\x85\x96\xb5\xb2\x95\x11\xcf\xdbH" -"\x4\xde\x8b\xc8\xdb\x1\x85\x93\x9f\xc0\xd4\xd4\x65[\xbb!\xca\xea\x44\xea\x88(\xfb" -"}\xca\x15 \x14r\x93\xdd\x61\x1f<\xe6\x9b\xca(\xf8K\x7\xe1\xbd\x82\xfc\n\x12\x36\xde" -"}`7\xea\xdc\xdf}\xb5Og\xb\x84\x5.\x9f\x94\x89\x83\x1f\x5o\x82\x39\x95(\x12\xefv\xf5" -"+(\xa2\x4\x10\x91H\xf6\xd2\xfe'\xe7R\x13\xe3\xb9l\xe2\x88\xc5\xb2Hma\xbe\xd3\\*\x95" -"\xb6M\xc \xbaYC.\x0\xa1\xf7\x45\x63\xfa\xf8\x31\xb1P\xe9n\xeb\xab\x82\xc0\xfbN\xf0" -"\x7\xeb\xb8h\xda\xf4\xeb\xb2\x81\x8e,\xc\x89\x82\xcf\x88\xa5\x17\xfeo\x9cT\x99\xd8" -"e'\x95\xe1\xe6\x84\xcd\x9c\x7fsv\xffG\x15*q" -"\x5\xf9\x42\xdc\x1c\xd1\xaa\xa3-\xf5s`/\xb6\xae\x19\xaf\xbd\xea\xfe" -"\xbe\xd8'\x8d\xa2\xc\x8b\xc5\xdf\rL\xb2\xb5JN\xc5\xec\xfe\xbd_\xfc\x8d\x9d\x95\xfb" -"\xb4j\x1bK\xb5s\x80\x1dxe\x4\x65\x39\x19\xc9'\xc3\x12\xb2\x66\xff\xe0\xacj3p\xec" -"\xf3\x90:\xd1\xd4\x10\xf6\xb4W\xc9\x65\x32\xcf\xac\xae\xbb\x94p\xf1\xb0\xafy:\xf5" -"\xa6\xbe\x91\x17}\xa6 \xa3\xb1\x45\x8e\xa9\rhB\xa2\x14}\xa3\xd5\x7f\xbb\x15?e8\x4" -"'\x84\xa0\x35\xcb\xc1z\xe\x7m\xaf\x98\xe3\xd4\xfc\x14\x43\xa8\xfb\x1TZ\xc0\xb5M\xa6" -" 2I\x9boq\xc6/\x10\xc9\xda\x9f\x38o\xcf\xce\xad\xe6i\xd0\xb8\xd1\xaf\x2\xe0\xddV" -"\xb7rM\xca{\xb1\xa0\\\x63\xd8{=\x3\x19\xc4\xcd\xa6x\xd6$\xe4\x4\xd1]\xc6\x9e`P\xcb" -"\x19\xda\x8f\xdf\xea\xbb=\x96\x42\xb2\x16\x87\x8aS\x93v\xc5\x46\xf6)`\x8a\x38\xb9" -"\x80\x66\xd4\x82\xf9\x15:\x1c\xf9\xf0\x9f\xd9!\xc4]\xbe\x46\x7w\x8\xce\xb1\xcb\xd2" -"\xc8]\x8\x34\x8fj:,\x87h\xcc:\xf9\xa0\xc1\xd6\xbdk&}\xbf\x19\xb0&u\xc\xfb\x8a\xd1" -"\x96\xab\xd3\x9f\xf2\x95\xban\x8G\xb0&\x92\x1c\x86\x9\x8b\x1d\xbaq\xe1\xcdl\xf2[" -"\xde\x9e\x44\xe5\x9e\xa0:\xb6\x93N\x9aNa\x10.\xff\xc0\x1cs\xc2\x8dpN2krT\xba\xf;" -"6\x1d\x8\x15\x12\xeb\xbf\x89m\x8d\x14\x9b\xc0\xab\x88\xd4\x0\xa9\xa7\xcd\x1e{y\x9e" -"\xc6;\x8f\xd9O\xf5P\x7f\x93\\\xef\xe1\xde\x64\xb5\x87\x1\xf3\xdc\x34S&\xb3\x66\xc1" -"'/\xbd\xea\xf2|F\xf8z\xbe\xa0n\x17R\xd0\x9d\xe\xba\x43\x43\xf1\x8c\xe2\xe4\x84*!" -":\xbf?\xd1\x44\xc3\x85_\x3\xfb\x90\"\x94_+\x9\x90*\xfe\x13Q\xd4\xbf_\x7f\x13\xe4" -"\x90\x6 \xfe\xd6,\xfe\x37\xa2\xdf\x1c^\xed\x6\x6\x7f\x1\xa2 r0\x80Yw1\x94\xce |\r" -"^PcJK\xf7\x1d\xe\xb3\xd9\x1c\xd2\xe9\xcb\x17\x61M\n\x1a\xe9\x19\xba\xbd[X5\xc0\xa8" -"\xe0\xa5\x1a\xbf}l\xed\xb8\xb5\xd3@P\xc0\xc9\x94\xd2\xfa\x8fN\xc8\xe\xba`\xb5<\xae" -"\xce\x14\xa5\xcb\"\xc8\x66[\xa4\x65l\x87\xba\xc1-\x1d\x9c\x92\xa2u\x8e=\x83j\xf4" -"\x15\xcd\x15\x16}\"n\xc0\xc1\xe3\x92i\xec\x7\x16\x8aHF\x9c\x15\xc9n\xe4\x80\xb\xc0" -"\xd4\xc6\x34\xd6\xb8\xf9\x7\x9\x44\xc\xe0\x35z\xde\xe5\x98\x8c\xefW\xc9\xb9\x8d\x45\x6\xc9\x83" -"5\xab=.\xe3\xb1\xd9\x16\xe9\xeb\xf6\xf6h\x0>1\x96\xa1\xb0\x1fh\xfb\xf-\xa6\x17\x64" -"\xcf^\x13\x1c\xe6\x93\x8f\x44W*\xdc\xe9iX[y\xb\xd3x\xff!\xe5sY\xadr\xa5\xb7\x83]" -"ZX)8_\xe5\xb1\xdf\xfe\x7fT\xaf\xa3\xf8h8\x14\x82<\xb3[L\xa3(b5\xc\xbcQ[br}\x0\x99" -"\xc1\x66\xd1\xf2;\xe1\xc2\xa8\x8f\x61}\xb4\x61\xc1\xa2\x46\x98$\xdf\xf9\x7f\x45v" -"\xd8\xd1\xdc\x16\xe3\x12\x9e\xc1\xbd\x13~:\x87'S\xcc\xdb<.\xfe'\xe9@\x92\xf~\xb2" -"N\xc8\x3\xc9\x9c\xc\xb1\xda\x7f\x18\x43\x18k\xde\x80\x32=\xe5\xe4VT\xc8',\x94\xf" -"D01w\x1c\xab\x84\x13\xd1&a\xbak\x9f\xcf\xc9\x96\xca\xa0\xbe\xd0\x17\xd9m\xaa\x87" -"\x80\x65\x81\"\x9a\x37\x46\x8a\xf3i\x0\x85\xd9\x86\x0\x88\xe2\xcf\xa1\xf7\x63M~\xd6" -"\xf1\x1a\xe6\x85\xf1\x93\x91qh\xc2\x63\xe4\x97\xaaX\xec\xf0\xd7\xa4V\xc2\x38>z\x18" -"\x15\xabOC\x97/\xf9WFf\xb3\x1\xfe\xec\x1c.]K,\xba\xfd\x43\xed\xbbu\xadv?\x3\xf9x" -"I\xe0\xbR\xfb\xd4\xf1\\\xa3\x38\x2O\xf8\x1e\x95\xcf\x9a\xe8/ce\x10\xaa\x13\xf7S\xd1" -"\xe\x1d]\x11\xbdZ1\xdf\x11\xd9\xb\xb9h\x13\xe9\x6;#\x8c\xd6Iy?\x15\xaamu\xb7Z\xd0" -"-\xc3\xb5\x6\xc4\xf3\x9a'\xcc\x83RZ\xdf\x39\x38Z\"N\x1esc3u\x9cJ9i\xd0\xfc\x9e\x41" -"=\xff\xed>\xe1\xe7!m\x98\xdf\x1cng\xc0\x42 \x99@\xf8\xb7\x86\xfe\x9\xa9\"v\xd9\xce" -"\x14\xd2\xc6\\>9\xa7\xfd\xb7\x18\x31\x9b\x11\x1f\x5\x13\xa8`\xee\x8e\x34\x3\xf7Q" -"\x16\x35\x93\xc0_?\x8b\r\xc4\xee\x7f\xa4\xfek'\xf1\x85\xed\x65VD\xff\xa2\xaa\x91" -"\xb4\x36\xa7\x46|2\xd1\x63+\xb+\n\xb1Z\x87/h\x19\xa3\xf8\x9dy-\xa8\xaaT,\xf7Y\x90" -"a\xc8\xb3\xd6\x9am\xda \xe1\x4\xb0\x80\xc\x18\xb1\xd2r$\x9eX\x84\x15\x41o\x3\xd7" -"\x8bR[%b\x91\xc9\xb\xee(\xe0m\x6;e\xb2j\x95\xc3\x3\xf8\x64\xe7)\x9c\x1fQ\xba\x84" -"\xebJ\xaf\xd1(\xe4\x87zTJ\x14j\xde\xa4\xa2\x30\x43G\xce\x9c\x90\xefl\x92{ee\x7f\xac" -"\xca\xdfx\xb1H\xd3'\r\xd6\x64\x8f\xe0\x10\"\xa6\x8a\xb1q\x81Z\x8d\xf0\xcf\xd5\x43" -"A;vq\x7Ox\xe5\x9a\x64\xd7\x99Qr\x9\xb3L\x9c\x14\x1d\xd8Q1\xf1\x64\xa9O\x84kMF\x13" -"\xc6\x1f\r\xe3\x1f(\xbd\xdbv\x84\xf9*Kt&-w)\xd1\x66\xc9\x99\xf2\xa0\xc7lM\xfc\x43" -"4c+i)\xd0o\x8Y[\xfb\x45\xfe`u\x1f\x8f\xc5\xde\xe3\xf3\x31xSaG;.\x0P\x97\xe6\x1dy" -"&\x3\xd9^|\xb7\xd5\x66\xed\x89$\x9e\xfd\xcb\xcb\xb7!\x1c\x9a\x36\xb9\x87\x99\xc9" -"*\x11\x9d\xe1\x96\x8bg\xb9\xbe\xb8m\x82\x1bN\x16*\xd6\xb7\x81\xd2\xc1\xe]J>\xe0\xcb" -"\xfcZ\xc3~\xa6\x14\xc9\xb7\x9c\xe\x9f\xe9\x82\x46\xeeO\x87\x99\xd3]SY\x12\xbf\x92" -"V\xb\xfb\xc4x3\xd6\x8_@|\x13\xa3\x8\xc0\xc5\xbcVt\xaby\x19\xc2z\xbd\xf4\\\x9b\x46" -"K\x9d\xa1\xd9\x91\x93\x1c\xd9\x95\xea\x94\x8f\xb4\x95\xb\x66\xbe\\G\xe1\x9bS_~\xc4" -"\x19\xf1J%P\x12\x18\x94\xb9\xd2\x80\xc4\xf1\xff\xb2\xfb\x1a\xcal\xc3\x91\x39\xb2" -"\x3\xe\x8fH\xc2.(\xf5>\x4\xab\xb3\x1c\n:rt\x8dy\x8cZ\x8e\xc6\xac\xf1\x6\x11z\xb\xee" -"\x9aL\xe1\x85\xcd\x30\xb\x44\xe1\x9b\xc2\\\x37\x96\xeb\xcc\x83VNf\xe5W\xa3\xbf\xac" -"M\xd9\xaa\xd7%\xdf\xeb\x63%W\x8b;\x1a\x85|p\x98o\xd4\xe2p,\xc3\x43Ni\x81\xd3\xcc" -"\x15\xcf\x18\x89\x11N\xfb\xce+\xba\x6!\xc7\xactx\x99\x1e\x86\x88\x1e\xe\x83O\xe0" -"\xa9QU\x1c{Y\xden\xcf\x14\x1nIhD\x18I<>\x2z\n\x2\xc9\x34p\x9c\x64\xb6&B5\xf1\xf6" -"\xb3\x8d\xc3\xf2/[\xa2\xb9\xca\x7f\x93\xd0\xf5\xa4\xd3!\xf5\x9f{\x19\xcf-\r&\xa7" -"\xde\xdao\xe0\x33\xe9\x5\xfay\x99\xb5\xd7V\xa6\xe\x62sp\x85%\x36\xe\xc9\x12\xb9\xdf" -"\x1d\xcc\xfa,E\xb2\x10\x9cG\xa1\xbb\xa8/\n%\xf4*\xb9\xeb\x8a\x6\xf5\x85\xe3\xfd\x12" -"o\x8e\xe2\xa5_6\x1b\xff^m\xa4\xdd\x83`0\xf6\xf\xe2\x43\xce\x63x\xa2\xc\xe9\xda\xe2" -"\xde-cf\xec}\xbd\x41'\x2\xee\xe1\x1d\x94\x5<\x8a\x19vE\xf\xda\xe1\x31\xaf\xb8\x18" -"\xcfn\xb6q\x9f\xc2\xd7\xc8\xd2U\x88\xf1h\x92!\xb3\xaa\xc1\xce=}\x9e\xc4\xb7\x65\xbd" -"\x8c\xbdM\xe8\x66\xec}\x92]<\\\xe1:\xff\x9e\x14Rk\x19\xe4\xec\x15T\"\x82\x13\xfb" -"\xe0\xac\x14\xd1\xc5\xca\x1f\xee\xcf\xea\xc2\x32W\xbe\xab\x9b\"+\xf9k\xa3\x98g+\xd9" -"\x9c\x91@_\x87\xe8\xd6\x9t\xbe\xf5\xc8t3Q\xdc\x66\x98\xbb\xec\xd9\xceQ\xb2\xc7\x9a" -")\xf5y\xc8\x0Y\x84\xe5\x98\xc9\xc3Nt\xdd\xf7\xa6\xa7(\xf\x66\x88\xda\x93\xe5v\xa1" -"Wy\xd5\xe0 y\x5\x34\xd6\xb0 x\x91\x8c\x66Vs\xc1\xce\x11O\xd0O\x0\x11\xcb\x92Xk\x18N\x12\x93\xf5" -"\xe2\xb6\xe\xd7\x97r\x17\xf3l!5W^X-\xb2~l\x1aU\x8a \xa1pb\xaa%*`;>\x95\xeb\x85\x9a" -"\xd7Pg\xdc\xd9q)b|\xdc\xbb\x1b>*\xbf\x1e\x45\xf1\x97\xd3\xed\xab\x16\xedz\x1\xea" -"L\xb7'\xf3\xa7\xdd\x94\x30i\xb9\xd6\xf6\x42\r\x7f\xda\xf\xc\x7Mp\x83S2\x1f\x15\x46" -"\xdf^\xf9\xc8\x43\x85\xecpN\xb7\xe4}\x99\xae\xcev\x8bJ\x82\x46\xa5\xa1\x8d\xe6P4" -"\xd0\xcc\xb7\x61\xdd\xac_F}6\xa0\x1\x43\xd8\xb6\x33\xb5\xd9\xa8\x5\xbb\x87z\xc\xdc" -"|\xad\x1e\x1d\x37\xaf\x98t\x8a\x6\x62\xb4\x9a\xbe\xe?|\x9fJ9\x95\xce\x61\x37+c\x9c" -"\x8\x84\x91\x44\xee\xec\x64\x39\xd7\xad\x8\xe0\xec\xaa#\xf8\xf3\x8b`\x9e\xb\x30h" -"z\"\x9d\xaa\xc0\xa9\x95\x10\x42\x14\xb8n\x9f?G\xc6]V\xbc\x6(`9\xe7PB\xd5\x10\x7\xf" -"\xa5\xe1\x39\x93\xd5\x14\x1e\x65v\xa6\xd1\xev8\xee\x1p\xf1\x85\xd8\x12V\x99@(Us\x5" -"\xaa\xf3@\x1b\xaa\xba\xa9=\x8fh?7\xe8&C\x13t\xcb\x90l|G\xbc@\xceQ\x18\xe2m\x94\x8b" -"\x9\xba\x8\xe0G\xbf\x1K\xbe\xafL\xbaQx\x1f\x64!j\xc0\x98]#I\x85\x82\xdf\xd2\x0\x38" -"N\xc6#\xfnda\x14w\xcd\xcc\xab\x97Q\xfb+\xa9\xe\xaa\x9\x30\x7x\xea\x35J\xf4\xc3J\xc3" -"g\x3h)\x9a\x17\x32\xd9\xb5W\xf4\x88\x18\xddv\xa3\xf2\xe\xf4\xce\x62>\xd6\xb1\x1e" -"\xcd&\xa0\x61\x3\xb4\xaa\xe5\xf3\xd6t\xad\xac\x9fn\xb1\xffV?\xf4z\xebU\xe0t\xe0." -"y\xd6\xf0\n>4\xb0\xac\x1a\xb5\x92\xc6; ZWC\x8f\x46\x92\x9a\x17\x9\xc8\xad\xa3=\x97" -"\x1a\xd0\x9b\xb3@\xda\xda\xb0wrO \xb3\xa9\x42\xa4\\\x17\x94\x1e\xbd\xdb\xa2\xaf\x88" -"\x98L\x14/%\x11hi\xfc\xba~@RY\xe6\x81\xaf`\xd6\x7\xe\xd5KwR1\x9b\x9c\x8d\xaa\x85" -"\xe8\xa9\xb1\x66\x4\xe5o&vj\xbc+\xaf\xe7{\xe2mN:]\x9b\x15\x8c(\xd9\x1aPo\xd7\xa7" -"\x95\x86\x9b\xb9\x9\x1e\xf2p\x9f\xc6Y\xe1q\xb0\xbc\xe\x1c\x62\xf8\x13\xea\"\xaa\x11" -"\xa4\x89\xb8z\xb5\xad\x63\xdc\x39\xf4\xe5\xc4\x94\xf7\x80\xeeK\x8b\x11\x6\xd9\xe4" -".\x1b\xd3\x98\x84\xb6'\x8c\xac:\x93\x19\xc5\x61/=\xbf\x84t=\x86q\xa2\n\x0\xc2\x3\xe3T\xfc" -"+\x14\x37\x5\xec\x32&\x8b\x13L\xd3\xed\x66\x83\xb9Z/w\xec>\x4\x9d'\xe7\x7f\xb5\x96" -"\xa8\rn\xaa\xd8\x61k\xc5\x97\x14\x1a\xda\xccv\x96\xf9\xca}C\x93_!\xce\xf0\x91~\x1c" -"\xc0\x15\x0\xd4$\xc3\x38\x19vBP+\xd8\x61\xfe\xa7v6\x90\x98r\xfb$\xd3\xae\x32O\xaa" -"\x94\xf2\xc4\x1c\xf5|\xb3V\xa8l\xec\xd2tr\xceSN\r\xb9QQu\x9a\xbdu\x85\x17\xdbG{\x11" -"\x97\x46\xfb\x14`\x94\x98.\xe7Q\xda\x35\xc8\x88(\xf1\x8d\xde=\xdbL\x8ar\x16\xc3\x7f" -"\xa2}<\xae\xfv\xe2\x19?\xc8yq\xe6-\xe8}\xa1O\x96\x80\xb0z\xb8!Y\xc3\xf2\xbd\xfa\x43" -"\xd3\xb3\xbc\xd9\x36\x32\x8f\xed\xb5\xc7\xc8\x93\x97,M\xa1\xb0\x98\x1a\xfe`\xc3*" -"c\xcc\x8,C\xaa']\xbe\xb3\xbb\x87j\xe\x90\x1\x0\x7f\xfa\x85\x14\x30\xcb\xb7\xe/(\xa1" -"\xe2\x96\x41\xc5:\x94\xc4Qt\x4\xcb\xa8\x8b\xf5zL\x96\xd2\x12\xb7\n\xd8\xa9\x7\xdf" -"\xe8\xa4G\x84>\xf&\xeb\xed\x8do\xc8\n\x5\xe2\xca\xd6\xd4\x45\xc5\xf\x35o\xf1\xd4" -"1\xab\x8c%H\x8f\xb7\x7%o\xb5\xcfp\x83\x80\xdfv\x85\xe6?qJT<\xd8\xff\x8d\xa4\x1\x87" -"\x85\xccM\xb0\x14\xc7\x14kJ\x81\xcf\xdd?U\xae\x45\x36xi\xc2\xfa\xef\xf9\xb4\xfe\xeb" -"Y\xca\xfd\xb4]k\xc4\x44\x17\xe8\xcb\x8e\xd7,MF\x8fh\xcb\xfd\x7f\xb3\xf7{\x81+\x5" -">\xe8\xc5\x8b\xf1w]a\x11X\xd7\xcb\x16\xdb\x43\x30~v\xc1>\xd3vU\xf4X\x9a\x30\xcd\x36" -"E3^\xa6\xee\xe\x87\x2`J\xe0]\xac\xe3\xc8%\x39\xf\x7\xd7o\xadx(\xe5\xe2\x3\xf3\xa3" -"\xa8O#\xa2G\x82\x12\xa4\x32\xae\x10\xe4\x9d\x19'\x7\xb1\xbaj/-\x2_\x99\xdb)\x19\x92" -"7\xb9\x8d\xa4\x2\xc4\x2\x92\xc9^!LGuX\xecH7\xe\xabN\x18J\x12: )\xa6\xc4\xdb\xf7\xf7" -"\x10\x98\x8\x1f\x33w\x16\xa9\xda{k\x91\x35\xe\x36\xd5\x10 \xdb\xbc\xc7\x62\xf2\xbc" -"\x93\xf\x95+\xd5g\xd5i)\xa5Q\xb8\x80y\x15\xeaz\xf1^\x92\xaa@BX\x12\xc5\xc5u\xd0\x9c" -"\xe2\xd3\xa9pk\xa7\xf3\x42\xad\xa8P\x1b\x88\xfe\x9cpM\x8f\\Z\x9\x6\xa7p\xf8%\xe0" -"i\xbdu\x3={\xbe\xcd\xbe\xd4\x8-\x1d\x82\x9e+N\xa7KUY\xf4\xf1Uf\xac)N\x18#-\xce\x1b" -"S4\xde>zQ\x90\xbe\xa3\x93L\xa5T\xa3\x9d,]P\xcaV\xb9j\x92\xb1\x4\xd2\xb6S\xb9:\xf7" -"hfh\xa2\xd6\x11\x9f'\x18V\xbb\x2\xf9H\x1d\xaf\xc1P*\x19\xe0\xbd\x11:\xff\x3\xab\xa0" -"O\xbe]\xb5\xf2\xbd\x66rjT\xbf\x5\xad\x37\xcfs\xb3\xa7\xc8\\]\x14\x83\x34\x8a\xaa" -"\xafRg96\x9\xef\x1d\xc1\x0\x9c\x1e\x9d(D\xaa\xf2|\xd5rl\x96\x8c\x33w)\xbb\x91\xa8" -"e\xa7\x34\xb1\x12\x30U\x12\xe2\xa4`b\xb\x8e\xd0\x37\xa7\xbf\xb7\xcd$\x0\x64\\\xd0" -"\xad\xf8\x9a\x99\x42\x7f\xba\x1b\xaa\xa1\x9a\x8d\xc2\xe5\xa2\xa5\x7\xaf\xae\xa4\x96" -"\x80\x11~HV\xdbx6\xd1\xd5\x82\xe8\x80\x63w\xb0\x17\xd1\xbb#Luw\x8\xcO\x83 \x9f\x1f" -"\xcd\xe1\xbd\xb9\x0\xbxhFN\xf0K\x9c\x18\x14\x1c\x7f\x64\x97\xc5_V\x12L\xb6\x9e\xd9" -"\xef\xf9\x32IY\xb4\x66\x61\xfa\x89\x18\x84\xa2?^\x19\x6\xa2\x93\xb\x43NE\xd2Y_\xaa" -"\x9e\xc7\x7f\xc8\xc4\x98\xc1\xcd\xdc\x41\xae\xfd\x44\x9a\x94x\xc7\xc1\xa1\xd1[R7" -"\x1c\xc5\x33\x1\x61j\x89wAT17\x9d\xad`\xce\xf7H\xe7\xc0\xf0Y[\x7 9B\x86\x11\x9c\xe3" -"\xac\xc1\xc0\xa3\xfb\x8b;\xb4%\xb2}&(\xe6}\xee\x3^\xf7R+J\xd6\x81\xe4\xb4\x36\xbd" -"$B\xe2\x43\x7f{O\xe8\xc5(\xad\xec\x8\xde\x14$\xd2\x42\x9\x10,~\xa7\n\x9bZdt\x81\xd3" -"\x84\x2th\x9a\x9cnE\xb1\x36y\xa3:\x3&\xd7\xaf\xab\x31\xd8\x1\xe9\x16\x8dI\xb6\xc" -"\xa4\xa2q\x16\x8h\x93\xd9\x83\xb7\x81\x0\x16\x13\x84W\xa7,&\xa7|\x4\x9a\x82\xa9\xb5" -",\xab=[\xcaOZhKow\x86\x84\x35\xf8\xad\x9\xdd$\xf6\xf9\x10%QI\x8a\x8dMD8\xeaP\xfc" -"8Y\xc0\xcc\xd7\x4\x43\xe2-\xbe\xec\xc]\xdc\xbf\x32\x12\x30\x12\xc2\x12<`\x1dW\xf7" -"R|\xfb\x15\xf9\x6\xb1X`\x82\x8d`\xcc\x8c\xc\x17\x92\x12\xe6\xe7\x86i\xce\x32\xa8\xc\xf0\xb4" -"\xeb\x92\x43?:\xc8#Q:\xda\xafhH\xee\xac\xd2\xb6\xea\x9b\xf9\x13r\x1d\x19\x9f/\xb6" -"\xfd\x85\xc2\r\xd3\xa2\xf5\xedx6==\x0\x4\x5{\xf9\xdc<\xfd+\xf8\x82\xe5\x9c\xdfn\xd7" -"\xf4\x82\xf6sp\xbf\x2\x33\x2N\x18\x16\xaa\x39\xd6\x3]\x86\x18\xe3\x43\x9a\x17xJ\xb2" -"\xf2\xb4\xbc\x86\x84\xc2-W\xeb\xc7\xfbO<\x9f\xfc\x80#\xac\xf6O.\xce\x90\xe8V1!\xef" -"F\x92\xc9.7\x4IB\xe4\x8dwj\x1fV\x9d\xbf\x5\xa4>]F\x8cJ\xda|\xa6\xec\xec\xbe\xehQ" -"\xd9\x7\xd1PUS\xf1\x1a\xb7\x8d\x17\x8b?\xe8\xaa}|\\\xfd\xf2\x87r\x0\x9o\xf0!@\xae" -"\xa9?\xcf\x1ah\xb2\xe0\xa0/b\xcc\xb1S\x8c]\x6\x66\x13\x88\x9\x1\xc6`\x86`\xad\xb1" -"X]u\xba\xce\x2wY\xdcri/\x8\xf0n\x9\x9a\xb8;\xad\xb2\xddUG\xf6\xe5nr\x86P:\x18\x5" -"\xb8\xd4T\x86\xfc\xf8\x2\x87\xa9\x84\xaf\xe3\xcc\xd5~\xe1\xa5\x1e\xc8--F0\x13\xe8" -"\x99U\xbe:G\xcdn\x8\x8aH\x92.\x12\x1a\x92\x94\xb4o\xd8\xdf\xd5\xc6\x66\x8c`\xe4~" -"\xd8\x84\x0\x14|\xd1\xb\xc6Sl\x8e\x7fIp\xb1\x62\xed\x19!@}3\\D\x1c$]\xcf\xc3\xaf" -"\xb7j\x9a\x63J\x87\x42\x97\"`\xd9\xa9\xef*\x95\xb7\xd9\xc4+\x16\x35V\x8`\xca\xff" -"\xe7\x65\xcc\xc3\x9ezC*\xbd\xb2\x19\x1\"\xa0\x31\xf0,-~\xcc\xfb\x31\xccM\x94\xea" -"\x9c\xffm\xab\xb3\x63\xbc\x8d\xcf\xc8jV\xc5l\x0\x90{\xb5\xc3\x8d\xf\xf5!\x95\x46" -"\x93\x90\x19\xd7\xe7>E \xfb\xa7\xf6\xed\xed\xe2\x1e\x8b\xf9h\x3\x9b+\x11\x9d\xa8" -"\x9f\xcc\x1e\xc6\xebV\x9c=\xf4@f\x16\x94\xc4\x81\xf0\x8f:\xb5\x83o\xc4\xa8\x8cG4" -"\xad_S\xc8Zl\x9cP\xe4\xac<\x99\x7\xbb{h0J2Vw\xc4\xc9l\\\x7YRd\xee\xb6\x63]\x7f\x14" -"<\x82\xf4\xe2^\xdaUm\xc2\x16\x8c\x19\x5\x6\xc6)PiH-U`\xa8^\xfe\x9f\xf1t<5zJ *41\xe8" -"Ma\xad=\xfa\xa9uwtLS\xb8\xda`\x7f\xb2\xdf\x10\xde\xe\x41\x85M\xcc\xc4\xfM5\xf1xm" -"\xee\xe5\x18l\x94\xbc\x37\x1\x9e\" L\x6\x95\xcf\x9a\xd5M6~_&\xd9\xff\xf8J\xbe\x45" -"\x85\xde\xa9\x41\xeT\xab\x64\x9`.\xfb\xa2\xb9hz\xe9\x9b\x82\xba\xed4\xedK\xa3\xf4\xb5J\x8b\xc1\x84\x1f~\xa0\xc2\xf5\xd3Q#d\xd2L\x9\xc8" -"\xb5\xb1\xd0*\x8d\xbf\xea\xb7{apvGP\x98\xfd\x89\x9d\xf4\x34!\xee\x9eqv\xe6wVuZ\xa9" -"s\"\x1d(\xc8\xacR+;\xd5\xdf\x1d~\xbfoENJ\xe9\x12\x13\xe8\x99\x64`\x4\xcf\xe\x14\x93" -"\x88t.\xa9\xf2\x8eL}R\xfc\xa4\xc1\xf5%\xf0\x4\xbP!u\xda\xfe|\xbf\xb\xd3\xf3\x36\x8b" -"\xf8\x39\xc4\xf6O\xd5hW\xfe\x5\xc}\r\x88=A\xdd\xbd\xa6\x8c\x91\x0\xfa_\xf0\x93\xae" -"\xec\xa4\xf7\x1c\x93I}\xc2\xe2\xfb-sN\xa2R|\x9f\x5\xd8I42\xaa\x9a\xe0\x45i\xd3\xfe" -"\xc8\x46\x35t\x19\xff\x1d\x1f\x1e\x34\x33\xcb\x32v\xfc\xb7\xcf`\xde\xc6\xbe\x62\xbd" -"\xcb\xa8N\xf1\xe7\x1c\xa7\x42M\x97.\x95\xb2\x1c\xf9\xea\x37\xd5\xe5\xb1\x81\rp!\x88" -"\xf3\x14\xe\x95R\x88r\x8c\xc7@\xbb\x8f\x43r\xed\x81\x87\xdd\x13\x8b\xe4\xa7\x1d\x9a" -"\xdd/h\xa7_\xf2\xaa\x16\xf2\x8b\xf4\xa6@Q\x0\xdc\xb9h\xc\xfc\x34\x30\xad#\x8=&_)" -"0L\xe2\xaaH\xc6\xad#\x8f\x97`9\xcb\x8c}S\x88\x17\x94hg\x12\xc3\x1fw\xc0r\x93\x9c" -"\xf0\xf5\"O\xc7\xa2\xcc\x16\xb5\xaa\xa1\xaf\xf3\xbf\x37\x8\x90\xeb*\x1d\xb1\x66\xa7" -"\x9c\xa9\x1b\xcd>\xd8\xea\x0\x8a\xaa\x91\x3v\x92\x19\xcd\xaa\x19\xb5\xa2\x34\xea" -"B\x97|\xdd\"\xe\xe8\x10\xe8\xd8Y\xe9\x92\xe6\xe1\xceI\x1fG_\xe0\x15\x38\x9c\x9d\x16" -"\x7f\x19\xd1\x43 \xc4#\xe3\xfdr\x8e\x33M\xd5J\x1a\x9cLF\x85\x63.\xea\xcc\xba\x1f" -"\x1b\x99\xf9'\x83%\xd7\xce\x35\x9bo\xb8m\\d\xf3\x81\x15Z\xca\xb8\x86\x62zP\x5o\xd5" -"\xcd\r\xaa\x1b\xca\xda\xe2}\xa9\xd5\\!FqI\x97s\xb0xc\xd8\n\x18\xfc\x41\x0\x9f\x86" -"m\x81\xd9\xb5\x8b\xd2$\xf3\x1f\xdb\x7f\x10\xa6j\xf4R\xd8\xb8h\x9b\r\xb4\x8b\xf7\xe9" -"Y\xe9\xc9\xdf>0je\xeu\xb\xfa\xef\x43\xb4\xd4\x66\x66\xcc\xfa\xe5\x8c\xe0\x85\x16" -"\x13\x13H\xd3\xd7\x8e\xde\xad\xbf\xe2_\x91<\x7N\xea\xeb\xe3\x90i\xe\x63\x96\x0g\x97\xae\xf3" -"\xc5\xc8U\x1b\xe8\xb0\x8bV\xc9\x11W\xa2\xae\x33o{\xd3\x9a(|\r\xcc~\xe9\xb3\x34\x96" -"\x8c\x5\x1c+\x9\x1d\xbe\x2\x9c\xec\xb9\x34\x39\x65\xf0\x10\xf6\x88#\xed\xff\x39u" -"\x81?\x81\x36\x10\xf6I\x19gOt\xb4\x11n\x80S\x86\xcd\xccg\x9b\xe1\x90\x7\xd7\x42\xd8" -"\x1bX\x96\x11\xdc\n\x84GP\x89\xa6\x39*\xd0\x8d\xa6\xe7\xf0\x9c\x14\rQE\xa4\xd8?\xf3" -"_{\xea\xc5iB\xf0#Lq0\xe9\x93\xb6\xea:\x6\x8a,\xde\xc5\x65=\x9c&\xce\xffj\x95Vd\xbb" -"\xe1\xc4&\x8\xf6\x9e\x63\x1d\xba\x42_\x82\xc9\xd2\x11&kL\xd5JJ\xc6\xbd\xb2v\xc5\xea" -"\x89\x7fXIN\xe5\x19\xf6\x99\x2@\xaa\x9d.\x1b\xd0V7\xf1W\xfa\xa4\xbb\xc8\x18\xc3\xa8" -"z\xecl\xe1\xd6@t\x8f\x1c;\xcd\x9fq\xb7\x8dW\x93i\xc7\xa0\xb\xe7\x36i\x12\xed\xee" -"y\xa5\xfc\xe0\x88\xb8j.\x87\xc1\x7zq\xe5\xc9R(\xba\xe2z\xb4\x9c\xe1\x9\x33\xf3\x92" -"\xd5\x8\xf2\xfe\x66\xdaY\x8a\xc9\xe8mR\x1`g\xfd\x10\xb7(\xe2\x98\xda#zE\x98&\xd9" -"\xcc\xd7\x63\xf5\xbav2\xfa\x15\x88\x9dI0O\x88O\x8aZ\x18\x31\xc8\x31\xd6\xc6\x45\x97" -"\xe5\x13\x45\xed\r\x90w\x17\xc5z\x1b\xe6\xda\x7f\x81\xc2\xf6\x95+8\xa6:\xdc\x44\x86" -"\x9c\xb5\x11\x98\xcf\xd8\xb2\x34]y\xc2J\xfa\xd2h\xbbv2%\x86\xae\x97\x1\x9a\x18\xe3" -"\xf4\xbe\xe6`\xb1\xf\xbe\x12\xf0\xd5\x9f\x99\xdd:g\xc4\x1b\xbf\xcbqX\xeb\xb0x[\xcd" -"\xb9\xaf\x44\x9l6\xef\x93\x96\xfa\x30 o\xd2k\xef\\\xa2\xf>2\xe2\x8a\xad\xefHv\x89" -"\x5>\xe2\x39|Zr\x9b\xf2}\xa4\xcc \xf7\xde\x34\xbd^\xcaS\xa3\xb4Z\xeb}\x12\x97\xa4" -"1\xe3\x9f\x8eI\x8a\xa8|\xd5?\xe3\x9cU~\x89\x9\x5\xdd\xc7h\xcf\x14\xec\x44\xbem\xea" -"\xc6\x84\xd7\x66\xac\x8\xcc\xd8\xd7\x8b\x16oT\x81\x65\xd7W){\xf8\xf2\x45-\xf8ke\xe9" -"\x1cy\x9e\x1b\x45 hx\x17\xc6\xd1\xce\xe3`tWj\x5\xd8K\x6\xf3\x94\xa5\xa2\x12x\x97" -"A\x8f\xc4u\xb5k\x92\xeb\x1eKI\xb7\xa9\xd9\x81x\x91u#*\xf0\xffj~\xc6z\x88\xbc\xa1" -"%\xec&\xa1\xfb\x85w\xd0\xa0\xc6\x95_\x2\xec\x84\xbf\x9aL8\xa6g\xfd\x90\x34\x32\xa3" -"\xa9\xa5J\xcKUP\x16n\x5\xdc?B\x93oc\xb3\"\x19\x66\xb9\xed\xecw[.)\xecs\xce\xbe\x32" -"\xd8:\x9f\xcd\x8\xea\x19\xcb\x37w\xc6\xea\xeb |\xaa\x1c,\x81\xed\xff\xbfO\xc9&\x1b" -"\x8f\xb\xcc\xd7X)\xc1s\x95\xc0\xd5\x2\x41\xf1rQ6*\x81\x18\xa9\xf1\xfc\x8e\x1f\xf6" -"\xe6\x16\xc\xc2\xb1\x13\xf5\xc9\x89\xd3\xbf`,\xaa\x1\xf0\xd5\x13\x9aH\xc8\xb1\xf5" -"\x1an\xfc\xc8\xac\nwY\xa5jH\xc3\xe9\xc8\xce\x98I\xcf\xea=h#\xa8\x8e\x8c\"\x89Vy\x6" -"\xfe\x1c\x98\xbd\x81\x5\x1al\x8\x8d\xac\xad\xec\x9f\x1e\xb6\xb2\xcf\x8f'\xaf\xb3" -"D\x1d:\xf8\x9a\x39-ZSW\x3\x97\x93\xe2\xce\xacGB\x8b\x18H$\xed\xd2*\xa1GP\x87\x61" -"\xf9m\"s\xfd\x1c\xab\xc\\\x9b\x91\x95\x16\xb9\xce\xe0\x37\xe6\xccP\xf4\xd7\xbe\x11" -"\xf\xb\x16\x39\xa6\x82oV\x4\xb2[43\xdbi!\xaa\xf7\xc7\x2\xca\x84JD\x14l\xb\xc8\xff" -"w\xc4}\xfe\xdb\x80\x14\x15\xeb?\xea\rY\xf1P\xcb\x9c\x13r\xd6$\x9d\xc8\xfb\x2T\xc3" -"\x96XK\xb7\x99{i:\xfe\xb2\xc4\x7\xfc\xa0\x8aO\x17N&\xd1)\xb5=\xaa\x0\x13\xc7\xec" -"\x19m~\x85\xcd\xaei\x1\xbf>\xecs\x7\xb9\xd2M!\x88h\x82\x92\x83\xf\x18\xa7^^1\xc3" -"Jc\xaf\x42\xfb\x99z\xaf\x30`g\x1d\xbd;\xdbz4\xd4\x7\xab\x19\x83\x6\x13\x86G1\xc1" -"a\xe3N\x9c\x99\x16\x31\x9e\xf2i\x9a+(\xa0\x8f\x44\xb5^KA\x84\x30\x91\xbcJ\xdb*Dt" -"\xe4\xad\xe7\xdcg\x10xv\xa0\xe7\xd9\xf0{\r2\x8f\xbf\xf3\xcd\x9e\xf9\xd7\x8f\xf1\xe1" -"\x17\x5\x9b\x39\x94\xa6\xec\x98\x9f\x9e\x1c\xe9\xc2W\xb0\x37\xf9\x16\xa4\xe3\xbb" -"\x82\xbbI\x9c\x85>\x7\x1c\xd7\xfc\x19\xc0@\x85\x63\xf3\x8c\xc7\x9f^=\xde\x64\x14" -"\xa6\x99\x1c\xd6\xad\x32\x31\xeb\x61\x8aZO\xf3M\x86\x98\x82\xb3q\xc0\x91\xb8\xde" -"J\xf0\x7~,W\x8f\xcf\xc6Ll\xa8Q>>P~\xd2\x1\x31*E\xd5\xbc!H\x91\x41\x87\x91\x8f\xaf" -"\xe6\x88\x94\xae/\xf9\x93\xfb\x8a\x42\x81Nx^\xae\xb9@o-\x1a\xf0 E\x90\xdb)\x9d\xba" -"\x94\xec:\x97\x14|\xd6\x63{]\x96\x18\xf1\xc8\xc5\x44}\x11'*E\xf1\xb3\xd8<\x15<\x16" -"\x96\x0z\x9c\x36 1\xdc\xd0*\xa4\x8e@\x11\x8d\x81\xf1\xfd\xde/\x2\xfa\xc4\xaf\xdb" -"\x90\xfa\xb7\xfe\xe1o\\]a\x10\xdav\xa2\xbe\x32\x41\xb3\x62i\xcexe\xee\x97\xc0R0\x84" -"\x9e\x8f\xedu\xc4\xb0\xc4\xe6\xd0\x82\x31\x93Rmla\xce\xb3\xa9\x1e\xe1\x32\x86\xe7" -"Nu\xd6\x10\x36\x2\n\xed\xcf\xebjl\xefV\x17\xa2\xfb\xb7\xff\xd7]V\x89H\xf7\x18\r\x11" -"\xfd\xb6\x93\x93\x10\xb\xfbq^o\xfe\xae\xaf\xfb\x31U+\x84PM;j\\\xd2\xa0\xa3\xec\xf4" -"\x8e\xcc\x9d\xbc\x8bZ\xa3\xaa\xf5\xc2\x32\xad\x38\x99\x9di\x1b\x42\xb*\xf7\x1b\xea" -"f\xb1G;%\xc9#Z\xd4\xf2k7\xc6\xfc\xda\x9f\xc4\xe2\x96\x86\x45l\xff\xdd\x16|\x87\xf" -"\xaf\xd0\xb7\x42\xd8\x31\xbb\xc2\x8/\x8e\xa7\xd4=\xd9\x46->\x88\x15\x8\xd9\xa2\"" -"\x99\xbMt\xbb\xe9\x9a\xa8,\x7\xcbu\xe8\x8e\xe1$%k4\x9\xe?\x9a:k\xbfRzX$\x95<#B\xf2" -"\x1f\xa3<\x4\x33u\xbb&t\x8f\x19\xbc)-\xefZJ\xf3\xc4(\xd4\xca\xc\x84hG\x81\xca\x96" -"$\xc8\x7f\xe8\x18s\xb5\xef\x85\x82\x98P\xca\xfe\x18\x30`\xce\xfa\xc9X\xdc\xdeY\x98" -"\xe5\xd8Q\x1cT\xecks&\xfa\xa5q\x89\xc4\x91\xf\xbeH\xd1\xbbs\xb3\x97\x66r\x81\x34" -"\xb7\xd5\x3\x43\x91 .^:\xa8\xe6\n\xf8\x9a*\x96|\x8c\x10?irN[\x9b\x13\x8b\xd1w\xc7" -"\xbe\xae\xb8\x8e\xc\x39\xe7\x92\xcbu\xb4\x4\x6\xb5I\xba\xbf\xd2\xb7\x8\xc4h\xe9\xe7" -"\xfd\x94mNse*J\xd2\x1f+\xdc`'\x9e\x9b\x84\xdc\x89\x45t\x96\x89\xef+\xc9\xb9\xa5\x83" -"\xbf\x3 \xad%\xa7t\x9c\x4\xd5\xab\xf8$>\xfd;\xc3\xf9(\x1f\xde>\x3[\x9b:\x95\x10\xd0" -"\x8\xb8\xdf\x64\xc3\xda\x5\x8e\x80\x8c\x81\xb4\xb4\x1f\xff\xf4q\xd8s\x87\x37+\xf7" -"\x4\xf2\xa3\\\x80s*\x8eJ\xcf\x89\x91\xf8\xf7-\x8eN\x1e\x1c\xea\xee\xe2GO\xe5w\x19" -"\x8e\x8\x92!\xbc\xd1\x0\xe0\xc2=d\x7\xc7\x1f\xaf_/\xa8\x94i\xf7\x99\r\xf9\x9f\xa8" -"\x16\xc9\x2\xb5\x36\x13\x82\x94\xf5\xe5\x11\xf7\xec*J\xb0\xda\xcf\x13p[\x87\xf4\xcf" -"\x9f\x1a\xab\x8bG}\x1a\x36G\x81U\x3:\x1e\xa6\xd5\x12z\xb8\x36k\xd5\xa0\x63I\x8c\x85" -"T`\xfa\x8e\xb3\x42y~\xf\xc@\xc1Y\x9!\x9f\x14~\xa3\xfbLjt\xad\x12\xc8=\xcais\xb \xef" -"0qpz\xf0\x37\xcf\x81\xb8\x88\xb5)\xc2\x15\x36\xcf\xf\x43\xd1n\rx\r\xa8%\x37\xe1\xfc" -"!\x1c^\xdc!\xf0s\xa4\x15\x9e\xd3\xe6\xf7\xabH\x9dr-\xdd\xaa\x0t\x9bmB\x85\x37\xf7" -"=\x93\xde\x83\x62\xe1\x33>4\xd8l7\xefK\xf4\x94\x42\xbfL\x18\xbb\x83\xa1\xe7\xf9\xa0" -"2\n\xff\xfb\xd9\xc3\x1f\x18K\x9\x1d\x14\x37\x1e\xbaWy\xa5&\x1fH\x9d\x94\x42\x11\xe2" -"\x85\xe9\x99\xa3;=\xee\xe3\xcb\xbf(Rg\xc6\xe6\xca.n\xfP\x85^sfk\xaf\xb7\xc8\x30n" -"\xe7|\x10\xc1\xae\xe\xb0\x37\xfdi\x86\x30\x8IA\xf0\x90{\xbe\x87\xbb\x10\xbbm4\x9d" -"\x6\xe6t\xa5K\\\\(\xc4\x39\xf5\xd9`\x18\x4\x31\x5\xc9\xd2\xd7\x88\x35t\xfa[.$\x90" -"\xe3'\xeb\x82\x96\xf\x9bQ\xcf\x6\xb0wj\xb1)g\x16\xfc\xe2\xc4\xd6\x66\x46&[\xd8\x46" -"_\xc5>P\xf1\x99\xa7`\x11\xf7\x3o\xaf)\xb0\xbe\x19\xe8\xf\x36-\xd1\x97&B\x85\xcbG" -"\xbe\x9f\x9cR\x91P\x4\xe\x42Y\xfb\x8cs\x87\x92\x43\x5\xd3S\xe2\nX5\x9e\x9f\xcf\x90" -"\x8f\xcdS/\x97\xceRz\xd4\xf4K8\xf1\xad+l!!\xf7\xfb\xaar\xf3\xdb\x94\xd3(\xa8\xbe" -"re-\xa8UM>M\xe3H\xc8\x9eV\xbcOA\x85\x8c\xe4q\xcd\xe8Y\xb3\xb9\x31\xf7i\x3\xce\xba" -"\xeb)\xado:\xbe\x84\x0\x2\x45(\xc2\x18\xc3\xe3\x1a\xden\x80\xff\x80\xbc\xe0 \xe8" -"\xdf\x34_w\xbb\x65\xe8\x9d\x35M\xa9*\xfa\xf3\xbbN\xab\xdd\x62.\xc\r\x94]\x1e\x9\x15" -"AY\x7\x8f\x8b\x1c\xc4\xc6\x8f\xd4\xf0\x61\xeb\xdc\x16\x13\xa6\xa3\xfc\x43#\xea\x1b" -"1L@<\xd4\xe_\x86\xb8+,M+\xc5\x8\xf5\xc1[\x8cq\xfd/\xb1\x8b\xdf\xfc\xa2)+&\xf9\xe4" -"`L\x95\x80\x91\xfgB*}\x9dtMK\x7f\xce\x9qa6C0\xa7\xa8\x9a]U\xe4\x94\x38\x87]\x92<" -"\x1f\xb1\xd9\x64;\xf5Xg^\xea\xf8O3Uk/\x9fn\xdb\x62\xd0_\xac?\x93#j\xef\x1\x90\xbc" -"]\xa9\xb6}\x16\x41\xe5mQ\x1dH\xf5\xf6 \xf0\x15\xf8\xffi\xf4\xf4\xaa\xd3$$\xf0\xbb" -"P\x96\x87\xb0\x44\xdb>b\xb9\xa5\xc7\xaf\xd7\x13\xee\x90\x39\x66\x42\xeaR)\x81\xcb" -"\xbfi\xe3\x1c\x97\xaa}8\x8c\xeb\xc6\xb2}#!;\xc6\xf6\xb6\x12$\xcf\x63P(P\xd7\xd0\x66" -"\xfc\x95\xa9\xeb\x92\xed^iME\x17W\xd2\xc8\x3\xbm,\x88\xb3]\xd8\xdd\x30\xf\x45m\x1a" -"\xf3\xfc\x44\x99*o\xeb\xce\xa3\xe4\x39M\xa4\x12W\x1c:\xebpYN\xb5\xc3\xd7\xc2\x11\x19jrf\x3\\\xa7\xf5\x89\x30\x15\xe3\x95" -"\xe0\xce\x1c\x18[\x14QO]\x18\xc3\x11\xd0\xb5\x9&\xd7\xc0\x87\xc7\x7\xd1G5\xd5T\xc5" -"&+p\x17\x83V\x94\x32U\xd6/\xc\x84\xfe\x9\x38\x8a\xc5\xa2\x85\xd1tX&\xac\xf9h\xa9" -"\x95X\xc6\x13\xa0\xd5\xd3\x8b\xc5\x8b\x91\xbf\xf7\x38\x80\xde\xd6H\xd5<\x8d\xd8q" -"\n\xcd\xb3x\x17\x34\xea\xb1lm\x8a\xe1\xb7\x37!\xde\xea\xeeJ\xc9\xfe\x96\xd7>t\x88" -"2\x85\xee\xaa@YQ\xe0O\xa8\x19\xda\xc1@>\xa9L\x9b\x96\xcc\"\x7f\xb#hB\x92\xe3K\x89" -"\xa9\xac\x95Rd\x9d\x1c\x65\xbf!Cn\x99|VB{\x97\xbc\x44&\x13\xf1r\x97\xf9L\xbbU\xfc" -"\xa7\x61\x7fT\xb3\x3\x9e\x35\x30\x85\xaa\xd5\x92UU\x95\xd9\xb1\xee\xfp\xe3\x36\n" -"\xc3\xc2\x39\xf8\x1b\xde\x90\xba\xd2\xb1\x90\x14\xb0\xb8\xce\x83\x46\x6\x94\x89\xcf" -"\x13\xe0 \xc9\xde\xcfq\xc7\xcb!\xcf\x13\xee\xbc\x1d\xc5\xeb\x61\x61,\xf\x11\x8b\x32" -"\xe7\n\x66\xef\x84\xb8\x97\xa8\xc9\x1f\xea\xf8\x63\x7Z\x84\x19{#\x84\xca\x84\xca" -"\xb5T\x13\xb1\x8e\xc1\xb\x7f\x16\x84\xe4MW;\xf4 \x84\"\xac\xc2%\xfc\x1c\xa8\xe9\xa3" -"\xca\x9d\xe6\xfa\xfb\xb7\xc3\xbf\x43\x7f\x9\xac\x1\xbc\x36\x0\x8e@a\xb6\x91u\x1a" -"a!J\xfd\x9d\xd1\x11tg=\x1e\xc6\xbb\x1a)\xc6\x1\x9b\xeb\x19i\x14\x43\x35\xd8\xdb\xa5" -"{[\x0\xbe\x33[\\\x8f\xde&\xa0\x45\xd5\xbd\x65\xe1Mo\n\xf5\xf\x1f\xbf\xe6\x17o\x84" -"\x93\x41\x13{\x5.{\xceHx\x17^:\xdb\x34&\x13-m\x3\xfe\x15j\xb5\xb1\xf2\xc4\xbd.U\xf5" -"\xba\x92\x7\xf0\xaa\xbf`\xb7_\x91\xcc\x38J\x93\xf2{,}\xee\xe8\x1c~\x1c\xe5@\xc9g" -"\xdd\x64?\xf0\xa8\xb8\xba\xd2O\x13\xb7\x13\xd0pL\\#\x5\xc7\xdas\x91\xf7y\xee\x1a" -"\xb7\x7\xd3\xc3s\x9\x46s\xf0\xa0l:\xb5\xab\x90;#\x3\x63\x30\x8T_\xe7\xebh\x13\xb9" -"n\xc4\xa2:\xb4z\x5\xbLA\xc\xf6\xfa\x31\xfd\x1bN\x5\x89\x36\xd1\xd7ZE\xae|)i\x4\xcf" -"\xbe\x35\x35\x5p\xa2\x8d]T1\x4\x96\x64\x99\xac\xf4\x31\xc0\xc2\xdc\xe0\x1bw\xbe\x9c" -"\xb1\x93\x92\x31\xd1\x9b\xbf\x8b=\x1a\x96P\xc0\x8e\xe0\xb7(\x8e\xf7\\\x95\x31:\xf5" -"\x99\x91^}j\xc3\xd8Ms\xc8\xb0\x9#\x1f\xea\xbf;\x14P\x6Z\x7%$bu\x8a\xcfL>\xa6 5V+" -"\xf0\x11?\x15\x88\xb4\x11r\x16\xde\xdf\xd5zf%\xf6\xef|(\x94\xde\xeaP\xb3\xa2[!\xca" -"X9(qO?\xa3\x41\xdd\x84\x2#\x17\xe3\x36\xe9\x3\x85v\xa2\x41\xeeu}\\(\xf2\x43\xe1\xed" -"_\x94\xf0\x46\xac\x1b\xa1\x62\xd8\xa7\x35\x1f\xc\xc3\xce]\x86!\xa8\xb2\x9f\x9d\xe" -"\xa3]K\xe2\x63\xdf\xd8\xff\xec\xf4\xc4\x9ex5\x84\x97\xde\xee\xf6\x1d\xb8GX\xa8y\xef" -"\xda\xa3n{+\xb8\x5\x94P3\x92\xe2\xd3\xf7\xc3i\xab\x8b%h\xdaPQ\xf0,\x1e\xc7\x1f-\xa1" -"\x8bY;\xaf\x10\xeb\x1f\xd9\xf9\x2\x61#\xf5\x61V\r\xe0.\xcc\xf7\xef$\xfUt\xd4\xcb" -"`>s\x9f\x7\x38Zo\xd6\x30\xbf\x9f\xa4\x96\x7f<\x8c\x9\x9am\xce(_\x9e\xb7\x64\x14\xe2" -"\xe0HhlV\xd1\xb1L\x9d\x85\x1bK\xd0\xbe\xfc\x44\x8fJ\xeb\xb\xa6\x4\xa0\xcf\x33\xc5" -"\x94\xd5\xa5\"\x38\x91X\x1b\x39\x99\x6S\xe1T/\x1e\xc7\x87KN\x87$|\xea~o9\x5\xac\xee" -"\xe\xc5\xcd\xc7\x92\xdd~\xa0\xfd\xbdG\xea\xbb/\x15\x8cR\x86\xf7\xaa\\\x14\xf7O\x1f" -"\xf7W\xb6\xca\x66\x65`B\xb6\xfc\x0\xb5\x9a\x90\xf1\x65,}\xb8\x43\x8a?\x18\xff\rS" -"r#9\xe4\x33k\xf6\x1a\xf3\x82\xf0\x1a{\xcf\x80\xec\xb\x1a\x1f\x88o++\xbd\xce\xb0\x86" -"\xe4\xef\xac\x8d\x6\xbc\xff{N\xdf\xb4\xe9\x35\xc9\xcf\x85H\xf2l{&py\xd5='\xe\xd7" -"\xb1\xe5\xbfk\xa7\xd3\x82\x43\x9a\xf1r\xf4\xd0>\xbcr\xc\xa0\xfd\x65\xc8\xac\xcc\x33" -"\x14\x97\xdePhC\x96x\xabM\xc8\xc1\xd4\xc0=|\x4K\x9c\x11\x35\xbf\xb5\xe2\x9bj[\xf6" -"\xb6g\xf7!h\xda\xc8\xca\xa4\xea\"\xfa\xcfI\xdb~\x9bl\xdf:\xea\x13<\xa6N\xb1\xdb\xb9" -"`\xcf\x90R\x9f[\x16{\xcb\x7f\xe2\x10VG*\xad\xa6\x8fj\r\xdc\x1b\xf8i\xf4\xff/d\xbb" -"\xb6\xf\x12\xba\xb2\x83 T\xc5\xdc\xf6;_\xd3$\x99\x81\xca\x86L\xf5\xe7#\xa6;\x8a?" -"\xd6\x9&\x1f\r\x80\x1&\xfc\x14]\xf7\x8d\xdfQ w'i\\\xb\xf8)\xe0\xf2mu\xaf\xe|\x82" -"v\xcc\x1f\x91\xcb\x36\xfe\xbe\xda\r\xd2\x8b\xf1\xda\x63y\x92\x1b\xfc`\x99\x18<\x1e" -"\xc0]\xdd\x65\xf7x\\y\xa5\x8c\xab\xe3P\x8f\x62\xeeh\xee\x1\xe7\x32\xa4g\x93\x44Q" -"9\xc9+I\xac\xc2\x1d\xd8\xdet\xfc\xaa\xa2X\xf1\x80\xc6\x65\x1b\x16\xb3\xc6\x93kOS" -"\xef\x1f\xa4\xb3\xb6*\xb3\xfa\xf1\x4\xa9\xc0\xe4\x32\x38\xed\x85#\x88\xc7\x98\x8a" -"\xexx\xee\xc1\xfb\x30i\x8c\xdaI\x83\xb0\xc8[m\x9b\xe3\x62]$\x6i\xa8I\x85K\r\xbe\x8a" -"X\xac\x61uV\xdbs\xf8\xbc\x6\x14%Y\xef\x98\x45sC\x14\xfc\x81\x39\n\x98 [Ip(\xfd\n" -"0ob\xde\xe5\x9a\xb4\x34h\xc0R\x96\x0\xbf\xa1\x82\x34\n\xcf\xd9\x41~\xa8\xd6\x95\xc2" -"R\x94\x85\xcb\xcc\x17\x91\x94\xa7\xd8\x81\xfb\xaf\xf0\x80\xaa\x9b\x19\x97\x12\x1" -"]\xb7\xf2\xb1\xdcU\xe4\x7f\x15\x16\x64R2\x1c\xaa\x0>p\xfa\xbfw\xf4\x92\xa6n\xc8\x7f" -"\xe2!\xdd\xd2HeL/\x0\x87\x32v\xd9\x1c\xd6v\x8c\"\n\x84\x89\x33\xf1\x2\xbd\xb1s\xc3" -"\x1a\x1fOj\xb5~\xc2\xd1\xafx%\xd0)\xc3\xf8'\x82\x9c%\xea\x16*h\x9d\xc8\xe4S}\xcf" -"\xce\xe0t\xc6\xbd\x44\xb8\x36j\\-\xf8\x33N\xff\x63r8\xab\xed\x39\xe3\x9a\x31P\xb6" -"l\x13\xbd\xf7\x9e(?E\xa4\xf6\xdd\x39\xf2\x10q\x1d#\x95\xd8\x8d\xe2h2\x12q\xdf\\\xd4" -"\xaf\n\x8d\x44\x9c\xdb\x45<\x95@Js\xc6,\xd1HU\xdf\x43\x38\x97N\x83\x9a\xe\xad\x62" -"&\x1c\x2\x89\xfY}=\x9e\x34qk[\xa9\xf9o\x91G\x15l$\xe5\x61\xd0\xad\xc9\xa2_\xc5o\x1" -"_7X!\xa1\n\x81\x9a\x95\xa1{{cE\x85\xf3R_\x90\x8d\n\x19\x16\xf3\x45\xb7g\xfe'\xa0" -"m\xe0\xf2\xfb\xbd\\\xfe\xd6\x30#\xba\xf6\xe2\x42\xe6\x84\xc\x93\x1f\x43\xa6\x62~" -"BA\xb9\xe8\xcZ\xe3\x80\xb0x\x11U^:!KVe2\xbf\xb2\x64\xee\x86\xad\x8fl\xab\xbf[x\xf5" -"MM2\xc4\x83\x66\xd8\x8a\xa5\x94Nr0.\x7fx\xdd\xd8\xd4\xecR\x81\x83\\\xb0\xaa\x61<" -"\x9btQ\x2\xa2\xd3W\x97\xa8U\xc6\x98\x82\xc9,\x7:u\xaa\x9a|\xd7v\xec\xb4\xfa\xd8\x16" -"\x87\xb6\x1f\x10\x13\xcc\x61+\x99\x14\xdd!\xa6\x42\x15\\\x8a\x19\x88\xc5\x1d$\xa2" -" \xbe?\xfc>\x1e@A\xdempz\xcd\x42\xa6\x8f\x30\xdb(\xd2\xf3\xa3\xc9\xc2\xc7$x\x8d\x97\x8ZC^?\x15\xe2}}" -"\xc1\\\xa0\xacmSX\xfaX0\xb3\x8f\x39\x87\x8\x41\xfd\xd9\x9d\xba\x85\xd8^\xc1\xd1\xe5" -"\xe9?\xa4\xccYQ:\xb8\xb4H\x88|\x96\x33\xa7\x1\xe3\x82Y\xc\x42\x44!\xbe\xbf\xc6\xb0" -"\x9e\xcd\xaf\x1bj\xffn\\g[SO:-\xe7o\xfbh\x97\xfd\xfa\xf\x42G\xfb\x81\x39\x97\x31" -"\xc9\xfe\x1a\x95\x42\\\xe7\x89\x30=\xcf\x33;\\\xac\x1\xa4\xe2XbA4\xe6\xf6\xf4#\x3" -"\xaa\x88\xc9\xc2\x9d\x43\x16\xdb\xef\x89v\xe0\x33T4\xce\xdc\x1b=\xddm\x83 !h'\xa5" -"|\xd3l\x8c\x92\x83\r\x30\xd8\xa4\xb7\x42=\xd4z\x1c\x9c\xfc\xads\xbd'U\x94_\x9d\"" -"\x85\x99'\xde\x1f:Py\xb0\x64\xb1\x89\x13p2\xe8[)\xa9\xe7\xf7\x94\x33?\x1c{$C\xa9=\xb3" -"\xd9\xe1\xd3h\x4\x2\xe4\x96\xbe\xa6M\xb1\xa8\x66\xef\xeb\x11YJ`\x9b\x92\xeb\x97\xba" -"\xcd\x44\xef\x8d\x5\xf2\x13\x35\xc\x81\xd5\xbf!\xd2P\xcd\x2\\\xbe\xe4\xcd\x0\xee" -"\xa6X/\xe0\x46=\x84\x4T7\xf4Z{\x83+\x5\xa5\x9f\x17\x41\x43\x93@&f\xeli!&\x98\x83" -"s3@\x88\xe6\x65\xbb\x1d\xab\x92i}u\x94\xed\xe1\x9f\xf6\x99\xdeq\x9c\xdd\x63$eUW\xff" -"\x0\xbf\x88\x8c\x98\x17\x5\xa3\xd9w^\xc9\xdc=\xbe\xd6\x65\xebW\x90\x86\x1a\x97\xa2" -"O\x17Wf\xe1\xe7\xccrg\xf4\xea\xab;`\x1\x62Z\x98\xcI\x3\x31\"\xb4gy\x11\x17)\x11\x95" -"t\x18{m\xa9\xbc\xe4\x42q;z\xff\x62\xd1\xa6\x7n\x7\x1j\xd3\x34\x1b\xbdX\xb4R\x89\xea" -"\xaa\xbH\\pW\xf9\xc4}Z$\x8fH/q\x16/\x92\x88q\xb0!{0\x89\x13\x9cN\xb9\xd2:\xb5\x4" -"\x3\xc5\x9dS\x1d\xe7\xf0,\nR\x7f\xb4\x35\x97\xb8\xe5\xad\xa7:J\xdf{\x6%\xdaP\xe2" -"\x82*\xff\x9dj\x9f\x38\xafP1B\x1\x81_y\xee\xf6&\xa1&\x80\x31\x8+\x1f\xb1\x98\xc\xb5" -"\xb\xf7]9N!\xa8\xba\xe1\x63\x6pE\xbf\xd0\xa5\xce\xe5\xbdm\xb0J\xcc\xd1[\xe2\xd2\xcd" -"\xc8,\x92v\xb8\xc6~\x3\x42\xd1\xb0\xd5\xfc\xec\x98\xa0VS~e\x88\xe7MW!N\xba\xd1\xc9" -"\x92\x16q\x9b\x35\"'8\x84\x6\x11g\x90\xc4;V\xbdj[\xe5\xf4\xb8\xf\xa6\x92H-\xb8\xc0" -"\x1c\xc3\xd1t\x81\x37\xd7\xa3\n\xac`\x9a\n\xea\x9c{\x16\xf6\xfd\x46\xb5\x8b\xa8\xc0" -"\x86!\xb5,(O\xd5\xaa\xb3&\xa4\x85\xc7$\x14\xdf\x63_\x1\x8cP\xa5\x9\xac\xfcQ?}$\xd0" -"AJ\xb7\x9a\r\xb7\r\x7f\x85\x2{(b\x16\x17\xf9\xd0\\\x6\x5.MBm\xa0\xca\xb9>i'\xe9\xae" -"\xe9\x1b\xdc\xcaY{\xb3'|,\xd5\x94\x66\xd2\x92\xeb\x9ck\xe\x80\x9d\x92P\xe1\x46\xfc" -"\xed-\xba\xce\x65\"\xa7\x36\xea\x1d\\O\xe5\xf2\xda\x63\x8e]@\x88(0O\xb2\x8fw\x1b" -"\x91\xe\xe9\xc7\x9e!\x90_\xbc\xcdH\x12\x63\x36]\xb5`\xfb\xb1G\xb6\x1f\x42\x18z\xa3" -"\x1d\xc4\x9f\xf6sg\x8\xf\xc6S7?\x10.9R\xce\xc7M\x94\x9f\x65\x6@H9\xbe\xacY\xdf\x82" -")\xc3\xab\x81:\xe0,!\x3\x62\xd3\xda\n\xf8\x46\xca\x41\x17xC\xce\xd7\"\xbe\xd9\x37" -"\xfa\x3\xce(jI\xc1\x18\r\x85g0\xe9\xab\x9a\x44\x9d^\xa5L\x13t*\x8dT\xcer\xa3g9\x4" -"\x12\x99\xbas\x93*\xda\x46\x3\xeb}(\x96\xe1\xd5\xad\xe7\\\xe7\xba\xc5\xd7\xe5\x15" -"\xea\xd8\x31\xefu!J\xdb\x37\xc9\x17\x41\xc~T\xf2\xb2\xb8\xdd}\x85,@\x84\x44\xfbO" -"G#\xa5\xceo\xe3\xe8\x5\x4\x66\xb\xe7\x8a\x9c]1\x3\x82\xe6,\x8c\x12\xc9\xe4{\xcb\x34" -"\xf3\xb3\x41\xe6\x1cV\x1a\x1ek\xcf\x12_S\xc\xf9\xc6\\\x8d\x1f\x1e\xec\x65\xf2?]\xb4" -"\x84\x7fL=\xac\xac\x8a\xbc\x62\x64\x1eU\xa2\x61\xc8\x99\x80<\xfcK\x8a\x9e\x37\xb9" -"\x86\xe\\\xb1s\xb4\xa0><*\n\xcM\x83q\xbavi\xd7_N\xef\xd4\xc9\xd0\x94\x7\xa1\xe2\xe7" -"E\x85R\x17\x97\x12\x9c\xd8n\xa3\x14p\x98k\xc2\xda\xee\x82\x1a\xcaGE\x1c\xc8\x91\x9d" -"\xff\x9e\x98\x45\x8Y(\x3\x88\x97\xd8r\xae\xe2\x88I'\xa3\x44H\xf4\xde\xca\xc1\x13" -"]*[\xb6\xda\xa5\x44\x10\x46\x84\xed\x95\xb4\xc5\x82\xda\x3&\xac\xef~\x99k\xfe\x8" -"\xa1\x1b\x0Q\xa9\xae\xcJ\xdd\x1d\x97\x44\x0\xa8\xc2\x1c\xa9\xadq\xf\\S\xb8\x16\x83" -"\x16\r\x19\x1f\x9f\x19\xd8\x1b\xb9\xdfGd\xa8]\x84\x8dr\xed\xdc\xbd\x99\x8c\xf7-6" -"\x6\xac$\xd9\x65\xed\xdf\x44YPD\x15\xe0\x61\x1c)\x9c\x37\xa5\x93\x6\x36)JF\x98r]" -"\xb9\x87\xd5^\xfc*\xe0\xfe+\xea\xca\x90\x34/\x1f\xf5\xfe\x33\xa2\x8a\xd9x\x83\xf3" -"\xcd_\x8d\x64\x95\x66\xe9\x37-\xbf\xe3\xcc\\\x95\xfdH\xcc\x83\xbf\xae\x7\xa3\x63" -"zJK\xa8\x41\x7j\x82\xc9\xa5J\xfe\x98&\x1d\ny\\y2\xf5m!\xea\x6\xf8\xfb\x7\x64Vi\x91" -"1\xd5\x1ek2\xf\x0\xe7\x99\xd3\x35Og\x0\xcah\x7f\x11\xc0\xd5N\x1c\xf3\xcb\xb4\xd6" -"\xb9\xff\x95l\xf3Hz\r\xd2\xf9\x8d&\x16\x44M\xc1\x7fUt\x1\xe5\x9\xa1/=\xd3\xef\xf9" -"\n\x9c\x32\x61?\xa4o\xbb\x14\x3\xablC\xb1\x14\xf1\xe1\xdd\xff\x16\xf1x\x17\x85!=" -"D,\xa4&\xe0\xaf\x87\xba\xcb\xb2\"]\xf2/{d\xf4\x4\xef\xb\x19_=\xe9\"\xb4\x35\xb4\xd7" -"\xd9\x1e\xb1)\x1b$\xb5\xde@o\xd5\xd5\xd9M\xe8=\x9e\x8b\xca\xd5\x8n'N\xd8\xa4\x4\xb8" -"\xb4[-\xaf\x63\x17\xdc\x5\xf4\x87\x8\xcd\x45\xd7\xfa\xbfx\xd6\xcbJe\xca\x97\x34 " -"\xbd\xc\xbd\r\xda??pa\xc1T\x15\x32\xb1\x31J\xe9\x18s\xfa\x9fO\xe2\x99\xe4\x1e\x97" -"\x1e\xccY\xb1\x41\xaa\x41\xf9\xa0\r\xb2\xfd\xa8V,\xec\xf7*|\xe7\x90\xe2\xab\x46\x30" -"\x1a-\xbbg\x1e\xfb&\xf6\xad\x63\xb4\x1\xbb\xa2\xea}\x83\xefG\x6.\xa5M\xa3\xc3PH\xf3" -">\x95\xe8\x89\x1e\xe2\xd4\x80\xa6\x34\xe6>\x85K\xf6\xb2\xf2\x92\xc2\x1gA\xf5\xdd" -"`S\xdc\xa3\xf5\x45\xd8\x41\xdbIGi\xf5u2\x86\xa0\xd2#\xee\xf6;<\xd6\x46\xb9\x96\x66" -"jnJ\xe1\x15~\x13`\xce\x82\xa3\x1b}\xac\xd9\x7f\x9\x9a\x33h\x1cgGJ\x91\x45@\xa4\xad" -"\xfd\xb5\xc1\xa4\x1e\x41\x7fO\xb7\x95\xecM\x8W\x1s \x98\xdf\x95\xe5\xa3\xa8JM'\xe1" -"b\xa5\xf1;\xfbh^\xb3\x8b\xbR\x5\xf9\xe4MC\xdb\xc6\xa1*\x7f/\x9\xc1\x45\xca\x37\xf2" -"\xaa\xfa\xf1\x1bZ\xd9\xd7\xf6\xd4\x14m\xf\x61Z\x83\x83\xa6`\xd8\xfe\xaa\xb7g\x9\x86" -"vim\x2\xc8\xc5\x95\x85\x8a\x16\x44\xbe\x9f\xa6_\xee\xe4;\x99\xc2\xde\x3\xe1\x15\xc4" -"\x1f\xe\xd9\xee\x9d>\x9fw\x97\xb4M\xb0\xb6\xb9\x9b&N'\x1a\x0\xa7\xc8,\xe\xd3\xa9" -"\x96H\xd6\xff\xb4\xd8\x84\x9d\xbfH\xae\xa2\xe0;\xb8\x14\x64\xfb\xfe\xc8\x61T\xf\xd2" -"s\xec\xc6K8\x94\x81\xe7|VS\xeb\xe1\x10$ \x2G\xc3w\xac\xc2\x4p\xf3\x62\x99\xb2=\x90" -"\xdc\x66\n\xc7R\x9o\xfa\x1b\x11\x8e\xac)\xfa#\rO\xf6\x92j\xccI\xef:$\x9f\x1c\x61" -"\x97R3?\x84\xf8\xd3\x93Y\x18\xbdmY\x89\r\x1d$\x94\x34\x93\x66}S{\xde]9\x6\x1|\xa6" -"@\xff\x1c\xa7ph\xe2\x8dJ\xa1\xeo\x93\xd0\xbf\x12\xa2X\xe1\xfbX\xdfO\x1b\xd6\xb5+" -"\xf]\x9d\xc9\xd0\xa9\x1b\xc5\\\x1bpH\xa0\x62OT\x85\xe4\x66\xc6\xa8_Vqa\x11R\x83\x94" -"\xf4\x36\r\xc8\xc3\x14\xab-\xa4w\x99o\xb6\xfe\x1b\xc9\x18\xab_\x81\x66\xea\x10\xbb" -"vA\xff.d\x97\xab\x33\xfb\xf1\r\x90\x31\xe4\x11\x7f\xcc\xb3\xd7\x6\xec\xdcI\xa8\xde" -"S\xbf\x11\xa6{\x9dhY\x9e\xf1\xc7\x43\x15\xa8\xb1\x94,u\xbaG\xe8\x30GGU\x1f\x37\xd0" -"\xb7\x44\x7f\xb0\xc5\xd9\xb3\xe9\xf1\x1d\xb8\x8\x82\x80\xe1\xfap\xed\x8f\xdb\x63" -"\x10\x66\xb1H\"\x89\x18\x1d\x89\xcft\x84\x97\xa8\\\x8\xaf\n\x9a\xa8\xd1'M/\xa1\xa8" -"\xceGO\x19\xcaG\xdc\xb3\x8bKV\xa0[\xcfMp,\x1b\x33\r\xe7%\x87\x13L\xca\xfc\x8c\xdb" -"R\x1a\xe7\x43G\xcd\xcc\x4\xa7\xfe\xca\xc1\x19\x1e\xeeSV\x7\xblj<\x9e\xd4-i\"\xe9" -"ni`Cc\xd5\x8e\xf8\xc0\x35\xe4\xec\xb7\xb3\xac\xd9\x95\xf7\xfb!V\x15\x3\xafy\\<\xc0" -"\x95wC\xf8\x94\x96\x8d\xc5&g\xf4?\x1c\x89\x16\x8a\x93_i\x17\x83\x63H\xbe^\xcdN\xd3" -"'\xb4m\xdf\xe5\x87\x90\x9c\xac+\xb9X!Ku\xe3\xf5\x62\x1c\xd6lI\xf2\xae\x33U&\xee\xc4" -"\xc2\xab\xbb\x84\xab\x65\xb6\"\x34\x66\xff\x65\x9e\xbfM\xab\xfb\x82\xc0\xc6\x1d\xbf" -"y\x85\x3\xd2\x98\xad!\xc5\x36\xd0\x36\xc7\xed\xa2U\xb4\xe0\xb1\xf8u\xbd\xef\n\xb9" -"\x95\xb8;/\xbf\x91\xee\xa7\xe\xaf\x80\x95R\xd7\x1f\x92>\xbcvt\xe6\x86 \x1\xee\xe4" -"*\x16\x1fjl\x8c\xd3]\xb3)\xf9\x37G\xeb\xd5\xdc\x61O\xea\xc8K\xfa\x4\x44\x33\x34\xf2" -"\x0\x8a\xf2\x8d\\\x94\x1b\xa3\x1e\x11\xed\xcf\x9c\xf0\xa5*w\x8Y\x9b\xcb+.I_:\x1W" -"\xe5LQHZ\x1b\xd6;\xc3\xe0\xe5\x91\xb9\x8dw\x7fyaoc\xa8w\x1d\x9c \xd2\xa5\xcd\xed" -"h\x81\x43\x6\x12\x61;\xd0\x2w}\x9a><6\xbb\x95\x46\x36\x8b\xea\xc\xd1lg\x1f\x61\xb8" -"\x8c(\xf3\x9a<\xaf\np\xcP%K\xb1\xfc?r_+\xcf\x39X\x1e\x8d\x9f\x62\x81\xdfO\"\xbd\xfb" -"\xacz\xd7\xca\xab\x43J'%\x19{\xef\xca\x7f\x1d+\x16\xf7\xa3x\xd9\xe0X\xbfx\xe2\xe3" -"\x9_V\xb0\xb0\x84\xf\xa8\x6\x10\x65\xec\xcb\x10\x9a\x33\xd3\xc6\xae\xdf\x39\x19%" -"I<(\xad\xd1\x1b\xe1\x85:\xb\x9c\x14\x33\x39I\xcbm+\x1b\x89:\xee\xe4\x80I\n\xce\xc7" -"2\x97\x63\x7f\xa7\x16\xf1\xf4\xe0\xcc\x5\xabVB_\xa7\xe6\xc8q\xc9\x86\x3\x81Z$\xea" -"\xb6\xb1\xf2&\xdc\x9d^\xb5\xcf\xd4\x86\xac\x8fw\x11\x5\xf0\x84\xde>\xe0\x41\x32\xbd" -"\x14\xca\x8Z\xb6\xe2\xb9\xce\x13\xc1\x4\xce\xc6\x92S\xb5\x33\x8f\xd2u\x1dHB9\x94\x9b\xd8\xc6\xda\xc6" -"\xe3\xf8\xe8\xc3\x9aV#\xe1\x18\xf3W\xcd\xea.\xa5\x81\x82\x46\xd0\x42\x13\xad-\xb3" -"\xb2\x85\xcb#P'\xdf\x3\xbb\x98&\x6\x9f\xca\xba\xf5\x36\x36\x13\xe2=\xbe\x65\xd8\xf" -"\x15\x8b\xact\xfe\xc3\xe4\xafn\xd3\xb9\x30\x0\x1_\x89\x11\xc2\x99\x1a\x6q\xdf\xc2" -"\xff\x17\xa8\xf9\xd2\xcd\xde\xd9%s\x9b`g\xee\x81\xa9\xe7\xba\xcd\x84\x9e\xcfj\x8c" -"\r\xcc\xa4\xc3\xc1\xe2\xe7\\?S\x1\x1e\xee\x94\x9f\x37\xf6\\\x82\xc9\xa1\xfd\x1<\xee" -"\xa5O%\xd5\xc7\x16\x35l\x9\xb7\xa3S\xbc\xdd\x97\xce@A\xe3\xe3\x8e\xf[\x87\xda\xe1" -"\xba#\xc4\x97O\xa0\x94\x92\x62\xa2\x1)\xae>K\xa0\xeb\xe1,\xc1\xffr\x6\xb0\x1a\xd3" -"\xb7\x1e\x10\x18\xca)I\x89\xff\x6\x2\xce\xa1_\xc3\xcb\xb1\xe6\x14\x18\xa7\xac\x16" -"\xcdg\x92T\x97YTHl'\xd0\xad[\x1b<\xc9]q=\x85n\x80Tw\xc6\xf*\x8d\xfb\xc7\n\xd0\x94" -" \xa9\xea\x92\xe8\xf9>\x88W\xf2\x9aUu8\xe5\xb7\xd2\n\xa6\xe7\"Z\xeb\x8d@\x12\xc8" -"_^!<\xe1\xd0\x43&\x7~\x90\xd0\xa7\xe4\x8cU\xe5\x46\xb7,H9\\\xd9&#{\xb8\xca\xe1\n" -"\x2x3\xf1\x66\x12g\xcai\xc2:\xc4\xfb\x10\xf2\x96\nH\xf4\xb6\x90O\xf7\xee\xb\xab|" -"q\xc6\xcf\x35\xa6Ol\xdd\xa9\xa4W\x9a\xc6\xb6\xf1\xddO\x81U\xb6\xf0\xbf#t+\x95G}\xe0" -"\xd9\xed\xa8\xbc\x96\xf2\x7f\x16\xcd\xbe\xa5\x62\x84 \xf\x14\xf3\x1d\xb1\xdc\\@\xfb" -"\x8a\xb7h*\xa3|j\x9b\x61\x91\x36?\x88\xb0<;\x9d\x96\xdc\x64\x12\x3\\:WuB\xfbZOZ\xf9" -"\xa4\xb3\n\xe5\x4\xc8\xeW\x87\x34\xc4>X\x17\x44\x7f\x91\x4/_v\xc4&\xb1\x2\x36\xeb" -"\x12Y\xd0\x7G\xeb\x8d]R\xbdh*\x0\x42H\x84\x61s'lO\xc0\x30\xba \xb4|\xb6\x38\xbfM" -"\xc\x80S\x9\x8e;\xeb\x9e\xd9\x6\xc7\xe5\xee\x33|\xf1\xc4l\x6\x91\xd1\x9\xcc\x97\x90" -"a=y\xac\xa4\xf4]\xc0\x1bL\xee\x12%M\xd6\xech\xa6\xc4\xda\x85\x16WcjGu\xcf\x92\xf8" -"\xbcQ\xe\xe6\xa0slJ\xf6\xe5\xf9\xf3\xe7q\xecKt[[x\xf7\x44\x0>\xd8\x8a\x33\xfc\xa0" -"\x9e\xcd\xca\xdd\x61K\xe6\x15\x99\xd6\x18\xf5yD\xec\x17\xb8\x9f#\x85\xbc\xf8\xe4" -"\xf!\xcc\x30\xfd=\x1c\xc4\x63%h\r\x15\xd2\xe3\xbb\xcc\xc4\xe5\x44\xf8\xb0\xa1|\xcb" -"\xc4\x1e\r\x81\xec\x4\x46\xb\x93\x84\x14\xbe#}\xb0\xa8T\xad(m\xee\xbe\x4\xc0z\x15" -"\xd9rd\x0IxU0j\xb8\x11\x89LEf\x15\x9fV\xff%\x19\xa1,-e\xfc\xa0~\xc8\xc1g\xd9\xd3" -">\x98.\xc1\x84\x18{T*\x18\xad=[c\xa4\xdfH\xb8\x1x\x9f\xc4\x9b\x86\x61I\xe\xfe\xcf" -"\xc1\xe3\x9f!\xbb\xc0\xc\xdb\xe8\xc3\x9a\xfa\xb1\xb0\xc8\x32Y\x94+F\nq\x14\xe1?\"" -"X\xd5\xcK\xdc\xc\xe8\xc5r\xe3\xe9\x87\x8b\xcc\x41\xbd\x46?\xba\xa7\xc7\x99}\xaf\x9" -"\xb\xf5O\xd4\xe7;\xa8\xe1\\(!\xa2\x63V\x8e\xcdo2\xc2\n\x8f\x18\x0\x8a\xba\xc0\x30" -"\xeb\xce,\x1a\x64\xe1\xcf\xad\x9c$+\x9f\xfMS\x86h\xca\x8c\xf8\xa1\x8e\xcc\xc8W\xe6" -"\xc9q?\xbbx3*\x8\x8e\x66\xea\x89:Jjl\xc3\xf5\xb9>\xee\x45\x30\xfb\xec]\xad\xd1\x46" -"\xa4G\n,D\x9a\x46\xaa\xe1g\xaf \x87\xda\xcd\xcd\x6\xfd\x81\xce\x33\xf7*C%I\xbdl\x9a" -"j\xc\xe6V\xe8\xf1\x37\x85\x7f\xa3/\x9b\x7fv\xbd\xda\xfe\xf9z[\nq\xdfr\xd4-|Y\x84" -"\xc7y~O\x5\x8e\xf6Z\xe7\xbe\xea-\"$\xdf\xd7/B]\x8b\xfd\x6\x8e\x44@\\d\x87.>\xef\x0" -"\x1a\xd8\xab\xb8\x87\xd3\xffR\xf\xddR\x0G\xeaW\x9a\xe4]3\xcch~\xd3\xc3\x3\xb1Oh_" -"}\x18\xe3\x35\x0t\xfc\x86\x8\xdf\xd8\x17\xde\xeb\xa3u\xf\xbaJ\xbf\xb\x8bQd\xea\x9" -"\xe9\xe8\xc9\xb1i\x8c\x8a\x61\x86\xe9\xd0\xfc \x8c\xb6\xa7\xfd\xe6\x90\xeb\xad\xe9" -"\x2\xac(\xbb,\xd8\x6\x13l\x10z\x92#&\xe9GZ>\xf4\xa6\xaa\x88\x7\xfa\xeeO$\xab^\x19" -"\x80\xf4Z\xe7uX\x95\xe3Q\xae,L\x7\x98\x9e\x65\xfb[i\xc9\xe5\xf9v\xc1<{A\xf4Zl\rY" -" \"\\2\xeb\xad\xf0\xd3w\xfc\x0\xa8[\xaf\xa4\x97\xc9\x11p\x1\x87\xc9u\x10\xeR(f/\x0" -"e/\xf8\xa3\x90H\\\xd2\x94\x36\xf\xc5\nv`t\xea\xf0,\x83M\xbe%\x8\x39\x63o\x16\x9b" -"\xf5\xaa\n\x1f\x10\xf9\x95 \xe2,TG\x8d\xa9W\xfb\x62]H\xf6\x87[\xf2\x87\xc1\x1b\x39" -"\x98 \xd3\xf4\x88\xac\x96\xb6\x7mH\xe0tye\x9a\xf2\xe7\x33h+V\xdc\x7\x45\xbdR\xf3" -"!X\xe5\x0%\"\x9d\xecg\xb1[\xe2\x42\xd4\xea\x9@N\xc5\xda\xc3Gsf$\x9c\x65%\xc3U\x8b" -"d7\x15\xfc\xa6(!\xc3\xa3\xc3\x16\xc2~\x93\x19JoO\x15+\xff\x9PUc}\x9ashLw\x9\xa9\xf3" -"}\xe5\x8f\xc0\x9\x1c\x8\xed\xd0[\x9a\x9e\x14\xbf\x42;\x82\xb0!P\xe#\xbd\xa4;A\x9c" -"b\xcf\xa5\xa1%Y\xb\x18\x15s\xd6\xdf\x81\xd5\xbd\x9b<\xaf\x94\xbd\x1a\x87<1\xd1&m" -"\x87+,\x1e\x89\x9bg\x9dv9\x15\x31\x96z\x90\x9a\xb5\x9f\xebGr\x86\xeby\x14\xb7\xbf" -"\xe7n:\xea\x9c\x1a\xd1h\xc0<\x0<\xe5\xd8\x8a\x61I\xb8\xf0\x61\x0\xf1\xd7\x8j\x8d" -"3\x97J4~\xd2s\x97?K\xb2\x13'\x88\x1c\x80\xd3\x32\x89P\x10\x96\x88\xd5\xf2\xc9\xd2" -"\x90\xe3\xf2+`\xd6\xa9\x9e\xc7&=\x95v\xce\xac]\xc7\x89\xa4\xa7\x83\xf9\x1b\x89\xce" -"\xfd#X\xa9\xef}\x0\x32V\xc6\x3z\xaf\xe7\xd7\x0\x8f\xe4\xfb\xdc\x1e\\}\xc7\xe5|\xfd" -"\x85\x1eZ\x13jo\x82\xee\xb2\xf5\x90\x1e\x18\xd7\x8\x9!A\xc2\x96\x81\xbd:-\neY\x8f" -"\xbd}\xab\x16kg~{9\xd8\xe1\xb5\x45\xc8\x81W\x8d\xa7K\xe5\x7f\x87+\xc3\x1e\x13\x87" -"8T\xc9\\\xc3\xb7t\xc6\x32;\x81\x96\x46\x8c\xc2\xc0\xf1\x42\xfKH\xd5\xc1\x18\x17?" -"\xe7\xaa#\x9b\x16\xf7\xad\x42\x46\x1f\x62'~K\xd9:\xa7Y\xe\x6\xe7h 3\xb4\x37\x65u" -"3\x8f\xd5\x65\x93\x31\x88\x34S\x2\x38\xb7\x3_\xce~Y'\x9d\xe3\x65\x8a\xed\r\x90h\xa2" -"\x9f\x92w\xa7\xd9\"\xe5\xe3\xad\xf5\xc,$\x14\x6\xb6\xcz[\x90\x46\xb7\xef\x87\x65" -"\x80\xcb\xdd\xb\xecx\xb1\\\xca\xf/\xde\xdcmf\xbb\x43\x85\xc7\x9\xbdu \x85\xf8\xd2" -"\xa1z \xf1\xef\xdb:\x8u\x88z\xbdV\x8c\x96\xc0\x34\x32\x93+\xdd\xd8\x1bW5\xddG\x1b" -"\xff\x14\xba\x88\xe9\x43\xeiX8\x3\xac\x95\xf6\x1c\x96\xa5\xfd(\xa9M\x7\xf2\xae\x65" -"H\xcf\x95\x86'\xafu\x1c]&t\x7\xee\xbd&]\xffTe\xf1\x9d\x83H\xfb\xf8M\xbe\xb1kh\x9a" -"\x88\x41\x65I\x14\xa1\xd1\x31\x61\xe9*~M\x9d,b4\xb2S\xa3m\x82\x87\x33\xfa\x1d\xe2" -"\x90\xb9\xff\xf5\xe3\x11+.l\xaf\x81\x98\xee\xea\xf0\xccQ\xf6\x30<\n`\xb7I\xf9\x66" -"Tc\xc1MA*\xd5\xa2k\x81H^)q\xe8\xfe\xfd\x82\xd0+\xe1l\xb1\xad*\x96\xa0\x16\xc2j\xf3" -"\xe0\x1e\xc5M\n\xdb\xc6\x1c\xbb\x7\xb3\xdb\x5p\xd8\xcaH$\xe1\x6\xa7Sb\xeb\xac\x1d" -"M\xc3nK\x92\xb5\x83\x61\xf9\r\xc8\xdb\xd7#\x1a=~\xe3\xab\x1th\x8d\x85\xa1\xc2\x1a" -"\xe7\xbb\x96\xe2\x16m\xfe\xb6\x64\x82\xe3\x96\xf2\xbf\xc\x9eK\xe1\xde\xec\x38\xc2" -"\xa5\x9b_f\x86\x9d\x95\x3\x11\xf\x61\xda\xca@\x19(z'nKl\xc\xfb*\xcb\x16\x8f\xf6\xe5" -"S\xe6\x9b\x0\x66\xcb\xa0.]\x8b\xcb\x1d\xa7\x64\xdb\x62=\x1e\n'\xcal\xe\xfd\xcet'" -"5\xf5^\xbcN\x1f\n\xe8L\x81\x36\xd3S\xb7\xd0\xd0\xa2\x62(\xe3%t\x85~$\xf2\x15^;C\xcc" -"\x81\xf0\xa9\x86\xd7n\x97\xa5\xef\xd1\xc0xj\x93\x8b\x64\xc2\xd8\xcbm\xe1\x64\x38" -"9+K\x88VY\xcd\x11\r\xe2\x17)z\xfR\xd5_\xa2\x8f\xd8S\x94\x9e\x90\x1e\xd8\xad\r\xdc" -"Wh\xda\xcf\xac\xe8\x8f,@\xe6m\xa9\xad\x64Q\rK\xd0z\xd8SM\x96\xde\x36\xfdo\x1d\xc0" -"\xcajJhak\xf6\xbe\xe7\xb9\x85\x87z\x19\x9b\x8d\xcf\xfc\x13\x1a\xfb\x18\x8b\x8e\xc1" -" ,\x5\xc1\x9a\xeej\xb4\xa8\xa0wQ3c+\xb3ru7\xe3V\x85\x8f\xd9\x88\x9a_\x4H\xf7\x45" -"\x16\xb3\xcb\xfc\x95U\x93ws\x97\xb1,;LN[}#gv\"P\xd0\xf9\x8eY,\x85[\xe\x10\x92\xf2" -"\xf7\xdb\x95/\x9n\x99\xf8\x2\x3|B%xd\xbnE\xbd\x11\x33\xa3\xf8\xcf\xfc\xc9\xab\xba" -"G\x9e\xcbX?8\xc\xa1\x1f\xca\xf2\xf8y\x97\xae\xbb\xe7@\xb2\xbf\x35\xc0vT\xc8\x19!" -"\x96\x66K\xb0\xd4\xa3j\xc5O\xf0\x84\xe0\x1b\xaf\xba\xbf\xc5$^\xd1\x95\xd1\xc3\xe6" -"\xd6mC?\xf4#k\xd9\xfd\xab\xcc,\xfc\x9f\x1a)\xf7\xb7\xc3\xf5\xeav\xc9\xf6\xa0\x18" -"f\xc8\x15\x7]\xc7\x6hAN*\xa1\"\xc9\x31U\xc7~\x8a\xc9\x95:5x<\x8fs4\x1e\xe0\x1e\x6" -"\x18S)\xee\x44k@\x5s$=9V\x96;!\xdb\xc6\x90J\xeeK\x1\xa9\xf1r\xd8gxB`Z\xac\xee@\xe2" -"]8{\x1b\x3Y/\xba\x12\xfa\xde\xb0*q\xe5\x14\xe9\x99\xc1\x43\x90\xb8^\\B\x19\x88w\xac" -"Au\xb\x81J\x86\x9a\xd9\x95\x90\x66\xa6\xb8\xd6P\xbb\xf0\xd8\x89\x9\xban\xc2\xc0\x46" -"I\x90\xb\xa1Z\xd3\xa0:\xe0t8\xfd\xc4\x44\xe9V\x6\x14\x41!\x19\x4\xe4\xc5\x33\xfc" -"F\x97\x9d\xe7\x95\xfckc\x91\x46=*>\x91\xca\x5\xf0\xe7\xc9\xcf;\xee\xb3\x1c<\xd7\xf5" -"\x13\x1b$\x88\xe\xff\x16p\xfeig\xf9\x80\xf5u\x18H\x8at\x81\xc5M\xc4\xe0\x64\xb8x" -"\xd1.M\xa9\xe1\x9d\xff\x1b\xe2;a@\xa7v#\x85\xec\x61YpQ\xdbT\xa6\x8e\x3}\xf5\xb9\x42" -"&QB\xa0\xb3\x31\x38\x88\x35p\xe9\xd2\x86\xe4%\x0\x31\xf2\xf4\x91\xae\x10\x8b\xed" -"\x9e=~\xec\x9f\xa7\xb3\xba\x9f\xa1@\xf\x81\x18\x9\xc\x96-\x87(*\x84\xf5\xc7kX\x18" -"\xc9\xf2\xb9X%eE\xa2\xb0#\xde\xe1\x19\xbf\x95u\xa1\x39\x19\x83Q\x9d\r\xa2\x39*)O" -"y=\xeqM\x86\xb3\xbb\xb5Z\xc8iw\xdd\x66\xd5\r\x8\xf3\xee`\xec\xdd>A\xfa\x9\x96\xc1" -"0\xfe\xb4\xdc^y\x16\x39\xea\xc\xf1p\xa3\x84\xc9\x94+\xaf\x16\xf1-\xf5\x8\xb3\xa5" -"H\x4\xfa\xb8\x38\xd0\x42\xa2\x39Q\xc2i\xc1\xd8\xbc\xe9\x39\xdb\xd9\x1d\xe2\x8\x43" -"\xf9~\xe0O\x90M\x9a\x62\xce\x1PvG\x9di\x2\xe3\x10\xa6!\x4v\x95\x84\x1d\x8\xb7\x9b" -"\x9bXg9\xb0\x92u\x11\xabsBb\xe8\x92\x17\xaf\xa5\xf0\xc5\xf7\xd3\x1c\xfa\x31%\xbd" -"\x92\x1az\x94\x98<\xc\x94,\xd1/\xd9y\x4\x64+\xd4 \x10\xf5\x8d$S \x5\xd2q-\x8f\x45" -"x\xd0\x97\x46\x1e\xc4\xdbXU\xe\x89\xff\x62vS\"SZ)\xc\x66n\xe6\xf\xc5&\x1\x1f\xe9" -",\x1c\xbe\xd8\xa2\xc6\x8aMR>\xda\xac\x1f(\xbc\x96\xb2\xca\x31)\xa4\x95\xd2\xbbW\x1e" -"4\\\xb3k, CTj\xd5w\xd7.\xca\x81\xfcX\xe0\x80%\x8cM\xc5\xfa\x9f\xa0w\xc9\xdf.\x85" -"\x8e\xaeR\xe3\x12T\x8b@C\xa6|\xf9\xb6\x13\x41X\x6\xcc\xcb\xbdJ\xb4\x34\xa8\xe3]\xb0" -"`\x18\xfa\xd3\x64\xfa\xde\xd7t\xf2\x12\xc0\xe9\xa6\x8aP\xe8\xe7L\xb6\xb6\x83g\xfe" -".\x9c\xce\xb7\x82|_o\xfd\xa8\xab{\xd8k&\x15\xef\x35\x1a@\xbb\x45T\xce\x13\xb5]\xd9" -"\x88\xb5\xe9\xe7G\xfe\xb4T\x8e'\xa7\x63\xd4\x66K?\xe0\xf8l2\xb\x65\x1a\x64]l\x11" -"^\xf\x9\x45\x34\xb0\xe9\xe7|\x1\xb0+\x84\xfeK\xfa\x10\x9f\x1\xcfV\xcb\xc5\xd7\x37" -"\x87`\x87\xe4\xd7\x4\xa6Uk\xae\xe2\x30\xf3S<6W,\xe2`\xf9\x2-6\xc2\x46\xaan\xf0\xcc" -"IT\xad\x90iyw\x17J\xa8!}(4\xfJ\x1bj\xf5\xd5?\xf4\x19\xa3\xf5\x8a#\xb7\x5\x61\x30" -"\xc2\xd7\xa8\x91\xd0\nmw\x8f\xe4o,m\x8bm\xb8\xa7\x32\xbd\x46,\xbap\xc1\x39\xc3\xcf" -"Ge\xf2\xd7\xc5\xa4\xc2\xcd\xa1\x33j\x10\x30\xddx*V=\xc1\x88^\xe5\xcb\x84\x39\x10" -"\xa4\xe7\x1d\x8e\x11\x1c\xcb+\xfb\x15\x4\xa9\xf\xea\xea-\xa2\x1f\x39\xce\xd3\xa6" -"\xb\xc6\xfc\xa6\xb0\x97\xe8@\xfe\x0rb0@\xd2\x37q1@\xf1;)P\xdbI\x1b\xe4w[`\x9f\x9e" -"\xe5\xb0\xc\xdc\x1aw\x8\x1e\x32\xe8\x89\xae\xe*\xdf\x2\x34\xb3\xe4!\xf2\xa8\xa4x" -"\xd4\xe5\"\x1fr\xccMh8B\x7\xe5\x1b\x37\x86\xcbW\xb2V\xda>\xf9\xb6\x83\x64\xfc\x10" -"\xce\xd9\xdai\xa0\xfbv\xaa\xcf\x7f\xa4\xcb\xfc\x96\xa8I\xb5\xf6\x10&\xc5m\xdd\xd1" -"\xc4\x33\xe7\xbc!P\xb8\x95yDM\xc3\xa4\x7\\\x86\xa1%\xf1\xb7\\z!\xe1\x8e\xccs1>\xeb" -"N9\x11^S\xa1\xe0y\xbf\x14\xdc\xc4\x12O|\xc3\xdfH\xe6#\xa9\x9f\x84\xddV\xad\xf3\xb8" -"\xc1r\xae(\xec\xde\xc0\x15\x84\xdd\xe1jVN\x98p\x97\xf4G\xa8\x90\xa1\xa3\xb7&\xa5" -"\x91\x86\xdc\xa8\x90\xeb#\x9$\xba\x36\x95\xb7\xbo\xdf\x45\xbd\xc3\xd7\xbf\xea\xb2" -"\xe2\x87\xc6\x8a`\x84\x0\x11i\xce \x8p\xb3l\x9b\xd5\xdf\xe3\x1a\xd5\x7f\x65<\xb7" -"Q\xb@\x19\xe3\x38\n\xcc/\xe5\xa4\x9\xf0W\x0\xf\x14[\xa7j\x87\xcb\xb5\x9c\x45\x30" -"9\xce*os\xec\xc6\xc4t9l\xc4Q6.\xbb\x9dg\xc\xeb\\\xdf\xca\xef\x2<\x1a\xe5\n\xefY\xce" -"\x99v|+\x3\xca\xf\x5\xb8\x9fg\xa8GZ\x83\x6S\xfd\x8c]\xbb\xb2\xad\xdc\xe7{\xdc\x93" -"\x17\xd2\x16\xab\x17\xd5&k\n\xed\xac\xa3\xd1\xc3T\x1a\xaf\x18%\x80k\x8e\xe0\xc1\xe3" -"\x8b\xb9\xcc\xc\xf5K\x1e\xe\xbc\xa3\x16\x87j\xb8|P\xc1\x18\xcb)\x8e\x9e;\x87SCJ\x8" -"\x82\xc4\xc2k\xc2\x8e\xc0\xb6.A \x16\xd4T\x94\x61\xac\x98\x34\x8b{Z\xc2\x1e\xe5I" -"H}\xc_\xbfg\xe7\xdf~l\xde\xc4\x95\xe3LV\xf1\x8fK\x87\xdf+\x97\xab\xe\xb8\xa6\x43" -"\x2\xbd\xef\x9b:b\xf2+\xfd\x17!\xa3\x88\xf6\x5\x37\xd6\x83\x13P``\xef\x1dJ\xe5\x92" -"\xe7\x84\x83\xd4\x2\xe\xfb\xf3\xbbM\xb2\x2\xbc\xfdN\x2\x9d\x84\x86\xaf\xdb\x18W\xb6" -"\x89\xc4\x65\x61i\xd1\x66W\xadj!=I\xd7\x9c\x93\x39\x32\x9a\xe8\xe4;\xbb` \xf9;\xfd" -"k\x94\xb1\xa5LD\x17HoY\x8*\xa3ht$\x96\x10/:(\xad\xd9\xe7\x8eT\xd2\x66z\xde\xe3\xec" -"\x11\xa2\x4\x85\xeb\xbeO\xf5T\x7f\xca\xcc\x12\xf6\xc5\xc3\xe5\xe0\xf\xbdm\x4\x61" -"\x9b\x81W\x8c\xe\xa3\x33\x85\xfdU\xff\xd1{CW\x82\xcc\x90\xe9\x46\xdf\x81\x1a\xba" -"A\xe9\xc*t\xea\xc2V\xa0\x90\x1d\xafN6\xa4\x1bi\xe8\xbaq&x\xa8_\x8f\x8\xb\x8d%\xc0" -"\x0\x1e\xe9\xb4\xe6\xf3z\x9c\n\x81\x44\xae\xb\xff\x97\xbf)3\x95\x1f\x88;4\xd3\x3" -"<^\xeb:^\x8\xeckw\xb8\x82\xfa__\x1ex\x8b,w\xa5\xf8\xb4\x9f\xc9\x83U\xd9(M\x16\xa7" -"hh\xae\x89\x12\x84-\x99\xca\xff\xb4(\xfb\xae!\xfc\xc1\x19\xaf\xf7\x9cm\xf\xb6\x91" -"gms\nOW#>\x1d\xee\x94\xe9*\xd5\x1\xae\xd9\xd9\xd3\xa6\x92!vC\xc4=9\xb3\xee\xc1\xc8" -"\xa6\xfd\xe1\x9\x95\xc3\x66\xaf\xd3*Z\xe3\x18^ X\xd0\xfc\x8f\x16\x64\x64\xe2\xfa" -"t~\xe9\xa8\x91\xe6\xd8\xbe\x33I~\xe2\x2\xdc\x38\xe5\xee\x19R\xdeq\xfd\x98\x65r\x9f" -"\x1c\xd1\xad\xa9\xf7\xae\x38\xc8\xfb\x17\xdakfx^\x91\xf9l\xb6?\x9f$@\x7\x85X\x14" -"R\x91\x36\xba\x9e\xd1\x1a\xb2 \x16\xdd\x95\xc7\xa2\xbb\xce\x9dh\xa1\xbb\xe2L\x8d" -"\xa0\x9\xa0;\xaeG\xb0;\xda@H\xb3\x1bT\xa4\x18\x81\xf6\xe8OrLG\x9bp\xe4\x8f\xdegt" -"\xbd\xbd\x1\xc8\xf8\xc2>'\x19\x85\xde\xbe\xe1\x39\xc7z9MJ\xb1\xe4\xfc\xbb\xb9\xe0" -"\xde_~\x7\xc8\x9f\x87\xd2\x8e\xb5\x8d@\xd4)H\x96\x8f\xf9\xb6\xbe\x9a\xcfY\xcc\xf4" -"e\xd5\x93\x8d!\xedm\xa0/E\x88\xf5=\xe2\xa6\xa9]v\x8\x9b\x8cm\x8cLK\x8f\x8c\xd5\x84" -"i\xa3\xb9\\~.1\xcaW\x82x\xf3\xc4\n\xc9\xf3\x65\x82\xdd\\\x44\xfa\x39\x93\xd3\xce" -"\xef\xe9\xaf_\xa7zi\x85\xf8\xa6\x7f\x93\x43\x98r>\xc6\xa3\xd9\xf8N\"Y\x93\xcf\x43" -"\xb0 s\xc5\x1a.\x1bn\xeay,\x16+\xe3s\x91\xc5\xdf\x63\x84{\x91>&@\xc2-b\x99\x15\x9b" -"\xf1\xec\x11\xe7\x86K\x12\x96\xdf\x8e\xea\xaa\xe8\x92\xcc#\x94\xc8Yng'\x8f\xce\xaf" -"\xd4\x41\xe3'75\xc7\xe3oZ\x95\x88\x30~\x87\x6\xa2>3\xc5S\xb3\x84||\x1c\x96\xb6\x1b" -"MC?ff?/H\xa0\x9c[\x8c\xc6L$L!\x8f\xf7\xa1\xb1{\xd9+\xd7\xe3\xe5\xab\x66Kx\xa2m\xe8" -"eD\xba\n}@\xd0\x81\xc7\"\xcb\x12p\xf3\xa1\x7\xf5\xd0{\x0\x9c\x14\x33\xa3\x9e\x61" -"\xe6\x89,\xd7\xbe\"\x82\x0V\xc\x38\xfcU\x8f~\x84\xbe\xb1\xf4\x0\xffK\xbc+\x82\xd2" -"/\xc4h{J-\xfa\x41\xad\x99\x84\xe5G\xea\x85\xe9\xb1\xba^@\x14\xfc\x91\x8b\x1\xc0Q" -"\xa4\x4\xfdV\xf3\xcc\xe2\x61\x1b\xe6W\xc\x32\xc\xde\xb9\x94T\xa3\x46\x39\xc7\xcs" -"\xbd\xd2{\x8e\xf3\"\xf0R\xf3\xe5#\x5\x43\x14\xc1\xcd\x13wq\x18u$rW\x16+\x8d\xeb\x44" -"\xfd\x99\x6V!\x14\x1\x1e\x93\xca\x1d\x98\x8eR\xbam\xd4w\xa4\x10\xcO\xab\x8a\xac\x1d" -"\xc8\x31\xba{\xf7\x8b\x34V\x8e\xf9\xae\x46\x16\x61T\x93\x39\xb5\x95\x92\x95r\x91" -"I\x91V4\x95\x37-JQe\xec\x81\xea\xe7\x9f\x8d\x19x\xafs\x8c\xf1\x1a\xa5+\xa4\xc3w$" -"D/\x12]\x19gz\x9c\x0\xe6\x1b!\x85\xea\x39\xc\xd1\xac\x31\x31\xeb\x8b\xa3\x8b\xaa" -"\xfe\x97\x63\xd7R\xad\xab/\x88\x8d=\xc4\xf5\xe3\xf9\xe8\x37h\xb6$$oB\x85$b\xabp\xf3" -"\x5R\x93\xd9\xec|\x92\x98k\xb\x33\x83u\xfcRj\xa8\xab?\n\xe6\x1\xbcy\xbb\x9f\xb6\x4" -"k\xa5\xf4W\x10\xce\x94\xf8\x12\xdfL\xac$^\xba\x8d\x1e\xec\x85\xca\x14\x30\xd1[\x96" -"w\x8e\x83#[\xae\xb0+\xed\x36\xc3\x42!\xa8\n\x61\x91\x65\x8c\x46W\x8f\x2\x61\x46\xe5" -"\xa7\x61-S'#\xff\x2\xc3\xff\x62\x2\x63\xa2\x31\x9G\xcax\xdb\xb4,H\x98\x95\n\x46<" -"\xe0\x7f\xb1!\xee\xce\xde\xf3\xf1\xa5\x41\xe3\x31]U+\xf2\x39t\xff\x14\xa2\xe3I\xe4" -"\\\xea\xb0\xf3\xff\xfaq\xe4\xbd,\xb5\xcf\x9f\xa0\xf1\xbb>g\xe8\x62\xf6\xdf\x9c\xec" -"z*\x89\x8cl4\xeu\x9fP$ \x9b\x32\x62\x90\x8\xfd\x4\xe0\x2\xc1k\xab\xa3PHH\x19#\x17" -"\x13\x9dl\xea\xb9\xbbMJ\xdd\x9e\xbe{\x8a#`\xb2\x1\x33V\xa3\x18\x92u\xa6\xb9\xf6\xc4" -"[\xdf\x1e\xcdX\x99\x8$PNC\xa2\xd1\xe3\xb2\x63\xc2\xf5\x1d$\xf0\xf5I,i\x0k\x6\x2\xd1" -"\x12g\x7\xbd\x6\xd0\x17\x90~\xb2v\x10\\\xe6\x37\x8a.\xd9\x13\xd7\xe1\xed\xa9\xc9" -"\xa7\xb5\x13\x5.\x8\xd0\xdd\xdc\x37\x65\x39\x65\x36\xaa@;\xb4\xac\x8b\x8f\xc2Q\x15" -"\xc2\xb5\x9b}\xfe\xe2\xaf\xa4\x10\xad\xa4\xbb\x16j>n\xe0\x63\xa8\x8e\x8f\x85?\x9d" -"\xda\xc0\xc6\x63\xc\xfd\x38\xb\xe8\xda\x45\xa7p\xb3\xfb\x15\xeb\x65\x8b\xdcO\xec" -"\xf2\xc\xf3\x82X\xbf\xc_\xc2\xbb\x7w\xcf\xb9\xc9\xa5O,6/!\x17\x1elF\xcH\xec\x7f\xb5" -"<,\xba\x8fI\x15\xb5\x13;U\xd1O\xe3\xb7\xf\x95\x13\x8f\x1>z\x14\xca\x92\x90\x8e#\xb0" -"\xd6\xdbW\xfb\xed>\x97\x38\x8\x9c\x7\x1d\x99\x9e\x90\xcf\xdd\xb3\xf4\xeeM\xe5\xf0" -".S\xfd*\xe4\xa1\x31\xf5\xca\x91\xad\x88\xa4\x95q\xb3\xc3\x84\x6\xd0]\xeb\x2\x38\x8" -"\x4\x44\x91\x83\r\x8d[\x80\xc3?\x1fn\x8aL\xa4 w\xf7\xc1\xb2(Y\x8a\xbc\xe8#\xe3j\xe6" -",\x9c\xe7\x38\xe5\xb2&[\x99/hd-\xb9\xe9\xe7\xa0\x81vQd\xc'\xe5S\xc7\x1aL2\x85\xe0" -"\xd7\x80\xfa\x3Q\xdc\xbfh\xb7\x34NA\xcc\x13<'\x98\xaf=\xb2\x65\x9f{\xb7\xbb@\x9e" -"\xaf\xd7'\xd7\x92w\xf4\xd2\xd1.\x8f\xfc#a#\x81u`\x9a\xa1\xa5%\x14\x7\xeb\xba\xb6" -"\xf0\xa0\xf0\r\xa2\xfc\x85\x9\xcd\x8dy\x18\xf\xa0\x8b\x61I\xadJ~;\xd2\xca\x30\xbb" -"\xb1\xb5?5x\xfe\x6\xee\x99\xf6N\x2Vb\xd2\xf0V\xdc+\xc4\xf2\xe4\xd5\xcaP*\xc9?z\xbc" -"+0`3\x4\x95\xf4\x84\xd4\x8e\xf7\x43\n{\xe2\x1\x9\xfd\x8\xa3&\x90n\xce\xf3\nL\xa4" -"\xde\xa9\xe3\xb9\xb4\xf\x8e\xf4\x90\xb9U\xcf\x85\x38\xa8\n\x8d\xaf\xab\xaa-\xc7\xc3" -"\x87X\xef\x1e\xadp\x9do\xe7\xc4\x8c\x80\xf \xbf\\\xa5\xae\xe5GV2Z\x89/\xf5\xf2\xac" -"W\xd1\x98I\x92z\xa0\xb7\xa8\x1f\xd3\xa4\xd0Jz$\xba{A \x8dp\x98j\x6]\xd7}\x89>6\xc5" -"!\x8qB3;4\xf7\x41\xfe\xe8\xb2\xdd\xba\x8d\xbb%\x9b\x62G\x1\x14\xb2\x6\x95\xc1\xcc" -"\xfdy\xbd\xc9R\xd9@HQd\x8c\x94w\xda\x9f\xb3\x44_\x92\x32\x9a\x92)~\xe2\xb4\x30\x5" -"M)\xa1\xc4+l(\x93\x83\x8c\x9a\x95J\xab\x65\x8a\xe0H\xbc\xdc[S\x13\xbe\x91Z\xd5\x9f" -"\xea\xb3\xeao\xf7\xb6\xd9\xd8\x37\xfc\xbc:=\xf7[{\xb6\x18\xb4W\xd7\x10\xc2\xb8_\xa8" -"\xf3>\xe3\xca\x1d\x5\x1fm\xf3~ <\xecV\xb6\x37\xc5\x9e\x8\xc0\xcc\xdc_\xc8\x7\x12" -"\x1d#\x8a]\xc7\xda\xabS\x87\xe5\x95~\xa6@\xaf\xfd\xe5\xc4.@aS~(6\xd4\xd8\x18j\xa1" -"7\xbf\x16o\xa3 \xa2\xbb\x8f\x6\xeaG^\n.I\x5\x43M\xcc*2\x91\xbd\x90\xa3\xfc\xbd\xe8" -"\xac\xd2\x46J\x1fn\xa0\xef\x95\xe\x17\x12\xd5\x9fu\xe6\xeP\xd6*\xda\xfa\x8o\xbf\xc3" -"\xad\x0\xff\x8d\xce|\x7\x43\xa3+\x7\xe9\x38\xd3\xb2\xce\xc0`uV\x86\x4\xae\x12Tfw" -"\x15\x6\x45\xb2\xda\x80\x10\xdd\x9f\xc9\xd2?\xca\x92KL\xe5\xa0\x33`\xe1\x34\xc9\xa7" -"\x9c\xab\x85K\xeb\xe8<\xb4:`\x5\x91\xf4\x80\x11\x4\xa1$\x9f\x31u\xe6Yd\xf8\x37\x17" -"\xd8\x62 0\x9eWQ\x82\xa1\xbc\x33\x97\x87\x91\x9c\x46va[\xd5T\xe9\xe5\xaf\xd7\x1\xd2" -"y\xdc\x92x\x8a\x0\x8eI\xf6\x8c\xf5\x6\xbb\x95\xb6\xa8I\x96&1\xf4\xde\xe2Na\r\r\xb8" -"P\x97\xbe\xb7`\xd8\xa4\x8py\xbb\xb5<\xecUs\x83/H!r\r1R\xa9h\xb7\xc9}\x86\x10\x98" -"\xc0$\xbdv\xca\x13&\xdc\x63N\xdd\nN\x7f\xe2\xac \xc0%\xf9O\xa9 \xb4\xb7ww\xe4vfY" -"\xdc\x35\xf0\x8fw\xa2\xce\x4\xff`~VN`\x8e%\xc8g-HE\x1b\xd4\xbc\xaa\xd2\xe2\xb0@\xcc" -"\xbb\x7f\xa3\x32\x46X\x11\x43\x9_p\x10\xa6\x66'G\xd4\xb0U\xdb\xe7\x9fj\xed(\xde\xe8" -"\xb7\xc0\xa2my\x7\x8fLr*\x2\x10\x9fO\xe9?\xcd\x63\x9c\xb3\x6\x1_\xe1z\\ oc\xf3\x3" -"p\xadIV\xbb\xe7[qK\x16\xcaV\x9f;n\xb9\x92\xd8Zg\xd5}b\xd5\x9(\xe1\x84\xc3m\xe2\x31" -"<=\x2\xd6\xa9\x8f\x16\xef\x36\x17\xc\x19\xd0\x7\x10\x38\xd6\xc9\xd1\x92\xb4\xdc\x1e" -"\xf0\xcc\xea\xde\x31\x13H\xferjP-\xff-S-\x1b\xdc\x36\xc4\x90\xd8\x17\x37\x97`\xf9" -"\xec\xbex~zh0\xe3 =n\x92\xea\x8e&\x8bJ\x82\xcby\x12\x80\x30&\xa6O\xda\xe2\xa0\xa2" -"\xb4\\\xf7\xc3T\x93\x11\xb3T\xce\xdeGs\xa8z@oW\xa4n\x11\x41\x36h[c\x17\xc9\xf3\xc1" -"&\xbe\xa7\x38\xd4s\xbb\x33mp\xed\x30\xde\x16]\xc4\x1a\x99\xab\x9c\xfc\xe1\xb\x62" -"\xa9},\x13)F\xffM\xf8\xf4[vP\xe7\x11\xcd\xbe\x9aJ\xc3\x46\xd6\xbblD\xa5\xe8!Kv\xc8" -"\xbf\xa9\x97]k\x8t\x88\"\xa5\x86\xa8|\xb0\xa8\xb4\x37\x9dw\x85\x87\x94\xc9)\x1\xf9" -"\xdc\x14\x61\xd7\xf0\"\xb4\x64\x1b\xa8\xd5\x46\xc0OQ3\xf3Z\xbe\xd3\xf1l\xd5\x37@" -"'B\x3P\x3\x38\x8b\xe9\x1e\xf5\xc8\xd7=\xcf\xd7\x1b\x42O\xb2\xc7\xc1\x9e&\xf5\x45" -"\x11\xb3\x8a\x13\nt\x89\xe1\x9et7*\x1d\xb5\x3|\xa1\\=\xc3l\xfa\x66\x1b\xcc\xb4?\xd8" -"\xd9V\x9d\xbf\xb9mA\xd3\xb7\xffW\xb9n|\xbc\xe6\x10\xb1\xb7\xb1\x19\x82;\x3\x2\x35" -"/.\x16\xa2\xde\xc8J\xaf\xbd\x92\x0#\x8ex\xe7\x19\xae\xb8\x9\xbb\xe5\xf0`\xf2n2\xd4" -"y\x9eH\xf2\x65@[Gc=\xbdTr6\x4\xa6S\xbf\xe5h\x17\xc8\xfa\xbd\xb8\x34G\xc6\xc\x96\xc3" -"\x8c\x91\xb4\xc0\x82t\xc\xb6\xac\x66(\xf2\x84wRa\x80\x31\xce\xd1\x9e\x30\x62Z\xd9" -"\x1e\x88#\\\x9c\x8\x83%\xbe\xa7\x66\xa2\xac\xdf\xd7\xc5\x13\xac\x97'=WT\x4\xb2h<" -"\xe0\xa6:\xe3\x6\x85m\x82\x80\x9a@`\xb0\x62\x93\x18\x1n\xb2\xd2\xcc\x9f\x83^)\x9d" -"c\xc6g\xd2:\xb0{T\xfc\xc9\x44\xe0\xd8x>\xd5\xc7\x35\x36G\xba+8Y\x13^\xa2\x84\x45" -"\xb5wS\x90Z\xb5\xb1NP}\x90N\xd1\x1a\xc\xef\xa5\xaf\xc9\xe5\x12\xf3\xed]\xb\x44\xe5" -"\xe3\xf4\x90\x87Sa8\x8fz\xf1\xa7\xf8\xddD\xf0!'\x80\x64|\x96\xb3" -"\x88\x85\x9a\xd8\xb5\x97\xdd{\xc\x33 \x12\x82*j<\xbc\xea\xeb\xf1\x1d\x37@\xac\xbd" -"\x1\x87\x9\xf4\x8f\xc1t\xc5\xb0,;\\\x14\xfa\xec=\xa3\xe0\xce\x8f\xc0\xfc\xee\xb5" -"\xc7\x35\xf4\xc5\xa3\xe2\x9\x6\x7f\x9r\xa0'\x1\xb8\"\x85\x10\x1d\xec\xdf\x16\xf7" -"\r\xf0\xac\x98\xbf\xd7r\xc8\xb6\x13\x65@\xc8`\xe\xa4\xee%\x80T\x8d\x98#\xb7}\xfd" -"B\xc0}m\xe9\x8b\xc6\x99Tz\xe4\xec\xc6\xe3\x43+\xbb\x8dyq]6[PI\xc5O:\xc9%x?\xca@\x92" -">\xba\xdf\xc8\xb8\xb2\xfb\xdf\xd1:\xd4[\x5\x61\xc8M\x8f\xa1\xfd\x5\x88\xae\x15K\x80" -"\xb6T\x84\x44j4\xe6\xde 0_\xa4\xee\x97!\xa4\x10'\xb3\xd6\xc5;\xfbg\xb\xa9\x13Y\xbd" -"\xef\x4N\xd4\xc8\x1bu\x8dM\xef\x9c\x44\xb2\x1b\x9>\x87\x9c\xb5\xa3\x84\x61\xb3L\x8c" -"\x9bGmp\xf8\xde\x2\xe6\xde\xef]\x1f" -"\xec\xb0|\xfc\x1]^\x3$\xd7\x1bn\xd7=&\xf7u\xfd\x9c\x98_p\"\xa6\xa6\xbc\xb2\x8a\x1b" -"H\xd3\xf1\xa5\x95\xefo\xce}\xa6%\xf1=\x9cP\xc5\xb6\xe1\x1b\x61\xe7/\xa4\xcd;J\xf1" -"\x15\xfe\x10|\x8b!W j\xc2\xdd[\x8f\x46\xac\x90*\xd0\xa2\x16\xbf{(\x9bi\xf8n2\xb9" -"\xb1\xe3\x63\xea\x35[v\x81RR3m\xab\x44\x31\xbc\xe7G\xc6\x66\xdb\xf8R\xb6\x46\xcf" -"\x1:#\xa7\xef\xd7k(\xd7`\x87\x32\r\xae\xb5:\xf0\xd8\xae\xf8Y\xc8l\x9dO\xe2i\xac\x8" -"\x95\n\x46_0\xef\xf0\x7\x31\x9e\x61\xd7mQ\x83'\xf9P\xcc?\x2h\xf2L\xb5[v\x8e\xa0]" -"\xa4\xcbs\xdci\xe3\xd9\xbf!\x9b>Y\xbe\x45IZ\x10\xa4\x31Q\x98\xa7\x46\x84?\x2\xdf" -"\x13\x6\xe9\x63\x13H\xd4p\xd7\x34\x34'\x81Z\"+\xe8\x11\xb4\xb8PzL\xa1\x37\xb7\x13" -"S@\x1c\xa0g\"\xa6\x95\xda\xe0\x46\xcd&%\x8d\xbbm4\xc9\x18\xa6\x1I\xa7\x33" -"\x81\x61V\x14\xa8/\xeb\x1a\x0@\rU\xb8\x6\xfc\xbb\x1a\xa8\x30\x37\xf1\xd9=TI\x5\xd7" -"\x99aO(\xf9\xd9\xc2w^\n\x1c\x46\xd2\x46\xec<\xe\\p\xef\x98$\x1bH\x80\x82\xa5Sf\xc2" -"\x2\x81\xcaoZ\xd5\xbb\x88\xde\xcd\xed\xa4\x92mN\x17\x9w\xdf\x91Q\x1a\x8f\x61\xcb" -":\x9e\x63\xdf\xfd\xa5\x39z\xado\xd3\xb5\x91\xcG\x13JL3|\x4\xd4t\x13\x41/\xfe\x82" -"\xca\x84\xed\xc8S\x1b\xa1\x1f\xeao\xf7\xb6\xd0\x0\xb4\x98\xc1\\\xe5U\xa5\x11\xc3" -"\x8c^\x84OSs\xc3\xce\xbo\x88#tRr\xbd\x46\x30QsU\xf6)\xfd\x42Gi\xb2\x88\x41\xf2\x99" -"\xfa\x65\x1b\x39\xe4x\n\xc5\xc\x9e\xee\xf6\xab\x14!\x0~\xa1\xf7\xc5{\x8e\xfe\xa7" -"\xa9\xae\xd8Yx\xd3uJx6$\xf2\xa9'\xc1\x0\x8e\xd3!\xd6s\xbe\x1d\x5\"\xa0=\xe2\xaf\x3" -"~23\x90\x14\x32WT\xfa\xaa\xb\x61\xb5\x14q\xde'\x81\xcb\x3\x1`\x85\xa2MZ!\xb6\x32" -"7\">l\x9aJ_u.\x9a|\xe9\" \xff\xa3\xeal\x9aZ7\x7fk \xf4]\x13(\xe0oTiE\xdc\x1f\xc4" -"\xf3\xc8ZbU\xe2\x16\xe1\x93\xd7\x39!\x90\xc0\xcew_\x86\x8\x4\x13\x13\xab\xf\xe0\x5" -"\xecJ\xd0x%C<\x84_\xbbja}b\xcd;%_r\x82\xb2hp\xc1\xa5I\xbd\xb2\xe5\xcf-\x13\x9a\xbb" -"\xcb\xf0\xea\xa0\r\x62\x1b=\xb0\xd7\xbfYU\xf9K(4\x13\xbb\x89\x30r'D=\x96\xed\xbe" -"-\x9a\x98\xd7VDP|\xa9\xbf\xac\xcd\xab\x84g_%\xed\xf4\xda\xe\xba\xcb\x43\xda \x9b" -"\xc\x12L\xb7\xa2#\xc6:\x89_\xe6n\x14\xd0\x2\xd7\x15\xadL\xfc\xec\x9f\x3~hdI\x84\xd7" -"\xc]\xe3\xe1\xafNG\xa4\x94\xdb\xc6\xbb\xde\xb7\xc1\x1d\xf0\x90\xbc\xe6\x1c\x39\x37" -"v\xf4\xa1^[J\x1a\x89\xd5\xe7\xbc\xdb]\xbh\xc5\x12\x91\x8c\x64\x2z\xd9\xb0\xb\x33" -"\xd1\xd7\x7\x9a\x97\xf8R7\xdei\xedO\x0\xd0\xa4\xe\x9d\x42\xccG\xa1\xa6\x8e\x1b\xec" -"\x9dM\xa6\x8d!\xc2\x99\xa9\xd9\x8ay\x9b\x91.\x4T\xa0\x18\xc5\xeb\xe\xc7\x9fKO3\x9e" -"\xbc\x88\x9c\xb9\x1a\xeb\xbf\x12t\xcc\x18\xa8(\xb7\x8f\xb\xb9\xb9\x88\xab\x95\x3" -"o\xe0N\xac\xfe\x3\xa2\xb3 \xdc\xb2\xce\x8a\x88\xb1\x87\x65\r,\x9dS~\xd4?\x3\x85\xb0" -"\xd9\xe9<\x1a\x7w\xf8>\x14\xa6\x8O'w\xe3\"\x9c\xfe{ns\x94\x10\xd5\x12\xf5w\x96\x1c" -"R\xbaS\xac_m\xc4\xc2\x1c\x15\xdao\xb4\xb5\xa7\xc0Po\xd4\x94\x37\xabM\xbc-\x93\xa6" -"\xf2\\\x41i\xed\xbc\xbb\xf3sG\xb0P\r\xa0p\xedO\xe8%/\xadj\x16\xd0\xbc\xd2\x1a=\xd5" -"\xcc\x11T~\x2\x6\x99\x0_l\r\x10\xa3\x1eP\x1a\x42\xdeiW\xf7\xff\x0x\xd7&\x93\xe8\x8f" -"\xd8Q\xd6o\xb4\xb1M9{\xa4\xd8\xd4|\xfd|R\xe7\xf1\xcb\x42_\xa0\xfd\xc9\xe0\x16\xb9" -"\xd5\x17\xe6\x32\x10\xdaL\xed\x81\x42q\xbd?\xdb\x90\x82mC]T(f`\xbc/h\x1d$3\x92\x45" -"rJ\xfdr\x1coB=\xee\xc3\x37l\xdb\x12\x1eu\x80\x88\xa5\xbf\x38x@\x92\x45\x1c\x80\x36" -"\xb8\x95|}\x90\xed\x1f\x5\xf3\xc6Rh\x4w\xca\xcay\x5\x1dY3\xfe\xc1\x61-\xca\x62\x95" -"P\xbe\xad\x99\x9f\xcf\x6\x8b\x15\xc2\x0\xe3\xc6(/\xa8T\xd0r\xa7\xeeZwhF\x88\xd4\xc2" -"\xab\xc3\xda+2d\x84w\xb4\xf3\xfa\xe1\xc1\x1d\"\x89\x84\xef:\xa3\xffm\xf7T\"\xa5\xdd" -"\xed%\x8d\xd6\x8c\x83\x6*\xf9\x39\x63{&|l\x11\xdc\xb8\x44\x85\xadrE\x88<\xa6\x84" -"b\xa6\xfb\xb8-.\xa2;\x3\xf9 zX\xa4\x18\xcc\x80\xf0\x97`\xaa\x10\xdeG\xcc\xc8\xd8" -"\xe2>Lq\xd3\x8\xe3 \xf9\x93\xf1\\[\xe9p\xd9\xa8\x8er\xf9\xf1_\xe\xa2\xca\x5L\xdb" -"\x8cw\xeeo\xec\xcb.\xb2l\xd6\x11\xaaJb\xdcr_=\xcc\xe6\xba\xd6\x91\x41\xaa\x32\xf9" -"\xe3\xd4\x19\x39T\xe8t\x5\xf8\xc3\x37)\x81m\xde\x1b\xc6\x1b\x94?\xb4S\xcf\xda\x98" -")\rl\xc0\x96\xe5L\x2\xc8\x1c\xeer\xb8\x9enK\xb7\xb0s\xeeJ N\xa9\x35\xfd\x9a?\xaf" -"~\xa0k\xf8\x0\x92\x83\xe5r\xad\x3\xb4\x88\x2)\x19\x11iro&\xa6\xe6\x15\xd7\xdfh0&" -"\xc2\xa6\x88\x34\xf9\xcf\x1a\xd1\xbe\xb9q\xfaVf\x7\x66\x38\x81ZV\x90\xbc\x1e{\x8a" -"\x7'\x8b\x83\xc4\x87#\xca\xfc\x93\x64\\\xf\xbe\xc0\xe8G\xe6\xbb\xfao;\xe5\x9d$\xf1" -"\xd2\xce\x9a\xea\xac\xf2\x9c\n\x35\xa9\x98\x8d\x92)rM,\xf3\x9c]Z.\x1N\xd2\x14\xad" -"\xca\x33\xcb\xc1t\xf3?I\xf1\xd0G8B\\\xfe\xb3\x99\x46\x14\x8d\xba\xe9\xfe~ \xb\x64" -"E\xad\xbasD\xa9\xcas\xd2\xd4\xe7\xff\x38\x10\xb5\xa2\x5\x10\x96\xd5\x12w\x91JI\xa0" -"`\x9b\xab\x8d\x3\xf9\xfbp\x9b\xfd\x87N\x98#\xcd\"\x16\xf3\x9a\xd3\\\xc7J\xdd\xc8" -"\xf1\xb0\x4\x32\xa1\xf1\x90$\r6v\xe3\x34\xd6|\xd3=\x98\xb\xa1g\x95\x15\xf0\r\xf6" -"i\x8e\xfd\xa5\x2.\x81\xd2\xfa\xa8\xc6\xdf\x1b\xbd\x1c\xb2;gyh\xb0V9c5\x1N\xf0Rt\xe0" -"\xd3(\xe\x9bU\x2\x94)\xfd\x64\xa0\x9\xc7\xf6\x1f\xefR7(\n9,>@?\x9fY\xcaR\xa4\xf6" -"\xce\x81\xa0\x7\xb5\xad\xecvX\xe1:\xe9\x8d\xc9\x46\xbbze\xb0\x12\xb1!u\xb1\xca\x88" -"\xbc\xba~g2\xda\xe1O=>\xd5\xdeXm\xc9\xcel\x99X\xb1K\x8dY\x87\xe7\xe2\x2\xef\x36\xb9" -"\xfd\x1a\xc7\xb6\x8b\x41\x9c\xe3:N[\xd0\x14\x41\x63\xe4\x65\x31\xa9k{\x8\xf5\xc6" -"V\x1\xf9\x9\xdb\xba\x19L\xec\x9a\xcb-l\x5\xc4'\xe5\x7\xff\xf0\x45\x3\xb9\xae\x8d" -"\x15\x97Gs\xba*\xb8\xc5}S\xa3\x10>\x1e\x6\xf0\xd4l\xc7\xd2\xa7\xda\xd3L\xf7\x63/" -"\x3\xe3=u\xab\xe*\xd9\xbbI\xb\xaa\"\x90\xb2\x8/\x99\xde\xb8\xb9\nS\xb2\x0\x1?\xfc" -"\xd9\xe^\xf2\x82R'VTM\xaa\xe4\xae\xf0[\xbe\xa5\x94\xc6S0\x17\xa3\xb1=*\x8\x32\xce" -"-\xbb\xc8Ts\xc2\xd8#)y\x80\xc8\x44\xf1\x13\xab\xf5V!h\xa8\x16\x9d\x15\xb5\xf4\x31" -"\xb1\xe5R\xbd\x64\x45\x17\x33\x98q\xb7\x9f\xc9\xc1\x9\x2\x1c\x3\x4\x91n\xec\x88u" -"\xcd>\x5\x2\xc1\x9b\x89\x43\xfa\xff\x42\xf4'\x81U\x94x&eV\xbc\xcbT\xe1\x64\x44\"" -"\xdf\x8f\xe6\xb7\x46\xf4\x11\xe9r\x8c\xe1\x9d\xd8*T\xe0\x13\x9e\xa3n\x85\x12\x34" -"hz\x8a\x30+7\xf5\xe2\xb9\x14H\xaa\x8f\xcb\x1v\x0\xb6+ET\xc6>\xe9s\xe7\xcb\xec\xac" -"\xef\x61\x64\xd0\xc3\xf7\xd4X\xe0\xc6\x8\x99>Y\x8\xb7=\x80\xeb\xfb\xf6@\xd9>\x94" -"3!\xda\x36\x83\xca_Ccb\xf0\xfa\xb7\x42\x65\x41]F*\x13\x63\xc7\xf0=\xe1{ \xb3\xcb" -"\xcd\xe7\x5\xe3Z\x8\xd5Ko-[\xa4\x9e\xd5:\x89H\xa6[I\x93\x1e<\xd4r\xae\xe5\x35\xb9" -"\x1b\xea\x1aK\x3\x7n9D1\xb7\x1a\xa6\xe\x33\xa7=\x82\x88\x87\x17\xf5\x63t\xa0\xc5" -"`\xea\xe6\xff\xb5MH2!\xfc\xf6\xce\xdc?\xe9&z\xdf\xdc\x62\xa8\xa1\xa1l\x9cP/\xe\xdd" -"\xb6\x1cyn\x94\xec\x94\x95\xca\xc7|\x18\x30\xf6\x6\xbe\xev\xe5\xb3\xcf%\xbey\x90" -"\xfc\x8a&\xe5\xd6\xcd\x10{\xc2\x42\xf0\xa7\x85\x9d\x31\x34Ws\xc2\xfb^\xf2\xe2\xc0" -"\xe4^\xdf,\xc3\xbc\x65(\xe0\x19zTL\xd1\x8f\xc5\x80_30\xb.']\x8a \xa6\xdfT\xa9\xe2" -"\xa5\xfbt\xf5*\xacu[\xaaV]\xc7\x33\xe3\xc1\xe3\xe1\xec\xf9;r\x9e\xe0\xd8\x64nO\xc8" -"/\x99k\xa6\x97\xfb(\xe5(\xf9TS#\xc2\x1b\xa2\xa4uI{\xcb\xd3\x66\x8f}_`n\x88\xbc\x86" -"\x90S\xe5x@\xe8\xc4R2\xdeM\xe5\xfd\xaf\xff\x6U48\xbf\xe8\xb4\xc1\x41\xe8\xe2\xfa" -"\x96\x42\xfd\xdd\xba\x65`\x97 y\xdb\xebN\xa5\xb4\x1a\xed\x16^E,v\xcf\x83\x8d\xc0" -"N\xddI\xc7\xd6\x6i\xd2\xba\xc5S\xbd\x42\x44\x38\xe2=S$J\"OX\xffW\xe4\xc8\xcc,\x1b" -"\x9eS\xaaL\xb4J\x8e\xc3\x10\x42\x61\x62hS\x9d\x85\x8d\xe9p^/6\x4\x1\x9c\x1en\xbc" -"\xf1\xcf\x9eH\xb.P\xd4&\xbe\xac\x87\xa2\xc8\x86^\xc9q\xd8\x84\xb2K0B\xa8\x1c\xe3" -"a.}H!\x18\xa5\xdf\x38x\x6\x85\xed\xc\xe6\x61\x84\x4\x89/A\xda\xcb\x38\xd0\xb1\x81" -"\x91G\xfa(t\xd6:2\x85l\xc2\x63\xa2\x94\x66$\xe7=\xd5\x38\xe\x10\x42&XB\xb9Z\x1e\xef" -"\xac\xd6\x1b\xed\x8d\xe4\x80\x45\xdd\xeeK\x0G\xa1\xef\x64\x15\xd0h\x98\xbf\xbe\x2" -"\x81\xdd\xa5\xb5\xee\xaf\x81\x16\x9*B%\xe5i\x94\xc7\xae\xaa\x32\x7f\xee\xc9\xd2\x82" -"\x93\x37r\xde\xf7\xf7\x9d\xc9j\x1c\xa2iz\x9e\xa5:\xa6\xe2\xa9\x39Jb!\xb6m\x9d`1\xf4" -"O\xbe\x86\x9b\x34\xe\xd9\x8f\xd9o\r B*;\xbhc\xd8=\x99\xd6g+\xef\x9e\x87\x11Kg\xfd" -":\x1d\xa8\xd6\xc9_W\x14\x10\xf\xa6\xe2\x97g'\xb9\x1\xb\xa0\x65{\x1e\xd9NI\xc7\xcf" -"2\xbb\xf1\x65'\x8\x17\xcb#\xda\xae\xe7\x4\xaf\x64\x88q\xce\xd8\xc9\x16\x87t\x91\xc8" -"\x3y\xb6\xc5\xb3M\xe8u\x8f\xdc\x35\x5\x12\xa8\xc8\x43L\xb2j\xaa\xe5!\xc1v6\x90};" -"%\xc2}\x10K\xf1\xf7\xf3H\x6\xb6\x2\x33\xb3\x10\x7\x1d\x96\xbep\x8e\xd4\xe6\xb\xb2" -"\xdd\x90\xa7]\xe6}\xa6h/\xe8\x37\x97K\xa4\xa8U@\x8b\x9\xac\xcf\xa8/\x1c \xf2#K\xe7" -"-F\xca\x3\x2\xf3\xcc\xca\xf6Y\xf7\xc9\x62\xe8\xe4\xec\xe4\x39\x1b\xca\xe4\xc1\x6" -"B9Bf\xf8\xd4\x61\x13\xefHx4sO\xe6\xb1\x7f\xb8\xc\x0jK\x6$9\x7G}\xca\x88*\xf2'`\x9e" -"\x16\xd3;\xae\xbb\x66\xc9\x1fw\xf7\x94\xb8H\x92[\x9b\xcb\xff\xec\x7f\xda\x11\x8f" -"R.\xc6\xe8\xe8\x4\xe7\xf9\xbd\xbb\"\xed\x90\xe8t\x8ao\x8d\x8@\xa7;\xd2\xdb\x4\x98" -"\xe9z\xb9I~\xf7\xa6\xe2s0s\x97\x9e\xcey\xcd\xd5|~\x80\xd3\xdc\xd6\x1\x65\xcc\x36" -"\xab\x88:\x99\xc7W\x8c\xbb\x1\x85l\x93\xad\xa1\x90\x8c\xec\x18z/$\xf\x98\x44Lp\x7" -"\xc1\x7\x36\xf4q\x15?G?\xb5j\xa2H0\x14\xf7\x8b\x96\x33S/;\xb1\xf3\x9cx\x8e#\xf4\x9" -"\x6s5\x83\xae\xa4\xc\xdd\xd2\x91>AuTv\xea\x8R$I\xa4\xab\x8c\xdew\xd4v*1\xae.\xc8" -"\xa1\x97zi\x7f\x98\xeep{\x1cH)+'Nx\xber\xc3\xb\xe8\xa6\xcd\xae\x9f~\xb8\xadq\xe1" -"\xcf\x62\x1a\xd3\x9f|X\xc2.}\xc7\xa5t\x93\x43h\xedVU\xbf+\xca)\x17\xed#i\xf3)\xa0" -"5\xc5\xf6\xeb\x1d\x32\x11\x43\xcf\xc9\x97$^7\xd9\xce\xf9\x4\xed\xec~\x16\x9cN\x95" -"\xc2\xa0\x64J%x\xa9Y\xc8\xb9\x8)\xb9\xc8\xd8\xeb\x43\xbs\xd9^\xd9\xfe+\xda\xd7\xb3" -"9\xec\x10\xba|!\xe1:\xa8\xcb\xa2\xa2 ]T\xbb\xee\x39x'\xdd\x1c=\x1\xda\xfd\x0J\xed" -"\xfa;\xc3\xc\xfd\xeb;(7u\xef\xc9\xed\x1b\xb9\x37\xb8g>\xd5\xe1\x36;\xec\xe8\xb7\xf1" -"vGX\xa7\xa3\x94\x83\x83\xa2\xfe\xdd\x86/\x93\xb0:$\xc9\x41\x84\xb6\xd6\xac>oG\xe8" -"\xe6'=\xcf\xca\xa5|\xc0\x12\xf0\x44\xa6\x19\x4\xefn=\xa7\xfc\xc3,-n\xff\xac!\xec" -"\xf8\xc8?5d\x18\xe3\n\r'\xcb\x83HV\xa2\xa4m\x83tH\xe3\\\xd3\xd9\xfd\x18\x1fl\xb4" -"\xfd\x61\xf8{Q\xb3\xa0\x6\xa3\xf2\xe4S\xcb\x99\x99\xdf;B\xc4\xf6\x80\x1f\x46>\x16" -"k\x1eP\x12R\xbc\x7f\xd0\xe3\"\xcf\xb|\xa1\x39\xdeHR\x13\xfe\xf8\xb3\x34\xad$\xe6" -"[\xc5\xcb\x66O\xa6\xea\x81\x98g\xf5W\xc8\xa3\xdd\xe6\xa6\xb0\xfc\x8d\xd7\x5\x18*" -"yW\xa2\xe2\xc\xe\xfe\xa5\x8e\r-\xff\x1a\xa7+\xbd\x99\x1dr\xea\xb2@\xf6\x96\xbc\xdd" -"\xd1\xa9\xb4\xf7\x9c\x45\x87V\xde\xce\x8a;d,}<\x8cr~\xad\xcc\nq\x3\xcbMG\xa5\xb1" -"\xfb\x90=\x11\n\xea\x5\xcf\xb2z\xa4\xe3\xf\xbd|wc\xec\xdd e\xceN\xf7\xcf \xcc\xcb" -"\xaf\x37\xee\xa6\xa3\xe4 \x1aSW\xcdLO\xb8s\x16\xbc\x32\x3\x87\xc8\xd1\x12\x7h!\xe4" -"2\x1dL:\xbd\xf0\\\x8d\xc4\x62/\xf2Y\xa3\x32~\x90\xf6\xdf\xaf\x43\x9bo@E=\xb1\x8t" -"\xcb\xe0\x8a\xf2\xec\x84\xa9+\xa7$0k\xfb\xf7\x17\xdc\xcb\x9a\xbc\r\x66\xe8\xc2ly" -"+(\x83\xf5\x89'\x5\xcf\x96\xc2\xecT6Mh]\x4<\x4\x14x'\xe0\xc3pzX\xb7\x94y\xcd\x35" -"\x7f\x11rV6\x17\x41\xf3H7z`*-\xa0\x10\x33\xdb\x13\x14\x38'y\xde\xe0\x89\xc8\x8a\x36" -"\x85\xa3\x1d\xe3\xe0\xda \x8f\xa7\xa6\xfc\xdeO\xf1\x9c.O\xf0\x8a\x15\xaf/\x1c\xf4" -"\x12\x9fh\xdc\\\xc0\x44\xeb'\xd1\xf\x1fk\xc6\x93P\xc5\x8d\xff\xc9p\xa3\xdc\xe9Z\x8e" -"h\x8^@5\xe1Tf\xe8\xc5OM\xcf\xa4m\xd8\xd8\x9ci\x3\xc4\x9a\xd0\xef\xd7\xdb\x9b\xb7" -"\r\xa3\x8d\x12\x19\x86\xd4\xf0\xdf\x97>\x88\x15\x83\x87\xba\xc2\x6M~\xd5\xd8\x35" -"\x1c\xad[\xf7\xbc\xec\xd4\xf4\xa9'|\xe9\x34w\x9d\xdf\x8e\x32I\x7fX\xb9~\\\xf4\x41" -"`b\xd0\xb7V\xb8\xcd.\x9a\xea\xb2\x43\xed\x37\x66\xc9\x41\xc2,\x99\xcd\x35)\x9d\x18" -"^W;\xda\xeS\x0;W\x89\xaaoj7:t\xafN\xf9\x6\xc8\xc5\xcc\x41\xec\x33|\xd3\xfa\\\x1d" -"i\xa2u\x13\x9f^\x9d\x9d}\x2\x92\x91v\xb0\xfb\xe0\xfe\xec\x2\x44;H\xec\x33\x35\x9a" -"h\x10z\xb9\xe2M\xf7\xe1\x30`\xe1\xc3\xb3\x93\xc8\x15\xb2\xa8\x1a\xdcW\xcf\xce\xab" -"\x98\x2\x42\xbbq\x8\xf9\xf9\x13\x92&0\x92\xdf\xb8\x9d\x35\xf0\x36\xbe\x14\xb5\x9f" -"\xa6\xbc\x36\xcavF\xd1\xcf\x8\xab\x87\"\xbeg\xd1\xb5r\xba\xbc\xe2\x66\x32\x8f\"\x9c" -"\xe3\x2g\xafK\xb\x36\xb5\xc5\xef\xff\xb9Q\xe9\x1c\xcaH\x11\xa2\xc1\xa0L\xf1.\x9a" -"\xb7T\xa2\xfd\x6\xa3\x98\x88\x12*$JD\xa8\xbfR\xda\x16Uz\xebJ\xed\x91\xa6\x86\xfd" -"st\x1c\xea\xbf\xef\xf6\xdb_\x9b'\"\xd4\x61\xef.\xe4<\x19\x8\xb5\x30\x90\xe7\x46\x16" -"k\xce/\xab\xf0\xfb=`\x8\xeftY\x90\x9b\xd8\x88\xf0T$T\x1f\x92t\xda\x33\xd9l\x83Y\xf3" -"\x96\xbf\x34~a\xec\xb1\n\xc0\xbe\x33\xd2'\x16\x2%\x82\x16z\xc9\x9c\x8c\xcenj+\xf1" -"\xa3*O+\xa6\xb2r\x5\xcf\x9f\x97\x65\xb1\x7fz\x9bI\x86\r\xfb\x9d\xba\x18\x12\xd8L" -"|\xae\x90\xcc\xc0\xac;\xd9\xd9\x17\x1f`yL\xf9\x5\x61:_\xa1M\xc7/R\xa0l\xdb\x33\x1d" -"\x14\xfa\xe1\xe\x3\x93\x63\xe5\x11w \x86\x46\xc2\x18\"\xf2l{\xb9\xd5\x87\x86\x97" -"\xbf%\x9e\xd4\xf4\xc6\xf4\xea-\xcc\xa4o R\xaa\xc2\xd3\xe2\xad\x1x\xc1\xd5\x15\xd1" -"\xa5\x92&\x8c\xe2\xa4\xcb\xc8\xe4\x81\x13\x42s\x19\x84\x86\xbv\x85t\xe7\x1a\x1c\xa1" -"C\xe1\xc3\x38\x86\n\xa0.\xdb\xf3~y)\xc\x89\x32\xb4)2\x3\xf7\x96" -"\xe3\xa7U\x90H\x19\xcf\x1f\xc1\xf8\xcc^\x87\xd1\x9e\x65\xb3\xb9\x16\x8b\xdd:|\x7" -"\xc8O9\x0t$\xfc\xc6:^\xe2y\x82/\xb2\x3\xa7`\xec\x89\xaa\x8fG\xc2Y\xb9\x1ey)~MV>x" -"\xb8\x1!\xa5\x34\xa6[\x2{\xe6\xc4,\x82\xcd\x66(t=\x81\xb\xa4\xff`>\xdasn%\x83\xf8" -"SjjZI\xde^$\xdc\xa8\xb7\xfc\xf2\xd8\xe2\xb2u\x9d\x42$\xbe\x65\xcbz2-\xf\xce\xe0\xaa" -"+Zq\x87\xa0J\xaf\x44\x91\x9f\x93\xe\xd4\xddP\x9d/<\x3\xd8\x17\x42\x34t'\xa3\xcc\x46" -",\xea\xd3\x43\\\x62\x19\x8c\xb9\x7\xfeXiF\xa1\xc6\xce\x44\x46\xd9\x9\x8f\xf8\x37" -"\xab\x61\xa8\x12V\x10\x96\x9\xd3n\x86\xe9\xf\x10\x63\xf2\xa6\xab\xe8!\x83`\x5\xb1" -"\xa1\x8d#~\x98\x9f\xcf\xdd\xd7K\x1d\xd8q{\xf4T\\}\x18\xa4\xb3\xe7\x8\xd5" -")\xbe\x18=\x7\xe2\xb\x30\x0T]\x92\xc9\x82U\xb8\xe6\x46l\xc9\x9y\xf7\x8f\x8e\x66)" -"\r\x96\x9f\x99Q\x8I\xf\x8a\xb2\xaf\xe5\xf8\x9f\xa9\n\xb0\\WhS\xfe\xd0\x63}\xefk5" -"h\xc6\xb3\xceT\xac??vt0\xc4\x9c\x95gf\xc7\xbd;\xfcl\xa3\x16\x88P\xe3/O\x8e\x65=\xe3" -"\xa3%\xa5\x15S;0\xc5\x8a`\xc7\x99\x89\xd8\xdb\x33:%\xe8\xc1I\xa6\x16\x30z\xa3\xb1\x84" -"w\x11\x99\xcb\x16\x37\x83\x7\xf1\xde\x39\xc9\xc0\xb0\xbd\x8e\xd6\x1f\xd3\xf7\xf7" -"<\x87\xc1\xdb\xfa\x7\xc1\xa1\xc7\x1dv\x95\x89\xb8[l!R\xe\xe5\xc\x80\xe4j\xe3\xae" -"cP\x9b\x93\xc\xc1[\x11\xd2\x83\x1fQ\x4\x61x\xf4\xce\xb3\xc4]MP\xbbp\xae{Y \x18\xd2" -"\xed\xf3\xe1\xc2\xc0z\"\xa9\x16\x15\x30G\x8d\x1blw|X\xa4N\xe4\xa4\x92\x80!:\xe\xea" -"\xcf\xc8\xfa\xe1@\xdc\xc7\xf1\x43p&\x93^\x97\x82\x94\xa1_\x8b\x31S\xaf\xf7/\x86\xfc" -"\xd7\x11H9?,\xfa$\xfa\xf0\x10\x13\xf8\x41\x95G\xdf/\x2_\xd5}\x1d\x5\x45!\x9a\xf7" -"\xb7\x9d\xedh\xa8\xd4T\xe5\xce\x99\x1e\x81<0\xe0\xff\xd4t\x92k\xa5\xc4\xb4\xef\xe1" -"\xd6\xcb\xbd\x7f\xd2L\x5U\xdf--:\xdbL\xd6\x13%\xa5\x64q\x9f\x44\x62\xb0\x96\x38i" -"\xf4\xb\xf1\x9d\xcbW\x8e_\xee\xb\x39\x9\x9\xde\xb9\xa3\xf8\x90~,c\xac\xc2\r\xa7\x30" -"m\xd1\x37\x15o\x10\r\xb4Z\x1b\xc8\xc0I\xe9\xd9\xbf\x1f`:\x86.:q\x81\x4\xb8';Y\"\xec" -"\x9\x8d\x34\xce\xa5\xf8|\xd2\xe\xf2i\x18'l16;\\\xc6\x44\xa1\n\xbb|\xbc:\x3\xeb\xd2" -"\x18\xf2\x64\xc5KK;\x7\x17h\x99\xb3\xfq\x1e\xfb\x80\x65T\xa7\xb5\x83?>\x3]\xf5\x45" -"tW\xe1_D\xf1K\x99@=T\xbat\xe6\x18?\xee\xed\x19\x14[\xff\xbf]/\xf4\x80\xe1\x9c\x61" -"\x9f\x61\xab\x92G8\x9f\xed,\xfa\x63\x85\xf6T#\x8b\x34\x99\xf8\xe3q\xe7\x17Hr\xa0" -"\x9e\x93U\xd5\x99q\x9b\xc6=\xc7\xb1\x86\xf5J\xc8\x35\xbf\xa4VN\xe9\xd1\xa7\x0`Y\xbe" -"\xe0\x4\x8c\xf8\xee\xc5\xff\x1d\xe9\x86x\x8b\xc3\x66\xdf\xf7\x11\x93\xe\x1c\xc5H" -"\x90\xe6\xc8 4\xed\xd8L\xc1\x5\x66\xdfW\x95\xf3{\xe6\x9a.e\xeb\x10\xbanL8\xe0\xad" -"\xcf\xd4g\xc3\xa3\xa3\x16\x97\xc2\xdaQ\xc5\x35\xcd\x61q\xae\x8e]`\xaf\xd1\xda\xc1" -"\xd9\xed\xeb\xf9\xfd,\x8d@\xa4\x81\x4\xe9\xbe\xfe\x9\x65\xcb\xdc\x8e\xb0-b\x99\x13" -"a\xb4\xa1\xacv\xf6O\x83.\xd6\xff\xdc\xa5\xbc}W\x3{\xb8\r\xae\xc5\xd8\x91Y\x1b\x80" -"\xdf\xf0p\xdd\x1b\x99\xb4\xfb\x8G\x8e\xb4\xe8\xb3\x2\x4\xa9\xb9\xe4\xec\x33\x10[" -"\xae\x9d|\xde\xd1\\h$?~5\xc2\xeb\x43\x8e\xf2\xe1\xd1\x10\xb3\x18\xb2\xc8\xf0\x8a" -"\xe8\xed.[k\xdar\xd8r?~WH\x12\x80\x95Ou\xa8\x15\xe1o\x1c\x61\x43\xef\xeek\x87\x9f" -"\xf1MV%\x1b\xd9~\xd8\xe6\xd9\xb6@\x82\xc\x91\xd7\x65s\xc8\xe5)\n\xda\x9d\x31&\xe7" -"k6\xcc\xd6q\xdb\xdc\xc9\x1f_\xa5\x18\xeagv\xf6\xe7\x42\x82\x11<\x0\xa5\xb4z\xcc\x30" -"\x17\xb6\x9b\xcc\xb8(\xbb\xa8\xe1x\x1a\xa7$^\x11hh\xa5S\x5\x30X\xb\xfd=Q\xe3\xd4" -"\xbfr\xef\x94\x10\x46\x91\xe4\x8eNV\x8d\x43\xb3\xa1_\xcb\x9f\x91x\xd8\x88g\x7\x34" -"\xec\x99\x5\"\x66\xd6\x62\x37\x9a\xc4Z\xe0I\xf8\xea\xfe\x1f\xbc*\xdb\xb6\x14J\xba" -"\xf4\x62\xb1\xb6\x97\xc9\xde\xbz\xba\xe4Q\xa1%N\xf\x1a\x2\xd6\xcf\xc8U\xb3\xb\x1a" -"\xcd\xf6p\xe7\xfe\x6\x1a%\xfe\xb1\x94\x45\x45\x8a\x8d\xfe|\xab\x9f\x86\x62[:\x9f" -"`\xc2*\x13\xc1G\x92\x92O\xd0\x3\xd4Q\xcd\x1d\xc1\x41\xfb\x91\x91J\xa6IjF\xfd\xaf" -"\xdd\x8a\xdaT\xe8\xbdk\xd5\x46\x2\x5\xbf)A\x1e\n\x90\x8d\x10\xe7wn\xd2\x1f=p\xa2" -"*\xa6\x39\x9bX\x9e\x3\xee\x1e\xc9\xe1\xa3\xcf\x8a\x30\xff\xd5Wf7\xa8$g3\xb9\x1c\x1e" -"\xe8\x15\x36\xa2\x9c\x89;L\xcaq\xc5\xe1\xf5\x90\xb\xe1\xec!\xdc \x1b|\x3\x32\x2\x45" -"rY\x9f\x3\x8a\x84$\x18,\x9a\xb6\x0\xb2ik\xeb?\x10/\x9\x90\xe7O\x90\x63\xe1I\xbd\x63" -"\xd3\x18u\xfdo\xb6\xc7\xe0^\xc9Z\xf4,\x11\xa2\xe8z\x96\x36\x1\x35\xed\xe4\x86\xb5" -"<\x82\xf4^\xb\xc5\x14\xc2\x85k\xf1\xd7\xcd\xc6Nz\x84\xefHbM\xceV\xa0\x37\x8e\x12" -"\xaa\x0}\x93\xb0\x43k9`\xae\xaf\xf\x87\xeN\xc0;\x8e.2\x83\x41\x9ap;\xfeI\x9e\x63" -"Mw\xe3\xc7\x8\xdbT\xe8\x96j,Y\xafr\xd2mf6\x17I\";\xa0\xaa\xe5\xea\xca`\xbJ\xe\x13" -"ei\xfeZA\"\x1b\xe~\x83\xe5\xea'\xde\x7f\x86\xee\xf2\xfc`\xdd\xc8\\\xe2Y\xc5xQ\x10" -"P\x12\xd5\xbaq\xa8&Wnl\x9f\x44\x62\x35\x43\x65\x1bn\x1f\xba\xc2,o\xf4/\x9c\xe9\xe8" -"\xe9\xd6-\xad\x9P\x12\x10\x2\xd8\xdb\x8f\xae=\xad\xb8]!\x8b\xe8\xe8\x85k!\xd0Q\\" -"\x8c\x7\xd5\x1e\x1c\xb5\xb\x87?\xc5G%\xe2\xe0\x31\xd9\xad\n\x18\x8\xdc\xe8\x9b\xe2" -"\x94\xf4\x10\xa0\xb0\xfc\xe\xa8'\xee\xd4W\rs\x1a\x66\xae\xb4\x7f\x9f\xf4\x0\x97r" -"\x92\ns1\x19sk\x9b\x93\x11~(\x6\x1fOxe\xf3\x90\x34\x18H\xcd\xbf~\x98\x6\x86\x7f\xec" -"\xab:`o\x9f`\xdd\xcb\x1fq\xe6o\x86\x87gE\x92*9\xd0%\xaa\xc5\xe5\x84?\x99\xbcwd\xb8\x1c\xde\xa5\xf2\xfb\x1f\xc3" -"\xff\x34\x87\x8c\x62P\x86n1\xd3\xf7\x97.\x85\x18\x4\xaa\x64\x1a\xa3\xa4\xc9h\xc3" -"\xdf\x0\xc3\xe3\xa6\xa8?*\xcb\x90\x95\x97;n\xef\xe7\x92\xb\x7\xe6\x82mm;P\xa4\xb7" -"v\xb5\xf\x9f\xfa}G\x1c\x35\xc\xaa\x1c)\xeb\x9d\x93gD\xf5\xe5v2TO\xc5\xa4\x36\x63" -"\x0\xee}\xb1\xa1\x96\x8a(\xc2\x64\xad#\xed\x30\x5u\x90_i\x98\xf1\xd4\xa5\x1e\xfc" -">\xee\xca\x46\x82\x13\x82M\x3^\xa7\x83H\x8d\x94\x39\xb3\xc9\xb1\x92\x37\xb1\xe2:" -"\xc0\xff-\x8c\x37\x97qk\xb6\x61\xb4\xde}J\x10\x80\xf0\x92\xa4\xb8m\xdd\xaa\x65\x35" -"\xe4\x96\xe9P\xc4\xdd\x13\xe3\x8c#\x81+>\xd6hR:\x1a\x82\"\xe8\x44]\x82Yw\xf9\xe4" -"\xb1\xa2\xeb:\xb9\x33\xd3\x88\xd6\x97`'\xf6\x94~\xc3\x37\xfe\xc7\xc2\x66}\x95\x17" -"\xfc\xe6\x8dU\xf7\x91\x96\xc6\xf5\x1f\x9b\x8et\xad\x90\x1\x83\x9e\n\xfb\xdb^P]a\x10" -"\xdav\xa2\xbe\x32\xb\xbd\x17v\xe7\x89\x84\x66O!\n?N\x86\x37]P\xdb\x12\xd8\x9d\xfe" -"\x5\x8f\xe9\xceS\x3\xf1\x44\x9a\xcd\xb4\x85\xbb\x16\x45\x81\xa1#\xd9\x35\xe5t\xe5" -"\xc4\x92\x36\xcc\xf9\x6\xc8\x18\xb2\xee\xe7v\xc0\xdb\x45g0\xb7U\x7\xdcR\xf6\x8c\xb9" -"\xc6>\x9a\xf0\xdc\x36\x1\x1e\x1b)\xd9\xb4\xcb\xbb\xff\xc3\x9e\xa4\x82\xa0\x1d\x80" -"\x83\xe4\xe3\x19\x91\xc5\xb7\x92\x85R\x14\xb5\xff\x1a\x86\x82W\xa7n|f\x6\x8d\x32" -"\x15\xaap\x9bXf?p\\\x8a\x9d\x37i\xe2)`\xda\xdb\xa3pO\x7f\xe5\x36\xf0\x86\xd7\x8f" -"\x9f\x14\x9d\x12\x62JS\xc\xbb\x30<\x8a>\x13\xa3^g\xe3\x97\x46\xe9\x66iwH\x92\x42" -"Y]IL>\xcc\x61\xf9;K\x94J#\xc3\x62\xe9Q\xd2\xde\x86\x6\x16\x39@\xd1\x96\xb8W\x9b\xaa" -"#\xf7\x62\xeaG\x14\xe2H3\xe4\xaf\xa1\xb6\xd2.z\xbb\x8c\xd1\x1f\xa4\xaa\x83[\x9a\xf6" -"\xdf\xa6\xc1o\x99\xd9\xff\x9=\xb8\x94\xe1\xd0\x8X*\xec\x4\x8c\x43>\xe5\xaf\xb\xf6" -"\xe2\x12/\xf4\xca+\x15zE\xe1\x8fJ\x91\xff\x8e\x66\xc6\xc3\x19\xa0\xf7\x7f\xa3\x82" -"\x12\xb\xda*!{\x83\x5{\xf1\x9d\xac\xe9\x86\x84&\x14t1\xe5\x88\x1c;&6:\x9\x8a\xf3" -"a\xb9\x96\x66\xbf)\xb7\xe1\xf6\xbfO\xf2\xeg\xab\xf3\x19\xea\xf4\xb3\x41]P\x94\xba" -"\xd3\xbb\xeb\x35\x1c\xb5\xe0\xfa-\x8\xf1`\xc4MQ\xect\x83\x10z\x19\x19L\xb1\x44\xe6" -"\x9d\xdf\xf4\xd6kF\x2~\x9c\x65\x61\x33z\x6\x44\xac\xac\xcb\x99\x88W\xf\x9f\x95\x9b" -"\xf8\xca\x43\x87\xeb\xd2\xb6\x66\xe9\xda\x96\x42\xc3p\x5\x5\x97\xff\xf6\xd0p\x18\xee\xc\x9a\xa0<\xb4\xab'n\xe" -"\x15\xb7\xa6\x8\xd9py\x16=\x8f\xb2Q\xe3}\xc9\xed\x82/\xe\xe3\xe5\x82\xdcSG.\xe9\x97" -"\x91\xef\x96tH\\\xe9\xaa\x81\x92R,\xb7\x15\xd4\xa3hc\xee\xa6\x92\x97\x13\x91\x3\xfb" -"\xdf\x1bM\xa7\xce\x9e\x13\xa4\xd5\xe4|JQ\xb2\x42\xfe\x94\xbaI7\xaf~\xba\xfc;#'\xe9" -"9\xed\xf1\xf8\xc3\x9c\xe9\xc6\"\x61\xbc\x12[\xfc\xaf\x46\x61\x36\x46\n\x8a\xbdt\xdd" -"\xd3\x45:\xdbhla\x7\xe4\xd9!\x99\xa3\x8\xa0\xf\x94\x5\x97\x41\xaa\xfd\xb\xa8\x92" -" \xae,\x97/<7DR\x8aU\xd9\xb7H{\xbc\xae\xb1\xc5uv\x8e\xda\x14\xe7\x64\xd5\xe6\x86" -",G\xfd\xcc\xc\xbe\xb0\xa0\x14\xec\xbc\xff[4\xaa\x8f\xc8\xfb\x38\xab\x35\xba$\x83" -"\xf1\x42\x15\xf6\xabs\xfd\x12\x34U\xb8\xe6\xdc\xcd\xa8\xe5y`\xdf\xd4\x9c\xca\xd4" -"\x91\x8ei\xb1\xd7W:\x7\xff\x80n<}*1\xc6\xb8\x18=4U\x87\xf\xf0\x1b\xf4\xa2:,,\x10" -"n\x81\xcd\x9e\xa3\x84\xc8G'\xa1\xa1<`j\ra\x81\xdd\xbf\xf4\x1b\x1P;\xf9R\xad\xd2\xc6" -"\xb\xf1\xf9\xe0x\xf0S\x87\xb7\xc9\x1b\x1f\xc9\xfbN!\x99\xf5\xf6<\xae\xc3\xe3\xa8" -"\xd7\x30\xca\x33\xba:\x89\x65\x38\xc0L\xd5\xedt\x9c\x87\x9f\x33\xdeXoi\xd8\xc6\xe6" -"\xeb\x1e\x93\xac\x80\xb4\xb1\xb1Lp\x9f\xfZ\x84VW\xd2\x80py8\xfd\xfa\xbf\x33\xfb\xcc" -"\x85\x81\xfe\xb9\x99\x8ds 7D\xae!\xb3!*>\xbe\x87\xc1\xff\xff\x18{\xa4\xbdt\x8e\x94" -"\xb0\xec;\x9bhV\xb2\xd9\xc8\xb2\x8d\xd3\"\x10\\\xf5\xe\xaa.t\xa0_\xa1\x98\x87\xd2" -"\xf7\x9TK\xe4\xf7\x13N\x8\x85\x36\x1e\xd5\xb4\x13\xdes\x4\xceK3#z\xf4&\x98\xd4;}" -"\xa5(\xb6\xa1\x15\xf5\xb9\x9a\xfa\xad\xf8\xb5\x85\x84\xf7(\x2\x9\xc7q\"9,\xb4g\xa3" -"\xa5\x31\x1d\x64\xb2RP\xac\x42\xf7z\x15\xb5\x83\xadq\xb2\xf2T\xdd\x16\xb6\xc4\x33" -"\xb8]\x88\xb0\x81\x12\xc7\x97\xe1\x9bt\xd2\x35\\\x12\xa6\xb\xe1\x4\xcb\x8a\xb6\xda\"\x90\x33g\"\xf5\x87\x38\xd6n\xbb\xa6zJX\xfb\xa9" -"/\xba\x96\xec\x15\x5\x94\x38\xf8\xef`\x81\xc6\x7fl.\x1d\x8bQ|\xc5\xf\x3\xfe\x15\x1c" -"\x8f\xb\xfd\xefr\xab+\xe0\x14\xa2\xbe\xf\x62v:ly\xdc^8\xa1\x90\xe\xa9\x8e\xfc\x31" -"\xa0@A#\rW#X\xefm\xda\xc5y\xe\xd7\xb\x34\xc8\x1eK:\x93\x84\x9e\x38g\\c\x8e\xb9xZ" -"ZNonb\xf5\x99\xbc#S\xe2l\xb1G\xceZ:t\xa9oB\x9b.\x94l\xf8\x1d\xa1\x90&\xc9\x95\x1f" -"\x8a\xdbZ\x5\x8f!&\xf6\x8b\x33\\\xd3Jg\x12n(\xae\xaa\xa9\xe4\xabW\x8c`E\xa4v\xeb" -"1'3\xb3}\xe4\x1e\x13\xa0:d\xa3\x2\x9b\xe5\x30\x33\x19\x83\xa8\xf6\x9d\xb3%\xca\xd9" -"C\xbd\x44\xdb\xf6g\x18L\x1b\\\xbeq\xa0\x1a\xfa\xef\xcav\xf0}\xbc\xcc\xb9\xfb\xd6" -"\xb9\xd5\xe2U\x7f\x8a\xe5J\xfd\x82l\xa6\xbb\xc6L\x5\xad\xac\xca\xbe=Z\xc2\xf8\xe4" -"D\xbb\xc8\xe6\x65\x65\x31\x33\x1d\x36/\xab\xdf\x91x]/\xe7]5NS\xfc.\xb1\xefv\x10\xac" -"\xafm\x1c\xa1{\x9b\xcb\xdf\x8d\xdb.\xbb\xde#\rk%m,k\xcc?AZ\x87+(\xdf\xb1xT\xd3RG" -"KIc\xd8\xe5\x14>\xd5n\xd7\xae\xdb\x94_Q\xf8\x97\xa5\xe9;\xd2t1\xbd\x61\x44*\x88\xba" -"\x4\x2\xec\x9d\x1aS>H\xbc\xc\x8c\xf9\x8ej\xb2\xb1\x9\x38&}\xbd\x15I\x6\xe1\xba\x12" -"\xe\xde\xfdH\xe2X$6[\xab\x1b\xcdH\xbd\xa4\x64\xdc\x88#\x7\x80\x35\x81ymD\x98vA&c" -"\xa2\x9a\xe2\xd7\xc1\x64\x9|\x99|\xfd\xeb\xac\x31\xe2m;\xbcT\x1fS\xe7\xa5\x18\xec" -"\xa9(\xd3\x9b/\x81\xbe*\xc1\x7\xa4\xfc\x80\x8fg\x84\xec\xf9\xed\xb7\x10\xbb\x6\x5" -"a\xa3\xec\xe4\x82\x42\xc6\xc4\xcx\x94\x30|\x1\x9dT\x11+\xa3\x46\xf4\x13\xdb\xc2\xee" -"\xbb\xaa\x8e\xab\xfe#NFH\x81\xacR\x3\x36\xa3x\xb0Q~\xb2}\x80\xe\xdb\x7\x1a\x32zz" -"C\xb1t\xb\x9e\x45z,\x1e\x8\xc4\x8N\xdfk\xc5=w\x1\xab\x63\xf\x38y\xb8\xd7\x90\x15" -"\xc3_\xd2\x94\xe9\xd4Y#\xc2\x88\xad\x9\x45\x90\x95\x80\xe0\xa4\x32\x3\x4\x8rw2\x9a" -"\x9\xf1\x95\xc5\x1e\xd3\xf7\xae\x39\xf4\xd7\xd3\x12\xb\\\x13\x31&\x1d\xfe\xc4\x17" -"\xe4\xd6\x85\xe1\xd0\xe5\x6\x8e\xd5\xf4\xe7\xb6\xaa?\xe8\xb9/\xa4\x64\x45 \xcb\xb" -"0wp\xcfI\xcd\"u5aK\xacy\x9f\xd7G8~\xb2\"\xdb(\xb4;HW\x8cK\xd6\xcf\xa5\xea\x8c\x91" -"1!4c\x93-\xf2\xe8\x9\xc4-\xf4V\x83\xf4Gt\x14\xf4i\xf3\xadg\xe5\xf\x36\x45\xe9\x42" -"6\xaa\xd3I\xa2\x43\xd9\x1d\xcf\xb9\xcG\xd7\xc6\xa2\xb\x2rMw\xed\x8M,\xa9\xf2\x1b" -"\x8z(\x82t|RG\xfc\x94\x9e\x1b\x90\x8\xbe\xdd\xb3wN\xe9_\xb7\xf1)]\xc9=\x9dzi\xcd" -"\xfb\xbd\x38]\x4\x19\xbe\xc4\xa0\xd0\xd8\x82\xff=\xd2\xe7G\xb2\xee\xaeil\xa1^4U\x81" -"\xec\xd1\xf4\x34\xe\x2\n,=\xa3\xda\xd8m.{\x9eO\xbR\x9aw\x8a\xf3\x37<\x9f,\x4\xb9" -"\xc1Y\xa2\x35\xb0\xdc\x10\x9b\x2\xa8\x6& \x3\xb3\xb2\x45\x32\xc2\xbc'\\\x80\xb5\xd6" -"\x8c\x10 %\xd9\x43\x3\xc5X\xc0\xe8\xbe\x9bt\rcX\x90\xe5\xdaX\x19/\xe1\xf8\xa2\xe7" -"/%\x1b\x9b`|\x5\x61\xbe\x33'\x8bL`\x15\x33\xd8\xdd|9\xc4\xd4\xf5\\P\xf2^Jk\xa6{\x17" -"\xb4}\xe7\x8b\xfb\xcb o\xaf\xf3\x9c)\xfeu\r\xd8\xaa\\\xea\xc8\x80\xc5`c\xc9\x91\x64" -"\xd0\x8a\x82\x65\xb3\xa5P\xf6@\xff(\x8c\xe3TH\xc3\xf7\xe2\xf1\xcbz\x1b'\x92w\xcd" -"m\xb0\x91\x43\xa7\x42\x16O\x9f\x88\xca\xf9\xbe\x8\x9am}+G\xa0\xf1|L\x12\x99y\xca" -"\xa8\xdf\x95\xf6\x62\x1d\x44\xa2z\rN\xa0L\xc0\xe8\x17\x89\x4\x98i\xb2\xa6\x35[3!" -"{\xdf\"^}:$\xe9\x80.(\xe5*\xfa\xbc\xb6\xd0\x9b\xd9\xe\x82\xb7Z\xbc\x97r\xeb[\xa0\xcc\x92\xa6\x7\x91\xfe\xafSL\xa5(\xe5(\x1e\xc3\"\xd5" -"\xddH5\x5:\x99\xee\xfd\xb3\xcc\xc4\xa3\x84R\x13\x11\xf7\x8b\xda\xf2\xbe\x0O\xf6\xa8" -"\xcd\xe3\x83\xd6\r\xd2J:\\\x8f\xf9o\xd0}\xe5\xac\xec\xfa\xe9\xf3\xcd\x8a+8k\xad\xb3" -"O\xfc+\xb9m\xb6\xf6\xd6\x81T\x91}3c\xd8U \x8dI\xef\x64\xa1\x8b\x89\xc5\xc6\x9f\xf6" -"\x98\xc9\xd7\xfdQ\xf9\x46\xcd\xd1K\x6\xe7\xb5\x9e&\xa1}QM\x4\xb1\x17\xe7\xde\x65" -"\xe6M\xe6\x9f=\xe0\xc0\xf\x16\xfc\xfe}\x96{d\x9c\x8dY\xbe\xc9\xac\x1d\xc\xcf\xc1" -"\x7\x9d\xb4J\xdd\xe9\x2\x11\x63\x64\xb6\x1a\x90\x45\x87\x5\xb1\xf0v%e'R\x94\x98\x97" -">\xbe\x9b\x8c\xc7G\xceu-*\xa3&6&\xccj\x0\x36\xc3\xf5\xe0\xf\xc7X\xae\x19\xb7\xc3" -"\xfbT\xd6\xeb\x8d\x1c\xd1\xbdU\xf5!\xfnu\xff\x9b\xcd\xda\xd5\xf5\x8d\xce\x90\x1b" -"NP\x1f+\x85\x64\xbf-\x8b\x85\xcb\x34G\x10M,\xfd|\xdb\x86)\xa5>\xa3\xdb:\xb1\xd4\x8e" -"d\xab\xe7\x35\xee\xa6\xf8\xf1\x62x\xffN\xff\x64\xe5h\xd4+_\xca$\xcd\xbc\xdd\x81\x5" -"\xaa\xc4^I\x10\xb4\n\xbd\xb3$u\xb4\x13\xc5n\x1aK\x9\x33Y\x19\x19\x30\xfa\xfa\xb3" -"*\x98jh\xd3\x9f\xa5\x6=B\xceY\xdb\xfa\xa0\x82\xb6\x8c\x94\x6\xa9q\xea\x84\xb0\x63" -"4`\x82\x1b\x11LK\nr\xc6Y\x89\xc9\xaf\xc0\x85\x44\x33G\xfdOo\\\xf1\x7f?\xf5\xb2\x91" -"\xb5Xp}\x8\x31\xb8\xac\xcc\x8e\x38\x80I\xb9\xbfm`\xb4\x3\xca\xd3\xaf\x1d\x15\xd9" -"\x99W\xa1\xd8\xb\x93KC\xd0\xf8\x12\xceTN\xa3\x6\x65S?n\xd8\xc3Z\xa5\xc1\x9e\xf1\xfe" -"\xa2\x93\xda\xfa\xc0\xe7\xd4\x82~{\xa7\xf0gg\xdb\x1R\x11\x31\x43s\x18\x7\xde\x15" -"\ri\xce\x33\x2}\x12\xc3\x46uK\x1eo\xea\xcc\xe9\xb1\xdb\x31\xd9\x1bqO\x90\xf1\x17" -"\x94u\xbd\x95\x33\xf3\x2\xb0\x9d\xb2p\x80\x38\xe6'1\x19\x66\x92\xed\xaa\x98Tz\xcb" -"\x8\xa9\x99\xd3\xbe^\x85\xb2\x9a\xd3\x1e\x1a\x90\xc8\x98\x31\xaa\xb6\xde\x15\x30" -"1J\x2\x62'\xee\xc8N\xff\x32\xe5\x1b\xee\x8\xd8\x19p\xbf\x96\xbfLC\x19\xeb\xe6x\xd0" -"g&T\xe2j:\xfc\xc6\r\x32\x90\x81\x31\x19\xed;\xe6\x34\x2W\x98oV\xad\x32\x1b{\xe2\x65" -"\xd4\x81q\x96g`\xd6\"r\xe0\x46\x66" -"s\nQ\x88\xcc\x7\xc\xba\x1b\x17\xf~\xb6\x46y\xc1\x61\xe2s^E\xe4\xe\x9\x7f\xa0\x94" -"\x9e]\xf7o\r\xf6Z\xc8\x5\xd0>\xe3\x10\x35:\xcf\xf3\x6\xf2S\xe8\x4 I\xcc\xa3\x16\xc7" -"Q\"8\xd6Re\xf9\"\xe4\x38\xf9\x64\x44g\xeb\x14\xa7\xd2\x8d\xac\x9a\xa3R\x5\x93\xaa" -"\xbO\xaa\x1f\xe5|2\xf1^\xf1q\x16]\xb7}4\xb7\x93.\x81\x86\x96/(\x8c-\xd8\xe4\xaf\x1a" -"\xf4\xfb\xdc\x35\x8e\x92\x38\x94\xb6\\\x30\x5G\x93\xb8.\xbd\xe2\xda\xcb\n\xfd/\x9" -"\xd5\x37\x8fZ\xcf\xbb\xb9\x87\x64\xbd\x96\xb8\x37\xe0\x86\x81\xdf\x9\xffl4\x1b\xee" -"\x1\xda\x1a\x65\xd5~\xf1\xfc\xe7\xce*\xcd\x88\xf7(\xce\xf8k\x18\xd1\x65\xc8\xd9\xe1" -")st\xd7H\xb9\xcd{\x18\xc8\x8e\x19\x31M\xfa\xe0\xb8\x1c\x99\x82\xc8\x1b@Bn\xcd\xeb" -"\x16\x14o\xdf\xbd\xd9?b\xe1\xb4\xe3{H\xe6j\xa5\xc6|\xde\x42\x86Tw\x1b<\xab\xde\xbe" -"\xcfW=Xi\x15z\x96\x11:k7\x7fN\xd5v\xc6\xfdV\x7|\x0\x90,M\x13\xae\xbd\xd6\xb\xc9\x88" -"\xf6\x89\xc3\x38\xb1,\x3\xe1\xca\xe9\xca\x46\xa8J\x2\x37P\xfc\x31\x93\x1e\xe7-\x93" -"\xaf\xd1\xc8\xe2\x63\xe2\xd8\xaf\x39\x6\x82Z\"\x8b\x8a\xbb\x94-\xf1\xa0\x1b\xec\x2" -"\xactgynR\xbc\xc6\x1b\x14\xc2\x31\xec\xbc\xa2\xdc\xb6[S^\xfb\xbb\x1e\xed\xf8\x6\x8" -"\xb0\xc8\x8d^\xed\x8d\x0\x96\xae\x9a~%SoPf\x6\x36j/\xd5\x1f\xf7\xa1\xa2\x1\x1b-n" -"J\xbb\xd8\x39\xee\xe7l\xb8\xfdt\xb2\xb2\x0\xd6\x34<\xf4:\xb5j\x93\x9c\xea\x8\x1f" -"\xef\xea\xd2\xdd\xee.\x16GZ\xb4\xfe\x1fR\xc7\x80\xa6.\x88\xaf\x43L\xf8pyg'\xb0\xb3" -"\xb9\x8f\x66\x87$\xe7m\x1\x93\x7f\x9c\xfe\xe7I\xb6\x91t\xbaR\x1d~\xe4V_\xde!}\xc8" -":\xb8\xab\x63\x39-C1\xb9\\l}\x10j\xb4\xa2\xcc\x33\xd4iJ\r\xe7\xde\xf4\x9f\x1cL\xc2" -"uy\xbf\xf5\xa5\xbd<1\xa0\x1\xc]\xf6 B=!\xec\x65\x88\xa4\xeb\x1b\xe0[\xa3}L]O\xc0" -"\x7\xe3\xe7\x3\xc1P\xe6\xbd\xfc\x42gr\xc7&\xe\x8\x9bv9\x97%\xd7\x82\xd4\x37v\x86" -"\xf5\xb4\xb5\xcc\x36\x8d*\xce\xe8I\x11H\xf0\x94\x96s\xe5V\x8bN~\x4\xc2\x37\x31\xdd" -"\xdb\xfa\n\xb\x1\xfd\xedx\"+\xafgM\xc0\xb2N\xc1\x15\x65\xe5\xa6\x1b\x8f\xaa\x2\xba" -"\x9e\x81+\x14Z=3\x9e\xb9(Fk\xe0\x9c\xcd\xc1x'\x8b\xd1\x1f*\x99nxh\xc3\\\x33\x8b\xd2" -"6\x98\xc5\x63\x37\x9a%\xba\x4\x8c\x0\x18\x39\xbak\xdd\x8blK\x87\xb1\xa0\xd7\x30." -"\xebT\xb5\x8a\xaa:\xb2\xca]\x96\xfeW\x96}\xd2mE\xbe\xe7{@\xceS(\xcdQ@w\xdc\xa3\xfd" -"8\x96\xda\xb8r\x5'\xbb\x31\x8f\x1c>\xdf\xc5\x1eU\xf4\x90\xc-\xfd\x87[\xb0\xcaY\xa5" -"\x9d\x93`\x8e\x66\xa6\x45\xe6TW\x11\xda\x37/C0dM\x1e\xc8'\xe1l\xdb\xaai3\xe6\x8d" -"k\x12\x8\x7f\x8dTC\xb5\xeaR\xc1_Z\xef\xcd\xef\x35I\xf7 \x98\x37\x1e\xb9\x1c\xf0\x5" -"\x1f<\x98\x83\xea\xe3)WYNb\x87\xe8\x1d\x87\"\xe8x\xa3`\xa1\xc4\x82\x8d\x3,\xf6\x8a" -"[\xb0Oz\xaf\x65+\xdf)\xa0\xdc\xe\x37\xc6\x8a\x9\xbb\xca\xbd\xcf;\nu\xbb\x1d\x99\x45" -"\xe\xd5w|\xf5\xfaU]`A\xef{\xd4\x8cnd[\x11\x97W\xe7[s\\\x99\xdbnO\x16\x41\x84\x1\x95" -"\x9a\x9d\x35\xae\x4\xebl\xfe\x65\xa4\x81YY\x87\xe4\x1b\x15T\x8c\x93.\xbe\xc1O\xcd" -"w\x9dl\xe2\x9a\xfaW\x8e\n\x82\xb8\x13k\x10\xe4\xd6oLe\x9b\xe4$\x9c\x13\x14\xc4\x37" -"l\xf9\x41y\x9a\xad:j\xefr'\xf5\xec\x93n\x16\xe0m\xe6\x9\xd5\x44R\xd5\\\x81\xb8\x1b" -"\xc9\x36\xf0\x9b\x32\xa6\r\xc6\x1\xaa\xef\xde\x44\xb7W0\xe2\xf3\x83\xec\xdc o\xab" -"l\x92\x9c;\x89\x44G\xa9\xcd\x1cO\x12\x14^\r\xc1\x64I\x2\xa2\xc5\x62\xf4\x92\xby\xc4" -"\x1d\x4\x8f ,\xf3\xe3\xc6$Xy\xf2\x9c\x8c\xd6\xa1\xb7;+\xfe\xaa\x9d\x8f`\x95\x30\xbb" -"|,P\x97\x36^\x8.6\xf2\xacyd\xbXk\x90\xc7nP\xb8\x39\x17=\xe2!@\xba'/!3\xb9\xd9\x14" -"\xe4\x9dh\xbc;lN\xcd\xbe\xb7\x9fznM\xcf\xe5\xc0p\x15TJ\xce\x62q\x8d\x88\x7f\x39\x8a" -"\xabi|\xc3\xeb\xbe\x7fy\xa5\xcd\xc9\xf0\xd6\x9a\x83\xbe\\T3r\xb7U\xe\x45\xcb\xed" -"V\xfR\xafy\x83\x8d\xfa\x32\x92'\x1c\xbd\x12\xc1\x38hA\xb2\n\x95\xbb\xbd\x9\xdc\x6" -"\xbf\x9e\xfa\xabZ\xaf\x16\xdc\xa6\xd7\x93\xfe\xcb\xba<\x6T\xfbR\x89R\x99\x33\xed" -"\n\x8eU\xe3\xef\x14W[Q\xe1.\x17\xf9JU\x13\x9m\x8c\x91\x81?\x80U<\xf2\x1f\xaa;\xbb" -"\x99\x11\xb2\x82\x8f\xd9\xf3n\xfe%\xef\xf5\xe8K0\xed\xf8\x85{\x10$am\xdc+\x19\x9c" -"\xf7lpq\x8dk\x8fur\xd8\xd3\xe0V\x5\xfb\xeb\x1c\x84^6\xa0\xceYRA\xbc\xb9\xc\x35\xf4" -"\xe0\x32\x1b\xb4\x4\n\xd4j\xed\xc4%r\x9d\xa5\x3\xb3R\x16\xf8M\xf^>kZ\x91.\xb8\xaf" -"1\xdd\x8\x1f\xd1\xbe\xf7\\\xad\xf4\xbe\xe8\xe4\xb9\x2\xef\xe2k\x96|\x16\xcc\xa0\xad" -"\xd4>U\x83j\x1a!K{B>\xd5\xc2PE\xc1\xf6O\x5\x8a\xd9\xf8\x13+3\x95\xdd\xe2\x86m\x81" -"\x9\xcQ\xbeW\xbf\xd6m\xb5\xd7\x84#S\xc4Q3\xcf\x4\x8d\xc7\xa3\xd7~E\x9cj\\\x87\xac" -"\xfeT\xa5\xcbiC6s%4\xf3;\xb0[B\x96\xda\x61`6\xe8\x1m\xe\x99\xe8n@=\x4\xe5\xaa\x85" -"\x1c\xc5\x1d\xebn\xf8\xf0\xa0\x42<[\x2\x80\xcb:r\x17\xab@\x0\xbfk\xe3\xae\x83\xf8" -"\xa8'\x82\xad\xab\xc1+/\xb3\x1\x62\x8a\xaeo\x96\x8e^\x3G\x92\xdf\xe5\x39\x83\xb9" -"\xfa\x3\xd5\xc8\xda\xf7m97!\xa1\x8a{\xe7\xbc\x87Y\x9d\x9f!\x90\x9a\xc5\xee\x93k^" -"\xf0\xb5\xaa\x10\xd4'\x4U\xab\x89\xd7\xf1\xba=\x9e\xca\xb8Q\x96\xf2\xd3L\x82\xbb" -"|\xa0\xdc\xfa\xa1Z\xe2\x84\x6\xf2\xfbG\xba\x9d\x84\x8c\xa5\xc4\xcc\xf4\xdfH\xb6\x65" -"y,j\xad\xb\x1a].\xc9u\x18\xbf\x39\x19\x82N\xa7s\xa6\xf7N\x9d\xf8\x94#\xf1Lq\x9d\xd0" -"\xe6\xab\x16&\x83 \xb9\x30\xad\x32IO\xa4\xd5\x64\x8f\x16K\xc0\x9e\x8b\xca\x7f\x19" -"#\xfa\x8e\xa3\x42\xe7\xbe\x87\xec\x83\x1c\xef$\x6wW\x1c\x65\xc5\x36\x89\x61['\xef" -"\x85\x61\xde^e\x95n\x5\x8\x14o\n\xe6.\x14\x9d\x65Zr\x9e'J\x87\x19\xca\xbc\x1a\xef" -"T\x9e\xb6\x80\x8d\x35\xedw\xc4\xc6>cb\xa8\xd8\xaf,\x8c\xd5'*\xe\xc6\x36\xf\xf<1H" -"\x86;4\xbd\xc1\x31v,\x9e\x9f\xce\x81\x96\x14\xabJ\xec\xd0\xec\x14\x8c\x81\xca\xbb" -"h\xf6-#\\\xf6\xb\n\xdd\x1c\xcd\xfaJFB_c\xa7\x63\x3\x39)\xa8\xf3\x62xW\xf6\xe0\xa6" -"6\xbe\xb6\xf9\xc7\xb8\xc6\x8a\xbex\x9d\xe6\x0\xe2k=\xbdm\xba\"\x95U\xbe\xbb\x15&" -"\xa5\x45\x64\xfa\xf4\x85\x12\x63\x7\xb2\xf3J&\x99-\x8a\x9e\xb7\xehS\xf\x1d\xdf\x39" -"\xeb\x30'[t0s{ \xe7\xa3\xf6\xbb\xd9Xb\xf2\x88O\xff\xa1\xddR\x8a\x0\x1a\x63\xcfJ\xad" -"\x88\xf\x89p\x92\x8s\xac\x8e\xf2\xf3\xe8i\xa2\x8d\xbd\xaa\xb4\xc4\r\x88\xbc\x43(" -"=\x89\xd9\xdf\x44\x4\x9\xf9\xcb\x96o}\xba\x90\xb7\x8d=\xae\x89\x13\xb1Mm\xde\x8a" -")\xf4\x5*\xbd\x32G?Sv\xec\x13\xd4\x82L:/\xd0\xf8\x1_\xc9\x66\x15\x39\xfdU\xb2Lm:" -"\xec\x1f\xc7\x9b\xd8\x42\xbbm\x1e'RH\x86\xef\x91\xc3h\xf9l\xb0\xbese\x8\x1b\x62\xff" -"\x8\x8a\x38\x16.\xa0\xfa\x95\x5\xd9\xa0\x9c\x8f\x44X4\xa1\xde\x18]\xe7R\"\x8e\x3" -"\x8d\xcf\x32!a+\xd1\x85\xc3~\xd3\x19\\.E\xb4Y\x8\xb0\xbb\xbb\xb3\xee\xa0I\xdb\xd3" -";\x1b\xa8\x9cm\x3\xe0\xd0\x65]\x8c\xe9\xf8M^\xa5.!;H\xd4*\xf5\xf4:\xc8\x81\xaf-\xcf" -"\x0\r\xa3:k\xf6\x18 \x97w\xd6\xaa\x8b\xe5\xf2S\x1f\xb2\xff\x9c\xb4\x18;\x4\x6\x41" -"\xa9\x9e^\x9\x8z\x89r\x94\xc6\xccpD\xb4\x2\xf5\xb5\xaa\xb3\xad\x43\xc7V\xe<\x8b\xcb" -"G\x85\xb1*\x8e[\x15\x96k\x9cv\"\x86'>\x2M3\x83\xc6\xbe\xd4\x0\x8c\xed\xad'\x9[0R" -"9\xfb{x8cv\xe2m\x98\x85\xf3t9\xee\xa4#Y\xe5\xc8\xf6q\xe2`*\x86\xa0\x97\x9e\xe2\xb4" -"\xf2/\x1f\x8\xb5\x31\xcd\xb8\x10\x9e\xe3\x96\x45\xdf\xcS\x96\x84\xc0\xeb\x15Rh\x95" -"h`'\xd9\xcc\r\xc\xa7\xddl\x84\xa9\x2\x95\x15I\xfd\x10H\xc2\x17}o\xf5\xf1}(c\x87y" -"u\xc7jIa%\xcb<\x5Y\xd3\x17\xc9\x38\xca\x34\xe1\xf1r\x14\x1aQR\x99\x4\xb6ZM<;\x1f" -"\x13\xc4\xe7G3\xae\xf8T,\x98\xdbi\x1f\xb1\xbb\x98\xb1\xabU;\xc5\xe0\xba\xaf\xbah" -"\xb4\x0\x14\xf7G\x86\xcz\xd2\x16Q\xef\x12\xa2\xd2\x34\xc4\xeb\xce\xcbL{h\xc7\xc8" -"\x1c\xe3\x8a\x4\xa5\x8d\xb4}7Z\x13\xe5\x15\xeb\x91\xc7\xff\x33\x17\xf4\xa4\xb3\xa1" -"\xe5\xbd\x7\xba \xe\xfeuyA" -"f\xa4\xb0\x93\x19\x8|\xaa;\xfe\xe5\x65k\xa0x\xf\xc3\xee\xde\xf5\xf5\xf6\x8a\xb2\xee" -">s\xf6\xf4V\xb0\x8c\x6\xfe\x61\x32\xa7\xe7\xcf\x37z\x2\x65\x44\x12\xe6\xd4i\xb1\x81" -"\x1d\xda\xe2\x8f^\xed\x46\x8a\xca;\x8e\xa9\x93|6f\x85<\xd0\xdf\x8c~\x9c\x98\xd5\xdf" -"5\x16\xbf\xbbO\x0\x13\x93>\x8\x65\xec\x98\x8cR\xde\x63\xa0k\x1bv\xd5Oks6\xd6\xcc" -"]Wz]@\xaa\x98\x1f\x13\xce\x82|\xd2\xd3\xbd\x9f)U\xdb\xd4QR\x16\xf4\xb6]\x8\x42\x18" -"\x9d\xc2\x2\xa2Q2\x8a\xbd\xeb\x92\xa1n\xb6]R_\xb9~\xb0\xf3\x10\xce\xab.\xcd\xd6N" -"\xb4\\\xf9\x83M\x95\x84\xe2z\xee\xa5?\xd8>\"f\x1a|\x4\x43\x1d\x14\x11-\xc9\xca^\xe6" -":s\n\xbe\xc9$m\xdeU\xdc\x9kTu@&O\x9c\xd0\xed\x84\xd4 `V\xf3\x17\xfb\x31J\x92-)*\xe4" -"T\xd9\xc6]G\x99\xdb\x19\xeeql\x9dW6j~\x8f\xc2Vui\xac\x92\xd1\x1dR\x99&@\x1av\x4\xb2" -"B}\xb9M!I\xad\x18\x1e\x91\x6\xb4\xcf\x83\x38\x1d\xa0\x63\x87\x90<\x8f\xdc\x17\xff" -"a\xf7\x18$\xf5\x13\xa1\xa3\x18N\x81\x8#\xef\xbd\xe3@_\xb6h\xbe\x9\xb0\xb3\xb8\x0" -"Wv\xe3\xa0\xa0\x8c\n\xae\xa4\x64ROzy\x8f\x1b\x82\x94\xbf\x9f\x3v\x84\xd2\xd8\x83" -"\x1u\xdc\xaa\xbf=L\x1d\x8cW\xc2\x9a-\xc5r\xdb\x8c\x61\xdd\x33\x33\xe0\xbb`kAV\xc" -"\xba>\xd7\xf6\x41O\xbe\x43\x83\x37\x93\xa6\x46&\x1b\x86\xdb\xfd\xa2)\xa9\x84\x61" -"\xfb\xfd\x95\x35\x1aQ\xb6\x81\xccQz\x83\xb'\xb6\xd8\xd1^\xbf\xfcVs\x7\x87=\nB\xc2" -",yOc \x0)y\x15\x17w\xa4\x9d\x13z\x96XN\xe8\x97\x62\xf7\xce\xfd\xe6\x8Z?\xf1\x61^" -" \xc5\xd0z\xea\xc4\x13\xff!\x1d&\xe3\x8b:{\xec\x8c\x18\xcaUC\xdf\xfd\xa4\x85>H\xf" -"\x9b\x8\x7f\xb7\x64\x39\xbc\xb3\x86\x43\xf3v\x96jD\x19v\x6l:\xb8\xaf\x87\xed\xbc" -"f9Yw\xf7$\xd5`\xb\xb5\xe4\x89\xb1\xd3\x9e\x9d\x17V\x80\x1\x14\x2\x0\x0\x30\x30\x30" -"0000000000000000000000000000000000000000000000000000000000000\r00000000000000000" -"00000000000000000000000000000000000000000000000\r0000000000000000000000000000000" -"000000000000000000000000000000000\r000000000000000000000000000000000000000000000" -"0000000000000000000\r00000000000000000000000000000000000000000000000000000000000" -"00000\r0000000000000000000000000000000000000000000000000000000000000000\r0000000" -"000000000000000000000000000000000000000000000000000000000\r000000000000000000000" -"0000000000000000000000000000000000000000000\rcleartomark\n\x80\x3" -; -int n022003l_afm_len = 31926; -char* n022003l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusMonL-Regu\n" -"FullName Nimbus Mono L Regular\nFamilyName Nimbus Mono L\nWeight Regular\nItalic" -"Angle 0.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineThickness 50\nVe" -"rsion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development\nEncod" -"ingScheme AdobeStandardEncoding\nFontBBox -12 -237 650 811\nCapHeight 563\nXHeig" -"ht 417\nDescender -186\nAscender 604\nStartCharMetrics 316\nC 32 ; WX 600 ; N sp" -"ace ; B 295 0 295 0 ;\nC 33 ; WX 600 ; N exclam ; B 240 -15 360 618 ;\nC 34 ; WX" -" 600 ; N quotedbl ; B 146 315 454 604 ;\nC 35 ; WX 600 ; N numbersign ; B 92 -62" -" 508 647 ;\nC 36 ; WX 600 ; N dollar ; B 113 -92 487 655 ;\nC 37 ; WX 600 ; N pe" -"rcent ; B 87 -12 513 611 ;\nC 38 ; WX 600 ; N ampersand ; B 105 -16 478 519 ;\nC" -" 39 ; WX 600 ; N quoteright ; B 135 314 340 604 ;\nC 40 ; WX 600 ; N parenleft ;" -" B 294 -124 458 604 ;\nC 41 ; WX 600 ; N parenright ; B 147 -124 311 604 ;\nC 42" -" ; WX 600 ; N asterisk ; B 113 250 487 604 ;\nC 43 ; WX 600 ; N plus ; B 72 32 5" -"28 530 ;\nC 44 ; WX 600 ; N comma ; B 135 -145 340 145 ;\nC 45 ; WX 600 ; N hyph" -"en ; B 72 258 528 299 ;\nC 46 ; WX 600 ; N period ; B 226 -15 374 116 ;\nC 47 ; " -"WX 600 ; N slash ; B 113 -81 487 668 ;\nC 48 ; WX 600 ; N zero ; B 113 -15 487 6" -"18 ;\nC 49 ; WX 600 ; N one ; B 113 0 487 612 ;\nC 50 ; WX 600 ; N two ; B 84 0 " -"478 618 ;\nC 51 ; WX 600 ; N three ; B 96 -15 499 618 ;\nC 52 ; WX 600 ; N four " -"; B 105 0 478 604 ;\nC 53 ; WX 600 ; N five ; B 96 -15 499 604 ;\nC 54 ; WX 600 " -"; N six ; B 136 -15 510 618 ;\nC 55 ; WX 600 ; N seven ; B 105 -1 478 604 ;\nC 5" -"6 ; WX 600 ; N eight ; B 113 -15 487 618 ;\nC 57 ; WX 600 ; N nine ; B 136 -15 5" -"10 618 ;\nC 58 ; WX 600 ; N colon ; B 226 -15 374 417 ;\nC 59 ; WX 600 ; N semic" -"olon ; B 139 -145 350 417 ;\nC 60 ; WX 600 ; N less ; B 72 44 522 518 ;\nC 61 ; " -"WX 600 ; N equal ; B 51 190 549 375 ;\nC 62 ; WX 600 ; N greater ; B 78 44 528 5" -"18 ;\nC 63 ; WX 600 ; N question ; B 134 -15 487 577 ;\nC 64 ; WX 600 ; N at ; B" -" 105 -62 478 624 ;\nC 65 ; WX 600 ; N A ; B 9 0 591 563 ;\nC 66 ; WX 600 ; N B ;" -" B 43 0 541 563 ;\nC 67 ; WX 600 ; N C ; B 63 -16 534 576 ;\nC 68 ; WX 600 ; N D" -" ; B 43 0 520 563 ;\nC 69 ; WX 600 ; N E ; B 43 0 520 563 ;\nC 70 ; WX 600 ; N F" -" ; B 43 0 520 563 ;\nC 71 ; WX 600 ; N G ; B 63 -16 562 576 ;\nC 72 ; WX 600 ; N" -" H ; B 53 0 551 563 ;\nC 73 ; WX 600 ; N I ; B 113 0 487 563 ;\nC 74 ; WX 600 ; " -"N J ; B 84 -16 583 563 ;\nC 75 ; WX 600 ; N K ; B 43 0 572 563 ;\nC 76 ; WX 600 " -"; N L ; B 63 0 541 563 ;\nC 77 ; WX 600 ; N M ; B 11 0 593 563 ;\nC 78 ; WX 600 " -"; N N ; B 22 0 562 563 ;\nC 79 ; WX 600 ; N O ; B 51 -16 549 576 ;\nC 80 ; WX 60" -"0 ; N P ; B 43 0 499 563 ;\nC 81 ; WX 600 ; N Q ; B 51 -115 549 576 ;\nC 82 ; WX" -" 600 ; N R ; B 43 0 589 563 ;\nC 83 ; WX 600 ; N S ; B 92 -16 508 576 ;\nC 84 ; " -"WX 600 ; N T ; B 72 0 528 563 ;\nC 85 ; WX 600 ; N U ; B 40 -16 560 563 ;\nC 86 " -"; WX 600 ; N V ; B 9 0 591 563 ;\nC 87 ; WX 600 ; N W ; B 20 0 580 563 ;\nC 88 ;" -" WX 600 ; N X ; B 40 0 560 563 ;\nC 89 ; WX 600 ; N Y ; B 51 0 549 563 ;\nC 90 ;" -" WX 600 ; N Z ; B 103 0 497 563 ;\nC 91 ; WX 600 ; N bracketleft ; B 280 -124 44" -"5 604 ;\nC 92 ; WX 600 ; N backslash ; B 113 -81 487 668 ;\nC 93 ; WX 600 ; N br" -"acketright ; B 155 -124 320 604 ;\nC 94 ; WX 600 ; N asciicircum ; B 113 354 487" -" 615 ;\nC 95 ; WX 600 ; N underscore ; B -12 -125 612 -75 ;\nC 96 ; WX 600 ; N q" -"uoteleft ; B 260 343 465 604 ;\nC 97 ; WX 600 ; N a ; B 72 -16 541 431 ;\nC 98 ;" -" WX 600 ; N b ; B 22 -16 541 604 ;\nC 99 ; WX 600 ; N c ; B 84 -16 535 431 ;\nC " -"100 ; WX 600 ; N d ; B 63 -16 583 604 ;\nC 101 ; WX 600 ; N e ; B 63 -16 520 431" -" ;\nC 102 ; WX 600 ; N f ; B 105 0 541 604 ;\nC 103 ; WX 600 ; N g ; B 63 -186 5" -"62 431 ;\nC 104 ; WX 600 ; N h ; B 43 0 551 604 ;\nC 105 ; WX 600 ; N i ; B 92 0" -" 508 624 ;\nC 106 ; WX 600 ; N j ; B 147 -186 458 624 ;\nC 107 ; WX 600 ; N k ; " -"B 63 0 541 604 ;\nC 108 ; WX 600 ; N l ; B 92 0 508 604 ;\nC 109 ; WX 600 ; N m " -"; B 11 0 593 431 ;\nC 110 ; WX 600 ; N n ; B 53 0 541 431 ;\nC 111 ; WX 600 ; N " -"o ; B 72 -16 528 431 ;\nC 112 ; WX 600 ; N p ; B 22 -186 541 431 ;\nC 113 ; WX 6" -"00 ; N q ; B 63 -186 583 431 ;\nC 114 ; WX 600 ; N r ; B 84 0 541 427 ;\nC 115 ;" -" WX 600 ; N s ; B 103 -16 497 431 ;\nC 116 ; WX 600 ; N t ; B 43 -16 499 563 ;\n" -"C 117 ; WX 600 ; N u ; B 43 -16 541 417 ;\nC 118 ; WX 600 ; N v ; B 30 0 570 417" -" ;\nC 119 ; WX 600 ; N w ; B 30 0 570 417 ;\nC 120 ; WX 600 ; N x ; B 51 0 549 4" -"17 ;\nC 121 ; WX 600 ; N y ; B 51 -186 549 417 ;\nC 122 ; WX 600 ; N z ; B 115 0" -" 489 417 ;\nC 123 ; WX 600 ; N braceleft ; B 197 -124 403 604 ;\nC 124 ; WX 600 " -"; N bar ; B 280 -124 320 604 ;\nC 125 ; WX 600 ; N braceright ; B 197 -124 403 6" -"04 ;\nC 126 ; WX 600 ; N asciitilde ; B 92 212 508 348 ;\nC 161 ; WX 600 ; N exc" -"lamdown ; B 240 -216 360 417 ;\nC 162 ; WX 600 ; N cent ; B 113 -13 469 630 ;\nC" -" 163 ; WX 600 ; N sterling ; B 63 0 520 578 ;\nC 164 ; WX 600 ; N fraction ; B 5" -"0 138 549 470 ;\nC 165 ; WX 600 ; N yen ; B 51 0 549 563 ;\nC 166 ; WX 600 ; N f" -"lorin ; B 87 -93 518 618 ;\nC 167 ; WX 600 ; N section ; B 66 -62 534 603 ;\nC 1" -"68 ; WX 600 ; N currency ; B 103 95 497 489 ;\nC 169 ; WX 600 ; N quotesingle ; " -"B 236 315 364 604 ;\nC 170 ; WX 600 ; N quotedblleft ; B 93 343 507 604 ;\nC 171" -" ; WX 600 ; N guillemotleft ; B 63 0 541 417 ;\nC 172 ; WX 600 ; N guilsinglleft" -" ; B 63 0 312 417 ;\nC 173 ; WX 600 ; N guilsinglright ; B 293 0 541 417 ;\nC 17" -"4 ; WX 600 ; N fi ; B 10 0 585 624 ;\nC 175 ; WX 600 ; N fl ; B 10 0 587 604 ;\n" -"C 177 ; WX 600 ; N endash ; B 72 261 528 302 ;\nC 178 ; WX 600 ; N dagger ; B 12" -"4 -63 476 604 ;\nC 179 ; WX 600 ; N daggerdbl ; B 124 -62 476 604 ;\nC 180 ; WX " -"600 ; N periodcentered ; B 226 217 374 348 ;\nC 182 ; WX 600 ; N paragraph ; B 7" -"9 -62 525 604 ;\nC 183 ; WX 600 ; N bullet ; B 202 141 398 337 ;\nC 184 ; WX 600" -" ; N quotesinglbase ; B 135 -145 340 145 ;\nC 185 ; WX 600 ; N quotedblbase ; B " -"93 -116 507 145 ;\nC 186 ; WX 600 ; N quotedblright ; B 93 343 507 604 ;\nC 187 " -"; WX 600 ; N guillemotright ; B 63 0 541 417 ;\nC 188 ; WX 600 ; N ellipsis ; B " -"51 -15 549 84 ;\nC 189 ; WX 600 ; N perthousand ; B 34 -9 564 614 ;\nC 191 ; WX " -"600 ; N questiondown ; B 113 -175 466 417 ;\nC 193 ; WX 600 ; N grave ; B 155 49" -"0 320 639 ;\nC 194 ; WX 600 ; N acute ; B 280 490 445 639 ;\nC 195 ; WX 600 ; N " -"circumflex ; B 155 490 445 639 ;\nC 196 ; WX 600 ; N tilde ; B 145 516 455 605 ;" -"\nC 197 ; WX 600 ; N macron ; B 155 536 445 576 ;\nC 198 ; WX 600 ; N breve ; B " -"155 490 445 620 ;\nC 199 ; WX 600 ; N dotaccent ; B 250 511 350 611 ;\nC 200 ; W" -"X 600 ; N dieresis ; B 140 511 461 611 ;\nC 202 ; WX 600 ; N ring ; B 207 480 39" -"3 661 ;\nC 203 ; WX 600 ; N cedilla ; B 210 -173 377 0 ;\nC 205 ; WX 600 ; N hun" -"garumlaut ; B 155 490 445 633 ;\nC 206 ; WX 600 ; N ogonek ; B 280 -155 433 0 ;\n" -"C 207 ; WX 600 ; N caron ; B 155 490 445 639 ;\nC 208 ; WX 600 ; N emdash ; B 1 " -"261 599 302 ;\nC 225 ; WX 600 ; N AE ; B 10 0 590 563 ;\nC 227 ; WX 600 ; N ordf" -"eminine ; B 155 279 447 574 ;\nC 232 ; WX 600 ; N Lslash ; B 43 0 541 563 ;\nC 2" -"33 ; WX 600 ; N Oslash ; B 40 -43 560 605 ;\nC 234 ; WX 600 ; N OE ; B 10 0 590 " -"563 ;\nC 235 ; WX 600 ; N ordmasculine ; B 154 284 448 577 ;\nC 241 ; WX 600 ; N" -" ae ; B 12 -16 578 431 ;\nC 245 ; WX 600 ; N dotlessi ; B 92 0 508 417 ;\nC 248 " -"; WX 600 ; N lslash ; B 92 0 508 604 ;\nC 249 ; WX 600 ; N oslash ; B 53 -43 543" -" 458 ;\nC 250 ; WX 600 ; N oe ; B 12 -16 578 431 ;\nC 251 ; WX 600 ; N germandbl" -"s ; B 43 -16 499 604 ;\nC -1 ; WX 600 ; N Udieresis ; B 40 -16 560 761 ;\nC -1 ;" -" WX 600 ; N Uacute ; B 40 -16 560 789 ;\nC -1 ; WX 600 ; N Scedilla ; B 92 -173 " -"508 576 ;\nC -1 ; WX 600 ; N Tcaron ; B 72 0 528 789 ;\nC -1 ; WX 600 ; N Scaron" -" ; B 92 -16 508 789 ;\nC -1 ; WX 600 ; N Rcaron ; B 43 0 589 789 ;\nC -1 ; WX 60" -"0 ; N Racute ; B 43 0 589 789 ;\nC -1 ; WX 600 ; N Sacute ; B 92 -16 508 789 ;\n" -"C -1 ; WX 600 ; N Otilde ; B 51 -16 549 755 ;\nC -1 ; WX 600 ; N ucircumflex ; B" -" 43 -16 541 639 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 51 -16 549 783 ;\nC -1 ; " -"WX 600 ; N Uhungarumlaut ; B 40 -16 560 783 ;\nC -1 ; WX 600 ; N Yacute ; B 51 0" -" 549 789 ;\nC -1 ; WX 600 ; N Eth ; B 0 0 520 563 ;\nC -1 ; WX 600 ; N Dcroat ; " -"B 0 0 520 563 ;\nC -1 ; WX 600 ; N Zacute ; B 103 0 497 789 ;\nC -1 ; WX 600 ; N" -" Uring ; B 40 -16 560 811 ;\nC -1 ; WX 600 ; N gbreve ; B 63 -186 562 620 ;\nC -" -"1 ; WX 600 ; N eogonek ; B 63 -155 520 431 ;\nC -1 ; WX 600 ; N edotaccent ; B 6" -"3 -16 520 611 ;\nC -1 ; WX 600 ; N ecaron ; B 63 -16 520 639 ;\nC -1 ; WX 600 ; " -"N Ugrave ; B 40 -16 560 789 ;\nC -1 ; WX 600 ; N Thorn ; B 43 0 499 563 ;\nC -1 " -"; WX 600 ; N eacute ; B 63 -16 520 639 ;\nC -1 ; WX 600 ; N edieresis ; B 63 -16" -" 520 611 ;\nC -1 ; WX 600 ; N dcaron ; B 63 -16 650 616 ;\nC -1 ; WX 600 ; N cce" -"dilla ; B 84 -173 535 431 ;\nC -1 ; WX 600 ; N ccaron ; B 84 -16 535 639 ;\nC -1" -" ; WX 600 ; N cacute ; B 84 -16 535 639 ;\nC -1 ; WX 600 ; N aogonek ; B 72 -155" -" 556 431 ;\nC -1 ; WX 600 ; N aring ; B 72 -16 541 661 ;\nC -1 ; WX 600 ; N atil" -"de ; B 72 -16 541 605 ;\nC -1 ; WX 600 ; N abreve ; B 72 -16 541 620 ;\nC -1 ; W" -"X 600 ; N egrave ; B 63 -16 520 639 ;\nC -1 ; WX 600 ; N agrave ; B 72 -16 541 6" -"39 ;\nC -1 ; WX 600 ; N aacute ; B 72 -16 541 639 ;\nC -1 ; WX 600 ; N adieresis" -" ; B 72 -16 541 611 ;\nC -1 ; WX 600 ; N Uogonek ; B 40 -155 560 563 ;\nC -1 ; W" -"X 600 ; N ugrave ; B 43 -16 541 639 ;\nC -1 ; WX 600 ; N uacute ; B 43 -16 541 6" -"39 ;\nC -1 ; WX 600 ; N udieresis ; B 43 -16 541 611 ;\nC -1 ; WX 600 ; N tcaron" -" ; B 43 -16 508 616 ;\nC -1 ; WX 600 ; N scommaaccent ; B 103 -237 497 431 ;\nC " -"-1 ; WX 600 ; N Zcaron ; B 103 0 497 789 ;\nC -1 ; WX 600 ; N ecircumflex ; B 63" -" -16 520 639 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 40 -16 560 789 ;\nC -1 ; WX 60" -"0 ; N acircumflex ; B 72 -16 541 639 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 103 0 4" -"97 761 ;\nC -1 ; WX 600 ; N scaron ; B 103 -16 497 639 ;\nC -1 ; WX 600 ; N Amac" -"ron ; B 9 0 591 726 ;\nC -1 ; WX 600 ; N sacute ; B 103 -16 497 639 ;\nC -1 ; WX" -" 600 ; N Tcommaaccent ; B 72 -237 528 563 ;\nC -1 ; WX 600 ; N Ydieresis ; B 51 " -"0 549 761 ;\nC -1 ; WX 600 ; N thorn ; B 22 -186 541 590 ;\nC -1 ; WX 600 ; N Em" -"acron ; B 43 0 520 726 ;\nC -1 ; WX 600 ; N Ograve ; B 51 -16 549 789 ;\nC -1 ; " -"WX 600 ; N Oacute ; B 51 -16 549 789 ;\nC -1 ; WX 600 ; N Odieresis ; B 51 -16 5" -"49 761 ;\nC -1 ; WX 600 ; N Ntilde ; B 22 0 562 755 ;\nC -1 ; WX 600 ; N Ncaron " -"; B 22 0 562 789 ;\nC -1 ; WX 600 ; N Nacute ; B 22 0 562 789 ;\nC -1 ; WX 600 ;" -" N Lcaron ; B 63 0 541 566 ;\nC -1 ; WX 600 ; N Lacute ; B 63 0 541 789 ;\nC -1 " -"; WX 600 ; N Idotaccent ; B 113 0 487 761 ;\nC -1 ; WX 600 ; N racute ; B 84 0 5" -"41 639 ;\nC -1 ; WX 600 ; N Icircumflex ; B 113 0 487 789 ;\nC -1 ; WX 600 ; N o" -"hungarumlaut ; B 72 -16 528 633 ;\nC -1 ; WX 600 ; N otilde ; B 72 -16 528 605 ;" -"\nC -1 ; WX 600 ; N Euro ; B 11 -16 534 576 ;\nC -1 ; WX 600 ; N ocircumflex ; B" -" 72 -16 528 639 ;\nC -1 ; WX 600 ; N onesuperior ; B 191 259 410 612 ;\nC -1 ; W" -"X 600 ; N twosuperior ; B 175 259 405 612 ;\nC -1 ; WX 600 ; N threesuperior ; B" -" 181 251 416 612 ;\nC -1 ; WX 600 ; N Igrave ; B 113 0 487 789 ;\nC -1 ; WX 600 " -"; N Iacute ; B 113 0 487 789 ;\nC -1 ; WX 600 ; N Imacron ; B 113 0 487 726 ;\nC" -" -1 ; WX 600 ; N Iogonek ; B 113 -155 500 563 ;\nC -1 ; WX 600 ; N Idieresis ; B" -" 113 0 487 761 ;\nC -1 ; WX 600 ; N Gbreve ; B 63 -16 562 770 ;\nC -1 ; WX 600 ;" -" N Umacron ; B 40 -16 560 726 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 43 -237 572 " -"563 ;\nC -1 ; WX 600 ; N ograve ; B 72 -16 528 639 ;\nC -1 ; WX 600 ; N Scommaac" -"cent ; B 92 -237 508 576 ;\nC -1 ; WX 600 ; N Eogonek ; B 43 -155 549 563 ;\nC -" -"1 ; WX 600 ; N oacute ; B 72 -16 528 639 ;\nC -1 ; WX 600 ; N Edotaccent ; B 43 " -"0 520 761 ;\nC -1 ; WX 600 ; N iogonek ; B 92 -155 520 624 ;\nC -1 ; WX 600 ; N " -"gcommaaccent ; B 63 -186 562 666 ;\nC -1 ; WX 600 ; N odieresis ; B 72 -16 528 6" -"11 ;\nC -1 ; WX 600 ; N ntilde ; B 53 0 541 605 ;\nC -1 ; WX 600 ; N ncaron ; B " -"53 0 541 639 ;\nC -1 ; WX 600 ; N Ecaron ; B 43 0 520 789 ;\nC -1 ; WX 600 ; N E" -"circumflex ; B 43 0 520 789 ;\nC -1 ; WX 600 ; N scedilla ; B 103 -173 497 431 ;" -"\nC -1 ; WX 600 ; N rcaron ; B 84 0 541 639 ;\nC -1 ; WX 600 ; N Egrave ; B 43 0" -" 520 789 ;\nC -1 ; WX 600 ; N Eacute ; B 43 0 520 789 ;\nC -1 ; WX 600 ; N Gcomm" -"aaccent ; B 63 -237 562 576 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 43 -237 589 56" -"3 ;\nC -1 ; WX 600 ; N Edieresis ; B 43 0 520 761 ;\nC -1 ; WX 600 ; N nacute ; " -"B 53 0 541 639 ;\nC -1 ; WX 600 ; N uogonek ; B 43 -155 556 417 ;\nC -1 ; WX 600" -" ; N umacron ; B 43 -16 541 576 ;\nC -1 ; WX 600 ; N Dcaron ; B 43 0 520 789 ;\n" -"C -1 ; WX 600 ; N lcaron ; B 92 0 508 616 ;\nC -1 ; WX 600 ; N Ccaron ; B 63 -16" -" 534 789 ;\nC -1 ; WX 600 ; N Cacute ; B 63 -16 534 789 ;\nC -1 ; WX 600 ; N Cce" -"dilla ; B 63 -173 534 576 ;\nC -1 ; WX 600 ; N degree ; B 155 346 445 636 ;\nC -" -"1 ; WX 600 ; N Aogonek ; B 9 -155 600 563 ;\nC -1 ; WX 600 ; N minus ; B 72 261 " -"528 302 ;\nC -1 ; WX 600 ; N multiply ; B 118 100 482 464 ;\nC -1 ; WX 600 ; N d" -"ivide ; B 72 25 528 540 ;\nC -1 ; WX 600 ; N Aring ; B 9 0 591 811 ;\nC -1 ; WX " -"600 ; N trademark ; B 4 243 598 563 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 84 -23" -"7 541 427 ;\nC -1 ; WX 600 ; N lacute ; B 92 0 508 789 ;\nC -1 ; WX 600 ; N omac" -"ron ; B 72 -16 528 576 ;\nC -1 ; WX 600 ; N Atilde ; B 9 0 591 755 ;\nC -1 ; WX " -"600 ; N icircumflex ; B 92 0 508 639 ;\nC -1 ; WX 600 ; N igrave ; B 92 0 508 63" -"9 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 53 -237 541 431 ;\nC -1 ; WX 600 ; N lco" -"mmaaccent ; B 92 -237 508 604 ;\nC -1 ; WX 600 ; N plusminus ; B 72 0 528 529 ;\n" -"C -1 ; WX 600 ; N onehalf ; B 23 0 573 612 ;\nC -1 ; WX 600 ; N onequarter ; B 1" -"6 0 580 612 ;\nC -1 ; WX 600 ; N threequarters ; B 6 0 580 612 ;\nC -1 ; WX 600 " -"; N iacute ; B 92 0 508 639 ;\nC -1 ; WX 600 ; N Abreve ; B 9 0 591 770 ;\nC -1 " -"; WX 600 ; N kcommaaccent ; B 63 -237 541 604 ;\nC -1 ; WX 600 ; N Omacron ; B 5" -"1 -16 549 726 ;\nC -1 ; WX 600 ; N imacron ; B 92 0 508 576 ;\nC -1 ; WX 600 ; N" -" emacron ; B 63 -16 520 576 ;\nC -1 ; WX 600 ; N amacron ; B 72 -16 541 576 ;\nC" -" -1 ; WX 600 ; N tcommaaccent ; B 43 -237 499 563 ;\nC -1 ; WX 600 ; N ydieresis" -" ; B 51 -186 549 611 ;\nC -1 ; WX 600 ; N zdotaccent ; B 115 0 489 611 ;\nC -1 ;" -" WX 600 ; N zcaron ; B 115 0 489 639 ;\nC -1 ; WX 600 ; N zacute ; B 115 0 489 6" -"39 ;\nC -1 ; WX 600 ; N yacute ; B 51 -186 549 639 ;\nC -1 ; WX 600 ; N uhungaru" -"mlaut ; B 43 -16 541 633 ;\nC -1 ; WX 600 ; N eth ; B 72 -17 528 620 ;\nC -1 ; W" -"X 600 ; N uring ; B 43 -16 541 661 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 51 -16 5" -"49 789 ;\nC -1 ; WX 600 ; N commaaccent ; B 234 -237 367 -60 ;\nC -1 ; WX 600 ; " -"N copyright ; B 3 -15 596 578 ;\nC -1 ; WX 600 ; N registered ; B 3 -15 596 578 " -";\nC -1 ; WX 600 ; N Acircumflex ; B 9 0 591 789 ;\nC -1 ; WX 600 ; N idieresis " -"; B 92 0 508 611 ;\nC -1 ; WX 600 ; N lozenge ; B 89 -11 511 575 ;\nC -1 ; WX 60" -"0 ; N Delta ; B 43 0 557 563 ;\nC -1 ; WX 600 ; N notequal ; B 51 94 549 464 ;\n" -"C -1 ; WX 600 ; N radical ; B 27 0 628 699 ;\nC -1 ; WX 600 ; N Agrave ; B 9 0 5" -"91 789 ;\nC -1 ; WX 600 ; N Aacute ; B 9 0 591 789 ;\nC -1 ; WX 600 ; N lessequa" -"l ; B 53 0 525 535 ;\nC -1 ; WX 600 ; N greaterequal ; B 59 0 531 535 ;\nC -1 ; " -"WX 600 ; N logicalnot ; B 72 168 528 438 ;\nC -1 ; WX 600 ; N summation ; B 113 " -"-127 507 563 ;\nC -1 ; WX 600 ; N partialdiff ; B 71 -17 529 582 ;\nC -1 ; WX 60" -"0 ; N Ncommaaccent ; B 22 -237 562 563 ;\nC -1 ; WX 600 ; N dcroat ; B 63 -16 58" -"3 604 ;\nC -1 ; WX 600 ; N brokenbar ; B 280 -124 320 604 ;\nC -1 ; WX 600 ; N L" -"commaaccent ; B 63 -237 541 563 ;\nC -1 ; WX 600 ; N Adieresis ; B 9 0 591 761 ;" -"\nC -1 ; WX 600 ; N mu ; B 43 -200 541 417 ;\nC -1 ; WX 600 ; N .notdef ; B 295 " -"0 295 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 998\nKPX A C -33\nKPX A" -" Ccedilla -30\nKPX A G -27\nKPX A O -27\nKPX A Odieresis -27\nKPX A Q -28\nKPX A" -" T -27\nKPX A U -32\nKPX A Uacute -32\nKPX A Ucircumflex -32\nKPX A Udieresis -3" -"2\nKPX A Ugrave -32\nKPX A V -74\nKPX A W -12\nKPX A Y -28\nKPX A a 8\nKPX A b 4" -"6\nKPX A c -19\nKPX A ccedilla -15\nKPX A comma -39\nKPX A d -10\nKPX A e -14\nK" -"PX A g -23\nKPX A guillemotleft -49\nKPX A guilsinglleft -49\nKPX A hyphen -30\n" -"KPX A o -16\nKPX A period -67\nKPX A q -24\nKPX A quotedblright -78\nKPX A quote" -"right -98\nKPX A t -26\nKPX A u -15\nKPX A v -55\nKPX A w -19\nKPX A y -60\nKPX " -"Aacute C -33\nKPX Aacute G -27\nKPX Aacute O -27\nKPX Aacute Q -28\nKPX Aacute T" -" -27\nKPX Aacute U -32\nKPX Aacute V -74\nKPX Aacute W -12\nKPX Aacute Y -28\nKP" -"X Aacute a 8\nKPX Aacute b 46\nKPX Aacute c -19\nKPX Aacute comma -39\nKPX Aacut" -"e d -10\nKPX Aacute e -14\nKPX Aacute g -23\nKPX Aacute guillemotleft -49\nKPX A" -"acute guilsinglleft -49\nKPX Aacute hyphen -30\nKPX Aacute o -16\nKPX Aacute per" -"iod -67\nKPX Aacute q -24\nKPX Aacute quoteright -98\nKPX Aacute t -26\nKPX Aacu" -"te u -15\nKPX Aacute v -55\nKPX Aacute w -19\nKPX Aacute y -60\nKPX Acircumflex " -"C -33\nKPX Acircumflex G -27\nKPX Acircumflex O -27\nKPX Acircumflex Q -28\nKPX " -"Acircumflex T -27\nKPX Acircumflex U -32\nKPX Acircumflex V -74\nKPX Acircumflex" -" W -12\nKPX Acircumflex Y -28\nKPX Acircumflex comma -39\nKPX Acircumflex period" -" -67\nKPX Adieresis C -33\nKPX Adieresis G -27\nKPX Adieresis O -27\nKPX Adieres" -"is Q -28\nKPX Adieresis T -27\nKPX Adieresis U -32\nKPX Adieresis V -74\nKPX Adi" -"eresis W -12\nKPX Adieresis Y -28\nKPX Adieresis a 8\nKPX Adieresis b 46\nKPX Ad" -"ieresis c -19\nKPX Adieresis comma -39\nKPX Adieresis d -10\nKPX Adieresis g -23" -"\nKPX Adieresis guillemotleft -49\nKPX Adieresis guilsinglleft -49\nKPX Adieresi" -"s hyphen -30\nKPX Adieresis o -16\nKPX Adieresis period -67\nKPX Adieresis q -24" -"\nKPX Adieresis quotedblright -78\nKPX Adieresis quoteright -98\nKPX Adieresis t" -" -26\nKPX Adieresis u -15\nKPX Adieresis v -55\nKPX Adieresis w -19\nKPX Adieres" -"is y -60\nKPX Agrave C -33\nKPX Agrave G -27\nKPX Agrave O -27\nKPX Agrave Q -28" -"\nKPX Agrave T -27\nKPX Agrave U -32\nKPX Agrave V -74\nKPX Agrave W -12\nKPX Ag" -"rave Y -28\nKPX Agrave comma -39\nKPX Agrave period -67\nKPX Aring C -33\nKPX Ar" -"ing G -27\nKPX Aring O -27\nKPX Aring Q -28\nKPX Aring T -27\nKPX Aring U -32\nK" -"PX Aring V -74\nKPX Aring W -12\nKPX Aring Y -28\nKPX Aring a 8\nKPX Aring b 46\n" -"KPX Aring c -19\nKPX Aring comma -39\nKPX Aring d -10\nKPX Aring e -14\nKPX Arin" -"g g -23\nKPX Aring guillemotleft -49\nKPX Aring guilsinglleft -49\nKPX Aring hyp" -"hen -30\nKPX Aring o -16\nKPX Aring period -67\nKPX Aring q -24\nKPX Aring quote" -"dblright -78\nKPX Aring quoteright -98\nKPX Aring t -26\nKPX Aring u -15\nKPX Ar" -"ing v -55\nKPX Aring w -19\nKPX Aring y -60\nKPX Atilde C -33\nKPX Atilde G -27\n" -"KPX Atilde O -27\nKPX Atilde Q -28\nKPX Atilde T -27\nKPX Atilde U -32\nKPX Atil" -"de V -74\nKPX Atilde W -12\nKPX Atilde Y -28\nKPX Atilde comma -39\nKPX Atilde p" -"eriod -67\nKPX B A -9\nKPX B AE -9\nKPX B Aacute -9\nKPX B Acircumflex -9\nKPX B" -" Adieresis -9\nKPX B Aring -9\nKPX B Atilde -9\nKPX B O -10\nKPX B OE 10\nKPX B " -"Oacute -10\nKPX B Ocircumflex -10\nKPX B Odieresis -10\nKPX B Ograve -10\nKPX B " -"Oslash -8\nKPX B V -29\nKPX B W -12\nKPX B Y -50\nKPX C A -9\nKPX C AE -9\nKPX C" -" Aacute -9\nKPX C Adieresis -9\nKPX C Aring -9\nKPX C H -26\nKPX C K -11\nKPX C " -"O -21\nKPX C Oacute -21\nKPX C Odieresis -21\nKPX Ccedilla A -5\nKPX D A -42\nKP" -"X D Aacute -42\nKPX D Acircumflex -42\nKPX D Adieresis -42\nKPX D Agrave -42\nKP" -"X D Aring -42\nKPX D Atilde -42\nKPX D J -31\nKPX D T -40\nKPX D V -42\nKPX D W " -"-17\nKPX D X -55\nKPX D Y -63\nKPX F A -38\nKPX F Aacute -38\nKPX F Acircumflex " -"-38\nKPX F Adieresis -38\nKPX F Agrave -38\nKPX F Aring -38\nKPX F Atilde -38\nK" -"PX F J -95\nKPX F O -27\nKPX F Odieresis -27\nKPX F a -47\nKPX F aacute -47\nKPX" -" F adieresis -43\nKPX F ae -20\nKPX F aring -47\nKPX F comma -168\nKPX F e -56\n" -"KPX F eacute -56\nKPX F hyphen -67\nKPX F i -47\nKPX F j -54\nKPX F o -63\nKPX F" -" oacute -63\nKPX F odieresis -48\nKPX F oe -21\nKPX F oslash -63\nKPX F period -" -"193\nKPX F r -32\nKPX F u -1\nKPX G A 6\nKPX G AE 5\nKPX G Aacute 6\nKPX G Acirc" -"umflex 6\nKPX G Adieresis 6\nKPX G Agrave 6\nKPX G Aring 6\nKPX G Atilde 6\nKPX " -"G T -25\nKPX G V 6\nKPX G W 1\nKPX G Y -14\nKPX J A -7\nKPX J AE -16\nKPX J Adie" -"resis -7\nKPX J Aring -7\nKPX K C -42\nKPX K G -36\nKPX K O -37\nKPX K OE -19\nK" -"PX K Oacute -37\nKPX K Odieresis -37\nKPX K S -9\nKPX K T -12\nKPX K a -1\nKPX K" -" adieresis -1\nKPX K ae 26\nKPX K aring -1\nKPX K e -24\nKPX K hyphen -61\nKPX K" -" o -25\nKPX K oacute -25\nKPX K odieresis -25\nKPX K u -25\nKPX K udieresis -25\n" -"KPX K y -67\nKPX L A 17\nKPX L AE 16\nKPX L Aacute 17\nKPX L Adieresis 17\nKPX L" -" Aring 17\nKPX L C -11\nKPX L Ccedilla -10\nKPX L G -10\nKPX L O -6\nKPX L Oacut" -"e -6\nKPX L Ocircumflex -6\nKPX L Odieresis -6\nKPX L Ograve -6\nKPX L Otilde -6" -"\nKPX L S -24\nKPX L T -52\nKPX L U -29\nKPX L Udieresis -29\nKPX L V -66\nKPX L" -" W -27\nKPX L Y -53\nKPX L hyphen 3\nKPX L quotedblright -66\nKPX L quoteright -" -"73\nKPX L u -16\nKPX L udieresis -16\nKPX L y -45\nKPX N A -3\nKPX N AE -3\nKPX " -"N Aacute -3\nKPX N Adieresis -3\nKPX N Aring -3\nKPX N C -12\nKPX N Ccedilla -12" -"\nKPX N G -11\nKPX N O -9\nKPX N Oacute -9\nKPX N Odieresis -9\nKPX N a -19\nKPX" -" N aacute -19\nKPX N adieresis -19\nKPX N ae 11\nKPX N aring -19\nKPX N comma -5" -"8\nKPX N e -6\nKPX N eacute -6\nKPX N o -10\nKPX N oacute -10\nKPX N odieresis -" -"10\nKPX N oslash -7\nKPX N period -83\nKPX N u -9\nKPX N udieresis -9\nKPX O A -" -"27\nKPX O AE -26\nKPX O Aacute -27\nKPX O Adieresis -27\nKPX O Aring -27\nKPX O " -"T -30\nKPX O V -31\nKPX O W -5\nKPX O X -43\nKPX O Y -52\nKPX Oacute A -27\nKPX " -"Oacute T -30\nKPX Oacute V -31\nKPX Oacute W -5\nKPX Oacute Y -52\nKPX Ocircumfl" -"ex T -30\nKPX Ocircumflex V -31\nKPX Ocircumflex Y -52\nKPX Odieresis A -27\nKPX" -" Odieresis T -30\nKPX Odieresis V -31\nKPX Odieresis W -5\nKPX Odieresis X -43\n" -"KPX Odieresis Y -52\nKPX Ograve T -30\nKPX Ograve V -31\nKPX Ograve Y -52\nKPX O" -"slash A -26\nKPX Otilde T -30\nKPX Otilde V -31\nKPX Otilde Y -52\nKPX P A -79\n" -"KPX P AE -76\nKPX P Aacute -79\nKPX P Adieresis -79\nKPX P Aring -79\nKPX P J -8" -"2\nKPX P a -52\nKPX P aacute -52\nKPX P adieresis -52\nKPX P ae -25\nKPX P aring" -" -52\nKPX P comma -156\nKPX P e -42\nKPX P eacute -42\nKPX P hyphen -46\nKPX P o" -" -48\nKPX P oacute -48\nKPX P odieresis -48\nKPX P oe -13\nKPX P oslash -48\nKPX" -" P period -181\nKPX R C -27\nKPX R Ccedilla -28\nKPX R G -26\nKPX R O -25\nKPX R" -" OE -4\nKPX R Oacute -25\nKPX R Odieresis -25\nKPX R T -28\nKPX R U -32\nKPX R U" -"dieresis -32\nKPX R V -33\nKPX R W -13\nKPX R Y -29\nKPX R a 7\nKPX R aacute 7\n" -"KPX R adieresis 7\nKPX R ae 35\nKPX R aring 7\nKPX R e -15\nKPX R eacute -15\nKP" -"X R hyphen -48\nKPX R o -17\nKPX R oacute -17\nKPX R odieresis -17\nKPX R oe 22\n" -"KPX R u -11\nKPX R uacute -11\nKPX R udieresis -11\nKPX R y -15\nKPX S A -22\nKP" -"X S AE -22\nKPX S Aacute -22\nKPX S Adieresis -22\nKPX S Aring -22\nKPX S T -42\n" -"KPX S V -10\nKPX S W -16\nKPX S Y -31\nKPX S t -18\nKPX T A -27\nKPX T AE -27\nK" -"PX T Aacute -27\nKPX T Acircumflex -27\nKPX T Adieresis -27\nKPX T Agrave -27\nK" -"PX T Aring -27\nKPX T Atilde -27\nKPX T C -29\nKPX T G -30\nKPX T J -79\nKPX T O" -" -29\nKPX T OE -7\nKPX T Oacute -29\nKPX T Ocircumflex -29\nKPX T Odieresis -29\n" -"KPX T Ograve -29\nKPX T Oslash -29\nKPX T Otilde -29\nKPX T S -43\nKPX T V 10\nK" -"PX T W 5\nKPX T Y -10\nKPX T a -60\nKPX T ae -33\nKPX T c -88\nKPX T colon -136\n" -"KPX T comma -108\nKPX T e -83\nKPX T g -92\nKPX T guillemotleft -122\nKPX T guil" -"singlleft -122\nKPX T hyphen -94\nKPX T i -58\nKPX T j -80\nKPX T o -85\nKPX T o" -"slash -54\nKPX T period -136\nKPX T r -54\nKPX T s -63\nKPX T semicolon -111\nKP" -"X T u -84\nKPX T v -93\nKPX T w -88\nKPX T y -103\nKPX U A -18\nKPX U AE -27\nKP" -"X U Aacute -18\nKPX U Acircumflex -18\nKPX U Adieresis -18\nKPX U Aring -18\nKPX" -" U Atilde -18\nKPX U comma -76\nKPX U m 6\nKPX U n -19\nKPX U p 0\nKPX U period " -"-101\nKPX U r -41\nKPX Uacute A -18\nKPX Uacute comma -76\nKPX Uacute m 6\nKPX U" -"acute n -19\nKPX Uacute p 0\nKPX Uacute period -101\nKPX Uacute r -41\nKPX Ucirc" -"umflex A -18\nKPX Udieresis A -18\nKPX Udieresis b 25\nKPX Udieresis comma -76\n" -"KPX Udieresis m 6\nKPX Udieresis n -19\nKPX Udieresis p 0\nKPX Udieresis period " -"-101\nKPX Udieresis r -41\nKPX Ugrave A -18\nKPX V A -3\nKPX V AE -12\nKPX V Aac" -"ute -3\nKPX V Acircumflex -3\nKPX V Adieresis -3\nKPX V Agrave -3\nKPX V Aring -" -"3\nKPX V Atilde -3\nKPX V C -29\nKPX V G -31\nKPX V O -31\nKPX V Oacute -31\nKPX" -" V Ocircumflex -31\nKPX V Odieresis -31\nKPX V Ograve -31\nKPX V Oslash -31\nKPX" -" V Otilde -31\nKPX V S -34\nKPX V T 10\nKPX V a -60\nKPX V ae -33\nKPX V colon -" -"124\nKPX V comma -129\nKPX V e -52\nKPX V g -53\nKPX V guillemotleft -75\nKPX V " -"guilsinglleft -75\nKPX V hyphen -43\nKPX V i -60\nKPX V o -56\nKPX V oslash -53\n" -"KPX V period -154\nKPX V r -46\nKPX V semicolon -114\nKPX V u -15\nKPX V y -19\n" -"KPX W A -8\nKPX W AE -14\nKPX W Aacute -8\nKPX W Acircumflex -8\nKPX W Adieresis" -" -8\nKPX W Agrave -8\nKPX W Aring -8\nKPX W Atilde -8\nKPX W C -8\nKPX W G -7\nK" -"PX W O -5\nKPX W Oacute -5\nKPX W Ocircumflex -5\nKPX W Odieresis -5\nKPX W Ogra" -"ve -5\nKPX W Oslash -2\nKPX W Otilde -5\nKPX W S -24\nKPX W T 5\nKPX W a -20\nKP" -"X W ae 10\nKPX W colon -88\nKPX W comma -66\nKPX W e -6\nKPX W g -7\nKPX W guill" -"emotleft -31\nKPX W guilsinglleft -31\nKPX W hyphen -2\nKPX W i -43\nKPX W o -10" -"\nKPX W oslash -7\nKPX W period -90\nKPX W r -29\nKPX W semicolon -69\nKPX W u 2" -"\nKPX W y -2\nKPX X C -46\nKPX X O -43\nKPX X Odieresis -43\nKPX X Q -44\nKPX X " -"a -7\nKPX X e -30\nKPX X hyphen -75\nKPX X o -31\nKPX X u -31\nKPX X y -53\nKPX " -"Y A -24\nKPX Y AE -27\nKPX Y Aacute -24\nKPX Y Acircumflex -24\nKPX Y Adieresis " -"-24\nKPX Y Agrave -24\nKPX Y Aring -24\nKPX Y Atilde -24\nKPX Y C -51\nKPX Y G -" -"52\nKPX Y O -53\nKPX Y Oacute -53\nKPX Y Ocircumflex -53\nKPX Y Odieresis -53\nK" -"PX Y Ograve -53\nKPX Y Oslash -53\nKPX Y Otilde -53\nKPX Y S -55\nKPX Y T -10\nK" -"PX Y a -60\nKPX Y ae -32\nKPX Y colon -135\nKPX Y comma -107\nKPX Y e -78\nKPX Y" -" g -81\nKPX Y guillemotleft -115\nKPX Y guilsinglleft -115\nKPX Y hyphen -91\nKP" -"X Y i -57\nKPX Y o -83\nKPX Y oslash -54\nKPX Y p -35\nKPX Y period -135\nKPX Y " -"semicolon -110\nKPX Y u -46\nKPX Y v -39\nKPX Z v -50\nKPX Z y -61\nKPX a j -87\n" -"KPX a quoteright -56\nKPX a v -28\nKPX a w -21\nKPX a y -38\nKPX aacute v -28\nK" -"PX aacute w -21\nKPX aacute y -38\nKPX adieresis v -28\nKPX adieresis w -21\nKPX" -" adieresis y -38\nKPX ae v 21\nKPX ae w 21\nKPX ae y 10\nKPX agrave v -28\nKPX a" -"grave w -21\nKPX agrave y -38\nKPX aring v -28\nKPX aring w -21\nKPX aring y -38" -"\nKPX b v -12\nKPX b w 1\nKPX b y -22\nKPX c h -3\nKPX c k -9\nKPX comma one -14" -"4\nKPX comma quotedblright -119\nKPX comma quoteright -136\nKPX e quoteright -41" -"\nKPX e t -29\nKPX e v -22\nKPX e w -19\nKPX e x -2\nKPX e y -33\nKPX eacute v -" -"22\nKPX eacute w -19\nKPX eacute y -33\nKPX ecircumflex v -22\nKPX ecircumflex w" -" -19\nKPX ecircumflex y -33\nKPX eight four -58\nKPX eight one -75\nKPX eight se" -"ven -68\nKPX f a -38\nKPX f aacute -38\nKPX f adieresis -22\nKPX f ae -11\nKPX f" -" aring -38\nKPX f e -55\nKPX f eacute -55\nKPX f f -42\nKPX f i -36\nKPX f j -59" -"\nKPX f l -25\nKPX f o -62\nKPX f oacute -62\nKPX f odieresis -27\nKPX f oe -20\n" -"KPX f oslash -32\nKPX f quoteright -56\nKPX f s -41\nKPX f t -6\nKPX five four -" -"52\nKPX five one -86\nKPX five seven -72\nKPX four four -62\nKPX four one -66\nK" -"PX four seven -93\nKPX g a -10\nKPX g adieresis -10\nKPX g ae 16\nKPX g aring -1" -"0\nKPX g e -4\nKPX g eacute -4\nKPX g l -33\nKPX g oacute -8\nKPX g odieresis -8" -"\nKPX g r 0\nKPX guillemotright A -43\nKPX guillemotright AE -39\nKPX guillemotr" -"ight Aacute -43\nKPX guillemotright Adieresis -43\nKPX guillemotright Aring -43\n" -"KPX guillemotright T -121\nKPX guillemotright V -71\nKPX guillemotright W -29\nK" -"PX guillemotright Y -114\nKPX guilsinglright A -43\nKPX guilsinglright AE -39\nK" -"PX guilsinglright Aacute -43\nKPX guilsinglright Adieresis -43\nKPX guilsinglrig" -"ht Aring -43\nKPX guilsinglright T -121\nKPX guilsinglright V -71\nKPX guilsingl" -"right W -29\nKPX guilsinglright Y -114\nKPX h quoteright -49\nKPX h y -32\nKPX h" -"yphen A -26\nKPX hyphen AE -20\nKPX hyphen Aacute -26\nKPX hyphen Adieresis -26\n" -"KPX hyphen Aring -26\nKPX hyphen T -95\nKPX hyphen V -41\nKPX hyphen W -1\nKPX h" -"yphen Y -92\nKPX i T -58\nKPX i j -142\nKPX k a -6\nKPX k aacute -6\nKPX k adier" -"esis -6\nKPX k ae 21\nKPX k aring -6\nKPX k comma -53\nKPX k e -29\nKPX k eacute" -" -29\nKPX k g -38\nKPX k hyphen -99\nKPX k o -30\nKPX k oacute -30\nKPX k odiere" -"sis -30\nKPX k period -81\nKPX k s -9\nKPX k u -3\nKPX k udieresis -3\nKPX l v -" -"83\nKPX l y -93\nKPX m p 22\nKPX m v 14\nKPX m w 15\nKPX m y 3\nKPX n T -42\nKPX" -" n p -5\nKPX n quoteright -47\nKPX n v -21\nKPX n w -12\nKPX n y -31\nKPX nine f" -"our -51\nKPX nine one -75\nKPX nine seven -66\nKPX o T -85\nKPX o quoteright -39" -"\nKPX o t -22\nKPX o v -21\nKPX o w -6\nKPX o x -26\nKPX o y -31\nKPX oacute v -" -"21\nKPX oacute w -6\nKPX oacute y -31\nKPX ocircumflex t -22\nKPX odieresis t -2" -"2\nKPX odieresis v -21\nKPX odieresis w -6\nKPX odieresis x -26\nKPX odieresis y" -" -31\nKPX ograve v -21\nKPX ograve w -6\nKPX ograve y -31\nKPX one comma -91\nKP" -"X one eight -86\nKPX one five -67\nKPX one four -119\nKPX one nine -75\nKPX one " -"one -62\nKPX one period -119\nKPX one seven -141\nKPX one six -111\nKPX one thre" -"e -61\nKPX one two -47\nKPX one zero -94\nKPX p t -15\nKPX p y -19\nKPX period o" -"ne -119\nKPX period quotedblright -108\nKPX period quoteright -125\nKPX q c -2\n" -"KPX q u 42\nKPX quotedblbase A -3\nKPX quotedblbase AE -3\nKPX quotedblbase T -7" -"8\nKPX quotedblbase V -83\nKPX quotedblbase W -23\nKPX quotedblbase Y -79\nKPX q" -"uotedblleft A -59\nKPX quotedblleft AE -52\nKPX quotedblleft Aacute -59\nKPX quo" -"tedblleft Adieresis -59\nKPX quotedblleft Aring -59\nKPX quotedblleft T -37\nKPX" -" quotedblleft V -14\nKPX quotedblleft W -3\nKPX quotedblleft Y -35\nKPX quotedbl" -"right A -59\nKPX quotedblright AE -68\nKPX quotedblright Aacute -59\nKPX quotedb" -"lright Adieresis -59\nKPX quotedblright Aring -59\nKPX quotedblright T -45\nKPX " -"quotedblright V -14\nKPX quotedblright W -20\nKPX quotedblright Y -35\nKPX quote" -"left A -80\nKPX quoteleft AE -73\nKPX quoteleft Aacute -80\nKPX quoteleft Adiere" -"sis -80\nKPX quoteleft Aring -80\nKPX quoteleft T -59\nKPX quoteleft V -36\nKPX " -"quoteleft W -24\nKPX quoteleft Y -56\nKPX quoteright A -140\nKPX quoteright AE -" -"149\nKPX quoteright Aacute -140\nKPX quoteright Adieresis -140\nKPX quoteright A" -"ring -140\nKPX quoteright comma -196\nKPX quoteright d -126\nKPX quoteright o -1" -"31\nKPX quoteright period -220\nKPX quoteright r -145\nKPX quoteright s -140\nKP" -"X quoteright t -114\nKPX quoteright v -108\nKPX quoteright w -105\nKPX quoterigh" -"t y -118\nKPX r a -20\nKPX r aacute -20\nKPX r acircumflex -20\nKPX r adieresis " -"-20\nKPX r ae 7\nKPX r agrave -20\nKPX r aring -20\nKPX r c -24\nKPX r ccedilla " -"-28\nKPX r colon -81\nKPX r comma -97\nKPX r d -14\nKPX r e -12\nKPX r eacute -1" -"2\nKPX r ecircumflex -12\nKPX r egrave -12\nKPX r f -18\nKPX r g -11\nKPX r h -1" -"9\nKPX r hyphen -120\nKPX r i -28\nKPX r j -35\nKPX r k -29\nKPX r l -47\nKPX r " -"m 33\nKPX r n 6\nKPX r o -19\nKPX r oacute -19\nKPX r ocircumflex -19\nKPX r odi" -"eresis -19\nKPX r oe 18\nKPX r ograve -19\nKPX r oslash -19\nKPX r p 28\nKPX r p" -"eriod -125\nKPX r q -11\nKPX r quoteright -37\nKPX r r -13\nKPX r s -24\nKPX r s" -"emicolon -69\nKPX r t 17\nKPX r u 17\nKPX r v 24\nKPX r w 24\nKPX r x 2\nKPX r y" -" 13\nKPX r z -19\nKPX s quoteright -48\nKPX s t -13\nKPX seven colon -148\nKPX s" -"even comma -140\nKPX seven eight -79\nKPX seven five -84\nKPX seven four -111\nK" -"PX seven one -67\nKPX seven period -165\nKPX seven seven -62\nKPX seven six -99\n" -"KPX seven three -72\nKPX seven two -69\nKPX six four -46\nKPX six one -61\nKPX s" -"ix seven -48\nKPX t S -35\nKPX t a -20\nKPX t aacute -20\nKPX t adieresis -20\nK" -"PX t ae 8\nKPX t aring -20\nKPX t colon -102\nKPX t e -37\nKPX t eacute -37\nKPX" -" t h -7\nKPX t o -39\nKPX t oacute -39\nKPX t odieresis -39\nKPX t quoteright -9" -"4\nKPX t semicolon -80\nKPX three four -52\nKPX three one -74\nKPX three seven -" -"67\nKPX two four -92\nKPX two one -66\nKPX two seven -71\nKPX u quoteright -38\n" -"KPX v a -6\nKPX v aacute -6\nKPX v acircumflex -6\nKPX v adieresis -6\nKPX v ae " -"20\nKPX v agrave -6\nKPX v aring -6\nKPX v atilde -6\nKPX v c -25\nKPX v colon -" -"71\nKPX v comma -113\nKPX v e -13\nKPX v eacute -13\nKPX v ecircumflex -13\nKPX " -"v egrave -13\nKPX v g -11\nKPX v hyphen -24\nKPX v l -82\nKPX v o -21\nKPX v oac" -"ute -21\nKPX v odieresis -21\nKPX v ograve -21\nKPX v oslash -21\nKPX v period -" -"139\nKPX v s -19\nKPX v semicolon -62\nKPX w a -6\nKPX w aacute -6\nKPX w acircu" -"mflex -6\nKPX w adieresis -6\nKPX w ae 20\nKPX w agrave -6\nKPX w aring -6\nKPX " -"w atilde -6\nKPX w c -10\nKPX w colon -71\nKPX w comma -70\nKPX w e -1\nKPX w ea" -"cute -1\nKPX w ecircumflex -1\nKPX w egrave -1\nKPX w g -3\nKPX w hyphen 1\nKPX " -"w l -50\nKPX w o -6\nKPX w oacute -6\nKPX w odieresis -6\nKPX w ograve -6\nKPX w" -" oslash -3\nKPX w period -95\nKPX w s -18\nKPX w semicolon -62\nKPX x a -2\nKPX " -"x c -29\nKPX x e -25\nKPX x eacute -25\nKPX x o -26\nKPX x q -30\nKPX y a -17\nK" -"PX y aacute -17\nKPX y acircumflex -17\nKPX y adieresis -17\nKPX y ae 10\nKPX y " -"agrave -17\nKPX y aring -17\nKPX y atilde -17\nKPX y c -35\nKPX y colon -81\nKPX" -" y comma -117\nKPX y e -24\nKPX y eacute -24\nKPX y ecircumflex -24\nKPX y egrav" -"e -24\nKPX y g -21\nKPX y hyphen -24\nKPX y l -93\nKPX y o -31\nKPX y oacute -31" -"\nKPX y odieresis -31\nKPX y ograve -31\nKPX y oslash -31\nKPX y period -144\nKP" -"X y s -30\nKPX y semicolon -72\nKPX zero four -58\nKPX zero one -81\nKPX zero se" -"ven -73\nEndKernPairs\nEndKernData\nEndFontMetrics\n" -; -int n022003l_pfb_len = 45758; -char* n022003l_pfb = -"\x80\x1[\x6\x0\x0%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05\n%%CreationDate: Wed D" -"ec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development\n" -"% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPYING" -" (GNU General Public License) for license conditions.\n% As a special exception," -" permission is granted to include this font\n% program in a Postscript or PDF fi" -"le that consists of a document that\n% contains text to be displayed or printed " -"using this font, regardless\n% of the conditions or license applying to the docu" -"ment itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) readon" -"ly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the" -" file COPYING (GNU General Public License) for license conditions. As a special " -"exception, permission is granted to include this font program in a Postscript or" -" PDF file that consists of a document that contains text to be displayed or prin" -"ted using this font, regardless of the conditions or license applying to the doc" -"ument itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by (UR" -"W)++ Design & Development) readonly def\n/FullName (Nimbus Mono L Regular) reado" -"nly def\n/FamilyName (Nimbus Mono L) readonly def\n/Weight (Regular) readonly de" -"f\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -100 def\n/" -"UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusMonL-Regu def\n/Pa" -"intType 0 def\n/WMode 0 def\n/FontBBox {-12 -237 650 811} readonly def\n/FontTyp" -"e 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding Stand" -"ardEncoding def\n/UniqueID 5020945 def\ncurrentdict end\ncurrentfile eexec\r\x80" -"\x2;\xaa\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35" -"\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9" -"%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3" -"&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed" -"\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95" -"\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b" -"\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>j\"a\xc6\xf4\xe6\xcb\x13\x85\\\x81u\xe3\x14\x17\xd1" -"\x90\xd0\x36\xb3\x87\xd3\x95#D\xa9P\xf4\xd8\xc7x\x1b\x30z\x9M\xf1\xec\xae\xe4\xd2" -"\xc2\xfdt{\xc6\xf7\xf9\xc6\xbd\xe\x90\xc1\x92\x94\xf9l\x8c\\\xfe\x88\xfb\x34\xc4" -"wWJ\x1b\x16\x30\xb8\xccY\x15)\xe5\x9b yM\xa3.a\xde\xcd\xa8\xab\xbd\x1a\xe9V\xcft" -"\x1*\xa0\x1d\x42\xee\x1\xe8\x61\xb0\xaah\x97\xc8\x64x\x8a\xe5\x9d\xef\x43\xc4\x93" -"$o\xdb\x1a\xcaUL\x12YK\xc7\xb3\x36W\xa9\xec\xc9\xe3\xd1G.\xf8&\x7?c+\xe5@\xc3_\xf6" -"\xfb@Vgs\xf3\xbb\"\x4\xd3\xa5y\xa0\x8c\xcb\xc8\x44\xc1K\x18\xc3P\xf0\x3\xb9\xda#" -"\xa5p\xc3\x62\xd6\x0\x38\x93\xca\x32\xf8oY\xb8)\xc7\x8e\xe3\x18\x8bn?\x7f\xa8\x1d" -"\x7f\x62(%\xc6\x39\x63\x8d\xfbx\xb7\xaf\x1fP\xf[E\xf\xa5M\xbf\xa5\xcb\xa2w\xc7\x94" -"\xec\xe9\x32u\xa3\xde\xb\x45/\xdc\x8d\xdc)\x93\xba\xa4/(\xa6\x36\x0\x8c\xdc\xb0>" -"\xbfq\xbd\xca\xf3P\x19w\x89\x93\x44?\x88\x41*\xd2\xad\rqU\xa3\x94\x46\x6\x46\x32" -"f2-\xbc\x2\x44\xb0}\xa1\xe9\xc2z'\xb5\x96\x64\xe8VmzT\xcc\x3\xe9\x95\xaa\xd0\x8\xb0" -"\xa1~,>\xf6\x1fr\xc\xe7\xf7x\x85\x99\xc4\xe4Lp\x9c\xd5\xc3\x1b\x11\x10\x7f\x16\xad" -"p\xb1{\x9a\xfe.\x8c\xd9\"\xa7\x42\x8d\xac\x17\x14'\xff\xafQ\x6s\x7\xfa\xb0\xad\xb5" -"0\xe7\x1\xfd\"\xda\"\xc4\xcd\x30\x64\x6{\xd4\xf6\x8\x9cK,\x87\x93}\xd4&\xe4\xe9\xd2" -"\xf6\xe`\x82\x88\xba\xc9\x5\x65T\xd0IG\xe6\x92\x0\x61\xe3y\xcf^\x81\xbf\xd3/\xd3" -"~\xfa\xc1\xf6\x1c\xeb\xeeU\x1b\x8QQdq\xa7G,`\xdf\x89\xda\xa9\xeb\x1d\xc5\xa6~G\x97" -"E>i\xb9\xe2+\xafN<\xca\x41\x92\xd6\x3)[\x1\x8cJ\xb6\x9d\x18\xdeR\xdf\xdf\x15\xe9" -"kU\x7f)\nK\x8c[\x1ezl\xac\xa8\x1f#Q\xb9z\xdf\xc3i\x95\xab\xa4\x38\x3\xa6\xe5\xac" -"\x4\xa3\xc9\x34\x95\xf6\xd3\x81\x6\xb8\xb1\x44\x44\x9c\x7\xd1\x35\x82\x10\xf9\x17" -"n\x15\x65r6<\xfb\xdeWk\xfd\xf9\x9f\xa3)\xdd\x13\x46\xe8?y\xe0l\xf6\x82P\xcaW\xa6" -"\x89\x31\xbc\x7f\x34*\xd2\x95\xd0\xcb\xa1z\xa9[\xb8\xee\xb5>\xa6\xe8\xe6`\xb8\x14" -"\xe9\xf8W\xce\xcb\x14\xf4JC(\x8bi\xa9\xe7\x90\x8dU\xbf\x19\xe8\x44\x35\x98y\xd2\x8c" -"\xae\xf1\xc3\x8a\x36\x42\x1\x85\xd2\r\xfb\x32\xc2\xe0\x2 (\x0\xe8\xef=g\xc5\xd5\xe" -"\x91\x96W\xca\x95\x8bS\x8dS}P4D\x86S1\xd7\x9b\xfc@1 h\xd7#dP;\xd0\xcc\x84\xb5\xf3" -"\nt\xd8\xb5\xb6\xa2j\xf2\xdbvEd\xfb\x65\xa6\xba\x8f\x90Q\xae+N\xa4X\xd4jEi\xf3\xc" -"nw\xdc\x9sVw\x3\x62\xe6\xcf?\x16\x61\x7Gx\xeb\xb4O\xf7\xd1\xe3\xb6O\xf7^w\xe1\x1f" -"\xe5%\xbb\x12\x1c\x65\x46\xcf\xd1\x33\x0\xca\x1f\x2\xd5q\xb8*X%\xe6\"m\x14\xfd\xcf" -"'\xf0m\x87\x45*\x8bl]\xca\x65\x85\x35\xce\xe2\xa7\x95\xe5\x81\x37\xd4\x8eVki\xd5" -":\xc;vn\x84\xc5\x1e\xaa\"\x1c\x46\x99\x9c\xc8\x6Z\xdb/\x12\x9d[c\xf\xab\x18\x14\xc0" -"\xc3;Z\xea\xe\xfb\xb6\xe9\x94\xd8\x9\x41\xb5\x30y\xaf\x96\xd9\n\xb\x92O\x9b\xe\x31" -"\x9b\xed\x98\x36\xb8\xf9\x5?\x86\x83\x63\xd3\xcaUL\xbb\x18\x18\x63\x30\x1f\x8c\xb9" -"@\x87.\xd5\xfa{\xd1\x8c\xe3\x92\x18\xb5\xad\x8a\xc5}\xfu-\x94\x10v\xb1\xc6M\x99\xbe" -"\r\xb8mzm\x96Q\rw.\xb2LX\x7f\x11w\x9b\xd2\x1c\xfe[\xde\x1f)\xc1\xef\x90\"\xb2\xb8" -"\xbc\xd7\xf9\x11S\xc8\x45\x90g\"Gx)\xc4\x1\x11\xd8\x10H\xf<\xf6-\xe8\xdb\xa7\xfd" -"\x86\xcd#nef\x18\xca\xf6\xfc\x46\x82\x7f\xbcH\x98\xeavr\xf8\xc9\x97\x1a\xfe\x43\xe0" -"\xe0\x1e\xc8\xb7}J\xf4\x8c\xbf\x12\x10\xe9\x8c\x1d\xb1\\\x16\xd1I\xbf\xf5\x8a\xb0" -"'\xc\xf0\x15\xb1\x7\xa3\xa5\xf]\xc8\xf3\x7f\xfb\x92\xee\xc8\xcbgx\xdd\xb7\xceJ\xab" -"\xc4\x64\xc4\xaf\xf6T\"0\x6\xa5P\xebRHZ#\xd2\xb4\xaaq\x98\xd3\xcdTA\x81\x2\xf1\xe9" -"\xa4\xfb\xde\x37\xb8\x41\xe5o\\,S\x96m\xb9\xb6k\x0\xe\x45\x88(.?\xb8\xc,Q\x93\x39" -"\xf0\x0-/\x83\xc9y\xed\xc5\x82z;<\x8e\xf8\x81\n\xf\x9d\xac\xb6\xb9\x99\x8e\x9a\xf6" -"U\x1fV1=\xc4\x1\x19\x4\xcb\x97\x9a\xa2\xd3+\x11\xa8\x11\xbc$\x81\x41\xe4\xb9sM\x9f" -"\xb7\x98*Vq\x0-\x82y\xca\xb9:\xbe\x5ttb\x8d\xef\xc9]C\x89\r\xb1\xed\x34\xcf\xa8\xa2" -"\xb\xdc=\x87Nvy\xa3\x96\x15\x8eR.\xd0\xab\x96\x9aN>\xc7\xe4GN\x19%\x90PMT\xde\xb7" -"\xb2`\xb7\x93\\NVT\x8a}\x12\x1a\xc1\xf7\x41\xf8\xcd\xf2Y\xea\x1bX\x13\x17Zw\xa1\xd2" -"\xd3\xb\xa2oe\xebvZ\x4\xc0\x9e\xd5\x1fi\xf4\x15Q\xad\xf3\x99\xe6\xaa/\xc0\x97\x88" -"\x13{\xeaI\x13\xf1{\x8e\xb8\x38\xc3\x8f\xb2r\x1f\xdc\xb5_\xd6V\x97\xff\xb\x85\xe" -"}=\x1c\xe2\x66\xbf\x90\xf7\xec\x6\xa9\xa0\x87k\xdf\xe7g\xd3\xa9\x18\xb0\x92\xfcx" -"\xc7u\xf9\x45\xcf\x1f\x96\xe8Y\xc0=\xbf\x63\r\x9a\x94\x9\x39\x65L5I\xd8\xf7\x92\x1c" -"\xb9N\xe2=Z\x5\x35\xde\x9d\xf3\x1e\xa0\xf9\x37\xf8`\xb4\xf2 \xa9\x9a\xdd\xfc\x34" -"=|\xf7\xbf\xa0\xb8\x3\xc1,&@?\r\xcf\xfc\x8e\xa7\x86\xd0\xd8\xa8\xd9\xc3gA\x9c\xa8" -"\xae\x41\x19\xc\xe9:\x80\x86X:\x1el\x9dp\xb6\x12\xc8M\x87\xd2\xee\xaaq\xec-\xc1/" -"L\xdej\x82\x13\x3\xd5\xf6\xa9\xbb\xdb~\xed\xcd(\x9e\x80\xfa;u\xf4\x7fH\x1bPq\x9d" -"\xcfJ\x14 i95\x93\xb9\xaf\x9c\xce\xea\xecV\xa3[\x87\x87\x19=|\x88\x11>\x9e\x1e\"" -"\x1d\x15\x1e\x9;\x1\x9e\xf8\x9f\x61\x18\xbe\xc4sQ\x3\xcc\x80\x3\xccZ\xd1\xb6r{2&" -"\xcd\x44\xc4\x97\xdapR\xddh\x16\x95\xdb\xec\x33\x97\xf9Y\x8c\x91wp\x1cs\xbf\x5\x94" -"\xce\x93\xf2=P\xec[\xee/\xb9\xda\x1f\xc9\x66\xdf\x14\x8b'\xb2\x8e\xe3\xc8\x95&\xdd" -"f%\xe2\x88\x7f\x9f\xa0v|\x12|`\x9e\xe3\x15\x62k\xc1M'O\xbe\xa5\x65(\xdc\x6\xa2{-" -"GmF\xe9\xe7\x91\x65\x90\xb1V\xa5\xdf\x4\xa6\xcb\x15\xe3\x62\x45\xd7p!v{n[\xdf\xcc" -"g\x96p&?\xd8\x91\x44l3q\xb1\x1b\xb6\xe1\xdf`\xf9`\xaa\xb4\x14\x9dwS\xe6\xa5\xc3\x38" -"\x10\xc4,\x8b\xffN\x93P\x3\x38\x85\x6\xf8'\x8b\xd7\xcbg/\x13.\x6Z\xe6\x84\xdc\xa0" -"\xb9\x6M\x1\xdd\x62\xe\x7f\xfd\xfe\x4\xf1\x42w\xef\xe8\xe6\x1Y\xba\xf\xca?\xe2\xf2" -"\x8b\x90-J\xc2u\xd1\x9f\n\xc6\x97\x1e\xbe\x82|J#-\x87\x65\r&\x88\x34[\xcax\xf8y\x7" -"q\x14\xf0\x46<_\x5\x81\x7\xb6iVo\x81q\xe4\xe2\x84\xd2x@U\x80\xf0K\xff\xc9\x90'\x84" -"!n\xc\x9a\x17\xaa\x9b)5\xe6n\x18\xa7\x83\xf7#\xbe\x4\x43\x89\xb7\xe9\xd6*\xa3h\x18" -"\xff.\xa4\x6\xc3\xc1\xa9\xd2\xf3\x43o>\xe7\xdb\x8b\xe8j\xfa\x8d\xaajK\x1b\x84\x61" -"\x13P\xd8\xd2v\x5P\x96\x12\xb5\x15\xe1j\xa8\x43\x16M]\x8\x5\xe3j+\x9e\xf7L_j\xb\x9d" -"Y\xa0KUiq#'\xf4\xb1\xb3\xe\x95\x87\xcd\x10\x33\x37\x63\x99g\xcb\xdc\x65Z\xa4n\x80" -"\xd2\xcf\xd2K\xebP\x81[S8\xe5\"\xb3\xa7\xaf\xe8\x36*\xb4\xf0]\x8b\xc5+\xba\x9cP\x89" -"\xad\xa8\xc8\x95)\xb0'Z\xf4\"\xebT\r1\xa9\x38\xb8t\x8`uc%\xb9\x66\xb3h\x17\x11R\x13" -"\xfa\xaf\x92\xde\x63\xf6\xba\xe1\xe0\x6K\xfb\xc5X\x80\x98\xb6\x1e\xb8\x1e\x44\x90\xad\x1a\xc7\x93\xbd(\xfc\xd5\xef\xel\xc3\xe" -"\xf3\x9a\x8\xc5/q\x93\x9b\xc\xef\x62\r\xc6\x9e\x31\xe3\x9dm\xb9i\x4\x90\x31\xb0\xc9" -".\xf2\xdb\x65=\x97\xf3p\x14\x14V\xa5)\x85\x7k&\x86R\xfa&H\xc7\x92x\xb\xad\x63|Mu" -"\x81\xfb-b\x1\x1dW\xe2\x93q\x94\x87\xcf-\x1f\x1<\xfa\xa5\x32\xe1\xc2\xd3\x91x\xd5" -"\x12r\xa6\xaf\x4\x14@\xbc\xa1t\xb5\xcc\x90+\xd7\x39\xc}6\x95\x5l\xb4\xbdw\x91\xf9" -"\xfbm\x88\xe7\xa7\r\xef,\x97\x86\x9f]\xbc[\xd8#\xc5\x17\xc7\xb7\xc3\x9d\x62M\xf6" -"'\xdc\x96S\xeaSG\xbf\xda\x80\xb7#\xf0_m\xbbL\x9e\xa5\x1\xd8\x62\xac\xe0[\x9d\xbd" -"\xf2\x1bpV\xfb\xcd\x8cmK\x85\x87=\xce\xe6\x16l\x8bZ\xdc\x3\x16\xca\x12\xd9\x63\x9f" -"6\x1b\x15\xa4/\x0\xe1\xd6.\xdb\xca\x11\x11\x97/\xa0\xf4WX\xbe\xcb\x31\xdb\x38\x31" -"o<\xdf\xe1\xb4\x17H\xc9>\xd5\x8bg\xe9\xb5z\xbb\xedY$\xa6\xd5>\x99\xfb\xc9\xa9\x94" -"\xa6H\x9a\x8b\xdf\x13\xebhUH\xb4\xdcmb\xdat&\xc2\"'\xd4\xd4;o\xfc{^\xa9\x1c\x89g" -"0%>\x89\x41\xaf\xeeX\x83Y\xc2\xbe\xcfo\xfc\x41[\x9e\xb6\xd3\x1c\xcb\xfl\x7f\x85\x85" -">dI\xfambz\x97\xa3\xce\x83\x3\xf1H9:\xdc\xcc\xdf\xa2\xfe\x8\\i\x8\xbe\\<\x5\xaf\x0" -"\xa6\xf0(@ l2S\xa5Y\xac\\\x4\x9b\xdd\xfd\x11\xad\x9b\x11\x84\x3\xb8M\xa1\n\xe3\xc4" -"p\xcb\x9a\x9a-\x1d{s/Y\xf5\xfe\x14m\xed\xa6\n\xe7P\xf5Q\xaa\xc9\x34\x62\x1b\x44p" -"\xe1\xbc\x32LCc\x3\xe2_\x81\xd0\xdc\x31\x88\xbe\ro\xecT\x14\xc2\xeL\xb1\x89R\xe1" -",\xb6\x42=\xf7\x12\x46'\xac\xde\x14U\x0\xd7z\x97\xa8\xbf\xd9\xcbP\xd1\xfa\xa0\x8" -"\xe2\xce+%\x5\xa4t\x9f\x1e\xbb\xb0\x92\xc3G\x2\x37\x14\x5Z\x9b\x63\x35:\xf9\xe7\xfe" -"\xe0[\xb5L\x98\x43i\x81\x1\xf7\x98\x88\xa9\x15\x31w80\xc2\xc9g\xb5\x88\xd3\xac\xd2" -"\x19(\x83\xd5\xce\x39\x62\xd5\x10\x84\xfc\x65>\xae,_\xb2\xda\x41\xda\xce\xfb\\v\x81" -"-.\xdb[\x10\x96w(\x9c\xd1\x99\x8d\x45\x7f\xb1\x2:\x19\xacg)[\xbc\x1a\x9a \xa4&\xb0" -"j6\x8d\xf3\xc5\xdd\x8<\xb1\x18\r(\x7fU\x0\xf2\xc6\x35\xed\xe1W\xee\xfc\xee\xc5P4" -"G8-\x15\xc7H\xc1\xe3_hu9\x92\xe5\xc9\xf\x90\r\xe5M\x18\xf8\xe1\xb3U\xd1\x7j\xdf\xb1" -"\xf3Y\x1\x35\xfa\xd1\xa3o\x2\x8e\x44\xf4\x8a\xbb\x14\x9b\x80\xca\x9aTaMF\x7f\x8d" -"q\xcb\x31\xb\xbcz\xc7\x10\x2\x61\x9-\xb8\xc5\xbf\xd3\x9e\n\xc6\xbc,\x9dl\xbc:\x8c" -"\x5\xff\x8at\xcb!`\x8e\xc4\xa4\xcf\xe4\xcb\xaa-\x5m\xba\x14 a\x6\x4M\xec\xf5\x9f" -"\x95~\xf8\xa9\xca\xdeL\x9b\x19\xd8\xd3\r\xd4\xfd\xe6\xa9T\x8eP\xdbQ\xac\xa7\x33\x30" -"\x14!S\xfc\x36\xb6\x9c\x1c\x8d[&\xd0\xc6\x89\xb7\x4\xe\x81\xac,\x86O\xd7\xc0\x97" -"\xc9\x9b\xe5\x95\x38\x43\xe1r\xc9z\xb5hO5\xfb\x3\xa7%\xa8\x9d\xbf\x37\x1f\x8\xdd" -"\xf4\n\x15\x31\xfc\x1bgm\xb0\xe1T:\xecn\x97\xd3\xd2\xe4\xaa=X1\xd8\xb3\xc9R\xab\xbf" -"\xa1\x12\x35(\x14\xfbo\xab\x61\xa0\xd6\x80\xe6\x64\xfj\xec\x84& \xc\xf6\x12\x86\xf7" -"B,\xb2\xf7\x8c\x61\xeb\xaa\x36\xd4~\xc1m\x7f\xaf\x8bJ\xf3\x1d\x9\xc\xdf\xa2U\xd9" -"\xd7\xc6\x1d\x46\xcf\xb2*}n\x17X\xe7\x1e\xd5g\xe0\xc\xbd\x8e\x8f\x46\x8d\xdf\xb4" -"w\xf0\x91\xa2\xf9\x15\x62\x7f\"\xffG\xb8vTK\xc1\xf0;k\xbb\x98\x38_\x0\x9c \xbb\x1a" -"\xa2\xa7\xa7\x86ti+\x8e\xac.<\x80i\xb7\x9eg\x93\x38\xdaW\xf7)v\x81\xf\x84[\xebk\x9a" -"\xdd\x32\xb9]x\xe5\xe6\xf\x16\xdd\x16h\x9c\x5\xfd\x82\xd3j1\x15\xbe\x8e\xd4\x94\xa7" -"M\xd2\x11\xd5\x8a,\xdf\x98?\xcb\x9c\xdc)\xbf\x7f\xe)\x98\x8f\xa2\x35`\xed\xf5\x14" -"\xbc\x1d\x18?;*\"\xc0\x9f\xb1y\xb4~\x5\xad\xefH\xdf\x2\xf3\x1c)\x87]\x19\x15\x3{" -"\x19@wd\xa4)/\xe4Nt\x16Q\xa8\xe3\xbe\xb5\xf0\xd9r\xb6\x32p\x90\xf6\x64\x41|\x84\xf8" -"O\xfb\xf0\xaf\xff\x8b\x1d\x85\xc8\"\xd9\x7\x30\xab\x41@\xc4*Q\xaa\x8b\x1d\xbe\x43" -"\x98N\xa8V`@\xeb\x8b\x34\x1c\xce#\xfd?i\xdd#Z\x8\xb\xa5\xc6\x9a\xec\xb9\xbcs+\xc2" -"\xd7\xd4\x6\x17\xdd\xa6\xb7\x9f\xb6\xee@\xc3Ul}\xf9\xb2=\xad\x89\xe9@T\xb1\x34]\xb8" -"@*\xe6y\xfc\x46U\xa4\xa7v\xc0\x15\x4\x63\xf8\xdb+\xfc\x6\x8\xea\x1f\x12N\"\x1d\xda" -"\xe6\x2k^]\x0z~J\rk;\xc\xf3\xa2\x66\x9eg\xc5\xe4\xf0\x15Q\x96j{\xc4\x8f/Kj\x87\xe7" -"@\xd8\x9^c\xf7|z\x2\x7f&\xb5/\"\x99\xde[\x8a/b\x9\xbc\xf3\xd3\x1c\xb0#_\x99\x8fx" -"\x1e\\\xc8\x1e\x31\xdc\x42N\x0\x8d\x46\xec\x9 )Q\xe5hH\x4\xa0Y.\xa4}lx\x8a H{\xea" -".\xc8\xf2\xe6\xc1\xd7\xf3x\xb6-\xb4<\xa4\xe4\x8e%\xffI\xd5\x87\x1b\xd3" -"\xe6\x6R)\x8f\xe3\xe8\xd4\x0`\x9e#.\r\xdcyL\x5y\xac\xef\x89\xe8\x41\xb2\xed\xcaP" -"\xd5\x11Q\xf6^\x8c\x1c\xc3\xb0\x1e\xf1\x87\x5X\xf0\xbfWCq\x8c>\x6\x86\x17\xe8\x1b" -"\xfe\x12\xcl\xa1n\x9$\xbf\xc2T\x11w\xd5\x36q\xca\xa3\xab\x64\x1c\x41U}\xcd\xae\x1a" -"4aG\xb5\xe9\x99\xc4T\x1b\x8\xb4\xaf\xcb\xc1\x87\xaf\xd6S\xd5\xb5\xf8\x38m\xf6\xad" -"\x8f\xe6\x9e!\xbd\x5g\xdfIOslj\x18O\xa4\xdeH\xdc\x9f\x34w\x87\xca\x96\xe2\xe0\n)" -"l-\xa0\\*\xd9\xbc\x42>\x9c\xa4(\xd7\xf1\xfa\x12\xdc\x93S\xa3\x2\xfb\x8cR\x9a\xf8" -"h\x8c\xbbT;E\xb2q~\xbf\x8flIy5\xf4\xf3\xbf\xfd(^\x4\x2\xabuD\xb3\xca\x46\x43\xae" -"Z\x8bRP\xed\x98z\x95\xfc\x1f'[\x97\x7\xac\xd0\x64\x1b\xd0\xee*\xe9u\x84\x94\xf8\xd8" -"\xa5\x1d\xce@\x8a\x38\xac \xea\xf0\x85-r\xd8M\xck\xe9s2g\x93\xae\xb9U\xea\xc6\xfe" -"\n(\x13\xa3U\xdc\xd2/o,\xe5\x65\x88\xd1\xc0U\xcd\xdf\xa9\x88x\xbc\xebj\x1\x8d\xb2" -")\"\xd2\xb6\x0\xa2\xf\x81\x84.f]\xf4\x10\x13\xca\x9G\xc4#|+\xd6\nu\xe2\xfd\x1a?\xb8" -"\xc8\xfa\x19HW0\xb8ta\xad\x46j\xcb\x2\xdf\x8c\xa2@\x91O\xb0\x90\xb3\xd2\xb4\x1e\xb6" -"\xb8\xff\x5\xe1\xa5\x9d\x9f\xd6h\xafp\xba[\xb7'x\x95;\xa5_\xc5\xf9\xf6&\x4\x34P\xe1" -"\xd0\x9b\xc8=\x86\x5\x9\x8a\xbe\xf8\x84\x63\x9a\x37\x80\x9a\x32V\\\xbe\xfb?\xf3\x9e" -"\xe5=l\x18\xc5\x8c'+\xb9(\xe4\x41\xe\x36\x1eY\xa5\xf$-itz\x3&\x17\xc5-\xeb\xbf\x62" -"6J\xb5\xa9n\xfa\xf6\x42\xd9\xd8+\xa6y\xb1\xd7\xf\xac\x10\xa4\xeb\x62\xfa\\\xfc\x30" -"\x8e\x86\x36\x8a\xaa\xd7\xe7YH\xf4\x35\x98\xcd\x1cTJ\r@\x91\x37M~\x88\xd4R,\xbe\x90" -"#\x91\x64\x13'\xe8\x88\xe7t\x8f\xa8\x89\xdc\xe6z\xde\x61i\x9e}wv6\x81\xca\xee\x9b" -"\x1c\xa8\x83{/~\xf9\xc1\x8c\xbc\xc5\x38\xc4\x65\xc8\xe2\xdd\x34\x61iS\xcc\xb6\x3" -"\n\",r\x8b\x83I\x11\xc1\xa1y\xe2\xc7p(\x94\x7\xab(\xb3\x3\xe7$\xd9\x7ft}a4\xb4%!" -"jd\xc6\xe0\xb6\xf\x63>+\x85\x30\x0G\xe4\xc9\x3\x39\xce\x3\n\xf\xae\x31\xe8\x30\xc8" -"\xab\xa5\xab\x33\x86\xa3\xb6\x92g5\x1a{\xfd\xd6\x63V\xae^W\xfb)\x94\x45)\x93\xe9" -"\r\xe7\xc4\xe2`\xab\xab\x93\xc3x1\x85je\rV\xe4\x41r\xfe\xca\x1\xd6\xc7\xc3\x80\xf2" -"P\xb8$s\x96\r**_\xb6\xb4\xda\x66\x8f\x46\xe6$\xac\xf7\xfa\xf\xd4I\xfH]d\n:\xdf\xc9" -"\xf8\x65.z8\xceW\x99\xf7p\xc3`m\xb4\xb8\xb9G\xf9\x39g\xf7y\xe3\xa3\xc0W/\x13\xa5" -"\xa1\x87\xd3\x1d{\xd1*\\{\xe2<\xb6\xed\x61\x92\x8\x62\x41\xb7l[\xa6\x98=\xb9\xc9" -">K \x8dp}7`\xf0<\xd6'.\xf3\xa4\xce\x89\xb8\xe5.j\xc5\x87\x1a=\x3\xeb\x97WY\xabK\xe2" -"9\xe5\xecxB\xcb\xb3\x33\xe6\x92\xcc`|r.\x18]<9\x16M\xd3 \xc6\x94V)\xc7\xf\xf6jR7" -"\xc0\xa9R\n\x1f\xadn\xb9\x81`i5\x1a\xb0\xf1\x35\xd9\xc\xc0\x98+\x14}\"\x94\xaeJ8" -"\xa5'\xee@\xbe\x9c\xde%\x12\xaa\xeb\xb5\x90\xe1\x34\x38\x8b\xb1q\xd0\x95j|Ef\xd6" -"Z\x9a\x4\x1b\xe6\xc4\xf8\x83k>\xc3\xd2\xed\x1bH\xb5\x66\xa7\x83)+\x15\xb6\x12y \xd2" -"G\xd4\x94\xf0p\xbb \xbe\xff`d\xb\x11\xb2v\xdd\xee\xe4\x97\x6\xe8\xb2\xb2\x1b\xb4" -"\xb\x7f\x0\xaa\xfcYLI,%\xdc\xa7t\xe0\xb8\r\x82\xe9'D\x8d\xe2\xe7J\x9d\r\xc7\xac\x92" -"`\x9n\xaf\x18{l\xd6\xae\xaam\x1d\xc4 [D\x11\x12'Q\xa5\xb2&\x88@N\xa7\xc5\x86\x17" -"07\x1f\xfa\xc1\xfZ\xfdG'\xa0\xe4\x2\xab^\xa7W`ku\xeb\x86\xa0^\x8fwMnC\n\x1a?\xe2" -"\xa3~\xbb\x6p\x4t#\x9f\xb1\xcf\xa0^\xe4K\x91\xb8\"\x44\xc5u\xb5.\x7f\xaf\x93K\x4" -"\xee\xb0\xd9\x33\xfe\xb5~\xbe\x32mu\x82\x1c\x8b#\xea\xa8[X:\xed\x43 \xb7\xf0K\x9f" -"-\xc5\x91\x9\x12\x16\xfd\xe5.\x6K\xaa\xa9\xc2\xc9\xd9qK\x95\xa4U\x8c!\xf3\xce\xbe" -"bKT\x3\xb3\x15\x8\xf1xX\x1a\xf6\x86\x30\x83\xedv/\x1e.4\xa4\\\xfd\xd7\x16`\xd6&\xff" -"\x86H\xf5\xd6\xc5\xe5\x80\xd4vZg\xfb\x61Y\xec\x80w\xa9\xf0\xa8\x80\x38\xc8\xd3\xd7" -"\xc7\x7f\xf0\x92n!#\xbe\x87O{\xca\xf1)\xd5Z[Y`\xf8$\xbd\x17(\xab\xcf\xccQ\xd2\x39" -"6\xde\x9a%\xc4\x8\xd7\x86\xe4L:+\xaf\xa4\x42\x31w\xad\x6\r!\xd3\x8e\x15\xe2>\xb6" -"\xff\xc0\xb4\x12\xe\x81\x46\x95\xd4#\xee\xfc'D\xa1\xfc\x81\xb4\xdf\x89\xd7o\nh\x3" -"\xd8\xb1NuS\x8c\xaa\xd0:rQ{\x86QOiR\xf6\xfd\x61\x9d\x9e\x91\r\x98\xf\x0\x96M\xb3" -"%1\x8c\x4[\xdfyd\x7f\x45=J\\\xf4\xe6\x1d\xd5\x35\x97\x82\x82r)1\x4\x5\xfb\xcf\x61" -"\x7\xc3\xad\x9d\xde\xf9\xa9\xa3\x39\xd5\xd5\xa6\xeb.x8\xa0\xa4\x32!\xbd\x62\xcb\xdf" -"s-\xb0\xa6\x38\xa5 \x16\xfb\x35\xbawa\xae\xc8\x46\xa0#\xd3\xbf-\x1b\xb1\x83T>\x81" -"\xeb|\xac\x1eYp\xcd\xc6\xf0h\xc5\xea\x11\x8cz\xaeR\x8d\x13\x96\xe6\xdc\x93\x91\x12" -"\xda\x44`\xc8\x90\xea\xd5\xc0\x1b\xdc\x43\x8f[\xb7\x34!\x8b\xa6'\n\xdd\r\xc1w\x8f" -"\xd8\xab\x16\x83\x1dj0+\x81J\x1a\x44\xb0~\xdc\x65\x95l\x9el\xf4\x87]\xf5!\xf3\xce" -"[B/q\x8\x1bmi\xbd'\xfs\x90\x95\xc9\xe8\x1c\x3w\x93J\x8b\xc6\x39\xc\x42\xcNL\xdd\x9c" -"\xf7\xe3%\x44\xc6\x8d\x88N\x15\xac\xa3\xbc\xc0\x7f\xc8\xc1\x32\xd8\xfb\x9du,\x15" -"\xd7\\R\xc2\x88W\xe2\xea\x46\x1ao\xca\xd9\xcV\x84\x35\x13\xf7\x44\x61\xf1\x8dqd\xbc" -"Yz(\xaeK\xa7\xc8n\xe1p55\xa9\xb9\xedP\x12&'q\xfc\x12\xf1\x2\xe8\x0\xe0\xe1\xaf{\xb4" -"f\x81\xbd+\x14\xb6\x14\xce\xa9\x1b{*\xaa\x35#]\xe7l\xe\x11<\x92h\x8f\x8e\xc8\x12" -"w\xd5\x8c\x34\x6w\x8e\x1e\xc1\xcc\x15\xf1\xcd\x9a\x13|\x8f\xfd\xaa\xb9\x9a\xce;\xfc" -"x)\x16\xf1\xa8w\x17\x5\x89\xa9-\xc9!\xe6t\n\"\xb8M\xc6\xba\xcd\xab\xccv\xe6Ly\xe3" -"\xa5\x88\xd8\xf\x8fM7n\x1b\x42o\x15u\x1c\xf7\x39\x11\x2\x10/\n\xfa\xfd\x8b\"\xdf" -"\xde\xb5H\xae\xb5\xf3\xb\x16s\x2=\"\x5J\x13\x39\x1a\xe\xc0\x8d\xe6\xe7\xb6\x85\xa0" -"\xd0\x31\xaa\xbf \xb7\xc6!\x87\xc0(H\x92\xd5\xea\xad\xf1!\xba(&>\xb8\x63\xd5\xe3" -"n\xa9\xc0jw\xcc\xfc\xe\x17\xf5\x93\x96\x15\x91\xf8M\x82\xaf\x82>\xfe\x41\x4L\x8d" -"`o\xef\x83\xcc\xc7\xb0\xe9\x61\xe7\x99M\xf8\xa3\xcc\x36\xb2\x9\xd9S\xe2P\xad\xab" -"\x8d\"\xd7\xf2\xb4\xe2\xc9\xca\x39\xef\xa2\xd9>V\x19\\\x15`\xe3\nQ\x90\xcc[\x17\xfa" -"\xef\xcf%\r\xf7\x9fkbJK\x91~\x11\xc3\x32\"/\xcc\xfe\xc4\xf6\xa4{\xd9\xe7]\xa9\x85" -"O\xc3\xf7\xaeUN\x91\xed\xde\x14Mz\xef\x38\xa0\xe3\xed\xb5\xe5\xa5\x62\x63t\xdb\x94" -"\xf0\"\xc8\xcfT\x90\x93\x4\x1d\xe0\rri\xb7\xceTNt\x84\x39\xba(pq\x8c\x8\xe5\x8f\xb4" -"\xa7}\x93\xeb\xc0KyW\xd2r\xae\x16\x1\xd4\x1b\xf8Z+\xad\xaa\r\xf7;\r8A\xd4\x83\x9c" -"\x85g\x7f\xb2\xe1_\x1dl\xe5\x92\x66\x9f\xf4\xbb\xc9\xc6\x9d\xba\x33M\xc3w\x6\xf2" -"\xf6\xbe\x83\xd5\x86>\x8c\xd6\xa3\xc\x8\x64\n\xacL#6\x84\xe6kO\xe6\xb6-J\x8b\xe9" -"\xd5\x31\xe4{\xefV@\xd9\xb5\xc2}\x99\x0\x92\xbe\x15\x97\xf6\x99\\\x8aw\xbe\x9c\x18" -"\xaa\xe6\xc1\xcf\x13\x7u\xdd\xac\x41\xd3\x44\x38\xfcz\xd8\xe0\x42\xcbV\xcb\xf2\x94" -"I2\xeb\xa7\xd0S\xe9\x37o\xf3\x98\x36tP\xe3Z\x19\x45\xfe#\xe0\\\x92\x10\x96\xa1TT" -"r\x1f\xfd\xf\x42\x9a>\x6\xdc>\xd3o\x1c\x17\xb\xe7\x9c\x66\x99n\xf8\x33z\xff\x85\xb9" -"\xc]:J\x94\x45Z\xe9\xfa\x32\xe2\x11zc\xe5\x90\x1\xf0R\xd5\xf6\"\x31%\xbf\xaf\xa4" -"\x9\x1\xe9\x89`\xad\xf7\xbb\x88g)\xdc\xa8/\xc3\xb8\xccR\xb3\x7f\xf2Qr\x99\xe1\xd7" -"i\x5\x7f\x81T\xfb\x95X/\x2\xcb\xb\xec\xc8s\xa9\xc7\x17\x96\xad\xbd>\x91\x32O\xaa" -"\x94\xf2\xc4\x1c\xf5|0\xb5\x89}\x3\x1c\x2\xd2V\xc9\x9\xe0\x80\xe7\xb\xfd\x1f\x32" -"\xe6\x9e\xf6p1\x13\x8c-\xdc\xd1\xa8\xe4\xb6^H\\#\xc3\xe4P\xab\xdd\x98\x15Q-o4\xa8" -"K\x9d\xb7\x15\xdb,z\x93\xbf\xb4$1n\x1a\xa4\x43\x97t\x9c\xb0\x10\x88\x42\x8f\x14\x9a" -";C$s~\xd9\x95\x7f\xd3\x88$\x84\x62\xac\x1b&\x10\xd7+\xf5\xc0s\xec\xa5g\xe7\x38\\" -"\xc9Y\xe3|\xac~\x5G\x1`\xff\xa5\xa9\xf6;\x8e\x9b\x8)7\xe9\x11Xn\xa1\x65\x37I8\xf4" -"\x92\xed\xf2\x8c\xe6\x2\x9S\xa5\xb5\xcc\xecw7\xf9\xd9\xcc\x85\x38\xc4\x33\x95g\xaa" -"\xed\x37\x94\xab\xa3\xb9\xf4\xea\xe6Tf\xe8\xe3&\xf6\xc3\x99\xb3\x63U\x93_\xbd\xcb" -"\x99r\xf1\xb\x13IM\xc2P\x97\xfc\xecZc\x98\xf2u\xc8\xc1QU\x8et\xc5\x17_{\xaf\x41U" -"\xe3ks?u\xcf\x9d\\Yy\xb0vO\x14\xd8\x30n\x6\xba$\xbfy\x11\x41\xe4\x4\xc6\x9f?\x8f" -"\xcc\xd9\x1b\x9cX\xc2\xc6q\xaa\xe7\xd4\xf9\xe5\xd6\x41NF\xed\x63:_x\xaa[\xf0Ne\"" -"F\xa0\x66\xea\xd9\xe5\x82\xb1\x81\xcc\x19n\xa2\xd3\xcf\xaa\x38;]\xeL\xac\x93\x36" -"\xe1\x19\xc0\x8c\xc6\xacU\xcb\xfb\xae\x14|b;@\x4S\xbb\xf4G\xe9m\xe0\x36\xfc\x2V$" -"8CY\xee\xd7\xc7\xd5\xf7\x85\x8d\xc0R\x13w\xcf\x64z\x15\x7f\xc3\xf1\x88\xde^\xef\x9" -"M\xba\x12U\x10\xfd\xe3LW\r{\xe7j\xb5\xdf\n(\xbf\x45\xdd\xaa\xdb\xea~\xee\xdb\x93" -"c2\xdf\xe9\x30\x81\xe0\xaf\xd3\xfd\xd4k\xed\x8\xd6\x91K.\xfc\xfd\xc4\x16\x62\xa3" -";\x90\xb0=v\xd3OH\xd3\xf\xc6\xbb\xbb`\xe\x90\xe6\xacrC\xfd\xf0&v*D\xb4\xd6\xe4\xec" -"\xbe\xf4\x8c\x9d{ij\xf2\x9e\xee\x6>U}\x8f\xcf\xf\x9\xe0\x13oE\xd1~`\x8d\xa3nY\xf2" -"\xae\xcf\x84\x93\xf8\xd6%\x36\x11\x9b_~\x15T\xdf\xe3\xf6\xe8\xd7\xc9\xa2\xc6\xf5" -"W\xd1\x8bJ\xf9,\x9fn\x5\x9u\xc3\xb5\xc5O\x9b_N9\xd6\x0\xb6\xfa,\xd6\xde :\x17@(\xcb" -"\xb2\xa2\x1\xaf\x12m\x10\x13\xc2)\xbb\x82\xcf\xd0\x13\xed\x19\x9d\x1\xe5\x1e\xe2" -"x\xf\xe8\x96\xe0\x1c\x63\xc6U\x8z>a\xa7\xf1\x2\x9f\xa5\xe9~\xa1\x87/\x1b\x45\xf2" -"\"\x82\xdd\xc3\x17\xe1y&sh\xcbR\xda\x94\x44\xf6\x5Z\xd3\x95\x46\xa6\xaf\x1cR\xbf" -"\xcf\x81\xa2\x9b\xe8,G\xc9\x9e\x80P\xe4\x88\x9e\x45u\xb7_9\xe6\x62\xf2\xdbt g7\x97" -"\xe2\xed=g\xcd\xa7\xae,\x15\xd0\xa0\xa7\x94\xd5}\x16\x8e\xbe\x13!N\x89\xe0 \x9a\xb2" -"\xc0\xebw\x84\xe9I\x1a\xef\xa3\xc0-\r\xf3\xaeSe\xa0\xfcJ\xe0#\xca\xb5(\x16,z\x1b" -"\x17\x36\x64\x9d\xfa\xdd\xac\xa8\xda_\xa1\x8b}d\x89\xe4\"\x9e\x9e$\xd3\x8a\x62\x4" -"d\xa7\x44\xa5\xc6\xfo\x9d\x33K\x90\x87\x6\xb7\x38\xae\xd1\x86i\x8a\x8b'\x83\x41\xfa" -"Me\xa0\xa8\x86\x80\xbaHF\x94\x92\x15\x12\xf7\xde\x93\x33\x7f\xc1\xc0+\xbend\xaf-" -"\xad\x7`2y\xd8s)\x1d\x1fM9\xc1\xddm\x89\xc9\xf\x65$\xfH\x8\xf6\xf1\x11\\\xa5[\x88" -"\xe2\x42V^Y\xf3\xbb\xf1\xf1\xe\xc7\xb8\x88r\xe9\xae\x61\xd4L\xae\x18Tc\xed\xfa\xf7" -"\xdf\x63\xdeM\"\x7\xd3\x7\xaf\xb6\x15\x1\x89)e\x17\r)E\x84o\xcfYs\xa1\xd4X`\x7fP" -"\xc1^\x6\xe5\xbe\xc7\x15\xe0\xc1V%\x9a\xaalsU\x93\xe5VOe\xf4\x43\xb7\x8c\xc7Q.\xc3" -"ZV\xf1&\xdf\x9d\x30\x97J@\x87.Be\xe1\xae_\xd4\x83\xcf\xcb\xbb\xa2m\xee\x42l\xdcG" -"!\xf1\x9c?\xda\x86\xedz\xd4\xfa\x11 \xf6\x36i\xbe\xfep\x2\xb1(\xce\xaf\xd8\xc6>\x8a" -"\xc0\x99\x43\xb6\xcb\xdf\xb3\xd2Gj\x2l\x0\xa8\xff\x81\xb1\xf6Q\xb9\x7f\x31\xc\x82" -"\xab\xa5\xf3\x88\xcc\x1d\xb5\xaf\xcf\xf5\x99mRR\xa6\xa4/\xa4\xd9r\xe4\x1e\xe5`\x88" -"\xf7\x8c\xb9\x66\xf9\x5\x11q\xc4r\xc7t\x87\x9a\xec\xff\xf0\x8b\xfd\x9c\xea@\xd7\xc2" -"\x98\x92*\xce\x64\xf2\x8c\x14\xe0\xb8\x1fM\xca\xde\x81\xd7\x1d\xe3\x98=\x87\xd9\x5" -"\x19.\xf1<\xeeq\xb2\xd3\xff\x1a\x88\xae\xc6q\xec\x31\x89\x17\xdf\x98\xa3\xc9\x5N" -"7-\"\xa3\xce\xc8/\xcc!\x7fG1\x9a@\x90\x3\x12\xf6\xe3+Sk\x9ez\x7f\xa0\x83~\xc6\\\xcd" -"\xb5\xfb\r\x41\x43q\x17Yl\xb3\x9d\x93\x82&-\xe6\xe6Sy\xd3\xa9p\x9b,\xfb\xab\xf5\xfc" -"][5$%\xf0o\x88\xcd\x31\x1**AG\xb1\x12\xf0\xc1\xc0\xac\xcc\x80\x8c\xd6%\xe0\"\x8e" -"\xef\x66\x66\x1fp\xaf\x96\xd3\xdc\xfe\xcd@'\x0\xe4\xf6R*\xc9\xa8V\xda\x46mU\xc8O" -"e\xbe(\x10\xa1VQc\x87-b\xeb\x81\x33:i\x8e\xd7\xb6\x83R\xca\xcc\xa2\xd7\xad\x38\xab" -"U\xc1\x9eOU\x82\xf7X\x18\x30/_\xda\xdf\x1d\xce\xd0\x9d\x94\x87/-H\xfb\x63l\x8e\x38" -"\xc7V\xec\xeb \xf1\x94]U\xf4" -"\x9b\xc\xca\xc8IgY\xfc\xc7).F\x93\x89\x43\xc2\x62\xd7\x8f\x32\x12\xd3\xf9\xd0\xf7" -"\xb1\x3\x15\x7f\x42=q\xb1\xedT\xb2\xa6\x3\xf4\xc2i\x2\x99\x18\xf2\x38\xech(\xff\xce" -"\xc6`\x9\xdb\x9c\x9eYSN\xab\xb1\x83\xf3\x1dz\xd4\xc5{\x1b\xdf\xb\xd2\xceZB\x18\x82" -"\xbc\x10\xcc\x1b\xcej\x97\xe+Xk\xb2!V|\xcaH9\x89\xdd\xb\x8d\xec\x42L\x1d\x1f\xf0" -"B\xdc\xb7\x83\x44#\xcf$N\xda(\xd2\xd9i\xb1t@\xca\xea\xf0$\xa6\x11\x9d\xb0\x10\xce" -"6h!\xaf\xa4$\xd1\xb8)\x96\x9\xc0\x41H'Z\xe6\xe5%zz\xcb\x9c\xf\x7f\xc9\x80\xb3X>z\x8b" -"\x1\xc4\x65\x90\xe3\xbc\x4\xeb\xa5\x65\xc2\xea\x94\xf0W\xd9\x64\xa7\x8a\x90\xea\x9f" -"R\xab\xfdp\xf8ND\xe4\x34\xbd\x10\xa4.\x98\xc7\x94\x6W$4\x1f\x90~5\xd3\xcb%qa\xe0" -"\x1cp\x84\xe3\xa0\x16m\x15\xce\xd6]\xa7\xba\x87\xdb\xb2\xea\x33\xd3\x9b\xd9\x9a\xfb" -"\x93\xd3T\x83X\xd0\x83\x30\xe8\x7\xf8U,\xec\xf6<\x84\xf8\x5 T\x91\xba:\x1a\x62.p" -"\xc2\x32\xfa\xdf;\xf2\xdc\xfdo\x5\x39\x15\x8d\x33\x6Po\x15\xb\x5\x18\x37\x19\x12" -"\xa2^\xb9\x61\x63\xd7>\x9e\xee\xd4.\xdc\x84\xd6\x88\xbc\x7fw\x8\xd9\xdc\xa3H\xfa" -"\xb4\xdf\x62\xe5\x80\x9b\xd0\x94\x84-\n1\xdb\xb7\xc4\xb4\x1f\x94\xd9\x46\x81\xc^" -"\xc1\xbi\xaa\xbc,\x91\xa5\x95\x0\xb2\xe5\xd3\x7fGU\xdd\xfbz\xe4\xab\xf7W\xf4\xc5" -"\xbc\xf7|\x7f\x95\xe6\xa6\x16\x64\x64V\xfe\x8f\x18@p\x80\xbc\xab\xbf\xa5w\x4(z\xd2" -"b\"\xdf\x91\xab&\x13\x95\x1e-g\x94r\xf8\xad\xf0n\xa2\xa2\x2\x5\xec\x19\x97\"\x99" -"\xa7\x8b\xacR\x11\x43\x34G\xc_X\x90\xc2\xf8\x46\xb4\xc6\x4-s\x94Q'\xf2\xe3\x91\xe" -"\xca\x1cL\xd7\xa1n\xfeKK\xe3\x8a\x15\xaa\xa7\x10h,86\xa8\xca\x83\xfd\x38Ip\x13\x9d" -"\x8b\x46\xfb\n\xeb\xb0\x2\xdd\"\x41\x99g/\xfa\x2%\xf\xbc\xfaNd\x9e\x33T(\xfcq\xf5" -"\xf\x45\xe4\x98\x41\x9e\xdb\xe\x97\xf\x46\x89JH\xf6U\x80\x88\x1c\x9c\x42P\xfc\xef" -"e\xc9\xb2\x86\x99@\x8e\x18\xb2o\xe6\xdb\x7f\x1c\xbd\xb7gVNs\xcbYT\xc6\xd6\x39\xce" -"3\"\xc\x89O6\xe7\xfq\xc9\xf9\xaa?\xe2\xae\n\xa0\xe3\xf2\xe3\x4\xecZ\xbc\x66\x16u" -"\xcd\xe2\xe7\x5\x19\xe4\"\n\xe2o\xba\xcb\xd0\x1dQi\xeb\x84GPu>l\xedS\xe3g\x8f\xdc" -"\xd0\x8a\xb9>\x10\x6~\x9c\x64\xf3\x8b@\xb7m\x99\xb6\xcd\x92\xbd\xf4\x15Z\x1e\xa5" -"\xcc\x82I\x98\xb5\x9a\xad\x6\xe0\x9e_\x15\xeb\xb2(\x8d\x66\xeaq\xb2\x96\x61g4\xfe" -"\xf2yo\x7\xff\r\x8b\x4pt\xa1\x11\x1dh\xb9\x9c+p\xfcV\xe7JQ\xb0\x62\xf4\x99\x8a\xcc" -"\x85\xb1\x94<\x94w\xe4\x36\xe5\xcdz\xb1\x8d\xbc\x89\x8d!\xbb\x93GZb;\xdd\xa7\x1d" -"{\x89[\xa2\xd4\xc1\xfK\x90\xbf\x33Q&\xf4\xfdW\xd7:\xfaP\x17\xfk<6I\"\xe5Q\xd4\xe" -"5\xdau\xfa\x89\x17\x62\xfa#@\x1d\x39&\xf.\x92\xc7\x80|to\x13\xbb\x35\xce\xf9\xdb" -"\xf2\xe7nf\xa7/\xef\xf0\x95\xdaH*M\xe8\xa4 \x91pesl\xf4\xde\x90O\xb5.d\x9a\x32%^" -" 0\xa7\xb3\x1bhcSI/1\xc0\x64\xa3\xc4\xb0\x44\x8cK\xfd\x44\xb8\xe1S\x84\xfd\x80\x9b" -"\x87\x61\xee&\xa7\xdf\xa1u\x8dW\xceO\xb\xc3v\xeb+83SK\x15\xa8\x34\x36\xbaU9U\xac" -"\xb5\xa7\xa6g\x96\xac[\x92\xdbS\x88\xbcS\xef\xa2u\x8\xb0\x8e\x82\x82\x1e\\\xf6i\xbc" -"\xe5+\xb8`x\xft\x9bO8\xac\xdf_\xf1'&\xbf>\xc2t?\x1\x1L\xde\x96\xfekL@\xa0\x34\xe9" -"\xea\xfc\xa2\xa3\\\xccwl&i\xe6\xad\x13\x80p\xa4\xfH\xedy\x13m\x7f\xf5~\x99>\x9\xb8" -"\x1cT?\xba\xdd\x35\xf\xf5\xb5\xf7\xa4o\x6\xf\x88\xe3\xf\xe2\xd8#82\xd1\x8bl2>\xe0" -"\x17\xeb\xc1\xdf\\\x83\x83!\xcd\xc8\xa8L\xab\xca\xb2\xb`\xa1\xa3\xaa\x2\x8f\x36\xea" -"n\x87\xc8P\xaf\x8a\xf7\xcdP\xaa\x63Y\x3\x8b\xfa\x88\x18\x82\x1d\x2\xce\xe8\xf5\x1d" -"\xab\x8c\x5\xf7\xae\x97\x97\x81M\x97\xf3\xdb\x8c\xcd\xde\x45\xb2\x1d\xbb\x15\xce" -"\xe2\x92\xfa\xa5\x34\xa5\xf3\x17\xb3W\xf4\x9\x1f=\xa3W2[\x8b\x9f^\xdb\x45\x86T\x15" -"\x97<\x14>^[\xaaH?\xbf-\x6\xcd\xd4$fu\xecX\xb8Lj\xe6\\\xa7\x43\x11\x7f\xf0\xf\"\x92" -"Cw%a1\xa7\xf2\xba&\xa9\x11Z\xfd\x96\xc1\x82\x16\xcf\xdf\x41\xb7\"\xe\xd0\xcb?\xcc" -"&\xc3\x63\x80\x0{8*\x2\xae\xae\x42\x88\x87\xdc\x8b\xe5\xfd\xd6\x30\xacW\xee=\xc1" -"V\xc7\xb8\xb2\x9eh\x7f$D.5\xce\x10\xba@\x87)Zd\x1fq9\xc8\x31\xf7\xcc\xdal\xce\xb5" -"\xda\xfeS|\xc1\xa9|Z3}\xe>\x95\xf8^j\xc0\xf9T8\xacL\x12n\x1f\x1e\xcf\x33n\xd3\x1c\xca" -"~\xb2\x16\xd2y\x87q#\xfd\x9f\xcd\x8f\xb5\xe5+X|\xff\xc4\x42\x84V\xdd\xca\x81h\x19" -"\xa8\xa4\xa2\x11\xd8\xf1\x62\x9e]B\xbaL\\5nX\xc\x8a\"\xc6\x1d\x98uR\xfa\xa9x\x93" -"\x81m\xa7=B6\x86\xe4\xeb\xd4\x43u\xc2W\xf0\x31\x31\x88\x65\xa2\xf\"\x11^r\xbf\x1e" -"\xb9\xf9:\xaa\x16\x9c\x14\n\x33\xa0l5\xbd\x45&\xa3\x8b\xe7\x9c\xf4\n\xd1\xef\xa1" -"\x4\x11\xe8\xf3\x30\n\x8a\x8b\x97\xab\x14\xe\xe6sN\x1b\xeel\x8e\xe4\x43\xd6\x98\xd3" -"AY\x97\x64\x9co\x10\xf2\n\xcd\x80#d\"\xe2\x15\xe1\x46\xd7\x44\xa2\x62\xda?\xc8\x8d" -"\xc0\xd8o\xf6\x65\x12\xf4\x9d?\x95}<\\\xff\xeb\x42H#P\x9f\x33\xf1U\x5zLo7\xb5/Fg" -"v{\xa9Ok\x8b\x62\x85kU?0~]#\xc\x44\xcb\xfd\xc9\xa9zE\xb1\x39\xff\xb2\xf2V^\xb0\xe2" -" &\x97/\xad\xf\xb7\xb9Wo\xb6\xf3h\xb6\x19y\x94:9\x87s`\xe~\xe1\xdf\xef\xbf&\xd4]" -"@\xbd\xa6n\xbb\x96\xa5n\xe9\xca\xe0\xb2\x42\xc]\xd8>$\xdb\xa9\xff\x88[\xb8\x44\xbf" -"=+\xf9;\x7\x32]\xff`\xc0\xcb_\xdc\xca\n\xc8\xfbZ.\x11\x9dZ\xf2nS\xab\x8e;B\x84\x81" -"\xc2\x87\x1d\xda&\xef\xb\x62\x1c\xd8W+\x91/\x9aO/\xc0\x42" -"~\xd0pY/q\x10\x18;\xfd\xb2\xc4\x0\x39;\xa7V\x90X\"y&5\x1f\x7\xfe\xd4\xf3\x36\x33" -"\xba\x3\xa7*\xa2\xdckY\x8eI\xb9`!\xdd\x86\x8d\xad\xf\x35.W\"\xfbqOf|\x15\xc6\x8d" -"I\xc0=\x82-\x82g~\xdf\xe8o\xe9\x66\x8eS}\xa2\x84\x6\x8c\x9b\n\xed\x83\x7L\x92\xa5" -"\xb9\x39)mP[\x83~j\x9d\xda\xb1\xae\xabtU\xa0\x8a\x11L\"\"\xb3\x39(Ft\xb7K\xf4\xca" -"\x9e\xe0\xc0 \xbf*\x14\x8b\x43\x9cq\xc6\xbeQ\xa9L\xb6O\xbeJ~\xb2\x95ZEPG\xcf\\\xb3" -"H\xb0\x62\xedOdq\xcb\xc3\xe9\xad\xd9\xbe\x9b\x96\x87\x9a\xc7\xbcq\xbc\xe0/\xd0/\x17" -"\xc6\x6\x39\x85\xa5\xe8\x98= Z\xa1H\x9d\xa1<@\x89\x90\xab\xa1\xc5O/P\x1a\xa1r\xf5" -"0H\rx\x9c\x84\x81\x18\xc0\xa7N\xf9\x8d_`z\x6{\xaf\xf6\x3\r\x88z\xc6\xa6I\x7f\x9a" -"\xb\x38\xf9p_2\x8a\xadK\xfb\xb6\x34\xf7\x39\x38\x61w\xb0\x7f\"\xd5w\x12\x82\x44N" -"^\xe1s5\xb4\xd0\xec\x86\x11|i~y\xa5\xf4\xf6_\xdc\x8\xe4\x90M\xae\xda\xb2\x0g\xea" -"\xe2\x44\x8f\xd4\x30\x18I\xe4V\xd0\x85\xf3\x92\xdd\x13\x16z\xdfu\xcc\xfd\xb7#\xe2" -"\x90J\x9c\xc\x97mk\x84\xdd\xef\x9d\x92\xb0\xe1_\xb2\x46\xc3\xec\xc2\xd0\xbf\x31L" -"\xfb\x95wW\xb3\xa3\xe8\xe5\x80\x1fR\x6\x44\xe4`\x1d)\x1d\xa0\xf7P|\x6\xf3\xb9\xbb" -"6\xfc\x1cp\xea\xa4\x44\xe1NV\xc0\xcf\xf0l\x7f\x85=\xf3m\xa9\xd8\xb6\xaf%\x44\xb8" -"S\xdf\xffSZ~\\o\xc1\x45%\xc\xdd\xa2)\x95`\x19\x65\x9d\r%:\x19\xa7\xb5\x1aNS\x8b\xdc" -"\x1\xf7Mw\x4\x99I\xc2\xc9|~\xc6\x39,.a\xcc\xc0\x99+f\xda\xf1\xab\x8U\x10\x63\xe5" -"1\x80\xd2\xa6}\xe4\x96ql\xcb\xaa\x45\x46-\x9f\x91\xb6j\"TYb\xdd\xab\x12\x5\x11\xff" -"\x8\x62q1\xb9^]\xee\xb8\xb4\xdd\x96\x43\xe7\xb2\xaf\x65\xc0\xfd\xce\x11\xf5\xf1\xe8" -"\xdd\x46\x8d\xa1\x8d\x41\xc8\xc4\xf0\xe\xa7\x38\x36\xf4\xf7\xe\xc5\xf\xc3\xecm5\x8c" -"\x6X\xa4&\x1cm\x15\xa5\x82\xa2\xc7\xc9\x94\xe7\x88.f\x18U\xb3R\x1\x45v\x85\x8a&_" -"\xfb\xc4%\x16\x6i\xce\x15\x9d\x7\xed\xac\x4\xd0`\xb4NX\x0\xa7\xaa\xe8\xe3\x39\xc2" -"\x9b\x92\x9a\xa8\x1d/Q\\F\"\x9d \x80\xd5\x91z\xb2\n\xb6\xb3O\xdc\xa8\xe4\xaf\x64" -"\xed\x66\n\x31sxo\xb1\xa1\xd0\x5\xd5u\xc2\xa5\x18}?|\xfd\xc9L\xcc\x44\xa3\x8c\\\xd5" -"#\xe9\xdarm\x8e\xfam\xa7\xb6\x13\x1d\xff\x34\x35\xfe\xe8\x38\xb2\xc7\xd6\xb9y4)_" -"\x6 -0\x7f\xf7\x8d\x90\x66\x99\xcb\x9c[\xbb\x10\xd1\xd4\xde\xa5\xfd\xa5\xbf\xb0\x94" -"\xe7\x4`p\x83\xb6\x46\xd3\x7f]\xa1\xfcz\xd2\x1b\x81?D\xd8\xc1\xaf\xea\xb6\x66U\xaa" -"\xa1\x97\x3\xbe\xa2\xe7}\xf3\xbf\x35\xe\x17\xc7K4G\xa4R#Y\x19\x45+QuW\n\x0lv\x80" -"\xac\x5\xe8\x95\n\x62\xe1\x1d~:\xca\x35\xa3\x97\xd1\xe1\x96\x30\xd0\x94\xa8h\x7Y" -"<\x97\xf4\xc4\x84\xe4\xe0k\xcf\xf7\x8\xb6\xdc\xa9r\xe3\xa0\x0\x9e\x1c\xac\xe\xa4" -"\x14\x15\x30\xf5\xc1\xb8\xae\xf5\xe1\xb9\x33\xf3\x7f\xdd\xbcK\xe2+t\xfe\x34m\x1a" -"?_\xec\x8\x18\xf8\xe6\x17\x65V\x8a*\xc0G\x13\xe8(\xf9\x8c\x44\x9d\x9a\x1c\xceR\xd1" -"\ra\xdd\x8b\xfd\x8L\x8d\x9\x9au\xd8\x9d\xea\x64\xd5\xa7\xcch\xbd[\x5\x93\xd9yS\xda" -"\xda\x97\x63\x83\xf5\x1Y\x15\x61\x8a\xecV\xd7\x1d\x1d\xcdU\xb8\x97\x36\x39\\`\x9b" -"1Z?\x1e\x12UC/\xdb\xd3\x7f\x38\xcc\x43\xc3T\xfbK|D\xf1\xa7\x31\x8b\xb~\x99\xc3\xc0" -"\x8c\x33\xb9Sr{jc(\x5\x17\x83\xa0\xa3><\xd9\xe4\x98\x34j<\xa6\xa7{Qp\x96\xed\xd5" -"*\xe4\x43\xb8vC\xa6\x46\xc3\xa7\xbb\x97\xf7\x42\x88\x8d\x33\xf9\xb3\x12~a\x94/A\x3" -"\xc1\xdb\xdc\xd8\xea\xc8\xf9\xe2Yw0fsl\xa6S\xceW\xe8\x82&Q&\x1d\x84|\x13\x13!\xbb" -"\x9d\x66&\xa1\xacP\xd0G\xc0\xbaG\xb4\x11\xdf*\x99UE\xbdh\xec\x2\x87\xcc\x9b\x31\xd5" -"\xdd\xca\x87U\xeb\xeb\x10\xac\xcb\x39\x3\xab\xf\xd5x\x8e\x98\x42 D;\x84Y\xe7\xc0" -"x\xda\x42\x89\xf1\x35\x9\x5\x88\x1a\xd6\xdf\xde\xc4s\x2\xb0\xac\xb0\xd4\xaf\x8c\xae" -"\xd0+Kp\xdf<\xf8\xfe\xc1\x18\xf0\xfc-=\xde>IL\xd1`\xe6v\xe3\x0\xbc\x46K\xd4@\r\xb5" -"\xe\xe4;1N\x5\x17\x3{\xf9q\xac\xd7\xcd\x32|\xb2\x13H\x93\xb8\xa0\x41\xeh\xdd\xc5" -"\x18\xf5\xde\xc9\x66\xc7\x88L\xf5\xfd\xfetr1w\xf2\r\xed\xc0\x39\xd8y\x5l\xaa\xb4" -"\xbf\x4Pb\xd3\x90Oa\\\\\xfe\x10\x9a\xc7\xa3U\x99\xc9@$\xb4\x10\x19\xb9\xaf\xd4\x4" -"\xa8\n\xca\xa4\x83y)\xf5\xc9\x31v\x80\xa1=\x15z\x3\xb5\x9aU\x88\xdfy\xd2\xe1\x13" -"\xf5\xf5\x10!\xd6\xf6\xf9\xe\x8b\xbb\xa2\xc2R\xfd\x10\x65\x1b\xe8\xb\xaf\xd5\x9c" -"S\xa3\x36{\xa3\xc2\x8d\xb6\xeb\x9d\xab\xf1\xea\x99\xf4{P?b~\x15\xdc\xf3\xfd\x64_" -"\xc5,]]\xf/\x7\xdbL%\xc0\xd1\xe1\xc0\x1\x46\xe1\xc4\xd9s\xe6\x13\xcc\xdb\xd3\xf9" -"E\xc\xc0\xf5\x34=y\xf0^\x94\x92\xe8j\x1b\xb8\x89\xad\xf4\x5\x3\xbd\x7f>uCChY\x18" -"J[ \xbd\x8a\x17/5\r\x84kup\x80\x39\x90\xad\xaaH\xd4\xb9\x15Z+LK\xfb\xef\x1e\x1a\x6" -"\\\x8\xe0\x39(U\x97\x35\xbd\xd4\x42\xff\x1e\x83\xe1\xfa \xa5\xdaW\xd8\xbd\xb2\xff" -"T'\xc0\x34\xcf\x1(\xaf\x11\x1ens\x9\x9e\x4n\xc$\xe\x80\xa7={\xe7+\x87\x83NE\x89\x8d" -"GU!\xca\x33\x6pv1\xf5\xc6\x13\x61\x99\xf3Tc-\x1a\x8_\x12\xa1\xc7\xc4s\x86\x8b\x62" -"\xe5\x34\xd1_T\x84\x32>c\xd0WA\x96\xa1\x9e\xf1u!N\xb3Z\x90\x87>\xfc\xfb\x92\xd6\xcf" -"hv\x1d\x45\xe3~\xaa\x61\xe1\xa1\x97\x9a\x82\x0\x95\x7\xca\x19>D\xb3j\x80\x64\x86" -"f\\\xed\xbc\xf3\x87\x5:\xce\xab\x97\x9b\xd3]0\x97\x8f\xc7\x65\x9a\xbb\xe8\x44\xf4" -"\xec\xab\x33\x3\x31\x8e\xce\x80wz_\xa5\xa9\xdd\x91\xb3\xd0h\x4\xc4\xb4\xe9\xb4\xef" -"\xcf\x7\xeb\x89\x86m\r\xd8\xca\x39\xc\xfd\x15\x98\x65\x14\x17\x11Mxwk\x1a\x1d\x36" -"\xb4\xba\x17tmk\xe7\xfc\x12=G>\xf1\xef\xed\x1c;\xc1\xd5U\xf9\x14Shi\xfd[\xc\x35\xf9" -"\xc8?e\xb0\xe6\xbfzb{\x92\x2\xd7\x87\xd7,`\r\xdbk\xcc\xe6\x13\xd8\x84\x92\xe1<\xa0" -"\xaa\xab\x19n\x8aI\x92\x8c\x62\xce\xa4\xff\xe2\xd0 \x8e\xda\x33J\xcfG\xf2\xb\xd7" -"\x93\x12M,UF\xc0?J6Ci\xa7j\x4%&/\x9d\x91\x18\xafT\xe3}2\xe3:\xb2]\xd5\x33\xa4\x9d" -"\xf5\xfb\xf1\xba\xf4\xce\xac-\x9d\x37\x8c\xdc\xd1;\x0\xfd\xa4\x32\xd9\x4/b=\xa4\x1a" -"\xfb\x80i\x9bU8\xa2T\x3\xb0\xb3\xea\xbe\xc9\xe8\xef\xcf\x42\xfe\xf3\xea\x9f\x91v" -"i\x2\xcd k\x7\x87\xc1\x87\xd5\x37\xb`\xadm\xcd\x0-\xe2\xde\x8d\xcd\xc0\xb4q\x9ay" -"|^&\xba\xa6ve\x1m\xa0\xd9g\xfa\x13\x46\xf9X\x8a\xed\xa1t\xca\x0\x1b\x31!6\x17\xfe" -"\x19\xea!\x8e\xc2\x35\x97y\xd9y\xe2\x66\x31\x66H\x9c\x6\x99\x32\x30\xb0\xd0ys\xa1" -"\x17\xc4\xe3\xf4\xa4\xc9<\xf8\x42\x82H\xddS\x89\x41Mg\x9cidABg\xc7\xfe\xa1~5\xb0" -"\xce\xe4Vfz\x9b\x18u\xc8\x1b#\x2\xbd\xde\xa2\x81\x8d`\x19\xfc\x16\"\xa8 Q\xf6\x5" -"\x84\xab\xc9\x4\xcd\x91\x86v0]\xc0?\xfb\xcc\x64\xfd\xda\xc8\xd8\xaa\x9c\xe2\xea\x0" -"\xd6\xc9{\xc6<\x8a\x61}\xed\xfc\xe@wVIC\x8e\x9f\x61\xaf\xd1y^; V\xb\x1\xbe^\x9\x83" -"\xf1\x36\xcfH\xab iT\xe4\x1d\xee\r\x9d\xdd\x95=\xfd\x1\xca\xebV\x91Q\xd6\xbc\r\xfe" -"\xf2\x9dp\xfa\xe3\xe1\x98\xe7\xed\xd8\x92,\xe\xb\xcb\x8b\xcc\xf1\xc0\x16\x14,\x1a" -"\x8b\x33z\xfaz\x5\xa9\xd7SK\x18K\xf3\xbf\x82\x7f\x37\x1e\x9b\xd1\x9aq$N\xca\x1b\xa7" -"=HL\xd2\xfa\xd5M\xb2\xf0\xee\xfb\xd5KSn\xbc\xb5\x9Nk\xc2\xf5\xb2\xaa\xe4\x1f\x5\xb4" -"\xb3\x11\x11Xv\xed\x42\xc3O\x8e\x64;S7.?cP\xdb\x8a\x38\x44X\"\xea\x9a\x33\xe2\x7f" -"\xb0\xcc\x42\xce\xdc\xd1\xfe/\xdfr?\xc4|\x99n\xe3V\xc4\x2\x11/$\xd0\xaf\x89\x9b-" -"\x0\xbe\xa1\xcf\xd4'\x99\x8b\xd2+*\x9\x4mg7\x81\x44H\xac\xfb\x10\xd3\x87T}p\x9\xfb" -"8J\xf0V,\x85iL\x7\x15\x84#m\xf\x1f=?\xcd\xc\xfb\x38\xb7|\x81\x88\x90\x61\xe6h\xba" -"z\xb3z\xa6\xfX\xa3\x96}\xe2o\x93\x9by\xcb\xf1\n\x9d\xcc\x42\x85%\x61\xd8\xd6uO\x1b" -"f\r!j\xab\x1e\x13?\xba\xa3!\xc5n%\x84\xbe\\\x9b\xae \xcc\xf0\xe\x8d\xbem\x9c/\xce" -"\xbe\xba\xd9\x45\xc3\xc0\x41\x1\xd2\x38sQ\xf1\x32\x62\x87\x86\xf6\xd9\xd4\xca\xb8" -"4\x19(\x8d\x31\xf9\xbc`\r\x96\x64\x12\xe6\xaa\x45|\xe6\xca\xd2jL\x6q\x9{\x98\xc2" -"8L\x81\xdd\x8b\x9a\x32\"\xd4\xf4\xbb\xdap\x17\x89\\>\xdc&f'y\xae\xe7@\xd9\xd7\xe2" -"A\x85\xfb\x82\x19p\xb0\xa3\xa9@A\xa6\x9eH\x5\xec\x88\xee\x1e\xe5!\x98\x15\x36\xf2" -"\x84O\xb8\xf5\xef\x64_g\xd4,\xe5\x14\x8e-\xde\x43\xadZ\xef \xe\xdb:,xf\xc9\x84X\xa9" -"&f\xe5\xf9\xe0p\x17\x8b\xcc\x39\xf6Z\x89\x31\x2\xa1\x5\x64\xafN\x8c\xaa\xa5\x7]/" -"\x8c\xd7\xfa\xb0@\x1c\x3\xaf)\x9e\xa3Q\\\xc9\x30\x66tN\xb5\xaf|\xf0\xed\x6g[\xf0" -"I\xa6\xe3\xc2\x11\xa8\x9e\x16\xde[\xf0\x44Z|\xcan\xe8\xeb\x3GEIPH]\x88\x46\x6\x65" -"\x1eX\x87\xfe\x8b$2>*\xa1m\xe2/\xc1\xfc\x8cO\x6\xa8*\x1f\xdeWX\x97`$\x6\x81\x97\xe1" -"\xf4PnM=\x8a\x16\xd4\x4\x61\xa4Xc8\xb3t\xa5\x92\xdc`3D\x2\xf7\x63\x88\xadjE}\xc3" -"\xf5Nai\xcfz\xe3\x95\x96v\xe9\x66\xa4V\x9\x62\x10U\xec:\xf8\xe\x18&30\nD\x18\xe3" -"Jf\xdd\xfakV\x9eZ\x13\xc9\x11[_\xd3\xec\x1c\xeb\xe5\xf\xba$\x7f`\x80:\xa8\x39v\xf0" -"\x1\x17ScB\xdc=\x98\x90\xc4\x9b*\xc7\x1\xd3p\xe4:\x95Q\x18\x96x'v\xfp\x91\x46\x9c" -"T\x6\xf0\x8f\x18\xd7\xe3T\x81H\xcf\xe\x31+\x1d\xc7\x1d\xf6z^z\x16V\xcf/G\xf3\xaf" -"\xf3\xddP\xff\xc2\xfc\xda\xb7\x17r\x85\xb2\x9c\x17\xca\x43\x1\x9f\x62\xaco\xbaR\xd1" -"I>\xd7\xc4'Rdp\xac\xc8\x38\x9b\xae\x82wYIX\x90\x8fQ{(c\xb8\x32\x92\xebZ\xb3\xf5\x7f" -"\xff\xb0\x83\x93\xca\x61\xf\xb1\xfe\x90]\x88\xa0\xa1j\xc3\x95\xe2\xa2\xa6\xdd\x3" -"=j\rh\x99/\x83\xb.\x1b\x95\xfe\x35{\xf6rqn\x88\xff\xb9/\xfc=b\x94]\x1e\xad\"\xbc" -"h\xc5\x1e\xe0\xe1\n\x43\x1\x1d\xb9LDhZ\\Ev\xf6\xef\x44\xcb\xfb\x45\xf2\xa4\xbf\x11" -"\n\x1\x65}\xb5\x1f\xd4\x99v~x\x5\x81\x99\xb3\x1d\xfd`\x81?\x1a\x34O\x86(\x9f\x93" -"x#\x1d[\x15\x1c\x92\x38^6P\xb4\xfe\xb1\xdc\x91\x1\x8e\xab\x84t\xcb\xf6\x9f\xdc\x14" -"\x96\xa4\xd0x\xd2\xc3Q\xc8\x19\x64Q$z\x9d\xcf\x81\x17\xe5\xb6\x37\x37\x1d\x8e\"\xe2" -"H\xc6M\x99\x90\x15\xc3\xfd#\x11\xe9\x95\xb\x8e\xe0\x92/\xbd\xd3\xd7\xbf\xf7\x66\xbf" -"\xe9\xe7\xce\xb\xe1/1\x8f\xf2\xa7\xb5\xa9\xc6\xd0\nT@\x16\x9\x30N\xd2\xc5_\\\x1e" -"\xac=K85[\xbd\x85\xd6maco\xa6\xe3\xc.\x82\x82\x93v\xbe\xc9y\xa6\xfe\xee\x4\xe\x45" -"#Yv\x8e\xcf\x90\xccS\x9aTo\x17\xae\x90lv\xf1O\x86\xffiw\x97\x32+\x5\x1e\xb3\x11\xa7" -"Y\xfe&\xc\x1e\xee]\xac\xf3\x83\x81j\xaf\x12\x94\xcf\xfa{\xf8zM\x9b\xc5\x95\xee\x8f" -",/\x86\xfe\xee\x11\xad\x95\x9d\x86\xf2/\xda\xf4\xce\xc0\x98\x94*W\xe5x\x13\xa0\xfa" -"\x99#\x9e\x99O\xff\x35<\x1ex\x1d\x66k\x89(\xcf\xc6H\xfc\xf0\x86\x9f\xc6\x84h\xbd" -"\xbd\xa7\xd2\x80\xdf\xab\x8b\xb:L\xa3[\x7Khm\xe8\xd3r\xc6\x1f\xb3#\x5\x16\x9a\x1a" -"\x99\x12\xf6T\x1d\xa1l\xd6\x31jn\xa4QRGW\xbe\\\xf6\xe8 \x1\x1b\xe3\x85\x9f\xb8\xb8" -"W\x8c\x10\xf\xf0)h\xe\x5\xf0\xe0\xbf\x11\xd3?\xe1\x94`\xc8^\xa5\xe4\xc0\xef(\xe2" -"\x94\x7\xc8\xaek\xe0\x1c\xfa\rP\"\xbf\x9f\xb0\x14\x16\xff\xf7\"\xa7\x84\xdf\xc8\xfc" -"\xe3\x30\xec\x95sz\x85\x44q\xd3\x34\xfd\xc5\x8f\xab\x42\x86z{b\x83j\x8bVFn\x9al\x12" -"G\xd4n\xba\xff\xb9\x5\xcd\x43!\x97\xfY\xfb\x8do\xf6_\xdd\xd3K\xf9\x13\xad\x32.hE" -"\\_\xf2\xd2<\x1a^\xaeh\x7f%\x9b\xc9\x82\xb6\xa3\x84\xd3T@\xf7\xc6\x93\xcfP\xb9\xec" -"\xac\xbUx\xca\xee\x87X\x8bV.\xb6\xb7\xf4 4\xc9\xf2\xe5\x45\xec\x86\x63\x16U#T\xeb" -"7(\xc7\xd2\x65'\xedu\x17N\xaf\x63^\x4\x8b\x8\xdc]#\xe8\x89\x81\x7\n\xd5\x64\x1a\x65" -"/#D\x95n\x9c\xf4\xc1ne*\x99\xf4\xa6\x44\xd1x}m6St\x89\xdaMt\xe6\x1b/\xc4\xdf\xdf" -"\x1d\x1d\x9dX\xf9\xc2l^\xb6\x32\x0Rj\xfd\x16\x8a\xc5}V\x11\xad\xe4\xd4\xa3\x82\xfc" -"(\xbb`\xf9\xe7\xd6&\xa6\xc6z\xfb\xcc\xd1\x18<^<\xf2\xef!\r\xb\xf5\xcf\xa7\xbb\x10" -"\xfa\x38\x87\xbd\xd4\xcd\x96\xee\xea\xa8\xf9!\x9a\xa2\xf1\n\xbc\n\x96\xc;W\xc0\xec" -"\x3\x13\xae\x10\xcc\xff\x1fR!$\xcf\xc8\xd2\xd4\x9b\xfb\xb0\xc1\x93\xea\xff\xc5\xb4" -"\x8f\xb3\xff\x30\xb2\x1c\xb7o\nL\xf\x13w\xc9\"\x31\x45\xbb\x4h\xa5\xd7\x1b\x9b\xc2" -"Xs\xea\x12\xe1\xc6\x3\x34W\x1cg8\\\x0\xd0\xb5p\xd3\xff\xc6\xc7\xff\r\xe6,\x18\xc3\xad\x39T\xea\x9c\x84\x61X`1\xd3i\xe8\xb9\x9eS@\x8ay\xd6L4\xebZV\xde\x8ag\xde" -"\x91\x83y`\xe9\x8a\x66\xfc\x4\xdf\xa0\xeb\xde!\xdb\x0\x32\x34\xbbxf[\x3\x9d\n\x46" -"\x9a\x2!\xbdT\x1a\xf7\x14\x9a*e\x9c\x30\x1\x32\xc1\x45\x81\xefvo\xff\xbe\xcb\xa8" -"\xb5\x8a^\xb3\xf9TF\xde\xf4\x9a\xf8\x63\xa8\x11=\x17\xb2\xe7\xe6\xec\xde\xaf\xc3" -"\x83MM\xf9\x0\xe3GU\x96\xe8o\xbbN)t\xc0\x90\xdbJ\xd6\x1as}a\x1d\x92\xb4SZ\xc2\x91" -"\xc5j\xd8\xb1\xc0\x31\xd2\xf9\xb5\x5\xbbwQ{s}p\xab\x37#\xdbR\xae*\xcc\xd5\xdd/at" -"#\xed<\xc3\x9c\xa8\x82\xef\x41u{\xf7\x15\x18\x6\xa9\xb8\xb0\xf3\x12\x80\x88\x63\xe3" -"g?\xb5M\xe9\x39\xb3\\\xde\xca\x7f\xbcM\xc3\xbd\xf5\xa5\xf4}5\xe3\x45\x91l96l\x8b" -"OC\x9c\xe1\xc6\xf1\x83\\\x32\xb\xd1\xe6su\xb0;]\xe1\x8c\x93%o%\x17\x61\xa4\xc8\xce" -"\xc0\x10\x19\xc0h\xe3\x44G\xbc\xc5\x3\xb9W\x1f\xe8\x0\x6'\xa6\xb3\xda\xd5\x85L\xbc" -"\n-i\xe5\xa8\xf4k\xc7\x8fj{\x14\"\x33N\xc7\xa9\x8a\xbe\xfe\x9b\x83\xe0\x1d\xcf\xb7V\xa1\x37o.\xdc\xb7\x18\x9dx\xcd=l\xa5\x86U7\xee\xc3\x1c\x17\xd8" -"\x1`^\xfd\x86\xb\xb\x62\x94ri\x5\x88\xd0%u\x2\xc6\xf7\xa7[\x9a\x1c\x1b\x39w\x81\x32" -"\x98\x32\xcf>\xc4<\x9\xf1U\x9c\xd5\x62\xc4\x8f\xa9P\x2\x95\xcd;\ny\r\xd3\xfc\xd4" -"hJ|z\xc4\x9a\xc9\xbf\xff\x36\xb3\x9a\x9f\xb1H\xbc(\xd3y\x7\x43\x39\x43\xcb\xbf\xc" -"\xbd\xab\x46\xd3\xea\x86\xdc\x8f\x81\xc8Y\xc5-\x15\x30+\x94\xa9\xb5\x1c\x19\x9bq" -"\x4\xde\xec\x9dv\x9c&4\xce\xcf\x8bp\xc\xe9\xc0\x41R\xccY\xc9\x32k\xda\xcb\xec\x43" -"\x12\xde\xed\x92\xdd\x8z\x1cH@\x86\x8d\x9f\x97\xca\xc0\x46X\x1fv/u\xe8\xd2MdE7\n" -"?\x1e\n\xe7Jdx\xd9\xda\xc3~\x7f\xa5\xbe\xbe\xc0\xa1\xe0\x81\xaf\x89\xc1\xbb\xf7\xf5" -"\x1e>.\"\xc8\xc4\x5\xe8g\x1b\xa8_\x1b\xf0\xdfy\xa4\x65\xda\xc7\xec\x7\xf7\x31\xe0" -"\x6\x32\xe0\x17\xd1\x90\xa9\x9d\x83\xe2~\\.c\xd7\xda\xbb\xa2;.\x88\x33Lcr\x1a\xc5" -"\xa4\xcb\xc5\xd4_L\x17rY\xf3L.\xad\xe0\x1f\xa0\x8\xaf\x65\xeb\xc6\x1\xd8\xdd\x16" -"Cm\x86\xaa\x94\xc9\x9f<\xc0\xa2\xf8q4\xe7;\xf2/\x10\x8b\x82Z\x89\x63\xb4\x9clhTt" -"\xaf\xe4\xa5\x42\xc8\x64\x1d\xc0\x37]~\xfe\x9a\xc1\x16\x8d\x97\x0\x45\x9b\xe5-\r" -"\xa3\x99\x2>\x14\x19i\xf2\\\r\xac\x46hSKfG\xec\x85\x45K\xe9\x45\xe8&\xb2m\xe6\xe3" -"\xc4XK\x97\xa3\x8e+@\xa0\xd2\x34\x81\xbc\xa7\x80\x84\xfe\x80\xe0\nq\xa7\x90\xbf\x31" -"\xdf\x46\x8a\x43^\xcc\x88\xe6\nW\x86\xb\xbc\xa3\xd6Y0\x18n\x99\x17\xcb\xd2\x9\xc2" -"0\xe8\xf8%Zz\xbc}?\x4:\xe4\xd7\xad\x63\xd9\x98\xb\xed\xf0\x62\xb7\xd5\xc2\x98\xc4" -"\x2%\xb6\xd0?)\xa0\x33\x9e\xf\xca\x2\x13\x8eRo\x6\xb9\xefG\xf5\xe7\xa8\x6\x8a\x84" -"l\xfd\xe2\xbf\xde\xbd$\xf5\xa7:f\xc0y\x18\x66*\xec\x80\xb4\x32\x46(O\xa4\xe2\xee" -"\r\x9a\xab\x17+\x1eY\xa6\xcc\x46\xb8\x1\x14\x9d\x8c\r\xf6\xde\xc9\xa5]\x8e\x1b\xe" -"\xfd\x9d\x30/\xf6\x18\x7YD\xcc\xcbh1\xd3\x36\xb1\x16\x17\x10{\x5\x30\xd0\x98\x85" -"\xe5\xca\x11\xa5\xf1\xfc\xc8\xd6\x9d`=\xa1k\xeaQ\x11mB\xca\xb1\xaa\x1eM{\x9bMy\x99" -"?+\xfeS\xea\xc9\x4\xfe\xb7\xb-3\n\x89x\xe\xac\x10\xd1,\xc0\xc3[\x83\x99\xf2\x18\xac" -")v\xe5z&\xba\xd2\xc\xe2\xfa*\xe2\x36=?\xd2\xa8\xa9qtuV\xf2\x95\x9d\xa7J\x89\x63\xc2" -"\xbPG\x11\xae\x1c\xb0\xd0\xc0$W\xff.\x9b\xf6\x96\xb1Y\xaf\x3\x1d\xd5\x15_!\xc0\xf5" -"T\x9b\x4q\xa3\xc5\xdc\x89\x18\xb6u\xce\xbc\xb2>)2+\x95\x9a\xbc\x5(:p.\x87\x8d\xe8" -"\xef%\xeav\xf<\\{{I\xd3\x98(=\xe2\xed\x83\x7f\xd5\x9f|\"\xd6,X\xfe\x44H\xb1\x4\x9f" -"\xde\xbf\xc8x~g\xd7\xda\xfe\x97t\x97\x9b\xb3\x80\"T\xdaY\xbc\xc0!\x9f\x98\xc2\x19" -"\xf8M\x99\\\xa7h\xb8\xb5\xd9\xd4\xa3%%\xdf\xec\xe0\x3g^\xe4\xbd]\x8d\xff\xc1\x10" -"%\xaf+F\x8f\x92\x7\xb5\xb2\xb4#I\xb9\x82\x32\xba\xc0u\x97X\xc1\xf4\xa2\x83@X\x15" -"\xbdqE\xc9?\xa0\x8f>\xd2\x82\x66U\x5:<%Y\x7=\x8a\xcd\x19\x9d\xea,[\xa5\xf6\x16\xa2" -"\xe4\x85H\xb4\x37\xe\xc7\x34\x93\xba\x7\xe1\x97\x16]\xcawD8\xb0vhg\x81\x9c\x11T\xd1" -"\x95\x9f\xe6\xe0\x1e\x63\x12\xe0\xab\x91\xfc.+\xd2@\xfc\x86R\xa2\xd4V\xa1\xde\x7f" -"4\xef\x37*SyMLN\x5\xb\xf3\xca[{\xd2\xf1\xb8\xde\x93\xb4\xc8\x0$\x85\xcb!\x9a\xd2" -"\xd0)s\x9f\xd3\xc8\x1c\xc6\xe7\x8e\xdf\x38r5v\x1aW\x14>\xed\xe5\xcc\x88\x7f(/\xec" -"\xd2\x61\xf6\xa2]\n~\x15N\xcd\xf5\xdc\x38\xe4&\x81\x1b\xe8j\xaa\x45\x85w\xe5\xe0" -"\xc5\xf0\xf7Z\xaf\xa9\xc4\x1e]\x1d\xc9\xd9\x1e\xcdy\xb5\x14\xf8\xcd\xf7\xa5\xf1\xa1" -"\x89G\r5\xfd\xf4\xf9\xb8x\x88y\xcc\xbd\x91\xb4'\x82.\xd6X8\x9e\x98\x1e\xe\xe5\xf7" -"\xfb\x87i*>>\x93\x1d\xf8\xa1\xd1W>;\x1\x66 B@\xb7\x8\x0\x89\xa0\x9e\xf7H|\x9a\xee" -"-f_Z\x82\xf9L\x87\x7f\xb5\xb0\xdcS\x1c\xeb\xf1\xe7\x1c\x65\x92\xce\xa2@\x1eKQ\"\xe5" -"\x9\x1d\xf0= =\xf9y\xb9\xa6\xef\xba\x12\xe2\xf6\xb4\"\xfd\xf1]I\xac\x9\x14\xd3r\xd2" -"\x1e\x87\x1d\xe6\\\xbe\xcd\x10_\xd4\xa3\xe4qK\x9c\xca\\h\x3\xfa\x39\xdb\xb0\x15\xea" -"\x8a\x88\xbey\x13P.V.[\x17\xb\x87\xbf\xc8W-\xc9\xdfI\xad\x63iC\x11\xef\x13\x34\x44" -"K\xdf\xbL\xa3$Rq\xc1\xf7\xa4\xd7\xfa\xf1p>:\xa0\xe1\xea\x8d\\n\x82\x1b(p~\xe0\xc9" -"\xb4\xf2/#yo\xe8sV\xc5\x8a\xe2\xca\xdc\x19\x1fLX\xe1\xfbX\xda\x3\xb4Z%\xac\x95\xdb" -"\xae\x13\xa2\x93GB\x17\xbd\xb2\x14t+\x9d\x9dj\xf3_p\xfe\xd2\x89\x19\x42\xea\xce>" -"b^U\xff\xb8 T?\xbb%\n\x6-=9[\xc0\xf2\x19\xec\xfe\rvhj\xc1H\xbc\x41Gj\x88{\xc4\x94" -"\xdd\xbd\x39k\xe2\x0\xfd>\x3\xcf\xa1.\xc9\xafk\x93J(\xb4\xd7)\xf\xf5\xfa\xfa\x8\x8b\x1c\xec\xcbl\xf5\x1aX\xda\xad\x99\x8f" -"\x8\x39l\xdf\xd6\x8fZ\xbc\x9c\x1c\xcb\x8f\x65\x14\x10ws\xc6\x9c&\x87>\x88\x9d\x1f" -"y\xd1\xe\x86i\x10\xe4hA\x86\xfc\xd7\x1c\x96Z\xdf\x62\x39\xba\x34\x18\xb3\x13\xa2" -"z\xd6\x32\x30\x9i\xb6\xf2\x84Q\x93\x66\xed\x85\xe7\xcd\x96\x8d\x64\x82?\x8cY\xb5" -"\x91\x1ar\xd0\xa2\xe\xb7+`:a\xe3oR\xf2V\xff\xcd\xf7\x6\xb4V\xbM\xfa]\x91\x8f\xbc" -"S\r\x83\xa4\xb3\xc0\x1b\xdd<\xb4W.$$-\x14\x1b\xf9\xe7u6i:\x4\x7\xd0\x2\xe0\x9c\xda" -"[\x19[\xf1\xcc\xf4\x30\xae\x98$\xc0y(\xa0P\xd0\xb4`\xf2pK\xe8\xf9\xe6G\xa4\x88LE" -"g\n\x81\xea\xcf|\xc0\x38\x64>\xb0\xff\x18\xa3v\xffo2\xb6\xfeO\x19rs2\x7f\xbb\xde" -"\xc6\x44:)\x9c\xadK&\xf7w\x8a\x99\xf6Z\x11\xbd\xe0G\x15>v@9\xed\xb2Q\x93j\xa4=\xee" -"P\xdd\xfd\xf8\x85\x65\x19\x5j\xaf\xc4\xc5\xaeo Q\xaf\x5y\xa9\xac\xd4\x1d\x0w]}\xbe" -"p\x2,\xc2\x63\xdc\xa5\xe0\xa2[\x9c|O\\A\x85\x87\x66k/\xe2H\x16\xb1\xe0\xec\x92\xf9" -"\x7O\x14\x3\xbb\x83\xaf\xc3\xf1\xd5,\xa7\x9c\x38{\xde\xf8\x64\x36n4\xc9\xb\xe5/z" -"\xa0\x99\x35\x37:\x7\xe4\xe0&\"Nv\xf9\xec<\xb9\xe7\xed\xe5\r\xef\xdaH$\x8d\x61\xf3" -"\xce\xc8\x80\xa3\xb8\x84\x33\x6\x37]\x97\x11\xe5\x86\x45\xf3\x62[\xdb\x8e\x87\x5" -"-\xa6\x7f\x97\x94\xefJ\xf8\xdb\xb\xcf\xe0\x6w\xc3\xa2i\x7\xdc\x65\x1b\xc8\x38\xc4" -"\xe\xc3\x9e+Z]\xc0\xdb\xd3\x45\x94Jl2\"`\x89\xd6\xb5\x9a" -"\xad\x42\xa8:\xb4\x1b\x43-\xb4\x62\x65.)\x81\x37@\xf4h\n]K\xd4{\x18\x32\x8f\xaek" -"\xdf\x42\x0\xcf\xa4\xce\x37s\x80\x9b\x45\xe8\x88|\x9b.B6\x98\x9flH\xd6OY\x86\xf5" -"c\xd9\xa7S\x8a\x87\x16\x8/\x81\x93j\xeb\xd0\x46\x1eoK\xd4pCm\x8bvV\xf0\xfd\xf8\x91" -"\x8\xe6\xdd\x2\xab\xde\xf9\x7s\x1d\x45\x8di\xb\xc6\x8\xea\x9c\xed\x9\xeb\x1end\xc0" -"y\xcz#x \x1c\xe9\x97\xff\xe0\x31vy\xee\x1dN\xe9\xf9\x11WD\x93#\xe5;J\xda\x80\x96" -"\xcd\x62\x8bXa\xbfyEC\xa9\x8f/\xa2\xabT\xff\xf%\xa1=\xad\x43\xda\xf9\x39\x43)\xb9" -"Z\xa5<\xa3'I\xfe\xcb\xb+\xc0\x35\xdd\x1e\xbdS\xff\x9f\xb5\xad\x8b\xce\x6\xcd\x89" -"\xe5V\x80\x91\xc1\xcc\x31L\xfb\x1d\x98!\xd7\xf9\xac|U\xf5^\n\x16\xe3\x9a\x87\xd4" -"1H \x1b\x92\x8fP\xbf\x80\x99\x98" -"\x95y6\xd3\xbfj\xbc$\xb0\xa3\x97%\x8f\x9e\xb4\xdc\x8f\x65i,\xb0#\xd9\x9\x1f\xb1\x80" -"\xc6\x94\x98\xcd\xc\x8\xbb\xeb\xad\xc8J~\x0\x16\xe8\xf8\xbe\xa3%\xd9$\xeb\r\xf8." -"u\xd2\xcc,\xcb\xf0\x39\xb1\x19\x34\x36=C2\xc5\xfb\xc5\xecUk\xe8^\xe4\xe7\x7\xcc'" -"S\xcc\xc4=.\xd5\x5X\xe5\x1a\x10\x42!\xc9\x32<\xdc\xb0\x19\x9b{\x83\x45M\xe3\xfd\xc8" -"\x10\xd0\xf3\x62\xc0)\x9f]\xd9\x81\xb3\x1d\x8e=\xda(O\xef\x9d\xc8\xf9\xc8\xde\x13" -"\x8d\x30\x65\x43z\x7f\xe8\xc3\x5r\xad\x6\xd6.\x85'\xad\x37\xae\x39\xaa\xb0\xb2%\xf7" -"j%\xf6\xc6PRA\xeds\xbaIL\xf9#\xe9\x19\xf6\x88\xdd\xeb\xf1\x93\xe1\x88\xf8\xc4\xc1" -"T\xf2\x16\x31\x8\x7\x63\xb4\xd0\x91\xe8\xad\x1d/\xd6\x64\x9e\xc\xd9\x36\xe\x8d\x1a" -"g\xa5\xb5\xfa\xfcgT|\xa3\x1c\x95\xa5\xea\x8dN\xb5\xd6\x8b\x9fme2\xdb\x9bTXG5\x95" -"XT**\xe5\x8c\x9\xf3\xbd)\x18\xef\xbe\x16\x99\xe9\xc8\xf2\xc2\xa1\x1e\xa4\xd2$\xc7" -"&\xd2\xac\xd4\xa8\xd8\xab\xae\xdc\x65\x88\xcf*\xe5\x66R\x8b\x94\xf5[\x82:*\x1f{\xe1" -"\x90\x0\xf3\xe7W\x9d\x9N\x4pu\xdf\x18\xc8\xc8hv\x2\x95S;&\xeb>\xd9\x6\x35\xb1)\xc1" -"z\xcag\x9c>\x88\xb0i\x98\xceZz%D\xb7\x0\"\x9fZjPK\xd3\xe4['dq\x95\x9c\x8a?\x81\x91" -"zSB\x87\x39\xb5\xef\x9e=F;;\xa7\x31\x84H\xe2\xa3\xe7\x95 \xd2\xd2\x45\xa2\xa7/1\xff" -"pp\xb6\xe4\x62N:^!k\xd1\x3\x64\xc\x8d\xf3\x87\xe4\x9ds%)\xc6\x11\xf8\xb9q\x7?\x17" -"\xeb\xd2\xf6\xeb\x18\xf9\xb7Jg\xe1\x99y&\xdf\x17\x8dL\x9e\xde\xd4\x35\xb9h/\x1a'" -"\x9c\x81\xbb\x9f`\xda\xfe\x12XE\xa2\xff;\x2\x97\x9eT\x81\xc7\x8a\x45\xc4y\xbe\xfb" -"\x9f\xef<\xe2\xba\x9b\xc4lw\xb5\xb\x3\xe4\x8d\xa6\xd1{v\xf0o:\xd1\x18\x37\x1a\xdc" -"i\xe1x\xc5+_\xb4\xb2\x61\xc9\x31\x18t\xed\x7\xddm[2&\xa0\x5\xfd\xd7\xa6\xd5\x38H" -"\x9\xe7\x6?\x3l\xde\xa4\x16\x19\x12&5\xe8\x35\xd2\xd7L\xbbj\xa9\xb3\x8c\xaaM\x81" -"\x9c&\xe9Q\x15\xfe\r\xba\xb4\x19\x8f\xc5\x83\x8f,\x91\xb7\xa8{\x7\xd7\x34\xc6\xd4" -"\xf4\xf8\x34\x44\xc1\xe9\n\xa9\xbf\xc9\x8\xa2\xba\xc4\xb3\xde\xf9\x15z\xfc\xa5$\x8f" -"-\xa3\x1c\xa8{\xd3\x63\xac%\xe9\xe7\x7ft\x1dK,n\x2\xf0I\x87\xa6\xf4\x9d\x30\xe9\x3" -"\x8c\xef\xc4\x1b\xa1r\xddgZ\xed\x8b\x39!dA\x11\x44\xe5\xb7\x38\xf3!\xb\xe\x66\xb1" -"z\x13\xcb\x96\x31\xc3=DHNy*|\x8-\xd0\xa5\x38/4\xc5\x63vS&\x1b\x1e\xb6\xd2\x3[\x8" -"\xb4\xd9\x1f\xa9\xabw\xc\xaf@\xa1\x3\x62\x95\x11\xf7\xb4?'C\xd7\xe5\x83\x43=\xec" -"\xfb\x19\xc2\x1f\xd4\xfd\n\xfc\xc2*A\x19\xe7|\x87\xbf\xe6\xfeP\x6\x8b\"G\x90\x15" -"\xbeZ\x9f\x6\xbe\xabM7A.\x6*E\xe0\xcb\xcd{\xb3\x9f\xeet~\x96\x30oy\xfcO.\x89\x42" -"\xdf]\x9d\xa0\xe5Z\xac\xcd\xa5G\xda\x19\xd3\xb\x84\x4\xfa\x12\x12\x98\xb4L\x9c\xce" -"\x19\x8cp\x8ci\xa8\xd6\xbf\x17Y\x1c\\P\xd3\xfc[\xe6\x96\x1fz\xba\x8f\x36m\xae\x95" -"z\x1c\x37\x30\xdaJ[O\x3Z\x92tg^\xe3\xbb\xf0\xca\x8c\xe9\xd8\x34\x9fP\xca\xbb\x1c" -">\xa4\x94\x8a\xbeo\x9f\x14\x35\x92\xf1\xea\x95@Ni\x9\xa9\x9\x16\x8e\x32y\xa9W\xae" -"\x19$$\\5c1\xa7^p\x8\xbe\xe9+\xea\xa3\x4\xba@\xb7\xc3\xf4\x8ft\xd9\x1\x8b\x32G\xdf" -"P\xeb\xd7\xceT\x1d\xa4\x8e\xcc\xb1\xb0\xbeQ\xa4U\xc3\xc1<'\x9dM\x86v\x7\x8c>\xbe" -"C\x8t\x8dR\xc9\xb0\x41\xd3\xe7$Lt[\x1f/t-\x1\n\x9e`i_>\xc4\xfd\xc1\x5\n\xc0\x82\xb9" -"\x5\xd6\xa5~\x8f@z;G/s\x10\x11\xa5y\x89\x65\xb7\xb1\xa3\x7\xe2R\xfe\x2\xc8\xf7\x9c" -"\xee\xdd\xebn\x16_\x1a\x94\xd7\xff\xf1\x8d\xdb\xdfyG\x7f\x14\xe9\xe9\x39\x81\xab" -"\xd2\x0\xfewq\xb2\x9d\x1d-\x12\xe\xe7\x9d(\xb9T8\x18Rp9\xact\x8^\xaf\xf2\x41\xb5" -"m\x8\"\xc\x95\x8b]\x9c\x87\xc0\xc0J\x14\xd5*\xfdG[T-9\x1b\xc5O\xf3=\xef\x8d\x94\x84" -"\xaf\xf6\x87;\xee\xd3-\xdaK7\x11\x12\xb5#\xb6\xce\"\xb4\r\x1b\x41kd\xc9\x37\xf\x1c" -"\xdf,T\x8fL\xcb\xe9\xe1.!\xc3l\xc3\xeaR\xda#-\xcf\xb6_f\xb2+^.\xc0HRQ\r^&N\xe9\x39" -"\xbbg\xae\xc4vK\x87\x6*\xeb\x7fh\xb@\xbc\xee\x4\xad\x45\xc7Q\x9e\xb3\xb6\x19\x9c" -"\x9e\xe\x33&aF6G\xf2\xfb~\xdf\x30>\xfe\xf8H\x91\xce\xbc\xf0\xfa\xc5\xf7#\xa9\xd0" -"Gl?\x8c\x9&\x4\xc8\x7f\xc6\x9cz\x90\xf4\xd6J\xe4ZG\x8e\xe8\xba-\xf5\xf\xb9?U\xa3" -"Ta#\xf0\xb0\xe2\xc1\xc4\xc\x98\xea\xae\x9f\xf&\xb8\xf8\xf\xfenk\x94\xb7\xe2}(\x84" -"\xd5\x8b\x8a\x11\x96\x62-\xf6\xbe`\x8cUi\xd7\x86K\xb7V\xdf.\xdd\x18K\x90\x81+D\xed" -"J2\xd0\x1\xc3\x13\x83\xa4\n\xee\xe9t6Q\xf7\x95\x8\x46\x15\xc4\x8e@-\xbc\x1\xc8\x18" -"\xd4w\xea\xc0\x34w\x95\xcb'\x92\xe9\xc1\x1e\x8f\xd4\xa0.\x19N\xed\x1c\x91\x9d\x45" -"\x98\xfe\xc0\x3\xb6\xd9\xa8\xa0\xbc}E`G\xa1\xc0W\x94S\xfc\x1d|\xb2\xd1X\xd4\x66\x93" -"\x9a#\xd7\xa7\xb8\xab\xed~'w\xect\x87\x97>s\xf2&m\x9c%\xc\xe3\x7)\xe3\xc5\":\xd9" -";\x9a\xe8\x44;5q\x1e\x44j=\xc6`\x12>\xd4\\\xe1\x94*\x1a*\xd0\x61\x4g\xe0\x81\xce" -",\x8b\x92\xa6\xc8/\xb\x17\xb5\xd2\x42\x9e\x99\xf1\xa6&\x80r\xc6\xb5\xaa\xaan\xb6" -"(:\x87,T\xd3iL\xd8%\xeb)&\xe5}\xbb\xc7\xc1\x66\x30u\xe6\x87\xa1\x44\xe4\xd6\x1c\"" -"W\x81\xd8\xf\xca\xe1I{D#B\xb4\xa3\xf1\xcdk\xdbP\xe3\x17\x91\xcc\x39(\xc3\x8\x35\xfe" -"\xf8\x45\xb6\xbe^-~?/_\x8Z\xa3\xfa\xeb\x45\xca\xd0\xd7k\xcb\xb1\xed\x85\x9a\x9c\xeb" -"\xb9\xf7\x45p6\xf0\xbc?\x19\\\xb1\xa9\x8c\x9c\x86H\xf6X<\xdb\xb2\x38\x94\xbcq\x9d" -"h\xc2\xdb\xd8\x0;\x10\xd0\x8c\x8c\xaa@\xbc\xe7\x84\xd7\xbf\xb4\xee\xc9\xeaSY\xac" -"\x5nW\xb8\xb0\xf2\xeb\xcb\x1fL\xe4\xc\x87\xfcxa\x18\x1\x33\xe0\xcbl\xe2\xfcO\xe6" -"\x90um2z+Z\xe0\x63\xe3\x2\x1c\xc\xb\xd4 \xd0V\xf0\xb9\x41\xe6\xb3`\x88\xa5[\xa1\x1d" -"\xc\x35\xfd\x1\x32\xd5\xf4\x8e]\x96sW#G\x17\x1b\x43(\xd4\x80{\x97(1\xc0\xd7L\xff" -"\xa5\x63\x8c\x14[\x89\xc9\x89\xe6\xec\x94!H }m\xb8\"WXYX\x3M\x9f\x9d\x42!\xc7\xc9" -"\xf7\x1\x37\x90\xdb\xd1\x30\xf2w\xe0\xbc\x88\xbb\x17\x9d\xd0\x9e'\x6#y\xed\x6\xf2" -"^\xea\x8b\x7f\xb3<5\x86\x1a\x0\x34wn8\x13\xd2\xe9\xe5\xc1\xe\"|\xc5i\xab\x36\xcb" -"-\x9d\xf2\xe7\xb7\xb4GX\xf9\xdcO\xfa\xd7\xa2J\xc7\xe9\xf4z\xa8P\xc2!\x4\x8c<\xb3" -"Z7\xce\x8e\xa7V2\xae\x65\xfe\x32\x12\x17QF\xfe\xcd\x63\x34\xae=<_I/\x6\x7fy^\x1e" -"\x8f\xf3\x86\xba\x19\x8c\xb7O\xb\xb4\xdc\x0\x0\xda\x38;\xc4\xcc?\x7\r\xe1w!C\x19" -"\x88\xd6\x9c\x8b\x1aZ\xfd\xcc\xc8<\"\xe1j\x87\xe0\x1cm>y\xdcz\xfa=\xb0\x37\x1b\x8" -"f\xef\xb8\xb6\xf8\x89\x0G*\xfe\xf1\xc4\xa8x$\xb9\xb9\xc6Y\xa5T\xe1\xfc\xe4*^\xc6" -"Z\xc3\x91\x90\xefKf\xde\xafo\xc0V\x9a\x0\n\x9e\x14\x95\xf4/po\xbe\xa4\xd3.\xb7\xef" -"\x11\xa6H\x91\x2Yje\xcf\x89\x9c/2/Vy\xc6\xd1#F\x91\x92\xa9\xbf\x1a\x7f\x1f,\x81\xc5" -"T\xad\xb9{\xd1\x9a\xdbtjO\x81\xa4\xd5U\x9e`\xab\x94\xc4\x83\xdb\xab\xf6\xce/(\xcd" -"\xb4\x12\xd5\xf\xf3\xfc\xfa;=\xaa\xac\xc6\xa8<\xfe\xd9\x10\xcc\xb3\xb8\xd2\xc1\x95" -"\x90\xaf\xf4\xd7S\x3Jl\xe7\xf4\x15h\x96\xa1\x38\x8\xe0\xdf\xea\xc5G\xe6\x9d<\x88" -"f\x91r\x8eJ5\xac\xd5u\xb4\rr\x1e\x8f\xccS\x85\xa2\xeb(\xd7\x8\x10\x1d\xc5\x8\x11" -"R\x95(\xf5\xcb\xc\x0\x9b\xa7\xe3\xc8\x84h\xe3wh\xfb\r\x83\x89Z\xb5M\xb2\xddT&V*\xf9" -"\xd8\xaf\x30K\xf6\xed\xa5N\x9c\x92\x64=\xf9&\xf5\xc3W\x82iu\x1 0*7\xcb\x14\n\x18" -"\xbaV\xba\x1\x10\x8dJ\xca\xce\x8f\xea\xe6@\xa6\xc6\x95\x8e\xf1V\xb5\x88\xad\xb0\xea" -"_;\xf\x37\xbb\xa1+{\xcb\"\x1c\x81\x14\x15\x38{\x2Kpv\xfa\x44\x3\xa3\xadn\xbb]\x9c" -"&\xef\xeb\xdbz\xde|`\xb4\x44\xab\x9f\x90\xeaI;e\x8bwg\xae+\xe6I\xbd\xbb?\xe8_F\xf" -"\x1e\xd1\x37\xc6\x1b\xd9_|\xd3\xd8\xb0\x15\xce\x45\x13\x85\x38\x93\n\xb6*\xa0\xe5" -"KL\xe1\xa5\xec_\xec\n+(\xb3\x45\xb6p\x89\xa4\xe4\xae\x14\xd2\xe1\xf5\xa9\xc8\x84" -"\x8d\xa6\x88\xca)\x8f\x93\x86\x6I\xec:\xaf\xef>\x82\r\x86\x98\x8c\x8e>ZMK\xb9\x37" -"y\x18'\x99J\xa3\xe8\x1d\xb\xb3\xee\x11^\xc3m_\xb9\xa3\x92\xd0\x9ey\xafQM\x11\xc7" -"\xb3\xa0<\x9f\x9c\x13\x35\\\xe7\x9e\x11\x9a\x19\x17\x7f\xfd\xca\x34pM8\x11\x8a\x89" -"v\xd1\xeeZ\xa0-\x14\xfe\xb1\x41\x44\x19\xf5\xe8RD\xad\xc5\xc0\xa7\x65\xa5\"\xee\xf3" -"ap\x6K\xb1\x9f\xee;_{D\x1eM\xb9g\xda\xe0\xba\xc2\xc4\x8f\xc6\xa8\x36\xe0\xefZi\xf0" -"s\xbe\xe1i\x9fU\xe9\xc7W\xeb\xd6\xfd\x8bQN+I\xd6\x33\x38\x15\xb7\xdb\xd1\xe0iF\x95" -"\xfc\xa3\xd2\x13 \xa0\xc4\xb8R\xd9pm\xad\xd8\x36\x9a\x95\xfd\xd9\x17\x32\x8b\xe9" -"=\xd3\x38\x18\x95M\xbd,!-,\xa8\x15`\xed[\xc2\x84\xeb\x4z_8\x9e$\xe4?O\xa8\xc9\x7f" -"\xec\xf4\x65\x89\xfasA\x7\x65U\xcfU\xb1\xc2\x1b(\xe0\xc1\xcb\xb0\n\xb8\xb6\xf6tr" -"\xf2{\xc0\xd1\x11H\xf4\x7\x82K\x1Y\xb5\x18\x8dK\xb7\x38o\xbd\xbf\x1c\xf\xaf\x34r" -"\x1b{\xcb\\\xf\xcb|@\x10\xdc\xb6\xa1(N\x9dx\x83\x9e/\xea\xbd\xb7\xf3'" -"y\xaf\x8e+P\x94\xa6\xe9\xb7\xa7\"_$\xc4:\x8e]+\x97~\x1e\x19\xe6\x33\xc2gq\xe2\x30" -"\x17\xed#=\xbb\x2\xc6O\x8c\xf0\x39\x92\xc6HE(\xd0\xc8\x46KF\xf2O\x9e\x83\x80\xf3" -"\x85\xd5\xd0\x1b\x88\x93\xc6\x7f\xc1\x3I\x89\x83\xcf\x93\x94\x32\xaa\x38\xc\xa5v" -"\xd0\x90\x30\xcdR\xfd\x99\xbd\xc3\xbe\x16\xc7 L\xdc\x33\x65\xbfv)J\x83\xa1\xfc\x14" -"\xa2\x36\xf5\xfeS!\x90Nw\x9b\x13#*v\xf8\xfeR\x1f\x42Ubg\x84\x36\x35\x9c$a\xbe\xa5" -"\xab' \x95\x41\xf5W\xae*\xa6\x0\x9\xc9\xca\n\x9f\xc7\x89\x8c\x14\x30l\xe3ZP\x1{\xad" -"\xef\xde\xcb\xbf\x94\xee)\x5\"\x7\x6\xdc\x80\x64\x9\xef\x87\xdb\x1ds\xea\xb0i\x8a" -"\xd2\xdbr\xcd\xcd\xb2\x93\xe7\xfb\x13\xc9M\x9f\xc8~tP.i'\xa2\x12\xf0\xd7\xd2\xf2" -"\xd1\x94\x64\xf7\xa6j\xc0xr\xe1\x8c\xb1\xdd\xe8\xf1\x18\x35\xdc\xbc\\N\xf0\x39\x33" -"?\xff\xc0\xfc\x14V\xda\xad\xe7\xda\xe3\xec.\xe0\xd3\x41[\xc\xab\xb6\x9f\xc5\x0oM" -"\x14\xa4\xee\x1a\\\xa9\x9a\xd4\xd5\xe6)\xc0\xdd\x1e\xf\x9{[\x93\xde-\xd0\x1\xa8\xc4" -"\x18#L\x9c\x45\xe8\xc1=\x1a\xe0N\x94\x66\xda\xb8\xcf\x1e\xcb\x88\xa4\xe0Y\xc1\x11" -"\xa6\x46\x8d-\xab\xb9\r\xa7\x9c|y\xe9M\xb2\x8fih\xb1\xa6\x32\xf8\xc5}\x9eV_\xf9\x1c" -"i\x16\x2o\xfa\xc0\x66\x18V\xb9\xfb\x8d\xe9\xc8\x16\x61\x81\x62!\xb1\xfc\x15\x9c\xfe" -"\xf1u\x1e~@?_,\xe3%)\xddT\x7\x92\xfc\x17\xa1*=\xcd|P\xd3\x8e\xea\xad\xbd\x10\xad" -"\xbf]\x8a\x82\x44*\xa9\x0\xce\x61P\xebzF9\xdd\x9f\xb6\xe3\x85\xb2\xfd\x9\x34\x93" -"\xdc\xcd\x90\x14\xb2>\xb1r\xe2\x1a\xa8\x96\x43\xa6\xca\xd1\x9\x33\x43\xd8]\x81&\x19" -"r\xde\n\xcb\x16\xa4\xc6\xb5\xf0\xbeL\x97\x8b\xfa\x12\xd3\xca\xf0\x13O\x9e\xa4\x9f" -"n\x96\x87\xc8\xf9\x9a\x45gE\xea%/\xb\xa9\x96\x8c\x7f\x95\x86\xe3\xdd\x84\x1a\xa9" -"-\xc7p[\xddh-\xae\x41Q\x8a\x9\xdf\xe \x9f\x32\x1d\x7f\xa3\x41r\x2\xf4\xbav\xa9\x84" -"\xda:\xdd\xbcX\x13h\x85\x36/\x2\xf0\xa2N\xbc\x43\x9b=\xbb\xda\xcf\xfd\x84\x98\xeb" -"\xd2\x9f\x88\xf0\x16\xb1\xfe\xab\xc1\x7\x85\x43\x8e\xac\x86\xbUE%\xf3&`\x97\xa6u" -")\x9a\xa0\x96{\xd3\xb7\xa0\xee\xee?\xc5x\xd1\xbe\x99\xd3S;\xd9\x15q\xae\xd9\x4\xbf" -"\xc9\xda\x1a\x14Q\xfd\xc5@n\x1c\xd6\x14\xe0\xc7\xfb\xc7\x33V<\xd6\xcel\xc3\x1e\x92" -"7\xca\x15?\x1f\x4\x11\x11\x43\x61\xd7\x31\x63k\xcf\x98UZ\xbf\x12\x84\x8a\xd1\x9\x37" -"\x1a\x42\xb6\x36u\xa4\x13\xb\x81\xe9|*.\xe2\xbb]\x8f\xae&@\x15`\x1\xaf\xfU\xd9\xd5" -"\xdf\x8f\xf2<\x8a\xef\xe1O\x12\x0\x0\xf1\x41I\xa3n\\\x94\xcd\x90\x81\xde\xc2w\xc2" -"\xc3Hp\xd0P\x11\xf9\x9dH\xb0\x87Z_\xf5\x42\xf0g\xf7\xe9\x88\x1\x9\xf5\x86\xbc\xf2" -"\xb5\x5\"\xa1\xf2>\xce\x44\x34\x9eS\x9ep\xf8N }\xc9\xbe\xc7\xcd\xf8V\xa0\x46\xf1" -"\xa0\x32&\xaa\x41\xf5\x41q\x9a\xd1\xaf\x88\xff!\x1eW\xdd\xc\x12u\xdd\xb{GD\r\xa0" -"\x89\xb9\x8cn\xe9*}\x94p\xb\x83\xce\xbe\x19\xea\xed\xd8\xa6\x15\xf6Xu\x87\xba\x8b" -"\xba<\xe3\xaa^\x8e\xaf\xb1\xfb\xfHk\xe3`\x9b\x16\x9e\xfb\x17\x8a\x42\x92\xf4\xc0" -"7\x8a\xfe]$\xee\xd1\xca\xabQM\xdc\x66\xc6\x96\xd8\xe3\x7f)Jey\x13\x1d\xdfT\x88\xe9" -"Cf\x9\xac\xd7P\xc3\xdb\n\x94\xc\x84\xfe\x2+\"\xad\xc2gob\xe9\x1e\x8f\x89\x12%\xf8" -"\x91\xfb\xa5\x37g\x9b$T{\xbb\xf3_\x4\x91] \xb1\x17\x39\xf6 \xd1\x8b[!i!\xd2\"\xf1" -"PD6\x85i\xaa\x30)\x80\xb9\"[\xb8\x39\xf4\x94X\x84\x81\xb9K\xcrCR\xb2\xdf`\n\"\xb0" -"bV\x1d\x86\xcb\x8f\x81QO\xbd\xaaO\x8a\x4:\x2\x65\xf9\x92\xfa\xb7\x1f\xc9\x12JE\xb8" -"G^\x1e\xf3\xdfkm\xe3\\\xf3)w}E\xf0\x83%\xe8P^\xc0\xd9y\xf5\x42\x80z\xe7~W\xe4SR_" -"#\xbcY\xa5\x7@7\x1e\xfa\x98g\x8a\xeelBSt\xae\xb7\x45\xb9\x9d\xdb]\x8d\x90\x8f\xdb" -"U\x1f\xbc\r\xb1X2\x10{\xbe\xccN\x11\xa1\xa8\xde\xc6\x93X\xa5t\xa2\xed\x46\xcc\x31" -"\xd5\x64T\x9e\xff#\x10-\x92\xbf\xdc\xbb+\xb9\x85\xf7\x8f\x36\x3>4\xf5\x9c\xe\xba" -"\xfa;\xddq3\x87\x36\x46L\xef\xdb\xa9\x13\x98\x33\x99^\xda\x42\x7\xbf\xd4\xa9\x86" -"}2\xe8g\xfb\xeb}\xe6\r\x13(\x3\xef\x93G\xcb\x17\xbd\x91\x31T\x84\xef\x65p\x89\"\x97" -"\xdd\x8b}\x96\x61\x3\x33\x95\x35\xe2\x8a\x0\xcb\x1e\xec\xa4\xa9w_`\xa9\xf5\xfc\x9b" -"\xd8\xb0mx\xfe\x8e\x63\x18\xc3\x1d\xa2\xe8G\xe3\xf9\xcaX|\xb0\x1a\xe2\xba\n.\xbd" -"\xe3\x8\x31\x44\x13\xf4\xf2\x30\xa7X\x18N\xd6\rOq\xf6\xce\xc2*\x93\xa0\x1blT\xe0" -"D\x9a\x38`\xfc\xa8\x95J4{u\x88\x32\x9a\x80\x97N\xcb\xec\xda\x10p\xfb\xc0Ufcu\"\x9f" -"\x13\xdd\x99^\x99&]\xf8p\xbc\x8b\x8c\xc6\x34\x7f\xad\xbc\x1aj\xf6\x45\x99'\x1aG[" -"\x91#I=F\xbe\xc4\x12\x89\xbe\xebg\xeb\x97\xa8\xde\xd7\xa9\xc9s\r7\xc6Qd\xcf\xbd\xc2" -".\\\xa5\x89\xd2\xe7\x95Lq6\xefN\x8LC\xa6\xc7\xf3\x61\xa3\xe9i\x89#\x9b\xdd\xb9\xa5" -"\x93\xcc*\x80\xba\x16\xde\x9e\xe9\xe\x95\xcd\x39\x39\x9n\x0\x9c]<\xb7$\xb4\xca\xbb\x32\x83\x8d\xbeR\x7f" -"\x83\xb1\x8c\xb4W\xe5{\x9,0.\xe5W\xfdO\x0\xdb\x9cV\xe6l\x9f\xdfN\xc9\xff\xaa\xb8" -"_`\xd0+\xa7\x96\x94\xfa\xbaGj\x19\x9a\x3\x31\xc3\nx\xa9.\x10\x41{\xa2\x36\xe2\x33" -"d\x81t\xc8&3\x1d\xc1\xba\xb8|_\x95\x2xF\x13\xcj+@'\x93\xe\xbf\x9a\x97\xba\x1b\x3" -"\x9d\x38o\xc5\x1c\x30&H\xe2Y\x80!/jX,\xde'x\xc6w\xa0\x1f\xbf\xb3\xc5\xd1\xb8\xa3" -"t\xad\xafj\xdb\xf7\xdc\x94\x7_%\xed\x66\xd4@\xb3\x92,_%_\xb2?\xd8\xf6\xe2\x1e\xa6" -"[\x1d\x93\xbb\"V\x84\xb5\xf\x11\x31\xe$+\x8uu\x97\x33\x45\xb2)\xba\x62\xc1\xe2\xc3" -"[\xda\xec\x4\xd1\x1H\xf5\xb2\xf3\xbc\xf7\x39\x9b\xdf\xdf\x1f?y\x11\x97\x14\xae\xa6" -"\x97$[\xc6G1n\xa1WHN\xcb\x95\x1b\xe3g#O\xd0.\x8b\x1f\x9\x1a\xac=)\xbf(-\xff@\x11" -"\xbc\xc\xba\x8eU#M\x94=\xb3\x1|\xc7\xa7\x66r\xb\xbc)\xb2\xd0\x97\xa9V\xc0\xf1\x6" -"qw\xf0\x12\xd4*\xdc\xb4s\xcd\xe8\xd1\xba\x35\xb4\x3\x7W\xfa\x1d\x82\x11\x98\x9d\xf3" -"\xbd\"\xce]P\x1c!\xef\x87\x8\xfb\x34I\xdfG\xd8\x86P\x9f\xf7\xb5\x9bv\xc0\xdb\xae" -"D?3o\xee-a]~\xed\x1c(O\x14\x33[\xc8\xa2k\xf4\x62\x1e\x10\xde\x96\x11\xfb/\x1d\xbd" -"R\xe4\xb7V]\x8c\x65\xb5N\xa3mP\x8b\xcf\xcW\x8aI\xa2\x66R'\xcd\xe1\xf9v\x8e\xfe\x84" -"\x7f\x9d\x94\xf1\xbb\xb7\xdb\x83p\x1c#!\x98\\r\x83\xd4{.@\xb2z&\x84(\xaa\xef\xe7" -"_k/\x87\x64\xa8INX'W7X\xcb\x9c\xa4o\xa9\x32\x8\x83k\xcc\xc8\xb5VJi\xf5\xad\x88 R" -"\xaf\x1c\x14\x17\xc3\xfa\x7fX\x5iR\x86\x82\xc7p\x80\xf3h\x8b\x65\xe7\xfc$\xd2\xa3" -"\xae\xb6\x15t\xb4\xa3!Y'(\x15\x44\xdd\xd7\xa6\xee\n>\x93\x88\xf8\xf6\x31\xcerQrM" -"\xf7\x7&\xe5\x91-\xdc\xcc\x8c\x65-\xd6\xc9`\x8f\x84\x62\x30=\x86\x7fX\x9d\xe0\xf2" -"\xf7\x17\x11\xb3QB\xeen\xf9;d\xd6\x32lM\xd7\xdc\x83'\x8e\x5q\x0\xeew \x82\xe6\xba" -"6\x8e\xd9\x1aUS\xec\xfe\"\x93\xa4\x81\xe4/\x83\xbc\x8f\x91H\xc7\xe\xac\xe9\x1f{}" -"\x9c\xb8\xa7$\x15\xbd\xb3\xaf\x66\xf6\x8e\xa7\x33\xa1z\xbe\x9d\xb0\x5;\xf1Hb\x91" -"2\x96\x95\x89\xf3\x8d\x30\xea\xbf\xa9j\x1\xfa\xc7&P\xb5\xa6\xff\x39\x35g\x1\x98\xa1" -"\xea\x33\x81\n\x9b\x11\xe3\x30\xeb\x8b\x45\x1f$\xf9\x35\x44&46\xf6i\xabZ\x90\xa5" -";\x16\xcc\xee\xac\x36\xb1\x44Ut\xef\xa7\xe8\x2\xdesR+\xe7%\xe6\x87\x4\x82,\xb7\xd3" -"\x91'\x17\x33\x33g\x89[\xbf\xbe\x6\x96j\\\xc6S\xaa\xb5\xe9\xb3Yg\x2\x8k\xf0\x1\x0" -"\x85\xb9\x0q\x19\x32\xa9Z\xcf\x15\xcaM\xc4ZuN\xa3\x34\xe9\xeb\x84\xd6\xfc\x8e?\xc4" -"\xf8\x97\x45k\xed\x64\xbb\x93\xb5\x93T\x9f\xf0\xd5\x35\"u\xd8\xe4\x17\x17*fd\xc5" -"\xe0\xec\xed\x10\x19IJ~\xd4\x9a\xb0\xb9\x65\xbe\xc1\xa8.Xsvk\xb3\x8d}\x85`I\xcc\xe2" -"\xfc\xa6Z\xaf\x61\xe9\x61\xb6\x6\x34\xe2\xa6\x9e\xf0YuL\x9d\x81\x63\xd8\x7f\x92\x8c" -"\"'r\xd0p\xd8?\xeco\xa5\xacsJ\xf6^@\xbf\xdeR\x1f}\x9c\xb1\x65\xf\xdf\x64uK\xff!\xea" -"?\xf0\xafv\x11\xa9=R^\xc9\xb2\x8cQ\xaf\xec\xb0N\x7f\xc8\x32=\xd6\xc9\xb0\xd8S\x9a" -"4\xfc<\xd8\xce\xb7\x95\x8e\x8e\xbb\xfe\xd4\x31\xb8\xf9\x6OR\x92\xf7\x15\xf8 \xb4\xbb\xfd\xd5ov\xd4.z\x1a\x6\x8c\x1c\xbd" -"\xce\x46@\x8/n}X-\x19\x39\x99\xc\xe6\xee\x8d'\x0\x15\xa2\xc4\x61y\x8b\x37\xdc\xb5" -"y\x8e\xe9\xf7Q!h\xb7m&\xc2\x8b\xe4\xa4\x9a\x1b\xf9l\x89\xd2\x35\xf2\x1a\x1d\xb6\xa9" -"n]\xa4t\xd0\xb1\x9b\x80\x8d\x13\xd7\xa1\x1b\xf3\x9e\xa8\x64t\x99\xc4\x10\xed\x98" -"\x94\xa1\xad\xf3=A\xb6\xfc.aM\x80\x87\xf4\xc8NC{\x13o<\xb3-\xb8\x39\x9\xe3\xc7\x46=\x2\xa2-pV\xbev\xb8wc&" -"\xe\x46\xe4\x8b\xb8\x32\xb7\xee\x13\xf8\xdc\x5\x37\xec\x8e\x81\xe9\xbd\xfe\xad\x8c" -"'\xeb\xdf\x1a\xd7\x6\x93>\xfd\x11\x13\x1e\x12\x81O#n\xbb\x1\xbe\x85\xb7\xf1\xb2\xd6" -"'A;2I\x18\xd2G`OV\xec\x12\x89\x9\x87?\xec\x38W\x2\x8b\xefv\xa3ICd\xc2\xa7\x0-\x10" -"MHb6\xc3\xbH\xe2\xb7]\x85\x1c\x34\xeaP\xba\x7f\xfe\xb4\xe1\x91\x90\x89\x8a\xe2\x17" -"h\xc1W\xc0\xca\xc6(\xa2\x18\x1a\x32yo\xbc\x1arq\xd2G<\xd8\x8eS\x95\xdd\xbd\xb1\xfc" -":\xa8\xdf\xf=X\x86\x37\xf1\x9a\x8b\x83:\xfd\xeb_eZ\x88\x38\xee\xcdhN#\x15\xb7,u\xce" -"\xef\xbc\xef\x94\x34J\xce\x8dj\xdb\xe3U\x0\x8e\xc7/\xe7\xce\xea\xb0\x13\x63\xa8\x95" -"\xf4\xe7?\x86v9\xbe\n\xb\xe6s3\x84\x88\x16\xb0[A\x92!\xbe\x8f\x90\x66\xc3\x62\xc2" -"?\xe8[\x7f\x39)0\xbf\xe4\xc1+\x95&\xff/\xde\xc3\x8f#\xa1Y\xed\x61\xa0q\x8eq\x15\xc2" -"E\x97\xd8I\xfav6\x91ST\xa4\xc\x96]Mr\xec\x94\xda\x61\xa0\x37\x66\xab\x39\xaa\xb6" -"\x84\xe1\x34\xfd\x14\x7\xa5\xb1\xb1\x9b\xfe\xbaR\xaa\r\xa5\xd9\x9c\xbe\\\x82\xdb" -"\xaa\x66\x37\x11\xe6\xde\xba\x18\xe\x1dJ9\xc3 QjCP\xd2\x96\xbc\x19\xbf\x1b\xe0T\x85" -"\x9a\x8\x89\xc7\xe9rz\x2\x1f\x31v\xfe\x62\xf\xb0\xc8\x37\xe4\x14\x1f\xec\xe5\x31" -"\xa9P\xc0=1\x9e\x32Up2 \xb7\x18[\xd2\xf\xe5\xdb\xa6s\xf8\x12\x9a\xb2\x11\xef\xcf" -"6\xee\x39L~\x0\xeb\x8vbK\xc8@\xfa\x86\xe5\x8b/XGT\xcbk\xfd\xfdv\x81\xe\x30\x7\x41" -"\xeb\xe4TNZ\xc1t\x13\xad\xeb!\xc6/f\xcaO\x7\\\x32\x38\x17\x96\xbap\x97\x82\xde\x34" -"\xa6u\xb7\x17\xa2\xc7\xf6\xd8\x81\x4\xcb\x92O\xde]\xf7u\xb4\xf0\xb6\x8e\xe.\\/x\x8b" -"\xbd\xea\xf0m\x8e\x1f\xc2\x10\\\xcb\xbdX'\xc0\xb0?\xd6\xcd\x64\xf0\xd0s\xf3\x19-" -"_\x94\x83\x96\x44\xe5\xeclQ\x85\xba\xdc\xf0\x41\x12\xa6_I\xa8\xc8\x31t\xa9\xae\x95" -"\x8ev\xa2\xf5\xaf\x46\x9e\x8bv\xc8\x33x,_\xfb\x8b\xd7\xb1\xbb\xbb>\xa0\xcb|\x97\x86" -"\xc3\xbe*\xde^z\xfa\x8c\x8f \x89&Y\xa5\x9b\xc4!\xe2\x88\x45\xa1\x8\xe3N\xe1xd\x4" -".\xf5\x87\xa6\xd6}\xec\xdf\xb3\xf5\x10\xeb@\xd2\"\x95\x85\x34z\x0\x35g\xf\xccv\xc2" -"\x83zNMh0O\xe1\x13\xc5\x39\xb3\\\x1f\x2\x34\xb5\x7\x9b\x8e\x32\x93\x45\x46\x98)x" -"\xc5\xe4\xdf\x95ZEN\xa2\x63\xc3\xca]q\x1\xf3\x1a\x31\x8d\x82\xa3\xf9\xfc\xb5\xa8" -"\xaf\xd7\xa6R\x9\x66;\xf\xc9\xda@\xb&\xf2\x85\xef\x46\xd0\xe1\xea\xf8\xac\xb1\xf1" -"\xcb\x80^9\x86\xd0K\xc5\x85\x7?\xc6H\x95\xe4\xda\xe1\xcc\xb7I\xbb\x43\x9c\xb3.\xa9" -"\x11v\xd5\xc3\x9c\x36P\xd1\n\xfb\x9c\x98\x84\xd5\xfb\x90\x18\x34$\xce\xe6~\xf2\x17" -"]\x1\xd2G\x8dgQ\x1e\xc9\xf5O\x88v<\x15&\x97\xb0m\x94\x8b\xedI$\x0\x96\xee\xe3\xd0" -"j\xb4W^\x8e\x8b,\xb8&;[\xcfO\xa1`\x87 \xf5+gS\x9\x83\x30q\x87\x9d\xf5,>\xc2\x87\x1d" -" \xf3\x98\xb5\xca\xc8\xf8\xa4\xd4\x1d\xf\x1dGXM\xd9\r\xcd\xae\xa4\xa1\xcf\x16\xc" -"K;\xf1\xaa\xb8\x90\xb5\xce\xb6\xcb\x34\x88g*\xa6\x8f\xbd\x93\x82\x81\xdb\xc1\xd8" -"\xbc\xfe\x92\xfb\xf5\x14\xdaSXD<\xb6\xe0\x14rT\xe9\x1b\x38\xceg\x87\xb2\xbb\r\xed" -"\xd2\xd3\x8fY8sz\x97{^\xa4(\x92R\xcX\xf8\xfb\xb5<\x99KW8#y\xe9I\xf\rip\xb9\x80\xe1" -"\xbd\xf8\xcf\x9fL<^\n\x18\xf6n\x86\xee\x93\xff\xe7\xfeTm\xe5\xf\x41\x36K\xcb\x37" -"!\xb6\x37\x7%q\xfa\x17y\xf1\xd6r\xfa\xd2`\xc1m\x7f\x13\xcb\xdf>Cv\xe7\xffV\xd2\xa7" -"\x10\xacZ\xc3_\xcb\xdb\xce,\x9c\x17\xe5#\xbb\xe6!\x86\x17\xb1<\x1f\xa6g\x9b\x30\x89" -"y\xae|a\xdanh6\x93$\xc6\xcb\xc7\xdd\xec\x36NZ\x86prf\xc0\xb4Y\xee{,\x3\xfeXNR\x9b" -"\xff\xdc\xe9\x8c\x90\xa2\xf3\xd9\x30Z\xa7M>\xd8\x43\r\xbf:I\xfe.\xcf\xd9\xc4\xbc" -"\x9f\xef\xd2&\x18\xfe\x9c\x8a\x97:\xd0r\xaboq>M\xf0-\xcd\xa7\xacSY\xb2\xd6R\x1>\x13" -"\x1bv\xb3\xedlu\xfdS\xbaX\xd8\x62\x84\x62\x64\x62\x7fk\x9ep\xd8\x80\xfm\x9b\x32$" -"+tzg\xbb+EgX@\xd3O\x85*\xa8\x6/\xa6\xb0\x1e\x31\xed$\xda\xe0/l\xf7\x88\xa1\x7f{\x93" -"h\x17Q\x95\xdb\x0r%\x9c\xce\xf\xfb,\x10\x35\xc1\xd2n\x17w\xcc\xa3\xd5j\x82|2B\x6" -"\x9ev\xd6\xddi\xb6Sv\x86\x14\xb9\xac\xff\x16V\x7f\xea\x61P\x8dQEK\xc0/l`\xf7U\xae" -"\xf6\xaf\xae\x35\x36\xbb\xfa\x18#\xf8\xe1\xa5Q\xf8\xad\x14\xd1\x1d{d(\xe2tCq^\xbaN\x9c" -"\x5\xd6\xf2\x38\x37\x8f\x94\x98\xae\xf0\xe7\xeeO\xe6\x85\x66\"\xcc\x8en\xd1\x41\xee" -"_\x10\x9e\x34<\xb6i\\K\xe1\xe0\xf6\x66\x1\xc2yu\x98;\xf5W\xc0J\xcf\xc1\x92'\xa1\xad" -"~lD\xc0\x5)\xfc~\xdd\x7f\x88m$\xb7\xe0)\xb9\xc3\x95&\x0\x88\xbb\xfb\x96\x97!\x99" -"\xa7\xb3'\x96\xd2rW\xde\x83\xa7@\"\x91\xc1O\xec\xdfy\x98\xc5\xc9k\x1e\xda\xde\x2" -"\x80\xf8V\x8a\x8fP\x7\x85.\xed\x30\x39i\x18\xb\x33)\x91ys\xc2\xd3,\x8\xc\x97\x65" -"\xb6\xba\xb0g;\xc7\xec\xfd\xbb\xfb\xea\x98\xc&8C9\xb7\xf1\x5%\x91\xd9\x16g\xd4\xfe" -"\xe4\x13\xaf\xc2=\xe2\xd4\xb9\xdat/Bi\xc6\xc9\x39\xf5\xfc\x32\xa3\x80@s\n\x1\x81" -"U\xads?#\x1eM[\x9d\x1\xc0:X\xea\xe7\xb5\xf5\x90\xcc\xfa\xf2^\xdc\x85R\xcf\xc8\xd9" -"\\`\xeb\xae\x18\x37\xd7\xa9|\xa1\x37\xe9\xd4\xa4\xbd,\xd3J\xef\xd6\x8d\x64\xb3\xf4" -"\xf6#&\xac\x42\x99!\xd7\xfb<#Q\x84\xfe\x8\x99i\n\xbw_\x1aVn\xc2\x9dX0\xd3#re&\xf7" -"\xe7\xf5\xaf\xddq\xb7~\x7\x61=\xdcO\xc6>\xdfI\x5\x1a\xebY\xe6\x33z\xc0\xa4\xb6\xdd" -"\x87.wl\x9c\xd0\xcc\xb8\x61\x30S\"\xd8\x16s!$\xf5\x97\x8a\x86\xc1\x86\xbf\n\xf\x88" -"\xe7\x33\xce\x38\xe4\xd7\xc1\xbaSx\xc5\x62\x9b\x1e\xfc\x97\x80`Y\x99\xe\xd4,\\\xd1" -"\x83\xba\xd7\xe9@p\xe4\x5\x85i\xda.Q\x83\x1f\xfe\r\x8\x3\x1\xae\xab\x43P\xba)\x3" -"\x18\xae\xc5\x82\xc7\x8d\x5\xdd\x92\xe5\xaf\xb4\x42N\xa8\x8\x62\x9b\xc9r\xe6\x8f" -"O\xf2H\x9c$U\x93\xf0uU\xcaj+%\x96G\x94\xcf\x31\xcb\xd3\xae\\\"\x9a\xb9\xb8\xc2\x98" -"\x6\xc0\x1d\x11n\xbd\xf\xf0\xf1Y\xed-=}\xfcs\xea\xb4\x91\xb\xff[\xb\xbX|\xd9\xea" -"no\xc4]c\xc0\x97\x66\"M\x83\x46\x1f\x5\x88\x14\xb%\x8b\x17)\xf7\xb\xaeyb\x18\x9b" -"\x15TH3\x92\x98\x8c\xf2\x30\xaf@w\x19>S3\x5\x19\x39M\xd9\x9b\xa1\x35mG0\xab\"\x1d" -"\xc6\xa6`\x19\xbf\xaeVH\x93\xdd\xad{\x17}\xad\xd1j\xdd!\xd3\x96\xcf\xa6\xc3\xdc\x81" -"\x80R\xe2\xf7\x11I\xfdYJ\x16\xde\xc/\xfd\xd3\x66\xc9\x9bHlU\xa6\xe9\x91\xe4\xd2," -"\xcb\x15\x84?\xc\x33\x63gj\xf2\xf5\xb2\xd1\xb7\xef\x66\xcc\xf2\xf1-\xc5\r\x63wk\xff" -"\xb0X\xd7\n\x9cv\xdc\xe9luHr\xd7,\x82\xa0\xc3?\x90\xd4\x9c\x93T\x2\xcd\xd2kmt;\x1f" -"C\xbe\xd5\xd8\xb5\x39\x42HI\xc1I]\xaes\x4N\x88Z}\xf\x30\x7f\x18\x16\xdf\x62\x44\xa6" -"\xf2\xd9{\xfdN \xe\x93\xf6\x9b\x8\xaf\x39\xea!\xe6\xe3G\xa4|\xee\xbf\x80?s\xb9x\xad" -"\xbf\xcf\x5g\x89\xbb\x8en%c\xde\x87\xdd\x9a\x8c\x87qW\xb9\x34\x10-\xce\xda\xc5MH" -"z\x1b\xb2iO\x0\x34\x9<\x6\xc.\x1a>\x80\x5\x4\x9f&\xd7\x16\xe1\xf3" -"\x81\xb9\xf8\x31%\xe4h2d\xa0~-\x89\x38\xf6\x5\x97\x8e%\x13\xdd P\xb3\xd8\xa1\x1'" -"\x97\xcb\xa8\x96\x16\x32\xbe\xd2`\x91\x63\x38\xa8\x12\xaeu\x1c{e~\x8j\xc}\xdc\xd3" -"\xbf\xdd\xff>H\xb8GQ\x92W6\xd1\x31\xcI\x10\xfc\x11\x43\x87\xf3\xed\x7f\xe1\x63\xf9" -"\x18\x95\xeb\xf5_\xcb\x42\\\xefW)\xd9\x9b\xd8\xf2\xc0r\xe3l1\x5#\xe7\\\xd8\xe5\xde" -"I\xc0\x31\xc4&4\x10\x9dV\xe9\x1a\x46\xc8\xc8\xe8\x9f\xd9 \x12\xa0\xc\x33\xd0\xde" -"\xc5%\x97\xb5\xc6\x93\x32\x91\xa7\xbd\xc5\xce\xda\x95\xdc\xdaV\x0\xf9\xae\x1c\x82" -"PT\xe7\xee\x10gE\x8c\xcb\x66\x61\x7\x4\xc5\x8eJO\xc0\xcb_\xc9\x33\xd0\x32*qk,\xd4" -"0\xa3\xadH\xda\xb3\xd4\xcb\xe9\xd2?-\x9#h\xcf\xc4\xe1\xf5I\\\x13:\x92\x94.\xc6!\x18" -"\xd4\\\x17r6F\xe6\x94\x7\xb4\xa8\x9d\xcd\xfd*\xb3\xff\xc0\x99\xa2\x1d\x9d)t\x1dh" -"'\x6)\xaa:AO\xe5\x86X\xdc\x91p\xc2G\xb6\xe2?5\xc4\xbc_\xf8\x30\x9\xf4\x62\xf2\xee" -"\xf4\xdb\xac_\xd1X\xa6XW\xf9\xb6\xdc\x1fQ\x92\xdf\xb1i\xdc\xb6V!\xca\xb2\xf1\xb0" -"{\xd2/AU\xa8\xe9\xe2\xb6\x38\x8d\x43\xf\xde^\xc1\xc8\x34\xd2.\xa0\x35\xc5.\x1e\x34" -"H.\xad\xc3kL\xae\x90*\xae\x89\xa7(Nb\xb3\xc8K`\x8dk\xd0_u\xbc\x31\x31\xb-\xd3\xb2" -"\xc0\x8a\x0\xe0s\x7f\x10O\x3\xa4\x19\x89\xd5\xf6\xb9\xa2\xc3\x8b\"\xf1\xd1\x80>\xe5" -"\xd7\xa4\xd8\xde\x44\xe4\xab\xd4\x96\xa1\xde\xc\xe\x12\xc4\xbc\x96\xd0\x12(F?\xe" -"\xa9\xce\x95\x9\xfe\xe9\x87\x13\x9f=\xd3\xf9\xd0\xdf\x43\x13\xf5U\xbe\x85\x43\x37" -"\x18\xf6\xd0_\x19|A\xa9\xd9\xc7\xa8\xb0\xd2t\x1\x96\x82\xd4\x9fX\xdd_f\xb1*e \xd9" -"\xf2&\xd1\xdf\x1f\x1b\x65\xcd\xfa&\x1f\x98\xc\xa2Z\x92\x64[\x86\xb6\x46\x6)?\x8b" -"\xfd\xe3\x64\xc4}*\xf2\xc7\x9\xbb\xe7zp\xa5q/,\xc2o=f\xf5\xbe,0zH\xe6\xf8\x87\xf6" -"\x81\xd3\x1!\xe3+\xbd\x87'\x1b]\xc4\x61](\xc3\x9\xf1Z\xd2\x63\xfb\x37\x42NV\xdd\xa6" -"\xe1{\x99\x8b\x45\xbel\x7f\xc6\xc2\x8e\x33\x94\xa8vL\x9e\xb2\xdf\\\x6\x62\x65\x93" -"\xb5\xc6\x65\xd5P\xd4`\x1ry\x1c\xd2\x8\xae\x9f\x37\xbc\x8+\xb$+\nPKu\x1b\x18\xf4" -"\xd7IQr\xb6\x97\xee!x4\xa8\xa4\xfb|\xc1mo\x9e\x8b\xb4\x0\xbe\x8a\xeb\x8P\x96\x2\x83" -"\xdc\xe7%$\x9f\xccM\xe9}\x98\x86tZ\xb6\x6l>/d\xdd\x8a\xb7\x9a\xa1\x16g\xf1\x11\x88" -"\xd7\x96]\xc1\x1e\xb7`\xb7r\xe2\x82\xdb\xf1\x32I\xf3\x19\x86\xach\x98\xfe\xbf\xe2" -">>\x8b\x8d,3\xe0\xe\xa6\xfcI8P\xec\xb2\xe6\xd8\x31\xd1\xef\xca<.\xc8\xee.9E\x99\x9" -"\x1e\xd5\x8b\xed\xe9}zC\xb6\xf7\x39\xeb\xf\x84^\xac\x1d\xf6\xb1\xeb\xfe\x87`\x9\xcc" -"]\x80K\x15\xedKVv\x1b<\xe1\xafY\xc0{I\xdcy\x8a\x44S\"\x97\xads\xd5\x10\x1e\xd4\x7f" -"6\xa3g\x8f\x81\x82\x97\xcc'\xf6\xaa\xa2\xaa\xcc\xc9\xaa\x9boTY\x91\x1d\x8cV\xcfI" -"\x9e\x39\n\xe6\x7\xf3y\x4P\xb2\xb9\xc9\xbe\xf\x0n\xda\xcq[\\\xa0H\x17\x34\xcf\xb0" -"Ytx\xe7`+\r,\x1eOx\xf0n\x11\x10\xde.p\x9c\x1c\x1b\xed\x13p{p\xa4!\xb3\x84\xf2" -"\xc\xa7\xa9\xa9\xd2\x3$\xdd\x38?(\xb2\xd3\xc7\xa9\xc5?]Lk|7\x8d&\xdf\x11\xcfU#\x8b" -"\xe1\xb2O\xa7\r\xcc\x17\x8d\xad=5g\xf\xe4\x91\x90\x85\xeb\x1c\xd9\x5\x97\x1dv\xa3" -"h\xfd\xfc\xf9\xd2\xf0\xa2\x37\x39\x85\x1a:m.\x2\xd6]T\xde\xe6\x9e\xd5\xd8\x13\x15" -"\xd3\xea^5o\x94\xef%m\xd2g\xfd\x1e\x1a\x9e\xdc\x9c\xd6>t?)\x9b\xccJE\x6#;\x8d\xd7" -"e,\xa0g\xf7\x41`?\x93%\xc\x8}6\x8f\x9e\x9c\xc4\xcc\x1am\xedVt\x87\xc0[\xaa\x99+\x0" -"V\xa7\x7f\x63\nr\x0\x8e\x39\x46\x15\xa9\xdb$\xfeV\xa9Ve\xe\xc9\xde\x90\xa6\xc2%\x91" -"\x89\x44\x2G\x97\x5\x41\xca\x19\x87H\x92\x82\x15\xc0\xe1\x32\xa8\x1a\xa1\x32\x8\xd8" -"c\xc1\xfe\x81\x7fp\xcaW;TW}\x10\xb7\x31\x0\xaf\x8e\xa0\x88 \x8a\x44\xfb\x92\xac\xa3" -"\x14\xaeXypa\x80x\x8c\x17\xbb\x1d\xb\x81\xb6\xb9Z\x1cN\xf\x9e\xa6o\x9b\x39\xbf\xe1" -"$D\xa6\x44\x66\x91\xa7\xbd\xb0>\xf\x3\xd9\xf0z\x10\xa7Y\x8f!f\xf1\x8R\x9f\x34\xcd" -"\x90\xe6\x1\xff\xed\x34y\xab\xcf\xcb\xde\x8f\x5\x1c\x34\x8eH\xc6\x1d\x95\xb0\xcY" -"\xea\x12\x87\x42?\x5\x66l=6(\x88\x44\x6~\x83\xe1OkR\x10\x84,t+\x89\xf1:\xcd\x12k" -"\x9f\xc5\n\xbe,\xa7\xd7\xedQ=C\xb6\xac\x7f\x41\xee\xda\x41k\xff\xfc\xc5\xc8\x44\xab" -"-#\xd4\xdc\x9\xb2\xd5\x10PL\xe9\x8d\x2\xe7 \xd9\xe6i\xdd\xaa\x34Lc\xa1\xb7V2\xf9" -"\x12\xa1\xc0\xda\x38\x85\xdaJ\xf7\xe2\x43\xe4\xa4\xc6I=e\x95\xbbmV\xb0\x35\x91\x6" -"\x95rY\xe5\x9e\x33k\xaa\xf3[\xd1\xce\xc5\xcd\xe7\x35'.\xbc\xca\xe8\xd4\x90J\xeb\xd2" -"\xb3&\x10\xc6\xfe\xa2\xb6\x99\x41\xd6T.\xcb\x44\xd7\x10\x92\xa3\xcf\x6w\x8\xa3\xd0" -"\x87\xae\x99\xff)g\x1a\xb7\xdd\x87Xu\x9b\x97\x1a\x8\xae\x1b\xadx'\r/\xbe\xe3z\xa2" -"\xdc\xb1\x19\xd7/l{\xc\x85\x9\x1\x8ap\xd0\xb0\xbe,h0\xef\x8e\xb$\xb1\xce\x11\x41" -"\xef\x87:M}\xccP\x1f\x80\x8b\xfd\x94\xe4\xdc\xf)\x15\xaa\x2\x30v\xbc\xc8\x0\x64\x90" -"\xa4\x36\x85\xea%\xaa\xfc\x18s\x2\xeb\xde\x7f\xe1\x96Z\x4\xa5\xa3\x98\x98])\xf0\x8e" -"\x8Q'\xb5k\x5s4\xd8\x8e\xb6\x38\xa4\xdd\xe6J\xfd It\xc3\x93\x95\x36\xb1\xb6jT\xb4" -"\xdb\x81\x15\x18S\x91W\x18\xf7\x8\x13\xf0\x96\xcc\x1b\xe\xa2^6;I&L*\xd1qX\xa4H\x9f" -"\x91\x45?\xbe\xdb\xde\x15\xd7\xb7M\x7f\x98\xe8\x1d\xf2\x32Qx]X)[\xa2\x97\xf2\x95" -"\xaa\x62H\xa9\x12\xcd\xd4\xf1\x11\x1ekb\x8e\xec\xbbQ9p\x9ev\xeaJ\xb7\x43\xce\xc8" -"&b\x1d\x8\xe6\xbc\x64i\x1c\xc9\xb<<\x17x\x93\x1a(\xd3\xd5\xb1\xe2\xe\x96\xc6\x43" -"1f\x13\xfcH|\x9b`LCF?\xa4S;\xca\x12\x36(noZn\xeb/\x1d\x9c\x34\xbd\xde\x45\x95IZ6" -"_\x88\x5]\x92hT\x1c\xf1\x65J\xcfG\x8d\x38JT\x96\xa8w.\xa1@'Q\xa0\x93X*f%\xa0\xa4" -"H\x16\xb5\xfd\xbe\x16h5\xd5\x98\x64\x42\x96$\x9b\x92\xcc\x90\xaa?\xd6\x44\\\x9a\x19" -"\xbf'\xf5\x9c\xb0\x61ls\x6\x7\xf\x33\xc7\xdfN\x1d\xe6J\xc8\xc5\xbb/\xfa\xc1\xef+" -"\x1b\x30\xe5\xa0'^`\x4\xcf\x64\xbb\xe2\xc6q\xe\xdc\xfc:\xa4\xad\xd6\x1\x6\x33G\x8" -"\x86/\xfa\x66R\x82[\xc8HBsnG\xaei\x17\x18\x3\x65\xc7['P^\xed\x1f\xcc\xa7\xc4>\xe5`\xf0g\xf1\xaa" -"*\xfd\x64/v\x9d\x1a\xce\x8e*\xaa\xf3\x88P\xf0\xd7W\xcd\x80\x8c\x92\x1dqn\x96\xfb" -"\xc0}\xa7\x86\r\xfap\xce\xae(\x88\xc0\xed<\xbf\x95\x86\x44\x35\x32\xb6\x8d\xae\xd9" -"\xa9&e\\\x15zAl8:S\xd8\xf2\x83*NgF\x81\x12\xa0\x9a\xdc\x83~\xd8\xec\x95\xf7\x8R\x92" -"\x1fP\xd4\x41r9\xfc\x42\xee\x36$\xca\x97\xf6\x82t\\\xc5\xe7l\xc7\xc6{\xd9\x9f!\x80" -"\xf8\xc0\xb7\xfbIS\x9c\x8c\xc4t\xc2\\\r\xdeI\x16q\xff\x32\x9eQ\xbc\xfaw\x93\x46\xd4" -"hh5\xa3\xad\x66\x33\xfc\xb5\xe0\xf6~\xc\xa9\xce\xd8\xf2\x15\xbe\xf4\xd2@E>\xb2\xed" -"\xd6\xad\xb2\"x\xaa[\x98_\xa1@\xc9\x83M8u=\xf2\x1O\x8c\xe\xe6\xda\xd1\x9e\x8f\xc5" -"L\x3\xc1\xf6\xcb\xf\x85\x89\x86i\x1d\x99Y%b\xca\xd9_\xa0\xa5\xb2\xab\xe4\xa8\xb5" -"KE}B\xe8\xc3:-\x19Q\xc0\x41\x9ar\xfb\x94\xfd\xa7\x8e\xcd\x92\xbd*\x14\x16\x45\x9e" -"\x9d\xec\xa9\x46\x9f\x35\xe4\xc4}\xb5\x31rm\xee\x8f =pB\xed\xb3/\x2]\xf3\xd5\x82" -"T{\xb1\xd4_z[p\xd3\x17\xdfN\xbb\x16\xe3k\ry\x8e\x9\x32\xfd*\x85\xb0O\xd6qC\xe4\xb2" -"\x87\xa5\x4\x16,\x1fZ\x3|\xcdx\x0\x88\xc5Gc\x85\xaf\x81h\xe1-\x97\xd4K\x6\x30\x62" -"\x17Y\x17<\x8f\x1e\x30\x6\xb5\xb1\xc6\xd7\x13\x8b~\xef\xc3\xcc_T\xe2K,<\xa7\xb4\x1a" -"\xac\xfd%\xe5T\x88\n\xaf@n\xa4\xc3\xc6\xe2\x1d;U\xb\x4\xf\xb1\x95%\x98\xa7\xe8\xe6" -"H\x8f\xe3\x82\x88\xb2\xae\xb6\xc4q\x83\x38Y\x8a+\xfeM+\x9d\x14\xc6W2\xda\x30L\x16" -"\xff>\x1f\x8f\x3\x4n\xf0\x95\xb6_\xd6\x9\xda\x87\xec$\xa6\x92x\xbf\xe6\\\x90\\\xd0" -"2\x9fjHk\x85%\xb7\xee\xa4\xf7\xaeV\xc2\x63<\xd8\x35\x43&\x9e\x8a\xcdmq\xf5\x0\xd8" -"/\xdf\xbd\xe7\xf7\xf7\xb1\xae\xe6s(T\x92\x32\xe2l\xa5P\x85\xb6\xe8M\x9e.\x7ft\x6" -"\x8f\x93\xa9\xc\x46T\xf2\xf3\x96\xe5|_v\xf7\xe6\x1c\xbb\xe5#\xdb\xfb\xa6\xe7\x66" -"8\xbb\xa3\x6M\xa0%\xa7\x9e:)O\xe7\xf1\xcc(\xa3\xb4\xc5}\xd6\xfd\xc4\x8eT\x1a\x85" -"SK%\xe1\xbc\x11\xb4\xf7\x80\x19\x45r9\xea\xef\xd4\xbe\x90\x7\xd2\x5\xf1\xd9\x85\xf3" -"\x89\xdb\"@\xb'\x9c\x10\x94\x85Q\xa6\xb4\xa1\x7f\xbd\xa0\xff\xc9\x42\x8b\x18\xb4" -"=\xc7n\xfb\x15\xfc!\x82!o\x1b`\xb4\xe3\x44\xa0:\xd6\xc0\xf\x14\x1e\xf9\x9f\x89\xf2" -"L\x81\x9c>2\x87z\x92}\x84\xc2\xd0\x6\x94\xf\x39\xca\x8bq\xe5\x95\x16s\xea\x9b\xfd" -"\x17I\x92\x32\x19\xde\x38\x92\x9e\xca\xa9\xce\x43\xb0l\xfa}\xa1\xbb\xed\xfd\xa5l" -"a\xffl$\xf4\xeY\xb1\x38p\xd5\xfd\xeb\x82\xd9\x81\x15O\xae]mQR\xdei3\x93YF\x1a\x41" -"\xa9q;k\xbeG\xe8h\xc9\x33\xcdt\xc7]\xb7\x1d\x13\xba\xe4\xde\xc8^\x2\xfa\xa1N\xad" -"l\n%;\x16\xc7\x95\x14\x65{\x15\xe6\x8c\xcf\xf9\xeej\xa3\x85\xcf\xf9\xe2\xc5=\x9a" -"\xe4\xf\x85\xc7\x93\xe4\xe8\xffP\xb2\xb7\x42\xfO\xe6\x98\x7\xbc_7\xc3\xe3\x0\xe6" -"\xb3\xc3T\x9d\x1d\x32\x46\xa2\xe7\xf\x9\x10T\x11\x35\xbd\xf8\x5\xe0\xa6\x98\xe2\x36" -"\xb6Ig\x2\xd0\x61$\x16\x87\xb7\xb8\xd1\xa0\xe5\x17\xdf\x4v\xda\x9\xd8\x96g\xa7\xab" -"7_\xd2g-\xcb\xab\x81$\xe5\x11P-\xdb\xd0\x8b\xa0M\x94\x1d\xf1\xce\xbd\xcc\xf7\xed" -"H@\\\xbc\xc3\x37t\xa6\x8cR\x12\xfco\x13&A\xff\x41<\x98O\x8b\x43\xbd\xfd{\x1a*45\xf1" -"Z\xf0~\xf4\x97\r>J\xb\xb9G\xc1\x81\xe9\xca'\xcc\x14\xa3[\xd1\xbd\x9hu\xb4Xs\x8c\xa2" -"D\xf8\x8c(r\x8bt\xe2\\\xb8\xc4\xfc\x10\x95\xa5l\xa7^Ei\xad\x30\x82\xef\x19J\xdd\x11" -"5\r\xb3\xb7K\x96v\x1d\x45\x38Yo\xf7$;\x1e\x1brG\x16\xa1\x44\x10n\x8\r\x42\x3\x64" -"D\xfdG)\x98\x46\xc\xe9\xab\xbd\x5\xb4*\xf9\x38\x9a\xc4R\xbd\xbb\xa3\xa1:\x96\x89" -"\x0%x\x9f\x16\xb9\xd9\"Q\xfd;;\xeb,a\xed\xdb\x37\n En;\xfe_@9\xe2U|E\x1cRO\x80\x87" -"\x1[\xaf?\xf0_Q\x86\x9f\xb9u\x12\x96\x8b\xdb+IX\x9c\x1cz\xf1\xe0\x85%\nGete\xf4\x80" -"\xb7\x2>$\xc7g1\xac\xe\xabg\x4\x12=w\x97}:,LV\xb6\x91\x34n\xbeX\x9c\x61\x9c\x4Q]" -"4\xf8\x1f\xc6\xa1u'\xd5\xd8\x31\x90\x13\xc5\xd4\xff'\xcc\x39%\xe2L\x99#\x1a\xc7\xfb" -"\x9e\xaf\xb\xbaH-;u\x80z\xc8]\x3\xcd\x9\xde]\x9a\xe0\xb0{z\x81?\x4Ixe\x0\n\xe8\xa7" -"\xe0\x0\x80\x30\xf\n\xb8\xc3\x99\x5~\xdd\xba'=\xd2\xe1\xb2\xa0\xdc\xef\xad;3.mJ\xc1" -"\xff\xad\x84\x61g\xdf\xd7\xe\x3\x46\xda\xf8J\xf2\x92\xd4\xf4$%n\xd5\xacN\x10O\x80" -"ipP\xd5\x8\x44\xa7\x8\xea\xc9\xe7\xf7xO\xd0\x16\x46\xf3\xbd\xcY\\\xa5\x1e\xe6\xbd" -"`}%Nx\xad\xdc^\x15\xc3\xb6\xacI@\xec\x86Z\\#\x10[k\xe0\x9e\xa0\x9f,\x5\xd6\xd7i`" -"\xa8\x43\xb8\x1e\xe4\x33\x97\x7f\xaa\xc3\xcb\xda\x85\xcd\xd2\xf4\xdb|():w\x82V5\x99" -"*\xf8\xf3\xb3\x8b\x44\x80\xd9\xa1\x39\xb1\x66#E\xa8\xab\xe1\x63JwIl?WY})\x85\xe9" -"\xe5G\x17\xab.\x99\xca\x35x\x94\x41\xbc\xdd\xed\xe9\xa9\xe2\x10k@\x1d\x96\x84\xad" -"\xbe\xfe@\xd6\x7\xf0u\xc1y\xe9\xcc\x3\xe5\x9e\x65\x43\r\xb7\xb\x44\x1d\x43\xdf\x3" -"\xf2\xaao\xf0o\"KnE[\x1\xc6O\xb8\x9e\xec\x91\x3\xe4\x84S\xa9t\x9bM`(\x8\xc7\xe4\x8" -"\xa8\x90\x30\x91\xd8^\x6\xaa\xf6\x35\xd0\xd5)\xc3\xcd\xd1\xb8G\x9a\xc0\xf4 \x8c(" -"K\xb6x\xa5G\xf2\xbdw\xbb\x17\xc8mE`COz\xd1\x93w`\xa6\xaaU\xb6\x14\xcf\xa9\xff\x8c" -"\x9c\x96V\x1a\xe6\xc8\xf2\x12\x1cN #t(\xbcQ\xdf \x99\xb6\xc4\x9e>\xfa\x18\xe6\xd4" -"9\xe6\xe6\x98\x1etn\xbb\x1d\xc4\x61%\x9d\x8e\xa0\xf8\x9\x9cG\xcc\xa2{-\x98+r\xc9" -"\xa0|\xf2\x1b<\x5\xd6\xe2nn(n4\x8b\x89\x44\x7\x8e$\x80\x9f\x9c_=\x1KL\xba\x2S?V!" -"\xbf\xba\x1f\xe\xdbwlcGFp<\x9fs\xba\x89\xb1\x96\nId \xc6\x8fT\xe5\xb9\x1\xa6\xd7" -"3\xd7\xac\xc7\x9f'_\xff\xb2S\xf3\x89\xaaH\x0\x84\x46\x8b\xb3M\xa1\xe7\x97\xe4;\x7f" -"n\x8c\xaf^\x8c\x93\x6\x9a:'0\xe5~\xc3\x9bg{\xb7>?\x7\xc2\x5U\x99\xf7\x6.S\xb3z_\x0" -"\x99\x90}.\xd8\x7f\xf7\xa8,\x95\xfb\xae\xb8\x88\x3;\xdf\xd6{\xa3\xa6\x3\x1aL\xdc" -"V\xcb\x1eL\xf5\xb0kF\xe1m\x98\x8b\xec\xce\xfa\xcb\x9e\x1c\x3p#\xd7\xbf\\\xcf]e\xaa" -"f\xa1z\xb3\x61\xbey\x81\xf1\x32\xa5x\xf3\xab\xfb\x97\x96\n`4\xf0R\xd9\xd5\xaf\xdc" -"\x6yx.\xc9\xf$\xf\x94:_\x9a=\x96\x9e\xd7\x39\x92T\xffg\xd8\x9d\xf6h\xf7\xc5o\xce" -"\xa1\xff\xdc\xf2\x4\x81GJ\xc8I]:\xf4\xb6\xd7\xee\x9>6\x9c\x5\x7f\xbp\x85\x82 i;9" -"\x8a\xcf\x8e\x81\x43U\x81\x32\xe4\x39\x14\x5\xe3\ns\x93|S@.E\x9fJ\xa3S\x9c\xf7\xa9" -"\x9a?Q\xc0\x30}\x4]\xf8\xb7wW\xe9.\xa2\xf5\x1b\xf0\xbbOw\xd3\x90M\xd3UfXp\xc2\xb5" -"\x9f\x1e\xd7\xf8O\xc7\x1f\xdd\x7f\xbl]1\x82\xdbw\x82|\xa6\xa2\x6\r+\x8c\x83\xc4\xea" -"JC.\xf4:M\n\x95,\xc6\xcb\xbeR\xa9\xf0\xcd\x66\x1aS\x89s\xde\x41\xff\xe9\xc5\xcfU" -"\xf2Pk\x9e\xfe\xe5\x1f\xba\xe5\xe6;\xdc\xf5R\x84\x99\xa4|\x3\x11\x63\xc8\x8d\x30" -"\"`g\x84\xde/F\xa9\xc9#Z\xee=Oq\xd4\x95\x9b\xc\xfd\xc5\xb7\xe7\x8c\x8c\n\x8f\x9d" -"\xc9\x94@\xc2&=\xba\xcb\x34<\\d\x85w\xf5\x61\xbP\xea\xb1\xcf\x7f\xd0$\x19\xef\x39" -"A\xc7\xca\xb\xe\x64\xeb\xadK,\xb0Z\x7\x93\xdb\xc3\x8f\x19\x46\xd4Gg\xbd(\x7f^\x97" -"y\xc6\x11\xca\r\xaa\xa1\xe7\x39=\xbe\x6\x83\xc8\xd3\x45\\\xdf\xeb\xc0\xe6KT\xb7\x37" -"\xe2\x98\xdd\xa6\x5\"|\xcK\xba\x87\xaa>\xc7\xfan\xba\xec\x39\xe6\xef%\x37\xd5\x97" -"C\x91\xd3\x17\x39\xd9\xfc\x42\x98=\x81\xae\xe4G\x11\xc8#\xf3_\x8e#!\xact\x94\x38" -"qs\x9d-\xbe\x97H\xfehY\"c\xe7q?'\xe0\xd4\x9b\x9b\\\xb7\xa4\xe5]\xe5Nk\x80\r\x15\x85" -"dP\xff\xd3\xae_({\x12\xaeOC\x8b \xae\x9e'\xe6\xca\xa0\xf>\xae\xad\xbe\x8\x43&\x84" -"\xfd\xf9\x93\x1e\x92UD\xa6\x80\x18&\x2\xa3\xc1\x99}\xe5\xd0\x63\xb\xd5\xa0\x10S^" -"f\xe1\xc1#\x1=#\x96k5E\xc7\x43\x1c\x39\xb9r\x95\xbf\xa4\x9\x9d\x14\x46\x10\x4\xc4" -",\x85\x9^\xea\xcb\x9bG\xc5\x93\xbcm\xb8\x63S:\x86\x19\xba\xe0\x90\x95\xde\x8e\xca" -"C-M\xddI\xaa`\r'~u\xdc?\\f1\xe2\xa0S\x82\xcb\x0x%\xfa\xdbwC\x8d\xcf\xa7\x8e%-y\xb6" -"\xa1\x96\xd5\x16L/\xeb\x85\xd7^\xca%\xff\x80\xb1\xd9\x7f\xe1\xe\x87\x96\xc\xa0\xfc" -"G\xc4\x1d:!;\xf1\x41\xb4\x8b\xc3\xaa\xa9?\xa8\x62\x45\x6\x46h9Fe\xbf\xd5-\x12\xc3" -"\xbeL\xe3\x9e\xfd\x81\x11uC\x98\xa9\x44\xc3\xfd\x1a\xfa\x98\xec\x33{\xaa\xaf\x89" -"\x9d\x35\xe8\x4\xcf\x41j\xd7\xfe\x45\xff\xf1?\xc6\x35@\x7P\x10\x43\xf9\x8f\xe8\x42" -"\x8d\xe8\x1\x39\x1\xbaj(q\x1a,\xa8Z'\xb\xb1\x35\xb7/\x1dP&\xe8!u\x81\x86\x7)\xe9" -"O/\x18x\xa0\xe9lY\xe9\xf6'\x14\xfb_\x8f%\x0=\xfcsG\xe9\x90\x7\x8a\x9a\x33\x1c\xb3" -"\xa6\xa5\x35\xbc\x61\x86o\x2Q=\xeb\x98,J\x13\xad\xbf\xba\xc3\xffp\xa7\x33_@\xd5H" -"\x9eH\xe5\xed\xed\xef\x16\x19\x19s\xd9\x32G\x9c\x62\x18;\xe%\xee\x8cOv\xd4\xf1\xae" -"E\xda\xeaJ\x12\xae\xdd\x9e\xf8\x1d$\x8e\x8d\x19\xf8\xc8\xa5\xbe\xcd\xd1\xea\x1e\x98" -"x>\xb7\xa3\x81I\x17\x8Q\xb1\x94,\x96\xc5=\xe0m\xef\x80\x91;\xfc\x4\xe5\x39\xecg\xc1" -"\x10I\x8d\x15\xb7\x82h\x85>\\r\xf4\x85\xf8\xa2{v\x85i\xe5\x42\x41\xf6\x11Xu\xe2\x97" -"2\x92\xcfH\xff\x91\xd4^\xbe\xd6'\xae\x9f\x7\x66\xd2\"\x1\xb2\n\xfd\xd4\xe[\x17\xcf" -"3\x7f)\x99\xe0\xbd\x15\xb8nF\xeb<\x18\xfc\x12\xb7\xdc\xad\xcf\x9d\xd5\xcl~?7\xe6" -"\x15\xa8\x92\xdb?W\xe2P\xa0r\xa4\x9frw\xddj,\x80\x42i\x82\x33\xd3Zi\x9b\x17\xec\xa5" -"\xdb\xdam%\xe\xd4\xa1o\xcc\x89;\xf0\xdc.3\xfb\x1e\xbd}\xed\xea<\x1c\x39`<\x8b~\x1a" -"Z\x83:\x8f\xcd\xd5W\xb\xd0\x88t\x9b\xb2\x32\x61Sfhyb\xc7\xe5n\xd0\x89\xcd{\x9%\x5" -"\xca\xfaZ\x80\xf5\x3\xc4\xcf\x33\x7f\x7\xad\xf0\xd1\x6\x93~%g\x8\x39\xd4\x91\xf7" -"\xbf\xf7\xa5#\xdb`\x9d\x12\x63(\xc1\x61\x13\xec\xbc\xbf\x9c@\x4\x90\x44'\xa1\x8\x61" -"\x8a\xe5\xd4\xed\x80\x9f\x8c\xca\xf7\"Q\x10L\x94\xec[\xee!\xf9\x1b\x17\x9d\x31\xdb" -"\xa7\x9c\xee\xe5\xec\x7f\xf6\x98\xeb\x84\xab\x1d-\x1a\x62OX\xb3\x62*x\x84L\xe5\x14" -"\x98\xb2\xce\xf3\x8e\xaf\xe2Y\xd2,{\xa6\x11\x4\x65\x1a\x86 \x8\xbc\x1d\xdd\xa5\x8c" -"\xc4_f>\xb2\x64(\xda\xa8^w\x85\x36:i\xd2y\x9\x96\xef]\x96!\xd5\x30\x42\xf4/yIb\xfe" -"\xa4nF\xf3{\x8a\xd1\xfbv\xfc\x8d\\\xf2\x14hC\xf8\xcc\x62Q9\xc7_\xb4-\xdaq\xa7R\xba" -"\xc4\x8f)NL\xc\x82\x89\xfc\x46\xda^\xfd\x9c\x91\xbd\xa6\xd0'Q\x8b~\x81\xe8\xb2\x1f" -"uZ\x96\x15\x62}X\x12\xac\xa6t\xd1Rz\x11\x85\xee\xd4\xe3\xc6(\x19n}\x7Y\xb1\xca\xe6" -"\xb9\xb7\xe9\x1\xe9Y\x9a\x65#\xf\x1e\xe4i\xcd\x33\xb9\xbd\x9c\x10LD\xe3\xc1\xab\x96" -"l\x96x\xbd\n\xd7\x81\x11\xa4\xe0\xf2\xd0z\x1\xa0\x38\xce\xdep6\xd0SMhJ\x15\x62\xa1" -"z\xd6J\x0\xf2y \xc\x3q\xb1\xcb\xa6\x17Gg\x1d*!\xd3\xf9\x64l\xa2\x90\xf6\xb8$\x18" -"\xa9o\xa1w\xc6'\x82wPK\x7f\xba\x93\x63%\xf5\xfa\x12J\xb0\x18\xa1]\xc1\x8d,^\x8f\x93" -"\xcd\xee\xa5+\xee\xdbx\xa5x(\xd8\x1a>l8\xb9\xfa\xf3\xdcN\xb7'>\xce>\xa4H*\x1c\x62" -"B\xa3\x35\x86,,7\x17\xf9\xc9\xed\x95\xf7{\x14\xcN\x15i\xb2\x19/\xc7\xdc\xf7\x2\xd0" -"\xbc\x9aPB\x8e\xc4\x6\xf8\xbd\xc\xaf\x88kM\x97\x93 \xd3\xe4)\x81m\x88\xf7\xc7\x14" -"m\x96\n\xc1.p\xf2\xcbz\x9fN>6fe\xab?\x1bKd@\xf5^\xea&\xdc\x9e\xe0\x9k\xb7v71t\nS" -"wfI\xc\x8c\x17G#\xbf\xe\xb4\xcSp\x1a\xad\x12\xb2\x1d\x43j\xdc\xe2\"\x3\xc1\x5:\x9d" -"\xc4\xe9\xf1z\xe6\x17\x88\x8cKNo:r\xeNcf\xba\x62\x82!\xa3\x87\xd8\xab\x15\xe0J\xd6" -"\x93\x87\xc3\x10\xd3R\x8b\xd2\xfa\xa5\xb2+\xff?\xa4\x94\xf5\xfb\xfa\xc4\xf7q\xc9" -"\xc7@+\x95X\xcZ\xc4\xbb:\xf6\x92\xa7\xc\xb2\xc8Q\xfa\\\xf1\x17>\xec>\xc2\x9bZ\x5" -"\xa0\xb7(\xbb\xbbQ\xd3\xb7\xad\x8b\n\xf1z\x15\x63\xe8/\xaf\xd9?\x8bq\x18\x1f\xb7" -"\xaf\xe3R\x87ON\xc6\xd3\x34\xabgGQ\x9a\xb8\xe8G\xb7\xbc\xed\x33\xebTX\xa8(\xe0t\xe7" -"K\xa6!\xbd\xcd\x3\xfe\xa6\x4\x7f{j\xbd\xa0\x1f\xc7QK\xa1\xaf\xf0\xd4\xd0\xc0\xcb" -"\x8fNB\xd5\xa8~9]\x9a\xcd\xd0,\xcc\"\xc\x15qSB \x18rXF\x0\x9a:\xcd\x8c\x8c\xdd\xb6" -"k\xc6\x83k@&\xfd\x9fRj\xa2u\xd0l\x81\x31y\xe5\x92O&\xa2P\x94\xe7\xbd\xa8\xbd&\xaf" -"\xc4\xce\xb4\x1d\x89\x64\xd4\xfcJ\xf1\xdf\xb0Y[\xc5\xd6qL2\xf1]\xc7\x19N\x9a:s\x1" -"\xe0\xfc\x95" -"\xe7\x8d\xad\xd2\x5\xb5\xf4,\xc6\x30$bK\xaa\n\xb4\xdd\x44x2\xb4\xe1\xdb\xa7{\xdf" -"\xad\xd2#\x98\x9f\x8e\x95\x8c\x8du\x9a\xaa\x37\x93\x6\x64\xc6\xef\xecp\x81\x16$\x8a" -"*z\xf3\xd6V\xdd\xea\xfd\x0\x9b\x7fS3\x85\x46\x8\xe6~^X\x8a\x85qg\xad\xf9\"\\\xf6" -"\xc6\x41\xf5\xe1\x9c>\x8g\x8a(\x11\x99\xed\xda\xc8\x31\xb5r#\xb1\xbe\xea\xdf\xdc" -"\xbc\x8fo%\xd3/\xca#6\xc8\x8\x16.\x8f\x38\x16V\xe8G\xfbl\xb1\x39iW$%\xaa\x5\xac\x83" -"\xc\x33\xden\x3\xf\x86\xa3\xa8]*f\xa7\x7f\x10\xd6\x45\xab\x45#\x97\xbf\x0\xdb\x8b&\xe1\x15\x2n%gF\xcd\xcx\xa9Y6O\xde" -"m\xed\xdc\xd0\xf4\x41\xa6\x1a\x1e\xba\x32\xc7\xbc\x17+\xb0\x95\x12\x14\x8d\x1e\xba" -"\xc9\xe7\x91\xb7\xd5\x1bq\xca\xd2\xdc\x9b\x83\xb2\xf9\x9b\x37&`}\x9c\xbeX\xb4\x99" -"\xa1\x37S\xce\x87\xfc\xdc\xe2\x1c\n\xd0R\x8e\xd0\xef\xb9\xb2\xc9'\xf5|x\xc6&$\x8a" -"\xa2\xb8\x35\xa0y\x12\x44\xc5\x89\x66\x86\xa6\x61s\xec\x9f\x80,Lc:B\xb0\x86\x33M" -"*Hx\xeS\xd0\x8\x9${\xe6NR\x9f\x96\xad/\x8b\x39\"\xa6\x9}AM\xde\x1e\xc7o\x95R\xf9" -"\xb8\xd5\x8b\x8e\x34\xf3Y\xady++\xe5\xc&\xdb\x5\x3^t\x97\x16.|I\xc3\x8d<\xd9\xb9" -"\x8d\x62\n\xa6t\x92\xbeZ\xfc\xa3\xa8\x1ap\x80\x18\\\x7f\xbQ\x5\"?\x1f\xa7x\x5P*." -"\x8c_\xee\xa2v\x99\x85\x8d\x84\xa9XB\xc5\xf2\xfbhhmY\xfe$\x9\x1f\xcd\xde\x13\x9b" -"dc\xbcl{\x1e\xe\x90\xd2\n\x83\x65\x1a\xf0\xc\x85y{\xb9\xf5>\xce\xc1g\\~\xe6\x36\xd0" -"\xd9\xe7}\xbd\x8f\x89g\xf\x85^\xe4\xd4\x80\xf\xf3\xf6\x95\xe\xff\x9\xbb\xf8\xa0\xda" -"\xf6\xb8$(@\xcf\xa5\xbas\xbe\xb9Q\x15\xf4\xa7\x8b\xcc\x2\xd8^\xcc\xe0\xc0\xf2\xef" -"o2\x8a\xd1\xddl\xc0IZ3\x15\xb4\x14\xa4\xd6\x1d\xa5\r\xa4mz\xcc\xef\xf6\xeeVE\x18" -"\x5\xd2k\x3Y\xaf\x19\x35\x31\xf9_e\x89\xce\xado\xa0\x41\xaf\x15\x30g\xf8\x8a\n/\xec" -"\xd1\x35\xc5\x66\x82\xdb+E\xa7\x1d\x1f\xa7\x37\xc0\x64\xee\x9aO@K\xb7*p\xb3\xaf\x3" -"05\x93\x93$~\xc7\x81Q$\x82W\x98\x65$\n#\xcd\x84y\xf2\x1c,D\xa1\x19\xeb\xc4\xe8\x1b" -"0\x8d\xd8\xaa\x86\xe6\xc=\xd8\xad\xa5\xe\r\xfe\x83\x8\xeb\x1a\x7f \x1e\xde\x8d\xcf" -"\xda@Z\xef\xb4~\xel\xa7\xdd\xb3v\xdc\xb2\x1d\x37\xf7\xac\xc4\xd3\xe9\xf2k\x3\xa8" -"\xde\xe\x89@\xca:\x9eu\x96:8\x9d\xf8\x3\x8d,H`r\xf6\x1c\xc\xea\xf5\x0uZ\xa6~f8\x82m\xb1\x34VM\xb9\x93\xce\xebnzfY\xc7\xc5\xc0\\\x31\x2g\xd5\xf8\xa2" -"N\xec-\\\xc3\xe3\xf3\xc8\x8\xe6\xd6\x6\x8d\x1aWdk7\xfa\xbd\x98\xec\xb7\xba\xf9\x9e" -"}\x9a\xc4\x41JI\x1as\xca\x34\xc5/9CR\xf6\xb5\xa1_\xf\xc4\xd8\x86\"\xda\xc6\x94i\x9c" -"$d\x84\xad\xac;\x1d\x36j\xfe\xde*,\xd2\x4,\x90Qjfj\x19\xa9\x1c\x80$\x8b\x11\"K\xed" -"\xdf\x1a\x32\xe#\x7\x39\xe7U\xd0\x98\xb6\xa6s\x15S_L\x18|\xfag\xed\x81z\x3PV5?\xc8" -"Y\xbf(c\x17\x99o\xff\xb4x\xa2$\x8b\x90\x8f\xf1*\xbd\xe7\x5@\"$\xa3\xee_F=\xd3\xd2" -"C\x87\\\x84\xe0-\xb9h\xec\xa1\xccR\xc7Qq\xeaP\xd6\xa8\x8c\xa9\x13'\xa7\xaaW\x95\x1" -"\x9f\x36\xc0\xa1\x9c\x9:\x1c\x9d\x37#\xc7V\x8f\x9d\x41\xf2\xe4\xff\xb7\x12\xfdG\xf8" -"\x97p=zb\xbXk\x81\x93l\x84\xaa\xed\x61\xd8\x43\x32\xb3\xbe\xbcO\x95\xb7\x96\xb9>" -"\xf7\xa1\xf5\x65\xc4\x94\xf8\xa6^\xdb!\xe2\xee\x18\xdc\x2U\"\xef\x8eY\x98\x87\xca" -"(6\x6\x9c\xdd\xd8\x89\x88\xe5\x86)w\xb7G%\x84\x30\x31\x98\xcc\xe9~\xf9\xf9\xe1\x44" -"m\x1f\x1f^\xd1\xcf\xc6\x66\xa8\xa0\xc3\xa0>\x17\x92\xef\xb6\n\x9b@eI\xe0\xde\xdf" -"j\xcc\xdb\xd9\x87\x42V\x8bG5\xa7G\xd8\xe5\xde!\xe6\x30\x12Z\xe0\xc6\x91\xd0T\xe4" -"!\x99\xc1[\x1f\x80\xca\xfan{\xb2\x0_7J\x9a_\x99\x0\xab\xb7@\x9c\xcdP\xc3\xaf\xcc" -"\xab\x12\x14\xe6\xa8V\xf7\xc7\xeb\xa8\x9b\xc3)\x18\x1\xe1\x34=\xa9\xda\xd2\xc6\xed" -"\x7\\\x8e\xca\x14#\xb4>Xz\xecg\xe6\x14Rr\x81K?\x19\x1b<(V9\xf9\xe2\xd6\xe1H\xa0-" -"\xc2\xcb\xc0\xe0T\xd6)\\\xd0]\xba\xc1\x95\x4\x0\xa9\x18\x93\x16\xf0&[\x86\xa7\x32" -"\xd3\x2\xc5\xbe\xe8\xed#7h\xf2\x37\xc6&\x0\xcb\xaa\xff:\x11\r^\xfbl\xc7\xca;\x92" -"\xd9\x65\xca|^\x8d>d\xec\xf2\x39\xfe%\x7\xfcy\x7f\xdb\xe5L\x11\x12\xb2\x8dM\xa4L" -"`\xab\x9\xd9\x94\xc5\xbax\xd6\x63\xa2Y\x19\x34\xcc\x5+\xc7\xc\xd1\xdc\xa3\x32\\\x66" -"\xc9\xcb\x98. 9\xf5\xdbp\xc8H\xd3\xdc\xef\x65[\x1c,\xd0\xce\xc8\x86_\xe8\xe1\xc0" -"\xa2g\xbeOp~\xceoZ=\xfc\xa3\xcc\x1e\xdf\x92\xc7`C\x9fQ\xaai\xa4\xc1\x80\x1e\x96\xca" -"Mn\xa4\xad\x98\x2X\xf3\xd1\\\x89\x39\x13\xab\xce\x9\x10\x19\x84\xc6\x1b\x91\xd6\x3" -"\x5>I\xa9|\xb8/\xbap}\xae\x8a\xf1\xd5y\xfdi\xc8H\x1c\xb7\xb7\x12\xcb\xcd\xdbM({\xe9" -"\x95\xe3,\x2\xb3\x99`*\x8\xb9\xdd\x84\x90\x39\xb5g?\x19\x30\xbe\xc7\xbf\x36n\xb0" -"\x82\xd2\xca]\xb2\x38\\\x8c\xc4[\xe3\xfc\xe\x31\x82\x1\x91\xa8\x14\xeb\xa7\xc4\xf2" -";\x19\x38\xe6\xc4\xd8\x0s'\x87\xcd,\xb9\x7fv-\xfc\x85\xd4\xb7\x98\x80\x9b_\"T\xd8" -"&\xca\x42\xb3&\x95\x42\x8d\x12\x2\x98\xb4L\xf3\x84\x94\xe5\x62@\xb7]\xf1\xe4\x1e" -"F\xe5\x83\x95\xca\xad\xd0mm\xa0\x33\xe8\x1a\xde]\xc3\xb8=\xaf\xf7\x43" -"\xc6\xe9\xe4\x87\x16\x0=5\x8d\xf6<\xd7\xfd>/r}\x1f-\xc)\x96/v\xd5\xc9^\xd4Ko\x8\xd0" -"R\x2ZfW\x85\xf2\x64\xa3\xd5\xf5Y6w\xb6\x30\xe6(\xb5\xea\x81\xfb\x37\xcf\xfdz0\xb7" -"\xfa\xd2&\xb6\xfd\xc8+\x8x\xafL\xe\xc4\xf4$:\x80{\x98\x39\xea\x62\xbc\xbd\xf7\xc2" -"\xe9\xb3\n\x62\x38v\xe6\x32\xe0\x84\xeb\xf4\xa2\x1e\xda\x4\xfc\x88\xa1\xc0p!\xd0" -"\xc7.\xc3\xe9i\xd4I\xfe\xb0\x8eX&\xec \xe5[!\xeaq\xeaY\xf6\xe3\xb0q\xb\r\xda\xb3" -"&\x1bJ )\xec\xabh\xc1\x9a\xddQt\xe5]^\x98JN_8\xf5\x92\xa3\x2\xfe\xe6\xec\xe7\x32" -"\xdd\xe8\x41\xa2\x86r\xc6 \xcc]htU\xa5\xc0o\xa9\xfeh\x83\x94\xa0O\x96\x31.\xd0%\xb7" -"\xaao\xbc\xe2\x92_:\xe5Y\xcc\x18\x86\xbe\xec\xdbp\x82..\\\xa3\xf7\x32\xa8t\x4\xb1" -"Sj\xac\x46\x99\x89\xe9\x61\xc\xfa\x44\n\xce\x43\x87Zp\xcaQ\xf3l\xb6\xf6)\xd9\x42" -"L\x1e\x35\xa8\x8f\x92\xd5\xda<\xd8\xcb\xaen\x84%\xa3ih\xe2\x1fO04\x97I\xe0 [\xff" -"\x8dU(7\xd6\xfc\x39S%%7\xb\xba\xc8\x33\xf7_\x18T\xc9?\xc5\x33\xa4\xaaS\xad\xf7\x0" -"\x81s\xa7\r\x94\xa4\xeb\xf5\x38\xea\x9e\x62\xbc\xda| \xe0\xa0s\xbe\xe2\xef\xac\x34" -"\xd2\xef\x1d\x3\xba\xbdQGe\x9eP\xb5W\x4[.\xb8\x9d\xb3\x3t\x9b\x4\xd3\xf5KC\xfe\xd6" -"\x12\xfc\xc6\x82\x6\xe0\x1\xa7\xaf\xe9\x2\x30\xd9\xc1/t\xa3,~\xdb]\x2\x41\xdc:]Q" -"H\x1f\xd7\xc8\xfa\xe0\x8f\xee&?\xbc\xed|}\x91\x1b:0<\x83Z\xf5\xfa\xdf\xd2\x18\xf6" -"\x1a\x9dm\xe8\x4\x85\xab\xca\x88 \x0G\xb0\x94\x44\x1fwg\xb9z$\xe8\xc6\x12Y\xf\xa2" -"@{\xab\x1e\x8bV\xc7\x19\x14\xee\xf2\x35]\xd9|\xfa\xfc\xc1\x92\xbc\x6\xfc\xe0\x63" -"\xd3\xd9\xd1\xa6)\xaa\xdcu\xe3\xbf r4\xc2\x8\xe7\xe3\x6\x63\xed\xd6\x91\x4\x30\x65" -"\xc9\xcb\xc4s\xd9|mM\xd3\xdf\xf5\x9dj\x9a\xbc\xdd\x44\x12\xc3\x12\x8f`1`\xaa\xd8" -"\xf8\x1cnzM\xca\xf3_:\x99\xb4\xea\x10\xa3\x43u\xb4w\xc2\xbf\x84\x65!\xa7\xea\xbd" -"M(\x7\x8e\x93@E*\x19\x8f?Z\xcc=\xb7\xe3\x90\x89\x39\xffn7\x9\xc6\xa3\xfd\x98\x89" -"C\x9aJ\xe3\xe1\xb\x61\x8c\xc9.\x14\xb6\x84)\xa3\xad,\x80\x94\n\x10yE.\xc2\x66\xf2" -"Te{\xe7\xd7\x9a*$\x8J\xf7?m\xf7\x1f\xbc\xd3+\xf6\x91:?\xab%\xf9wx\x7f{\xb0\xc3\xa3" -"\xe8\xba\xb3\x8dz-\xb0\xb4\x82iPd=\xd1\xe0;\xd7\xdd\x1f\xb1I\xa3\x38\x62\xa8\x92" -"&\xb7\xcb\x45M\xaf\x61\x31(\xc2\x7Tp\xe4.p\xa9\x44J\x8en\xcaRcE\xabH\xe6\xf5\x16" -"\xb\xa2;[\xdd\xfd\xa6\x4\x9e\xc4N\xd1\x46\x1c~\r\xd5\x14\xb1n/\xb2\x85\xf7 9\xde" -"\x80\xd2&\xe1|\x8c\xf0\xd2k\x9f\xa3\xa6\xe9H7\xeb\x9e\x93\x3\x36\x88\x97g\xa8\xd7" -"\xea<\xe9\x80\xa8\xea\x95R\x8b\x0IW\xbe`g\xcd\x9b\xd8\xe0*\xf#\xcc\x17\x62\xcc\xa6" -"V\xd3\x34\x12\xff\x45\xe9\x17\xfdJ\x3\xebn\x8c\x1f\x43\xfd\xb0\xa8\x96Z3\xb4\xfd" -"&\xbc$\xa2\xb\x30L\xa8\x17\xe8\x84\x95\xba\x9b\x36\x1a>\x93\x37\x17\xff\xb0'\x1f" -"\x7fp\xc5\xd3\xcb\xa1\xe8m\xfQ\xbf:\xba\x19M\xaf\x32\xc3\\yf'\xd0\xc{\"q\xac\xe2" -"F>7\xe9{<\x82l\xf3\xdb`\x2\x8f$\xf\x94R\xcb\xe0\x8f~\xbc\xc5\xfd\xb1\xbc\xbb<2z\x9f" -"E\xb\x9eVq\x91\x61\x1\xd6\xe3\xe5\xe4X\xca\x31\xf0M\x12\xf5\x92\xf8;\xad\xa2\xc3" -"h=8\x86\xaa;@9c\xab]\xbe\"\xf\xec\x0\x3ztX9\xf6z65\xdf\xd3\xbf\xf0\x8f\x36t\x82\x96" -"-\xed\x88\xec\xf6\x32(R\xd6\x43\xa5M]0>\xb0K\xfd\xde\xe9\xbb\xa1\xeb\xcc\xba|e;:" -"a:\x8eq\x9a\xde\xbe<\xe1\xbd~uN_Iw\xe8\x63\xe3\xc2\xd3\x88\xa6R'\xb4Q\xd4\xf3\xa4" -"\xf9N\x6Q<\xbaJ\xc1\xf2\xf5\x11\x61?\xf0\x35\x61\x16\x84\xcc\xc4\x61Y\x90\x0\xe5" -"F\xe4\xd9r\xcai`\xe0\x95\xa5&\xe4sZ#B\x1aL\x9bY~\xce\x8\xaf\xa2u5\x92\xbd\x16\xde" -"\xd9\x32U\xa1\xe3=\xee\xce<^\xb7{\x94g\xe\x81\x37\xf2\xa4\xa4\xb9\x8a\xc1\x93%\x8e" -"}\xea]\xb8@\x8a\x80\x61\x88\xf2\xd1\xdd\xc4@\xcc\xf0\xe9\xa6\xe2\xf0\xc7\x8f\xdb" -"\xd7\xb6\x8d\xd4\x93\x9d$X\xc1\x96[\xf8\xbe\xd4VK2F/\xff>\xc8\x92\xc0;\x11\xd3\xea" -"\x81?\xabL\xfb\xe8\xd3\x1\x63)\xc5\xb7\xe3\xdf\xed\xf\x8(MD\xaa\xbz/k\xc9n\xa4P>" -"\x8e\xf5*d\xc2+\xedkE%\x81\xae\x8f\xf8\x91}S\x97\x64q\x94\x1a\x91\x16\xa2\xd8x\xfb" -"%A\xb5\x61vz\xbdN1\xcc\xd8\xa5\x90\xca\x3ILb\xaf\xfd\x64\xea\n\x1b\xc7y\x17=\xad" -"\x84\x99\x9cz\x8d\x84N\xb1%\x9d\xe7\xbb[%\xcd\x2\x35\x37\xa4t\xa5$\xeb\xe4\x66\xb" -"\"V\x89I\xe6$\xd8\xfe\xa0\xad\x37\xf4\xce\x1e\xc7YU\xee\xfaI\xc6\xbf\x18\x3\xbe\x87" -"\xe9\xc9\x86_\xf3\xf6\xb8R[\x8c\x15\xfe\x88\x35\xca\x15='\xe6\xc0\xff\xc\xa5\x10" -")\xa7\xa9\x18]%\xf0\xf1M\x86\xfcy}\xcc\x1f\x99\xee\x97\xe2\x5K\x9c*.\x6\xfd\xbe\xb8" -"\xde\xf6\xcd\xd3h\xbf#\xa8X\xd9\xf8\xc1\xde\xfd\xce\xaf\x1bJ\x8d\xe5\xea\xfc`L\xec" -"\xcf\r([\xe0\n\xa9\x12\xea\xb6n\xffM7\xad.\xfe\x34\x85;\xbf\xd8|\xe0\x9b\x18t\x9b" -"H\x99\x43\xee\xca\xe7\x88{\x0o\xb8'\xd1\x1\x91\xda\xd1\x84\x66\xcd\x1f\x86PXy1\n" -"\x8b\x17\x1f\x90.\xa0\xc2j8\x8e\x13\xb5\x9e\x8f" -"A{5\xd1\xc8Q\xf9 :\x89\x97R\x15)\xf2\x1a\xd8I\x8f\x96\x93\n\xa7~\xba\xf8.\xe0*W\xbc" -"w\xc7\x92\xd9\xf2 )KE\xf4\x8e\xa8\xfd\x94\xe0\x1c\xd2VE\xd3m\x16\x89#V/?\xdc\x93" -"\xcby\xddG`\xda\xc\x10<&ur-z\x1by\xfc\xb4$^\xd1/\xa0\xdbRI,\x9c\xceX\xb3\x33\xcf" -"\xee\x82(\x12\xf7\xdc\xa6\x8e\x80,E\x1b\\\xfa\xeb\xac`\x8b\x95\x3\x86\xb6\xc5\x82" -"9\xd1\xc6-bM\xd5\xd1W\x82\xfcU\"\"\xcc\xa0m\xdf\x38{7>2\xc3\xc2\x86Lc\xc7h5\xc\x37" -"(7`\xf3QZ[\n\xfd\x66\xc4\x8a\xb5\"\xeb>\x80\x8c\x6\x1f\\\xd6\xbd\x96\xcd\x18\xc9" -"\x83\x9d\x30P\x8e}N\xdb\x88\xe8\xf1\x1e\x31\xe1\x9\x19\xb1kyq\xf0mxw\xa0X\xd8\xa4" -"\x94L\x84\xfcl\xae\xdf\x33\x41\xb4\x8bn\r<{\x85\xd7\x10\xe0\xc3_[PS\xcfKG\x98\xb3" -"w\x8c\xc2\x8b-\xc7\xae\r\xf3\xa4\x9f\x9f;\xcd\x8e\x95\xd7\x46\xc3\\?G\xd6\x8b\x8a" -"\xa3]\x97\xaa\x8\xe7\x11\xb5\xfb\xe7\r\x1a\x62<\x82T\x1e\xbd\xc5\x1a\x82}\ni\xe6" -"\xc0I\x8z\xd2o%n\xb7W\x7fX\xcc\xff\xbc\xcb\xa5\xa9]\x9=\xc2\x94\x64\xc9\xa3\x8d\xe9" -"[\xc6\xb1\x85\x39\x63\xb2\xde\xb0\xb5z\xd1$\x8do\x16%\xe1\x15\xee\xb9Q\xbWr\xaa\xe4" -"\xe3\xc8\x66\x65}\xb0\xb3\xbf\xe\n\xc3\x45\xe1\x16\xf8\xd4\x97kw\x8v\xff\xe3t\x8c" -"6\x16U\"\x99\x1f\x46\xa3o\x19=\xd1\xa1\xc9G\x13g<~L\x81X#\x91\xb6\x36\xc7-\xe9L\xe6" -"%Ct\xf9\x9b\x62>V\x86\xc1=\x8a\x83\"\xe8>\x11\xbb\xb\n\x89lj\x8c,OulS\x85\xcdp\x17" -"\xf2m#\xf7\xc3\xee\x97\x37,\x86\x8c\x8c\x91U\x81r;\xb6\xb7kL<\xe8\x99\x8eO\xa6\xca" -"@\xb6\x33\xdf\xda\xa5\x9b\xa9\x2\xa4\x95-\xa9\xe\xc4\xfc<\xf0\xf2gj\xcf\xa7\xf7o" -"x#o\xa2\xde\x10\xfd\x35\x45\x35r\x15$k\xb7\xe5'\xf2w\xc2\x8b\x35<\xc6\xd7\x9d\xce" -"\xf2\x1b\xcc\x8fw`<\xddX\xa2\xcc\xdd\xbe:\x98\x2\xf9\x41\xce\xd8\xe0\x35\x31\x38" -"u1\x95H\xc4\x19\x92\xa2\xbe\x93\x9a\x17\xcc\x10\x94&\xe3\x38%\xaeY\xbc\xd1|\xb1\x9f" -"P\xd9r\xff\xcb\xe7\xd9\xb4\xb0\xbb\x9S\x3\xd9\xdc\x9d@f\x96\xc2P\x8dl\xe9\x9e\x11" -"\xcf\x0\xf6\x46\x11G\xe9tI\xed_HmH\n\x86\xd3\xa7\xac\xec\xb7\xe9\xa9\x45\x98G$\xef" -"\xc2\x1cPy\xb1\xfd\x3\xed\x80<-\xea\xfc\xe3\x32}-x'q_\xd6]\x95\x6!l\x88\xb0\xfa&" -"\x93^\x95\xc6\x41\x14\xa5\x19\x19\xd4\x19\x3\x8b\x1a~\x9c\x1e\x82\x9f\xbf\xb5\x32" -"u\x9\x37R\xdf\x19\x89\x1a\x97\xf3\xcb\xf7q\x9c\x1f\xd6\xcb\x17\x1\x9am-%6\xe\xca" -"\x80LK5\x17&b\xccGi\xd2\xb7\x85\xc6\xc8~ZN\xcc\xe3\x17\x4\xe5\x9fq&;|<\xae\xc8\xac" -"\xb4\xc7\x42n\xc2_\x11\xa0\x4##\xeel>\xeb\x4(M\xba\xe2\xc7p\xbc\x41\x9d\xcey\xbd" -"E`\xae\xa4\x15q\xc3\xb5\x95\xf5%`\x19\x1d\xc7\xa8\xfb\xf6=A:w\xa0\x90^QtA\xb1l+P" -"\x1e\xa2\xf9\xe9\x9c\xc3\x8d\x5&y\xf2\x88\xfd\xf1\x89\x45\x42\xe3\xa6i\x89\xa0\x9" -"\x1\x85\xeb.u\x13K\xfa=\x91G\xc3\xdb\x8a\x62\x1d\x9d\x35\xe3w\x86\x85\x37y\xe1W\xb4" -"\x7fqbmk>c0\x5\x91Y\xc1u\x96\xc1\xb8\x7f\xe2\xb4\xffG\xed\x9dx\xfaL!`\x7rv\xc8\xb5" -"\x8c\xef]\xc0\x30\xb4\xa5\xd8<\xf2W\x9l\x4\x7f\xe6M\xe3\x7\xc5\x98\xb8\x15\x5\x8e" -"r\xd5\xf5}\xf5\xc3i\xe6\x64\xe1\x37\xde)4\x9e/\x9d\xcd\x8c\x9fN\xbanv[c'\xd7\xa2" -"\r\xfc\xb2\x7\x11'?\xd8\x9\x1c\xba`\\LIBH\x7o~\x3\xdf\x65\xa6\xa5\x1\x64\x98\xb\xbb" -"\xb7\x8t\x1e[\xf6\x5no\x99m\xc0\x7f\xff@\x8c[\x8e\xab\x8d\xce\xc3\x15\xe9(s\"\x8c" -"\x80]D@\xa6G\xe>\xe3\x98\x37X\xdd!\x1c\x9c\xec\xdb\xfa\xa4\xc9\x30\xc\xba\x0`\x8a" -"K$\x4\xa3\xc7\xaf\x1z;~g\xf3\x9f\xbQ\xac\xf9P\xd3\xe7\\\xc7\xbc+\x8d\x34\x80 /\xa9" -"X\xe8\xee\xb$\x5\x1R2\xee\r&L|\xa0,\x18\xca\x45\xcb<-\xe3\"\xd3\xeb\x7f\x0\xf9\x45" -"]\xb6\xc5\xb1\xf4\xe5\x9c>\x95R\xe\xc3m}\x90<\xbb\x62]p\xb5K\xf6\xf8%^A&\x4\xbb\xb2" -"\x9f\xee\x2l\xc6`W\x7f\x91\xdb\x1d\xb4\xa6\x13\xee\xef\xb2\xc\xf7\xae<\xd8\x9dVZ" -"\xc8\x38\x41k\x1\xb5\xdeO\xfaUP\xd1\x7f\xb5\x1f\xbb\xeb\xe2\x1c\xf1\xd5`8\x86>\xe9" -"1\xb9\r\xec.!\x1e\xd4+\xa9.\xc2\x44\xd4\xce,N\xc5\xca\x87\xa0&\x99'r\xdc*\xf7T\xfc" -"\x98+\x94\xf3n\xa7\xb7\xbfu\xe0\xec\xe9\xc\xbb*j\xa1\xa0\x12\xe8\x89\x8b\xd6y\xc2" -"<\xb3\x82|5\xd5\xd0/\x5i\xc7\xaa\x82\x61]J\xa6u\x18\xec\xf6h\xd3\xb5}n\xf1\xa8\x1" -"4$\xac\"h\xba\r\x9at\xd5\x88y\xed\xcf\x63\x82\xa8\x9d\x39xd\x94\x3\x3\xea\xec\x45" -"\xa3\x83\x4\xba\x8b\x1c\xb1\x98\x96z\xe2>\xb8\x10T\xbet\xb1i\x9\xa4\x5\xe8\xa7y\x9c" -"\xee<'\xf\xe2\xa6\xdcP\xbdsp\xb6\xb2\xc8\xfd\xb9\xa8}\x88\xd5\xd4\x3H\xd3\x98N9\xc6" -"\x93\xb6\xf4Hm\x99Gx`z\x80\xa3\x12(r\xdd\x65\xe4\x4\x92\x10|q\xc3\xcfp\x8a\x97\x17" -"\xe9\xee\xfa\xfb\xdd\xc2\x39\xc5:\xa9\x64[q\x10\x38\xe5\x9c\x8b\x86\x1b\x37\x41\x1a" -"\xb2\x3\x9b\xed\xf9\xcf\xd0\xf\x8\xd9\xc5\xd7\x61TB\x7f\xf5\xdd\x39\x87\x8c\xec\xc5" -"\xd7\xbf\xb3\xf1\xf0\x35\x8q\x85\xc0\x98\x1f\xc7y\xe8\x85\rP\x99-\xfd\xcf\x91\x32\xbcU\x1e\x98YC\xb0v\x18" -"\xac\x10\xd1\x15\x4Q\xf0\x84L\r\xc4\x1dn\x17\xebP\x8d\xc8h\x9e\xc7&@\rZ\x7fo\xeb" -"<\xc7\xbc\xe0_\x9\"\x8b|\xb2\xc5\x39\x36\x64\xd8\xdd\x9aK\x96\xb1\x2\xe\xf2]p\xaa" -"-\x91\xca\xe9:\xfb_+\xf0\xaa\x18\xca\\Y\x9f\xa1\xa7\x8\xef\x35\xbf\x8f\x7f\xfe\xc9" -"\xaf\xc1\xf2\x42\x87\r\x2\x8b+\x14Y\x6;I9C\xef\x12\x83\x82\x97\x83\xe1\x1\x2\x42" -"\xe5\xcfM\xa3\x9d\x93\xd5\x6\xf3\x89)6\xe7\xd6\xcf\x11$p\xa5!\xd3\x97\x43\x87\x33" -"\xd0S\x94L\xff\x12\xd6\xff\xae\x82\x46\xf2\x6\x18hO&7\x15\xaa\x98\xe1]r\xa5&8>\x5" -"\xc2\x32\x14\xb7\x83\x38\xe5\xb4v\xf0\x98\x1d\x90\x5nn]\r\xb6k\x1d\xf2)\x8eY{*\xbe" -"\x1d\x81~\x18\xbe\xb0V\xe6^\xdb\x42\x34\x34-\x96\x0G\xb\x14 \xc9!\x4\x19\xd8\x34" -"\xe4\x31\xb8/X`\x8c\x87\xac\x36\x1a\x2\xd0\xf1\xfeKG\n=q\xe0\xd2\x1b\xb8~\x10#\xd4" -"(\xe2=Yl\xb9\xe1\xa2\x18\x44\x3\xa1n6\xe6\x44\xbc\xcf\x9b\xbd\xe2r\x90HPW\xe6('(" -">s\x80\xafxk\xf3\x95\xb3\x96\x1b\xa5\xea\x46\x9c\x31Wc\xfaY\xe0\xf1v\xef\x81\x98" -"_8\xb8\x82\xdeV\xa7M\x12\x8e%m\x1b\x89\x93\x97(\xe5Z\x92\xab\xa2\x1akxD\xfa\xc1\xba" -"{\xbd\xd8\xb3J\x18\x19J)\x84\xb0\x0\x38\xf\xe9\xf6r\xe8>\xfd\xbf'o\xe7\x97\xa3%\x81" -"[\xf%\xcc\x95\xc9z\x9d\xac\xf5mX4\x86\x30]|\x9eQ\xa7\xe3\x37\xd1N;\x90\x3\x33\xeb" -"8\xfd\x93\xa9\x95\x87\xda#A\xb1\xc\x5\x9cq\xce\x8\xf\xe7S<\xf\x5\x9f\xa4\xeV\n\xf9" -"\xc4\xa4\x1aK\xe6\xfb\x45\x84o\xf8\xf7\x81\x65\xe1\xbJ\xd4\xf&K\xcfU\x96\xa1\xe8" -"\xef\x8c\xb6\xeaK\x1a:\\i\x5\x9a\xb1V8Cg\x9e\xcb%\x11\xa9\xe\x88\x98\xf5\x42\x95" -"d\x9c\xb7='w`\xd8\xd0J\xba\xcc{\xccnwz\x5\x30\xe2\x6|\xcb\xc0\x86s\xf9\xc8\xc1x\xf9" -"\xd6r\xac\x8a\x15\xe5\x36\x7f\xcVQ\xb5>u\xe0\xcf\xa5|\x93\x17\x46\xae\x1ag\x9c$m" -"|\x94\x17\xf1\xcd\x89\xdd\xdb\xd1\x17Q\x83\x36~{\x9R\xdcK" -"\xc2v|LbG\xb1\xd6\x10>R\xbc{~\xa6)\x8f\x45L]\x97\xacW_\x19\xc1\n\xcd\xffN\x10\xc7" -"\xd3u\\\xfa\xb4 \xc\xacTRi\xff\x1d\x8d\xb0\xd6\x7\xc7\xadG\xf4\r\xdf%z\xb4\xe7\xd0" -"u\x5w\x0<\x13\xe4\x94\x19`\xc3\xdd{\x7t\xdd\xac\x18\xe8\xab\xaf\x8fS\xe0<\xbe\xf6" -"\xd5{D\xf2L\xf8!\x1L\x6\x42x\xfdQ\xb3\x42u\x93\xd1v\x94\xb4\xab\xce\x81\xf4\x9c\xbb" -"\x98LXx\xcd\xf0\xc3\x8d\x1e\xd7\xfd\x99\xb0\xb9\xa3\xbd\x8d\x8f\xf6!\x95\x88\xb3" -"\xb8\xfaY\xd0\xcd\xd1\xd9\xb2\xf6Q\"\xab\x45\xe4\x8f\x17WF{\x92\x4\x92\x61@\xe3\xc3" -"P\xc5\xa9'\xa2\xe7\x0\x17\x30S\xec\x35\xd3\xf1\xda-rXqL\x97\xfa\xa8W\xf0\x89\x89" -"\x17\xbd\x94\x62\\m\x1e-w\x13\x8e\xfc\xaa\xafQ{\x17\xfe\x18z\"\x12\xc2J\x88\x1a," -"jd}\xef\x63v\xed\x80\xae\x41u\xc5\xee\x80\x92\x1f\x0\x19\x95\xb4NI\xf0\xd3=\xd9\x7" -"Z\xcf\x33\xbb\x3g\x1c\xb\xcc\x34\xadW\x84\xad\x1c\xdf\xed:m\x9b\xa1\x3\xb3\xdd\xc1" -"\xcc-\xe7M\xbbWj\x2wqRu!\x8c\xd1\x9c\xa8\x89\x92\x9\x12Rf\xd8\xbf\x12\x86\xf8\x81" -"\xdc\xc2\xc3\x83t\x9d\x1ev\x8dg\xf@\x99\xf7\xde\x95\x9e\xdf\xe8RX1\x83\xc9\x11\x16" -"\x1(\x81\xa5j$\xaa\xf0 \xea\x45\xcd_9f\r\xeb\xce\x30\xac\x1c{\x8c\xfc`8{\x1b\xc>" -"6\x1b\xe6\x12\xfd\xfa\x9f\x1\xb7\xe4\xb4\xa1\x88\x39\xa2\xc7\xe0\xe3\x93\xeb\xc5" -"\xad\x9a\x8aN\xbc\x31jt\xc\x1c)]\x9e\xf5\xf4\xdf\xfa\x6g\xf9X,\xb\xb8\x37\xb1\x42" -"\xc4\xcf\xc6\xb1y\x8e\x94v\xd0\x63\x11\x11\x3;\x8b\xa7Z\x10\xfd\xc8\x0\xe2\xab\x1e" -"\xe\x82\x96\x32\xf8i\xcf\xe4s{\xe9\xe2\x80\x7Y\xee\x8\x31\xdc}\x11\x95\xea\xf8\x5" -"Uw\x19\x81\xddm\xc6`h\x12\xd9,\xb8\xef\x86\x44\x7f_lobm\xe&\\g\xe5*c\x19\x18\x9e" -"\xe3I\xd4\x8eI\xdf\xe6\xa9\xe9\x8fv\xc4\x14\xa1\xe3!z\xe0\xa2\x15\xa1~T\xaaI\x8f" -"N\xcd\xc5\x2\x42\xac\xc7\xe2\x32/c\xbb/\xf2\x18\x9d\x5~sT\xe3*>\xd1\x80\x31\x16\x17" -"k\x9b\x9d\x1)\x93\xf\x91\x9e/\xec(\xb,\x89$\xe4\x9e{\xb7Wh\xa2\xee\x1d\xa8\xad\xbe" -"\xd4\xe3X\x99\x6\xdf\x1b\x92:\xef\x84\xc1\xbd\x32t8\xb7\x31\x1.i\xbb\r\x43\xa1\x84" -",\xb8\x8b\xb5N\xa4Qdw\xf7\x4\xcf\xeb(n>\xa4\x83\x44Z\xd4\xd7\x45\x86\xfc\xf3.\x96" -"\xd3\x66\x90\x10\x84\x36_i:S\xc5\xfbS/\xbf\xe7\xbc\xc\xad\xc4\x4\xc4\x98PB\xd6\x8d" -"\xbb\x90\xa6\xdc\xda\x35\x31\xee\x32MU\x8a!O\x93\\\xd9\xfc\xc9\xa0\xce\xbe\x9b_\xb0" -"2?K8 R\x95\x99\xefH\xee\x6\x8bZ\xce\x85\x0O\xea)\x84\xf0\xa8oZ\xc9\xd5\x61\x63\xbb" -"\xfe\x11\x42\xb7t\x14\x8f\x1e\xb0\xa4\xdc\x89\xc3\x34\x90RS:}\xe6g)\xdb$A\xb8/\x8f" -"s`\x11\x1d\xac\xf6\x92\x93\xc9\xb2\x81\xa0SO>\x9e\x92$\xa7\\I\xa8\x32\xf2\x8b.Ir" -"bGU\x7\xb6\xdd\xfa\x9f\x1\xca\n\x66\x96\xe3\xf5\xac~\xa6\x85\x95\xeb\xa0\xc2\xeb" -"\x8aG\x81?\xf9\x36\xd8J\xc1\xb2>\xcaz\xa2\x86+y<\xcb\xb0\xdf\x9f\xddI1\xbe\xf3T\xce" -"\xc1/\xbfG\x85Y\xfe\xc2\x9f\x81\xad\xf4\x45.\x83\x96>VT\x1d\x31\xf3i\x1c\x93\xa5" -"\xf\xb\xba^\x95R\xc4\xf2\xa2:nS\x6\x7)\x85J=\xd7\x1c\xc4\x30\x8b\x91\x95}\xb1\x9e" -"f\xaa\xa1\x8f\xa6pU\xa9P\xf1\xc2\xcf\xf7\x8a\x3\xbc\x1aX\x8c\xf6$i`h\x6\x87\x19\xaf" -"\xb1\x0\x1c\x45\x81\xee\x7!\x13\x88-\x90R\xb2\x1e\x35]@\x1e\xd8\xcd$\xd0g\xb9\x9e" -"ak\xdaZ\nZ\x93\x36\xfcI\x96\x32\xb7\x9f\xf2\xfd\r\xef\xb0\x96\xef\x46\xb7^-N\xfH" -"\xda\xea#\x97\x19\xfe\xc4\xd9\xa2\x98\x18\xf5\x87_\xc5\x4\x1a\x9e\xdb\xd2l\xaf\n" -"\xce\x14\xcc\x80\xbaI\xbb\xa5\x9e\x91\x8e\xb3\xd8\xf1\xe5\x41\xaa\x16\x2\x65\x85" -"\xa2\xf7-\xf7\xd8\x35\x41\x81m\xe4i\x81\xfb>\xfd\xc\x30\xe4X\xcf\xad\x4\xc7\x94!" -"\xab|I%\xe2:\xea\x7\xf9\xf0\x18\x43\x1cy\x0\x2Ym&\xbd\x96\x63\xb5\x1bi\x9d\xf5>H" -"\x82\xcb\xc3N\xde\x88\xebU\x4[\x88\x9b`b\xe3_\xd1\xe0\x18\xbc\xe7\x85\x15{\x85\xec" -";\x9c\xa6\xc8]K\x16#\x82u8[\x82\x85\xdb\x1-\x8f\xb7\xc9\xf5\xb9\x46\xa4\x1dz\xf\xb8" -"x\xffr\xc3\x96\x83\x14M\x8a\x0|\xff\x63\x1b\x43t\x8f-_\xc6\x90\x30\xf\x9b\xc0\xc8" -"7\x0k\x92\xec\xeb\xe0`^\x8c:J@\xe\x18\xae\x89\x97\xd1\xb4_\xee\x10\x6\x8e$|d|\xf8" -",m\xfb\xe5\xe8\x81\xd5\x11\xff\xa6\x87\xb7\xae\xb7\x85\x46\xbf\xd0}_~\xc2\x42\xdc" -"\xefI0\xd8\xaa\xad\x8c\x61R\xb6\x64*\xac\x32Yc\xfd\x14\x7f#k\xb8P\xa9\x96\x65s\x9d" -"\x6\xcd\xbd|\xa7\x9aR}\xcf\x46\x1e\x33\xf2+\xc9\xc5\xdb\x0\xda+\xd3\xdd\xdd\x8c\x99" -"\xd9\x97\x93\xbc\x98(*\xa8\x87/\xf9l9B\x85\xd8-\x94\x19\xebx\xb6\xae\x37\xa5\xf5" -"\x19\x39w\x0\xf7]bJ\x9\xbd%[Wn\x95Z2>xN\x8f\xc3\x11\x31\xf0\x3\xb0\xe3\x2JOX\xfe" -"\xf2\xa6\xc0\x43yb\x1\xfc\x42T\x82\xe1\x15^\"\x9d\x1b-C\xef{\r\"2+\"\xef\\\x9a\x1b" -"\xe0&\xa1\xc3\xd3u\xed\xaf\xf9\x95\x97\xe1\xe5GyR\xa4\xe8\xd2\xac\xf5\xd0\x14\xbc" -"\x0\xdc*'/\xa6+i\x83\xe2}\"\x88\x81\xe2\xef+\x8b\x95\xa6\x81\xcb\xe9\xc_\xde\x16" -"3\x1c\x85\"/\xe2\xa1o\n<0\x0\xa6>.!fl\xc\x11\x9f\x8a\xf8\x9aT=7\x97pi\xa5\xac\xf1" -"Uc$\xf0R\x4\xce\x8c\xadP\xffO\xb6\x30\xd9\xcb\xbf\xc3$\xde\xdaXJ\xa5j\x99\xd3\xa7" -"o\xf5[\xdc,.\xa3\xa0!6\x1c\xcdJ\x83\xc7\xa5\xe2v\x8d!\xf\xa6\xde\x88\x9f\xd4\x8a" -"9\xd6y\xc9N\xc3\xc9\x9a\x8d\x33\xff\x11\x37}\xa7\xf6\xf1\xb7\x1a*\x5\xb3\x2\xec\xde" -"\x95O&w?9\xac\x88\x15\x42\xf0\xd0\x96\x9c\x39\x95\xc3Q\x9a\x8e\xf7\xb\x42 \xd8k\xf0" -"\x1b\xee\xcc\x64\x62\x85^{hn\x1a\xff\x1c\xa9\x1f\xb8\xfd\x8bJi\xe1\xe\xe0\xc2\xad" -"\x94\xad\xd4\x44IPo\x9bn\xf4\x36\x41\xf2\x2n\xffn`\\g\x5`\xc2\xb7G\x6\xfb\x94\x9a" -"\xa7\xe8\xccj-\rb\x7\xe4W\xe7\xfd\x87\xec\x1b\x90\x92\xdch\xb9\x14\x39G\xcc\x8e\xd1" -"J\xfd\xdc\xbf\x8f\xdd\xa2(\xa7hG\xf9h\x2\xe5\x61\xf6|\xee\xfd\xe4Z\xe5\x87g9\x83" -"\xfc\x4\xc9gD\xdb\xaa\x83\xf2\xdc\x83\x8d\x63\x39\x43\xc7]\xcb\x9e\x64\x10GN\xb2" -"{4\x8f&\xe5\x5\xf0\xab\x90\x87\x89@\xe8\x46\xc5\xe9\xf3\xc5\xfe\x8c\x35X\xc3#k\x1b" -"\x88\xc4\x5qiI\xb8PhA\xca\xbe\x17\x17GK\xb7\xc3\r\xb9\x1c\xde\xe3;\xf\x84H\x11v/" -"\xae\xc5\x35\xbd\xcf\x84\xc1\xc7G\xce\xf9\xb1\xfa\x61\xd2\xaf\xb5\xa8\x13\x35\xbc" -"B\xc0j\x94\xd7\xd5\x9b~\xdeU\xbc\xf6\xf9\x86z\xee\x10uU\xcd\xd0\x84\xb7hL,\x87\x8" -"tu\xa3\x9a\x9d\xa6\x34{\xe2\x81\xceV5\xa4\xd0xe\xba\x98\xce&\xc1\x46[\x1a\xb0\x34" -"?I\xff\x37\xb4\xd0\xca\x9f;\xb6\x93\xd7\x8d\xc3\xb2\x19%\xcb\x99j\x3\x8d\xcc\x17" -"%'\xfeW\xc0t`\xef\x39\xc0}C\x96\xe7\xfa\x97\r\x9f\"\xab\xd2\x1a\x9cyKd\xad\x96v," -"t(\xf5\x9a\x87W\xc3mlO\xfb#!a\x95\xa0L*,.{\x10\xefq\x93\x93\x15\x44\xd7\x82\xfe\xe4" -"\xb9\x1e\x1\x11\x9cUS\xbb\xc6%\"p\xa8\xd8\xc5m\xd6-D\x8fZ\xd8\xdci\xcc\xb4^\x1f\x17" -"\xf0\xaa\x1e\x44Q)\xdd\x0\xf0\x0\x0[#\xd3\x8d\xe9:;\xe5ZL\x4\x19G\xf3kNE6\xe3\x7" -"\xd0\x18\x5S\xf9.F\xb7\x43\x88\x1c\xb5\xd5\x38lH\xc7\xd5\xf8L+\xcd\x6\xb9\xc5\x1" -"\xf7\x8c~\xe6\x1f\xa2\x35\x16y\x1f\xcfM\xb2x\xafh\x8a.`\x10\xa5\x66\x92\xad\x92\x0" -"\x84\x97H~\xdf\xe4\xbd_\xa0\x83\xfaTA8\xb2\ri@\x2\x8\x87\xe3]F\xe0\x93\xb7\x1fz\x4" -"\xa6t`\xdc\x81\x16\xb4\xd4\x83\x96%\xd7\xcaiY\xd6\x83\x1c\xd9?\x81\xacN\xa2p\x90" -"6\xdds\x83\x64\xfd\xe7\x11\x13\xbf\"\xeb\xf1=\xfe\x16\x42\xe5\x64p\x1eo\xf\xfeu\x11" -"\xed\xf0?\xe4H\xc2\xb2\x8c\x64\xfb}T\xb9L\xa5v\xe4\x81\xfaV\xb2\xb1\x8a\xf1\xcq\xf6" -"\x99\xb6\xbf\xd4tY\xcd\xe1\x86\x9d\xf\xd3\x6\xbfH\x9aoB\xe5\xb2\xf0\\\xcfU\xbbk\x95" -"&\x97=\x19\xcb\x13L\xa7\xf1?\x1d\xb3qo\x8c\xc2\x17s\xa8\x32V\x8c\x16%\xb\\\xdb\x16" -"\xdf$\xbf\x81\xd4\x9f[7\x1\x8b\xd3\x10&.\xa7\x7\x81\x7\x86\x8a\xb0!l\xec\x83\xce" -"\xfc\xab\x1e\x9f,fZ1X\\\xa0M\xc0\x18y\xca\xa7\x9a\xaaZ\xb2\x1\xb5\x16\xf7\x5+\x1" -"\xb1k\xeeV\x6\x9\x83\x93\xb0\xe5\xd9\xf9\xe5\xe3\xf4\xeb \xf6<\x95\x8eym\xf4\x1c" -"\xf2\x88\x39\xf5\xc6*\x4\x31\x64\x87\x45\xd7\x83{Q\x9f:\xa3k\xc6\xc0\x8e\xf0@\xcc" -"\xf5=\x9bm\x8c\xc}\x1a\x84\xd7\x7\xecW\xa3\xc6\xac\x9a\x62\xab\x37%\x1a\x1\xa5\xed" -"@\xfd\xeco[\xe6\xe3Lj\x91\xd0X1\x94\x39w\x8a.\xe5\xd0\x36>.\x1f\x33\x46<32}\x5\xff" -"\xc0\xcb\xf0\x8d[\xc4W\xc7#\x4H\x97/\xb9\xb4\xd0\xd7\x82\xba}\xbf\x10\xd3\xff\xef" -"\x8b\xf5#n\xc1mM\xd6\xd0\xd8p\xd9\xd5\xeb\\\x64\xc9\xa4jOX=O\x83\x1f\xeet\xb0\xe5" -"\xb3:\x9\xab\xfd\x44\x44\x92\x9b\xd8\xf6\x38\xcdr\xea\xb9\x9c\xf2\xe9U\x1d\xf4'h" -"9d\xa5\x92\xe4\x9d\x18o(RX\xc5\xd5\xf6!\x96\xa9\x85\x32\x42\x1ds\xe3I_\x82i_\xee" -"\xc6\xe1\x95,V-Tk(a\x8f\xfa\xee\xbe\xff\x3\xa5\x7fM\x85P!\xf8[\xc{\xc3\x7f\xccm\xa9" -"\xae\xca\x9\x9b\x64k\x99\xd4\x18\x96\x9\xd3\xff-VB/\x8c\x37\xe9v@)>\xc7\xc9\xe\x33" -"\x80\x88x6\xf4\x93\x8f\xbfI\\\xac\x14\xfb\xa5\x64\x8d\x89(-\x8dI\xd9\x1a\xf7>\xd3" -"e\x81\x13\x9d\x8b\xd4%Q\xe2\x63\xe8\x30\xea\xf6\xb3>\xa0\x98\xc2\xc3*\xde\xa2\x19\xab*\xac\x8b\x9?@\x0\x9\x95S\x9d" -"\x12v\xd5\xf2\xef\x84\xcc\xd0\x99\xb7\x1f\xe4&\x9b\xdb\xdbj\x8dY\xc8o}.?\xbc\xcf" -"\x87s\xd0\xfa\xe9v@\xbc\x1a\xd4<\xb4\xb9\x92\xbf\xad\xfb\x9\xdb\xd0\xca\xae\xb8\xcd" -"\x9d\xa2\x64\x18|O\x97\x30\xe\x9al\x9d\xee\xd5RTy\xe6\x5\xc6Z\xe3\x36\xcb\xbd\xf4" -"\xe5\xd7\xf7\x9a\xd0\x98\xf9w(^\x6Uy\xb7H\xfe\xaa\x97\xf2\xa7S\xe1\xf9\x62\xfc\xab" -"h\xd7+\xaa\x8e\xe4\xff\x66\x91\xc2>1\xbc\xf>\x98\x1a\x96\xfb\x44\x4\x4\x85j\xe1\xab" -"2\xa7 [\x17\xd4\x11\xd8\xf2\x1c\x8c\x93\xb7\x4\xd0~\xc5\x94\x42*\xbc\x36\x8c\xda" -"+\x16\x10\xcej\x97?Dt\xe1+x\xb5\x32\x66g\x97\xf5u]&\x97r\xc9\xf5@\xb;\xfclX9]8R~" -",\xcc\xf2\x9bV\x12?}\xce\xf3\xbd\xe5\xdc\x1d\xfc[\x2\x93\xbb\x12P\x85\xb1\xd2\xd9" -")\xbc>\xe8OO\xadW\x1aI\x91\xc3\xde\xe0?-\xb3\xa3\x9~R\xb1\xa7\xd5\xc7<\xcb\x61H\xea" -"\xc6.\x8e\x36\xde\x9aq\xc5v8\xc6\xe4\xd5\xd9\xde\xd1\x81t\xe8\xc3\x90\xe5\xbJ[\x91" -"<\x7N\xea\xeb\xe3\x90\xb2\x14\xb3\xa6\x8f\x2\x86+\x9a)m\xb4\xb4\x9v\x96I\xe5\x1d" -"s\x8c\xbb\xdf\xb7p.\x15\xc7<*\xfck\xc3|\xe1Qq\xf4\xe8\"\xcf \xef\xe5]\x9f\x6\x1a" -"\xa4>d\x89\x89\x62\x8f\xf7\x9e\x65\x93#\x90\xcb\xb1]\x8e\x62\x13\x33\xb1\x8b\x11" -"\xc3\xbd\xf9o\x84\x1dt4\xe0\x1a\xd5\x1\xfe\xa9\x64\xa7[$\x8a\x35\xcd\x9d\xf9\xa3" -"~H\xa1\xe5\xa0\x9c\x62K\x93\xce\x44\xf0\x4/\xa0\r\x7f\x9e\xe8\x9b\x9fz\xb7\x85\xe9" -"\xc7\x18\xcfnr(\xf7\x43'\x1c,\x9b\xba\x17\xe5 \x8b\x92\xe\x44\xe7\x65\xd9\x9d\x86" -"e\xe\xb4T\xb0\xfa\xaa\x11'S\xaa\x1b\xd3\xa2\x42\x39\xe9\xc5\xfcG\xee\xb1Tz\xc9\xd2" -"71\xb8\xdcH\xb9px0\xda\xec`\xc8\xd3y\xb\xba\x11 \xf7vN\xfa\xc5\x42\xcf\xfb\xcd\\" -"\x5\xf9Q\xb'\xb2SKpN\xcd\x36\xc8\xb0\x41\xfdI\xa9h\x81\x30/\xff[\x1\x63\xa2\xdd\x9" -"\xc7Q\xd6\xd6\xaf\xea\x91p\xa4\xf4\xc4\xab\x8d\x46\xe6/v?\xe1\xbd\xa5\x1d\xd1\xce" -"J'\xe7r\xf3\xa2\x86\x91U\xf7\x62\xff&\xb7\xaao\xcf\xa4\xf1).V\xf0:\xab\x63\"\xbf" -"\x86~w\x10\xc3MC\xb5\xd8[E\xaah\x1J\xd7\x87\x9e\xed\x5\x1b\x19\x33\xe4\x91In>&\xd9" -"\xaa\x8b\x80\xa0{\xf2\xb9O\x10w\xe8J\x97&\xf0\x81\x99\x88}f\xdez0{\xf3<0\xdd\x9c" -"\xf3\xda\x18\x80\x88\xc0;+\xad\x9\xa2\x17k\x11\r\xb2\xc8h\xb5=\xa9\xa6l\x85s{\xa6" -"l\x93\xc5\x8a%\x98`\xe2\x94\xad\x1\x91\xe3\xa7,s\xf4\xb\xb\xd9\x86\x99\xaa\x8\xda" -"\xf0\x35\x87\xb7\x8f\x39\x1f:C\x13\xc5\x8d\x9f)\xb5t\x9b\xdd\xcb\xf8\xa3\x17\xfd\xa0" -"\xae\xfd\x95+\xb1\x85\x45\x61\xf\xfa\xd3\xac\x14=5\x1b\x8d\xb3\xf6\x62\x93\x37^\xe" -"P#_\r\x4\x66\x93!\x81\xd3w\xed\xd3*_\xf\xfaN\"\xb5\xa0\xcbO4=\x9a~J4.\x9d\x9\xdf" -"\xf6\xc6\x97\x63\xc\xd3\x97\x18\x2\xc2w\xa5Y\xb\x8c\xa9K\xdek8DlyM\x7+\xbc\xcbrM" -"[\xc2\x8\xee\xf1\xb0\x18\xd7\x39\x37;\xb9\x10\xd6h\x88,\xaaw\x9c-h`\x81\xdej&\x6" -"A{T\xd7\xc2\xe\xe\x7fr&H\xd8\x93\xe4\xed\xba\xe8\xf0\rjm\xa3q/\x91\xae\x86\xcum\x11" -"'\xd1\x33\xab\x82\x8e\x9d\x80\x2;P\xb1\x62\xc5\xa1\xc5\xcd\xf7\xc\xcb?\xdd~\xa0`" -"\xed \x83\x8b\xe1\xe5\xc@\x94\xc9\xe7\x9e\x1a\x1\x87\xcd\xf7\x80\xca\xf4ZrYd\xf0" -"\x4%>\x3L[\xe4k\xbf\x89\xd9\x46\x31\xf1\xa3;\xaa\x35\xb8O\xa2\xa9\xd0\x84\x81\xc6" -"gA&\xcd\x96\xed\x5\xdc\xe4\x8b\xda\x6\x9d\x90-h6\xd5\xdf\xbap\x1d\xc0\xf9\x8a\x86" -">d\xf0\xe3\x12\x14]\x8d\xc0\xb7\x7f%\xb4:\xecr\x9a\x12\x43\xb4[\x8\xca\"\x8d\xd6" -"\x10\x1c\xaa*\xc5\xad\xcc\x8e\xff\x84\xa4\xca?%Av\xc2\xccq\x1e\xe6\xc2s\x83]\xf\xd3" -"R\x8e\xca*\x97k\x88\xe5\x1f\xe3G\xfd\xb6\xf\x32\x37\xb\x66\xd3\x38\x93\x1d\x65\x81" -"c\xe\xd5\x86\xf3I\xc6\x38\x96\xc\x31\xae\x42\x4\xe8\x95!\xa9n\x12\x19\xe6\x96\xb9" -"\x13\xde\xb2\xaa\xb7\xa3\xb0\"\xd0o4\xfd\xfc\xb8\x10\xa0N`\xa4\xfe\xbe(L/\x6>\n\xe9" -"\xed\xf8w\x4\x92\x1c\xcf\xa1\x93\xbd\xc9\x12\xb7G\xe1\x35p\x6\x62#\xa4\x9f\x1fn*" -"\xf0\xd4\xd6]\xa0L\xa8v\xffzF/\xfc\x9c\xb\xa2\xccT\\;\xd3m\xbev/2\xb2\xd6\xbeXg\xc5" -"\x9fG\x91\x95\xc9$@\xdc\x16P\x98\xb7N\xa5\xc3\xad\x93\xcd\xf2\xd4\x10\xb0L\x16\xbc" -"x\x1\xe7\x95oNQ\x7\x45\x7\x87\xaaY$\x93\x17\x1c\x36(\xe6\xb8\xf4\x9dO\x84)\xeb\x98" -"\xdcR\xef\x2_\x0\x13\x87\xbc\x1ap\x93\xf7\xa9\x9f\x10\xb5\xd2\xd7\xdd\x8b\xbb\x39" -";\xf6\xe5o\x8\xf4\xf7\xfa\x1a\x34?\"\rZ\x1e\xaeqh\xc7MA\xbe\x1d\xc1\xa8;\xd6[r\xb9" -"\x82\xf4\xf7\xb3O$\xf9\x7f\x9e\xc9\xa9\x10\x11\x6@1\xfa\xcf\xf2\xa1I!\xa3 $8_N\x6" -"\x1c\xd0}\x15.t\x1b\xf9qV\xd9Q\xa3\x42H\x8f\xa7\xf5\xef\x93L\xca\xd1>'S\xa0\xabz" -"\x1fV\\/\x7fk4\x9d\xf0;\xbc%\xbb\xd9r\xa9\xad\xf8\x9\xbb\\PH\xa8\xcc\xef\x92\x97" -"\xb2\xed\x33$\xd1\x88g\xf2\x93\xcc\x66\xe8\x8b:9\xd1\x7\xb6\x10\xdf\xe7\x9a;N\x83" -"\xa9m=R\xa1\x7f\xe8\xa6,\x9f\xdd'\x11\x30\x14\x83\x66\x94,\x9c\xe5uX\xd0#\xda_u\x1" -"1\x9e\xbf\xa3=\xe9\xe6\xd1\xe7m| \xdb\x8a\x9\xb6W\x83\x9d\xa9\x9f=\x81\x43\xf1\xee" -"bS\xa3)\\\x96Q\xfa\x43\x66Tx\x93\xc2\xdcz\xbc\xbfK\xb7`\x9d\xe5\xd0\x1\xe0\xa3m\x9f" -"\xfb\xe0\x1f}\x9\x3\xb3 \x8a\xe8T~._\x14\xec\x1a\xf4\xc2S\\\xa8\xf4\xea\x37\xe3\xf3" -"\xce\x17,z\x1e\x83\x8\x99[\x1c\xc2>n\x81\x19\x2\x46\xbc\xabnu[\xf8h\xd4I\xbb\x2\xa2" -"\xaa\x87\xc4L\x9c\xc0\xf5q\xad\xc7%G\xce\xec\xbe\x10K\xb2t\xb8\xac\x16\xdc\xb7]_" -"E\x8d\x35\x64\x66\xb9!\xac\xde\xea\xe3\x84\xe2\xeb\x1d\xf6\xef\x39;A\xb9t\x7f\nO" -"\xae\xb4\xaf\x19(\xd9\xado\xb7\xe0o\xdc\x62\x1eLo\xc9\x8c\xfb\x43\xf8\x85\x84\xbd" -"U\xd9\xb9|\xc9T\x90\x93\xed\xe5\x86\x91!a\x93\x11\x62\xb1\xb1\xd5-\x4\x43&\r\xab" -"\xa0*\xf2\xb4\x43!\x0\xd5PeF\x1=\xa7\x3W?\xa8\x1\x36\x85\xccy\x8c\xe5\x1\x96\x0\x93" -"\xde\xd7\x13\xff\xcc\xf8\x9c\xa2\xb9\x10\x63\x90\x19\x8c)\xa0\x8\x64\x10\x8c\xdc" -"\xc1\x98J\x8b\xabS\x91\x90(\xc0\x1b&\xec\xc7\x92^8\xcb\xe6\xcc\xa8\x97\x8e\xe2\x1c" -"+\x6\xe7\xb3\xe4\x8f\xba\x97\x8e*}\x18nV<\x8\x8f\x84\xaa#\x17\x8b`\xe4r\x9e\xe8}" -"g\xb1\x9\x1f;isgl\x1c\xbf\xe6S\xe\xb7s\xc6.,$\x97\x1J\xb0\xe8\xb7\x1a\x1fN\x86\xa3" -"x\xaa&Y\x15\x11\xbe\xe3\xcf=d\xc9HHX.\x13T\xe1`[dW\x82?,^d\n\xd3\x80)F\xbb.~\x8e" -"YN\x8c\x4\xb4\x30\xc2\x38]\xd4\x7\x46\xce\x85\x34\xf5\x8\x42\xe7Mq\x15\xf3\xdb\xc" -"r\xd1\xc9\xc6\x7\xc6W;\x9J\xebs\xb7\xa7\x98v\xcf\xfc>/\x8c\x9f\xea\xaa\x7\xd3\xbf" -"\xce\x5\xb6\x1fwI\xa8y;\xe9\xc\xcc\xec\xa2\xd7\x7\x7f%\xe8\x99\xd3\x33\x1f\xe1\x61" -"\xa7\xe8l\x84$\x95\xd5\x84\xc6\xe4\xa0\x88\xb)Q\xd8\xa1;\x88\xc4g \x80\xa0\xb1\xbe" -"6\xbfG\xc3\xac\xe7(\x8c\xfe\x41\xa8\xc1\xba\xa6\xf0\x81J\x94\x7f\xbdk:\xa7+ls\xa8" -"\xc5x\xcaQ\xcc\xc9o#R1lF{\xb9`\xe9\x81\xf2\xb6H[\xfb\x44\xb5w\xe7\x1e\xfd\xa1nt\x5" -"\x95K\xc7\xc9\xf0u\x9fZ\x9f\x1e\xbc\xd2\xfa\x9c\xc9\x64\x8dX1\xa6\x88\x87\xf4\x1b" -"\x15\x8\x1a L$\xb4\xb9\x92\xa2\x31\xde\xf9\xe6\x98\xd4\xc3\xa2[oTt\xf5\xbej`\x1f" -"-3zX\xa0\xd2\x1f\xf3\x7f\xd9\x1e\xb8m\x1ds\x88\x93\xa0:i\xf0\xcdt?a\x1c\xdf\xfei" -"\xdb,n\xd0\xe4\x61\x1dV\xf8\x3\xbb\r\xc0n\x7f\xe8Z089a'\x7\x64{\x1b\xe9\xfa\xf8\xd6" -"\x84\x12,\xa9\xe5\xcb\x8b\xde)6\xd3\xf4\xff%M1R\x9du8\xbb\xd4\xd3U9H\x9f\x9es\x16" -"\xf2\x42\x14\xb9\x96\xbc\xdc\xf1\x81\x8et\x9aq\xcf\xe\x88\x45\xaa\x1e*X\xaa\x62\xa4" -"\x8e\x2\xba\x45\x64\x62] \xaa\"\xe\xe7\x19`\x85!\xd7\xd7\xa7\xfc\xa0\xbd\x89\x4\xa4" -"\x1\x98\x19\xd3q\xf3\xf5\x9d\x46\xc1\x35N_\xc1\xa6\xe5\xf7\x9b \xcfJ\xca+\xf0\xf2" -"\xdes\xda\x19:o\x9a\xcb\xfe\xbG1\xc4\xbc\xeb\xe6\xd9o\xe8\"\x96]\xe9\x65#\"\x82\xa3" -"\xa1\x30\x36\x1f\x18\x8b:\xab\xda\x95\xa8\xa2y\r\x92@\xbe\x0\x8bjm\xe4\xbb\xfc\xad" -"\xa0[g\x86\xb9\xbb\x8e\r\xfa\xc\x30\x4:;\x7\xed\x46'~\x7\xb9\x80\x84\"\xc8\xed\x16" -"u\x8b\x9c\x39oN\xa9)\xd7ix[,\x95h\xe5p\xa8;\x98\x9b%\xce \xf\x17'\xd4\x1e+p.\x7f" -"\x88\xf1xOL\x83\xfa`\xa7N\xb2k-\xa9Q&\xe5\x8\xedQ\x9a\x61\xcc\x15\x1d\xb6\x80Oa\x82" -"l_\x86\xd8\xfa\x89\xd0nRo\xed\x97\xa0\xdb\x88\xed\xb4\x32\xff\x32\xc1\xac\xc9\xb6" -"\"\xee\xdf`\x10\x81\xaf{\x96<\x9c\xfc\x1d\x13\xe4\xa9\xc7O\xea\n\x1c\x8e=\x86S\xcd" -"\x92\xa9\x44\xd4\xcak\r0f\x19\xaf\xd5\x3Pmws-e\x14\xf6\x4\xbe\x46\x10\xc2V\x9\x31" -"\xbd\xe0\xb4\x9\x39\xbc\x1d\x12k\xe\x97\xf7*\xe1\xb4\xa9%!#\xb5Oz'\xe0\xcf\xa4\x42" -"[EFRo\xd7\x41\xcaw\x95+\x10\xd1>\n\xc2\xe3 \x6\xa9\x3\x80\x8f\xf0\xcd\x1?\x93\x62" -"8\xc7L\xc7_\xd9\x15$LV\xa8\x41/7\xf0\x13H@4v\x99P\x8do=\x7f\x32\x3\xa2[|p\x10\x7" -"\x19X,\xd5\x88Y\xe\xe3K:\xb1>%[a:m\x0\x38j\x1\x4\xcc^\xd2\xc6\x46\xf0\x9a\x88\x88" -"\x8d\x37Qe\x1dVF\xc5\"z<\x80\xe8\xda\x1b\n\x33\x11!\xdd$)\xf1\xf4w]0VM\xffG\xd0\x1b" -"\xbe,lr\xceM\x1f\xd9\xa2\x7|\x4\xd2\xb0'K\x89\x16\xf6\xa9\xd1\xa4\xa6\x96JSOG\xcf" -"$\x1dZ\x8e\x34\xb2?\x85\xbe\x9a\xcf\xfc/\xea\x96\x1f'u9\xf2\x15\xf8r\x8dg\x88\xf6" -"{\xea\xf4U\x2\x83\x9b\xcf#\xd8v<9I5/\x0\xc5y\xa9\xa4\xfc@\x8e\xc6%\xe3\x10\xda\xe6" -"\x15\x12\xdf\xe6\x84N\x82\xd3j/\x81p\x9e\x1f\x5\xb3\x8a\xe9\xc2\"\xed\x62\xc9\x61" -"\xee\x63Y<\xedz\xafs\xce.\xd3\x66w@\xc7{0\x9b\x93\xee\xfe\x1bK\xa6]HWZf\xbe\x86t" -"=\xc9\xe5\xd3\xc2\xff\x41\x8d\x11\xf7\xf2\x11\xb8n\x82~\xe1\xdf\xc3\x61>t\x98\x3" -"\xf\x7\x5\x5$Sm\x1f\x8a\x94\xdd\xb6i\x8b\xe7\xb9\x63\xc5\\\xb3\xf7Kgl\xd8\x15\xa7" -"\xb3\xdfK\x1a\xe\xa2\xbe\x1b\xb\x9a\x11\xff\xbf\xd5\xb1\xfaIf\x8a\xee\x14\x62\x93" -"\x16\xaf\x43j\x8!\xc2\xb\xee\xf7\xb3H\x8G\x93J\x99\xf6\xd8[h\xf4\xdd\xf8\x85\x9a" -"uN\x0\x94(\xaf\x89\xa9\r\x18R\xc2 \xa6\x7\xff\x8\x6\xe8\x8\x7&\xed\xc9Mi\x1d!KE!" -"\xc1G\xc4':\xeb\xdd\xbbJi~\xf1\x64H\xcd\x9b/\xc9R\x93\x30XX\xde\xcf\xd4\x6\xb8\x9b" -"\x9f?\xda\xe2\xacW\x9e\x80\xcf\x32\x1e\xba\xe5p\x1f\xb2\xf7\xca\xd8\xed\x4\xb4\xa6" -"1\x15\x88mE\xd6\x12\xfi\xae\xf1\xa2\x1d\x80\xad<-5\xd2\x89\x9f\x19\x2$+\x96\xcd\x34" -"\x9e\n\xaa\xda@\xf7\xa1\x12\x82\xb6\xb5+\xdd\x97p\x8eX\xdc^-\"\xd1\x15>_\xa3\xf3" -"\xb3\x0\xbc\xdf\xaf\x98\xde\xc2\xf4\xe3\xc8*\x1c\x85\xf9\x85s_9\x87OUuy\xf4\"\x66" -"N\x7\xcb\xe1\x9d\xa6\x80\xef\xb0\xfc\x82\xc3#\xec\\\x46\x44\xc5\x17\x9\xac\x8dgF" -"\x8\xa8\x4<\x91\xe6\xc7\x98\x8d\x43\xf\x10\xbal\xe1\xfc\x7f\xc0`O\xcd\x8fr8\x95%" -"\n\xec\x36\xcc\x35\xb3\xfa\x14\xfe*\r$\x9]\xcc\x30\xb2\x9?\"\x98\xf5\xf0\xa9vv\xa0" -"\xbe\x66\xc3\xdc\x9a\xda\xcf\xe2\xfc\xfr\x1a \xe9\x45\xaf\xc1\x9ja\x90u\xd5\xe9\xa2" -"d\xc7\x96\xecl\x90\xef\x1a\xee\xa8\xdc\x8\x9b\x44\xff\xc1='\xcb#p\x7\nR\xd4\x41l" -"S\xf3\x64\x39>F\xed\xd7\xed\xe0\x7\x99\x96\xc\xe6\xe0\xd5~I\x9\xe8\x8a\xdd\x64\xbd" -"\xd2\xb0\xeb\xe2\xd7?\xa6\xac\xf8\xb4\x2\x80\xda\xa0\x63~p\\e\xaa\xbdR;\x88\x15\xf2" -"/#\xe9\xff\x81\xe7\x82\x9c~K\xc9\x80\xc9\x14:\xeb\xe1\xa0M\xc0\xd2S9k\xbbrh\xbdZ" -"\xee\xa3V\xb6\x10\xd5\xdc\xee\x3\x13^\x0\xae\x34\x38\x82Q\xf3\x17\x14\xa1\xc4\xe" -"\x18&R\xc4\x8c\xda\"\x11\xa2,\xb6\xf0$\x90\xe6\x9a\x44\xce\xcb\x16\x97T\xc5;\x16" -"\x2\x8d\x35.\x1\x19\xf5\xd5\xfa\xe0\xbd~\xa1\xcd\xa6G\x12\xa6\x14st\xb6\x42\x44\xe2" -"\x1e\x9e\xc9\xf0\xd1\x38\x1a\xd2-[b\x12\xb2l?\x9a\xa5\xf6\x4_%\xdd\x9f^\xb4H\x9e" -"\xa3\x9b\x19\x45\x33\x1a\xc7\x5\x10\xc5u%W\xde!\xd0\xa6\xcf\xc1\xeb\x10\xa9\x8f\xa8" -"g\xb7m\xa6\xe4$\x94i\xf5\x91\xfd\x15M9\xe8\x93\x64\xa4=\xb0\x7\xaa\rz\x91\x1c\xfa" -"\xe6\xce+Uy\x97\xfb\xc4OU\xa2\x7f\x62+\xd7\xb8\xb1\xe\xc9\xf5\xd1\xf&I\xa6\x46\xfd" -"\x96J\xe1\xb1\x11\xb3[F\xa2R\xc4\xde\xe4Nt&\xebW9\xf2N\x8a\x39\x6\x94Y}\xb3\xa1\xfe" -"x\x0\xc9~YU\x83\"\xf0\xe4\x9a\xc\xce*\xd9K\x1e-\x10&\xaf\xa7qr>?R9\x16\xf5^\xd8\x66" -"\xc9\xfbJ/u\x96Q\xc6\x13\xa2\xcf\xf3\x62\x2\x8c\xdf\x9d\x38\xf0]L|`$\xc5\x33\xe9" -"0\xb6K\x9\x9f\xb1\xaf\x4\xb0\x1f_\xb9\xcahg\xe6\xef\xf5Zw,S\x91\x83\x10Y\x98~\x10" -"\xcb\xf9\x87\xe3\xf3x\xe0\x13)\xf7=T\xdc\x4\x84\x17}<<\x6\xf6s\x97\x95_\xf1\xcaN" -"\xf8\xad\x16\x6\xb7\x4U%]c\x1a}n\xb9+\xfd\xba\x14\xa0\xff(\xb2\xac\xe7\xe8\x1a\xd6" -"f\xea\x9b:\xfZk\xa3\xb5\xdf\xe3PD\xfaK=\x8e\xd9V\x0\x9c`\xe9\x8c\xc1\x32\xf2\xe8" -"Ig\xf4\xa9\x8ag\xb3\x36\xd5\xee|\xaf}\xd1\xf7M\x1f\xa0\x86\x19\x94\x13\x61\xfas\x12" -"\xcf\"]\x89\xce\xf9~\x86L\x83i\xea\xfa\xb9M\x97\xf0VU\x5\xd8%\x97+uOg)Yn\xea\x91" -"!\xbu\xdd\x8f\x64S\x82\xac\xe3m\xe6\x8\x19\xa0+;H\xdd\x0\xf5H_\x92\x64\xf9\xfa\x92" -"ms.,&{\xb\xe8\xca\x98Ro\x12O\x97\xef\xdb\x86\x13,^\xf1k\x10\x39\x8\x17/\xc5\x1f(" -"o\xfe\x45\xff%\x35\x12\xe0\x3?\x3\x7f\xf1\x82\xbaSj\x9e\xb2\xdf-\x1d\xb2W\xd9\xc8" -"lF\xe1\xb0\x2\xfb\x32\xacp\xca\x94\x62\xe6\xebH\x99GR\xce\xbc\xe3\x9f\x8\xab\xd4" -"\xf4\xb0\x88\x92\x83\xe5U\x0p!\x85\xa8\x41\xe3(\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30" -"000000000000000000000000000000000000000000000000000000000000\r000000000000000000" -"0000000000000000000000000000000000000000000000\r00000000000000000000000000000000" -"00000000000000000000000000000000\r0000000000000000000000000000000000000000000000" -"000000000000000000\r000000000000000000000000000000000000000000000000000000000000" -"0000\r0000000000000000000000000000000000000000000000000000000000000000\r00000000" -"00000000000000000000000000000000000000000000000000000000\r0000000000000000000000" -"000000000000000000000000000000000000000000\rcleartomark\n\x80\x3" -; -int n022004l_afm_len = 31779; -char* n022004l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusMonL-Bold\n" -"FullName Nimbus Mono L Bold\nFamilyName Nimbus Mono L\nWeight Bold\nItalicAngle " -"0.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineThickness 50\nVersion " -"1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Development\nEncodingSch" -"eme AdobeStandardEncoding\nFontBBox -43 -278 681 871\nCapHeight 583\nXHeight 437" -"\nDescender -205\nAscender 624\nStartCharMetrics 316\nC 32 ; WX 600 ; N space ; " -"B 375 0 375 0 ;\nC 33 ; WX 600 ; N exclam ; B 220 -15 381 638 ;\nC 34 ; WX 600 ;" -" N quotedbl ; B 136 312 464 602 ;\nC 35 ; WX 600 ; N numbersign ; B 62 -92 538 6" -"75 ;\nC 36 ; WX 600 ; N dollar ; B 83 -123 517 684 ;\nC 37 ; WX 600 ; N percent " -"; B 80 -15 521 617 ;\nC 38 ; WX 600 ; N ampersand ; B 75 -14 508 550 ;\nC 39 ; W" -"X 600 ; N quoteright ; B 147 331 351 623 ;\nC 40 ; WX 600 ; N parenleft ; B 264 " -"-153 488 632 ;\nC 41 ; WX 600 ; N parenright ; B 117 -153 341 632 ;\nC 42 ; WX 6" -"00 ; N asterisk ; B 83 208 517 622 ;\nC 43 ; WX 600 ; N plus ; B 42 0 558 560 ;\n" -"C 44 ; WX 600 ; N comma ; B 147 -158 351 134 ;\nC 45 ; WX 600 ; N hyphen ; B 42 " -"229 558 329 ;\nC 46 ; WX 600 ; N period ; B 225 -15 375 117 ;\nC 47 ; WX 600 ; N" -" slash ; B 83 -113 517 695 ;\nC 48 ; WX 600 ; N zero ; B 83 -15 517 638 ;\nC 49 " -"; WX 600 ; N one ; B 83 0 517 638 ;\nC 50 ; WX 600 ; N two ; B 54 0 508 638 ;\nC" -" 51 ; WX 600 ; N three ; B 66 -15 529 638 ;\nC 52 ; WX 600 ; N four ; B 75 0 508" -" 622 ;\nC 53 ; WX 600 ; N five ; B 66 -15 529 622 ;\nC 54 ; WX 600 ; N six ; B 1" -"05 -15 540 638 ;\nC 55 ; WX 600 ; N seven ; B 75 -1 508 622 ;\nC 56 ; WX 600 ; N" -" eight ; B 83 -15 517 638 ;\nC 57 ; WX 600 ; N nine ; B 106 -15 541 638 ;\nC 58 " -"; WX 600 ; N colon ; B 225 -15 375 437 ;\nC 59 ; WX 600 ; N semicolon ; B 147 -1" -"58 351 437 ;\nC 60 ; WX 600 ; N less ; B 42 54 544 501 ;\nC 61 ; WX 600 ; N equa" -"l ; B 42 138 558 422 ;\nC 62 ; WX 600 ; N greater ; B 56 53 558 500 ;\nC 63 ; WX" -" 600 ; N question ; B 104 -15 517 598 ;\nC 64 ; WX 600 ; N at ; B 76 -152 509 62" -"0 ;\nC 65 ; WX 600 ; N A ; B -21 0 621 583 ;\nC 66 ; WX 600 ; N B ; B 13 0 571 5" -"83 ;\nC 67 ; WX 600 ; N C ; B 33 -14 564 597 ;\nC 68 ; WX 600 ; N D ; B 13 0 550" -" 583 ;\nC 69 ; WX 600 ; N E ; B 13 0 550 583 ;\nC 70 ; WX 600 ; N F ; B 13 0 550" -" 583 ;\nC 71 ; WX 600 ; N G ; B 33 -14 592 597 ;\nC 72 ; WX 600 ; N H ; B 23 0 5" -"81 583 ;\nC 73 ; WX 600 ; N I ; B 83 0 517 583 ;\nC 74 ; WX 600 ; N J ; B 54 -14" -" 613 583 ;\nC 75 ; WX 600 ; N K ; B 13 0 602 583 ;\nC 76 ; WX 600 ; N L ; B 33 0" -" 571 583 ;\nC 77 ; WX 600 ; N M ; B -19 0 623 584 ;\nC 78 ; WX 600 ; N N ; B -8 " -"0 592 583 ;\nC 79 ; WX 600 ; N O ; B 21 -14 579 597 ;\nC 80 ; WX 600 ; N P ; B 1" -"3 0 529 583 ;\nC 81 ; WX 600 ; N Q ; B 21 -145 579 597 ;\nC 82 ; WX 600 ; N R ; " -"B 13 0 619 583 ;\nC 83 ; WX 600 ; N S ; B 62 -14 538 597 ;\nC 84 ; WX 600 ; N T " -"; B 42 0 558 583 ;\nC 85 ; WX 600 ; N U ; B 10 -14 590 583 ;\nC 86 ; WX 600 ; N " -"V ; B -21 0 621 583 ;\nC 87 ; WX 600 ; N W ; B -10 0 610 583 ;\nC 88 ; WX 600 ; " -"N X ; B 10 0 590 583 ;\nC 89 ; WX 600 ; N Y ; B 21 0 579 583 ;\nC 90 ; WX 600 ; " -"N Z ; B 73 0 527 583 ;\nC 91 ; WX 600 ; N bracketleft ; B 250 -148 475 627 ;\nC " -"92 ; WX 600 ; N backslash ; B 83 -113 517 695 ;\nC 93 ; WX 600 ; N bracketright " -"; B 125 -148 350 627 ;\nC 94 ; WX 600 ; N asciicircum ; B 83 325 517 652 ;\nC 95" -" ; WX 600 ; N underscore ; B -12 -125 612 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B" -" 249 348 453 602 ;\nC 97 ; WX 600 ; N a ; B 42 -16 571 450 ;\nC 98 ; WX 600 ; N " -"b ; B -8 -14 571 624 ;\nC 99 ; WX 600 ; N c ; B 54 -16 565 450 ;\nC 100 ; WX 600" -" ; N d ; B 33 -14 613 624 ;\nC 101 ; WX 600 ; N e ; B 33 -16 550 450 ;\nC 102 ; " -"WX 600 ; N f ; B 75 0 571 623 ;\nC 103 ; WX 600 ; N g ; B 33 -205 592 451 ;\nC 1" -"04 ; WX 600 ; N h ; B 13 0 581 624 ;\nC 105 ; WX 600 ; N i ; B 62 0 538 623 ;\nC" -" 106 ; WX 600 ; N j ; B 117 -205 488 623 ;\nC 107 ; WX 600 ; N k ; B 33 0 571 62" -"4 ;\nC 108 ; WX 600 ; N l ; B 62 0 538 624 ;\nC 109 ; WX 600 ; N m ; B -19 0 623" -" 450 ;\nC 110 ; WX 600 ; N n ; B 23 0 571 450 ;\nC 111 ; WX 600 ; N o ; B 42 -16" -" 558 450 ;\nC 112 ; WX 600 ; N p ; B -8 -205 571 450 ;\nC 113 ; WX 600 ; N q ; B" -" 33 -205 613 450 ;\nC 114 ; WX 600 ; N r ; B 54 0 571 449 ;\nC 115 ; WX 600 ; N " -"s ; B 73 -16 527 450 ;\nC 116 ; WX 600 ; N t ; B 13 -16 529 591 ;\nC 117 ; WX 60" -"0 ; N u ; B 13 -13 571 437 ;\nC 118 ; WX 600 ; N v ; B 0 0 600 437 ;\nC 119 ; WX" -" 600 ; N w ; B 0 0 600 437 ;\nC 120 ; WX 600 ; N x ; B 21 0 579 437 ;\nC 121 ; W" -"X 600 ; N y ; B 21 -205 579 437 ;\nC 122 ; WX 600 ; N z ; B 85 0 519 437 ;\nC 12" -"3 ; WX 600 ; N braceleft ; B 167 -153 433 623 ;\nC 124 ; WX 600 ; N bar ; B 250 " -"-153 350 622 ;\nC 125 ; WX 600 ; N braceright ; B 167 -153 433 623 ;\nC 126 ; WX" -" 600 ; N asciitilde ; B 62 179 538 385 ;\nC 161 ; WX 600 ; N exclamdown ; B 220 " -"-227 381 426 ;\nC 162 ; WX 600 ; N cent ; B 83 -44 499 661 ;\nC 163 ; WX 600 ; N" -" sterling ; B 33 0 550 598 ;\nC 164 ; WX 600 ; N fraction ; B 21 102 580 500 ;\n" -"C 165 ; WX 600 ; N yen ; B 21 0 579 580 ;\nC 166 ; WX 600 ; N florin ; B 57 -123" -" 548 638 ;\nC 167 ; WX 600 ; N section ; B 36 -170 564 583 ;\nC 168 ; WX 600 ; N" -" currency ; B 73 64 527 519 ;\nC 169 ; WX 600 ; N quotesingle ; B 236 312 364 60" -"2 ;\nC 170 ; WX 600 ; N quotedblleft ; B 98 348 502 602 ;\nC 171 ; WX 600 ; N gu" -"illemotleft ; B 33 20 571 415 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 33 20 342 " -"415 ;\nC 173 ; WX 600 ; N guilsinglright ; B 263 20 571 415 ;\nC 174 ; WX 600 ; " -"N fi ; B -14 0 619 624 ;\nC 175 ; WX 600 ; N fl ; B -17 0 617 623 ;\nC 177 ; WX " -"600 ; N endash ; B 42 229 558 329 ;\nC 178 ; WX 600 ; N dagger ; B 94 -92 506 62" -"2 ;\nC 179 ; WX 600 ; N daggerdbl ; B 94 -92 506 622 ;\nC 180 ; WX 600 ; N perio" -"dcentered ; B 225 214 375 346 ;\nC 182 ; WX 600 ; N paragraph ; B 49 -174 558 58" -"3 ;\nC 183 ; WX 600 ; N bullet ; B 150 154 449 453 ;\nC 184 ; WX 600 ; N quotesi" -"nglbase ; B 147 -158 351 134 ;\nC 185 ; WX 600 ; N quotedblbase ; B 87 -120 491 " -"134 ;\nC 186 ; WX 600 ; N quotedblright ; B 87 348 491 602 ;\nC 187 ; WX 600 ; N" -" guillemotright ; B 33 20 571 415 ;\nC 188 ; WX 600 ; N ellipsis ; B 25 -15 575 " -"117 ;\nC 189 ; WX 600 ; N perthousand ; B 0 0 600 618 ;\nC 191 ; WX 600 ; N ques" -"tiondown ; B 83 -227 496 386 ;\nC 193 ; WX 600 ; N grave ; B 125 496 350 696 ;\n" -"C 194 ; WX 600 ; N acute ; B 250 496 475 696 ;\nC 195 ; WX 600 ; N circumflex ; " -"B 125 497 476 696 ;\nC 196 ; WX 600 ; N tilde ; B 115 523 485 656 ;\nC 197 ; WX " -"600 ; N macron ; B 125 546 475 626 ;\nC 198 ; WX 600 ; N breve ; B 125 503 475 6" -"87 ;\nC 199 ; WX 600 ; N dotaccent ; B 240 534 360 654 ;\nC 200 ; WX 600 ; N die" -"resis ; B 136 534 464 654 ;\nC 202 ; WX 600 ; N ring ; B 177 486 423 727 ;\nC 20" -"3 ; WX 600 ; N cedilla ; B 180 -229 407 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B" -" 125 496 475 694 ;\nC 206 ; WX 600 ; N ogonek ; B 250 -208 463 0 ;\nC 207 ; WX 6" -"00 ; N caron ; B 125 497 476 696 ;\nC 208 ; WX 600 ; N emdash ; B -29 229 629 32" -"9 ;\nC 225 ; WX 600 ; N AE ; B -20 0 614 583 ;\nC 227 ; WX 600 ; N ordfeminine ;" -" B 118 182 489 595 ;\nC 232 ; WX 600 ; N Lslash ; B 12 0 571 583 ;\nC 233 ; WX 6" -"00 ; N Oslash ; B 9 -70 590 638 ;\nC 234 ; WX 600 ; N OE ; B -20 0 612 583 ;\nC " -"235 ; WX 600 ; N ordmasculine ; B 122 182 480 595 ;\nC 241 ; WX 600 ; N ae ; B -" -"13 -16 612 450 ;\nC 245 ; WX 600 ; N dotlessi ; B 62 0 538 437 ;\nC 248 ; WX 600" -" ; N lslash ; B 62 0 538 624 ;\nC 249 ; WX 600 ; N oslash ; B 23 -70 573 494 ;\n" -"C 250 ; WX 600 ; N oe ; B -11 -16 613 450 ;\nC 251 ; WX 600 ; N germandbls ; B 1" -"3 -16 529 623 ;\nC -1 ; WX 600 ; N Udieresis ; B 10 -14 590 798 ;\nC -1 ; WX 600" -" ; N Uacute ; B 10 -14 590 839 ;\nC -1 ; WX 600 ; N Scedilla ; B 62 -229 538 597" -" ;\nC -1 ; WX 600 ; N Tcaron ; B 42 0 558 839 ;\nC -1 ; WX 600 ; N Scaron ; B 62" -" -14 538 839 ;\nC -1 ; WX 600 ; N Rcaron ; B 13 0 619 839 ;\nC -1 ; WX 600 ; N R" -"acute ; B 13 0 619 839 ;\nC -1 ; WX 600 ; N Sacute ; B 62 -14 538 839 ;\nC -1 ; " -"WX 600 ; N Otilde ; B 21 -14 579 799 ;\nC -1 ; WX 600 ; N ucircumflex ; B 13 -13" -" 571 696 ;\nC -1 ; WX 600 ; N Ohungarumlaut ; B 21 -14 579 838 ;\nC -1 ; WX 600 " -"; N Uhungarumlaut ; B 10 -14 590 838 ;\nC -1 ; WX 600 ; N Yacute ; B 21 0 579 83" -"9 ;\nC -1 ; WX 600 ; N Eth ; B 0 0 550 583 ;\nC -1 ; WX 600 ; N Dcroat ; B 0 0 5" -"50 583 ;\nC -1 ; WX 600 ; N Zacute ; B 73 0 527 839 ;\nC -1 ; WX 600 ; N Uring ;" -" B 10 -14 590 871 ;\nC -1 ; WX 600 ; N gbreve ; B 33 -205 592 687 ;\nC -1 ; WX 6" -"00 ; N eogonek ; B 33 -208 550 450 ;\nC -1 ; WX 600 ; N edotaccent ; B 33 -16 55" -"0 654 ;\nC -1 ; WX 600 ; N ecaron ; B 33 -16 550 696 ;\nC -1 ; WX 600 ; N Ugrave" -" ; B 10 -14 590 839 ;\nC -1 ; WX 600 ; N Thorn ; B 14 0 523 583 ;\nC -1 ; WX 600" -" ; N eacute ; B 33 -16 550 696 ;\nC -1 ; WX 600 ; N edieresis ; B 33 -16 550 654" -" ;\nC -1 ; WX 600 ; N dcaron ; B 33 -14 681 637 ;\nC -1 ; WX 600 ; N ccedilla ; " -"B 54 -229 565 450 ;\nC -1 ; WX 600 ; N ccaron ; B 54 -16 565 696 ;\nC -1 ; WX 60" -"0 ; N cacute ; B 54 -16 565 696 ;\nC -1 ; WX 600 ; N aogonek ; B 42 -208 580 450" -" ;\nC -1 ; WX 600 ; N aring ; B 42 -16 571 727 ;\nC -1 ; WX 600 ; N atilde ; B 4" -"2 -16 571 656 ;\nC -1 ; WX 600 ; N abreve ; B 42 -16 571 687 ;\nC -1 ; WX 600 ; " -"N egrave ; B 33 -16 550 696 ;\nC -1 ; WX 600 ; N agrave ; B 42 -16 571 696 ;\nC " -"-1 ; WX 600 ; N aacute ; B 42 -16 571 696 ;\nC -1 ; WX 600 ; N adieresis ; B 42 " -"-16 571 654 ;\nC -1 ; WX 600 ; N Uogonek ; B 10 -208 590 583 ;\nC -1 ; WX 600 ; " -"N ugrave ; B 13 -13 571 696 ;\nC -1 ; WX 600 ; N uacute ; B 13 -13 571 696 ;\nC " -"-1 ; WX 600 ; N udieresis ; B 13 -13 571 654 ;\nC -1 ; WX 600 ; N tcaron ; B 13 " -"-16 530 637 ;\nC -1 ; WX 600 ; N scommaaccent ; B 73 -278 527 450 ;\nC -1 ; WX 6" -"00 ; N Zcaron ; B 73 0 527 839 ;\nC -1 ; WX 600 ; N ecircumflex ; B 33 -16 550 6" -"96 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 10 -14 590 839 ;\nC -1 ; WX 600 ; N acir" -"cumflex ; B 42 -16 571 696 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 73 0 527 798 ;\nC" -" -1 ; WX 600 ; N scaron ; B 73 -16 527 696 ;\nC -1 ; WX 600 ; N Amacron ; B -21 " -"0 621 769 ;\nC -1 ; WX 600 ; N sacute ; B 73 -16 527 696 ;\nC -1 ; WX 600 ; N Tc" -"ommaaccent ; B 42 -278 558 583 ;\nC -1 ; WX 600 ; N Ydieresis ; B 21 0 579 798 ;" -"\nC -1 ; WX 600 ; N thorn ; B -8 -205 571 624 ;\nC -1 ; WX 600 ; N Emacron ; B 1" -"3 0 550 769 ;\nC -1 ; WX 600 ; N Ograve ; B 21 -14 579 839 ;\nC -1 ; WX 600 ; N " -"Oacute ; B 21 -14 579 839 ;\nC -1 ; WX 600 ; N Odieresis ; B 21 -14 579 798 ;\nC" -" -1 ; WX 600 ; N Ntilde ; B -8 0 592 799 ;\nC -1 ; WX 600 ; N Ncaron ; B -8 0 59" -"2 839 ;\nC -1 ; WX 600 ; N Nacute ; B -8 0 592 839 ;\nC -1 ; WX 600 ; N Lcaron ;" -" B 33 0 571 598 ;\nC -1 ; WX 600 ; N Lacute ; B 33 0 571 839 ;\nC -1 ; WX 600 ; " -"N Idotaccent ; B 83 0 517 798 ;\nC -1 ; WX 600 ; N racute ; B 54 0 571 696 ;\nC " -"-1 ; WX 600 ; N Icircumflex ; B 83 0 517 839 ;\nC -1 ; WX 600 ; N ohungarumlaut " -"; B 42 -16 558 694 ;\nC -1 ; WX 600 ; N otilde ; B 42 -16 558 656 ;\nC -1 ; WX 6" -"00 ; N Euro ; B 4 -14 538 597 ;\nC -1 ; WX 600 ; N ocircumflex ; B 42 -16 558 69" -"6 ;\nC -1 ; WX 600 ; N onesuperior ; B 166 247 434 638 ;\nC -1 ; WX 600 ; N twos" -"uperior ; B 149 247 429 637 ;\nC -1 ; WX 600 ; N threesuperior ; B 157 238 442 6" -"37 ;\nC -1 ; WX 600 ; N Igrave ; B 83 0 517 839 ;\nC -1 ; WX 600 ; N Iacute ; B " -"83 0 517 839 ;\nC -1 ; WX 600 ; N Imacron ; B 83 0 517 769 ;\nC -1 ; WX 600 ; N " -"Iogonek ; B 83 -208 517 583 ;\nC -1 ; WX 600 ; N Idieresis ; B 83 0 517 798 ;\nC" -" -1 ; WX 600 ; N Gbreve ; B 33 -14 592 831 ;\nC -1 ; WX 600 ; N Umacron ; B 10 -" -"14 590 769 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B 13 -278 602 583 ;\nC -1 ; WX 60" -"0 ; N ograve ; B 42 -16 558 696 ;\nC -1 ; WX 600 ; N Scommaaccent ; B 62 -278 53" -"8 597 ;\nC -1 ; WX 600 ; N Eogonek ; B 13 -208 587 583 ;\nC -1 ; WX 600 ; N oacu" -"te ; B 42 -16 558 696 ;\nC -1 ; WX 600 ; N Edotaccent ; B 13 0 550 798 ;\nC -1 ;" -" WX 600 ; N iogonek ; B 62 -208 540 623 ;\nC -1 ; WX 600 ; N gcommaaccent ; B 33" -" -205 592 721 ;\nC -1 ; WX 600 ; N odieresis ; B 42 -16 558 654 ;\nC -1 ; WX 600" -" ; N ntilde ; B 23 0 571 656 ;\nC -1 ; WX 600 ; N ncaron ; B 23 0 571 696 ;\nC -" -"1 ; WX 600 ; N Ecaron ; B 13 0 550 839 ;\nC -1 ; WX 600 ; N Ecircumflex ; B 13 0" -" 550 839 ;\nC -1 ; WX 600 ; N scedilla ; B 73 -229 527 450 ;\nC -1 ; WX 600 ; N " -"rcaron ; B 54 0 571 696 ;\nC -1 ; WX 600 ; N Egrave ; B 13 0 550 839 ;\nC -1 ; W" -"X 600 ; N Eacute ; B 13 0 550 839 ;\nC -1 ; WX 600 ; N Gcommaaccent ; B 33 -278 " -"592 597 ;\nC -1 ; WX 600 ; N Rcommaaccent ; B 13 -278 619 583 ;\nC -1 ; WX 600 ;" -" N Edieresis ; B 13 0 550 798 ;\nC -1 ; WX 600 ; N nacute ; B 23 0 571 696 ;\nC " -"-1 ; WX 600 ; N uogonek ; B 13 -208 571 437 ;\nC -1 ; WX 600 ; N umacron ; B 13 " -"-13 571 626 ;\nC -1 ; WX 600 ; N Dcaron ; B 13 0 550 839 ;\nC -1 ; WX 600 ; N lc" -"aron ; B 62 0 538 637 ;\nC -1 ; WX 600 ; N Ccaron ; B 33 -14 564 839 ;\nC -1 ; W" -"X 600 ; N Cacute ; B 33 -14 564 839 ;\nC -1 ; WX 600 ; N Ccedilla ; B 33 -229 56" -"4 597 ;\nC -1 ; WX 600 ; N degree ; B 125 243 475 596 ;\nC -1 ; WX 600 ; N Aogon" -"ek ; B -21 -208 621 583 ;\nC -1 ; WX 600 ; N minus ; B 42 230 558 330 ;\nC -1 ; " -"WX 600 ; N multiply ; B 100 80 500 480 ;\nC -1 ; WX 600 ; N divide ; B 42 28 558" -" 532 ;\nC -1 ; WX 600 ; N Aring ; B -21 0 621 871 ;\nC -1 ; WX 600 ; N trademark" -" ; B -33 220 620 583 ;\nC -1 ; WX 600 ; N rcommaaccent ; B 54 -278 571 449 ;\nC " -"-1 ; WX 600 ; N lacute ; B 62 0 538 840 ;\nC -1 ; WX 600 ; N omacron ; B 42 -16 " -"558 626 ;\nC -1 ; WX 600 ; N Atilde ; B -21 0 621 799 ;\nC -1 ; WX 600 ; N icirc" -"umflex ; B 62 0 538 696 ;\nC -1 ; WX 600 ; N igrave ; B 62 0 538 696 ;\nC -1 ; W" -"X 600 ; N ncommaaccent ; B 23 -278 571 450 ;\nC -1 ; WX 600 ; N lcommaaccent ; B" -" 62 -278 538 624 ;\nC -1 ; WX 600 ; N plusminus ; B 42 0 558 624 ;\nC -1 ; WX 60" -"0 ; N onehalf ; B -34 0 629 638 ;\nC -1 ; WX 600 ; N onequarter ; B -34 0 629 63" -"8 ;\nC -1 ; WX 600 ; N threequarters ; B -43 0 630 637 ;\nC -1 ; WX 600 ; N iacu" -"te ; B 62 0 538 696 ;\nC -1 ; WX 600 ; N Abreve ; B -21 0 621 831 ;\nC -1 ; WX 6" -"00 ; N kcommaaccent ; B 33 -278 571 624 ;\nC -1 ; WX 600 ; N Omacron ; B 21 -14 " -"579 769 ;\nC -1 ; WX 600 ; N imacron ; B 62 0 538 626 ;\nC -1 ; WX 600 ; N emacr" -"on ; B 33 -16 550 626 ;\nC -1 ; WX 600 ; N amacron ; B 42 -16 571 626 ;\nC -1 ; " -"WX 600 ; N tcommaaccent ; B 13 -278 529 591 ;\nC -1 ; WX 600 ; N ydieresis ; B 2" -"1 -205 579 654 ;\nC -1 ; WX 600 ; N zdotaccent ; B 85 0 519 654 ;\nC -1 ; WX 600" -" ; N zcaron ; B 85 0 519 696 ;\nC -1 ; WX 600 ; N zacute ; B 85 0 519 696 ;\nC -" -"1 ; WX 600 ; N yacute ; B 21 -205 579 696 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B" -" 13 -13 571 694 ;\nC -1 ; WX 600 ; N eth ; B 42 -16 558 646 ;\nC -1 ; WX 600 ; N" -" uring ; B 13 -13 571 727 ;\nC -1 ; WX 600 ; N Ocircumflex ; B 21 -14 579 839 ;\n" -"C -1 ; WX 600 ; N commaaccent ; B 183 -278 351 -59 ;\nC -1 ; WX 600 ; N copyrigh" -"t ; B -7 -15 606 598 ;\nC -1 ; WX 600 ; N registered ; B -7 -15 606 598 ;\nC -1 " -"; WX 600 ; N Acircumflex ; B -21 0 621 839 ;\nC -1 ; WX 600 ; N idieresis ; B 62" -" 0 538 654 ;\nC -1 ; WX 600 ; N lozenge ; B 72 -19 529 593 ;\nC -1 ; WX 600 ; N " -"Delta ; B 15 0 585 583 ;\nC -1 ; WX 600 ; N notequal ; B 42 22 558 525 ;\nC -1 ;" -" WX 600 ; N radical ; B 12 -60 642 697 ;\nC -1 ; WX 600 ; N Agrave ; B -21 0 621" -" 839 ;\nC -1 ; WX 600 ; N Aacute ; B -21 0 621 839 ;\nC -1 ; WX 600 ; N lessequa" -"l ; B 3 0 549 591 ;\nC -1 ; WX 600 ; N greaterequal ; B 35 0 582 591 ;\nC -1 ; W" -"X 600 ; N logicalnot ; B 42 115 465 445 ;\nC -1 ; WX 600 ; N summation ; B 45 -9" -"7 538 671 ;\nC -1 ; WX 600 ; N partialdiff ; B 102 -16 524 590 ;\nC -1 ; WX 600 " -"; N Ncommaaccent ; B -8 -278 592 583 ;\nC -1 ; WX 600 ; N dcroat ; B 33 -16 613 " -"624 ;\nC -1 ; WX 600 ; N brokenbar ; B 250 -153 350 622 ;\nC -1 ; WX 600 ; N Lco" -"mmaaccent ; B 33 -278 571 583 ;\nC -1 ; WX 600 ; N Adieresis ; B -21 0 621 798 ;" -"\nC -1 ; WX 600 ; N mu ; B 13 -153 571 437 ;\nC -1 ; WX 600 ; N .notdef ; B 375 " -"0 375 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 998\nKPX A C -14\nKPX A" -" Ccedilla -22\nKPX A G -10\nKPX A O -15\nKPX A Odieresis -15\nKPX A Q -16\nKPX A" -" T -27\nKPX A U -23\nKPX A Uacute -23\nKPX A Ucircumflex -23\nKPX A Udieresis -2" -"3\nKPX A Ugrave -23\nKPX A V -59\nKPX A W -13\nKPX A Y -27\nKPX A a 15\nKPX A b " -"45\nKPX A c -4\nKPX A ccedilla -8\nKPX A comma -47\nKPX A d 4\nKPX A e 2\nKPX A " -"g 0\nKPX A guillemotleft -40\nKPX A guilsinglleft -40\nKPX A hyphen -19\nKPX A o" -" -3\nKPX A period -62\nKPX A q -4\nKPX A quotedblright -84\nKPX A quoteright -11" -"3\nKPX A t -20\nKPX A u -12\nKPX A v -39\nKPX A w -13\nKPX A y -39\nKPX Aacute C" -" -14\nKPX Aacute G -10\nKPX Aacute O -15\nKPX Aacute Q -16\nKPX Aacute T -27\nKP" -"X Aacute U -23\nKPX Aacute V -59\nKPX Aacute W -13\nKPX Aacute Y -27\nKPX Aacute" -" a 15\nKPX Aacute b 45\nKPX Aacute c -4\nKPX Aacute comma -47\nKPX Aacute d 4\nK" -"PX Aacute e 2\nKPX Aacute g 0\nKPX Aacute guillemotleft -40\nKPX Aacute guilsing" -"lleft -40\nKPX Aacute hyphen -19\nKPX Aacute o -3\nKPX Aacute period -62\nKPX Aa" -"cute q -4\nKPX Aacute quoteright -113\nKPX Aacute t -20\nKPX Aacute u -12\nKPX A" -"acute v -39\nKPX Aacute w -13\nKPX Aacute y -39\nKPX Acircumflex C -14\nKPX Acir" -"cumflex G -10\nKPX Acircumflex O -15\nKPX Acircumflex Q -16\nKPX Acircumflex T -" -"27\nKPX Acircumflex U -23\nKPX Acircumflex V -59\nKPX Acircumflex W -13\nKPX Aci" -"rcumflex Y -27\nKPX Acircumflex comma -47\nKPX Acircumflex period -62\nKPX Adier" -"esis C -14\nKPX Adieresis G -10\nKPX Adieresis O -15\nKPX Adieresis Q -16\nKPX A" -"dieresis T -27\nKPX Adieresis U -23\nKPX Adieresis V -59\nKPX Adieresis W -13\nK" -"PX Adieresis Y -27\nKPX Adieresis a 15\nKPX Adieresis b 45\nKPX Adieresis c -4\n" -"KPX Adieresis comma -47\nKPX Adieresis d 4\nKPX Adieresis g 0\nKPX Adieresis gui" -"llemotleft -40\nKPX Adieresis guilsinglleft -40\nKPX Adieresis hyphen -19\nKPX A" -"dieresis o -3\nKPX Adieresis period -62\nKPX Adieresis q -4\nKPX Adieresis quote" -"dblright -84\nKPX Adieresis quoteright -113\nKPX Adieresis t -20\nKPX Adieresis " -"u -12\nKPX Adieresis v -39\nKPX Adieresis w -13\nKPX Adieresis y -39\nKPX Agrave" -" C -14\nKPX Agrave G -10\nKPX Agrave O -15\nKPX Agrave Q -16\nKPX Agrave T -27\n" -"KPX Agrave U -23\nKPX Agrave V -59\nKPX Agrave W -13\nKPX Agrave Y -27\nKPX Agra" -"ve comma -47\nKPX Agrave period -62\nKPX Aring C -14\nKPX Aring G -10\nKPX Aring" -" O -15\nKPX Aring Q -16\nKPX Aring T -27\nKPX Aring U -23\nKPX Aring V -59\nKPX " -"Aring W -13\nKPX Aring Y -27\nKPX Aring a 15\nKPX Aring b 45\nKPX Aring c -4\nKP" -"X Aring comma -47\nKPX Aring d 4\nKPX Aring e 2\nKPX Aring g 0\nKPX Aring guille" -"motleft -40\nKPX Aring guilsinglleft -40\nKPX Aring hyphen -19\nKPX Aring o -3\n" -"KPX Aring period -62\nKPX Aring q -4\nKPX Aring quotedblright -84\nKPX Aring quo" -"teright -113\nKPX Aring t -20\nKPX Aring u -12\nKPX Aring v -39\nKPX Aring w -13" -"\nKPX Aring y -39\nKPX Atilde C -14\nKPX Atilde G -10\nKPX Atilde O -15\nKPX Ati" -"lde Q -16\nKPX Atilde T -27\nKPX Atilde U -23\nKPX Atilde V -59\nKPX Atilde W -1" -"3\nKPX Atilde Y -27\nKPX Atilde comma -47\nKPX Atilde period -62\nKPX B A 4\nKPX" -" B AE 3\nKPX B Aacute 4\nKPX B Acircumflex 4\nKPX B Adieresis 4\nKPX B Aring 4\n" -"KPX B Atilde 4\nKPX B O -9\nKPX B OE 11\nKPX B Oacute -9\nKPX B Ocircumflex -9\n" -"KPX B Odieresis -9\nKPX B Ograve -9\nKPX B Oslash -5\nKPX B V -18\nKPX B W -6\nK" -"PX B Y -39\nKPX C A 8\nKPX C AE 7\nKPX C Aacute 8\nKPX C Adieresis 8\nKPX C Arin" -"g 8\nKPX C H -13\nKPX C K -8\nKPX C O -14\nKPX C Oacute -14\nKPX C Odieresis -14" -"\nKPX Ccedilla A 3\nKPX D A -25\nKPX D Aacute -25\nKPX D Acircumflex -25\nKPX D " -"Adieresis -25\nKPX D Agrave -25\nKPX D Aring -25\nKPX D Atilde -25\nKPX D J -32\n" -"KPX D T -27\nKPX D V -30\nKPX D W -13\nKPX D X -37\nKPX D Y -51\nKPX F A -39\nKP" -"X F Aacute -39\nKPX F Acircumflex -39\nKPX F Adieresis -39\nKPX F Agrave -39\nKP" -"X F Aring -39\nKPX F Atilde -39\nKPX F J -78\nKPX F O -24\nKPX F Odieresis -24\n" -"KPX F a -40\nKPX F aacute -40\nKPX F adieresis -40\nKPX F ae -18\nKPX F aring -4" -"0\nKPX F comma -168\nKPX F e -47\nKPX F eacute -47\nKPX F hyphen -55\nKPX F i -4" -"6\nKPX F j -54\nKPX F o -51\nKPX F oacute -51\nKPX F odieresis -51\nKPX F oe -16" -"\nKPX F oslash -51\nKPX F period -187\nKPX F r -32\nKPX F u -1\nKPX G A 6\nKPX G" -" AE 5\nKPX G Aacute 6\nKPX G Acircumflex 6\nKPX G Adieresis 6\nKPX G Agrave 6\nK" -"PX G Aring 6\nKPX G Atilde 6\nKPX G T -25\nKPX G V 6\nKPX G W 6\nKPX G Y -14\nKP" -"X J A -8\nKPX J AE -16\nKPX J Adieresis -8\nKPX J Aring -8\nKPX K C -24\nKPX K G" -" -19\nKPX K O -25\nKPX K OE -4\nKPX K Oacute -25\nKPX K Odieresis -25\nKPX K S -" -"9\nKPX K T -13\nKPX K a 6\nKPX K adieresis 6\nKPX K ae 31\nKPX K aring 6\nKPX K " -"e -6\nKPX K hyphen -44\nKPX K o -12\nKPX K oacute -12\nKPX K odieresis -12\nKPX " -"K u -22\nKPX K udieresis -22\nKPX K y -50\nKPX L A 16\nKPX L AE 16\nKPX L Aacute" -" 16\nKPX L Adieresis 16\nKPX L Aring 16\nKPX L C -10\nKPX L Ccedilla -11\nKPX L " -"G -10\nKPX L O -7\nKPX L Oacute -7\nKPX L Ocircumflex -7\nKPX L Odieresis -7\nKP" -"X L Ograve -7\nKPX L Otilde -7\nKPX L S -24\nKPX L T -52\nKPX L U -29\nKPX L Udi" -"eresis -29\nKPX L V -57\nKPX L W -22\nKPX L Y -52\nKPX L hyphen 9\nKPX L quotedb" -"lright -72\nKPX L quoteright -99\nKPX L u -10\nKPX L udieresis -11\nKPX L y -33\n" -"KPX N A -3\nKPX N AE -3\nKPX N Aacute -3\nKPX N Adieresis -3\nKPX N Aring -3\nKP" -"X N C -7\nKPX N Ccedilla -6\nKPX N G -6\nKPX N O -5\nKPX N Oacute -5\nKPX N Odie" -"resis -5\nKPX N a -11\nKPX N aacute -11\nKPX N adieresis -11\nKPX N ae 18\nKPX N" -" aring -11\nKPX N comma -75\nKPX N e -3\nKPX N eacute -3\nKPX N o -8\nKPX N oacu" -"te -8\nKPX N odieresis -8\nKPX N oslash -3\nKPX N period -93\nKPX N u -8\nKPX N " -"udieresis -8\nKPX O A -14\nKPX O AE -14\nKPX O Aacute -14\nKPX O Adieresis -14\n" -"KPX O Aring -14\nKPX O T -15\nKPX O V -23\nKPX O W -2\nKPX O X -26\nKPX O Y -43\n" -"KPX Oacute A -14\nKPX Oacute T -15\nKPX Oacute V -23\nKPX Oacute W -2\nKPX Oacut" -"e Y -43\nKPX Ocircumflex T -15\nKPX Ocircumflex V -23\nKPX Ocircumflex Y -43\nKP" -"X Odieresis A -14\nKPX Odieresis T -15\nKPX Odieresis V -23\nKPX Odieresis W -2\n" -"KPX Odieresis X -26\nKPX Odieresis Y -43\nKPX Ograve T -15\nKPX Ograve V -23\nKP" -"X Ograve Y -43\nKPX Oslash A -10\nKPX Otilde T -15\nKPX Otilde V -23\nKPX Otilde" -" Y -43\nKPX P A -61\nKPX P AE -59\nKPX P Aacute -61\nKPX P Adieresis -61\nKPX P " -"Aring -61\nKPX P J -73\nKPX P a -49\nKPX P aacute -49\nKPX P adieresis -49\nKPX " -"P ae -27\nKPX P aring -49\nKPX P comma -160\nKPX P e -38\nKPX P eacute -38\nKPX " -"P hyphen -33\nKPX P o -42\nKPX P oacute -42\nKPX P odieresis -42\nKPX P oe -13\n" -"KPX P oslash -42\nKPX P period -178\nKPX R C -14\nKPX R Ccedilla -17\nKPX R G -1" -"0\nKPX R O -14\nKPX R OE 5\nKPX R Oacute -14\nKPX R Odieresis -14\nKPX R T -28\n" -"KPX R U -16\nKPX R Udieresis -17\nKPX R V -24\nKPX R W -8\nKPX R Y -28\nKPX R a " -"14\nKPX R aacute 14\nKPX R adieresis 14\nKPX R ae 40\nKPX R aring 14\nKPX R e 2\n" -"KPX R eacute 2\nKPX R hyphen -25\nKPX R o -3\nKPX R oacute -3\nKPX R odieresis -" -"3\nKPX R oe 29\nKPX R u -7\nKPX R uacute -8\nKPX R udieresis -8\nKPX R y -18\nKP" -"X S A -10\nKPX S AE -10\nKPX S Aacute -10\nKPX S Adieresis -10\nKPX S Aring -10\n" -"KPX S T -41\nKPX S V -10\nKPX S W -12\nKPX S Y -31\nKPX S t -17\nKPX T A -28\nKP" -"X T AE -28\nKPX T Aacute -28\nKPX T Acircumflex -28\nKPX T Adieresis -28\nKPX T " -"Agrave -28\nKPX T Aring -28\nKPX T Atilde -28\nKPX T C -19\nKPX T G -19\nKPX T J" -" -65\nKPX T O -14\nKPX T OE 6\nKPX T Oacute -14\nKPX T Ocircumflex -14\nKPX T Od" -"ieresis -14\nKPX T Ograve -14\nKPX T Oslash -14\nKPX T Otilde -14\nKPX T S -41\n" -"KPX T V 10\nKPX T W 4\nKPX T Y -10\nKPX T a -34\nKPX T ae -12\nKPX T c -37\nKPX " -"T colon -112\nKPX T comma -130\nKPX T e -26\nKPX T g -24\nKPX T guillemotleft -7" -"3\nKPX T guilsinglleft -73\nKPX T hyphen -91\nKPX T i -42\nKPX T j -49\nKPX T o " -"-31\nKPX T oslash -31\nKPX T period -148\nKPX T r -28\nKPX T s -39\nKPX T semico" -"lon -100\nKPX T u 4\nKPX T v 10\nKPX T w 10\nKPX T y 0\nKPX U A -19\nKPX U AE -1" -"8\nKPX U Aacute -19\nKPX U Acircumflex -19\nKPX U Adieresis -19\nKPX U Aring -19" -"\nKPX U Atilde -19\nKPX U comma -95\nKPX U m 16\nKPX U n -8\nKPX U p 0\nKPX U pe" -"riod -114\nKPX U r -34\nKPX Uacute A -19\nKPX Uacute comma -95\nKPX Uacute m 16\n" -"KPX Uacute n -8\nKPX Uacute p 0\nKPX Uacute period -114\nKPX Uacute r -34\nKPX U" -"circumflex A -19\nKPX Udieresis A -19\nKPX Udieresis b 27\nKPX Udieresis comma -" -"95\nKPX Udieresis m 16\nKPX Udieresis n -8\nKPX Udieresis p 0\nKPX Udieresis per" -"iod -114\nKPX Udieresis r -34\nKPX Ugrave A -19\nKPX V A -4\nKPX V AE -12\nKPX V" -" Aacute -4\nKPX V Acircumflex -4\nKPX V Adieresis -4\nKPX V Agrave -4\nKPX V Ari" -"ng -4\nKPX V Atilde -4\nKPX V C -24\nKPX V G -24\nKPX V O -23\nKPX V Oacute -23\n" -"KPX V Ocircumflex -23\nKPX V Odieresis -23\nKPX V Ograve -23\nKPX V Oslash -23\n" -"KPX V Otilde -23\nKPX V S -27\nKPX V T 10\nKPX V a -54\nKPX V ae -27\nKPX V colo" -"n -132\nKPX V comma -146\nKPX V e -47\nKPX V g -46\nKPX V guillemotleft -75\nKPX" -" V guilsinglleft -75\nKPX V hyphen -39\nKPX V i -59\nKPX V o -52\nKPX V oslash -" -"48\nKPX V period -164\nKPX V r -45\nKPX V semicolon -120\nKPX V u -15\nKPX V y -" -"17\nKPX W A -9\nKPX W AE -9\nKPX W Aacute -9\nKPX W Acircumflex -9\nKPX W Adiere" -"sis -9\nKPX W Agrave -9\nKPX W Aring -9\nKPX W Atilde -9\nKPX W C -4\nKPX W G -3" -"\nKPX W O -2\nKPX W Oacute -2\nKPX W Ocircumflex -2\nKPX W Odieresis -2\nKPX W O" -"grave -2\nKPX W Oslash 2\nKPX W Otilde -2\nKPX W S -17\nKPX W T 4\nKPX W a -11\n" -"KPX W ae 17\nKPX W colon -99\nKPX W comma -83\nKPX W e -3\nKPX W g -3\nKPX W gui" -"llemotleft -31\nKPX W guilsinglleft -31\nKPX W hyphen 1\nKPX W i -38\nKPX W o -8" -"\nKPX W oslash -4\nKPX W period -101\nKPX W r -25\nKPX W semicolon -82\nKPX W u " -"1\nKPX W y -2\nKPX X C -28\nKPX X O -26\nKPX X Odieresis -26\nKPX X Q -26\nKPX X" -" a 0\nKPX X e -12\nKPX X hyphen -50\nKPX X o -18\nKPX X u -28\nKPX X y -43\nKPX " -"Y A -25\nKPX Y AE -28\nKPX Y Aacute -25\nKPX Y Acircumflex -25\nKPX Y Adieresis " -"-25\nKPX Y Agrave -25\nKPX Y Aring -25\nKPX Y Atilde -25\nKPX Y C -45\nKPX Y G -" -"45\nKPX Y O -44\nKPX Y Oacute -44\nKPX Y Ocircumflex -44\nKPX Y Odieresis -44\nK" -"PX Y Ograve -44\nKPX Y Oslash -43\nKPX Y Otilde -44\nKPX Y S -48\nKPX Y T -10\nK" -"PX Y a -53\nKPX Y ae -28\nKPX Y colon -150\nKPX Y comma -118\nKPX Y e -59\nKPX Y" -" g -59\nKPX Y guillemotleft -94\nKPX Y guilsinglleft -94\nKPX Y hyphen -81\nKPX " -"Y i -58\nKPX Y o -64\nKPX Y oslash -51\nKPX Y p -30\nKPX Y period -136\nKPX Y se" -"micolon -133\nKPX Y u -43\nKPX Y v -33\nKPX Z v -41\nKPX Z y -52\nKPX a j -81\nK" -"PX a quoteright -78\nKPX a v -21\nKPX a w -12\nKPX a y -31\nKPX aacute v -21\nKP" -"X aacute w -12\nKPX aacute y -31\nKPX adieresis v -21\nKPX adieresis w -12\nKPX " -"adieresis y -31\nKPX ae v 28\nKPX ae w 32\nKPX ae y 18\nKPX agrave v -21\nKPX ag" -"rave w -12\nKPX agrave y -31\nKPX aring v -21\nKPX aring w -12\nKPX aring y -31\n" -"KPX b v 0\nKPX b w 4\nKPX b y -10\nKPX c h 11\nKPX c k 6\nKPX comma one -128\nKP" -"X comma quotedblright -137\nKPX comma quoteright -166\nKPX e quoteright -65\nKPX" -" e t -16\nKPX e v -9\nKPX e w -3\nKPX e x 6\nKPX e y -20\nKPX eacute v -9\nKPX e" -"acute w -3\nKPX eacute y -20\nKPX ecircumflex v -9\nKPX ecircumflex w -3\nKPX ec" -"ircumflex y -20\nKPX eight four -58\nKPX eight one -72\nKPX eight seven -65\nKPX" -" f a -32\nKPX f aacute -32\nKPX f adieresis -32\nKPX f ae -7\nKPX f aring -32\nK" -"PX f e -43\nKPX f eacute -43\nKPX f f -43\nKPX f i -37\nKPX f j -60\nKPX f l -25" -"\nKPX f o -47\nKPX f oacute -47\nKPX f odieresis -42\nKPX f oe -15\nKPX f oslash" -" -29\nKPX f quoteright -73\nKPX f s -42\nKPX f t -6\nKPX five four -52\nKPX five" -" one -73\nKPX five seven -73\nKPX four four -62\nKPX four one -66\nKPX four seve" -"n -93\nKPX g a -4\nKPX g adieresis -4\nKPX g ae 23\nKPX g aring -4\nKPX g e 1\nK" -"PX g eacute 1\nKPX g l -34\nKPX g oacute -3\nKPX g odieresis -3\nKPX g r 0\nKPX " -"guillemotright A -37\nKPX guillemotright AE -34\nKPX guillemotright Aacute -37\n" -"KPX guillemotright Adieresis -37\nKPX guillemotright Aring -37\nKPX guillemotrig" -"ht T -71\nKPX guillemotright V -72\nKPX guillemotright W -29\nKPX guillemotright" -" Y -92\nKPX guilsinglright A -37\nKPX guilsinglright AE -34\nKPX guilsinglright " -"Aacute -37\nKPX guilsinglright Adieresis -37\nKPX guilsinglright Aring -37\nKPX " -"guilsinglright T -71\nKPX guilsinglright V -72\nKPX guilsinglright W -29\nKPX gu" -"ilsinglright Y -92\nKPX h quoteright -69\nKPX h y -23\nKPX hyphen A -18\nKPX hyp" -"hen AE -14\nKPX hyphen Aacute -18\nKPX hyphen Adieresis -18\nKPX hyphen Aring -1" -"8\nKPX hyphen T -90\nKPX hyphen V -38\nKPX hyphen W 1\nKPX hyphen Y -81\nKPX i T" -" -58\nKPX i j -143\nKPX k a 1\nKPX k aacute 1\nKPX k adieresis 1\nKPX k ae 26\nK" -"PX k aring 1\nKPX k comma -63\nKPX k e -11\nKPX k eacute -11\nKPX k g -14\nKPX k" -" hyphen -50\nKPX k o -17\nKPX k oacute -17\nKPX k odieresis -17\nKPX k period -7" -"5\nKPX k s -9\nKPX k u -3\nKPX k udieresis -3\nKPX l v -77\nKPX l y -77\nKPX m p" -" 32\nKPX m v 18\nKPX m w 22\nKPX m y 8\nKPX n T -40\nKPX n p 4\nKPX n quoteright" -" -68\nKPX n v -12\nKPX n w -5\nKPX n y -22\nKPX nine four -53\nKPX nine one -66\n" -"KPX nine seven -57\nKPX o T -31\nKPX o quoteright -62\nKPX o t -13\nKPX o v -6\n" -"KPX o w -3\nKPX o x -10\nKPX o y -17\nKPX oacute v -6\nKPX oacute w -3\nKPX oacu" -"te y -17\nKPX ocircumflex t -13\nKPX odieresis t -13\nKPX odieresis v -6\nKPX od" -"ieresis w -3\nKPX odieresis x -10\nKPX odieresis y -17\nKPX ograve v -6\nKPX ogr" -"ave w -3\nKPX ograve y -17\nKPX one comma -99\nKPX one eight -74\nKPX one five -" -"55\nKPX one four -87\nKPX one nine -73\nKPX one one -62\nKPX one period -114\nKP" -"X one seven -141\nKPX one six -98\nKPX one three -53\nKPX one two -47\nKPX one z" -"ero -86\nKPX p t -3\nKPX p y -6\nKPX period one -113\nKPX period quotedblright -" -"131\nKPX period quoteright -161\nKPX q c 2\nKPX q u 41\nKPX quotedblbase A -6\nK" -"PX quotedblbase AE -7\nKPX quotedblbase T -90\nKPX quotedblbase V -104\nKPX quot" -"edblbase W -43\nKPX quotedblbase Y -78\nKPX quotedblleft A -62\nKPX quotedblleft" -" AE -60\nKPX quotedblleft Aacute -62\nKPX quotedblleft Adieresis -62\nKPX quoted" -"blleft Aring -62\nKPX quotedblleft T -24\nKPX quotedblleft V -22\nKPX quotedblle" -"ft W -13\nKPX quotedblleft Y -49\nKPX quotedblright A -76\nKPX quotedblright AE " -"-75\nKPX quotedblright Aacute -76\nKPX quotedblright Adieresis -76\nKPX quotedbl" -"right Aring -76\nKPX quotedblright T -39\nKPX quotedblright V -30\nKPX quotedblr" -"ight W -26\nKPX quotedblright Y -51\nKPX quoteleft A -87\nKPX quoteleft AE -85\n" -"KPX quoteleft Aacute -87\nKPX quoteleft Adieresis -87\nKPX quoteleft Aring -87\n" -"KPX quoteleft T -49\nKPX quoteleft V -46\nKPX quoteleft W -38\nKPX quoteleft Y -" -"73\nKPX quoteright A -154\nKPX quoteright AE -153\nKPX quoteright Aacute -154\nK" -"PX quoteright Adieresis -154\nKPX quoteright Aring -154\nKPX quoteright comma -2" -"27\nKPX quoteright d -140\nKPX quoteright o -143\nKPX quoteright period -244\nKP" -"X quoteright r -149\nKPX quoteright s -150\nKPX quoteright t -117\nKPX quoterigh" -"t v -110\nKPX quoteright w -105\nKPX quoteright y -116\nKPX r a -17\nKPX r aacut" -"e -17\nKPX r acircumflex -17\nKPX r adieresis -17\nKPX r ae 4\nKPX r agrave -17\n" -"KPX r aring -17\nKPX r c -18\nKPX r ccedilla -15\nKPX r colon -95\nKPX r comma -" -"108\nKPX r d -8\nKPX r e -7\nKPX r eacute -7\nKPX r ecircumflex -7\nKPX r egrave" -" -7\nKPX r f -16\nKPX r g -5\nKPX r h -20\nKPX r hyphen -41\nKPX r i -25\nKPX r " -"j -33\nKPX r k -30\nKPX r l -47\nKPX r m 36\nKPX r n 10\nKPX r o -12\nKPX r oacu" -"te -12\nKPX r ocircumflex -12\nKPX r odieresis -12\nKPX r oe 18\nKPX r ograve -1" -"2\nKPX r oslash -12\nKPX r p 30\nKPX r period -122\nKPX r q -4\nKPX r quoteright" -" -41\nKPX r r -11\nKPX r s -21\nKPX r semicolon -83\nKPX r t 20\nKPX r u 20\nKPX" -" r v 26\nKPX r w 26\nKPX r x 7\nKPX r y 16\nKPX r z -21\nKPX s quoteright -60\nK" -"PX s t -11\nKPX seven colon -156\nKPX seven comma -157\nKPX seven eight -74\nKPX" -" seven five -82\nKPX seven four -101\nKPX seven one -67\nKPX seven period -176\n" -"KPX seven seven -62\nKPX seven six -93\nKPX seven three -72\nKPX seven two -64\n" -"KPX six four -49\nKPX six one -54\nKPX six seven -46\nKPX t S -35\nKPX t a -16\n" -"KPX t aacute -16\nKPX t adieresis -16\nKPX t ae 9\nKPX t aring -16\nKPX t colon " -"-117\nKPX t e -24\nKPX t eacute -24\nKPX t h -5\nKPX t o -30\nKPX t oacute -30\n" -"KPX t odieresis -30\nKPX t quoteright -102\nKPX t semicolon -103\nKPX three four" -" -52\nKPX three one -71\nKPX three seven -64\nKPX two four -67\nKPX two one -66\n" -"KPX two seven -68\nKPX u quoteright -56\nKPX v a -3\nKPX v aacute -3\nKPX v acir" -"cumflex -3\nKPX v adieresis -3\nKPX v ae 18\nKPX v agrave -3\nKPX v aring -3\nKP" -"X v atilde -3\nKPX v c -11\nKPX v colon -81\nKPX v comma -136\nKPX v e 0\nKPX v " -"eacute 0\nKPX v ecircumflex 0\nKPX v egrave 0\nKPX v g 1\nKPX v hyphen -23\nKPX " -"v l -77\nKPX v o -5\nKPX v oacute -5\nKPX v odieresis -5\nKPX v ograve -5\nKPX v" -" oslash -5\nKPX v period -156\nKPX v s -11\nKPX v semicolon -69\nKPX w a -3\nKPX" -" w aacute -3\nKPX w acircumflex -3\nKPX w adieresis -3\nKPX w ae 23\nKPX w agrav" -"e -3\nKPX w aring -3\nKPX w atilde -3\nKPX w c -6\nKPX w colon -81\nKPX w comma " -"-90\nKPX w e 2\nKPX w eacute 2\nKPX w ecircumflex 2\nKPX w egrave 2\nKPX w g 3\n" -"KPX w hyphen 3\nKPX w l -48\nKPX w o -2\nKPX w oacute -2\nKPX w odieresis -2\nKP" -"X w ograve -2\nKPX w oslash 2\nKPX w period -109\nKPX w s -11\nKPX w semicolon -" -"69\nKPX x a 5\nKPX x c -14\nKPX x e -5\nKPX x eacute -5\nKPX x o -10\nKPX x q -8" -"\nKPX y a -13\nKPX y aacute -13\nKPX y acircumflex -13\nKPX y adieresis -13\nKPX" -" y ae 8\nKPX y agrave -13\nKPX y aring -13\nKPX y atilde -13\nKPX y c -21\nKPX y" -" colon -91\nKPX y comma -134\nKPX y e -11\nKPX y eacute -11\nKPX y ecircumflex -" -"11\nKPX y egrave -11\nKPX y g -9\nKPX y hyphen -19\nKPX y l -78\nKPX y o -15\nKP" -"X y oacute -15\nKPX y odieresis -15\nKPX y ograve -15\nKPX y oslash -15\nKPX y p" -"eriod -155\nKPX y s -21\nKPX y semicolon -79\nKPX zero four -59\nKPX zero one -7" -"6\nKPX zero seven -68\nEndKernPairs\nEndKernData\nEndFontMetrics\n" -; -int n022004l_pfb_len = 50493; -char* n022004l_pfb = -"\x80\x1U\x6\x0\x0%!PS-AdobeFont-1.0: NimbusMonL-Bold 1.05\n%%CreationDate: Wed D" -"ec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development\n" -"% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COPYING" -" (GNU General Public License) for license conditions.\n% As a special exception," -" permission is granted to include this font\n% program in a Postscript or PDF fi" -"le that consists of a document that\n% contains text to be displayed or printed " -"using this font, regardless\n% of the conditions or license applying to the docu" -"ment itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) readon" -"ly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the" -" file COPYING (GNU General Public License) for license conditions. As a special " -"exception, permission is granted to include this font program in a Postscript or" -" PDF file that consists of a document that contains text to be displayed or prin" -"ted using this font, regardless of the conditions or license applying to the doc" -"ument itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by (UR" -"W)++ Design & Development) readonly def\n/FullName (Nimbus Mono L Bold) readonly" -" def\n/FamilyName (Nimbus Mono L) readonly def\n/Weight (Bold) readonly def\n/It" -"alicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePosition -100 def\n/Underl" -"ineThickness 50 def\nend readonly def\n/FontName /NimbusMonL-Bold def\n/PaintTyp" -"e 0 def\n/WMode 0 def\n/FontBBox {-43 -278 681 871} readonly def\n/FontType 1 de" -"f\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/Encoding StandardEnc" -"oding def\n/UniqueID 5020946 def\ncurrentdict end\ncurrentfile eexec\r\x80\x2\xc0" -"\xbc\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93" -"\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6" -"\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd" -"fA-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e" -"\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9d" -"n\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13" -"\x1d\xee\x0[AX\x5\xa1m\x8a\x12>j!S\xda\xaeZ\xc3\x44\x9a\x45\x32V1\xb2h\x84\xc3\xdb" -"\xa4\xccO:\xee\r\xad)\x7u|8tl\x94~\"y\xcf\x35\xbfw\xcb(\xbd\xa8\xe*\x1a\xd4\xb7\xa8" -"v\x2\x62\xb6\x92-D]p\x15.+\xc1t|sJ\x8c\x63U}\xd0\x42\xf7\xdf\xdf\x15qE\x0i\x1c\x84" -":l\xab}A\x9e\x81\xfe\xba\xadzo\xc0\xa5\xd7\x8b\xf6\xcc\xa5-\xe8;k\x9f)|\xaa\xad\xf2" -"1\x83\x11\xea\xbb\x9dO\xb4\x90N 7\x86+\xe8\xee\xf5\x10\x1f\x87#\xcb\x1f\xeZ\x1d\x82" -"-2!\xclt#\x11\xd9\xc4\\Z\xb9\xc6\x9d\xd6\x41\xbf;\x15\xec<\xd3\xf7\xbb\xd3\x31\xca" -"\xa9\x32\x42y\x94&\xe\xac\x31\xc9\xe8X\x9f\xa4\xc0:J\x98" -"\xe4\x1c-S\xf2\xa0\x13\x9f)\xf8\xb7/Y\xfd\x64\x17\xf\x2q\xc2\xcf\xe0;a\x82R\xda\xec" -"\\\xb2r\xe0\xdb\x98Vl4\xa6\xe9s\x8e\xcag\xbf\xbfK\xff\x93\x86NX\x9fs\xbc$s|\x4K\xbaU\x1a\x41\xc9N\xd3" -"\x9c\xef?\x92\x92\xdd\x8b\x9e_\xab\x3\x1e{9/\x80&\x11\xb7*\xaaj\xc\xf1\xdb\xb3T\x82" -"e\xb\xde\xfaz\xe9;K\xd6!\xb\x8b\x42\x9e\x9a^S\xd1\xc1\xc1\xe4\x30o\x83\xca\x36`\xab" -"\xfbq\x1\x8b\x1d\xd3\x9a\xd4\xf\x82\x1f\x88o\xb4In1\xda\xc1\x1c\xde\xe1Z\xda\x9f" -"\xa8th\xc4\xa4\xe9\x84\r\x9dO^\xe6\xce\xf4\xca\x7\"\x38\x45%\x46\xdb \x8e\xfc<\xe2" -"sV\xdf\x2\xf4{\"\xc9.\xab[mi\x87\x5\x2\xc2!M\x1Ml=nE\x95y[/\xef\xec\x32\x34\x8d\xab" -"\xf6\xdal\xe5\x1a\x95\xc7;@\x8\xf0Hz\xbc%\xb2\xd9\xc6\xf8*\x90\x42\xd0|\xf5#f0\x83" -"\xdej\xa2*\x99\xe1\x1f!\x12{\x9c\x61\x82@\xf2\xaf\x8eOR\x97\xef\xfb\x39\x18/\xaa" -"f\xe1\xe3W\x89\x1b\xfc\x37\xdf\x3'\x92\xd3\xc7\xdeZ\x16\xf4\x39@q\xbbLT\xaf\xa1\x90" -"\xc5\xb3\xfb\x36\xe7\xa8\x9\xc6\xb6^\x3\xf1\xf1\xd6\xdb\x9eH^\r\xc5\xa9\r`\x94%\xa9" -"\x85\xfb\xa0\x37\x31\xa0\xfa\x92\x97\xb4\xddSY\xf8\xe7\xcaqF\xa6\xee\xad\xe7\"\xb0" -"%\xd1\xb\x9f\xcc\x4[.\x8a\xfa\xc2\x99\r\xa3\xa1\x12!\x7f\x9f\x10\x86hV\xd9\xce\x9" -"?e\x9c\xe5\xeb\x10\x66\x36\xdeZ`\x83\x1a\x61\x3\xa5\x1\x5\xc5\x62\xbd\x66\x12\xc7" -"A\xd5)\xc5\xc1\xfo>#\x2S\x16Loe\xde\x8bxJ\x9dj\x84\x89\x39\xadu\x80\xff\xe\x7~\xba" -"\xe7\xe9$P\xa2T\x90\xe0\xa1\x0\xad\xea\xc5\"^\xf4_\x9ai\xdaSM\xd6I\xca\xbf\x39 \x10" -"\xcf\xd8\xb1\xdf\xacO\xc1\xdao\xd8\xecp\x82\xc9{0\xac\xdcv\xcbU5 W\xd6\x89\x30\x81" -"\xe9\xbeX\xc3=\xab\x65\xc6\x9e\x1a\xaf\xf\r\xa2\xc?@\x13\x5h2\xa6\xb0\xa9o\x88\x87" -"\x19\xe9\xc6\xf8\x99\xb4\x91\xdc\x19\xft\x89jD\x17\xb9\xf6g\x3\xde\x1f\xa0\xcc\xc7" -"\x8\x82\xbf\x61;\xd9\xe3\x62\xde\x9f\x90\x85\xc5\xbf]\x8e\xdf\x64\xb9\xf7}\xce%\x33" -"\xf6N\xc5\xdf\xfe\xe6\xb2" -"~QqG\xc9\x84\x9dt\xc8\x9f]\xca\xe2\xcc+\x93\x30\x89\x10x99\x6!|*\xe7\x4\x84^\xe7" -"\xe5\x19\x5-\xa0W\x98\xd7\x39\x88\xd2\xc7~\xe4q\xd7/\xb1\r\xef\x97\xe1\x35<\xef&" -"3\xe1\x85Z.\xf2\x9c\x38H\xd1pY\x4\x43y2H\xb8\xb8N\xe3j3\xc3\x7\xfe\xe7\xe8\xe4\xc0" -"(\x97Upb\xe3-\xa7\x9c\x0\x10P\xf2.\x9c\x9e\x8a\xca\xfb\x45\xd7\xaf\xffPl\xf4\x33" -"W\xaa\x85\xa6\x89\xd6)B\xb7\xcd\x39\x10\xf4S\x8f\x9a\\R\xb9\x61\x46\x39\xeeMr8\x96" -"0\x9\x1f\x30\xf8^']O\x8\xf3\x95\x88|\xe6l\xcd\xb6\xe3\x80\xa9;\x5\x19\xe2q3\x9b\x1c" -"\x99;t\xe7`B\xfdi{\x81\x8b\xaf\x83\xae\x98\xe\xaf:\xe0\xb8\x6UW\xae\xffQx\xd7>%\xe8" -"\xb7(\xe9N\xda\xc7\x5\x39\x4\x8f\xb1\xels\x4\x97\x8e\xad\xc4\xa5\xd3\x9\n\x38\x37" -"\xfc\x31\xb0?\xbb\x96\xd7\xedJ\xe3\xc0\x94\x8b'\xc0\x12,\x7f\xa4\xd6\xc8\x9R\x96" -"\xc3\x16.\xdd\xea'\xa9\x99~u#v\x91UZ\x8aW^T.-@\xdc\x1e \xf6k\xf2\x8c;\x9\xbc\x1d" -"F\x12\xb9s\x10\x63\r\x1\xc3&\xd8\xc7.\xfe\xeb\xec\x8d\xc2O\xde\xb0\xb8\xd5\xc9\x94" -"S\x85\xa4uC\xe6\xc4\x96\n\x2\xaa\xcf\xc\xf5\xb0\x1f\x8a\x66\xc7\xca\xfe\xf4\xb8\x81" -"\x11\xee\\y\xa7k\xc\x94\x9c\x3\x91\xe2\xc8p\xb3\xf:Y\xce\x6\xc5/\x95\xf6\xeb~Z\xee" -"\xc2\x43\xc0\x1bP\xd1Y\xa1\xb8\x17\xdd\xa7\xf6\xdeU\x9e\x13\xd6\x31\x96\xe8\x1eu" -"2d.\x8\x34\xf9\xb1=\xd1\xc\xa0j\x91\x94;6\xaf\xdb\xd7\xa4\xa2\x61\x81\xdf\xed\x9c" -"\xc7\x37R\x98.\xcf\xc5\xbc\xa1Q<\xee\x97\x10\x99\xb\xe0(\x15\x14\x45\xf2\xe2\x5t" -"W\xa2\xba\xf7\xe7\xb3!\x88_\xd5\x91\xcf\x42\x81\x99%\x33\xae\xeMO\xdc\xbb\xce\x65" -"9\xa4\xf2oN\xf0\xe\x6\xd5x\x84\xc7z\x90\x3\xc2\x16\xc0\xb6\\\x4\xda\x36\xd6\x8c\xc5" -"i\xed\xc0u\xea\xdf\x9dpy\xe0\xf7H_2\xe0\xe5\x46'\xdb\x15\x39\xd4I:_\xbb\xbe\xc8\xee" -"i\xec\x7f\x85(\"\xc5\x15\x84\xa2\xf5,w\xbb\xbagR\xce\xefh\xf7I\x7f\x61\xe4\xa2\xaa" -"\xe3>Zc\xc\x6t\xbbm\xc4\xc3\x1dX\xe1-?\x95\xcd\x33\x83\xd4\x9b{\xac\xe7\xa1\x36\x94" -"\xf8\xffj\xb5\xa7\xa6\x83\xa9N\x98\x4\xc2\xb\xfept\xf`\xe,Z\xf0\xab\x83\\s\xa5_\x7f" -"h\x1d\x42\x92\xe5|\xf6\x61\x98\xf1\xf3\xaf\x82\xcf\x33l3\x1f\x9\x1a\x85yjr\x94:\x13" -"\xc\x34\x66\xb4\"\x9dH\x0\xd7\xf6\xf\x43\x9a\x32\x7f\x32\xaf\xd0\xfc\xbe\x14\x1f" -"e=\xca\x1c;\xff\xdb\x5P\x9e\xcf\x1e\x41\x9d\x4\\V\xac:\x90\xf5'\x0v;\x93\x9\xd2\xe8" -"n\n\xd2\x1a\x36\x8d\x84\xefL\x7x\x99\xee\\\xf2\x1\x36]=\x90\xdep\x91\xff\xab\"R\x86" -"\x9e\xde\x93\xfc\xce\x32\xcG\xfd\xfa\xb2\x31\x12\x85\xd5\xb2\x63\x14\x0\x89\xa9\xb3" -"\x82\xf3<\xa6\x1b\xc5\x87\xa5}\x90l]\xb9\x1ezgX\x98\xee$\xe\xae\xdeS\xb2\x8b\xba" -"\xc1\x3\xe0\xc7m\xf8\xb1,b\xa3\x93\x7f\xc1\xae\xa8\x1f\xfc\x30\xd6\x97\x93\xb4k\xbf" -"2\xe1\xf0_T\xe*\xf2\xd7\xd5Jw\xef\x2\xba\x9eQ3\xc2\xea\x31\xd7\x8b\x4\x1a\x1b\xa7" -"\\-jz\xe1\xa2\x35+a\x1\x34xQ\x16\x43`\xf1\x45\x1d\xb5\xe3\xe9\x1f\xeaS\x0\x2\x10" -"P\\\xc0\"\x1c|Q\x90\xa4\x36\xac\x8b\x81\xe9\xa4\xe\xe8\x34\xcd\xf\xde\x4[\rF\xaa" -"\xa4i=\xf0\x37\n\x98\x4\xaevC\xd1\xde\x81<\xfdu\xcbxX\x84\xd6\x86\x87\xe8\x84\x94" -"\"PNJO\x1L\xe4\x0\xdale\xee\xbc\x9d\x98\x86\xdb\xe5\x2\xcc\xef\x99\xa7\x8\x8f\xe3" -"c\xa1\x85\xbbu\xf7\xb\x2#\x11\x91|*c\xe2\xe4\x1f>\x95\x42\xcf.K5\xa7\xb4.%\x3\xd6" -"r^q9\xc1\xcf\xa3\x1c\xcf\xa4k\x99\x86\x36\x1b\xbd\xd5\xbc\xd3\xa8\xe9H\x80U" -"^\xfcH\x19\x85\xd6\xdc\x64\xc7}\x5\xed\n\xa8&I\n\x7\x9a\xe4\xd1\xee\x1\x1e\xf8k\xd8" -"?\x7f\x9e\x65\x43:H\xdb\xf1$\xf1Z\xc3\xda\r_\xaalm\xaa\xc1\xc4\xfe\xb7\xdb\x8b\x84" -"C\x7\x16\xe\"\x81\xffz-+\xc6\xad\xd4;5DT\xd3I\xa3\x34\x14\x1bK\x1e)Sn\x88\xf2\x89" -"\xe5\x44\x8e[&\x81<\xe0t2c+RS9?fyh3#\x87\xa1\xbc\xcb\x98P?C\xabL\xc9\xb\x12\xe1\xf" -"\x8d|d5\xaa\xcd\x62\xfc\x8e\xf3/\xb3}\x13\xfa\xb\xf\xf1\x8a\xe2\no//\xd6\x39MU\xa8" -"\xfa\xff\x9\xff\x91\xab\xc2&A+\x0Q\xc2\x82\xb4\xb4\x9cU\x8a\xb0\x1\xd2Im\xba\xb6" -"\x8e\x66S\xdb\xb7M!\x3\x2\xa7\x84W\xeb&\xec\xaf\xcb\xec\x89o\xa5\x8f\x4H8}\x17`\x8d" -"z#\x13\xc2\"\xb4\x13\xd3\xf3.\xd2\x9bh=\x9d\xecy'\xfd\x93\xa8\xcb\r\xa0k.\x17\x94" -"\r\x19_|\xaf\xc6\xe5\xed\xcb\x31\xa8\xe0\x1\x87\x90\x3\x12\xee\x9b\xb1\x2\x5l\x15" -"\xea#>-C\xb7\xc6\xab\xbd\xe4M\xda\xd3\xa1\xf2\xcb\xcds\xe\xb5\xbe\x1f\x36\x91\xaa" -"\xaf.\xfe\x94\xa4snlLu:\xfb\xe1\xc0\x5\x14\x99\x18\xa4\xe5\x44k1\xce\x0Z\x99\xd6" -"A%\xc9`\x1c\xb0\x16\xa5M2A\xab!\xee\xb5\x5\xc4\xf1\xcf\xf6\x17\x83\x66\xb3\xcb\xc0" -"\xcb\xca'r\xdb}[:v]\xc6\xdb\x8bq\x16\x10\x9f]\xf2\x10\xa8 \xae\xae\x41\x63gE4M\x7" -"\xcf\x9a\xe1\xab\x5\xa5\x64\xa6\xa9\xc5\xee\xd8\x13\x7\x80\xe9>\xf\xcb-\xf9\xee\x1b" -"\x85\x87\xd8\xfa\xcb\xdcN\x19'1]\xf3\xa8\x81l\x95_\x19\x41{\xf5\x8\xae\x5$\xcd\x4" -"\xacS\xaf\x19\x61\x9c\xd9\x38I^L\x7f\x2\xc2ki\xa0\x91\xf2\xf9\x81^O\x8e;\x95\xa6" -"\x10\xc3\xba\x14\xa6\xd7rK\x88\x39.k^\xdb\x8e\x9c\x33>&.\xd6\x82\xf2I\xe9\xdf\x39" -"[\x94\xe7\xdb\x99\x43i\xeb\xf5Y\x10?\x9b\xdeQ\xea\xab\xde\x38T\xad^g\x5\x1f\xbb\xa7" -"\xea\xe4\xd5\x96\x8d\x82S\x87\x32\xd6@s\x9e\x1f\x9\xd5\xc0\xd3\xd6\x19k\x7f\x39\x99" -"\n\xee\x1a\x43\xcf\xe9\x87.\xf0\xe9\x8b\xcb\x8d\xe9\x37t\x16%_\xf0W\x18\x8d\x9f\x15" -"s\x13\xcd\x65\x4Q\xfa\xac\x8a\x1f\xae=\x0\x81Jj\xa4\xad\xc5H\x17y\x98\xcb\xa4\xd0" -"\xf1\xfb\xb0\xc7\xf6\xb3w2`\xe6\x0\x1cv\xb6\x81g_^\xc4\x88J\x16m\xb4\x39\xeb%\xf5" -"\xd5\xf5\x9aq$\xf0\xb2\xed\x99\x16\xe>w\x9c\xb6:\xe2\xa7\xf1\x18\xe9\xb\x18\xb\x45" -"\xd0\x97\xbf\xdc\xb\xc9[\xc7\x90\xfc\x8d{2&k/\xe2/v\x87P-m\xa4\xe3Q\xa7w\x8c\xbc" -"\xcd\x31\xb3\xc8\x32P\xc3\xd2\x1b\x1Q\xb7z\x5y*\xb5\n_c[-\x93,1.\xabK\x1c\x6\xbd" -"\xff\x13\xcc`h\xe1\x41\xb0>\xe8\xd8\x63\x8eW\xd5\x9c\xa1\xd8\xb8\xcc\xad\xea\xc0" -"W\xce\xff\x7\xf\xf7\xfd'e\xb0\x85vwL?\xf5\x1d\x88Z\xa8iN\x14\xdc[\xffy$0\xd9)\x8b" -"GN\xe\x1c\xdb\xbdK\x9#A\xfb\xdaH\xd1-\xbf\xd9\x8b\xc2\x37\xe1\xaf\xf1\x8d\xfay5&" -"\x1b@\x90n s\x8b\xfd\xca\x16\xb5\x84.*\x14\x5\xb2.I\x90\x2\x4H\xbcK\x93\x9\x12\xe4" -"\xbe\xc5\x80(\xd9\xd8n~\x15\xa6L\xfe\x18:\x94\xf8\x1e \x88\xff\xdc\xdfS&\xbd\x86" -"\x83\xb3\x3\xee\x8\x45\x9\x41\xba@de\x85\x4=\x86=\xd7\xd4\xcf\xbt\xe6\xfc\xf9iv\xdf" -"\xef]&\x16Wv6\xa4h\xea\xa1\xf4\x1b\xae=\x82\xf7\x1`\xd0+(\xb3\x18\xaa\xa9\xbbtVt" -"`\xa8\xcd\x43\x6\x66w\x86\xf6\x96\x7f\x39\xbd\xb9\xf2\x10\xb5\xa8\x6\x8e\x16{n\xe1" -"\x94\xb0\xff\xc9I.\xc4\xef\xe9\x66%\xfdG\x0\x39\xa5\x95Q\xb2\x82\x84LV\x1b&\x85\x1b" -"\x9a\xf6\xb3\xf3\xa6\xfe\x9a\xefR\xd4*\x81&P\x4\xbb\x64\xda\xd8\x94\xa7\xd6\xd0\x43" -"g)3\x7\x62XVd\xe8\xe7\x8eL\xfb\xf8\x9\x91\x9b\xae>N\xc7\xb\x61\x44O\x8eh\xaf\x0\xa4" -"\x19\xeb\xb7\xb5\xaa\xf6hf\xa7\xdb\xe0jQ\x6\xe9\xe6?o\x19\xb0\x41z\xbf\x32\xab\"" -"\xb0+\xcf\xc'\xaf\xe\x89\x85\x33\x11_\xaehn\xaf\xca\x96(\xba\xd2\x63\x18\xf2T\xdd" -"T\xe8vsl\xeb\xce\x82}\xe1o\xd3O-\xf6\xaf\xc7\xa9\xf3\x9fZ\xc5\x1\x64\xb5\x0\x13\xf2" -"m\xda\x83-\x9\x1e\xe0\xf7r\xd9\x19\x9d\x31^\xbfX\x95\x7\x65\x8c\xd7\xfc\xf2)\x89" -"q\x8f,1\xec\xc1\x82\x9\xd3+\xea+)\xbd\x1a\x88 *\x7f\xbb\xcd\xca #\xc7\x9d\x7\xb8" -"\x86\xb6u\xb0\xcf\x82\x4P\xd6Y\x9a\xf7\x1\xc1\xf2:\xc1\xab&M\x9c\x62\x35*,\xf2\xdb" -"h\x85\xab\x1bw\x1a\xa2\xf2\xd0\x37\x83\x34T\xd0\xc6\xe6\xab\x9ex\x84\xba\xd1)Y\xf9" -"\xd6\x93X42Q^\x9cN\x8e\x17\x85\x1f)+XYv-\xc0\x93\xfa\xc6\xd1\xc4\xd7_\x83\xe6\xc4" -"|\xf7;_\xe3\x90\xa1\x61\xef\n)Bd\xe\x86\x83\xc3<\xbe\xe2\x92\xaa\xe8\xcb\xce\x89" -"\xe2\xc1\xe8\xdc\x99\xddK\xcc\x9aQ\x1a\x7f\x0\x45S\x81\x9d\x85\xc3\x90\xea\xcc\x95" -"\x96\xe6q\x3\xcc\xe2\xc2\xe8jM\xb0tb9f \xc1\x1bn9\x16R\xbb\x35\x8f\x82@\x1a{G\xfc" -"V\x93\xb8\x98\xdf~\xb1\xf7\xa7\xdf\x6\xbe\x16hd\xb8$\x98\xe7\xa4\xa5.]x\xe2\xb4\xe3" -"y\xcc\xe4\xef\x1a\xed\xdf\x80\x93g\x13x\xed\xb4j\xb0\xf1\xaa{y\xfa\x1c\xe\n\x12G" -"\x11\xca\xe6\xfb\xe2\xb5jt\x1\xe\xe3im\x11)i\xb8\x1f:\xec\xf9\x9b\xab\x36\xfa\x93" -"\x17\xfd\x9a.Y\n\x8d\x1c\xc4G\xcd$\xc4)\x95\xd7\xb0\x44T\xa8\xfd\xe2\xe5\x89% '9" -"#C\xa1\x17\x85x\n\xde\xb>\xeb\x8b\xb2\xb\x63\xd1\xbd\x61\xbe\"\x99\xf2\x64\xa8\xda\xa9>\xd1\x45" -"\xf1\xb6Q*u\xa3\xeeI\xd0\xeb\xf7?\x90\xebk\xc7^\xcc\x5te\xaf\x93\x1b\x30\x3\x89\x7" -"?T\xe5\xe0\xa5\xe1\x34\x6p9;\x83\x33T\x8f\xb4\xc9\x44\x4\xb1m\x8\x13\xa8H\x14%\xe9" -"\xad\x9\xbe]\x8aO>\xec\x62\x39\xf7\xb1\x41\xa0;B\x8d\x45\xb6\xe3\xc9\x81\xc3\xee" -"2\xa0\x65\xf2\xd1\x62\xe2[k\xb7\x9e\x9d\x46\xe1\x83\x8a\xa5\x10\xdf\x9d\x8cq\xf3" -"\xde\xe6\x37\xa9|E<\xc&\xea\x8a\xf6\x8e<\x0L\x8d\xe9\x97\xa6\xf5\xa0\xe2q:\xf2}\x8f" -"\x98\x3\x12\x33\xc6\xbf^\xf5\xc1\x3\xe5\xaf\x8\x62\xcen\xa9\xd5\x98\xab\xbd\x8\x35" -"\xb\x18\xd9\xea\x84s\x8due\xcf\xcf\xec\x7f\x97\x43\xb5\xde~\x9d\xe5IUU9\xb\n\xd8" -"\x9c\xe0\x1aZ\x5\xd6\xc5:#Z\xa3\xd8\x9c\xf3)\xb2\xf4\x35\xb\r\x98\xdaMIs\xcbYT\xc6" -"\xd6\x39\xce\x36~hwm[\xa8\xdf\x9ey[\xd9Q\xa2^\xb1?\xf3\xbd$F\xc8\xed\x32g\n" -"\x19\xf7\xd1pi\x94\xfa\xd9\xbb\x9f\xf4Hf\x89Q\xca\x2\xed\xbd\x95\xb\x82\x33\x0[\xaf" -"\xf1v\x8a\x1c\xc2\xa4M\xa8\xe0\x12^czk\xcbQ\xbb\x64\xaf\"\x7fj?|~\xbeN\xfa\x39Ye" -"\xd4\x9b\x13\xb8\xaa_\x1d\x41\xfa\xe2\x90M\x82\x9,l%\x88\xb3\x81\x82\x89\x1a\x39" -"\xd7/\x1e\xb2P\x82yc\xd6\xce]\xc8\x4\x93\xb3\xab\xab\xb9\x11\x18\x9aks\xec\nt\xd9" -"\xde\x15\xf0\xdd\x99/\xe1\x1a\xde\x38\x36w\xd0'\x92\xa7 \xb8>\xa2\x1a\xb3\xc6\x31" -"\xc9\xf7\x5\x8eit\x93\x6\xa4\x9^\xaf\xbd\x82\xb8\xdf!\x9eS$?|\xf2\xef\xb3\xc6~\x16" -"\x9fvc\x2\xa2\x8Mj\xb6\xda\xcb\xdd\x12\xa6|\xa3i\xaa\xa0-\"b\x14\x81\xc0:\x8d\x43" -"v=b\xd2\xbe\x32\x62\xd1\xaf\xba\x82<\xfd\xa9\x19\x92\xec\xf8\xc\xdd\x36VP\\S\x99" -"\x11\x8c\xa1\x35\x2\xd0;\x12, \xa2\xbb\xbf\x80\xaa\x66\x42w:bU_\xb7\xce\xe5\xde\xbb" -"\xae\x61\x1e\xb2\xd4\x43\xf2\xed\xc2K\xb1S\xdc\x63L\xb6\xd6\xb3rIrD[\xa3\xad\xf9" -"z\xb0u\xaf*\x95\xd2\xf1\xbbt\xcf\xb2\xdb\x1e\x43Q0)l\xee\x19\xbb\x8c\x15~\xb8\xdb" -"p\xbf\\\xfc\x1ey\x1f\x35\x31\xd3\xae\x33UJN\xdf\x16\x7\ns\x1b\xc8\xb7\xc7J\x84\xbb" -";\xe0\xf2\xbf\x45V\xc\xdat\xb4\xc1-\xd7\x18\xc6(\x3\xfbOJ\xba_\xe8\x9do|\xba\xaf" -"\xcf\xe4\xbbQ\x80\x31\xda\xcd\xea*\xe6\xc8\xd0\xc0;\xf6\n\x9b\x6\xc\xce\xbbHX\xe4" -"\xcf\xe1'\x1e\x31k\xf7\xaf\xb0W\x14\xc2l\xfa\x91\xbd\x96\xd0\x62-\xa3\x1e\xd6%S;" -"%\x2\x6N\xec#%{G\x85\xf4\xf0\x13/?D\xb0\xc2\xb8;\xb6\x42\xdd\x88R\xee\x7f\x37w\x95" -"n\x98G5\xf5\xd1\x61u\xc4\xa2~\x92\x82\xa4\xe4\xff\xc\xaby8\xd9!\xd3=\xc7\xe8\xb6" -"*\xe2J\x90\xb1&F\xb3\xa5\xfe\x88\xfd\x94M\x83\x9\x41\x1fn\xb3\x3\x1a\xbbg\xfc\x9b" -"\xb2\x88\x9a\xec\x45\x82\x10 V\x1c\x15\x19$7s\xb4H\xd6[\xbd\xad\xc1Z^\x15[\x8d\x1b" -"6\x8c\xbd\x97\xb7V\xa8\x95+B\x8a\x35\x8c\x39\x86\x30\xb4n\x8a\xfd\xae#\x85\x93\xc3" -"\xfdX\x9e\xc4kw\xb8\xd8.\xc7\xe1\xecZP\xcb\xc7~\xd5K\xc1\xe2\x42la\xd2:\x8X\x1e\xc1" -"\xd7\x1c\x9\x8\xf7u\x9d\x1d\xa9$\x1b\x8v\x18\xe9\xf7V\xbf\xb8`#\xda\xf9\xa7\xca\xc" -"N\xff\r\x45\xaa\x95\xcf\xdeZ\xac\x19w\x91\x1e\xc6\xb2\x2\xbbGT~;[\xf3\x32~\x95\xf7" -"\xe1\xa4\x86>[\x90J\xf4\xb3zR~4(,\xb6Y\xa2/\x85\xba@k\xcc\xbe\x30p\xeaS\xf6Z\x87" -"k\x9d\x1b\x9a\x10\x96\x41/\xef\x87\x6\xbet1S\xd4\xdc\xac\x16\x81\xa4\n,&Zr\x91!\xf2" -"\xd3\xfc\x9e\xfe\xb\\\x18\xe0\x2\x62o0#\xa5\xeap[G\xce\x1a\\Sq\"\xe7\xc3Z\xf7\xbf" -"1\xf6m\x5\xe1\xaa\x33\x62\xe6\x8c\x1d%\x9f\xca\xcd\x0y\xfc\xa7\xefP\x16TtN)Nh\x18" -"\xca;\xad\xcb\xae\xb8\x8d\x44\x31\x9f\xba\x90\x42\xe2Z\x82PY\x9a\x8e\xed^\x1c\xc" -"\xbd\x9fs\x9b}\xb3\x1c;\x18\x12\x81vP\xe7,\x97\r\x30\x90\xf8\x32^\\\xa0\x1f\xc8^" -"S\x10x}\xb8\xdb\xa0\xca&\xd7\x7f@<\x6*d\x7f\x9f\x99\x82\x46\xf2\x64\"\x37HY\xde\x43" -"T v\xb4Y\xb7\xfa\x82\x9d'\x18#$&%2\x99\xfd\x38\x86\xac\x4H\xba\x12rl\xca\xb4z\xf3" -"\xcd\xc6\xf\xb6\x9d\xda\x65\x13\xc8>\r\x12w\xab\x88ME\xff\x39vSj\x13\xad\xf8\x9\x39" -"\xcf\x1a\x1d\xb0\xa6\x34\x7f\x9aOv\xac&t\xadI\xa4n\xf1\xd4~\xe4\xfaq|I11\xe0\xa5" -"!,=K\xa1\x34\xa7\xa6\xcc\xaf\xf9\x98*\xbe\x9fy*\x91y\x87\xe5\x9d\xcd\x19\x84\xb5" -"\x99L\x8c\x89\xb3\xf9\xf0\x87\x8c\xc3\x17t\x89\xa3\xb9\xb4\x1e\x44g;\xb2S\xec\xde" -"\xb2\x8?B\x93\xed\x9d$\"<\xbf\xef&\xcc\xe5\x64I\x91XH)\x12\x87\x90\x82\x80m\x4\x8f" -"\x1e\xa9\x99\xab<\xb2\x16\xa5\xc2}`'F\x8b\x8a\xffKU\xfb\x31\x9f\xde\xd4\xee-0\x8c" -"\xf\x8c\x96\xfb\x7f\xec\xa0+q\x88\xba\xc0\xdd\xd4\xbe\xe0:W~\x91\xd2X\xea\xba\xd8" -"\x87\xbe%\xe7L)oc\xbf\xda\r\xa6p\x9a\xa6k\x81\x41\x89\x44<\x8b\x94+\xe5W\xf2``n\xe" -",\\\x8\"\xadJ[3\xfa\xcd+\x90\xac\x82jv\x8c\xcc\x37\xd2Y\x1d\xd2\x8f\x1e\x1`2\xba" -"\xe5\x87\xb1(I\xd2\xf9\xe5`\xe3\xf8\xc0|\xc5\xf%o\xf2\x9\xc9\xcf\xb3l\xf9!q>y\xcf" -"\x2(>\x14\xe5,\xdc:\xda\xd8\x1e-*\xdb\xfao\x1a,,\xa8\x1c\xf9\x7f\xb6\x8d\x61\xf8" -"\xc5\x1f\x8c-p\xc5\x9a\x94\r\xbc\x31\xa1\xc0@\x1d\x41\xb9\xc1\xe5\x90no\x9d-DF\xda" -"\x96\xd3j\rL\xc8\x97~fZ\xae\\\x43\x16W9\xb2\"k\xa5\x98\x7\xa4\xe5O\xe9\x90\x1d\x9e" -"=\xfa\xf5\x31\xef+)9\x8d-\x10\xc2O\xd2R\x9cGDi\xca\xf\xc1|,\x6\xf6p4\x85\x45\x82" -"a\x12\xe8\x34\x65K\xec\x7f\x3\x9d\x11\x99\r\xc8#\xc4y\xca\xf0\xb9\xffq\xf9\x83\x45" -"{\xe4\x88\xa3jT\xd9\xdc\xe4\xb\x83(\x82\xee\xf4\xb6\x98\xbb\x17XZ\xb2\xc9\x81\xb5" -"\xb4-\x99\xa5\x46\xa9\xc5\xbV\"~vxm\xbc\xc6\xa5r\x80\x9\xa7\x7\xa5\xc8\xc3\x9f\x65" -"\xbcm\x10GB\x96\xa9\x38\x33\xfe\xe3\x89\x92\xde\xdaL\xee\x62:\xb3\xe6rs{\xe8\x3\xe9" -"\x84 \x3\xe7)\xa9|\xff\xa1\xa1\"\xd9\xab\xb\xfaX}\xa6{\xa7\x0_Q'\x8e:\x6\xa7R\xf8" -"mZ\x8b/\rz\x87\x1e\xa2\x9a,;r`\xfb\x62\x1z\xa4JimY\xc6\xee\x91\xa1\x30" -"\x0\x35[\x92\x34\xcc`03\xddtWr\x97\x10\x8\x92\xfb\x8cwE\xdf\x45\xd1%\x3O\xb2hK\xd4" -"\xd4\x64v\xe4\x37\x65\x63p\xe1\x35\x37\x11K#W]\xa9\xab\x9cW\xcd\xe|C\x86PI\xc3\xfb" -"\xea\x9b*\xd3X}\xa4\xb5\xb0!8A\x15\x86t\x8\x66l\x11\xc1\xbc~4Z\xf1\xddJ%\x93\xb7" -"c5E\x1fW\xfc\x6!\xe2q/\xa2\x31\x12\xc4\xec\xfc\xaf<\xdcXq\xd3\x92\xfc+?\x9\xed\xb5" -"\xb8q\x5\xb6\xdeK\xf2\x65H\x92\\\xbf\x45\x95\xbb\x7$)\xb3GXk\xfa\x43l\x10\xd2T\xe4" -"\xcd\x15\x42\xad\xc1\xf7,\n\x15\xee\xe\xb3\xe2\x1d\xe3>\xd4\x19/\xbc\xe9\x5\xd1o" -"\xba\x12\x2\xe4\\\x0{\xd1\xbaZ[\xf4\xf4V\xa4\r\"\xd0\x32o?\xa5\xf5\x7f\xe5\x33_{" -"\xd2\xd7LF\xc2\x32M\x9" -"@\xa6\xdf\xd0\x66}\xc4\xc4\x83\xbe\x82\xab\xf8\xe5\xed\xdb\xde\x2\xf5\xb1\xa1\x1b" -"\x1e\xc4\xf2 \x1c\xa9\xfd\xa9\x7z\xa5\xbe*c{\xaa\xe8:\x18\xe0\xd0z\xca\x46/\xe5?" -"\xab\x32HLMy)\xf8\x30\xb6\xef\xd7\x89\xb2#\x11\xb6\x14\x1a\xa2\x7\x92\xc2\x96\x98" -"\xc0\xc0\xc9h8'\x87L\x80\xb9~l\x8f\xaf\xc6#\xf8\xe2wo45j2\xc0\xe7\x61>\xbfI\x1b\xcf" -"\xaa\xad\xc4v\xec.\xb9\x4\xc5.:e\xd6\x1f\xcfM;\xaa\xf6\x8d\xd8\xa2\xdf;k\x99X\xad" -"`m\xbc\x16\x65;\x13\x4\xf0;\xac\x8e\xe4\x99\x34\x92\x87\x93\x93\xde\xc1\xc3\xb9\x93" -"\xf\xe\xdc\xbaUB\xc2*\xf1\xaaMuOe=\xc8\xe4\xf7j\x92\x98\xe0\xae\x85\x9cl\x13\xf8" -"\xab$\xb3\x34\x9c\n\xbe\xce\xc2\x9e\x89U\x16\x85\x9d^'ls\xfc\x38\x4\xd1\x94\xec\x15" -"L\xaa\x7f\xb3\x80\x38\x9\xc6\xd6i\xd8l\xb7Z\x1\x9\xa2_\xd4\x81$\xbe\xf\x89\xcc\xd2" -"G\x99\x61\xfa\x11\x14M\xb0\xd6&\xe3/\xee\x84\xaa\xfe\x9f\xf7\x93%L,(\xcc\x32\x8\xe4" -"\xc1;\xf3\xfe\xef\x16]\xe8\x43<\xd6\x30\xf\xc9~\xd2\xe\xbH.\xfa\x38&~\xc\x19\xa8" -"\x2\xa7\x95\xc6\x2\xa0\xf3M2t\xde\xdf\xc3\x92\x89I\xf1m\xd1[\x81\x1f\x61\xd6\x82" -"\xff\x30<\xb\xe3\xc9\xb1\x42\xe4\x34\x89~,%\xc9k\x9b\x31;FB\xe6)X\x81\xa5\xa2\x66" -"\r\xae&r@\xe8\xfd\xe3\xa4\xb5\x8d\xfa\xa1\xc\xaa]\xe3\xa7\x30Hg'\xa4\x3\x7\xb4G\xb" -"\x94\x62\x45\x12H\\\xee\xcd\xa1\x9c\x9d\x9e\xbbh\x82R\x97\xac\xa3z\xa3\xe5\xbe\xc4" -"\xc4\x97\xb3]\xc1\xe\x86\xbb\xb9\x32\xd5\xe6\xa0?\x95\xb\xf4\\\xb1\x9a\x9f\\\xf7" -"#O\x89~\x16\x34\x91\xd7\x33\xb5Q\x7\x90\xeb\x10\x18U\xb4-\x82\xd2\x33\xde\x46V\xe4" -"\xcc\xc1\\p\xd3\xc1\x9a\x36|~\x8c\xd9w\x12R\x8\x31\xff\x30.Y\xc6k\xd6`\x81\x92\xc2" -"\x9b\x17\xf1%\x87jM\x0\xf8@Lt_6\xb8z\xba\xaf\xb4\x1b \x85K\x8aqAzE\xbe\x9am\x9d\xff" -"q\xacI5\xe7\x9d\x30\xe6\x65~w{\xff\x19\x36=lX\x88)\xafVK\x1b'xK\xf9\xc5\x16\x98\x17" -"\xed!\x83\xb0\xcb\xd4\xberW]\xd4\x84\xbfm\xc8\xa9#OT\xbf\x7\x9dY\xd5\xb8'\x96\xce" -"\xe3\x8e\xfd\xbc\x30\xd9\xf3\x9d\xfP\x5\x82\xf2Zr\x9a\x1f\x86\x2\x1d\xdc\x17\xe0" -"\x1t\xd8\x42\xd0_!\xc4\xd6\xf5\xd0w|\x99\xfd\x99\xf5\xbdz\xebJ\x8f\x89\x97\xb6\xae" -"\xa5J<3l\x8ehXZ\xb5\xf6Td\x8e\xf3\x5`\x12\xf3[\xd4\xb3\"\x89ww\x80`&\xa0\xd4\x5\xf0" -"\xea\xab\x93\x61\xd8\xd6uO\x1b\x66\xe\xee\x9\x16\x95\xf3\x9b\x8f\xa5\xf6\xfb\xa1" -"\xd5[38\x1aVtG\x90k\xde\xe9\x89++\xf7U5?\x89<\xd9\xd9\x12\xbb\x8c\xcf\x1e\r\x30\xcc" -"\xa1\xc6\xf2\xd3\xffU/V\xacu\xc3\xc6\xe8\x92()\x10\xda-\xf6Pr?7Zh\xdc\x9e\xb6L\xa7" -"JQ'A\xc4\xa6R\xb2#\xdb-%\xca)\xd2r\xed$\x19\x94L/3v\x99&\xd6\x9f)\x1d*F-\x10\\S\xde" -"\xe4\x39\x91r\xc1\x1a\xa0v=H@\x15R\xec\xbd\x9c\x8b\xab\xe6\xb4\xda&\xe7\xf9\x62\x33" -"U\xe4\x30v\x82\x84\xfa\x9bSfz\xb6{\x6!l\x5\xeeT\x16X\x92\xd5\xcc\x44\x35\xa0\xe5" -"\xfe=\xb1i\xb\x8cpC&\xde\xf9\xe9\xe3\x1a\x65\x9a\xe2\x6\xf8\xc6\xc\xfd\x66?\x91h" -"\x85\x81\xa0\x17\x9c\x9b{\x9d\xab\x97\xe1\xbf_$\xfd\xa6\xed\x33\x94\x33\xaf\xb2\x8" -"9E\x8d\x18\xbe\xd5I\x1b\xe9\xfb\x11\x8b\xcd\x33\x61\xcd\xcf\x3\xdd\xf6}\x11v\x7f" -"\x7fzB\x13\x46\xda\xcfq\x1d\x37[\xf5\x19\xfc\x93u31\xe1\xa0\x91\xfd\xf6\x3\xca\xb4" -"\x1f\xelH\xe1\x0\xe7\x81W\xe0~\xb1\xb\x30\xc6\xf3P\xa1\x46\xce\xc0\xd3\xd1\xd0\xe9" -"D\xa6\x9e\x85 \x92\x90\x9f\xa5O\x1b\x43w\xadGh\xfb\xeb\xdfS4\xc8\xf1\xe3&\xec\xb1" -"T\xee\x6\x85\x83\x42\xa2o;X\xa9\xe0\x14\x1dW\xc2\r\xf8\xc4vk\xe3 <\xed\x1ek$\xfa" -"*\x98\xbc\xa3\x91\xb8[\x7fW-I\xac\x38\xe4H'3roV\xd5\xef\x42\xd3\xc9R\xdb\x9d\xb8" -"-\x91)\xdc\xc3\xbK/\xcd\xd2\xf\xcap6I\x7p\x1b\xd1\x90(b*:\xedrV\x9c\xd8\x30~#\xe4" -"\x8ej\x9d\xf0M\xa2K\xc0\x46\xc\xf8\x8bu\xde\xe4\x37\x9a|\x0:l\xba\x11$\x15\x38\\" -"C\x5\x8a\x46\x89\x9d\x63\x2\xabV\x5\x36\xe5\x9cg\xf4\x62R\x8a\x81!=\x9c\x90\x9\xfd" -"9u\xa3\xb6\x1\x41\xe\x98\x9e\xfe:h\xe1\x65\xfa\n\xe6\xdd\x9c\x3\x61\xe0\x62o\x18" -"Q\x7~\x8e\xd9\xfcL\xd7\x66)\x1c\x7f=\xf8\xe5\x1e.\xb3\xb8\xe9'G\x98\xf3.-\xfa=Z\x8" -"\xab\xb6\x10\x61\xd4\xca\xf4\\\xc8\x37\x30\x97G\xdf\x9b\rV[4\xd0\xc0J/\x9e\xcd\x64" -"\xf0\xdf\x42,s\x8\xed'\xa7\xb5\xfb\x8a^]q\xc3\x0\x39\x14\x64=%\x88\x95\xa0\xe2\xf1" -"6\xc0._\xc6\x65\x9d\xeelx\"\xda\xc9?\x8e\n\xa4\xb5\xa5/\x9\xc2\xf4\x9d{\x9aq\x92" -"\xa2/\xe8\xef\xc8\xf5\x14-7\x91\xd3\xe1\x1b\x88\xfa\x8c\x9a\xfc/\xc5h\xdf\x2\xc4" -"\n\x10\x9a\xb9NY\xcd\x46{\x9b\xb\xd9\xf9@\x3\xb2\x1fR,\xb5\xc8\xb1\x91\xa3r\xefU" -"\x83\xe6oR\x17\xa6]<{\xaa\x13u\xd5\x9b\xbdT\xdd\x9a\xf7\x13\x95\x1\xb7J+\xa7K\x87" -"\xdb)\xacx\xf1\xaf\xa2\x1b\x81\x7+X\xca\xc2\xdf\x32\x9fZ\x7f>\xddlB\x83\x9d\xb1p" -"\xcb\xfb\xfcW^\xf1r\xb3\x9c\x18Y\x87\x14\x1f%}\rm\x90\x9c\x1a\x95\xfe\x10\xd3\x13" -"\xb8\xc0\x84k\x80\xc0~\xd5\x12J\xdf\x1d\x36\xadz\xf7)\xde\xc0R\xb2\xe6\xc6\x16\x9" -"!\x1e\xe5vEJ\x86\xa0\xc2\xe6\xca\xcl\xf\xf1\xda\xba\xb4\x91\x43\x8b\x32`\x88\xd1" -"n\xa1\xff\x32\xe6\x98q\xcd?Z\\\xef\x38H\xb7\x34\xee \xe2Q\xc\x97\xc5u;&)\xb9\xeb" -"0,H\x83\x19\xe3\x84\x16lY%~\xb0\x45J\xf6\x96\x1b\x87\xa7V\x9a\\\x82\xe1\xd9\xf1\xbc" -"\xd8\x43y\xa5\x90\xb4\xb4\x11\x66\xa6~\xcf\xf4H\x90\xc1\x5\xd1o;\xc8\x99\xb6R\xfe" -"\x11PE\x98:\xc7\xf6\xb7\xd6;S9\xfa\x99\xce\xf5\x88\xf8\"Qn\x13Z\xb4\xf\xcf\xae\xe9" -"\x5w\xbd\x87\x8f\x92\xec\x14;\xdb_\xe5\xff\xaex9\r\xdc?}\x83\x61u\x9d\xfb\x39\x96" -"\xaa]\xfd\x33\x1d\x9b\xa3o)\x1\xc6_^Jl\x95\xa9@\rc\x16\xadt^h\xc\xf8r\x9f#\xbf\xe0" -"\xb1\x1b\x14\x8ct\xb6\xc\x36\xc2\xfe\xd2\xebq\xec_\xafM\x5\xae\x96!3\xc1\xb8wm\x1d" -"W\xbb\xf4o\xba\x30\xa1_34O&\xdd\x85\x41\x1b\x16Tn\x1c\x9d\xd9\x63\xf1\xb3\x34\x2" -"l\xdb\x9\xab\x97=\x1f\xa6\x15\x38\x18G\x1c\xd3\x10\xd7\x35u\xd3\xe0\x39\x2\xf0\xbd" -"\xf0\x4\x8f\xf5\xef\xd1\xbe\xb2\xe8W\xf8 \x84\xb7\x43\xe1\x0\x91\xd3\x37\x45\x93" -"\xba\x94M\x5\xee\x97\xbf\n\xd7V\x8b\x45\xa9Z$\xf4\x9f\xb\xa2\xd9\x37\x14\x85ve\xea" -"\x9a\xc4W\xa9\n\x63W\x7fr\x93\xfc\xc0\xd5\xbd\xcc\xdf\x61\n\xa8#\xf7\xdb\x43\x11" -"\x92\x63\xfdY\x1a \xf3\xf6\xd2\x61$\x12\xbf\xb5x=\xb3\xc0\x86^\xec\xd1\xe7\xc2\xca" -"P\xd9\xde\xa0\xba\x8aP\xa4\xa6\x9e\xe6x\x99\xbf\xa6\xb1\x1b\xc5\x8b\x31\xc9\x8ak" -"\x8c\xd6\x36\x33\xddk\xa6\xe4\x1a\xff}\xe6\x44IiB\xb7\xe8\xc3\x33 \xc2?\n\xaa\x8" -"\x10\x98\xd5U\xdf\x9b\xf6kJ\xf6\xcb\xa3\xa7\x1f\xc9\xfd\xb0\xa1\x94\x97\xea\x0\x17" -"\xdf\xa4s\xbf\xf4\xadk\xad\xbcm\x97\x11W\xce\x98\xfe\x12<\xa2\xa5q\x1e\xf9\x36\xf" -"\xea\xa0\xf4\xc`i\xd1[[\"O2\xf7Ie\xd9\x7f\xd4\x81\x5\xf4:\xd7M\x8\xb0\xb2\xbe\xef" -"\xbc\xb3\xd3\x1\xda\xbep}\xa2(\xe8\x2\xc2'4%N\xce\x98\xads\xc0\x80\xda\xfa\x9\xdf" -"\x15\xb9\x34\xb\x84\x15J-\x1b\xa6\x99/\xed\x36t\xaa\x9a\x9e\x0,M@5;\xdf\x87\xed\xb7" -">a1\x8a\xa0\x3\xae{8\x8f\xe9\xf8\x65o\xdfW^\x19\x5\x9r}\x83\x85\xe5\xb\x87\x1c\xcd" -"\xfc\xd4\xfd\x18\x13\x80\x1b\xfd\xfds\x87H\x4!3\x8~\x98\xa8\xc6@\x83\xa4\xb9\x8Y" -"M\xec\x38\xac\x9cn\xfd\xd2o\x1e\x13\xccY\xa2\x3\xab\xd3\x88\x7f\xff\x6\x38\xc5\x10" -"\x82\xd3*2\x8c:\xac\xcaY\xe1s\xd5m;;\xf2yv\xc6\xbc\x95\x45r\x89\r\x80\x92\xe9>5\xf1" -"\x88\xe2%]L\"=]\x9f\xca\x45\xbd\xf4\x33\x12\x1f_\x8b\xdb\xc3\x84\xf1\xc0\xeb\xef" -"\x83\xa8\xce\x7f\xa1\x86\xd4\x13\xd7\xfb\xdez\x9d(\x18\xee\xe5\xa3\x5\xa5z\xfb\x63" -"[\x8f\xf6\x63_\x17\xcb\x3\xb\r)\xeb\xd1\x9c\xe2\x9c\xd9\x32\x3J<\xc\x9\"\xc7 \"\x88" -"\xf2\xa3\xa1=\x1b\xbe\x38Pjt\x4m\xcb\xac\xf7\xd8\x9a \x1x_\x12\xf3\xd8\x85\x87\x1f" -"\x99P\xae\x34\xed\x2\x8a\x98\xb5\x37\x34\x3\xbc\x13\"\xd1\xf2\xc5\x83\xa8\xdc\x11" -"\x82KB\x83\xc2\x33\xc8tO\xd5l\xb2\xf\xd6\xbf\r\xdfv\xfe\xf1\xd0\xec\xa5\xa8uZ/\x15" -"\xdf\x3)\xd0\x98\x3\x32\x83\x66J\xef\xe0\xc5\x9e\xda\x92\xbb%\xe4h\x11\x82\xe2\xc" -"\x0\x8cs\xf9\xc7\x36q\x1f\xdf<\\\xa4\x1a\xccp\xf3 \x94\x9d\n\x32\xe5\xbd\xb\xf4\x82" -"\x9d\xe9HH6\xc8\x18\x35\x42\xf1+\xec\x32\xfc\xebZ;\xfd\xbb\x1a\x19\x38\x31\xcbu9" -"\xfc\x12\xf1\x81\xfa\xb9[\xa6\x10\x37\x98!\xa9\xa0'\x91\xdb\xa3\xb2\xf1T\xd1\x37" -"\x88\xbd$\x8d;\x94i\xdf\x1\xbb\x9f\xfd\x8di\xc1\xe\x34ws\xc7\x81U\x9b\xa7\x7fP\xc1" -"r\xe3-\xd7z\xde\x64 .\xa8\x8f\x9b\"\xcc\xff\x86\xf1\xf2!t\x1cL\x9d\xe7\xeeq\x9c\"" -"8`De9H\x8en\xcf~\xec\x8cq\xf8+*;T\xda\xd1\x91\xdcyr\xee\xc0\xa5q\xe8\x39\xc7\x33" -"\xae\xbe,U{\xee\xb5\xa6\x9b\xff\xa2\x64\xd6\xf?m\x1a\xf9\xfa\xe5\xe6\xdaU\xf9\xb5" -"\xe5N)\xc9x\xa6\x86\x8c\x2\xf9\x36\xb8\x9c\x8b\x11\xca\x87me\x95\x86\x1d)?\xe9\xa2" -"P\xe7#\xa0\x97\x16\x16\x7f \xc0\xf@\xa3\xff\xab\x37\xb2\x36\xcd\xb3i\x1e\xda\xfe" -"\x96~r\xa6\x9b\x87\xf6\x9d\xb6\xe9\x8d\x32\xc9v\xf9\x44\x85uFL\x16\xf4\x36\x66\xce" -"Dv\x84\xb\x89\xc8\x80\xac\xc1Y\xe7\xea\x96#\xc9\xc4\x9cL\xae\x91\x1b\xad\xda\xf1" -"(\xe4\xe3\x36\xe4\x1b\\v\xd4\xdf\x94\x64\xf7\xa6j\xc0xr\x80\xf2{.\xa2\xcc\x3\x63" -"}j\x9e*\xc6\xd2\x8b\xca\xda,]\xcb\x42_\x99\xa0\xb7\xb7g{+y\xc4\xf5\x94x\xc1\xe0\xbf" -"\xd2J\xef\x19\x96!\xb2!\x17\x83\xcc\xc1\xb4\xdcV\xda$\x12\x3\xb3\x99\xcf\xbc\x46" -"\xa8\xc\xd1\xd1r\xc2Zv\xb5]\n\x7\xc\x0\xa1}\x9e\"\x0\x19\x12\x1c\xf0l\xee(m5\x82" -"\xfa\x2\xf1Kl\xe\xd7\x8a\xe5+\x96\xfg\xd6\xd5\x33\x1cNo)\xc5\x1a\x14\xb4\x1qHt\xd0" -"\xdf\xe0\xfb$\xd2\x64\xe9\xf7\x5\x81+\xc6{cJ\xd5X\xec#G5Vb\x3\x19\x9d\xd5X\xfeR\x97" -"\xcf\x1c\xf5\xcdT\x92\xc9\x30V\xc5\xe0\xa7\x12&H\x1f\xe1>[\xba(\xb1\x13\x94\xfc\xed" -"!1\xee\x45\xef\xb3~\x12\xf0\x63\x83R\xeah\x8c\xc6\x88\x1b\xd1\x82\xd9\x9L\x88U!\x11" -"\xbf\x87\xf8\x8e\xbb\xa5\xae\x96y5L\xdal\x88\x88\xb1r\xd4\x66\x35\"\xf\xb9\x84\x95" -"\xb2\x64i\x0,\xb0WZc`\xc4\xb6\x90\x96r\xac\x6\xf7\xe\xc5\x88\xdf\x11{\xea\x7^\xc8" -"\x9e\x86^Wz\r\xef\x15\x80K\xad\xb8\xd4.\xf5\xc6\xd6\xfbp\xeb\xfd?I\xa5\xb2\x18\xbe" -"\x90\xda\xcbz\xb6%\x35;\xd5Nh|F\x17\xfc\x10\xa5\xd5\x1\x7X\xc6N\xa0\xd6X\x1fO=O\xcc" -"\xb7\xb9\xc\xa9\xc8\x85\xb0(\xd2\x9f\x83\x8aR\xad\x11R3\x10\xa8=a\xa7>r\xa9\xb1." -"\xe9\x41\xc3y\x6\xe3{^?Z*\xab\x32\xf4\x10V\x1f\x36\x82\xa8\x1c\xcf\x95\x9e\xc6=\x96" -"\xb8\x9f\xdf\x96\xa7\x8a\xb0K#nP\x5\xba\xccyt\xf7\xc6.\xea\xa2\x45\xac\x41\x95\x8c" -"\xa8\xfe\xa6\xad?\xceS9\xe1s\x9aS\x12yd,\xeb\xa4&\xeeM\xda\xf9\"'\x11R\x8LL\xd0\x8e" -"\xde\xf5\xe\xdb\xfa\x39\x9d\xe4\x97(D\xfb\xa6\x82\x87\xdf\x1a\x1d\x98x7t\xf7\xb\xa7" -"eZ\x9f\x89\xd6K\xab\x11\xad;UE\x9d\xb4\xabvc\xe2\xad]\xfcx\xbe\xe4.\x88z.v\xb5\x11" -"\xa1Y\x81.H\x91Y\xac\xca/\n$\x9a\x41+\x1e\xe4\xa9\n\x46\xdc\x9f\xf8\x32RZ\x9b\x9" -"\x13$J\xc3\xceY\x93\xe1vt\xd1\x66\x5\x63\xc6\xd5Mf\xb5\xdd\xe6\xb6J\xa7o\x0?\xf3" -"S:F\xeeV\xbb\x91;n\xfe\xe\x9d\xa6\xfaNS\x19\xb6\x7\xd5>\x9d}\x96\x36\x80\\\xf8\xc3" -"\xb3\x94{\xf1\x95\xea%\xcd\xe5G\xb4\x45\n\x9e\xb8\xac\x84\x14n\xf5Mv\x93!0a\x89{" -"\xc9n\xd8!\xfaW\xc0\xbd\xa3$O\xe4\xa1\xee\xa3\xde\xf6y\xf4^\xf9\xf6~\x10\xb5\xde" -"\xcd\xd3\xe4\xbe\xc8\x97\x1\xf5S\xbbK\xccmM\x1e\xf\xb8\xc9\x9\xb\x96\x61\x19`Y\xb1" -"\xbf\x1a\xbf\x1b\xe0Mkt\xa5\xccW\xe4\x9q\x88I\x11\xf4R\xc3;X\xcb\x4\xf2\xc6\xfe>" -"\x1dq\xbf\\\xb1>u7\xd9\xfame\xea\x93^\xd5\xe9n\xf7#c\xbfx2*\x8f\x87\xbfz\x11\x8a" -"\x9d\xebq\xb7\xf2\x46\xaagl\xdaR$\x9t\xe6\xe9\xda\x44\xd6\"\xe4\xf2\xa4=u\x11\xb8" -":\x1&\xb2\xb9-\xb\xf1\xb0(v\xe5#\xd9\xd0\xa4\x92\xb5\xa6=\x96\xb1\xf4~\x96.\xe7\xac" -"\xa6\xfb\x9d?\x9a\xecG\xad\xc5\"\xda\xe8\xaaq\x8b\xc5@\xcf]p1\xa7\xd3\xd1o\xfo\xf3" -":\x97h)\n\x90\xa5\xfc^h\x95\xcf\xf9\xdb\xab\x42\xa7p\xbd\x11\xb7\x87\xb5\x7\x8d\xb3" -"\xde\x91\x7f\x92<.\xb6\xea\x11\xe7\x61\x36\xa8\xbe\xe3n\xb7\x84x\x8e\xa3\xe2\xb9" -"\xd7\xbe\x95\xe6\xd4$;\x16lILKuLm\xd1` m\xba\xf3\x99\xaeI\x2\xd3\xdc\xa7\x42Om\x1e" -"|E]V #F]\n\xa9\xde\x46\xb\x18\x66\xd7\xa5+Z\xf7N\x92=/\xbbI\xc4G\n\x9e\x18I{\xd3" -"2\xf3\x65\x88\x6\xed\x19\xc6\x7\x7f\x4l]\xc0\xd0\xbc\xcc\x1d@\xdd\xd2\r\x1d\xd3\x66" -"'\xd5\x39O\x9d\x38\x15\x9c\x84u\x1b\x35Z\x8eHuLm\xd1` m\xba\xf3\x99\xae\x46\x9b\x9c" -"\xc7\xbd\x8e=\x14\x14y\xa7\x1*\x4_\xf7-Q\xa4H\xfd\xff\x39\xd7\x8b\xe6\xff\xc0\x46" -"\xe5\xcf\x7\x64L~\xd0\xa1\xb8\\\xc2\x39\x8d\xf:\xd5\x42\xd1\x10=-\xe1\xf3\xb3\x41" -"\xbe\xc7\xd2\x86t\x96\x1fk}1;\x85\xf9\x8\xf2OM\x18\x8\n\xb2\xc4la\xf2\x15U|\r\x81" -"\xfd\xa6vuR\xc2\xb\x3~\xb4\xc9~9\xddQ0\nT\xcf\x30\x1a\xf3\xae\x93\xdd\xf\x95\x8d" -"B*X\xe6h\xe9\x1e\xb1O\xb2\x95\xd6\x92?\xfd\x65\xa2\xda\x9a\x88\xfa?\xe7\xf9\xad\xe3" -"\xd7\x33\xf9\xee\xb5J\x12z\x12\xf0\xc7\x91\xd0\x9f\xb1/\xd0&\xe0\x9a\x82\x32\xca" -"\xbe\xc8\x9a\x8f\xf3\x90\x84\xfe\x11\x17\x95Q\x8e\xc8\xbe\xab\xcb\x9e)I\xd3\xc5\x84" -"V\xff\x16\xdd\x18{\xc9\x6\xed\x19\xde\x8fmj*c\x9e\x1f\xd6k\x2\xc\\\xa8\xe6\x9a\xde" -"\xb7\x7f\xc5\\\x84\xadX&\xb2\x91\x9e\x9\xbd\xd9\x9aS\x7f\\\x92\x43z\xa9\xad\x18~" -"\xce-$])\xa9\xa0\xd5O\xf6\xecxA\xbb\xe6\xd3\x9d\x1e\x6\xb6\xce;\x19\xea\x98\x82>" -"\xc\x31\xa1\x8b\xc5\x64\xdd\xe2\x18\xb9$\xe3\x8b\xafu)\x92 \xb2\x81\xca\xbe\xc\x94" -"\xb@M\xbc\xf5M\x19\xec\xd6\xf2.\x99\xe9\xec\xbf\xcd\x8a^\"])\xd4S[ \xe4\xfbi\xb6" -"f*:\xf1>\xc3L\x1bX\xb8hJ\xa0\xc7\xce\x8d\x84\xf6\xe7\x11SHa2\x8a^Fs\xd4\xbdl\xd0" -"Y\xa1j\xbf\xd8\xe1W;\x9j:\xaa\xea\x32tGO\xb3\xa9}\x7f\xfb\x16x7\xa3}\xf2\xbbi\xf4" -"\xd5\xc3\x1a\x1b\xc9\xf\x7\xb0\x45\x8e\xf6\xc8^Q\xcf\x61\x63\xa4\x9\xd0\x1fgQ\xa9\xb5\x1b\x1f*q\xa1\xb9\xa4\xfd\xd1\x91R\x7f" -"\xed~%\x16\xc9^\xbf\xf0\xe7\xc2\xce\x92\xc5\x3\x99\xe1\x83\x86\xed>\xe3\x9aH\xb2" -"\xda\x92P\x13\x89\xcb\xc1\xf6P\x18\x41\xe8g\xf8\xb9\x15\xa3\x34\xa0\xab\xb7\xa9+" -"+\xe3\xaf\x10\xde\x37\xcb\xa4\x82?\x93,'y\xc3\xb0\x8\xaf\xb6^\xc0>\xdc\xec\x84~A" -"*\xf7x\x7fp\xc7\x9a\xc8LX\x1N\x8d\xe\x41\x64\x46\xb3jP\xc9\xe6\x17W&F\x8d\x9f\x39" -"\x9a\x18\x61\x43\x1a\x8b\xd3\x11\xff\x5gr:\xa3_\xbb\x65\xb\x17\x36\x63\xba\x31\xbf" -"\xf5X7_t\x3\x46!k\xff\xd4r\x98o\xf3{\xeeJ\xa3gVE\xa8>\xab\xe1\x85:\xa0\x61\xfb\x36" -"\x14\xb7\x8c\xc7\x80\xa4q\xc3\xc0\xf5\xda\x37\x8c\xa9\xc\xe6\x7f!${\xc1\x5\xa3\xbd" -"NJ\xff\xf4\x39\xfc\x15\x8b\x9a\xa9\xf\xd0\xe8P\xb1P\x83U\xbf\x1R\"Z,\"\xaf\x9e]\xed" -"\xf0\x38\xf2\x8a\x11\xa2\xa5S\x12\x8c\x94P\x86\xe8KJ\x14\x66\x17\xe9\x5\xa3\xa1o" -"\xaaH]jWI\xa7\x6z\xec=-\xef\n\xad\xa7\x43o\xb1\xe1\x85\xbc\x66\xd0\xe3\n{\xb3:\xf4" -"X\xe6\x5\xec\x97\x8d\x14\xb6\x18\x1d\x8d~\x9d\xeb\xe2wQ\xa6\xf5\xfa\xc1\x15\x94\xf6" -"`\\\xbe\x63\x8d\x9a\x98\xabl\x1c?l1%\xa5}\xc5QX\xdb\xa2\xbdM6\xfe\xbe\n\x85\x90\xe8" -"\n\xfc\xbb\x13@\xc5U:f\x8e\xf2\xd6\xf5\xb4\x30Z\x9d\x8d\x38\xaf\xbdWY \x9f\x9e\xb9" -"\xcd\x1c\xee\xf\xbe\xcem\xe7\xad*\xaf\x9m\xbeG/\x83\x38\x9dt?\rz\xad\xc6t?vF\xf7" -"\xbf:\x9fs\xa2:C\xf3}G\x1a=m\x12\xde\x84\xe8=,\xf5\xb4\x1e\x84\xf1\xac\xc0\xcb\xc4" -"\xcdR\xd0\xce\xc7\x38\x8f\x34\xea\xd4{Ei*I\x18\xb3\x65\xeb\x9fn\x81=\x92#\xa9_\xec" -"\x8d\xe3\xd3\xed~\xc8R'\xf8!r\x12\xbe\xc2\x18\x93\x5?t\xe6R\xba\xe9)\x9ep\x9f\xd2" -"[\x9b\xcb\x82\xe8`\xc0\xc5k\xce\x1fxq)b\x8e$\x99\x13\xf\xe6\xefvA\x8e\xda|\xc6H\xd7" -"i\xc6\xf5I\x84\xde\xa9*\xf4wn\xba\xdb\xe1\x61\xd1\x80\xda\x9e_=e\xca\xc4\xa7\xa4" -"\xe\xc3\xa3\xa7\xc2SX\x15\x97\xb6\x9eu&\xf3\xe1\r\x61\x9e\x61O\xc-\xc4\xf6\xfe\xba" -"7\xc1\x95%\x18\xfe\xc1\x1b\x39\xfb\xd1=\xdc!\xfd\xec\xca\xaf\x95\xca\x8f\xb8\xd7" -"\xd6\x8\x9e\x1b\xcf\x9bWM\x9d\x8f\xe5\xc2Z\x82\xa0\xb6\x8b\x90\xf1@\xb9\x34\xebX" -"Z\xf7\xbc\xf8\xc8\x8f\x9c\x1c\x1a\xddt[\x2\xa7\xe1\x9d\xb4@w8\xa4\xed\x92\x8c\x83" -"q\x80\x5\xa4\x1\xb7zVb+l\x8d\xcb;&\xcb_\x5\xec_\xba\x7f\x85\xb0\xa6\xa8\x1a\r\x8e" -"u\x88\xe\xf3W\xd7\xadU\x12\x92\xd3|~\xea\xbdr \xafq\xed\xf2gv\x5q\xcd>9\xaf\x32\xb" -"\xbf\x13\xc9\xdd\xd8\x5>\xf4\x1c\xc8\x1e\x42[2\xdb\x2\\\xc6\x66I\x5Z\xe1\xc6\xbc" -"F\x8b\xdc\xd6\xd6\x9d<\xe3\x34\xd0\xb7\x8c\x45x]\xfbp\x9f\xf9\xa7zF\xa8\xc6`\xf6" -"\x84\xd6\x1b\x36\x43\xb2\xbc\x83\x8bn\x98=IP\xae Cas\xe9=\xb3r\x17!To\xce\xa7\xa2" -"C\x90$\x5\x13\x0\x6q71;$$\xe1\x62~\x5\x35\x32\xbd\xb9\xca\xeeQ\x9e\x9d#\xedg\r-^" -"\xf3gO\"]Q\xe1\xed\x8e\x8,_\xc9\xf5\xf9\xb9\x34\xc0#\x8c\xf6[=\xd3\x64\xb4\x66\xb2" -"\xae\xae\xa3\xd3$\x1cY\xc9\xcb\xd3\xeb\xf9\xea\x9a}\xfa.\xea\x9b~\xe8o\xf~%l\xed" -"\x10\x99\x37Q(aP\xe6\x63X\n\xbbT\x11G\x83[\x9f\x14\xb2\x1fR\x89\x99\x16\rI-\x9et" -"\xb0\x1bU\xda\xb2\xc2\xe2\x64?_ \xb0\xf4\xecN\x8a:-\xf4z8\xfa\x1d\x36\xd7U/\xfb\x34" -"\xc1\xd4\xc8\x15.)\xb7#U\x8\xe0\x1fy\xd4\x1e\x1f-\xba\x80~L\xf4\xa5\xfc\x87\xae\xf5" -"\x98\xec\x7\xf4\x32\x1a,\x17\xdb\xcb#t\x8b\xba\x86\xa2\xac\xda\xe6\xb9\x30\x86\xa2" -"\xe2mR\xb0\xa1\xf\x83\xff\x41\xcd)\x1a\xd0G\x1f\x9\xe6*y\xbbu\xe1\x8eh\xb\xe6m\xa6" -"\xf3\xb2\xa5j\x8f\x61\xcd\xc1\xdf\x9c\x7f\xad\xd0\x81\x43p\xdd\x82\x64\x8d\xb1\x61" -"\xd8_\x8b*\x9a\xeQ\xde\xba)z\x12P\xde\xca\x1a\xf6\x94M\x89\xb7\xfb\xa2\xf3\x13\xef" -"=au}\xfb|(\x1w\x8f\x39;#\x83\x98\x9f\x16\x17n\xee\x1ai_\x96~\xfe~\x4\xeey\xed\x93" -"j\xa1!\xabG\xaf\xc0\xf0\x80\x99\x11\xa2\x90\xa0\xfc\xaf\xd2\xb0\xfbl\xfc\x5\x9e\xd1" -"\xb7\xf7\x5\x13\xa4\x94\x10#$\x13\xc1\xdc\xb6\x7\xa6h\xcc\x18\x4\x37\x62\xef\"M\xcd" -"\xd7\xb5\xd6!\x1a\xc2(e\xe\x46\x7\x36}O\xb1YY\xb8\x12m\xec\x17Pa\xa3\xca\x7f{\x1" -"\xdb-\xd7-\xfbVun\xcey\xfa\x61\xa7\xc8\x45\x33j\xc4\x12\xbd\xa4\x34|X*o^%\xc9\xce" -"\xcb\x66\xb6\xd0(R\x8f\x61\xf0\xb7\x7f\x1b\xc6\x3\xd2\r\xc1\x4\xc9\x46/\xcd\xeb)" -"\n[\xf9\x63?\xe6\xa2\x92\xb5 \x98\xf8P;\xed\x17T\x8c\x5\xd8\x36T?s)\xdc\xdd\xb5\xca" -"\xd7\xf8\x9b\xf2m\xde\xfe\xb4\x91-,\x1b;\xd4\xf\x92\xaa\xb2\x1a\xe6\xf\xe8\xc3u\xb9" -"`\xf9\x9eI\x9a\xe1L\xb9*]\xda\xb8\x8~\xf4\xd4\x1f\x44P\xa6\x80\xc4T\x9f\x33\xf2\xb6" -"P\xda\xbb\xe\x6\xf4\x18\xfb\x62\xbb#L(w\xea|Vn0\x17\xb0\x8c\xb4\xc3\x81\xca\xf9\x84" -"\x19\x1b\xa7\xdf\xa4\xe9xJ\xb4T< \xa1\x83.c\xd0\xf3\x62\x44\x8c\xd2\xeer\xf9\xa4" -"Z\xc\xd7H\x1\xdf\xb3,m\xf2\x8b\x83\xc2\x18=\x13\xd3z!\xfe\x8fU5NB\n\xd3\x34\xe5\xe3" -"l\xa1\x13\xa1\xff\x16\xbd=\x14'Q\xb5\xc\x12\"T\xe3\xbb\xdc\xe4\xff(\x85\xd2\xc5\xe4" -"\xd6\xa5z7\xb3J%\x93\xf5\x1dj\xd8\x9c\xc2%\xdfk\x84\x65\xf5{l\xd0\x34\xce\x66\xe5" -"\xe8o\xfe\x88\rP}r\x93<\xe7\xc9\x39\x64\xbe\xcf\x15H\x1d\xef~d\x9eJ\x1c\xf9m\xex" -"\x17\x35}\xfa\x81\xba\xc3\xb3\x35\xe5\xeb\x95\xbe_\xe'\xaaQ\xbe\xd0\xbbG\xd5VA\x7f" -"\xd0\x7\x9d\x64\xba\x14T\xff\x95\x31\xc9\xb0\x90\xeb\x64V\xa8\xe5%\x44\xc1\xbf\x84" -"\xa8\x41\x87g\x1fl\x18\xf7&\x91\x62\xbd\x0#\x85\xdd`\xdc\xbd\xe7\xc5\xfei\xc3M\x0" -"K*(Ed\xa9\xcd\xe4\xe3\x88~\xa7\x8dV\x98\xbay\x1aq\xf\xbe\x92\xc7\x98\x8b\x36\x1a" -"3Re\xc7\x7\xc2\xf0\xeK\xaa\x38Uy?\xe2y\x8e\xe5\xf3\xc1\xafqry\xed\x9d\x86\x6\x64" -"\x99k&\x9U\x6\xbd\x99\xc8\xa7*\xe7\xeb\xb4Z\xd7J\xf4Mk\xa4Z$\x1\xc1\x95\xe4O\x1a" -"\xeevt4\x7\xa1.\xd6\xbb\x80p\x1eh\xa2\xea\x2\xf0\xdd\x1a\xf6\x32\xbY\xec\xa2\xc5" -"\x1a\x38\xf1\xcek\x8d\x1c\xda\xdem\x9at\\!\x9a\x31\x1d\x64j;\x6\x9c\x44\xdc\xd2&" -"\xf4\xec\x7\xcc\x1b$\x9f\x65\x1f\x1a:\xad\xed(M\xdf\xc8\xb8\xf8\xeb\x33\x37\x1aR" -"(#\xfe+\x92u\xe2\xec\xfG!R*\x7\x4v\x2\x5\xe8\xb9$\xef\x1c-\xf0\x9e\x43\xe3\x98Z\xc4" -"\xd3\xd4\x96\xe\xf1\x9c\xbcv\xa7zv\xabG\xe4\x1b\xe9\xcc\xd0\x32\xedp\x81<-J\xf6\xf" -"\x91lQ\xf\x9d\xf1|[\xb5w\xff\xd1\xcd\x9c?X>\x8b\xc0R\x8b\x87\x87\x46\x38\x62\x12" -"\x85\xdfUM\x1f\x8b\x16\xc4\xd1\x18>q\xa2,w,6-\xbd\x14'\x98\xc\x0,<\x1\x12\x6\x1e" -"\x8e\xe4\x85\xd1\x9a\x2\xco\xc\xaeu\x19M8GX^\xfa\xcd\x14\xe2\xa1\xf5\xcd\x1c\x8d" -"\xe\x9f\x43^\xdb\xc0m\xb6?\x1d\xcc\x42\xb6\xb8\xf3\x81\xd2!\x91\xfb\xft\xe3Os\xb1" -"\xbe\x39\xb6\x1d#\x1f\xe7#1]\xe7\x7\x41\x33\xb1\xe4R\x9\x3\x31\xec\xa0Ol8>\xab\x13" -"\x7\xcd\x90\"\xab!\xe9vC\xc5\xff\x32\x96\x61;\xc3\xcc\xd8`\x1f@ex\xb6yz\"\x8a\xcf" -"fcy{zu\x92\xb6\x65\xfd\xb2\x83(\x98\xc9[[\x81O\xb3\xe4_g\x8e\x37\xb7\x9\xa2:]\x88" -"\xc9\x99\xb8\xeeG4\x8d`\xe3X\xf7\xcf\x8e\xe7 i\xa5#\xd6\xc7N|\x16\x92\xdd\x17\xed" -"\x1c\xc4SZBcoSO+\xe5\xc3\xb2\xb1YB\x99z\x9b\x12\xdd\xfc(\xd4O!]\xb9\x14.1\xf1\x98" -"\xc5\xe6\xb0\xd2_\xb2\xeaw\xbc\xf\x9c\x8c\xa4-o\xf6|\xb4\x2\x33\xe8\x39n\xd1h\xb9" -"\n:\xe5\x80'\x94\x46\x65\x4\x9eT\xf2\x91\x64gn\x9e\xfe^Q\xe9\xeb\xb\xe4\x93\xde>\xe9\x1c\x45\x61\xb9*" -"\x5\x7f\xb0>\xd4\xf0\xdf\x61\xe\xe4\x7f\x89\xef\xd4\xb1\xb0\xe1\x86\x9d\xff\xe2\xcd" -"U\xf0\xe0Q\x4\x1c\x9" -"\xaf\xc8G\x15o\x96\xd9\x45+\xb8\xe1\x87\x85\xd8\xc7\x83\x13\xe8\xab\xa3\x85,\xa8" -"\xdc\xcf\xc8\xc8\xa6\x9d\x42\xfc\x9e\xb3\x66)n\xf9\xf3;BX+\xeb\x9c\x7f\x2\x1b\xc6" -"\xc9\xd2|\xd1\x9a\xd3\xd8\x8e\x19\xe8\xb8\x30xi\xb8'/\xcb'\xb1\xca\xfd\xce\xb9@\xd8%\xf9\xb7\xbe" -"\xb7\xea\xa5\x16p\xdb\xcc\x38\xde\x9e\xe3\xb2\x87\x92\xe3\r!1\xc8\xf2\xf4\x7fy\xdb" -"l\xa4\xb1\xb5\xe2\xf3\x6>hjma&p~\xff\n`\xa8\xb7\xca\x85\xb\x9f\x8f\x91\x41@i5O\xf0" -"\xca(WC\xb3\xfb>p\xaa?>X\xce\xc9\xd0\x1c\xba\xb8\x62\xd1\x85m,\xc6Y\xd1\xb8P*d\xb3" -"\xf9\x89-\x1\x8dp\xc=\x92\x3\xb\x11KR\xe\xe2\x85\xff\x17\x66\xdb\x12\xc1\xfd\xc5" -"`\x1c\x15\x34\\m3\xa3\xc4\xa9\x94\xe3kBz\xccs2f%\x96\xf2\xd3o$\xae\x18\xc1X \xd0" -"\xfcS\xe1\x65\x92op\x15\x99\xa3\x91&3\x12x\xe3\x1f]\xd3\xdd\xdf\x8b\xbPJnM\xbd\xd4" -"Sc\xb\xea\xcc\xe7%\xde\x85\xee\xc-\xd7YDJ\x15\x7f^u\xc6Q\x88\xad\r\xecq\xd7\xcaS" -"\xfa]\x8fm\x1a?\xf6Hc@\xd8\x1e\x37\xd8\xcd\xd0@\xfT\xfa\xaa\x35\xc\xbc#.b\xc7\x95" -":5IW0\xdb\xa6(i\xa2|\xa0>\x85\xecZ\x1\xb9\x8H\xa5\xad\xcc\x95u\xfb\xe`\xc3\xd2j\xde" -"-r\x88l\xeb\x35\x61\xaf+;\xb1/.\xff\x93X\xd3\x13\xcd\xce\"\x8a\x46\x8d\xa5\x66\xf9" -"Za\x98p\x0r\xc\x62\xab\xd6\x7f\xb7\xb9\xcd,\xb5\xd5\xf7K\xe8\xe0\x91\x9d\xcb`\xa5" -"6K\x17\x35\xd3\x1f\xb3\xfd\xb5\x9f\x9c\"\xf0\x62/\x8d\xf3\x91)L\xc/\xed;\xcd\x18" -"\\\x9d\x93/\x9{\xcb,\x6ko+Ta?0\xee\x99\xcf\xe0\xb3\xb7\x8\xcf\xdd\x5\x65\xba\xdf" -"n\x1e{ A\xcf\x1n;:\xd1\xa5\xc0;\xe3\x31`3\xda\x9\x1c\r\xa1ts\x92^y\xe7\x8f\x8a?H" -"\xee#H\xb2\xa5\x1c\xeek\xdb\xe2\xa2\"\x44\xb3\xff\xd8\xe2\xf1\xf6\xeb!\xa3\xaf\x0" -"\x1d\x14\xe8\x95N\x80Y\x89\x37\xec\xaa\xd0\xfe\x81\xa0\x30&\x9f\x9a\xeb\x13\x43P" -"\x83m\xa4-\xf8\x1f\"\xbf\x35TM\xaf=b\xff\x87\x1M=b\xeaXhn^\x18-\x93\n-\xc3\xfa\xc2" -"X\x8bI\xb6`\xa2,:U\xbf\x8c\x99\xde\xc4\x36\x9d\x1dg\x82\x10\xdb\x13S\\\xf\xb3\x46" -"\xf0\xcb\x9a\x8c\x35\xb2\x96R\xe7\x63\x30\x8v(~\xd1\xbd\x8e\xe4@\x8dXo,'\xf3\xc1" -"\x1c|\xae\x9e\xb1\x11;\x1\xd5!\xa9\x1b$\xc5.\xd8\xf9\xe5\xe1\"\xb1Y\xfarG\xaf\x41" -"\x9a#x\xea\x9\xa5\x9dr\x14s\x96\x37*}\x1em}S=\n\x9\x39\xce\xc9\xa2|k\xac\xc9K\xf8" -"\xeb\xa6 \xa1\x4\x83\xb0\x9c\xa3\x10\xca\x41\xa6\xc2`n )\xf3\xec\x1e\x61*\xfc\xd9" -"\xe5\x30&\x80\xd1\xfc\x8\x8e\xa2m\x83U1\xf1W\xe9\xd4S\xc\xc9|\xac)\xd0\xde;\xb8y" -"\x97\xe\xb3\xd7\x81\xa2\"\xb0\x6\xb0\xfa\xe9~b3\xfcG\xd7\x1f\x1a\xb1\x94\xe6r\xcc" -"Qc\xc4\x5.\xeb\x88\xa3\x1a\xb3\xa3\xf9\xa5\x9f\x82\x15\xccr\x9e'\x1e]\xb5\x0\x36" -"\xb8\x10\xcd\x95\xcf\xd9\x82h\x84\xaek\x1d\x9e\x97ttz\n\x9d\xf0\x39\xa7|z\xc8\x34" -"\x6\xb9\xd2:\xf7\x96\x41%PRM\xf4\x8b\x18\xac\x8a$\xe3\xc7\x9c\x46J%?\xe3\x32\xa3" -"\xc1\x83\x99\xfb\xac\xf4\xe2\xa0\xc6o\x15,\x9f\x89\x95zb\x8b\x35\x90p\xc7s\xeb|{" -"\x8tP(\x82Z\xfa\xb0[\x9 \x89\xa5\x98\xce\xeb\x34\xa1\xf4\xb\xcc\x61\xe0Rp\xbe'\x9e" -"P\xed\x91\x3\xf3\x13\xa0\xea\xb8 \xf0S\xb5\x36i3\xe\x8fn\xef\x45\x4\xa0]\x8\x17\x83" -"U\xf2\xc5\x16,\x1\x6\xa4\x66\x17\xcd\xb\x42O\xc0N=\xadn\xa6k\xf3\xf3\xaa\xbc\xc6" -"<\xd5\x4\xa4yzv\x98\xa4\x86\xea\xf5\"\x4\x45\x7f\r\x14\x96\xd6-'\xa0W\x17\xb2;\xab" -"\x14\xf3z\x80\x82\xbf\x9b\x90\xb8\xbc\x82\xb1\x9f\xd9\x84\x4\xd9\xac#\xacs\x8a\xf0" -"\xe6$\x80\x86\x13S\x8d\x34\xf0\x1\x1a\xe7u\xad\xb3\x61\xe3\x30\xdb\x97W\x13\xb6r" -"\xe1\x6\"\x8d\xaa\x1cg.\xee\x18\x83\xb3\xa4\x89\xe9\xf3u\x14>\x95\x63\xd6\x8d\x17" -"u\xba\x15\x13\xe7y\n|\xa7\x46\x80\x11\x42\r\xbe\x3\xf3r3\x9a^5J\xee\x1\x8d\xfe\xa0" -"v\xdc\x89\x62\xdf\xfb\xb4\x43\x35\x6\xa5\xbf\xc4K\x5\x12\xe8\xa8\xeb}\xb\xa0\xf8" -"\x1f[\x12\x31q\xa6\x9b-B\xff\\\xf8\xa8\x1e\x89\xa8\x31\xe0\x6\xffR\x18\xda\xf4O%" -"\xf7\xe0\x46\xc6\xb0k\xb1\xb0ww\x86R\xdc\xf6\x85RS\x12\x9a\x41\x88O\x86\xdb\x91." -"W\xd7\xc4\xe0m}\xc8\xa1\x16\xce\x65\xb6(9\x9c\xb2\x1b\xf5\xdd\x8f\x94\x2\xa5\xa1" -"\x16T\x8cVS\xa3\x8>A+S\x7f\xd8\x32Nm\xb3\xf1]\xf8>\x1\x85\xcb\x8dL_\x13-\xdf\x1f" -"\x88\x11\xe5t\x2\x9f>\xfa\x8(\xf9\">1\x8c\n\x83\x8b/\x92\x3\xf7\x7\xf2%Nd\x9b{xu" -"~\x94\x5m\x90\xf6]\xf0LG\xe7;\xd7\xf5\xccWr\xc1%?\x1f\x14\x15g\xefT5\x87\xad\xd9" -"\x7\xf2\x6\x18{a\x12\x35\xc6\x34\xc9wa\xe4\x83@w\xe6Y\xb6\xe\xe0\xf9\xd3z\xf8U`\x18" -"\xcf\x5N\xaa@\n\x82\r\x87\xb7/3\x13~\xb2\xfa;\x8c?\x8f\xeo!\xc2\x81\xcb\x94\xc\xf" -"\xa9\xfa\x0X\x92\x43\xd3'\x95\x12Z\xae\xda\xd9\xd7\xce\xba\x39\x9b\xa1Q\xf8\xaf\x63" -"\xbb\x38 \xbc\xf5\xe5\x9c+\xac^\xb8\xa4S\xc8\xeb\xa8\x10j\x5\xe6\xc8\x46\x3\xd2\xf9" -"\x16(\x87\x8a\x94\x81\xe\xbc\x9cu\xd9Q\xcbI\x16\xb4\xa4\xc8\xd4q\xbbs\x9d&\x98L~" -"\n\r\xad\xcf\x44\xaa\xcb\xf5\x98:T\xd9y\x9b )\x8c$!f\xc4G\xb8.uR\x1Ja]!\x9\x1f\x33" -"\x96\x1b[\x8L\xf7g\n`\xce\xe6\xaf\x19\x19\xe4\xd1(\xa4\xe1U\x9`|\xaa\x80 \x93\xc5" -"f\x8b\xe1\xd5\xfdT\x3\xb9\xcc\x13].\xa6\xc2\xd9\x18(5\xe4\xbe>\xd5\xc4\x84\xb9\x14" -"H\xaa\xb3\xca\x39oL\xba\xb5\xb6\xd2\x94=z\x4\x7fQ\xad\xdf}\xc9\xbe\xc7\xeeO\x95+" -"\xcb\x9\x5\x9b-\xa0\xb1\xadV\xba\x99\x99K\xad&\xeb\xda\x9a\xa2\x62kl\xd8\x81\xc6" -"\xb7\xca}\xc9ny\x85\xd7\xa4\x9c~\xe9\xd0\x35\xbb\xdd\x1?\xf8\x9b\xdb\x18\x1c\x1c" -"-\x7\x81Y\xd9\x5\x9f\xd4\x45\x9d\xc9g\xaf\x31\x31\x1\x95\xa3\xcf\x9b\xbd\xe2\x42" -"#8w?\\\xb4\xbb\xf7\xfb\x37#\x13;\xd3\x98\xa3\x9f\xcd\xfb\xcb\x88\xac\xb0\x0\x80\xcd" -"\xe1\xea\xdb\x80\x19\xf1Q\xe3\xb1\xfa\xe7h\x14G\xc9\x98z\xfbM\xf4\x65\x34\x45\x90" -"\xf4} \xe4~\xc4(\\[\xf8(\xfa;\xa2\xe3\xa3>\xbe\xb4\x84\xf4\x13\xfe\x1a\xf\xa6\xaa" -"\xd9\x7f\x90\xe'Ac\x2\xa6\xaf\xf1y&\n i\x99\xdbr\x3R\"\xb1\xbc\xd1\xee\x30\xf6\xd2" -"\x2\xe2U\x99\xb5\x36\xdc\xb1\xc\xe7\xb0\xc2\x83\xf2T<\xb7iW&t\x1d\x1aG~\xc\r\xb1" -"\xd1\xec\x8_X\xe6\xa8\xea\x91\xe0^\xda\x30\xf0\xf6n\xd6\xf3\xa7\xbeq\x17\x6\x43\xcd" -"\x5\x8e\xa6\x1f\x64\x9b\xcf\xd9\xdb\"\xa0^\x8c\xe&L\xcd\xb0\xde\x19\x8a\xb6\xe6)" -"\xacL@C(\x2i\xf0\xbe\x43\rj\xdfp\xb8\x81\xf5n\xd5\x11(W\xfa\xe\xa0\x8c\xa2\xbf\x9e" -" \x98\x9c\x12JT\xc7I\x8b\xef[\x8d\x62{\xf0\xb4-]\x3\xcc\x6?\x8e\xae\xcd\x39\x32\x95" -"gi6|r\r@C\xd6Kh\xaa\x99\x62\x82\xee\xe2\x96\xc7\xf4\x41\xa2&\xed\x81Y\xb1\x66\xe1" -"\xaa\x99m$\xac\xa6^\xce\x80\xb6t\xe9}o~9*\xd6\xbfY:\xb4\xf3\x8a; l\xa0\xcc\x31(\xd8" -"G\x84Xs\xbd\x11\xb4)0C\xa2)R\xda\xb7\x98\x35-r\xce\xfe\xf8\xff\xe0\x15\x19,\xa8\xf6" -"\xc\x90\xd3\x14\xa8\xab#\x8a\x13\x61\x3\x82\xf9\xf8\xec\x1d\x8c\x1f\xca\xfa\xd7\xc2" -"\x16\r|\xe4~\xf3s\xc0\xc5]{\xae\x9b!\x14\x87\x1\xf7\xa8\xc0\xe7\xcc\x82\xde_&\xd7" -"6=\x95\x16=\xe1\x87\xa5p\x98 \xe3{\xbe\xadn\x14\x80$aR\xf5\xcc\x86[\x81\x9d)Q+\x96" -"z\x90\x44}\x98\xf9q\xf4\xc4\xc2\x8c)y\xd0|\xb0\xe6\xec\x8d@)\xdc\x64\xaa\xe3\xdb" -"\xef\x8e\xbaW\x12\x36!&\x0\xce\n\xce\xa3\xea\x44NA\xcS\xe9\xe5\xf1\xd9\xd5\"\x15" -"\xaa\x5\xe6\x90\xfa\x34\x83\xcb\xd5\x45\x1f\x43\x11\xcd\xf\xd2?9\xd4\xe1\x6\xe6\x9d" -"h\x15\x65\xac\x1\xa6\x8$$9\x90\xcd\x9b\x3M>\xd1\xfd\xb5\xc0u+^d\xe2\xe4\x17\xc6\xb6" -"M#\xc8\xe4Z\xf1\xb4X\x96\xec\x87|-\x87\xf8\x8fOJ\x85\xd0\xa4\x7\xb1\xd1\x13\x7fS" -"e\xc\x13\x46id\x98\x6\x88l.\xb0I\xed\xd7\xf3\xb6v\xf5#E\xfan\xf9\xabJA\x80\x66\xe0" -"\x8a\x81S\x2\xf3\xaa\x8f\xfb_\xbbu\xd1,\xc3\xba\xc7\xd9\xdd\xab\xba\xc6\x44\xc2\x94" -"JDioi\xd1\x30\xe3'\x8d\x9a\xe4W\xc3\x9c\x99\x65\xe2}\xce\x8aG\x96m\xab\x12]\xe8\xe1" -"\x10\xd2\x66\xb7\xfc\xd6\xee\xf2\xd8 \xc0)\xfa`\xdd\x32\x80\x84\xfa\xf8\xae;k\xd0" -"\xf5p\x85[\xfcU~\x15L}I1\xbam.J\xab\xa5'\xe0\xd0\x98\x33L\xa3\x8c\x9ax\xed\xdd\xc0" -"\x86\xcd\x1f\x3\xbb\xb8\xe5\xact\ra@\xf6}t\x96\x5T\xaf\xe9M\xda\x9e\x1b\xd3\xa5\\" -"MY\x1c\x34\xec\xc2rw\xfb\xd6!\xab\x9d\xab|\x96\x99\xc1\x1c\x88\x1\xe\xc9{\xc4m\xd1" -"\xaa\xd6O\r\xf4,%`{U\xb8\x85\x44\x45Z\xa8r\x81\x92\x32\x37%\x8Qoq\xcf\xcb\\r\xb4" -"\xef\xdf(\xf\xbe\xe2\x81\x98\"\xcd\xbb\xeaL\xaf\x86':\x82\xd3\xf0P\xe1\x42\xe1\xe0" -"\xb8\xb6(\xe3O(\xf4=W\xf7\x7\x18I\x8f\x46\x90\xdb\xb3\xe2\xcf\xfe\xd1;\x81u\x84W" -"T\x18h\xa1M\xcs\xb9\xda\x8f\x43:\xd8\xa7\xff\x1d\x1e\xe3\x83H\xce\x1am\x95\xf6%\xc8" -"\xc8r\x87\x8c\x46\xd8| \xe9\xcd=,B\"\xd4[\xb5M>\xbf\xeb\x30\xe5<\xfag\x17\xb5*\x90" -"%\x92\\\xef\xd1\x7fy_x\xdf;\xab\xda+\xea\xe6\xb2\xc1\x99WQ\xc3\x34\xfa\xde\xcb\xa5" -"\x98\x17U\xbe\xbd\xd7`4\x87\x1e\x14\x45\x17\x1aq\xf6\x2\x82\xe6xPY\xcb@F\xad\xb\xac" -"\x98\xd5\xa1\xe5\x66\x8a/\xc7\xfc\xca;\x91Xu\xfc\xd0\xd5)\xa6\x35\xd6L\xb3\x43\x87" -"\xcd\x90\x94}<\x90\x9f=2\xc4\xeb@\xa6\xf\x30\xc3\xe1\xf8\x19\xbd\x8a\xa2\xa0\x35" -"\xdb\xc3\xdd\xb2i\xc2\x62p$L\"L:\x93\xba\x43P1lfK,\xe7\x15;\x9\xea\xd7\xd3\x9b\xc4" -"\x9dn\xf0L\x83p>\x8bt\xe6\xa0#,A\xa0*}\xe0Z\xfe\xe\x94\xda\xda\x8b\x1f\xe6 \x8f\x12" -"\xb8~\x0\xef\x8c\x65\xd5\x8b\x2\x46o\xf6\x97\xd6\x46\x7f\x66\xa0?4(NcB\xb2\x11\xa0" -"\x2%\xa6\x7\xa5V\xab\x1dL\x8c\x42\xa1\x1\xffg]\x95\x1d\xfZu/$y\xce>\xd7\xa4\xf8\x44" -"\x88\xd3\x9f\x62.\xe5:T\xc3 -N`\x17\x83'\x8\xd4\x1eS8\x13\xa8\xd6pvB\x1f\xc7n\xb2" -"\\kcs\xf4\x13\xf6{\x1\xd6\xfb\xc1\xa8m8\x1e\xfb\xd1\x44\x85\xc7\x15\x98J\x13\x18" -"\x9dw\xf7\n\xf8\x3\\\x8d\xf5\xd1\xd2;\xf2SREay\x11\xa4\xbdX\x6\x89\x41\xe0\x6\xe7" -"\xd3\x66P\xfc\xe0i\x4\x8b\xb0\xbc\xf8\x31\xd3`o>s\r\xed\xb\x87\xa8\xd3(,\xcc_\xf5" -"\xf8\xf0\xdcq\xc4\xe0\xf7\x2\xdc[\x8a\x8e\xb7\x18%\xe0\x9bi*\xda\xe6y?\xb\xd6\xdc" -"\xd9/^\xc3q\x15\x9f\r\x61\xb7\xe1t\x97wf\x91\n] \x13\xaf@&NU5\x1d\xe8\xf7\xb7\x7" -"{\x5\x89\x18\xbb\xdd\xec^M\xc7\xfdT\xb8;\n\xf4_\x11\xa7\x1a\xe5\x96\x46\x93SA\xbd" -"8\x1br\xb1\xc6K\x82G,\xc9V\x1f\x1e\xd5\xadk]\xf9@\x88Oet\xd0\x30N[\x9d\xcc(\x87Z" -"\x8a\xe9~\xf3\xfe\x34\x6\x8e.6\xfa\x46\xaa\\\xbd=\xd8\x7f\x92\xee\x8bV9\x94\x13\x0" -"\xa1\x3OP\xfa\xd4`\x2NF\xc2q\r\xbc\xff%\xe3\xd1z\x9c\xcv\x97\xe3\x18\xb1\x44\xa7" -"\x7f\n\x39\xb1\xfb\xe9\x10\xcc\xa9\xa8\xd8\x63,\xe\xf2\xc2\x85\xd5\xab\x8d\x1M\xb" -"-\xce\x8d{\x6\x89\xaf\x4I\xd1\xa2(u\xcbz\xa6\xd8\xc0;TN\x87+\xa8\x4\xad\xe4\x61\xc9" -"\xeb\xff\x87\x46\x16\x41\xbb{\x9e\x1eh\xd1:\xdc\x8f\x41\x13\xe2\xe0\x8ey\xb0\xdc" -"0\xd5\x97\x65\x81JG\xa6Kj3\x14;\x99\x94\xd4+v~\x0\xe\x44\xa1\xa7~RA\xdcZ\x94\x64" -"\x87+\x11\x93\xdf\x31\x87\xc6\x90'E \xb4lM,\x4\xd0\x42\x84\xb5\x8d\x5\xe7\x37\x8d" -"G\x1e\x34\x44N\xed\x39\x87G\xda\xe9\x17(\xb8\xb1\xf3\x9\x9a\xb3h\x8dL\xe7\xd8'\x5" -"\xa6\xa3\xdfI\xe7\x61\xf4\xc5\x9e\x7\x1e>\x1dw\x1c\xa1\xb8\xa6\xc\x35\x9b\xf0v\xe8" -"\x6\x1d\x14\x8am\xd8\x4\x81:YlT\x14\x9f\xaf\x1b\xd2\xe2]\xc4N\xc4X\xaf^&\x19\xa4" -"\x18\xc5;~\xaf\x9c\xc7_\xc2\x13\x87\xad\x8b\x7f\x8e^\x98H<\xae~\x86\x85\x38\x90\xd7" -"E\x88\xc8px\xc5\x82\x37\xec\x97\xdb\xfe\x8a\xab\x84\x88\x13\x84\x2\xcb\xda\\\x87" -"kC\xc2\x80\xef\xb3W4!x!xy\x90\x9d\xfe\xf6Z!\x97\x9c\xaf\xf8\x30gY\xd8\xb4u\xc3\xdf" -"\xd7\x18Pt\xc1\x85\xe4\"-\xebx\x1f\xca\x1c.{e\xe3\xd7\xbcx\x8e\xab\xd2\xa7\x45Q\xc5" -"\xbc\xd2\xd0v\x95\x10vs\xc8\xb3\x8cS\xcb\x42^\x3\xe4&\xe1\xd9\x88\xc4rno\xbb\x98" -"\x8e\xa2\x8b\xda\xcaQV92\x13\xa9\xcb\x1c&\xea\xae{\x95\x34\xe2\xd2P\x83\x37\xf2\xbf" -"\xa5tPJOzyF~\x97Q\x1e\xe0RXb\x88\xb2\xe0\x95\xc4\x19 \xcew\x3MR\xea\x9d\x7\xdf\xdb" -"\xf3\xf0\x94\xd7\xd1_\xf=\xbd\xaf?\xdd\xf1\xd4J\x1fQ\xd4p\xec\xfg#\xf8+\xc0\xe8t" -"\xbd\\\x8d\x1e_\x5\x30\xf6^kg_\xfa\xb3\xcd\x19\xf1\xe3\xbfj\"n>\xcf\xd2\xb5\x1\x85" -"\x90\x39_\xbf\xbb\xe5\x88\x62\x1c\xdf.R\xe1H7\x94\xc4LeH `y\xf1\xb9\x98\xbf\x31\x11" -"w-\xb5\xcb\xb8\xca\xf6\x93\xf\"Ss\xd8\x91\xe1\x9aO\xe6,\xf8\xa4\x30\x95\x61'J2\x9a" -";\xeb\xa8\xf5\x89\xbf\xf6\xcb\xc5\xa5\xd6-,\xe0\x38\xd3\xb6K\xef\x96\xb\x41\x85y" -"oPl\x9a\xdb\x7\x14\xf4w8\xc7l0\xec\xca\x61\xa0\x19\x42Mj\xd5\xed\x46\xbe\xd1\x32" -"\xb\x66\\H@\xb5\x14i/\x9ak\xd0\xf9\xa3\x65\xaf%\xa5\xc1\xeb&\xb1;\x13\xc\xae\x81\xbe\x16#\xa0\xc8\xdbu\xec" -"\xd6\x88\x6!\x9b}\xb3\xac\xf4\xe5]PB\x12\xe4s\x4\x44\x65\xa6\xf8\xbb\x66\xf7\x30" -"\xf2\x82\x41\xf3\x15\x99S\xea<\xa4\xaf\x93\x39[\xbe\x9f\x1bZ\x1c\x32!\x10~\xd4\xcc" -"\xe1\xc5\x9\xf5\"\xbb\x17'\x90I\x4\x1du\xee\xd8\x31\xa0\xf6\xa6v(m\xb0s\x9f]\x9e" -"\xfa\x13\xa8\x1c=8\xcd\xecm\xf6\x1e\xec\x1\x14Q3\x8d\xb2\xbcn\\\x16\x88`_\xab\x1c" -"\xcf\xeb\x84-\xe1\x10\xd2\x4|\xc8\x91\x38wJE\xb3\xc2\xb1t\xa4$\x1b\x99Y\xab\x39\xd6" -"7\x8d*\x1b\xdd\x2\xd2\x0)\xc\xffp\xa5\xfc<\xca\xbf\xa1\x66\x38\x1cG\xf7>>\xf8\x1c" -"5\x9d\x35\x61\xf\xe0\x0\x37\x1el\xd4\xf3\x8eRZ\xee\x9c\x2\xfc\xa8\x62\xc8\xcc\xc" -"\xc5H\xa8\x46\x92\x8bP\xe4\xa1\xa5\xaf\x19\xa7\xca\xb7\xddT\rY\xea\xa9\x30\xbf\xff" -"i\xcdg)MG\xb\xdb\xe\x1\x9\xf}\x7\x11\xff(z\xecL\x95\xf5N\xce\xbb\xef\x45\xaeh\xe0" -"{ \xe6\xc9\x66o\xb2\x35Z\x97\x1d\xea\xaf]\xew\x11G\x87\xd5ysN9\xc2\"\xa0\x14Vuo}" -"\x5\xa0y\xe7\xc7(\xd8\xae\xd3N(\xb4\xfa\xed\xb5\xe4K(\xd3\xde\xf6\xf3Q\xd4\xab\xe4" -"\n+\x2\x87\x8aGG\xb1\xad\x6K\xb4:\xc2\x94\x8c\x9d\x62\xe3\xbdm<\xa3,\x8e\x6%R\xab" -"Ah\x8e\x10\x8f\xd8\x38\xc9i\xdb\x1c\xe8\x43_\x17\x33I\xa9n/\xb\x15k\x9c}\xc2\xb1" -"\xd9\xa3\xd5yjfN\xbf\xb\x61U\xe5 \x8d\x97j\x95\xc6\xdaJ\x80\xca|\xae\x1nFo\xb4\xce" -"N\xcb\xc9\xcf\xcc\x9f\x46\xf3\x89\x46K\xa2\x1eQH\x2\x86\xfe\xf0U1\x8dt\xday\xa0\x61" -"/\xf3\x16\xdb\x41\x85W\x94U\x9e\xa7\x33\xcc\xf0\xf9\x64\x62m\xa3)\xb2\x1Ie$\x8\xad" -"7Y_\xd2\xa7\x86\x9a\xd3\x7RB\x11\x10\xd0\xf3\x1b\x39V \xb8+2\xe4\xdby(\x4U\xad\xf0" -"(\xa5|`\xcc\xe7\x32>p$\x2?\xe9\xcb\x11\xc4V9%\xc1\xe6\x93\x92\x92\x9f\xaf\x4l\x16" -"\x81;\x0Qn\xc1\xf5_\xd6TE\x95\xd1\xea\x95)\x1Z\x17\xcc\x81\x6p\x92\x41\xe3[iXl\x1f" -"\x0U_\xf\xdd\xfatj&vO\xd1\xfe\xcf\x10\x1f\x63\xc4\xf2Zu\xb2\x64\x92\x0\xfc\\w\x0" -"=\x85%\x1\x15:\xfb\xa3\xd2\xa5\xb9\r\x44\x85.\x14\xe6\xb6\x82~oqD\x81\xbd\xef\xec" -"zh\xb2\x32\xbdH5e\xd3\xa3\x1d\xe8\x61v\xb2\xdd\xf0\xa4/\xc9p\xc\x64<\xa6i8\x90\x12" -"{\x84+\xa5\x9\x99\x8\xbe\xd8w\xd2\xa2\xbf!\xb6\x9e\x1f\x9a\xca\xfei\x1f\xa6\x84\xf4" -"\xe\xfa\x7f)\x7f\xfI\xb9\xb2\x8e\x64\xfd\xb3x\xe0\xe6n\xe7VqB\x96\x9c\\\xb9/\xe9" -"\xf\xa1\x90[\n\\5J\x14\xed\xf7\x5\xb6.\xa0i$\x8bm>~\xef\x1b{&\xd2\x65ua\xa4\xda\\" -"\xb3\xd2|\xa9\xbe\x8c(>#\xa0S\x1c\xbc\x99\x92\xeaX\x9d:9\xa6)\xa9M\xcf\xda{\xfa\x3" -"G\xc8R\xa3\xad\xa2\xd6\x31\xa2\xf7M\xd1\x9a\x7f\x96\xa2=a\xa7>r\xa9\xb1.\xbe\x45" -"\xf3\xc0Q\xf7\xa1\x0Q}_\x1e\xd4<\n\n\xc5\x96\x1f\xcb\xc0\x98\x7f\x91\x91\xfa\x17" -"\x8a\xcb\x9d\x15\xfd\x97\x17@\x95.h\xea\xcc\xbd\xd7\x8\x39kkk9\x95\x97o\xd8\xa5q" -"\xe5%>\xe8\xcf\x1c\xc3\x1a\xf5#\xdd\"=\x13\xd4\xae\x62\xe9\x32&\xd8\x34y\xd6\x43" -"R\xd7\xa5\x17s\xbc\x12:X\xa2O\xc1\x19\xb:\x2\xcc^\xbd-4\xa4\x2@\xb1\xddwZ\xb4\xdd" -"\x90\x41Y&\x4\xec\x1\xd5\xa9m\xe6\x12\xb\x37\xcfg*\xa9\x12\x42 \x3\xffO\x93\x8e\xe5" -"q\xb9\x8d\x19\xc\x9a\x43\x61;\x11'\x9dXo\x9d@\xa0\xbf\x94\x2Qa6:\xf5%\xa2\x43\x2" -">\xed\x30\x84#\xd2{\xd6$`w\xae\x64\xd3\x86%\x44?\xd1>x\x91_\x88\xe2\x84\x2\x10\x9" -"V\x8b\x9e*\x9\xd9\xf7P\xb9.\xb5\xb4\x8a`\xd1\xd9\xae\"{\xa4|\xb6\xfeI\xb1\xc5\x1b" -"\xffZy}\x8\x7f\xe6\xc8\x45\x84\x65\xcd\x33X\xbb\xdb\xb5O\xd6&<\x1a\xba\xc6\x97\xac" -"8\xft\x17\xdf\xe2Sf\x2\xf0\xa7o\xact\xc2I.RO\xb7\x43\xfb\x61L\xc4\x9f\x82\xbfY\xfe" -"\xe5\x42\xa6\xde\x34\xc3>\xbd\x13S\x18h\xe\xc1Kw\xbdr\xb0\xa5y/\rPQ\x98\x13\x38\x84" -"\xe3\x46\xd3\xd3\xa8\xda\x17G\xa5\xe3\x41\x35\x63\xacu\rm-c:\\\x90\xab\x13k\xf0\xf4" -"\xc4\x1e\x19\x0\xe1\xdaUUpym\xd7\xc6oO\xbc\xf\xde\xef\x0\xe7uD\x90\xd5\x89\xccL\xc2" -"W\xfc\x43w\x6\xcc\x10N\x0\x90\x34(\x1d\xa8\x1et\xfb\xcd\x8c-\xde\x35Y\xa5\xebY\xa6" -"q\x92\xbc\xa9\xedI\xff\xc4\x9b`Z\x9d\xac\xa1\x94\xea\x2\\Q\xc5\xec\xbc\xb3\xa7\x90" -"\n?\xbfM\x1c+\x97@\xfavw\x4\xedu\xc3\xb5\x8c{\x93\xa5\x35\xbf\x43\xfa{\xe\x1e\xe" -"ikl;\xf8\xfc\x89\x5\xf4\xe5\xee\xd8\xc#\x9b\xd1\x9c\x95\x34\x92,'\x86\xc2\xf9\xff" -"\x18\x1\xd2\xe1\xe0\x89\xe\x1ana\x91\x8aL\x90J\xd8\xf8\xb7\x9e)|\xf2\xbe\xae\xc8" -"z\xfb\xac\xa9Q]\xc9\x87\xe2\xdd\xdc@\xf2\x1cZp\xd2\xa9=\x8d\n\x62nna\x84\xa2\xcf" -"\xe8_\x86\x63\xb\x3\xd2\x37\xd1R\x95\xc3\xc5\x4o{\xd5\xa2OY\xa8\xbc\xae\x80\x90\x9b" -"\x96\xeb\xef\xdfl\xe2\xc5\x82;\x13R\xf5\xa7j\xdf\xb8jf\x93\xcc,\xb6T\xad\x9\xcf\xab" -"\xa6\x8e#8\xf5\xce\x11v\x4\xfc\\\x3u\x12\x85~C\xac\x9\x7f\xb0$\xccQF)N\xa0\xc7S\x14" -"^\xa5\xc2\xf1j\x18\xfcu\xf6\x8d\x3\x62\xd4GZ\x1e\x90/\xc3\x41\xa3\xc8.\xe3\x7\x44" -"\x17\x9d\x39\xc3\xe5)\xb9k\x11-\xe5\x7\x11\x95JB\xff\x30\xecw\x7f\xea\xa3\xd7\xc2" -">\xfM\xa5\xd0\xa5;\xed\xab\xd6\xe4\x64W\xaa\x62\x92X]:\x14\x8a\x31\xf0U\x9e\x85U" -"d\x14\xbf.\x9e\xb\x62\xc2\n\xb2J\xe5\x38*m%\xc2J]T\xb2g,V\x89\xc3\xfft5\x8am!\x1f" -"MD\xe1\x85\xc6K\x9e\x95*\xc2\xd6\xem\x9c\x81m^\x19\xd6\x62\xd6\xef\x1d\x18\xb3\x80" -"\x93[,\xcc\xa3\x10\x66\xfdx\x90\xf9\xb4\xd3\xc3\x9d}J\x11l\x16\xd8\x95\x37\x37\xed" -"\xfc\xf5\x11\xe9I\x10\xf1\xbc\xc3\xa5\x31\x9\xc6\xa2\x1e\x17z\xd2\x41\xba\x16\xf5" -"\xd0\x9cq\x1e\xdeYC\x0\x9c{\x8bj\x2\x97l3\xc3\x8d\x43\xb8s\x2\x90\x97\xdcZ\x93\x84" -"\x18\x98\x12&\x8\xfcL\xf3\xac\xdc\xca:,\xb0\x82\xd8\xaa\x45\x39\xd8$=\xbf\x36<\xfb" -"\xde\xe3\x38\x87\x9d\xa2\x64).\xdf~\xdfwv\xa8\xd1+\xf4\x95?\x1f\xe3\x19v\n\xckbu" -"\xdbN\xd1\xb2q5\x13 b\xebKz\xcf\xb2\xbd\xa8\xb2\xdd+\xa9\x7fRM\x91\x3\xc4>\x81\xfc" -"\xe\xf9\xe0\x8a\xf1\xac\xbc\xf0\xee\xe0X\xec[\xec\xb0J\x1c\xad\xe9\xc2=^P\xdf\xf7" -"\xa8\xfb,\x81?O\x92\x1f\xe2\x2\xa9\x64\x82\x7\xe9\\\xb9\x5\x8dv\xc6\xe3K\x13\xea" -"\xc2r\xea\x1f\x36)\xd0\x13\r\x31\xebHT7_\x17\x12h\x86m\xa5\xec" -".\xc7\xfe\x61+\xb9\xf8\x30\x8c.\r\xf3H\x1c\xdbO\x97\xf8\xd5&\xeb\x4\xdcW\xd9\xa8" -"D\x3\x90)gQk}k\xa8\x94X>t\xc5\xc9\xa2\x46#\xce\xa4M\xf1w.*\xca\xbb\\\xe\x1f\xde\xc5" -"\x82\xb1\x43\nsX\x7f\xd5\xf1kxF\x82\xc0\xd0*\x80\x11. D\xff\xae\xab\x35\x80\xf3\xe4" -"\x0\n%t\x1d\x8\x99\x81H2Er\x90\xbevQ\xb8\xef\xd7+H_\x95\xd4\x5\xc6Q^\xcc\xed\xc4" -"[\x9b\xbcv\xb2\x6v\xa5\xf6\xa9\x1aXP\x1eh\xf9l\xb0\xbe\x65\xde\xf6\x62\xcd\x1d\xb1" -"\x9e\xa8\x3\x1f\xee\xfb\xcf@5;pYGj\xaf\xa3;\xa2j\xf9;`\x95j\xeamx\x9f\xf3\xd8\xe" -"\xd3\x0\xf&j-\x87s\xee\xac\x7f\xef\xd3wm\xa6^\xd0\x1a\xcf\x9b\x43\x17V\x2\xc2jS\x8b" -"\x1d\xf0\x61\xbb;RO*j\xe4\xdd\x5.\x9b\xa2\x88\xb2\xd3_\xee\xd1\xa2\xf3%\xc2\x3\x7" -"\"W\xdbh@M\xd5\xb9\xae\xb6=D\x1e\x41\xad\x38_\x17\r\xddJ\xa5Y)j\xcf\x42\x66\xc7\xe3" -"\xbb\xca[\x93n`(\xab\x1b\xbaJD\xc7\x9bG\x0\xb2\x9f\xa2\xed\x65\xd8'K\x8fT\xc1}\xe9" -"\xf4\xf1Q\xed\x8\xc5wL\x1a\xc5\x36\x44w\x7f\xe6u5]\xab^T\xb1\x31\xd6K\xbb\xaa\x81" -"\x1d\xacy%\xe0\x2\xf6+\xbd\xa9x\xc6\xec\xe9\xb7\xc5\x1c\"W7\x2\xbb\x8\xbd!\x86\x6" -"\xf2\xa7\xc9\xc8\xab\xab\x1b&+\x92M\x7\x36\xad\xbf\xcf\x36\x65" -"\x96\xf5\xe3OY\xf9\xea\x15\xd3\x8eL\xc2N\xf8\x8\x6\x64W\x98\x63\x99\xd3\x9\xce,\xb7" -"\xfe,\x1d\x1b\xa9!\xf1\x19\x8a\x91vn\x1d\xe4S\x19\x80\xf5Gwpx=\xac\xe9\xde\xc5\x99" -"\"aK\x1f\xd8\x89\x88\x0|j\xdf\x10\xcc\xee\xe1\x38\xef\xc2\x34\x63\x90\xfc\x88\xd1" -"\xad\xf8\x61~NV\xff\xa7 \x92\x91<\x1b&5\x84\x8\x9bN\x1e!B\x13\xf5j\xf4Gg\x8a\x45" -"s\x9\x1e>\xdc;d8\xc0\x5\x39\xd0\x3\x0k\xb1z\xba\x98\xf5\xe7\xb9\xcb\xcc\xad\xffh" -"\x3\xb3\x1ej\xd9\x41\x99\x4\x62\xfe\x1b\x93\\g\xff\x9eJ\xa4\xb6\x15\xb2\x85Z\xd2" -"\x88\x41\xb2\x96\x84\x1a\x9f\x1a;\xf8o\x9e;\x16Y\xd7\xe7{Kn\x7\xda\x31\xaf\x84\xc1" -"\xf5~P \xcf\x8c[5/\xd4\x12N\x13\x11\x7f\x34V\xd1\xea?\xff\xbe$\xa8iq\xb7\x12RU\x5" -"\x10OD\xe2`U=\x10\xd6Yx\xa5\xeb\xf7\xee\x66\xc7\xac\x66\x3\xe7\xbe\x95\xd2\xb9\xe8" -"\x12i1\xba\x13\x89i\x87\xf9|\xae\xa5\xb7\xeb\xe1\xc5@i\xde\xa7KaW\xf1\x9b\xfc\xbe" -"\xa2\xe5\x9a\xd5u\x10\x32\x91\xeb\x36\x92?14\x1b\x9d\x12\xc4\xce\xdc>\xd0\x38?\x19" -"\xe6\xdd\xf3k\xa5&R\xde\xe8\x1e\"V\x91\xa0\xbI\xaa?\xa2\x1b]\x1a;pf3E&?\xb5\x9b\xf0" -"\xd7\x16g\xa2x9Mqac\x12\xe1\xf8\xb2\x33\x15r\xb7\x90/\xa2\x96\x8di\xad=B\xa9\x38" -"\xd7\xe6\xf9\xe9\xf2\x63\x9\x44:m\x97|da5\x1\x83\x9d\x9\x87\xf\x2\xd2\x82\xd9\x10" -"'s\x8c\x17\xd1\x64\x38K\xf4\x9e\xdf\xbeXY\x1pRH:8_=l#\xc8\xec\x31\xee\x9e\x7\xc5" -"v\x1d\x85\xd6p+\xe4#\x1b\x95\xfe\x35{\xf6rqEM\x8b\xa5\x41\x4)\x1d\xf5\x1c \x92\x82" -"=X\xd7\xd4P\xc9\x92\xee\xdc+Y\xa7 \xc7\x19W\x90\x44\xda\xe1G\xb7`\xba\x9c\x83\xf6" -"n't\xc3\x63R\xca$-K\xc6\xdf\xb0}\x15\x89n\xdf]\x7\x62\xa1\xb9I\x1b\xc4\xf4\xa2\xec" -"\xe2\xa0\xc4N\xb8\xf3\xa4\xe2\x6\xbe\x87\xc8W\xf3\xc3\xba\x1\xe7\xc1\xb3)\xd7U:/" -"[\x8c\x17\xeen3\x9e\\\x32\xc7Z\x91N\xd9\x33\xc6\x1gm\xceu\xf1\x9fv\x97\x37VP\xfc" -"q\xa0\x1f\xeb|\x88\xcf\x93\xb0\x87\x8\x89\xdf\x96-\x94\x9a\xc0\xc6r\xcaZc\xfb\x9b" -"n\x9fs\x1b\x7\\\x2\xba\xb9)~\xd2\x31\x80\x99\xbd\xc3\xd2\xeb&\x82\x1c\xf9\n/8\x8a" -"ib\xc1!\x8\x9b\xf3M\x8\xe3\xceQ\x9\x99/0\xb9\xf8\xe8\xb5 *\xd0=\x3\xd0\xe0\x0\x12" -"\x85\xcc\x46G\xd9\x19\xb3(F\xec#\xfb\xc8\xc9\x10k\xbazI<\x81\xb3\xa5\x8b\xb1=\xd5" -"\xd7\xa4;\xb6\x62*\xd6\x8c\x84\x1d\x7f\x11\x36\xf8\x95\xb1\xd4\x94\x96\x88z\xc7\xad" -"\xc4\x94\x44\x80:\x16J\n\x1f\xae\xc2\x99\xda\x1c\x1a\xb9\x64\xfbu1K\xb9\xd7\xd4\xaa" -"\x4\xff\xb3WVA\xf7{\xdd\xf~x\xe\xb7\xcd\xc1z\x88!\x8c\x18\xe7\x10\xe0\xf8)j\xde!" -"\xfb\xdf\x35\xba\x6\xe8\n\xa6\xbe\xc8\x9f\x1b*\x3\x7lm\xaf?\xf\xba\x84Z[\x88\x14" -"\x2\xd2\xc0\x33[h{@0@\x96\x88\x96?m\xacTE\x9Mf\xd3=x\xa7\x63\xb6\xf5\x0\xfdL\x9b" -"\xc8\x80M@\xf5,\xf4\xba\xeb\xc6\xd3]\xa9\xcd\xeez0\xb7\xf\xde\xd0\xf1\x85\x87\xa1" -"~\x8\x15@p\xb0\xa3\x8d\xe0\x0\x35\x1a\x89\xf4Kl\xd6\x66\x8\xd8\xa8hD\xf9\r\x88\xcb" -"%zJ\xf9\xc6\x7f\x15P6\xe8\x33\xd5\xf5\xd0\xfcx\x1d\xc9\x8b\x1f\xc1\xb7LB\x82.tvS" -"\xd0\x66\x0g\xda\xa7\xaavTq\x92\x9e\xd4\xe3\x8d\x9c\xd6\x9b\xdd\xb4p\x7f\xb1\xd1" -"\x1d\x12\x37\xb3\xa5\x6L\xf8\xc1\xc6(\xe2=\xe9\xee\x9d\xfe\xccK\xde\x42\x97\x8d\xb5" -")u*:\x84\xb9\x12\x46ui\xea?\x9do@\x97\x88\x96\xb8\x64\x17\xc1\x14$\xcd\xa3\x8\x34" -"G\xf5\xc2\xdf\x66\xc2\\U\x2\xea\x42N:m\xdc\xd2\x30\xe6I\xff\xc8+;\xc0\x16\x8b\xb9" -"\x99\xbcQ\x8\x1b\x36\xbf\xe6\x11w\xae\xabl\xc7\x44\xd9\x94{\xc5\xa8\x93\x81\x62\xc7" -"\x9a&\x8eiE\xc3\x84-\xfd\x87\xb7}\x14\x8f\x9cyA\xcc\x62\x9dST}\xa9\x30\x86\x30\xeb" -"{\xd3\xe1\xc0\xf2\x7f\x8a\xc2\x8c\xcc\xe8\xb\xa0\xaa\x0`\xf2k\xba\xb7\x1d\x17W\x7" -"\xab`\x90/\xfb\xd9\xc9\x9c\x38\xd8R\xf1\x14\xf0\x12x\x96s\x18\x9b$n\xb6N\x9\x8c^" -"\x9d\xd1\x97\xab\xf6&\x9e\xe1\xb4\xad\xfc\xf6\x8c\x1c{>R1x\xfM\xab=C\x5\xa1\x8a\x89" -"\x8a\xe3\xd3\xfe@S\x90RH\xc4\xcer\xa1\x1Sp)\x87\xe2\xcb\xfb\x1\xcf\xee\xf8j\x19\xed" -"_\xd0\x6\x66\xff\x93\xf1\xf4xF\xcc\xbf!mBC\x92\x18\xab\xbc\x95\xe4V\xc0t\x91\xa7" -"\xc1\xe4o\x1d \x1c-\x80\x66I\xfc\xd2\x34\xdf\x12/\x89\xb3\xb6\xc0\xd8\x64\x5:\xc7" -"\x12ha\xa7\x1f@\xcb'\x1c\x14\x99\xe4\x65\x1eR\xa4\x94\x11\xbeQ\xc6\x46\xd5\x9d\xdd" -"\x91\xdd\xe8sj\x2\x97\x88Z\xe\x2\x81\x43/%D\x8\xac\xaa\xec\x81\xa3t\xc5\x6\r\xf\x7" -"vw\xaa\x42\xa0kM\xbcG{F\xf\x8d\x66\x17\x89\xff\xc\xfe\xb8)\xab\xec\xd6\xc0o\xa1\xad" -"\xb7o'\xfeS\x81\xbb\x0\x9b\xd0[\xab\x34j-e-$x\xb0\xa8\xc7j\xa6\xc9\x98\xc9rn\x87" -"\xcb\xda\x66\xf9\xbc\x62\xfc\x44\xe\xba\x14\xc7\x34p\x14\xb2n\x84\xf3\x5V\xb8rK\xea" -"\x81\xbfv\xd3\x42\x63\xf8\xe4Z\xeaV\x84\x1e\xbb`\x18R\xc0\x82\x1mW\x5\xa7\x30\xe" -"\x8b\xe1'k\x93\xc1\x1ek\xff\x84o\x1c\xb5\xf3w4\xc4g\xbf\xa6N\x93X\x97\xb7\x89\xd5" -"\x98\\\xe3\xda\x9a\x8e\xb8\xb\x97\x36]\xf2^^\x87^\xd1\x65\x84Vj\xfa\x39)\xd8i\xa3" -"\xfa\x9c\xd7\xaa\xf4{x\x93\x98\x12\xfb\xe1\x8f)!\xb3\x93\xd7\x88\xf7[\xf0\xf0\xc6" -"*[\xd2Q$\xcc\x98\x84N\xeN\xde\xcc%\xd9\x37\xdfVp\x9\x65x\x7f\xc4\xd1\x91\xa3=\xb8" -"\xc2O\xfb/\xf5PJNa\x8\xe5\xfb_f\x12\xdbV\xbb\xd7\xd2\xf4\x33\xfe\xe1\xb8\xf0\xd7" -"\x80\xecOv@\xb4\xff\xc0\x1f\x35.\xb3\x98\xb7\xc4\x11o\xf4?\x93\xa1\x18\xe0V\xd6\xd8" -" \xbf;A\xa7\xc0\x9e\xad\x1c\xc4\xff\x90RB\x17i\xc5kE\x99\x38~\xb0\x8fu\rji7\xb0l" -"\xca\x43R\xa3\xf4\x96\x16\x16\xeb\x12\x39\xefY-r\xf7\xa7\x80\x12\x95\xa1\xee>\x97" -"\x82\xbc\x95\xeah2\xf1\xb2q^\xf1\xae\xa0\xf4r.\x85\x16\xfd\xad\x1b\xf4\x14\\\xd2" -"a\x3!\x8\xe7\x89*\x8d\x4\x7q\xf8l\xe9\x89\x94\xe1\xb4\xb5h\x8dY\xd6\x4zQ23\xd8m6" -"\x8\xacM\xa4\xcc\xe4\xca\xd7x\xe3\x66'\x1c\x16\x9\xdd\xc5\x6\x30Le\xb7P\xb8\xbd\xb9" -"5\xce\x9f\xe\r\xb5\x33}.PqZ!\xd1\xdd\x4\x92\n\xfd\xba\xdbjAi2\xbd\xc6\x97\xaa\xe5" -"\xcc\xf3.\x99p\xff\x5\xa1\x8e\xc7\x66\x84\xd1%`~&\xd3q\xefni\x17+\xf0\x66\xf7\xeb" -"oRqx\xa0\x9b@w\xae\xfe\x5\x90\xa8\xbf\x0\n\x9f-H6\x89\xb7\\\xfd\x2W\x14SCR\x9\xec" -"\x99^l\x7,x\x8c\xb3h}c\x6\xd7\x9fw\x1c\xcf\xf4!M\xf3\xe6\x8d<\x81\xba\x19Y\xc1g\x82\x33ubn\xdal\xa3" -"\xf9\xd6L#\xdez\x9f.#\xbd\x32\x15\xbf>e\x83\xc\xd8\xa3\x64\xfcS<\xec\xa8\xb6{Far" -"\xd7\n\x89\x1eK?\xe3Z\xdc\xf6\x1e>\x1fwq\x7f\xa3\x92K{\xbe\x80\x43\xb9\x81_\x97w" -"\xa4\xf0\x7y-mo\x99\x42\xd0$E\xc2\xb0\xdc\x7\xb4Q\xc\xa3\x35#Y\xaa\x31\x62\x32\r" -"4p\xd0\x14{\x15h\xb8\xa9\x14\xe0\xdf\x10\x8c.Zv\xd2\xbd}X\xc8\xc2\xd7@>u_\xe8\x96" -"\xaau\"\x5;L\xb8\x46\xbd\xa0\xa4\xe9\xb5k\x97\xa9\xd0\x89\xe3\xe7\x41nk\x1d\xd0\x14" -"\"\x9b\x90\xfd\x31\x9a\x45\xfe\x16\x1a\xe\x30\x92\xe6\x4\xbe$\x12[Q\xf3\xe7\x16\x1c" -"d\xff\xfb\xd2\xed\x9e\xb4\x8b\xd1\x43\x42\xca\xc1\xe3\x3\xc\x63?\xbdk\x87\xd2\x85" -")\xfa)\xa5\x45g\x99\xbe\xc8\x1dX\x1c<\xe8'\xfc\xda!\x1\x41\x9b\x11\x9aJ\xf6\x80\x1c" -"\x94\\\x31O\x80\xf4\xd7\xab\xf3os\xe3\xe7RyS\x6\x36\xfe\x9\x34N\x98\xc3h$\xb\x9e" -"Cf\xd9\xe6ja\x5t\xeb\xeeo1\xcc\x11\x1e\x83\xe0TJ\xd3!\xcf/b\xf8\xc5\x30\xbe\xcc\xfa" -"\x91\xc5\xf3\xc5\x64]b\xe\xcb\x35\xdeo\xa3\xda\xd7id\xdb:\x83\x7\xe8\x92\x8c\x9a" -"\x18\xbc\xb7-\x91\x9f\xeep\xf1\xb9u\x88\xdb\\\x18\xe1k\xc7\x45\x35\x97\xa1\xf2\r" -"z\x9d\x91\x31\xb0\x2\xa5mL6\x8dk\xf6\x9e\x8b\xadN\nD\\v\xfb\xe0\xaf*\xf7\xc7M\xb7" -"\x9a\xb8\xf7g\xfd\xec\xef\xfa\xb0\xc\x62\r\x3\x8f\xde\x83\x41\xad\x14h\x87\x4T\x89" -"H\x9dh\xe\x10\x41)):?'\xe5\xfc\xceu)\xbbJ'r\xe5\x4\x5\x41W,\"S+\xf5\n\xa2\xfc}KM" -"\xb9\xa6\xb3\x8e&h\xce\xd8\xfd_\xb3K&\xf7\xed_)\xdf\x43\xa5\xb1\x7f\x9f\x1f\xe1\xf9" -"3\x4\xe3\x1a.\x17\xcc\xd8\xf2U`\xf1`t\xb1\xdc\xa2\\\x11\xe0\x86\x36=>\xbd\x61\x39" -"\xd3%\x94\xcdY\xa2\xd8\xb6\x0\xac\x9e\xe7\xc0 \xd2+J\xcevb\xb3I\x82L\x92m)\xaa_\xdc" -"\x9c\x1d\xc4\xfc\x17\x18\xb0\x1dz\x4\xffq\xfb\x10\x18\x1b\x5\xcd\x61?\xfb\xa4\x39" -"(Xb\x97:\x2\x8\x95Xj\x5\x43(\x1c\xb6\xe9J\xb1\x85\xd3\xfe\xe9\xc8\xca\xef\xdf\xfc" -"\x95\x9e\xe7\xedQ\x1\x8dR{!\xdc\xa5\xba\x42\xba.:\x8aw\xdb\xa8nd\xce\n\xb2~\x9b]" -"\xb0\x14\x0\x1b\xdd\xc8\x90\xdb\x7f\x61\xe0\x90\x4Y\x82\x1a|pc\xdb\x65\x13n\x8a\xf0" -"Zh\xd2od!\xfa\x86\xe4\xae\x62\x65'\x97\xb3\x85\xc8X\\\x16r\x93.\x15G\xd2\x18=\x84" -"\xad\xf7\xe6\xf8\xcf\x42\r\x3\xa4\xe7\x8a\xd1q\xac\x8dR\xf4\x43\xc7i\x89\xefQ\xa0" -"wL\x13q\x11\x43\xeb\x0\xecTJ+t!r\x8byP.\x8b\xfa*9L\xd0\xcc\x15\xafq;\\\xe0\xbbx\xe7" -"\x16\x89\x18\x2\xa2\x81\xbb\x8f\xe6\xc5\xf2\x14[f\xe6M\xff\x65\x9\x31?5\x3($`\xe4" -"\xc9L\xcf\x85V\x9b\x1c\xe5\x84\xf\xd6\x38\xefQO\xda\x9d\xe8\xb1\xb1\xe8wW\x9c\xd4" -"{\x87\x85\xb9\x91\x64\x1aH\x1b\xa0\xef\x46\x3X\xc\x8e\xdb\x94N'\xf4\xe9)5\xee\x2" -"~*U\xfb\xaf\xf9\x92\xf7\x9e\x3\xf7\xb2\x42h\xbf\x93\xb2K\xa6\xc6\x4\x35-\x14~\xa9" -"\xb3\x37\xd0\x8e\x2\xdb\xc7_\xec\x7fP\xadHA\xae\x65Q\x6vAS\xe6\xe0\x8c\x84\xa2&O" -"*\x18\xc\"%\xfa\x1e\x39\xac\x8\x1f3\x83\xbb\x9dQ\x7\xec\xd0v\xed\xc6\x1az\x80" -"\xd9\xae\x7fU\x97[`v\xe2\x45\xf0\x8e\xc3\x64\x45\xd8\xf0]\xd1\x37H\x99Z\xf6_\xff" -"\xe7U\x97\xe9\x86\x83\xe6\x88\xa2@S\x1\x1b\xc7\x1bi\x9a\xe1\x61\xdc\xda\x83Z*\xad" -"\xcd\xf4\xd9\xa8'P\x95\x8a\x39\xaehPX\xcet\xf8\x91\x62n\x99I{\xc8-b\xd2\x35IM\xd8" -"?\x87\xe4j7V\x82>#CMG\xaeO5\xa2\xde\xe8\x31\x46\x80_\xb5\xe2\x8a\xf9\xe2\xdfx\x12" -"I~\xf6\xa4[\xad\x66\xdf{)\xe4\x95\x12\x80\x31\xcd\x96VC#\xc7Z\x88\xb9\x8es3\xf6\xf8" -"\xde\x1c\x8eu&\xfb_\x8c\x11\x10\xff\xaeK\xcc\xfe\x32\xe5\x32\xf1\"\x8fz\x9Og\xb3" -"Q\x8e\x0\xa0q\x89\x7fN\xdbh\x8b\xf9\x97Q#\xcb\xe1\xde\x8\x95\xea\n\x88'zi\xa5\xd7" -"iLD\xb1Z\xe4\xb5\x92\xcf:\x17j\xb6\xe9i=\x80\xd9\xb1\xb8\x9b\xd3\\\xd8\x88\xb7\x64" -"\x92\xe\x86^~\x9a\xd0\xe8&o\x17\x4N\xd6RQ\x8d\x87\xff\xee\x1d\xc3\x64\x42/Wb\x1a" -"\xfe\xa9\x16\n\x8cy]D\xa6\xce\xc\"\x62:\xa8\xafZ\x8\xcb#\x19\xf3\x35\xe7\x36N\x10" -"pml5}\xfd\xf0\x82\xd3\xeb\xe3\xb0P?\x6H\xb7J\xad\xddS\x8fX\x5\xb1\x1e\xedX\xd6\xe5" -"\xf}~n\x1a\x63\x1e\x89\xc8\x1e\x32\x1fk\xa3.\x13\xa2\xb7.$\x9a\xb2\xdc\x31\xe7:#" -"\xba\xe5\x96\x15\x36\xf1\x63}\x1a\x1e\xc1\xf9\xf7w\xc7U\xe7%\x10\xdfN\x86\xc0\xac" -"\xb8\xfb\xda?\xa8p\x84\xfdqSl\xed%\n\x8f\x31\x85\x1f\xc\x9b\x41I\xa4\xff\x19Pn\xe0" -"\xd6\xb5peW\xb8\x31\xe0\x9ch{\xab\xcexM\xca\xb0\x17\xc4\xa6,\xf3\x9d\xf2\xbf\x8b" -"%\xe8\x1b)\xf8\xe1\x1c\xb5\xa1\xf4\xf3\xeb\x0\x14V\xf\xbf\x1b\x8eG1\x96w\xe8\x30" -"de}\xc2\"\xf4\xb8\x9f^\xcd\x6o\xe\xf9,\x19\x93\xd1\x62G\xceq\xae\xe7\xc8\xb4\x64" -"w\"\x13\xff\xa7\xb8\xec\xc9\xb4\xfc\xb\xc3\x7\x83-\xeb`^h_n\xe7\xd5J\xd0\x64\x42" -"N\x12y\xe2\xa1\xec-B\xb1\xd2\x93\xe3\x96\xee\r\x84\x32\xa5\xa0\xdc\x32\xe5)\x9a\xa7" -"\x91\x13 \x1a\xa5\xd2 z\xf4+K.a}\x80\xa5\xaaK(\xba\x84\xd0\xe5r\xec\xff\x34\xfd\xc2" -"\x2\xb6rc\xb2\x90\xe[\x8a J\xf2'/\xb3\x88\xc0\xc1\xc1\xc2:\x8a\x82\x1bo\xb3\x35;" -"\xf6l\\\x1\xa9\x6\x8a\xfe\x1e\x8dp\x10}\xc1\xb8\x84\x61\xaft\x12@\xe\xa8\x9b\xe6" -"\xd9\xeeH\xb3\x6\x62\x96\x83\x62\x1f\xafZ\xd5\xf9\xf8{\x8d\xb3\x1dy!\x8\x41.N1{\n" -"O\xa1\xf8\xf\xa1\x97\x31R2\xdc]M\xd2\xa3\xa3\xb1l\x87g\xfa\x33\xe2\xf2'\xcc\xb7\xe7" -"_\xbe\x98\x9d\x1dQ\xe2\x32$&\xba\xe3Z\xe9L\xa8sV\xc5\xcf!}\xde\x81\xad\xf0\x62S\x86" -"\xe8\x10O\xca!x!xy\x90\x9d\xfe\xafu3\x14\xb4\xa5\xdbX#\x0\x1dz\xe5Nio\xf\xceP\x6I\x1f\x9d\x9f\xbb" -"OA_2\xc6\xcb\xac\xa1\xe0\xec\xe0\x8eo56\x1b\xa4\xcb\xd3j\xb7\x0\xe7\xd6\\\x9e~h(" -"\xc7\xa0^\xf3G\xec*C?M\x14\xee\xd7\xe0\x6iV8\xf8\xc3\xeb\x83\x43m]G\xdd\x65X\x3\xc2" -"_\xa1\xac\xaeu\x6pq\xcc\x96\x89idrP\xcb\x8*\xeb\xfe\x19\x9dv?SHP\xad{\xec\xc6\x11" -"\x9c\x88\xc3j\xe5\xdeM\xc0\x16\x31\xc7K#\xbf\xc0\xbe b\xdc\xa0\xf4\xc\x36\xb9\x86" -"\xd0ouj\x8fj\xd3\xeeQ\x1bs\xb9J!e2\x1\xa8#\xc\x66\xde\x11\xaf\xc5\xdd\x11\xf0\xc7" -"\xbb\xcan\xdaN #\x96\x10\xd1\xb7\xc3\x97X9Uw\xa5\xd8\x34\xce\x80\x8c\x81u\xd7\x41" -"\xd8\x34\xb1\x84\xc8\x65\xc3\xd8\xa6\\xs\x13\xa9\xfb`\x7f\x97wQRjs\x84\xc1S\xd9K" -"j\x92\x9d\xb2\x65\x12\x8e\xe0\xeb}\xa9\xce\xb1_y3\x84y\x3\x17\xc8zJ+\x18\xe7\x65" -"Q\x8e\x92\x8d\xc5\xcd%}\x17\x34\xef\xd5\xf1V\x13\x45\x30\xafy\xe7 \x4\xc7\xb3\xef" -"\x5\xd0\xe1\xfb\xcf\x9!6\x99H\x9eg\xaa\xeb\x39Y\x8bq\x8b\xaa\xd8\x66\x30;V\x1\xea" -"V\xc1x\x4,%\xb5\xcbX^\xc1*3k\xf7K\xb3\xe6U\x95\x9eo\x85\x9e\x63\x12\xec\x18r\xea" -"\xc5\x8f\xe9If\xfb,h\xe1`\xb4\x90\x1ao\xe7\x1\xda`~\xb6\xe3q\xe2\xa2=.\xa4\x37T\x17" -"\x8f;\xddm\xa3\xe0\xda\xb5\x13\xf2\xcc\x3\xdd\xe8]\xe5\xf6g\xa7\x46'\xdb\xc8\xc9" -"2J2\\\xccR\xc2\xce\xd3\xc\x66\x15\xbdp\xbf\x7fY\x86\x9c\xc9\xa2\xd5u{j\x14\xbc\x8d" -"%\x96\xb9I\xbeu\xc3\xe6\xa3\x38\xed\xf1\xb1<\xef?\xe2\xa0-\xe7)\xdfV\xcc\x7\xb5\xcf" -"%v\xe9qXJ\x97'\xb8N\xaen\xd9\xd3S\xf5\x42\x9L;\x11\xfc\x9a\x7Q\xc9\x86\xf3\xb\x10" -"\xd3ZZ\xdd\x9e\x31\x2\xd0\x8c\x0\xdd\xa4\x8f\x94$G\xa2\x1]\x96\xc7\x8b\x1\x1e\xf7" -"c\xd5\xd4M\xe2\xab\x8c\x95\xbb\x38\xet\x13\x8a\x93n\x3\xe1\xb8\xc5\xb6\xba\xb7\x11" -"\xc9\x95\xfe\xdf\xb9\x10\xb6\x37\x14_\xea\x17g\xc9(=\xc7\x89%\x14/>\x87\xe\r\x13" -"\x99T\xb8\xdf\x66\x64#\xe5&\x1c\xb2\xc\xaf\xc2\x89\x8e\xce\xb2r\xc\xee\x92\xaa\x62" -"w\xf1\x12\x82r\x90g\xef=\xfe\xe0\xaa\x9dJ\xbb\x32\x19\x2\xc4WDva\xbaxRat\x12O|\x9d" -"Uf\xfd\xab]\xdfO\xb6\xc0\x8a\xc\xb7\x80\x8cY\xbb\x42\xdeI\xc8\x7f\xad\xd4\xf7Y5\xa0" -"\xce\xd7\x14\xb8\xf3\xb5\xf6\x84\x8a\xe7\xa6\x5\x96\r\xb4\xb2\xbc\xb4w\x97\x62\x64" -"\xe2\xa8JC\xcfhT\xb8(D\xd5\x9nB*9\x2\x11\xaf\xf3\xa6\xf6'\x1c\x3\xc4\xbd\xbd\xb5" -"c\x17g\xf3\x45\xd0\x9c\xceKO\xa0\xe9\xc2\xf9\xcf\x36\xa7\xff\xb1/,\x8e\xa3\x13iE" -"\xc0\x87\xf9\xc2\xbd\xe9~Z\xa7\xe0x\x1e\x14L\xe7\xbf^\xfa\xfaqP\xd7\x3P[\xf7\x41" -"+\xb9\x32\x9\x1f\x92\xb3qS\x9c\xe4\x44r>\xac\x99\xaaP\x83\x99\xd3\xed\xde\xbfOL\xa9" -"\x5\x64\xbb\xa4J\xbes\xa5\xe\x62\xec&\x8b*\xee\x66ro\xfc\xe2\x32\xddHh\xcd\x19\x81" -"\x85\x81`d\xb6\x31n\xae\xd2\xf4\xfd\xbb\xd4\xcbu\x14_\xda\x87\x39k\xaanXx\x15L\xda" -"\xbm\x8b\xc7\x99\xae\x7\xd2*\x85\xf4\xb3\xea\xdd\x5\x1\x5\x1c\xf\x46\xc6\x9c\xc2" -"jhs\x8b\xb2\n\xcb&\x98\x15\xf9|\xabI9i\xfc\x16\xf0qN7b\x9c\x83Q2h;O^M\x7f\xcf+x\xb6" -"\xc8\xf2\xf2\x9\xc4\xef\x7_\x83\xeew\xd5\x32\xd6\xaap\x98\xc8\x93\xe6\xf1K\nwz\xbf" -"|\x1\xe9\x88L\xeeU\x6i7\x17\x83V\xbd\xf9\x7f\x9c\x1bX\x9d\xe1\x61\x94\xfc;\x15+\"" -"\xbc\x6\xe4\x84.\xcf\xdehG\xdb\xe6\x95\xdf%\xbap\r\xd7\\\xe.\xc2\xcc\x97\x16\xdf" -"\xe2\xa4\xe7\\U\x8e\xe^R\x1ep\xd7\x30^Sy\xbd\xb0\xf5\xac\x30\xf0\x91\xa7|d\xb7\xbb" -"\xd9O\xcd\x4H\x86]\x86oM$\x1e\x19!\xefR\x91\xc4\x14\xaes\x82\x46\x7\xd9\x96\\\xa1" -"\x85\xc3\x0[%\x83\x84\x62\xb9\x37\xc9\x1e\xd9\xc3\xa6I\xd5,\xdb\xcd \xcfj\x1d\x8a" -"02\\\x97\xa0\xf8\x33\x1a\xf0\xc4\x1a#e\xf0\xe3t\x83\x3\x46\xef\x9d\x89_\xe9$S\x10" -"\x98\x87nD\x7\x91@\xbcMv' \x8b\x1d\x9\xe4\x66*\xa4[\x97\x96\xac\xa2^?\xf8\x62O\x14" -"\xee\x12|j\x86\x37y\x96\xa4\xfa\x8e\xbdK\xe5\x32/\xec\xd2\xf1\xff\x85\x64Z\x9a\x11" -"D]\xc7\x32\x8azi\xbf\xf5&:\xc3\xb7\x7f\x96\x8fi^J\xa3\x81\xb8X\x1d\xf3\xf8\xfa\xa2" -"\xce\x46Y\x87\xb1\xf2V\x89\xd8\xb4\xffoy\xd3v\xa3\xea\xe3\xaa\xc7\xc8\xcc\x64\x36" -"\xe5q:a\xad\xc6\xd5\x8e\x8a\x9e\x9e\x97\x89\x93\x8b\xf3\x9d\xde\x35\xf3\xad]/a\x9d" -"\x7\xb6\xbb]5'}'\xd0\r\x15\xbc\x34\xab\x44\xee\x8f\xeb\xc2\x99\x35\xf4\xd7\x8fq\x83" -"G\x1b\x32\xfc\x32zc\x1c\xb8v\x97\xdb\x1b\xf9\xea\x35\xba\x9\x97\x61#[\xd0\xfb\x8" -"\xc9\xec\xed\xc0*V\xf2\x1\x32\x80\xbe\xf6\xc5|\x9d\xac\xcf\x1c\xfe.dymA\x85\xed\xc4" -"i\xa7\x1d\x96\x88\x9e\x64\x46\xc4\xcp\x5\x39\x9b\x89_\xf1\xe5\xbc\xf4j\xc2\x30\x10" -"\x1y\x1f\xbf~\x89_\xbf\x64\x87\x9\x37\xee\x66r_,Vq-\xa4\xd4\x80\xb8\xa6\x38,1~\xef" -"\xa0&\x82\x11\x66H7\xc0\xaeH\xe6h\x86\xe0I\xc\xf8\x65\xc\x13m\xea\xe1\x36(\xfa;\x1" -"4\xe~\xd1z\xeeH\xe3\xf8\x32@\x96\x90\xbb\xe4\xee\x1eN0\xf9\xd7\x93\xf\xb5N\xf7.\xf0" -"o\xbd\xe9\xd7\xaeh\xfd\xae_\x14nz\xdc\x44\xb8\x99\x64<\xc2\x7\xc5>\x14\xc7\x66\x7" -"\\\xea\x41\x32\x14\x6\xab\xc8\x91j\xd2\xf7\x63\xf2h\x88\x61\x36\xab&Q\x12]\xa2\x93" -"H\xb6\xbbM\x17! >`\xf8PI5\xce\x98\xb7x\x1c\xec\xe0\x0\x65\xb6\xa2\x46\x99\x2\x2n" -" \xfc\x30\xef(\xad\xa4R\xf8 \x97\xed]\xa4\x87O\xd5@\x9fpV\xa0.P\x18\x95\xc0\xf5\x61" -"v\x82\xad\x95\xa7@\x13\xd9_\xcf\xc7\xbf ;_\xef\xe8\xad\xed\x7f'\x13u\xb\xd2$\xb8" -"6\x1d;\xe7\xb4\xef\xf6\xecr\xc4\xe4\x84Uj]}b\xde\xc6\x1e\x7fO\x90,\xb7\xd1Z\xdd-" -"|\xf5\xb9\x65Sq8L\xec\xa7\x36\xae\x87\x84\x8d\x97T\x1e\xc6\x45\xfc\r\xe7\xde\xd4" -"\xe3\xc8\xbaK\x8a\x99qnvz/BB\x2\x8b\x61\xfa*\xc2\xe8\x10\xfd\xca!\xad\x7\xa2\x8e" -"\xa5\xab\xa5\x32\xcd\x61]\x8G\x92lD\xe7\xd4\xfdk\xf4`c\xaerTw\xbb\xe9\xff\xd0\x1c" -"\xca\x11l].5\xcb\x91\x43k\xa0\xd7\x13\xe9n\x81\xe1\x88!|\xbc`<:\x1e\xc4S\xf8>\x95" -"\x80\x63\x5\xae\xc6\xd5&\xd1\x9f\x9" -"eG\x6\x1e\xe7\xc4\xcbZ\xcq\xbc]\xdf\x9\xc\x36:\x8d\xe6H\xd4L\xb7qfRY\xe5\x5s\xff" -"\x94[R)\x1e\x82%\"\xc0\xdd%Z\xd3\xad\x42Ge\x8a\xc1\xbd\xf7\x1e,\x8b\xb6/C\xc2\xf3" -"\x99\x44\x11\xb8\x98\x84\x82\x1f\xbf\x96<\xaf\xa4X\x9a\x41\xf\x8e\x61\x31\x7f\x4" -"\xcb\xf9\xb8~\xf2\x36rL\x85\n\x42\xf9\xaf/6\xa8Pr\xbb\x16\x91\x1dx\x10\xce\x35\xb5" -"\x8ak:\x97\x8cn\xee\xb3y\xbe\x44Q\xf6&\x1#\xa5ks\xfeT\xdb\xbcO\x19\x34\xfd\x18_\xb3" -"t\xa2\xf4\xb2\x5\xedx8\xc2$w\xf8\xebL\xd1\x2\xc5;L\xa5\xadtx\x9a\x44h\xcf\xa7\xcf" -"\xdd\xdd\xd2=\xb2+\xa4\x31\\p7c\xd6\xb3\xdaW\x8e\xdcN\xc0@\xd4\xf0HBx\xef\xf6\xb2" -"\xf4\xb1\xe3\x18\xa5u\xdcS\xbd\xad\xb2K\xe8\xc5\xa8\x1fH\xfc\x97\x4\xc9\x63ZW\xf2" -"\xbc\x8b\x87\x92\x1f+?\\\xab\xe5\x17\xb7\x90\x9fo\xac;\xb8ZO\xf6\rQ'\xe4]\x9b\x38" -"\xd7\x66 \xe6\xed\x90\x1a\xd2\xf\xeeU\xa9\x9a\xec\x87\x99_T\x80\x9f\"\x61{(\x9f\x30" -":\xc7h\x97\x19\xce\x10\xf9\xd5\x45ozH\x4\x11Z\xbeL\xdb\\\xfe,\xc7\x15\x94\x1a\x95" -"\xb8\xb1\x87\xb5?t\xc2\xb8.\xaa\xdc\xa9k\xd8\xb9\x2\xc5\x8e\x17\xd1\xbb^\x8e\x87" -"\xbb\n\xa3T\xcb\xed\x83u:\xef\xde\x1d\x1b\xf5N2F\xaa\x14\x85\xf7\x96\xfe;\xe9\xcd" -"]\xb6\x99,&G\xe4\xd3+\xa1K\xfd^\xf0\xcb_\xb1\xf7\x7f\xe]\x13\xd7\x1T\xbe\x1e+\xe0" -"\xeall\xa7\x1aP$\xddL\x80\x92\xc4\x65\x91\x30\x19\xcc\xb8\xd9I\xe2\xdd\\\xd8z\x19" -"f@\xbd\xf6@$\xcc\xf3\x8d\xca\xb7\xf0\"\xa6\x88\xb9\xc6p\xe6\xb4\xfb\xfb\rz\xa5O5-\xf6[\x81\x30\xa4]_\xef\xe6r)\x1e\x15\xf3O" -"\x8f\xb8\x65`\x9\x31\xd1\xc7Q\xab\xd8\xdc\xa8\xccn\xc3\xc7\xe7\x35\xa3\xac\xcbk@" -"~(\xba\x94\x12v\xbc\xd2\xe2!\xf0j\xa2\xe1\x80 \xc8\x8au\xe0,\x87QPX\x0\xa1\xd8\xe8" -"\xdd\xa4\xc4\x17\xc4\x8f\xaf\xd7\xb2\x85\xf8w\x19\x89\xd0\xe8O\x89\xad\xca\x1d\x96" -"_\xfb\x37\xc7Oc\xe0\x8f\x9eZ\xcb\x8Zf\xc8[\x84\xad\x8c>\x85\x35M\x17\xe0T\x94\xbf" -"\xaf\x92\xddN\x91\xef\xa6\xfcS\xfe\x92\xb7\xc2\xcb\xd9<\xe6\x9b\x35\xcf\x44\xba\xca" -"\xa3:Y\xde\x80\xd5\x0\x46\xa1$\x3\x9\xe2\x61\xf1\xfb\x35^I\xf9\xb1[V\xcaP2z,b\xc0" -"\xb9\x44\xef}D\x8b\x62\xfbu\x80Ve\xa5\r\xdb\x30\x9c\xdf\xc7\xcbsh\x17*uB\xfa\xb7" -"\xeb\x9d\x38`\x19\x88t\x93\r\x42\x8f\x37Q\xd8\\\"\x8a\xc6l\xa1\x9f?{_+\xb9\x33\x3" -"\xb2\xdd\x15\x32\xbf'\xe6\x86\x39v+\x9c\xb5%\xf9\x16\xd0G\x8e\xa7\xedn\xe9s^v\x81" -")\x1e\x17\xb2\xd3,\xae\x41Y\xcc\xfew=\x9a\xcc\x97&\xer\x1a\xf0\x94>+\xcc\xb8\xcc" -"\xbf\x17\x7\x7f\xf7\xff\xd3\x89\xdc\xf0\x6\x6O\x8d\x89\xe4!\xa2\xe8\xd8\x9\x8fr\xbe" -"\x9e(l>\x82N\xa0`O\x89W\x89\x86l\xdb&\xea\x1\xda\xd4\xb4o\xaf\x38\x4\xf4\xac\x97" -"\xff*bk\xc0\xf0Y\xd2\x14:\xb0Z\xad\x94\x45\x89\xac\xb5\xe1T\x13,\x93\x92\xd8#\xc0" -"r\xaa\x87\x99\x94\r\\\x98\x38j\xf\xd6\xb4\xd0\xb5\x36R^0V\x99\xf4\x17s$!\xbbX\xa7" -"Uh\xadN\xdbS&\x8c\x81h\xf9\x14\xbe\x85,\x86\xea\x2\xd3i1]\xd5\x92\x36\x39\x15\xdc" -"F\x97)\xf0\x1e\xf1\xbf\xfa\xf4\xa5\xd2\x9e\xe7\r\xa6\x32\xb9\xe6=\xd3\x83\xee\xcd" -"N\xa3!\x14\x64,\xb6\x16\xc8\x97\xb7\x95\xd2" -"\x93\x61\xf8%<&}\xcb\x65/`Z\x96\xd6I-\xdc\xac+\x13\xbf\x90N\x88\xc9\xf\xd7^\xc7\x7f" -"sd\xbbu\xae \xb\x61\x36\x15&\x4J\x94\xc7\xe0\x33\xbb\x86\xd4\x45\x97\xed\x39\xb1" -"\xad;{\xce\x8e\x10\x65\x9c\xad\xbf\x9e\x7\xb3\xfb\x4\x1c\xf1\xa8\xad\xc4\xb7L90j" -"\x85\x90\xd5\x8d\x36\x36\xed\x87)\x9cG\xcc\x12\xa8G\x12\xc\xa9\xf7q\x82`o\x86\xb7" -"$y)\x8\x36rUg}VI_\"\xaa\x12u\xb2\xff\xaf\x1c\xef\xda\x12:\x89\x84\xc6\x7\xd4\x38" -"\xcd|\x0\xb7iI{\x9a\xf6!\x94\x89\\ly\x81\x93W&L}\xbL\xe7\xa2Y\xdd\x16\x96\xe7s\xcd" -"\x7\"\xe2\x8a[\xea\xfe&\xc7\xd0J\xd8g\x88j\xc5\xd9\xd1\xf8=\xfe\x97\xf6p\x1c \x0" -"\x7\xce\x81\x85\x9e\x8d\xa0\x65\x5\x46\x8f%\xe7|\xbd\xb\xe5\x91\x94p\xe\xc5\xb3\x9c" -"0\x0\x18\x13\x98$\x8b\x39\xe6P7k/\xbd\x97P\xbb'E\x7f\xb4\xca\xe1\x61]\x16{j\xde\x44" -"\xd5\xd4\xb9\xb0\x84\x92\xe7\xd2\x12*\xf1i\xba\x8d\x1f \x1e\xe\x83\x33v\x9b\xf9\x1" -"\x86*\xd4n\xcc\x9dX\xb8\xf7+X\xfe\xc6\x1b\xddi\x1c\xc1J\xef\x8f]z4\x11?\x9b\r\x8" -"\xea\xa4\xfb\xbf\xd5\x30\xb7<\x15\xf0\xfe\xefLE\xa7\xc8\xc7\xb6\x8eS\x10\xe0\x93" -"fr\x82G]\xa5\xdbge\xffV`i![\xc0\x9d\xd0\xa8\xe5\x18l\xc2\xc1\x1e\x35w\xb5n\xb1:\xea" -"`5\xd2\xdc:\xdd\x1d\x13z\xe1_\x8f\x9a\xa9\xb5\xb\x64\xc7\xb7\xc1\xdf\xd5\x81[\xdb" -"\xff\xac\xc7[\x84%H\x4\xb8\xbe\x14I\xb3/E\xae;wL\xb6\xf:\x9b\xa3\x45\xe\x8\xa4\x43" -"/\xf2Rv\x86\xe3\xcd\x4\xa7\xf0\x35G\x1b\xb4\xbd\xdfNN\xd9\x30\x9ep\x8b\xe0\x43S\x9d" -")\x81\x6\xcbLnx&{V\x82!\xcf\x64X\xf5\xa2\xee\x17\xce\x8\xcb\xa8!\xd9\xb8r\xb5\xb9" -"\x85\xee\x93\x9c\x10\xa4]\xb0\xcb\xb3\xa0\x94\x32\xbd\xac-\x10\xb7<)\x99\xf\xda\xde" -"J\xc1\x61\xa5\xdf\x44\xc1\xbc\x8d`\xdf\xcc\xe1u\xb9\xfc\xa5\xfe\xdc\x34\x7f\xcfz" -"\x9c\x89{7\x85\x7f}\x8c\xb1\xe7\xaf\x13\xf4Xj#\xbf\xc9\x86\xb\x88\xa2\x8b\\\xdd\xa2" -"[t\xb4\xbb%S\xe8\xedyk\x3#\x13\xe5\xc6\x1f\xf4\x14\xbbn\xeeM\x9e_>\x8bKx\x11\xd5" -"\x80\x9a+\xe4\xa6\x9\xe3\x9a\xc\x8f\xac\xbb\xab\x96\x61\x9a\x34\xdf\x96\xaa\xf4." -"\xc5\xbb\xf\x16\xc9.\x10K\x95%\xc\xe2\x3\xaa\x9c\x6*@\x9a\x4\x8\x9d\x2\x96oEK\x8f" -"\xc5\xf0',\xa0\xf4r\xaa;\xff-UsO\x9e>\x93\xc9\xef\x83\xd7\xc3\xfS\xb3\x34\xcc\n\xe1" -"\xe8\xb0\xca\x1c\xd4\xc7OY\x93\xca\xb7'O\xdc\xdf\xe8k\xdb\xbb\xf3\xeav.V\x8d\x93" -"y\xdd\xf4\x1f\x9ZT$3rw\xf8\xe4\xf1\x10\xbf\xdb\x65\x44\xbc`\x8e\xfd\xa4Qw\xbe\xb4\xb1\xa0\x9e;a!\xdb_\n%\xde\xc3\xb8\xa1" -"h\x89\xb0\xd2\xda\xc7\xce\x9e\xe7\x33\x90\x31\xb5\xddH\xb2\xe2\x17\"L\xce\x66j[!" -"\x8d\xfa\xed\xabk\xb9\xdb\xa3kkX\x8e\xd0\xed\x38\x4\x4\x7\x85\xf8g.\xa1zk& \xf6S" -"\xd9\x8e\x65\x87\x64R\xca\xac\xeb\xd4\xf8\xd3\x99\xe8X\x1e\xea\x89\x9cY\xe5\xf5\x8" -"2\xdc\xba\xc\x17\x14\x1c\x8\xa6\x9\xf4pG\xf3:\xa2\xb\x81U1\xd7\xdc\x90r*&\"\xb0;" -"~\x82\xcfL\xfc\x87\x1f\x45\xf7\xb7\xf0@\xbf \xf2\xa0\xdb\x10\xb\xf9\xf3R#:\xcb\x10" -"P\xd1\x42\xba[\xe8\xa9W\xf1\xb2\xafO>e\x1b\x1a\xb3\x8?\xc\x7f\xba\xcc\x93Hc\xd2\x84" -"^Pq\xfa\xe1\xe3\x98\x9e\xf2(\xcV\xa8/y\xee\xe0Z\xa4\xeb\xdfka\xc2Y\x18\xd7\x4\xd7" -"\xf7m\xc\r}\xbc\x1b\x88?aO5D\xe0%I\x9c\x16\x96{\xc6m\xd5\x9f\xc7\x1e\xfe\xfd\x9b" -"\xad>\xc2IE\xbco\xe1\xb5\x88I\xa8\x19\xbcTL`\xd4\xdf\x10 \x1b+\xe4\xb7\x65\x9dLD" -"\xbb\xc2\xbc\x31\x1\x5\xb8g\xc6\xe8#z\xf1&(Sl}B\x87\xe7\xcb;\xfc`\xfd\xc8\x44o1\xc" -"j\xad\x45\x7f\x1b\x42\n\xa6\x1e\xdat\x92m\xc9i\xd7R\xd0\xb7\xcfo6\xad\xd8\x8a\xc6" -"g\xbfI\x12\xa2\x37\x18K\xc2\r\x38\xfc\xa2\xe5\xc\xf9i\x8f\x97\x13\xfb\x15\x42u\x9b" -"!\x2\x41\x9\xd0m]\xf5\x12\x66\x34\x44\xec@\xb5\x8d\x82\x87\"\xf0\xfau(T\xa4\xfa'" -"\xf2\xe1z=\x9d[fv\x96\xa8\x87\x1c\xf2\xfc\xee%\x85R3\xb6p\xe7\x8e@\x1e\xa8\x4\x65" -"\x10\xa6\xcd\xb7\xf3I.\x8a\xbcM#\xf5\xf1\x18\x9a\xe5\xb1[\xb1\x43\x7\xc2\xaa\xbc" -"\xde\xb\x39\x8b\xcd\xc8\xcb\x33\x9e\xe3\xfaH\xbb/\xc5\xb1\xa6\x36\xb3\x8\x84\xb3" -"B\xc4\xd1\x65\xba\x9)\xea\xa8\xd4\x11\xf8z\xb8\xb3kP\xa5\x1b\xa2\x30^hh\xfz[K\xc8" -"UPR5J\x1d\xa9\xa6\xfd\xa6\xa2\xb3{\xb2H#~t\x18!l8\x8a*j\x18\xf2x\x88\xbd-W\x15\xb2" -"dc\xb3\xbd)$\xa3\x19\x98\x1eh|\x15\xddG\xe4\xeaq\xeb\xc8\x7f\xd7\\rE;r\x88\xc8\xc5" -"x\x0\x62\xb3\x18+\xb\xab\xb9\xcek\xd6\xed\xe5\x63'\xd3\x37\xba\x1c<\x7f\x6\x99\x32" -")-w\xea\xa0\xb5\x15\xd3\xeb\xe1;[\xb7\xe\x17\xc6\x66Xc\xac\x3O\xeb\x83LU\xd8\xcd" -"\x1c\x7\x83\x4\x87\x1b\xf7\xd1\xa7\x82\xa4#\xb9\x15\xf6p\xa5\x9c\xdb\x30\xec\xc9" -"M*\x0OO\xb3\x94\x63\xa2\x81[\xcb\x1a\x96\x81{]\x10Z\x8d\x1c\xa1\xa8\x11\x97\xa3\xa8" -"<\xd6K\xb1\\\xc9\xbf\x31\xcd}\x17M\x1e\xa7\x8c\x95uz`zm<\xe4\xde\x0N\x84\xf\xfey" -"\xc\xb9\x8f@\x0R\r\xa3\xaau\xe0\xc5\x11V}\x8d\x9'\xe7\xb0\xc2\xca\xc2\xde\x17 \x94" -"\x81\xed\xae\x91\x8d]Zv\xcaj\xbf_\xf3R\xf1\x1a=\xec&\xdbJ\xc6\xb7(k\xa4]M\xe5\xed" -"\xdd\x38\x62\xad\xe7\xf6\xbc\x13t\xffV#\xfc'I\xecK_\xd8\xe8\xde\xc4\x82\x10Q\x1b" -"I\xff\x88\xaag\xa7izA\xb7Ux\xa6`\x3T\xab?\xf8\xdf`\xef\x83J\x6\xe0\xa8\x8fj\x9bP" -"P\xe3\xdd\x32$\xb5\x11y~\xf8+\xb0\xccr\xa3w)\x8aqM\x3\x80\xec$\xa6\x64\x63\xe8\xd1" -" \xca\x66\xbd\xc4\xbf\xf4\x1q\x8b\x89\x89\nL\x3\xe2\xa3J\xad\x99I\xdb\x66\x94\xae" -"\xe7\xd6;2y\x81$\xe5L\xdc\x35\xaaN\xf8\xfd\xb7H\xd2\xc6\x81\x85\xe4\"-\xfc\xf0\xb0" -"=<\x12\x15XC\x89V)$P\xe7\xbc`\xe0\xc\x36\xf3\xbaZ%X\xc1S\xb3\xa7\xb3\xe5\xb6x\x99" -"A\xf8\xc8?e\xb0\xe6\xbfzbh$\xb0\xe9\x30\x8\xc9\x90\x9bmlr\x10\xf3H\xc7%\x84\xa6~" -"\x86-\x84\x34\x84\x1\x5\xb2\x81\x13\xb5\xb5\x1e\x86H\xe2\x83\xaa\x62\xe6\xc\xe2\x15" -"\x4g\x3;\xde$\xac\xb1v\x6\xe1\xed\x9c\x15\xf9\xd4\x64\x39\xdd\x0\xcf[ \xe8\x38M\xa2" -"\xba\xee\xc4\x8d<\xfb\x7\x63\xff\x37\x83\xa0\x5\xb9\xa4\xe7\xec\xb\xf3j\xf1u_\xfb" -"\x8,i\xf0\xe8\xf4\x80z)\x87\xd7\xa3\x8c\xe5\xe\x1b\x7f\xff=i\x14\xdf\xe2\xb1\x9a" -"\xd4\xb8\xa4\xc3X/\xf4\xa4\xa3\x83\xb1^\xb1_\xe5\xf3\x61\x34\xb9\x6\xb1\x8fk#\x1e" -"\xac\xf4z\xbd\x1bR\xabW\n\xc9\x64\x14\x19\x97\xd8N\x87T\xac\xb5\x9d\xe5\xbc'sp\xef" -". \xe1\x44h\xd2\xc5\xe6\xc2\x32]%\xc3\xa1" -"y\xe\xb0\xdd\xa0\xd8\x88\x61\xa7\x7f\xd0\x43\x91 e\xf0nr\x92\x90M\x96K\xcaT\x83\x95" -"\x9fo\xd4\x37\x2\xd7\xef\x13\xe0\x46\xfcgM\x8f\xdb\xf3\xb9\xf4\xad\x11\xd2\xb1L\x1f" -"\x12\n\xe5\"\xae\xbi\xb0\x1e\xb1\xde\x89\xb3\xa7\x94\xb5\xfe\xb4\xd6\x46K\xd1\x38" -"\x2\xdd\x61z\xb5:\xa8\xf1\xbb\x96$RY4V1l\xf6\xa9\xadj\x4\xc8\x93\x30\xbd\xa5\x8c" -"\xe2\xad[0\xcb\x36\x8f\xdc\x8e+b\x84^\x11|\x96[\xf0R\xee\xd2\x9c\x2\xc4:\x88\xb0" -"D`D_;-I5\xceMF\xf9,\x99I\x89\x46\x61\xa9,$\x1d\x8\x8d&\xa7\x44\x14@\xb\xef\xf5\\" -"\x1b\xa2\xc0\xech\r\x5\xc5\x41.u:\x10Vn|\x8d\xb2\xd2\x30=\xb5\x16\x1d_3\x17q\x5\xd6" -"\xba|\xf4\x8f\xac\xcb:N\xac\xa9#\xd5\xa1#\xf2\x95\x1f\xc3}\xf9J\x86\x1ap0TdVti\xd5" -"G\"\xfb\x82\xa3\x1f\xe1\x8a\x65\x5l\xad\x43\xa8r\x96=\xe7\xb4\x8P\x5\xdb\xb\xe6\x97" -"\x8b\x2\x84\xe5\x13\xa8\x98\x87\xba\xd0\xd8\xf3\x8b\xba\xa5r\xf6\x66\xc|\xc5&T\xc7" -"\x6\xf0\xb8\xe1\x98)l\xc2\xc6\xee\x65\x61{8:?I\x1dV'F\xfc\xbd\x1M\xb7&\xa5\rOD\x10" -"\xe6N\xd6\xf\x10\xd5\xe4\xf5\x88\x9dt\x1e\xde\xda\xd2\x90\xc0;\x9d\x9c\xa9\x95\xf4" -"\x9e&\x4\x42\xe7\x30}|\xcd\x36\xea\xcb\xd5\x7`\x1d\x66\xaa\xeb#&\x5`\x1a\xa2\xb9" -"\x90_n|YE?\xe]l\xe8\x45\xb\x8a\xdb:7+@\xb7\x65\xb~\x81\xb0\x98\xf\x9R\x9\xe8\xda" -"\xb1\x94\x1L)\x9d\x65\x91\x44\xaf\xef,\xdf_\x12\xc0_1\x1\xc7\x39\x44\xd7n\x9e\xe2" -"\xfd\x92\x90k%\xb6(W\xb4\x92\xb2:f\xcc\xff\x19\x8\xcU\x95_\xa1g\xb7\xaa~\x13\xbf" -"_\xa8s\x11\x66\x95Q\x83\x41\xa7\n\xa4\x18\x44\xef\x3\xc4\x81\xc2\xa3od\x16\x1dr\\" -"\x15\xe\x86\x9e(\x4%\x99`8G\x7f\xc5\xa6\xdb\x6K\x8d/\xd9\xbe\xd3\x11\x9b\x8d\x93" -"\xd1\x9c\xfb\xe4\x18\xb9]d\x83\xbb\xf8\xd3\x4|\xb7\x88\xe3\xb5\xd3\xeb.\"\xe\xec" -"{H6z\x91m\xf7rdY\xbb\x90\x46L`\x96\x2\x9d/x\x1d\x30P(\x89\xac,\x93\x44\xb8\xfa\x45" -"\xec\xfb\x1fP\x99U\x1fX\x0K'\xc0\xe4\x89\xfe~\xc5\xeam\r\xfc\xe3\x1c\x1b" -"P\x6\x80`sr\xbe\xd6j\xe3=\xb1\xae\x66\xa2\x15\xefW;R\xdd\x7)\x9d\xb4\x1\xee\xd5\x36" -"\xeeK\xbX{\x91\xc\xcc=Qr\xb4\xac\x15H\x90\x98\xa6\xec\xbd\xcb\xef\xf2\xc9h\xd2n\xdc" -"3\x9a\xcd\xfb|0\xe4\xb1>\x9bSb@&K\xcc*4\xa2\xea\xbd\x64\x1c\x9e\x9a\xedpo&lI\x1b" -"j\xc6\x18\xc0\"\xb2?\xdf \xe5\x80\x9f\\\xaf\x1\x98\x87k\xa9+W{\x12\x8f\x81\xd8\n" -"\xff\xc4\xb6\xaa\x9b\x8c\xa7G\xb7\x83.Q\xf@L\xbe\xb6\x39\x39\xb5\xd8\xa7\x7f=}\xa7" -"\xf2?\xb2v\xd5P\x9Y\xa3\x94\xa2\xa8T\xda\x1a\x36\x1b\x8e@\xd1\xa0\xf4\x1f\xc6}Q4" -"\rh|+\xeb\xcd\xa5\xbb\xa4\x18iL\xc3\x92\x30\x1e(\xe3\xc2\xc2>\x7\xae\xaa\xf4Ip\xe0" -"\xdb\x8f.D\xe6\x7f\x9f\x37*\xffg\xf7\x35\xb1\xdf\x1a\"\x8b\xe4\xdf\xd3\xeb\xc0\x92" -"-\xf5\xbe\xce,\xb1\xbc\x8exC1\xaa-@_G+\xb9\xed\xb4\x1b\x80\xc7\x84\xf5\xa7\xa7\xf3" -"\xbb\xda\x85h\xb7\xb2\xea\xcb\xa1\xc\xfaW(\xf5\xa6`\x9a\xc2\xa5\x90\xb7H\x83\x16" -"\xc\xb1\xf1-\x1d\xd3n\xbT\xce\x38\x8c\\\x8f\x30\x34\xf8\x85\xa2\x99yY\x9f\xe6\xd5" -"\x9e\x93s\x9f\xf9\x8b.\xacyx_\xf9VB$\xd6\xb4T\xfc\xc2\x8\x43 \xd2\x8c\x90\x3\x2\x37" -"\x94u\xb9\x11\xdf\xd9\x95\x1b\x7^O\x14&\x86\xa3zCz\xef>\x15\x81@\xdfq5>\xf\x93%\x46" -"\xff\x92\xb9\xfb\xb7\xc4M\xb1Sp`\xe9JB\x11\x64\xe8\x14\xde\x32\xd1\xf3\xd4\x8\xd4" -"4V&\xb8\xbe\xe3\x88\x96\xff\x33PF\xaa)1\x85I\xcc\xc7\x8b~\xcb-\x17\xd6\xfc%[i\xc9" -"'\x81\xf9\xa5\x61\xdd\xd8\xbd\xe0\x9f\x4\xc4\x37L\x2%|\x98\xe2N.\xe4\x7t\x1a\x8f" -"\x2\xb8`\"\xd9\xdc\xc4I\xb7\x30\x96\xf\xcf\x1b\x9b\x8d\x65\xaf\x9e\xf\x10\xaf\x8e" -"\xdf{\xd3\xf1\xcd\xaa\x9d^\x15\x4\x16\xb6\x33@\x89\xdc\x86.?\xde\x66\x33\xfa\xd9" -"@\xbf\x88\\\x97\x61\x85\xadVg\x99\x1eu\xa2Y08\xfc\x8c^\xda\xc8/\x6\xc2\x13\xb0\xda" -"\x99\xcp\"D\x9bvza\x9b\xbe\xe9\xc2\x9e\x65\xd9\xcaS\xce\x96\x1m\xc\xd4\n\xaa\x18" -"\x8a\xa7\xc6\xb\xce\x10\x14&^\xfd\x92\x6\xdd\xab\xb6\xc0\xab\xbeT\xf1\x89\xc@EH]" -"\x1dO\xa0\x3\x87K\x10R\x14|\xd2iU+f4`\x93\x1b^\xf7\x82L\xec\xb7\xd7\xb8_fd\xa7\xbf" -"\xec\x44\x8a~Y\x1d\xafh\x91\xf8\xf8\xb0\xc5\xf8\xc8$\xd5\x6\x7,\x9e\xf6\x83\xbc\x85" -"\xbe\x1e\x7fN$\xe\xe4\xb\xb1\xe2=N\x8fo\x8a\x31\xf4\x64\xf1\xa5\xd1\x39\x89\x45\x64" -"\x4\xff:P\xcd\xe1IV\xdb;$\xe0j\xf7\xbd\xb5Rz\x0\xf*\x85>\x95\x35\x91MF$\xcd\x39\xea" -"\x90\xa4\xef\xdc\xac\xaex\x11\x37\xc\x81\x30\x9e\xf3`\x2\x1d\xcy\xf6V\xbf\xd4,\xee" -"\xf8\xf2\xa7\xacofGH$D\xf5\x87\x87pk\xe9\xc7\xab\x84\x44(\xaa\xbb\x66y\xe4\xb8\x98" -"'\xaf\x8c\xf9U\x0\x93\xb0\xf7\xeax\xa5<\xa2K\x8c\x89g\x9\xae\"\x13\x30\x85 ,[\\>" -"I3\x9+lZ-N\xf8\x8c\xd2\x46\x97)L\xd7Jz0W\x1e\x14\x32wp\x8fT\xfL\xee}\xd8T\n\xc1n" -"\xc5\xf4\xde\xd4\xd4=\xce_#\x8d+`}w(\xa3zL\xd1\x10\x87\x93%\xf5\x83\xc1\xb3p\xd1" -"n\xbf\xba\x95\x80j\xb6+\xf0\xfe\x93\x1c\xa5\x8eh\xfc\x10\x10W\xcc\xe1\xbe\x64\x8b" -"\xa9\x9dj\xf6\xf4\xf2\x88\xa8\x1a>u\xc2&=\xc3*\xab\x93\xd4\xed\x5,\xd9\xf9\x7f-\xd9" -"\x12}\xd3/\x89Z~v\xbl\x4\xbc\xa8\x4\xec(l1\xd5\x88P\xac\xb7\x83\xe4\"~\x8f\xe6\xa5" -"^\xb5\xfk\xb9\xaa\xa2_\xe4\x64!\x16\x9a\x10\x88\xc3\xa6\xc?\x83\x91\xac\x82,W\xa4" -"\xd8?\x1\x8e\xd3\x39\xd5\xa7\xf9\x1b*G\xc9Q\xee\xa9\nsh\x3\x93&A\x83q\x0\xc5\xcd" -"L\xb6\xce\xff\xdf\x15z\x98\x35\x85_S\xd8\xbf\xe1\xe5J\x98T\xd8\xf7XN\xd4\xe9w0cT" -"\x97`J\x9d\xf1VB\xbb{\xbe\x85L\x87\x15uUo\xb\xfb<\xcf<\x8a~\xf1\xae\xaf\xf3q\x87" -"Z\xd2\x30\x14\xe0\xe5\xcf\xa1\xd1\xec\xceZ\xc4+\xb7/\xf4\x63\x33<\xef\xb2\x37{\xe4" -"\xcdq\xcc\x6T}\xcet\x82z`\xbb=,\x92\r\x91\x8f\x65\xb0\xf4\xed\x43l:9\x98ye 4\x99" -"r\x8d\x7f\xb\xa4\xa3\xde\x62\xb3\x8a!h\x91K'\x9c\x94U\x95\x9cQ\xf2\xdcI\x5\x81\x31" -"-&\xf3\x91\x13\xe4,\xfc\x81x|\xd3\x9e\xd8\x84\x19\x86u)\x8c\x99p\xcek\x7\xa4\x39" -"\xae\x17\xd3\x46\xf1\xa1\xc4\xc5\x41\x7f\x0\xd3\xa2\x85\xf5\x9b\x8\xbe#\x1\x80r`" -"\x8e\x8d!\x3\xddn\xb5(%5$lx\xc0j\xbe\xe2\x8e\x89\x81h#\x19om\xa9\xf6\xd1U.\xba\xd2" -"\xa2\x86\x33\xac\xf3\xf2k\x86\xde\x65\x1fZ54\x92;\xf5GX\xf3\x94\x46\xfd\x8c\x96\xb" -"\xc1\x8\xff\x90 \xc8\x8a\xd0\xbf\x94\xf2O\x8c\x44Ia\xbf\x17\x42\xde\xdf\x34\x83\x9a" -"N\x86\x96Q)L\x8c\x9a\x83\x83)\x1a[F\x4\x16\xa6\xc3\xf\xc8\xb2mttM;\x6\x99\xbc}}\xf9" -"\xaf\x19\xe6\xc2\x97\x3.\xd6\x1c\xd9\xbe\x4\x1d\x42\xe1\xa8Rr\xd9\x81\x17j\x8d=\x2" -"\x83\x46\xd2\xb3\xfdl\xf3\xbf\xebu\x9av\x14\x9f<\x83\xa3r\xb1j\xa1}\x8d\x13'SQ\x90" -"\x1eU\xbe\xf3G}\xd1\x44\xe\xd8P\x9aV\\\xfe\xbK]\x83%:s\x82\xb9\xea[\xae\xd8\x30;" -"z\xb5!ZL\xd3\xac\xbb\xd2\x8a?\xc2O\xd8\xe6\xebY\x0>\x8\x80\x83G\xea\xc9I\xce" -"\x18\x7f\xa8\x16\xf6\x9en\xden\xb7\x95\xf9\x10\xdb\xfc]\x85\xc9\xf5\x81\x62\x1b[" -"~\xa9\x82\xab\xbfY\xe7\xe0\x1e\xb6\x65iSUHmF\xa3\"-\xcc\xf7\x9e\xfa\x5%\x42\x9\x3" -"N\xab\xb0\x14{\xc5\xe2\x1d\xbb\x36\x12\x96\xae\xb0\x14\xe2\xa6$qf\xd2~VC\xbf\xc0" -"j\xc4\xb1\x38\xc0\xbb\xdd\n\xed\xd1\\\x46\x8e\xae\xf7\x43$e\x1a\xcag\xc0\xf7\xbe" -"B\x12&\xdb\x7f\xbf\x4\xb2\xba\xed\xaf/\xe6u/\x13\xd9\xdf\x1f^0nS\x94Q\xdemp\x8eX" -"2\x8d\x19\xb8$\xe8\xef\x30\x8d\x30\x44\xf8U+[\xa5\xb3\x1e\xb1\xfa\xed\x15\xdc\x9a" -"\x99\xf0\xd4nQ0\xb5\xe6=w\xc6=@}'t\x91\xfb\x9d\xa2g\x1d$\xe5\xcd\xc1Z8\xb2g#\x19" -"\x14\"?\xfb\x45_}\xf8\xbb!\xf9\x65\x43\x8c\x37G\xb7\xc1\xf0O\x8cZ\x9f}\xab\xe1\xea" -"C\x5\x14s38#%g\xc4\xa1#J\xa8\xaf\x98\xe4\x45\xe2g\xd3\x9a\xf7\xe\x9e\xb8\xc2\xa6" -"`\xa2\x15<\xce\x33\xab\xe4u\xb3\xa8\x94\xe2<1\xfb\x10\xc0\xf0\xab\x99Lh\x9b_\xdc" -"+m\x7\xa7\xf\x9a\xf7\xfbO\xf8\xb3\xe3L_\x1d\xe2\x96\x89i\xf1\xbd\x83K\xabZ&&\xf1" -"\xf2[\x19i'\xc6\x80\xb9\x43\x8fy^O\x1f\x31\xc4\x1e\xab\xf1\xed\xe6.\xbc\x46\xbaR" -"F\xd0\x86\xac\xd1\r\x32I*\x12\x9e\xed\x91\x1a\x18\xa4\xb3\xdfy*M\xbf\xc8\xe4O\xbc" -"kq\xd7\xdc\xd6\xde\x91V\xf2\x3\x9(\xc7\xd7\xc1XO\xf4\xf5\x34\xf2!7}\x8b.t\xdf\x80" -"\xcb*\xbd\xcchW4\xab\x84\x66\xef\xb9\x81\xa3\x61\xdf\xdd\x85\x9c\xa6s\x1\x84\xfv" -"I\x1f!\xc6=\xd5V\xd4{Q:\xa6\xbfV\xdc\x42|\xa6\xca\xc2(\x9g\x1a\xf9\x9\xf8|'H\xbe" -"\xe4\xc7\xacM\xba@#\x90\x94\x30o+@\xe2\x8d\xcd\xbf\x90\xcf\xb2.\x12|\xd5\xf2|\x1d" -"T<\xa0\xc5I\x96>\x94\xd9\\\xa0\x7f\xf0\xfam\x1fJ\xfd\xfe\xeaR\x89\xe7\xa3:\xb1\xa3" -"\xee\xae\xd3+\xbcWm\xf1\xd5\x87\xaa\x9c$\xaf\x35\xe\xe5\x34\x9f\x1e\x1e\xf9\x6\xad" -"\xfc\xdd\xeb\x97\xa8\xafUV\x19\xb4Z\x8b|qB\n\xce\x89\xfa\xde\x1f\x98\x7\x97\x90\x92" -"W\x8>&#,\xc\xfe\r\x38~\x18\xd4\xd4\xd1\x0\"\xa0\x1\xbfz&P\x12q[\r\x9c\xacS\rmn\xdf" -"%\x91\xfe\xcd\x9e\xbb\x19\xea\x15\xa9\x31\xf5\x81Ln\x83\xd6>6\xcc\x36R\x19`\xfb\xfe" -"iv\x85Ucvf\x1e\x35M\xfe\xcf\xd1S\xfc\x87\xb6\x1\xba\xcd\x3\xb1\xca\x85\x37\xccx\x8c" -"F'\xa4s\x1\x17Z\xba\x9d$\xa6\x6\xfaY\x15\x96~\xcG\xb1#\xa5\xa6U.\x8f\xb\xfdt\x8e" -"\xa7?\"\xfe[]\xe2\xef\xc0%\x1d\xa7\xd2\x91|`\xcd\xed\xca\xec\x63\xe3M-\x16\xbc\x17" -"z\x9e;.\x9b\xe7\xf2Vc\xdep\x8bt\x92\xeb\x9d\xaa\xe\x9czz\x8cQ\x17\x46\x14q\xa3\xf8" -"\xa9\xd7\x4\xfd\xfchH\x95o`3\xe9\x80\x6\xd0\xfbS1E>\xdc\x8d\x38T\x14<\xa5I@\xdd&" -"\xdbV\xc9\x4\x83\x9a\xf1\xce\x8f\x7f\xb2\x97\x3\x8\xa4\xd1it\x16<\x8c\x86\xe0\xa2" -"\xb3\xb5\xee\xaa\x1fN\xabYEw\xb7l\xf3Z\x1d\xda\x94i\xeb\x31\x9c&h\xba|W\xb4\xec{" -"\x80\xc4\x13\xa3\x84\x12{\xa4\xb9)\x18&\xd4\x81Zc\xd9\x87\x65\x7f\x9e\xa8p\xc7\x63" -"\xcc#\xcbt\x1\x3\xff\x30\nP\xbb\xbb\x30\xc2\x9a\x8d\xf5\xb0\x81\xd3\xef\xd3\xd8\xcf" -"d\x12k\xa3`\x84\xfa|\xef?M]O-\x8b&\x1\x1f\x85L7wGp\xa6\xc3O\xfd\x0\x86\xa5\rka\xce" -"\xc6\xe2^\xd8\\\x36wj\xd1\xd5\"\xf0\x6\x9coo\xb1 \xf3\x19\x1b\xfJ\x6\xc0\xbaP\xc2" -"\x9a\x42\x83\xc7\xd8v#>#\xc1\xef\xa5W`\xca\x46I\x1bi\xa3\xc\x8e\x63\x82y\xa4\x38" -"[3Y\xce\xb5\xbcJaj>\x1e\xce\xbe\xe2\xab\x42y\xc5\xcc\xb2\xaa[uv\xd0wr\x15!|\xac?" -"\x16\xdbs\xfb\x15&\xc4\xc9[\xdb\x66$H\xcf\xf2KH\xb\"H4\xf8\xb2\xb3\xe4\x9e\x42\xe7" -"\xb6h\xd9T(b\x14\x11\x65;@k\xff\xbd|\xd5\xfe\xae\xbe\x10\xda\xde L\x86\xbf\xd3\xa3" -"\xc0\xc\x12\xaby\nY\xd9\xe4~w\x98\xe5\x80q\xdd\xbb\xb5\x83\xe2\xc9l'\x87m\xfd@\xf6" -"\xad\x8e\x8!&~O\nWM\x8e^hL\x9a\x45\xa7\xf\x99\x9e>\xde\x8b\x0\xc1Pk^\xf0\x0\x1c(" -"3J\xef\xd1\xf6\x30\x9c\xf2\x90\xefX\xfb\x7Sy\xda\x9f\xc6\x9\xc3\x1b\x1f\xd0\xbd\x33" -"\xdf\xae]\xe4\xa7\x4\xe0(\x86\xa3\xfd\xa2,\x5T\xbd\xe2\xc7\x1f\x65\x88\x3\x62\xba" -"\xdf\xea\x14q\xb5L\x6K-\xde\x3\x61\xb5\x86\xb9\x7\x15T\xd7~\\E\xd7\x4\xae\x13\xf6" -"T\xa3J\x9d\x34\xc1\x98\xce\x8fV\xbe?\x99\xd3\xc6\xa3\xcd\xa1*oH\x8b\xaa\xc8\xff\x82" -"\xb7\xce+*4\x1a\x1e\xb6\xd3!\xfc\xe0\xa1\xfe\xef\xb4\xc1\xa1$\xa9\x12?b\x80\xdb~" -"\xfe\xf0\x43O\xdd\x9c\x1fW\xc=\x1fp\x85\\\x16kv\xfc\xdf\x37#~\xc0m\xf0\xba(\x97\x10" -"\xb1\xa1\x46qB\xa3\"\xca\x14\x12\xc9kA\xbe\xb0\x0;\x12\xf6\x42?\xa9*D`%\x9b\xad\xa3" -"p,!\xe2\xbby\x9ep>\xac>xu\xf6s\xaf\xc8\xa7R\x93\xea\x9d\xa1o\x1f\x87\x46Z\x8f\x9" -"\x84\xe4\x45~\x96{\xa7\xc5\xd2\x65\xf2\xd9\x97\xee\xfcQ~'f8!Dg1b\xd6\xf9\x37\xbc" -"m\x7Zy\xe8\xf5G#\x9b\xd8\xa4.\x80\xa4\x65|\xc\x92}>zq\xcd\xb8\xd4\x95\x34\xce%L\x1f" -"\xb\x16\x1coI\x87\x66\xd1\x1b~@\xbbG\x0\xec\x8e\xc6\xf6(%5\xc7\x8a\xce?\xdeS\x9f" -"\xf7m\x85\x44\xc\xac\xfe\x7\x2&Qc\xde\xf\xed\x12\xf3\xcc\xd1\xd5\xfd]T\x4),Q7\xf3" -"\x89\xdaN\x5\xb7Q\xc3!\x97\xdcm\xfe\\\xcbM\x80\x16\xdd\xa6\xc9$\x81]m\x80\xfd\xbf" -"\xd0N\x13W\x92*\xe9\x31):\x92U\x9e\x61\"\xe0\xf9\xa1\xabI:O\x82\xac\x62\x90\xf4 " -"\xc1\x8d$(\x7f\xecL\xd4\x1c\"l\xc0o\x5\x12\x12\xfe\x8eN3\xf3\xe9\xd5=7\xe0\xfcx\x19" -"\xce\x85\x9f)c\xe2\xbe\xbc\xc4z\xef;\x87}\xf8:\xd2\xe7\xa1\xe3\xbe\xc7T\x7\x9e\xd7" -"\xf3\x30\xf6\x84\xdcS\xcd#\x89\xfe\xa7%\xd1\x0%\x30\xf5\\Mr\xae\x38[n\x83j8\xd3\x6" -"\xe7\x64\xea\x1c\xc4l\xa0\xb\x6\xc4\xa9\x1\xbd\xd4\\\xd7nE\xdco|\xcc\x2\xce\xe1X" -"\xea\xe3\x19p\xbb\xed\xc3\x1d\xab\xd5\xfb\r\xc2\xe5\x1f\xf8U\xe5\x31\x43\xc7&\x10" -"o8\x8J\xff\xef\x8c\xec~\xad=\xe1\x94\xdc\xff\xafwX9\n!\xae\x63\xbb\xfc\xb1\x8cM\xb3" -"\x91\x38\x43T\x92x\x12G\xe2\x9f\xe2\x8\x9a\xf2\xc6\xcc\x99\xfa\xd2\xaf \x0\xf0\xc1" -"\xf4\xb5\x94N\x15\xcc@/\x99\xd7\xe9\xea\xee\x3\xf5\xa9mA\x98\xbd\xd3\xdcQ@\xb3\xab" -"\xd0\xb5\x30\r\xb7\xb4\r\x1a\x39\x86\xd7\xab\xdf\xb5\x99\x34\xd7\xdd\x0\xeaT\xc9" -"\x86x\x5\xbaj)\xf6\xe\xfd\x98s\xd7\xad\x8f\xf5#\x99\xda\xf4S\x11\xc6\xdd\xbd)c\xb3" -"\xdb\xe5\xad\xe0&\x2\x9\xf9\xfc\x81\xea:\x88\xb4\x2L\xb1\x7f\xb8\xbc\xf0^i\x6\xfd" -"\x95\xfb\xc5\x4\x39\xda\xac\xb2\x86gY\xe8\xc8!-\xeg\xa7\xebJ\xad\xd6\xbc]\x94\xf8" -"\xe9\x7fg\x5s\xc<\xd2\xbb\xd3\x3\xd6\xc1qL{\xa6\x41\xea\xda\x96\xdd\x89\xcbo\xe1" -"\xd6U\xf4\xb6sT\xa1p\x8f\xf1[\xc6\xa4RE\xd5v\x95\xcdR7~\x7f\xd3\xe3\x8f\x94\xa9\xc4" -"\xda\nz\x92\x1b:h|^\xe8\xd0\xbd+r\\\x95\xe8\xdc\xb5\x82\xf7\x9e\xa5\xd5\xa7(\xc6" -"i\x1e\xa4yPaLx\xc4\xc3w\x19\xde\xfb\xc6\xe5\xb\xad\x81\x65\xf1\xed\r\xcc\x2\x8\xaf" -"\xd1#e\xe7\x9H\xd4K\x14\xf9\x1b\xf9\xc\xfd\xe8\"\x96\xc0!\xaa\x11#d6\x94WV{\xf5\x84" -"\x97\xec\xe9\xa3o@X\xc8\xeb\x17\x13\x96\x92t\xd2\x98\x16h\x6#pM\x3N\xaf\x90\xcR\xe0" -"IuUkX\xc3\xea\x63\xe5\x44|\x19t$\x8dq9\x88\xc5\x8d\x1b\x66\x63!\xd5\x35\xbe\xc_\x90" -"\xe0\x61\xa2\xa2\xf7\xc3l\x1e\x5\x8f\xb2\xc0\x1fMvu8\xa6\xe4\x1e\xca\xe2(T\xb8:w" -"\x10\x1b\xf8\x65\xd6\xdd\x44/\x89\xcf\xca\xce\x8c\xbd\xa3\x93!\xef\xbc+y\xda\x45" -"\xfb\xb3\x9f-D\x8b\x3us\x10(;\xfbs\xb9~\xeb]\x16\r\xc0\x2\xd1x\xeb\x38h\xa2\x93\xbe" -"w\xf\xe4\xb6<\x1L\x1b\xb\xbf\xdf\x1a\xf1\x91<\xd5H\r\x96\xd0\x90\x80\"Q\x83\x38\xf1" -"\x8a\xe7\xc3\x96\x1e\x1d\x87\xcb\xa5\xb6\xa4%M\"Z,\x9c\xaf]\x97o\x17\x64\xa1\x42" -"v\xea\xb0\xffGh\x8aY@\xc3\x0\x85\x14$\xea\x93L\xd5\"\x7iG2Xz\xe[\x1kj\xde\x30" -"\xbe(\x87\xb8\xed\x2m-\xf4\xc5\x39\xd1\xa0\x30\x8b\xb\x9w\xb\xe6\x1d\xdb\xa0\xfb" -" \x92o\x7\x39\x9a\xe6\xc9\xc9\x37@\x1e\x1e\x16\r\x3u\xa8\x9e\x87\x9\x17\xde<\xf4" -"\x96Y}\"\xa8\xacg\x13\x8d\x43\x13PxA\xae$\xba,\xc\xf8\xfc\x1e\xfc\x1a\xc5\xb8\xbb" -"Q\xefkP\xb3@\x86 \x17u\x9e\xe1t\xb4\xbc\xca\x90\x87\xf5\xc4\x63\x19\x84\x7\xf4\x1d" -"\xf4\xe\xad\xbf\xbd\xd7\xd7\x37Y\xcc\x41\xa9\xa4P;\xea" -"&\xd1\xed\xbe\xd3\xff\x45\xc\x9a\xd2\x1f\xc0OOi\xf6q~\xd8\x9e\xe\xf9gb\xe\xdb\x85" -"\x9b\xb0\xd7\xef\xa3\xb0\xed+\xa5\xe4\xd5\xba \xeQ\xd9\x87\xb0P,\xa4\xb2\x1fn\xfe" -"\xc5\xd2\xf4qhO\xaeq0\xea\xe3\xe4\xed\x90\x6\xee\\\xb1Nk\x98\x83\x62(r\xb1\xbeU\xe0" -"\x9b\xe1\xe4\x9f;\xb6\xbf\x7\x63\xcX\xc5\x98V\xf2=\x1f`\xd4\x45\x89\xe7\xc9Y!\x7" -"\x19\xf7\xe9 \xfa\x6z\xd3\x43?\xddI\xf(\xc9\x4\x8c\xd9\xfaJ\xa4=\x13N0X\x13z\x9\x18" -"N\xe4\xff\x44\x12\xcf\xc2\x4\xffJ\x99u\xb9j\xf8\xbe\x17\x3\x1f\xfe\x14\x83\x4\xaf" -"\x1cN\x1-r\xfa\x65\xba\xaa\x96\xeeW\x9a\xb5H\xec\"\xd8\xa4\xe\x8f\xcb,.\xfa\xb5)" -"\x84\xc7\x7s\x9S\xf8\x66\xbf\xfc\x31\xa8\x1e@B}\xce\xc5)\xa3\xbe\"\xf7w.&\xec\xf" -"\xbc&\xeb\xc4\xa3\xb5\x61\xefu\xe9,wv\x84\xea{8\xd3=\x99\xd8\xf7\xceN\xbb\xe1\xef" -"6\xce\xc7\x12`Y!\xe0\xcc\x42!\xfs\x8br\xb8\xb0n,i\x9djxcy\xa2\xfe\xce\xa0y\x91uV" -"\x9f\xe7v\x0\xfd?\xa6\x61\xf5\xe9\xd8\xe6&\x4\xf5\x9c\x33\x18\xcfS\xe2\xfa\xfdh\xfc" -"\xe5\x44\x8f/\x4\xc3\xa5[\x84\xae\xe7\xf2\xbb\x12\x95\x30\x4\xaa;h\xf8\x12\xce\x7f" -"%\xcf/\x8a\x9\x2\xd3\x8dsZ\xb\x9e\xfcGR\xaa?\xe8\"\":r''c\xd6IjN\x82\x63K\x8d]fl" -"\"\xc8\xf3m?\xa2\\\xb4\x9c\xd8\xcbW\xa6\xac{H\xd6\x97\x90W\x80\x1e]\xe9\x1bP\xdd" -"_\xad\x99\x99\x99{c\x86;s\xbb\x96\x94Y\x8d\xbf\xe2W\x5\xb1\xdd\x46h\x91\x9U\xa5\xe6" -"\x12\x87iD\x8d\x35\xdc\xe\xd2\x1f\xb4\xc0\x17\xd1\xc\xdc\xd5\xd2K8lA\xe2\xd0o><\x10" -"^\xda\xde\xfd\xa6\xa5\xffn\x10\x16\x13\xbe\x39\xba^\xf5\x11y>\x96\xa5\xaa\xec\xd4" -"\x1e\xe1\xbfK\x85\xa1\x44\xe1G\xed\xec\xc3m\xfd\xec\x82\xcT\xbcZ\xe1{\x13\x8b\xff" -"\xf4\xa3\xb]\x10\xb3\x7\x63\xcd\x94I5\xbf}>\xc0\xae\x83\x96\xf1\xbd\xf0h\xb5\x19" -"Q\xd2\xa7\xde\xac\xaa\xde\x5=\n\xae\xc5\x9\xd2}2mUb\xc6\x86*\x3\x82\x96`\xae\x96~\xca\x18" -"\xebK\xfe\x4\x19\x1d\xdb\xa3\xe0?\xb6\xdb\xab\x9\xec\xc0\x1c\x66\xa4K\xfa\x7t3\xa0" -"H\xb7\x41\xd9\x8a\x4\xf7\xea^}1\x4\xe4\xd6\xb1\xb4,\xf3\x8f_H!\xebg2\xc6\xde\xf7" -"\xe2\xb0g\xc9\xee,\xb4\xac\x2<\xa4\xc3)\xd3\x81\xa1\xa7Q\x1e\xcc\x33\xb4\xbbK\xd3" -"&s\x91\xba^J\x88\xd8H)\xc5\x41\x38-N\xc4\xee\xe3\xa4h?|\xb\xad?!\x9a:\xb5\xd0\xf5" -"\xa7\xdc;\xe3\x13\xdd\xd4\x34%]\x12\x99\nv)\xc7\x12\xa5[s.\xc7\x65\x1b_\xa6\x1f\xbc" -"l5\xe3\xf2\xb7\xe2\xc3\xb6+r\xc8}\xf0\xa6:\xac\xe3\xa2\xc7?\x9@\x9d\x0-\x83\x11Z\xf1\x34{\x99\x9" -"\xd0\x8c\rT{fCFm\x11\x9f\x42\x96\x9OL\xef\n\x10\xe\xb2<\xbd\x1c\xdc|\xf6\xe8\xbf" -"#c\xa0\x42\xc6M\x82\x34\xbe\xb4\xbb\xdd\x32\x9d\x62\xc\x99\xa6\\V\x4'w\x80\xc3\x43" -"\xb5\x1f\x84)\x8\xef\x1e\x66\xb1%\xb6S\x87\x88[\xc1R\xb5\x5\x66\xda\x9c\x8bq\xce" -"6\xf}rH!\xc5\xa0o\x98\xb3\xd5@\x8c\x1!~H=-@\x6;\xd2\xbe|D\x7f\xbe\xb3\x98\xe0P\xe6" -"\x8\xd2\xdb\xfc\x8a\xe8\xb7QmV\xa8W\x85\xa6\xa6;\xa1\xd5Y\x97n\x8ci\x99\x38\x63\x1b" -"\x10\xb5\xe3\x14I:F\xed\xd7\xdf\x42\x9a\x7fu)\x10\x1e\x32\xc5\x7f\x8\xbb\xa5\xbb" -"n\x98\x6Q\xc\xc3\x9e\x14\xce\x46\xdd\xb6&\xfdJ[\xe\x89\x44\x44\x9\xb4#4\xe7\xd6\xa5" -"\x87\x83m\x1c\xb0\xc0\x96);\r\xcf\xec\x87\xd7=\xc4\xe9\xf9\r\xdc,1*\x2\x1a\xf0[\x95" -"\xf3+\xdcK\x96\x16\xfbm\xb1\x44\xd7j*)\xe8\xcd\xe2w\xa7\x3\x36 \x88\xa7m\xb6\x41" -"<\x84\x6\x61\xb3\xaa\xe4^\xe5\x62\x31Xl!\xf8\xff\xe8|0\xc2\xf0\xbk\x95Sp\x94\x97" -"?T\xa5\xc1Su\xe6T\x9f\xe4^.\x2\xbo\xc5\xf6$\xe8\xc3\xa9\xb3\rs\xd0\xa3\x97\xe5\xa3" -"-\xe1\x92\n\x15\x99{\"\x2v\xba;\x9dp\x19%Z\x88\x45U\xb7{\xc2|\x12\x41\xaf\n\xf4\xd6" -"\x1dl\x8aN\xcd\xbb\x15\x8d\x86\xe2\x1e\xed\xe3\xcck(\x90\xbq\xac\\\x94^Yl\x9a\x85" -"F\xab\x1\x12_\x8a\xb5\xfb\x17\xc9\xcc\xf7Z\x8a\x33J\xab\xd7pZ-\xf1\x16\\\x97\xc1" -"~\xd6x\xa1\xaa@\xfd\xe4\xf4\xa6+P0\x99r\x7f\xefZ\xfc\x32\x80|\x5\x18\x66\xcao'\xac" -"G)\xac\x1\x91\xed\xf0\x2\x81\xa9\x14\x84n\xa0\x85&\xec\ris\x1(Q\xe8u0Y\x1b\x16\x8b" -"l\xd6\x9b\xf\x44\xa4P\x88\xee,\xed]S\xe0^\x1b\xa5\x63\x35\x1c\x99\"\"\xf2:X\xa2k" -"\xe2\xdc\xec\x43\xce\x16\xe2\x81\xf7\x91\x84\xfd\xa1\xc9\xe4\x6\x4\x41'\x9\x1dW(" -"\xd7\xd4\ri\x6\xe0\xf5(\xe1-\x8f\x82\xa6\xb1u\xe3\x9b\xba\xb4Z\x96S\xb2\xb4\xbb\xe4" -"h\x1d\xa4\x93\xb3\xc1j \xe5\x64v\x86\xbe[\x7\xe7\xf4\x10I\xa2\x64K\xef\xe2\x8a\x10" -"\xeO\xf5\xee\x34\x10_sn!o\xe3\xe8\x1a\x1e}*\xb8\xad\x82;\xd5\x37\xc4\xb6\xc2\xbd" -"\x9e\xe4\x6\x16q\x17\xc8\xb3\xaf\xd2\xca\xaa\x36Y_\xe3S\xaf\x33\xd3\x6\x6\xdb\x99" -"/M\xcc\x8ct\xe1\xc1\xb5\xea\xe\xb4r/l\x9d\n\xb7\xaaND\xe6\x1d\x64\xea\x9c\xc3\xef" -"cz\xaeT\r-\n\xc7\xd9\xcb-\xab\xb1\xa3\xbe\x34\x63\x36\x1\xa5- m\xb3_t\xf1H\x1aT\xcd" -"\xee\xf2\xff\x63\xbb\x31\x2\x83\x61\x9d\xcd{-R\x8|\xfe\x95{\x93\x1ey&\xef\xb5\xc4" -"{\xed\x86O]\xd8\xe7\xe5X:\xd6k4\xeeQ3\xdf\xd7\xb8\x8c\x96U\xf1\x96\xd4\xd5\xc2\xd0" -"oG\x8c\x89\\\x46\xa2\x7f\x1e\xf8\x2\xf5\x12\x64w\xfa@\x7f\x80\xd4\xd2\xcbU\x11\x9b" -"\x8c\xd8r'/\n\xe8\x8e\xc5\xc3\x15\xaa\x46\x9e\x37\xcbz\xf9i\xd8\x88hQBj\xe3\xe6\xed" -"[\xc4H\x13_\xccX(/\xb2\x38g%c\xa9o \xc2\xd3\x8dknC\x1a\xf7\x6\xef\xe5\x94Og\\\xd1" -"i\x9e\xcc\x46\x44\x45\x89\xb0\xb4\xab\x41\xc5\x38{\x1a\xe8\x44\x39\x9c\xcb\xaf\xe4" -"\xcdwr\xd9tH\xea\xa4\x2\xcb\xdf\x9f}\xf5P\xaa\xb5MG\xe2\xf6}u\xf2\xc3\x64\x31\x8f" -"\xad\x9d\x8\xe4}\x15\x38\xc7\xaf\x6\xd6\x1\xf0\xc3\x1c\xa9)XI\xf8\x9\xe6\xea\x17" -"\xa1\x13\x88;^\x19+\xa7\xeb?\x9a\xckU\x15\x9eg\xc0\xc0\x85\xfe|\xe9\xcd\xeeH\x9f" -"\xbc\xa0\x66-/\xf1\xa6\xd5_\x8a\x1e\xe8}\xc\xac;F\xbbO\x8f\xb5\x8d\xfb,\xf0\x46\xf5" -"0s*\xf1\xcb \xeb\xbd\xa8\n\xdb\xb9]\xff~\xc2\x8bW5_\xfd\xd4+\xaa{\xb3k'~lv\xf1\xb1" -"\xda\x39\xc\x37\x88\xe4/\xdd\xd3\x93\x17\x85\x62m\xb5.\x94\x6\xd8\x87\xad\xcc\xee" -"\xc2\xacn\xe7\x36\xbc\xf3\x45J\x8bQ\x7\x18\xfd\xf\x42\x9a>\x6\xdc>\xc9\xde\x4{\xd9" -"\xe6\x1\x86\x65{\x12Rd|\xbf\x37%v{\x14?\xf9\xbd\xc0\xa7\xb5\x8a\xda\x9d\x94t^u\xb0" -"L\xbc\xddu^,\x1e&\xb0\xd6\xf8\xa7#\xa0N\x4\xba\xc4\x94\xb3\x65\x91\xae\xa5\xc8\xc7" -"\xa8\x38\x8f\xb8>$o\x98?P\x9a\xe\x91\x17\xda\xb\xd2\x10x\xc3\xbf\xf2\x45\xb5\xe4" -"x\xa2\xb7\x33\x1eO<\xbd\xde\xf0\xd2\x0 \x8\x11\x87\xc2\xc9\xdd\nY\x1a\x38\xb\xf3" -"\xf6\x95m{\x8d\x65\xdc\x13\xa2\xd5\x86\xda\x84q:\xe5[tXS\xaa\x9\xb3\xf3\xb5=\xe3" -"\x93\xc0=L\x8f\xdd\xd8)\xd8@\x9c\x41\xe9g\xb6Z\x0i\xf\x95(\xcb\x18\xb3\xfb\x94\xb5" -"Y\xc8j\x82\xf\x17\x92\xe5\x8b\xbc\x45\xae\xdc\x2\xeb\xbf\xa0\x84\xc\x8er\x98\x1e" -"\xcc\xa6\x98\x8b{\xeb\x93\x12\xe8\x63\x6KXa\x8e\xb1\xcf\xf2kM\xdbR\xa5j\xc4\xc3\x64" -"\xe3\xe\xfc !\x1do\x10&\"\xa5\x37\x8c\xff\x95\xb\x1b\x38\xb8\x85$#\xeb\xaeQ\xa6\x5" -"HuQ\xe4\xce\x99HM\xf7\x62w\x91{\xee\x19\x33\xa1\"o\xa1\x2kmtW\xbd\x36\x92\x80y\xc5" -"\xfc+\xcc(\xae\xc9\x96g\xd1\x1\x8d\xa5<\x90o\"\xb7\x1cR\xc9\xee=\xc4\xe7$9\x15W\x17" -"\xa6\xd4\x45\x10\xca+\xa6\x14\x46\x1\xbf\xa6u\xc5%:DC\xe1\x83P\xc6\xb7\xa9\xbc\x7" -"N\x8a\xc9s\xe4\xb6\x19V*C\xa1;\xe8\xd3\x1e\x34\xaf\x31\xdap\xcf\x8b\xc3\x99\x9\xab" -"\x80\xc0>\r\xc7\xe8\x42[\x1f\xdf\xba\x89\x8e\x35*\xaa\n\x1cL8\xc7\x11\xb3\xc3\xac" -"`\xa7r^\x95\x8c\x9t\x90\x8f\xa3\r\x6 \xb\xfb\x84\xb\x90\x89\xe9\xca\xba\xf=\x9b\x0" -"#%\x16\xad\xcf%.\xa6\xb7<\x17\x8e\x62X\xebjE\r)\xbe\x8c\xf6\xf6n!\xd5\x30\x9f\xb" -"u\xb4\x9f\xe6\xab\xabJ\xb0~H\xdd\xf7x\xe4\xfb\xe1\x97H\x12\x46\xd6\x80\xe9\x66|}" -"\xd1\xe4 %}\xb7\x62\xdf\xfexv\xf6\xf8\xe3\x5\xd6h\xcf\x44V\xb9\xa0\xb8\xec\xc6\xe0" -"\x1f\xf9s\x14OU'\xa1\xe6\x6]/g\x97\xfc:\xcc\xb8\x8e^R\xdd\xe2!FO\xd7x#\xce\xf7\xa0" -"Y*@\x8c\xc0\xeb\x37r[\xb3\x39\xee\xa0\xf7\x92\x10W\x88\xb2\xff\x98\x14\x84\xd6\x94" -"\x8d\x15\xbaQ\xef\xe3\xea\xc6\x0\xc4\x2\xb6\xac\xe1m\x14_\x96\xeeu2Ji\xa7|\xf8\xdc" -"C&zV\xcb\xdf\xa1V\x90=#\x92\x39:\x8f\x12\xf3>\xf3?\x9b\x9a\xa7\xa9\xd9Z\xdf\x7f#" -"h\xa3M,G\xba\xcc\x93\xb2\xa3\xa9\n\x12`\xfc:3B\x18\xbf\xec\xcd\xed\x1d\x7f\x41\x82" -"\xcc\xaa\x98y\xf6\xe0\x6\xf2\xfbp \xe1\xd1\x91]O\xb1,\xf2\x6\x95\x7Rv\xd2~\xce\x0" -"(e\xfa\xf6\x6\x1e\xdb\x14\xd1[\xb4\x34\xe0q\x97\xa4\xa1\x42\xea\x65\x9c$\x9\x80\x88" -"\xbew~\xaf\xbb\xe5\xf)\x2\xc1/o\xa8\xfd\xb5|\xe4\x85$B\xbf\xe1j%\xa3\xae\x9a\x1b" -"\xf3$\x86\xcc\x4HS/S\xf8!y\xeb\xcf\xf\xdc\xd7\xeb\x36\xea\x8bz\xbc\xbd\x95\xa6\xe6" -"z\xee\x38\x82=\xc6\x32\x38\x62)Ds\x98.\xee\xf3\xfb>\xb5\x10\x18:~\x17\xe3\xf8{\x1" -",H^\xb8\xeb\x87`\x0{\xbd\x1d\xea\xec\x8\x10l\xda\xb5\x90\x32\xce\x18\xaa\xe\x81\xef" -"\xbe\x9\xc8z\x9d\xfa\x3\xe6vO\xbb\xae\x8\xe7 !\xaa\x9a\xea\x46\xa4\x80@\xeaH\xe6" -"j\x2\x86t}\xc4\x63oh\x6\x6\xaa\xf2\x9b\xccQ\x94?\xb0\x9b\x80\\\xaf\x15\x34\xa6[\xe2" -"g\xb9O\x14\x89\xadn\x81\x1\xb9\x10\x1b\xed\xba\xca\x87\xf\xc9Y\xce(\xa2\xf8N\x2\xa8" -"\x84q\xee\xb5\x3\xd3\x6\xb1\x1f\xfc\xd9\x98\xca>C\x91\xc1\x88\xf6\xd2\xc7\xccn\x82" -"GZ\xa5\xc3u\xd2\xd1X/\x98\xfb\xa2\x16\x8cK\xf2]\xc8\xe2\xabi\xa5/\xa5\x11KQ\x9d\x15" -"\x99\xfc\xdfR\x1b\xb4\x0\x8a\xcd\xc9\x1c\x61\x64\xcf?\xe4\xcbw\xb7\x9e\xc7Kb\x5>" -"]Tl\xe1\xfc\xfc\x38\xe<\xc\xad\xcf\xd0\x12\xb^l5\x9f\xdc*A\x89\xd6\x95N\xc7\xd3U" -"\x10\xeb\x9\xd5\xd3\x5\xc9nH$1P\\\x91sK\x96]w>\x9e\x37yyQ\xce\x86\xd4\xe2\xdbv\x7" -"Wt\xbc\x94\xda\x13\x35@\xd5\x66G\xeg\x8d\x8e\x92\xcb\xc9\x7fV|\x8e=\xa2\x8f\x9er" -"\xc\x80}\x92G^\xa4\xb5\xa8\xb0\x8a{N\xa4.w\xa9y\xb0\x38\xe\xb9\xd1hsT\x6y\\\xe1G" -"\n\xe\xb3\x15\xe9\x94Z\xfc\x15\xe8\x0Z'0G\x99\x43Ku\xb6\x6m\x5\x1eq+\x9b\x92\xd8" -"*\xb3\xfb\x89\x7\xc5\xca\xdbu\xebYs0\xfa~\xed\xd1\x64Rp\xa8\xc`**\xee\xa0\x63\xa0" -"\xaf\x30T\xd2\x8c\xab\x34^%\xc6\x17\x1d\xa1\xf0`\nK{\xb1\xfd@\xe4\xae\xea\xac\x89" -"A`\x9\xe9\x91\xb9\xc5I\xce=\x9e(\xfaX3\x2\xf2\x2\x35\xab|\x4\xd9M\x6\x46" -"\xb1\xeeK(X\xcf\x97\x97\xa2\x83\xa9\xf0\xb2\xc9\xb3i_\xaf\x0\x84]}\xa4\x8\xf5\xcd" -"UsJ\xd7M\x16\xe\x97\x43-=\x5\x98\x14x\xedsauD\x88\xa5\xccN?z\xe1\xa3s\xfc+\xb3\x3" -" \xae\xb8\xba\xf4(d\xed\x7f\xcb@\"\xaf\xa9\x8*\x7f\r@{\x17\xa7\xd3^O~w\xb\x7f\xfc" -"\x3\xff@\x91\xee\x9a\x9dO\xef.\x8ct_25\x8d\x89\xf0'\x82\xb2\xe5\xb&\\hE\\q(+\x98" -"\xcQ\xfe\xc4\xfa~\x85\xad\x61\x90\x98\x62)\\\xd9\xf\xc\xa7\xef\xc0\x83=\x9ep6\x1f" -"i\xa8:S%\xca\xe0\x13,\x90\x7n\xfb\x41o\xda&E\xf3G\xf9\xe2\x9f~; \x9\x80\xdc\x32\x13" -"\xbe\xbco\xfd\\\x45\x9b\x8c\xad\xd0\xeeS\x3@\xf8\x34}\xb6'\xc7\xa0nh G\xa8L6M\x7" -"J3\xf\xa9\x1a\xa3 ;\x1e\xc8\xf8\xa9l\xc9\xc5\xb\x36\xbfu\x16\xb8\xb3\xdf\xb6\xfc" -"\xfePO\xfb\x37\x42*]+\xaf\x1\xceR\x97\xc3\x8b\xb\xc1\xa7\xec>5p\xc1\xde\xc0\x8a\xec" -"y\x91\xba,\x89\x7\xd2\x9r'\x8d.\xdb\x5.@\xef\xff\x95\x38\xcf\xaa\x17\xfc\xa6\xa5" -"\xc\"\xcd\xe6\xa2\x9c:\xddt:r\x0\xa4\xd8\x99v$\xe1\xf7s,\x81\x35\x46\xf4\xbf\xf9" -"\xf0\x1cZ\x94\x4\xe8j+\x18\xf7\xb6u\x9b(x\xaaO\x8a\x8f\xf5[6\xa4q\xbe\x7f\x5\xd5" -"\x88J\xa0\xbf\x8\x8b\x87\x66Y\x1\xcc\xf3^\x8c\xcd\xce\x86\x81\x1c\\NOU\xca&\xce/" -"\x10\xb6g\xdf\xd5\xe`c\xe9\x91M\x83@\xd9S;\xc0\xcc\xc8\xeb\xce\x39\xf4]>D.\xeaJ\x99" -"\xa7>[T\xe8\x89i\xd9\xd7\xef\x2)\x8c@\xf6\x0\xbb\xa2t\xa9\x11\xcf\x19S,\xd0\x14G" -"\xf0]\x1e\x42L\xe6TE\x86\x61\xd9\x8dL\xdc\x1atr$\xe9\xe`\x9c?\xaf\x44\xbb)\xcb\xdd" -"\x1e\x9a\x97[G^%\xef\x46\x44\x7f\x43\x80\x9b\xa7\"\x92T\xc\xf8\x1d\xe6\xccu\x1a\xa9" -"e\x14'\x5\x8%$b\x91\x84\xeO\x1a\x9cjE+\xda|\xe2\x9d\x9e\xf6\x8d\x0\x7\xe7!}\xfd\xa8" -"\xcc\xcb@\x5\x30\x81\xc4\xe9\x12\xabJ{\xc5\x64/\x89\x85g\xfc\x16\x4\xc9_5\xd8\x85" -"+\x7f\xe5\xf8|\xaa\xf2Gb>\xb6\xaaS4-#\x1aPG\xd8-\xcd\x33\xc9k\x91\x97\xb5\xa4\x1d" -"\x82\xac\xf5S\xf3\x18o\xab\x1^\x9f\xb2\x1ch\x1a\xc8t\xd2\x36\xc9\x38/\x13\xfeg-\xde" -"\xe5\x33\x9\xb5\xa4j\x9e\xff\x19kBn!\xdd\xd3\x97\x84\xac\xa3\xf8\xb9\x5\x88\xac\x9b" -"\x4\xb9\x93S4\x83\xac\xb6\xe3\x12Z]\x8e\x95\x65\xb\x85\x8dM\xd0\x17\x4\x38\x88\x90" -"\xb2o\x1ep|\xc1\x17\x8fT]\xc4\xa3\xcd\xf2\x1a\x97\x30\xd3\xe6\xd2\x9b`\x0\x66\x31" -"\xeI\xbeP\x18\x13o\xba\xbc\xb0(y\x9bt\xf7\xf1\\G\xaf\xbe\x30\xe1K\xc4\x13\x35$P\xb3" -"\xfc\x87\x41\x84\xc5\xe1(\x3)\x18\x84[\x3\x9b\xf2\xdf\xe2\x9b\xa8z/%\xa6\x1ek\xef" -"d\xf2\xd0\x64\xb1\xcd\x13\xdc\xa3\xd3\x85\x44=\xf6\xd6m\xdb\xcb\xf9\xad\x97t\xab" -"\xfd\xff\xc0_\x12'\x15\x9b\x8a\xcc\x8d\xaf|\xc7q>\x7fv:\xc8\x99\xb0\x66h:?\xd1N\xd9" -"\xc7\x8e\x18\x15\xfe\x88\xa7\x92j\x8d;\xe3\x44\x81\xb9\x1f\xeb\xb4\xc2\xafV\x9e\x87" -"\r\xa8\xf9\x64\xa7\x8b\x46*R\xc9\xa9q\xcf\xf4V\n\x9a\x46/\x95\xd4\x9fu\x97r\xefu" -"\xcc\x14i\xfc\xc6\x1c\x9d\xddl\x90\xe6\x82s\xe1\xb0$\x93\xbf\x38\xff\x9c\x11Mu\xe7" -"\xb8I%$\x98\x61'^%\x8\x85j\x86\xdf\x8e#\xf5\x90\xf2\xe5\xa1\xd2\xfb\x10\xdbs\xff" -"\xa3]\xdd\xbf\x1a\xbb\x0,\x93{\xa9n\xff\xcb\x82\x8c{\xadn\xba\x66\xae\x93\x37\xac" -"R\x10\x37\x8c\x34G\xd9\xb3X\xa6\xc4I\xca\x1c\xa8'\x12\xc4\"\x17\x38\x93\xb9`Z?\x1f" -"\xaa\x92\x94n\xda\x7f\xb2\xb8\xdd\x8e\xd5\xf4\xe5\xc6\xe\xfc\xdf\x38\xa9'9\xe1l\xe1" -"\x82\xffww)QK52e\xce!\xfb\xb4\x87\x10\x33\x83\x4\x31\xeerB \x84\xa6}\xea\x90.\xe" -"\xef\x97\xdd\xf9U\x92Q\x13\xef\xf9T\x8c\x9f\x95\x63%\xa1\xef\x9d\xc7]\x5p\xf4*\xd1" -"O}\xbd\x9\xb2W\x83\x32\xbcp\xb0\xee\x8ag]\x8c\x0\xe2\x45uv\xaa*(\xd8&\x86w<\xcc|" -"\x89\x42<\xaa\x64\x11\xfaY\xff\xe0\x1e\x4\xf0K\x97\xb3\"\x8\x11\x5\xbd\xaa~\x9\xff" -"\x85\xf9\xe7\xcf\x33umJ~%B\x95\xc\xe2\xae:\xca\xa6,[O\x10rF#pgl%\xc4\x13\xb1\x38" -"\x88\x90\xcb\xf6L\xc9\xe2\x1aXD\xe3\x7\x91\xe9\xcf\x85M\xbfm\xc8\x95/jb\x9e\xc0\x8c" -"\xec\x95\xdc\x9f\xa1\xeb\x16jP\xd1\x35\x3\xcc\x94\xb4\xd9\xbe\xf\xa1\xf9\r\x8c\x91" -"O\x83\xferh\x6\xbeT\x92\x83z\xbd!\x1c\x18\xf8.\xe4\xed\xf9\x85\xe1-\xf8s\xd9\xbP" -"\xd4o\x1b\xde.\xba\x9d\x18#\xb4\x8e\x8cg\xf8\xe3\x45&\x0\x46k\xe3\x9c\x9b\n\xb5\xea" -"U\xa9\xb6\xd5\x13\xb0%\xe1\x99\xce\xb3\xd3\xee\xd9\xf7\xb1-H\x16\xc1\x37\x61\x80" -"\xf5\xe3R{2l\xf1\x12\xd1\x38\xbc\x92\\g\xb4\x7\x98\x32\xdc\x8n,S\x9d\xe0?r\xfa\xb6" -"\xf0\x9c\x92\xb8\xe8\xac\xcf.\xd7j_\x5RA\xc2\x5\xf1\x12hdIIM\xe6\x9dm\xd0\x13\x0" -"&\x9b\x1b\x5\x44Vp<.\x82\xd8\x39\xb\xc7\xd4k\x87\xc2\xf0.e\xaeJ\x1dGH\xbf\xf\x1\xcd" -"\xe3(\xbd\xb\xef\xbd\x31\xc3\xbf\x30\xca\x9\xfb<\x18RK\xc7\xf6\x1c\xf2\xe9|\xec\x85" -"\x4[\xf8\xea\x96\x9\xf3\x64N\xe7~\xf0\x1b\xf5\xf3\xd8\xdc\x1e\x7f\xf0\x13p\xc4\xd0" -"\x7\xfc\xd0n{\xb\r\x1f\xa1\x90xN\x9c^L\x93\x32L\xf4\xfe^\xedx\x11\x96*\xd0\x8a\x13" -"\xef\xf\xd2\x99\x7\x37\xfe\x1\xcd\xa0 \x10QS`\x91\x16\xce`Vt\xd0G\xb\x43\x8ds\xf3" -"\xdd\x61\xf3\xb0\x5\x9fq\xa2\x91\xf3,\xf4\x63\xc3\n\xe3\x8c \xd2\xf4\xcdR\xbf/\xde" -"\xd7LY\xf1\x9d|\xdb\x97\xa0\xdb\xfc\xd1\x38w\xae@#\xcf\x7f\xf1\xdb\x8dvU\xfd\xe4" -"o:\xab\xf9_\\J0P\xc3\xf9\xc3V5\x92_\x6\xe8 \xe3X\x99\x83\x90\x43\xfa\x41kO\xc2\x84" -"\xec>m\xcf\xd8\xb3\x5\x66k\x93\xa0r\xe2\x63\xd0\xd2\xb1\xdd\x85Y:gB\x1\x9b\x9a\xaa" -"\x98\x9bs\x7\xaf\xbd\xfe\xee\xb6\xe1\xc2\x42\x96h\xc1w\xaa\xa0\xaa/N'I[\x18\x18\x8e" -"\xb7{\x93\xf3sH\xe5\xe9\xf1\xc3\xde\x96\x1b[g\xb1\x9\x30]\x84\xb1\x17\x8d\x35v\x9a" -"\xf4\xab\x92\x8c/\xf5w?\xa7\xbd\x0\xect5\x87\xda\\L\xbc\x19\xbd<\xbcO|\x15\x46\x2" -"\x13\xc9\x10;\xf7\xe1\xbc\xfd\x8f\x38\x99\x42/\x83\x46\x1fz\x8c\xb\x9d\x11\x1f\x64" -"f\x19U\xf4\xbd\xba(x4\x9\xf6\xcf]T\xf8\xc6!\x8e\x7\x97\xa0\x34p hB:K\xfc\x1b\x19" -"\xd0\xbe\x33m\x99\x0\x44\xf0\x84\x46j+-A\x98Gn\xec\xd1\x30\x9e,0\xe3>\x8d\xb6 /\xd3" -"\x1c\x14\x84\xf5\x31\x5h\x16\xcd%\xb8\xcKn\xd9\xb1\xff\xde`\x8d\xdd\x16\x84\x45\xe" -"\xaa\xf4]\x81<\xaa\xf9\x38\xe4\xdd\xf3\xed\xe9$\xa2,\x80\x14\xa2\x63\x31U\xd9\xe" -"\xe2:\xcd\x2\xcc\xd3\x7f\xe\x99\x10\x80\x18\x1\x91\x7\x9e\xb3\x30>\xc6\xc6\x85h]" -"\xeb\xe2\xedg\xef\xd2\x46\x1a\xbdp$\x2\xa4'\x7f\xd0\x63\x81\xf9\x16[\x87/\xd8w;\xe6\xd2\x63+#\x97\x63\xe4\x63#\x7\xb3 xY\xb2" -"\xbb\x1c\xa3\x9d\x13\xbc'c\xd1'3\x9e\xf4\xae\"\xe9\x1a\xdb\x9c\xb0\xb6\xc6\x14|\xee" -"\xa0y\x96\xaf\xaa\xfa\x19\xe0\xbf\xdf\xdf\x9e\xb0\xac\x43\xf7=\x80\xafrE\xd8\xc[" -"\x3\x4~N\x5`\xfc\xb8\x32\xee\x1f\x8e\xf0-@T\xe7(y\xa3\xfd\x64\xfe\xeb\xfc\xadu\n" -"\xbc\x65uXZ\xd5\x9dz!h\x1e\xe4'\x5*\xb9\\\xcb\x12\x83\xd2\xf7P\xbd\xcf\xca\xf1\xe6" -"ni\xc9\x90\x5\x14\x12k\x90\xab\xc6\x9e\xfe\\\x97\x61\x66\xb8\xc4\xc0\xe1\x8f\x94" -"\xcc\xb0\x14\xa3\x3\xc6\x1b\x80)\x8c\x66\x1a\x66\x42\xf3\xaf\x81vn}\xc6\xd6\x99\xa7" -"x\xf\x93\xa5\x38\x86\x33I\xdf\xf7(\xa0U\x7f\x30\xf9\\\xc2\xb3\x13\xdf\xc4\xc8\xf1" -".*\x94\xc9\xe3\xf3$\xbe\x1b\x98\x14+\x10o\x19\xe\x30x;\x8X\xaaQ\xe9\xca#\r\xd6I\x88" -";o|*\x8d\xba\xe3\x99\x8\xb3K`\xa6{\x14sP\xbf\x8a\xe7pa\x9f\x34\xf9\xc6\x4\xc7\x0" -"\x86\xc8\xae\xe4&\xceZ\x92\xfa\x92'\xfbR\xba\x82\xfb\x17\xcf\xad'\xee\xb2\xb5\xef" -"\xd0\xc7\x6\xf1\x46-\x1$G\xae?h71\x12\x83\xd7\xab\xc3\xe8\x66\xfch\x95}<\xb4\xf8" -"au\xc9$!\x8a\xa9_u\x93\xc4'z}\x9\x38\x86\x9c.\x7\xf1\x4\x46\xf2\xd4^\xa9\xa2\x84" -"\x97!\xdeT\x10V\x11\xb0\x86\x98\x8d\xbdV\xffr\xe8\\M\x1\xad\xdb\xaa\xc1\xb0S\xf9" -"\xa4}\xda\"\xdd\xc6\xf0\x1e\xc9\x8d\xf4\xctt?Y\xd1I\xeb\x35\xb7\x1eU\xe7K[\xab\xd3" -"l\xeJ$\xefZ\xfd\xb7\xdd\x38#\xd7%\xe2\x94\x98jf\xbdT\\\xce\xccP\x10\xf8\xa6\xef." -"\xb6\x4zt\xe6\x8c\xf2\x62;l\xe8Nj\xb\x37\x93?\xd2I\x99\x1b\x1\x8b\xb\x62\x17\x97" -"P2p\xc\x81\xaa\xe0r/]\x91VT\xcb\x99\x91\xc8\n\x61\x62[7B\xe7li*\x4*\xe4/\xb7\xf4" -"\xed\x35_l?\xcf\xfd*\xccyM\xe9\xe0\x8e\x9d\xbb\xd3\x95Yb\r(\x19\xa2>\x85\xf7I\x8f" -"\x0v\xb6#\xb\x7f\x93\xde\x99&D(\xad\xe3\xff\x32r\xba\xcf\xd3\xb5/\xfd\x92(\xe\x1d" -"\x19\x37\x97\x1erC\xef\xf8\x3\x84\x83\xde\x1a\xc2\xcc\x0\xf\xb3\x94\x31\\\x35\xda" -"Do\x9\x8c\xe7.\x8a?\x89*qQD&\xab\xbek\xae\xf9\xec\xedv\xff\x16\xbf\xb3\xe\x86G\xf0" -"\xe6\xcag\xa9\x87\x35<_\x88H\xe0\x36\xb5I\x99\xb1\rlx\x99\x80\x9f\xfc\x66\x11v\x89" -"-\x7f\xfd\x14=\xc1\xb0\x97\x8a\xd2\xe6\x81o\xcc^\xde\xfeQ\xb6\x9\xf1\x36Ji\x1c\xd8" -"\x80{N\x96\x34\x8e\x98\x42\xee\\$W\xe2\x66\x31\x8dSb\xd7\x8c\x17\xb3\x3\xd4\xcd\xa2" -"\xf8\xdc\x91q_\r\xde[v\xc3\x86\x36`Z\x1a\x15\xd1\xbe\x95\xd9\xf2?\x12\xfa\xb5\xe4" -"\x80\xde\xd3\xfe\xd2YJS\xf8R\x1b\x2*\xffL\x1a\xb2\xb4K\x1f\xbbl\x0(li7^\x9e\xb\xe7" -"0gf\x87\xff`\xd6\xf2\xf5o\x8au9^\x15\xceTZ\n\x1e_\xb6\x8d\xcc-\xdb\x64\x7f\xe9\xdb" -"ai\xaf\x98H)\x85\x9b\xc4\"s\xa3Jh\x6\xb8\x1d|\xa4\xde\xd3\x92,\xb3\xe9\r\x9ci\x9d" -"Wi\x4\x13-\x84\xc6\x9e\xf7\x93\x9{\xc9\xcY\xa1\x3$\x9a\xc4\x9f\xeai0\x4\x2\xe5\xdb" -"u\xb1\xd6\xe3n\xdes\x9d\x91\xbcm\x83\x4-\xb4\xec\xaf^h\xe7\x8b\xfe\x0\x9ajeI\xbf" -"\xb7\xd5\x38\xfaZ\xc8\xe'\x16\x36\x80\xd9Q\xa4\x8a\xa5\x42\x9\x35\xd7\x1b\x66$K\xbd" -"\xf4\xb2\x65\x86\x97\x61\xc7\xae\xd0(B\x98#\xf5\x30\x13\x8c\xf1~\x85\x1f\xd3>\xef" -"\xcf\x1c\xb7\xe3\xa5W\x98\xf1IY_\x94m\xae\x33?7\xab\x8c\xea\x88\x46\xab\x80\xb0\xfd" -"5D\x4\xb5\xe5\xea\xc4\xcf\xe7\xe6\xc3\xe7\xa6\x63\x11\xaa\x8d\x8b\x94\xe8\xc5\x9a" -"\x1e\xc\xe7\xe3I[\x17o\x8e\xe8\xed\x14\xc1\xe0\x33\xfe\xde\x44\xf8k\x1a\x30\x17\xb8" -" \xd6\rv\xde@\x8bk\x1\x4\x1cI\xb6\x9cq\\HJ\xa6\xad\xd4\xdc\x31G\xec\x63\xe3\x17+" -"\xfc#\x80S^&9\xd4\x15\x37\xb0S\xa8\x80\xe9\x9d\xe5\xc5\xbd\xd8\xc9g*,8N\xa8`DT\xb6" -"\x5\x64\x92\xcc\x86l/\xe2\xf1\xf9Ui0\xed\xff\x9cm\xb7\xf0\x8dp\xad\xdfP\xb7\x36\xc9" -"'\xfc\xbe\x43\x97\xa5r\xd9\xae\xa5z\x7\xc4\xddj~\xa0$\x2\xfb\xf2\x1dr\x81\xfd\xec" -"\xd1\xf\xaal\xc5\x19\x65\xfap\xcb\xd6\x82\x83\x42'\xe4\\\xff\xd1T\x99\xaaywL\x99" -"\xc0\xaa\x9a\x31\x41\xa2\"\xe4\xdb\x99\xfcJ\x91\xe5I\x80\xec\x9c+\x10\xba=\xdeG<" -"@-\xd7\x1d\xc8yx*)\xc0\xf7\\\x1b\x95L\x8f\xec\xd5\xc1\x81\xcf\xcc[\xac\xb3\xed\xc3" -"\x8bq\xact\xf0\x98\xfa\n\x1f\x0\x3)z\xc9 \x9eO\xfd\xde\x94\x8f\n#P\xcc\x84n\xac\x61" -"p{\x7\x87\x15\x90\x85^U]9^\xfb\x16\x8a@\x11\xc9i\xae\x12\xf9\r\xc8z8\xe5\x44\x9f" -"\xd3\x0\xf6\x11\x1aP\xaf /\x1dZ\xd3\xa6,q\xcb\xf6\x36\xd8,'\xc3\\\xb4\xf7\x3\xe7" -"w<\xa3\x34\xb5\xc7\xbcj\x95\xca\xda\xdc\xb5^\x9c\xe6\x8dqk\xd7p\x83\x85]\xb*g*)$" -"\x97@\x97{}\x84\x8a\x34\xad\x83:\x1d\x9d\xddK\xd8\x1e{\x11\x8a\x62\xe3\r\xa7p\xbd" -"\x8b.\xec\x33\xad\x19\x94\xa5\x81\xc8\x36\xec\x81\xf9\x92\x43\xa9\xab#;\x9e*\xf\x1b" -"\x10\x62\x37\x97`\xb\x82\xcd\x5i\xa2\xda\x41J\xb6Q\xc8\xd6\xf4|\n\x81\x95\x98\x86" -"UZF Mt\xcb\xe4\xf2}\xe0\x8a\x42\x11\xadvK\x9a\x33\xe[o\xec\xc9H,9\x1a\xe0\x86\xe7" -"TN\xbfVk\xa4\xe\xf6zj\xb4Rm\xdf\xa4\xcb\x98s<\xca\nX\x99\x3\xe2\xb5\xd7\xb8#d\xb5" -"qM{p\xe3\xd9N\xeek\xc2xfS\xcf\x65\x91\xf9\xfe\xb6\xa6\xd2\x9b\x38\x92\xf3\x30\x14" -"\xf2\xb0\"w\x6\x13k1\xech\xacl\xd6\x8dU`#\xc8\x5M\x8f\x8\x63\x32\xdf\x1f\xf3\x8c" -"\x2\x81\x1\xed-\xb0\xb4\x1b\x61\x6@\xcbY\x92\x1b\xa2\xe2Q\xbf\x8dk\xdb<\x8e\xac\x81" -"\x89,\x19\xe3T\xf7N\xae\x8c\xe1\x1d\x62\xae\x12\xdc*>\xa9uQFy\x7\xd1\x3\x81\xe4\xdf" -"XG\xff\xd1\x4n\xe9\x94\x90*LB[\xa9\x17\xf8pL\xa6T\xcb\xe9;\xd0Lh\xb4\xc\xf7\x91\x9" -"\xdd+\xb3r\x4\x4#\x9fZv\x11\x9b\x63\xb3\x97%/\xc6\xac`o\xdc\xb4\x8\xbf\xba\x0\x31" -"\xcc\xd2\n\xd3\xe6\x46z\x9\xfe\x11x\x8d\x91\xe0\x80Y\x12\x38\x9f\xe2h\x9c\xbc\xa1" -"\x3\xe7\xd1\xb\xd3xE@ye\xf2P\xaf\xder29!\xfc\xcb{\xdb\x11\x96\xd8\x1f\xd4\x9f>\x99" -"\xa8u\xe3\x1\xe6\x83\xa3z\x9a\x9d\x95v&\x13V\x1f\x41\xba\x1c[|d6*P\x8a\x17rG\xeb" -"\xcd\x63\xb6\x18W}%,\xb4\x42\x80\x1c\x37\x9f\xf3\x46#oMA\xa8:\x1a\xdc\x16'O\xfa\xa4" -"\xb2\xf9SD\x11nq\xb\x11\x9f\xf\n\x1d\x66\xf8M\xf\xc9|``\xf9J\xd6\xe7,K\x82\x1dmx" -"\x10\xa2J\xb2\xeb\x94\xdb%\xe4\xcd\xe3\xb5\x81<\xf9\r\xa1\x62\x65\x9e\xff\xcd\xd3" -"Ho\x8e\x45\x1d\xbd\xc4\x33\xe4\x8b\xea\x1cUA\xb5\xcb\x35\xd5\xdbP{i9{\xbb\xfb\xe" -"\x12\xcdH\x1f!\xd1\x0\xb9] \xbf\x30\x42\xa9G\\\x9c\x9d\xd9\r\x8cN\xb7\x83P\xc9m\xd2" -"\x91\x1d\x15\xed\xfa\xb3\xb4\x65\xc7\xa7ic\xae\xdc\x86+\xa6(Uj\x99;3W9\xce\x7\x43" -"\x5\xe6\xde\xa4\x5\xfd\xf5\xd8gX{u\xe@\x1a\xd1p\xfc\xba\xdf\x94\x8a\xb9/Y$\xfb\xca" -"\x8d\xd8\x65\x9f\xb8\xd8\x8f\xcf\x10\x44\x9[=>\xcb\xb8\x8fKw\x7\x2\x36\xc5\x14\x38" -"ld\x92\x33\x45(\xdb\xf9\x86\xef\xc8_\x9f\x8e\x97\x17\x90\xd2u\xe0\xc7\xaa\xf0\xba" -"\xfc\xe2\xf4p\xad\x3\x94\x13\xec\xf2\xb3\x9d\x84iI\xc9\x32\x34j\x1b\x4\x45,\xa1\x1f" -"l\xe3n\xf3(f\xec\xb6P\x12U\xc1\xda\xca\x1[\xf1\x42\xbf\x33\x95m0\x9\x83\x88\xc8\x17" -"Q}\xf9]\x8d^Q\x6+\xf2\xaf?\xaa:\x8f\n\xc4\x63rPX\xf1\xebiC\xd6\xd0\xa1x\xd6\x90\xeb" -"\x13\xa9\xef\x87\xfb\x1f\x85\xb0\xfa\xdb\x8bk'\x9\xae\xdc\xbb\xcbX\xffz\xe6\xc5\x83" -"p \x9a\xa6\xb\x15/\xee\xe0\xa7G\xb6\xf\xb\x42R%&\xc7\x82\x31\xd7\x92\xf8;\xce\x10" -"~\xccN\x83\"Yu\x11\xc7\xfa\xfdZ\xba\x8b:\xb0\xf5\x19\x2*\xde\xed\x89\xc0\xe6\x1c" -"\x89\x9e\xaf~P\x9a=\xab\xb3\x99\xa6\xf4\xc5\xd7\xff\x9ah\xb5\n\xfb\xdbg\xb8\x9eL" -"\x7f\x39\xd6WO\xca\r\x64\xc4\xfc\xb0\xe5L\x15\x89\xce\xf9'\xf9\x83\x94\x3r\xf6\xe2" -"\x1b\x8;{\xf5\xa8_\xe0\x99\x92g~\xb3,\x9f\xd4\x62w\xc5\xf\xd9\x92\xc4x\xc2\x92\xaf" -"~\x5\xa3T\x9fq,f\xbd(\x18\xb8'\xbb\xfd\xe2\xc4\x81\xbfH\x97\x37\xa7\x1e\x88o7\x8" -"*\xfcZ\x8c\xb\x2\xb7\xbf\xa7\xfc\x89M\x88I\x98wX\xa4\xfb\xac\x8G\x8\xa6)i\xd7\x19" -"$cS\x8c\xc4\xcd\x31\xee\xc7\xde\x6\x1b\x0\xdaZ\x9\xcb\x1e\xb9~<\x9a, A\x2Jb\rz\xe2" -"\xba\xa9\x9c\xb0p\xfc\x1\xbc\xbf\xb1$?\xfd\x6\xa4\xc9\xeajMM\xf4/\x87\x38\xfeR\xa7" -"%,\xdeW\nr\x96\xae\xb5\xed\x35\x1c\xd4\xb2\xf6\x43\x88\x12\xcd\x61\x91\nMU\xd7r\xa8" -"\x81\xcb\x18m:7C\xcc\x13+'0k\xdf`\xc3\xabMu^>\xff\x8e\x10\xc2\xca$1\xa5\xfOK;\xcf" -"`\xa5\x11*\x8f\xf9\x1b\xd5\x1e\xb0\xc2\xc1\x44\xae\xe9\xe9'\x85\x88&\xe2\x3\"i\x87" -"\xb2\x92\xc1\xd7\xf8\xfe\xe5\x33\xb5z\x9b\x5P\x84\xca\xc6\x15\x91Z\xc3\xa5\xa8'\xee" -"\x4\xd9\x1f\xa9\xe9\xe2g\xe3\xae\x44\xef\x11\x1I\x1a'\xa0q)!\x9e\x9bN y/\x1e\xed" -"B\xd5\xca\x89\xc4\xc4\x97S\xafpx\xb6\xebnzV\xff\xf7\xce\xca\xb3\x96\xb8\x39\x8a\xfd" -"\xd7\x33\xad(\x84\xf7\xbc\xff[B\xf6KK\x5jp\x9d\x65k\r^\xb4\nv\xa5\xf6\x65\xa6\x9b" -"\xdb%\xe0#\x8a\xac\x35\xc5\xc0\xca\xff\x83+\x98\xe6H)1\x9a\xef\xb0\x7f\xb9t\x3n\r" -"\xa9\x82\x61)\xdbz\xc5\"\x92w\xf\xac\xaf\x2\xbdj\xfb\xa8\x86!R\xbfGbB^\xbb\xb2-{" -"o\x8\xd2\x99(\xa5;\x11\xaa\x35Qn\xae\xa9\xd2IP\x90\x63\xc5\x39\xac\xfe\x39T\xe1\xf9" -"e\xd2qK\x86%~\x9f\xce\x32\xcc\xeb\nPf\x1f\x87Y&\xad~W\xeaU\xaa /b\xf8\x8dQ\xa1>k" -"\x91\x19\x39\x1b\x7S\x98zW\x13\xd7\xcd\x96Pl\xd2\xbc\x9d\x9aT\x9ekn\xc7\xda\r$\xde" -"\x97\x84\xffu8\xdc\xf3,\xa7\x36uL\xce\x16- \x8\xa4\x1f\xa1\xc7\x99\x9c*\x8fr\xda" -",Q~\x6\xf0\xf0w\xbd\x88\xa2\xff\x89\r\xb0Xb(\x84*\x1\x14 \xef\xe3\xe9\x10\x2\x44" -"\x92\x16\x1e\xb4w\xfb\xda\xff\xaf\x1es\xd2Ku\xbar\xbe\\\x14\x35\x8c\x45]S\x85\x85" -"uN\x9fh\x16\xa2&\xf6\xem\x17\xc6l\x94\x1fQl\x1f\x5\xa6\x18\xc0\"\xc1\xa7\xa8\x87" -"L\xb0\xd3\xf7\xac\xfbo\xd7\x9dv\x1\xadm\xda\x61\x1d\x31\x3\x7f\x37\x39\xbd\x12\x86" -"\x16'\x8ep%\xca\x83g\x8\xc8U\xde\xe5\xe3\xb4I\xc6\xc5\x90K\x95\xca\xf4\xc2\xeb\x9" -"Q\x95\x64\xc4\x8a\xf7\x81\xfb\xccI\xf0\xde\xdel\xb2\xbe\x87\x18\xc5\x15\xc0V\x8T" -"\x9f\xd5\xe5H17 v%\xb\xe2*\xf\xbc\xde\xe1\x7f\xb5\x84\x9d\x30 ^4~c\xb8\x84\x1d\x1a" -"\xe5q\xb2\xc3r\xfd\x96\x34\xe9\xf1kH#\xf9M\xfb\x80{|\x9\x84\xf\x92@\x9e\xd8\x4\x1b" -"\x15\x15\xdb\x9d\xf2!\x87\x45\x1f>;Bsz\x11\x61\x1aJ\x94-\xec\x95<\xfb\xf9\x87]6\xa3" -"c\xe3\xa2\xd5\x5\xd9ko\x8f\x3\xb7\xea\x1c%\x1b\xab/\xf7\x9d\xd8\xcd\xb2\x87\x96\xd1" -"\xfd\x36K\x11\x3\xda\x11\x9b\xea\x64\xac\x34\x65\x90#h_\xb8\xd5\xb2u\\\xe5#\xb3/" -"\x85\x32\x84^L0X\x3o\x8\x62\xcb\xd7\xb7\xd4\xdc \xf7\xd2\x96@\xb5\x0zx\xafm\x93" -"\x15\x12\xaa\x1U\x85\xbf\x80\xda\x89\xfd\xdc\xe1\x37\x2\xef\xaa\xeaQ\xc5\x1c\x85" -"m|\x8a\x7f(Z\x99}t\x9e\xf5\xfd\xdb>\xb1\x45\xf5\x1b\x10q\x84:\xffHlz\xde\x39\x43" -"\xca,\xe5\x38r\x15\xfa\xad\xda-\xb4\x14\x33\x11\x61\x7f\x62\x81\xfb\xc3\xf8\xd2\x61" -"\x2r\xcf#Udp?\x83.\x85\x16|\xb4\x44\xed\x14\x7f\xaegVT\xfe\x8\x94V\x94\xf9\xe6>?" -"\x1f\xc2\xf6\xa6On6\xc0\xbawJ\x8b \xba\xd6\x11Z\xc5\x44P\xe3-5\x3\x1euUH\x1d\xcc" -"\x2)\xdfY\x99Q\xe7X\xa6T(-\xc7^bB\xe1\x41\xa3\x15j\\\x98\xc5\x33\"\x8e\x8bQ\x18\x1" -"\xc7\x16\x66]\xfa#\xfe\xc5\xaa \xf3\xfb\xa6\xba\x37\xfc\x88%\x8d\xec\x64|;L\x85\xb6" -"c\xc8\x30\xd7\x63\xaa\xf5h\xbd\xa3\x85X\xe4\x31KkQ\r\x97M\x9f!\xc7\x83\xc4I\x8e\xed" -"b\xc8\xdb)\xbc\xa2\"\xf2y\x10\xb3\xd1\x96\xc0\xe8P+#Js\x9d\xa3*\xf\x64\x14\xbf\xc5" -"\xe4\xc9\xcc\x16y\x89H\xf9\x96\xf1\xb3\r\x17\x65\xfc\x99u\x1b\xeb\x12\x16\x88\x32" -"\xb5\xf7\xf9\x1a}\xf5\x94\xe\xb7\x63s\x1fi\x93\x9d\xb4%\xed\x38\xc?\xfe+AZ~\x96\x0" -"U\xbb\xb7\xab\x43nk\x8c\xd6j\x12\xa6\x66,\xf8\x8d\xf2l8\x90\xbe\xacK+k\xc3\xc0uq" -"f\x14\xd2\x4Z\x18\x9\x5\xeb\x92p\xdb\xf\x8e\x42\xc6\xc4\x11O(Y'\xbb\x3\xe9,=\x93" -"\x1q\r\xcc\x17\x19\n\x1fx\x15\x13\x88\xd7\n\xec\x38T\xf\x3\x1e\x37m\x8f\x31\xda\x95" -"Y8\xb2!\x96\xaeVwh&\xc7\xa6X\x82%\x82\xa5\x38\xaaGR\xb9iJ^\x81N\xf3\x9c\x1d\xf4\x10" -"\xb7]\x0\xcb\x90i\xcdG\xb8\xbf\x18\x38\xf9.\xf5\xa1\xb9\x1d\xac\xa0-\x87\x98\xc1" -"\xdf\x83\x9c$0\xe8\xd0(N\x1d\x16\xefr\xb3\x63g\xe\xf5\x19\xd0\xd0j\xfe\x32o7\xea" -"\x4\x8f\xd2\xe0\x9c\x15\x11\x3\x11xy\xc2\xef\xa2hdU\x84\xffJ\x1c\xd4xSd\x93\xad\xbc" -"\xb3\xe4\x9e\x42\xe7\xb6h\xd9\xf0\xe7z\xc5\xa3!\xfd\x7f\x33\x9c\xaa\xfd\xc9\x32g" -"\x14O\x94g\xb6\x5\xc8i\x4\xc3\xd1\xb8k\xc0\xe1p{G\xc3\xa4\xc1\xbf\x99\x1c\xa3V\xfb" -"\xc3.cV#\xf4\x42v\xccsX\xdaTAC\x8b_\xcbJg[\xd6\xb\xd1\x12\xcd\xdbL\x83WY_z\xf0\x82" -"\xaf\x9$\x12>g:\x1et!N~A\x98\xfd\xe4\xae\xf1\xe8^\x12\x9bjx\xa1\xe9u\x97\x8e\xf2" -"E\xc\x63#%\x88m\xa4\x65!\xb9\x37HA>\x2\x18^\xe0\x61\x64\x8c\xdf\xff\x10\xcaRI\xd1" -"\x9f\xaa\xd7\x86\x19x?\xc1\xc\xb7uT\xbbP*d\xe[$<\x9e\x90\xff\x16\x9a\x85[e\xd2\x9d" -"%\xb4\xd3\r\xe4\xe5:\x13\x9e\x8a \x5\x9c\xdbyci\xec@\x5\x7ft\xb7\xdcKZM=\xd4\x63" -"\xc6k\xe4\xe8\xa0\x2m\xedo\x1\x10\xc4[\xaf!\xf1\x97\xb6I\x2j\xeeV_G\xc2zJ\xbc\x15" -"Sy\x3\x3\xbc+4\xad\xb7\xc6\xe5G#yN\xef\xaa\xc4\xdcqE\xa7\xc3\xae\x16\xc6\xbb\x63" -"ZpN\xfc\xb2\xb9\xbb\x65\x16vT$Z\xe5\xd4\x66\xb4\x36#*G\xd9\xa2$|:ZN\xe9\xa7\xe6\xf2" -"\x9b\x83\xfc\xb9\xd7\x8/\xae\xc5\xca\xf6\xb4\x89v\xb0\x0\xad\x92\x19\x9d\xf6WB\xcd" -"\x8d\xe4\xaf\x5\x41\x46\x1f\xdf\x7\xf4N\x91\x17\x8e\x8f\xf2\x42>\x1\x7G\x4\xda\xe7" -"7\r\xf7\x8\r\x17\x45\x19\xc\xc2\x94\x35\xf1\x87\xaf\xea\x37\xe3\n\xa2\xc5\xdf\xd9" -"\xc4\x7n\x15\xc1\xd8\xbh\x8a\xca\xee\x8a\xc7\xf4\xf6\xf5\xb5\xa2\xea\xb3\x97\x8d" -"\xa7\xc7yXq\x9cim\x9aT[\xe2\xd4K\x88N\xb9N\x87\x39\x42\xce\xf0\xffItP\xfb\n\xb2\x1c" -"9.\xa6L\xbe\xc0\xab(2\x83\xeaKs\x9e\x36\xf2\xfc\x14_\xa5~\xff\x43>6\xfb\xdf!}\xb3" -"O\x8e\xfd\x2\xf7\xa1[w1\x1aPgIG\x85Q\xf1\x1e\x1c\xf0\xc9\x84\xeb\xd2~\xec!\x97\xba" -"\xbc\x95\x6$/|B[\xc0\xbb\x35\xa1\xd3\x32\xc3\xd7\x44$3\xba\x80\x9a\x15\xa5\n\x64" -"\x87\xa1\xce\xe9\x0\xa9\xb6\x4t|h!Q+\x93\x45x\xbe\xbb\xed}5\xd9,5\xbe<\xa1(\xde\xce" -"\r\xd8\xe6\xd6\x15r\xb5l`\xa7Z#\x9\x32\xf6\xc8\xf1:\xc\x82G]\x81\x9d\x41\x98I\xc0" -"F\xbe\xb6\x18\xff\xd2\xba\x9bN5Y>\xce\x10\xeb\xba*\x92\x36H\xae\x9d\x92\x12U'{n\x81" -"R\x83}tx+3\xffZ\xd6\xa0}\x8cl\x1eY\x13->^\x1f\x1c\xce\x86O\xad\x1fyc\xb5\x1|~\xbb" -"=)\xf2\xaf\x65\xb0\xdds\"\xddn\x94\xe8\x12\xf0\xed'pFjA\xcc@\xa6\xcbWE>\xe0\xde\x32" -"\xa6\x33\xa8g\xd5\xfa[\xa2\xb8g6\xa2\xd2\xc7\xcd\x94\xaf=\xbc\x92]\xfc-\xdf\xeb\x4" -"\xf4\x4\x81Pz(~\x1c\xed\xbf\x35\xeb\xfb\xa9\x44)\xceT\xe6\xb6\x36\xc3=\x88!p\x8c" -"\xfe\xc3\xa4P\xe1\\\x39;][\xf7\xcc\x84\x8c\x9cW\x80\xdd\x96m\x1\xb3M\xb5\xf9\xc3" -"\x13\x7f\xa0\x9\x63h\xf2\xae\x88\x83\xe6,\xdb\xfc\x61\x32\xf7h\x7f\xd1\xe9\x61Gy" -"'Ok\x92\xa1*mJ\x8c\x41_YQ\x9\x13\xcd\xde\xf6v\x85\xcbO\x97\xfe\xf{\x8c\xe9\x90\xca" -"\xe9\xd8\xb1R\xb1\xfc\"\x33`\xfaT\x80\xe2=b\xbf\xa6\x9d\xf1\x1d\x97\xef\x8b\x9dO" -"\x8f\x4s\x1\xf5\xdb~\xe3KO9\x96\xa6\xe2&\xb8\xb9\x32\xa1\x95\xcc\x8e\xcd\xfb\xeb" -"4\xcf+\xc2\x4v\x9a\x1a\x1a\xb2\xe6\xbe\x18\xd1V\xd3\xc1\xb0\xb8g\xceJ\xc4\xe5r\x3" -"X_\x98\xad\x8a\xd4\xa1\xc2\xcd\x98#\xf6\x9\xaf\x8b\xe9\x66\xf7\xcc\x89\xe7\x87\x43" -"_1+|g\xc2\xf9\xef\xa2/\x16\x9a^\x81\xc8\xf3\xdet\xaf\xd4Vu\xb4w\xae\x9d\xf1\x98=" -"\xe2GG)\xec\x80\xfdVF\x5\x80Q\xd8\xf0\x9b%>W\xbeU@\xba\xb~\x9c*X\x88y\xd4]\xac.\x94" -"\x94\x1bG\x5\"\x95\xba)\x9\xb9\x1d\xb7\x31;\xa5\xd3\xc7\x80\x11>\xe7\x36\xefW\xd7" -"\xa9\xaa\x88\x3\x1a\xe6\x14\x11\xf3.\xd3\xab,\xb9z\x97\x8a\xbb'\xb8\"\xc4\x42\x82" -"\xefQh\x14\x8f\xc3.\xc9\x91\xf7\x5(\x8c\x8c\xfdl\x83\x8a\x37\xdaN*]\xba]!W9\x0_\xec" -"\x9a\xc0\xcTh\x84\xf8`\xdb\x13\xc\xfc\xc1\xf1\x81\xcc_\x91?x\x9b\xfe\x61\x0\x99\xcd" -"\xe5\x84\xd5\xdb\xb1V\x4\x66V\x17\xd1\x35\x9d\x61\x10I\xef\xf6y\xae\xd9\x36\xaa\xe7" -"\xc2\x7f\xcd\xe3\x5U\xf0\xee\x39\xed\xb8Q+\xdeP\x7\xaa\x9b\x1b\xffjKkV\xe8\x83\xbd" -"(N!6\x2\xdf\xb4\x46]1\x11h-N+>3\x9f\xbb\xe\x4UUr\x81x\x8akU\xea\xa5\x88\x1e\x62\xad" -"\x1c\xbc\x65\xd0\xeb\xaa\xd4\xa5`\x8\x99\xb9\x32\n\xf\xc9\x8e\x8c\xa2\xe7\x96|l," -"\xe4\x89\x10\xd1\x80\xbd\xcf/anu6\xf7'\x97\xe3\xb1\xbf}O\xdd\xd0\x81y\xf5\xf3\x42" -"\x9b\xc3\x88S\x7\x8\x9b\x9fM\xaf\xb2\xfe\xaa\xdc\x8av\x1fkA\xf9\xd7\xe6\xceu\r]\x8f" -"\xfe\x99\x9d\xa5]\xc2\x39\x93;\xca\x15$\xaa\x0x\xee$\x88\x1e\x12\rwK)?\x15\x93\x62" -"\x12\x30\xfdR\x94\x42\x86S\xeb\x45?\xbf\x97\xb2u\xbf\xea\x38\x9b\xac^\x8e\xca\xe1" -"#\x89\xb1_d3\x8aY\x13\x1fj\xba\xfe?c,!^8\xf9z\xbe\x80\xd3\xfc\x93\x35-\xe'p+\xf8" -"3\x6\xa0?\xae\xd8\xf8\x91`Ao\x1c>\xf5\xf5\x38\x8f(17\xb\x64\xbf|\xb7\x37\xaf\\\xa9" -"Z\x80#\x81Z\"+\xe8\x11\xb4\xb8\\\xf5+\xeb\x4o\xc\x45\x87\x64?\xc0\xdaw\x81\ni\xbf" -"\xacL\nJq\xdf\xd0\xc0\xab-V5\x2\r&IX\x8a\x8a\xd4\xe8%G\x86Q\x95\n\x83\xd5\xf0\xf2" -"\xbd\x8c\xc3\x1e\x82Pt@M\x16\xc0ST\xd1\x87\x30\xfc\xd4,\xcc\xd5\x14\x37\xa2\xf2\xa9" -"\nj\x9e)M0\xa5\xf5\xe5?\x18\xe5>\xd4\xb6\xf\xe\xf\x61YO\xea\x13o.\xd0\xc8\xaf^\xf7" -"\xca\xe9\x46\xb3:\x18\xd9\xe2\xd0\xc8\xb8\xad?\xf0\xe1\x90\x8d\x30\xff\xcd\xabX\xa2" -"\x8eY\xfb\x12\xd1\xf2\x8ex>\xd5\x8e\x34N\x91\x5\xd9\xbd\xba\x8e\xcf\xb7\xb0\xdf\x61" -"\xcb\x7f\x43y$\xffq`V;\xe7\x9Lv\x9f\x36\xfa\xb8\xdct {\xc7\x89\xee\xc0\x11\xe3N\xf8" -"\x1e\x37G\x8c\xc4\xc9\xd5\xa1\x11\x8a\xc0\xa6\x85\xd2Q6\xf7\xe2\x95\xb8L\x6\xfO\xb6" -":\xe4\xcc\x8a\xf1\xb9j\xdaK\x18;\x5M\xf7\xef\x8c\xa3\n\xef\xc9\xb0\xcd#E\xb7(\xa6" -"\"\xe2\x42J\xe0\xaaW\x8c\x6^X\xe8\xc3N\xbd+m\xf6H\xa9x\r\xea)9w\x94j\x9a<\xd8\xec" -"Gy\xf3\xf\x8aKQ\x0\nU\xdb\xef\xb3(\xe2\xd5\x9\x8d\xbc?\x98Y\xd4\x9a\x46?\xd2L\xd8" -"\xc2\x8e\xc4&\x8\x82\x45\xb0\x90\x80\xc7\x9b\xa4?\xc4m\xd5_+\xa2\xc1\x90\xf8\xc1" -";\r\x88?\xb6s{\xc0\xf9\xac\xb5\xf0\xac;\xfaN\x8c\x34n\xf5\xd0\xa9\xa6\x17\xbf\xb9" -"\xe2\xfd\x9f\xbch\xe3\x94\x1\xd5\x97\x83\x19\xfeRy\x10\x86u\xe8\xe7h\xf4.\x1\xa0" -"\xb8\xc1\x33\xdb\x1c\x8b\xe7\xe0\xa5S\xed\x1c\x16v\xedH\x8b\x5\x83\xa3\x31\x7f#?" -"zC5\xb7\xb4\xee ]\x1d\x32IW JQ\xa0\xb3rA\x93\x8f\xe2\xa5M\x8a\xecJ\x81I3\x84Y\x4" -"2\xd5\xaf\xad\xc3\xa8KN\x8w\x1b\xe8\xf&H\xac\xf9\xfb\xc7w\xa5\x1bS\xf\xc\xa3O\xa7" -"\xa8\xa8\xa1\xcb\x39\x1d\r\xb8\xf0\x9f\x10\xbd\xfc\x19\x35 B1q\x84\x94\xdb\xa1+\xdd" -"\xc6\xff\xfe \xd4\xf3\xb7\x6/\xee\xc9x\xa0yx\x4\x89\x8d\xb2\xf1\x42y6;rp\x8dn\x7f" -"\xda\xefq\xaa\xa4\x95\xed\x16\xdb\x39\xe5\xcc\xea\x30\x90\xcf \xc2\xc0\xd6n\xb9\x8" -"\xec\x81M\xaf?T\xb4\x46YV\xef\xcd\xfa\x46\x7\x1a\xe\xaez\xb7\x9a.\"\x7f\x8b(\x19" -"\xc1\xc5\xca\x1\x86\x46\x10k50>\xcb\xe7=I#\x8c\xc1\xf;\xbb\xc9\x43\xbf\xb7\xd5G\x13" -",M\xeb\xc1\x92=\xf4\xe8\x12\n\x32&\xcb\x99\xeb\x8e\xf1\x62Th\xabr\x0\x65\xd6\xba" -"\xcc\xca;\xf4\xcd\xfb/\x92\xb6\x14(\xb0\x33\xf2k\x98^\x84\x11\x82\xc\xa0\xcdKS\x4" -"Qde\xf2\x9c\x89Jl\x1b\xad\x89\x42\xde\xe1\x38$!\xa6\xc0`v\xdd\x6\x45\x1a\xe5\x83" -"\xb9\xe7\xab\xe0\xe2s6RG\xfa$\xcdh\xe9\xb2 \xf2\xbf\xa3Z\xdb\xd6\x2Y\xf5\xa0\xde" -"Kf\xb\x2\x41\x84\x1e/\xf4X\\e\x86\x83\xdd\x9em\xc8G\x0\xb#\x82%\x99\x8 \xc1\xfa\xee" -"\xf4\xe7\x39x\x9b\x9e\x44\xab\x3w0\xdcOl`\xdb\x5\xe7\x84s`\xe4K\xc\x14\xe5\x9a\xf4" -"x\xcfT\xa9g\xc\xa3]N\xe3\xe3\xf8\x1e\xbf\xc5\x80\x43G\x81\x99\xaa\xe\x35\xdat\xb4" -"\xee\x11\xc0\x11x\xe4\x42\x35.\xee/W\xa6Q\xfb\x1b\xe5\x12:\xcc\x97\x38H\xddy\xb1" -"\xbf[i\xdf\xc2\x18\x66\x62\xc9\xa5H\x17\xc3<\xb1\xa6\xb5\x89\xeb\x64\xa5\x88Z\xe8" -"\xed^\x8f\xfc\xe9\xcb\xc9\xf1\xd0O\xaa\xfd\x2t\xd5p,\"\x9\xef\x9eR\xb3W\xe2/E\x8b" -"\xd3\xbe\xb2\x44\xfe\x88\xc3m\x8\x8d\xda\"\x9eP\x12'\xca\xaar\xc5\x8a}Z\x95\xfb\x1d" -"~8\x8\x19\xda\xab\xa5\x9d.\xeb\xdc_|\xc2\xbc\xc0\x42\xe7?\x13\xf2\xdf\xb1\x9e\xf5" -"\xbap\xd0\xet\xbe\xd0\xadsrm\xcc\xcd{>\xcd\x1m\xc0\x10\x18[\xc3J\xacg\"\x92~\xc4" -"\xcf\xc8\xd4\r[\x88\xcd_\x1\xf2\r\x1b\xeer\xb7\x15\xb9\xd4\x93\x1d\x81\xdc\x97,Y" -"\xb3\x12L\xa3^w6\x12g>C\x93\xde\x8b\x93\xb9\xb3\xc6\xb3x`3\x7\x0QL\xd3\x19\x19\xf4" -"*(\xf9\xb7\xc8\x14\x31\xac\x89\x12\xad\xca\xe9\x82i\xd6\xa6O\x82\"\x8f\xe\xdb\xc5" -"\x9d\xe4\xf6\x90\x66\xc4v\xfe\x35\x1f\x98i\xa4\xbb\xdb\xec\xf6I\xa2\xe3]\x1\x9e\x90" -"\xa1\xd2\x80\xa1\xfeU\xbc\xf5(\x15\x8f\xfb\x1\xfa\xcf\x46\xd9\xf6\xeb\x2\x66\x14" -"\x9e\xd4\x3\x7\xd9\xb0p\xca\x8c^CL\xb7\xa5U\xb7M\x18\xa6\x6\x97\x84\x89n/%\x3i\xfc" -"ko\xc4&wK\xe9\x80\x64\xe0\xfeW\xb8\xc9\xd5\xca\xab\x1a\xa9\x97" -"\xaf\xe6\xfb\x62S\n\xc8\x83\x32\x36\xd5\xac\x7f\xcd\x65\xdc\x18\xe1\xe0-\x5\x91y" -"\xee\x2\xc3<\xfco]\xbd\x6\x9\x1d\x8\x94/B\r5\x97S\xff,\x9e\xdb\xe1l\xc2:\x97\xcc" -"kf\xd3+\xe0\xb4\x1e\r\xcb\x98:\xa1\xcb\xb6SJ\x16\xe8\xf6\xe8\xb2\x42*\x95\xb8\x80" -"\xc6\x13Q\xa7n\x1dS\xe5\xbf\xa9\xaa\xc6y\xb6\n\x7f\x9b-\xfd\xec\x87\x8e\xbb\n\xd3" -"\xe\x9bo\xeb\xd3?\x98\x65&\xf0>C\xdd\xce\x13\xadRdR\x1a\x89qu,\x1\xca\xe7\x38\xec" -";\xd4\xe5V\xdck\xeev\xa8\x85\xf\xe\xf7\x38\x98\x2tD\x8a\x0\xd8h\x17\x87\xa3\x14\xdc" -"k\x1c\xfb\x81\xe8\x38%\xf3\xb0J\xe2R\xeci\x81\x87\xd0\xa2\x42\x38\x9e\xef\xe1\xea" -"\xfc\x5L\x9b\xc0\xc3\x3\xa8\xec#\xc0\x63\x30{!\xb2\xa9\x80\x34\xf6\xe7\xc4u\x8b\xe5" -"\xc\xd3Tt\xea\xbf+|K\xaen\xa1\xcdP\x88=b\xa3\x8a\"\x81\x9c\xd6\x66\xacm/9\xb1\xfa" -"\xd6\xfa@4Al\x3\xd9y^L\xafY!Vr\xf2\xae\x88\x61\x9f\x17,1\x1a+{0\x1f\x30\xcc\x31%" -"0v*\xa4#a\xdb\xdbv@4)(\x98\x95[\xff\x38\xfc,\xf6\xc7\x16\xabRQ\x18\xbf\xbrW1|\x81" -"\x18\xe9%:\x1a\xeal\x87\x8b\xc6\x37}d(\xe8\xce_\xb7\x85\x44\x93\n\x46\xd0+K\x8\x8" -"\x1b\xef\xc7\x84\x2\xca\x44Lt, =\xd1\xfa=\xbc\x35\x1d\xf1\x12\xdd\xa7x\xb1\xe5\xc3" -"\x98K\x3\xce\x9e~\xab\x15\xdcH\xdd\xc4i\xc7\xef\x35\x43\xf8\xe1\x95\x33\xac\x32\xa3" -"\xf6\xb8\xb1!\x3X#\x3\xcb\x46\x8m~\xb6\x99\x17\xb9\xe2/\x92\xb0\x7fyK\x80\xf5\xb3" -"\xa3.D\xd8\x8d.f\xc9\xe4\x1d\xc9\xd6\xe\x34n\xc\x99\xab\x66\x4\xbb\xeaU\xf\xbeJ\x1d" -"\x96V\xd3\xd8\\\xd9\xb8\xd6\x32\xa1\x35Kv\xde\xa1\xd8v\x14\x8d\x9b\xfcmq\x8\xaa\x1b" -"\x12l\x17\xdd\x16\xa3\x91?\xa2\x63\xfb\x94'J*\xa4\xce\x87\xa1\"\xd7'p\xf3\xd0\xaf" -"\xed\xac\xca\xa1!\xbf\xc2\xf4/z\n\xd1x{\xc8X\xc3\xf6\xab\x8c\xda\xe7m\x86\x8a\xa3" -"\xbb\xab\xd1\xe1\x66\xa7\xea\x5`\x8e^\xb1\x6\x8dL\xf2\xd7rd!\x8d\xa1\xba\x33\xe4" -"\xf1\xcc=$\x86\x87ht\x7f\xc0\x8c\xdc\xafW\xc6{$\x98$m\x7f\xf6\xf3:\xcb/\x83\xa9p" -"\xb6\xb6z\xee\xb/\xc0\xb7l+K\xdd\xbb\x9b\x98lZ\r##Am\xd9T\xf7\x3\x62\x37\xb1\x8c" -"\xac\x8a\x1c\xea\xfeNo\xa1\xd2\x39kHz\x3\xb9\xb3\x30\x1c\xa9\xb7\x95\x62o\xed\xb3" -");6O\xcb\xe2\x9b\x8e`o5\x86\x32\x84\x32-\x82\xbb us~\x80\x62\x45H\x91\xe2\x45\xe0" -"\xf1\xecwC\xf1\x99{;6\xd2M\x94\xf6\x9b\xe4\xba!\x8a\x94\x36\x46ky\xd8\x16\xe6\xa7" -",s\x6\xe3\xc2q\x18I\xe9\xa9\x41\x98<\xc5\x89\xe2\xf1\x9e\xd1\x8d\xdf\xf7Q6\xe2S\xed" -"\xae\xbfW\xb6t\x13\x46\x84\xd1\xfa\xa2\x1e\x1K\x9dTu\xae\x81_V\xb6\x6\xab\x62\xf9" -"\xae\x1c\x32\x31Z\x14H\xdd\xd4\x15\x1d\x6\xf4\xaa\x13GDM2@\xdfO\x82\xf9\xfc]\xc8" -"p\x91\x12\x93\x8a\xcf\x9b\xb2^zK\xf\xef\r\xd2Q[\x15\xdf\xb4\r\x17@H\xed*=\x84\x1b" -"\xd0\xe6\xc8!\xe0|^\x95\x9c\x17\xd6\xf2\xba\x65\x9dy,\x97g\xb9\x17$S\xae\x9c\x41" -"Zj\xa8\x18\xf3\x99\x91gy\x3!\xdfv\x95\xfb\xeav\xec \xfb`\xb5\x16\xf8MY\xbf\xdd\x9" -"\xa2\xfc\xa1\xbd^\xb3\xec\xe3>Q\xed\"Z0\xc3I\xfd\xe4\x33\x61\x63\xd7\x9b\xa2\x5\x33" -"C\xed\x4\xec\xcd\xf8\x45;3\xf9\xbf\x3>\xad[\xf5\x92%\x85mzi\x16W\xcd\xfe)\xee\xaf" -"\xb1\x46\xf4\x1dL\xc9\xc8\xd4\xae\r-(z\x93\xc1m\xc8_s\x8\x39\x9)\xbe\xf5\x32\xae" -"\xef\x87p\xb9\xafn\xa7\xfa^n\x96\x8d!\x1d\x1f\xc\xee\x98\xa0\x9a\x45G\xad`\x9f\x62" -"\xdck[\xa7\xb\x9a)\xdd\xb3\xfa\xa1Q\x2\xa5j\x1{\x9f\xda\xcb\xa8\x95_h~-N\xba\xc5" -"q\x93w@\xf1\xc6\xa3\xe5\xd9XN\xc9\xd7u\x8f\xd2zF{'>\\]+I\xa1\xfL\x93_v\xa0q\x83G" -"\xaeY\xf9\xf5\xe2\x9e\x8f&\x95\x66L\xef\n\x10\x11&6H\xd4\x86\xe5\xee\x9c\x31;\x8b" -"/\xe\xd6\xe9\xc9\xa6\xa5\xae\x15N\x1f\x1d\xb9Qd\xfd\xa1!\xfe\xac\x7xa\xc8ZvY)\xa6" -"\x9e\x15~\x13\xd2^^\x5;\xd5}\x16\x7\x91\x19\x32\x93\x96\xe4\xb3\xacH\xfd\xe8\xe\x9" -"T\xb6\x65\xd6\x1b};\xeb\xe{8\x0\xb4\xfe~\xcc\xc7\x41X\x1b\xd4\xeb\xe4_\x1d\x9\xf" -"\xf8\xa1?\xf6\xec\xff\x9bv\xef\x31.\xbfHw^f\x0\xe8&\x1dW\xdc\x89\x8e\xdb\xec\x1c" -"\xe7/\x98\x6\xacZ\x9a\xb5\x85\x33!3\xaf`\xff*\xc3\x1bn\x97\xd2\x8b\xd2\x32\xa5\r" -"(#\x15\x95\xd2\xb2\xc2\x1b%:'\xa7\xd4\x30\xa7x\xff\r\xd4\x46\xbb\xf9<7\xc1\xa4\xfb" -"\x1a\xb7\n\xd1\xc6\x61[Q]rF-\x81SQE\xff'c\r\xeb\xb4\xf\x84\x39\xe0\x93\xc9\xf\xec" -"~\xbd\x4\xad\x81\x86\x63\x90\xef\x8d\xf9\xd4\xd4\xaaG\xb8\xda\x9f\xf7\xf5\xba::l" -"\xc6\x19\x18\x63\x99\x1\xf4\xc5\x8c\x86\xfd\x18\x44\xc0_\xe7\x95\xec\xf8\x82N_\xf5" -"y\xb3\x39\xe1\x8c\xf2\x98xh\x6\xe9\x15\x9b\xc9\x86\x94\xcb\x45\xa3\xc3\x8d" -"\x11\x35o&\xc4\xd6\xdf\xc4\xcc$\xd1M\xb7\xd1\xf5i\xddPDX\xd6\x42\x12\x41\xa9\x46" -"\xbv\xc\xc8\x91\x82\xa3\xbeM^'O\xba\x17\xb0\xc6js\xa3\x12\x44\xf9N\xe%\xa8\x9a\x43" -"I\xfe\x3\xbb{+v\xd5\x8\x7f\xcf\x1\xe2:\xb8\xa9\x46T\x12\x95\xfe;\x81X\xc1\x9f\xd5" -"(\x19\x82yK\xab\xd4\xd8\x81K'\x82\x18\xe8\x9e\x93\x38\xc7\x3\x14s\xcb\x6p\xc0\x1" -"\xc\x62\xec\xb8\xd0\xc3z\xbbt\xa6\x8fU2\xbaI\xf4y\xdf\xa2v\xb9\x1d\xfd\x95\xd4h\x9f" -"uS\xdet2'\xaa\x96\xb6t\xdc\xec\x81\x86Uk\xa8\xaf\x62\x9ay\xc6$\xde)|\x19\xea\xa8" -"n'KL\xcb:l\xef\x80ti\xa7\x97\xea\xe6\x37\x90\x9c\x19#/(\x1\xb5\xbf\xad\x8ak\xdc\x65" -"e\xbf\xc0\xc2\x17\x0HT\xdc\x65L}\x98ix1\xa6%\xb3\xee|\xe2O_\x5\xb0\xaaj\xe0\x18|" -"\x98\xc2!\x82\xcZ#\xa2u3\xde\xd3\x3T\xc4\xca\xad:\xad&\x1e\xbb\\\x0Sr\x14\x7\xd9" -"\xebk\xd5S\x80\x93\x8@}\xe0\x38\xd2\xc6\xa6\xac\xd7\x7f\xeft\xcf\xb5\xd9\x61\xdc" -"\xbe\xaa-\xa6\xb8\xde\xec\xa6NJ\xdd\xa7\x36rV\xc1\x36\x1c~\xa9\x9ak\x95P?\xe9\x1" -"\xd0V&\x7fn6\xdbx\xd1\x65\xb7\x44\x83Wn6\xab\xa1\x9eh\x1\xa3>\x9e\xb\xc2\x1e\xae" -"*\xe\x8eV\x94?L/\xbf\x94g\xaf\xed\x7\x98IcUy\xea\x81\xfd\xe7\xe0z\x1c\x9b\xd1,r\xeb" -"/\xfc\"P\x3\xb\xed\xf8\xd8T/\xfcK\x8e\xd5&\x89%\xc5k\xff\x45\xb3>\xb\xb0\xf9N\x12" -"\xeeiM\xcf\xd3JWrL\xf3\xb9\xd3G\xd7\xa8\x45\xa0\xc5\x8d\xa8\x3\xb9\x99\xdaS\xcb\xc1" -"\xe3\x95^\xad\x7l\xe8ob\x8Y\x85\xc9\xd9\xfc\xfd\xab\x90\xb2\xd2ls\xd7g\x8N\xbap:" -"\x13\xae\x41\xff\xdb*\x98\xf>\xa0\xf0\xb6~\xd5\xa0\xaf\xf4\xb4\x18k\xdc\xf2\x17\xff" -"W[\x15\x8\x43M\xfc\xe6z \xe4\x9h%sY\xd0\xc2\x10\xb2\x8d\xffV\x1b\x8e\xa8Z\xa7O\xb4" -"C\xda\xa5oL\xc3z\xc6\xf5\xcd\x39QY\x1a\xcb\xb8M\x3\x61p\x15jf@\x0\x9\x82\xe7\xaa" -"\xae\xa6\x36\xf7&`\x99\x82\xcc\x39\xcf\x9f\xc\x42\x86\x8ai\xa3\xa5M\x18\x4\x0\xb2" -"\x90\x94\xc4>bO\xbc\xb7\xa0\x87\xb5L\xc2\xea\x93\xf\x87@\x82\x8bkmr\x19\xac\"\x37" -"\x83\x8f\x63\xdfs\xfb\x99\xf4\xc5\x1d\xe0>W\x8c\xf7\x4{\xcb\xa4\xf0\x8a|V\xe0\x8" -"(N\x95\xcc\x80\x1\x14\x2\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" -"000000000000000000000000000000000000000000000000000\r000000000000000000000000000" -"0000000000000000000000000000000000000\r00000000000000000000000000000000000000000" -"00000000000000000000000\r0000000000000000000000000000000000000000000000000000000" -"000000000\r0000000000000000000000000000000000000000000000000000000000000000\r000" -"0000000000000000000000000000000000000000000000000000000000000\r00000000000000000" -"00000000000000000000000000000000000000000000000\r0000000000000000000000000000000" -"000000000000000000000000000000000\rcleartomark\n\x80\x3" -; -int n022023l_afm_len = 32136; -char* n022023l_afm = -"StartFontMetrics 3.0\nComment Copyright (URW)++,Copyright 1999 by (URW)++ Design" -" & Development\nComment Creation Date: 12/22/1999\nComment See the file COPYING " -"(GNU General Public License) for license conditions.\nFontName NimbusMonL-ReguOb" -"li\nFullName Nimbus Mono L Regular Oblique\nFamilyName Nimbus Mono L\nWeight Reg" -"ular\nItalicAngle -12.0\nIsFixedPitch false\nUnderlinePosition -100\nUnderlineTh" -"ickness 50\nVersion 1.05\nNotice (URW)++,Copyright 1999 by (URW)++ Design & Deve" -"lopment\nEncodingScheme AdobeStandardEncoding\nFontBBox -61 -237 774 811\nCapHei" -"ght 563\nXHeight 417\nDescender -186\nAscender 604\nStartCharMetrics 316\nC 32 ;" -" WX 600 ; N space ; B 319 0 319 0 ;\nC 33 ; WX 600 ; N exclam ; B 246 -15 463 61" -"8 ;\nC 34 ; WX 600 ; N quotedbl ; B 254 315 582 604 ;\nC 35 ; WX 600 ; N numbers" -"ign ; B 137 -62 589 647 ;\nC 36 ; WX 600 ; N dollar ; B 131 -92 582 655 ;\nC 37 " -"; WX 600 ; N percent ; B 137 -12 591 611 ;\nC 38 ; WX 600 ; N ampersand ; B 132 " -"-16 527 519 ;\nC 39 ; WX 600 ; N quoteright ; B 207 314 468 604 ;\nC 40 ; WX 600" -" ; N parenleft ; B 335 -124 583 604 ;\nC 41 ; WX 600 ; N parenright ; B 124 -124" -" 372 604 ;\nC 42 ; WX 600 ; N asterisk ; B 211 250 586 604 ;\nC 43 ; WX 600 ; N " -"plus ; B 131 32 588 530 ;\nC 44 ; WX 600 ; N comma ; B 110 -145 371 145 ;\nC 45 " -"; WX 600 ; N hyphen ; B 131 258 588 299 ;\nC 46 ; WX 600 ; N period ; B 235 -15 " -"386 116 ;\nC 47 ; WX 600 ; N slash ; B 99 -81 625 668 ;\nC 48 ; WX 600 ; N zero " -"; B 156 -15 571 618 ;\nC 49 ; WX 600 ; N one ; B 117 0 492 612 ;\nC 50 ; WX 600 " -"; N two ; B 84 0 572 618 ;\nC 51 ; WX 600 ; N three ; B 110 -15 579 618 ;\nC 52 " -"; WX 600 ; N four ; B 141 0 545 604 ;\nC 53 ; WX 600 ; N five ; B 113 -15 584 60" -"4 ;\nC 54 ; WX 600 ; N six ; B 184 -15 631 618 ;\nC 55 ; WX 600 ; N seven ; B 21" -"5 -1 606 604 ;\nC 56 ; WX 600 ; N eight ; B 143 -15 576 618 ;\nC 57 ; WX 600 ; N" -" nine ; B 142 -15 589 618 ;\nC 58 ; WX 600 ; N colon ; B 235 -15 450 417 ;\nC 59" -" ; WX 600 ; N semicolon ; B 114 -145 426 417 ;\nC 60 ; WX 600 ; N less ; B 131 4" -"4 627 518 ;\nC 61 ; WX 600 ; N equal ; B 95 190 625 375 ;\nC 62 ; WX 600 ; N gre" -"ater ; B 92 44 588 518 ;\nC 63 ; WX 600 ; N question ; B 231 -15 581 577 ;\nC 64" -" ; WX 600 ; N at ; B 139 -62 561 624 ;\nC 65 ; WX 600 ; N A ; B 13 0 596 563 ;\n" -"C 66 ; WX 600 ; N B ; B 47 0 591 563 ;\nC 67 ; WX 600 ; N C ; B 110 -16 635 576 " -";\nC 68 ; WX 600 ; N D ; B 47 0 592 563 ;\nC 69 ; WX 600 ; N E ; B 47 0 619 563 " -";\nC 70 ; WX 600 ; N F ; B 47 0 640 563 ;\nC 71 ; WX 600 ; N G ; B 108 -16 636 5" -"76 ;\nC 72 ; WX 600 ; N H ; B 57 0 646 563 ;\nC 73 ; WX 600 ; N I ; B 117 0 603 " -"563 ;\nC 74 ; WX 600 ; N J ; B 100 -16 699 563 ;\nC 75 ; WX 600 ; N K ; B 47 0 6" -"62 563 ;\nC 76 ; WX 600 ; N L ; B 67 0 585 563 ;\nC 77 ; WX 600 ; N M ; B 15 0 7" -"00 563 ;\nC 78 ; WX 600 ; N N ; B 46 0 678 563 ;\nC 79 ; WX 600 ; N O ; B 102 -1" -"6 616 576 ;\nC 80 ; WX 600 ; N P ; B 47 0 587 563 ;\nC 81 ; WX 600 ; N Q ; B 102" -" -115 616 576 ;\nC 82 ; WX 600 ; N R ; B 47 0 594 563 ;\nC 83 ; WX 600 ; N S ; B" -" 96 -17 602 577 ;\nC 84 ; WX 600 ; N T ; B 152 0 648 563 ;\nC 85 ; WX 600 ; N U " -"; B 136 -16 676 563 ;\nC 86 ; WX 600 ; N V ; B 124 0 707 563 ;\nC 87 ; WX 600 ; " -"N W ; B 122 0 696 563 ;\nC 88 ; WX 600 ; N X ; B 44 0 662 563 ;\nC 89 ; WX 600 ;" -" N Y ; B 153 0 665 563 ;\nC 90 ; WX 600 ; N Z ; B 103 0 590 563 ;\nC 91 ; WX 600" -" ; N bracketleft ; B 254 -124 570 604 ;\nC 92 ; WX 600 ; N backslash ; B 250 -81" -" 474 668 ;\nC 93 ; WX 600 ; N bracketright ; B 132 -124 448 604 ;\nC 94 ; WX 600" -" ; N asciicircum ; B 192 354 567 615 ;\nC 95 ; WX 600 ; N underscore ; B -61 -12" -"5 564 -75 ;\nC 96 ; WX 600 ; N quoteleft ; B 388 343 544 604 ;\nC 97 ; WX 600 ; " -"N a ; B 93 -16 546 431 ;\nC 98 ; WX 600 ; N b ; B 26 -16 591 604 ;\nC 99 ; WX 60" -"0 ; N c ; B 121 -17 596 432 ;\nC 100 ; WX 600 ; N d ; B 102 -16 630 604 ;\nC 101" -" ; WX 600 ; N e ; B 104 -16 570 431 ;\nC 102 ; WX 600 ; N f ; B 109 0 663 604 ;\n" -"C 103 ; WX 600 ; N g ; B 105 -186 647 431 ;\nC 104 ; WX 600 ; N h ; B 55 0 556 6" -"04 ;\nC 105 ; WX 600 ; N i ; B 96 0 513 624 ;\nC 106 ; WX 600 ; N j ; B 112 -186" -" 547 624 ;\nC 107 ; WX 600 ; N k ; B 67 0 578 604 ;\nC 108 ; WX 600 ; N l ; B 96" -" 0 513 604 ;\nC 109 ; WX 600 ; N m ; B 15 0 603 431 ;\nC 110 ; WX 600 ; N n ; B " -"57 0 546 431 ;\nC 111 ; WX 600 ; N o ; B 111 -16 577 431 ;\nC 112 ; WX 600 ; N p" -" ; B -13 -186 593 431 ;\nC 113 ; WX 600 ; N q ; B 105 -186 668 431 ;\nC 114 ; WX" -" 600 ; N r ; B 88 0 619 427 ;\nC 115 ; WX 600 ; N s ; B 108 -17 558 431 ;\nC 116" -" ; WX 600 ; N t ; B 127 -16 518 563 ;\nC 117 ; WX 600 ; N u ; B 127 -16 569 417 " -";\nC 118 ; WX 600 ; N v ; B 114 0 655 417 ;\nC 119 ; WX 600 ; N w ; B 114 0 655 " -"417 ;\nC 120 ; WX 600 ; N x ; B 55 0 611 417 ;\nC 121 ; WX 600 ; N y ; B 22 -186" -" 634 417 ;\nC 122 ; WX 600 ; N z ; B 115 0 563 417 ;\nC 123 ; WX 600 ; N bracele" -"ft ; B 248 -124 528 604 ;\nC 124 ; WX 600 ; N bar ; B 257 -124 444 604 ;\nC 125 " -"; WX 600 ; N braceright ; B 175 -124 455 604 ;\nC 126 ; WX 600 ; N asciitilde ; " -"B 145 212 575 348 ;\nC 161 ; WX 600 ; N exclamdown ; B 222 -216 439 417 ;\nC 162" -" ; WX 600 ; N cent ; B 175 -13 563 630 ;\nC 163 ; WX 600 ; N sterling ; B 90 0 5" -"41 578 ;\nC 164 ; WX 600 ; N fraction ; B 84 138 645 470 ;\nC 165 ; WX 600 ; N y" -"en ; B 161 0 665 563 ;\nC 166 ; WX 600 ; N florin ; B 74 -93 643 618 ;\nC 167 ; " -"WX 600 ; N section ; B 91 -62 624 603 ;\nC 168 ; WX 600 ; N currency ; B 127 95 " -"597 489 ;\nC 169 ; WX 600 ; N quotesingle ; B 344 315 492 604 ;\nC 170 ; WX 600 " -"; N quotedblleft ; B 221 343 586 604 ;\nC 171 ; WX 600 ; N guillemotleft ; B 108" -" 0 626 417 ;\nC 172 ; WX 600 ; N guilsinglleft ; B 108 0 397 417 ;\nC 173 ; WX 6" -"00 ; N guilsinglright ; B 297 0 585 417 ;\nC 174 ; WX 600 ; N fi ; B 14 0 615 62" -"4 ;\nC 175 ; WX 600 ; N fl ; B 14 0 611 604 ;\nC 177 ; WX 600 ; N endash ; B 131" -" 261 588 302 ;\nC 178 ; WX 600 ; N dagger ; B 208 -63 561 604 ;\nC 179 ; WX 600 " -"; N daggerdbl ; B 154 -62 561 604 ;\nC 180 ; WX 600 ; N periodcentered ; B 285 2" -"17 436 348 ;\nC 182 ; WX 600 ; N paragraph ; B 152 -62 648 604 ;\nC 183 ; WX 600" -" ; N bullet ; B 253 141 449 337 ;\nC 184 ; WX 600 ; N quotesinglbase ; B 110 -14" -"5 371 145 ;\nC 185 ; WX 600 ; N quotedblbase ; B 73 -116 538 145 ;\nC 186 ; WX 6" -"00 ; N quotedblright ; B 170 343 635 604 ;\nC 187 ; WX 600 ; N guillemotright ; " -"B 67 0 585 417 ;\nC 188 ; WX 600 ; N ellipsis ; B 57 -15 557 84 ;\nC 189 ; WX 60" -"0 ; N perthousand ; B 91 -9 598 614 ;\nC 191 ; WX 600 ; N questiondown ; B 105 -" -"175 455 417 ;\nC 193 ; WX 600 ; N grave ; B 286 490 429 639 ;\nC 194 ; WX 600 ; " -"N acute ; B 388 490 577 639 ;\nC 195 ; WX 600 ; N circumflex ; B 263 490 554 639" -" ;\nC 196 ; WX 600 ; N tilde ; B 258 516 579 605 ;\nC 197 ; WX 600 ; N macron ; " -"B 273 536 564 576 ;\nC 198 ; WX 600 ; N breve ; B 280 489 574 621 ;\nC 199 ; WX " -"600 ; N dotaccent ; B 368 511 470 611 ;\nC 200 ; WX 600 ; N dieresis ; B 258 511" -" 581 611 ;\nC 202 ; WX 600 ; N ring ; B 326 480 516 661 ;\nC 203 ; WX 600 ; N ce" -"dilla ; B 181 -173 356 0 ;\nC 205 ; WX 600 ; N hungarumlaut ; B 263 490 576 633 " -";\nC 206 ; WX 600 ; N ogonek ; B 258 -155 408 0 ;\nC 207 ; WX 600 ; N caron ; B " -"286 490 577 639 ;\nC 208 ; WX 600 ; N emdash ; B 60 261 659 302 ;\nC 225 ; WX 60" -"0 ; N AE ; B 14 0 690 563 ;\nC 227 ; WX 600 ; N ordfeminine ; B 229 279 511 574 " -";\nC 232 ; WX 600 ; N Lslash ; B 66 0 586 563 ;\nC 233 ; WX 600 ; N Oslash ; B 3" -"4 -43 685 605 ;\nC 234 ; WX 600 ; N OE ; B 62 0 690 563 ;\nC 235 ; WX 600 ; N or" -"dmasculine ; B 243 284 543 577 ;\nC 241 ; WX 600 ; N ae ; B 36 -16 630 431 ;\nC " -"245 ; WX 600 ; N dotlessi ; B 96 0 513 417 ;\nC 248 ; WX 600 ; N lslash ; B 96 0" -" 524 604 ;\nC 249 ; WX 600 ; N oslash ; B 47 -43 637 458 ;\nC 250 ; WX 600 ; N o" -"e ; B 50 -16 630 431 ;\nC 251 ; WX 600 ; N germandbls ; B 47 -16 539 604 ;\nC -1" -" ; WX 600 ; N Udieresis ; B 136 -16 676 762 ;\nC -1 ; WX 600 ; N Uacute ; B 136 " -"-16 676 789 ;\nC -1 ; WX 600 ; N Scedilla ; B 96 -179 602 577 ;\nC -1 ; WX 600 ;" -" N Tcaron ; B 152 0 648 789 ;\nC -1 ; WX 600 ; N Scaron ; B 96 -17 618 789 ;\nC " -"-1 ; WX 600 ; N Rcaron ; B 47 0 594 789 ;\nC -1 ; WX 600 ; N Racute ; B 47 0 594" -" 789 ;\nC -1 ; WX 600 ; N Sacute ; B 96 -17 602 789 ;\nC -1 ; WX 600 ; N Otilde " -"; B 103 -16 618 755 ;\nC -1 ; WX 600 ; N ucircumflex ; B 127 -16 569 639 ;\nC -1" -" ; WX 600 ; N Ohungarumlaut ; B 102 -16 672 787 ;\nC -1 ; WX 600 ; N Uhungarumla" -"ut ; B 136 -16 676 787 ;\nC -1 ; WX 600 ; N Yacute ; B 153 0 665 789 ;\nC -1 ; W" -"X 600 ; N Eth ; B 47 0 592 563 ;\nC -1 ; WX 600 ; N Dcroat ; B 47 0 592 563 ;\nC" -" -1 ; WX 600 ; N Zacute ; B 103 0 590 789 ;\nC -1 ; WX 600 ; N Uring ; B 136 -16" -" 676 807 ;\nC -1 ; WX 600 ; N gbreve ; B 105 -186 647 621 ;\nC -1 ; WX 600 ; N e" -"ogonek ; B 104 -155 570 431 ;\nC -1 ; WX 600 ; N edotaccent ; B 104 -16 570 611 " -";\nC -1 ; WX 600 ; N ecaron ; B 104 -16 577 639 ;\nC -1 ; WX 600 ; N Ugrave ; B " -"136 -16 676 789 ;\nC -1 ; WX 600 ; N Thorn ; B 47 0 566 563 ;\nC -1 ; WX 600 ; N" -" eacute ; B 104 -16 570 639 ;\nC -1 ; WX 600 ; N edieresis ; B 104 -16 586 611 ;" -"\nC -1 ; WX 600 ; N dcaron ; B 102 -16 774 618 ;\nC -1 ; WX 600 ; N ccedilla ; B" -" 122 -173 596 431 ;\nC -1 ; WX 600 ; N ccaron ; B 121 -17 596 639 ;\nC -1 ; WX 6" -"00 ; N cacute ; B 121 -17 596 639 ;\nC -1 ; WX 600 ; N aogonek ; B 93 -155 546 4" -"31 ;\nC -1 ; WX 600 ; N aring ; B 93 -16 546 661 ;\nC -1 ; WX 600 ; N atilde ; B" -" 93 -16 570 605 ;\nC -1 ; WX 600 ; N abreve ; B 93 -16 574 621 ;\nC -1 ; WX 600 " -"; N egrave ; B 104 -16 570 639 ;\nC -1 ; WX 600 ; N agrave ; B 93 -16 546 639 ;\n" -"C -1 ; WX 600 ; N aacute ; B 93 -16 546 639 ;\nC -1 ; WX 600 ; N adieresis ; B 9" -"3 -16 571 611 ;\nC -1 ; WX 600 ; N Uogonek ; B 136 -155 676 563 ;\nC -1 ; WX 600" -" ; N ugrave ; B 127 -16 569 639 ;\nC -1 ; WX 600 ; N uacute ; B 127 -16 569 639 " -";\nC -1 ; WX 600 ; N udieresis ; B 127 -16 573 611 ;\nC -1 ; WX 600 ; N tcaron ;" -" B 127 -16 593 618 ;\nC -1 ; WX 600 ; N scommaaccent ; B 108 -237 558 431 ;\nC -" -"1 ; WX 600 ; N Zcaron ; B 103 0 604 789 ;\nC -1 ; WX 600 ; N ecircumflex ; B 104" -" -16 570 639 ;\nC -1 ; WX 600 ; N Ucircumflex ; B 136 -16 676 789 ;\nC -1 ; WX 6" -"00 ; N acircumflex ; B 93 -16 546 639 ;\nC -1 ; WX 600 ; N Zdotaccent ; B 103 0 " -"590 762 ;\nC -1 ; WX 600 ; N scaron ; B 107 -17 584 639 ;\nC -1 ; WX 600 ; N Ama" -"cron ; B 13 0 596 723 ;\nC -1 ; WX 600 ; N sacute ; B 108 -17 577 639 ;\nC -1 ; " -"WX 600 ; N Tcommaaccent ; B 152 -237 648 563 ;\nC -1 ; WX 600 ; N Ydieresis ; B " -"153 0 665 762 ;\nC -1 ; WX 600 ; N thorn ; B -13 -186 593 590 ;\nC -1 ; WX 600 ;" -" N Emacron ; B 47 0 619 723 ;\nC -1 ; WX 600 ; N Ograve ; B 102 -16 616 789 ;\nC" -" -1 ; WX 600 ; N Oacute ; B 102 -16 616 789 ;\nC -1 ; WX 600 ; N Odieresis ; B 1" -"02 -16 616 762 ;\nC -1 ; WX 600 ; N Ntilde ; B 46 0 678 755 ;\nC -1 ; WX 600 ; N" -" Ncaron ; B 46 0 678 789 ;\nC -1 ; WX 600 ; N Nacute ; B 46 0 678 789 ;\nC -1 ; " -"WX 600 ; N Lcaron ; B 67 0 638 576 ;\nC -1 ; WX 600 ; N Lacute ; B 67 0 585 789 " -";\nC -1 ; WX 600 ; N Idotaccent ; B 117 0 603 762 ;\nC -1 ; WX 600 ; N racute ; " -"B 88 0 619 639 ;\nC -1 ; WX 600 ; N Icircumflex ; B 117 0 603 789 ;\nC -1 ; WX 6" -"00 ; N ohungarumlaut ; B 111 -16 616 633 ;\nC -1 ; WX 600 ; N otilde ; B 111 -16" -" 586 605 ;\nC -1 ; WX 600 ; N Euro ; B 60 -16 634 576 ;\nC -1 ; WX 600 ; N ocirc" -"umflex ; B 111 -16 577 639 ;\nC -1 ; WX 600 ; N onesuperior ; B 249 259 469 612 " -";\nC -1 ; WX 600 ; N twosuperior ; B 230 259 514 612 ;\nC -1 ; WX 600 ; N threes" -"uperior ; B 245 251 516 612 ;\nC -1 ; WX 600 ; N Igrave ; B 117 0 603 789 ;\nC -" -"1 ; WX 600 ; N Iacute ; B 117 0 603 789 ;\nC -1 ; WX 600 ; N Imacron ; B 117 0 6" -"03 723 ;\nC -1 ; WX 600 ; N Iogonek ; B 117 -155 603 563 ;\nC -1 ; WX 600 ; N Id" -"ieresis ; B 117 0 611 762 ;\nC -1 ; WX 600 ; N Gbreve ; B 108 -16 656 777 ;\nC -" -"1 ; WX 600 ; N Umacron ; B 136 -16 676 723 ;\nC -1 ; WX 600 ; N Kcommaaccent ; B" -" 47 -237 662 563 ;\nC -1 ; WX 600 ; N ograve ; B 111 -16 577 639 ;\nC -1 ; WX 60" -"0 ; N Scommaaccent ; B 96 -237 602 577 ;\nC -1 ; WX 600 ; N Eogonek ; B 47 -155 " -"619 563 ;\nC -1 ; WX 600 ; N oacute ; B 111 -16 577 639 ;\nC -1 ; WX 600 ; N Edo" -"taccent ; B 47 0 619 762 ;\nC -1 ; WX 600 ; N iogonek ; B 96 -155 513 624 ;\nC -" -"1 ; WX 600 ; N gcommaaccent ; B 105 -186 647 668 ;\nC -1 ; WX 600 ; N odieresis " -"; B 111 -16 581 611 ;\nC -1 ; WX 600 ; N ntilde ; B 57 0 570 605 ;\nC -1 ; WX 60" -"0 ; N ncaron ; B 57 0 577 639 ;\nC -1 ; WX 600 ; N Ecaron ; B 47 0 619 789 ;\nC " -"-1 ; WX 600 ; N Ecircumflex ; B 47 0 619 789 ;\nC -1 ; WX 600 ; N scedilla ; B 1" -"08 -173 558 431 ;\nC -1 ; WX 600 ; N rcaron ; B 88 0 619 639 ;\nC -1 ; WX 600 ; " -"N Egrave ; B 47 0 619 789 ;\nC -1 ; WX 600 ; N Eacute ; B 47 0 619 789 ;\nC -1 ;" -" WX 600 ; N Gcommaaccent ; B 108 -237 636 576 ;\nC -1 ; WX 600 ; N Rcommaaccent " -"; B 47 -237 594 563 ;\nC -1 ; WX 600 ; N Edieresis ; B 47 0 619 762 ;\nC -1 ; WX" -" 600 ; N nacute ; B 57 0 577 639 ;\nC -1 ; WX 600 ; N uogonek ; B 127 -155 569 4" -"17 ;\nC -1 ; WX 600 ; N umacron ; B 127 -16 569 576 ;\nC -1 ; WX 600 ; N Dcaron " -"; B 47 0 592 789 ;\nC -1 ; WX 600 ; N lcaron ; B 96 0 593 618 ;\nC -1 ; WX 600 ;" -" N Ccaron ; B 110 -16 635 789 ;\nC -1 ; WX 600 ; N Cacute ; B 110 -16 635 789 ;\n" -"C -1 ; WX 600 ; N Ccedilla ; B 110 -173 635 576 ;\nC -1 ; WX 600 ; N degree ; B " -"257 346 553 636 ;\nC -1 ; WX 600 ; N Aogonek ; B 13 -155 596 563 ;\nC -1 ; WX 60" -"0 ; N minus ; B 131 261 588 302 ;\nC -1 ; WX 600 ; N multiply ; B 143 100 577 46" -"4 ;\nC -1 ; WX 600 ; N divide ; B 131 25 588 540 ;\nC -1 ; WX 600 ; N Aring ; B " -"13 0 596 811 ;\nC -1 ; WX 600 ; N trademark ; B 90 243 710 563 ;\nC -1 ; WX 600 " -"; N rcommaaccent ; B 88 -237 619 427 ;\nC -1 ; WX 600 ; N lacute ; B 96 0 572 78" -"9 ;\nC -1 ; WX 600 ; N omacron ; B 111 -16 577 576 ;\nC -1 ; WX 600 ; N Atilde ;" -" B 13 0 596 755 ;\nC -1 ; WX 600 ; N icircumflex ; B 95 0 536 639 ;\nC -1 ; WX 6" -"00 ; N igrave ; B 96 0 513 639 ;\nC -1 ; WX 600 ; N ncommaaccent ; B 57 -237 546" -" 431 ;\nC -1 ; WX 600 ; N lcommaaccent ; B 96 -237 513 604 ;\nC -1 ; WX 600 ; N " -"plusminus ; B 76 0 597 529 ;\nC -1 ; WX 600 ; N onehalf ; B 82 0 627 612 ;\nC -1" -" ; WX 600 ; N onequarter ; B 74 0 619 612 ;\nC -1 ; WX 600 ; N threequarters ; B" -" 70 0 619 612 ;\nC -1 ; WX 600 ; N iacute ; B 96 0 535 639 ;\nC -1 ; WX 600 ; N " -"Abreve ; B 13 0 596 777 ;\nC -1 ; WX 600 ; N kcommaaccent ; B 67 -237 578 604 ;\n" -"C -1 ; WX 600 ; N Omacron ; B 102 -16 616 723 ;\nC -1 ; WX 600 ; N imacron ; B 9" -"6 0 564 576 ;\nC -1 ; WX 600 ; N emacron ; B 104 -16 570 576 ;\nC -1 ; WX 600 ; " -"N amacron ; B 93 -16 564 576 ;\nC -1 ; WX 600 ; N tcommaaccent ; B 127 -237 518 " -"563 ;\nC -1 ; WX 600 ; N ydieresis ; B 22 -186 634 611 ;\nC -1 ; WX 600 ; N zdot" -"accent ; B 115 0 563 611 ;\nC -1 ; WX 600 ; N zcaron ; B 115 0 576 639 ;\nC -1 ;" -" WX 600 ; N zacute ; B 115 0 577 639 ;\nC -1 ; WX 600 ; N yacute ; B 22 -186 634" -" 639 ;\nC -1 ; WX 600 ; N uhungarumlaut ; B 127 -16 576 633 ;\nC -1 ; WX 600 ; N" -" eth ; B 111 -17 582 620 ;\nC -1 ; WX 600 ; N uring ; B 127 -16 569 661 ;\nC -1 " -"; WX 600 ; N Ocircumflex ; B 102 -16 616 789 ;\nC -1 ; WX 600 ; N commaaccent ; " -"B 159 -237 322 -60 ;\nC -1 ; WX 600 ; N copyright ; B 57 -15 663 578 ;\nC -1 ; W" -"X 600 ; N registered ; B 57 -15 663 578 ;\nC -1 ; WX 600 ; N Acircumflex ; B 13 " -"0 596 789 ;\nC -1 ; WX 600 ; N idieresis ; B 96 0 568 611 ;\nC -1 ; WX 600 ; N l" -"ozenge ; B 149 -11 571 575 ;\nC -1 ; WX 600 ; N Delta ; B 43 0 557 563 ;\nC -1 ;" -" WX 600 ; N notequal ; B 96 94 625 464 ;\nC -1 ; WX 600 ; N radical ; B 88 0 773" -" 699 ;\nC -1 ; WX 600 ; N Agrave ; B 13 0 596 789 ;\nC -1 ; WX 600 ; N Aacute ; " -"B 13 0 596 789 ;\nC -1 ; WX 600 ; N lessequal ; B 56 0 635 535 ;\nC -1 ; WX 600 " -"; N greaterequal ; B 71 0 600 535 ;\nC -1 ; WX 600 ; N logicalnot ; B 160 168 62" -"1 438 ;\nC -1 ; WX 600 ; N summation ; B 90 -127 616 563 ;\nC -1 ; WX 600 ; N pa" -"rtialdiff ; B 111 -16 580 581 ;\nC -1 ; WX 600 ; N Ncommaaccent ; B 46 -237 678 " -"563 ;\nC -1 ; WX 600 ; N dcroat ; B 102 -16 690 604 ;\nC -1 ; WX 600 ; N brokenb" -"ar ; B 257 -124 444 604 ;\nC -1 ; WX 600 ; N Lcommaaccent ; B 67 -237 585 563 ;\n" -"C -1 ; WX 600 ; N Adieresis ; B 13 0 596 762 ;\nC -1 ; WX 600 ; N mu ; B 86 -200" -" 569 417 ;\nC -1 ; WX 600 ; N .notdef ; B 319 0 319 0 ;\nEndCharMetrics\nStartKe" -"rnData\nStartKernPairs 998\nKPX A C -41\nKPX A Ccedilla -39\nKPX A G -36\nKPX A " -"O -35\nKPX A Odieresis -35\nKPX A Q -37\nKPX A T -34\nKPX A U -41\nKPX A Uacute " -"-41\nKPX A Ucircumflex -41\nKPX A Udieresis -41\nKPX A Ugrave -41\nKPX A V -78\n" -"KPX A W -20\nKPX A Y -35\nKPX A a 1\nKPX A b 40\nKPX A c -26\nKPX A ccedilla -23" -"\nKPX A comma -47\nKPX A d -17\nKPX A e -21\nKPX A g -27\nKPX A guillemotleft -5" -"7\nKPX A guilsinglleft -57\nKPX A hyphen -35\nKPX A o -22\nKPX A period -70\nKPX" -" A q -27\nKPX A quotedblright -82\nKPX A quoteright -102\nKPX A t -33\nKPX A u -" -"23\nKPX A v -59\nKPX A w -27\nKPX A y -63\nKPX Aacute C -41\nKPX Aacute G -36\nK" -"PX Aacute O -35\nKPX Aacute Q -37\nKPX Aacute T -34\nKPX Aacute U -41\nKPX Aacut" -"e V -78\nKPX Aacute W -20\nKPX Aacute Y -35\nKPX Aacute a 1\nKPX Aacute b 40\nKP" -"X Aacute c -26\nKPX Aacute comma -47\nKPX Aacute d -17\nKPX Aacute e -21\nKPX Aa" -"cute g -27\nKPX Aacute guillemotleft -57\nKPX Aacute guilsinglleft -57\nKPX Aacu" -"te hyphen -35\nKPX Aacute o -22\nKPX Aacute period -70\nKPX Aacute q -27\nKPX Aa" -"cute quoteright -102\nKPX Aacute t -33\nKPX Aacute u -23\nKPX Aacute v -59\nKPX " -"Aacute w -27\nKPX Aacute y -63\nKPX Acircumflex C -41\nKPX Acircumflex G -36\nKP" -"X Acircumflex O -35\nKPX Acircumflex Q -37\nKPX Acircumflex T -34\nKPX Acircumfl" -"ex U -41\nKPX Acircumflex V -78\nKPX Acircumflex W -20\nKPX Acircumflex Y -35\nK" -"PX Acircumflex comma -47\nKPX Acircumflex period -70\nKPX Adieresis C -41\nKPX A" -"dieresis G -36\nKPX Adieresis O -35\nKPX Adieresis Q -37\nKPX Adieresis T -34\nK" -"PX Adieresis U -41\nKPX Adieresis V -78\nKPX Adieresis W -20\nKPX Adieresis Y -3" -"5\nKPX Adieresis a 1\nKPX Adieresis b 40\nKPX Adieresis c -26\nKPX Adieresis com" -"ma -47\nKPX Adieresis d -17\nKPX Adieresis g -27\nKPX Adieresis guillemotleft -5" -"7\nKPX Adieresis guilsinglleft -57\nKPX Adieresis hyphen -35\nKPX Adieresis o -2" -"2\nKPX Adieresis period -70\nKPX Adieresis q -27\nKPX Adieresis quotedblright -8" -"2\nKPX Adieresis quoteright -102\nKPX Adieresis t -33\nKPX Adieresis u -23\nKPX " -"Adieresis v -59\nKPX Adieresis w -27\nKPX Adieresis y -63\nKPX Agrave C -41\nKPX" -" Agrave G -36\nKPX Agrave O -35\nKPX Agrave Q -37\nKPX Agrave T -34\nKPX Agrave " -"U -41\nKPX Agrave V -78\nKPX Agrave W -20\nKPX Agrave Y -35\nKPX Agrave comma -4" -"7\nKPX Agrave period -70\nKPX Aring C -41\nKPX Aring G -36\nKPX Aring O -35\nKPX" -" Aring Q -37\nKPX Aring T -34\nKPX Aring U -41\nKPX Aring V -78\nKPX Aring W -20" -"\nKPX Aring Y -35\nKPX Aring a 1\nKPX Aring b 40\nKPX Aring c -26\nKPX Aring com" -"ma -47\nKPX Aring d -17\nKPX Aring e -21\nKPX Aring g -27\nKPX Aring guillemotle" -"ft -57\nKPX Aring guilsinglleft -57\nKPX Aring hyphen -35\nKPX Aring o -22\nKPX " -"Aring period -70\nKPX Aring q -27\nKPX Aring quotedblright -82\nKPX Aring quoter" -"ight -102\nKPX Aring t -33\nKPX Aring u -23\nKPX Aring v -59\nKPX Aring w -27\nK" -"PX Aring y -63\nKPX Atilde C -41\nKPX Atilde G -36\nKPX Atilde O -35\nKPX Atilde" -" Q -37\nKPX Atilde T -34\nKPX Atilde U -41\nKPX Atilde V -78\nKPX Atilde W -20\n" -"KPX Atilde Y -35\nKPX Atilde comma -47\nKPX Atilde period -70\nKPX B A -15\nKPX " -"B AE -16\nKPX B Aacute -15\nKPX B Acircumflex -15\nKPX B Adieresis -15\nKPX B Ar" -"ing -15\nKPX B Atilde -15\nKPX B O -15\nKPX B OE 5\nKPX B Oacute -15\nKPX B Ocir" -"cumflex -15\nKPX B Odieresis -15\nKPX B Ograve -15\nKPX B Oslash -14\nKPX B V -3" -"7\nKPX B W -15\nKPX B Y -58\nKPX C A -14\nKPX C AE -14\nKPX C Aacute -14\nKPX C " -"Adieresis -14\nKPX C Aring -14\nKPX C H -34\nKPX C K -19\nKPX C O -24\nKPX C Oac" -"ute -24\nKPX C Odieresis -24\nKPX Ccedilla A -8\nKPX D A -47\nKPX D Aacute -47\n" -"KPX D Acircumflex -47\nKPX D Adieresis -47\nKPX D Agrave -47\nKPX D Aring -47\nK" -"PX D Atilde -47\nKPX D J -38\nKPX D T -47\nKPX D V -50\nKPX D W -20\nKPX D X -60" -"\nKPX D Y -71\nKPX F A -45\nKPX F Aacute -45\nKPX F Acircumflex -45\nKPX F Adier" -"esis -45\nKPX F Agrave -45\nKPX F Aring -45\nKPX F Atilde -45\nKPX F J -100\nKPX" -" F O -34\nKPX F Odieresis -34\nKPX F a -52\nKPX F aacute -52\nKPX F adieresis -4" -"9\nKPX F ae -25\nKPX F aring -52\nKPX F comma -172\nKPX F e -61\nKPX F eacute -6" -"1\nKPX F hyphen -72\nKPX F i -51\nKPX F j -59\nKPX F o -68\nKPX F oacute -68\nKP" -"X F odieresis -54\nKPX F oe -26\nKPX F oslash -68\nKPX F period -196\nKPX F r -3" -"7\nKPX F u -6\nKPX G A 0\nKPX G AE 0\nKPX G Aacute 0\nKPX G Acircumflex 0\nKPX G" -" Adieresis 0\nKPX G Agrave 0\nKPX G Aring 0\nKPX G Atilde 0\nKPX G T -31\nKPX G " -"V -1\nKPX G W -4\nKPX G Y -22\nKPX J A -14\nKPX J AE -23\nKPX J Adieresis -14\nK" -"PX J Aring -14\nKPX K C -50\nKPX K G -46\nKPX K O -45\nKPX K OE -28\nKPX K Oacut" -"e -45\nKPX K Odieresis -45\nKPX K S -16\nKPX K T -18\nKPX K a -8\nKPX K adieresi" -"s -8\nKPX K ae 19\nKPX K aring -8\nKPX K e -30\nKPX K hyphen -66\nKPX K o -32\nK" -"PX K oacute -32\nKPX K odieresis -32\nKPX K u -33\nKPX K udieresis -33\nKPX K y " -"-72\nKPX L A 9\nKPX L AE 9\nKPX L Aacute 9\nKPX L Adieresis 9\nKPX L Aring 9\nKP" -"X L C -19\nKPX L Ccedilla -19\nKPX L G -18\nKPX L O -15\nKPX L Oacute -15\nKPX L" -" Ocircumflex -15\nKPX L Odieresis -15\nKPX L Ograve -15\nKPX L Otilde -15\nKPX L" -" S -31\nKPX L T -59\nKPX L U -36\nKPX L Udieresis -36\nKPX L V -71\nKPX L W -31\n" -"KPX L Y -60\nKPX L hyphen -1\nKPX L quotedblright -76\nKPX L quoteright -84\nKPX" -" L u -20\nKPX L udieresis -20\nKPX L y -50\nKPX N A -10\nKPX N AE -10\nKPX N Aac" -"ute -10\nKPX N Adieresis -10\nKPX N Aring -10\nKPX N C -18\nKPX N Ccedilla -18\n" -"KPX N G -16\nKPX N O -14\nKPX N Oacute -14\nKPX N Odieresis -14\nKPX N a -23\nKP" -"X N aacute -23\nKPX N adieresis -23\nKPX N ae 7\nKPX N aring -23\nKPX N comma -6" -"4\nKPX N e -10\nKPX N eacute -10\nKPX N o -14\nKPX N oacute -14\nKPX N odieresis" -" -14\nKPX N oslash -11\nKPX N period -87\nKPX N u -14\nKPX N udieresis -14\nKPX " -"O A -33\nKPX O AE -30\nKPX O Aacute -33\nKPX O Adieresis -33\nKPX O Aring -33\nK" -"PX O T -37\nKPX O V -40\nKPX O W -8\nKPX O X -47\nKPX O Y -61\nKPX Oacute A -33\n" -"KPX Oacute T -37\nKPX Oacute V -40\nKPX Oacute W -8\nKPX Oacute Y -61\nKPX Ocirc" -"umflex T -37\nKPX Ocircumflex V -40\nKPX Ocircumflex Y -61\nKPX Odieresis A -33\n" -"KPX Odieresis T -37\nKPX Odieresis V -40\nKPX Odieresis W -8\nKPX Odieresis X -4" -"7\nKPX Odieresis Y -61\nKPX Ograve T -37\nKPX Ograve V -40\nKPX Ograve Y -61\nKP" -"X Oslash A -31\nKPX Otilde T -36\nKPX Otilde V -39\nKPX Otilde Y -60\nKPX P A -8" -"7\nKPX P AE -81\nKPX P Aacute -87\nKPX P Adieresis -87\nKPX P Aring -87\nKPX P J" -" -90\nKPX P a -57\nKPX P aacute -57\nKPX P adieresis -57\nKPX P ae -29\nKPX P ar" -"ing -57\nKPX P comma -161\nKPX P e -47\nKPX P eacute -47\nKPX P hyphen -52\nKPX " -"P o -53\nKPX P oacute -53\nKPX P odieresis -53\nKPX P oe -18\nKPX P oslash -53\n" -"KPX P period -185\nKPX R C -32\nKPX R Ccedilla -33\nKPX R G -31\nKPX R O -29\nKP" -"X R OE -8\nKPX R Oacute -29\nKPX R Odieresis -29\nKPX R T -35\nKPX R U -36\nKPX " -"R Udieresis -36\nKPX R V -42\nKPX R W -21\nKPX R Y -36\nKPX R a 0\nKPX R aacute " -"0\nKPX R adieresis 0\nKPX R ae 27\nKPX R aring 0\nKPX R e -22\nKPX R eacute -22\n" -"KPX R hyphen -53\nKPX R o -23\nKPX R oacute -23\nKPX R odieresis -23\nKPX R oe 1" -"5\nKPX R u -16\nKPX R uacute -16\nKPX R udieresis -16\nKPX R y -20\nKPX S A -28\n" -"KPX S AE -28\nKPX S Aacute -28\nKPX S Adieresis -28\nKPX S Aring -28\nKPX S T -4" -"8\nKPX S V -18\nKPX S W -23\nKPX S Y -39\nKPX S t -25\nKPX T A -34\nKPX T AE -35" -"\nKPX T Aacute -34\nKPX T Acircumflex -34\nKPX T Adieresis -34\nKPX T Agrave -34" -"\nKPX T Aring -34\nKPX T Atilde -34\nKPX T C -36\nKPX T G -35\nKPX T J -88\nKPX " -"T O -34\nKPX T OE -12\nKPX T Oacute -34\nKPX T Ocircumflex -34\nKPX T Odieresis " -"-34\nKPX T Ograve -34\nKPX T Oslash -34\nKPX T Otilde -34\nKPX T S -50\nKPX T V " -"4\nKPX T W -1\nKPX T Y -17\nKPX T a -68\nKPX T ae -38\nKPX T c -83\nKPX T colon " -"-145\nKPX T comma -116\nKPX T e -83\nKPX T g -76\nKPX T guillemotleft -129\nKPX " -"T guilsinglleft -129\nKPX T hyphen -99\nKPX T i -51\nKPX T j -59\nKPX T o -87\nK" -"PX T oslash -60\nKPX T period -145\nKPX T r -37\nKPX T s -70\nKPX T semicolon -1" -"19\nKPX T u -92\nKPX T v -98\nKPX T w -96\nKPX T y -108\nKPX U A -26\nKPX U AE -" -"35\nKPX U Aacute -26\nKPX U Acircumflex -26\nKPX U Adieresis -26\nKPX U Aring -2" -"6\nKPX U Atilde -26\nKPX U comma -80\nKPX U m 3\nKPX U n -22\nKPX U p -5\nKPX U " -"period -105\nKPX U r -47\nKPX Uacute A -26\nKPX Uacute comma -80\nKPX Uacute m 3" -"\nKPX Uacute n -22\nKPX Uacute p -5\nKPX Uacute period -105\nKPX Uacute r -47\nK" -"PX Ucircumflex A -26\nKPX Udieresis A -26\nKPX Udieresis b 17\nKPX Udieresis com" -"ma -80\nKPX Udieresis m 3\nKPX Udieresis n -22\nKPX Udieresis p -5\nKPX Udieresi" -"s period -105\nKPX Udieresis r -47\nKPX Ugrave A -26\nKPX V A -10\nKPX V AE -19\n" -"KPX V Aacute -10\nKPX V Acircumflex -10\nKPX V Adieresis -10\nKPX V Agrave -10\n" -"KPX V Aring -10\nKPX V Atilde -10\nKPX V C -39\nKPX V G -38\nKPX V O -37\nKPX V " -"Oacute -37\nKPX V Ocircumflex -37\nKPX V Odieresis -37\nKPX V Ograve -37\nKPX V " -"Oslash -38\nKPX V Otilde -38\nKPX V S -41\nKPX V T 4\nKPX V a -65\nKPX V ae -37\n" -"KPX V colon -130\nKPX V comma -134\nKPX V e -56\nKPX V g -57\nKPX V guillemotlef" -"t -83\nKPX V guilsinglleft -83\nKPX V hyphen -49\nKPX V i -65\nKPX V o -60\nKPX " -"V oslash -57\nKPX V period -158\nKPX V r -51\nKPX V semicolon -121\nKPX V u -20\n" -"KPX V y -24\nKPX W A -16\nKPX W AE -21\nKPX W Aacute -16\nKPX W Acircumflex -16\n" -"KPX W Adieresis -16\nKPX W Agrave -16\nKPX W Aring -16\nKPX W Atilde -16\nKPX W " -"C -14\nKPX W G -12\nKPX W O -10\nKPX W Oacute -10\nKPX W Ocircumflex -10\nKPX W " -"Odieresis -10\nKPX W Ograve -10\nKPX W Oslash -7\nKPX W Otilde -10\nKPX W S -29\n" -"KPX W T -2\nKPX W a -24\nKPX W ae 6\nKPX W colon -93\nKPX W comma -71\nKPX W e -" -"10\nKPX W g -11\nKPX W guillemotleft -38\nKPX W guilsinglleft -38\nKPX W hyphen " -"-7\nKPX W i -48\nKPX W o -14\nKPX W oslash -11\nKPX W period -95\nKPX W r -34\nK" -"PX W semicolon -74\nKPX W u -2\nKPX W y -6\nKPX X C -52\nKPX X O -48\nKPX X Odie" -"resis -48\nKPX X Q -48\nKPX X a -14\nKPX X e -36\nKPX X hyphen -81\nKPX X o -38\n" -"KPX X u -39\nKPX X y -57\nKPX Y A -31\nKPX Y AE -34\nKPX Y Aacute -31\nKPX Y Aci" -"rcumflex -31\nKPX Y Adieresis -31\nKPX Y Agrave -31\nKPX Y Aring -31\nKPX Y Atil" -"de -31\nKPX Y C -60\nKPX Y G -60\nKPX Y O -59\nKPX Y Oacute -59\nKPX Y Ocircumfl" -"ex -59\nKPX Y Odieresis -59\nKPX Y Ograve -59\nKPX Y Oslash -59\nKPX Y Otilde -5" -"9\nKPX Y S -62\nKPX Y T -17\nKPX Y a -67\nKPX Y ae -40\nKPX Y colon -145\nKPX Y " -"comma -116\nKPX Y e -81\nKPX Y g -84\nKPX Y guillemotleft -119\nKPX Y guilsingll" -"eft -119\nKPX Y hyphen -96\nKPX Y i -63\nKPX Y o -86\nKPX Y oslash -59\nKPX Y p " -"-39\nKPX Y period -144\nKPX Y semicolon -119\nKPX Y u -50\nKPX Y v -44\nKPX Z v " -"-54\nKPX Z y -64\nKPX a j -93\nKPX a quoteright -60\nKPX a v -33\nKPX a w -23\nK" -"PX a y -44\nKPX aacute v -33\nKPX aacute w -23\nKPX aacute y -44\nKPX adieresis " -"v -33\nKPX adieresis w -23\nKPX adieresis y -44\nKPX ae v 16\nKPX ae w 16\nKPX a" -"e y 5\nKPX agrave v -33\nKPX agrave w -23\nKPX agrave y -44\nKPX aring v -33\nKP" -"X aring w -23\nKPX aring y -44\nKPX b v -17\nKPX b w 0\nKPX b y -28\nKPX c h -6\n" -"KPX c k -12\nKPX comma one -148\nKPX comma quotedblright -123\nKPX comma quoteri" -"ght -142\nKPX e quoteright -43\nKPX e t -34\nKPX e v -28\nKPX e w -20\nKPX e x -" -"5\nKPX e y -39\nKPX eacute v -28\nKPX eacute w -20\nKPX eacute y -39\nKPX ecircu" -"mflex v -28\nKPX ecircumflex w -20\nKPX ecircumflex y -39\nKPX eight four -65\nK" -"PX eight one -85\nKPX eight seven -77\nKPX f a -44\nKPX f aacute -44\nKPX f adie" -"resis -26\nKPX f ae -17\nKPX f aring -44\nKPX f e -58\nKPX f eacute -58\nKPX f f" -" -46\nKPX f i -40\nKPX f j -63\nKPX f l -31\nKPX f o -65\nKPX f oacute -65\nKPX " -"f odieresis -31\nKPX f oe -23\nKPX f oslash -36\nKPX f quoteright -62\nKPX f s -" -"46\nKPX f t -10\nKPX five four -56\nKPX five one -90\nKPX five seven -78\nKPX fo" -"ur four -68\nKPX four one -73\nKPX four seven -99\nKPX g a -14\nKPX g adieresis " -"-14\nKPX g ae 13\nKPX g aring -14\nKPX g e -7\nKPX g eacute -7\nKPX g l -37\nKPX" -" g oacute -12\nKPX g odieresis -12\nKPX g r -4\nKPX guillemotright A -50\nKPX gu" -"illemotright AE -46\nKPX guillemotright Aacute -50\nKPX guillemotright Adieresis" -" -50\nKPX guillemotright Aring -50\nKPX guillemotright T -128\nKPX guillemotrigh" -"t V -80\nKPX guillemotright W -37\nKPX guillemotright Y -119\nKPX guilsinglright" -" A -50\nKPX guilsinglright AE -46\nKPX guilsinglright Aacute -50\nKPX guilsinglr" -"ight Adieresis -50\nKPX guilsinglright Aring -50\nKPX guilsinglright T -128\nKPX" -" guilsinglright V -80\nKPX guilsinglright W -37\nKPX guilsinglright Y -119\nKPX " -"h quoteright -52\nKPX h y -37\nKPX hyphen A -29\nKPX hyphen AE -23\nKPX hyphen A" -"acute -29\nKPX hyphen Adieresis -29\nKPX hyphen Aring -29\nKPX hyphen T -98\nKPX" -" hyphen V -44\nKPX hyphen W -4\nKPX hyphen Y -95\nKPX i T -64\nKPX i j -146\nKPX" -" k a -12\nKPX k aacute -12\nKPX k adieresis -12\nKPX k ae 15\nKPX k aring -12\nK" -"PX k comma -60\nKPX k e -34\nKPX k eacute -34\nKPX k g -43\nKPX k hyphen -104\nK" -"PX k o -35\nKPX k oacute -35\nKPX k odieresis -35\nKPX k period -89\nKPX k s -14" -"\nKPX k u -7\nKPX k udieresis -7\nKPX l v -86\nKPX l y -96\nKPX m p 19\nKPX m v " -"7\nKPX m w 13\nKPX m y -3\nKPX n T -48\nKPX n p -8\nKPX n quoteright -50\nKPX n " -"v -25\nKPX n w -14\nKPX n y -36\nKPX nine four -58\nKPX nine one -84\nKPX nine s" -"even -75\nKPX o T -89\nKPX o quoteright -41\nKPX o t -24\nKPX o v -25\nKPX o w -" -"7\nKPX o x -28\nKPX o y -36\nKPX oacute v -25\nKPX oacute w -7\nKPX oacute y -36" -"\nKPX ocircumflex t -24\nKPX odieresis t -24\nKPX odieresis v -25\nKPX odieresis" -" w -7\nKPX odieresis x -28\nKPX odieresis y -36\nKPX ograve v -25\nKPX ograve w " -"-7\nKPX ograve y -36\nKPX one comma -99\nKPX one eight -94\nKPX one five -76\nKP" -"X one four -127\nKPX one nine -81\nKPX one one -69\nKPX one period -128\nKPX one" -" seven -147\nKPX one six -119\nKPX one three -69\nKPX one two -54\nKPX one zero " -"-102\nKPX p t -20\nKPX p y -25\nKPX period one -125\nKPX period quotedblright -1" -"14\nKPX period quoteright -133\nKPX q c -4\nKPX q u 37\nKPX quotedblbase A -6\nK" -"PX quotedblbase AE -6\nKPX quotedblbase T -82\nKPX quotedblbase V -85\nKPX quote" -"dblbase W -24\nKPX quotedblbase Y -83\nKPX quotedblleft A -66\nKPX quotedblleft " -"AE -57\nKPX quotedblleft Aacute -66\nKPX quotedblleft Adieresis -66\nKPX quotedb" -"lleft Aring -66\nKPX quotedblleft T -46\nKPX quotedblleft V -18\nKPX quotedbllef" -"t W -8\nKPX quotedblleft Y -46\nKPX quotedblright A -67\nKPX quotedblright AE -7" -"6\nKPX quotedblright Aacute -66\nKPX quotedblright Adieresis -66\nKPX quotedblri" -"ght Aring -66\nKPX quotedblright T -53\nKPX quotedblright V -22\nKPX quotedblrig" -"ht W -26\nKPX quotedblright Y -43\nKPX quoteleft A -87\nKPX quoteleft AE -78\nKP" -"X quoteleft Aacute -87\nKPX quoteleft Adieresis -87\nKPX quoteleft Aring -87\nKP" -"X quoteleft T -67\nKPX quoteleft V -39\nKPX quoteleft W -29\nKPX quoteleft Y -67" -"\nKPX quoteright A -145\nKPX quoteright AE -154\nKPX quoteright Aacute -145\nKPX" -" quoteright Adieresis -145\nKPX quoteright Aring -145\nKPX quoteright comma -201" -"\nKPX quoteright d -129\nKPX quoteright o -135\nKPX quoteright period -224\nKPX " -"quoteright r -150\nKPX quoteright s -144\nKPX quoteright t -118\nKPX quoteright " -"v -112\nKPX quoteright w -108\nKPX quoteright y -122\nKPX r a -26\nKPX r aacute " -"-26\nKPX r acircumflex -26\nKPX r adieresis -26\nKPX r ae 1\nKPX r agrave -26\nK" -"PX r aring -26\nKPX r c -26\nKPX r ccedilla -34\nKPX r colon -86\nKPX r comma -1" -"04\nKPX r d -18\nKPX r e -17\nKPX r eacute -17\nKPX r ecircumflex -17\nKPX r egr" -"ave -17\nKPX r f -24\nKPX r g -15\nKPX r h -24\nKPX r hyphen -125\nKPX r i -34\n" -"KPX r j -42\nKPX r k -34\nKPX r l -51\nKPX r m 27\nKPX r n 0\nKPX r o -24\nKPX r" -" oacute -24\nKPX r ocircumflex -24\nKPX r odieresis -24\nKPX r oe 13\nKPX r ogra" -"ve -24\nKPX r oslash -24\nKPX r p 21\nKPX r period -133\nKPX r q -16\nKPX r quot" -"eright -44\nKPX r r -20\nKPX r s -29\nKPX r semicolon -75\nKPX r t 11\nKPX r u 1" -"1\nKPX r v 17\nKPX r w 17\nKPX r x -4\nKPX r y 6\nKPX r z -23\nKPX s quoteright " -"-51\nKPX s t -17\nKPX seven colon -154\nKPX seven comma -146\nKPX seven eight -8" -"6\nKPX seven five -91\nKPX seven four -116\nKPX seven one -74\nKPX seven period " -"-169\nKPX seven seven -69\nKPX seven six -104\nKPX seven three -79\nKPX seven tw" -"o -76\nKPX six four -52\nKPX six one -68\nKPX six seven -55\nKPX t S -40\nKPX t " -"a -25\nKPX t aacute -25\nKPX t adieresis -25\nKPX t ae 2\nKPX t aring -25\nKPX t" -" colon -107\nKPX t e -43\nKPX t eacute -43\nKPX t h -8\nKPX t o -45\nKPX t oacut" -"e -45\nKPX t odieresis -45\nKPX t quoteright -100\nKPX t semicolon -86\nKPX thre" -"e four -58\nKPX three one -82\nKPX three seven -75\nKPX two four -97\nKPX two on" -"e -73\nKPX two seven -79\nKPX u quoteright -43\nKPX v a -9\nKPX v aacute -9\nKPX" -" v acircumflex -9\nKPX v adieresis -9\nKPX v ae 17\nKPX v agrave -9\nKPX v aring" -" -9\nKPX v atilde -9\nKPX v c -22\nKPX v colon -75\nKPX v comma -118\nKPX v e -1" -"7\nKPX v eacute -17\nKPX v ecircumflex -17\nKPX v egrave -17\nKPX v g -14\nKPX v" -" hyphen -30\nKPX v l -87\nKPX v o -23\nKPX v oacute -23\nKPX v odieresis -23\nKP" -"X v ograve -23\nKPX v oslash -23\nKPX v period -143\nKPX v s -22\nKPX v semicolo" -"n -66\nKPX w a -9\nKPX w aacute -9\nKPX w acircumflex -9\nKPX w adieresis -9\nKP" -"X w ae 17\nKPX w agrave -9\nKPX w aring -9\nKPX w atilde -9\nKPX w c -12\nKPX w " -"colon -75\nKPX w comma -75\nKPX w e -4\nKPX w eacute -4\nKPX w ecircumflex -4\nK" -"PX w egrave -4\nKPX w g -6\nKPX w hyphen -4\nKPX w l -53\nKPX w o -9\nKPX w oacu" -"te -9\nKPX w odieresis -9\nKPX w ograve -9\nKPX w oslash -6\nKPX w period -99\nK" -"PX w s -22\nKPX w semicolon -66\nKPX x a -8\nKPX x c -35\nKPX x e -30\nKPX x eac" -"ute -30\nKPX x o -31\nKPX x q -33\nKPX y a -20\nKPX y aacute -20\nKPX y acircumf" -"lex -20\nKPX y adieresis -20\nKPX y ae 6\nKPX y agrave -20\nKPX y aring -20\nKPX" -" y atilde -20\nKPX y c -33\nKPX y colon -86\nKPX y comma -122\nKPX y e -28\nKPX " -"y eacute -28\nKPX y ecircumflex -28\nKPX y egrave -28\nKPX y g -25\nKPX y hyphen" -" -29\nKPX y l -98\nKPX y o -34\nKPX y oacute -34\nKPX y odieresis -34\nKPX y ogr" -"ave -34\nKPX y oslash -34\nKPX y period -148\nKPX y s -33\nKPX y semicolon -77\n" -"KPX zero four -64\nKPX zero one -91\nKPX zero seven -82\nEndKernPairs\nEndKernDa" -"ta\nEndFontMetrics\n" -; -int n022023l_pfb_len = 44404; -char* n022023l_pfb = -"\x80\x1m\x6\x0\x0%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05\n%%CreationDate: W" -"ed Dec 22 1999\n% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Developme" -"nt\n% (URW)++,Copyright 1999 by (URW)++ Design & Development\n% See the file COP" -"YING (GNU General Public License) for license conditions.\n% As a special except" -"ion, permission is granted to include this font\n% program in a Postscript or PD" -"F file that consists of a document that\n% contains text to be displayed or prin" -"ted using this font, regardless\n% of the conditions or license applying to the " -"document itself.\n12 dict begin\n/FontInfo 10 dict dup begin\n/version (1.05) re" -"adonly def\n/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See" -" the file COPYING (GNU General Public License) for license conditions. As a spec" -"ial exception, permission is granted to include this font program in a Postscrip" -"t or PDF file that consists of a document that contains text to be displayed or " -"printed using this font, regardless of the conditions or license applying to the" -" document itself.) readonly def\n/Copyright (Copyright (URW)++,Copyright 1999 by" -" (URW)++ Design & Development) readonly def\n/FullName (Nimbus Mono L Regular Ob" -"lique) readonly def\n/FamilyName (Nimbus Mono L) readonly def\n/Weight (Regular)" -" readonly def\n/ItalicAngle -12.0 def\n/isFixedPitch false def\n/UnderlinePositi" -"on -100 def\n/UnderlineThickness 50 def\nend readonly def\n/FontName /NimbusMonL" -"-ReguObli def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-61 -237 774 811} read" -"only def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly de" -"f\n/Encoding StandardEncoding def\n/UniqueID 5020947 def\ncurrentdict end\ncurre" -"ntfile eexec\r\x80\x2\xdf\xa4\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9\xdci\x9a" -"\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K\x89i\x9c" -"t\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88\xed*\xc4" -"\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3\xf3\xe5" -"Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2P2Q\x9d" -"\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81\xd8\xd7" -"\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x12>j \x85\x11\xc6" -"\xd0\xc2U\xb9\xa5\xbb/\xde\xdbM9\x9cl\xf1\x94\xff\xac#h\x83v|\xfh\xf4\xef\x84\xee" -"ikg}\xe7\x4\xec;\x9s\x84\xf2\xe6s\xa1\xf5\x16\x92\xb7\xb2`i78\xc2\x11\x9f}\x90\xff" -"\xdb!\xebq_\xd5\xb8\x13O\xc8}\xba\x32\xe\xe5L,\xecjMk\xb3PU^\xaf\xf2\xecO\x84\x36" -"\\\xcc\x8\x2\xdb\xb3\xbd\xe?\r\x9f\x85\x86G\xdd\x63w%\xc2\xca\xf9U\x7f\xdf\x84*\r" -"\xa6\xa0\xca\xf\x1b\x44.\xf8\xeel\xbf+\x3\x85\x84h\xa4\x66\xacX\x83\xcb\xbd\x38\x15" -"\xb2\x83\x34;9 X\x3\xc0,\x91}\x6\x82\\\x9\xe2\xbb\x14`\x9f\xa3,(\xd7 \xc0\xe1JK\x12" -"\xd4\xf1%\xff\x62\x81\xff\x32M\xa3:V\xfcI\x98z\xc7\xd3\xaa e@\xf8\x12rs\xff\xe9\xa3" -"\xda\xcf\xfe+\x1c&\x9d=\xb9\xa8\x11W\x8a\xc7\xd5\x32\xc2\xef\xc1\x83v\xf4s\xfb\xb2" -"\xb3.\xf6\x42\xb1\x9c\xde\xc1\xd6\xde\x83\x64\x37#\xe3\xc6\xdf\xc8\x7f\x97\xa7\x0" -"{`\x81\x89K\xbc\x45\xc9U\xb7\x0\x1e\xb3\x62\x11\xb2j\xd7\xa3\xd0tY\xcf\xb3?\x9cT" -"\xa4\n\x36\xc\xb8\x2\xfd ,\x8e\x93\xd4\xdb\x88\x8b\x32\\\xe2\x46\xd0-\x12 \xab\xf5" -"\\\xe6\x46\xdf\xb4_\x7\xcb\x84\x84\x6\xe4p6/\x80\xceL\x2\xd9\x8d\xd8\x45\x18\x98" -"ws'D\xcc\x16\xc7\xf5\x66\x9fw\xef\x9n\xa5Z\xff\x98\xaa\x10>\xea\xef\xb9qs\x1e\xbf" -"7\x82\xe6\xabr]N\x9e\x35\xb2\x96\x86\x89\xe8\x0|\x3\x8c\xf2[j\xe6\x94Q\xa4s\x1ey" -"\xac\"\xbd&\x8fV\x94*#>R\xd7\x18s\xe8>\x0\xa1\x87N\x4\xd3\xb2.r\xfb-\x6q\xaf\x81" -"\xc6\x98S\xc3\x89\xb5\x1fJ%ss\xae\xbfM\xe2\xda\x1eM\xa5\xe2\xca\x88\x94\x1f\x81\xea" -"\xe0\xe3-\x98 d\xc8\xaf\xddz\x9a`\rV\xd7\x36\x5\xb9\x46\xbb\xf7\xabV\x87\xc3\xe1\xe6" -"y.@\xf9*zFm\xe3R)@dSu\x5\xee\xf3\xf9\xc3\x8\xc9\xeb\x94Pm\xb0,\xfa\xe2\x89\xf1\x0" -"\x5\xa6\xe4--\xce\x43s\x1az\xe3hVK)\x83\x3\x8d\xadi\x87\xf6pb\x19\x90\x18\x39[\xc0" -"\xfc\xaf(z+\x4\xcq\xf7\x32_\xa1\xe9\xa9\x80\x89y\xb2\xfe\xf1\x90\x96\xb9\x8b\x8a" -"\nr\x8e\xb9\x8f+\xa3\xd3;I\xe3\xc2\xb\xe9\x92\x82,z\x1b\xcc\xa5\xb4\xe4\xd1\x9\x9d" -"Em\x8d}\x83\xc5~\xcb\xa0\xff!B\x80$\xf7W*\x14p1|\xb8\xcb\xc8g\x9a\x97N\x13\xd8\x8c" -"h\x13\x38\xc6\x8c\x9a\xc9U\x7f\x97xON\x1c\x8c.a\xf2`#\xac\xf4\x62\x32\xcb\xbd\xf3" -"\xc0\xbc\xc5X;\x93_\xe9\xfa\x9\xa5\x62\x12\x9a\x89'\xaes\x98\x8d\xb0\xf7\xe7\x33" -"\xc6V\x1c\xa7\xc9qm\xca\x9b\x88 \x8aqQf\xf2\xfa\xe6\xd5\xef\xf2\x89\xa9\xb2\xed\xce" -"\x81\x34\x3\xa4\x16\xf2\x43\xf1\xb5~\xed\xe7\xd8\x1e\x10\xc2\xda@e\xa3\x8+\xc9*8" -"\xb2\x45sh\xee\xc9\xc3\xc1r\x96\xcb\x9\x81\x9e\x9e\x64-se\xf9\xa6\xef\x43\xf\xc7" -"\xdd\x61\x1e\xa5\xfd\xbd\xed\xfarcJ\xb5\x99\xeb\x66j]\xc1x\xb0\xa0\xbd\x1f\xab\x4" -"'\x92\x11^\xf3\xb6\",\x12\x41\xdc\xe3l\xb3\x8bs\x8fh\xb1\xb3\xcbH\x9f\xed\x9eS1U" -"S\xf3\xc5\xc3\xbb\xce@E\x1eG\xb7\xeaS\xfd=:\xbal\xe0\xad\"]\xae\xe7\x34\xbd\xfa;" -"\xf1\xd8\x1c\x1b\x42\xc6\xd8V\xa0]\x9$\xe0?v'\xc5\xeb$\xd7\xfb\xea;\xd8W\x16 \x7f" -"\x96\x1bV\x80=\xbe\x4n\x81\xed_\xdc\x37\x8f\x9c\xa5,\x14\xfd\x85\x44\xca|S\x92\x1" -"\xbe\xe0\x64\x87\xeb\xdc\x30\xff;(\xe8&N\xc7\xfd]\xa7\xe0\x80\x65\xb0\xa9\x14sD\xce" -"(\xdaQ\x82\x33Xu\xe9\xf8\xb2\x34zD\xe3=\xfa\xa1g#*\\>i\xe8\xc5\xb5\x8b|r\x16Sx'\xc9" -"6\xf5t\x1b\x87\xfchu>\xb0\xd4\xa4\x66\x96\x1d\x0P\xdbY\xdf\x31\x95\xbd\x33y\xf5\x64" -"\x7f\x8c\xfe\xd3]\xa9R\xd7\xcf-\xed\x45\xeb\x44-\xbf\xe9\x92q\x1d\"\xeb\"\x8b\xdd" -"\xf3k\x8d}\xba'\x6-`\xd2'\x1e\xa8\xe8\x41/B\x90\xb5\x8f[\xe2o\xf0o\x5Y\x87/\x9d\xe4" -"\xde\xaa\xba\x1^\xabI\x4\xba\x1fP\x9fmQ|n\x89s\x12\xdd\xd5q\xd7i\xbcGO\xd3x\xaf\x43" -"`\xe8\xb1\xf1\x3\xaau\xf4\x87!\xb9\xe0\xbaX\x93\x19\xe1]t\xac\xb\x3\xd7\x30\xc3\xef" -"p\x8c|PG\x87H?\x13N\xa6)p\x97\xb4m&\x80\xff\x8a\xa5\xbz%Uc\xc8\x8dYK\x91/UtVJ\x13" -"qF6ty>H4\xaf\x11\xd1Ly\x91\xe7\xfd\xb3\xa6\xab\xf8R\x9e\x1aO\x10\xca\xe7\x9c`\xd3" -"t)W\x90\x93\xdb\xd0\x41\xec\xaf\x3\x82M\xf9\xc0\x7\xe9oEYZRK'\xef\x87t\xa8:\xee\xbd" -":q4\xab\x44\x35\xc8\x9\x44\xde\xff\\\x1c\xba\x92\x1b\n\x41\xb9\x65\x19hX\x1d\xa4" -"\x83K<\xemM\xe1<\x1ey/\xce\xed&\xa7*\xdcM\x9e\x39\x3\x66\x1d\x88\x3\xdd\xb5\x8e\xb2" -"\xb9)\xce\x31\xfc\x9fP\xa6\x94\x11k\x0\xac\x9f>\xefS\xff\xdb\x1a\xca\x33\x94\xbf" -"\x11\x16\x10\x38\xf3\x99\x17\xb0\"\x39Lu\xa0\xd4g\xd6K\x89\xa4NU\x5\xde\xd7\xd9\xc6" -"\xb8\xbak\xa0\x98\xf1@\xc9\xc0\xe\x9 \xe\xb4\x82\x83V\xa2\xd6\xbe\x9e\xc1\xd5RK\x9" -"\xc0m\x9co\xcb^(\x8\x5\n\x33\x9b^_\xd4\xddl 5\xa4\x8f\xe9gE \x90\x1e\xdc\xad\x10" -"\x7fg\xac\x8c\x8eP\x8e`\x3\x1\x19x\xd7~\xd2%\xf3\x61\xbc\xf\x86\xa9\x8b\x61 \xee" -"\xaf\xb7?sw\xdb\x1er\x13\xe0-\x12\xc3\x30\xf5I%\x11\xb4\xdd\xe0\x85X\xd7][\x8a\xa2" -"\xd5j1\x11\xdc\xcd%~\xe9n4F\xef\x1cv\xf0\x0\xc8\x91lL\xe2\x61\x42^\xd9\xd1[X\xce" -"\xd1(\xda\xa6\xc1\x30\x4\x66\xe7\xb1R\xbc\xfb^o\xaa\xb2Q\x9b\x8a\x98\xf2k)\xf9\x81" -"3\xaf\x88j\n\xa7\xe5\x86\xa0\x90\xbd\xa1\xdc\x61 \xdb\xb5\x64\x8\x85\xc6\x9\xa8\xbd" -"\xad\xee\xfe]\xe0\xda[u\xa8\xa2\x9e\x92Q^\x86\xe7\xe6k\xb2\x95\x81\xe5\xaf\xf8\xcb" -"eQ\xd8\xd1\x10=\xf6\rU\x8ey\x87\xe6\xf5\x61&\xa1=\xb2\xc9\xa0H\x86\xc6U\x6Nh\xa0" -"\xa2\r\x1b}\xe2M\xad\"\xbb\xfe\xe1\xb7\xc3\xc2\x8\xd4\xfdjX\xdex\xd6\xa0\xa6\x12" -"n\xfd\xee;\x1a\x97\x13\xde\xe9@i\xa9\xf0\xa2\xb3\x92\xa2\xf3\x91\xc4\xc7S'\x80;S" -"\xf2R\xcc\x9e\xf0\x32?\x84\x92\x9b\xa4qlP8V\x81\xff[N\xd5I)\x82\x15\x94\xf9\x2k|" -"\x12\x97\x94\x1b\x17\x8c?\x8apL\xe0\x97`S=\xbcl\xf4\xb1\x8a\xfb\xcb\xad\x3\x9e\xcb" -".\xbd\xc7\x83\x8a\x94\x10\xe7\xb2'\x92K\xedq#\x94\x46u\xa5\xdb\xca\x38\x8bq\xf\x8a" -"\xf6\x4\x8b\x3\xdf\xb7\x13\xf8\x81\xea\xf;\x19\x1a\\\xd9\x89\xea\x15\xb\x97\x90Y" -"\xc8\xaa\xde@8U\x81]\x8fy\x80\xce\x62\x88\xf4~\xaa\x37\xc1\x9}3\xf1\x37v\xf0\x87" -"y\x6\xd8-\xd7\xc0\xf2\x9d\x35\xbd\xae[\xb2Q\xb8\xa2\xd4\xb1\xdc\x97\xe2&" -"M\xce\x3^5\x9d\xfb\xad\xde\x84\xf7\x37\xeajY\xc2=\x1a\x64\xd9\x63\xe6\x35v\x92\x33" -"bOv\x82\xea\x34\x63kY\\\xcd\x6J\xaf\xf3\x88}\x91hgGW1\xbf\xcb\xf7\xf9m^^\x1f\xbe" -"j\xab\xf4T\xc2\xf5\x4\xeaN\x8e\xb3\x82\x91\x15`\x19R\x95\xc8w\x93\xd5\xf7s\x9a\xd7" -"\xecqv\xe1&A<\xd4\xd1\x5\x8e\xbd}n\xbe\xe1K\xb9J\x1e\xcf(\xb6\x86\x41\x1d\x91\xe0" -"ss\xe8\x91\xf7\x8cL\n\x5\xd2\xe8\xd9\n\x8a\xe2\x61O\x7f\xc2\x63\xa7\x62\xd0\xf4\x34" -"\x85G:T\xc3\x17&\xf8Tw\x1\xd4\xa3\x8d V^\xd1pxG\xae\xd9\xc8\x5x\xf\x6+\x84~f\x8e" -"\x15V\\\xba\x7\xa7+\xb\xa9\x9f\x3\xfbW\xd2o\xa2o\xf5y\xc3\xe\xed\n\xabo\xec\x1b]" -"\xbe\xa8\x1a\xa8\x8f\x16\xf0\xc9\xbe\x86\x95\x5\xbe\x18\xc1\xcbye}\x91\xd6pn*?\xb" -"\xe9\x92\x6U\xb9>\xbb\xae+M\xb]\xf6\xbe\x62,\x95\x1f,\xfa\x42\xae\xdb\xf7\xae\x64" -"\x9e!P\xfe\x87\xcd\xbf\\&\x85\xef\x36\x5\x10\x80\xbf\x39\xd8\x64W:E\xae&H\xad\x97" -"f+\x1fixp1\xb9\xbc\x43Q\x1f\xb8\x41U\xec\xdc=\x91\xe2G]\x7+\xdejR\x7\xac\xea\x1e" -"\r.\xcb\x1d\xa8\xa1\xbcK\xee\xc3\x35\xa5\xc7\x10)c\xe8K\x97\xbet\x1c\x44X\xac\xc3" -"\xd7*~S\xb1\xf0\x8c\x95_3\xed\xc3\xa0\xdc>s\x8'\xc\xf\x7f\xf8\x14\xb1\x11\x45\x99" -"\x85s\xcc" -"D\x7u1\x6T\xda\xf7\xf4\x1eV\xff\x45\xf8\x97\x1) \x19\xa9K\xf3\xe\xb2\xd6^\x14\xb1" -"\xa1\xd6\xbf\x89\xd4\xcc\x43\x18z\xda\xdf?n\x3\xa9\xe\xd0\x1e]\x87k\xd3\xaaV\xe5" -"\xee\x84\xdb\xaaM\xad\x98$\xde\x99\x84\xbd\x45\xaf\x96\xfb\x8aV\xc0\x10\xb3\xc3\xa3" -"\xc6\x13\x9dX\xe9\xd6\x9d\x91\x9\xdb\x18V\x1bU\xea\xd6\x45$\x97\x84\xb\x9a\xe9\xc" -"t\x9c\x15[c)qo\x1R\xa7\xadR\xdb\xd0\xb8\xa2[\x99\x95\xe1\x41\x66\x81\xf3\x8f\xdb" -"\xdf\xa4\x43\x87\x9b\\L%\xaa)\xe0\xdc\xc0}\xe8\xbb\x16\x1c\x36\xd7n\xf2\x86\xec\x88" -"\xd5|t\xbf\x44\xdb\xcbO\xef\xf7q\xd3\xbd\x82\xc8\xf4\xe2\x33\x35|H\xe5\x16\xef\xe3" -"\xdb\x9e`\xef\x16\x8e,E\xb5\x46Q\xdf\x9aZ\xcb_\x17\x90\xf7\x92\x9b\xcb\x16\xce^\x9f" -"jC\x91\x9a\xd2\x87\xdb\xc8\xe1-\x9f\x9e\x97\xe5\xdb\xaaY(y\x1aZ\x2\xd3\x9d%\x9f<" -"\xe2s\xa8p\x90jd<\xc1\x8d\x86\xe2?\x11]*5\xdei&\x5=\x8c\x84\xb9@\xb3\x62\xe7\xdb" -"\x18B\xb9P\xd9\xbb\x1c\xa2\x2\xf1[^Y\xe" -"\xe7U\x98\xfa\xe4=\\\xf1Terw\xb\xba\x9a\x63s\xf1\x0\xcd\xc6\x1d\xb4\xe5\xeb\xbe\n" -"\x93\xe0\xe5\x1c\x86\x0^3?i\x11\xb\x1c\x8eI/+\xf2R\xca\xdd[s\xe7\xd3\xeb\xb5>u\x93" -"S\xf1\xef<\x9b\x8b\x39\xc2\x30\xd1:\xb7\x15\x8a]\x92\xeeLE/\x81\xf6\xdf\xc1\x88\x3" -"(\n\xa0#\x83/\xd0\xdc\xb4\x82\xceZ\xf6\x15\xc9R\xbc?~X\xf6\x41}iw_\xc7\xc0\xd5\xb4" -"\x5\xaa\xc6\x32\x85w6\xac\xf3+.\xe0\xf2\xa2\xc0\xf3\xb3\xca\xd4\x83\xc6\x14P[\xe9" -"G\x6\x32/*(0\xfcZ\xb5\x92\x90}\x2\x91\xed\x18s7~zaX\x14\xc,\xdb\x1b\xe'\xee\xc9\xca" -"P\x17\x61\x2 \x9\x92\x30\x80\x45\xcc\xb5\xa1i\xb6\x1e\xa0Tgx\xb8\xd2\x80ss\x19\x4" -"g\x16`IE\xa2\x1f*\x1c\xb9\xe1^:]\xb3\x1e\xf\xb5\xa3\xb0\xaf\xdf\xdfo4$\xb7SmG?\x97" -"V\xca\x36\x94\xde\xe4\x30\x1f\xb1\xab\x1a\xe4q(\xf8\xd2\xb4\x61\xc0Q\xc1\xb9\x99" -"\xdb\xb0\x10\xe7\x8d\xd1:\xfc\xbb\xa6\xf7\xd5\"mT\x5'\xf1x\x81\xa1\x8fU\x1b>\xef" -"v\xa7\xe2\x8bO\xdd\x87\x93\x81\xa2!~\xf2\xff\x9f\x99\x82\xe9\xeap\xad \x3\xb8\x62" -"\xd7\xc3mW\xc5\xff\x9f\xbe\xaa\xb5`@\xfe\xe9s\xef\xc3\xb3M\x83\x19\x19`\x1\x1\x10" -"\xba\x10iL\x17\xb7\x63Z\xe0<\xc1\xcd\x8|\xb\x5R*zy\x1f\xc\xa3@\"\xa3\xf5\x86\xbS" -"m\x95Q\xbd\xfd\xbfV\n\x7\xf6:\xa4\xe6\x87@~^HXNh\x95\x91\xf1\xb5&q!>C\np\x8c\x6\xa3" -"M.\x1dQ\xcf\xa6\xb3(\xa1\"\x0|\x81\xb5\xeb&;\x96wF\x96\x1b\xcf\xc8w/\x85\x2\xdd\x95" -"\x89\x87$\xab\xf3i\xb0\x87\x7f\x33\x13\xa1g\xf3\xf7\x14\x2<\"\x9cWW\xd4\xd4o\xcd" -"\x9bJ\xfe\xcd\x9=\xca\xbeR\xb7\x81\x32\xce\x9a\xb6\"\\\x9a\x34LK\xf8\xd9o,P\xc4'" -",\xb9\xaa\r`o\x1;&B\xf8\xc8\x80\xe0\x8e\xa2\x82,\x8c\xf5\x9},\xdb\x64\x93/\xe1\x95" -"\xab\xd5\xfd\xf3m;\xe1#\xae\xdd\x8b\xa2\xf8*\x8a\x62\x8d\xbe>\xd6\x12\x9d\xc0\xfd" -"\xc4\xbeP\xd5WJ\xe4\xfe\xcc\x65\x6.p\xf4p;\xfe\xcb\x35\xea\xde\x19\x62\x94\xfe\x17" -">\xa5y8g\x9d\xbam\x15\x44\x8f\xf4L\r\x1a\x90; $9\xda\x93\xc0\xb0\xe6\x12\x11\x0h" -"\xf8\x7\x92\x19\xaa\x89\xf4\x35\xe4M\x4\x64\xf5H3\xbe\xb3\x38g\xb\xd8 \xd9\x41\xdf" -"K1\xf5\x1b\x89[\xed\xf8\x33\xf9\xc4<\xb7\x61m\xb8\xf\x98\x8c\xe7/\xd3\xc1,}I\xf7" -"@\xcf\x85\xb4vl\xe\xd3\x98\xeb\x83v\x95\xd1\x2\xde\xc1n$\xb7GZ\xf]\xde\x88\xfb\xf2" -"\xd6\xb9O\x12\x64\x17\xc8\x11\xe8\x36+\x9c\xccR\xd8\x89\x1c\x13\xc1\x9\x37\xaa\xcc" -"\"\x8d\x62\x1dG\x12\xcb\x9d\xe0\xba\xb6\xe\xde*\x97\xe9)+\xe0NB\xe6\xd3\x42U\x94" -"\xdfV\x93\x1a\x61\xe1\xf9\x61rj\xf6\xe6\x89\x1d\x63\xb2@\xe6\xe7\x9e[\xf3\xc\x5 " -"\x91\xd6\x81\xba\x11\x2@\x98t\xcf\xd8\xed\xc3\xee+\xe3\x31gn1\xac\x0\xf8\x7\x91\xd1" -"\x1\x9b\xb7\x89\xcaOY\x7\xf4\x82;\x0*\xf3X\x14H\xc3R\xbbg\xd8\xf\xdf\xfc\xd1\xc5" -"\xbe\xef`R30\xaa,\x4V\x0\x8f\x62\xde\xb5^i\xac/\x86\x36\x9f\xab\x1e\xcc\x90\xd2H" -"yT\xe6\x11\x17\xa9\r\x92i\xa6]\xfb\xdf)~\xbd)\xc3\xdd\x1f\x62u_\x8f(\x9c\x42\xa5" -"4\xf5\x96Ph_\x85v\xea/\xc5\xd2k\x99\xb8\xe3\xdc\xd3\xf1\xfe\xecs\x13\x10\x0\xf9\x9a" -"\xa9\x86\x8e\xa9\xba\xc0\xb5m\xae,\xf4m\xa6\xcc\x1d\x18\xc0\xab\x8dw\xbe\xcf\xf7" -"\xb8\x99\x92\x17\\\xba.\"w\x9c\x13\xdb\x9d\xf5?\xf5\xb1\xc8\xfe\x95\xe1\x64\x99}" -"\x94 ,7\x17^V,\x86\"\x98\x9b\x7\\\xdc\xde\x17\x34R\xc0\x64'CT\xd5\xdb\x8f}Zx\xd4" -"\x8a\xd4\xa1\x3\xb9\xe4u\x0\xd0\x8e\xdc|Q\xc1\xf3\xcf\xa7\xf4<6\x86\xa3\xc2J~\xb5" -"\x1\x8b\xf\x41\x99\x61VO\x87\xe2\x12\xce\n\x7\x41\xach\xd6\x82,z\xb9\xfdh\x85\xf5" -"\xd0\xb2\xac$\x9c\xb7\xf5\xe#S\xccK\nj$V/VO\xbb\xc7\x9\xc?\xdf\x12\x84\xab\xe\xc6" -"\x15\xe0\xb3\xfb\xe1\x32\xf3\x15p\xc8\xa6\\\x81O\x93\x91\n\xa4\xbb\x80\xd5\x16\xcb" -"p\xd2\xe1\xd1\x19i#\x8eo\x2-b\x8f\xa2\xf3:\n\x15\xc4\xef\xc\xe7\xf7S\xdf\x80\xa8" -"\xad\x94\x94\x88Z\x1b\x9a\xda\xe6\xc3\x8a\xc9\xdao\xb0\xa6\x16\x96\xad:P&0%*\xd7" -"\xb5t\xc8\x41\x11}4\xbd \xbd\x65\x81!}\x97{5\xf5\xd0N\x2\xb9\x33\xe1\xe8O\\\x9\xf" -"f\x15\xafHMc&](Q{\xa7K\xea\x88v\xfd\xa3\x32\xa8J\xea\x12\xe6\xcd\x82\xb9J\xe1\nw" -"\x8c\xd3\xa2\x16\xab\xc0\x84\x95\xef\x31\x9f\x6\xado\xf8\xad\xd2\x37\xd9\x11\xf8" -"F\xa5\x14\xfd\xbf\xaa\x8a\x1e\xc8\xe0\xaa\x9f\x80\xf1\x1f\x1c\xe6\x15Q\x9aK\x4O=" -"\x1c\xf1\xa1}\x7f=!t\"*_\xfa\x8b\x39\xf2\x1\x97\xffl\xaf%\xbj\xdb\xdb\xf5\x19\x1c" -"RPp\xc8\xd3\x82 \xfbP\x1c\"?I=\x80\xf4\x98\x62\x1a\x2\xeb\xcc\xd6\xef\xe9\x14\xf1" -"k*C]`\xc0\xa1\xa4S\xe2\x88\xa5=\x81\x8f\xe1\xed\xca}U\xa2j\x1\x7f.\xe4z\x81n\x90" -"\xd6\xc3\xfc\xdf\x0\x35\xee\xa3\x7\xdf\xb0m+\xcc\xe4\x34X\xa6sT\xa4\xed\xb6\xe5\xc5" -"r3\xdeO\xbe\x41\xed\x7\xee^\xc7z]\xfa\xdc@2\x13\x8d\xa9\xe1\xb7\x44(\xca\xd0*\x91" -">@\x15/\x80\x63\xa7t\xd4\xfd\xd4\x7\xeK\x8al\x8\x9f\x19\x9a\xf7\xc5)\xc2w\xe9\x2" -"\x19]\xb7`\xd8\x1e\xc6U\xdf\xfd\x1b\xb2\x83\xf3\xc5\xaa\x8b\xb5\x8f$v\xbcy{(\x92" -"\xe9\x44\x14\xab\xbe\x96\xd4\xdb\x93\xe2\x80\xcf}\xe2>\xb8R\xe7\xca\x95Mf\x82\xa6" -"\xf1\xa4\xbe\x5\x7\x88L*\x5\xac\x86=+\xa7?;Tf\x83\x97\xb6\xc5M\xc2\xf4\x18\x31\x30" -"\xab\x41Hu\xf3\xc3\xd8y+\xf7\xe5\xfcM\"\x8d\xf8wH\xbf\xb\x14\x17\x8d\xb7\xe3\xff" -"\xb7\x89\x1dp\n\x1e\x95 \xd7x\xb0\x95\xda\x80\xe4\x80\x1fSD-\\\x7>\xde\xb7\x6\xa5" -"\xdb\x84\x66\xff\xe7\xe7\x1\xab\xa9\xc3\x64\xa3qi\xf5\x85\xc8\x83\xa8\x37\x13\xa6" -"\x1c\x9c;\xd9\x33jf~\xa4\xe3\xdb_M\xf6\xbcjU+\xe8\xd3\xef\x9\x36\x39\xecg\xe5\xff" -"q\x89Y\xf9\x90$w\xf5\xaa\x89N\xd2\xd1\xcd\x31.\xd8.\xe4\x17\xd9\\I\xc9\x66q\xb2?" -"\xb0\xe1s\x8e\x89*\xdf\xfe\x62\xec\x1c=L\xbe\xb6\xcd\x8\x9c\x98\xde\x8d$}\xf7\xed" -"\x17\xdf\xa2\x95\x9d\x36\x62\xf1\x5\xe8\x38mu\xad\x30\x84\x80SiY\xf8\xe6\xcf\x8f" -",i7\xb0\x9f.\x81\x37\xc8\x11\x32}k\x16Z\xbe\x46\xc5\x18\x34\xa9U\xfe\x83\x6\xd1\x0" -"3\xf8\xc2\xa3\x46g\xf1:\x8b\xa8\x31\xcc\xf5,z!\xc1=\xb9/>w\xb5\\\xe2\x91\xf6\x19" -"\xb\xb1\xd1\x94\xa3?\xd7\x31Q\xc3\xf6\x1a\xbd-\x8a\xc\x9b\xde\x90\xe7\x96\xbd\x99" -"m-\x0\x94\xdb+\xe9\x86W\xe7Q\xbd\xee\xfe\x8a\x43\xee\x45\x1\xb9\x8f\xc\xc6\xd8\x8" -"\x5\x18\x94\x38\x87*`\x4z\x8c\xaa\x90\x39\x89\x35\x30\xa3\xe5\xf6\xbdu\xbb\x46k%" -"\x16W7\xc9\x39\xaf\xf3\xeaY\xbf\xf4\xa7\xdb\x9\xc2\xa5\xb3k\x8a\x1f\xcl^Xp\xc7\xc9" -"A%\x89\x87~\xf4O\x84(K\x8aS\xb5\xb7\x43\x15\xcer\xd2\xea\xfc\x63\x1b\xc4\xcc.[q\xdc" -"\x95\x8bZcP\xcb_a\\:E\x2\xe9sb.>\x18\x19;iW-\xef\x1d\x2\x30:7^\xd6\n\xba\x1b\xc8" -"\xa1y\xfa\xa0\xf2!\xa4\x90x\xfe\x15\xae\x13\x38\x35\x85\xfb\x45\xffM_;\xb3\xd0\xf6" -"\xd8\xbf\x62\xe9\xbdk\xab<\x9a}8\xc8\xa5\xab\xb\xe5z\xcd\xad\xcb\xd0+\x1d\xc7\x95" -"-s\xae\xf7\x2\xd4\x6\xf6'\x19\x92+\xea\x96\xb8\xfd\xc9\xb8yp\x8eyH\x91\xc7\xa0\xa4" -"/,\xcdh\x12\xc3\xf4\xdb\x3\xbQx\xe3\xa6'\xc3\xe7v!\xd3\x12\xceN\xbe\x81\\\xd3\x87" -"r\x8\xfa\xd9'a\xa5\x39kg\xe8\x35\"&\x9\xf8#r\x8b\x1c\x98xW\xcf\xea\xae!\xf2\xad^" -"\xa9\xd8\x41!)\x93P\x80\x91\xa4\xa2\xc2h\xbf\x1d\x8d\xa1\xc6P\xf6\xab\x93\x99^|\x13" -"\xa3\xf8M\xb5WH\xc6&\xfd\x9\xc0\xda\x1e\x33%\xcc\xb0\xbf\x9\x1e\x99\x62\x45\xbfQ" -"\xebHf\x80\x16+\xae\x63\xb6Qk\x9fx\x9d\xaf\x37\xefSo\xcf\x96\\\x39z\xf1\xb7\xf9" -"\x8a\xf8\x64\xb3\x1\xf3\xf4@\xb7\xac\xf7\x4\xb5\x95@E6x\xfdl\x15\x4Q\x94\x81\x89" -"8\x12>/G\xb2\x65\xecO\\\xf2\x17-9EC\xd8L\xd4(\x11\x65\xcb\xeb\x11\x34\x9b\x31Z\x85" -"\xde\xb2\xd1i\x95\x7\xb0\xc8\xc1\x10\xc7&b\xea)Y\xc4\x96/\xf0\x93\xaa^\xe6\xf2\x1f" -"\x89\xb3\xcc\xb0\x14\x9c\xef\xef\x18U\xb9\xa4\x8d(\xbb\x36\x34\x16\xc0\x15\xa1\xf4" -"\xea\x19u\xc3\xd8\x80\x7f\x61lX\x17\xc8\x16%\x36\x17oFJ\x19\x8e\xbe\xe6\xc9p)\xf1" -"_ABu\xa3\x9b\x82\x19\x12\x8b\x8c\x85\x42\xe9H5P\x7f\xc2\xd3\x90\x8b\xb0\xec\x37W" -"q(\xb\x9e\xbe\x87\xe8'\x81\x14\x18\xef\x93\xe5.\xf7\x5\x46\x89\x1b\xfc\xf\xb3Ii\xfd" -"}\xeaL\xe7RM\x9e\xef\xf2\xb4k\xed\x90\x8c\xf\xb2\xe0.\xfc\x1d\x16$d.\xae\xa1\xca" -"\xc1\xebHA\xe0 S.\x88\xe5\x9a\xc8\x90\xe6\xc3\xf4G4\xb9\x97\"\xe9\x81\x64\x2\xd1" -"\xd0\xfd\xf8\x4\\T\x81\xec\x5Q\x0\x83n\xbf\xb4\x8e\x9f\xbc\x39!C\x3,\x90\x98S\xc9" -"\xba\x38\xa1\x93\x63\x14\x1b\xed\x9\xda\xf0/\xdfN|\xc9\x80\x83!\xcd\x7\x8\xa1\xb4" -"Rp\xbf\xfc\xc3\xa0\xd7\xc2\x7f~x\x17\x13\xd5\xde\xce\x82\xc7.\xd3\x3\x86\xb0-\x14" -"WZ\x1a\x64GT~\xcc\x7f\xaa\xc1\xbd\xff\x33,\x92\x98GX\xe2\x42%l\x5\x46V\xcd\xd2\xc4" -"]F\xe6z\xeco\x83\x9f\x95\xd7N\"*n\xae\x12\xef\xaa\xb7#\xa7\xc8\x16\xd4\xe4-N\xd2" -"rZyGC\xf6u\x97\xf3\xdb\x8c\xcd\xde\x45\xba\xab\xc2W&\xb8Q\xe0.V4\x1e\xbei\xe4\xd9" -"\x1f*#5\x83\xec\x81o\x18\xa1\xde\xcb\xdaJ\xb6\x93 \xf5^s\x6\x17\x36\xf\xcf\xb8\xac" -"-+svu\xb4\x6)\x7f\x7f\x8cK\xc3p\xcb\x8L\"\xbf\xec_\xef\x2\xe9\xab)\x2\x82\xf7\xb1" -"S\xf0\xa4\xb1\xaeV\x9f\x1eR7\x1a\x43\x46\xa7H\xdd\xe0\x93\x36\xca\xd1\xf5\x33\x7f" -"\xc3\xd7\xcf\x6w\x9\x1eYH\n\xb1P!\xe0#\xe3V\xb0\xe1\xba\xc6\xc6G\x1a\xd5\x36%\xc7" -"\x2\x6\xc3\x38SoM\r@s:\xb2\x17\xe2)\x7f\x86\xb5\x93q|aE\x8bl\x93\xa1`'\xcc\x88j\x8c" -"\xfd\xc0\x1e\xf1\x9c\x34\xc9\xa6\x8\xb9Z\x84\xb6\xa2\xe3\x14T\xbc\x3\xc1\xf\xa5\\" -"\xdc\xb7\xb1\xeb}\xc1j\xc1\xe9\x39\x81\xa4m\xec\xd7\xe7\xf0\x6\x38\xdc\xacV\x87\x44" -"i\xa2\xd9\xb4\\\xbc\x81\x39\x87'\xe4\xed=\xb5\xdb\x31\x96_5\x8d\x81y\xcb\xf9\x34" -"\xee,Me,\x9c\xc2\x11\x80\x7f\x7\xc\x80\xe3\xa8\"+L1\xff\xec\x8d\xfb\x9e\xe0z\x94" -"\xc9sF\"T\xbc\x1b\x15\x81\x90>\xe6\xf9\xad\x91RJxq)\xa6?\xce\x4\x8b\x45\xbb\xe6\x85" -"X&u\xcXkk#\xb8\x5\xfe\xc3\xe7\xaa\xac\x7\x95v\x94\x9a\x6\xf4\"\xfc,\x82k\xdbx\xae" -"\x96\x13^\x9e, \xc2\xb2\xef\xf6\x17\x1d\x61\xb.\xb8\x63Z\xca\xb7\xc5\xc5\xed\x9c" -"\x9f\xfc&\xcdT\xd2\xfdL\xb9\xe4)N\x17\x8c\xec\xa1\xe1l\xc8\xe3\xfc\x6Q\x8b\xd1oM" -"c\xae+CWSS\x88\x34\xcd\xd9\xd8\xae}\xe6$\x0l\xe6\x88\x93\x80\x31\x33\x63Q\xa6W\x8c" -"0L.T\x80\xa3\xfc\xb4:\x8b\xeeIS\xda\xbc\x30U\x8bw\x90\xc6\xe7\xa6\xf0\xf9\xff\xa5" -"W\xc5\x4\x17@z\xc6\xa0\xdd\xa1\xe7\x36\xf7\x7\xb\xc8\x94U\xfc)4S=\xb0\x4\xaa\x90" -"psL\x8c&\x8\xa0s0\xe4!\xa0\"\r\xab\x99\xf8\xa7t\x89\x13/d\x13\xad\xb9\xea\x63\x7f" -";u\x94\x80P\xe6g'jU\xbe\xb0\x9d\x41S\xdc\x12k\xbd\xbe\r\xb9)\x8a\xc7\x99\xa9\x43" -"\xd7*\xfbv\x9b\xfa\x14\x88\xd3\x11\xbe\xb8j\x90~\xc9\x38Z\xaeOw\x83]\xff\xe4\x38" -"\x9e=\x9a\xde\xd1\xb0\x8b\xbc+\x1e\xd6\x8K=\x10t\xa3&\xcc\xbf\x38\xe0k\xd0&\x91\x91" -"\x7\xbd\x3\xbd\x9c\x30G\r\xb7yP\x8d\xfe\r\xc8-\xff\xd2\xde\xd7I\xe8r\xeb~\xb9\xdd" -"\xf5\x9\xd5\x31\x98\x65\x7\r\xd7hF\xc3NNCi\x1a\xf4)\xaa@\xdbK\xf2\xcd\xd5\xb'U\x89" -"\x98}\x80\x81\xf7\xc5\xa0\x46\x1a\xa5\xd1\x45Zf\x1x\xa9J\xb\xa0\xdc\xb6\x9c<\xeb" -"\xf5\xee\x4&\xd6SOo\x91\x9d\x97\x95\xadj\xe\x1a\x1f\x45*\xf3\xb4\xcb.\xa5M`\x11\xfa" -"\x80\x91\x32\x42\x1d\x11\x1e\xfcQ\x17N\":\xb6\xa1\x35\x96\x41\x1a\x97#\x7\x92\x31" -"\xb0P\xce\xda\xe7\x65\x9c\xf1h\xc3\x9a\xea\x9ci\x2\xc2\xcd\x37\xd2T\x92\xce\xe0\x0" -"\x96\xed\xd6=\xc7\x64;f\x7f\xdf\xde[Y]\xc5O\nr\xc2\x65\xe\x1e\x46\x99\x5\x84\xc7" -"\x8a\\\xef\x9b\xfc<_\x88\xcf\xb0\xc4\x9c\xd6\xca\xdd\x9d\xbagQw\xd6\x1\x92}u\xc6" -"\x90+U\xaa\xed\xe\x9e<\xb5*W|\x88}X\x1b<\xe6 \x1a\x1cw\xc9Tl\xeeZ\x13\xb9)c3\x7f" -"\x17\x7\xe+\xf9\xf5\xc5\xe8k\x84\"Xc\x87\x46\x18\xaaP\xf4\xde\x85]\xe5g\xbf*\xb7" -"\x16\x39\x44\xed\x43\xdb\xd7\xf4\xbb\xc0\xe1\x62\x31\x80|C\xdc\xb4{.\xb6\x94\xe6" -"\xfe\xdc\xfb\xe2\x61\x94\xd2\xd9\x94:\x1b\xfe\x32\xaa\x1eS\x5\xf5\xe3\x41\xea\x2" -"\x1f\x91S!b\x97\x8d\xd1\xb8\xc5)Z^uQ\xe2\xde\xe4m\xc2\x34|k2\x19z\xf4\x30\xaf;\xb6" -"v\xa5;\xca\x9b\xd1\xea\x88g\x83w\xdc\n\x9a\x86\xe2\xabm\xe2\x9e>&\x1b\xfdUs\xc6o" -"\xb5h{\xa9\xc0TM\x89Ju\x98\x66\xb0\x66\xe1\xdb\\\x66\xe6\n\xe0q\xcc:\x1cJ\xe4\x1" -"\x97\xcd\xe4\xecr?{\x80\x13v\x19\xde\xdc\x99\xafW\xa5I}n\x3\xc1\xc9\xe6r\xe7OH\xf6" -"\xc2\x13\xa3\xcf\xac\xf2i\x9c\xaer4ZQ\xc7\x1c\x1di4\x8d\xe5\xbc_D>\xc0\xea\xde\x1e" -"v\xa8\xa3\x30\x66\x92,\xf3\x86\x9e<\x1d&\xa3\xb3NT\r\xc0\x8e\xa4\xda-\xde>\xeb\x17" -"\xc1g\x90\xdaN\xf1\xa3\xa7mq\xd3Kx\x8a\x87\x83\x8b\xf2\xa5\xa3\xdb\x81v\xf9\xc0\x97" -"\xd2\x32\x0P\xa7\x9e\xa6\xc4\xa9I&\xda\x11\xab\xcd\xcd&\xdb\xa0\x9f\xd3?0\xae\xed" -"\x97~\x8bZ\xd9(\xf3\x96\x7f`v(\x85\x94)\xdc\xb4\xec\xec}\xa3\x41\x1b\xe3Z\x3\x85" -"\x10\x17\xb5\x35\x98V2c\x9d\x37\x8c\xdc\xd1;\x0\xfeSzI\xfd\x9e\xb6\xdf\x1e:\xaf\\" -"A\xeb\xe3W!\xfah3\xc2\xfe\x8\xaa<\xff\xc3G~\x7f\xce\xbf\x9e\xf9\xf4\xda\xe6/\xf7" -"\x8f\x31\x94\x81\xc3\xf1\xe7)\x99\xc8\xa4\x93\xecn\xe2\x95\x31kX\xa5\xcd\x62\xff" -"\xab\x62\xc8\x96\xe5!\xb6x4/\x4\xbc\xe1\x61<\xf7\xf6w\x8c\xbfR'\xba PE\x0\xd7\x43" -"'\x7q\x95:\xcb\xd5\xc6Xd2\xf3\xfal\x9\x87\xba\xd3;\x88\xbcl\x15\xd2\x9cK<\xc5J\x9d" -"\xd7*#W\xaa[\xae\xb2\xcb\x5|\xdc\xe7-\xc8\xc\xc9\x8c\x62\xb1j\xc5\xbLjvA7\x9bvl\xdd" -"\xf9\x90\xdb\xb2\xfc\x7f\x9c\xdb\xbau[n=\xea\x43\x8f\xd6i\x9c\x30\xa9\x9a\x8b\x31" -"x\xe6\xd6\x13\xaa\x93\x81 \x83^Qt1\xd2\x81\x14\xbc\xa1\xabt\\\x11\xfenR\xad\xb8+" -"\x9d=S\xa3;\xccIt\xc\x93\x1}\x95\x31\xec\xf4\x38\x31\x35\x9c\\\x93\xcb\xe\x92m\xb4" -"@\xb1\x39\xe3\x12\\\xc2\xe0i\xb1\xcfm\x96\xefh@\x7f\x32\xdbQrB\xc3\xae\xb\xc6r>V" -"\xb\xf\x45\xfc\x7f\x87\xa5\xe4N\x17Q\xc8\xb7\xf9\xf6i\xc2J\xd5\xcf\x16\xf8O\xb0;" -"\xa1!\xb8k\x6\x94#M\x8f,\x9c\x94ri\xaf\x96\xfc\xa0\x8ax\xf7\x36\xe4\xe0J\xce\xa4" -"L[\xaa\xfd\xe3`\xfc\xd8\xbajYrL\xa8\x61`\xa5R\x7f\xd5\x64\x46\x81#\xd3\x2\xdb\x45" -"\x17<\x1b!k\x1\xdc[m4\x15\xb1?\xbd\xbb\xd3\x12\x1aT\x93\x37K3W\xef\xb1\x31\xca\xbf" -"\xe5\x8z\xa1\xd2\xc7G+\x3w\x6k62\xc8 s\xc6\xa8\x46(\\\xc9S\xa8\xf2\x8e\x13\x1c\xf5" -"\x87\xb3R\x17\xeeI\x8d\x9a\x1d\xb5{\x6<\xe0h\xda\xf5]\x8c\xc1w\x1c\xc\x30\x99\x9c" -"\xa4\xfd\xc5\xd6{\xe4\xe7\xe6\x94\x18\xf6\x33K\xc6\x14\x90\x0\x82\x1b\x89\xa7\x43" -"|\xcd\xf9\xa6\xa0\xedp-Yh\xf1\xe0O~O\xe9\xfe\xc9\xd1\xe9\x94\x88\\\xb6$\x3[\xbcT" -"&\xcb\x8e\xdf\x4V\x82\x8f\x8e\xeeu\xbeI\x1b\x45\xfa\xc1\x92\xa4\x5\xeb\xa2\\\xaa" -"OLf\xc0\xdc#M{Av(\xdaRv\xc0\x82`\xbeQ+$2%l@\x1a\x66\xe3\xb5\x83\xe6\x9d#\xe9\xfd" -"'\x8c\xd5\xf2\x17\x85\x44\xd0T\x16\xb9\xb4\xf6\x1a\x88\xa4r\x8a\xf2\xce\xed\x7\xc0" -"\x8e \x7f\x31\xd6\x44\xe8\xe3\xba\x1eN/\x9d\x8e\x30\x93k\xcb\x9cj\xebT\xe3}\xb4k" -"\xd6O.\xcc\x10!3m\x5\x64\xdf\xf\x18\xe5\xa6\xb6\xbaG\x2\x33\xd8\xd4\x1f\xdd\x9d\x10" -"ypn\xa6\x85\xb6\xd8\xa7@W\xb\xfbx\xe3\x98K\xb1U\xc3\x15\\i\xbc\xcc\xb4\x1c\xb5\x19" -"u\xee\xa1\xc1\xb4)L\xb5\x46\xcf\xb0=\xc3\x1b\xf8n\xc3\xbc\xb1\x97~\x8f\x94\xa7q\xca" -"\xb0\x9d\xe1*\x82\xf1\xd6\xc7\x91\xfax\x0\xe5\xa2\x1d\xf8\x1c\x9c\x8f\xcd\xa7\x86" -"\"\xab\xe7[T\xae\xeatz\xa4\xf2mV2\x0\x99.3r1\xa4\x30\x13|r\n\x17\xd4O:\xd6\xcf\xfe" -"c\xb2\xde\x12\xd3\x18K\xd3\xe1Q\xf9Uxk\x8d\xdc\xcc\xb2\x90\xc4'\x18\xf3\xa2\x19\x17" -"Y\xdfv7\x1c/\xc1wTJlB\\\xab\x14\xaa\xab\x31\x62\x8a\x9c\xf9\xd7\x1bRW\xaf\xf0\xd5" -"\x98\x43\x98\x9c\xf0\xd7G7Z&\xdc\x9e\xd2\x9b\x66\xac!G\xda\x1h0lH\xc2HLp\xca\x92" -"\xf3<\xc\x13\x8f\x92\xf2v\xf5\xea\xf5\xea\x30\x82\xa8\xa1\xcb\x12\xdb\x66\x16\x33" -"\xc2\xf7\x1e;i\x91\x8fP\x90`\xac\x94\x9f\xcdR\xc3\x64\x98\xa2\xab\xb7}\x13\x9d\xf1" -"\xeb\x33\xe3\xb8\x46\xa7\xc1\xbb\xdc\xef]\xee\xcaN\xf0\xad%\xc\xea\x9c'Q\xe1>\xf7" -"h\x1e\x8f\xae\x4\x91\xcf\xa6\xc1\x44\xdb\xac\x1f\xc3\x9d\x39\xe7n\xb1->\xe9\xca\x15" -"\x9a\xa7}'\x94\xf0\xc4\x33\x34[\x13[\xa6\x32\xf5\x44\x8+\xbd\xc9G\x1e\x9f\xa3\xae" -"\xd3\xa7\xd4\x65\xabqX\xe8\xac\x97\xf6\x8b\x1f\xbc\x8d\x36\x8e#PE\xc1\x8e\xfc\xca" -"\xde\xe9\x87x\xd8\x94\xd9\x63\x1\xf9\x3(\xbb\xf2\xb9R5w\x8ar\x91N\xb3p~\xa7\x82\x94\xb3" -"\xa3\xbcJ\xcb\x19\xfe\x87\xc7*\xa1\xd9\x82\xe4\xb8\"\xf0{\x11\\\xad\xf4\xd3\xe7\xee" -"=\x1b\xa7\x8\x65;\xeco\n5*\xc\x33%.\xd0\x63\xert\x96\x18\x96\xd4\x61\xee\x8b\xf5" -"#\xd5\x91\x1b\xac\x1c\x8a\xc7\x63\xe5\xfb\x11\xfd\xd2\x17N\x1f\x12\x96u\x96\x9c\x19" -"Tv\xc7\xa5\xe1\x8a\x81\xbf\x9a\x11\xed\x9f#6\xd5\x30\x1e;\xd3!t\xed\\\x93>\x8c\x85" -"\xd6'.\xa2\x18R\xa6\xf7\xe2\xaa\xb1t\xe0\x96_s\xe0\xef\x89\xe9\x6\xba\xfb\x18\x1d" -"\xbc\xf8\xb1\xf5\xaa\xc\x12\xd1,bru<\x1j\xfe\xc2\xec\x9f\x95\x41\xb8uxt\xd6\xf2\xe0" -"a\xab\xbe\x8b)(\x16w$c\x5\xb3\xc4\x1e\x90\x41\x84&\xc5u\xba\xa2\x16\xce\xe3\xc5\xec" -")\xb2\xfd\xee\x1cw\xc1O\xdf\x94\x7\x92\xf4\x8aV\xae\x80\xaa\x33\xe3p\xb0\x37\xcb" -"(\xa7\x37?\x88 \"\xaf\x37\x8f&\xb6\x0j\x4\x9f\xd3\xb3Pt\xa8\x65\xc9}\x15\x33R\xac" -"\xc1V\x99,\x0\xde&\xad!\xc9\x82\xc7\x1f\xe\xdc\xfe\xb6\x15\x93\xbb@\xfa_,\xeb\xf2" -"\xe5\x62\xec\x9f\x65o\x12\xf3\xe8\xf2}\xaa\x9cu\xdb\xf" -"\xa9\x46\xfd\xe\x1a\x98+\xb5\x8e\x4\xb\xfc\nI\xa4\xad\x8c\xd6hI?\xcbW<\x84\x9e\xc5" -"G@I\xa6\x93\xcb\xeb\xd4\xd7\x9a\xc7QPG\xcc\x34z\x9aup\xc9\x8\x61\xf3\xec\xfbW\xb9" -"\xf5:\xb9\xc0\xd6\xb0\\\x8cW\n\x8f<\x4\xd5\x85U\xa4U$\xc9\x8f\xf0\x91\xb8\xf8\xa4" -"\"\xf2\xe0\xe9\xe5\xa7\xb7\xffi\xf1\xce\xfc\x13\xe4/\x1c\xa2v\xbc\xd5\x84Qm&k\xa6" -"\x83\x8d^\x9c\xa9\xe9\x85OP\xc7\xd9,\xae\xd6\x1a\xac\xafu\x8a|{\xe5\x9c;\xaa\x82" -"\xbf\x32\xb6\x91\xac\xa3\xe8\xeb\x17\x1e\x8\xad\"\xc3\x9f\xbeXjT\xe6\xe4\xde,\xd8" -"k1\x13\x85\x46\xbb\x8d\xa5\x83K,nH8Tz\x1bg\xe6Q\x96NC\x98\x8c\x80\x36\x93\x10\x88" -"\x90K\xbbX\x9c\xa9\x1\xe7\xeb\xbc\x9L\r\xa8\x1e\x9\x19\x15\xd9\xe4h(\xad\x85\x96" -"\xfd\xf\xca\x39\xff\x12\xa6\xc2z5\x93\x37\xf9s\x80\x9e\x81\xb2\xe9\xe3\xd4;1F\xf2" -"Qfg\xe6\x7\xff\xeb\x9a\xc8\xf\xc9Z{}M\xedU\x1f\xee\xf\x35\x61\xc7\r\xb2\xd6\x9a\xba" -"\x96g>9\xe3\x39\x7f\x1c?\x8f\xe5\xf4\x8b\xab\x8a\xd6\xe0\xed\x89\x1\xf9\xfl\xff$" -"\xe8\xc\xb5\xdc\xacI\x85\x6\xc4\xd0\x10\x33\xe4\x97\xc1$\x1e\x41;\x2\"'\xa3&M\xa6" -"\x8b\xc3\xf9\x1b\x35x\x1f\xa2\xd0\x18G\\\x19\x9f\x43\xcb\xa7\xd3\xa0\xd5i{E2\x1b" -"\xad,9K q6\xe1\xe1kAyIu\xe8\x90>\xf2\xb2\xe1\xc3?\x87\xcfr\xc3%\xc1\x1e\xc0\xb9/" -"\xd3\x89\n\xcd\xf6\xbR\x1d\xa3%\x96v;\xdf\xcd\xca\x83z\xdco&\xf1)\xb2<\xa3/\x9c\xd3" -"\x9b\x33\xe6\x45v\x97\r\xf3\xc0[\x8d\xcaK\xfe/\x17\xe6\xc5g\x8b\x84\xd6\x94\x94\xf1" -"\xdb\xa9\xfe\x4\x46\xaej\xfe\xaa\x1f\xf2\x45\xc0y\x16\xc7\xb7V\x9e\x62g\xc4+E\x94" -"5\xa1\xd1\x16\xce\xc6\x65\xb3\x11\xe4\x4\x17\x17t\xc0\xac\xc8\xdd\xe9k\r\x91g\xc8" -"\xcc}\x99\xc4$\x5Y-t\\D(uU\x0\xebG\x19\x34\r/\xc6\xbc![g\x82?i\xfa\x94\x9c\x8\xb5" -"\xec\x98]z\xa8|\x9a\xc1\xf9\xbc\xc8\x99Ll\xbc\xe6\x2{}\x1e\xc\"\xa8:]\xe6\x1d\xba" -"\x5\xd4\xafh\x84\xc9_F\xba\x7f%>\xb#7\xe3\x12\x91n\x16<\xaf\x9d\xb2\xecV\xc5\x42" -"Y\x90\xfes\xeeS\xe4+;\xcc\xa1\xcf\x64/\x2\xb0\xc5\xab\xd5)\xb5h\xe9\xad\xff\x86[" -"\x9d\xc1\x90$\n\xd7\x8a\xd2&\xed\x88K\xed<([L\xb0\xe3\x92\x9e\x80\\g\xf1\x31\x8d" -"\x18\x65\x4\xd9 \x85vKp\xdej\xb5\xabi\x90\xf1\x81\xbd\xa5\xf\xc3\x12\x62\x34\x8d" -"\x98\xe\xc7\x66\x8\xcf\x8\x17l%\x2\xe0\x65\xac-\x8e\xa5\xcf\x9e-D\xe2\xb7\n}\xdc" -"{\x92 G\xc4q\xdf\x8a\xb \x87\xd1\x10k[\xd8\xa8\x30\xec\xeS\"<\xe3\xc9n\xf5nUA\x19" -"\x11g\x86\xe\xeaX\xd6\x96\xec\x35~\xc5W\x99\x43\x8c\x90\x15k\xbf+\x13\xa0\xd5\xc9" -"\xee\x93\"wFeN\xd7>\xa5\xb9\xca\xb6\x1d\xac[\xc6\x90\xf8\x9c\x87\xfe\xca\xf9\xad" -"\x3\xbd\x39\xe4\x38\xf4;\x81\xd3\x9e\x7\xe0\x42/\x94\xe8\xb0\x96\xab\x38\xc8\x8b" -"\xc2\xe1\xa0\x43\x81\x1d\x81\x41\xc1\xa3]\xd3\xa6\xdb\xe4\x16 \xe8<\x8e\xd3\xa3y" -"\xcd\x80\xd4\xf9\xbc\x30\x41\xbb\x44\xb9\x33\xda\xca|]D'\xae\x94\xa1v\x82\x9f$\xb5" -"\x96\x8bq41\xcb\x8b\xd9\xf5\x30\x80\x83,kxL\xea\x9bQV\x87\xf1!\x98>\xb9\xd9\xc9\xce" -"\x8b\xd4\xfa;\xecH\xaf\xe6Nd;{\xd8m\x83\x83\xd0u!\xfe]\x9\x13\x92\xbe\x12L\xcc\x91" -"\x11\x36\x4\x38$\xb6\x86\x98\x8e|\x83\xae\xbf@m-\xa8\x8f\xd9R\xd0\xfa\x93'\xf4\xad" -"\x4\xc5_\xed\xbf\xbf\xa7n\xca\xe8\xa1v\xc5\x16G\x9a\xe1\x46q%\xb7\xeb<\x9e|[\x10" -";\xc0\xc4p\x94\x63\x46\xdf'\x1f\x8e\xe1\x9d\xf7\xe3\xfftx\xc3^\xe0Y)\x7fK\xf2\x1a" -"\\{\x95\x99;\xe6 .\x89wv\x95*~\xd0\x61:\\\xac\xaf\xa7\x31\xff\xc6\x33\xca\xb6)c\x15" -"\xe\x86\xed\xacy`&\xce\x2\xeb#[\x9fzT\xe0\xb0\xc5(\x15g\x13\x8a\x61+\xaf\xe4\x9\xa8" -"\x18\xc2\x16\xda\x8e\xac^\xdf\x9d\x1e:\x1e\x35\x14\xaePsZ\x11\x1bM*\xa0\x83N\xc6" -"\xc1\x1e)\rX\xff\x34\xf\x82\xf0\xe0y\xf1\xc7\xb3Vo#6\xea\xa4[\xf7+\xcf\x88V\x99\x88" -"\xdb_e\xd4\xc1\xe5\x9bP\xf3\x41\xe4Z\x89\x96V\xa0\xb5\"\x84~\xd5g\xb4\x9c\xd5(O\xe5" -"\xe_\x86R\xcd\xac\x1c\x7h\x4\xf2\xb2\x18_jQ\xed\x19\xddIA.e\xa0\xd2\xdb\xc8\x44\xb7" -"^-\xf7\x1b\x0\x97v\xd9\xf9zLoxn\xff\xeb\x87\xa3\x7\xfbk\x91+\xb6Y\xdc+\xccmP\x9a" -"\x9f\xbd\xe8}\xe8\xd7\x16\x4\n\x85Q\xb6\xcc\xfbwC\x97\x8a\xd9\x92\xd1M+\x85\xca\x5" -".\x87\x32\x61\x38\xdb\x19l$Y?\x8f~\xcdoHo\x85\xd1\x66k\x9d\xe2\xac\xa6\xc7\x90\x0" -"D\xee\x36\x9d\"\x35$fJ'\x90\xb7s\xf9\xea&\xe0\xa4\xcd\xfdp\x99\x42\xa4\x42\x98\xb8" -"$\x95\x6\xeb\x9bw\xbc\x88}\xc0\xef\x94}\xdd\xc7\xcb<\xfckH\xf0`\xdb\xf0\x32\xa1\x18" -"\x84\xe6\xc2&\xd9\xd4G\xa5\xa4X\xcb\xa3%\xd5~\x14Lm\xc2\x95&'c\xe7\xbb\x8f\xf6\xa0" -"\xcaG>\xb7\x66\x1c\x12\xe0\xe8\xe2>\xa3~\x8a\xb3\x38{\x9eTho>Wv]@g\xe5!\xbc\x1a\xfa" -"\xe5#\x94\"w\x93\xc7\x37\xc1\x92\x8\x80?/-\xa9 \xb5S\xe2\xaa\xf9N\xb9\x92\xab\x17" -"\xe3\x1bX\xc1\\\xc4\xaa\x8a\x1b\x44M\xf5\xb3\xe7\xcd\x93|\xf0>\x1f\x7f\xac\x63\x34" -"'1\xb4X\x9f\x16\x93\x9d\x16\xe8\xe4\x97\xa7L\xdeV\x86\xf5)\xe9I^\x16\x3\xd7Hu(\x8c" -"\xf5\x32q\xdb\x93\x13\xa4Q\x1b\x10O\x80\xb1y\xfc\xf2\x13U\x89p\xa0\x2\xe9\x45(\x1b" -"\xf3\xaeQ\xe6h\xddm\x13\xd9\xe8QRt\x7fV,\xa0\xb7]\xde\xc8\xfe\x9f\xe3\x1f\x8d\x5" -"\xb0\xf5\x9e\x80(\x88\xa7\xa4\xf1\x9b)\x95J1\x10\x8d/\x4\x13g\xde\xbdj\xa1\xca\xd8" -"V\xbd\xd1\x42~\x9e\xfe\x89\x95o\xe2\x8dP\xc\xdcj\xc\xb8\nv\x90*\x8\xd0\xbcg\x5X2" -"C\xf1\xdd\x80 t\x9b%~\xdfH\x3\xbc\xaa\x65?\x7f\xd6\xd8\xb9\x16\x90\x99[\xa5\xea>" -"\xe9/\xcd\x36|\x11`\x1ck\x8a\xdc\xed\xceg\xb1lYl] \x6\x93\xac_\xa1]L\xc6\xce\x9d" -"\xf7\xa7\x1c\x8a\x92^\x99\xf5\x8S\x13\xd6\xf\xad%\xc1\xbb\xaa\xd2\x8dJ\xc2\xb6\x90" -"b\xd6\x8f\x39\x5\x30\xa9v1\x9a\x39\x4\xce\xe4M\xc9\x45\x1e\x44\x1a\xabG\x80\x42T" -"@\xf8\xc4\x99\xb8\x14`\xb5\xd3\xe2h\x97\x41\x45\x11~\xd8\x43\xb1q\xbb\x14\xaa\x84" -"\xc3\xa0\x84\xa7\xd8\xe0{\x99y&\x6u\xd5\xce\x65\x34\xdc\x17m\xdb`\xdd\xe9\xfj6t\xf6" -"tb\xefx\x19_\x8d\xfft\xfbX\x82\xb0y\xde\xe3\x1f\xe9(\x16\xf1l\xe1\xa7\r\x7u.\xa2" -"_\xafP\x0\xad\xf7\x9b\xbe}\x17\xeb\x1b\xd2\xf9\xbfl\xdb\xb6\xf0x\xca\xf9y\x86\x44" -"&\x80\xa8\xfc\x41!\x86o\x9c\xe8l8]\xe3N0\xd8\xb9v\x8a\x1\x36\xd9\xee\xf7\x9aK8\xee" -"\x99\xcb\xb9\xa4\xd3#\x16VL\x9dV\x99n%\x95u>\xa7\x1b\xefhH4\xfd\x3\r\x38\xbb\x10" -"\xe#2\xb0&\xb0\x46\x31jS'\n\x96\xda\xb2\x18.\x99N\x91&/\xb0=\x1a\xff\xba\xd6#\xf1" -"h\x92(@\x98\x84\xf9\x1d\xba\x15\x30\x30\x87\n{\xeb,~\xe2\xde\xc5\x18u\xb1\x37\x33" -"\xb7\x92\x90\x41\xf8\xd2:\x94\x90K\xd5M\xd4\xbc\x9b\x43-\xd0\xc7\x8d\xd8\x16\x39" -"\xf4mho\xfa\xd3\x9a\xaf\xbd\x1bl\x1a\x37\xe2H\xceH\xf2>\x12\x46MSy\xb4\xae\xd0\xd5" -"\xbZAW~n\xcbu'\xe\x9a\xd3\xea}\xf\xc0\x9d\xab'\x1f\xb1\x8bQ\xdc\xfc\x0i\xf1]rTnl" -"Q\x4\x9f\x34%\xad\x0_\x88\xfd\x7f\x2\x4-\xab\xe9\xf0\x97\xf9\xd6\xa0v\xb3\r\x8c\xd7" -"w\xb1\xec\x12\xbd\x16?\xda\xbaYr\xea\xa6\x1e<\x87\xe9\xac\x0z\x5+\x1a?\xfe\x14\xd7" -"\xd41\x2\xce\xc5{\x8aX\x91\x82\xfc" -"e\xa4pFa\xa9\xe3Q\xfc\xcb\xc7\x31Z\x87\xe6/e\xd2N\xeb\x9c\xee\x97\x9cn\x10\xdb\xcf" -"\\\x16*\xdb\x92n\xc8\xcc\x9b\xff\xe3\x81\xf6\xb8\xa3\xac\n\x19\xd1\x63\x1b\xea)8" -"s\x1a\xfc\x99\xe8\xea\xa3\x9b\xc7]\xdb:9\xd0\x1a\xd8\xf0\xbc\x18\x38\xf4\xd6t\xb9" -"\xbe\xe9\xf6\xf7\xbeM\x9c\x8b\xd9~\x8d\x17\x1e\xff\x33\xc\x15\xb7\x66\x14\xa1\xff" -"\xd2[;\xe1\x9eJ \x1b\xcc\x85\xf\x92n\xd5\x16\x16\x31\x8c\x96Z\xd2\xf0\xe5o\x94\x33" -"\xb1$|m[r\xed\xf3\xd4\x8\xa3\xe0gJP\x9b\xf3\xb\xe8\x13\xa5\xe6i\xd7+\x97\x87\x94" -"h<\xa8\xb8^4i\xea\xcb\x16|0\xf7\x66m\xb5\xe0\x81\xb8\x1e\xe9\x9e\xcf\xbc\x17\x4\xb9" -"dk\x1a)\xe4\xa4\xceVT\xca\x84\x9\xad\xd6\x1\x45\xdf\xc5\x42%\xbd\xb8H^9\xcc\x98\xcb" -"\xc3\xf3\x8f\xd0\xa7\x97\xe5\xdf\xc2\x9\x94R\xa2\x41\x8c\x66\x36\xbd-_k$4Z\xcf\xa6" -"_N}\xbd-\n\xa0\xc1wjI \xb4\x46lP\x9b\xb5\xbc}f'\x94lM\xcb\x38\xa2p\x98\xb7\xb5\xbe" -"\xed\xc2\xb3\xba\x18\xf9'\x7\x7fq\xe3\x86\x44Yw\x19\x65 7b\x1b\xb3P\xbbSi\xdc\xcc" -"\x7\x39T\x2nd8\xfd\x83\x93\xdd\xb3\x63\xc\x44s\xf0m\x9f\xb9\xe4\"\xe4\x35Vl9k\x12" -"\xfd\xcdV\x5\xdf\xea#!q\xcd\x8e\xf2\x98xh\x6\xe9\x15\x9b\x84Y\x9c&\xd4\xc7\xd8\xc3" -"\xbb\x6\x46\x65\xcd\xd0r\xe2\x8\x31\x90\x37*\xa8\x8\xb2&\x8b?\xec\x88x\xb6\x42\xc" -"\xa8)\xbc\xf9\x95\xdc \xe0g\xeek\x8e\x44\xd2\x86\x9dQ\xba:\xed\xd1v?\x7f\x8d,\xfb" -"\x8e\xc4\x1en\x9e\x1)\xdeSC\x14W\x96\xc\xc5\x1dTk\x10\xb8\xb6\xce\x8\xa1\xc2\xb7" -"\x9f\xba\x44\x8d\xf9x=\x81V\x8\xa1lU\xe5\x89\xdc\xd8\xefk\x4\xc6\x62\x32\xf4zG9s" -"\xa3V\x18\x0\ry\xb8\x17\x32X\xb7\x36\\\x96\x91\xdd\xfeG\xb1n\xeb\x8\xb2\x8f\x88\x18" -"(\xb9\x46\xfb]o\xe1\xe\xccj\xfcN\xa1\xf7\x62\xe9\xb\x33 @3\x82\xe4*\xf4\x88[\x18" -":\xa4\x8d\xb5\xe4\xdf\xc9\xa5N\xbO\xfb\xf7\xc2n\xb1zO\x13\xb4\xbb\x93\x12#D4\xff" -"\xf0UI\xe7X{\xa0\x37:\xcb>1A\x8b\xfa\xf4\x0\xd8\x93\x8f\xc6\x46k\x94'=\x17\x35\x30" -"j\xb9\x12\xaa\xb1>1\xda\x35\x41\xc1s>*~M\xa5\xb8'g\xd3\x7f\x30\x84\xaaz|H\x8c\xdc" -"\xa7\xab\xefw\xd1\x9e\x42\xb4\x44\x8a\xbb\xd3\x46\xe9\xbc(\x8a\xbc\x45@\xc0\xa1\xcf" -"\xd0\xbf\x46\xc5\xbctT\xb2^'\xe9\x90j>l\xbfg\x8b\xfe\xca\xd1\xb1\x9bNB9\x8a!\xc\xd5" -"g\xec\x35\xfb\x11]\\\r\xf0\xee\xec\xe5\x93\x98 V\xb0\xe1\xd1L)/p\xb3\xe0I\x98O\x88" -"\x81\xc8\xb4w\x95j\xd3\x14\xbJ\xa2\"V\xda\xac\r\x11\xc4\x12h\x8\xb5\xb9\xf9\"\xbc" -"\xc5\xf2Jw\xff\x35.,b\x1a\x39\x41\xac\x7\xa2\xeU\ni\xc4\x9b\x1b\x87\xd1\x16\xeeo" -"/\x97\x9\x18\xf0\xf1\xa5\x1\x16j\xc4\x42?\xc2\x12\xe4\xec\x80\x39\xac\x7f\x9c!-\x86" -"OA\x8c\xbb\x92\x94\x8f\xbdX\x82(\x10\x8f\xac\x1a\xd1\x83ppQ#\x5\xc1\x10\xf0\xfc?" -"\xaf\xe6\xe1R\x9c+\xd0\xdd\xe8h\xa9\xeb\xe5\x13}\xfd\xfc\\\x12\xa3\xd0\x80\x14\xbf" -"\xe\xe2{\x10\x80\x2\xaa\xd6\xb6\x7\xf5\xc5\xc0\xf1\xb1\xee\xd3\xc5R\x91\x9c\x9a." -"\x97 J\x81'\xf9{\x10\x66`~\xcf\xb4{\xa9^\xf2\xb5\x1f\x0|);/jc\x4\x1a\x9c\x11 \xd9" -"\xcf\xcdSW\".[\x2\xdf\xc7<\xf9L\xf9\xb5\xcb\x0\xea\xf0s\xe9\xbf%>0\xe0\x9bP4\x1e" -"W\xbf$Ztn\xa3\x1b\xff\xd0\xb0\x2\x1\xc3L\xf0\x88\x1b\xbd\x10\x6\xbc\x9b\xa7\xd4 " -"\xa4\x8eShkY\x8b\xed\xb3\x44\x99$\xeb\xa5\x8d]\xb1\xb1\xb0\x1a\xe2\xba(\x1dWX\xc9" -"\x9e\xfe\x38\xad\xce\x18\xf7\xb1\x82\xfb\xd0\xd0\x62*n\xa4\x97\xa4\xe7\xc0\xc}\x17" -")\x9a'e\xef\xd8\xde\x37l!M\x1\xa2\x18\x19\x45\x1f\xc0J\x2w\xec\x84\xa1Q\xff\x93\x90" -"=a\xc7\x8a\xb7\x88i\x11\xe3n\x12Rn\xd8U\xab\x43\xf6(\x9c\x18\x90\"&\x2\xb8\xef\xbf" -"\x15x+7J\xc1\xe5\x80\xb6\xe9\x63@=m\x15\xa0Q\xdb\x85X\xf2\xe6\x1c\xb\x94v\xc6\xde" -"]HaX\\\xf5\x15\xce\x95\x17\x32\xf2\r\x32\x96\x9f\x39\x19/\xbf\x16\x90\xd2\x42\xac" -"\x4\xd4~\xcS\xd4g\xd0\xfe\x46V\xb9Rl\xf\x7f\x85#H\xb0\x43w7\xcb\xf)\xec\xf9\xb5J" -"^\x17\x18R6\xdd\xc\x16\x34\x9c\x34\x96\xf3\xab\xa5i\xea \xe3\x43\xf6\xd7q!\xc\x39" -"\xdc\x93-\xc6^\xce\xf9\x45u\xc6\xe7i\x2\xcd\xf6\xc8\xc8\x36\x1f\x9cuz%w\xdaSQ\x87" -"\xfdRf\x99\x91|\xfe\n\xd4\x38\xc2\xa7Xr{0k\xc7\x97\x95G\xe6\x8b\x94\xe8~\xd8 aK\xdb" -"\xc6I\xd4i\xefkNN=\xd2\xea\xeb_\x80\xb2/\xe5v\xce\xd2VITg\xc7ju\xf5\x89\x46\x0\x61" -"\xe0?:\x1b\x6Q!\xa5\xab\xe3\xe2\xc5\x11H\xb3\xdd\xc9\xf6$\xc9x\x89\xaa\xf7\xfb\x84" -"\xb1X\xc0\x15\xed\xa5g\x7\x46\xc6\x35\x9d'\xb0\xc2\xbd\x65\x14O+\x88\xa6\x43\x31" -"\x81m\xa9\x4W+\xe3\x98\xe0\x15\xa9\x92\x42\x18\xb3\xee\xf9Q#\xaa\xbf\xc3\xac\x82" -"\x17\xb7\xb4\xf6\x91!\x9a\x1c\x9d\xd0\xa3\xed\xd5\xc0Nc\xac\xbd\xe7\x1b\x42\x35\"" -"S%a\xf4\xb7\x1bp(A\\47\xe3\x46\xber\x8a\x41U\x96\xabt\x90\x15\xc1\xd5\x9b\xd8\x32" -"\x8e\x39\xa8P\xcb\x98\x8[4\xb5\x7f\xb5-\xd1\xd1T\xf9\x8f\xecI\xb3\xae\xbf\xcb\x16" -"rv.M*\x1e\xcf\x2x\x7fY\xdf\x1e\xbf&%\xc3\x63\x1b\xed\x84\x9b)\x8cm\"k\xe4\xe6\xea" -"*\xb6j(}+\xa9*l\x9c\x61*_\x84\x9b<\xb3\xc2_\x17\x16K\xe2\x86\xf6\xe4\xf5\xe7\xe4" -"\xc9\xeb\x17\xbch\xaa^\xf0\x19\xb\x64ijW\x4\x42\xe1\xd9\xbd\xd1\xa3\xev\x92RN0\xe4" -"\xb4\xc3\xdf\x84H\x1d\xce\xc6\xe1\xes\x8\xe6]\xe9\xd9\x0\x99\xf3\xfa\xbb?Ovk\xb8" -"l\xc9\x85\x94m \x3\xe2\x12\x87v\x1as\x86\xcd\x84\x61\x61[W\xb\xda\x1_^\xfa#\xd1\x8e" -"\x83\xc3%\xee\x44N\xc1\x66\xa1\xa3-\x98\x18\xc2\xa6Z\x9-D\x15l\x6\xd3\xfd\x7\x9b" -"\x92\x45\xb\x8aI\x1c\xbb\x35)\xdd\xac}\x95\xaf\xe8\xea\xf3\x37w\xfb\xb2\x65\xfe\xb8" -"\xa4\xb9\xaf\xf2\xce\xce\xff\xf4\x9a\xfb\xdc\xf6\xc4\x19t\x97\xd3\xb4H\x86mp\xef" -"(\xd8\xe4\xb1~|\xe9_C\xf6K\xb4\x8cJs\xeb\x84\xb2\x66P\xf6->Q\x99\xd6M\xb0\xb5\xb8" -"w\x2\x65\xe\xd0\xb8P\xfd]\x16\xc8H\xd0\x96\xe4\xc7\xe6\x1b\xc6;*>\xcf\xc0\x99\xcd" -"q>\x12\xc9\x1a\x65w\xa8\x8doU\xd3Ha|zI\x89\n\x86\xea\x8f\xe2\x4W\x4\xb5\xedR\x9d" -"\xb1(\xc9\xb1\x9e\xe1)\xe5\xfe\x64\x98\xcc\x97\x8\x7fk\xde\x96\x0|\x9d\x1\xce\x9c" -"\xafudnZ[2\xbf\xea\xd9\x36*R\"=tiC\xa2\xd0\x9cSl\xfa\xf7\x8e`\x1b\xc2\xd2\xf0\xb7" -"c\xadr.:z\xe7\x6\x9d\x65\xf9\xf2\xbd\xedrxQ\x1d\x1 \xf5\xea\x7\x1d\x41\xa6\x9f\x8c" -"*-r\r;$\xb4\xbe\x61\xc8?\xfb\xef\xfa\xe2\x1b\x5`\xa6\xfd\x1a\x44\xe5>B\xe0\xd1\xe" -"\xe\x93\xf4!\xa8\xa7\xe1g\xbb\x65\xf0\xd7\xf1\xdd\xe2\x80\x9f\xa3\xcd\xfd\x93\x1c" -"\xcci\xb1\x19\xc8\x32\x38\xc1\xc0\xe\xc1\x0\xd8\xe7\xab\x1c\x7f\xb0.\xde\x97\x7<" -"\x8aX`7\x1a\x81\x32\xbe\x39\x1e\xb1\xc3\x97\xb6\x1f\x93\x87o\xeb\x43\x8c(\x8e\xf2" -"\xe3\x8d\xdc\xd1\x82\xa5\xcf\xbb\xa9\x94\xa9J\x1b\xf8\x18\x31,\xd8#B\x15\xfc\xcd" -"|$\n\x15\xac\x1\xa8\x85\xe1\x17\x9e]}c\x5\xdc/SK\xaa\x14\x1f%\xeaj_5d\x86\xe5\xfa" -"\n\xe3\xc6\x98\n\x9f^\x8e\x99\xe7\xae[\x95\xac\x42\x97u\x10\x97\x2\x45O\xc9Q\xe4" -"1\x9a\xe4\xb1\xdd\xc9\xb0}\x9\x98\x37,\n\x95\xab\xa6\x98ZM\xbem\xc6\x33\x15O\xaa" -"0\xac\xe6\x89\xd3j\x7f\x17\x1\x1b\xf2\x9c\xed\xc5\x8a\x66\x92\xa8\xb3\xb0\xa5t.l" -"\xec/i\xb2U\xbc\xed\xa7\x62\xde\xe7/\x12^\xba\x98\x89\x1c\xffM\x88\xaa\xc1\x41\x88" -"\xa1\x8d\x81\x42Iy\xc9\x7\x9e\x44\x89\r\x94\xee\x9ML\xad\xdc\x1cz\xc5\xf6y\x1f\xab" -"\x88I\xcc\x2@\xa5y\xab\xd8\x0\xef\xe3\xaaN\xe2\xf7\x81\x19\xa3\xc2\x80l\x5\xc2\xb1" -"\xf1y@\xbes\x98I\x82\xd1\xc0\x6T3\xa9\xbd\x65\x8e\xa3\x1a\xc8\x19\xda\x9a\x11\xb8" -"tu\xbbV\\\xc2\x94\xb6\xf3\x2\xfe?wR\xed\x9b\x96\xcc*{\xb8\xcf" -"\xbf$\x87\n\xba\x38\xd2\xcc\xf7\x86\x9e\x93\x63\xdc\n\xd9O\xac\xae\xd5\x92+2M\xc3" -"\xb6\xfe\x83\xe7\xb3O\xe2\x9a\xbc\x1e\xad\x62\xb4\x9f\xfb\xcb\x81\x1a\xdb\xb5\x14" -"\x8dZ\xc2t>:\x5\x83\x86\x3o\xad\xabo\xf0q\xbc\x1c;\x80#\xf9\x8\xb6\xffH\xdb\n\xb1" -"\xc9\xc6t\x87\xc3R\x11\xd4\x9\x95\xe1\x89,\x8b\x66\xadl\x9c\x62\x3\xf6\xf8\xb5\x13" -"\xb1\x11\x17\xb1\r\xa8rZ\xb4[D7\xb5\xa8\x8a\x96\xaf\x31x\xd8V\xd6\x1\x19n\x81\x62" -"\x86\x8a\x83\xda\x64\xe4\x8\xfd\xde\xbd\x14\xd6Y\x18\x81\xea\x65 2\xcf/\x88\xb3\xfd" -"l\x4y\xc8\xf8\x9a\xc6\x8d\x14\xd0\x1a\xf0\xce\xaf\xd9Z\xd1\x46\xe6\x8f\xae\x1\xa0" -"\x7f\x39\xe7\xa0\xc5\xe4\xff\xa6\xd6\xa9\x1dq\x8'\xcaZ\xcf\xe7\xd1\xf9\x46\xa8\xd7" -"\xb6v!\xd6\xfSA\xf3,\x12\xa6\xef\xb0:\xe5\xacSs\xa3\x82\xc0\x44\xa2v\xf6\xb4\x1c" -"\x17=\n\xaa\xae\xc\x1d\xe4\xc3\xccq\xec&7\"\\\xcb\xfb\xd4^\xab\x92\xbf\x39\x35|W" -"\x19[A\xft(5\x85\xb1+\x92\x64\x38\xacr\xaf\xad\xaa\xd2\xd0\xfa,\xcar\x8c\x8e\x86" -"\xbd?\xe7]G\xb8\xbe\xb9j\xb1;T\x80\xf7\xa3\xd5t\x1e\xb5\x1e>@\xc2\x1f\xf2\xed}\x92" -"!\xd9\x87|}\x1a\x8c\xec\xf3\x94\xe4\x2?\xcf\x8cN\xfd\xb3\x8b\x83\x94\x99\xff\\\xd9" -"jF\xabO\xdb\x46\xf3];H\xb9\x17W\xc0\x15\x93(\x12\xe\x93\xcf\x1f'9\xe9\x36\xe2\x89" -"\x8\xfb\x19G\x1d:\xd7\xf6\xf1\xad+\xd1\xec\x36I\x86\xa4\x11\xcc\x1bT}\xc\xa1\x4\xfb" -"\xc1\xb\x1c\xa7\xb6\x38\xa6\xeuHUt\x3\x45\x61\xdb\x34]\xdahAQF\xaa\xc6\x32\xdf\xa3" -"Gi\xb6\xed}}F\x94\xe9,\xbf\xf4\xef\xb1kUIY\x8\x10.\x85\xe8'\xfc\x62<\xf1\xbb\xe6" -"\xa1<\xbf\x64\xe8x\xe1\xa2\xa1Y\x94\x8bU)\xb7^\x7\x17\x44\xa5\xf0\xe5\r\xf1\x8c\x11" -"\xb\n\xf1\x17\xce\x7f\x33\xf8\xc9Y\xd4\xc9\x8c\xedZ\x9dI*\xe6\xf5m\xa5{\xf\x17I]" -"\xac\xb1\x30\x66\xb\xce\xfb\x6O\xd8\x30\x9d\x96Z\xbe\x8d+\xe9\x8fh\x98\xc1\xb7\xa3" -"\x9c\xbb\xe3\xe7]\xa0\xff\xefl\xc3\x94\\\xe7m\xa3\xbe\x91UF\xfe\x8aS\x10\x13\n\xe0" -"\xac\xaa\x9a\xb7<~\x4\x1c\x0S;K\xc7rFW\xaa\x64\x9b\x93\x88\xb7\x91\xaa\xc5\xea\xbf" -"\xcd\xdd\xea,\xc6z\xf\xd0\xae\x9b\xe3}\xf9\xad@ce8\xeeU\xa8?`\xe9\xe0&\xc6O\xbd\x8b" -"\"\xc\xeb\x46\xe6t\x10\x14JR\xf\xce\xac\xa2R\xe8\x16TH\xf8M\x8e\xa0\x83\xc7\x93\xad" -"\x9\xb9\xb>\xe8;s\xfe\xfc\x33\x65\xc7)\xe3\xc7\x38\x89K\x8c\x1\xc2\xf8\xae\xe0\xcc" -"\x8b\x11N\x11u\xef\xb4L\xc4\xc6\xce\xf5\xc8uK\x1c\xc7\xce\xc2\x0\xad\x8b\xf1\x18" -"\x9dt\x1c\xb7[\xcaN\x88\xbe\x95\x9e\x32!j\xd3?gOI\xab \xa3T\xcf\x39i\xf1\x61\x1a" -"\x95\xd3\x93N\x14\x88\x31\xae|\x81\xa7\xeb\xe3\xc5$Ot>f\xa8.\x10\xd1l\xc0\x9f\x81" -"\x94\xeazYk\xc5\x98\x1d\x83\x33\x18\xabO}\xbf*\xbc\xe5\x43\xe4\x10\xb6I\xd1\x8d\x14" -"o\x1HaYh=\xf6\x1a?\x88\xf\x9b!\xeb\xfa\xb7~\x90\x8cl\xfcy\xf8\x9b\xa5\xf5\x11\x14" -"\xf0\xbf|<\xce\xc7\xbf\xf;\x5|1\x95\xcf\xbai\x8\xe3\x1e\r\xf1\r\xf6\x91\x63\xc9\xda" -"{\xab\xc0\xe\x9aX\xf\xa7\xfa\xc2\x2\x91\x6\x15\xbdG\x9b\xbfv\xfb\x80hc\r\x1e\xc2" -"\x1c\xd2\x92m5\x1e\x86\x9e\x16\xc2\xcf\x1e\x2<\xf0MO\xc6\x16\x7\xda\xef\xee\xed\xff" -"U\x93\xe6\x2\x34\x92\xf0\x0)\xe2\xaeKJ,\x14P\x95N\xfa'\x92\xf3+I4\xa7h\xf8\x92\x17" -"\x12\x45\xa1\xe2\xf0\x34\xe2\xb9\xf3\x98\x33\xf1\xb3\x31\xa1\x9a\x38k\xaa\xcf\xec" -"\x8c\x92\x9b\xa6\xb6|\xd8\x92+\xbc\x9d\xc0\x5\xec\x39vW][\x5\x8\xd0q|k\xf1\x11#\xea" -"6\xd8\xfd\x37\xfaw\xa6\xf1\xf5\xaa\x84\xd4\xad\x8d%\xb2\xc1\x1d\x18w\xa6\xe2\xf9" -"\xb7O;X)\xfa\xef\xd4\xf7 \x9c\xe9xZ\xa6\xfd\xe6\x86rUJo)\xd8\xbf\x3\xfe\x10\x8e\xd9" -"\n\x7fXi\xf\xac\x39\x9a\x8a\xd3\xa2h\x99\x7+\x83(t\xdd\xb6)X\x1aQ\xb3\x32\\\xd9\xed" -"\xfdI\xe8\x90\xea\x89Y\xdb\x93}\xab\x83\xc7w\xf2\xa4&\xb9g\xafX\x88\xc3:65\xb7\x8d" -"dz\xd6\xba\x44\x1e\",\x95\x8e\xa5\x8d\x61\x94_x\x1d~\xf4\x9w\x1b\x89\xb2\x2\x42\xad" -"}\x7\xc2\xefY,\xbf\x41<_\xc8\x9e\xc3\xf\xc9\xeb\xeeK\xc6\x37\x9\xae\x33\xb6^\xe3" -"\x9\x1c\xec\xbe\x61\xb\x84~\x12\xc5V\xa2y\xc8\xb1\x14\xc3\xe4`\x82-30\xad\xfdr\xbd" -"i\xf5L\x8\xa8\x18H\xc2\x0*\x8\x32l\xf3\xb0\x9b\x13\x5I\r5\xae\xe5\x91y\x8\xe1`N\xce" -"u\xbb\xe8\x11\xa7\x15\xae\x8a\xf7\xea\x9c\x37\x1b\x32-\x4(\xed\xf4\xc8\x93\xfd\xea" -"`~p\xe1\xb6\xf6\x61IG2a\x1\xea\xef\x18\xe2\x9b\xe0U}*\x92\xcf\x1f\xc1P^\x8b\x43K" -"\xc3h\xce\x7\xcc\xaa\xbc\x7t\xf8\xa6>\x10s\xfb\xbc\xeb?@RF*\xa9\x0\x8a\x1eS\xf1\x88" -"\xc9\xea\xe3\x39\xfa\xbat\xaf\xd6\xd6\xfG(,\xd9\xffr\x1f\x64\xbdQx\x7f<\x13\xb5\xa6" -"\xc5\xa5\xf7\x86\x11q\x1\x11\xf5\xe0G\x1e mrR\xf\x1d\xfa\x46_J#\xc7\x1d\xcf\x99\xa0" -"L\xee\xf1\x1b\xe;\xdf\xc3[ta\xa6\x7S\xd3\xac&\xdcP\xa5\x95l\x91\x95\xa4\xf5\"\x63" -"\x88\xe0\x95=\xdd\x3\xaf\x12\x8a\x98\xf0;\xdf\xa0`,\xbb\xaa \xab\x9e\xcc\xdfrU\x96" -"*3.\x16\xd4\x38\x7\x62\xe4\x98\xfd\xa4\x88\\\x64\xff_\x9bH\r\xa4\x87\xc5\x8ex\x94" -"=\xf6&\x16\xe6\xe2\xc6\x9e\xec\x88\x36\xdf\xcf\xa9\xeb\xf5\x89\x38\xa8x\xf3\xe7\x92" -"\xe8\xbd\x8c]m\xf5W\xa5\xd8 \x18\xdb\xae\x1c\xa9\xc6K\xa5\xaf\x8e!\xbe\x1b\x66\x80" -"\xfc]\xb2$\"\"\xbwn\x9b\xa0\xbf\x1e\xd2\xb7!/\x8b\xf1\x11\xec\x8c\x8cw\xb2#\xc0^" -"\xb5\xe5\xf1\xcf\xab\xd2\xd0\x37\xf4\xba\xf\x95\x3\xe2\xcd\x83\xf4Q\x9d\x18\x4vc" -"\xf0\x9e\x30\x88\x83\xf5\xdaR(\xf8\x30\x45\xff\x41!M\"s\xb2\xfe\n\x90\x17\xd5\xe0" -"U{\xc2\xa1\x98\xc3]\x1e~\x81\xf7\x96TDW`\xcb\xa1\xd3\xf0^\xa4\xb9\x6X\xe5?\xdf\x8" -"#\xbd\xb1P\x1e\xd5\x1d\xa7\\G9Ps\xd8\x98\r\x1e\x35\x4\xe3\xf6}\xb3%\x9eN\xe7:\x87" -"\xcf\xd9o\x84\xe2!yes\x95\x8d\x36JQ\xe6\x35\xfcUG\x8c\x9c\xbf\x9a\xea\x16\xb7\xd8" -"\xc2_!\x15\xcf\xe4\xb7\xf5\x98T\xe2Ih\x83;\xa0\xd6M\x1d\x33*fm\xfa*?\xd7\x1b\x5\xa2" -"k\xab}\xa3\x82\x90{\x13\xde\xb\x80\x87\x1d\xf1\x84\xd3\x62+b=~\x9\xbc\x32\xa4\xf6" -"\xea.m\xa4P\xa9\x6\xea\xd3mS\xfd\xec\x7f\x83\xe1\x1\xfe\xf3/O\xae\xc5\x81\xb0\x0" -"hm\x86\xa0\xd3\x86\x1c\x1eg\xf1\x8aLFG\xf5\x1f\x97\x84\x84\xd9\xe3\x10\xb\x37\xbe" -"\x9d \xae\x84\xc0\x85\x46\x1c\x1f\xbf\x92\x9c\x66\x9e\x93\x66Y\x5\xc&'\xac\x1b\x1" -"\x98\x37\xba\xa7WW\xf5\xb0\xa8.\x8a\xe9\xcf!\x11\x93\x1a\x38\xbf\xc9GD\xe2\xfd\xe3" -"\xf8q\x3\x42\xac\x61R\x86\xe4\xac\xe7\xf2it:\xa0Tc\xafS}\x94\x16#\xe\xcc\xa8Y\xd8" -"\xc9\x9b|np\xbe\x7f\xe1\x1d\xb6\x98X\x9b\xe9\xe1\x19\x0\xc8\xe9X*N\xf5\xea\x94\xb5" -"\xf6( \xc9\r\xbc\x2*b\xe\xc5\x36\xe0l\xb8\xbeu&\xa7\x89\x99m\xet\x1a\xad\x98\x8\x80" -"\xa3\x38\x0\xa6\xfe\x92(l\xcd\x2\xc9\xcb@~\xb3\x1f\xb9]\x9c\x9fJ\xff\x38\xb3p\x87" -"\xacX,\x1f{d\xa7\xc3\xd2 +\xdd\x62\xe9\xae\xb3\x1b\xca\x85\xc4\xcf\x32?\x3\xda\x9d" -"1\x8b\x91\xf7\x8f\xdc\r&f0\xf7\x44N\xd0h\xb5\\\x5\x46\x1c\x97U#f\xa8,.t<\xec\x35" -"=Q\x2\x8f\xdc\xf5@;;t\xd3y\xb8.\xb6\x9c\x43\x80\xed@#\x9e\x15\xa8k.\\\x86\x8\x91" -"\xe2g\x81\xcc\x11\x1f\xb5p^;|z\xf1\x94`\x6T\xb5\xfa\x1b_\xc5O\xd0\xba\x43\x66n{\xab" -"\xd2\xc9\x1c\x85\x9f\x39>\xd4\x9fq#\xed\xfb\x64\x8a=aR\xf2\xc1\x7f~C\x8c\n\x63\x89" -"h\xac\x6\xb4\xfb?w\xf6O5\x8a\xe0\x63\x82\xb\xd3?\x2\x13\xc8\\@\xe4\xd9~\xd1\x0\xec" -"-\xa1\xc2\xe1\xea%\x8b\xf1\x7\xafgZ\x9d\x99_`\xbf\xa3r\"\xb9\xc2\xb3%\xc0\x5+\xb8" -"S}+'\xdd\x43\xa1)\xc7\xe8\xff\x42u{:\xc9\xb4Gp=8!\x8\xdaR\xb\x8b;\xb3\xe8\xc7)[w" -"kD\xed(\xf8\x63\xb8\xe1\xf8\x1b\xb\xd1\xda\xee\x8a\x17\x15%\xd0\x9d& \xc0M\xd3!\x9d" -"\x88\xc.\xccy(-\xd7\xb1w*\x9c\xbb\xcapi\x9\xae\x8b\xc7y\x8en\xc7\x37Q\x89\xb6\xcf" -"\xce\x8a\x87XI\x17nY\x13\xb8Z\x18\xfb\x19z3\xcaK[@X`<\xf1\xfay\xa5hV\xb4=S\x8e\x9e" -"\xce\x11}\x99\xaf\xa7;W\xe3\x7\x36OU6D\xde\x1\xed\xb4\x62\x34\xef\xac\x13\x4kn\x4" -"~\xcc\x8f\x63\x94/ \x9z\xd7\xac\xf0\xa4\\\x5\x1\xa9Rc\xde\x94\x39\xa8\x80\xd6\xb5" -"\xc5!M)\x18\nT\xd7\xfe\x9b.b~\xf4\x9e\x18\x9bY\xfc\xc7\x87\x45\xe8x\xe4[F\xc0\xa6" -"H\x95]>\xa8\xc9\x35\x11=\x94\xf9.\xc9\x63\xf6l\xf3\xcf:Rk\xa7\x1c\xdf<\xd4\xcai\xef" -"\xab\x8\xb7\x38\x9e\x33\x90qh\x92\xa4\x87+\xd2\x9d\xc1\xe0\x88\x9a\x42\xd7\xff\xb4" -"\x19\xe\x9a\x8d\x5\xd8N\xb9\xc5t\x1b\xe6\xb0'\x16\xbcu\xe0\x10o_\x94\xbd\x37x\xbe" -"\x98^\x3\x86\r'\xe4@\x88\xc3\xcb*\x5\x9d\xeb\xc4 \xdc\xe3\xa8\xf4\x8z\x95HH^al@\x9a" -"\xc4\x0\xdd\x1c\x41\x1c\xe4\xb6\xa2)\xd0\x91\xb2S\xebh\xf0nCQ\x1e\xc5\xaan\xcaMn" -"H\x18\xd6\xaa h\xda\x1a\xef\xca\x37v\x11\xbf\xa8\x16\xb5!Q\x82\x43-V\x83)Mg\xa7\xc1" -"\xfdv\xc5\"\x33\x8|\xa4IC\xecr\x80\x0^\x93\x14_^z\xe5\x1\x0\xc1\x83\x64\xe1\xb3g" -"A\xe9\x64|M\xc1\xf6\x8aX\xec\x44\x9Y \xfd\xcf\x5S/`7\x17\x80\xf7\x84 \x7~\xf5\xc2" -"Mc\xe2`@\xcd\xdf\xf8\xdf\xd6]\x87\x1d\xb9\x43\xf5\xc\xde\x84\x90\xc\x13r\xef\x33" -"\xfd\x8a\xb9\x88\x9c\x82\xf9Oa\xa0\xe6\x84\"\x19\xa0\xf3\x9e\xc7\xb2\x32\xcb\xf8" -"\x2\xc4\xa7\x44\xf3\x31YC.\x82p\x6\xc7\xcaw\xe4\x80\xa4\x8a\x9b\xej\x87\x61X\x8a" -"1\x2\xe3\xf9\x8aw\xbb\xd6*:#\x15\xf\xd1@\xd3\x94\x17s\xbf|\xbb\xa2\x33\x8f\xf3{\x9e" -"\xb6@U\x8a#\x13\xe8\x82N\x8e\x62\x3\x31V\x8a\x9bv\xf4\x89q\x98\xa7\x9\xf9\x31?J\xc4" -"\x8'\xd8\xc3\xa7\x1f*\xbf\xf0+\xfdW\xd3\r\xb\x14\x1/\xb5\xc3\x9b\x85\xafT\r\xda\n" -"\xdc'\xa8[1iN\x8d{a\xf9\xd9\xb4vW\x10\"\xd9\x8f-v\x82\x46U\n\x87r\x93\xf3\xffn\xd9" -"\x18\xa4\x98\xd6\xa6\x0\">\x1a\x61\x89\xcI\xac\xfb`&Xg\xce\x94\x64\xf9\xc3,Y\xe9" -"OvA\xc3\x87?\xb4\xfan\xb2\x37\xf8\xed\x94W\x99W'\ro\xd6@\xbd\x95\x43\xe6\x83\xf2" -"7,\xcd{`\xaa\xd2i\xe0:r\xc5\xcd\xb7\x32\xb1(\x81\x8d\x41\xa6\xdd\xd2\xbc\x13\x9f" -"}9\x11\xf4\x8e\x1b\x1d&=\xd4\xae\x8eL\xe1\xa6\x86\xf3\xa0\n,\xbfH\x97\x86\x31\xcd" -"$5f\xe2.h\xf8\xd7\x39q4\xa3S\xe\xa3t^O\x1e\xac\xb4\xd6\xa5\xfd\x84\xc3\x1\x10\x94" -"\xf3us\xf7\xf9\x90#\x5\x2\xcS\x92g\x16\xd4x\xck\n%{\xf7\x11\xad\x94\xc8?\x1d\x41" -"\xa0,\x1c}\xd2\x3\xa3\xe6\xe4\xb1N\xda/\xdb\xb3k\x6:>\x7\x44\x95\xf6&\xb0\xee\xa1" -"F\xd2*\xc3\x34W\xf4OAgYgm*\x5\x66\xec+rm/\x5@\xab\xf2%\x33\x9f\x2\xf4\x6\xd4\xe7" -"\xa6.R3\xdd\xf2\n\xe7\xc8l\xa0\xcd\xd5\x61\xf3\xde\xd0\x2\x35/\xc6lowA\xa5\x42\x15_J\x15\x9c\xd7x" -"\xbeV\xb9I,\xd9Q\x15\xc1\xa0\x61\x89\xa2\x16\xcf\xd2\xe6rYe\xa1=\xe9svZ\x5\x11M\x9a" -"ZK\xe0\x61Z\xf8\xbfj^\xaf\xf8\x44h\xb8I\x95M\x15\xbe\xae\x1c\xddW\xc4\x35x\x8b\x33" -"\x19\x5\xc0\x14!\xb5\xf \xb1\x84Pj\xb\xeftc0\xbc\x98\xe9\xc8\x9a\xaa\x8f\x9d\x10" -"/\x15\x80\x43\xbe\xb6\xa6\x82\x5\x9a\x1c\x8b\x8c\xf6{/=z\xf4\xd8\xbb\xe0\x86%L\xde" -"Sv^2&\xba/\x95\xae\x80\x63\x64\x9f\x9f\x94\xbd\x95\x19\x41\x1d\xaf\x8a\x2\x87\x30" -"s5f\x81\x90\x63\x88\x6\xe2\x94\x84\xa4\xff\xbc\x1e\x46\xb1\x80\xe\x3\xb1\x62\xc2" -";\x1d\xc0\xb4\xc0\xddL\xc5\xaf\xe3@$1\xb2" -"\xc8\x16\xda\x14\x86\xc3K\xc9\xdc\xa4\xe2\xd5\x1c\x86\x86\x88\xa7x|\xd1\n\xbb\x9a" -"\xca\x14\xb7\x18\x13i\xde\x89\x91<\xd8\xfa\xb5\x8f\xc8\x45\x19\xea*\xa1NT\xb7\xa8" -"\xceGO!>\x7\xcf-\xe2\xe8\x88\x9=\xee\xc9\x37Rh\x16\xb7\x1c\x96\xedu\xfa\x9e.\xdc" -"\xf\x9en\x84V\x9c\x12\xbb\x8e\x39\xaa\xed\xbfTf0tUS\xd6\x8O\xf9RO\xecjrd\xf8\x8c" -"\xeb~\xc3\x35\x8e\x92;9$t\xe3\xa4\x88\x65VD1f)\x88\xfe\xa7h\xceUZ\xb0\xdaH\xbdRj" -"\x84\xb0\xcb\x17\xb4X@f\xc1\x64\xc\x10#\xd9\x1fxi\xef\xcMp\x1b\xe1!\xa6\xe3\xc8\x32" -"\x1\x4'I\x7X\xae\xd7\xa2\xb3\r`(\xf2!Z\xa4N\x86\xd8R\xfd\xc6}\xa5\xcc\xbay\xee\xa8" -"c\xba\xc9\xed\xc2S[f\xab\xeT\xecMD\x11\x39\xf\xde\xb8\xd1\xfb\xc1t?\x15\xc3\xb6\x8d" -"\xc9*\x86Y\xe7\xa8\x92\xd5\xe5\x38r\xeaQ\xee\x8c\xa7\xefQ\x10>\x87\xc2\x9a'\x14\xe9" -"\x7\xc7\x9d\xb9\xcf\x37\x44\x17\x85\xd2\xf7:\x1e\xe5\x85P\x11\x1aM\x9b\xcc\xbe\xbf" -".9\xcd;\x93\xdc\xa3\x0\xfa\xc3\xed\x1a\xdd\x82\x15\x30\x1eWf\xc3\xc\x8c\xf2\x96u" -"tlZw\xbf\x1f\xe3\xcdu\xd2\\\xf1\x93\xde\x8d\x9a\xf0*\xf8\xf7\xa6\xe8\xf8KT\x80X\xcd" -"\xd3\xc6\x99\x8e\xd1\x34\x63\xfa\xdes\x91&\xd8=<\xe2\xc7 \x1f\x95S\x82\x83.2\xc1" -"\r\xcb\xcc\xa3X5\x98[\x9a\x93\xf8\xe3\xb0 \x8b\xe6\xe9$(x|G\xd3\x80\x8a\xfw\xb8\xf1" -"\xd7nk\xf6\xa1\x7f\xf8\x1c\xdb\x6Q\x80\xe0\x38\x9\xd0\x36\x38\x30{\xd7\xbf\\\xed" -"\xbf\x64\x90N\x91\x8f\xc8\x5\xac\x90Sy\x92\x8b\x81\x64\x80\xf6\xe3\xbd\xeeG\x4,\xba" -"\x98S\x9d\xa0\xe1\x13\xb1\xa5\xf2>\xaf\x1a\x32\x10\xbd\x18V\x19\x85\xe6\x43n\xab" -"\x90\x39]\xa4w\xc7\xa6\xd7\x88\x8d#w\xb3\xfc\x41i6\x83W\xd8\x80\xce\x4\x1e\x1f|\x87" -"^\x95\x66\x0\xdb}\x9b\x35\xd1\xee\x66\xbeGn\x9d\xd8\x6L\xc0\"\x30'h)\xc2\xc0\xa0" -"\x98\xf0QP.\x82\x8a\xc\xc5\x5\xaf\xd8\xc3\xdf)=\xa1P\x8a\xc4\xd2Xf\xbe\xeek\xbdZ" -"#\xe\x9c-\xcd\xd4\xf0h\x83\x93\x63\x81\xf4v\xdd\xcd\x86\xcc\xfe\x15\xc2\xce<2C\xe1" -"H\xcb\xe6\x3\xb8Q:|\xe7\xa6\x91\n\x66\xa9\xbp\x89\xe5\xcc\xd4\x36\x8b\xef\xff+\xcf" -"\x8e\x91\x8b\xfe\n\x1b\x6\x9a\xb2\xa9\x14\xca{\xb9\x1a\n\xc3\xb3\xc0\xb0`\xfa\x1a" -"\x3\x16\xf6\x13^\x89\xe\xe5I1X\x97\xc8\x46\x44\x96\xccm\xea\xf~:\xf4?\xfaL2\x81\x15" -"`gX,\xa2U\xb1\xd2\xe8\xf\x99\x9a:\xc0@+\xbd\x17\x1\x82L;\xb5$\x13\xf[\x82\xa4Ru\x80" -"{\xc2\xf3\xa0\x65^\xa2\x8\xf9h\xb2\x97\xf9\x8c\x36\x91\x92\xc8\xac\xa2k\xeb\xa7\xdc" -"E\x6\xfb\xd1\x30^.\xfaM\xbeSu(\x1a\x88\xee-o\xc8\x8f\xc0\xa7U\xe7)4\xb4\xb5\x8fm" -"\xd3\xbd\xafqq\xa4\xa3\xc7vWg5$\x92\xbf\xa9\xa7u\x85\x4u\n\xb7\xf3\x87Th;p\xe9\xe2" -"\x93\xcb\x1c\xd7\xb2;\xa6+\xd7\x39z\xbb\x84\xd7\xed\xb2.\xf6\xc3\xf5\x8b>\xea\xf6" -"V\xe3\x61t~\xd0@ \x16\x32S\xd1\xcf?\x90[^\x85\xf8?\xff\x30\xab'x\xca\xe4\x37\x81" -"f|\xf\x65\xc8\xfd@Mk\x92\x2\xa9\x9e\xa7j\xf9\xae\x12\x36\x63\x15P\xb6k\x6\x38G\x18" -"\xbm\xca\x83.\xa8\xdcJn\xfd\xb6t\xb5\xa2\x65R\xa7\xc7\xd5L'\x99\xc7\xd4\xe0<$\xf6" -"a\xa9\x11\x3\x8m\xe3\xa9\nwJi\x88\x34vV4L\xfb\xa0`e\xab\"Gk\xb0\x9f\xb6\x8f\x99(" -"\xc0\x4_'d\xaf\x64<\xfe\xf0Qm\x87\xfd\xe6\xdb\xf9;\xae()\xb1v\xcbP{\xb9\x98\x35\xe0" -"\x1b\xad^U\xc2\xf8y\x8c\x93\xfa\x35\xeb?\xef\x2\xcf\xa3\x1d=!\xb0\x30T\x7f\x86\xd2" -"{\x94H\xd6\x8e+\x15Ze\xc7\x42\xbd)\x99\xda\xa0\xc3\xae\xd6\x44G\xb9\xccg\xf7\xaf" -"3\xb6:\xfa\xf2_<\xf7\xef\x86\x65\x7f\xe8\xf9R(\x8c\xa4\xb6\x91\xd3i\xe8\xf1\x93\\" -"\xda\x44\xa1\x80\xa6vu`\xc2\xed?/\xcc\x38\xb6\xbdy\x91\xd4\x17\xc|Vmi\n\x8a%\xbe" -"\x3!*\x80\x87\x11\x8\xd1\x8c\xce\xff$f#\xe6S\x10v1\xf2\x92'\xd6GT\xb2 \x8d\x19\xf8" -"NTw\x99\xe6\x91\xcaG7\x80\xdd\xd5j\xe6 \xcd\x95=Q3\xd1\x35\xe3\xd5\x1f#px\xfe\xeb" -"\xb7\x37\x14T\xee\x63<\xfe#\x8a\xea\x63\xf9\x99\x9e\x32\x85\xel\x19v\x87\xa0\xec" -"NY\x8\xd2\xa1\x8cSIb~3j\xb5\xe3\x18[!\x82(`:K\x18R\x6\x9f^\xe8I\xd5q\xb8\x38}\xce" -"\x1f\x8f\x8e\x9f\xe9O\xad\xef\x12\x8b\xa8;\xdd$_\x8c\x1c'\xc1\x1f.\xd1\xa8\xab-m" -"`\x17&\x84,\xeetN\xe7\xaa\xc6\xb6\xfa\x16\xcc\xaa\x39\xdb\xf5\xb3\xb1\xd4s9\xf3\x1d" -"\xfaV&q\xa9\xcf}\xdei\x15\xfe\xf9\xf1\x9b>\x6\x8a\x46M\xd3P\xa3\xad\x14m\x1a$\x16" -"s\xb5\x11*J\x87h\xf9vr>n\x18G\x90\xc0`E\x6\xc4\x65\x91\xbe\xf2\x10l@x\x9bs31\xa8" -"\x7@\xd5\x9a\xbe\xd3\x98h\xf8\xb\xec\xc2\xaa!\xc4\x0\xa0\xbd\xc\xc3&\xd1\x86\xff" -"\xf9\xeb\x37h\xf\x1e\xdc\x32\xacx\xf9\x5\x92\x80\xd0{_\xf2\xe3T\xfe\xd5\x45\x12\x9f" -"\xa5\xfa\x8f=C\x17\xff!\xe0'`/\xdb%\"\xf0I\xbbT_\xf4\xda`$\x81\x30\xf8\x1fN4\x83" -"s\x14/1H\xde\xd0\x38\xaf\xba\x81\x8f&\xd5\xb4\x9f\xc0-\xe9\x80\r\x89N\x92\x39\xc8" -"\x8e\xe0\xed\xe4\x31\xf8\x8\x36\x97\xcb\xb\xe3\xb4\x97G4s\xe5qG\x17\xc9\x14\xa1\xa9" -"&s\xc$\x94\x13\xfe\xa2\x61^\xf7+\xdb\x9\x6\x93\x33\x87\xa8\x92\x37\xfw\xee\xbf\x62" -"\xd2l\xd5\x83\xee\x64;\x2\xe3#\x82\x13y\xc0\xdc\x96\x64\x7\xd3j\xe3\xcd\xf6\x46\xb9" -"]\xed\xc7\xd7\xfd\xf(\xe9Px\xf1-\xfc\r\x64\x0\xb3'\xb7\x43\xc5H\xa0\xa3Qz\x17Z~\xd9" -"c\xeduk\x1e\x10z\xe7\x8~$F\xbap,\xd4\xe2n-\xcd\xc1\xa8\xb6\x97\x10\x8b[^\x81\xe9" -"\xf0\x31\x5\xf2 \xc7-J\xeb\xc5ve\x88|\x8cyd\x8\x9f\xbe\x94$\x12\xe\xfd\xb1Mv\xee" -"\xf8\xc6\xf7\xa3\xb\x13\xe1\xae\x90\xcb\x9d\x93\xd2\xe1K\xdeG\xf4\xa1\xd0^\xd5\xb1" -"\x8d\x32\xaa\x39\x91\x1b\x92\xd2L\x93\x97j\xce\xb7\xefYzu\x16\x19#\xa7;,\xc7\x61" -"xT\x93\xd0\xee\xdc\x8\xb5\xaf\xe9_<\x0kAC\x8a\x7\x85\xc9\x62\xb0p\xde+\xd0\x96\xcb" -"c\xb8G\xc8u9\x88\n\xa3\xd3\xfc\\\x34^\x9\x92\xd7\xbew\xc6\xcf\xf4\x94\x86\x17\xfd" -"\xdaxL\xc5VR\x19+\xe\xd7u\x12\x9cN\xa4$ZA\xbc\xf3\x87[\xe3\x19\xda\xe\xe2\xda\xfe" -"\xfa\xe9 \xcd+ll \x1v/\x88\xc0\xc5\xc0PS\x2\\\x3I\xdb\x17\x10\x43`\xfc\xe1]\x7f:" -"\x8e\x30\xed\x13\x15Zt\xfa\xf9\x1d\xc7{\x8a\xab\xddo\xbdZ\x1e\xaf%]\xb2\x9\xd7\xf2" -"\xb9\x8\")kV\x3\xfb^,\xc9\\\xbc_z`D\x5\x8b\x80\x44\xad\xces\xac\xfd\x89\x61w\xf1" -"\xf7\xe\xad/e4\xdc:\xd7U\xab+\xa8q&\xd6<\xa2\xe9\xc4\x41\xdf\x9\x65\xbd\xddk\xe4" -"\x94\xe5\x8dkPW\xa5\x61\xd1\xe3\x1b\xd3\x8e\x92\xcbs\xc1\x46Z\xf6\xb9\xc0\x1\xf7" -"\"\x90Y\xbc\xa4\x10HG\xd1\x63\x9e\x12N\x8/sd\xb5\x65H\xbf\x81\x12\xd0\xeb\x46\x1b" -"1k$I\x4\x9fjGm6\xd6\xb7\xc0\xc1\x12l\x8\xf2\xe9\xa1$j;[!\xe7\xc8\xfa\xc6\xe2;\x82" -"\xe3:w\x83\xe4\xf3\x1f\x2@\xe9ni\xc9\x44N}z\x92\x86\x36\xcf\xd0\x86G]\xf1\xe0\xa2" -"\x84\x64\x81\x38{\xb2\x1\x6U\xb9\xf8\x1a\x7\x44\x12\x16\x99\xb4\x90Z\xae\xdc\xc8" -"K\xc5\xd5\xab\x36t`\x1d\xbb\xb6Q\xed\xe7\xb5\xdf\x5\xc8\xa4\x63\xda\xb4\x1fypm(\\" -"O\x90\x63\x99\x7fz\xc8\xce\xf3\\\xadQ\xfb\xe5\xf5\xbb\x1b?\xa6\xda,:\xbf+>\x92U\x81" -"4\x97(\xd6\xda\rY\xc1\xef\x64\x44S\x97\x42\xee\x9a#\xa5r\x7f \xcf\x93w\xf4\xf8M\xea" -"B\x6\x7\x1Z0\xfb\x14\x63-\x8J-\xd1\x81\xbb\x2\xfc:\x84\xfcI\x9b\x31\x81V\xb6u\xb9" -"\xca<\xca\xbd\x87\xfd\xb2I|g\x5\xfap\xeb\xa4:\xdd\xb6\xcf\x96\x1b\x30\xe8\xf6\xab" -"\x9f\x84\xe1\xdd\x8dm\xb3\x31K4\xb7\xf7\xaa;\xbe\x19\xd5\xbd\xc7^\xca\xdf\xd8\xea" -"\xe1\x9e\x7\xb3\x87\xa1\xfcXo\xf\x30\xdbiY&vKT\r\x89\xf1\xd8T\xb0\xff\x86R\x8a\xd9" -"R<\xafV7\x1e)I\x8c\x11\xaf\xb2\xf4\xd5 &p\xc8\x34\xe9\x30\x10?\x3\x9d\x13\x34\x88" -"$\x16\xa4\x9b\xf9;\x84\xfd<\xf1 \x9e\xef}I\x94\xc8\x30$6\xc0yD\x97\x46\x1c\x11\xf5" -"\xb8\xba\x15+\xac\xbc\xc0\x8a\xf8\xa1_JM\xf3\xef\xfbr'\xca\x97\xfc!\xd2\xd0\x35l" -"\x93\x39\xct\x9c\xbe\x97P\xb8!\xf1\xa7\xbc\xfa\xe2\xc8\xbcm\x9a'\xf8\x44\xd8\xad" -"\x8\x83 y\xab\xf0\xea\xd8\xec\xd4\xear\x84m\xfe\xed\x2\x18W\xf3<\x1a\xceL\x7\xbe" -"\xc9\x3\x98\xb6)\x81LI\x8d\x33\xbe\xb3u\xb9\xa5=\xa0\xf9&\xfen\x89\xe7\x3\"\xc7," -"\xb2\xdd\xbf\xb1k\x13\xefzOP\xdfx3\x16XLj\xc2\xbd}\x90)\x12I3\x13;\")\xbft\xa2(\x86" -"\x8a\xb3\xe\xa5\xc3\xe8|x\xc3\xf0\x96!\x99H\r\xbc\xad\xbe\xf5;\xdd\xe4XI\xda\x85" -"zO\xd8[\x96h/\x1e\xde\xb8S\x84\x92\x9d\xeeJ\xfa\xf8LQ\xa0\x9f]W'\x5g=\x88Pp0?\xdb" -"G\xdc\x89\x8f\x87N\x10:\x9e|\x1e\x89\x41\x15\xdf\xdd\xad\x81T\x9csu\xd4\xae\xdc\xce" -".R\xc1>Q0\xb4\x7f o|Z\xfa\xf1\xf9\xee\x83\xda\x81\x88\xd7\xbG2i\xca(\nj\x2\xde\x85" -"0\xb\x93\xd8\xa4\xf6\xb4\x2\xfb]\xf5\x8f\x13'G\xc\xe1\x1c\xc6>\xce\xf2\xef\xaa\x39" -"jf\x80\xa6tj 8-\x95)\xb5\x8e|\xe6\x84\xb3\x9a\xc0\xfp\x86\xbc\xb4|\"0\xdf\x3\x43" -"\xbe\xd9\xb9\x15*a\xc9\x82j\xef\x9e\x0\xa1\x45-\x91\x30\\\xf0T\x90\xd4\xbc\xb\xad" -"\xc9\xc6\xfc\xbf\xa9?\xadR\xc3\xa8\x7\x5\xa1\x95h\x90IuW\xc0\x87>\xbd\xcf\x61\xcc" -"\xdd\"\x19\x35JOV!\xab\x33\xb1\x19\x32\x6\\\x1d\x99\n\x9bh\x85\x83\x31\xeexu\xca" -"\xc8U\xf9\x85\x63\xb1N\xf9\xe1\x6\xb\xea\x90\xf1\x95\xaf\xff\x94r\x8a\xe9\x35\x45" -"48\xda\xb3Q#\xd0\xe2i\x94u\x88M\xda\xfcs\x7\xa5\xcc\x6\x92\xf\x35\x34\x17(\xd8Ye" -"\xf5\xba\x86\xf2\x61\xcf\xfc\xb1\xe2\x9b\x42\x9f\x97ip\xd4-\x10\xe6\xaflKy+C\x84" -"\x12*\xef$H\xe2*X\xd3\xaa\x0wC\xc7\x13$\xea\x8\xd0h\x19\xfe\xd1J\xc1\xf2*O\xb\xe4" -"x{\xc8s\x8e\x1c\xef$\x6wW\x1c\x65\x80N\xd3\xe7H\xd7.\x89\xc9Ko1\xb\xe7H\xfa\xea\x31" -"\xee$hY\xca\xf7\xa1\xea\x17\xcc\xb5\xb2\x46\xc8~\xabw\x1e*\xc5\xd3xe\x1\x91\x8\x15" -"\x14\xdd\xc2\xc6hx\xe3vl\xb2\r\xc4\x9f\x63\xf'C\xa7\xfa\xec\xbe\x9d\xbe\x9e\x81Z" -"<\xb5}\xad\xf2\xbf\xf5\xef/\xce#\xa5\x62\x98\xa3\n.\x5/\xea\xef\xbdi\x81\x1\xf9\xdb" -"\x99&\x13pf\x93\xcb\xe\xfa\xf6\xf6\xc\x8b\xb5\xe7\xd0\xa5\xb\x33\x92\xb9\x83\x1e" -"\xf3\xa3\x4\xa8\x46\xcdJ\xf4\x31\xe9\xf0\x18\xfc\xd3\xa5\xb1\x63\x87U-U\xda\xeah" -"=6%t\x18\xaa\xa0\xe7\xbf\x8a\x3\xed{\xab\x11M|\x15\x11\x9elq\xc1\x94k\xd7\x90<\x1c" -"B\xe1\x15\xe9Ta\x90Q\xb8S\xbf\x5\xae\x31n\x15\xe6\x19\xa7\xde\xe4\x98\xf7q\xe8\x9" -"\xd9\x43Yi\xc1\x5\x64\x2r^\xf4\xc\x2\x0\xe0\x83\xf3\xecn\xe\xc2{\x8e\xd3\x8d\xfe" -"2\xea\xe^\x15j\xc3lK\xb9\xac^\xd1\x11\xa1\x16x3\x97\x3\xf1\xb9)\x93\x45\xae\xb1\xf2" -"Q\xfc\xef\xa1\x1f\xb3\x10\x1c\xc4\x99\x90}\xc8\x62\xb4\x46=U#\xb9\xb2\\[i\xf7\n\xb6" -"\xb2\x9c\xfc\x1d\xf1\xec\xab\x82'\xeb>\xd1\xf8\x82\xe9\xb\x12\x8\xe\xe0\x3qM@>\xc4" -";{TI\x14\x46\xb6\xa3\xddn\xb6\x41\xef\xbf\xef\x6\xc\x45\xe8s\xe7\x39\x80%\xb1\xcb" -"peD\x1f\x17S\x2\x8fo\x8cI\xa9h\x1\xc0\xd5\x98\xe0\x98\xea\xdc\x96\xa2\x11\x17\xf8" -"\x17\xb6\xfdniGd/\x93\xe2$%\xa0\xe\x8fkY*\xd5\xb\x31{i\xc0\xf9@G8jE\xe5\xeb\xc9P" -"O\xe5TQ\xa0\x1e\xb2\x9d\xdf\x9a\x41\xd4\xba\xd8_\xc8L\xe2\x80\x97\x1e\x83O\x6\xce" -"\xf4\x9c\x8c \xed,\xea\xc8\x89\xf1X\xcb\x14\xa8\xc0p\x90\x4x\x80L\xff\x1d\x16\x37" -"\xcc\x88\xc\x81\xaa(}\x83\x82\x83\x7f\xfa\x8f\x41\xff<\x9d\xf2\xf2,\xb2\x0\x44\xc1" -"q\xe4\x81]\r\xfl\"\xd1\x9aR\x11Nx\xc\xec\xd7\x1d\xaf\x63\x42w\x82\xe8^F=\xcb\x33" -"7\x89\xf4\x96\x34\xe\x8c\xff\x88Z\x9d\x9a\x42P\x11\x8b\x43\x9cq\xc6\xbeQ\xa9\x33" -"\x8b\xe2\x92Q\xaayN\xdcg\xde\xec\x63\x37\xfa\x63\xca\x9b\x3\xc1\xc9\xf7^s:J\x91\x86" -"F\xe7\xbc\x97\x92Hl\xb5\xa4\xbc\xc5\xf8O\xba\xbd\xfe\x33\x8c\x37\x92%J>\xea=\x88" -"\x90<,G\xb9\x1e\x7\x62Y\xdc\xcc\x8b\xd3\xdc\xa9\xe\xcc\xc8\x32\xc0\x9c\x45\x14\x1c" -"bB\x2k\xfe\x30\x90)\xa5\x62\xc3\xee\xf\xcc\xdc\xd4\xe\\\xf2\x65\xed\x9c=\xe5\x82" -"\x88N\xe\x14\x81\x9d\xb9\x8b:\xf7\x34\xb1\xb3'j\xc4\x1d\x43\x38N\xbes\x0=\x15\xce" -"9\xff\xcc\x4\x10\x95\x83\x39\xeG\xf\x43\x1b\x44\x7\xf9\x85P\xe1\x38\xf9lEd\xb4\x94" -"\xe5H\xfG\xc8S\xbd\xd2\x37\xe2s\x1\xf5^B\xa3\xbe\xd1\x8f\xad\xa1RW+{FZX\x1d\xbf\xe7" -"\xdb&\x19\x36\\\xf1mq\xbf\x8f\x9\x18\x62\xb9\xfc\xf0K\xf8\xd0\x85\x9av\xf4n{W\x12" -"\xf2u~\xdc\xe3\x32\xd3!;\x8a\x30\xac,\xe7\xd7y~\xefo0\x90I\x6\xb0\x80]\xfa|\xa3m" -"2\xa2\r\x98\x98XIzf\xcerI\x13\x93\xddy3 \x3\xd5\\\x9ZZ\xb5\xdfv\x1cK\xe5\xc0\x41" -"\xfa\x84\x7&=`NS\x9\x1f{k\x15IbE\xdb\xbe\xe9jc\xf1\xf\xc2\x97\x8d\x99\xe6W1(h\x93" -"f\xfe\x8b\xb\xad\xa4\x8bP\x18[\x86\x1b\xad\x3\xe3`\xf\"\xba\xd4'O%B\xb6\x35\xf6\xc7" -"\x94K\xef\xc3\xbct\x1b\xde\xf1\x1a\x8d\xd6Y\x3\x8c\xb4\xf\xef.\x16\xad\x1a\xe7\xeb" -"\xed\xb7\xd9\xba\x15\xfd\xcf&5S1PZ8m\xd7\x39\x9f\xb9\x99S]`a\xea\xbc\x61\xddv\xef" -">\xb4WDo)\xd0\xbbn\xc2\xfc\n\xab\xac \xb2z<\x12<'\xbc'\xa7\x63\x36\xd0\xa0\xa6\xd4" -"V\xda\x7\x3gM\x95\x9aJ\xfe\x42\x8e\"\x6\xa5\x11\xbf\xc8\x0\x39\xec\xd5nu\xf6\x97" -"\x86\xda\n\x80\x84\xd8\x1a\x66\x64M\xd9\x8b`\x18h\x1f\x1dp\xad\xe0\x9b\xd9\xbf=\x16" -"\xd6\x8d\xd5\xd0\xa0:\xe2m\xcf\x15RT\x9e\x45\x9f\xe1\x90\xb3\x10\xa8wk,\x84h\xc1" -"L\xa8\xb1\xb9\xa7\xaf)VPz;pZ\xd7Z\x17\xa0\xee\xa7\xfe\x8\x92s5<\xec\xd0{\xb8V4e\xec" -"\x8d\xec\xa0\xeb\x42\xf4?\xe3\x66N\xb5\xf3\x1e\x1d\x13$\x18U9\xb2\x8dP\x8b\xcd\x6" -"^\xd5v\xd8\x81N\xd3\xfd\x63}Wo\x2y'\x16#D\xaf\xb0%Z\x91\xff\xc6\x16\x94\x8eN5\x88" -"g\xe9\xfcv\xa9\xaf\xfa\xca\xeb\xff\xe1\x10\x80\x8c\x15\x32\xa2\xbb\xb0\xdb\xef?\x1" -"\xe\x45\xff\xc7?\"\x8d(\xf1.\x98G\x8b'9}\x8f\x45g\x81\xed\x9e\x19q\x1d\xf2\xe9\xee" -"\xcb\xc3\xfe\x61\xf7I?\xdf\x1aY\x12\x46h\xa9\x1b\xe5\x1f\x12/\x93\xdc\xa4\xbb\xd2" -"-\xee\xa3\x39\xe6\xed\xa3\xd6\xeb\xee\x3\xdf\x95\x81\x13\xe1\xcaI\xc8\x39\x8d,Y\xda" -"gd\x88.\xe3\x66?b\xa5Z\xe5\n~\x91\xb4\xfe\xad\x1b\x11\xfe\rP\xac\xcc]u\xf1\xa5\x15" -"\xf0\xc5\x36\x16\xa5\x0\xf1I\x13\x81\xdf\xd0\xe2G~@*\xb0\xcf\x9fg\xd5\x1\xa4\x42" -"b\x9c\x85\x93\xed]%\xa7.\xdb\x97\x46\xb0/+\xf\x7Y\xcc\x9c\xdc\xb4\xc9\xd8\xb4Q\x9c" -"\x8c\x61~V\x9b\x43/\xc\xf6\x89\x3r\xaa\x87\x9c\xa7\xde\x46\xe1\x10\xd9^#\nO\xeR\xcf" -"e\x81\x1cT6]\xf4\xa3\xe4\r\x81\x9e/\xd3y\xb4}\xa3#=\r\xef\xe\xfb\xce\x4\xad\x8b\xaa" -"8\x88Oji\xfe\\\x37>8\xae\xf\xd0$\x14\x80\xf2\xbe|\xcd\x18\xaf\x85\x91m'\x3\xa0Iw" -"\x9f\xe7\x39\x8f\xc4}4\x84T\xcf\x3\xf2.\xb3\xfe\xcc\x6\x46\x6\x95x\x98\xb5\x64\x34" -"d\x84TE\xc2\\\xc}h\\\x8d\xb0\x42\xaf]X\x82\x17\x43t\xac\xe9\x0\x81\xc6\x86x\x9b\xca" -"\x96\xac`.\xb4\x1d\x31{\xd6R)>\xe6(\x95\x18ud\x16\x61\xec\x86\xa2\xc4\n\x42\xe8\xf0" -"\x81:\x86\x1d\x41\xa0\xf5\x17\x8eUCe\x1c\xa0\xe9\x91PF-\xb5\xee\x0\x10\xf0\r\xe6" -"\xd5[\r\x7f\xd7\xec[\xae\xa2N\xd3\xe9\n}j\x5\x89v\x19\"\xb9\x1aj\x91:\x7f\xed\xdd" -";h%M\x89\xec\xf7g\xce\x8e'\xf9\x66\x42j\x8bO\xb1\xb4\x8S\x84\xfd\x9\xd6>(\x84\x5" -"\xb7\x8a\x64oD\xc8~\xee\"\xc8Yk\x13\x18\x80\x85G\x9fu\xf6==\x97\xa2\x8f\x9c\x83\x6" -"\xfd }\xbf\xd3\x8d\xed\xf0\xff\xeb}\xd8\xb*2\x92\xdf\xbf\x1e\xd6\x5\xad\xf1\xb3>" -"\x85\xb0\x10\x30\x9e>\xc0X\xfc\xd9\"\xb1\x32_\xeeq\xef\xf2\xdb\xbc.h\xdbR\xd5\x13" -"\xe0$\xc0\x1dG\xcf\x65{\xb6\x1c\x97\x34\x64\x9aJ\xb6<\n\xf4r\xe\xc3\xef\xcd\x82\xdd" -"<\xa6\xe8\xb\xb6;\xcf\x1b\x8d\xe8\x10\xa0\xc6\xc5\x17\xc6;v\xfeh\xc0\xb2\x86\x86" -"{\xe1\x2\x42O\xc3\x1cI7\x4\x8bo2=\x3\x96\x18Xo\xc2\x17\x31\x0]\x94\x9e}\x80*C\r\xf8" -"\xd2\xf0\xce\x99\xf2\xa2\x37l)S\xef\xc4\x18\x43U\xe4\xd1/B,\x9e\x1e%\xc4\xdf\x38" -"\xde\xa3\x34\xdb\xc8\x9bT\xe\x14\xc6\x1awi\xd7q\x15\xce\x89h\xfbv\xb2}\x8\x63\xce" -"\xa2Ig\x83\x11L$\xd4\xcc\x81m\xa8\x84\xd9S\xda?\x9b\x9d:\xf8\x93\x8b\xc6\x7\xbf&" -"\xa0q\x95l\xa0~jU\x9\xea/]\x80\xe5\xcb\xeb\x98\x4\x1b\x19\x7f\xacv\x9v\xeeu\xb4p" -"\xdc \xaa\x2;\xa3\xf6<(v\xeb(\x1f\xf5\x17;\xb4\x90\xd6\x81V\x4Qz\xa1\xb1\xfa\x6\x31" -"@\x1b<\x1a\x4\xca\x10>,\xa4\xec\xcd\x83\x87M\x9c\xfc\x8a\xbc\x13L\xc0\xf9\x14\x1d" -"\x9a\xfaV\x84\x8b\xf2\"\x34 \x16\xc5V\xc1K4\x82H-\xce]\xbn\xf1\xabR*\xa1\x81+\xdd" -"\x8d\xd3\x39~\x5\x32~\xc1'H\xfcH\x8\x42\x9b\x97 .$\xe1\xde\xc|\r',\x4k\xa7;7\xd3" -"\x9\x30\xc5\xdeZG\xd9iU\xcb\xf]\xed\x8f:\xd9)\xa8\xb4-(9\x4X\xf5\x91\n\xf\x93\x61" -"\xfy\xed\xdb'\x7\x89\x43\xdf\xe1|qme\xf9\x65\x89v\x93I\xf3\xb6j\xb7\xb8\xc0\x4\xcc" -"\xc5\x9e\xf6\x88\x1ft^\xc7\x12\x98\x65\xa7o\x9c-\x2\x9d\x46`\xcc\xfbM_\x9d\x41+\xa3" -"7*'\xcb\x17^\x9d\x65\xf7YW\\\xf1JX\x99\xa8\xd3\x1f\xf0\x39\xac\x2\xdb\xd8\x39\x1c" -"3\x97\x42\x8a\xc0\xd5q|\x0R\x0y\x7\x85\x35H\x13\xc8\x85\x9b\xe9\xe\xe\x17\x91Ol\xb9" -"\xc6t\xf1\xe9\xa9\x64\x86W\xb5N^\x1fRulO\x98-\xf7Ns\xf6\xe4\xd4\x7\x18\xc7\x1d\x1d" -"\xe$ \xfbtb\xfe\xc9\xe4W\xc0\x41J\x96\xe4u\xc6\xbe,\x10\x43p\x96\xfc\xa0\xc9\x42" -"\xe9\x95\xa9\xad\xa7\x89\xab\x63{d\x87\x81\xd3-\xfbh\xe6.\x91\xc2\xce~\x13h\xf\x8d" -"1\xec\xf8\xc8$\x88_\xa7\x61\x89\x81\xcd\x5\xfb\x33Z\xa1\x11\xb4\x9\xc5\x9e\xe3\x37" -"\xdfN_\x9d\xcc\x92\n_\xc0\xd6 \xdc\x7\xf2\r\xad\x63\xf4\xff^\xe\xe5\xa2\xf3\x90\xaf" -"\x1c\x32\x12+\xa7x\xf!\x2)\xe5\xa5\xe3\xed\x97\xbc\x1c<\xdd\xdd\x45ns\x9c\xa7\x82" -"\xed\xbfK\x81\x5R6\x8e\x9csK\xcx\xb0\xb8\xe3\xf8\xb2\xddx(b\xb7\x43\x18\x87\x1b\xb1" -"\xef\x8x(\xcc\x17={\x4\x98\x11\xfc\xf5\x98\xb8\xef\xdeM\x9b\xc5\x44\x7fHH\xc9\x80" -")\xc8T\xf3\xae\x46\x1b\x9d\x46\xdd\xad\x8c\xe6zR\x1f<\x81\x1a\x81\xa3\x96\xcb\xf" -"\x80\xf3\xc8\xd8\xec\x88\x30S/\xb7\xf9\x62O|\xae\xf\x8cm\xf8u\x7\x33\x33\xde\xb2" -"\x8a\xaa\x90\xaa\xf4\x86\xab\x8c\x93%S\xcei{\x88^q\xec\x8e@\xc7\x83\\\xd5\xd5\x9a" -",i]\xb9\xe5\x12\x16\xff\x9bw\xa1[\r\xa6\x37\x17\xff%\xb0[\x93\x9e\x45\xcf\x7f\xbe" -"I\xeQ\xe9\x34\x42\x13\xb3.\x11\\-\xe1Mv\xdf\xd5\x84P\x88\xde\x64[\xeu\x4*a\xd8/\xb1" -"uZ\x9kh\x1d;\xc5\x1a\x9f\xf3.\xba\xff\xf7\xec\xa8\xb5\x9d@\xf0" -"\x93~\xef\xf3\x83\x12\xaeWF,{\xf3\xb1\xfe$\xd2\xba\x8d\xfe\x84QRp\xe0\x90\x63\xce" -"<\x80\xdfI5\xe4\x9\xf6.\xb4\xf5J\xf1j\x18mC)\x97+\x9b\xdf\x15\xfb\x8\x46\x1bh\x8e" -"\xd4\x99(B\x92&\xca\xd9\xf6|\x9d\x63m\x13u\xcb\xb7\xb0\x8aV1\x95k\x7f\xe2\x9c\xc9" -"\xef\xa8\xd7\\\x9eI\x19\xc8\xc2\xc5O@\x1d.\r{\xfb\xa4\xcP\xca\xe2\x14\xd2\x10\xc6" -"\xf3\xeaX\x2\x33\x9f\x63\xfcL\x1c\x19\x95xv\x17\xf3\xec,\x80l\xe4L\xf8\xe2\x9fv`" -"l\xd5\x83onZ.B<\xd7\x91\xbe\xcd?\x11/%e}\xfe\xd9\x36o\xc4\xad\xf9\xbh\\\xceJV\x98" -"\xe5\xfe\x16\xd7T+\x91?\xbc\x1\xb2\x88\xdd\x13\xf4=\xb2\xb1\xed\x8c\xcb\x80\x15\x9d" -"\xbd\xc9\n\x81\x32\x12]\xf8\xdfT|HQ\xca`\x9d\x1foMdwA&\xe\x84[Ey7xx'\xa8\x9e\x37" -"\xcd\xa0k\xb1\x91\x66\x9a\xc8K\x86\x8\xea\xe1\x32\xd1\x1w\xf3\xfc\x38I\x80\xf3\xa6" -"\xe4\x39\xb0H\xa3\x8d\rk\x9c\xef\x9\xf3\xf2\xd7\x32\xaaq\xbd\x5\x81i\xd6\xd0\xf8" -"\xc9\xd1\x46\xd9\xda\x4gt\x2uY\xa8\xb3\x84?a\x16\xb4\x18\x42~xGj\xd8\xf0\xf8\x1e" -"\x8ak\x12\x9\x80`\xff}\xd6\x86P?\x97-lB\xfdl\xc2\x9c\x8:\xc3\xd7.7Q\xf2\x1d.D\xa5" -"r\xee\xc8\xe\x81\xee\x44\xc9\xf\xaaz\xfa\xbc\xd3\xec\xeb\x98\xfd@h\xf6\xc3\xa4\xde" -"\xd0\xe6\xce\xc5#\xc9\xa0\x5M\x1f\xc2\xa8\xd6\x1aJ&\xf9\xbc%\xb\x8f\x30$\x16\x92" -"J\xb2.r\"\x97\x88\x8b\x85\xb9\xc1/\x8d\xfd*tL\xbd\x14?\x9b%\x14\xc1\xcb\xe9\x88\xd9" -"\xcbNw\xd9\xb.\xfd\\*R\x83U\xa3_|J\xf0\x39\xc7\xd1\xd7V0Yg\xb8G\xd4\xac\xbb\x81&" -"=I\x92\xc0\x1\xe2\xa2\x62\xb9\xfe\xe2\xd1\xf5\x2+\xe5\xb1^\x1d\x8f\x1dg\xbcR\"sD" -"\xee\x91,\x1\x8c\xb7>_G\xce\xd5O\xd2\x2\x62ww\xbbw\xaa\xcf>\xe6\xb2'\x6\xfb/\xa9" -"\x6+\xee\x87\xe2,\xd2\x80.w\x6\x32&H\xda\xa0\xc6$\xea\x88T0\x17_tn\x1fSo\x9a\x8e" -"\x1c\x61\xcJv\x1d\x7$\x84&\xdb\x63\xc9\x31\x9a\x88\xa3\xfa\x44\x9c?\xb8\xac\x94\xc6" -"\x0\xdd\xd6\xfb\xebSJ\xf1_t\xf6n\xf8" -"\xd1N\x7f\xf7}\x8a](L\x82\x2\xddZ`S\xce\xaa`k\xf9%\x99#\x82^\xf4\xef\xfa\xa8\xd8" -"xe*L\xaf.\xe4>\xd2k\xf3Y\x4\x2hl\x87o\x86\xc1\xae\x95\x4nRv\x17\xcd\xd3\xc4)\xbd" -"L\xc3\xf9\x65M,v\xdd\x41\x2G\x1f\xf7\x46\xfa\x9f\xa3y\xb1m\xf9k\xfe\x38\x36\xd4?" -"\xcc\xb\x8e\x95\x12\xc'7\x0I\xac\xa4\xac\x31>\x1dP\xd7-\x18\x14\xf2Vk\x8b)\xfa\x9c" -"\x9c \xd0H\x87\x43r*vd6wg\x83\xb9\x39\x17\x1f\xff\xa0\xe\x4\x80Z\x8bX!MO\x11O{\x9c" -"<\x17\xcet\x86\xae\xa2\xbc\xc8\x95\xec\xde\x80\x95\x2\xbd\xe5y\x81\x31\x8a\x93\xf2" -"0\x16\xf0V\xa4!\xb7\x33\xc4Y\xe\x34\xab\x8\xbb\x34\x8d\xa4\xa4\x8f\x19\xb6\xbe\xfa" -"\xa1\xdd\xd2\xa4\x9alD\x4\x43\x2\x83\x33\xcd\xd4\x8c\x85\xcdi\x8a\xda\xf3\xfd\x86" -"vs\x9e\x44@\n\x98\xb5u\xbe\x2\x35\x5v\xf9l\xfaT\xd4\x18K\xa4uU\xb8\xd1#t\xb8m\x3" -"\x8d\x8_\x7f\xa5\x1f\xf4\xbe/\xf5\x98\x14\x8\x99\x9bH\xb2\xfa\xf3\x5!.\xd5K.7\x1f" -"Z\x0t\xcfh\xd1\xb0\xe5\xcd'\x9b\xbc\x8b\xba\xefiJ\x89\xa6\xc4?Q\x8d\x1\xbbN\x84\x2" -"\xaa\xdf\x34\xe9n\x9b?\xcc\xabL\xbe\xa2t\x1d?\xd9\xad\xf7\xaf\x32\x38\x8fwq\x84Z" -"\xf9\x99\x65\xa6\x7\x8fM\xa3\x35\xef\xa4\x36\xbe\x36\x90>3\xa7\x43\xc1\x12\xc0&s" -"\x9\xf2\x66\xdd\x44\xfa\x99\x8c\x9a\x13\x97\x4\xe4\x0\xb8\x9d\xab\x95.\xec\xfe*\xc0" -"\x9c\x82\xd9\xf4\x97Sq\xcc\xc2}\xa3x\x90\xec\x84\x12\x31\x93\x31M\x8azp|!\x7f\xfc" -"\x95\x1aT~\xe5\xb6\xd1\xb7\xc8\xed\x85\xbe\xbd\x9d?K\x9b\x9jx\xe5\xf7\xdf\x88\xc9" -"1\xe3\xf3\x96\x97\x39tENY4\xc\xa5\x1d\xbf\xea\x1a\x0\xde\x8Kdc\xe&\xc6\xd6\xa3Y;" -"\x82\x88\x14\xe2}\xb0\x18k\xf2\xa8~\xef&\x8a\xa1\xb1\x35\xac\x9\xb5,\xfeS\x5\x1c" -"\xbc\xc8\x8c\xecVW\xbdG\xf6\x3\xc8\xe1\xa6$\x91\x61hO\xd9\x8J\xc2y\xf5zO\x9b\xbd" -"\nTj\x87\xe1G\xb6*\xc8`\x91\x19i\xa2\x9b\x8a\xa2\xe:\xaa\xd0\x7\x9d\x64\xe6\xbf\x1b" -"\xf,\xe8\xf0\xc5L\x90\x19 ~\x1b@3X%\xb6,j\xfa\xd8\xa0\xd7\xad\x16)" -"\xf2\xce\xca\xd8+\x8f\xde\x38\x97S\x3v\x8c}:\x8\xb9\x14x\xed\xb3\xc4Z\x8ckw%\xea" -"\x85\x96\xa8\xedP\xb8\x35_\xb8R\xfb\x89\x66G\x9d\x12\xe1\x8\x62#\xb1\xe6R:e\xfb\xa8" -"\x1d\xd1\x6\xfe%Os\x9q\x87h\xab\x0\x9f\xf7qJ\x8c\x36;\x9\xdd\xa7<\xd3\xf8\x1b\xf9" -"\xc0\xcd;\xc\x80l\xf3\xb7\xbb\xfa\xb7>F\xfa\xca\xd2H\xe\xeb\xa9z\xe6\x8e\xc9M=y\xaa" -"\x1\xec\xc2 g\x85\x8e\xff\xa9\xd7\xb7\xf9\x97\xab\xd2\xceZ\xaa\x87\x81\xe5I\x9e\x85" -"\x80\xc4\x5h\x1c\xc6>\xeaS\xbbG\xe5^\xcc[\xa2\xa7\xa3\xc5G-\xf0\x34\xb0\"\xf4U\xc6" -"\xf\xff\x97\x1b\x1X:)\xe2\x11\xa8\x7fqc\x18{\x19\xb\xc\x10\x83\xd6\x96\xb5\x86\xe9" -"C\x8f\xd8\xba\xa4Q\x1\xa5\xed\xcd\x1b\xe5\xab\x9aXU\x11\x8\x9d\xda\xc8\xdf\x1b\x1f" -"\xdb\xe5\x82\xab\xd9\x45\xe6\x7f\x99\xad\xc4\x45)\x88\xa9\x85\x9e\x39\xc9\xe\xf7" -"\x94\xc5\xc4\xe6)\x97\x8[z\x16\xa0\xd9\x1\x7\xd0\x86\x10\xba\x17Z\xd6\x63w4Vb\xda" -"}\xa4\xd8\xfe\xf8G\xee]W\xe3\xacT\xb9(\xa0\x95|\xc1\xc9\x44\xe7\xff\x14\x65\x8f\xe4" -"\xa6\x41\xcd&\xc6\x11\x5\xc0\xf1\x36\xa7YPvKi\xca\x17P\x9e<\x19\x35\x1d\x45k\"\xc8" -"|U\xe8\xdc\xc4\xac\xd3\xe1P\xd9\x36\x33?\xf3\x64\x99\xadk\x2\xb6@=\xe0\xf1)\x1\x30" -"\x1e\xcb.\xba\x10\x32K\xa7+X j\x13\xb8\xf3{\n\xeb\x12\x11]\xc\x12\x87\x9c\x8e\xa8" -"\xa2\xebp\xe8\\\x95\x43\x45\x64\xba=\xffH\x1c\x89rX~\xfft\xee\xbb\xba\xb1O\xb3+\x8a" -"\x84\xb8\xfc\x42\xeb\xec\xa6]%\xe8\xc3,\x19\xcaYb\x83+\xf4]\xfd\xa4\xe8qP\x8a\xec" -"1\x84\x95\rm\xbe\x89\x1\x9c\xea)\xe4\x4\x84\xc3n3\xd7kubUS\x1a\xdd\x1d\xb2L\x3\xb2" -"\xa6JG\xbd\x8f\xba?\xdc\xb1\xf5\xb9o\x8e\xec\xb6\rX4\xab\x0\x1apt\x4\x98r\n\xfbn" -"\xc0\x34\x45\xcc\x35\xb5\x1fy\x87\x10\x96\x18\xc6\xc7\x8c\xbe\x30\x41\xbe\xdci\xb6" -"\xfb\x12\x81\x42\xce\xc5\xc8h;U\x8a\xfe\x30$\xef\xf7\xa1-\x4\xefY\xa7.\x15m\xf1\x1d" -"3\xab\xa0\x8a\x8e\xeb\x16%\x9d\xd9R\x9c\xd0\x3\xadN\xf4\x13{o\xf1\x65\x42\x36G=\xfb" -"\x93\xf5\x97\x33\x1a^&\xc7yoR\x8f\x65\xc9O\xe0{;OM\xd4\x90\x34\xfa\xc\xc1\x89\xdf" -"\xcd\xffp\xc2\xf1\xc6\xd3\xdf\x30\xae\x10>*\xc5\xcf\xf2\x6\x64\xab\x93L\xe5\xc1\x96" -"\x93) q\xc9;\xd5\x90\x38>\n\x19\x31\xe0M\x1d\xdd\x18\x7\x1d\xaf\xb6(\xf5\xd7G.E{" -"\xf8\x1d`d\xed\xfa\x8d\xeb\xff\x91p\x1cP8\xcb\x30\x86]a\"\x7j3g2\xdb\xcd\xb0\xa6" -"%T\x87s\xd0\x1\x36H\xa7o\x7\xbb\xdc\x9c\x16(M\x15\x8e\xc7\xa1\x5\xae\x37\xa6\"yA" -"\x9c:/6\r\xczt\xd6\xfd\xd0\xe3m\xca*\x8b\xd5\x99\x45\xa4\x19\x65\x98\xf6\x90\x87" -"\x8f\x84\xc8\x94\x85,\x18\x11\xaf\xeaK\xe3\xb9\xf6\xa5!\x9e\x66(\xc6\x66i\xdb\xd8" -"\xfa\x9a\xc\xfc-\xdew\x16\xa3V\xfcO\xb2q\xd8\xa2\xcd\xdc\x8d\x46\x84\xde\x44sU\xbc" -"z(}\xc5hR\xa6\x38\xc5wx&\xebn\xb7/\xac\xcc\x86\xf8\xb\xed\xdd\r\x64\x9a\x88<\xfe" -"\xefMtu\x1r\xa9\xb]\xd8%%\x92\xfc\xfe\x19\xff\xaa\xd8h\xe9\x95\x62\xda\xea\xe7\x5" -"\x14\xf5\xde)n\xf7\xb5~o\x19\x37\x37\xab\xb6\xaa\x31yVXD#\x81~\x11\x66Jg8\x91\x97" -"\xad\x9f\x8fw\x1e\xa5\x95Q\x98\xc9\xee@\xa0v\x16\x39\xe6\x38\xce\x9d\x89\r\xf4hd" -"&p#_\x13s\xd3\xack\x1f\x43\xb5w\x7f\xc0\xa9\x1a\x96\xe0\x95\xe8\x9b\xb9\xfd\x62\x61" -"M\xe4V\xcez\xfdk\x85Q\x12\x36us\xfd\x9f\xcb\xbdJO\x9cgng-b\xdd\xd3J\x9b\xfe\x83\x11" -"\xb6\x17Z\x0<\xd1\x43\xc0\xdf\x15\xe4\xc0\xb4\x8csT\x4\x8nH\xae\xedko\xa2\x1f\xd9" -"\xf4\xb\x84!]\xff(\x7f\x6w\x90N-\xdf\xdawJ@\x19\xdf\x45\xcc\x87\x7fU>\x95\xa1\xc6" -"]\xf1\xd6{\xc0\xc6\xe\xb\xbaM \\\r\xa3\xda\x80\"\x9f\xddq\x85\x9f\x65\xad\x4Pk0\x8c" -"+x89\xf3\x1c\xfe\x44%&2$\xf0\x8c\\~\x98\xa2\xc9\xd3\xdc\x8e\xa5\xac\x19 \xf4\xe3" -"\x95\x41\x32\x62\xe0\x83k\xc0\x19\xa0\x92\xa0\xde\xca\x10N\xb2\xdfkc9*\xe8\xe2\x13" -"cy\x14\r\xe5\xfc\x98\xb0\xb6\x98`\xfe\x8e\x31\xda\xb5\xc5\xdfx\x7\xd1\x9b\xea\x34" -"\xac\x14\xe0\xab\xc6\xf6Q\x9cQ${\x10M\xe7\xd9\x12\xc5\xbfn\xf1\x1bH\xfcm\xf8\x45" -"\x12\xe9\xf5\xfe\xbbH\xf7/\xf1\xb7\"\xbd\xc3\xbb.\x83[.|\xc6\x32K\xee\x84\x89\x39" -"\x96\xb8\xdc-M\xc2y:Oi\xc1\x8e\x63\xda\xf0J{\xb5\xc0\xa9\x7n-Z4>\x13L\xc3\xc8\x9c" -"G\x12\x90\x6V\xff\xc2\x2\xe1\x98\x85&\xd8\xc\x7f\xd9(\x1f\xe4\x7f\xba\x8a\xb5\xd0" -"%\xe6:\x84\x5\x1fk\x13\x16{\xec\x15\xb3\x46!,\xbd\x5\x1a\xfez\x98\xbe:$\x91\xf3\xc4" -"iq\x8aX\xe7\x83\xed\x91\xf9\xe'O\xb4\x97\x8f\x87\x19\xe9*\x99\xa1\xe8\xf1\x42\xea" -"~\x1f,F\xaf\xf0\xa2\xfbP\xf4\xd1\x5\x13\xc\xe8\xea\x30\x9b\xeH\r\xc8\xf8\rPar\xb6" -"\x9\xeaK\xb4\xe2\xbb\xae\x98\xd8\x88(\x14\xfb'>i\r\xa9\x90\xb6\n\x9c\xda \xa2\x41" -"\x82\x46\xbd\x10\xaeg\xd8\x46\xa0\xfa\x81Z\xc2XX\x14Z\xdd\xa1\x6\xa6w\x8a\x11\x87" -"\x7f\xe5\x9a*\xbe\x30\r}\xb9\xbb\xab\x31\xcb[\x96\xb~N\xf9\x1d\x46\x0\x88m\x87\x95" -"\xdc\x36\x1c\xbd\xdd\xde\x5\xeb\xd5K\x19\x41\xf4&\xf7\xfa\x83\x99'\r/T\xc9\x98\xbe" -"\x92\xd1\x46\"rp\xa8\xe8\x9a\xf9\xcH\xba\xfcN\xcc\xca\x1\xe6\x32*\xfc\x16WCG^u/9" -"\xbd\xae\xc4\x92\x97)\x5\x10\xff\xa2\x64\x34*\n\xfe)\x85\xf8]\xee\xc6l6\xebJ\x1d" -"Fh>\xe7\xc5\x91\xa8\x9b\x81V\x9a\x85\x66\xaf\xbc\xa2h\x10\xdd\xb0\x97\x5w\xa7n\xc8" -"\xa0\x66\x62&\x6\xb0\x83\x15\xdb\xf.lg\x1f\x32Y\xc7\x36\x37\xd7s\xd1\xa1\x80\xaa" -"\xd6j\xda\xda*e\x95\xb5\xf4\x81\xe5\xf5\x9eQ\xcb\xa8v\xfa\x6\xd2\x1e\x1dgL\xfa\xb4" -"j\x2\xd2g\xe2\x2\x34\x32M\x8\x91\xe7\x84|\x13\xc6\x9b\xfc\xee\xa3\xacU\xf2\xea\xf7" -"Srk\xce\xb0\xde\x1e\xec\xf4*\xda\x96K\xf9\xe4u\x95\x33\x2\xc2\xfc\xa8\x4\xb7\xbw" -"\x94\x82\xdc\x93\x19\xb4\x3\x81\xe0\x9c\x0\x96\x46\n\xe1\x13\xc1\x9a-\xc9\x15\x7f" -"\xa1\x38\xcf\xewX\xf7\x10\x8\xe7\x1d\xfu\x99tMd{\x9\xb1n\xbf\x14\x37:\x5\x87X\xc4\x42\x93\x9d\x36wD5UHQ\xe9Q\x9b" -"o\x9\xc3\x1e\xf2kl\xd9\x97\xda\xfa\x11\xda\x91\xfa\x97Y\xf1{py\x16L[G\xb9\x9c\xcb" -"z\x87o\xba\xb1\xd0\xd5\xd1\xe1\xa2h<\xd6\x91Nk;uY9\xce\xf1\xc9\x16\x8d\x30\xb2s\x8c" -"CIe\xc\xf8l\x90\xd2T/\xc9\xb9\xf\x36\xa4\x94\xc0\x35\xa1\xc8m\xd7\x16\x1J\xa1nk\x9e" -"\xc7\xaa\x3\xb1\x65T\xbe\xc4\x36Q\x1d\xd3\x9\x7f\xab\x1f\xd0\xcdI\xed\xab\x96\xf7" -"N\x8f\xd2\x64\x0\xfct\x8c\xbd\x9e\xe1\xee\xae\xe2M\xa3\r\xb6\xf8sKR\x81\x8b:^Q\n" -"\xa5\xc1NB\x6\x8\x98\x3>~6\xcb\xa9\xa6@B\xcf\x94\xa7NKR\xe3z\xc0'\xc0\xdci\xba\xc4" -"\x94L\xce\x12\xe7\xad\x81\xae\xdc\xe6\x42\xec\x34\xca#\xe3\xff\x7\xb8\xcd\x35\xdf" -"\xf1\x9f\x33\xc8\xd4\xdb\xb5jRSO\x8a\x82{\xe4z\xd4\xae\xdc\xad\x83\xb2s8@\x9f\xd1" -"\x10\x1cM\xff?\x12\xd3\xdfy\xad\x1f\xce\x65\xb2\xf4\x19\x45\x1d\xd0Y\xc8\x8b\xf0" -"fA>#\xde'\xd3\x62\x1d\xac-\xcc\x8f\x9f\x36 \xda\xd0\xf4\xb1\xa6\xe8\xc9\xe6\xe8\xad" -"\xb5R\xe1\xeb,K*;s\x98j\xd5>\xd9\xed\x89\x11\xf8/u\r\xf0\\\xd2\xeb\xa3\xe1\xb0\xdf" -" \x8a\x87\xfb^\xd4L2\x96\xb8\x3\x88\x1c\x1d\x97v\xd1\x33P\xcd)\xc3\xf7\x16\xf0\xb5" -"\xa8\xb8Ux\x12\x2K\xa7\x0i\xbe\x65\x89\xaaW\x9e\xad\xb1\xf6Wq-\xf2W\x8\x43\xd7\xc5" -"\xff\x7f@\x9\xd4\xd2\x32\xd3T}\xc8\xb9.\xd5\xc4\xdbw\xb7\x62U\xe6\x61\xff\x8b\x16" -",a\x91K\xd7\x96\xef\x8a\x8s\xf7\x9f\x96" -"O\xde(\xb7\x92\xba\x99\xa2\xc?\x1f^\xd1\xfd\x18\x9f\xb1\x86|\x84\xdc\xd6\xaf\x43" -"\xd4\x94 \xc8\xb1\xf3\xdc\xe7\xdb\xaeq\xde\xb1\x7f\xe4VD\xdb$OD\xb1\x1\x1c|v\x8e" -"\xbbrT\xf4\xda\xca\x64\xe9\xba\x87\xaa|\xd0\xf0\xc4\xb2\"\x8f\xfb\x9e\xbd\xcf=\xde" -"M\xce\xd3\x93\x99\xff\xeb\x34\x88\x11T}\x2S \xa8\x8bH\x9\x43\xa3\x39\xe2\xcd/\xa3" -"`Z\xaa\xe8y9\xb1\xd7\x90\x14\x65\xa1\x87\x9b\xcbL[\xe1\xa1y\xe7\xe3q\xf1\xba.\x8" -"D\xf8\x8a\xfb\xae\x9bx\xdc\xcaG\xae\x8a\xed\xf5\xbd=E\x8c}Jz\x8\xac\xcb\xf8\x80\xd1" -"\xf1\xdci\xc6\x36\x62\x8d\xf1\xeb\xdc\\\x42\xff\x88\xff\x8b\x66\x35\x1f?r\xd7\x3" -"\xe5/<\xe9\x1eN\x0u\x97S\xa5\x99\xfd\xd8\x63x\x8e\x99\x85\x84\x98\xb6k\x93\xe5\x8" -";\xc3P\x1c\x39\xa9\xba\x92\x8b\rv<(\x82o\xd2\x37\xe9I\xef\xb\xa8\\\xca\x9a\xa2\xc" -"@]\xb6\xd5\x61-\xb7\x18\xf7\xb4\xad\x31\xd2S\xae\x30nM|\xb6\x15\xc5\x9a\xe6h\xd3" -"G\xa4\xe6\xf\xff{\x10?\x8b\xd0\xe7\xcb\xdb\x14*v;\xe8\x8a\xb4\xe\xefk\x8f\xc2\x0" -"E\x8dr\x89\x30\xad\xf\x94\xfeR\xac\xbf\x6W\xc4\x90|\xc7\x94'\x10\xab\x1f\xd8\xbd" -"\x14\x9a\x9c\x9d\xefk\x8d\xca}\xb9\x6*\xa7\xb1\xb0\x11\xab\xb5\xaa\xe8\xb7x\x93\xa0" -"#\xf9\xee\xee\xd4\xa2\xf\xbc\x30\xf9\"(*z\xe2\xf1\xac\xff\x64\x15\x10\x13\xd6\xb8" -"\xac.\xaa\xe5\x81q\xa1\xf\x80\xbc\x18\xc3\xbb\xb5\xde\x1e\"\xeb\xe6\x3;\xf8\x30@" -"b\x90#\xd7L\xcb\xab?\x19#\xcf\xa4\xa6s^\x1d\xfa\x8a\x1b&\x1f\xbf\x1c\x39~&\xf3\xba" -"\x9c&)\xcf\xda\x84\xdf\xa3\xd1\x8~\xbb\x19\xdd\xa7\xe2\xd7n0\xdc.\x15\xb8\x82\x1d" -"R\x91\xda\x1d\xfds\x94\xeU`\xa8\xa6\xdc\x91\xbe\x0u\xe3\xed\x8d\x9e\x8c\xac\x85\xac" -" v\x8d\x86\x8c\xd2\xdc\x45\xde\xad\xcc\x8bY\xaa\xben\xe5\xb2\xf8\x91\xe0\xd7\xcb" -"\xae\x82\xf\x83G\x93\x32\xbf\x97\x7Hf\x98\xfe\x19lr\xefr\xb5/T1C)\xfcI\x81qx+\xf1" -"`\xe1\x11\n\x19\xb8 \x8f\xc5\x91\xef\xf\r\xa7\x1a\xf6W\xb4:|\xc6I\xa8H\x8bu\x9f{" -"i\x13KO\x9d\xcfy\xda\xeb\xc1\xceR\xcc\x80\x15\xf3$\xc9\xd4\x63 \xf4N\x15Q\xed\xa6" -"\xd8\x61\x39\xdf\xd1\xdb\x81L\xf3\x8a\"\xa8\x9f\xab\xb4\xf7_\xb8\x96\xb0\xev\x98" -" \xf7\x63Hn\x86\x66\x82S\xcc\x46l\x15)\xa5\xa9$\xcc\x33|HD\x88Q\xa3\x81\xdc\xef\x63" -"\xa0\xa3\x2\xb6R\x3\xd6W\x1a\x1d\xd1\xfb\x9d\xc0\xc3\xbdj\xefH\x91Ip3\x10\x9c\xeb" -"ZH\x1b\xfe\x44\"I\x94\xe\xc5@\x96\xf1\xd0\xf2\x43m\x9e`I]\n\xcf\xf9g\xa7\x41\xb3" -"\x4g\xd2J\xc6\xb0\x3\"\x13\x18\x66k\x95\x1e\xfd\x45\x32I\x87\xb1\xb\xefJ\xaa\xf\xf1" -"\xdfh\x87\x37z\x7fp\xf5U\xdf\xb9\xff\x10\x1\xc6t8\xa1g\xa0\xb\x5\xd2\xc3peeQs\xa7" -"\xed\x9a\xe3\x42\xdf\xa1I\x7f\xb1\xf2\xfe\xd6\x9\x89\x1$\x9a\x8]1\xb6m\xbbj\xc2^" -"\xf1l\x10k\no\xf3G\xcd\xf6\x64\x34\xdc?\x0\x12\xda\xad\xe8\xb\x94-R,\xd5\x9a\xf4" -"\xc3\x1c\x1c\x6!W\xb3\xd0\x0\xb9\xcb\x86\xe2\xaa{J[\xf3\x16\x5\x8a\rZ\x14\x8e\xaa" -",g\x97\x7f\xaa\x9\x66\xe4\xc3\x45N\x8\xdf\x14\xc2I\x8a\xd7n8\x9a\xf6],\x13\x9am\x86" -"u)\x8c\x46\xac\xeb}\xbei\x4\xc3s\xc0n_q9\x9b.\xda\xb@\xab\x96\xe8\xbe\x99\x1d\xdc" -"9\xf9/\x1d$y\x7f\x9e\xc9\xf2\xfa\xe2Vi\xb4\x37T\xe2I\x8e\x8e\xa5\xc4K\x17l?\xb3\xe8" -"\xf7\xa7\xa1H\x12u\xa4\x61\xf2T\x9a\xfcL\xc7>(A{\xd8\xc5!,\x13\x10^\xab\x96}\xaa" -"g\x9a\xe8\"\xb9\xb7[7*\x99\xc7\xe8-k\xd8:\xa2\xba\x0\x31M\xa4\xacQ\xb9\xca\xa3\r" -"\x80Pu\x5\xbe$\xba\xd0\xa8|]]s6\xed\xf6\xc\xcaL\xec\x82\x1\xd2\x43\xc3\x93/t\xd1" -"q\xe2@\x9dx\x9a\xad\r\x4\xa7\xbb\"\xfbm\xc3\xab\x92\xae\x33\xff\xea\x89|HMt\x10\x39" -"\xf3\x8c\x31~\xa3\x96\xa0\xfb\xb9\xf1Z'\xd8\x7f\xcb\xe0\x7U\x87\x99\xba\xb7\x32\x12" -"\xb6\xe5\xfa\xf2\x8\xb\xa0trN\xac\x87\xd8\x81\x66\xdb\xc1\x46L\xf5\xd4\x1b\x99\x42" -"\x88Q\xff\x1d\x99$iDQ\x1c\xf4,?\x92HQ>\x9eQY?%=\x89\xc6\x4\x38\x8a\xd7\x13-j\x16" -"\x9e\x9d\xd8\x88\xe0 \xac\x1f\x8b\xa6\x6\xf2\xe1\xeb\xb9yw\xe5\x5\xd8\xc4\x8Se=\x8f" -"9\x8fq\xcc\x9f\x8f\x9cT\xc\"\xa1\xe6\x19[\xa5x\xaerb\xfc\x84_\xcc\xf7{3\xf3>\xef" -"&d\x89\xaf\x8b\x81\xa6\x15\xd6\xa1\x34\x64\xbc\xa5\x8b\xec\x16\xc2?1\xd6x\xf1J\x93" -"\x8b\xec\x31'-\xac<\xcb\x1b-\xaeWz&\xbe\xd8R\xfcY\x84\x31v\xa5\xfc\xfc\xfa\n\xb7" -"\xfb\x0\xd2\x30\x9d\xe5\\\x82\xcb\x90I\xf4O\xa6\x1f\x1e\x31\x32\x5\xa7\x63\x17\xc4" -"\xcfR\x9a\x44V\x1\x9d\x97\x6$\x12\x96\x81\xf4j\x9c\xd7\x95\xb\x8b\\@a\x85\x30@\x11" -"<\x81\x15\x31\x9eh\xb3\x7f\x88\xd8\x64\xc6\x95}\xf8\x13\xb3\x5\xd0\x9ej\x17\x16\xb1" -"\xf&\xf2\xef\\r\x7f\xc7z\xab\xbas\xe1+Z\xe6\x41j\xb1\x9f\x65\x63\xce\x14\x4kq[\xd4" -"\xcb+\x1eM1_B\xd1\xft\xcd\xed\xe8+\xcd\xd5$\xa1\xa5\x46\x9!\x90\x84\xcf\x1c\xda\xbf" -"\xe7,\xc8\x37Tx\xb4\x16\x14\xbc\x18\xa9\x14\x90\x35\x96\xd6\xfc/6\x1e\xe5\x19\xf8" -"u8_N\xcbP\xf7\x5\x31'N\xbd\xeb\x14\xa5\xdb\xd9\x6\xa6\x8\x17$`B\xe3y\x9b\xb3\xac" -"d|\xdarD\xb7\x99\x8a\xe4\xf3\xbf\xbe\\v\x7f\xd2\x14.HQ\x8a\x42\x17Y\x9e\xe\xc2\xcf" -"^\x86\xc8\xc2p\xff\x8b\x2\xf9I\xee\x0\x1djC\x9b\xcbK\xc7\xd7\xf7\xc8\x16|:\xe0\xa7" -"\xe5\x96\x87\xfb\x8b\xf6\xf3{\xea\xa1\x64T\x1b\x8e\xaf\xd9.\x9d\x15.?\xd0\xf4\x13" -"\xc9\x9c\xcc\x34\xfc\xd8\xaa\x45Z\xbU\xde\xc8\x46\xa5\x87K\x94\xfc\x95\xcf\xf1\xbb" -"8k*\x1e\"\xcd\x1c\x39\x14&Km[\xd1tir\x85|\x92\x35\x5-w\xa6\xc0\xdd\x30\x19\xf8\xa3" -"\x7\xfb\xee\x63\xa3\xef\x12\xb0\x39\xb2$\x10\x82v\xff\xa8@!\xf1\xac[t\\Ti\xb?\xf5" -"\x87\xb4\xb1q\n\xc3S:g\xbc\xef\xc5\x3\xad\xf1\xf4\xb6+)\x10\xb3\x19\x65\xe3\x64\xee" -"\xc9\xcc\x43|\xc4\x1\x81\xa7\x32\xc\xd5+\xe9\xc5\x46\xb8\xf1\xdc\x82\x43\x12!l/\xd8" -"#.+\xb8\xd4\xe\xe2\xe3\x14T\xc0\x97r\xa3\x87\xf9R\xe\x33\x14V\xc2i\xf5\x1a\x7\x8e" -"j\xbd\x9f\xb6\xa6\x8b\xfd_Ur\x15\xb0\xbb\xd2\"{\x89Y\xcb\xd1\xbdJ\xee\xab\x9M\xd1" -"\x8e\x89\x1c\x61\xfb\x0\x93<\n\rv\x17M\x16\x9c\xb\x64\x45\xd3L\x0\xdc\x9e\x6\xd8" -"^\xb0\x86\xc1\x8f;\xe2}\xf7\x34\xeb\xb9\xcf\x7\x8a\xff\x65\x14\x43\x85I\xcb\xe9*" -"\xc\r%\xef\xe4\xa5'\xd8o\x15\x8bN\x9d\x88p\xc7\xac]l\x5\x96\x43\xa3)\x80y\xcc 9\x83" -"$\xca\x87';\x86\xed\x80\x10W\xd7\x97\xd9\x1b\xc3\xcf/\x96\xc6P\xee\x15\x66\xcd<\xf8" -"el\xc5w\xd3\x8b\x83\x2\x1\xbeq\x8d\xc9\xa4\x94&\x81w\xa5\x1\x95\x46\xee\xed\xbf\x10" -"\x19\x96\xbeY61eKc\x8cu\xa6\xba\xa6H\xcd\x1ez\xa9\xac\x1e\xa6\xfL\xd6\x4\x7\x1c\x89" -"\xdc\xcf\xf8\xb3\xe4\x30\xa5~\xd6\xde\x11\xc5\x83~x\x95n\xd9\x91\x5\x8f\x36\x46!" -"\x9b\xea\xe9NM\x93\x81\xa3=H\xca\x9b\x8f\xf1+T\xa7?\xf8i\xd0\xee\xed~\x9\x8d\x80" -"\x15\"\x95\xe6\x1l\xdd\x80\x91s\xc5}\x1f_\xce\x90\x8a\x37\x1\n\xd4\xc4G\x1aSE\x1d" -"\xe9\xb4\x36;cC|7LY\x8fT\x8f\x14]=(\x8f\x42S\x1f\xcf\x36\xa9\xcd\xf7%!\xf1\xc0\x86" -"\x8f\xce\xee\xb1\x85~\xa9\x83\xf6\xb7\\\xe2\x45\xd8u\xbe\xad\x1b\xcb\x88\x19\xe5" -"FE\x18\xe0G\x17\xb7\x8b\xd6\xe3\x35\xf0\xadw\xb8\x32\xafV\x82\x6*\x1e*\xc7|\xd5\xed" -"\xd5\xdc\x37.\xe4V\xc9m8\xbf\x8b\xf3H\xda\xc2\xb4\xeb\xbb$@\xf2\xce\x97\xb4\xb3\x37" -"\xf2\xe2\x32G\xe3\xe8\x42;\xfa\x92\x37\xcal\xebo\xb9?\x96\xc\xad\x89J\x96\xf0\x37" -"\x11h\xa3\x32\"\x5-\xe9\xb3\xbe\x4\xb0\"\xab\x95\xc0\xc2\x43Hn5\x19w!\xfcU1\x1d\xc5" -"_\x87\xbcr\xd0\x9bl\x94\xc\xa3nf@\xae\xb6l9JYI\xa6\x4\xe7\xf1]\xce:\x0\x8b\xb4\x1b" -"\xe\xef(@\xa3W\xf3HD;M\xce\x6KL\x15\xe5\xecR\xe4H\xc9\x85\xfa\xa1\xc3\xd6Rbp\xb1" -"\xcci\x10\x9\x95\x9av \xc9\xa6 &\x19\xa1\x9b\xe4\x10\xff{\xd5\x35\xa8\xb2\x64\n\xaa" -"E\x9d\xfd\xcb\x8f+\xb3Q\x12\x62\x64\x97\xe8\xa3\x97\xd4\xf9\xe0G\x88\x32*s\x8d\xc8" -"\x90|\xb6\x43\x15\xcf\x63\xc9X\x9\xe9\r\x6\xef\x2\xf7*\xb0J\xa6\x1f\xe0.\xcc\xf7" -"\xe9\x4\x9f\xf9\xf3\xef\"X\xa7VV\x17\x8a\xaa\xc9\xf3\xc2\xa2l\x0\x13\x41\x86-Rl\xc1" -"N\x92\xa8\x1b\xd6\x35\x2\xf9Y\x6n\xb\xcd\x65\x9c\xb9\xb5\xa4V\x6\x15=\xd7p9\xb8\xc5" -"\xd5\xb1\x35\x65\xf0\r\x95\xa4\x19\x37\xcf\x97\x8\x9f\x39\x38\xe3\x96Y\xa6M\xc3\xd6" -"\x4m\xe\x9e\xf6\x65\x44\xca\xf8\xa2\x6\x63]\xf4\x99&\xa3\xee\xf3\xfd\xbc\x9d\xcc" -"\xea(\x86\xec\x85_\x18!\xc4\xb9\xce\x1d\x2\xa1\x9a\x11\xbb\xbe\xf4:}MSg\x15T\x8a" -"b\x80/d\xaf\x30\xbb\xcb\xea\x8c~U\xadV\xc8\x1\xd8\xa5i\xc8\x18\x36\x15\xa7\x8c\xd3" -"\x93\xca\x42\xc1\x3\xf1U\x94\x1e\x84W\x12\xc3\x35\xf4\xac\xfcx\x7 +\x92\xa9\x83\x11" -"\x1a\xed$\x1b\xbb\x85\x1\xf1U`\xe8\xf2\x15|)u+\xdc\xdb'@\x8\x13rw\x92\x0S\xd6\xd7" -"\xdc\xdc\x62jWJ\x82\xa8\xa3O\x1ew\xb2\xfc\x8c\xf7\xc1\xa7\x32/\"\xdf\xcb\x45\x2Y" -"\xeb\x45\xcR\xb7\r\xf3XJ|T\xc8\x13\xdb\x41\xe3\xdd\x81%:\x3\xb0+\xc2R4j\xf0\x16\x7" -"\x16\x35W\x97\xb6\xf8!\xc\x45=\xd7\xe1\xe7V\xff\x8\xc7\xe6\xa5\xf4\xf8v\x5\xe1\xdf" -"\xf3Z\x13\ry\x14\x8aW\xb7\xad\x12\xd9J\x12\x9f\xe3\xf0U\xcf\x97N\xba\x9\xa2\xb1=" -"\xee\xca.\x2\xea\x81\x8aX\xb8\x1e\x87\x43\x0\x46\x46\xc7ta\x10\xbc\x61\xb8j\xdf-" -"]\x8c\x45\xa6\xa5\x46\x1e\xb3\x44\x97\xfc\xcd\x9\xe7\x11\xf4{\xfat,s\xf8{%{S\xf3" -"\xc\xb6\x8d\x15\x14$\xdc\x8a\xc6|$\x95\xa8#n\xa2\xd7\x98Z^\x1d\xea\xc6\x99\xd7" -"\xb7\x0\xe6\xd3\x8e\xee.\x93\xb1\x91\xba\xa5\xa8\xa2\xc9\x16\xd2\x6\xc6?\xe6\x34" -"'\xaa\xaf\xed+W\x84'o\xc2\x1e\xef\xf2\xd7\xeG\xc8T\r\xcc\xc3\xe0\x1\x34\x64+p7\x95" -"\xcd\x37\x2\x63\x1a\xe2\xa9\xe\x6:!\x8b\x61\xe5\xb8\x9b\xbc\xff\xf8OV~7\xa3\x1a\x9b" -"4\x97\x17\xa8\xcd\xb9\xc9\x37r\x15\xba\x83\x8f\xf7\x46\x9b\xc4\x86\xb6N\xf2\xb6\xd9" -"%\x19\xc0\xbf\x8&\xe3\x65)\x3\xf4\xe@\x6\x89\xf5t\x9d\xf8o\xe3\xde\x17\x8e!\xe2\xe" -"\xdf\x90S\x8\x1f\x65\x10\xd8\xf1\x9a\xcd\x2\x1c\xbaH\x1cHM0\xea\xd3\xb8N\xd0\x19" -"\x0\x87\xeeG\x8a\x17\x15K$3F\xc3\x93\x8f\xddS@\xcfnG\xb1\x85\xe6J\xbd\xf4O\x8c\xbc" -"\xdb\x82\x94I+\x91\x92\x9b\xfe\xb9\xda+\x3<:\xce\xe5T\xf0\xf1\xa7\xf8\xa5m\xf7\xc0" -"j5\x83\xc1\xe9\xc5\xca\x45\x8d@\xe5P\xfd\xf3\xe2\xf2\xe7\xbe\x83\x12\xd5\xfe\xe9" -"\x85\x43\x38\x8e\xdc\x8a\x4\xca)\xf1\xb8+z\xb4\xad\xab\xba?,3\x1e\xff\x35!\xb2\xb9" -"/\x99\xc4\x37z\xb8'\xa9\x89\xb4#u\r6\xad\xdd.(n\x7f;iN)\xb8\xbc@6\x93\xc6\xf7\xca" -"\xb5\xfe\x34\xf1\xe4\x8c\x8d\x41\xb4x1\xe8\xc3\xf5\xbe^\xd5\x14.KD\xd9\x9b\xa5\xcd\x33T\xf\x34\n\x35\xdd\xd4\x66" -"\xab\xeaNr\xe5\x4\xfc\x9b\xaa\xe5\x1d#\x1c\x33\xa8\xce}\xc2\x97\r\xe4\xc1\xfb[\x9" -"j=\x9c\x64\x1e\xf7}\xc9\x3\x98\x86\x83\x1d\xdd\x1\xc4\xf2\x1en\x16\x8e\x38\xbb\xdd" -"\xa5\xf4\x30\x8c\x95\x9c{\xbf\x36\xa4-\x4-\xa6\x86)7\xeb \xd4\xfa.Y't\x1aX\xda\\" -"\xbf\xfd\x95S\xbe\xff\xbd\x92\xe6\xd6Hq\xd8\xb2]\x90I\xf4\xe7\x19p\xa8\xffUW\xd1" -"\xde\x83\xdd$(ml>Gp\xee\x0\xf9\xa1\xa0\xb0\x6<\x99\x99J\xecu\xe8Mo\x9cH\x84\x34\xd1" -"\xf3\xdc\xfd\n\x8b\xee\x9e\xd8%|\xa9~u\xe8\xb1(WG\x18Mm\"(\xef\x95\xd4\xa0\xb8\xda" -"%#\x18\xab\xd3\\\x83\x98\xfc\x65h\xb2\x94\xd9\n\xb3\x8\xa7g_\x9f\x16\x1@\xf0\xa0" -"\x8c\x88\xad\xc\xa1\xca,\xf8^M\x3\x1c\xfa;\x87\x63_\x13\x98\xeb}\xbc\x66j%\x9f\x2" -"\xdbgA\xd1>\x11\xb2\x30\x2]\xd6\xdd\x64\xc4\x38@\x9a\xf1\x9\x9\x0X\x15\x1eM\xfb\x8c" -"\xe\x9c\xd6Y5\xc4\xcc\x6<\xc6\x10\xf\xdep\x89n#\xe3\x66\x1c\x7f\xc1\xb8\"\x8b&\xa5" -"Y\x3\xe9\x97\xf8\x2\x7\xed\xd8\x86?\xa0t\xeeO\xf2;\xe5\x85\xba\xf7\x8\x4\xc\x9f\x8c" -"\xfd\xeb\x42\xfb\x8e\xb7\x1dL\xb6\xd7u~\x97>M\x8c\x9d\xdd\x8'\x12\xc2?\x86\x8e\x11" -"5\xec\xd9\x12P\xbb\x43\x35\x95\x8b\x7\xc1/\xdau\xee\xb5k\xe1\x9d\x16\x44\xc1\xf7" -"j\x88\x11\xc0!\x12&\x19\xf7Q\xcb\xbf\xeb\x1d=\xc9\x12\x99\x90\x17\xfa\x16\x36r\xa1" -"\xefuL\\\xb7\x89\x62\xba\xabv\xecHF\x1bI/\xa8\x8f\x98\x97\x17\r\xe8W\xcc\x83t\xc8" -"\xba\xe4\x17\xd4\xc7\x8aV\x4p$s\x1fJE\x14_\x3\x93\xa2|\xab\x61J\x7f\xf7G\xbb\xc2" -"\x8eh\x80\xd4\xd0\x1c\nl\xf3\x17\xa1\xde[\xb5\xad\xfaK_\xbf\xe0\xc5u\x98\xc7\x9f" -"%\xaeW\xbbyzH\x9dQ\xf8Z\x9b\x9c\xf8\xbe\xa6\x42\x93\xf8\xfc\xc4;\rT\x84\xdf\x99\xdb" -"\xe1\x91Ri,\xe7V\xf6\xfb\xe8\xceX1\xcfK\x8aZ\xf4u$\xe2r\xc4\\\x62\xac\xbf\xbd\xfe" -"~`\xb0[\xb1\xa1\xa6\xaf\xe\x92\x10\x1 \x14i\xb3\xdb\xb4\x9e\xc7\xb2:6?\xa6\x84\x17" -"\xb7\x11\x8d\xce\xa7\x1dJ\xca.6\xf8\x8cm\xde\xfbp ]\xf3\xab|t\xcf\x65\xcf\xd0\x1f" -"\xf8_\xaf\x99\xf1rh\x97\x37\x33\x1dLl\xffz)\x2\x97r\xf4\x87\xfb\xf6%\xf1{\xda\xd8" -"\x9bJ\xc0v\x94\x82w\xb4\xedhx@0\x10\x16\xc2\xb7\xadLm\x2\xf8\x1e\x88\xc7[z\x4\xd7" -"$\xe2\x34\xe3\x8a\x38&\x93QX\"E\xe3\x61\xa4,u\xb8%j\xfdV$\xb5X\xad\xa2\x19\xf\x96" -"\n\x89k\xba\xe7\xa8\xc5~v\xda\x10\xdc)\xe6\x9b\xbf:\xa8\x62\x14\xc0\x1\xa2{9\xc1" -"\xd1|T\x8d\xa5`\x1e\x86\xa5\xcfS\xe7\xb1\x89k\xf0\x3\xaa\xe9\x38z\xba\x9b\x10.\xb1" -"\xe9\x0-\xd3uJ7\x8f>I\xf2\xc6\xee\xcfG\xeb\x1b\xac,\xfc\xe1\x1a\xc0\xc5\xcb\x6\x36" -"r\xd3'3V?>\x1e\x89\x1b`ss\x9b\xc5:\xaa\x0\x43\xfc\x45\xe9\xe\x41=\xfb\xd4T\x8d\xd3" -" \xb6\x81\xedp\xa7\x44:#=y\xe3\xf0\x38\xd2iuXn\\\xdd!\x15\xaa\x61G'\xb1\xf6\xdd@" -"$\xb8\\\xcc\xfcy\xd1\xb{j\xfax\x9d\xb3{\xd0\xe8\xc4#\xc1\xa4\xa8h\x1b_\xf3\xa9\xfa" -"\x1f\x61\xa4nF\xc4\xb1\x83m\x1a\xa4\x1a\x89&J\x7fK\x1c%\x9eK\x10\xec\xdf\x37[\xd2" -"j\x1f\x41/\xe0\x1f\xbd\xc0\x33h\xfc\xafH\xaa\xe\xc2\x8b\x1b\xd6\x3\xa6\xa0\xd0\xda" -"\xde\x66\xd1L\x9br\x85V\x92\x30\xfa\xb7h\x3\x35\xbe\x10\x43\x5\xe4\xb7H\xfa\x99\xfa" -"1\xf2\x39\x91`\x8d\xfd\xd2\x9}\xa2\x92U\x11\x36\xf2U\x5\x1c\x9f~\xef?\xb7\xc7\xfd" -"\xb4\xe6Q\xc3\xd0:L\xa3W\xb5\x87$R6\xf4\xff\x32RV?k\xe0\x8e\xf8\xa3\xec\x9\xbe+\xf2" -"{\x91 \xf7\xd3x\x1\xf6\x99\x9e\xfb\x1c\x8a\xd1\xa0\x86\x98\xccY\xce\xae,\xfc\xdb" -"\xf6\xbd\x8f\x94\xde\xc9O~\xbf\x33\xaf\x5\xf5,\x85v\xc\x63\x95\xb\x45U\x10\xc6\xab" -"\x93\x98\xd0\x9a\xc2\x88\xef\xa0\x9e\x8f\x63\x1aY\xb0?\xbb\xc7[\xbd\xaf\xd6u\xff" -"\xac\xcc\xf8\xad\xf7\x1e\x81ZJI\xf1K\xf7\xe\x42\xdb\xbsG\xb5(N#L$\x1\xe!w\xdb\xbd" -"Wd\x8e\x39\x8f\xa6\xb5\x45q\xa3{\xa8\xc9\x89P5\x94\xd0x\xd1\x8\xe4\xc7\x34\xf6N\xe2\xf1,\xc9V,\xbd" -"\xf3\x63\xef\xafR\x1\xb6s\xad\x0X?\xf1\x8\xaf\xf6\xb6\x80U\xa5\xf2\x99\x45-\x17n" -"\xaa\xfb\x92\xc8O\x11L\x8c\"\xa0^\xad\x65\x64\xa3\x37\x14 \xea\x9e\x64\x63\x8\xde" -"\x97\xd4\x7\x5\xe1\x63\x8d\xf0\x87\x4\xfc\x90$\x9c\xbc\r->\x88JEb\xcc'7\xb\x1a\x97" -"8\x9d\x8e\xfd#~dJsp\xb8\xb3\x8e\xd1\xc3w\xf5\"\xc7_\x98\x1d\x87\x8a^\x87\x10\x1e" -"b\x1d\xf9\xd8\\r\x7\xbb\xe5\xa8|\xcb`\x7f\x93\xa2\xe5/f\xe\x5\xc8:zl\xe6\xd0\x1a" -"\xb4\xb6*\x1e\xf8\xdaG\xcf\x97\xd4\xbb\xa0\xfa\x8e\xff\xa9\xc0\xf6\x1a\x32Z\x97\xad" -"\xa6\x94\x45\xf2:\xb1\xfe'\xa6l'\x16\x39\xf8\x39 0@\xd4K\x11\xec\xc6\xe8\x5\xfb\xe8" -"\x88\x43\xb3LO\xd5-\x1d]\xa1\xb0\xaf\x7\xc2\x37t\xb1" -"\x9c\x9e\xf5\x92\x81\xf5\xd8\x84\x99\r\x61\x94\x17\r\x82\x93\xa8m\xb5*\xf\xe1~\x88" -"\xda\x82 \x9a\x0\xa1k\xd2\x9b\x8b/\x13\xfd`\xaa%\xfc\xfa\x97\x45\xf5|\x82\x16(<\x1d" -"n\xa1\xc1\x19\xcb\x9b\x8dW\xc0\x4\x19R\x10\xff\xbdV9Z>\xc2\xd3\x9\x8e\xd3\x8f\x38" -"\x9e\xfc\x3$\xfd\xeU\xea\x33\x9b\x38\x92V\x82)\xd8\xd3\xe2\x5\xa8!\xe8!\x9f\xcb\x1a" -"w\x13\xfc\xf3\x45\xf\x8b\xef\x97l\xa0\xbe\xcaG7j\x8c\xa7=\xf8[4\xcg\xef\xe4SME\x96" -"\x17\x99\x65&\xb5\xe5\xd3\xd1\x9e\x17\xccTI\xe5\xef+\x82\xb2\xc4\xc2\x13\x1f\xf8" -"\xa1\x9f\xcf\xe6\xa1\x86\xa9\x84\r\x87-\x85\xc4\x6\x65\xa7\xa0Ng\xee&\xb8\xbc\x92" -"\x6\xc3[D\xc8\xf8\xa1\xaf\xc3\x86}\x96\xdcmH\xbd\x45\x6;\xe2[\x88.\x9b\xc0\xd0\x94" -"\x8c\x18\xdc\x87\xei%\x81\x8e\x1f\xe1}3b\x17\xf1t\xeb\x44\x81\xf5\xc0\xed\x37\xa3" -"\xbe\xaf\xafMF\xf8W\x81\x1bg(\xbe\xc4\x61\xae\x64h\xd8zser\xf4\xff\x95\xb5\x8b\x4" -"VJ\x9d<\"uE\x87\xdf\x15IZ1\x9d\x82+\x83\x84\x61vKsH<\x1f|\xb9\x30\xee\xccot$\x84" -"\x1e\xe1\xe@\x87\xe9Q /\xe8\x8a\x39\x13u\xc9k\xec\x44\x80\x32\x8aTt\x2\x13\xf7\x41" -"\x10[\x12\xa3\x9f\x19\x80\x8f\x38#P{\x88\x11]F\x8c\x61\xb2\x12\xa8\xab\xaet\x80\xe3" -"\x9b\xa5#\x90\xa1\x89,~\xc5\x2q\x15kN\x80v\xfc:\xda\"&\x95\xdf\x37#\x85\xda{\x11" -"z)\xe0L\xd2\xb8\n\x32\xf\x18ma\xc9\x63\xfb\xda\xfe\x92$\xe5\x37\x5|I\xe8.@Q\x96\xaa" -"\xb6!\xb5\xfe@\x11\xe1x*t~\xf9\x35\xed\x8b\xb1\x1b\xda\x39\xa1\x41\xcc\xb\xa4-\x4" -"\xae\x12\x33\x83\xbc\x95\xa1\xd0:\x85\xa9\x44\x0\x10\xc3\xb9\x61\x30\x64\xff\xec" -"\xa7\x61\x97\xe1\x9\x19\xbaP\x6\xf3X7\xed\x9b\xcd}\xe5\xe6\xd9h\xaa\xcbo\xc9\x11" -"x\x9\x1f\xa4g\xefo\xde\xb7(\xe1r\x93\xdc\x89\xdd\xe5\xa5&\x1f\xaa\x95\xa2\xb0\x0" -"\xf\xc7P\xe7\x7\x39\x0\xd4\xd8\x82G\xda\x46\x46\x13\xad\xc2\xb3\x90:a2\xd9j\xc0\xe1" -"\xc5\x64\x38_\xfb\xf6$\x9d\xeav\xbe\xa2\xa9\x91`c-\xd2\xfc+\x99\x13>\x9f/G\xfr\xb4" -"]o\x18\xb4P \xf6\x4\xb0l\xd9\x17K\xa3\x80]\xb6\xe\xb9\xc5\xe6\xa9\xc7\x89\xac\xe7" -"j\xe9\xc7\x9c\x1b\xd3\x44\x34\xe9^P\x1b\xc9hc:\xf9?\xf4\x88B\xa7%\xa0\x34Y\xcb\x36\xee\x34\xa0\x94\x13\x9a\xf5\xfc\xf4" -"\x87\xd3\xdf\xe6?\xad \xbf\r\xfb`\xde\xed\xa2\xac\xca\x35\x10\xe9\x63\x18\x9d\x12" -"V\xea\xbd\x81%?\x7f\xf9\xd1\x12\x63\xfd\xbc\x1d\xcf\xda=\x1e\xa2\xe5 \x5\xce<`\\" -"\x99\x32\x31%\x8aqt#\xf6K\xfe\xeb\xc3\x46\x84\xef\xa6v5\x8b\x9bT< B\xbe\xf9T\x82" -"\x9f\xe3$j\x87\x98\x45\xb3\xe\xba\xcb\x43\xd8\xddz \xfc\xfe\xdfv:\xd2\xc5\xd2\ny" -"\x8bi\xe0\x87\"\xdc\xe6\xa5v.$\x9a\xce\x30U\xb6P\xd9\xe1\x10Y\x9e\xa3\r\xe5\xc4\xfe" -"r\x0\xd5\xa8\xda\x9e\x1f\xe2hcP\xd0\xdf\x33Hw\xd0\xb9\xf6RLU-\xbm\xff\xae\x12^\xc4" -"\xc1\x8fuG\xbdQ\xc1\x42\x88\xe4\xab\xb7\xf8\xa1\xa0\x4XYl9\n\xee\xe6\xfa\x30\x8a" -"\xc1\xf7\x88\xfa\xe3\r\x7f\x89(\xaf\xc9\x1dM\xe6\x35- \xb1\x9d\x8d\x8a\xb1\"\xb7" -"7\x8c\xb3y\xc5\xbe~<\xe2\x92/\xe6g\xea\x5{]{?\xbQ\xc7\xbf\xc\x85\xf8z\xc2\xf3`\xd8" -",8\x96OM\xab\xcc\x91\x4\xb3/\xf\xb8\x80\"\x35\xe8\xe8\xd9\xa5\x99}9\"Y\x7L\x0\xaf" -",\xe1\xd2\xbf{\x8e\x90\xe2\xe2\xac\x34\x18\\h\xa0;\xab\x8b&wx)+\"rE\xd7\xff\x86p" -"xn?to\x86\xb9\xd4\xd1q\x90\xdb\x85\x9a\xe\x14K*a\xe6\xac\x92T\xde]\xba\xef \xe2\xe9" -"\xdb\xb/\xf6T\xb9\x96\xe9\x62\xf5^F]\xd2\x38\xbd\x16\x43\xceY\xdc+ZX\xb1\xe6\xe4" -"\xae-\xdc-t\xd7\x9a\xff<4\xe4\xe5\x93\xe0Q\xfd\xa2\x36\xb7\x9c\xc0\xdb&\x8d*\x89" -"\xb1\x87\x80Q\";\xb8\xf3?\xf9\x9b\xa8zH\x11\xc0\xb3\xbc\xc0\x11q\xd0\xa7\x31\xeb" -"s.\xcd\x87I\xd2yR\xc2x\x86\xb2R\xf9\xc3\xd1\x90\x41\x9f\xd2\x90\x9\x87\xa0\xa2U\xb9" -"u?\xb7\xaap\xc3tb\x13LFz,Ky \xbe\xd9\xf9\xe8o\x8f\x98\xb9m\x0\xaf\x8b\x5\xa4\xbd" -"_\x14\xc2\xa0\xd9\x14\xa9\xa8\x41`\xd5T\xfd\x7\x18\xf5\xe\xcb]\xf5\xe7\x66#\x6XR" -"\xda\xa7L\x9a\xd6\xda\x7\xa1\x19\xdf\x12\xc3W\x7f\xe2v\xaeU\x1dH\xb1\xc5\xcd\x8a" -"P\xe8M\xec\x9c\xb0\x84\x5 \xd7\x8f\xa7\xf9\xa7\xc2\x7\x1e(\xcd \xecvI\xb9\x91\xf3" -"\x81\x8c\xde)\\\xdb`\x85\xf2O\xcf\x93\x14~\x9fM\xd0\x84\xfb\xd3%%\x32m.\xa1G\xec" -"\xd5\xb6\xc9\xd9\xf4\xa7\x16\x66\x63\xad\x18\xbf#N\x9c\xb9/\xf7!8\xa8\xa4\x9es\xe5" -"'\xe9\xa6H\x8aL\xa8\x8\xae\xca\xbc\x94\xd6\x93\xcd,\xc\x35}(_e\x0o\xa2\xf9\x19\x7f" -"a\xfb\xcan\xf0{\x1>+U\x8a\xb5\x31\xd2\xfd'\xc\xee\x7f\xa8\xe4g\xfa\xb8\x85\xe9\xc" -"X\x84\x84:\xa0\x8e+\xbf\xea\n\xa5ud7'\xba\x18\xac\xc4\x99\xff\x34\xe3\x43\x86\x45" -"\xbe*\xa7\x1e\xa4\x91\xe5\x46\x87\xcd\x30^\x12\xbb\xc9O\xae\xc8H1\x1a\xe8\x16I[\x1" -";\xc5\x7Z-*\xe5Jz\xd7\xc9\x10[d5l\xb5\x1f\x18\xc2\xc2\x8e:\x83\xb9\xd8\x1a\x45T\xdb" -"\xec\x9b\xea\x9a\x66\xc\xf7\xe1\xba\x89\xe6\xd4\xdf\xb3\xee\xc6\xa3\xde?\xcd\xed" -"\x9b-aAV\xed\xae\x8c\xfd\xad_\xf0\xef\xee\x31\xda>jT\xd9L\xe9\x45:\x1c\xaa\xd9um" -"\x91\xbe\x85\x31_e\x14\xba\xfb\xc8!\xee\x81\xb\xb5\xd8\xe1\xb8\xf0_d\xf3\xf7,K5\xd4" -"$\xf7\xe4\xdc:\xb5\x81\xb7J\xde\xb6\xd6)|\xdez\xa8'\x89\x9\xf2i\xfe\xd7\x9b}\xfd" -"9\xb1\xc0\x33\x8e\x1\xd5V\xc4\xdb\x9c\xa3\xa8W\x8a\xce>\xc3\xd7\x43\xedK\x9c\x1\x45" -"\xe4R^\x8c\x31_z\x1b\x98XK\x97\\p\xf0\xd4\x15p\x8c\x8c\xcc\x13\xf8H\xb1\xd3j\xc8" -"$\x9bsc\x8f\x95\xde\xc\xd2|~\xfbR\xbe\xd4\x33\x9e\xbd\xa4\x81%\x64\xd7\xa7t\x16\xdd" -"\xf4\xcc\x88\xcf\xb5-\x7\xa2R\xd8\x93S\xc6\x82l\xa1\x83*\x15\x32\x42\x97\x9bl\xee" -"x:\xbd\xe6\\\x8b@\xcfN\xa7\xb4+\x8d\xbc\xc0\xe0$#\xddi1\x8\x0ojJ\xeb\xf0S\xb6\x66" -"\xc3\xcb\x63\xd1\x86\x1f\x86\xea\xac\xd4;\xb9\xbbo,:\x17)<\x18\x93\x31\xd2S\xb4G" -"u~\xe7\xcb\xf4Q\x8b\xab\xb7:\x1d\x44\x87M\x7f\x6%\xe6\xa0\x13\xc6\x8\xe9\x91\xb4" -"\xad\x17\xa9\xad\xb3g@\xd2^>5\xb4Y\xb4\"\xf7\x37\xb\x13L\xdf\xff?;\xccL2\xb4\xe9" -"\xeb\xf6\xa2G\x80\x13\xf6i3\xa1\xfa\x94\x3\xa2\xf1\x16\x1e\xc6\x32\xf1\xf0N\xdf\x95" -"\xed\xf\x33\xda\xd9\x66]T\xdd\x9d\xb2VNQ\xda{e\x97\x8c\xabP\xd6\xdc\x15h\x97n\x83" -"\xb0V\xeb\xe:gXQ\x8bn\x17\xe9\xeb\xfeI\xb7.\xb1H\xb4r\xba\x14K\xdc*\xc9WD\xc9\xbf" -"\x12X\xf0\xa2\xe4tp\xab\xe\xff\x90\xe1\x90\xa4\x11\x8\x91J\xb8\xc1\xedk\x11\xe0h" -"\x17xR\x18p\xe8\xc\x16\xaf*\xfcr<\xad\x87\x19\xad\xb6-99\xd3\xbc\x8c\xc1\xd8\xa4" -"\xe0~\x9dsOT\xec\xa3=\x93m,9\xd5\xc8\x5W9\xc3>S5\x9b\xd4\xeWl\x11\xe9;KL\x12+\xdb" -"\xc9\xb1\xbb\xf4\x42\x43\xafO\xb\xcd\xbd\xfa\xdeh\xc5&\xb5\xcdt\xe2\x9c\xe3\xf7\r" -"b\xba\x83\xc4\x89\x3\x41\x11\xfe\x8eM\xae\xa2\xf0\x1f\x9d\x93\x8a\xbbS-\xee\xac\xe" -"2\x9f\x42\x45?\xf5\xc1]\xec*\xea\x8c\x19\x83#\xc9\xe8\xfe\xa5[?]\xc4u\x1d..\x16\xb6" -"\x15N\x7f*\xdd\x46\x86\xe\x9c\xa7\x1d\xc1\x14\xc9\x9d\x80\xe7\xea\x1d\xabQ\xe9%\xde" -"\x16\x1c\xed\xd6x\xee\x62\x82\xaf\xf3\x8e<\xd0\xe6YT\x9c\x97\x6\x13 \x99U\xa3\xf5" -"\x81\xe1\xab\xe4\x85\xe5\x64\x2\xa3\xdb\r\x1e\x9b\x8a\x9d\xfd\x5\xc4\xb0\xb7\xf9" -"\x7f\xc6\xd0\xee\xd0\xb6\x9a\xd6\xf1\x82\xb1\xd0(\xad\xd2\xf2\x44\x63\x83K\x13\xf5" -"\xc1\x30\x7f\x91\xd3\x63\x89\x18$\xe8\x11\x8\xe5|\xfdR\x11\xf8\x64\x0\xd3\xe9k\x10" -"\x7f;\x1f\xe8\x9cI\x8\x64\x9d\x4\xa4m\xc3\xce\xe0\xde\x66\xaf\x3\xa7\xff\x9fM\xaf" -"\xec\xddm\xf4\xd9\x37\x84\xcc\x89\x9bRw\x84\xdb\xe0q\x80P\xfc\xe1\x85\xbd\xe3\xf3" -"\x9d\xeb\xcd\xd6`\xb2H\x8d#\xab\x1c\xff\x87\xb0Tm\x2\xb4\x8e{w$\xc9\xe8{q\xbf\x34" -"\xb5\xd6\x64\xe\xfn\xceG\xb1\x82\xd4\x1c\x89\x46\x1fq(I\xc6\xcf\xdb~?^\xbc\x1a\xcd" -"\xd1-e\xa4\"\xba\x36*\x8f\xd6\xca\xacQ\x4\xcc\xc5\xab_\xc0JF\xe4\x30\x9a\xca\xc8" -"=e\x9d\xdd\xa2V\xcc\xdd\xd1\xbf\xf9\xab\x36\"\x45\xcO\xbc\x89\xc8\"\x14\xf0\xc\x42" -"\xfb\x3\x11\xbc\xb1\xb7\"\xa6\x91\xed\x83\x9c\xaf\x90$\xfb\x16q\xf1\x8e\x46\x39\xc9" -"m\x84q\x8c\x66:CA\xde\xc0\x37\x17\\k\xbd(\x8b\xbfZ\x4x)\x8c\xa7&Vz\x9bt\xc3*Rs9\xc6" -"f\xa2\x94\xa1\x7fh!\xcb\xf2\x43\xd1>\xa4\xb1`<))S0\x8bVfSB>s\x1\xa0\x32\xe5\xd5\xe2" -"\xb9?\x1c\x14\x34\x89\x36\x33\xdd\x19P\x1a\xd1'(\xb5\xa1\xd9\xd3\x66\x35\xb5\x89" -"\xfa.\x15\x11@\xb5\x43\xd7\xc5\xe4i\xaf\xae\x8e\x80\xc4\xfc\x1d\x9c\xb6\xc3\x82<" -"\xc1\xbb~\xe4\n\xec\xb5\x8c\xbc\x14\x65y\"&\xb1\x9e\xf\xe7\x92\x35\x11_j:\xfe\x19" -"\xf9\x8c]\xb6=7-\xd7\xc0\x41\xcd\x94\xfOy\xf2GM\x9c\xee\xa0\x33O\xa0J\x97\xdc\x97" -"s\x6H\x95\xcf\x11\xcfs\xf1\x1b\x46\x84\xf0nH\xf4\x46\x9fj\x1a\xeb,\xbb\xc5)\x94\xdf" -"\xab\x33\x19\xdc\xe3\xa0\xc8\xc2\xef\xa9\x62t\x96\xf8\xcc\x84\xd3\xdf;\xdcO\xfc\xb6" -"\x16rx\xf)OE2x\xae\xb9&.fHhV\xd3{vG\x14\x1a\x82\xe0I6N\xd3\xd0?\x92R\x84\xa3\xf1" -"\xfa=\xdfL\xbH\xb3\xfe\"\xe7\xdf\x9a\xba#\x9d\x33\xcd\x30\xf\xfa\x8f\xd4\xb9\x61" -"\x92\xbdV\x8f\xb1\x8d\x32\\\xaa\x8e\x1f\x1f\xd4\xb2u'A{\x3HA\xfdI\xe4\xa7\x7f!pb" -"<\xc8\xb2!\x1\x16m\x80\x36\x1e\xb1_\xa9\x2\r$\xf6\x10\x7\xb0\xa8'M\xf9\xdf\xcd\x8e" -"\x97\xc8Uh\xe7m4\xad]\xb1w\x9b\x2\xf0\x34\xa6\x9c\xcf\x9dN\xba\xa1\x88\xeb\x30\x17" -"\xee\xf5\xb2*\nU&\x96\xa5t\x90\x7fiP\x98\xbd\x8aHI\xd5\xc8\x31\x1f\x12\x94G\xcdz" -"<\xf8\x8b\x81\x91\xae\xc0\xaf\xf3\n\x38\xa9\xab\x81\x35`\x8ax) z}$/n\x1f\xa7\xdd" -"\xa1\x9f^L(V\rB\xdb\x44\x5w\xcc\xc_X\x3\xee\xe8\x97\x10>\xca\xb\xd9\x44\xe3 \xac" -"&U;\xeexR\xea\xa7\x33\xbd\x13\xdfv\x0V\xb2\xf5\xbd\x12\x43\xbe\xda\xbc<\x1e\xa0S" -"\x10\x17\xd7KG\xe1\x8f\x80\x1a`\x7Mm\xf8I\xfd\x5\x32#EE\xe5\xb5\xe1\x12\xd1\xe7\x38" -"SA\xd3\x9a\x89U\x1c\x80\xdc-\xea\xed]]\xa2\xa4\xbeP\x15\xd2\x97\x32N\x92\xbe\x64" -"\xc6\x84(\x13.n\xc6T\xddK\xdc\xc6\x64\xch\x83_\xf8\xa0^\x9\x96\x4\xb8\xcd\x43\xd3" -"\xaf+/\xe1\xc\x8a\xfe\xde\xc5\xa7\n\xf8P\x9d\x12\xf6\x62\x33\x8c\xbf\x16m\x94R\xcd" -"63\x17X\xacOL\xbd~\xddR\x13\x9a\xd2}\xc5%i\x87\x7f\xe7\x9\xf2\x97\x44LO1\x89\x9d" -"\x19\x45\xc8\x1b\x14\xab\xde\xcb\xf3\x1d\xc4\x63\xa4\x14\x8f\x4\xecO\xb9p<\x15\x82" -"\x16\xc0\xfb\xe6\\\xcd\x45\x0\x43\xab\xfdNe\xbf\x8b(\xcc\x14\x82R\xe9\xf3\xe7\x97" -"\xea\xbW\xb8r\x1c\x94\xcb\xc2\xea`-\xf2\xc5~\x87\x93\x8c\x88z8-&Y\"dc\xbc}j\x1d\xa8" -"\x7fJ4\x1aY\xbe\xa4X\x17}?\x18\xd1!59\xdc\xe\x30\x1fn\xfe\x1\x11\xfc\xf6\x92\x13" -"h\xbe\x17\xcc\xbbt(\x12~\xc\x5\x9c,Z\xdb*?\x1\x97\xf0\xce\xabw\xff\x7f<\x2z\x8e\xc3" -"\xeev\xcf\\\x98n\xb4|\xb6\x5\x61\xc7s\xb3\xa2\xdaG\xb5\xa3S\x94\xe2\x93s\xdb\xd5" -"\xc3\xffL\x92\x13\xa8\x9a\xedw\xccO?\xcf\xc4\x9e\xf6\xecuW\xc5!\x97\x9aTi\x83\xc1" -"\x6\xb3\x62{_\xd2\xd7\x1c\xc5\xf0\x8a\x32\xbfI3*\x89\xc5\xdaq\xaf\xbf\xb9L\x94\x9a" -"\x91\"\n\xb1\xf8\x85\xc9\x81\x42:\xf9?s\xbc\x1c\xa4\xd9-\x9d\xba\xe3\xef\xe6\xa7" -"n-\xe3\xd0\xf7O\xd3%X cn?\x1ak|\x18S\x6#\xc1*\xf9\xc\xdc\xd2\xc0\xa7(R\x1e\x9b\x63" -"\x9e\xb6\x34]\x1d\xe8\xff\xfc;\x19\xc7.z\x93\x82=\xfe\x31\x15\xe9\xe7\xbb\xbe\xb2" -"\x8c\xb7=\xb1!\xae\xd8\x92\rG\xd8\xcc\x8\xea.G.9\xa4\xca\xd5\x88\x1b\\\x42\x4\xf2" -"\xb7\x32\xaf\x9dQ\x89\xd2Z\xbf\x41<\xc7\x87\x14\xcb\x1\xb1\xd8\xcaUe\x16\x9a\x91" -"\x9d\xc4\x81\xf6\xd2\xe6\x7f\x1dI\n\xeb\xc5\xcc\x62\xa8\xf6,\x1a\x32>\xbbU\xed\x35" -"\xaa\\\x8do\x8b\x97\xe\x93 \\'\x1\xcfH\x17\xbd\xa9\x94\xfc\x16\x19{F\x9e\xcc_^\x9d" -"\xdf\xf\xa0V@\xc2\xe5q\x84\x95q\xcb\xd2\x64\x2\xb1\xeb\x1e\x80?\xcf\x42\x33\x45\x0" -"{\x9bR\xb1>;\x3N\x8c\xb3\x98K\x92^\xbf\xfeq\x9e\xd4\xf3\x9f=\xe\x33\x43\x31jo\xdc" -"&\xbd\xbe\xa8\x8c\x43\x66\xd3\xb2\xf8Q\xd2\xb2\x44\xcc\x44\x8%\x1a\xe2\xc7sH\xcc" -"\xe9\xdd\x8b\xb9\xc8\x98\x0\xb5r\xd3\x8c]\x1c\xc3Lt\xb\xee\xbb]\xdb\n\x8b\xb2Qe_" -"\xb9\x89\x84\r# ]\x16\x31\x1a\x9f\xcc\xf7\xc8_m\xff\xea\x97\x4I*Nz\x8fl\xb\xdc)t" -"Z\xac*\xbf\xae\xba\x2\xb0\xe7\xae\xfe\xb9+\xa6:\xb0\xdf\x84N\xb0\x9dP\\=\xfc\x10" -"X\xce\x42\xcd\xd8\x4;v9\x84\x1\xe1\xdb\x86/\xf9\xf7l\x5\xe8\xbc\x62`\xa4\x44<\xf4" -"\x94\xbc\x17U\x91=Qt[\xf4Z\xdf/\x8cz\x95\x46\xd7\xefO\xb1\x1e\x9d\x94\xe4S\x96\x32" -"\xc2\xa3\x96\x6\xd0\x44\x80\xee\x45\x94\x8\xd7\xa2\xa8i\x80zL\x1\x88\x1c\x1b\xb2" -"\x1c)j@+^n\x7\x9=\x83<=\xff\x7_M\xd4&\xeb\x87\xb1\xb8\xde\x16\xc1\x46\xdey\xf5/Y" -"C\x1S1\xee\xb8R\x80\x9c\xbb\x8e\x1d\x64`\xacM\x17o\xe9o\x8d\x19\xf6\xcc\xb2*\xbb" -"\xba\xa2|D\x97\xd9\x13\x12\xc3\xcf\xb5\xbb\x91;1NC\xd2\xecj\xb6\x89{\xa7\xc3L\xf2" -"\xca\xa6\xdbK\xd6\x9e\xb5\xdf\xce\xe0\xaa\x91}iP\xe3jh\xa4\xc2*`\xdc\xc6\x93y\xd4" -"uD\xa5\x8d\x64\xe\xb1\r\xfe\x12\xf\xca\x84;X\x8c\xa8\xb9Oxi\xf9v\x9\xa6\xfe\x3\xac" -"\x86\xec\x1f|\xea\xd2\xec\x8e\x81\x97}\x1b\x94nE\x9d\xfc\xfe\xfe\x65\xa7\xbf\xf6" -"~f\xf5\xf7\x8a\x45\xd8\xdf\x65\xaf\x1\x46\xdft\xe0$\xfc\x4#(\x88l\xc1\xddwy\xf4\x9c" -"\xdb\xb7P4\\\xf8<\xd6x\xa6\xa8\x89uw)\x9d\xeb\x38\xad\x66]\xc4\xf2\x1c\xe1\x89*\x18" -"\xc2V\xf3\x18\x10}\xd3\xe9$\\\x1a\xd3\xbc\x93\xce\xf7\xb7\xbf\x5~3\xec\x9a?\x95\x32" -"Q&\x1a\xa3\xd1\xa8\x34ra\xe7\n\x46\xf7w:\x84\xf3\xd4\xd1\xa0\xdfm\xd2*\x96\x42\x93" -"I\xde\r\x18\x3\x10\xe1yU\xb1\xf\xbfS\"\xe\xf6H=\x3\xc6P\xa8\xd5\xc1mc\xda\xf6\\!" -"\xad\xcdl-\xb]J\xde\xb2\xf5Rj\xac\xf7\xcf\x42\xf9\xa8\xbfH2\xfb-Os\xf3\xd5\xff\xd9" -"\x84\xb5r#/\x87\xbd>Y\x13>\xd3\xd2\xfa\x19\xf7\x85j\xd8\x12Q\\t\xf7\xd8QW@\x19\xc5" -"2\xc2_\x8e\x16>Y_\xc9\xc8>>\x82\xc<\xbfi\r\xa6%x\xa9\x80\xfc\x8\x3\xebm\xb9\xb1\xe9" -"\xe\x32V\xbd\x46P\x81j\xbe^\xa8l\xe6\\.\xb4\x18\xd0\xad\xda_>\xa0N\x17\xaa\x8c\x45" -"6\xccG\x1a\xc2\x2\x36\xe6n\xca\x36\x19\xf1\x61\xdf\xef\xa4\x85\x38l0\xeb\xb8jz\xd9" -"0\xfd\n\xad\xf2\xdai\xdc\xaf&\xc0\xf6w n 0\xe3\xb1[6b\xc0\xad\x3\xdb\xc1\x63n\xbf" -"\xad\x1f/,7\xf5\xfa\x98V\xb0\x19\x8c[\x1d\x80\xb6\x9c^\xff\xd9L\xe0qQ5\xc6I\xc2k" -"\x9b\xa1&k\n['\xc\xd0\x8apaf\xc0\xb3 \x91\\\x87\xb2}\xe2\x1d\xeb]~H\x6\xf6\xe7\x0" -"\xb7\xa0jN)\xb6)\xcb@v\x19\x83\xe9\xca\x8e\x34\xe8i\xab\xd0M\xda\x19\xb\xfeZn\xe8" -"\xb2-~Q\x1b\x84\xeaXJ\x84!\x1f'\xaf\x89\x18\xdcZ\xf8\xa1\xff-6\xbk\xe3\xca\x8e\x66" -"\xbaL\xd2\xcej%\xe7\xe8\x94\x6hM\xa8?\xfb\xcc\xcc\xbf\xd0\x84O\xe3\xbe\xcd}\xe6w" -"d\xc5\x9c\x2-\xb1\x16\x8dX_\xe2Ps\xfe\x0\xe3\x2\x18\xd1\xdf\xe1\x15\xca\x1f\xc6\x6" -"\xaf\xcb\x4\xf2\xa0\x82\xef\x91x\x8bk\xd0\x96\x84\xde\xa3\x1f \x3J\x91\xab\x9d\x97" -"\x13\x66\xf9{P\x9\xfe\xfb\xf1\xef\n\xd9\x41\x65@\x81\xb1\xe8\xf0\xb2\xeaIPi\xa1\xdd" -"\xf1\x1d\xc5hW\xd2\x95\x33\xdc\x85yX\xb4\x9d\x1a\x7ys(\x19\xfd\"\xe4\x37\x8K\xd9" -"\xf3\xc4\xf2\xcd\xa4\xd1,\xa1\x44\x31\x93z\xb6:\x3\xf9\xc0@\xaf\x1d\x80\x1f\x36z" -"\xbd\xcas\x2\xe1\x8a\x90P\xd6\x2o\xbaZZ\x7f\xad\x44\xe3\x15\x93\x17<\xdf'|\xd7\x37" -"\xd1\xce\xf5\x9f\xe9hBR\xbc\r\xdd\x0\xa8\xe\x2;\x88\"$\x94\xc1\xc8\xc0\x88\x42\x30" -"\xab\x11\xd1\x8\x32%\xaf\xdc\xdb\xc1\xe2MJ\xd5\xfa\xb3\x96\xd2\xe3p\xe4Juq\xb2\x30" -"f\rQ\nPv\xd8\xe3_}\xb7,\x5\x66\xdf\xc1\x19\xee\x1b\x8a\xc3\xc0@iP\xa3\xc4\xa4\xda" -"6\xbd\xe2\x97\x4\n'\xf7\x7S\xa8~l\xd5\x93\xdck\xe9\x96\"\x61\xa9\x9a\xe5\x94\x93" -"@\xc5\xd4\\\x94\xa9\xaa=\xd6\x36\xce\x8bI{\xbb\x81#E|\x82OD:S\xb3\xeeY\\8\x98?\xe3" -"\xe0}\xbd\xc6\xac\xd5\\\xae\x8b\xe1\x8\x1a\xfdHW\xa5\xf5*<\x92QCPz<7\xf1\x99,\xf7" -".\xd0\xd4\xc4\x8d\x94\xael\xad\xdc;\xc8z\xc3\xa3\xef\x3^\x2\x18\x1fxD\x9eK\x6;\x8" -"5\xe8'd@QU\x1c\x16\x3\xe2\xea\xb5\x87_(\xfcw\xbe\xbai#B\x8dU!\xc6\x98\xc6\xb7\xf1" -"3\xb0\xf6\x89\xf1\x5\xfd\xba\xc3\n\x8e\xd2\xf2\x9f\x2U\xdd\xf8\xa0\x37\xb8\x1f\x4" -"\xed\xf0\x4\xcb\xe6\x39\xc8\xdb\xf\x94\xd0\xc5\xdb\x92\xd3Mf\xc2\xfe\xd6l\xf8\xb8" -"\x95\xaf\xc4\xe6Y\xd0\x83\x88\xea\x44\xea\xe8<\xe4Y\xe5\xbe\x30gP\xa6\x82\xb6'\x80" -")\x90\x3qW3\x9b\xf1\x42\xbc\xb9\xc0\x8f\xaf\xdc \xccO" -"\xc7\xca!\xe2\xc3\xf6\xc5\x46\xcdx\xde\xe3H\xf1\xa4\xc8\xcbT\x8e\xf2\xc\x4\x96x\x91" -"gq\xd8:\xcc\x9b{\"xJ\xd8X\x1\x34G\x1ae\xf\xe4\xa3\x33\r\xa9\xc3~\x9e\xb4\x99\xdfZ4-\x8b\xa4" -"\xc0\xa0\x33\xc3\x34|\xb2Z1\xbe\x14>\xcb\xf9\x13\x84\xf2\x38\x1e\x32>\x7f\xd3\xa8" -"*1\x97\xc1\x89\x5\x32\x0\xae,\x86\xb9\xd0\x1a\xb0\xb2\x89\x84\x1e\xa7\xe9\xe9\xa2" -"if\xe0\xde\xf5M\xe0\xb8]\x8d\xf0\x84\xb8\xc5\x90\x8\x1e\x44K\xaf\x1e\x1f`g\xf\xa1" -"*\xb9qY1\x86$\xf2\xaf\x1b^\xc7\xdd\x83\xc1\x7:\x99\x39\x8d!C\xa5-\x10\xa1< \x1f\xb3" -"V\xbc\x9e\x90\xc6;\xb0\xbc-LB\xafJ\x8b\x9c\x8cMX\xa1\xb3.\x5\x97\xc6;?\x8b>\x89;" -"\xd3\xbe\x8c`#\x18\x38\xf1\xbcx\xe7:l\x8c\xdd^\x7f)\x7\xf8\x97\xfc\x8e\xe9\x9b\xff" -"\xdas8\xbc\xef\xb5\xae\xf9P\xe5T\x9a\xdf\xd2\x7\xae\xb1XF\xb5\x9\xfcW\x98\x98\x83" -"d$\x98\xa3\x81\x1b\x8e\\\xdei\xc0Y$\xef\xae\xc2\x32\xfaL\xef\x30.\xe3%\x13\x66\xec" -"\xae\xf5}%\xcf\xa3\xb4\xa9\xe6\x39}\x99oB\x1c\x90\xb\xeb\xcfs\xb0\x38\xfe{\x16\xfd" -"\n\x11r\xac/@\xd1\x9c\xe0\xb0/\xce\xb8\xbcG\xdaSD\xcb\x93<\x7f\xec\x95\x1\x84\xf7" -"\x8a\xcb\x32\xd3\xe5\xe2\x90\xe8K\xe7S\xb9\xe7\xa7\xbf\xc4\x41l\xcf)\xd0#v\xc\x6" -"\xcd\xde\xf2PX\x6\xa6^\x15\x8\x99\x5)$PY\xaf\xd3\x1\xdb\x66\x9d\x41\xbdr\xbfz\x80" -"\xa9\xdf\x66\xb8v\xb3U?\xdfM\xd3\x8d\x15(\x9a\xf7\xa1\xaf\xbcS\xff\xff\x13ZcH\xdd" -"xJ\xb4*l\rj\xa3\x30\xb0i`~-\xf3\xcb\xef\xcey\xd6\xf6>'L\x9es\xa3>\xb8RF\xd5\xeb\xb9" -"\x86\xbf\xa9#\xdfh\xb2\xb8\xcf\x82\xafl3\xe7\x85\xf3[%\xb1\xd1\xd6\x14\xde\x85\xa4" -"\xf4Q\n\xdf\xe4-u\xb5\xfaT\x8\xa5\x9a\xbeS\x85\x9e(\xb3\xd0\x0\xeb\x9cj}/g\xc9\x1d" -"\xd1L\x89[\xa8{\x9c\xb5{\x85\x1eQ\x93\xfc\xc2\xa4\x43\xaf\x85\xfe(\xdfo9S\x7f#\xa0" -"X\xbc\xf8\x1d\xd8\xc0L\xb2\xc2P@0\xfLU\x97^\x85m\xcbN!\xe2\xb5H\x1b\xdc\xc0V\x1\x94" -"/\xb2[\xb8\xa6\xb6\xf9>,*3\xcdG\x8b\x44\x65VW\xc5W\xeb\xb0\x80\x17\x9e\xe5\xd9\x8c" -"\\\xeb\xe0\xb2[\xfd\xd9R\xff\xeb%\x80\x14\xd7\xa5\xbcK\xcaO\x1a#\xbb\xa7\xf6\xcenwv:#\xaa\xc7}\xa8\x8c\x8e\xfa{\xbb)\x91\xe4" -"r\xff u\xfb%\xa7Z\xcf\xa7\n\x4\xc2\x87\x64\xf4\xaeL\x12\x5\x1b%\xb1 \xca\xd2\xe3" -"\x4M\xa3\\\x1f\x94\x13]\xbdi\xb1\r\xe1G2\x1c\xbb\xdc\x81L\xe9\x99\x82\xac\x1dv\xce" -"=30\xe4\x1a\xb3\x1f\xfb" -"S\x5\xf4\x9c\xb8\xc7\xbc\x45\x13!\xad\xd7\xd8\x96\x39]&\x9d\xcd\xfd\xd0\x84\xeb:" -"\xa7\x3\x38l\x6\x97\xe9\x62\x92\x96Q\x16\x41\x35\xc0\x94\xd9\xbb\x1c\x9b\x94\x9d" -"^\xeb\xd3\xbb\x17\xf0,\x98\xc8\x13\xcc\xbf\xb2<,&!\x8a/Lc\x9a\x8b\x9d\xff,)@`7\xf9" -"\x19\x38\xa5\xe1\"s\x10r\x84(\xb5oH\x10\x8c\xde\xb3;\xd3\x19\x1e\xca\x89\xf9G'\x19" -"\x83\xdbwk+\xc8\x97\xa3\xe\xec\xf2`\x1e\xe3\xb2\xa6\xf0\xe1\x35\x39v\"\xaa\xc1\xf2" -"\xdfR<\xe6\xe6\xbcr\xe\x13\xcbS\xc\xefJ\xb9\xc8';\xd3\xd8\x15\x63\xac\x8a\x8elD\xa1" -"\x95\x11-\xaf\x82K\xc7\xa7/\xcd\xc4\xe1)\xa4\x80q{\xeb\x1\x8]\xee\x65\xee\x43\x44" -"\xd0\xb4\x1e\xc0\xbc\xdf\x84%\x66\xb1\xd9\xf5\x35;\x1fj\x6?\xfal\xdb\x6\xef\x63L" -"\x8b\xd5\xa7\xa6?\x99\x1d\x17\x8fV\xea\xca\x65=\xd6v\x85\xceI\xe9\x8cuTtZJ\xc5\x33" -"!vb\xd2>\x1di7\x13]\x13\xbc\"\x8\xeb\x8dPV\n+\xaa\xc3\x19\xdf\xaeG\x8bk\xa4\xca^" -"\xda \"/\xe\x9b\xdb\x8\x6\x32\xe\xd1\x66[T\xa3G\xde\xc\x42\xe9\xf7xB\xdeM\x18\x8e" -"~\x82N\xb2\xf0\xd7\xad\x16?\x5H\n\x7f\xa9\x9cZ`;\xbc]\xbc\x84\x37t\xca\x66\xe8\x89" -"\xb9\x45\x5L\xe\xd0\xb1\xa4\xbb\x14\x32N\xf9\x1\xb0#\xc2\x8\xcb\x95\xdf\xce\x92\x84" -"\x89x\x96\x90\xcc\x45\xba\xb9{\xe4I\xf8\xe2\xf5\xaa\x92v\xc0W\x13\x3\xe9x\x8c\x46" -"\xe7\xf7\x89U[\xfc\xdc?\xa9\xed\x8d\xa8\xad\x9b\xa4\x8b:\xe0\x94\x4\x66\x43\x91\xe6" -":\x98\x9e\xf1\xe2K\xb4\x64\x4:\xa0\x99\xe4\xf2\xd7\x96\xe3R\xeb'q\x6\xd8\xd8\x1b" -"\xaf/\x85\x62\xef\x46\xbc\xfd\x1e\x0G\xe8\x1\x8c\xbd\x97\x30!\xdc\x1c\x1d\x82\x1a" -"\xf0?\x8?\xb\x8\x8a\x62\xeb\xcf+\xf6\xc5\xb0\xfc\xfa\x44\x1a\xad\x16%\xfd\xb8\x34" -"\xf9\x43\xddG\xa5\xa4.\xb3\xe9\xa5\xb4\x96\x41\xf7\x97\xc2\x88\xb7\x99\xa6H\x97\xf1" -"4`pF\x1bmS^\xcN\xd0\x99\x19\x9c\x38z1v\xae\xdc}\xa7\xe7\xd9\xe1\x18\xe5Ue\x9*6\xf7" -"\xc7J\xbf(\x17 \xc0\x14\x7fNO7\xd4\x94\x36\x46la\xff\x12vN0C\xd8\xa6\xd0'\xe7\x5" -"7\x16O\xeyB\xf4\xac\xa4+\xb2\xcb\x13\x61w\xefq\x97\xe7oI\xab@?t\x1c\xe\xf9\x2\xfe" -"\xbcG\x1a\xd6\xc6'BC \xa8\xc3\xa1\xf0L1\xcQ\x1b?\x91\xc3\x93}\x9a\xcf\x45\x99\x99" -"\xc1\x8a\x33\xf2\xc8R\xec\x38\xca\x80\x65\x99\xc7(\xc5\x43q@\x18\xc6^,_C\xf\x62p" -"\xafR\xadq\xed\x38\x81;`D\x7yE_\x95)\xa4\xa1\x62<\xb9\xf5\x42+\x92\x16\xf9\xcd\xba" -"\x91;\x9a\x1c\xd9]\xa2%\xe2T\xe8\x10\x12\x16\x8P f\x5\x9\xd0:\x3K]~2\xe3\xdb^Yb\xa9" -"\xa2w\x11\xd4\xc3\xe2\x9c\xd8@W\xf7\xd0\xd7\xe8\x0\x9G\xaf\xe8\x96\xf8R2S9\x1d.\x11" -"\xff\xfeR3f\xb0\\S-V)\xa9\x7\x41\xea\xb3\xd4\xa7\x31\xd3\xf6\xd4\xf0?\xf9\x32\x33" -"\xdd\xf8\x8b\xb1\x91:\xba\"\xeb\x9a\xa6\x31\x1e\x31\x44\x38\x1d\xae)\xbc\xc8\x63" -"\x99X\xee\xe5\x9a\xcc\xfa\x6\xf3]\xcc\xc6>\x6\x9\xf5\x42\xf3\xee]\xfb\x1c\xf7\x18" -"\xca?2\x84Uro\x8f\x65\xe2:\xcd\x97\xe@I\"Y\x98\x37\x1b\x63\xe3Z\xe9\x8d\xc5M\x83" -")\xb8\xdb\x9\x1\xfa\xa6\x31)\xed\xe2\x1b\x15\x87v\x98\x1dM\x9@\x13\xc0\x96\xe9\xcd" -"\x2\x3\x15\xd1#\xc0=\xeb\xa2\x1e\x97\xe4\xb5\x84\xb4\xbc\n\xf2_]\xceS\xc2\xdc\xf" -">a\xf9\x9b\xec\xab@y\x94x\xbe\x7fZ\xfd\x7fh\xe2>\xf5\n\xd6\x64\\\x96~\xe1\x12\x6" -"\xb6\xe7\x91v\x94(\xac\xdc\x37\r\x64\xe4\xf2\xb3\x97.\xeOD\"\x97\x19\x93Pf=nw/\xc6" -"wz\x9b\x9d\xe2\x15'=\x8,\xceN\x86x\xfe\x99H\xdc\x8d[\xe\x45\x9c\xd0/\x16\x45\xac" -"V \xf3W\x1a@\xb4\xd5\xa1}\xf5\xcf\xf4\x8bl\x84=\xde\xab^\xbfX\xfe\x13\xd7\xda\x8" -"\xe8\xaay\x2\x11\x92H\xb3\xb1Q\xdaX1\x1\xcf\x80\x85;\x1P\xfe\x5\xbd\xed\xbf\xb5\n" -"\x7f\xb0\xf6W(\xc9;\x9d\xf4\x8c\xe8\xaf\x1d\xf1\xfa\xc2\\\x1dX\xe1\xad\x30'J\x0\xeb" -"T\xcf/\x16\x2\x9e\x1a\xc0\xa0\x91\x9c\x6UGK\x9ai6\xae\xe0\xfbt\xbd\x18_\xe7\xd7\xb" -"\xb8G\x86\x99}4\xa4\x3&\xa7\x43V\xa4\xaf\xae\xe6{k&\xd1\xc1\xa7\xbc\xff\x86\x97\xb5" -"\\\x81l\xcdw1,3*U1]\xc5O\x9b\xc0\xa0\xf1%\x0\xe0\xa7k96)*=\xa2\xdd\xf5\xaa\x8c\xbb" -"\x9b]\xc3.\xda\xccH'\xd6\x84\xd2t\xe6[\x8bv\xfb,+\x19\xf7\xd5`u#\xfa\x95>4\xbb\x39" -"\x3,\x5\xb1\xc1$C\x4`lUf\r<\xa8`~vN\xa5\xb0=\xb7\xfc\xab\\\xf7x\x8cn`\xec\x8c\x44" -"\x9b\xca\xfd\x90\xbc\xab\xa4\x13+l\xbc\xcf\xf1g\x84\xfbY\xb3kw\xcf\n\x9e\xa5r\xe4" -"\xca\n\x1\xc7%\xa6\xcf.E\x0\xcd\xdf[\xac\xcb\x90\x94\xd4\x89%\x43O\x4\x41\x18\xcf" -"\xdc&\x96\xaf_\xc0\xca\xb3\x88\x41\x7\xed\x17\xb9\xbd\xe0\xc0\x10K\x12\x92\xa1\xf8" -"\xc9\x9b\x6\xfcJc`\xb2\x44\x80\xbdY\xdf\x4\x88\x64\x18\x99\xb0\xf4+\x13\x11\xb5\x82" -"q{\xa7\xec\xfe\xe1\x41\x43\x65KSq\xc8\xb9\xb2\xd8\x6\x85\xad\x38\xd8\x97\xad\x1e" -"d\x87\\(\xc7\x2\n\x84\xfb\xb3\xa3\xbb\xee\x16\x61}\xcb\x9b\xc8\"\xb7\xc5\x9cZ\x18" -"\xc0\xcf~\x80\x16:\xdf\xb7\xaa\x3\xb7\xcd\xe8I|\x16\x97\xd9\xf.\xd9\xf\x81\x30\x95" -"\xc5\xb9\x16W\xfc)N\xf0\xe3\x41\xdb\x33\x92\xed\x86\xc\xb2\xe0\xaa\x9)=\xf\x99\xae" -"\x9e\xb5Lv\x1c\xa2\xdb\x1eQ\xe1\xce\xae\xab'l{\xd9\x16\xc6\x85\x10\xd7-\x9agF\x8b" -"\x9\xb3\xc3\x9ax\x15\x62\x8f\xb1&\xcd\xfd^\xffY\xcc\x81\x84\xc0\xd3Z[Y`\xf8$\xbd" -"\x17T\x95\xdd>\xb1*N\x96\x0\x8c\xb1;\x8cWE0>f\xcf\x86\x8\xff'\xc4p\x9c\x1d\x85N\xb7" -"\x96\x8\xe5/\x6\x8f\xec\x1Q\xa7L\x12^\xde\xae\xa5U\xc1\x98\xfc\x8\x2{\xbb\xb8\x2" -"\x83^\x1d\x43Pw\xaeK\x1c\xcd\xbfr#T\xf6\xc5r\xbe\xb1\x37m>4!\x95\xfa\x80\xac\x97" -"\"\xeb/F\xe4M\xe0_Z\"{s\x1b\x8dJKn\xde\xf0J\xf2\xc5\xde\xc2\xee\xf8\xffH\xc5\xb1" -"\x87\x10\xad\xe3\xdb\xfa\xc\x95\x65\x5\xb6\xda\x9c\xcb|\xbb\x83M\xb6\xccuIH\x85]" -"\x83\x36p\xff\n\xc4*Gs\xfe\xa8\x32+\xec\xee\x4\xcat\xac-f\x85Q2\xd1\x1aQRD\x88\xc5" -"Gq\xb5\xb7\xa5\x12ym}z\xe0\xf9\xc1\xfb\xc9\xcb\xdb\xa0\x83\x10t\xf4\xd2\x0\x34\x9d" -"\xc\xa4\x5\x37\xb9$\x96i'f\xf0 \xac\x43\xac\x1\xdb\x8b*\xa2\xef\xa9\xd2\x17\x32\xbe" -":1_l\xaa@+\xb2\xe6\x1d@\xdd\xeb\xde\x11'm\x90\xc2\xc6\x1\xa9\x35\xc1h\xbe`\x4\x64" -"v\xad\xed\x15\x8}T\xa1Lh\xee\xcb\xbb\xb5\x90\x92|\x1e\x10\xd2\x91\xc9(S4\xcb\xc\x80" -"\xed\xbd\x39+\xdeMS^\xb6\x1f\x8evA\xf5\x8a\xc1\xdf[\x1cZ]\x91\xe3\xe2~\x5\xca\xf7" -"\xec\x97\xec\xf0\xc8[d%\x19z\xa8VR\x1e\xd7\x1\xe5\xae\xb8*\x7fR\xa8\xbd}\xc9}[?\xb5" -"\xc9\x9a]\xf8M\x1b\xaf\xf8\x90r\x92%\x9\xd7k\xc6\xed\xb1\\\xe5\xf9\xeb\x8f\x41T\xbe" -"\xe1\xe8 $\x2\x83\xbd\xc8:\x8eI\xaa\x9a&I\xb7\x95]\\\x5\x8f(\x18\xa6;\xd0\xbf\xe7" -"\xea\xce\xd4\xa4\x90\x63\xc4\x89\xa6&'z\xe1$or\x1c\x99&\xe2\xa2\xb6\xc3\x10\x45\xfb" -"\xcd#_<\xc5\x8b\xc4\xddlW\xfe\x99\x8e\xbd\x1e\x9f\xa5\x15\x46R\xbe:\x16\x85\xbc\xd2" -"\xef\xaa\x7\x9a\x32\x93\xf7\x81\x42\xa6G8\"\xfa\xb6'\x92~\xac\xcd\x61\xb3\xe9\x9c" -"0w\x10=-\x19\x38+\xc7\xee\x15\xba\xd0\xfd\xe4\x89`-\x5Z\x1\xdb\xbc\xf9\x1aVitU\x9d" -"\x1bG| \x94\x16\x88pS\x16\x9c?\x8fY\x95[\xe4\xde\x82\xb6\x5X\xcc\x9a\xe1V\x2\xa9" -"?\x2\x9fkC)\xe0\xe6*\x3\x98-\xb3/R)qN\xfa\x14\x91\xa7\xb2J\xef\xe1\x8f\xeb\xc2\xc9" -"=\xfeP\xb3\xf6\x41\xb5\x1b\xdd\x33\xda\x38\x87\x1b\xf5$<\x17P-\x0\xae\xa2\xd9\xe9" -"sN\x80\xa9g\x88\xd4\xcf[\xc1*B\xbc\x38\x61\x62\xfc\x88\xa7\x43^\xe1\x32\x0\xc1\xc2" -"\xc6\xcc\xc5\xd2\x1a\x3\x94\x10\x7\xb4\xc4)\x1b\xdbq\x14\x46\xce\xaf'\x14\x81\x4" -"\xbb$\x3W\xd5\xed\xa0\xeaZ\\\xe2}J\x83\x90\x9du\xbf\xc0]u\xf1\n\xa7Jm\xe3}}\xe1\\" -"\x1d\xda:\xc3\x4]\xa6\xcdH2=\x90NqkD^^\x9o\xcb\x37\x93S\xedp\xcfKo\xac\x10,v'\x11" -"\x7\x9e\xfa\xf1?\xb7L\x9bG\xafu\xf3\xf6\xbd\xa2\xa4\x64}*\xb4~\xca\xb6M\xa6\xcc\x1" -"G\x9f\x61\x8e\x8d-\n6ED^\x87\x44h<\xbb\xc5`\xd4|\x98\x7\x8b\x84 n\x90\xeb\x83\x9b" -"\x2\xd3|\x85+\x8e(Dc\xd4\xe4\xd8\x90 <=[ 5!\x10\x3N\xadk\xd7\xf4\x14V\xb8\x7\xe1" -"\xdb\x16\x31\xa9\xd4\x99\xe5.\x9d\x98S\xd8g(\xb1\xa2\xe5\x11\xf4\xf\x8c\xa1\xe4r" -"J\r\x17\xec\xd6@\xb5/\xf6\xc6n(i=\x89v_\xc3\x91\x61.X\x89\xe7t#\xec\x85\xcb\xd0\xa0" -"8\xb6\xba\x98\xb6\x7p\x1d\xc0\xc4\xb6k;(\xc7y\n\x1f\x1e\xb8\xd0Q\xdc\x98'm\xd9\xcf" -"\xef\xab?e\xc1\xc9(\xe4\x8a\x6\xc\x99+9*C\xe5n\xaam\xed\x89m\xeb\xceq\xf8$[\xe4h" -"\x7f/\x1b\x8f\xc0\xf4>\xce\x8d\xb0\xbd\n\xb0\x81\x1c\\\xe7<\xbe\x33`#\xa0\xd6\x61" -"h\xb3J\x95\xb4\xb0\xa7P\xb3\xbf\x1d\x19~<\x4,y\x14\xfas\x1dx1\xafy\x8e\x94)W\x1c" -"\xbb\x97~bX$N\x84p\x1e_\xf9\x1d`\x8f\x98\xfc=h\xa4\xee[\x81\xd5\xff\x38\xb6\xc1\x84" -"\xf6\x11\x8b\x87_\x2+L\xe2\x7\xdc{7\xe1\x45-\xfd\xc5\x91\xa3\xe5\x6\xae\x82\xc7\xe7" -"\xbf\xf0\x1\x1b\n=\xbd\x61j\x99?\xbf\x87\x8f\xb0;l\x9f U\xa2\xb0\x95\xd2\x93\x61" -"\xf8%<&#e6\x87\xfe\n\xb9\x80x\xf6\xae\xe5\xfc,+\xde\x4\x5\xea\xbe\xdb:3\xeb\x7f\x4" -"\xcbh7\x17\x62\x45\xf1\x90\xc6\xbb\xbc\xd6\x45\"\xb1/\xe7\xf9\xcd\xcf \x1a\x1a\xa8" -"\xa1\x9a{\xbcJ\xc0\x64\xb4\x95\x8f\x44\xaa\xf\x8d\xda#\x83Z\xd2\x8a\x1f\xd0\xea\x10" -"]\xe2\xf3\x95\x38]\xcc\xfb\xe2&\x1d\xc5\xa8\x9a#\xaf`j9\x85\xe5\x3\x87\x6\xb1\xfe" -"\x9\x10@\xe\x16\xbf\x0\x8f%\xf;\xde:\xd8\x6\xc7\x35I]I\x9f\x16\xf9\x92u\x1\x4x\xfd" -"!'\xbf|\xed\xd6\xb5\xbdP_\xbe\x9b\xd0\x6[Jp\x90\xc9\xd2|\xd5\xb3l:\xd3>\x1b\x31\xeb" -"mD\xe3u\x0;Q\xb9\x9\xdaP\xbd\x18!\x84\x18\xb3\xcd\"\xb4\x32x\xb1\x44\xbex@n\xaf\x16" -"\xc7\xdfkl\x1c\x62\x38\x0J\xabssk8\xe1hD\x1d\xc1o\x9a\\\xf6\x7\x93\xa1\x86\x33\xbc" -"C\xd7\x86t\xd1-8\xcc\x97\x9f|\xaa\xdan\xfe\x80|\xeaI\x9c\xb9\xfe\x61\x64\x96h*f\xe0" -"K\xbd\xac\xe1\xdc\x11+!V\xb9\xb0\xb2\nX\xa8\xcb\x43\xff\xe\xed\xb9\x98\x5#K\x9aW" -"\x89v*\xc7\xd6_Z1\x9c\x33\xf4\xf7\x43\x8c\xd1^\x6\xbb\x80\xa7\xa9~\x97n\x8c\xec#" -"\xf4\xc6\x46\xa5\x82\x18\x80\xa8+/\x1d\xc2wg\xf0\x90\x99~\x91H\x8b\xfa\x15\x6Kp/" -"\x86O\xce\x65\x5\xd6\xce\xf8}*\n\x12\xb5[\xa1\x89\xaf&\x98\x11\xe3\xb8\xb8P\xc8@" -"\x1f\x39\x6\xc0\x80\xd3&\x18\xd9i\x8avg2\xa4\n\x9f\xc5\xa9N[\xdd\xa3\xd0(\xd8#\xd6" -"\xb6\x3\xb6\xd1}\xd0\x46\xde\x18\x1f\xd9\x89\xea\xf\x80\xb4\xca\x62\xf7\x97>M\xf5" -"\xe0\x32\xa3\x1f\xe6\xbc\x8f\\\xdag\x8dJrx~\xb8%>\xa5\x88,3|\xdf\x9a\xa3\xe1\xe7" -"\xd9Sm\xd0\x9b\x4|\xd8\x96.w?r\xf6\x41\x8a:\xefZ(\x9b\x34\x6\xc1R\xa5\xc\xe7\xbd" -"KI?\xff\xc2\x7fj\xa5/y\xeag\xe3\x62\xfd\x92U\x9a\xa4\xf9J/x\x7fls]\xfa\xdc\xf2\xf0" -"\x8a\xaf\x98\xb8\xcS\xcaV\x7\xa9O%\xf0J\xa6Zp\xa7Y7\x84\xes\x5[=e\xfb\x5Lc\xe2\xe4" -"\x8ehH\x8c\x93\x15\xa1>\xe9I\xe0>Fr<\x11\xccu\x9d\",\xbf\xad.\x1a\x87\xca\xd7y\xb2" -"=8\xf7\xe2\xf6`\xde\x13\x88\xea\xf1\xcfM\x18\x99Mu\xc6\xcc\x63\xf1\x87\xfd\xb9I\x94" -"\xc\x18\xb5\x37\xa0\xaf\xb1*\xc5\xf6{\x2\x83\xca^\xfe.vLCi\x10K\x9d;\x6I\r\x12\x44" -"\xc4\x1d`\x85\xc8_\x11\x6\x8.\xc9\xdb\x84Xb0Q\x1c\x5\xc8$\x12\xd2\xcd\xf3\xda\xfb" -"\xf4u\x9awV(\x87\x8f\x99t\x15)k\xc4\x16\xac\x83R\xa6\xc6\x98\x86\x91\xfc\xb8\x31" -"\xcf\x95\xc1\xb\xaei\x1a\xdb;\xa2\x91\x8b\x35\x92K\xd5\xc3\xac\xad\x8b\x13s\x97\xb1" -"\n\xf8+G\x98\x0\xfe\x16\xd4r\xcd\xc\xdb\xda\xabO\x88*\x6I\xcfV\x10\x4\xb8\xcb|\xa3" -".\xc1)\xd0\xa4\x15\xbel\xb9\x1d\xa2\xb6_D\xe8\r\x13\x88\x8\xa1'\xe8Q\xa7\xfc\xf9" -"'\xe9\x9d\xaa\xe\xa2\xd6&\xb7z\x16\xc7.7\xf0X\xa3\xb8\x82\xfcIU\xdc\x8c\xb6\x31$" -"4\xbd;\xce\xd7W\x80\xb1\x35\x90\xbfO\xe8\xd6J\xcf\x3q\xf9\xfb\x1d\x36\x1b\x5\x2X" -"R\xaa\xb9\xed\xa1\xa0\xc9\x97\xcf\xa5\x80R\xc4T\xfd\x45\x1el\x1f\x19OM61\x14\xe3" -"\x12\xf6\xdc\x35\xbb\xaf\x35z2\xcd \n=\xd9\x65\x41U\x13\x42Y\x88}gz\xcc\x44\xf8\x9a" -"\xa4\x1\xca'(-\xf7\xdc?/\x4\xa1\x8\xcb\xef%X\xdc\xce(\xba\xc2\xd8{\x8d[q\x81\xea" -"\x92\x7f\x61\x97wd\xf8\x82\x62mJ\xb3\x38\xd9\\\x94w\xc5N\x9c\x36\x1*<\xff\xbe\x19" -"\x9e\xc8\x12\n\x99\xd2\xd7\n!\xf9\xd9\xa0\x35NN\xacyG\x99\xe\x8an\x6\x1yj\xafo\x14" -"\xe7X\xca\xbc\xab\xdf\xbd\x82\x4\xa8\xe7H\xa3\xe5\xfe\xbaW\r6\xe2\xbfGL\x0\x83\"" -"\x9a\x63\xf9\x61\x14\x18#!\xb2\xeb\xe1\xbcv\xdd\x19\x37$\xc4X\x8c\x1d\x39\xd1\x84" -"\xc3\x32\xfa\xea\xf4\xc6)\xf2\xb3\xb2\xf4\x99\x96\xe4j\xa6\xc9\xf4\x97\x42\x8b\xea" -"R\xd5\x88v\xb0\xdc\x7\xb4`$\x8b\xc8\\\xc1gs\xa5\xda\xc3l\xde\x8b\x15-\x96\x5\x7f" -"N\xfa\xaf\x8b\x1d\xc1\x0\"\x3\x85w6\x80Wi\x9b:7\x17\x8a\x9f\x1fll\xc6\xb\xae\x82" -"\xbz\xdd\x7\x17\x91\x1b\xd2:m\xcd\xad\xaf\xa3$sI\x1a\xa8\xc\xfe\x90\xf2\xa7~$\xce" -"(&\xffw\xb1\x8b\x86\x9c\x33\xfa)/\xe0\x1d\x64wvPD\xc7\xd1JT\x8b(\xb1\x36\x1%\xc6" -"\x93?\x5\xc5\x8b\x8\x89\x39\x5\x37\xcd\xd1o\x8e\x96~\xb\x38W\x94I\xdf\xc1\xe0s\x89" -"\xb7\x6\x9a\xa8YLQ\x3\x46]PA\xcc\x92\x92h\xde\x86?\xad\xb6\x92[5\n\xa9J'\xd4!\xfb" -"\x7f\xcc\x81\xc6\xb3_\x90o\x12$kzQ@Q\x1a\x97!\x1b\xa9\xbdh1\xa5\x8\xe9\x63\xfe\x8b" -"\xe9\x61\x33/Ux\x8H\x8f\x6\xea\xd7^\x86\xd6\r\xe3\xfa$%\xae\x84\x39\xec\xb9\x11+" -"\xc3\xe4\xd7\x37G\xc1\xc8\xe8zd\x99\x19\x82pI\x83-\xb0\xbfm\xa8\xc8\\\x9a%\x92\xac" -"\x0(\x9\x7\x9\x0\xec\xadR\xa5o\x1b\xfd\x45j\xfe\x6\x65\x9iN\xac\x7W\x88\x45k\xb\xb" -"\xdd|\x19-2\x1e\x9f\xb6\xaa\xdc\xae\xf0\xfW\xf\"\xcdJS\"\xfb\xce\x8f\xa9\x8f\xae" -"\xb6\x81\x94\x8\x95\x42\x62p\xbb\x43\x19\xc1\x1d\xa6}\x88U*ss9\x8a\xec]\xa7\xc9\xca" -"\xa9\xf3\xb3\x45\x81\xc6\xe9h\xda\xaa\xb2u\x1c\xc0\x12\x19\x9d\xd8\x97\xb4H\x98l" -"\xff\xba\xe4\xd4\x12\xbf\x9e\xcb\xf4gBqZ\x95i\x93%\x16%\x9d;:T1\xcdp(\xe4/\xc7Q\xc4" -"4\xe2\xb7\x14\xc7\x18 +\xf0,\xaf\x9b\x8a u\xde\x92#\"\xea|\xfa`\\\x83v\xfa\x95\x8b" -"\x8f\xbe\x43\x3\x1e\x10&\xfb\xe6\x12j7u\xf6\x43\xeag\xeb\xbd\x97\xf2\x39\xfb\xc7\x1c\xab\xf\x89\xe3M`\xc6" -"\x9b'/\xad\xc2.\x8e{\xdc\x62\x10\xdb\x9\xfd\xd9\x13\xe2\x9\xf4\x9f\xd2\x8e\x87\x12" -"\xb8P\x89\x4\x62\x2Ptl\xa3\xb2\x1b\x2n\xda\xe6\n(\"\xf5\x9e\x91.bk\x93\xe0\xd2\xbf" -"\xb3#\r\xfd\xeT\xe9\x1a\x1d\xba%\xa6\x9\xb6MA\xab\xd8\x97\xa5\xd2\x17\x64\xc3Q\xe8" -"_\x9e\x87\xbe\xab\x9e\x64QI\xad\x32\xae\xeb\xb3\xb1\x16\x10\x32\xc7\x1\x64q\x15\xf9" -"\x8c\x1c*\xae\xce\x87\x18\x62\xd9\x1d\x32\x1a\xb9\xf>\x92;\x1f\xde\xe0\r\x92\x7f" -"\x89z\xa9\x81#se6\xe2\xe0p\xf\x10\x5=~lX\x9b\xf6`)\xd7\x94\x88>\xaeL\x82(\x94\x1c" -"\xe9\x65\x65\xb5\rH\x88{S\x14\xa2\xe5SyYc\x82\"\xa6\xcaT\xc7|\xba\xbd\x46\r\xac\x11" -"\xb0\x63Q\x9a\xe4\xf5\r\x93\xde\x41v;\xa7\xcf\xbfLw$6\xeu\x4x\xeb\x62\x89!\xda\xa0" -"e\x85\x83\x41\x95\x8eO>\xb5\x96lm\xd7|\x5\xee\xec\xdfK_l\xf1\x9a\xb5\x7X\x9b\x42" -"\x19\x37yY\xbd%\x8e\xc9!\xc3O\xe1\xdb\x0?}\xf\xea>/\xd6\xf5\xdd\xb0\xa2\xd6,\xa5" -"\xa2\xcdj/\x9d\xbf\x9f?4\xa0\x85" -"\xf4/\xe6:\xcd\x93\x1c\xd8\x46\xb5}0\xdb\xe2\xd6\xb4\xb4+\xa7\xb3\x84\x12\x4\xcf" -"\x18Z\xae\xeay{\r\x16\xdf\x1d`\x6\xb\xeb\xe8?\xbd\xd4\x93\x1a\xf1\x82{D\x9b\xef." -"\xab\x88y\xeb\xef\xe5Y\x1 \xef\xfb\x8fx;\xe0\xe`/\xa7nS\xeeN \xe9\xa5Q\x89\xbe\xe4" -"\xe\xcb\x84-88\xdc\xc5O\xbft#\"\x9a\xd6\x8b\x98\xe0\x33\x81;\x1a>F\xfJ\x9b\xae\xa1" -"\x87`\xd0]\x85\x98K\xb>\x16\x1f\x13\r\x92\xab\x90\xa1\xf4t\x16\xb3\xf2\x1dw\x97\xd2" -"\x84\x42+\xbf?\x18[\xff+-\xe1&\x4m\x9\xb\xe4O\x9a]\x8el\x80\r\xef\xd3\xa5\x39\x44" -"\xff\xf1uf\xaa\xb6\x9c\x8f^X\xcd~&\xc1\x5\xbb,\xa8\xac\x7\xb6\xff\x10\x43u\xa9\x8e" -"#\xe4\xef_7\x3\x11\xee\xaa\x19T\x16\x9c\xde\xc1\xa8#\xb5\x1f\x1d\xa9>P\xa6\xc0\x32" -"c\xf\xe\xd2\xf0\x10\x98$\xf7\xae\xb6\xb3\x85\xe\xc9\xd1\xc2\xa9\xbe\xe7\xdb\xd8\xc7" -"\x87\xf7\x8a\x94\x2\xf9l\x7f\xd7V\xf9\xc6\x31Q\xca\xft+\x8a\x1e\xe5\r\x12~\xa8`\\" -"\x1c\x1f\xe1\x94\x83\x32\x18\xe9\x1e\x6&\x1c\xbf\x15N|\xe4\xce\xcb\xb9\x41\xd7\x65" -"\x9fm\xa4\xbd\x99\x8d\xf9\xfd\x18Nol\xb0X<\x8b\xa1\x8a}&\xc9\xe8\xcd\xa7\xf7\x97" -"\x84\xf0S$6\x84i7\x0\xa4\x82\xa8\xf2\x18,\x91\x42\x11O%S<\xbf\x9b\xa2\xb4=\x83:\xa0" -"\xfc\x1dz\x95\xee\x86\xcd\xb1\x99!\xb4\xe2{H~.5<\x8b\x94+\xfd\xcd\x6\x97K\x81\x15" -"\xfa )\x1f%q\xfa\x63UQ\x10\xb9\xfd\x8e\xe1\xbc\x94g\xeb\xdc\xd4\x14[7,\xca\xd7\xe9" -"\xf9\x34`D\x9f$3\x1a`0)L\x17+\xc9\x18\xb1&bq\xe8\xc3\x9eR\x85\r\x83\xd2\xa7\x8d\x8f" -"\xd2\x63m>\xb9'ru\xf1\x44\x98$_\xdf&-T\xab\"\xc9\x19\x87m:\xb4\x7\xf0\x7f\xec\x8e" -"#\xd2\x8a\xcb-=A7W\xedO\xba\xf2\xd0=\xba\xae\xe7\x3\x45\xf6&r\xa2\x38X\x9a\x3\xb2" -"\x8b\x3\xa3\xa1\xabk;\x97\r(\xd2\xf7G\xfa\xcb\x7\xbe\xf7\xe8\xcb\xc0\xa8G\x89\x8f" -"\x0\xe6\xa2s \xcfQ\xdb.\x14\x39\x35\xf1n,m\xa9\xd1\xebT\x81\xf6\xe7XR\xc3\xbc|\xbd" -"\xbb\xde\xb5\xb2z)\x9e\x1a@\x3\xb0\x89\x65j\x96\xde&\xfbT\xd3\xfd\xe4\xb\x8d\xd6" -"M\x1\xe3\x30\xda)Hku(\x90\xa2\xe0\x80/\xc8q\xca\x86\xcb\x8e\xb4\x3zr\xfesP\xe8\xa8" -"{\xdc\xae\xaf\x18#3\xa6\xbb\x92\x9b} +\xd5\xe4\xd1\xac\x9e\xd6\x9d\x15\xf8\x16\xe3" -"\x9d\x45\x8\x9d\xbd\x9e\xd2\x34\x3\x2\xf6\x39Im`\x18\x1c\x0\xc3\xc8@\x17\x15\x85" -"\xc3M\x97\x91\xfc\xf0@\xf1(Xt6~\x12[\xe5\x82\x8\x8c\x1\xdc\xf7swP9#}\xa5\x33\xe6" -"y\xfe}\xfb\x9br!\xb0O-i\xad\xd1\x9e\xcf\xda\xb\x94\xbfS\xdc\x38\x9f\xd0\x66n\x7f" -"\xc2\x92\x38\x39\x95Q\x8f\xb7\x81s$\x8d\x9e\xe7\xf0\xfey\xca\x89\xad\x1J\x19\x16" -"\xda&z\xee<\xe7\x1\x5[\xc8\x8cL\xc0\x5=\x8d~\x9\xca\x7*\x4\xf1[\x18q\xa3\xc1\x11" -";)\xdf\x7f\xa0\xc1\xa6\x8\x8d\xdbk/\x97\xe0=\x82\x9fm\xe8\xfb\x1cQ\xd4\xe3\x44\x87" -"0\xfc\x94\xaf]b\xb6\x9e*\xfb\x84:\xe2\xa8\xb1-PF\xe7\xbf\xe9\xfb\xfc$\x4\xbc\x62" -"2\xe3R\xb2Z\x12\x8e\x8aP\x1do\xec\xf0%q\x9e\x1e\x1a\xd7\x89\xb@\xff\xff\xb0\x6\xdc" -"\xd4*e@-\xf3}\x8b+\x91\xcc\xff\x1b\xed\x30\xb8\xe1\x92\xb5\xf2\xf5=&:\xde\x7\x98" -"\xf2\xfc\x94\xd1\x96\x93sK\x16\xab\x45\xae\r\x0\r\xee\x66+ \x9d\xb9%\xadT\xaf\xc3" -"\xb5?\x15%\xa4\xbb\xb1.\xa7\xec\xd7\x12\xb1\xa4\x2\x97\x42\x98Z-W\"7b\xd6\xd8\x36" -"\x88\x45u\x15\xd9\xc\xa3\xff\xe2\x1d\x90\x99\x97\x9eN\xbcy\xbf\xacp\x8d\xa0\xad\xc4" -" \xc6v\xadYq(\x8a\xaf+\x8d\xacJtq\\\xfcv\xb1\xe6\xd5%\x1\xe0\xf7v\xb6PeE\x8e\x63" -"\xe1m\xc2\xc6\xd6\xce\x18\xad\xc8\xba\x94\x13\r*\x90x\n\x12|\x9b=\x87\x8e\x94&\xce" -"\x14\x96\x7f\x8e\x65\xe4\xbf\xd9\xf4u\x82\xef,7\xc3\x61\xc1\x0\x8d\xb7\xfe$Zm\xd6" -"\xc5\xbf\x8a\x84\xcc\xca\x5\xcd\x96\xcd\x1a\xea\xe0r\xc0\x98V\xb3\x36V>fA[r}X\xd6" -".\x9d\xcbs\x82\xc2\x1b\xc7\xe4P<04l\xe2\xbc\xf4\xba\xa2\xc8{p\xf1\xa7\x13\xea&\xfd" -"w\x93\xb1\x14\xe3\xb7q\x4\xd5\xf1\xc5\xee\x8c(+\xc0\x1eY\x1c\x6\x89s\xf8S\xc5x\x81" -"\x19\xd0\xcfS\xae!<\x17p\xab\xdb\x1c\xf3\xfb\xf8\n>w\xf7\xdbY\xf9\x30.\xa5[\xbb\x16" -"\xe9\xf7u\xd0O2B\xca\xd8\x8e*\x1c\xec\xe8\x7\xdbY\xda\xec|\xf7\xe8\x9c\xcc\xf7\x36" -"\xe\xc6\x11\xde\xcc\xfdPC\x1dg\xfb\xe3\xe\x80\x84:\xb2\x8c\xc0\xe3\xe9\xe1\x37L$" -"\xc1UgE>\x8e\x92\x8es\x5\xfe\x9e\xea\xb4\xe3\xc8\xb1\xbd\x92\x14\xb\xb0\xd4\xd4\xf" -"\x80\xbc\xe7\x63\xc2[\xb9\xf\x35\xa6\xe9\x7u\x9eWL~\x9d\x34*,x\xb1\xb7\x8bh\xcd\x93" -"\x1\x7^j\xa6X:N\x18R\x8b\xf0\x66\xbc\x84\x37R\x10\xa9s\xdd\x1a`\xa6\x93\xb4^\xff" -"lQ\xff\x89\x9\x46\xad\x33\x1a\xc0^\xf8\xb\xba`\x84$\xa5\x82\x96\x85H\xd1\xc5\x64" -"\xc\xb8(W\x86\xfd\xe0\x1c\xf8\xfb\x15\xc5\xb8!\xc5W\x7fz\xbe\x96\x83\xc1\x64\xba" -"\x9ai\x19\x6p\x9a\xc4mfK\x83:\xa7\xfeZ?\xad\xb6z\xd3\xbd\x82\xae\x43\x8|\xe7\x2\x12" -"\xb4i\xce\xa0\xe2\x8b\xfc\xce\xc3\x4\x96\xf8\x3\xd3\xec\x1f\xca\x36l\xa9%\xba? \xbe" -"\x9c\x34\xd8-\rr\x15\x19\x9e\x82\x9fM\r{N\x96\x30\x87\x9d\xa6\x8c\xa0Qa\xe4\x31\xb3" -"e\x10\x80M\x97\xab\xc1\x89\x1c\xb7l\xa2K\xfbz\x89x5\xe6\x7f,*\xd7\xd0\x97\x1d\xbb" -"\xd6\x81N\xb6T/~O\xa3\x6\xfc\x97\xa0X@`\x98\xc5\x35\x64\xef\xbf\x46\x89\xdc\x44\x8f" -"\xb6\x90\x80\xa0\x8aT\xc3`+U\xa6\x81\x9\xd3\xad?\xb8>\xed\xa6\xdd\xed\xa6\xdd\xea" -"N\xa4$U>\xc2/\xbd\xde\xf6RTH\x8f\x91\xadN\xd3\x8e\xf1\x95\xc4\x18\x42\x8e\xea\x7f" -"\xe8P\xc6-\xba\xc2\xf9\xe3\xc9\xcf\xc8\x65\x42\x15=\r\\\xaf\x94\xc7\x89\x16\xc\xee" -"\x1f\xc0\x9\xd0\xceh\x95\x1az\xe1\xb6\x66\xe4\xab\xbe\x82\xa1\xc6\xa3\xe9XY5.\x84" -"\x0\xe1\xf3\xe2\x7fN" -"\x6\x80\xba\xb3~>\xb4\"\r\xe2\xe2qs\x8a\x5\xc3\x33?\x7\xd0\x44\x41\xa4\xc7~\\\xb0" -"\xfe\xdd\x6/=\xc\x93\xd0&vD\xf5k!\xb1\xef\xda\xd3\xb6^\x8c\xc0\xd2\xccRdY\xcf#\x91" -"\x19\xf0\xda\x1b\xfd\xd8\x1fz/\xc1]\xe8\x65\x8c\xea\xc0\x1f\xa7\xf8~`(\xa8\xf2\\" -"\xe7\x11\xf2phB\x98\x1e\xde\xa8\xc6g\xf9\x8b.\x1a\x44\x63\x98\xee\x1a\xaf\x31\x1a" -"\xa9\x11\xed\x16\xdf\x8\x91\x93\xbbXaM\xf7\xbfYc\x11/\xc1L\x0\xdd\x18\x8f\xcdo\xfd" -"\xa5\x12\xdc\x8f\xd7\x1c\x30\n\xdc\x86\x61\xaf\x41\xcf\xfb\x7fp\xbap-\xfa\xdd\x1a" -"p\x1c\x1et\xab\xd0~\x80\xf9\x31L>\xa6\x6\xac\xa7WOM\x1d\xdd\xebK5\x8\xc7\x8c\xbb" -"7fw\xdbH0CX\x94\xa6\x1\xc8\xb3\xc7\x9f\xdb\x4\xaa\x4\x8d~\xeZ\xe3\xa5\xdbI\x4Y\xb1" -"Bf\x8f\x84\x81&.=I\xea\xeb\xaa\x86\x37\xce\x2\x11s\\\xfd[\xf2\x98\xbc\"t\xa3Uw\xb9" -"[\xd6\x9d\xc5\xaf\x9\x9f\x64\xf3\xc1\x1d\x64\xd6\x45}\x9d\xad\xf2-R\xf1JP\xd7\xd0" -"\xd8{-\xb6\xb1\xe1\x92$\xf7 0\x88\x8e$A\xf\x4\xc8\x9a\xad~\xf4Ut\xee\xf2\x3n>\x9e" -"y\x8d\x2\x10/c\xc6\xb8\xbb\x1\x8a\x91^Z\xf6*\xb7\xbc}\xb9\xb4\xda(\x9\xbd\xbe%\xe5" -"u\x16\xe8\xd1\x88\xe1\x98h\xbd*\xe0*\xf6\x9\xee\xda\x35\x88)h\x9f\x61\xd8\x11]\xca" -"\xe3\x8b\xcd\x8e\xf8\x61]V*\x83\xcf\xfe^\x97\xe2\xf0\x17\xe0\xb7\x89WV\x98i\x13\xe1" -"\xbf\x88W\x86\xe5T\xdd\x46M\x9c\x9e\x98\x44\xcd\x35z\xfb\x85\x8b\xfc(W[\xa3" -"\xe3P\xe8\x8b\xba*\x4[\xe0.\xdc\n$\xbc?\xf2\x1f\x98\xe3\x18\xd8L\xf2;\xa7)1\xaa'" -"\x8e\xe2\x1aG\x93u\xe0\xd5\x1\x93\xd8\xf8\xaa\xdf\xe2Ta\x9c\xfd\x82ZU\x9f\x96\x39" -"\xf1\x98\xce\xb4\x91\xba\xd5R\xf\x11\x99\x33.\xa0\xcf\xaa+\xcb\x8f\xaa}\x0\xf9\x7f" -"\xdck\xa2\xe1\x1f\x15\xd3\x0\xa9gj\x12\xf0\xe4Q\xf9-.\xd5G\xe2\xdf\r[\x8b\xbd@\xbb" -"Z\xa2\xdf\x66\xff\xbehS~\x82=\xa6|)6\x1d\x9c\x89\xc1\xfd\x19\x1d\x9b\xab\x91\x30" -"\x9e\xff^\xcWX\xd9\xea\xb\x9b\x19\x97\xcc\x10\x1f}\xb3x\x8b\xd9\xff\x8e\x1\xe1\xcf" -"\x1b\xa0\x32\xec\x90\xddYR\x85\x87&\xdf\x33\xcf\xb6\xa0\xb%I|\xd5\x14N\xda\xf4\x81" -"I\xf&\xc8\x2\xa0\xa3\xd2\xe9\xe8\x11O#\xb3\xf0\xff#\xfe\xe2M\x1a\xad\xbc\x36I.\xe" -"\xdf\xab\xec\rO\xa5|\x3LG\xd2\xe8\xac\xb5\xe9\xff^\xc4\x86\xda*\xc3\xedQ\xa3\xb3" -"i3\xd5\x2\x4K\xce\xc7\xca\xee\xbd\x38W\xd3\x83\xdd\xc2\x8f\x97\x63\"\xaa&1^?\xd7" -"w\x9aP1\xab\x41\xef\xe\xfb\xb2\x95\xaf\xe0\x66\xe7\xc1\xe8\x8\x36q\xe5\x16(\xecy" -"\x9aT\x9b\xdeH\xa5\x2\xf8y\xf1\x36\x1a\xf8\xc1w\xb1\"\xfe\x8e\xac\x38\x66\x8d\x88" -"\x82\xa4n} X{\xd5\x61\xb3\x44\x86\xda\xd3l)\x15\xc2O\xc4\x46\xd2\xbb\xc4\x1e%j\xf4" -"\xea~\xdd(\x91J\x1\x91\xee\x41\x16\x96\x1f\x33\x9b\xb8[\xdd\x38\xc1\x41vi\xb3\x45" -"\xd4okn\xa2\xe3 \x98\x12\xac\x61\xd0\x80s\x1d\r\xc8\x96#\xc9\xa2\x85\x66\xa7&\xa6" -"fZ\x5\xc7\xc{\xd2\xe1\xe7W\xc0\xa0;\xf8\x9b\xe8\x1\x6>@\xd6\xb6I'\x9c\xf4\xfc\xce" -"e\\\xc6\xcb*-\x95\xc8\x46\xd6\x4\x88S\xd6T(m\\,-\x8e\xea\x94\xfe\xfbgb\xfc\x17\xcd" -"\x93\xee\x1f\xba\xc2\xdf\xfe\xf8w\xc7K\xda\xceqc\xb6T\x98-\x86Kh\x81\x39\xdb\xf4" -"|z\xd4\xf3\x8c\xda\xb4+\xcaS\xee\xa1MBb\xda\x83(\xb7\\\xc8\xa3\x42W\xcs\x3\xc0S\xb4" -"\xc5\x7\xec.<\xcd,\xa8\xde\xf5Q\xeb\xcc\xc4\xf6\xfb\x92[\xa2\xac\x8f|\xaf\xbe\xd0" -"\xb0\xbf\xae \xa2~\xec\xce\xda\xf7\x90\xeb\x90R\xfc\xb6\xa2T\xa3\xedQ7L\x92U\xcb" -"DH\xf9\x9e\x41\x87p\x98z\x19(\x2vd\x17\xdb\xf6\x92\x9f\xed\x93{\xb3@V\x8e\x82\x62" -"w\xe8\xdc\x38\xf4\xdc\xed\x64N#\xb8\xf2\x98\xb7P[\x11\xb3{\xff\x88\x64\xa7\x18\x82" -"\x1dQ}\xc7\xaf-\x9b\xaa\x66\x19^{\xeb*l\xf3\n \xcbzr\x81\xc1;\x1e\x95\x39g\x6\xeb" -"=X\x8f\x93\xd2\x17-\xc5\xd0\x16X\xcc*F\"\x8f/dW\xae\x88N\x11\x81Y0\xe9\r\xe7\xef" -"f\xec~V\xd5\x39\xa4\x1bs\x90\xb4\xc1;)\xcdT\xb4>\x4\xef\x10v\xd4\x42\xab\xd4\x1b" -"\xad\x91\xf6\xbd+R6f\x9e_\xb\x83\x37Z6=\xb7\x5\xac\xd5(\x80>D[ 2\xf4\x10\xa6\xaa" -"\x9b\xfc\xc1\xc7\x4\xd9\xb9\x36M\xc7\xed\x9f\xb3L<\xbc)\x1c\x1aiH\xcb\xe7+\xd0\xb8" -"`\xf4;\xd4?\xfc\xabl\x19\n\x94U\x98\x30xjX\xeb\xebK\x88gs\xa2L\xefT;\x6\xb9\xde\xf3" -"\x6\xe8h\xdf\xb6\x9f\x80\xdd\x18\xb0w`n\xfa\xa2\x88\xf3\xa5\xfc\xc5\xad=\xd1\xd1" -"\xa3\x8e\"\xe8\xab\xeeP\xa7\xa6\xc5\xcb\x44\x7\xcb\x9d\xc3\x39\xfc\x4\xff\xda\xd6" -"\xe4\x81\x85\xbb\xe2\xe3\x96\xfe\x1c\x39\x86\xf\x94+\xc5\n\xa4\xcc\xdb\x2\xe5\xf9" -"a\xf8\x44\x1d\xaeT51i\xcf \x86t\xa9\x9e\xae\xf7l\x99\xc4\xac\x8al\xctP\x8c~Gp.\xc1" -"\x7f\x90\xe4\x2GI:\xc9\x6\xf2\x88\xde\xab`\x8f\xf6\xa5\xe6\xef\xa2`\xe0HR\xe7\xdb" -"\xc7\x9c\xad\xc1\x9a\xe8\xbf\x33\xbd\xe2\xf{\xdd\x11\xc6\x0\xe8\x36\x9e\r\xa0;\x87" -"|\xb4\xa0\x8fq\x91\x2\xd3\xc3\xf2\xf5\x8a\xb4\xb0\xa3\xaf\xc2\xa9\x10\x90\xbfj\xa5" -"\xeat\xac\x7\xcf\x30P<\xf5\x15\xa1\xbe\xd7\xd5\x94\xbf\xec\xbfo\xa5\xcc\x43\x61'" -"\x9f`|\xbcz\xce\"$\xaeO\xdb\x89\x83\x97\xc5\x0\x63\x1eo+\xfcS\x7f\x45\x7f\x86>\x9d" -"\x8e\xa5\x15\x34\xad\xac\xd7\xa1\xea\x8\xf4M\x8a\xe8\x82\xed\xa4\x11\xb0\x7f%\xab" -"\xedT\xfcR\x84?\xef\xe2\xfe\x3\xc7\xbc,\xfc\xc9^\xad\xa5'c\x15\xbd\x13\x83\x97\x10" -"/\x5\x65)\xec\x7f>\x12\xad\xd6\xa2\x90\xcc\x96\xda\xc9\xa4g\x87\x88\xc0\x63U\xc6" -"#\x5\x94\x85\"\x1c_\x3!S<\xfd\x0KO\xd7\x9cG\x92\x8mdX\x8c*\xbd\xc0\x34w\x1f\xd0," -"|B\xc5\xe1Lv\"\xcf\xb2\x19\x34\xce\x2\x11>\xbf\xe7\x1c\x9e\x36\x14\xe7/\x1c\xde\xbd" -"N`Ng\x9NV\x94\x12\x97\x4\xa2)\xd2\x5\xf1\x16\xb4<\x1cv\xcb\xed@\x9e\x1d!\xe\xf1\xa4" -"\x5\xf7\xf\x61\xc3\xb$\xaf\xc0s\xa3\xa5\xb8\"\xeb!}\xb4\x61\x88v\x7f\xe3:\xd1\x8e" -"\x9b\xeYEm\xb4\xd3:\xdc\xf\x18\x9b\xa4\x86I\xe8Ml\x9\x9b\xbe\xc7\x8c$\xf4\x87\x4" -"\xc6\xa9\x34\xdd\xb1\xa9nXf\xf3\x89\xf0;65u\x8a\x9d\xffoc\x9b\xc6\x45\x61\xa5\xab" -"\x17\xaa?\x1bK\xdf\xb0\xc0\x5\x9d\x33\xe0IF\xe9\xa5\xdaM\xe3\xfdU\x10\x7f\x9d\xa9" -"\xa9q\xdd\xb1M\xa8\xf3ur\xe8R\xb5T\xdbj\x88\x80oFa\xb0\xae#B4\xe1[\x99\xa6\xc4\x16" -"\xab!\xd3h\xdf-\x1c\xa6^\x9a?\xb7\x36\xdat\x6\x88\x43\"\r\x91\x63\x1bW\xd7\xb0\xf" -"\xcf_$l\xa9+\xb8\x38\x9d\x95\x1b\x9b\xafPp\x87\"m\xa9\xb5\x30\x62w\xbe\x1fR\x8f\x3" -"\xdc\x61\x16\x81\x13\xeeVG\xa7,\xddhlt\xd7.\x13\xa0w\xc4\x6\xebX\x89LW\x1e\xc9\xd5" -"\x8cs\xa4H,0\x2*\xe3\x83\xda\xbb\x44\x15\xde~u\x8a\xd9\xf6\x92\x44\xea\xbf\xe5.\x8b" -"\xe1\xe1\x42\x9c\x1a\xe5\x9b\x31\xfc$\xa5@\xa3\x1b\x91\x14\xab\xb6u\x8c\x43\x9no" -"\xa3\xe7\x14\xf7\xc2\xa4#\xa6q\xdd\x42\xd5jS\x3\"\x8fh#\xd5\xba\x62\xe1\xad\xec\x2" -"\x8b\x0\xc4\x38\x96\x9c.\xd5\xc1\xc2[\x9e\x8f+Zi\xf8\x9c\x9b\xfe\x8b\xbfP\xc4\xfc" -"k\xef\x8c\x8b\xb7\xd6\xf3\xb4\x85\x8d\xc5,Z\x8a\x90\xe5\xb1}\xfb\xab\xfa\x38\xea" -"\xf5?Qq\xacn)\xaf\x9a\x64\xc1=gn\xdb\x7f\xe8UVa\xbf\x42kq\xfb\x80\xf9\x84\xa3w\x8" -"\x96^q\x98\x13=d\xba>\xb4\x65\x98\x8eq\xf5\x91\xe\xc1\xb\xe=\xb6\x81\xe7\xec\xba" -"\xc9\xbd\x99\x91\xe6\xbe\xd1\xc3\xc7Z\x8a\r\x98\x6v\xddY+\xdag\x9a\x37\xcf\xeeMM" -"\xf2\xfa\x84\xe0\x1c\x98P\x7q\xcd\xef\xd3\xe5\xd7\xc8\xfeT5\xe3\x90V\xc0\x32\xe5" -"\xf4\x99L\x8e\xf1\xf5y\x9c\xa7\n;3\x12g\x9b-\xae\xb3:\xfb\x89%$hg\xf7\x10\xa7\xed" -"x\xaf\xf3)\x8b\xdf\xd5\xbb\xf5\xf4\x30\xc9\xc1Y\xc5m\x5\xc6^\xf4@OLRU\x1e\xbd|\xe6" -"H\xad*D\xb6\xbe\xf6\xd1\x8e\xbf\xebU\x2\x96\xc2\xb\xda\xe0\x46(t=\x7f\xfa\xff\xcb" -"\x8dG>\xb8q\xb6\xfbN\xd9L\x8c\xbb\xb0=\xd6\x9b\x1f[\xb4\x5\n\xb4\xf0\x92\xe\x88\xac" -"\x9e\xad\x11K\xc5\x32\xda\xb6\x98\x14\xf5\xc0\x2\x0J\x95\x9c\xa6\x30\xbd\xb0\x63" -"\xbe\x3\xbc\r\x35s*\xa5\x80#z\x5^\xba\xe9\xa0\xc\xa1\r\xb2\x83\xf6\xe1\x93\x99\xd9" -"\xfb\x9b\xd6l\x86%;\xd0\xd3\xdcs\xb_\xc8\x98\xbf\xa5P\x88\\N<\xbdkr\xf4;\x9e*\xb" -"\x1d\x36-c\x1g\xd5&\x95\xf0wR\x5*7\xb6U*\xa2\x90\xd1\xe7\x30#\xbb\x66\xa4\xae\x15" -"\x6\xa3\xc9\xa0\xdc\xe0\xa5\x8c\xeaV#hc\"\xa8\xfen\x88\xf2\x18\x2\x1%%r\x84\xf1R" -"\xcc\xee\x92\x31\x34(\xeb\x65\x33UCtY\xe1Z\xd3t\xe6\x86\xac\xa6ns\x7f\xdf\xb7\xc2" -"\x87\xbe\xa4\x14 \x1\x9bi\xb6\xa3\r\n\xc\x65\xb6\xd4\xb0`\x8a\xaf\x9a\xb4V\xe5\x64" -"\xa8\xca-\xbe\xed~\xe6\xba\x9cJ\xb1\x6l\xa0\x98\x35\x97\x1N)\x86\xb0\xd9\xf6" -"\x88\x90\x8a\x43\xee\xac`K\xcf\x9a\xb<\xa6\n\xba\x15_J\x3VZ\xc9\xf9\xfc\xc5\x61\x1f" -"\xbf\x5\x97\x8\x44\x31\xd3}\x97\xa9\x15.Q~\xf0\xf6\xac\x30\xc7\xaf\x14\xcaI\xbLv" -"\xc3\xa8\xc8@6\x11\xf2J'\x14\xbb\xf9R\xa4\xefwgQ\x8b\xf0\xb6\x97\x37\xb6[{j\xea-" -"h\xac\xb1\xf8,^\x96k\xe6\xab\x8b\xb3\x8a\xb1\x82\x37u\xbb\x35\xd6\xb\x1e\xc0\x1e" -"\x1a\x95nu\xad\x8f\xf6>\x90\xd7\xc3\xa0\x97\x98\xcb\x1a\xc0\xe1#WBuy\x85\x8~r~\x13\x93O\xb1\x37\x82\xe7\x19\x1c\xc0\x62\x83$\x6\xa8\xbc\x38" -"\xc5v\xb5\xd9l?\xf1%\xfb\x92]q\xf2\x17\xd7\xe6\x7u\xc0\xc6\x36`\x19\x37\xb7\xb5\xd7" -"\xbb\x35\xb6\xae\x8\xf1tZ\x1f{B\xdd?=\xc1Y\x9a+\x89v\n\xf2\x34\xd0\xcaU}\xf5\xf3" -"\xbe\x13\xd9\xe7\xce\xdd,>\x98'\xf2\x9f\x46g\xe4\xa5^\x8b\xac\x85\xba\xcf\x33qos" -"T\xeak\x96wl&\xbft\xf8\xc6\xdc\x18\x81\x41\x3\xcf\x41l\x82\xb2\"g\x85\xdb\x86\xe6" -"n\xdd\xe4]\xa8\xe5\xaas\x89\x34\xd0\x84\xed?\x8b\xab\x45\xc5\xa4i@\xed\xd3&\x10n" -"\xe1\xaal\x8b$\n\x98\xf1\xec\x82\x84\xbc\xac\x2/\xef\xbe\x97\x38\x85\xa2\xc5\xfe" -"\x2ZD\x8e\xf2\xec\x64\xc5z\xc0i\x98\xaa\xf2Op+p\xea\xd8\x62\xf4\x32tg\xdcUX\xb5!" -"\xb5\xa4u\xfa\xe8YSM-\xef\xf3k\x8f\xf2\x89\xc9\xc0U\x7m\xbeG/\x83\x38\x9dt0j\xa6" -"5\xa7\xd3s\x8f\x9\x0_\xa7;\xd9\x3\xa9?\xa9\x8fZ\xdaHZdJ\x11[\xedt\xa7\xfc\xc\x90" -"\xfe\xbc\xe2*\xc7\xce\n\xd8\xe6\x41\x43\x30\x1ag\x1e\x98\n\xc3\x35\xa9\xf\xa7\x35" -"\x17-\x98\x43\xf6^L\xf&\x7fIiud\xf8\x42\xce\x34\x9d\xda\xac\x38k1r\"\xa0\x13\x65" -"!\xc6\xec\xae'kc\xbe\xb2\xc1\x92}\x4\x88\x61x\xec>\xd9x=\xdf\x41N\xe1\x34\xd8\xb1" -"N\x92?\xfe\x1eZO\x1e&~uS\xe3\xb0!\xee'\xe5\x36\xbdIc\xc6\x94U1\x8e\\\x1d\xed\xa0" -"\xbbO\xaf\x81L\xd4\x99\x8ajJp4\xef\r\xa8\xc6O0\xef\x18\xc6\xab\x16Nb##>a\x83\x41" -"\x9fS\xa8\x1d\x92!\xa9\x64h\xdd\x39X\x8a~\x9a\x38\xfc\x7*\x96\x81," -"\x8cQ~\xea\xd5o6\x10XF\x86\xce\x91%\x5\xd5\xfa\x81\xcc\x1d\xe9\\{\x9c\x96\xc1\xc7" -">\xa7ip\xb2\xc3\x43\xca\x86S\xe}\x1b\xecV\xf0\xbc\x43\x7\xc6\xa4\xaa\xd3&\xad\x32" -"\x96\x97\x18w\xa6)H\n\xfa\x1a\x9b`*h \xf2\x1c\x65 \xbc\x9c\xde\xfc\x1\xa7\xc4\x8d" -"\xb7\x9c\xaf\xf6\xcf\xcc+\x9f\xb\xcai\xd4\x11%Go-7.\x1c\x8bkI\x9d\xab\x94>\x11\x30" -"\xa7\x64m\xd1\x7fn\xba\xe2\xbe\x1f\xaduxKP\x6\xf2\xd7\x13\xae\x30\xa4\xcb\xab\xcd" -"P\xd0\xda\x9a\xfaL\xf3\x38\x3X\xe5u\xb7i\xc6\"\x8b\x38tC\r\xb6\x8a\xa0\x41\x1e\x11" -"b\x18q\xd3W\xe2[\xc3\x99G\xe2W<\xc6\x8b\xfcS,\xcf&\x6\x83\x91\xdcQi(\xf8\xe7\x32" -"\xd2\x8\xe5H*\xd3\xc7>%]\x1a\xe8\xa9\x37\x0\x96*V\xc0\xf8:\xbe\x63\x8\x9f,\x9clB" -"\x16')\xd7M\xfe\x84\xbfr\x2\x6\xd4-\x82\xd2\x2-\xf2\x38\x18,\xd3=\xc4\xbc\x0\x13" -"\xc0\x30\xa9)!\xc4\xf9\x43\xcc\x8f\x13\x42\xf3Z\xc1\xdd\xd2\xa6\xff\x37\xb9,\xe6" -"\xc9S\xa9x\x8e\xe8\xc4\xca`2\x8cv\xfc\x37\xdf;\\\xbf\xb7\xbe\xe8\xd1\xa0\xf5\x93" -"N5;2\x9e\xc6\x9b\x91\x0\xc4\x1fR\xa0>\x80\xbf?\xaeQ\x90\xaf\x63\x17{\xcc\xee\xab" -"+D]\xff\x1b\xc\xfa\x37 \xc8\x9f\xfe!\x10\x81\x66\xe6\xcb\x33\x83Y+\xa4\x4<28n\x17" -"\xab\x84\xd5\x9a\x46\x32\x30\xa1\xe3\xbd\xb4(\xf3\xa0\x62L\xb0.\xda/\xdb\xcfk\x10" -"kr\xd9\xa3?\xb\xf2\xe\xf7\xe4\x65\x44\x89L\xf\x95\x8d\x9d!\xa5\xbe\xaa\x95\xdc\x9c" -"\xa8\xb3\xaf\xd3\x3\x98\x86\x1d\x41\xe8\xd1\xf0R>\xcf\xf6\r\xc3\x99Z\xdf\x84\xa4" -"d\xda\x46\x11\xc6\xf4V\x7f\x17O\x93\xc6\x89\xabr\xcd\x38\xc9!Wz\n\x13r\x81\x5\\[" -"\x8b\xbd\xdbp-\xca\xe5S5\x8\x12Ob\xc6\xb6\xae\x94~\xf8\x88\xdf\x84@\xb\x91\xf1]-" -"\"\xaf\x9f\x36\x86\xe\x8e\xfd\x8d\x31\xcd\x1dP|*\x93H\x1bR.2\xf8\x6?\x81\xf6\x8e" -"\xce\x98\\\x35\xec\xb0\xd8|\xcd\xa2\xbf\xdaI\xa7\x45\x1b\xf8?O\xfb\x45\xdb\x63\xb6" -"q]N\x11\x61N\xbZ\xdd?\x90\x13yh\xab\xb3\x39\x45\xa5\x36y\xc4\xa3u\xc6J'\xe7r\xf3" -"\xa2\x86\x91\xc5\x6K\x13\x35\x19\xaa\x12\x97\x9\x38\xc3\xbcG&\r\x8d;\x1e\x6\xbfj" -"90\x15\xe3im\xb9\x9\xea\x8a\x80\xef\x4\x37Y.\x88\x10`\xbe\x81\n\xf9o\xc1\x13\xda" -"8k\xa7`\xf5\xdf@\xfa!\x9e\x14\xa1\x1b\xa6\xa5\xbc}lT\xab\xf5\x9eq\xf3\xe8\xeb^\xb0" -"/\x8\x81\x94\xac:\x2\xdek\x89\xbf\xd5v\x82k\x14\xe2%\x34%\x1f\x63\xf8\x9fL\xa0Z\xb6" -"\xc7(t\x8a\xdf\xfd\x2\xe6\xb2\x1d!\x97\xe8~\n\xcf\x1c\x8\x1b\x65S\x90\x83\xce\xe9" -"ZG\xe2m\xd8\xf8H\xc2\x42%um\x9b%\x2\xe5\xfc\xf4\x82\x1v\xf5\x19\xe1\xfe\xb8uI\xf9" -"j\x0\x38\xb7\x97\x80ht\xd6v1\xb3\x41\xdc\xcfZ\x84\x14\xe8\x65x\x83\x9d~\xc3)h\xc5" -"~+p8{O\x1b\xa2\x11\x97\xac\x8d\xf1\xca\xc6\x17^\xf0\xa6\xf4he\xc8\xac\xbb\xeb\x12" -"\xab\xfb\x83\xd3OKR^\xac\xc1-'3\xc2\x9d\xf3\xccJ(\xa7\xe0\x30\x92&\x9\xe0\x39\x85" -"e\xff\xa5[\x1\x18\xa9\x4\xa4\xcb\xf\xedZ\xf5\x85\xc9\x38\xa8\x9\xe1W?c\xd8)\x1b\xcf" -"\xaa\xc2\xbb\x1d\xecVJ\x94\xd3\x90\"\x36\x97\x32;\xa9\xd5\x8a\xc7M(\xe3p2\xafo$\xf6" -"\x7l\xe4\xe9\x19\xb7\xb8Vy\xe2(\xc7\x43\"\x30\xa8]5\x5\xd6\xf6Y\xbe\x33\xb4i~L\xb" -"kn\xe2\nQ*\xdc:\x1d\x2v\xc0i\xe4k\x8bh\xe8\x1eH\x93\xfc\xf9\x1c\x64\xb8Nc\x1e\x92" -"\xa5+\xa9}\xae\xcc\xf4\xc3R\xa7x\"Ye\xf2\x9a\xcah\x9ft\xc1WZP\xc3\xfen\x90\xbe\xe" -"\x1d\xb1jnG=g\x9eZ\xd5\xf4\"\xbf\xb0\xa4\xba\xf0)\x81\xb0\xa1@\xa3P!\xd2\xa9\x91v\xd3G6>\xa7h\xb7\x1\xa4\r\xc7" -"h\xd5S^\x18`a+\x84\x19\x8e\xff\xd0\n\xa7\xbc\x9\xf3\x6zqk$\xdd\xe0M0\xb7?\xc9\xfb" -"x5\x15\xc6-\x3\x91\xc8,\xf8\xb3\xbf\xby\x96-\xb0\xbb\xb6\x99)_2Oi\x9_\x1a\x43\x8" -"=?t6\xa5\xf4\x96P\xba\xfb\x86\xd2\xd6\xad\xee,\x97S\xdf\xbe\xc5\x12\xbd\xc5\x1e\xf2" -"T\x9e\xcf\x37n\xc0_k:\xa3\x9\xd9\xc7\x9b\xe2\xc\x35\x9d\xdc\xe0\xf1\xbfO\x12w\xde" -"\x85\x64\xa2 $\xe2\x88\"\xe7\x34w\xcq\x7fp\xc7+\xc3\x99\xfa\xf5\xd8\xb6\x80\\:|k" -"\xad\xe9\xf1m7\xd5\xe7\xed\xa4\xd7WjE\xa9\xad\xa1\xe9\x99j\x99@\"\xb7w\xbe\n\x1c" -"m\x9c\xb5\x8b\x9\x87\x31\x9d\xeev\xe0\xd3p\x97\x94\xc0]\x15\xadJ\xef$\xb\x2\xcd\xba" -"=\xd5\xad\x38\xae[\xcb\x9c\r\xf2\x34+rw\xa0\xe2\x41\xaa]\xc4\xb7\xc0\xb5\xd6\xc6" -"j\xe3\xc8\x1c\xc7X\xd9\x7\x1cw\x9fqO2\x8b\xef\xff>\xbe\xc~~lN\xeb\x16\xc2u\x85\xa8" -"\xb2-g\x91\xb3MN.\xb9\xc8\n\xd9%\x46\x9b\x3pm\x99\x96\x2\xe)\x8e\x93\x1\x90\xeb\x9a" -"0\xf5jb8\x9f\xb4\x9b\x0\xd1\xf9\x1aj\xf2\xfa\x86\xd8_\xabO\x9b\x89\xdb\xd0v\xa0\x36" -"@S\xe7\x1a\x91<\x88un0TP\xc4\xa8 \xc8s#\xe4\n\x61[qX\xd8\x93\x12\xf8G&s\xce#r\x8a" -"\xae\xd2M\x4\xba\xee!Y\x1a\xeew%\x8eW?v\\C-\x1c\xd4\"\x1a|\xe5#9\xb7\xbaY\xa1\xac" -"+\xac\xf1R\xfb\xec\x1X\xe7\x87mA \x13v\x95\xa8\xbe\xad\xb5\x8a\x10\x7\x63\xa5\xed" -"\x95\x9b\x9c\xa8\x9fH\x1d\x9d\x9e\"o{`\x9aY\x9b\x30\xa6\xa4iK\xc1\x66\xee\xff\xf9" -"T\xe1\x87\xd5\x39\x87\x86\x8eM\x9f\x11\x12\x38\x8e\xb1+\x9eP\x17\xe3Vh\x1\xfb'\xa0" -"\x10\x12'\x84\x9d\x15\n\x64\xfb\xb6\x10N\xc6\xd1\xe7\xc3T\xa1\xba\xf4%\xc5\x83\xfc" -"G\xdb\xdb\x95\x8b\x8f^\xb6S\xb5\xa0\x45\xfe\xf9\x92y\xa4\xa7m\x9H\x12\x1fM7\xc0\x34" -"1\x9\x31\x15\x13\xe8#_qyH3}w|\x8\r\x13\x30\x17w\xab\x89\x87\xb3\xd6M\xe\xafp\xfe" -"(\xe9W\xa1\xe9*\x7f\xfe\x93\x82\xa5p#{=;\xd3y\x10\xda.Q\xbc\xf0KVl\xad\xca\"j\xe0" -"\xb8\xc6!\x5s\x8f&\xbfW\xedOn\xf0\xf4\xfe\x16\x41\x45\xdbY\x2\x86\xd1k,\xa3k?w\xa0" -"\xb4\xd2\x43G\x8cY\xcb\x34IK\x9 \x9e\xa1MO\xe0$\xf3s\x87z\xf8\x87\x93\xed\xa2\x93" -"W\xfd\x90\x81\x95\xa1\x95%\x7\xb7&\x13\x8e\x37{W&\xd2\x84GV-\xf5\x8e\x2\x66;\x86" -"\xcb\xfd\xf2t\r4\xa0\xcf\xb1\xc5\x14R>\xa1\xb7\xb2\x6\x1\x97\x13\xce\x97\x94?\xf8" -"ny\xed\x7f=\xbbY\xa6\xfd\x96h\x2\x64\xe6\x93\xf0k\x3\xe9P\xe4\xa2\xc3\xed#M\xb5\xc" -"\xa2\xa6U\x94\xc8\x90\\gJ\x9b\xef\x1f\xdf\xae\x8a\x6\x88P\xaf\x66,\xd0\x4)\xafOA" -"\xa8\xa9]\xbc\xbb\xa1\xbd~+T!\xa1\xfa#|\xf3\x1b\xc5/sj\xed\xdb\x18\x14\xf5\xa2)\xa1" -"\xe8\x1a\x3\x16\xc6\xf7\r\x17rC\xad\xc4\x81?\x84)\xad\x87M\x9e\xfa\xb\x92y\x97]\xc1" -"[\xc1\x41\xdd?\xa2\xc5iljd/\xdeN\xeanTvM\xa5\x9\x10\xe5\x1etPm_\x0}\x1b\x19\x46\xac" -"a\xf4\xb5\x46z\xe9\x44\x91\x92\xd3\xf3sg@pM(\xdf%\xa0\x18\xa6\x81\xc2M\xca\x18\x62" -"\xcf\x19\x89\xf1\x17\x9c\x80\xed\xf7\xea\x97\xebH\xb7%\x13\xa2\xf5\xf9\x41\n\xd3" -";\x1eg\xafJ\x9b\x84\xb7\x3\xc6L\x91H\xa4V@Zk\xdeK\xef\x9e \xd3;\x91\xb9!c%\x15\xd9" -"\xb7\xd0\x7f\xbf\xe4\x2\xd1\x61y\xe9\x11\x1\xaf\x1e\xbe\x99\xdfqX/\xbc\xc1\xaa\xeb" -"\xa1\x37\xcf\x37w}\xb5\x93i\xeb\x36\xeb\x8b\x88\xfdl\rq\xb8\x9f\x34\xfd\x1d\xf0\r" -"\xcf\xf\x1dXL\x12\xcd\x99\x8b\x8d\x31y\xf9Z\xe3\xc1\xdaH5C\xbd\x19w\xd8\x83\x10\xb7" -"f\x90\xd5VTk0\xc5sd\x1d\x1b\x63\x10\xd3\xf3\xc9\xe8\xc3\x98\xcam\x1b\x4\x8c\x62\x9d" -"\x14\x35\x84\xf6\xb5\x11w\xa8\xca\xe3$p[\xe0u\x1b\x1dv\x9cOz\x80\xff\xe8\x10\xf0" -"v\xd0\x7\xe0\x1aM\x8d+\xb8\xe\x6\xa1\xdd\xb\xc6\xa7\x9a-\xb1\xffQ'h\x80\x35+\xc\xa2" -"\xaa*s\x99\x91\x8b\xd9\x11P\x91\x7(\x92\x14\x9eQ\xd7\x8:G\x1c\x8\x35\xa5\xf5\x95" -"\x7f\"GKI\xeb\xc6\xec}j\xe0\xef\\\xde\x36\x34\xb8xT@\x99\xc5\x8c\x31%Il\xde\xb9\x88" -"t3[\xf1\xc7V\xb8\xf6\xcc{\n\xa4\x9d\x93\xc0HE\x1anH7z\xee\xf2\xef.\xdd?\xfd\x1d^" -"\xfe\x84\xe2:\xaa\x14\x38\x84\xd6\xf\x6\xf3k=_\xa9P\xc3sq\x5\xcd\x80\xbf\x38<\xaf" -"\x1e\x1c\x46\xe\xe9\x30\xe4$\x1#\xb3K\x83\x30z\xcb\n\x2\xa3\x82\xfd'\x93\x16\xc9" -"\xf\xa6\x9c\x1f\xdc\x17\x1fL\x7f\x30\xf6\x45\xd4\xfb\x88y9\x90\x30R\x1a\xf4\xee\\" -"\"^l\xef\xd3\xf1!\x5P\x19\x37\x85\xe2\x17z\xe5\xcd|\x13\xe%M\xf3\x9bM\xe5:{KK\xea" -">t}\xe4W\x7\x3#3\xb2\x1e\x13\x62\x1c\xd6\xab\x91/\xc7\x1\xe7\"\xd7\xfa\xc2n\x92\xc9" -"\xd7y\xb6\xd6\xbbI\x12\xe3\xc8I\x7f\xdaPH\xd4\xc8V\x1c\xa5\xe8\x34uEy\x86\xa8\xaa" -"%\x86\x9e\x83)\xc5\xaf\xc2\xbexP\xef\x12\xc4US\x10\xfb\xf4$\xecUh\xff\xe9.\xd1\xea" -"#\x96\x5Q\x81V]K\x11\xf9\x8cr\x18\x9a\xbeo I\x18\x0\x46\x91\xdb\x14\x11\x81\x93\xc5" -"\xe2\x91\xe0}5\xc4\\\xea\xfa\x1b<1U\xc4\xc2\xc9\xa9\x1a{\xaa\x9b\x11\n\x97\xa0\x94" -"h'\xe2R\xdch\xd6\xa1\x95\x92\x88\xff\xb6>\xb6r\x1f\xdc\xa0>\x1er\xc0\xd3|\xa7\xdc" -"\x7f=\xea\xbe\x15\xf4\xe8\x4\xcb\xb7\xf5\x65\n\x14;\xdf\xf5\xe8m\xe3o\x9f\x82lO\xc0" -"]Vg\xeaJ\xdf]\x8\xa3\x1c\xd4\xf0\xd2\xfc\x95\xf5\xec\xcd\x87J@\xc0\x84{\x2\xcfO\x9c" -"K\x4|'\xe5\xc7\x2\n#\xe2\xf4PJ\xa1\xb7\xa4" -"QJ\xf7\x96\xbc\xdd\x85\x94!\x12\x45\x82`T\x17\xda\x88\xf9k\xd9\xbd\n\x44\xf6\xa1" -"\x3R\xf3\x1b\xe3\x88\x61\xee\xc0=^\xf4\x34\x9c\x62g\x81q\xbc\xbb%\xc7\x89\xcf\xa6" -"P\xeavqj\xd9\x9f\x9e\xf4\xa3\x61\x46}\xfK\xdd\x30[\x16V\xc8\xe2&\xbc\x61\x99>\x98" -"\xfe\x31\xdc\x93l\x90\x2\xf6\x9c\xaf\x89\xe0\xaa\xd3\xa2\x15hZ\x82'SW\xfc\xe7%\x87" -"{R~\xecV\xa7NJ\xa3R\xa0\x7f\xce\xc7\xb6m\x2Z\xd7 \xc7`\xec]\xcd\x46\xcb\x18\xcz\xec" -"\x17\x1a\x32\x0\xc2\xbfi\x7f\xd3\xbc\xf7\x84G\x5M\xc8\xc3\x8c\xd4\x43\x96K'(\x5T" -"\xa6\xb3\xa8x\xea\x93\xb9\x95\xba\n\xcbt\xa4\xe9\x61\x18\xb2]\xae/g\xab\xe2\xee^" -"X\xb\xc\xb.\xeb\x8a\rs\x9x\xe9r\x5'x#A\x1f\x1c\x4\xbe\xca|+\xa5\x88\x63\x1a\xb1\x2" -"pp\x8b\xa7.\xb0\xc9\xd7\x64r\xe9\xf\\s9\x97\x3\x1dR\x88\xc0l$I\xed\xea\x82\xb0\xcf" -"e<\xf1\xdcZ\xfd\x64\xc1\xb\xbd\xed\x31\xa2\xc3\xa2\xc7\xa0\xb\xf7\xb6\x88\xc7x\x88" -"\xd6\xe6\x17]\x8c \x99\x43\x82\xea\xae\xc1M\xf3x=K;\xc9\x7f\x1c\xc3\xee\x61\x13\xd5" -"\xb\xbb\xc2\xfb\x1b\x82\xda\xfc\x12|FmY\x9\xdb:|,[1\xa1}\xd5\x88\xf1[\x8bR\x11\xdf" -"1O\xb3\x34\xc4\xf5\x41/\xb2\x38\x8\xbb\x1a{\xb3\xf8Wb\xa0\x88\x17\x65\xb0\xd5\xb8" -"\xcc\x8al\xa8\"\x8f)\xe7\xe7;Iks\x16\xe\xe8\xf9\x1b]\xc4\xa5\xc\n\x9=(\xc0\x18P3" -"lV\xa1.\x95\xc0\xb5;9\xc8u\xf8jdo\x14\x92\x41\xaa\x7\xf\xed}j\xd4.\xff?\xec~\x3\x9c" -"6\xa3z\xa3\xe5\xbe\xc4\xc4\x97\xb1\xf5\x1d\x7\x5{\xf4\xe9\xbd\x6r\x9\x85\xf#\xa6" -"\x14\xb0^\xe5\x99=[a#O\x94V\xfevt\x8a\xca\xd8\x1m\xc2\xfeH\xeb[M\xc7\xf2\xf6\x98" -"s\x4vLH\xa7JPb\x1c\xab\xc3\xd8R\x8d\xd0\x8a\xadMKU\xaa\xb3\xa0N\xfa\x8ei\xc3\xf5" -"\x9e\xf9.:\x81\xc8\xbe#\xbe\x14\x36u\x8c\x1a\xc3WBl5X\xeb\xf6z\xc9guQ\xdaSc\x8a\x95" -"\xf1\x65\x32\xe,1\xde=\x9d\xadz\xaf\xc9\x9a\xe3\xd4\x14\xb\xd6\x90\xba\x98}\xa1\x61" -"\xe8\x95\x1cg\xa9\xa7IH\xc3PM\x1b\x7\xd5\xc7iLL\x81t\x14\xd0W\x93\x8\x11p\xd3\x87" -"\xbe\xed\x9f\xcbZ}\x9\xa6\xc5\x6\x8a\xef\xf;t\xe3U`\xd2\x15\x93\xec\xfcQ\xb9\x12" -"=\xa0\xda\x11\x43\xca\x1b\xe6\x4H\x9jf9\x87O5[(%\xa4\xc8\x61\x35\xd3u\xe8\x83\x13" -"G\x88\x61\xf1\xb9\xaa\xf8?9\xe2\xe1\x8a\x9d\xa3\xee\xf7\x94L\x98M\xe5J\xdf\x42$\xd6" -"\x1f\xfb\xb8_\xdc\x6|\xcbl7\xf8\x16\x87\xa5\x8g\x4\x35\x66P\xd4\x87g\x8f\xa2\x38" -"OH\xe9\xe4\x3Y\xccn\xfa\xfW\x9f\x8a\x18\x1d\xbb\x8a\xa0\x1f\xff\xce\xae\x9e\x1a\x97" -"f\xe6\x2\xaa\xfa\xfc\x42\x45\x9c\\\xc5\x97\x9\xcf\xd3\xc7\xc7\xb7#[\x9d\x9f&\xa5" -"\xb!\xc1\x13\xdb@\x1f\xa1\xe9\x94h\xe5\xbf\x42\x9d\xdf\x94o\xefjo&\xaa\xfu\xd7rb" -"\x11\x9e\x30\xebU)\xb9\\\x8c\xa5(\xafx\xde\x86\xa4\xe\xd5\xdb\xae\xf\x1c\x36\x62" -"Z`B+\xe9\xe6\xf7}VrV^\xbc\x80\xe3\x99{\x15\xdd\xd5\x90=\x85\xf3\\\xbfv\xb3\x88\x84" -"\x8\x6\x5\xfa\xa1\xc1}?\xdc\xdc_e{\xc4\xab\x38g\xe9\x17\xc9\x8c\xe6\xc3P\nvY\xd3" -"\"\xc9\x81\xe3\xb2\xe0`+Fb\xd2\x10n\x1f&\rd\xa8\x94\xaa\x1e\xd3\x8eh\x1a\x1d\x1\x64" -"0z\xf8\x1f\xa1\x9c\x1c\x8e\xd2\x62\x7]\xf3\xe9x\xa1\xe2_\xd5\xa8\x95_\x9\xeb\\\x8e" -"\xc7\x9c\xe0#\x9\x66\xec+\x90\x19\x8a\xc6\x96\x1e\xdfJ\xb\x9d|Y&\xd1\xb5UbV\xfd\x15" -"\xeb\xdeP\xa4uj\xa1\x63\xb7\x9\x18\xe6\x97\xad\x9b\x8y:\xde\xe1\xa5\xbf\x9d.\xd8" -"\x6\x9f\xb5\x65\xb\xb6\xa2\x15\xb1\\\x80\xa2vN\xbb\xd6U\x87\xe3h\xfaQ\xf?%\xb\x30" -"\x2\xf9%o\xa6\xc2\x1b\x14\x44\x35\x5\xb2\x3\xc7\xe1\xf0\xe0\xb6H-\xe3\x17\xbdV\xb4" -"F0\xb1\xa6\xc8\x36\xa2\xe3\x98\xec\x36\xdb\x92\xa9\xa3\x18mU *~\xe8\x8f\x98\x1f\x14" -"6\x8c\x44G\xa1ra\x9cO\x9c\x9etz\xd2\x86\xd0\x1f\xd2#\xb5Q\x3\xc1\xe0g,\x97\x8\x4" -"/c\xbat\xbd\xd0\xd5y\x95\x3\xb6\x42\x9bp\xc9\xa4\x92T\x81\xf6\x34\x8}\xbd]\xc8i\xda" -"\x8dW\xfcv\x1U.\xdbQ\xb9\x91\x87\x9\xbb\xec\x37\x65\x83\x92\xa2\x87\xf5\x7J\x8c\x1" -"\xcc\xfbI\xcc}\x83:E\x1\xcc\xef\xb4\xe9\xa9\x82\xed\x89\r\x18\x7\xcb({\x9d\xdb\x8e" -"~/C\xf2\xfd\xfd\xd1\xb4\x17KE\xacK \xca\xfc$\xe2_\x87\x1b`\xbc\x41\x92\xb2\xe6\x43" -"\x1d\xd2K\xfa\x8a?\xad\xa8\x94\x10\xd0\xbbh\xb8\x65\xf3\xe4;\x89{\xa4\xf9\x8f/\xb3" -"\xda,2(\"\xbc\x80\xa5^\xff\xa4\x98\x90\xf1\x92\xc\xb8$\xa1mg\xd1\x9a\x33\xd8\xcd" -"\xa9\x86\xc8\x4\\\xc8\x39\xe2\xe\xf9@w\xd1\x91\xf6-\xd4\xa8\xaf\x82\xc2\xf4\xe9Z" -"d\xe1\xaf\x8d\x88-\xad\x32\x3\xff\xf\x86\x35(\xdbr\xef \xa1\xbd\xf8\xd9\x98\xaa\x85" -"\x1\x1b\x31t\xc0\xef\xa0\xca\x63x\xd4\x88\xde\x30\x96\x1@\xf9\xdf\x85\xb\x36\xbd" -"1\r\x1a\x18L\xf4{p\xd7\x66T\xa3\x9d,]P\xcaV\xbb\xc9\xa1\x66uH*\xb0\x1d\x14%\xff\xfa" -"&L\xfb\x84\x9b{\xb6\xa6\r\xd4\xdd\xfc\x43\x95\xed\xa9\xf7\xdb\xac\x1f\x9b\xd1g\xfc" -"\xb3\xe2\xa5\xc7^X\x14\x82\x86+er\xc5\xab\x18_\x13\x4\xfb\xc9\x1\x9!ea\xc5:vk\xae" -"\xef\x42\x81\x1ak'\xcf\xe7\x34%\xa8s\xc6\xf2\x33\x13\xce\x98\xa1U\xa6z\xf5\x94Q\xb8" -"Z\xf8\xafQO\x1e\xbb\x9c\x8bU\xfb\xbf\x17O\xaa\xc6\xa1\x15\x15@\xe5\x9d\x11\x18Z\xe7" -"0F\x83\x83\x80\xe3\x84\xb2\x34\xa7o\xedt\xda\x8f\xe2\xdf\xb1o\xe8\x80\x5\x61\xea" -"\xa8\xbe\xf5 \x1a#\xc3\xc1\x62\xf1\x15 ~\x1fp\x8c%/\xc\x80\xeb\xc0\x10/\xa1\x85\x9d" -"\x1d\x14\xd6\x37ol\xa3\x93\xe1\xb7^Y\xe9g\x86\xe4\x43\xcc\xfa|\xff\xa5\xd5\xa5\x32" -"\xea\x30\x1d\x1a;\x11\xdc\xa3\xe9RH\x89\xbbG1\xfas\xe3\xc7\x10m\xe3\n\xb\x10;\"\xa0" -"?\xf9\x10\x31\xf8\xb3\x5\x84\x9a\x12,\x18\x14\x96\xf8k9\xef\xc0\xa3\xc3\xf0\x36\x1" -"\xfb;\xea\x64\x1e\x4\x9akj[\x94\xc3\xd2\xfc\x43%\xbe\x8b`\xd5pv\xe6\xc6\xb3\xc9\x19" -"\xd0\xe9\xac\x9a\x35.b\xc5\xa1\x8b\xc1t\xf4@\x9\x17V~Z\xb8]\xa3ZJ\x0\xb9\x9d\xb2" -"\xd0\xa0\x43\x95\xb5\x32\xa5\x89\x83\xb7\xe1\xd9\xcan\xc1\xb3X\xe0\xd5/\xfb\x82\xe0" -"\xa2\xb6\x1b\x38\x18\x65\xc9\x13\xaaT\xac\x9\xbc{\x90\xdc\x93\x6\x81\x83\x45\x9b" -"\x1e\x9c\xa7K\xe6'\x18\xeb\x1a\x33\xc0\x38[\r\xb5\x11\xdf\x9c\xde\x3\x0>\xe8\xa0" -"\xaf\n]\xe0\x5\xd9\xc8\xd1\n\x96\xc0T\xa1\xd4uh\xcc:\x18i\xbeH0^Z^\xb2}g\xa4\xe9" -"\x93\x1f(\x98\x1f\xc4\x82\xc0Q\x9e\x33\x1b\xab\xc2\xb0\x16\xd4N\xb1\xd5h\x91\x82" -"5\xed\x2\x34\x98\x84\xde.\xda\x44\xf\xe7\xb9\x8b\xc0-\xea\xd0\xea\xf7o_\xa8]*l8K" -"it\xc8\xb1\xec\xde\xde)\xe\x81\x39u2\xda\x1cQO\xe3\n\x34I\xca\x33\xfa\xa2\r$\xa4" -"}=\xdd\xc4N\x3\x7\xe\xb9\x44\xb4\x41I^\xf2\xae\x38;\xd2\xb9\xb6V\xbb\x0\x15\xd7\xd8" -"\xe\x81>3\x88o\xba\xdb\x1c\xe0\x8f\xcb\xec\xef\x19\x34V\xec\x9e.\x9c\xe0\xfb{\x8e" -"\xb7\x15\x34\xd6\xecV[\x9P\xcb\xb\x9d\x92\x1bJi\x80\xf6\x39\rO\xaa\x16\xcf\x46j\x2" -"\xae*U\x14\x65\x41\xa2\xcZ\x99\x96\xc5\xff\x61\x45\x8\x87\xb5\xdar\xaa\xce\x42\x83" -"@\xd9\x88k\xec\xbd}\x8b\x7!&\x98\x83 \x1f\xfa(\xd1\xa1\xba\x32\xafw\x98\xae\xbc\x6" -"L\xcf\n\"\xfc\x9f-E\xb\x9f\r&\xfe\x2\x30\x99\xa9W\x91\xc7\x31y\xba\xaf\x84n\x9f\x10" -"\x2\xa9\x30\xc5\x8\x62\xd5\xe4\x9f'\xd4i\xf6}\x94\x85\x80\x87~\x85\x83\xc4\xcd\xf" -"\xd4\x8e\xd9\x85\x1\xe3\xf6\xd0\x94\xaa\x0\x14P\x91\xcf\x33s\xb7\xadlPP\xb9\x7\x62" -"\xa9\x8d!\x84=\x1d\xf3\x12\x93\xe5\xb8\xa5\xf2S\x91!;\xd3\xf8\xefx\xf1\xed\x91\xa5" -",P\x8\x9c\x34@\xe7\x85_1\\<\xe3\xc5\xd0-\xa2\x1a\x17\x10U\\\xbe\xad\xa8\xd4\x6\xe0" -"\xf6\x44\xbf\xc2\x64\x9ck\x5\x9a\xe0\x9e\xa3\xce?\xdfU>\xb6)\x8eih\xf0l\x1f>x\xa3" -"\xda\xdb\xf8\xe}\xfe\xb2\xbd{\x87\x62\x0\x83\x95\xb6$\xe0\xcc\xbc\xf\xabn\xc0'\x9b" -"\x95\x1c\x7\x91\xb6\x5n\xa7\xe0m\xd3\xa7\xea\xc1<\x93\x90\xab\xd9\x8e\xa4',\x99\xde" -"\x1a\x65\x34[d\x0T\x9e\xd0\xc8\xad\xf4\xeb\xbb\x46\xf0Rb\xe2\xf5\xc4\xfa\xe6*'\x9d" -"[\xe6\x39x]\x7f&\xa8\x15\x8aw`v\x12\xcf\\\xf9\xb6\xcb\x35\x39\xcd%]\x9b\x94'\xaf" -"\x6\x65\xad\x63\xc1\xe8\xdf\x8c\xc9<\xff\x8d\xb2:\xc5=\x16\xf6\x1fm\xc2qH\x8b\x0" -"\x88\xe5'M\x1f?>\xc8\xf8\xf2\x8c\x85#\x83\x45T+\xa4\xd5\x38\xff*K\x8\xaf)d\xc_\xa7" -"\xcc\x8c\xd8\x9aG\xa0\x83\xdb\x93\x9n\xa8\xd4\xb9\x92:\xc\x6\x9a \xe0\x0 \xdc)oX" -"7\x10'\x9e\xb6\xf4\x4\x16-\xa3\x38\x31?\xb4\xdbPU\xf0\xb5\xf6\xddK\xe\xcdnj\xe4\xbe" -"e\xf4\xcb\x8e\xc6\xb1\xf7\n\xdeIp$V\xa0\x1\x31/\xecV\xb\xd2\xbb\x6\x87\xd6\x1a\xdd" -"\xe\xf2\xe2x\xa1\x34Rsow\x81N'{\x15:\xf6\xfdO\xd9\x9e\x9a\xdc\x65&\x9a\x9e\xf9\xcd" -"\xde\xa9\x89S\x89$D\xe1\xf4\x9d:j3u\xed\x9a\xcb\xd9\xa9\xf1\x10p5\x9e\x8e\x8d\x97" -"R\x7f\xc8t\x5\x9b^\xa3\xb0\xa8/\xd7\xd9&]\xe7\x15>\xff\x41\xb2\x8e\x39wg\xe9\xd0" -"\x93\"\x61\xf8\x39\xdd\xa7\xb3Y\xb0=M\xdf(!\xa8\x39\x8f\xe7\"\x16@\xe0\x35\xe4\x9e" -"7\x1bU\x94\xb6\x1a\xda\xcf\xa5\xde\xe8\x38\x9d\xbd\xa0N\xe3I\x7*\xe5\x6\xc5\x19\xef" -"C\xcd\x8c\x1b\xc9\xf\xc8ww\xd9\xbfo\xef&P\x88\xe\xe\xcc\x17\xc4\xd4\x8d\x1c~1\xdb" -"_E\x5\x81\xee\xeez\xf6_f\\\xe4r\xda\x87\xbc\x90\xd3\"\xc0\xfd\x87\x8f\x81.\xbd\x66" -"\xc9\xea\xa0\x33\xd5\xd9\x62/\x8fuI6\x10/\xd5\x14\x89\xab\xa3{rSe\xbc\xc3\xdc\xf1" -"\x2\x30\x0\x6\x1b\xab\x41\x87\x37\x90\x1c\xc0\x15\x0\xe0\xdc\xb2\xb3\xbc\x19n\x89" -"\xd1\x64\x62-\xab\xa2m1\xef\xc6\xb6)Q\xb1\xd2n\x15\xfd\x1b\x14H\xd7\xdcgP1\xb9\xc" -"\xa1\x35\xe4%p\xb0\xa9H\xe3N\x1e\xd7\xe0\xe3\x6\x63mG`\xfbU5 u\x2\xfe\x96\xca\xc6" -"\xb9\xb0\xa5-\xb7\xf0LA@\xea\xa8&\xb0\xf6\x84\x96\x88\xc4\xa3S\xadv\xd7\x80\xd0\xba" -"\x8a\xaa\xaa\xd6\xd4z?\xd7vG\xc9\x15\x9a\xf9\x1e\x9bt\xcb\xfd\x38\xee\x17\x88\xcf" -"7\xddl\x9c\xb7!\xa9v0d\x93Z\xce*\x94\x1b\x65\xd5\xb1\x1c\xa2\xec\x6\xcdp\xe@\xdd" -"\xa9}Ss\xc5\xd4\xd3\xa9k\xda\x17\x3\xc2\x8\xcf\xa2\x35\x90\x9e\xc7\x9d\xfc\xff\xea" -"(Nt;\x7f\x4\x88\xe7\xcbh\xfc\xc3\xe6\xc4\xf7\xa4\x9f\x94]\x85\x98\x89\x44'H`z\xcf" -"\x89\xe8\xd2\xb2\x1ev\xde\xff\x12\xdf\x17|\xb5\xb7\x12\xf0\x38_2\x8f\x65\xd2\x38\xab\x8a\xe\xdc\xf6\xd6\xb8" -"\xed\xa3\xb2\"\xdaT\"\xc0&\xdbq\x2\x37_x2>\x84\xfa\x86o\x1e.Q\xc5\x13r\x1d\x66l\x17" -"\xa4\x89\xa2\xe0\n\xc5\xad\xd0\xael\xe4\xd4O\xde\xfd\x65\xdf\x43\\IE~\xc1\x41\x91" -"5\x1c\x5\x44?4\x9e\x41\xb6\xb6\xeb\x46u\xc0o\x82\xbbU\x84R+\xf8\xf3\x16\x85H\x19" -"\"\xacz\x1b\xd5\x1b\x86$:\x97\xdc\\'\xf\x7\xc7+\x9cZ\x80zj\xa7\xc3o?\x13\xf4LFI\x1f" -"!l\xb1\xf;]\x1b\xc0\xe8M,\xc9[\xdd\xa6\x46\x19\xd8\xe9\xe0\xf2\xb9\xd1\xb3\xa5\xe8" -"\xa9\xaa\x18\xd4\xeb\x41\x87#\x9e\x10\x10VkV\x1e\xf6\x13\xfaX*Kf\x14\x9c\x1b\x1e" -"\xed\xed}\xba\xd6\xc2\xdc\xec\x39\x31_sZ\xd2\xc3\r\xfbv\xa9\xe4+s\x91-\x1\x8d?\x19" -"\xf2\xc7~\xb7\xf9<\xe2\x43\x33\x9\xd7\xd8\x2\x94\x9d\x9e\xd4\xfa\x7f\xf6\xcd\xe7" -"5w\xc9\x1b\xb2\xb0\x65\xea\x38\x9c\xe!\x4W\x98\x7f\x98\x14g\x9b=\xa6\xc4\xda\x85" -"\x10\xcd\xd4\x46.$\x9a\xa3pH2\xc\xddH\xba\xcbo\xc8)o\x12\xaa\x31`)z\xd9\xe3l\x1\xac" -"x\x7\xb6\x99\xe\xe7\xd6\x46\xd8\xad\x8d\x65Wc\xa2\xd6\x85\xaeV\xaf\x11\x0\x99\xec" -"wJ\xc8m\xf2\xbc\x8c#\xd4\x4\xda>\x4'z\x14\xd2\x91\xc6\x4\x0\x16=VBr\xb1\x5\xc6\x17" -"%\xbf\xec\x1b\x1e\xe7\xf5\xdc\xfdz\x10\xb1N\x1\x84\x97\x8e\x12>?&Y\xb\x32\x88w\x12" -"C\xfc\x11\xa4%+\n\xf0-\xb6x\xeb\x84\x62\x16H\xe2[\xfc\x32\xe9\x42\x6\xc9\x8bzJ\xdf" -":\xf6\x35\xd5\xb5\x90\xc6\x6\xb4r\x99n\x7f\xfd&\xb7\xf0UK\x97QBG33\xa0\x61\xeb\xf7" -"\x98g4\x1b\xd0j[\x5v\x1cYP\x87\xf2\x3I\xee\xeahE\xc8w\x85\xe7\x91\x17\xc3\xa9]G\x1e" -"\xae\x9dSG\x97\xe\xccG3\x1c\xf6\xa9\x4<(\x83\xf4\x98x{\x90\xe6\x94\x9c\x8e\xf3\x11" -"\xe3\xc9}X\xe6\xdd]\xeb\x0\xc8\x8cG\xe3\x91(:\x9aP\xbd\x0o\xe5\xa1\n:\xd0\x41 Cs" -"\x93\xe8\n\\\xcaY[\xce\x1bz\xe0^\x6\x85\xdc\x0?\xac\x9a\x8e]\x86\xe,#%\xa5h\xf4\"" -"*\xf2\xfb\x7fQF?\xc3\x5\x1a\xa6\x43\xb3\xc3\x6\xeb\xd9\x86N\x8\xd3M\xe7\xa9\xb4\x9b" -"\xb6\x9d\xcfi\xdb\n\xd5\x4\x7\x86\x38\x3;\x14<\xf2\xb7\x30\xd5\x98y\xcJ\xf2gf\x94" -"\xec\xf\xfa\xef=\x9dn\x4\x45\x94\xe\xacZ\x90" -"+0K]\xe5\xc0\xb9\xde#\xeb)\x8f\x37t\xb1wS\x94\xa2l\x89\x63\xbd~\x7 K\x81u\xb7\xf2" -"\xc5\x7\x32'\xa1m\xcat\xe4\xbb$\xca\x63\xc8o\xa6^mQ!\xa7)\rX\xa1\x1e\xc{\x98\xca" -"~\xb6_\xd6\x36\xb2\xe\xf5\x61V\xbe\x14\x3\x8a\x42\xd5\x1c\x87=R\xa6V\xb1\xa5}\x8b" -"\xdb\xde\x43\x5=\xd0\x96\xdf\xf8\xec\"+\xde\x65wl,F\xa0\xd6M\x92}\x8f\xfa\xb4\xea" -"\x1e\x9e\xf1w\xa7\x11\xa8\x1f\x7f\xc6\x66\xd3\nh\x19\x96\xf1\x94\xe4\xd5\xc5\x33" -"\xc4\x3\xa9\x32q\x6\x8b\x1\x99o\xe%\xe\x1\xc2\xee\x63\xfd\x1d\n\x91\x63\xbf\x8bg" -"\xf\x97\nm\xd4\x16\xb2\xae\xbb\xc9m\xeb\x2\xd2~\n\x83\xde<\x87x\x1e\xda\xc6\xaa\xa5" -"\xa0\xd1\xfdxw\"(\x97\x94\xd3\x5k\xc7O\\\x89\x9f\x64\x98\x8a%\xdcg\xc3\xf1M\xa8\x87" -"\x1di\xfc]\x8c\xf6\xb0\xe7\xbcp\xe3\x98iBv\xc6\x9bw\xa4\x80\x19\x98\x9b\x93uS@\xe0" -"\x0\xcc\xc4\xfa\x98\xcf\xca\xaa\xf1Y0U\x13\xa5o\x89\x87u\x8c\x97\x9b_\xbc\x87\x94" -"\xca\xde\x87m\x81\xe4\xec\xf0I_2\x9a>\xc2\x92~\x95\x9a\xec-&\xc1\xad\x32\xa3\xd1" -"\x11\xd0\x1d\xc\x93&$\xb9\x4\xda\x42\x12=DB\x1c\x84\xbcq0z\xd1=\x0\x41\x30\x8f\xab" -"\x8d\xe\xe6\xf9\xdetd\x0\xaa\x4\x1a|j\x99\xa7#\x0\xa9\xb9\x11\xfds\xf0\xcf.\rA\x92" -"\x12\x32\xf2\x43\xec\xa8g'wh\x90\xbd\xf9\xd1\x38u+\xb9'\xb6H\\\x1b\x45\xb9\x41m\x10" -"x\xa7\x3K\xa2\xb9\xfb\x1c\x7f\x9c\xb5W4\xf8}N\x1f\x8\x1d|Jf\xb5$\xb2\x42z\xba\xba" -"^\x91\xc1\x31\x89#i\x9a\xe3\x82\x6W\xe8\x9a\xc8\xc7S\"\xf0@\x17\x43\x9c~\xc5>\x18" -"\x91(\x88.v\x1b\x3\x63\x93\x8b\x7f\xaa\xe\x64@\xe1\xb6\x97\xdb&\xdeO\xc2\xb2\xf3" -"\xe1u-\x0\x7X\x97\x82\x92\xda\x3\xc7\xfd\xdd\xf1+_\x11`g\x98\xa4\x1kubp\xc1\xea\x9" -"_\xca\x4\xef\x36\xb1\xa7*\xa2}\xa0M-\xc9\xf3\x8\x43\x13x4\xa4\xb3\x39~\xb8\x7f\x10" -"v1\xbb\xab\x8erO\x0\x14 \x91\xb5X5z\x7S\xbd\xd8\x85\x98\x87{JP`x)!\x86\xa8R\xf3n" -"8\xe6\x6\xb1.\xad\x12\x0/\x2s\x10\x8cYM\x86\xd0\x42y($'\xed\xd4\x9f\xc3\x32]|\xde" -"v\xe9\xe5\xe\x17\xc3\xea\xd4\x8d\xa0\xb5\xb3@\x9d\xf1\xe7\xb7\x11\xdej\xc9\xcd\x1a" -"H\xb9\x7\xe0\xe6\xfa\xb8\xdf\x98x/\xdfH\xdc\x44\x43\x31HBC\x4i\x92\x42\xce\xcf\x9b" -"\xb4\xd6\x99\x11J\x95\rS\xc7\xd8\x16`\x18\xb0\x8a\xb5$m\x83j\x6\x33\x4Zl\xf\xdfs" -"@\xabs\x9e\x4\xab\x89(\xff|\xe6Huh+\xc5\x14&\x18\xc2!\xce{l8c\x7f\x5[w&[u\xd4\x16\xe1U\x91\x33\xc4" -"\xb9\x11\x9b\xf6\x9c@W2\xb6\x1b\xc6i\xbako\xbb\xea\xc9)\x8c\xee\x1f\xce\xf2kA\x89" -"I\x90\x86\xd2\xdb\x96\xc8\xaf\xb5\x34\xeb\xcf\xf7IAw%*\xec\xe0\xb1\xb9h\x9b\x7f(" -"I9#\xa6\x1m\xcf\xa0\xee\x1P%\xf8\xbf\xc4\xea*)):|[\x83\x42\xf4\x44\xdb!Z\x9evRp\x9a" -"g\xb1\x9f\xa0\xbd\xa6\xa2\x89\xa3\x94\x39}T:DL\xe4w\xe5\x43\x41\x43_Nc\xf9\xd1X\xd8" -"\x12\xb4\x34\xf9\xf5\xec\x1e\x9f\x8e\x1dSB\xa2\x8c\x9b\xe4\x94\xb4\x95\x1\xc6\xf9" -"\xef\x34\x9c\xf2\xc0\xd2JbD\xa3\x65+\x90y\xa1(\x9b\xa7\x3\x1dM\x97\xde\"]\xf6\xec" -"B\xa8\xdc\xf1>\xd3\xa3uq\xd6\x0\x99\xd5\xdfgv\x9b\xee'\xa1\xb2\x18\x19\x8a\x36\x65" -"\x93.\xfe\xb7\xfe!{C\x14\xd3\xa4\xd7\x99\x1b\xefj\xa5\xff\x8b\x80\x19\xa5\xf3\n`" -"\x9f'\x99\x80\x45\xa2\x7\x8\xb9\x66\n\xe8'\xd5\xac\xca\x4\xe9L\x0I\xe0\xecW\xaa\xe4" -"\xc0\xe6\\\xcc\xbb\xa8R\x88g\xa1\x86\x36\x89qe}W\x96\xc1\xcb\x1c\n=,S\xd8\xe2\x15" -"\xe0\r\xad\x14S(#\x89\x97\xa7\x1b\xaa\xaes\xc2\x1a\xfc\x81\xc5\xb7\x19\xeb\x10\xdd" -"\x8b\x9e\xe8\xf3\xec\xb7y\xa3\x94\x5t\x1b\xfc\x7\x8b\xcc\x99ZO\xc2n\xb9\xd9i\x8f" -"\x6\xa0\xf8?\xc\x0T,\x85\xb7\xb4\x82{r \xb0q\xc8\x81\x94\xd0\x33\x1a\x35\x31\x9b" -"c\x8a\x66\xed\xd7\xbe\x30\xe8j\xa1\xbf\xf1\xd2\x9b\xe\xbc\xaf\xb9h\xc6\x8fj\xc5\x17" -"f\xb7\x4\x80\xf1[K\xe0\x30\x1a\xc6\x9f\xc8\x45\x9c\x39\xbf\xdd@\x15\\\x14\x1f\xaf" -"\x8f\xb1\x12;m\xc2:t\xf7\xcb\x86\x35$\xb9q\xea\xea\x15t\xc6|\xf\xd7\xbf\xbc\xbe\xd4" -"\xb9\x94s\xe0}\x8d\x41H\x11)\xfdU\xb5w\x91\x88kbo\xb\x1c]\xcd>\x5\x0\x86\x1a' \x95" -"\xb1\xea\xc0\x96\xbe\xc7\xf2\xddS\xb1\xe4\x89\x1d\xde\xf5\x41\n\x63\xce[\xf7H]\xfe" -"\x80\xfb\x96\x15\x94\xa8\x33\xc8\x1c\xa8\xa5\x81\xe6Ww\x18\xeVp0|\x9by\xca\x97\xff" -"8\xbc\xbf\x6)\x95\xbd\xad\xbe]\xdbM\n\x90\xa5\xde\x1f\x35G\xd8\xcf\xa9\xec\x14$\x85" -"\xab\xa9MY}\x13\x87\xb9\x37\x39_\x13n>\x93Ksd\x9d\xc4\xbdX|xPH7;I6\xe7\x37rJ\xaf" -"l@\x7f\xc5{\x8a\x1b\xe3\xf7#\xfaOJhQ\x1d\xf9\xf7\xb7\x1ckpe\xc1<\x15\xfd\x11\xff" -"tivG\xdb)\xdc\xdd\xb0vX'IY\xe8\xb5\x11\xa9\xb3^DeA\xd3\x9c\xff\xe1!2\x9a\xb2\xd9" -"L'\x9\xe0\x8c\x13\x89\xffz\xfa\xd2ucP\xbf,\xcb\x35\xf3\x42(\xc4\xee\xc4\xee\xe5\x65" -"iA\xe2\xe8g\xad\x1d(Tu\x93\x9ciP\x92\x9b\x33\xcb\xfb\x30\xc5\xc\xd4\xb3+\xdfk\xb2" -"V\x90\xf3.\xca\xbe\x1aq\x93-\xddo\x19\xa3\xb6)\x17=\x1a:$0\x83\x96$L\x85\x7\xe4r" -"\xf6\x39U\xcb\xa6\x93\xfan\x18\xb1\xc6\x1e\x80\xd5\xfey\xa0&h1E\x8a\x37\xe4\x39\r" -"D'd\x94\xdc\x3\xce\xf7\xde\x44\x93?\x1d\xb9K\xb1\x95\x8d\x8cw\xcb\x65\xb7V\xafK\x87" -"\xb1\xad\x13\xc6\x43\x9eO\x98\x3\xbd\xb2\x64\xd6_\xce\x94\x16\x89\xb}\x5N\xb3\xd4" -"L\"MR\xdb\x95\xd8\x3\xd1\xcf+U|\x0\xf2)\x81\xfa\xff~\x9d" -"zC\xb7\x8b!\x82\xae\xd2[X%\xb0\x37\x94\x94\x89\x46\xd3\xb\x30\xca\xc8'C\x80\xad\x33" -"\x6]\x14\xedJ\x3\n\xe0\x5\x33\xc0\xe0r\x85\x90\xef\xee\x41\\\xac\xce\x63\xe8\x14" -"\xa0\xfdT\xbf\x98\xb2\\\xdd\xd4\x12\x12\x61\x7f\r\x39\x88L\x86%\xcb\x19\x5\xae\x42" -"\xdap\x1b\x3o`h\x7\x11\xee\x85\xe5\xf4}\xc0V\x4X\x90\x15k\x14iiB. \xf8\xa2\xa6l\xc4" -"\xa6\xf6\xfa\xbd\x6:\x16\x8f;\xef\x11\xd6\xa3i\xf1\x41\x8b\x84\x14=q\xd3\xcm\x96" -"_\x18\xabO\xc0\x89\x87H/\x83\x13\x8c\xddo\xb4\"jI\x8\xfc\x9\x1f\"\x9c\x62\x65\x17" -"\x1f\xc\xb5#(`\x80w\x93 \xb3\rK\xd6x`>\xcc\x91\x61\xad\x8c\xb5\xa5\x1\x83\x32\x87" -"\xba\x6|\x97\x3`\x80\xc9\xc9;\xcc\x12\xd6\x90\x13p#\x2\xc7\x5\xda\xc2V\xd7\x64\xfe" -"o\x1d\x1dW\xb0\xc5\x8e\x80n\xb4_\xa4-\xac\x9fg\xa7\x9d\xf2\xb4\xe9\xe3\xef.w\x9d" -"\x0\xa7\x7fy#\xd8\x66\np%:?X\xed\xbe\x1dK\xd6\xb9\xe8`n\x9e\xe9\xc\xcar]\xb8R!b\x87" -"I\xc0-\xdd\xc1\xb2\x9b\x64\xee\r~,FI\xd9r\xf5\x4\x7f\x9b\x37nI\x8bz\xc2\x8a\xc6\xd9" -"\r\x1e\x34H<$\xf1tca\xb6\x12v\xf1\ro\xc3\x83[G\xe2\xfe\xf1\x43\xbf\x95\x0\xb9\xb8" -"2F9\xa7\xaex\xb2\xdf\x88$W\xc4\xd3\x99\xe5\xfe`Z\x96\xc9\xf6\xdb]\xe2\xcb\"\xc7\x11" -"\x9a\xec\x39\xbe=\xc6\xc2\x8\xed\x1f\xe6\xfa\xe4\xe1\x1d\xd8\x90Up\xec\xa9|C\x8a" -"\xcd^\xb7\x41\xfd\x8b\x35Ud\xe3iqIe\xa6.\x86\xf9\x1d\xf8\x10nDE\xd4\xd9Y\xa7\xb9" -"\xc-\xcc\xdf=\xf6\x1c\x9f\x4\xc\xff\xc7\xbd\xe8\xc4\xdfPPT$+\xb0\x1e\x98\xb0W\xc6" -"K\xf6`3Jz\x1\xdf\xb2\xf1\x43`l\x7/\xd1\xb4j\x5L\x9e\x62Vv|M\x8a\x93\xf0\x61\xad\xca" -"\xfd\x45\xcH{\xd8\xe6\rk\x2U\xf5\x88\xc8\x4\xdf\xef\x12\x8bM\x8d\xcck\xdc\xfcT\xda" -"U\xe1\xe3\xdb\r\xcd\xd8<\x1a\x94s\xdd\xf6%\xb0N\xf8\xca\xbf\xe7\xffy\xd7\xad\xec" -"\x16\xcf\xb8\x36Z\xb8t\xf0\xda\x37\xb9\xc7\x93)\x1b\xcd{+\x9f\x35\x41\xb1\x85\x10" -"\xcbz\xde! v\"j\xb0\x0\xbd\xeb\xc4\xee\"\xbc\xdd\x9c\xfel\x14\xaf\x1a\xe4\xb5;\xa2" -"~\xba<\x85\x61j\x80\x86^z\xfd_\xcb\x87\xf5\xa6!g\x8aU\x83\xd6\x9at\xc5\x1a\x61\xe6" -"LJ\xa8y$V\xcc\x9d(\xa4\xae\xec\xa9\xfeGd\xf9\x82\xe5&rJpw8$\xf9\xdc\xbb\x91=\x87" -"\xab\\\x45\x1f\xd8X\x15O<\xecMh?\xb1\xa1\xf3\xd7\"t\xf4=\xb4\xb0\xa9\xfb\x32\xe1" -"\xe3\xed\xc5\xb2\xabM\x19\x1\xf\xec\x11\xe3I\xcc\x96\x1e\xf0\x16\xab\xbd\x36\x81" -"\xd6\xb8\xf3t\x9d/n\x19\xab\xba.-\x8b\xc2\xa6N\x92nZT\xd1\xbd\x86\xb5\x9aT\x9\xd5" -"\x89G\xbb\x1u\x97w\xe8\x92\x45\x7\xae\xee\x61\xbb\xe3n\xba\xbc{\xce\xd4&\x93R\xbd" -"\xe9\xda\x7\xc9\xb0U\x14R\xf2\x2z\xf0\x1c\x13!\x8e\x9a\xfe\xc7\xc6\x84\xf8\xa8k\x11" -"\xd4\xe3\x3\xe1\xe9\x84u\x8dt\x87\xbf\xd5\x96S\xee\x86\x99\xa9|W\n\xe0\x91O\xc2\xa9" -"E~%\x1a\x9a\xfb\xa9MAW'\x9c&&\x2[\xc7\x9b\x18\x93T=\x1a\x35\xc8\x66\xff[\xc3\xc0" -"!$\x1e\r\x16\x84\xcb\x16\xb3\x88Z\xf9\xd2\xf0\xa2\n\xb7[\xc5j\xedR-N2(j\xae\xfc\xc8" -"\x2@-l\xc6\xb!)\xba>\x6\xa7\\r&\xbd\xd4k\xed\xb2\xb5Yb\xb5\x86\x37\x8f\x16\x8b\xa9" -"\xfaJ\x9\xe6\xa9\x10\xa3_W\xfep\x80\xe5\x32\x90Sz\x83\x7\x8P@P\xd7y\xd6\xd6\xa7\x46" -"\xe8\xf2\xf0\xae\xda\xcc;.\xb0\x34\x17W\x90Y\xce\xed\xe7;;\xc\x61\x1fW\xcaM\x10." -"\xad\xea\xe2\xb4\xf9\x61\x12p\x96\x9a\x45\x43\xb3G1i\xce\x8b\"\xd2\xfe\x62\xb2\x41" -"\xf6\x61\xe0vq\xd8\xc2\xd9]TD\xb9\x5\x61[\xa5\xb4\xc2\xccyH\x89*,j\rw'\x1c\xb6\xf2" -"\x84\x7\xea\xba\xd0 .%\xd8@\xf\x0n\xe3\xf2\x41\xf5\xbe\x1fH\xec\x0GuF\x97\x17\x65" -";z#o\x87k.\xdd\x88\xd4\x33\xd4\xb8\xed/G\xf7=\x96J\x9b\xab\x3\x8c>A@\x0\xc7P\xec" -"\xbe?\xbd\x39\x2\xf8\xd2O\xd6\xcaR\xd4G\"pS\xe3T\x9c\xcd\xc4\x9f\xea\x46\xec~5x\xec" -"rG\xf7}\xfa&Z\x0z\x1b\x88\x9d\x36\xe5\x5\xf7\xbf\x8f\xab;h\xe7m\x9b\xc0\xeT\xda\xbd" -")\xb1\xb3\xd9\x7t\x8c\xa1\x34\xf0g#\no\x8a\x7\x9c\x8d\xaa\x81\xb2\xbd!\xa7\xab\x19" -"\x99ZD\x7fn\xee\x35\xe6\xd8\xc5\x3\xcc\xcfg\x9bl\x8f\xcf\xac\x7\xc3\xa8\xee\xc2\xca" -"\x9dQ/Z\xf7\xac}\xa2\x8c\x39\x1f\xa1q\x15:9\xcanG\xc\xa7,\x81;\x84.\xfc\xda\xb6\x32" -"\xf3\xa3]'\x8eHxj\xdf\x30\xc6q\xa5\x0\xdf\x99;L'\xd7\x8f\xe6g|'\xa5\x89\xba{R\xd0" -"\x1c\xf\x89\xae<\xa6\x94\x41\xd0\xcf\x32Q=b\xe6S\x90\x8c\x0\xfe%\xa2J\xcM\xce\xb1" -"\xff\x98\xb0\xa4\xb7\xa2\xf5\x9,\xad\x2\x8f\xc2\x16\xb7\x1e;\xd4\x99\x14\xc6U\x81" -"\x1b\x46\x88i\x85\x38\x38\xc9\xcb\xc\xaeZ\x95i\xcc\x97\x89\xdb}R\x91\xf2\x9?o\x2" -"\xc2\xaa\xfe\xba\xfe\x8fk`'\xae\x4?~\x9a\x6\xe5\xe0\xc7J\xe9\xc1y/\x88wg\xf\xf1\xdd" -"\xbd\xc4\xd3\x32\xb8ob\x81X\xf6\xf0\xd9v\xd5j\x12s{!\x9eV\x15y\x1i\xd2\n\xa7\xca" -"\xa6v\xa8\xf1{i%\xb1\x36\xbd\x18\xed#L+\x96\xe9\x93\x34\xc0\xdc\x4\x2kW\x9cZ\xa4" -"\x7\x88\x13\n\xa8\x4\x34\xe\x62\xdf\x9c\x85\xec\x99n5\xc4\xa9\xf9\xf4\x9b\x81\xd5" -"\xc8|\"F\x11\xa2\xd9\xd5\x18.\xf8]\x1\xeb*\x7f\x9a/\x9f\x96\xd4]S\x8a\xfc\xef\xae" -"\xacr\xe2\x36\x1b\xba\\J\xc1\x61\xae\x12\xf1\x65-\x1f\xd8\x42V\xaf\x1a%\x96\xe4\xcb" -"\"}[\xe5t\x81P\xf1\x37\x1d\xaa\xe\x4\xa7\x85_\xf1\x91\xe6\xc2\xe4R\x1fVP\x80oTEF" -"V\x14\xaf\x80\x1eO\xac\xe7\xa7\xa1I\x89U\x1bj\x0IY5\xed\x1f\xf4\x17*\xbf^x\xf5\xa0" -"\xc3\x1e\xa6\xb7\x7f\xb9\x30\xd5\x8d\x80\x8fG0Zj\xc\x98|\xd6\xb2\xd9;\x1~\xcb\xfa" -"W\x7\x1Q\xf1\x8UL\xfb\xbc\x6\x9b\x9dQ\xcd\x37/m\xbb\xb~\xf7\x8e\x65\x4\x46\xb0\xe7" -"\x16\xf0\x9a\xbb\x1f\xf0\xcc\x1f\x81\x46\x64)t\xaf\xc5\xed\x85\xe5\xe8{\xc9\xb0\"" -"\xc1\xa1Mr\xfbY;\x9e\xb7\xe4\xf0\x99\x85\xe\xb8\xab\xbf\xec\x11\x8ai\xad>\x17\x8e" -"\x8b(\xbc+\n\xf9\xba:\x8b\xa6\xc4\x15\xfbU\xd1\xfc\xa1\x17\xb8\x37\xe4\xc2\x65\x9e" -"\x86\x39x\x9c\xc3XY\xe1N2\xf\xdb\xc3\x99\xdb\x88\xfb\xa0\x95\xad)\xb0\xfb\xa7\x8f" -"\xec=\xa2S\xe5Hrm\x96\xac(\r\x98\xb7\xf4]\xfa\xa3\x1b\xc5=/\xdc\xbb\xad\x10\x63\xad" -"F,D\xea\xb2\xaa|\xc8\x32\xec\x1f\\\xadp\xe2@\x9d\xfb:H}\xdd\xfd;6PL\x1c\x85\xad\x4" -"\xd1\xb4\x10>\xbb\x92\xa3\xf8\x1\xc8\xaf\xb7hWU\xb2\x66t.r\xaa\xfa?\x87|G\xc5r\xbc" -"\x96\x9a\x18\xa7\xfb\x80K\x16\x43\n^\xad\x8b/\x7f\xdf\x9f&\xac\x92(\x84\x90l\xc1" -"\xeb\x17\x15\x86\xdc\xb7\x92\xb2t\xb2\x13L\x4\xf7Y\x9d\x87\x17\xb0\xee\x5z9\x89\xa7" -"!\xeb\xca\x30\xaa\x85\xd3\x1a\xb9\x43yp#\x6\\_dF\xa8\x91\x1d}\xa2v\xe6\xec\xb4V\x9a" -"\x9e\xbe]o\x18\xb1)g\x16\xda{G\xdb\x14\xc3.9\x83=6\x1e\xcc\xc8\x11R\x13\x94\xcc\x38" -"\xb4}&\x9bk\xb0O\xb\xd8\xbf\xfb\x63\xcd\xb%\\\x96\xc9\x8a\n\xc\x46\x5\x65\xc9\xa0" -"\x88\x90\x0Q\xfb\xc6\x62\x34\x1\x32\x45\xc1/\xa4~\\eY\xc5\xc1\x90*:<\x19\x35\xce" -"\x9ax\xe4\xf\xcd\x17\x86=\xc6\x93\xeero\xb7\x88L{}\xe5\xa6v\x1ciBK\xf9\"\x43w\x9f" -"\xf6\xa9\xe5\x66\xaeSr\xadZJM\xe\x8c\xed\xa9\xe\xa1-\"W\x9b\x1_ln\x9dTE\xfbU[E\xbf" -"(\xc\x3\xf5\x4\x9d=\xb3h!q\x1c\x8a}\xd5\xe7\xa2\xc1\xcd\xe2\xb3|\x80OP\xfe\xdd\xae" -"\xaa+\x8a\x2\x9b\xf4{N\x91}Y4\x18\xa2\xe7!8@\xe7\x9f\xd2\xd1\x61\x0\xd8+v\x95i\"" -"\xfb\x93\xef\\\xb7\xa1j\xfe\x18\xcc\xcak\xc8\x9c+d\x3\xb3\xa1\xce\x8a\xbc'h\xd8\x92" -"0\x5<\xb2\xc1>92,\xa4\xe4h,\xe1\xf3\xeb\x9c\xa5\xdd\x64(\xb9\xba\x1c\xcW;\x9b\xac" -"\xaf\xdf\x8a\xa1)\xcd\xff\x32\x1a\xdf\xd5\x14\xb2Yj~\xe7\x36q\xd8\xcf\xdf\xfa`\x14" -"\xdfq\xa1K\xcf|$o\xca\xc1\x19T\xc4i\xa5\x8[\xcbXeE^xD\xf8\xa4\x11:\xeat\x98-\x1e" -"\xc5\xe0k\xc8\x8b\x6V\xaam\xceo\xf1\x94\x91\xd0\x33\x1b\x9e\x12\xd3Hb/\x11\x89t>" -"\x97L\x19\x3\x4(\xd9\"\x43!\x6<@E]\x14 a~\xe0VW. r\xab%J\xf4\x33\x9b\xc9u\xf9^f\xb0" -"\x93\xfb\xe3\xce]k\xd5\xc6\x1\xa7\xec\x41\xbe\xa5#I\xf9\xfX_\xc5.W\xdb\x9f\xed\x41" -"\xc6\x10n\x15rL\x8d%\xe9\xa9*\x97`G\xe1L\x2\x83\x98\x1c\xd5\x32 V\xcLGy\x85\xe5\xff" -"\x9\xddW\x86\xa3\xd6\xb2\x3\x37\xea\x6\xe4\r\xdd\x15\n\xed\xa6\xe7\x41oC\x9b\xb8" -"\x18\xe2g\xa9p\xa5O\xbd\x46\x8\x8e\xa0,\x1e\x8bh\x9d\xf8\x1e\xd5\x17\xa2\x37#\r\xf2" -"6\x9a\xcf~\xe9\xce\x6\xc3\xe2N\x83\xa5\x62\xc\xe4pG\xc7%\xfboW\xa1&\xd5W\x81@lg\xb" -"\xa0\xdd\xe4\xce\xdb\xb7\xb2\x8c=\xa9(\xb6\xb8(\xef\xda\x0\xf2\x1b\xdc\x87\x63\x8a" -"k\xb5\x9b\x12\x9fP\xaay\xff\xef\x5\xcd\xdb\xe7\xf3kY\x97\x88\xd9\xb8\x13\x80W7\x83" -"\xdb\xde\xdd\xd0\x8bW\xaa`\n\x8c\xf8\xa2\x94\xfd\xda\x95-m\x1d`\x98\xf\xea\xdd\xb0" -"\x90Q\x17\xf5P!\x98\x18n\x8aW\x1\x9d\xe9~\xd3\x36\x9c)\xd2\x17\xfa,\xae}\x94\xa8" -"*\xcd\xdc\x8a\x32\xbc\xfe\xbf\xdb\x16}U.\xa8@\xb9\xe8\xb2h\x9b\x3rI\x7\xbe\x1a\x8f" -"\x97\xbaN\xd0\xe0\xfd\x98%y_\xdcTd\xa4]6w\xfc{\x14oo\\f\xd8z\x7W\xdf\x35\xd1^\xad" -"\x8c\xadL\xcf\xe9\x86Y\xb6\xc5\x81\x1d\xe8,\xf5\x64N\x0\x43K\xcb\x8b\xdc\xda\xc7" -"\xcf\xc5\x17\xcd\xc4.\x8bu\x84\x94\xb6\x93\x9b\xec\xc2\xd6\x42\x66\x2\xf1v\x7\xfe" -"\xb9\xa7\x18\x36\xb1\nY\x80^\xc4\x30\xfbn\xfcI\x17P\x10\xcb\x9a\xb1\x95>\x90l\xf6" -"o\xcd\xe4\xd2R\xa6\x83\xcf\xba\xc8\xf4\x1e\r\"\x1e\x35\xfd\xa9\x6}\xec\xaaq\xda\x1d" -"C\x93\x80\x33\x92\x45\x9\r\xf4\xe2\x1d\x81\x84[#?d\xad`\xddm@F\xb1\xa2W\xdb#\xe6" -"\x82\xd0\x66\\U/\xd3\xacn\x95\x65\xa7?\x8f\x91=\x84\xd8\x62s\xc5\x7f%\x14\xb2\x89" -"\xbfQR\x87\x98\xefL9\xc\xb2'\xa5g\xc1\xb0\x16\xe7\x1f\x2\xbf{\xf0\xae\x89I\x9d\xe5" -"=\x7LJ\xe4\x95X#\x17\xa5\x9c\xf5\x94\x7f\xc4i\x5\x46H\xb8\x81u;\"\xf6:\xb9\x36\xc8" -"b\xec\xe5\xab\xfa\xfc\x1\xe0\xab\xdbL\xf1\x63&y\x11\"\x9c\x36\xdd\x1d\xf0\x42\xac" -"\xf9\x32\xf1\xc5\x87;\x5\x91\xc2oWl\xad\xccjS\xad\x63~\xb1\x1c\x8c.\xe6\xcc\x84\xe1" -" @%\xa9(\x90zY\x1a\xe\x8n5L\xf1\xf5\x83\x5IS\xaa\xeb\xcfN\xf8\x9cN\xb2\xc3\xf0\x1f" -"@\x9e\xfe\xf3u\xcf\xd8\xed\x93-n\xc3J\xc9\xabk\r\x95\x84\"\x63%\x9f!\xdf\x66\xde" -"]Z\xe7q\x88]\x85t4\x9b\x89Yt@}\xe4i\x5\x8c\x94\xcc]^\xcf\x94\x99T\xf0\x80\x1e[\xe8" -"\xde\xdb\xac\xba~\x89?\x9a\x14\xe2\x11\xe2^\xb9\xa8\xd4&\xdd\xd6\x92\x66\x9fx\x5" -"D\x17\xba\xf8\xdc(*\xab\xd7\xef\xb1H\xde\x94\x15\xb5\x63\x46\xe5Z\x8f\xc3\xe5)ms" -"\x9e\x83v\x97\x31\xc4\x8a\x95\x31\x8d\x95\xebI=\x0T\xb9\xd5\x88|5\xcf.L8\xeP\xe1" -"\xbe\x66\x90\xc5\xf6\xe9\xe7\x1\x8c\xda\x11m\r\x8a\x98=C\xee$dV[\xf8\xc1\xfbVa\xb7" -"X8\xd1\xc1\x82>\xae\xcb\xd2\xed'!\xfc\xc3SQn\x94\xf5\xca@\x13\x9b\x8ci\xf6\x9a\xbf" -"H\x9f\xd3\xe0\xd7\x6lZr,\xf5\xcav0s\x4\x1b\xae?\xe9\xff\xac&\x1fuE{\xa5\xd0\xf5\x46" -"\xee\xc5t\x1aw\x0X\xb2\xe8\xb7iX\xab\xe5\xa2|\xde\xd4\xa8\xd1\x90\xad|\\S\xb5\x1e" -"2\xc1\x5\xf4w=\xaf%\x9em\x1b%\xe9]\x8c\xb0\x1\x80R;Q\x80u:\x18\xe7\xfa\xac|G\xfe" -"\x9cJ\xa7\x19\xea!n\xfa\xda\xecR-\x1d\xf9\x6\x32\xe5O\x8c\xca\x66\x96:]\xb7\x84R" -"\xdf\x42iEy\x8b\xf\x91Q\xa9)W\x15%\x99^\x15\xee&8\xc7K\xdau\xe8\x14\x1\x61\x1a\xa4" -"H\xe9\x36\x14\xd4\x84\x1a\xb[\xe4\x1\x98\xa4L\x5\x8d\xdf\x14\x8\x98\x81g?c&\x82\x1" -"\xc1\x99\xdeP\xebH*\xe&\x87\xf0.\xd9\x9d\xe1\xaf{,@\xef\x8a\xe4>\x84\xf7\x99#\xbe" -"\xd8\xdc\xa6\x13-v\x2\xbb\x1e\xa2;\x10\x46\x96(\xc6\xc2\x63\xac\xba\xfb/\x1b\x9a" -"\xe5=\xf\xc9\xec\xdc\x64\xf3\xb9\xd5\x13\x61^\x1b\xaeT-\xd4\x7\xc6h\xd3\x8b\xcf\x1f" -")\xc\x82#\x4\xaaI%\x1e\xd2R\xf0\x36P\xee\x62(\xe\xd4\xe1i\x2\xca.\xdd\xb2Mq\xe4\xb1" -"f\x17\xf4G\xc6\xbc\x90}\xb1\x87\xa0\x1e\x9b\xe9\x1aG$\x81\x61\x36\xbe\x46\xee\x38" -"\xa4\xcf\x91\xcf\xf5\xf4j<\x19\x95\xc1" -"\xd3\xfe\x17\x16\x7x~\xe0H\xf6J\x17\xea\xe6\xaf\x90#\xe9Wo\xb4\xca,\xee\xd4]\x91" -"\x95\x65\x10\xb8N\x7{\xc6-\xdaHwv\xa2\xa2ie\xd1o1\xd1\xea[\xf\xc1W\x1\x38\x89\x16" -"\x80+\x84SP\x10\x7\xd6\xce\xe7\x95\x32\xbc&\xc3\xda\xa5\xa2\xe0]\x8a\x17\xf4O\xa7" -"\xfdL\x2\x66^\xd1K\x93\x9e\x8b\x85;08\"\xbc\x1b>\xc5-\xbb\x8c\x88\x85\x2\x7\xea\xed" -"\xe9\x17\x66;\xb7Q\xe0W\xb6\x90Ih\xca[\x86\x85\xc5\x84\xc1\x1b\x9c\x98\xed\xa0\xc7" -"\xcf\xa5\x31\xa3@\x9f\xc0\xc7\x66L\x95K-{|\xed\xdf\x9b\xb4\xbc\xdf\x14\xa3\x41\xa8" -"\x10\xffI\x82\xd9\xa4:\xdb@1MVY\xfd\xc2\xc7\x90Q\x1c\xc0\x85W\xe3P\x11\xef\x1c\x0" -"\x5\xe\x93\x82\xc5p\xd7\x16\x19\x80\xc0\xe3S\xfb\x17\x85\xcf\x9c\xb6\xa2\xa4\xe6" -"\xb5\x82 e\xac\x84\x91*10\xa1\xa8\x62\x7f\x98j\x95G\x1\xf8\xa4~\x8a\x9d\xa1-'N\xe9" -"^Q\xdc\xbem\xce\x62.\xbf\xf3X\xe6=A\x9d\xed\x6\xaf\xff\xd7\x14vaV{h[2\xe1\xc1\x7f" -")=y\x17^\xd1\xdf\x33\xd1\x0\x82\xe3\xfQ\xcd\x8b\xc8\\~\x81}\xba\xba\xe\xa6\x3\x41" -"\xd3\xe0\xab \xbe\xc2\x87?\xd3\xd1[\xba\xe3{K\xa1\xfd\x32\xd0\xc\x13#\xbej\xa6\xcd" -"\x85&\xcc\xb2\xfa`\x18\xe0\"\x1b\x84\x42\xe1\xe1\x86\xf4/I\xe7Hfk\x1ag\xdd\x61#i" -"\xc1\x9a\xfe\xcbY\x8f\x1f\x46\x1d\x45\xd4\xac\xf5\xb6\xfb\xd0\x12@\xc4o\xe3[\xf9" -"\xf9`\x19\xfb(\"\xaeM\xa1\xac\x88\xe6\xd9\xa5\xa4#L\x92\x84\x31\x84w\xbbR\xb0\x6\x12\x95:\x9a" -"\x8e\xbb\"\xbbt\xec\x37\xb9\xe3K&q\xcf\x85\xebV\x1b\xb2\x9f\xc8N\xa3\xd8\xb8J\x92" -"\xcd\xc6\x31\xb\xcf\x9eVC\xf4\xb4\xecU\x8f\xd6\xabO\xae\xe1\xaa\x15V8q\x16\xc8,\xfd" -"\x9f{^6j\xaf\xbd\x36[\x1e)\x13R\xf5\xa7|\xd1?O2\x3\x8f\xc8\x65\xbe\x94\x2\x92\xa3" -"\x11M1p \x1a.\x1a\xf0\x5\xe1\xd1v\xecW?3\xe0\x34?fVyn\x1f\x2\x16z\xcd\x81\x37\x8c" -"\xbc\x3\xf1\x86\x99\xb5\x35\xff\x63[\x80\xbc\xc4\xb4I8\r\xa8\x30`\xfb\x7fw\x3\xd9" -"N\x19\x94\x1a\xcf\xec*\xe9\xdd\x11\xab\xf8]\xa4\x9d\x99\xf3\x8d\xa1\xe7mW)\x91\xaa" -"\x89\n\x8bl\xb7\xf9\x17O\x14\x45\xc5\x92jFff\xfa\x8e*\xba\xae]z\x16\xdf.\x91\xdc" -"\x3\xf0~.K\x90\x17\x31\xd6\x9b\x7f\x84:\xa4\x1f\xd2\xa7\xdc\x2\x9c\x43Q\xe\xf3\xf7" -"\xd6\xb8 r\xbb\xbcM\xef\x97+L\xc2\xfe\xe6v\x99\x10\xe2Qg*\xf8\xfe\xbe\x1{\xa7m\xb5" -"\xc2\x1bWi\xb6\xca\xb6\x13\x14VR\xfanW| \xe3\x44&\xc2\xc9\x2\xc5\x39\x84\xf2:kV\xf4" -"0 \x0\x1c\x39\no\xd6U\x2g7\x8f\xe8\x9K\xaa\x64\x8br&\x88\xff\xaa\xdf\xb0\x8c\xf3" -"0\xd0\x96\x98?nC@\x85\x33\xb5\xea:R\xf\x89\x44>\xb\x88\x19\xb7\xc1\x18g\x5\x1\x89" -"\xb6Y\x11Z\x9a\x19\xe8\xf5\xbb(\xf2}m\xee\x19\xfe\x63\xfc\xbe\xa0o?\x1d\xed.\x81" -"\xfcOI=\xbe\x6\xe2gB\xab\x96\x1d\xba\x19]\xdf\xe8nI9\rp\x94\x0\x8a\xc5!M1\xc4\xfe" -"\xaa$j\xbf\x1a(Se\xed>e\x4*\xd9(J\xb8T\x86\x43\x34\x8\xb9\xad\x90\xf2\x45z;b\xb6" -"\xfd\x99\x7?\xb:\x11k\xe3\xbbjV\x8e\xc2{\xab\xabZZ7\xd1\xa1_\x97\xe9\xe0u\xe1\xff" -"\xa1\xa9\xbe\x38\xbf\xf6N6kVS\xd0\xf2\x90\x1a\x38\xdc\xfa\x9bz\x95\xa9\xa6\x61\xbe" -"\xf4\xdf\xee\x91\xe6\x8d\xd6\xa7G\xc7\x12\x96\x34\x15\x30\x9f\x95\x12\xa7_\xcc\xb6" -"\x8e+S\xb4\xff\xe5\xaa\x14\xc4\x9a\x43\x46\xda\xe1\x93\xef\xe9RSF7\x90\xd3\x7Y\x2" -"\x14 \"q\xc4i\xae\xb5\xdc\x1d;\xa6\x66\x61\x88\xe5\xe1)\xa8\x43\xf9" -"{\x84\xa3\xd8\xcc\xfc\x84\xc1Ww\xb8\xd7\xdb\xd5\xe3\xf7_\x8~\x6\x88W\x17?y[dJjO\xf0" -"\xe1'F\r\x15\xc\xf0\"S\"\xdd\xc0\xde/ \x11\x37>d\x99\x15\x46\x39M\xd2~\xd6\x8b\x81" -"\x82\xfd~\x98\x85\xcck\x5\x7\x15z\x8a\x7f\x5\xec\x99\xb7\x44\x31\x80\xfc\xa4\xa1" -"t\xb7\xaa\xb1\x10\xd9\xea\xe5`n\xbf\xb5o\xf5\x35\x82\xbd\xa0\x12(\xd9[8\xa4\xd8{" -"\xd8\xae\xe6\xdf\x9e\x95\xd6K\xbb\xac\x35\x84\x1aG\x86\x94S\x1e\x1\x43'\x2\xc\x12" -"m\x4\x6\xc0\x46mV\xb6\x34\x9\xe7z\x9d\xaf\xae\xd1UE!qe\x19\x88\xf0\xf6\xef\x1c\x35" -"}\x9b\xb\xde\xc9\xb4\xa3\xeb%g\x14\x98\xcbk\xf5\xd5r\x3\xb\xaf>\xb6\x37\xcb\xed\xa7" -"d\xf7PC\x1c\"j\xa9\x90\xab{\xf1\xd1Y=\x2\x43\xc1\xd4\xda\x65+dP\xaf\x33\x1\x30\xc3" -"\xbcI\x0\x8e\xc4\x9J\x12\xa1\xd8;_E\x11\x41!\xae\xf1\x63 \x9e\x39!3&\xd3_8\x8$\xb8" -"\xe\x80\x41\xd2\xe9\x8bl~c\x10g\xa4:\x5\xf5\xea\xf6\x1\x8e\xda\x38}\x8e\xf3\x42\xa3" -"{\x8\xba_\xc5\xc8\x61\xd8\xbfpH\xcn\xdf\x82\xf9\xc9s\xba\n\x8c\x1b\xa3\xa7\x63\x96" -"\x15\x45+\x7\x39\x0i\xb0x\x83#C\x8 \x96\xe4\xda;\x8\x85\x96\xe\x8e\xc6qQ:\xbcs:\xfb" -"\x94s\x81$/L ~\x13\x41\x91\xc7p\x7f\xfc\xe8\x33\xca\xb3\x9b\x31\xe4\xb6p\x97\x12" -"=\xaa\x32j\xb0\x6\xdd\xc7}&\x85\xf7\xbb\x9b\x12\x35\xea\xea\xf8\x4\x33\xbc\xd7\x42" -"K\xca\xd8\xc6\xb2\x61q\xf7\x46\x38\xac+\x7\xfc\xdb?\x8a\xaf\xdc_P\xb8\x3\xc0\x1b" -"\xae\xf5\x80\x89\xb0\x7\xb8\xaa\x30\"r\x8c\x5{\x1aq4=\xac\xc4\x1c^\xacO\xc4\x43\x8a" -"\x82T\xf5\xaa\x93.A[In\xc9\xcb\x16\xba`\x8f\xde\x83\x41\x9d*\x1d\xdfUo\xe8\xd6\x3" -"`l\xeb$\xa5\x81(\x8c\x45\n\x62\xec\xf7wU\xfb\xfa\x98o\xa0\xb0\xde\x13\x34{/\x90\xa8" -"\xcd\xb7\xe2\x35\xdcYz\xea\x9e\xe2\x87\x65\xbHi\xabX\xc9~\xa5Y{\xea\xfe\x42SZ\x8c" -"j4[\x97\xaf\x14\xb6\x9c\xe6\x36\x91%Q\x8c\xb6\xf7\xa8\x96\x82\x91\xc6\xa6\xb1\x61" -"`\x19=Z!\x87\x2\xb7R:\xd3W\x10\xef\xcfL\\\x8e\x9a*0\xd9\x95\xdc\xeb\x13\xea\xe7\x17" -":#\xb4\xaa\xae\xf5\x85t\xa2\x66\x30^\xa7\xacZ\xae\x80\x1c,\x17\x4Z\xe%\x19]\xb4\xa8" -"_\xe7\x8c\xf8\x42\xfa~9\xa2\x3\x84-/t\x81`0YC\xc3mE\x10\xf3\xfd\x82\x9d\xd1\xe4\x81" -"\xd6\xdd\x88\xa1QE\xa9\xdd\xe8\x8a-\xbf'+\xa5\x16\xda(\xe4\x14\x8\xd6^\x9a>P/a\n" -"#!\xe9qJ\xd0lB^\x96\xd1=P\xeb\x8dO\xf1T\xc1z\x85N\xfe\xcb\x9c\xc7)'\xa5\x42\xb8|" -"\x80\xc4\x85\x62\x1d\xeb\xb5\x30\x44>\x9a\xec\xa2?\xe2\xff\x9f\xeb\xa3*M\x8c\x96" -"\xbf\xe7\x97\x91;\x8k\xec\xc4\xea\x17\xddt\xc2\x8bO\x7f\xca\x43\xf4\x31\xbf\xb6\x88" -"\xf1\xfc\xda\xe5\x65\xaak}\x14\x1\x39 \x92\x30{\xf3_\xb5\xbb\x38\x37\xe8\x85\xf7" -"e\xf1\xc4\xef\x31HwhW\xf1\xc1\x84\x62j\x9c\xa1\x98\x92\xb1\xc7\x2\xb7,\xf9\xb4\xa6" -"\x98\xa8\x8f;\xaa\xfb\xa2Wxt\x82/Kd{>\xf9m\xa5\x8e\x45\x89\xf\xc9\xa0Vac\xf4\xca" -"C\xe1\xc5\xe2\xa8\x62\xa7\x61\xda\x31\xf8\x97\xc5\xe\xe5\xd0\xef\x12@m\xabrGQ<\xac" -"\xc1\xbe\xbf\x84\x2\r\xd0\xca#\x2\xf3\x45\x82\x10\x95\x4! \x81 \x80\xea\xfb\x7f." -"\x94\xc6|\x88\x1b\xef\x5\xdaY~K_\xc7\x97\x44\x1a)\n;Z\xeb\xcc\xa1\xb9\xf2\x37\xf2" -"\xb9#5\xc8\xdc\x10\xb0\x8e)\xae\xd7\x42)\xab\xba\xf5u\xabZ\xed\xb9\x44\x11\xc5\xd1" -"\xf8\x37\x15\x13\x9e\x61\xaa\x9aV'mHc=\xcd\xeb\x7fZ\x9f\xff\x32\xc9\x95qh\xee\x9c" -"\xb1j\x99\xa4k\xe0\xd6\xc0'\xc1\xfaQ\xb0\xcc\xf4\x85\xb7\x9f\xf0\x65\xa3\xa5t\xab" -"B\x11S\xde\x39\xe4\x19\xd6m\x12\x43x\xc3\x83\x19\x44\x96{\xc1q\x9c\xdf\x90\xc\x14" -"~_\xea\xe7}j\r_e\xcdW\xc8`\xda\x6\xd8|\xb8}U\xb9s\x4\xfdw\xa6n(e\xf4p\xa4\x1d\x86" -"`T\x1f\x31\x87\xcd\xac\xe3\x46QTx\xfb\xe5\x5\x82\xb9\xce\xb2n\x94\x9\xbc)JC\xb4\x1d" -"\x8d.\xea.3\xa9\xdc\xe8=\x1f\xae\xc4\xb0\xaf\x9d\xabgr7\xb0\xd4\x42\xe0~\xe7\x9c" -"%\xdc\xeb\xb8\xfa\xa9X\xed\x89\x8e\xf9\x91\xd1\x66\x34\xbd\x80\xdbt<\x7\xf0p\x81" -"\x2\x14\x1c\x9c\x32I\xe0\x99\x99H:\xad_\xd7\xe0j\xbf\xa5\x9c\xde\xd8\xf5\xaej\xf6" -"N\xc5\xf6\xe6\xc2^\x10\x1bvX\xb\xc4\xa7v\xdd^\x90\x9c\xe9,\\\xc2\x32\x41\xfbr\xba" -"\xcf^\xc9\x35P\xb6\xba\x30\x13UL\xa9\x8\x8c\xce\xd4Z\x8c\xc6\x0)\xf3\xa7\xec\xc5" -";\xe5\xea\xfb\x16\x90Y\xabKsP\x6h`\r\xc1\x45\xc9*c\xc9\xbdM\x1b\xc9\xa9\x2\xbc\xd9R\xa0\xdb\x12\x96\x35Z/\xe0\x9a\x65\xf7\xfc\x34JR\xe2" -"\xbQ\x91\x30_\xffL\xcc\x97\x32^/\xffV3J\xf2\xa3O$t\xfd\xe3g@28|\x8\xfc\xee\xc5/\x19" -"\xc4\xf7\x32\x46\xdd\x30:\xf9\x97\x1c\xa8\xc2{o\xde<\xd2\xb6\xd3&~\xc8-\xd3i\xbe" -"\xaa\x19\xc0\x8b\xeb.\x2\x11<\xc7\xe9>9\x88\xcb\xd6\x65{!\ro\xe7\x96\xf0\x32^\xcc" -"1\x5\xf4m\x6\x36\x43\x85\xe6\x9G[\x96~R\xdbNCH\xe3\x9dQ\x9c\xea\xc2\x13W`\x8\x93" -"\x19\x9a\x1\xd7\x35\x9c\x8e\x45L\x10.\xc6\x97\x44\xb0{\x87\xfeS\x9f\x4q\xa4t\xa6" -"k\xa6\x2[\x12h\x8bM\xa2\x65\x61\xacm\x7J-<\x85Y\xa0\xe\x9b\x8e&\xcd\x64\xaf\xba\xf6" -"s\xb8:\x89\xc8~\xdd\xf4\x62&\xae\x41s\xaf\x9\x64\xb5\xdc=\x91~\xb2\x45\x62\x95\x37" -"\x82\x8d\x8e\xb0\xb2\xa6\xad\xc5\x11\xd2h\xdb\x2\x9b\x1c\x42\xcd\x36\xe6\x1b\xa3" -"$\x89J\xe4\x33o?\xeb\xd0\x8b\xae\x32\x34\xe3u\x1c\x1f!k\"\xc5#L\x81L\xdc\xd5\xa5" -"\xf0\x9f\\z\n\xb0.j\xd3\xd0.\xe4\x2_c\xf9\x13\x9e\xe7\n\xb5\xf5\xd2\x98\\\xe1\x1b" -"8\xe0\x14:\xdd\x2^\xe4o\xc*\x1d\xb3\xdd\xca\xa1\xf8\\\x6\x89\x3\x45\x85\x41\xce~" -"\xa0\x38\xaa#\x8c\xc6\xf4\x0\x85\x65\x9d\xda\x5\xc9\xf3\xe5\x9e\xf1nK\x14\x7w\xce" -"\xc0k\xa3\x89\x6\x34\xf7\x66\xb4OE\xb\x98\xc3\x32\x33\x81\xe7\x9bJ\xbc\xee\xf7\x85" -"+\xc5\x84\xcf\xa3!\x15\xc1\x93\xd2\x7\x94\n\x8f\r\xd1\x0\x81\x6\x81\x88\xfbG\x87" -"{\xc5r\x9\xe4\x81\x89\x17\xd5\xd6\x19\xb7\xa7\x16 \xf9\xf5iO\x81Y\xf1\x14\xb6\xbb" -"\x9f\xb3W\xb9\xc5\x6\x37\x97\xce\x14\xb0\xdcjv>\x80\xba\xf1\xe2G\x85\x99\xbe\xef" -"i\x9e\x9f+|\x3\xb8g\xa5\x9e\x61Z\xd4=\xdd\x1e\xab\xc5\xca<\xd4\x9c\xfb\x89]8\xee" -"y\xa2\x92UL\xd4\x1d\x16\x6k\x6\xb0\xc9\x62\xe6N\xae\xec\x8c\x38iSr\x15\xc5g\xfe\xe6" -"\xf3V\xcd\x46\x10$\xbf\x4J\xf0`\x7\xcal\x7'\x17\x80Q\xea\xe2\xb5\xeb)z\xdeVs\xae" -"\xae\x3\x1a\x8d\xc7\xbf\xa4#\x8bIH\xb2\xbd\xb8\xa7\xad,\x89\x99\x82[M\xbb~^\xf3K" -"3e\xdc\xc7\x1clD\xcbzl\xc0\x1b\x65\xa8\x17\x1f\xb\xdcJJv\xb0W\x9a\xba\x33\xc4\x38" -"\xcf\x7f\x10\xb0\x9eTk\xa2\x1e\xf3\xfb)\xcb\x38{\xc8\xe9\xc7\xf6#\x98\x1\xbf\xb5" -"pR\xee\xd5\xc7\xadu\xedQi\xe\xe5\x91M6|\xce\xa4&\x9d\x95\\'\xf1\xf0\xf6M\x1eO\x16" -"\x9b\xdb\x86!\x91\x86\x17\x43<\xf8-p\x80\xcf\xe8 \xe4\xf2\x8d\xc5\xcb/\x9c\xb6\xe7" -"\x89\x92\x84\x7\xdd\xaf\xc4'\r}^4\xe4\xc0\xcb\xd3\xe1\x82+I\x86\x91o\xac\x9f\xb6" -"\xd5\xdf#\xbf\xef\x93\xdb-z.\x89\x16\xc4#\x9a\x13\xf1\x9c\xf6\x38\x92\xf0\x45\xd0" -"e\xbc\xf5\xc8@=3Z\xc0\xfe\x41\xd4(o\x0\xc3\xd8\x9a\xdc$\xe1t \xf7\x97\xee\x45t\x9c" -"rq\x8b\xea\x13\xc2\x43\xa9\x1e\xb7l!Y\xdd\x85\xbb\xb6\xa7\xa9#:\x3\xd5\xdb\xed|\xf7" -"\xa7\xd2\x4\xcb\x61\xa4\xc\xb6W\x88m\x18\xa2\x94pP\x9b\xc6}Z\xfc\x33\x89GF\xef\xbd" -"\\h\xe4\x91x\x8f\x17\x83\xb9\xa1v\xab\x9bH5\x80;\x9bQ\x90\x98\xd4\xcaR\xde\xb1\x8c" -"\x9\x9b\xba\x12\x1\x85\xf8\x62T\xaa\x8c^B\xeb\x9al4I$\xf5\xbc\xd6*\xe4]2R=\xad" -"\xad\xdb\xc0\xc\x39\x8u\xfb\xf5\x89:\x5\xd0hZ\x2\xa4\xbc\xfb\xb{\x86\xd5\xb5#\x1b" -"\x4\x18qsyA}\x2\x7f\x30\xd3qz#\x1\xca\xde\xdf\x99\xc7\x37\x38\xab\xf2\xe9\r\x16\x32" -"\xe6\x2\x39\xe7Z\xc1\x42\x1b]\xfd\x9\xda\x8f\xfl\xfe<\x91\x44\x97N\x1e\xf3\x92=R" -"\xe2\xfb\x96\x8a\xbe;=\xe2xe\xf2\xd9)\xcf\x84O\x9c\xd6\r\xe0\xe1{\x10\xde\x17q3P" -"\xa8Y\xce\xea\x43v)\xfa\x31!\xfc\xc1\x86\xc@K\xea\xac^f\xa9\xe9\x15\xb3\x5\xfc\xfa" -"mO\x4\xc3\n|\xb5\xf9\x35\xc6g\x8d<\xd3\xfe\xaf\xa1\xcbn\xa8`=4t\xd9-g\x4\x0\xba\x9" -"@\xa0\x90\x33\xa3\xdc\x38#@Gd\xd5\xa4" -"\x80Q\x8e\xfb\x63Y\xbc\x32\xa5\x39\x12\xe0\x8c\xc1\xc8H\xdd\xb9\xe8\xfc#\xe1\xd2" -"\x87\xa8\x88/\xd8\x33\xb8\x84\x9f\x0!\xfc\xce\xa7\x64\xbc\xec\xc0Y\xd2+q0\x3\x18" -"\xe5.e1\x81\x1S\xb5\xd3\xf1+\x82\x2\xec\xd5\x8f\xa2\r\xa6'ad\xe4\x43\xea\xcc\x34" -"!\xf5}\xdf\xb5}E\xdb\xed\xbf\x8\x8)=\xf2\x96\x88\x1e&!\x9f'\nF\x8e\xa6\x95\x91\xd5" -"\xee_\xae\x92\xa9\x13\xe2\x90_\x1\x1b\xcd\r\xc7\xb7\x94\xcc\x8b\x1c\x8d\x16n\xf1" -"\x15\xe4\xa0\xf3g\x8e\x9eS\xc9\x36\xc9\x82^0\xe3\xed\x62\xe6\x89\xc6\x7fl1\xbf(*" -"qOA\xd9\x88\xa0\xf3Z\n\x1\xb8\xc7\xd0\xa3\xde\xba\r\x94}\n|\xa5\xa3!\xe3y\x83{+\x1" -"u\xfcl\xd4m-\xd2\xb0\xc6\x64-\xdd\x14\x96y,K\x1d\xfa\xe6\x1\x1a\xf1\x65\x14\x99\x2" -"z|\xd1\xe5\xabOR\xeb\xaa\xc9\xc6\x0\xbe\xf9&\xf9U\xc9\xd8\xda\x1a^\xaf\x46\x98\xa7" -"\x1f\xc0\xfcp\x95\x30\x36_\x2ZU\x87G\xe1\x1a@\xc1!\xa1\x30\xa0\x13\x3\xf6hS#\x86" -"\xd0\xc9\xa5v\x93|\x19\x85G\xb4\xddO3\xc2R\xcb\xfe\x9d\x90o\xc9@\xc5n\xea\xa2\x42" -"\xc0\x8a^\xc3\xb4O}\x8f\x42\xb3\xd9O\xb5;ZJ\x8c\x9c\xb1\x1fk\xb4k\x15?\x0\xb6\xd5" -"\x8c\xa6\xa0\x31L\xb1nKe\xd5\xb7\x1cs\x9c\r\x42Y\xbd\x30\xa2\x13\x45\xab\xb5\xd7" -"\x85s\xa8\xfb\x7\x9\x94^_Sm0h\x96\x63\xb3\x1e\x64\x30\x98\x43(\xe7\x63\x9\xec\x9d" -"\xb\x81m\xff\x66\x96\xd3JVOiK.\x8b\n\xd6-T\xfc\x97\xd2\xd0\x9c\xa9\x45yu\xbd\x86" -"I?0k\xe8\xae\x62V\xf5\x8f\xfd\x6\xb1\xd9\x6jK:\xd2\x64nIC\xfd\xa6\xf1\x31\x63\xca" -"\xbc\xffX\x1f\x8b\x92\xd5\xf3>\xdfQ+\xc8\n\xbc,\x84\x35R\xd7\xc7\xdc#d\xbd\xee\xfa" -"\xdf\xee_\x84,\x10\x9\x81\x7f\x11S\xbf\x9+1\x91\xee\xab\xa2\x9\x91\x36&PR\xca\x19" -"\x92\xf7\x93\xa8[\x1f\xe1\xc1\xac\xd6\xd6\xb5\xab{\x16\x9c\x5\xbc\x65\xbb\xa8\xa8" -"\xd4}\x1\xf5\xc4\xb0\x14z\x97\xca\x15l\xeep\xd3:\xbb^X\xaa$f\x9b$\x5@\xfd\x1d\xe6" -"g\x1e\xf0g\xa3\xfc\xc2\xda\x39\x33\x7f\xfd\x87\xe6}4\xfd\x4$$\xa4\xb3Z\x1f\x89=\xe8" -"\x97iv\xfaj(\xf3xf_\xcQ#\x7f[\x83)K\x9e\x89\x85#\xbe[\xd0\x92\xf\x14W\xc4\x80\xdc" -"\x88\xb9\x7f%\x10Z\x4\xae\xc0\xd0\x9cj\xad\x91]\xe6\xb2\xd5\xb8\xf0\x1\xefh\xd3\"" -"\xbf\x42\x1c\x98 T\x83\xb2/{by~\x12\x36\xde\xbe\x1\x96\xbe\x1a\x42;4\xdal\xc4\x1a" -"\x15\x8\xdd\xe4\x99\xb5\xba{\xe0{\xde\"Zex\x88\x3>\x8\x13K\xf4$\xc5\x39\xea&f\xb3" -"\xc1\x32\x2\xb5\x6]\xde\x6MdL\x13\xa5\x1an\x9\x83\xd0\x42s#\x8L\x0\xbc\xabs \x1f" -"t\xcc\xda\xe0.\x95\x1d\xe4-\xd4@9\x89\x16\x1\xfa\xb4\x45{K\x0UQ`y\x10\xd2!8\x6V\xb1" -"\xec\xdb\x91\xf4\x9a\x96>\x9f\x90\xf4\xa8\x46h\xf2\xda^\xe9z\xec]\xaa\xfe\xd5\xd1" -"\xb7n\xc9\xf2\xb6\x63\xd3\xff\x10\xb3P\xfb\xa4K\xc4 \x83\x88\xcf\x30\x84\xa2m*r\x0" -"\xa0\xf9\xe5\x93\x30\xb8s\xe5\x82\x61N\xd9\x62_3\xb1\\\x32\xe5O\xf&\xc8\xc4\xb2r" -"a,\xeds\xb7\x5\xf0\x81\x43\x82\x18\xb9\xeb\xe6\xa9\x34\xa4\x43\xb8\x66w&\xfd\xc4" -"\xac*\x1d>%\xc%|o\xb7\xf5%\xb5w\x85\"\x62\xbe\x1c\x11\xe6\\\x99\xb0\x65\xfaI\xdf" -"\x16X\xe2$ley\xc2\xc3\xd4@\x86xo]\xf5P\xf7\\\x97\xdc\xd4\"\x99\xd3\xffO\xe3i\xda" -"\xfc\x86\xc6\xff\xb8\xb4\xbb\xe\xd2U\xf0\x89\x90\x42\xb4\xa5\xa2\xe\x34H\x7\x6\xfb" -"W\xc6\xaa\x7\x8\x45\xaa\xb5\x1cR\xa4\xaa\xbe\x1aO\xcc\xd2\x84xp\x9bo\xb7\x82z\xa0" -"h\xba \x81@\x9a\x39m\xab\xd3\xb0\xb7\xfe\xf9\xad\xeb\xbf!\xbe\x84\\~\xa7\xea\xa6" -"\xa0\x8a\x44J\x13<\xb4\xe^\xca\x88\xbf\\\xef\xf2\xdf\x18\x1euI\x95\x14\xcb\x88\x37" -"r\xe4jj\x88\xfe\xdf\x8f\x42\xa8\xdf\x5?7\x9e\x89\xda\x98]\x1b\xaf\x95]\x9c!\x80\xc6" -"\x1f\xe8\xd3\x89\xd2\xf7\x83\xc6\xecGB\xb9~\xcf\x86\xdb\xd8\xdf\x35\xa1\xb8\xb3+" -"\xc3\xba\xbdXo\x13\xf\xc7\x8d\n\x45\x8a\x92\x36\xdd\x38\xcf\xef\x1b_\xd9\x9d\x36" -"\xc6Lg\xb2&!L\xd2N#m!\x85\xa8=\xc7\xc1}\xe1\xfa{^\xf4\xa8)s\x9a\xa9\x9e,M\xf2/z\x97" -"%\xc9\x8f\xf1\xefIz\xd9\xdfN#\xa0\x7fl\xe\x13!|\xe2\xbb\xce\xa3\xab\xeew\x19\xd1" -"@7\xb7\xae\xffZ\x8c\xd2\xa1O\x96'\xc%u\x1\r\xdf\xf8TO\xe3\xfd\xb7\xb2\x91\x94\x38" -"\xfa.\x82\xc6\x10 \xceOS\xb6\xbc\x8\x9f\x35\xe\x33\xdc\xf7W\xce\x8a\xe3\xf\xc8~/" -"R\x19\x83\xeeHJ\xae\x9b\x17\x80\xe3\x3\xc2\x81v\xc\xb7\x1\x1a\xe1\x45\x42\x97t4\xe7" -"\xd4\xeb\xf8G\xe8\x9b\x9d\x7f\xe4\x80\xa4NV\x3q\xec\xd8\"\x80\xf5\xabG0\xe0g\xef" -"\x1d\xd2\x45\x8eg\xe5\xd5\xa6\x88\xcbY7nF\xdb\xea\x7fm\x1\xa4\xf7\x9a\x1b\xbd\x8f" -"t\x16\x64y\xce\x63\xd7\x9e\xa0!\xae?\x97\x87\x34\xd3+J\xf0\x80<\x19=XK@\x12z5\x17" -"\xff\x31\xa1\x8a\x13\xbe\x94\xb6\x39\xb6\x0\xb0\x15\x97]\xbf%\xfa\x63\x37\x7w\xe1" -"\xd4\xaa\xef\x38\x1d\xa4}/\xe4S\xb2=\xfb\xec\xc\x42z'FQ\x97,\xd3-j\xech\x8f\x2#4" -"\xb0\xcc\x1b\x1e \xfeZ\xce/\xf5\xb8\x42\x8a\x80\x32\x30tT[\xbb\x66\xe9\xa0j\xa0z" -"c_\xc7\x7f\x98\xc1\xb3\xa3o\xdf\xb6\xeb\xb5\x98\xc1\"\xd8\x17\xe\xa4\x66JS\x13Il" -"pZ\xd1\xff\x7f\x8c\xee\x9eL\xd2\x42\xac\x1dn_\xea\xf0Ve`_\xa6\xf4\xf6i\x19\xc7\xf1" -"{\xc4\xce\xdbslF\xe8\xe8\x14\xb1)\xc3X\x4\xe\xa8\xb2\xbc\xd8|S}zr\xea\\\xcd\x32/" -"q36\n\xee\x10\x8c\xb7\x88\xae\xf1\x90w\xcb\xfe\xde\x4$\xd7I\n\x9b\x9c\x9Z\xa5 \x8b" -".\xb1{\xe0\xb)2\xd1[\xe5{\xf\xc0\x33+\x9c\x7\x18\xfd\xde\xe1\xec\x98\xfdY-\x9f\xf4" -"R\x6\xa8\xc5\xfe\x38\x93\xd9!\xe3\x65x`a\xab>?>\xec\xabX\xee\xa5\xda\xff\x2u\x8f" -"\xb7\xac\xbd\x8f\xbe\xdb^~\xd2Z\x19\xcd.\x80\x30\xb8\xb6\x6p\xf9\x19\xb0\xef\r\xf" -"w\xd4&\xfc\"\x89\x44\x46Z\x8c\xc1G\xe5\xfeh@\x7\xc5\x96\x1f#P\xab\x38\xe0\x31\xb3" -"w\x88\xad\xd0u\xc9\x9aM\x85\x17\x39K_\x0}\x93\xbf}On&\xd0\xca\x16\x81\x8e\x1b\xd0" -"\x15\xc9Q\xce\xea\x44J\xf8\x36\xf3\xe5NZq}\x15\x42\x62\xe2\xe9L\x13\xac$fp\xc6\xe6" -"\xa2\xcc\xf5WJ\xbbu*p\xf5L6\xdc\x93\x8a\x1c\xd1\x93\xad\x89\x8b\xdb\xbf\xfb\x6\x86" -"\x7z\rv\xb9n\xe0*\xa4^\xd3\xe3\xf1\xd7\xd8re\x15\xd5\xdc\xc2\x96\xed\x1e\xaa\x36" -"\xb4\x36\xb9@M\xf2\xee\x1e\xdf\xcb\x7\x62\xe3\xc9\xc3\xb3\xa9q;H_'nj\xdc(?\xb3\x1a" -"\x8f\xc\x8e\x30\xb1,\x9f\xb0\x1b\xc2\x84\x8f+\x87\xe7j\x93J\xd5X?\xcc\xb0\xbe w\xbf" -"h\x5\xe7\xbf\xa2\xb3\"\x63u\xc2\xc1\xc5~X\xf8<\x85\xcc\x39@h\xa7y\x86\x12\xdcG\xfc" -"B\xf\x10\xa6\x13\x1f\xb\xb5)\xc8\xc7\xf1\xcerZ\x9c-c\x10\x81\x16\xb3\xf4\x86\x6k" -"\xf4\x41\xbe\x65X\r\xfsW\xb3\x92\x3\x41J\xd2\xe1\xed\xc5\xde?\x8b\xc8\x9e\x35\xd4" -"\xb\xbf\x43\x43\xdd\x7fyOq\xc2;\xb1\xf5\x44\xdc=\xf7\x1b'\x1e\xa1\xa0I6H\x1c\x6\xdb" -"\xa5\x8e\xc\x14\xa3\xb4\xc7\x65\x31\x1eo\x9aR]\xdap\xfc\xd3jP\xe\x95\x92\xa2\xd0" -"\x9arOX\xb1\xbd\xcb\x9fk\xee\"\x2\xc5\xc3K\xd4\xda\xb4\xfd\xa3q\xb2\x63\xc6\x38\xb" -"\xaa\x85\x88p%\xb1\xb3\xf8.\xe0,\xb9\xdf\n\x35\x8f\x46\x91\x31\xccj|}\x10\x90\x18" -"I\x98\\\xc0R4\xcd\x31=\xa5p\x93\xc2\xb0S9\xeaJ3\xef\xcb\xae|o\xean\x83\xb6u\xe6(" -"\xaa\xe9\xee\x4\xd9:\xa0P\x2\xdb\xdf\xac>\xc4\x39\x13GA\xd3\xb5\x83.\xc5\x9b.\xd5" -"L\xdc\x1\n\xb3\xf2\xf7u\xcf\xfa\x46\xa7\xf1\xad\x14\x8b\x85\x12,\xed\x80\xc7\x1b" -"\xda\x36\x9\xd6\x46\xdeO\xcf\xa6\xee\xa5\x99\x9a-rS\xa2\xa2\x93[\x81\x90\xea\x39" -"\xfd\x8b\x8b#3{;\xa3\xd2\xb7\xb2\x8c\x97K\xdc\xba\xe3\xce#t!C\xbftNm;\xfa\xck\r\xe3" -"\xa3)\xaeI\x97,\xdc*ZT\xcf\xed\xd4\xc3v\":\xe6\xfb\x11Vm4k\xe7\x1cM\x94.G\xcc\x5" -"\x87\xbb\x1d\xfd\xf5\xd4\xdb\xd2\xc0\xdb\x44\xb1@J\xa3\x65-,I\xcb\x0w\x9d\xfc\xb3" -"\xb9r:l\xd4`H\xb1\xc5\xd6\xfd\x1c\x62\x64\xd9\xc1\xce\x8eU\xb7\xf5\x31L*\xd4vMi\r" -"log\xc8\xc\x87\xe3\xba\x18\x31\x87nF\x2\xc2\xec\xcd\xfa?\xc1\xf5\xe3\x86\x30\x31" -"l\xf4\xb1\xa7\x8c\x8c\x19\x1*|B\xf9Us`tu\x8aP\x94\x9f\x7f\xe5o\xf2\xcu\x0\x7f\x0" -"\xef\x89\x16y\x8$kcjI\x9d\x10g\xbeV\r\xd5\x38\x98,\xb\x43-\xce%\x15\r\x9c\xf5\x1b" -">+7nB\x8b\xec\x13U\xd4-4\x18\xfd\xd8\xcd\xcf\x15\x32\x13\xfb\xa7|\x2\x11\xae\xaf" -";\xb5\xbf\x9d\x8a\xec\xaa+\xe9\xfc\"\xbfY\xab\x4\xb9\xb8rup\x3:1\xc7\x96\xf8\x18" -"%\x91\xa9r\xeb\xf0\x1b\xfX\xb2|\xda$\xdcM>\xbe\x96\x14\xb5\x39o?\xabg`\xb7\xa4z\xbb" -"(\xc6\x39\xdcvu\xe2\x7f\x89\x84\xbb\x7\xad\x37\xb\xe6\x31\xee\xe6\xc6\xbf\xf9\x3" -"\xf2vF\xa5\xb1+,\x9f\x8f\xc2\x44n\xd6\xd2\x9a\xfb\xe3MR\xa0\xb5\xaa\xc\xd2\\\x15" -"\xe6T\x16\x3\x1b\xb9\x1f,\xf9\xa8\x42\xdc\xb6\xdcwVB=\xfd\x18}bN\xe3\xfc\xb3\xec" -"\xa3\xbd\x9e\x64\xcc\xd5):N\xd6*\xb2^\xf0\xd3\xf4\x65=\x94\xddJ\x12\x91>\xcfX\x19" -"\xb1\x99-\"\x81\xc\xf6H\x94\x9d&\xbfKu.\x1d\x8fp\xab\x42@\xcd\xc4\xa3\x7\x90\xa9" -"\x8f\xa8\xa7\xb8\xe\x8e\xba\xbe\x34?\xda\xeb\xa4\x1a\x10\xd0UL%\x1\x82\xd0K\xea\xcd" -"\xcc\xdc\xfbow\x9b\x88\x92o\xedq\x16\xee\xbc\x9f\x9e\xei\x10\xd3\xb3\xa4\x80xZ!\x17" -"1K\xf0k\xd2\"V\xba\xaa\xb6j,\xe4\xbb\nMX[-R\xf8\xac\x37\x44]x\xfb\xa1\x86\xf\xe5" -"\x94\xbb\xda\x12\x7\xc7,\xf7\xa3}\x14\xa5\xea\x9b\x95\x3'\x97q\xaf\x9ct\xbdsu\xe5" -"Qr\xad\xf6\xd8\xab\xccR_\x1b\xb1\x99\xf8%Ya\xd0u\x2\xc\n\xc6\xab\xf4\xbe\n\xe6^!" -"#\xfa\xf1\xc9\xbe\xb3\x38\x32\xe0\x8d\xf2\x8b\xe%\xe9\xdcm\xc8\xb8ie\x99\x8c%\x9c" -">\x1d\xd0Y\x96\xc0\x30\xbd 6\x80X\x8d\xddh\r\xe3\xfc}\xcdk\xdd\x32\x9e\xc6yY~D\x8" -"\xd2H\xd6\x10w\x8b\xc2\x86\x8e\x9a\xa3\xff\xb1\xb4\xb\x8d\x38\x91\xcd\x3\xe7&\xb1" -"\xea\x1d~nY\x15}\xf0\xbd\xd8Zg\xb3\\\\\xe6q\xacY]\x95\xfbZ\x99\x6\xd7>$\xe5\xe0L" -"n\xd0\x89tqcX\\z\x89Yj7\xef\xaa\xcaj~\xef\xc7\x94\xfc\x65\x80\xb\xe7\x9f^\x8$\xaf" -"\xb0\xc4\x30\x30\xb3\xbd\xb3\x42\xa9\xb4\xf0Tcf\xd9?+6\x99\x8d\xed\xb8Z\x8c\xe1\x86" -"\xa7\x8b\xb3/\xb4\x84\xca\xbe\x86t\xda\xfa\x5\xda\xbd\xa1\x80\xfb\xc3\x8e\xaa\x84" -"\xd4\xe3{M\x17\xe7qz)#:)n\x95\xef&\xb0K\xcd\xe0\xc0\x19o\x96\xbd\xde\xaeo\xeb\xc6" -"\xe\x9e\xf0o\xa1/\xaa\x16\xda\xe0\x17\x8d\x4R|Yl5\xab\x31\x12\\\xf1{#\xae\xb6\x8f" -"\x84\r\xa1\x46R\x5\xe4\x82\xfa\xa1s\x88\xf6=\x18\xc8\xf6V\xba\x94\xa1\xa8\xe8\xc7" -"K\xa8\xb0\xbb\xc8\xba\x45M;B\xe8[\xbc\xbf\x8d\"\xfb\x0\x8b\xe8n\x9d\xd2,\x95\xd1" -"<\xf0\xa4q\xc2\x7\xb2%\xa4\"\x62\x65\xd6\x8c\x8a\xaa\x17\x46\xe4\xee\xea\x66\x7f" -"_j\xeah\xfd\xcc\x91\xde\x8a\xbd\x88\x33\x86\xd2\xa1\xa8\xde{yS]\xb2\xaf\xf8<\x13" -"\xaf@\xe4o\xae\x1f\x92)\xe9\xa0{PK:\xd1\xa3\xcf\xd9$\xc0\xb7\xb0\xf8\xcY\xd9\xcf" -"\xcd\x0\x19\xb1\xb\xf8\x0\x4\x1\x15[\xb6!E\xd5\x61\x18\xb3\xde(\xfaZ\x98\n\x9cZ\xa1" -"\xdf\xdb|\x99!\xd7!E\xfd\x64\xfa\x62<\xf7\xf8!\"\x9e/VB\xa6n\xf5!\xf3\xd7>\x11\x17" -"a\xee\xe0\x46\x38\xeb\xd9\x33\xf3\xb1\xaf\xcf\x9a\x14\xcd\xf8\xe3\x9a\x95l\x1b\xad" -"S<\xc9\xbd\xb0\xc1]\xfe\xaa\xe1@2\x83\x90y\xabU*\xd6GhX&\xac\x14Q\x95Wl\x18O\xcd" -"\xae\x44\xfcRMt\xd3K[C\xbb\x98\x85\xb8\xe3\xf0\xed\x13\np\x87`\xe9&P\xf8hh!@Dy\xa8" -"\x8a\xb1l\xc0\xfa.\xd5\xbb,\xd3\xbc\xc0\xb3\xbb\xc3vD\xec\x84k_\xa0\x8dS:K:s\r\xd4" -"\xb6\xe9\x41qRk)\xb7\xf8\x9d\x5\x1\xac\xcdo\xf7\n E\x18w\xfd\\\xf\n\xd6\x91Q\xbe" -"\r\x12u\x2\xdb\x63\x84\x1b)\xe9l\xb3\xcd\xf0\xb\xa2\xe4\xd4\x1d|vW~\xe1\xea~\x99\x1c\x88\xa1\x91\xca\x1a\x98z,\xed;\xe8\xc7\xb" -"\xc5\xf9\xb2\x63\xb7Vr\x1e\x1e>*\x85\xc\x46\x82\xa1j{F\x10x\n+\xde\xd9\xda'<\xb7" -"D<\xb5\x9amz\x1Y\xc2T\x1,Kb1\xff\xf2\x38\xceN\x11\xef\xf9!A6n\x8c%\xcf\xa8\xc8\xaf" -"\xc\x80\xa8\x9\xad\xb5\x62\x33\xed ]\xe8\xb0\xc#:\x1d\x66l\x8 BD\xc0\xf0\xd2%\xe3" -"\x8c\x85\x34O\x92G\xe1\xacY\xd4\x65\xb7\x41\x9\xba\x18\xfd\x4I\x12\x31Z:\xb5\x8c" -"\x80|\"\xa3\xe2\xf0}\xddLx\xc5\x1fNh\xf1\xa8Z\x1a\xb4}\x18\n\xe3s\x94\x31n\xe5\x13" -"\xe3/\x8b:\x94\x16\xbf\x96H\xd5Ug\x91\xe5\xd4\xfd\xe3\xd1\xf9\xf1\xe4\xa0\x13\\\x64" -"\x9d\xe3\xe7\x30\x89\x33\xdb\xba\xb8@\xf5\xe7\xac\xa8/\x96&\x19h\x8d\x9d\x92\xfc" -"\x10\xf0\x1a\xb5\xe4\x61h\x9b\x16=\xe8S\x8i\xa7\x33\xed\xed\x11<\x1bK\xd5\x6\x63" -"\xf3N/\x12\xed\x35y|\xc6\x45\x7f\x90\x45o\xd5\xd2Of\xcb\xc0\xd7:\\\x1\xa2\x18\x92" -"Q\x8f\xff\x9\xa3\x1c]\ni(:g\x1f\xd0\xed\n\xa9\xbd\x8f[\x90\x0\xe0\xde]F\xe7Q\x3R" -"\xc4Zf;A\x8d__\xf9\xef\x32\x8\x84\x17\xe0\\\x66\x86(m\xd1\x41\x31n\xbe\xf4\x8b\xbb" -"\xb1\x1a\x7f\xd9{\xfe\xaa\xe4(&>\xc2\xc8R\xf2H\x93\\\x17Ii\xb0\x43g\x13v\xa3\xe9" -"\xfe\xf9\xd4w\xccxS=ln\xedRIEN]p\xce;(\x84\xdd\xd4\xf\x9epy\xac\x84\nY\xba\xd2w\n" -"\x4\xa7\x46%\xe3\xfc_`\x9e\x90?\xeb\xa6\x16UM\xa4$;\xb3\x89\x35\x1bU\x92:q2\xb0\x46" -"_\xe4\xbd\xf2\x93G\xb0\x91\xe3\xddy\xeI\xf9\xab\"\xef\xc4\x17\x45\x82\x99Hy\xf2\xd6" -"\xcb\\\xf\xcb|\x7]J\xd3\\\xa1\\P\xcd\x5\xb5\x12P(\xfb\x1\xb1\n\x94nG\x90~\xe7\xdf" -"\xee\x98\x16\xa4\xba\xac\xf5\x8cl&u\x86Y)'\xbb\x42\xf7\x98!\\\x7\xcb\xb8pY\x0\xd0" -"\nl\xb7q\xe0\xb5\x3\x94\x30\x7fZ\xfc\xeik\xae|\xeb'X%\xcfK\xd2r\xcd\xc8>L\x92\xc1" -"\xa7K\xa4\xe4\x9f\x36\xb6\x65\xf2%X\xe5\xb\xf2P\x8dG\xd0\n=\xb1v\xd0t\xa9z\xc3\x84" -"\xbf\x91/\x15\xa1\x1dy\xa1\xd8\x34v_K\xa6x\xc0\n\xcd\x9b\xa9\xf2\xfe\xd3\xba\n\x82" -"Jv\xb9\x15\x94\xfcWQvg\xa2\x8a\xb6\xec\xb3p\xa9\xc9\x9ey\xa6\xc1\xe2j\xc0Q/\xa4U" -"\x11\xa1\x88\xde\xa7\x62\xac\xdb;L\x1d\x0#\x85\x45\xcd\x8f\x66\x84TD\xb9\x38\x9b" -"3\x86\xcd\x1aJ\x99(\xc1\x99\xbc\x90\x38\x95\xb4\xfzGp\x11{\xa8\x89\x94\xd3\xb0\xbd" -"\xa8)\x18\xacLezEbk\xcf\xb3\xc2-\xa3\x85]7t\xf7PQ\xb3\xd7\x43\xaf\xef\xd9\xd7Y\x14" -"\xc\x95\x9\xd7\xca\xb6\x84\x97\xa0\x9f*\xc7\x85o\xfa\xb\xef\xd1>t\xbc\xc5\xe3\xdd" -"\x8e\xd7\xf0\xb5\xf3\x1a\xd4Ph(K\xe0\x89\x8f\x44\x65\xdc\x13\xbf\x17\xe4\xadi\xe2" -"\xb8\xe4\x90\xec&p\xe1\x84\xab\x81\xb1\xe9\x66\x63\xce\xdf\x95\x33%|\xbe\xcb)\xeb" -"\xf2p\x89\xf6G\x8f\x17\xd1*\xb9>R\x1f\x8a\x31\xc3\xf6\x31\xd1\x8d\xd3Pj\x0\x1\x9e" -"\x86\x61\x12\xa6#\x9f\xe5\xbb\xda\xf1^\x88\xc1\xfe\xc8w\xa8\xbd\x8d\x1d\x2\x3\x8f" -"(\x15\x9a{\x18\xfc\x4\xd9\x15\x5;\x84\xa9\xd1\xa8V\x8c\x44\xac\x1b%\xac\xe3\xdb\xe9" -"\x13\x41\xb\xc3@\xf1\x32\x0\xe0X\x92\xbd#\xef\xd7\x88\x8b\xa0\xf8\xa1\x9fq\xb0%\xcb" -"\xa0_\x1cR\xd8Nz\xf9<\xffz\xee\xe6i,\x8\xae\xc4J:\xe4\x46\xe2pH\xb4\xdf\xf1g\xa4" -"\xd1'\x4\x93\xa2\x8c\x84\xe7/\x8c\x91[\xd9\\\xb6}^\x7\xac\x85^\xf0gP\"PqvN\x1f\x85" -"\xa4jb\xb0w\x8f\xa0\xd1n\xdf;\xb7\x14\xc5\xa0\xe2Y\xae\xc7\x1cm\x9b\xf8\x8\x35k\xce" -"r\x19\xac\xe6\xbc\x87Pe\x89\x3\xd5\x8b\xa7}x|A0\xe1.\xfe\xddN\xad\xc9\xdc\xf6\x7" -"X\xcaOm\x18\x4\xd3n>\x8d\xcc\xe4QR%5\xbe\n\x13\x62\x31\xb2\x8b`\xcar\x85\xd9W<\xf1" -"%\x99\x1a\x7\xe1\xb9\xb7G\xb0\xc2\x7f\x81m\xfd\xd3\x91\xc4\x46\x10\xb5\x8eW[A^r." -"K)\x83\xd0[\x19R\xe8x\xa4\xac\x16\x66\xc9\xed\x61=\xe4o\xcf\x14\x8b\x14\xde\xc3\x80" -"\xb1\x1f\x80\x61\xf3\xde\x38\xb9 \x15\x87\x8aPL\xda\x12\x38g\x9d\xb3\x19\x11\xfe" -"\x82\xa0\xb8\xd4\x8b\x8c\x1brX\xaf\xdd\x18&\x19\x66\xae\x42\xb9\x30y\xe9\xfb\xa6" -"\x83\xa9W\x18\x8f\x9j\x9e!\x9b\x7f\xed\xe7\xbf\xd5_L\xe5\xae\xe9G\xe8\xfe\xe2" -"\x13\xf0\x34\xad\xb2\x19[\x84\xcd\xfa\x8\x90\x63\xea\xef^H\x95\x83\xc4.\x94u\xcc" -"]\xfa\xed;\x90\xaa\xc4\xf8\x9\xcf\x9f\xe5*h\xa5/W\xc3)\xb7\xd5\xb1\x91\xbbMu\x3\x88" -"9\x80\x11\xea\xf8\x11\x16\xcf\x82\x10*\xf3 \xc9*\x8f\x45#\xf8\x8\xd2\x8\xce\xfe\x1c" -"\xd7\xc4\xc1\xe3j\xf0\x30(\xdc{\xcf\x61)\xe8.\xbe\x32\x8c\x62\xe8\xb8Qw[\xb4\xdb" -"\xb9\x93\x14\xbcK\xcKJ\x6h\xd6\xe8\x91\xf4\xb5\xca\xfe\xe3\xcc\xa7\x9\xb5\xe\xfb" -"\xdc\x63\xa6\xe4\xf0\xb6\x45\xc2\x41)V~J\xa9v\xfe\xdf(Z\xbe\xc1\xb2\x1a\x94\xe1\xab" -"\xe1@\xf5O\x16\x5\xa0\\=C*1o\xe9/t.\x99\r\x16\x39\x62\x88\xa8\x12\xa9\x95\x11\x14" -"\xd8\xcbh\x8e\xe9K|Iw\xe3\x98\xe2O\r\xa3gF\x10\xdek\x83J\xdf;\xa0\xd3$\xa3\x95\x85" -"\x7f\x1fka2Q\xdar\xe5W\xe0\xb5\x1Vk@\xa6\xba/\xc3>2}\xe7\xeen\xc6\x30\x63p\xfe\x89" -"\xd1\x6\x8bn!\xd3\xfd\x16\xc6\x43\xe7^\x8d\xae\xf9\xe2\x1dLM\x1a\xd5\xeb\xc2\xbY" -"\xa4\xec\x8dHq\xaa\xf6\x1a\xfb\xe6\x12I\xb9\xa7\xc9\x8c\xb1\x17\x13\xf7W\xbd|\xc4" -"\x95\xe9\x90\xc8\xf4\xc0/\x16vC\"o\xc7\xbcQ\x9bj\xd1<\x10\x8d\xf\xcf`\x11Rb\x11(" -"qI\x17\x9c\xb3\xa3\x65\xbe\xab\xd9V\x98\x8bt'\xa6\xc9\x9e\x31\x38\xcf\xca\x94\xb" -"\xd9\xa1\x0\xcc\x42)\xa4\xe3\x93\x94\xf1\x31p\xe0 \xf0 \x1d>\x12\xfd\x87\x33\xdb" -" \xd6\x42\x93\x97\x16/\xa8\xc\xf6Q\x8d\xf7\x32\x93\xfc\xf7\x13\xc0q\x8fL\xee\x89" -"\x8e\x44X\xd2\xf\xca\xbd}\xf1\xd5\x15\x16\r\xea\x8e\xe6W\xba#\xb9\xcf\xa0Kw\xe9s" -"^\xa8\xa2\x86\x30\xf4\xb5\x9cl\xc\x88\x4T\xd8\x31\x63'm\x15\xa4LT\x95N\r\xb0\x1a" -"\xb9H\xe5\xd4=\xc3\xd9\xc3Q\x88\xb5\x98_\x90\xd3\x83n\x98\x39\x1c\xb1X\xe0w\xdf\xa9" -"j\xc6\x32|\xff\x10\x9\x8b\xb\xd0%\x1c?\x8dkR\xa3\r\xf2\x5~\xe7\xe7\xefGm\xf0\x8d" -"\xa9Omr\x5\xdb\x46\x1cY\xa5\x37\x46)]\x97$S\xd3RY\xaeX\xe9\xc8J\xba\\\xe7\x8e\xdc" -"\x9d\xc3\xa3\xbb\xbf\x9a\x84v\xfe\xd3\xdc\x7f\xb0\xca\xee\xa4\x1eO\x91\x33\xdf\xf" -"o\xdf\xca\x3\xfc\n\x9)\xb8\xc9\xaa\xe4q0n\x8f]jJ\xcf\xfa\xf9\xca\xd0T\xba\x13\x1f" -"\x95H\r\x9c\x39\xacX}w*B\xa5\xebh\x4\xe1\x94\x90\x34\xbb'\x97\xd2m\xaf\xd1xi\xbf" -"\xcbn\xf7\xeb\xc8\x65\x34\xcf\xc4r\x85\n\x38~c\n\xdf\x1f\x44\xef\x30\x30\x41J\x4" -"=\x1aG\xb\x42\x43\xdf\x8fO!g\xad\x1d\x41\xfc\x46O\xf6\xa2\xdd\xe9\x46\xa4\\@\xb2" -"-\xfb\xd0\xd6\x95\xe4\xa4\xe2<3\xdf\x35\xa6\x31\x31\xd5,\xeaI\xc3\x8bl*\xf7\xff\x86" -"a\x18\x8f\xad\x7\xc1\xb9\xb6\n\x8a\xbd\x8cXeJl\x7f\x15i\x9WD\xb6\xb5\xea\xad\xeb" -"\xb9\xbb\x84\xf3\xea\x89i\x16\x99\x13-U\xb\x3_)\r\x98\xd0\x91-s;IS\xb8L\x8c\xc\xe3" -"j\x84\xa3\x19\xd7>\xd6\x9a\xdaG\x10\xe2\xa1\xe\n\xd5\x92\x17\xc7\x16\x8e\xd9\xdb" -"\xb9\x9eR\xdb\xaf\x90NZ\xb2\x80\x12+}\x92\x94\x97\n\xd8\xf0\xc5\x2T\xb\x15\xdb:|" -"\x92\xbe\x0L\xd2\xac\x7f\xb6q\xa7`\x2\xca\xd4r\xe7^\xe1\x88\xcf\xbdjR\x96\xb2\xb5" -"\xba\xfe\xa2K\xe2=\xf3,76\x99\xf3\x96@\xce\xdd\x84o\r<\x17\x9c\xb0.\x1c\xdb\xee\x87" -"\xfc\n\x64\x84\x5\x10\xd3S?{s\xc9\\l\xd2\\\xf4mS\xdc\x8fu\x16n*\x8eT\xbb\xd8*\xf5" -"2\xc5\x19\xc3\xe5=\xd5\xc6TN\x97\x37\x30\x1!\xfe\xc\x63\xd4\x37<\xc9\x44\xfd\xba" -"\x94\x37\x36\xa1\x4\xc6W\xc0\xbf\xe8L\x6\x98RA\xe1\x1c\xbe\xac\xacp\xc1\x37\x8a\xb3" -"\xb\xa5\xd3\xa5\xc9?\x4\xb0\x62oZ\xe\x5^\xfc\x1e\xd8r\x9\x0\xe6\xd4\xa4\x91L}\x6" -"0\xe9\xed\xek\xf9\x8ar\xeb\x93\x81\xa3\xd9>r\x0t/\xb6[\xae(\x85\"\x12r\xbe\xec\xbe" -"{$w_D\xbd\xc9\xa3p\x8e\x84\xbbi\x17\x32\xaf\x1f\x39\xf7$=`\xc\xf7\xee\x9b%\xc5\xa2" -"\xa5+\xf\x1a\xbe\xej\x98\x45\x90\xc7\xe4\x30\xcc\xfc\x85$\xfa\x7f\x1e \xc9.\xe1\r" -"wc\xd0\x96\xb5\xb7\x92\xd4\x8l\x8d\xd2\xba\xfe\xa1Z\xd1\x9a\xb7T\xc0\x8a/\x81\x19" -"\xcd\x7\x33\xc3=G\xea\x1d\x84yO\xc4z/\x83\x43\x9a\xc4\xa6^\xaeu%\xde\x87\x45\xb2" -"\x97\x1b\xee\x81\x16\x86\x7>U\xb1\x87\x8\x94^\x4\x45\xd6\x95\xde\xda\xabV\xf5\xaa" -"\x1f\xa2\x9b\x46W_\x99[\xf6\x4\xfc\x45\xae]\xc0\x43\x11\x95,\xcc\xde<\x99\xe2\xfa" -"hpO\xc4s\x8\xad\xd2\xfc?\x83\xcb\x63\xb2\xb8s\xc2\x13\xeb.\xf#T\x8d\xe5+9\x8\xcd" -"1G2\x13\xc9\xeb\x64U\xe\xe1\x90\x8a\xb3\xc2\xf1\x34\x1M\xf3<4Sl\x17\xd8\x12\x90j" -"\xf4\x9cuP\x90NY\x90.\xdbQS\xd3\xe8nd\x9e\x37)@\xe9\"=2\x95\xcc\xde\x8\x7\xc9YV[" -"T&\xca\x1b\xa9Y\xdd:d\xb6\x35z\x7\x89\xdeTs\xba\x11u\xd6zS\xd9\xdb\x96\x8d\x96\x82" -"\xfe\xbdL*\x1\xcf(\xe6\xbd~Z\x14\x11\xf4\x88\xf9\xbcW\x1d\xe0!\x0=\x98\x8d\xe8\x31" -"\xa3\xd6\xf1\xe5\x1f\xae\xcc\x90\x2\x9bR{\xef\xd5\x9d\xa8\x43\xe5\x8b\xa9\xf4\xd0" -"\xacG\xd7\x9e\x91\xc5l\xc4\x8cZ\xd0\x7Y\x11\xdf,\x7ft\xc3\x82o\xa7\xdc\xabof\xf4" -"\x92:\x19\xe4\x38\x9d\xc4\xe8\xf0\xa2\x0H$H*JL\xb9o\xa4\x31\xd2Q\xa5\x1f\x3RX\xb9" -"\r\x8c\xe3\x65\x19\x14\xb3\xc9\xd9U\xb7\x7f\x36\xb2\xce\x3\xf8\xcb\xdd\x7\x93\xf1" -"\xf2\xebq\x16\xf2@5\xf3\x33\xf3\xd1\xa6\x9z\x1a\xebq\x5\x46\xa0\x9c\x9b\xab\xee(" -"\x81\xeb\x44\xa0\x9c\xd2\xd1\x92Q\xca\x80\x44\xb7\x8c\xf3\x1cm\x8a\xce\x83\xc5X\x0" -"\xbf\\;\x10\x41\xa6T\xbev\xae' \xb2)\x0\x31^\n\xd2\xe9\x33\xbe\x99\x45\xe4~l\xa6" -"\xb7Gz\x94\xcc\x95\x82'N\\\x89J\xec\xd1\xb5\x44\x85kh\xc7,WNP`\x2Q\x95\x45\x32\xbd" -"\x9e\xc0\n\xae\x14k\xb1\x4\x8d\xfc\n\x6\xff\xe8\xa2\xf2\xc0\xa2\x80ziT\xb4U\xbe\x7" -"\x8c(\x9bZ\xf2\x1c\xdf-\xee\x3h\xb6\xb8\x85\x90\xed\xf8\x13W\xc3\xccN\xe3\x16R<\x1c" -"\xfn\xdc\xe3\x39:Z\xca\xda\xfcV\xdc\x65\x65\xefUK\x8c\xcb\xde\xf6\x95\x43\x85\x16" -"[\x86G\xaf\x8c|\xf2g\x84]\xd4.*\x8d\xf4\x93\xf5oSE\x0\xc7\xd8!I\xca!\xc6\xa2\x94" -"N\xc9\x1c\x17\x30\xc6=C)\xe5\xf\xbe\x42P\x81\x16\xde\xb0!u:\xbb\x64\xabu,E\xe0\n" -"\xd6\x97\xd9\x9c\r\xdf\xf0\x9e\xaf\xaa\x8d\xb9\x18\x9fZ\xe7\xfdL\xfcX\xf9\x9\x8d" -"\xfg\xec\xc4\x89qJ}v\x84\xe8[\x2\xc0\xa5\xb8\xd5\x98\xef\x32\xa7\x91\x37\xe1\x1a" -"\x12\xc8\xc1L\xfc\xc0\xbd\xa0\xef\xfa/,#\x98\xb0\xcd\xd5\xea\xfc\x9\x66\xb1\xccl" -"\xb0\xaaQ\xf2%\xfd%\xc4\x99I\xfe\x9fx\xb1\x89\xfei\x8eO\xd3\x7fu[\x1e\x9a\xd1-\x80" -"~\x16\xcb\xfdg\x1e\x37IM\xdc@v0\xdbw\xf0qV\x2;[G\xf0\xa4y\x9b\x96I\x2\x8cV\x2\x16" -"u\nj|\x89\xc7\xc3\xcc\n/\xad \x11\x13\xac\xb1\x8e\xb0\xba\x31\xbc\xe9\xb0\x63\x1a" -"\xbc\x96\xa5\x84\xf4\xd4\xf7\x8c\rp\x82\xf7\x43\xe8\x99\xb1\xc0\x12\xec\xec\x31\xe4" -"\x99\x96>\xbb\xbd\xfb\x97\xd9,\x99\xe5\x63\xc8\xe9]\x8d\x37\x2\xe4\xed\x81i\x89\x19" -"\x1e\xcc\x46\xd1U\xc2\x85\xbd\xbd\xfc{(<)\xb0\xe5\xc8\x0\x34]\xd4\xb\xcc\xc0z\xbd" -"\xff\x17>\x15\x96\x17\x7\x34\xa3\xd9\x1d\x89%\x9\xe0\x8a\x94\x8f\xc1'\xe2\xc5\xde" -"RWx\xb2\xfd\xf\xc0\x84\x16&\xf8\x1e%\xc0\xdets\xfa\x62t'\xef\xej \xe3\x91$\x8c\xd9" -"\xcf\x31\x0 \x9b\xb1s\xd5m\xaf\x8c\x45*8\x8f\x30\xd8\xd9\x61Rv\xe4v \xac\xc1\x94" -"1g@J\xae\xb2\xfeil6H\x9e!\x87\x81\x87\xdf\x1\xb4Z\x88\x8f\x34\x4^a\x11JIF\xe2\x9c" -"\x16\xa2\x3mw\x89\xb8\xe4l$7uO\xb1\x2|\xbd\x10Z\x8a\\\xb1\xb6\xef\xe2\xb6`\xdc\xc9" -"{C\xc7+\x8\xc6\x33\xf9h\xbbT\x99n\xe8\x45+\x8a\xd9;.s\xa8\xed\x46\xe1\xe1s\xe6\xf7" -"\xc4Q\xbb\xcc\xddV\xe8<\xa7\xae\xe8\x34\xd0\xfa\x12\xa4Y\xd4r\xc1ZS\xa1]\xd7S\xf9" -"<%s\x1e\x9d\x65\x38 \xfb>\xea\x99Wz\xaa\x86v\x1c\xb9\xbc\xb4\xb0@\n\xa7\xf8\xff\x43" -"9\xc4\xf0\xbe\x38\x80^/\x1a\x46\x85\x31\x9a\xad\x1a\x88%\x32\xb7\xdf\x96$\x83\xd6" -"\xec\x9aG\xb8\xae\x11\x8\x45\x13\xf4\x98\x16\xca\xafM\xec\xaapF\x0\x31\xe7\xff\x9f" -"\xbb\xc1?\xba<\x12\xb6:\xec\x32\x85\xb7\x46\x7f\xbc\x39\x9c\xe6X \xa7\xbd\x2\x38" -"\xf3\x14\xfd\x15\xb1\xf9\xb0\xd2\x8a^\xf0\x43\xe5\xb2z\xa4\xb3\xe7\x43O\xc4\n\x92" -"<[#\xde\xbe\xe9\x61:\x9\xc4\x8e\xbb\x5\xb8\x10l\x9b_\xce\xffz\xa9\x38q\xfb\x90\x1" -"k\xd7*\xe8\xc5\x9b\xcd_^\x8e\x91/\xaf\x18\x94\x90o\xfc\xbc\xc0\xfe\x34\xa6\x7f+\x9" -"\x5\xc5g@\x85\x81\x5\xd4\x8e\xa5\xf5\xe2\xed\xe2\x9cYj\xcb\x85\xa6\xcZl\x5\x85\x4" -"\x81/\xa9\xf\xb0R\x11\xcbm\xe6\xd9]\x0\x98\xc0\xcb\xcd\x8f\xd3yQ\xde\x11\xa1gP\xdb" -"\x13\x32>\xb4\xb9\x61\xa4\xdb\xf9;\xae\x32\x32G\x1d\x65JN;z\n\x9f\xc8v\x86\xfc\"" -"\xc8\x9b\x6\xf3\xed]\x7f\xae]\x6\x15\xb3\x34\xa7\xfe[\x95\xcb\x3\xc7H\xb2\xf0-\xcb" -"\xdd%<\x94\x42\x43\x11X\x82\x31\x8eKt\xda\\LZ\xc6\x63\xbd\xce\x95\x80?gA\xcfPC+\x1c" -"Ud\x10}\xd0^\xe0\xb6\xb7\xad\x11 \x80\xfc\x65\xc4\x80%=8\xb2\xa5\xcb\x8k\xc8\xfa" -".6.5\x93\xd4\xf0p\xcb\x16\xee\xc\xfd\xe3\xc5\xc\x39\xd5h\x9d,\xf5\xcdVW\x80\x46\x41" -"\xd8R^\xdc\x36\xeb\x9f\xab\x81\x9f\xf5I'\xf\x16\xa7On\xbb\xd8\xa9y\"\xae\xb9\x99" -"\x82\xdf\xf0]2#\"-\x4\xfc\x9a\x9c\x38]\xb2\x46\xf4\x14IS*\x1b\xe9\x4\x1a\x64k\xcd" -"r\xf4\xd3\xa2\xe6\x82\n\x83),}GHA\x10\xcc\x62\xf1N\\\x8\xcd\x42\xaf\x83\xf7\xbc-" -"d\xa0\x95n\xe\xbdp\x15\xbaz\xa3\xbc\xec\xf\xcdX\x85\x30\x8a\xf5\x9\xae\xd4\x2\xf1" -"9lz%\xe4~\xb2Y \xcf\xe8\x8f\x95\xb7\xff\x66\xd6\xd5\n\x9e\xef\xc2\xd6o=\x13\x92\xcc" -"\x12\xcb\xa2\x63x\xf0ZS\xa4\xc4}D\xb8\x0lj\xa3\x19\x31\xbd\x8f\x44,\x13\xa0\xc2\x1e" -"H\xc5\x86\x8a\x1c'Z>\x84\xad_'\xa2\xc9\xff\xe1n\xd8\xea}+7%\xe2\xfc\x31\xb0}\xfb" -"\xe9\xbf\x4\xa0}\xc8\"\x86\x19xPw\xd9\x91\x37\xb4\xf7\xcd\xe5z\xa7I\xc\xc2X\xc2\xb2" -"\xd1\xc4\xc9 \xf3?\xd1U\xa6\xfd\x1b\xc7\x9c&T\x8b\xe6\x9d\x8e/P\xe5/Cv\xf\xd5\"\xfc" -"`Z\xb3V\xa0\xe1\xb8\x8b\xd2\xa6\xda\xd4\xfd\x98\x1eY\x6=\xc7k\xeaV\x15\x92\x66\x4" -"%\xce\x39P\xa1\xa8\xae\"\xa8#\x4\xbc\x1e\xa0T*\x94\x35(w:U\xb4\xdb\xa0\x1a$\xab\x34" -"\xfb\x45\x2\x1d\x97\x99\xbf)ek-p\x89\x82\xc7\xfh\xb5\x94%\x94\xd9\xe7\xd9\xc4\xb8" -"\xfc}\x16\xf3\x1f\xa7\xda\x5 \x9fK2\xc7[.\xf4\xd1\xcbH[\xf8\x33\x39\xb4\xddJ;\x6" -"\xb5\x61x\r\xab\xdb\x95\x90$ M\x1b\x10\xc2\x1a\xf5\xb5<\xcf\x11Wj[\xedIAS\x5\x1e" -"\xc6\xfc\x89k\xe6\x96`\r\xeex\x6\x1f\x66\x1f\xa0\r\x32\x2\xc\xbe\xee\xda\xb1\x8e" -"C-\xc7\x85\xfa\xc8\xb0\x7fG\xd0\xc5\xac\r\x65S\xf5\x62\x8e\xb5`\x90(\x6\xd4\x13+" -"\xban\xc\"\x0\x30`\xea\x45\xd4\x37@&\xd0\x0\x9e#\x1b\xe7\x9e\x94\x82\x99\x7l:\x2" -"\r<\xcf\x8a\x96\xe6\xf5\xb7\x81\x2}uI\xb\x10\xea\x64\x6v\x92\xcc\x17\x42)_\xf0\x1e" -"\x17;\xd3\xd9/\xed\xb3\xa5%n\x81\x34\x1b`\x89\x19\xe4\xfb\x90\x35\x39\x3r\xd5`\x84" -"\x9b\xf0\x13M\xb5}C\xe2\x45\xf9rj\x8d;\xf1n\xdc\x36\xc9\x94Wr\x9c\xc2\x1e\xb0\xd6" -"6\xb3\x93\x89\rQ\xc6\x96\xb6#L\x4\xd4\xa7\x9\xbd\xd8H\x17L&\xde:\x10)\n\xe7\xe3\xe0" -"\xe0\n\xd6\x7f,G\xc0\x97\x46]O\x9f\xb7*\xe2\xcdx\x17\x81\xd8v\xccO\xad\x8fM\xd3$" -"\x87H\x1c\x12X\xb2r\xb9\x45v!h\rg\xa0\xdf\xdep[\x92\xdeL\x90'\xa2\x15\x9c\xf3\x95" -"\xd1Q\x8c\x1f\xb9p\xfaVl>\xac\xcb\xe5\xbe\xbb\xc6~\xea&\xb0\x1c\x8c>v<\xa3@ TN\xb3" -"\xef\xb6\x15\xe1\x84(}\x0[\xf5\x13\xd8?PY\xb4Q\x18IP\xbc\x33r\\\xd3\x83\x92\x1f\x11" -"\x1&:\xf8\xf6\x8a\xe5(\xf0\xb8\xfdX\xb2?\xf4\xe3\x33w\xffL\xd4+{\xb8\x62\xc4\xf2" -"L\xf3[x\xc1\xa0jY\x91\x9+\xe7\n\xfb\xe7\x63\xd9\x88XL\xa8\xe2zE\xf2\x2\xeav\xc5\xbb" -"\xadu\xeb\xa8J\x8ehw\x1\xd2\xff\xa6\xeb\xdb\x8b\x89/\xe0\xb7\xd2\xf6\xbb\"\xa9\xe6" -"=\x1\xdb\x96\xf4\x8a\xfaSl\xdb\x36=2\x94\xc6\xb9\x12\xbc\x83\x93\xaf\xe6\xcd\x9\x33" -"\xc2\xfbi\xc3\xbb\x9b\x2G\xa6\x9c\x9c\xe9,\xcb\xb8j1\x9c\xba\xfe\x87\x1d\x86\xeb" -"\x1b\xef\xf0W\xdf\x17@\xd5\xd7\x89\x43\xb7\x1e\xed\xfb]\x10\xbe\xa9\xc9\xb5\xf5\xb2" -"VB\x8f\x84\x83\xbd\xfbtDo\x1\xe1\x97\x4\xbb\x63\xff\x46\xb8\x9a\xc1\xad\x1e\xa9\xe6" -"\xb8\x16w@\xd9($\xb7\r\x10\xe6+\xf9\x1e_\x19]<[4\xc8\x9e\xbbv\xdd\xc:\xe8\x15\x83" -"\xe6+0\xfa\x89\xbc\x91P]\xdd\xe2\xbaI\x1c\x88\xb2\xcbO\xe1\xff\xe9i\xfa\x63\x9cs" -"\x1c\xdf\x8b\xc4\xf4\x2l\x95\x87v\x83\xdf\xfaL\xa8\x45\xcf>\xc8\x17&$\x82\xbb@'\xbb" -"~[\x90\xc2\xc5\x61SR\x9f\x62\xfcT\xd2\xb5l\x95\x1c\xda\x1d\xae;\xd3\xc9\xb1h\xbc" -"\x93\xcbu\x8\xc9[\xc0\xb9h\x1f\x91\x66\x1d\x8d \x1f\x65W\x1W.\x90\xde\x7\xce \xb2" -"\x7f_\x91\xc6\x62\x16\xe6j\x89\xa3\x9c\rp\x80]\xcd\xa7x\x9d>K\xb2\x92\xe1\x93\x46" -"G7\xd7%K\xc7\xb\x93\xa5\xc9\xb4\xc4\x9b\xfe\xef=\xf5\xfa-3>\xef\"\xd0g\xdf\x63^b" -"d\xd1Q\x13yH\xe4L\xbf\xfc\xe8\xb7\xa2\xf8^\xcf\x80\x8e?O\x8f\x1e\xae<\xc3\xdf\x13" -"\xda>\x92\x91\x19\x10\xe9+_\xf6\x41\x15Q\x80\xbeLw\xf5\xec\xc\xcf\n\xd2\xe7\x39_" -"\xab\xa6\xb8H\xb3\x88=-\x7W?\xbd\x44k_\x97\x18\xea\x9\xd1\x91\x8b\xab\x44\x87\xb8" -"\x19[T6\xc8\x17gcU%\xbau<\xa7\x42:\x97\x83\xff\xeaX^\x99\x32\xfc\xbb\xf6\xef\xaa" -"\xed\xd1\xf9\xf1\xe4\xa0\x13\\\x64\xe8\xce\xc2\x83\x87\x66x\xcdV\x8fu\xa1\x16\xac" -"\x9cuu(bQv\xa3\xa8\xbc\x8b\x63\xb7\xb9\xe8\xcd\x6\xa9\xb6\r\x0\xc5\xc2\x1fj\x1d\xab" -"f\xc7\x80!\x10s{>\x1c\xe8\xab\xa5\xd1@a\xb6\x4\xc1\x8d\x7f\xcfm\xcaq\x8cYBY\xbdt" -"TrP\xc0\xd4{0\xe3)}\xbb\x5\xc5\xf\x41(\xb8?X\xfa\x96\x32\x1el\x1f\xe3MR\x96\xe1\x1b" -"\xfbL\xc5P\xcd\x80\xa1!M\x82\x1c\x4\xbe\x92\xb7\xae\xee>\xf4\xe4\xb7\xe\x62v5a}T" -"\x96\xdc\x32\x81\xfbGG\x18\xe5Is\x3\x19\x9b\xdc\xbc\x33\x18\x42>\xc\"'y_\xf3I#w," -"\x7fS\xe6\xcd\x8\x11\xda},#\x10\x18GT\x1e]j$9\xb2\x31?~\xcf_\x12\xd7\x31\xd0\xde" -"\x9d\xb8\xbd\x45\xb0\x8e\x1a\xb1)\xee\xc0\xd4\xea\xb8\xec\x63-\xeQv\xadg\xea\x81" -"\xc6\x81\xb9 :I\x88\xd2-\xb6\xb6\x5\x9f?\xd8\x87\x8\x89\x66N\x1f\x88\x82\x65\xed" -";1b\x19\xdf\xbe$\xa7\xd4%L\xc2\xf4\x98\x1a\xe4+\xd7\x8cs2`\x19\xc5\x4\xed\xa3\xa4" -"\xd3\xfd\x18\x1ap\xddP\x85\x88<\x11\x63|x\xb8+_\xc7\x8e'\x87\x8bS \x8cU\x93\xa5!" -"\x14\xd8<7\x2`A\xf8\x1\xd9P\xa6\x9b\xf9\xcb\xc9\xb7[\x12\x81>\xad\xd6\x95\xe6\\\x15" -"\x83%K%\xd1t\x3\xfaMY\xf5\x18\xc5r\xf8\xac\x90\xa3\x86\xc9\xb6<\xb6\x62\xf5\r\x9" -",\xdf\x37N\\\x14\xbd\x92\xe5\xf\xf4nO\xef-\x8a\x9e=\xa3g\xe7\xd3\xf3\xba\x17@\rT" -"EF9\x92t\xfb\xc8\x1\xc1\x1e\x85\xe8\xd1\x4P\xac\xb\xeazF\x8f\x1b\xa9\x90\xb4\xd9" -"Y).@\xbb\xc1\x1d%\x30\xe4.e5g\x19\xa8\\v\xef\xccn\xa9\xa3`)A\x1c\xa1\"[\x11\x44\x81" -"\x15\xc1mQ\xc\x4V\xec\xcaY\x8e\xcd\xc3\xed\xed\x5\x15+f\x9d\xe\x7f\xf3\xe8\x3r\xf2" -">\x9\x8cm\x2\xeb\x9eZ\xfb%\x63Y@[\xfc\x81\xcc\x9a\x92uP\xe4\x99L\x9d\xee\x8\x15\xaf" -"\xff\xaf-\n_\xd3\xec\xe4\xf9\x5{\xc6\xfe\x4\x87\x61\xf7M\x81\x5~\xef+O\xbe\xd3\x8f" -"\x8c\xf6\xdfvYu\xd3\xccQ1\x9?u|9\xe\x1e\x32L\x15\x9apG-xNI\xe6\xcc\xb7Z\xf3\xf3\x3" -"\xf9\xca\x91\xe2\xec\xa0\x66JKM\xdd\x83%n\"u?\x1f\xbf+[\x1esw\x93\x90\xc8\xc5\x82" -"\xe1\x11:\xcf\xdb!,\x1a\x9a\xa7S}\xdb\x19|<6\xc6\x42\x65z\\rB\xb6\xd2Yv\xbd\x15\xe1" -"\xac`}\xb1\x86\xbc/\xfbH\xb\x1c\x95\xb1\xf7\x1f\xaf\x19\x3\xc8\x64\xe0\x36\xdd\xb4" -"*h\x1f#\x18\xdc!+\x1b\xe3\xa8\xfdx\x1d\xbai\xda\xf6\x39\xe\xbe)\x9a]W\xd5\x96\xe2" -"Ks|R\x9eH\xd7\xd8\xae\x8f)\xd8\x97\xed\xdd\\\xfd\x97\nu\x2\xef\xe9\xdf\xf7\xa8\xde" -"\xf5H\xd0}\xfc\xad|\xf7\x17\x1f\x14\x46N\xd1\x85\xca\x1c\xa7\xf8\x12\x64}\x82\xf3" -"rg\xf9\x34\xbK\x81\x38G\x10\x99\xbc\x99G\xff\xe8\x83j_\xca\x14]$b\x98\xfaj\x16\xa2" -" \xc4\x95}\xc0\x9e\x1f}\xb8\x3\xa4\x88\xbd\x9e#\xe9\xb0j\x94\x8f\x46\x32z\x1t\xf3" -"\x85\x64\xf5\xaa\xb4v\xc3\x87\x81\xbd\x1$\x0\x31\xdc\xba\xd5\xf3\xea\x38\xb\xd1\xda" -"*W\xd5\x83:(\x4\xf3\x38WA\xd1\x6/\xbe\xc7\xf2\xdc\xb9\x90)\xf6q\xe7= \xc\xdew\x13-\x1a?\x10PP\xd4\xec\xe2\xe" -"1PB\xecg\x3UR\xa3'\xe5\xd2\x13\x43U\xb6Xr\xfcpC\xd7\x96\xe4U,6\n\xde\xec\xd5\x8f" -"\xfc\xe6\xeb\xc1\x42m6\x4\x16>\x87\x36\xd6X\xb5-\xe\xb3\x1f\x61\xe7\xda$\xce`\x83" -"IN\x10;\x1\x38\x8\x42X\x1ftY\x84\xd9\\\xdb\x80\xa5\xb3\x18\x65\x1f\r\x96\x9e\x88" -"\xb6\xa1\x92\xd8\xfbh3\xc8\xed\xc1r\x13\x46Q.0\xddV8\xd4\xbf\xa4\xccmj\xe5\x95\x46" -"\xd3\"\x61\xfb\r\xa9$\x90\xc8\x1fHj\xf1\"/\xb5\xb8\xa8\xbe\xff\x0\x9au3\xbe\x98\xae" -"\xe6|u\x15\x2\xe8\x11\xe6\xd8\n\xce\x82\x31n\x10\x87.\xc0\x38\xf3\xba\x8d\xb2\x88" -"D\xe6\"k\xf7o\xb4\xdd\x1dS>2\xdd\x98\xaf\xad\x8hn\xd7\xac_\"\xd2:\xc3\xef\xc4\xca" -"<\x88\x7\x96\x33)\xd4\xc5\xe5\x44^H;1\xfe\xb1\xb6\x65\xe8\x1e\xfa\x14\xe5\x0\x16" -"\xcfj\xd2\xc9\x90+\xbb\x9\xc1\x16\x9c\xc0\x98|\x89\x65\xe1\x7f\xfd\xa6\xef\x44 \x9c" -"X\xe\x87\xe2\x14\x35\x9f\xf2\xf1\x65\x8f`,!F\x9e\x86\x1f\xa9:i\"\xfb\x81\x17>\xdc" -"0\x87\xd9g\xc2\x98\x61\xb5\xacK\x8b\xf0\x9a\x80\xa3\x9aq\x9b\xbb\xef\x19X3\xa5\x35" -"\xb7\x95\x15]1\xd2\xc5\x14\xefw\xb6?\xaf\xea\r>e\xfd=\x3m4\x7f\x9b\x13\x16\x44\x17" -"-\x1d\x5\xb1KX\xe0\xa3\xd0^\x1e\xb3\xc6<\xb5\x9c\x99!FWf\xabh\x3?\xd2h\xc3\x5\xa4" -"\x84\xcf^\xc0\xfcW\xab\x81\x87\x34\xb6\xfa\xcclSwj'\xe1\xea\xab\xdf\"\xbc\x86/\xef" -"\xae\x9aZ\xd8\x64\xaf\xcb.\x10%\xb9.B\xb8\xf7\xfc\x36\xf\xdc\x84\x38J[\x85\xe5\xd3" -"\xdc\xb8\xbbZ\x8c\nq\xae\xf4\x43\xfa\xbep\xf6\x1f%H]\xce;]\x13\x9_\x83\x46=\xfe\xd9" -"\xd1\xe6\xf0v\xea\x41\xf6\x45\x84\x15\xd6_\xa5\xf1\xfc~\x10\xe7\x1b\xc5S\x80P\xb4" -"\x1f\xe2}?\xc5*\x1\x11\xff\x11\x1c\xbe\xa4!\xa9\x63\xcb\x89\x13\xb5<\xc9\xe2\xe9" -"\xf5\xf6\xa1 +\xb\x1f\xfe\xbe\x8a\xfd|\x8e\x38\x5\xc6\x31\x2\x8e\x15\xa3\xbc\xe7" -"\"|n/UO\xb6\xd8-\xb3\x4U\xd5t\xec\x84\xfd\xbdNX\x9e\xc0\x93\xe7\xa9\xf2hz0\xa0p\x9d" -"\xa9&\xaa\x83\x66\xe\x19\xac\x33\x10);\x93\xb6\xb7\x61M|\x8b\x94\x14\x35&\x8b\xf8" -"\x8d}\xaa\x8f\x41<\xfa\xa4\xbc\xda\xde;\x6\xe0\xa4\xaf\xb6>f\xcd\xbf\xce?\xff]\xa6" -"f\x8c|K\x8c\x9\xf3\x64p1_\x9f\xbdlA\x91{K\xef\xfe\x85\xc2\xfe\x87\x89\xc2l\xf0~\xae" -"\x1e\xb5\xf5\x12\x13\xec\x41\x88\xa4)\x8dj~\xca\x9d\xbd\xb3S4\xeerz9>w\x93\x92\x10" -"m\xe9\x94#\xbf\xa7\x8e\xae\xda\xff\x42\xe7\x19\xef\x1e\x43\x0\x15\xdcJ\xed\xf\x66" -"\xdb\x1b\xc7\"\xd1\xceP\"\xed\x1\xec\x61`\xb9\xc6\xa1\xe0Y\x0jcL\xf1\xc8\x17\x38" -"\xaas[\x1b\x8a\xdf;S\xf0\x38\x1c\x92\x1d>\x1d\xb1g\x97\xd9\x35\xa9\rq\x0\xda\xd0" -"I2\x13@\x98\xcf\xbe\xf6\x7\xd4\x93\xb1\xc2\x85\x8fK\xbf\xd5\x9f\xd7\x11\x86\x1e\x7f" -"\xc8\xd3\xc3\x92u\x13r\x9\xe8x\xb5I'\xebS\x8f\xbc\x1bup\xd9N\xc7*A||\x93\xb9~d\xff" -"\xa4\x89\xfe\xaa\x8e\x44\x8f`\xbdq\x98\xeb\x87p\xcU\xaf \xc2k0\xb7\x41\x17\x94\x8d" -":,\x8e\x63\xf5Q\xdf\xa1Y~\x11Q\xfd\x3kE\xe\xd3\x65\xdc\xeb\x62z\x82v\xae\x18kc\xcd" -"\xfd\xc9\xbf\xee\xcf\xabI\xe2L\xfc\xc8\x8e\x33o(r\x9\xad|\x19\xed\x66sU%8%\x82\xd3" -"J\x1c\x42\x7f\xca\xc4.\xea.+\xb2\xbc\xa3\xb8\x89\xf2\xf9L\x17\x88\x9a\xf1{\x85'\xfa" -"\x8c\x98\xdb\x89\xa6/\xfb\xd0\xe7\xd7J\xf8\x3g.\xf0\xac\x1aO\x8a\xb7\x30\xdf\xaa" -"~9'\x9d\xbe\xa0\xb7\xeb\x15\x94\x33\x9\xda\xcf\x9a\xe8\xd7\xeaU0\xbf\x42>\x8b\x9" -"\xba\xf5\x91\xb7\xfc\xb0\xbf\x32\xbeI\xfc\xe9|\xf6Rx\xb3\xa0x\xe6\x93\xab@\x9\xe8" -"\x99\x1e\xdd\x66\xdf_e\x17\xd1\xcb\x89l#\xc9X&\x2h\xb7\xa1\x3\x43tL\x83\x36\x1a}" -"L\xfX\xd2\xa3\xb1G\xf8j\xa9\x61\x5\xb6\x8a*h\xfb\x84u\n\xcd\x80~\xfc+C\xe7Z\xaf?" -"i\x11\xf@\x7\xf0\xda\xd9\xbe\x64\xc5\x17t\xa9\xev\xf5\x9f{\xa2\x1cN!;\x9e\x3n\x8f" -"\xd9[qI\xed\xe8'\xc8\x95\xa7\xc9\x35\xd0\x4\xae\xaa\x65}\x8e\x89\x80\x8b\x94\x35" -"\x17\xaa\xe1;\x98\xb7\xfa%\xbb,\x5\xb+\xf3\xd2\xaa\x94\xd0\x36`\x87\xe\xbc\x33\x13" -"\xdf(\xb0\x19\xdc\x87\xa8\x34\xaf\xf7\x8d\xd2\x33\xd3)\xb6\x30z\xbd\xe4\x8f{3\x13" -"e\x91\xaf\x9f\xdc\x15&\xa3\xb2\x90\xc0tp\x1a\x93\xfdN-#\xe8\xc%\x45*F\x84OgQ\xb1" -"\x8e\x38<~e{b-\xf0\xb5\\\x12\xfd\x92\xc6\x96m\xb5L\xc7\xce\x98r\xd3\x81\xd9\xf3" -"3qa\xeb>\xf6Y\x16M-\xb7\xb3\xc0\xae\\\x1b\x8f\xbb\\o2Xs\xc3\x46\x9c\x42\xeaxI\xdd" -"\xb5J\xb8m\xa4\x99\xe3\x87\x6\x99\xa3I\xba\x1f*\x88+\xbd\xec*-\xef\xeb\xd8\n\x91" -"\xe2\xfX\xc\x35_\x99\xd2\xc1\xc1vW\xb2!\x5\x7\xa6\x15\x2kX\xeb\x11YF\x8b\xba\xc0" -"k\xac\xd1\x84\xb>\x9eJ/\xed\xbd=\xb9\xb3\xdaj\xa5\x93XW\xc2\xf3Z\x8a\x7\xf8\x99\x34" -"\xf0?\x1a\xc4\x17\x9b\xdf-\xea\xca\xcd\x37\xdd`Yh\x90\xd5j\xc5\xde\x35\xd3\x46\xf0" -"\\\xcb\xeb\x1\xafwolkx\xc7\xff\xeaw=\x9f\xb0&8\xa2z\x15r\xe8\x85\x6\x62{\xdf)F\x1b" -"N\xa9u}=\xc4\xb4\x88\x1c#\xaf\xda\xe1\xb3\xe6\xeax\x90\xe5y\x1a\x5\xac\x9b\xe1K\xfe" -"P1\xa5\xe7u\x9f\xe0\xa7z,C<_J\xbd-m\xd2LEZa\xbaK\xbd\xbf\xb8y\x95L0\x1c\x87\xcb\x83" -"\xa6Uq\xab\xb4\xed\r\x12\xb3\x82G\xa1\"\xe6\xed%)\xa3\xe9\xf3\x3\xccP3O\xf6\x66\x33" -"\x91\x34t\xef[9D\xf4\x31rx\x17\xc3?\x99\x96\x1c\x8f\xaeJ\x9f\xado\x7f\xce\xa2\xca" -"=\xcd\x7f\xf6\x30\xe1\xdd\x1a+\x1b.w\x2\xd4[\x90\x2.;\x98o\x8a\xc0*\xe7\x33}\x88" -"\x1a\xae;^\xd5\xff\x65\x89\x98,\x3v\xf7\xe0\x18N&woI\x10\xf5vJ\x9e\x87\xc0\xa0\x11" -"\xc4\x82h\x84\xb7\x33\xa7\xc9@\x81P/\xd6\x42\xf9\xd0\x1e\xf2\xf0\xd1;\x8c\x32\x2" -"\xb0\xc6P\x17\xdcR\xc6\xbb\x89j-]jn\xb7\x18\x65\x95\x39\\\x17\x61\xfb\xa3\xbaxS:" -"\xdd\xe3\xcc\x35\xcb\xc6\x1f^0I#Xr!\x7f\x85\x86\x0\xc7\xd9\xdcTFh\x9e/\xdcK\xc1\x8b" -"\xae\r\xc6\x9ak\x95\x38\x89\x9ar\xeb\x97-\xa7\x1b\xcf K\xe2\xa1\xbdO;A\xffN\x88\n" -"GNx\xb3\xcd\x97\x87%^\xd1)\xff_\xdb\x19q\xbd\xe1\xa6(\xf3\xd0\x3\x1c\x9c\x7r\x94" -"e:\x80Pi\xb0s|V\xf1<\xad\x9aw\x12\xc5\xa8\x9c\x8\x36N\xa2\xa7\xecGE\x9f\x1\xeb\x1e" -"y\xb1\xeb\xae\xdf\x65\xb7M/\x4\x11)C\xe9%\xc7sS\xb8[\xf4(MD\xf9\xe0\x35\xf9\x8e\xb3" -"\x81\x4\xde\x86,\xdbgX\x8b\xdcz\x1\xed\x46\xe3\xb4\x2\x1a\x36\\\x14>\xb8\xf2\xa2" -"\x89\xea\x8c\xb8l&\xe+h\x7\x98X\xcd\x80\xd7\xd0\x10\x62\xc7w\xccU\x9\x10,\xa7\x8f" -"5\xa1K7\x12(\xd9\xf3\xbey\xc2`\xbb\x44K\xf1/\"\x9emsOE_Gw\xd3\x44\xc4\xad\xf4\xe3" -"\xbe\xa7K?\xab\xbe\xf4\xffoP\x81\xc\x9b\xa2\xccL\xeb\x64 E\xc5\x4u\xe0Q\x9d\xcao" -"\x80\xdb\xaa\x84\xbb=R\x99;|d\xed\xa5\x7\xd3\xfa\x96#7\x82\xb7\x46\x6\x16\xfcG\x9b" -"\xcc\x66\xf1\xfa\x45\xdaPnhAsL\x4\x19z\xfd\xf2.IH\xfb\xe4\x63!\xf2@\xaa\x99\xc9V" -"{b>\xde\xf4\x0\x19\x64\x2)B\xa1\x4\xa3\xedM\xedK\x7R\xce\x87}A2\x97\n\xda\xdfj7\x7" -"\xe5\xe9\x99\xeb\x90\x83s\x1e\xd7\nLM<\xa5\x16\xe1\xf2\xa2\xcc!\xe7\xa3\x33[\xea" -"?)\x98Y\x87v\xca<\xab\xcIZY_\x8\xb1Mm\x4p\x88'\x1a\x42\xde\xc\xd8\x94\xfa.\xf4\x3" -"!\xe6U\xfa\x94\x93MV\xde\xa7\x9f\xb0\x9\xe1\x80\x11\xe6O\rq+\x85<\x13\x6\x1d\x9b" -"\xf1\x8d$I\x10-\xd6\xb7m\x2l\xb4\x1b\xf1\x88\xa4H\xd7X\xc8\xd6\x11\x11\xec\xc6\x64" -"\xa1W|\x90\xba\xee\xf2\x19p\xe1\xf7\x96\xec\x34\xbau\x89h\xc0\x61\xf4\xd3\xa0\xf4" -"\xc6\xf2\x96\x7f\x33\xe6\xad,)b\x93\xbe\xee\xebx$L7\xbeI$\xf8\x88\x80m\xd8\xa2\x62" -">z\xfe\xae+?;\x7f\xb2\\,\xa5\xf9\xdb\xa9\xf6\x84\x7f!\xa5\xd2\x35\xe\x9\xea\x9f\xcf" -":{4q\xc7\xf\xb\xba/L\xe9j\xfe(\x86p\xd8\x87\x61\x88\xae\xe1\xc0\xb9G\x7f\x64[=M\x9e" -"\xf8\x1f\xab\x33\xaf?l\xd1\xb\xbeyI\xa5\x1e\xfc\xb1\x89\xf8\xd7\xbd\xfd\x18\xcb\xf" -"\xf3\x7fR\x95\xf6\x17\xbd!B,\x8\x8e\xbe\x9a\xe3HYr\x8b\xf8\xe2&\xf\x5V\xffl\xf2\x66" -"\xbe\x35\x33\xb\xf2\x18:F\xb0\xf2\xe0+\xe6sR`\xfd\x8e\x32\x99K\xc9\xeb\xb6m\xa8\x17" -"!x\xc0\xa5\xd2\xa4n\xbf\x81\xd5\x33\xdc\xe\x8d\x85\xf9\xda\x0\x9d\x9c\xeb\xe0\xe5" -"\x12\xb9\xb3\xc2" -"\xb4\xcd\x1x\x99\x83P\xc8z\xfaO\x8b\xf9\xb1\xd4\xc8\x8f\x14\x46\xf3\xbd(\xb7\xf7" -"\xe6\xa1#Se\x4tn\xcd\xe5\x36\xcn\xacy\x8ck\x8e\xff\xb2\x82\xa9\x30\x80nU\x9e\\\x61" -"G\xf7[:\x9b\xfbo\x80\xddg v\xf9\x9d\x8e\xbb\x6H\x1\x19m\xc1<\x83\x7f\xe2PmR?\xdb" -"\xe6\x87\x1c\xf3\xcd(oU7C\xb2\xc2\x96V\xf8\x62+\xf5\x7\xfd\x99M\x1a,\xbf" -"\xb\x62R\xa1gh\x2\xe4\x1a\xac\x85\x8f\xc8\xc0_;\xf\x9b\xd7\xf5\x65\x9d\xaf&5\xbc" -"eO-N\xc5\x84\x4v\xdf[\xbe\x92\xc9Om\xfe\x1\xb0S\x81{\xd1\x1e\x98)<\x1d\x82\xd4&\x18" -"\xffv\xb7\xd7G|\xf4JU\xa0^bg\xc7\x80(\x84\x97S\x87s\xc4^|\x0Te\xbe\x37\x6\xcf\xed" -"\xa1\xa7h\xe3K\x16R\x91\x30\x15\x1c\x81\xc2\x1c\xb7\x9b\\\xa2\x61\x31\x18\xdc\x99" -"\x80\x10V\xfb \xdd\xfbw*\xf8\xf6\xc0X\xd2\x91\xbb`\xd1\xbf\xe$\xf1\x9\xc\xfe\x10" -"-\xbc\xfc\xdf>\xbe\x9c+\xe9X0\xbct%O\xb3<^\xe9\x61\x17=\x7f\x19,w\xe9\xf3\xcfV\n" -"j\xcf\xae!e7\x8f\x8e\xc2\x7\x94\xbc/\xe8\x9b\xe5\xfd,\xc4\xcb{\xc6K\x18\xe\x31ml" -"z\x8a\xec\x2\xcd;\xa4\x89\xea\x1b\xc7)\rD? \x17\xdb\\\x9fV\xd3\xc0\x1f`\xaa\xc3\x61" -"\xdf\xbb!9\x1d\x46\x31\xe1\xce}\xca\xaf\x8bqGBM.(\x4\x1U.\xb8\xd2\x8e\xa2\x9a.:\xe8" -"\xd4\x97\x89\x9b\n\x9a\xb0ur\x89\x43\xe3\x10\xb6\xf1\x19\xf7\xf4t_\xbf\x15vy\xfc" -"\xaf\xec\xa4\xb4\x89\xb2\xc9\x89\x16\x95r\xd9\xee\xa4\xeaJ&\x8a\xd5\\\x9\xe5\xf9" -"5\xe5\x81\xfb<;\xdfz\x19\xcb\xcaN1\xc2\xf1\x1c\x7f\x94\x4\x1c\x17 \xf4\xaf\xae\xb3" -"B\x97\xd0\xd4\x43\xea\x15\xf4PG\xd4(\xe1p\xbe\x83\xe9I\xa7G\xf2\xb0\xeb\x11\x14\xad" -"\xfeX\x16\xe4\xc6\xdc\xe2\xe1_\xa5\xc0L\xbf\xc3^\xef\xb2\xff\x31\xe7\xe8$\x9ah\xdc" -"\x18+\xea\\\x38\xd9L\xc1MO\xba\x93{\xf7\xddm\r~\x97\xe8\x86\xda\xb9\xca\xbc\x10\x65" -"\x15/\xe\xea\x63I\r\x8f\xf3\xfc\xed\xed|f\xb9KC!d\xfa\xce\xec\xd5\x37\xe8\xdd}vO" -"\x9cr3\x0\xf6w\xcb\xf9\x62\xf5\x12\xe0\xc2\xbd\x92j\xed\xce\xce\xd2\x3!\x9b\x44\xc6" -"\xa3>\xb8\x1fh\xa8\x8ti/\xb\xa4u\xe1Qs\\\x2\xf3|\x7f\x82{|\x18\xa5\xf@<`\xb2k\xa0" -"u\x98\xa2\x34\x0y\xecy\x87\xf\xdc\xf1\xd0\xa1\xf\x95\xb4\x91z\xe9\xba\x41O\xbb\xa0" -"\r\xd5\x61\xff\xf7\xe3\x66\x9a\x84\rV7\xa6p\xb9\xc7`?\x95\xb\xe1\x94\x10\xda\x99" -"(\xf\x83m1exb~\xd4\x6\xe\x8a\xad\x11\x97QB\xbc\x93\x1e\xfb\xb5S!d\x11\xd2\xa3\xee" -"\x8\x9e\x4\x35\xd2V\xcfl'\x13O\x97\x42k\xe3\xfd\x8aj\xe9\xa0\xb7\xb6\xb7\xd6`\xe4" -"\xbd\xbe\x8b\xaf^\xa8\xd8\x1f\x42I\xf0?\xa5:J\xd8\xc4\x9f\xa7\x9a\\\x34oms8J\xf3" -"Mk\xa5s6PyK\x84\xb\xbc\x12\xc2\xd1\xe6\x93\xe6\xa2\xde\x9f\xf5\xb3\x17\x46\x83\x81" -"D\xbd\xac~\xcbW\x84\x7f&\xc1\x80{\xee\xa2)\xa7\xef\x3\x32\x92\xdfW|O\xa8\xdfq%\xc9" -"_\xbe\xb9\xd3\xc9\xa6z\x95\xea\x90\xf9u\xa9<\xcf\xf6hJ@v6}m\xf1?@6s\xc1\x30\x98\xef" -"U\xe1\xc5\x95sIT\x8c\xe2\x17u\xc7\x42\x8d\xd3\x39\x4\xff\xc4\xaa\xe2I\xcb\x65\xc0" -"\\*\xc6\xfe\x64?\xb7Z/J\xa2y9 \x13Q:j\x90\x8e\xd6\xbc+\xb5\xc5j8\xa6\x9aZZ\n\xa0" -"~\x84\xaeX\x95\xa2\n\xdd\xa2\xca)!E\xd1.\xd4&H\x9/\x9d~y\xeel\xec\x97\x8e\x1a\x35" -"H^\xf3\".>\x9d\xd4\xf9\xc2M\xf\xa7Q\x89\x30\x8a\xd0\x38\x19\xb4%(@\xaf\xd4N\x87\xe4" -"\xf4W\xfc{\x8e\xf6|\xad(\xc1$+\xeb\xe3v\xbZ\x90\xe3u.\xd2\xf\xa3\xb4G\xe5w\xd6\xb2" -"\xc4\x90\xebv\xf5\xb3W\xc0\xa6\x18\x12\x8\xa8\xf9\x95I\xa2\x80\x9b|O\xfe\x37\xe2" -")\xe3\xe0\x1d^{\xd6|o\x82\x11O\xa9\x43jy\xbf\r=o\xb8\x8f''\x92g\xb\xfk\"\xd1L_!\x93" -"\xd9\xed\x7f\x12\xf6\xf1\xc7\xf3\x36\xf5\x97\xd2\xf1\xbYAcSP\xeekF#S\xc2\xf2\x11" -"\xd0\x18\x10I\x15V\xda\xe1hS\x3P\xe9\x94!\xb5\x9\x10ZnU\xb\xcf\x9e(C`[\x95\xa8\x9c" -"\x93\xab$\xb9\xd9\xb7\xed:\x99\x65\xb6\xfc\xa2\x1a\xb9\\V\xb\x2\xe7\x63 /|UF\x14" -"\x19\x98N\xdb\x14M\xe\xbb\xef\x64\x36\xaa\xa3\xc6\x89Y\xb0\x86\x9bX\xe5\xbc\xbcT" -"Cl#\x8a\xc9:\xaf\x88.[\xc0\x14\xe0?^\xae\xb6q\xac<\xc0\x90\xeb\xcb\xfb*\xaci\x18" -"l\xf3gF\xf5\x35sj,\x8b\xd7\x3\xaa\xbbz\xb8\xc9\xdf\x63\xd7\x31\x91\xb9\x8e\xe4'\x94" -"s\xdc\xa2\x98\xc4\x1aog\x98>\xf9\x1b.V\xefY\xb9\x33Y\xd4\x5\xb4/Z0\xac\x81\x17\xcf" -"{\xe5/\x1\x2!7D\x1e\xfa\x8T\x9b\xca\xdb.\xfb\x90\xadL\xcd\x93\xa6\x2*\x84$\xa8n\xd4" -"\xa4\x8c!3&s{\xd9h\xe6'\xf6\xf8\xa8\xe8\x6gk\xfc\xd6\xa6Q~b;\x84 J]\x8d\xfa\x46\xea" -"\xe6\xab\xe8\x98p\xff;\xb1\x9c\x64R\xff\xa3\xa5\xab\xd0\xe0\xcd\x41\x8f\xfd/\xf2" -"!\x82{\xd3\x13\xd7S\xa6\x34\x34\xea\x1b\xf9\x82*\xa9\xd7\xf2\xe8\x39\xe9\xa0\xde" -"\xbb\xea\xad\xd3\xa4\xeaGF\xdc\xb2\x81K\x98\xa5/\xa0\r\xb4\xc1\xc7\x1b\xd7hpI\xb5" -"\xfa\xea\xf5\x64\x95\x7\xc2\x30\x35\x13\xf1\xb3\xa6\xf4\xf7\xdex;\xcc\xf8Z\xea\x62" -"\x8b\x1a\xfd\x8fG0v\xe9Q\x95\xd1\xe8\xaf\x64\xa0]\x5\xa6\x61\xe2\xb2\xf7wy\x14I\x5" -"\xa2\xc5`\x1d\xf0\xee\xf0\xc8\x81+\x8d\x9aQeH\x93\x96\xac\x9d\xe5MqRP\xa3\xac\xce" -"\xffVY\xb1\xf5\x1a\xd7\xa7#\x9d\x9a\x8b\xc7\x63\x1a\x35\xdf$N\x9c\xf1\xa3\xd0\x80" -"\xde\x8f\xdf\x9\x5-\xaf\xb2\x0\xb9\x7\xe8\xda[\xb2@N\xfa\xb1N]5\x0w\x10\xf3i\xd3" -"\xdc\xe9\x65M\x3\x32\xbb\x19\xa5\xbc\x9b\xcf\x10\xc2\xae\x8a\x12\xd9x1\xbf\xd0\xc0" -"h\x81\xbe\xf8\xca\xc8\xa9\xbd\xeb\x42\xa2\x64Y2T\xad\x8dr\xfa\x97\xf1\x89\x90\x1a" -"\x85x0\xcfR\xcf\x13\x7f\xcbmF\xb9\xb9\x34\xb9\x8eR\xa2Q\xb0)B-\xda\xee\xe2j\xaa\x89" -"\xa5~;\xc0\xc4\xe\x95\xbc\xdc\x9d\x9a\xa3j4\x80U \xa6G\xa1\xdd]\xe1H\xd7\xd5\r\xc9" -"\xea\xd7\r\x92<\x9cx\xdb\x90\xf8\xba\x2\xd6\x8c<\xec\x9f_\xd7q\xc3\x31@\xb9;\x82" -"\xec\x6<\x8d\xa7\xd9\x64\x44\xbe\xb4\xfd\x1f\x94\x38\xc0\xb\x1ct}\x88\x33\xdd\n\x1e" -"\x12\xfe 6\xbf\x38\xb4\xae\xa8\xf8p\x8b\xd3\xe3\xe2\x89\x42Z\xbb\xe7\xa6\xce\n\x9b" -":N\xb6\xd6\xcf\x2\x1a\x3\xa4\xb\x32\xa6\xfb'\xf7\x14\xab(\xb1\xa8\xd0\xa7\xbe\x38" -"\xe3X\\\xfb\xdf\x46\xac\x9\x6\xb0\x65\x65\x99\x99\x83\x31\xba\xeb$\xe9N\xff\xc3\xd5" -"k7\xa6\xf3\x36\x95\xc8G\xb4^\xaeJ\xbe\x90q(\x98~{\xc6\x1c\x9c,\xbc\x35\xb8\xed\xb6" -"\xc4\xd0\x0\x4\xd3m\xd0_\xe0\x1\xfe%\xa0\x44\xbb\x32Q\x17\xff\xcd:\xe3\x7h@)\xc2" -"\x9e\xd0\xce\xdasM\x1b\x96\x85\xdaL\xday\xc5S\xee\xfb~&\xd3\xe3\x1c\xaa\x1b\x81^" -"1\xd0q\x8b\x19\xb\xe6\x91\xab\xff\x96\xc3\xc8\x9a\xd3\xab\x86i\xa6\x91!I\xe5\x9e" -"\xebVn\xc9Q\x13\x89_\x17\xd5\xae\x2\x1e\x1e\xe2\x85\xd0\xc4\x9e\x5\x41S\x94Nc\xe0" -"\x19\xfb\xbb\x8\x63\xda\xce\x34\x1bS\xcd[\x97o{a\xed\x8/d#\xdc\xb6\x31IM.mF\x85\xbc" -"\xeay\xf5\xdc\xd4\xdb\x9eN2[8\xc7\x39\x10\xd8\xc9\x45\xb0" -"Y\xc3n&!\x19V\xe6vY\xbc\x13\xac\x10\n\xe8\xbf\xbc)z\x8cL\x89\x85\xfb_\xb4\"r7R\x85" -"n9\xd5q5W\xe4\xeb?\x14\xc5\xe1_\x82-\"\x4\xef\x14\xa9\x1cj\xb8\x13ll\xcb\xf9\x4\xbe" -"\xabr\r\xaa\xacWu\xa4\xad'6)\x86\xebx\xd9\x95\xb7\xebp\x91\x35\x19\xf0\xb0\xd2\x95" -"\x91\x62O\x15\x92\x85\x88\xc\xa1\x8b\x18\x32@A\xc\xbd\xe\x9a)?\" \xc6\xff\xc2\x89" -"f\x8c\xa8 \xccn?\x8cn$\xc4\x37(\xe\x6sy\xbe\xbb}\xcd{\xfe\xe7:\x80M\xe0Hf\xc1\x2" -"H\x8ar\x1d\xc5\xc1\x9f\x64\xc1{\x1b\xa6\xf5\x43\xfd\x2J+\xdd\xf2\xb4='\x18[sU\xec" -"\xe2\xfa{\x9f\x36}]V\xcf@\xe8\xc8\x61\x3\x9bp&\xb4\x65\xd4\n\xc2\x64\xbd\xf4\xd4" -";\xb5\x9e\x45\x1a\x15/\x2\x19\x80\xdfr\xac\x89\xcaS\xff\xf8\xdd*xI\x87{\xd8\xff\xe" -"\xd6T%L\xe9\x3y%\xd3\xc0t}#\xde\xde\xf3?\x95\x10\xa6s\xc\x95\x37P:F\x12\xc7k6i\x8e" -"K\xb1)z?\xf7,\xaa\x98{\xfd\xf\xb8\x1TO\xa5\xb0GSx\xf\xae\xeau\xa5g\xea\x18\x9\x8f" -"*\xe8O\"b \xdf\x46\x42\xa7\xbo\x5Ww-{\xa1\xf1;\xef|\xe9\xd9\xc1\xf3%O7;\xa0\xfc\xfc" -"D\xc0\x6?\xcf\xf3\xc2\xd7\xb4\x8b\x1c\xdd\xed\x8fx\xa1\xec|\x6i\\\xe8\x89g\xbi!\xf9" -"\x8d\x98\x65G\xfbu\xff?\xaf\xbe\x9\n-3\xc4\x1a\x1f_\xec\xdd,!\xe5\xef\x80\x8d|\xd4" -"\xa7\x19[w\x15ve!\xc0\x8\x15\xf5$\xe7]\x1bUH\x16\xfa\xda\x8\xb6\xc2\x46\xd1\xb6l" -"\xde\xc4\xbf\x19\x9\xd4\rH\xd5\xa2[\xb\x16\x15R?\xba\xc1\xee\xc4\x9f@M\xd7\"G\xb2" -"\xc0|\xef\xb4\x5\xfa\xaa'9s\xe8qK\x13\xae^v=b\xd0w\xf1_\xbb\x15\x3\r{@b'S5\x98{\xc5" -"\xed\x9b\xce$s\xba\xac\xc9\xfe\x39\xea\x65\xd5\xa7\xff\xe\x37g\x129\xaf;Jj6\x95i\xb9\xd8u\x7f\xd0T\xcc" -"\rkb\xee)\xcdl\xf2\xfc\xbcj\x8dW\xa2\xf9\xc6\xa5\x4\xba\xb4\x10\x4\xdfR\x92\xda\xfa" -"\xec\x65\xa2\x86\x1b\x43-\xc4\x1a\x36\x81\x36\x11{teSw\x7f\x1f\xa0\xf7\xb2\xe3\xfa" -"\xf2S\xa0\xbf@\xd3\x92\xb4\xe0\x46\xcfiz\xbfM\x8b\x32h\xe4\xf2\x64\x84\x39\xad\xe9" -"\xd2\xe4U$\xf3\xc0\xe0R\x7k\xf3T\x0\xcb\xdd\x16\xe7\xf\x88#\x9d\xeat\xcd'c2u\xcc" -"\xed\xe4\x9ck|#\x7f\xb7\xbd \x1b=\xfa\x9bw\x94UYaAM\x80\xfd\\\x32\x3*3\x10\xb6\xb3" -"-F\xa6\xe7\x44\x93O\x9dh\xc_\xfd\x81\xf3\x31\x99\x1d\x1c\x99~\xb3\xe4\xce$\x19\x16" -"\x17M\xa8\xbf\xb5\x6\xb0\xff\x91\x8c\x61\x17Wjo\xcd\xf4\xbd\x9d\xd9\xc\x9bRs3\x1c" -"[\xf0~X\x97\xe9\xf0*\xa3)l\xc0\\\xf4~H\xb5X\x86\xb8\x82o(\"\x14\xc\xc8OT\xb8\xb9" -"\xd6G}\x98\x93\xeet\xfes\xe3\x92\x97\xbf\x41N\x1y\xbd\xb2Qf\xe8\x83mI\xb2\xad\xd6" -"'J\xff\x33\xc8#a\x19yh\xfd\xfa\xcc\xa4\x9b\x85w-\xe9\xa1H\xe0\x17\xa8\xff\xc6*8\xa3" -"\xb\xe5\x85\x5\x13\x7\x17'\xf3\xba\x34\xdd\x64L\xe0\x8b\xf3\xfd*U\x8\x9s\n\\5\x91" -"\xd6\xc;\xe>\xd2N\xafW\x81}L\x84\xa4\x66\xc5\xf0\x37\x94\xe6\xae\xb3\xe1\x84j\xb2" -"\xe9:]\xcc>\xf8\x35\x66J\xe0\x13\x46I7E\x11\x80\xab\xb9\x1dT\xcc\x81\x96|\xf8^\xe6" -"\xb9\xd7\\\x14\xa7\x7fs\x7f\xa6\xb4\x14\xed\x66\x7f\xca\xba\x82\xde\xd6\x65;\x8d" -"fI\xcf\xe5{Fr\xc4N\xf\xb\xfeZ\xd6\x30\xc4\x8c\xcfT\x9b|\xd2\xde\xae\x9cU'\xd0G\x83" -"\xecS\x19\xbb\x9e\xf7\xd7P\xd8{\xa3\xc6\xb9\xb8\x19T\\\xa2\x42\xd4\x1fv\xfc\xd3\xdf" -"/\x88\x42\xfaW\x14\xaf\xf9\xe5\x13\x9b\xd2\x90\x8a\x0=\\\xe\x62\x63\xa2\xbb\xe4\x10" -"\\Q\x0\x87\xdb\xe\xcd|KW\xcc:\xf6M\xba\xaa\xc5\xde!\xbc\xab\x8aX\x0\x32%\xef\xe6" -"{\xe7\xf9\xa6p\x9e\xee%\xd3Y\xfc\x1a\xeb\xc9i\x13\xf\x30P\xc0\xeb\xb6\xd8\xb7HY\xad" -"T\x86_@\x8\x63\xd7i\xe9\x1d\xb9\xed\xeb\x43\x85%\xa7\xc7\xca\xa6\x8b\r\x19\x84u\xa4" -"I\xf5\xf8{^\xbbI^\xbb\xd0\xdc\xe8{\xbf\x35@\x86y0+M\xc6m\x89?KAX\xe1\xb5\x30T\xab" -"\x9b\x19|n\xcb\x7y+\xa9\xc8\xc5\xb9\xc9\x0\xaf\xc5\xa0\\\xc9\xc3\x1bPxBz\x1c}tD\x9b" -"\x9e\xb8\x61{?\x0\x98\xef\xf3\xc5\x86tM\xbd'Z\x11}\n\xa1J\x4,Q\xb7Pa0\xdeYiM\xb9" -"\xe4]H\xf3\x9a\x31\x41\x1b\x65\x65\x12\xa3-<\xd9\x66\x86\x80js\xca\x7f\x46\xdc\xf9" -"\xa4\x87,\x3\x34\xc8\x9f\xfc)H\xa2\xbd\x98\xbb/\x0:\x85\x83L\x4\x98w\xa4r\x9f<\xf0" -"\x1\xb1\x38X\x14\xa1{\xaf \xa0\xefup\x8d\xdf\xfKemA\"\xe3\ryM\xa0H\xd8; \x1a%,\x92" -"\xc8\xc9(\x9\xcc\x30'\x15\n\xd6^\xcc\x94\xcb\x14i\xc5\xdbV\x96ZB\xb3g\xca'\x1[\x16" -"\x1a\xcb#\x18hk\xc3\x45\x1e\x3\xa2\x99\xf6}\xe0\xad\xbd\xe7\xf3\x38\x7!5e\xcf\xaa" -"\xb7\xa5\xad\x4\xa4\x42\xfd<\xb7\x10\xa6\xd4\xb7\x8a\x62\xc3\x18\x81_\xf2\xd9\xe1" -"K\x93W\xe8\xbb\xd1?\xaa\xbe\x9d\x9e\xa4<\xc\x39\xbfIv\xff\x3\xd1W;\x15q\xe3\x1<\xfe" -"\xd9\xbf\xaa\xc\x42\x1~\xcf%\xd7\xc1-pA\xez\ry\xe3}]P]\x11\xda\x96\x96\xe2\xb1\x13" -"\x1\x9e\x10\x35Z\xffIg\xc5n\xa8mCb\xa8\x9b\x42\xcc\x1\xf3\xab\xf0\xde\xa5\xf0)\xef" -"\xc/\xd3\xf3;\xfdX\xe3\x1a\x65 @\xac\x61yX_\x9b\xb0>\xb\xf8\xf1\xe9M\xa9\x32@\xf5" -"c\x7f\xa6!h{\xb4\xb7\xed\xc3\xa2\xf5\xf8\x9f\xd1\x43\x44\x12\x33:\xa9\xb9{\xd0\xc1" -"\xd3\x62(Z\xb6\x43\xf4&\xf7]\xd8T\xf1\x16\xa0\xd8\xbb\xdc\xdb\x80\xceQ<\xc4VP\x94" -"[Tor\xcai\xdd\x9d'\x7\xeb{[\xdd\x95\x1\xfe\xba\xc3\xc4GhR\xa1\xd2\x1dl\xec\x9a%\xe4" -"\xd1g\x1d\xcd\xbb\xb6{o\xb0*x\xda\xab\xb5_\x14\xe\xec\x15~\xb9\x10u\xe1\xf5\xcf\xbc" -"*\xa8\xd8\xd3\xfe\x99\xfGB\x9b\xc5s\xb6R\xd0\xdag9\x9\xf3k\xf1XR\xa7\xff\xd9\x91" -"\xd9'\xe9\x9al\x95o3@\x8a\x8f^\xdcm{ \xe\xf6=\xce\xb2\xcf\xb8\xda\x94u\xd3\x45(#" -"\x8fMZz\xac\xb9\x5\xe6\xa7if*1\xdd\xadNuy_\x11\xf3\x33+\xee\x3\x9b\xea~\xb9\xa9)" -"Z\x93\xe8\xf0Z\x9x\xd8\x81s\xc2\xf4\x8az@=\xaa\xf4|\x4\x44\xacI\xe3TJ*\xa3\x19\x17" -"mQ\x91\x1bI\xda\xc\x3O>\x9c\x33\x84\xf9\x6=D\x9e\xad\xde`I\x1e\xd2,;\xb5\xc0\xba" -"\xc3\x1f\xc5\x64\xbbu\xcfuY|\x97{\xd9\xab\xf9\x5\x99;\xde\xc6\x86r\x8b\x1c;\xce]" -"\xf\x63\x2\xb3\xe0\x34\xe5V\xe4?\xbe\x18Q\xb2\xd1\x37\xcfs\x8a'\x7f\xc4\xce?(\x9c" -"\x1bj\xca\x82\xf9t\x1\xea\xc8\xe\xa9\xa7h,\xdc\x9aX\x8a\xb1\x0\xc8\x44\x8b`\xac\xb" -"6\xf\x1a\xf0:\xb5RU6\xc3\x43Q\xdc}\x11i\x19>q\xfa\x12\x89.\xe7\x9a\x9e\x41U/]\xee" -"\xe0^\x9bqE\x87(\x88R\xdeyM\x16\xc5q\xa4\xd6\x1c*A\xdf\xb1\xc5\xe0\xc0\xe6\xe2\xe9" -"\xdcN\xc7\x92\x7f\xb7kR\xec\xb\xd5\x81\xf6\x98)i\xc8\xdd$\x0\x37t(\xfcup\x10\xad" -"\x3\x9c\xc3\xc9\x17\x42\x1a~ \xd2\x61\x3K\x9f\x86\xc6\x97#\xe9\x82:&H\xd6H\x87\x9e" -"\x13\xba\xaa\x98\xbcY\xe4Q\x80\xec\xd9\x7\x80L\x1\x32\xb1OZ\x90pXi\xa8\xc3\xb0k\x1a" -"`086@)\xf3\x80\x1e\xf7L\x8fy\x8fq+\xeb*\xebU\xa9\x17\xe4\xe1Y\x7\xe1`p\xa0\xf9\xb5" -")(\x92\xa0P\x82\xb8\xccZQ\xaa\xcb\x34\xe2'\xfa\x8b\x38\x9c\x8$[\xda?\x3W\xf\x4\xc1" -"\xa0\x64\x62L\x89)\x93\x8e\x96k\xcd\x98\x1c\x11\xf7\x5\x9\xbc\x65\xbe}=\x18%\xa9" -"\x18\xa7<\x9c\x34y\xcd\x93$\xcc`N\xb\x38\xbd\xd7{\xeb\x80-O\xe0\xc6\xc7]\xc1IOh\x16" -"\xddR\xf)\\\x1a#\xd0\xc\x8e\xc1nE\xd9\xd3\xaa\x9e[l\x13\x8bvi\xbe\x34\xf6+rP\xfb" -"\x1`4\xfc=E\x9f\xacI\x1b\xb4\x7P\x1f\x99\xffi\x15\xf1{\xa0X\x7f\x17\xd1\x9f\x5\xe4" -"\x1\x1a\x82`\xc6\xd9\xea\x10\xcf\xe8M\xb4\xcd\xaco\\\xb8\xf8\xa8\xc1\x9dq\xa8\xb5" -"\x1c\x80?\xec\xaa^x\xd0\x90\xeq~m\xb0\xf1m\xb5\xe3\xfdvk\"\x10\x33\xd6LF\x95\x12" -"s\x99\xca\x9eUY7K\xbeq|w'F\xff\x2\xbe\r\x9c\xda\x2\x16\xa2\x2H\x9a\xa5\x87- \xe\x9c" -"\x96\xa7\xco7\x9&L@G\x84z`cS\xfc>\xab\x9\x95\xcb\xe4\xdc\x92\x9\xcdS\xd2\xf8i\xe8" -"\xfbI\x95-%\x7\xc2\x8d\x97\x8a\x44HH\xcf}@ \xeV\xa1\xdd\xe\xca=\xd2\xcd\x86\x1a\xb8" -"\x2\x9e\x8f\xed\x1e.\xa8\xa4\xb4WQJ\xc\x11\x8cld\xb3\xff\xde\xaf\xd9\xfa?\xbf\x92" -"\xdc\x13-\xc4\xac\xb1\xdd\x8.\xd5\xef\x10\xe1\xc8[\xd4`\x1a>\xf2\xa6\xb5\x8=\xed" -"U\xf5\xd9\xd2\xc5u\xd0\xeb\xa8\x97\x0\xb4\x80m\xbc\xc6\xe5\xd2\xa2\xad&\xc7,\xb5" -"P.\xaf\x92\xce\x2\xeb\x7i\xb5R\xf7\xb3r\xed\xc1\xd1N\xbc\x12TUE\xd5^\x1b\xe0\xca" -"\xce\x86\xe\xa9P\xc8\x91\xf4z\x6n3O\xda:\xfa_\xcc\xe5\xcbX\xa1!\xc7\n\x64n\x8f\xcf" -";k=+\xdd\xbd;\xb1\x37\xabK\x1b\x30V449C-\xf4\xaa\x8\x9bp\xb4u\x11\xcf\xec\x8f\xf6" -"\xbc>\x97\xb3 \xf8\xbe\xe6\xfbI\x98\x1d\xd5\xb4\x11 ~\xe7\xf4\xbc\xaa]\x17\xe9\xae" -"0\xfby\xca\x88|\x4 \xc8\x2L\xb1\x44Q7\xe2\x43\xd4/\xcb\xfe\xa9obY\xdd\xd0]3[9\xe" -"\xd2X\r\xc8-\n\xba\xee^f\x9dS~vn~\xc1lQ*\x8bG\xaa\xe6\x38\r\x89\x94\xc8}\x0\xdf\xed" -"\x9f]\x85#*\x84\xe3\xd3\xcb>\xa5\xb3\x7\xc1l\xbb/\x96.\xff\xa1l\xae\x18\xa2\xb6\xf8" -"\xb1\xef\x4 \xe0K\x1e\x86X\xf3h\xb7\xd9M\x94\x9a\xea'\xac\xa6\xad\x42\x90\x7\x36" -"<\xe8p\xcd\xe7W=\xca\xb8\xe9\x81=\xdb\x31\x81\x63\x45%tA\x18\"\x8\x90\xa4\xc1rI\xce" -"z\xe3\x14\xa9\xad\xcd\xe3\x89\x94\x9f\x14\x64\x97kJ\x81\x9e\x87\xb7X\x8a\xaa\xf4" -"\xee\x1aP\x1c\x3\xa1\xc7\xe9(\xc3\xb4@\x1e\xbe\xb2\xeb^\xc5\xb6]\x6\xd6\x1c\x11\x83" -"\x1aP\xe5\x91$\xee\x7f\xda\x18\xfcI\xca\xfa*\xe4\x7\xafRm\x1a\x94\xa3\x5\x96\xe5" -"\xaa\x91\xe7\x99\x1e\xf4\xc0\\\xb0\xff\x34\x8e\x86\x94,pl\xfc\xd8y\xb5'\xc8\xe5\xf0" -"\xc\xcd\x36 \xf2\xe1\x11\x83\x17\x17,\xe\xf4\xcd\xa0r\xfa\xf9\x95\xd0\xd8\xdb\xb" -"\x83\\\xc9\xdf\x19!\xfa\x42\xbc\xd2\x61=8\xb1I\xa9\xff\xc4QNr{E<|\x8d\xed\xec\xf4" -"^\x1el\x15\xb7\xf2\xd5\xe8\x41\xb2\x8es\xe6)\x8e\xd6\x45\xaa\x91\x33z\x7\x2\x18y" -"\xc9\xc3\xc8\x6\x18\x37\"\x42\xf0\xc6\xd4 nW\xfc\xb6\xe\x42m\xac\xc9\xeb\xe8\x31" -"\x9c\xcd\xc3\xa6\xab}\x7K\x85\xfb\xfa\xa9K!5y\n\xe8/\xb3\xa4\x89;D\xf2\x41N?\x9f" -"=\xa8Z\x83\x8\x41\x7f\x19{\x92\x81\xc-l\x80\xb2\xfb\x8drZi\xa5\xdfn\x19|\xd8*w\xdf" -"\xac}\x82\xed\x90:I\xe8\x1d'\xe6%jrhX\xa6\xf4~\xef\xfc\xac\x83\xae\xd1p\xe2 Y\xc4" -"\x1a\xae\x41\x9c\x13\x97\x43\x6w\xb1\xe3\x8dM\x10\xea\x1ds\xd5\x9b\x83m\xc1\xa0\x32" -"\xf5\xff<_\xcb\x37\xb1Q\xca\x33\xdeo\xed\xb9\xb6s$p\x96^\xc1\x95G\xe1\xcf*qz\x1d" -"\x85\x8a\xco\xf0Zt\xfc\xc9\xb5\x12\xe4\xf5\x4\xe9\xde+\xda\x92*%N\xd8\x10\xb0\xca" -"\n5,>m\xb3\xe0\x8e\xc0\xaf\xd8#\x91i\x7f\x38\x18\xbdP\xa9\xcc\x3\xaa\x1a\xd6*\x9d" -"\xdb\xe4/Z\xb7\xf4\xbc\xc1N^\xf4j#u\xf\x8b\x9\x95\x9c\xbJ\xfd\xd7\x9f{\xfd\x8f\x9b" -"\xa0\xdd\xe9*\xe6\x31\xacR\xcgdTepG\xed\x18\xa0r2D\xe9\xaa\xcf\x63\x94\xc7\xd1\xdf" -"\xe2\xcR\xef\xde\xd8\x32\xb1\xaa\xe4\xdd\x2\x15'\x1f\xc4n\xf5\xb9\r\xe2QO\xb1\x18" -"9jz`i\xbbI\xb9[\xb2@amA\x15\x9b\xe7+_\xb3}O 7\xc3\x9a\x41\x63\x18\x3y\xe5\xe9\x1a" -"\xdc\x98p\x3\xb0\xa1\xcdgl\xcb\x8c\xf6\xe4OR<;t\xd5\x43\xd5^\xb3\xcc\x46TcD\x7 \xbe" -"\x8\xee?\x85\xa6\xb\x93\x98g=~I\x0\xc4X9y\x88|n\"\xd3\xf2|\r\xb0\x35\x9as\x5\xb5" -"FRt\xd0\x9f{\xcb;{\x4\x89;,\x9c\xb5v\xe8\xe5p\xb4\x9e\xfc@\x9c\xe5\x5\x45H\xff\xb1" -"\xb1\x9d\xd3\x9\x80)\x95\x83`\xb0\xd9\x36\xb7\xb1\x7\xce\x4\x66H\xba\x43{\xef\xa9" -"\xbe\xf6{\x8c\xbd\xde\xcb\x82\xcd\x9cK\x1b\xcd\xc7\xfcj\xf2`u\xf3\xcb)$\xdf\xac\xf5" -"\xf1\xc4\x16\r\x1f\x96\xf2\xd7Y+W\xed\xb1\xca\xd2\xe\xf9\x39Sq\xd6\xaa\xc1y\x1e\x98" -"\xbfK\xc8K\xfd\x81\xb9*\\+@\xdb\xfe\xe3\xd5\xe\xe9&\x9d\xf6\x32\xa6\x8c\x9fn\xf7" -"]i\x93\x9evJ\x1bOR~I\x93\x9z\x1b\xf2\x8cnV\x90\xab\x9e\x32\xc7;)\xd0'^\x10\xf9U\x9b" -"\xa7\xf9k\xf7\xc7\x1iL\xe1\x31\x33\xe6\xfb\xa2'l\x12[\x83\xf4:\x84\xcf>\x8a\xbaJ" -"\x86\xb1\x80\xf6hB&~p\xf5\xc7\x94\x30\x36\x89\x96*\xe0g)\xe,\xf8~?\xddwN\xd1s\xf9" -"\x1f\xa1\xfb\xb0\xf6\xeb\xa3\xef\x1a\x34\xe8&`Ia\xd2\xcbG\xb4\xb&\ry\xb9\xb2\xfd" -"\x1d\xe5\x84\xeay2\x9d\xc8\xecu\xe8M\xbc\xd9\xb\x88\x8cY\xe8\xf7\xe5\xe9\xfN,\xf7" -"\xad\x8c\xc5\xd6\xacjB\xbb\n\xba'#n\xe4\xd6\x8e\x99J\x1f\xa5\xe5\xec\x15\xa5\\\x15" -"\xb0\x30\x62\x97\xa6\x37\xd6in\x19\x33\xd8\xc0\xe9\xc4\xe8\x1a\x46%\xf4'\xaaG\xb7" -"\xe8U;X\nE\xc1h^`&~V>\x9a\x37\x85\xa9\xc1n2\xdf\xa6jU\xff\xcc\xc8\xeb\xce\x39V\xc1" -"\xe9w\x8b\x64%\x8e\x9i_\xae\x8kI>=/\xccL\xf6\x90N*\xb2+K\xa6\x31\xc5\x5'\xa5h\x1" -"s{\xfc\xd8\x81\xbf\x4\x99\x1bvwf/\xb\xc6p\x9b\x98\x1em\xd9\xdf\xa9\xc\xd3g.\xa0\xe" -"\x0\xbf&I\x16<= \xc6\xba\xea\xf3\xfa,\xf5l\xdc^\xcc$b\x89\x36\xbd\xc5\xa3\x9\x10" -"\xce\xe7\xaf\xb9~\xddO\x1a\x38\xfa\xb7\xfa:\\\xad\x31\xbb\xb8!\xea\x10;g\xf9\x9d" -"\xbt\xd7\xc1W\xa3Q\x14K\x9du[6\xe2P\xfd\xa9mhk\xf4\xd6\x9d{o\xd6\xbfX\x8\xf7\x15" -"\xfc\x39=\xe1[\x86\xa6\xe4\xb1\xe8x\xad\x83\x11^\x90\xed\xa0ST\xfc\x1c\xbc\x17\x34" -"\xa0$`|\x8\x1f\xc2)\xad\x35w\x0\x30\xd7}\xd1\x64\xc8\xe2U>\x97\x45\xed@\xd9\xbc\xe5" -"Bu6y:\xf0\x13\x66Z9L\xf9\x66\xf2SW\x13\xed,J?\xf8\x16\xf5\xc+\xc9\xc9\xdc\xbf\xe5" -"2#\xd0j\x0\x92h\xdaYk\xf8\x94\xce\x95\x80\xef#\xf4\xee\xe7\xdb\x88wpp\x9f~\xa8\x90" -"\x9e\xf7\x44\xba\xe\xa8Rg\xe6%s\xdb\xa5\x1c%\xf7u(\x87\n\xd3\x17\xf1\xed\x63\xb2" -"\x80/\xc5M\x81\xd1I\xa2\x12\x17\x62\xdc\xcav\xe^\xa5\xe7\xac\x32\xa1\xd4\x81\x91" -"\xd6<\xbf\x1e\x4\x9bx\xdf\xa7\xbb+\"7\xa9\xd5/qHY\xf5\xeal\x92\xd4L\x17\xb6N\xfd" -"P~,\x98 W\\\xa9\xba\x46\x2o\xbc\xc2^\xfb\xca\x84\x9a\xbcJ\x9c\x38U \xe5\xd7\xd6J" -"x}\xfd#\"\x9b\xfa\xca\x7\x85\xaa!\x9f\x31\ro\x2\x10\xe4\xaa\xfd_u\x3>\xd5`\xf1#\x96" -"Dv\x97+\xdb*\x80\x87\xdf\x61\xd0\xffG\xfe\xf5r\x0\x9a\x81\x80\x9cp!\xd6-\xbaS\xf6" -"\xb6\xa2k\x97mS\x94\xef\xf1\x9\xb3\xafX\x8c\xf8\xde\xb4K\xb0\x7\x63Rd#\xd8\x7x6\xd5" -"\xe3\xbc\xe1\x3x\xce\x95\xcf\x14\xd8s,\xca\xb6\x91\xdd\xd1?\x9a\x0\xd2\x85\xf2\xd6" -"?\xa8\xe7\xb1\x61\x36\xb1\xa8\xed\xfb\x44\xa4\x62%M\xe6\xd3\xa5\xecq\xb\x91\x84\xc2" -"\xbf\x8b#\xeb\x1a\xad\xc2\xd4\xb\xcbS\x82-\xd2\x9fN\\\xb0\x45>\x86<\x11\xaas\xe1" -"\xbb\xfc(\xe3\x36\xbd\xb5\x9c\xe3\xe8\x80\x65\xea\x9d\x8by\x99\x14\x61\xbc:\r\\\x97" -"\xfe\xba\xb0`y\xf7\xa1\xde\xfb\x82\xbc\xa1/(2\x9c\x6:\xb7&\xab|j-\xac\xda\xc6\xe1" -"\xda\x46\xe5\x82\x85\x1V\x95\xa4\xb2\x6\xd9\xe0\xa4\xdfp\x93\x3:\x9e\x42\xdd\x9|" -"j\xc0\xad\x87\xfd\xf4+\x8d\x45\x39\x36s\x14H\xdd\xd3\x87\nI\xc\xd4\x8f\xce\x94+\xae" -"j\x88\xcc\xf\x85%x\x8e\"\"\x39\xa3\x84v\x94``\xa8\xfe\xb6\x95\x96\x13\xb2\x8a\x1" -"\x9\x2\x93\xa9\xf5\x89_{P\x99\x85\xe3\x64>\xe4wR\xeb\xad\x36MTC~\xf2\xcel?\xe8jM" -"+\xe1(\x12W{\x12m\xf1\x32\xcc}`-\xc5\xecl\xee\xd3\x4\x1a\xf2\x8\xb6\x9b~\x98\xcc" -"\xadH\xb2\xe6\xd9\x9a\xb6\x7\xbb\xb3:\x19\xea\n\xd9\x41k1\xe1\x45\xd3\x93\x9e\x4" -"\xe9\xb4\xaf\xbc\xc2PL\x82\xd8y\xde\xe5\x44U\xc0\xf5\xd0\x1c\x2\x8d\x46H\xbd=;\x9c" -"\xd2\x3\x65\x37vA\x2\x0}\xf0\x35\xa9\xed\x96`\x12?\xae\xda%Zs\x85\xad\xab_\x13\xe3" -"\xfd\xc4\x90P=\x9b\x63\x1cS\x7f\x1c\x44G\xa4\xfdO\xe3\xf1\xcb\xb2\x42pT1\xa9\x85" -"\x8a\xc`\xfa\x8a\x83l0t\x97i\x80S\xcd\x8c\x62\xf2\x1a\xad\x3\xab\x6\xac\xa9 \xbc" -"\xad\x87\xf6\x8a\xfc\x45\x39\xf3\x9d\x9dgY\xb7\xc0N\x15\xed\xe5\x9b\xbc\xc0OR\x8a" -"'z\x92qR\xec\x89@\x91\x92\xf2\xe5&\xf7\x99!\xa4\xe7o\xec\xe2\x37?3u\xc3\xc0\xa3j" -"\xe1\xd6\xf3\xbd\x1bpXj\xb9\x46\x1f\x65\xdf\xc1\xc5\x65K[Z\xec_\x92\xd6\x38z\x11" -"\xbb(\xb8\x1d#f\xfe\x46:^\xa0\xf8\x19\x8a\x1f\xd8\xdf\xe0\x88\x9a(\x1e\x10\x16\xd7" -"!\x88\x2=\xe9\xc0$Gd\xe4\x80\xb8\x1\xf8\x33\x81\x36\xb\xffz5\x9V\x9\xa6\xe6\x11t" -"\xb0'L+r\x93P\x9f\x9cNN\xec)\xe,S\x8c\x2\xad\xb8w\xc8\xb2\x1f\x62\xc0p\xf5\x8c\xea" -"\x8b\xb4\x36\xd3\xb3G\x6\xdejo\xe8\xda\xe9\x31\xca\xaf\xba\x63J\xca\x19H\xda\x44" -"\xc2\xce\xf4\xd8\xbek\x19M\xb5 \xb5\xe2G\xaf\x46\xf3\x1e\xe8P}\xeb\x17" -"t\xabr\x81\xa3+\xd0\xfdnd9\xfe\xe6\xe9JI\xa8V~h\xd3\x15l\xb3\x42\x12\xea\x86\xb6" -"\xe9\x7f(fM\xad\xac\xf5\x17>d\xc7\xd3\x92\x37\xd0tK1_\xab{k\x85\xa6\xa2\x95Z\x8f" -"E\xeb\xff\xbd\x87\x9b\xda_|\xb3(\\rAP\x2x\xed\x45t\xe4\x64\xad\xb3\xd3\xf0\x7fZc" -"V\x8s\xab\xa6\xe7\xf9\xf3\xf5\xaf\xc5\x80\xd0o\xe0%K\xce\xa4\xda\x8a\xf4\xdf\xad" -"\x93\xb9\"]ck\xc\xadzDf\xd3\xel7\x8b].\x15\xe5J\r&\x86\xf9q\xb8\xa3\xa0K\xd4\x12" -"\xeaMYxK\xf7;{\x82\x15~9\x80V\xa4\x8f\xd3\x91gt \xdd\\\x85\xc3\xae\xd1G\x9\x87\x1f" -"\xa3\x19\xb5gx\x89\x2.\x1b;\x9e'\x17-\xee]\xf9\xaa`L\x98\x30|Wn)+\xbd\x17\x83k\xef" -"\x6\x8b\xe3\x41\x36S\x8e\xa7z\xd4\xa0\x0\x89O\xd8%\x1e\x99P\xfc\xc4\x1bp\xc2\xbe" -"\x93h\x15\x0V\xbc\xd4\x1b\xad\xb9\x1d\x89M\xa2\xf9\x8dY\x9b\xf2$\x12\xf\xc5\xa5p" -"(\xc8\xddU\x14\x8cx\x8a$\xf8\xfe\xb1\x9d\xa2\x37\xfc\xa4\x93\xa9\xa0\xe3\x13\xe3" -"{\xae Z\x0\x82\x9c\x9f}\xby\x3i\xf6\xcf[\x1cT\xf4\xef\xe3\x91xQ\xe9\xf6z)\xdd&M+" -"\xa0\xb1\xbd\xb0]\xe9\xc6\x89K0\xcf\x8d[-7\xa9`\xb2K\x14\xacR\xe9\x34!\xda]?.D\x84" -"\xd8p\xf3\x33\xce\x95\x44\xa9\xf5x\xed\xee\x46\xde\x93\x12[\xd6^\x5\x84=G\\d\xb2" -"\xfc\x3li\x9e\xec\xd9\xa1\xb5K\\\xa8\xc3|\x2\x36]\xfez\xfe\x91\x82\x4\xf6\xe4\x9" -"\xd2N\xf9.\x8a\xf2-\x13%\xf8K\xd3\x17\x16\xad\xd0\rS#\xd3M\xa1w\xb1\xdd\x37{w\xa5" -"\n\x8\xd8o\x13\x0\x0\x39\xbaN\x15\x1\xed\xabm\xdb\x0s\xbaxC\xe2/I\xf9<\x80\xbb}~" -"\x9\xa1,\xe\x9c*\xf0P\xfa\x39\xa8>\xcf\x87\xe6\x6r%zb\xafo6\x86\xaa\x17\xb0\xf2\x46" -"\xfc\xf1\xa1\x9\xcc/z*t\xec\xd6(I\xc7\x41\xd4]\x92\xbe\xb3\x86Kcw\xf6HXZr\x92\xf2" -"\x98\xcc\xcci\x8a\x96\xf4\xc8\x39\xed\xc7I_P\xb3$LY\xed*1" -"5\x9\xe2\x61\x32\xec)\x6p\x92\xc1%xqQ\x4\xdf\xf4\xcc\xe\x30\xec\x1d\xa6\xc1\x39\x61" -"\xb9\xf8\xb6\x8a\x88\x65\xfc\xab(\x9d\\\xba\x90M\x88\x91\xaa\x7f\xec{\xd5|\xb4\x18" -"<\xefU\xad|\xbd\xa7\x1\xd2\xcf\n\x38x\xc5*w\xe1\xe2,\xfc\xb4\xbf\x8f\xf5\xe3\xe0" -"\x83?M\xdeY\xf2\xe8\xa6\xdc^\xb9\xb6%\xf0ZeuD\\\xf9\x82g\xe4\x42\x6\x1d*\xd9\x9b" -"R\xccx\x9d\x1d\x8fi\x88\x43<\\\r\x1dKOQ\xf\x8cs\xf6\xbb\xa8\xe9)6.\xbf\x38\xd2l\x9b" -"\xe8\xae\xca\xec\x33\xf2h\xe2r]?Q\xcd\x32|H\xd2\xab\xc5.&[\xe6:*/\xc8tT\xae\x42\x0" -">\xb5\xa2\x8dl\xa5\xda-~\x8a\xbb\xb9\xe8\x43\x9bh>\x8e\x63\x1f.m\xa1\xf4\xb8\\\x4" -"\xd8\xbb\xb1s\xf,\xaa\x9\x1f\x1b\x1e\xef\x31\xe0\x8f\xa4\xdf\x9a\x9b\x9e\xb8\xc6" -"B\x1c\xd5\xbc\xc0\xf6\xde\xd6\x7f\xd1\x96\x17!:\x80\xd1\x80$\xaby\xf4\x8\xf7\xcf" -"\xe3hD\x83\x81\x9c\x85\xa0\x61\xc5;O\xe8S\xe3\x82\xa3\xa7w\x8f\xa4q\xa1\x96\xf2N" -"\x12K\x14\x36)\x92j$b\x0\x37\xe5\xf7>\xe2\x93\x1\x95\xe2\xec\xf4\xec\xd5\x34\x61" -"\xb5\xb7\xc5\xaa\x46\xc0`T\x13\x66?F\xec\xed\x8a" -">\x98\x33K\x9c*\xb4\x30\xf4\x35\xf7\x92\x17ht\xdf\x89\xf2\xf1g\\]5\xf\xa2\x17$\xa0" -"\xd2\xf1\x9ak$\xf8o\x85\x8d\n\xf6\x93M\x8f\xb8@\x16\xcf\xff%\x8b\xa1Y5\xa2\x61-O" -"\xa0m\xc5W\x95\x34\xc7\x19\x33$\xb2\x82\xa8\xf5\xa6z\x8cw\xee\xe3^\xcf/\xc7\x0Z=" -"\x8d]n\xd4\xa4\xe1\x9d\x38XH\xa8\xb9Z\xa6\x45\x45s\x81]\x1\x82\xf4\xc9:?\xac\xe7" -"-|,3\xce\xe1\x94\x99\xd1#*\xdf\xb7\x42\xe6!*l\x93\x66k\xc1\xda\xc3\xa4'\\\x12(\xab" -"\x98\xb9w\x98P\xea)\x1e\xdd\xa7\xbb\xf1K^,h\xaa&\xf1\xb8w\x92\n\xff\x9c\xa3\x7\x88" -"4\x87\x98\xb4\x42;9O\xad\x93[5\xe3\xd5\xe7\x12w\xec\x32\xb1\x42\xa3\x86\xa9o\xec" -"\xe1O\xb9m;1\xfb\x36\xb3\x64@\xa7\x1c-\x83\xc5\xda\x38\xc9\xfe\xdf\x38\x14\x8f|\xd5" -"\x87H\xbb&\x12\xbeKH\x95\xb0.\x8e\xb0\x9a[\xeuH\xcd\xe6\xc9\x39\xce\x88\x80\xeb\x89" -"\xb1\x9b>&\xf3T\xcb!\xad*1\xf8\xdbkIh?\xc7\xfdxP\xa8\x1fK\x80\x1b\xb9\xf1\x8h\x84" -"5\xa2\xb8\xff\x61v\x7\xc5p\xde\xfc\xe9\xc4Xj\xbd]\xa7\xcd*\x81\xc9<\x9eS\xc3\xec" -"\xc7\x9d\x63{\xe3\xd0\xd9\xf8\xb0\xb0\x82\x14\xaf)\xb7\xc5%\xc6\x41[\x89\xe0u\x9c" -"\\c\x89\xbf\x0\xd0\x1e\x88M\x9f\xf8k\x1b\xd3[\xa5\xd6y\xe8\xf\x93\xd2Y\xe8\x85\x88" -"\xc5\xef^\x81\xd8\x9a)\xb4\x81N\xf4\xa5L\xb3wP\x18/Pf-\xb8\xfb\xc2z\x3\xff\xb3\xd0" -"\xbc\xeb\xa5\xcc\xa6\x81\x5\xd5|,$k\x9\"+%\x92mSh\xe6'(\xac\xb1\xb9\x8f\xf5\x1e\xb1\xfej\x13\x8e\x66" -"\x3\x61\xca\xf8\xf3\x7M\xe1+q7\xdbH\x19\xbc\xa2\xb3\x94\x9\x63l\x8f\xf8\x36\x8c\x7" -"\xcc\x46TQ\x81\x8e~ro\x2\xc9\xdc\x80>\x1eS\xfa\x4\xde&\xccY\xb2K]\x86\xcd\x16\xa1" -"\xab~\xa7\x30:\xf8\xcb\xb2\xad|\xe3\x2V\x5,\xd4\xc3\xb0\x86\x44m\xb5\xbd\x86w\xa6" -"\xc8\xfd\xc1;\xfcx$#\xe9iLz`P\x1a\xde\x93\xa3\xc8g\xa5\x94\xc0L\xc0\xfb\x16&\xfd" -"\xe2\x84\xb5\x66\xea\x1eOo{y\xf4\xf2/\xe9\xc5\x86\xd2]\x8b@\xc0\xa4\x14{z+\xe2J\x83" -"\xaf\xa6_*\xdf\xf8\x16\xd6V\x19\x5-\x81\xc9\xcc\x87\xbesr3\xaa\x9\x16\xb9\xcc\x41" -"sn\xa4\x63\xfM\x10\xc0\x86z\xae\x5\x9f\"\xec\xbc\x38h\xed\xd1\x1fL\xc9}\xc4\x45\x81" -"\xc5.\xf5\xa5\x87\x9d\xa4\xe\x35\x62\x81\xbc\xe\x1er\xc0^\xf\x3\x9ag\x9f\xc\x13\x95" -"^oW\x7f\xb6\xe7\x8c\x94\x81\xe\xbc\x9cu\xd9Q\x9axh\xd4t\xb3-\x8a,b\xd7\xe8&0\x5\x93" -"%\xa9\xcd\x33\xd2\xca\x35\xd0\x36\x9b\xd4\\\xd6\xf1}\x83\xc2\xc3\x1r\x1b\xd3\xc9" -"\xc3Lh\xb0\xe7\x9\xdf\xe5\xb\x42\x8aO\x5\x17\x86\xab\x64\xf7\x7\xddNM\x8a\x7^\x6" -"W\"\xd5\xb6\x8e^\x90\x95\xc5\x18L\xd7\xc0\x12\x46\xcf\xc4\x18\xf7Y\x14\xf0\xa0\x1b" -"\x8\x8f\xff\xfa\xdf\x85\xc8I\x9c\xb1@\x8fs\x96\xb0\xd9K\xb]\xfe\x84\xe9\xa6\x19\xc5" -"^\x87$\n\x81\xaf\x16\xee\x89\x39\x84\xfe\x33\x1f\x15\xf5\x97\xcd<\x94\x15S?\x9bS" -"V>G\x8d\x8cj\x15\x9e\x42\x8a\x80m3\xf4\x61o\xfd\x81\x3\xad\"\x1a\x19\x84UG\x9{\xd9" -"\xf1\xb2\x34\xc1\xfe\xdc\xdc\xfa\r\x8f\xfe\xc3V\x13\x5\x15\xc5\xc5\x11\xfe\\[\xa8" -"\xd2_\xf6\x1e\x63ht\x1c\xc4\x66Y,\xd9 in\x96L\xfc\xb\xde\x1c^\xb\x1f\xba\xda\x15" -"\xb8q\xd8\xee\x1a\xd9K\xc4\xa4,\xbaj\xf0Rj\x6\x1d\x15\x35\xd8\xf3\xfbL\xfc\xf2I\xad" -"\xf9g.s\xa4\xafZ\xe3R\xb1\x91\x1]\xe3\x31\xdb\xff*\x88\x98\x39\xc4\xe\xa4\xd3\x15" -"\x81\x36\x4\xf4OoQ\x14M\x0\x14\xfbi\xfb\xc5\xd4\xd6M\x94\x86\xb7(]u3\xa7\x46P9 !" -"/\x1e\xe2\x8b\x61\xb9\xb4Oy\xe1]\xccQ\xfb\xfe\xdc\xb9\x1b\x9e\xab\x18\xbf\x94%%\xdf" -"\x15\xe6vD\xbdM\x5)\xfe\x44\x33\x31u\xed\x90\x9c\x6\xd6\xec\x35(\xf\xf1\x35K\xdc" -"\xfbP\x92\x95\xff\x31#\xe2\xa5\x31\x8yv\xenz\xf5\xb0\xd6\xfd\x44\xc1O\x82\xcaL\xa8" -"\x9f\xc4\x17qt^\x12\x90\xac\x86\x90\x9d\xcd\x89J6\xb\x9cT\x99\x39R,~T\xab\x92\xd1" -"\xcf\xb[\xdcL\xf8\xe9\xc8\xb9\xfdI\xb5\xf2\x46\xb6\xbbQ\xfb\xb8\x81\xebj\x11\x84" -"\xb2\x38:\xcf\xa9\xc8\x90}\xd7<\x8b\xe9\xa2\x0\xe5U\xf6t\xc7=\xe7\r\x9c\x17\x1e\xb3" -"\xa2\x13?\xc8\x5\x8c\x1a\x44\xad\xf8\xb1\x43\xac\xb4;9M\x14.\xed\x9f\xbe\xa7\xb0" -"\xcc;\xe9`\xe0\x38N\xf1\xdc\xf4\x9J\"\xe0\xb3\xb4\xb7;\x88\xec\xeQ\x83\xb2\x99o\xd9" -"\x6\xb9\xbf=\x12\xa8\x18\xc8\x17\xb1j\xfb\x99\xbf|\r\xe1\x91\xee\xf8\xae\xed\x90" -"\xfa\x13\x7f\xd2\xab\x84\xdc\x9d'\xe4\x97\x93^\xc1\xbeG\xd5\xb2U^\x98\xd1X\x6\x87" -"\xff\x82\xcb\xf0\xb9\xb7o\xe0sb\xc\xe3:$P\x9\\\xe8Y\xa8\x9eh\xa9M\x96\xfd\x9c\x8a" -"\xe0{\xb9\xd0`\x8ag\xc1}\xc1\\\xa2s\xc0\x13\xc8\x16\x15\xe\xed\x83\xd0?P.}\xbf \x8b" -"wH\x11z\xd5\x9b$\x18|`\xe4\xa4O\xac\\\x9dS\xca\x11\xa2\xf5\x42m.P7''\xc5v\x4&GH_" -"?\x6\xa7y\xc1\x1a\x39\x8e\xb9\x14@\xc7M\x85\x66T\x87\x10\x42\xa9v\xcdT\xf8\xf3\xe7" -"q\xac\x35\"j\x8b\xdd\xb8x\x84\xa1\xd7:\x88\x80\x19\xe1\x18\x45I]o5N$\xaf#\xa9\xcd" -"\xaf\xee\xba}Q|\xaf\xd8\x9cz7\x96\xee\xfc vF~[.\xf4\xa2\x44\xd2i\xfa\xd7\x41\xb2" -"KM\xde\xa4\xd5#t\xaeVUE\x7f\xa3\xfK\x8b\x1b\"\x11\nh\xbb\x90\x11\xf5^\xdf\xf5G\x83" -"\x82\xcf\xc3\xff\x17\xc3\xe5*7k\xe2\x95\xd3Ty \x12|\x96$|\x9c-\x6\x9e\xa9\xf1\n\x41" -"\xd2\x6\xe4[\"\x89\x1\xd8\xecG\xf2\x61TLK\xd1\x97\x46\x92\xecQ\x95\x83\x9a\x63\x8d" -"\xe4\x91\x2)\xf\xd0\x9f\x83\x1a\x1b[c\x98\xee\x8c#7\xb1\x8b\xa4~)\xd3\xa2(\xcc<\xf1" -"D}\xf2\xde\x31`\xb2\xf2\xea\x11\xeb\xd3\x43\r\x44\xd1v\xc1:Z\x87lk\xf1\x37\x65\xfb" -"/J\xa9\xe7\xe0\xad\x31\x1a:\x83.}N\xc3\xd0J\x15L\x4\xc5\xb\xdd~\x8\xc3)\xc0\xc6\x82" -"\xc5\x66i\xfdpM\xa7\xb4\xc4\xa5jP\xf5\xf`\xad\xc6\xa3\xf\x31T'\x6\xf8\x9/\xdf@`5" -"\x16{\xda\xfe\xf9\x81\x11\xe3\x9d=\x8b\xe1?\x5~DV,\x1b\x3\x31\x15\xc8\xc4\xad\xca" -"\xba\x90\xb7\xf7&[rg\x95,Qd\xe6\x8a\x44\x34\xb7hAx\xa1\xae\x46\xe7\xbf\x10\xe3\x44" -"\xab\x99y\x94\x61\xab\xae\x9e=NBM\xe0\xbd\x99\xa6l\xd3\xb0\xfa\xcf)\xef\x82H" -"\x91\x83\x31\x7n\xc4X\xa8_\x98\xcb\xb0\xfc\nxc\xe\x99\xdbz\xb0\xf1x\xc6)\xbbrlQ\x18" -"%\xcbr%\x14\xca\x36}\xcd\xd0g\xa7\x31\xc8\xedr2N\\\xf7\x15\xa1&\x2\xf6\xa4\x9f\x92" -"\x1f\x6\x32\x17_a^\x1d\x93\xbb\"V\x84\xb5\xf\x39\xb2me\xa0\x11\xe\x9e\xa4_\xabQv" -"?\xb7\x85\xe5\x5\x94+K\xe\r\x8d\xe2\x13V\xd5\x8c]\x87\xefiE}\xd4yD\xb3NK))<\xd5\x35" -"\xf7\xc2Zv+\xf2\x42\x33/\x12\x95]\xaa\xb\x4\xaf\x9b\xf\x1a\xe4\xbb\xcb-J\xbf\x16" -"7@8VmA\x9eq\xd8\xb9\xd9\x1a\xaf\x8b(8\xc3\xf6\x9dx\x2\xd9\x10\x1\x83~\xeai\xbeG\xf5" -"\x95\xf8\x64\xee\x3\xfe\"p\xe0UVh\xcq\x9a\xf\x33\xe2IS\xf7\xbb\xe3\r\x3\xc3\x1f\x88" -"\x12Z\x88\x8a\x9f\xc4t\x6W\x8cy\xddi\x9a\x9es\xae\xc1y\x97\x37N\xc9N\x9f\x1G\x0x" -"\x6@}\xf2\x13\xed\xf9\xfa\xe4W\xf3\x96\xe4\x3\x92\x91\xc2>\nT\xe6\xd0|(e#t\xa3g@" -"L:\x8cP\xa7N\xaaL\xee\xae\xa9\x8a\x5\xec\"\x0\x3\xa8\xf\x35\x65\xad\x5\x10\n\x39" -"|\x89\xde\xde\x62\x9b\xa9\xafg\xcd\xf1`\x8b\x8\xba\x1\xf6SD\xbd\x44\xb5\xd8\xa6U" -"\xe1\xfb\xd2R\x1b\xf\xac\x16\xb\xfb\x46()loq-\x98\xef\xef\xd2\x8c\xbe&1\xdcMS\xbd" -"\x91T\x83Xl\x96\x19\xc7\xa6\x65\xea$8w\xb4\xd3LU\rG:6\xf9\xc1\xdd\xab\xa8\x9a|rz" -"&%\xf7l\xc3\xd8sN\xfe\x91?\x4\xbfj\x9a\xba\x43Z\xb3,\xe2o!$\x99\xcbLN\x97\xda`+K" -"Q\xc3[#\x7f\x93>\xf5\x1e\x9\x1b\xea\xcb\x8e\n\xc2u\xb1\x43\x39\xe1\x32\x99\x37\x43" -"x\xff\xb3\xa0\xf2V\x91\xdd\x7f+\xee\xa5\xed\xb9\xbd\x15*\xdc\x86\xd0\x1f\xa3\xe9" -"\xac\xee\xf2\xee\xc4[\xd0\x16\xe2U\xdcX\xdf*\x9c\\\xd6J\x7\xb4\xbc\x41\xb\x37\xa1" -"7!\r\xcf!L0'\xd1\x87g&V}\x9cP\x92o\xf4U\x3\x91\x7\x9a\x2\xc7\xb4\x8|\x11\x8\xc5\x9" -"\xd8\x8fV\xdf\xcez\xc5\x97\x88\xea\x14\xa4/\xc6\x94\x19\x88*\x86\x9c\x62Ta\x88\x43" -"y\xf\x98qC\xa6\xba\x0`\x82\x97\x39\xcb\xe2\x13\xe3\x1\x94\xf2\x1d\x1-\xce\xd3\x4" -"G\x8G\xed\xc+\x8fY\x7f\xf\xd5p\xeb\x4\x41\xc3\xa1S\x84\x30\x9d\xd8?.\xef\xd3\xd2" -"v\x9\xdd\x9\xc\x5W9\x1a\x4\xbb\xf9\x11\n\xfd\xd0\r\xd5\x84\xbe\xbb\xcb\x42P\x17M" -"u\x3\xd8\x61\xb\xec\xa0\xae\x95\xaa\xba\x34\xa3\n\xbb~\xce\xf6\x8e\x10vj\xda\xc8" -"\x1a(\x14\x5\x1bOHDx\xc6k94\x84\x36hvp\x18_\x17\x17\xf8M\xa0\x62\xd4\x8f\xe0w,\x98" -"g\x13\xee\xc9\xfbZ\xf2\xdf\x8d\xda\x8d\xbdv\xaa\xcb\x89\x82\x17\x61\xf7op\xbc\x34" -"\xc9\x37vo\x16\xf0\xeX\x98\xea\x15\x31\xe8\xb4\xb4\xff\x65\xea\x1\x89\xa8\xea\xb7" -":\x3\x8\x9e ^y\x1a\x65SJ\xc9\x91\x13\xf9u\xeaR#\xb4\x38\x88\x41\xe3\x80\x1\x14\x2" -"\x0\x0\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" -"000000000000000000000000000000000000000000000\r000000000000000000000000000000000" -"0000000000000000000000000000000\r00000000000000000000000000000000000000000000000" -"00000000000000000\r0000000000000000000000000000000000000000000000000000000000000" -"000\r0000000000000000000000000000000000000000000000000000000000000000\r000000000" -"0000000000000000000000000000000000000000000000000000000\r00000000000000000000000" -"00000000000000000000000000000000000000000\r0000000000000000000000000000000000000" -"000000000000000000000000000\rcleartomark\n\x80\x3" -; -int s050000l_afm_len = 9686; -char* s050000l_afm = -"StartFontMetrics 3.0\nComment Copyright URW Software, Copyright 1997 by URW\nCom" -"ment Creation Date: 10/21/1999\nComment See the file COPYING (GNU General Public" -" License) for license conditions.\nFontName StandardSymL\nFullName Standard Symb" -"ols L\nFamilyName Standard Symbols L\nWeight Regular\nItalicAngle 0.0\nIsFixedPi" -"tch false\nUnderlinePosition -229\nUnderlineThickness 46\nVersion 001.005\nNotic" -"e URW Software, Copyright 1997 by URW\nEncodingScheme FontSpecific\nFontBBox -18" -"0 -293 1090 1010\nCapHeight 673\nXHeight 500\nDescender -222\nAscender 673\nStar" -"tCharMetrics 190\nC 32 ; WX 250 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 333 ; N excla" -"m ; B 128 -13 240 686 ;\nC 34 ; WX 713 ; N universal ; B 31 0 681 673 ;\nC 35 ; " -"WX 500 ; N numbersign ; B 20 0 481 631 ;\nC 36 ; WX 549 ; N existential ; B 25 0" -" 478 673 ;\nC 37 ; WX 833 ; N percent ; B 63 -7 771 673 ;\nC 38 ; WX 778 ; N amp" -"ersand ; B 41 -13 750 675 ;\nC 39 ; WX 439 ; N suchthat ; B 48 -13 414 503 ;\nC " -"40 ; WX 333 ; N parenleft ; B 53 -172 300 680 ;\nC 41 ; WX 333 ; N parenright ; " -"B 30 -172 277 680 ;\nC 42 ; WX 500 ; N asteriskmath ; B 65 127 427 546 ;\nC 43 ;" -" WX 549 ; N plus ; B 10 0 539 533 ;\nC 44 ; WX 250 ; N comma ; B 56 -120 194 102" -" ;\nC 45 ; WX 549 ; N minus ; B 11 239 535 294 ;\nC 46 ; WX 250 ; N period ; B 6" -"9 -13 181 100 ;\nC 47 ; WX 278 ; N slash ; B 0 0 254 673 ;\nC 48 ; WX 500 ; N ze" -"ro ; B 23 -13 471 686 ;\nC 49 ; WX 500 ; N one ; B 117 0 390 673 ;\nC 50 ; WX 50" -"0 ; N two ; B 25 0 475 686 ;\nC 51 ; WX 500 ; N three ; B 39 -13 435 686 ;\nC 52" -" ; WX 500 ; N four ; B 16 0 469 680 ;\nC 53 ; WX 500 ; N five ; B 29 -13 443 699" -" ;\nC 54 ; WX 500 ; N six ; B 36 -13 468 685 ;\nC 55 ; WX 500 ; N seven ; B 24 -" -"7 448 673 ;\nC 56 ; WX 500 ; N eight ; B 54 -13 440 686 ;\nC 57 ; WX 500 ; N nin" -"e ; B 31 -13 460 686 ;\nC 58 ; WX 278 ; N colon ; B 81 -13 193 463 ;\nC 59 ; WX " -"278 ; N semicolon ; B 83 -120 221 463 ;\nC 60 ; WX 549 ; N less ; B 26 0 523 522" -" ;\nC 61 ; WX 549 ; N equal ; B 11 142 537 391 ;\nC 62 ; WX 549 ; N greater ; B " -"26 0 523 522 ;\nC 63 ; WX 444 ; N question ; B 70 -13 412 686 ;\nC 64 ; WX 549 ;" -" N congruent ; B 11 0 537 475 ;\nC 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;\nC 66" -" ; WX 667 ; N Beta ; B 29 0 592 673 ;\nC 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;\n" -"C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;\nC 69 ; WX 611 ; N Epsilon ; B 32 0 61" -"7 673 ;\nC 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;\nC 71 ; WX 603 ; N Gamma ; B 2" -"4 0 609 673 ;\nC 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;\nC 73 ; WX 333 ; N Iota " -"; B 32 0 316 673 ;\nC 74 ; WX 631 ; N theta1 ; B 18 -13 623 686 ;\nC 75 ; WX 722" -" ; N Kappa ; B 35 0 722 673 ;\nC 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;\nC 77 " -"; WX 889 ; N Mu ; B 28 0 887 673 ;\nC 78 ; WX 722 ; N Nu ; B 29 0 720 673 ;\nC 7" -"9 ; WX 722 ; N Omicron ; B 41 -13 715 686 ;\nC 80 ; WX 768 ; N Pi ; B 25 0 745 6" -"73 ;\nC 81 ; WX 741 ; N Theta ; B 41 -13 715 686 ;\nC 82 ; WX 556 ; N Rho ; B 28" -" 0 563 673 ;\nC 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;\nC 84 ; WX 611 ; N Tau ;" -" B 33 0 607 673 ;\nC 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;\nC 86 ; WX 439 ;" -" N sigma1 ; B 40 -222 436 513 ;\nC 87 ; WX 768 ; N Omega ; B 34 0 736 686 ;\nC 8" -"8 ; WX 645 ; N Xi ; B 40 0 599 673 ;\nC 89 ; WX 795 ; N Psi ; B 15 0 781 686 ;\n" -"C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;\nC 91 ; WX 333 ; N bracketleft ; B 86 " -"-165 299 673 ;\nC 92 ; WX 863 ; N therefore ; B 163 -13 701 433 ;\nC 93 ; WX 333" -" ; N bracketright ; B 33 -165 246 673 ;\nC 94 ; WX 658 ; N perpendicular ; B 15 " -"0 652 673 ;\nC 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ;\nC 96 ; WX 500 " -"; N radicalex ; B 480 857 1090 913 ;\nC 97 ; WX 631 ; N alpha ; B 41 -13 622 513" -" ;\nC 98 ; WX 549 ; N beta ; B 61 -222 515 740 ;\nC 99 ; WX 549 ; N chi ; B 12 -" -"210 522 513 ;\nC 100 ; WX 494 ; N delta ; B 40 -13 481 740 ;\nC 101 ; WX 439 ; N" -" epsilon ; B 22 -13 427 513 ;\nC 102 ; WX 521 ; N phi ; B 27 -222 490 686 ;\nC 1" -"03 ; WX 411 ; N gamma ; B 5 -219 484 513 ;\nC 104 ; WX 603 ; N eta ; B 0 -222 52" -"7 513 ;\nC 105 ; WX 329 ; N iota ; B 0 -13 301 513 ;\nC 106 ; WX 603 ; N phi1 ; " -"B 36 -222 587 513 ;\nC 107 ; WX 549 ; N kappa ; B 33 0 558 513 ;\nC 108 ; WX 549" -" ; N lambda ; B 24 -13 548 740 ;\nC 109 ; WX 576 ; N mu ; B 33 -219 567 500 ;\nC" -" 110 ; WX 521 ; N nu ; B -9 -13 475 513 ;\nC 111 ; WX 549 ; N omicron ; B 35 -13" -" 501 513 ;\nC 112 ; WX 549 ; N pi ; B 10 -13 530 500 ;\nC 113 ; WX 521 ; N theta" -" ; B 43 -13 485 686 ;\nC 114 ; WX 549 ; N rho ; B 50 -220 490 513 ;\nC 115 ; WX " -"603 ; N sigma ; B 30 -13 588 500 ;\nC 116 ; WX 439 ; N tau ; B 10 -13 418 500 ;\n" -"C 117 ; WX 576 ; N upsilon ; B 7 -13 535 513 ;\nC 118 ; WX 713 ; N omega1 ; B 12" -" -13 671 583 ;\nC 119 ; WX 686 ; N omega ; B 42 -13 684 513 ;\nC 120 ; WX 493 ; " -"N xi ; B 27 -222 469 766 ;\nC 121 ; WX 686 ; N psi ; B 12 -222 701 513 ;\nC 122 " -"; WX 494 ; N zeta ; B 60 -222 467 756 ;\nC 123 ; WX 480 ; N braceleft ; B 58 -16" -"5 397 673 ;\nC 124 ; WX 200 ; N bar ; B 65 -177 135 673 ;\nC 125 ; WX 480 ; N br" -"aceright ; B 79 -165 418 673 ;\nC 126 ; WX 549 ; N similar ; B 17 196 529 325 ;\n" -"C 160 ; WX 762 ; N Euro ; B 53 -4 722 671 ;\nC 161 ; WX 620 ; N Upsilon1 ; B -2 " -"0 610 687 ;\nC 162 ; WX 247 ; N minute ; B 27 476 228 735 ;\nC 163 ; WX 549 ; N " -"lessequal ; B 29 0 526 639 ;\nC 164 ; WX 167 ; N fraction ; B -180 0 340 673 ;\n" -"C 165 ; WX 713 ; N infinity ; B 26 115 688 414 ;\nC 166 ; WX 500 ; N florin ; B " -"2 -174 494 687 ;\nC 167 ; WX 753 ; N club ; B 86 -26 660 544 ;\nC 168 ; WX 753 ;" -" N diamond ; B 142 -36 600 550 ;\nC 169 ; WX 753 ; N heart ; B 117 -33 631 528 ;" -"\nC 170 ; WX 753 ; N spade ; B 113 -36 629 591 ;\nC 171 ; WX 1042 ; N arrowboth " -"; B 24 -16 1024 512 ;\nC 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;\nC 173 " -"; WX 603 ; N arrowup ; B 45 0 571 910 ;\nC 174 ; WX 987 ; N arrowright ; B 49 -1" -"5 959 511 ;\nC 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;\nC 176 ; WX 400 ;" -" N degree ; B 50 380 350 686 ;\nC 177 ; WX 549 ; N plusminus ; B 10 0 539 662 ;\n" -"C 178 ; WX 411 ; N second ; B 20 476 413 735 ;\nC 179 ; WX 549 ; N greaterequal " -"; B 29 0 526 639 ;\nC 180 ; WX 549 ; N multiply ; B 17 9 533 525 ;\nC 181 ; WX 7" -"13 ; N proportional ; B 27 114 639 416 ;\nC 182 ; WX 494 ; N partialdiff ; B 26 " -"-10 462 753 ;\nC 183 ; WX 460 ; N bullet ; B 50 155 410 518 ;\nC 184 ; WX 549 ; " -"N divide ; B 10 2 536 525 ;\nC 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;\nC" -" 186 ; WX 549 ; N equivalence ; B 14 87 538 446 ;\nC 187 ; WX 549 ; N approxequa" -"l ; B 14 121 527 408 ;\nC 188 ; WX 1000 ; N ellipsis ; B 111 -13 889 100 ;\nC 18" -"9 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;\nC 190 ; WX 1000 ; N arrowhor" -"izex ; B -60 220 1050 276 ;\nC 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 62" -"9 ;\nC 192 ; WX 823 ; N aleph ; B 175 0 662 689 ;\nC 193 ; WX 686 ; N Ifraktur ;" -" B 10 -54 578 736 ;\nC 194 ; WX 795 ; N Rfraktur ; B 26 -16 759 730 ;\nC 195 ; W" -"X 987 ; N weierstrass ; B 159 -211 870 574 ;\nC 196 ; WX 768 ; N circlemultiply " -"; B 43 0 733 691 ;\nC 197 ; WX 768 ; N circleplus ; B 43 0 733 689 ;\nC 198 ; WX" -" 823 ; N emptyset ; B 39 -24 781 718 ;\nC 199 ; WX 768 ; N intersection ; B 40 0" -" 732 507 ;\nC 200 ; WX 768 ; N union ; B 40 -18 732 489 ;\nC 201 ; WX 713 ; N pr" -"opersuperset ; B 20 0 673 470 ;\nC 202 ; WX 713 ; N reflexsuperset ; B 20 -125 6" -"73 470 ;\nC 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;\nC 204 ; WX 713 ; N " -"propersubset ; B 37 0 690 470 ;\nC 205 ; WX 713 ; N reflexsubset ; B 37 -125 690" -" 470 ;\nC 206 ; WX 713 ; N element ; B 45 0 505 470 ;\nC 207 ; WX 713 ; N notele" -"ment ; B 45 -58 505 555 ;\nC 208 ; WX 768 ; N angle ; B 26 -1 738 672 ;\nC 209 ;" -" WX 713 ; N gradient ; B 36 0 681 687 ;\nC 210 ; WX 790 ; N registerserif ; B 50" -" -13 740 690 ;\nC 211 ; WX 790 ; N copyrightserif ; B 51 -13 741 690 ;\nC 212 ; " -"WX 890 ; N trademarkserif ; B 18 269 855 673 ;\nC 213 ; WX 823 ; N product ; B 2" -"5 -124 803 751 ;\nC 214 ; WX 549 ; N radical ; B 10 -35 515 913 ;\nC 215 ; WX 25" -"0 ; N dotmath ; B 69 209 169 311 ;\nC 216 ; WX 713 ; N logicalnot ; B 15 40 680 " -"367 ;\nC 217 ; WX 603 ; N logicaland ; B 23 -1 583 476 ;\nC 218 ; WX 603 ; N log" -"icalor ; B 30 -1 578 476 ;\nC 219 ; WX 1042 ; N arrowdblboth ; B 27 -19 1023 506" -" ;\nC 220 ; WX 987 ; N arrowdblleft ; B 30 -19 939 506 ;\nC 221 ; WX 603 ; N arr" -"owdblup ; B 39 0 567 909 ;\nC 222 ; WX 987 ; N arrowdblright ; B 45 -19 954 506 " -";\nC 223 ; WX 603 ; N arrowdbldown ; B 44 0 572 909 ;\nC 224 ; WX 494 ; N lozeng" -"e ; B 18 -1 466 740 ;\nC 225 ; WX 329 ; N angleleft ; B 25 -152 306 757 ;\nC 226" -" ; WX 790 ; N registersans ; B 50 -12 740 679 ;\nC 227 ; WX 790 ; N copyrightsan" -"s ; B 49 -12 739 679 ;\nC 228 ; WX 786 ; N trademarksans ; B 5 277 725 673 ;\nC " -"229 ; WX 713 ; N summation ; B 14 -123 695 752 ;\nC 230 ; WX 384 ; N parenlefttp" -" ; B 40 -293 436 926 ;\nC 231 ; WX 384 ; N parenleftex ; B 40 -79 92 925 ;\nC 23" -"2 ; WX 384 ; N parenleftbt ; B 40 -293 436 926 ;\nC 233 ; WX 384 ; N bracketleft" -"tp ; B 0 -80 341 926 ;\nC 234 ; WX 384 ; N bracketleftex ; B 0 -85 55 925 ;\nC 2" -"35 ; WX 384 ; N bracketleftbt ; B 0 -80 340 926 ;\nC 236 ; WX 494 ; N braceleftt" -"p ; B 201 -75 439 926 ;\nC 237 ; WX 494 ; N braceleftmid ; B 14 -85 255 935 ;\nC" -" 238 ; WX 494 ; N braceleftbt ; B 201 -70 439 926 ;\nC 239 ; WX 494 ; N braceex " -"; B 201 -79 255 925 ;\nC 241 ; WX 329 ; N angleright ; B 21 -152 302 757 ;\nC 24" -"2 ; WX 274 ; N integral ; B 2 -107 291 916 ;\nC 243 ; WX 686 ; N integraltp ; B " -"332 -83 715 922 ;\nC 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ;\nC 245 ; " -"WX 686 ; N integralbt ; B 39 -81 415 921 ;\nC 246 ; WX 384 ; N parenrighttp ; B " -"54 -293 450 926 ;\nC 247 ; WX 384 ; N parenrightex ; B 398 -70 450 935 ;\nC 248 " -"; WX 384 ; N parenrightbt ; B 54 -293 450 926 ;\nC 249 ; WX 384 ; N bracketright" -"tp ; B 22 -80 360 926 ;\nC 250 ; WX 384 ; N bracketrightex ; B 305 -85 360 925 ;" -"\nC 251 ; WX 384 ; N bracketrightbt ; B 20 -80 360 926 ;\nC 252 ; WX 494 ; N bra" -"cerighttp ; B 17 -75 255 926 ;\nC 253 ; WX 494 ; N bracerightmid ; B 201 -85 442" -" 935 ;\nC 254 ; WX 494 ; N bracerightbt ; B 17 -70 255 926 ;\nC -1 ; WX 250 ; N " -".notdef ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n" -; -int s050000l_pfb_len = 33709; -char* s050000l_pfb = -"\x80\x1\xfb\x15\x0\x0%!PS-AdobeFont-1.0: StandardSymL 001.005\n%%CreationDate: T" -"hu Oct 21 1999\n% Copyright URW Software, Copyright 1997 by URW\n% URW Software," -" Copyright 1997 by URW\n% See the file COPYING (GNU General Public License) for " -"license conditions.\n% As a special exception, permission is granted to include " -"this font\n% program in a Postscript or PDF file that consists of a document tha" -"t\n% contains text to be displayed or printed using this font, regardless\n% of " -"the conditions or license applying to the document itself.\n12 dict begin\n/Font" -"Info 10 dict dup begin\n/version (001.005) readonly def\n/Notice (URW Software, " -"Copyright 1997 by URW. See the file COPYING (GNU General Public License) for lic" -"ense conditions. As a special exception, permission is granted to include this f" -"ont program in a Postscript or PDF file that consists of a document that contain" -"s text to be displayed or printed using this font, regardless of the conditions " -"or license applying to the document itself.) readonly def\n/Copyright (Copyright" -" URW Software, Copyright 1997 by URW) readonly def\n/FullName (Standard Symbols " -"L) readonly def\n/FamilyName (Standard Symbols L) readonly def\n/Weight (Regular" -") readonly def\n/ItalicAngle 0.0 def\n/isFixedPitch false def\n/UnderlinePositio" -"n -229 def\n/UnderlineThickness 46 def\nend readonly def\n/FontName /StandardSym" -"L def\n/PaintType 0 def\n/WMode 0 def\n/FontBBox {-180 -293 1090 1010} readonly " -"def\n/FontType 1 def\n/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def\n/E" -"ncoding 256 array \n0 1 255 {1 index exch /.notdef put} for \ndup 32 /space put\n" -"dup 33 /exclam put\ndup 34 /universal put\ndup 35 /numbersign put\ndup 36 /exist" -"ential put\ndup 37 /percent put\ndup 38 /ampersand put\ndup 39 /suchthat put\ndu" -"p 40 /parenleft put\ndup 41 /parenright put\ndup 42 /asteriskmath put\ndup 43 /p" -"lus put\ndup 44 /comma put\ndup 45 /minus put\ndup 46 /period put\ndup 47 /slash" -" put\ndup 48 /zero put\ndup 49 /one put\ndup 50 /two put\ndup 51 /three put\ndup" -" 52 /four put\ndup 53 /five put\ndup 54 /six put\ndup 55 /seven put\ndup 56 /eig" -"ht put\ndup 57 /nine put\ndup 58 /colon put\ndup 59 /semicolon put\ndup 60 /less" -" put\ndup 61 /equal put\ndup 62 /greater put\ndup 63 /question put\ndup 64 /cong" -"ruent put\ndup 65 /Alpha put\ndup 66 /Beta put\ndup 67 /Chi put\ndup 68 /Delta p" -"ut\ndup 69 /Epsilon put\ndup 70 /Phi put\ndup 71 /Gamma put\ndup 72 /Eta put\ndu" -"p 73 /Iota put\ndup 74 /theta1 put\ndup 75 /Kappa put\ndup 76 /Lambda put\ndup 7" -"7 /Mu put\ndup 78 /Nu put\ndup 79 /Omicron put\ndup 80 /Pi put\ndup 81 /Theta pu" -"t\ndup 82 /Rho put\ndup 83 /Sigma put\ndup 84 /Tau put\ndup 85 /Upsilon put\ndup" -" 86 /sigma1 put\ndup 87 /Omega put\ndup 88 /Xi put\ndup 89 /Psi put\ndup 90 /Zet" -"a put\ndup 91 /bracketleft put\ndup 92 /therefore put\ndup 93 /bracketright put\n" -"dup 94 /perpendicular put\ndup 95 /underscore put\ndup 96 /radicalex put\ndup 97" -" /alpha put\ndup 98 /beta put\ndup 99 /chi put\ndup 100 /delta put\ndup 101 /eps" -"ilon put\ndup 102 /phi put\ndup 103 /gamma put\ndup 104 /eta put\ndup 105 /iota " -"put\ndup 106 /phi1 put\ndup 107 /kappa put\ndup 108 /lambda put\ndup 109 /mu put" -"\ndup 110 /nu put\ndup 111 /omicron put\ndup 112 /pi put\ndup 113 /theta put\ndu" -"p 114 /rho put\ndup 115 /sigma put\ndup 116 /tau put\ndup 117 /upsilon put\ndup " -"118 /omega1 put\ndup 119 /omega put\ndup 120 /xi put\ndup 121 /psi put\ndup 122 " -"/zeta put\ndup 123 /braceleft put\ndup 124 /bar put\ndup 125 /braceright put\ndu" -"p 126 /similar put\ndup 161 /Upsilon1 put\ndup 160 /Euro put\ndup 162 /minute pu" -"t\ndup 163 /lessequal put\ndup 164 /fraction put\ndup 165 /infinity put\ndup 166" -" /florin put\ndup 167 /club put\ndup 168 /diamond put\ndup 169 /heart put\ndup 1" -"70 /spade put\ndup 171 /arrowboth put\ndup 172 /arrowleft put\ndup 173 /arrowup " -"put\ndup 174 /arrowright put\ndup 175 /arrowdown put\ndup 176 /degree put\ndup 1" -"77 /plusminus put\ndup 178 /second put\ndup 179 /greaterequal put\ndup 180 /mult" -"iply put\ndup 181 /proportional put\ndup 182 /partialdiff put\ndup 183 /bullet p" -"ut\ndup 184 /divide put\ndup 185 /notequal put\ndup 186 /equivalence put\ndup 18" -"7 /approxequal put\ndup 188 /ellipsis put\ndup 189 /arrowvertex put\ndup 190 /ar" -"rowhorizex put\ndup 191 /carriagereturn put\ndup 192 /aleph put\ndup 193 /Ifrakt" -"ur put\ndup 194 /Rfraktur put\ndup 195 /weierstrass put\ndup 196 /circlemultiply" -" put\ndup 197 /circleplus put\ndup 198 /emptyset put\ndup 199 /intersection put\n" -"dup 200 /union put\ndup 201 /propersuperset put\ndup 202 /reflexsuperset put\ndu" -"p 203 /notsubset put\ndup 204 /propersubset put\ndup 205 /reflexsubset put\ndup " -"206 /element put\ndup 207 /notelement put\ndup 208 /angle put\ndup 209 /gradient" -" put\ndup 210 /registerserif put\ndup 211 /copyrightserif put\ndup 212 /trademar" -"kserif put\ndup 213 /product put\ndup 214 /radical put\ndup 215 /dotmath put\ndu" -"p 216 /logicalnot put\ndup 217 /logicaland put\ndup 218 /logicalor put\ndup 219 " -"/arrowdblboth put\ndup 220 /arrowdblleft put\ndup 221 /arrowdblup put\ndup 222 /" -"arrowdblright put\ndup 223 /arrowdbldown put\ndup 224 /lozenge put\ndup 225 /ang" -"leleft put\ndup 226 /registersans put\ndup 227 /copyrightsans put\ndup 228 /trad" -"emarksans put\ndup 229 /summation put\ndup 230 /parenlefttp put\ndup 231 /parenl" -"eftex put\ndup 232 /parenleftbt put\ndup 233 /bracketlefttp put\ndup 234 /bracke" -"tleftex put\ndup 235 /bracketleftbt put\ndup 236 /bracelefttp put\ndup 237 /brac" -"eleftmid put\ndup 238 /braceleftbt put\ndup 239 /braceex put\ndup 241 /anglerigh" -"t put\ndup 242 /integral put\ndup 243 /integraltp put\ndup 244 /integralex put\n" -"dup 245 /integralbt put\ndup 246 /parenrighttp put\ndup 247 /parenrightex put\nd" -"up 248 /parenrightbt put\ndup 249 /bracketrighttp put\ndup 250 /bracketrightex p" -"ut\ndup 251 /bracketrightbt put\ndup 252 /bracerighttp put\ndup 253 /bracerightm" -"id put\ndup 254 /bracerightbt put\nreadonly def\n/UniqueID 5021339 def\ncurrentd" -"ict end\ncurrentfile eexec\r\x80\x2\x8ak\x0\x0\xe9\x8d\x9\xd7`\xa3\xc2,\xf1\x19\xf9" -"\xdci\x9a\"\xc3[[5\xedj\xa2\x35\x93\xc7mT\xca\xbb^\x94+\xf7\xd6\xdd\x84\xf1\x66K" -"\x89i\x9ct\xb4r\xde\x9f\x8em\xf9%\xf6\xc4\xf2\x4\xe9\xf1\xc6\x39\xb4\xdb\xa9\x88" -"\xed*\xc4\x19\xff++\xde`[\x8e\xe3&N\xdd\x66\x41-O!\xc6J\xc5\"\xbd\xfc|U\x2\xf9\xc3" -"\xf3\xe5Y+; \x93\xd3<\x9b\xfa\xed\xd2\xd4\x9e\x89\xaa\xba\xa8\x32\xe2?\x6.\x91\xa2" -"P2Q\x9d\x18h\x81nD\xb4\xe0tw\x95\x0=y0)\x9dn\x1e*[\xfe\rY]\xc9~\x14\x9\x89\xce\x81" -"\xd8\xd7\xf8R\xff\x9c\xdcz\x1b\x1bY\x8ci\x13\x1d\xee\x0[AX\x5\xa1m\x8a\x13\xe5\x92" -"v\x17\xae\x7f$zq\xce\xc}V\xaf\xd7]\x85\xed-\x9f \xff\x9al8\xe8\xd5 Q\x97\xd0\x87" -"\x80\x18\xc\xca\x9c\x35R+\x16\x9\xb5\x1rMMd\x0\x16\x9b\x91\xbc\xebjM\xe0\n\xfcx\x1c" -"\xf8\x87\x30\x12\xb3\x11}\"\xa1\x85\x87\x89UC\xdb\xc2\xa1\xff\xc7u#v\xde\xcdL\x92" -"\xa6\x91\"\x42X\xe8\xf8\xf1\x13\xf2\xa5\xcb=\x8d\xa1\xf\xe8#\xc6\x65j\x88\x0\xcb" -"\xc7\xff\xd0\x18\xa2\x8a\xc2\x88_5\xe2.\xf9\xfbT\x9b\x0\xe2=1\xbb\xa3\x4\xdd\x9c" -"(\xdf\x2\xa8\xc3p\xceI\xc5\x8a@\xc9\xf6s\xad\x61\xf5\xab\xee\x9d\x62\xeb\xacY\xb" -"ZD\xf2\xba\xbd\x96\xe1\x37\x46M\xb0\x66\xb6\x2\xa5\xd8\xd4>\xd0\x41\xb7\x80\xf0\xfb" -"\x98\xf9\x95/ \xad\x80\x84\x19\x9a\xdf\xee\x9e\xcb\x19<\x1\x87r\xe6:Z\x83\xbb\x6" -"\x0\x96/\xe7$\xf6\x33Q\xb4\xb7\xa1\x64\x12t:\xd1J8A\x88wv\x8a\xf4#\xe3\x34\x8dH\xed" -"w<.\x87\x62L\xfe\xf7w\xa1[hr\xf5\x44\x88\xe4,HI\xaemT\xcb\x85}\xc0\x97.\x1bW\xc8" -"\x8f@\xb8\x99(\xea\x43\xc1\x8d\xbcs\x18/i\xb5/\xb\xd6kq3\x88\x16vaj\xb6ir2@\xf1}" -"^\xaa\xa2|\x8e)Xb(\x8d\xc3\x9\x18\xd0\x0\x8\xc9Y*Q\xf3\x9e\x30\xdd\xc4\x62\xf6(v" -"T\xec\xcc\x13\xfb\x95%\xf6\xea\xc5p\x9e\x95/\xb2\x37\xe8\xcb\x8p\xca\xc5\xdd\xc1" -"=\xa5\x8d\xbd\x6\r\x31\x93\xfc\x92\xe6\xc4\xce\xf3\xbc\xfd\x81\xcek6y\xbf\xc5\x85" -"W\x96\xcd\xfa\x8a&\xd6:e\x9a/\xf7\xa1\xa7\xe3\x18\xa7\xf7o\xf8\xe\x84j-d}8\xe8'\xff" -"\xafT\xbdZ\x92!\xee\xb4\x16\xa4u\xea\xbfN\xf0@\x9b<\xc1Pw\xe0\x1ft,F\xed\x43\xca" -"r\x92L2\xe4\x8axb$c9f\x80\xca\xc3\x63@lRJ\x9b;v\x8c\xd5\xa6\x89&C\xf7\x8b|\xd6\\" -"a\xe\xbf\xeb\xd1\x5\x8d\xfe\xeag\xd8\xa9\xb9\xaf\xd9\xbf\x39\x3:V\x85\x65\x37\xc0" -"ou\xba\xb0\xa4py\xdf\xf6L\xf7\x34<\xd6\xe7\xfe{\xb1\xfb\xce\xe3'I\xc9\x14\x35\xcb" -"\x86\xf7U\rP\\\x81\xde\xff\xbe\x1e:\x1f\x63\x4\xdd\x3\xcd \x84+3]\x7f\xcen\xb3\x1f" -"\x17W$\xd5\x1c\x18H\x0\xc3um\xb0\x44\xe2\xfe\x4\xbfS\xe9\x95\xfb\x42Z\xac\x96\xfc" -"\xef\x38L\x93\x3\x34\xb5\xf3\x84Sl\xb3\xab\xd9\x84G\x84K\xab\xf0L\xa7g\xed\xb7\x7" -"\x86\x13,yl\xc2\xf6S\x8R'Z\xb4\xdf\xc\x8bM.\xae\x1\x38\xe\xd2Nb\xf5\xa8]\xc8\x34" -"]Ulg\xf0\xf\x62-2\xdd\x66\xfe\x18!\x91i\xda\xca\x37\x44\xa8\x19\xcf\xac\xc3\x5\xfc" -"\xa9G\x1a\r\xe5\x93n'\xe;-N\x12\x11\xd9\xda\x8d\xe2ny\xcoV\xc2\xce\x8b\x19\xe1u%" -"n\x8b\xf8[\x8eR\xdb}\xa8\xc4O\xe5.W\xafH\xde\x9bw\x16X\x13\x9bk\x81\xb3`\x92\xec" -"\xe2\xb6)\xc0\xf6M1\xd6-\xc7\xd4\"\xc2\xa2\x4\xbc\x4\x14\xccox\xf4\xe9u\xbf\x8f'" -"\xa1|\xc3\xb3[1\xed\x31;Rt\xf4\x87\xa9.\xbb\x33\xb0*\xf4r\xeb\xd8LK\x1b@\x6\xe5\xc5" -"\"\x8aor\"\xda\xb4\x90%\x9d\xe2\"?L\xbc\xdd\x0jeI\xf0\x80\x85\xea\xea\xe5\x1eM{\x8" -"\xac\xc8\xb0\x8e\x8f\x98\xdb\xf7\x9e\xd4\"\x1\x32\xa7U\xc0\x7\x36\x66\x0\xfc'\xe0" -"\xba\xdds\xc8u\x7Ko!\x1d\xa0_\xf1\x45G0\xf3\xdd\xfe\x96\xd3l\xa1/\x82I\xcb\xe7L\x82" -"\xa9@\xf1\xd6\x2\x5\xcd\x96$\xae\xb7\x82M[\n\x15x\xeb?\xd4_\xfd\xb9~f\xbf\xf\xaa" -"'\xbc%\xe6\x31\xc2\x6t\xe7\xd6\xdb^L\xc7\xb1\xf:ws\x1a\xa3\xa5:\x18~R\x11\xda\x39" -"\xf2\xe9|\x2\x36\xe3o\x87\x14\xc4\x9d\x63\xen\x1f\xb4\"\x6\xca\xd9\x36\x17\x94\xa9" -"\xe0\x2\x36\x9c\xcc\x65\x87\xf9\xa4\xcb\xce\\\xfd\xe2\x66V\xdd\x8a\x36\x66<\xa8." -"\xfc\x1e\x93\xccX\x86>:)\x0\x90\x90\x62 \x92?TN\x8c\xa0^\\\x83w$\xaf\xc6t\xe6\x0" -"\x82x\xfc\xc6\x96\x46,\xd7\x98j\xa3\xb8\x84\xed\\\x17\xf9\xd0\x35\xb9\xa1\xa1i\xd9" -"\xf8\xf2\x88u\xf7\xe5\xd7\xba\xb3\x46h\xb6\x1d\x2ow\xe3rw\xd5>\x9e\x4g\x15/j\xc7" -"\xabV\xae\x92\x6\xf1Qws.\xad{*\x0\x37\x99\x86'r\xb2\x41\xd6X\x18\xc0\xd2\xd6\xc5" -"?\xd0\x94\\\xaa\x17\x19\xdb\x44o|\xe5\xc3\x83\xf2\x8b\xb1\xf4\x19\xf0#\xf3\xde\xf2" -"\x4\xe8\x95\xb8\x5t\x7\x64\x8e\xfe\x19s\xdc\x8f{\x8c\x17\xab\xaa\x17\x16\xabi\xf3" -"\xbf\x5u\xf5\x64\xc3@\xf\xb5[\xc4\x30\xf4U\xb2\x66\x87\x1eui\xc3\x9a\x81\xbd\xb0" -"\x82\xfaQ4#\x92r\xf9\xd6\x9d/[\xe4\x93)%U\xa5\x11Z\r\xbd\xf3\r\xa7\x1b\xdd\xa4\x18" -"\xcdXu\xbf,\xc\xcf\x0\xe2\x36\xf2\xc9pV\xb1\x2\xe8\xe0\x14\xc2\xc1\x18\xa7l\xf7\x9c" -"\x10\xfe)!\xd3 \"\xb8\xf9\x64\x43\xbf\xa1\xb3\x41\x89\xe5\xc5\xab\xcf\xecQ\xad \xcc" -"E\x8\xacSvi\xb\xcf\xe0\x1d\xc8\xf9$\xfa\x19\no\x12\x95\xc1\\t\xdd\xad^\x9c@G\xad" -"\x1\x45v\x85\x8a&_\xfc\xe0\xbe\x9ew\xe7\x63\xe9\x11\xbb\x66#Y\xdf\x98\xddvsg\xda" -"\xe1\xb6\x86\xee\xde\xca\xe1\xf0\xc9\xcb\xc5K\xc4\xcd\x46\xe5\x14q%k\xd3@\xb3\x38" -"\xc3\x8d\xcb\xd6\xd3'\xfem#H\xb4\xeb*\x1c\x95\xbf\x8/.J\x1b\xda\xdb\xe3I\xfb\x33" -"\x1a\xe9\xea\x0,` \x97tbeEZ\\`\xa7\xc0\xbb\xd2\xf4\x7\xc8\xa7\xe5\xfe\x9f\xbe\xa4" -"\xbd\x8e\xc9\x96%\x42\xe2\xe3\x2\x1a\xc\xa4\xf;?\xfd\xb7\x90Y!g\xaf\xb2\x1d\xbb\xb9" -"\xec\xa9\x1-\x6\x8o\x1d\xe6t\x9f\xf3\xc6;\xe3n\nU\xa9\xa1\x3@m\x8c\xcc\x9Yu\x87/" -"\xe8\x95\xb8\xc4:*DZ\xfa^\x3\xc7\x90$\x89\xd4\xf4\xc4\xa9\xac\x82\x91!\xe5\x32\xc6" -"`L\x5\x9c\x35VR\xfc\x9c/\x16\xa5S\xd5\x36\x8b\xa0u-\xfd\xcaL\xe\x9b\x94K\xd1\xc2" -"\xd1\x15\xc2^D!\xeb\xe4\x12\xb1q)\n\xb0\xd0\xe5\xb0\xb2\xc4+\xbeX\xa4\xeb\x39\xea" -"a\xc7\x10Im\xd8\xa4\xf0\xdevu\x9f]U\xf5W\"JK\x95I\xce\xa2\x1b\x8f\xe2w\xfcXH\x8f" -"\xc3i\xd9\xc0\xf1\xa3\xdcR\xb8T!%\xbb\x42V\x1bYK\xdf\x33\xbe\x43\xae\xf9?\x0\xee" -"\\`'J\xff\xc0T\x84\xb0\x1\x1d\x8c\x46_V\xbb\x9d\x4\xfe\xb8\x8bm\xe5O\xc2\x10K\x7" -"\xdc^\xc8\xcd\x41\x9d\x9fY~_M\xdf\xc0\xbb\xb0\xe9 b\x9f\xdf\x6I+\xecx\xc9p\xc1\xe6" -"e=K\xbf\x92\xd3\xf1\xca\xbd\xc4\xfb\xae\x38\xb\"\xf1\xdbn\x8a\xa9\xb0P\xe3:8M\\\xad" -"\x95\x43\xa3\xad\xbf\x91\xa4\xa9@Yp] \xd9\x6\xfc|\xeb%w\xcaP\x4\x33\x9e\xcb\xd2\xa3" -"g\x9f)\xeb\x43\xc8\x92G\xfa\x11\x35\xb\xad\x35\xeb\xc9\x38\xbb\xd7\x45\xf7tr}\xe9" -".\xb7\x8b\xfc\xbd\xb1\x9\xc5@\"\xad\x9\xc2\x1e\x85`\r\xcbp\xcb\x1bQ\xae\xea\xb9\xcc" -"\xe5{\x8b\x14\xc5N\xeb\x1e\x95j\x8c\x39\x61tr\x16X\x8\"\xc5\x31\xbe\xa4\x5\x13\x18" -"(:<\xf1\xf6\x12\x36\xbM>\xd7\x85\xecv\xc5\x9e\xa4u\xc1[\x15\xe9\xe1\x93\x14\xbf\xc6" -"\xa1(\x92I\x1c\xd9\xd7\xcb:\xfd\x90 \xbd(\xb6\x85\x12\x9e\xf9\xe2\xc1Q\xc5\x95\x99" -"\xf1\xe8\xe1>\xea\x8f\xb5tl\xce\x8a\xe3\x17i\x1a(\xd2\x63\xc7w\x14\xe5\xf4\x1\xf9" -"\xed\xae\xf0\x85\xb7*\x86\xa9\xcf]\xfdVs\x9e;\xfc\xabI)g\x9e\xf1\x11\xd2\x33x\xa4" -"CD\xc\xf9R=;\xf2?\x9b\xdc\xdc\xd7\xf2\xc4\ru\x9\x9f\x37w\xe6on?\x1a\xe4\xde\xf3\xd5" -"\xb0\x62\xff\xbb/\xbd\xa4\xb9\x38\xf8\xft\xb6\xbe\x30\x32\xbb\xa7\x7f\x99P\x18xV" -"\x7fH\xa6N\xb0\x9f\x16\x84\xf0\x95\xf8\xb4\xe4\x7\xa7\x8c\x96H%\xab\xdbq\xfa\xad" -"\xb4*\xab|A\xe1\x46\xff\xd2\x1a\xc7\x42W@I\xdc\xa2W\xe9\xf3\xd4\xce\x46\xd2\x0\xf7" -"v\xedy\x15\xee\xa1\x91^2\x11w\x96=\xed\xb2\xa2L\x87\x1\xd7\n&XV\x8c\xf1\x31?\xdc" -"Af\xe6\xeaY\xa4\xbd\x30\x9\x30\x91\x1c\x13\xb7\xbfNr\x1/\xc9\x9c\xcc\xda;\x8cm\x7" -"\xfe\xbf\x15\xc0\xa1\\\x1\xb2 \xa6\xdf\xbb\x1d\x80\xce\xeds\x81+\xe5%\xe5\xb7\xb3" -"[\xad\x9bgr\xc6g<\xa1\xf5\x80\xff\xf1o<\x96\xb9\xb9\xb7\xf0\x41\xae\xd5\xc\xdf\xcf" -"rF\xdb xt6\xc9\xe2\xb8pm8Y\x13r\xba\xda\xc2\x19\xb8=\xdb;\xfa\x1a\xf8S\xaa:}\xa4" -"\x1b\x16\xbd\xf5\xe4,\x82w\xc2\xccs\xc1\xc9\xf6h\x93\x1e\x66\xadU#\xd4\x35\xdb\xe6" -"\x80q\xd0V\xcb\x8f\xe1\xde\x17\x9cRD\xccQ\x1d@\xbb\xa8\x31\x1d\x97j! \xa6\xc4n\x85" -"\xb9\x39)\x1f`9L\x91\x1e\x30\xa2\x14\xad\x3\xbf\xe5\x8a\x3\xe9/\xc6{\xfe\x81\xb8" -"(\x2\x8e&6P\xd2{\x6\x45X\xe3\xebr\xf0\x1b@\xcaL\xf0)\xb6\xf1\xc1\x84\x31\x93\xfb" -"#r\x1f\x1fo\x19\x92/\x82\x1c(\xec\xd4\x34\xf\x10\xe9n\xb3\x8bx\x8cX\x9c\xb8\x81[" -"\xb7\x8\xb0\xc4l7\x8e\x8c\x16\xea\xccr\xcc\xf9\xca\xb\x9e\xbd\xb0\xb4\x90j\xf5\x8f" -"\xc5\xcb\x8e}b\x19\x1f\x1c\x11\x94;\xb7m\x82%\x12X\xc4\xb2Q\xaa\x95\x61\xd4*\xdc" -"\xf0\xa5\xf9\x18I\x1e\x6;j\x88\xcd\xf4\xe0\xc8\xd4\x1c\x96\x8dW\xc6\xe3\xfb\xcdk" -"\xc6\x18\xd1\x39\xa6\x87\x30>\xe1*k1\xbb\xf2:\x4\xf1\x95\x90T\x4h\xbb\x12\xbc\x46" -"\xc3\xe6\x9fK\xab}\x19Z\x1f\xe7\xdb@\x98\x9\xf5\xa6\xb0\x17\x8aw\xa4y/i\xc2\x34\x89" -"\xf5\x3\x43y\xb4\xa7\x66\x8c\xc1\xc9\x36\x9a\x36\xf8\x95\x1b\xe8\xc8^#\xd2\xe4}\xed" -"\xf3q\x8c\n*\xdf\x81j\xcb\xfb\xda\x1d\x46\xae\x86)4H\xab\xc7\x32\xdb\x99\xc1znt}" -"\xfe L\xb1\x16\x1c\x94\x30\xad\xa3x{\xdb\x92\x45V#O\x9e,\xfa\xe7W\x1f\x95\x42\xfc" -"\x6\xc7\xb7\xcc\x6\xf6\x30\xd4<\x4\xa4T\xc2\xdb\xd1\xb2\x35I1\x1b\x3\xd8\xba\xce" -"\x1\xfe\xad\x8e\xfIg\xf5\x14\xad\x83G)W\xcb/\xd7\x66\x1b\xd1\x82\x15\xaf\x41\x66" -"\x9\x66\x9e\x87\x8cr\xe1\xb8\xf6\x92\xc4I\x11\x95\x8c\xb9\x8b\xca\xc7\xc3\x8yV\xe5" -"6\x9eoA\xf1`>\xd4\x96\xf4vo\xd3Q~\x88h\r7\x10OTU\xd0\xbwi\xaa\x1e\xb0I}e\xb9\xc5" -"9R\xb4\xce\xca`\xad\xd1V\xd9\x1f\x86\xc6\xcnh=\xe2\xd6\x7f\xd9\x0\xe0\n\xffU\x80" -"\x4\xa6n\x12\xa9\xc1\xb9K.\xac\x61\x62\xc8\x96\x10\x94>e\xdeR\xfc\x63\xa8\xff\x4" -"\xc6\xe0\xb8\xc\xbf\xe5>\x15\xf9\x46G\xc5\xea@\xec\xc4*k\xdb\xbe\x98\x1c\xc2\x7f" -"\xed\x8d\xf2\x13i\xc3p\x12\x8|\xe7t\x8\xb7xf\xec\xb3\x81\xf0\xa1\xdd\x65\x17rr\x8b" -"\x8e\x7r\x8b\xc8*\xd7\"%\xc9L\x86\xb2\x45\x1d\x89\x1c\x1e\x1b\xf8\x43\x6}8\xec\x94" -"#\xa2i\xda\xaa=q\xeb\xa0\x7f\xb7\xf5\x98+\xd7<\xcf\x1\xc6\x15\xce\x12\xb3\x96\xf6" -"V\xd8n\xeLb\xbf\xf0\x30Uf\xcb\xc8\x39\xb1\x84\x30\x46\xca\xe4\xb5y\x93\xf8l\xb5\xd5" -"\xee\x8aS\x81\xc3?\x13n\x1\xb7yI.=\xc\x86xyC\x4\x63$\x88~\xb4\xe9'0vx\xf2\xc8\xc8" -"\xaf\x15\xd5\xafxu\x84%N\x99\xba\xf1\xe3\x34]\x89\xee\xca\x11\x84l\xcc\xd6+\xf0\x8b" -"l97\xf7\xa3\xd8\x16\xcan\xd3\xcq\x99\x9a\x39-4\xf0NP.\x1\x93O-\xf0GA\xer\xb5\nS\xf1" -"\x10y\x10\x35\x2\x8\xeu\xe0\x31K\xdd\xaa\x96@\x88\x7f\xd0\xb2\xd2H\xb7>\x8e\xa8\xb" -"\xd8\xcfib\x7f\r\x34Zsy\x1f%{\xb5\x9b;\nv$;\xb0k\xd0\xb1\xfc\xa3\x44\x8e\xf0\x8f" -"\x1/\xe7\xd6\x96\rY)#\xb1:ib\xb0\xeb\xef\xf6\xee\x81Kl\xb3i\xca\xd2\x39\x9a;>9\xad" -"\x7f\r\xd9\xc3/\xc7\xea\xab\x81\x9e\xec\xc9\xb3\xfd\x97\x12\x31\xa8\x33\xd0\xb\xcf" -"x\xce\"I3\xc4\xf\x1f\xd3\x1a\xb1\x1d\x89\x93.\xd5`F\xd8{\xeb\xeb\r\x4\xdf\xab\xa8" -"\x8f \x7\x7\x45\xa4\xfa%\xcd\xc7\xf4\x82\xf6\xa2\x9e\x32\xd5\xcf\xcdP\xfc\xe2:\x12" -"\x81\xcc\x91M\x9d/\xa2\xd6!\x14\xe0\x2\x93\xe2\xe7N%\xe9\x9c\xe2\xdb\x6\x96\xdex" -"\xb6{\xcbG\xaey7!\xe6\x95\x8cm\xa4shSj\\\x9f\x9f\xbc\x13M\xddM\x8\xbf\\\xb-;\xb4" -"\xf8\x63\xeb,\xe\x88\xe8i\x96\x45\xa4\x1a\xde\x9c\xe5\xbf\xc8w\xd7\xc3\xc7\xbc\xab" -"#o\xb5\x8\xe5\xc8\xfbj\x1c\x33\x17\x96p\xe2\x94\xa7\xa0h\x19\x95\x81\x96\\\xf\xfd" -"\x8b\x11!\xf4\x63 \x88\xbc\x96\x93\x14\xd1\x31\x92\x46\xe8\xc9\xe4VK\xc6\xbb\xb7" -"#i\x8e\xdd\x94\x9d\x12V\xb\x33\xf7p\xfb\xec\xbe\xa8\xc2;\xed\xddW\xe0\x8c\x91\x65" -"B\xc\xaf\x1b\x35HR\xb0{j\xf7\xf\x3R\xff\xbc\xc7\x1c\x91r\xd6-\x85\xc6{\xcd\x90\xcb" -"\xd7\x33I\x1e\xcft|\xcaubP\xfeP\x93\xa9\xb8\x45\x7f\xf\xabo\xb3\xf3\x65\xcd\x16@" -"\xe3\x0s\xd6\xf3Yo\x89nU\xd1\xc0\x63\x95s(K\xe2\xbe\x1c\xa0\r\xb0\x36\xd4\xd0U'N" -"b\xe\xc8u\xc5\xd1o&\x89\xb2\x8\x65\xba\xe0\xf1K\x14S\xcf\xfe\xfc\xacY\xfe\xfv\xbe" -"\x88\xd1m_\xaf\"\x91Ivy\x16\xee\xe5\xd3~K+\x6\n:75\xfc\xbd\x7\x87\x5\xfc\xe3\xe7" -"\x95\x44\x35h\xc6\xb7K\x1e\xd8\xf4\xcq&a\xb\xeaR\x80\x83\x34\x9c+\xb6\n\xd9\xc1^" -"\xdc\xd2X\x8c\x9\xc7\x1eS\x99\xc0\xdf~\xe8\xe5\x1cK\xf6x\x91\xee\x65%\x33VM~Z\xf2" -"\xd8\x91\n\x98y\xdc\xa3\x82\xee\x62\x37\x8e*<~\xdft7\xb5\xf6\x39\xb6\x33\xff\xd5" -"\xaf\xd3\x45Z{\x1d\xa9\xc4\xc7\xfe\xc\x3\xca\x92{\xc9\x33\xd8\x82\x1e/\x9byb\xb8" -"\xe7uqv)\xe2K\xc9\x80\xbeQ~\xab\xeeg\xce\x87 =\x4#\xe8V\xf1\xeJ[p\x16\x95/i(\xa1" -"\xd3\x8\n\xac\xe%\x63\xb\x19\xab\xd7\xb4\xbb\xbe>\xc9Y\xd6\x3\x43\xffM\xf7\x15\x45" -"^\xa4[_\xe5\xa6\xe3\xfc\xc7~\xa1\x18\x3y\x19\xb2\xa2\xb1\xde\xdapZ\xfdS$1\xbe\x9a" -"\xd7S\x9\xec\xf8&\xaf}c\xed\xa6\xc1\x43K\x6\xbc^\x9a\xcb\x43\xee \x9e{k\xc2\x1g\x2" -"\x8c\xa7\x85\xd3\x93\xbaw\x9c\xe7\xa1t\xa8\x98\x8c/v#\xcc\xf2\xce\x9a\xc3\xc8\x98" -",\x86Q t\xb\xd7IL\xca\xe3(\xbb\x37\xaaHs\xff\xd9\x9c\x46\xd2\x0Y\xc1\xc5\xbc\xb9" -"\xac\xa5\xe0\xfa\x9e\x12\x0\xd1%\x45\xdf\x87lX\xe\x1e\xcd\x18\x82\x95\xa7\x90\xe0" -"9r\x9e\xf9\x39!\x17\x4N\x15pQ\xce\x87\xef?\xe5\x9b\xff\xf2U|q8\xd4\xc6\x30h\xf\x93" -"\xf3\x1d\xc5\x1b\x87\xcd\x7f\xd8\xd2\x14.\x16\xb8\x9b:\xbf\xfd\xa3n\xf0Q\xb5\x64" -"\xeb\x1f\x8a\xc1\x8d\xf7\x0r\x93\x0\xd3\xfaZ\xbe\xf4\x9bS\xa8\x87\xfa\xdb\r\xcd" -"[>\xb\"\xd9\x88\xc2\xd6\x7\xdd,\x9fQ\x6\xf8:R\x1euV\x84\xab\xf2\x19`\xa0\xf9\x3\x30" -"f\xd5s\xdf\x4:\xdf\x95\xf7\xc8\xe9\xf8\"\xcb\x1f\xbd^\xed\x34\xd0U\xf\x44\xfa\xbf" -"sj^c8\xab\x99\xcd\xc\xed\x9c\x8a'\x9\xc\x85\xb4\x98\x19\x9c>\xb5g\xf2\xe9%g\xfe\x87" -"\xb2\x8\x99\xa3\xb6\x84=q\xd4;(\xb1\xc2\r\xe0Y\xc1\x2\xc0X\x2Td/$\xef\xd1\x1e\xc8" -"\xac(\x19\xdd\xab\xf1\xadK\x1c\xd9\xaf\xe9,\xc0\xe4n\x19He\xb9\x80\xb2\x8c\xd5\x43" -"\xdf\x6\xac#\xef\xc9\xc6L\xbe\xe9\xd9!\xc2\x9cioG\xbd\x8ep\xbm|\x1d\x5.u\xf7Y|]Q" -"\xbf.k\x9c\x97\xf1_\xc\xb8\x4o\x9" -"\x80\xb0yhWb\x16&\xeb\xc8\x2\xd5\xf3\x19\x8e\xd9\x1e\xc3!R-o\xa8O\xc3\xbcu/joG\xfc" -",\x5\x1a\xd1\x93\xadN@l\xa0\x15\n\x9aw\xde\x93q\xf8\x32\xd3\xac\xa7\xa8L\xa8\xc3" -"\xf7\xd9}\xc5\xe9H\\O*w\xef\x7\x19\x19\xcc\x90\xbe\x7f\xe1\x36\x18\xa4\xa9\xbds\x87" -"\n\x96\x8c\xb8\xba$h\x87\x8\xf4\x85\xc1Xr\x88\x82 \xe7:\xa6\x62\x36\x8f\x41\xe\xf7" -"k4eVc\xc5J\xae\xfe\xe8'\xb7\xc5S\xab\xc8%\x43\xfa\x8e\x8d\xde\x13#\xc6\x4\xf\xb8" -"\xf2O\xc2\x13\xa1\x88\xf1\x94\x9aG\x1\xb7<\x4\x64\xad\x96W\xa7ST@0x\x97\xd8\x16\xb3" -"\xe4\xb6\xda\xcav\x84\xf9*Kt&-w)i\xde\xe7\x11\xe4\xed\x9e\xe1\x15\xfb\x7f\x91\xbd" -"\x9d\x1a=@2_\x13[.\x3sP\xa3kC\xcfZL\xad\xeah\xac\xa3h\xf9\x92x\xfa^\xcd\xff\r\x10" -"\xed\x15\x17H\x9c>YV\x8c\xf5g`\x15\xd0m)nz&\x1=\x12\x82\xb0\xbe\x1a\xed\x1e\x1b\xb" -"r\xa9\xbd\xf8\xe8\xd7\xbc\xc1\x46\x33\x87\\\x7\xcf\\\xca )e\xc0\xab\x8d\xcf%\xc\x33" -"\x99\x0s&\xca@\xb0\xe3\xb4Z\x9f\x82\xe6\x1\xb0\xf6\x9d\x36,\xc9\x35-\xef\xaf\xb0" -"\x17\xf7g\x10\xf8)\xde\xe9\xf4\xba\xdf\xcfU\xc\x83\x86\x8bQ\x0\xac\x89\x35\x17\xa8" -"N\r\xd8\xca,\r\xbf\x35n\nzS0\x80\xed\x1b\x39\xdei\xd1\xa3\x1f\r/\xc4\xd8\xc\xf0\x9e" -"u\xa8$\x1\xb9\xe2\x5\x95\x35q\xc2\x98\x8c\xc6\x8a\xe6\x1e\xc\x98nv1\xb8\"\xff\x44" -"\x80\x98\xf0\x15\xa9%\xfa\x95\x89\xd4\xdaO\xbGA2\x18\xa6\xc4T-E\xae\x8f\x32\x83\x18" -"\xebgiD\xd9\xcd\x6\x11&<\xe4\xf1\xbe\xc8G\r\x1b\x86\x46\xde\x66\xd3Qdb\x0\xb5\xa3" -"\xe8\xc7\xa7i@TL\xff\xcdo\xdc\x98$'[\xa4\x9^\xf0\x8f[C\xcf$\xdb}\x8b\x1a\xb\x19n" -"%[\xd6\x9\x8d\xbc?\x98Y\xd4\x9a\x15\x9ci\"\x84\xb5.\xde\xd6\x32\x2\x30\x64\x87\xc9" -"\x97@\xde\xe2R\xee\xb2\xcejSG\x9e\xaf\x7f\xcd`W4kj\x83\xad\x35x\xe6R\x18\xee;\xfa" -"R\xf9\xfdpR\xdb\xb3\xb3\xf8\x41\x88|\xab\x19\x39_dw\x9f\x64\xd3\xf9\xb4\xa3\xfe\x39" -"G\xb6\xa5\x1\xb6\x8b\xc2\x88\xc6\xef\x89/4\xf8\xe2\n\x94`[lB\xdf\x84\xd6\x1e\xdc" -"\xd0\x0\xdb\xab&\xf4\xa1\xe7\xbb-\xa0\xa9&\xbav+!\x12\xbc\x10\x92\x1b\x38~\x10\r" -"\x9d\xb2\x9\x5\xe2}G\xf0\xdb<|\xc6\x7f)\xe4\xef\xebo\x17\x9f\x14K\x83\xae\x94\x93" -"\xf7$\xabX\x9e\x94\xbf\xfb\xdc\xda\x86\xfe+\xb3>aX\xbf\x15G2\x10\x15\xd4n\x16g\xa2" -"/\xcc|V\xd3\xc6\xc\xa2U\x10\\\xec\x8b\x3\xe8\x8b\xfa\x66\x95\x4$\xe8y\xd6\xdb,O\xfd" -"\x9dm\xf3Z\xb3\xec\xc8\xd5\xdai\x91g\x84\xe2t\xbd?\xc3 w\xd6\x63n\xd7\x34\x3\x10" -"U\x6\xfe\x86\xc7\x39=m\xa5\xc0\xf4:\x88G\xef\xd4m)\x99\xc2\xa6\x62\xb2\xca\xee\x14" -"\xad\x13\xe4\x8f\x14\x87\xf5\x34\xb6\x66\xbd\x38\x82\xd5\xad\x91\xde\xd5\x0#\x84" -"\xc\x31\x37^\xe1\xbf\xb5@\x19\xf\x11\xc9S\xc3\xc8l\xf\x66\x13\x9eW\xecP\xaa\xd8\xfe" -"\x9b\n\xa1T%\xfs\xc0\xe1+\x85\xb4+R\xf4k}\xc8^\xc0\x61\xc\xcd\xd0\x8c/?zS_\xd6\x9" -"\x89~G+\xe4\xa4\"\x8e\x45\x16\x93\x92\x1e\xd1\xf6\xfd\x9b\xfd\xab\x63\x8d\xa1Q#\xf3" -"U-\xc8\xbe\x5\x30\xc8\xa7n\x85\xf5\x9e\x13\xd9[Z\xe4\x1d\x31q\xf8\xc3\xaa\x8d\xad" -"\n\x2\xc3t\x9e \x90\xc6\xa7\x95\xd5\x36\x5\x34\xcN\x9bYh\x18\xaa\xb1\xc\xa1&\xe8" -"O\x90#\xc8\x1b\xf2<\xc7?a\xdd\xc6\x61\x99\xe5\x62x\n\xde\xbd.\x90\x35G\x9\x8aY\x15" -"\xfcrh\x19\x8a\xf3\x1\xc5\x1\xd5\x9b\x90\xf5\xbcP}\xa3\xb2\xfa\xe2r\x87\x46\xcb\xc4" -"\xec\xda\xdf\x62\xae\xb3\xff\x19R\xd7\xd9\xf1\x4*\xc5\x44\x8aw\xf3`\xb3M\xa1\xe7" -"\x82\xf3\xf1\x1\x94\xb3\xd4\x34\x36\xb4\x11v\x94W_v\x11\xd1\xe3\x42\x7f\x7fx\x14" -"\xd9J\xf7\xf5\xc1\xfe&\x8a\xfd\x82\xc2\xe7\xe9\xe3\xf6\xe0\xb8\xb5\xfd\x82}\xb4\xe7" -"\xb4~\x13\x17\x93\xc6\xe2\x9b\x33\xc9\xb0\x85t5\xe4\xd5\x7fQ^\xbc)\x90#\xa4\x38\xe1" -"t\x15\x4\x3\xc8\x94\xae\xf5\xc%\xacZ\xaf\x7f\x87 U\xfa\xf3\xc1\xed\x1\x44\xa6\xc1" -"\x2\x8e%,:\xf2P\xa1\x81\xbe\xc8s\x2\x83\xa0\x87\x84^\xb7t\xd9\xd6O\xb8\xe7;7p\xb4" -"\x1eu\x5\xe4\xa5\x2\xff\x35^?u\x82\xf3)p%\x8T\x9d^\x7Q\x12\x44U\x81\x45\xd9\xc4W" -"\xdfHV\x15Y%\x93\x82\x7f\x8e\x16\xe0\xc3\x92\x1\x9e\x9b\xb9\xaf\xa2\x9d.\xc3~(\xf5" -"_\x1d\x81-?U-\xd4>\x9ap\x7f\xb2\x36R\xe9\x44\x96{=\xa0\x9\x45=\x84\x18\xc0\xd7\x9" -"\x2\x1b=`6\x13\x36\x11S&d\xe9.\xb7\xccx\xa0\xaa\xea~\xc8>\xd8\x35\x35Q\xb6\xd7\xed" -"Eq\xe4\x66\xe5\\\x0\xda\x9)d[\x99\x8c\x12\xf2\x96\x9dv\xa2}V\xee\x94\xd9\x81\xfe" -"\xec[\x95z\xc\xa6\x37\xa0J?\n\xe1\xbe\xf5}\x8a\x83\xd1\xa1Y?\xe0M\xa2\x96H\"\x91" -"@\x91\x85\xf0\xe2\xae\x9\xfeL$9\xe2\xf4W\x9fT\xc7\x84\xc5\xa5=8\x97\xb6\xaf\x8b\x9" -"[\x9a\x98\x5K\xf8\x9f\xeb\xaf\x16\xc4\x81\xf3Vu<\x8b\xb8\x1\x95\xbd$DZ\x80*\x5\x17" -"\xae\x9\x44\xee\xc6\x30y\x96\xf8\x38\x1b-\x97Mye\xe3\xf3\xe9\"\x96\xbe\x91\xdelT" -"\x86\x30\xe7&#le\x8d\x98\x61\xca\xb9\x8b%ryC/\xa4t\x85O\x92\x16\xec{m'\xa1\x32\x1a" -"{g\n\xdere\xc1\xbj\xa5\x9\xbf\xd3\xad\xfa\x44\xcc:\x1d\x33\xdc\x82\xdcL\x1b\x13\x9d" -"\x95\xdd\xd7\xa2\x31k\xfa&\xc6\x8\xb4\n\x36\xba\x9b\xf9/D\x1e\xbb\xc8:]\xb\x46'\xc5" -"h\xf6]\\\x5\x37(Abz\x8d\x8e\x30Y\xd8su\x19\x93\\\"\x15\xbei\xd4\xc5\xf6\rM\xff#\n" -"\x9\xe7$1\xc1\xf0\xac\x98\x85\x92\x5twZ\x12$\xc3\xc5Y\xb0\xf3@\x8S\x2\xd0z\xd4\x1" -"b\x0\x44;;\xb0\x65\xcb\x7n\x89\x83\x81\xfa\xf8z\xf0\xab\x61\x1aU\xa4\x1b\x92\xed" -"m\x95\x10\x95\x17Q\xc0\xed\xb\xcf\xbc\xee\xa7\x92\xffk\x87\x97\x94\x89y\x1d\xc8;" -"\x88\xe7Gp\xc0}\xf3Nx+\xbd\x14\x37{\x3\x99\x2[\x1\x1c}\xb9,\xa2\xdb}\x8\x9\x9ah\xe3" -"\x95\xe9\xf2\x82\xf8\xd7\x16\x9e\x41\x38\xdc\xe2\x82N\x5>\xe7om\xe8\xb5\x82\x96\xba" -"8\xb0\xd9\xd2s\xe3\xa4\x61o`\xf2\x91\xdb\xf4\x34hH\xe7\xdc\n\xf3\xb6:v\xd8?\x6\xab" -"\xcf!uU\nU\xb6\xcbJ1h\xf0\xd3?\xae\x38\x9e\x4\x84\xeeg{\xdd\xe1l\x10o9\xbf\xfb\x37" -"\xf9\r\x89\x12\xab\x66t\xa6\x31\xa3\xe1.\xfb.\x3\x91\xbc\xe4*\x1d\xb0\x98\x12\xdb" -"\xd0\xfb\xb\xb0\x1a\xbb\x13N\xbd\xbn\xca\x13J~\xa7\xe0\xee\x66\xf8\x9\xc4n_\xad\xb7" -"\x0\x85\xd7\xf0\xc8\xf7\xd7\x8f\xa8\x64\xf2\x41\xeaP\x1b\xdc\xdf\xb8\xfb\x1d$\x96" -"\xd9j\xc2\x33\x37\x15l\xb6?\x99!\xbf\x84\xb0j\x7f\x9d\xe4$\xed\xb0\x90p\xd0\x9e\xfc" -"\xfc\xd3*pa\xc9\x90\xbf\xa0\x88\x17N\xc4Z\xfJ8X\x3\xc6\x64\xc2.\xab\x4\x1bq\xcc\x95" -"\x9d\x9f<\xf8\xfc\xb2~k\xe9\xd7\xe1\x36\x18H,0\xdeT%8/\xb9\x64\xa3\xbd\x82\xe7\x42" -"j\x8c\xa0\xac\x81\xa8\xc0\x9bl\xb\x41o3\xc5JE\xc4\xf5{\xbf\x10&\xa1,[\xaa\x1aU@\xe7" -"\xdb^\x95N\xe1\x1\xc3jp6#\xa7)\xc\xe3\x2u>\xc1X\xb6_\x81\xf|F\xc5\\\x7f\x9f\x12z" -"\xa3\x94_\xe2\xa3 \xa6\xaaI21%\xc8^\x17J\x82\x8cU\x97\x83\x10~\xdd~9g\xbb\x1f\\\x61" -"c\xb9\xa1[\x8c\x9d+\xe8\x44\x19\xfd\x9c\xf\x36\x1\x8b\xde\x46+{\xee J\xf1^\xae\xe3" -"\xe4\xf5\xfe\x39\xa2it+\xa5\x39\x8b\xc6\xdc\xdb\xac\xfd\x34\x66\x99\xa2\x8b\x8dp" -"\x8e\x8b\x9\xef\x0\xc4\xff\xe6\xfc\x8b\xe1!\xce\x97\xaem\x92\xb0\x42\x89SDI*\xd9" -"\xa6i2\x91\x35\x63\x2\\\xb\xeb\x65\xca\x34?\xbc\xdd\x12\x1e\x12lIi-R\xabK\xcbq_R" -"\xdb\x80h\xc\xfU\xa2 \x1b\"\xc2\xf2\x63\xd3\x8a\x89\xcc\x89\x81\xc5k\xcd\xb2\x45" -"\x80SG\xa7\x97\xd0\xd7\x1e\x2\xa1\x1b\x82\x38\xfb\xc2\x42\x45\x62P\x1\xech\x90\xcf" -"\xb1\xa0\x93\x99\x37\xaa\xb8/\xf6\x35\xdeR\xe4}b\xcb\xb3\x8dL\x89R5V\x12]v\x1e\xfb" -"\xeeV\x91o.\xd3Q\xa8\xc8\xbe\xde\xb3u\xb4\x0\xa5I\x9e\xf7\xcc}\xb0\xd9\xd7\xf6\x6" -"G\xc3\x41l\xe1\xd5\x5)>\xc1(\x9c\xc0\x18\x14y\xb2\x8aq\xac\xcc\xd3]\x1cI\x7f\x62" -"\x84\x43\xfd\x33)\x1aH\xf7\xaf\xa1\xd6\xa6u\xae+\xaa\xc9\xfb\xc4\xa1\x89\xfc\x4\xa4" -"B\xb\x91\xe3\xd5\x1e\xd1\xba\x42\xc2\xac\xa6|\xdd\xab\x41\x63\x8c\x82#of\xa8\xf2" -"\xce\xf2\xc6j3\xd5\x42S\xb5`\x99\x89\x16\x8e\x1c\xb5\xe9.\x9a\x46%j\x87\x10O\xf\xa8" -"9\r\xbb\xfb\x81H\xd7\xf9\x0\xb9\x63J>g\xb0\xf7\x61\xbf\xf5\xf4\x16\xb-\xb2\x15(\xd0" -"\xa4\xd5Xt\xee\xa9\xf0\x15\xd9R\xcb\x8f\xf8\x8f:\xfe\x83O\xc1\xea\x1d\xe2s\xb9\xc0" -"\x4\x8e\x45\xe3\xe2\xaaW\xe4\xc0\x92\x61\x8bP\xb3\xc1\xf5\x15!\xd0>\x9b\xa7\x43\x89" -"\xab\x46\x13\xb0\x33},tx_(\xee\xe5t\xf1\x81x\xc1g\xe6\xa3\xb5\xa5\xf6\x61?\xbeX\xb5" -"\x84\xa3S\"$X\xb6\xe5J\xc8\xaa\x8\xf3\x1a\xb0v\x1e\x15g&_\xff@\xcb>u\x9\x63\xf8\x17" -"\x9dI\\\"b\x84\x12Sg\xd1\xac]\x18\x8f\\\xa6\xa9\xfe\xf%\x12_05=\xf5N\x96\xe1\xf6" -"\xc5\x11\xc9\x38\xe1\x0\xbe\xc\x1bJ\xe6\x8dN33yO\xb\xc9]\x9a\xe9\xbbQ~\r\x18<\xfe" -"\x88\xe0H;\xca\x95x\xf\xb6\x43|\xd3\xc2\xbc:\xf9\x65\xbck\xc5\x8d\x84]0F\xce]\x12" -"\xec\x92\x85\xc1\xfd\xde\x31\x46`\xa9`\xaf~J\x7f\x7\xf9\xf\x95\xf\x6\xc7{\xe9\xf2" -"o\xa9\x1f\x14\xfa\xc8\xdd\x90N\xaey\xe\xd2\x16\xe7\xcc\"\xffG_\x8f\x46.\x1a\x46\xbc" -"\xdaq\xa9\xd6]\x7\xde\xdc\x3\x8d\x0\xf4\x93\xb3\x88ogI\x83\xdc\xfd\xd7\xd7`\xfb\xde" -"{\xaa\xcdx\xac\x12\xf1\x8d\xefU\x88i8\xf8\x8b\x99\xadO\xc8\xa4 \xcb\xd6\x0\x36\x15" -"\xd4\xe3\x1f\xf2\x94+5\xf7,\x1a\x1f\xb1<+\"bRs\xf7\x15\xe5\xd8\x9aM\xfe\x43\xe2\x4" -"ub\xf7~\x9c\x8e\\))\xbd\xc7gN\xe9\xbe\xaa\x8c|\xe8\x2\x1d(I-\\Tv\x8c\x0*6j\x86+\xba" -"\x99\x39\xb\xe4\x87\xe4x\x15\x13\xb8\n{\xcd]G\xdc#T\x1c\x9aU\xb9\x45\\S\xe9\x32]" -"\rw\xfb\x3\x90\xcd~\x12\xce.N4X\x1aJ\xb5$\xa6\xa9\x1f\xd3\xbd\xb9\xe0ySDq\x16\xc7" -"\xe4\xf4)\xa9\x9f\xf6\xc4\xc1\x1b\x1c\xed\x99\xe5\x11'\xc3\x9\x4\xbd\xf3\xed\x12" -"\xd7&\x1c\x31\xaaH3\xacr_U\x97\xb3\xc1\x17\nH\x92\xc3\xcc\xc7\x65\xf0!)D-I\x1b\x12" -"'\x4\x13\xa4l\x92\xc9\xb8=A\xea\xdb\x8\xc7\x80\x37\xa1\xc8\x63\x5\x99i_\x0\xbd|\x8b" -")\x84\x15@:\xec\x63\x2\x37\x43/~ou8Q\xcb\x35\x88\xe2)\xac\x8a\xe\xe3u\xd8\x15\xac" -"\xc\x2%\x0\x61\x9\xbd\xf8\xe0\xb4\x96\xde\xdd*\xa9\xcf\xaa\x16(jFb\xe2Vw\x8b\x12" -"\\\xb4\xdb\x5\xd2R\xaa\x66\xda\xda]\x16\x1e\xf6\xa5\x97\x1e\x9e\xd8\\\x91=\x1b\xef" -"\xa7\xd8\x62\xaa\xb7\xe1k\xc9^\x3\x95\x64`\xe1\xf5Z\xa7YH\x0`\r_\r\x14\x33\xee\x8f" -"\xf\xb\xe4\xce\xc4\x3\xcf\xed\xcaRsFE\x82n\xb6\x96\x1a\xf0\xc4\xe1\xdf\xfai\xf1\x93" -"\xe\x19h\x15\x39\x96\xe\xb5\x8b\xc3\x86\xfe\x31\xf2\x66\xf5\xe1\xb\x13\xbeMOF\xa2" -"\x9b\xa9T\x3\xe7\x5\xca\x8d\xbc\xdc\xc0<'5\x9\xd9\xa8\xbd\xedna\x18\xda\xf7\xfb\xc3" -"c\xc7\xe7\x84\xf8\x30o\x8e\xebwI\xccm\x85^\xd2\x9f\x99\xc7\xea\x8b\x43\x37\x8c\x12" -"s\x8f\xb8\x13\xfb\x82\\\xde\xad\x8a\x66N\x1f\xad\xf1\x1fz\xb8O\xa7\xe4%{\xd1\xef" -"\x7f\xcb\xc3\x1e-\xa8\xa8X/C\xbej\xe0\xfc\xa6g`HLQ\"\xcb\x38\x17iQD\x99\x19\x34\x1a" -"\x9e\xb6\x0\x93\xed\xce\xea\x34\x7f\xf8:\x16'\x8c\x37\xa9\xff\x38 +'\xa4\xf7\\\x6" -"o\xe4\x43\xa2\x41\xb6\x30\x14\x9cXWP\xe2\xd8\x15\xf6'\xa1%\x42v\xdb\xea\xe8\x18\"" -"p\xf2i\x9a\xc1\xe7\x8cj\x9v~)jdn^\xde\xd4\x84=.\xb8\xa6\x86s\xac[\x81\xe0\x65\x10" -"\xdb\x64\x87%G\xa9*K\xc8Q\xe7h\xf4=\xa0S\xa6\xbb;\xe8\x9c\xbe\xf1\x66\xe8\xa3\x41" -"\x9e\xed\xe1\xb9}\xf8\x8ai\x8c\xf_\x86M\x81\xb5\xc4\xf7\xad\x97\xeb\xf7\x8bN\xe8" -",\xcdq\xa3L9\x8d\xd3\xf7\x46\x9\xc5U\xb7\x65<\xe2~x\xbe\r\xe7\xca\xa1\x1d\xe7\x8f" -"\xca\xc0\xe0)1\x1\xa2\xa8\xc5TYA)\x1cV\xd4\x95\x7f\xcd\x65\xe3l\xccW\xc8\xc9\xdc" -"\xcc\x7@z\x11\xf5\xc9\xcb!O\xf5\x8\xa5\xf6\x17\xff$\xf0\xb6\x17\x0Mg\x87\xea\xca" -"\x97)a\x8\xb8\xb0\x2v\xf3\xb7\xe2\x8a\xf1\xdb\x99\x8c\x36\xefQ|8\xd9m\xbc\xaf\x33" -"\xde\xb8\x99\xa3\x44\xa6\xc0G\xcd\xd2\x66*\x2\xb9O9\xacR\x8a!\xff\xaa\xfe\x36Gp\xbc" -"\xfb\x99_b\xeb\xcm\x7o\x12$\x1fr\xe4\xb2\x84\xf0\x85\xa3\xc6\xfe\x92\x63\xf8y\xaf" -"\x8c\x4\x99y\xf5\x1e\xbfI1M\xd0\x33\x1e\x93_\x94\xf2\xa5\x8a\x10y\x6\xc2&^;\xd6\xd6" -"D\xeau\xc9(\xee\x81&\x8e}\xb0\xd2\xb6\x17u\xcb\xdc\xfc\xe7\x43\xef\x1a\xe9xLJ\x9b" -"-N\xb0\xd5\xbc&Q\xd7\x9f\x10\x83\x6r&p9\x9d*\x90\xe4Sdg\xc0\r\xe8o\xf4\xa4\xf4\xa5" -"\x11v\xedr\x1e\xa3\xa1\xc7,\xee\x35LT\xf6-\xb4\x98*Vc\x7\xcf\xd3 \xd6$[\xc3\x10\x8a" -"\x5OD\xb3\xf4\xf6\x1f\xde,\x84\xab\x41m\x18\x16\x45\x44\x30\xb6\x46\x8cW\xd8l\x15" -"R\x18\xc6\xf0_\xae\x1f\xe2*}\xa4\x61\xe9`\xc2\x10\xecnD\xbd\x7f\xeay|\x1c\xc6\xb6" -"?_\x93\xe7[\xf6\xce\x42\xddU\x9e\xb1\xe9z\x8c\xd0\x1d\xaa\xd4\xe9\xaf*TH\x96\xf6" -"\xe5\x97\xed\x16\xd6\x84~HS\x9d\xf\xe0\xc1\xdf\x99)\x86\x30\xec+F]\xd0\x37\xcav\x17" -"\xea\xd3\x4\x99\x39rK\xb3\xd4(\xe9\x13}\xdag\x9\xdd\xe2\xe7.\x16\xc8\xc\xc9`\xcb" -"\x85\xf1r{\xf3\x8\x45\xfaQ\xfc\xa8\xd5+`\x99\xa6Z\xc\xdd\x44M\xaa\x35SG\x82\xae\x34" -"|\xfa}\x84\x9a\xd3\xa9\x37I\xdb\x90\x41\x3\xe5\x97\xf6\xddV\xe0\x32\x2_Y\xf7\xb7" -"$\xd1\xc9G5\x80\x99\xff;3nmh\x8br\xbd\x11[\x86\xd6\xd0\xc5M\xd4W\xb7\xbc\xe4\x43" -"RL\xb0q\x8a\x82\xd6\x66\x1f\xbb\x5g;\x86\xa3\xef\x66\xd1\x98\x17\x88\x3\x9a\x1e&" -"Y\x7f/lQ\xd0U\xb1\xde\x1d\x32\x14]9\xb2\x44\xc9\x1e\xb3\xef\xd2<=Kx[\x96)j\xcb\x8c" -"\xe2\x18\x82\xb4\x81L\xa4\xd2^\xd8\x8a;g)\x89\xc\xca\x88\x43\xc1\xe2\xf7\x46(\x9b" -"N;\xf5\x19n&\x8c\\\x8\xe5&p\xe8u\xae\xedN\x9c\xefoE\xa7\ro\x94J\xa9Q\x8c.\xc8`\xd1" -"c\x13\x1b\x66\xe6\x1b\xe3\x44\xaa\xfa\xf\xcdKZ\xf2H0\xda.\x98\x11\xc4\x2L\xb8\x7" -"\xaf)\xceV\xa5wfk\xb8\xa6\xae\x62\xddx\xf>\xd0(5-\xee\x9bj\xeft\x83I\xf0q\xf1Q\xb9" -"\xb3:\\p}i\xc\xac\xac\xdc\x1f\xbc\x8e\xaa\xb9 \xd1\x1cN\xbf@h'2\x93\x3\x32\xa7T," -"\x0.\xd0\xe4\xef-<\xc5\xa6\x11\xa4\x85\x85\xfc\x0\x97\x42o\x97\x10\xd6\xde\xa7\xf" -"\x1f\xfc\xa6[=9\xc8u6\x9a\x91\xc0\x45\xaes\xd2\xde(\xb5H\xf6\xbd\x8d\rv\xe8te^z\xb6" -"\xef[\xf9\xa4\xe0\x8e\x12\xa1\xad\x86\x7f\xf1\xb7\xc\xb0\xf2\xac=\x19\x8d_p\xc3\xa2" -"Q\x5\x82\x91\xd7\xf5\x37\xe6j\xf5l\x87\xc1\x19\x16\x39\xbw\x5\x82\x11\x7\xc6X\xd2" -"\xa4\x3\xcf\x1cl\xacy\x13u\x5\xd9\x4\xa6\xe3\x1f\x34\xef#\x4_\x92:\xc4\n\xa9\x33" -"PX\xadv\r\xcd\xdf\x43\xaa\x9bQfR\xfb\x81\xfd\xe9\x1\xd2\x9c\xc3\xd2\xea\x99\xc4/" -"\xb8\xcb\xb1\n\\\xfc\x4\x3\xc5\xdbrV\xc7\xd3\xad\x11\x93M?\xcd\xcb\xde{\x87\xe1\x19" -"f\xfd\x33\x61!\xc\xc5\x11\x45\x9c\xd8+a\xca\x45\xe2\x8\xa9.\xdc\x4\xc\xd5\x8b((\xfa" -"\xd6R\xab\x38\x46\xc0\x41_\xbb\xc5\x3\xc9%\x1d\x7f\xa6\x61\xfb\x8e_\xd1g\xfd>\x9d" -"\xf8\xbb\x17\xa5-#\x1\xc2\x1f\x97K\x16\x34\n\xc7\xe4\x31'+H\x89_\x83v\x87\xcb\x41" -"\xeeu\x95\xa8&1S8\xd9\x97\xfb\xa4:\x9f\x8a\n\x90g\"\x95\x37\xc8\\\xaa\xab\xc2\x66" -"p\x0\xe6\x96\x1f\\\xa1\x1d`\xd3\xcb\x97\r\xe\x5\x9etF\xf1\xb4!f)-\x96\xab\xae\x83" -"\xa1\x85\xdd\xee\xab\xbf\xf0\xd9\xdaT\xce\xd5\xcb\x12\xe7\x82\xa2kq(\xf0\xda\x66" -"\xeb\xbc\xba\x7f\x45\xb6\xd4R*;\xaa\xfa\x39\xd7\x64\xb7\xc8>\xfd\xa7w\xdd\x17\x37" -" \xd4\x1e\xcIII7/\x9b\xe6\x1d\xe1u\xba\xe4\xad\xb\xf8\xd7\x88\xb3\xd5\x3+\xc4n\x95" -"\x82\x12\x90\xcblfQ\"\"\xc\xcdl\xff%\x44\xb3\xad\x1e\x11\xdd\xee<\xc\x65\x31\x81" -"\xab\xe2\xfjf\xa4\xe8\x98\xebHcj\x8d`\x87\xfbyGz\xaaT\x19\xb7\x85\xda\xd5OI\xca\xa8" -"\xc3\x42\x7f)s\xa4\x9a[\x6Gg\xaf\xc3\xb0(\xfaS\xca\x96@\x1d\x91*qQJ\xbe\xdbh\xe6" -"\xa4\x1b-\xc6\x19\x4\x1a\xe1\xb7\x98\xc1\xd6\xd0\x64G\x8b\xa1|\r\x4\xfs\xf1\xd1X" -"\xc7/\xef\x16\r\x30\xb8\n\x9e\xe8\x5K\xa8\x86\xfi\xf2$\x1ai&sz\x4\xe\x6\xfe)ED\xa3" -"\x93\xfb\xa3\x8e\x9d\x85\n\xda\xae\xc2\xae\x18;\x12\xfbwl\x82\xcb\x34`\xdbL\xee\xff" -"\xac\xfa\xba\x62\x9cz\xe\xdc\x66-\x8f\xc4\x8bY\xdb\x18\xe8\xc5\x90\x8dI\x13Y\xa9" -"\xc1\xda\xbe\x14\x18\xb4ix\x92L\xd0\x2\x8f\x1e\x19\x39\x99\x4s\x7f\x41\xad\x8d\xe1" -"\rB\x14\xd0]jM\xb4\x85\xcb\xfc\xf4\xdf\x9!\xe4\xe6)\xab\x83Ji\\1{y\x1b\xaa\xf9\x2" -"\xecY#\x1b\x85n>dhh\xce\x13\xfb\xd5\xcc\x41\xb6\xfd\xf3\xe4\xd9\x18\xa0.\xfa\xa2" -"\n\xab}Rj\x4\xed\xcb.\xb3\x88\xa2\xcc\xbc\xee\xdb\x9d\xb\r\xf1\x34>\x18\x31\x7f\x46" -"\xa6\x5L+\xbb\x14 \x1a\x92\xaf\xbc\x45,v\xf\x16\xe1,\xf9L\x8a\x90\x1fP\xf1&>\x1\x93" -"\x8\xc5\xaa\xd2\x46\xca\x64W\xb\x12 2\x94\x8b\xbc\xfe\x11R\x93|,2\xb7\x64\xf7\x8b" -"\xc2H\x17Jr\xa7\x6\xfc\xe7H~\xe6\xc6\x5\xd4\x8e\xaf\xc2)\xc9 `w\xa3\xf0\xfe\x8h\xad" -"_\xed\xab\x9a\x9b\x7\xa7\xd7\xd9s\xfd\xaa\xb8\x91P\x9a\x8c\x8c<\xb9\x86+\xbf\xe0" -"L\xd0\xc3P]\xf3\xea\x8aKQ\x98\x17\x5\xb3\x8f\xf5\x3\xab\xc1\x7f\xd8\x82\x30\xbf$" -"/\xd7\x37\x31K\x9d{a9\x89\x43\x8d\x9e\xfq\xd5\xcb\xecw\xf1\xd9:Q}\x9f\xe0\x8e\n\xa1" -"8\xd3\xaaU\xc2\x32\xf4\x93\xcc\xc1\xf1>\xc4_.\x7[\xb3\xa9_\rJ2\xd5\xdd!v\xa0k\xcb" -"\xcc\xfa\x8d\xf\xf2\xe2 \n\xd6\xf2\xcb\x91\xd3%\xeeH@\xaeJ'\xc8p\x9e\xec\xed\xe5" -"h,\xf\xd5\xd9MW\x7\x90\xe3\x4\xb9\xb4\xfb\xff\x8\x85-\x98\x95\xf7\xfa\xa0\x46Ob^" -"}Q\xf3\xfbT$\xee%\xe8\x9d\xa3\x39\x36\xde_1=\x13\xf3\xa5\xc5\x65\xe3>\xde\x87\xb2" -",\xad!\x1e\xb5\x8bp\xf6q\xf5\xa8\xc4s\xa1X\x98\xef=5\xc0\xd4\x96\xc6+\x1\xdd\xa1" -"\x96\x39\x99\xd3\x13\xb4u\xdb\xe8\xaa\x88\x8aMf\xcf\xe1\xaf\x9c\x86p}\x86&z\xb1\x8f" -"\xbf\xed\xe6\x88H\xbb\xb9\xddZ\xf6\xa5\x81{U\x94\xc6\xa7M\xae\x1c\xb8>\xbe\xd6\x16" -"\xf7\xbd\xe4\xa4\xe6\x1b-C" -"\xad\x97\xb0\xccX\xd4\x65{\xc2z\xefvr\x15\xcf\xe5\xc9\xf7\xa8}\xf9\xd4\x39\xce\xcf" -"a$\xba\xf2na\x9e}z\n\xff\xb6x\xdfn\xb3\xd6\x63\xbc\x9fw\xaa\xcdu\xfa\xba\xd0\xb4" -"\x16\"\xc3\xd5\xac\x9ax\xa4\x32YW\x15_6\xc9\xdb\xe2\xd1\xdf\xa8\x1b\xf0\xe1\x1e\x5" -"\x12\x97\x8b\xc8\xe7M0\xb7?\xc9\xfbx59\xa1\xc1\x32\x1b\x89;O\xf9xp\x84\x18R\x80\x96" -"{--\xf7&\x90\x33\x99\x94V;\x8a\xbd\x37\x1f\xfb\xb8\x32\x16[\xf1g\xf\x1b\x18\x19\x88\xda\x99\x62\x62\xbb\x3&\xef\x95\x91\xbc\xcd" -"\xb4\xd4\x80v\x86\x45\x1dXB\xd7\xa7\x9d^_Q\x4R\x8c\x89\x17\x8e(jA\x15\xb9\xec\xdd" -"6\xcc;\x1a\x8\xf3\x1cT\xa2\x94\x30'\xde\x1\x14\xee\x35\xd0\x96\x37\x9c\x16\x97\xff" -"`3aUt\x1c\xb4\x66\x9b<\xa4\x1cn\xad%\x8f})\xea;L\x93%\x11\xf6\x97\xee\xda\"\xb9\xc" -"\x0\xe\xd5\xdf\x81p\xf0\xe1\x89\xb1\x10\x13\xe3\x85)S\xc2\xfa/\xb2\x19\x7\xc5\xe1" -"\x9b\x83\x43\xfe\x43R\x9fr\x19\xfe\xcf\xa8\xb4\xa7\xbb>\x1\xfct\xeb-\xc1H\x94\xe" -"3-\x1fS\xf4\xf7\"lx\xb1X\xca\xdf\x82\xd7V\xb2\x1e\x96q\x8d\xb7{\xa7\xac\xa3\x1f\xd5" -"'\x9d\x19\xb1\xcf@i\xc\xf3\xf7\xa3\x62\x46\x11\xba\xb4\xa7\xb0\xeew\xb4\xe3\n\x10" -"\x9b\xbc\x15I\xd0\xa6\xf9\xb6\xf7\x36?s\"j\xd1\x9b\x92\x95\x82L\x15#\xa8\xca\xe\xfd" -"\x87\x8c\xdf\x81\xe8\xdf\x64\x15m\x7f_\x6\x87\x30\xeb\x30J\xbe\xe1\x34J\x9f\x8d\x36" -"m\x5@\xe9\x13\xd8\xf7\x9e\x9d\xa8\x4M\xe9\x0\x66\xa6\x39yo\xe6%i\xc7\x8a\xd5\xe5" -"-\xa7\x85;\\\xd2Qs\x7f\xce\xd1\xe1~us\xb5\x34\x1a\xe6\x92~\xf3\x8b\xb5z\x84\x37\xc" -"\xca\xa5\x6\xbf\x96V\xea\x0\xc7\xd6Z\xfcj|bSB\xf3i\xbd\x93'E\xfdN\xc2ZZ\xfbW\xc9" -"\xbc\xc\x8c\x82\xde\x8e\x9es\x90\xb1`d\xef\xff\xbd\x15\x1d\x9e\x16\x9f\x42\xbb\xf5" -"\xec\x9d\xf5,\xf8\x82\x89\xea\x9d\x82\x9a)\xa5\x61\xb0<\xcb\x14\xbcj\xc\xc6'|\xd5" -"5$\xe9L\n\xa1s\xd4\xb7->\xd2\xfd}}\xc7\xa2[|\xb9\xb7h1\xb\x88Z\x99H\x3\x37\xce,\x11" -"\xfe\x90=\x7f\xc5\xb5\x93v\xc9=l\x16\x9d%\xb9\xe8\xa2\xce\xc8\xb5\xd9q\xf7\x7f\x0" -")\xb6\x1d\x36\xd9\xc4j_\xea}I\xff\xe0\x32\xc;\x83\xf5\xa7\xdd\xa4\x8e\xe4\xa5\xe1" -"W!\xf7x\x12\xc5\xf6\x18xFp\xc9-r6\xcd\x1d\x19$\x8f\xc8\xc9\xel\xb\xc8v\xa1\xd9\xe3" -"\xb5\x38W\xfd>\xe7y\xfHn~\xc4\xdd=\xa9\x44\x96}b\xf7\xe8\xd7\x6\xa9\xf6\xeb\xff\x86" -"\xb3\x8aS\x0\xdfoTD\x14\x89xE3Q\xbf\x8d#\x2\x15\xd3RW\xbbT\xa7\x2\xef\xeb\xb4\xba" -"\x90\xf5<\xd1\x34i\x9\x32\x9e\x92\xe0\x64q\x2Y\xff\x8a\x33\xf1\xa9\xcc\xa5\xae[\xfd" -"\xea\x62\x87\x65\x39\xc0\xaay\xb2\xdb\xd9_\xb\x80\xacQ\x84.\xdf\xac\x8b\xa6\xc7\x9a" -"\xa9\xf0\x91\x41\x13\xca)VS\x84W\x1b\x88Z\xed\x9f\xf1\xe2\xdf;\xdd\x66u\x14\xa7\x8e" -"\xe2kY\xf9\x62\x61\xb6&\x8bz\xfb$]\xe6\xee\x93\x9\x43\xc3\xd5,#\x8e\xbbm\xef\x8f" -"gw\xdc\x98@\xd0\xc2 \xae\x81u\\t,<\xf4/l\xf3\xc3:,jO\xab\xca\x1\xea\x12\xc3{,\xd8" -"\x99\xcex\xe\x43\x45\x92\xf2<\x7f\xe9o\x87\x8a\xa5\xf1\x96\xd9\xa7\xb\xb3\xd5\x44" -"$z_)PB\x84!\x81\xd7\x8f\x1d\xd5\x8a\xf0\x9d\x99\xd2_FG\xbf\xefY\xe1\x33\xd4%z\xa6" -"\x89\xbd\xcf$\x85\x32UnjL\xfd\xf5X\xbf\xc1\xaf\x8d\x9\x91\x88\x9a\xd6\x1d\x8b\xa1" -"\r\xa5v\xd1\x36k\xe4\xf6\xb0 8\x99\xf9\xa0/\xab\x34\xe9!\xe9\xa7\xb0\x9c-\x6\xf8" -"\xc6`\xb\x9f\xfc\xb1\x87\xd9\\\x1f\xac\xf7=\x1e\xcd\xb2\x8b\xd4\xf5\x14;\xac\xae" -"^\x19=\xc0\xd1\x96\xe1j\xb2\xe4\xd3\x16\x8av$\xde\x98\x8e\x1b%\xe5\x64\x6\xf1+hF" -"\xc6m~\xe0w\x1eq\xbex\xe2\xab\xa6\x37\x36M\xf7t\xf9\x1b\xd4>f\x8\x35\x9b\x85@\xbd" -"\xf2.(\xc3K\xae\x81\xae[\xfeP\xd7TU<\xb6\x85\x8a\x8c/\xb7\xdf\xe8@B\x1bp+\x99\xf2" -"+\"\x14U\xd2\x8a\xc5_+\x8b\x1\xe5\xc6\xed\x89}B\xfe\x45\xa3m9o+&?\xe5\x16\x63\xf8" -"\x98\xfdtv0\xde\xa1\x34\xd7X\x95MR\xa4N6\xc7\x43\xdc\xd5\x83\x1fs*#\xd4\xaa\xf4\x9a" -"\xcfk\xcb\xb3\x88J!\x6<\xf0\xa0\x7\xe2Qk\xfaqh>4\xb3\x61\xd4\x45oSS\xe7,\x1d\xb7" -"\xc6\x93\xc9\xd0\x35z\xe8\x17\x9a\x64O/7=\\v?^l\x8c\x8bHr\x88\xfb\x83w\x11'\x84\xfc" -"P\xb3\x1e\x39\xdd]i\xd1J\xa8\x93\xb5U47L\xec\xf6\x19\xa9\x8bG\xee\xf8\x1c\x8c\xd2" -"\xb\xd3\xb1\x83\x86T\xf3\x8\xfc\xaf\x94PO\xd5\xfd\x8e\x93\xf0zG`\xc1\x82\x65\x11" -"Ew\x89\x90\x12.*\xfa{V#\x6\x1e\xc3\xf4\xd7\xd9\xf0\x61\xf2\xb7\xa7\xa0\x9a<\xcd\xc3" -"<\xb1` \x93\x36\x9a\xcf\xf1\xeb\x1cm\xfds\xdf\xd6zJ\xa9x\xba\x1b\xa4\x96\xbc\x17" -"\xef\xdf\xe7\xa8\xf5\x33Hl;i\xdf\x1\xbcZ #\x2\x35\x45O9\xf7\xach\xcaU\xa4\r\x9a\x5\xe2\xe3\x85\x83\\" -"\x88\x82\x88\xc2L\xd9\xfcQ\xad\"PI1\"\xe0\x30&U\xc4\x63\xcd~\x11\x88\xb5\x8\x13\x87" -"\xc4gK\xf1n\xdd,\x1f\x1eI\xb2h\x99\xdb^\x1aL\xb1\xbfj\xfe\x14\xdd$@\x8w\xf8\xc8\x65" -"{\xa4\xd3\"|v|\x19q\xbd\x33\xefpG,%B\xb6\x1H\xfcJ\xe3\x10\x35$\xb\xf5x\xe3\xbaL\xe8" -"\xa4y\xfe\xb4\xab-\x6\xca\x63\xf8\xb8\xc\xb0\xb5\x92\xb2\xe6\x97}\xb0+\xd2\xd9\xf8" -"\x13\x35\xf1?\x80?\\\\\xae\x42\x2\x36\xe8\xc5\xc1\x1d\xc4\xd6|!\xc\xf2iKG\xe7\xd7" -"\x1bG\xc2\x9c(\x0\x61\xb9\xca.O\xd8\xa3\x3\xba\x12\xae\xf8\x15P;g\x95_b\xbf\xcd{" -"*.\xa4\xe3\x1fy\x99\x87\xbd\xad]\x2\x8b)\xeb\x1d\x91\xbf\x89J\x8c\xc7\xf4u\x1d\x15" -"\xd1\x1f\x80\xc4\xc\xe\xaa\x38\xafZ\x9c\xf6\x9d\x89\x42\xa2\x13R\xe3\x65|6W\xd9+" -"@\x98^\xdc\x1e\xbf\xa8\x7\xc5(Zt\xc4}\xfd\xffy\xc4\x1a\xaa\"\x82n\xc0\x16\x1e:Nb" -"IfO{\x7fR\x16\x1d\xe\xd4\x63\xc\xa4\xcf\xddmh\xfe+KzMd\xd7\x5\x1b,\x12\xcd\xeM\xae" -"\xf\x66\x93-x\x81\xd6\x1\xfb\x62\xf3\xee\xacU.eL-\xe5\xbd\xaf\x65\x17\x8e\xfa\xc1" -"\xd9\x1d\xda\xdf\x43\x98\xb\x1a#\xd5\xc3\xb5\xd3\x8a\x39\x11UH\xb7\x12K\x8b\xc5\xfc" -"\x8f\x45\xe1_2\xf5\x6\xef\r}\xcf\x45\xc9=)%\x82\x91\x33\xa7\x32\xa8X\xcdo&\xa3Tj" -"a;\xc1\x2J\x8d\x31'nR\x93\"\xd8\x7[\xfc\x9e\x97\x4\x15\x94\xf\x96\xef\x9b\xe1\x14" -"\xaa<\x97\xfc\xc0\x8ang\x97\x1ahT\xf4\xcf\xdf\x8fkC\xa8\xd9\xfc\xe5<\xde\xaa\x81" -"\xaco\x97\xa3T_\x91\x88Ymx\xb6\xa3\x34v\xdf\xb8\x38\xfdlO\xa7\x85tr\x3\x13=E\x18" -"\xae\xe0\xc\x18J\xe0\xfd\xf5\xdb\x85\x3&\xad\x9f\xdc\xdb$K\xb4\xf6Y\xb6n3\x19\x33" -"OY\xea \x88\xe4\x95tw\xa5\xde\xfc\xa2\xd4\xa5\xfa>7\xfb\xfe\xd1\x38\x45\x0xN\x8\xff" -"\xa2\xf5\xaa\x41w\x95\xa1\xd2\xfeT\x82.\x10\xcb(E\x15\xb6\xf3\x94\xe7h\x1f\xd9\x11" -"Q\xb\xd6\x8e\xfa\"\x95y0`\x86%wZd\xa4\x8d\xc$\x92\xbe\xb3\xeb\xfe/\x85\xbbn\xbeJ" -"^@\x9f\xc7\xf1J\x98\xf9#\x93\x6\xc5\xeb>m\x4\xd7\x41\xbf=\xfcG\x8b\xd0<\xcf\xff\xf8" -"H\xe0\xed\x18\xe4{\xec\xb6\xc5\\\x39\xa4\x66\"\x83\xf3\xc4\xe2\xdf\xb7l\xae\xf1l" -"O\xab\x89\x44\xc1\xff\x62\x43\xe2'\x15\xaf\xbM\xe2\xfdjD.\xa5j\\\x88\xa6\xb9<6\xeb" -"\xe5\"\xb5\xc4`\x14\xbc\x3\xe8\x61gH\x1dY\x9b\xc3\xfe\xee\x5\x64\xa0\x90\xe4\x35" -"q\xb0\xdb\xe0\x96\x11H-i\xa2Pbm\xcb\x90\x96h\xf1\x45\xf9\xb6&\xf9\xa7\x90\x7fJ\x17" -"x\xe8\xac\x6j\xf5\xb9\xee\x2Qr\x91w&\xcc\xf4\x16K\x1e\xc~|\x94\xe3\xb7\xdf\x85\x16" -"\xc7\x8b\x1cr\xf6\xfdW\xca\n\xed\xe\x41\x9f,]\xd1\xff$\xf4t8\xc0\xe0G>\xdf\x9b_\xcf" -"'|\x84\xd5\x0\xa4\xff\x5Uf\xee~\xcb\xf5prb\xfd\xcd\x82_\xaf}\xa1\x65\x66'Q\xe0\x81\x13\x4\xec\xc1\xa7\xc7?\xf8\x6\x38\r\xac]aa\x13" -"\x88\xf3}z\x92\xdd\xa1\xc5\x35\xa3\x36Z\x82\"\x7f\x99\x9e?=\xde\x8b\xbdr\xa5#+32" -"\xe0\xcb'S\x12\xcd(\xf4\xc8@\xc9]\xe6\x36n\x2\x81p(x,\xe6\xee|V\xa0\x4\xd6\xdeJ'" -"\x86\x6\xf\xcbkm\x5\xaf\xdd\xc7\x43\xc2\x10\xf6\xf0\x45\x86\x3\x38,\x1b\xe8>a\xe9" -"\xa0\x38\x35\xc2\xf6\xbb\xa1\xa4v\x5\x64\x63[\xe8\x99\xf7[\xd2;\xf6\xf6\x36\x37\x1b" -"\xd2#\x8br3\x12 \x15o\xda\xf0\xa5\xd9\x32\xd2H)\xea\x5Kky\x10\xa7\x38\xc0<#\x1d\x1d" -"\xbc\x9c\xaf\x1\x65\xd4\x9\x1a\x31\x35\r\xa2u\x97i$\xf8<\xb4\x18~a\x89\x17\xb5o\xd9" -"\xb8\x81\xbb%\xa8\xd7\xf8t\x1b@z\x89\xab&q\x9d\xb2W\xd9\xe6\xb6\xc<%\x87\x8cX\x96" -"\x9M\xff\xc5\x88\x91\xfc|\xa3\xea\xeaj\xe4\x87l\xe3k=2\x82\xc4\xd1\xda\xb3sSL&\x11" -"\x4\xd2\x35\xca\x94\xc0\x8a\x9d\xaa\x3\x95@e\xf\xbb\x97\xba\x61\xd5\xd9\x7$K\xe0" -"\xb6\xae\x1a\xe2\xc3\x15\xfcz\x13\xfd\x19I`\x92.]T\xc8R\x8e\x8a\xe6\x65\x1e\x9b\x36" -"\xd7&j\xc9\x5\x8a\xe9~\xe0\xaf['\xb4\xc0\x45\xae\xc4\xd2\xbe\xd7\xc4,\xab\x91N\x10" -"h\xcc\x85\x38\x86\x1a\xec\xee\x62\x43\xb3\xd3\x8f`\xae\x9\xcd\x65]\xa0Z+\xcb\x1a" -"\x15\xf9\x14\xa4\xb8\x19\xd1\xe1s\xc4\xab\xf8\xd2_?)\xb4\\K\xcd\xcd\xcb\xff>$\xad" -"\xd7\xe7j\xea\x86g_\xd8\xe8wIH\xa1\x62]\xbd^\xe5\xfe\xc0\xd5\x12\xde\x9f,\xa7\xe9" -"\x1b\x97\xaf\xdfJK\xf2\x42I\x9bm\x8f\x4vk\xb\x8eu\"\xcf\x88H\xa4\xbc\xbe\x38,9\xcb" -"\xb3\xbf\x39>\xf1\x3G\xf1\x8a.m\xfa\xa6\x84.1\xcb\x9e\xee\xe4\x19\xc7\x62\xde\xbf" -"\xca\xf4\x9c\xd7\xbfXt\xf9\x92\xa7\x87\x3\x8\x17\xe9\xda\x99\x81\xb0\xd9\xe\xcd\xc5" -"8\xeb\xb1\x81+\x88\xc9kn\x93\xb3P\xb3'\xea]sx\x87z\xac\x9dq)\xc1P\xc5q\xec\xddH\x8" -"\xf0$y\xbb\xfc\x87\xf1\xdf\x80\xdf\x86\xedkW39\xb6\x9b\xcd\xec$\xfb\x9d\xf9<\x87" -"\x1aj\xab\x8f\xa2\x36\xb3\xd3\x9a\xba\xa1@C!\xd9\x3)qI\x92\x38\x99\xdf\xb4G\x2\x1b" -"\x95\x10\x42\x4\x41\xb9\xfd\x8a\xe8\x9e&gD\x1dvp\xb4\x6\x14\x39\xcf\xd8v}0\xd2\xd2" -"\x98\xea\x15\xc1\xab-\xd7\xb2_\xa5\x14\xba\xb9\xf7\x14\x17l\x8a\xe5\xa2\x4\xbb\x16" -"|\xdb\x33[\x13*5\xf6\xbd\x14\xb7\xf\xfdp1\xce\xbc~\x18\x9$\xf2O\xc5\x41q\x99\xcf" -"!\x1e\xe8\xe6\xa5^\x9J\xfbV73N\x8d\x42\x16\x8d\xa0\xdb\xcd\xa3\xb2S6pY\x88\xc9)\xef" -"\xe6\x8aV\xff\xdb\x15n\xac\x31\xc\xce\r\x6}\xc6\xb5\x64\x63Jq\xd6\xcb\xd6\xf9\xca" -"\x9f\x86\x8f\xd2\xae\x88w\x8d*\xc5*\xe7\x8d\xdb\xb7\xfa\x9c\x93\x9d\xba\x89}=\xcd" -"\xe0\xac\xf6\xe0MYe=\xf2+\xcbp\xf9\xfb\xfc\xfe\xc1\xeep>\x92;\x7\xe0\xd4\x13p\xc4" -"\xe4\xcfp\xff\x63\xf8\xc7\x9c\\\x64\x38\xf8g%\xa5\xeI\xe3\xee\xe1\x86\x87\xea\x32" -"Ne\x1d\xab\xad\x2.\x8ax\xefW\xc6\x30\xf1.\x9b*\xff\x39\x86q$\r\xc2" -"\x16\xa2\x9c^\xc1}D\xe0_\x1a\x8d\xde\x90v\xde\x92\x45n\x96\x9c\x80U\xb8Z<\x4\x4\x13" -"e\xec\x35\xd7\x9f,\x5\xab\xd0u\xf1N\xb2n\xeeG\x8d\xef\xf3\xd1/\xcf\x99\x37\xdd\x39" -"\x1\xd5\x9\xb6\x95\xf8\xc1\xfaY\r\x97}x\xdb\x84\xb2\x84\x95\x62\xc4`e\x98\x42\xa7" -"\xb9\xf\x8b!\xc2\xcc'\xd6\x42Xhr\xc4\x9bSM)\x9b?\xb7\xe1Mp\xa8h\x13\x83qU\xf\x9e" -"\x2\x1at\xd2\xa6\xe0\xf6}\x90\xd5>\xc4\x8P,@\xd8\xdcQ\xea\xab\xbe\x86\xfb\xf5W**" -"\x7f\x12\x1b\xea\x99\xbe\xb\x0\x45\xd2\xc5\x16\xd1\xc\x9b\xeb\x81>\x16\xf4@\x82Z" -"w\xd4\xde\xde,\x8bI\xc4\xac[q\xc1\x1e\xbd\x8f\x8f\xc4\xcds\xa6.G\xf7\xeb!/\xf0W\"" -"\x81\xb4'\x96\x33/pr\x8d\x92\x5\xce\x38W\xc\x96\xbd\x89\xb3\xf2\xa3\xed\xf4\x98\xca" -"\x83\xa3z\xcb@'\xb5\x61\xde(\xba\x37\xb9\x19\x9d\x4\xa5n\x14ql\xebJF3\x0v7\xb2\x16" -"\xb9\xf6\xba*N\xca\x8a-\xe0\xcd\x63\xff\x9\x44\xdc\x63\x5\x9b\xef\xef\r\xfbS\xa4" -"\x8e\xf6/T\xf1[\xc0\x35SVxy#\xedr\x9ax-\x96+Mx#]\xe8\xdc\xb3\x18\x92\x63\x8fQ\x0" -"\xf\x89\x81\xb8k\xfb\xd8S\xb2\x89)\xf8\x96\xa0S\xbr\xf0u\xcc\xb\xfa\xc7\x99\x63\x1f" -".Q\xf4t\xac/\x98\xe6\xe2\xfa\xb8\x9c+8\x90\x0y\x13\xbb\x98\x41\x96\x9b\x44\xedv\xd4" -"\xe8\x88\xd9\xb3\xd9\x84\x1d\xfa\xc5\xd4\x14Y\xdb\xe7#7E\xbbNy\xfc\"\xfd~Ff\x1\x15" -">\xfe<\xd7p\n\xa8j\xca\xd0{\x6\x92\xce\xaak\x0\xb2\rv\x8c^`R\x89LY\x15`~\x9c\xbc" -"I\xf8\xfeOo<3\x4_\xb4\xf0\xec \xa3\xc9H\xaf(\xe8\xf\xb6\x7f\x37\x9c\xcc\x1b\xd0\x19" -"\xb3\x39S!\x91\xcd\xb8\x3\xca\x96v\x97~\xd9\xca\x1\xbb\x3\x95SH\x17_\x8c\xaa\x95" -"\xa0qC'\xd5\x9b\x82\x44M\xf2*\xc4\xee\x8fPI\xc9\x14s\xf2&\xd4\xf2|\xe4\x2\xbb\xea" -"o@l\xf2\x18r\xb1[\x19\xafl\xc\xdby\x8f\x80i\x94\xec\x1a\xa9\x5\x66\x37\xb1\x39\x12" -"\xef\xfa\x8\xdc\x1[\xb6\x7f<\xa7\xa4\xc8,^4\xd3\x9d\x88\xcd\xd5(|0D\xba\x95\xf2\xf7" -"_km\xb9\xf1\xd6\n\x41\xfa\x90\x34\xd9\x1b\xd9\xcb\xec\xfc|\xe7\xd7o@H o_\xab\x9\x1" -"\xf7\xcd\xd6\x39\xed\x6\x8c\xc8+\xe1|5\xf6\xdb\xb8\xd8Y\x95\xa6?\xf6\x9eR\xbc\n\x1" -"&\x16\x62\x15>\xc3@\xfd@'\xea\xad[\x1b\x81\x1f\xad\x9e\x16\x66\x39\x18\xe4n\x98;" -"\x2\xa3\xad\x97\xeeTW\x8b\xf6Y\x9e" -"y\xa9\x9\xf\x35\xbe,\x9f\xde\x41\xe\xbf\xf0^\xa7\x61 \xc7\xd5+*b\xd6s\x8b\x1b" -"J\x9f \xeek:|\x1c\x6\x41\xb5P-R\xa2\x8d\x95\xdd\x7\xda\x8f\xc8\xeb\x96\xa2\x34V_" -"\xb0\xb9\xd8,\xbb&4P\xf9)\xc9\x15]=)\xae*u\xeb\xe8\x93\xd1\xebt\xb6\xf0\x62\x8f[" -"\xcaL\x90\xa7\xdd\x94=\xb0\xe9\x9b\x17\x8a\r\x83RH\x0\xb3\x61\r\x65\x14u\x90Y\x83" -"\xe8OY\x5\xf4\x9b\xe\xf1-\x88\xc\xee\".\x91;[\xa5\x1b\xc5S*\xfar/\x8e\xf9%LI\xf7" -"\xf6/tMX\xb\xfb\xde\xe1}@\xff\x9a\x4\xac+\xf6@\x16\xd4g:E8\xa6nR#\x8bOL\x1d\x37\xac" -"\x94\xf1\xf6\\{\xed\xa2\x46\x8a\x10\xb0\xdf\xa3!\xb1\x8c\x84\xe3x\xcd\xd2U\\E=b\xc9" -",B\x93\xba\n\xedg3\xaa\xfc\xad\xfbH\x8d\xfb\xe5\x45\xde\x91\xe4\x12\xc8\xa1\xad\x4" -"\xd9Y\xc7Rb\xe9*7\xc4\xd1\xbbH\xdc\xdc\xa4\xc8\xf6\xd9\xfb\x7\xa9\x18\xbo\x9cV\xef" -"\xa9\xad\x9a\xb9\xfeH\xed\x61\xd5\x9cZK\xf\xc2\x84\x35\x1d\x43\x9e~P>\x92\x35\xa3" -"\x8\x63@\x8f\xa5\xa9\x9a\xaai<\xb8\xae\xbb\xa6\xeb\x84v\x0\x92\x34\xbe\x91L\xe2\x35" -"\xbc m\x9\x32\x0\xd3Y7C\xea\xe9\xdb@\xf6\x39\xea\xb1o\xd3\xa7\xd0I\x0_\xbf\x93\x86" -"\x96\x94\x8d\x82\xbc%gLi\xd1\xd7\xed\xd0\xb6\xd5\x14\x38\x18<0v\x9c\xa3\x10N\xb3" -"x\xb8+\xcb^`]\x1e\x6Z\x11\xe1x\x92\xe0\xa3.\xb0\x7f\xa9t\xd3\xc6\xf7\xc\xb\x65s\x84" -"\xae\x83\x9ft\xc6\"\x65n\xfb\xd3\x87\x8az\xff\x1a\x1\xa2\x93>G\xf3\x66\x95;\xd2\x87" -"s\x87\x8cl\x99\x9f\x39\xab\xb2pH\xe5\x39p\xa5\xc8\x8a\x13|u\xe4\x9c\x91\xa5\x33\x16" -"\xc5\xf9\x4\x44\x64\xe4\xc\x1e\xeb>\xba\x35v*I\n?\xfe\x8f\xc8\x86\xd2\x99\xe9\xec" -"\xfc\xfeU=\xbf\x33I\x13\xb3\xe\x3\xe5\xbf\xbd=\xe0\x62\x7\xbfG\xcd\xaa\xeaL\xfc\x81" -"G\xbb\xfa\x15Mb\x95\xbd\x46\xafh\xad)\x8b\\\x2\xfb\x5i\xb6\xcaR\x13\x61\x42|U\xd4" -"V\xffm\x80\x83\x41\x7f;\xb3\xee\x88:\x95}\xd0\xe4S\xa8\x89\xd3\x89\xbd\xf5tQk\xe1" -"GI\x9c\xb0-\x9dv\xb\x62\xdd\xe4\xee\xebp\xa7\xfd\xc1#8\xab\xd0\x1dp\x9c\xcd%o\xfa" -"_b\xa7\xf4\xaam<\x7f#]\xae'eS\xda\x64\x99\x31G\xb5\xb8ob\xc4s\xd0\xd3\xed\x14\x88" -">\xd0\xdet\xf1\xc6#\xf3\xe6$\x9dj\xf1W\x1d\xc1w\xd2~,\x1f\xb\xff~\xd9\xdc\xce\x8f" -"\xcb\xd3{\xea\x85\x1\xae\xa6\xc6\xd7\xb2YB\xb\xdf\xb8\x4\xe3\xbf\xa4\xe3\x39p\x8d" -"\x19\xfc\xa7H\xd8\xed\x84\x5\x4\x39\xba\x7fZ\x8\x8d\xa4\x80/\xdc\x46\xb9Z\x99\x95" -"\x9e\x95\xf1\x84\x7\xab\xe2\x39p\x1ao\xba}n \x94\x64\x1cP\x9d\xa6o\xe5Vtz!\xb0\xd7" -">>~\x15{\xa4\x1\x82\x95\xee\xe6\x83\xd0\xfb\xdb\xfdRC~\xf5\x81\xb0\xe\xf2\xddX&a" -"\xa4\xa9\x9b\x2\xf6h\\\xb1\x83\xac\x80\x1f\x3\x8e\x32\x37\xeb\"\xf9P\x8cT\xb3N\x6" -"\xa1\xaa\xfd\xb4\xfcj\xdd\xacQ\x10\xd2V\x9dI!\xef\x8b\x43\xc6\xce\x36>d)Q\xba\xdf" -"\x0\xad\x1\xb5m&,\xb0ynk\xc3P\xf\xb7`\xac\xe1\xe7\xc9\xfe\x44\xd6\x81l\x84\x6;z\xff" -"\xe\xa0M\x91\x8d\x4\x8d\xc1\x93\xfc\x7\xba\xd3\xbb\x8ez\x17\x8f\x87 \xb6\x8a\x80" -"\x2~\x9f\xf2\xfeK\xf8\xf6\x1\xdeH\xb4\xc8\x63\xaej\xf\\\xc9\xfc\xa4\x61O\xb4\x87" -"\xa0\xd7\xe4,\xc1~\xc4)\xe1\x9L\x6q\x8aL\x1\xc5\x32\xcd\x8P>\xed\x35\xbe\xf2\xa8" -"<\x86\xe8Z\x8et\xcb\x93\x64\xa0\x1dz\xa5\x1a\xf9\xa7\xadY\xe9;x\xe3\xd1\x19\xe4\x0" -"\xed\x46\xc6\x8\xc7\x1e\x33\xfa\xcd)\xe4$\x12\x36&\xb5\x35\xa7\xec\x87\xcf,\x12\xd1" -"\x96\xe3x\x98g2\xc8\x94\x81\xd8\x8f\x14\xfc\xf9P}\xcdP\x83\x41\x10\xc0q\xb6\x88`" -"\x9\xe\x12\x8c\xb5%\xea\xc3\xb5\x19\xc2\x19\x1d\xcc}9\xd5\x87\xe5o\xb3:\xc6\xbb#" -"\x12\xeb!}\x8\xbd\xf9\xc9\xeb\x34\xce\x91\n\x7Gp1\xd4\xed\xc8\"nqB\x1fj\xe9\xb\xfc" -"C\xc7\x39\x89(\xdc/\xdf\x62\xa5H2L\x99\xe7@\xb5\x81\\\xba\xc9\x15\x7f/[Q\xa4j\x1c" -"\xf6\xec\xb6\xa0\x37S\xe7\xfdI\xcbJ\x4\xe5\xe8\xab\x19\xc4\xac/\xb5\x6\x18\xbd\x9f" -"\x14\x17\xfa\xf3\x42%R:j\xf9\xf9\xb2>\xf9\x82\x83\x1c_\x19\x46\x46\x7\x95\xe0\xb5" -"\x97\xb\x38;\xf8\xad\xde\xb0\x45\xc5N\x9cY?^\x1f\x9d\xaa\xef}\xc5\x8b\xda(\x19 \x9f" -"\x5\xae\xacO\xf2\x34\xe3\xbfG\xec_Ilu2$\x17\xa9m\xe3\xb7\xcP\x96\x93-\xd0\x2\x63" -"\x84\xc3\xd1R`Db\x92\xbaz\xc\xc5p\xa2\x9ak1\xb7\xa3u\x96\xdb\x1^\xc0\x84k\xfd\n\x66" -"L\xda\x3)\xe8\xa4R$\x1c\xbctC\xb4\xcf\xcb\xecH\xb9J\x1f\xb2\xba\xd1\x7\x32h\xaf\xd3" -"#\x1b\xb2\x1a\xc3v\x2\xdb\xf5\x65\x37\x80!^A\x8\xe2\xd4\xf7\x16K\x12\xe7H$9ss\xc4" -"\x5\x18H\x88g5s\xb1\xf2&=\xbb\xcd\xc0|\xea\xdb-\"\x2\xa1\x8a\xd0\x36R\xf0\x35_\xab" -"\xf0\xdf\x8\xc3\x2xIb\x90\x30o\x93\xbe~B\xf6\x63\xb5\x1eO\xf~I\xd3)#p\xc9+E\xbb\xb7" -"f\x7H\xcd\xad\x64\x1b\x1c-$\xbd\xc3=\xdd\x92r\xc8\xbclL\x80\xfd\xb1\xd6Gj\xa6\xa1" -"}\xe\x35\xb4>\xf7\xd3\xfb\xc7\x82\x8f\x2\x9\xd6\xf8;\x4\xaf\x1d\xf3P\xce\x10\xa3" -"\xaf\x84\x85[\xb9\n/\xde\xc6\xfymZ \xee\xe1\xb3#\xed\xfd\xe3\xd6\x99P\xce\x90\x89" -"A\x84$m\xce)I\x9c>\x87\xef\xfdV0\xaa\xbe\x14\x42\xe2\x39\x9f\x3\x93\xf2\x1b\xeb\x96" -"p\x8bl\xf0\xb6\xb2\x7\xe4rs\xbb\xe3\x3\xa3P$\xcfI\x89\x93(\xc8q\x91\xbf\xbf\xff\xef" -"\x95\x0\x61\x1b\xeb\xee\xdb'\x93;\x1fS\xd6\xbc\x80^\xd7\xc3'\x1f\xe9M\xcc\x7f\xfa" -"\x9f/S\x81\xc\xd3\xd0\x89I\xd5\xab\xb\x14J\x8f\xacS;\xa3\xeer\xbc\xe2\xbe\\\xd8\x80" -"4\xc6\x30<}2?\xef$2\xed\xc9G\xca\xd4\xafk\x1c\x38\xbe\x9b\xd1H\xca\xca\x12\x32?f" -"\xebW\xc3\x9lr\xf8&\x8etl\xff\xd4\xef\x80\xdf^\xcb\xcfR-\x85\xaa\x41\x16o\xdd\xed" -"\xfe\x8d\x84<\xb2[\x99u\x90\x8b]\xe7\xc4\xda\xb8\xff\xf7\xb9\x8b\x8c$\xec\x1e\x84" -"w\x12p\xea\x87{*^\xdc\xe1U9hY\x91\x97\x19\"\xf5\x4\x4\xb1K\xbf\x10\xe6\x62\x64\xfd" -"\x82\x7\xcf\x5\xc|\x3\x11\xd3\x87\xc6+x\xaa\xac+\x96\x9d\x31_Jyc\xa7\x9f\x8erO^\xfa" -"\x1\x90%\xe7y\xej\\\x90+}\xa8WC\x8e\x84\xa9\xbf\xf6y@\x9d\xed\xf5\xa4\xa0\xf6p\xae" -"E6\xf0P#\xa9\xe1\x12\xf1\x7f\xa4\xa2\xf\x18\x14\xf" -"\xf5\x65\x8\x8b\xe1qK\xc1\x97\x1\xa1Qf\xde\x32\x42\x9a\xb5\x5\x90;\xa5.\x1e\xf0r" -"\xa3\x4\xd1\x44\x87U\xce\x0\xdcp\x82\xdf}\x99\x6\x35WL\x9a[f\xda\xad\n\x45`Y\x3\xd7" -"1y\xe0\xed\x9e&0\xf4\x38\x61\xe2#T\xea\x16\x41\x8c\xec\xdf\xdc\xa0R\x1\xe2\xf7Z\xb6" -"\xf7\xb3\xea\xe3\x36\xc4\xeb\xf7\xe3\x85\x1c\xc0\x97\xe2\x10[\xea\xed!\x11\x44M\xe9" -"\x83\xc6\xb8/\x11\xb3/\xdd\x61\xea\xb4S1\xf7\xeb\xc1\xf9<\xef\x31\xf2#\xfc\xe6\xa3" -"I\xd8\x96\x96Q\xab\x62zH\x13\x14\xfb\xa2\xa3\xaa\x95\x3'%\x7f\x8fP\xe6\x9e\x1a \x94" -"8\x16\xef\x41\"Z\xe1\xb7h\x11\xc5\xaf\x88\x97lKN\x2t\xb4:X\xf6:'\xea\x89X\xa3\xf5" -"\xd8uD\x8c\xb5z\xbb\xebHYf\x8a\x11Q\x8\x97ha\x1T*\x8\x30\xac\x31\xf0v\xc5\xed\x66" -"&\xec\xd9\xee\xd0J\xd3\xe7\x62\xe9\x31\x8c{\xab\x7\xad\x32\x4\x83\x1fW\xb4\xf1\r" -"\xee\xed\x8\x95\xe2\x46h\xaa\xdc\xbe\xba\x92W\xf1\xec\x41\x91\x11\xe7%\x7f\xca\x9" -"\x8d<\xa8\x9a\x1d\xed\x16\x9M\x10#\x1b\xbc\xdc\xaf\xac\x11\x66\xc0\x8ap\x7t\x97H" -"\xe8\xc4\xf5\x0\xb9\xb8{\x84\xe8\x11pBWZ[\rPe#U\xdfl\xc6\x1c\xd2\xc7\x85\xb1\xc6" -"\x81\x1d\xb2\xe9\xb9\xb7\xb4rf\xb4\xa1\x8K\xe1\xf3\xf7\xd1\x88\xfb\xd9IL\xecQ\x16" -"\xfa\x62|\x80i\x95\x1\x13\xf7\x9\x9\x36\xf1\r\xe3\xd7\x1d\xe1\xb7\n\xfcV\xb6\x1e" -"\xe2\x45\xefrx\x86\xb\x64\x11\x32\x33\xa8\xa7\x81z\xc\xa2>_\x8\x37\xc\xd4\x85H\xe4" -"utx\xb0W\xa0\xaeY\xe9\xce\x81\xa4\xed\x7f\xf3\xac=!\x17\x35L\xb0\xa9\x86#p]\xea\xfa" -"\xd8\x9c\xe0\xc5\xb5\x19gv\xcb]Cy \xbb\\r\xa8\xa7\x18\xae\x62\x9b%\xe2S\xc7U\x1U" -"T b\x14\x80\xaf\xa2\xb9\x1bun\x96|\x7f$\xe3\x0Tb\xcd\x14\x96\xfbX\xf3JB\xa9\xd5\x9a" -"\x10\xd6\xd6\x8b\xb3\xc4%\x66\x16\x10Y\xdf\xbb\xcb\xa5i\xa0\x89\xd9\xc1\xdb\xae\xbd" -"\xe6Q\xb2']Y\xdf\x9\x33\xdc!\xd0\xa9\x2\xf2\x1c_P7)\x9cn\x8f\xb9T\x16\x91\xed\x13" -"\xc0\xe3jZ\xf5\x8d{\x8b\xb3`\xe8\xbd\xd2\xa7{$\x13\x8b\x88\xa5\xaa)8\x6o\xf6\xb0" -"\x98\x32l+C\x85\x38\x0\xea\xa4\xa3\x4\x10\"\x81\x32^\xcd\xfb\xb2\xbb\x14\x0\xf0\x9e" -"\xde\xe9z\xe8\x12r\x8c\xc1S\xf7\xea\xbcJ|\xf7\x61\x9at\xb4\x95\xfc\x82\xb5\xa8\x9a" -"\x9e\x2\x46\xf9\x83\"\xc2&k\xf8\x38\xbd\x1d\xef\xb5\x16\xc7\xa3q\xd9\x1b\xf5s\xde" -"\x96\xf0P\x1\xecH\xfd\xcb\x9e\x90\x45\xab\x1f\xc9\x10\xf6\xb9\x34J\xdbI\xc3\x8e\xb7" -"P#\x1n#\x98\x84\x66\x2\xe2\xfez\x7\xa9\xc\xa8\x63v\xfc\x12]\x8b\xed\x19V\xb8\x97" -"x\x1d\xefn\xb4)\x82\x4\xe4\xb5Q\xee\xc3\xce\x13\xb1\xfe\xe5q\x1f\x10\xc0\xc8#,\xcd" -"S?\x82\x31p'\xa8|0\xb9\x1b\xc1M\x91\xe1J\xd3\xac\x92\x17x0C\\'\xfa\x8b\x8f\x8d\xbc" -"u\xc0L\xab\x1\x81\x45^\xab=\x1e\x10\x1b\x14\x97JoO\xb9\x9c\x87\xed\x43_8\xf \x87" -"C\x8bK7\x1d\x1e\x61\x13\xbd\x65\x19\xaf\xbf\xd9$O\x3\x84\xda\xe1\x85\x2Z\xea\x64" -"W@\x1fTT^4\x94\x12\x1\x5\x9c\xe7V\xcf\x7f\xabO\xa5\x83\xf9\x86\xa8\xb4\xd5Y\xe8\x34" -"\xef\x33\x1ah3\x97\x1c\x89\xf9lX\xcd_\xb3\xbe\x13\\\xb0oe\x8f\xe2\x62u\x9\xc8\xcd" -"\xfa\x91\xed\xeb\x43\x9e\xb3\x86\xe3\xbf\x9b\xc4\xdcNr\x90\xa2\xff\xea\xe\xc2\\\xb" -"\x9c\x2\x12\x85\xab\xcc\x82\x1b\xef\xa4\x42\xc8|\xed\xb0\xa6\xc2\x34,\x93=\xd4\x61" -"\x16\xcaxm\xfa>\xe4:\x7f:\xea\xcaI\xe4\xf3\xa1\xd4\x4\xe5\x9e\xb3V\x11\xcf\xc6\x8e" -"\xbf\xb5\x32\x1e\xe4\xd8q\xb2\x6\xac\x86\x92\x93\xc\x89-\xd7\xcd\xc7\xb3\x1b\xae" -"\xa9\xa4\x39\xff\xfb\xc5\xf9\xd3\xcb\xa3\xe7\x1fV8\xdcm\xcb\x8c\x64\xf7\x63\xe2T" -"\xc3'\xf7sR){\xd7\x6\xf3\xa9\xb4\xec\xf0\x45\xb1\xf1\x32\xefx\xc2\x96~91\x0\xbeW" -"\xae\xa4\xb6\xa5\xa8\xcdQ\xb6\x8b\xc1\x14\xad\x91\xe1\xe4\x35\x12\xb8\x7\x98\x34" -"FNJ\x92\x31\xce\x83\x98%\xce\xcd@\xfq\xde\xa1\xb4\xda \x10\xd8\x9f?\xa8Po&\x88\x8f" -"%VOo\xbXdv\x8a\xbe=>\x85{\xc2\x65\xfbk\x99\xe9Td\x95\xe4\xbe?{;\xd6\x16\xed\xa6\xfc" -"\xa1\x9f\x5\xb8M\xf9j+qt\xcd\x31P)\x8.\xc0=t\xe9\xb1o\xdeU\xe6\xc5\x1c\x86\xb0\xe6" -"\xc0\xa1\x87Ru\xfb\xc8\xf2N\x8\xef\xf2k\xa2?\n\x96?z@\xc3Y\xdf\x33\xa2s\x1f\x13\xfe" -",\x90_o`\xac\xb4=M\x3\xcc\x63r\\\x85\xa4\x6\x10\x80\x89\xc3=\x82\xe1\xaa\x10|\xcf" -"\x7f\x5\x17\xbe\xbaVCv\xc2\x1c\xc2X\x9d\xday\x94\xcd\x35s\x97\"P\x9c\x63\xcO\x88" -"\x95\xbf\x36\x87\xbb\x8a\xba\xe7;^\x1c\x42\x91Y\x94\xc6\x14\xe9\x87kz\x1d\xc5q\xc0" -"n\xf0\x0\xd7\xecY\xde\xb5(\x19\xae$Qj\xaf\x5K\xb9\x15\x45\x31\x1\x16\xf9\xc4j\xf6" -"SC\x85?\x89\x66h\xdc\xeeGX\x99\xd0\x8fK\xc4\x5\xef\xbd\xc9\xd4U\xd2\xb4\x8c\xd2=" -"\x1d\xd4\xe4\xb\x89H\xfb\xf8\x34\x13+\x83\xbf{\x95\xe/\x83\xa0\x91\\\xc2w\xd4\x95" -"\x1b\x1d\x9b\xf8\xc9\xd7\xc2\x90\xe\xd2\"\xca\x89\xe7\xaa\xb7\xe6M(\xb0\xd9\n\xdf" -"\x9cG\n\xc9\n\xfa\x39Zc\x96\x46\x4\x65\x39\x36\xa6\x18\xdb\xbe\xe3<\xaa\x44t\xed" -"R*\xce\xe5\x61\x4}\xc1\x63\xc7\x84\xd5\xb8\xa2n\x4%k\x16\xf9lc\xee\xba;c\xdd\x8c" -"\xb0V\x83M\xf7\xf8\x46\xfa\x32\xe3/\xf\xfc\x14\xf0t\xf0\x38\x91\x81m\xe8`\xf2\x1" -"\x2\x80`\xc3\x4;9\x1f\xe9\x85\x8c\xf2\x96\"\xd5T\x18\xd6\x7f^nlq\x8f\x1f\xc2\xe6" -"-\xaf\x1d\xd4\xcfy\xeb\x95\xa1m\x9c?\xec\xcd\xed\xf2\x61\xf9\xf4\x19\x5\xf8\xb8\xc3" -"\x9b\x9b\xff\xb2\xc0\xe8\xd6^\xe4\xf9\xcb\xaeR\xb5_\xb3\xbb\xe1\x7\xc0\x8c:\xbd\x66" -"\x8e\x91`\x1c\x84\x9a\xf2\xe0\x34\xb9\x9d\xe6\x89\x12$\xa5\x61\xb7\x44\x9a\xec=\xb" -"\xe4u\x99\x1fR!\x1b\x9d\x16h1\x1a\xaaz\xc9\x18^x\xf9\xf\xd3\x1a\x32Kl\x82\xf\x7f" -"\x8e\x18\x9e\x95,\xd1^W\xd4uC\xe\x1b\xea\xf7S|\xf6\x64\x9e\x80\xe3]\xf1o\xc0:q\xea" -"\x16*\x19\xb7\xd2\x96\x17\xbdZ\xf3\x41\xe7\xec\x81\xdd\xc3\x38`o\xe0PvI\xbfv\x1e" -"\xcaor\xdc\xd2\xb2\x17\x97\x32\xba\xebQ\xd6Wy\x1\x9eg\x8c\xc8\x46\xf1\x84\xba\xae" -"\x95U\xf\xc4\x30\xd6\xc4\xe3\x15\xc1\xa6\x61\x93.Z\x8cM=\x81\xac\xb4\x45\xe2\xb0" -"\xb8\x7w\x1e*\xad\x84\x65\x84\x7f\xbf\xde\xfdr\x9\xd1\r\xbf\xa7\xfa\xf2\xc3\x4\x1a" -"g\x8cp\xa1\xc8\x7\xa6\xf8.\xb4Hh\x8c\x8e\x9al\x96\x8f\x7f\x9fL\xbf\xa8\x85\x5\x99" -"ur\xcej\xa2(\xca\xc0\xa8\xfI\x96IW\x1~\x90\x90\xbe\xe3lVl\x6\xe7\x9b\xeb\xed\xc2" -"\xde\x9ay\x2u\xe\x1d%\xf2\xb4\xa5\x1e\x10\"\x1bN\xf8-\x8f\x1f\xbf\xad\xdc\xe9\xf9" -"h/8C\xa5\x81\xeb\x10\xb5\\\xeaJ\x8e\xa1\xe2\xf7\xc8Kc\x94\xe0N\xa4\xb6\xbc\x9d\x9a" -"\xd3\x44\xc4\x14wrJ\x19os\xd9+\x9c\x43X\xf7:?\x88/DR\x4\\\"UQ'\xbf\x9c\xaa\xf5'w" -"\xc2\x0\xd6y\x86\"|\xb1\x7f\x94\xa1\x18\xba\x66\x34(\xab?\xdd\xa9\\\x35\x9a\x35;" -"J\xae\x31\xf9K\x4\xd8J\x9c\xci\x94\x7\xca\xaf\xb2r\xaeX\xef\x32\x8e\x90\x65\xb5|" -"3\xbc\x9b\xd7[5\xe4\xf7\xd2\xa6\x9a\xff\xb2\x13z\x9GW=R\x97+\x1J(\xf1G\x0\xf0\xfc" -"*\xf0\xaf\xb7\x1f\xa3\xc0\x38\xa4\xfb_\xc2\xee/\xc6Q%\x96\xb4-;r\xa6\x12\xb8\x62" -"c\x86+\xd3\xb2\xdd\x43\x33u\x86\x11\x7tt\xfa\xc0\xa7\"\xe1\xd9\x19\x9d\x66Q\n\x1a" -"\x86\xf8\x7\xaa\r\xe7\x1c\x13\x92\r[\xd7\x32\x88t\xbf\x1a\xe+\x80\xc6\xd0v8\xf2\x61" -"\xac$\xdc\xf7HS\x1\xc5\xd5\xcf\n\x8b\x62\xd6\x46\x88\x17\xd5{\x9e\xb8\x35\xa3\xf9" -"\x96n\xbfs\"<\xb5\x90\x9a\x1a\xe2\xa8[\xc9\xf\x1.\xe2kHJ@\xc8\xa9\x98\xad\xa3!\xa0" -"\xfa\x95\x5\xd9\xa0\x9c\x8f\x61\xd7\x8\xe8\xc{_GY\x9d\x12\xe0 \xfey\xd6;\xcb\xb6" -"\"~AX\xac\xfd\x41\x87\x9\x41\xfdwOe%\xb7\x8ag\x81\xfbPQ\x9a\xd9$\xe\xc7\xf3\x1c\x1b" -"\x85\xaa\xd4\x87\x45\xea.X\xef\x88\xb8\x90\xbf\x9c\\\xc5\x91\x1H\xae\xd5)\xf2iO\x1c" -"\xec\x8b\xe,0\x95*M\xd9\"\x1dS\xba\x84l\xbb\xaa-g\xd6N\xc2]\xb9\x7f\xef\x89s\xd5" -"\x12\x7\x93\xf\xe5XL\xde(\xa2sF\x8e\xd7q<\xf2\xe8\x86]\xec(^ \xf4\x9a\xd3\xe6\xca" -"NC\x90\x8a\x91\x16\xdf\x1b\xae\x41\xbf\xdbrK;\xf2\xcb\xfd%^\xe\xb6\x95`\xb3)\xb7" -"\xee\xa1K\xbc\xdf\xd0\x39\x8c\x66:\xb9\xc1<\xfcx\x98\xc6t\xbf\xa2\x7\x1\x8c\xd1\xc8" -"R\x81\xc4\xbc\x99[\x16\xee\xc7w\xf5\x1b\r\x19)\x10\x5SS,L>\x8eq\xac\xc6\xda\xf2\x19" -"4qpM?\xb9-\xe4\x94\xe8\x9f\x81\xbb\xf7\xbbp\r\xf\xe4m\x9a!\xf9\xcck\xf2Q\xae\x31" -"\xf4\x3\x34\xc6k\xd4\xf\x80\x1d\x2\xed\x63\xb5,>\xc6\xa1\x30=e\x9e\xde\x33\xc\xd5" -"=\xe8P(\x99\xeb\xc6\xdd\xa6U\xde=X1\x4\xe0\x1e\x12\x30\x1\xbc\xa6\xfb;\xa5\xff\xd4" -"\xf1\xe5\x6\xcf~\xd5\x9f\xe3\xf9\x91\x80\x8b\"r\xb1\x19r\x10\xe5\xea!;;\xf7\xd6\xa2" -"\x17|\xca;\x4\x83\x44{\xdb\x44\xad,\x80\xe0L\xf5\xe3hR_\x8dk\x9b\xa6\xb1\x14\xa4" -"\x14\\,\x8ai1\x13!\xc8\xd5\xceh/.\x13\xeeG \xe0V\x8e\xfd\x84\x88\xfa\xf5w`\xa9\x37" -"\"\xdf\xda\x84\x89\xefIc\xf2\xe6Yx\xad\xfa\xb8\xb9\xc9\xc8\xd9\x14\x61\x80\xb9+<" -"\x84\xc7%\xe1\xf5\xe\xa1\x35\x0Kdy|\xa6\xc6\xa8|\x95\x95.\x8f]h\x95\x8b\x64\x42v" -"\xd1\x6\xe3pj\xf1S\xca'\xf\x15\x9fo\x8a\xd7o\xb\x9fK\xe4\x93WO\xf5I\xadj\xb9\x9\xd4" -".W\x18\x42@\x1\xd8\xaa\x17V}\xfe\xc6j>\xc\xda\xf9\x8c\x89\xe5jF\x92\xf0\xd5\x85\xb1" -">\x8c\x8e\x1d\xd4\xa5\x80\x1b\x1e\xee\x8b:3;c\xd4Ne\xa2\xc5\n\x1b\x46\x61Z\xfcU\x3" -"\x90\xc1\x66\x8e\xa0j\xb0\xf6\xf9\xa1u\xe4\x8\xb1V\x8b\xb4p\xf7:\x9b\xab\xc7\xf8" -"'\x95\xad\x94\x6\x15p\x1e\xf5\xe2\x4h\x87\x41Gp\xff\xbe\x9c\x86\xbe\xcb\xef\x31\xda" -"o)O\xae\xd8\xe4\xf9\xca\x8Ja\x91]/q\x94\xadW\x8f\xd5\xb9\xe0\x1fL#\x2w\x8\xad\xd4" -"2o\xd7\xbH\xd0\xcb\xf9\xb4-\xf2\x86\x7\x84\x85\x9d\xd9\xcb\xc7\x7\x2\xc\x39\x17\xd1" -"\x92\xc\xe1\x64\xa6q\xd5\xe0\x9d&\x85\x45\xdf\xb9\xd2UZ\x1c{\x82\n\xc8\x2\x0|T\xb4" -"\x3\xe1\xa6\xf9U>l\xd5,d\x81nx\x8e\x61\x15\xeb\xe9R\rW\xaa]\x2x\xc1\xe6\x94\xf\xb8" -"\x9Y\x94\x1a\xf7\x8b\xdd\x96\x87ry\xca\xb4\\\x9e\xf7\xe4}\x90\xd2K[>\x8i\xb7i\xd3" -"\xa0\xfb\x3\xdc\xday\xee:R4\x9f?\xe8\x92\x4\xaf\xe5\x17\xb9tU\xea\x1b\x5o\x87\xcd" -"\x84\x62\x2Y<\xb7v\x8d\xd8\x93!\xaf=\xbd\xc0\xc1\x88\xda%\xb9i\x9c\xden\xb\x19(\xcb" -"@`\xf0\x9bOjl+hp\xb\xc1N\xb9\xfe(\x90\xfe\xcb^8\x9ev\x6\x18mD\x17\xf5\xf5\xa6\xba" -"\xbd\xf4<\x13R\xf4\xfe\xb4:\x99i\x8e\xcas\xc7\xd7\xeb\x93\xff]8\xeb\xfem\x10,\xfd" -"\r\x98j\xf3\x91\x84\xb4\xe0\x7\xbf\x65\x13\x1bj-\xab\xd1Y0 \xe2\xfd\xbaU\x9e\x93" -"\x9d\xaf\x7fl\xba\xce!vH\x9d\x45\xab\x86\xf\xa4\xa0Y0\xcdw\x18\x9cg\xd4\xb7-\xf0" -"?\xe8\xcfH$\x19\x97&!\xde_/\x1\x43\xea\x14\xf5\xdc\x8\x46;0+\xe1\xf4\xbds\xcd\x1f" -"l[\x17\xc7Mw@\xc8\x2\xcf\x19z\xb3\xf4\x12\xb6\x97\xc2\xbc\x8f\x41t>\xb2\xbeU\xe2" -"8\xdc\xdcj\x2S\xa7.cG\x9d\xbfV>j\x16\x19\x35\xf7\x7f\xe[\xc5\x37-\xd1\xf9*\xe1v>" -"\x5\xe0\x19\xb4yg\x80\x9d\x42p\x93$\xea\xde\x6\xce\xcd\x85\xda\xab\xc4V\xd9\xe9\x3" -"\xe0\x8=:t\xd5\xcd-\xf3\xb\xf1\xdb\x14w\xa6\xa7\x1aU\xa5#Y\xf4\x94\xf,3\x9b\xdbn" -"\xdb\xaa\xde>aML|6\xfa+&\xac\xcb\xf5 W\x9d\xf8\x9ar9\xec\x62xi\xae\xc6(\xe7\xf4\xac" -"\x9\xea\x13/~-\x3\x4\x8\xdc\x91\xf2Yl\x95J\x9c\x2o\xad\xcc\x41o\x1e\x6\x1bHCr!\xb5" -"\r\x8aKs\\\x91\xd6\xe8\xd2\x93~DT\xb0\xe8\xd1\xf5S\xb8J5\xc4>\x11\x1\xf4\x97\xf5" -"\xe4)\xd6\xe0\x85/\x1\x12\x13\xe7\x6\x8dS\xe4\xdcioo\x7f\xf9\x63}:\xc5\xed(\xb0\xf8" -"\xb5[\xaa\xba\xbf\xe8\xe9\xaa\x7f\xa6\x1rE\xb\xd1{a[\x1b\x89\x4\x8f\xcf\xee\x82\x95" -"R\x7z\xbc\x1d\x30\x61\\\x9bW%p\x1c\xb3\x9e\x66u@L\x82\x30\xba'9Z\xc8\xb5\x44O1\x86" -"\x0\xdd\xe1\x3\xd3\x3\x9c\xde\xf4\x65\xeh\xa9\xf1(\xc\xa8J\xa8\xcf\x87\xc6R\xae\xb4" -"\\\xce\xaf\xd1\xa2\x17\x93\x38Z\x17MJZX0p\x5\x93\xcd\xd9Ma7O\xf4\xebV>\xea\xee\x80" -"\xb7\x61#\xe\xd6\x1d\x6\xbe\x11\xfaWM\xe0\xael4RX:\xa5\x37h#\x8a%\xf5p\xef\xf0\xaf" -"_^\xbf\xde\xea\x98\xc8Z\xfd\xa5\x33\x19\x18&\x11\xe3\xe6(VY\xec\x99\xd2zq\x8a\xc5" -"\xa1\xcd|\xd8\xf,\x97\xbf\xe9\xbb\xed\xf6\x91*A\xa1q\xecX:\xe\xaaJ\xc5q\xb4\x95\xac" -"x\xb2u\xbe\xd4\x9e\xb3*\x2\x2\xa0\x7f\x1e\xbc\xb0\xa8\x9f\xd2\xd1\xcbn\xc4\x36\x31" -"\xe8\xe2hi\xaaj\xbdw_1\xe1\xca\xe5\x15\x8f\x90J\xc\x14\xa4\xefr\xd5\x1e P?\xf7\x81" -"Lqz\xf\x9b(\xae\x19\x89zD\x8d\x89\x5r]\xa4\xe4\xf\x17\xf6\xd7\x97\x85\x38\x9Z\xdd" -"^\x82\xe\x80\xde\x9f&\x1a\xce\x43\xd7}K\xf9u\x10\xf7t\x86\xe\x45\x3|y<(\x91[\x1\xcf" -"\xbf|c\x88\xb2\xe9\"[\xe'!\xcf_\xbbR\xba-\xa6\xbf\xbc\x11\xd5\x15>\xd1\x42?\xab\xc0" -"V$\xb5J\x1a`#^\xe2n\x90\x8f\x63\xc5(&1_\x1a\xd8O\xc7\x9d\xe2>\xd7\x93\xccuexGY\x0" -"\xe7\xa9\xba\x8a\x81.\x6\xd2\xb9r\x15VH?\xce\x1\xec\xdb\x7f\x83\x19\xbJo.\xb8r\x8f" -"[\xf9\x41\xa5\x93L\x96\x5H\xe4\xa8\xc0\xd1\x7fg\x8\x38\x66\x7\xa0P*\x1c\xeb\xc\xf8" -"\xee+\xa7\r\xe\xb\x35\x0\x19\xba\xf4\x15\xa6n\xe5\xe\xa8\xa8\xce\xefx\xad$$!\xd7" -"9|\x6\xca\xf7\x62\xf6\xb4\xbbT\xbb;\x84\x84\xf3\x98\x0\xf\x5q\xf3\xc9\x11\x1e\x96" -"\x16J\xf8\x42\nz\xaa\xd2\xb6\xb5\x5n\xc3]\xb\xd0+F\xa7\xe0\x7\xe2N\x1c\xdd\x16\x31" -"\xd3\x43\x85m\xa9\xa4\xb6n\xf3\x65\x61\x84K\x16\xe6\xbe\xb6\xf0\x8b\r\xc8\xde\x4" -"\xb0\x43\x64\x33]fW\xff\x91\x64\x95\xc3\xf9\xaa]\x87\xa2\xe4UB\x8a-H\x9fp\xc2\xaa" -"\xe0;d9\nn\x8\x30\x94\xe9%\xf7_\x7f.\xa2\x9a\x44\xc7n\xbbP\xd6-\x91\xfdx\xc3\x3\\" -"\xf4\xbb\xe1==r\x5\xda\xa2\x8e\xbb\xb2XEn(8\xc6\x41\xabQ\xe1\x65%\x94\xc9/Y/\xf8" -"\xd3\x1d\x90\xc6\xf1y\xe0gt~\x9dI\x9a^\xf\xcc\xf5\xc1gS\xbf\xb7\n\x32\x1\xfd\xee" -"d\x1c\x9f\x45\xcc\xff\xad\x87\x9eGyc\xc8\xd8\x91\x62\x19Tt\xef\x98O\x1e\xd3\xd6\x93" -"i\x90Z=U\xcag\x3\x88\x92\x13\xfd\x8c\xfd{\x2\x9a;\xe8\xad\xaa\xbf\x62\x1\x11g_oe" -"\xdf_[\x5\xc6\x35\xeb\xff\xd9\xd6\xc5s\xb0\xd6!tH\xc8\x81\xa4\xd2Rb\xce\xfd\xf4\x90" -"\x83\xe7uX\x9a@n\xd0?\x8b\x0\x38\xdc|G\xe1\xb4\x84\xdd\xff\x3Y\x94\xf4\xa6 \x9#\xc8" -"^\xdc\x82\x36\xd2\xe\x46\xb0\xd3\xe6\x17\xa8\xb0&\xcfpp\xce\xd1K3@\xe6\xdc\x34\xfe" -"\xf0 \xa9\xbep.\x17\xf4\xbc\xbcs\x87p\xe7oG\xff\xd8IaN$ }\xfa^o\x8d*\xaa\xb2\x4Q" -"\xd4\x41%\x46\xe4\xe\x8c\xbfV\xda\x8d\x12\x1f\x36N\x3\xee\x31\xc\xe1\xcb\x7fo\xa5" -"\x1ck\xce\xde\x9f\xc1\x98\xb6m9\xd5{#\xec\xcd\x34\x41\x46\x5\x93\xf4N\xc2,\xb4\x33" -"[\xf1\x9e\x9\xdd\xd8\x91\x84\xdc\xf\x9\xf6\x82\xdc\xa1\x87\x63\xear\xdbl\x8e\x32" -"\xfa\xaa\x8f\x0-I\xf9\x2='\xb5\x8\x39Z\xb7Q\xbe[\x2\xb5\xdb\x30\x9d\xc9\xa5\x1b@" -"\xe7uR\xbe\xe4\x8e\x37\x9f\xe4x\xbf\x33~\x3\x9d\xef\xcd\x99*\xfc/q*[\xf\x64n\xf0" -"\x90+Y=\x8e\x9f\x3\xbd\x9e\xb5\x12\xee\x34N\x11_\x84g\x1f!\xe5\xb5\xd0;\n\xc0T\x84" -"\x81\xa9\xa0r\x92\xf7\x9b\xf7LAw.\x16\x61\x1d\x15\xcf\x15\xec\x7\x98\x14\xec\xa3" -"\x1d\xf3\x80\xee?V\xe9\xbd\xb3\x9e\x0(\xb1W\x93g\n\xa6\xd1\xeb\xee\x19`0q\xee<\xa5" -"\x17\xfd\xa6\xf8\xc5v<\x9c\x97\xd1\x1e\xf6,\xd1\x95\x42\x41+U\xd5PX\x2t\x94\x14?" -"!}\xf4/\xf2\xde\x1cR\x9eS=\r\xdd\x46\xeb\xfa\x88m\xdc\xb9\x7-)\x9c\x13&m|\x7\xa2" -"\xce\x9f[v\xad\xdb\x44\xee\x65\x13$M}MU\xbe\x1a\xad\x98\x82\x14\x31(\xe\x33H\x89" -"q\x8b`\xb3\xe5\x89)\xa1\xb7\x19}K\xe0\x37S\xe2*[\xea!f\x9aN\xe7\x8a\xb0p\xa4\x1f" -".\xb0\x1a\x30\xf2\x0\x61\x9f\xcd\xb7\\\xff\x89\x81R\xf0\xc4K/\xa2U\x8\xcb\x34\x66" -"a\xf4\xfexF\x92\x8dR\x1J\xe2\x89\x81\xd8\x3\xea\xe\xb8R^j#\x18\xcd.\xd9os\x86\xa2" -"*\xc3`%\x2|]\x9dP\x18kZ(0\xde\x6+\x7\xefV\xba\x35\x88:\xe1\xa0\xc7k\xe5J\x9\x86\xeb" -"\xa0\x8f\xc4\x64\xb]\x18\xbd$\x7f,\xad}\x9f\x95\xbi\x8d\x11\xeb\x11\xaa\xe9\xf8G" -"\xf9%>\x91\xadL\xb5j\x1b\x8d\xc5\r\x19\xb8\x13\x62\xd1\xe1\xb0\x46\x61\xe5\x8f\xc8" -"k\x1\x65\x3\xbc\xff\xb6;=\xee\xf0<]\xfd\xfd\xb7\xcf,s-w\xa0\xd5_\xf7}/jz\xe2\xa8" -"\x96\xbc\x11\x84\xc9\xde\xb\xe3\x19$\xe0\x87\xe0\x82\x86(B~\xe\x61\xf5\x64\x14u\xc0" -"f\xcc\x66\xdb\x89\xc\x41}\xf5\x87\x9f\x11[\xf5\xd5+\x9b\xca\x3\xbbH" -"-\xa2\x39\x37/J\xf2\xdc\x92\xac\xf7'*5\xcf\x62,\xf6%\x12\x18\xdf\x39\xd9\xb3\xd0" -"DM6\xc8\xb7\xef}\xb3\xf7\xebW\xdf\x36\\\xed\x86\xf4\xa9-Hx,!\x94\x0\xb1:\n\x96\xab" -"2\xe0\x9e\x12K\x8a\xa0\x85\xbcP\x8c\x44\xe2\x99\xb7\xd5h\x9d\xbd|\xe0\x98\x1c!'\xd6" -"\x85;\xc0\x99\xe4\x37\xca\x5\x92\xafh\x1c\xe6\xffq\xa2\xdd$\x80y\x97(\x8a\xfa\x1a" -"@v\x2\x34-\x18\xf0i_D\"A\xc8\x97P\x4\x32\xfdsR\x9e\xeaU\x94\x8c\xa7~\x86\xc3\xf6" -"\xd4\xe8u\xae\xd4\xdc\xc5\x37}\x5Z\x8\xce\xc7\x0W\xe4\x13\x32@\xc6;\xa2\x8c\x1c\xa9" -"\x6#\xbe\xb5\x12\xe8\x9fO?\xcaV#\x9a\xd0\xc5z\x7f\xa9\xccmN\xbc~\xff\xb4'Io\xc3m" -"\x5\xc3\x95\xcd\xea\xfbZ!\xdd\x43\xc\x98\xfd\x80\x94>\xc4\x1e{A\xa6\x41\xa2\x8f\xc2" -"W\x92\x46\x92\xa5\x92\xc1\xae\xa4\x97\x12\xdf\xa7\xba\xa4o\x8cUbj\x1f\x30\xfd\x1" -"\x10]/\x9f\x46\xb\xdf\xfa\x83\x42\xcc\xad'{\xa5\xd1\x1d\x81[E\xad\xad[\xe5\xf7;\xd7" -">\xb5\xe2\xe5\xfc\xcc \x88;\xb5\xa1\xb5\xd5\xd5i\xc9\x93[\xb\xe7\x1e\x7f\xb8/\xb2" -"\xd1\xb4\xc2\xa8\xdc\xe2\x42\x36\xf6]+\x8f\xbf\xf5\x6o\xa3\x0\xf6g\xa4\xd2\xb6\xf1" -"P\xa9\xb1\xc2\xc6\xe5\rkod/\xaf\xf\xdb\x85\xcm~\xfd\x95_\x85\x82\x38O\x1a\x93z\x9a" -"2\xdd\x35tt\x3\xba\x93\xde|\xf7\xed\xe4\x37\xed\xb8>\x84\xe9\xdb\xaf\xfc\xe\x45\xf9" -"\x1Q\x1d\xfc>e\x14\x34\xbdX\xf0\xfcR\xc2\x8fl\xac\x35.\xb7\xac\xe4\xed\x61\xf4\x9d" -"\xf8\xce\xbf\xbe\xc\x9\x64\xe4\x84\xd2\xca\x8c\xa5\xf1\xfb\xc8\x39\xb9\x7\xf8\xc2" -"\xb5\xa4 \xcc\xa0\x65\x82\x86\x88'\xe9\x11S\x1\xfa\xa2\xbb\x43N[\xc9\xcc\x19x!\x7f" -"\xf5\xa9\x9a\x30\x38\xac\xf1:\x9d\x8f\xf8~\xa5\x45\xe4\x9d\xa1\xe9\xdd\xd0\xe9S\xf3" -"\x9c\xe7\xfe\xa2\xb0g+D3\x1d\x85\xa0:0\x15\x39\x9eO-\x3\xebr\xda\x46\x93\xf7\x33" -"\xa3K\xfa\x87)x\x6\xe\x65\xdcNB\x89O4\x14s\xee\xed`C\x1c\xe8\xfe\x1f,\xfc>WF\xc1" -"\xea\xd9n\"\x8c\xcd\x12\x3\xb\xbagK\xd3\xef\xc3\xdb{\xc7oV\xb7X\xa3\x91\xd4K\xd6" -"\xe9:Ke\xc1\xb1\x9\xda\x98\x81\x1b\x8\xffJ\x1c\x98\x19\xb$\xfe\xb0\xfd\xa2\x10\x7f" -"\xf8\x37\xbb;)\xc3\x1a\xfb-\xde\xbc\x35\x93\xedm\xf\xf0\xe8\x8b\x85\x32\"\x30\xac" -"\xa6\xf9\xcb\x82\xd6\x41\xa6~`,:\xb@\xa6\x95\xac\x1breS\x8aS\xb0M\xd2+T9Tn\x8cN\xf9" -"`p\xb6\x44i\x86\xb\x82\xbaO\xb7;BOh\x12\xcbX\xe\x17qPj\x89\x1cg\x8d\xf4\x85\x17\x84" -"\xeb\x30\xca\xa4\xd3\xdf\xe1@\xe5\x18\x62/\x87\x37\xb8oM\x9c\xff\xd8pq2\xe2\xb1[" -"\xe6\xb9\x87\xdd\x30\xa3\xbe\x84\x33\xe7\xdf\xfd\xe4\xd6*\xfc\x8em\xdf\xcf\xd6\x8d" -"\x7\xb2\xfd\xe9NBS\xb7U\x1\xd2\xc8\xe9\xf5VB\xe\x14\xc8\x89\x93\x32*$\xc3\x1fn7\xd4" -"[\xa1\xa2\xe0\x34\xb3\xf7I\xd3p^C\xce\xf5\x45\xd4z\xf8iHD\x8d\xd0\xb8\x86\xcc:\x98" -"\xa1\xc1\xb8\x39\x9b\xee\xa8k\xa1\xf3\xa6\x9f\xd5\xa4\xef,\xed\xb6p\xf5\xb9$\x9e" -"\x17h\x97\xe4\x6\x14\x9a\xe0\xc6\x6=\xa4\x9a\xca\xfb\x1d\xbf\xf7\x11\xb9w\xdc\x7f" -"]Jg6n\x93\xc7\xb7\xd2\xcf\xe4\x61\xe8\xfa\xa4\xd1i\x10\x9c\x8>l\xdd\x15\x64\xe5\x94" -"\r;\xcf\x64!\xabhO\x83" -"\x8a\xb2\x16[\xcfn\xc6\xd3\xa9=\xe2\xbd\x6)\x1bl\x4\xf8\x65\x87\x85\xa2\xf7\x1aL" -"\xcf(j\xbb\x90'f\xa4^\x97%\xf0\xdeVMq\xcf\x9dQJ\r\x88\xa2\xfa\xcb\x11\x9c\x7f`w\xd9" -"W\x16\xe5\xac\x93T9\xb4\x7f\xa0 \x8e\x9e_\xd9\x66\x61y\xf4Z!\xef\xc4\x17\xb8.\x11" -"\rl,\xb5\xd7$\xc3\xfc\x10\x32\xdd[$dL\xa4\x91\x8dL\xb4\xdf\xb=\x8e\xcd\xdc\xb2\xe1" -";\xaa\x96}v\xd4\xab\xcc$9 ^\x4\xc9;\x11$\xc\xae\x2\\\x45m\xe5\xda%\x34\xa5$\xaf\xd8" -"~N`\xd6.\xb1\xab}\x1dT\xe2>b\x9d\xd8\x87T\xc0V\xe7\x8f\x5~\xf6lI}\x99:\xf6\x1f\x9b" -"fTJ<\xa6\x99\xdf\xb2\xed\xeer\"\x19\x19\x9dIb\xcbr\xd3No{_\xc4\xbc\x45\xef\xd1$\xb" -"\xf4\xa8z+\x88\x35\\\xaa?\xbc\xfb\xdf\x61Y\xbc\x1cr\xdb\x44\x89\xbc\xa2yP~\x8d\xbe" -"g\xb1h\xdb\x9ek>\xe1\xe0$\xe4.\x2\xcb\x7j\xb7\x1e\xe6\x9\xf8\x8a\x10\x9b\xf0\xf\xf7" -"_\xc9\x1aS\xd4\x91Q\xf1\xf8O\xd1_\x99\x3\xf1\xd3\xa3\xc6\x66\x18\xc4\xc0\x7!\x87" -"_\x84\xa9\xb2UFfs\xdf{\xfe\xfd\x19:\xb0\r#\x94\x97\xd5\xae\xfaoxpY4\xf1\xaa\xad\x9b" -"jQQ;\xaesI\xccOR\x15LC\xe0\x36\x16\xbc\xdc\xda\xaa\x9d\xbd\x16\x8d\xce\xd6v\xbch" -"\xf\xfcj\xc\xcd\x9c/n\xfe\x80|\xf6\xab]\x82\xd2\xbau\xdc\xa1\xc2\xd7\xe0\x8d%\xbf" -"\xfd\x64\x8c\xd3[\x1e\x3\x82t\xaa\xd7\xcf\xc2q\xff\xef\xeb\xa5\rv\xd6\xd2)'\xb4\xd7" -"\x93\x1f\xbb\xc3\xcfJ\xec\x10\x1e\x7\x43L\xd8\xba\xa2\x8dz4O+K'U\xa6\xf7\x46\xa6" -"ch\xcc\xdax\xa0\xc4\n\xf1\xc1\xae\xf1\x81\x32\x13\xbc\x1b\xbd\x17\x15\x1b\xa7s-\xfb" -"\x8bY\x3x\xbe\xc8\x42\x66\xa3\xda\xa3Hqf\x9d\xb9\x97\xb1x\xf7\x99\xc0]1\r\xa0\xd9" -"}>\xd2\xf4\xb3\x1e\x33\xe4\xf1\x34\xb1y\x81\x8bo\xaa\xe8\r\xdc\x15\x99\xd0M\xc8\xfd" -"\x18\x92\xa9^\xbb\x12\x8eq\x9c\xfb\x88^\x13\xfd\xbf\xab\x96\xbe\xd7\x32\x63~u\xa4" -"#{\x3\x9\x90\xac\xf7\x9\x64\xbc?\x16\xb0\x95i\xc\x8bT\xd1\x62p\xb9\x0\x45\x63~\xe" -"P\x94{[l\xe\xc4\x38<\xf4z\xf5\x8awq\"\x11{\x1d\x93\x91.\x1d\x93\x90\xd3\x64\xe7\x65" -"?\x92\xf)_\xbdy\xc6\x35\xa1\x12H\x15\x83\xbbx\x18\x44\xe3\xef\xf4\xc8\x66|\x1f\x8a" -"\xab\xbdmt\xf6\x37\x86\x11\xfa\xa1\xb0\x91u\xba\x98\xef\xfc\x2\xf9\xce'\xd6l}\x18" -"\xc\xe4\xe8\xa7m\xa7\xcd\xb8\x99\x1&\rr\xafy\xf8R\x94\x7f\x89\xdb)\x93\xdd\x1d\x11" -"\xce\xd6 /p\xb9\xa6\xca\xecz\x82\x13\xc8N\xee\x4\x36;\xd2\xd6\xb\xc9\xbb\xe9\x36" -"\x89\xfa\xfe\xa0\xed\xe5u\xd4\x89\xa0\x31Q\x98\x18\xaeP\x8cY\x9a{\x14;\x1b_\xe2\xae" -"\x16J\x82\x63{w\xcb\xe4\x36\xd7\xcd]\x18@\xf1\xbe\xc3\xe4\xd6\xfa\xbe\xb3\xde\xea" -"\xbbW\xc\xde'\x0p\xb1\x41~,r?\x85>\x0\xa1\xd1\xd1*.\xc6\xca#\xaax\xe1\x36\xb1|\x7" -"\xe7\xb6\x9a)\x16\r\x61\xbaTW\x83\xa3\x86K\x1d\xa0\x89\x42\xfe@\xcd\"\n\xc3\x80\x8a" -"\xfcoi\xf1\x1c\x8b\xc8\xe2v\x1at\xd8s\x8c\xd4\x1b\xe9\x44\xfcP[%\xc3\xa7\x84\xe1" -"]\xbc\xec\x5\x9\x99\xc8\xe1\xf5WI\xc8\x32\xd6M\xfe\x1a\xf1\x19\xe5\xddJ\x5\x32^\xcc" -"f+\xcf\x7fjp\xdfo+a1\xba=\x95\xf0\xd3V?\x7f\x43\xa6x\xeb\x9c\x44\xf7\xf5\xaaP\xa8" -"\x6\x1al\x16\xd0N\x9\xb8\xac\x5\x82x\x9\xbe\xec\x45\x1a\xf1\xe2\xc2S\xfI*,\xaf\\" -"\xf3\x80\x1\xf2\xa6\x16\x86\xc2Lj\x11\x13\xe9\x9\x8b,I\xf9\x92\xd3*\xc4\xa8\xf0i" -"t\xef\x9f\x97K$\x11!\x91^\xce\x38\x33LA\x82x\xf\x9e\x32\xd4 _t\x84\xc0\x33\xd5\x97" -"\xc0\x91\rG\xbc\x37\x64\x0mK_\xc2\x8a\x46\x15\xbd'\xb4n[\xb9\xbb\x84\x83\xb5\x46" -"\x19\x33\xdc\x9e\x8i>\x9\xc2g\xba\xeb\x17P\rv>\xde\xfbP6\xf8 \x8\x1c\x1a\xd0\xc7" -"1\x12\x32\x6\xdewO\xa4\x64\xb9\xdf\x19\xe2\xbeIK;0\xe2\x9a\xb\x8a\xad&6\x2\x35~\xd1" -"\x1a\x66\x62r\xbb\xb1\x14\xa1\xe4\x90\x43\x1d\x83\x8b\xe1\x9a&\x8e\xa9j\x8d\x64n" -"\xdc\x15Y\x80\x38Y\x85$yk\x89\xa8W\xb0%\x93S\xd0\xc2V\xf+9\xb6\xde\x83\x83\xcb\xb6" -"\xcaM\xf\xfb#Z+v\x1b\xa3\xf7\x94\xd0g\xf1o\xd0\xe6Qq\x18&\x14\xc8\xc8(\x83\xbd\x92" -"\x3\x31\x8f\x38\xe1'\x9a\xc7\x13\xe6\x8e\xe3\x93\xef\xaeL\xb\xef\x1dOP\x9d\x19\xf5" -"@E\x92\xf0h\x90S\xd4\x7\xf1pj?a\xee\xf0\xce\x1dn\xbc\xffI\x1\xd8w\x15\x63\xb0\xe4" -"\xfb\x7\x85\x97\xf9\xc5\x90$\xb0\xc6z\xef\x2\x1W\xc0\x94Q\xef\xfb_\xbau\xa9\xc2x" -"\r\x87\xa8\x65t]\xc\xe8\xd1\xf5\x35\xdd\x7\xfe\n\x17\xd5t\xbb\x14W\xb5\xd1\xee\x9d" -"\xc5\xdc\x41\xec\x41\x8a\xa3\x18\x32\xeZ\xbc\x7\xb+g]\x1c\x46?w\xd7'S\x1cx|\xeb\xb4" -"f\x7-\xf\xda\xf2$\xa1\x90?\x18\xdf\x46\xe9\x8b\xb4\xccR\x88\xf1\x1f\x88oW\rw\xb\x34" -"k\xe0\x5\x98\xf9\x92\x9\xeb\xc5\xf2\xcc^\xd4\xaf\x88\xa9mlc$\xc4n\x96I\xb2\xfc\x37" -"\xb5k\n\x7+\xad\xb2\xc7\xf8\xafK\xe1\xcaYx\xd9\xdb\x9a\x45\xc9\x9d\x41i\x1\xcf\x8c" -"0\x90-=O\xd4\x13i_\x18\x4\x34\x45\x88\x8e\x91\xa7k\xd5r\xccL>\xd8\xea\xbf\xf2\x96" -"\xfe\x8a\x8e\xd3\x32\x5'\xee\xc\x98\x82\xed\xf4\x9cn\xb8\x39\xa1\xaa\xfa\xcb\x82" -"\xac\xdb\x87\xd4\xa1@\x97\nj`<\xdf\xe8\xbe\xe7-\x8auQ\xe\x43\xd1i\x0\x1a\xdb),\xc6" -"\xb6-\x6\x93R\xc4\xcf\xf9\x6n\x12\xd8\"l\x14\x36*0\xa6(\x8e\x38QY7\xfcT\x1d\x1d^" -"\xca\xb8\xa3)\x10\x98\xd3<\xfa\xf8\x93\x39\xc4\x38\x44\xf8N\xe3\xc5\x7f\x17\x15\x35" -"O\xd2\xab\x8f\xef\xa1\r>\x4\xf4\x31\xb6gG\xe9\x1a\xee,\x93_g\xd2Uk\xebK\x16\x41\x8b" -"<\xa8\x18\xc8\xb8_\x83\xb5\x92\xca\x99\x15\xd3\x41\x14\x1d\xc5*fvM\xb0\xbbt\x10@" -"\x88\xd9\x31Y\xc8\xcf\x31U\x83\x34\xe0\xbf\xd4\xc0\x1a\x12.Z\xb0o5\xb7Q\xf7\xfe\xa6" -"O?\x7\xe1\x6\x43\x81O85p3\xb3M\x82\xe7\x1c\xf9\x9e\x94\x81\xbd\x44\xf0\\\x9b:\xb0" -"\xdd\xd0\xc9\x2\x8d[%\x1e\xf3\xbc\x16}m\xc1\x37u\x87\x1c\xad)\xda\x1f\xd9\x1e\x46" -"\x1P\xf5\x15\x6\xb4\xfe\x13\x4T\xf2\xe7\xa3\xe4\xc9\xa4\xa2\xd7\xe6\xc4\x32\x91\xf7" -"\xd9\x41\x8d\x87r\xf5uV`a\xf\xa4\x90\x9bT]YM\xb\xf9\x8\xc8\x10\x92y9\x9c\xeb)3\xd1" -"\xec\xbb\xdd\xb1\x85\xb8\x41ra\xf[\xb\xe7\x12\xda~2O\x93\x38\xba|VdDI\xf\x83)2\xfd" -"\xb3?\xd0\x9e\x39{\xe0j\r\xe\xc0n\x94o\xf0gs\xa3\x38\xed\xe4\xe3\xbe\x9f\xc8\xac" -"\xf9\x8b\xc9\x81\xe1\xaf\xc\x41/\xc0\xbdsX\x93$6\xbd\xdc\x43\xb0|\x6\x19\x9\xd9)" -"h.}\xe9\x87*\xfbm\x9bW\xe9m\xef\x7f\xf9\xdd\xbeJd\xef!\xd1\x41\x89\xf7\x0Zd\xd2\x13" -"`z\xbeH\xc6p\"\x98\xc\xb3h\x17\x41\xd6\x33\xdc\xc1]_\xd3HL\xac\xea\xf5\x6k\xaf\xdd" -"\x86>>\xae\x64\xb6\x82n\xd7\xd7Ht\xab\xac\xaf(\xce\x96\"\xb1\xb8\xd4\x34*-\x83\x36" -"\x8w_\x97\xd0\xa5Y\xce\x42\x33\x0\x8c\x41/\xb0\x11~r\xe4S\x7\xb0\x99\xc6G$\x14\x15" -"\x6\xb2\xa9\xc5\x65\xedT\x1dG\x8fI\xae]\x98\xcc\x9a\x9bu\x11\x3\xef\xcb\xb9\xf0\x97" -"\x99\xfa\x87O\xd3\xc9\xbe\xab\xeY|\xe6\xeb\x42_\x93\xf4\xb8\x35`\xdb\x87\xf7Q\x82" -"\xa7U\xcc\xa3\xdd\xdd\xb8pve\xa8\xbe\x1\n@\xec\x61\x17\x4l\x91\xe5\x33\x7f\xb7\xca" -"7~\xc9o\x6;\xa5\xe1\xf9{\xfe\x1c\x12\x14qq\x3`l\xd3s\x85\x36&\xfd\x46\x6 \x13\r\xb0" -" \xb0_N\xa1\xd3\x64K*\x8d\xa1\x1c\xdd,l*\x6Q\x17'\x80\x98\x63\xb\xc7\xf\xdc\xe0\x65" -"\x1b\xc5\x16\x85\x84\x1d\x82O\xa4-\xf0\xea\xb5\x42|@\x81\x98\xdb\x9'\xc9\x11\x66" -"\xb4l\x9d\x89\xa7`\xee\xdb\x93\x8\xa5\x15\xcvu\xbc\x5\xec\xcc\xbc\x0Q\xea\x8d\xa1" -"\xfd\xe8\x13,\xc0\x64\x12\xf1\xd6\xdc\xe0+\xc7o\xfc\xee\xb8\x87\x5\x64\x7\x86 \xf9" -"\xfa\x7f\xda\x86x\x11\xa3\x30O\x0\xa4\x16\x9d\x96\xe5\xcf\xec.\xbf\xa9\r\x81\xdd" -"\xe0yIe\x9d\x31?\xf7\xf8@+\xdb\x1e\xeaL\xe0\x16\x63\xe3\xbe\xc0\x4\x0\xaa\x33\xf6" -"\xb8\x16ij\x13\xc8\xdb\xc3\x38\xaa\x19/\xcc>\x6\xc4[v\xea\x41\xef\x15k6E\xbf\xc3" -"\xee_\x1f+\x15\xef\x8f\xefv\"\x0q\x96\xf9\xd8'\x90\x97\x91\x9a\"T1\xe6h;\xb3\xca" -"\xbbq\xdf\xf8\xd8\xa5y\xd1t\xb2\x6?H\xd6;\x7f\xe1j\x9c\x83\xdf\xf1\xff\xae\xbf\xd3" -">\x9c\xa2\x93\xa8\xc3\xe6\xf9P\x1es\x90\xb\xf?\\i\x86\xeb.zt0{m\x86\xb8H\x6'\xc3" -"\x9c-\x1!\\O\x95\xba\xed\x4#\x5\xd7 \xdd\xe7\x11k\x93\x19\xe\x87\xd5\xf5\x5\n\xa0" -"\xdb\xd0\xe8\xd6\x98\x8a\x98.}*\x1bp\xb3\xb7\xf5\xf8\xb8\x6\xf4\x9d\x36&\xdd\x1e" -"\\\xb7\x3\x38\x3]\xf5S\xab\xdbL\xe6\xbeK_\x97}\xb8r(\x99\xce\x46\xc3\xd0\xaa\x83" -"1C\x8f\x1c\"\xe1iy\x83\xb8*:k\x12\x8f*\xe5\x13P\x9f\xc6m\x8aV\xf4\xf7IUqm\x0\x8\x1e" -"O\x1d\xcf\xda\x34@\x8f\xfc\x5\xca\x46\x81\x37\x97%\x18\x83x4?\x87^sK\xf5\xdd\xce" -"\x99\x18l\x95\x32\x99\x98\x0\xcdKBc\x10^\xf3\x14\xb8\xce\x10*>\xc7\xb5\xec\x8\x38" -"\xe6\x61\x8c\xc0\x16\xd8\xda\xb5\xc4Yv\xf4\x91\xcf\xc1\xf5\x42\xb6\x2\xc\x90}d\xf8" -"\"\xbb\x62j\xa0?\x4\x34H\x4\xda\x44M\xe1M\xe2U\x85\x32w\xdd\x16x\xaf\xaa\xf8*\xb3" -"\x85\x1a\xaf\xd2\xc8\xff\xb6\xb7\xa2^\xb5\xa1\x16Y6\xac\x2\xa5?\xca[j$\xc5\xb0\xc9" -"\x88M\x1\xb5H\x95\xcd\xc6\xe6LO0a\xd2\xeav\xa7\xb4\xf7\xb0\x16O\xaf\x3\xac\xcd?\xbe" -"\x9b\xcez\x12\xd2\xa3z\xf3\xf4L.\x86O\xbe\x84\"\xd4\x61\xabU<\x10\x1f\x9e!\xa5\xb" -"\xbd\xcbm\xdf\x39N/\x80\xf9J,r\x1f\xfd\xba\x3v\x88\xf0\x16\xc9\xbe\xc8\xdc\x1b\xbb" -"i\xca\x91\xb0H#\xca\xa2\xfd\x7\xaa\xb\x1f\x10q!2Q\xd2GS\xfcz\x8e\x15&(\xe2?[\xbf" -"\xcb\xae\xcb\xf\x61\xca\xc8\xdc\xc6\xa8\xff\xca\x3\x11H='\x98\x45\xcJ\xf2\x1fW\x98" -"v?[N\xc5N\x99\xcc%\xcc\xf0\x1\x9e\x95\xc7\xb8\x99g\xef\xf0\xe0\x2\xf5vX;\xf8\xff" -"\xa6hP\x0n\x9f\xeb\xf\x46\x18\xab" -";\xf2\xa8\xcd\x65\xcf\xe9vN\x8d\x99\x98\xb1\xd9r\xca\xcf\x11'8\xd7\x80LM/TU)\x3\x1f" -"\x81\x30o_\xbb\xe9t\x6\x39\x35uL\x8d\x8aU\xcc\xce\x35\xfe\xf8\r\xbb\x63\x19\xa4\xc" -"$\x84\xda\x95\xc7w\xd9\xab\x30\xdeV\xf0q\xec\x32\x98\xe3\x16\x33X\xc5\xf2\xd7\xd0" -"\xb8\x96\x8c\xa4\xdfr{\x8c|~W\x12\x36\xb7\xfc\x30\x8dl\x9a\xed\x82J~\xa3R\x7f\xcc" -"\xf2\x62n\xea\xd5\x81\r\x45\xdf\x80\x1a\xb7\\\xd9X\xcb\x42\xa0\xf\xf9sJ\xe6\xa9\xd8" -"p\xa4\x39-bI\x96/\x81\xbb\x14]b?_8\x4\x6\x2]N:I\x15\x9\x43\x9c\xa5\xc9Uy8ab\xaa\x2" -"\xd4W@\x80\xaa\xaf\xda \x3\xa2\xcch\x1\x65t\x9f\xd5\xdc\xea\xa9\x1b\xf4{\xd8\x38" -"\xf1j!\xe1\x16\xa3\x96\xe9\xe6\xf7X\xd4\x1d\xf5\r?\x16\x10\xf7\xd8\xa6RW\xae\x0\xf2" -"\xce\xdel\xab\n\xda\x9b\x16\xd9\xad\xdc\x30\xcbz\x6\x8b\x35\x8e$z\xb5\xc1\x81\x9" -"\"\xa7\xe#\xd6\xf\xcb]\x13\xb5" -"\xe5\x99|\xb2\xd1\x15\xab\xdd\x35\xc8\xd8\xd6N\xc1\xba\xc\xb\x1d\xa8o\xc4\xb\xb1" -"\xa4V\xc0=y\xbe\x63\xa8p\xe9\xa8\x82\xc2\x35\x95\xb\xeb\xabs;ZP\xad\xb0|5\xbd\x8c" -"\x7f\x88\x7\xf6\x3\xfd\x7\x34\xb4\x96\xe1\xa7\x83\xe5\x18\xa9\x6\x9b\xc2,\xe8\xf4" -"\x8f)\xb9\x5\xa1\x8f\x11\xf\xda\x8e\xe4:\xcf\"\xbe\xdf\x99\xb2\xeb\xb1\xe6\x7\xd1" -"\xab\x92\r\xc2\x90\xe3\r\x4\x1c\x46\x8a\xc\xf2}\x94\x83Q\xd5\xcr\x5uRd\xdcj\xddR" -"y\xca\x17*\xbf'\xba\x1b\x93\xa6#\xf2\xe4yd\x9Y,\xe8L\x1a\xe4\x10.K\x92!\xc6\xa8\xc8" -"Fc\x19\xe6\xbf\xe0\x89u\x9dh\xddX\xf7L\x19\xb3\xdf\x9e\x14\n\xa3\x1a\xc2kuD\xa8I" -"seP{5\xf8U\x86\xb6\x2U\x81\xb8\xf\x66G\xff\xf7\x13\x39\xac\xdd\x1\xc2\xfe\x36\xc6" -"\xb7\xe6\x15\xca#0J\x82\x8f\xb7\x9d\x89\x15\x45\xab\x8c\xf5\xd1Q)\xb9u\xaa\x66\x13" -"+\x89\xbd\x18\xe8\x9a\x91\x6\xb7\xa9]\xe0J;\xb4\xf0\x80%q\x88l\\8\xd0Z\xd0\x9a;\xe3" -"\xbb)`\x12\x8b\xf2+p\xa8\x10*, c\x83L\x96\x9c\xf0P\xa5\xaf<\x5\n\x33G5\x8e\x0\xfd" -"\xb0\x39\x1d\xc3\xe0\xbe\xfd\xb1\xe5!x$:\r\xde]\xc8?\xc7\xa8T\xeb\xa1\x98,\xe7\xff" -"e\xe7P\xb9\xc4\xdd\x86\xdd\xb7\xffJ\xe7\xb7'\x2\xd3\xcb\xc7\xa0\xb3i\x10-$|\xae\x19" -"g}\x99\x8f{U\xf\x90\x1a\xday\xa8#\x19\xf2N\x18\x6\xf4M\xd8%\x32m\x7f]\xf6\xa9\xc0" -"\xbb\x95\x46\xeb(\xe1\xd6\xdb\xdb,\xc1\x8b\xa3\xd4\x63\xab\xd8\x38\xb2\x8\x41\x9c" -"\x16\x8a-\xe6\x8f%(%\xfa\xf4%\xfe\x39\x7f\x85/\xbf\xb4\xd3yins\xb8K\x9a\x87\x64X" -"\xf5&\xa6#\xa5\xa0#\x8a!\xc\xd5\xbbq\\3\xd3\xa8\xb4\x83R\x90,-\x83\xd1\x89R\xc5_" -"\xa7I\x88Q2\xabk~m\xb7\x94\xb1Y\x88\xb9\xd5\x11\x43\x81$\xd8\xdd\xe3g\x8ateO\x92" -"S\xd0\xb8\xb5p;\xd0\xd3[?~\xa2\x94\xfd\xd9\xb4\x46\x1\xa8\xe7<\xcb?\xdb\xd9\x80\xc2" -"9\x1dLy(\xb4\x1b\x46\xe9\xad\x16\x38\x86\xac\xc2\xb6\x8c\\L*\x6\x91\x1a\x7f\xb3n" -"\xccTK}\x88lu\xda\xcbR0\x8e\xe0\xef\xea^?\x16\xa1\x10(\xa5\x39)\xf7\xb4\x95\x38\x96" -"\x1\xbd\xca\x15\x86\x9\xb9\xd8\xbe\x1a]h\xe5\xce\x38'\x18\x9a\xfJ~\x18-\xb0\xeb\x81" -"\xfa\r\xcdlXp\x98\xf2\x64\xa3\xd0\xe2\x4\x9f\x84\xc8\xa4\xe8\xffP:h\xe8\x10+CjK\xc9" -"V\xeb\x90\x81\x14<\xf2\xcb\x90:\xbas\x7\xf\x8b\xf\x39" -"\x80\xce\xb2\x88\x14\x94$\x96\x8b\xc1\n\xb2\x46j\x15\xce\xdb\xdfU\xe\xea\x62<\x16" -"*:yc\xd6W\xce\xd1\x19\x10\x16\x2\x89\x8b#\xd7\xcb\x99\x61\x8b[=Y\x86\x8fZ\xc3\x1c" -"\xe2\x89\xef\x1d\xf5k\xa4\xc5\xc3\x98\x6\x8dZ\x92\x8aJ\xa5\x33%\xd9[\xd1\xc7t\xf0" -"\xd1\xd5\x3\x62\x8b\xa1ToFC\x3\xe0\xf4T\xccj\xca\x98\xd0\x32\xac\xf0Xr\xda\x95\xa9" -"\x18\x8d\xf\"K\x87\\\x5\x15|/\xc9\x93\xd6U!\xa7p\xe6\x96$\x7\xa2,\xf*\x14\xb8\x0" -"d\xbb\xc7OIla\xb4\x42U\xc4\xcQ\xbd\xf6\r\xbf\xa7\x90\xfw)mY\xab\xf6\x1f\x96O\xef" -"\xb6\xaf\xf3\xf5\xdc\xcd\xd7\xa8\x12\xfb^\xc3\xcm\xc8\x6;\xd8(\xf6\xad\xea\xd2\x42" -"\xdc\nnr\xb1\x0\xa6\x94\xac$\x8\x9d\x15\xb\x87)\xdeZ2*\xd7}\x84\xe7\xf4\xa6%p\xa1" -"x\xf0\xa9\xec\r\xd3*{\x90\x91x\xd9\xa5\x44\x43\xc\xff\x30\xe2\xe5p\xdb\xbb\x64\x9d" -"\x9e\x19UK9Tg\x13\x4~\xe0\x86\x1b\x8a\r\x96\xfi\r..\x16\xf$\xf1R\xf6\xf0\xa9?k\x13" -"\xb1\xeb$w\xa4\x16\xfb\xf3\xc1R\x96\xdd\xb1:=\x9\xf7q\xd8\x61\x8a\x85\xde\xc2\x36" -"/\x88\xd1\x17\xf1\xbb\x17N\x82\x9f\x96\xf9\xbe\x96[\x17S!\xa3\xbb\x7\x46\x37k\x95" -"&\xb\x82\xcf\x34\x13M)\xba\x64%\xd9\xb8nvG\x91\xd6\x99xAQ\xbf&\xd4\xdc[\x1\xcc\xf" -"\x88&\x1d\xf8\x8e<\xab\xb3q\xd3\x34\xe1\xa2\xf5\xf6\x9R\xecp8@? E\xf7\x9%\xe9\xd8" -"\xb4\x9e\xcc\x33\xb\xd9\xfV=8\x94\xb1\\\xe6)\xe6\x86\xe3\xba\xe5\x94\xe5\xc2Q/y\x82" -"\xea\xb9_\xd4<\xd5\x95\xd8\xec_\xdf\x96/^Rw\xe4\x16\xa9\x1c'\x91x\xbd\x98\xd0\x82" -"\xce\xd5\x65P\x15\xc9\xf4%\xc0H\xae\xc1\x35\xf5\xbf\x41&\r\xeat\xfc\x1c\x16\x98L" -"=\xb8\xde\xaa\n\x65\xc1\x42kz^\x91\xac_g\xe2\"\x90^\xfc\xdd)|\x1c\xaa\x1d\xfc\x17" -"\xfa\x1a=\xe4\x62\xd3 \n\x14\x91\xd4\x1b&\xf7\x99G]\xae\xd3\xd6\xe3\xb1\xfe\x92=" -"<\xacPX#\xa1\xe7|\xe6\xb0|\xc.\xfe\xc2\x7\x34z\x8e\x44\xd3\xc5\xd1\x96\x37l{~\xdc" -"\xe7\xc9\xbe\xd0Q\x9d\xa1\x91\xa6?\xab\x42z\xb9\x30\xc1\x15oQ\xc8\xd5\xac[\xd9\xd0" -"b\xe0\xe0@\x89\x35]\xf1\x61\x94P\xc4\r\x0P\xbe\xcf\x10\x37\xbd\xc9\xb6-}L\x90\xb7" -"b\x19\x99\x1d!Z7\xb3\x10\x91\xcf\xd8\x32\xd6\xa9Vi\xdd\x2\xb9\x4\n\xc2\xb6\x4\x19" -"\xdc\xf0\x64\xaap\xa3\xc9\x1a\x10\xe5\xe4\x8p\x93$o\xb9VE\x82\x8au\x8d\x83_Q\xdc" -"\xc7\xab\x13;6\r\xbb\x0<\xee\xaa\xa1\x10-\xfc\x7\x93\x1f\xe\xe2\x38'=\x9d\xc4\xc9" -"\xc8\xb8\xff\x8\x92\x32\xbf\x82?\xfd\xd7\xa3=\r~\x14 p\xf2@\xd0x\xfd\xf5\x90\xda" -"\xfd\x88\xb8\x96)\xb0'Z\xf4\"\xebT\xbc\x12\x85\xea\xe5\x8c\xad\x6\xbc+\x12\xd5\xa0" -"\xc2\xbf\xe5\x1cM\x10\x82\xaa#\xea\xaf\x33\x42q\xc0R>1\x93\xd6\xaaKj0\xbc\xca\x62" -"\xed\xb6\x62\xd3\r\x93\xf5\xf5S\xa2\x11\x61,\xc2\xea}\xa1\xd1\x91\x12\xcb\x98\x17" -"'\xed\xf4\x41\x36\xef\x35\x8e\xda\x2\x44\x46I\x0\x8a\x8e\x9d\xb0\x98Z\xce\x34\xa5" -"k\xcc\xd4\x93\x37\x81\x38\xaf?\x16\x32\xcd\x88RY\xf0\x1f\x97\xa3\x8b\x18TC\xe3\xb4" -"@\x8a\xaa\x6\xc0\x95)@5E\xdcv\x8b\xe1\xf6\xe4\xb4\xe8^\xc2\xf0\x94\xab\x6\xd4\xed" -"xb\x4\x89\xde\x90\x14\xed=Jv\xaf\x19\xa7\\=e\xc7<\xf8\xb3\xae\xda\x99>\x97(\x9b\xba" -"AgX\xd5\x61\xd6\xdc\x12#\xf3\xa5\xa7@\xc2\xa6O\xe4\xaa\x2\xa8\xaf.\xff\xf0\xa3\xfd" -"\x8c\r\xac\xc5\xb6\xa9\xf0\xea\xe8\x83\x33Y\xbfk\xef\x10\xd0;\xd9\x31\xf0[\xea\\" -"\xc1\x17\xe2\x1a\xa4\xe3\xa4\x86\x84SW\xa2V\xaf\x1a\xc2\x82\x96qit[\xce\x45\x92\xb4" -"P\x1c\xf4\x10\xe4\x4Z\x8a\xc4{\xf7/\x80,\xe9>V)H\xb0\x8Hs\xf3?\x87#@\xb4\x93\x9T" -"\xa9z\xe2^\x9ctgq\x17\xeb\xba\xcc\x18\xe5\xcf\x9d\xa2\x89\x61\xe6\x44,T_~\xe1\r\x6" -"\x89\xca\xd6{^~\x9a\xbc\xba\xd9\x34g.\x1:b+\xcd\xe5\x41\xa2\xba\xea\x62\xf9W\xc1" -"\x99\xfc>\xeb\x1b\xb8\x9\x1e\xd8\xac\x15\x9fZ\xfb\x61\xd3X\x93\xaf\xba\xa5\x88*\n)P\xf9\xac\xdb\xb8\x8dH\xb9\xd7\x64\x80" -"\x91[\r\xd9\x85\x7L\x4)\xe9\xf4\xec\x35lm\x1f\x41\x80\x96\xea\xd1\x8c\xb7\x66\x9d" -"\xcev\xe8\xb2\x1ak\xc\xf1\x9d\xba\xf1\xe7\x9e,p\xa1\x88\x8f\xfc\xaev\x17\x45\x18" -"\xc3U\xc3\xf7\x33\xb6\xd0Q\xd9\x37\x1byi\x8\xc0\x9b\xa1\xcb\x9f\xe3\xc7\xe1nE)\x91" -"!&\xb5%>\xffj\xce\xcd\xa3\xc3\x7f\xcc\xc7\x61\xf9\xd7\x81\xf0\xc7^\xb7\x7\\\x12\x1c" -"hT\x7\x6\x95\x8e&\x16n\x19\xe1\xc0\xb2\x9e\xe0\x8d,#\x82\xf9\x9a\xc7\xe\xe4\xeeJ" -"b\x96\xa4\xff\xecU/=\xb6G\x1a\xa4-;8\x85r#\xfeQ\x1d\n\xa3Z\x84\xb1\xc1 Z0K-\xb\xfc" -"\x95\xff\xfb\xd6\x3\xe8\xe6\xf4.`\x1z(\x8\xba\xbe\x0\xc2p\xce\xbao\x93\xb8;\xb9\xc4" -"\x1cw\x87\x99'4\x17\x1f\xc2\xa4\xf0\xb4o\x6\xc6\xf0)\xc8,\xcc\x98[|<\x84\xea\x65" -"Tx\xffy\xe8\xab\x8f\xe6\xcc\xe5\x91\xec\xb3\x9c\x35:\x80\x1\x14\x2\x0\x0\x30\x30" -"00000000000000000000000000000000000000000000000000000000000000\r0000000000000000" -"000000000000000000000000000000000000000000000000\r000000000000000000000000000000" -"0000000000000000000000000000000000\r00000000000000000000000000000000000000000000" -"00000000000000000000\r0000000000000000000000000000000000000000000000000000000000" -"000000\r0000000000000000000000000000000000000000000000000000000000000000\r000000" -"0000000000000000000000000000000000000000000000000000000000\r00000000000000000000" -"00000000000000000000000000000000000000000000\rcleartomark\n\x80\x3" -; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.h deleted file mode 100644 index 79a897f65..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/fonts.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef __fonts_h__ -#define __fonts_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern char* d050000l_afm; -extern int d050000l_afm_len; -extern char* d050000l_pfb; -extern int d050000l_pfb_len; -extern char* n019003l_afm; -extern int n019003l_afm_len; -extern char* n019003l_pfb; -extern int n019003l_pfb_len; -extern char* n019004l_afm; -extern int n019004l_afm_len; -extern char* n019004l_pfb; -extern int n019004l_pfb_len; -extern char* n019023l_afm; -extern int n019023l_afm_len; -extern char* n019023l_pfb; -extern int n019023l_pfb_len; -extern char* n019024l_afm; -extern int n019024l_afm_len; -extern char* n019024l_pfb; -extern int n019024l_pfb_len; -extern char* n021003l_afm; -extern int n021003l_afm_len; -extern char* n021003l_pfb; -extern int n021003l_pfb_len; -extern char* n021004l_afm; -extern int n021004l_afm_len; -extern char* n021004l_pfb; -extern int n021004l_pfb_len; -extern char* n021023l_afm; -extern int n021023l_afm_len; -extern char* n021023l_pfb; -extern int n021023l_pfb_len; -extern char* n021024l_afm; -extern int n021024l_afm_len; -extern char* n021024l_pfb; -extern int n021024l_pfb_len; -extern char* n022003l_afm; -extern int n022003l_afm_len; -extern char* n022003l_pfb; -extern int n022003l_pfb_len; -extern char* n022004l_afm; -extern int n022004l_afm_len; -extern char* n022004l_pfb; -extern int n022004l_pfb_len; -extern char* n022023l_afm; -extern int n022023l_afm_len; -extern char* n022023l_pfb; -extern int n022023l_pfb_len; -extern char* n022024l_afm; -extern int n022024l_afm_len; -extern char* n022024l_pfb; -extern int n022024l_pfb_len; -extern char* s050000l_afm; -extern int s050000l_afm_len; -extern char* s050000l_pfb; -extern int s050000l_pfb_len; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.cc deleted file mode 100644 index 1e668a054..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.cc +++ /dev/null @@ -1,606 +0,0 @@ -#include -#include -#include "../gfxdevice.h" -#include "../gfxsource.h" -#include "../devices/rescale.h" -#include "../log.h" -#include "../../config.h" -#ifdef HAVE_POPPLER - #include -#else - #include "xpdf/config.h" -#endif -#include "GlobalParams.h" -#include "InfoOutputDev.h" -#include "CharOutputDev.h" -#include "FullBitmapOutputDev.h" -#include "BitmapOutputDev.h" -#include "VectorGraphicOutputDev.h" -#include "../mem.h" -#include "pdf.h" -#define NO_ARGPARSER -#include "../args.h" -#include "../utf8.h" - -static double zoom = 72; /* xpdf: 86 */ -static int zoomtowidth = 0; -static double multiply = 1.0; -static char* global_page_range = 0; -static int threadsafe = 0; - -static int globalparams_count=0; - -typedef struct _pdf_page_info -{ - int xMin, yMin, xMax, yMax; - int width,height; - int number_of_images; - int number_of_links; - int number_of_fonts; - char has_info; -} pdf_page_info_t; - -typedef struct _pdf_doc_internal -{ - char config_bitmap_optimizing; - char config_full_bitmap_optimizing; - char config_only_text; - char config_print; - gfxparams_t* parameters; - - int protect; - int nocopy; - int noprint; - - GString*fileName; - GString*userPW; - PDFDoc*doc; - - Object docinfo; - InfoOutputDev*info; - - pdf_page_info_t*pages; - char*filename; - - /* page map */ - int*pagemap; - int pagemap_size; - int pagemap_pos; - - gfxsource_t*parent; -} pdf_doc_internal_t; - -typedef struct _pdf_page_internal -{ -} pdf_page_internal_t; - -typedef struct _dev_output_internal -{ - CommonOutputDev*outputDev; -} dev_output_internal_t; - - -typedef struct _gfxsource_internal -{ - gfxparams_t* parameters; -} gfxsource_internal_t; - - -static const char* dirseparator() -{ -#ifdef WIN32 - return "\\"; -#else - return "/"; -#endif -} - -void pdfpage_destroy(gfxpage_t*pdf_page) -{ - pdf_page_internal_t*i= (pdf_page_internal_t*)pdf_page->internal; - free(pdf_page->internal);pdf_page->internal = 0; - free(pdf_page);pdf_page=0; -} - -static void render2(gfxpage_t*page, gfxdevice_t*dev, int x,int y, int x1,int y1,int x2,int y2) -{ - pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; - gfxsource_internal_t*i = (gfxsource_internal_t*)pi->parent->internal; - - if(!pi->config_print && pi->nocopy) {msg(" PDF disallows copying");exit(0);} - if(pi->config_print && pi->noprint) {msg(" PDF disallows printing");exit(0);} - - CommonOutputDev*outputDev = 0; - if(pi->config_full_bitmap_optimizing) { - FullBitmapOutputDev*d = new FullBitmapOutputDev(pi->info, pi->doc, pi->pagemap, pi->pagemap_pos, x, y, x1, y1, x2, y2); - outputDev = (CommonOutputDev*)d; - } else if(pi->config_bitmap_optimizing) { - BitmapOutputDev*d = new BitmapOutputDev(pi->info, pi->doc, pi->pagemap, pi->pagemap_pos, x, y, x1, y1, x2, y2); - outputDev = (CommonOutputDev*)d; - } else if(pi->config_only_text) { - CharOutputDev*d = new CharOutputDev(pi->info, pi->doc, pi->pagemap, pi->pagemap_pos, x, y, x1, y1, x2, y2); - outputDev = (CommonOutputDev*)d; - } else { - VectorGraphicOutputDev*d = new VectorGraphicOutputDev(pi->info, pi->doc, pi->pagemap, pi->pagemap_pos, x, y, x1, y1, x2, y2); - outputDev = (CommonOutputDev*)d; - } - - /* pass global parameters to PDF driver*/ - gfxparam_t*p = i->parameters->params; - while(p) { - outputDev->setParameter(p->key, p->value); - p = p->next; - } - p = pi->parameters->params; - while(p) { - outputDev->setParameter(p->key, p->value); - p = p->next; - } - - gfxdevice_t* middev=0; - if(multiply!=1.0) { - middev = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_rescale_init(middev, 0x00000000, 0, 0, 1.0 / multiply); - gfxdevice_rescale_setdevice(middev, dev); - dev = middev; - } - - if(!pi) { - msg(" pdf_page_render: Parent PDF this page belongs to doesn't exist yet/anymore"); - return; - } - - if(!pi->pages[page->nr-1].has_info) { - msg(" pdf_page_render: page %d was previously set as not-to-render via the \"pages\" option", page->nr); - return; - } - - if(pi->protect) { - dev->setparameter(dev, "protect", "1"); - } - - outputDev->setDevice(dev); - pi->doc->processLinks((OutputDev*)outputDev, page->nr); - pi->doc->displayPage((OutputDev*)outputDev, page->nr, zoom*multiply, zoom*multiply, /*rotate*/0, true, true, pi->config_print); - outputDev->finishPage(); - outputDev->setDevice(0); - delete outputDev; - - if(middev) { - gfxdevice_rescale_setdevice(middev, 0x00000000); - middev->finish(middev); - } - -} - - -void pdfpage_render(gfxpage_t*page, gfxdevice_t*output) -{ - pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; - render2(page, output, 0,0, 0,0,0,0); -} - -void pdfpage_rendersection(gfxpage_t*page, gfxdevice_t*output, gfxcoord_t x, gfxcoord_t y, gfxcoord_t _x1, gfxcoord_t _y1, gfxcoord_t _x2, gfxcoord_t _y2) -{ - pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; - - int x1=(int)_x1,y1=(int)_y1,x2=(int)_x2,y2=(int)_y2; - if((x1|y1|x2|y2)==0) x2++; - - render2(page, output, (int)x*multiply,(int)y*multiply, - (int)x1*multiply,(int)y1*multiply,(int)x2*multiply,(int)y2*multiply); -} - -void pdf_doc_destroy(gfxdocument_t*gfx) -{ - pdf_doc_internal_t*i= (pdf_doc_internal_t*)gfx->internal; - - if (i->userPW) { - delete i->userPW;i->userPW = 0; - } - if (i->fileName) { - /* will be freed by PDFDoc::~PDFDoc */ - i->fileName = 0; - } - - if(i->doc) { - delete i->doc; i->doc=0; - } - free(i->pages); i->pages = 0; - - if(i->pagemap) { - free(i->pagemap); - } - - i->docinfo.free(); - - if(i->filename) { - free(i->filename);i->filename=0; - } - - if(i->info) { - delete i->info;i->info=0; - } - if(i->parameters) { - gfxparams_free(i->parameters); - i->parameters=0; - } - - free(gfx->internal);gfx->internal=0; - free(gfx);gfx=0; - - if(global_page_range) { - free(global_page_range); - global_page_range = 0; - } - - /*globalparams_count--; - if(!globalparams_count) { - delete globalParams; - globalParams = 0; - globalparams_count = 0; - }*/ -} - -static void add_page_to_map(gfxdocument_t*gfx, int pdfpage, int outputpage) -{ - pdf_doc_internal_t*i= (pdf_doc_internal_t*)gfx->internal; - if(pdfpage < 0) - return; - if(pdfpage >= i->pagemap_size) { - int oldlen = i->pagemap_size; - i->pagemap_size = oldlen + 1024; - if(pdfpage > i->pagemap_size) - i->pagemap_size = pdfpage+1; - - if(i->pages) { - i->pagemap = (int*)malloc(i->pagemap_size*sizeof(int)); - } else { - i->pagemap = (int*)realloc(i->pages, i->pagemap_size*sizeof(int)); - } - memset(&i->pagemap[oldlen], -1, (i->pagemap_size-oldlen)*sizeof(int)); - } - i->pagemap[pdfpage] = outputpage; - if(pdfpage > i->pagemap_pos) - i->pagemap_pos = pdfpage; -} - -void pdf_doc_setparameter(gfxdocument_t*gfx, const char*name, const char*value) -{ - pdf_doc_internal_t*i= (pdf_doc_internal_t*)gfx->internal; - if(!strcmp(name, "pagemap")) { - int pdfpage=0, outputpage=0; - sscanf(value,"%d:%d", &pdfpage, &outputpage); - add_page_to_map(gfx, pdfpage, outputpage); - } else if(!strcmp(name, "poly2bitmap")) { - i->config_bitmap_optimizing = atoi(value); - } else if(!strcmp(name, "bitmapfonts") || !strcmp(name, "bitmap")) { - i->config_full_bitmap_optimizing = atoi(value); - } else if(!strcmp(name, "asprint")) { - i->config_print = atoi(value); - } else if(!strcmp(name, "onlytext")) { - i->config_only_text = atoi(value); - } else { - gfxparams_store(i->parameters, name, value); - } -} - -gfxpage_t* pdf_doc_getpage(gfxdocument_t*doc, int page) -{ - pdf_doc_internal_t*di= (pdf_doc_internal_t*)doc->internal; - if(threadsafe) { - /* for multi-thread operation, we need to create a new PDFDoc instance - for each thread */ - di->doc = 0; - } - if(!di->doc) { - di->doc = new PDFDoc(di->fileName, di->userPW); - } - - if(page < 1 || page > doc->num_pages) - return 0; - - gfxpage_t* pdf_page = (gfxpage_t*)malloc(sizeof(gfxpage_t)); - pdf_page_internal_t*pi= (pdf_page_internal_t*)malloc(sizeof(pdf_page_internal_t)); - memset(pi, 0, sizeof(pdf_page_internal_t)); - pdf_page->internal = pi; - - pdf_page->destroy = pdfpage_destroy; - pdf_page->render = pdfpage_render; - pdf_page->rendersection = pdfpage_rendersection; - pdf_page->width = di->pages[page-1].width; - pdf_page->height = di->pages[page-1].height; - - pdf_page->parent = doc; - pdf_page->nr = page; - return pdf_page; -} - -static char*getInfoString(Dict *infoDict, const char *key) -{ - Object obj; - GString *s1, *s2; - int i; - unsigned int u; - - if (infoDict && infoDict->lookup((char*)key, &obj)->isString()) { - s1 = obj.getString(); - if ((s1->getChar(0) & 0xff) == 0xfe && - (s1->getChar(1) & 0xff) == 0xff) { - s2 = new GString(); - for (i = 2; i < obj.getString()->getLength(); i += 2) { - u = ((s1->getChar(i) & 0xff) << 8) | (s1->getChar(i+1) & 0xff); - s2->append(getUTF8(u)); - } - char*ret = strdup(s2->getCString()); - delete s2; - obj.free(); - return ret; - } else { - char*ret = strdup(s1->getCString()); - obj.free(); - return ret; - } - } - return strdup(""); -} - -static char*getInfoDate(Dict *infoDict, const char *key) -{ - Object obj; - char *s; - - if (infoDict && infoDict->lookup((char*)key, &obj)->isString()) { - s = obj.getString()->getCString(); - if (s[0] == 'D' && s[1] == ':') { - s += 2; - } - char*ret = strdup(s); - obj.free(); - return ret; - } - return strdup(""); -} - -char* pdf_doc_getinfo(gfxdocument_t*doc, const char*name) -{ - pdf_doc_internal_t*i= (pdf_doc_internal_t*)doc->internal; - if(!strcmp(name, "title")) return getInfoString(i->docinfo.getDict(), "Title"); - else if(!strcmp(name, "subject")) return getInfoString(i->docinfo.getDict(), "Subject"); - else if(!strcmp(name, "keywords")) return getInfoString(i->docinfo.getDict(), "Keywords"); - else if(!strcmp(name, "author")) return getInfoString(i->docinfo.getDict(), "Author"); - else if(!strcmp(name, "creator")) return getInfoString(i->docinfo.getDict(), "Creator"); - else if(!strcmp(name, "producer")) return getInfoString(i->docinfo.getDict(), "Producer"); - else if(!strcmp(name, "creationdate")) return getInfoDate(i->docinfo.getDict(), "CreationDate"); - else if(!strcmp(name, "moddate")) return getInfoDate(i->docinfo.getDict(), "ModDate"); - else if(!strcmp(name, "linearized")) return strdup(i->doc->isLinearized() ? "yes" : "no"); - else if(!strcmp(name, "tagged")) return strdup(i->doc->getStructTreeRoot()->isDict() ? "yes" : "no"); - else if(!strcmp(name, "encrypted")) return strdup(i->doc->isEncrypted() ? "yes" : "no"); - else if(!strcmp(name, "oktoprint")) return strdup(i->doc->okToPrint() ? "yes" : "no"); - else if(!strcmp(name, "oktocopy")) return strdup(i->doc->okToCopy() ? "yes" : "no"); - else if(!strcmp(name, "oktochange")) return strdup(i->doc->okToChange() ? "yes" : "no"); - else if(!strcmp(name, "oktoaddnotes")) return strdup(i->doc->okToAddNotes() ? "yes" : "no"); - else if(!strcmp(name, "version")) { - char buf[32]; -#ifdef HAVE_POPPLER - sprintf(buf, "%d.%d", i->doc->getPDFMajorVersion(), i->doc->getPDFMinorVersion()); -#else - sprintf(buf, "%.1f", i->doc->getPDFVersion()); -#endif - return strdup(buf); - } - return strdup(""); -} - - -/* shortcut to InfoOutputDev.cc */ -extern int config_unique_unicode; -extern int config_poly2bitmap_pass1; -extern int config_skewedtobitmap_pass1; -extern int config_addspace; -extern int config_fontquality; -extern int config_bigchar; -extern int config_marker_glyph; -extern int config_normalize_fonts; -extern int config_remove_font_transforms; -extern int config_remove_invisible_outlines; -extern int config_break_on_warning; - -static void pdf_setparameter(gfxsource_t*src, const char*name, const char*value) -{ - gfxsource_internal_t*i = (gfxsource_internal_t*)src->internal; - - gfxparams_store(i->parameters, name, value); - - msg(" setting parameter %s to \"%s\"", name, value); - if(!strncmp(name, "fontdir", strlen("fontdir"))) { - addGlobalFontDir(value); - } else if(!strcmp(name, "addspacechars")) { - config_addspace = atoi(value); - gfxparams_store(i->parameters, "detectspaces", "0"); - } else if(!strcmp(name, "detectspaces")) { - config_addspace = atoi(value); - } else if(!strcmp(name, "unique_unicode")) { - config_unique_unicode = atoi(value); - } else if(!strcmp(name, "poly2bitmap")) { - config_poly2bitmap_pass1 = atoi(value); - } else if(!strcmp(name, "marker_glyph")) { - config_marker_glyph = atoi(value); - } else if(!strcmp(name, "normalize_fonts")) { - config_normalize_fonts = atoi(value); - } else if(!strcmp(name, "skewedtobitmap")) { - config_skewedtobitmap_pass1 = atoi(value); - } else if(!strcmp(name, "remove_font_transforms")) { - config_remove_font_transforms = atoi(value); - } else if(!strcmp(name, "breakonwarning")) { - config_break_on_warning = atoi(value); - } else if(!strcmp(name, "remove_invisible_outlines")) { - config_remove_invisible_outlines = atoi(value); - } else if(!strcmp(name, "fontquality")) { - config_fontquality = atoi(value); - } else if(!strcmp(name, "bigchar")) { - config_bigchar = atoi(value); - } else if(!strcmp(name, "pages")) { - global_page_range = strdup(value); - } else if(!strncmp(name, "font", strlen("font")) && name[4]!='q') { - addGlobalFont(value); - } else if(!strncmp(name, "languagedir", strlen("languagedir"))) { - addGlobalLanguageDir(value); - } else if(!strcmp(name, "threadsafe")) { - threadsafe = atoi(value); - } else if(!strcmp(name, "zoomtowidth")) { - zoomtowidth = atoi(value); - } else if(!strcmp(name, "zoom")) { - char buf[80]; - zoom = atof(value); - } else if(!strcmp(name, "jpegdpi") || !strcmp(name, "ppmdpi")) { - msg(" %s not supported anymore. Please use jpegsubpixels/ppmsubpixels"); - } else if(!strcmp(name, "multiply")) { - multiply = atof(value); - } else if(!strcmp(name, "help")) { - printf("\nPDF device global parameters:\n"); - printf("fontdir= a directory with additional fonts\n"); - printf("font= an additional font filename\n"); - printf("pages= the range of pages to convert (example: pages=1-100,210-)\n"); - printf("zoom= the resultion (default: 72)\n"); - printf("languagedir= Add an xpdf language directory\n"); - printf("multiply= Render everything at the resolution\n"); - printf("poly2bitmap Convert graphics to bitmaps\n"); - printf("bitmap Convert everything to bitmaps\n"); - } -} - -void pdf_doc_prepare(gfxdocument_t*doc, gfxdevice_t*dev) -{ - pdf_doc_internal_t*i= (pdf_doc_internal_t*)doc->internal; - i->info->dumpfonts(dev); -} - -static gfxdocument_t*pdf_open(gfxsource_t*src, const char*filename) -{ - gfxsource_internal_t*isrc = (gfxsource_internal_t*)src->internal; - gfxdocument_t*pdf_doc = (gfxdocument_t*)malloc(sizeof(gfxdocument_t)); - memset(pdf_doc, 0, sizeof(gfxdocument_t)); - pdf_doc_internal_t*i= (pdf_doc_internal_t*)malloc(sizeof(pdf_doc_internal_t)); - memset(i, 0, sizeof(pdf_doc_internal_t)); - i->parent = src; - i->parameters = gfxparams_new(); - pdf_doc->internal = i; - char*userPassword=0; - - i->filename = strdup(filename); - - char*x = 0; - if((x = strchr((char*)filename, '|'))) { - *x = 0; - userPassword = x+1; - } - - i->fileName = new GString(filename); - - // open PDF file - if (userPassword && userPassword[0]) { - i->userPW = new GString(userPassword); - } else { - i->userPW = NULL; - } - i->doc = new PDFDoc(i->fileName, i->userPW); - if (!i->doc->isOk()) { - return 0; - } - - // get doc info - i->doc->getDocInfo(&i->docinfo); - - pdf_doc->num_pages = i->doc->getNumPages(); - i->protect = 0; - if (i->doc->isEncrypted()) { - if(!i->doc->okToCopy()) { - i->nocopy = 1; - } - if(!i->doc->okToPrint()) { - i->noprint = 1; - } - if(!i->doc->okToChange() || !i->doc->okToAddNotes()) - i->protect = 1; - } - - if(zoomtowidth && i->doc->getNumPages()) { - Page*page = i->doc->getCatalog()->getPage(1); - PDFRectangle *r = page->getCropBox(); - double width_before = r->x2 - r->x1; - zoom = 72.0 * zoomtowidth / width_before; - msg(" Rendering at %f DPI. (Page width at 72 DPI: %f, target width: %d)", zoom, width_before, zoomtowidth); - } - - i->info = new InfoOutputDev(i->doc->getXRef()); - int t; - i->pages = (pdf_page_info_t*)malloc(sizeof(pdf_page_info_t)*pdf_doc->num_pages); - memset(i->pages,0,sizeof(pdf_page_info_t)*pdf_doc->num_pages); - for(t=1;t<=pdf_doc->num_pages;t++) { - if(!global_page_range || is_in_range(t, global_page_range)) { - i->doc->displayPage((OutputDev*)i->info, t, zoom, zoom, /*rotate*/0, /*usemediabox*/true, /*crop*/true, i->config_print); - i->doc->processLinks((OutputDev*)i->info, t); - i->pages[t-1].xMin = i->info->x1; - i->pages[t-1].yMin = i->info->y1; - i->pages[t-1].xMax = i->info->x2; - i->pages[t-1].yMax = i->info->y2; - i->pages[t-1].width = i->info->x2 - i->info->x1; - i->pages[t-1].height = i->info->y2 - i->info->y1; - i->pages[t-1].number_of_images = i->info->num_ppm_images + i->info->num_jpeg_images; - i->pages[t-1].number_of_links = i->info->num_links; - i->pages[t-1].number_of_fonts = i->info->num_fonts; - i->pages[t-1].has_info = 1; - } - } - - pdf_doc->get = 0; - pdf_doc->destroy = pdf_doc_destroy; - pdf_doc->setparameter = pdf_doc_setparameter; - pdf_doc->getinfo = pdf_doc_getinfo; - pdf_doc->getpage = pdf_doc_getpage; - pdf_doc->prepare = pdf_doc_prepare; - - /* pass global parameters to PDF driver*/ - gfxparam_t*p = isrc->parameters->params; - while(p) { - pdf_doc->setparameter(pdf_doc, p->key, p->value); - p = p->next; - } - return pdf_doc; -} - -void pdf_destroy(gfxsource_t*src) -{ - if(!src->internal) - return; - gfxsource_internal_t*i = (gfxsource_internal_t*)src->internal; - - gfxparams_free(i->parameters); - i->parameters=0; - - free(src->internal);src->internal=0; - - delete globalParams;globalParams = 0; - free(src); -} - -gfxsource_t*gfxsource_pdf_create() -{ - gfxsource_t*src = (gfxsource_t*)malloc(sizeof(gfxsource_t)); - memset(src, 0, sizeof(gfxsource_t)); - src->setparameter = pdf_setparameter; - src->open = pdf_open; - src->destroy = pdf_destroy; - gfxsource_internal_t*i = (gfxsource_internal_t*)rfx_calloc(sizeof(gfxsource_internal_t)); - src->internal = (void*)i; - i->parameters = gfxparams_new(); - - if(!globalParams) { - globalParams = new GFXGlobalParams(); - //globalparams_count++; - } - - - return src; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.h deleted file mode 100644 index 3a6f4fcd6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf.h +++ /dev/null @@ -1,37 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __pdfsource_h__ -#define __pdfsource_h__ - -#include "../gfxsource.h" - -#ifdef __cplusplus -extern "C" { -#endif - -gfxsource_t*gfxsource_pdf_create(); - -#ifdef __cplusplus -} -#endif - -#endif //__pdfsource_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf2jpeg.c b/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf2jpeg.c deleted file mode 100644 index 4a3fb1632..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/pdf2jpeg.c +++ /dev/null @@ -1,163 +0,0 @@ -/* pdf2jpeg.c - Converts a pdf page to a jpeg. - - Copyright (c) 2010 Matthias Kramm - Copyright (c) 1998-2009 Derek Noonburg - - Swftools 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. - - Swftools 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 swftools; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "parseargs.h" -#include "gmem.h" -#include "GString.h" -#include "GlobalParams.h" -#include "Object.h" -#include "PDFDoc.h" -#include "SplashBitmap.h" -#include "Splash.h" -#include "SplashOutputDev.h" -#include "config.h" -#include "../jpeg.h" - -static int page = 1; -static int width = 0; -static int resolution = 150; -static int quality = 95; -static char ownerPassword[33] = ""; -static char userPassword[33] = ""; -static char cfgFileName[256] = ""; -static GBool printVersion = gFalse; -static GBool printHelp = gFalse; -static char output[256] = "output.jpg"; - -static ArgDesc argDesc[] = { - {"-p", argInt, &page, 0, - "first page to print"}, - {"-r", argInt, &resolution, 0, - "resolution, in DPI (default is 150)"}, - {"-q", argInt, &quality, 0, - "jpeg conversion quality"}, - {"-w", argInt, &width, 0, - "zoom to this width"}, - {"-o", argString, &output, sizeof(output), - "resolution, in DPI (default is 150)"}, - {"-opw", argString, ownerPassword, sizeof(ownerPassword), - "owner password (for encrypted files)"}, - {"-upw", argString, userPassword, sizeof(userPassword), - "user password (for encrypted files)"}, - {"-cfg", argString, cfgFileName, sizeof(cfgFileName), - "configuration file to use in place of .xpdfrc"}, - {"-v", argFlag, &printVersion, 0, - "print copyright and version info"}, - {"-h", argFlag, &printHelp, 0, - "print usage information"}, - {"-help", argFlag, &printHelp, 0, - "print usage information"}, - {"--help", argFlag, &printHelp, 0, - "print usage information"}, - {"-?", argFlag, &printHelp, 0, - "print usage information"}, - {NULL} -}; - -int main(int argc, char *argv[]) { - PDFDoc *doc; - GString *fileName; - GString *ownerPW, *userPW; - SplashColor paperColor; - SplashOutputDev *splashOut; - GBool ok; - int exitCode; - int pg; - - exitCode = 99; - - // parse args - ok = parseArgs(argDesc, &argc, argv); - - if (!ok || argc != 2 || printVersion || printHelp) { - fprintf(stderr, "pdf2jpeg version %s\n", xpdfVersion); - fprintf(stderr, "%s\n", xpdfCopyright); - if (!printVersion) { - printUsage("pdf2jpeg", " -o ", argDesc); - } - goto err0; - } - fileName = new GString(argv[1]); - - // read config file - globalParams = new GlobalParams(cfgFileName); - globalParams->setupBaseFonts(NULL); - - // open PDF file - if (ownerPassword[0]) { - ownerPW = new GString(ownerPassword); - } else { - ownerPW = NULL; - } - if (userPassword[0]) { - userPW = new GString(userPassword); - } else { - userPW = NULL; - } - doc = new PDFDoc(fileName, ownerPW, userPW); - if (userPW) { - delete userPW; - } - if (ownerPW) { - delete ownerPW; - } - if (!doc->isOk()) { - exitCode = 1; - goto err1; - } - - paperColor[0] = paperColor[1] = paperColor[2] = 0xff; - splashOut = new SplashOutputDev(splashModeRGB8, 1, gFalse, paperColor); - - splashOut->startDoc(doc->getXRef()); - - if(page>=1 && page<=doc->getNumPages()) { - double r = resolution; - if(width) { - int old_width = doc->getPageCropWidth(page); - r = 72.0*width/old_width; - } - doc->displayPage(splashOut, page, r, r, 0, gFalse, gTrue, gFalse); - SplashBitmap*bitmap = splashOut->getBitmap(); - if(bitmap) { - Guchar*rgb = bitmap->getDataPtr(); - int width = bitmap->getWidth(); - int height = bitmap->getHeight(); - jpeg_save(rgb, width, height, quality, output); - } - } - delete splashOut; - - exitCode = 0; - - // clean up - err1: - delete doc; - delete globalParams; - err0: - - // check for memory leaks - Object::memCheck(stderr); - gMemReport(stderr); - - return exitCode; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.cc deleted file mode 100644 index 4da1a6fba..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.cc +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include -#include -#include "popplercompat.h" - -#ifdef HAVE_POPPLER -static char* getTempDir() -{ -#ifdef WIN32 - char*dir = getenv("TMP"); - if(!dir) dir = getenv("TEMP"); - if(!dir) dir = getenv("tmp"); - if(!dir) dir = getenv("temp"); - if(!dir) dir = "C:\\"; -#else - char* dir = "/tmp/"; -#endif - return dir; -} - -char* mktmpname(char*ptr) { - static char tmpbuf[128]; - char*dir = getTempDir(); - int l = strlen(dir); - char*sep = ""; - if(!ptr) - ptr = tmpbuf; - if(l && dir[l-1]!='/' && dir[l-1]!='\\') { -#ifdef WIN32 - sep = "\\"; -#else - sep = "/"; -#endif - } - - // used to be mktemp. This does remove the warnings, but - // It's not exactly an improvement. -#ifdef HAVE_LRAND48 - sprintf(ptr, "%s%s%08x%08x",dir,sep,(unsigned int)lrand48(),(unsigned int)lrand48()); -#else -# ifdef HAVE_RAND - sprintf(ptr, "%s%s%08x%08x",dir,sep,rand(),rand()); -# else - static int count = 1; - sprintf(ptr, "%s%s%08x%04x%04x",dir,sep,time(0),(unsigned int)tmpbuf^((unsigned int)tmpbuf)>>16,count); - count ++; -# endif -#endif - return ptr; -} - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.h deleted file mode 100644 index 8303369a4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/popplercompat.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef __popplercompat_h__ -#define __popplercompat_h__ - -#include "../../config.h" - -#ifdef HAVE_POPPLER - #define POPPLER_INTERPOLATE GBool interpolate, - #define POPPLER_INTERPOLATE_ARG interpolate, - #define POPPLER_MASK_INTERPOLATE , GBool maskInterpolate - #define POPPLER_MASK_INTERPOLATE_ARG , maskInterpolate -#else - #define POPPLER_INTERPOLATE - #define POPPLER_INTERPOLATE_ARG - #define POPPLER_MASK_INTERPOLATE - #define POPPLER_MASK_INTERPOLATE_ARG -#endif - -#ifdef HAVE_POPPLER - #define POPPLER_TILING_PATERN_RETURN GBool - #define POPPLER_TILING_PATERN_GFX - #define POPPLER_TILING_PATERN_GFX_ARG -#else - #define POPPLER_TILING_PATERN_RETURN void - #if (xpdfMajorVersion*10000 + xpdfMinorVersion*100 + xpdfUpdateVersion) < 30207 - #define POPPLER_TILING_PATERN_GFX - #define POPPLER_TILING_PATERN_GFX_ARG - #else - #define POPPLER_TILING_PATERN_GFX Gfx *gfx, - #define POPPLER_TILING_PATERN_GFX_ARG gfx, - #endif -#endif - -#ifdef HAVE_POPPLER -char* mktmpname(char*ptr); -#endif - -#ifdef HAVE_POPPLER - #define POPPLER_RAXIAL_MIN_MAX , double min, double max - #define POPPLER_RAXIAL_MIN_MAX_ARG , min, max -#else - #define POPPLER_RAXIAL_MIN_MAX - #define POPPLER_RAXIAL_MIN_MAX_ARG -#endif - -#ifdef HAVE_POPPLER - #include - #include -#else - #include "xpdf/config.h" - #include "gfile.h" - #include "GString.h" -#endif -#include "Object.h" -#include "Stream.h" -#include "Array.h" -#include "Dict.h" -#include "XRef.h" -#include "Catalog.h" -#include "Page.h" -#include "PDFDoc.h" -#include "Error.h" -#include "Link.h" -#include "OutputDev.h" -#include "GfxFont.h" -#include "GfxState.h" -//#include "NameToUnicodeTable.h" -#include "GlobalParams.h" - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.cc deleted file mode 100644 index 1f5d8d156..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.cc +++ /dev/null @@ -1,1556 +0,0 @@ -//======================================================================== -// -// Annot.cc -// -// Copyright 2000-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "GList.h" -#include "Error.h" -#include "Object.h" -#include "Catalog.h" -#include "Gfx.h" -#include "GfxFont.h" -#include "Lexer.h" -#include "Annot.h" - -//------------------------------------------------------------------------ - -#define annotFlagHidden 0x0002 -#define annotFlagPrint 0x0004 -#define annotFlagNoView 0x0020 - -#define fieldFlagReadOnly 0x00000001 -#define fieldFlagRequired 0x00000002 -#define fieldFlagNoExport 0x00000004 -#define fieldFlagMultiline 0x00001000 -#define fieldFlagPassword 0x00002000 -#define fieldFlagNoToggleToOff 0x00004000 -#define fieldFlagRadio 0x00008000 -#define fieldFlagPushbutton 0x00010000 -#define fieldFlagCombo 0x00020000 -#define fieldFlagEdit 0x00040000 -#define fieldFlagSort 0x00080000 -#define fieldFlagFileSelect 0x00100000 -#define fieldFlagMultiSelect 0x00200000 -#define fieldFlagDoNotSpellCheck 0x00400000 -#define fieldFlagDoNotScroll 0x00800000 -#define fieldFlagComb 0x01000000 -#define fieldFlagRichText 0x02000000 -#define fieldFlagRadiosInUnison 0x02000000 -#define fieldFlagCommitOnSelChange 0x04000000 - -#define fieldQuadLeft 0 -#define fieldQuadCenter 1 -#define fieldQuadRight 2 - -// distance of Bezier control point from center for circle approximation -// = (4 * (sqrt(2) - 1) / 3) * r -#define bezierCircle 0.55228475 - -//------------------------------------------------------------------------ -// AnnotBorderStyle -//------------------------------------------------------------------------ - -AnnotBorderStyle::AnnotBorderStyle(AnnotBorderType typeA, double widthA, - double *dashA, int dashLengthA, - double rA, double gA, double bA) { - type = typeA; - width = widthA; - dash = dashA; - dashLength = dashLengthA; - r = rA; - g = gA; - b = bA; -} - -AnnotBorderStyle::~AnnotBorderStyle() { - if (dash) { - gfree(dash); - } -} - -//------------------------------------------------------------------------ -// Annot -//------------------------------------------------------------------------ - -Annot::Annot(XRef *xrefA, Dict *acroForm, Dict *dict, Ref *refA) { - Object apObj, asObj, obj1, obj2, obj3; - AnnotBorderType borderType; - double borderWidth; - double *borderDash; - int borderDashLength; - double borderR, borderG, borderB; - double t; - int i; - - ok = gTrue; - xref = xrefA; - ref = *refA; - type = NULL; - appearBuf = NULL; - borderStyle = NULL; - - //----- parse the type - - if (dict->lookup("Subtype", &obj1)->isName()) { - type = new GString(obj1.getName()); - } - obj1.free(); - - //----- parse the rectangle - - if (dict->lookup("Rect", &obj1)->isArray() && - obj1.arrayGetLength() == 4) { - xMin = yMin = xMax = yMax = 0; - if (obj1.arrayGet(0, &obj2)->isNum()) { - xMin = obj2.getNum(); - } - obj2.free(); - if (obj1.arrayGet(1, &obj2)->isNum()) { - yMin = obj2.getNum(); - } - obj2.free(); - if (obj1.arrayGet(2, &obj2)->isNum()) { - xMax = obj2.getNum(); - } - obj2.free(); - if (obj1.arrayGet(3, &obj2)->isNum()) { - yMax = obj2.getNum(); - } - obj2.free(); - if (xMin > xMax) { - t = xMin; xMin = xMax; xMax = t; - } - if (yMin > yMax) { - t = yMin; yMin = yMax; yMax = t; - } - } else { - error(-1, "Bad bounding box for annotation"); - ok = gFalse; - } - obj1.free(); - - //----- parse the flags - - if (dict->lookup("F", &obj1)->isInt()) { - flags = obj1.getInt(); - } else { - flags = 0; - } - obj1.free(); - - //----- parse the border style - - borderType = annotBorderSolid; - borderWidth = 1; - borderDash = NULL; - borderDashLength = 0; - borderR = 0; - borderG = 0; - borderB = 1; - if (dict->lookup("BS", &obj1)->isDict()) { - if (obj1.dictLookup("S", &obj2)->isName()) { - if (obj2.isName("S")) { - borderType = annotBorderSolid; - } else if (obj2.isName("D")) { - borderType = annotBorderDashed; - } else if (obj2.isName("B")) { - borderType = annotBorderBeveled; - } else if (obj2.isName("I")) { - borderType = annotBorderInset; - } else if (obj2.isName("U")) { - borderType = annotBorderUnderlined; - } - } - obj2.free(); - if (obj1.dictLookup("W", &obj2)->isNum()) { - borderWidth = obj2.getNum(); - } - obj2.free(); - if (obj1.dictLookup("D", &obj2)->isArray()) { - borderDashLength = obj2.arrayGetLength(); - borderDash = (double *)gmallocn(borderDashLength, sizeof(double)); - for (i = 0; i < borderDashLength; ++i) { - if (obj2.arrayGet(i, &obj3)->isNum()) { - borderDash[i] = obj3.getNum(); - } else { - borderDash[i] = 1; - } - obj3.free(); - } - } - obj2.free(); - } else { - obj1.free(); - if (dict->lookup("Border", &obj1)->isArray()) { - if (obj1.arrayGetLength() >= 3) { - if (obj1.arrayGet(2, &obj2)->isNum()) { - borderWidth = obj2.getNum(); - } - obj2.free(); - if (obj1.arrayGetLength() >= 4) { - if (obj1.arrayGet(3, &obj2)->isArray()) { - borderType = annotBorderDashed; - borderDashLength = obj2.arrayGetLength(); - borderDash = (double *)gmallocn(borderDashLength, sizeof(double)); - for (i = 0; i < borderDashLength; ++i) { - if (obj2.arrayGet(i, &obj3)->isNum()) { - borderDash[i] = obj3.getNum(); - } else { - borderDash[i] = 1; - } - obj3.free(); - } - } else { - // Adobe draws no border at all if the last element is of - // the wrong type. - borderWidth = 0; - } - obj2.free(); - } - } - } - } - obj1.free(); - if (dict->lookup("C", &obj1)->isArray() && obj1.arrayGetLength() == 3) { - if (obj1.arrayGet(0, &obj2)->isNum()) { - borderR = obj2.getNum(); - } - obj1.free(); - if (obj1.arrayGet(1, &obj2)->isNum()) { - borderG = obj2.getNum(); - } - obj1.free(); - if (obj1.arrayGet(2, &obj2)->isNum()) { - borderB = obj2.getNum(); - } - obj1.free(); - } - obj1.free(); - borderStyle = new AnnotBorderStyle(borderType, borderWidth, - borderDash, borderDashLength, - borderR, borderG, borderB); - - //----- get the annotation appearance - - if (dict->lookup("AP", &apObj)->isDict()) { - if (dict->lookup("AS", &asObj)->isName()) { - if (apObj.dictLookup("N", &obj1)->isDict()) { - if (obj1.dictLookupNF(asObj.getName(), &obj2)->isRef()) { - obj2.copy(&appearance); - ok = gTrue; - } else { - obj2.free(); - if (obj1.dictLookupNF("Off", &obj2)->isRef()) { - obj2.copy(&appearance); - } - } - obj2.free(); - } - obj1.free(); - } else { - if (apObj.dictLookupNF("N", &obj1)->isRef()) { - obj1.copy(&appearance); - } - obj1.free(); - } - asObj.free(); - } - apObj.free(); -} - -Annot::~Annot() { - if (type) { - delete type; - } - appearance.free(); - if (appearBuf) { - delete appearBuf; - } - if (borderStyle) { - delete borderStyle; - } -} - -void Annot::generateFieldAppearance(Dict *field, Dict *annot, Dict *acroForm) { - Object mkObj, ftObj, appearDict, drObj, obj1, obj2, obj3; - Dict *mkDict; - MemStream *appearStream; - GfxFontDict *fontDict; - GBool hasCaption; - double w, dx, dy, r; - double *dash; - GString *caption, *da; - GString **text; - GBool *selection; - int dashLength, ff, quadding, comb, nOptions, topIdx, i, j; - - // must be a Widget annotation - if (type->cmp("Widget")) { - return; - } - - appearBuf = new GString(); - - // get the appearance characteristics (MK) dictionary - if (annot->lookup("MK", &mkObj)->isDict()) { - mkDict = mkObj.getDict(); - } else { - mkDict = NULL; - } - - // draw the background - if (mkDict) { - if (mkDict->lookup("BG", &obj1)->isArray() && - obj1.arrayGetLength() > 0) { - setColor(obj1.getArray(), gTrue, 0); - appearBuf->appendf("0 0 {0:.2f} {1:.2f} re f\n", - xMax - xMin, yMax - yMin); - } - obj1.free(); - } - - // get the field type - fieldLookup(field, "FT", &ftObj); - - // get the field flags (Ff) value - if (fieldLookup(field, "Ff", &obj1)->isInt()) { - ff = obj1.getInt(); - } else { - ff = 0; - } - obj1.free(); - - // draw the border - if (mkDict) { - w = borderStyle->getWidth(); - if (w > 0) { - mkDict->lookup("BC", &obj1); - if (!(obj1.isArray() && obj1.arrayGetLength() > 0)) { - mkDict->lookup("BG", &obj1); - } - if (obj1.isArray() && obj1.arrayGetLength() > 0) { - dx = xMax - xMin; - dy = yMax - yMin; - - // radio buttons with no caption have a round border - hasCaption = mkDict->lookup("CA", &obj2)->isString(); - obj2.free(); - if (ftObj.isName("Btn") && (ff & fieldFlagRadio) && !hasCaption) { - r = 0.5 * (dx < dy ? dx : dy); - switch (borderStyle->getType()) { - case annotBorderDashed: - appearBuf->append("["); - borderStyle->getDash(&dash, &dashLength); - for (i = 0; i < dashLength; ++i) { - appearBuf->appendf(" {0:.2f}", dash[i]); - } - appearBuf->append("] 0 d\n"); - // fall through to the solid case - case annotBorderSolid: - case annotBorderUnderlined: - appearBuf->appendf("{0:.2f} w\n", w); - setColor(obj1.getArray(), gFalse, 0); - drawCircle(0.5 * dx, 0.5 * dy, r - 0.5 * w, gFalse); - break; - case annotBorderBeveled: - case annotBorderInset: - appearBuf->appendf("{0:.2f} w\n", 0.5 * w); - setColor(obj1.getArray(), gFalse, 0); - drawCircle(0.5 * dx, 0.5 * dy, r - 0.25 * w, gFalse); - setColor(obj1.getArray(), gFalse, - borderStyle->getType() == annotBorderBeveled ? 1 : -1); - drawCircleTopLeft(0.5 * dx, 0.5 * dy, r - 0.75 * w); - setColor(obj1.getArray(), gFalse, - borderStyle->getType() == annotBorderBeveled ? -1 : 1); - drawCircleBottomRight(0.5 * dx, 0.5 * dy, r - 0.75 * w); - break; - } - - } else { - switch (borderStyle->getType()) { - case annotBorderDashed: - appearBuf->append("["); - borderStyle->getDash(&dash, &dashLength); - for (i = 0; i < dashLength; ++i) { - appearBuf->appendf(" {0:.2f}", dash[i]); - } - appearBuf->append("] 0 d\n"); - // fall through to the solid case - case annotBorderSolid: - appearBuf->appendf("{0:.2f} w\n", w); - setColor(obj1.getArray(), gFalse, 0); - appearBuf->appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re s\n", - 0.5 * w, dx - w, dy - w); - break; - case annotBorderBeveled: - case annotBorderInset: - setColor(obj1.getArray(), gTrue, - borderStyle->getType() == annotBorderBeveled ? 1 : -1); - appearBuf->append("0 0 m\n"); - appearBuf->appendf("0 {0:.2f} l\n", dy); - appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx, dy); - appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, dy - w); - appearBuf->appendf("{0:.2f} {1:.2f} l\n", w, dy - w); - appearBuf->appendf("{0:.2f} {0:.2f} l\n", w); - appearBuf->append("f\n"); - setColor(obj1.getArray(), gTrue, - borderStyle->getType() == annotBorderBeveled ? -1 : 1); - appearBuf->append("0 0 m\n"); - appearBuf->appendf("{0:.2f} 0 l\n", dx); - appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx, dy); - appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, dy - w); - appearBuf->appendf("{0:.2f} {1:.2f} l\n", dx - w, w); - appearBuf->appendf("{0:.2f} {0:.2f} l\n", w); - appearBuf->append("f\n"); - break; - case annotBorderUnderlined: - appearBuf->appendf("{0:.2f} w\n", w); - setColor(obj1.getArray(), gFalse, 0); - appearBuf->appendf("0 0 m {0:.2f} 0 l s\n", dx); - break; - } - - // clip to the inside of the border - appearBuf->appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re W n\n", - w, dx - 2 * w, dy - 2 * w); - } - } - obj1.free(); - } - } - - // get the resource dictionary - acroForm->lookup("DR", &drObj); - - // build the font dictionary - if (drObj.isDict() && drObj.dictLookup("Font", &obj1)->isDict()) { - fontDict = new GfxFontDict(xref, NULL, obj1.getDict()); - } else { - fontDict = NULL; - } - obj1.free(); - - // get the default appearance string - if (fieldLookup(field, "DA", &obj1)->isNull()) { - obj1.free(); - acroForm->lookup("DA", &obj1); - } - if (obj1.isString()) { - da = obj1.getString()->copy(); - } else { - da = NULL; - } - obj1.free(); - - // draw the field contents - if (ftObj.isName("Btn")) { - caption = NULL; - if (mkDict) { - if (mkDict->lookup("CA", &obj1)->isString()) { - caption = obj1.getString()->copy(); - } - obj1.free(); - } - // radio button - if (ff & fieldFlagRadio) { - //~ Acrobat doesn't draw a caption if there is no AP dict (?) - if (fieldLookup(field, "V", &obj1)->isName()) { - if (annot->lookup("AS", &obj2)->isName(obj1.getName())) { - if (caption) { - drawText(caption, da, fontDict, gFalse, 0, fieldQuadCenter, - gFalse, gTrue); - } else { - if (mkDict) { - if (mkDict->lookup("BC", &obj3)->isArray() && - obj3.arrayGetLength() > 0) { - dx = xMax - xMin; - dy = yMax - yMin; - setColor(obj3.getArray(), gTrue, 0); - drawCircle(0.5 * dx, 0.5 * dy, 0.2 * (dx < dy ? dx : dy), - gTrue); - } - obj3.free(); - } - } - } - obj2.free(); - } - obj1.free(); - // pushbutton - } else if (ff & fieldFlagPushbutton) { - if (caption) { - drawText(caption, da, fontDict, gFalse, 0, fieldQuadCenter, - gFalse, gFalse); - } - // checkbox - } else { - // According to the PDF spec the off state must be named "Off", - // and the on state can be named anything, but Acrobat apparently - // looks for "Yes" and treats anything else as off. - if (fieldLookup(field, "V", &obj1)->isName("Yes")) { - if (!caption) { - caption = new GString("3"); // ZapfDingbats checkmark - } - drawText(caption, da, fontDict, gFalse, 0, fieldQuadCenter, - gFalse, gTrue); - } - obj1.free(); - } - if (caption) { - delete caption; - } - } else if (ftObj.isName("Tx")) { - //~ value strings can be Unicode - if (fieldLookup(field, "V", &obj1)->isString()) { - if (fieldLookup(field, "Q", &obj2)->isInt()) { - quadding = obj2.getInt(); - } else { - quadding = fieldQuadLeft; - } - obj2.free(); - comb = 0; - if (ff & fieldFlagComb) { - if (fieldLookup(field, "MaxLen", &obj2)->isInt()) { - comb = obj2.getInt(); - } - obj2.free(); - } - drawText(obj1.getString(), da, fontDict, - ff & fieldFlagMultiline, comb, quadding, gTrue, gFalse); - } - obj1.free(); - } else if (ftObj.isName("Ch")) { - //~ value/option strings can be Unicode - if (fieldLookup(field, "Q", &obj1)->isInt()) { - quadding = obj1.getInt(); - } else { - quadding = fieldQuadLeft; - } - obj1.free(); - // combo box - if (ff & fieldFlagCombo) { - if (fieldLookup(field, "V", &obj1)->isString()) { - drawText(obj1.getString(), da, fontDict, - gFalse, 0, quadding, gTrue, gFalse); - //~ Acrobat draws a popup icon on the right side - } - obj1.free(); - // list box - } else { - if (field->lookup("Opt", &obj1)->isArray()) { - nOptions = obj1.arrayGetLength(); - // get the option text - text = (GString **)gmallocn(nOptions, sizeof(GString *)); - for (i = 0; i < nOptions; ++i) { - text[i] = NULL; - obj1.arrayGet(i, &obj2); - if (obj2.isString()) { - text[i] = obj2.getString()->copy(); - } else if (obj2.isArray() && obj2.arrayGetLength() == 2) { - if (obj2.arrayGet(1, &obj3)->isString()) { - text[i] = obj3.getString()->copy(); - } - obj3.free(); - } - obj2.free(); - if (!text[i]) { - text[i] = new GString(); - } - } - // get the selected option(s) - selection = (GBool *)gmallocn(nOptions, sizeof(GBool)); - //~ need to use the I field in addition to the V field - fieldLookup(field, "V", &obj2); - for (i = 0; i < nOptions; ++i) { - selection[i] = gFalse; - if (obj2.isString()) { - if (!obj2.getString()->cmp(text[i])) { - selection[i] = gTrue; - } - } else if (obj2.isArray()) { - for (j = 0; j < obj2.arrayGetLength(); ++j) { - if (obj2.arrayGet(j, &obj3)->isString() && - !obj3.getString()->cmp(text[i])) { - selection[i] = gTrue; - } - obj3.free(); - } - } - } - obj2.free(); - // get the top index - if (field->lookup("TI", &obj2)->isInt()) { - topIdx = obj2.getInt(); - } else { - topIdx = 0; - } - obj2.free(); - // draw the text - drawListBox(text, selection, nOptions, topIdx, da, fontDict, quadding); - for (i = 0; i < nOptions; ++i) { - delete text[i]; - } - gfree(text); - gfree(selection); - } - obj1.free(); - } - } else if (ftObj.isName("Sig")) { - //~unimp - } else { - error(-1, "Unknown field type"); - } - - if (da) { - delete da; - } - - // build the appearance stream dictionary - appearDict.initDict(xref); - appearDict.dictAdd(copyString("Length"), - obj1.initInt(appearBuf->getLength())); - appearDict.dictAdd(copyString("Subtype"), obj1.initName("Form")); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(xMax - xMin)); - obj1.arrayAdd(obj2.initReal(yMax - yMin)); - appearDict.dictAdd(copyString("BBox"), &obj1); - - // set the resource dictionary - if (drObj.isDict()) { - appearDict.dictAdd(copyString("Resources"), drObj.copy(&obj1)); - } - drObj.free(); - - // build the appearance stream - appearStream = new MemStream(appearBuf->getCString(), 0, - appearBuf->getLength(), &appearDict); - appearance.free(); - appearance.initStream(appearStream); - - if (fontDict) { - delete fontDict; - } - ftObj.free(); - mkObj.free(); -} - -// Set the current fill or stroke color, based on (which should -// have 1, 3, or 4 elements). If is +1, color is brightened; -// if is -1, color is darkened; otherwise color is not -// modified. -void Annot::setColor(Array *a, GBool fill, int adjust) { - Object obj1; - double color[4]; - int nComps, i; - - nComps = a->getLength(); - if (nComps > 4) { - nComps = 4; - } - for (i = 0; i < nComps && i < 4; ++i) { - if (a->get(i, &obj1)->isNum()) { - color[i] = obj1.getNum(); - } else { - color[i] = 0; - } - obj1.free(); - } - if (nComps == 4) { - adjust = -adjust; - } - if (adjust > 0) { - for (i = 0; i < nComps; ++i) { - color[i] = 0.5 * color[i] + 0.5; - } - } else if (adjust < 0) { - for (i = 0; i < nComps; ++i) { - color[i] = 0.5 * color[i]; - } - } - if (nComps == 4) { - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:c}\n", - color[0], color[1], color[2], color[3], - fill ? 'k' : 'K'); - } else if (nComps == 3) { - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:s}\n", - color[0], color[1], color[2], - fill ? "rg" : "RG"); - } else { - appearBuf->appendf("{0:.2f} {1:c}\n", - color[0], - fill ? 'g' : 'G'); - } -} - -// Draw the variable text or caption for a field. -void Annot::drawText(GString *text, GString *da, GfxFontDict *fontDict, - GBool multiline, int comb, int quadding, - GBool txField, GBool forceZapfDingbats) { - GList *daToks; - GString *tok; - GfxFont *font; - double fontSize, fontSize2, border, x, xPrev, y, w, w2, wMax; - int tfPos, tmPos, i, j, k, c; - - //~ if there is no MK entry, this should use the existing content stream, - //~ and only replace the marked content portion of it - //~ (this is only relevant for Tx fields) - - // parse the default appearance string - tfPos = tmPos = -1; - if (da) { - daToks = new GList(); - i = 0; - while (i < da->getLength()) { - while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) { - ++i; - } - if (i < da->getLength()) { - for (j = i + 1; - j < da->getLength() && !Lexer::isSpace(da->getChar(j)); - ++j) ; - daToks->append(new GString(da, i, j - i)); - i = j; - } - } - for (i = 2; i < daToks->getLength(); ++i) { - if (i >= 2 && !((GString *)daToks->get(i))->cmp("Tf")) { - tfPos = i - 2; - } else if (i >= 6 && !((GString *)daToks->get(i))->cmp("Tm")) { - tmPos = i - 6; - } - } - } else { - daToks = NULL; - } - - // force ZapfDingbats - //~ this should create the font if needed (?) - if (forceZapfDingbats) { - if (tfPos >= 0) { - tok = (GString *)daToks->get(tfPos); - if (tok->cmp("/ZaDb")) { - tok->clear(); - tok->append("/ZaDb"); - } - } - } - - // get the font and font size - font = NULL; - fontSize = 0; - if (tfPos >= 0) { - tok = (GString *)daToks->get(tfPos); - if (tok->getLength() >= 1 && tok->getChar(0) == '/') { - if (!fontDict || !(font = fontDict->lookup(tok->getCString() + 1))) { - error(-1, "Unknown font in field's DA string"); - } - } else { - error(-1, "Invalid font name in 'Tf' operator in field's DA string"); - } - tok = (GString *)daToks->get(tfPos + 1); - fontSize = atof(tok->getCString()); - } else { - error(-1, "Missing 'Tf' operator in field's DA string"); - } - - // get the border width - border = borderStyle->getWidth(); - - // setup - if (txField) { - appearBuf->append("/Tx BMC\n"); - } - appearBuf->append("q\n"); - appearBuf->append("BT\n"); - - // multi-line text - if (multiline) { - // note: the comb flag is ignored in multiline mode - - wMax = xMax - xMin - 2 * border - 4; - - // compute font autosize - if (fontSize == 0) { - for (fontSize = 20; fontSize > 1; --fontSize) { - y = yMax - yMin; - w2 = 0; - i = 0; - while (i < text->getLength()) { - getNextLine(text, i, font, fontSize, wMax, &j, &w, &k); - if (w > w2) { - w2 = w; - } - i = k; - y -= fontSize; - } - // approximate the descender for the last line - if (y >= 0.33 * fontSize) { - break; - } - } - if (tfPos >= 0) { - tok = (GString *)daToks->get(tfPos + 1); - tok->clear(); - tok->appendf("{0:.2f}", fontSize); - } - } - - // starting y coordinate - // (note: each line of text starts with a Td operator that moves - // down a line) - y = yMax - yMin; - - // set the font matrix - if (tmPos >= 0) { - tok = (GString *)daToks->get(tmPos + 4); - tok->clear(); - tok->append('0'); - tok = (GString *)daToks->get(tmPos + 5); - tok->clear(); - tok->appendf("{0:.2f}", y); - } - - // write the DA string - if (daToks) { - for (i = 0; i < daToks->getLength(); ++i) { - appearBuf->append((GString *)daToks->get(i))->append(' '); - } - } - - // write the font matrix (if not part of the DA string) - if (tmPos < 0) { - appearBuf->appendf("1 0 0 1 0 {0:.2f} Tm\n", y); - } - - // write a series of lines of text - i = 0; - xPrev = 0; - while (i < text->getLength()) { - - getNextLine(text, i, font, fontSize, wMax, &j, &w, &k); - - // compute text start position - switch (quadding) { - case fieldQuadLeft: - default: - x = border + 2; - break; - case fieldQuadCenter: - x = (xMax - xMin - w) / 2; - break; - case fieldQuadRight: - x = xMax - xMin - border - 2 - w; - break; - } - - // draw the line - appearBuf->appendf("{0:.2f} {1:.2f} Td\n", x - xPrev, -fontSize); - appearBuf->append('('); - for (; i < j; ++i) { - c = text->getChar(i) & 0xff; - if (c == '(' || c == ')' || c == '\\') { - appearBuf->append('\\'); - appearBuf->append(c); - } else if (c < 0x20 || c >= 0x80) { - appearBuf->appendf("\\{0:03o}", c); - } else { - appearBuf->append(c); - } - } - appearBuf->append(") Tj\n"); - - // next line - i = k; - xPrev = x; - } - - // single-line text - } else { - //~ replace newlines with spaces? - what does Acrobat do? - - // comb formatting - if (comb > 0) { - - // compute comb spacing - w = (xMax - xMin - 2 * border) / comb; - - // compute font autosize - if (fontSize == 0) { - fontSize = yMax - yMin - 2 * border; - if (w < fontSize) { - fontSize = w; - } - fontSize = floor(fontSize); - if (tfPos >= 0) { - tok = (GString *)daToks->get(tfPos + 1); - tok->clear(); - tok->appendf("{0:.2f}", fontSize); - } - } - - // compute text start position - switch (quadding) { - case fieldQuadLeft: - default: - x = border + 2; - break; - case fieldQuadCenter: - x = border + 2 + 0.5 * (comb - text->getLength()) * w; - break; - case fieldQuadRight: - x = border + 2 + (comb - text->getLength()) * w; - break; - } - y = 0.5 * (yMax - yMin) - 0.4 * fontSize; - - // set the font matrix - if (tmPos >= 0) { - tok = (GString *)daToks->get(tmPos + 4); - tok->clear(); - tok->appendf("{0:.2f}", x); - tok = (GString *)daToks->get(tmPos + 5); - tok->clear(); - tok->appendf("{0:.2f}", y); - } - - // write the DA string - if (daToks) { - for (i = 0; i < daToks->getLength(); ++i) { - appearBuf->append((GString *)daToks->get(i))->append(' '); - } - } - - // write the font matrix (if not part of the DA string) - if (tmPos < 0) { - appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y); - } - - // write the text string - //~ this should center (instead of left-justify) each character within - //~ its comb cell - for (i = 0; i < text->getLength(); ++i) { - if (i > 0) { - appearBuf->appendf("{0:.2f} 0 Td\n", w); - } - appearBuf->append('('); - c = text->getChar(i) & 0xff; - if (c == '(' || c == ')' || c == '\\') { - appearBuf->append('\\'); - appearBuf->append(c); - } else if (c < 0x20 || c >= 0x80) { - appearBuf->appendf("{0:.2f} 0 Td\n", w); - } else { - appearBuf->append(c); - } - appearBuf->append(") Tj\n"); - } - - // regular (non-comb) formatting - } else { - - // compute string width - if (font && !font->isCIDFont()) { - w = 0; - for (i = 0; i < text->getLength(); ++i) { - w += ((Gfx8BitFont *)font)->getWidth(text->getChar(i)); - } - } else { - // otherwise, make a crude estimate - w = text->getLength() * 0.5; - } - - // compute font autosize - if (fontSize == 0) { - fontSize = yMax - yMin - 2 * border; - fontSize2 = (xMax - xMin - 4 - 2 * border) / w; - if (fontSize2 < fontSize) { - fontSize = fontSize2; - } - fontSize = floor(fontSize); - if (tfPos >= 0) { - tok = (GString *)daToks->get(tfPos + 1); - tok->clear(); - tok->appendf("{0:.2f}", fontSize); - } - } - - // compute text start position - w *= fontSize; - switch (quadding) { - case fieldQuadLeft: - default: - x = border + 2; - break; - case fieldQuadCenter: - x = (xMax - xMin - w) / 2; - break; - case fieldQuadRight: - x = xMax - xMin - border - 2 - w; - break; - } - y = 0.5 * (yMax - yMin) - 0.4 * fontSize; - - // set the font matrix - if (tmPos >= 0) { - tok = (GString *)daToks->get(tmPos + 4); - tok->clear(); - tok->appendf("{0:.2f}", x); - tok = (GString *)daToks->get(tmPos + 5); - tok->clear(); - tok->appendf("{0:.2f}", y); - } - - // write the DA string - if (daToks) { - for (i = 0; i < daToks->getLength(); ++i) { - appearBuf->append((GString *)daToks->get(i))->append(' '); - } - } - - // write the font matrix (if not part of the DA string) - if (tmPos < 0) { - appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y); - } - - // write the text string - appearBuf->append('('); - for (i = 0; i < text->getLength(); ++i) { - c = text->getChar(i) & 0xff; - if (c == '(' || c == ')' || c == '\\') { - appearBuf->append('\\'); - appearBuf->append(c); - } else if (c < 0x20 || c >= 0x80) { - appearBuf->appendf("\\{0:03o}", c); - } else { - appearBuf->append(c); - } - } - appearBuf->append(") Tj\n"); - } - } - - // cleanup - appearBuf->append("ET\n"); - appearBuf->append("Q\n"); - if (txField) { - appearBuf->append("EMC\n"); - } - - if (daToks) { - deleteGList(daToks, GString); - } -} - -// Draw the variable text or caption for a field. -void Annot::drawListBox(GString **text, GBool *selection, - int nOptions, int topIdx, - GString *da, GfxFontDict *fontDict, GBool quadding) { - GList *daToks; - GString *tok; - GfxFont *font; - double fontSize, fontSize2, border, x, y, w, wMax; - int tfPos, tmPos, i, j, c; - - //~ if there is no MK entry, this should use the existing content stream, - //~ and only replace the marked content portion of it - //~ (this is only relevant for Tx fields) - - // parse the default appearance string - tfPos = tmPos = -1; - if (da) { - daToks = new GList(); - i = 0; - while (i < da->getLength()) { - while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) { - ++i; - } - if (i < da->getLength()) { - for (j = i + 1; - j < da->getLength() && !Lexer::isSpace(da->getChar(j)); - ++j) ; - daToks->append(new GString(da, i, j - i)); - i = j; - } - } - for (i = 2; i < daToks->getLength(); ++i) { - if (i >= 2 && !((GString *)daToks->get(i))->cmp("Tf")) { - tfPos = i - 2; - } else if (i >= 6 && !((GString *)daToks->get(i))->cmp("Tm")) { - tmPos = i - 6; - } - } - } else { - daToks = NULL; - } - - // get the font and font size - font = NULL; - fontSize = 0; - if (tfPos >= 0) { - tok = (GString *)daToks->get(tfPos); - if (tok->getLength() >= 1 && tok->getChar(0) == '/') { - if (!fontDict || !(font = fontDict->lookup(tok->getCString() + 1))) { - error(-1, "Unknown font in field's DA string"); - } - } else { - error(-1, "Invalid font name in 'Tf' operator in field's DA string"); - } - tok = (GString *)daToks->get(tfPos + 1); - fontSize = atof(tok->getCString()); - } else { - error(-1, "Missing 'Tf' operator in field's DA string"); - } - - // get the border width - border = borderStyle->getWidth(); - - // compute font autosize - if (fontSize == 0) { - wMax = 0; - for (i = 0; i < nOptions; ++i) { - if (font && !font->isCIDFont()) { - w = 0; - for (j = 0; j < text[i]->getLength(); ++j) { - w += ((Gfx8BitFont *)font)->getWidth(text[i]->getChar(j)); - } - } else { - // otherwise, make a crude estimate - w = text[i]->getLength() * 0.5; - } - if (w > wMax) { - wMax = w; - } - } - fontSize = yMax - yMin - 2 * border; - fontSize2 = (xMax - xMin - 4 - 2 * border) / wMax; - if (fontSize2 < fontSize) { - fontSize = fontSize2; - } - fontSize = floor(fontSize); - if (tfPos >= 0) { - tok = (GString *)daToks->get(tfPos + 1); - tok->clear(); - tok->appendf("{0:.2f}", fontSize); - } - } - - // draw the text - y = yMax - yMin - 1.1 * fontSize; - for (i = topIdx; i < nOptions; ++i) { - - // setup - appearBuf->append("q\n"); - - // draw the background if selected - if (selection[i]) { - appearBuf->append("0 g f\n"); - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re f\n", - border, - y - 0.2 * fontSize, - xMax - xMin - 2 * border, - 1.1 * fontSize); - } - - // setup - appearBuf->append("BT\n"); - - // compute string width - if (font && !font->isCIDFont()) { - w = 0; - for (j = 0; j < text[i]->getLength(); ++j) { - w += ((Gfx8BitFont *)font)->getWidth(text[i]->getChar(j)); - } - } else { - // otherwise, make a crude estimate - w = text[i]->getLength() * 0.5; - } - - // compute text start position - w *= fontSize; - switch (quadding) { - case fieldQuadLeft: - default: - x = border + 2; - break; - case fieldQuadCenter: - x = (xMax - xMin - w) / 2; - break; - case fieldQuadRight: - x = xMax - xMin - border - 2 - w; - break; - } - - // set the font matrix - if (tmPos >= 0) { - tok = (GString *)daToks->get(tmPos + 4); - tok->clear(); - tok->appendf("{0:.2f}", x); - tok = (GString *)daToks->get(tmPos + 5); - tok->clear(); - tok->appendf("{0:.2f}", y); - } - - // write the DA string - if (daToks) { - for (j = 0; j < daToks->getLength(); ++j) { - appearBuf->append((GString *)daToks->get(j))->append(' '); - } - } - - // write the font matrix (if not part of the DA string) - if (tmPos < 0) { - appearBuf->appendf("1 0 0 1 {0:.2f} {1:.2f} Tm\n", x, y); - } - - // change the text color if selected - if (selection[i]) { - appearBuf->append("1 g\n"); - } - - // write the text string - appearBuf->append('('); - for (j = 0; j < text[i]->getLength(); ++j) { - c = text[i]->getChar(j) & 0xff; - if (c == '(' || c == ')' || c == '\\') { - appearBuf->append('\\'); - appearBuf->append(c); - } else if (c < 0x20 || c >= 0x80) { - appearBuf->appendf("\\{0:03o}", c); - } else { - appearBuf->append(c); - } - } - appearBuf->append(") Tj\n"); - - // cleanup - appearBuf->append("ET\n"); - appearBuf->append("Q\n"); - - // next line - y -= 1.1 * fontSize; - } - - if (daToks) { - deleteGList(daToks, GString); - } -} - -// Figure out how much text will fit on the next line. Returns: -// *end = one past the last character to be included -// *width = width of the characters start .. end-1 -// *next = index of first character on the following line -void Annot::getNextLine(GString *text, int start, - GfxFont *font, double fontSize, double wMax, - int *end, double *width, int *next) { - double w, dw; - int j, k, c; - - // figure out how much text will fit on the line - //~ what does Adobe do with tabs? - w = 0; - for (j = start; j < text->getLength() && w <= wMax; ++j) { - c = text->getChar(j) & 0xff; - if (c == 0x0a || c == 0x0d) { - break; - } - if (font && !font->isCIDFont()) { - dw = ((Gfx8BitFont *)font)->getWidth(c) * fontSize; - } else { - // otherwise, make a crude estimate - dw = 0.5 * fontSize; - } - w += dw; - } - if (w > wMax) { - for (k = j; k > start && text->getChar(k-1) != ' '; --k) ; - for (; k > start && text->getChar(k-1) == ' '; --k) ; - if (k > start) { - j = k; - } - if (j == start) { - // handle the pathological case where the first character is - // too wide to fit on the line all by itself - j = start + 1; - } - } - *end = j; - - // compute the width - w = 0; - for (k = start; k < j; ++k) { - if (font && !font->isCIDFont()) { - dw = ((Gfx8BitFont *)font)->getWidth(text->getChar(k)) * fontSize; - } else { - // otherwise, make a crude estimate - dw = 0.5 * fontSize; - } - w += dw; - } - *width = w; - - // next line - while (j < text->getLength() && text->getChar(j) == ' ') { - ++j; - } - if (j < text->getLength() && text->getChar(j) == 0x0d) { - ++j; - } - if (j < text->getLength() && text->getChar(j) == 0x0a) { - ++j; - } - *next = j; -} - -// Draw an (approximate) circle of radius centered at (, ). -// If is true, the circle is filled; otherwise it is stroked. -void Annot::drawCircle(double cx, double cy, double r, GBool fill) { - appearBuf->appendf("{0:.2f} {1:.2f} m\n", - cx + r, cy); - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", - cx + r, cy + bezierCircle * r, - cx + bezierCircle * r, cy + r, - cx, cy + r); - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", - cx - bezierCircle * r, cy + r, - cx - r, cy + bezierCircle * r, - cx - r, cy); - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", - cx - r, cy - bezierCircle * r, - cx - bezierCircle * r, cy - r, - cx, cy - r); - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", - cx + bezierCircle * r, cy - r, - cx + r, cy - bezierCircle * r, - cx + r, cy); - appearBuf->append(fill ? "f\n" : "s\n"); -} - -// Draw the top-left half of an (approximate) circle of radius -// centered at (, ). -void Annot::drawCircleTopLeft(double cx, double cy, double r) { - double r2; - - r2 = r / sqrt(2.0); - appearBuf->appendf("{0:.2f} {1:.2f} m\n", - cx + r2, cy + r2); - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", - cx + (1 - bezierCircle) * r2, - cy + (1 + bezierCircle) * r2, - cx - (1 - bezierCircle) * r2, - cy + (1 + bezierCircle) * r2, - cx - r2, - cy + r2); - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", - cx - (1 + bezierCircle) * r2, - cy + (1 - bezierCircle) * r2, - cx - (1 + bezierCircle) * r2, - cy - (1 - bezierCircle) * r2, - cx - r2, - cy - r2); - appearBuf->append("S\n"); -} - -// Draw the bottom-right half of an (approximate) circle of radius -// centered at (, ). -void Annot::drawCircleBottomRight(double cx, double cy, double r) { - double r2; - - r2 = r / sqrt(2.0); - appearBuf->appendf("{0:.2f} {1:.2f} m\n", - cx - r2, cy - r2); - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", - cx - (1 - bezierCircle) * r2, - cy - (1 + bezierCircle) * r2, - cx + (1 - bezierCircle) * r2, - cy - (1 + bezierCircle) * r2, - cx + r2, - cy - r2); - appearBuf->appendf("{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f} c\n", - cx + (1 + bezierCircle) * r2, - cy - (1 - bezierCircle) * r2, - cx + (1 + bezierCircle) * r2, - cy + (1 - bezierCircle) * r2, - cx + r2, - cy + r2); - appearBuf->append("S\n"); -} - -// Look up an inheritable field dictionary entry. -Object *Annot::fieldLookup(Dict *field, char *key, Object *obj) { - Dict *dict; - Object parent; - - dict = field; - if (!dict->lookup(key, obj)->isNull()) { - return obj; - } - obj->free(); - if (dict->lookup("Parent", &parent)->isDict()) { - fieldLookup(parent.getDict(), key, obj); - } else { - obj->initNull(); - } - parent.free(); - return obj; -} - -void Annot::draw(Gfx *gfx, GBool printing) { - Object obj; - GBool isLink; - - // check the flags - if ((flags & annotFlagHidden) || - (printing && !(flags & annotFlagPrint)) || - (!printing && (flags & annotFlagNoView))) { - return; - } - - // draw the appearance stream - isLink = type && !type->cmp("Link"); - appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, isLink ? borderStyle : (AnnotBorderStyle *)NULL, - xMin, yMin, xMax, yMax); - obj.free(); -} - -//------------------------------------------------------------------------ -// Annots -//------------------------------------------------------------------------ - -Annots::Annots(XRef *xref, Catalog *catalog, Object *annotsObj) { - Dict *acroForm; - Annot *annot; - Object obj1; - Ref ref; - int size; - int i; - - annots = NULL; - size = 0; - nAnnots = 0; - - acroForm = catalog->getAcroForm()->isDict() ? - catalog->getAcroForm()->getDict() : NULL; - if (annotsObj->isArray()) { - for (i = 0; i < annotsObj->arrayGetLength(); ++i) { - if (annotsObj->arrayGetNF(i, &obj1)->isRef()) { - ref = obj1.getRef(); - obj1.free(); - annotsObj->arrayGet(i, &obj1); - } else { - ref.num = ref.gen = -1; - } - if (obj1.isDict()) { - annot = new Annot(xref, acroForm, obj1.getDict(), &ref); - if (annot->isOk()) { - if (nAnnots >= size) { - size += 16; - annots = (Annot **)greallocn(annots, size, sizeof(Annot *)); - } - annots[nAnnots++] = annot; - } else { - delete annot; - } - } - obj1.free(); - } - } -} - -Annots::~Annots() { - int i; - - for (i = 0; i < nAnnots; ++i) { - delete annots[i]; - } - gfree(annots); -} - -void Annots::generateAppearances(Dict *acroForm) { - Object obj1, obj2; - Ref ref; - int i; - - if (acroForm->lookup("Fields", &obj1)->isArray()) { - for (i = 0; i < obj1.arrayGetLength(); ++i) { - if (obj1.arrayGetNF(i, &obj2)->isRef()) { - ref = obj2.getRef(); - obj2.free(); - obj1.arrayGet(i, &obj2); - } else { - ref.num = ref.gen = -1; - } - if (obj2.isDict()) { - scanFieldAppearances(obj2.getDict(), &ref, NULL, acroForm); - } - obj2.free(); - } - } - obj1.free(); -} - -void Annots::scanFieldAppearances(Dict *node, Ref *ref, Dict *parent, - Dict *acroForm) { - Annot *annot; - Object obj1, obj2; - Ref ref2; - int i; - - // non-terminal node: scan the children - if (node->lookup("Kids", &obj1)->isArray()) { - for (i = 0; i < obj1.arrayGetLength(); ++i) { - if (obj1.arrayGetNF(i, &obj2)->isRef()) { - ref2 = obj2.getRef(); - obj2.free(); - obj1.arrayGet(i, &obj2); - } else { - ref2.num = ref2.gen = -1; - } - if (obj2.isDict()) { - scanFieldAppearances(obj2.getDict(), &ref2, node, acroForm); - } - obj2.free(); - } - obj1.free(); - return; - } - obj1.free(); - - // terminal node: this is either a combined annot/field dict, or an - // annot dict whose parent is a field - if ((annot = findAnnot(ref))) { - node->lookupNF("Parent", &obj1); - if (!parent || !obj1.isNull()) { - annot->generateFieldAppearance(node, node, acroForm); - } else { - annot->generateFieldAppearance(parent, node, acroForm); - } - obj1.free(); - } -} - -Annot *Annots::findAnnot(Ref *ref) { - int i; - - for (i = 0; i < nAnnots; ++i) { - if (annots[i]->match(ref)) { - return annots[i]; - } - } - return NULL; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.h deleted file mode 100644 index 1f89d4978..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Annot.h +++ /dev/null @@ -1,142 +0,0 @@ -//======================================================================== -// -// Annot.h -// -// Copyright 2000-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef ANNOT_H -#define ANNOT_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -class XRef; -class Catalog; -class Gfx; -class GfxFontDict; - -//------------------------------------------------------------------------ -// AnnotBorderStyle -//------------------------------------------------------------------------ - -enum AnnotBorderType { - annotBorderSolid, - annotBorderDashed, - annotBorderBeveled, - annotBorderInset, - annotBorderUnderlined -}; - -class AnnotBorderStyle { -public: - - AnnotBorderStyle(AnnotBorderType typeA, double widthA, - double *dashA, int dashLengthA, - double rA, double gA, double bA); - ~AnnotBorderStyle(); - - AnnotBorderType getType() { return type; } - double getWidth() { return width; } - void getDash(double **dashA, int *dashLengthA) - { *dashA = dash; *dashLengthA = dashLength; } - void getColor(double *rA, double *gA, double *bA) - { *rA = r; *gA = g; *bA = b; } - -private: - - AnnotBorderType type; - double width; - double *dash; - int dashLength; - double r, g, b; -}; - -//------------------------------------------------------------------------ -// Annot -//------------------------------------------------------------------------ - -class Annot { -public: - - Annot(XRef *xrefA, Dict *acroForm, Dict *dict, Ref *refA); - ~Annot(); - GBool isOk() { return ok; } - - void draw(Gfx *gfx, GBool printing); - - // Get appearance object. - Object *getAppearance(Object *obj) { return appearance.fetch(xref, obj); } - - AnnotBorderStyle *getBorderStyle() { return borderStyle; } - - GBool match(Ref *refA) - { return ref.num == refA->num && ref.gen == refA->gen; } - - void generateFieldAppearance(Dict *field, Dict *annot, Dict *acroForm); - -private: - - void setColor(Array *a, GBool fill, int adjust); - void drawText(GString *text, GString *da, GfxFontDict *fontDict, - GBool multiline, int comb, int quadding, - GBool txField, GBool forceZapfDingbats); - void drawListBox(GString **text, GBool *selection, - int nOptions, int topIdx, - GString *da, GfxFontDict *fontDict, GBool quadding); - void getNextLine(GString *text, int start, - GfxFont *font, double fontSize, double wMax, - int *end, double *width, int *next); - void drawCircle(double cx, double cy, double r, GBool fill); - void drawCircleTopLeft(double cx, double cy, double r); - void drawCircleBottomRight(double cx, double cy, double r); - Object *fieldLookup(Dict *field, char *key, Object *obj); - - XRef *xref; // the xref table for this PDF file - Ref ref; // object ref identifying this annotation - GString *type; // annotation type - Object appearance; // a reference to the Form XObject stream - // for the normal appearance - GString *appearBuf; - double xMin, yMin, // annotation rectangle - xMax, yMax; - Guint flags; - AnnotBorderStyle *borderStyle; - GBool ok; -}; - -//------------------------------------------------------------------------ -// Annots -//------------------------------------------------------------------------ - -class Annots { -public: - - // Build a list of Annot objects. - Annots(XRef *xref, Catalog *catalog, Object *annotsObj); - - ~Annots(); - - // Iterate through list of annotations. - int getNumAnnots() { return nAnnots; } - Annot *getAnnot(int i) { return annots[i]; } - - // (Re)generate the appearance streams for all annotations belonging - // to a form field. - void generateAppearances(Dict *acroForm); - -private: - - void scanFieldAppearances(Dict *node, Ref *ref, Dict *parent, - Dict *acroForm); - Annot *findAnnot(Ref *ref); - - Annot **annots; - int nAnnots; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.cc deleted file mode 100644 index 10ded148d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.cc +++ /dev/null @@ -1,73 +0,0 @@ -//======================================================================== -// -// Array.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "Object.h" -#include "Array.h" - -//------------------------------------------------------------------------ -// Array -//------------------------------------------------------------------------ - -Array::Array(XRef *xrefA) { - xref = xrefA; - elems = NULL; - size = length = 0; - ref = 1; -} - -Array::~Array() { - int i; - - for (i = 0; i < length; ++i) - elems[i].free(); - gfree(elems); -} - -void Array::add(Object *elem) { - if (length == size) { - if (length == 0) { - size = 8; - } else { - size *= 2; - } - elems = (Object *)greallocn(elems, size, sizeof(Object)); - } - elems[length] = *elem; - ++length; -} - -Object *Array::get(int i, Object *obj) { - if (i < 0 || i >= length) { -#ifdef DEBUG_MEM - abort(); -#else - return obj->initNull(); -#endif - } - return elems[i].fetch(xref, obj); -} - -Object *Array::getNF(int i, Object *obj) { - if (i < 0 || i >= length) { -#ifdef DEBUG_MEM - abort(); -#else - return obj->initNull(); -#endif - } - return elems[i].copy(obj); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.h deleted file mode 100644 index 20ae05f29..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Array.h +++ /dev/null @@ -1,58 +0,0 @@ -//======================================================================== -// -// Array.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef ARRAY_H -#define ARRAY_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "Object.h" - -class XRef; - -//------------------------------------------------------------------------ -// Array -//------------------------------------------------------------------------ - -class Array { -public: - - // Constructor. - Array(XRef *xrefA); - - // Destructor. - ~Array(); - - // Reference counting. - int incRef() { return ++ref; } - int decRef() { return --ref; } - - // Get number of elements. - int getLength() { return length; } - - // Add an element. - void add(Object *elem); - - // Accessors. - Object *get(int i, Object *obj); - Object *getNF(int i, Object *obj); - -private: - - XRef *xref; // the xref table for this PDF file - Object *elems; // array of elements - int size; // size of array - int length; // number of elements in array - int ref; // reference count -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.cc deleted file mode 100644 index ce9895712..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.cc +++ /dev/null @@ -1,65 +0,0 @@ -//======================================================================== -// -// BuiltinFont.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "FontEncodingTables.h" -#include "BuiltinFont.h" - -//------------------------------------------------------------------------ - -BuiltinFontWidths::BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA) { - int i, h; - - size = sizeA; - tab = (BuiltinFontWidth **)gmallocn(size, sizeof(BuiltinFontWidth *)); - for (i = 0; i < size; ++i) { - tab[i] = NULL; - } - for (i = 0; i < sizeA; ++i) { - h = hash(widths[i].name); - widths[i].next = tab[h]; - tab[h] = &widths[i]; - } -} - -BuiltinFontWidths::~BuiltinFontWidths() { - gfree(tab); -} - -GBool BuiltinFontWidths::getWidth(char *name, Gushort *width) { - int h; - BuiltinFontWidth *p; - - h = hash(name); - for (p = tab[h]; p; p = p->next) { - if (!strcmp(p->name, name)) { - *width = p->width; - return gTrue; - } - } - return gFalse; -} - -int BuiltinFontWidths::hash(char *name) { - char *p; - unsigned int h; - - h = 0; - for (p = name; *p; ++p) { - h = 17 * h + (int)(*p & 0xff); - } - return (int)(h % size); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.h deleted file mode 100644 index 903ed19ec..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFont.h +++ /dev/null @@ -1,57 +0,0 @@ -//======================================================================== -// -// BuiltinFont.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef BUILTINFONT_H -#define BUILTINFONT_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -struct BuiltinFont; -class BuiltinFontWidths; - -//------------------------------------------------------------------------ - -struct BuiltinFont { - char *name; - char **defaultBaseEnc; - short ascent; - short descent; - short bbox[4]; - BuiltinFontWidths *widths; -}; - -//------------------------------------------------------------------------ - -struct BuiltinFontWidth { - char *name; - Gushort width; - BuiltinFontWidth *next; -}; - -class BuiltinFontWidths { -public: - - BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA); - ~BuiltinFontWidths(); - GBool getWidth(char *name, Gushort *width); - -private: - - int hash(char *name); - - BuiltinFontWidth **tab; - int size; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.cc deleted file mode 100644 index 9c362389c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.cc +++ /dev/null @@ -1,4284 +0,0 @@ -//======================================================================== -// -// BuiltinFontTables.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include -#include -#include "FontEncodingTables.h" -#include "BuiltinFontTables.h" - -static BuiltinFontWidth courierWidthsTab[] = { - { "Ntilde", 600, NULL }, - { "rcaron", 600, NULL }, - { "kcommaaccent", 600, NULL }, - { "Ncommaaccent", 600, NULL }, - { "Zacute", 600, NULL }, - { "comma", 600, NULL }, - { "cedilla", 600, NULL }, - { "plusminus", 600, NULL }, - { "circumflex", 600, NULL }, - { "dotaccent", 600, NULL }, - { "edotaccent", 600, NULL }, - { "asciitilde", 600, NULL }, - { "colon", 600, NULL }, - { "onehalf", 600, NULL }, - { "dollar", 600, NULL }, - { "Lcaron", 600, NULL }, - { "ntilde", 600, NULL }, - { "Aogonek", 600, NULL }, - { "ncommaaccent", 600, NULL }, - { "minus", 600, NULL }, - { "Iogonek", 600, NULL }, - { "zacute", 600, NULL }, - { "yen", 600, NULL }, - { "space", 600, NULL }, - { "Omacron", 600, NULL }, - { "questiondown", 600, NULL }, - { "emdash", 600, NULL }, - { "Agrave", 600, NULL }, - { "three", 600, NULL }, - { "numbersign", 600, NULL }, - { "lcaron", 600, NULL }, - { "A", 600, NULL }, - { "B", 600, NULL }, - { "C", 600, NULL }, - { "aogonek", 600, NULL }, - { "D", 600, NULL }, - { "E", 600, NULL }, - { "onequarter", 600, NULL }, - { "F", 600, NULL }, - { "G", 600, NULL }, - { "H", 600, NULL }, - { "I", 600, NULL }, - { "J", 600, NULL }, - { "K", 600, NULL }, - { "iogonek", 600, NULL }, - { "L", 600, NULL }, - { "backslash", 600, NULL }, - { "periodcentered", 600, NULL }, - { "M", 600, NULL }, - { "N", 600, NULL }, - { "omacron", 600, NULL }, - { "Tcommaaccent", 600, NULL }, - { "O", 600, NULL }, - { "P", 600, NULL }, - { "Q", 600, NULL }, - { "Uhungarumlaut", 600, NULL }, - { "R", 600, NULL }, - { "Aacute", 600, NULL }, - { "caron", 600, NULL }, - { "S", 600, NULL }, - { "T", 600, NULL }, - { "U", 600, NULL }, - { "agrave", 600, NULL }, - { "V", 600, NULL }, - { "W", 600, NULL }, - { "equal", 600, NULL }, - { "question", 600, NULL }, - { "X", 600, NULL }, - { "Y", 600, NULL }, - { "Z", 600, NULL }, - { "four", 600, NULL }, - { "a", 600, NULL }, - { "Gcommaaccent", 600, NULL }, - { "b", 600, NULL }, - { "c", 600, NULL }, - { "d", 600, NULL }, - { "e", 600, NULL }, - { "f", 600, NULL }, - { "g", 600, NULL }, - { "bullet", 600, NULL }, - { "h", 600, NULL }, - { "i", 600, NULL }, - { "Oslash", 600, NULL }, - { "dagger", 600, NULL }, - { "j", 600, NULL }, - { "k", 600, NULL }, - { "l", 600, NULL }, - { "m", 600, NULL }, - { "n", 600, NULL }, - { "tcommaaccent", 600, NULL }, - { "o", 600, NULL }, - { "ordfeminine", 600, NULL }, - { "ring", 600, NULL }, - { "p", 600, NULL }, - { "q", 600, NULL }, - { "uhungarumlaut", 600, NULL }, - { "r", 600, NULL }, - { "twosuperior", 600, NULL }, - { "aacute", 600, NULL }, - { "s", 600, NULL }, - { "OE", 600, NULL }, - { "t", 600, NULL }, - { "divide", 600, NULL }, - { "u", 600, NULL }, - { "Ccaron", 600, NULL }, - { "v", 600, NULL }, - { "w", 600, NULL }, - { "x", 600, NULL }, - { "y", 600, NULL }, - { "z", 600, NULL }, - { "Gbreve", 600, NULL }, - { "commaaccent", 600, NULL }, - { "hungarumlaut", 600, NULL }, - { "Idotaccent", 600, NULL }, - { "Nacute", 600, NULL }, - { "quotedbl", 600, NULL }, - { "gcommaaccent", 600, NULL }, - { "mu", 600, NULL }, - { "greaterequal", 600, NULL }, - { "Scaron", 600, NULL }, - { "Lslash", 600, NULL }, - { "semicolon", 600, NULL }, - { "oslash", 600, NULL }, - { "lessequal", 600, NULL }, - { "lozenge", 600, NULL }, - { "parenright", 600, NULL }, - { "ccaron", 600, NULL }, - { "Ecircumflex", 600, NULL }, - { "gbreve", 600, NULL }, - { "trademark", 600, NULL }, - { "daggerdbl", 600, NULL }, - { "nacute", 600, NULL }, - { "macron", 600, NULL }, - { "Otilde", 600, NULL }, - { "Emacron", 600, NULL }, - { "ellipsis", 600, NULL }, - { "scaron", 600, NULL }, - { "AE", 600, NULL }, - { "Ucircumflex", 600, NULL }, - { "lslash", 600, NULL }, - { "quotedblleft", 600, NULL }, - { "hyphen", 600, NULL }, - { "guilsinglright", 600, NULL }, - { "quotesingle", 600, NULL }, - { "eight", 600, NULL }, - { "exclamdown", 600, NULL }, - { "endash", 600, NULL }, - { "oe", 600, NULL }, - { "Abreve", 600, NULL }, - { "Umacron", 600, NULL }, - { "ecircumflex", 600, NULL }, - { "Adieresis", 600, NULL }, - { "copyright", 600, NULL }, - { "Egrave", 600, NULL }, - { "slash", 600, NULL }, - { "Edieresis", 600, NULL }, - { "otilde", 600, NULL }, - { "Idieresis", 600, NULL }, - { "parenleft", 600, NULL }, - { "one", 600, NULL }, - { "emacron", 600, NULL }, - { "Odieresis", 600, NULL }, - { "ucircumflex", 600, NULL }, - { "bracketleft", 600, NULL }, - { "Ugrave", 600, NULL }, - { "quoteright", 600, NULL }, - { "Udieresis", 600, NULL }, - { "perthousand", 600, NULL }, - { "Ydieresis", 600, NULL }, - { "umacron", 600, NULL }, - { "abreve", 600, NULL }, - { "Eacute", 600, NULL }, - { "adieresis", 600, NULL }, - { "egrave", 600, NULL }, - { "edieresis", 600, NULL }, - { "idieresis", 600, NULL }, - { "Eth", 600, NULL }, - { "ae", 600, NULL }, - { "asterisk", 600, NULL }, - { "odieresis", 600, NULL }, - { "Uacute", 600, NULL }, - { "ugrave", 600, NULL }, - { "five", 600, NULL }, - { "nine", 600, NULL }, - { "udieresis", 600, NULL }, - { "Zcaron", 600, NULL }, - { "Scommaaccent", 600, NULL }, - { "threequarters", 600, NULL }, - { "guillemotright", 600, NULL }, - { "Ccedilla", 600, NULL }, - { "ydieresis", 600, NULL }, - { "tilde", 600, NULL }, - { "at", 600, NULL }, - { "eacute", 600, NULL }, - { "underscore", 600, NULL }, - { "Euro", 600, NULL }, - { "Dcroat", 600, NULL }, - { "zero", 600, NULL }, - { "multiply", 600, NULL }, - { "eth", 600, NULL }, - { "Scedilla", 600, NULL }, - { "Racute", 600, NULL }, - { "Ograve", 600, NULL }, - { "partialdiff", 600, NULL }, - { "uacute", 600, NULL }, - { "braceleft", 600, NULL }, - { "Thorn", 600, NULL }, - { "zcaron", 600, NULL }, - { "scommaaccent", 600, NULL }, - { "ccedilla", 600, NULL }, - { "Dcaron", 600, NULL }, - { "dcroat", 600, NULL }, - { "scedilla", 600, NULL }, - { "Oacute", 600, NULL }, - { "Ocircumflex", 600, NULL }, - { "ogonek", 600, NULL }, - { "ograve", 600, NULL }, - { "racute", 600, NULL }, - { "Tcaron", 600, NULL }, - { "Eogonek", 600, NULL }, - { "thorn", 600, NULL }, - { "degree", 600, NULL }, - { "registered", 600, NULL }, - { "radical", 600, NULL }, - { "Aring", 600, NULL }, - { "percent", 600, NULL }, - { "six", 600, NULL }, - { "paragraph", 600, NULL }, - { "dcaron", 600, NULL }, - { "Uogonek", 600, NULL }, - { "two", 600, NULL }, - { "summation", 600, NULL }, - { "Igrave", 600, NULL }, - { "Lacute", 600, NULL }, - { "ocircumflex", 600, NULL }, - { "oacute", 600, NULL }, - { "Uring", 600, NULL }, - { "Lcommaaccent", 600, NULL }, - { "tcaron", 600, NULL }, - { "eogonek", 600, NULL }, - { "Delta", 600, NULL }, - { "Ohungarumlaut", 600, NULL }, - { "asciicircum", 600, NULL }, - { "aring", 600, NULL }, - { "grave", 600, NULL }, - { "uogonek", 600, NULL }, - { "bracketright", 600, NULL }, - { "ampersand", 600, NULL }, - { "Iacute", 600, NULL }, - { "lacute", 600, NULL }, - { "igrave", 600, NULL }, - { "Ncaron", 600, NULL }, - { "plus", 600, NULL }, - { "uring", 600, NULL }, - { "quotesinglbase", 600, NULL }, - { "lcommaaccent", 600, NULL }, - { "Yacute", 600, NULL }, - { "ohungarumlaut", 600, NULL }, - { "threesuperior", 600, NULL }, - { "acute", 600, NULL }, - { "section", 600, NULL }, - { "dieresis", 600, NULL }, - { "quotedblbase", 600, NULL }, - { "iacute", 600, NULL }, - { "ncaron", 600, NULL }, - { "florin", 600, NULL }, - { "yacute", 600, NULL }, - { "Rcommaaccent", 600, NULL }, - { "fi", 600, NULL }, - { "fl", 600, NULL }, - { "Acircumflex", 600, NULL }, - { "Cacute", 600, NULL }, - { "Icircumflex", 600, NULL }, - { "guillemotleft", 600, NULL }, - { "germandbls", 600, NULL }, - { "seven", 600, NULL }, - { "Amacron", 600, NULL }, - { "Sacute", 600, NULL }, - { "ordmasculine", 600, NULL }, - { "dotlessi", 600, NULL }, - { "sterling", 600, NULL }, - { "notequal", 600, NULL }, - { "Imacron", 600, NULL }, - { "rcommaaccent", 600, NULL }, - { "Zdotaccent", 600, NULL }, - { "acircumflex", 600, NULL }, - { "cacute", 600, NULL }, - { "Ecaron", 600, NULL }, - { "braceright", 600, NULL }, - { "icircumflex", 600, NULL }, - { "quotedblright", 600, NULL }, - { "amacron", 600, NULL }, - { "sacute", 600, NULL }, - { "imacron", 600, NULL }, - { "cent", 600, NULL }, - { "currency", 600, NULL }, - { "logicalnot", 600, NULL }, - { "zdotaccent", 600, NULL }, - { "Atilde", 600, NULL }, - { "breve", 600, NULL }, - { "bar", 600, NULL }, - { "fraction", 600, NULL }, - { "less", 600, NULL }, - { "ecaron", 600, NULL }, - { "guilsinglleft", 600, NULL }, - { "exclam", 600, NULL }, - { "period", 600, NULL }, - { "Rcaron", 600, NULL }, - { "Kcommaaccent", 600, NULL }, - { "greater", 600, NULL }, - { "atilde", 600, NULL }, - { "brokenbar", 600, NULL }, - { "quoteleft", 600, NULL }, - { "Edotaccent", 600, NULL }, - { "onesuperior", 600, NULL } -}; - -static BuiltinFontWidth courierBoldWidthsTab[] = { - { "Ntilde", 600, NULL }, - { "rcaron", 600, NULL }, - { "kcommaaccent", 600, NULL }, - { "Ncommaaccent", 600, NULL }, - { "Zacute", 600, NULL }, - { "comma", 600, NULL }, - { "cedilla", 600, NULL }, - { "plusminus", 600, NULL }, - { "circumflex", 600, NULL }, - { "dotaccent", 600, NULL }, - { "edotaccent", 600, NULL }, - { "asciitilde", 600, NULL }, - { "colon", 600, NULL }, - { "onehalf", 600, NULL }, - { "dollar", 600, NULL }, - { "Lcaron", 600, NULL }, - { "ntilde", 600, NULL }, - { "Aogonek", 600, NULL }, - { "ncommaaccent", 600, NULL }, - { "minus", 600, NULL }, - { "Iogonek", 600, NULL }, - { "zacute", 600, NULL }, - { "yen", 600, NULL }, - { "space", 600, NULL }, - { "Omacron", 600, NULL }, - { "questiondown", 600, NULL }, - { "emdash", 600, NULL }, - { "Agrave", 600, NULL }, - { "three", 600, NULL }, - { "numbersign", 600, NULL }, - { "lcaron", 600, NULL }, - { "A", 600, NULL }, - { "B", 600, NULL }, - { "C", 600, NULL }, - { "aogonek", 600, NULL }, - { "D", 600, NULL }, - { "E", 600, NULL }, - { "onequarter", 600, NULL }, - { "F", 600, NULL }, - { "G", 600, NULL }, - { "H", 600, NULL }, - { "I", 600, NULL }, - { "J", 600, NULL }, - { "K", 600, NULL }, - { "iogonek", 600, NULL }, - { "backslash", 600, NULL }, - { "L", 600, NULL }, - { "periodcentered", 600, NULL }, - { "M", 600, NULL }, - { "N", 600, NULL }, - { "omacron", 600, NULL }, - { "Tcommaaccent", 600, NULL }, - { "O", 600, NULL }, - { "P", 600, NULL }, - { "Q", 600, NULL }, - { "Uhungarumlaut", 600, NULL }, - { "R", 600, NULL }, - { "Aacute", 600, NULL }, - { "caron", 600, NULL }, - { "S", 600, NULL }, - { "T", 600, NULL }, - { "U", 600, NULL }, - { "agrave", 600, NULL }, - { "V", 600, NULL }, - { "W", 600, NULL }, - { "X", 600, NULL }, - { "question", 600, NULL }, - { "equal", 600, NULL }, - { "Y", 600, NULL }, - { "Z", 600, NULL }, - { "four", 600, NULL }, - { "a", 600, NULL }, - { "Gcommaaccent", 600, NULL }, - { "b", 600, NULL }, - { "c", 600, NULL }, - { "d", 600, NULL }, - { "e", 600, NULL }, - { "f", 600, NULL }, - { "g", 600, NULL }, - { "bullet", 600, NULL }, - { "h", 600, NULL }, - { "i", 600, NULL }, - { "Oslash", 600, NULL }, - { "dagger", 600, NULL }, - { "j", 600, NULL }, - { "k", 600, NULL }, - { "l", 600, NULL }, - { "m", 600, NULL }, - { "n", 600, NULL }, - { "tcommaaccent", 600, NULL }, - { "o", 600, NULL }, - { "ordfeminine", 600, NULL }, - { "ring", 600, NULL }, - { "p", 600, NULL }, - { "q", 600, NULL }, - { "uhungarumlaut", 600, NULL }, - { "r", 600, NULL }, - { "twosuperior", 600, NULL }, - { "aacute", 600, NULL }, - { "s", 600, NULL }, - { "OE", 600, NULL }, - { "t", 600, NULL }, - { "divide", 600, NULL }, - { "u", 600, NULL }, - { "Ccaron", 600, NULL }, - { "v", 600, NULL }, - { "w", 600, NULL }, - { "x", 600, NULL }, - { "y", 600, NULL }, - { "z", 600, NULL }, - { "Gbreve", 600, NULL }, - { "commaaccent", 600, NULL }, - { "hungarumlaut", 600, NULL }, - { "Idotaccent", 600, NULL }, - { "Nacute", 600, NULL }, - { "quotedbl", 600, NULL }, - { "gcommaaccent", 600, NULL }, - { "mu", 600, NULL }, - { "greaterequal", 600, NULL }, - { "Scaron", 600, NULL }, - { "Lslash", 600, NULL }, - { "semicolon", 600, NULL }, - { "oslash", 600, NULL }, - { "lessequal", 600, NULL }, - { "lozenge", 600, NULL }, - { "parenright", 600, NULL }, - { "ccaron", 600, NULL }, - { "Ecircumflex", 600, NULL }, - { "gbreve", 600, NULL }, - { "trademark", 600, NULL }, - { "daggerdbl", 600, NULL }, - { "nacute", 600, NULL }, - { "macron", 600, NULL }, - { "Otilde", 600, NULL }, - { "Emacron", 600, NULL }, - { "ellipsis", 600, NULL }, - { "scaron", 600, NULL }, - { "AE", 600, NULL }, - { "Ucircumflex", 600, NULL }, - { "lslash", 600, NULL }, - { "quotedblleft", 600, NULL }, - { "guilsinglright", 600, NULL }, - { "hyphen", 600, NULL }, - { "quotesingle", 600, NULL }, - { "eight", 600, NULL }, - { "exclamdown", 600, NULL }, - { "endash", 600, NULL }, - { "oe", 600, NULL }, - { "Abreve", 600, NULL }, - { "Umacron", 600, NULL }, - { "ecircumflex", 600, NULL }, - { "Adieresis", 600, NULL }, - { "copyright", 600, NULL }, - { "Egrave", 600, NULL }, - { "slash", 600, NULL }, - { "Edieresis", 600, NULL }, - { "otilde", 600, NULL }, - { "Idieresis", 600, NULL }, - { "parenleft", 600, NULL }, - { "one", 600, NULL }, - { "emacron", 600, NULL }, - { "Odieresis", 600, NULL }, - { "ucircumflex", 600, NULL }, - { "bracketleft", 600, NULL }, - { "Ugrave", 600, NULL }, - { "quoteright", 600, NULL }, - { "Udieresis", 600, NULL }, - { "perthousand", 600, NULL }, - { "Ydieresis", 600, NULL }, - { "umacron", 600, NULL }, - { "abreve", 600, NULL }, - { "Eacute", 600, NULL }, - { "adieresis", 600, NULL }, - { "egrave", 600, NULL }, - { "edieresis", 600, NULL }, - { "idieresis", 600, NULL }, - { "Eth", 600, NULL }, - { "ae", 600, NULL }, - { "asterisk", 600, NULL }, - { "odieresis", 600, NULL }, - { "Uacute", 600, NULL }, - { "ugrave", 600, NULL }, - { "nine", 600, NULL }, - { "five", 600, NULL }, - { "udieresis", 600, NULL }, - { "Zcaron", 600, NULL }, - { "Scommaaccent", 600, NULL }, - { "threequarters", 600, NULL }, - { "guillemotright", 600, NULL }, - { "Ccedilla", 600, NULL }, - { "ydieresis", 600, NULL }, - { "tilde", 600, NULL }, - { "at", 600, NULL }, - { "eacute", 600, NULL }, - { "underscore", 600, NULL }, - { "Euro", 600, NULL }, - { "Dcroat", 600, NULL }, - { "multiply", 600, NULL }, - { "zero", 600, NULL }, - { "eth", 600, NULL }, - { "Scedilla", 600, NULL }, - { "Ograve", 600, NULL }, - { "Racute", 600, NULL }, - { "partialdiff", 600, NULL }, - { "uacute", 600, NULL }, - { "braceleft", 600, NULL }, - { "Thorn", 600, NULL }, - { "zcaron", 600, NULL }, - { "scommaaccent", 600, NULL }, - { "ccedilla", 600, NULL }, - { "Dcaron", 600, NULL }, - { "dcroat", 600, NULL }, - { "Ocircumflex", 600, NULL }, - { "Oacute", 600, NULL }, - { "scedilla", 600, NULL }, - { "ogonek", 600, NULL }, - { "ograve", 600, NULL }, - { "racute", 600, NULL }, - { "Tcaron", 600, NULL }, - { "Eogonek", 600, NULL }, - { "thorn", 600, NULL }, - { "degree", 600, NULL }, - { "registered", 600, NULL }, - { "radical", 600, NULL }, - { "Aring", 600, NULL }, - { "percent", 600, NULL }, - { "six", 600, NULL }, - { "paragraph", 600, NULL }, - { "dcaron", 600, NULL }, - { "Uogonek", 600, NULL }, - { "two", 600, NULL }, - { "summation", 600, NULL }, - { "Igrave", 600, NULL }, - { "Lacute", 600, NULL }, - { "ocircumflex", 600, NULL }, - { "oacute", 600, NULL }, - { "Uring", 600, NULL }, - { "Lcommaaccent", 600, NULL }, - { "tcaron", 600, NULL }, - { "eogonek", 600, NULL }, - { "Delta", 600, NULL }, - { "Ohungarumlaut", 600, NULL }, - { "asciicircum", 600, NULL }, - { "aring", 600, NULL }, - { "grave", 600, NULL }, - { "uogonek", 600, NULL }, - { "bracketright", 600, NULL }, - { "Iacute", 600, NULL }, - { "ampersand", 600, NULL }, - { "igrave", 600, NULL }, - { "lacute", 600, NULL }, - { "Ncaron", 600, NULL }, - { "plus", 600, NULL }, - { "uring", 600, NULL }, - { "quotesinglbase", 600, NULL }, - { "lcommaaccent", 600, NULL }, - { "Yacute", 600, NULL }, - { "ohungarumlaut", 600, NULL }, - { "threesuperior", 600, NULL }, - { "acute", 600, NULL }, - { "section", 600, NULL }, - { "dieresis", 600, NULL }, - { "iacute", 600, NULL }, - { "quotedblbase", 600, NULL }, - { "ncaron", 600, NULL }, - { "florin", 600, NULL }, - { "yacute", 600, NULL }, - { "Rcommaaccent", 600, NULL }, - { "fi", 600, NULL }, - { "fl", 600, NULL }, - { "Acircumflex", 600, NULL }, - { "Cacute", 600, NULL }, - { "Icircumflex", 600, NULL }, - { "guillemotleft", 600, NULL }, - { "germandbls", 600, NULL }, - { "Amacron", 600, NULL }, - { "seven", 600, NULL }, - { "Sacute", 600, NULL }, - { "ordmasculine", 600, NULL }, - { "dotlessi", 600, NULL }, - { "sterling", 600, NULL }, - { "notequal", 600, NULL }, - { "Imacron", 600, NULL }, - { "rcommaaccent", 600, NULL }, - { "Zdotaccent", 600, NULL }, - { "acircumflex", 600, NULL }, - { "cacute", 600, NULL }, - { "Ecaron", 600, NULL }, - { "icircumflex", 600, NULL }, - { "braceright", 600, NULL }, - { "quotedblright", 600, NULL }, - { "amacron", 600, NULL }, - { "sacute", 600, NULL }, - { "imacron", 600, NULL }, - { "cent", 600, NULL }, - { "currency", 600, NULL }, - { "logicalnot", 600, NULL }, - { "zdotaccent", 600, NULL }, - { "Atilde", 600, NULL }, - { "breve", 600, NULL }, - { "bar", 600, NULL }, - { "fraction", 600, NULL }, - { "less", 600, NULL }, - { "ecaron", 600, NULL }, - { "guilsinglleft", 600, NULL }, - { "exclam", 600, NULL }, - { "period", 600, NULL }, - { "Rcaron", 600, NULL }, - { "Kcommaaccent", 600, NULL }, - { "greater", 600, NULL }, - { "atilde", 600, NULL }, - { "brokenbar", 600, NULL }, - { "quoteleft", 600, NULL }, - { "Edotaccent", 600, NULL }, - { "onesuperior", 600, NULL } -}; - -static BuiltinFontWidth courierBoldObliqueWidthsTab[] = { - { "Ntilde", 600, NULL }, - { "rcaron", 600, NULL }, - { "kcommaaccent", 600, NULL }, - { "Ncommaaccent", 600, NULL }, - { "Zacute", 600, NULL }, - { "comma", 600, NULL }, - { "cedilla", 600, NULL }, - { "plusminus", 600, NULL }, - { "circumflex", 600, NULL }, - { "dotaccent", 600, NULL }, - { "edotaccent", 600, NULL }, - { "asciitilde", 600, NULL }, - { "colon", 600, NULL }, - { "onehalf", 600, NULL }, - { "dollar", 600, NULL }, - { "Lcaron", 600, NULL }, - { "ntilde", 600, NULL }, - { "Aogonek", 600, NULL }, - { "ncommaaccent", 600, NULL }, - { "minus", 600, NULL }, - { "Iogonek", 600, NULL }, - { "zacute", 600, NULL }, - { "yen", 600, NULL }, - { "space", 600, NULL }, - { "Omacron", 600, NULL }, - { "questiondown", 600, NULL }, - { "emdash", 600, NULL }, - { "Agrave", 600, NULL }, - { "three", 600, NULL }, - { "numbersign", 600, NULL }, - { "lcaron", 600, NULL }, - { "A", 600, NULL }, - { "B", 600, NULL }, - { "C", 600, NULL }, - { "aogonek", 600, NULL }, - { "D", 600, NULL }, - { "E", 600, NULL }, - { "onequarter", 600, NULL }, - { "F", 600, NULL }, - { "G", 600, NULL }, - { "H", 600, NULL }, - { "I", 600, NULL }, - { "J", 600, NULL }, - { "K", 600, NULL }, - { "iogonek", 600, NULL }, - { "backslash", 600, NULL }, - { "L", 600, NULL }, - { "periodcentered", 600, NULL }, - { "M", 600, NULL }, - { "N", 600, NULL }, - { "omacron", 600, NULL }, - { "Tcommaaccent", 600, NULL }, - { "O", 600, NULL }, - { "P", 600, NULL }, - { "Q", 600, NULL }, - { "Uhungarumlaut", 600, NULL }, - { "R", 600, NULL }, - { "Aacute", 600, NULL }, - { "caron", 600, NULL }, - { "S", 600, NULL }, - { "T", 600, NULL }, - { "U", 600, NULL }, - { "agrave", 600, NULL }, - { "V", 600, NULL }, - { "W", 600, NULL }, - { "X", 600, NULL }, - { "question", 600, NULL }, - { "equal", 600, NULL }, - { "Y", 600, NULL }, - { "Z", 600, NULL }, - { "four", 600, NULL }, - { "a", 600, NULL }, - { "Gcommaaccent", 600, NULL }, - { "b", 600, NULL }, - { "c", 600, NULL }, - { "d", 600, NULL }, - { "e", 600, NULL }, - { "f", 600, NULL }, - { "g", 600, NULL }, - { "bullet", 600, NULL }, - { "h", 600, NULL }, - { "i", 600, NULL }, - { "Oslash", 600, NULL }, - { "dagger", 600, NULL }, - { "j", 600, NULL }, - { "k", 600, NULL }, - { "l", 600, NULL }, - { "m", 600, NULL }, - { "n", 600, NULL }, - { "tcommaaccent", 600, NULL }, - { "o", 600, NULL }, - { "ordfeminine", 600, NULL }, - { "ring", 600, NULL }, - { "p", 600, NULL }, - { "q", 600, NULL }, - { "uhungarumlaut", 600, NULL }, - { "r", 600, NULL }, - { "twosuperior", 600, NULL }, - { "aacute", 600, NULL }, - { "s", 600, NULL }, - { "OE", 600, NULL }, - { "t", 600, NULL }, - { "divide", 600, NULL }, - { "u", 600, NULL }, - { "Ccaron", 600, NULL }, - { "v", 600, NULL }, - { "w", 600, NULL }, - { "x", 600, NULL }, - { "y", 600, NULL }, - { "z", 600, NULL }, - { "Gbreve", 600, NULL }, - { "commaaccent", 600, NULL }, - { "hungarumlaut", 600, NULL }, - { "Idotaccent", 600, NULL }, - { "Nacute", 600, NULL }, - { "quotedbl", 600, NULL }, - { "gcommaaccent", 600, NULL }, - { "mu", 600, NULL }, - { "greaterequal", 600, NULL }, - { "Scaron", 600, NULL }, - { "Lslash", 600, NULL }, - { "semicolon", 600, NULL }, - { "oslash", 600, NULL }, - { "lessequal", 600, NULL }, - { "lozenge", 600, NULL }, - { "parenright", 600, NULL }, - { "ccaron", 600, NULL }, - { "Ecircumflex", 600, NULL }, - { "gbreve", 600, NULL }, - { "trademark", 600, NULL }, - { "daggerdbl", 600, NULL }, - { "nacute", 600, NULL }, - { "macron", 600, NULL }, - { "Otilde", 600, NULL }, - { "Emacron", 600, NULL }, - { "ellipsis", 600, NULL }, - { "scaron", 600, NULL }, - { "AE", 600, NULL }, - { "Ucircumflex", 600, NULL }, - { "lslash", 600, NULL }, - { "quotedblleft", 600, NULL }, - { "guilsinglright", 600, NULL }, - { "hyphen", 600, NULL }, - { "quotesingle", 600, NULL }, - { "eight", 600, NULL }, - { "exclamdown", 600, NULL }, - { "endash", 600, NULL }, - { "oe", 600, NULL }, - { "Abreve", 600, NULL }, - { "Umacron", 600, NULL }, - { "ecircumflex", 600, NULL }, - { "Adieresis", 600, NULL }, - { "copyright", 600, NULL }, - { "Egrave", 600, NULL }, - { "slash", 600, NULL }, - { "Edieresis", 600, NULL }, - { "otilde", 600, NULL }, - { "Idieresis", 600, NULL }, - { "parenleft", 600, NULL }, - { "one", 600, NULL }, - { "emacron", 600, NULL }, - { "Odieresis", 600, NULL }, - { "ucircumflex", 600, NULL }, - { "bracketleft", 600, NULL }, - { "Ugrave", 600, NULL }, - { "quoteright", 600, NULL }, - { "Udieresis", 600, NULL }, - { "perthousand", 600, NULL }, - { "Ydieresis", 600, NULL }, - { "umacron", 600, NULL }, - { "abreve", 600, NULL }, - { "Eacute", 600, NULL }, - { "adieresis", 600, NULL }, - { "egrave", 600, NULL }, - { "edieresis", 600, NULL }, - { "idieresis", 600, NULL }, - { "Eth", 600, NULL }, - { "ae", 600, NULL }, - { "asterisk", 600, NULL }, - { "odieresis", 600, NULL }, - { "Uacute", 600, NULL }, - { "ugrave", 600, NULL }, - { "nine", 600, NULL }, - { "five", 600, NULL }, - { "udieresis", 600, NULL }, - { "Zcaron", 600, NULL }, - { "Scommaaccent", 600, NULL }, - { "threequarters", 600, NULL }, - { "guillemotright", 600, NULL }, - { "Ccedilla", 600, NULL }, - { "ydieresis", 600, NULL }, - { "tilde", 600, NULL }, - { "at", 600, NULL }, - { "eacute", 600, NULL }, - { "underscore", 600, NULL }, - { "Euro", 600, NULL }, - { "Dcroat", 600, NULL }, - { "multiply", 600, NULL }, - { "zero", 600, NULL }, - { "eth", 600, NULL }, - { "Scedilla", 600, NULL }, - { "Ograve", 600, NULL }, - { "Racute", 600, NULL }, - { "partialdiff", 600, NULL }, - { "uacute", 600, NULL }, - { "braceleft", 600, NULL }, - { "Thorn", 600, NULL }, - { "zcaron", 600, NULL }, - { "scommaaccent", 600, NULL }, - { "ccedilla", 600, NULL }, - { "Dcaron", 600, NULL }, - { "dcroat", 600, NULL }, - { "Ocircumflex", 600, NULL }, - { "Oacute", 600, NULL }, - { "scedilla", 600, NULL }, - { "ogonek", 600, NULL }, - { "ograve", 600, NULL }, - { "racute", 600, NULL }, - { "Tcaron", 600, NULL }, - { "Eogonek", 600, NULL }, - { "thorn", 600, NULL }, - { "degree", 600, NULL }, - { "registered", 600, NULL }, - { "radical", 600, NULL }, - { "Aring", 600, NULL }, - { "percent", 600, NULL }, - { "six", 600, NULL }, - { "paragraph", 600, NULL }, - { "dcaron", 600, NULL }, - { "Uogonek", 600, NULL }, - { "two", 600, NULL }, - { "summation", 600, NULL }, - { "Igrave", 600, NULL }, - { "Lacute", 600, NULL }, - { "ocircumflex", 600, NULL }, - { "oacute", 600, NULL }, - { "Uring", 600, NULL }, - { "Lcommaaccent", 600, NULL }, - { "tcaron", 600, NULL }, - { "eogonek", 600, NULL }, - { "Delta", 600, NULL }, - { "Ohungarumlaut", 600, NULL }, - { "asciicircum", 600, NULL }, - { "aring", 600, NULL }, - { "grave", 600, NULL }, - { "uogonek", 600, NULL }, - { "bracketright", 600, NULL }, - { "Iacute", 600, NULL }, - { "ampersand", 600, NULL }, - { "igrave", 600, NULL }, - { "lacute", 600, NULL }, - { "Ncaron", 600, NULL }, - { "plus", 600, NULL }, - { "uring", 600, NULL }, - { "quotesinglbase", 600, NULL }, - { "lcommaaccent", 600, NULL }, - { "Yacute", 600, NULL }, - { "ohungarumlaut", 600, NULL }, - { "threesuperior", 600, NULL }, - { "acute", 600, NULL }, - { "section", 600, NULL }, - { "dieresis", 600, NULL }, - { "iacute", 600, NULL }, - { "quotedblbase", 600, NULL }, - { "ncaron", 600, NULL }, - { "florin", 600, NULL }, - { "yacute", 600, NULL }, - { "Rcommaaccent", 600, NULL }, - { "fi", 600, NULL }, - { "fl", 600, NULL }, - { "Acircumflex", 600, NULL }, - { "Cacute", 600, NULL }, - { "Icircumflex", 600, NULL }, - { "guillemotleft", 600, NULL }, - { "germandbls", 600, NULL }, - { "Amacron", 600, NULL }, - { "seven", 600, NULL }, - { "Sacute", 600, NULL }, - { "ordmasculine", 600, NULL }, - { "dotlessi", 600, NULL }, - { "sterling", 600, NULL }, - { "notequal", 600, NULL }, - { "Imacron", 600, NULL }, - { "rcommaaccent", 600, NULL }, - { "Zdotaccent", 600, NULL }, - { "acircumflex", 600, NULL }, - { "cacute", 600, NULL }, - { "Ecaron", 600, NULL }, - { "icircumflex", 600, NULL }, - { "braceright", 600, NULL }, - { "quotedblright", 600, NULL }, - { "amacron", 600, NULL }, - { "sacute", 600, NULL }, - { "imacron", 600, NULL }, - { "cent", 600, NULL }, - { "currency", 600, NULL }, - { "logicalnot", 600, NULL }, - { "zdotaccent", 600, NULL }, - { "Atilde", 600, NULL }, - { "breve", 600, NULL }, - { "bar", 600, NULL }, - { "fraction", 600, NULL }, - { "less", 600, NULL }, - { "ecaron", 600, NULL }, - { "guilsinglleft", 600, NULL }, - { "exclam", 600, NULL }, - { "period", 600, NULL }, - { "Rcaron", 600, NULL }, - { "Kcommaaccent", 600, NULL }, - { "greater", 600, NULL }, - { "atilde", 600, NULL }, - { "brokenbar", 600, NULL }, - { "quoteleft", 600, NULL }, - { "Edotaccent", 600, NULL }, - { "onesuperior", 600, NULL } -}; - -static BuiltinFontWidth courierObliqueWidthsTab[] = { - { "Ntilde", 600, NULL }, - { "rcaron", 600, NULL }, - { "kcommaaccent", 600, NULL }, - { "Ncommaaccent", 600, NULL }, - { "Zacute", 600, NULL }, - { "comma", 600, NULL }, - { "cedilla", 600, NULL }, - { "plusminus", 600, NULL }, - { "circumflex", 600, NULL }, - { "dotaccent", 600, NULL }, - { "edotaccent", 600, NULL }, - { "asciitilde", 600, NULL }, - { "colon", 600, NULL }, - { "onehalf", 600, NULL }, - { "dollar", 600, NULL }, - { "Lcaron", 600, NULL }, - { "ntilde", 600, NULL }, - { "Aogonek", 600, NULL }, - { "ncommaaccent", 600, NULL }, - { "minus", 600, NULL }, - { "Iogonek", 600, NULL }, - { "zacute", 600, NULL }, - { "yen", 600, NULL }, - { "space", 600, NULL }, - { "Omacron", 600, NULL }, - { "questiondown", 600, NULL }, - { "emdash", 600, NULL }, - { "Agrave", 600, NULL }, - { "three", 600, NULL }, - { "numbersign", 600, NULL }, - { "lcaron", 600, NULL }, - { "A", 600, NULL }, - { "B", 600, NULL }, - { "C", 600, NULL }, - { "aogonek", 600, NULL }, - { "D", 600, NULL }, - { "E", 600, NULL }, - { "onequarter", 600, NULL }, - { "F", 600, NULL }, - { "G", 600, NULL }, - { "H", 600, NULL }, - { "I", 600, NULL }, - { "J", 600, NULL }, - { "K", 600, NULL }, - { "iogonek", 600, NULL }, - { "backslash", 600, NULL }, - { "L", 600, NULL }, - { "periodcentered", 600, NULL }, - { "M", 600, NULL }, - { "N", 600, NULL }, - { "omacron", 600, NULL }, - { "Tcommaaccent", 600, NULL }, - { "O", 600, NULL }, - { "P", 600, NULL }, - { "Q", 600, NULL }, - { "Uhungarumlaut", 600, NULL }, - { "R", 600, NULL }, - { "Aacute", 600, NULL }, - { "caron", 600, NULL }, - { "S", 600, NULL }, - { "T", 600, NULL }, - { "U", 600, NULL }, - { "agrave", 600, NULL }, - { "V", 600, NULL }, - { "W", 600, NULL }, - { "X", 600, NULL }, - { "question", 600, NULL }, - { "equal", 600, NULL }, - { "Y", 600, NULL }, - { "Z", 600, NULL }, - { "four", 600, NULL }, - { "a", 600, NULL }, - { "Gcommaaccent", 600, NULL }, - { "b", 600, NULL }, - { "c", 600, NULL }, - { "d", 600, NULL }, - { "e", 600, NULL }, - { "f", 600, NULL }, - { "g", 600, NULL }, - { "bullet", 600, NULL }, - { "h", 600, NULL }, - { "i", 600, NULL }, - { "Oslash", 600, NULL }, - { "dagger", 600, NULL }, - { "j", 600, NULL }, - { "k", 600, NULL }, - { "l", 600, NULL }, - { "m", 600, NULL }, - { "n", 600, NULL }, - { "tcommaaccent", 600, NULL }, - { "o", 600, NULL }, - { "ordfeminine", 600, NULL }, - { "ring", 600, NULL }, - { "p", 600, NULL }, - { "q", 600, NULL }, - { "uhungarumlaut", 600, NULL }, - { "r", 600, NULL }, - { "twosuperior", 600, NULL }, - { "aacute", 600, NULL }, - { "s", 600, NULL }, - { "OE", 600, NULL }, - { "t", 600, NULL }, - { "divide", 600, NULL }, - { "u", 600, NULL }, - { "Ccaron", 600, NULL }, - { "v", 600, NULL }, - { "w", 600, NULL }, - { "x", 600, NULL }, - { "y", 600, NULL }, - { "z", 600, NULL }, - { "Gbreve", 600, NULL }, - { "commaaccent", 600, NULL }, - { "hungarumlaut", 600, NULL }, - { "Idotaccent", 600, NULL }, - { "Nacute", 600, NULL }, - { "quotedbl", 600, NULL }, - { "gcommaaccent", 600, NULL }, - { "mu", 600, NULL }, - { "greaterequal", 600, NULL }, - { "Scaron", 600, NULL }, - { "Lslash", 600, NULL }, - { "semicolon", 600, NULL }, - { "oslash", 600, NULL }, - { "lessequal", 600, NULL }, - { "lozenge", 600, NULL }, - { "parenright", 600, NULL }, - { "ccaron", 600, NULL }, - { "Ecircumflex", 600, NULL }, - { "gbreve", 600, NULL }, - { "trademark", 600, NULL }, - { "daggerdbl", 600, NULL }, - { "nacute", 600, NULL }, - { "macron", 600, NULL }, - { "Otilde", 600, NULL }, - { "Emacron", 600, NULL }, - { "ellipsis", 600, NULL }, - { "scaron", 600, NULL }, - { "AE", 600, NULL }, - { "Ucircumflex", 600, NULL }, - { "lslash", 600, NULL }, - { "quotedblleft", 600, NULL }, - { "guilsinglright", 600, NULL }, - { "hyphen", 600, NULL }, - { "quotesingle", 600, NULL }, - { "eight", 600, NULL }, - { "exclamdown", 600, NULL }, - { "endash", 600, NULL }, - { "oe", 600, NULL }, - { "Abreve", 600, NULL }, - { "Umacron", 600, NULL }, - { "ecircumflex", 600, NULL }, - { "Adieresis", 600, NULL }, - { "copyright", 600, NULL }, - { "Egrave", 600, NULL }, - { "slash", 600, NULL }, - { "Edieresis", 600, NULL }, - { "otilde", 600, NULL }, - { "Idieresis", 600, NULL }, - { "parenleft", 600, NULL }, - { "one", 600, NULL }, - { "emacron", 600, NULL }, - { "Odieresis", 600, NULL }, - { "ucircumflex", 600, NULL }, - { "bracketleft", 600, NULL }, - { "Ugrave", 600, NULL }, - { "quoteright", 600, NULL }, - { "Udieresis", 600, NULL }, - { "perthousand", 600, NULL }, - { "Ydieresis", 600, NULL }, - { "umacron", 600, NULL }, - { "abreve", 600, NULL }, - { "Eacute", 600, NULL }, - { "adieresis", 600, NULL }, - { "egrave", 600, NULL }, - { "edieresis", 600, NULL }, - { "idieresis", 600, NULL }, - { "Eth", 600, NULL }, - { "ae", 600, NULL }, - { "asterisk", 600, NULL }, - { "odieresis", 600, NULL }, - { "Uacute", 600, NULL }, - { "ugrave", 600, NULL }, - { "nine", 600, NULL }, - { "five", 600, NULL }, - { "udieresis", 600, NULL }, - { "Zcaron", 600, NULL }, - { "Scommaaccent", 600, NULL }, - { "threequarters", 600, NULL }, - { "guillemotright", 600, NULL }, - { "Ccedilla", 600, NULL }, - { "ydieresis", 600, NULL }, - { "tilde", 600, NULL }, - { "at", 600, NULL }, - { "eacute", 600, NULL }, - { "underscore", 600, NULL }, - { "Euro", 600, NULL }, - { "Dcroat", 600, NULL }, - { "multiply", 600, NULL }, - { "zero", 600, NULL }, - { "eth", 600, NULL }, - { "Scedilla", 600, NULL }, - { "Ograve", 600, NULL }, - { "Racute", 600, NULL }, - { "partialdiff", 600, NULL }, - { "uacute", 600, NULL }, - { "braceleft", 600, NULL }, - { "Thorn", 600, NULL }, - { "zcaron", 600, NULL }, - { "scommaaccent", 600, NULL }, - { "ccedilla", 600, NULL }, - { "Dcaron", 600, NULL }, - { "dcroat", 600, NULL }, - { "Ocircumflex", 600, NULL }, - { "Oacute", 600, NULL }, - { "scedilla", 600, NULL }, - { "ogonek", 600, NULL }, - { "ograve", 600, NULL }, - { "racute", 600, NULL }, - { "Tcaron", 600, NULL }, - { "Eogonek", 600, NULL }, - { "thorn", 600, NULL }, - { "degree", 600, NULL }, - { "registered", 600, NULL }, - { "radical", 600, NULL }, - { "Aring", 600, NULL }, - { "percent", 600, NULL }, - { "six", 600, NULL }, - { "paragraph", 600, NULL }, - { "dcaron", 600, NULL }, - { "Uogonek", 600, NULL }, - { "two", 600, NULL }, - { "summation", 600, NULL }, - { "Igrave", 600, NULL }, - { "Lacute", 600, NULL }, - { "ocircumflex", 600, NULL }, - { "oacute", 600, NULL }, - { "Uring", 600, NULL }, - { "Lcommaaccent", 600, NULL }, - { "tcaron", 600, NULL }, - { "eogonek", 600, NULL }, - { "Delta", 600, NULL }, - { "Ohungarumlaut", 600, NULL }, - { "asciicircum", 600, NULL }, - { "aring", 600, NULL }, - { "grave", 600, NULL }, - { "uogonek", 600, NULL }, - { "bracketright", 600, NULL }, - { "Iacute", 600, NULL }, - { "ampersand", 600, NULL }, - { "igrave", 600, NULL }, - { "lacute", 600, NULL }, - { "Ncaron", 600, NULL }, - { "plus", 600, NULL }, - { "uring", 600, NULL }, - { "quotesinglbase", 600, NULL }, - { "lcommaaccent", 600, NULL }, - { "Yacute", 600, NULL }, - { "ohungarumlaut", 600, NULL }, - { "threesuperior", 600, NULL }, - { "acute", 600, NULL }, - { "section", 600, NULL }, - { "dieresis", 600, NULL }, - { "iacute", 600, NULL }, - { "quotedblbase", 600, NULL }, - { "ncaron", 600, NULL }, - { "florin", 600, NULL }, - { "yacute", 600, NULL }, - { "Rcommaaccent", 600, NULL }, - { "fi", 600, NULL }, - { "fl", 600, NULL }, - { "Acircumflex", 600, NULL }, - { "Cacute", 600, NULL }, - { "Icircumflex", 600, NULL }, - { "guillemotleft", 600, NULL }, - { "germandbls", 600, NULL }, - { "Amacron", 600, NULL }, - { "seven", 600, NULL }, - { "Sacute", 600, NULL }, - { "ordmasculine", 600, NULL }, - { "dotlessi", 600, NULL }, - { "sterling", 600, NULL }, - { "notequal", 600, NULL }, - { "Imacron", 600, NULL }, - { "rcommaaccent", 600, NULL }, - { "Zdotaccent", 600, NULL }, - { "acircumflex", 600, NULL }, - { "cacute", 600, NULL }, - { "Ecaron", 600, NULL }, - { "icircumflex", 600, NULL }, - { "braceright", 600, NULL }, - { "quotedblright", 600, NULL }, - { "amacron", 600, NULL }, - { "sacute", 600, NULL }, - { "imacron", 600, NULL }, - { "cent", 600, NULL }, - { "currency", 600, NULL }, - { "logicalnot", 600, NULL }, - { "zdotaccent", 600, NULL }, - { "Atilde", 600, NULL }, - { "breve", 600, NULL }, - { "bar", 600, NULL }, - { "fraction", 600, NULL }, - { "less", 600, NULL }, - { "ecaron", 600, NULL }, - { "guilsinglleft", 600, NULL }, - { "exclam", 600, NULL }, - { "period", 600, NULL }, - { "Rcaron", 600, NULL }, - { "Kcommaaccent", 600, NULL }, - { "greater", 600, NULL }, - { "atilde", 600, NULL }, - { "brokenbar", 600, NULL }, - { "quoteleft", 600, NULL }, - { "Edotaccent", 600, NULL }, - { "onesuperior", 600, NULL } -}; - -static BuiltinFontWidth helveticaWidthsTab[] = { - { "Ntilde", 722, NULL }, - { "rcaron", 333, NULL }, - { "kcommaaccent", 500, NULL }, - { "Ncommaaccent", 722, NULL }, - { "Zacute", 611, NULL }, - { "comma", 278, NULL }, - { "cedilla", 333, NULL }, - { "plusminus", 584, NULL }, - { "circumflex", 333, NULL }, - { "dotaccent", 333, NULL }, - { "edotaccent", 556, NULL }, - { "asciitilde", 584, NULL }, - { "colon", 278, NULL }, - { "onehalf", 834, NULL }, - { "dollar", 556, NULL }, - { "Lcaron", 556, NULL }, - { "ntilde", 556, NULL }, - { "Aogonek", 667, NULL }, - { "ncommaaccent", 556, NULL }, - { "minus", 584, NULL }, - { "Iogonek", 278, NULL }, - { "zacute", 500, NULL }, - { "yen", 556, NULL }, - { "space", 278, NULL }, - { "Omacron", 778, NULL }, - { "questiondown", 611, NULL }, - { "emdash", 1000, NULL }, - { "Agrave", 667, NULL }, - { "three", 556, NULL }, - { "numbersign", 556, NULL }, - { "lcaron", 299, NULL }, - { "A", 667, NULL }, - { "B", 667, NULL }, - { "C", 722, NULL }, - { "aogonek", 556, NULL }, - { "D", 722, NULL }, - { "E", 667, NULL }, - { "onequarter", 834, NULL }, - { "F", 611, NULL }, - { "G", 778, NULL }, - { "H", 722, NULL }, - { "I", 278, NULL }, - { "J", 500, NULL }, - { "K", 667, NULL }, - { "iogonek", 222, NULL }, - { "backslash", 278, NULL }, - { "L", 556, NULL }, - { "periodcentered", 278, NULL }, - { "M", 833, NULL }, - { "N", 722, NULL }, - { "omacron", 556, NULL }, - { "Tcommaaccent", 611, NULL }, - { "O", 778, NULL }, - { "P", 667, NULL }, - { "Q", 778, NULL }, - { "Uhungarumlaut", 722, NULL }, - { "R", 722, NULL }, - { "Aacute", 667, NULL }, - { "caron", 333, NULL }, - { "S", 667, NULL }, - { "T", 611, NULL }, - { "U", 722, NULL }, - { "agrave", 556, NULL }, - { "V", 667, NULL }, - { "W", 944, NULL }, - { "X", 667, NULL }, - { "question", 556, NULL }, - { "equal", 584, NULL }, - { "Y", 667, NULL }, - { "Z", 611, NULL }, - { "four", 556, NULL }, - { "a", 556, NULL }, - { "Gcommaaccent", 778, NULL }, - { "b", 556, NULL }, - { "c", 500, NULL }, - { "d", 556, NULL }, - { "e", 556, NULL }, - { "f", 278, NULL }, - { "g", 556, NULL }, - { "bullet", 350, NULL }, - { "h", 556, NULL }, - { "i", 222, NULL }, - { "Oslash", 778, NULL }, - { "dagger", 556, NULL }, - { "j", 222, NULL }, - { "k", 500, NULL }, - { "l", 222, NULL }, - { "m", 833, NULL }, - { "n", 556, NULL }, - { "tcommaaccent", 278, NULL }, - { "o", 556, NULL }, - { "ordfeminine", 370, NULL }, - { "ring", 333, NULL }, - { "p", 556, NULL }, - { "q", 556, NULL }, - { "uhungarumlaut", 556, NULL }, - { "r", 333, NULL }, - { "twosuperior", 333, NULL }, - { "aacute", 556, NULL }, - { "s", 500, NULL }, - { "OE", 1000, NULL }, - { "t", 278, NULL }, - { "divide", 584, NULL }, - { "u", 556, NULL }, - { "Ccaron", 722, NULL }, - { "v", 500, NULL }, - { "w", 722, NULL }, - { "x", 500, NULL }, - { "y", 500, NULL }, - { "z", 500, NULL }, - { "Gbreve", 778, NULL }, - { "commaaccent", 250, NULL }, - { "hungarumlaut", 333, NULL }, - { "Idotaccent", 278, NULL }, - { "Nacute", 722, NULL }, - { "quotedbl", 355, NULL }, - { "gcommaaccent", 556, NULL }, - { "mu", 556, NULL }, - { "greaterequal", 549, NULL }, - { "Scaron", 667, NULL }, - { "Lslash", 556, NULL }, - { "semicolon", 278, NULL }, - { "oslash", 611, NULL }, - { "lessequal", 549, NULL }, - { "lozenge", 471, NULL }, - { "parenright", 333, NULL }, - { "ccaron", 500, NULL }, - { "Ecircumflex", 667, NULL }, - { "gbreve", 556, NULL }, - { "trademark", 1000, NULL }, - { "daggerdbl", 556, NULL }, - { "nacute", 556, NULL }, - { "macron", 333, NULL }, - { "Otilde", 778, NULL }, - { "Emacron", 667, NULL }, - { "ellipsis", 1000, NULL }, - { "scaron", 500, NULL }, - { "AE", 1000, NULL }, - { "Ucircumflex", 722, NULL }, - { "lslash", 222, NULL }, - { "quotedblleft", 333, NULL }, - { "guilsinglright", 333, NULL }, - { "hyphen", 333, NULL }, - { "quotesingle", 191, NULL }, - { "eight", 556, NULL }, - { "exclamdown", 333, NULL }, - { "endash", 556, NULL }, - { "oe", 944, NULL }, - { "Abreve", 667, NULL }, - { "Umacron", 722, NULL }, - { "ecircumflex", 556, NULL }, - { "Adieresis", 667, NULL }, - { "copyright", 737, NULL }, - { "Egrave", 667, NULL }, - { "slash", 278, NULL }, - { "Edieresis", 667, NULL }, - { "otilde", 556, NULL }, - { "Idieresis", 278, NULL }, - { "parenleft", 333, NULL }, - { "one", 556, NULL }, - { "emacron", 556, NULL }, - { "Odieresis", 778, NULL }, - { "ucircumflex", 556, NULL }, - { "bracketleft", 278, NULL }, - { "Ugrave", 722, NULL }, - { "quoteright", 222, NULL }, - { "Udieresis", 722, NULL }, - { "perthousand", 1000, NULL }, - { "Ydieresis", 667, NULL }, - { "umacron", 556, NULL }, - { "abreve", 556, NULL }, - { "Eacute", 667, NULL }, - { "adieresis", 556, NULL }, - { "egrave", 556, NULL }, - { "edieresis", 556, NULL }, - { "idieresis", 278, NULL }, - { "Eth", 722, NULL }, - { "ae", 889, NULL }, - { "asterisk", 389, NULL }, - { "odieresis", 556, NULL }, - { "Uacute", 722, NULL }, - { "ugrave", 556, NULL }, - { "nine", 556, NULL }, - { "five", 556, NULL }, - { "udieresis", 556, NULL }, - { "Zcaron", 611, NULL }, - { "Scommaaccent", 667, NULL }, - { "threequarters", 834, NULL }, - { "guillemotright", 556, NULL }, - { "Ccedilla", 722, NULL }, - { "ydieresis", 500, NULL }, - { "tilde", 333, NULL }, - { "at", 1015, NULL }, - { "eacute", 556, NULL }, - { "underscore", 556, NULL }, - { "Euro", 556, NULL }, - { "Dcroat", 722, NULL }, - { "multiply", 584, NULL }, - { "zero", 556, NULL }, - { "eth", 556, NULL }, - { "Scedilla", 667, NULL }, - { "Ograve", 778, NULL }, - { "Racute", 722, NULL }, - { "partialdiff", 476, NULL }, - { "uacute", 556, NULL }, - { "braceleft", 334, NULL }, - { "Thorn", 667, NULL }, - { "zcaron", 500, NULL }, - { "scommaaccent", 500, NULL }, - { "ccedilla", 500, NULL }, - { "Dcaron", 722, NULL }, - { "dcroat", 556, NULL }, - { "Ocircumflex", 778, NULL }, - { "Oacute", 778, NULL }, - { "scedilla", 500, NULL }, - { "ogonek", 333, NULL }, - { "ograve", 556, NULL }, - { "racute", 333, NULL }, - { "Tcaron", 611, NULL }, - { "Eogonek", 667, NULL }, - { "thorn", 556, NULL }, - { "degree", 400, NULL }, - { "registered", 737, NULL }, - { "radical", 453, NULL }, - { "Aring", 667, NULL }, - { "percent", 889, NULL }, - { "six", 556, NULL }, - { "paragraph", 537, NULL }, - { "dcaron", 643, NULL }, - { "Uogonek", 722, NULL }, - { "two", 556, NULL }, - { "summation", 600, NULL }, - { "Igrave", 278, NULL }, - { "Lacute", 556, NULL }, - { "ocircumflex", 556, NULL }, - { "oacute", 556, NULL }, - { "Uring", 722, NULL }, - { "Lcommaaccent", 556, NULL }, - { "tcaron", 317, NULL }, - { "eogonek", 556, NULL }, - { "Delta", 612, NULL }, - { "Ohungarumlaut", 778, NULL }, - { "asciicircum", 469, NULL }, - { "aring", 556, NULL }, - { "grave", 333, NULL }, - { "uogonek", 556, NULL }, - { "bracketright", 278, NULL }, - { "Iacute", 278, NULL }, - { "ampersand", 667, NULL }, - { "igrave", 278, NULL }, - { "lacute", 222, NULL }, - { "Ncaron", 722, NULL }, - { "plus", 584, NULL }, - { "uring", 556, NULL }, - { "quotesinglbase", 222, NULL }, - { "lcommaaccent", 222, NULL }, - { "Yacute", 667, NULL }, - { "ohungarumlaut", 556, NULL }, - { "threesuperior", 333, NULL }, - { "acute", 333, NULL }, - { "section", 556, NULL }, - { "dieresis", 333, NULL }, - { "iacute", 278, NULL }, - { "quotedblbase", 333, NULL }, - { "ncaron", 556, NULL }, - { "florin", 556, NULL }, - { "yacute", 500, NULL }, - { "Rcommaaccent", 722, NULL }, - { "fi", 500, NULL }, - { "fl", 500, NULL }, - { "Acircumflex", 667, NULL }, - { "Cacute", 722, NULL }, - { "Icircumflex", 278, NULL }, - { "guillemotleft", 556, NULL }, - { "germandbls", 611, NULL }, - { "Amacron", 667, NULL }, - { "seven", 556, NULL }, - { "Sacute", 667, NULL }, - { "ordmasculine", 365, NULL }, - { "dotlessi", 278, NULL }, - { "sterling", 556, NULL }, - { "notequal", 549, NULL }, - { "Imacron", 278, NULL }, - { "rcommaaccent", 333, NULL }, - { "Zdotaccent", 611, NULL }, - { "acircumflex", 556, NULL }, - { "cacute", 500, NULL }, - { "Ecaron", 667, NULL }, - { "icircumflex", 278, NULL }, - { "braceright", 334, NULL }, - { "quotedblright", 333, NULL }, - { "amacron", 556, NULL }, - { "sacute", 500, NULL }, - { "imacron", 278, NULL }, - { "cent", 556, NULL }, - { "currency", 556, NULL }, - { "logicalnot", 584, NULL }, - { "zdotaccent", 500, NULL }, - { "Atilde", 667, NULL }, - { "breve", 333, NULL }, - { "bar", 260, NULL }, - { "fraction", 167, NULL }, - { "less", 584, NULL }, - { "ecaron", 556, NULL }, - { "guilsinglleft", 333, NULL }, - { "exclam", 278, NULL }, - { "period", 278, NULL }, - { "Rcaron", 722, NULL }, - { "Kcommaaccent", 667, NULL }, - { "greater", 584, NULL }, - { "atilde", 556, NULL }, - { "brokenbar", 260, NULL }, - { "quoteleft", 222, NULL }, - { "Edotaccent", 667, NULL }, - { "onesuperior", 333, NULL } -}; - -static BuiltinFontWidth helveticaBoldWidthsTab[] = { - { "Ntilde", 722, NULL }, - { "rcaron", 389, NULL }, - { "kcommaaccent", 556, NULL }, - { "Ncommaaccent", 722, NULL }, - { "Zacute", 611, NULL }, - { "comma", 278, NULL }, - { "cedilla", 333, NULL }, - { "plusminus", 584, NULL }, - { "circumflex", 333, NULL }, - { "dotaccent", 333, NULL }, - { "edotaccent", 556, NULL }, - { "asciitilde", 584, NULL }, - { "colon", 333, NULL }, - { "onehalf", 834, NULL }, - { "dollar", 556, NULL }, - { "Lcaron", 611, NULL }, - { "ntilde", 611, NULL }, - { "Aogonek", 722, NULL }, - { "ncommaaccent", 611, NULL }, - { "minus", 584, NULL }, - { "Iogonek", 278, NULL }, - { "zacute", 500, NULL }, - { "yen", 556, NULL }, - { "space", 278, NULL }, - { "Omacron", 778, NULL }, - { "questiondown", 611, NULL }, - { "emdash", 1000, NULL }, - { "Agrave", 722, NULL }, - { "three", 556, NULL }, - { "numbersign", 556, NULL }, - { "lcaron", 400, NULL }, - { "A", 722, NULL }, - { "B", 722, NULL }, - { "C", 722, NULL }, - { "aogonek", 556, NULL }, - { "D", 722, NULL }, - { "E", 667, NULL }, - { "onequarter", 834, NULL }, - { "F", 611, NULL }, - { "G", 778, NULL }, - { "H", 722, NULL }, - { "I", 278, NULL }, - { "J", 556, NULL }, - { "K", 722, NULL }, - { "iogonek", 278, NULL }, - { "backslash", 278, NULL }, - { "L", 611, NULL }, - { "periodcentered", 278, NULL }, - { "M", 833, NULL }, - { "N", 722, NULL }, - { "omacron", 611, NULL }, - { "Tcommaaccent", 611, NULL }, - { "O", 778, NULL }, - { "P", 667, NULL }, - { "Q", 778, NULL }, - { "Uhungarumlaut", 722, NULL }, - { "R", 722, NULL }, - { "Aacute", 722, NULL }, - { "caron", 333, NULL }, - { "S", 667, NULL }, - { "T", 611, NULL }, - { "U", 722, NULL }, - { "agrave", 556, NULL }, - { "V", 667, NULL }, - { "W", 944, NULL }, - { "X", 667, NULL }, - { "question", 611, NULL }, - { "equal", 584, NULL }, - { "Y", 667, NULL }, - { "Z", 611, NULL }, - { "four", 556, NULL }, - { "a", 556, NULL }, - { "Gcommaaccent", 778, NULL }, - { "b", 611, NULL }, - { "c", 556, NULL }, - { "d", 611, NULL }, - { "e", 556, NULL }, - { "f", 333, NULL }, - { "g", 611, NULL }, - { "bullet", 350, NULL }, - { "h", 611, NULL }, - { "i", 278, NULL }, - { "Oslash", 778, NULL }, - { "dagger", 556, NULL }, - { "j", 278, NULL }, - { "k", 556, NULL }, - { "l", 278, NULL }, - { "m", 889, NULL }, - { "n", 611, NULL }, - { "tcommaaccent", 333, NULL }, - { "o", 611, NULL }, - { "ordfeminine", 370, NULL }, - { "ring", 333, NULL }, - { "p", 611, NULL }, - { "q", 611, NULL }, - { "uhungarumlaut", 611, NULL }, - { "r", 389, NULL }, - { "twosuperior", 333, NULL }, - { "aacute", 556, NULL }, - { "s", 556, NULL }, - { "OE", 1000, NULL }, - { "t", 333, NULL }, - { "divide", 584, NULL }, - { "u", 611, NULL }, - { "Ccaron", 722, NULL }, - { "v", 556, NULL }, - { "w", 778, NULL }, - { "x", 556, NULL }, - { "y", 556, NULL }, - { "z", 500, NULL }, - { "Gbreve", 778, NULL }, - { "commaaccent", 250, NULL }, - { "hungarumlaut", 333, NULL }, - { "Idotaccent", 278, NULL }, - { "Nacute", 722, NULL }, - { "quotedbl", 474, NULL }, - { "gcommaaccent", 611, NULL }, - { "mu", 611, NULL }, - { "greaterequal", 549, NULL }, - { "Scaron", 667, NULL }, - { "Lslash", 611, NULL }, - { "semicolon", 333, NULL }, - { "oslash", 611, NULL }, - { "lessequal", 549, NULL }, - { "lozenge", 494, NULL }, - { "parenright", 333, NULL }, - { "ccaron", 556, NULL }, - { "Ecircumflex", 667, NULL }, - { "gbreve", 611, NULL }, - { "trademark", 1000, NULL }, - { "daggerdbl", 556, NULL }, - { "nacute", 611, NULL }, - { "macron", 333, NULL }, - { "Otilde", 778, NULL }, - { "Emacron", 667, NULL }, - { "ellipsis", 1000, NULL }, - { "scaron", 556, NULL }, - { "AE", 1000, NULL }, - { "Ucircumflex", 722, NULL }, - { "lslash", 278, NULL }, - { "quotedblleft", 500, NULL }, - { "guilsinglright", 333, NULL }, - { "hyphen", 333, NULL }, - { "quotesingle", 238, NULL }, - { "eight", 556, NULL }, - { "exclamdown", 333, NULL }, - { "endash", 556, NULL }, - { "oe", 944, NULL }, - { "Abreve", 722, NULL }, - { "Umacron", 722, NULL }, - { "ecircumflex", 556, NULL }, - { "Adieresis", 722, NULL }, - { "copyright", 737, NULL }, - { "Egrave", 667, NULL }, - { "slash", 278, NULL }, - { "Edieresis", 667, NULL }, - { "otilde", 611, NULL }, - { "Idieresis", 278, NULL }, - { "parenleft", 333, NULL }, - { "one", 556, NULL }, - { "emacron", 556, NULL }, - { "Odieresis", 778, NULL }, - { "ucircumflex", 611, NULL }, - { "bracketleft", 333, NULL }, - { "Ugrave", 722, NULL }, - { "quoteright", 278, NULL }, - { "Udieresis", 722, NULL }, - { "perthousand", 1000, NULL }, - { "Ydieresis", 667, NULL }, - { "umacron", 611, NULL }, - { "abreve", 556, NULL }, - { "Eacute", 667, NULL }, - { "adieresis", 556, NULL }, - { "egrave", 556, NULL }, - { "edieresis", 556, NULL }, - { "idieresis", 278, NULL }, - { "Eth", 722, NULL }, - { "ae", 889, NULL }, - { "asterisk", 389, NULL }, - { "odieresis", 611, NULL }, - { "Uacute", 722, NULL }, - { "ugrave", 611, NULL }, - { "nine", 556, NULL }, - { "five", 556, NULL }, - { "udieresis", 611, NULL }, - { "Zcaron", 611, NULL }, - { "Scommaaccent", 667, NULL }, - { "threequarters", 834, NULL }, - { "guillemotright", 556, NULL }, - { "Ccedilla", 722, NULL }, - { "ydieresis", 556, NULL }, - { "tilde", 333, NULL }, - { "dbldaggerumlaut", 556, NULL }, - { "at", 975, NULL }, - { "eacute", 556, NULL }, - { "underscore", 556, NULL }, - { "Euro", 556, NULL }, - { "Dcroat", 722, NULL }, - { "multiply", 584, NULL }, - { "zero", 556, NULL }, - { "eth", 611, NULL }, - { "Scedilla", 667, NULL }, - { "Ograve", 778, NULL }, - { "Racute", 722, NULL }, - { "partialdiff", 494, NULL }, - { "uacute", 611, NULL }, - { "braceleft", 389, NULL }, - { "Thorn", 667, NULL }, - { "zcaron", 500, NULL }, - { "scommaaccent", 556, NULL }, - { "ccedilla", 556, NULL }, - { "Dcaron", 722, NULL }, - { "dcroat", 611, NULL }, - { "Ocircumflex", 778, NULL }, - { "Oacute", 778, NULL }, - { "scedilla", 556, NULL }, - { "ogonek", 333, NULL }, - { "ograve", 611, NULL }, - { "racute", 389, NULL }, - { "Tcaron", 611, NULL }, - { "Eogonek", 667, NULL }, - { "thorn", 611, NULL }, - { "degree", 400, NULL }, - { "registered", 737, NULL }, - { "radical", 549, NULL }, - { "Aring", 722, NULL }, - { "percent", 889, NULL }, - { "six", 556, NULL }, - { "paragraph", 556, NULL }, - { "dcaron", 743, NULL }, - { "Uogonek", 722, NULL }, - { "two", 556, NULL }, - { "summation", 600, NULL }, - { "Igrave", 278, NULL }, - { "Lacute", 611, NULL }, - { "ocircumflex", 611, NULL }, - { "oacute", 611, NULL }, - { "Uring", 722, NULL }, - { "Lcommaaccent", 611, NULL }, - { "tcaron", 389, NULL }, - { "eogonek", 556, NULL }, - { "Delta", 612, NULL }, - { "Ohungarumlaut", 778, NULL }, - { "asciicircum", 584, NULL }, - { "aring", 556, NULL }, - { "grave", 333, NULL }, - { "uogonek", 611, NULL }, - { "bracketright", 333, NULL }, - { "Iacute", 278, NULL }, - { "ampersand", 722, NULL }, - { "igrave", 278, NULL }, - { "lacute", 278, NULL }, - { "Ncaron", 722, NULL }, - { "plus", 584, NULL }, - { "uring", 611, NULL }, - { "quotesinglbase", 278, NULL }, - { "lcommaaccent", 278, NULL }, - { "Yacute", 667, NULL }, - { "ohungarumlaut", 611, NULL }, - { "threesuperior", 333, NULL }, - { "acute", 333, NULL }, - { "section", 556, NULL }, - { "dieresis", 333, NULL }, - { "iacute", 278, NULL }, - { "quotedblbase", 500, NULL }, - { "ncaron", 611, NULL }, - { "florin", 556, NULL }, - { "yacute", 556, NULL }, - { "Rcommaaccent", 722, NULL }, - { "fi", 611, NULL }, - { "fl", 611, NULL }, - { "Acircumflex", 722, NULL }, - { "Cacute", 722, NULL }, - { "Icircumflex", 278, NULL }, - { "guillemotleft", 556, NULL }, - { "germandbls", 611, NULL }, - { "Amacron", 722, NULL }, - { "seven", 556, NULL }, - { "Sacute", 667, NULL }, - { "ordmasculine", 365, NULL }, - { "dotlessi", 278, NULL }, - { "sterling", 556, NULL }, - { "notequal", 549, NULL }, - { "Imacron", 278, NULL }, - { "rcommaaccent", 389, NULL }, - { "Zdotaccent", 611, NULL }, - { "acircumflex", 556, NULL }, - { "cacute", 556, NULL }, - { "Ecaron", 667, NULL }, - { "icircumflex", 278, NULL }, - { "braceright", 389, NULL }, - { "quotedblright", 500, NULL }, - { "amacron", 556, NULL }, - { "sacute", 556, NULL }, - { "imacron", 278, NULL }, - { "cent", 556, NULL }, - { "currency", 556, NULL }, - { "logicalnot", 584, NULL }, - { "zdotaccent", 500, NULL }, - { "Atilde", 722, NULL }, - { "breve", 333, NULL }, - { "bar", 280, NULL }, - { "fraction", 167, NULL }, - { "less", 584, NULL }, - { "ecaron", 556, NULL }, - { "guilsinglleft", 333, NULL }, - { "exclam", 333, NULL }, - { "period", 278, NULL }, - { "Rcaron", 722, NULL }, - { "Kcommaaccent", 722, NULL }, - { "greater", 584, NULL }, - { "atilde", 556, NULL }, - { "brokenbar", 280, NULL }, - { "quoteleft", 278, NULL }, - { "Edotaccent", 667, NULL }, - { "onesuperior", 333, NULL } -}; - -static BuiltinFontWidth helveticaBoldObliqueWidthsTab[] = { - { "Ntilde", 722, NULL }, - { "rcaron", 389, NULL }, - { "kcommaaccent", 556, NULL }, - { "Ncommaaccent", 722, NULL }, - { "Zacute", 611, NULL }, - { "comma", 278, NULL }, - { "cedilla", 333, NULL }, - { "plusminus", 584, NULL }, - { "circumflex", 333, NULL }, - { "dotaccent", 333, NULL }, - { "edotaccent", 556, NULL }, - { "asciitilde", 584, NULL }, - { "colon", 333, NULL }, - { "onehalf", 834, NULL }, - { "dollar", 556, NULL }, - { "Lcaron", 611, NULL }, - { "ntilde", 611, NULL }, - { "Aogonek", 722, NULL }, - { "ncommaaccent", 611, NULL }, - { "minus", 584, NULL }, - { "Iogonek", 278, NULL }, - { "zacute", 500, NULL }, - { "yen", 556, NULL }, - { "space", 278, NULL }, - { "Omacron", 778, NULL }, - { "questiondown", 611, NULL }, - { "emdash", 1000, NULL }, - { "Agrave", 722, NULL }, - { "three", 556, NULL }, - { "numbersign", 556, NULL }, - { "lcaron", 400, NULL }, - { "A", 722, NULL }, - { "B", 722, NULL }, - { "C", 722, NULL }, - { "aogonek", 556, NULL }, - { "D", 722, NULL }, - { "E", 667, NULL }, - { "onequarter", 834, NULL }, - { "F", 611, NULL }, - { "G", 778, NULL }, - { "H", 722, NULL }, - { "I", 278, NULL }, - { "J", 556, NULL }, - { "K", 722, NULL }, - { "iogonek", 278, NULL }, - { "backslash", 278, NULL }, - { "L", 611, NULL }, - { "periodcentered", 278, NULL }, - { "M", 833, NULL }, - { "N", 722, NULL }, - { "omacron", 611, NULL }, - { "Tcommaaccent", 611, NULL }, - { "O", 778, NULL }, - { "P", 667, NULL }, - { "Q", 778, NULL }, - { "Uhungarumlaut", 722, NULL }, - { "R", 722, NULL }, - { "Aacute", 722, NULL }, - { "caron", 333, NULL }, - { "S", 667, NULL }, - { "T", 611, NULL }, - { "U", 722, NULL }, - { "agrave", 556, NULL }, - { "V", 667, NULL }, - { "W", 944, NULL }, - { "X", 667, NULL }, - { "question", 611, NULL }, - { "equal", 584, NULL }, - { "Y", 667, NULL }, - { "Z", 611, NULL }, - { "four", 556, NULL }, - { "a", 556, NULL }, - { "Gcommaaccent", 778, NULL }, - { "b", 611, NULL }, - { "c", 556, NULL }, - { "d", 611, NULL }, - { "e", 556, NULL }, - { "f", 333, NULL }, - { "g", 611, NULL }, - { "bullet", 350, NULL }, - { "h", 611, NULL }, - { "i", 278, NULL }, - { "Oslash", 778, NULL }, - { "dagger", 556, NULL }, - { "j", 278, NULL }, - { "k", 556, NULL }, - { "l", 278, NULL }, - { "m", 889, NULL }, - { "n", 611, NULL }, - { "tcommaaccent", 333, NULL }, - { "o", 611, NULL }, - { "ordfeminine", 370, NULL }, - { "ring", 333, NULL }, - { "p", 611, NULL }, - { "q", 611, NULL }, - { "uhungarumlaut", 611, NULL }, - { "r", 389, NULL }, - { "twosuperior", 333, NULL }, - { "aacute", 556, NULL }, - { "s", 556, NULL }, - { "OE", 1000, NULL }, - { "t", 333, NULL }, - { "divide", 584, NULL }, - { "u", 611, NULL }, - { "Ccaron", 722, NULL }, - { "v", 556, NULL }, - { "w", 778, NULL }, - { "x", 556, NULL }, - { "y", 556, NULL }, - { "z", 500, NULL }, - { "Gbreve", 778, NULL }, - { "commaaccent", 250, NULL }, - { "hungarumlaut", 333, NULL }, - { "Idotaccent", 278, NULL }, - { "Nacute", 722, NULL }, - { "quotedbl", 474, NULL }, - { "gcommaaccent", 611, NULL }, - { "mu", 611, NULL }, - { "greaterequal", 549, NULL }, - { "Scaron", 667, NULL }, - { "Lslash", 611, NULL }, - { "semicolon", 333, NULL }, - { "oslash", 611, NULL }, - { "lessequal", 549, NULL }, - { "lozenge", 494, NULL }, - { "parenright", 333, NULL }, - { "ccaron", 556, NULL }, - { "Ecircumflex", 667, NULL }, - { "gbreve", 611, NULL }, - { "trademark", 1000, NULL }, - { "daggerdbl", 556, NULL }, - { "nacute", 611, NULL }, - { "macron", 333, NULL }, - { "Otilde", 778, NULL }, - { "Emacron", 667, NULL }, - { "ellipsis", 1000, NULL }, - { "scaron", 556, NULL }, - { "AE", 1000, NULL }, - { "Ucircumflex", 722, NULL }, - { "lslash", 278, NULL }, - { "quotedblleft", 500, NULL }, - { "guilsinglright", 333, NULL }, - { "hyphen", 333, NULL }, - { "quotesingle", 238, NULL }, - { "eight", 556, NULL }, - { "exclamdown", 333, NULL }, - { "endash", 556, NULL }, - { "oe", 944, NULL }, - { "Abreve", 722, NULL }, - { "Umacron", 722, NULL }, - { "ecircumflex", 556, NULL }, - { "Adieresis", 722, NULL }, - { "copyright", 737, NULL }, - { "Egrave", 667, NULL }, - { "slash", 278, NULL }, - { "Edieresis", 667, NULL }, - { "otilde", 611, NULL }, - { "Idieresis", 278, NULL }, - { "parenleft", 333, NULL }, - { "one", 556, NULL }, - { "emacron", 556, NULL }, - { "Odieresis", 778, NULL }, - { "ucircumflex", 611, NULL }, - { "bracketleft", 333, NULL }, - { "Ugrave", 722, NULL }, - { "quoteright", 278, NULL }, - { "Udieresis", 722, NULL }, - { "perthousand", 1000, NULL }, - { "Ydieresis", 667, NULL }, - { "umacron", 611, NULL }, - { "abreve", 556, NULL }, - { "Eacute", 667, NULL }, - { "adieresis", 556, NULL }, - { "egrave", 556, NULL }, - { "edieresis", 556, NULL }, - { "idieresis", 278, NULL }, - { "Eth", 722, NULL }, - { "ae", 889, NULL }, - { "asterisk", 389, NULL }, - { "odieresis", 611, NULL }, - { "Uacute", 722, NULL }, - { "ugrave", 611, NULL }, - { "nine", 556, NULL }, - { "five", 556, NULL }, - { "udieresis", 611, NULL }, - { "Zcaron", 611, NULL }, - { "Scommaaccent", 667, NULL }, - { "threequarters", 834, NULL }, - { "guillemotright", 556, NULL }, - { "Ccedilla", 722, NULL }, - { "ydieresis", 556, NULL }, - { "tilde", 333, NULL }, - { "at", 975, NULL }, - { "eacute", 556, NULL }, - { "underscore", 556, NULL }, - { "Euro", 556, NULL }, - { "Dcroat", 722, NULL }, - { "multiply", 584, NULL }, - { "zero", 556, NULL }, - { "eth", 611, NULL }, - { "Scedilla", 667, NULL }, - { "Ograve", 778, NULL }, - { "Racute", 722, NULL }, - { "partialdiff", 494, NULL }, - { "uacute", 611, NULL }, - { "braceleft", 389, NULL }, - { "Thorn", 667, NULL }, - { "zcaron", 500, NULL }, - { "scommaaccent", 556, NULL }, - { "ccedilla", 556, NULL }, - { "Dcaron", 722, NULL }, - { "dcroat", 611, NULL }, - { "Ocircumflex", 778, NULL }, - { "Oacute", 778, NULL }, - { "scedilla", 556, NULL }, - { "ogonek", 333, NULL }, - { "ograve", 611, NULL }, - { "racute", 389, NULL }, - { "Tcaron", 611, NULL }, - { "Eogonek", 667, NULL }, - { "thorn", 611, NULL }, - { "degree", 400, NULL }, - { "registered", 737, NULL }, - { "radical", 549, NULL }, - { "Aring", 722, NULL }, - { "percent", 889, NULL }, - { "six", 556, NULL }, - { "paragraph", 556, NULL }, - { "dcaron", 743, NULL }, - { "Uogonek", 722, NULL }, - { "two", 556, NULL }, - { "summation", 600, NULL }, - { "Igrave", 278, NULL }, - { "Lacute", 611, NULL }, - { "ocircumflex", 611, NULL }, - { "oacute", 611, NULL }, - { "Uring", 722, NULL }, - { "Lcommaaccent", 611, NULL }, - { "tcaron", 389, NULL }, - { "eogonek", 556, NULL }, - { "Delta", 612, NULL }, - { "Ohungarumlaut", 778, NULL }, - { "asciicircum", 584, NULL }, - { "aring", 556, NULL }, - { "grave", 333, NULL }, - { "uogonek", 611, NULL }, - { "bracketright", 333, NULL }, - { "Iacute", 278, NULL }, - { "ampersand", 722, NULL }, - { "igrave", 278, NULL }, - { "lacute", 278, NULL }, - { "Ncaron", 722, NULL }, - { "plus", 584, NULL }, - { "uring", 611, NULL }, - { "quotesinglbase", 278, NULL }, - { "lcommaaccent", 278, NULL }, - { "Yacute", 667, NULL }, - { "ohungarumlaut", 611, NULL }, - { "threesuperior", 333, NULL }, - { "acute", 333, NULL }, - { "section", 556, NULL }, - { "dieresis", 333, NULL }, - { "iacute", 278, NULL }, - { "quotedblbase", 500, NULL }, - { "ncaron", 611, NULL }, - { "florin", 556, NULL }, - { "yacute", 556, NULL }, - { "Rcommaaccent", 722, NULL }, - { "fi", 611, NULL }, - { "fl", 611, NULL }, - { "Acircumflex", 722, NULL }, - { "Cacute", 722, NULL }, - { "Icircumflex", 278, NULL }, - { "guillemotleft", 556, NULL }, - { "germandbls", 611, NULL }, - { "Amacron", 722, NULL }, - { "seven", 556, NULL }, - { "Sacute", 667, NULL }, - { "ordmasculine", 365, NULL }, - { "dotlessi", 278, NULL }, - { "sterling", 556, NULL }, - { "notequal", 549, NULL }, - { "Imacron", 278, NULL }, - { "rcommaaccent", 389, NULL }, - { "Zdotaccent", 611, NULL }, - { "acircumflex", 556, NULL }, - { "cacute", 556, NULL }, - { "Ecaron", 667, NULL }, - { "icircumflex", 278, NULL }, - { "braceright", 389, NULL }, - { "quotedblright", 500, NULL }, - { "amacron", 556, NULL }, - { "sacute", 556, NULL }, - { "imacron", 278, NULL }, - { "cent", 556, NULL }, - { "currency", 556, NULL }, - { "logicalnot", 584, NULL }, - { "zdotaccent", 500, NULL }, - { "Atilde", 722, NULL }, - { "breve", 333, NULL }, - { "bar", 280, NULL }, - { "fraction", 167, NULL }, - { "less", 584, NULL }, - { "ecaron", 556, NULL }, - { "guilsinglleft", 333, NULL }, - { "exclam", 333, NULL }, - { "period", 278, NULL }, - { "Rcaron", 722, NULL }, - { "Kcommaaccent", 722, NULL }, - { "greater", 584, NULL }, - { "atilde", 556, NULL }, - { "brokenbar", 280, NULL }, - { "quoteleft", 278, NULL }, - { "Edotaccent", 667, NULL }, - { "onesuperior", 333, NULL } -}; - -static BuiltinFontWidth helveticaObliqueWidthsTab[] = { - { "Ntilde", 722, NULL }, - { "rcaron", 333, NULL }, - { "kcommaaccent", 500, NULL }, - { "Ncommaaccent", 722, NULL }, - { "Zacute", 611, NULL }, - { "comma", 278, NULL }, - { "cedilla", 333, NULL }, - { "plusminus", 584, NULL }, - { "circumflex", 333, NULL }, - { "dotaccent", 333, NULL }, - { "edotaccent", 556, NULL }, - { "asciitilde", 584, NULL }, - { "colon", 278, NULL }, - { "onehalf", 834, NULL }, - { "dollar", 556, NULL }, - { "Lcaron", 556, NULL }, - { "ntilde", 556, NULL }, - { "Aogonek", 667, NULL }, - { "ncommaaccent", 556, NULL }, - { "minus", 584, NULL }, - { "Iogonek", 278, NULL }, - { "zacute", 500, NULL }, - { "yen", 556, NULL }, - { "space", 278, NULL }, - { "Omacron", 778, NULL }, - { "questiondown", 611, NULL }, - { "emdash", 1000, NULL }, - { "Agrave", 667, NULL }, - { "three", 556, NULL }, - { "numbersign", 556, NULL }, - { "lcaron", 299, NULL }, - { "A", 667, NULL }, - { "B", 667, NULL }, - { "C", 722, NULL }, - { "aogonek", 556, NULL }, - { "D", 722, NULL }, - { "E", 667, NULL }, - { "onequarter", 834, NULL }, - { "F", 611, NULL }, - { "G", 778, NULL }, - { "H", 722, NULL }, - { "I", 278, NULL }, - { "J", 500, NULL }, - { "K", 667, NULL }, - { "iogonek", 222, NULL }, - { "backslash", 278, NULL }, - { "L", 556, NULL }, - { "periodcentered", 278, NULL }, - { "M", 833, NULL }, - { "N", 722, NULL }, - { "omacron", 556, NULL }, - { "Tcommaaccent", 611, NULL }, - { "O", 778, NULL }, - { "P", 667, NULL }, - { "Q", 778, NULL }, - { "Uhungarumlaut", 722, NULL }, - { "R", 722, NULL }, - { "Aacute", 667, NULL }, - { "caron", 333, NULL }, - { "S", 667, NULL }, - { "T", 611, NULL }, - { "U", 722, NULL }, - { "agrave", 556, NULL }, - { "V", 667, NULL }, - { "W", 944, NULL }, - { "X", 667, NULL }, - { "question", 556, NULL }, - { "equal", 584, NULL }, - { "Y", 667, NULL }, - { "Z", 611, NULL }, - { "four", 556, NULL }, - { "a", 556, NULL }, - { "Gcommaaccent", 778, NULL }, - { "b", 556, NULL }, - { "c", 500, NULL }, - { "d", 556, NULL }, - { "e", 556, NULL }, - { "f", 278, NULL }, - { "g", 556, NULL }, - { "bullet", 350, NULL }, - { "h", 556, NULL }, - { "i", 222, NULL }, - { "Oslash", 778, NULL }, - { "dagger", 556, NULL }, - { "j", 222, NULL }, - { "k", 500, NULL }, - { "l", 222, NULL }, - { "m", 833, NULL }, - { "n", 556, NULL }, - { "tcommaaccent", 278, NULL }, - { "o", 556, NULL }, - { "ordfeminine", 370, NULL }, - { "ring", 333, NULL }, - { "p", 556, NULL }, - { "q", 556, NULL }, - { "uhungarumlaut", 556, NULL }, - { "r", 333, NULL }, - { "twosuperior", 333, NULL }, - { "aacute", 556, NULL }, - { "s", 500, NULL }, - { "OE", 1000, NULL }, - { "t", 278, NULL }, - { "divide", 584, NULL }, - { "u", 556, NULL }, - { "Ccaron", 722, NULL }, - { "v", 500, NULL }, - { "w", 722, NULL }, - { "x", 500, NULL }, - { "y", 500, NULL }, - { "z", 500, NULL }, - { "Gbreve", 778, NULL }, - { "commaaccent", 250, NULL }, - { "hungarumlaut", 333, NULL }, - { "Idotaccent", 278, NULL }, - { "Nacute", 722, NULL }, - { "quotedbl", 355, NULL }, - { "gcommaaccent", 556, NULL }, - { "mu", 556, NULL }, - { "greaterequal", 549, NULL }, - { "Scaron", 667, NULL }, - { "Lslash", 556, NULL }, - { "semicolon", 278, NULL }, - { "oslash", 611, NULL }, - { "lessequal", 549, NULL }, - { "lozenge", 471, NULL }, - { "parenright", 333, NULL }, - { "ccaron", 500, NULL }, - { "Ecircumflex", 667, NULL }, - { "gbreve", 556, NULL }, - { "trademark", 1000, NULL }, - { "daggerdbl", 556, NULL }, - { "nacute", 556, NULL }, - { "macron", 333, NULL }, - { "Otilde", 778, NULL }, - { "Emacron", 667, NULL }, - { "ellipsis", 1000, NULL }, - { "scaron", 500, NULL }, - { "AE", 1000, NULL }, - { "Ucircumflex", 722, NULL }, - { "lslash", 222, NULL }, - { "quotedblleft", 333, NULL }, - { "guilsinglright", 333, NULL }, - { "hyphen", 333, NULL }, - { "quotesingle", 191, NULL }, - { "eight", 556, NULL }, - { "exclamdown", 333, NULL }, - { "endash", 556, NULL }, - { "oe", 944, NULL }, - { "Abreve", 667, NULL }, - { "Umacron", 722, NULL }, - { "ecircumflex", 556, NULL }, - { "Adieresis", 667, NULL }, - { "copyright", 737, NULL }, - { "Egrave", 667, NULL }, - { "slash", 278, NULL }, - { "Edieresis", 667, NULL }, - { "otilde", 556, NULL }, - { "Idieresis", 278, NULL }, - { "parenleft", 333, NULL }, - { "one", 556, NULL }, - { "emacron", 556, NULL }, - { "Odieresis", 778, NULL }, - { "ucircumflex", 556, NULL }, - { "bracketleft", 278, NULL }, - { "Ugrave", 722, NULL }, - { "quoteright", 222, NULL }, - { "Udieresis", 722, NULL }, - { "perthousand", 1000, NULL }, - { "Ydieresis", 667, NULL }, - { "umacron", 556, NULL }, - { "abreve", 556, NULL }, - { "Eacute", 667, NULL }, - { "adieresis", 556, NULL }, - { "egrave", 556, NULL }, - { "edieresis", 556, NULL }, - { "idieresis", 278, NULL }, - { "Eth", 722, NULL }, - { "ae", 889, NULL }, - { "asterisk", 389, NULL }, - { "odieresis", 556, NULL }, - { "Uacute", 722, NULL }, - { "ugrave", 556, NULL }, - { "nine", 556, NULL }, - { "five", 556, NULL }, - { "udieresis", 556, NULL }, - { "Zcaron", 611, NULL }, - { "Scommaaccent", 667, NULL }, - { "threequarters", 834, NULL }, - { "guillemotright", 556, NULL }, - { "Ccedilla", 722, NULL }, - { "ydieresis", 500, NULL }, - { "tilde", 333, NULL }, - { "at", 1015, NULL }, - { "eacute", 556, NULL }, - { "underscore", 556, NULL }, - { "Euro", 556, NULL }, - { "Dcroat", 722, NULL }, - { "multiply", 584, NULL }, - { "zero", 556, NULL }, - { "eth", 556, NULL }, - { "Scedilla", 667, NULL }, - { "Ograve", 778, NULL }, - { "Racute", 722, NULL }, - { "partialdiff", 476, NULL }, - { "uacute", 556, NULL }, - { "braceleft", 334, NULL }, - { "Thorn", 667, NULL }, - { "zcaron", 500, NULL }, - { "scommaaccent", 500, NULL }, - { "ccedilla", 500, NULL }, - { "Dcaron", 722, NULL }, - { "dcroat", 556, NULL }, - { "Ocircumflex", 778, NULL }, - { "Oacute", 778, NULL }, - { "scedilla", 500, NULL }, - { "ogonek", 333, NULL }, - { "ograve", 556, NULL }, - { "racute", 333, NULL }, - { "Tcaron", 611, NULL }, - { "Eogonek", 667, NULL }, - { "thorn", 556, NULL }, - { "degree", 400, NULL }, - { "registered", 737, NULL }, - { "radical", 453, NULL }, - { "Aring", 667, NULL }, - { "percent", 889, NULL }, - { "six", 556, NULL }, - { "paragraph", 537, NULL }, - { "dcaron", 643, NULL }, - { "Uogonek", 722, NULL }, - { "two", 556, NULL }, - { "summation", 600, NULL }, - { "Igrave", 278, NULL }, - { "Lacute", 556, NULL }, - { "ocircumflex", 556, NULL }, - { "oacute", 556, NULL }, - { "Uring", 722, NULL }, - { "Lcommaaccent", 556, NULL }, - { "tcaron", 317, NULL }, - { "eogonek", 556, NULL }, - { "Delta", 612, NULL }, - { "Ohungarumlaut", 778, NULL }, - { "asciicircum", 469, NULL }, - { "aring", 556, NULL }, - { "grave", 333, NULL }, - { "uogonek", 556, NULL }, - { "bracketright", 278, NULL }, - { "Iacute", 278, NULL }, - { "ampersand", 667, NULL }, - { "igrave", 278, NULL }, - { "lacute", 222, NULL }, - { "Ncaron", 722, NULL }, - { "plus", 584, NULL }, - { "uring", 556, NULL }, - { "quotesinglbase", 222, NULL }, - { "lcommaaccent", 222, NULL }, - { "Yacute", 667, NULL }, - { "ohungarumlaut", 556, NULL }, - { "threesuperior", 333, NULL }, - { "acute", 333, NULL }, - { "section", 556, NULL }, - { "dieresis", 333, NULL }, - { "iacute", 278, NULL }, - { "quotedblbase", 333, NULL }, - { "ncaron", 556, NULL }, - { "florin", 556, NULL }, - { "yacute", 500, NULL }, - { "Rcommaaccent", 722, NULL }, - { "fi", 500, NULL }, - { "fl", 500, NULL }, - { "Acircumflex", 667, NULL }, - { "Cacute", 722, NULL }, - { "Icircumflex", 278, NULL }, - { "guillemotleft", 556, NULL }, - { "germandbls", 611, NULL }, - { "Amacron", 667, NULL }, - { "seven", 556, NULL }, - { "Sacute", 667, NULL }, - { "ordmasculine", 365, NULL }, - { "dotlessi", 278, NULL }, - { "sterling", 556, NULL }, - { "notequal", 549, NULL }, - { "Imacron", 278, NULL }, - { "rcommaaccent", 333, NULL }, - { "Zdotaccent", 611, NULL }, - { "acircumflex", 556, NULL }, - { "cacute", 500, NULL }, - { "Ecaron", 667, NULL }, - { "icircumflex", 278, NULL }, - { "braceright", 334, NULL }, - { "quotedblright", 333, NULL }, - { "amacron", 556, NULL }, - { "sacute", 500, NULL }, - { "imacron", 278, NULL }, - { "cent", 556, NULL }, - { "currency", 556, NULL }, - { "logicalnot", 584, NULL }, - { "zdotaccent", 500, NULL }, - { "Atilde", 667, NULL }, - { "breve", 333, NULL }, - { "bar", 260, NULL }, - { "fraction", 167, NULL }, - { "less", 584, NULL }, - { "ecaron", 556, NULL }, - { "guilsinglleft", 333, NULL }, - { "exclam", 278, NULL }, - { "period", 278, NULL }, - { "Rcaron", 722, NULL }, - { "Kcommaaccent", 667, NULL }, - { "greater", 584, NULL }, - { "atilde", 556, NULL }, - { "brokenbar", 260, NULL }, - { "quoteleft", 222, NULL }, - { "Edotaccent", 667, NULL }, - { "onesuperior", 333, NULL } -}; - -static BuiltinFontWidth symbolWidthsTab[] = { - { "bracketleftex", 384, NULL }, - { "alpha", 631, NULL }, - { "union", 768, NULL }, - { "infinity", 713, NULL }, - { "comma", 250, NULL }, - { "copyrightsans", 790, NULL }, - { "plusminus", 549, NULL }, - { "arrowup", 603, NULL }, - { "apple", 790, NULL }, - { "parenleftbt", 384, NULL }, - { "notelement", 713, NULL }, - { "colon", 278, NULL }, - { "beta", 549, NULL }, - { "braceleftbt", 494, NULL }, - { "Lambda", 686, NULL }, - { "Phi", 763, NULL }, - { "minus", 549, NULL }, - { "space", 250, NULL }, - { "Sigma", 592, NULL }, - { "approxequal", 549, NULL }, - { "minute", 247, NULL }, - { "circleplus", 768, NULL }, - { "Omicron", 722, NULL }, - { "three", 500, NULL }, - { "numbersign", 500, NULL }, - { "lambda", 549, NULL }, - { "phi", 521, NULL }, - { "aleph", 823, NULL }, - { "Tau", 611, NULL }, - { "spade", 753, NULL }, - { "logicaland", 603, NULL }, - { "sigma", 603, NULL }, - { "propersuperset", 713, NULL }, - { "omicron", 549, NULL }, - { "question", 444, NULL }, - { "equal", 549, NULL }, - { "Epsilon", 611, NULL }, - { "emptyset", 823, NULL }, - { "diamond", 753, NULL }, - { "four", 500, NULL }, - { "Mu", 889, NULL }, - { "parenlefttp", 384, NULL }, - { "club", 753, NULL }, - { "bullet", 460, NULL }, - { "Omega", 768, NULL }, - { "tau", 439, NULL }, - { "Upsilon", 690, NULL }, - { "bracelefttp", 494, NULL }, - { "heart", 753, NULL }, - { "divide", 549, NULL }, - { "epsilon", 439, NULL }, - { "logicalor", 603, NULL }, - { "parenleftex", 384, NULL }, - { "greaterequal", 549, NULL }, - { "mu", 576, NULL }, - { "Nu", 722, NULL }, - { "therefore", 863, NULL }, - { "notsubset", 713, NULL }, - { "omega", 686, NULL }, - { "semicolon", 278, NULL }, - { "element", 713, NULL }, - { "upsilon", 576, NULL }, - { "existential", 549, NULL }, - { "integralbt", 686, NULL }, - { "lessequal", 549, NULL }, - { "phi1", 603, NULL }, - { "lozenge", 494, NULL }, - { "trademarkserif", 890, NULL }, - { "parenright", 333, NULL }, - { "reflexsuperset", 713, NULL }, - { "sigma1", 439, NULL }, - { "nu", 521, NULL }, - { "Gamma", 603, NULL }, - { "angleright", 329, NULL }, - { "ellipsis", 1000, NULL }, - { "Rho", 556, NULL }, - { "parenrightbt", 384, NULL }, - { "radicalex", 500, NULL }, - { "eight", 500, NULL }, - { "angleleft", 329, NULL }, - { "arrowdbldown", 603, NULL }, - { "congruent", 549, NULL }, - { "Theta", 741, NULL }, - { "intersection", 768, NULL }, - { "Pi", 768, NULL }, - { "slash", 278, NULL }, - { "registerserif", 790, NULL }, - { "parenleft", 333, NULL }, - { "one", 500, NULL }, - { "gamma", 411, NULL }, - { "bracketleft", 333, NULL }, - { "rho", 549, NULL }, - { "circlemultiply", 768, NULL }, - { "Chi", 722, NULL }, - { "theta", 521, NULL }, - { "pi", 549, NULL }, - { "integraltp", 686, NULL }, - { "Eta", 722, NULL }, - { "product", 823, NULL }, - { "nine", 500, NULL }, - { "five", 500, NULL }, - { "propersubset", 713, NULL }, - { "bracketrightbt", 384, NULL }, - { "trademarksans", 786, NULL }, - { "dotmath", 250, NULL }, - { "integralex", 686, NULL }, - { "chi", 549, NULL }, - { "parenrighttp", 384, NULL }, - { "eta", 603, NULL }, - { "underscore", 500, NULL }, - { "Euro", 750, NULL }, - { "multiply", 549, NULL }, - { "zero", 500, NULL }, - { "partialdiff", 494, NULL }, - { "angle", 768, NULL }, - { "arrowdblleft", 987, NULL }, - { "braceleft", 480, NULL }, - { "parenrightex", 384, NULL }, - { "Rfraktur", 795, NULL }, - { "Zeta", 611, NULL }, - { "braceex", 494, NULL }, - { "arrowdblup", 603, NULL }, - { "arrowdown", 603, NULL }, - { "Ifraktur", 686, NULL }, - { "degree", 400, NULL }, - { "Iota", 333, NULL }, - { "perpendicular", 658, NULL }, - { "radical", 549, NULL }, - { "asteriskmath", 500, NULL }, - { "percent", 833, NULL }, - { "zeta", 494, NULL }, - { "six", 500, NULL }, - { "two", 500, NULL }, - { "weierstrass", 987, NULL }, - { "summation", 713, NULL }, - { "bracketrighttp", 384, NULL }, - { "carriagereturn", 658, NULL }, - { "suchthat", 439, NULL }, - { "arrowvertex", 603, NULL }, - { "Delta", 612, NULL }, - { "iota", 329, NULL }, - { "arrowhorizex", 1000, NULL }, - { "bracketrightex", 384, NULL }, - { "bracketright", 333, NULL }, - { "ampersand", 778, NULL }, - { "plus", 549, NULL }, - { "proportional", 713, NULL }, - { "delta", 494, NULL }, - { "copyrightserif", 790, NULL }, - { "bracerightmid", 494, NULL }, - { "arrowleft", 987, NULL }, - { "second", 411, NULL }, - { "arrowdblboth", 1042, NULL }, - { "florin", 500, NULL }, - { "Psi", 795, NULL }, - { "bracerightbt", 494, NULL }, - { "bracketleftbt", 384, NULL }, - { "seven", 500, NULL }, - { "braceleftmid", 494, NULL }, - { "notequal", 549, NULL }, - { "psi", 686, NULL }, - { "equivalence", 549, NULL }, - { "universal", 713, NULL }, - { "arrowdblright", 987, NULL }, - { "braceright", 480, NULL }, - { "reflexsubset", 713, NULL }, - { "Xi", 645, NULL }, - { "theta1", 631, NULL }, - { "logicalnot", 713, NULL }, - { "Kappa", 722, NULL }, - { "similar", 549, NULL }, - { "bar", 200, NULL }, - { "fraction", 167, NULL }, - { "less", 549, NULL }, - { "registersans", 790, NULL }, - { "omega1", 713, NULL }, - { "exclam", 333, NULL }, - { "Upsilon1", 620, NULL }, - { "bracerighttp", 494, NULL }, - { "xi", 493, NULL }, - { "period", 250, NULL }, - { "Alpha", 722, NULL }, - { "arrowright", 987, NULL }, - { "greater", 549, NULL }, - { "bracketlefttp", 384, NULL }, - { "kappa", 549, NULL }, - { "gradient", 713, NULL }, - { "integral", 274, NULL }, - { "arrowboth", 1042, NULL }, - { "Beta", 667, NULL } -}; - -static BuiltinFontWidth timesBoldWidthsTab[] = { - { "Ntilde", 722, NULL }, - { "rcaron", 444, NULL }, - { "kcommaaccent", 556, NULL }, - { "Ncommaaccent", 722, NULL }, - { "Zacute", 667, NULL }, - { "comma", 250, NULL }, - { "cedilla", 333, NULL }, - { "plusminus", 570, NULL }, - { "circumflex", 333, NULL }, - { "dotaccent", 333, NULL }, - { "edotaccent", 444, NULL }, - { "asciitilde", 520, NULL }, - { "colon", 333, NULL }, - { "onehalf", 750, NULL }, - { "dollar", 500, NULL }, - { "Lcaron", 667, NULL }, - { "ntilde", 556, NULL }, - { "Aogonek", 722, NULL }, - { "ncommaaccent", 556, NULL }, - { "minus", 570, NULL }, - { "Iogonek", 389, NULL }, - { "zacute", 444, NULL }, - { "yen", 500, NULL }, - { "space", 250, NULL }, - { "Omacron", 778, NULL }, - { "questiondown", 500, NULL }, - { "emdash", 1000, NULL }, - { "Agrave", 722, NULL }, - { "three", 500, NULL }, - { "numbersign", 500, NULL }, - { "lcaron", 394, NULL }, - { "A", 722, NULL }, - { "B", 667, NULL }, - { "C", 722, NULL }, - { "aogonek", 500, NULL }, - { "D", 722, NULL }, - { "E", 667, NULL }, - { "onequarter", 750, NULL }, - { "F", 611, NULL }, - { "G", 778, NULL }, - { "H", 778, NULL }, - { "I", 389, NULL }, - { "J", 500, NULL }, - { "K", 778, NULL }, - { "iogonek", 278, NULL }, - { "backslash", 278, NULL }, - { "L", 667, NULL }, - { "periodcentered", 250, NULL }, - { "M", 944, NULL }, - { "N", 722, NULL }, - { "omacron", 500, NULL }, - { "Tcommaaccent", 667, NULL }, - { "O", 778, NULL }, - { "P", 611, NULL }, - { "Q", 778, NULL }, - { "Uhungarumlaut", 722, NULL }, - { "R", 722, NULL }, - { "Aacute", 722, NULL }, - { "caron", 333, NULL }, - { "S", 556, NULL }, - { "T", 667, NULL }, - { "U", 722, NULL }, - { "agrave", 500, NULL }, - { "V", 722, NULL }, - { "W", 1000, NULL }, - { "X", 722, NULL }, - { "question", 500, NULL }, - { "equal", 570, NULL }, - { "Y", 722, NULL }, - { "Z", 667, NULL }, - { "four", 500, NULL }, - { "a", 500, NULL }, - { "Gcommaaccent", 778, NULL }, - { "b", 556, NULL }, - { "c", 444, NULL }, - { "d", 556, NULL }, - { "e", 444, NULL }, - { "f", 333, NULL }, - { "g", 500, NULL }, - { "bullet", 350, NULL }, - { "h", 556, NULL }, - { "i", 278, NULL }, - { "Oslash", 778, NULL }, - { "dagger", 500, NULL }, - { "j", 333, NULL }, - { "k", 556, NULL }, - { "l", 278, NULL }, - { "m", 833, NULL }, - { "n", 556, NULL }, - { "tcommaaccent", 333, NULL }, - { "o", 500, NULL }, - { "ordfeminine", 300, NULL }, - { "ring", 333, NULL }, - { "p", 556, NULL }, - { "q", 556, NULL }, - { "uhungarumlaut", 556, NULL }, - { "r", 444, NULL }, - { "twosuperior", 300, NULL }, - { "aacute", 500, NULL }, - { "s", 389, NULL }, - { "OE", 1000, NULL }, - { "t", 333, NULL }, - { "divide", 570, NULL }, - { "u", 556, NULL }, - { "Ccaron", 722, NULL }, - { "v", 500, NULL }, - { "w", 722, NULL }, - { "x", 500, NULL }, - { "y", 500, NULL }, - { "z", 444, NULL }, - { "Gbreve", 778, NULL }, - { "commaaccent", 250, NULL }, - { "hungarumlaut", 333, NULL }, - { "Idotaccent", 389, NULL }, - { "Nacute", 722, NULL }, - { "quotedbl", 555, NULL }, - { "gcommaaccent", 500, NULL }, - { "mu", 556, NULL }, - { "greaterequal", 549, NULL }, - { "Scaron", 556, NULL }, - { "Lslash", 667, NULL }, - { "semicolon", 333, NULL }, - { "oslash", 500, NULL }, - { "lessequal", 549, NULL }, - { "lozenge", 494, NULL }, - { "parenright", 333, NULL }, - { "ccaron", 444, NULL }, - { "Ecircumflex", 667, NULL }, - { "gbreve", 500, NULL }, - { "trademark", 1000, NULL }, - { "daggerdbl", 500, NULL }, - { "nacute", 556, NULL }, - { "macron", 333, NULL }, - { "Otilde", 778, NULL }, - { "Emacron", 667, NULL }, - { "ellipsis", 1000, NULL }, - { "scaron", 389, NULL }, - { "AE", 1000, NULL }, - { "Ucircumflex", 722, NULL }, - { "lslash", 278, NULL }, - { "quotedblleft", 500, NULL }, - { "guilsinglright", 333, NULL }, - { "hyphen", 333, NULL }, - { "quotesingle", 278, NULL }, - { "eight", 500, NULL }, - { "exclamdown", 333, NULL }, - { "endash", 500, NULL }, - { "oe", 722, NULL }, - { "Abreve", 722, NULL }, - { "Umacron", 722, NULL }, - { "ecircumflex", 444, NULL }, - { "Adieresis", 722, NULL }, - { "copyright", 747, NULL }, - { "Egrave", 667, NULL }, - { "slash", 278, NULL }, - { "Edieresis", 667, NULL }, - { "otilde", 500, NULL }, - { "Idieresis", 389, NULL }, - { "parenleft", 333, NULL }, - { "one", 500, NULL }, - { "emacron", 444, NULL }, - { "Odieresis", 778, NULL }, - { "ucircumflex", 556, NULL }, - { "bracketleft", 333, NULL }, - { "Ugrave", 722, NULL }, - { "quoteright", 333, NULL }, - { "Udieresis", 722, NULL }, - { "perthousand", 1000, NULL }, - { "Ydieresis", 722, NULL }, - { "umacron", 556, NULL }, - { "abreve", 500, NULL }, - { "Eacute", 667, NULL }, - { "adieresis", 500, NULL }, - { "egrave", 444, NULL }, - { "edieresis", 444, NULL }, - { "idieresis", 278, NULL }, - { "Eth", 722, NULL }, - { "ae", 722, NULL }, - { "asterisk", 500, NULL }, - { "odieresis", 500, NULL }, - { "Uacute", 722, NULL }, - { "ugrave", 556, NULL }, - { "nine", 500, NULL }, - { "five", 500, NULL }, - { "udieresis", 556, NULL }, - { "Zcaron", 667, NULL }, - { "Scommaaccent", 556, NULL }, - { "threequarters", 750, NULL }, - { "guillemotright", 500, NULL }, - { "Ccedilla", 722, NULL }, - { "ydieresis", 500, NULL }, - { "tilde", 333, NULL }, - { "at", 930, NULL }, - { "eacute", 444, NULL }, - { "underscore", 500, NULL }, - { "Euro", 500, NULL }, - { "Dcroat", 722, NULL }, - { "multiply", 570, NULL }, - { "zero", 500, NULL }, - { "eth", 500, NULL }, - { "Scedilla", 556, NULL }, - { "Ograve", 778, NULL }, - { "Racute", 722, NULL }, - { "partialdiff", 494, NULL }, - { "uacute", 556, NULL }, - { "braceleft", 394, NULL }, - { "Thorn", 611, NULL }, - { "zcaron", 444, NULL }, - { "scommaaccent", 389, NULL }, - { "ccedilla", 444, NULL }, - { "Dcaron", 722, NULL }, - { "dcroat", 556, NULL }, - { "Ocircumflex", 778, NULL }, - { "Oacute", 778, NULL }, - { "scedilla", 389, NULL }, - { "ogonek", 333, NULL }, - { "ograve", 500, NULL }, - { "racute", 444, NULL }, - { "Tcaron", 667, NULL }, - { "Eogonek", 667, NULL }, - { "thorn", 556, NULL }, - { "degree", 400, NULL }, - { "registered", 747, NULL }, - { "radical", 549, NULL }, - { "Aring", 722, NULL }, - { "percent", 1000, NULL }, - { "six", 500, NULL }, - { "paragraph", 540, NULL }, - { "dcaron", 672, NULL }, - { "Uogonek", 722, NULL }, - { "two", 500, NULL }, - { "summation", 600, NULL }, - { "Igrave", 389, NULL }, - { "Lacute", 667, NULL }, - { "ocircumflex", 500, NULL }, - { "oacute", 500, NULL }, - { "Uring", 722, NULL }, - { "Lcommaaccent", 667, NULL }, - { "tcaron", 416, NULL }, - { "eogonek", 444, NULL }, - { "Delta", 612, NULL }, - { "Ohungarumlaut", 778, NULL }, - { "asciicircum", 581, NULL }, - { "aring", 500, NULL }, - { "grave", 333, NULL }, - { "uogonek", 556, NULL }, - { "bracketright", 333, NULL }, - { "Iacute", 389, NULL }, - { "ampersand", 833, NULL }, - { "igrave", 278, NULL }, - { "lacute", 278, NULL }, - { "Ncaron", 722, NULL }, - { "plus", 570, NULL }, - { "uring", 556, NULL }, - { "quotesinglbase", 333, NULL }, - { "lcommaaccent", 278, NULL }, - { "Yacute", 722, NULL }, - { "ohungarumlaut", 500, NULL }, - { "threesuperior", 300, NULL }, - { "acute", 333, NULL }, - { "section", 500, NULL }, - { "dieresis", 333, NULL }, - { "iacute", 278, NULL }, - { "quotedblbase", 500, NULL }, - { "ncaron", 556, NULL }, - { "florin", 500, NULL }, - { "yacute", 500, NULL }, - { "Rcommaaccent", 722, NULL }, - { "fi", 556, NULL }, - { "fl", 556, NULL }, - { "Acircumflex", 722, NULL }, - { "Cacute", 722, NULL }, - { "Icircumflex", 389, NULL }, - { "guillemotleft", 500, NULL }, - { "germandbls", 556, NULL }, - { "Amacron", 722, NULL }, - { "seven", 500, NULL }, - { "Sacute", 556, NULL }, - { "ordmasculine", 330, NULL }, - { "dotlessi", 278, NULL }, - { "sterling", 500, NULL }, - { "notequal", 549, NULL }, - { "Imacron", 389, NULL }, - { "rcommaaccent", 444, NULL }, - { "Zdotaccent", 667, NULL }, - { "acircumflex", 500, NULL }, - { "cacute", 444, NULL }, - { "Ecaron", 667, NULL }, - { "icircumflex", 278, NULL }, - { "braceright", 394, NULL }, - { "quotedblright", 500, NULL }, - { "amacron", 500, NULL }, - { "sacute", 389, NULL }, - { "imacron", 278, NULL }, - { "cent", 500, NULL }, - { "currency", 500, NULL }, - { "logicalnot", 570, NULL }, - { "zdotaccent", 444, NULL }, - { "Atilde", 722, NULL }, - { "breve", 333, NULL }, - { "bar", 220, NULL }, - { "fraction", 167, NULL }, - { "less", 570, NULL }, - { "ecaron", 444, NULL }, - { "guilsinglleft", 333, NULL }, - { "exclam", 333, NULL }, - { "period", 250, NULL }, - { "Rcaron", 722, NULL }, - { "Kcommaaccent", 778, NULL }, - { "greater", 570, NULL }, - { "atilde", 500, NULL }, - { "brokenbar", 220, NULL }, - { "quoteleft", 333, NULL }, - { "Edotaccent", 667, NULL }, - { "onesuperior", 300, NULL } -}; - -static BuiltinFontWidth timesBoldItalicWidthsTab[] = { - { "Ntilde", 722, NULL }, - { "rcaron", 389, NULL }, - { "kcommaaccent", 500, NULL }, - { "Ncommaaccent", 722, NULL }, - { "Zacute", 611, NULL }, - { "comma", 250, NULL }, - { "cedilla", 333, NULL }, - { "plusminus", 570, NULL }, - { "circumflex", 333, NULL }, - { "dotaccent", 333, NULL }, - { "edotaccent", 444, NULL }, - { "asciitilde", 570, NULL }, - { "colon", 333, NULL }, - { "onehalf", 750, NULL }, - { "dollar", 500, NULL }, - { "Lcaron", 611, NULL }, - { "ntilde", 556, NULL }, - { "Aogonek", 667, NULL }, - { "ncommaaccent", 556, NULL }, - { "minus", 606, NULL }, - { "Iogonek", 389, NULL }, - { "zacute", 389, NULL }, - { "yen", 500, NULL }, - { "space", 250, NULL }, - { "Omacron", 722, NULL }, - { "questiondown", 500, NULL }, - { "emdash", 1000, NULL }, - { "Agrave", 667, NULL }, - { "three", 500, NULL }, - { "numbersign", 500, NULL }, - { "lcaron", 382, NULL }, - { "A", 667, NULL }, - { "B", 667, NULL }, - { "C", 667, NULL }, - { "aogonek", 500, NULL }, - { "D", 722, NULL }, - { "E", 667, NULL }, - { "onequarter", 750, NULL }, - { "F", 667, NULL }, - { "G", 722, NULL }, - { "H", 778, NULL }, - { "I", 389, NULL }, - { "J", 500, NULL }, - { "K", 667, NULL }, - { "iogonek", 278, NULL }, - { "backslash", 278, NULL }, - { "L", 611, NULL }, - { "periodcentered", 250, NULL }, - { "M", 889, NULL }, - { "N", 722, NULL }, - { "omacron", 500, NULL }, - { "Tcommaaccent", 611, NULL }, - { "O", 722, NULL }, - { "P", 611, NULL }, - { "Q", 722, NULL }, - { "Uhungarumlaut", 722, NULL }, - { "R", 667, NULL }, - { "Aacute", 667, NULL }, - { "caron", 333, NULL }, - { "S", 556, NULL }, - { "T", 611, NULL }, - { "U", 722, NULL }, - { "agrave", 500, NULL }, - { "V", 667, NULL }, - { "W", 889, NULL }, - { "X", 667, NULL }, - { "question", 500, NULL }, - { "equal", 570, NULL }, - { "Y", 611, NULL }, - { "Z", 611, NULL }, - { "four", 500, NULL }, - { "a", 500, NULL }, - { "Gcommaaccent", 722, NULL }, - { "b", 500, NULL }, - { "c", 444, NULL }, - { "d", 500, NULL }, - { "e", 444, NULL }, - { "f", 333, NULL }, - { "g", 500, NULL }, - { "bullet", 350, NULL }, - { "h", 556, NULL }, - { "i", 278, NULL }, - { "Oslash", 722, NULL }, - { "dagger", 500, NULL }, - { "j", 278, NULL }, - { "k", 500, NULL }, - { "l", 278, NULL }, - { "m", 778, NULL }, - { "n", 556, NULL }, - { "tcommaaccent", 278, NULL }, - { "o", 500, NULL }, - { "ordfeminine", 266, NULL }, - { "ring", 333, NULL }, - { "p", 500, NULL }, - { "q", 500, NULL }, - { "uhungarumlaut", 556, NULL }, - { "r", 389, NULL }, - { "twosuperior", 300, NULL }, - { "aacute", 500, NULL }, - { "s", 389, NULL }, - { "OE", 944, NULL }, - { "t", 278, NULL }, - { "divide", 570, NULL }, - { "u", 556, NULL }, - { "Ccaron", 667, NULL }, - { "v", 444, NULL }, - { "w", 667, NULL }, - { "x", 500, NULL }, - { "y", 444, NULL }, - { "z", 389, NULL }, - { "Gbreve", 722, NULL }, - { "commaaccent", 250, NULL }, - { "hungarumlaut", 333, NULL }, - { "Idotaccent", 389, NULL }, - { "Nacute", 722, NULL }, - { "quotedbl", 555, NULL }, - { "gcommaaccent", 500, NULL }, - { "mu", 576, NULL }, - { "greaterequal", 549, NULL }, - { "Scaron", 556, NULL }, - { "Lslash", 611, NULL }, - { "semicolon", 333, NULL }, - { "oslash", 500, NULL }, - { "lessequal", 549, NULL }, - { "lozenge", 494, NULL }, - { "parenright", 333, NULL }, - { "ccaron", 444, NULL }, - { "Ecircumflex", 667, NULL }, - { "gbreve", 500, NULL }, - { "trademark", 1000, NULL }, - { "daggerdbl", 500, NULL }, - { "nacute", 556, NULL }, - { "macron", 333, NULL }, - { "Otilde", 722, NULL }, - { "Emacron", 667, NULL }, - { "ellipsis", 1000, NULL }, - { "scaron", 389, NULL }, - { "AE", 944, NULL }, - { "Ucircumflex", 722, NULL }, - { "lslash", 278, NULL }, - { "quotedblleft", 500, NULL }, - { "guilsinglright", 333, NULL }, - { "hyphen", 333, NULL }, - { "quotesingle", 278, NULL }, - { "eight", 500, NULL }, - { "exclamdown", 389, NULL }, - { "endash", 500, NULL }, - { "oe", 722, NULL }, - { "Abreve", 667, NULL }, - { "Umacron", 722, NULL }, - { "ecircumflex", 444, NULL }, - { "Adieresis", 667, NULL }, - { "copyright", 747, NULL }, - { "Egrave", 667, NULL }, - { "slash", 278, NULL }, - { "Edieresis", 667, NULL }, - { "otilde", 500, NULL }, - { "Idieresis", 389, NULL }, - { "parenleft", 333, NULL }, - { "one", 500, NULL }, - { "emacron", 444, NULL }, - { "Odieresis", 722, NULL }, - { "ucircumflex", 556, NULL }, - { "bracketleft", 333, NULL }, - { "Ugrave", 722, NULL }, - { "quoteright", 333, NULL }, - { "Udieresis", 722, NULL }, - { "perthousand", 1000, NULL }, - { "Ydieresis", 611, NULL }, - { "umacron", 556, NULL }, - { "abreve", 500, NULL }, - { "Eacute", 667, NULL }, - { "adieresis", 500, NULL }, - { "egrave", 444, NULL }, - { "edieresis", 444, NULL }, - { "idieresis", 278, NULL }, - { "Eth", 722, NULL }, - { "ae", 722, NULL }, - { "asterisk", 500, NULL }, - { "odieresis", 500, NULL }, - { "Uacute", 722, NULL }, - { "ugrave", 556, NULL }, - { "nine", 500, NULL }, - { "five", 500, NULL }, - { "udieresis", 556, NULL }, - { "Zcaron", 611, NULL }, - { "Scommaaccent", 556, NULL }, - { "threequarters", 750, NULL }, - { "guillemotright", 500, NULL }, - { "Ccedilla", 667, NULL }, - { "ydieresis", 444, NULL }, - { "tilde", 333, NULL }, - { "at", 832, NULL }, - { "eacute", 444, NULL }, - { "underscore", 500, NULL }, - { "Euro", 500, NULL }, - { "Dcroat", 722, NULL }, - { "multiply", 570, NULL }, - { "zero", 500, NULL }, - { "eth", 500, NULL }, - { "Scedilla", 556, NULL }, - { "Ograve", 722, NULL }, - { "Racute", 667, NULL }, - { "partialdiff", 494, NULL }, - { "uacute", 556, NULL }, - { "braceleft", 348, NULL }, - { "Thorn", 611, NULL }, - { "zcaron", 389, NULL }, - { "scommaaccent", 389, NULL }, - { "ccedilla", 444, NULL }, - { "Dcaron", 722, NULL }, - { "dcroat", 500, NULL }, - { "Ocircumflex", 722, NULL }, - { "Oacute", 722, NULL }, - { "scedilla", 389, NULL }, - { "ogonek", 333, NULL }, - { "ograve", 500, NULL }, - { "racute", 389, NULL }, - { "Tcaron", 611, NULL }, - { "Eogonek", 667, NULL }, - { "thorn", 500, NULL }, - { "degree", 400, NULL }, - { "registered", 747, NULL }, - { "radical", 549, NULL }, - { "Aring", 667, NULL }, - { "percent", 833, NULL }, - { "six", 500, NULL }, - { "paragraph", 500, NULL }, - { "dcaron", 608, NULL }, - { "Uogonek", 722, NULL }, - { "two", 500, NULL }, - { "summation", 600, NULL }, - { "Igrave", 389, NULL }, - { "Lacute", 611, NULL }, - { "ocircumflex", 500, NULL }, - { "oacute", 500, NULL }, - { "Uring", 722, NULL }, - { "Lcommaaccent", 611, NULL }, - { "tcaron", 366, NULL }, - { "eogonek", 444, NULL }, - { "Delta", 612, NULL }, - { "Ohungarumlaut", 722, NULL }, - { "asciicircum", 570, NULL }, - { "aring", 500, NULL }, - { "grave", 333, NULL }, - { "uogonek", 556, NULL }, - { "bracketright", 333, NULL }, - { "Iacute", 389, NULL }, - { "ampersand", 778, NULL }, - { "igrave", 278, NULL }, - { "lacute", 278, NULL }, - { "Ncaron", 722, NULL }, - { "plus", 570, NULL }, - { "uring", 556, NULL }, - { "quotesinglbase", 333, NULL }, - { "lcommaaccent", 278, NULL }, - { "Yacute", 611, NULL }, - { "ohungarumlaut", 500, NULL }, - { "threesuperior", 300, NULL }, - { "acute", 333, NULL }, - { "section", 500, NULL }, - { "dieresis", 333, NULL }, - { "iacute", 278, NULL }, - { "quotedblbase", 500, NULL }, - { "ncaron", 556, NULL }, - { "florin", 500, NULL }, - { "yacute", 444, NULL }, - { "Rcommaaccent", 667, NULL }, - { "fi", 556, NULL }, - { "fl", 556, NULL }, - { "Acircumflex", 667, NULL }, - { "Cacute", 667, NULL }, - { "Icircumflex", 389, NULL }, - { "guillemotleft", 500, NULL }, - { "germandbls", 500, NULL }, - { "Amacron", 667, NULL }, - { "seven", 500, NULL }, - { "Sacute", 556, NULL }, - { "ordmasculine", 300, NULL }, - { "dotlessi", 278, NULL }, - { "sterling", 500, NULL }, - { "notequal", 549, NULL }, - { "Imacron", 389, NULL }, - { "rcommaaccent", 389, NULL }, - { "Zdotaccent", 611, NULL }, - { "acircumflex", 500, NULL }, - { "cacute", 444, NULL }, - { "Ecaron", 667, NULL }, - { "icircumflex", 278, NULL }, - { "braceright", 348, NULL }, - { "quotedblright", 500, NULL }, - { "amacron", 500, NULL }, - { "sacute", 389, NULL }, - { "imacron", 278, NULL }, - { "cent", 500, NULL }, - { "currency", 500, NULL }, - { "logicalnot", 606, NULL }, - { "zdotaccent", 389, NULL }, - { "Atilde", 667, NULL }, - { "breve", 333, NULL }, - { "bar", 220, NULL }, - { "fraction", 167, NULL }, - { "less", 570, NULL }, - { "ecaron", 444, NULL }, - { "guilsinglleft", 333, NULL }, - { "exclam", 389, NULL }, - { "period", 250, NULL }, - { "Rcaron", 667, NULL }, - { "Kcommaaccent", 667, NULL }, - { "greater", 570, NULL }, - { "atilde", 500, NULL }, - { "brokenbar", 220, NULL }, - { "quoteleft", 333, NULL }, - { "Edotaccent", 667, NULL }, - { "onesuperior", 300, NULL } -}; - -static BuiltinFontWidth timesItalicWidthsTab[] = { - { "Ntilde", 667, NULL }, - { "rcaron", 389, NULL }, - { "kcommaaccent", 444, NULL }, - { "Ncommaaccent", 667, NULL }, - { "Zacute", 556, NULL }, - { "comma", 250, NULL }, - { "cedilla", 333, NULL }, - { "plusminus", 675, NULL }, - { "circumflex", 333, NULL }, - { "dotaccent", 333, NULL }, - { "edotaccent", 444, NULL }, - { "asciitilde", 541, NULL }, - { "colon", 333, NULL }, - { "onehalf", 750, NULL }, - { "dollar", 500, NULL }, - { "Lcaron", 611, NULL }, - { "ntilde", 500, NULL }, - { "Aogonek", 611, NULL }, - { "ncommaaccent", 500, NULL }, - { "minus", 675, NULL }, - { "Iogonek", 333, NULL }, - { "zacute", 389, NULL }, - { "yen", 500, NULL }, - { "space", 250, NULL }, - { "Omacron", 722, NULL }, - { "questiondown", 500, NULL }, - { "emdash", 889, NULL }, - { "Agrave", 611, NULL }, - { "three", 500, NULL }, - { "numbersign", 500, NULL }, - { "lcaron", 300, NULL }, - { "A", 611, NULL }, - { "B", 611, NULL }, - { "C", 667, NULL }, - { "aogonek", 500, NULL }, - { "D", 722, NULL }, - { "E", 611, NULL }, - { "onequarter", 750, NULL }, - { "F", 611, NULL }, - { "G", 722, NULL }, - { "H", 722, NULL }, - { "I", 333, NULL }, - { "J", 444, NULL }, - { "K", 667, NULL }, - { "iogonek", 278, NULL }, - { "backslash", 278, NULL }, - { "L", 556, NULL }, - { "periodcentered", 250, NULL }, - { "M", 833, NULL }, - { "N", 667, NULL }, - { "omacron", 500, NULL }, - { "Tcommaaccent", 556, NULL }, - { "O", 722, NULL }, - { "P", 611, NULL }, - { "Q", 722, NULL }, - { "Uhungarumlaut", 722, NULL }, - { "R", 611, NULL }, - { "Aacute", 611, NULL }, - { "caron", 333, NULL }, - { "S", 500, NULL }, - { "T", 556, NULL }, - { "U", 722, NULL }, - { "agrave", 500, NULL }, - { "V", 611, NULL }, - { "W", 833, NULL }, - { "X", 611, NULL }, - { "question", 500, NULL }, - { "equal", 675, NULL }, - { "Y", 556, NULL }, - { "Z", 556, NULL }, - { "four", 500, NULL }, - { "a", 500, NULL }, - { "Gcommaaccent", 722, NULL }, - { "b", 500, NULL }, - { "c", 444, NULL }, - { "d", 500, NULL }, - { "e", 444, NULL }, - { "f", 278, NULL }, - { "g", 500, NULL }, - { "bullet", 350, NULL }, - { "h", 500, NULL }, - { "i", 278, NULL }, - { "Oslash", 722, NULL }, - { "dagger", 500, NULL }, - { "j", 278, NULL }, - { "k", 444, NULL }, - { "l", 278, NULL }, - { "m", 722, NULL }, - { "n", 500, NULL }, - { "tcommaaccent", 278, NULL }, - { "o", 500, NULL }, - { "ordfeminine", 276, NULL }, - { "ring", 333, NULL }, - { "p", 500, NULL }, - { "q", 500, NULL }, - { "uhungarumlaut", 500, NULL }, - { "r", 389, NULL }, - { "twosuperior", 300, NULL }, - { "aacute", 500, NULL }, - { "s", 389, NULL }, - { "OE", 944, NULL }, - { "t", 278, NULL }, - { "divide", 675, NULL }, - { "u", 500, NULL }, - { "Ccaron", 667, NULL }, - { "v", 444, NULL }, - { "w", 667, NULL }, - { "x", 444, NULL }, - { "y", 444, NULL }, - { "z", 389, NULL }, - { "Gbreve", 722, NULL }, - { "commaaccent", 250, NULL }, - { "hungarumlaut", 333, NULL }, - { "Idotaccent", 333, NULL }, - { "Nacute", 667, NULL }, - { "quotedbl", 420, NULL }, - { "gcommaaccent", 500, NULL }, - { "mu", 500, NULL }, - { "greaterequal", 549, NULL }, - { "Scaron", 500, NULL }, - { "Lslash", 556, NULL }, - { "semicolon", 333, NULL }, - { "oslash", 500, NULL }, - { "lessequal", 549, NULL }, - { "lozenge", 471, NULL }, - { "parenright", 333, NULL }, - { "ccaron", 444, NULL }, - { "Ecircumflex", 611, NULL }, - { "gbreve", 500, NULL }, - { "trademark", 980, NULL }, - { "daggerdbl", 500, NULL }, - { "nacute", 500, NULL }, - { "macron", 333, NULL }, - { "Otilde", 722, NULL }, - { "Emacron", 611, NULL }, - { "ellipsis", 889, NULL }, - { "scaron", 389, NULL }, - { "AE", 889, NULL }, - { "Ucircumflex", 722, NULL }, - { "lslash", 278, NULL }, - { "quotedblleft", 556, NULL }, - { "guilsinglright", 333, NULL }, - { "hyphen", 333, NULL }, - { "quotesingle", 214, NULL }, - { "eight", 500, NULL }, - { "exclamdown", 389, NULL }, - { "endash", 500, NULL }, - { "oe", 667, NULL }, - { "Abreve", 611, NULL }, - { "Umacron", 722, NULL }, - { "ecircumflex", 444, NULL }, - { "Adieresis", 611, NULL }, - { "copyright", 760, NULL }, - { "Egrave", 611, NULL }, - { "slash", 278, NULL }, - { "Edieresis", 611, NULL }, - { "otilde", 500, NULL }, - { "Idieresis", 333, NULL }, - { "parenleft", 333, NULL }, - { "one", 500, NULL }, - { "emacron", 444, NULL }, - { "Odieresis", 722, NULL }, - { "ucircumflex", 500, NULL }, - { "bracketleft", 389, NULL }, - { "Ugrave", 722, NULL }, - { "quoteright", 333, NULL }, - { "Udieresis", 722, NULL }, - { "perthousand", 1000, NULL }, - { "Ydieresis", 556, NULL }, - { "umacron", 500, NULL }, - { "abreve", 500, NULL }, - { "Eacute", 611, NULL }, - { "adieresis", 500, NULL }, - { "egrave", 444, NULL }, - { "edieresis", 444, NULL }, - { "idieresis", 278, NULL }, - { "Eth", 722, NULL }, - { "ae", 667, NULL }, - { "asterisk", 500, NULL }, - { "odieresis", 500, NULL }, - { "Uacute", 722, NULL }, - { "ugrave", 500, NULL }, - { "nine", 500, NULL }, - { "five", 500, NULL }, - { "udieresis", 500, NULL }, - { "Zcaron", 556, NULL }, - { "Scommaaccent", 500, NULL }, - { "threequarters", 750, NULL }, - { "guillemotright", 500, NULL }, - { "Ccedilla", 667, NULL }, - { "ydieresis", 444, NULL }, - { "tilde", 333, NULL }, - { "at", 920, NULL }, - { "eacute", 444, NULL }, - { "underscore", 500, NULL }, - { "Euro", 500, NULL }, - { "Dcroat", 722, NULL }, - { "multiply", 675, NULL }, - { "zero", 500, NULL }, - { "eth", 500, NULL }, - { "Scedilla", 500, NULL }, - { "Ograve", 722, NULL }, - { "Racute", 611, NULL }, - { "partialdiff", 476, NULL }, - { "uacute", 500, NULL }, - { "braceleft", 400, NULL }, - { "Thorn", 611, NULL }, - { "zcaron", 389, NULL }, - { "scommaaccent", 389, NULL }, - { "ccedilla", 444, NULL }, - { "Dcaron", 722, NULL }, - { "dcroat", 500, NULL }, - { "Ocircumflex", 722, NULL }, - { "Oacute", 722, NULL }, - { "scedilla", 389, NULL }, - { "ogonek", 333, NULL }, - { "ograve", 500, NULL }, - { "racute", 389, NULL }, - { "Tcaron", 556, NULL }, - { "Eogonek", 611, NULL }, - { "thorn", 500, NULL }, - { "degree", 400, NULL }, - { "registered", 760, NULL }, - { "radical", 453, NULL }, - { "Aring", 611, NULL }, - { "percent", 833, NULL }, - { "six", 500, NULL }, - { "paragraph", 523, NULL }, - { "dcaron", 544, NULL }, - { "Uogonek", 722, NULL }, - { "two", 500, NULL }, - { "summation", 600, NULL }, - { "Igrave", 333, NULL }, - { "Lacute", 556, NULL }, - { "ocircumflex", 500, NULL }, - { "oacute", 500, NULL }, - { "Uring", 722, NULL }, - { "Lcommaaccent", 556, NULL }, - { "tcaron", 300, NULL }, - { "eogonek", 444, NULL }, - { "Delta", 612, NULL }, - { "Ohungarumlaut", 722, NULL }, - { "asciicircum", 422, NULL }, - { "aring", 500, NULL }, - { "grave", 333, NULL }, - { "uogonek", 500, NULL }, - { "bracketright", 389, NULL }, - { "Iacute", 333, NULL }, - { "ampersand", 778, NULL }, - { "igrave", 278, NULL }, - { "lacute", 278, NULL }, - { "Ncaron", 667, NULL }, - { "plus", 675, NULL }, - { "uring", 500, NULL }, - { "quotesinglbase", 333, NULL }, - { "lcommaaccent", 278, NULL }, - { "Yacute", 556, NULL }, - { "ohungarumlaut", 500, NULL }, - { "threesuperior", 300, NULL }, - { "acute", 333, NULL }, - { "section", 500, NULL }, - { "dieresis", 333, NULL }, - { "iacute", 278, NULL }, - { "quotedblbase", 556, NULL }, - { "ncaron", 500, NULL }, - { "florin", 500, NULL }, - { "yacute", 444, NULL }, - { "Rcommaaccent", 611, NULL }, - { "fi", 500, NULL }, - { "fl", 500, NULL }, - { "Acircumflex", 611, NULL }, - { "Cacute", 667, NULL }, - { "Icircumflex", 333, NULL }, - { "guillemotleft", 500, NULL }, - { "germandbls", 500, NULL }, - { "Amacron", 611, NULL }, - { "seven", 500, NULL }, - { "Sacute", 500, NULL }, - { "ordmasculine", 310, NULL }, - { "dotlessi", 278, NULL }, - { "sterling", 500, NULL }, - { "notequal", 549, NULL }, - { "Imacron", 333, NULL }, - { "rcommaaccent", 389, NULL }, - { "Zdotaccent", 556, NULL }, - { "acircumflex", 500, NULL }, - { "cacute", 444, NULL }, - { "Ecaron", 611, NULL }, - { "icircumflex", 278, NULL }, - { "braceright", 400, NULL }, - { "quotedblright", 556, NULL }, - { "amacron", 500, NULL }, - { "sacute", 389, NULL }, - { "imacron", 278, NULL }, - { "cent", 500, NULL }, - { "currency", 500, NULL }, - { "logicalnot", 675, NULL }, - { "zdotaccent", 389, NULL }, - { "Atilde", 611, NULL }, - { "breve", 333, NULL }, - { "bar", 275, NULL }, - { "fraction", 167, NULL }, - { "less", 675, NULL }, - { "ecaron", 444, NULL }, - { "guilsinglleft", 333, NULL }, - { "exclam", 333, NULL }, - { "period", 250, NULL }, - { "Rcaron", 611, NULL }, - { "Kcommaaccent", 667, NULL }, - { "greater", 675, NULL }, - { "atilde", 500, NULL }, - { "brokenbar", 275, NULL }, - { "quoteleft", 333, NULL }, - { "Edotaccent", 611, NULL }, - { "onesuperior", 300, NULL } -}; - -static BuiltinFontWidth timesRomanWidthsTab[] = { - { "Ntilde", 722, NULL }, - { "rcaron", 333, NULL }, - { "kcommaaccent", 500, NULL }, - { "Ncommaaccent", 722, NULL }, - { "Zacute", 611, NULL }, - { "comma", 250, NULL }, - { "cedilla", 333, NULL }, - { "plusminus", 564, NULL }, - { "circumflex", 333, NULL }, - { "dotaccent", 333, NULL }, - { "edotaccent", 444, NULL }, - { "asciitilde", 541, NULL }, - { "colon", 278, NULL }, - { "onehalf", 750, NULL }, - { "dollar", 500, NULL }, - { "Lcaron", 611, NULL }, - { "ntilde", 500, NULL }, - { "Aogonek", 722, NULL }, - { "ncommaaccent", 500, NULL }, - { "minus", 564, NULL }, - { "Iogonek", 333, NULL }, - { "zacute", 444, NULL }, - { "yen", 500, NULL }, - { "space", 250, NULL }, - { "Omacron", 722, NULL }, - { "questiondown", 444, NULL }, - { "emdash", 1000, NULL }, - { "Agrave", 722, NULL }, - { "three", 500, NULL }, - { "numbersign", 500, NULL }, - { "lcaron", 344, NULL }, - { "A", 722, NULL }, - { "B", 667, NULL }, - { "C", 667, NULL }, - { "aogonek", 444, NULL }, - { "D", 722, NULL }, - { "E", 611, NULL }, - { "onequarter", 750, NULL }, - { "F", 556, NULL }, - { "G", 722, NULL }, - { "H", 722, NULL }, - { "I", 333, NULL }, - { "J", 389, NULL }, - { "K", 722, NULL }, - { "iogonek", 278, NULL }, - { "backslash", 278, NULL }, - { "L", 611, NULL }, - { "periodcentered", 250, NULL }, - { "M", 889, NULL }, - { "N", 722, NULL }, - { "omacron", 500, NULL }, - { "Tcommaaccent", 611, NULL }, - { "O", 722, NULL }, - { "P", 556, NULL }, - { "Q", 722, NULL }, - { "Uhungarumlaut", 722, NULL }, - { "R", 667, NULL }, - { "Aacute", 722, NULL }, - { "caron", 333, NULL }, - { "S", 556, NULL }, - { "T", 611, NULL }, - { "U", 722, NULL }, - { "agrave", 444, NULL }, - { "V", 722, NULL }, - { "W", 944, NULL }, - { "X", 722, NULL }, - { "question", 444, NULL }, - { "equal", 564, NULL }, - { "Y", 722, NULL }, - { "Z", 611, NULL }, - { "four", 500, NULL }, - { "a", 444, NULL }, - { "Gcommaaccent", 722, NULL }, - { "b", 500, NULL }, - { "c", 444, NULL }, - { "d", 500, NULL }, - { "e", 444, NULL }, - { "f", 333, NULL }, - { "g", 500, NULL }, - { "bullet", 350, NULL }, - { "h", 500, NULL }, - { "i", 278, NULL }, - { "Oslash", 722, NULL }, - { "dagger", 500, NULL }, - { "j", 278, NULL }, - { "k", 500, NULL }, - { "l", 278, NULL }, - { "m", 778, NULL }, - { "n", 500, NULL }, - { "tcommaaccent", 278, NULL }, - { "o", 500, NULL }, - { "ordfeminine", 276, NULL }, - { "ring", 333, NULL }, - { "p", 500, NULL }, - { "q", 500, NULL }, - { "uhungarumlaut", 500, NULL }, - { "r", 333, NULL }, - { "twosuperior", 300, NULL }, - { "aacute", 444, NULL }, - { "s", 389, NULL }, - { "OE", 889, NULL }, - { "t", 278, NULL }, - { "divide", 564, NULL }, - { "u", 500, NULL }, - { "Ccaron", 667, NULL }, - { "v", 500, NULL }, - { "w", 722, NULL }, - { "x", 500, NULL }, - { "y", 500, NULL }, - { "z", 444, NULL }, - { "Gbreve", 722, NULL }, - { "commaaccent", 250, NULL }, - { "hungarumlaut", 333, NULL }, - { "Idotaccent", 333, NULL }, - { "Nacute", 722, NULL }, - { "quotedbl", 408, NULL }, - { "gcommaaccent", 500, NULL }, - { "mu", 500, NULL }, - { "greaterequal", 549, NULL }, - { "Scaron", 556, NULL }, - { "Lslash", 611, NULL }, - { "semicolon", 278, NULL }, - { "oslash", 500, NULL }, - { "lessequal", 549, NULL }, - { "lozenge", 471, NULL }, - { "parenright", 333, NULL }, - { "ccaron", 444, NULL }, - { "Ecircumflex", 611, NULL }, - { "gbreve", 500, NULL }, - { "trademark", 980, NULL }, - { "daggerdbl", 500, NULL }, - { "nacute", 500, NULL }, - { "macron", 333, NULL }, - { "Otilde", 722, NULL }, - { "Emacron", 611, NULL }, - { "ellipsis", 1000, NULL }, - { "scaron", 389, NULL }, - { "AE", 889, NULL }, - { "Ucircumflex", 722, NULL }, - { "lslash", 278, NULL }, - { "quotedblleft", 444, NULL }, - { "guilsinglright", 333, NULL }, - { "hyphen", 333, NULL }, - { "quotesingle", 180, NULL }, - { "eight", 500, NULL }, - { "exclamdown", 333, NULL }, - { "endash", 500, NULL }, - { "oe", 722, NULL }, - { "Abreve", 722, NULL }, - { "Umacron", 722, NULL }, - { "ecircumflex", 444, NULL }, - { "Adieresis", 722, NULL }, - { "copyright", 760, NULL }, - { "Egrave", 611, NULL }, - { "slash", 278, NULL }, - { "Edieresis", 611, NULL }, - { "otilde", 500, NULL }, - { "Idieresis", 333, NULL }, - { "parenleft", 333, NULL }, - { "one", 500, NULL }, - { "emacron", 444, NULL }, - { "Odieresis", 722, NULL }, - { "ucircumflex", 500, NULL }, - { "bracketleft", 333, NULL }, - { "Ugrave", 722, NULL }, - { "quoteright", 333, NULL }, - { "Udieresis", 722, NULL }, - { "perthousand", 1000, NULL }, - { "Ydieresis", 722, NULL }, - { "umacron", 500, NULL }, - { "abreve", 444, NULL }, - { "Eacute", 611, NULL }, - { "adieresis", 444, NULL }, - { "egrave", 444, NULL }, - { "edieresis", 444, NULL }, - { "idieresis", 278, NULL }, - { "Eth", 722, NULL }, - { "ae", 667, NULL }, - { "asterisk", 500, NULL }, - { "odieresis", 500, NULL }, - { "Uacute", 722, NULL }, - { "ugrave", 500, NULL }, - { "nine", 500, NULL }, - { "five", 500, NULL }, - { "udieresis", 500, NULL }, - { "Zcaron", 611, NULL }, - { "Scommaaccent", 556, NULL }, - { "threequarters", 750, NULL }, - { "guillemotright", 500, NULL }, - { "Ccedilla", 667, NULL }, - { "ydieresis", 500, NULL }, - { "tilde", 333, NULL }, - { "at", 921, NULL }, - { "eacute", 444, NULL }, - { "underscore", 500, NULL }, - { "Euro", 500, NULL }, - { "Dcroat", 722, NULL }, - { "multiply", 564, NULL }, - { "zero", 500, NULL }, - { "eth", 500, NULL }, - { "Scedilla", 556, NULL }, - { "Ograve", 722, NULL }, - { "Racute", 667, NULL }, - { "partialdiff", 476, NULL }, - { "uacute", 500, NULL }, - { "braceleft", 480, NULL }, - { "Thorn", 556, NULL }, - { "zcaron", 444, NULL }, - { "scommaaccent", 389, NULL }, - { "ccedilla", 444, NULL }, - { "Dcaron", 722, NULL }, - { "dcroat", 500, NULL }, - { "Ocircumflex", 722, NULL }, - { "Oacute", 722, NULL }, - { "scedilla", 389, NULL }, - { "ogonek", 333, NULL }, - { "ograve", 500, NULL }, - { "racute", 333, NULL }, - { "Tcaron", 611, NULL }, - { "Eogonek", 611, NULL }, - { "thorn", 500, NULL }, - { "degree", 400, NULL }, - { "registered", 760, NULL }, - { "radical", 453, NULL }, - { "Aring", 722, NULL }, - { "percent", 833, NULL }, - { "six", 500, NULL }, - { "paragraph", 453, NULL }, - { "dcaron", 588, NULL }, - { "Uogonek", 722, NULL }, - { "two", 500, NULL }, - { "summation", 600, NULL }, - { "Igrave", 333, NULL }, - { "Lacute", 611, NULL }, - { "ocircumflex", 500, NULL }, - { "oacute", 500, NULL }, - { "Uring", 722, NULL }, - { "Lcommaaccent", 611, NULL }, - { "tcaron", 326, NULL }, - { "eogonek", 444, NULL }, - { "Delta", 612, NULL }, - { "Ohungarumlaut", 722, NULL }, - { "asciicircum", 469, NULL }, - { "aring", 444, NULL }, - { "grave", 333, NULL }, - { "uogonek", 500, NULL }, - { "bracketright", 333, NULL }, - { "Iacute", 333, NULL }, - { "ampersand", 778, NULL }, - { "igrave", 278, NULL }, - { "lacute", 278, NULL }, - { "Ncaron", 722, NULL }, - { "plus", 564, NULL }, - { "uring", 500, NULL }, - { "quotesinglbase", 333, NULL }, - { "lcommaaccent", 278, NULL }, - { "Yacute", 722, NULL }, - { "ohungarumlaut", 500, NULL }, - { "threesuperior", 300, NULL }, - { "acute", 333, NULL }, - { "section", 500, NULL }, - { "dieresis", 333, NULL }, - { "iacute", 278, NULL }, - { "quotedblbase", 444, NULL }, - { "ncaron", 500, NULL }, - { "florin", 500, NULL }, - { "yacute", 500, NULL }, - { "Rcommaaccent", 667, NULL }, - { "fi", 556, NULL }, - { "fl", 556, NULL }, - { "Acircumflex", 722, NULL }, - { "Cacute", 667, NULL }, - { "Icircumflex", 333, NULL }, - { "guillemotleft", 500, NULL }, - { "germandbls", 500, NULL }, - { "Amacron", 722, NULL }, - { "seven", 500, NULL }, - { "Sacute", 556, NULL }, - { "ordmasculine", 310, NULL }, - { "dotlessi", 278, NULL }, - { "sterling", 500, NULL }, - { "notequal", 549, NULL }, - { "Imacron", 333, NULL }, - { "rcommaaccent", 333, NULL }, - { "Zdotaccent", 611, NULL }, - { "acircumflex", 444, NULL }, - { "cacute", 444, NULL }, - { "Ecaron", 611, NULL }, - { "icircumflex", 278, NULL }, - { "braceright", 480, NULL }, - { "quotedblright", 444, NULL }, - { "amacron", 444, NULL }, - { "sacute", 389, NULL }, - { "imacron", 278, NULL }, - { "cent", 500, NULL }, - { "currency", 500, NULL }, - { "logicalnot", 564, NULL }, - { "zdotaccent", 444, NULL }, - { "Atilde", 722, NULL }, - { "breve", 333, NULL }, - { "bar", 200, NULL }, - { "fraction", 167, NULL }, - { "less", 564, NULL }, - { "ecaron", 444, NULL }, - { "guilsinglleft", 333, NULL }, - { "exclam", 333, NULL }, - { "period", 250, NULL }, - { "Rcaron", 667, NULL }, - { "Kcommaaccent", 722, NULL }, - { "greater", 564, NULL }, - { "atilde", 444, NULL }, - { "brokenbar", 200, NULL }, - { "quoteleft", 333, NULL }, - { "Edotaccent", 611, NULL }, - { "onesuperior", 300, NULL } -}; - -static BuiltinFontWidth zapfDingbatsWidthsTab[] = { - { "a81", 438, NULL }, - { "a82", 138, NULL }, - { "a83", 277, NULL }, - { "a84", 415, NULL }, - { "a85", 509, NULL }, - { "a86", 410, NULL }, - { "a87", 234, NULL }, - { "a88", 234, NULL }, - { "a89", 390, NULL }, - { "a140", 788, NULL }, - { "a141", 788, NULL }, - { "a142", 788, NULL }, - { "a143", 788, NULL }, - { "a144", 788, NULL }, - { "a145", 788, NULL }, - { "a146", 788, NULL }, - { "a147", 788, NULL }, - { "a148", 788, NULL }, - { "a149", 788, NULL }, - { "a90", 390, NULL }, - { "a91", 276, NULL }, - { "a92", 276, NULL }, - { "space", 278, NULL }, - { "a93", 317, NULL }, - { "a94", 317, NULL }, - { "a95", 334, NULL }, - { "a96", 334, NULL }, - { "a97", 392, NULL }, - { "a98", 392, NULL }, - { "a99", 668, NULL }, - { "a150", 788, NULL }, - { "a151", 788, NULL }, - { "a152", 788, NULL }, - { "a153", 788, NULL }, - { "a154", 788, NULL }, - { "a155", 788, NULL }, - { "a156", 788, NULL }, - { "a157", 788, NULL }, - { "a158", 788, NULL }, - { "a159", 788, NULL }, - { "a160", 894, NULL }, - { "a161", 838, NULL }, - { "a162", 924, NULL }, - { "a163", 1016, NULL }, - { "a164", 458, NULL }, - { "a165", 924, NULL }, - { "a166", 918, NULL }, - { "a167", 927, NULL }, - { "a168", 928, NULL }, - { "a169", 928, NULL }, - { "a170", 834, NULL }, - { "a171", 873, NULL }, - { "a172", 828, NULL }, - { "a173", 924, NULL }, - { "a174", 917, NULL }, - { "a175", 930, NULL }, - { "a176", 931, NULL }, - { "a177", 463, NULL }, - { "a178", 883, NULL }, - { "a179", 836, NULL }, - { "a180", 867, NULL }, - { "a181", 696, NULL }, - { "a182", 874, NULL }, - { "a183", 760, NULL }, - { "a184", 946, NULL }, - { "a185", 865, NULL }, - { "a186", 967, NULL }, - { "a187", 831, NULL }, - { "a188", 873, NULL }, - { "a189", 927, NULL }, - { "a1", 974, NULL }, - { "a2", 961, NULL }, - { "a3", 980, NULL }, - { "a4", 719, NULL }, - { "a5", 789, NULL }, - { "a6", 494, NULL }, - { "a7", 552, NULL }, - { "a8", 537, NULL }, - { "a9", 577, NULL }, - { "a190", 970, NULL }, - { "a191", 918, NULL }, - { "a192", 748, NULL }, - { "a193", 836, NULL }, - { "a194", 771, NULL }, - { "a195", 888, NULL }, - { "a196", 748, NULL }, - { "a197", 771, NULL }, - { "a198", 888, NULL }, - { "a199", 867, NULL }, - { "a10", 692, NULL }, - { "a11", 960, NULL }, - { "a12", 939, NULL }, - { "a13", 549, NULL }, - { "a14", 855, NULL }, - { "a15", 911, NULL }, - { "a16", 933, NULL }, - { "a17", 945, NULL }, - { "a18", 974, NULL }, - { "a19", 755, NULL }, - { "a20", 846, NULL }, - { "a21", 762, NULL }, - { "a22", 761, NULL }, - { "a23", 571, NULL }, - { "a24", 677, NULL }, - { "a25", 763, NULL }, - { "a26", 760, NULL }, - { "a27", 759, NULL }, - { "a28", 754, NULL }, - { "a29", 786, NULL }, - { "a30", 788, NULL }, - { "a31", 788, NULL }, - { "a32", 790, NULL }, - { "a33", 793, NULL }, - { "a34", 794, NULL }, - { "a35", 816, NULL }, - { "a36", 823, NULL }, - { "a37", 789, NULL }, - { "a38", 841, NULL }, - { "a39", 823, NULL }, - { "a40", 833, NULL }, - { "a41", 816, NULL }, - { "a42", 831, NULL }, - { "a43", 923, NULL }, - { "a44", 744, NULL }, - { "a45", 723, NULL }, - { "a46", 749, NULL }, - { "a47", 790, NULL }, - { "a48", 792, NULL }, - { "a49", 695, NULL }, - { "a100", 668, NULL }, - { "a101", 732, NULL }, - { "a102", 544, NULL }, - { "a103", 544, NULL }, - { "a104", 910, NULL }, - { "a105", 911, NULL }, - { "a106", 667, NULL }, - { "a107", 760, NULL }, - { "a108", 760, NULL }, - { "a109", 626, NULL }, - { "a50", 776, NULL }, - { "a51", 768, NULL }, - { "a52", 792, NULL }, - { "a53", 759, NULL }, - { "a54", 707, NULL }, - { "a55", 708, NULL }, - { "a56", 682, NULL }, - { "a57", 701, NULL }, - { "a58", 826, NULL }, - { "a59", 815, NULL }, - { "a110", 694, NULL }, - { "a111", 595, NULL }, - { "a112", 776, NULL }, - { "a117", 690, NULL }, - { "a118", 791, NULL }, - { "a119", 790, NULL }, - { "a60", 789, NULL }, - { "a61", 789, NULL }, - { "a62", 707, NULL }, - { "a63", 687, NULL }, - { "a64", 696, NULL }, - { "a65", 689, NULL }, - { "a66", 786, NULL }, - { "a67", 787, NULL }, - { "a68", 713, NULL }, - { "a69", 791, NULL }, - { "a200", 696, NULL }, - { "a201", 874, NULL }, - { "a120", 788, NULL }, - { "a121", 788, NULL }, - { "a202", 974, NULL }, - { "a122", 788, NULL }, - { "a203", 762, NULL }, - { "a123", 788, NULL }, - { "a204", 759, NULL }, - { "a124", 788, NULL }, - { "a205", 509, NULL }, - { "a125", 788, NULL }, - { "a206", 410, NULL }, - { "a126", 788, NULL }, - { "a127", 788, NULL }, - { "a128", 788, NULL }, - { "a129", 788, NULL }, - { "a70", 785, NULL }, - { "a71", 791, NULL }, - { "a72", 873, NULL }, - { "a73", 761, NULL }, - { "a74", 762, NULL }, - { "a75", 759, NULL }, - { "a76", 892, NULL }, - { "a77", 892, NULL }, - { "a78", 788, NULL }, - { "a79", 784, NULL }, - { "a130", 788, NULL }, - { "a131", 788, NULL }, - { "a132", 788, NULL }, - { "a133", 788, NULL }, - { "a134", 788, NULL }, - { "a135", 788, NULL }, - { "a136", 788, NULL }, - { "a137", 788, NULL }, - { "a138", 788, NULL }, - { "a139", 788, NULL } -}; - -BuiltinFont builtinFonts[] = { - { "Courier", standardEncoding, 629, -157, { -23, -250, 715, 805}, NULL }, - { "Courier-Bold", standardEncoding, 629, -157, {-113, -250, 749, 801}, NULL }, - { "Courier-BoldOblique", standardEncoding, 629, -157, { -57, -250, 869, 801}, NULL }, - { "Courier-Oblique", standardEncoding, 629, -157, { -27, -250, 849, 805}, NULL }, - { "Helvetica", standardEncoding, 718, -207, {-166, -225, 1000, 931}, NULL }, - { "Helvetica-Bold", standardEncoding, 718, -207, {-170, -228, 1003, 962}, NULL }, - { "Helvetica-BoldOblique", standardEncoding, 718, -207, {-174, -228, 1114, 962}, NULL }, - { "Helvetica-Oblique", standardEncoding, 718, -207, {-170, -225, 1116, 931}, NULL }, - { "Symbol", symbolEncoding, 1010, -293, {-180, -293, 1090, 1010}, NULL }, - { "Times-Bold", standardEncoding, 683, -217, {-168, -218, 1000, 935}, NULL }, - { "Times-BoldItalic", standardEncoding, 683, -217, {-200, -218, 996, 921}, NULL }, - { "Times-Italic", standardEncoding, 683, -217, {-169, -217, 1010, 883}, NULL }, - { "Times-Roman", standardEncoding, 683, -217, {-168, -218, 1000, 898}, NULL }, - { "ZapfDingbats", zapfDingbatsEncoding, 820, -143, { -1, -143, 981, 820}, NULL } -}; - -BuiltinFont *builtinFontSubst[] = { - &builtinFonts[0], - &builtinFonts[3], - &builtinFonts[1], - &builtinFonts[2], - &builtinFonts[4], - &builtinFonts[7], - &builtinFonts[5], - &builtinFonts[6], - &builtinFonts[12], - &builtinFonts[11], - &builtinFonts[9], - &builtinFonts[10] -}; - -void initBuiltinFontTables() { - builtinFonts[0].widths = new BuiltinFontWidths(courierWidthsTab, 315); - builtinFonts[1].widths = new BuiltinFontWidths(courierBoldWidthsTab, 315); - builtinFonts[2].widths = new BuiltinFontWidths(courierBoldObliqueWidthsTab, 315); - builtinFonts[3].widths = new BuiltinFontWidths(courierObliqueWidthsTab, 315); - builtinFonts[4].widths = new BuiltinFontWidths(helveticaWidthsTab, 315); - builtinFonts[5].widths = new BuiltinFontWidths(helveticaBoldWidthsTab, 316); - builtinFonts[6].widths = new BuiltinFontWidths(helveticaBoldObliqueWidthsTab, 315); - builtinFonts[7].widths = new BuiltinFontWidths(helveticaObliqueWidthsTab, 315); - builtinFonts[8].widths = new BuiltinFontWidths(symbolWidthsTab, 190); - builtinFonts[9].widths = new BuiltinFontWidths(timesBoldWidthsTab, 315); - builtinFonts[10].widths = new BuiltinFontWidths(timesBoldItalicWidthsTab, 315); - builtinFonts[11].widths = new BuiltinFontWidths(timesItalicWidthsTab, 315); - builtinFonts[12].widths = new BuiltinFontWidths(timesRomanWidthsTab, 315); - builtinFonts[13].widths = new BuiltinFontWidths(zapfDingbatsWidthsTab, 202); -} - -void freeBuiltinFontTables() { - int i; - - for (i = 0; i < 14; ++i) { - delete builtinFonts[i].widths; - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.h deleted file mode 100644 index eb45549ef..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/BuiltinFontTables.h +++ /dev/null @@ -1,23 +0,0 @@ -//======================================================================== -// -// BuiltinFontTables.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef BUILTINFONTTABLES_H -#define BUILTINFONTTABLES_H - -#include "BuiltinFont.h" - -#define nBuiltinFonts 14 -#define nBuiltinFontSubsts 12 - -extern BuiltinFont builtinFonts[nBuiltinFonts]; -extern BuiltinFont *builtinFontSubst[nBuiltinFontSubsts]; - -extern void initBuiltinFontTables(); -extern void freeBuiltinFontTables(); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.cc deleted file mode 100644 index 303cf0952..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.cc +++ /dev/null @@ -1,408 +0,0 @@ -//======================================================================== -// -// CMap.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#include "gmem.h" -#include "gfile.h" -#include "GString.h" -#include "Error.h" -#include "GlobalParams.h" -#include "PSTokenizer.h" -#include "CMap.h" - -//------------------------------------------------------------------------ - -struct CMapVectorEntry { - GBool isVector; - union { - CMapVectorEntry *vector; - CID cid; - }; -}; - -//------------------------------------------------------------------------ - -static int getCharFromFile(void *data) { - return fgetc((FILE *)data); -} - -//------------------------------------------------------------------------ - -CMap *CMap::parse(CMapCache *cache, GString *collectionA, - GString *cMapNameA) { - FILE *f; - CMap *cmap; - PSTokenizer *pst; - char tok1[256], tok2[256], tok3[256]; - int n1, n2, n3; - Guint start, end, code; - - if (!(f = globalParams->findCMapFile(collectionA, cMapNameA))) { - - // Check for an identity CMap. - if (!cMapNameA->cmp("Identity") || !cMapNameA->cmp("Identity-H")) { - return new CMap(collectionA->copy(), cMapNameA->copy(), 0); - } - if (!cMapNameA->cmp("Identity-V")) { - return new CMap(collectionA->copy(), cMapNameA->copy(), 1); - } - - error(-1, "Couldn't find '%s' CMap file for '%s' collection", - cMapNameA->getCString(), collectionA->getCString()); - return NULL; - } - - cmap = new CMap(collectionA->copy(), cMapNameA->copy()); - - pst = new PSTokenizer(&getCharFromFile, f); - pst->getToken(tok1, sizeof(tok1), &n1); - while (pst->getToken(tok2, sizeof(tok2), &n2)) { - if (!strcmp(tok2, "usecmap")) { - if (tok1[0] == '/') { - cmap->useCMap(cache, tok1 + 1); - } - pst->getToken(tok1, sizeof(tok1), &n1); - } else if (!strcmp(tok1, "/WMode")) { - cmap->wMode = atoi(tok2); - pst->getToken(tok1, sizeof(tok1), &n1); - } else if (!strcmp(tok2, "begincodespacerange")) { - while (pst->getToken(tok1, sizeof(tok1), &n1)) { - if (!strcmp(tok1, "endcodespacerange")) { - break; - } - if (!pst->getToken(tok2, sizeof(tok2), &n2) || - !strcmp(tok2, "endcodespacerange")) { - error(-1, "Illegal entry in codespacerange block in CMap"); - break; - } - if (tok1[0] == '<' && tok2[0] == '<' && - n1 == n2 && n1 >= 4 && (n1 & 1) == 0) { - tok1[n1 - 1] = tok2[n1 - 1] = '\0'; - sscanf(tok1 + 1, "%x", &start); - sscanf(tok2 + 1, "%x", &end); - n1 = (n1 - 2) / 2; - cmap->addCodeSpace(cmap->vector, start, end, n1); - } - } - pst->getToken(tok1, sizeof(tok1), &n1); - } else if (!strcmp(tok2, "begincidchar")) { - while (pst->getToken(tok1, sizeof(tok1), &n1)) { - if (!strcmp(tok1, "endcidchar")) { - break; - } - if (!pst->getToken(tok2, sizeof(tok2), &n2) || - !strcmp(tok2, "endcidchar")) { - error(-1, "Illegal entry in cidchar block in CMap"); - break; - } - if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && - n1 >= 4 && (n1 & 1) == 0)) { - error(-1, "Illegal entry in cidchar block in CMap"); - continue; - } - tok1[n1 - 1] = '\0'; - if (sscanf(tok1 + 1, "%x", &code) != 1) { - error(-1, "Illegal entry in cidchar block in CMap"); - continue; - } - n1 = (n1 - 2) / 2; - cmap->addCIDs(code, code, n1, (CID)atoi(tok2)); - } - pst->getToken(tok1, sizeof(tok1), &n1); - } else if (!strcmp(tok2, "begincidrange")) { - while (pst->getToken(tok1, sizeof(tok1), &n1)) { - if (!strcmp(tok1, "endcidrange")) { - break; - } - if (!pst->getToken(tok2, sizeof(tok2), &n2) || - !strcmp(tok2, "endcidrange") || - !pst->getToken(tok3, sizeof(tok3), &n3) || - !strcmp(tok3, "endcidrange")) { - error(-1, "Illegal entry in cidrange block in CMap"); - break; - } - if (tok1[0] == '<' && tok2[0] == '<' && - n1 == n2 && n1 >= 4 && (n1 & 1) == 0) { - tok1[n1 - 1] = tok2[n1 - 1] = '\0'; - sscanf(tok1 + 1, "%x", &start); - sscanf(tok2 + 1, "%x", &end); - n1 = (n1 - 2) / 2; - cmap->addCIDs(start, end, n1, (CID)atoi(tok3)); - } - } - pst->getToken(tok1, sizeof(tok1), &n1); - } else { - strcpy(tok1, tok2); - } - } - delete pst; - - fclose(f); - - return cmap; -} - -CMap::CMap(GString *collectionA, GString *cMapNameA) { - int i; - - collection = collectionA; - cMapName = cMapNameA; - wMode = 0; - vector = (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); - for (i = 0; i < 256; ++i) { - vector[i].isVector = gFalse; - vector[i].cid = 0; - } - refCnt = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -CMap::CMap(GString *collectionA, GString *cMapNameA, int wModeA) { - collection = collectionA; - cMapName = cMapNameA; - wMode = wModeA; - vector = NULL; - refCnt = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -void CMap::useCMap(CMapCache *cache, char *useName) { - GString *useNameStr; - CMap *subCMap; - - useNameStr = new GString(useName); - subCMap = cache->getCMap(collection, useNameStr); - delete useNameStr; - if (!subCMap) { - return; - } - copyVector(vector, subCMap->vector); - subCMap->decRefCnt(); -} - -void CMap::copyVector(CMapVectorEntry *dest, CMapVectorEntry *src) { - int i, j; - - for (i = 0; i < 256; ++i) { - if (src[i].isVector) { - if (!dest[i].isVector) { - dest[i].isVector = gTrue; - dest[i].vector = - (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); - for (j = 0; j < 256; ++j) { - dest[i].vector[j].isVector = gFalse; - dest[i].vector[j].cid = 0; - } - } - copyVector(dest[i].vector, src[i].vector); - } else { - if (dest[i].isVector) { - error(-1, "Collision in usecmap"); - } else { - dest[i].cid = src[i].cid; - } - } - } -} - -void CMap::addCodeSpace(CMapVectorEntry *vec, Guint start, Guint end, - Guint nBytes) { - Guint start2, end2; - int startByte, endByte, i, j; - - if (nBytes > 1) { - startByte = (start >> (8 * (nBytes - 1))) & 0xff; - endByte = (end >> (8 * (nBytes - 1))) & 0xff; - start2 = start & ((1 << (8 * (nBytes - 1))) - 1); - end2 = end & ((1 << (8 * (nBytes - 1))) - 1); - for (i = startByte; i <= endByte; ++i) { - if (!vec[i].isVector) { - vec[i].isVector = gTrue; - vec[i].vector = - (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); - for (j = 0; j < 256; ++j) { - vec[i].vector[j].isVector = gFalse; - vec[i].vector[j].cid = 0; - } - } - addCodeSpace(vec[i].vector, start2, end2, nBytes - 1); - } - } -} - -void CMap::addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID) { - CMapVectorEntry *vec; - CID cid; - int byte; - Guint i; - - vec = vector; - for (i = nBytes - 1; i >= 1; --i) { - byte = (start >> (8 * i)) & 0xff; - if (!vec[byte].isVector) { - error(-1, "Invalid CID (%0*x - %0*x) in CMap", - 2*nBytes, start, 2*nBytes, end); - return; - } - vec = vec[byte].vector; - } - cid = firstCID; - for (byte = (int)(start & 0xff); byte <= (int)(end & 0xff); ++byte) { - if (vec[byte].isVector) { - error(-1, "Invalid CID (%0*x - %0*x) in CMap", - 2*nBytes, start, 2*nBytes, end); - } else { - vec[byte].cid = cid; - } - ++cid; - } -} - -CMap::~CMap() { - delete collection; - delete cMapName; - if (vector) { - freeCMapVector(vector); - } -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -void CMap::freeCMapVector(CMapVectorEntry *vec) { - int i; - - for (i = 0; i < 256; ++i) { - if (vec[i].isVector) { - freeCMapVector(vec[i].vector); - } - } - gfree(vec); -} - -void CMap::incRefCnt() { -#if MULTITHREADED - gLockMutex(&mutex); -#endif - ++refCnt; -#if MULTITHREADED - gUnlockMutex(&mutex); -#endif -} - -void CMap::decRefCnt() { - GBool done; - -#if MULTITHREADED - gLockMutex(&mutex); -#endif - done = --refCnt == 0; -#if MULTITHREADED - gUnlockMutex(&mutex); -#endif - if (done) { - delete this; - } -} - -GBool CMap::match(GString *collectionA, GString *cMapNameA) { - return !collection->cmp(collectionA) && !cMapName->cmp(cMapNameA); -} - -CID CMap::getCID(char *s, int len, int *nUsed) { - CMapVectorEntry *vec; - int n, i; - - if (!(vec = vector)) { - // identity CMap - *nUsed = 2; - if (len < 2) { - return 0; - } - return ((s[0] & 0xff) << 8) + (s[1] & 0xff); - } - n = 0; - while (1) { - if (n >= len) { - *nUsed = n; - return 0; - } - i = s[n++] & 0xff; - if (!vec[i].isVector) { - *nUsed = n; - return vec[i].cid; - } - vec = vec[i].vector; - } -} - -//------------------------------------------------------------------------ - -CMapCache::CMapCache() { - int i; - - for (i = 0; i < cMapCacheSize; ++i) { - cache[i] = NULL; - } -} - -CMapCache::~CMapCache() { - int i; - - for (i = 0; i < cMapCacheSize; ++i) { - if (cache[i]) { - cache[i]->decRefCnt(); - } - } -} - -CMap *CMapCache::getCMap(GString *collection, GString *cMapName) { - CMap *cmap; - int i, j; - - if (cache[0] && cache[0]->match(collection, cMapName)) { - cache[0]->incRefCnt(); - return cache[0]; - } - for (i = 1; i < cMapCacheSize; ++i) { - if (cache[i] && cache[i]->match(collection, cMapName)) { - cmap = cache[i]; - for (j = i; j >= 1; --j) { - cache[j] = cache[j - 1]; - } - cache[0] = cmap; - cmap->incRefCnt(); - return cmap; - } - } - if ((cmap = CMap::parse(this, collection, cMapName))) { - if (cache[cMapCacheSize - 1]) { - cache[cMapCacheSize - 1]->decRefCnt(); - } - for (j = cMapCacheSize - 1; j >= 1; --j) { - cache[j] = cache[j - 1]; - } - cache[0] = cmap; - cmap->incRefCnt(); - return cmap; - } - return NULL; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.h deleted file mode 100644 index c321a57ab..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CMap.h +++ /dev/null @@ -1,102 +0,0 @@ -//======================================================================== -// -// CMap.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef CMAP_H -#define CMAP_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "CharTypes.h" - -#if MULTITHREADED -#include "GMutex.h" -#endif - -class GString; -struct CMapVectorEntry; -class CMapCache; - -//------------------------------------------------------------------------ - -class CMap { -public: - - // Create the CMap specified by and . Sets - // the initial reference count to 1. Returns NULL on failure. - static CMap *parse(CMapCache *cache, GString *collectionA, - GString *cMapNameA); - - ~CMap(); - - void incRefCnt(); - void decRefCnt(); - - // Return collection name (-). - GString *getCollection() { return collection; } - - // Return true if this CMap matches the specified , and - // . - GBool match(GString *collectionA, GString *cMapNameA); - - // Return the CID corresponding to the character code starting at - // , which contains bytes. Sets * to the number of - // bytes used by the char code. - CID getCID(char *s, int len, int *nUsed); - - // Return the writing mode (0=horizontal, 1=vertical). - int getWMode() { return wMode; } - -private: - - CMap(GString *collectionA, GString *cMapNameA); - CMap(GString *collectionA, GString *cMapNameA, int wModeA); - void useCMap(CMapCache *cache, char *useName); - void copyVector(CMapVectorEntry *dest, CMapVectorEntry *src); - void addCodeSpace(CMapVectorEntry *vec, Guint start, Guint end, - Guint nBytes); - void addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID); - void freeCMapVector(CMapVectorEntry *vec); - - GString *collection; - GString *cMapName; - int wMode; // writing mode (0=horizontal, 1=vertical) - CMapVectorEntry *vector; // vector for first byte (NULL for - // identity CMap) - int refCnt; -#if MULTITHREADED - GMutex mutex; -#endif -}; - -//------------------------------------------------------------------------ - -#define cMapCacheSize 4 - -class CMapCache { -public: - - CMapCache(); - ~CMapCache(); - - // Get the CMap for the specified character collection. - // Increments its reference count; there will be one reference for - // the cache plus one for the caller of this function. Returns NULL - // on failure. - CMap *getCMap(GString *collection, GString *cMapName); - -private: - - CMap *cache[cMapCacheSize]; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.cc deleted file mode 100644 index 4b89b3132..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.cc +++ /dev/null @@ -1,374 +0,0 @@ -//======================================================================== -// -// Catalog.cc -// -// Copyright 1996-2007 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "gmem.h" -#include "Object.h" -#include "XRef.h" -#include "Array.h" -#include "Dict.h" -#include "Page.h" -#include "Error.h" -#include "Link.h" -#include "Catalog.h" - -//------------------------------------------------------------------------ -// Catalog -//------------------------------------------------------------------------ - -Catalog::Catalog(XRef *xrefA) { - Object catDict, pagesDict, pagesDictRef; - Object obj, obj2; - char *alreadyRead; - int numPages0; - int i; - - ok = gTrue; - xref = xrefA; - pages = NULL; - pageRefs = NULL; - numPages = pagesSize = 0; - baseURI = NULL; - - xref->getCatalog(&catDict); - if (!catDict.isDict()) { - error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName()); - goto err1; - } - - // read page tree - catDict.dictLookup("Pages", &pagesDict); - // This should really be isDict("Pages"), but I've seen at least one - // PDF file where the /Type entry is missing. - if (!pagesDict.isDict()) { - error(-1, "Top-level pages object is wrong type (%s)", - pagesDict.getTypeName()); - goto err2; - } - pagesDict.dictLookup("Count", &obj); - // some PDF files actually use real numbers here ("/Count 9.0") - if (!obj.isNum()) { - error(-1, "Page count in top-level pages object is wrong type (%s)", - obj.getTypeName()); - goto err3; - } - pagesSize = numPages0 = (int)obj.getNum(); - obj.free(); - pages = (Page **)gmallocn(pagesSize, sizeof(Page *)); - pageRefs = (Ref *)gmallocn(pagesSize, sizeof(Ref)); - for (i = 0; i < pagesSize; ++i) { - pages[i] = NULL; - pageRefs[i].num = -1; - pageRefs[i].gen = -1; - } - alreadyRead = (char *)gmalloc(xref->getNumObjects()); - memset(alreadyRead, 0, xref->getNumObjects()); - if (catDict.dictLookupNF("Pages", &pagesDictRef)->isRef() && - pagesDictRef.getRefNum() >= 0 && - pagesDictRef.getRefNum() < xref->getNumObjects()) { - alreadyRead[pagesDictRef.getRefNum()] = 1; - } - pagesDictRef.free(); - numPages = readPageTree(pagesDict.getDict(), NULL, 0, alreadyRead); - gfree(alreadyRead); - if (numPages != numPages0) { - error(-1, "Page count in top-level pages object is incorrect"); - } - pagesDict.free(); - - // read named destination dictionary - catDict.dictLookup("Dests", &dests); - - // read root of named destination tree - if (catDict.dictLookup("Names", &obj)->isDict()) - obj.dictLookup("Dests", &nameTree); - else - nameTree.initNull(); - obj.free(); - - // read base URI - if (catDict.dictLookup("URI", &obj)->isDict()) { - if (obj.dictLookup("Base", &obj2)->isString()) { - baseURI = obj2.getString()->copy(); - } - obj2.free(); - } - obj.free(); - - // get the metadata stream - catDict.dictLookup("Metadata", &metadata); - - // get the structure tree root - catDict.dictLookup("StructTreeRoot", &structTreeRoot); - - // get the outline dictionary - catDict.dictLookup("Outlines", &outline); - - // get the AcroForm dictionary - catDict.dictLookup("AcroForm", &acroForm); - - catDict.free(); - return; - - err3: - obj.free(); - err2: - pagesDict.free(); - err1: - catDict.free(); - dests.initNull(); - nameTree.initNull(); - ok = gFalse; -} - -Catalog::~Catalog() { - int i; - - if (pages) { - for (i = 0; i < pagesSize; ++i) { - if (pages[i]) { - delete pages[i]; - } - } - gfree(pages); - gfree(pageRefs); - } - dests.free(); - nameTree.free(); - if (baseURI) { - delete baseURI; - } - metadata.free(); - structTreeRoot.free(); - outline.free(); - acroForm.free(); -} - -GString *Catalog::readMetadata() { - GString *s; - Dict *dict; - Object obj; - int c; - - if (!metadata.isStream()) { - return NULL; - } - dict = metadata.streamGetDict(); - if (!dict->lookup("Subtype", &obj)->isName("XML")) { - error(-1, "Unknown Metadata type: '%s'", - obj.isName() ? obj.getName() : "???"); - } - obj.free(); - s = new GString(); - metadata.streamReset(); - while ((c = metadata.streamGetChar()) != EOF) { - s->append(c); - } - metadata.streamClose(); - return s; -} - -int Catalog::readPageTree(Dict *pagesDict, PageAttrs *attrs, int start, - char *alreadyRead) { - Object kids; - Object kid; - Object kidRef; - PageAttrs *attrs1, *attrs2; - Page *page; - int i, j; - - attrs1 = new PageAttrs(attrs, pagesDict); - pagesDict->lookup("Kids", &kids); - if (!kids.isArray()) { - error(-1, "Kids object (page %d) is wrong type (%s)", - start+1, kids.getTypeName()); - return start; - } - for (i = 0; i < kids.arrayGetLength(); ++i) { - kids.arrayGetNF(i, &kidRef); - if (kidRef.isRef() && - kidRef.getRefNum() >= 0 && - kidRef.getRefNum() < xref->getNumObjects()) { - if (alreadyRead[kidRef.getRefNum()]) { - error(-1, "Loop in Pages tree"); - kidRef.free(); - continue; - } - alreadyRead[kidRef.getRefNum()] = 1; - } - kids.arrayGet(i, &kid); - if (kid.isDict("Page")) { - attrs2 = new PageAttrs(attrs1, kid.getDict()); - page = new Page(xref, start+1, kid.getDict(), attrs2); - if (!page->isOk()) { - ++start; - goto err3; - } - if (start >= pagesSize) { - pagesSize += 32; - pages = (Page **)greallocn(pages, pagesSize, sizeof(Page *)); - pageRefs = (Ref *)greallocn(pageRefs, pagesSize, sizeof(Ref)); - for (j = pagesSize - 32; j < pagesSize; ++j) { - pages[j] = NULL; - pageRefs[j].num = -1; - pageRefs[j].gen = -1; - } - } - pages[start] = page; - if (kidRef.isRef()) { - pageRefs[start].num = kidRef.getRefNum(); - pageRefs[start].gen = kidRef.getRefGen(); - } - ++start; - // This should really be isDict("Pages"), but I've seen at least one - // PDF file where the /Type entry is missing. - } else if (kid.isDict()) { - if ((start = readPageTree(kid.getDict(), attrs1, start, alreadyRead)) - < 0) - goto err2; - } else { - error(-1, "Kid object (page %d) is wrong type (%s)", - start+1, kid.getTypeName()); - } - kid.free(); - kidRef.free(); - } - delete attrs1; - kids.free(); - return start; - - err3: - delete page; - err2: - kid.free(); - err1: - kids.free(); - delete attrs1; - ok = gFalse; - return -1; -} - -int Catalog::findPage(int num, int gen) { - int i; - - for (i = 0; i < numPages; ++i) { - if (pageRefs[i].num == num && pageRefs[i].gen == gen) - return i + 1; - } - return 0; -} - -LinkDest *Catalog::findDest(GString *name) { - LinkDest *dest; - Object obj1, obj2; - GBool found; - - // try named destination dictionary then name tree - found = gFalse; - if (dests.isDict()) { - if (!dests.dictLookup(name->getCString(), &obj1)->isNull()) - found = gTrue; - else - obj1.free(); - } - if (!found && nameTree.isDict()) { - if (!findDestInTree(&nameTree, name, &obj1)->isNull()) - found = gTrue; - else - obj1.free(); - } - if (!found) - return NULL; - - // construct LinkDest - dest = NULL; - if (obj1.isArray()) { - dest = new LinkDest(obj1.getArray()); - } else if (obj1.isDict()) { - if (obj1.dictLookup("D", &obj2)->isArray()) - dest = new LinkDest(obj2.getArray()); - else - error(-1, "Bad named destination value"); - obj2.free(); - } else { - error(-1, "Bad named destination value"); - } - obj1.free(); - if (dest && !dest->isOk()) { - delete dest; - dest = NULL; - } - - return dest; -} - -Object *Catalog::findDestInTree(Object *tree, GString *name, Object *obj) { - Object names, name1; - Object kids, kid, limits, low, high; - GBool done, found; - int cmp, i; - - // leaf node - if (tree->dictLookup("Names", &names)->isArray()) { - done = found = gFalse; - for (i = 0; !done && i < names.arrayGetLength(); i += 2) { - if (names.arrayGet(i, &name1)->isString()) { - cmp = name->cmp(name1.getString()); - if (cmp == 0) { - names.arrayGet(i+1, obj); - found = gTrue; - done = gTrue; - } else if (cmp < 0) { - done = gTrue; - } - } - name1.free(); - } - names.free(); - if (!found) - obj->initNull(); - return obj; - } - names.free(); - - // root or intermediate node - done = gFalse; - if (tree->dictLookup("Kids", &kids)->isArray()) { - for (i = 0; !done && i < kids.arrayGetLength(); ++i) { - if (kids.arrayGet(i, &kid)->isDict()) { - if (kid.dictLookup("Limits", &limits)->isArray()) { - if (limits.arrayGet(0, &low)->isString() && - name->cmp(low.getString()) >= 0) { - if (limits.arrayGet(1, &high)->isString() && - name->cmp(high.getString()) <= 0) { - findDestInTree(&kid, name, obj); - done = gTrue; - } - high.free(); - } - low.free(); - } - limits.free(); - } - kid.free(); - } - } - kids.free(); - - // name was outside of ranges of all kids - if (!done) - obj->initNull(); - - return obj; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.h deleted file mode 100644 index 6403194f9..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Catalog.h +++ /dev/null @@ -1,97 +0,0 @@ -//======================================================================== -// -// Catalog.h -// -// Copyright 1996-2007 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef CATALOG_H -#define CATALOG_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -class XRef; -class Object; -class Page; -class PageAttrs; -struct Ref; -class LinkDest; - -//------------------------------------------------------------------------ -// Catalog -//------------------------------------------------------------------------ - -class Catalog { -public: - - // Constructor. - Catalog(XRef *xrefA); - - // Destructor. - ~Catalog(); - - // Is catalog valid? - GBool isOk() { return ok; } - - // Get number of pages. - int getNumPages() { return numPages; } - - // Get a page. - Page *getPage(int i) { return pages[i-1]; } - - // Get the reference for a page object. - Ref *getPageRef(int i) { return &pageRefs[i-1]; } - - // Return base URI, or NULL if none. - GString *getBaseURI() { return baseURI; } - - // Return the contents of the metadata stream, or NULL if there is - // no metadata. - GString *readMetadata(); - - // Return the structure tree root object. - Object *getStructTreeRoot() { return &structTreeRoot; } - - // Find a page, given its object ID. Returns page number, or 0 if - // not found. - int findPage(int num, int gen); - - // Find a named destination. Returns the link destination, or - // NULL if is not a destination. - LinkDest *findDest(GString *name); - - Object *getDests() { return &dests; } - - Object *getNameTree() { return &nameTree; } - - Object *getOutline() { return &outline; } - - Object *getAcroForm() { return &acroForm; } - -private: - - XRef *xref; // the xref table for this PDF file - Page **pages; // array of pages - Ref *pageRefs; // object ID for each page - int numPages; // number of pages - int pagesSize; // size of pages array - Object dests; // named destination dictionary - Object nameTree; // name tree - GString *baseURI; // base URI for URI-type links - Object metadata; // metadata stream - Object structTreeRoot; // structure tree root dictionary - Object outline; // outline dictionary - Object acroForm; // AcroForm dictionary - GBool ok; // true if catalog is valid - - int readPageTree(Dict *pages, PageAttrs *attrs, int start, - char *alreadyRead); - Object *findDestInTree(Object *tree, GString *name, Object *obj); -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.cc deleted file mode 100644 index a428b0086..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.cc +++ /dev/null @@ -1,553 +0,0 @@ -//======================================================================== -// -// CharCodeToUnicode.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "gfile.h" -#include "GString.h" -#include "Error.h" -#include "GlobalParams.h" -#include "PSTokenizer.h" -#include "CharCodeToUnicode.h" - -//------------------------------------------------------------------------ - -#define maxUnicodeString 8 - -struct CharCodeToUnicodeString { - CharCode c; - Unicode u[maxUnicodeString]; - int len; -}; - -//------------------------------------------------------------------------ - -static int getCharFromString(void *data) { - char *p; - int c; - - p = *(char **)data; - if (*p) { - c = *p++; - *(char **)data = p; - } else { - c = EOF; - } - return c; -} - -static int getCharFromFile(void *data) { - return fgetc((FILE *)data); -} - -//------------------------------------------------------------------------ - -CharCodeToUnicode *CharCodeToUnicode::parseCIDToUnicode(GString *fileName, - GString *collection) { - FILE *f; - Unicode *mapA; - CharCode size, mapLenA; - char buf[64]; - Unicode u; - CharCodeToUnicode *ctu; - - if (!(f = fopen(fileName->getCString(), "r"))) { - error(-1, "Couldn't open cidToUnicode file '%s'", - fileName->getCString()); - return NULL; - } - - size = 32768; - mapA = (Unicode *)gmallocn(size, sizeof(Unicode)); - mapLenA = 0; - - while (getLine(buf, sizeof(buf), f)) { - if (mapLenA == size) { - size *= 2; - mapA = (Unicode *)greallocn(mapA, size, sizeof(Unicode)); - } - if (sscanf(buf, "%x", &u) == 1) { - mapA[mapLenA] = u; - } else { - error(-1, "Bad line (%d) in cidToUnicode file '%s'", - (int)(mapLenA + 1), fileName->getCString()); - mapA[mapLenA] = 0; - } - ++mapLenA; - } - fclose(f); - - ctu = new CharCodeToUnicode(collection->copy(), mapA, mapLenA, gTrue, - NULL, 0, 0); - gfree(mapA); - return ctu; -} - -CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode( - GString *fileName) { - FILE *f; - Unicode *mapA; - CharCodeToUnicodeString *sMapA; - CharCode size, oldSize, len, sMapSizeA, sMapLenA; - char buf[256]; - char *tok; - Unicode u0; - Unicode uBuf[maxUnicodeString]; - CharCodeToUnicode *ctu; - int line, n, i; - - if (!(f = fopen(fileName->getCString(), "r"))) { - error(-1, "Couldn't open unicodeToUnicode file '%s'", - fileName->getCString()); - return NULL; - } - - size = 4096; - mapA = (Unicode *)gmallocn(size, sizeof(Unicode)); - memset(mapA, 0, size * sizeof(Unicode)); - len = 0; - sMapA = NULL; - sMapSizeA = sMapLenA = 0; - - line = 0; - while (getLine(buf, sizeof(buf), f)) { - ++line; - if (!(tok = strtok(buf, " \t\r\n")) || - sscanf(tok, "%x", &u0) != 1) { - error(-1, "Bad line (%d) in unicodeToUnicode file '%s'", - line, fileName->getCString()); - continue; - } - n = 0; - while (n < maxUnicodeString) { - if (!(tok = strtok(NULL, " \t\r\n"))) { - break; - } - if (sscanf(tok, "%x", &uBuf[n]) != 1) { - error(-1, "Bad line (%d) in unicodeToUnicode file '%s'", - line, fileName->getCString()); - break; - } - ++n; - } - if (n < 1) { - error(-1, "Bad line (%d) in unicodeToUnicode file '%s'", - line, fileName->getCString()); - continue; - } - if (u0 >= size) { - oldSize = size; - while (u0 >= size) { - size *= 2; - } - mapA = (Unicode *)greallocn(mapA, size, sizeof(Unicode)); - memset(mapA + oldSize, 0, (size - oldSize) * sizeof(Unicode)); - } - if (n == 1) { - mapA[u0] = uBuf[0]; - } else { - mapA[u0] = 0; - if (sMapLenA == sMapSizeA) { - sMapSizeA += 16; - sMapA = (CharCodeToUnicodeString *) - greallocn(sMapA, sMapSizeA, sizeof(CharCodeToUnicodeString)); - } - sMapA[sMapLenA].c = u0; - for (i = 0; i < n; ++i) { - sMapA[sMapLenA].u[i] = uBuf[i]; - } - sMapA[sMapLenA].len = n; - ++sMapLenA; - } - if (u0 >= len) { - len = u0 + 1; - } - } - fclose(f); - - ctu = new CharCodeToUnicode(fileName->copy(), mapA, len, gTrue, - sMapA, sMapLenA, sMapSizeA); - gfree(mapA); - return ctu; -} - -CharCodeToUnicode *CharCodeToUnicode::make8BitToUnicode(Unicode *toUnicode) { - return new CharCodeToUnicode(NULL, toUnicode, 256, gTrue, NULL, 0, 0); -} - -CharCodeToUnicode *CharCodeToUnicode::parseCMap(GString *buf, int nBits) { - CharCodeToUnicode *ctu; - char *p; - - ctu = new CharCodeToUnicode(NULL); - p = buf->getCString(); - ctu->parseCMap1(&getCharFromString, &p, nBits); - return ctu; -} - -void CharCodeToUnicode::mergeCMap(GString *buf, int nBits) { - char *p; - - p = buf->getCString(); - parseCMap1(&getCharFromString, &p, nBits); -} - -void CharCodeToUnicode::parseCMap1(int (*getCharFunc)(void *), void *data, - int nBits) { - PSTokenizer *pst; - char tok1[256], tok2[256], tok3[256]; - int maxCode, n1, n2, n3; - CharCode i; - CharCode code1, code2; - GString *name; - FILE *f; - - maxCode = (nBits == 8) ? 0xff : (nBits == 16) ? 0xffff : 0xffffffff; - pst = new PSTokenizer(getCharFunc, data); - pst->getToken(tok1, sizeof(tok1), &n1); - while (pst->getToken(tok2, sizeof(tok2), &n2)) { - if (!strcmp(tok2, "usecmap")) { - if (tok1[0] == '/') { - name = new GString(tok1 + 1); - if ((f = globalParams->findToUnicodeFile(name))) { - parseCMap1(&getCharFromFile, f, nBits); - fclose(f); - } else { - error(-1, "Couldn't find ToUnicode CMap file for '%s'", - name->getCString()); - } - delete name; - } - pst->getToken(tok1, sizeof(tok1), &n1); - } else if (!strcmp(tok2, "beginbfchar")) { - while (pst->getToken(tok1, sizeof(tok1), &n1)) { - if (!strcmp(tok1, "endbfchar")) { - break; - } - if (!pst->getToken(tok2, sizeof(tok2), &n2) || - !strcmp(tok2, "endbfchar")) { - error(-1, "Illegal entry in bfchar block in ToUnicode CMap"); - break; - } - if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && - tok2[0] == '<' && tok2[n2 - 1] == '>')) { - error(-1, "Illegal entry in bfchar block in ToUnicode CMap."); - continue; - } - tok1[n1 - 1] = tok2[n2 - 1] = '\0'; - if (sscanf(tok1 + 1, "%x", &code1) != 1) { - error(-1, "Illegal entry in bfchar block in ToUnicode CMap"); - continue; - } - if (code1 > maxCode) { - error(-1, "Invalid entry in bfchar block in ToUnicode CMap"); - } - addMapping(code1, tok2 + 1, n2 - 2, 0); - } - pst->getToken(tok1, sizeof(tok1), &n1); - } else if (!strcmp(tok2, "beginbfrange")) { - while (pst->getToken(tok1, sizeof(tok1), &n1)) { - if (!strcmp(tok1, "endbfrange")) { - break; - } - if (!pst->getToken(tok2, sizeof(tok2), &n2) || - !strcmp(tok2, "endbfrange") || - !pst->getToken(tok3, sizeof(tok3), &n3) || - !strcmp(tok3, "endbfrange")) { - error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); - break; - } - if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' && - tok2[0] == '<' && tok2[n2 - 1] == '>')) { - error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); - continue; - } - tok1[n1 - 1] = tok2[n2 - 1] = '\0'; - if (sscanf(tok1 + 1, "%x", &code1) != 1 || - sscanf(tok2 + 1, "%x", &code2) != 1) { - error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); - continue; - } - if (code1 > maxCode || code2 > maxCode) { - error(-1, "Invalid entry in bfrange block in ToUnicode CMap"); - } - - if (!strcmp(tok3, "[")) { - i = 0; - while (pst->getToken(tok1, sizeof(tok1), &n1) && - code1 + i <= code2) { - if (!strcmp(tok1, "]")) { - break; - } - if (tok1[0] == '<' && tok1[n1 - 1] == '>') { - tok1[n1 - 1] = '\0'; - addMapping(code1 + i, tok1 + 1, n1 - 2, 0); - } else { - error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); - } - ++i; - } - } else if (tok3[0] == '<' && tok3[n3 - 1] == '>') { - tok3[n3 - 1] = '\0'; - for (i = 0; code1 <= code2; ++code1, ++i) { - addMapping(code1, tok3 + 1, n3 - 2, i); - } - - } else { - error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); - } - } - pst->getToken(tok1, sizeof(tok1), &n1); - } else { - strcpy(tok1, tok2); - } - } - delete pst; -} - -void CharCodeToUnicode::addMapping(CharCode code, char *uStr, int n, - int offset) { - CharCode oldLen, i; - Unicode u; - char uHex[5]; - int j; - - if (code >= mapLen) { - oldLen = mapLen; - mapLen = (code + 256) & ~255; - Unicode *oldmap; - map = (Unicode *)greallocn(map, mapLen, sizeof(Unicode)); - if(!map) { - /* we sometimes get overflows for files trying to use 0xffffffff as charcode */ - map = oldmap; - return; - } - for (i = oldLen; i < mapLen; ++i) { - map[i] = 0; - } - } - if (n <= 4) { - if (sscanf(uStr, "%x", &u) != 1) { - error(-1, "Illegal entry in ToUnicode CMap"); - return; - } - map[code] = u + offset; - } else { - if (sMapLen >= sMapSize) { - sMapSize = sMapSize + 16; - sMap = (CharCodeToUnicodeString *) - greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString)); - } - map[code] = 0; - sMap[sMapLen].c = code; - sMap[sMapLen].len = n / 4; - for (j = 0; j < sMap[sMapLen].len && j < maxUnicodeString; ++j) { - strncpy(uHex, uStr + j*4, 4); - uHex[4] = '\0'; - if (sscanf(uHex, "%x", &sMap[sMapLen].u[j]) != 1) { - error(-1, "Illegal entry in ToUnicode CMap"); - } - } - sMap[sMapLen].u[sMap[sMapLen].len - 1] += offset; - ++sMapLen; - } -} - -CharCodeToUnicode::CharCodeToUnicode(GString *tagA) { - CharCode i; - - tag = tagA; - mapLen = 256; - map = (Unicode *)gmallocn(mapLen, sizeof(Unicode)); - for (i = 0; i < mapLen; ++i) { - map[i] = 0; - } - sMap = NULL; - sMapLen = sMapSize = 0; - refCnt = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -CharCodeToUnicode::CharCodeToUnicode(GString *tagA, Unicode *mapA, - CharCode mapLenA, GBool copyMap, - CharCodeToUnicodeString *sMapA, - int sMapLenA, int sMapSizeA) { - tag = tagA; - mapLen = mapLenA; - if (copyMap) { - map = (Unicode *)gmallocn(mapLen, sizeof(Unicode)); - memcpy(map, mapA, mapLen * sizeof(Unicode)); - } else { - map = mapA; - } - sMap = sMapA; - sMapLen = sMapLenA; - sMapSize = sMapSizeA; - refCnt = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -CharCodeToUnicode::~CharCodeToUnicode() { - if (tag) { - delete tag; - } - gfree(map); - if (sMap) { - gfree(sMap); - } -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -void CharCodeToUnicode::incRefCnt() { -#if MULTITHREADED - gLockMutex(&mutex); -#endif - ++refCnt; -#if MULTITHREADED - gUnlockMutex(&mutex); -#endif -} - -void CharCodeToUnicode::decRefCnt() { - GBool done; - -#if MULTITHREADED - gLockMutex(&mutex); -#endif - done = --refCnt == 0; -#if MULTITHREADED - gUnlockMutex(&mutex); -#endif - if (done) { - delete this; - } -} - -GBool CharCodeToUnicode::match(GString *tagA) { - return tag && !tag->cmp(tagA); -} - -void CharCodeToUnicode::setMapping(CharCode c, Unicode *u, int len) { - int i, j; - - if (len == 1) { - map[c] = u[0]; - } else { - for (i = 0; i < sMapLen; ++i) { - if (sMap[i].c == c) { - break; - } - } - if (i == sMapLen) { - if (sMapLen == sMapSize) { - sMapSize += 8; - sMap = (CharCodeToUnicodeString *) - greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString)); - } - ++sMapLen; - } - map[c] = 0; - sMap[i].c = c; - sMap[i].len = len; - for (j = 0; j < len && j < maxUnicodeString; ++j) { - sMap[i].u[j] = u[j]; - } - } -} - -int CharCodeToUnicode::mapToUnicode(CharCode c, Unicode *u, int size) { - int i, j; - - if (c >= mapLen) { - return 0; - } - if (map[c]) { - u[0] = map[c]; - return 1; - } - for (i = 0; i < sMapLen; ++i) { - if (sMap[i].c == c) { - for (j = 0; j < sMap[i].len && j < size; ++j) { - u[j] = sMap[i].u[j]; - } - return j; - } - } - return 0; -} - -//------------------------------------------------------------------------ - -CharCodeToUnicodeCache::CharCodeToUnicodeCache(int sizeA) { - int i; - - size = sizeA; - cache = (CharCodeToUnicode **)gmallocn(size, sizeof(CharCodeToUnicode *)); - for (i = 0; i < size; ++i) { - cache[i] = NULL; - } -} - -CharCodeToUnicodeCache::~CharCodeToUnicodeCache() { - int i; - - for (i = 0; i < size; ++i) { - if (cache[i]) { - cache[i]->decRefCnt(); - } - } - gfree(cache); -} - -CharCodeToUnicode *CharCodeToUnicodeCache::getCharCodeToUnicode(GString *tag) { - CharCodeToUnicode *ctu; - int i, j; - - if (cache[0] && cache[0]->match(tag)) { - cache[0]->incRefCnt(); - return cache[0]; - } - for (i = 1; i < size; ++i) { - if (cache[i] && cache[i]->match(tag)) { - ctu = cache[i]; - for (j = i; j >= 1; --j) { - cache[j] = cache[j - 1]; - } - cache[0] = ctu; - ctu->incRefCnt(); - return ctu; - } - } - return NULL; -} - -void CharCodeToUnicodeCache::add(CharCodeToUnicode *ctu) { - int i; - - if (cache[size - 1]) { - cache[size - 1]->decRefCnt(); - } - for (i = size - 1; i >= 1; --i) { - cache[i] = cache[i - 1]; - } - cache[0] = ctu; - ctu->incRefCnt(); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.h deleted file mode 100644 index 04852aea8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharCodeToUnicode.h +++ /dev/null @@ -1,117 +0,0 @@ -//======================================================================== -// -// CharCodeToUnicode.h -// -// Mapping from character codes to Unicode. -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef CHARCODETOUNICODE_H -#define CHARCODETOUNICODE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "CharTypes.h" - -#if MULTITHREADED -#include "GMutex.h" -#endif - -struct CharCodeToUnicodeString; - -//------------------------------------------------------------------------ - -class CharCodeToUnicode { -public: - - // Read the CID-to-Unicode mapping for from the file - // specified by . Sets the initial reference count to 1. - // Returns NULL on failure. - static CharCodeToUnicode *parseCIDToUnicode(GString *fileName, - GString *collection); - - // Create a Unicode-to-Unicode mapping from the file specified by - // . Sets the initial reference count to 1. Returns NULL - // on failure. - static CharCodeToUnicode *parseUnicodeToUnicode(GString *fileName); - - // Create the CharCode-to-Unicode mapping for an 8-bit font. - // is an array of 256 Unicode indexes. Sets the initial - // reference count to 1. - static CharCodeToUnicode *make8BitToUnicode(Unicode *toUnicode); - - // Parse a ToUnicode CMap for an 8- or 16-bit font. - static CharCodeToUnicode *parseCMap(GString *buf, int nBits); - - // Parse a ToUnicode CMap for an 8- or 16-bit font, merging it into - // . - void mergeCMap(GString *buf, int nBits); - - ~CharCodeToUnicode(); - - void incRefCnt(); - void decRefCnt(); - - // Return true if this mapping matches the specified . - GBool match(GString *tagA); - - // Set the mapping for . - void setMapping(CharCode c, Unicode *u, int len); - - // Map a CharCode to Unicode. - int mapToUnicode(CharCode c, Unicode *u, int size); - - // Return the mapping's length, i.e., one more than the max char - // code supported by the mapping. - CharCode getLength() { return mapLen; } - -private: - - void parseCMap1(int (*getCharFunc)(void *), void *data, int nBits); - void addMapping(CharCode code, char *uStr, int n, int offset); - CharCodeToUnicode(GString *tagA); - CharCodeToUnicode(GString *tagA, Unicode *mapA, - CharCode mapLenA, GBool copyMap, - CharCodeToUnicodeString *sMapA, - int sMapLenA, int sMapSizeA); - - GString *tag; - Unicode *map; - CharCode mapLen; - CharCodeToUnicodeString *sMap; - int sMapLen, sMapSize; - int refCnt; -#if MULTITHREADED - GMutex mutex; -#endif -}; - -//------------------------------------------------------------------------ - -class CharCodeToUnicodeCache { -public: - - CharCodeToUnicodeCache(int sizeA); - ~CharCodeToUnicodeCache(); - - // Get the CharCodeToUnicode object for . Increments its - // reference count; there will be one reference for the cache plus - // one for the caller of this function. Returns NULL on failure. - CharCodeToUnicode *getCharCodeToUnicode(GString *tag); - - // Insert into the cache, in the most-recently-used position. - void add(CharCodeToUnicode *ctu); - -private: - - CharCodeToUnicode **cache; - int size; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharTypes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharTypes.h deleted file mode 100644 index d0df630d0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/CharTypes.h +++ /dev/null @@ -1,24 +0,0 @@ -//======================================================================== -// -// CharTypes.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef CHARTYPES_H -#define CHARTYPES_H - -// Unicode character. -typedef unsigned int Unicode; - -// Character ID for CID character collections. -typedef unsigned int CID; - -// This is large enough to hold any of the following: -// - 8-bit char code -// - 16-bit CID -// - Unicode -typedef unsigned int CharCode; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.cc deleted file mode 100644 index b561aa569..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.cc +++ /dev/null @@ -1,777 +0,0 @@ -//======================================================================== -// -// Decrypt.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "gmem.h" -#include "Decrypt.h" - -static void rc4InitKey(Guchar *key, int keyLen, Guchar *state); -static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c); -static void aesKeyExpansion(DecryptAESState *s, - Guchar *objKey, int objKeyLen); -static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last); -static void md5(Guchar *msg, int msgLen, Guchar *digest); - -static Guchar passwordPad[32] = { - 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, - 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, - 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, - 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a -}; - -//------------------------------------------------------------------------ -// Decrypt -//------------------------------------------------------------------------ - -GBool Decrypt::makeFileKey(int encVersion, int encRevision, int keyLength, - GString *ownerKey, GString *userKey, - int permissions, GString *fileID, - GString *ownerPassword, GString *userPassword, - Guchar *fileKey, GBool encryptMetadata, - GBool *ownerPasswordOk) { - Guchar test[32], test2[32]; - GString *userPassword2; - Guchar fState[256]; - Guchar tmpKey[16]; - Guchar fx, fy; - int len, i, j; - - // try using the supplied owner password to generate the user password - *ownerPasswordOk = gFalse; - if (ownerPassword) { - len = ownerPassword->getLength(); - if (len < 32) { - memcpy(test, ownerPassword->getCString(), len); - memcpy(test + len, passwordPad, 32 - len); - } else { - memcpy(test, ownerPassword->getCString(), 32); - } - md5(test, 32, test); - if (encRevision == 3) { - for (i = 0; i < 50; ++i) { - md5(test, 16, test); - } - } - if (encRevision == 2) { - rc4InitKey(test, keyLength, fState); - fx = fy = 0; - for (i = 0; i < 32; ++i) { - test2[i] = rc4DecryptByte(fState, &fx, &fy, ownerKey->getChar(i)); - } - } else { - memcpy(test2, ownerKey->getCString(), 32); - for (i = 19; i >= 0; --i) { - for (j = 0; j < keyLength; ++j) { - tmpKey[j] = test[j] ^ i; - } - rc4InitKey(tmpKey, keyLength, fState); - fx = fy = 0; - for (j = 0; j < 32; ++j) { - test2[j] = rc4DecryptByte(fState, &fx, &fy, test2[j]); - } - } - } - userPassword2 = new GString((char *)test2, 32); - if (makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey, - permissions, fileID, userPassword2, fileKey, - encryptMetadata)) { - *ownerPasswordOk = gTrue; - delete userPassword2; - return gTrue; - } - delete userPassword2; - } - - // try using the supplied user password - return makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey, - permissions, fileID, userPassword, fileKey, - encryptMetadata); -} - -GBool Decrypt::makeFileKey2(int encVersion, int encRevision, int keyLength, - GString *ownerKey, GString *userKey, - int permissions, GString *fileID, - GString *userPassword, Guchar *fileKey, - GBool encryptMetadata) { - Guchar *buf; - Guchar test[32]; - Guchar fState[256]; - Guchar tmpKey[16]; - Guchar fx, fy; - int len, i, j; - GBool ok; - - // generate file key - buf = (Guchar *)gmalloc(72 + fileID->getLength()); - if (userPassword) { - len = userPassword->getLength(); - if (len < 32) { - memcpy(buf, userPassword->getCString(), len); - memcpy(buf + len, passwordPad, 32 - len); - } else { - memcpy(buf, userPassword->getCString(), 32); - } - } else { - memcpy(buf, passwordPad, 32); - } - memcpy(buf + 32, ownerKey->getCString(), 32); - buf[64] = permissions & 0xff; - buf[65] = (permissions >> 8) & 0xff; - buf[66] = (permissions >> 16) & 0xff; - buf[67] = (permissions >> 24) & 0xff; - memcpy(buf + 68, fileID->getCString(), fileID->getLength()); - len = 68 + fileID->getLength(); - if (!encryptMetadata) { - buf[len++] = 0xff; - buf[len++] = 0xff; - buf[len++] = 0xff; - buf[len++] = 0xff; - } - md5(buf, len, fileKey); - if (encRevision == 3) { - for (i = 0; i < 50; ++i) { - md5(fileKey, keyLength, fileKey); - } - } - - // test user password - if (encRevision == 2) { - rc4InitKey(fileKey, keyLength, fState); - fx = fy = 0; - for (i = 0; i < 32; ++i) { - test[i] = rc4DecryptByte(fState, &fx, &fy, userKey->getChar(i)); - } - ok = memcmp(test, passwordPad, 32) == 0; - } else if (encRevision == 3) { - memcpy(test, userKey->getCString(), 32); - for (i = 19; i >= 0; --i) { - for (j = 0; j < keyLength; ++j) { - tmpKey[j] = fileKey[j] ^ i; - } - rc4InitKey(tmpKey, keyLength, fState); - fx = fy = 0; - for (j = 0; j < 32; ++j) { - test[j] = rc4DecryptByte(fState, &fx, &fy, test[j]); - } - } - memcpy(buf, passwordPad, 32); - memcpy(buf + 32, fileID->getCString(), fileID->getLength()); - md5(buf, 32 + fileID->getLength(), buf); - ok = memcmp(test, buf, 16) == 0; - } else { - ok = gFalse; - } - - gfree(buf); - return ok; -} - -//------------------------------------------------------------------------ -// DecryptStream -//------------------------------------------------------------------------ - -DecryptStream::DecryptStream(Stream *strA, Guchar *fileKey, - CryptAlgorithm algoA, int keyLength, - int objNum, int objGen): - FilterStream(strA) -{ - int n, i; - - algo = algoA; - - // construct object key - for (i = 0; i < keyLength; ++i) { - objKey[i] = fileKey[i]; - } - objKey[keyLength] = objNum & 0xff; - objKey[keyLength + 1] = (objNum >> 8) & 0xff; - objKey[keyLength + 2] = (objNum >> 16) & 0xff; - objKey[keyLength + 3] = objGen & 0xff; - objKey[keyLength + 4] = (objGen >> 8) & 0xff; - if (algo == cryptAES) { - objKey[keyLength + 5] = 0x73; // 's' - objKey[keyLength + 6] = 0x41; // 'A' - objKey[keyLength + 7] = 0x6c; // 'l' - objKey[keyLength + 8] = 0x54; // 'T' - n = keyLength + 9; - } else { - n = keyLength + 5; - } - md5(objKey, n, objKey); - if ((objKeyLength = keyLength + 5) > 16) { - objKeyLength = 16; - } -} - -DecryptStream::~DecryptStream() { - delete str; -} - -void DecryptStream::reset() { - int i; - - str->reset(); - switch (algo) { - case cryptRC4: - state.rc4.x = state.rc4.y = 0; - rc4InitKey(objKey, objKeyLength, state.rc4.state); - state.rc4.buf = EOF; - break; - case cryptAES: - aesKeyExpansion(&state.aes, objKey, objKeyLength); - for (i = 0; i < 16; ++i) { - state.aes.cbc[i] = str->getChar(); - } - state.aes.bufIdx = 16; - break; - } -} - -int DecryptStream::getChar() { - Guchar in[16]; - int c, i; - - c = EOF; // make gcc happy - switch (algo) { - case cryptRC4: - if (state.rc4.buf == EOF) { - c = str->getChar(); - if (c != EOF) { - state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x, - &state.rc4.y, (Guchar)c); - } - } - c = state.rc4.buf; - state.rc4.buf = EOF; - break; - case cryptAES: - if (state.aes.bufIdx == 16) { - for (i = 0; i < 16; ++i) { - if ((c = str->getChar()) == EOF) { - return EOF; - } - in[i] = (Guchar)c; - } - aesDecryptBlock(&state.aes, in, str->lookChar() == EOF); - } - if (state.aes.bufIdx == 16) { - c = EOF; - } else { - c = state.aes.buf[state.aes.bufIdx++]; - } - break; - } - return c; -} - -int DecryptStream::lookChar() { - Guchar in[16]; - int c, i; - - c = EOF; // make gcc happy - switch (algo) { - case cryptRC4: - if (state.rc4.buf == EOF) { - c = str->getChar(); - if (c != EOF) { - state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x, - &state.rc4.y, (Guchar)c); - } - } - c = state.rc4.buf; - break; - case cryptAES: - if (state.aes.bufIdx == 16) { - for (i = 0; i < 16; ++i) { - if ((c = str->getChar()) == EOF) { - return EOF; - } - in[i] = c; - } - aesDecryptBlock(&state.aes, in, str->lookChar() == EOF); - } - if (state.aes.bufIdx == 16) { - c = EOF; - } else { - c = state.aes.buf[state.aes.bufIdx]; - } - break; - } - return c; -} - -GBool DecryptStream::isBinary(GBool last) { - return str->isBinary(last); -} - -//------------------------------------------------------------------------ -// RC4-compatible decryption -//------------------------------------------------------------------------ - -static void rc4InitKey(Guchar *key, int keyLen, Guchar *state) { - Guchar index1, index2; - Guchar t; - int i; - - for (i = 0; i < 256; ++i) - state[i] = i; - index1 = index2 = 0; - for (i = 0; i < 256; ++i) { - index2 = (key[index1] + state[i] + index2) % 256; - t = state[i]; - state[i] = state[index2]; - state[index2] = t; - index1 = (index1 + 1) % keyLen; - } -} - -static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c) { - Guchar x1, y1, tx, ty; - - x1 = *x = (*x + 1) % 256; - y1 = *y = (state[*x] + *y) % 256; - tx = state[x1]; - ty = state[y1]; - state[x1] = ty; - state[y1] = tx; - return c ^ state[(tx + ty) % 256]; -} - -//------------------------------------------------------------------------ -// AES decryption -//------------------------------------------------------------------------ - -static Guchar sbox[256] = { - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 -}; - -static Guchar invSbox[256] = { - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, - 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, - 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, - 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, - 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, - 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, - 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, - 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, - 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, - 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, - 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d -}; - -static Guint rcon[11] = { - 0x00000000, // unused - 0x01000000, - 0x02000000, - 0x04000000, - 0x08000000, - 0x10000000, - 0x20000000, - 0x40000000, - 0x80000000, - 0x1b000000, - 0x36000000 -}; - -static inline Guint subWord(Guint x) { - return (sbox[x >> 24] << 24) - | (sbox[(x >> 16) & 0xff] << 16) - | (sbox[(x >> 8) & 0xff] << 8) - | sbox[x & 0xff]; -} - -static inline Guint rotWord(Guint x) { - return ((x << 8) & 0xffffffff) | (x >> 24); -} - -static inline void invSubBytes(Guchar *state) { - int i; - - for (i = 0; i < 16; ++i) { - state[i] = invSbox[state[i]]; - } -} - -static inline void invShiftRows(Guchar *state) { - Guchar t; - - t = state[7]; - state[7] = state[6]; - state[6] = state[5]; - state[5] = state[4]; - state[4] = t; - - t = state[8]; - state[8] = state[10]; - state[10] = t; - t = state[9]; - state[9] = state[11]; - state[11] = t; - - t = state[12]; - state[12] = state[13]; - state[13] = state[14]; - state[14] = state[15]; - state[15] = t; -} - -// {09} \cdot s -static inline Guchar mul09(Guchar s) { - Guchar s2, s4, s8; - - s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); - s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); - s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); - return s ^ s8; -} - -// {0b} \cdot s -static inline Guchar mul0b(Guchar s) { - Guchar s2, s4, s8; - - s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); - s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); - s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); - return s ^ s2 ^ s8; -} - -// {0d} \cdot s -static inline Guchar mul0d(Guchar s) { - Guchar s2, s4, s8; - - s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); - s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); - s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); - return s ^ s4 ^ s8; -} - -// {0e} \cdot s -static inline Guchar mul0e(Guchar s) { - Guchar s2, s4, s8; - - s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); - s4 = (s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1); - s8 = (s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1); - return s2 ^ s4 ^ s8; -} - -static inline void invMixColumns(Guchar *state) { - int c; - Guchar s0, s1, s2, s3; - - for (c = 0; c < 4; ++c) { - s0 = state[c]; - s1 = state[4+c]; - s2 = state[8+c]; - s3 = state[12+c]; - state[c] = mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3); - state[4+c] = mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3); - state[8+c] = mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3); - state[12+c] = mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3); - } -} - -static inline void invMixColumnsW(Guint *w) { - int c; - Guchar s0, s1, s2, s3; - - for (c = 0; c < 4; ++c) { - s0 = w[c] >> 24; - s1 = w[c] >> 16; - s2 = w[c] >> 8; - s3 = w[c]; - w[c] = ((mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3)) << 24) - | ((mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3)) << 16) - | ((mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3)) << 8) - | (mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3)); - } -} - -static inline void addRoundKey(Guchar *state, Guint *w) { - int c; - - for (c = 0; c < 4; ++c) { - state[c] ^= w[c] >> 24; - state[4+c] ^= w[c] >> 16; - state[8+c] ^= w[c] >> 8; - state[12+c] ^= w[c]; - } -} - -static void aesKeyExpansion(DecryptAESState *s, - Guchar *objKey, int objKeyLen) { - Guint temp; - int i, round; - - //~ this assumes objKeyLen == 16 - - for (i = 0; i < 4; ++i) { - s->w[i] = (objKey[4*i] << 24) + (objKey[4*i+1] << 16) + - (objKey[4*i+2] << 8) + objKey[4*i+3]; - } - for (i = 4; i < 44; ++i) { - temp = s->w[i-1]; - if (!(i & 3)) { - temp = subWord(rotWord(temp)) ^ rcon[i/4]; - } - s->w[i] = s->w[i-4] ^ temp; - } - for (round = 1; round <= 9; ++round) { - invMixColumnsW(&s->w[round * 4]); - } -} - -static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last) { - int c, round, n, i; - - // initial state - for (c = 0; c < 4; ++c) { - s->state[c] = in[4*c]; - s->state[4+c] = in[4*c+1]; - s->state[8+c] = in[4*c+2]; - s->state[12+c] = in[4*c+3]; - } - - // round 0 - addRoundKey(s->state, &s->w[10 * 4]); - - // rounds 1-9 - for (round = 9; round >= 1; --round) { - invSubBytes(s->state); - invShiftRows(s->state); - invMixColumns(s->state); - addRoundKey(s->state, &s->w[round * 4]); - } - - // round 10 - invSubBytes(s->state); - invShiftRows(s->state); - addRoundKey(s->state, &s->w[0]); - - // CBC - for (c = 0; c < 4; ++c) { - s->buf[4*c] = s->state[c] ^ s->cbc[4*c]; - s->buf[4*c+1] = s->state[4+c] ^ s->cbc[4*c+1]; - s->buf[4*c+2] = s->state[8+c] ^ s->cbc[4*c+2]; - s->buf[4*c+3] = s->state[12+c] ^ s->cbc[4*c+3]; - } - - // save the input block for the next CBC - for (i = 0; i < 16; ++i) { - s->cbc[i] = in[i]; - } - - // remove padding - s->bufIdx = 0; - if (last) { - n = s->buf[15]; - if(!n || n>16) n=16; - for (i = 15; i >= n; --i) { - s->buf[i] = s->buf[i-n]; - } - s->bufIdx = n; - } -} - -//------------------------------------------------------------------------ -// MD5 message digest -//------------------------------------------------------------------------ - -// this works around a bug in older Sun compilers -static inline Gulong rotateLeft(Gulong x, int r) { - x &= 0xffffffff; - return ((x << r) | (x >> (32 - r))) & 0xffffffff; -} - -static inline Gulong md5Round1(Gulong a, Gulong b, Gulong c, Gulong d, - Gulong Xk, Gulong s, Gulong Ti) { - return b + rotateLeft((a + ((b & c) | (~b & d)) + Xk + Ti), s); -} - -static inline Gulong md5Round2(Gulong a, Gulong b, Gulong c, Gulong d, - Gulong Xk, Gulong s, Gulong Ti) { - return b + rotateLeft((a + ((b & d) | (c & ~d)) + Xk + Ti), s); -} - -static inline Gulong md5Round3(Gulong a, Gulong b, Gulong c, Gulong d, - Gulong Xk, Gulong s, Gulong Ti) { - return b + rotateLeft((a + (b ^ c ^ d) + Xk + Ti), s); -} - -static inline Gulong md5Round4(Gulong a, Gulong b, Gulong c, Gulong d, - Gulong Xk, Gulong s, Gulong Ti) { - return b + rotateLeft((a + (c ^ (b | ~d)) + Xk + Ti), s); -} - -static void md5(Guchar *msg, int msgLen, Guchar *digest) { - Gulong x[16]; - Gulong a, b, c, d, aa, bb, cc, dd; - int n64; - int i, j, k; - - // compute number of 64-byte blocks - // (length + pad byte (0x80) + 8 bytes for length) - n64 = (msgLen + 1 + 8 + 63) / 64; - - // initialize a, b, c, d - a = 0x67452301; - b = 0xefcdab89; - c = 0x98badcfe; - d = 0x10325476; - - // loop through blocks - k = 0; - for (i = 0; i < n64; ++i) { - - // grab a 64-byte block - for (j = 0; j < 16 && k < msgLen - 3; ++j, k += 4) - x[j] = (((((msg[k+3] << 8) + msg[k+2]) << 8) + msg[k+1]) << 8) + msg[k]; - if (i == n64 - 1) { - if (k == msgLen - 3) - x[j] = 0x80000000 + (((msg[k+2] << 8) + msg[k+1]) << 8) + msg[k]; - else if (k == msgLen - 2) - x[j] = 0x800000 + (msg[k+1] << 8) + msg[k]; - else if (k == msgLen - 1) - x[j] = 0x8000 + msg[k]; - else - x[j] = 0x80; - ++j; - while (j < 16) - x[j++] = 0; - x[14] = msgLen << 3; - } - - // save a, b, c, d - aa = a; - bb = b; - cc = c; - dd = d; - - // round 1 - a = md5Round1(a, b, c, d, x[0], 7, 0xd76aa478); - d = md5Round1(d, a, b, c, x[1], 12, 0xe8c7b756); - c = md5Round1(c, d, a, b, x[2], 17, 0x242070db); - b = md5Round1(b, c, d, a, x[3], 22, 0xc1bdceee); - a = md5Round1(a, b, c, d, x[4], 7, 0xf57c0faf); - d = md5Round1(d, a, b, c, x[5], 12, 0x4787c62a); - c = md5Round1(c, d, a, b, x[6], 17, 0xa8304613); - b = md5Round1(b, c, d, a, x[7], 22, 0xfd469501); - a = md5Round1(a, b, c, d, x[8], 7, 0x698098d8); - d = md5Round1(d, a, b, c, x[9], 12, 0x8b44f7af); - c = md5Round1(c, d, a, b, x[10], 17, 0xffff5bb1); - b = md5Round1(b, c, d, a, x[11], 22, 0x895cd7be); - a = md5Round1(a, b, c, d, x[12], 7, 0x6b901122); - d = md5Round1(d, a, b, c, x[13], 12, 0xfd987193); - c = md5Round1(c, d, a, b, x[14], 17, 0xa679438e); - b = md5Round1(b, c, d, a, x[15], 22, 0x49b40821); - - // round 2 - a = md5Round2(a, b, c, d, x[1], 5, 0xf61e2562); - d = md5Round2(d, a, b, c, x[6], 9, 0xc040b340); - c = md5Round2(c, d, a, b, x[11], 14, 0x265e5a51); - b = md5Round2(b, c, d, a, x[0], 20, 0xe9b6c7aa); - a = md5Round2(a, b, c, d, x[5], 5, 0xd62f105d); - d = md5Round2(d, a, b, c, x[10], 9, 0x02441453); - c = md5Round2(c, d, a, b, x[15], 14, 0xd8a1e681); - b = md5Round2(b, c, d, a, x[4], 20, 0xe7d3fbc8); - a = md5Round2(a, b, c, d, x[9], 5, 0x21e1cde6); - d = md5Round2(d, a, b, c, x[14], 9, 0xc33707d6); - c = md5Round2(c, d, a, b, x[3], 14, 0xf4d50d87); - b = md5Round2(b, c, d, a, x[8], 20, 0x455a14ed); - a = md5Round2(a, b, c, d, x[13], 5, 0xa9e3e905); - d = md5Round2(d, a, b, c, x[2], 9, 0xfcefa3f8); - c = md5Round2(c, d, a, b, x[7], 14, 0x676f02d9); - b = md5Round2(b, c, d, a, x[12], 20, 0x8d2a4c8a); - - // round 3 - a = md5Round3(a, b, c, d, x[5], 4, 0xfffa3942); - d = md5Round3(d, a, b, c, x[8], 11, 0x8771f681); - c = md5Round3(c, d, a, b, x[11], 16, 0x6d9d6122); - b = md5Round3(b, c, d, a, x[14], 23, 0xfde5380c); - a = md5Round3(a, b, c, d, x[1], 4, 0xa4beea44); - d = md5Round3(d, a, b, c, x[4], 11, 0x4bdecfa9); - c = md5Round3(c, d, a, b, x[7], 16, 0xf6bb4b60); - b = md5Round3(b, c, d, a, x[10], 23, 0xbebfbc70); - a = md5Round3(a, b, c, d, x[13], 4, 0x289b7ec6); - d = md5Round3(d, a, b, c, x[0], 11, 0xeaa127fa); - c = md5Round3(c, d, a, b, x[3], 16, 0xd4ef3085); - b = md5Round3(b, c, d, a, x[6], 23, 0x04881d05); - a = md5Round3(a, b, c, d, x[9], 4, 0xd9d4d039); - d = md5Round3(d, a, b, c, x[12], 11, 0xe6db99e5); - c = md5Round3(c, d, a, b, x[15], 16, 0x1fa27cf8); - b = md5Round3(b, c, d, a, x[2], 23, 0xc4ac5665); - - // round 4 - a = md5Round4(a, b, c, d, x[0], 6, 0xf4292244); - d = md5Round4(d, a, b, c, x[7], 10, 0x432aff97); - c = md5Round4(c, d, a, b, x[14], 15, 0xab9423a7); - b = md5Round4(b, c, d, a, x[5], 21, 0xfc93a039); - a = md5Round4(a, b, c, d, x[12], 6, 0x655b59c3); - d = md5Round4(d, a, b, c, x[3], 10, 0x8f0ccc92); - c = md5Round4(c, d, a, b, x[10], 15, 0xffeff47d); - b = md5Round4(b, c, d, a, x[1], 21, 0x85845dd1); - a = md5Round4(a, b, c, d, x[8], 6, 0x6fa87e4f); - d = md5Round4(d, a, b, c, x[15], 10, 0xfe2ce6e0); - c = md5Round4(c, d, a, b, x[6], 15, 0xa3014314); - b = md5Round4(b, c, d, a, x[13], 21, 0x4e0811a1); - a = md5Round4(a, b, c, d, x[4], 6, 0xf7537e82); - d = md5Round4(d, a, b, c, x[11], 10, 0xbd3af235); - c = md5Round4(c, d, a, b, x[2], 15, 0x2ad7d2bb); - b = md5Round4(b, c, d, a, x[9], 21, 0xeb86d391); - - // increment a, b, c, d - a += aa; - b += bb; - c += cc; - d += dd; - } - - // break digest into bytes - digest[0] = (Guchar)(a & 0xff); - digest[1] = (Guchar)((a >>= 8) & 0xff); - digest[2] = (Guchar)((a >>= 8) & 0xff); - digest[3] = (Guchar)((a >>= 8) & 0xff); - digest[4] = (Guchar)(b & 0xff); - digest[5] = (Guchar)((b >>= 8) & 0xff); - digest[6] = (Guchar)((b >>= 8) & 0xff); - digest[7] = (Guchar)((b >>= 8) & 0xff); - digest[8] = (Guchar)(c & 0xff); - digest[9] = (Guchar)((c >>= 8) & 0xff); - digest[10] = (Guchar)((c >>= 8) & 0xff); - digest[11] = (Guchar)((c >>= 8) & 0xff); - digest[12] = (Guchar)(d & 0xff); - digest[13] = (Guchar)((d >>= 8) & 0xff); - digest[14] = (Guchar)((d >>= 8) & 0xff); - digest[15] = (Guchar)((d >>= 8) & 0xff); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.h deleted file mode 100644 index 56f34b77f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Decrypt.h +++ /dev/null @@ -1,95 +0,0 @@ -//======================================================================== -// -// Decrypt.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef DECRYPT_H -#define DECRYPT_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "GString.h" -#include "Object.h" -#include "Stream.h" - -//------------------------------------------------------------------------ -// Decrypt -//------------------------------------------------------------------------ - -class Decrypt { -public: - - // Generate a file key. The buffer must have space for at - // least 16 bytes. Checks and then - // and returns true if either is correct. Sets if - // the owner password was correct. Either or both of the passwords - // may be NULL, which is treated as an empty string. - static GBool makeFileKey(int encVersion, int encRevision, int keyLength, - GString *ownerKey, GString *userKey, - int permissions, GString *fileID, - GString *ownerPassword, GString *userPassword, - Guchar *fileKey, GBool encryptMetadata, - GBool *ownerPasswordOk); - -private: - - static GBool makeFileKey2(int encVersion, int encRevision, int keyLength, - GString *ownerKey, GString *userKey, - int permissions, GString *fileID, - GString *userPassword, Guchar *fileKey, - GBool encryptMetadata); -}; - -//------------------------------------------------------------------------ -// DecryptStream -//------------------------------------------------------------------------ - -struct DecryptRC4State { - Guchar state[256]; - Guchar x, y; - int buf; -}; - -struct DecryptAESState { - Guint w[44]; - Guchar state[16]; - Guchar cbc[16]; - Guchar buf[16]; - int bufIdx; -}; - -class DecryptStream: public FilterStream { -public: - - DecryptStream(Stream *strA, Guchar *fileKey, - CryptAlgorithm algoA, int keyLength, - int objNum, int objGen); - virtual ~DecryptStream(); - virtual StreamKind getKind() { return strWeird; } - virtual void reset(); - virtual int getChar(); - virtual int lookChar(); - virtual GBool isBinary(GBool last); - virtual Stream *getUndecodedStream() { return this; } - -private: - - CryptAlgorithm algo; - int objKeyLength; - Guchar objKey[16 + 9]; - - union { - DecryptRC4State rc4; - DecryptAESState aes; - } state; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.cc deleted file mode 100644 index dd1517f0a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.cc +++ /dev/null @@ -1,95 +0,0 @@ -//======================================================================== -// -// Dict.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "Object.h" -#include "XRef.h" -#include "Dict.h" - -//------------------------------------------------------------------------ -// Dict -//------------------------------------------------------------------------ - -Dict::Dict(XRef *xrefA) { - xref = xrefA; - entries = NULL; - size = length = 0; - ref = 1; -} - -Dict::~Dict() { - int i; - - for (i = 0; i < length; ++i) { - gfree(entries[i].key); - entries[i].val.free(); - } - gfree(entries); -} - -void Dict::add(char *key, Object *val) { - if (length == size) { - if (length == 0) { - size = 8; - } else { - size *= 2; - } - entries = (DictEntry *)greallocn(entries, size, sizeof(DictEntry)); - } - entries[length].key = key; - entries[length].val = *val; - ++length; -} - -inline DictEntry *Dict::find(char *key) { - int i; - - for (i = 0; i < length; ++i) { - if (!strcmp(key, entries[i].key)) - return &entries[i]; - } - return NULL; -} - -GBool Dict::is(char *type) { - DictEntry *e; - - return (e = find("Type")) && e->val.isName(type); -} - -Object *Dict::lookup(char *key, Object *obj) { - DictEntry *e; - - return (e = find(key)) ? e->val.fetch(xref, obj) : obj->initNull(); -} - -Object *Dict::lookupNF(char *key, Object *obj) { - DictEntry *e; - - return (e = find(key)) ? e->val.copy(obj) : obj->initNull(); -} - -char *Dict::getKey(int i) { - return entries[i].key; -} - -Object *Dict::getVal(int i, Object *obj) { - return entries[i].val.fetch(xref, obj); -} - -Object *Dict::getValNF(int i, Object *obj) { - return entries[i].val.copy(obj); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.h deleted file mode 100644 index 08f55ecd4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Dict.h +++ /dev/null @@ -1,77 +0,0 @@ -//======================================================================== -// -// Dict.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef DICT_H -#define DICT_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "Object.h" - -//------------------------------------------------------------------------ -// Dict -//------------------------------------------------------------------------ - -struct DictEntry { - char *key; - Object val; -}; - -class Dict { -public: - - // Constructor. - Dict(XRef *xrefA); - - // Destructor. - ~Dict(); - - // Reference counting. - int incRef() { return ++ref; } - int decRef() { return --ref; } - - // Get number of entries. - int getLength() { return length; } - - // Add an entry. NB: does not copy key. - void add(char *key, Object *val); - - // Check if dictionary is of specified type. - GBool is(char *type); - - // Look up an entry and return the value. Returns a null object - // if is not in the dictionary. - Object *lookup(char *key, Object *obj); - Object *lookupNF(char *key, Object *obj); - - // Iterative accessors. - char *getKey(int i); - Object *getVal(int i, Object *obj); - Object *getValNF(int i, Object *obj); - - // Set the xref pointer. This is only used in one special case: the - // trailer dictionary, which is read before the xref table is - // parsed. - void setXRef(XRef *xrefA) { xref = xrefA; } - -private: - - XRef *xref; // the xref table for this PDF file - DictEntry *entries; // array of entries - int size; // size of array - int length; // number of entries in dictionary - int ref; // reference count - - DictEntry *find(char *key); -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.cc deleted file mode 100644 index c03f75f48..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.cc +++ /dev/null @@ -1,38 +0,0 @@ -//======================================================================== -// -// Error.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include "GlobalParams.h" -#include "Error.h" - -void CDECL error(int pos, char *msg, ...) { - va_list args; - - // NB: this can be called before the globalParams object is created - if (globalParams && globalParams->getErrQuiet()) { - return; - } - if (pos >= 0) { - fprintf(stderr, "Error (%d): ", pos); - } else { - fprintf(stderr, "Error: "); - } - va_start(args, msg); - vfprintf(stderr, msg, args); - va_end(args); - fprintf(stderr, "\n"); - fflush(stderr); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.h deleted file mode 100644 index 0ce55e9ab..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Error.h +++ /dev/null @@ -1,23 +0,0 @@ -//======================================================================== -// -// Error.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef ERROR_H -#define ERROR_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include "config.h" - -extern void CDECL error(int pos, char *msg, ...); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/ErrorCodes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/ErrorCodes.h deleted file mode 100644 index b28528df5..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/ErrorCodes.h +++ /dev/null @@ -1,36 +0,0 @@ -//======================================================================== -// -// ErrorCodes.h -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef ERRORCODES_H -#define ERRORCODES_H - -#define errNone 0 // no error - -#define errOpenFile 1 // couldn't open the PDF file - -#define errBadCatalog 2 // couldn't read the page catalog - -#define errDamaged 3 // PDF file was damaged and couldn't be - // repaired - -#define errEncrypted 4 // file was encrypted and password was - // incorrect or not supplied - -#define errHighlightFile 5 // nonexistent or invalid highlight file - -#define errBadPrinter 6 // invalid printer - -#define errPrinting 7 // error during printing - -#define errPermission 8 // PDF file doesn't allow that operation - -#define errBadPageNum 9 // invalid page number - -#define errFileIO 10 // file I/O error - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.cc deleted file mode 100644 index 28d0b8ca8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.cc +++ /dev/null @@ -1,156 +0,0 @@ -//======================================================================== -// -// FoFiBase.cc -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "gmem.h" -#include "FoFiBase.h" - -//------------------------------------------------------------------------ -// FoFiBase -//------------------------------------------------------------------------ - -FoFiBase::FoFiBase(char *fileA, int lenA, GBool freeFileDataA) { - fileData = file = (Guchar *)fileA; - len = lenA; - freeFileData = freeFileDataA; -} - -FoFiBase::~FoFiBase() { - if (freeFileData) { - gfree(fileData); - } -} - -char *FoFiBase::readFile(char *fileName, int *fileLen) { - FILE *f; - char *buf; - int n; - - if (!(f = fopen(fileName, "rb"))) { - return NULL; - } - fseek(f, 0, SEEK_END); - n = (int)ftell(f); - fseek(f, 0, SEEK_SET); - buf = (char *)gmalloc(n); - if ((int)fread(buf, 1, n, f) != n) { - gfree(buf); - fclose(f); - return NULL; - } - fclose(f); - *fileLen = n; - return buf; -} - -int FoFiBase::getS8(int pos, GBool *ok) { - int x; - - if (pos < 0 || pos >= len) { - *ok = gFalse; - return 0; - } - x = file[pos]; - if (x & 0x80) { - x |= ~0xff; - } - return x; -} - -int FoFiBase::getU8(int pos, GBool *ok) { - if (pos < 0 || pos >= len) { - *ok = gFalse; - return 0; - } - return file[pos]; -} - -int FoFiBase::getS16BE(int pos, GBool *ok) { - int x; - - if (pos < 0 || pos+1 >= len) { - *ok = gFalse; - return 0; - } - x = file[pos]; - x = (x << 8) + file[pos+1]; - if (x & 0x8000) { - x |= ~0xffff; - } - return x; -} - -int FoFiBase::getU16BE(int pos, GBool *ok) { - int x; - - if (pos < 0 || pos+1 >= len) { - *ok = gFalse; - return 0; - } - x = file[pos]; - x = (x << 8) + file[pos+1]; - return x; -} - -int FoFiBase::getS32BE(int pos, GBool *ok) { - int x; - - if (pos < 0 || pos+3 >= len) { - *ok = gFalse; - return 0; - } - x = file[pos]; - x = (x << 8) + file[pos+1]; - x = (x << 8) + file[pos+2]; - x = (x << 8) + file[pos+3]; - if (x & 0x80000000) { - x |= ~0xffffffff; - } - return x; -} - -Guint FoFiBase::getU32BE(int pos, GBool *ok) { - Guint x; - - if (pos < 0 || pos+3 >= len) { - *ok = gFalse; - return 0; - } - x = file[pos]; - x = (x << 8) + file[pos+1]; - x = (x << 8) + file[pos+2]; - x = (x << 8) + file[pos+3]; - return x; -} - -Guint FoFiBase::getUVarBE(int pos, int size, GBool *ok) { - Guint x; - int i; - - if (pos < 0 || pos + size > len) { - *ok = gFalse; - return 0; - } - x = 0; - for (i = 0; i < size; ++i) { - x = (x << 8) + file[pos + i]; - } - return x; -} - -GBool FoFiBase::checkRegion(int pos, int size) { - return pos >= 0 && - pos + size >= pos && - pos + size <= len; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.h deleted file mode 100644 index b78840b2a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiBase.h +++ /dev/null @@ -1,57 +0,0 @@ -//======================================================================== -// -// FoFiBase.h -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef FOFIBASE_H -#define FOFIBASE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -//------------------------------------------------------------------------ - -typedef void (*FoFiOutputFunc)(void *stream, char *data, int len); - -//------------------------------------------------------------------------ -// FoFiBase -//------------------------------------------------------------------------ - -class FoFiBase { -public: - - virtual ~FoFiBase(); - -protected: - - FoFiBase(char *fileA, int lenA, GBool freeFileDataA); - static char *readFile(char *fileName, int *fileLen); - - // S = signed / U = unsigned - // 8/16/32/Var = word length, in bytes - // BE = big endian - int getS8(int pos, GBool *ok); - int getU8(int pos, GBool *ok); - int getS16BE(int pos, GBool *ok); - int getU16BE(int pos, GBool *ok); - int getS32BE(int pos, GBool *ok); - Guint getU32BE(int pos, GBool *ok); - Guint getUVarBE(int pos, int size, GBool *ok); - - GBool checkRegion(int pos, int size); - - Guchar *fileData; - Guchar *file; - int len; - GBool freeFileData; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.cc deleted file mode 100644 index 37a17f5df..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.cc +++ /dev/null @@ -1,994 +0,0 @@ -//======================================================================== -// -// FoFiEncodings.cc -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "FoFiEncodings.h" - -//------------------------------------------------------------------------ -// Type 1 and 1C font data -//------------------------------------------------------------------------ - -char *fofiType1StandardEncoding[256] = { - 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, - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quoteright", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "quoteleft", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - 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, - "exclamdown", - "cent", - "sterling", - "fraction", - "yen", - "florin", - "section", - "currency", - "quotesingle", - "quotedblleft", - "guillemotleft", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - NULL, - "endash", - "dagger", - "daggerdbl", - "periodcentered", - NULL, - "paragraph", - "bullet", - "quotesinglbase", - "quotedblbase", - "quotedblright", - "guillemotright", - "ellipsis", - "perthousand", - NULL, - "questiondown", - NULL, - "grave", - "acute", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "dieresis", - NULL, - "ring", - "cedilla", - NULL, - "hungarumlaut", - "ogonek", - "caron", - "emdash", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - "AE", - NULL, - "ordfeminine", - NULL, - NULL, - NULL, - NULL, - "Lslash", - "Oslash", - "OE", - "ordmasculine", - NULL, - NULL, - NULL, - NULL, - NULL, - "ae", - NULL, - NULL, - NULL, - "dotlessi", - NULL, - NULL, - "lslash", - "oslash", - "oe", - "germandbls", - NULL, - NULL, - NULL, - NULL -}; - -char *fofiType1ExpertEncoding[256] = { - 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, - "space", - "exclamsmall", - "Hungarumlautsmall", - NULL, - "dollaroldstyle", - "dollarsuperior", - "ampersandsmall", - "Acutesmall", - "parenleftsuperior", - "parenrightsuperior", - "twodotenleader", - "onedotenleader", - "comma", - "hyphen", - "period", - "fraction", - "zerooldstyle", - "oneoldstyle", - "twooldstyle", - "threeoldstyle", - "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", - "sevenoldstyle", - "eightoldstyle", - "nineoldstyle", - "colon", - "semicolon", - "commasuperior", - "threequartersemdash", - "periodsuperior", - "questionsmall", - NULL, - "asuperior", - "bsuperior", - "centsuperior", - "dsuperior", - "esuperior", - NULL, - NULL, - NULL, - "isuperior", - NULL, - NULL, - "lsuperior", - "msuperior", - "nsuperior", - "osuperior", - NULL, - NULL, - "rsuperior", - "ssuperior", - "tsuperior", - NULL, - "ff", - "fi", - "fl", - "ffi", - "ffl", - "parenleftinferior", - NULL, - "parenrightinferior", - "Circumflexsmall", - "hyphensuperior", - "Gravesmall", - "Asmall", - "Bsmall", - "Csmall", - "Dsmall", - "Esmall", - "Fsmall", - "Gsmall", - "Hsmall", - "Ismall", - "Jsmall", - "Ksmall", - "Lsmall", - "Msmall", - "Nsmall", - "Osmall", - "Psmall", - "Qsmall", - "Rsmall", - "Ssmall", - "Tsmall", - "Usmall", - "Vsmall", - "Wsmall", - "Xsmall", - "Ysmall", - "Zsmall", - "colonmonetary", - "onefitted", - "rupiah", - "Tildesmall", - 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, - "exclamdownsmall", - "centoldstyle", - "Lslashsmall", - NULL, - NULL, - "Scaronsmall", - "Zcaronsmall", - "Dieresissmall", - "Brevesmall", - "Caronsmall", - NULL, - "Dotaccentsmall", - NULL, - NULL, - "Macronsmall", - NULL, - NULL, - "figuredash", - "hypheninferior", - NULL, - NULL, - "Ogoneksmall", - "Ringsmall", - "Cedillasmall", - NULL, - NULL, - NULL, - "onequarter", - "onehalf", - "threequarters", - "questiondownsmall", - "oneeighth", - "threeeighths", - "fiveeighths", - "seveneighths", - "onethird", - "twothirds", - NULL, - NULL, - "zerosuperior", - "onesuperior", - "twosuperior", - "threesuperior", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "eightsuperior", - "ninesuperior", - "zeroinferior", - "oneinferior", - "twoinferior", - "threeinferior", - "fourinferior", - "fiveinferior", - "sixinferior", - "seveninferior", - "eightinferior", - "nineinferior", - "centinferior", - "dollarinferior", - "periodinferior", - "commainferior", - "Agravesmall", - "Aacutesmall", - "Acircumflexsmall", - "Atildesmall", - "Adieresissmall", - "Aringsmall", - "AEsmall", - "Ccedillasmall", - "Egravesmall", - "Eacutesmall", - "Ecircumflexsmall", - "Edieresissmall", - "Igravesmall", - "Iacutesmall", - "Icircumflexsmall", - "Idieresissmall", - "Ethsmall", - "Ntildesmall", - "Ogravesmall", - "Oacutesmall", - "Ocircumflexsmall", - "Otildesmall", - "Odieresissmall", - "OEsmall", - "Oslashsmall", - "Ugravesmall", - "Uacutesmall", - "Ucircumflexsmall", - "Udieresissmall", - "Yacutesmall", - "Thornsmall", - "Ydieresissmall" -}; - -//------------------------------------------------------------------------ -// Type 1C font data -//------------------------------------------------------------------------ - -char *fofiType1CStdStrings[391] = { - ".notdef", - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quoteright", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "quoteleft", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - "exclamdown", - "cent", - "sterling", - "fraction", - "yen", - "florin", - "section", - "currency", - "quotesingle", - "quotedblleft", - "guillemotleft", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - "endash", - "dagger", - "daggerdbl", - "periodcentered", - "paragraph", - "bullet", - "quotesinglbase", - "quotedblbase", - "quotedblright", - "guillemotright", - "ellipsis", - "perthousand", - "questiondown", - "grave", - "acute", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "dieresis", - "ring", - "cedilla", - "hungarumlaut", - "ogonek", - "caron", - "emdash", - "AE", - "ordfeminine", - "Lslash", - "Oslash", - "OE", - "ordmasculine", - "ae", - "dotlessi", - "lslash", - "oslash", - "oe", - "germandbls", - "onesuperior", - "logicalnot", - "mu", - "trademark", - "Eth", - "onehalf", - "plusminus", - "Thorn", - "onequarter", - "divide", - "brokenbar", - "degree", - "thorn", - "threequarters", - "twosuperior", - "registered", - "minus", - "eth", - "multiply", - "threesuperior", - "copyright", - "Aacute", - "Acircumflex", - "Adieresis", - "Agrave", - "Aring", - "Atilde", - "Ccedilla", - "Eacute", - "Ecircumflex", - "Edieresis", - "Egrave", - "Iacute", - "Icircumflex", - "Idieresis", - "Igrave", - "Ntilde", - "Oacute", - "Ocircumflex", - "Odieresis", - "Ograve", - "Otilde", - "Scaron", - "Uacute", - "Ucircumflex", - "Udieresis", - "Ugrave", - "Yacute", - "Ydieresis", - "Zcaron", - "aacute", - "acircumflex", - "adieresis", - "agrave", - "aring", - "atilde", - "ccedilla", - "eacute", - "ecircumflex", - "edieresis", - "egrave", - "iacute", - "icircumflex", - "idieresis", - "igrave", - "ntilde", - "oacute", - "ocircumflex", - "odieresis", - "ograve", - "otilde", - "scaron", - "uacute", - "ucircumflex", - "udieresis", - "ugrave", - "yacute", - "ydieresis", - "zcaron", - "exclamsmall", - "Hungarumlautsmall", - "dollaroldstyle", - "dollarsuperior", - "ampersandsmall", - "Acutesmall", - "parenleftsuperior", - "parenrightsuperior", - "twodotenleader", - "onedotenleader", - "zerooldstyle", - "oneoldstyle", - "twooldstyle", - "threeoldstyle", - "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", - "sevenoldstyle", - "eightoldstyle", - "nineoldstyle", - "commasuperior", - "threequartersemdash", - "periodsuperior", - "questionsmall", - "asuperior", - "bsuperior", - "centsuperior", - "dsuperior", - "esuperior", - "isuperior", - "lsuperior", - "msuperior", - "nsuperior", - "osuperior", - "rsuperior", - "ssuperior", - "tsuperior", - "ff", - "ffi", - "ffl", - "parenleftinferior", - "parenrightinferior", - "Circumflexsmall", - "hyphensuperior", - "Gravesmall", - "Asmall", - "Bsmall", - "Csmall", - "Dsmall", - "Esmall", - "Fsmall", - "Gsmall", - "Hsmall", - "Ismall", - "Jsmall", - "Ksmall", - "Lsmall", - "Msmall", - "Nsmall", - "Osmall", - "Psmall", - "Qsmall", - "Rsmall", - "Ssmall", - "Tsmall", - "Usmall", - "Vsmall", - "Wsmall", - "Xsmall", - "Ysmall", - "Zsmall", - "colonmonetary", - "onefitted", - "rupiah", - "Tildesmall", - "exclamdownsmall", - "centoldstyle", - "Lslashsmall", - "Scaronsmall", - "Zcaronsmall", - "Dieresissmall", - "Brevesmall", - "Caronsmall", - "Dotaccentsmall", - "Macronsmall", - "figuredash", - "hypheninferior", - "Ogoneksmall", - "Ringsmall", - "Cedillasmall", - "questiondownsmall", - "oneeighth", - "threeeighths", - "fiveeighths", - "seveneighths", - "onethird", - "twothirds", - "zerosuperior", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "eightsuperior", - "ninesuperior", - "zeroinferior", - "oneinferior", - "twoinferior", - "threeinferior", - "fourinferior", - "fiveinferior", - "sixinferior", - "seveninferior", - "eightinferior", - "nineinferior", - "centinferior", - "dollarinferior", - "periodinferior", - "commainferior", - "Agravesmall", - "Aacutesmall", - "Acircumflexsmall", - "Atildesmall", - "Adieresissmall", - "Aringsmall", - "AEsmall", - "Ccedillasmall", - "Egravesmall", - "Eacutesmall", - "Ecircumflexsmall", - "Edieresissmall", - "Igravesmall", - "Iacutesmall", - "Icircumflexsmall", - "Idieresissmall", - "Ethsmall", - "Ntildesmall", - "Ogravesmall", - "Oacutesmall", - "Ocircumflexsmall", - "Otildesmall", - "Odieresissmall", - "OEsmall", - "Oslashsmall", - "Ugravesmall", - "Uacutesmall", - "Ucircumflexsmall", - "Udieresissmall", - "Yacutesmall", - "Thornsmall", - "Ydieresissmall", - "001.000", - "001.001", - "001.002", - "001.003", - "Black", - "Bold", - "Book", - "Light", - "Medium", - "Regular", - "Roman", - "Semibold" -}; - -Gushort fofiType1CISOAdobeCharset[229] = { - 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, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228 -}; - -Gushort fofiType1CExpertCharset[166] = { - 0, 1, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 13, 14, 15, 99, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 109, 110, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 158, 155, 163, 319, 320, 321, 322, 323, 324, 325, - 326, 150, 164, 169, 327, 328, 329, 330, 331, 332, - 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378 -}; - -Gushort fofiType1CExpertSubsetCharset[87] = { - 0, 1, 231, 232, 235, 236, 237, 238, 13, 14, - 15, 99, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 27, 28, 249, 250, 251, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 109, 110, 267, 268, 269, 270, 272, 300, 301, - 302, 305, 314, 315, 158, 155, 163, 320, 321, 322, - 323, 324, 325, 326, 150, 164, 169, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, - 340, 341, 342, 343, 344, 345, 346 -}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.h deleted file mode 100644 index 50e285d7c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiEncodings.h +++ /dev/null @@ -1,36 +0,0 @@ -//======================================================================== -// -// FoFiEncodings.h -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef FOFIENCODINGS_H -#define FOFIENCODINGS_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -//------------------------------------------------------------------------ -// Type 1 and 1C font data -//------------------------------------------------------------------------ - -extern char *fofiType1StandardEncoding[256]; -extern char *fofiType1ExpertEncoding[256]; - -//------------------------------------------------------------------------ -// Type 1C font data -//------------------------------------------------------------------------ - -extern char *fofiType1CStdStrings[391]; -extern Gushort fofiType1CISOAdobeCharset[229]; -extern Gushort fofiType1CExpertCharset[166]; -extern Gushort fofiType1CExpertSubsetCharset[87]; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.cc deleted file mode 100644 index f8a1aa347..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.cc +++ /dev/null @@ -1,2027 +0,0 @@ -//======================================================================== -// -// FoFiTrueType.cc -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gtypes.h" -#include "gmem.h" -#include "GString.h" -#include "GHash.h" -#include "FoFiType1C.h" -#include "FoFiTrueType.h" - -// -// Terminology -// ----------- -// -// character code = number used as an element of a text string -// -// character name = glyph name = name for a particular glyph within a -// font -// -// glyph index = GID = position (within some internal table in the font) -// where the instructions to draw a particular glyph are -// stored -// -// Type 1 fonts -// ------------ -// -// Type 1 fonts contain: -// -// Encoding: array of glyph names, maps char codes to glyph names -// -// Encoding[charCode] = charName -// -// CharStrings: dictionary of instructions, keyed by character names, -// maps character name to glyph data -// -// CharStrings[charName] = glyphData -// -// TrueType fonts -// -------------- -// -// TrueType fonts contain: -// -// 'cmap' table: mapping from character code to glyph index; there may -// be multiple cmaps in a TrueType font -// -// cmap[charCode] = gid -// -// 'post' table: mapping from glyph index to glyph name -// -// post[gid] = glyphName -// -// Type 42 fonts -// ------------- -// -// Type 42 fonts contain: -// -// Encoding: array of glyph names, maps char codes to glyph names -// -// Encoding[charCode] = charName -// -// CharStrings: dictionary of glyph indexes, keyed by character names, -// maps character name to glyph index -// -// CharStrings[charName] = gid -// - -//------------------------------------------------------------------------ - -#define ttcfTag 0x74746366 - -//------------------------------------------------------------------------ - -struct TrueTypeTable { - Guint tag; - Guint checksum; - int offset; - int origOffset; - int len; -}; - -struct TrueTypeCmap { - int platform; - int encoding; - int offset; - int len; - int fmt; -}; - -struct TrueTypeLoca { - int idx; - int origOffset; - int newOffset; - int len; -}; - -#define cmapTag 0x636d6170 -#define glyfTag 0x676c7966 -#define headTag 0x68656164 -#define hheaTag 0x68686561 -#define hmtxTag 0x686d7478 -#define locaTag 0x6c6f6361 -#define nameTag 0x6e616d65 -#define os2Tag 0x4f532f32 -#define postTag 0x706f7374 - -static int cmpTrueTypeLocaOffset(const void *p1, const void *p2) { - TrueTypeLoca *loca1 = (TrueTypeLoca *)p1; - TrueTypeLoca *loca2 = (TrueTypeLoca *)p2; - - if (loca1->origOffset == loca2->origOffset) { - return loca1->idx - loca2->idx; - } - return loca1->origOffset - loca2->origOffset; -} - -static int cmpTrueTypeLocaIdx(const void *p1, const void *p2) { - TrueTypeLoca *loca1 = (TrueTypeLoca *)p1; - TrueTypeLoca *loca2 = (TrueTypeLoca *)p2; - - return loca1->idx - loca2->idx; -} - -static int cmpTrueTypeTableTag(const void *p1, const void *p2) { - TrueTypeTable *tab1 = (TrueTypeTable *)p1; - TrueTypeTable *tab2 = (TrueTypeTable *)p2; - - return (int)tab1->tag - (int)tab2->tag; -} - -//------------------------------------------------------------------------ - -struct T42Table { - char *tag; // 4-byte tag - GBool required; // required by the TrueType spec? -}; - -// TrueType tables to be embedded in Type 42 fonts. -// NB: the table names must be in alphabetical order here. -#define nT42Tables 11 -static T42Table t42Tables[nT42Tables] = { - { "cvt ", gTrue }, - { "fpgm", gTrue }, - { "glyf", gTrue }, - { "head", gTrue }, - { "hhea", gTrue }, - { "hmtx", gTrue }, - { "loca", gTrue }, - { "maxp", gTrue }, - { "prep", gTrue }, - { "vhea", gFalse }, - { "vmtx", gFalse } -}; -#define t42HeadTable 3 -#define t42LocaTable 6 -#define t42GlyfTable 2 -#define t42VheaTable 9 -#define t42VmtxTable 10 - -//------------------------------------------------------------------------ - -// Glyph names in some arbitrary standard order that Apple uses for -// their TrueType fonts. -static char *macGlyphNames[258] = { - ".notdef", "null", "CR", "space", - "exclam", "quotedbl", "numbersign", "dollar", - "percent", "ampersand", "quotesingle", "parenleft", - "parenright", "asterisk", "plus", "comma", - "hyphen", "period", "slash", "zero", - "one", "two", "three", "four", - "five", "six", "seven", "eight", - "nine", "colon", "semicolon", "less", - "equal", "greater", "question", "at", - "A", "B", "C", "D", - "E", "F", "G", "H", - "I", "J", "K", "L", - "M", "N", "O", "P", - "Q", "R", "S", "T", - "U", "V", "W", "X", - "Y", "Z", "bracketleft", "backslash", - "bracketright", "asciicircum", "underscore", "grave", - "a", "b", "c", "d", - "e", "f", "g", "h", - "i", "j", "k", "l", - "m", "n", "o", "p", - "q", "r", "s", "t", - "u", "v", "w", "x", - "y", "z", "braceleft", "bar", - "braceright", "asciitilde", "Adieresis", "Aring", - "Ccedilla", "Eacute", "Ntilde", "Odieresis", - "Udieresis", "aacute", "agrave", "acircumflex", - "adieresis", "atilde", "aring", "ccedilla", - "eacute", "egrave", "ecircumflex", "edieresis", - "iacute", "igrave", "icircumflex", "idieresis", - "ntilde", "oacute", "ograve", "ocircumflex", - "odieresis", "otilde", "uacute", "ugrave", - "ucircumflex", "udieresis", "dagger", "degree", - "cent", "sterling", "section", "bullet", - "paragraph", "germandbls", "registered", "copyright", - "trademark", "acute", "dieresis", "notequal", - "AE", "Oslash", "infinity", "plusminus", - "lessequal", "greaterequal", "yen", "mu1", - "partialdiff", "summation", "product", "pi", - "integral", "ordfeminine", "ordmasculine", "Ohm", - "ae", "oslash", "questiondown", "exclamdown", - "logicalnot", "radical", "florin", "approxequal", - "increment", "guillemotleft", "guillemotright", "ellipsis", - "nbspace", "Agrave", "Atilde", "Otilde", - "OE", "oe", "endash", "emdash", - "quotedblleft", "quotedblright", "quoteleft", "quoteright", - "divide", "lozenge", "ydieresis", "Ydieresis", - "fraction", "currency", "guilsinglleft", "guilsinglright", - "fi", "fl", "daggerdbl", "periodcentered", - "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", - "Ecircumflex", "Aacute", "Edieresis", "Egrave", - "Iacute", "Icircumflex", "Idieresis", "Igrave", - "Oacute", "Ocircumflex", "applelogo", "Ograve", - "Uacute", "Ucircumflex", "Ugrave", "dotlessi", - "circumflex", "tilde", "overscore", "breve", - "dotaccent", "ring", "cedilla", "hungarumlaut", - "ogonek", "caron", "Lslash", "lslash", - "Scaron", "scaron", "Zcaron", "zcaron", - "brokenbar", "Eth", "eth", "Yacute", - "yacute", "Thorn", "thorn", "minus", - "multiply", "onesuperior", "twosuperior", "threesuperior", - "onehalf", "onequarter", "threequarters", "franc", - "Gbreve", "gbreve", "Idot", "Scedilla", - "scedilla", "Cacute", "cacute", "Ccaron", - "ccaron", "dmacron" -}; - -//------------------------------------------------------------------------ -// FoFiTrueType -//------------------------------------------------------------------------ - -FoFiTrueType *FoFiTrueType::make(char *fileA, int lenA) { - FoFiTrueType *ff; - - ff = new FoFiTrueType(fileA, lenA, gFalse); - if (!ff->parsedOk) { - delete ff; - return NULL; - } - return ff; -} - -FoFiTrueType *FoFiTrueType::load(char *fileName) { - FoFiTrueType *ff; - char *fileA; - int lenA; - - if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { - return NULL; - } - ff = new FoFiTrueType(fileA, lenA, gTrue); - if (!ff->parsedOk) { - delete ff; - return NULL; - } - return ff; -} - -FoFiTrueType::FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA): - FoFiBase(fileA, lenA, freeFileDataA) -{ - tables = NULL; - nTables = 0; - cmaps = NULL; - nCmaps = 0; - nameToGID = NULL; - parsedOk = gFalse; - - parse(); -} - -FoFiTrueType::~FoFiTrueType() { - gfree(tables); - gfree(cmaps); - if (nameToGID) { - delete nameToGID; - } -} - -int FoFiTrueType::getNumCmaps() { - return nCmaps; -} - -int FoFiTrueType::getCmapPlatform(int i) { - return cmaps[i].platform; -} - -int FoFiTrueType::getCmapEncoding(int i) { - return cmaps[i].encoding; -} - -int FoFiTrueType::findCmap(int platform, int encoding) { - int i; - - for (i = 0; i < nCmaps; ++i) { - if (cmaps[i].platform == platform && cmaps[i].encoding == encoding) { - return i; - } - } - return -1; -} - -Gushort FoFiTrueType::mapCodeToGID(int i, int c) { - Gushort gid; - int segCnt, segEnd, segStart, segDelta, segOffset; - int cmapFirst, cmapLen; - int pos, a, b, m; - GBool ok; - - if (i < 0 || i >= nCmaps) { - return 0; - } - ok = gTrue; - pos = cmaps[i].offset; - switch (cmaps[i].fmt) { - case 0: - if (c < 0 || c >= cmaps[i].len - 6) { - return 0; - } - gid = getU8(cmaps[i].offset + 6 + c, &ok); - break; - case 4: - segCnt = getU16BE(pos + 6, &ok) / 2; - a = -1; - b = segCnt - 1; - segEnd = getU16BE(pos + 14 + 2*b, &ok); - if (c > segEnd) { - // malformed font -- the TrueType spec requires the last segEnd - // to be 0xffff - return 0; - } - // invariant: seg[a].end < code <= seg[b].end - while (b - a > 1 && ok) { - m = (a + b) / 2; - segEnd = getU16BE(pos + 14 + 2*m, &ok); - if (segEnd < c) { - a = m; - } else { - b = m; - } - } - segStart = getU16BE(pos + 16 + 2*segCnt + 2*b, &ok); - segDelta = getU16BE(pos + 16 + 4*segCnt + 2*b, &ok); - segOffset = getU16BE(pos + 16 + 6*segCnt + 2*b, &ok); - if (c < segStart) { - return 0; - } - if (segOffset == 0) { - gid = (c + segDelta) & 0xffff; - } else { - gid = getU16BE(pos + 16 + 6*segCnt + 2*b + - segOffset + 2 * (c - segStart), &ok); - if (gid != 0) { - gid = (gid + segDelta) & 0xffff; - } - } - break; - case 6: - cmapFirst = getU16BE(pos + 6, &ok); - cmapLen = getU16BE(pos + 8, &ok); - if (c < cmapFirst || c >= cmapFirst + cmapLen) { - return 0; - } - gid = getU16BE(pos + 10 + 2 * (c - cmapFirst), &ok); - break; - default: - return 0; - } - if (!ok) { - return 0; - } - return gid; -} - -int FoFiTrueType::mapNameToGID(char *name) { - if (!nameToGID) { - return 0; - } - return nameToGID->lookupInt(name); -} - -Gushort *FoFiTrueType::getCIDToGIDMap(int *nCIDs) { - FoFiType1C *ff; - Gushort *map; - int i; - - *nCIDs = 0; - if (!openTypeCFF) { - return NULL; - } - i = seekTable("CFF "); - if (!checkRegion(tables[i].offset, tables[i].len)) { - return NULL; - } - if (!(ff = FoFiType1C::make((char *)file + tables[i].offset, - tables[i].len))) { - return NULL; - } - map = ff->getCIDToGIDMap(nCIDs); - delete ff; - return map; -} - -int FoFiTrueType::getEmbeddingRights() { - int i, fsType; - GBool ok; - - if ((i = seekTable("OS/2")) < 0) { - return 4; - } - ok = gTrue; - fsType = getU16BE(tables[i].offset + 8, &ok); - if (!ok) { - return 4; - } - if (fsType & 0x0008) { - return 2; - } - if (fsType & 0x0004) { - return 1; - } - if (fsType & 0x0002) { - return 0; - } - return 3; -} - -void FoFiTrueType::convertToType42(char *psName, char **encoding, - Gushort *codeToGID, - FoFiOutputFunc outputFunc, - void *outputStream) { - GString *buf; - GBool ok; - - if (openTypeCFF) { - return; - } - - // write the header - ok = gTrue; - buf = GString::format("%!PS-TrueTypeFont-{0:2g}\n", - (double)getS32BE(0, &ok) / 65536.0); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - - // begin the font dictionary - (*outputFunc)(outputStream, "10 dict begin\n", 14); - (*outputFunc)(outputStream, "/FontName /", 11); - (*outputFunc)(outputStream, psName, strlen(psName)); - (*outputFunc)(outputStream, " def\n", 5); - (*outputFunc)(outputStream, "/FontType 42 def\n", 17); - (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); - buf = GString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", - bbox[0], bbox[1], bbox[2], bbox[3]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); - - // write the guts of the dictionary - cvtEncoding(encoding, outputFunc, outputStream); - cvtCharStrings(encoding, codeToGID, outputFunc, outputStream); - cvtSfnts(outputFunc, outputStream, NULL, gFalse); - - // end the dictionary and define the font - (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); -} - -void FoFiTrueType::convertToType1(char *psName, char **newEncoding, - GBool ascii, FoFiOutputFunc outputFunc, - void *outputStream) { - FoFiType1C *ff; - int i; - - if (!openTypeCFF) { - return; - } - i = seekTable("CFF "); - if (!checkRegion(tables[i].offset, tables[i].len)) { - return; - } - if (!(ff = FoFiType1C::make((char *)file + tables[i].offset, - tables[i].len))) { - return; - } - ff->convertToType1(psName, newEncoding, ascii, outputFunc, outputStream); - delete ff; -} - -void FoFiTrueType::convertToCIDType2(char *psName, - Gushort *cidMap, int nCIDs, - GBool needVerticalMetrics, - FoFiOutputFunc outputFunc, - void *outputStream) { - GString *buf; - Gushort cid; - GBool ok; - int i, j, k; - - if (openTypeCFF) { - return; - } - - // write the header - ok = gTrue; - buf = GString::format("%!PS-TrueTypeFont-{0:2g}\n", - (double)getS32BE(0, &ok) / 65536.0); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - - // begin the font dictionary - (*outputFunc)(outputStream, "20 dict begin\n", 14); - (*outputFunc)(outputStream, "/CIDFontName /", 14); - (*outputFunc)(outputStream, psName, strlen(psName)); - (*outputFunc)(outputStream, " def\n", 5); - (*outputFunc)(outputStream, "/CIDFontType 2 def\n", 19); - (*outputFunc)(outputStream, "/FontType 42 def\n", 17); - (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32); - (*outputFunc)(outputStream, " /Registry (Adobe) def\n", 24); - (*outputFunc)(outputStream, " /Ordering (Identity) def\n", 27); - (*outputFunc)(outputStream, " /Supplement 0 def\n", 20); - (*outputFunc)(outputStream, " end def\n", 10); - (*outputFunc)(outputStream, "/GDBytes 2 def\n", 15); - if (cidMap) { - buf = GString::format("/CIDCount {0:d} def\n", nCIDs); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - if (nCIDs > 32767) { - (*outputFunc)(outputStream, "/CIDMap [", 9); - for (i = 0; i < nCIDs; i += 32768 - 16) { - (*outputFunc)(outputStream, "<\n", 2); - for (j = 0; j < 32768 - 16 && i+j < nCIDs; j += 16) { - (*outputFunc)(outputStream, " ", 2); - for (k = 0; k < 16 && i+j+k < nCIDs; ++k) { - cid = cidMap[i+j+k]; - buf = GString::format("{0:02x}{1:02x}", - (cid >> 8) & 0xff, cid & 0xff); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "\n", 1); - } - (*outputFunc)(outputStream, " >", 3); - } - (*outputFunc)(outputStream, "\n", 1); - (*outputFunc)(outputStream, "] def\n", 6); - } else { - (*outputFunc)(outputStream, "/CIDMap <\n", 10); - for (i = 0; i < nCIDs; i += 16) { - (*outputFunc)(outputStream, " ", 2); - for (j = 0; j < 16 && i+j < nCIDs; ++j) { - cid = cidMap[i+j]; - buf = GString::format("{0:02x}{1:02x}", - (cid >> 8) & 0xff, cid & 0xff); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "\n", 1); - } - (*outputFunc)(outputStream, "> def\n", 6); - } - } else { - // direct mapping - just fill the string(s) with s[i]=i - buf = GString::format("/CIDCount {0:d} def\n", nGlyphs); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - if (nGlyphs > 32767) { - (*outputFunc)(outputStream, "/CIDMap [\n", 10); - for (i = 0; i < nGlyphs; i += 32767) { - j = nGlyphs - i < 32767 ? nGlyphs - i : 32767; - buf = GString::format(" {0:d} string 0 1 {1:d} {{\n", 2 * j, j - 1); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - buf = GString::format(" 2 copy dup 2 mul exch {0:d} add -8 bitshift put\n", - i); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - buf = GString::format(" 1 index exch dup 2 mul 1 add exch {0:d} add" - " 255 and put\n", i); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, " } for\n", 8); - } - (*outputFunc)(outputStream, "] def\n", 6); - } else { - buf = GString::format("/CIDMap {0:d} string\n", 2 * nGlyphs); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - buf = GString::format(" 0 1 {0:d} {{\n", nGlyphs - 1); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, - " 2 copy dup 2 mul exch -8 bitshift put\n", 42); - (*outputFunc)(outputStream, - " 1 index exch dup 2 mul 1 add exch 255 and put\n", 50); - (*outputFunc)(outputStream, " } for\n", 8); - (*outputFunc)(outputStream, "def\n", 4); - } - } - (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); - buf = GString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", - bbox[0], bbox[1], bbox[2], bbox[3]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); - (*outputFunc)(outputStream, "/Encoding [] readonly def\n", 26); - (*outputFunc)(outputStream, "/CharStrings 1 dict dup begin\n", 30); - (*outputFunc)(outputStream, " /.notdef 0 def\n", 17); - (*outputFunc)(outputStream, " end readonly def\n", 19); - - // write the guts of the dictionary - cvtSfnts(outputFunc, outputStream, NULL, needVerticalMetrics); - - // end the dictionary and define the font - (*outputFunc)(outputStream, - "CIDFontName currentdict end /CIDFont defineresource pop\n", - 56); -} - -void FoFiTrueType::convertToCIDType0(char *psName, - FoFiOutputFunc outputFunc, - void *outputStream) { - FoFiType1C *ff; - int i; - - if (!openTypeCFF) { - return; - } - i = seekTable("CFF "); - if (!checkRegion(tables[i].offset, tables[i].len)) { - return; - } - if (!(ff = FoFiType1C::make((char *)file + tables[i].offset, - tables[i].len))) { - return; - } - ff->convertToCIDType0(psName, outputFunc, outputStream); - delete ff; -} - -void FoFiTrueType::convertToType0(char *psName, Gushort *cidMap, int nCIDs, - GBool needVerticalMetrics, - FoFiOutputFunc outputFunc, - void *outputStream) { - GString *buf; - GString *sfntsName; - int n, i, j; - - if (openTypeCFF) { - return; - } - - // write the Type 42 sfnts array - sfntsName = (new GString(psName))->append("_sfnts"); - cvtSfnts(outputFunc, outputStream, sfntsName, needVerticalMetrics); - delete sfntsName; - - // write the descendant Type 42 fonts - n = cidMap ? nCIDs : nGlyphs; - for (i = 0; i < n; i += 256) { - (*outputFunc)(outputStream, "10 dict begin\n", 14); - (*outputFunc)(outputStream, "/FontName /", 11); - (*outputFunc)(outputStream, psName, strlen(psName)); - buf = GString::format("_{0:02x} def\n", i >> 8); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/FontType 42 def\n", 17); - (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); - buf = GString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", - bbox[0], bbox[1], bbox[2], bbox[3]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); - (*outputFunc)(outputStream, "/sfnts ", 7); - (*outputFunc)(outputStream, psName, strlen(psName)); - (*outputFunc)(outputStream, "_sfnts def\n", 11); - (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); - for (j = 0; j < 256 && i+j < n; ++j) { - buf = GString::format("dup {0:d} /c{1:02x} put\n", j, j); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "readonly def\n", 13); - (*outputFunc)(outputStream, "/CharStrings 257 dict dup begin\n", 32); - (*outputFunc)(outputStream, "/.notdef 0 def\n", 15); - for (j = 0; j < 256 && i+j < n; ++j) { - buf = GString::format("/c{0:02x} {1:d} def\n", - j, cidMap ? cidMap[i+j] : i+j); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "end readonly def\n", 17); - (*outputFunc)(outputStream, - "FontName currentdict end definefont pop\n", 40); - } - - // write the Type 0 parent font - (*outputFunc)(outputStream, "16 dict begin\n", 14); - (*outputFunc)(outputStream, "/FontName /", 11); - (*outputFunc)(outputStream, psName, strlen(psName)); - (*outputFunc)(outputStream, " def\n", 5); - (*outputFunc)(outputStream, "/FontType 0 def\n", 16); - (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); - (*outputFunc)(outputStream, "/FMapType 2 def\n", 16); - (*outputFunc)(outputStream, "/Encoding [\n", 12); - for (i = 0; i < n; i += 256) { - buf = GString::format("{0:d}\n", i >> 8); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - (*outputFunc)(outputStream, "/FDepVector [\n", 14); - for (i = 0; i < n; i += 256) { - (*outputFunc)(outputStream, "/", 1); - (*outputFunc)(outputStream, psName, strlen(psName)); - buf = GString::format("_{0:02x} findfont\n", i >> 8); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); -} - -void FoFiTrueType::convertToType0(char *psName, - FoFiOutputFunc outputFunc, - void *outputStream) { - FoFiType1C *ff; - int i; - - if (!openTypeCFF) { - return; - } - i = seekTable("CFF "); - if (!checkRegion(tables[i].offset, tables[i].len)) { - return; - } - if (!(ff = FoFiType1C::make((char *)file + tables[i].offset, - tables[i].len))) { - return; - } - ff->convertToType0(psName, outputFunc, outputStream); - delete ff; -} - -void FoFiTrueType::writeTTF(FoFiOutputFunc outputFunc, - void *outputStream, char *name, - Gushort *codeToGID) { - // this substitute cmap table maps char codes 0000-ffff directly to - // glyphs 0000-ffff - static char cmapTab[36] = { - 0, 0, // table version number - 0, 1, // number of encoding tables - 0, 1, // platform ID - 0, 0, // encoding ID - 0, 0, 0, 12, // offset of subtable - 0, 4, // subtable format - 0, 24, // subtable length - 0, 0, // subtable version - 0, 2, // segment count * 2 - 0, 2, // 2 * 2 ^ floor(log2(segCount)) - 0, 0, // floor(log2(segCount)) - 0, 0, // 2*segCount - 2*2^floor(log2(segCount)) - (char)0xff, (char)0xff, // endCount[0] - 0, 0, // reserved - 0, 0, // startCount[0] - 0, 0, // idDelta[0] - 0, 0 // pad to a mulitple of four bytes - }; - static char nameTab[8] = { - 0, 0, // format - 0, 0, // number of name records - 0, 6, // offset to start of string storage - 0, 0 // pad to multiple of four bytes - }; - static char postTab[32] = { - 0, 1, 0, 0, // format - 0, 0, 0, 0, // italic angle - 0, 0, // underline position - 0, 0, // underline thickness - 0, 0, 0, 0, // fixed pitch - 0, 0, 0, 0, // min Type 42 memory - 0, 0, 0, 0, // max Type 42 memory - 0, 0, 0, 0, // min Type 1 memory - 0, 0, 0, 0 // max Type 1 memory - }; - static char os2Tab[86] = { - 0, 1, // version - 0, 1, // xAvgCharWidth - 0, 0, // usWeightClass - 0, 0, // usWidthClass - 0, 0, // fsType - 0, 0, // ySubscriptXSize - 0, 0, // ySubscriptYSize - 0, 0, // ySubscriptXOffset - 0, 0, // ySubscriptYOffset - 0, 0, // ySuperscriptXSize - 0, 0, // ySuperscriptYSize - 0, 0, // ySuperscriptXOffset - 0, 0, // ySuperscriptYOffset - 0, 0, // yStrikeoutSize - 0, 0, // yStrikeoutPosition - 0, 0, // sFamilyClass - 0, 0, 0, 0, 0, // panose - 0, 0, 0, 0, 0, - 0, 0, 0, 0, // ulUnicodeRange1 - 0, 0, 0, 0, // ulUnicodeRange2 - 0, 0, 0, 0, // ulUnicodeRange3 - 0, 0, 0, 0, // ulUnicodeRange4 - 0, 0, 0, 0, // achVendID - 0, 0, // fsSelection - 0, 0, // usFirstCharIndex - 0, 0, // usLastCharIndex - 0, 0, // sTypoAscender - 0, 0, // sTypoDescender - 0, 0, // sTypoLineGap - 0, 0, // usWinAscent - 0, 0, // usWinDescent - 0, 0, 0, 0, // ulCodePageRange1 - 0, 0, 0, 0 // ulCodePageRange2 - }; - GBool missingCmap, missingName, missingPost, missingOS2; - GBool unsortedLoca, badCmapLen, abbrevHMTX; - int nZeroLengthTables; - int nHMetrics, advWidth, lsb; - TrueTypeLoca *locaTable; - TrueTypeTable *newTables; - char *newNameTab, *newCmapTab, *newHHEATab, *newHMTXTab; - int nNewTables, cmapIdx, cmapLen, glyfLen, newNameLen, newCmapLen, next; - int newHHEALen, newHMTXLen; - Guint locaChecksum, glyfChecksum, fileChecksum; - char *tableDir; - char locaBuf[4], checksumBuf[4]; - GBool ok; - Guint t; - int pos, i, j, k, n; - - if (openTypeCFF) { - return; - } - - // check for missing tables - // (Note: if the OS/2 table is missing, the Microsoft PCL5 driver - // will embed a PCL TrueType font with the pitch field set to zero, - // which apparently causes divide-by-zero errors. As far as I can - // tell, the only important field in the OS/2 table is - // xAvgCharWidth.) - missingCmap = (cmapIdx = seekTable("cmap")) < 0; - missingName = seekTable("name") < 0; - missingPost = seekTable("post") < 0; - missingOS2 = seekTable("OS/2") < 0; - - // read the loca table, check to see if it's sorted - locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca)); - unsortedLoca = gFalse; - i = seekTable("loca"); - pos = tables[i].offset; - ok = gTrue; - for (i = 0; i <= nGlyphs; ++i) { - if (locaFmt) { - locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok); - } else { - locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok); - } - if (i > 0 && locaTable[i].origOffset < locaTable[i-1].origOffset) { - unsortedLoca = gTrue; - } - // glyph descriptions must be at least 12 bytes long (nContours, - // xMin, yMin, xMax, yMax, instructionLength - two bytes each); - // invalid glyph descriptions (even if they're never used) make - // Windows choke, so we work around that problem here (ideally, - // this would parse the glyph descriptions in the glyf table and - // remove any that were invalid, but this quick test is a decent - // start) - if (i > 0 && - locaTable[i].origOffset - locaTable[i-1].origOffset > 0 && - locaTable[i].origOffset - locaTable[i-1].origOffset < 12) { - locaTable[i-1].origOffset = locaTable[i].origOffset; - unsortedLoca = gTrue; - } - locaTable[i].idx = i; - } - - // check for zero-length tables - nZeroLengthTables = 0; - for (i = 0; i < nTables; ++i) { - if (tables[i].len == 0) { - ++nZeroLengthTables; - } - } - - // check for an incorrect cmap table length - badCmapLen = gFalse; - cmapLen = 0; // make gcc happy - if (!missingCmap) { - cmapLen = cmaps[0].offset + cmaps[0].len; - for (i = 1; i < nCmaps; ++i) { - if (cmaps[i].offset + cmaps[i].len > cmapLen) { - cmapLen = cmaps[i].offset + cmaps[i].len; - } - } - cmapLen -= tables[cmapIdx].offset; - if (cmapLen > tables[cmapIdx].len) { - badCmapLen = gTrue; - } - } - - // check for an abbreviated hmtx table (this is completely legal, - // but confuses the Microsoft PCL5 printer driver, which generates - // embedded fonts with the pitch field set to zero) - i = seekTable("hhea"); - nHMetrics = getU16BE(tables[i].offset + 34, &ok); - abbrevHMTX = nHMetrics < nGlyphs; - - // if nothing is broken, just write the TTF file as is - if (!missingCmap && !missingName && !missingPost && !missingOS2 && - !unsortedLoca && !badCmapLen && !abbrevHMTX && nZeroLengthTables == 0 && - !name && !codeToGID) { - (*outputFunc)(outputStream, (char *)file, len); - goto done1; - } - - // sort the 'loca' table: some (non-compliant) fonts have - // out-of-order loca tables; in order to correctly handle the case - // where (compliant) fonts have empty entries in the middle of the - // table, cmpTrueTypeLocaOffset uses offset as its primary sort key, - // and idx as its secondary key (ensuring that adjacent entries with - // the same pos value remain in the same order) - glyfLen = 0; // make gcc happy - if (unsortedLoca) { - qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca), - &cmpTrueTypeLocaOffset); - for (i = 0; i < nGlyphs; ++i) { - locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset; - } - locaTable[nGlyphs].len = 0; - qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca), - &cmpTrueTypeLocaIdx); - pos = 0; - for (i = 0; i <= nGlyphs; ++i) { - locaTable[i].newOffset = pos; - pos += locaTable[i].len; - if (pos & 3) { - pos += 4 - (pos & 3); - } - } - glyfLen = pos; - } - - // compute checksums for the loca and glyf tables - locaChecksum = glyfChecksum = 0; - if (unsortedLoca) { - if (locaFmt) { - for (j = 0; j <= nGlyphs; ++j) { - locaChecksum += locaTable[j].newOffset; - } - } else { - for (j = 0; j <= nGlyphs; j += 2) { - locaChecksum += locaTable[j].newOffset << 16; - if (j + 1 <= nGlyphs) { - locaChecksum += locaTable[j+1].newOffset; - } - } - } - pos = tables[seekTable("glyf")].offset; - for (j = 0; j < nGlyphs; ++j) { - n = locaTable[j].len; - if (n > 0) { - k = locaTable[j].origOffset; - if (checkRegion(pos + k, n)) { - glyfChecksum += computeTableChecksum(file + pos + k, n); - } - } - } - } - - // construct the new name table - if (name) { - n = strlen(name); - newNameLen = (6 + 4*12 + 2 * (3*n + 7) + 3) & ~3; - newNameTab = (char *)gmalloc(newNameLen); - memset(newNameTab, 0, newNameLen); - newNameTab[0] = 0; // format selector - newNameTab[1] = 0; - newNameTab[2] = 0; // number of name records - newNameTab[3] = 4; - newNameTab[4] = 0; // offset to start of string storage - newNameTab[5] = 6 + 4*12; - next = 0; - for (i = 0; i < 4; ++i) { - newNameTab[6 + i*12 + 0] = 0; // platform ID = Microsoft - newNameTab[6 + i*12 + 1] = 3; - newNameTab[6 + i*12 + 2] = 0; // encoding ID = Unicode - newNameTab[6 + i*12 + 3] = 1; - newNameTab[6 + i*12 + 4] = 0x04; // language ID = American English - newNameTab[6 + i*12 + 5] = 0x09; - newNameTab[6 + i*12 + 6] = 0; // name ID - newNameTab[6 + i*12 + 7] = i + 1; - newNameTab[6 + i*12 + 8] = i+1 == 2 ? 0 : ((2*n) >> 8); // string length - newNameTab[6 + i*12 + 9] = i+1 == 2 ? 14 : ((2*n) & 0xff); - newNameTab[6 + i*12 + 10] = next >> 8; // string offset - newNameTab[6 + i*12 + 11] = next & 0xff; - if (i+1 == 2) { - memcpy(newNameTab + 6 + 4*12 + next, "\0R\0e\0g\0u\0l\0a\0r", 14); - next += 14; - } else { - for (j = 0; j < n; ++j) { - newNameTab[6 + 4*12 + next + 2*j] = 0; - newNameTab[6 + 4*12 + next + 2*j + 1] = name[j]; - } - next += 2*n; - } - } - } else { - newNameLen = 0; - newNameTab = NULL; - } - - // construct the new cmap table - if (codeToGID) { - newCmapLen = 44 + 256 * 2; - newCmapTab = (char *)gmalloc(newCmapLen); - newCmapTab[0] = 0; // table version number = 0 - newCmapTab[1] = 0; - newCmapTab[2] = 0; // number of encoding tables = 1 - newCmapTab[3] = 1; - newCmapTab[4] = 0; // platform ID = Microsoft - newCmapTab[5] = 3; - newCmapTab[6] = 0; // encoding ID = Unicode - newCmapTab[7] = 1; - newCmapTab[8] = 0; // offset of subtable - newCmapTab[9] = 0; - newCmapTab[10] = 0; - newCmapTab[11] = 12; - newCmapTab[12] = 0; // subtable format = 4 - newCmapTab[13] = 4; - newCmapTab[14] = 0x02; // subtable length - newCmapTab[15] = 0x20; - newCmapTab[16] = 0; // subtable version = 0 - newCmapTab[17] = 0; - newCmapTab[18] = 0; // segment count * 2 - newCmapTab[19] = 4; - newCmapTab[20] = 0; // 2 * 2 ^ floor(log2(segCount)) - newCmapTab[21] = 4; - newCmapTab[22] = 0; // floor(log2(segCount)) - newCmapTab[23] = 1; - newCmapTab[24] = 0; // 2*segCount - 2*2^floor(log2(segCount)) - newCmapTab[25] = 0; - newCmapTab[26] = 0x00; // endCount[0] - newCmapTab[27] = (char)0xff; - newCmapTab[28] = (char)0xff; // endCount[1] - newCmapTab[29] = (char)0xff; - newCmapTab[30] = 0; // reserved - newCmapTab[31] = 0; - newCmapTab[32] = 0x00; // startCount[0] - newCmapTab[33] = 0x00; - newCmapTab[34] = (char)0xff; // startCount[1] - newCmapTab[35] = (char)0xff; - newCmapTab[36] = 0; // idDelta[0] - newCmapTab[37] = 0; - newCmapTab[38] = 0; // idDelta[1] - newCmapTab[39] = 1; - newCmapTab[40] = 0; // idRangeOffset[0] - newCmapTab[41] = 4; - newCmapTab[42] = 0; // idRangeOffset[1] - newCmapTab[43] = 0; - for (i = 0; i < 256; ++i) { - newCmapTab[44 + 2*i] = codeToGID[i] >> 8; - newCmapTab[44 + 2*i + 1] = codeToGID[i] & 0xff; - } - } else { - newCmapLen = 0; - newCmapTab = NULL; - } - - // generate the new hmtx table and the updated hhea table - if (abbrevHMTX) { - i = seekTable("hhea"); - pos = tables[i].offset; - newHHEALen = 36; - newHHEATab = (char *)gmalloc(newHHEALen); - for (i = 0; i < newHHEALen; ++i) { - newHHEATab[i] = getU8(pos++, &ok); - } - newHHEATab[34] = nGlyphs >> 8; - newHHEATab[35] = nGlyphs & 0xff; - i = seekTable("hmtx"); - pos = tables[i].offset; - newHMTXLen = 4 * nGlyphs; - newHMTXTab = (char *)gmalloc(newHMTXLen); - advWidth = 0; - for (i = 0; i < nHMetrics; ++i) { - advWidth = getU16BE(pos, &ok); - lsb = getU16BE(pos + 2, &ok); - pos += 4; - newHMTXTab[4*i ] = advWidth >> 8; - newHMTXTab[4*i + 1] = advWidth & 0xff; - newHMTXTab[4*i + 2] = lsb >> 8; - newHMTXTab[4*i + 3] = lsb & 0xff; - } - for (; i < nGlyphs; ++i) { - lsb = getU16BE(pos, &ok); - pos += 2; - newHMTXTab[4*i ] = advWidth >> 8; - newHMTXTab[4*i + 1] = advWidth & 0xff; - newHMTXTab[4*i + 2] = lsb >> 8; - newHMTXTab[4*i + 3] = lsb & 0xff; - } - } else { - newHHEATab = newHMTXTab = NULL; - newHHEALen = newHMTXLen = 0; // make gcc happy - } - - // construct the new table directory: - // - keep all original tables with non-zero length - // - fix the cmap table's length, if necessary - // - add missing tables - // - sort the table by tag - // - compute new table positions, including 4-byte alignment - // - (re)compute table checksums - nNewTables = nTables - nZeroLengthTables + - (missingCmap ? 1 : 0) + (missingName ? 1 : 0) + - (missingPost ? 1 : 0) + (missingOS2 ? 1 : 0); - newTables = (TrueTypeTable *)gmallocn(nNewTables, sizeof(TrueTypeTable)); - j = 0; - for (i = 0; i < nTables; ++i) { - if (tables[i].len > 0) { - newTables[j] = tables[i]; - newTables[j].origOffset = tables[i].offset; - if (checkRegion(tables[i].offset, newTables[i].len)) { - newTables[j].checksum = - computeTableChecksum(file + tables[i].offset, tables[i].len); - if (tables[i].tag == headTag) { - // don't include the file checksum - newTables[j].checksum -= getU32BE(tables[i].offset + 8, &ok); - } - } - if (newTables[j].tag == cmapTag && codeToGID) { - newTables[j].len = newCmapLen; - newTables[j].checksum = computeTableChecksum((Guchar *)newCmapTab, - newCmapLen); - } else if (newTables[j].tag == cmapTag && badCmapLen) { - newTables[j].len = cmapLen; - } else if (newTables[j].tag == locaTag && unsortedLoca) { - newTables[j].len = (nGlyphs + 1) * (locaFmt ? 4 : 2); - newTables[j].checksum = locaChecksum; - } else if (newTables[j].tag == glyfTag && unsortedLoca) { - newTables[j].len = glyfLen; - newTables[j].checksum = glyfChecksum; - } else if (newTables[j].tag == nameTag && name) { - newTables[j].len = newNameLen; - newTables[j].checksum = computeTableChecksum((Guchar *)newNameTab, - newNameLen); - } else if (newTables[j].tag == hheaTag && abbrevHMTX) { - newTables[j].len = newHHEALen; - newTables[j].checksum = computeTableChecksum((Guchar *)newHHEATab, - newHHEALen); - } else if (newTables[j].tag == hmtxTag && abbrevHMTX) { - newTables[j].len = newHMTXLen; - newTables[j].checksum = computeTableChecksum((Guchar *)newHMTXTab, - newHMTXLen); - } - ++j; - } - } - if (missingCmap) { - newTables[j].tag = cmapTag; - if (codeToGID) { - newTables[j].checksum = computeTableChecksum((Guchar *)newCmapTab, - newCmapLen); - newTables[j].len = newCmapLen; - } else { - newTables[j].checksum = computeTableChecksum((Guchar *)cmapTab, - sizeof(cmapTab)); - newTables[j].len = sizeof(cmapTab); - } - ++j; - } - if (missingName) { - newTables[j].tag = nameTag; - if (name) { - newTables[j].checksum = computeTableChecksum((Guchar *)newNameTab, - newNameLen); - newTables[j].len = newNameLen; - } else { - newTables[j].checksum = computeTableChecksum((Guchar *)nameTab, - sizeof(nameTab)); - newTables[j].len = sizeof(nameTab); - } - ++j; - } - if (missingPost) { - newTables[j].tag = postTag; - newTables[j].checksum = computeTableChecksum((Guchar *)postTab, - sizeof(postTab)); - newTables[j].len = sizeof(postTab); - ++j; - } - if (missingOS2) { - newTables[j].tag = os2Tag; - newTables[j].checksum = computeTableChecksum((Guchar *)os2Tab, - sizeof(os2Tab)); - newTables[j].len = sizeof(os2Tab); - ++j; - } - qsort(newTables, nNewTables, sizeof(TrueTypeTable), - &cmpTrueTypeTableTag); - pos = 12 + nNewTables * 16; - for (i = 0; i < nNewTables; ++i) { - newTables[i].offset = pos; - pos += newTables[i].len; - if (pos & 3) { - pos += 4 - (pos & 3); - } - } - - // write the table directory - tableDir = (char *)gmalloc(12 + nNewTables * 16); - tableDir[0] = 0x00; // sfnt version - tableDir[1] = 0x01; - tableDir[2] = 0x00; - tableDir[3] = 0x00; - tableDir[4] = (char)((nNewTables >> 8) & 0xff); // numTables - tableDir[5] = (char)(nNewTables & 0xff); - for (i = -1, t = (Guint)nNewTables; t; ++i, t >>= 1) ; - t = 1 << (4 + i); - tableDir[6] = (char)((t >> 8) & 0xff); // searchRange - tableDir[7] = (char)(t & 0xff); - tableDir[8] = (char)((i >> 8) & 0xff); // entrySelector - tableDir[9] = (char)(i & 0xff); - t = nNewTables * 16 - t; - tableDir[10] = (char)((t >> 8) & 0xff); // rangeShift - tableDir[11] = (char)(t & 0xff); - pos = 12; - for (i = 0; i < nNewTables; ++i) { - tableDir[pos ] = (char)(newTables[i].tag >> 24); - tableDir[pos+ 1] = (char)(newTables[i].tag >> 16); - tableDir[pos+ 2] = (char)(newTables[i].tag >> 8); - tableDir[pos+ 3] = (char) newTables[i].tag; - tableDir[pos+ 4] = (char)(newTables[i].checksum >> 24); - tableDir[pos+ 5] = (char)(newTables[i].checksum >> 16); - tableDir[pos+ 6] = (char)(newTables[i].checksum >> 8); - tableDir[pos+ 7] = (char) newTables[i].checksum; - tableDir[pos+ 8] = (char)(newTables[i].offset >> 24); - tableDir[pos+ 9] = (char)(newTables[i].offset >> 16); - tableDir[pos+10] = (char)(newTables[i].offset >> 8); - tableDir[pos+11] = (char) newTables[i].offset; - tableDir[pos+12] = (char)(newTables[i].len >> 24); - tableDir[pos+13] = (char)(newTables[i].len >> 16); - tableDir[pos+14] = (char)(newTables[i].len >> 8); - tableDir[pos+15] = (char) newTables[i].len; - pos += 16; - } - (*outputFunc)(outputStream, tableDir, 12 + nNewTables * 16); - - // compute the file checksum - fileChecksum = computeTableChecksum((Guchar *)tableDir, - 12 + nNewTables * 16); - for (i = 0; i < nNewTables; ++i) { - fileChecksum += newTables[i].checksum; - } - fileChecksum = 0xb1b0afba - fileChecksum; - - // write the tables - for (i = 0; i < nNewTables; ++i) { - if (newTables[i].tag == headTag) { - if (checkRegion(newTables[i].origOffset, newTables[i].len)) { - (*outputFunc)(outputStream, (char *)file + newTables[i].origOffset, 8); - checksumBuf[0] = fileChecksum >> 24; - checksumBuf[1] = fileChecksum >> 16; - checksumBuf[2] = fileChecksum >> 8; - checksumBuf[3] = fileChecksum; - (*outputFunc)(outputStream, checksumBuf, 4); - (*outputFunc)(outputStream, - (char *)file + newTables[i].origOffset + 12, - newTables[i].len - 12); - } else { - for (j = 0; j < newTables[i].len; ++j) { - (*outputFunc)(outputStream, "\0", 1); - } - } - } else if (newTables[i].tag == cmapTag && codeToGID) { - (*outputFunc)(outputStream, newCmapTab, newTables[i].len); - } else if (newTables[i].tag == cmapTag && missingCmap) { - (*outputFunc)(outputStream, cmapTab, newTables[i].len); - } else if (newTables[i].tag == nameTag && name) { - (*outputFunc)(outputStream, newNameTab, newTables[i].len); - } else if (newTables[i].tag == nameTag && missingName) { - (*outputFunc)(outputStream, nameTab, newTables[i].len); - } else if (newTables[i].tag == postTag && missingPost) { - (*outputFunc)(outputStream, postTab, newTables[i].len); - } else if (newTables[i].tag == os2Tag && missingOS2) { - (*outputFunc)(outputStream, os2Tab, newTables[i].len); - } else if (newTables[i].tag == hheaTag && abbrevHMTX) { - (*outputFunc)(outputStream, newHHEATab, newTables[i].len); - } else if (newTables[i].tag == hmtxTag && abbrevHMTX) { - (*outputFunc)(outputStream, newHMTXTab, newTables[i].len); - } else if (newTables[i].tag == locaTag && unsortedLoca) { - for (j = 0; j <= nGlyphs; ++j) { - if (locaFmt) { - locaBuf[0] = (char)(locaTable[j].newOffset >> 24); - locaBuf[1] = (char)(locaTable[j].newOffset >> 16); - locaBuf[2] = (char)(locaTable[j].newOffset >> 8); - locaBuf[3] = (char) locaTable[j].newOffset; - (*outputFunc)(outputStream, locaBuf, 4); - } else { - locaBuf[0] = (char)(locaTable[j].newOffset >> 9); - locaBuf[1] = (char)(locaTable[j].newOffset >> 1); - (*outputFunc)(outputStream, locaBuf, 2); - } - } - } else if (newTables[i].tag == glyfTag && unsortedLoca) { - pos = tables[seekTable("glyf")].offset; - for (j = 0; j < nGlyphs; ++j) { - n = locaTable[j].len; - if (n > 0) { - k = locaTable[j].origOffset; - if (checkRegion(pos + k, n)) { - (*outputFunc)(outputStream, (char *)file + pos + k, n); - } else { - for (k = 0; k < n; ++k) { - (*outputFunc)(outputStream, "\0", 1); - } - } - if ((k = locaTable[j].len & 3)) { - (*outputFunc)(outputStream, "\0\0\0\0", 4 - k); - } - } - } - } else { - if (checkRegion(newTables[i].origOffset, newTables[i].len)) { - (*outputFunc)(outputStream, (char *)file + newTables[i].origOffset, - newTables[i].len); - } else { - for (j = 0; j < newTables[i].len; ++j) { - (*outputFunc)(outputStream, "\0", 1); - } - } - } - if (newTables[i].len & 3) { - (*outputFunc)(outputStream, "\0\0\0", 4 - (newTables[i].len & 3)); - } - } - - gfree(newHMTXTab); - gfree(newHHEATab); - gfree(newCmapTab); - gfree(newNameTab); - gfree(tableDir); - gfree(newTables); - done1: - gfree(locaTable); -} - -void FoFiTrueType::cvtEncoding(char **encoding, - FoFiOutputFunc outputFunc, - void *outputStream) { - char *name; - GString *buf; - int i; - - (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); - if (encoding) { - for (i = 0; i < 256; ++i) { - if (!(name = encoding[i])) { - name = ".notdef"; - } - buf = GString::format("dup {0:d} /", i); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, name, strlen(name)); - (*outputFunc)(outputStream, " put\n", 5); - } - } else { - for (i = 0; i < 256; ++i) { - buf = GString::format("dup {0:d} /c{1:02x} put\n", i, i); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - } - (*outputFunc)(outputStream, "readonly def\n", 13); -} - -void FoFiTrueType::cvtCharStrings(char **encoding, - Gushort *codeToGID, - FoFiOutputFunc outputFunc, - void *outputStream) { - char *name; - GString *buf; - char buf2[16]; - int i, k; - - // always define '.notdef' - (*outputFunc)(outputStream, "/CharStrings 256 dict dup begin\n", 32); - (*outputFunc)(outputStream, "/.notdef 0 def\n", 15); - - // if there's no 'cmap' table, punt - if (nCmaps == 0) { - goto err; - } - - // map char name to glyph index: - // 1. use encoding to map name to char code - // 2. use codeToGID to map char code to glyph index - // N.B. We do this in reverse order because font subsets can have - // weird encodings that use the same character name twice, and - // the first definition is probably the one we want. - k = 0; // make gcc happy - for (i = 255; i >= 0; --i) { - if (encoding) { - name = encoding[i]; - } else { - sprintf(buf2, "c%02x", i); - name = buf2; - } - if (name && strcmp(name, ".notdef")) { - k = codeToGID[i]; - // note: Distiller (maybe Adobe's PS interpreter in general) - // doesn't like TrueType fonts that have CharStrings entries - // which point to nonexistent glyphs, hence the (k < nGlyphs) - // test - if (k > 0 && k < nGlyphs) { - (*outputFunc)(outputStream, "/", 1); - (*outputFunc)(outputStream, name, strlen(name)); - buf = GString::format(" {0:d} def\n", k); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - } - } - - err: - (*outputFunc)(outputStream, "end readonly def\n", 17); -} - -void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc, - void *outputStream, GString *name, - GBool needVerticalMetrics) { - Guchar headData[54]; - TrueTypeLoca *locaTable; - Guchar *locaData; - TrueTypeTable newTables[nT42Tables]; - Guchar tableDir[12 + nT42Tables*16]; - GBool ok; - Guint checksum; - int nNewTables; - int length, pos, glyfPos, i, j, k; - Guchar vheaTab[36] = { - 0, 1, 0, 0, // table version number - 0, 0, // ascent - 0, 0, // descent - 0, 0, // reserved - 0, 0, // max advance height - 0, 0, // min top side bearing - 0, 0, // min bottom side bearing - 0, 0, // y max extent - 0, 0, // caret slope rise - 0, 1, // caret slope run - 0, 0, // caret offset - 0, 0, // reserved - 0, 0, // reserved - 0, 0, // reserved - 0, 0, // reserved - 0, 0, // metric data format - 0, 1 // number of advance heights in vmtx table - }; - Guchar *vmtxTab; - GBool needVhea, needVmtx; - int advance; - - // construct the 'head' table, zero out the font checksum - i = seekTable("head"); - pos = tables[i].offset; - if (!checkRegion(pos, 54)) { - return; - } - memcpy(headData, file + pos, 54); - headData[8] = headData[9] = headData[10] = headData[11] = (Guchar)0; - - // read the original 'loca' table, pad entries out to 4 bytes, and - // sort it into proper order -- some (non-compliant) fonts have - // out-of-order loca tables; in order to correctly handle the case - // where (compliant) fonts have empty entries in the middle of the - // table, cmpTrueTypeLocaPos uses offset as its primary sort key, - // and idx as its secondary key (ensuring that adjacent entries with - // the same pos value remain in the same order) - locaTable = (TrueTypeLoca *)gmallocn(nGlyphs + 1, sizeof(TrueTypeLoca)); - i = seekTable("loca"); - pos = tables[i].offset; - ok = gTrue; - for (i = 0; i <= nGlyphs; ++i) { - locaTable[i].idx = i; - if (locaFmt) { - locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok); - } else { - locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok); - } - } - qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca), - &cmpTrueTypeLocaOffset); - for (i = 0; i < nGlyphs; ++i) { - locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset; - } - locaTable[nGlyphs].len = 0; - qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca), - &cmpTrueTypeLocaIdx); - pos = 0; - for (i = 0; i <= nGlyphs; ++i) { - locaTable[i].newOffset = pos; - pos += locaTable[i].len; - if (pos & 3) { - pos += 4 - (pos & 3); - } - } - - // construct the new 'loca' table - locaData = (Guchar *)gmallocn(nGlyphs + 1, (locaFmt ? 4 : 2)); - for (i = 0; i <= nGlyphs; ++i) { - pos = locaTable[i].newOffset; - if (locaFmt) { - locaData[4*i ] = (Guchar)(pos >> 24); - locaData[4*i+1] = (Guchar)(pos >> 16); - locaData[4*i+2] = (Guchar)(pos >> 8); - locaData[4*i+3] = (Guchar) pos; - } else { - locaData[2*i ] = (Guchar)(pos >> 9); - locaData[2*i+1] = (Guchar)(pos >> 1); - } - } - - // count the number of tables - nNewTables = 0; - for (i = 0; i < nT42Tables; ++i) { - if (t42Tables[i].required || - seekTable(t42Tables[i].tag) >= 0) { - ++nNewTables; - } - } - vmtxTab = NULL; // make gcc happy - advance = 0; // make gcc happy - if (needVerticalMetrics) { - needVhea = seekTable("vhea") < 0; - needVmtx = seekTable("vmtx") < 0; - if (needVhea || needVmtx) { - i = seekTable("head"); - advance = getU16BE(tables[i].offset + 18, &ok); // units per em - if (needVhea) { - ++nNewTables; - } - if (needVmtx) { - ++nNewTables; - } - } - } - - // construct the new table headers, including table checksums - // (pad each table out to a multiple of 4 bytes) - pos = 12 + nNewTables*16; - k = 0; - for (i = 0; i < nT42Tables; ++i) { - length = -1; - checksum = 0; // make gcc happy - if (i == t42HeadTable) { - length = 54; - checksum = computeTableChecksum(headData, 54); - } else if (i == t42LocaTable) { - length = (nGlyphs + 1) * (locaFmt ? 4 : 2); - checksum = computeTableChecksum(locaData, length); - } else if (i == t42GlyfTable) { - length = 0; - checksum = 0; - glyfPos = tables[seekTable("glyf")].offset; - for (j = 0; j < nGlyphs; ++j) { - length += locaTable[j].len; - if (length & 3) { - length += 4 - (length & 3); - } - if (checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) { - checksum += - computeTableChecksum(file + glyfPos + locaTable[j].origOffset, - locaTable[j].len); - } - } - } else { - if ((j = seekTable(t42Tables[i].tag)) >= 0) { - length = tables[j].len; - if (checkRegion(tables[j].offset, length)) { - checksum = computeTableChecksum(file + tables[j].offset, length); - } - } else if (needVerticalMetrics && i == t42VheaTable) { - vheaTab[10] = advance / 256; // max advance height - vheaTab[11] = advance % 256; - length = sizeof(vheaTab); - checksum = computeTableChecksum(vheaTab, length); - } else if (needVerticalMetrics && i == t42VmtxTable) { - length = 4 + (nGlyphs - 1) * 4; - vmtxTab = (Guchar *)gmalloc(length); - vmtxTab[0] = advance / 256; - vmtxTab[1] = advance % 256; - for (j = 2; j < length; j += 2) { - vmtxTab[j] = 0; - vmtxTab[j+1] = 0; - } - checksum = computeTableChecksum(vmtxTab, length); - } else if (t42Tables[i].required) { - //~ error(-1, "Embedded TrueType font is missing a required table ('%s')", - //~ t42Tables[i].tag); - length = 0; - checksum = 0; - } - } - if (length >= 0) { - newTables[k].tag = ((t42Tables[i].tag[0] & 0xff) << 24) | - ((t42Tables[i].tag[1] & 0xff) << 16) | - ((t42Tables[i].tag[2] & 0xff) << 8) | - (t42Tables[i].tag[3] & 0xff); - newTables[k].checksum = checksum; - newTables[k].offset = pos; - newTables[k].len = length; - pos += length; - if (pos & 3) { - pos += 4 - (length & 3); - } - ++k; - } - } - - // construct the table directory - tableDir[0] = 0x00; // sfnt version - tableDir[1] = 0x01; - tableDir[2] = 0x00; - tableDir[3] = 0x00; - tableDir[4] = 0; // numTables - tableDir[5] = nNewTables; - tableDir[6] = 0; // searchRange - tableDir[7] = (Guchar)128; - tableDir[8] = 0; // entrySelector - tableDir[9] = 3; - tableDir[10] = 0; // rangeShift - tableDir[11] = (Guchar)(16 * nNewTables - 128); - pos = 12; - for (i = 0; i < nNewTables; ++i) { - tableDir[pos ] = (Guchar)(newTables[i].tag >> 24); - tableDir[pos+ 1] = (Guchar)(newTables[i].tag >> 16); - tableDir[pos+ 2] = (Guchar)(newTables[i].tag >> 8); - tableDir[pos+ 3] = (Guchar) newTables[i].tag; - tableDir[pos+ 4] = (Guchar)(newTables[i].checksum >> 24); - tableDir[pos+ 5] = (Guchar)(newTables[i].checksum >> 16); - tableDir[pos+ 6] = (Guchar)(newTables[i].checksum >> 8); - tableDir[pos+ 7] = (Guchar) newTables[i].checksum; - tableDir[pos+ 8] = (Guchar)(newTables[i].offset >> 24); - tableDir[pos+ 9] = (Guchar)(newTables[i].offset >> 16); - tableDir[pos+10] = (Guchar)(newTables[i].offset >> 8); - tableDir[pos+11] = (Guchar) newTables[i].offset; - tableDir[pos+12] = (Guchar)(newTables[i].len >> 24); - tableDir[pos+13] = (Guchar)(newTables[i].len >> 16); - tableDir[pos+14] = (Guchar)(newTables[i].len >> 8); - tableDir[pos+15] = (Guchar) newTables[i].len; - pos += 16; - } - - // compute the font checksum and store it in the head table - checksum = computeTableChecksum(tableDir, 12 + nNewTables*16); - for (i = 0; i < nNewTables; ++i) { - checksum += newTables[i].checksum; - } - checksum = 0xb1b0afba - checksum; // because the TrueType spec says so - headData[ 8] = (Guchar)(checksum >> 24); - headData[ 9] = (Guchar)(checksum >> 16); - headData[10] = (Guchar)(checksum >> 8); - headData[11] = (Guchar) checksum; - - // start the sfnts array - if (name) { - (*outputFunc)(outputStream, "/", 1); - (*outputFunc)(outputStream, name->getCString(), name->getLength()); - (*outputFunc)(outputStream, " [\n", 3); - } else { - (*outputFunc)(outputStream, "/sfnts [\n", 9); - } - - // write the table directory - dumpString(tableDir, 12 + nNewTables*16, outputFunc, outputStream); - - // write the tables - for (i = 0; i < nNewTables; ++i) { - if (i == t42HeadTable) { - dumpString(headData, 54, outputFunc, outputStream); - } else if (i == t42LocaTable) { - length = (nGlyphs + 1) * (locaFmt ? 4 : 2); - dumpString(locaData, length, outputFunc, outputStream); - } else if (i == t42GlyfTable) { - glyfPos = tables[seekTable("glyf")].offset; - for (j = 0; j < nGlyphs; ++j) { - if (locaTable[j].len > 0 && - checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) { - dumpString(file + glyfPos + locaTable[j].origOffset, - locaTable[j].len, outputFunc, outputStream); - } - } - } else { - // length == 0 means the table is missing and the error was - // already reported during the construction of the table - // headers - if ((length = newTables[i].len) > 0) { - if ((j = seekTable(t42Tables[i].tag)) >= 0 && - checkRegion(tables[j].offset, tables[j].len)) { - dumpString(file + tables[j].offset, tables[j].len, - outputFunc, outputStream); - } else if (needVerticalMetrics && i == t42VheaTable) { - dumpString(vheaTab, length, outputFunc, outputStream); - } else if (needVerticalMetrics && i == t42VmtxTable) { - dumpString(vmtxTab, length, outputFunc, outputStream); - gfree(vmtxTab); - } - } - } - } - - // end the sfnts array - (*outputFunc)(outputStream, "] def\n", 6); - - gfree(locaData); - gfree(locaTable); -} - -void FoFiTrueType::dumpString(Guchar *s, int length, - FoFiOutputFunc outputFunc, - void *outputStream) { - GString *buf; - int pad, i, j; - - (*outputFunc)(outputStream, "<", 1); - for (i = 0; i < length; i += 32) { - for (j = 0; j < 32 && i+j < length; ++j) { - buf = GString::format("{0:02x}", s[i+j] & 0xff); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (i % (65536 - 32) == 65536 - 64) { - (*outputFunc)(outputStream, ">\n<", 3); - } else if (i+32 < length) { - (*outputFunc)(outputStream, "\n", 1); - } - } - if (length & 3) { - pad = 4 - (length & 3); - for (i = 0; i < pad; ++i) { - (*outputFunc)(outputStream, "00", 2); - } - } - // add an extra zero byte because the Adobe Type 42 spec says so - (*outputFunc)(outputStream, "00>\n", 4); -} - -Guint FoFiTrueType::computeTableChecksum(Guchar *data, int length) { - Guint checksum, word; - int i; - - checksum = 0; - for (i = 0; i+3 < length; i += 4) { - word = ((data[i ] & 0xff) << 24) + - ((data[i+1] & 0xff) << 16) + - ((data[i+2] & 0xff) << 8) + - (data[i+3] & 0xff); - checksum += word; - } - if (length & 3) { - word = 0; - i = length & ~3; - switch (length & 3) { - case 3: - word |= (data[i+2] & 0xff) << 8; - case 2: - word |= (data[i+1] & 0xff) << 16; - case 1: - word |= (data[i ] & 0xff) << 24; - break; - } - checksum += word; - } - return checksum; -} - -void FoFiTrueType::parse() { - Guint topTag; - int pos, ver, i, j; - - parsedOk = gTrue; - - // look for a collection (TTC) - topTag = getU32BE(0, &parsedOk); - if (!parsedOk) { - return; - } - if (topTag == ttcfTag) { - pos = getU32BE(12, &parsedOk); - if (!parsedOk) { - return; - } - } else { - pos = 0; - } - - // check the sfnt version - ver = getU32BE(pos, &parsedOk); - if (!parsedOk) { - return; - } - openTypeCFF = ver == 0x4f54544f; // 'OTTO' - - // read the table directory - nTables = getU16BE(pos + 4, &parsedOk); - if (!parsedOk) { - return; - } - tables = (TrueTypeTable *)gmallocn(nTables, sizeof(TrueTypeTable)); - pos += 12; - for (i = 0; i < nTables; ++i) { - tables[i].tag = getU32BE(pos, &parsedOk); - tables[i].checksum = getU32BE(pos + 4, &parsedOk); - tables[i].offset = (int)getU32BE(pos + 8, &parsedOk); - tables[i].len = (int)getU32BE(pos + 12, &parsedOk); - if (tables[i].offset + tables[i].len < tables[i].offset || - tables[i].offset + tables[i].len > len) { - parsedOk = gFalse; - } - pos += 16; - } - if (!parsedOk) { - return; - } - - // check for tables that are required by both the TrueType spec and - // the Type 42 spec - if (seekTable("head") < 0 || - seekTable("hhea") < 0 || - seekTable("maxp") < 0 || - seekTable("hmtx") < 0 || - (!openTypeCFF && seekTable("loca") < 0) || - (!openTypeCFF && seekTable("glyf") < 0) || - (openTypeCFF && seekTable("CFF ") < 0)) { - parsedOk = gFalse; - return; - } - - // read the cmaps - if ((i = seekTable("cmap")) >= 0) { - pos = tables[i].offset + 2; - nCmaps = getU16BE(pos, &parsedOk); - pos += 2; - if (!parsedOk) { - return; - } - cmaps = (TrueTypeCmap *)gmallocn(nCmaps, sizeof(TrueTypeCmap)); - for (j = 0; j < nCmaps; ++j) { - cmaps[j].platform = getU16BE(pos, &parsedOk); - cmaps[j].encoding = getU16BE(pos + 2, &parsedOk); - cmaps[j].offset = tables[i].offset + getU32BE(pos + 4, &parsedOk); - pos += 8; - cmaps[j].fmt = getU16BE(cmaps[j].offset, &parsedOk); - cmaps[j].len = getU16BE(cmaps[j].offset + 2, &parsedOk); - } - if (!parsedOk) { - return; - } - } else { - nCmaps = 0; - } - - // get the number of glyphs from the maxp table - i = seekTable("maxp"); - nGlyphs = getU16BE(tables[i].offset + 4, &parsedOk); - if (!parsedOk) { - return; - } - - // get the bbox and loca table format from the head table - i = seekTable("head"); - bbox[0] = getS16BE(tables[i].offset + 36, &parsedOk); - bbox[1] = getS16BE(tables[i].offset + 38, &parsedOk); - bbox[2] = getS16BE(tables[i].offset + 40, &parsedOk); - bbox[3] = getS16BE(tables[i].offset + 42, &parsedOk); - locaFmt = getS16BE(tables[i].offset + 50, &parsedOk); - if (!parsedOk) { - return; - } - - // make sure the loca table is sane (correct length and entries are - // in bounds) - if (!openTypeCFF) { - i = seekTable("loca"); - if (tables[i].len < 0) { - parsedOk = gFalse; - return; - } - if (tables[i].len < (nGlyphs + 1) * (locaFmt ? 4 : 2)) { - nGlyphs = tables[i].len / (locaFmt ? 4 : 2) - 1; - } - for (j = 0; j <= nGlyphs; ++j) { - if (locaFmt) { - pos = (int)getU32BE(tables[i].offset + j*4, &parsedOk); - } else { - pos = getU16BE(tables[i].offset + j*2, &parsedOk); - } - if (pos < 0 || pos > len) { - parsedOk = gFalse; - } - } - if (!parsedOk) { - return; - } - } - - // read the post table - readPostTable(); -} - -void FoFiTrueType::readPostTable() { - GString *name; - int tablePos, postFmt, stringIdx, stringPos; - GBool ok; - int i, j, n, m; - - ok = gTrue; - if ((i = seekTable("post")) < 0) { - return; - } - tablePos = tables[i].offset; - postFmt = getU32BE(tablePos, &ok); - if (!ok) { - goto err; - } - if (postFmt == 0x00010000) { - nameToGID = new GHash(gTrue); - for (i = 0; i < 258; ++i) { - nameToGID->add(new GString(macGlyphNames[i]), i); - } - } else if (postFmt == 0x00020000) { - nameToGID = new GHash(gTrue); - n = getU16BE(tablePos + 32, &ok); - if (!ok) { - goto err; - } - if (n > nGlyphs) { - n = nGlyphs; - } - stringIdx = 0; - stringPos = tablePos + 34 + 2*n; - for (i = 0; i < n; ++i) { - j = getU16BE(tablePos + 34 + 2*i, &ok); - if (j < 258) { - nameToGID->removeInt(macGlyphNames[j]); - nameToGID->add(new GString(macGlyphNames[j]), i); - } else { - j -= 258; - if (j != stringIdx) { - for (stringIdx = 0, stringPos = tablePos + 34 + 2*n; - stringIdx < j; - ++stringIdx, stringPos += 1 + getU8(stringPos, &ok)) ; - if (!ok) { - goto err; - } - } - m = getU8(stringPos, &ok); - if (!ok || !checkRegion(stringPos + 1, m)) { - goto err; - } - name = new GString((char *)&file[stringPos + 1], m); - nameToGID->removeInt(name); - nameToGID->add(name, i); - ++stringIdx; - stringPos += 1 + m; - } - } - } else if (postFmt == 0x00028000) { - nameToGID = new GHash(gTrue); - for (i = 0; i < nGlyphs; ++i) { - j = getU8(tablePos + 32 + i, &ok); - if (!ok) { - goto err; - } - if (j < 258) { - nameToGID->removeInt(macGlyphNames[j]); - nameToGID->add(new GString(macGlyphNames[j]), i); - } - } - } - - return; - - err: - if (nameToGID) { - delete nameToGID; - nameToGID = NULL; - } -} - -int FoFiTrueType::seekTable(char *tag) { - Guint tagI; - int i; - - tagI = ((tag[0] & 0xff) << 24) | - ((tag[1] & 0xff) << 16) | - ((tag[2] & 0xff) << 8) | - (tag[3] & 0xff); - for (i = 0; i < nTables; ++i) { - if (tables[i].tag == tagI) { - return i; - } - } - return -1; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.h deleted file mode 100644 index cf06ae78a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiTrueType.h +++ /dev/null @@ -1,174 +0,0 @@ -//======================================================================== -// -// FoFiTrueType.h -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef FOFITRUETYPE_H -#define FOFITRUETYPE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "FoFiBase.h" - -class GString; -class GHash; -struct TrueTypeTable; -struct TrueTypeCmap; - -//------------------------------------------------------------------------ -// FoFiTrueType -//------------------------------------------------------------------------ - -class FoFiTrueType: public FoFiBase { -public: - - // Create a FoFiTrueType object from a memory buffer. - static FoFiTrueType *make(char *fileA, int lenA); - - // Create a FoFiTrueType object from a file on disk. - static FoFiTrueType *load(char *fileName); - - virtual ~FoFiTrueType(); - - // Returns true if this an OpenType font containing CFF data, false - // if it's a TrueType font (or OpenType font with TrueType data). - GBool isOpenTypeCFF() { return openTypeCFF; } - - // Return the number of cmaps defined by this font. - int getNumCmaps(); - - // Return the platform ID of the th cmap. - int getCmapPlatform(int i); - - // Return the encoding ID of the th cmap. - int getCmapEncoding(int i); - - // Return the index of the cmap for , . Returns - // -1 if there is no corresponding cmap. - int findCmap(int platform, int encoding); - - // Return the GID corresponding to according to the th cmap. - Gushort mapCodeToGID(int i, int c); - - // Returns the GID corresponding to according to the post - // table. Returns 0 if there is no mapping for or if the - // font does not have a post table. - int mapNameToGID(char *name); - - // Return the mapping from CIDs to GIDs, and return the number of - // CIDs in *. This is only useful for CID fonts. (Only - // useful for OpenType CFF fonts.) - Gushort *getCIDToGIDMap(int *nCIDs); - - // Returns the least restrictive embedding licensing right (as - // defined by the TrueType spec): - // * 4: OS/2 table is missing or invalid - // * 3: installable embedding - // * 2: editable embedding - // * 1: preview & print embedding - // * 0: restricted license embedding - int getEmbeddingRights(); - - // Convert to a Type 42 font, suitable for embedding in a PostScript - // file. will be used as the PostScript font name (so we - // don't need to depend on the 'name' table in the font). The - // array specifies the mapping from char codes to names. - // If is NULL, the encoding is unknown or undefined. The - // array specifies the mapping from char codes to GIDs. - // (Not useful for OpenType CFF fonts.) - void convertToType42(char *psName, char **encoding, - Gushort *codeToGID, - FoFiOutputFunc outputFunc, void *outputStream); - - // Convert to a Type 1 font, suitable for embedding in a PostScript - // file. This is only useful with 8-bit fonts. If is - // not NULL, it will be used in place of the encoding in the Type 1C - // font. If is true the eexec section will be hex-encoded, - // otherwise it will be left as binary data. If is - // non-NULL, it will be used as the PostScript font name. (Only - // useful for OpenType CFF fonts.) - void convertToType1(char *psName, char **newEncoding, GBool ascii, - FoFiOutputFunc outputFunc, void *outputStream); - - // Convert to a Type 2 CIDFont, suitable for embedding in a - // PostScript file. will be used as the PostScript font - // name (so we don't need to depend on the 'name' table in the - // font). The array maps CIDs to GIDs; it has - // entries. (Not useful for OpenType CFF fonts.) - void convertToCIDType2(char *psName, Gushort *cidMap, int nCIDs, - GBool needVerticalMetrics, - FoFiOutputFunc outputFunc, void *outputStream); - - // Convert to a Type 0 CIDFont, suitable for embedding in a - // PostScript file. will be used as the PostScript font - // name. (Only useful for OpenType CFF fonts.) - void convertToCIDType0(char *psName, - FoFiOutputFunc outputFunc, void *outputStream); - - // Convert to a Type 0 (but non-CID) composite font, suitable for - // embedding in a PostScript file. will be used as the - // PostScript font name (so we don't need to depend on the 'name' - // table in the font). The array maps CIDs to GIDs; it has - // entries. (Not useful for OpenType CFF fonts.) - void convertToType0(char *psName, Gushort *cidMap, int nCIDs, - GBool needVerticalMetrics, - FoFiOutputFunc outputFunc, void *outputStream); - - // Convert to a Type 0 (but non-CID) composite font, suitable for - // embedding in a PostScript file. will be used as the - // PostScript font name. (Only useful for OpenType CFF fonts.) - void convertToType0(char *psName, - FoFiOutputFunc outputFunc, void *outputStream); - - // Write a clean TTF file, filling in missing tables and correcting - // various other errors. If is non-NULL, the font is renamed - // to . If is non-NULL, the font is re-encoded, - // using a Windows Unicode cmap. If is NULL and the font is - // complete and correct, it will be written unmodified. (Not useful - // for OpenType CFF fonts.) - void writeTTF(FoFiOutputFunc outputFunc, void *outputStream, - char *name = NULL, Gushort *codeToGID = NULL); - -private: - - FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA); - void cvtEncoding(char **encoding, - FoFiOutputFunc outputFunc, - void *outputStream); - void cvtCharStrings(char **encoding, - Gushort *codeToGID, - FoFiOutputFunc outputFunc, - void *outputStream); - void cvtSfnts(FoFiOutputFunc outputFunc, - void *outputStream, GString *name, - GBool needVerticalMetrics); - void dumpString(Guchar *s, int length, - FoFiOutputFunc outputFunc, - void *outputStream); - Guint computeTableChecksum(Guchar *data, int length); - void parse(); - void readPostTable(); - int seekTable(char *tag); - - TrueTypeTable *tables; - int nTables; - TrueTypeCmap *cmaps; - int nCmaps; - int nGlyphs; - int locaFmt; - int bbox[4]; - GHash *nameToGID; - GBool openTypeCFF; - - GBool parsedOk; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.cc deleted file mode 100644 index efad5ee4e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.cc +++ /dev/null @@ -1,252 +0,0 @@ -//======================================================================== -// -// FoFiType1.cc -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "FoFiEncodings.h" -#include "FoFiType1.h" - -//------------------------------------------------------------------------ -// FoFiType1 -//------------------------------------------------------------------------ - -FoFiType1 *FoFiType1::make(char *fileA, int lenA) { - return new FoFiType1(fileA, lenA, gFalse); -} - -FoFiType1 *FoFiType1::load(char *fileName) { - char *fileA; - int lenA; - - if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { - return NULL; - } - return new FoFiType1(fileA, lenA, gTrue); -} - -FoFiType1::FoFiType1(char *fileA, int lenA, GBool freeFileDataA): - FoFiBase(fileA, lenA, freeFileDataA) -{ - name = NULL; - encoding = NULL; - parsed = gFalse; -} - -FoFiType1::~FoFiType1() { - int i; - - if (name) { - gfree(name); - } - if (encoding && encoding != fofiType1StandardEncoding) { - for (i = 0; i < 256; ++i) { - gfree(encoding[i]); - } - gfree(encoding); - } -} - -char *FoFiType1::getName() { - if (!parsed) { - parse(); - } - return name; -} - -char **FoFiType1::getEncoding() { - if (!parsed) { - parse(); - } - return encoding; -} - -void FoFiType1::writeEncoded(char **newEncoding, - FoFiOutputFunc outputFunc, void *outputStream) { - char buf[512]; - char *line, *line2, *p; - int i; - - // copy everything up to the encoding - for (line = (char *)file; - line && strncmp(line, "/Encoding", 9); - line = getNextLine(line)) ; - if (!line) { - // no encoding - just copy the whole font file - (*outputFunc)(outputStream, (char *)file, len); - return; - } - (*outputFunc)(outputStream, (char *)file, line - (char *)file); - - // write the new encoding - (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); - (*outputFunc)(outputStream, - "0 1 255 {1 index exch /.notdef put} for\n", 40); - for (i = 0; i < 256; ++i) { - if (newEncoding[i]) { - sprintf(buf, "dup %d /%s put\n", i, newEncoding[i]); - (*outputFunc)(outputStream, buf, strlen(buf)); - } - } - (*outputFunc)(outputStream, "readonly def\n", 13); - - // find the end of the encoding data - //~ this ought to parse PostScript tokens - if (!strncmp(line, "/Encoding StandardEncoding def", 30)) { - line = getNextLine(line); - } else { - // skip "/Encoding" + one whitespace char, - // then look for 'def' preceded by PostScript whitespace - p = line + 10; - line = NULL; - for (; p < (char *)file + len; ++p) { - if ((*p == ' ' || *p == '\t' || *p == '\x0a' || - *p == '\x0d' || *p == '\x0c' || *p == '\0') && - p + 4 <= (char *)file + len && - !strncmp(p + 1, "def", 3)) { - line = p + 4; - break; - } - } - } - - // some fonts have two /Encoding entries in their dictionary, so we - // check for a second one here - if (line) { - for (line2 = line, i = 0; - i < 20 && line2 && strncmp(line2, "/Encoding", 9); - line2 = getNextLine(line2), ++i) ; - if (i < 20 && line2) { - (*outputFunc)(outputStream, line, line2 - line); - if (!strncmp(line2, "/Encoding StandardEncoding def", 30)) { - line = getNextLine(line2); - } else { - // skip "/Encoding" + one whitespace char, - // then look for 'def' preceded by PostScript whitespace - p = line2 + 10; - line = NULL; - for (; p < (char *)file + len; ++p) { - if ((*p == ' ' || *p == '\t' || *p == '\x0a' || - *p == '\x0d' || *p == '\x0c' || *p == '\0') && - p + 4 <= (char *)file + len && - !strncmp(p + 1, "def", 3)) { - line = p + 4; - break; - } - } - } - } - - // copy everything after the encoding - if (line) { - (*outputFunc)(outputStream, line, ((char *)file + len) - line); - } - } -} - -char *FoFiType1::getNextLine(char *line) { - while (line < (char *)file + len && *line != '\x0a' && *line != '\x0d') { - ++line; - } - if (line < (char *)file + len && *line == '\x0d') { - ++line; - } - if (line < (char *)file + len && *line == '\x0a') { - ++line; - } - if (line >= (char *)file + len) { - return NULL; - } - return line; -} - -void FoFiType1::parse() { - char *line, *line1, *p, *p2; - char buf[256]; - char c; - int n, code, i, j; - - for (i = 1, line = (char *)file; - i <= 100 && line && (!name || !encoding); - ++i) { - - // get font name - if (!name && !strncmp(line, "/FontName", 9)) { - strncpy(buf, line, 255); - buf[255] = '\0'; - if ((p = strchr(buf+9, '/')) && - (p = strtok(p+1, " \t\n\r"))) { - name = copyString(p); - } - line = getNextLine(line); - - // get encoding - } else if (!encoding && - !strncmp(line, "/Encoding StandardEncoding def", 30)) { - encoding = fofiType1StandardEncoding; - } else if (!encoding && - !strncmp(line, "/Encoding 256 array", 19)) { - encoding = (char **)gmallocn(256, sizeof(char *)); - for (j = 0; j < 256; ++j) { - encoding[j] = NULL; - } - for (j = 0, line = getNextLine(line); - j < 300 && line && (line1 = getNextLine(line)); - ++j, line = line1) { - if ((n = line1 - line) > 255) { - n = 255; - } - strncpy(buf, line, n); - buf[n] = '\0'; - for (p = buf; *p == ' ' || *p == '\t'; ++p) ; - if (!strncmp(p, "dup", 3)) { - for (p += 3; *p == ' ' || *p == '\t'; ++p) ; - for (p2 = p; *p2 >= '0' && *p2 <= '9'; ++p2) ; - if (*p2) { - c = *p2; - *p2 = '\0'; - code = atoi(p); - *p2 = c; - if (code == 8 && *p2 == '#') { - code = 0; - for (++p2; *p2 >= '0' && *p2 <= '7'; ++p2) { - code = code * 8 + (*p2 - '0'); - } - } - if (code < 256) { - for (p = p2; *p == ' ' || *p == '\t'; ++p) ; - if (*p == '/') { - ++p; - for (p2 = p; *p2 && *p2 != ' ' && *p2 != '\t'; ++p2) ; - *p2 = '\0'; - encoding[code] = copyString(p); - } - } - } - } else { - if (strtok(buf, " \t") && - (p = strtok(NULL, " \t\n\r")) && !strcmp(p, "def")) { - break; - } - } - } - //~ check for getinterval/putinterval junk - - } else { - line = getNextLine(line); - } - } - - parsed = gTrue; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.h deleted file mode 100644 index 843352b2a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1.h +++ /dev/null @@ -1,59 +0,0 @@ -//======================================================================== -// -// FoFiType1.h -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef FOFITYPE1_H -#define FOFITYPE1_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "FoFiBase.h" - -//------------------------------------------------------------------------ -// FoFiType1 -//------------------------------------------------------------------------ - -class FoFiType1: public FoFiBase { -public: - - // Create a FoFiType1 object from a memory buffer. - static FoFiType1 *make(char *fileA, int lenA); - - // Create a FoFiType1 object from a file on disk. - static FoFiType1 *load(char *fileName); - - virtual ~FoFiType1(); - - // Return the font name. - char *getName(); - - // Return the encoding, as an array of 256 names (any of which may - // be NULL). - char **getEncoding(); - - // Write a version of the Type 1 font file with a new encoding. - void writeEncoded(char **newEncoding, - FoFiOutputFunc outputFunc, void *outputStream); - -private: - - FoFiType1(char *fileA, int lenA, GBool freeFileDataA); - - char *getNextLine(char *line); - void parse(); - - char *name; - char **encoding; - GBool parsed; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.cc deleted file mode 100644 index 3b28f3210..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.cc +++ /dev/null @@ -1,2603 +0,0 @@ -//======================================================================== -// -// FoFiType1C.cc -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include "gmem.h" -#include "GString.h" -#include "FoFiEncodings.h" -#include "FoFiType1C.h" - -//------------------------------------------------------------------------ - -static char hexChars[17] = "0123456789ABCDEF"; - -//------------------------------------------------------------------------ -// FoFiType1C -//------------------------------------------------------------------------ - -FoFiType1C *FoFiType1C::make(char *fileA, int lenA) { - FoFiType1C *ff; - - ff = new FoFiType1C(fileA, lenA, gFalse); - if (!ff->parse()) { - delete ff; - return NULL; - } - return ff; -} - -FoFiType1C *FoFiType1C::load(char *fileName) { - FoFiType1C *ff; - char *fileA; - int lenA; - - if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { - return NULL; - } - ff = new FoFiType1C(fileA, lenA, gTrue); - if (!ff->parse()) { - delete ff; - return NULL; - } - return ff; -} - -FoFiType1C::FoFiType1C(char *fileA, int lenA, GBool freeFileDataA): - FoFiBase(fileA, lenA, freeFileDataA) -{ - name = NULL; - encoding = NULL; - privateDicts = NULL; - fdSelect = NULL; - charset = NULL; -} - -FoFiType1C::~FoFiType1C() { - int i; - - if (name) { - delete name; - } - if (encoding && - encoding != fofiType1StandardEncoding && - encoding != fofiType1ExpertEncoding) { - for (i = 0; i < 256; ++i) { - gfree(encoding[i]); - } - gfree(encoding); - } - if (privateDicts) { - gfree(privateDicts); - } - if (fdSelect) { - gfree(fdSelect); - } - if (charset && - charset != fofiType1CISOAdobeCharset && - charset != fofiType1CExpertCharset && - charset != fofiType1CExpertSubsetCharset) { - gfree(charset); - } -} - -char *FoFiType1C::getName() { - return name ? name->getCString() : (char *)NULL; -} - -char **FoFiType1C::getEncoding() { - return encoding; -} - -Gushort *FoFiType1C::getCIDToGIDMap(int *nCIDs) { - Gushort *map; - int n, i; - - // a CID font's top dict has ROS as the first operator - if (topDict.firstOp != 0x0c1e) { - *nCIDs = 0; - return NULL; - } - - // in a CID font, the charset data is the GID-to-CID mapping, so all - // we have to do is reverse it - n = 0; - for (i = 0; i < nGlyphs; ++i) { - if (charset[i] > n) { - n = charset[i]; - } - } - ++n; - map = (Gushort *)gmallocn(n, sizeof(Gushort)); - memset(map, 0, n * sizeof(Gushort)); - for (i = 0; i < nGlyphs; ++i) { - map[charset[i]] = i; - } - *nCIDs = n; - return map; -} - -void FoFiType1C::convertToType1(char *psName, char **newEncoding, GBool ascii, - FoFiOutputFunc outputFunc, - void *outputStream) { - int psNameLen; - Type1CEexecBuf eb; - Type1CIndex subrIdx; - Type1CIndexVal val; - GString *buf; - char buf2[256]; - char **enc; - GBool ok; - int i; - - if (psName) { - psNameLen = strlen(psName); - } else { - psName = name->getCString(); - psNameLen = name->getLength(); - } - - // write header and font dictionary, up to encoding - ok = gTrue; - (*outputFunc)(outputStream, "%!FontType1-1.0: ", 17); - (*outputFunc)(outputStream, psName, psNameLen); - if (topDict.versionSID != 0) { - getString(topDict.versionSID, buf2, &ok); - (*outputFunc)(outputStream, buf2, strlen(buf2)); - } - (*outputFunc)(outputStream, "\n", 1); - // the dictionary needs room for 12 entries: the following 9, plus - // Private and CharStrings (in the eexec section) and FID (which is - // added by definefont) - (*outputFunc)(outputStream, "12 dict begin\n", 14); - (*outputFunc)(outputStream, "/FontInfo 10 dict dup begin\n", 28); - if (topDict.versionSID != 0) { - (*outputFunc)(outputStream, "/version (", 10); - (*outputFunc)(outputStream, buf2, strlen(buf2)); - (*outputFunc)(outputStream, ") readonly def\n", 15); - } - if (topDict.noticeSID != 0) { - getString(topDict.noticeSID, buf2, &ok); - (*outputFunc)(outputStream, "/Notice (", 9); - (*outputFunc)(outputStream, buf2, strlen(buf2)); - (*outputFunc)(outputStream, ") readonly def\n", 15); - } - if (topDict.copyrightSID != 0) { - getString(topDict.copyrightSID, buf2, &ok); - (*outputFunc)(outputStream, "/Copyright (", 12); - (*outputFunc)(outputStream, buf2, strlen(buf2)); - (*outputFunc)(outputStream, ") readonly def\n", 15); - } - if (topDict.fullNameSID != 0) { - getString(topDict.fullNameSID, buf2, &ok); - (*outputFunc)(outputStream, "/FullName (", 11); - (*outputFunc)(outputStream, buf2, strlen(buf2)); - (*outputFunc)(outputStream, ") readonly def\n", 15); - } - if (topDict.familyNameSID != 0) { - getString(topDict.familyNameSID, buf2, &ok); - (*outputFunc)(outputStream, "/FamilyName (", 13); - (*outputFunc)(outputStream, buf2, strlen(buf2)); - (*outputFunc)(outputStream, ") readonly def\n", 15); - } - if (topDict.weightSID != 0) { - getString(topDict.weightSID, buf2, &ok); - (*outputFunc)(outputStream, "/Weight (", 9); - (*outputFunc)(outputStream, buf2, strlen(buf2)); - (*outputFunc)(outputStream, ") readonly def\n", 15); - } - if (topDict.isFixedPitch) { - (*outputFunc)(outputStream, "/isFixedPitch true def\n", 23); - } else { - (*outputFunc)(outputStream, "/isFixedPitch false def\n", 24); - } - buf = GString::format("/ItalicAngle {0:.4g} def\n", topDict.italicAngle); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - buf = GString::format("/UnderlinePosition {0:.4g} def\n", - topDict.underlinePosition); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - buf = GString::format("/UnderlineThickness {0:.4g} def\n", - topDict.underlineThickness); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "end readonly def\n", 17); - (*outputFunc)(outputStream, "/FontName /", 11); - (*outputFunc)(outputStream, psName, psNameLen); - (*outputFunc)(outputStream, " def\n", 5); - buf = GString::format("/PaintType {0:d} def\n", topDict.paintType); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/FontType 1 def\n", 16); - buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] readonly def\n", - topDict.fontMatrix[0], topDict.fontMatrix[1], - topDict.fontMatrix[2], topDict.fontMatrix[3], - topDict.fontMatrix[4], topDict.fontMatrix[5]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - buf = GString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] readonly def\n", - topDict.fontBBox[0], topDict.fontBBox[1], - topDict.fontBBox[2], topDict.fontBBox[3]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - buf = GString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - if (topDict.uniqueID != 0) { - buf = GString::format("/UniqueID {0:d} def\n", topDict.uniqueID); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - - // write the encoding - (*outputFunc)(outputStream, "/Encoding ", 10); - if (!newEncoding && encoding == fofiType1StandardEncoding) { - (*outputFunc)(outputStream, "StandardEncoding def\n", 21); - } else { - (*outputFunc)(outputStream, "256 array\n", 10); - (*outputFunc)(outputStream, - "0 1 255 {1 index exch /.notdef put} for\n", 40); - enc = newEncoding ? newEncoding : encoding; - for (i = 0; i < 256; ++i) { - if (enc[i]) { - buf = GString::format("dup {0:d} /{1:s} put\n", i, enc[i]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - } - (*outputFunc)(outputStream, "readonly def\n", 13); - } - (*outputFunc)(outputStream, "currentdict end\n", 16); - - // start the binary section - (*outputFunc)(outputStream, "currentfile eexec\n", 18); - eb.outputFunc = outputFunc; - eb.outputStream = outputStream; - eb.ascii = ascii; - eb.r1 = 55665; - eb.line = 0; - - // write the private dictionary - eexecWrite(&eb, "\x83\xca\x73\xd5"); - eexecWrite(&eb, "dup /Private 32 dict dup begin\n"); - eexecWrite(&eb, "/RD {string currentfile exch readstring pop}" - " executeonly def\n"); - eexecWrite(&eb, "/ND {noaccess def} executeonly def\n"); - eexecWrite(&eb, "/NP {noaccess put} executeonly def\n"); - eexecWrite(&eb, "/MinFeature {16 16} def\n"); - eexecWrite(&eb, "/password 5839 def\n"); - if (privateDicts[0].nBlueValues) { - eexecWrite(&eb, "/BlueValues ["); - for (i = 0; i < privateDicts[0].nBlueValues; ++i) { - buf = GString::format("{0:s}{1:d}", - i > 0 ? " " : "", privateDicts[0].blueValues[i]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[0].nOtherBlues) { - eexecWrite(&eb, "/OtherBlues ["); - for (i = 0; i < privateDicts[0].nOtherBlues; ++i) { - buf = GString::format("{0:s}{1:d}", - i > 0 ? " " : "", privateDicts[0].otherBlues[i]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[0].nFamilyBlues) { - eexecWrite(&eb, "/FamilyBlues ["); - for (i = 0; i < privateDicts[0].nFamilyBlues; ++i) { - buf = GString::format("{0:s}{1:d}", - i > 0 ? " " : "", privateDicts[0].familyBlues[i]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[0].nFamilyOtherBlues) { - eexecWrite(&eb, "/FamilyOtherBlues ["); - for (i = 0; i < privateDicts[0].nFamilyOtherBlues; ++i) { - buf = GString::format("{0:s}{1:d}", i > 0 ? " " : "", - privateDicts[0].familyOtherBlues[i]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[0].blueScale != 0.039625) { - buf = GString::format("/BlueScale {0:.4g} def\n", - privateDicts[0].blueScale); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[0].blueShift != 7) { - buf = GString::format("/BlueShift {0:d} def\n", privateDicts[0].blueShift); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[0].blueFuzz != 1) { - buf = GString::format("/BlueFuzz {0:d} def\n", privateDicts[0].blueFuzz); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[0].hasStdHW) { - buf = GString::format("/StdHW [{0:.4g}] def\n", privateDicts[0].stdHW); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[0].hasStdVW) { - buf = GString::format("/StdVW [{0:.4g}] def\n", privateDicts[0].stdVW); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[0].nStemSnapH) { - eexecWrite(&eb, "/StemSnapH ["); - for (i = 0; i < privateDicts[0].nStemSnapH; ++i) { - buf = GString::format("{0:s}{1:.4g}", - i > 0 ? " " : "", privateDicts[0].stemSnapH[i]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[0].nStemSnapV) { - eexecWrite(&eb, "/StemSnapV ["); - for (i = 0; i < privateDicts[0].nStemSnapV; ++i) { - buf = GString::format("{0:s}{1:.4g}", - i > 0 ? " " : "", privateDicts[0].stemSnapV[i]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[0].hasForceBold) { - buf = GString::format("/ForceBold {0:s} def\n", - privateDicts[0].forceBold ? "true" : "false"); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[0].forceBoldThreshold != 0) { - buf = GString::format("/ForceBoldThreshold {0:.4g} def\n", - privateDicts[0].forceBoldThreshold); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[0].languageGroup != 0) { - buf = GString::format("/LanguageGroup {0:d} def\n", - privateDicts[0].languageGroup); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[0].expansionFactor != 0.06) { - buf = GString::format("/ExpansionFactor {0:.4g} def\n", - privateDicts[0].expansionFactor); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - - // set up subroutines - ok = gTrue; - getIndex(privateDicts[0].subrsOffset, &subrIdx, &ok); - if (!ok) { - subrIdx.pos = -1; - } - - // write the CharStrings - buf = GString::format("2 index /CharStrings {0:d} dict dup begin\n", - nGlyphs); - eexecWrite(&eb, buf->getCString()); - delete buf; - for (i = 0; i < nGlyphs; ++i) { - ok = gTrue; - getIndexVal(&charStringsIdx, i, &val, &ok); - if (ok) { - getString(charset[i], buf2, &ok); - if (ok) { - eexecCvtGlyph(&eb, buf2, val.pos, val.len, &subrIdx, &privateDicts[0]); - } - } - } - eexecWrite(&eb, "end\n"); - eexecWrite(&eb, "end\n"); - eexecWrite(&eb, "readonly put\n"); - eexecWrite(&eb, "noaccess put\n"); - eexecWrite(&eb, "dup /FontName get exch definefont pop\n"); - eexecWrite(&eb, "mark currentfile closefile\n"); - - // trailer - if (ascii && eb.line > 0) { - (*outputFunc)(outputStream, "\n", 1); - } - for (i = 0; i < 8; ++i) { - (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65); - } - (*outputFunc)(outputStream, "cleartomark\n", 12); -} - -void FoFiType1C::convertToCIDType0(char *psName, - FoFiOutputFunc outputFunc, - void *outputStream) { - int *cidMap; - GString *charStrings; - int *charStringOffsets; - Type1CIndex subrIdx; - Type1CIndexVal val; - int nCIDs, gdBytes; - GString *buf; - char buf2[256]; - GBool ok; - int gid, offset, n, i, j, k; - - // compute the CID count and build the CID-to-GID mapping - nCIDs = 0; - for (i = 0; i < nGlyphs; ++i) { - if (charset[i] >= nCIDs) { - nCIDs = charset[i] + 1; - } - } - cidMap = (int *)gmallocn(nCIDs, sizeof(int)); - for (i = 0; i < nCIDs; ++i) { - cidMap[i] = -1; - } - for (i = 0; i < nGlyphs; ++i) { - cidMap[charset[i]] = i; - } - - // build the charstrings - charStrings = new GString(); - charStringOffsets = (int *)gmallocn(nCIDs + 1, sizeof(int)); - for (i = 0; i < nCIDs; ++i) { - charStringOffsets[i] = charStrings->getLength(); - if ((gid = cidMap[i]) >= 0) { - ok = gTrue; - getIndexVal(&charStringsIdx, gid, &val, &ok); - if (ok) { - getIndex(privateDicts[fdSelect[gid]].subrsOffset, &subrIdx, &ok); - if (!ok) { - subrIdx.pos = -1; - } - cvtGlyph(val.pos, val.len, charStrings, - &subrIdx, &privateDicts[fdSelect[gid]], gTrue); - } - } - } - charStringOffsets[nCIDs] = charStrings->getLength(); - - // compute gdBytes = number of bytes needed for charstring offsets - // (offset size needs to account for the charstring offset table, - // with a worst case of five bytes per entry, plus the charstrings - // themselves) - i = (nCIDs + 1) * 5 + charStrings->getLength(); - if (i < 0x100) { - gdBytes = 1; - } else if (i < 0x10000) { - gdBytes = 2; - } else if (i < 0x1000000) { - gdBytes = 3; - } else { - gdBytes = 4; - } - - // begin the font dictionary - (*outputFunc)(outputStream, "/CIDInit /ProcSet findresource begin\n", 37); - (*outputFunc)(outputStream, "20 dict begin\n", 14); - (*outputFunc)(outputStream, "/CIDFontName /", 14); - (*outputFunc)(outputStream, psName, strlen(psName)); - (*outputFunc)(outputStream, " def\n", 5); - (*outputFunc)(outputStream, "/CIDFontType 0 def\n", 19); - (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32); - if (topDict.registrySID > 0 && topDict.orderingSID > 0) { - ok = gTrue; - getString(topDict.registrySID, buf2, &ok); - if (ok) { - (*outputFunc)(outputStream, " /Registry (", 13); - (*outputFunc)(outputStream, buf2, strlen(buf2)); - (*outputFunc)(outputStream, ") def\n", 6); - } - ok = gTrue; - getString(topDict.orderingSID, buf2, &ok); - if (ok) { - (*outputFunc)(outputStream, " /Ordering (", 13); - (*outputFunc)(outputStream, buf2, strlen(buf2)); - (*outputFunc)(outputStream, ") def\n", 6); - } - } else { - (*outputFunc)(outputStream, " /Registry (Adobe) def\n", 24); - (*outputFunc)(outputStream, " /Ordering (Identity) def\n", 27); - } - buf = GString::format(" /Supplement {0:d} def\n", topDict.supplement); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "end def\n", 8); - if (topDict.hasFontMatrix) { - buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", - topDict.fontMatrix[0], topDict.fontMatrix[1], - topDict.fontMatrix[2], topDict.fontMatrix[3], - topDict.fontMatrix[4], topDict.fontMatrix[5]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } else if (privateDicts[0].hasFontMatrix) { - (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); - } else { - (*outputFunc)(outputStream, - "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38); - } - buf = GString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", - topDict.fontBBox[0], topDict.fontBBox[1], - topDict.fontBBox[2], topDict.fontBBox[3]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/FontInfo 1 dict dup begin\n", 27); - (*outputFunc)(outputStream, " /FSType 8 def\n", 16); - (*outputFunc)(outputStream, "end def\n", 8); - - // CIDFont-specific entries - buf = GString::format("/CIDCount {0:d} def\n", nCIDs); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/FDBytes 1 def\n", 15); - buf = GString::format("/GDBytes {0:d} def\n", gdBytes); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/CIDMapOffset 0 def\n", 20); - if (topDict.paintType != 0) { - buf = GString::format("/PaintType {0:d} def\n", topDict.paintType); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - buf = GString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - - // FDArray entry - buf = GString::format("/FDArray {0:d} array\n", nFDs); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - for (i = 0; i < nFDs; ++i) { - buf = GString::format("dup {0:d} 10 dict begin\n", i); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/FontType 1 def\n", 16); - if (privateDicts[i].hasFontMatrix) { - buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", - privateDicts[i].fontMatrix[0], - privateDicts[i].fontMatrix[1], - privateDicts[i].fontMatrix[2], - privateDicts[i].fontMatrix[3], - privateDicts[i].fontMatrix[4], - privateDicts[i].fontMatrix[5]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } else { - (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); - } - buf = GString::format("/PaintType {0:d} def\n", topDict.paintType); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/Private 32 dict begin\n", 23); - if (privateDicts[i].nBlueValues) { - (*outputFunc)(outputStream, "/BlueValues [", 13); - for (j = 0; j < privateDicts[i].nBlueValues; ++j) { - buf = GString::format("{0:s}{1:d}", - j > 0 ? " " : "", privateDicts[i].blueValues[j]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - } - if (privateDicts[i].nOtherBlues) { - (*outputFunc)(outputStream, "/OtherBlues [", 13); - for (j = 0; j < privateDicts[i].nOtherBlues; ++j) { - buf = GString::format("{0:s}{1:d}", - j > 0 ? " " : "", privateDicts[i].otherBlues[j]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - } - if (privateDicts[i].nFamilyBlues) { - (*outputFunc)(outputStream, "/FamilyBlues [", 14); - for (j = 0; j < privateDicts[i].nFamilyBlues; ++j) { - buf = GString::format("{0:s}{1:d}", - j > 0 ? " " : "", - privateDicts[i].familyBlues[j]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - } - if (privateDicts[i].nFamilyOtherBlues) { - (*outputFunc)(outputStream, "/FamilyOtherBlues [", 19); - for (j = 0; j < privateDicts[i].nFamilyOtherBlues; ++j) { - buf = GString::format("{0:s}{1:d}", j > 0 ? " " : "", - privateDicts[i].familyOtherBlues[j]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - } - if (privateDicts[i].blueScale != 0.039625) { - buf = GString::format("/BlueScale {0:.4g} def\n", - privateDicts[i].blueScale); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (privateDicts[i].blueShift != 7) { - buf = GString::format("/BlueShift {0:d} def\n", - privateDicts[i].blueShift); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (privateDicts[i].blueFuzz != 1) { - buf = GString::format("/BlueFuzz {0:d} def\n", privateDicts[i].blueFuzz); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (privateDicts[i].hasStdHW) { - buf = GString::format("/StdHW [{0:.4g}] def\n", privateDicts[i].stdHW); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (privateDicts[i].hasStdVW) { - buf = GString::format("/StdVW [{0:.4g}] def\n", privateDicts[i].stdVW); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (privateDicts[i].nStemSnapH) { - (*outputFunc)(outputStream, "/StemSnapH [", 12); - for (j = 0; j < privateDicts[i].nStemSnapH; ++j) { - buf = GString::format("{0:s}{1:.4g}", - j > 0 ? " " : "", privateDicts[i].stemSnapH[j]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - } - if (privateDicts[i].nStemSnapV) { - (*outputFunc)(outputStream, "/StemSnapV [", 12); - for (j = 0; j < privateDicts[i].nStemSnapV; ++j) { - buf = GString::format("{0:s}{1:.4g}", - j > 0 ? " " : "", privateDicts[i].stemSnapV[j]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - } - if (privateDicts[i].hasForceBold) { - buf = GString::format("/ForceBold {0:s} def\n", - privateDicts[i].forceBold ? "true" : "false"); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (privateDicts[i].forceBoldThreshold != 0) { - buf = GString::format("/ForceBoldThreshold {0:.4g} def\n", - privateDicts[i].forceBoldThreshold); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (privateDicts[i].languageGroup != 0) { - buf = GString::format("/LanguageGroup {0:d} def\n", - privateDicts[i].languageGroup); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (privateDicts[i].expansionFactor != 0.06) { - buf = GString::format("/ExpansionFactor {0:.4g} def\n", - privateDicts[i].expansionFactor); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "currentdict end def\n", 20); - (*outputFunc)(outputStream, "currentdict end put\n", 20); - } - (*outputFunc)(outputStream, "def\n", 4); - - // start the binary section - offset = (nCIDs + 1) * (1 + gdBytes); - buf = GString::format("(Hex) {0:d} StartData\n", - offset + charStrings->getLength()); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - - // write the charstring offset (CIDMap) table - for (i = 0; i <= nCIDs; i += 6) { - for (j = 0; j < 6 && i+j <= nCIDs; ++j) { - if (i+j < nCIDs && cidMap[i+j] >= 0) { - buf2[0] = (char)fdSelect[cidMap[i+j]]; - } else { - buf2[0] = (char)0; - } - n = offset + charStringOffsets[i+j]; - for (k = gdBytes; k >= 1; --k) { - buf2[k] = (char)(n & 0xff); - n >>= 8; - } - for (k = 0; k <= gdBytes; ++k) { - buf = GString::format("{0:02x}", buf2[k] & 0xff); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - } - (*outputFunc)(outputStream, "\n", 1); - } - - // write the charstring data - n = charStrings->getLength(); - for (i = 0; i < n; i += 32) { - for (j = 0; j < 32 && i+j < n; ++j) { - buf = GString::format("{0:02x}", charStrings->getChar(i+j) & 0xff); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (i + 32 >= n) { - (*outputFunc)(outputStream, ">", 1); - } - (*outputFunc)(outputStream, "\n", 1); - } - - gfree(charStringOffsets); - delete charStrings; - gfree(cidMap); -} - -void FoFiType1C::convertToType0(char *psName, - FoFiOutputFunc outputFunc, - void *outputStream) { - int *cidMap; - Type1CIndex subrIdx; - Type1CIndexVal val; - int nCIDs; - GString *buf; - Type1CEexecBuf eb; - GBool ok; - int fd, i, j, k; - - // compute the CID count and build the CID-to-GID mapping - nCIDs = 0; - for (i = 0; i < nGlyphs; ++i) { - if (charset[i] >= nCIDs) { - nCIDs = charset[i] + 1; - } - } - cidMap = (int *)gmallocn(nCIDs, sizeof(int)); - for (i = 0; i < nCIDs; ++i) { - cidMap[i] = -1; - } - for (i = 0; i < nGlyphs; ++i) { - cidMap[charset[i]] = i; - } - - // write the descendant Type 1 fonts - for (i = 0; i < nCIDs; i += 256) { - - //~ this assumes that all CIDs in this block have the same FD -- - //~ to handle multiple FDs correctly, need to somehow divide the - //~ font up by FD; as a kludge we ignore CID 0, which is .notdef - fd = 0; - for (j = i==0 ? 1 : 0; j < 256 && i+j < nCIDs; ++j) { - if (cidMap[i+j] >= 0) { - fd = fdSelect[cidMap[i+j]]; - break; - } - } - - // font dictionary (unencrypted section) - (*outputFunc)(outputStream, "16 dict begin\n", 14); - (*outputFunc)(outputStream, "/FontName /", 11); - (*outputFunc)(outputStream, psName, strlen(psName)); - buf = GString::format("_{0:02x} def\n", i >> 8); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - (*outputFunc)(outputStream, "/FontType 1 def\n", 16); - if (privateDicts[fd].hasFontMatrix) { - buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", - privateDicts[fd].fontMatrix[0], - privateDicts[fd].fontMatrix[1], - privateDicts[fd].fontMatrix[2], - privateDicts[fd].fontMatrix[3], - privateDicts[fd].fontMatrix[4], - privateDicts[fd].fontMatrix[5]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } else if (topDict.hasFontMatrix) { - (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); - } else { - (*outputFunc)(outputStream, - "/FontMatrix [0.001 0 0 0.001 0 0] def\n", 38); - } - buf = GString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", - topDict.fontBBox[0], topDict.fontBBox[1], - topDict.fontBBox[2], topDict.fontBBox[3]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - buf = GString::format("/PaintType {0:d} def\n", topDict.paintType); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - if (topDict.paintType != 0) { - buf = GString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); - for (j = 0; j < 256 && i+j < nCIDs; ++j) { - buf = GString::format("dup {0:d} /c{1:02x} put\n", j, j); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - if (j < 256) { - buf = GString::format("{0:d} 1 255 {{ 1 index exch /.notdef put }} for\n", - j); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "readonly def\n", 13); - (*outputFunc)(outputStream, "currentdict end\n", 16); - - // start the binary section - (*outputFunc)(outputStream, "currentfile eexec\n", 18); - eb.outputFunc = outputFunc; - eb.outputStream = outputStream; - eb.ascii = gTrue; - eb.r1 = 55665; - eb.line = 0; - - // start the private dictionary - eexecWrite(&eb, "\x83\xca\x73\xd5"); - eexecWrite(&eb, "dup /Private 32 dict dup begin\n"); - eexecWrite(&eb, "/RD {string currentfile exch readstring pop}" - " executeonly def\n"); - eexecWrite(&eb, "/ND {noaccess def} executeonly def\n"); - eexecWrite(&eb, "/NP {noaccess put} executeonly def\n"); - eexecWrite(&eb, "/MinFeature {16 16} def\n"); - eexecWrite(&eb, "/password 5839 def\n"); - if (privateDicts[fd].nBlueValues) { - eexecWrite(&eb, "/BlueValues ["); - for (k = 0; k < privateDicts[fd].nBlueValues; ++k) { - buf = GString::format("{0:s}{1:d}", - k > 0 ? " " : "", - privateDicts[fd].blueValues[k]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[fd].nOtherBlues) { - eexecWrite(&eb, "/OtherBlues ["); - for (k = 0; k < privateDicts[fd].nOtherBlues; ++k) { - buf = GString::format("{0:s}{1:d}", - k > 0 ? " " : "", - privateDicts[fd].otherBlues[k]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[fd].nFamilyBlues) { - eexecWrite(&eb, "/FamilyBlues ["); - for (k = 0; k < privateDicts[fd].nFamilyBlues; ++k) { - buf = GString::format("{0:s}{1:d}", k > 0 ? " " : "", - privateDicts[fd].familyBlues[k]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[fd].nFamilyOtherBlues) { - eexecWrite(&eb, "/FamilyOtherBlues ["); - for (k = 0; k < privateDicts[fd].nFamilyOtherBlues; ++k) { - buf = GString::format("{0:s}{1:d}", k > 0 ? " " : "", - privateDicts[fd].familyOtherBlues[k]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[fd].blueScale != 0.039625) { - buf = GString::format("/BlueScale {0:.4g} def\n", - privateDicts[fd].blueScale); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[fd].blueShift != 7) { - buf = GString::format("/BlueShift {0:d} def\n", - privateDicts[fd].blueShift); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[fd].blueFuzz != 1) { - buf = GString::format("/BlueFuzz {0:d} def\n", - privateDicts[fd].blueFuzz); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[fd].hasStdHW) { - buf = GString::format("/StdHW [{0:.4g}] def\n", privateDicts[fd].stdHW); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[fd].hasStdVW) { - buf = GString::format("/StdVW [{0:.4g}] def\n", privateDicts[fd].stdVW); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[fd].nStemSnapH) { - eexecWrite(&eb, "/StemSnapH ["); - for (k = 0; k < privateDicts[fd].nStemSnapH; ++k) { - buf = GString::format("{0:s}{1:.4g}", - k > 0 ? " " : "", privateDicts[fd].stemSnapH[k]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[fd].nStemSnapV) { - eexecWrite(&eb, "/StemSnapV ["); - for (k = 0; k < privateDicts[fd].nStemSnapV; ++k) { - buf = GString::format("{0:s}{1:.4g}", - k > 0 ? " " : "", privateDicts[fd].stemSnapV[k]); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - eexecWrite(&eb, "] def\n"); - } - if (privateDicts[fd].hasForceBold) { - buf = GString::format("/ForceBold {0:s} def\n", - privateDicts[fd].forceBold ? "true" : "false"); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[fd].forceBoldThreshold != 0) { - buf = GString::format("/ForceBoldThreshold {0:.4g} def\n", - privateDicts[fd].forceBoldThreshold); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[fd].languageGroup != 0) { - buf = GString::format("/LanguageGroup {0:d} def\n", - privateDicts[fd].languageGroup); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - if (privateDicts[fd].expansionFactor != 0.06) { - buf = GString::format("/ExpansionFactor {0:.4g} def\n", - privateDicts[fd].expansionFactor); - eexecWrite(&eb, buf->getCString()); - delete buf; - } - - // set up the subroutines - ok = gTrue; - getIndex(privateDicts[fd].subrsOffset, &subrIdx, &ok); - if (!ok) { - subrIdx.pos = -1; - } - - // start the CharStrings - eexecWrite(&eb, "2 index /CharStrings 256 dict dup begin\n"); - - // write the .notdef CharString - ok = gTrue; - getIndexVal(&charStringsIdx, 0, &val, &ok); - if (ok) { - eexecCvtGlyph(&eb, ".notdef", val.pos, val.len, - &subrIdx, &privateDicts[fd]); - } - - // write the CharStrings - for (j = 0; j < 256 && i+j < nCIDs; ++j) { - if (cidMap[i+j] >= 0) { - ok = gTrue; - getIndexVal(&charStringsIdx, cidMap[i+j], &val, &ok); - if (ok) { - buf = GString::format("c{0:02x}", j); - eexecCvtGlyph(&eb, buf->getCString(), val.pos, val.len, - &subrIdx, &privateDicts[fd]); - delete buf; - } - } - } - eexecWrite(&eb, "end\n"); - eexecWrite(&eb, "end\n"); - eexecWrite(&eb, "readonly put\n"); - eexecWrite(&eb, "noaccess put\n"); - eexecWrite(&eb, "dup /FontName get exch definefont pop\n"); - eexecWrite(&eb, "mark currentfile closefile\n"); - - // trailer - if (eb.line > 0) { - (*outputFunc)(outputStream, "\n", 1); - } - for (j = 0; j < 8; ++j) { - (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65); - } - (*outputFunc)(outputStream, "cleartomark\n", 12); - } - - // write the Type 0 parent font - (*outputFunc)(outputStream, "16 dict begin\n", 14); - (*outputFunc)(outputStream, "/FontName /", 11); - (*outputFunc)(outputStream, psName, strlen(psName)); - (*outputFunc)(outputStream, " def\n", 5); - (*outputFunc)(outputStream, "/FontType 0 def\n", 16); - if (topDict.hasFontMatrix) { - buf = GString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", - topDict.fontMatrix[0], topDict.fontMatrix[1], - topDict.fontMatrix[2], topDict.fontMatrix[3], - topDict.fontMatrix[4], topDict.fontMatrix[5]); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } else { - (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); - } - (*outputFunc)(outputStream, "/FMapType 2 def\n", 16); - (*outputFunc)(outputStream, "/Encoding [\n", 12); - for (i = 0; i < nCIDs; i += 256) { - buf = GString::format("{0:d}\n", i >> 8); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - (*outputFunc)(outputStream, "/FDepVector [\n", 14); - for (i = 0; i < nCIDs; i += 256) { - (*outputFunc)(outputStream, "/", 1); - (*outputFunc)(outputStream, psName, strlen(psName)); - buf = GString::format("_{0:02x} findfont\n", i >> 8); - (*outputFunc)(outputStream, buf->getCString(), buf->getLength()); - delete buf; - } - (*outputFunc)(outputStream, "] def\n", 6); - (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); - - gfree(cidMap); -} - -void FoFiType1C::eexecCvtGlyph(Type1CEexecBuf *eb, char *glyphName, - int offset, int nBytes, - Type1CIndex *subrIdx, - Type1CPrivateDict *pDict) { - GString *buf; - GString *charBuf; - - // generate the charstring - charBuf = new GString(); - cvtGlyph(offset, nBytes, charBuf, subrIdx, pDict, gTrue); - - buf = GString::format("/{0:s} {1:d} RD ", glyphName, charBuf->getLength()); - eexecWrite(eb, buf->getCString()); - delete buf; - eexecWriteCharstring(eb, (Guchar *)charBuf->getCString(), - charBuf->getLength()); - eexecWrite(eb, " ND\n"); - - delete charBuf; -} - -void FoFiType1C::cvtGlyph(int offset, int nBytes, GString *charBuf, - Type1CIndex *subrIdx, Type1CPrivateDict *pDict, - GBool top) { - Type1CIndexVal val; - GBool ok, dFP; - double d, dx, dy; - Gushort r2; - Guchar byte; - int pos, subrBias, start, i, k; - - start = charBuf->getLength(); - if (top) { - charBuf->append((char)73); - charBuf->append((char)58); - charBuf->append((char)147); - charBuf->append((char)134); - nOps = 0; - nHints = 0; - firstOp = gTrue; - openPath = gFalse; - } - - pos = offset; - while (pos < offset + nBytes) { - ok = gTrue; - pos = getOp(pos, gTrue, &ok); - if (!ok) { - break; - } - if (!ops[nOps - 1].isNum) { - --nOps; // drop the operator - switch (ops[nOps].op) { - case 0x0001: // hstem - if (firstOp) { - cvtGlyphWidth(nOps & 1, charBuf, pDict); - firstOp = gFalse; - } - if (nOps & 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 hstem", nOps); - } - d = 0; - dFP = gFalse; - for (k = 0; k < nOps; k += 2) { - // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints - if (ops[k+1].num < 0) { - d += ops[k].num + ops[k+1].num; - dFP |= ops[k].isFP | ops[k+1].isFP; - cvtNum(d, dFP, charBuf); - cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf); - } else { - d += ops[k].num; - dFP |= ops[k].isFP; - cvtNum(d, dFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - d += ops[k+1].num; - dFP |= ops[k+1].isFP; - } - charBuf->append((char)1); - } - nHints += nOps / 2; - nOps = 0; - break; - case 0x0003: // vstem - if (firstOp) { - cvtGlyphWidth(nOps & 1, charBuf, pDict); - firstOp = gFalse; - } - if (nOps & 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 vstem", nOps); - } - d = 0; - dFP = gFalse; - for (k = 0; k < nOps; k += 2) { - // convert Type 2 edge hints (-20 or -21) to Type 1 ghost hints - if (ops[k+1].num < 0) { - d += ops[k].num + ops[k+1].num; - dFP |= ops[k].isFP | ops[k+1].isFP; - cvtNum(d, dFP, charBuf); - cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf); - } else { - d += ops[k].num; - dFP |= ops[k].isFP; - cvtNum(d, dFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - d += ops[k+1].num; - dFP |= ops[k+1].isFP; - } - charBuf->append((char)3); - } - nHints += nOps / 2; - nOps = 0; - break; - case 0x0004: // vmoveto - if (firstOp) { - cvtGlyphWidth(nOps == 2, charBuf, pDict); - firstOp = gFalse; - } - if (openPath) { - charBuf->append((char)9); - openPath = gFalse; - } - if (nOps != 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 vmoveto", nOps); - } - cvtNum(ops[0].num, ops[0].isFP, charBuf); - charBuf->append((char)4); - nOps = 0; - break; - case 0x0005: // rlineto - if (nOps < 2 || nOps % 2 != 0) { - //~ error(-1, "Wrong number of args (%d) to Type 2 rlineto", nOps); - } - for (k = 0; k < nOps; k += 2) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - charBuf->append((char)5); - } - nOps = 0; - openPath = gTrue; - break; - case 0x0006: // hlineto - if (nOps < 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 hlineto", nOps); - } - for (k = 0; k < nOps; ++k) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - charBuf->append((char)((k & 1) ? 7 : 6)); - } - nOps = 0; - openPath = gTrue; - break; - case 0x0007: // vlineto - if (nOps < 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 vlineto", nOps); - } - for (k = 0; k < nOps; ++k) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - charBuf->append((char)((k & 1) ? 6 : 7)); - } - nOps = 0; - openPath = gTrue; - break; - case 0x0008: // rrcurveto - if (nOps < 6 || nOps % 6 != 0) { - //~ error(-1, "Wrong number of args (%d) to Type 2 rrcurveto", nOps); - } - for (k = 0; k < nOps; k += 6) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); - cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf); - charBuf->append((char)8); - } - nOps = 0; - openPath = gTrue; - break; - case 0x000a: // callsubr - if (nOps >= 1) { - subrBias = (subrIdx->len < 1240) - ? 107 : (subrIdx->len < 33900) ? 1131 : 32768; - k = subrBias + (int)ops[nOps - 1].num; - --nOps; - ok = gTrue; - getIndexVal(subrIdx, k, &val, &ok); - if (ok) { - cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse); - } - } else { - //~ error(-1, "Too few args to Type 2 callsubr"); - } - // don't clear the stack - break; - case 0x000b: // return - // don't clear the stack - break; - case 0x000e: // endchar / seac - if (firstOp) { - cvtGlyphWidth(nOps == 1 || nOps == 5, charBuf, pDict); - firstOp = gFalse; - } - if (openPath) { - charBuf->append((char)9); - openPath = gFalse; - } - if (nOps == 4) { - cvtNum(0, gFalse, charBuf); - cvtNum(ops[0].num, ops[0].isFP, charBuf); - cvtNum(ops[1].num, ops[1].isFP, charBuf); - cvtNum(ops[2].num, ops[2].isFP, charBuf); - cvtNum(ops[3].num, ops[3].isFP, charBuf); - charBuf->append((char)12)->append((char)6); - } else if (nOps == 0) { - charBuf->append((char)14); - } else { - //~ error(-1, "Wrong number of args (%d) to Type 2 endchar", nOps); - } - nOps = 0; - break; - case 0x000f: // (obsolete) - // this op is ignored, but we need the glyph width - if (firstOp) { - cvtGlyphWidth(nOps > 0, charBuf, pDict); - firstOp = gFalse; - } - nOps = 0; - break; - case 0x0010: // blend - //~ error(-1, "Unimplemented Type 2 charstring op: %d", file[i]); - nOps = 0; - break; - case 0x0012: // hstemhm - // ignored - if (firstOp) { - cvtGlyphWidth(nOps & 1, charBuf, pDict); - firstOp = gFalse; - } - if (nOps & 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 hstemhm", nOps); - } - nHints += nOps / 2; - nOps = 0; - break; - case 0x0013: // hintmask - // ignored - if (firstOp) { - cvtGlyphWidth(nOps & 1, charBuf, pDict); - firstOp = gFalse; - } - if (nOps > 0) { - if (nOps & 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 hintmask/vstemhm", - //~ nOps); - } - nHints += nOps / 2; - } - pos += (nHints + 7) >> 3; - nOps = 0; - break; - case 0x0014: // cntrmask - // ignored - if (firstOp) { - cvtGlyphWidth(nOps & 1, charBuf, pDict); - firstOp = gFalse; - } - if (nOps > 0) { - if (nOps & 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 cntrmask/vstemhm", - //~ nOps); - } - nHints += nOps / 2; - } - pos += (nHints + 7) >> 3; - nOps = 0; - break; - case 0x0015: // rmoveto - if (firstOp) { - cvtGlyphWidth(nOps == 3, charBuf, pDict); - firstOp = gFalse; - } - if (openPath) { - charBuf->append((char)9); - openPath = gFalse; - } - if (nOps != 2) { - //~ error(-1, "Wrong number of args (%d) to Type 2 rmoveto", nOps); - } - cvtNum(ops[0].num, ops[0].isFP, charBuf); - cvtNum(ops[1].num, ops[1].isFP, charBuf); - charBuf->append((char)21); - nOps = 0; - break; - case 0x0016: // hmoveto - if (firstOp) { - cvtGlyphWidth(nOps == 2, charBuf, pDict); - firstOp = gFalse; - } - if (openPath) { - charBuf->append((char)9); - openPath = gFalse; - } - if (nOps != 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 hmoveto", nOps); - } - cvtNum(ops[0].num, ops[0].isFP, charBuf); - charBuf->append((char)22); - nOps = 0; - break; - case 0x0017: // vstemhm - // ignored - if (firstOp) { - cvtGlyphWidth(nOps & 1, charBuf, pDict); - firstOp = gFalse; - } - if (nOps & 1) { - //~ error(-1, "Wrong number of args (%d) to Type 2 vstemhm", nOps); - } - nHints += nOps / 2; - nOps = 0; - break; - case 0x0018: // rcurveline - if (nOps < 8 || (nOps - 2) % 6 != 0) { - //~ error(-1, "Wrong number of args (%d) to Type 2 rcurveline", nOps); - } - for (k = 0; k < nOps - 2; k += 6) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); - cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf); - charBuf->append((char)8); - } - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k].isFP, charBuf); - charBuf->append((char)5); - nOps = 0; - openPath = gTrue; - break; - case 0x0019: // rlinecurve - if (nOps < 8 || (nOps - 6) % 2 != 0) { - //~ error(-1, "Wrong number of args (%d) to Type 2 rlinecurve", nOps); - } - for (k = 0; k < nOps - 6; k += 2) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k].isFP, charBuf); - charBuf->append((char)5); - } - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); - cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf); - charBuf->append((char)8); - nOps = 0; - openPath = gTrue; - break; - case 0x001a: // vvcurveto - if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { - //~ error(-1, "Wrong number of args (%d) to Type 2 vvcurveto", nOps); - } - if (nOps % 2 == 1) { - cvtNum(ops[0].num, ops[0].isFP, charBuf); - cvtNum(ops[1].num, ops[1].isFP, charBuf); - cvtNum(ops[2].num, ops[2].isFP, charBuf); - cvtNum(ops[3].num, ops[3].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - cvtNum(ops[4].num, ops[4].isFP, charBuf); - charBuf->append((char)8); - k = 5; - } else { - k = 0; - } - for (; k < nOps; k += 4) { - cvtNum(0, gFalse, charBuf); - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - charBuf->append((char)8); - } - nOps = 0; - openPath = gTrue; - break; - case 0x001b: // hhcurveto - if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { - //~ error(-1, "Wrong number of args (%d) to Type 2 hhcurveto", nOps); - } - if (nOps % 2 == 1) { - cvtNum(ops[1].num, ops[1].isFP, charBuf); - cvtNum(ops[0].num, ops[0].isFP, charBuf); - cvtNum(ops[2].num, ops[2].isFP, charBuf); - cvtNum(ops[3].num, ops[3].isFP, charBuf); - cvtNum(ops[4].num, ops[4].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - charBuf->append((char)8); - k = 5; - } else { - k = 0; - } - for (; k < nOps; k += 4) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - charBuf->append((char)8); - } - nOps = 0; - openPath = gTrue; - break; - case 0x001d: // callgsubr - if (nOps >= 1) { - k = gsubrBias + (int)ops[nOps - 1].num; - --nOps; - ok = gTrue; - getIndexVal(&gsubrIdx, k, &val, &ok); - if (ok) { - cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse); - } - } else { - //~ error(-1, "Too few args to Type 2 callgsubr"); - } - // don't clear the stack - break; - case 0x001e: // vhcurveto - if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { - //~ error(-1, "Wrong number of args (%d) to Type 2 vhcurveto", nOps); - } - for (k = 0; k < nOps && k != nOps-5; k += 4) { - if (k % 8 == 0) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - charBuf->append((char)30); - } else { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - charBuf->append((char)31); - } - } - if (k == nOps-5) { - if (k % 8 == 0) { - cvtNum(0, gFalse, charBuf); - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); - } else { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - } - charBuf->append((char)8); - } - nOps = 0; - openPath = gTrue; - break; - case 0x001f: // hvcurveto - if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) { - //~ error(-1, "Wrong number of args (%d) to Type 2 hvcurveto", nOps); - } - for (k = 0; k < nOps && k != nOps-5; k += 4) { - if (k % 8 == 0) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - charBuf->append((char)31); - } else { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - charBuf->append((char)30); - } - } - if (k == nOps-5) { - if (k % 8 == 0) { - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - } else { - cvtNum(0, gFalse, charBuf); - cvtNum(ops[k].num, ops[k].isFP, charBuf); - cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf); - cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf); - cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf); - cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf); - } - charBuf->append((char)8); - } - nOps = 0; - openPath = gTrue; - break; - case 0x0c00: // dotsection (should be Type 1 only?) - // ignored - nOps = 0; - break; - case 0x0c03: // and - case 0x0c04: // or - case 0x0c05: // not - case 0x0c08: // store - case 0x0c09: // abs - case 0x0c0a: // add - case 0x0c0b: // sub - case 0x0c0c: // div - case 0x0c0d: // load - case 0x0c0e: // neg - case 0x0c0f: // eq - case 0x0c12: // drop - case 0x0c14: // put - case 0x0c15: // get - case 0x0c16: // ifelse - case 0x0c17: // random - case 0x0c18: // mul - case 0x0c1a: // sqrt - case 0x0c1b: // dup - case 0x0c1c: // exch - case 0x0c1d: // index - case 0x0c1e: // roll - //~ error(-1, "Unimplemented Type 2 charstring op: 12.%d", file[i+1]); - nOps = 0; - break; - case 0x0c22: // hflex - if (nOps != 7) { - //~ error(-1, "Wrong number of args (%d) to Type 2 hflex", nOps); - } - cvtNum(ops[0].num, ops[0].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - cvtNum(ops[1].num, ops[1].isFP, charBuf); - cvtNum(ops[2].num, ops[2].isFP, charBuf); - cvtNum(ops[3].num, ops[3].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - charBuf->append((char)8); - cvtNum(ops[4].num, ops[4].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - cvtNum(ops[5].num, ops[5].isFP, charBuf); - cvtNum(-ops[2].num, ops[2].isFP, charBuf); - cvtNum(ops[6].num, ops[6].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - charBuf->append((char)8); - nOps = 0; - openPath = gTrue; - break; - case 0x0c23: // flex - if (nOps != 13) { - //~ error(-1, "Wrong number of args (%d) to Type 2 flex", nOps); - } - cvtNum(ops[0].num, ops[0].isFP, charBuf); - cvtNum(ops[1].num, ops[1].isFP, charBuf); - cvtNum(ops[2].num, ops[2].isFP, charBuf); - cvtNum(ops[3].num, ops[3].isFP, charBuf); - cvtNum(ops[4].num, ops[4].isFP, charBuf); - cvtNum(ops[5].num, ops[5].isFP, charBuf); - charBuf->append((char)8); - cvtNum(ops[6].num, ops[6].isFP, charBuf); - cvtNum(ops[7].num, ops[7].isFP, charBuf); - cvtNum(ops[8].num, ops[8].isFP, charBuf); - cvtNum(ops[9].num, ops[9].isFP, charBuf); - cvtNum(ops[10].num, ops[10].isFP, charBuf); - cvtNum(ops[11].num, ops[11].isFP, charBuf); - charBuf->append((char)8); - nOps = 0; - openPath = gTrue; - break; - case 0x0c24: // hflex1 - if (nOps != 9) { - //~ error(-1, "Wrong number of args (%d) to Type 2 hflex1", nOps); - } - cvtNum(ops[0].num, ops[0].isFP, charBuf); - cvtNum(ops[1].num, ops[1].isFP, charBuf); - cvtNum(ops[2].num, ops[2].isFP, charBuf); - cvtNum(ops[3].num, ops[3].isFP, charBuf); - cvtNum(ops[4].num, ops[4].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - charBuf->append((char)8); - cvtNum(ops[5].num, ops[5].isFP, charBuf); - cvtNum(0, gFalse, charBuf); - cvtNum(ops[6].num, ops[6].isFP, charBuf); - cvtNum(ops[7].num, ops[7].isFP, charBuf); - cvtNum(ops[8].num, ops[8].isFP, charBuf); - cvtNum(-(ops[1].num + ops[3].num + ops[7].num), - ops[1].isFP | ops[3].isFP | ops[7].isFP, charBuf); - charBuf->append((char)8); - nOps = 0; - openPath = gTrue; - break; - case 0x0c25: // flex1 - if (nOps != 11) { - //~ error(-1, "Wrong number of args (%d) to Type 2 flex1", nOps); - } - cvtNum(ops[0].num, ops[0].isFP, charBuf); - cvtNum(ops[1].num, ops[1].isFP, charBuf); - cvtNum(ops[2].num, ops[2].isFP, charBuf); - cvtNum(ops[3].num, ops[3].isFP, charBuf); - cvtNum(ops[4].num, ops[4].isFP, charBuf); - cvtNum(ops[5].num, ops[5].isFP, charBuf); - charBuf->append((char)8); - cvtNum(ops[6].num, ops[6].isFP, charBuf); - cvtNum(ops[7].num, ops[7].isFP, charBuf); - cvtNum(ops[8].num, ops[8].isFP, charBuf); - cvtNum(ops[9].num, ops[9].isFP, charBuf); - dx = ops[0].num + ops[2].num + ops[4].num + ops[6].num + ops[8].num; - dy = ops[1].num + ops[3].num + ops[5].num + ops[7].num + ops[9].num; - if (fabs(dx) > fabs(dy)) { - cvtNum(ops[10].num, ops[10].isFP, charBuf); - cvtNum(-dy, ops[1].isFP | ops[3].isFP | ops[5].isFP | - ops[7].isFP | ops[9].isFP, charBuf); - } else { - cvtNum(-dx, ops[0].isFP | ops[2].isFP | ops[4].isFP | - ops[6].isFP | ops[8].isFP, charBuf); - cvtNum(ops[10].num, ops[10].isFP, charBuf); - } - charBuf->append((char)8); - nOps = 0; - openPath = gTrue; - break; - default: - //~ error(-1, "Illegal Type 2 charstring op: %04x", - //~ ops[nOps].op); - nOps = 0; - break; - } - } - } - - // charstring encryption - if (top) { - r2 = 4330; - for (i = start; i < charBuf->getLength(); ++i) { - byte = charBuf->getChar(i) ^ (r2 >> 8); - charBuf->setChar(i, byte); - r2 = (byte + r2) * 52845 + 22719; - } - } -} - -void FoFiType1C::cvtGlyphWidth(GBool useOp, GString *charBuf, - Type1CPrivateDict *pDict) { - double w; - GBool wFP; - int i; - - if (useOp) { - w = pDict->nominalWidthX + ops[0].num; - wFP = pDict->nominalWidthXFP | ops[0].isFP; - for (i = 1; i < nOps; ++i) { - ops[i-1] = ops[i]; - } - --nOps; - } else { - w = pDict->defaultWidthX; - wFP = pDict->defaultWidthXFP; - } - cvtNum(0, gFalse, charBuf); - cvtNum(w, wFP, charBuf); - charBuf->append((char)13); -} - -void FoFiType1C::cvtNum(double x, GBool isFP, GString *charBuf) { - Guchar buf[12]; - int y, n; - - n = 0; - if (isFP) { - if (x >= -32768 && x < 32768) { - y = (int)(x * 256.0); - buf[0] = 255; - buf[1] = (Guchar)(y >> 24); - buf[2] = (Guchar)(y >> 16); - buf[3] = (Guchar)(y >> 8); - buf[4] = (Guchar)y; - buf[5] = 255; - buf[6] = 0; - buf[7] = 0; - buf[8] = 1; - buf[9] = 0; - buf[10] = 12; - buf[11] = 12; - n = 12; - } else { - //~ error(-1, "Type 2 fixed point constant out of range"); - } - } else { - y = (int)x; - if (y >= -107 && y <= 107) { - buf[0] = (Guchar)(y + 139); - n = 1; - } else if (y > 107 && y <= 1131) { - y -= 108; - buf[0] = (Guchar)((y >> 8) + 247); - buf[1] = (Guchar)(y & 0xff); - n = 2; - } else if (y < -107 && y >= -1131) { - y = -y - 108; - buf[0] = (Guchar)((y >> 8) + 251); - buf[1] = (Guchar)(y & 0xff); - n = 2; - } else { - buf[0] = 255; - buf[1] = (Guchar)(y >> 24); - buf[2] = (Guchar)(y >> 16); - buf[3] = (Guchar)(y >> 8); - buf[4] = (Guchar)y; - n = 5; - } - } - charBuf->append((char *)buf, n); -} - -void FoFiType1C::eexecWrite(Type1CEexecBuf *eb, char *s) { - Guchar *p; - Guchar x; - - for (p = (Guchar *)s; *p; ++p) { - x = *p ^ (eb->r1 >> 8); - eb->r1 = (x + eb->r1) * 52845 + 22719; - if (eb->ascii) { - (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1); - (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1); - eb->line += 2; - if (eb->line == 64) { - (*eb->outputFunc)(eb->outputStream, "\n", 1); - eb->line = 0; - } - } else { - (*eb->outputFunc)(eb->outputStream, (char *)&x, 1); - } - } -} - -void FoFiType1C::eexecWriteCharstring(Type1CEexecBuf *eb, - Guchar *s, int n) { - Guchar x; - int i; - - // eexec encryption - for (i = 0; i < n; ++i) { - x = s[i] ^ (eb->r1 >> 8); - eb->r1 = (x + eb->r1) * 52845 + 22719; - if (eb->ascii) { - (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1); - (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1); - eb->line += 2; - if (eb->line == 64) { - (*eb->outputFunc)(eb->outputStream, "\n", 1); - eb->line = 0; - } - } else { - (*eb->outputFunc)(eb->outputStream, (char *)&x, 1); - } - } -} - -GBool FoFiType1C::parse() { - Type1CIndex fdIdx; - Type1CIndexVal val; - int i; - - parsedOk = gTrue; - - // some tools embed Type 1C fonts with an extra whitespace char at - // the beginning - if (len > 0 && file[0] != '\x01') { - ++file; - --len; - } - - // find the indexes - getIndex(getU8(2, &parsedOk), &nameIdx, &parsedOk); - getIndex(nameIdx.endPos, &topDictIdx, &parsedOk); - getIndex(topDictIdx.endPos, &stringIdx, &parsedOk); - getIndex(stringIdx.endPos, &gsubrIdx, &parsedOk); - if (!parsedOk) { - return gFalse; - } - gsubrBias = (gsubrIdx.len < 1240) ? 107 - : (gsubrIdx.len < 33900) ? 1131 : 32768; - - // read the first font name - getIndexVal(&nameIdx, 0, &val, &parsedOk); - if (!parsedOk) { - return gFalse; - } - name = new GString((char *)&file[val.pos], val.len); - - // read the top dict for the first font - readTopDict(); - - // for CID fonts: read the FDArray dicts and private dicts - if (topDict.firstOp == 0x0c1e) { - if (topDict.fdArrayOffset == 0) { - nFDs = 1; - privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict)); - readPrivateDict(0, 0, &privateDicts[0]); - } else { - getIndex(topDict.fdArrayOffset, &fdIdx, &parsedOk); - if (!parsedOk) { - return gFalse; - } - nFDs = fdIdx.len; - privateDicts = (Type1CPrivateDict *) - gmallocn(nFDs, sizeof(Type1CPrivateDict)); - for (i = 0; i < nFDs; ++i) { - getIndexVal(&fdIdx, i, &val, &parsedOk); - if (!parsedOk) { - return gFalse; - } - readFD(val.pos, val.len, &privateDicts[i]); - } - } - - // for 8-bit fonts: read the private dict - } else { - privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict)); - readPrivateDict(topDict.privateOffset, topDict.privateSize, - &privateDicts[0]); - } - - // check for parse errors in the private dict(s) - if (!parsedOk) { - return gFalse; - } - - // get the charstrings index - if (topDict.charStringsOffset <= 0) { - parsedOk = gFalse; - return gFalse; - } - getIndex(topDict.charStringsOffset, &charStringsIdx, &parsedOk); - if (!parsedOk) { - return gFalse; - } - nGlyphs = charStringsIdx.len; - - // for CID fonts: read the FDSelect table - if (topDict.firstOp == 0x0c1e) { - readFDSelect(); - if (!parsedOk) { - return gFalse; - } - } - - // read the charset - if (!readCharset()) { - parsedOk = gFalse; - return gFalse; - } - - // for 8-bit fonts: build the encoding - if (topDict.firstOp != 0x0c14 && topDict.firstOp != 0x0c1e) { - buildEncoding(); - if (!parsedOk) { - return gFalse; - } - } - - return parsedOk; -} - -void FoFiType1C::readTopDict() { - Type1CIndexVal topDictPtr; - int pos; - - topDict.firstOp = -1; - topDict.versionSID = 0; - topDict.noticeSID = 0; - topDict.copyrightSID = 0; - topDict.fullNameSID = 0; - topDict.familyNameSID = 0; - topDict.weightSID = 0; - topDict.isFixedPitch = 0; - topDict.italicAngle = 0; - topDict.underlinePosition = -100; - topDict.underlineThickness = 50; - topDict.paintType = 0; - topDict.charstringType = 2; - topDict.fontMatrix[0] = 0.001; - topDict.fontMatrix[1] = 0; - topDict.fontMatrix[2] = 0; - topDict.fontMatrix[3] = 0.001; - topDict.fontMatrix[4] = 0; - topDict.fontMatrix[5] = 0; - topDict.hasFontMatrix = gFalse; - topDict.uniqueID = 0; - topDict.fontBBox[0] = 0; - topDict.fontBBox[1] = 0; - topDict.fontBBox[2] = 0; - topDict.fontBBox[3] = 0; - topDict.strokeWidth = 0; - topDict.charsetOffset = 0; - topDict.encodingOffset = 0; - topDict.charStringsOffset = 0; - topDict.privateSize = 0; - topDict.privateOffset = 0; - topDict.registrySID = 0; - topDict.orderingSID = 0; - topDict.supplement = 0; - topDict.fdArrayOffset = 0; - topDict.fdSelectOffset = 0; - - getIndexVal(&topDictIdx, 0, &topDictPtr, &parsedOk); - pos = topDictPtr.pos; - nOps = 0; - while (pos < topDictPtr.pos + topDictPtr.len) { - pos = getOp(pos, gFalse, &parsedOk); - if (!parsedOk) { - break; - } - if (!ops[nOps - 1].isNum) { - --nOps; // drop the operator - if (topDict.firstOp < 0) { - topDict.firstOp = ops[nOps].op; - } - switch (ops[nOps].op) { - case 0x0000: topDict.versionSID = (int)ops[0].num; break; - case 0x0001: topDict.noticeSID = (int)ops[0].num; break; - case 0x0c00: topDict.copyrightSID = (int)ops[0].num; break; - case 0x0002: topDict.fullNameSID = (int)ops[0].num; break; - case 0x0003: topDict.familyNameSID = (int)ops[0].num; break; - case 0x0004: topDict.weightSID = (int)ops[0].num; break; - case 0x0c01: topDict.isFixedPitch = (int)ops[0].num; break; - case 0x0c02: topDict.italicAngle = ops[0].num; break; - case 0x0c03: topDict.underlinePosition = ops[0].num; break; - case 0x0c04: topDict.underlineThickness = ops[0].num; break; - case 0x0c05: topDict.paintType = (int)ops[0].num; break; - case 0x0c06: topDict.charstringType = (int)ops[0].num; break; - case 0x0c07: topDict.fontMatrix[0] = ops[0].num; - topDict.fontMatrix[1] = ops[1].num; - topDict.fontMatrix[2] = ops[2].num; - topDict.fontMatrix[3] = ops[3].num; - topDict.fontMatrix[4] = ops[4].num; - topDict.fontMatrix[5] = ops[5].num; - topDict.hasFontMatrix = gTrue; break; - case 0x000d: topDict.uniqueID = (int)ops[0].num; break; - case 0x0005: topDict.fontBBox[0] = ops[0].num; - topDict.fontBBox[1] = ops[1].num; - topDict.fontBBox[2] = ops[2].num; - topDict.fontBBox[3] = ops[3].num; break; - case 0x0c08: topDict.strokeWidth = ops[0].num; break; - case 0x000f: topDict.charsetOffset = (int)ops[0].num; break; - case 0x0010: topDict.encodingOffset = (int)ops[0].num; break; - case 0x0011: topDict.charStringsOffset = (int)ops[0].num; break; - case 0x0012: topDict.privateSize = (int)ops[0].num; - topDict.privateOffset = (int)ops[1].num; break; - case 0x0c1e: topDict.registrySID = (int)ops[0].num; - topDict.orderingSID = (int)ops[1].num; - topDict.supplement = (int)ops[2].num; break; - case 0x0c24: topDict.fdArrayOffset = (int)ops[0].num; break; - case 0x0c25: topDict.fdSelectOffset = (int)ops[0].num; break; - } - nOps = 0; - } - } -} - -// Read a CID font dict (FD) - this pulls out the private dict -// pointer, and reads the private dict. It also pulls the FontMatrix -// (if any) out of the FD. -void FoFiType1C::readFD(int offset, int length, Type1CPrivateDict *pDict) { - int pos, pSize, pOffset; - double fontMatrix[6]; - GBool hasFontMatrix; - - hasFontMatrix = gFalse; - pSize = pOffset = 0; - pos = offset; - nOps = 0; - while (pos < offset + length) { - pos = getOp(pos, gFalse, &parsedOk); - if (!parsedOk) { - return; - } - if (!ops[nOps - 1].isNum) { - if (ops[nOps - 1].op == 0x0012) { - if (nOps < 3) { - parsedOk = gFalse; - return; - } - pSize = (int)ops[0].num; - pOffset = (int)ops[1].num; - break; - } else if (ops[nOps - 1].op == 0x0c07) { - fontMatrix[0] = ops[0].num; - fontMatrix[1] = ops[1].num; - fontMatrix[2] = ops[2].num; - fontMatrix[3] = ops[3].num; - fontMatrix[4] = ops[4].num; - fontMatrix[5] = ops[5].num; - hasFontMatrix = gTrue; - } - nOps = 0; - } - } - readPrivateDict(pOffset, pSize, pDict); - if (hasFontMatrix) { - pDict->fontMatrix[0] = fontMatrix[0]; - pDict->fontMatrix[1] = fontMatrix[1]; - pDict->fontMatrix[2] = fontMatrix[2]; - pDict->fontMatrix[3] = fontMatrix[3]; - pDict->fontMatrix[4] = fontMatrix[4]; - pDict->fontMatrix[5] = fontMatrix[5]; - pDict->hasFontMatrix = gTrue; - } -} - -void FoFiType1C::readPrivateDict(int offset, int length, - Type1CPrivateDict *pDict) { - int pos; - - pDict->hasFontMatrix = gFalse; - pDict->nBlueValues = 0; - pDict->nOtherBlues = 0; - pDict->nFamilyBlues = 0; - pDict->nFamilyOtherBlues = 0; - pDict->blueScale = 0.039625; - pDict->blueShift = 7; - pDict->blueFuzz = 1; - pDict->hasStdHW = gFalse; - pDict->hasStdVW = gFalse; - pDict->nStemSnapH = 0; - pDict->nStemSnapV = 0; - pDict->hasForceBold = gFalse; - pDict->forceBoldThreshold = 0; - pDict->languageGroup = 0; - pDict->expansionFactor = 0.06; - pDict->initialRandomSeed = 0; - pDict->subrsOffset = 0; - pDict->defaultWidthX = 0; - pDict->defaultWidthXFP = gFalse; - pDict->nominalWidthX = 0; - pDict->nominalWidthXFP = gFalse; - - // no dictionary - if (offset == 0 || length == 0) { - return; - } - - pos = offset; - nOps = 0; - while (pos < offset + length) { - pos = getOp(pos, gFalse, &parsedOk); - if (!parsedOk) { - break; - } - if (!ops[nOps - 1].isNum) { - --nOps; // drop the operator - switch (ops[nOps].op) { - case 0x0006: - pDict->nBlueValues = getDeltaIntArray(pDict->blueValues, - type1CMaxBlueValues); - break; - case 0x0007: - pDict->nOtherBlues = getDeltaIntArray(pDict->otherBlues, - type1CMaxOtherBlues); - break; - case 0x0008: - pDict->nFamilyBlues = getDeltaIntArray(pDict->familyBlues, - type1CMaxBlueValues); - break; - case 0x0009: - pDict->nFamilyOtherBlues = getDeltaIntArray(pDict->familyOtherBlues, - type1CMaxOtherBlues); - break; - case 0x0c09: - pDict->blueScale = ops[0].num; - break; - case 0x0c0a: - pDict->blueShift = (int)ops[0].num; - break; - case 0x0c0b: - pDict->blueFuzz = (int)ops[0].num; - break; - case 0x000a: - pDict->stdHW = ops[0].num; - pDict->hasStdHW = gTrue; - break; - case 0x000b: - pDict->stdVW = ops[0].num; - pDict->hasStdVW = gTrue; - break; - case 0x0c0c: - pDict->nStemSnapH = getDeltaFPArray(pDict->stemSnapH, - type1CMaxStemSnap); - break; - case 0x0c0d: - pDict->nStemSnapV = getDeltaFPArray(pDict->stemSnapV, - type1CMaxStemSnap); - break; - case 0x0c0e: - pDict->forceBold = ops[0].num != 0; - pDict->hasForceBold = gTrue; - break; - case 0x0c0f: - pDict->forceBoldThreshold = ops[0].num; - break; - case 0x0c11: - pDict->languageGroup = (int)ops[0].num; - break; - case 0x0c12: - pDict->expansionFactor = ops[0].num; - break; - case 0x0c13: - pDict->initialRandomSeed = (int)ops[0].num; - break; - case 0x0013: - pDict->subrsOffset = offset + (int)ops[0].num; - break; - case 0x0014: - pDict->defaultWidthX = ops[0].num; - pDict->defaultWidthXFP = ops[0].isFP; - break; - case 0x0015: - pDict->nominalWidthX = ops[0].num; - pDict->nominalWidthXFP = ops[0].isFP; - break; - } - nOps = 0; - } - } -} - -void FoFiType1C::readFDSelect() { - int fdSelectFmt, pos, nRanges, gid0, gid1, fd, i, j; - - fdSelect = (Guchar *)gmalloc(nGlyphs); - if (topDict.fdSelectOffset == 0) { - for (i = 0; i < nGlyphs; ++i) { - fdSelect[i] = 0; - } - } else { - pos = topDict.fdSelectOffset; - fdSelectFmt = getU8(pos++, &parsedOk); - if (!parsedOk) { - return; - } - if (fdSelectFmt == 0) { - if (!checkRegion(pos, nGlyphs)) { - parsedOk = gFalse; - return; - } - memcpy(fdSelect, file + pos, nGlyphs); - } else if (fdSelectFmt == 3) { - nRanges = getU16BE(pos, &parsedOk); - pos += 2; - gid0 = getU16BE(pos, &parsedOk); - pos += 2; - for (i = 1; i <= nRanges; ++i) { - fd = getU8(pos++, &parsedOk); - gid1 = getU16BE(pos, &parsedOk); - if (!parsedOk) { - return; - } - pos += 2; - if (gid0 > gid1 || gid1 > nGlyphs) { - //~ error(-1, "Bad FDSelect table in CID font"); - parsedOk = gFalse; - return; - } - for (j = gid0; j < gid1; ++j) { - fdSelect[j] = fd; - } - gid0 = gid1; - } - } else { - //~ error(-1, "Unknown FDSelect table format in CID font"); - for (i = 0; i < nGlyphs; ++i) { - fdSelect[i] = 0; - } - } - } -} - -void FoFiType1C::buildEncoding() { - char buf[256]; - int nCodes, nRanges, encFormat; - int pos, c, sid, nLeft, nSups, i, j; - - if (topDict.encodingOffset == 0) { - encoding = fofiType1StandardEncoding; - - } else if (topDict.encodingOffset == 1) { - encoding = fofiType1ExpertEncoding; - - } else { - encoding = (char **)gmallocn(256, sizeof(char *)); - for (i = 0; i < 256; ++i) { - encoding[i] = NULL; - } - pos = topDict.encodingOffset; - encFormat = getU8(pos++, &parsedOk); - if (!parsedOk) { - return; - } - if ((encFormat & 0x7f) == 0) { - nCodes = 1 + getU8(pos++, &parsedOk); - if (!parsedOk) { - return; - } - if (nCodes > nGlyphs) { - nCodes = nGlyphs; - } - for (i = 1; i < nCodes; ++i) { - c = getU8(pos++, &parsedOk); - if (!parsedOk) { - return; - } - if (encoding[c]) { - gfree(encoding[c]); - } - encoding[c] = copyString(getString(charset[i], buf, &parsedOk)); - } - } else if ((encFormat & 0x7f) == 1) { - nRanges = getU8(pos++, &parsedOk); - if (!parsedOk) { - return; - } - nCodes = 1; - for (i = 0; i < nRanges; ++i) { - c = getU8(pos++, &parsedOk); - nLeft = getU8(pos++, &parsedOk); - if (!parsedOk) { - return; - } - for (j = 0; j <= nLeft && nCodes < nGlyphs; ++j) { - if (c < 256) { - if (encoding[c]) { - gfree(encoding[c]); - } - encoding[c] = copyString(getString(charset[nCodes], buf, - &parsedOk)); - } - ++nCodes; - ++c; - } - } - } - if (encFormat & 0x80) { - nSups = getU8(pos++, &parsedOk); - if (!parsedOk) { - return; - } - for (i = 0; i < nSups; ++i) { - c = getU8(pos++, &parsedOk);; - if (!parsedOk) { - return;; - } - sid = getU16BE(pos, &parsedOk); - pos += 2; - if (!parsedOk) { - return; - } - if (encoding[c]) { - gfree(encoding[c]); - } - encoding[c] = copyString(getString(sid, buf, &parsedOk)); - } - } - } -} - -GBool FoFiType1C::readCharset() { - int charsetFormat, c, pos; - int nLeft, i, j; - - if (topDict.charsetOffset == 0) { - charset = fofiType1CISOAdobeCharset; - } else if (topDict.charsetOffset == 1) { - charset = fofiType1CExpertCharset; - } else if (topDict.charsetOffset == 2) { - charset = fofiType1CExpertSubsetCharset; - } else { - charset = (Gushort *)gmallocn(nGlyphs, sizeof(Gushort)); - for (i = 0; i < nGlyphs; ++i) { - charset[i] = 0; - } - pos = topDict.charsetOffset; - charsetFormat = getU8(pos++, &parsedOk); - if (charsetFormat == 0) { - for (i = 1; i < nGlyphs; ++i) { - charset[i] = (Gushort)getU16BE(pos, &parsedOk); - pos += 2; - if (!parsedOk) { - break; - } - } - } else if (charsetFormat == 1) { - i = 1; - while (i < nGlyphs) { - c = getU16BE(pos, &parsedOk); - pos += 2; - nLeft = getU8(pos++, &parsedOk); - if (!parsedOk) { - break; - } - for (j = 0; j <= nLeft && i < nGlyphs; ++j) { - charset[i++] = (Gushort)c++; - } - } - } else if (charsetFormat == 2) { - i = 1; - while (i < nGlyphs) { - c = getU16BE(pos, &parsedOk); - pos += 2; - nLeft = getU16BE(pos, &parsedOk); - pos += 2; - if (!parsedOk) { - break; - } - for (j = 0; j <= nLeft && i < nGlyphs; ++j) { - charset[i++] = (Gushort)c++; - } - } - } - if (!parsedOk) { - gfree(charset); - charset = NULL; - return gFalse; - } - } - return gTrue; -} - -int FoFiType1C::getOp(int pos, GBool charstring, GBool *ok) { - static char nybChars[16] = "0123456789.ee -"; - Type1COp op; - char buf[65]; - int b0, b1, nyb0, nyb1, x, i; - - b0 = getU8(pos++, ok); - op.isNum = gTrue; - op.isFP = gFalse; - - if (b0 == 28) { - x = getU8(pos++, ok); - x = (x << 8) | getU8(pos++, ok); - if (x & 0x8000) { - x |= ~0xffff; - } - op.num = x; - - } else if (!charstring && b0 == 29) { - x = getU8(pos++, ok); - x = (x << 8) | getU8(pos++, ok); - x = (x << 8) | getU8(pos++, ok); - x = (x << 8) | getU8(pos++, ok); - if (x & 0x80000000) { - x |= ~0xffffffff; - } - op.num = x; - - } else if (!charstring && b0 == 30) { - i = 0; - do { - b1 = getU8(pos++, ok); - nyb0 = b1 >> 4; - nyb1 = b1 & 0x0f; - if (nyb0 == 0xf) { - break; - } - buf[i++] = nybChars[nyb0]; - if (i == 64) { - break; - } - if (nyb0 == 0xc) { - buf[i++] = '-'; - } - if (i == 64) { - break; - } - if (nyb1 == 0xf) { - break; - } - buf[i++] = nybChars[nyb1]; - if (i == 64) { - break; - } - if (nyb1 == 0xc) { - buf[i++] = '-'; - } - } while (i < 64); - buf[i] = '\0'; - op.num = atof(buf); - op.isFP = gTrue; - - } else if (b0 >= 32 && b0 <= 246) { - op.num = b0 - 139; - - } else if (b0 >= 247 && b0 <= 250) { - op.num = ((b0 - 247) << 8) + getU8(pos++, ok) + 108; - - } else if (b0 >= 251 && b0 <= 254) { - op.num = -((b0 - 251) << 8) - getU8(pos++, ok) - 108; - - } else if (charstring && b0 == 255) { - x = getU8(pos++, ok); - x = (x << 8) | getU8(pos++, ok); - x = (x << 8) | getU8(pos++, ok); - x = (x << 8) | getU8(pos++, ok); - if (x & 0x80000000) { - x |= ~0xffffffff; - } - op.num = (double)x / 65536.0; - op.isFP = gTrue; - - } else if (b0 == 12) { - op.isNum = gFalse; - op.op = 0x0c00 + getU8(pos++, ok); - - } else { - op.isNum = gFalse; - op.op = b0; - } - - if (nOps < 49) { - ops[nOps++] = op; - } - - return pos; -} - -// Convert the delta-encoded ops array to an array of ints. -int FoFiType1C::getDeltaIntArray(int *arr, int maxLen) { - int x; - int n, i; - - if ((n = nOps) > maxLen) { - n = maxLen; - } - x = 0; - for (i = 0; i < n; ++i) { - x += (int)ops[i].num; - arr[i] = x; - } - return n; -} - -// Convert the delta-encoded ops array to an array of doubles. -int FoFiType1C::getDeltaFPArray(double *arr, int maxLen) { - double x; - int n, i; - - if ((n = nOps) > maxLen) { - n = maxLen; - } - x = 0; - for (i = 0; i < n; ++i) { - x += ops[i].num; - arr[i] = x; - } - return n; -} - -void FoFiType1C::getIndex(int pos, Type1CIndex *idx, GBool *ok) { - idx->pos = pos; - idx->len = getU16BE(pos, ok); - if (idx->len == 0) { - // empty indexes are legal and contain just the length field - idx->offSize = 0; - idx->startPos = idx->endPos = pos + 2; - } else { - idx->offSize = getU8(pos + 2, ok); - if (idx->offSize < 1 || idx->offSize > 4) { - *ok = gFalse; - } - idx->startPos = pos + 3 + (idx->len + 1) * idx->offSize - 1; - if (idx->startPos < 0 || idx->startPos >= len) { - *ok = gFalse; - } - idx->endPos = idx->startPos + getUVarBE(pos + 3 + idx->len * idx->offSize, - idx->offSize, ok); - if (idx->endPos < idx->startPos || idx->endPos > len) { - *ok = gFalse; - } - } -} - -void FoFiType1C::getIndexVal(Type1CIndex *idx, int i, - Type1CIndexVal *val, GBool *ok) { - int pos0, pos1; - - if (i < 0 || i >= idx->len) { - *ok = gFalse; - return; - } - pos0 = idx->startPos + getUVarBE(idx->pos + 3 + i * idx->offSize, - idx->offSize, ok); - pos1 = idx->startPos + getUVarBE(idx->pos + 3 + (i + 1) * idx->offSize, - idx->offSize, ok); - if (pos0 < idx->startPos || pos0 > idx->endPos || - pos1 <= idx->startPos || pos1 > idx->endPos || - pos1 < pos0) { - *ok = gFalse; - } - val->pos = pos0; - val->len = pos1 - pos0; -} - -char *FoFiType1C::getString(int sid, char *buf, GBool *ok) { - Type1CIndexVal val; - int n; - - if (sid < 391) { - strcpy(buf, fofiType1CStdStrings[sid]); - } else { - sid -= 391; - getIndexVal(&stringIdx, sid, &val, ok); - if (*ok) { - if ((n = val.len) > 255) { - n = 255; - } - strncpy(buf, (char *)&file[val.pos], n); - buf[n] = '\0'; - } else { - buf[0] = '\0'; - } - } - return buf; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.h deleted file mode 100644 index eec275554..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FoFiType1C.h +++ /dev/null @@ -1,233 +0,0 @@ -//======================================================================== -// -// FoFiType1C.h -// -// Copyright 1999-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef FOFITYPE1C_H -#define FOFITYPE1C_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "FoFiBase.h" - -class GString; - -//------------------------------------------------------------------------ - -struct Type1CIndex { - int pos; // absolute position in file - int len; // length (number of entries) - int offSize; // offset size - int startPos; // position of start of index data - 1 - int endPos; // position one byte past end of the index -}; - -struct Type1CIndexVal { - int pos; // absolute position in file - int len; // length, in bytes -}; - -struct Type1CTopDict { - int firstOp; - - int versionSID; - int noticeSID; - int copyrightSID; - int fullNameSID; - int familyNameSID; - int weightSID; - int isFixedPitch; - double italicAngle; - double underlinePosition; - double underlineThickness; - int paintType; - int charstringType; - double fontMatrix[6]; - GBool hasFontMatrix; // CID fonts are allowed to put their - // FontMatrix in the FD instead of the - // top dict - int uniqueID; - double fontBBox[4]; - double strokeWidth; - int charsetOffset; - int encodingOffset; - int charStringsOffset; - int privateSize; - int privateOffset; - - // CIDFont entries - int registrySID; - int orderingSID; - int supplement; - int fdArrayOffset; - int fdSelectOffset; -}; - -#define type1CMaxBlueValues 14 -#define type1CMaxOtherBlues 10 -#define type1CMaxStemSnap 12 - -struct Type1CPrivateDict { - double fontMatrix[6]; - GBool hasFontMatrix; - int blueValues[type1CMaxBlueValues]; - int nBlueValues; - int otherBlues[type1CMaxOtherBlues]; - int nOtherBlues; - int familyBlues[type1CMaxBlueValues]; - int nFamilyBlues; - int familyOtherBlues[type1CMaxOtherBlues]; - int nFamilyOtherBlues; - double blueScale; - int blueShift; - int blueFuzz; - double stdHW; - GBool hasStdHW; - double stdVW; - GBool hasStdVW; - double stemSnapH[type1CMaxStemSnap]; - int nStemSnapH; - double stemSnapV[type1CMaxStemSnap]; - int nStemSnapV; - GBool forceBold; - GBool hasForceBold; - double forceBoldThreshold; - int languageGroup; - double expansionFactor; - int initialRandomSeed; - int subrsOffset; - double defaultWidthX; - GBool defaultWidthXFP; - double nominalWidthX; - GBool nominalWidthXFP; -}; - -struct Type1COp { - GBool isNum; // true -> number, false -> operator - GBool isFP; // true -> floating point number, false -> int - union { - double num; // if num is true - int op; // if num is false - }; -}; - -struct Type1CEexecBuf { - FoFiOutputFunc outputFunc; - void *outputStream; - GBool ascii; // ASCII encoding? - Gushort r1; // eexec encryption key - int line; // number of eexec chars left on current line -}; - -//------------------------------------------------------------------------ -// FoFiType1C -//------------------------------------------------------------------------ - -class FoFiType1C: public FoFiBase { -public: - - // Create a FoFiType1C object from a memory buffer. - static FoFiType1C *make(char *fileA, int lenA); - - // Create a FoFiType1C object from a file on disk. - static FoFiType1C *load(char *fileName); - - virtual ~FoFiType1C(); - - // Return the font name. - char *getName(); - - // Return the encoding, as an array of 256 names (any of which may - // be NULL). This is only useful with 8-bit fonts. - char **getEncoding(); - - // Return the mapping from CIDs to GIDs, and return the number of - // CIDs in *. This is only useful for CID fonts. - Gushort *getCIDToGIDMap(int *nCIDs); - - // Convert to a Type 1 font, suitable for embedding in a PostScript - // file. This is only useful with 8-bit fonts. If is - // not NULL, it will be used in place of the encoding in the Type 1C - // font. If is true the eexec section will be hex-encoded, - // otherwise it will be left as binary data. If is non-NULL, - // it will be used as the PostScript font name. - void convertToType1(char *psName, char **newEncoding, GBool ascii, - FoFiOutputFunc outputFunc, void *outputStream); - - // Convert to a Type 0 CIDFont, suitable for embedding in a - // PostScript file. will be used as the PostScript font - // name. - void convertToCIDType0(char *psName, - FoFiOutputFunc outputFunc, void *outputStream); - - // Convert to a Type 0 (but non-CID) composite font, suitable for - // embedding in a PostScript file. will be used as the - // PostScript font name. - void convertToType0(char *psName, - FoFiOutputFunc outputFunc, void *outputStream); - -private: - - FoFiType1C(char *fileA, int lenA, GBool freeFileDataA); - void eexecCvtGlyph(Type1CEexecBuf *eb, char *glyphName, - int offset, int nBytes, - Type1CIndex *subrIdx, - Type1CPrivateDict *pDict); - void cvtGlyph(int offset, int nBytes, GString *charBuf, - Type1CIndex *subrIdx, Type1CPrivateDict *pDict, - GBool top); - void cvtGlyphWidth(GBool useOp, GString *charBuf, - Type1CPrivateDict *pDict); - void cvtNum(double x, GBool isFP, GString *charBuf); - void eexecWrite(Type1CEexecBuf *eb, char *s); - void eexecWriteCharstring(Type1CEexecBuf *eb, Guchar *s, int n); - GBool parse(); - void readTopDict(); - void readFD(int offset, int length, Type1CPrivateDict *pDict); - void readPrivateDict(int offset, int length, Type1CPrivateDict *pDict); - void readFDSelect(); - void buildEncoding(); - GBool readCharset(); - int getOp(int pos, GBool charstring, GBool *ok); - int getDeltaIntArray(int *arr, int maxLen); - int getDeltaFPArray(double *arr, int maxLen); - void getIndex(int pos, Type1CIndex *idx, GBool *ok); - void getIndexVal(Type1CIndex *idx, int i, Type1CIndexVal *val, GBool *ok); - char *getString(int sid, char *buf, GBool *ok); - - GString *name; - char **encoding; - - Type1CIndex nameIdx; - Type1CIndex topDictIdx; - Type1CIndex stringIdx; - Type1CIndex gsubrIdx; - Type1CIndex charStringsIdx; - - Type1CTopDict topDict; - Type1CPrivateDict *privateDicts; - - int nGlyphs; - int nFDs; - Guchar *fdSelect; - Gushort *charset; - int gsubrBias; - - GBool parsedOk; - - Type1COp ops[49]; // operands and operator - int nOps; // number of operands - int nHints; // number of hints for the current glyph - GBool firstOp; // true if we haven't hit the first op yet - GBool openPath; // true if there is an unclosed path -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.cc deleted file mode 100644 index f3b9280aa..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.cc +++ /dev/null @@ -1,1824 +0,0 @@ -//======================================================================== -// -// FontEncodingTables.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include -#include -#include "FontEncodingTables.h" - -char *macRomanEncoding[256] = { - 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, - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quotesingle", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "grave", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - NULL, - "Adieresis", - "Aring", - "Ccedilla", - "Eacute", - "Ntilde", - "Odieresis", - "Udieresis", - "aacute", - "agrave", - "acircumflex", - "adieresis", - "atilde", - "aring", - "ccedilla", - "eacute", - "egrave", - "ecircumflex", - "edieresis", - "iacute", - "igrave", - "icircumflex", - "idieresis", - "ntilde", - "oacute", - "ograve", - "ocircumflex", - "odieresis", - "otilde", - "uacute", - "ugrave", - "ucircumflex", - "udieresis", - "dagger", - "degree", - "cent", - "sterling", - "section", - "bullet", - "paragraph", - "germandbls", - "registered", - "copyright", - "trademark", - "acute", - "dieresis", - "notequal", - "AE", - "Oslash", - "infinity", - "plusminus", - "lessequal", - "greaterequal", - "yen", - "mu", - "partialdiff", - "summation", - "product", - "pi", - "integral", - "ordfeminine", - "ordmasculine", - "Omega", - "ae", - "oslash", - "questiondown", - "exclamdown", - "logicalnot", - "radical", - "florin", - "approxequal", - "Delta", - "guillemotleft", - "guillemotright", - "ellipsis", - "space", - "Agrave", - "Atilde", - "Otilde", - "OE", - "oe", - "endash", - "emdash", - "quotedblleft", - "quotedblright", - "quoteleft", - "quoteright", - "divide", - "lozenge", - "ydieresis", - "Ydieresis", - "fraction", - "currency", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - "daggerdbl", - "periodcentered", - "quotesinglbase", - "quotedblbase", - "perthousand", - "Acircumflex", - "Ecircumflex", - "Aacute", - "Edieresis", - "Egrave", - "Iacute", - "Icircumflex", - "Idieresis", - "Igrave", - "Oacute", - "Ocircumflex", - "apple", - "Ograve", - "Uacute", - "Ucircumflex", - "Ugrave", - "dotlessi", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "ring", - "cedilla", - "hungarumlaut", - "ogonek", - "caron" -}; - -char *macExpertEncoding[256] = { - 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, - "space", - "exclamsmall", - "Hungarumlautsmall", - "centoldstyle", - "dollaroldstyle", - "dollarsuperior", - "ampersandsmall", - "Acutesmall", - "parenleftsuperior", - "parenrightsuperior", - "twodotenleader", - "onedotenleader", - "comma", - "hyphen", - "period", - "fraction", - "zerooldstyle", - "oneoldstyle", - "twooldstyle", - "threeoldstyle", - "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", - "sevenoldstyle", - "eightoldstyle", - "nineoldstyle", - "colon", - "semicolon", - NULL, - "threequartersemdash", - NULL, - "questionsmall", - NULL, - NULL, - NULL, - NULL, - "Ethsmall", - NULL, - NULL, - "onequarter", - "onehalf", - "threequarters", - "oneeighth", - "threeeighths", - "fiveeighths", - "seveneighths", - "onethird", - "twothirds", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - "ff", - "fi", - "fl", - "ffi", - "ffl", - "parenleftinferior", - NULL, - "parenrightinferior", - "Circumflexsmall", - "hypheninferior", - "Gravesmall", - "Asmall", - "Bsmall", - "Csmall", - "Dsmall", - "Esmall", - "Fsmall", - "Gsmall", - "Hsmall", - "Ismall", - "Jsmall", - "Ksmall", - "Lsmall", - "Msmall", - "Nsmall", - "Osmall", - "Psmall", - "Qsmall", - "Rsmall", - "Ssmall", - "Tsmall", - "Usmall", - "Vsmall", - "Wsmall", - "Xsmall", - "Ysmall", - "Zsmall", - "colonmonetary", - "onefitted", - "rupiah", - "Tildesmall", - NULL, - NULL, - "asuperior", - "centsuperior", - NULL, - NULL, - NULL, - NULL, - "Aacutesmall", - "Agravesmall", - "Acircumflexsmall", - "Adieresissmall", - "Atildesmall", - "Aringsmall", - "Ccedillasmall", - "Eacutesmall", - "Egravesmall", - "Ecircumflexsmall", - "Edieresissmall", - "Iacutesmall", - "Igravesmall", - "Icircumflexsmall", - "Idieresissmall", - "Ntildesmall", - "Oacutesmall", - "Ogravesmall", - "Ocircumflexsmall", - "Odieresissmall", - "Otildesmall", - "Uacutesmall", - "Ugravesmall", - "Ucircumflexsmall", - "Udieresissmall", - NULL, - "eightsuperior", - "fourinferior", - "threeinferior", - "sixinferior", - "eightinferior", - "seveninferior", - "Scaronsmall", - NULL, - "centinferior", - "twoinferior", - NULL, - "Dieresissmall", - NULL, - "Caronsmall", - "osuperior", - "fiveinferior", - NULL, - "commainferior", - "periodinferior", - "Yacutesmall", - NULL, - "dollarinferior", - NULL, - NULL, - "Thornsmall", - NULL, - "nineinferior", - "zeroinferior", - "Zcaronsmall", - "AEsmall", - "Oslashsmall", - "questiondownsmall", - "oneinferior", - "Lslashsmall", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - "Cedillasmall", - NULL, - NULL, - NULL, - NULL, - NULL, - "OEsmall", - "figuredash", - "hyphensuperior", - NULL, - NULL, - NULL, - NULL, - "exclamdownsmall", - NULL, - "Ydieresissmall", - NULL, - "onesuperior", - "twosuperior", - "threesuperior", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "ninesuperior", - "zerosuperior", - NULL, - "esuperior", - "rsuperior", - "tsuperior", - NULL, - NULL, - "isuperior", - "ssuperior", - "dsuperior", - NULL, - NULL, - NULL, - NULL, - NULL, - "lsuperior", - "Ogoneksmall", - "Brevesmall", - "Macronsmall", - "bsuperior", - "nsuperior", - "msuperior", - "commasuperior", - "periodsuperior", - "Dotaccentsmall", - "Ringsmall", - NULL, - NULL, - NULL, - NULL -}; - -char *winAnsiEncoding[256] = { - 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, - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quotesingle", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "grave", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - "bullet", - "Euro", - "bullet", - "quotesinglbase", - "florin", - "quotedblbase", - "ellipsis", - "dagger", - "daggerdbl", - "circumflex", - "perthousand", - "Scaron", - "guilsinglleft", - "OE", - "bullet", - "Zcaron", - "bullet", - "bullet", - "quoteleft", - "quoteright", - "quotedblleft", - "quotedblright", - "bullet", - "endash", - "emdash", - "tilde", - "trademark", - "scaron", - "guilsinglright", - "oe", - "bullet", - "zcaron", - "Ydieresis", - "space", - "exclamdown", - "cent", - "sterling", - "currency", - "yen", - "brokenbar", - "section", - "dieresis", - "copyright", - "ordfeminine", - "guillemotleft", - "logicalnot", - "hyphen", - "registered", - "macron", - "degree", - "plusminus", - "twosuperior", - "threesuperior", - "acute", - "mu", - "paragraph", - "periodcentered", - "cedilla", - "onesuperior", - "ordmasculine", - "guillemotright", - "onequarter", - "onehalf", - "threequarters", - "questiondown", - "Agrave", - "Aacute", - "Acircumflex", - "Atilde", - "Adieresis", - "Aring", - "AE", - "Ccedilla", - "Egrave", - "Eacute", - "Ecircumflex", - "Edieresis", - "Igrave", - "Iacute", - "Icircumflex", - "Idieresis", - "Eth", - "Ntilde", - "Ograve", - "Oacute", - "Ocircumflex", - "Otilde", - "Odieresis", - "multiply", - "Oslash", - "Ugrave", - "Uacute", - "Ucircumflex", - "Udieresis", - "Yacute", - "Thorn", - "germandbls", - "agrave", - "aacute", - "acircumflex", - "atilde", - "adieresis", - "aring", - "ae", - "ccedilla", - "egrave", - "eacute", - "ecircumflex", - "edieresis", - "igrave", - "iacute", - "icircumflex", - "idieresis", - "eth", - "ntilde", - "ograve", - "oacute", - "ocircumflex", - "otilde", - "odieresis", - "divide", - "oslash", - "ugrave", - "uacute", - "ucircumflex", - "udieresis", - "yacute", - "thorn", - "ydieresis" -}; - -char *standardEncoding[256] = { - 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, - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quoteright", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "quoteleft", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - 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, - "exclamdown", - "cent", - "sterling", - "fraction", - "yen", - "florin", - "section", - "currency", - "quotesingle", - "quotedblleft", - "guillemotleft", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - NULL, - "endash", - "dagger", - "daggerdbl", - "periodcentered", - NULL, - "paragraph", - "bullet", - "quotesinglbase", - "quotedblbase", - "quotedblright", - "guillemotright", - "ellipsis", - "perthousand", - NULL, - "questiondown", - NULL, - "grave", - "acute", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "dieresis", - NULL, - "ring", - "cedilla", - NULL, - "hungarumlaut", - "ogonek", - "caron", - "emdash", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - "AE", - NULL, - "ordfeminine", - NULL, - NULL, - NULL, - NULL, - "Lslash", - "Oslash", - "OE", - "ordmasculine", - NULL, - NULL, - NULL, - NULL, - NULL, - "ae", - NULL, - NULL, - NULL, - "dotlessi", - NULL, - NULL, - "lslash", - "oslash", - "oe", - "germandbls", - NULL, - NULL, - NULL, - NULL -}; - -char *expertEncoding[256] = { - 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, - "space", - "exclamsmall", - "Hungarumlautsmall", - NULL, - "dollaroldstyle", - "dollarsuperior", - "ampersandsmall", - "Acutesmall", - "parenleftsuperior", - "parenrightsuperior", - "twodotenleader", - "onedotenleader", - "comma", - "hyphen", - "period", - "fraction", - "zerooldstyle", - "oneoldstyle", - "twooldstyle", - "threeoldstyle", - "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", - "sevenoldstyle", - "eightoldstyle", - "nineoldstyle", - "colon", - "semicolon", - "commasuperior", - "threequartersemdash", - "periodsuperior", - "questionsmall", - NULL, - "asuperior", - "bsuperior", - "centsuperior", - "dsuperior", - "esuperior", - NULL, - NULL, - NULL, - "isuperior", - NULL, - NULL, - "lsuperior", - "msuperior", - "nsuperior", - "osuperior", - NULL, - NULL, - "rsuperior", - "ssuperior", - "tsuperior", - NULL, - "ff", - "fi", - "fl", - "ffi", - "ffl", - "parenleftinferior", - NULL, - "parenrightinferior", - "Circumflexsmall", - "hyphensuperior", - "Gravesmall", - "Asmall", - "Bsmall", - "Csmall", - "Dsmall", - "Esmall", - "Fsmall", - "Gsmall", - "Hsmall", - "Ismall", - "Jsmall", - "Ksmall", - "Lsmall", - "Msmall", - "Nsmall", - "Osmall", - "Psmall", - "Qsmall", - "Rsmall", - "Ssmall", - "Tsmall", - "Usmall", - "Vsmall", - "Wsmall", - "Xsmall", - "Ysmall", - "Zsmall", - "colonmonetary", - "onefitted", - "rupiah", - "Tildesmall", - 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, - "exclamdownsmall", - "centoldstyle", - "Lslashsmall", - NULL, - NULL, - "Scaronsmall", - "Zcaronsmall", - "Dieresissmall", - "Brevesmall", - "Caronsmall", - NULL, - "Dotaccentsmall", - NULL, - NULL, - "Macronsmall", - NULL, - NULL, - "figuredash", - "hypheninferior", - NULL, - NULL, - "Ogoneksmall", - "Ringsmall", - "Cedillasmall", - NULL, - NULL, - NULL, - "onequarter", - "onehalf", - "threequarters", - "questiondownsmall", - "oneeighth", - "threeeighths", - "fiveeighths", - "seveneighths", - "onethird", - "twothirds", - NULL, - NULL, - "zerosuperior", - "onesuperior", - "twosuperior", - "threesuperior", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "eightsuperior", - "ninesuperior", - "zeroinferior", - "oneinferior", - "twoinferior", - "threeinferior", - "fourinferior", - "fiveinferior", - "sixinferior", - "seveninferior", - "eightinferior", - "nineinferior", - "centinferior", - "dollarinferior", - "periodinferior", - "commainferior", - "Agravesmall", - "Aacutesmall", - "Acircumflexsmall", - "Atildesmall", - "Adieresissmall", - "Aringsmall", - "AEsmall", - "Ccedillasmall", - "Egravesmall", - "Eacutesmall", - "Ecircumflexsmall", - "Edieresissmall", - "Igravesmall", - "Iacutesmall", - "Icircumflexsmall", - "Idieresissmall", - "Ethsmall", - "Ntildesmall", - "Ogravesmall", - "Oacutesmall", - "Ocircumflexsmall", - "Otildesmall", - "Odieresissmall", - "OEsmall", - "Oslashsmall", - "Ugravesmall", - "Uacutesmall", - "Ucircumflexsmall", - "Udieresissmall", - "Yacutesmall", - "Thornsmall", - "Ydieresissmall" -}; - -char *symbolEncoding[256] = { - 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, - "space", - "exclam", - "universal", - "numbersign", - "existential", - "percent", - "ampersand", - "suchthat", - "parenleft", - "parenright", - "asteriskmath", - "plus", - "comma", - "minus", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "congruent", - "Alpha", - "Beta", - "Chi", - "Delta", - "Epsilon", - "Phi", - "Gamma", - "Eta", - "Iota", - "theta1", - "Kappa", - "Lambda", - "Mu", - "Nu", - "Omicron", - "Pi", - "Theta", - "Rho", - "Sigma", - "Tau", - "Upsilon", - "sigma1", - "Omega", - "Xi", - "Psi", - "Zeta", - "bracketleft", - "therefore", - "bracketright", - "perpendicular", - "underscore", - "radicalex", - "alpha", - "beta", - "chi", - "delta", - "epsilon", - "phi", - "gamma", - "eta", - "iota", - "phi1", - "kappa", - "lambda", - "mu", - "nu", - "omicron", - "pi", - "theta", - "rho", - "sigma", - "tau", - "upsilon", - "omega1", - "omega", - "xi", - "psi", - "zeta", - "braceleft", - "bar", - "braceright", - "similar", - 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, - "Upsilon1", - "minute", - "lessequal", - "fraction", - "infinity", - "florin", - "club", - "diamond", - "heart", - "spade", - "arrowboth", - "arrowleft", - "arrowup", - "arrowright", - "arrowdown", - "degree", - "plusminus", - "second", - "greaterequal", - "multiply", - "proportional", - "partialdiff", - "bullet", - "divide", - "notequal", - "equivalence", - "approxequal", - "ellipsis", - "arrowvertex", - "arrowhorizex", - "carriagereturn", - "aleph", - "Ifraktur", - "Rfraktur", - "weierstrass", - "circlemultiply", - "circleplus", - "emptyset", - "intersection", - "union", - "propersuperset", - "reflexsuperset", - "notsubset", - "propersubset", - "reflexsubset", - "element", - "notelement", - "angle", - "gradient", - "registerserif", - "copyrightserif", - "trademarkserif", - "product", - "radical", - "dotmath", - "logicalnot", - "logicaland", - "logicalor", - "arrowdblboth", - "arrowdblleft", - "arrowdblup", - "arrowdblright", - "arrowdbldown", - "lozenge", - "angleleft", - "registersans", - "copyrightsans", - "trademarksans", - "summation", - "parenlefttp", - "parenleftex", - "parenleftbt", - "bracketlefttp", - "bracketleftex", - "bracketleftbt", - "bracelefttp", - "braceleftmid", - "braceleftbt", - "braceex", - NULL, - "angleright", - "integral", - "integraltp", - "integralex", - "integralbt", - "parenrighttp", - "parenrightex", - "parenrightbt", - "bracketrighttp", - "bracketrightex", - "bracketrightbt", - "bracerighttp", - "bracerightmid", - "bracerightbt", - NULL -}; - -char *zapfDingbatsEncoding[256] = { - 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, - "space", - "a1", - "a2", - "a202", - "a3", - "a4", - "a5", - "a119", - "a118", - "a117", - "a11", - "a12", - "a13", - "a14", - "a15", - "a16", - "a105", - "a17", - "a18", - "a19", - "a20", - "a21", - "a22", - "a23", - "a24", - "a25", - "a26", - "a27", - "a28", - "a6", - "a7", - "a8", - "a9", - "a10", - "a29", - "a30", - "a31", - "a32", - "a33", - "a34", - "a35", - "a36", - "a37", - "a38", - "a39", - "a40", - "a41", - "a42", - "a43", - "a44", - "a45", - "a46", - "a47", - "a48", - "a49", - "a50", - "a51", - "a52", - "a53", - "a54", - "a55", - "a56", - "a57", - "a58", - "a59", - "a60", - "a61", - "a62", - "a63", - "a64", - "a65", - "a66", - "a67", - "a68", - "a69", - "a70", - "a71", - "a72", - "a73", - "a74", - "a203", - "a75", - "a204", - "a76", - "a77", - "a78", - "a79", - "a81", - "a82", - "a83", - "a84", - "a97", - "a98", - "a99", - "a100", - 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, - "a101", - "a102", - "a103", - "a104", - "a106", - "a107", - "a108", - "a112", - "a111", - "a110", - "a109", - "a120", - "a121", - "a122", - "a123", - "a124", - "a125", - "a126", - "a127", - "a128", - "a129", - "a130", - "a131", - "a132", - "a133", - "a134", - "a135", - "a136", - "a137", - "a138", - "a139", - "a140", - "a141", - "a142", - "a143", - "a144", - "a145", - "a146", - "a147", - "a148", - "a149", - "a150", - "a151", - "a152", - "a153", - "a154", - "a155", - "a156", - "a157", - "a158", - "a159", - "a160", - "a161", - "a163", - "a164", - "a196", - "a165", - "a192", - "a166", - "a167", - "a168", - "a169", - "a170", - "a171", - "a172", - "a173", - "a162", - "a174", - "a175", - "a176", - "a177", - "a178", - "a179", - "a193", - "a180", - "a199", - "a181", - "a200", - "a182", - NULL, - "a201", - "a183", - "a184", - "a197", - "a185", - "a194", - "a198", - "a186", - "a195", - "a187", - "a188", - "a189", - "a190", - "a191", - NULL -}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.h deleted file mode 100644 index 8b0a1e7e9..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/FontEncodingTables.h +++ /dev/null @@ -1,20 +0,0 @@ -//======================================================================== -// -// FontEncodingTables.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef FONTENCODINGTABLES_H -#define FONTENCODINGTABLES_H - -extern char *macRomanEncoding[]; -extern char *macExpertEncoding[]; -extern char *winAnsiEncoding[]; -extern char *standardEncoding[]; -extern char *expertEncoding[]; -extern char *symbolEncoding[]; -extern char *zapfDingbatsEncoding[]; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.cc deleted file mode 100644 index 05555eebc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.cc +++ /dev/null @@ -1,1573 +0,0 @@ -//======================================================================== -// -// Function.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#include "gmem.h" -#include "Object.h" -#include "Dict.h" -#include "Stream.h" -#include "Error.h" -#include "Function.h" - -//------------------------------------------------------------------------ -// Function -//------------------------------------------------------------------------ - -Function::Function() { -} - -Function::~Function() { -} - -Function *Function::parse(Object *funcObj) { - Function *func; - Dict *dict; - int funcType; - Object obj1; - - if (funcObj->isStream()) { - dict = funcObj->streamGetDict(); - } else if (funcObj->isDict()) { - dict = funcObj->getDict(); - } else if (funcObj->isName("Identity")) { - return new IdentityFunction(); - } else { - error(-1, "Expected function dictionary or stream"); - return NULL; - } - - if (!dict->lookup("FunctionType", &obj1)->isInt()) { - error(-1, "Function type is missing or wrong type"); - obj1.free(); - return NULL; - } - funcType = obj1.getInt(); - obj1.free(); - - if (funcType == 0) { - func = new SampledFunction(funcObj, dict); - } else if (funcType == 2) { - func = new ExponentialFunction(funcObj, dict); - } else if (funcType == 3) { - func = new StitchingFunction(funcObj, dict); - } else if (funcType == 4) { - func = new PostScriptFunction(funcObj, dict); - } else { - error(-1, "Unimplemented function type (%d)", funcType); - return NULL; - } - if (!func->isOk()) { - delete func; - return NULL; - } - - return func; -} - -GBool Function::init(Dict *dict) { - Object obj1, obj2; - int i; - - //----- Domain - if (!dict->lookup("Domain", &obj1)->isArray()) { - error(-1, "Function is missing domain"); - goto err2; - } - m = obj1.arrayGetLength() / 2; - if (m > funcMaxInputs) { - error(-1, "Functions with more than %d inputs are unsupported", - funcMaxInputs); - goto err2; - } - for (i = 0; i < m; ++i) { - obj1.arrayGet(2*i, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function domain array"); - goto err1; - } - domain[i][0] = obj2.getNum(); - obj2.free(); - obj1.arrayGet(2*i+1, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function domain array"); - goto err1; - } - domain[i][1] = obj2.getNum(); - obj2.free(); - } - obj1.free(); - - //----- Range - hasRange = gFalse; - n = 0; - if (dict->lookup("Range", &obj1)->isArray()) { - hasRange = gTrue; - n = obj1.arrayGetLength() / 2; - if (n > funcMaxOutputs) { - error(-1, "Functions with more than %d outputs are unsupported", - funcMaxOutputs); - goto err2; - } - for (i = 0; i < n; ++i) { - obj1.arrayGet(2*i, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function range array"); - goto err1; - } - range[i][0] = obj2.getNum(); - obj2.free(); - obj1.arrayGet(2*i+1, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function range array"); - goto err1; - } - range[i][1] = obj2.getNum(); - obj2.free(); - } - } - obj1.free(); - - return gTrue; - - err1: - obj2.free(); - err2: - obj1.free(); - return gFalse; -} - -//------------------------------------------------------------------------ -// IdentityFunction -//------------------------------------------------------------------------ - -IdentityFunction::IdentityFunction() { - int i; - - // fill these in with arbitrary values just in case they get used - // somewhere - m = funcMaxInputs; - n = funcMaxOutputs; - for (i = 0; i < funcMaxInputs; ++i) { - domain[i][0] = 0; - domain[i][1] = 1; - } - hasRange = gFalse; -} - -IdentityFunction::~IdentityFunction() { -} - -void IdentityFunction::transform(double *in, double *out) { - int i; - - for (i = 0; i < funcMaxOutputs; ++i) { - out[i] = in[i]; - } -} - -//------------------------------------------------------------------------ -// SampledFunction -//------------------------------------------------------------------------ - -SampledFunction::SampledFunction(Object *funcObj, Dict *dict) { - Stream *str; - int sampleBits; - double sampleMul; - Object obj1, obj2; - Guint buf, bitMask; - int bits; - Guint s; - int i; - - samples = NULL; - sBuf = NULL; - ok = gFalse; - - //----- initialize the generic stuff - if (!init(dict)) { - goto err1; - } - if (!hasRange) { - error(-1, "Type 0 function is missing range"); - goto err1; - } - if (m > sampledFuncMaxInputs) { - error(-1, "Sampled functions with more than %d inputs are unsupported", - sampledFuncMaxInputs); - goto err1; - } - - //----- buffer - sBuf = (double *)gmallocn(1 << m, sizeof(double)); - - //----- get the stream - if (!funcObj->isStream()) { - error(-1, "Type 0 function isn't a stream"); - goto err1; - } - str = funcObj->getStream(); - - //----- Size - if (!dict->lookup("Size", &obj1)->isArray() || - obj1.arrayGetLength() != m) { - error(-1, "Function has missing or invalid size array"); - goto err2; - } - for (i = 0; i < m; ++i) { - obj1.arrayGet(i, &obj2); - if (!obj2.isInt()) { - error(-1, "Illegal value in function size array"); - goto err3; - } - sampleSize[i] = obj2.getInt(); - obj2.free(); - } - obj1.free(); - idxMul[0] = n; - for (i = 1; i < m; ++i) { - idxMul[i] = idxMul[i-1] * sampleSize[i-1]; - } - - //----- BitsPerSample - if (!dict->lookup("BitsPerSample", &obj1)->isInt()) { - error(-1, "Function has missing or invalid BitsPerSample"); - goto err2; - } - sampleBits = obj1.getInt(); - sampleMul = 1.0 / (pow(2.0, (double)sampleBits) - 1); - obj1.free(); - - //----- Encode - if (dict->lookup("Encode", &obj1)->isArray() && - obj1.arrayGetLength() == 2*m) { - for (i = 0; i < m; ++i) { - obj1.arrayGet(2*i, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function encode array"); - goto err3; - } - encode[i][0] = obj2.getNum(); - obj2.free(); - obj1.arrayGet(2*i+1, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function encode array"); - goto err3; - } - encode[i][1] = obj2.getNum(); - obj2.free(); - } - } else { - for (i = 0; i < m; ++i) { - encode[i][0] = 0; - encode[i][1] = sampleSize[i] - 1; - } - } - obj1.free(); - for (i = 0; i < m; ++i) { - inputMul[i] = (encode[i][1] - encode[i][0]) / - (domain[i][1] - domain[i][0]); - } - - //----- Decode - if (dict->lookup("Decode", &obj1)->isArray() && - obj1.arrayGetLength() == 2*n) { - for (i = 0; i < n; ++i) { - obj1.arrayGet(2*i, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function decode array"); - goto err3; - } - decode[i][0] = obj2.getNum(); - obj2.free(); - obj1.arrayGet(2*i+1, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function decode array"); - goto err3; - } - decode[i][1] = obj2.getNum(); - obj2.free(); - } - } else { - for (i = 0; i < n; ++i) { - decode[i][0] = range[i][0]; - decode[i][1] = range[i][1]; - } - } - obj1.free(); - - //----- samples - nSamples = n; - for (i = 0; i < m; ++i) - nSamples *= sampleSize[i]; - samples = (double *)gmallocn(nSamples, sizeof(double)); - buf = 0; - bits = 0; - bitMask = (1 << sampleBits) - 1; - str->reset(); - for (i = 0; i < nSamples; ++i) { - if (sampleBits == 8) { - s = str->getChar(); - } else if (sampleBits == 16) { - s = str->getChar(); - s = (s << 8) + str->getChar(); - } else if (sampleBits == 32) { - s = str->getChar(); - s = (s << 8) + str->getChar(); - s = (s << 8) + str->getChar(); - s = (s << 8) + str->getChar(); - } else { - while (bits < sampleBits) { - buf = (buf << 8) | (str->getChar() & 0xff); - bits += 8; - } - s = (buf >> (bits - sampleBits)) & bitMask; - bits -= sampleBits; - } - samples[i] = (double)s * sampleMul; - } - str->close(); - - ok = gTrue; - return; - - err3: - obj2.free(); - err2: - obj1.free(); - err1: - return; -} - -SampledFunction::~SampledFunction() { - if (samples) { - gfree(samples); - } - if (sBuf) { - gfree(sBuf); - } -} - -SampledFunction::SampledFunction(SampledFunction *func) { - memcpy(this, func, sizeof(SampledFunction)); - samples = (double *)gmallocn(nSamples, sizeof(double)); - memcpy(samples, func->samples, nSamples * sizeof(double)); - sBuf = (double *)gmallocn(1 << m, sizeof(double)); -} - -void SampledFunction::transform(double *in, double *out) { - double x; - int e[funcMaxInputs][2]; - double efrac0[funcMaxInputs]; - double efrac1[funcMaxInputs]; - int i, j, k, idx, t; - - // map input values into sample array - for (i = 0; i < m; ++i) { - x = (in[i] - domain[i][0]) * inputMul[i] + encode[i][0]; - if (x < 0) { - x = 0; - } else if (x > sampleSize[i] - 1) { - x = sampleSize[i] - 1; - } - e[i][0] = (int)x; - if ((e[i][1] = e[i][0] + 1) >= sampleSize[i]) { - // this happens if in[i] = domain[i][1] - e[i][1] = e[i][0]; - } - efrac1[i] = x - e[i][0]; - efrac0[i] = 1 - efrac1[i]; - } - - // for each output, do m-linear interpolation - for (i = 0; i < n; ++i) { - - // pull 2^m values out of the sample array - for (j = 0; j < (1<>= 1) { - idx += idxMul[k] * (e[k][t & 1]); - } - sBuf[j] = (idx>=0&&idx>= 1) { - for (k = 0; k < t; k += 2) { - sBuf[k >> 1] = efrac0[j] * sBuf[k] + efrac1[j] * sBuf[k+1]; - } - } - - // map output value to range - out[i] = sBuf[0] * (decode[i][1] - decode[i][0]) + decode[i][0]; - if (out[i] < range[i][0]) { - out[i] = range[i][0]; - } else if (out[i] > range[i][1]) { - out[i] = range[i][1]; - } - } -} - -//------------------------------------------------------------------------ -// ExponentialFunction -//------------------------------------------------------------------------ - -ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { - Object obj1, obj2; - int i; - - ok = gFalse; - - //----- initialize the generic stuff - if (!init(dict)) { - goto err1; - } - if (m != 1) { - error(-1, "Exponential function with more than one input"); - goto err1; - } - - //----- C0 - if (dict->lookup("C0", &obj1)->isArray()) { - if (hasRange && obj1.arrayGetLength() != n) { - error(-1, "Function's C0 array is wrong length"); - goto err2; - } - n = obj1.arrayGetLength(); - for (i = 0; i < n; ++i) { - obj1.arrayGet(i, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function C0 array"); - goto err3; - } - c0[i] = obj2.getNum(); - obj2.free(); - } - } else { - if (hasRange && n != 1) { - error(-1, "Function's C0 array is wrong length"); - goto err2; - } - n = 1; - c0[0] = 0; - } - obj1.free(); - - //----- C1 - if (dict->lookup("C1", &obj1)->isArray()) { - if (obj1.arrayGetLength() != n) { - error(-1, "Function's C1 array is wrong length"); - goto err2; - } - for (i = 0; i < n; ++i) { - obj1.arrayGet(i, &obj2); - if (!obj2.isNum()) { - error(-1, "Illegal value in function C1 array"); - goto err3; - } - c1[i] = obj2.getNum(); - obj2.free(); - } - } else { - if (n != 1) { - error(-1, "Function's C1 array is wrong length"); - goto err2; - } - c1[0] = 1; - } - obj1.free(); - - //----- N (exponent) - if (!dict->lookup("N", &obj1)->isNum()) { - error(-1, "Function has missing or invalid N"); - goto err2; - } - e = obj1.getNum(); - obj1.free(); - - ok = gTrue; - return; - - err3: - obj2.free(); - err2: - obj1.free(); - err1: - return; -} - -ExponentialFunction::~ExponentialFunction() { -} - -ExponentialFunction::ExponentialFunction(ExponentialFunction *func) { - memcpy(this, func, sizeof(ExponentialFunction)); -} - -void ExponentialFunction::transform(double *in, double *out) { - double x; - int i; - - if (in[0] < domain[0][0]) { - x = domain[0][0]; - } else if (in[0] > domain[0][1]) { - x = domain[0][1]; - } else { - x = in[0]; - } - for (i = 0; i < n; ++i) { - out[i] = c0[i] + pow(x, e) * (c1[i] - c0[i]); - if (hasRange) { - if (out[i] < range[i][0]) { - out[i] = range[i][0]; - } else if (out[i] > range[i][1]) { - out[i] = range[i][1]; - } - } - } - return; -} - -//------------------------------------------------------------------------ -// StitchingFunction -//------------------------------------------------------------------------ - -StitchingFunction::StitchingFunction(Object *funcObj, Dict *dict) { - Object obj1, obj2; - int i; - - ok = gFalse; - funcs = NULL; - bounds = NULL; - encode = NULL; - scale = NULL; - - //----- initialize the generic stuff - if (!init(dict)) { - goto err1; - } - if (m != 1) { - error(-1, "Stitching function with more than one input"); - goto err1; - } - - //----- Functions - if (!dict->lookup("Functions", &obj1)->isArray()) { - error(-1, "Missing 'Functions' entry in stitching function"); - goto err1; - } - k = obj1.arrayGetLength(); - funcs = (Function **)gmallocn(k, sizeof(Function *)); - bounds = (double *)gmallocn(k + 1, sizeof(double)); - encode = (double *)gmallocn(2 * k, sizeof(double)); - scale = (double *)gmallocn(k, sizeof(double)); - for (i = 0; i < k; ++i) { - funcs[i] = NULL; - } - for (i = 0; i < k; ++i) { - if (!(funcs[i] = Function::parse(obj1.arrayGet(i, &obj2)))) { - goto err2; - } - if (i > 0 && (funcs[i]->getInputSize() != 1 || - funcs[i]->getOutputSize() != funcs[0]->getOutputSize())) { - error(-1, "Incompatible subfunctions in stitching function"); - goto err2; - } - obj2.free(); - } - obj1.free(); - - //----- Bounds - if (!dict->lookup("Bounds", &obj1)->isArray() || - obj1.arrayGetLength() != k - 1) { - error(-1, "Missing or invalid 'Bounds' entry in stitching function"); - goto err1; - } - bounds[0] = domain[0][0]; - for (i = 1; i < k; ++i) { - if (!obj1.arrayGet(i - 1, &obj2)->isNum()) { - error(-1, "Invalid type in 'Bounds' array in stitching function"); - goto err2; - } - bounds[i] = obj2.getNum(); - obj2.free(); - } - bounds[k] = domain[0][1]; - obj1.free(); - - //----- Encode - if (!dict->lookup("Encode", &obj1)->isArray() || - obj1.arrayGetLength() != 2 * k) { - error(-1, "Missing or invalid 'Encode' entry in stitching function"); - goto err1; - } - for (i = 0; i < 2 * k; ++i) { - if (!obj1.arrayGet(i, &obj2)->isNum()) { - error(-1, "Invalid type in 'Encode' array in stitching function"); - goto err2; - } - encode[i] = obj2.getNum(); - obj2.free(); - } - obj1.free(); - - //----- pre-compute the scale factors - for (i = 0; i < k; ++i) { - if (bounds[i] == bounds[i+1]) { - // avoid a divide-by-zero -- in this situation, function i will - // never be used anyway - scale[i] = 0; - } else { - scale[i] = (encode[2*i+1] - encode[2*i]) / (bounds[i+1] - bounds[i]); - } - } - - ok = gTrue; - return; - - err2: - obj2.free(); - err1: - obj1.free(); -} - -StitchingFunction::StitchingFunction(StitchingFunction *func) { - int i; - - k = func->k; - funcs = (Function **)gmallocn(k, sizeof(Function *)); - for (i = 0; i < k; ++i) { - funcs[i] = func->funcs[i]->copy(); - } - bounds = (double *)gmallocn(k + 1, sizeof(double)); - memcpy(bounds, func->bounds, (k + 1) * sizeof(double)); - encode = (double *)gmallocn(2 * k, sizeof(double)); - memcpy(encode, func->encode, 2 * k * sizeof(double)); - scale = (double *)gmallocn(k, sizeof(double)); - memcpy(scale, func->scale, k * sizeof(double)); - ok = gTrue; -} - -StitchingFunction::~StitchingFunction() { - int i; - - if (funcs) { - for (i = 0; i < k; ++i) { - if (funcs[i]) { - delete funcs[i]; - } - } - } - gfree(funcs); - gfree(bounds); - gfree(encode); - gfree(scale); -} - -void StitchingFunction::transform(double *in, double *out) { - double x; - int i; - - if (in[0] < domain[0][0]) { - x = domain[0][0]; - } else if (in[0] > domain[0][1]) { - x = domain[0][1]; - } else { - x = in[0]; - } - for (i = 0; i < k - 1; ++i) { - if (x < bounds[i+1]) { - break; - } - } - x = encode[2*i] + (x - bounds[i]) * scale[i]; - funcs[i]->transform(&x, out); -} - -//------------------------------------------------------------------------ -// PostScriptFunction -//------------------------------------------------------------------------ - -enum PSOp { - psOpAbs, - psOpAdd, - psOpAnd, - psOpAtan, - psOpBitshift, - psOpCeiling, - psOpCopy, - psOpCos, - psOpCvi, - psOpCvr, - psOpDiv, - psOpDup, - psOpEq, - psOpExch, - psOpExp, - psOpFalse, - psOpFloor, - psOpGe, - psOpGt, - psOpIdiv, - psOpIndex, - psOpLe, - psOpLn, - psOpLog, - psOpLt, - psOpMod, - psOpMul, - psOpNe, - psOpNeg, - psOpNot, - psOpOr, - psOpPop, - psOpRoll, - psOpRound, - psOpSin, - psOpSqrt, - psOpSub, - psOpTrue, - psOpTruncate, - psOpXor, - psOpIf, - psOpIfelse, - psOpReturn -}; - -// Note: 'if' and 'ifelse' are parsed separately. -// The rest are listed here in alphabetical order. -// The index in this table is equivalent to the entry in PSOp. -char *psOpNames[] = { - "abs", - "add", - "and", - "atan", - "bitshift", - "ceiling", - "copy", - "cos", - "cvi", - "cvr", - "div", - "dup", - "eq", - "exch", - "exp", - "false", - "floor", - "ge", - "gt", - "idiv", - "index", - "le", - "ln", - "log", - "lt", - "mod", - "mul", - "ne", - "neg", - "not", - "or", - "pop", - "roll", - "round", - "sin", - "sqrt", - "sub", - "true", - "truncate", - "xor" -}; - -#define nPSOps (sizeof(psOpNames) / sizeof(char *)) - -enum PSObjectType { - psBool, - psInt, - psReal, - psOperator, - psBlock -}; - -// In the code array, 'if'/'ifelse' operators take up three slots -// plus space for the code in the subclause(s). -// -// +---------------------------------+ -// | psOperator: psOpIf / psOpIfelse | -// +---------------------------------+ -// | psBlock: ptr= | -// +---------------------------------+ -// | psBlock: ptr= | -// +---------------------------------+ -// | if clause | -// | ... | -// | psOperator: psOpReturn | -// +---------------------------------+ -// | else clause | -// | ... | -// | psOperator: psOpReturn | -// +---------------------------------+ -// | ... | -// -// For 'if', pointer is present in the code stream but unused. - -struct PSObject { - PSObjectType type; - union { - GBool booln; // boolean (stack only) - int intg; // integer (stack and code) - double real; // real (stack and code) - PSOp op; // operator (code only) - int blk; // if/ifelse block pointer (code only) - }; -}; - -#define psStackSize 100 - -class PSStack { -public: - - PSStack() { sp = psStackSize; } - void pushBool(GBool booln); - void pushInt(int intg); - void pushReal(double real); - GBool popBool(); - int popInt(); - double popNum(); - GBool empty() { return sp == psStackSize; } - GBool topIsInt() { return sp < psStackSize && stack[sp].type == psInt; } - GBool topTwoAreInts() - { return sp < psStackSize - 1 && - stack[sp].type == psInt && - stack[sp+1].type == psInt; } - GBool topIsReal() { return sp < psStackSize && stack[sp].type == psReal; } - GBool topTwoAreNums() - { return sp < psStackSize - 1 && - (stack[sp].type == psInt || stack[sp].type == psReal) && - (stack[sp+1].type == psInt || stack[sp+1].type == psReal); } - void copy(int n); - void roll(int n, int j); - void index(int i); - void pop(); - -private: - - GBool checkOverflow(int n = 1); - GBool checkUnderflow(); - GBool checkType(PSObjectType t1, PSObjectType t2); - - PSObject stack[psStackSize]; - int sp; -}; - -GBool PSStack::checkOverflow(int n) { - if (sp - n < 0) { - error(-1, "Stack overflow in PostScript function"); - return gFalse; - } - return gTrue; -} - -GBool PSStack::checkUnderflow() { - if (sp == psStackSize) { - error(-1, "Stack underflow in PostScript function"); - return gFalse; - } - return gTrue; -} - -GBool PSStack::checkType(PSObjectType t1, PSObjectType t2) { - if (stack[sp].type != t1 && stack[sp].type != t2) { - error(-1, "Type mismatch in PostScript function"); - return gFalse; - } - return gTrue; -} - -void PSStack::pushBool(GBool booln) { - if (checkOverflow()) { - stack[--sp].type = psBool; - stack[sp].booln = booln; - } -} - -void PSStack::pushInt(int intg) { - if (checkOverflow()) { - stack[--sp].type = psInt; - stack[sp].intg = intg; - } -} - -void PSStack::pushReal(double real) { - if (checkOverflow()) { - stack[--sp].type = psReal; - stack[sp].real = real; - } -} - -GBool PSStack::popBool() { - if (checkUnderflow() && checkType(psBool, psBool)) { - return stack[sp++].booln; - } - return gFalse; -} - -int PSStack::popInt() { - if (checkUnderflow() && checkType(psInt, psInt)) { - return stack[sp++].intg; - } - return 0; -} - -double PSStack::popNum() { - double ret; - - if (checkUnderflow() && checkType(psInt, psReal)) { - ret = (stack[sp].type == psInt) ? (double)stack[sp].intg : stack[sp].real; - ++sp; - return ret; - } - return 0; -} - -void PSStack::copy(int n) { - int i; - - if (sp + n > psStackSize) { - error(-1, "Stack underflow in PostScript function"); - return; - } - if (!checkOverflow(n)) { - return; - } - for (i = sp + n - 1; i >= sp; --i) { - stack[i - n] = stack[i]; - } - sp -= n; -} - -void PSStack::roll(int n, int j) { - PSObject obj; - int i, k; - - if (j >= 0) { - j %= n; - } else { - j = -j % n; - if (j != 0) { - j = n - j; - } - } - if (n <= 0 || j == 0) { - return; - } - for (i = 0; i < j; ++i) { - obj = stack[sp]; - for (k = sp; k < sp + n - 1; ++k) { - stack[k] = stack[k+1]; - } - stack[sp + n - 1] = obj; - } -} - -void PSStack::index(int i) { - if (!checkOverflow()) { - return; - } - --sp; - stack[sp] = stack[sp + 1 + i]; -} - -void PSStack::pop() { - if (!checkUnderflow()) { - return; - } - ++sp; -} - -PostScriptFunction::PostScriptFunction(Object *funcObj, Dict *dict) { - Stream *str; - int codePtr; - GString *tok; - - code = NULL; - codeSize = 0; - ok = gFalse; - - //----- initialize the generic stuff - if (!init(dict)) { - goto err1; - } - if (!hasRange) { - error(-1, "Type 4 function is missing range"); - goto err1; - } - - //----- get the stream - if (!funcObj->isStream()) { - error(-1, "Type 4 function isn't a stream"); - goto err1; - } - str = funcObj->getStream(); - - //----- parse the function - codeString = new GString(); - str->reset(); - if (!(tok = getToken(str)) || tok->cmp("{")) { - error(-1, "Expected '{' at start of PostScript function"); - if (tok) { - delete tok; - } - goto err1; - } - delete tok; - codePtr = 0; - if (!parseCode(str, &codePtr)) { - goto err2; - } - str->close(); - - ok = gTrue; - - err2: - str->close(); - err1: - return; -} - -PostScriptFunction::PostScriptFunction(PostScriptFunction *func) { - memcpy(this, func, sizeof(PostScriptFunction)); - code = (PSObject *)gmallocn(codeSize, sizeof(PSObject)); - memcpy(code, func->code, codeSize * sizeof(PSObject)); - codeString = func->codeString->copy(); -} - -PostScriptFunction::~PostScriptFunction() { - gfree(code); - delete codeString; -} - -void PostScriptFunction::transform(double *in, double *out) { - PSStack *stack; - int i; - - stack = new PSStack(); - for (i = 0; i < m; ++i) { - //~ may need to check for integers here - stack->pushReal(in[i]); - } - exec(stack, 0); - for (i = n - 1; i >= 0; --i) { - out[i] = stack->popNum(); - if (out[i] < range[i][0]) { - out[i] = range[i][0]; - } else if (out[i] > range[i][1]) { - out[i] = range[i][1]; - } - } - // if (!stack->empty()) { - // error(-1, "Extra values on stack at end of PostScript function"); - // } - delete stack; -} - -GBool PostScriptFunction::parseCode(Stream *str, int *codePtr) { - GString *tok; - char *p; - GBool isReal; - int opPtr, elsePtr; - int a, b, mid, cmp; - - while (1) { - if (!(tok = getToken(str))) { - error(-1, "Unexpected end of PostScript function stream"); - return gFalse; - } - p = tok->getCString(); - if (isdigit(*p) || *p == '.' || *p == '-') { - isReal = gFalse; - for (++p; *p; ++p) { - if (*p == '.') { - isReal = gTrue; - break; - } - } - resizeCode(*codePtr); - if (isReal) { - code[*codePtr].type = psReal; - code[*codePtr].real = atof(tok->getCString()); - } else { - code[*codePtr].type = psInt; - code[*codePtr].intg = atoi(tok->getCString()); - } - ++*codePtr; - delete tok; - } else if (!tok->cmp("{")) { - delete tok; - opPtr = *codePtr; - *codePtr += 3; - resizeCode(opPtr + 2); - if (!parseCode(str, codePtr)) { - return gFalse; - } - if (!(tok = getToken(str))) { - error(-1, "Unexpected end of PostScript function stream"); - return gFalse; - } - if (!tok->cmp("{")) { - elsePtr = *codePtr; - if (!parseCode(str, codePtr)) { - return gFalse; - } - delete tok; - if (!(tok = getToken(str))) { - error(-1, "Unexpected end of PostScript function stream"); - return gFalse; - } - } else { - elsePtr = -1; - } - if (!tok->cmp("if")) { - if (elsePtr >= 0) { - error(-1, "Got 'if' operator with two blocks in PostScript function"); - return gFalse; - } - code[opPtr].type = psOperator; - code[opPtr].op = psOpIf; - code[opPtr+2].type = psBlock; - code[opPtr+2].blk = *codePtr; - } else if (!tok->cmp("ifelse")) { - if (elsePtr < 0) { - error(-1, "Got 'ifelse' operator with one blocks in PostScript function"); - return gFalse; - } - code[opPtr].type = psOperator; - code[opPtr].op = psOpIfelse; - code[opPtr+1].type = psBlock; - code[opPtr+1].blk = elsePtr; - code[opPtr+2].type = psBlock; - code[opPtr+2].blk = *codePtr; - } else { - error(-1, "Expected if/ifelse operator in PostScript function"); - delete tok; - return gFalse; - } - delete tok; - } else if (!tok->cmp("}")) { - delete tok; - resizeCode(*codePtr); - code[*codePtr].type = psOperator; - code[*codePtr].op = psOpReturn; - ++*codePtr; - break; - } else { - a = -1; - b = nPSOps; - // invariant: psOpNames[a] < tok < psOpNames[b] - while (b - a > 1) { - mid = (a + b) / 2; - cmp = tok->cmp(psOpNames[mid]); - if (cmp > 0) { - a = mid; - } else if (cmp < 0) { - b = mid; - } else { - a = b = mid; - } - } - if (cmp != 0) { - error(-1, "Unknown operator '%s' in PostScript function", - tok->getCString()); - delete tok; - return gFalse; - } - delete tok; - resizeCode(*codePtr); - code[*codePtr].type = psOperator; - code[*codePtr].op = (PSOp)a; - ++*codePtr; - } - } - return gTrue; -} - -GString *PostScriptFunction::getToken(Stream *str) { - GString *s; - int c; - GBool comment; - - s = new GString(); - comment = gFalse; - while (1) { - if ((c = str->getChar()) == EOF) { - break; - } - codeString->append(c); - if (comment) { - if (c == '\x0a' || c == '\x0d') { - comment = gFalse; - } - } else if (c == '%') { - comment = gTrue; - } else if (!isspace(c)) { - break; - } - } - if (c == '{' || c == '}') { - s->append((char)c); - } else if (isdigit(c) || c == '.' || c == '-') { - while (1) { - s->append((char)c); - c = str->lookChar(); - if (c == EOF || !(isdigit(c) || c == '.' || c == '-')) { - break; - } - str->getChar(); - codeString->append(c); - } - } else { - while (1) { - s->append((char)c); - c = str->lookChar(); - if (c == EOF || !isalnum(c)) { - break; - } - str->getChar(); - codeString->append(c); - } - } - return s; -} - -void PostScriptFunction::resizeCode(int newSize) { - if (newSize >= codeSize) { - codeSize += 64; - code = (PSObject *)greallocn(code, codeSize, sizeof(PSObject)); - } -} - -void PostScriptFunction::exec(PSStack *stack, int codePtr) { - int i1, i2; - double r1, r2; - GBool b1, b2; - - while (1) { - switch (code[codePtr].type) { - case psInt: - stack->pushInt(code[codePtr++].intg); - break; - case psReal: - stack->pushReal(code[codePtr++].real); - break; - case psOperator: - switch (code[codePtr++].op) { - case psOpAbs: - if (stack->topIsInt()) { - stack->pushInt(abs(stack->popInt())); - } else { - stack->pushReal(fabs(stack->popNum())); - } - break; - case psOpAdd: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushInt(i1 + i2); - } else { - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushReal(r1 + r2); - } - break; - case psOpAnd: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushInt(i1 & i2); - } else { - b2 = stack->popBool(); - b1 = stack->popBool(); - stack->pushBool(b1 && b2); - } - break; - case psOpAtan: - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushReal(atan2(r1, r2)); - break; - case psOpBitshift: - i2 = stack->popInt(); - i1 = stack->popInt(); - if (i2 > 0) { - stack->pushInt(i1 << i2); - } else if (i2 < 0) { - stack->pushInt((int)((Guint)i1 >> i2)); - } else { - stack->pushInt(i1); - } - break; - case psOpCeiling: - if (!stack->topIsInt()) { - stack->pushReal(ceil(stack->popNum())); - } - break; - case psOpCopy: - stack->copy(stack->popInt()); - break; - case psOpCos: - stack->pushReal(cos(stack->popNum())); - break; - case psOpCvi: - if (!stack->topIsInt()) { - stack->pushInt((int)stack->popNum()); - } - break; - case psOpCvr: - if (!stack->topIsReal()) { - stack->pushReal(stack->popNum()); - } - break; - case psOpDiv: - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushReal(r1 / r2); - break; - case psOpDup: - stack->copy(1); - break; - case psOpEq: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushBool(i1 == i2); - } else if (stack->topTwoAreNums()) { - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushBool(r1 == r2); - } else { - b2 = stack->popBool(); - b1 = stack->popBool(); - stack->pushBool(b1 == b2); - } - break; - case psOpExch: - stack->roll(2, 1); - break; - case psOpExp: - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushReal(pow(r1, r2)); - break; - case psOpFalse: - stack->pushBool(gFalse); - break; - case psOpFloor: - if (!stack->topIsInt()) { - stack->pushReal(floor(stack->popNum())); - } - break; - case psOpGe: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushBool(i1 >= i2); - } else { - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushBool(r1 >= r2); - } - break; - case psOpGt: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushBool(i1 > i2); - } else { - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushBool(r1 > r2); - } - break; - case psOpIdiv: - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushInt(i1 / i2); - break; - case psOpIndex: - stack->index(stack->popInt()); - break; - case psOpLe: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushBool(i1 <= i2); - } else { - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushBool(r1 <= r2); - } - break; - case psOpLn: - stack->pushReal(log(stack->popNum())); - break; - case psOpLog: - stack->pushReal(log10(stack->popNum())); - break; - case psOpLt: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushBool(i1 < i2); - } else { - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushBool(r1 < r2); - } - break; - case psOpMod: - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushInt(i1 % i2); - break; - case psOpMul: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - //~ should check for out-of-range, and push a real instead - stack->pushInt(i1 * i2); - } else { - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushReal(r1 * r2); - } - break; - case psOpNe: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushBool(i1 != i2); - } else if (stack->topTwoAreNums()) { - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushBool(r1 != r2); - } else { - b2 = stack->popBool(); - b1 = stack->popBool(); - stack->pushBool(b1 != b2); - } - break; - case psOpNeg: - if (stack->topIsInt()) { - stack->pushInt(-stack->popInt()); - } else { - stack->pushReal(-stack->popNum()); - } - break; - case psOpNot: - if (stack->topIsInt()) { - stack->pushInt(~stack->popInt()); - } else { - stack->pushBool(!stack->popBool()); - } - break; - case psOpOr: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushInt(i1 | i2); - } else { - b2 = stack->popBool(); - b1 = stack->popBool(); - stack->pushBool(b1 || b2); - } - break; - case psOpPop: - stack->pop(); - break; - case psOpRoll: - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->roll(i1, i2); - break; - case psOpRound: - if (!stack->topIsInt()) { - r1 = stack->popNum(); - stack->pushReal((r1 >= 0) ? floor(r1 + 0.5) : ceil(r1 - 0.5)); - } - break; - case psOpSin: - stack->pushReal(sin(stack->popNum())); - break; - case psOpSqrt: - stack->pushReal(sqrt(stack->popNum())); - break; - case psOpSub: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushInt(i1 - i2); - } else { - r2 = stack->popNum(); - r1 = stack->popNum(); - stack->pushReal(r1 - r2); - } - break; - case psOpTrue: - stack->pushBool(gTrue); - break; - case psOpTruncate: - if (!stack->topIsInt()) { - r1 = stack->popNum(); - stack->pushReal((r1 >= 0) ? floor(r1) : ceil(r1)); - } - break; - case psOpXor: - if (stack->topTwoAreInts()) { - i2 = stack->popInt(); - i1 = stack->popInt(); - stack->pushInt(i1 ^ i2); - } else { - b2 = stack->popBool(); - b1 = stack->popBool(); - stack->pushBool(b1 ^ b2); - } - break; - case psOpIf: - b1 = stack->popBool(); - if (b1) { - exec(stack, codePtr + 2); - } - codePtr = code[codePtr + 1].blk; - break; - case psOpIfelse: - b1 = stack->popBool(); - if (b1) { - exec(stack, codePtr + 2); - } else { - exec(stack, code[codePtr].blk); - } - codePtr = code[codePtr + 1].blk; - break; - case psOpReturn: - return; - } - break; - default: - error(-1, "Internal: bad object in PostScript function code"); - break; - } - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.h deleted file mode 100644 index 334a4390f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Function.h +++ /dev/null @@ -1,229 +0,0 @@ -//======================================================================== -// -// Function.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef FUNCTION_H -#define FUNCTION_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "Object.h" - -class Dict; -class Stream; -struct PSObject; -class PSStack; - -//------------------------------------------------------------------------ -// Function -//------------------------------------------------------------------------ - -#define funcMaxInputs 32 -#define funcMaxOutputs 32 -#define sampledFuncMaxInputs 16 - -class Function { -public: - - Function(); - - virtual ~Function(); - - // Construct a function. Returns NULL if unsuccessful. - static Function *parse(Object *funcObj); - - // Initialize the entries common to all function types. - GBool init(Dict *dict); - - virtual Function *copy() = 0; - - // Return the function type: - // -1 : identity - // 0 : sampled - // 2 : exponential - // 3 : stitching - // 4 : PostScript - virtual int getType() = 0; - - // Return size of input and output tuples. - int getInputSize() { return m; } - int getOutputSize() { return n; } - - double getDomainMin(int i) { return domain[i][0]; } - double getDomainMax(int i) { return domain[i][1]; } - double getRangeMin(int i) { return range[i][0]; } - double getRangeMax(int i) { return range[i][1]; } - GBool getHasRange() { return hasRange; } - - // Transform an input tuple into an output tuple. - virtual void transform(double *in, double *out) = 0; - - virtual GBool isOk() = 0; - -protected: - - int m, n; // size of input and output tuples - double // min and max values for function domain - domain[funcMaxInputs][2]; - double // min and max values for function range - range[funcMaxOutputs][2]; - GBool hasRange; // set if range is defined -}; - -//------------------------------------------------------------------------ -// IdentityFunction -//------------------------------------------------------------------------ - -class IdentityFunction: public Function { -public: - - IdentityFunction(); - virtual ~IdentityFunction(); - virtual Function *copy() { return new IdentityFunction(); } - virtual int getType() { return -1; } - virtual void transform(double *in, double *out); - virtual GBool isOk() { return gTrue; } - -private: -}; - -//------------------------------------------------------------------------ -// SampledFunction -//------------------------------------------------------------------------ - -class SampledFunction: public Function { -public: - - SampledFunction(Object *funcObj, Dict *dict); - virtual ~SampledFunction(); - virtual Function *copy() { return new SampledFunction(this); } - virtual int getType() { return 0; } - virtual void transform(double *in, double *out); - virtual GBool isOk() { return ok; } - - int getSampleSize(int i) { return sampleSize[i]; } - double getEncodeMin(int i) { return encode[i][0]; } - double getEncodeMax(int i) { return encode[i][1]; } - double getDecodeMin(int i) { return decode[i][0]; } - double getDecodeMax(int i) { return decode[i][1]; } - double *getSamples() { return samples; } - -private: - - SampledFunction(SampledFunction *func); - - int // number of samples for each domain element - sampleSize[funcMaxInputs]; - double // min and max values for domain encoder - encode[funcMaxInputs][2]; - double // min and max values for range decoder - decode[funcMaxOutputs][2]; - double // input multipliers - inputMul[funcMaxInputs]; - int idxMul[funcMaxInputs]; // sample array index multipliers - double *samples; // the samples - int nSamples; // size of the samples array - double *sBuf; // buffer for the transform function - GBool ok; -}; - -//------------------------------------------------------------------------ -// ExponentialFunction -//------------------------------------------------------------------------ - -class ExponentialFunction: public Function { -public: - - ExponentialFunction(Object *funcObj, Dict *dict); - virtual ~ExponentialFunction(); - virtual Function *copy() { return new ExponentialFunction(this); } - virtual int getType() { return 2; } - virtual void transform(double *in, double *out); - virtual GBool isOk() { return ok; } - - double *getC0() { return c0; } - double *getC1() { return c1; } - double getE() { return e; } - -private: - - ExponentialFunction(ExponentialFunction *func); - - double c0[funcMaxOutputs]; - double c1[funcMaxOutputs]; - double e; - GBool ok; -}; - -//------------------------------------------------------------------------ -// StitchingFunction -//------------------------------------------------------------------------ - -class StitchingFunction: public Function { -public: - - StitchingFunction(Object *funcObj, Dict *dict); - virtual ~StitchingFunction(); - virtual Function *copy() { return new StitchingFunction(this); } - virtual int getType() { return 3; } - virtual void transform(double *in, double *out); - virtual GBool isOk() { return ok; } - - int getNumFuncs() { return k; } - Function *getFunc(int i) { return funcs[i]; } - double *getBounds() { return bounds; } - double *getEncode() { return encode; } - double *getScale() { return scale; } - -private: - - StitchingFunction(StitchingFunction *func); - - int k; - Function **funcs; - double *bounds; - double *encode; - double *scale; - GBool ok; -}; - -//------------------------------------------------------------------------ -// PostScriptFunction -//------------------------------------------------------------------------ - -class PostScriptFunction: public Function { -public: - - PostScriptFunction(Object *funcObj, Dict *dict); - virtual ~PostScriptFunction(); - virtual Function *copy() { return new PostScriptFunction(this); } - virtual int getType() { return 4; } - virtual void transform(double *in, double *out); - virtual GBool isOk() { return ok; } - - GString *getCodeString() { return codeString; } - -private: - - PostScriptFunction(PostScriptFunction *func); - GBool parseCode(Stream *str, int *codePtr); - GString *getToken(Stream *str); - void resizeCode(int newSize); - void exec(PSStack *stack, int codePtr); - - GString *codeString; - PSObject *code; - int codeSize; - GBool ok; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.cc deleted file mode 100644 index b51a76430..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.cc +++ /dev/null @@ -1,380 +0,0 @@ -//======================================================================== -// -// GHash.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "gmem.h" -#include "GString.h" -#include "GHash.h" - -//------------------------------------------------------------------------ - -struct GHashBucket { - GString *key; - union { - void *p; - int i; - } val; - GHashBucket *next; -}; - -struct GHashIter { - int h; - GHashBucket *p; -}; - -//------------------------------------------------------------------------ - -GHash::GHash(GBool deleteKeysA) { - int h; - - deleteKeys = deleteKeysA; - size = 7; - tab = (GHashBucket **)gmallocn(size, sizeof(GHashBucket *)); - for (h = 0; h < size; ++h) { - tab[h] = NULL; - } - len = 0; -} - -GHash::~GHash() { - GHashBucket *p; - int h; - - for (h = 0; h < size; ++h) { - while (tab[h]) { - p = tab[h]; - tab[h] = p->next; - if (deleteKeys) { - delete p->key; - } - delete p; - } - } - gfree(tab); -} - -void GHash::add(GString *key, void *val) { - GHashBucket *p; - int h; - - // expand the table if necessary - if (len >= size) { - expand(); - } - - // add the new symbol - p = new GHashBucket; - p->key = key; - p->val.p = val; - h = hash(key); - p->next = tab[h]; - tab[h] = p; - ++len; -} - -void GHash::add(GString *key, int val) { - GHashBucket *p; - int h; - - // expand the table if necessary - if (len >= size) { - expand(); - } - - // add the new symbol - p = new GHashBucket; - p->key = key; - p->val.i = val; - h = hash(key); - p->next = tab[h]; - tab[h] = p; - ++len; -} - -void GHash::replace(GString *key, void *val) { - GHashBucket *p; - int h; - - if ((p = find(key, &h))) { - p->val.p = val; - delete key; - } else { - add(key, val); - } -} - -void GHash::replace(GString *key, int val) { - GHashBucket *p; - int h; - - if ((p = find(key, &h))) { - p->val.i = val; - delete key; - } else { - add(key, val); - } -} - -void *GHash::lookup(GString *key) { - GHashBucket *p; - int h; - - if (!(p = find(key, &h))) { - return NULL; - } - return p->val.p; -} - -int GHash::lookupInt(GString *key) { - GHashBucket *p; - int h; - - if (!(p = find(key, &h))) { - return 0; - } - return p->val.i; -} - -void *GHash::lookup(char *key) { - GHashBucket *p; - int h; - - if (!(p = find(key, &h))) { - return NULL; - } - return p->val.p; -} - -int GHash::lookupInt(char *key) { - GHashBucket *p; - int h; - - if (!(p = find(key, &h))) { - return 0; - } - return p->val.i; -} - -void *GHash::remove(GString *key) { - GHashBucket *p; - GHashBucket **q; - void *val; - int h; - - if (!(p = find(key, &h))) { - return NULL; - } - q = &tab[h]; - while (*q != p) { - q = &((*q)->next); - } - *q = p->next; - if (deleteKeys) { - delete p->key; - } - val = p->val.p; - delete p; - --len; - return val; -} - -int GHash::removeInt(GString *key) { - GHashBucket *p; - GHashBucket **q; - int val; - int h; - - if (!(p = find(key, &h))) { - return 0; - } - q = &tab[h]; - while (*q != p) { - q = &((*q)->next); - } - *q = p->next; - if (deleteKeys) { - delete p->key; - } - val = p->val.i; - delete p; - --len; - return val; -} - -void *GHash::remove(char *key) { - GHashBucket *p; - GHashBucket **q; - void *val; - int h; - - if (!(p = find(key, &h))) { - return NULL; - } - q = &tab[h]; - while (*q != p) { - q = &((*q)->next); - } - *q = p->next; - if (deleteKeys) { - delete p->key; - } - val = p->val.p; - delete p; - --len; - return val; -} - -int GHash::removeInt(char *key) { - GHashBucket *p; - GHashBucket **q; - int val; - int h; - - if (!(p = find(key, &h))) { - return 0; - } - q = &tab[h]; - while (*q != p) { - q = &((*q)->next); - } - *q = p->next; - if (deleteKeys) { - delete p->key; - } - val = p->val.i; - delete p; - --len; - return val; -} - -void GHash::startIter(GHashIter **iter) { - *iter = new GHashIter; - (*iter)->h = -1; - (*iter)->p = NULL; -} - -GBool GHash::getNext(GHashIter **iter, GString **key, void **val) { - if (!*iter) { - return gFalse; - } - if ((*iter)->p) { - (*iter)->p = (*iter)->p->next; - } - while (!(*iter)->p) { - if (++(*iter)->h == size) { - delete *iter; - *iter = NULL; - return gFalse; - } - (*iter)->p = tab[(*iter)->h]; - } - *key = (*iter)->p->key; - *val = (*iter)->p->val.p; - return gTrue; -} - -GBool GHash::getNext(GHashIter **iter, GString **key, int *val) { - if (!*iter) { - return gFalse; - } - if ((*iter)->p) { - (*iter)->p = (*iter)->p->next; - } - while (!(*iter)->p) { - if (++(*iter)->h == size) { - delete *iter; - *iter = NULL; - return gFalse; - } - (*iter)->p = tab[(*iter)->h]; - } - *key = (*iter)->p->key; - *val = (*iter)->p->val.i; - return gTrue; -} - -void GHash::killIter(GHashIter **iter) { - delete *iter; - *iter = NULL; -} - -void GHash::expand() { - GHashBucket **oldTab; - GHashBucket *p; - int oldSize, h, i; - - oldSize = size; - oldTab = tab; - size = 2*size + 1; - tab = (GHashBucket **)gmallocn(size, sizeof(GHashBucket *)); - for (h = 0; h < size; ++h) { - tab[h] = NULL; - } - for (i = 0; i < oldSize; ++i) { - while (oldTab[i]) { - p = oldTab[i]; - oldTab[i] = oldTab[i]->next; - h = hash(p->key); - p->next = tab[h]; - tab[h] = p; - } - } - gfree(oldTab); -} - -GHashBucket *GHash::find(GString *key, int *h) { - GHashBucket *p; - - *h = hash(key); - for (p = tab[*h]; p; p = p->next) { - if (!p->key->cmp(key)) { - return p; - } - } - return NULL; -} - -GHashBucket *GHash::find(char *key, int *h) { - GHashBucket *p; - - *h = hash(key); - for (p = tab[*h]; p; p = p->next) { - if (!p->key->cmp(key)) { - return p; - } - } - return NULL; -} - -int GHash::hash(GString *key) { - char *p; - unsigned int h; - int i; - - h = 0; - for (p = key->getCString(), i = 0; i < key->getLength(); ++p, ++i) { - h = 17 * h + (int)(*p & 0xff); - } - return (int)(h % size); -} - -int GHash::hash(char *key) { - char *p; - unsigned int h; - - h = 0; - for (p = key; *p; ++p) { - h = 17 * h + (int)(*p & 0xff); - } - return (int)(h % size); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.h deleted file mode 100644 index 31aba9325..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GHash.h +++ /dev/null @@ -1,78 +0,0 @@ -//======================================================================== -// -// GHash.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef GHASH_H -#define GHASH_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -class GString; -struct GHashBucket; -struct GHashIter; - -//------------------------------------------------------------------------ - -class GHash { -public: - - GHash(GBool deleteKeysA = gFalse); - ~GHash(); - void add(GString *key, void *val); - void add(GString *key, int val); - void replace(GString *key, void *val); - void replace(GString *key, int val); - void *lookup(GString *key); - int lookupInt(GString *key); - void *lookup(char *key); - int lookupInt(char *key); - void *remove(GString *key); - int removeInt(GString *key); - void *remove(char *key); - int removeInt(char *key); - int getLength() { return len; } - void startIter(GHashIter **iter); - GBool getNext(GHashIter **iter, GString **key, void **val); - GBool getNext(GHashIter **iter, GString **key, int *val); - void killIter(GHashIter **iter); - -private: - - void expand(); - GHashBucket *find(GString *key, int *h); - GHashBucket *find(char *key, int *h); - int hash(GString *key); - int hash(char *key); - - GBool deleteKeys; // set if key strings should be deleted - int size; // number of buckets - int len; // number of entries - GHashBucket **tab; -}; - -#define deleteGHash(hash, T) \ - do { \ - GHash *_hash = (hash); \ - { \ - GHashIter *_iter; \ - GString *_key; \ - void *_p; \ - _hash->startIter(&_iter); \ - while (_hash->getNext(&_iter, &_key, &_p)) { \ - delete (T*)_p; \ - } \ - delete _hash; \ - } \ - } while(0) - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.cc deleted file mode 100644 index fb5fd6284..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.cc +++ /dev/null @@ -1,97 +0,0 @@ -//======================================================================== -// -// GList.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "GList.h" - -//------------------------------------------------------------------------ -// GList -//------------------------------------------------------------------------ - -GList::GList() { - size = 8; - data = (void **)gmallocn(size, sizeof(void*)); - length = 0; - inc = 0; -} - -GList::GList(int sizeA) { - size = sizeA; - data = (void **)gmallocn(size, sizeof(void*)); - length = 0; - inc = 0; -} - -GList::~GList() { - gfree(data); -} - -void GList::append(void *p) { - if (length >= size) { - expand(); - } - data[length++] = p; -} - -void GList::append(GList *list) { - int i; - - while (length + list->length > size) { - expand(); - } - for (i = 0; i < list->length; ++i) { - data[length++] = list->data[i]; - } -} - -void GList::insert(int i, void *p) { - if (length >= size) { - expand(); - } - if (i < length) { - memmove(data+i+1, data+i, (length - i) * sizeof(void *)); - } - data[i] = p; - ++length; -} - -void *GList::del(int i) { - void *p; - - p = data[i]; - if (i < length - 1) { - memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *)); - } - --length; - if (size - length >= ((inc > 0) ? inc : size/2)) { - shrink(); - } - return p; -} - -void GList::sort(int (*cmp)(const void *obj1, const void *obj2)) { - qsort(data, length, sizeof(void *), cmp); -} - -void GList::expand() { - size += (inc > 0) ? inc : size; - data = (void **)greallocn(data, size, sizeof(void*)); -} - -void GList::shrink() { - size -= (inc > 0) ? inc : size/2; - data = (void **)greallocn(data, size, sizeof(void*)); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.h deleted file mode 100644 index e4d8ff8f1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GList.h +++ /dev/null @@ -1,96 +0,0 @@ -//======================================================================== -// -// GList.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef GLIST_H -#define GLIST_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -//------------------------------------------------------------------------ -// GList -//------------------------------------------------------------------------ - -class GList { -public: - - // Create an empty list. - GList(); - - // Create an empty list with space for elements. - GList(int sizeA); - - // Destructor - does not free pointed-to objects. - ~GList(); - - //----- general - - // Get the number of elements. - int getLength() { return length; } - - //----- ordered list support - - // Return the th element. - // Assumes 0 <= i < length. - void *get(int i) { return data[i]; } - - // Append an element to the end of the list. - void append(void *p); - - // Append another list to the end of this one. - void append(GList *list); - - // Insert an element at index . - // Assumes 0 <= i <= length. - void insert(int i, void *p); - - // Deletes and returns the element at index . - // Assumes 0 <= i < length. - void *del(int i); - - // Sort the list accoring to the given comparison function. - // NB: this sorts an array of pointers, so the pointer args need to - // be double-dereferenced. - void sort(int (*cmp)(const void *ptr1, const void *ptr2)); - - //----- control - - // Set allocation increment to . If inc > 0, that many - // elements will be allocated every time the list is expanded. - // If inc <= 0, the list will be doubled in size. - void setAllocIncr(int incA) { inc = incA; } - -private: - - void expand(); - void shrink(); - - void **data; // the list elements - int size; // size of data array - int length; // number of elements on list - int inc; // allocation increment -}; - -#define deleteGList(list, T) \ - do { \ - GList *_list = (list); \ - { \ - int _i; \ - for (_i = 0; _i < _list->getLength(); ++_i) { \ - delete (T*)_list->get(_i); \ - } \ - delete _list; \ - } \ - } while (0) - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GMutex.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GMutex.h deleted file mode 100644 index 7fa93d85e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GMutex.h +++ /dev/null @@ -1,49 +0,0 @@ -//======================================================================== -// -// GMutex.h -// -// Portable mutex macros. -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef GMUTEX_H -#define GMUTEX_H - -// Usage: -// -// GMutex m; -// gInitMutex(&m); -// ... -// gLockMutex(&m); -// ... critical section ... -// gUnlockMutex(&m); -// ... -// gDestroyMutex(&m); - -#ifdef WIN32 - -#include - -typedef CRITICAL_SECTION GMutex; - -#define gInitMutex(m) InitializeCriticalSection(m) -#define gDestroyMutex(m) DeleteCriticalSection(m) -#define gLockMutex(m) EnterCriticalSection(m) -#define gUnlockMutex(m) LeaveCriticalSection(m) - -#else // assume pthreads - -#include - -typedef pthread_mutex_t GMutex; - -#define gInitMutex(m) pthread_mutex_init(m, NULL) -#define gDestroyMutex(m) pthread_mutex_destroy(m) -#define gLockMutex(m) pthread_mutex_lock(m) -#define gUnlockMutex(m) pthread_mutex_unlock(m) - -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.cc deleted file mode 100644 index e21fd3ea6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.cc +++ /dev/null @@ -1,718 +0,0 @@ -//======================================================================== -// -// GString.cc -// -// Simple variable-length string type. -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#include -#include "gmem.h" -#include "GString.h" - -//------------------------------------------------------------------------ - -union GStringFormatArg { - int i; - Guint ui; - long l; - Gulong ul; - double f; - char c; - char *s; - GString *gs; -}; - -enum GStringFormatType { - fmtIntDecimal, - fmtIntHex, - fmtIntOctal, - fmtIntBinary, - fmtUIntDecimal, - fmtUIntHex, - fmtUIntOctal, - fmtUIntBinary, - fmtLongDecimal, - fmtLongHex, - fmtLongOctal, - fmtLongBinary, - fmtULongDecimal, - fmtULongHex, - fmtULongOctal, - fmtULongBinary, - fmtDouble, - fmtDoubleTrim, - fmtChar, - fmtString, - fmtGString, - fmtSpace -}; - -static char *formatStrings[] = { - "d", "x", "o", "b", "ud", "ux", "uo", "ub", - "ld", "lx", "lo", "lb", "uld", "ulx", "ulo", "ulb", - "f", "g", - "c", - "s", - "t", - "w", - NULL -}; - -//------------------------------------------------------------------------ - -static inline int size(int len) { - int delta; - for (delta = 8; delta < len && delta < 0x100000; delta <<= 1) ; - // this is ((len + 1) + (delta - 1)) & ~(delta - 1) - return (len + delta) & ~(delta - 1); -} - -inline void GString::resize(int length1) { - char *s1; - - if (!s) { - s = new char[size(length1)]; - } else if (size(length1) != size(length)) { - s1 = new char[size(length1)]; - if (length1 < length) { - memcpy(s1, s, length1); - s1[length1] = '\0'; - } else { - memcpy(s1, s, length + 1); - } - delete[] s; - s = s1; - } -} - -GString::GString() { - s = NULL; - resize(length = 0); - s[0] = '\0'; -} - -GString::GString(const char *sA) { - int n = strlen(sA); - - s = NULL; - resize(length = n); - memcpy(s, sA, n + 1); -} - -GString::GString(const char *sA, int lengthA) { - s = NULL; - resize(length = lengthA); - memcpy(s, sA, length * sizeof(char)); - s[length] = '\0'; -} - -GString::GString(GString *str, int idx, int lengthA) { - s = NULL; - resize(length = lengthA); - memcpy(s, str->getCString() + idx, length); - s[length] = '\0'; -} - -GString::GString(GString *str) { - s = NULL; - resize(length = str->getLength()); - memcpy(s, str->getCString(), length + 1); -} - -GString::GString(GString *str1, GString *str2) { - int n1 = str1->getLength(); - int n2 = str2->getLength(); - - s = NULL; - resize(length = n1 + n2); - memcpy(s, str1->getCString(), n1); - memcpy(s + n1, str2->getCString(), n2 + 1); -} - -GString *GString::fromInt(int x) { - char buf[24]; // enough space for 64-bit ints plus a little extra - char *p; - int len; - - formatInt(x, buf, sizeof(buf), gFalse, 0, 10, &p, &len); - return new GString(p, len); -} - -GString *GString::format(char *fmt, ...) { - va_list argList; - GString *s; - - s = new GString(); - va_start(argList, fmt); - s->appendfv(fmt, argList); - va_end(argList); - return s; -} - -GString *GString::formatv(char *fmt, va_list argList) { - GString *s; - - s = new GString(); - s->appendfv(fmt, argList); - return s; -} - -GString::~GString() { - delete[] s; -} - -GString *GString::clear() { - s[length = 0] = '\0'; - resize(0); - return this; -} - -GString *GString::append(char c) { - resize(length + 1); - s[length++] = c; - s[length] = '\0'; - return this; -} - -GString *GString::append(GString *str) { - int n = str->getLength(); - - resize(length + n); - memcpy(s + length, str->getCString(), n + 1); - length += n; - return this; -} - -GString *GString::append(const char *str) { - int n = strlen(str); - - resize(length + n); - memcpy(s + length, str, n + 1); - length += n; - return this; -} - -GString *GString::append(const char *str, int lengthA) { - resize(length + lengthA); - memcpy(s + length, str, lengthA); - length += lengthA; - s[length] = '\0'; - return this; -} - -GString *GString::appendf(char *fmt, ...) { - va_list argList; - - va_start(argList, fmt); - appendfv(fmt, argList); - va_end(argList); - return this; -} - -GString *GString::appendfv(char *fmt, va_list argList) { - GStringFormatArg *args; - int argsLen, argsSize; - GStringFormatArg arg; - int idx, width, prec; - GBool reverseAlign, zeroFill; - GStringFormatType ft; - char buf[65]; - int len, i; - char *p0, *p1, *str; - - argsLen = 0; - argsSize = 8; - args = (GStringFormatArg *)gmallocn(argsSize, sizeof(GStringFormatArg)); - - p0 = fmt; - while (*p0) { - if (*p0 == '{') { - ++p0; - if (*p0 == '{') { - ++p0; - append('{'); - } else { - - // parse the format string - if (!(*p0 >= '0' && *p0 <= '9')) { - break; - } - idx = *p0 - '0'; - for (++p0; *p0 >= '0' && *p0 <= '9'; ++p0) { - idx = 10 * idx + (*p0 - '0'); - } - if (*p0 != ':') { - break; - } - ++p0; - if (*p0 == '-') { - reverseAlign = gTrue; - ++p0; - } else { - reverseAlign = gFalse; - } - width = 0; - zeroFill = *p0 == '0'; - for (; *p0 >= '0' && *p0 <= '9'; ++p0) { - width = 10 * width + (*p0 - '0'); - } - if (*p0 == '.') { - ++p0; - prec = 0; - for (; *p0 >= '0' && *p0 <= '9'; ++p0) { - prec = 10 * prec + (*p0 - '0'); - } - } else { - prec = 0; - } - for (ft = (GStringFormatType)0; - formatStrings[ft]; - ft = (GStringFormatType)(ft + 1)) { - if (!strncmp(p0, formatStrings[ft], strlen(formatStrings[ft]))) { - break; - } - } - if (!formatStrings[ft]) { - break; - } - p0 += strlen(formatStrings[ft]); - if (*p0 != '}') { - break; - } - ++p0; - - // fetch the argument - if (idx > argsLen) { - break; - } - if (idx == argsLen) { - if (argsLen == argsSize) { - argsSize *= 2; - args = (GStringFormatArg *)greallocn(args, argsSize, - sizeof(GStringFormatArg)); - } - switch (ft) { - case fmtIntDecimal: - case fmtIntHex: - case fmtIntOctal: - case fmtIntBinary: - case fmtSpace: - args[argsLen].i = va_arg(argList, int); - break; - case fmtUIntDecimal: - case fmtUIntHex: - case fmtUIntOctal: - case fmtUIntBinary: - args[argsLen].ui = va_arg(argList, Guint); - break; - case fmtLongDecimal: - case fmtLongHex: - case fmtLongOctal: - case fmtLongBinary: - args[argsLen].l = va_arg(argList, long); - break; - case fmtULongDecimal: - case fmtULongHex: - case fmtULongOctal: - case fmtULongBinary: - args[argsLen].ul = va_arg(argList, Gulong); - break; - case fmtDouble: - case fmtDoubleTrim: - args[argsLen].f = va_arg(argList, double); - break; - case fmtChar: - args[argsLen].c = (char)va_arg(argList, int); - break; - case fmtString: - args[argsLen].s = va_arg(argList, char *); - break; - case fmtGString: - args[argsLen].gs = va_arg(argList, GString *); - break; - } - ++argsLen; - } - - // format the argument - arg = args[idx]; - switch (ft) { - case fmtIntDecimal: - formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 10, &str, &len); - break; - case fmtIntHex: - formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 16, &str, &len); - break; - case fmtIntOctal: - formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 8, &str, &len); - break; - case fmtIntBinary: - formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 2, &str, &len); - break; - case fmtUIntDecimal: - formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 10, - &str, &len); - break; - case fmtUIntHex: - formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 16, - &str, &len); - break; - case fmtUIntOctal: - formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 8, &str, &len); - break; - case fmtUIntBinary: - formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 2, &str, &len); - break; - case fmtLongDecimal: - formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 10, &str, &len); - break; - case fmtLongHex: - formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 16, &str, &len); - break; - case fmtLongOctal: - formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 8, &str, &len); - break; - case fmtLongBinary: - formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 2, &str, &len); - break; - case fmtULongDecimal: - formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 10, - &str, &len); - break; - case fmtULongHex: - formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 16, - &str, &len); - break; - case fmtULongOctal: - formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 8, &str, &len); - break; - case fmtULongBinary: - formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 2, &str, &len); - break; - case fmtDouble: - formatDouble(arg.f, buf, sizeof(buf), prec, gFalse, &str, &len); - break; - case fmtDoubleTrim: - formatDouble(arg.f, buf, sizeof(buf), prec, gTrue, &str, &len); - break; - case fmtChar: - buf[0] = arg.c; - str = buf; - len = 1; - reverseAlign = !reverseAlign; - break; - case fmtString: - str = arg.s; - len = strlen(str); - reverseAlign = !reverseAlign; - break; - case fmtGString: - str = arg.gs->getCString(); - len = arg.gs->getLength(); - reverseAlign = !reverseAlign; - break; - case fmtSpace: - str = buf; - len = 0; - width = arg.i; - break; - } - - // append the formatted arg, handling width and alignment - if (!reverseAlign && len < width) { - for (i = len; i < width; ++i) { - append(' '); - } - } - append(str, len); - if (reverseAlign && len < width) { - for (i = len; i < width; ++i) { - append(' '); - } - } - } - - } else if (*p0 == '}') { - ++p0; - if (*p0 == '}') { - ++p0; - } - append('}'); - - } else { - for (p1 = p0 + 1; *p1 && *p1 != '{' && *p1 != '}'; ++p1) ; - append(p0, p1 - p0); - p0 = p1; - } - } - - gfree(args); - return this; -} - -void GString::formatInt(long x, char *buf, int bufSize, - GBool zeroFill, int width, int base, - char **p, int *len) { - static char vals[17] = "0123456789abcdef"; - GBool neg; - int start, i, j; - - i = bufSize; - if ((neg = x < 0)) { - x = -x; - } - start = neg ? 1 : 0; - if (x == 0) { - buf[--i] = '0'; - } else { - while (i > start && x) { - buf[--i] = vals[x % base]; - x /= base; - } - } - if (zeroFill) { - for (j = bufSize - i; i > start && j < width - start; ++j) { - buf[--i] = '0'; - } - } - if (neg) { - buf[--i] = '-'; - } - *p = buf + i; - *len = bufSize - i; -} - -void GString::formatUInt(Gulong x, char *buf, int bufSize, - GBool zeroFill, int width, int base, - char **p, int *len) { - static char vals[17] = "0123456789abcdef"; - int i, j; - - i = bufSize; - if (x == 0) { - buf[--i] = '0'; - } else { - while (i > 0 && x) { - buf[--i] = vals[x % base]; - x /= base; - } - } - if (zeroFill) { - for (j = bufSize - i; i > 0 && j < width; ++j) { - buf[--i] = '0'; - } - } - *p = buf + i; - *len = bufSize - i; -} - -void GString::formatDouble(double x, char *buf, int bufSize, int prec, - GBool trim, char **p, int *len) { - GBool neg, started; - double x2; - int d, i, j; - - if ((neg = x < 0)) { - x = -x; - } - x = floor(x * pow(10, prec) + 0.5); - i = bufSize; - started = !trim; - for (j = 0; j < prec && i > 1; ++j) { - x2 = floor(0.1 * (x + 0.5)); - d = (int)floor(x - 10 * x2 + 0.5); - if (started || d != 0) { - buf[--i] = '0' + d; - started = gTrue; - } - x = x2; - } - if (i > 1 && started) { - buf[--i] = '.'; - } - if (i > 1) { - do { - x2 = floor(0.1 * (x + 0.5)); - d = (int)floor(x - 10 * x2 + 0.5); - buf[--i] = '0' + d; - x = x2; - } while (i > 1 && x); - } - if (neg) { - buf[--i] = '-'; - } - *p = buf + i; - *len = bufSize - i; -} - -GString *GString::insert(int i, char c) { - int j; - - resize(length + 1); - for (j = length + 1; j > i; --j) - s[j] = s[j-1]; - s[i] = c; - ++length; - return this; -} - -GString *GString::insert(int i, GString *str) { - int n = str->getLength(); - int j; - - resize(length + n); - for (j = length; j >= i; --j) - s[j+n] = s[j]; - memcpy(s+i, str->getCString(), n); - length += n; - return this; -} - -GString *GString::insert(int i, const char *str) { - int n = strlen(str); - int j; - - resize(length + n); - for (j = length; j >= i; --j) - s[j+n] = s[j]; - memcpy(s+i, str, n); - length += n; - return this; -} - -GString *GString::insert(int i, const char *str, int lengthA) { - int j; - - resize(length + lengthA); - for (j = length; j >= i; --j) - s[j+lengthA] = s[j]; - memcpy(s+i, str, lengthA); - length += lengthA; - return this; -} - -GString *GString::del(int i, int n) { - int j; - - if (n > 0) { - if (i + n > length) { - n = length - i; - } - for (j = i; j <= length - n; ++j) { - s[j] = s[j + n]; - } - resize(length -= n); - } - return this; -} - -GString *GString::upperCase() { - int i; - - for (i = 0; i < length; ++i) { - if (islower(s[i])) - s[i] = toupper(s[i]); - } - return this; -} - -GString *GString::lowerCase() { - int i; - - for (i = 0; i < length; ++i) { - if (isupper(s[i])) - s[i] = tolower(s[i]); - } - return this; -} - -int GString::cmp(GString *str) { - int n1, n2, i, x; - char *p1, *p2; - - n1 = length; - n2 = str->length; - for (i = 0, p1 = s, p2 = str->s; i < n1 && i < n2; ++i, ++p1, ++p2) { - x = *p1 - *p2; - if (x != 0) { - return x; - } - } - return n1 - n2; -} - -int GString::cmpN(GString *str, int n) { - int n1, n2, i, x; - char *p1, *p2; - - n1 = length; - n2 = str->length; - for (i = 0, p1 = s, p2 = str->s; - i < n1 && i < n2 && i < n; - ++i, ++p1, ++p2) { - x = *p1 - *p2; - if (x != 0) { - return x; - } - } - if (i == n) { - return 0; - } - return n1 - n2; -} - -int GString::cmp(const char *sA) { - int n1, i, x; - const char *p1, *p2; - - n1 = length; - for (i = 0, p1 = s, p2 = sA; i < n1 && *p2; ++i, ++p1, ++p2) { - x = *p1 - *p2; - if (x != 0) { - return x; - } - } - if (i < n1) { - return 1; - } - if (*p2) { - return -1; - } - return 0; -} - -int GString::cmpN(const char *sA, int n) { - int n1, i, x; - const char *p1, *p2; - - n1 = length; - for (i = 0, p1 = s, p2 = sA; i < n1 && *p2 && i < n; ++i, ++p1, ++p2) { - x = *p1 - *p2; - if (x != 0) { - return x; - } - } - if (i == n) { - return 0; - } - if (i < n1) { - return 1; - } - if (*p2) { - return -1; - } - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.h deleted file mode 100644 index dd22e2d8f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GString.h +++ /dev/null @@ -1,136 +0,0 @@ -//======================================================================== -// -// GString.h -// -// Simple variable-length string type. -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef GSTRING_H -#define GSTRING_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include "gtypes.h" - -class GString { -public: - - // Create an empty string. - GString(); - - // Create a string from a C string. - GString(const char *sA); - - // Create a string from chars at . This string - // can contain null characters. - GString(const char *sA, int lengthA); - - // Create a string from chars at in . - GString(GString *str, int idx, int lengthA); - - // Copy a string. - GString(GString *str); - GString *copy() { return new GString(this); } - - // Concatenate two strings. - GString(GString *str1, GString *str2); - - // Convert an integer to a string. - static GString *fromInt(int x); - - // Create a formatted string. Similar to printf, but without the - // string overflow issues. Formatting elements consist of: - // {:[][.]} - // where: - // - is the argument number (arg 0 is the first argument - // following the format string) -- NB: args must be first used in - // order; they can be reused in any order - // - is the field width -- negative to reverse the alignment; - // starting with a leading zero to zero-fill (for integers) - // - is the number of digits to the right of the decimal - // point (for floating point numbers) - // - is one of: - // d, x, o, b -- int in decimal, hex, octal, binary - // ud, ux, uo, ub -- unsigned int - // ld, lx, lo, lb, uld, ulx, ulo, ulb -- long, unsigned long - // f, g -- double - // c -- char - // s -- string (char *) - // t -- GString * - // w -- blank space; arg determines width - // To get literal curly braces, use {{ or }}. - static GString *format(char *fmt, ...); - static GString *formatv(char *fmt, va_list argList); - - // Destructor. - ~GString(); - - // Get length. - int getLength() { return length; } - - // Get C string. - char *getCString() { return s; } - - // Get th character. - char getChar(int i) { return s[i]; } - - // Change th character. - void setChar(int i, char c) { s[i] = c; } - - // Clear string to zero length. - GString *clear(); - - // Append a character or string. - GString *append(char c); - GString *append(GString *str); - GString *append(const char *str); - GString *append(const char *str, int lengthA); - - // Append a formatted string. - GString *appendf(char *fmt, ...); - GString *appendfv(char *fmt, va_list argList); - - // Insert a character or string. - GString *insert(int i, char c); - GString *insert(int i, GString *str); - GString *insert(int i, const char *str); - GString *insert(int i, const char *str, int lengthA); - - // Delete a character or range of characters. - GString *del(int i, int n = 1); - - // Convert string to all-upper/all-lower case. - GString *upperCase(); - GString *lowerCase(); - - // Compare two strings: -1:< 0:= +1:> - int cmp(GString *str); - int cmpN(GString *str, int n); - int cmp(const char *sA); - int cmpN(const char *sA, int n); - -private: - - int length; - char *s; - - void resize(int length1); - static void formatInt(long x, char *buf, int bufSize, - GBool zeroFill, int width, int base, - char **p, int *len); - static void formatUInt(Gulong x, char *buf, int bufSize, - GBool zeroFill, int width, int base, - char **p, int *len); - static void formatDouble(double x, char *buf, int bufSize, int prec, - GBool trim, char **p, int *len); -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.cc deleted file mode 100644 index 6bc6add8d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.cc +++ /dev/null @@ -1,4197 +0,0 @@ -//======================================================================== -// -// Gfx.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#include -#include "gmem.h" -#include "GlobalParams.h" -#include "CharTypes.h" -#include "Object.h" -#include "Array.h" -#include "Dict.h" -#include "Stream.h" -#include "Lexer.h" -#include "Parser.h" -#include "GfxFont.h" -#include "GfxState.h" -#include "OutputDev.h" -#include "Page.h" -#include "Annot.h" -#include "Error.h" -#include "Gfx.h" - -// the MSVC math.h doesn't define this -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -//------------------------------------------------------------------------ -// constants -//------------------------------------------------------------------------ - -// Max recursive depth for a function shading fill. -#define functionMaxDepth 6 - -// Max delta allowed in any color component for a function shading fill. -#define functionColorDelta (dblToCol(1 / 256.0)) - -// Max number of splits along the t axis for an axial shading fill. -#define axialMaxSplits 256 - -// Max delta allowed in any color component for an axial shading fill. -#define axialColorDelta (dblToCol(1 / 256.0)) - -// Max number of splits along the t axis for a radial shading fill. -#define radialMaxSplits 256 - -// Max delta allowed in any color component for a radial shading fill. -#define radialColorDelta (dblToCol(1 / 256.0)) - -// Max recursive depth for a Gouraud triangle shading fill. -#define gouraudMaxDepth 6 - -// Max delta allowed in any color component for a Gouraud triangle -// shading fill. -#define gouraudColorDelta (dblToCol(1 / 256.0)) - -// Max recursive depth for a patch mesh shading fill. -#define patchMaxDepth 6 - -// Max delta allowed in any color component for a patch mesh shading -// fill. -#define patchColorDelta (dblToCol(1 / 256.0)) - -//------------------------------------------------------------------------ -// Operator table -//------------------------------------------------------------------------ - -#ifdef WIN32 // this works around a bug in the VC7 compiler -# pragma optimize("",off) -#endif - -Operator Gfx::opTab[] = { - {"\"", 3, {tchkNum, tchkNum, tchkString}, - &Gfx::opMoveSetShowText}, - {"'", 1, {tchkString}, - &Gfx::opMoveShowText}, - {"B", 0, {tchkNone}, - &Gfx::opFillStroke}, - {"B*", 0, {tchkNone}, - &Gfx::opEOFillStroke}, - {"BDC", 2, {tchkName, tchkProps}, - &Gfx::opBeginMarkedContent}, - {"BI", 0, {tchkNone}, - &Gfx::opBeginImage}, - {"BMC", 1, {tchkName}, - &Gfx::opBeginMarkedContent}, - {"BT", 0, {tchkNone}, - &Gfx::opBeginText}, - {"BX", 0, {tchkNone}, - &Gfx::opBeginIgnoreUndef}, - {"CS", 1, {tchkName}, - &Gfx::opSetStrokeColorSpace}, - {"DP", 2, {tchkName, tchkProps}, - &Gfx::opMarkPoint}, - {"Do", 1, {tchkName}, - &Gfx::opXObject}, - {"EI", 0, {tchkNone}, - &Gfx::opEndImage}, - {"EMC", 0, {tchkNone}, - &Gfx::opEndMarkedContent}, - {"ET", 0, {tchkNone}, - &Gfx::opEndText}, - {"EX", 0, {tchkNone}, - &Gfx::opEndIgnoreUndef}, - {"F", 0, {tchkNone}, - &Gfx::opFill}, - {"G", 1, {tchkNum}, - &Gfx::opSetStrokeGray}, - {"ID", 0, {tchkNone}, - &Gfx::opImageData}, - {"J", 1, {tchkInt}, - &Gfx::opSetLineCap}, - {"K", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, - &Gfx::opSetStrokeCMYKColor}, - {"M", 1, {tchkNum}, - &Gfx::opSetMiterLimit}, - {"MP", 1, {tchkName}, - &Gfx::opMarkPoint}, - {"Q", 0, {tchkNone}, - &Gfx::opRestore}, - {"RG", 3, {tchkNum, tchkNum, tchkNum}, - &Gfx::opSetStrokeRGBColor}, - {"S", 0, {tchkNone}, - &Gfx::opStroke}, - {"SC", -4, {tchkNum, tchkNum, tchkNum, tchkNum}, - &Gfx::opSetStrokeColor}, - {"SCN", -33, {tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN}, - &Gfx::opSetStrokeColorN}, - {"T*", 0, {tchkNone}, - &Gfx::opTextNextLine}, - {"TD", 2, {tchkNum, tchkNum}, - &Gfx::opTextMoveSet}, - {"TJ", 1, {tchkArray}, - &Gfx::opShowSpaceText}, - {"TL", 1, {tchkNum}, - &Gfx::opSetTextLeading}, - {"Tc", 1, {tchkNum}, - &Gfx::opSetCharSpacing}, - {"Td", 2, {tchkNum, tchkNum}, - &Gfx::opTextMove}, - {"Tf", 2, {tchkName, tchkNum}, - &Gfx::opSetFont}, - {"Tj", 1, {tchkString}, - &Gfx::opShowText}, - {"Tm", 6, {tchkNum, tchkNum, tchkNum, tchkNum, - tchkNum, tchkNum}, - &Gfx::opSetTextMatrix}, - {"Tr", 1, {tchkInt}, - &Gfx::opSetTextRender}, - {"Ts", 1, {tchkNum}, - &Gfx::opSetTextRise}, - {"Tw", 1, {tchkNum}, - &Gfx::opSetWordSpacing}, - {"Tz", 1, {tchkNum}, - &Gfx::opSetHorizScaling}, - {"W", 0, {tchkNone}, - &Gfx::opClip}, - {"W*", 0, {tchkNone}, - &Gfx::opEOClip}, - {"b", 0, {tchkNone}, - &Gfx::opCloseFillStroke}, - {"b*", 0, {tchkNone}, - &Gfx::opCloseEOFillStroke}, - {"c", 6, {tchkNum, tchkNum, tchkNum, tchkNum, - tchkNum, tchkNum}, - &Gfx::opCurveTo}, - {"cm", 6, {tchkNum, tchkNum, tchkNum, tchkNum, - tchkNum, tchkNum}, - &Gfx::opConcat}, - {"cs", 1, {tchkName}, - &Gfx::opSetFillColorSpace}, - {"d", 2, {tchkArray, tchkNum}, - &Gfx::opSetDash}, - {"d0", 2, {tchkNum, tchkNum}, - &Gfx::opSetCharWidth}, - {"d1", 6, {tchkNum, tchkNum, tchkNum, tchkNum, - tchkNum, tchkNum}, - &Gfx::opSetCacheDevice}, - {"f", 0, {tchkNone}, - &Gfx::opFill}, - {"f*", 0, {tchkNone}, - &Gfx::opEOFill}, - {"g", 1, {tchkNum}, - &Gfx::opSetFillGray}, - {"gs", 1, {tchkName}, - &Gfx::opSetExtGState}, - {"h", 0, {tchkNone}, - &Gfx::opClosePath}, - {"i", 1, {tchkNum}, - &Gfx::opSetFlat}, - {"j", 1, {tchkInt}, - &Gfx::opSetLineJoin}, - {"k", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, - &Gfx::opSetFillCMYKColor}, - {"l", 2, {tchkNum, tchkNum}, - &Gfx::opLineTo}, - {"m", 2, {tchkNum, tchkNum}, - &Gfx::opMoveTo}, - {"n", 0, {tchkNone}, - &Gfx::opEndPath}, - {"q", 0, {tchkNone}, - &Gfx::opSave}, - {"re", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, - &Gfx::opRectangle}, - {"rg", 3, {tchkNum, tchkNum, tchkNum}, - &Gfx::opSetFillRGBColor}, - {"ri", 1, {tchkName}, - &Gfx::opSetRenderingIntent}, - {"s", 0, {tchkNone}, - &Gfx::opCloseStroke}, - {"sc", -4, {tchkNum, tchkNum, tchkNum, tchkNum}, - &Gfx::opSetFillColor}, - {"scn", -33, {tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN, tchkSCN, tchkSCN, tchkSCN, - tchkSCN}, - &Gfx::opSetFillColorN}, - {"sh", 1, {tchkName}, - &Gfx::opShFill}, - {"v", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, - &Gfx::opCurveTo1}, - {"w", 1, {tchkNum}, - &Gfx::opSetLineWidth}, - {"y", 4, {tchkNum, tchkNum, tchkNum, tchkNum}, - &Gfx::opCurveTo2}, -}; - -#ifdef WIN32 // this works around a bug in the VC7 compiler -# pragma optimize("",on) -#endif - -#define numOps (sizeof(opTab) / sizeof(Operator)) - -//------------------------------------------------------------------------ -// GfxResources -//------------------------------------------------------------------------ - -GfxResources::GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA) { - Object obj1, obj2; - Ref r; - - if (resDict) { - - // build font dictionary - fonts = NULL; - resDict->lookupNF("Font", &obj1); - if (obj1.isRef()) { - obj1.fetch(xref, &obj2); - if (obj2.isDict()) { - r = obj1.getRef(); - fonts = new GfxFontDict(xref, &r, obj2.getDict()); - } - obj2.free(); - } else if (obj1.isDict()) { - fonts = new GfxFontDict(xref, NULL, obj1.getDict()); - } - obj1.free(); - - // get XObject dictionary - resDict->lookup("XObject", &xObjDict); - - // get color space dictionary - resDict->lookup("ColorSpace", &colorSpaceDict); - - // get pattern dictionary - resDict->lookup("Pattern", &patternDict); - - // get shading dictionary - resDict->lookup("Shading", &shadingDict); - - // get graphics state parameter dictionary - resDict->lookup("ExtGState", &gStateDict); - - } else { - fonts = NULL; - xObjDict.initNull(); - colorSpaceDict.initNull(); - patternDict.initNull(); - shadingDict.initNull(); - gStateDict.initNull(); - } - - next = nextA; -} - -GfxResources::~GfxResources() { - if (fonts) { - delete fonts; - } - xObjDict.free(); - colorSpaceDict.free(); - patternDict.free(); - shadingDict.free(); - gStateDict.free(); -} - -GfxFont *GfxResources::lookupFont(char *name) { - GfxFont *font; - GfxResources *resPtr; - - for (resPtr = this; resPtr; resPtr = resPtr->next) { - if (resPtr->fonts) { - if ((font = resPtr->fonts->lookup(name))) - return font; - } - } - error(-1, "Unknown font tag '%s'", name); - return NULL; -} - -GBool GfxResources::lookupXObject(char *name, Object *obj) { - GfxResources *resPtr; - - for (resPtr = this; resPtr; resPtr = resPtr->next) { - if (resPtr->xObjDict.isDict()) { - if (!resPtr->xObjDict.dictLookup(name, obj)->isNull()) - return gTrue; - obj->free(); - } - } - error(-1, "XObject '%s' is unknown", name); - return gFalse; -} - -GBool GfxResources::lookupXObjectNF(char *name, Object *obj) { - GfxResources *resPtr; - - for (resPtr = this; resPtr; resPtr = resPtr->next) { - if (resPtr->xObjDict.isDict()) { - if (!resPtr->xObjDict.dictLookupNF(name, obj)->isNull()) - return gTrue; - obj->free(); - } - } - error(-1, "XObject '%s' is unknown", name); - return gFalse; -} - -void GfxResources::lookupColorSpace(char *name, Object *obj) { - GfxResources *resPtr; - - for (resPtr = this; resPtr; resPtr = resPtr->next) { - if (resPtr->colorSpaceDict.isDict()) { - if (!resPtr->colorSpaceDict.dictLookup(name, obj)->isNull()) { - return; - } - obj->free(); - } - } - obj->initNull(); -} - -GfxPattern *GfxResources::lookupPattern(char *name) { - GfxResources *resPtr; - GfxPattern *pattern; - Object obj; - - for (resPtr = this; resPtr; resPtr = resPtr->next) { - if (resPtr->patternDict.isDict()) { - if (!resPtr->patternDict.dictLookup(name, &obj)->isNull()) { - pattern = GfxPattern::parse(&obj); - obj.free(); - return pattern; - } - obj.free(); - } - } - error(-1, "Unknown pattern '%s'", name); - return NULL; -} - -GfxShading *GfxResources::lookupShading(char *name) { - GfxResources *resPtr; - GfxShading *shading; - Object obj; - - for (resPtr = this; resPtr; resPtr = resPtr->next) { - if (resPtr->shadingDict.isDict()) { - if (!resPtr->shadingDict.dictLookup(name, &obj)->isNull()) { - shading = GfxShading::parse(&obj); - obj.free(); - return shading; - } - obj.free(); - } - } - error(-1, "Unknown shading '%s'", name); - return NULL; -} - -GBool GfxResources::lookupGState(char *name, Object *obj) { - GfxResources *resPtr; - - for (resPtr = this; resPtr; resPtr = resPtr->next) { - if (resPtr->gStateDict.isDict()) { - if (!resPtr->gStateDict.dictLookup(name, obj)->isNull()) { - return gTrue; - } - obj->free(); - } - } - error(-1, "ExtGState '%s' is unknown", name); - return gFalse; -} - -//------------------------------------------------------------------------ -// Gfx -//------------------------------------------------------------------------ - -Gfx::Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict, - double hDPI, double vDPI, PDFRectangle *box, - PDFRectangle *cropBox, int rotate, - GBool (*abortCheckCbkA)(void *data), - void *abortCheckCbkDataA) { - int i; - - xref = xrefA; - subPage = gFalse; - printCommands = globalParams->getPrintCommands(); - parser = NULL; - - // start the resource stack - res = new GfxResources(xref, resDict, NULL); - - // initialize - out = outA; - state = new GfxState(hDPI, vDPI, box, rotate, out->upsideDown()); - fontChanged = gFalse; - clip = clipNone; - ignoreUndef = 0; - out->startPage(pageNum, state); - out->setDefaultCTM(state->getCTM()); - out->updateAll(state); - for (i = 0; i < 6; ++i) { - baseMatrix[i] = state->getCTM()[i]; - } - formDepth = 0; - abortCheckCbk = abortCheckCbkA; - abortCheckCbkData = abortCheckCbkDataA; - - // set crop box -#ifdef XPDFEXE - if (cropBox) { - state->moveTo(cropBox->x1, cropBox->y1); - state->lineTo(cropBox->x2, cropBox->y1); - state->lineTo(cropBox->x2, cropBox->y2); - state->lineTo(cropBox->x1, cropBox->y2); - state->closePath(); - state->clip(); - out->clip(state); - state->clearPath(); - } -#endif -} - -Gfx::Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict, - PDFRectangle *box, PDFRectangle *cropBox, - GBool (*abortCheckCbkA)(void *data), - void *abortCheckCbkDataA) { - int i; - - xref = xrefA; - subPage = gTrue; - printCommands = globalParams->getPrintCommands(); - - // start the resource stack - res = new GfxResources(xref, resDict, NULL); - - // initialize - out = outA; - state = new GfxState(72, 72, box, 0, gFalse); - fontChanged = gFalse; - clip = clipNone; - ignoreUndef = 0; - for (i = 0; i < 6; ++i) { - baseMatrix[i] = state->getCTM()[i]; - } - formDepth = 0; - abortCheckCbk = abortCheckCbkA; - abortCheckCbkData = abortCheckCbkDataA; - - // set crop box - if (cropBox) { - state->moveTo(cropBox->x1, cropBox->y1); - state->lineTo(cropBox->x2, cropBox->y1); - state->lineTo(cropBox->x2, cropBox->y2); - state->lineTo(cropBox->x1, cropBox->y2); - state->closePath(); - state->clip(); - out->clip(state); - state->clearPath(); - } -} - -Gfx::~Gfx() { - while (state->hasSaves()) { - restoreState(); - } - if (!subPage) { - out->endPage(); - } - while (res) { - popResources(); - } - if (state) { - delete state; - } -} - -void Gfx::display(Object *obj, GBool topLevel) { - Object obj2; - int i; - - if (obj->isArray()) { - for (i = 0; i < obj->arrayGetLength(); ++i) { - obj->arrayGet(i, &obj2); - if (!obj2.isStream()) { - error(-1, "Weird page contents"); - obj2.free(); - return; - } - obj2.free(); - } - } else if (!obj->isStream()) { - error(-1, "Weird page contents"); - return; - } - parser = new Parser(xref, new Lexer(xref, obj), gFalse); - go(topLevel); - delete parser; - parser = NULL; -} - -void Gfx::go(GBool topLevel) { - Object obj; - Object args[maxArgs]; - int numArgs, i; - int lastAbortCheck; - - // scan a sequence of objects - updateLevel = lastAbortCheck = 0; - numArgs = 0; - parser->getObj(&obj); - while (!obj.isEOF()) { - - // got a command - execute it - if (obj.isCmd()) { - if (printCommands) { - obj.print(stdout); - for (i = 0; i < numArgs; ++i) { - printf(" "); - args[i].print(stdout); - } - printf("\n"); - fflush(stdout); - } - execOp(&obj, args, numArgs); - obj.free(); - for (i = 0; i < numArgs; ++i) - args[i].free(); - numArgs = 0; - - // periodically update display - if (++updateLevel >= 20000) { - out->dump(); - updateLevel = 0; - } - - // check for an abort - if (abortCheckCbk) { - if (updateLevel - lastAbortCheck > 10) { - if ((*abortCheckCbk)(abortCheckCbkData)) { - break; - } - lastAbortCheck = updateLevel; - } - } - - // got an argument - save it - } else if (numArgs < maxArgs) { - args[numArgs++] = obj; - - // too many arguments - something is wrong - } else { - error(getPos(), "Too many args in content stream"); - if (printCommands) { - printf("throwing away arg: "); - obj.print(stdout); - printf("\n"); - fflush(stdout); - } - obj.free(); - } - - // grab the next object - parser->getObj(&obj); - } - obj.free(); - - // args at end with no command - if (numArgs > 0) { - error(getPos(), "Leftover args in content stream"); - if (printCommands) { - printf("%d leftovers:", numArgs); - for (i = 0; i < numArgs; ++i) { - printf(" "); - args[i].print(stdout); - } - printf("\n"); - fflush(stdout); - } - for (i = 0; i < numArgs; ++i) - args[i].free(); - } - - // update display - if (topLevel && updateLevel > 0) { - out->dump(); - } -} - -void Gfx::execOp(Object *cmd, Object args[], int numArgs) { - Operator *op; - char *name; - Object *argPtr; - int i; - - // find operator - name = cmd->getCmd(); - if (!(op = findOp(name))) { - if (ignoreUndef == 0) - error(getPos(), "Unknown operator '%s'", name); - return; - } - - // type check args - argPtr = args; - if (op->numArgs >= 0) { - if (numArgs < op->numArgs) { - error(getPos(), "Too few (%d) args to '%s' operator", numArgs, name); - return; - } - if (numArgs > op->numArgs) { -#if 0 - error(getPos(), "Too many (%d) args to '%s' operator", numArgs, name); -#endif - argPtr += numArgs - op->numArgs; - numArgs = op->numArgs; - } - } else { - if (numArgs > -op->numArgs) { - error(getPos(), "Too many (%d) args to '%s' operator", - numArgs, name); - return; - } - } - for (i = 0; i < numArgs; ++i) { - if (!checkArg(&argPtr[i], op->tchk[i])) { - error(getPos(), "Arg #%d to '%s' operator is wrong type (%s)", - i, name, argPtr[i].getTypeName()); - return; - } - } - - // do it - (this->*op->func)(argPtr, numArgs); -} - -Operator *Gfx::findOp(char *name) { - int a, b, m, cmp; - - a = -1; - b = numOps; - // invariant: opTab[a] < name < opTab[b] - while (b - a > 1) { - m = (a + b) / 2; - cmp = strcmp(opTab[m].name, name); - if (cmp < 0) - a = m; - else if (cmp > 0) - b = m; - else - a = b = m; - } - if (cmp != 0) - return NULL; - return &opTab[a]; -} - -GBool Gfx::checkArg(Object *arg, TchkType type) { - switch (type) { - case tchkBool: return arg->isBool(); - case tchkInt: return arg->isInt(); - case tchkNum: return arg->isNum(); - case tchkString: return arg->isString(); - case tchkName: return arg->isName(); - case tchkArray: return arg->isArray(); - case tchkProps: return arg->isDict() || arg->isName(); - case tchkSCN: return arg->isNum() || arg->isName(); - case tchkNone: return gFalse; - } - return gFalse; -} - -int Gfx::getPos() { - return parser ? parser->getPos() : -1; -} - -//------------------------------------------------------------------------ -// graphics state operators -//------------------------------------------------------------------------ - -void Gfx::opSave(Object args[], int numArgs) { - saveState(); -} - -void Gfx::opRestore(Object args[], int numArgs) { - restoreState(); -} - -void Gfx::opConcat(Object args[], int numArgs) { - state->concatCTM(args[0].getNum(), args[1].getNum(), - args[2].getNum(), args[3].getNum(), - args[4].getNum(), args[5].getNum()); - out->updateCTM(state, args[0].getNum(), args[1].getNum(), - args[2].getNum(), args[3].getNum(), - args[4].getNum(), args[5].getNum()); - fontChanged = gTrue; -} - -void Gfx::opSetDash(Object args[], int numArgs) { - Array *a; - int length; - Object obj; - double *dash; - int i; - - a = args[0].getArray(); - length = a->getLength(); - if (length == 0) { - dash = NULL; - } else { - dash = (double *)gmallocn(length, sizeof(double)); - for (i = 0; i < length; ++i) { - dash[i] = a->get(i, &obj)->getNum(); - obj.free(); - } - } - state->setLineDash(dash, length, args[1].getNum()); - out->updateLineDash(state); -} - -void Gfx::opSetFlat(Object args[], int numArgs) { - state->setFlatness((int)args[0].getNum()); - out->updateFlatness(state); -} - -void Gfx::opSetLineJoin(Object args[], int numArgs) { - state->setLineJoin(args[0].getInt()); - out->updateLineJoin(state); -} - -void Gfx::opSetLineCap(Object args[], int numArgs) { - state->setLineCap(args[0].getInt()); - out->updateLineCap(state); -} - -void Gfx::opSetMiterLimit(Object args[], int numArgs) { - state->setMiterLimit(args[0].getNum()); - out->updateMiterLimit(state); -} - -void Gfx::opSetLineWidth(Object args[], int numArgs) { - state->setLineWidth(args[0].getNum()); - out->updateLineWidth(state); -} - -void Gfx::opSetExtGState(Object args[], int numArgs) { - Object obj1, obj2, obj3, obj4, obj5; - GfxBlendMode mode; - GBool haveFillOP; - Function *funcs[4]; - GfxColor backdropColor; - GBool haveBackdropColor; - GfxColorSpace *blendingColorSpace; - GBool alpha, isolated, knockout; - int i; - - if (!res->lookupGState(args[0].getName(), &obj1)) { - return; - } - if (!obj1.isDict()) { - error(getPos(), "ExtGState '%s' is wrong type", args[0].getName()); - obj1.free(); - return; - } - if (printCommands) { - printf(" gfx state dict: "); - obj1.print(); - printf("\n"); - } - - // transparency support: blend mode, fill/stroke opacity - if (!obj1.dictLookup("BM", &obj2)->isNull()) { - if (state->parseBlendMode(&obj2, &mode)) { - state->setBlendMode(mode); - out->updateBlendMode(state); - } else { - error(getPos(), "Invalid blend mode in ExtGState"); - } - } - obj2.free(); - if (obj1.dictLookup("ca", &obj2)->isNum()) { - state->setFillOpacity(obj2.getNum()); - out->updateFillOpacity(state); - } - obj2.free(); - if (obj1.dictLookup("CA", &obj2)->isNum()) { - state->setStrokeOpacity(obj2.getNum()); - out->updateStrokeOpacity(state); - } - obj2.free(); - - // fill/stroke overprint - if ((haveFillOP = (obj1.dictLookup("op", &obj2)->isBool()))) { - state->setFillOverprint(obj2.getBool()); - out->updateFillOverprint(state); - } - obj2.free(); - if (obj1.dictLookup("OP", &obj2)->isBool()) { - state->setStrokeOverprint(obj2.getBool()); - out->updateStrokeOverprint(state); - if (!haveFillOP) { - state->setFillOverprint(obj2.getBool()); - out->updateFillOverprint(state); - } - } - obj2.free(); - - // stroke adjust - if (obj1.dictLookup("SA", &obj2)->isBool()) { - state->setStrokeAdjust(obj2.getBool()); - out->updateStrokeAdjust(state); - } - obj2.free(); - - // transfer function - if (obj1.dictLookup("TR2", &obj2)->isNull()) { - obj2.free(); - obj1.dictLookup("TR", &obj2); - } - if (obj2.isName("Default") || - obj2.isName("Identity")) { - funcs[0] = funcs[1] = funcs[2] = funcs[3] = NULL; - state->setTransfer(funcs); - out->updateTransfer(state); - } else if (obj2.isArray() && obj2.arrayGetLength() == 4) { - for (i = 0; i < 4; ++i) { - obj2.arrayGet(i, &obj3); - funcs[i] = Function::parse(&obj3); - obj3.free(); - if (!funcs[i]) { - break; - } - } - if (i == 4) { - state->setTransfer(funcs); - out->updateTransfer(state); - } - } else if (obj2.isName() || obj2.isDict() || obj2.isStream()) { - if ((funcs[0] = Function::parse(&obj2))) { - funcs[1] = funcs[2] = funcs[3] = NULL; - state->setTransfer(funcs); - out->updateTransfer(state); - } - } else if (!obj2.isNull()) { - error(getPos(), "Invalid transfer function in ExtGState"); - } - obj2.free(); - - // soft mask - if (!obj1.dictLookup("SMask", &obj2)->isNull()) { - if (obj2.isName("None")) { - out->clearSoftMask(state); - } else if (obj2.isDict()) { - if (obj2.dictLookup("S", &obj3)->isName("Alpha")) { - alpha = gTrue; - } else { // "Luminosity" - alpha = gFalse; - } - obj3.free(); - funcs[0] = NULL; - if (!obj2.dictLookup("TR", &obj3)->isNull()) { - funcs[0] = Function::parse(&obj3); - if (funcs[0]->getInputSize() != 1 || - funcs[0]->getOutputSize() != 1) { - error(getPos(), - "Invalid transfer function in soft mask in ExtGState"); - delete funcs[0]; - funcs[0] = NULL; - } - } - obj3.free(); - if ((haveBackdropColor = obj2.dictLookup("BC", &obj3)->isArray())) { - for (i = 0; i < gfxColorMaxComps; ++i) { - backdropColor.c[i] = 0; - } - for (i = 0; i < obj3.arrayGetLength() && i < gfxColorMaxComps; ++i) { - obj3.arrayGet(i, &obj4); - if (obj4.isNum()) { - backdropColor.c[i] = dblToCol(obj4.getNum()); - } - obj4.free(); - } - } - obj3.free(); - if (obj2.dictLookup("G", &obj3)->isStream()) { - if (obj3.streamGetDict()->lookup("Group", &obj4)->isDict()) { - blendingColorSpace = NULL; - isolated = knockout = gFalse; - if (!obj4.dictLookup("CS", &obj5)->isNull()) { - blendingColorSpace = GfxColorSpace::parse(&obj5); - } - obj5.free(); - if (obj4.dictLookup("I", &obj5)->isBool()) { - isolated = obj5.getBool(); - } - obj5.free(); - if (obj4.dictLookup("K", &obj5)->isBool()) { - knockout = obj5.getBool(); - } - obj5.free(); - if (!haveBackdropColor) { - if (blendingColorSpace) { - blendingColorSpace->getDefaultColor(&backdropColor); - } else { - //~ need to get the parent or default color space (?) - for (i = 0; i < gfxColorMaxComps; ++i) { - backdropColor.c[i] = 0; - } - } - } - doSoftMask(&obj3, alpha, blendingColorSpace, - isolated, knockout, funcs[0], &backdropColor); - if (funcs[0]) { - delete funcs[0]; - } - } else { - error(getPos(), "Invalid soft mask in ExtGState - missing group"); - } - obj4.free(); - } else { - error(getPos(), "Invalid soft mask in ExtGState - missing group"); - } - obj3.free(); - } else if (!obj2.isNull()) { - error(getPos(), "Invalid soft mask in ExtGState"); - } - } - obj2.free(); - - obj1.free(); -} - -void Gfx::doSoftMask(Object *str, GBool alpha, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - Function *transferFunc, GfxColor *backdropColor) { - Dict *dict, *resDict; - double m[6], bbox[4]; - Object obj1, obj2; - int i; - - // check for excessive recursion - if (formDepth > 20) { - return; - } - - // get stream dict - dict = str->streamGetDict(); - - // check form type - dict->lookup("FormType", &obj1); - if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) { - error(getPos(), "Unknown form type"); - } - obj1.free(); - - // get bounding box - dict->lookup("BBox", &obj1); - if (!obj1.isArray()) { - obj1.free(); - error(getPos(), "Bad form bounding box"); - return; - } - for (i = 0; i < 4; ++i) { - obj1.arrayGet(i, &obj2); - bbox[i] = obj2.getNum(); - obj2.free(); - } - obj1.free(); - - // get matrix - dict->lookup("Matrix", &obj1); - if (obj1.isArray()) { - for (i = 0; i < 6; ++i) { - obj1.arrayGet(i, &obj2); - m[i] = obj2.getNum(); - obj2.free(); - } - } else { - m[0] = 1; m[1] = 0; - m[2] = 0; m[3] = 1; - m[4] = 0; m[5] = 0; - } - obj1.free(); - - // get resources - dict->lookup("Resources", &obj1); - resDict = obj1.isDict() ? obj1.getDict() : (Dict *)NULL; - - // draw it - ++formDepth; - doForm1(str, resDict, m, bbox, gTrue, gTrue, - blendingColorSpace, isolated, knockout, - alpha, transferFunc, backdropColor); - --formDepth; - - if (blendingColorSpace) { - delete blendingColorSpace; - } - obj1.free(); -} - -void Gfx::opSetRenderingIntent(Object args[], int numArgs) { -} - -//------------------------------------------------------------------------ -// color operators -//------------------------------------------------------------------------ - -void Gfx::opSetFillGray(Object args[], int numArgs) { - GfxColor color; - - state->setFillPattern(NULL); - state->setFillColorSpace(new GfxDeviceGrayColorSpace()); - out->updateFillColorSpace(state); - color.c[0] = dblToCol(args[0].getNum()); - state->setFillColor(&color); - out->updateFillColor(state); -} - -void Gfx::opSetStrokeGray(Object args[], int numArgs) { - GfxColor color; - - state->setStrokePattern(NULL); - state->setStrokeColorSpace(new GfxDeviceGrayColorSpace()); - out->updateStrokeColorSpace(state); - color.c[0] = dblToCol(args[0].getNum()); - state->setStrokeColor(&color); - out->updateStrokeColor(state); -} - -void Gfx::opSetFillCMYKColor(Object args[], int numArgs) { - GfxColor color; - int i; - - state->setFillPattern(NULL); - state->setFillColorSpace(new GfxDeviceCMYKColorSpace()); - out->updateFillColorSpace(state); - for (i = 0; i < 4; ++i) { - color.c[i] = dblToCol(args[i].getNum()); - } - state->setFillColor(&color); - out->updateFillColor(state); -} - -void Gfx::opSetStrokeCMYKColor(Object args[], int numArgs) { - GfxColor color; - int i; - - state->setStrokePattern(NULL); - state->setStrokeColorSpace(new GfxDeviceCMYKColorSpace()); - out->updateStrokeColorSpace(state); - for (i = 0; i < 4; ++i) { - color.c[i] = dblToCol(args[i].getNum()); - } - state->setStrokeColor(&color); - out->updateStrokeColor(state); -} - -void Gfx::opSetFillRGBColor(Object args[], int numArgs) { - GfxColor color; - int i; - - state->setFillPattern(NULL); - state->setFillColorSpace(new GfxDeviceRGBColorSpace()); - out->updateFillColorSpace(state); - for (i = 0; i < 3; ++i) { - color.c[i] = dblToCol(args[i].getNum()); - } - state->setFillColor(&color); - out->updateFillColor(state); -} - -void Gfx::opSetStrokeRGBColor(Object args[], int numArgs) { - GfxColor color; - int i; - - state->setStrokePattern(NULL); - state->setStrokeColorSpace(new GfxDeviceRGBColorSpace()); - out->updateStrokeColorSpace(state); - for (i = 0; i < 3; ++i) { - color.c[i] = dblToCol(args[i].getNum()); - } - state->setStrokeColor(&color); - out->updateStrokeColor(state); -} - -void Gfx::opSetFillColorSpace(Object args[], int numArgs) { - Object obj; - GfxColorSpace *colorSpace; - GfxColor color; - - state->setFillPattern(NULL); - res->lookupColorSpace(args[0].getName(), &obj); - if (obj.isNull()) { - colorSpace = GfxColorSpace::parse(&args[0]); - } else { - colorSpace = GfxColorSpace::parse(&obj); - } - obj.free(); - if (colorSpace) { - state->setFillColorSpace(colorSpace); - out->updateFillColorSpace(state); - colorSpace->getDefaultColor(&color); - state->setFillColor(&color); - out->updateFillColor(state); - } else { - error(getPos(), "Bad color space (fill)"); - } -} - -void Gfx::opSetStrokeColorSpace(Object args[], int numArgs) { - Object obj; - GfxColorSpace *colorSpace; - GfxColor color; - - state->setStrokePattern(NULL); - res->lookupColorSpace(args[0].getName(), &obj); - if (obj.isNull()) { - colorSpace = GfxColorSpace::parse(&args[0]); - } else { - colorSpace = GfxColorSpace::parse(&obj); - } - obj.free(); - if (colorSpace) { - state->setStrokeColorSpace(colorSpace); - out->updateStrokeColorSpace(state); - colorSpace->getDefaultColor(&color); - state->setStrokeColor(&color); - out->updateStrokeColor(state); - } else { - error(getPos(), "Bad color space (stroke)"); - } -} - -void Gfx::opSetFillColor(Object args[], int numArgs) { - GfxColor color; - int i; - - if (numArgs != state->getFillColorSpace()->getNComps()) { - error(getPos(), "Incorrect number of arguments in 'sc' command"); - return; - } - state->setFillPattern(NULL); - for (i = 0; i < numArgs; ++i) { - color.c[i] = dblToCol(args[i].getNum()); - } - state->setFillColor(&color); - out->updateFillColor(state); -} - -void Gfx::opSetStrokeColor(Object args[], int numArgs) { - GfxColor color; - int i; - - if (numArgs != state->getStrokeColorSpace()->getNComps()) { - error(getPos(), "Incorrect number of arguments in 'SC' command"); - return; - } - state->setStrokePattern(NULL); - for (i = 0; i < numArgs; ++i) { - color.c[i] = dblToCol(args[i].getNum()); - } - state->setStrokeColor(&color); - out->updateStrokeColor(state); -} - -void Gfx::opSetFillColorN(Object args[], int numArgs) { - GfxColor color; - GfxPattern *pattern; - int i; - - if (state->getFillColorSpace()->getMode() == csPattern) { - if (numArgs > 1) { - if (!((GfxPatternColorSpace *)state->getFillColorSpace())->getUnder() || - numArgs - 1 != ((GfxPatternColorSpace *)state->getFillColorSpace()) - ->getUnder()->getNComps()) { - error(getPos(), "Incorrect number of arguments in 'scn' command"); - return; - } - for (i = 0; i < numArgs - 1 && i < gfxColorMaxComps; ++i) { - if (args[i].isNum()) { - color.c[i] = dblToCol(args[i].getNum()); - } - } - state->setFillColor(&color); - out->updateFillColor(state); - } - if (args[numArgs-1].isName() && - (pattern = res->lookupPattern(args[numArgs-1].getName()))) { - state->setFillPattern(pattern); - } - - } else { - if (numArgs != state->getFillColorSpace()->getNComps()) { - error(getPos(), "Incorrect number of arguments in 'scn' command"); - return; - } - state->setFillPattern(NULL); - for (i = 0; i < numArgs && i < gfxColorMaxComps; ++i) { - if (args[i].isNum()) { - color.c[i] = dblToCol(args[i].getNum()); - } - } - state->setFillColor(&color); - out->updateFillColor(state); - } -} - -void Gfx::opSetStrokeColorN(Object args[], int numArgs) { - GfxColor color; - GfxPattern *pattern; - int i; - - if (state->getStrokeColorSpace()->getMode() == csPattern) { - if (numArgs > 1) { - if (!((GfxPatternColorSpace *)state->getStrokeColorSpace()) - ->getUnder() || - numArgs - 1 != ((GfxPatternColorSpace *)state->getStrokeColorSpace()) - ->getUnder()->getNComps()) { - error(getPos(), "Incorrect number of arguments in 'SCN' command"); - return; - } - for (i = 0; i < numArgs - 1 && i < gfxColorMaxComps; ++i) { - if (args[i].isNum()) { - color.c[i] = dblToCol(args[i].getNum()); - } - } - state->setStrokeColor(&color); - out->updateStrokeColor(state); - } - if (args[numArgs-1].isName() && - (pattern = res->lookupPattern(args[numArgs-1].getName()))) { - state->setStrokePattern(pattern); - } - - } else { - if (numArgs != state->getStrokeColorSpace()->getNComps()) { - error(getPos(), "Incorrect number of arguments in 'SCN' command"); - return; - } - state->setStrokePattern(NULL); - for (i = 0; i < numArgs && i < gfxColorMaxComps; ++i) { - if (args[i].isNum()) { - color.c[i] = dblToCol(args[i].getNum()); - } - } - state->setStrokeColor(&color); - out->updateStrokeColor(state); - } -} - -//------------------------------------------------------------------------ -// path segment operators -//------------------------------------------------------------------------ - -void Gfx::opMoveTo(Object args[], int numArgs) { - state->moveTo(args[0].getNum(), args[1].getNum()); -} - -void Gfx::opLineTo(Object args[], int numArgs) { - if (!state->isCurPt()) { - error(getPos(), "No current point in lineto"); - return; - } - state->lineTo(args[0].getNum(), args[1].getNum()); -} - -void Gfx::opCurveTo(Object args[], int numArgs) { - double x1, y1, x2, y2, x3, y3; - - if (!state->isCurPt()) { - error(getPos(), "No current point in curveto"); - return; - } - x1 = args[0].getNum(); - y1 = args[1].getNum(); - x2 = args[2].getNum(); - y2 = args[3].getNum(); - x3 = args[4].getNum(); - y3 = args[5].getNum(); - state->curveTo(x1, y1, x2, y2, x3, y3); -} - -void Gfx::opCurveTo1(Object args[], int numArgs) { - double x1, y1, x2, y2, x3, y3; - - if (!state->isCurPt()) { - error(getPos(), "No current point in curveto1"); - return; - } - x1 = state->getCurX(); - y1 = state->getCurY(); - x2 = args[0].getNum(); - y2 = args[1].getNum(); - x3 = args[2].getNum(); - y3 = args[3].getNum(); - state->curveTo(x1, y1, x2, y2, x3, y3); -} - -void Gfx::opCurveTo2(Object args[], int numArgs) { - double x1, y1, x2, y2, x3, y3; - - if (!state->isCurPt()) { - error(getPos(), "No current point in curveto2"); - return; - } - x1 = args[0].getNum(); - y1 = args[1].getNum(); - x2 = args[2].getNum(); - y2 = args[3].getNum(); - x3 = x2; - y3 = y2; - state->curveTo(x1, y1, x2, y2, x3, y3); -} - -void Gfx::opRectangle(Object args[], int numArgs) { - double x, y, w, h; - - x = args[0].getNum(); - y = args[1].getNum(); - w = args[2].getNum(); - h = args[3].getNum(); - state->moveTo(x, y); - state->lineTo(x + w, y); - state->lineTo(x + w, y + h); - state->lineTo(x, y + h); - state->closePath(); -} - -void Gfx::opClosePath(Object args[], int numArgs) { - if (!state->isCurPt()) { - error(getPos(), "No current point in closepath"); - return; - } - state->closePath(); -} - -//------------------------------------------------------------------------ -// path painting operators -//------------------------------------------------------------------------ - -void Gfx::opEndPath(Object args[], int numArgs) { - doEndPath(); -} - -void Gfx::opStroke(Object args[], int numArgs) { - if (!state->isCurPt()) { - //error(getPos(), "No path in stroke"); - return; - } - if (state->isPath()) { - if (state->getStrokeColorSpace()->getMode() == csPattern) { - doPatternStroke(); - } else { - out->stroke(state); - } - } - doEndPath(); -} - -void Gfx::opCloseStroke(Object args[], int numArgs) { - if (!state->isCurPt()) { - //error(getPos(), "No path in closepath/stroke"); - return; - } - if (state->isPath()) { - state->closePath(); - if (state->getStrokeColorSpace()->getMode() == csPattern) { - doPatternStroke(); - } else { - out->stroke(state); - } - } - doEndPath(); -} - -void Gfx::opFill(Object args[], int numArgs) { - if (!state->isCurPt()) { - //error(getPos(), "No path in fill"); - return; - } - if (state->isPath()) { - if (state->getFillColorSpace()->getMode() == csPattern) { - doPatternFill(gFalse); - } else { - out->fill(state); - } - } - doEndPath(); -} - -void Gfx::opEOFill(Object args[], int numArgs) { - if (!state->isCurPt()) { - //error(getPos(), "No path in eofill"); - return; - } - if (state->isPath()) { - if (state->getFillColorSpace()->getMode() == csPattern) { - doPatternFill(gTrue); - } else { - out->eoFill(state); - } - } - doEndPath(); -} - -void Gfx::opFillStroke(Object args[], int numArgs) { - if (!state->isCurPt()) { - //error(getPos(), "No path in fill/stroke"); - return; - } - if (state->isPath()) { - if (state->getFillColorSpace()->getMode() == csPattern) { - doPatternFill(gFalse); - } else { - out->fill(state); - } - if (state->getStrokeColorSpace()->getMode() == csPattern) { - doPatternStroke(); - } else { - out->stroke(state); - } - } - doEndPath(); -} - -void Gfx::opCloseFillStroke(Object args[], int numArgs) { - if (!state->isCurPt()) { - //error(getPos(), "No path in closepath/fill/stroke"); - return; - } - if (state->isPath()) { - state->closePath(); - if (state->getFillColorSpace()->getMode() == csPattern) { - doPatternFill(gFalse); - } else { - out->fill(state); - } - if (state->getStrokeColorSpace()->getMode() == csPattern) { - doPatternStroke(); - } else { - out->stroke(state); - } - } - doEndPath(); -} - -void Gfx::opEOFillStroke(Object args[], int numArgs) { - if (!state->isCurPt()) { - //error(getPos(), "No path in eofill/stroke"); - return; - } - if (state->isPath()) { - if (state->getFillColorSpace()->getMode() == csPattern) { - doPatternFill(gTrue); - } else { - out->eoFill(state); - } - if (state->getStrokeColorSpace()->getMode() == csPattern) { - doPatternStroke(); - } else { - out->stroke(state); - } - } - doEndPath(); -} - -void Gfx::opCloseEOFillStroke(Object args[], int numArgs) { - if (!state->isCurPt()) { - //error(getPos(), "No path in closepath/eofill/stroke"); - return; - } - if (state->isPath()) { - state->closePath(); - if (state->getFillColorSpace()->getMode() == csPattern) { - doPatternFill(gTrue); - } else { - out->eoFill(state); - } - if (state->getStrokeColorSpace()->getMode() == csPattern) { - doPatternStroke(); - } else { - out->stroke(state); - } - } - doEndPath(); -} - -void Gfx::doPatternFill(GBool eoFill) { - GfxPattern *pattern; - - // this is a bit of a kludge -- patterns can be really slow, so we - // skip them if we're only doing text extraction, since they almost - // certainly don't contain any text - if (!out->needNonText()) { - return; - } - - if (!(pattern = state->getFillPattern())) { - return; - } - switch (pattern->getType()) { - case 1: - doTilingPatternFill((GfxTilingPattern *)pattern, gFalse, eoFill); - break; - case 2: - doShadingPatternFill((GfxShadingPattern *)pattern, gFalse, eoFill); - break; - default: - error(getPos(), "Unimplemented pattern type (%d) in fill", - pattern->getType()); - break; - } -} - -void Gfx::doPatternStroke() { - GfxPattern *pattern; - - // this is a bit of a kludge -- patterns can be really slow, so we - // skip them if we're only doing text extraction, since they almost - // certainly don't contain any text - if (!out->needNonText()) { - return; - } - - if (!(pattern = state->getStrokePattern())) { - return; - } - switch (pattern->getType()) { - case 1: - doTilingPatternFill((GfxTilingPattern *)pattern, gTrue, gFalse); - break; - case 2: - doShadingPatternFill((GfxShadingPattern *)pattern, gTrue, gFalse); - break; - default: - error(getPos(), "Unimplemented pattern type (%d) in stroke", - pattern->getType()); - break; - } -} - -void Gfx::doTilingPatternFill(GfxTilingPattern *tPat, - GBool stroke, GBool eoFill) { - GfxPatternColorSpace *patCS; - GfxColorSpace *cs; - GfxPath *savedPath; - double xMin, yMin, xMax, yMax, x, y, x1, y1; - double cxMin, cyMin, cxMax, cyMax; - int xi0, yi0, xi1, yi1, xi, yi; - double *ctm, *btm, *ptm; - double m[6], ictm[6], m1[6], imb[6]; - double det; - double xstep, ystep; - int i; - - // get color space - patCS = (GfxPatternColorSpace *)(stroke ? state->getStrokeColorSpace() - : state->getFillColorSpace()); - - // construct a (pattern space) -> (current space) transform matrix - ctm = state->getCTM(); - btm = baseMatrix; - ptm = tPat->getMatrix(); - // iCTM = invert CTM - det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); - ictm[0] = ctm[3] * det; - ictm[1] = -ctm[1] * det; - ictm[2] = -ctm[2] * det; - ictm[3] = ctm[0] * det; - ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; - ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; - // m1 = PTM * BTM = PTM * base transform matrix - m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2]; - m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3]; - m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2]; - m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3]; - m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4]; - m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5]; - // m = m1 * iCTM = (PTM * BTM) * (iCTM) - m[0] = m1[0] * ictm[0] + m1[1] * ictm[2]; - m[1] = m1[0] * ictm[1] + m1[1] * ictm[3]; - m[2] = m1[2] * ictm[0] + m1[3] * ictm[2]; - m[3] = m1[2] * ictm[1] + m1[3] * ictm[3]; - m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4]; - m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5]; - - // construct a (device space) -> (pattern space) transform matrix - det = 1 / (m1[0] * m1[3] - m1[1] * m1[2]); - imb[0] = m1[3] * det; - imb[1] = -m1[1] * det; - imb[2] = -m1[2] * det; - imb[3] = m1[0] * det; - imb[4] = (m1[2] * m1[5] - m1[3] * m1[4]) * det; - imb[5] = (m1[1] * m1[4] - m1[0] * m1[5]) * det; - - // save current graphics state - savedPath = state->getPath()->copy(); - saveState(); - - // set underlying color space (for uncolored tiling patterns); set - // various other parameters (stroke color, line width) to match - // Adobe's behavior - if (tPat->getPaintType() == 2 && (cs = patCS->getUnder())) { - state->setFillColorSpace(cs->copy()); - out->updateFillColorSpace(state); - state->setStrokeColorSpace(cs->copy()); - out->updateStrokeColorSpace(state); - state->setStrokeColor(state->getFillColor()); - } else { - state->setFillColorSpace(new GfxDeviceGrayColorSpace()); - out->updateFillColorSpace(state); - state->setStrokeColorSpace(new GfxDeviceGrayColorSpace()); - out->updateStrokeColorSpace(state); - } - state->setFillPattern(NULL); - out->updateFillColor(state); - state->setStrokePattern(NULL); - out->updateStrokeColor(state); - if (!stroke) { - state->setLineWidth(0); - out->updateLineWidth(state); - } - - // clip to current path - if (stroke) { - state->clipToStrokePath(); - out->clipToStrokePath(state); - } else { - state->clip(); - if (eoFill) { - out->eoClip(state); - } else { - out->clip(state); - } - } - state->clearPath(); - - // get the clip region, check for empty - state->getClipBBox(&cxMin, &cyMin, &cxMax, &cyMax); - if (cxMin > cxMax || cyMin > cyMax) { - goto err; - } - - // transform clip region bbox to pattern space - xMin = xMax = cxMin * imb[0] + cyMin * imb[2] + imb[4]; - yMin = yMax = cxMin * imb[1] + cyMin * imb[3] + imb[5]; - x1 = cxMin * imb[0] + cyMax * imb[2] + imb[4]; - y1 = cxMin * imb[1] + cyMax * imb[3] + imb[5]; - if (x1 < xMin) { - xMin = x1; - } else if (x1 > xMax) { - xMax = x1; - } - if (y1 < yMin) { - yMin = y1; - } else if (y1 > yMax) { - yMax = y1; - } - x1 = cxMax * imb[0] + cyMin * imb[2] + imb[4]; - y1 = cxMax * imb[1] + cyMin * imb[3] + imb[5]; - if (x1 < xMin) { - xMin = x1; - } else if (x1 > xMax) { - xMax = x1; - } - if (y1 < yMin) { - yMin = y1; - } else if (y1 > yMax) { - yMax = y1; - } - x1 = cxMax * imb[0] + cyMax * imb[2] + imb[4]; - y1 = cxMax * imb[1] + cyMax * imb[3] + imb[5]; - if (x1 < xMin) { - xMin = x1; - } else if (x1 > xMax) { - xMax = x1; - } - if (y1 < yMin) { - yMin = y1; - } else if (y1 > yMax) { - yMax = y1; - } - - // draw the pattern - //~ this should treat negative steps differently -- start at right/top - //~ edge instead of left/bottom (?) - xstep = fabs(tPat->getXStep()); - ystep = fabs(tPat->getYStep()); - xi0 = (int)ceil((xMin - tPat->getBBox()[2]) / xstep); - xi1 = (int)floor((xMax - tPat->getBBox()[0]) / xstep) + 1; - yi0 = (int)ceil((yMin - tPat->getBBox()[3]) / ystep); - yi1 = (int)floor((yMax - tPat->getBBox()[1]) / ystep) + 1; - for (i = 0; i < 4; ++i) { - m1[i] = m[i]; - } - if (out->useTilingPatternFill()) { - m1[4] = m[4]; - m1[5] = m[5]; - out->tilingPatternFill(state, tPat->getContentStream(), - tPat->getPaintType(), tPat->getResDict(), - m1, tPat->getBBox(), - xi0, yi0, xi1, yi1, xstep, ystep); - } else { - for (yi = yi0; yi < yi1; ++yi) { - for (xi = xi0; xi < xi1; ++xi) { - x = xi * xstep; - y = yi * ystep; - m1[4] = x * m[0] + y * m[2] + m[4]; - m1[5] = x * m[1] + y * m[3] + m[5]; - doForm1(tPat->getContentStream(), tPat->getResDict(), - m1, tPat->getBBox()); - } - } - } - - // restore graphics state - err: - restoreState(); - state->setPath(savedPath); -} - -void Gfx::doShadingPatternFill(GfxShadingPattern *sPat, - GBool stroke, GBool eoFill) { - GfxShading *shading; - GfxPath *savedPath; - double *ctm, *btm, *ptm; - double m[6], ictm[6], m1[6]; - double xMin, yMin, xMax, yMax; - double det; - - shading = sPat->getShading(); - - // save current graphics state - savedPath = state->getPath()->copy(); - saveState(); - - // clip to bbox - if (shading->getHasBBox()) { - shading->getBBox(&xMin, &yMin, &xMax, &yMax); - state->moveTo(xMin, yMin); - state->lineTo(xMax, yMin); - state->lineTo(xMax, yMax); - state->lineTo(xMin, yMax); - state->closePath(); - state->clip(); - out->clip(state); - state->setPath(savedPath->copy()); - } - - // clip to current path - if (stroke) { - state->clipToStrokePath(); - out->clipToStrokePath(state); - } else { - state->clip(); - if (eoFill) { - out->eoClip(state); - } else { - out->clip(state); - } - } - - // set the color space - state->setFillColorSpace(shading->getColorSpace()->copy()); - out->updateFillColorSpace(state); - - // background color fill - if (shading->getHasBackground()) { - state->setFillColor(shading->getBackground()); - out->updateFillColor(state); - out->fill(state); - } - state->clearPath(); - - // construct a (pattern space) -> (current space) transform matrix - ctm = state->getCTM(); - btm = baseMatrix; - ptm = sPat->getMatrix(); - // iCTM = invert CTM - det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); - ictm[0] = ctm[3] * det; - ictm[1] = -ctm[1] * det; - ictm[2] = -ctm[2] * det; - ictm[3] = ctm[0] * det; - ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; - ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; - // m1 = PTM * BTM = PTM * base transform matrix - m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2]; - m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3]; - m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2]; - m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3]; - m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4]; - m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5]; - // m = m1 * iCTM = (PTM * BTM) * (iCTM) - m[0] = m1[0] * ictm[0] + m1[1] * ictm[2]; - m[1] = m1[0] * ictm[1] + m1[1] * ictm[3]; - m[2] = m1[2] * ictm[0] + m1[3] * ictm[2]; - m[3] = m1[2] * ictm[1] + m1[3] * ictm[3]; - m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4]; - m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5]; - - // set the new matrix - state->concatCTM(m[0], m[1], m[2], m[3], m[4], m[5]); - out->updateCTM(state, m[0], m[1], m[2], m[3], m[4], m[5]); - -#if 1 //~tmp: turn off anti-aliasing temporarily - GBool vaa = out->getVectorAntialias(); - if (vaa) { - out->setVectorAntialias(gFalse); - } -#endif - - // do shading type-specific operations - switch (shading->getType()) { - case 1: - doFunctionShFill((GfxFunctionShading *)shading); - break; - case 2: - doAxialShFill((GfxAxialShading *)shading); - break; - case 3: - doRadialShFill((GfxRadialShading *)shading); - break; - case 4: - case 5: - doGouraudTriangleShFill((GfxGouraudTriangleShading *)shading); - break; - case 6: - case 7: - doPatchMeshShFill((GfxPatchMeshShading *)shading); - break; - } - -#if 1 //~tmp: turn off anti-aliasing temporarily - if (vaa) { - out->setVectorAntialias(gTrue); - } -#endif - - // restore graphics state - restoreState(); - state->setPath(savedPath); -} - -void Gfx::opShFill(Object args[], int numArgs) { - GfxShading *shading; - GfxPath *savedPath; - double xMin, yMin, xMax, yMax; - - if (!(shading = res->lookupShading(args[0].getName()))) { - return; - } - - // save current graphics state - savedPath = state->getPath()->copy(); - saveState(); - - // clip to bbox - if (shading->getHasBBox()) { - shading->getBBox(&xMin, &yMin, &xMax, &yMax); - state->moveTo(xMin, yMin); - state->lineTo(xMax, yMin); - state->lineTo(xMax, yMax); - state->lineTo(xMin, yMax); - state->closePath(); - state->clip(); - out->clip(state); - state->clearPath(); - } - - // set the color space - state->setFillColorSpace(shading->getColorSpace()->copy()); - out->updateFillColorSpace(state); - -#if 1 //~tmp: turn off anti-aliasing temporarily - GBool vaa = out->getVectorAntialias(); - if (vaa) { - out->setVectorAntialias(gFalse); - } -#endif - - // do shading type-specific operations - switch (shading->getType()) { - case 1: - doFunctionShFill((GfxFunctionShading *)shading); - break; - case 2: - doAxialShFill((GfxAxialShading *)shading); - break; - case 3: - doRadialShFill((GfxRadialShading *)shading); - break; - case 4: - case 5: - doGouraudTriangleShFill((GfxGouraudTriangleShading *)shading); - break; - case 6: - case 7: - doPatchMeshShFill((GfxPatchMeshShading *)shading); - break; - } - -#if 1 //~tmp: turn off anti-aliasing temporarily - if (vaa) { - out->setVectorAntialias(gTrue); - } -#endif - - // restore graphics state - restoreState(); - state->setPath(savedPath); - - delete shading; -} - -void Gfx::doFunctionShFill(GfxFunctionShading *shading) { - double x0, y0, x1, y1; - GfxColor colors[4]; - - if (out->useShadedFills() && - out->functionShadedFill(state, shading)) { - return; - } - - shading->getDomain(&x0, &y0, &x1, &y1); - shading->getColor(x0, y0, &colors[0]); - shading->getColor(x0, y1, &colors[1]); - shading->getColor(x1, y0, &colors[2]); - shading->getColor(x1, y1, &colors[3]); - doFunctionShFill1(shading, x0, y0, x1, y1, colors, 0); -} - -void Gfx::doFunctionShFill1(GfxFunctionShading *shading, - double x0, double y0, - double x1, double y1, - GfxColor *colors, int depth) { - GfxColor fillColor; - GfxColor color0M, color1M, colorM0, colorM1, colorMM; - GfxColor colors2[4]; - double *matrix; - double xM, yM; - int nComps, i, j; - - nComps = shading->getColorSpace()->getNComps(); - matrix = shading->getMatrix(); - - // compare the four corner colors - for (i = 0; i < 4; ++i) { - for (j = 0; j < nComps; ++j) { - if (abs(colors[i].c[j] - colors[(i+1)&3].c[j]) > functionColorDelta) { - break; - } - } - if (j < nComps) { - break; - } - } - - // center of the rectangle - xM = 0.5 * (x0 + x1); - yM = 0.5 * (y0 + y1); - - // the four corner colors are close (or we hit the recursive limit) - // -- fill the rectangle; but require at least one subdivision - // (depth==0) to avoid problems when the four outer corners of the - // shaded region are the same color - if ((i == 4 && depth > 0) || depth == functionMaxDepth) { - - // use the center color - shading->getColor(xM, yM, &fillColor); - state->setFillColor(&fillColor); - out->updateFillColor(state); - - // fill the rectangle - state->moveTo(x0 * matrix[0] + y0 * matrix[2] + matrix[4], - x0 * matrix[1] + y0 * matrix[3] + matrix[5]); - state->lineTo(x1 * matrix[0] + y0 * matrix[2] + matrix[4], - x1 * matrix[1] + y0 * matrix[3] + matrix[5]); - state->lineTo(x1 * matrix[0] + y1 * matrix[2] + matrix[4], - x1 * matrix[1] + y1 * matrix[3] + matrix[5]); - state->lineTo(x0 * matrix[0] + y1 * matrix[2] + matrix[4], - x0 * matrix[1] + y1 * matrix[3] + matrix[5]); - state->closePath(); - out->fill(state); - state->clearPath(); - - // the four corner colors are not close enough -- subdivide the - // rectangle - } else { - - // colors[0] colorM0 colors[2] - // (x0,y0) (xM,y0) (x1,y0) - // +----------+----------+ - // | | | - // | UL | UR | - // color0M | colorMM | color1M - // (x0,yM) +----------+----------+ (x1,yM) - // | (xM,yM) | - // | LL | LR | - // | | | - // +----------+----------+ - // colors[1] colorM1 colors[3] - // (x0,y1) (xM,y1) (x1,y1) - - shading->getColor(x0, yM, &color0M); - shading->getColor(x1, yM, &color1M); - shading->getColor(xM, y0, &colorM0); - shading->getColor(xM, y1, &colorM1); - shading->getColor(xM, yM, &colorMM); - - // upper-left sub-rectangle - colors2[0] = colors[0]; - colors2[1] = color0M; - colors2[2] = colorM0; - colors2[3] = colorMM; - doFunctionShFill1(shading, x0, y0, xM, yM, colors2, depth + 1); - - // lower-left sub-rectangle - colors2[0] = color0M; - colors2[1] = colors[1]; - colors2[2] = colorMM; - colors2[3] = colorM1; - doFunctionShFill1(shading, x0, yM, xM, y1, colors2, depth + 1); - - // upper-right sub-rectangle - colors2[0] = colorM0; - colors2[1] = colorMM; - colors2[2] = colors[2]; - colors2[3] = color1M; - doFunctionShFill1(shading, xM, y0, x1, yM, colors2, depth + 1); - - // lower-right sub-rectangle - colors2[0] = colorMM; - colors2[1] = colorM1; - colors2[2] = color1M; - colors2[3] = colors[3]; - doFunctionShFill1(shading, xM, yM, x1, y1, colors2, depth + 1); - } -} - -void Gfx::doAxialShFill(GfxAxialShading *shading) { - double xMin, yMin, xMax, yMax; - double x0, y0, x1, y1; - double dx, dy, mul; - GBool dxZero, dyZero; - double tMin, tMax, t, tx, ty; - double s[4], sMin, sMax, tmp; - double ux0, uy0, ux1, uy1, vx0, vy0, vx1, vy1; - double t0, t1, tt; - double ta[axialMaxSplits + 1]; - int next[axialMaxSplits + 1]; - GfxColor color0, color1; - int nComps; - int i, j, k, kk; - - if (out->useShadedFills() && - out->axialShadedFill(state, shading)) { - return; - } - - // get the clip region bbox - state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); - - // compute min and max t values, based on the four corners of the - // clip region bbox - shading->getCoords(&x0, &y0, &x1, &y1); - dx = x1 - x0; - dy = y1 - y0; - dxZero = fabs(dx) < 0.01; - dyZero = fabs(dy) < 0.01; - if (dxZero && dyZero) { - tMin = tMax = 0; - } else { - mul = 1 / (dx * dx + dy * dy); - tMin = tMax = ((xMin - x0) * dx + (yMin - y0) * dy) * mul; - t = ((xMin - x0) * dx + (yMax - y0) * dy) * mul; - if (t < tMin) { - tMin = t; - } else if (t > tMax) { - tMax = t; - } - t = ((xMax - x0) * dx + (yMin - y0) * dy) * mul; - if (t < tMin) { - tMin = t; - } else if (t > tMax) { - tMax = t; - } - t = ((xMax - x0) * dx + (yMax - y0) * dy) * mul; - if (t < tMin) { - tMin = t; - } else if (t > tMax) { - tMax = t; - } - if (tMin < 0 && !shading->getExtend0()) { - tMin = 0; - } - if (tMax > 1 && !shading->getExtend1()) { - tMax = 1; - } - } - - // get the function domain - t0 = shading->getDomain0(); - t1 = shading->getDomain1(); - - // Traverse the t axis and do the shading. - // - // For each point (tx, ty) on the t axis, consider a line through - // that point perpendicular to the t axis: - // - // x(s) = tx + s * -dy --> s = (x - tx) / -dy - // y(s) = ty + s * dx --> s = (y - ty) / dx - // - // Then look at the intersection of this line with the bounding box - // (xMin, yMin, xMax, yMax). In the general case, there are four - // intersection points: - // - // s0 = (xMin - tx) / -dy - // s1 = (xMax - tx) / -dy - // s2 = (yMin - ty) / dx - // s3 = (yMax - ty) / dx - // - // and we want the middle two s values. - // - // In the case where dx = 0, take s0 and s1; in the case where dy = - // 0, take s2 and s3. - // - // Each filled polygon is bounded by two of these line segments - // perpdendicular to the t axis. - // - // The t axis is bisected into smaller regions until the color - // difference across a region is small enough, and then the region - // is painted with a single color. - - // set up: require at least one split to avoid problems when the two - // ends of the t axis have the same color - nComps = shading->getColorSpace()->getNComps(); - ta[0] = tMin; - next[0] = axialMaxSplits / 2; - ta[axialMaxSplits / 2] = 0.5 * (tMin + tMax); - next[axialMaxSplits / 2] = axialMaxSplits; - ta[axialMaxSplits] = tMax; - - // compute the color at t = tMin - if (tMin < 0) { - tt = t0; - } else if (tMin > 1) { - tt = t1; - } else { - tt = t0 + (t1 - t0) * tMin; - } - shading->getColor(tt, &color0); - - // compute the coordinates of the point on the t axis at t = tMin; - // then compute the intersection of the perpendicular line with the - // bounding box - tx = x0 + tMin * dx; - ty = y0 + tMin * dy; - if (dxZero && dyZero) { - sMin = sMax = 0; - } else if (dxZero) { - sMin = (xMin - tx) / -dy; - sMax = (xMax - tx) / -dy; - if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } - } else if (dyZero) { - sMin = (yMin - ty) / dx; - sMax = (yMax - ty) / dx; - if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } - } else { - s[0] = (yMin - ty) / dx; - s[1] = (yMax - ty) / dx; - s[2] = (xMin - tx) / -dy; - s[3] = (xMax - tx) / -dy; - for (j = 0; j < 3; ++j) { - kk = j; - for (k = j + 1; k < 4; ++k) { - if (s[k] < s[kk]) { - kk = k; - } - } - tmp = s[j]; s[j] = s[kk]; s[kk] = tmp; - } - sMin = s[1]; - sMax = s[2]; - } - ux0 = tx - sMin * dy; - uy0 = ty + sMin * dx; - vx0 = tx - sMax * dy; - vy0 = ty + sMax * dx; - - i = 0; - while (i < axialMaxSplits) { - - // bisect until color difference is small enough or we hit the - // bisection limit - j = next[i]; - while (j > i + 1) { - if (ta[j] < 0) { - tt = t0; - } else if (ta[j] > 1) { - tt = t1; - } else { - tt = t0 + (t1 - t0) * ta[j]; - } - shading->getColor(tt, &color1); - for (k = 0; k < nComps; ++k) { - if (abs(color1.c[k] - color0.c[k]) > axialColorDelta) { - break; - } - } - if (k == nComps) { - break; - } - k = (i + j) / 2; - ta[k] = 0.5 * (ta[i] + ta[j]); - next[i] = k; - next[k] = j; - j = k; - } - - // use the average of the colors of the two sides of the region - for (k = 0; k < nComps; ++k) { - color0.c[k] = (color0.c[k] + color1.c[k]) / 2; - } - - // compute the coordinates of the point on the t axis; then - // compute the intersection of the perpendicular line with the - // bounding box - tx = x0 + ta[j] * dx; - ty = y0 + ta[j] * dy; - if (dxZero && dyZero) { - sMin = sMax = 0; - } else if (dxZero) { - sMin = (xMin - tx) / -dy; - sMax = (xMax - tx) / -dy; - if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } - } else if (dyZero) { - sMin = (yMin - ty) / dx; - sMax = (yMax - ty) / dx; - if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; } - } else { - s[0] = (yMin - ty) / dx; - s[1] = (yMax - ty) / dx; - s[2] = (xMin - tx) / -dy; - s[3] = (xMax - tx) / -dy; - for (j = 0; j < 3; ++j) { - kk = j; - for (k = j + 1; k < 4; ++k) { - if (s[k] < s[kk]) { - kk = k; - } - } - tmp = s[j]; s[j] = s[kk]; s[kk] = tmp; - } - sMin = s[1]; - sMax = s[2]; - } - ux1 = tx - sMin * dy; - uy1 = ty + sMin * dx; - vx1 = tx - sMax * dy; - vy1 = ty + sMax * dx; - - // set the color - state->setFillColor(&color0); - out->updateFillColor(state); - - // fill the region - state->moveTo(ux0, uy0); - state->lineTo(vx0, vy0); - state->lineTo(vx1, vy1); - state->lineTo(ux1, uy1); - state->closePath(); - out->fill(state); - state->clearPath(); - - // set up for next region - ux0 = ux1; - uy0 = uy1; - vx0 = vx1; - vy0 = vy1; - color0 = color1; - i = next[i]; - } -} - -void Gfx::doRadialShFill(GfxRadialShading *shading) { - double xMin, yMin, xMax, yMax; - double x0, y0, r0, x1, y1, r1, t0, t1; - int nComps; - GfxColor colorA, colorB; - double xa, ya, xb, yb, ra, rb; - double ta, tb, sa, sb; - double sz, xz, yz, sMin, sMax; - GBool enclosed; - int ia, ib, k, n; - double *ctm; - double theta, alpha, angle, t; - - if (out->useShadedFills() && - out->radialShadedFill(state, shading)) { - return; - } - - // get the shading info - shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1); - t0 = shading->getDomain0(); - t1 = shading->getDomain1(); - nComps = shading->getColorSpace()->getNComps(); - - // Compute the point at which r(s) = 0; check for the enclosed - // circles case; and compute the angles for the tangent lines. - if (x0 == x1 && y0 == y1) { - enclosed = gTrue; - theta = 0; // make gcc happy - sz = 0; // make gcc happy - } else if (r0 == r1) { - enclosed = gFalse; - theta = 0; - sz = 0; // make gcc happy - } else { - sz = -r0 / (r1 - r0); - xz = x0 + sz * (x1 - x0); - yz = y0 + sz * (y1 - y0); - enclosed = (xz - x0) * (xz - x0) + (yz - y0) * (yz - y0) <= r0 * r0; - theta = asin(r0 / sqrt((x0 - xz) * (x0 - xz) + (y0 - yz) * (y0 - yz))); - if (r0 > r1) { - theta = -theta; - } - } - if (enclosed) { - alpha = 0; - } else { - alpha = atan2(y1 - y0, x1 - x0); - } - - // compute the (possibly extended) s range - state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax); - if (enclosed) { - sMin = 0; - sMax = 1; - } else { - sMin = 1; - sMax = 0; - // solve for x(s) + r(s) = xMin - if ((x1 + r1) - (x0 + r0) != 0) { - sa = (xMin - (x0 + r0)) / ((x1 + r1) - (x0 + r0)); - if (sa < sMin) { - sMin = sa; - } else if (sa > sMax) { - sMax = sa; - } - } - // solve for x(s) - r(s) = xMax - if ((x1 - r1) - (x0 - r0) != 0) { - sa = (xMax - (x0 - r0)) / ((x1 - r1) - (x0 - r0)); - if (sa < sMin) { - sMin = sa; - } else if (sa > sMax) { - sMax = sa; - } - } - // solve for y(s) + r(s) = yMin - if ((y1 + r1) - (y0 + r0) != 0) { - sa = (yMin - (y0 + r0)) / ((y1 + r1) - (y0 + r0)); - if (sa < sMin) { - sMin = sa; - } else if (sa > sMax) { - sMax = sa; - } - } - // solve for y(s) - r(s) = yMax - if ((y1 - r1) - (y0 - r0) != 0) { - sa = (yMax - (y0 - r0)) / ((y1 - r1) - (y0 - r0)); - if (sa < sMin) { - sMin = sa; - } else if (sa > sMax) { - sMax = sa; - } - } - // check against sz - if (r0 < r1) { - if (sMin < sz) { - sMin = sz; - } - } else if (r0 > r1) { - if (sMax > sz) { - sMax = sz; - } - } - // check the 'extend' flags - if (!shading->getExtend0() && sMin < 0) { - sMin = 0; - } - if (!shading->getExtend1() && sMax > 1) { - sMax = 1; - } - } - - // compute the number of steps into which circles must be divided to - // achieve a curve flatness of 0.1 pixel in device space for the - // largest circle (note that "device space" is 72 dpi when generating - // PostScript, hence the relatively small 0.1 pixel accuracy) - ctm = state->getCTM(); - t = fabs(ctm[0]); - if (fabs(ctm[1]) > t) { - t = fabs(ctm[1]); - } - if (fabs(ctm[2]) > t) { - t = fabs(ctm[2]); - } - if (fabs(ctm[3]) > t) { - t = fabs(ctm[3]); - } - if (r0 > r1) { - t *= r0; - } else { - t *= r1; - } - if (t < 1) { - n = 3; - } else { - n = (int)(M_PI / acos(1 - 0.1 / t)); - if (n < 3) { - n = 3; - } else if (n > 200) { - n = 200; - } - } - - // setup for the start circle - ia = 0; - sa = sMin; - ta = t0 + sa * (t1 - t0); - xa = x0 + sa * (x1 - x0); - ya = y0 + sa * (y1 - y0); - ra = r0 + sa * (r1 - r0); - if (ta < t0) { - shading->getColor(t0, &colorA); - } else if (ta > t1) { - shading->getColor(t1, &colorA); - } else { - shading->getColor(ta, &colorA); - } - - // fill the circles - while (ia < radialMaxSplits) { - - // go as far along the t axis (toward t1) as we can, such that the - // color difference is within the tolerance (radialColorDelta) -- - // this uses bisection (between the current value, t, and t1), - // limited to radialMaxSplits points along the t axis; require at - // least one split to avoid problems when the innermost and - // outermost colors are the same - ib = radialMaxSplits; - sb = sMax; - tb = t0 + sb * (t1 - t0); - if (tb < t0) { - shading->getColor(t0, &colorB); - } else if (tb > t1) { - shading->getColor(t1, &colorB); - } else { - shading->getColor(tb, &colorB); - } - while (ib - ia > 1) { - for (k = 0; k < nComps; ++k) { - if (abs(colorB.c[k] - colorA.c[k]) > radialColorDelta) { - break; - } - } - if (k == nComps && ib < radialMaxSplits) { - break; - } - ib = (ia + ib) / 2; - sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin); - tb = t0 + sb * (t1 - t0); - if (tb < t0) { - shading->getColor(t0, &colorB); - } else if (tb > t1) { - shading->getColor(t1, &colorB); - } else { - shading->getColor(tb, &colorB); - } - } - - // compute center and radius of the circle - xb = x0 + sb * (x1 - x0); - yb = y0 + sb * (y1 - y0); - rb = r0 + sb * (r1 - r0); - - // use the average of the colors at the two circles - for (k = 0; k < nComps; ++k) { - colorA.c[k] = (colorA.c[k] + colorB.c[k]) / 2; - } - state->setFillColor(&colorA); - out->updateFillColor(state); - - if (enclosed) { - - // construct path for first circle (counterclockwise) - state->moveTo(xa + ra, ya); - for (k = 1; k < n; ++k) { - angle = ((double)k / (double)n) * 2 * M_PI; - state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); - } - state->closePath(); - - // construct and append path for second circle (clockwise) - state->moveTo(xb + rb, yb); - for (k = 1; k < n; ++k) { - angle = -((double)k / (double)n) * 2 * M_PI; - state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle)); - } - state->closePath(); - - } else { - - // construct the first subpath (clockwise) - state->moveTo(xa + ra * cos(alpha + theta + 0.5 * M_PI), - ya + ra * sin(alpha + theta + 0.5 * M_PI)); - for (k = 0; k < n; ++k) { - angle = alpha + theta + 0.5 * M_PI - - ((double)k / (double)n) * (2 * theta + M_PI); - state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle)); - } - for (k = 0; k < n; ++k) { - angle = alpha - theta - 0.5 * M_PI - + ((double)k / (double)n) * (2 * theta - M_PI); - state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); - } - state->closePath(); - - // construct the second subpath (counterclockwise) - state->moveTo(xa + ra * cos(alpha + theta + 0.5 * M_PI), - ya + ra * sin(alpha + theta + 0.5 * M_PI)); - for (k = 0; k < n; ++k) { - angle = alpha + theta + 0.5 * M_PI - + ((double)k / (double)n) * (-2 * theta + M_PI); - state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle)); - } - for (k = 0; k < n; ++k) { - angle = alpha - theta - 0.5 * M_PI - + ((double)k / (double)n) * (2 * theta + M_PI); - state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); - } - state->closePath(); - } - - // fill the path - out->fill(state); - state->clearPath(); - - // step to the next value of t - ia = ib; - sa = sb; - ta = tb; - xa = xb; - ya = yb; - ra = rb; - colorA = colorB; - } - - if (enclosed) { - // extend the smaller circle - if ((shading->getExtend0() && r0 <= r1) || - (shading->getExtend1() && r1 < r0)) { - if (r0 <= r1) { - ta = t0; - ra = r0; - xa = x0; - ya = y0; - } else { - ta = t1; - ra = r1; - xa = x1; - ya = y1; - } - shading->getColor(ta, &colorA); - state->setFillColor(&colorA); - out->updateFillColor(state); - state->moveTo(xa + ra, ya); - for (k = 1; k < n; ++k) { - angle = ((double)k / (double)n) * 2 * M_PI; - state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); - } - state->closePath(); - out->fill(state); - state->clearPath(); - } - - // extend the larger circle - if ((shading->getExtend0() && r0 > r1) || - (shading->getExtend1() && r1 >= r0)) { - if (r0 > r1) { - ta = t0; - ra = r0; - xa = x0; - ya = y0; - } else { - ta = t1; - ra = r1; - xa = x1; - ya = y1; - } - shading->getColor(ta, &colorA); - state->setFillColor(&colorA); - out->updateFillColor(state); - state->moveTo(xMin, yMin); - state->lineTo(xMin, yMax); - state->lineTo(xMax, yMax); - state->lineTo(xMax, yMin); - state->closePath(); - state->moveTo(xa + ra, ya); - for (k = 1; k < n; ++k) { - angle = ((double)k / (double)n) * 2 * M_PI; - state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle)); - } - state->closePath(); - out->fill(state); - state->clearPath(); - } - } -} - -void Gfx::doGouraudTriangleShFill(GfxGouraudTriangleShading *shading) { - double x0, y0, x1, y1, x2, y2; - GfxColor color0, color1, color2; - int i; - - for (i = 0; i < shading->getNTriangles(); ++i) { - shading->getTriangle(i, &x0, &y0, &color0, - &x1, &y1, &color1, - &x2, &y2, &color2); - gouraudFillTriangle(x0, y0, &color0, x1, y1, &color1, x2, y2, &color2, - shading->getColorSpace()->getNComps(), 0); - } -} - -void Gfx::gouraudFillTriangle(double x0, double y0, GfxColor *color0, - double x1, double y1, GfxColor *color1, - double x2, double y2, GfxColor *color2, - int nComps, int depth) { - double x01, y01, x12, y12, x20, y20; - GfxColor color01, color12, color20; - int i; - - for (i = 0; i < nComps; ++i) { - if (abs(color0->c[i] - color1->c[i]) > gouraudColorDelta || - abs(color1->c[i] - color2->c[i]) > gouraudColorDelta) { - break; - } - } - if (i == nComps || depth == gouraudMaxDepth) { - state->setFillColor(color0); - out->updateFillColor(state); - state->moveTo(x0, y0); - state->lineTo(x1, y1); - state->lineTo(x2, y2); - state->closePath(); - out->fill(state); - state->clearPath(); - } else { - x01 = 0.5 * (x0 + x1); - y01 = 0.5 * (y0 + y1); - x12 = 0.5 * (x1 + x2); - y12 = 0.5 * (y1 + y2); - x20 = 0.5 * (x2 + x0); - y20 = 0.5 * (y2 + y0); - //~ if the shading has a Function, this should interpolate on the - //~ function parameter, not on the color components - for (i = 0; i < nComps; ++i) { - color01.c[i] = (color0->c[i] + color1->c[i]) / 2; - color12.c[i] = (color1->c[i] + color2->c[i]) / 2; - color20.c[i] = (color2->c[i] + color0->c[i]) / 2; - } - gouraudFillTriangle(x0, y0, color0, x01, y01, &color01, - x20, y20, &color20, nComps, depth + 1); - gouraudFillTriangle(x01, y01, &color01, x1, y1, color1, - x12, y12, &color12, nComps, depth + 1); - gouraudFillTriangle(x01, y01, &color01, x12, y12, &color12, - x20, y20, &color20, nComps, depth + 1); - gouraudFillTriangle(x20, y20, &color20, x12, y12, &color12, - x2, y2, color2, nComps, depth + 1); - } -} - -void Gfx::doPatchMeshShFill(GfxPatchMeshShading *shading) { - int start, i; - - if (shading->getNPatches() > 128) { - start = 3; - } else if (shading->getNPatches() > 64) { - start = 2; - } else if (shading->getNPatches() > 16) { - start = 1; - } else { - start = 0; - } - for (i = 0; i < shading->getNPatches(); ++i) { - fillPatch(shading->getPatch(i), shading->getColorSpace()->getNComps(), - start); - } -} - -void Gfx::fillPatch(GfxPatch *patch, int nComps, int depth) { - GfxPatch patch00, patch01, patch10, patch11; - double xx[4][8], yy[4][8]; - double xxm, yym; - int i; - - for (i = 0; i < nComps; ++i) { - if (abs(patch->color[0][0].c[i] - patch->color[0][1].c[i]) - > patchColorDelta || - abs(patch->color[0][1].c[i] - patch->color[1][1].c[i]) - > patchColorDelta || - abs(patch->color[1][1].c[i] - patch->color[1][0].c[i]) - > patchColorDelta || - abs(patch->color[1][0].c[i] - patch->color[0][0].c[i]) - > patchColorDelta) { - break; - } - } - if (i == nComps || depth == patchMaxDepth) { - state->setFillColor(&patch->color[0][0]); - out->updateFillColor(state); - state->moveTo(patch->x[0][0], patch->y[0][0]); - state->curveTo(patch->x[0][1], patch->y[0][1], - patch->x[0][2], patch->y[0][2], - patch->x[0][3], patch->y[0][3]); - state->curveTo(patch->x[1][3], patch->y[1][3], - patch->x[2][3], patch->y[2][3], - patch->x[3][3], patch->y[3][3]); - state->curveTo(patch->x[3][2], patch->y[3][2], - patch->x[3][1], patch->y[3][1], - patch->x[3][0], patch->y[3][0]); - state->curveTo(patch->x[2][0], patch->y[2][0], - patch->x[1][0], patch->y[1][0], - patch->x[0][0], patch->y[0][0]); - state->closePath(); - out->fill(state); - state->clearPath(); - } else { - for (i = 0; i < 4; ++i) { - xx[i][0] = patch->x[i][0]; - yy[i][0] = patch->y[i][0]; - xx[i][1] = 0.5 * (patch->x[i][0] + patch->x[i][1]); - yy[i][1] = 0.5 * (patch->y[i][0] + patch->y[i][1]); - xxm = 0.5 * (patch->x[i][1] + patch->x[i][2]); - yym = 0.5 * (patch->y[i][1] + patch->y[i][2]); - xx[i][6] = 0.5 * (patch->x[i][2] + patch->x[i][3]); - yy[i][6] = 0.5 * (patch->y[i][2] + patch->y[i][3]); - xx[i][2] = 0.5 * (xx[i][1] + xxm); - yy[i][2] = 0.5 * (yy[i][1] + yym); - xx[i][5] = 0.5 * (xxm + xx[i][6]); - yy[i][5] = 0.5 * (yym + yy[i][6]); - xx[i][3] = xx[i][4] = 0.5 * (xx[i][2] + xx[i][5]); - yy[i][3] = yy[i][4] = 0.5 * (yy[i][2] + yy[i][5]); - xx[i][7] = patch->x[i][3]; - yy[i][7] = patch->y[i][3]; - } - for (i = 0; i < 4; ++i) { - patch00.x[0][i] = xx[0][i]; - patch00.y[0][i] = yy[0][i]; - patch00.x[1][i] = 0.5 * (xx[0][i] + xx[1][i]); - patch00.y[1][i] = 0.5 * (yy[0][i] + yy[1][i]); - xxm = 0.5 * (xx[1][i] + xx[2][i]); - yym = 0.5 * (yy[1][i] + yy[2][i]); - patch10.x[2][i] = 0.5 * (xx[2][i] + xx[3][i]); - patch10.y[2][i] = 0.5 * (yy[2][i] + yy[3][i]); - patch00.x[2][i] = 0.5 * (patch00.x[1][i] + xxm); - patch00.y[2][i] = 0.5 * (patch00.y[1][i] + yym); - patch10.x[1][i] = 0.5 * (xxm + patch10.x[2][i]); - patch10.y[1][i] = 0.5 * (yym + patch10.y[2][i]); - patch00.x[3][i] = 0.5 * (patch00.x[2][i] + patch10.x[1][i]); - patch00.y[3][i] = 0.5 * (patch00.y[2][i] + patch10.y[1][i]); - patch10.x[0][i] = patch00.x[3][i]; - patch10.y[0][i] = patch00.y[3][i]; - patch10.x[3][i] = xx[3][i]; - patch10.y[3][i] = yy[3][i]; - } - for (i = 4; i < 8; ++i) { - patch01.x[0][i-4] = xx[0][i]; - patch01.y[0][i-4] = yy[0][i]; - patch01.x[1][i-4] = 0.5 * (xx[0][i] + xx[1][i]); - patch01.y[1][i-4] = 0.5 * (yy[0][i] + yy[1][i]); - xxm = 0.5 * (xx[1][i] + xx[2][i]); - yym = 0.5 * (yy[1][i] + yy[2][i]); - patch11.x[2][i-4] = 0.5 * (xx[2][i] + xx[3][i]); - patch11.y[2][i-4] = 0.5 * (yy[2][i] + yy[3][i]); - patch01.x[2][i-4] = 0.5 * (patch01.x[1][i-4] + xxm); - patch01.y[2][i-4] = 0.5 * (patch01.y[1][i-4] + yym); - patch11.x[1][i-4] = 0.5 * (xxm + patch11.x[2][i-4]); - patch11.y[1][i-4] = 0.5 * (yym + patch11.y[2][i-4]); - patch01.x[3][i-4] = 0.5 * (patch01.x[2][i-4] + patch11.x[1][i-4]); - patch01.y[3][i-4] = 0.5 * (patch01.y[2][i-4] + patch11.y[1][i-4]); - patch11.x[0][i-4] = patch01.x[3][i-4]; - patch11.y[0][i-4] = patch01.y[3][i-4]; - patch11.x[3][i-4] = xx[3][i]; - patch11.y[3][i-4] = yy[3][i]; - } - //~ if the shading has a Function, this should interpolate on the - //~ function parameter, not on the color components - for (i = 0; i < nComps; ++i) { - patch00.color[0][0].c[i] = patch->color[0][0].c[i]; - patch00.color[0][1].c[i] = (patch->color[0][0].c[i] + - patch->color[0][1].c[i]) / 2; - patch01.color[0][0].c[i] = patch00.color[0][1].c[i]; - patch01.color[0][1].c[i] = patch->color[0][1].c[i]; - patch01.color[1][1].c[i] = (patch->color[0][1].c[i] + - patch->color[1][1].c[i]) / 2; - patch11.color[0][1].c[i] = patch01.color[1][1].c[i]; - patch11.color[1][1].c[i] = patch->color[1][1].c[i]; - patch11.color[1][0].c[i] = (patch->color[1][1].c[i] + - patch->color[1][0].c[i]) / 2; - patch10.color[1][1].c[i] = patch11.color[1][0].c[i]; - patch10.color[1][0].c[i] = patch->color[1][0].c[i]; - patch10.color[0][0].c[i] = (patch->color[1][0].c[i] + - patch->color[0][0].c[i]) / 2; - patch00.color[1][0].c[i] = patch10.color[0][0].c[i]; - patch00.color[1][1].c[i] = (patch00.color[1][0].c[i] + - patch01.color[1][1].c[i]) / 2; - patch01.color[1][0].c[i] = patch00.color[1][1].c[i]; - patch11.color[0][0].c[i] = patch00.color[1][1].c[i]; - patch10.color[0][1].c[i] = patch00.color[1][1].c[i]; - } - fillPatch(&patch00, nComps, depth + 1); - fillPatch(&patch10, nComps, depth + 1); - fillPatch(&patch01, nComps, depth + 1); - fillPatch(&patch11, nComps, depth + 1); - } -} - -void Gfx::doEndPath() { - if (state->isCurPt() && clip != clipNone) { - state->clip(); - if (clip == clipNormal) { - out->clip(state); - } else { - out->eoClip(state); - } - } - clip = clipNone; - state->clearPath(); -} - -//------------------------------------------------------------------------ -// path clipping operators -//------------------------------------------------------------------------ - -void Gfx::opClip(Object args[], int numArgs) { - clip = clipNormal; -} - -void Gfx::opEOClip(Object args[], int numArgs) { - clip = clipEO; -} - -//------------------------------------------------------------------------ -// text object operators -//------------------------------------------------------------------------ - -void Gfx::opBeginText(Object args[], int numArgs) { - state->setTextMat(1, 0, 0, 1, 0, 0); - state->textMoveTo(0, 0); - out->updateTextMat(state); - out->updateTextPos(state); - fontChanged = gTrue; -} - -void Gfx::opEndText(Object args[], int numArgs) { - out->endTextObject(state); -} - -//------------------------------------------------------------------------ -// text state operators -//------------------------------------------------------------------------ - -void Gfx::opSetCharSpacing(Object args[], int numArgs) { - state->setCharSpace(args[0].getNum()); - out->updateCharSpace(state); -} - -void Gfx::opSetFont(Object args[], int numArgs) { - GfxFont *font; - - if (!(font = res->lookupFont(args[0].getName()))) { - return; - } - if (printCommands) { - printf(" font: tag=%s name='%s' %g\n", - font->getTag()->getCString(), - font->getName() ? font->getName()->getCString() : "???", - args[1].getNum()); - fflush(stdout); - } - state->setFont(font, args[1].getNum()); - fontChanged = gTrue; -} - -void Gfx::opSetTextLeading(Object args[], int numArgs) { - state->setLeading(args[0].getNum()); -} - -void Gfx::opSetTextRender(Object args[], int numArgs) { - state->setRender(args[0].getInt()); - out->updateRender(state); -} - -void Gfx::opSetTextRise(Object args[], int numArgs) { - state->setRise(args[0].getNum()); - out->updateRise(state); -} - -void Gfx::opSetWordSpacing(Object args[], int numArgs) { - state->setWordSpace(args[0].getNum()); - out->updateWordSpace(state); -} - -void Gfx::opSetHorizScaling(Object args[], int numArgs) { - state->setHorizScaling(args[0].getNum()); - out->updateHorizScaling(state); - fontChanged = gTrue; -} - -//------------------------------------------------------------------------ -// text positioning operators -//------------------------------------------------------------------------ - -void Gfx::opTextMove(Object args[], int numArgs) { - double tx, ty; - - tx = state->getLineX() + args[0].getNum(); - ty = state->getLineY() + args[1].getNum(); - state->textMoveTo(tx, ty); - out->updateTextPos(state); -} - -void Gfx::opTextMoveSet(Object args[], int numArgs) { - double tx, ty; - - tx = state->getLineX() + args[0].getNum(); - ty = args[1].getNum(); - state->setLeading(-ty); - ty += state->getLineY(); - state->textMoveTo(tx, ty); - out->updateTextPos(state); -} - -void Gfx::opSetTextMatrix(Object args[], int numArgs) { - state->setTextMat(args[0].getNum(), args[1].getNum(), - args[2].getNum(), args[3].getNum(), - args[4].getNum(), args[5].getNum()); - state->textMoveTo(0, 0); - out->updateTextMat(state); - out->updateTextPos(state); - fontChanged = gTrue; -} - -void Gfx::opTextNextLine(Object args[], int numArgs) { - double tx, ty; - - tx = state->getLineX(); - ty = state->getLineY() - state->getLeading(); - state->textMoveTo(tx, ty); - out->updateTextPos(state); -} - -//------------------------------------------------------------------------ -// text string operators -//------------------------------------------------------------------------ - -void Gfx::opShowText(Object args[], int numArgs) { - if (!state->getFont()) { - error(getPos(), "No font in show"); - return; - } - if (fontChanged) { - out->updateFont(state); - fontChanged = gFalse; - } - out->beginStringOp(state); - doShowText(args[0].getString()); - out->endStringOp(state); -} - -void Gfx::opMoveShowText(Object args[], int numArgs) { - double tx, ty; - - if (!state->getFont()) { - error(getPos(), "No font in move/show"); - return; - } - if (fontChanged) { - out->updateFont(state); - fontChanged = gFalse; - } - tx = state->getLineX(); - ty = state->getLineY() - state->getLeading(); - state->textMoveTo(tx, ty); - out->updateTextPos(state); - out->beginStringOp(state); - doShowText(args[0].getString()); - out->endStringOp(state); -} - -void Gfx::opMoveSetShowText(Object args[], int numArgs) { - double tx, ty; - - if (!state->getFont()) { - error(getPos(), "No font in move/set/show"); - return; - } - if (fontChanged) { - out->updateFont(state); - fontChanged = gFalse; - } - state->setWordSpace(args[0].getNum()); - state->setCharSpace(args[1].getNum()); - tx = state->getLineX(); - ty = state->getLineY() - state->getLeading(); - state->textMoveTo(tx, ty); - out->updateWordSpace(state); - out->updateCharSpace(state); - out->updateTextPos(state); - out->beginStringOp(state); - doShowText(args[2].getString()); - out->endStringOp(state); -} - -void Gfx::opShowSpaceText(Object args[], int numArgs) { - Array *a; - Object obj; - int wMode; - int i; - - if (!state->getFont()) { - error(getPos(), "No font in show/space"); - return; - } - if (fontChanged) { - out->updateFont(state); - fontChanged = gFalse; - } - out->beginStringOp(state); - wMode = state->getFont()->getWMode(); - a = args[0].getArray(); - for (i = 0; i < a->getLength(); ++i) { - a->get(i, &obj); - if (obj.isNum()) { - // this uses the absolute value of the font size to match - // Acrobat's behavior - if (wMode) { - state->textShift(0, -obj.getNum() * 0.001 * - fabs(state->getFontSize())); - } else { - state->textShift(-obj.getNum() * 0.001 * - fabs(state->getFontSize()), 0); - } - out->updateTextShift(state, obj.getNum()); - } else if (obj.isString()) { - doShowText(obj.getString()); - } else { - error(getPos(), "Element of show/space array must be number or string"); - } - obj.free(); - } - out->endStringOp(state); -} - -void Gfx::doShowText(GString *s) { - GfxFont *font; - int wMode; - double riseX, riseY; - CharCode code; - Unicode u[8]; - double x, y, dx, dy, dx2, dy2, curX, curY, tdx, tdy, lineX, lineY; - double originX, originY, tOriginX, tOriginY; - double oldCTM[6], newCTM[6]; - double *mat; - Object charProc; - Dict *resDict; - Parser *oldParser; - char *p; - int len, n, uLen, nChars, nSpaces, i; - - font = state->getFont(); - wMode = font->getWMode(); - - if (out->useDrawChar()) { - out->beginString(state, s); - } - - // handle a Type 3 char - if (font->getType() == fontType3 && out->interpretType3Chars()) { - mat = state->getCTM(); - for (i = 0; i < 6; ++i) { - oldCTM[i] = mat[i]; - } - mat = state->getTextMat(); - newCTM[0] = mat[0] * oldCTM[0] + mat[1] * oldCTM[2]; - newCTM[1] = mat[0] * oldCTM[1] + mat[1] * oldCTM[3]; - newCTM[2] = mat[2] * oldCTM[0] + mat[3] * oldCTM[2]; - newCTM[3] = mat[2] * oldCTM[1] + mat[3] * oldCTM[3]; - mat = font->getFontMatrix(); - newCTM[0] = mat[0] * newCTM[0] + mat[1] * newCTM[2]; - newCTM[1] = mat[0] * newCTM[1] + mat[1] * newCTM[3]; - newCTM[2] = mat[2] * newCTM[0] + mat[3] * newCTM[2]; - newCTM[3] = mat[2] * newCTM[1] + mat[3] * newCTM[3]; - newCTM[0] *= state->getFontSize(); - newCTM[1] *= state->getFontSize(); - newCTM[2] *= state->getFontSize(); - newCTM[3] *= state->getFontSize(); - newCTM[0] *= state->getHorizScaling(); - newCTM[2] *= state->getHorizScaling(); - state->textTransformDelta(0, state->getRise(), &riseX, &riseY); - curX = state->getCurX(); - curY = state->getCurY(); - lineX = state->getLineX(); - lineY = state->getLineY(); - oldParser = parser; - p = s->getCString(); - len = s->getLength(); - while (len > 0) { - n = font->getNextChar(p, len, &code, - u, (int)(sizeof(u) / sizeof(Unicode)), &uLen, - &dx, &dy, &originX, &originY); - dx = dx * state->getFontSize() + state->getCharSpace(); - if (n == 1 && (*p == ' ' || *p == 0)) { - double w=state->getWordSpace(); - if (w==0 && dx==0) - w=state->getFontSize()/3; // workaround for zero word space - dx += w; - } - dx *= state->getHorizScaling(); - dy *= state->getFontSize(); - state->textTransformDelta(dx, dy, &tdx, &tdy); - state->transform(curX + riseX, curY + riseY, &x, &y); - saveState(); - state->setCTM(newCTM[0], newCTM[1], newCTM[2], newCTM[3], x, y); - //~ the CTM concat values here are wrong (but never used) - out->updateCTM(state, 1, 0, 0, 1, 0, 0); - if (!out->beginType3Char(state, curX + riseX, curY + riseY, tdx, tdy, - code, u, uLen)) { - ((Gfx8BitFont *)font)->getCharProc(code, &charProc); - if ((resDict = ((Gfx8BitFont *)font)->getResources())) { - pushResources(resDict); - } - if (charProc.isStream()) { - display(&charProc, gFalse); - } else { - error(getPos(), "Missing or bad Type3 CharProc entry"); - } - out->endType3Char(state); - if (resDict) { - popResources(); - } - charProc.free(); - } - restoreState(); - // GfxState::restore() does *not* restore the current position, - // so we deal with it here using (curX, curY) and (lineX, lineY) - curX += tdx; - curY += tdy; - state->moveTo(curX, curY); - state->textSetPos(lineX, lineY); - p += n; - len -= n; - } - parser = oldParser; - - } else if (out->useDrawChar()) { - state->textTransformDelta(0, state->getRise(), &riseX, &riseY); - p = s->getCString(); - len = s->getLength(); - while (len > 0) { - n = font->getNextChar(p, len, &code, - u, (int)(sizeof(u) / sizeof(Unicode)), &uLen, - &dx, &dy, &originX, &originY); - if (wMode) { - dx *= state->getFontSize(); - dy = dy * state->getFontSize() + state->getCharSpace(); - if (n == 1 && *p == ' ') { - dy += state->getWordSpace(); - } - } else { - dx = dx * state->getFontSize() + state->getCharSpace(); - if (n == 1 && *p == ' ') { - dx += state->getWordSpace(); - } - dx *= state->getHorizScaling(); - dy *= state->getFontSize(); - } - state->textTransformDelta(dx, dy, &tdx, &tdy); - originX *= state->getFontSize(); - originY *= state->getFontSize(); - state->textTransformDelta(originX, originY, &tOriginX, &tOriginY); - out->drawChar(state, state->getCurX() + riseX, state->getCurY() + riseY, - tdx, tdy, tOriginX, tOriginY, code, n, u, uLen); - state->shift(tdx, tdy); - p += n; - len -= n; - } - - } else { - dx = dy = 0; - p = s->getCString(); - len = s->getLength(); - nChars = nSpaces = 0; - while (len > 0) { - n = font->getNextChar(p, len, &code, - u, (int)(sizeof(u) / sizeof(Unicode)), &uLen, - &dx2, &dy2, &originX, &originY); - dx += dx2; - dy += dy2; - if (n == 1 && *p == ' ') { - ++nSpaces; - } - ++nChars; - p += n; - len -= n; - } - if (wMode) { - dx *= state->getFontSize(); - dy = dy * state->getFontSize() - + nChars * state->getCharSpace() - + nSpaces * state->getWordSpace(); - } else { - dx = dx * state->getFontSize() - + nChars * state->getCharSpace() - + nSpaces * state->getWordSpace(); - dx *= state->getHorizScaling(); - dy *= state->getFontSize(); - } - state->textTransformDelta(dx, dy, &tdx, &tdy); - out->drawString(state, s); - state->shift(tdx, tdy); - } - - if (out->useDrawChar()) { - out->endString(state); - } - - updateLevel += 10 * s->getLength(); -} - -//------------------------------------------------------------------------ -// XObject operators -//------------------------------------------------------------------------ - -void Gfx::opXObject(Object args[], int numArgs) { - char *name; - Object obj1, obj2, obj3, refObj; -#if OPI_SUPPORT - Object opiDict; -#endif - - name = args[0].getName(); - if (!res->lookupXObject(name, &obj1)) { - return; - } - if (!obj1.isStream()) { - error(getPos(), "XObject '%s' is wrong type", name); - obj1.free(); - return; - } -#if OPI_SUPPORT - obj1.streamGetDict()->lookup("OPI", &opiDict); - if (opiDict.isDict()) { - out->opiBegin(state, opiDict.getDict()); - } -#endif - obj1.streamGetDict()->lookup("Subtype", &obj2); - if (obj2.isName("Image")) { - if (out->needNonText()) { - res->lookupXObjectNF(name, &refObj); - doImage(&refObj, obj1.getStream(), gFalse); - refObj.free(); - } - } else if (obj2.isName("Form")) { - res->lookupXObjectNF(name, &refObj); - if (out->useDrawForm() && refObj.isRef()) { - out->drawForm(refObj.getRef()); - } else { - doForm(&obj1); - } - refObj.free(); - } else if (obj2.isName("PS")) { - obj1.streamGetDict()->lookup("Level1", &obj3); - out->psXObject(obj1.getStream(), - obj3.isStream() ? obj3.getStream() : (Stream *)NULL); - } else if (obj2.isName()) { - error(getPos(), "Unknown XObject subtype '%s'", obj2.getName()); - } else { - error(getPos(), "XObject subtype is missing or wrong type"); - } - obj2.free(); -#if OPI_SUPPORT - if (opiDict.isDict()) { - out->opiEnd(state, opiDict.getDict()); - } - opiDict.free(); -#endif - obj1.free(); -} - -void Gfx::doImage(Object *ref, Stream *str, GBool inlineImg) { - Dict *dict, *maskDict; - int width, height; - int bits, maskBits; - StreamColorSpaceMode csMode; - GBool mask; - GBool invert; - GfxColorSpace *colorSpace, *maskColorSpace; - GfxImageColorMap *colorMap, *maskColorMap; - Object maskObj, smaskObj; - GBool haveColorKeyMask, haveExplicitMask, haveSoftMask; - int maskColors[2*gfxColorMaxComps]; - int maskWidth, maskHeight; - GBool maskInvert; - Stream *maskStr; - Object obj1, obj2; - int i; - - // get info from the stream - bits = 0; - csMode = streamCSNone; - str->getImageParams(&bits, &csMode); - - // get stream dict - dict = str->getDict(); - - // get size - dict->lookup("Width", &obj1); - if (obj1.isNull()) { - obj1.free(); - dict->lookup("W", &obj1); - } - if (!obj1.isInt()) - goto err2; - width = obj1.getInt(); - obj1.free(); - dict->lookup("Height", &obj1); - if (obj1.isNull()) { - obj1.free(); - dict->lookup("H", &obj1); - } - if (!obj1.isInt()) - goto err2; - height = obj1.getInt(); - obj1.free(); - - // image or mask? - dict->lookup("ImageMask", &obj1); - if (obj1.isNull()) { - obj1.free(); - dict->lookup("IM", &obj1); - } - mask = gFalse; - if (obj1.isBool()) - mask = obj1.getBool(); - else if (!obj1.isNull()) - goto err2; - obj1.free(); - - // bit depth - if (bits == 0) { - dict->lookup("BitsPerComponent", &obj1); - if (obj1.isNull()) { - obj1.free(); - dict->lookup("BPC", &obj1); - } - if (obj1.isInt()) { - bits = obj1.getInt(); - } else if (mask) { - bits = 1; - } else { - goto err2; - } - obj1.free(); - } - - // display a mask - if (mask) { - - // check for inverted mask - if (bits != 1) - goto err1; - invert = gFalse; - dict->lookup("Decode", &obj1); - if (obj1.isNull()) { - obj1.free(); - dict->lookup("D", &obj1); - } - if (obj1.isArray()) { - obj1.arrayGet(0, &obj2); - if (obj2.isInt() && obj2.getInt() == 1) - invert = gTrue; - obj2.free(); - } else if (!obj1.isNull()) { - goto err2; - } - obj1.free(); - - // draw it - out->drawImageMask(state, ref, str, width, height, invert, inlineImg); - - } else { - - // get color space and color map - dict->lookup("ColorSpace", &obj1); - if (obj1.isNull()) { - obj1.free(); - dict->lookup("CS", &obj1); - } - if (obj1.isName()) { - res->lookupColorSpace(obj1.getName(), &obj2); - if (!obj2.isNull()) { - obj1.free(); - obj1 = obj2; - } else { - obj2.free(); - } - } - if (!obj1.isNull()) { - colorSpace = GfxColorSpace::parse(&obj1, csMode); - } else if (csMode == streamCSDeviceGray) { - colorSpace = new GfxDeviceGrayColorSpace(); - } else if (csMode == streamCSDeviceRGB) { - colorSpace = new GfxDeviceRGBColorSpace(); - } else if (csMode == streamCSDeviceRGBX) { - colorSpace = new GfxDeviceRGBXColorSpace(); - } else if (csMode == streamCSDeviceCMYK) { - colorSpace = new GfxDeviceCMYKColorSpace(); - } else { - colorSpace = NULL; - } - obj1.free(); - if (!colorSpace) { - goto err1; - } - dict->lookup("Decode", &obj1); - if (obj1.isNull()) { - obj1.free(); - dict->lookup("D", &obj1); - } - colorMap = new GfxImageColorMap(bits, &obj1, colorSpace); - obj1.free(); - if (!colorMap->isOk()) { - delete colorMap; - goto err1; - } - - // get the mask - haveColorKeyMask = haveExplicitMask = haveSoftMask = gFalse; - maskStr = NULL; // make gcc happy - maskWidth = maskHeight = 0; // make gcc happy - maskInvert = gFalse; // make gcc happy - maskColorMap = NULL; // make gcc happy - dict->lookup("Mask", &maskObj); - dict->lookup("SMask", &smaskObj); - if (smaskObj.isStream()) { - // soft mask - if (inlineImg) { - goto err1; - } - maskStr = smaskObj.getStream(); - maskDict = smaskObj.streamGetDict(); - maskDict->lookup("Width", &obj1); - if (obj1.isNull()) { - obj1.free(); - maskDict->lookup("W", &obj1); - } - if (!obj1.isInt()) { - goto err2; - } - maskWidth = obj1.getInt(); - obj1.free(); - maskDict->lookup("Height", &obj1); - if (obj1.isNull()) { - obj1.free(); - maskDict->lookup("H", &obj1); - } - if (!obj1.isInt()) { - goto err2; - } - maskHeight = obj1.getInt(); - obj1.free(); - maskDict->lookup("BitsPerComponent", &obj1); - if (obj1.isNull()) { - obj1.free(); - maskDict->lookup("BPC", &obj1); - } - if (!obj1.isInt()) { - goto err2; - } - maskBits = obj1.getInt(); - obj1.free(); - maskDict->lookup("ColorSpace", &obj1); - if (obj1.isNull()) { - obj1.free(); - maskDict->lookup("CS", &obj1); - } - if (obj1.isName()) { - res->lookupColorSpace(obj1.getName(), &obj2); - if (!obj2.isNull()) { - obj1.free(); - obj1 = obj2; - } else { - obj2.free(); - } - } - maskColorSpace = GfxColorSpace::parse(&obj1); - obj1.free(); - if (!maskColorSpace || maskColorSpace->getMode() != csDeviceGray) { - goto err1; - } - maskDict->lookup("Decode", &obj1); - if (obj1.isNull()) { - obj1.free(); - maskDict->lookup("D", &obj1); - } - maskColorMap = new GfxImageColorMap(maskBits, &obj1, maskColorSpace); - obj1.free(); - if (!maskColorMap->isOk()) { - delete maskColorMap; - goto err1; - } - //~ handle the Matte entry - haveSoftMask = gTrue; - } else if (maskObj.isArray()) { - // color key mask - for (i = 0; - i < maskObj.arrayGetLength() && i < 2*gfxColorMaxComps; - ++i) { - maskObj.arrayGet(i, &obj1); - maskColors[i] = obj1.getInt(); - obj1.free(); - } - haveColorKeyMask = gTrue; - } else if (maskObj.isStream()) { - // explicit mask - if (inlineImg) { - goto err1; - } - maskStr = maskObj.getStream(); - maskDict = maskObj.streamGetDict(); - maskDict->lookup("Width", &obj1); - if (obj1.isNull()) { - obj1.free(); - maskDict->lookup("W", &obj1); - } - if (!obj1.isInt()) { - goto err2; - } - maskWidth = obj1.getInt(); - obj1.free(); - maskDict->lookup("Height", &obj1); - if (obj1.isNull()) { - obj1.free(); - maskDict->lookup("H", &obj1); - } - if (!obj1.isInt()) { - goto err2; - } - maskHeight = obj1.getInt(); - obj1.free(); - maskDict->lookup("ImageMask", &obj1); - if (obj1.isNull()) { - obj1.free(); - maskDict->lookup("IM", &obj1); - } - if (!obj1.isBool() || !obj1.getBool()) { - goto err2; - } - obj1.free(); - maskInvert = gFalse; - maskDict->lookup("Decode", &obj1); - if (obj1.isNull()) { - obj1.free(); - maskDict->lookup("D", &obj1); - } - if (obj1.isArray()) { - obj1.arrayGet(0, &obj2); - if (obj2.isInt() && obj2.getInt() == 1) { - maskInvert = gTrue; - } - obj2.free(); - } else if (!obj1.isNull()) { - goto err2; - } - obj1.free(); - haveExplicitMask = gTrue; - } - - // draw it - if (haveSoftMask) { - out->drawSoftMaskedImage(state, ref, str, width, height, colorMap, - maskStr, maskWidth, maskHeight, maskColorMap); - delete maskColorMap; - } else if (haveExplicitMask) { - out->drawMaskedImage(state, ref, str, width, height, colorMap, - maskStr, maskWidth, maskHeight, maskInvert); - } else { - out->drawImage(state, ref, str, width, height, colorMap, - haveColorKeyMask ? maskColors : (int *)NULL, inlineImg); - } - delete colorMap; - - maskObj.free(); - smaskObj.free(); - } - - if ((i = width * height) > 1000) { - i = 1000; - } - updateLevel += i; - - return; - - err2: - obj1.free(); - err1: - error(getPos(), "Bad image parameters"); -} - -void Gfx::doForm(Object *str) { - Dict *dict; - GBool transpGroup, isolated, knockout; - GfxColorSpace *blendingColorSpace; - Object matrixObj, bboxObj; - double m[6], bbox[4]; - Object resObj; - Dict *resDict; - Object obj1, obj2, obj3; - int i; - - // check for excessive recursion - if (formDepth > 20) { - return; - } - - // get stream dict - dict = str->streamGetDict(); - - // check form type - dict->lookup("FormType", &obj1); - if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) { - error(getPos(), "Unknown form type"); - } - obj1.free(); - - // get bounding box - dict->lookup("BBox", &bboxObj); - if (!bboxObj.isArray()) { - bboxObj.free(); - error(getPos(), "Bad form bounding box"); - return; - } - for (i = 0; i < 4; ++i) { - bboxObj.arrayGet(i, &obj1); - bbox[i] = obj1.getNum(); - obj1.free(); - } - bboxObj.free(); - - // get matrix - dict->lookup("Matrix", &matrixObj); - if (matrixObj.isArray()) { - for (i = 0; i < 6; ++i) { - matrixObj.arrayGet(i, &obj1); - m[i] = obj1.getNum(); - obj1.free(); - } - } else { - m[0] = 1; m[1] = 0; - m[2] = 0; m[3] = 1; - m[4] = 0; m[5] = 0; - } - matrixObj.free(); - - // get resources - dict->lookup("Resources", &resObj); - resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL; - - // check for a transparency group - transpGroup = isolated = knockout = gFalse; - blendingColorSpace = NULL; - if (dict->lookup("Group", &obj1)->isDict()) { - if (obj1.dictLookup("S", &obj2)->isName("Transparency")) { - transpGroup = gTrue; - if (!obj1.dictLookup("CS", &obj3)->isNull()) { - blendingColorSpace = GfxColorSpace::parse(&obj3); - } - obj3.free(); - if (obj1.dictLookup("I", &obj3)->isBool()) { - isolated = obj3.getBool(); - } - obj3.free(); - if (obj1.dictLookup("K", &obj3)->isBool()) { - knockout = obj3.getBool(); - } - obj3.free(); - } - obj2.free(); - } - obj1.free(); - - // draw it - ++formDepth; - doForm1(str, resDict, m, bbox, - transpGroup, gFalse, blendingColorSpace, isolated, knockout); - --formDepth; - - if (blendingColorSpace) { - delete blendingColorSpace; - } - resObj.free(); -} - -void Gfx::doForm1(Object *str, Dict *resDict, double *matrix, double *bbox, - GBool transpGroup, GBool softMask, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool alpha, Function *transferFunc, - GfxColor *backdropColor) { - Parser *oldParser; - double oldBaseMatrix[6]; - int i; - - // push new resources on stack - pushResources(resDict); - - // save current graphics state - saveState(); - - // kill any pre-existing path - state->clearPath(); - - // save current parser - oldParser = parser; - - // set form transformation matrix - state->concatCTM(matrix[0], matrix[1], matrix[2], - matrix[3], matrix[4], matrix[5]); - out->updateCTM(state, matrix[0], matrix[1], matrix[2], - matrix[3], matrix[4], matrix[5]); - - // set form bounding box - state->moveTo(bbox[0], bbox[1]); - state->lineTo(bbox[2], bbox[1]); - state->lineTo(bbox[2], bbox[3]); - state->lineTo(bbox[0], bbox[3]); - state->closePath(); - state->clip(); - out->clip(state); - state->clearPath(); - - if (softMask || transpGroup) { - if (state->getBlendMode() != gfxBlendNormal) { - state->setBlendMode(gfxBlendNormal); - out->updateBlendMode(state); - } - if (state->getFillOpacity() != 1) { - state->setFillOpacity(1); - out->updateFillOpacity(state); - } - if (state->getStrokeOpacity() != 1) { - state->setStrokeOpacity(1); - out->updateStrokeOpacity(state); - } - out->clearSoftMask(state); - out->beginTransparencyGroup(state, bbox, blendingColorSpace, - isolated, knockout, softMask); - } - GfxState*old_state = state; - - // set new base matrix - for (i = 0; i < 6; ++i) { - oldBaseMatrix[i] = baseMatrix[i]; - baseMatrix[i] = state->getCTM()[i]; - } - - // draw the form - display(str, gFalse); - - if (softMask || transpGroup) { - // restore graphics state - while(state != old_state) - restoreState(); - out->endTransparencyGroup(state); - } - - // restore base matrix - for (i = 0; i < 6; ++i) { - baseMatrix[i] = oldBaseMatrix[i]; - } - - // restore parser - parser = oldParser; - - // restore graphics state - restoreState(); - - // pop resource stack - popResources(); - - if (softMask) { - out->setSoftMask(state, bbox, alpha, transferFunc, backdropColor); - } else if (transpGroup) { - out->paintTransparencyGroup(state, bbox); - } - - return; -} - -//------------------------------------------------------------------------ -// in-line image operators -//------------------------------------------------------------------------ - -void Gfx::opBeginImage(Object args[], int numArgs) { - Stream *str; - int c1, c2; - - // build dict/stream - str = buildImageStream(); - - // display the image - if (str) { - doImage(NULL, str, gTrue); - - // skip 'EI' tag - c1 = str->getUndecodedStream()->getChar(); - c2 = str->getUndecodedStream()->getChar(); - while (!(c1 == 'E' && c2 == 'I') && c2 != EOF) { - c1 = c2; - c2 = str->getUndecodedStream()->getChar(); - } - delete str; - } -} - -Stream *Gfx::buildImageStream() { - Object dict; - Object obj; - char *key; - Stream *str; - - // build dictionary - dict.initDict(xref); - parser->getObj(&obj); - while (!obj.isCmd("ID") && !obj.isEOF()) { - if (!obj.isName()) { - error(getPos(), "Inline image dictionary key must be a name object"); - obj.free(); - } else { - key = copyString(obj.getName()); - obj.free(); - parser->getObj(&obj); - if (obj.isEOF() || obj.isError()) { - gfree(key); - break; - } - dict.dictAdd(key, &obj); - } - parser->getObj(&obj); - } - if (obj.isEOF()) { - error(getPos(), "End of file in inline image"); - obj.free(); - dict.free(); - return NULL; - } - obj.free(); - - // make stream - if(!parser->getStream()) { - error(getPos(), "Couldn't get stream"); - return NULL; - } - str = new EmbedStream(parser->getStream(), &dict, gFalse, 0); - str = str->addFilters(&dict); - - return str; -} - -void Gfx::opImageData(Object args[], int numArgs) { - error(getPos(), "Internal: got 'ID' operator"); -} - -void Gfx::opEndImage(Object args[], int numArgs) { - error(getPos(), "Internal: got 'EI' operator"); -} - -//------------------------------------------------------------------------ -// type 3 font operators -//------------------------------------------------------------------------ - -void Gfx::opSetCharWidth(Object args[], int numArgs) { - out->type3D0(state, args[0].getNum(), args[1].getNum()); -} - -void Gfx::opSetCacheDevice(Object args[], int numArgs) { - out->type3D1(state, args[0].getNum(), args[1].getNum(), - args[2].getNum(), args[3].getNum(), - args[4].getNum(), args[5].getNum()); -} - -//------------------------------------------------------------------------ -// compatibility operators -//------------------------------------------------------------------------ - -void Gfx::opBeginIgnoreUndef(Object args[], int numArgs) { - ++ignoreUndef; -} - -void Gfx::opEndIgnoreUndef(Object args[], int numArgs) { - if (ignoreUndef > 0) - --ignoreUndef; -} - -//------------------------------------------------------------------------ -// marked content operators -//------------------------------------------------------------------------ - -void Gfx::opBeginMarkedContent(Object args[], int numArgs) { - if (printCommands) { - printf(" marked content: %s ", args[0].getName()); - if (numArgs == 2) - args[2].print(stdout); - printf("\n"); - fflush(stdout); - } -} - -void Gfx::opEndMarkedContent(Object args[], int numArgs) { -} - -void Gfx::opMarkPoint(Object args[], int numArgs) { - if (printCommands) { - printf(" mark point: %s ", args[0].getName()); - if (numArgs == 2) - args[2].print(stdout); - printf("\n"); - fflush(stdout); - } -} - -//------------------------------------------------------------------------ -// misc -//------------------------------------------------------------------------ - -void Gfx::drawAnnot(Object *str, AnnotBorderStyle *borderStyle, - double xMin, double yMin, double xMax, double yMax) { - Dict *dict, *resDict; - Object matrixObj, bboxObj, resObj; - Object obj1; - double m[6], bbox[4], ictm[6]; - double *ctm; - double formX0, formY0, formX1, formY1; - double annotX0, annotY0, annotX1, annotY1; - double det, x, y, sx, sy; - double r, g, b; - GfxColor color; - double *dash, *dash2; - int dashLength; - int i; - - //~ can we assume that we're in default user space? - //~ (i.e., baseMatrix = ctm) - - // transform the annotation bbox from default user space to user - // space: (bbox * baseMatrix) * iCTM - ctm = state->getCTM(); - det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); - ictm[0] = ctm[3] * det; - ictm[1] = -ctm[1] * det; - ictm[2] = -ctm[2] * det; - ictm[3] = ctm[0] * det; - ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; - ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; - x = baseMatrix[0] * xMin + baseMatrix[2] * yMin + baseMatrix[4]; - y = baseMatrix[1] * xMin + baseMatrix[3] * yMin + baseMatrix[5]; - annotX0 = ictm[0] * x + ictm[2] * y + ictm[4]; - annotY0 = ictm[1] * x + ictm[3] * y + ictm[5]; - x = baseMatrix[0] * xMax + baseMatrix[2] * yMax + baseMatrix[4]; - y = baseMatrix[1] * xMax + baseMatrix[3] * yMax + baseMatrix[5]; - annotX1 = ictm[0] * x + ictm[2] * y + ictm[4]; - annotY1 = ictm[1] * x + ictm[3] * y + ictm[5]; - if (annotX0 > annotX1) { - x = annotX0; annotX0 = annotX1; annotX1 = x; - } - if (annotY0 > annotY1) { - y = annotY0; annotY0 = annotY1; annotY1 = y; - } - - // draw the appearance stream (if there is one) - if (str->isStream()) { - - // get stream dict - dict = str->streamGetDict(); - - // get the form bounding box - dict->lookup("BBox", &bboxObj); - if (!bboxObj.isArray()) { - bboxObj.free(); - error(getPos(), "Bad form bounding box"); - return; - } - for (i = 0; i < 4; ++i) { - bboxObj.arrayGet(i, &obj1); - bbox[i] = obj1.getNum(); - obj1.free(); - } - bboxObj.free(); - - // get the form matrix - dict->lookup("Matrix", &matrixObj); - if (matrixObj.isArray()) { - for (i = 0; i < 6; ++i) { - matrixObj.arrayGet(i, &obj1); - m[i] = obj1.getNum(); - obj1.free(); - } - } else { - m[0] = 1; m[1] = 0; - m[2] = 0; m[3] = 1; - m[4] = 0; m[5] = 0; - } - matrixObj.free(); - - // transform the form bbox from form space to user space - formX0 = bbox[0] * m[0] + bbox[1] * m[2] + m[4]; - formY0 = bbox[0] * m[1] + bbox[1] * m[3] + m[5]; - formX1 = bbox[2] * m[0] + bbox[3] * m[2] + m[4]; - formY1 = bbox[2] * m[1] + bbox[3] * m[3] + m[5]; - if (formX0 > formX1) { - x = formX0; formX0 = formX1; formX1 = x; - } - if (formY0 > formY1) { - y = formY0; formY0 = formY1; formY1 = y; - } - - // scale the form to fit the annotation bbox - if (formX1 == formX0) { - // this shouldn't happen - sx = 1; - } else { - sx = (annotX1 - annotX0) / (formX1 - formX0); - } - if (formY1 == formY0) { - // this shouldn't happen - sy = 1; - } else { - sy = (annotY1 - annotY0) / (formY1 - formY0); - } - m[0] *= sx; - m[2] *= sx; - m[4] = (m[4] - formX0) * sx + annotX0; - m[1] *= sy; - m[3] *= sy; - m[5] = (m[5] - formY0) * sy + annotY0; - - // get resources - dict->lookup("Resources", &resObj); - resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL; - - // draw it - doForm1(str, resDict, m, bbox); - - resObj.free(); - } - - // draw the border - if (borderStyle && borderStyle->getWidth() > 0) { - if (state->getStrokeColorSpace()->getMode() != csDeviceRGB) { - state->setStrokePattern(NULL); - state->setStrokeColorSpace(new GfxDeviceRGBColorSpace()); - out->updateStrokeColorSpace(state); - } - borderStyle->getColor(&r, &g, &b); - color.c[0] = dblToCol(r); - color.c[1] = dblToCol(g); - color.c[2] = dblToCol(b); - state->setStrokeColor(&color); - out->updateStrokeColor(state); - // compute the width scale factor when going from default user - // space to user space - x = (baseMatrix[0] + baseMatrix[2]) * ictm[0] + - (baseMatrix[1] + baseMatrix[3]) * ictm[2]; - y = (baseMatrix[0] + baseMatrix[2]) * ictm[1] + - (baseMatrix[1] + baseMatrix[3]) * ictm[3]; - x = sqrt(0.5 * (x * x + y * y)); - state->setLineWidth(x * borderStyle->getWidth()); - out->updateLineWidth(state); - borderStyle->getDash(&dash, &dashLength); - if (borderStyle->getType() == annotBorderDashed && dashLength > 0) { - dash2 = (double *)gmallocn(dashLength, sizeof(double)); - for (i = 0; i < dashLength; ++i) { - dash2[i] = x * dash[i]; - } - state->setLineDash(dash2, dashLength, 0); - out->updateLineDash(state); - } - //~ this doesn't currently handle the beveled and engraved styles - state->clearPath(); - state->moveTo(annotX0, out->upsideDown() ? annotY1 : annotY0); - state->lineTo(annotX1, out->upsideDown() ? annotY1 : annotY0); - if (borderStyle->getType() != annotBorderUnderlined) { - state->lineTo(annotX1, out->upsideDown() ? annotY0 : annotY1); - state->lineTo(annotX0, out->upsideDown() ? annotY0 : annotY1); - state->closePath(); - } - out->stroke(state); - } -} - -void Gfx::saveState() { - out->saveState(state); - state = state->save(); -} - -void Gfx::restoreState() { - state = state->restore(); - out->restoreState(state); -} - -void Gfx::pushResources(Dict *resDict) { - res = new GfxResources(xref, resDict, res); -} - -void Gfx::popResources() { - GfxResources *resPtr; - - resPtr = res->getNext(); - delete res; - res = resPtr; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.h deleted file mode 100644 index 0e4263cee..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Gfx.h +++ /dev/null @@ -1,312 +0,0 @@ -//======================================================================== -// -// Gfx.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef GFX_H -#define GFX_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -class GString; -class XRef; -class Array; -class Stream; -class Parser; -class Dict; -class Function; -class OutputDev; -class GfxFontDict; -class GfxFont; -class GfxPattern; -class GfxTilingPattern; -class GfxShadingPattern; -class GfxShading; -class GfxFunctionShading; -class GfxAxialShading; -class GfxRadialShading; -class GfxGouraudTriangleShading; -class GfxPatchMeshShading; -struct GfxPatch; -class GfxState; -struct GfxColor; -class GfxColorSpace; -class Gfx; -class PDFRectangle; -class AnnotBorderStyle; - -//------------------------------------------------------------------------ - -enum GfxClipType { - clipNone, - clipNormal, - clipEO -}; - -enum TchkType { - tchkBool, // boolean - tchkInt, // integer - tchkNum, // number (integer or real) - tchkString, // string - tchkName, // name - tchkArray, // array - tchkProps, // properties (dictionary or name) - tchkSCN, // scn/SCN args (number of name) - tchkNone // used to avoid empty initializer lists -}; - -#define maxArgs 33 - -struct Operator { - char name[4]; - int numArgs; - TchkType tchk[maxArgs]; - void (Gfx::*func)(Object args[], int numArgs); -}; - -//------------------------------------------------------------------------ - -class GfxResources { -public: - - GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA); - ~GfxResources(); - - GfxFont *lookupFont(char *name); - GBool lookupXObject(char *name, Object *obj); - GBool lookupXObjectNF(char *name, Object *obj); - void lookupColorSpace(char *name, Object *obj); - GfxPattern *lookupPattern(char *name); - GfxShading *lookupShading(char *name); - GBool lookupGState(char *name, Object *obj); - - GfxResources *getNext() { return next; } - -private: - - GfxFontDict *fonts; - Object xObjDict; - Object colorSpaceDict; - Object patternDict; - Object shadingDict; - Object gStateDict; - GfxResources *next; -}; - -//------------------------------------------------------------------------ -// Gfx -//------------------------------------------------------------------------ - -class Gfx { -public: - - // Constructor for regular output. - Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict, - double hDPI, double vDPI, PDFRectangle *box, - PDFRectangle *cropBox, int rotate, - GBool (*abortCheckCbkA)(void *data) = NULL, - void *abortCheckCbkDataA = NULL); - - // Constructor for a sub-page object. - Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict, - PDFRectangle *box, PDFRectangle *cropBox, - GBool (*abortCheckCbkA)(void *data) = NULL, - void *abortCheckCbkDataA = NULL); - - ~Gfx(); - - // Interpret a stream or array of streams. - void display(Object *obj, GBool topLevel = gTrue); - - // Display an annotation, given its appearance (a Form XObject), - // border style, and bounding box (in default user space). - void drawAnnot(Object *str, AnnotBorderStyle *borderStyle, - double xMin, double yMin, double xMax, double yMax); - - // Save graphics state. - void saveState(); - - // Restore graphics state. - void restoreState(); - - // Get the current graphics state object. - GfxState *getState() { return state; } - -private: - - XRef *xref; // the xref table for this PDF file - OutputDev *out; // output device - GBool subPage; // is this a sub-page object? - GBool printCommands; // print the drawing commands (for debugging) - GfxResources *res; // resource stack - int updateLevel; - - GfxState *state; // current graphics state - GBool fontChanged; // set if font or text matrix has changed - GfxClipType clip; // do a clip? - int ignoreUndef; // current BX/EX nesting level - double baseMatrix[6]; // default matrix for most recent - // page/form/pattern - int formDepth; - - Parser *parser; // parser for page content stream(s) - - GBool // callback to check for an abort - (*abortCheckCbk)(void *data); - void *abortCheckCbkData; - - static Operator opTab[]; // table of operators - - void go(GBool topLevel); - void execOp(Object *cmd, Object args[], int numArgs); - Operator *findOp(char *name); - GBool checkArg(Object *arg, TchkType type); - int getPos(); - - // graphics state operators - void opSave(Object args[], int numArgs); - void opRestore(Object args[], int numArgs); - void opConcat(Object args[], int numArgs); - void opSetDash(Object args[], int numArgs); - void opSetFlat(Object args[], int numArgs); - void opSetLineJoin(Object args[], int numArgs); - void opSetLineCap(Object args[], int numArgs); - void opSetMiterLimit(Object args[], int numArgs); - void opSetLineWidth(Object args[], int numArgs); - void opSetExtGState(Object args[], int numArgs); - void doSoftMask(Object *str, GBool alpha, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - Function *transferFunc, GfxColor *backdropColor); - void opSetRenderingIntent(Object args[], int numArgs); - - // color operators - void opSetFillGray(Object args[], int numArgs); - void opSetStrokeGray(Object args[], int numArgs); - void opSetFillCMYKColor(Object args[], int numArgs); - void opSetStrokeCMYKColor(Object args[], int numArgs); - void opSetFillRGBColor(Object args[], int numArgs); - void opSetStrokeRGBColor(Object args[], int numArgs); - void opSetFillColorSpace(Object args[], int numArgs); - void opSetStrokeColorSpace(Object args[], int numArgs); - void opSetFillColor(Object args[], int numArgs); - void opSetStrokeColor(Object args[], int numArgs); - void opSetFillColorN(Object args[], int numArgs); - void opSetStrokeColorN(Object args[], int numArgs); - - // path segment operators - void opMoveTo(Object args[], int numArgs); - void opLineTo(Object args[], int numArgs); - void opCurveTo(Object args[], int numArgs); - void opCurveTo1(Object args[], int numArgs); - void opCurveTo2(Object args[], int numArgs); - void opRectangle(Object args[], int numArgs); - void opClosePath(Object args[], int numArgs); - - // path painting operators - void opEndPath(Object args[], int numArgs); - void opStroke(Object args[], int numArgs); - void opCloseStroke(Object args[], int numArgs); - void opFill(Object args[], int numArgs); - void opEOFill(Object args[], int numArgs); - void opFillStroke(Object args[], int numArgs); - void opCloseFillStroke(Object args[], int numArgs); - void opEOFillStroke(Object args[], int numArgs); - void opCloseEOFillStroke(Object args[], int numArgs); - void doPatternFill(GBool eoFill); - void doPatternStroke(); - void doTilingPatternFill(GfxTilingPattern *tPat, - GBool stroke, GBool eoFill); - void doShadingPatternFill(GfxShadingPattern *sPat, - GBool stroke, GBool eoFill); - void opShFill(Object args[], int numArgs); - void doFunctionShFill(GfxFunctionShading *shading); - void doFunctionShFill1(GfxFunctionShading *shading, - double x0, double y0, - double x1, double y1, - GfxColor *colors, int depth); - void doAxialShFill(GfxAxialShading *shading); - void doRadialShFill(GfxRadialShading *shading); - void doGouraudTriangleShFill(GfxGouraudTriangleShading *shading); - void gouraudFillTriangle(double x0, double y0, GfxColor *color0, - double x1, double y1, GfxColor *color1, - double x2, double y2, GfxColor *color2, - int nComps, int depth); - void doPatchMeshShFill(GfxPatchMeshShading *shading); - void fillPatch(GfxPatch *patch, int nComps, int depth); - void doEndPath(); - - // path clipping operators - void opClip(Object args[], int numArgs); - void opEOClip(Object args[], int numArgs); - - // text object operators - void opBeginText(Object args[], int numArgs); - void opEndText(Object args[], int numArgs); - - // text state operators - void opSetCharSpacing(Object args[], int numArgs); - void opSetFont(Object args[], int numArgs); - void opSetTextLeading(Object args[], int numArgs); - void opSetTextRender(Object args[], int numArgs); - void opSetTextRise(Object args[], int numArgs); - void opSetWordSpacing(Object args[], int numArgs); - void opSetHorizScaling(Object args[], int numArgs); - - // text positioning operators - void opTextMove(Object args[], int numArgs); - void opTextMoveSet(Object args[], int numArgs); - void opSetTextMatrix(Object args[], int numArgs); - void opTextNextLine(Object args[], int numArgs); - - // text string operators - void opShowText(Object args[], int numArgs); - void opMoveShowText(Object args[], int numArgs); - void opMoveSetShowText(Object args[], int numArgs); - void opShowSpaceText(Object args[], int numArgs); - void doShowText(GString *s); - - // XObject operators - void opXObject(Object args[], int numArgs); - void doImage(Object *ref, Stream *str, GBool inlineImg); - void doForm(Object *str); - void doForm1(Object *str, Dict *resDict, double *matrix, double *bbox, - GBool transpGroup = gFalse, GBool softMask = gFalse, - GfxColorSpace *blendingColorSpace = NULL, - GBool isolated = gFalse, GBool knockout = gFalse, - GBool alpha = gFalse, Function *transferFunc = NULL, - GfxColor *backdropColor = NULL); - - // in-line image operators - void opBeginImage(Object args[], int numArgs); - Stream *buildImageStream(); - void opImageData(Object args[], int numArgs); - void opEndImage(Object args[], int numArgs); - - // type 3 font operators - void opSetCharWidth(Object args[], int numArgs); - void opSetCacheDevice(Object args[], int numArgs); - - // compatibility operators - void opBeginIgnoreUndef(Object args[], int numArgs); - void opEndIgnoreUndef(Object args[], int numArgs); - - // marked content operators - void opBeginMarkedContent(Object args[], int numArgs); - void opEndMarkedContent(Object args[], int numArgs); - void opMarkPoint(Object args[], int numArgs); - - void pushResources(Dict *resDict); - void popResources(); -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.cc deleted file mode 100644 index 2692144a2..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.cc +++ /dev/null @@ -1,1576 +0,0 @@ -//======================================================================== -// -// GfxFont.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#include "gmem.h" -#include "Error.h" -#include "Object.h" -#include "Dict.h" -#include "GlobalParams.h" -#include "CMap.h" -#include "CharCodeToUnicode.h" -#include "FontEncodingTables.h" -#include "BuiltinFontTables.h" -#include "FoFiType1.h" -#include "FoFiType1C.h" -#include "FoFiTrueType.h" -#include "GfxFont.h" - -//------------------------------------------------------------------------ - -struct StdFontMapEntry { - char *altName; - char *properName; -}; - -// Acrobat 4.0 and earlier substituted Base14-compatible fonts without -// providing Widths and a FontDescriptor, so we munge the names into -// the proper Base14 names. This table is from implementation note 44 -// in the PDF 1.4 spec, with some additions based on empirical -// evidence. -static StdFontMapEntry stdFontMap[] = { - { "Arial", "Helvetica" }, - { "Arial,Bold", "Helvetica-Bold" }, - { "Arial,BoldItalic", "Helvetica-BoldOblique" }, - { "Arial,Italic", "Helvetica-Oblique" }, - { "Arial-Bold", "Helvetica-Bold" }, - { "Arial-BoldItalic", "Helvetica-BoldOblique" }, - { "Arial-BoldItalicMT", "Helvetica-BoldOblique" }, - { "Arial-BoldMT", "Helvetica-Bold" }, - { "Arial-Italic", "Helvetica-Oblique" }, - { "Arial-ItalicMT", "Helvetica-Oblique" }, - { "ArialMT", "Helvetica" }, - { "Courier,Bold", "Courier-Bold" }, - { "Courier,BoldItalic", "Courier-BoldOblique" }, - { "Courier,Italic", "Courier-Oblique" }, - { "CourierNew", "Courier" }, - { "CourierNew,Bold", "Courier-Bold" }, - { "CourierNew,BoldItalic", "Courier-BoldOblique" }, - { "CourierNew,Italic", "Courier-Oblique" }, - { "CourierNew-Bold", "Courier-Bold" }, - { "CourierNew-BoldItalic", "Courier-BoldOblique" }, - { "CourierNew-Italic", "Courier-Oblique" }, - { "CourierNewPS-BoldItalicMT", "Courier-BoldOblique" }, - { "CourierNewPS-BoldMT", "Courier-Bold" }, - { "CourierNewPS-ItalicMT", "Courier-Oblique" }, - { "CourierNewPSMT", "Courier" }, - { "Helvetica,Bold", "Helvetica-Bold" }, - { "Helvetica,BoldItalic", "Helvetica-BoldOblique" }, - { "Helvetica,Italic", "Helvetica-Oblique" }, - { "Helvetica-BoldItalic", "Helvetica-BoldOblique" }, - { "Helvetica-Italic", "Helvetica-Oblique" }, - { "Symbol,Bold", "Symbol" }, - { "Symbol,BoldItalic", "Symbol" }, - { "Symbol,Italic", "Symbol" }, - { "TimesNewRoman", "Times-Roman" }, - { "TimesNewRoman,Bold", "Times-Bold" }, - { "TimesNewRoman,BoldItalic", "Times-BoldItalic" }, - { "TimesNewRoman,Italic", "Times-Italic" }, - { "TimesNewRoman-Bold", "Times-Bold" }, - { "TimesNewRoman-BoldItalic", "Times-BoldItalic" }, - { "TimesNewRoman-Italic", "Times-Italic" }, - { "TimesNewRomanPS", "Times-Roman" }, - { "TimesNewRomanPS-Bold", "Times-Bold" }, - { "TimesNewRomanPS-BoldItalic", "Times-BoldItalic" }, - { "TimesNewRomanPS-BoldItalicMT", "Times-BoldItalic" }, - { "TimesNewRomanPS-BoldMT", "Times-Bold" }, - { "TimesNewRomanPS-Italic", "Times-Italic" }, - { "TimesNewRomanPS-ItalicMT", "Times-Italic" }, - { "TimesNewRomanPSMT", "Times-Roman" }, - { "TimesNewRomanPSMT,Bold", "Times-Bold" }, - { "TimesNewRomanPSMT,BoldItalic", "Times-BoldItalic" }, - { "TimesNewRomanPSMT,Italic", "Times-Italic" } -}; - -//------------------------------------------------------------------------ -// GfxFont -//------------------------------------------------------------------------ - -GfxFont *GfxFont::makeFont(XRef *xref, char *tagA, Ref idA, Dict *fontDict) { - GString *nameA; - GfxFont *font; - Object obj1; - - // get base font name - nameA = NULL; - fontDict->lookup("BaseFont", &obj1); - if (obj1.isName()) { - nameA = new GString(obj1.getName()); - } - obj1.free(); - - // get font type - font = NULL; - fontDict->lookup("Subtype", &obj1); - if (obj1.isName("Type1") || obj1.isName("MMType1")) { - font = new Gfx8BitFont(xref, tagA, idA, nameA, fontType1, fontDict); - } else if (obj1.isName("Type1C")) { - font = new Gfx8BitFont(xref, tagA, idA, nameA, fontType1C, fontDict); - } else if (obj1.isName("Type3")) { - font = new Gfx8BitFont(xref, tagA, idA, nameA, fontType3, fontDict); - } else if (obj1.isName("TrueType")) { - font = new Gfx8BitFont(xref, tagA, idA, nameA, fontTrueType, fontDict); - } else if (obj1.isName("Type0")) { - font = new GfxCIDFont(xref, tagA, idA, nameA, fontDict); - } else { - error(-1, "Unknown font type: '%s'", - obj1.isName() ? obj1.getName() : "???"); - font = new Gfx8BitFont(xref, tagA, idA, nameA, fontUnknownType, fontDict); - } - obj1.free(); - - return font; -} - -GfxFont::GfxFont(char *tagA, Ref idA, GString *nameA) { - ok = gFalse; - tag = new GString(tagA); - id = idA; - name = nameA; - origName = nameA; - embFontName = NULL; - extFontFile = NULL; -} - -GfxFont::~GfxFont() { - delete tag; - if (origName && origName != name) { - delete origName; - } - if (name) { - delete name; - } - if (embFontName) { - delete embFontName; - } - if (extFontFile) { - delete extFontFile; - } -} - -void GfxFont::readFontDescriptor(XRef *xref, Dict *fontDict) { - Object obj1, obj2, obj3, obj4; - double t; - int i; - - // assume Times-Roman by default (for substitution purposes) - flags = fontSerif; - - embFontID.num = -1; - embFontID.gen = -1; - missingWidth = 0; - - if (fontDict->lookup("FontDescriptor", &obj1)->isDict()) { - - // get flags - if (obj1.dictLookup("Flags", &obj2)->isInt()) { - flags = obj2.getInt(); - } - obj2.free(); - - // get name - obj1.dictLookup("FontName", &obj2); - if (obj2.isName()) { - embFontName = new GString(obj2.getName()); - } - obj2.free(); - - // look for embedded font file - if (obj1.dictLookupNF("FontFile", &obj2)->isRef()) { - embFontID = obj2.getRef(); - if (type != fontType1) { - error(-1, "Mismatch between font type and embedded font file"); - type = isCIDFont() ? fontCIDType0 : fontType1; - } - } - obj2.free(); - if (embFontID.num == -1 && - obj1.dictLookupNF("FontFile2", &obj2)->isRef()) { - embFontID = obj2.getRef(); - if (type != fontTrueType && type != fontCIDType2) { - error(-1, "Mismatch between font type and embedded font file"); - type = type == fontCIDType0 ? fontCIDType2 : fontTrueType; - } - } - obj2.free(); - if (embFontID.num == -1 && - obj1.dictLookupNF("FontFile3", &obj2)->isRef()) { - if (obj2.fetch(xref, &obj3)->isStream()) { - obj3.streamGetDict()->lookup("Subtype", &obj4); - if (obj4.isName("Type1")) { - embFontID = obj2.getRef(); - if (type != fontType1) { - error(-1, "Mismatch between font type and embedded font file"); - type = fontType1; - } - } else if (obj4.isName("Type1C")) { - embFontID = obj2.getRef(); - if (type != fontType1 && type != fontType1C) { - error(-1, "Mismatch between font type and embedded font file"); - } - type = fontType1C; - } else if (obj4.isName("TrueType")) { - embFontID = obj2.getRef(); - if (type != fontTrueType) { - error(-1, "Mismatch between font type and embedded font file"); - type = fontTrueType; - } - } else if (obj4.isName("CIDFontType0C")) { - embFontID = obj2.getRef(); - if (type != fontCIDType0) { - error(-1, "Mismatch between font type and embedded font file"); - } - type = fontCIDType0C; - } else if (obj4.isName("OpenType")) { - embFontID = obj2.getRef(); - if (type == fontTrueType) { - type = fontTrueTypeOT; - } else if (type == fontType1) { - type = fontType1COT; - } else if (type == fontCIDType0) { - type = fontCIDType0COT; - } else if (type == fontCIDType2) { - type = fontCIDType2OT; - } else { - error(-1, "Mismatch between font type and embedded font file"); - } - } else { - error(-1, "Unknown embedded font type '%s'", - obj4.isName() ? obj4.getName() : "???"); - } - obj4.free(); - } - obj3.free(); - } - obj2.free(); - - // look for MissingWidth - obj1.dictLookup("MissingWidth", &obj2); - if (obj2.isNum()) { - missingWidth = obj2.getNum(); - } - obj2.free(); - - // get Ascent and Descent - obj1.dictLookup("Ascent", &obj2); - if (obj2.isNum()) { - t = 0.001 * obj2.getNum(); - // some broken font descriptors set ascent and descent to 0 - if (t != 0) { - ascent = t; - } - } - obj2.free(); - obj1.dictLookup("Descent", &obj2); - if (obj2.isNum()) { - t = 0.001 * obj2.getNum(); - // some broken font descriptors set ascent and descent to 0 - if (t != 0) { - descent = t; - } - // some broken font descriptors specify a positive descent - if (descent > 0) { - descent = -descent; - } - } - obj2.free(); - - // font FontBBox - if (obj1.dictLookup("FontBBox", &obj2)->isArray()) { - for (i = 0; i < 4 && i < obj2.arrayGetLength(); ++i) { - if (obj2.arrayGet(i, &obj3)->isNum()) { - fontBBox[i] = 0.001 * obj3.getNum(); - } - obj3.free(); - } - } - obj2.free(); - - } - obj1.free(); -} - -CharCodeToUnicode *GfxFont::readToUnicodeCMap(Dict *fontDict, int nBits, - CharCodeToUnicode *ctu) { - GString *buf; - Object obj1; - int c; - - if (!fontDict->lookup("ToUnicode", &obj1)->isStream()) { - obj1.free(); - return NULL; - } - buf = new GString(); - obj1.streamReset(); - while ((c = obj1.streamGetChar()) != EOF) { - buf->append(c); - } - obj1.streamClose(); - obj1.free(); - if (ctu) { - ctu->mergeCMap(buf, nBits); - } else { - ctu = CharCodeToUnicode::parseCMap(buf, nBits); - } - delete buf; - return ctu; -} - -void GfxFont::findExtFontFile() { - static char *type1Exts[] = { ".pfa", ".pfb", ".ps", "", NULL }; - static char *ttExts[] = { ".ttf", NULL }; - - if (name) { - if (type == fontType1) { - extFontFile = globalParams->findFontFile(name, type1Exts); - } else if (type == fontTrueType) { - extFontFile = globalParams->findFontFile(name, ttExts); - } - } -} - -char *GfxFont::readExtFontFile(int *len) { - FILE *f; - char *buf; - - if (!(f = fopen(extFontFile->getCString(), "rb"))) { - error(-1, "External font file '%s' vanished", extFontFile->getCString()); - return NULL; - } - fseek(f, 0, SEEK_END); - *len = (int)ftell(f); - fseek(f, 0, SEEK_SET); - buf = (char *)gmalloc(*len); - if ((int)fread(buf, 1, *len, f) != *len) { - error(-1, "Error reading external font file '%s'", - extFontFile->getCString()); - } - fclose(f); - return buf; -} - -char *GfxFont::readEmbFontFile(XRef *xref, int *len) { - char *buf; - Object obj1, obj2; - Stream *str; - int c; - int size, i; - - obj1.initRef(embFontID.num, embFontID.gen); - obj1.fetch(xref, &obj2); - if (!obj2.isStream()) { - error(-1, "Embedded font file is not a stream"); - obj2.free(); - obj1.free(); - embFontID.num = -1; - return NULL; - } - str = obj2.getStream(); - - buf = NULL; - i = size = 0; - str->reset(); - while ((c = str->getChar()) != EOF) { - if (i == size) { - size += 4096; - buf = (char *)grealloc(buf, size); - } - buf[i++] = c; - } - *len = i; - str->close(); - - obj2.free(); - obj1.free(); - - return buf; -} - -//------------------------------------------------------------------------ -// Gfx8BitFont -//------------------------------------------------------------------------ - -Gfx8BitFont::Gfx8BitFont(XRef *xref, char *tagA, Ref idA, GString *nameA, - GfxFontType typeA, Dict *fontDict): - GfxFont(tagA, idA, nameA) -{ - GString *name2; - BuiltinFont *builtinFont; - char **baseEnc; - GBool baseEncFromFontFile; - char *buf; - int len; - FoFiType1 *ffT1; - FoFiType1C *ffT1C; - int code, code2; - char *charName; - GBool missing, hex; - Unicode toUnicode[256]; - CharCodeToUnicode *utu, *ctu2; - Unicode uBuf[8]; - double mul; - int firstChar, lastChar; - Gushort w; - Object obj1, obj2, obj3; - int n, i, a, b, m; - - type = typeA; - ctu = NULL; - - // do font name substitution for various aliases of the Base 14 font - // names - if (name) { - name2 = name->copy(); - i = 0; - while (i < name2->getLength()) { - if (name2->getChar(i) == ' ') { - name2->del(i); - } else { - ++i; - } - } - a = 0; - b = sizeof(stdFontMap) / sizeof(StdFontMapEntry); - // invariant: stdFontMap[a].altName <= name2 < stdFontMap[b].altName - while (b - a > 1) { - m = (a + b) / 2; - if (name2->cmp(stdFontMap[m].altName) >= 0) { - a = m; - } else { - b = m; - } - } - if (!name2->cmp(stdFontMap[a].altName)) { - name = new GString(stdFontMap[a].properName); - } - delete name2; - } - - // is it a built-in font? - builtinFont = NULL; - if (name) { - for (i = 0; i < nBuiltinFonts; ++i) { - if (!name->cmp(builtinFonts[i].name)) { - builtinFont = &builtinFonts[i]; - break; - } - } - } - - // default ascent/descent values - if (builtinFont) { - ascent = 0.001 * builtinFont->ascent; - descent = 0.001 * builtinFont->descent; - fontBBox[0] = 0.001 * builtinFont->bbox[0]; - fontBBox[1] = 0.001 * builtinFont->bbox[1]; - fontBBox[2] = 0.001 * builtinFont->bbox[2]; - fontBBox[3] = 0.001 * builtinFont->bbox[3]; - } else { - ascent = 0.95; - descent = -0.35; - fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0; - } - - // get info from font descriptor - readFontDescriptor(xref, fontDict); - - // for non-embedded fonts, don't trust the ascent/descent/bbox - // values from the font descriptor - if (builtinFont && embFontID.num < 0) { - ascent = 0.001 * builtinFont->ascent; - descent = 0.001 * builtinFont->descent; - fontBBox[0] = 0.001 * builtinFont->bbox[0]; - fontBBox[1] = 0.001 * builtinFont->bbox[1]; - fontBBox[2] = 0.001 * builtinFont->bbox[2]; - fontBBox[3] = 0.001 * builtinFont->bbox[3]; - } - - // look for an external font file - findExtFontFile(); - - // get font matrix - fontMat[0] = fontMat[3] = 1; - fontMat[1] = fontMat[2] = fontMat[4] = fontMat[5] = 0; - if (fontDict->lookup("FontMatrix", &obj1)->isArray()) { - for (i = 0; i < 6 && i < obj1.arrayGetLength(); ++i) { - if (obj1.arrayGet(i, &obj2)->isNum()) { - fontMat[i] = obj2.getNum(); - } - obj2.free(); - } - } - obj1.free(); - - // get Type 3 bounding box, font definition, and resources - if (type == fontType3) { - if (fontDict->lookup("FontBBox", &obj1)->isArray()) { - for (i = 0; i < 4 && i < obj1.arrayGetLength(); ++i) { - if (obj1.arrayGet(i, &obj2)->isNum()) { - fontBBox[i] = obj2.getNum(); - } - obj2.free(); - } - } - obj1.free(); - if (!fontDict->lookup("CharProcs", &charProcs)->isDict()) { - error(-1, "Missing or invalid CharProcs dictionary in Type 3 font"); - charProcs.free(); - } - if (!fontDict->lookup("Resources", &resources)->isDict()) { - resources.free(); - } - } - - //----- build the font encoding ----- - - // Encodings start with a base encoding, which can come from - // (in order of priority): - // 1. FontDict.Encoding or FontDict.Encoding.BaseEncoding - // - MacRoman / MacExpert / WinAnsi / Standard - // 2. embedded or external font file - // 3. default: - // - builtin --> builtin encoding - // - TrueType --> WinAnsiEncoding - // - others --> StandardEncoding - // and then add a list of differences (if any) from - // FontDict.Encoding.Differences. - - // check FontDict for base encoding - hasEncoding = gFalse; - usesMacRomanEnc = gFalse; - baseEnc = NULL; - baseEncFromFontFile = gFalse; - fontDict->lookup("Encoding", &obj1); - if (obj1.isDict()) { - obj1.dictLookup("BaseEncoding", &obj2); - if (obj2.isName("MacRomanEncoding")) { - hasEncoding = gTrue; - usesMacRomanEnc = gTrue; - baseEnc = macRomanEncoding; - } else if (obj2.isName("MacExpertEncoding")) { - hasEncoding = gTrue; - baseEnc = macExpertEncoding; - } else if (obj2.isName("WinAnsiEncoding")) { - hasEncoding = gTrue; - baseEnc = winAnsiEncoding; - } - obj2.free(); - } else if (obj1.isName("MacRomanEncoding")) { - hasEncoding = gTrue; - usesMacRomanEnc = gTrue; - baseEnc = macRomanEncoding; - } else if (obj1.isName("MacExpertEncoding")) { - hasEncoding = gTrue; - baseEnc = macExpertEncoding; - } else if (obj1.isName("WinAnsiEncoding")) { - hasEncoding = gTrue; - baseEnc = winAnsiEncoding; - } - - // check embedded or external font file for base encoding - // (only for Type 1 fonts - trying to get an encoding out of a - // TrueType font is a losing proposition) - ffT1 = NULL; - ffT1C = NULL; - buf = NULL; - if (type == fontType1 && (extFontFile || embFontID.num >= 0)) { - if (extFontFile) { - ffT1 = FoFiType1::load(extFontFile->getCString()); - } else { - buf = readEmbFontFile(xref, &len); - ffT1 = FoFiType1::make(buf, len); - } - if (ffT1) { - if (ffT1->getName()) { - if (embFontName) { - delete embFontName; - } - embFontName = new GString(ffT1->getName()); - } - if (!baseEnc) { - baseEnc = ffT1->getEncoding(); - baseEncFromFontFile = gTrue; - } - } - } else if (type == fontType1C && (extFontFile || embFontID.num >= 0)) { - if (extFontFile) { - ffT1C = FoFiType1C::load(extFontFile->getCString()); - } else { - buf = readEmbFontFile(xref, &len); - ffT1C = FoFiType1C::make(buf, len); - } - if (ffT1C) { - if (ffT1C->getName()) { - if (embFontName) { - delete embFontName; - } - embFontName = new GString(ffT1C->getName()); - } - if (!baseEnc) { - baseEnc = ffT1C->getEncoding(); - baseEncFromFontFile = gTrue; - } - } - } - if (buf) { - gfree(buf); - } - - // get default base encoding - if (!baseEnc) { - if (builtinFont && embFontID.num < 0) { - baseEnc = builtinFont->defaultBaseEnc; - hasEncoding = gTrue; - } else if (type == fontTrueType) { - baseEnc = winAnsiEncoding; - } else { - baseEnc = standardEncoding; - } - } - - // copy the base encoding - for (i = 0; i < 256; ++i) { - enc[i] = baseEnc[i]; - if ((encFree[i] = baseEncFromFontFile) && enc[i]) { - enc[i] = copyString(baseEnc[i]); - } - } - - // some Type 1C font files have empty encodings, which can break the - // T1C->T1 conversion (since the 'seac' operator depends on having - // the accents in the encoding), so we fill in any gaps from - // StandardEncoding - if (type == fontType1C && (extFontFile || embFontID.num >= 0) && - baseEncFromFontFile) { - for (i = 0; i < 256; ++i) { - if (!enc[i] && standardEncoding[i]) { - enc[i] = standardEncoding[i]; - encFree[i] = gFalse; - } - } - } - - // merge differences into encoding - if (obj1.isDict()) { - obj1.dictLookup("Differences", &obj2); - if (obj2.isArray()) { - hasEncoding = gTrue; - code = 0; - for (i = 0; i < obj2.arrayGetLength(); ++i) { - obj2.arrayGet(i, &obj3); - if (obj3.isInt()) { - code = obj3.getInt(); - } else if (obj3.isName()) { - if (code >= 0 && code < 256) { - if (encFree[code]) { - gfree(enc[code]); - } - enc[code] = copyString(obj3.getName()); - encFree[code] = gTrue; - } - ++code; - } else { - error(-1, "Wrong type in font encoding resource differences (%s)", - obj3.getTypeName()); - } - obj3.free(); - } - } - obj2.free(); - } - obj1.free(); - if (ffT1) { - delete ffT1; - } - if (ffT1C) { - delete ffT1C; - } - - //----- build the mapping to Unicode ----- - - // pass 1: use the name-to-Unicode mapping table - missing = hex = gFalse; - for (code = 0; code < 256; ++code) { - if ((charName = enc[code])) { - if (!(toUnicode[code] = globalParams->mapNameToUnicode(charName)) && - strcmp(charName, ".notdef")) { - // if it wasn't in the name-to-Unicode table, check for a - // name that looks like 'Axx' or 'xx', where 'A' is any letter - // and 'xx' is two hex digits - if ((strlen(charName) == 3 && - isalpha(charName[0]) && - isxdigit(charName[1]) && isxdigit(charName[2]) && - ((charName[1] >= 'a' && charName[1] <= 'f') || - (charName[1] >= 'A' && charName[1] <= 'F') || - (charName[2] >= 'a' && charName[2] <= 'f') || - (charName[2] >= 'A' && charName[2] <= 'F'))) || - (strlen(charName) == 2 && - isxdigit(charName[0]) && isxdigit(charName[1]) && - ((charName[0] >= 'a' && charName[0] <= 'f') || - (charName[0] >= 'A' && charName[0] <= 'F') || - (charName[1] >= 'a' && charName[1] <= 'f') || - (charName[1] >= 'A' && charName[1] <= 'F')))) { - hex = gTrue; - } - missing = gTrue; - } - } else { - toUnicode[code] = 0; - } - } - - // pass 2: try to fill in the missing chars, looking for names of - // the form 'Axx', 'xx', 'Ann', 'ABnn', or 'nn', where 'A' and 'B' - // are any letters, 'xx' is two hex digits, and 'nn' is 2-4 - // decimal digits - if (missing && globalParams->getMapNumericCharNames()) { - for (code = 0; code < 256; ++code) { - if ((charName = enc[code]) && !toUnicode[code] && - strcmp(charName, ".notdef")) { - n = strlen(charName); - code2 = -1; - if (hex && n == 3 && isalpha(charName[0]) && - isxdigit(charName[1]) && isxdigit(charName[2])) { - sscanf(charName+1, "%x", &code2); - } else if (hex && n == 2 && - isxdigit(charName[0]) && isxdigit(charName[1])) { - sscanf(charName, "%x", &code2); - } else if (!hex && n >= 2 && n <= 4 && - isdigit(charName[0]) && isdigit(charName[1])) { - code2 = atoi(charName); - } else if (n >= 3 && n <= 5 && - isdigit(charName[1]) && isdigit(charName[2])) { - code2 = atoi(charName+1); - } else if (n >= 4 && n <= 6 && - isdigit(charName[2]) && isdigit(charName[3])) { - code2 = atoi(charName+2); - } - if (code2 >= 0 && code2 <= 0xff) { - toUnicode[code] = (Unicode)code2; - } - } - } - - // if the 'mapUnknownCharNames' flag is set, do a simple pass-through - // mapping for unknown character names - } else if (missing && globalParams->getMapUnknownCharNames()) { - for (code = 0; code < 256; ++code) { - if (!toUnicode[code]) { - toUnicode[code] = code; - } - } - } - - // construct the char code -> Unicode mapping object - ctu = CharCodeToUnicode::make8BitToUnicode(toUnicode); - - // merge in a ToUnicode CMap, if there is one -- this overwrites - // existing entries in ctu, i.e., the ToUnicode CMap takes - // precedence, but the other encoding info is allowed to fill in any - // holes - readToUnicodeCMap(fontDict, 8, ctu); - - // look for a Unicode-to-Unicode mapping - if (name && (utu = globalParams->getUnicodeToUnicode(name))) { - for (i = 0; i < 256; ++i) { - toUnicode[i] = 0; - } - ctu2 = CharCodeToUnicode::make8BitToUnicode(toUnicode); - for (i = 0; i < 256; ++i) { - n = ctu->mapToUnicode((CharCode)i, uBuf, 8); - if (n >= 1) { - n = utu->mapToUnicode((CharCode)uBuf[0], uBuf, 8); - if (n >= 1) { - ctu2->setMapping((CharCode)i, uBuf, n); - } - } - } - utu->decRefCnt(); - delete ctu; - ctu = ctu2; - } - - //----- get the character widths ----- - - // initialize all widths - for (code = 0; code < 256; ++code) { - widths[code] = missingWidth * 0.001; - } - - // use widths from font dict, if present - fontDict->lookup("FirstChar", &obj1); - firstChar = obj1.isInt() ? obj1.getInt() : 0; - obj1.free(); - if (firstChar < 0 || firstChar > 255) { - firstChar = 0; - } - fontDict->lookup("LastChar", &obj1); - lastChar = obj1.isInt() ? obj1.getInt() : 255; - obj1.free(); - if (lastChar < 0 || lastChar > 255) { - lastChar = 255; - } - mul = (type == fontType3) ? fontMat[0] : 0.001; - fontDict->lookup("Widths", &obj1); - if (obj1.isArray()) { - flags |= fontFixedWidth; - if (obj1.arrayGetLength() < lastChar - firstChar + 1) { - lastChar = firstChar + obj1.arrayGetLength() - 1; - } - for (code = firstChar; code <= lastChar; ++code) { - obj1.arrayGet(code - firstChar, &obj2); - if (obj2.isNum()) { - widths[code] = obj2.getNum() * mul; - if (widths[code] != widths[firstChar]) { - flags &= ~fontFixedWidth; - } - } - obj2.free(); - } - - // use widths from built-in font - } else if (builtinFont) { - // this is a kludge for broken PDF files that encode char 32 - // as .notdef - if (builtinFont->widths->getWidth("space", &w)) { - widths[32] = 0.001 * w; - } - for (code = 0; code < 256; ++code) { - if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) { - widths[code] = 0.001 * w; - } - } - - // couldn't find widths -- use defaults - } else { - // this is technically an error -- the Widths entry is required - // for all but the Base-14 fonts -- but certain PDF generators - // apparently don't include widths for Arial and TimesNewRoman - if (isFixedWidth()) { - i = 0; - } else if (isSerif()) { - i = 8; - } else { - i = 4; - } - if (isBold()) { - i += 2; - } - if (isItalic()) { - i += 1; - } - builtinFont = builtinFontSubst[i]; - // this is a kludge for broken PDF files that encode char 32 - // as .notdef - if (builtinFont->widths->getWidth("space", &w)) { - widths[32] = 0.001 * w; - } - for (code = 0; code < 256; ++code) { - if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) { - widths[code] = 0.001 * w; - } - } - } - obj1.free(); - - ok = gTrue; -} - -Gfx8BitFont::~Gfx8BitFont() { - int i; - - for (i = 0; i < 256; ++i) { - if (encFree[i] && enc[i]) { - gfree(enc[i]); - } - } - ctu->decRefCnt(); - if (charProcs.isDict()) { - charProcs.free(); - } - if (resources.isDict()) { - resources.free(); - } -} - -int Gfx8BitFont::getNextChar(char *s, int len, CharCode *code, - Unicode *u, int uSize, int *uLen, - double *dx, double *dy, double *ox, double *oy) { - CharCode c; - - *code = c = (CharCode)(*s & 0xff); - *uLen = ctu->mapToUnicode(c, u, uSize); - *dx = widths[c]; - *dy = *ox = *oy = 0; - return 1; -} - -CharCodeToUnicode* Gfx8BitFont::getCTU() { - return ctu; -} - -CharCodeToUnicode *Gfx8BitFont::getToUnicode() { - ctu->incRefCnt(); - return ctu; -} - -Gushort *Gfx8BitFont::getCodeToGIDMap(FoFiTrueType *ff) { - Gushort *map; - int cmapPlatform, cmapEncoding; - int unicodeCmap, macRomanCmap, msSymbolCmap, cmap; - GBool useMacRoman, useUnicode; - char *charName; - Unicode u; - int code, i, n; - - map = (Gushort *)gmallocn(256, sizeof(Gushort)); - for (i = 0; i < 256; ++i) { - map[i] = 0; - } - - // To match up with the Adobe-defined behaviour, we choose a cmap - // like this: - // 1. If the PDF font has an encoding: - // 1a. If the PDF font specified MacRomanEncoding and the - // TrueType font has a Macintosh Roman cmap, use it, and - // reverse map the char names through MacRomanEncoding to - // get char codes. - // 1b. If the TrueType font has a Microsoft Unicode cmap or a - // non-Microsoft Unicode cmap, use it, and use the Unicode - // indexes, not the char codes. - // 1c. If the PDF font is symbolic and the TrueType font has a - // Microsoft Symbol cmap, use it, and use char codes - // directly (possibly with an offset of 0xf000). - // 1d. If the TrueType font has a Macintosh Roman cmap, use it, - // as in case 1a. - // 2. If the PDF font does not have an encoding or the PDF font is - // symbolic: - // 2a. If the TrueType font has a Macintosh Roman cmap, use it, - // and use char codes directly (possibly with an offset of - // 0xf000). - // 2b. If the TrueType font has a Microsoft Symbol cmap, use it, - // and use char codes directly (possible with an offset of - // 0xf000). - // 3. If none of these rules apply, use the first cmap and hope for - // the best (this shouldn't happen). - unicodeCmap = macRomanCmap = msSymbolCmap = -1; - for (i = 0; i < ff->getNumCmaps(); ++i) { - cmapPlatform = ff->getCmapPlatform(i); - cmapEncoding = ff->getCmapEncoding(i); - if ((cmapPlatform == 3 && cmapEncoding == 1) || - cmapPlatform == 0) { - unicodeCmap = i; - } else if (cmapPlatform == 1 && cmapEncoding == 0) { - macRomanCmap = i; - } else if (cmapPlatform == 3 && cmapEncoding == 0) { - msSymbolCmap = i; - } - } - cmap = 0; - useMacRoman = gFalse; - useUnicode = gFalse; - if (hasEncoding) { - if (usesMacRomanEnc && macRomanCmap >= 0) { - cmap = macRomanCmap; - useMacRoman = gTrue; - } else if (unicodeCmap >= 0) { - cmap = unicodeCmap; - useUnicode = gTrue; - } else if ((flags & fontSymbolic) && msSymbolCmap >= 0) { - cmap = msSymbolCmap; - } else if ((flags & fontSymbolic) && macRomanCmap >= 0) { - cmap = macRomanCmap; - } else if (macRomanCmap >= 0) { - cmap = macRomanCmap; - useMacRoman = gTrue; - } - } else { - if (msSymbolCmap >= 0) { - cmap = msSymbolCmap; - } else if (macRomanCmap >= 0) { - cmap = macRomanCmap; - } - } - - // reverse map the char names through MacRomanEncoding, then map the - // char codes through the cmap - if (useMacRoman) { - for (i = 0; i < 256; ++i) { - if ((charName = enc[i])) { - if ((code = globalParams->getMacRomanCharCode(charName))) { - map[i] = ff->mapCodeToGID(cmap, code); - } - } - } - - // map Unicode through the cmap - } else if (useUnicode) { - for (i = 0; i < 256; ++i) { - if (((charName = enc[i]) && - (u = globalParams->mapNameToUnicode(charName))) || - (n = ctu->mapToUnicode((CharCode)i, &u, 1))) { - map[i] = ff->mapCodeToGID(cmap, u); - } - } - - // map the char codes through the cmap, possibly with an offset of - // 0xf000 - } else { - for (i = 0; i < 256; ++i) { - if (!(map[i] = ff->mapCodeToGID(cmap, i))) { - map[i] = ff->mapCodeToGID(cmap, 0xf000 + i); - } - } - } - - // try the TrueType 'post' table to handle any unmapped characters - for (i = 0; i < 256; ++i) { - if (!map[i] && (charName = enc[i])) { - map[i] = (Gushort)(int)ff->mapNameToGID(charName); - } - } - - return map; -} - -Dict *Gfx8BitFont::getCharProcs() { - return charProcs.isDict() ? charProcs.getDict() : (Dict *)NULL; -} - -Object *Gfx8BitFont::getCharProc(int code, Object *proc) { - if (enc[code] && charProcs.isDict()) { - charProcs.dictLookup(enc[code], proc); - } else { - proc->initNull(); - } - return proc; -} - -Dict *Gfx8BitFont::getResources() { - return resources.isDict() ? resources.getDict() : (Dict *)NULL; -} - -//------------------------------------------------------------------------ -// GfxCIDFont -//------------------------------------------------------------------------ - -static int CDECL cmpWidthExcep(const void *w1, const void *w2) { - return ((GfxFontCIDWidthExcep *)w1)->first - - ((GfxFontCIDWidthExcep *)w2)->first; -} - -static int CDECL cmpWidthExcepV(const void *w1, const void *w2) { - return ((GfxFontCIDWidthExcepV *)w1)->first - - ((GfxFontCIDWidthExcepV *)w2)->first; -} - -GfxCIDFont::GfxCIDFont(XRef *xref, char *tagA, Ref idA, GString *nameA, - Dict *fontDict): - GfxFont(tagA, idA, nameA) -{ - Dict *desFontDict; - GString *collection, *cMapName; - Object desFontDictObj; - Object obj1, obj2, obj3, obj4, obj5, obj6; - CharCodeToUnicode *utu; - CharCode c; - Unicode uBuf[8]; - int c1, c2; - int excepsSize, i, j, k, n; - - ascent = 0.95; - descent = -0.35; - fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0; - cMap = NULL; - ctu = NULL; - widths.defWidth = 1.0; - widths.defHeight = -1.0; - widths.defVY = 0.880; - widths.exceps = NULL; - widths.nExceps = 0; - widths.excepsV = NULL; - widths.nExcepsV = 0; - cidToGID = NULL; - cidToGIDLen = 0; - - // get the descendant font - if (!fontDict->lookup("DescendantFonts", &obj1)->isArray()) { - error(-1, "Missing DescendantFonts entry in Type 0 font"); - obj1.free(); - goto err1; - } - if (!obj1.arrayGet(0, &desFontDictObj)->isDict()) { - error(-1, "Bad descendant font in Type 0 font"); - goto err3; - } - obj1.free(); - desFontDict = desFontDictObj.getDict(); - - // font type - if (!desFontDict->lookup("Subtype", &obj1)) { - error(-1, "Missing Subtype entry in Type 0 descendant font"); - goto err3; - } - if (obj1.isName("CIDFontType0")) { - type = fontCIDType0; - } else if (obj1.isName("CIDFontType2")) { - type = fontCIDType2; - } else { - error(-1, "Unknown Type 0 descendant font type '%s'", - obj1.isName() ? obj1.getName() : "???"); - goto err3; - } - obj1.free(); - - // get info from font descriptor - readFontDescriptor(xref, desFontDict); - - // look for an external font file - findExtFontFile(); - - //----- encoding info ----- - - // char collection - if (!desFontDict->lookup("CIDSystemInfo", &obj1)->isDict()) { - error(-1, "Missing CIDSystemInfo dictionary in Type 0 descendant font"); - goto err3; - } - obj1.dictLookup("Registry", &obj2); - obj1.dictLookup("Ordering", &obj3); - if (!obj2.isString() || !obj3.isString()) { - error(-1, "Invalid CIDSystemInfo dictionary in Type 0 descendant font"); - goto err4; - } - collection = obj2.getString()->copy()->append('-')->append(obj3.getString()); - obj3.free(); - obj2.free(); - obj1.free(); - - // look for a ToUnicode CMap - if (!(ctu = readToUnicodeCMap(fontDict, 16, NULL))) { - - // the "Adobe-Identity" and "Adobe-UCS" collections don't have - // cidToUnicode files - if (collection->cmp("Adobe-Identity") && - collection->cmp("Adobe-UCS")) { - - // look for a user-supplied .cidToUnicode file - if (!(ctu = globalParams->getCIDToUnicode(collection))) { - error(-1, "Unknown character collection '%s'", - collection->getCString()); - // fall-through, assuming the Identity mapping -- this appears - // to match Adobe's behavior - } - } - } - - // look for a Unicode-to-Unicode mapping - if (name && (utu = globalParams->getUnicodeToUnicode(name))) { - if (ctu) { - for (c = 0; c < ctu->getLength(); ++c) { - n = ctu->mapToUnicode(c, uBuf, 8); - if (n >= 1) { - n = utu->mapToUnicode((CharCode)uBuf[0], uBuf, 8); - if (n >= 1) { - ctu->setMapping(c, uBuf, n); - } - } - } - utu->decRefCnt(); - } else { - ctu = utu; - } - } - - // encoding (i.e., CMap) - //~ need to handle a CMap stream here - //~ also need to deal with the UseCMap entry in the stream dict - if (!fontDict->lookup("Encoding", &obj1)->isName()) { - error(-1, "Missing or invalid Encoding entry in Type 0 font"); - delete collection; - goto err3; - } - cMapName = new GString(obj1.getName()); - obj1.free(); - if (!(cMap = globalParams->getCMap(collection, cMapName))) { - error(-1, "Unknown CMap '%s' for character collection '%s'", - cMapName->getCString(), collection->getCString()); - delete collection; - delete cMapName; - goto err2; - } - delete collection; - delete cMapName; - - // CIDToGIDMap (for embedded TrueType fonts) - if (type == fontCIDType2) { - desFontDict->lookup("CIDToGIDMap", &obj1); - if (obj1.isStream()) { - cidToGIDLen = 0; - i = 64; - cidToGID = (Gushort *)gmallocn(i, sizeof(Gushort)); - obj1.streamReset(); - while ((c1 = obj1.streamGetChar()) != EOF && - (c2 = obj1.streamGetChar()) != EOF) { - if (cidToGIDLen == i) { - i *= 2; - cidToGID = (Gushort *)greallocn(cidToGID, i, sizeof(Gushort)); - } - cidToGID[cidToGIDLen++] = (Gushort)((c1 << 8) + c2); - } - } else if (!obj1.isName("Identity") && !obj1.isNull()) { - error(-1, "Invalid CIDToGIDMap entry in CID font"); - } - obj1.free(); - } - - //----- character metrics ----- - - // default char width - if (desFontDict->lookup("DW", &obj1)->isInt()) { - widths.defWidth = obj1.getInt() * 0.001; - } - obj1.free(); - - // char width exceptions - if (desFontDict->lookup("W", &obj1)->isArray()) { - excepsSize = 0; - i = 0; - while (i + 1 < obj1.arrayGetLength()) { - obj1.arrayGet(i, &obj2); - obj1.arrayGet(i + 1, &obj3); - if (obj2.isInt() && obj3.isInt() && i + 2 < obj1.arrayGetLength()) { - if (obj1.arrayGet(i + 2, &obj4)->isNum()) { - if (widths.nExceps == excepsSize) { - excepsSize += 16; - widths.exceps = (GfxFontCIDWidthExcep *) - greallocn(widths.exceps, - excepsSize, sizeof(GfxFontCIDWidthExcep)); - } - widths.exceps[widths.nExceps].first = obj2.getInt(); - widths.exceps[widths.nExceps].last = obj3.getInt(); - widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001; - ++widths.nExceps; - } else { - error(-1, "Bad widths array in Type 0 font"); - } - obj4.free(); - i += 3; - } else if (obj2.isInt() && obj3.isArray()) { - if (widths.nExceps + obj3.arrayGetLength() > excepsSize) { - excepsSize = (widths.nExceps + obj3.arrayGetLength() + 15) & ~15; - widths.exceps = (GfxFontCIDWidthExcep *) - greallocn(widths.exceps, - excepsSize, sizeof(GfxFontCIDWidthExcep)); - } - j = obj2.getInt(); - for (k = 0; k < obj3.arrayGetLength(); ++k) { - if (obj3.arrayGet(k, &obj4)->isNum()) { - widths.exceps[widths.nExceps].first = j; - widths.exceps[widths.nExceps].last = j; - widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001; - ++j; - ++widths.nExceps; - } else { - error(-1, "Bad widths array in Type 0 font"); - } - obj4.free(); - } - i += 2; - } else { - error(-1, "Bad widths array in Type 0 font"); - ++i; - } - obj3.free(); - obj2.free(); - } - qsort(widths.exceps, widths.nExceps, sizeof(GfxFontCIDWidthExcep), - &cmpWidthExcep); - } - obj1.free(); - - // default metrics for vertical font - if (desFontDict->lookup("DW2", &obj1)->isArray() && - obj1.arrayGetLength() == 2) { - if (obj1.arrayGet(0, &obj2)->isNum()) { - widths.defVY = obj2.getNum() * 0.001; - } - obj2.free(); - if (obj1.arrayGet(1, &obj2)->isNum()) { - widths.defHeight = obj2.getNum() * 0.001; - } - obj2.free(); - } - obj1.free(); - - // char metric exceptions for vertical font - if (desFontDict->lookup("W2", &obj1)->isArray()) { - excepsSize = 0; - i = 0; - while (i + 1 < obj1.arrayGetLength()) { - obj1.arrayGet(i, &obj2); - obj1.arrayGet(i+ 1, &obj3); - if (obj2.isInt() && obj3.isInt() && i + 4 < obj1.arrayGetLength()) { - if (obj1.arrayGet(i + 2, &obj4)->isNum() && - obj1.arrayGet(i + 3, &obj5)->isNum() && - obj1.arrayGet(i + 4, &obj6)->isNum()) { - if (widths.nExcepsV == excepsSize) { - excepsSize += 16; - widths.excepsV = (GfxFontCIDWidthExcepV *) - greallocn(widths.excepsV, - excepsSize, sizeof(GfxFontCIDWidthExcepV)); - } - widths.excepsV[widths.nExcepsV].first = obj2.getInt(); - widths.excepsV[widths.nExcepsV].last = obj3.getInt(); - widths.excepsV[widths.nExcepsV].height = obj4.getNum() * 0.001; - widths.excepsV[widths.nExcepsV].vx = obj5.getNum() * 0.001; - widths.excepsV[widths.nExcepsV].vy = obj6.getNum() * 0.001; - ++widths.nExcepsV; - } else { - error(-1, "Bad widths (W2) array in Type 0 font"); - } - obj6.free(); - obj5.free(); - obj4.free(); - i += 5; - } else if (obj2.isInt() && obj3.isArray()) { - if (widths.nExcepsV + obj3.arrayGetLength() / 3 > excepsSize) { - excepsSize = - (widths.nExcepsV + obj3.arrayGetLength() / 3 + 15) & ~15; - widths.excepsV = (GfxFontCIDWidthExcepV *) - greallocn(widths.excepsV, - excepsSize, sizeof(GfxFontCIDWidthExcepV)); - } - j = obj2.getInt(); - for (k = 0; k < obj3.arrayGetLength(); k += 3) { - if (obj3.arrayGet(k, &obj4)->isNum() && - obj3.arrayGet(k+1, &obj5)->isNum() && - obj3.arrayGet(k+2, &obj6)->isNum()) { - widths.excepsV[widths.nExceps].first = j; - widths.excepsV[widths.nExceps].last = j; - widths.excepsV[widths.nExceps].height = obj4.getNum() * 0.001; - widths.excepsV[widths.nExceps].vx = obj5.getNum() * 0.001; - widths.excepsV[widths.nExceps].vy = obj6.getNum() * 0.001; - ++j; - ++widths.nExcepsV; - } else { - error(-1, "Bad widths (W2) array in Type 0 font"); - } - obj6.free(); - obj5.free(); - obj4.free(); - } - i += 2; - } else { - error(-1, "Bad widths (W2) array in Type 0 font"); - ++i; - } - obj3.free(); - obj2.free(); - } - qsort(widths.excepsV, widths.nExcepsV, sizeof(GfxFontCIDWidthExcepV), - &cmpWidthExcepV); - } - obj1.free(); - - desFontDictObj.free(); - ok = gTrue; - return; - - err4: - obj3.free(); - obj2.free(); - err3: - obj1.free(); - err2: - desFontDictObj.free(); - err1:; -} - -GfxCIDFont::~GfxCIDFont() { - if (cMap) { - cMap->decRefCnt(); - } - if (ctu) { - ctu->decRefCnt(); - } - gfree(widths.exceps); - gfree(widths.excepsV); - if (cidToGID) { - gfree(cidToGID); - } -} - -CharCodeToUnicode* GfxCIDFont::getCTU() { - return ctu; -} - -int GfxCIDFont::getNextChar(char *s, int len, CharCode *code, - Unicode *u, int uSize, int *uLen, - double *dx, double *dy, double *ox, double *oy) { - CID cid; - double w, h, vx, vy; - int n, a, b, m; - - if (!cMap) { - *code = 0; - *uLen = 0; - *dx = *dy = 0; - return 1; - } - - *code = (CharCode)(cid = cMap->getCID(s, len, &n)); - if (ctu) { - *uLen = ctu->mapToUnicode(cid, u, uSize); - } else { - *uLen = 0; - } - - // horizontal - if (cMap->getWMode() == 0) { - w = widths.defWidth; - h = vx = vy = 0; - if (widths.nExceps > 0 && cid >= widths.exceps[0].first) { - a = 0; - b = widths.nExceps; - // invariant: widths.exceps[a].first <= cid < widths.exceps[b].first - while (b - a > 1) { - m = (a + b) / 2; - if (widths.exceps[m].first <= cid) { - a = m; - } else { - b = m; - } - } - if (cid <= widths.exceps[a].last) { - w = widths.exceps[a].width; - } - } - - // vertical - } else { - w = 0; - h = widths.defHeight; - vx = widths.defWidth / 2; - vy = widths.defVY; - if (widths.nExcepsV > 0 && cid >= widths.excepsV[0].first) { - a = 0; - b = widths.nExcepsV; - // invariant: widths.excepsV[a].first <= cid < widths.excepsV[b].first - while (b - a > 1) { - m = (a + b) / 2; - if (widths.excepsV[m].last <= cid) { - a = m; - } else { - b = m; - } - } - if (cid <= widths.excepsV[a].last) { - h = widths.excepsV[a].height; - vx = widths.excepsV[a].vx; - vy = widths.excepsV[a].vy; - } - } - } - - *dx = w; - *dy = h; - *ox = vx; - *oy = vy; - - return n; -} - -int GfxCIDFont::getWMode() { - return cMap ? cMap->getWMode() : 0; -} - -CharCodeToUnicode *GfxCIDFont::getToUnicode() { - if (ctu) { - ctu->incRefCnt(); - } - return ctu; -} - -GString *GfxCIDFont::getCollection() { - return cMap ? cMap->getCollection() : (GString *)NULL; -} - -//------------------------------------------------------------------------ -// GfxFontDict -//------------------------------------------------------------------------ - -GfxFontDict::GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict) { - int i; - Object obj1, obj2; - Ref r; - - numFonts = fontDict->getLength(); - fonts = (GfxFont **)gmallocn(numFonts, sizeof(GfxFont *)); - for (i = 0; i < numFonts; ++i) { - fontDict->getValNF(i, &obj1); - obj1.fetch(xref, &obj2); - if (obj2.isDict()) { - if (obj1.isRef()) { - r = obj1.getRef(); - } else { - // no indirect reference for this font, so invent a unique one - // (legal generation numbers are five digits, so any 6-digit - // number would be safe) - r.num = i; - if (fontDictRef) { - r.gen = 100000 + fontDictRef->num; - } else { - r.gen = 999999; - } - } - fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i), - r, obj2.getDict()); - if (fonts[i] && !fonts[i]->isOk()) { - delete fonts[i]; - fonts[i] = NULL; - } - } else { - error(-1, "font resource is not a dictionary"); - fonts[i] = NULL; - } - obj1.free(); - obj2.free(); - } -} - -GfxFontDict::~GfxFontDict() { - int i; - - for (i = 0; i < numFonts; ++i) { - if (fonts[i]) { - delete fonts[i]; - } - } - gfree(fonts); -} - -GfxFont *GfxFontDict::lookup(char *tag) { - int i; - - for (i = 0; i < numFonts; ++i) { - if (fonts[i] && fonts[i]->matches(tag)) { - return fonts[i]; - } - } - return NULL; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.h deleted file mode 100644 index c16e9e375..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxFont.h +++ /dev/null @@ -1,323 +0,0 @@ -//======================================================================== -// -// GfxFont.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef GFXFONT_H -#define GFXFONT_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "GString.h" -#include "Object.h" -#include "CharTypes.h" - -class Dict; -class CMap; -class CharCodeToUnicode; -class FoFiTrueType; -struct GfxFontCIDWidths; - -//------------------------------------------------------------------------ -// GfxFontType -//------------------------------------------------------------------------ - -enum GfxFontType { - //----- Gfx8BitFont - fontUnknownType, - fontType1, - fontType1C, - fontType1COT, - fontType3, - fontTrueType, - fontTrueTypeOT, - //----- GfxCIDFont - fontCIDType0, - fontCIDType0C, - fontCIDType0COT, - fontCIDType2, - fontCIDType2OT -}; - -//------------------------------------------------------------------------ -// GfxFontCIDWidths -//------------------------------------------------------------------------ - -struct GfxFontCIDWidthExcep { - CID first; // this record applies to - CID last; // CIDs .. - double width; // char width -}; - -struct GfxFontCIDWidthExcepV { - CID first; // this record applies to - CID last; // CIDs .. - double height; // char height - double vx, vy; // origin position -}; - -struct GfxFontCIDWidths { - double defWidth; // default char width - double defHeight; // default char height - double defVY; // default origin position - GfxFontCIDWidthExcep *exceps; // exceptions - int nExceps; // number of valid entries in exceps - GfxFontCIDWidthExcepV * // exceptions for vertical font - excepsV; - int nExcepsV; // number of valid entries in excepsV -}; - -//------------------------------------------------------------------------ -// GfxFont -//------------------------------------------------------------------------ - -#define fontFixedWidth (1 << 0) -#define fontSerif (1 << 1) -#define fontSymbolic (1 << 2) -#define fontItalic (1 << 6) -#define fontBold (1 << 18) - -class GfxFont { -public: - - // Build a GfxFont object. - static GfxFont *makeFont(XRef *xref, char *tagA, Ref idA, Dict *fontDict); - - GfxFont(char *tagA, Ref idA, GString *nameA); - - virtual ~GfxFont(); - - GBool isOk() { return ok; } - - // Get font tag. - GString *getTag() { return tag; } - - // Get font dictionary ID. - Ref *getID() { return &id; } - - // Does this font match the tag? - GBool matches(char *tagA) { return !tag->cmp(tagA); } - - // Get base font name. - GString *getName() { return name; } - - // Get the original font name (ignornig any munging that might have - // been done to map to a canonical Base-14 font name). - GString *getOrigName() { return origName; } - - // Get font type. - GfxFontType getType() { return type; } - virtual GBool isCIDFont() { return gFalse; } - - // Get embedded font ID, i.e., a ref for the font file stream. - // Returns false if there is no embedded font. - GBool getEmbeddedFontID(Ref *embID) - { *embID = embFontID; return embFontID.num >= 0; } - - // Get the PostScript font name for the embedded font. Returns - // NULL if there is no embedded font. - GString *getEmbeddedFontName() { return embFontName; } - - // Get the name of the external font file. Returns NULL if there - // is no external font file. - GString *getExtFontFile() { return extFontFile; } - - // Get font descriptor flags. - int getFlags() { return flags; } - GBool isFixedWidth() { return flags & fontFixedWidth; } - GBool isSerif() { return flags & fontSerif; } - GBool isSymbolic() { return flags & fontSymbolic; } - GBool isItalic() { return flags & fontItalic; } - GBool isBold() { return flags & fontBold; } - - // Return the font matrix. - double *getFontMatrix() { return fontMat; } - - // Return the font bounding box. - double *getFontBBox() { return fontBBox; } - - // Return the ascent and descent values. - double getAscent() { return ascent; } - double getDescent() { return descent; } - - // Return the writing mode (0=horizontal, 1=vertical). - virtual int getWMode() { return 0; } - - // Read an external or embedded font file into a buffer. - char *readExtFontFile(int *len); - char *readEmbFontFile(XRef *xref, int *len); - - // Get the next char from a string of bytes, returning the - // char , its Unicode mapping , its displacement vector - // (, ), and its origin offset vector (, ). - // is the number of entries available in , and is set to - // the number actually used. Returns the number of bytes used by - // the char code. - virtual int getNextChar(char *s, int len, CharCode *code, - Unicode *u, int uSize, int *uLen, - double *dx, double *dy, double *ox, double *oy) = 0; - virtual CharCodeToUnicode* getCTU() = 0; - -protected: - - void readFontDescriptor(XRef *xref, Dict *fontDict); - CharCodeToUnicode *readToUnicodeCMap(Dict *fontDict, int nBits, - CharCodeToUnicode *ctu); - void findExtFontFile(); - - GString *tag; // PDF font tag - Ref id; // reference (used as unique ID) - GString *name; // font name - GString *origName; // original font name - GfxFontType type; // type of font - int flags; // font descriptor flags - GString *embFontName; // name of embedded font - Ref embFontID; // ref to embedded font file stream - GString *extFontFile; // external font file name - double fontMat[6]; // font matrix (Type 3 only) - double fontBBox[4]; // font bounding box (Type 3 only) - double missingWidth; // "default" width - double ascent; // max height above baseline - double descent; // max depth below baseline - GBool ok; -}; - -//------------------------------------------------------------------------ -// Gfx8BitFont -//------------------------------------------------------------------------ - -class Gfx8BitFont: public GfxFont { -public: - - Gfx8BitFont(XRef *xref, char *tagA, Ref idA, GString *nameA, - GfxFontType typeA, Dict *fontDict); - - virtual ~Gfx8BitFont(); - - virtual int getNextChar(char *s, int len, CharCode *code, - Unicode *u, int uSize, int *uLen, - double *dx, double *dy, double *ox, double *oy); - virtual CharCodeToUnicode* getCTU(); - - // Return the encoding. - char **getEncoding() { return enc; } - - // Return the Unicode map. - CharCodeToUnicode *getToUnicode(); - - // Return the character name associated with . - char *getCharName(int code) { return code>=256?0:enc[code]; } - - // Returns true if the PDF font specified an encoding. - GBool getHasEncoding() { return hasEncoding; } - - // Returns true if the PDF font specified MacRomanEncoding. - GBool getUsesMacRomanEnc() { return usesMacRomanEnc; } - - // Get width of a character. - double getWidth(Guchar c) { return widths[c]; } - - // Return a char code-to-GID mapping for the provided font file. - // (This is only useful for TrueType fonts.) - Gushort *getCodeToGIDMap(FoFiTrueType *ff); - - // Return the Type 3 CharProc dictionary, or NULL if none. - Dict *getCharProcs(); - - // Return the Type 3 CharProc for the character associated with . - Object *getCharProc(int code, Object *proc); - - // Return the Type 3 Resources dictionary, or NULL if none. - Dict *getResources(); - -private: - - char *enc[256]; // char code --> char name - char encFree[256]; // boolean for each char name: if set, - // the string is malloc'ed - CharCodeToUnicode *ctu; // char code --> Unicode - GBool hasEncoding; - GBool usesMacRomanEnc; - double widths[256]; // character widths - Object charProcs; // Type 3 CharProcs dictionary - Object resources; // Type 3 Resources dictionary -}; - -//------------------------------------------------------------------------ -// GfxCIDFont -//------------------------------------------------------------------------ - -class GfxCIDFont: public GfxFont { -public: - - GfxCIDFont(XRef *xref, char *tagA, Ref idA, GString *nameA, - Dict *fontDict); - - virtual ~GfxCIDFont(); - - virtual GBool isCIDFont() { return gTrue; } - - virtual int getNextChar(char *s, int len, CharCode *code, - Unicode *u, int uSize, int *uLen, - double *dx, double *dy, double *ox, double *oy); - virtual CharCodeToUnicode* getCTU(); - - // Return the writing mode (0=horizontal, 1=vertical). - virtual int getWMode(); - - // Return the Unicode map. - CharCodeToUnicode *getToUnicode(); - - // Get the collection name (-). - GString *getCollection(); - - // Return the CID-to-GID mapping table. These should only be called - // if type is fontCIDType2. - Gushort *getCIDToGID() { return cidToGID; } - int getCIDToGIDLen() { return cidToGIDLen; } - -private: - - CMap *cMap; // char code --> CID - CharCodeToUnicode *ctu; // CID --> Unicode - GfxFontCIDWidths widths; // character widths - Gushort *cidToGID; // CID --> GID mapping (for embedded - // TrueType fonts) - int cidToGIDLen; -}; - -//------------------------------------------------------------------------ -// GfxFontDict -//------------------------------------------------------------------------ - -class GfxFontDict { -public: - - // Build the font dictionary, given the PDF font dictionary. - GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict); - - // Destructor. - ~GfxFontDict(); - - // Get the specified font. - GfxFont *lookup(char *tag); - - // Iterative access. - int getNumFonts() { return numFonts; } - GfxFont *getFont(int i) { return fonts[i]; } - -private: - - GfxFont **fonts; // list of fonts - int numFonts; // number of fonts -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.cc deleted file mode 100644 index da07245b0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.cc +++ /dev/null @@ -1,4172 +0,0 @@ -//======================================================================== -// -// GfxState.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include "gmem.h" -#include "Error.h" -#include "Object.h" -#include "Array.h" -#include "Page.h" -#include "GfxState.h" -#include "cmyk.h" - -//------------------------------------------------------------------------ - -static inline GfxColorComp clip01(GfxColorComp x) { - return (x < 0) ? 0 : (x > gfxColorComp1) ? gfxColorComp1 : x; -} - -static inline double clip01(double x) { - return (x < 0) ? 0 : (x > 1) ? 1 : x; -} - -//------------------------------------------------------------------------ - -struct GfxBlendModeInfo { - char *name; - GfxBlendMode mode; -}; - -static GfxBlendModeInfo gfxBlendModeNames[] = { - { "Normal", gfxBlendNormal }, - { "Compatible", gfxBlendNormal }, - { "Multiply", gfxBlendMultiply }, - { "Screen", gfxBlendScreen }, - { "Overlay", gfxBlendOverlay }, - { "Darken", gfxBlendDarken }, - { "Lighten", gfxBlendLighten }, - { "ColorDodge", gfxBlendColorDodge }, - { "ColorBurn", gfxBlendColorBurn }, - { "HardLight", gfxBlendHardLight }, - { "SoftLight", gfxBlendSoftLight }, - { "Difference", gfxBlendDifference }, - { "Exclusion", gfxBlendExclusion }, - { "Hue", gfxBlendHue }, - { "Saturation", gfxBlendSaturation }, - { "Color", gfxBlendColor }, - { "Luminosity", gfxBlendLuminosity } -}; - -#define nGfxBlendModeNames \ - ((int)((sizeof(gfxBlendModeNames) / sizeof(GfxBlendModeInfo)))) - -//------------------------------------------------------------------------ - -// NB: This must match the GfxColorSpaceMode enum defined in -// GfxState.h -static char *gfxColorSpaceModeNames[] = { - "DeviceGray", - "CalGray", - "DeviceRGB", - "CalRGB", - "DeviceCMYK", - "Lab", - "ICCBased", - "Indexed", - "Separation", - "DeviceN", - "Pattern" -}; - -#define nGfxColorSpaceModes ((sizeof(gfxColorSpaceModeNames) / sizeof(char *))) - -//------------------------------------------------------------------------ -// GfxColorSpace -//------------------------------------------------------------------------ - -GfxColorSpace::GfxColorSpace() { -} - -GfxColorSpace::~GfxColorSpace() { -} - -GfxColorSpace *GfxColorSpace::parse(Object *csObj, StreamColorSpaceMode csMode) { - GfxColorSpace *cs; - Object obj1; - - cs = NULL; - if (csObj->isName()) { - if (csObj->isName("DeviceGray") || csObj->isName("G")) { - cs = new GfxDeviceGrayColorSpace(); - } else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) { - if(csMode == streamCSDeviceRGBX) - cs = new GfxDeviceRGBXColorSpace(); - else - cs = new GfxDeviceRGBColorSpace(); - } else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) { - cs = new GfxDeviceCMYKColorSpace(); - } else if (csObj->isName("Pattern")) { - cs = new GfxPatternColorSpace(NULL); - } else { - error(-1, "Bad color space '%s'", csObj->getName()); - } - } else if (csObj->isArray()) { - csObj->arrayGet(0, &obj1); - if (obj1.isName("DeviceGray") || obj1.isName("G")) { - cs = new GfxDeviceGrayColorSpace(); - } else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) { - if(csMode == streamCSDeviceRGBX) - cs = new GfxDeviceRGBColorSpace(); - else - cs = new GfxDeviceRGBColorSpace(); - } else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) { - cs = new GfxDeviceCMYKColorSpace(); - } else if (obj1.isName("CalGray")) { - cs = GfxCalGrayColorSpace::parse(csObj->getArray()); - } else if (obj1.isName("CalRGB")) { - cs = GfxCalRGBColorSpace::parse(csObj->getArray()); - } else if (obj1.isName("Lab")) { - cs = GfxLabColorSpace::parse(csObj->getArray()); - } else if (obj1.isName("ICCBased")) { - cs = GfxICCBasedColorSpace::parse(csObj->getArray()); - } else if (obj1.isName("Indexed") || obj1.isName("I")) { - cs = GfxIndexedColorSpace::parse(csObj->getArray()); - } else if (obj1.isName("Separation")) { - cs = GfxSeparationColorSpace::parse(csObj->getArray()); - } else if (obj1.isName("DeviceN")) { - cs = GfxDeviceNColorSpace::parse(csObj->getArray()); - } else if (obj1.isName("Pattern")) { - cs = GfxPatternColorSpace::parse(csObj->getArray()); - } else { - error(-1, "Bad color space"); - } - obj1.free(); - } else { - error(-1, "Bad color space - expected name or array"); - } - return cs; -} - -void GfxColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange, - int maxImgPixel) { - int i; - - for (i = 0; i < getNComps(); ++i) { - decodeLow[i] = 0; - decodeRange[i] = 1; - } -} - -int GfxColorSpace::getNumColorSpaceModes() { - return nGfxColorSpaceModes; -} - -char *GfxColorSpace::getColorSpaceModeName(int idx) { - return gfxColorSpaceModeNames[idx]; -} - -//------------------------------------------------------------------------ -// GfxDeviceGrayColorSpace -//------------------------------------------------------------------------ - -GfxDeviceGrayColorSpace::GfxDeviceGrayColorSpace() { -} - -GfxDeviceGrayColorSpace::~GfxDeviceGrayColorSpace() { -} - -GfxColorSpace *GfxDeviceGrayColorSpace::copy() { - return new GfxDeviceGrayColorSpace(); -} - -void GfxDeviceGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) { - *gray = clip01(color->c[0]); -} - -void GfxDeviceGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - rgb->r = rgb->g = rgb->b = clip01(color->c[0]); -} - -void GfxDeviceGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - cmyk->c = cmyk->m = cmyk->y = 0; - cmyk->k = clip01(gfxColorComp1 - color->c[0]); -} - -void GfxDeviceGrayColorSpace::getDefaultColor(GfxColor *color) { - color->c[0] = 0; -} - -//------------------------------------------------------------------------ -// GfxCalGrayColorSpace -//------------------------------------------------------------------------ - -GfxCalGrayColorSpace::GfxCalGrayColorSpace() { - whiteX = whiteY = whiteZ = 1; - blackX = blackY = blackZ = 0; - gamma = 1; -} - -GfxCalGrayColorSpace::~GfxCalGrayColorSpace() { -} - -GfxColorSpace *GfxCalGrayColorSpace::copy() { - GfxCalGrayColorSpace *cs; - - cs = new GfxCalGrayColorSpace(); - cs->whiteX = whiteX; - cs->whiteY = whiteY; - cs->whiteZ = whiteZ; - cs->blackX = blackX; - cs->blackY = blackY; - cs->blackZ = blackZ; - cs->gamma = gamma; - return cs; -} - -GfxColorSpace *GfxCalGrayColorSpace::parse(Array *arr) { - GfxCalGrayColorSpace *cs; - Object obj1, obj2, obj3; - - arr->get(1, &obj1); - if (!obj1.isDict()) { - error(-1, "Bad CalGray color space"); - obj1.free(); - return NULL; - } - cs = new GfxCalGrayColorSpace(); - if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && - obj2.arrayGetLength() == 3) { - obj2.arrayGet(0, &obj3); - cs->whiteX = obj3.getNum(); - obj3.free(); - obj2.arrayGet(1, &obj3); - cs->whiteY = obj3.getNum(); - obj3.free(); - obj2.arrayGet(2, &obj3); - cs->whiteZ = obj3.getNum(); - obj3.free(); - } - obj2.free(); - if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && - obj2.arrayGetLength() == 3) { - obj2.arrayGet(0, &obj3); - cs->blackX = obj3.getNum(); - obj3.free(); - obj2.arrayGet(1, &obj3); - cs->blackY = obj3.getNum(); - obj3.free(); - obj2.arrayGet(2, &obj3); - cs->blackZ = obj3.getNum(); - obj3.free(); - } - obj2.free(); - if (obj1.dictLookup("Gamma", &obj2)->isNum()) { - cs->gamma = obj2.getNum(); - } - obj2.free(); - obj1.free(); - return cs; -} - -void GfxCalGrayColorSpace::getGray(GfxColor *color, GfxGray *gray) { - *gray = clip01(color->c[0]); -} - -void GfxCalGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - rgb->r = rgb->g = rgb->b = clip01(color->c[0]); -} - -void GfxCalGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - cmyk->c = cmyk->m = cmyk->y = 0; - cmyk->k = clip01(gfxColorComp1 - color->c[0]); -} - -void GfxCalGrayColorSpace::getDefaultColor(GfxColor *color) { - color->c[0] = 0; -} - -//------------------------------------------------------------------------ -// GfxDeviceRGBColorSpace -//------------------------------------------------------------------------ - -GfxDeviceRGBColorSpace::GfxDeviceRGBColorSpace() { -} - -GfxDeviceRGBColorSpace::~GfxDeviceRGBColorSpace() { -} - -GfxColorSpace *GfxDeviceRGBColorSpace::copy() { - return new GfxDeviceRGBColorSpace(); -} - -void GfxDeviceRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) { - *gray = clip01((GfxColorComp)(0.3 * color->c[0] + - 0.59 * color->c[1] + - 0.11 * color->c[2] + 0.5)); -} - -void GfxDeviceRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - rgb->r = clip01(color->c[0]); - rgb->g = clip01(color->c[1]); - rgb->b = clip01(color->c[2]); -} - -void GfxDeviceRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - GfxColorComp c, m, y, k; - - c = clip01(gfxColorComp1 - color->c[0]); - m = clip01(gfxColorComp1 - color->c[1]); - y = clip01(gfxColorComp1 - color->c[2]); - k = c; - if (m < k) { - k = m; - } - if (y < k) { - k = y; - } - cmyk->c = c - k; - cmyk->m = m - k; - cmyk->y = y - k; - cmyk->k = k; -} - -void GfxDeviceRGBColorSpace::getDefaultColor(GfxColor *color) { - color->c[0] = 0; - color->c[1] = 0; - color->c[2] = 0; -} - -//------------------------------------------------------------------------ -// GfxDeviceRGBXColorSpace -//------------------------------------------------------------------------ - -GfxDeviceRGBXColorSpace::GfxDeviceRGBXColorSpace() { -} - -GfxColorSpace *GfxDeviceRGBXColorSpace::copy() { - return new GfxDeviceRGBXColorSpace(); -} - -//------------------------------------------------------------------------ -// GfxCalRGBColorSpace -//------------------------------------------------------------------------ - -GfxCalRGBColorSpace::GfxCalRGBColorSpace() { - whiteX = whiteY = whiteZ = 1; - blackX = blackY = blackZ = 0; - gammaR = gammaG = gammaB = 1; - mat[0] = 1; mat[1] = 0; mat[2] = 0; - mat[3] = 0; mat[4] = 1; mat[5] = 0; - mat[6] = 0; mat[7] = 0; mat[8] = 1; -} - -GfxCalRGBColorSpace::~GfxCalRGBColorSpace() { -} - -GfxColorSpace *GfxCalRGBColorSpace::copy() { - GfxCalRGBColorSpace *cs; - int i; - - cs = new GfxCalRGBColorSpace(); - cs->whiteX = whiteX; - cs->whiteY = whiteY; - cs->whiteZ = whiteZ; - cs->blackX = blackX; - cs->blackY = blackY; - cs->blackZ = blackZ; - cs->gammaR = gammaR; - cs->gammaG = gammaG; - cs->gammaB = gammaB; - for (i = 0; i < 9; ++i) { - cs->mat[i] = mat[i]; - } - return cs; -} - -GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr) { - GfxCalRGBColorSpace *cs; - Object obj1, obj2, obj3; - int i; - - arr->get(1, &obj1); - if (!obj1.isDict()) { - error(-1, "Bad CalRGB color space"); - obj1.free(); - return NULL; - } - cs = new GfxCalRGBColorSpace(); - if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && - obj2.arrayGetLength() == 3) { - obj2.arrayGet(0, &obj3); - cs->whiteX = obj3.getNum(); - obj3.free(); - obj2.arrayGet(1, &obj3); - cs->whiteY = obj3.getNum(); - obj3.free(); - obj2.arrayGet(2, &obj3); - cs->whiteZ = obj3.getNum(); - obj3.free(); - } - obj2.free(); - if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && - obj2.arrayGetLength() == 3) { - obj2.arrayGet(0, &obj3); - cs->blackX = obj3.getNum(); - obj3.free(); - obj2.arrayGet(1, &obj3); - cs->blackY = obj3.getNum(); - obj3.free(); - obj2.arrayGet(2, &obj3); - cs->blackZ = obj3.getNum(); - obj3.free(); - } - obj2.free(); - if (obj1.dictLookup("Gamma", &obj2)->isArray() && - obj2.arrayGetLength() == 3) { - obj2.arrayGet(0, &obj3); - cs->gammaR = obj3.getNum(); - obj3.free(); - obj2.arrayGet(1, &obj3); - cs->gammaG = obj3.getNum(); - obj3.free(); - obj2.arrayGet(2, &obj3); - cs->gammaB = obj3.getNum(); - obj3.free(); - } - obj2.free(); - if (obj1.dictLookup("Matrix", &obj2)->isArray() && - obj2.arrayGetLength() == 9) { - for (i = 0; i < 9; ++i) { - obj2.arrayGet(i, &obj3); - cs->mat[i] = obj3.getNum(); - obj3.free(); - } - } - obj2.free(); - obj1.free(); - return cs; -} - -void GfxCalRGBColorSpace::getGray(GfxColor *color, GfxGray *gray) { - *gray = clip01((GfxColorComp)(0.299 * color->c[0] + - 0.587 * color->c[1] + - 0.114 * color->c[2] + 0.5)); -} - -void GfxCalRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - rgb->r = clip01(color->c[0]); - rgb->g = clip01(color->c[1]); - rgb->b = clip01(color->c[2]); -} - -void GfxCalRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - GfxColorComp c, m, y, k; - - c = clip01(gfxColorComp1 - color->c[0]); - m = clip01(gfxColorComp1 - color->c[1]); - y = clip01(gfxColorComp1 - color->c[2]); - k = c; - if (m < k) { - k = m; - } - if (y < k) { - k = y; - } - cmyk->c = c - k; - cmyk->m = m - k; - cmyk->y = y - k; - cmyk->k = k; -} - -void GfxCalRGBColorSpace::getDefaultColor(GfxColor *color) { - color->c[0] = 0; - color->c[1] = 0; - color->c[2] = 0; -} - -//------------------------------------------------------------------------ -// GfxDeviceCMYKColorSpace -//------------------------------------------------------------------------ - -GfxDeviceCMYKColorSpace::GfxDeviceCMYKColorSpace() { -} - -GfxDeviceCMYKColorSpace::~GfxDeviceCMYKColorSpace() { -} - -GfxColorSpace *GfxDeviceCMYKColorSpace::copy() { - return new GfxDeviceCMYKColorSpace(); -} - -void GfxDeviceCMYKColorSpace::getGray(GfxColor *color, GfxGray *gray) { - *gray = clip01((GfxColorComp)(gfxColorComp1 - color->c[3] - - 0.3 * color->c[0] - - 0.59 * color->c[1] - - 0.11 * color->c[2] + 0.5)); -} - -/*void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - unsigned char r,g,b; - float c = color->c[0]; - float m = color->c[1]; - float y = color->c[2]; - float k = color->c[3]; - convert_cmyk2rgb(c,m,y,k, &r,&g,&b); - rgb->r = r/255.0; - rgb->g = g/255.0; - rgb->b = b/255.0; -}*/ - -void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - double c, m, y, k, c1, m1, y1, k1, r, g, b, x; - - c = colToDbl(color->c[0]); - m = colToDbl(color->c[1]); - y = colToDbl(color->c[2]); - k = colToDbl(color->c[3]); - c1 = 1 - c; - m1 = 1 - m; - y1 = 1 - y; - k1 = 1 - k; - // this is a matrix multiplication, unrolled for performance - // C M Y K - x = c1 * m1 * y1 * k1; // 0 0 0 0 - r = g = b = x; - x = c1 * m1 * y1 * k; // 0 0 0 1 - r += 0.1373 * x; - g += 0.1216 * x; - b += 0.1255 * x; - x = c1 * m1 * y * k1; // 0 0 1 0 - r += x; - g += 0.9490 * x; - x = c1 * m1 * y * k; // 0 0 1 1 - r += 0.1098 * x; - g += 0.1020 * x; - x = c1 * m * y1 * k1; // 0 1 0 0 - r += 0.9255 * x; - b += 0.5490 * x; - x = c1 * m * y1 * k; // 0 1 0 1 - r += 0.1412 * x; - x = c1 * m * y * k1; // 0 1 1 0 - r += 0.9294 * x; - g += 0.1098 * x; - b += 0.1412 * x; - x = c1 * m * y * k; // 0 1 1 1 - r += 0.1333 * x; - x = c * m1 * y1 * k1; // 1 0 0 0 - g += 0.6784 * x; - b += 0.9373 * x; - x = c * m1 * y1 * k; // 1 0 0 1 - g += 0.0588 * x; - b += 0.1412 * x; - x = c * m1 * y * k1; // 1 0 1 0 - g += 0.6510 * x; - b += 0.3137 * x; - x = c * m1 * y * k; // 1 0 1 1 - g += 0.0745 * x; - x = c * m * y1 * k1; // 1 1 0 0 - r += 0.1804 * x; - g += 0.1922 * x; - b += 0.5725 * x; - x = c * m * y1 * k; // 1 1 0 1 - b += 0.0078 * x; - x = c * m * y * k1; // 1 1 1 0 - r += 0.2118 * x; - g += 0.2119 * x; - b += 0.2235 * x; - rgb->r = clip01(dblToCol(r)); - rgb->g = clip01(dblToCol(g)); - rgb->b = clip01(dblToCol(b)); -} - -void GfxDeviceCMYKColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - cmyk->c = clip01(color->c[0]); - cmyk->m = clip01(color->c[1]); - cmyk->y = clip01(color->c[2]); - cmyk->k = clip01(color->c[3]); -} - -void GfxDeviceCMYKColorSpace::getDefaultColor(GfxColor *color) { - color->c[0] = 0; - color->c[1] = 0; - color->c[2] = 0; - color->c[3] = gfxColorComp1; -} - -//------------------------------------------------------------------------ -// GfxLabColorSpace -//------------------------------------------------------------------------ - -// This is the inverse of MatrixLMN in Example 4.10 from the PostScript -// Language Reference, Third Edition. -static double xyzrgb[3][3] = { - { 3.240449, -1.537136, -0.498531 }, - { -0.969265, 1.876011, 0.041556 }, - { 0.055643, -0.204026, 1.057229 } -}; - -GfxLabColorSpace::GfxLabColorSpace() { - whiteX = whiteY = whiteZ = 1; - blackX = blackY = blackZ = 0; - aMin = bMin = -100; - aMax = bMax = 100; -} - -GfxLabColorSpace::~GfxLabColorSpace() { -} - -GfxColorSpace *GfxLabColorSpace::copy() { - GfxLabColorSpace *cs; - - cs = new GfxLabColorSpace(); - cs->whiteX = whiteX; - cs->whiteY = whiteY; - cs->whiteZ = whiteZ; - cs->blackX = blackX; - cs->blackY = blackY; - cs->blackZ = blackZ; - cs->aMin = aMin; - cs->aMax = aMax; - cs->bMin = bMin; - cs->bMax = bMax; - cs->kr = kr; - cs->kg = kg; - cs->kb = kb; - return cs; -} - -GfxColorSpace *GfxLabColorSpace::parse(Array *arr) { - GfxLabColorSpace *cs; - Object obj1, obj2, obj3; - - arr->get(1, &obj1); - if (!obj1.isDict()) { - error(-1, "Bad Lab color space"); - obj1.free(); - return NULL; - } - cs = new GfxLabColorSpace(); - if (obj1.dictLookup("WhitePoint", &obj2)->isArray() && - obj2.arrayGetLength() == 3) { - obj2.arrayGet(0, &obj3); - cs->whiteX = obj3.getNum(); - obj3.free(); - obj2.arrayGet(1, &obj3); - cs->whiteY = obj3.getNum(); - obj3.free(); - obj2.arrayGet(2, &obj3); - cs->whiteZ = obj3.getNum(); - obj3.free(); - } - obj2.free(); - if (obj1.dictLookup("BlackPoint", &obj2)->isArray() && - obj2.arrayGetLength() == 3) { - obj2.arrayGet(0, &obj3); - cs->blackX = obj3.getNum(); - obj3.free(); - obj2.arrayGet(1, &obj3); - cs->blackY = obj3.getNum(); - obj3.free(); - obj2.arrayGet(2, &obj3); - cs->blackZ = obj3.getNum(); - obj3.free(); - } - obj2.free(); - if (obj1.dictLookup("Range", &obj2)->isArray() && - obj2.arrayGetLength() == 4) { - obj2.arrayGet(0, &obj3); - cs->aMin = obj3.getNum(); - obj3.free(); - obj2.arrayGet(1, &obj3); - cs->aMax = obj3.getNum(); - obj3.free(); - obj2.arrayGet(2, &obj3); - cs->bMin = obj3.getNum(); - obj3.free(); - obj2.arrayGet(3, &obj3); - cs->bMax = obj3.getNum(); - obj3.free(); - } - obj2.free(); - obj1.free(); - - cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX + - xyzrgb[0][1] * cs->whiteY + - xyzrgb[0][2] * cs->whiteZ); - cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX + - xyzrgb[1][1] * cs->whiteY + - xyzrgb[1][2] * cs->whiteZ); - cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX + - xyzrgb[2][1] * cs->whiteY + - xyzrgb[2][2] * cs->whiteZ); - - return cs; -} - -void GfxLabColorSpace::getGray(GfxColor *color, GfxGray *gray) { - GfxRGB rgb; - - getRGB(color, &rgb); - *gray = clip01((GfxColorComp)(0.299 * rgb.r + - 0.587 * rgb.g + - 0.114 * rgb.b + 0.5)); -} - -void GfxLabColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - double X, Y, Z; - double t1, t2; - double r, g, b; - - // convert L*a*b* to CIE 1931 XYZ color space - t1 = (colToDbl(color->c[0]) + 16) / 116; - t2 = t1 + colToDbl(color->c[1]) / 500; - if (t2 >= (6.0 / 29.0)) { - X = t2 * t2 * t2; - } else { - X = (108.0 / 841.0) * (t2 - (4.0 / 29.0)); - } - X *= whiteX; - if (t1 >= (6.0 / 29.0)) { - Y = t1 * t1 * t1; - } else { - Y = (108.0 / 841.0) * (t1 - (4.0 / 29.0)); - } - Y *= whiteY; - t2 = t1 - colToDbl(color->c[2]) / 200; - if (t2 >= (6.0 / 29.0)) { - Z = t2 * t2 * t2; - } else { - Z = (108.0 / 841.0) * (t2 - (4.0 / 29.0)); - } - Z *= whiteZ; - - // convert XYZ to RGB, including gamut mapping and gamma correction - r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z; - g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z; - b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z; - rgb->r = dblToCol(pow(clip01(r * kr), 0.5)); - rgb->g = dblToCol(pow(clip01(g * kg), 0.5)); - rgb->b = dblToCol(pow(clip01(b * kb), 0.5)); -} - -void GfxLabColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - GfxRGB rgb; - GfxColorComp c, m, y, k; - - getRGB(color, &rgb); - c = clip01(gfxColorComp1 - rgb.r); - m = clip01(gfxColorComp1 - rgb.g); - y = clip01(gfxColorComp1 - rgb.b); - k = c; - if (m < k) { - k = m; - } - if (y < k) { - k = y; - } - cmyk->c = c - k; - cmyk->m = m - k; - cmyk->y = y - k; - cmyk->k = k; -} - -void GfxLabColorSpace::getDefaultColor(GfxColor *color) { - color->c[0] = 0; - if (aMin > 0) { - color->c[1] = dblToCol(aMin); - } else if (aMax < 0) { - color->c[1] = dblToCol(aMax); - } else { - color->c[1] = 0; - } - if (bMin > 0) { - color->c[2] = dblToCol(bMin); - } else if (bMax < 0) { - color->c[2] = dblToCol(bMax); - } else { - color->c[2] = 0; - } -} - -void GfxLabColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange, - int maxImgPixel) { - decodeLow[0] = 0; - decodeRange[0] = 100; - decodeLow[1] = aMin; - decodeRange[1] = aMax - aMin; - decodeLow[2] = bMin; - decodeRange[2] = bMax - bMin; -} - -//------------------------------------------------------------------------ -// GfxICCBasedColorSpace -//------------------------------------------------------------------------ - -GfxICCBasedColorSpace::GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA, - Ref *iccProfileStreamA) { - nComps = nCompsA; - alt = altA; - iccProfileStream = *iccProfileStreamA; - rangeMin[0] = rangeMin[1] = rangeMin[2] = rangeMin[3] = 0; - rangeMax[0] = rangeMax[1] = rangeMax[2] = rangeMax[3] = 1; -} - -GfxICCBasedColorSpace::~GfxICCBasedColorSpace() { - delete alt; -} - -GfxColorSpace *GfxICCBasedColorSpace::copy() { - GfxICCBasedColorSpace *cs; - int i; - - cs = new GfxICCBasedColorSpace(nComps, alt->copy(), &iccProfileStream); - for (i = 0; i < 4; ++i) { - cs->rangeMin[i] = rangeMin[i]; - cs->rangeMax[i] = rangeMax[i]; - } - return cs; -} - -GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr) { - GfxICCBasedColorSpace *cs; - Ref iccProfileStreamA; - int nCompsA; - GfxColorSpace *altA; - Dict *dict; - Object obj1, obj2, obj3; - int i; - - arr->getNF(1, &obj1); - if (obj1.isRef()) { - iccProfileStreamA = obj1.getRef(); - } else { - iccProfileStreamA.num = 0; - iccProfileStreamA.gen = 0; - } - obj1.free(); - arr->get(1, &obj1); - if (!obj1.isStream()) { - error(-1, "Bad ICCBased color space (stream)"); - obj1.free(); - return NULL; - } - dict = obj1.streamGetDict(); - if (!dict->lookup("N", &obj2)->isInt()) { - error(-1, "Bad ICCBased color space (N)"); - obj2.free(); - obj1.free(); - return NULL; - } - nCompsA = obj2.getInt(); - obj2.free(); - if (nCompsA > gfxColorMaxComps) { - error(-1, "ICCBased color space with too many (%d > %d) components", - nCompsA, gfxColorMaxComps); - nCompsA = gfxColorMaxComps; - } - if (dict->lookup("Alternate", &obj2)->isNull() || - !(altA = GfxColorSpace::parse(&obj2))) { - switch (nCompsA) { - case 1: - altA = new GfxDeviceGrayColorSpace(); - break; - case 3: - altA = new GfxDeviceRGBColorSpace(); - break; - case 4: - altA = new GfxDeviceCMYKColorSpace(); - break; - default: - error(-1, "Bad ICCBased color space - invalid N"); - obj2.free(); - obj1.free(); - return NULL; - } - } - obj2.free(); - cs = new GfxICCBasedColorSpace(nCompsA, altA, &iccProfileStreamA); - if (dict->lookup("Range", &obj2)->isArray() && - obj2.arrayGetLength() == 2 * nCompsA) { - for (i = 0; i < nCompsA; ++i) { - obj2.arrayGet(2*i, &obj3); - cs->rangeMin[i] = obj3.getNum(); - obj3.free(); - obj2.arrayGet(2*i+1, &obj3); - cs->rangeMax[i] = obj3.getNum(); - obj3.free(); - } - } - obj2.free(); - obj1.free(); - return cs; -} - -void GfxICCBasedColorSpace::getGray(GfxColor *color, GfxGray *gray) { - alt->getGray(color, gray); -} - -void GfxICCBasedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - alt->getRGB(color, rgb); -} - -void GfxICCBasedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - alt->getCMYK(color, cmyk); -} - -void GfxICCBasedColorSpace::getDefaultColor(GfxColor *color) { - int i; - - for (i = 0; i < nComps; ++i) { - if (rangeMin[i] > 0) { - color->c[i] = dblToCol(rangeMin[i]); - } else if (rangeMax[i] < 0) { - color->c[i] = dblToCol(rangeMax[i]); - } else { - color->c[i] = 0; - } - } -} - -void GfxICCBasedColorSpace::getDefaultRanges(double *decodeLow, - double *decodeRange, - int maxImgPixel) { - alt->getDefaultRanges(decodeLow, decodeRange, maxImgPixel); - -#if 0 - // this is nominally correct, but some PDF files don't set the - // correct ranges in the ICCBased dict - int i; - - for (i = 0; i < nComps; ++i) { - decodeLow[i] = rangeMin[i]; - decodeRange[i] = rangeMax[i] - rangeMin[i]; - } -#endif -} - -//------------------------------------------------------------------------ -// GfxIndexedColorSpace -//------------------------------------------------------------------------ - -GfxIndexedColorSpace::GfxIndexedColorSpace(GfxColorSpace *baseA, - int indexHighA) { - base = baseA; - indexHigh = indexHighA; - lookup = (Guchar *)gmallocn((indexHigh + 1) * base->getNComps(), - sizeof(Guchar)); -} - -GfxIndexedColorSpace::~GfxIndexedColorSpace() { - delete base; - gfree(lookup); -} - -GfxColorSpace *GfxIndexedColorSpace::copy() { - GfxIndexedColorSpace *cs; - - cs = new GfxIndexedColorSpace(base->copy(), indexHigh); - memcpy(cs->lookup, lookup, - (indexHigh + 1) * base->getNComps() * sizeof(Guchar)); - return cs; -} - -GfxColorSpace *GfxIndexedColorSpace::parse(Array *arr) { - GfxIndexedColorSpace *cs; - GfxColorSpace *baseA; - int indexHighA; - Object obj1; - int x; - char *s; - int n, i, j; - - if (arr->getLength() != 4) { - error(-1, "Bad Indexed color space"); - goto err1; - } - arr->get(1, &obj1); - if (!(baseA = GfxColorSpace::parse(&obj1))) { - error(-1, "Bad Indexed color space (base color space)"); - goto err2; - } - obj1.free(); - if (!arr->get(2, &obj1)->isInt()) { - error(-1, "Bad Indexed color space (hival)"); - delete baseA; - goto err2; - } - indexHighA = obj1.getInt(); - if (indexHighA < 0 || indexHighA > 255) { - // the PDF spec requires indexHigh to be in [0,255] -- allowing - // values larger than 255 creates a security hole: if nComps * - // indexHigh is greater than 2^31, the loop below may overwrite - // past the end of the array - error(-1, "Bad Indexed color space (invalid indexHigh value)"); - delete baseA; - goto err2; - } - obj1.free(); - cs = new GfxIndexedColorSpace(baseA, indexHighA); - arr->get(3, &obj1); - n = baseA->getNComps(); - if (obj1.isStream()) { - obj1.streamReset(); - for (i = 0; i <= indexHighA; ++i) { - for (j = 0; j < n; ++j) { - if ((x = obj1.streamGetChar()) == EOF) { - error(-1, "Bad Indexed color space (lookup table stream too short)"); - goto err3; - } - cs->lookup[i*n + j] = (Guchar)x; - } - } - obj1.streamClose(); - } else if (obj1.isString()) { - if (obj1.getString()->getLength() < (indexHighA + 1) * n) { - error(-1, "Bad Indexed color space (lookup table string too short)"); - goto err3; - } - s = obj1.getString()->getCString(); - for (i = 0; i <= indexHighA; ++i) { - for (j = 0; j < n; ++j) { - cs->lookup[i*n + j] = (Guchar)*s++; - } - } - } else { - error(-1, "Bad Indexed color space (lookup table)"); - goto err3; - } - obj1.free(); - return cs; - - err3: - delete cs; - err2: - obj1.free(); - err1: - return NULL; -} - -GfxColor *GfxIndexedColorSpace::mapColorToBase(GfxColor *color, - GfxColor *baseColor) { - Guchar *p; - double low[gfxColorMaxComps], range[gfxColorMaxComps]; - int n, i; - - n = base->getNComps(); - base->getDefaultRanges(low, range, indexHigh); - p = &lookup[(int)(colToDbl(color->c[0]) + 0.5) * n]; - for (i = 0; i < n; ++i) { - baseColor->c[i] = dblToCol(low[i] + (p[i] / 255.0) * range[i]); - } - return baseColor; -} - -void GfxIndexedColorSpace::getGray(GfxColor *color, GfxGray *gray) { - GfxColor color2; - - base->getGray(mapColorToBase(color, &color2), gray); -} - -void GfxIndexedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - GfxColor color2; - - base->getRGB(mapColorToBase(color, &color2), rgb); -} - -void GfxIndexedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - GfxColor color2; - - base->getCMYK(mapColorToBase(color, &color2), cmyk); -} - -void GfxIndexedColorSpace::getDefaultColor(GfxColor *color) { - color->c[0] = 0; -} - -void GfxIndexedColorSpace::getDefaultRanges(double *decodeLow, - double *decodeRange, - int maxImgPixel) { - decodeLow[0] = 0; - decodeRange[0] = maxImgPixel; -} - -//------------------------------------------------------------------------ -// GfxSeparationColorSpace -//------------------------------------------------------------------------ - -GfxSeparationColorSpace::GfxSeparationColorSpace(GString *nameA, - GfxColorSpace *altA, - Function *funcA) { - name = nameA; - alt = altA; - func = funcA; - nonMarking = !name->cmp("None"); -} - -GfxSeparationColorSpace::~GfxSeparationColorSpace() { - delete name; - delete alt; - delete func; -} - -GfxColorSpace *GfxSeparationColorSpace::copy() { - return new GfxSeparationColorSpace(name->copy(), alt->copy(), func->copy()); -} - -//~ handle the 'All' and 'None' colorants -GfxColorSpace *GfxSeparationColorSpace::parse(Array *arr) { - GfxSeparationColorSpace *cs; - GString *nameA; - GfxColorSpace *altA; - Function *funcA; - Object obj1; - - if (arr->getLength() != 4) { - error(-1, "Bad Separation color space"); - goto err1; - } - if (!arr->get(1, &obj1)->isName()) { - error(-1, "Bad Separation color space (name)"); - goto err2; - } - nameA = new GString(obj1.getName()); - obj1.free(); - arr->get(2, &obj1); - if (!(altA = GfxColorSpace::parse(&obj1))) { - error(-1, "Bad Separation color space (alternate color space)"); - goto err3; - } - obj1.free(); - arr->get(3, &obj1); - if (!(funcA = Function::parse(&obj1))) { - goto err4; - } - obj1.free(); - cs = new GfxSeparationColorSpace(nameA, altA, funcA); - return cs; - - err4: - delete altA; - err3: - delete nameA; - err2: - obj1.free(); - err1: - return NULL; -} - -void GfxSeparationColorSpace::getGray(GfxColor *color, GfxGray *gray) { - double x; - double c[gfxColorMaxComps]; - GfxColor color2; - int i; - - x = colToDbl(color->c[0]); - func->transform(&x, c); - for (i = 0; i < alt->getNComps(); ++i) { - color2.c[i] = dblToCol(c[i]); - } - alt->getGray(&color2, gray); -} - -void GfxSeparationColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - double x; - double c[gfxColorMaxComps]; - GfxColor color2; - int i; - - x = colToDbl(color->c[0]); - func->transform(&x, c); - for (i = 0; i < alt->getNComps(); ++i) { - color2.c[i] = dblToCol(c[i]); - } - alt->getRGB(&color2, rgb); -} - -void GfxSeparationColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - double x; - double c[gfxColorMaxComps]; - GfxColor color2; - int i; - - x = colToDbl(color->c[0]); - func->transform(&x, c); - for (i = 0; i < alt->getNComps(); ++i) { - color2.c[i] = dblToCol(c[i]); - } - alt->getCMYK(&color2, cmyk); -} - -void GfxSeparationColorSpace::getDefaultColor(GfxColor *color) { - color->c[0] = gfxColorComp1; -} - -//------------------------------------------------------------------------ -// GfxDeviceNColorSpace -//------------------------------------------------------------------------ - -GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA, - GfxColorSpace *altA, - Function *funcA) { - nComps = nCompsA; - alt = altA; - func = funcA; - nonMarking = gFalse; -} - -GfxDeviceNColorSpace::~GfxDeviceNColorSpace() { - int i; - - for (i = 0; i < nComps; ++i) { - delete names[i]; - } - delete alt; - delete func; -} - -GfxColorSpace *GfxDeviceNColorSpace::copy() { - GfxDeviceNColorSpace *cs; - int i; - - cs = new GfxDeviceNColorSpace(nComps, alt->copy(), func->copy()); - for (i = 0; i < nComps; ++i) { - cs->names[i] = names[i]->copy(); - } - cs->nonMarking = nonMarking; - return cs; -} - -//~ handle the 'None' colorant -GfxColorSpace *GfxDeviceNColorSpace::parse(Array *arr) { - GfxDeviceNColorSpace *cs; - int nCompsA; - GString *namesA[gfxColorMaxComps]; - GfxColorSpace *altA; - Function *funcA; - Object obj1, obj2; - int i; - - if (arr->getLength() != 4 && arr->getLength() != 5) { - error(-1, "Bad DeviceN color space"); - goto err1; - } - if (!arr->get(1, &obj1)->isArray()) { - error(-1, "Bad DeviceN color space (names)"); - goto err2; - } - nCompsA = obj1.arrayGetLength(); - if (nCompsA > gfxColorMaxComps) { - error(-1, "DeviceN color space with too many (%d > %d) components", - nCompsA, gfxColorMaxComps); - nCompsA = gfxColorMaxComps; - } - for (i = 0; i < nCompsA; ++i) { - if (!obj1.arrayGet(i, &obj2)->isName()) { - error(-1, "Bad DeviceN color space (names)"); - obj2.free(); - goto err2; - } - namesA[i] = new GString(obj2.getName()); - obj2.free(); - } - obj1.free(); - arr->get(2, &obj1); - if (!(altA = GfxColorSpace::parse(&obj1))) { - error(-1, "Bad DeviceN color space (alternate color space)"); - goto err3; - } - obj1.free(); - arr->get(3, &obj1); - if (!(funcA = Function::parse(&obj1))) { - goto err4; - } - obj1.free(); - cs = new GfxDeviceNColorSpace(nCompsA, altA, funcA); - cs->nonMarking = gTrue; - for (i = 0; i < nCompsA; ++i) { - cs->names[i] = namesA[i]; - if (namesA[i]->cmp("None")) { - cs->nonMarking = gFalse; - } - } - return cs; - - err4: - delete altA; - err3: - for (i = 0; i < nCompsA; ++i) { - delete namesA[i]; - } - err2: - obj1.free(); - err1: - return NULL; -} - -void GfxDeviceNColorSpace::getGray(GfxColor *color, GfxGray *gray) { - double x[gfxColorMaxComps], c[gfxColorMaxComps]; - GfxColor color2; - int i; - - for (i = 0; i < nComps; ++i) { - x[i] = colToDbl(color->c[i]); - } - func->transform(x, c); - for (i = 0; i < alt->getNComps(); ++i) { - color2.c[i] = dblToCol(c[i]); - } - alt->getGray(&color2, gray); -} - -void GfxDeviceNColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - double x[gfxColorMaxComps], c[gfxColorMaxComps]; - GfxColor color2; - int i; - - for (i = 0; i < nComps; ++i) { - x[i] = colToDbl(color->c[i]); - } - func->transform(x, c); - for (i = 0; i < alt->getNComps(); ++i) { - color2.c[i] = dblToCol(c[i]); - } - alt->getRGB(&color2, rgb); -} - -void GfxDeviceNColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - double x[gfxColorMaxComps], c[gfxColorMaxComps]; - GfxColor color2; - int i; - - for (i = 0; i < nComps; ++i) { - x[i] = colToDbl(color->c[i]); - } - func->transform(x, c); - for (i = 0; i < alt->getNComps(); ++i) { - color2.c[i] = dblToCol(c[i]); - } - alt->getCMYK(&color2, cmyk); -} - -void GfxDeviceNColorSpace::getDefaultColor(GfxColor *color) { - int i; - - for (i = 0; i < nComps; ++i) { - color->c[i] = gfxColorComp1; - } -} - -//------------------------------------------------------------------------ -// GfxPatternColorSpace -//------------------------------------------------------------------------ - -GfxPatternColorSpace::GfxPatternColorSpace(GfxColorSpace *underA) { - under = underA; -} - -GfxPatternColorSpace::~GfxPatternColorSpace() { - if (under) { - delete under; - } -} - -GfxColorSpace *GfxPatternColorSpace::copy() { - return new GfxPatternColorSpace(under ? under->copy() : - (GfxColorSpace *)NULL); -} - -GfxColorSpace *GfxPatternColorSpace::parse(Array *arr) { - GfxPatternColorSpace *cs; - GfxColorSpace *underA; - Object obj1; - - if (arr->getLength() != 1 && arr->getLength() != 2) { - error(-1, "Bad Pattern color space"); - return NULL; - } - underA = NULL; - if (arr->getLength() == 2) { - arr->get(1, &obj1); - if (!(underA = GfxColorSpace::parse(&obj1))) { - error(-1, "Bad Pattern color space (underlying color space)"); - obj1.free(); - return NULL; - } - obj1.free(); - } - cs = new GfxPatternColorSpace(underA); - return cs; -} - -void GfxPatternColorSpace::getGray(GfxColor *color, GfxGray *gray) { - *gray = 0; -} - -void GfxPatternColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) { - rgb->r = rgb->g = rgb->b = 0; -} - -void GfxPatternColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - cmyk->c = cmyk->m = cmyk->y = 0; - cmyk->k = 1; -} - -void GfxPatternColorSpace::getDefaultColor(GfxColor *color) { - // not used -} - -//------------------------------------------------------------------------ -// Pattern -//------------------------------------------------------------------------ - -GfxPattern::GfxPattern(int typeA) { - type = typeA; -} - -GfxPattern::~GfxPattern() { -} - -GfxPattern *GfxPattern::parse(Object *obj) { - GfxPattern *pattern; - Object obj1; - - if (obj->isDict()) { - obj->dictLookup("PatternType", &obj1); - } else if (obj->isStream()) { - obj->streamGetDict()->lookup("PatternType", &obj1); - } else { - return NULL; - } - pattern = NULL; - if (obj1.isInt() && obj1.getInt() == 1) { - pattern = GfxTilingPattern::parse(obj); - } else if (obj1.isInt() && obj1.getInt() == 2) { - pattern = GfxShadingPattern::parse(obj); - } - obj1.free(); - return pattern; -} - -//------------------------------------------------------------------------ -// GfxTilingPattern -//------------------------------------------------------------------------ - -GfxTilingPattern *GfxTilingPattern::parse(Object *patObj) { - GfxTilingPattern *pat; - Dict *dict; - int paintTypeA, tilingTypeA; - double bboxA[4], matrixA[6]; - double xStepA, yStepA; - Object resDictA; - Object obj1, obj2; - int i; - - if (!patObj->isStream()) { - return NULL; - } - dict = patObj->streamGetDict(); - - if (dict->lookup("PaintType", &obj1)->isInt()) { - paintTypeA = obj1.getInt(); - } else { - paintTypeA = 1; - error(-1, "Invalid or missing PaintType in pattern"); - } - obj1.free(); - if (dict->lookup("TilingType", &obj1)->isInt()) { - tilingTypeA = obj1.getInt(); - } else { - tilingTypeA = 1; - error(-1, "Invalid or missing TilingType in pattern"); - } - obj1.free(); - bboxA[0] = bboxA[1] = 0; - bboxA[2] = bboxA[3] = 1; - if (dict->lookup("BBox", &obj1)->isArray() && - obj1.arrayGetLength() == 4) { - for (i = 0; i < 4; ++i) { - if (obj1.arrayGet(i, &obj2)->isNum()) { - bboxA[i] = obj2.getNum(); - } - obj2.free(); - } - } else { - error(-1, "Invalid or missing BBox in pattern"); - } - obj1.free(); - if (dict->lookup("XStep", &obj1)->isNum()) { - xStepA = obj1.getNum(); - } else { - xStepA = 1; - error(-1, "Invalid or missing XStep in pattern"); - } - obj1.free(); - if (dict->lookup("YStep", &obj1)->isNum()) { - yStepA = obj1.getNum(); - } else { - yStepA = 1; - error(-1, "Invalid or missing YStep in pattern"); - } - obj1.free(); - if (!dict->lookup("Resources", &resDictA)->isDict()) { - resDictA.free(); - resDictA.initNull(); - error(-1, "Invalid or missing Resources in pattern"); - } - matrixA[0] = 1; matrixA[1] = 0; - matrixA[2] = 0; matrixA[3] = 1; - matrixA[4] = 0; matrixA[5] = 0; - if (dict->lookup("Matrix", &obj1)->isArray() && - obj1.arrayGetLength() == 6) { - for (i = 0; i < 6; ++i) { - if (obj1.arrayGet(i, &obj2)->isNum()) { - matrixA[i] = obj2.getNum(); - } - obj2.free(); - } - } - obj1.free(); - - pat = new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA, - &resDictA, matrixA, patObj); - resDictA.free(); - return pat; -} - -GfxTilingPattern::GfxTilingPattern(int paintTypeA, int tilingTypeA, - double *bboxA, double xStepA, double yStepA, - Object *resDictA, double *matrixA, - Object *contentStreamA): - GfxPattern(1) -{ - int i; - - paintType = paintTypeA; - tilingType = tilingTypeA; - for (i = 0; i < 4; ++i) { - bbox[i] = bboxA[i]; - } - xStep = xStepA; - yStep = yStepA; - resDictA->copy(&resDict); - for (i = 0; i < 6; ++i) { - matrix[i] = matrixA[i]; - } - contentStreamA->copy(&contentStream); -} - -GfxTilingPattern::~GfxTilingPattern() { - resDict.free(); - contentStream.free(); -} - -GfxPattern *GfxTilingPattern::copy() { - return new GfxTilingPattern(paintType, tilingType, bbox, xStep, yStep, - &resDict, matrix, &contentStream); -} - -//------------------------------------------------------------------------ -// GfxShadingPattern -//------------------------------------------------------------------------ - -GfxShadingPattern *GfxShadingPattern::parse(Object *patObj) { - Dict *dict; - GfxShading *shadingA; - double matrixA[6]; - Object obj1, obj2; - int i; - - if (!patObj->isDict()) { - return NULL; - } - dict = patObj->getDict(); - - dict->lookup("Shading", &obj1); - shadingA = GfxShading::parse(&obj1); - obj1.free(); - if (!shadingA) { - return NULL; - } - - matrixA[0] = 1; matrixA[1] = 0; - matrixA[2] = 0; matrixA[3] = 1; - matrixA[4] = 0; matrixA[5] = 0; - if (dict->lookup("Matrix", &obj1)->isArray() && - obj1.arrayGetLength() == 6) { - for (i = 0; i < 6; ++i) { - if (obj1.arrayGet(i, &obj2)->isNum()) { - matrixA[i] = obj2.getNum(); - } - obj2.free(); - } - } - obj1.free(); - - return new GfxShadingPattern(shadingA, matrixA); -} - -GfxShadingPattern::GfxShadingPattern(GfxShading *shadingA, double *matrixA): - GfxPattern(2) -{ - int i; - - shading = shadingA; - for (i = 0; i < 6; ++i) { - matrix[i] = matrixA[i]; - } -} - -GfxShadingPattern::~GfxShadingPattern() { - delete shading; -} - -GfxPattern *GfxShadingPattern::copy() { - return new GfxShadingPattern(shading->copy(), matrix); -} - -//------------------------------------------------------------------------ -// GfxShading -//------------------------------------------------------------------------ - -GfxShading::GfxShading(int typeA) { - type = typeA; - colorSpace = NULL; -} - -GfxShading::GfxShading(GfxShading *shading) { - int i; - - type = shading->type; - colorSpace = shading->colorSpace->copy(); - for (i = 0; i < gfxColorMaxComps; ++i) { - background.c[i] = shading->background.c[i]; - } - hasBackground = shading->hasBackground; - xMin = shading->xMin; - yMin = shading->yMin; - xMax = shading->xMax; - yMax = shading->yMax; - hasBBox = shading->hasBBox; -} - -GfxShading::~GfxShading() { - if (colorSpace) { - delete colorSpace; - } -} - -GfxShading *GfxShading::parse(Object *obj) { - GfxShading *shading; - Dict *dict; - int typeA; - Object obj1; - - if (obj->isDict()) { - dict = obj->getDict(); - } else if (obj->isStream()) { - dict = obj->streamGetDict(); - } else { - return NULL; - } - - if (!dict->lookup("ShadingType", &obj1)->isInt()) { - error(-1, "Invalid ShadingType in shading dictionary"); - obj1.free(); - return NULL; - } - typeA = obj1.getInt(); - obj1.free(); - - switch (typeA) { - case 1: - shading = GfxFunctionShading::parse(dict); - break; - case 2: - shading = GfxAxialShading::parse(dict); - break; - case 3: - shading = GfxRadialShading::parse(dict); - break; - case 4: - if (obj->isStream()) { - shading = GfxGouraudTriangleShading::parse(4, dict, obj->getStream()); - } else { - error(-1, "Invalid Type 4 shading object"); - goto err1; - } - break; - case 5: - if (obj->isStream()) { - shading = GfxGouraudTriangleShading::parse(5, dict, obj->getStream()); - } else { - error(-1, "Invalid Type 5 shading object"); - goto err1; - } - break; - case 6: - if (obj->isStream()) { - shading = GfxPatchMeshShading::parse(6, dict, obj->getStream()); - } else { - error(-1, "Invalid Type 6 shading object"); - goto err1; - } - break; - case 7: - if (obj->isStream()) { - shading = GfxPatchMeshShading::parse(7, dict, obj->getStream()); - } else { - error(-1, "Invalid Type 7 shading object"); - goto err1; - } - break; - default: - error(-1, "Unimplemented shading type %d", typeA); - goto err1; - } - - return shading; - - err1: - return NULL; -} - -GBool GfxShading::init(Dict *dict) { - Object obj1, obj2; - int i; - - dict->lookup("ColorSpace", &obj1); - if (!(colorSpace = GfxColorSpace::parse(&obj1))) { - error(-1, "Bad color space in shading dictionary"); - obj1.free(); - return gFalse; - } - obj1.free(); - - for (i = 0; i < gfxColorMaxComps; ++i) { - background.c[i] = 0; - } - hasBackground = gFalse; - if (dict->lookup("Background", &obj1)->isArray()) { - if (obj1.arrayGetLength() == colorSpace->getNComps()) { - hasBackground = gTrue; - for (i = 0; i < colorSpace->getNComps(); ++i) { - background.c[i] = dblToCol(obj1.arrayGet(i, &obj2)->getNum()); - obj2.free(); - } - } else { - error(-1, "Bad Background in shading dictionary"); - } - } - obj1.free(); - - xMin = yMin = xMax = yMax = 0; - hasBBox = gFalse; - if (dict->lookup("BBox", &obj1)->isArray()) { - if (obj1.arrayGetLength() == 4) { - hasBBox = gTrue; - xMin = obj1.arrayGet(0, &obj2)->getNum(); - obj2.free(); - yMin = obj1.arrayGet(1, &obj2)->getNum(); - obj2.free(); - xMax = obj1.arrayGet(2, &obj2)->getNum(); - obj2.free(); - yMax = obj1.arrayGet(3, &obj2)->getNum(); - obj2.free(); - } else { - error(-1, "Bad BBox in shading dictionary"); - } - } - obj1.free(); - - return gTrue; -} - -//------------------------------------------------------------------------ -// GfxFunctionShading -//------------------------------------------------------------------------ - -GfxFunctionShading::GfxFunctionShading(double x0A, double y0A, - double x1A, double y1A, - double *matrixA, - Function **funcsA, int nFuncsA): - GfxShading(1) -{ - int i; - - x0 = x0A; - y0 = y0A; - x1 = x1A; - y1 = y1A; - for (i = 0; i < 6; ++i) { - matrix[i] = matrixA[i]; - } - nFuncs = nFuncsA; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = funcsA[i]; - } -} - -GfxFunctionShading::GfxFunctionShading(GfxFunctionShading *shading): - GfxShading(shading) -{ - int i; - - x0 = shading->x0; - y0 = shading->y0; - x1 = shading->x1; - y1 = shading->y1; - for (i = 0; i < 6; ++i) { - matrix[i] = shading->matrix[i]; - } - nFuncs = shading->nFuncs; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = shading->funcs[i]->copy(); - } -} - -GfxFunctionShading::~GfxFunctionShading() { - int i; - - for (i = 0; i < nFuncs; ++i) { - delete funcs[i]; - } -} - -GfxFunctionShading *GfxFunctionShading::parse(Dict *dict) { - GfxFunctionShading *shading; - double x0A, y0A, x1A, y1A; - double matrixA[6]; - Function *funcsA[gfxColorMaxComps]; - int nFuncsA; - Object obj1, obj2; - int i; - - x0A = y0A = 0; - x1A = y1A = 1; - if (dict->lookup("Domain", &obj1)->isArray() && - obj1.arrayGetLength() == 4) { - x0A = obj1.arrayGet(0, &obj2)->getNum(); - obj2.free(); - y0A = obj1.arrayGet(1, &obj2)->getNum(); - obj2.free(); - x1A = obj1.arrayGet(2, &obj2)->getNum(); - obj2.free(); - y1A = obj1.arrayGet(3, &obj2)->getNum(); - obj2.free(); - } - obj1.free(); - - matrixA[0] = 1; matrixA[1] = 0; - matrixA[2] = 0; matrixA[3] = 1; - matrixA[4] = 0; matrixA[5] = 0; - if (dict->lookup("Matrix", &obj1)->isArray() && - obj1.arrayGetLength() == 6) { - matrixA[0] = obj1.arrayGet(0, &obj2)->getNum(); - obj2.free(); - matrixA[1] = obj1.arrayGet(1, &obj2)->getNum(); - obj2.free(); - matrixA[2] = obj1.arrayGet(2, &obj2)->getNum(); - obj2.free(); - matrixA[3] = obj1.arrayGet(3, &obj2)->getNum(); - obj2.free(); - matrixA[4] = obj1.arrayGet(4, &obj2)->getNum(); - obj2.free(); - matrixA[5] = obj1.arrayGet(5, &obj2)->getNum(); - obj2.free(); - } - obj1.free(); - - dict->lookup("Function", &obj1); - if (obj1.isArray()) { - nFuncsA = obj1.arrayGetLength(); - if (nFuncsA > gfxColorMaxComps) { - error(-1, "Invalid Function array in shading dictionary"); - goto err1; - } - for (i = 0; i < nFuncsA; ++i) { - obj1.arrayGet(i, &obj2); - if (!(funcsA[i] = Function::parse(&obj2))) { - goto err2; - } - obj2.free(); - } - } else { - nFuncsA = 1; - if (!(funcsA[0] = Function::parse(&obj1))) { - goto err1; - } - } - obj1.free(); - - shading = new GfxFunctionShading(x0A, y0A, x1A, y1A, matrixA, - funcsA, nFuncsA); - if (!shading->init(dict)) { - delete shading; - return NULL; - } - return shading; - - err2: - obj2.free(); - err1: - obj1.free(); - return NULL; -} - -GfxShading *GfxFunctionShading::copy() { - return new GfxFunctionShading(this); -} - -void GfxFunctionShading::getColor(double x, double y, GfxColor *color) { - double in[2], out[gfxColorMaxComps]; - int i; - - // NB: there can be one function with n outputs or n functions with - // one output each (where n = number of color components) - for (i = 0; i < gfxColorMaxComps; ++i) { - out[i] = 0; - } - in[0] = x; - in[1] = y; - for (i = 0; i < nFuncs; ++i) { - funcs[i]->transform(in, &out[i]); - } - for (i = 0; i < gfxColorMaxComps; ++i) { - color->c[i] = dblToCol(out[i]); - } -} - -//------------------------------------------------------------------------ -// GfxAxialShading -//------------------------------------------------------------------------ - -GfxAxialShading::GfxAxialShading(double x0A, double y0A, - double x1A, double y1A, - double t0A, double t1A, - Function **funcsA, int nFuncsA, - GBool extend0A, GBool extend1A): - GfxShading(2) -{ - int i; - - x0 = x0A; - y0 = y0A; - x1 = x1A; - y1 = y1A; - t0 = t0A; - t1 = t1A; - nFuncs = nFuncsA; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = funcsA[i]; - } - extend0 = extend0A; - extend1 = extend1A; -} - -GfxAxialShading::GfxAxialShading(GfxAxialShading *shading): - GfxShading(shading) -{ - int i; - - x0 = shading->x0; - y0 = shading->y0; - x1 = shading->x1; - y1 = shading->y1; - t0 = shading->t0; - y1 = shading->t1; - nFuncs = shading->nFuncs; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = shading->funcs[i]->copy(); - } - extend0 = shading->extend0; - extend1 = shading->extend1; -} - -GfxAxialShading::~GfxAxialShading() { - int i; - - for (i = 0; i < nFuncs; ++i) { - delete funcs[i]; - } -} - -GfxAxialShading *GfxAxialShading::parse(Dict *dict) { - GfxAxialShading *shading; - double x0A, y0A, x1A, y1A; - double t0A, t1A; - Function *funcsA[gfxColorMaxComps]; - int nFuncsA; - GBool extend0A, extend1A; - Object obj1, obj2; - int i; - - x0A = y0A = x1A = y1A = 0; - if (dict->lookup("Coords", &obj1)->isArray() && - obj1.arrayGetLength() == 4) { - x0A = obj1.arrayGet(0, &obj2)->getNum(); - obj2.free(); - y0A = obj1.arrayGet(1, &obj2)->getNum(); - obj2.free(); - x1A = obj1.arrayGet(2, &obj2)->getNum(); - obj2.free(); - y1A = obj1.arrayGet(3, &obj2)->getNum(); - obj2.free(); - } else { - error(-1, "Missing or invalid Coords in shading dictionary"); - goto err1; - } - obj1.free(); - - t0A = 0; - t1A = 1; - if (dict->lookup("Domain", &obj1)->isArray() && - obj1.arrayGetLength() == 2) { - t0A = obj1.arrayGet(0, &obj2)->getNum(); - obj2.free(); - t1A = obj1.arrayGet(1, &obj2)->getNum(); - obj2.free(); - } - obj1.free(); - - dict->lookup("Function", &obj1); - if (obj1.isArray()) { - nFuncsA = obj1.arrayGetLength(); - if (nFuncsA > gfxColorMaxComps) { - error(-1, "Invalid Function array in shading dictionary"); - goto err1; - } - for (i = 0; i < nFuncsA; ++i) { - obj1.arrayGet(i, &obj2); - if (!(funcsA[i] = Function::parse(&obj2))) { - obj1.free(); - obj2.free(); - goto err1; - } - obj2.free(); - } - } else { - nFuncsA = 1; - if (!(funcsA[0] = Function::parse(&obj1))) { - obj1.free(); - goto err1; - } - } - obj1.free(); - - extend0A = extend1A = gFalse; - if (dict->lookup("Extend", &obj1)->isArray() && - obj1.arrayGetLength() == 2) { - extend0A = obj1.arrayGet(0, &obj2)->getBool(); - obj2.free(); - extend1A = obj1.arrayGet(1, &obj2)->getBool(); - obj2.free(); - } - obj1.free(); - - shading = new GfxAxialShading(x0A, y0A, x1A, y1A, t0A, t1A, - funcsA, nFuncsA, extend0A, extend1A); - if (!shading->init(dict)) { - delete shading; - return NULL; - } - return shading; - - err1: - return NULL; -} - -GfxShading *GfxAxialShading::copy() { - return new GfxAxialShading(this); -} - -void GfxAxialShading::getColor(double t, GfxColor *color) { - double out[gfxColorMaxComps]; - int i; - - // NB: there can be one function with n outputs or n functions with - // one output each (where n = number of color components) - for (i = 0; i < gfxColorMaxComps; ++i) { - out[i] = 0; - } - for (i = 0; i < nFuncs; ++i) { - funcs[i]->transform(&t, &out[i]); - } - for (i = 0; i < gfxColorMaxComps; ++i) { - color->c[i] = dblToCol(out[i]); - } -} - -//------------------------------------------------------------------------ -// GfxRadialShading -//------------------------------------------------------------------------ - -GfxRadialShading::GfxRadialShading(double x0A, double y0A, double r0A, - double x1A, double y1A, double r1A, - double t0A, double t1A, - Function **funcsA, int nFuncsA, - GBool extend0A, GBool extend1A): - GfxShading(3) -{ - int i; - - x0 = x0A; - y0 = y0A; - r0 = r0A; - x1 = x1A; - y1 = y1A; - r1 = r1A; - t0 = t0A; - t1 = t1A; - nFuncs = nFuncsA; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = funcsA[i]; - } - extend0 = extend0A; - extend1 = extend1A; -} - -GfxRadialShading::GfxRadialShading(GfxRadialShading *shading): - GfxShading(shading) -{ - int i; - - x0 = shading->x0; - y0 = shading->y0; - r0 = shading->r0; - x1 = shading->x1; - y1 = shading->y1; - r1 = shading->r1; - t0 = shading->t0; - y1 = shading->t1; - nFuncs = shading->nFuncs; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = shading->funcs[i]->copy(); - } - extend0 = shading->extend0; - extend1 = shading->extend1; -} - -GfxRadialShading::~GfxRadialShading() { - int i; - - for (i = 0; i < nFuncs; ++i) { - delete funcs[i]; - } -} - -GfxRadialShading *GfxRadialShading::parse(Dict *dict) { - GfxRadialShading *shading; - double x0A, y0A, r0A, x1A, y1A, r1A; - double t0A, t1A; - Function *funcsA[gfxColorMaxComps]; - int nFuncsA; - GBool extend0A, extend1A; - Object obj1, obj2; - int i; - - x0A = y0A = r0A = x1A = y1A = r1A = 0; - if (dict->lookup("Coords", &obj1)->isArray() && - obj1.arrayGetLength() == 6) { - x0A = obj1.arrayGet(0, &obj2)->getNum(); - obj2.free(); - y0A = obj1.arrayGet(1, &obj2)->getNum(); - obj2.free(); - r0A = obj1.arrayGet(2, &obj2)->getNum(); - obj2.free(); - x1A = obj1.arrayGet(3, &obj2)->getNum(); - obj2.free(); - y1A = obj1.arrayGet(4, &obj2)->getNum(); - obj2.free(); - r1A = obj1.arrayGet(5, &obj2)->getNum(); - obj2.free(); - } else { - error(-1, "Missing or invalid Coords in shading dictionary"); - goto err1; - } - obj1.free(); - - t0A = 0; - t1A = 1; - if (dict->lookup("Domain", &obj1)->isArray() && - obj1.arrayGetLength() == 2) { - t0A = obj1.arrayGet(0, &obj2)->getNum(); - obj2.free(); - t1A = obj1.arrayGet(1, &obj2)->getNum(); - obj2.free(); - } - obj1.free(); - - dict->lookup("Function", &obj1); - if (obj1.isArray()) { - nFuncsA = obj1.arrayGetLength(); - if (nFuncsA > gfxColorMaxComps) { - error(-1, "Invalid Function array in shading dictionary"); - goto err1; - } - for (i = 0; i < nFuncsA; ++i) { - obj1.arrayGet(i, &obj2); - if (!(funcsA[i] = Function::parse(&obj2))) { - obj1.free(); - obj2.free(); - goto err1; - } - obj2.free(); - } - } else { - nFuncsA = 1; - if (!(funcsA[0] = Function::parse(&obj1))) { - obj1.free(); - goto err1; - } - } - obj1.free(); - - extend0A = extend1A = gFalse; - if (dict->lookup("Extend", &obj1)->isArray() && - obj1.arrayGetLength() == 2) { - extend0A = obj1.arrayGet(0, &obj2)->getBool(); - obj2.free(); - extend1A = obj1.arrayGet(1, &obj2)->getBool(); - obj2.free(); - } - obj1.free(); - - shading = new GfxRadialShading(x0A, y0A, r0A, x1A, y1A, r1A, t0A, t1A, - funcsA, nFuncsA, extend0A, extend1A); - if (!shading->init(dict)) { - delete shading; - return NULL; - } - return shading; - - err1: - return NULL; -} - -GfxShading *GfxRadialShading::copy() { - return new GfxRadialShading(this); -} - -void GfxRadialShading::getColor(double t, GfxColor *color) { - double out[gfxColorMaxComps]; - int i; - - // NB: there can be one function with n outputs or n functions with - // one output each (where n = number of color components) - for (i = 0; i < gfxColorMaxComps; ++i) { - out[i] = 0; - } - for (i = 0; i < nFuncs; ++i) { - funcs[i]->transform(&t, &out[i]); - } - for (i = 0; i < gfxColorMaxComps; ++i) { - color->c[i] = dblToCol(out[i]); - } -} - -//------------------------------------------------------------------------ -// GfxShadingBitBuf -//------------------------------------------------------------------------ - -class GfxShadingBitBuf { -public: - - GfxShadingBitBuf(Stream *strA); - ~GfxShadingBitBuf(); - GBool getBits(int n, Guint *val); - void flushBits(); - -private: - - Stream *str; - int bitBuf; - int nBits; -}; - -GfxShadingBitBuf::GfxShadingBitBuf(Stream *strA) { - str = strA; - str->reset(); - bitBuf = 0; - nBits = 0; -} - -GfxShadingBitBuf::~GfxShadingBitBuf() { - str->close(); -} - -GBool GfxShadingBitBuf::getBits(int n, Guint *val) { - int x; - - if (nBits >= n) { - x = (bitBuf >> (nBits - n)) & ((1 << n) - 1); - nBits -= n; - } else { - x = 0; - if (nBits > 0) { - x = bitBuf & ((1 << nBits) - 1); - n -= nBits; - nBits = 0; - } - while (n > 0) { - if ((bitBuf = str->getChar()) == EOF) { - nBits = 0; - return gFalse; - } - if (n >= 8) { - x = (x << 8) | bitBuf; - n -= 8; - } else { - x = (x << n) | (bitBuf >> (8 - n)); - nBits = 8 - n; - n = 0; - } - } - } - *val = x; - return gTrue; -} - -void GfxShadingBitBuf::flushBits() { - bitBuf = 0; - nBits = 0; -} - -//------------------------------------------------------------------------ -// GfxGouraudTriangleShading -//------------------------------------------------------------------------ - -GfxGouraudTriangleShading::GfxGouraudTriangleShading( - int typeA, - GfxGouraudVertex *verticesA, int nVerticesA, - int (*trianglesA)[3], int nTrianglesA, - Function **funcsA, int nFuncsA): - GfxShading(typeA) -{ - int i; - - vertices = verticesA; - nVertices = nVerticesA; - triangles = trianglesA; - nTriangles = nTrianglesA; - nFuncs = nFuncsA; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = funcsA[i]; - } -} - -GfxGouraudTriangleShading::GfxGouraudTriangleShading( - GfxGouraudTriangleShading *shading): - GfxShading(shading) -{ - int i; - - nVertices = shading->nVertices; - vertices = (GfxGouraudVertex *)gmallocn(nVertices, sizeof(GfxGouraudVertex)); - memcpy(vertices, shading->vertices, nVertices * sizeof(GfxGouraudVertex)); - nTriangles = shading->nTriangles; - triangles = (int (*)[3])gmallocn(nTriangles * 3, sizeof(int)); - memcpy(triangles, shading->triangles, nTriangles * 3 * sizeof(int)); - nFuncs = shading->nFuncs; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = shading->funcs[i]->copy(); - } -} - -GfxGouraudTriangleShading::~GfxGouraudTriangleShading() { - int i; - - gfree(vertices); - gfree(triangles); - for (i = 0; i < nFuncs; ++i) { - delete funcs[i]; - } -} - -GfxGouraudTriangleShading *GfxGouraudTriangleShading::parse(int typeA, - Dict *dict, - Stream *str) { - GfxGouraudTriangleShading *shading; - Function *funcsA[gfxColorMaxComps]; - int nFuncsA; - int coordBits, compBits, flagBits, vertsPerRow, nRows; - double xMin, xMax, yMin, yMax; - double cMin[gfxColorMaxComps], cMax[gfxColorMaxComps]; - double xMul, yMul; - double cMul[gfxColorMaxComps]; - GfxGouraudVertex *verticesA; - int (*trianglesA)[3]; - int nComps, nVerticesA, nTrianglesA, vertSize, triSize; - Guint x, y, flag; - Guint c[gfxColorMaxComps]; - GfxShadingBitBuf *bitBuf; - Object obj1, obj2; - int i, j, k, state; - - if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) { - coordBits = obj1.getInt(); - } else { - error(-1, "Missing or invalid BitsPerCoordinate in shading dictionary"); - goto err2; - } - obj1.free(); - if (dict->lookup("BitsPerComponent", &obj1)->isInt()) { - compBits = obj1.getInt(); - } else { - error(-1, "Missing or invalid BitsPerComponent in shading dictionary"); - goto err2; - } - obj1.free(); - flagBits = vertsPerRow = 0; // make gcc happy - if (typeA == 4) { - if (dict->lookup("BitsPerFlag", &obj1)->isInt()) { - flagBits = obj1.getInt(); - } else { - error(-1, "Missing or invalid BitsPerFlag in shading dictionary"); - goto err2; - } - obj1.free(); - } else { - if (dict->lookup("VerticesPerRow", &obj1)->isInt()) { - vertsPerRow = obj1.getInt(); - } else { - error(-1, "Missing or invalid VerticesPerRow in shading dictionary"); - goto err2; - } - obj1.free(); - } - if (dict->lookup("Decode", &obj1)->isArray() && - obj1.arrayGetLength() >= 6) { - xMin = obj1.arrayGet(0, &obj2)->getNum(); - obj2.free(); - xMax = obj1.arrayGet(1, &obj2)->getNum(); - obj2.free(); - xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1); - yMin = obj1.arrayGet(2, &obj2)->getNum(); - obj2.free(); - yMax = obj1.arrayGet(3, &obj2)->getNum(); - obj2.free(); - yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1); - for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) { - cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum(); - obj2.free(); - cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum(); - obj2.free(); - cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1); - } - nComps = i; - } else { - error(-1, "Missing or invalid Decode array in shading dictionary"); - goto err2; - } - obj1.free(); - - if (!dict->lookup("Function", &obj1)->isNull()) { - if (obj1.isArray()) { - nFuncsA = obj1.arrayGetLength(); - if (nFuncsA > gfxColorMaxComps) { - error(-1, "Invalid Function array in shading dictionary"); - goto err1; - } - for (i = 0; i < nFuncsA; ++i) { - obj1.arrayGet(i, &obj2); - if (!(funcsA[i] = Function::parse(&obj2))) { - obj1.free(); - obj2.free(); - goto err1; - } - obj2.free(); - } - } else { - nFuncsA = 1; - if (!(funcsA[0] = Function::parse(&obj1))) { - obj1.free(); - goto err1; - } - } - } else { - nFuncsA = 0; - } - obj1.free(); - - nVerticesA = nTrianglesA = 0; - verticesA = NULL; - trianglesA = NULL; - vertSize = triSize = 0; - state = 0; - flag = 0; // make gcc happy - bitBuf = new GfxShadingBitBuf(str); - while (1) { - if (typeA == 4) { - if (!bitBuf->getBits(flagBits, &flag)) { - break; - } - } - if (!bitBuf->getBits(coordBits, &x) || - !bitBuf->getBits(coordBits, &y)) { - break; - } - for (i = 0; i < nComps; ++i) { - if (!bitBuf->getBits(compBits, &c[i])) { - break; - } - } - if (i < nComps) { - break; - } - if (nVerticesA == vertSize) { - vertSize = (vertSize == 0) ? 16 : 2 * vertSize; - verticesA = (GfxGouraudVertex *) - greallocn(verticesA, vertSize, sizeof(GfxGouraudVertex)); - } - verticesA[nVerticesA].x = xMin + xMul * (double)x; - verticesA[nVerticesA].y = yMin + yMul * (double)y; - for (i = 0; i < nComps; ++i) { - verticesA[nVerticesA].color.c[i] = - dblToCol(cMin[i] + cMul[i] * (double)c[i]); - } - ++nVerticesA; - bitBuf->flushBits(); - if (typeA == 4) { - if (state == 0 || state == 1) { - ++state; - } else if (state == 2 || flag > 0) { - if (nTrianglesA == triSize) { - triSize = (triSize == 0) ? 16 : 2 * triSize; - trianglesA = (int (*)[3]) - greallocn(trianglesA, triSize * 3, sizeof(int)); - } - if (state == 2) { - trianglesA[nTrianglesA][0] = nVerticesA - 3; - trianglesA[nTrianglesA][1] = nVerticesA - 2; - trianglesA[nTrianglesA][2] = nVerticesA - 1; - ++state; - } else if (flag == 1) { - trianglesA[nTrianglesA][0] = trianglesA[nTrianglesA - 1][1]; - trianglesA[nTrianglesA][1] = trianglesA[nTrianglesA - 1][2]; - trianglesA[nTrianglesA][2] = nVerticesA - 1; - } else { // flag == 2 - trianglesA[nTrianglesA][0] = trianglesA[nTrianglesA - 1][0]; - trianglesA[nTrianglesA][1] = trianglesA[nTrianglesA - 1][2]; - trianglesA[nTrianglesA][2] = nVerticesA - 1; - } - ++nTrianglesA; - } else { // state == 3 && flag == 0 - state = 1; - } - } - } - delete bitBuf; - if (typeA == 5) { - nRows = nVerticesA / vertsPerRow; - nTrianglesA = (nRows - 1) * 2 * (vertsPerRow - 1); - trianglesA = (int (*)[3])gmallocn(nTrianglesA * 3, sizeof(int)); - k = 0; - for (i = 0; i < nRows - 1; ++i) { - for (j = 0; j < vertsPerRow - 1; ++j) { - trianglesA[k][0] = i * vertsPerRow + j; - trianglesA[k][1] = i * vertsPerRow + j+1; - trianglesA[k][2] = (i+1) * vertsPerRow + j; - ++k; - trianglesA[k][0] = i * vertsPerRow + j+1; - trianglesA[k][1] = (i+1) * vertsPerRow + j; - trianglesA[k][2] = (i+1) * vertsPerRow + j+1; - ++k; - } - } - } - - shading = new GfxGouraudTriangleShading(typeA, verticesA, nVerticesA, - trianglesA, nTrianglesA, - funcsA, nFuncsA); - if (!shading->init(dict)) { - delete shading; - return NULL; - } - return shading; - - err2: - obj1.free(); - err1: - return NULL; -} - -GfxShading *GfxGouraudTriangleShading::copy() { - return new GfxGouraudTriangleShading(this); -} - -void GfxGouraudTriangleShading::getTriangle( - int i, - double *x0, double *y0, GfxColor *color0, - double *x1, double *y1, GfxColor *color1, - double *x2, double *y2, GfxColor *color2) { - double in; - double out[gfxColorMaxComps]; - int v, j; - - v = triangles[i][0]; - *x0 = vertices[v].x; - *y0 = vertices[v].y; - if (nFuncs > 0) { - in = colToDbl(vertices[v].color.c[0]); - for (j = 0; j < nFuncs; ++j) { - funcs[j]->transform(&in, &out[j]); - } - for (j = 0; j < gfxColorMaxComps; ++j) { - color0->c[j] = dblToCol(out[j]); - } - } else { - *color0 = vertices[v].color; - } - v = triangles[i][1]; - *x1 = vertices[v].x; - *y1 = vertices[v].y; - if (nFuncs > 0) { - in = colToDbl(vertices[v].color.c[0]); - for (j = 0; j < nFuncs; ++j) { - funcs[j]->transform(&in, &out[j]); - } - for (j = 0; j < gfxColorMaxComps; ++j) { - color1->c[j] = dblToCol(out[j]); - } - } else { - *color1 = vertices[v].color; - } - v = triangles[i][2]; - *x2 = vertices[v].x; - *y2 = vertices[v].y; - if (nFuncs > 0) { - in = colToDbl(vertices[v].color.c[0]); - for (j = 0; j < nFuncs; ++j) { - funcs[j]->transform(&in, &out[j]); - } - for (j = 0; j < gfxColorMaxComps; ++j) { - color2->c[j] = dblToCol(out[j]); - } - } else { - *color2 = vertices[v].color; - } -} - -//------------------------------------------------------------------------ -// GfxPatchMeshShading -//------------------------------------------------------------------------ - -GfxPatchMeshShading::GfxPatchMeshShading(int typeA, - GfxPatch *patchesA, int nPatchesA, - Function **funcsA, int nFuncsA): - GfxShading(typeA) -{ - int i; - - patches = patchesA; - nPatches = nPatchesA; - nFuncs = nFuncsA; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = funcsA[i]; - } -} - -GfxPatchMeshShading::GfxPatchMeshShading(GfxPatchMeshShading *shading): - GfxShading(shading) -{ - int i; - - nPatches = shading->nPatches; - patches = (GfxPatch *)gmallocn(nPatches, sizeof(GfxPatch)); - memcpy(patches, shading->patches, nPatches * sizeof(GfxPatch)); - nFuncs = shading->nFuncs; - for (i = 0; i < nFuncs; ++i) { - funcs[i] = shading->funcs[i]->copy(); - } -} - -GfxPatchMeshShading::~GfxPatchMeshShading() { - int i; - - gfree(patches); - for (i = 0; i < nFuncs; ++i) { - delete funcs[i]; - } -} - -GfxPatchMeshShading *GfxPatchMeshShading::parse(int typeA, Dict *dict, - Stream *str) { - GfxPatchMeshShading *shading; - Function *funcsA[gfxColorMaxComps]; - int nFuncsA; - int coordBits, compBits, flagBits; - double xMin, xMax, yMin, yMax; - double cMin[gfxColorMaxComps], cMax[gfxColorMaxComps]; - double xMul, yMul; - double cMul[gfxColorMaxComps]; - GfxPatch *patchesA, *p; - int nComps, nPatchesA, patchesSize, nPts, nColors; - Guint flag; - double x[16], y[16]; - Guint xi, yi; - GfxColorComp c[4][gfxColorMaxComps]; - Guint ci[4]; - GfxShadingBitBuf *bitBuf; - Object obj1, obj2; - int i, j; - - if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) { - coordBits = obj1.getInt(); - } else { - error(-1, "Missing or invalid BitsPerCoordinate in shading dictionary"); - goto err2; - } - obj1.free(); - if (dict->lookup("BitsPerComponent", &obj1)->isInt()) { - compBits = obj1.getInt(); - } else { - error(-1, "Missing or invalid BitsPerComponent in shading dictionary"); - goto err2; - } - obj1.free(); - if (dict->lookup("BitsPerFlag", &obj1)->isInt()) { - flagBits = obj1.getInt(); - } else { - error(-1, "Missing or invalid BitsPerFlag in shading dictionary"); - goto err2; - } - obj1.free(); - if (dict->lookup("Decode", &obj1)->isArray() && - obj1.arrayGetLength() >= 6) { - xMin = obj1.arrayGet(0, &obj2)->getNum(); - obj2.free(); - xMax = obj1.arrayGet(1, &obj2)->getNum(); - obj2.free(); - xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1); - yMin = obj1.arrayGet(2, &obj2)->getNum(); - obj2.free(); - yMax = obj1.arrayGet(3, &obj2)->getNum(); - obj2.free(); - yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1); - for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) { - cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum(); - obj2.free(); - cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum(); - obj2.free(); - cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1); - } - nComps = i; - } else { - error(-1, "Missing or invalid Decode array in shading dictionary"); - goto err2; - } - obj1.free(); - - if (!dict->lookup("Function", &obj1)->isNull()) { - if (obj1.isArray()) { - nFuncsA = obj1.arrayGetLength(); - if (nFuncsA > gfxColorMaxComps) { - error(-1, "Invalid Function array in shading dictionary"); - goto err1; - } - for (i = 0; i < nFuncsA; ++i) { - obj1.arrayGet(i, &obj2); - if (!(funcsA[i] = Function::parse(&obj2))) { - obj1.free(); - obj2.free(); - goto err1; - } - obj2.free(); - } - } else { - nFuncsA = 1; - if (!(funcsA[0] = Function::parse(&obj1))) { - obj1.free(); - goto err1; - } - } - } else { - nFuncsA = 0; - } - obj1.free(); - - nPatchesA = 0; - patchesA = NULL; - patchesSize = 0; - bitBuf = new GfxShadingBitBuf(str); - while (1) { - if (!bitBuf->getBits(flagBits, &flag)) { - break; - } - if (typeA == 6) { - switch (flag) { - case 0: nPts = 12; nColors = 4; break; - case 1: - case 2: - case 3: - default: nPts = 8; nColors = 2; break; - } - } else { - switch (flag) { - case 0: nPts = 16; nColors = 4; break; - case 1: - case 2: - case 3: - default: nPts = 12; nColors = 2; break; - } - } - for (i = 0; i < nPts; ++i) { - if (!bitBuf->getBits(coordBits, &xi) || - !bitBuf->getBits(coordBits, &yi)) { - break; - } - x[i] = xMin + xMul * (double)xi; - y[i] = yMin + yMul * (double)yi; - } - if (i < nPts) { - break; - } - for (i = 0; i < nColors; ++i) { - for (j = 0; j < nComps; ++j) { - if (!bitBuf->getBits(compBits, &ci[j])) { - break; - } - c[i][j] = dblToCol(cMin[j] + cMul[j] * (double)ci[j]); - } - if (j < nComps) { - break; - } - } - if (i < nColors) { - break; - } - if (nPatchesA == patchesSize) { - patchesSize = (patchesSize == 0) ? 16 : 2 * patchesSize; - patchesA = (GfxPatch *)greallocn(patchesA, - patchesSize, sizeof(GfxPatch)); - } - p = &patchesA[nPatchesA]; - if (typeA == 6) { - switch (flag) { - case 0: - p->x[0][0] = x[0]; - p->y[0][0] = y[0]; - p->x[0][1] = x[1]; - p->y[0][1] = y[1]; - p->x[0][2] = x[2]; - p->y[0][2] = y[2]; - p->x[0][3] = x[3]; - p->y[0][3] = y[3]; - p->x[1][3] = x[4]; - p->y[1][3] = y[4]; - p->x[2][3] = x[5]; - p->y[2][3] = y[5]; - p->x[3][3] = x[6]; - p->y[3][3] = y[6]; - p->x[3][2] = x[7]; - p->y[3][2] = y[7]; - p->x[3][1] = x[8]; - p->y[3][1] = y[8]; - p->x[3][0] = x[9]; - p->y[3][0] = y[9]; - p->x[2][0] = x[10]; - p->y[2][0] = y[10]; - p->x[1][0] = x[11]; - p->y[1][0] = y[11]; - for (j = 0; j < nComps; ++j) { - p->color[0][0].c[j] = c[0][j]; - p->color[0][1].c[j] = c[1][j]; - p->color[1][1].c[j] = c[2][j]; - p->color[1][0].c[j] = c[3][j]; - } - break; - case 1: - p->x[0][0] = patchesA[nPatchesA-1].x[0][3]; - p->y[0][0] = patchesA[nPatchesA-1].y[0][3]; - p->x[0][1] = patchesA[nPatchesA-1].x[1][3]; - p->y[0][1] = patchesA[nPatchesA-1].y[1][3]; - p->x[0][2] = patchesA[nPatchesA-1].x[2][3]; - p->y[0][2] = patchesA[nPatchesA-1].y[2][3]; - p->x[0][3] = patchesA[nPatchesA-1].x[3][3]; - p->y[0][3] = patchesA[nPatchesA-1].y[3][3]; - p->x[1][3] = x[0]; - p->y[1][3] = y[0]; - p->x[2][3] = x[1]; - p->y[2][3] = y[1]; - p->x[3][3] = x[2]; - p->y[3][3] = y[2]; - p->x[3][2] = x[3]; - p->y[3][2] = y[3]; - p->x[3][1] = x[4]; - p->y[3][1] = y[4]; - p->x[3][0] = x[5]; - p->y[3][0] = y[5]; - p->x[2][0] = x[6]; - p->y[2][0] = y[6]; - p->x[1][0] = x[7]; - p->y[1][0] = y[7]; - for (j = 0; j < nComps; ++j) { - p->color[0][0].c[j] = patchesA[nPatchesA-1].color[0][1].c[j]; - p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; - p->color[1][1].c[j] = c[0][j]; - p->color[1][0].c[j] = c[1][j]; - } - break; - case 2: - p->x[0][0] = patchesA[nPatchesA-1].x[3][3]; - p->y[0][0] = patchesA[nPatchesA-1].y[3][3]; - p->x[0][1] = patchesA[nPatchesA-1].x[3][2]; - p->y[0][1] = patchesA[nPatchesA-1].y[3][2]; - p->x[0][2] = patchesA[nPatchesA-1].x[3][1]; - p->y[0][2] = patchesA[nPatchesA-1].y[3][1]; - p->x[0][3] = patchesA[nPatchesA-1].x[3][0]; - p->y[0][3] = patchesA[nPatchesA-1].y[3][0]; - p->x[1][3] = x[0]; - p->y[1][3] = y[0]; - p->x[2][3] = x[1]; - p->y[2][3] = y[1]; - p->x[3][3] = x[2]; - p->y[3][3] = y[2]; - p->x[3][2] = x[3]; - p->y[3][2] = y[3]; - p->x[3][1] = x[4]; - p->y[3][1] = y[4]; - p->x[3][0] = x[5]; - p->y[3][0] = y[5]; - p->x[2][0] = x[6]; - p->y[2][0] = y[6]; - p->x[1][0] = x[7]; - p->y[1][0] = y[7]; - for (j = 0; j < nComps; ++j) { - p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; - p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; - p->color[1][1].c[j] = c[0][j]; - p->color[1][0].c[j] = c[1][j]; - } - break; - case 3: - p->x[0][0] = patchesA[nPatchesA-1].x[3][0]; - p->y[0][0] = patchesA[nPatchesA-1].y[3][0]; - p->x[0][1] = patchesA[nPatchesA-1].x[2][0]; - p->y[0][1] = patchesA[nPatchesA-1].y[2][0]; - p->x[0][2] = patchesA[nPatchesA-1].x[1][0]; - p->y[0][2] = patchesA[nPatchesA-1].y[1][0]; - p->x[0][3] = patchesA[nPatchesA-1].x[0][0]; - p->y[0][3] = patchesA[nPatchesA-1].y[0][0]; - p->x[1][3] = x[0]; - p->y[1][3] = y[0]; - p->x[2][3] = x[1]; - p->y[2][3] = y[1]; - p->x[3][3] = x[2]; - p->y[3][3] = y[2]; - p->x[3][2] = x[3]; - p->y[3][2] = y[3]; - p->x[3][1] = x[4]; - p->y[3][1] = y[4]; - p->x[3][0] = x[5]; - p->y[3][0] = y[5]; - p->x[2][0] = x[6]; - p->y[2][0] = y[6]; - p->x[1][0] = x[7]; - p->y[1][0] = y[7]; - for (j = 0; j < nComps; ++j) { - p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; - p->color[0][1].c[j] = patchesA[nPatchesA-1].color[0][0].c[j]; - p->color[1][1].c[j] = c[0][j]; - p->color[1][0].c[j] = c[1][j]; - } - break; - } - } else { - switch (flag) { - case 0: - p->x[0][0] = x[0]; - p->y[0][0] = y[0]; - p->x[0][1] = x[1]; - p->y[0][1] = y[1]; - p->x[0][2] = x[2]; - p->y[0][2] = y[2]; - p->x[0][3] = x[3]; - p->y[0][3] = y[3]; - p->x[1][3] = x[4]; - p->y[1][3] = y[4]; - p->x[2][3] = x[5]; - p->y[2][3] = y[5]; - p->x[3][3] = x[6]; - p->y[3][3] = y[6]; - p->x[3][2] = x[7]; - p->y[3][2] = y[7]; - p->x[3][1] = x[8]; - p->y[3][1] = y[8]; - p->x[3][0] = x[9]; - p->y[3][0] = y[9]; - p->x[2][0] = x[10]; - p->y[2][0] = y[10]; - p->x[1][0] = x[11]; - p->y[1][0] = y[11]; - p->x[1][1] = x[12]; - p->y[1][1] = y[12]; - p->x[1][2] = x[13]; - p->y[1][2] = y[13]; - p->x[2][2] = x[14]; - p->y[2][2] = y[14]; - p->x[2][1] = x[15]; - p->y[2][1] = y[15]; - for (j = 0; j < nComps; ++j) { - p->color[0][0].c[j] = c[0][j]; - p->color[0][1].c[j] = c[1][j]; - p->color[1][1].c[j] = c[2][j]; - p->color[1][0].c[j] = c[3][j]; - } - break; - case 1: - p->x[0][0] = patchesA[nPatchesA-1].x[0][3]; - p->y[0][0] = patchesA[nPatchesA-1].y[0][3]; - p->x[0][1] = patchesA[nPatchesA-1].x[1][3]; - p->y[0][1] = patchesA[nPatchesA-1].y[1][3]; - p->x[0][2] = patchesA[nPatchesA-1].x[2][3]; - p->y[0][2] = patchesA[nPatchesA-1].y[2][3]; - p->x[0][3] = patchesA[nPatchesA-1].x[3][3]; - p->y[0][3] = patchesA[nPatchesA-1].y[3][3]; - p->x[1][3] = x[0]; - p->y[1][3] = y[0]; - p->x[2][3] = x[1]; - p->y[2][3] = y[1]; - p->x[3][3] = x[2]; - p->y[3][3] = y[2]; - p->x[3][2] = x[3]; - p->y[3][2] = y[3]; - p->x[3][1] = x[4]; - p->y[3][1] = y[4]; - p->x[3][0] = x[5]; - p->y[3][0] = y[5]; - p->x[2][0] = x[6]; - p->y[2][0] = y[6]; - p->x[1][0] = x[7]; - p->y[1][0] = y[7]; - p->x[1][1] = x[8]; - p->y[1][1] = y[8]; - p->x[1][2] = x[9]; - p->y[1][2] = y[9]; - p->x[2][2] = x[10]; - p->y[2][2] = y[10]; - p->x[2][1] = x[11]; - p->y[2][1] = y[11]; - for (j = 0; j < nComps; ++j) { - p->color[0][0].c[j] = patchesA[nPatchesA-1].color[0][1].c[j]; - p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; - p->color[1][1].c[j] = c[0][j]; - p->color[1][0].c[j] = c[1][j]; - } - break; - case 2: - p->x[0][0] = patchesA[nPatchesA-1].x[3][3]; - p->y[0][0] = patchesA[nPatchesA-1].y[3][3]; - p->x[0][1] = patchesA[nPatchesA-1].x[3][2]; - p->y[0][1] = patchesA[nPatchesA-1].y[3][2]; - p->x[0][2] = patchesA[nPatchesA-1].x[3][1]; - p->y[0][2] = patchesA[nPatchesA-1].y[3][1]; - p->x[0][3] = patchesA[nPatchesA-1].x[3][0]; - p->y[0][3] = patchesA[nPatchesA-1].y[3][0]; - p->x[1][3] = x[0]; - p->y[1][3] = y[0]; - p->x[2][3] = x[1]; - p->y[2][3] = y[1]; - p->x[3][3] = x[2]; - p->y[3][3] = y[2]; - p->x[3][2] = x[3]; - p->y[3][2] = y[3]; - p->x[3][1] = x[4]; - p->y[3][1] = y[4]; - p->x[3][0] = x[5]; - p->y[3][0] = y[5]; - p->x[2][0] = x[6]; - p->y[2][0] = y[6]; - p->x[1][0] = x[7]; - p->y[1][0] = y[7]; - p->x[1][1] = x[8]; - p->y[1][1] = y[8]; - p->x[1][2] = x[9]; - p->y[1][2] = y[9]; - p->x[2][2] = x[10]; - p->y[2][2] = y[10]; - p->x[2][1] = x[11]; - p->y[2][1] = y[11]; - for (j = 0; j < nComps; ++j) { - p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][1].c[j]; - p->color[0][1].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; - p->color[1][1].c[j] = c[0][j]; - p->color[1][0].c[j] = c[1][j]; - } - break; - case 3: - p->x[0][0] = patchesA[nPatchesA-1].x[3][0]; - p->y[0][0] = patchesA[nPatchesA-1].y[3][0]; - p->x[0][1] = patchesA[nPatchesA-1].x[2][0]; - p->y[0][1] = patchesA[nPatchesA-1].y[2][0]; - p->x[0][2] = patchesA[nPatchesA-1].x[1][0]; - p->y[0][2] = patchesA[nPatchesA-1].y[1][0]; - p->x[0][3] = patchesA[nPatchesA-1].x[0][0]; - p->y[0][3] = patchesA[nPatchesA-1].y[0][0]; - p->x[1][3] = x[0]; - p->y[1][3] = y[0]; - p->x[2][3] = x[1]; - p->y[2][3] = y[1]; - p->x[3][3] = x[2]; - p->y[3][3] = y[2]; - p->x[3][2] = x[3]; - p->y[3][2] = y[3]; - p->x[3][1] = x[4]; - p->y[3][1] = y[4]; - p->x[3][0] = x[5]; - p->y[3][0] = y[5]; - p->x[2][0] = x[6]; - p->y[2][0] = y[6]; - p->x[1][0] = x[7]; - p->y[1][0] = y[7]; - p->x[1][1] = x[8]; - p->y[1][1] = y[8]; - p->x[1][2] = x[9]; - p->y[1][2] = y[9]; - p->x[2][2] = x[10]; - p->y[2][2] = y[10]; - p->x[2][1] = x[11]; - p->y[2][1] = y[11]; - for (j = 0; j < nComps; ++j) { - p->color[0][0].c[j] = patchesA[nPatchesA-1].color[1][0].c[j]; - p->color[0][1].c[j] = patchesA[nPatchesA-1].color[0][0].c[j]; - p->color[1][1].c[j] = c[0][j]; - p->color[1][0].c[j] = c[1][j]; - } - break; - } - } - ++nPatchesA; - bitBuf->flushBits(); - } - delete bitBuf; - - if (typeA == 6) { - for (i = 0; i < nPatchesA; ++i) { - p = &patchesA[i]; - p->x[1][1] = (-4 * p->x[0][0] - +6 * (p->x[0][1] + p->x[1][0]) - -2 * (p->x[0][3] + p->x[3][0]) - +3 * (p->x[3][1] + p->x[1][3]) - - p->x[3][3]) / 9; - p->y[1][1] = (-4 * p->y[0][0] - +6 * (p->y[0][1] + p->y[1][0]) - -2 * (p->y[0][3] + p->y[3][0]) - +3 * (p->y[3][1] + p->y[1][3]) - - p->y[3][3]) / 9; - p->x[1][2] = (-4 * p->x[0][3] - +6 * (p->x[0][2] + p->x[1][3]) - -2 * (p->x[0][0] + p->x[3][3]) - +3 * (p->x[3][2] + p->x[1][0]) - - p->x[3][0]) / 9; - p->y[1][2] = (-4 * p->y[0][3] - +6 * (p->y[0][2] + p->y[1][3]) - -2 * (p->y[0][0] + p->y[3][3]) - +3 * (p->y[3][2] + p->y[1][0]) - - p->y[3][0]) / 9; - p->x[2][1] = (-4 * p->x[3][0] - +6 * (p->x[3][1] + p->x[2][0]) - -2 * (p->x[3][3] + p->x[0][0]) - +3 * (p->x[0][1] + p->x[2][3]) - - p->x[0][3]) / 9; - p->y[2][1] = (-4 * p->y[3][0] - +6 * (p->y[3][1] + p->y[2][0]) - -2 * (p->y[3][3] + p->y[0][0]) - +3 * (p->y[0][1] + p->y[2][3]) - - p->y[0][3]) / 9; - p->x[2][2] = (-4 * p->x[3][3] - +6 * (p->x[3][2] + p->x[2][3]) - -2 * (p->x[3][0] + p->x[0][3]) - +3 * (p->x[0][2] + p->x[2][0]) - - p->x[0][0]) / 9; - p->y[2][2] = (-4 * p->y[3][3] - +6 * (p->y[3][2] + p->y[2][3]) - -2 * (p->y[3][0] + p->y[0][3]) - +3 * (p->y[0][2] + p->y[2][0]) - - p->y[0][0]) / 9; - } - } - - shading = new GfxPatchMeshShading(typeA, patchesA, nPatchesA, - funcsA, nFuncsA); - if (!shading->init(dict)) { - delete shading; - return NULL; - } - return shading; - - err2: - obj1.free(); - err1: - return NULL; -} - -GfxShading *GfxPatchMeshShading::copy() { - return new GfxPatchMeshShading(this); -} - -//------------------------------------------------------------------------ -// GfxImageColorMap -//------------------------------------------------------------------------ - -GfxImageColorMap::GfxImageColorMap(int bitsA, Object *decode, - GfxColorSpace *colorSpaceA) { - GfxIndexedColorSpace *indexedCS; - GfxSeparationColorSpace *sepCS; - int maxPixel, indexHigh; - int maxPixelForAlloc; - Guchar *lookup2; - Function *sepFunc; - Object obj; - double x[gfxColorMaxComps]; - double y[gfxColorMaxComps]; - int i, j, k; - - ok = gTrue; - - // bits per component and color space - bits = bitsA; - maxPixel = (1 << bits) - 1; - maxPixelForAlloc = (1 << (bits>8?bits:8)); - colorSpace = colorSpaceA; - - // initialize - for (k = 0; k < gfxColorMaxComps; ++k) { - lookup[k] = NULL; - } - - // get decode map - if (decode->isNull()) { - nComps = colorSpace->getNComps(); - colorSpace->getDefaultRanges(decodeLow, decodeRange, maxPixel); - } else if (decode->isArray()) { - nComps = decode->arrayGetLength() / 2; - if (nComps != colorSpace->getNComps()) { - goto err1; - } - for (i = 0; i < nComps; ++i) { - decode->arrayGet(2*i, &obj); - if (!obj.isNum()) { - goto err2; - } - decodeLow[i] = obj.getNum(); - obj.free(); - decode->arrayGet(2*i+1, &obj); - if (!obj.isNum()) { - goto err2; - } - decodeRange[i] = obj.getNum() - decodeLow[i]; - obj.free(); - } - } else { - goto err1; - } - - // Construct a lookup table -- this stores pre-computed decoded - // values for each component, i.e., the result of applying the - // decode mapping to each possible image pixel component value. - // - // Optimization: for Indexed and Separation color spaces (which have - // only one component), we store color values in the lookup table - // rather than component values. - colorSpace2 = NULL; - nComps2 = 0; - if (colorSpace->getMode() == csIndexed) { - // Note that indexHigh may not be the same as maxPixel -- - // Distiller will remove unused palette entries, resulting in - // indexHigh < maxPixel. - indexedCS = (GfxIndexedColorSpace *)colorSpace; - colorSpace2 = indexedCS->getBase(); - indexHigh = indexedCS->getIndexHigh(); - nComps2 = colorSpace2->getNComps(); - lookup2 = indexedCS->getLookup(); - colorSpace2->getDefaultRanges(x, y, indexHigh); - for (k = 0; k < nComps2; ++k) { - lookup[k] = (GfxColorComp *)gmallocn(maxPixelForAlloc + 1, - sizeof(GfxColorComp)); - for (i = 0; i <= maxPixel; ++i) { - j = (int)(decodeLow[0] + (i * decodeRange[0]) / maxPixel + 0.5); - if (j < 0) { - j = 0; - } else if (j > indexHigh) { - j = indexHigh; - } - lookup[k][i] = - dblToCol(x[k] + (lookup2[j*nComps2 + k] / 255.0) * y[k]); - } - } - } else if (colorSpace->getMode() == csSeparation) { - sepCS = (GfxSeparationColorSpace *)colorSpace; - colorSpace2 = sepCS->getAlt(); - nComps2 = colorSpace2->getNComps(); - sepFunc = sepCS->getFunc(); - for (k = 0; k < nComps2; ++k) { - lookup[k] = (GfxColorComp *)gmallocn(maxPixelForAlloc + 1, - sizeof(GfxColorComp)); - for (i = 0; i <= maxPixel; ++i) { - x[0] = decodeLow[0] + (i * decodeRange[0]) / maxPixel; - sepFunc->transform(x, y); - lookup[k][i] = dblToCol(y[k]); - } - } - } else { - for (k = 0; k < nComps; ++k) { - lookup[k] = (GfxColorComp *)gmallocn(maxPixelForAlloc + 1, - sizeof(GfxColorComp)); - for (i = 0; i <= maxPixel; ++i) { - lookup[k][i] = dblToCol(decodeLow[k] + - (i * decodeRange[k]) / maxPixel); - } - } - } - - return; - - err2: - obj.free(); - err1: - ok = gFalse; -} - -GfxImageColorMap::GfxImageColorMap(GfxImageColorMap *colorMap) { - int n, i, k; - - colorSpace = colorMap->colorSpace->copy(); - bits = colorMap->bits; - nComps = colorMap->nComps; - nComps2 = colorMap->nComps2; - colorSpace2 = NULL; - for (k = 0; k < gfxColorMaxComps; ++k) { - lookup[k] = NULL; - } - n = 1 << bits; - if (colorSpace->getMode() == csIndexed) { - colorSpace2 = ((GfxIndexedColorSpace *)colorSpace)->getBase(); - for (k = 0; k < nComps2; ++k) { - lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp)); - memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp)); - } - } else if (colorSpace->getMode() == csSeparation) { - colorSpace2 = ((GfxSeparationColorSpace *)colorSpace)->getAlt(); - for (k = 0; k < nComps2; ++k) { - lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp)); - memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp)); - } - } else { - for (k = 0; k < nComps; ++k) { - lookup[k] = (GfxColorComp *)gmallocn(n, sizeof(GfxColorComp)); - memcpy(lookup[k], colorMap->lookup[k], n * sizeof(GfxColorComp)); - } - } - for (i = 0; i < nComps; ++i) { - decodeLow[i] = colorMap->decodeLow[i]; - decodeRange[i] = colorMap->decodeRange[i]; - } - ok = gTrue; -} - -GfxImageColorMap::~GfxImageColorMap() { - int i; - - delete colorSpace; - for (i = 0; i < gfxColorMaxComps; ++i) { - gfree(lookup[i]); - } -} - -void GfxImageColorMap::getGray(Guchar *x, GfxGray *gray) { - GfxColor color; - int i; - - if (colorSpace2) { - for (i = 0; i < nComps2; ++i) { - color.c[i] = lookup[i][x[0]]; - } - colorSpace2->getGray(&color, gray); - } else { - for (i = 0; i < nComps; ++i) { - color.c[i] = lookup[i][x[i]]; - } - colorSpace->getGray(&color, gray); - } -} - -void GfxImageColorMap::getRGB(Guchar *x, GfxRGB *rgb) { - GfxColor color; - int i; - - if (colorSpace2) { - for (i = 0; i < nComps2; ++i) { - color.c[i] = lookup[i][x[0]]; - } - colorSpace2->getRGB(&color, rgb); - } else { - for (i = 0; i < nComps; ++i) { - color.c[i] = lookup[i][x[i]]; - } - colorSpace->getRGB(&color, rgb); - } -} - -void GfxImageColorMap::getCMYK(Guchar *x, GfxCMYK *cmyk) { - GfxColor color; - int i; - - if (colorSpace2) { - for (i = 0; i < nComps2; ++i) { - color.c[i] = lookup[i][x[0]]; - } - colorSpace2->getCMYK(&color, cmyk); - } else { - for (i = 0; i < nComps; ++i) { - color.c[i] = lookup[i][x[i]]; - } - colorSpace->getCMYK(&color, cmyk); - } -} - -void GfxImageColorMap::getColor(Guchar *x, GfxColor *color) { - int maxPixel, i; - - maxPixel = (1 << bits) - 1; - for (i = 0; i < nComps; ++i) { - color->c[i] = dblToCol(decodeLow[i] + (x[i] * decodeRange[i]) / maxPixel); - } -} - -//------------------------------------------------------------------------ -// GfxSubpath and GfxPath -//------------------------------------------------------------------------ - -GfxSubpath::GfxSubpath(double x1, double y1) { - size = 16; - x = (double *)gmallocn(size, sizeof(double)); - y = (double *)gmallocn(size, sizeof(double)); - curve = (GBool *)gmallocn(size, sizeof(GBool)); - n = 1; - x[0] = x1; - y[0] = y1; - curve[0] = gFalse; - closed = gFalse; -} - -GfxSubpath::~GfxSubpath() { - gfree(x); - gfree(y); - gfree(curve); -} - -// Used for copy(). -GfxSubpath::GfxSubpath(GfxSubpath *subpath) { - size = subpath->size; - n = subpath->n; - x = (double *)gmallocn(size, sizeof(double)); - y = (double *)gmallocn(size, sizeof(double)); - curve = (GBool *)gmallocn(size, sizeof(GBool)); - memcpy(x, subpath->x, n * sizeof(double)); - memcpy(y, subpath->y, n * sizeof(double)); - memcpy(curve, subpath->curve, n * sizeof(GBool)); - closed = subpath->closed; -} - -void GfxSubpath::lineTo(double x1, double y1) { - if (n >= size) { - size += 16; - x = (double *)greallocn(x, size, sizeof(double)); - y = (double *)greallocn(y, size, sizeof(double)); - curve = (GBool *)greallocn(curve, size, sizeof(GBool)); - } - x[n] = x1; - y[n] = y1; - curve[n] = gFalse; - ++n; -} - -void GfxSubpath::curveTo(double x1, double y1, double x2, double y2, - double x3, double y3) { - if (n+3 > size) { - size += 16; - x = (double *)greallocn(x, size, sizeof(double)); - y = (double *)greallocn(y, size, sizeof(double)); - curve = (GBool *)greallocn(curve, size, sizeof(GBool)); - } - x[n] = x1; - y[n] = y1; - x[n+1] = x2; - y[n+1] = y2; - x[n+2] = x3; - y[n+2] = y3; - curve[n] = curve[n+1] = gTrue; - curve[n+2] = gFalse; - n += 3; -} - -void GfxSubpath::close() { - if (x[n-1] != x[0] || y[n-1] != y[0]) { - lineTo(x[0], y[0]); - } - closed = gTrue; -} - -void GfxSubpath::offset(double dx, double dy) { - int i; - - for (i = 0; i < n; ++i) { - x[i] += dx; - y[i] += dy; - } -} - -GfxPath::GfxPath() { - justMoved = gFalse; - size = 16; - n = 0; - firstX = firstY = 0; - subpaths = (GfxSubpath **)gmallocn(size, sizeof(GfxSubpath *)); -} - -GfxPath::~GfxPath() { - int i; - - for (i = 0; i < n; ++i) - delete subpaths[i]; - gfree(subpaths); -} - -// Used for copy(). -GfxPath::GfxPath(GBool justMoved1, double firstX1, double firstY1, - GfxSubpath **subpaths1, int n1, int size1) { - int i; - - justMoved = justMoved1; - firstX = firstX1; - firstY = firstY1; - size = size1; - n = n1; - subpaths = (GfxSubpath **)gmallocn(size, sizeof(GfxSubpath *)); - for (i = 0; i < n; ++i) - subpaths[i] = subpaths1[i]->copy(); -} - -void GfxPath::moveTo(double x, double y) { - justMoved = gTrue; - firstX = x; - firstY = y; -} - -void GfxPath::lineTo(double x, double y) { - if (justMoved) { - if (n >= size) { - size += 16; - subpaths = (GfxSubpath **) - greallocn(subpaths, size, sizeof(GfxSubpath *)); - } - subpaths[n] = new GfxSubpath(firstX, firstY); - ++n; - justMoved = gFalse; - } - subpaths[n-1]->lineTo(x, y); -} - -void GfxPath::curveTo(double x1, double y1, double x2, double y2, - double x3, double y3) { - if (justMoved) { - if (n >= size) { - size += 16; - subpaths = (GfxSubpath **) - greallocn(subpaths, size, sizeof(GfxSubpath *)); - } - subpaths[n] = new GfxSubpath(firstX, firstY); - ++n; - justMoved = gFalse; - } - subpaths[n-1]->curveTo(x1, y1, x2, y2, x3, y3); -} - -void GfxPath::close() { - // this is necessary to handle the pathological case of - // moveto/closepath/clip, which defines an empty clipping region - if (justMoved) { - if (n >= size) { - size += 16; - subpaths = (GfxSubpath **) - greallocn(subpaths, size, sizeof(GfxSubpath *)); - } - subpaths[n] = new GfxSubpath(firstX, firstY); - ++n; - justMoved = gFalse; - } - subpaths[n-1]->close(); -} - -void GfxPath::append(GfxPath *path) { - int i; - - if (n + path->n > size) { - size = n + path->n; - subpaths = (GfxSubpath **) - greallocn(subpaths, size, sizeof(GfxSubpath *)); - } - for (i = 0; i < path->n; ++i) { - subpaths[n++] = path->subpaths[i]->copy(); - } - justMoved = gFalse; -} - -void GfxPath::offset(double dx, double dy) { - int i; - - for (i = 0; i < n; ++i) { - subpaths[i]->offset(dx, dy); - } -} - -//------------------------------------------------------------------------ -// GfxState -//------------------------------------------------------------------------ - -GfxState::GfxState(double hDPIA, double vDPIA, PDFRectangle *pageBox, - int rotateA, GBool upsideDown) { - double kx, ky; - - hDPI = hDPIA; - vDPI = vDPIA; - rotate = rotateA; - px1 = pageBox->x1; - py1 = pageBox->y1; - px2 = pageBox->x2; - py2 = pageBox->y2; - kx = hDPI / 72.0; - ky = vDPI / 72.0; - if (rotate == 90) { - ctm[0] = 0; - ctm[1] = upsideDown ? ky : -ky; - ctm[2] = kx; - ctm[3] = 0; - ctm[4] = -kx * py1; - ctm[5] = ky * (upsideDown ? -px1 : px2); - pageWidth = kx * (py2 - py1); - pageHeight = ky * (px2 - px1); - } else if (rotate == 180) { - ctm[0] = -kx; - ctm[1] = 0; - ctm[2] = 0; - ctm[3] = upsideDown ? ky : -ky; - ctm[4] = kx * px2; - ctm[5] = ky * (upsideDown ? -py1 : py2); - pageWidth = kx * (px2 - px1); - pageHeight = ky * (py2 - py1); - } else if (rotate == 270) { - ctm[0] = 0; - ctm[1] = upsideDown ? -ky : ky; - ctm[2] = -kx; - ctm[3] = 0; - ctm[4] = kx * py2; - ctm[5] = ky * (upsideDown ? px2 : -px1); - pageWidth = kx * (py2 - py1); - pageHeight = ky * (px2 - px1); - } else { - ctm[0] = kx; - ctm[1] = 0; - ctm[2] = 0; - ctm[3] = upsideDown ? -ky : ky; - ctm[4] = -kx * px1; - ctm[5] = ky * (upsideDown ? py2 : -py1); - pageWidth = kx * (px2 - px1); - pageHeight = ky * (py2 - py1); - } - - fillColorSpace = new GfxDeviceGrayColorSpace(); - strokeColorSpace = new GfxDeviceGrayColorSpace(); - fillColor.c[0] = 0; - strokeColor.c[0] = 0; - fillPattern = NULL; - strokePattern = NULL; - blendMode = gfxBlendNormal; - fillOpacity = 1; - strokeOpacity = 1; - fillOverprint = gFalse; - strokeOverprint = gFalse; - transfer[0] = transfer[1] = transfer[2] = transfer[3] = NULL; - - lineWidth = 1; - lineDash = NULL; - lineDashLength = 0; - lineDashStart = 0; - flatness = 1; - lineJoin = 0; - lineCap = 0; - miterLimit = 10; - strokeAdjust = gFalse; - - font = NULL; - fontSize = 0; - textMat[0] = 1; textMat[1] = 0; - textMat[2] = 0; textMat[3] = 1; - textMat[4] = 0; textMat[5] = 0; - charSpace = 0; - wordSpace = 0; - horizScaling = 1; - leading = 0; - rise = 0; - render = 0; - - path = new GfxPath(); - curX = curY = 0; - lineX = lineY = 0; - - clipXMin = 0; - clipYMin = 0; - clipXMax = pageWidth; - clipYMax = pageHeight; - - saved = NULL; -} - -GfxState::~GfxState() { - int i; - - if (fillColorSpace) { - delete fillColorSpace; - } - if (strokeColorSpace) { - delete strokeColorSpace; - } - if (fillPattern) { - delete fillPattern; - } - if (strokePattern) { - delete strokePattern; - } - for (i = 0; i < 4; ++i) { - if (transfer[i]) { - delete transfer[i]; - } - } - gfree(lineDash); - if (path) { - // this gets set to NULL by restore() - delete path; - } - if (saved) { - delete saved; - } -} - -// Used for copy(); -GfxState::GfxState(GfxState *state) { - int i; - - memcpy(this, state, sizeof(GfxState)); - if (fillColorSpace) { - fillColorSpace = state->fillColorSpace->copy(); - } - if (strokeColorSpace) { - strokeColorSpace = state->strokeColorSpace->copy(); - } - if (fillPattern) { - fillPattern = state->fillPattern->copy(); - } - if (strokePattern) { - strokePattern = state->strokePattern->copy(); - } - for (i = 0; i < 4; ++i) { - if (transfer[i]) { - transfer[i] = state->transfer[i]->copy(); - } - } - if (lineDashLength > 0) { - lineDash = (double *)gmallocn(lineDashLength, sizeof(double)); - memcpy(lineDash, state->lineDash, lineDashLength * sizeof(double)); - } - saved = NULL; -} - -void GfxState::setPath(GfxPath *pathA) { - if(pathA) { - if(path) - delete path; - } - path = pathA; -} - -void GfxState::getUserClipBBox(double *xMin, double *yMin, - double *xMax, double *yMax) { - double ictm[6]; - double xMin1, yMin1, xMax1, yMax1, det, tx, ty; - - // invert the CTM - det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]); - ictm[0] = ctm[3] * det; - ictm[1] = -ctm[1] * det; - ictm[2] = -ctm[2] * det; - ictm[3] = ctm[0] * det; - ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det; - ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det; - - // transform all four corners of the clip bbox; find the min and max - // x and y values - xMin1 = xMax1 = clipXMin * ictm[0] + clipYMin * ictm[2] + ictm[4]; - yMin1 = yMax1 = clipXMin * ictm[1] + clipYMin * ictm[3] + ictm[5]; - tx = clipXMin * ictm[0] + clipYMax * ictm[2] + ictm[4]; - ty = clipXMin * ictm[1] + clipYMax * ictm[3] + ictm[5]; - if (tx < xMin1) { - xMin1 = tx; - } else if (tx > xMax1) { - xMax1 = tx; - } - if (ty < yMin1) { - yMin1 = ty; - } else if (ty > yMax1) { - yMax1 = ty; - } - tx = clipXMax * ictm[0] + clipYMin * ictm[2] + ictm[4]; - ty = clipXMax * ictm[1] + clipYMin * ictm[3] + ictm[5]; - if (tx < xMin1) { - xMin1 = tx; - } else if (tx > xMax1) { - xMax1 = tx; - } - if (ty < yMin1) { - yMin1 = ty; - } else if (ty > yMax1) { - yMax1 = ty; - } - tx = clipXMax * ictm[0] + clipYMax * ictm[2] + ictm[4]; - ty = clipXMax * ictm[1] + clipYMax * ictm[3] + ictm[5]; - if (tx < xMin1) { - xMin1 = tx; - } else if (tx > xMax1) { - xMax1 = tx; - } - if (ty < yMin1) { - yMin1 = ty; - } else if (ty > yMax1) { - yMax1 = ty; - } - - *xMin = xMin1; - *yMin = yMin1; - *xMax = xMax1; - *yMax = yMax1; -} - -double GfxState::transformWidth(double w) { - double x, y; - - x = ctm[0] + ctm[2]; - y = ctm[1] + ctm[3]; - return w * sqrt(0.5 * (x * x + y * y)); -} - -double GfxState::getTransformedFontSize() { - double x1, y1, x2, y2; - - x1 = textMat[2] * fontSize; - y1 = textMat[3] * fontSize; - x2 = ctm[0] * x1 + ctm[2] * y1; - y2 = ctm[1] * x1 + ctm[3] * y1; - return sqrt(x2 * x2 + y2 * y2); -} - -void GfxState::getFontTransMat(double *m11, double *m12, - double *m21, double *m22) { - *m11 = (textMat[0] * ctm[0] + textMat[1] * ctm[2]) * fontSize; - *m12 = (textMat[0] * ctm[1] + textMat[1] * ctm[3]) * fontSize; - *m21 = (textMat[2] * ctm[0] + textMat[3] * ctm[2]) * fontSize; - *m22 = (textMat[2] * ctm[1] + textMat[3] * ctm[3]) * fontSize; -} - -void GfxState::setCTM(double a, double b, double c, - double d, double e, double f) { - int i; - - ctm[0] = a; - ctm[1] = b; - ctm[2] = c; - ctm[3] = d; - ctm[4] = e; - ctm[5] = f; - - // avoid FP exceptions on badly messed up PDF files - for (i = 0; i < 6; ++i) { - if (ctm[i] > 1e10) { - ctm[i] = 1e10; - } else if (ctm[i] < -1e10) { - ctm[i] = -1e10; - } - } -} - -void GfxState::concatCTM(double a, double b, double c, - double d, double e, double f) { - double a1 = ctm[0]; - double b1 = ctm[1]; - double c1 = ctm[2]; - double d1 = ctm[3]; - int i; - - ctm[0] = a * a1 + b * c1; - ctm[1] = a * b1 + b * d1; - ctm[2] = c * a1 + d * c1; - ctm[3] = c * b1 + d * d1; - ctm[4] = e * a1 + f * c1 + ctm[4]; - ctm[5] = e * b1 + f * d1 + ctm[5]; - - // avoid FP exceptions on badly messed up PDF files - for (i = 0; i < 6; ++i) { - if (ctm[i] > 1e10) { - ctm[i] = 1e10; - } else if (ctm[i] < -1e10) { - ctm[i] = -1e10; - } - } -} - -void GfxState::shiftCTM(double tx, double ty) { - ctm[4] += tx; - ctm[5] += ty; - clipXMin += tx; - clipYMin += ty; - clipXMax += tx; - clipYMax += ty; -} - -void GfxState::setFillColorSpace(GfxColorSpace *colorSpace) { - if (fillColorSpace) { - delete fillColorSpace; - } - fillColorSpace = colorSpace; -} - -void GfxState::setStrokeColorSpace(GfxColorSpace *colorSpace) { - if (strokeColorSpace) { - delete strokeColorSpace; - } - strokeColorSpace = colorSpace; -} - -void GfxState::setFillPattern(GfxPattern *pattern) { - if (fillPattern) { - delete fillPattern; - } - fillPattern = pattern; -} - -void GfxState::setStrokePattern(GfxPattern *pattern) { - if (strokePattern) { - delete strokePattern; - } - strokePattern = pattern; -} - -void GfxState::setTransfer(Function **funcs) { - int i; - - for (i = 0; i < 4; ++i) { - if (transfer[i]) { - delete transfer[i]; - } - transfer[i] = funcs[i]; - } -} - -void GfxState::setLineDash(double *dash, int length, double start) { - if (lineDash) - gfree(lineDash); - lineDash = dash; - lineDashLength = length; - lineDashStart = start; -} - -void GfxState::clearPath() { - delete path; - path = new GfxPath(); -} - -void GfxState::clip() { - double xMin, yMin, xMax, yMax, x, y; - GfxSubpath *subpath; - int i, j; - - xMin = xMax = yMin = yMax = 0; // make gcc happy - for (i = 0; i < path->getNumSubpaths(); ++i) { - subpath = path->getSubpath(i); - for (j = 0; j < subpath->getNumPoints(); ++j) { - transform(subpath->getX(j), subpath->getY(j), &x, &y); - if (i == 0 && j == 0) { - xMin = xMax = x; - yMin = yMax = y; - } else { - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - } - } - } - if (xMin > clipXMin) { - clipXMin = xMin; - } - if (yMin > clipYMin) { - clipYMin = yMin; - } - if (xMax < clipXMax) { - clipXMax = xMax; - } - if (yMax < clipYMax) { - clipYMax = yMax; - } -} - -void GfxState::clipToStrokePath() { - double xMin, yMin, xMax, yMax, x, y, t0, t1; - GfxSubpath *subpath; - int i, j; - - xMin = xMax = yMin = yMax = 0; // make gcc happy - for (i = 0; i < path->getNumSubpaths(); ++i) { - subpath = path->getSubpath(i); - for (j = 0; j < subpath->getNumPoints(); ++j) { - transform(subpath->getX(j), subpath->getY(j), &x, &y); - if (i == 0 && j == 0) { - xMin = xMax = x; - yMin = yMax = y; - } else { - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - } - } - } - - // allow for the line width - //~ miter joins can extend farther than this - t0 = fabs(ctm[0]); - t1 = fabs(ctm[2]); - if (t0 > t1) { - xMin -= 0.5 * lineWidth * t0; - xMax += 0.5 * lineWidth * t0; - } else { - xMin -= 0.5 * lineWidth * t1; - xMax += 0.5 * lineWidth * t1; - } - t0 = fabs(ctm[0]); - t1 = fabs(ctm[3]); - if (t0 > t1) { - yMin -= 0.5 * lineWidth * t0; - yMax += 0.5 * lineWidth * t0; - } else { - yMin -= 0.5 * lineWidth * t1; - yMax += 0.5 * lineWidth * t1; - } - - if (xMin > clipXMin) { - clipXMin = xMin; - } - if (yMin > clipYMin) { - clipYMin = yMin; - } - if (xMax < clipXMax) { - clipXMax = xMax; - } - if (yMax < clipYMax) { - clipYMax = yMax; - } -} - -void GfxState::textShift(double tx, double ty) { - double dx, dy; - - textTransformDelta(tx, ty, &dx, &dy); - curX += dx; - curY += dy; -} - -void GfxState::shift(double dx, double dy) { - curX += dx; - curY += dy; -} - -GfxState *GfxState::save() { - GfxState *newState; - - newState = copy(); - newState->saved = this; - return newState; -} - -GfxState *GfxState::restore() { - GfxState *oldState; - - if (saved) { - oldState = saved; - - // these attributes aren't saved/restored by the q/Q operators - oldState->path = path; - oldState->curX = curX; - oldState->curY = curY; - oldState->lineX = lineX; - oldState->lineY = lineY; - - path = NULL; - saved = NULL; - delete this; - - } else { - oldState = this; - } - - return oldState; -} - -GBool GfxState::parseBlendMode(Object *obj, GfxBlendMode *mode) { - Object obj2; - int i, j; - - if (obj->isName()) { - for (i = 0; i < nGfxBlendModeNames; ++i) { - if (!strcmp(obj->getName(), gfxBlendModeNames[i].name)) { - *mode = gfxBlendModeNames[i].mode; - return gTrue; - } - } - return gFalse; - } else if (obj->isArray()) { - for (i = 0; i < obj->arrayGetLength(); ++i) { - obj->arrayGet(i, &obj2); - if (!obj2.isName()) { - obj2.free(); - return gFalse; - } - for (j = 0; j < nGfxBlendModeNames; ++j) { - if (!strcmp(obj2.getName(), gfxBlendModeNames[j].name)) { - obj2.free(); - *mode = gfxBlendModeNames[j].mode; - return gTrue; - } - } - obj2.free(); - } - *mode = gfxBlendNormal; - return gTrue; - } else { - return gFalse; - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.h deleted file mode 100644 index c0c73fd2f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GfxState.h +++ /dev/null @@ -1,1257 +0,0 @@ -//======================================================================== -// -// GfxState.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef GFXSTATE_H -#define GFXSTATE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "Object.h" -#include "Function.h" - -class Array; -class GfxFont; -class PDFRectangle; -class GfxShading; - -//------------------------------------------------------------------------ -// GfxBlendMode -//------------------------------------------------------------------------ - -enum GfxBlendMode { - gfxBlendNormal, - gfxBlendMultiply, - gfxBlendScreen, - gfxBlendOverlay, - gfxBlendDarken, - gfxBlendLighten, - gfxBlendColorDodge, - gfxBlendColorBurn, - gfxBlendHardLight, - gfxBlendSoftLight, - gfxBlendDifference, - gfxBlendExclusion, - gfxBlendHue, - gfxBlendSaturation, - gfxBlendColor, - gfxBlendLuminosity -}; - -//------------------------------------------------------------------------ -// GfxColorComp -//------------------------------------------------------------------------ - -// 16.16 fixed point color component -typedef int GfxColorComp; - -#define gfxColorComp1 0x10000 - -static inline GfxColorComp dblToCol(double x) { - return (GfxColorComp)(x * gfxColorComp1); -} - -static inline double colToDbl(GfxColorComp x) { - return (double)x / (double)gfxColorComp1; -} - -static inline GfxColorComp byteToCol(Guchar x) { - // (x / 255) << 16 = (0.0000000100000001... * x) << 16 - // = ((x << 8) + (x) + (x >> 8) + ...) << 16 - // = (x << 8) + (x) + (x >> 7) - // [for rounding] - return (GfxColorComp)((x << 8) + x + (x >> 7)); -} - -static inline Guchar colToByte(GfxColorComp x) { - // 255 * x + 0.5 = 256 * x - x + 0x8000 - return (Guchar)(((x << 8) - x + 0x8000) >> 16); -} - -//------------------------------------------------------------------------ -// GfxColor -//------------------------------------------------------------------------ - -#define gfxColorMaxComps funcMaxOutputs - -struct GfxColor { - GfxColorComp c[gfxColorMaxComps]; -}; - -//------------------------------------------------------------------------ -// GfxGray -//------------------------------------------------------------------------ - -typedef GfxColorComp GfxGray; - -//------------------------------------------------------------------------ -// GfxRGB -//------------------------------------------------------------------------ - -struct GfxRGB { - GfxColorComp r, g, b; -}; - -//------------------------------------------------------------------------ -// GfxCMYK -//------------------------------------------------------------------------ - -struct GfxCMYK { - GfxColorComp c, m, y, k; -}; - -//------------------------------------------------------------------------ -// GfxColorSpace -//------------------------------------------------------------------------ - -// NB: The nGfxColorSpaceModes constant and the gfxColorSpaceModeNames -// array defined in GfxState.cc must match this enum. -enum GfxColorSpaceMode { - csDeviceGray, - csCalGray, - csDeviceRGB, - csCalRGB, - csDeviceCMYK, - csLab, - csICCBased, - csIndexed, - csSeparation, - csDeviceN, - csPattern -}; - -class GfxColorSpace { -public: - - GfxColorSpace(); - virtual ~GfxColorSpace(); - virtual GfxColorSpace *copy() = 0; - virtual GfxColorSpaceMode getMode() = 0; - - // Construct a color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(Object *csObj, StreamColorSpaceMode csMode = streamCSNone); - - // Convert to gray, RGB, or CMYK. - virtual void getGray(GfxColor *color, GfxGray *gray) = 0; - virtual void getRGB(GfxColor *color, GfxRGB *rgb) = 0; - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk) = 0; - - // Return the number of color components. - virtual int getNComps() = 0; - - // Get this color space's default color. - virtual void getDefaultColor(GfxColor *color) = 0; - - // Return the default ranges for each component, assuming an image - // with a max pixel value of . - virtual void getDefaultRanges(double *decodeLow, double *decodeRange, - int maxImgPixel); - - // Returns true if painting operations in this color space never - // mark the page (e.g., the "None" colorant). - virtual GBool isNonMarking() { return gFalse; } - - // Return the number of color space modes - static int getNumColorSpaceModes(); - - // Return the name of the th color space mode. - static char *getColorSpaceModeName(int idx); - -private: -}; - -//------------------------------------------------------------------------ -// GfxDeviceGrayColorSpace -//------------------------------------------------------------------------ - -class GfxDeviceGrayColorSpace: public GfxColorSpace { -public: - - GfxDeviceGrayColorSpace(); - virtual ~GfxDeviceGrayColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csDeviceGray; } - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return 1; } - virtual void getDefaultColor(GfxColor *color); - -private: -}; - -//------------------------------------------------------------------------ -// GfxCalGrayColorSpace -//------------------------------------------------------------------------ - -class GfxCalGrayColorSpace: public GfxColorSpace { -public: - - GfxCalGrayColorSpace(); - virtual ~GfxCalGrayColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csCalGray; } - - // Construct a CalGray color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(Array *arr); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return 1; } - virtual void getDefaultColor(GfxColor *color); - - // CalGray-specific access. - double getWhiteX() { return whiteX; } - double getWhiteY() { return whiteY; } - double getWhiteZ() { return whiteZ; } - double getBlackX() { return blackX; } - double getBlackY() { return blackY; } - double getBlackZ() { return blackZ; } - double getGamma() { return gamma; } - -private: - - double whiteX, whiteY, whiteZ; // white point - double blackX, blackY, blackZ; // black point - double gamma; // gamma value -}; - -//------------------------------------------------------------------------ -// GfxDeviceRGBColorSpace -//------------------------------------------------------------------------ - -class GfxDeviceRGBColorSpace: public GfxColorSpace { -public: - - GfxDeviceRGBColorSpace(); - virtual ~GfxDeviceRGBColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csDeviceRGB; } - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return 3; } - virtual void getDefaultColor(GfxColor *color); - -private: -}; - -//------------------------------------------------------------------------ -// GfxDeviceRGBXColorSpace -//------------------------------------------------------------------------ - -class GfxDeviceRGBXColorSpace: public GfxDeviceRGBColorSpace { -public: - - GfxDeviceRGBXColorSpace(); - virtual GfxColorSpace *copy(); - virtual int getNComps() { return 4; } -private: -}; - -//------------------------------------------------------------------------ -// GfxCalRGBColorSpace -//------------------------------------------------------------------------ - -class GfxCalRGBColorSpace: public GfxColorSpace { -public: - - GfxCalRGBColorSpace(); - virtual ~GfxCalRGBColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csCalRGB; } - - // Construct a CalRGB color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(Array *arr); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return 3; } - virtual void getDefaultColor(GfxColor *color); - - // CalRGB-specific access. - double getWhiteX() { return whiteX; } - double getWhiteY() { return whiteY; } - double getWhiteZ() { return whiteZ; } - double getBlackX() { return blackX; } - double getBlackY() { return blackY; } - double getBlackZ() { return blackZ; } - double getGammaR() { return gammaR; } - double getGammaG() { return gammaG; } - double getGammaB() { return gammaB; } - double *getMatrix() { return mat; } - -private: - - double whiteX, whiteY, whiteZ; // white point - double blackX, blackY, blackZ; // black point - double gammaR, gammaG, gammaB; // gamma values - double mat[9]; // ABC -> XYZ transform matrix -}; - -//------------------------------------------------------------------------ -// GfxDeviceCMYKColorSpace -//------------------------------------------------------------------------ - -class GfxDeviceCMYKColorSpace: public GfxColorSpace { -public: - - GfxDeviceCMYKColorSpace(); - virtual ~GfxDeviceCMYKColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csDeviceCMYK; } - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return 4; } - virtual void getDefaultColor(GfxColor *color); - -private: -}; - -//------------------------------------------------------------------------ -// GfxLabColorSpace -//------------------------------------------------------------------------ - -class GfxLabColorSpace: public GfxColorSpace { -public: - - GfxLabColorSpace(); - virtual ~GfxLabColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csLab; } - - // Construct a Lab color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(Array *arr); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return 3; } - virtual void getDefaultColor(GfxColor *color); - - virtual void getDefaultRanges(double *decodeLow, double *decodeRange, - int maxImgPixel); - - // Lab-specific access. - double getWhiteX() { return whiteX; } - double getWhiteY() { return whiteY; } - double getWhiteZ() { return whiteZ; } - double getBlackX() { return blackX; } - double getBlackY() { return blackY; } - double getBlackZ() { return blackZ; } - double getAMin() { return aMin; } - double getAMax() { return aMax; } - double getBMin() { return bMin; } - double getBMax() { return bMax; } - -private: - - double whiteX, whiteY, whiteZ; // white point - double blackX, blackY, blackZ; // black point - double aMin, aMax, bMin, bMax; // range for the a and b components - double kr, kg, kb; // gamut mapping mulitpliers -}; - -//------------------------------------------------------------------------ -// GfxICCBasedColorSpace -//------------------------------------------------------------------------ - -class GfxICCBasedColorSpace: public GfxColorSpace { -public: - - GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA, - Ref *iccProfileStreamA); - virtual ~GfxICCBasedColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csICCBased; } - - // Construct an ICCBased color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(Array *arr); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return nComps; } - virtual void getDefaultColor(GfxColor *color); - - virtual void getDefaultRanges(double *decodeLow, double *decodeRange, - int maxImgPixel); - - // ICCBased-specific access. - GfxColorSpace *getAlt() { return alt; } - -private: - - int nComps; // number of color components (1, 3, or 4) - GfxColorSpace *alt; // alternate color space - double rangeMin[4]; // min values for each component - double rangeMax[4]; // max values for each component - Ref iccProfileStream; // the ICC profile -}; - -//------------------------------------------------------------------------ -// GfxIndexedColorSpace -//------------------------------------------------------------------------ - -class GfxIndexedColorSpace: public GfxColorSpace { -public: - - GfxIndexedColorSpace(GfxColorSpace *baseA, int indexHighA); - virtual ~GfxIndexedColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csIndexed; } - - // Construct a Lab color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(Array *arr); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return 1; } - virtual void getDefaultColor(GfxColor *color); - - virtual void getDefaultRanges(double *decodeLow, double *decodeRange, - int maxImgPixel); - - // Indexed-specific access. - GfxColorSpace *getBase() { return base; } - int getIndexHigh() { return indexHigh; } - Guchar *getLookup() { return lookup; } - GfxColor *mapColorToBase(GfxColor *color, GfxColor *baseColor); - -private: - - GfxColorSpace *base; // base color space - int indexHigh; // max pixel value - Guchar *lookup; // lookup table -}; - -//------------------------------------------------------------------------ -// GfxSeparationColorSpace -//------------------------------------------------------------------------ - -class GfxSeparationColorSpace: public GfxColorSpace { -public: - - GfxSeparationColorSpace(GString *nameA, GfxColorSpace *altA, - Function *funcA); - virtual ~GfxSeparationColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csSeparation; } - - // Construct a Separation color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(Array *arr); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return 1; } - virtual void getDefaultColor(GfxColor *color); - - virtual GBool isNonMarking() { return nonMarking; } - - // Separation-specific access. - GString *getName() { return name; } - GfxColorSpace *getAlt() { return alt; } - Function *getFunc() { return func; } - -private: - - GString *name; // colorant name - GfxColorSpace *alt; // alternate color space - Function *func; // tint transform (into alternate color space) - GBool nonMarking; -}; - -//------------------------------------------------------------------------ -// GfxDeviceNColorSpace -//------------------------------------------------------------------------ - -class GfxDeviceNColorSpace: public GfxColorSpace { -public: - - GfxDeviceNColorSpace(int nCompsA, GfxColorSpace *alt, Function *func); - virtual ~GfxDeviceNColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csDeviceN; } - - // Construct a DeviceN color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(Array *arr); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return nComps; } - virtual void getDefaultColor(GfxColor *color); - - virtual GBool isNonMarking() { return nonMarking; } - - // DeviceN-specific access. - GString *getColorantName(int i) { return names[i]; } - GfxColorSpace *getAlt() { return alt; } - Function *getTintTransformFunc() { return func; } - -private: - - int nComps; // number of components - GString // colorant names - *names[gfxColorMaxComps]; - GfxColorSpace *alt; // alternate color space - Function *func; // tint transform (into alternate color space) - GBool nonMarking; -}; - -//------------------------------------------------------------------------ -// GfxPatternColorSpace -//------------------------------------------------------------------------ - -class GfxPatternColorSpace: public GfxColorSpace { -public: - - GfxPatternColorSpace(GfxColorSpace *underA); - virtual ~GfxPatternColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csPattern; } - - // Construct a Pattern color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(Array *arr); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - - virtual int getNComps() { return 0; } - virtual void getDefaultColor(GfxColor *color); - - // Pattern-specific access. - GfxColorSpace *getUnder() { return under; } - -private: - - GfxColorSpace *under; // underlying color space (for uncolored - // patterns) -}; - -//------------------------------------------------------------------------ -// GfxPattern -//------------------------------------------------------------------------ - -class GfxPattern { -public: - - GfxPattern(int typeA); - virtual ~GfxPattern(); - - static GfxPattern *parse(Object *obj); - - virtual GfxPattern *copy() = 0; - - int getType() { return type; } - -private: - - int type; -}; - -//------------------------------------------------------------------------ -// GfxTilingPattern -//------------------------------------------------------------------------ - -class GfxTilingPattern: public GfxPattern { -public: - - static GfxTilingPattern *parse(Object *patObj); - virtual ~GfxTilingPattern(); - - virtual GfxPattern *copy(); - - int getPaintType() { return paintType; } - int getTilingType() { return tilingType; } - double *getBBox() { return bbox; } - double getXStep() { return xStep; } - double getYStep() { return yStep; } - Dict *getResDict() - { return resDict.isDict() ? resDict.getDict() : (Dict *)NULL; } - double *getMatrix() { return matrix; } - Object *getContentStream() { return &contentStream; } - -private: - - GfxTilingPattern(int paintTypeA, int tilingTypeA, - double *bboxA, double xStepA, double yStepA, - Object *resDictA, double *matrixA, - Object *contentStreamA); - - int paintType; - int tilingType; - double bbox[4]; - double xStep, yStep; - Object resDict; - double matrix[6]; - Object contentStream; -}; - -//------------------------------------------------------------------------ -// GfxShadingPattern -//------------------------------------------------------------------------ - -class GfxShadingPattern: public GfxPattern { -public: - - static GfxShadingPattern *parse(Object *patObj); - virtual ~GfxShadingPattern(); - - virtual GfxPattern *copy(); - - GfxShading *getShading() { return shading; } - double *getMatrix() { return matrix; } - -private: - - GfxShadingPattern(GfxShading *shadingA, double *matrixA); - - GfxShading *shading; - double matrix[6]; -}; - -//------------------------------------------------------------------------ -// GfxShading -//------------------------------------------------------------------------ - -class GfxShading { -public: - - GfxShading(int typeA); - GfxShading(GfxShading *shading); - virtual ~GfxShading(); - - static GfxShading *parse(Object *obj); - - virtual GfxShading *copy() = 0; - - int getType() { return type; } - GfxColorSpace *getColorSpace() { return colorSpace; } - GfxColor *getBackground() { return &background; } - GBool getHasBackground() { return hasBackground; } - void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) - { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } - GBool getHasBBox() { return hasBBox; } - -protected: - - GBool init(Dict *dict); - - int type; - GfxColorSpace *colorSpace; - GfxColor background; - GBool hasBackground; - double xMin, yMin, xMax, yMax; - GBool hasBBox; -}; - -//------------------------------------------------------------------------ -// GfxFunctionShading -//------------------------------------------------------------------------ - -class GfxFunctionShading: public GfxShading { -public: - - GfxFunctionShading(double x0A, double y0A, - double x1A, double y1A, - double *matrixA, - Function **funcsA, int nFuncsA); - GfxFunctionShading(GfxFunctionShading *shading); - virtual ~GfxFunctionShading(); - - static GfxFunctionShading *parse(Dict *dict); - - virtual GfxShading *copy(); - - void getDomain(double *x0A, double *y0A, double *x1A, double *y1A) - { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; } - double *getMatrix() { return matrix; } - int getNFuncs() { return nFuncs; } - Function *getFunc(int i) { return funcs[i]; } - void getColor(double x, double y, GfxColor *color); - -private: - - double x0, y0, x1, y1; - double matrix[6]; - Function *funcs[gfxColorMaxComps]; - int nFuncs; -}; - -//------------------------------------------------------------------------ -// GfxAxialShading -//------------------------------------------------------------------------ - -class GfxAxialShading: public GfxShading { -public: - - GfxAxialShading(double x0A, double y0A, - double x1A, double y1A, - double t0A, double t1A, - Function **funcsA, int nFuncsA, - GBool extend0A, GBool extend1A); - GfxAxialShading(GfxAxialShading *shading); - virtual ~GfxAxialShading(); - - static GfxAxialShading *parse(Dict *dict); - - virtual GfxShading *copy(); - - void getCoords(double *x0A, double *y0A, double *x1A, double *y1A) - { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; } - double getDomain0() { return t0; } - double getDomain1() { return t1; } - GBool getExtend0() { return extend0; } - GBool getExtend1() { return extend1; } - int getNFuncs() { return nFuncs; } - Function *getFunc(int i) { return funcs[i]; } - void getColor(double t, GfxColor *color); - -private: - - double x0, y0, x1, y1; - double t0, t1; - Function *funcs[gfxColorMaxComps]; - int nFuncs; - GBool extend0, extend1; -}; - -//------------------------------------------------------------------------ -// GfxRadialShading -//------------------------------------------------------------------------ - -class GfxRadialShading: public GfxShading { -public: - - GfxRadialShading(double x0A, double y0A, double r0A, - double x1A, double y1A, double r1A, - double t0A, double t1A, - Function **funcsA, int nFuncsA, - GBool extend0A, GBool extend1A); - GfxRadialShading(GfxRadialShading *shading); - virtual ~GfxRadialShading(); - - static GfxRadialShading *parse(Dict *dict); - - virtual GfxShading *copy(); - - void getCoords(double *x0A, double *y0A, double *r0A, - double *x1A, double *y1A, double *r1A) - { *x0A = x0; *y0A = y0; *r0A = r0; *x1A = x1; *y1A = y1; *r1A = r1; } - double getDomain0() { return t0; } - double getDomain1() { return t1; } - GBool getExtend0() { return extend0; } - GBool getExtend1() { return extend1; } - int getNFuncs() { return nFuncs; } - Function *getFunc(int i) { return funcs[i]; } - void getColor(double t, GfxColor *color); - -private: - - double x0, y0, r0, x1, y1, r1; - double t0, t1; - Function *funcs[gfxColorMaxComps]; - int nFuncs; - GBool extend0, extend1; -}; - -//------------------------------------------------------------------------ -// GfxGouraudTriangleShading -//------------------------------------------------------------------------ - -struct GfxGouraudVertex { - double x, y; - GfxColor color; -}; - -class GfxGouraudTriangleShading: public GfxShading { -public: - - GfxGouraudTriangleShading(int typeA, - GfxGouraudVertex *verticesA, int nVerticesA, - int (*trianglesA)[3], int nTrianglesA, - Function **funcsA, int nFuncsA); - GfxGouraudTriangleShading(GfxGouraudTriangleShading *shading); - virtual ~GfxGouraudTriangleShading(); - - static GfxGouraudTriangleShading *parse(int typeA, Dict *dict, Stream *str); - - virtual GfxShading *copy(); - - int getNTriangles() { return nTriangles; } - void getTriangle(int i, double *x0, double *y0, GfxColor *color0, - double *x1, double *y1, GfxColor *color1, - double *x2, double *y2, GfxColor *color2); - -private: - - GfxGouraudVertex *vertices; - int nVertices; - int (*triangles)[3]; - int nTriangles; - Function *funcs[gfxColorMaxComps]; - int nFuncs; -}; - -//------------------------------------------------------------------------ -// GfxPatchMeshShading -//------------------------------------------------------------------------ - -struct GfxPatch { - double x[4][4]; - double y[4][4]; - GfxColor color[2][2]; -}; - -class GfxPatchMeshShading: public GfxShading { -public: - - GfxPatchMeshShading(int typeA, GfxPatch *patchesA, int nPatchesA, - Function **funcsA, int nFuncsA); - GfxPatchMeshShading(GfxPatchMeshShading *shading); - virtual ~GfxPatchMeshShading(); - - static GfxPatchMeshShading *parse(int typeA, Dict *dict, Stream *str); - - virtual GfxShading *copy(); - - int getNPatches() { return nPatches; } - GfxPatch *getPatch(int i) { return &patches[i]; } - -private: - - GfxPatch *patches; - int nPatches; - Function *funcs[gfxColorMaxComps]; - int nFuncs; -}; - -//------------------------------------------------------------------------ -// GfxImageColorMap -//------------------------------------------------------------------------ - -class GfxImageColorMap { -public: - - // Constructor. - GfxImageColorMap(int bitsA, Object *decode, GfxColorSpace *colorSpaceA); - - // Destructor. - ~GfxImageColorMap(); - - // Return a copy of this color map. - GfxImageColorMap *copy() { return new GfxImageColorMap(this); } - - // Is color map valid? - GBool isOk() { return ok; } - - // Get the color space. - GfxColorSpace *getColorSpace() { return colorSpace; } - - // Get stream decoding info. - int getNumPixelComps() { return nComps; } - int getBits() { return bits; } - - // Get decode table. - double getDecodeLow(int i) { return decodeLow[i]; } - double getDecodeHigh(int i) { return decodeLow[i] + decodeRange[i]; } - - // Convert an image pixel to a color. - void getGray(Guchar *x, GfxGray *gray); - void getRGB(Guchar *x, GfxRGB *rgb); - void getCMYK(Guchar *x, GfxCMYK *cmyk); - void getColor(Guchar *x, GfxColor *color); - -private: - - GfxImageColorMap(GfxImageColorMap *colorMap); - - GfxColorSpace *colorSpace; // the image color space - int bits; // bits per component - int nComps; // number of components in a pixel - GfxColorSpace *colorSpace2; // secondary color space - int nComps2; // number of components in colorSpace2 - GfxColorComp * // lookup table - lookup[gfxColorMaxComps]; - double // minimum values for each component - decodeLow[gfxColorMaxComps]; - double // max - min value for each component - decodeRange[gfxColorMaxComps]; - GBool ok; -}; - -//------------------------------------------------------------------------ -// GfxSubpath and GfxPath -//------------------------------------------------------------------------ - -class GfxSubpath { -public: - - // Constructor. - GfxSubpath(double x1, double y1); - - // Destructor. - ~GfxSubpath(); - - // Copy. - GfxSubpath *copy() { return new GfxSubpath(this); } - - // Get points. - int getNumPoints() { return n; } - double getX(int i) { return x[i]; } - double getY(int i) { return y[i]; } - GBool getCurve(int i) { return curve[i]; } - - // Get last point. - double getLastX() { return x[n-1]; } - double getLastY() { return y[n-1]; } - - // Add a line segment. - void lineTo(double x1, double y1); - - // Add a Bezier curve. - void curveTo(double x1, double y1, double x2, double y2, - double x3, double y3); - - // Close the subpath. - void close(); - GBool isClosed() { return closed; } - - // Add (, ) to each point in the subpath. - void offset(double dx, double dy); - -private: - - double *x, *y; // points - GBool *curve; // curve[i] => point i is a control point - // for a Bezier curve - int n; // number of points - int size; // size of x/y arrays - GBool closed; // set if path is closed - - GfxSubpath(GfxSubpath *subpath); -}; - -class GfxPath { -public: - - // Constructor. - GfxPath(); - - // Destructor. - ~GfxPath(); - - // Copy. - GfxPath *copy() - { return new GfxPath(justMoved, firstX, firstY, subpaths, n, size); } - - // Is there a current point? - GBool isCurPt() { return n > 0 || justMoved; } - - // Is the path non-empty, i.e., is there at least one segment? - GBool isPath() { return n > 0; } - - // Get subpaths. - int getNumSubpaths() { return n; } - GfxSubpath *getSubpath(int i) { return subpaths[i]; } - - // Get last point on last subpath. - double getLastX() { return subpaths[n-1]->getLastX(); } - double getLastY() { return subpaths[n-1]->getLastY(); } - - // Move the current point. - void moveTo(double x, double y); - - // Add a segment to the last subpath. - void lineTo(double x, double y); - - // Add a Bezier curve to the last subpath - void curveTo(double x1, double y1, double x2, double y2, - double x3, double y3); - - // Close the last subpath. - void close(); - - // Append to . - void append(GfxPath *path); - - // Add (, ) to each point in the path. - void offset(double dx, double dy); - -private: - - GBool justMoved; // set if a new subpath was just started - double firstX, firstY; // first point in new subpath - GfxSubpath **subpaths; // subpaths - int n; // number of subpaths - int size; // size of subpaths array - - GfxPath(GBool justMoved1, double firstX1, double firstY1, - GfxSubpath **subpaths1, int n1, int size1); -}; - -//------------------------------------------------------------------------ -// GfxState -//------------------------------------------------------------------------ - -class GfxState { -public: - - // Construct a default GfxState, for a device with resolution - // x , page box , page rotation , and - // coordinate system specified by . - GfxState(double hDPIA, double vDPIA, PDFRectangle *pageBox, - int rotateA, GBool upsideDown); - - // Destructor. - ~GfxState(); - - // Copy. - GfxState *copy() { return new GfxState(this); } - - // Accessors. - double getHDPI() { return hDPI; } - double getVDPI() { return vDPI; } - double *getCTM() { return ctm; } - double getX1() { return px1; } - double getY1() { return py1; } - double getX2() { return px2; } - double getY2() { return py2; } - double getPageWidth() { return pageWidth; } - double getPageHeight() { return pageHeight; } - int getRotate() { return rotate; } - GfxColor *getFillColor() { return &fillColor; } - GfxColor *getStrokeColor() { return &strokeColor; } - void getFillGray(GfxGray *gray) - { fillColorSpace->getGray(&fillColor, gray); } - void getStrokeGray(GfxGray *gray) - { strokeColorSpace->getGray(&strokeColor, gray); } - void getFillRGB(GfxRGB *rgb) - { fillColorSpace->getRGB(&fillColor, rgb); } - void getStrokeRGB(GfxRGB *rgb) - { strokeColorSpace->getRGB(&strokeColor, rgb); } - void getFillCMYK(GfxCMYK *cmyk) - { fillColorSpace->getCMYK(&fillColor, cmyk); } - void getStrokeCMYK(GfxCMYK *cmyk) - { strokeColorSpace->getCMYK(&strokeColor, cmyk); } - GfxColorSpace *getFillColorSpace() { return fillColorSpace; } - GfxColorSpace *getStrokeColorSpace() { return strokeColorSpace; } - GfxPattern *getFillPattern() { return fillPattern; } - GfxPattern *getStrokePattern() { return strokePattern; } - GfxBlendMode getBlendMode() { return blendMode; } - double getFillOpacity() { return fillOpacity; } - double getStrokeOpacity() { return strokeOpacity; } - GBool getFillOverprint() { return fillOverprint; } - GBool getStrokeOverprint() { return strokeOverprint; } - Function **getTransfer() { return transfer; } - double getLineWidth() { return lineWidth; } - void getLineDash(double **dash, int *length, double *start) - { *dash = lineDash; *length = lineDashLength; *start = lineDashStart; } - int getFlatness() { return flatness; } - int getLineJoin() { return lineJoin; } - int getLineCap() { return lineCap; } - double getMiterLimit() { return miterLimit; } - GBool getStrokeAdjust() { return strokeAdjust; } - GfxFont *getFont() { return font; } - double getFontSize() { return fontSize; } - double *getTextMat() { return textMat; } - double getCharSpace() { return charSpace; } - double getWordSpace() { return wordSpace; } - double getHorizScaling() { return horizScaling; } - double getLeading() { return leading; } - double getRise() { return rise; } - int getRender() { return render; } - GfxPath *getPath() { return path; } - void setPath(GfxPath *pathA); - double getCurX() { return curX; } - double getCurY() { return curY; } - void getClipBBox(double *xMin, double *yMin, double *xMax, double *yMax) - { *xMin = clipXMin; *yMin = clipYMin; *xMax = clipXMax; *yMax = clipYMax; } - void getUserClipBBox(double *xMin, double *yMin, double *xMax, double *yMax); - double getLineX() { return lineX; } - double getLineY() { return lineY; } - - // Is there a current point/path? - GBool isCurPt() { return path->isCurPt(); } - GBool isPath() { return path->isPath(); } - - // Transforms. - void transform(double x1, double y1, double *x2, double *y2) - { *x2 = ctm[0] * x1 + ctm[2] * y1 + ctm[4]; - *y2 = ctm[1] * x1 + ctm[3] * y1 + ctm[5]; } - void transformDelta(double x1, double y1, double *x2, double *y2) - { *x2 = ctm[0] * x1 + ctm[2] * y1; - *y2 = ctm[1] * x1 + ctm[3] * y1; } - void textTransform(double x1, double y1, double *x2, double *y2) - { *x2 = textMat[0] * x1 + textMat[2] * y1 + textMat[4]; - *y2 = textMat[1] * x1 + textMat[3] * y1 + textMat[5]; } - void textTransformDelta(double x1, double y1, double *x2, double *y2) - { *x2 = textMat[0] * x1 + textMat[2] * y1; - *y2 = textMat[1] * x1 + textMat[3] * y1; } - double transformWidth(double w); - double getTransformedLineWidth() - { return transformWidth(lineWidth); } - double getTransformedFontSize(); - void getFontTransMat(double *m11, double *m12, double *m21, double *m22); - - // Change state parameters. - void setCTM(double a, double b, double c, - double d, double e, double f); - void concatCTM(double a, double b, double c, - double d, double e, double f); - void shiftCTM(double tx, double ty); - void setFillColorSpace(GfxColorSpace *colorSpace); - void setStrokeColorSpace(GfxColorSpace *colorSpace); - void setFillColor(GfxColor *color) { fillColor = *color; } - void setStrokeColor(GfxColor *color) { strokeColor = *color; } - void setFillPattern(GfxPattern *pattern); - void setStrokePattern(GfxPattern *pattern); - void setBlendMode(GfxBlendMode mode) { blendMode = mode; } - void setFillOpacity(double opac) { fillOpacity = opac; } - void setStrokeOpacity(double opac) { strokeOpacity = opac; } - void setFillOverprint(GBool op) { fillOverprint = op; } - void setStrokeOverprint(GBool op) { strokeOverprint = op; } - void setTransfer(Function **funcs); - void setLineWidth(double width) { lineWidth = width; } - void setLineDash(double *dash, int length, double start); - void setFlatness(int flatness1) { flatness = flatness1; } - void setLineJoin(int lineJoin1) { lineJoin = lineJoin1; } - void setLineCap(int lineCap1) { lineCap = lineCap1; } - void setMiterLimit(double limit) { miterLimit = limit; } - void setStrokeAdjust(GBool sa) { strokeAdjust = sa; } - void setFont(GfxFont *fontA, double fontSizeA) - { font = fontA; fontSize = fontSizeA; } - void setTextMat(double a, double b, double c, - double d, double e, double f) - { textMat[0] = a; textMat[1] = b; textMat[2] = c; - textMat[3] = d; textMat[4] = e; textMat[5] = f; } - void setCharSpace(double space) - { charSpace = space; } - void setWordSpace(double space) - { wordSpace = space; } - void setHorizScaling(double scale) - { horizScaling = 0.01 * scale; } - void setLeading(double leadingA) - { leading = leadingA; } - void setRise(double riseA) - { rise = riseA; } - void setRender(int renderA) - { render = renderA; } - - // Add to path. - void moveTo(double x, double y) - { path->moveTo(curX = x, curY = y); } - void lineTo(double x, double y) - { path->lineTo(curX = x, curY = y); } - void curveTo(double x1, double y1, double x2, double y2, - double x3, double y3) - { path->curveTo(x1, y1, x2, y2, curX = x3, curY = y3); } - void closePath() - { path->close(); curX = path->getLastX(); curY = path->getLastY(); } - void clearPath(); - - // Update clip region. - void clip(); - void clipToStrokePath(); - - // Text position. - void textSetPos(double tx, double ty) { lineX = tx; lineY = ty; } - void textMoveTo(double tx, double ty) - { lineX = tx; lineY = ty; textTransform(tx, ty, &curX, &curY); } - void textShift(double tx, double ty); - void shift(double dx, double dy); - - // Push/pop GfxState on/off stack. - GfxState *save(); - GfxState *restore(); - GBool hasSaves() { return saved != NULL; } - - // Misc - GBool parseBlendMode(Object *obj, GfxBlendMode *mode); - -private: - - double hDPI, vDPI; // resolution - double ctm[6]; // coord transform matrix - double px1, py1, px2, py2; // page corners (user coords) - double pageWidth, pageHeight; // page size (pixels) - int rotate; // page rotation angle - - GfxColorSpace *fillColorSpace; // fill color space - GfxColorSpace *strokeColorSpace; // stroke color space - GfxColor fillColor; // fill color - GfxColor strokeColor; // stroke color - GfxPattern *fillPattern; // fill pattern - GfxPattern *strokePattern; // stroke pattern - GfxBlendMode blendMode; // transparency blend mode - double fillOpacity; // fill opacity - double strokeOpacity; // stroke opacity - GBool fillOverprint; // fill overprint - GBool strokeOverprint; // stroke overprint - Function *transfer[4]; // transfer function (entries may be: all - // NULL = identity; last three NULL = - // single function; all four non-NULL = - // R,G,B,gray functions) - - double lineWidth; // line width - double *lineDash; // line dash - int lineDashLength; - double lineDashStart; - int flatness; // curve flatness - int lineJoin; // line join style - int lineCap; // line cap style - double miterLimit; // line miter limit - GBool strokeAdjust; // stroke adjustment - - GfxFont *font; // font - double fontSize; // font size - double textMat[6]; // text matrix - double charSpace; // character spacing - double wordSpace; // word spacing - double horizScaling; // horizontal scaling - double leading; // text leading - double rise; // text rise - int render; // text rendering mode - - GfxPath *path; // array of path elements - double curX, curY; // current point (user coords) - double lineX, lineY; // start of current text line (text coords) - - double clipXMin, clipYMin, // bounding box for clip region - clipXMax, clipYMax; - - GfxState *saved; // next GfxState on stack - - GfxState(GfxState *state); -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.cc deleted file mode 100644 index faf700c46..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.cc +++ /dev/null @@ -1,2980 +0,0 @@ -//======================================================================== -// -// GlobalParams.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#ifdef ENABLE_PLUGINS -# ifndef WIN32 -# include -# endif -#endif -#ifdef WIN32 -# include -#endif -#if HAVE_PAPER_H -#include -#endif -#include "gmem.h" -#include "GString.h" -#include "GList.h" -#include "GHash.h" -#include "gfile.h" -#include "Error.h" -#include "NameToCharCode.h" -#include "CharCodeToUnicode.h" -#include "UnicodeMap.h" -#include "CMap.h" -#include "BuiltinFontTables.h" -#include "FontEncodingTables.h" -#ifdef ENABLE_PLUGINS -# include "XpdfPluginAPI.h" -#endif -#include "GlobalParams.h" - -#ifdef WIN32 -# define strcasecmp stricmp -#endif - -#if MULTITHREADED -# define lockGlobalParams gLockMutex(&mutex) -# define lockUnicodeMapCache gLockMutex(&unicodeMapCacheMutex) -# define lockCMapCache gLockMutex(&cMapCacheMutex) -# define unlockGlobalParams gUnlockMutex(&mutex) -# define unlockUnicodeMapCache gUnlockMutex(&unicodeMapCacheMutex) -# define unlockCMapCache gUnlockMutex(&cMapCacheMutex) -#else -# define lockGlobalParams -# define lockUnicodeMapCache -# define lockCMapCache -# define unlockGlobalParams -# define unlockUnicodeMapCache -# define unlockCMapCache -#endif - -#include "NameToUnicodeTable.h" -#include "UnicodeMapTables.h" -#include "UTF8.h" - -#ifdef ENABLE_PLUGINS -# ifdef WIN32 -extern XpdfPluginVecTable xpdfPluginVecTable; -# endif -#endif - -//------------------------------------------------------------------------ - -#define cidToUnicodeCacheSize 4 -#define unicodeToUnicodeCacheSize 4 - -//------------------------------------------------------------------------ - -static struct { - char *name; - char *t1FileName; - char *ttFileName; -} displayFontTab[] = { - {"Courier", "n022003l.pfb", "cour.ttf"}, - {"Courier-Bold", "n022004l.pfb", "courbd.ttf"}, - {"Courier-BoldOblique", "n022024l.pfb", "courbi.ttf"}, - {"Courier-Oblique", "n022023l.pfb", "couri.ttf"}, - {"Helvetica", "n019003l.pfb", "arial.ttf"}, - {"Helvetica-Bold", "n019004l.pfb", "arialbd.ttf"}, - {"Helvetica-BoldOblique", "n019024l.pfb", "arialbi.ttf"}, - {"Helvetica-Oblique", "n019023l.pfb", "ariali.ttf"}, - {"Symbol", "s050000l.pfb", NULL}, - {"Times-Bold", "n021004l.pfb", "timesbd.ttf"}, - {"Times-BoldItalic", "n021024l.pfb", "timesbi.ttf"}, - {"Times-Italic", "n021023l.pfb", "timesi.ttf"}, - {"Times-Roman", "n021003l.pfb", "times.ttf"}, - {"ZapfDingbats", "d050000l.pfb", NULL}, - {NULL} -}; - -#ifdef WIN32 -static char *displayFontDirs[] = { - "c:/windows/fonts", - "c:/winnt/fonts", - NULL -}; -#else -static char *displayFontDirs[] = { - "/usr/share/ghostscript/fonts", - "/usr/local/share/ghostscript/fonts", - "/usr/share/fonts/default/Type1", - "/usr/share/fonts/default/ghostscript", - "/usr/share/fonts/type1/gsfonts", - NULL -}; -#endif - -//------------------------------------------------------------------------ - -GlobalParams *globalParams = NULL; - -//------------------------------------------------------------------------ -// DisplayFontParam -//------------------------------------------------------------------------ - -DisplayFontParam::DisplayFontParam(GString *nameA, - DisplayFontParamKind kindA) { - name = nameA; - kind = kindA; - switch (kind) { - case displayFontT1: - t1.fileName = NULL; - break; - case displayFontTT: - tt.fileName = NULL; - break; - } -} - -DisplayFontParam::~DisplayFontParam() { - delete name; - switch (kind) { - case displayFontT1: - if (t1.fileName) { - delete t1.fileName; - } - break; - case displayFontTT: - if (tt.fileName) { - delete tt.fileName; - } - break; - } -} - -#ifdef WIN32 - -//------------------------------------------------------------------------ -// WinFontInfo -//------------------------------------------------------------------------ - -class WinFontInfo: public DisplayFontParam { -public: - - GBool bold, italic; - - static WinFontInfo *make(GString *nameA, GBool boldA, GBool italicA, - HKEY regKey, char *winFontDir); - WinFontInfo(GString *nameA, GBool boldA, GBool italicA, - GString *fileNameA); - virtual ~WinFontInfo(); - GBool equals(WinFontInfo *fi); -}; - -WinFontInfo *WinFontInfo::make(GString *nameA, GBool boldA, GBool italicA, - HKEY regKey, char *winFontDir) { - GString *regName; - GString *fileNameA; - char buf[MAX_PATH]; - DWORD n; - char c; - int i; - - //----- find the font file - fileNameA = NULL; - regName = nameA->copy(); - if (boldA) { - regName->append(" Bold"); - } - if (italicA) { - regName->append(" Italic"); - } - regName->append(" (TrueType)"); - n = sizeof(buf); - if (RegQueryValueEx(regKey, regName->getCString(), NULL, NULL, - (LPBYTE)buf, &n) == ERROR_SUCCESS) { - fileNameA = new GString(winFontDir); - fileNameA->append('\\')->append(buf); - } - delete regName; - if (!fileNameA) { - delete nameA; - return NULL; - } - - //----- normalize the font name - i = 0; - while (i < nameA->getLength()) { - c = nameA->getChar(i); - if (c == ' ' || c == ',' || c == '-') { - nameA->del(i); - } else { - ++i; - } - } - - return new WinFontInfo(nameA, boldA, italicA, fileNameA); -} - -WinFontInfo::WinFontInfo(GString *nameA, GBool boldA, GBool italicA, - GString *fileNameA): - DisplayFontParam(nameA, displayFontTT) -{ - bold = boldA; - italic = italicA; - tt.fileName = fileNameA; -} - -WinFontInfo::~WinFontInfo() { -} - -GBool WinFontInfo::equals(WinFontInfo *fi) { - return !name->cmp(fi->name) && bold == fi->bold && italic == fi->italic; -} - -//------------------------------------------------------------------------ -// WinFontList -//------------------------------------------------------------------------ - -class WinFontList { -public: - - WinFontList(char *winFontDirA); - ~WinFontList(); - WinFontInfo *find(GString *font); - -private: - - void add(WinFontInfo *fi); - static int CALLBACK enumFunc1(CONST LOGFONT *font, - CONST TEXTMETRIC *metrics, - DWORD type, LPARAM data); - static int CALLBACK enumFunc2(CONST LOGFONT *font, - CONST TEXTMETRIC *metrics, - DWORD type, LPARAM data); - - GList *fonts; // [WinFontInfo] - HDC dc; // (only used during enumeration) - HKEY regKey; // (only used during enumeration) - char *winFontDir; // (only used during enumeration) -}; - -WinFontList::WinFontList(char *winFontDirA) { - OSVERSIONINFO version; - char *path; - - fonts = new GList(); - dc = GetDC(NULL); - winFontDir = winFontDirA; - version.dwOSVersionInfoSize = sizeof(version); - GetVersionEx(&version); - if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { - path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\\"; - } else { - path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Fonts\\"; - } - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, - KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, - ®Key) == ERROR_SUCCESS) { - EnumFonts(dc, NULL, &WinFontList::enumFunc1, (LPARAM)this); - RegCloseKey(regKey); - } - ReleaseDC(NULL, dc); -} - -WinFontList::~WinFontList() { - deleteGList(fonts, WinFontInfo); -} - -void WinFontList::add(WinFontInfo *fi) { - int i; - - for (i = 0; i < fonts->getLength(); ++i) { - if (((WinFontInfo *)fonts->get(i))->equals(fi)) { - delete fi; - return; - } - } - fonts->append(fi); -} - -WinFontInfo *WinFontList::find(GString *font) { - GString *name; - GBool bold, italic; - WinFontInfo *fi; - char c; - int n, i; - - name = font->copy(); - - // remove space, comma, dash chars - i = 0; - while (i < name->getLength()) { - c = name->getChar(i); - if (c == ' ' || c == ',' || c == '-') { - name->del(i); - } else { - ++i; - } - } - n = name->getLength(); - - // remove trailing "MT" (Foo-MT, Foo-BoldMT, etc.) - if (!strcmp(name->getCString() + n - 2, "MT")) { - name->del(n - 2, 2); - n -= 2; - } - - // look for "Italic" - if (!strcmp(name->getCString() + n - 6, "Italic")) { - name->del(n - 6, 6); - italic = gTrue; - n -= 6; - } else { - italic = gFalse; - } - - // look for "Bold" - if (!strcmp(name->getCString() + n - 4, "Bold")) { - name->del(n - 4, 4); - bold = gTrue; - n -= 4; - } else { - bold = gFalse; - } - - // remove trailing "MT" (FooMT-Bold, etc.) - if (!strcmp(name->getCString() + n - 2, "MT")) { - name->del(n - 2, 2); - n -= 2; - } - - // remove trailing "PS" - if (!strcmp(name->getCString() + n - 2, "PS")) { - name->del(n - 2, 2); - n -= 2; - } - - // search for the font - fi = NULL; - for (i = 0; i < fonts->getLength(); ++i) { - fi = (WinFontInfo *)fonts->get(i); - if (!fi->name->cmp(name) && fi->bold == bold && fi->italic == italic) { - break; - } - fi = NULL; - } - - delete name; - return fi; -} - -int CALLBACK WinFontList::enumFunc1(CONST LOGFONT *font, - CONST TEXTMETRIC *metrics, - DWORD type, LPARAM data) { - WinFontList *fl = (WinFontList *)data; - - EnumFonts(fl->dc, font->lfFaceName, &WinFontList::enumFunc2, (LPARAM)fl); - return 1; -} - -int CALLBACK WinFontList::enumFunc2(CONST LOGFONT *font, - CONST TEXTMETRIC *metrics, - DWORD type, LPARAM data) { - WinFontList *fl = (WinFontList *)data; - WinFontInfo *fi; - - if (type & TRUETYPE_FONTTYPE) { - if ((fi = WinFontInfo::make(new GString(font->lfFaceName), - font->lfWeight >= 600, - font->lfItalic ? gTrue : gFalse, - fl->regKey, fl->winFontDir))) { - fl->add(fi); - } - } - return 1; -} - -#endif // WIN32 - -//------------------------------------------------------------------------ -// PSFontParam -//------------------------------------------------------------------------ - -PSFontParam::PSFontParam(GString *pdfFontNameA, int wModeA, - GString *psFontNameA, GString *encodingA) { - pdfFontName = pdfFontNameA; - wMode = wModeA; - psFontName = psFontNameA; - encoding = encodingA; -} - -PSFontParam::~PSFontParam() { - delete pdfFontName; - delete psFontName; - if (encoding) { - delete encoding; - } -} - -//------------------------------------------------------------------------ -// KeyBinding -//------------------------------------------------------------------------ - -KeyBinding::KeyBinding(int codeA, int modsA, int contextA, char *cmd0) { - code = codeA; - mods = modsA; - context = contextA; - cmds = new GList(); - cmds->append(new GString(cmd0)); -} - -KeyBinding::KeyBinding(int codeA, int modsA, int contextA, - char *cmd0, char *cmd1) { - code = codeA; - mods = modsA; - context = contextA; - cmds = new GList(); - cmds->append(new GString(cmd0)); - cmds->append(new GString(cmd1)); -} - -KeyBinding::KeyBinding(int codeA, int modsA, int contextA, GList *cmdsA) { - code = codeA; - mods = modsA; - context = contextA; - cmds = cmdsA; -} - -KeyBinding::~KeyBinding() { - deleteGList(cmds, GString); -} - -#ifdef ENABLE_PLUGINS -//------------------------------------------------------------------------ -// Plugin -//------------------------------------------------------------------------ - -class Plugin { -public: - - static Plugin *load(char *type, char *name); - ~Plugin(); - -private: - -#ifdef WIN32 - Plugin(HMODULE libA); - HMODULE lib; -#else - Plugin(void *dlA); - void *dl; -#endif -}; - -Plugin *Plugin::load(char *type, char *name) { - GString *path; - Plugin *plugin; - XpdfPluginVecTable *vt; - XpdfBool (*xpdfInitPlugin)(void); -#ifdef WIN32 - HMODULE libA; -#else - void *dlA; -#endif - - path = globalParams->getBaseDir(); - appendToPath(path, "plugins"); - appendToPath(path, type); - appendToPath(path, name); - -#ifdef WIN32 - path->append(".dll"); - if (!(libA = LoadLibrary(path->getCString()))) { - error(-1, "Failed to load plugin '%s'", - path->getCString()); - goto err1; - } - if (!(vt = (XpdfPluginVecTable *) - GetProcAddress(libA, "xpdfPluginVecTable"))) { - error(-1, "Failed to find xpdfPluginVecTable in plugin '%s'", - path->getCString()); - goto err2; - } -#else - //~ need to deal with other extensions here - path->append(".so"); - if (!(dlA = dlopen(path->getCString(), RTLD_NOW))) { - error(-1, "Failed to load plugin '%s': %s", - path->getCString(), dlerror()); - goto err1; - } - if (!(vt = (XpdfPluginVecTable *)dlsym(dlA, "xpdfPluginVecTable"))) { - error(-1, "Failed to find xpdfPluginVecTable in plugin '%s'", - path->getCString()); - goto err2; - } -#endif - - if (vt->version != xpdfPluginVecTable.version) { - error(-1, "Plugin '%s' is wrong version", path->getCString()); - goto err2; - } - memcpy(vt, &xpdfPluginVecTable, sizeof(xpdfPluginVecTable)); - -#ifdef WIN32 - if (!(xpdfInitPlugin = (XpdfBool (*)(void)) - GetProcAddress(libA, "xpdfInitPlugin"))) { - error(-1, "Failed to find xpdfInitPlugin in plugin '%s'", - path->getCString()); - goto err2; - } -#else - if (!(xpdfInitPlugin = (XpdfBool (*)(void))dlsym(dlA, "xpdfInitPlugin"))) { - error(-1, "Failed to find xpdfInitPlugin in plugin '%s'", - path->getCString()); - goto err2; - } -#endif - - if (!(*xpdfInitPlugin)()) { - error(-1, "Initialization of plugin '%s' failed", - path->getCString()); - goto err2; - } - -#ifdef WIN32 - plugin = new Plugin(libA); -#else - plugin = new Plugin(dlA); -#endif - - delete path; - return plugin; - - err2: -#ifdef WIN32 - FreeLibrary(libA); -#else - dlclose(dlA); -#endif - err1: - delete path; - return NULL; -} - -#ifdef WIN32 -Plugin::Plugin(HMODULE libA) { - lib = libA; -} -#else -Plugin::Plugin(void *dlA) { - dl = dlA; -} -#endif - -Plugin::~Plugin() { - void (*xpdfFreePlugin)(void); - -#ifdef WIN32 - if ((xpdfFreePlugin = (void (*)(void)) - GetProcAddress(lib, "xpdfFreePlugin"))) { - (*xpdfFreePlugin)(); - } - FreeLibrary(lib); -#else - if ((xpdfFreePlugin = (void (*)(void))dlsym(dl, "xpdfFreePlugin"))) { - (*xpdfFreePlugin)(); - } - dlclose(dl); -#endif -} - -#endif // ENABLE_PLUGINS - -//------------------------------------------------------------------------ -// parsing -//------------------------------------------------------------------------ - -GlobalParams::GlobalParams(char *cfgFileName) { - UnicodeMap *map; - GString *fileName; - FILE *f; - int i; - -#if MULTITHREADED - gInitMutex(&mutex); - gInitMutex(&unicodeMapCacheMutex); - gInitMutex(&cMapCacheMutex); -#endif - - initBuiltinFontTables(); - - // scan the encoding in reverse because we want the lowest-numbered - // index for each char name ('space' is encoded twice) - macRomanReverseMap = new NameToCharCode(); - for (i = 255; i >= 0; --i) { - if (macRomanEncoding[i]) { - macRomanReverseMap->add(macRomanEncoding[i], (CharCode)i); - } - } - -#ifdef WIN32 - // baseDir will be set by a call to setBaseDir - baseDir = new GString(); -#else - baseDir = appendToPath(getHomeDir(), ".xpdf"); -#endif - nameToUnicode = new NameToCharCode(); - cidToUnicodes = new GHash(gTrue); - unicodeToUnicodes = new GHash(gTrue); - residentUnicodeMaps = new GHash(); - unicodeMaps = new GHash(gTrue); - cMapDirs = new GHash(gTrue); - toUnicodeDirs = new GList(); - displayFonts = new GHash(); - displayCIDFonts = new GHash(); - displayNamedCIDFonts = new GHash(); -#if HAVE_PAPER_H - char *paperName; - const struct paper *paperType; - paperinit(); - if ((paperName = systempapername())) { - paperType = paperinfo(paperName); - psPaperWidth = (int)paperpswidth(paperType); - psPaperHeight = (int)paperpsheight(paperType); - } else { - error(-1, "No paper information available - using defaults"); - psPaperWidth = defPaperWidth; - psPaperHeight = defPaperHeight; - } - paperdone(); -#else - psPaperWidth = defPaperWidth; - psPaperHeight = defPaperHeight; -#endif - psImageableLLX = psImageableLLY = 0; - psImageableURX = psPaperWidth; - psImageableURY = psPaperHeight; - psCrop = gTrue; - psExpandSmaller = gFalse; - psShrinkLarger = gTrue; - psCenter = gTrue; - psDuplex = gFalse; - psLevel = psLevel2; - psFile = NULL; - psFonts = new GHash(); - psNamedFonts16 = new GList(); - psFonts16 = new GList(); - psEmbedType1 = gTrue; - psEmbedTrueType = gTrue; - psEmbedCIDPostScript = gTrue; - psEmbedCIDTrueType = gTrue; - psPreload = gFalse; - psOPI = gFalse; - psASCIIHex = gFalse; - textEncoding = new GString("Latin1"); -#if defined(WIN32) - textEOL = eolDOS; -#elif defined(MACOS) - textEOL = eolMac; -#else - textEOL = eolUnix; -#endif - textPageBreaks = gTrue; - textKeepTinyChars = gFalse; - fontDirs = new GList(); - initialZoom = new GString("125"); - continuousView = gFalse; - enableT1lib = gTrue; - enableFreeType = gTrue; - antialias = gTrue; - vectorAntialias = gTrue; - strokeAdjust = gTrue; - screenType = screenUnset; - screenSize = -1; - screenDotRadius = -1; - screenGamma = 1.0; - screenBlackThreshold = 0.0; - screenWhiteThreshold = 1.0; - urlCommand = NULL; - movieCommand = NULL; - mapNumericCharNames = gTrue; - mapUnknownCharNames = gFalse; - createDefaultKeyBindings(); - printCommands = gFalse; - errQuiet = gFalse; - - cidToUnicodeCache = new CharCodeToUnicodeCache(cidToUnicodeCacheSize); - unicodeToUnicodeCache = - new CharCodeToUnicodeCache(unicodeToUnicodeCacheSize); - unicodeMapCache = new UnicodeMapCache(); - cMapCache = new CMapCache(); - -#ifdef WIN32 - winFontList = NULL; -#endif - -#ifdef ENABLE_PLUGINS - plugins = new GList(); - securityHandlers = new GList(); -#endif - - // set up the initial nameToUnicode table - for (i = 0; nameToUnicodeTab[i].name; ++i) { - nameToUnicode->add(nameToUnicodeTab[i].name, nameToUnicodeTab[i].u); - } - - // set up the residentUnicodeMaps table - map = new UnicodeMap("Latin1", gFalse, - latin1UnicodeMapRanges, latin1UnicodeMapLen); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("ASCII7", gFalse, - ascii7UnicodeMapRanges, ascii7UnicodeMapLen); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("Symbol", gFalse, - symbolUnicodeMapRanges, symbolUnicodeMapLen); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("ZapfDingbats", gFalse, zapfDingbatsUnicodeMapRanges, - zapfDingbatsUnicodeMapLen); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("UTF-8", gTrue, &mapUTF8); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("UCS-2", gTrue, &mapUCS2); - residentUnicodeMaps->add(map->getEncodingName(), map); - - // look for a user config file, then a system-wide config file - f = NULL; - fileName = NULL; - if (cfgFileName && cfgFileName[0]) { - fileName = new GString(cfgFileName); - if (!(f = fopen(fileName->getCString(), "r"))) { - delete fileName; - } - } - if (!f) { - fileName = appendToPath(getHomeDir(), xpdfUserConfigFile); - if (!(f = fopen(fileName->getCString(), "r"))) { - delete fileName; - } - } - if (!f) { -#if defined(WIN32) && !defined(__CYGWIN32__) - char buf[512]; - i = GetModuleFileName(NULL, buf, sizeof(buf)); - if (i <= 0 || i >= sizeof(buf)) { - // error or path too long for buffer - just use the current dir - buf[0] = '\0'; - } - fileName = grabPath(buf); - appendToPath(fileName, xpdfSysConfigFile); -#else - fileName = new GString(xpdfSysConfigFile); -#endif - if (!(f = fopen(fileName->getCString(), "r"))) { - delete fileName; - } - } - if (f) { - parseFile(fileName, f); - delete fileName; - fclose(f); - } -} - -void GlobalParams::createDefaultKeyBindings() { - keyBindings = new GList(); - - //----- mouse buttons - keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress1, xpdfKeyModNone, - xpdfKeyContextAny, "startSelection")); - keyBindings->append(new KeyBinding(xpdfKeyCodeMouseRelease1, xpdfKeyModNone, - xpdfKeyContextAny, "endSelection", - "followLinkNoSel")); - keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress2, xpdfKeyModNone, - xpdfKeyContextAny, "startPan")); - keyBindings->append(new KeyBinding(xpdfKeyCodeMouseRelease2, xpdfKeyModNone, - xpdfKeyContextAny, "endPan")); - keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress3, xpdfKeyModNone, - xpdfKeyContextAny, "postPopupMenu")); - keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress4, xpdfKeyModNone, - xpdfKeyContextAny, - "scrollUpPrevPage(16)")); - keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress5, xpdfKeyModNone, - xpdfKeyContextAny, - "scrollDownNextPage(16)")); - keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress6, xpdfKeyModNone, - xpdfKeyContextAny, "scrollLeft(16)")); - keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress7, xpdfKeyModNone, - xpdfKeyContextAny, "scrollRight(16)")); - - //----- keys - keyBindings->append(new KeyBinding(xpdfKeyCodeHome, xpdfKeyModCtrl, - xpdfKeyContextAny, "gotoPage(1)")); - keyBindings->append(new KeyBinding(xpdfKeyCodeHome, xpdfKeyModNone, - xpdfKeyContextAny, "scrollToTopLeft")); - keyBindings->append(new KeyBinding(xpdfKeyCodeEnd, xpdfKeyModCtrl, - xpdfKeyContextAny, "gotoLastPage")); - keyBindings->append(new KeyBinding(xpdfKeyCodeEnd, xpdfKeyModNone, - xpdfKeyContextAny, - "scrollToBottomRight")); - keyBindings->append(new KeyBinding(xpdfKeyCodePgUp, xpdfKeyModNone, - xpdfKeyContextAny, "pageUp")); - keyBindings->append(new KeyBinding(xpdfKeyCodeBackspace, xpdfKeyModNone, - xpdfKeyContextAny, "pageUp")); - keyBindings->append(new KeyBinding(xpdfKeyCodeDelete, xpdfKeyModNone, - xpdfKeyContextAny, "pageUp")); - keyBindings->append(new KeyBinding(xpdfKeyCodePgDn, xpdfKeyModNone, - xpdfKeyContextAny, "pageDown")); - keyBindings->append(new KeyBinding(' ', xpdfKeyModNone, - xpdfKeyContextAny, "pageDown")); - keyBindings->append(new KeyBinding(xpdfKeyCodeLeft, xpdfKeyModNone, - xpdfKeyContextAny, "scrollLeft(16)")); - keyBindings->append(new KeyBinding(xpdfKeyCodeRight, xpdfKeyModNone, - xpdfKeyContextAny, "scrollRight(16)")); - keyBindings->append(new KeyBinding(xpdfKeyCodeUp, xpdfKeyModNone, - xpdfKeyContextAny, "scrollUp(16)")); - keyBindings->append(new KeyBinding(xpdfKeyCodeDown, xpdfKeyModNone, - xpdfKeyContextAny, "scrollDown(16)")); - keyBindings->append(new KeyBinding('o', xpdfKeyModNone, - xpdfKeyContextAny, "open")); - keyBindings->append(new KeyBinding('O', xpdfKeyModNone, - xpdfKeyContextAny, "open")); - keyBindings->append(new KeyBinding('r', xpdfKeyModNone, - xpdfKeyContextAny, "reload")); - keyBindings->append(new KeyBinding('R', xpdfKeyModNone, - xpdfKeyContextAny, "reload")); - keyBindings->append(new KeyBinding('f', xpdfKeyModNone, - xpdfKeyContextAny, "find")); - keyBindings->append(new KeyBinding('F', xpdfKeyModNone, - xpdfKeyContextAny, "find")); - keyBindings->append(new KeyBinding('f', xpdfKeyModCtrl, - xpdfKeyContextAny, "find")); - keyBindings->append(new KeyBinding('g', xpdfKeyModCtrl, - xpdfKeyContextAny, "findNext")); - keyBindings->append(new KeyBinding('p', xpdfKeyModCtrl, - xpdfKeyContextAny, "print")); - keyBindings->append(new KeyBinding('n', xpdfKeyModNone, - xpdfKeyContextScrLockOff, "nextPage")); - keyBindings->append(new KeyBinding('N', xpdfKeyModNone, - xpdfKeyContextScrLockOff, "nextPage")); - keyBindings->append(new KeyBinding('n', xpdfKeyModNone, - xpdfKeyContextScrLockOn, - "nextPageNoScroll")); - keyBindings->append(new KeyBinding('N', xpdfKeyModNone, - xpdfKeyContextScrLockOn, - "nextPageNoScroll")); - keyBindings->append(new KeyBinding('p', xpdfKeyModNone, - xpdfKeyContextScrLockOff, "prevPage")); - keyBindings->append(new KeyBinding('P', xpdfKeyModNone, - xpdfKeyContextScrLockOff, "prevPage")); - keyBindings->append(new KeyBinding('p', xpdfKeyModNone, - xpdfKeyContextScrLockOn, - "prevPageNoScroll")); - keyBindings->append(new KeyBinding('P', xpdfKeyModNone, - xpdfKeyContextScrLockOn, - "prevPageNoScroll")); - keyBindings->append(new KeyBinding('v', xpdfKeyModNone, - xpdfKeyContextAny, "goForward")); - keyBindings->append(new KeyBinding('b', xpdfKeyModNone, - xpdfKeyContextAny, "goBackward")); - keyBindings->append(new KeyBinding('g', xpdfKeyModNone, - xpdfKeyContextAny, "focusToPageNum")); - keyBindings->append(new KeyBinding('0', xpdfKeyModNone, - xpdfKeyContextAny, "zoomPercent(125)")); - keyBindings->append(new KeyBinding('+', xpdfKeyModNone, - xpdfKeyContextAny, "zoomIn")); - keyBindings->append(new KeyBinding('-', xpdfKeyModNone, - xpdfKeyContextAny, "zoomOut")); - keyBindings->append(new KeyBinding('z', xpdfKeyModNone, - xpdfKeyContextAny, "zoomFitPage")); - keyBindings->append(new KeyBinding('w', xpdfKeyModNone, - xpdfKeyContextAny, "zoomFitWidth")); - keyBindings->append(new KeyBinding('f', xpdfKeyModAlt, - xpdfKeyContextAny, - "toggleFullScreenMode")); - keyBindings->append(new KeyBinding('l', xpdfKeyModCtrl, - xpdfKeyContextAny, "redraw")); - keyBindings->append(new KeyBinding('w', xpdfKeyModCtrl, - xpdfKeyContextAny, "closeWindow")); - keyBindings->append(new KeyBinding('?', xpdfKeyModNone, - xpdfKeyContextAny, "about")); - keyBindings->append(new KeyBinding('q', xpdfKeyModNone, - xpdfKeyContextAny, "quit")); - keyBindings->append(new KeyBinding('Q', xpdfKeyModNone, - xpdfKeyContextAny, "quit")); -} - -void GlobalParams::parseFile(GString *fileName, FILE *f) { - int line; - char buf[512]; - - /* extract path */ - if(fileName) { - char* cfgFileName = fileName->getCString(); - char* pos1 = strrchr(cfgFileName, '/'); - char* pos2 = strrchr(cfgFileName, '\\'); - char* p = pos1>pos2?pos1:pos2; - int pos = p ? p-cfgFileName : -1; - GString*path = new GString(new GString(cfgFileName), 0, (pos < 0 ? strlen(cfgFileName): pos)); - if(pos1>=0) - path->append('/'); - else if(pos2>=0) - path->append('\\'); - else -#ifdef WIN32 - path->append('\\'); -#else - path->append('/'); -#endif - this->path = path; - } else { - this->path = new GString(); - } - - line = 1; - while (getLine(buf, sizeof(buf) - 1, f)) { - parseLine(buf, fileName, line); - ++line; - } -} - -void GlobalParams::parseLine(char *buf, GString *fileName, int line) { - GList *tokens; - GString *cmd, *incFile; - char *p1, *p2; - FILE *f2; - - // break the line into tokens - tokens = new GList(); - p1 = buf; - while (*p1) { - for (; *p1 && isspace(*p1); ++p1) ; - if (!*p1) { - break; - } - if (*p1 == '"' || *p1 == '\'') { - for (p2 = p1 + 1; *p2 && *p2 != *p1; ++p2) ; - ++p1; - } else { - for (p2 = p1 + 1; *p2 && !isspace(*p2); ++p2) ; - } - tokens->append(new GString(p1, p2 - p1)); - p1 = *p2 ? p2 + 1 : p2; - } - - // parse the line - if (tokens->getLength() > 0 && - ((GString *)tokens->get(0))->getChar(0) != '#') { - cmd = (GString *)tokens->get(0); - if (!cmd->cmp("include")) { - if (tokens->getLength() == 2) { - incFile = (GString *)tokens->get(1); - if ((f2 = fopen(incFile->getCString(), "r"))) { - parseFile(incFile, f2); - fclose(f2); - } else { - error(-1, "Couldn't find included config file: '%s' (%s:%d)", - incFile->getCString(), fileName->getCString(), line); - } - } else { - error(-1, "Bad 'include' config file command (%s:%d)", - fileName->getCString(), line); - } - } else if (!cmd->cmp("nameToUnicode")) { - parseNameToUnicode(tokens, fileName, line); - } else if (!cmd->cmp("cidToUnicode")) { - parseCIDToUnicode(tokens, fileName, line); - } else if (!cmd->cmp("unicodeToUnicode")) { - parseUnicodeToUnicode(tokens, fileName, line); - } else if (!cmd->cmp("unicodeMap")) { - parseUnicodeMap(tokens, fileName, line); - } else if (!cmd->cmp("cMapDir")) { - parseCMapDir(tokens, fileName, line); - } else if (!cmd->cmp("toUnicodeDir")) { - parseToUnicodeDir(tokens, fileName, line); - } else if (!cmd->cmp("displayFontT1")) { - parseDisplayFont(tokens, displayFonts, displayFontT1, fileName, line); - } else if (!cmd->cmp("displayFontTT")) { - parseDisplayFont(tokens, displayFonts, displayFontTT, fileName, line); - } else if (!cmd->cmp("displayNamedCIDFontT1")) { - parseDisplayFont(tokens, displayNamedCIDFonts, - displayFontT1, fileName, line); - } else if (!cmd->cmp("displayCIDFontT1")) { - parseDisplayFont(tokens, displayCIDFonts, - displayFontT1, fileName, line); - } else if (!cmd->cmp("displayNamedCIDFontTT")) { - parseDisplayFont(tokens, displayNamedCIDFonts, - displayFontTT, fileName, line); - } else if (!cmd->cmp("displayCIDFontTT")) { - parseDisplayFont(tokens, displayCIDFonts, - displayFontTT, fileName, line); - } else if (!cmd->cmp("psFile")) { - parsePSFile(tokens, fileName, line); - } else if (!cmd->cmp("psFont")) { - parsePSFont(tokens, fileName, line); - } else if (!cmd->cmp("psNamedFont16")) { - parsePSFont16("psNamedFont16", psNamedFonts16, - tokens, fileName, line); - } else if (!cmd->cmp("psFont16")) { - parsePSFont16("psFont16", psFonts16, tokens, fileName, line); - } else if (!cmd->cmp("psPaperSize")) { - parsePSPaperSize(tokens, fileName, line); - } else if (!cmd->cmp("psImageableArea")) { - parsePSImageableArea(tokens, fileName, line); - } else if (!cmd->cmp("psCrop")) { - parseYesNo("psCrop", &psCrop, tokens, fileName, line); - } else if (!cmd->cmp("psExpandSmaller")) { - parseYesNo("psExpandSmaller", &psExpandSmaller, - tokens, fileName, line); - } else if (!cmd->cmp("psShrinkLarger")) { - parseYesNo("psShrinkLarger", &psShrinkLarger, tokens, fileName, line); - } else if (!cmd->cmp("psCenter")) { - parseYesNo("psCenter", &psCenter, tokens, fileName, line); - } else if (!cmd->cmp("psDuplex")) { - parseYesNo("psDuplex", &psDuplex, tokens, fileName, line); - } else if (!cmd->cmp("psLevel")) { - parsePSLevel(tokens, fileName, line); - } else if (!cmd->cmp("psEmbedType1Fonts")) { - parseYesNo("psEmbedType1", &psEmbedType1, tokens, fileName, line); - } else if (!cmd->cmp("psEmbedTrueTypeFonts")) { - parseYesNo("psEmbedTrueType", &psEmbedTrueType, - tokens, fileName, line); - } else if (!cmd->cmp("psEmbedCIDPostScriptFonts")) { - parseYesNo("psEmbedCIDPostScript", &psEmbedCIDPostScript, - tokens, fileName, line); - } else if (!cmd->cmp("psEmbedCIDTrueTypeFonts")) { - parseYesNo("psEmbedCIDTrueType", &psEmbedCIDTrueType, - tokens, fileName, line); - } else if (!cmd->cmp("psPreload")) { - parseYesNo("psPreload", &psPreload, tokens, fileName, line); - } else if (!cmd->cmp("psOPI")) { - parseYesNo("psOPI", &psOPI, tokens, fileName, line); - } else if (!cmd->cmp("psASCIIHex")) { - parseYesNo("psASCIIHex", &psASCIIHex, tokens, fileName, line); - } else if (!cmd->cmp("textEncoding")) { - parseTextEncoding(tokens, fileName, line); - } else if (!cmd->cmp("textEOL")) { - parseTextEOL(tokens, fileName, line); - } else if (!cmd->cmp("textPageBreaks")) { - parseYesNo("textPageBreaks", &textPageBreaks, - tokens, fileName, line); - } else if (!cmd->cmp("textKeepTinyChars")) { - parseYesNo("textKeepTinyChars", &textKeepTinyChars, - tokens, fileName, line); - } else if (!cmd->cmp("fontDir")) { - parseFontDir(tokens, fileName, line); - } else if (!cmd->cmp("initialZoom")) { - parseInitialZoom(tokens, fileName, line); - } else if (!cmd->cmp("continuousView")) { - parseYesNo("continuousView", &continuousView, tokens, fileName, line); - } else if (!cmd->cmp("enableT1lib")) { - parseYesNo("enableT1lib", &enableT1lib, tokens, fileName, line); - } else if (!cmd->cmp("enableFreeType")) { - parseYesNo("enableFreeType", &enableFreeType, tokens, fileName, line); - } else if (!cmd->cmp("antialias")) { - parseYesNo("antialias", &antialias, tokens, fileName, line); - } else if (!cmd->cmp("vectorAntialias")) { - parseYesNo("vectorAntialias", &vectorAntialias, - tokens, fileName, line); - } else if (!cmd->cmp("strokeAdjust")) { - parseYesNo("strokeAdjust", &strokeAdjust, tokens, fileName, line); - } else if (!cmd->cmp("screenType")) { - parseScreenType(tokens, fileName, line); - } else if (!cmd->cmp("screenSize")) { - parseInteger("screenSize", &screenSize, tokens, fileName, line); - } else if (!cmd->cmp("screenDotRadius")) { - parseInteger("screenDotRadius", &screenDotRadius, - tokens, fileName, line); - } else if (!cmd->cmp("screenGamma")) { - parseFloat("screenGamma", &screenGamma, - tokens, fileName, line); - } else if (!cmd->cmp("screenBlackThreshold")) { - parseFloat("screenBlackThreshold", &screenBlackThreshold, - tokens, fileName, line); - } else if (!cmd->cmp("screenWhiteThreshold")) { - parseFloat("screenWhiteThreshold", &screenWhiteThreshold, - tokens, fileName, line); - } else if (!cmd->cmp("urlCommand")) { - parseCommand("urlCommand", &urlCommand, tokens, fileName, line); - } else if (!cmd->cmp("movieCommand")) { - parseCommand("movieCommand", &movieCommand, tokens, fileName, line); - } else if (!cmd->cmp("mapNumericCharNames")) { - parseYesNo("mapNumericCharNames", &mapNumericCharNames, - tokens, fileName, line); - } else if (!cmd->cmp("mapUnknownCharNames")) { - parseYesNo("mapUnknownCharNames", &mapUnknownCharNames, - tokens, fileName, line); - } else if (!cmd->cmp("bind")) { - parseBind(tokens, fileName, line); - } else if (!cmd->cmp("unbind")) { - parseUnbind(tokens, fileName, line); - } else if (!cmd->cmp("printCommands")) { - parseYesNo("printCommands", &printCommands, tokens, fileName, line); - } else if (!cmd->cmp("errQuiet")) { - parseYesNo("errQuiet", &errQuiet, tokens, fileName, line); - } else { - error(-1, "Unknown config file command '%s' (%s:%d)", - cmd->getCString(), fileName->getCString(), line); - if (!cmd->cmp("displayFontX") || - !cmd->cmp("displayNamedCIDFontX") || - !cmd->cmp("displayCIDFontX")) { - error(-1, "-- Xpdf no longer supports X fonts"); - } else if (!cmd->cmp("t1libControl") || !cmd->cmp("freetypeControl")) { - error(-1, "-- The t1libControl and freetypeControl options have been replaced"); - error(-1, " by the enableT1lib, enableFreeType, and antialias options"); - } else if (!cmd->cmp("fontpath") || !cmd->cmp("fontmap")) { - error(-1, "-- the config file format has changed since Xpdf 0.9x"); - } - } - } - - deleteGList(tokens, GString); -} - -static char is_absolute(char*filename) -{ - int l = strlen(filename); - if(filename[0] == '/' || filename[0] == '\\') - return 1; - if(l>2 && filename[1]==':' && (filename[2]=='\\' || filename[2]=='/')) - return 1; - return 0; -} - -static GString* qualify_filename(GString*path, GString*filename) -{ - GString*fullpath = 0; - char*prefix = "/usr/local/share/xpdf/"; - - if (!is_absolute(filename->getCString())) { - /* relative path */ - fullpath = path->copy(); - fullpath->append(filename); - } else if (!strncmp(filename->getCString(), prefix, strlen(prefix))) { - /* xpdf default path */ - char*s = strchr(filename->getCString()+strlen(prefix), '/'); - if(s) { - fullpath = path->copy(); - fullpath->append(s+1); - } else { - fullpath = filename->copy(); - } - } else { - /* absolute path */ - fullpath = filename->copy(); - } - //printf("%s -%s-> %s\n", filename->getCString(), path->getCString(), fullpath->getCString()); - return fullpath; -} - -void GlobalParams::parseNameToUnicode(GList *tokens, GString *fileName, - int line) { - GString *name; - char *tok1, *tok2; - FILE *f; - char buf[256]; - int line2; - Unicode u; - - if (tokens->getLength() != 2) { - error(-1, "Bad 'nameToUnicode' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - name = qualify_filename(this->path, (GString *)tokens->get(1)); - if (!(f = fopen(name->getCString(), "r"))) { - error(-1, "Couldn't open 'nameToUnicode' file '%s' using path '%s'", - name->getCString(), path->getCString()); - return; - } - line2 = 1; - while (getLine(buf, sizeof(buf), f)) { - tok1 = strtok(buf, " \t\r\n"); - tok2 = strtok(NULL, " \t\r\n"); - if (tok1 && tok2) { - sscanf(tok1, "%x", &u); - nameToUnicode->add(tok2, u); - } else { - error(-1, "Bad line in 'nameToUnicode' file (%s:%d)", name, line2); - } - ++line2; - } - fclose(f); -} - -void GlobalParams::parseCIDToUnicode(GList *tokens, GString *fileName, - int line) { - GString *collection, *name, *old; - - if (tokens->getLength() != 3) { - error(-1, "Bad 'cidToUnicode' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - collection = (GString *)tokens->get(1); - name = (GString *)tokens->get(2); - - if ((old = (GString *)cidToUnicodes->remove(collection))) { - delete old; - } - - cidToUnicodes->add(collection->copy(), qualify_filename(this->path, name)); -} - -void GlobalParams::parseUnicodeToUnicode(GList *tokens, GString *fileName, - int line) { - GString *font, *file, *old; - - if (tokens->getLength() != 3) { - error(-1, "Bad 'unicodeToUnicode' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - font = (GString *)tokens->get(1); - file = (GString *)tokens->get(2); - if ((old = (GString *)unicodeToUnicodes->remove(font))) { - delete old; - } - - unicodeToUnicodes->add(font->copy(), qualify_filename(this->path, file)); -} - -void GlobalParams::parseUnicodeMap(GList *tokens, GString *fileName, - int line) { - GString *encodingName, *name, *old; - - if (tokens->getLength() != 3) { - error(-1, "Bad 'unicodeMap' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - encodingName = (GString *)tokens->get(1); - name = (GString *)tokens->get(2); - if ((old = (GString *)unicodeMaps->remove(encodingName))) { - delete old; - } - - unicodeMaps->add(encodingName->copy(), qualify_filename(this->path, name)); -} - -void GlobalParams::parseCMapDir(GList *tokens, GString *fileName, int line) { - GString *collection, *dir; - GList *list; - - if (tokens->getLength() != 3) { - error(-1, "Bad 'cMapDir' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - collection = (GString *)tokens->get(1); - dir = (GString *)tokens->get(2); - if (!(list = (GList *)cMapDirs->lookup(collection))) { - list = new GList(); - cMapDirs->add(collection->copy(), list); - } - - list->append(qualify_filename(this->path, dir)); -} - -void GlobalParams::parseToUnicodeDir(GList *tokens, GString *fileName, - int line) { - GString *dir; - - if (tokens->getLength() != 2) { - error(-1, "Bad 'toUnicodeDir' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - - dir = (GString *)tokens->get(1); - - toUnicodeDirs->append(qualify_filename(this->path, dir)); -} - -void GlobalParams::parseDisplayFont(GList *tokens, GHash *fontHash, - DisplayFontParamKind kind, - GString *fileName, int line) { - DisplayFontParam *param, *old; - GString *file; - - if (tokens->getLength() < 2) { - goto err1; - } - param = new DisplayFontParam(((GString *)tokens->get(1))->copy(), kind); - - switch (kind) { - case displayFontT1: - if (tokens->getLength() != 3) { - goto err2; - } - file = (GString *)tokens->get(2); - param->t1.fileName = qualify_filename(this->path, file); - break; - case displayFontTT: - if (tokens->getLength() != 3) { - goto err2; - } - file = (GString *)tokens->get(2); - param->tt.fileName = qualify_filename(this->path, file); - break; - } - - if ((old = (DisplayFontParam *)fontHash->remove(param->name))) { - delete old; - } - fontHash->add(param->name, param); - return; - - err2: - delete param; - err1: - error(-1, "Bad 'display*Font*' config file command (%s:%d)", - fileName->getCString(), line); -} - -void GlobalParams::parsePSPaperSize(GList *tokens, GString *fileName, - int line) { - GString *tok; - - if (tokens->getLength() == 2) { - tok = (GString *)tokens->get(1); - if (!setPSPaperSize(tok->getCString())) { - error(-1, "Bad 'psPaperSize' config file command (%s:%d)", - fileName->getCString(), line); - } - } else if (tokens->getLength() == 3) { - tok = (GString *)tokens->get(1); - psPaperWidth = atoi(tok->getCString()); - tok = (GString *)tokens->get(2); - psPaperHeight = atoi(tok->getCString()); - psImageableLLX = psImageableLLY = 0; - psImageableURX = psPaperWidth; - psImageableURY = psPaperHeight; - } else { - error(-1, "Bad 'psPaperSize' config file command (%s:%d)", - fileName->getCString(), line); - } -} - -void GlobalParams::parsePSImageableArea(GList *tokens, GString *fileName, - int line) { - if (tokens->getLength() != 5) { - error(-1, "Bad 'psImageableArea' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - psImageableLLX = atoi(((GString *)tokens->get(1))->getCString()); - psImageableLLY = atoi(((GString *)tokens->get(2))->getCString()); - psImageableURX = atoi(((GString *)tokens->get(3))->getCString()); - psImageableURY = atoi(((GString *)tokens->get(4))->getCString()); -} - -void GlobalParams::parsePSLevel(GList *tokens, GString *fileName, int line) { - GString *tok; - - if (tokens->getLength() != 2) { - error(-1, "Bad 'psLevel' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - tok = (GString *)tokens->get(1); - if (!tok->cmp("level1")) { - psLevel = psLevel1; - } else if (!tok->cmp("level1sep")) { - psLevel = psLevel1Sep; - } else if (!tok->cmp("level2")) { - psLevel = psLevel2; - } else if (!tok->cmp("level2sep")) { - psLevel = psLevel2Sep; - } else if (!tok->cmp("level3")) { - psLevel = psLevel3; - } else if (!tok->cmp("level3Sep")) { - psLevel = psLevel3Sep; - } else { - error(-1, "Bad 'psLevel' config file command (%s:%d)", - fileName->getCString(), line); - } -} - -void GlobalParams::parsePSFile(GList *tokens, GString *fileName, int line) { - if (tokens->getLength() != 2) { - error(-1, "Bad 'psFile' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - if (psFile) { - delete psFile; - } - psFile = ((GString *)tokens->get(1))->copy(); -} - -void GlobalParams::parsePSFont(GList *tokens, GString *fileName, int line) { - PSFontParam *param; - - if (tokens->getLength() != 3) { - error(-1, "Bad 'psFont' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - param = new PSFontParam(((GString *)tokens->get(1))->copy(), 0, - ((GString *)tokens->get(2))->copy(), NULL); - psFonts->add(param->pdfFontName, param); -} - -void GlobalParams::parsePSFont16(char *cmdName, GList *fontList, - GList *tokens, GString *fileName, int line) { - PSFontParam *param; - int wMode; - GString *tok; - - if (tokens->getLength() != 5) { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - tok = (GString *)tokens->get(2); - if (!tok->cmp("H")) { - wMode = 0; - } else if (!tok->cmp("V")) { - wMode = 1; - } else { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - param = new PSFontParam(((GString *)tokens->get(1))->copy(), - wMode, - ((GString *)tokens->get(3))->copy(), - ((GString *)tokens->get(4))->copy()); - fontList->append(param); -} - -void GlobalParams::parseTextEncoding(GList *tokens, GString *fileName, - int line) { - if (tokens->getLength() != 2) { - error(-1, "Bad 'textEncoding' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - delete textEncoding; - textEncoding = ((GString *)tokens->get(1))->copy(); -} - -void GlobalParams::parseTextEOL(GList *tokens, GString *fileName, int line) { - GString *tok; - - if (tokens->getLength() != 2) { - error(-1, "Bad 'textEOL' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - tok = (GString *)tokens->get(1); - if (!tok->cmp("unix")) { - textEOL = eolUnix; - } else if (!tok->cmp("dos")) { - textEOL = eolDOS; - } else if (!tok->cmp("mac")) { - textEOL = eolMac; - } else { - error(-1, "Bad 'textEOL' config file command (%s:%d)", - fileName->getCString(), line); - } -} - -void GlobalParams::parseFontDir(GList *tokens, GString *fileName, int line) { - if (tokens->getLength() != 2) { - error(-1, "Bad 'fontDir' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - fontDirs->append(((GString *)tokens->get(1))->copy()); -} - -void GlobalParams::parseInitialZoom(GList *tokens, - GString *fileName, int line) { - if (tokens->getLength() != 2) { - error(-1, "Bad 'initialZoom' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - delete initialZoom; - initialZoom = ((GString *)tokens->get(1))->copy(); -} - -void GlobalParams::parseScreenType(GList *tokens, GString *fileName, - int line) { - GString *tok; - - if (tokens->getLength() != 2) { - error(-1, "Bad 'screenType' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - tok = (GString *)tokens->get(1); - if (!tok->cmp("dispersed")) { - screenType = screenDispersed; - } else if (!tok->cmp("clustered")) { - screenType = screenClustered; - } else if (!tok->cmp("stochasticClustered")) { - screenType = screenStochasticClustered; - } else { - error(-1, "Bad 'screenType' config file command (%s:%d)", - fileName->getCString(), line); - } -} - -void GlobalParams::parseBind(GList *tokens, GString *fileName, int line) { - KeyBinding *binding; - GList *cmds; - int code, mods, context, i; - - if (tokens->getLength() < 4) { - error(-1, "Bad 'bind' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - if (!parseKey((GString *)tokens->get(1), (GString *)tokens->get(2), - &code, &mods, &context, - "bind", tokens, fileName, line)) { - return; - } - for (i = 0; i < keyBindings->getLength(); ++i) { - binding = (KeyBinding *)keyBindings->get(i); - if (binding->code == code && - binding->mods == mods && - binding->context == context) { - delete (KeyBinding *)keyBindings->del(i); - break; - } - } - cmds = new GList(); - for (i = 3; i < tokens->getLength(); ++i) { - cmds->append(((GString *)tokens->get(i))->copy()); - } - keyBindings->append(new KeyBinding(code, mods, context, cmds)); -} - -void GlobalParams::parseUnbind(GList *tokens, GString *fileName, int line) { - KeyBinding *binding; - int code, mods, context, i; - - if (tokens->getLength() != 3) { - error(-1, "Bad 'unbind' config file command (%s:%d)", - fileName->getCString(), line); - return; - } - if (!parseKey((GString *)tokens->get(1), (GString *)tokens->get(2), - &code, &mods, &context, - "unbind", tokens, fileName, line)) { - return; - } - for (i = 0; i < keyBindings->getLength(); ++i) { - binding = (KeyBinding *)keyBindings->get(i); - if (binding->code == code && - binding->mods == mods && - binding->context == context) { - delete (KeyBinding *)keyBindings->del(i); - break; - } - } -} - -GBool GlobalParams::parseKey(GString *modKeyStr, GString *contextStr, - int *code, int *mods, int *context, - char *cmdName, - GList *tokens, GString *fileName, int line) { - char *p0; - - *mods = xpdfKeyModNone; - p0 = modKeyStr->getCString(); - while (1) { - if (!strncmp(p0, "shift-", 6)) { - *mods |= xpdfKeyModShift; - p0 += 6; - } else if (!strncmp(p0, "ctrl-", 5)) { - *mods |= xpdfKeyModCtrl; - p0 += 5; - } else if (!strncmp(p0, "alt-", 4)) { - *mods |= xpdfKeyModAlt; - p0 += 4; - } else { - break; - } - } - - if (!strcmp(p0, "space")) { - *code = ' '; - } else if (!strcmp(p0, "tab")) { - *code = xpdfKeyCodeTab; - } else if (!strcmp(p0, "return")) { - *code = xpdfKeyCodeReturn; - } else if (!strcmp(p0, "enter")) { - *code = xpdfKeyCodeEnter; - } else if (!strcmp(p0, "backspace")) { - *code = xpdfKeyCodeBackspace; - } else if (!strcmp(p0, "insert")) { - *code = xpdfKeyCodeInsert; - } else if (!strcmp(p0, "delete")) { - *code = xpdfKeyCodeDelete; - } else if (!strcmp(p0, "home")) { - *code = xpdfKeyCodeHome; - } else if (!strcmp(p0, "end")) { - *code = xpdfKeyCodeEnd; - } else if (!strcmp(p0, "pgup")) { - *code = xpdfKeyCodePgUp; - } else if (!strcmp(p0, "pgdn")) { - *code = xpdfKeyCodePgDn; - } else if (!strcmp(p0, "left")) { - *code = xpdfKeyCodeLeft; - } else if (!strcmp(p0, "right")) { - *code = xpdfKeyCodeRight; - } else if (!strcmp(p0, "up")) { - *code = xpdfKeyCodeUp; - } else if (!strcmp(p0, "down")) { - *code = xpdfKeyCodeDown; - } else if (p0[0] == 'f' && p0[1] >= '1' && p0[1] <= '9' && !p0[2]) { - *code = xpdfKeyCodeF1 + (p0[1] - '1'); - } else if (p0[0] == 'f' && - ((p0[1] >= '1' && p0[1] <= '2' && p0[2] >= '0' && p0[2] <= '9') || - (p0[1] == '3' && p0[2] >= '0' && p0[2] <= '5')) && - !p0[3]) { - *code = xpdfKeyCodeF1 + 10 * (p0[1] - '0') + (p0[2] - '0') - 1; - } else if (!strncmp(p0, "mousePress", 10) && - p0[10] >= '1' && p0[10] <= '7' && !p0[11]) { - *code = xpdfKeyCodeMousePress1 + (p0[10] - '1'); - } else if (!strncmp(p0, "mouseRelease", 12) && - p0[12] >= '1' && p0[12] <= '7' && !p0[13]) { - *code = xpdfKeyCodeMouseRelease1 + (p0[12] - '1'); - } else if (*p0 >= 0x20 && *p0 <= 0x7e && !p0[1]) { - *code = (int)*p0; - } else { - error(-1, "Bad key/modifier in '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return gFalse; - } - - p0 = contextStr->getCString(); - if (!strcmp(p0, "any")) { - *context = xpdfKeyContextAny; - } else { - *context = xpdfKeyContextAny; - while (1) { - if (!strncmp(p0, "fullScreen", 10)) { - *context |= xpdfKeyContextFullScreen; - p0 += 10; - } else if (!strncmp(p0, "window", 6)) { - *context |= xpdfKeyContextWindow; - p0 += 6; - } else if (!strncmp(p0, "continuous", 10)) { - *context |= xpdfKeyContextContinuous; - p0 += 10; - } else if (!strncmp(p0, "singlePage", 10)) { - *context |= xpdfKeyContextSinglePage; - p0 += 10; - } else if (!strncmp(p0, "overLink", 8)) { - *context |= xpdfKeyContextOverLink; - p0 += 8; - } else if (!strncmp(p0, "offLink", 7)) { - *context |= xpdfKeyContextOffLink; - p0 += 7; - } else if (!strncmp(p0, "outline", 7)) { - *context |= xpdfKeyContextOutline; - p0 += 7; - } else if (!strncmp(p0, "mainWin", 7)) { - *context |= xpdfKeyContextMainWin; - p0 += 7; - } else if (!strncmp(p0, "scrLockOn", 9)) { - *context |= xpdfKeyContextScrLockOn; - p0 += 9; - } else if (!strncmp(p0, "scrLockOff", 10)) { - *context |= xpdfKeyContextScrLockOff; - p0 += 10; - } else { - error(-1, "Bad context in '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return gFalse; - } - if (!*p0) { - break; - } - if (*p0 != ',') { - error(-1, "Bad context in '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return gFalse; - } - ++p0; - } - } - - return gTrue; -} - -void GlobalParams::parseCommand(char *cmdName, GString **val, - GList *tokens, GString *fileName, int line) { - if (tokens->getLength() != 2) { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - if (*val) { - delete *val; - } - *val = ((GString *)tokens->get(1))->copy(); -} - -void GlobalParams::parseYesNo(char *cmdName, GBool *flag, - GList *tokens, GString *fileName, int line) { - GString *tok; - - if (tokens->getLength() != 2) { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - tok = (GString *)tokens->get(1); - if (!parseYesNo2(tok->getCString(), flag)) { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - } -} - -GBool GlobalParams::parseYesNo2(char *token, GBool *flag) { - if (!strcmp(token, "yes")) { - *flag = gTrue; - } else if (!strcmp(token, "no")) { - *flag = gFalse; - } else { - return gFalse; - } - return gTrue; -} - -void GlobalParams::parseInteger(char *cmdName, int *val, - GList *tokens, GString *fileName, int line) { - GString *tok; - int i; - - if (tokens->getLength() != 2) { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - tok = (GString *)tokens->get(1); - if (tok->getLength() == 0) { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - if (tok->getChar(0) == '-') { - i = 1; - } else { - i = 0; - } - for (; i < tok->getLength(); ++i) { - if (tok->getChar(i) < '0' || tok->getChar(i) > '9') { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - } - *val = atoi(tok->getCString()); -} - -void GlobalParams::parseFloat(char *cmdName, double *val, - GList *tokens, GString *fileName, int line) { - GString *tok; - int i; - - if (tokens->getLength() != 2) { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - tok = (GString *)tokens->get(1); - if (tok->getLength() == 0) { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - if (tok->getChar(0) == '-') { - i = 1; - } else { - i = 0; - } - for (; i < tok->getLength(); ++i) { - if (!((tok->getChar(i) >= '0' && tok->getChar(i) <= '9') || - tok->getChar(i) == '.')) { - error(-1, "Bad '%s' config file command (%s:%d)", - cmdName, fileName->getCString(), line); - return; - } - } - *val = atof(tok->getCString()); -} - -GlobalParams::~GlobalParams() { - GHashIter *iter; - GString *key; - GList *list; - - freeBuiltinFontTables(); - - delete macRomanReverseMap; - - delete baseDir; - delete nameToUnicode; - deleteGHash(cidToUnicodes, GString); - deleteGHash(unicodeToUnicodes, GString); - deleteGHash(residentUnicodeMaps, UnicodeMap); - deleteGHash(unicodeMaps, GString); - deleteGList(toUnicodeDirs, GString); - deleteGHash(displayFonts, DisplayFontParam); - deleteGHash(displayCIDFonts, DisplayFontParam); - deleteGHash(displayNamedCIDFonts, DisplayFontParam); -#ifdef WIN32 - if (winFontList) { - delete winFontList; - } -#endif - if (psFile) { - delete psFile; - } - deleteGHash(psFonts, PSFontParam); - deleteGList(psNamedFonts16, PSFontParam); - deleteGList(psFonts16, PSFontParam); - delete textEncoding; - deleteGList(fontDirs, GString); - delete initialZoom; - if (urlCommand) { - delete urlCommand; - } - if (movieCommand) { - delete movieCommand; - } - deleteGList(keyBindings, KeyBinding); - - cMapDirs->startIter(&iter); - while (cMapDirs->getNext(&iter, &key, (void **)&list)) { - deleteGList(list, GString); - } - delete cMapDirs; - - delete cidToUnicodeCache; - delete unicodeToUnicodeCache; - delete unicodeMapCache; - delete cMapCache; - -#ifdef ENABLE_PLUGINS - delete securityHandlers; - deleteGList(plugins, Plugin); -#endif - -#if MULTITHREADED - gDestroyMutex(&mutex); - gDestroyMutex(&unicodeMapCacheMutex); - gDestroyMutex(&cMapCacheMutex); -#endif -} - -//------------------------------------------------------------------------ - -void GlobalParams::setBaseDir(char *dir) { - delete baseDir; - baseDir = new GString(dir); -} - -void GlobalParams::setupBaseFonts(char *dir) { - GString *fontName; - GString *fileName; -#ifdef WIN32 - HMODULE shell32Lib; - BOOL (__stdcall *SHGetSpecialFolderPathFunc)(HWND hwndOwner, - LPTSTR lpszPath, - int nFolder, - BOOL fCreate); - char winFontDir[MAX_PATH]; -#endif - FILE *f; - DisplayFontParamKind kind; - DisplayFontParam *dfp; - int i, j; - -#ifdef WIN32 - // SHGetSpecialFolderPath isn't available in older versions of - // shell32.dll (Win95 and WinNT4), so do a dynamic load - winFontDir[0] = '\0'; - if ((shell32Lib = LoadLibrary("shell32.dll"))) { - if ((SHGetSpecialFolderPathFunc = - (BOOL (__stdcall *)(HWND hwndOwner, LPTSTR lpszPath, - int nFolder, BOOL fCreate)) - GetProcAddress(shell32Lib, "SHGetSpecialFolderPathA"))) { - if (!(*SHGetSpecialFolderPathFunc)(NULL, winFontDir, - CSIDL_FONTS, FALSE)) { - winFontDir[0] = '\0'; - } - } - } -#endif - for (i = 0; displayFontTab[i].name; ++i) { - fontName = new GString(displayFontTab[i].name); - if (getDisplayFont(fontName)) { - delete fontName; - continue; - } - fileName = NULL; - kind = displayFontT1; // make gcc happy - if (dir) { - fileName = appendToPath(new GString(dir), displayFontTab[i].t1FileName); - kind = displayFontT1; - if ((f = fopen(fileName->getCString(), "rb"))) { - fclose(f); - } else { - delete fileName; - fileName = NULL; - } - } -#ifdef WIN32 - if (!fileName && winFontDir[0] && displayFontTab[i].ttFileName) { - fileName = appendToPath(new GString(winFontDir), - displayFontTab[i].ttFileName); - kind = displayFontTT; - if ((f = fopen(fileName->getCString(), "rb"))) { - fclose(f); - } else { - delete fileName; - fileName = NULL; - } - } - // SHGetSpecialFolderPath(CSIDL_FONTS) doesn't work on Win 2k Server - // or Win2003 Server, or with older versions of shell32.dll, so check - // the "standard" directories - if (displayFontTab[i].ttFileName) { - for (j = 0; !fileName && displayFontDirs[j]; ++j) { - fileName = appendToPath(new GString(displayFontDirs[j]), - displayFontTab[i].ttFileName); - kind = displayFontTT; - if ((f = fopen(fileName->getCString(), "rb"))) { - fclose(f); - } else { - delete fileName; - fileName = NULL; - } - } - } -#else - for (j = 0; !fileName && displayFontDirs[j]; ++j) { - fileName = appendToPath(new GString(displayFontDirs[j]), - displayFontTab[i].t1FileName); - kind = displayFontT1; - if ((f = fopen(fileName->getCString(), "rb"))) { - fclose(f); - } else { - delete fileName; - fileName = NULL; - } - } -#endif - if (!fileName) { - error(-1, "No display font for '%s'", displayFontTab[i].name); - delete fontName; - continue; - } - dfp = new DisplayFontParam(fontName, kind); - dfp->t1.fileName = fileName; - globalParams->addDisplayFont(dfp); - } - -#ifdef WIN32 - if (winFontDir[0]) { - winFontList = new WinFontList(winFontDir); - } -#endif -} - -//------------------------------------------------------------------------ -// accessors -//------------------------------------------------------------------------ - -CharCode GlobalParams::getMacRomanCharCode(char *charName) { - // no need to lock - macRomanReverseMap is constant - return macRomanReverseMap->lookup(charName); -} - -GString *GlobalParams::getBaseDir() { - GString *s; - - lockGlobalParams; - s = baseDir->copy(); - unlockGlobalParams; - return s; -} - -Unicode GlobalParams::mapNameToUnicode(char *charName) { - // no need to lock - nameToUnicode is constant - return nameToUnicode->lookup(charName); -} - -UnicodeMap *GlobalParams::getResidentUnicodeMap(GString *encodingName) { - UnicodeMap *map; - - lockGlobalParams; - map = (UnicodeMap *)residentUnicodeMaps->lookup(encodingName); - unlockGlobalParams; - if (map) { - map->incRefCnt(); - } - return map; -} - -FILE *GlobalParams::getUnicodeMapFile(GString *encodingName) { - GString *fileName; - FILE *f; - - lockGlobalParams; - if ((fileName = (GString *)unicodeMaps->lookup(encodingName))) { - f = fopen(fileName->getCString(), "r"); - } else { - f = NULL; - } - unlockGlobalParams; - return f; -} - -FILE *GlobalParams::findCMapFile(GString *collection, GString *cMapName) { - GList *list; - GString *dir; - GString *fileName; - FILE *f; - int i; - - lockGlobalParams; - if (!(list = (GList *)cMapDirs->lookup(collection))) { - unlockGlobalParams; - return NULL; - } - for (i = 0; i < list->getLength(); ++i) { - dir = (GString *)list->get(i); - fileName = appendToPath(dir->copy(), cMapName->getCString()); - f = fopen(fileName->getCString(), "r"); - delete fileName; - if (f) { - unlockGlobalParams; - return f; - } - } - unlockGlobalParams; - return NULL; -} - -FILE *GlobalParams::findToUnicodeFile(GString *name) { - GString *dir, *fileName; - FILE *f; - int i; - - lockGlobalParams; - for (i = 0; i < toUnicodeDirs->getLength(); ++i) { - dir = (GString *)toUnicodeDirs->get(i); - fileName = appendToPath(dir->copy(), name->getCString()); - f = fopen(fileName->getCString(), "r"); - delete fileName; - if (f) { - unlockGlobalParams; - return f; - } - } - unlockGlobalParams; - return NULL; -} - -DisplayFontParam *GlobalParams::getDisplayFont(GString *fontName) { - DisplayFontParam *dfp; - - lockGlobalParams; - dfp = (DisplayFontParam *)displayFonts->lookup(fontName); -#ifdef WIN32 - if (!dfp && winFontList) { - dfp = winFontList->find(fontName); - } -#endif - unlockGlobalParams; - return dfp; -} - -DisplayFontParam *GlobalParams::getDisplayCIDFont(GString *fontName, - GString *collection) { - DisplayFontParam *dfp; - - lockGlobalParams; - if (!fontName || - !(dfp = (DisplayFontParam *)displayNamedCIDFonts->lookup(fontName))) { - dfp = (DisplayFontParam *)displayCIDFonts->lookup(collection); - } - unlockGlobalParams; - return dfp; -} - -GString *GlobalParams::getPSFile() { - GString *s; - - lockGlobalParams; - s = psFile ? psFile->copy() : (GString *)NULL; - unlockGlobalParams; - return s; -} - -int GlobalParams::getPSPaperWidth() { - int w; - - lockGlobalParams; - w = psPaperWidth; - unlockGlobalParams; - return w; -} - -int GlobalParams::getPSPaperHeight() { - int h; - - lockGlobalParams; - h = psPaperHeight; - unlockGlobalParams; - return h; -} - -void GlobalParams::getPSImageableArea(int *llx, int *lly, int *urx, int *ury) { - lockGlobalParams; - *llx = psImageableLLX; - *lly = psImageableLLY; - *urx = psImageableURX; - *ury = psImageableURY; - unlockGlobalParams; -} - -GBool GlobalParams::getPSCrop() { - GBool f; - - lockGlobalParams; - f = psCrop; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getPSExpandSmaller() { - GBool f; - - lockGlobalParams; - f = psExpandSmaller; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getPSShrinkLarger() { - GBool f; - - lockGlobalParams; - f = psShrinkLarger; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getPSCenter() { - GBool f; - - lockGlobalParams; - f = psCenter; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getPSDuplex() { - GBool d; - - lockGlobalParams; - d = psDuplex; - unlockGlobalParams; - return d; -} - -PSLevel GlobalParams::getPSLevel() { - PSLevel level; - - lockGlobalParams; - level = psLevel; - unlockGlobalParams; - return level; -} - -PSFontParam *GlobalParams::getPSFont(GString *fontName) { - PSFontParam *p; - - lockGlobalParams; - p = (PSFontParam *)psFonts->lookup(fontName); - unlockGlobalParams; - return p; -} - -PSFontParam *GlobalParams::getPSFont16(GString *fontName, - GString *collection, int wMode) { - PSFontParam *p; - int i; - - lockGlobalParams; - p = NULL; - if (fontName) { - for (i = 0; i < psNamedFonts16->getLength(); ++i) { - p = (PSFontParam *)psNamedFonts16->get(i); - if (!p->pdfFontName->cmp(fontName) && - p->wMode == wMode) { - break; - } - p = NULL; - } - } - if (!p && collection) { - for (i = 0; i < psFonts16->getLength(); ++i) { - p = (PSFontParam *)psFonts16->get(i); - if (!p->pdfFontName->cmp(collection) && - p->wMode == wMode) { - break; - } - p = NULL; - } - } - unlockGlobalParams; - return p; -} - -GBool GlobalParams::getPSEmbedType1() { - GBool e; - - lockGlobalParams; - e = psEmbedType1; - unlockGlobalParams; - return e; -} - -GBool GlobalParams::getPSEmbedTrueType() { - GBool e; - - lockGlobalParams; - e = psEmbedTrueType; - unlockGlobalParams; - return e; -} - -GBool GlobalParams::getPSEmbedCIDPostScript() { - GBool e; - - lockGlobalParams; - e = psEmbedCIDPostScript; - unlockGlobalParams; - return e; -} - -GBool GlobalParams::getPSEmbedCIDTrueType() { - GBool e; - - lockGlobalParams; - e = psEmbedCIDTrueType; - unlockGlobalParams; - return e; -} - -GBool GlobalParams::getPSPreload() { - GBool preload; - - lockGlobalParams; - preload = psPreload; - unlockGlobalParams; - return preload; -} - -GBool GlobalParams::getPSOPI() { - GBool opi; - - lockGlobalParams; - opi = psOPI; - unlockGlobalParams; - return opi; -} - -GBool GlobalParams::getPSASCIIHex() { - GBool ah; - - lockGlobalParams; - ah = psASCIIHex; - unlockGlobalParams; - return ah; -} - -GString *GlobalParams::getTextEncodingName() { - GString *s; - - lockGlobalParams; - s = textEncoding->copy(); - unlockGlobalParams; - return s; -} - -EndOfLineKind GlobalParams::getTextEOL() { - EndOfLineKind eol; - - lockGlobalParams; - eol = textEOL; - unlockGlobalParams; - return eol; -} - -GBool GlobalParams::getTextPageBreaks() { - GBool pageBreaks; - - lockGlobalParams; - pageBreaks = textPageBreaks; - unlockGlobalParams; - return pageBreaks; -} - -GBool GlobalParams::getTextKeepTinyChars() { - GBool tiny; - - lockGlobalParams; - tiny = textKeepTinyChars; - unlockGlobalParams; - return tiny; -} - -GString *GlobalParams::findFontFile(GString *fontName, char **exts) { - GString *dir, *fileName; - char **ext; - FILE *f; - int i; - - lockGlobalParams; - for (i = 0; i < fontDirs->getLength(); ++i) { - dir = (GString *)fontDirs->get(i); - for (ext = exts; *ext; ++ext) { - fileName = appendToPath(dir->copy(), fontName->getCString()); - fileName->append(*ext); - if ((f = fopen(fileName->getCString(), "rb"))) { - fclose(f); - unlockGlobalParams; - return fileName; - } - delete fileName; - } - } - unlockGlobalParams; - return NULL; -} - -GString *GlobalParams::getInitialZoom() { - GString *s; - - lockGlobalParams; - s = initialZoom->copy(); - unlockGlobalParams; - return s; -} - -GBool GlobalParams::getContinuousView() { - GBool f; - - lockGlobalParams; - f = continuousView; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getEnableT1lib() { - GBool f; - - lockGlobalParams; - f = enableT1lib; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getEnableFreeType() { - GBool f; - - lockGlobalParams; - f = enableFreeType; - unlockGlobalParams; - return f; -} - - -GBool GlobalParams::getAntialias() { - GBool f; - - lockGlobalParams; - f = antialias; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getVectorAntialias() { - GBool f; - - lockGlobalParams; - f = vectorAntialias; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getStrokeAdjust() { - GBool f; - - lockGlobalParams; - f = strokeAdjust; - unlockGlobalParams; - return f; -} - -ScreenType GlobalParams::getScreenType() { - ScreenType t; - - lockGlobalParams; - t = screenType; - unlockGlobalParams; - return t; -} - -int GlobalParams::getScreenSize() { - int size; - - lockGlobalParams; - size = screenSize; - unlockGlobalParams; - return size; -} - -int GlobalParams::getScreenDotRadius() { - int r; - - lockGlobalParams; - r = screenDotRadius; - unlockGlobalParams; - return r; -} - -double GlobalParams::getScreenGamma() { - double gamma; - - lockGlobalParams; - gamma = screenGamma; - unlockGlobalParams; - return gamma; -} - -double GlobalParams::getScreenBlackThreshold() { - double thresh; - - lockGlobalParams; - thresh = screenBlackThreshold; - unlockGlobalParams; - return thresh; -} - -double GlobalParams::getScreenWhiteThreshold() { - double thresh; - - lockGlobalParams; - thresh = screenWhiteThreshold; - unlockGlobalParams; - return thresh; -} - -GBool GlobalParams::getMapNumericCharNames() { - GBool map; - - lockGlobalParams; - map = mapNumericCharNames; - unlockGlobalParams; - return map; -} - -GBool GlobalParams::getMapUnknownCharNames() { - GBool map; - - lockGlobalParams; - map = mapUnknownCharNames; - unlockGlobalParams; - return map; -} - -GList *GlobalParams::getKeyBinding(int code, int mods, int context) { - KeyBinding *binding; - GList *cmds; - int modMask; - int i, j; - - lockGlobalParams; - cmds = NULL; - // for ASCII chars, ignore the shift modifier - modMask = code <= 0xff ? ~xpdfKeyModShift : ~0; - for (i = 0; i < keyBindings->getLength(); ++i) { - binding = (KeyBinding *)keyBindings->get(i); - if (binding->code == code && - (binding->mods & modMask) == (mods & modMask) && - (~binding->context | context) == ~0) { - cmds = new GList(); - for (j = 0; j < binding->cmds->getLength(); ++j) { - cmds->append(((GString *)binding->cmds->get(j))->copy()); - } - break; - } - } - unlockGlobalParams; - return cmds; -} - -GBool GlobalParams::getPrintCommands() { - GBool p; - - lockGlobalParams; - p = printCommands; - unlockGlobalParams; - return p; -} - -GBool GlobalParams::getErrQuiet() { - // no locking -- this function may get called from inside a locked - // section - return errQuiet; -} - -CharCodeToUnicode *GlobalParams::getCIDToUnicode(GString *collection) { - GString *fileName; - CharCodeToUnicode *ctu; - - lockGlobalParams; - if (!(ctu = cidToUnicodeCache->getCharCodeToUnicode(collection))) { - if ((fileName = (GString *)cidToUnicodes->lookup(collection)) && - (ctu = CharCodeToUnicode::parseCIDToUnicode(fileName, collection))) { - cidToUnicodeCache->add(ctu); - } - } - unlockGlobalParams; - return ctu; -} - -CharCodeToUnicode *GlobalParams::getUnicodeToUnicode(GString *fontName) { - CharCodeToUnicode *ctu; - GHashIter *iter; - GString *fontPattern, *fileName; - - lockGlobalParams; - fileName = NULL; - unicodeToUnicodes->startIter(&iter); - while (unicodeToUnicodes->getNext(&iter, &fontPattern, (void **)&fileName)) { - if (strstr(fontName->getCString(), fontPattern->getCString())) { - unicodeToUnicodes->killIter(&iter); - break; - } - fileName = NULL; - } - if (fileName) { - if (!(ctu = unicodeToUnicodeCache->getCharCodeToUnicode(fileName))) { - if ((ctu = CharCodeToUnicode::parseUnicodeToUnicode(fileName))) { - unicodeToUnicodeCache->add(ctu); - } - } - } else { - ctu = NULL; - } - unlockGlobalParams; - return ctu; -} - -UnicodeMap *GlobalParams::getUnicodeMap(GString *encodingName) { - return getUnicodeMap2(encodingName); -} - -UnicodeMap *GlobalParams::getUnicodeMap2(GString *encodingName) { - UnicodeMap *map; - - if (!(map = getResidentUnicodeMap(encodingName))) { - lockUnicodeMapCache; - map = unicodeMapCache->getUnicodeMap(encodingName); - unlockUnicodeMapCache; - } - return map; -} - -CMap *GlobalParams::getCMap(GString *collection, GString *cMapName) { - CMap *cMap; - - lockCMapCache; - cMap = cMapCache->getCMap(collection, cMapName); - unlockCMapCache; - return cMap; -} - -UnicodeMap *GlobalParams::getTextEncoding() { - return getUnicodeMap2(textEncoding); -} - -//------------------------------------------------------------------------ -// functions to set parameters -//------------------------------------------------------------------------ - -void GlobalParams::addDisplayFont(DisplayFontParam *param) { - DisplayFontParam *old; - - lockGlobalParams; - if ((old = (DisplayFontParam *)displayFonts->remove(param->name))) { - delete old; - } - displayFonts->add(param->name, param); - unlockGlobalParams; -} - -void GlobalParams::setPSFile(char *file) { - lockGlobalParams; - if (psFile) { - delete psFile; - } - psFile = new GString(file); - unlockGlobalParams; -} - -GBool GlobalParams::setPSPaperSize(char *size) { - lockGlobalParams; - if (!strcmp(size, "match")) { - psPaperWidth = psPaperHeight = -1; - } else if (!strcmp(size, "letter")) { - psPaperWidth = 612; - psPaperHeight = 792; - } else if (!strcmp(size, "legal")) { - psPaperWidth = 612; - psPaperHeight = 1008; - } else if (!strcmp(size, "A4")) { - psPaperWidth = 595; - psPaperHeight = 842; - } else if (!strcmp(size, "A3")) { - psPaperWidth = 842; - psPaperHeight = 1190; - } else { - unlockGlobalParams; - return gFalse; - } - psImageableLLX = psImageableLLY = 0; - psImageableURX = psPaperWidth; - psImageableURY = psPaperHeight; - unlockGlobalParams; - return gTrue; -} - -void GlobalParams::setPSPaperWidth(int width) { - lockGlobalParams; - psPaperWidth = width; - psImageableLLX = 0; - psImageableURX = psPaperWidth; - unlockGlobalParams; -} - -void GlobalParams::setPSPaperHeight(int height) { - lockGlobalParams; - psPaperHeight = height; - psImageableLLY = 0; - psImageableURY = psPaperHeight; - unlockGlobalParams; -} - -void GlobalParams::setPSImageableArea(int llx, int lly, int urx, int ury) { - lockGlobalParams; - psImageableLLX = llx; - psImageableLLY = lly; - psImageableURX = urx; - psImageableURY = ury; - unlockGlobalParams; -} - -void GlobalParams::setPSCrop(GBool crop) { - lockGlobalParams; - psCrop = crop; - unlockGlobalParams; -} - -void GlobalParams::setPSExpandSmaller(GBool expand) { - lockGlobalParams; - psExpandSmaller = expand; - unlockGlobalParams; -} - -void GlobalParams::setPSShrinkLarger(GBool shrink) { - lockGlobalParams; - psShrinkLarger = shrink; - unlockGlobalParams; -} - -void GlobalParams::setPSCenter(GBool center) { - lockGlobalParams; - psCenter = center; - unlockGlobalParams; -} - -void GlobalParams::setPSDuplex(GBool duplex) { - lockGlobalParams; - psDuplex = duplex; - unlockGlobalParams; -} - -void GlobalParams::setPSLevel(PSLevel level) { - lockGlobalParams; - psLevel = level; - unlockGlobalParams; -} - -void GlobalParams::setPSEmbedType1(GBool embed) { - lockGlobalParams; - psEmbedType1 = embed; - unlockGlobalParams; -} - -void GlobalParams::setPSEmbedTrueType(GBool embed) { - lockGlobalParams; - psEmbedTrueType = embed; - unlockGlobalParams; -} - -void GlobalParams::setPSEmbedCIDPostScript(GBool embed) { - lockGlobalParams; - psEmbedCIDPostScript = embed; - unlockGlobalParams; -} - -void GlobalParams::setPSEmbedCIDTrueType(GBool embed) { - lockGlobalParams; - psEmbedCIDTrueType = embed; - unlockGlobalParams; -} - -void GlobalParams::setPSPreload(GBool preload) { - lockGlobalParams; - psPreload = preload; - unlockGlobalParams; -} - -void GlobalParams::setPSOPI(GBool opi) { - lockGlobalParams; - psOPI = opi; - unlockGlobalParams; -} - -void GlobalParams::setPSASCIIHex(GBool hex) { - lockGlobalParams; - psASCIIHex = hex; - unlockGlobalParams; -} - -void GlobalParams::setTextEncoding(char *encodingName) { - lockGlobalParams; - delete textEncoding; - textEncoding = new GString(encodingName); - unlockGlobalParams; -} - -GBool GlobalParams::setTextEOL(char *s) { - lockGlobalParams; - if (!strcmp(s, "unix")) { - textEOL = eolUnix; - } else if (!strcmp(s, "dos")) { - textEOL = eolDOS; - } else if (!strcmp(s, "mac")) { - textEOL = eolMac; - } else { - unlockGlobalParams; - return gFalse; - } - unlockGlobalParams; - return gTrue; -} - -void GlobalParams::setTextPageBreaks(GBool pageBreaks) { - lockGlobalParams; - textPageBreaks = pageBreaks; - unlockGlobalParams; -} - -void GlobalParams::setTextKeepTinyChars(GBool keep) { - lockGlobalParams; - textKeepTinyChars = keep; - unlockGlobalParams; -} - -void GlobalParams::setInitialZoom(char *s) { - lockGlobalParams; - delete initialZoom; - initialZoom = new GString(s); - unlockGlobalParams; -} - -void GlobalParams::setContinuousView(GBool cont) { - lockGlobalParams; - continuousView = cont; - unlockGlobalParams; -} - -GBool GlobalParams::setEnableT1lib(char *s) { - GBool ok; - - lockGlobalParams; - ok = parseYesNo2(s, &enableT1lib); - unlockGlobalParams; - return ok; -} - -GBool GlobalParams::setEnableFreeType(char *s) { - GBool ok; - - lockGlobalParams; - ok = parseYesNo2(s, &enableFreeType); - unlockGlobalParams; - return ok; -} - - -GBool GlobalParams::setAntialias(char *s) { - GBool ok; - - lockGlobalParams; - ok = parseYesNo2(s, &antialias); - unlockGlobalParams; - return ok; -} - -GBool GlobalParams::setVectorAntialias(char *s) { - GBool ok; - - lockGlobalParams; - ok = parseYesNo2(s, &vectorAntialias); - unlockGlobalParams; - return ok; -} - -void GlobalParams::setScreenType(ScreenType t) { - lockGlobalParams; - screenType = t; - unlockGlobalParams; -} - -void GlobalParams::setScreenSize(int size) { - lockGlobalParams; - screenSize = size; - unlockGlobalParams; -} - -void GlobalParams::setScreenDotRadius(int r) { - lockGlobalParams; - screenDotRadius = r; - unlockGlobalParams; -} - -void GlobalParams::setScreenGamma(double gamma) { - lockGlobalParams; - screenGamma = gamma; - unlockGlobalParams; -} - -void GlobalParams::setScreenBlackThreshold(double thresh) { - lockGlobalParams; - screenBlackThreshold = thresh; - unlockGlobalParams; -} - -void GlobalParams::setScreenWhiteThreshold(double thresh) { - lockGlobalParams; - screenWhiteThreshold = thresh; - unlockGlobalParams; -} - -void GlobalParams::setMapNumericCharNames(GBool map) { - lockGlobalParams; - mapNumericCharNames = map; - unlockGlobalParams; -} - -void GlobalParams::setMapUnknownCharNames(GBool map) { - lockGlobalParams; - mapUnknownCharNames = map; - unlockGlobalParams; -} - -void GlobalParams::setPrintCommands(GBool printCommandsA) { - lockGlobalParams; - printCommands = printCommandsA; - unlockGlobalParams; -} - -void GlobalParams::setErrQuiet(GBool errQuietA) { - lockGlobalParams; - errQuiet = errQuietA; - unlockGlobalParams; -} - -void GlobalParams::addSecurityHandler(XpdfSecurityHandler *handler) { -#ifdef ENABLE_PLUGINS - lockGlobalParams; - securityHandlers->append(handler); - unlockGlobalParams; -#endif -} - -XpdfSecurityHandler *GlobalParams::getSecurityHandler(char *name) { -#ifdef ENABLE_PLUGINS - XpdfSecurityHandler *hdlr; - int i; - - lockGlobalParams; - for (i = 0; i < securityHandlers->getLength(); ++i) { - hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); - if (!strcasecmp(hdlr->name, name)) { - unlockGlobalParams; - return hdlr; - } - } - unlockGlobalParams; - - if (!loadPlugin("security", name)) { - return NULL; - } - - lockGlobalParams; - for (i = 0; i < securityHandlers->getLength(); ++i) { - hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); - if (!strcmp(hdlr->name, name)) { - unlockGlobalParams; - return hdlr; - } - } - unlockGlobalParams; -#endif - - return NULL; -} - -#ifdef ENABLE_PLUGINS -//------------------------------------------------------------------------ -// plugins -//------------------------------------------------------------------------ - -GBool GlobalParams::loadPlugin(char *type, char *name) { - Plugin *plugin; - - if (!(plugin = Plugin::load(type, name))) { - return gFalse; - } - lockGlobalParams; - plugins->append(plugin); - unlockGlobalParams; - return gTrue; -} - -#endif // ENABLE_PLUGINS diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.h deleted file mode 100644 index 14bce4429..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/GlobalParams.h +++ /dev/null @@ -1,467 +0,0 @@ -//======================================================================== -// -// GlobalParams.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef GLOBALPARAMS_H -#define GLOBALPARAMS_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include "gtypes.h" -#include "CharTypes.h" - -#if MULTITHREADED -#include "GMutex.h" -#endif - -class GString; -class GList; -class GHash; -class NameToCharCode; -class CharCodeToUnicode; -class CharCodeToUnicodeCache; -class UnicodeMap; -class UnicodeMapCache; -class CMap; -class CMapCache; -struct XpdfSecurityHandler; -class GlobalParams; -#ifdef WIN32 -class WinFontList; -#endif - -//------------------------------------------------------------------------ - -// The global parameters object. -extern GlobalParams *globalParams; - -//------------------------------------------------------------------------ - -enum DisplayFontParamKind { - displayFontT1, - displayFontTT -}; - -struct DisplayFontParamT1 { - GString *fileName; -}; - -struct DisplayFontParamTT { - GString *fileName; -}; - -class DisplayFontParam { -public: - - GString *name; // font name for 8-bit fonts and named - // CID fonts; collection name for - // generic CID fonts - DisplayFontParamKind kind; - union { - DisplayFontParamT1 t1; - DisplayFontParamTT tt; - }; - - DisplayFontParam(GString *nameA, DisplayFontParamKind kindA); - virtual ~DisplayFontParam(); -}; - -//------------------------------------------------------------------------ - -class PSFontParam { -public: - - GString *pdfFontName; // PDF font name for 8-bit fonts and - // named 16-bit fonts; char collection - // name for generic 16-bit fonts - int wMode; // writing mode (0=horiz, 1=vert) for - // 16-bit fonts - GString *psFontName; // PostScript font name - GString *encoding; // encoding, for 16-bit fonts only - - PSFontParam(GString *pdfFontNameA, int wModeA, - GString *psFontNameA, GString *encodingA); - ~PSFontParam(); -}; - -//------------------------------------------------------------------------ - -enum PSLevel { - psLevel1, - psLevel1Sep, - psLevel2, - psLevel2Sep, - psLevel3, - psLevel3Sep -}; - -//------------------------------------------------------------------------ - -enum EndOfLineKind { - eolUnix, // LF - eolDOS, // CR+LF - eolMac // CR -}; - -//------------------------------------------------------------------------ - -enum ScreenType { - screenUnset, - screenDispersed, - screenClustered, - screenStochasticClustered -}; - -//------------------------------------------------------------------------ - -class KeyBinding { -public: - - int code; // 0x20 .. 0xfe = ASCII, - // >=0x10000 = special keys, mouse buttons, - // etc. (xpdfKeyCode* symbols) - int mods; // modifiers (xpdfKeyMod* symbols, or-ed - // together) - int context; // context (xpdfKeyContext* symbols, or-ed - // together) - GList *cmds; // list of commands [GString] - - KeyBinding(int codeA, int modsA, int contextA, char *cmd0); - KeyBinding(int codeA, int modsA, int contextA, char *cmd0, char *cmd1); - KeyBinding(int codeA, int modsA, int contextA, GList *cmdsA); - ~KeyBinding(); -}; - -#define xpdfKeyCodeTab 0x1000 -#define xpdfKeyCodeReturn 0x1001 -#define xpdfKeyCodeEnter 0x1002 -#define xpdfKeyCodeBackspace 0x1003 -#define xpdfKeyCodeInsert 0x1004 -#define xpdfKeyCodeDelete 0x1005 -#define xpdfKeyCodeHome 0x1006 -#define xpdfKeyCodeEnd 0x1007 -#define xpdfKeyCodePgUp 0x1008 -#define xpdfKeyCodePgDn 0x1009 -#define xpdfKeyCodeLeft 0x100a -#define xpdfKeyCodeRight 0x100b -#define xpdfKeyCodeUp 0x100c -#define xpdfKeyCodeDown 0x100d -#define xpdfKeyCodeF1 0x1100 -#define xpdfKeyCodeF35 0x1122 -#define xpdfKeyCodeMousePress1 0x2001 -#define xpdfKeyCodeMousePress2 0x2002 -#define xpdfKeyCodeMousePress3 0x2003 -#define xpdfKeyCodeMousePress4 0x2004 -#define xpdfKeyCodeMousePress5 0x2005 -#define xpdfKeyCodeMousePress6 0x2006 -#define xpdfKeyCodeMousePress7 0x2007 -#define xpdfKeyCodeMouseRelease1 0x2101 -#define xpdfKeyCodeMouseRelease2 0x2102 -#define xpdfKeyCodeMouseRelease3 0x2103 -#define xpdfKeyCodeMouseRelease4 0x2104 -#define xpdfKeyCodeMouseRelease5 0x2105 -#define xpdfKeyCodeMouseRelease6 0x2106 -#define xpdfKeyCodeMouseRelease7 0x2107 -#define xpdfKeyModNone 0 -#define xpdfKeyModShift (1 << 0) -#define xpdfKeyModCtrl (1 << 1) -#define xpdfKeyModAlt (1 << 2) -#define xpdfKeyContextAny 0 -#define xpdfKeyContextFullScreen (1 << 0) -#define xpdfKeyContextWindow (2 << 0) -#define xpdfKeyContextContinuous (1 << 2) -#define xpdfKeyContextSinglePage (2 << 2) -#define xpdfKeyContextOverLink (1 << 4) -#define xpdfKeyContextOffLink (2 << 4) -#define xpdfKeyContextOutline (1 << 6) -#define xpdfKeyContextMainWin (2 << 6) -#define xpdfKeyContextScrLockOn (1 << 8) -#define xpdfKeyContextScrLockOff (2 << 8) - -//------------------------------------------------------------------------ - -class GlobalParams { -public: - - // Initialize the global parameters by attempting to read a config - // file. - GlobalParams(char *cfgFileName); - - virtual ~GlobalParams(); - - void setBaseDir(char *dir); - void setupBaseFonts(char *dir); - - void parseLine(char *buf, GString *fileName, int line); - - //----- accessors - - CharCode getMacRomanCharCode(char *charName); - - GString *getBaseDir(); - Unicode mapNameToUnicode(char *charName); - UnicodeMap *getResidentUnicodeMap(GString *encodingName); - FILE *getUnicodeMapFile(GString *encodingName); - FILE *findCMapFile(GString *collection, GString *cMapName); - FILE *findToUnicodeFile(GString *name); - virtual DisplayFontParam *getDisplayFont(GString *fontName); - virtual DisplayFontParam *getDisplayCIDFont(GString *fontName, GString *collection); - GString *getPSFile(); - int getPSPaperWidth(); - int getPSPaperHeight(); - void getPSImageableArea(int *llx, int *lly, int *urx, int *ury); - GBool getPSDuplex(); - GBool getPSCrop(); - GBool getPSExpandSmaller(); - GBool getPSShrinkLarger(); - GBool getPSCenter(); - PSLevel getPSLevel(); - PSFontParam *getPSFont(GString *fontName); - PSFontParam *getPSFont16(GString *fontName, GString *collection, int wMode); - GBool getPSEmbedType1(); - GBool getPSEmbedTrueType(); - GBool getPSEmbedCIDPostScript(); - GBool getPSEmbedCIDTrueType(); - GBool getPSPreload(); - GBool getPSOPI(); - GBool getPSASCIIHex(); - GString *getTextEncodingName(); - EndOfLineKind getTextEOL(); - GBool getTextPageBreaks(); - GBool getTextKeepTinyChars(); - GString *findFontFile(GString *fontName, char **exts); - GString *getInitialZoom(); - GBool getContinuousView(); - GBool getEnableT1lib(); - GBool getEnableFreeType(); - GBool getAntialias(); - GBool getVectorAntialias(); - GBool getStrokeAdjust(); - ScreenType getScreenType(); - int getScreenSize(); - int getScreenDotRadius(); - double getScreenGamma(); - double getScreenBlackThreshold(); - double getScreenWhiteThreshold(); - GString *getURLCommand() { return urlCommand; } - GString *getMovieCommand() { return movieCommand; } - GBool getMapNumericCharNames(); - GBool getMapUnknownCharNames(); - GList *getKeyBinding(int code, int mods, int context); - GBool getPrintCommands(); - GBool getErrQuiet(); - - CharCodeToUnicode *getCIDToUnicode(GString *collection); - CharCodeToUnicode *getUnicodeToUnicode(GString *fontName); - UnicodeMap *getUnicodeMap(GString *encodingName); - CMap *getCMap(GString *collection, GString *cMapName); - UnicodeMap *getTextEncoding(); - - //----- functions to set parameters - - void addDisplayFont(DisplayFontParam *param); - void setPSFile(char *file); - GBool setPSPaperSize(char *size); - void setPSPaperWidth(int width); - void setPSPaperHeight(int height); - void setPSImageableArea(int llx, int lly, int urx, int ury); - void setPSDuplex(GBool duplex); - void setPSCrop(GBool crop); - void setPSExpandSmaller(GBool expand); - void setPSShrinkLarger(GBool shrink); - void setPSCenter(GBool center); - void setPSLevel(PSLevel level); - void setPSEmbedType1(GBool embed); - void setPSEmbedTrueType(GBool embed); - void setPSEmbedCIDPostScript(GBool embed); - void setPSEmbedCIDTrueType(GBool embed); - void setPSPreload(GBool preload); - void setPSOPI(GBool opi); - void setPSASCIIHex(GBool hex); - void setTextEncoding(char *encodingName); - GBool setTextEOL(char *s); - void setTextPageBreaks(GBool pageBreaks); - void setTextKeepTinyChars(GBool keep); - void setInitialZoom(char *s); - void setContinuousView(GBool cont); - GBool setEnableT1lib(char *s); - GBool setEnableFreeType(char *s); - GBool setAntialias(char *s); - GBool setVectorAntialias(char *s); - void setScreenType(ScreenType t); - void setScreenSize(int size); - void setScreenDotRadius(int r); - void setScreenGamma(double gamma); - void setScreenBlackThreshold(double thresh); - void setScreenWhiteThreshold(double thresh); - void setMapNumericCharNames(GBool map); - void setMapUnknownCharNames(GBool map); - void setPrintCommands(GBool printCommandsA); - void setErrQuiet(GBool errQuietA); - - //----- security handlers - - void addSecurityHandler(XpdfSecurityHandler *handler); - XpdfSecurityHandler *getSecurityHandler(char *name); - -private: - - void createDefaultKeyBindings(); -public: void parseFile(GString *fileName, FILE *f); private: - void parseNameToUnicode(GList *tokens, GString *fileName, int line); - void parseCIDToUnicode(GList *tokens, GString *fileName, int line); - void parseUnicodeToUnicode(GList *tokens, GString *fileName, int line); - void parseUnicodeMap(GList *tokens, GString *fileName, int line); - void parseCMapDir(GList *tokens, GString *fileName, int line); - void parseToUnicodeDir(GList *tokens, GString *fileName, int line); - void parseDisplayFont(GList *tokens, GHash *fontHash, - DisplayFontParamKind kind, - GString *fileName, int line); - void parsePSFile(GList *tokens, GString *fileName, int line); - void parsePSPaperSize(GList *tokens, GString *fileName, int line); - void parsePSImageableArea(GList *tokens, GString *fileName, int line); - void parsePSLevel(GList *tokens, GString *fileName, int line); - void parsePSFont(GList *tokens, GString *fileName, int line); - void parsePSFont16(char *cmdName, GList *fontList, - GList *tokens, GString *fileName, int line); - void parseTextEncoding(GList *tokens, GString *fileName, int line); - void parseTextEOL(GList *tokens, GString *fileName, int line); - void parseFontDir(GList *tokens, GString *fileName, int line); - void parseInitialZoom(GList *tokens, GString *fileName, int line); - void parseScreenType(GList *tokens, GString *fileName, int line); - void parseBind(GList *tokens, GString *fileName, int line); - void parseUnbind(GList *tokens, GString *fileName, int line); - GBool parseKey(GString *modKeyStr, GString *contextStr, - int *code, int *mods, int *context, - char *cmdName, - GList *tokens, GString *fileName, int line); - void parseCommand(char *cmdName, GString **val, - GList *tokens, GString *fileName, int line); - void parseYesNo(char *cmdName, GBool *flag, - GList *tokens, GString *fileName, int line); - GBool parseYesNo2(char *token, GBool *flag); - void parseInteger(char *cmdName, int *val, - GList *tokens, GString *fileName, int line); - void parseFloat(char *cmdName, double *val, - GList *tokens, GString *fileName, int line); - UnicodeMap *getUnicodeMap2(GString *encodingName); -#ifdef ENABLE_PLUGINS - GBool loadPlugin(char *type, char *name); -#endif - - //----- config file base path - - GString*path; - - //----- static tables - - NameToCharCode * // mapping from char name to - macRomanReverseMap; // MacRomanEncoding index - - //----- user-modifiable settings - - GString *baseDir; // base directory - for plugins, etc. - NameToCharCode * // mapping from char name to Unicode - nameToUnicode; - GHash *cidToUnicodes; // files for mappings from char collections - // to Unicode, indexed by collection name - // [GString] - GHash *unicodeToUnicodes; // files for Unicode-to-Unicode mappings, - // indexed by font name pattern [GString] - GHash *residentUnicodeMaps; // mappings from Unicode to char codes, - // indexed by encoding name [UnicodeMap] - GHash *unicodeMaps; // files for mappings from Unicode to char - // codes, indexed by encoding name [GString] - GHash *cMapDirs; // list of CMap dirs, indexed by collection - // name [GList[GString]] - GList *toUnicodeDirs; // list of ToUnicode CMap dirs [GString] - GHash *displayFonts; // display font info, indexed by font name - // [DisplayFontParam] -#ifdef WIN32 - WinFontList *winFontList; // system TrueType fonts -#endif - GHash *displayCIDFonts; // display CID font info, indexed by - // collection [DisplayFontParam] - GHash *displayNamedCIDFonts; // display CID font info, indexed by - // font name [DisplayFontParam] - GString *psFile; // PostScript file or command (for xpdf) - int psPaperWidth; // paper size, in PostScript points, for - int psPaperHeight; // PostScript output - int psImageableLLX, // imageable area, in PostScript points, - psImageableLLY, // for PostScript output - psImageableURX, - psImageableURY; - GBool psCrop; // crop PS output to CropBox - GBool psExpandSmaller; // expand smaller pages to fill paper - GBool psShrinkLarger; // shrink larger pages to fit paper - GBool psCenter; // center pages on the paper - GBool psDuplex; // enable duplexing in PostScript? - PSLevel psLevel; // PostScript level to generate - GHash *psFonts; // PostScript font info, indexed by PDF - // font name [PSFontParam] - GList *psNamedFonts16; // named 16-bit fonts [PSFontParam] - GList *psFonts16; // generic 16-bit fonts [PSFontParam] - GBool psEmbedType1; // embed Type 1 fonts? - GBool psEmbedTrueType; // embed TrueType fonts? - GBool psEmbedCIDPostScript; // embed CID PostScript fonts? - GBool psEmbedCIDTrueType; // embed CID TrueType fonts? - GBool psPreload; // preload PostScript images and forms into - // memory - GBool psOPI; // generate PostScript OPI comments? - GBool psASCIIHex; // use ASCIIHex instead of ASCII85? - GString *textEncoding; // encoding (unicodeMap) to use for text - // output - EndOfLineKind textEOL; // type of EOL marker to use for text - // output - GBool textPageBreaks; // insert end-of-page markers? - GBool textKeepTinyChars; // keep all characters in text output - GList *fontDirs; // list of font dirs [GString] - GString *initialZoom; // initial zoom level - GBool continuousView; // continuous view mode - GBool enableT1lib; // t1lib enable flag - GBool enableFreeType; // FreeType enable flag - GBool antialias; // font anti-aliasing enable flag - GBool vectorAntialias; // vector anti-aliasing enable flag - GBool strokeAdjust; // stroke adjustment enable flag - ScreenType screenType; // halftone screen type - int screenSize; // screen matrix size - int screenDotRadius; // screen dot radius - double screenGamma; // screen gamma correction - double screenBlackThreshold; // screen black clamping threshold - double screenWhiteThreshold; // screen white clamping threshold - GString *urlCommand; // command executed for URL links - GString *movieCommand; // command executed for movie annotations - GBool mapNumericCharNames; // map numeric char names (from font subsets)? - GBool mapUnknownCharNames; // map unknown char names? - GList *keyBindings; // key & mouse button bindings [KeyBinding] - GBool printCommands; // print the drawing commands - GBool errQuiet; // suppress error messages? - - CharCodeToUnicodeCache *cidToUnicodeCache; - CharCodeToUnicodeCache *unicodeToUnicodeCache; - UnicodeMapCache *unicodeMapCache; - CMapCache *cMapCache; - -#ifdef ENABLE_PLUGINS - GList *plugins; // list of plugins [Plugin] - GList *securityHandlers; // list of loaded security handlers - // [XpdfSecurityHandler] -#endif - -#if MULTITHREADED - GMutex mutex; - GMutex unicodeMapCacheMutex; - GMutex cMapCacheMutex; -#endif -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.cc deleted file mode 100644 index 195b73e1c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.cc +++ /dev/null @@ -1,322 +0,0 @@ -//======================================================================== -// -// JArithmeticDecoder.cc -// -// Copyright 2002-2004 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "Object.h" -#include "Stream.h" -#include "JArithmeticDecoder.h" - -//------------------------------------------------------------------------ -// JArithmeticDecoderStates -//------------------------------------------------------------------------ - -JArithmeticDecoderStats::JArithmeticDecoderStats(int contextSizeA) { - contextSize = contextSizeA; - cxTab = (Guchar *)gmallocn(contextSize, sizeof(Guchar)); - reset(); -} - -JArithmeticDecoderStats::~JArithmeticDecoderStats() { - gfree(cxTab); -} - -JArithmeticDecoderStats *JArithmeticDecoderStats::copy() { - JArithmeticDecoderStats *stats; - - stats = new JArithmeticDecoderStats(contextSize); - memcpy(stats->cxTab, cxTab, contextSize); - return stats; -} - -void JArithmeticDecoderStats::reset() { - memset(cxTab, 0, contextSize); -} - -void JArithmeticDecoderStats::copyFrom(JArithmeticDecoderStats *stats) { - memcpy(cxTab, stats->cxTab, contextSize); -} - -void JArithmeticDecoderStats::setEntry(Guint cx, int i, int mps) { - cxTab[cx] = (i << 1) + mps; -} - -//------------------------------------------------------------------------ -// JArithmeticDecoder -//------------------------------------------------------------------------ - -Guint JArithmeticDecoder::qeTab[47] = { - 0x56010000, 0x34010000, 0x18010000, 0x0AC10000, - 0x05210000, 0x02210000, 0x56010000, 0x54010000, - 0x48010000, 0x38010000, 0x30010000, 0x24010000, - 0x1C010000, 0x16010000, 0x56010000, 0x54010000, - 0x51010000, 0x48010000, 0x38010000, 0x34010000, - 0x30010000, 0x28010000, 0x24010000, 0x22010000, - 0x1C010000, 0x18010000, 0x16010000, 0x14010000, - 0x12010000, 0x11010000, 0x0AC10000, 0x09C10000, - 0x08A10000, 0x05210000, 0x04410000, 0x02A10000, - 0x02210000, 0x01410000, 0x01110000, 0x00850000, - 0x00490000, 0x00250000, 0x00150000, 0x00090000, - 0x00050000, 0x00010000, 0x56010000 -}; - -int JArithmeticDecoder::nmpsTab[47] = { - 1, 2, 3, 4, 5, 38, 7, 8, 9, 10, 11, 12, 13, 29, 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, 45, 46 -}; - -int JArithmeticDecoder::nlpsTab[47] = { - 1, 6, 9, 12, 29, 33, 6, 14, 14, 14, 17, 18, 20, 21, 14, 14, - 15, 16, 17, 18, 19, 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, 46 -}; - -int JArithmeticDecoder::switchTab[47] = { - 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -JArithmeticDecoder::JArithmeticDecoder() { - str = NULL; - dataLen = 0; - limitStream = gFalse; -} - -inline Guint JArithmeticDecoder::readByte() { - if (limitStream) { - --dataLen; - if (dataLen < 0) { - return 0xff; - } - } - return (Guint)str->getChar() & 0xff; -} - -JArithmeticDecoder::~JArithmeticDecoder() { - cleanup(); -} - -void JArithmeticDecoder::start() { - buf0 = readByte(); - buf1 = readByte(); - - // INITDEC - c = (buf0 ^ 0xff) << 16; - byteIn(); - c <<= 7; - ct -= 7; - a = 0x80000000; -} - -void JArithmeticDecoder::restart(int dataLenA) { - int oldDataLen; - - oldDataLen = dataLen; - dataLen = dataLenA; - if (oldDataLen == -1) { - buf1 = readByte(); - } else if (oldDataLen <= -2) { - buf0 = readByte(); - buf1 = readByte(); - } -} - -void JArithmeticDecoder::cleanup() { - if (limitStream) { - while (dataLen > 0) { - buf0 = buf1; - buf1 = readByte(); - } - } -} - -int JArithmeticDecoder::decodeBit(Guint context, - JArithmeticDecoderStats *stats) { - int bit; - Guint qe; - int iCX, mpsCX; - - iCX = stats->cxTab[context] >> 1; - mpsCX = stats->cxTab[context] & 1; - qe = qeTab[iCX]; - a -= qe; - if (c < a) { - if (a & 0x80000000) { - bit = mpsCX; - } else { - // MPS_EXCHANGE - if (a < qe) { - bit = 1 - mpsCX; - if (switchTab[iCX]) { - stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX); - } else { - stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX; - } - } else { - bit = mpsCX; - stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX; - } - // RENORMD - do { - if (ct == 0) { - byteIn(); - } - a <<= 1; - c <<= 1; - --ct; - } while (!(a & 0x80000000)); - } - } else { - c -= a; - // LPS_EXCHANGE - if (a < qe) { - bit = mpsCX; - stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX; - } else { - bit = 1 - mpsCX; - if (switchTab[iCX]) { - stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX); - } else { - stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX; - } - } - a = qe; - // RENORMD - do { - if (ct == 0) { - byteIn(); - } - a <<= 1; - c <<= 1; - --ct; - } while (!(a & 0x80000000)); - } - return bit; -} - -int JArithmeticDecoder::decodeByte(Guint context, - JArithmeticDecoderStats *stats) { - int byte; - int i; - - byte = 0; - for (i = 0; i < 8; ++i) { - byte = (byte << 1) | decodeBit(context, stats); - } - return byte; -} - -GBool JArithmeticDecoder::decodeInt(int *x, JArithmeticDecoderStats *stats) { - int s; - Guint v; - int i; - - prev = 1; - s = decodeIntBit(stats); - if (decodeIntBit(stats)) { - if (decodeIntBit(stats)) { - if (decodeIntBit(stats)) { - if (decodeIntBit(stats)) { - if (decodeIntBit(stats)) { - v = 0; - for (i = 0; i < 32; ++i) { - v = (v << 1) | decodeIntBit(stats); - } - v += 4436; - } else { - v = 0; - for (i = 0; i < 12; ++i) { - v = (v << 1) | decodeIntBit(stats); - } - v += 340; - } - } else { - v = 0; - for (i = 0; i < 8; ++i) { - v = (v << 1) | decodeIntBit(stats); - } - v += 84; - } - } else { - v = 0; - for (i = 0; i < 6; ++i) { - v = (v << 1) | decodeIntBit(stats); - } - v += 20; - } - } else { - v = decodeIntBit(stats); - v = (v << 1) | decodeIntBit(stats); - v = (v << 1) | decodeIntBit(stats); - v = (v << 1) | decodeIntBit(stats); - v += 4; - } - } else { - v = decodeIntBit(stats); - v = (v << 1) | decodeIntBit(stats); - } - - if (s) { - if (v == 0) { - return gFalse; - } - *x = -(int)v; - } else { - *x = (int)v; - } - return gTrue; -} - -int JArithmeticDecoder::decodeIntBit(JArithmeticDecoderStats *stats) { - int bit; - - bit = decodeBit(prev, stats); - if (prev < 0x100) { - prev = (prev << 1) | bit; - } else { - prev = (((prev << 1) | bit) & 0x1ff) | 0x100; - } - return bit; -} - -Guint JArithmeticDecoder::decodeIAID(Guint codeLen, - JArithmeticDecoderStats *stats) { - Guint i; - int bit; - - prev = 1; - for (i = 0; i < codeLen; ++i) { - bit = decodeBit(prev, stats); - prev = (prev << 1) | bit; - } - return prev - (1 << codeLen); -} - -void JArithmeticDecoder::byteIn() { - if (buf0 == 0xff) { - if (buf1 > 0x8f) { - ct = 8; - } else { - buf0 = buf1; - buf1 = readByte(); - c = c + 0xfe00 - (buf0 << 9); - ct = 7; - } - } else { - buf0 = buf1; - buf1 = readByte(); - c = c + 0xff00 - (buf0 << 8); - ct = 8; - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.h deleted file mode 100644 index a40823ddb..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JArithmeticDecoder.h +++ /dev/null @@ -1,109 +0,0 @@ -//======================================================================== -// -// JArithmeticDecoder.h -// -// Arithmetic decoder used by the JBIG2 and JPEG2000 decoders. -// -// Copyright 2002-2004 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef JARITHMETICDECODER_H -#define JARITHMETICDECODER_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -class Stream; - -//------------------------------------------------------------------------ -// JArithmeticDecoderStats -//------------------------------------------------------------------------ - -class JArithmeticDecoderStats { -public: - - JArithmeticDecoderStats(int contextSizeA); - ~JArithmeticDecoderStats(); - JArithmeticDecoderStats *copy(); - void reset(); - int getContextSize() { return contextSize; } - void copyFrom(JArithmeticDecoderStats *stats); - void setEntry(Guint cx, int i, int mps); - -private: - - Guchar *cxTab; // cxTab[cx] = (i[cx] << 1) + mps[cx] - int contextSize; - - friend class JArithmeticDecoder; -}; - -//------------------------------------------------------------------------ -// JArithmeticDecoder -//------------------------------------------------------------------------ - -class JArithmeticDecoder { -public: - - JArithmeticDecoder(); - ~JArithmeticDecoder(); - - void setStream(Stream *strA) - { str = strA; dataLen = 0; limitStream = gFalse; } - void setStream(Stream *strA, int dataLenA) - { str = strA; dataLen = dataLenA; limitStream = gTrue; } - - // Start decoding on a new stream. This fills the byte buffers and - // runs INITDEC. - void start(); - - // Restart decoding on an interrupted stream. This refills the - // buffers if needed, but does not run INITDEC. (This is used in - // JPEG 2000 streams when codeblock data is split across multiple - // packets/layers.) - void restart(int dataLenA); - - // Read any leftover data in the stream. - void cleanup(); - - // Decode one bit. - int decodeBit(Guint context, JArithmeticDecoderStats *stats); - - // Decode eight bits. - int decodeByte(Guint context, JArithmeticDecoderStats *stats); - - // Returns false for OOB, otherwise sets * and returns true. - GBool decodeInt(int *x, JArithmeticDecoderStats *stats); - - Guint decodeIAID(Guint codeLen, - JArithmeticDecoderStats *stats); - -private: - - Guint readByte(); - int decodeIntBit(JArithmeticDecoderStats *stats); - void byteIn(); - - static Guint qeTab[47]; - static int nmpsTab[47]; - static int nlpsTab[47]; - static int switchTab[47]; - - Guint buf0, buf1; - Guint c, a; - int ct; - - Guint prev; // for the integer decoder - - Stream *str; - int dataLen; - GBool limitStream; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.cc deleted file mode 100644 index 375d9ba72..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.cc +++ /dev/null @@ -1,3726 +0,0 @@ -//======================================================================== -// -// JBIG2Stream.cc -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -//======================================================================== -// -// Modified under the Poppler project - http://poppler.freedesktop.org -// -// All changes made under the Poppler project to this file are licensed -// under GPL version 2 or later -// -// Copyright (C) 2006 Raj Kumar -// Copyright (C) 2006 Paul Walmsley -// Copyright (C) 2006-2009 Albert Astals Cid -// Copyright (C) 2009 David Benjamin -// -// To see a description of the changes please see the Changelog file that -// came with your tarball or type make ChangeLog if you are building from git -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "GList.h" -#include "Error.h" -#include "JArithmeticDecoder.h" -#include "JBIG2Stream.h" - -//~ share these tables -#include "Stream-CCITT.h" - -//------------------------------------------------------------------------ - -static const int contextSize[4] = { 16, 13, 10, 10 }; -static const int refContextSize[2] = { 13, 10 }; - -//------------------------------------------------------------------------ -// JBIG2HuffmanTable -//------------------------------------------------------------------------ - -#define jbig2HuffmanLOW 0xfffffffd -#define jbig2HuffmanOOB 0xfffffffe -#define jbig2HuffmanEOT 0xffffffff - -struct JBIG2HuffmanTable { - int val; - Guint prefixLen; - Guint rangeLen; // can also be LOW, OOB, or EOT - Guint prefix; -}; - -static JBIG2HuffmanTable huffTableA[] = { - { 0, 1, 4, 0x000 }, - { 16, 2, 8, 0x002 }, - { 272, 3, 16, 0x006 }, - { 65808, 3, 32, 0x007 }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableB[] = { - { 0, 1, 0, 0x000 }, - { 1, 2, 0, 0x002 }, - { 2, 3, 0, 0x006 }, - { 3, 4, 3, 0x00e }, - { 11, 5, 6, 0x01e }, - { 75, 6, 32, 0x03e }, - { 0, 6, jbig2HuffmanOOB, 0x03f }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableC[] = { - { 0, 1, 0, 0x000 }, - { 1, 2, 0, 0x002 }, - { 2, 3, 0, 0x006 }, - { 3, 4, 3, 0x00e }, - { 11, 5, 6, 0x01e }, - { 0, 6, jbig2HuffmanOOB, 0x03e }, - { 75, 7, 32, 0x0fe }, - { -256, 8, 8, 0x0fe }, - { -257, 8, jbig2HuffmanLOW, 0x0ff }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableD[] = { - { 1, 1, 0, 0x000 }, - { 2, 2, 0, 0x002 }, - { 3, 3, 0, 0x006 }, - { 4, 4, 3, 0x00e }, - { 12, 5, 6, 0x01e }, - { 76, 5, 32, 0x01f }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableE[] = { - { 1, 1, 0, 0x000 }, - { 2, 2, 0, 0x002 }, - { 3, 3, 0, 0x006 }, - { 4, 4, 3, 0x00e }, - { 12, 5, 6, 0x01e }, - { 76, 6, 32, 0x03e }, - { -255, 7, 8, 0x07e }, - { -256, 7, jbig2HuffmanLOW, 0x07f }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableF[] = { - { 0, 2, 7, 0x000 }, - { 128, 3, 7, 0x002 }, - { 256, 3, 8, 0x003 }, - { -1024, 4, 9, 0x008 }, - { -512, 4, 8, 0x009 }, - { -256, 4, 7, 0x00a }, - { -32, 4, 5, 0x00b }, - { 512, 4, 9, 0x00c }, - { 1024, 4, 10, 0x00d }, - { -2048, 5, 10, 0x01c }, - { -128, 5, 6, 0x01d }, - { -64, 5, 5, 0x01e }, - { -2049, 6, jbig2HuffmanLOW, 0x03e }, - { 2048, 6, 32, 0x03f }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableG[] = { - { -512, 3, 8, 0x000 }, - { 256, 3, 8, 0x001 }, - { 512, 3, 9, 0x002 }, - { 1024, 3, 10, 0x003 }, - { -1024, 4, 9, 0x008 }, - { -256, 4, 7, 0x009 }, - { -32, 4, 5, 0x00a }, - { 0, 4, 5, 0x00b }, - { 128, 4, 7, 0x00c }, - { -128, 5, 6, 0x01a }, - { -64, 5, 5, 0x01b }, - { 32, 5, 5, 0x01c }, - { 64, 5, 6, 0x01d }, - { -1025, 5, jbig2HuffmanLOW, 0x01e }, - { 2048, 5, 32, 0x01f }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableH[] = { - { 0, 2, 1, 0x000 }, - { 0, 2, jbig2HuffmanOOB, 0x001 }, - { 4, 3, 4, 0x004 }, - { -1, 4, 0, 0x00a }, - { 22, 4, 4, 0x00b }, - { 38, 4, 5, 0x00c }, - { 2, 5, 0, 0x01a }, - { 70, 5, 6, 0x01b }, - { 134, 5, 7, 0x01c }, - { 3, 6, 0, 0x03a }, - { 20, 6, 1, 0x03b }, - { 262, 6, 7, 0x03c }, - { 646, 6, 10, 0x03d }, - { -2, 7, 0, 0x07c }, - { 390, 7, 8, 0x07d }, - { -15, 8, 3, 0x0fc }, - { -5, 8, 1, 0x0fd }, - { -7, 9, 1, 0x1fc }, - { -3, 9, 0, 0x1fd }, - { -16, 9, jbig2HuffmanLOW, 0x1fe }, - { 1670, 9, 32, 0x1ff }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableI[] = { - { 0, 2, jbig2HuffmanOOB, 0x000 }, - { -1, 3, 1, 0x002 }, - { 1, 3, 1, 0x003 }, - { 7, 3, 5, 0x004 }, - { -3, 4, 1, 0x00a }, - { 43, 4, 5, 0x00b }, - { 75, 4, 6, 0x00c }, - { 3, 5, 1, 0x01a }, - { 139, 5, 7, 0x01b }, - { 267, 5, 8, 0x01c }, - { 5, 6, 1, 0x03a }, - { 39, 6, 2, 0x03b }, - { 523, 6, 8, 0x03c }, - { 1291, 6, 11, 0x03d }, - { -5, 7, 1, 0x07c }, - { 779, 7, 9, 0x07d }, - { -31, 8, 4, 0x0fc }, - { -11, 8, 2, 0x0fd }, - { -15, 9, 2, 0x1fc }, - { -7, 9, 1, 0x1fd }, - { -32, 9, jbig2HuffmanLOW, 0x1fe }, - { 3339, 9, 32, 0x1ff }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableJ[] = { - { -2, 2, 2, 0x000 }, - { 6, 2, 6, 0x001 }, - { 0, 2, jbig2HuffmanOOB, 0x002 }, - { -3, 5, 0, 0x018 }, - { 2, 5, 0, 0x019 }, - { 70, 5, 5, 0x01a }, - { 3, 6, 0, 0x036 }, - { 102, 6, 5, 0x037 }, - { 134, 6, 6, 0x038 }, - { 198, 6, 7, 0x039 }, - { 326, 6, 8, 0x03a }, - { 582, 6, 9, 0x03b }, - { 1094, 6, 10, 0x03c }, - { -21, 7, 4, 0x07a }, - { -4, 7, 0, 0x07b }, - { 4, 7, 0, 0x07c }, - { 2118, 7, 11, 0x07d }, - { -5, 8, 0, 0x0fc }, - { 5, 8, 0, 0x0fd }, - { -22, 8, jbig2HuffmanLOW, 0x0fe }, - { 4166, 8, 32, 0x0ff }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableK[] = { - { 1, 1, 0, 0x000 }, - { 2, 2, 1, 0x002 }, - { 4, 4, 0, 0x00c }, - { 5, 4, 1, 0x00d }, - { 7, 5, 1, 0x01c }, - { 9, 5, 2, 0x01d }, - { 13, 6, 2, 0x03c }, - { 17, 7, 2, 0x07a }, - { 21, 7, 3, 0x07b }, - { 29, 7, 4, 0x07c }, - { 45, 7, 5, 0x07d }, - { 77, 7, 6, 0x07e }, - { 141, 7, 32, 0x07f }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableL[] = { - { 1, 1, 0, 0x000 }, - { 2, 2, 0, 0x002 }, - { 3, 3, 1, 0x006 }, - { 5, 5, 0, 0x01c }, - { 6, 5, 1, 0x01d }, - { 8, 6, 1, 0x03c }, - { 10, 7, 0, 0x07a }, - { 11, 7, 1, 0x07b }, - { 13, 7, 2, 0x07c }, - { 17, 7, 3, 0x07d }, - { 25, 7, 4, 0x07e }, - { 41, 8, 5, 0x0fe }, - { 73, 8, 32, 0x0ff }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableM[] = { - { 1, 1, 0, 0x000 }, - { 2, 3, 0, 0x004 }, - { 7, 3, 3, 0x005 }, - { 3, 4, 0, 0x00c }, - { 5, 4, 1, 0x00d }, - { 4, 5, 0, 0x01c }, - { 15, 6, 1, 0x03a }, - { 17, 6, 2, 0x03b }, - { 21, 6, 3, 0x03c }, - { 29, 6, 4, 0x03d }, - { 45, 6, 5, 0x03e }, - { 77, 7, 6, 0x07e }, - { 141, 7, 32, 0x07f }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableN[] = { - { 0, 1, 0, 0x000 }, - { -2, 3, 0, 0x004 }, - { -1, 3, 0, 0x005 }, - { 1, 3, 0, 0x006 }, - { 2, 3, 0, 0x007 }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -static JBIG2HuffmanTable huffTableO[] = { - { 0, 1, 0, 0x000 }, - { -1, 3, 0, 0x004 }, - { 1, 3, 0, 0x005 }, - { -2, 4, 0, 0x00c }, - { 2, 4, 0, 0x00d }, - { -4, 5, 1, 0x01c }, - { 3, 5, 1, 0x01d }, - { -8, 6, 2, 0x03c }, - { 5, 6, 2, 0x03d }, - { -24, 7, 4, 0x07c }, - { 9, 7, 4, 0x07d }, - { -25, 7, jbig2HuffmanLOW, 0x07e }, - { 25, 7, 32, 0x07f }, - { 0, 0, jbig2HuffmanEOT, 0 } -}; - -//------------------------------------------------------------------------ -// JBIG2HuffmanDecoder -//------------------------------------------------------------------------ - -class JBIG2HuffmanDecoder { -public: - - JBIG2HuffmanDecoder(); - ~JBIG2HuffmanDecoder(); - void setStream(Stream *strA) { str = strA; } - - void reset(); - - // Returns false for OOB, otherwise sets * and returns true. - GBool decodeInt(int *x, JBIG2HuffmanTable *table); - - Guint readBits(Guint n); - Guint readBit(); - - // Sort the table by prefix length and assign prefix values. - void buildTable(JBIG2HuffmanTable *table, Guint len); - -private: - - Stream *str; - Guint buf; - Guint bufLen; -}; - -JBIG2HuffmanDecoder::JBIG2HuffmanDecoder() { - str = NULL; - reset(); -} - -JBIG2HuffmanDecoder::~JBIG2HuffmanDecoder() { -} - -void JBIG2HuffmanDecoder::reset() { - buf = 0; - bufLen = 0; -} - -//~ optimize this -GBool JBIG2HuffmanDecoder::decodeInt(int *x, JBIG2HuffmanTable *table) { - Guint i, len, prefix; - - i = 0; - len = 0; - prefix = 0; - while (table[i].rangeLen != jbig2HuffmanEOT) { - while (len < table[i].prefixLen) { - prefix = (prefix << 1) | readBit(); - ++len; - } - if (prefix == table[i].prefix) { - if (table[i].rangeLen == jbig2HuffmanOOB) { - return gFalse; - } - if (table[i].rangeLen == jbig2HuffmanLOW) { - *x = table[i].val - readBits(32); - } else if (table[i].rangeLen > 0) { - *x = table[i].val + readBits(table[i].rangeLen); - } else { - *x = table[i].val; - } - return gTrue; - } - ++i; - } - return gFalse; -} - -Guint JBIG2HuffmanDecoder::readBits(Guint n) { - Guint x, mask, nLeft; - - mask = (n == 32) ? 0xffffffff : ((1 << n) - 1); - if (bufLen >= n) { - x = (buf >> (bufLen - n)) & mask; - bufLen -= n; - } else { - x = buf & ((1 << bufLen) - 1); - nLeft = n - bufLen; - bufLen = 0; - while (nLeft >= 8) { - x = (x << 8) | (str->getChar() & 0xff); - nLeft -= 8; - } - if (nLeft > 0) { - buf = str->getChar(); - bufLen = 8 - nLeft; - x = (x << nLeft) | ((buf >> bufLen) & ((1 << nLeft) - 1)); - } - } - return x; -} - -Guint JBIG2HuffmanDecoder::readBit() { - if (bufLen == 0) { - buf = str->getChar(); - bufLen = 8; - } - --bufLen; - return (buf >> bufLen) & 1; -} - -void JBIG2HuffmanDecoder::buildTable(JBIG2HuffmanTable *table, Guint len) { - Guint i, j, k, prefix; - JBIG2HuffmanTable tab; - - // stable selection sort: - // - entries with prefixLen > 0, in ascending prefixLen order - // - entry with prefixLen = 0, rangeLen = EOT - // - all other entries with prefixLen = 0 - // (on entry, table[len] has prefixLen = 0, rangeLen = EOT) - for (i = 0; i < len; ++i) { - for (j = i; j < len && table[j].prefixLen == 0; ++j) ; - if (j == len) { - break; - } - for (k = j + 1; k < len; ++k) { - if (table[k].prefixLen > 0 && - table[k].prefixLen < table[j].prefixLen) { - j = k; - } - } - if (j != i) { - tab = table[j]; - for (k = j; k > i; --k) { - table[k] = table[k - 1]; - } - table[i] = tab; - } - } - table[i] = table[len]; - - // assign prefixes - if (table[0].rangeLen != jbig2HuffmanEOT) { - i = 0; - prefix = 0; - table[i++].prefix = prefix++; - for (; table[i].rangeLen != jbig2HuffmanEOT; ++i) { - prefix <<= table[i].prefixLen - table[i-1].prefixLen; - table[i].prefix = prefix++; - } - } -} - -//------------------------------------------------------------------------ -// JBIG2MMRDecoder -//------------------------------------------------------------------------ - -class JBIG2MMRDecoder { -public: - - JBIG2MMRDecoder(); - ~JBIG2MMRDecoder(); - void setStream(Stream *strA) { str = strA; } - void reset(); - int get2DCode(); - int getBlackCode(); - int getWhiteCode(); - Guint get24Bits(); - void skipTo(Guint length); - -private: - - Stream *str; - Guint buf; - Guint bufLen; - Guint nBytesRead; -}; - -JBIG2MMRDecoder::JBIG2MMRDecoder() { - str = NULL; - reset(); -} - -JBIG2MMRDecoder::~JBIG2MMRDecoder() { -} - -void JBIG2MMRDecoder::reset() { - buf = 0; - bufLen = 0; - nBytesRead = 0; -} - -int JBIG2MMRDecoder::get2DCode() { - const CCITTCode *p; - - if (bufLen == 0) { - buf = str->getChar() & 0xff; - bufLen = 8; - ++nBytesRead; - p = &twoDimTab1[(buf >> 1) & 0x7f]; - } else if (bufLen == 8) { - p = &twoDimTab1[(buf >> 1) & 0x7f]; - } else { - p = &twoDimTab1[(buf << (7 - bufLen)) & 0x7f]; - if (p->bits < 0 || p->bits > (int)bufLen) { - buf = (buf << 8) | (str->getChar() & 0xff); - bufLen += 8; - ++nBytesRead; - p = &twoDimTab1[(buf >> (bufLen - 7)) & 0x7f]; - } - } - if (p->bits < 0) { - error(str->getPos(), "Bad two dim code in JBIG2 MMR stream"); - return EOF; - } - bufLen -= p->bits; - return p->n; -} - -int JBIG2MMRDecoder::getWhiteCode() { - const CCITTCode *p; - Guint code; - - if (bufLen == 0) { - buf = str->getChar() & 0xff; - bufLen = 8; - ++nBytesRead; - } - while (1) { - if (bufLen >= 11 && ((buf >> (bufLen - 7)) & 0x7f) == 0) { - if (bufLen <= 12) { - code = buf << (12 - bufLen); - } else { - code = buf >> (bufLen - 12); - } - p = &whiteTab1[code & 0x1f]; - } else { - if (bufLen <= 9) { - code = buf << (9 - bufLen); - } else { - code = buf >> (bufLen - 9); - } - p = &whiteTab2[code & 0x1ff]; - } - if (p->bits > 0 && p->bits <= (int)bufLen) { - bufLen -= p->bits; - return p->n; - } - if (bufLen >= 12) { - break; - } - buf = (buf << 8) | (str->getChar() & 0xff); - bufLen += 8; - ++nBytesRead; - } - error(str->getPos(), "Bad white code in JBIG2 MMR stream"); - // eat a bit and return a positive number so that the caller doesn't - // go into an infinite loop - --bufLen; - return 1; -} - -int JBIG2MMRDecoder::getBlackCode() { - const CCITTCode *p; - Guint code; - - if (bufLen == 0) { - buf = str->getChar() & 0xff; - bufLen = 8; - ++nBytesRead; - } - while (1) { - if (bufLen >= 10 && ((buf >> (bufLen - 6)) & 0x3f) == 0) { - if (bufLen <= 13) { - code = buf << (13 - bufLen); - } else { - code = buf >> (bufLen - 13); - } - p = &blackTab1[code & 0x7f]; - } else if (bufLen >= 7 && ((buf >> (bufLen - 4)) & 0x0f) == 0 && - ((buf >> (bufLen - 6)) & 0x03) != 0) { - if (bufLen <= 12) { - code = buf << (12 - bufLen); - } else { - code = buf >> (bufLen - 12); - } - p = &blackTab2[(code & 0xff) - 64]; - } else { - if (bufLen <= 6) { - code = buf << (6 - bufLen); - } else { - code = buf >> (bufLen - 6); - } - p = &blackTab3[code & 0x3f]; - } - if (p->bits > 0 && p->bits <= (int)bufLen) { - bufLen -= p->bits; - return p->n; - } - if (bufLen >= 13) { - break; - } - buf = (buf << 8) | (str->getChar() & 0xff); - bufLen += 8; - ++nBytesRead; - } - error(str->getPos(), "Bad black code in JBIG2 MMR stream"); - // eat a bit and return a positive number so that the caller doesn't - // go into an infinite loop - --bufLen; - return 1; -} - -Guint JBIG2MMRDecoder::get24Bits() { - while (bufLen < 24) { - buf = (buf << 8) | (str->getChar() & 0xff); - bufLen += 8; - ++nBytesRead; - } - return (buf >> (bufLen - 24)) & 0xffffff; -} - -void JBIG2MMRDecoder::skipTo(Guint length) { - while (nBytesRead < length) { - str->getChar(); - ++nBytesRead; - } -} - -//------------------------------------------------------------------------ -// JBIG2Segment -//------------------------------------------------------------------------ - -enum JBIG2SegmentType { - jbig2SegBitmap, - jbig2SegSymbolDict, - jbig2SegPatternDict, - jbig2SegCodeTable -}; - -class JBIG2Segment { -public: - - JBIG2Segment(Guint segNumA) { segNum = segNumA; } - virtual ~JBIG2Segment() {} - void setSegNum(Guint segNumA) { segNum = segNumA; } - Guint getSegNum() { return segNum; } - virtual JBIG2SegmentType getType() = 0; - -private: - - Guint segNum; -}; - -//------------------------------------------------------------------------ -// JBIG2Bitmap -//------------------------------------------------------------------------ - -struct JBIG2BitmapPtr { - Guchar *p; - int shift; - int x; -}; - -class JBIG2Bitmap: public JBIG2Segment { -public: - - JBIG2Bitmap(Guint segNumA, int wA, int hA); - virtual ~JBIG2Bitmap(); - virtual JBIG2SegmentType getType() { return jbig2SegBitmap; } - JBIG2Bitmap *copy() { return new JBIG2Bitmap(0, this); } - JBIG2Bitmap *getSlice(Guint x, Guint y, Guint wA, Guint hA); - void expand(int newH, Guint pixel); - void clearToZero(); - void clearToOne(); - int getWidth() { return w; } - int getHeight() { return h; } - int getPixel(int x, int y) - { return (x < 0 || x >= w || y < 0 || y >= h) ? 0 : - (data[y * line + (x >> 3)] >> (7 - (x & 7))) & 1; } - void setPixel(int x, int y) - { data[y * line + (x >> 3)] |= 1 << (7 - (x & 7)); } - void clearPixel(int x, int y) - { data[y * line + (x >> 3)] &= 0x7f7f >> (x & 7); } - void getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr); - int nextPixel(JBIG2BitmapPtr *ptr); - void duplicateRow(int yDest, int ySrc); - void combine(JBIG2Bitmap *bitmap, int x, int y, Guint combOp); - Guchar *getDataPtr() { return data; } - int getDataSize() { return h * line; } - GBool isOk() { return data != NULL; } - -private: - - JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap); - - int w, h, line; - Guchar *data; -}; - -JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, int wA, int hA): - JBIG2Segment(segNumA) -{ - w = wA; - h = hA; - line = (wA + 7) >> 3; - - if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { - error(-1, "invalid width/height"); - data = NULL; - return; - } - // need to allocate one extra guard byte for use in combine() - data = (Guchar *)gmalloc(h * line + 1); - data[h * line] = 0; -} - -JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap): - JBIG2Segment(segNumA) -{ - w = bitmap->w; - h = bitmap->h; - line = bitmap->line; - - if (w <= 0 || h <= 0 || line <= 0 || h >= (INT_MAX - 1) / line) { - error(-1, "invalid width/height"); - data = NULL; - return; - } - // need to allocate one extra guard byte for use in combine() - data = (Guchar *)gmalloc(h * line + 1); - memcpy(data, bitmap->data, h * line); - data[h * line] = 0; -} - -JBIG2Bitmap::~JBIG2Bitmap() { - gfree(data); -} - -//~ optimize this -JBIG2Bitmap *JBIG2Bitmap::getSlice(Guint x, Guint y, Guint wA, Guint hA) { - JBIG2Bitmap *slice; - Guint xx, yy; - - slice = new JBIG2Bitmap(0, wA, hA); - slice->clearToZero(); - for (yy = 0; yy < hA; ++yy) { - for (xx = 0; xx < wA; ++xx) { - if (getPixel(x + xx, y + yy)) { - slice->setPixel(xx, yy); - } - } - } - return slice; -} - -void JBIG2Bitmap::expand(int newH, Guint pixel) { - if (newH <= h || line <= 0 || newH >= (INT_MAX - 1) / line) { - error(-1, "invalid width/height"); - gfree(data); - data = NULL; - return; - } - // need to allocate one extra guard byte for use in combine() - data = (Guchar *)grealloc(data, newH * line + 1); - if (pixel) { - memset(data + h * line, 0xff, (newH - h) * line); - } else { - memset(data + h * line, 0x00, (newH - h) * line); - } - h = newH; - data[h * line] = 0; -} - -void JBIG2Bitmap::clearToZero() { - memset(data, 0, h * line); -} - -void JBIG2Bitmap::clearToOne() { - memset(data, 0xff, h * line); -} - -inline void JBIG2Bitmap::getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr) { - if (y < 0 || y >= h || x >= w) { - ptr->p = NULL; - ptr->shift = 0; // make gcc happy - ptr->x = 0; // make gcc happy - } else if (x < 0) { - ptr->p = &data[y * line]; - ptr->shift = 7; - ptr->x = x; - } else { - ptr->p = &data[y * line + (x >> 3)]; - ptr->shift = 7 - (x & 7); - ptr->x = x; - } -} - -inline int JBIG2Bitmap::nextPixel(JBIG2BitmapPtr *ptr) { - int pix; - - if (!ptr->p) { - pix = 0; - } else if (ptr->x < 0) { - ++ptr->x; - pix = 0; - } else { - pix = (*ptr->p >> ptr->shift) & 1; - if (++ptr->x == w) { - ptr->p = NULL; - } else if (ptr->shift == 0) { - ++ptr->p; - ptr->shift = 7; - } else { - --ptr->shift; - } - } - return pix; -} - -void JBIG2Bitmap::duplicateRow(int yDest, int ySrc) { - memcpy(data + yDest * line, data + ySrc * line, line); -} - -void JBIG2Bitmap::combine(JBIG2Bitmap *bitmap, int x, int y, - Guint combOp) { - int x0, x1, y0, y1, xx, yy; - Guchar *srcPtr, *destPtr; - Guint src0, src1, src, dest, s1, s2, m1, m2, m3; - GBool oneByte; - - // check for the pathological case where y = -2^31 - if (y < -0x7fffffff) { - return; - } - if (y < 0) { - y0 = -y; - } else { - y0 = 0; - } - if (y + bitmap->h > h) { - y1 = h - y; - } else { - y1 = bitmap->h; - } - if (y0 >= y1) { - return; - } - - if (x >= 0) { - x0 = x & ~7; - } else { - x0 = 0; - } - x1 = x + bitmap->w; - if (x1 > w) { - x1 = w; - } - if (x0 >= x1) { - return; - } - - s1 = x & 7; - s2 = 8 - s1; - m1 = 0xff >> (x1 & 7); - m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7)); - m3 = (0xff >> s1) & m2; - - oneByte = x0 == ((x1 - 1) & ~7); - - for (yy = y0; yy < y1; ++yy) { - - // one byte per line -- need to mask both left and right side - if (oneByte) { - if (x >= 0) { - destPtr = data + (y + yy) * line + (x >> 3); - srcPtr = bitmap->data + yy * bitmap->line; - dest = *destPtr; - src1 = *srcPtr; - switch (combOp) { - case 0: // or - dest |= (src1 >> s1) & m2; - break; - case 1: // and - dest &= ((0xff00 | src1) >> s1) | m1; - break; - case 2: // xor - dest ^= (src1 >> s1) & m2; - break; - case 3: // xnor - dest ^= ((src1 ^ 0xff) >> s1) & m2; - break; - case 4: // replace - dest = (dest & ~m3) | ((src1 >> s1) & m3); - break; - } - *destPtr = dest; - } else { - destPtr = data + (y + yy) * line; - srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3); - dest = *destPtr; - src1 = *srcPtr; - switch (combOp) { - case 0: // or - dest |= src1 & m2; - break; - case 1: // and - dest &= src1 | m1; - break; - case 2: // xor - dest ^= src1 & m2; - break; - case 3: // xnor - dest ^= (src1 ^ 0xff) & m2; - break; - case 4: // replace - dest = (src1 & m2) | (dest & m1); - break; - } - *destPtr = dest; - } - - // multiple bytes per line -- need to mask left side of left-most - // byte and right side of right-most byte - } else { - - // left-most byte - if (x >= 0) { - destPtr = data + (y + yy) * line + (x >> 3); - srcPtr = bitmap->data + yy * bitmap->line; - src1 = *srcPtr++; - dest = *destPtr; - switch (combOp) { - case 0: // or - dest |= src1 >> s1; - break; - case 1: // and - dest &= (0xff00 | src1) >> s1; - break; - case 2: // xor - dest ^= src1 >> s1; - break; - case 3: // xnor - dest ^= (src1 ^ 0xff) >> s1; - break; - case 4: // replace - dest = (dest & (0xff << s2)) | (src1 >> s1); - break; - } - *destPtr++ = dest; - xx = x0 + 8; - } else { - destPtr = data + (y + yy) * line; - srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3); - src1 = *srcPtr++; - xx = x0; - } - - // middle bytes - for (; xx < x1 - 8; xx += 8) { - dest = *destPtr; - src0 = src1; - src1 = *srcPtr++; - src = (((src0 << 8) | src1) >> s1) & 0xff; - switch (combOp) { - case 0: // or - dest |= src; - break; - case 1: // and - dest &= src; - break; - case 2: // xor - dest ^= src; - break; - case 3: // xnor - dest ^= src ^ 0xff; - break; - case 4: // replace - dest = src; - break; - } - *destPtr++ = dest; - } - - // right-most byte - // note: this last byte (src1) may not actually be used, depending - // on the values of s1, m1, and m2 - and in fact, it may be off - // the edge of the source bitmap, which means we need to allocate - // one extra guard byte at the end of each bitmap - dest = *destPtr; - src0 = src1; - src1 = *srcPtr++; - src = (((src0 << 8) | src1) >> s1) & 0xff; - switch (combOp) { - case 0: // or - dest |= src & m2; - break; - case 1: // and - dest &= src | m1; - break; - case 2: // xor - dest ^= src & m2; - break; - case 3: // xnor - dest ^= (src ^ 0xff) & m2; - break; - case 4: // replace - dest = (src & m2) | (dest & m1); - break; - } - *destPtr = dest; - } - } -} - -//------------------------------------------------------------------------ -// JBIG2SymbolDict -//------------------------------------------------------------------------ - -class JBIG2SymbolDict: public JBIG2Segment { -public: - - JBIG2SymbolDict(Guint segNumA, Guint sizeA); - virtual ~JBIG2SymbolDict(); - virtual JBIG2SegmentType getType() { return jbig2SegSymbolDict; } - Guint getSize() { return size; } - void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; } - JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; } - GBool isOk() { return bitmaps != NULL; } - void setGenericRegionStats(JArithmeticDecoderStats *stats) - { genericRegionStats = stats; } - void setRefinementRegionStats(JArithmeticDecoderStats *stats) - { refinementRegionStats = stats; } - JArithmeticDecoderStats *getGenericRegionStats() - { return genericRegionStats; } - JArithmeticDecoderStats *getRefinementRegionStats() - { return refinementRegionStats; } - -private: - - Guint size; - JBIG2Bitmap **bitmaps; - JArithmeticDecoderStats *genericRegionStats; - JArithmeticDecoderStats *refinementRegionStats; -}; - -JBIG2SymbolDict::JBIG2SymbolDict(Guint segNumA, Guint sizeA): - JBIG2Segment(segNumA) -{ - size = sizeA; - bitmaps = (JBIG2Bitmap **)gmallocn(size, sizeof(JBIG2Bitmap *)); - if (!bitmaps) size = 0; - genericRegionStats = NULL; - refinementRegionStats = NULL; -} - -JBIG2SymbolDict::~JBIG2SymbolDict() { - Guint i; - - for (i = 0; i < size; ++i) { - delete bitmaps[i]; - } - gfree(bitmaps); - if (genericRegionStats) { - delete genericRegionStats; - } - if (refinementRegionStats) { - delete refinementRegionStats; - } -} - -//------------------------------------------------------------------------ -// JBIG2PatternDict -//------------------------------------------------------------------------ - -class JBIG2PatternDict: public JBIG2Segment { -public: - - JBIG2PatternDict(Guint segNumA, Guint sizeA); - virtual ~JBIG2PatternDict(); - virtual JBIG2SegmentType getType() { return jbig2SegPatternDict; } - Guint getSize() { return size; } - void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; } - JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; } - -private: - - Guint size; - JBIG2Bitmap **bitmaps; -}; - -JBIG2PatternDict::JBIG2PatternDict(Guint segNumA, Guint sizeA): - JBIG2Segment(segNumA) -{ - size = sizeA; - bitmaps = (JBIG2Bitmap **)gmallocn(size, sizeof(JBIG2Bitmap *)); -} - -JBIG2PatternDict::~JBIG2PatternDict() { - Guint i; - - for (i = 0; i < size; ++i) { - delete bitmaps[i]; - } - gfree(bitmaps); -} - -//------------------------------------------------------------------------ -// JBIG2CodeTable -//------------------------------------------------------------------------ - -class JBIG2CodeTable: public JBIG2Segment { -public: - - JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA); - virtual ~JBIG2CodeTable(); - virtual JBIG2SegmentType getType() { return jbig2SegCodeTable; } - JBIG2HuffmanTable *getHuffTable() { return table; } - -private: - - JBIG2HuffmanTable *table; -}; - -JBIG2CodeTable::JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA): - JBIG2Segment(segNumA) -{ - table = tableA; -} - -JBIG2CodeTable::~JBIG2CodeTable() { - gfree(table); -} - -//------------------------------------------------------------------------ -// JBIG2Stream -//------------------------------------------------------------------------ - -JBIG2Stream::JBIG2Stream(Stream *strA, Object *globalsStreamA): - FilterStream(strA) -{ - pageBitmap = NULL; - - arithDecoder = new JArithmeticDecoder(); - genericRegionStats = new JArithmeticDecoderStats(1 << 1); - refinementRegionStats = new JArithmeticDecoderStats(1 << 1); - iadhStats = new JArithmeticDecoderStats(1 << 9); - iadwStats = new JArithmeticDecoderStats(1 << 9); - iaexStats = new JArithmeticDecoderStats(1 << 9); - iaaiStats = new JArithmeticDecoderStats(1 << 9); - iadtStats = new JArithmeticDecoderStats(1 << 9); - iaitStats = new JArithmeticDecoderStats(1 << 9); - iafsStats = new JArithmeticDecoderStats(1 << 9); - iadsStats = new JArithmeticDecoderStats(1 << 9); - iardxStats = new JArithmeticDecoderStats(1 << 9); - iardyStats = new JArithmeticDecoderStats(1 << 9); - iardwStats = new JArithmeticDecoderStats(1 << 9); - iardhStats = new JArithmeticDecoderStats(1 << 9); - iariStats = new JArithmeticDecoderStats(1 << 9); - iaidStats = new JArithmeticDecoderStats(1 << 1); - huffDecoder = new JBIG2HuffmanDecoder(); - mmrDecoder = new JBIG2MMRDecoder(); - - globalsStreamA->copy(&globalsStream); - segments = globalSegments = NULL; - curStr = NULL; - dataPtr = dataEnd = NULL; -} - -JBIG2Stream::~JBIG2Stream() { - close(); - globalsStream.free(); - delete arithDecoder; - delete genericRegionStats; - delete refinementRegionStats; - delete iadhStats; - delete iadwStats; - delete iaexStats; - delete iaaiStats; - delete iadtStats; - delete iaitStats; - delete iafsStats; - delete iadsStats; - delete iardxStats; - delete iardyStats; - delete iardwStats; - delete iardhStats; - delete iariStats; - delete iaidStats; - delete huffDecoder; - delete mmrDecoder; - delete str; -} - -void JBIG2Stream::reset() { - // read the globals stream - globalSegments = new GList(); - if (globalsStream.isStream()) { - segments = globalSegments; - curStr = globalsStream.getStream(); - curStr->reset(); - arithDecoder->setStream(curStr); - huffDecoder->setStream(curStr); - mmrDecoder->setStream(curStr); - readSegments(); - curStr->close(); - } - - // read the main stream - segments = new GList(); - curStr = str; - curStr->reset(); - arithDecoder->setStream(curStr); - huffDecoder->setStream(curStr); - mmrDecoder->setStream(curStr); - readSegments(); - - if (pageBitmap) { - dataPtr = pageBitmap->getDataPtr(); - dataEnd = dataPtr + pageBitmap->getDataSize(); - } else { - dataPtr = dataEnd = NULL; - } -} - -void JBIG2Stream::close() { - if (pageBitmap) { - delete pageBitmap; - pageBitmap = NULL; - } - if (segments) { - deleteGList(segments, JBIG2Segment); - segments = NULL; - } - if (globalSegments) { - deleteGList(globalSegments, JBIG2Segment); - globalSegments = NULL; - } - dataPtr = dataEnd = NULL; - FilterStream::close(); -} - -int JBIG2Stream::getChar() { - if (dataPtr && dataPtr < dataEnd) { - return (*dataPtr++ ^ 0xff) & 0xff; - } - return EOF; -} - -int JBIG2Stream::lookChar() { - if (dataPtr && dataPtr < dataEnd) { - return (*dataPtr ^ 0xff) & 0xff; - } - return EOF; -} - -GString *JBIG2Stream::getPSFilter(int psLevel, char *indent) { - return NULL; -} - -GBool JBIG2Stream::isBinary(GBool last) { - return str->isBinary(gTrue); -} - -void JBIG2Stream::readSegments() { - Guint segNum, segFlags, segType, page, segLength; - Guint refFlags, nRefSegs; - Guint *refSegs; - int segDataPos; - int c1, c2, c3; - Guint i; - - while (readULong(&segNum)) { - - // segment header flags - if (!readUByte(&segFlags)) { - goto eofError1; - } - segType = segFlags & 0x3f; - - // referred-to segment count and retention flags - if (!readUByte(&refFlags)) { - goto eofError1; - } - nRefSegs = refFlags >> 5; - if (nRefSegs == 7) { - if ((c1 = curStr->getChar()) == EOF || - (c2 = curStr->getChar()) == EOF || - (c3 = curStr->getChar()) == EOF) { - goto eofError1; - } - refFlags = (refFlags << 24) | (c1 << 16) | (c2 << 8) | c3; - nRefSegs = refFlags & 0x1fffffff; - for (i = 0; i < (nRefSegs + 9) >> 3; ++i) { - c1 = curStr->getChar(); - } - } - - // referred-to segment numbers - refSegs = (Guint *)gmallocn(nRefSegs, sizeof(Guint)); - if (segNum <= 256) { - for (i = 0; i < nRefSegs; ++i) { - if (!readUByte(&refSegs[i])) { - goto eofError2; - } - } - } else if (segNum <= 65536) { - for (i = 0; i < nRefSegs; ++i) { - if (!readUWord(&refSegs[i])) { - goto eofError2; - } - } - } else { - for (i = 0; i < nRefSegs; ++i) { - if (!readULong(&refSegs[i])) { - goto eofError2; - } - } - } - - // segment page association - if (segFlags & 0x40) { - if (!readULong(&page)) { - goto eofError2; - } - } else { - if (!readUByte(&page)) { - goto eofError2; - } - } - - // segment data length - if (!readULong(&segLength)) { - goto eofError2; - } - - // keep track of the start of the segment data - segDataPos = getPos(); - - // check for missing page information segment - if (!pageBitmap && ((segType >= 4 && segType <= 7) || - (segType >= 20 && segType <= 43))) { - error(getPos(), "First JBIG2 segment associated with a page must be a page information segment"); - goto syntaxError; - } - - // read the segment data - switch (segType) { - case 0: - if (!readSymbolDictSeg(segNum, segLength, refSegs, nRefSegs)) { - goto syntaxError; - } - break; - case 4: - readTextRegionSeg(segNum, gFalse, gFalse, segLength, refSegs, nRefSegs); - break; - case 6: - readTextRegionSeg(segNum, gTrue, gFalse, segLength, refSegs, nRefSegs); - break; - case 7: - readTextRegionSeg(segNum, gTrue, gTrue, segLength, refSegs, nRefSegs); - break; - case 16: - readPatternDictSeg(segNum, segLength); - break; - case 20: - readHalftoneRegionSeg(segNum, gFalse, gFalse, segLength, - refSegs, nRefSegs); - break; - case 22: - readHalftoneRegionSeg(segNum, gTrue, gFalse, segLength, - refSegs, nRefSegs); - break; - case 23: - readHalftoneRegionSeg(segNum, gTrue, gTrue, segLength, - refSegs, nRefSegs); - break; - case 36: - readGenericRegionSeg(segNum, gFalse, gFalse, segLength); - break; - case 38: - readGenericRegionSeg(segNum, gTrue, gFalse, segLength); - break; - case 39: - readGenericRegionSeg(segNum, gTrue, gTrue, segLength); - break; - case 40: - readGenericRefinementRegionSeg(segNum, gFalse, gFalse, segLength, - refSegs, nRefSegs); - break; - case 42: - readGenericRefinementRegionSeg(segNum, gTrue, gFalse, segLength, - refSegs, nRefSegs); - break; - case 43: - readGenericRefinementRegionSeg(segNum, gTrue, gTrue, segLength, - refSegs, nRefSegs); - break; - case 48: - readPageInfoSeg(segLength); - break; - case 50: - readEndOfStripeSeg(segLength); - break; - case 52: - readProfilesSeg(segLength); - break; - case 53: - readCodeTableSeg(segNum, segLength); - break; - case 62: - readExtensionSeg(segLength); - break; - default: - error(getPos(), "Unknown segment type in JBIG2 stream"); - for (i = 0; i < segLength; ++i) { - if ((c1 = curStr->getChar()) == EOF) { - goto eofError2; - } - } - break; - } - - // Make sure the segment handler read all of the bytes in the - // segment data, unless this segment is marked as having an - // unknown length (section 7.2.7 of the JBIG2 Final Committee Draft) - - if (segLength != 0xffffffff) { - - int segExtraBytes = segDataPos + segLength - getPos(); - if (segExtraBytes > 0) { - - // If we didn't read all of the bytes in the segment data, - // indicate an error, and throw away the rest of the data. - - // v.3.1.01.13 of the LuraTech PDF Compressor Server will - // sometimes generate an extraneous NULL byte at the end of - // arithmetic-coded symbol dictionary segments when numNewSyms - // == 0. Segments like this often occur for blank pages. - - error(getPos(), "%d extraneous byte%s after segment", - segExtraBytes, (segExtraBytes > 1) ? "s" : ""); - - // Burn through the remaining bytes -- inefficient, but - // hopefully we're not doing this much - - int trash; - for (int i = segExtraBytes; i > 0; i--) { - readByte(&trash); - } - - } else if (segExtraBytes < 0) { - - // If we read more bytes than we should have, according to the - // segment length field, note an error. - - error(getPos(), "Previous segment handler read too many bytes"); - - } - - } - - gfree(refSegs); - } - - return; - - syntaxError: - gfree(refSegs); - return; - - eofError2: - gfree(refSegs); - eofError1: - error(getPos(), "Unexpected EOF in JBIG2 stream"); -} - -GBool JBIG2Stream::readSymbolDictSeg(Guint segNum, Guint length, - Guint *refSegs, Guint nRefSegs) { - JBIG2SymbolDict *symbolDict; - JBIG2HuffmanTable *huffDHTable, *huffDWTable; - JBIG2HuffmanTable *huffBMSizeTable, *huffAggInstTable; - JBIG2Segment *seg; - GList *codeTables; - JBIG2SymbolDict *inputSymbolDict; - Guint flags, sdTemplate, sdrTemplate, huff, refAgg; - Guint huffDH, huffDW, huffBMSize, huffAggInst; - Guint contextUsed, contextRetained; - int sdATX[4], sdATY[4], sdrATX[2], sdrATY[2]; - Guint numExSyms, numNewSyms, numInputSyms, symCodeLen; - JBIG2Bitmap **bitmaps; - JBIG2Bitmap *collBitmap, *refBitmap; - Guint *symWidths; - Guint symHeight, symWidth, totalWidth, x, symID; - int dh, dw, refAggNum, refDX, refDY, bmSize; - GBool ex; - int run, cnt; - Guint i, j, k; - Guchar *p; - - symWidths = NULL; - - // symbol dictionary flags - if (!readUWord(&flags)) { - goto eofError; - } - sdTemplate = (flags >> 10) & 3; - sdrTemplate = (flags >> 12) & 1; - huff = flags & 1; - refAgg = (flags >> 1) & 1; - huffDH = (flags >> 2) & 3; - huffDW = (flags >> 4) & 3; - huffBMSize = (flags >> 6) & 1; - huffAggInst = (flags >> 7) & 1; - contextUsed = (flags >> 8) & 1; - contextRetained = (flags >> 9) & 1; - - // symbol dictionary AT flags - if (!huff) { - if (sdTemplate == 0) { - if (!readByte(&sdATX[0]) || - !readByte(&sdATY[0]) || - !readByte(&sdATX[1]) || - !readByte(&sdATY[1]) || - !readByte(&sdATX[2]) || - !readByte(&sdATY[2]) || - !readByte(&sdATX[3]) || - !readByte(&sdATY[3])) { - goto eofError; - } - } else { - if (!readByte(&sdATX[0]) || - !readByte(&sdATY[0])) { - goto eofError; - } - } - } - - // symbol dictionary refinement AT flags - if (refAgg && !sdrTemplate) { - if (!readByte(&sdrATX[0]) || - !readByte(&sdrATY[0]) || - !readByte(&sdrATX[1]) || - !readByte(&sdrATY[1])) { - goto eofError; - } - } - - // SDNUMEXSYMS and SDNUMNEWSYMS - if (!readULong(&numExSyms) || !readULong(&numNewSyms)) { - goto eofError; - } - - // get referenced segments: input symbol dictionaries and code tables - codeTables = new GList(); - numInputSyms = 0; - for (i = 0; i < nRefSegs; ++i) { - // This is need by bug 12014, returning gFalse makes it not crash - // but we end up with a empty page while acroread is able to render - // part of it - if ((seg = findSegment(refSegs[i]))) { - if (seg->getType() == jbig2SegSymbolDict) { - j = ((JBIG2SymbolDict *)seg)->getSize(); - if (numInputSyms > UINT_MAX - j) { - error(getPos(), "Too many input symbols in JBIG2 symbol dictionary"); - delete codeTables; - goto eofError; - } - numInputSyms += j; - } else if (seg->getType() == jbig2SegCodeTable) { - codeTables->append(seg); - } - } else { - delete codeTables; - return gFalse; - } - } - if (numInputSyms > UINT_MAX - numNewSyms) { - error(getPos(), "Too many input symbols in JBIG2 symbol dictionary"); - delete codeTables; - goto eofError; - } - - // compute symbol code length - symCodeLen = 0; - i = 1; - while (i < numInputSyms + numNewSyms) { - ++symCodeLen; - i <<= 1; - } - if (huff && symCodeLen == 0) { - symCodeLen = 1; - } - - // get the input symbol bitmaps - bitmaps = (JBIG2Bitmap **)gmallocn(numInputSyms + numNewSyms, - sizeof(JBIG2Bitmap *)); - for (i = 0; i < numInputSyms + numNewSyms; ++i) { - bitmaps[i] = NULL; - } - k = 0; - inputSymbolDict = NULL; - for (i = 0; i < nRefSegs; ++i) { - seg = findSegment(refSegs[i]); - if (seg != NULL && seg->getType() == jbig2SegSymbolDict) { - inputSymbolDict = (JBIG2SymbolDict *)seg; - for (j = 0; j < inputSymbolDict->getSize(); ++j) { - bitmaps[k++] = inputSymbolDict->getBitmap(j); - } - } - } - - // get the Huffman tables - huffDHTable = huffDWTable = NULL; // make gcc happy - huffBMSizeTable = huffAggInstTable = NULL; // make gcc happy - i = 0; - if (huff) { - if (huffDH == 0) { - huffDHTable = huffTableD; - } else if (huffDH == 1) { - huffDHTable = huffTableE; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffDW == 0) { - huffDWTable = huffTableB; - } else if (huffDW == 1) { - huffDWTable = huffTableC; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffBMSize == 0) { - huffBMSizeTable = huffTableA; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffBMSizeTable = - ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffAggInst == 0) { - huffAggInstTable = huffTableA; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffAggInstTable = - ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - } - delete codeTables; - - // set up the Huffman decoder - if (huff) { - huffDecoder->reset(); - - // set up the arithmetic decoder - } else { - if (contextUsed && inputSymbolDict) { - resetGenericStats(sdTemplate, inputSymbolDict->getGenericRegionStats()); - } else { - resetGenericStats(sdTemplate, NULL); - } - resetIntStats(symCodeLen); - arithDecoder->start(); - } - - // set up the arithmetic decoder for refinement/aggregation - if (refAgg) { - if (contextUsed && inputSymbolDict) { - resetRefinementStats(sdrTemplate, - inputSymbolDict->getRefinementRegionStats()); - } else { - resetRefinementStats(sdrTemplate, NULL); - } - } - - // allocate symbol widths storage - if (huff && !refAgg) { - symWidths = (Guint *)gmallocn(numNewSyms, sizeof(Guint)); - } - - symHeight = 0; - i = 0; - while (i < numNewSyms) { - - // read the height class delta height - if (huff) { - huffDecoder->decodeInt(&dh, huffDHTable); - } else { - arithDecoder->decodeInt(&dh, iadhStats); - } - if (dh < 0 && (Guint)-dh >= symHeight) { - error(getPos(), "Bad delta-height value in JBIG2 symbol dictionary"); - goto syntaxError; - } - symHeight += dh; - symWidth = 0; - totalWidth = 0; - j = i; - - // read the symbols in this height class - while (1) { - - // read the delta width - if (huff) { - if (!huffDecoder->decodeInt(&dw, huffDWTable)) { - break; - } - } else { - if (!arithDecoder->decodeInt(&dw, iadwStats)) { - break; - } - } - if (dw < 0 && (Guint)-dw >= symWidth) { - error(getPos(), "Bad delta-height value in JBIG2 symbol dictionary"); - goto syntaxError; - } - symWidth += dw; - if (i >= numNewSyms) { - error(getPos(), "Too many symbols in JBIG2 symbol dictionary"); - goto syntaxError; - } - - // using a collective bitmap, so don't read a bitmap here - if (huff && !refAgg) { - symWidths[i] = symWidth; - totalWidth += symWidth; - - // refinement/aggregate coding - } else if (refAgg) { - if (huff) { - if (!huffDecoder->decodeInt(&refAggNum, huffAggInstTable)) { - break; - } - } else { - if (!arithDecoder->decodeInt(&refAggNum, iaaiStats)) { - break; - } - } -#if 0 //~ This special case was added about a year before the final draft - //~ of the JBIG2 spec was released. I have encountered some old - //~ JBIG2 images that predate it. - if (0) { -#else - if (refAggNum == 1) { -#endif - if (huff) { - symID = huffDecoder->readBits(symCodeLen); - huffDecoder->decodeInt(&refDX, huffTableO); - huffDecoder->decodeInt(&refDY, huffTableO); - huffDecoder->decodeInt(&bmSize, huffTableA); - huffDecoder->reset(); - arithDecoder->start(); - } else { - symID = arithDecoder->decodeIAID(symCodeLen, iaidStats); - arithDecoder->decodeInt(&refDX, iardxStats); - arithDecoder->decodeInt(&refDY, iardyStats); - } - if (symID >= numInputSyms + i) { - error(getPos(), "Invalid symbol ID in JBIG2 symbol dictionary"); - goto syntaxError; - } - refBitmap = bitmaps[symID]; - bitmaps[numInputSyms + i] = - readGenericRefinementRegion(symWidth, symHeight, - sdrTemplate, gFalse, - refBitmap, refDX, refDY, - sdrATX, sdrATY); - //~ do we need to use the bmSize value here (in Huffman mode)? - } else { - bitmaps[numInputSyms + i] = - readTextRegion(huff, gTrue, symWidth, symHeight, - refAggNum, 0, numInputSyms + i, NULL, - symCodeLen, bitmaps, 0, 0, 0, 1, 0, - huffTableF, huffTableH, huffTableK, huffTableO, - huffTableO, huffTableO, huffTableO, huffTableA, - sdrTemplate, sdrATX, sdrATY); - } - - // non-ref/agg coding - } else { - bitmaps[numInputSyms + i] = - readGenericBitmap(gFalse, symWidth, symHeight, - sdTemplate, gFalse, gFalse, NULL, - sdATX, sdATY, 0); - } - - ++i; - } - - // read the collective bitmap - if (huff && !refAgg) { - huffDecoder->decodeInt(&bmSize, huffBMSizeTable); - huffDecoder->reset(); - if (bmSize == 0) { - collBitmap = new JBIG2Bitmap(0, totalWidth, symHeight); - bmSize = symHeight * ((totalWidth + 7) >> 3); - p = collBitmap->getDataPtr(); - for (k = 0; k < (Guint)bmSize; ++k) { - *p++ = curStr->getChar(); - } - } else { - collBitmap = readGenericBitmap(gTrue, totalWidth, symHeight, - 0, gFalse, gFalse, NULL, NULL, NULL, - bmSize); - } - x = 0; - for (; j < i; ++j) { - bitmaps[numInputSyms + j] = - collBitmap->getSlice(x, 0, symWidths[j], symHeight); - x += symWidths[j]; - } - delete collBitmap; - } - } - - // create the symbol dict object - symbolDict = new JBIG2SymbolDict(segNum, numExSyms); - if (!symbolDict->isOk()) { - delete symbolDict; - goto syntaxError; - } - - // exported symbol list - i = j = 0; - ex = gFalse; - while (i < numInputSyms + numNewSyms) { - if (huff) { - huffDecoder->decodeInt(&run, huffTableA); - } else { - arithDecoder->decodeInt(&run, iaexStats); - } - if (i + run > numInputSyms + numNewSyms || - (ex && j + run > numExSyms)) { - error(getPos(), "Too many exported symbols in JBIG2 symbol dictionary"); - for ( ; j < numExSyms; ++j) symbolDict->setBitmap(j, NULL); - delete symbolDict; - goto syntaxError; - } - if (ex) { - for (cnt = 0; cnt < run; ++cnt) { - symbolDict->setBitmap(j++, bitmaps[i++]->copy()); - } - } else { - i += run; - } - ex = !ex; - } - if (j != numExSyms) { - error(getPos(), "Too few symbols in JBIG2 symbol dictionary"); - for ( ; j < numExSyms; ++j) symbolDict->setBitmap(j, NULL); - delete symbolDict; - goto syntaxError; - } - - for (i = 0; i < numNewSyms; ++i) { - delete bitmaps[numInputSyms + i]; - } - gfree(bitmaps); - if (symWidths) { - gfree(symWidths); - } - - // save the arithmetic decoder stats - if (!huff && contextRetained) { - symbolDict->setGenericRegionStats(genericRegionStats->copy()); - if (refAgg) { - symbolDict->setRefinementRegionStats(refinementRegionStats->copy()); - } - } - - // store the new symbol dict - segments->append(symbolDict); - - return gTrue; - - codeTableError: - error(getPos(), "Missing code table in JBIG2 symbol dictionary"); - delete codeTables; - - syntaxError: - for (i = 0; i < numNewSyms; ++i) { - if (bitmaps[numInputSyms + i]) { - delete bitmaps[numInputSyms + i]; - } - } - gfree(bitmaps); - if (symWidths) { - gfree(symWidths); - } - return gFalse; - - eofError: - error(getPos(), "Unexpected EOF in JBIG2 stream"); - return gFalse; -} - -void JBIG2Stream::readTextRegionSeg(Guint segNum, GBool imm, - GBool lossless, Guint length, - Guint *refSegs, Guint nRefSegs) { - JBIG2Bitmap *bitmap; - JBIG2HuffmanTable runLengthTab[36]; - JBIG2HuffmanTable *symCodeTab; - JBIG2HuffmanTable *huffFSTable, *huffDSTable, *huffDTTable; - JBIG2HuffmanTable *huffRDWTable, *huffRDHTable; - JBIG2HuffmanTable *huffRDXTable, *huffRDYTable, *huffRSizeTable; - JBIG2Segment *seg; - GList *codeTables; - JBIG2SymbolDict *symbolDict; - JBIG2Bitmap **syms; - Guint w, h, x, y, segInfoFlags, extCombOp; - Guint flags, huff, refine, logStrips, refCorner, transposed; - Guint combOp, defPixel, templ; - int sOffset; - Guint huffFlags, huffFS, huffDS, huffDT; - Guint huffRDW, huffRDH, huffRDX, huffRDY, huffRSize; - Guint numInstances, numSyms, symCodeLen; - int atx[2], aty[2]; - Guint i, k, kk; - int j; - - // region segment info field - if (!readULong(&w) || !readULong(&h) || - !readULong(&x) || !readULong(&y) || - !readUByte(&segInfoFlags)) { - goto eofError; - } - extCombOp = segInfoFlags & 7; - - // rest of the text region header - if (!readUWord(&flags)) { - goto eofError; - } - huff = flags & 1; - refine = (flags >> 1) & 1; - logStrips = (flags >> 2) & 3; - refCorner = (flags >> 4) & 3; - transposed = (flags >> 6) & 1; - combOp = (flags >> 7) & 3; - defPixel = (flags >> 9) & 1; - sOffset = (flags >> 10) & 0x1f; - if (sOffset & 0x10) { - sOffset |= -1 - 0x0f; - } - templ = (flags >> 15) & 1; - huffFS = huffDS = huffDT = 0; // make gcc happy - huffRDW = huffRDH = huffRDX = huffRDY = huffRSize = 0; // make gcc happy - if (huff) { - if (!readUWord(&huffFlags)) { - goto eofError; - } - huffFS = huffFlags & 3; - huffDS = (huffFlags >> 2) & 3; - huffDT = (huffFlags >> 4) & 3; - huffRDW = (huffFlags >> 6) & 3; - huffRDH = (huffFlags >> 8) & 3; - huffRDX = (huffFlags >> 10) & 3; - huffRDY = (huffFlags >> 12) & 3; - huffRSize = (huffFlags >> 14) & 1; - } - if (refine && templ == 0) { - if (!readByte(&atx[0]) || !readByte(&aty[0]) || - !readByte(&atx[1]) || !readByte(&aty[1])) { - goto eofError; - } - } - if (!readULong(&numInstances)) { - goto eofError; - } - - // get symbol dictionaries and tables - codeTables = new GList(); - numSyms = 0; - for (i = 0; i < nRefSegs; ++i) { - if ((seg = findSegment(refSegs[i]))) { - if (seg->getType() == jbig2SegSymbolDict) { - numSyms += ((JBIG2SymbolDict *)seg)->getSize(); - } else if (seg->getType() == jbig2SegCodeTable) { - codeTables->append(seg); - } - } else { - error(getPos(), "Invalid segment reference in JBIG2 text region"); - delete codeTables; - return; - } - } - symCodeLen = 0; - i = 1; - while (i < numSyms) { - ++symCodeLen; - i <<= 1; - } - if (huff && symCodeLen == 0) { - symCodeLen = 1; - } - - // get the symbol bitmaps - syms = (JBIG2Bitmap **)gmallocn(numSyms, sizeof(JBIG2Bitmap *)); - kk = 0; - for (i = 0; i < nRefSegs; ++i) { - if ((seg = findSegment(refSegs[i]))) { - if (seg->getType() == jbig2SegSymbolDict) { - symbolDict = (JBIG2SymbolDict *)seg; - for (k = 0; k < symbolDict->getSize(); ++k) { - syms[kk++] = symbolDict->getBitmap(k); - } - } - } - } - - // get the Huffman tables - huffFSTable = huffDSTable = huffDTTable = NULL; // make gcc happy - huffRDWTable = huffRDHTable = NULL; // make gcc happy - huffRDXTable = huffRDYTable = huffRSizeTable = NULL; // make gcc happy - i = 0; - if (huff) { - if (huffFS == 0) { - huffFSTable = huffTableF; - } else if (huffFS == 1) { - huffFSTable = huffTableG; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffFSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffDS == 0) { - huffDSTable = huffTableH; - } else if (huffDS == 1) { - huffDSTable = huffTableI; - } else if (huffDS == 2) { - huffDSTable = huffTableJ; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffDSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffDT == 0) { - huffDTTable = huffTableK; - } else if (huffDT == 1) { - huffDTTable = huffTableL; - } else if (huffDT == 2) { - huffDTTable = huffTableM; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffDTTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRDW == 0) { - huffRDWTable = huffTableN; - } else if (huffRDW == 1) { - huffRDWTable = huffTableO; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffRDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRDH == 0) { - huffRDHTable = huffTableN; - } else if (huffRDH == 1) { - huffRDHTable = huffTableO; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffRDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRDX == 0) { - huffRDXTable = huffTableN; - } else if (huffRDX == 1) { - huffRDXTable = huffTableO; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffRDXTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRDY == 0) { - huffRDYTable = huffTableN; - } else if (huffRDY == 1) { - huffRDYTable = huffTableO; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffRDYTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - if (huffRSize == 0) { - huffRSizeTable = huffTableA; - } else { - if (i >= (Guint)codeTables->getLength()) { - goto codeTableError; - } - huffRSizeTable = - ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable(); - } - } - delete codeTables; - - // symbol ID Huffman decoding table - if (huff) { - huffDecoder->reset(); - for (i = 0; i < 32; ++i) { - runLengthTab[i].val = i; - runLengthTab[i].prefixLen = huffDecoder->readBits(4); - runLengthTab[i].rangeLen = 0; - } - runLengthTab[32].val = 0x103; - runLengthTab[32].prefixLen = huffDecoder->readBits(4); - runLengthTab[32].rangeLen = 2; - runLengthTab[33].val = 0x203; - runLengthTab[33].prefixLen = huffDecoder->readBits(4); - runLengthTab[33].rangeLen = 3; - runLengthTab[34].val = 0x20b; - runLengthTab[34].prefixLen = huffDecoder->readBits(4); - runLengthTab[34].rangeLen = 7; - runLengthTab[35].prefixLen = 0; - runLengthTab[35].rangeLen = jbig2HuffmanEOT; - huffDecoder->buildTable(runLengthTab, 35); - symCodeTab = (JBIG2HuffmanTable *)gmallocn(numSyms + 1, - sizeof(JBIG2HuffmanTable)); - for (i = 0; i < numSyms; ++i) { - symCodeTab[i].val = i; - symCodeTab[i].rangeLen = 0; - } - i = 0; - while (i < numSyms) { - huffDecoder->decodeInt(&j, runLengthTab); - if (j > 0x200) { - for (j -= 0x200; j && i < numSyms; --j) { - symCodeTab[i++].prefixLen = 0; - } - } else if (j > 0x100) { - for (j -= 0x100; j && i < numSyms; --j) { - symCodeTab[i].prefixLen = symCodeTab[i-1].prefixLen; - ++i; - } - } else { - symCodeTab[i++].prefixLen = j; - } - } - symCodeTab[numSyms].prefixLen = 0; - symCodeTab[numSyms].rangeLen = jbig2HuffmanEOT; - huffDecoder->buildTable(symCodeTab, numSyms); - huffDecoder->reset(); - - // set up the arithmetic decoder - } else { - symCodeTab = NULL; - resetIntStats(symCodeLen); - arithDecoder->start(); - } - if (refine) { - resetRefinementStats(templ, NULL); - } - - bitmap = readTextRegion(huff, refine, w, h, numInstances, - logStrips, numSyms, symCodeTab, symCodeLen, syms, - defPixel, combOp, transposed, refCorner, sOffset, - huffFSTable, huffDSTable, huffDTTable, - huffRDWTable, huffRDHTable, - huffRDXTable, huffRDYTable, huffRSizeTable, - templ, atx, aty); - - gfree(syms); - - if (bitmap) { - // combine the region bitmap into the page bitmap - if (imm) { - if (pageH == 0xffffffff && y + h > curPageH) { - pageBitmap->expand(y + h, pageDefPixel); - } - pageBitmap->combine(bitmap, x, y, extCombOp); - delete bitmap; - - // store the region bitmap - } else { - bitmap->setSegNum(segNum); - segments->append(bitmap); - } - } - - // clean up the Huffman decoder - if (huff) { - gfree(symCodeTab); - } - - return; - - codeTableError: - error(getPos(), "Missing code table in JBIG2 text region"); - gfree(codeTables); - delete syms; - return; - - eofError: - error(getPos(), "Unexpected EOF in JBIG2 stream"); - return; -} - -JBIG2Bitmap *JBIG2Stream::readTextRegion(GBool huff, GBool refine, - int w, int h, - Guint numInstances, - Guint logStrips, - int numSyms, - JBIG2HuffmanTable *symCodeTab, - Guint symCodeLen, - JBIG2Bitmap **syms, - Guint defPixel, Guint combOp, - Guint transposed, Guint refCorner, - int sOffset, - JBIG2HuffmanTable *huffFSTable, - JBIG2HuffmanTable *huffDSTable, - JBIG2HuffmanTable *huffDTTable, - JBIG2HuffmanTable *huffRDWTable, - JBIG2HuffmanTable *huffRDHTable, - JBIG2HuffmanTable *huffRDXTable, - JBIG2HuffmanTable *huffRDYTable, - JBIG2HuffmanTable *huffRSizeTable, - Guint templ, - int *atx, int *aty) { - JBIG2Bitmap *bitmap; - JBIG2Bitmap *symbolBitmap; - Guint strips; - int t, dt, tt, s, ds, sFirst, j; - int rdw, rdh, rdx, rdy, ri, refDX, refDY, bmSize; - Guint symID, inst, bw, bh; - - strips = 1 << logStrips; - - // allocate the bitmap - bitmap = new JBIG2Bitmap(0, w, h); - if (!bitmap->isOk()) { - delete bitmap; - return NULL; - } - if (defPixel) { - bitmap->clearToOne(); - } else { - bitmap->clearToZero(); - } - - // decode initial T value - if (huff) { - huffDecoder->decodeInt(&t, huffDTTable); - } else { - arithDecoder->decodeInt(&t, iadtStats); - } - t *= -(int)strips; - - inst = 0; - sFirst = 0; - while (inst < numInstances) { - - // decode delta-T - if (huff) { - huffDecoder->decodeInt(&dt, huffDTTable); - } else { - arithDecoder->decodeInt(&dt, iadtStats); - } - t += dt * strips; - - // first S value - if (huff) { - huffDecoder->decodeInt(&ds, huffFSTable); - } else { - arithDecoder->decodeInt(&ds, iafsStats); - } - sFirst += ds; - s = sFirst; - - // read the instances - while (1) { - - // T value - if (strips == 1) { - dt = 0; - } else if (huff) { - dt = huffDecoder->readBits(logStrips); - } else { - arithDecoder->decodeInt(&dt, iaitStats); - } - tt = t + dt; - - // symbol ID - if (huff) { - if (symCodeTab) { - huffDecoder->decodeInt(&j, symCodeTab); - symID = (Guint)j; - } else { - symID = huffDecoder->readBits(symCodeLen); - } - } else { - symID = arithDecoder->decodeIAID(symCodeLen, iaidStats); - } - - if (symID >= (Guint)numSyms) { - error(getPos(), "Invalid symbol number in JBIG2 text region"); - } else { - - // get the symbol bitmap - symbolBitmap = NULL; - if (refine) { - if (huff) { - ri = (int)huffDecoder->readBit(); - } else { - arithDecoder->decodeInt(&ri, iariStats); - } - } else { - ri = 0; - } - if (ri) { - GBool decodeSuccess; - if (huff) { - decodeSuccess = huffDecoder->decodeInt(&rdw, huffRDWTable); - decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdh, huffRDHTable); - decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdx, huffRDXTable); - decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&rdy, huffRDYTable); - decodeSuccess = decodeSuccess && huffDecoder->decodeInt(&bmSize, huffRSizeTable); - huffDecoder->reset(); - arithDecoder->start(); - } else { - decodeSuccess = arithDecoder->decodeInt(&rdw, iardwStats); - decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdh, iardhStats); - decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdx, iardxStats); - decodeSuccess = decodeSuccess && arithDecoder->decodeInt(&rdy, iardyStats); - } - - if (decodeSuccess && syms[symID]) - { - refDX = ((rdw >= 0) ? rdw : rdw - 1) / 2 + rdx; - refDY = ((rdh >= 0) ? rdh : rdh - 1) / 2 + rdy; - - symbolBitmap = - readGenericRefinementRegion(rdw + syms[symID]->getWidth(), - rdh + syms[symID]->getHeight(), - templ, gFalse, syms[symID], - refDX, refDY, atx, aty); - } - //~ do we need to use the bmSize value here (in Huffman mode)? - } else { - symbolBitmap = syms[symID]; - } - - if (symbolBitmap) { - // combine the symbol bitmap into the region bitmap - //~ something is wrong here - refCorner shouldn't degenerate into - //~ two cases - bw = symbolBitmap->getWidth() - 1; - bh = symbolBitmap->getHeight() - 1; - if (transposed) { - switch (refCorner) { - case 0: // bottom left - bitmap->combine(symbolBitmap, tt, s, combOp); - break; - case 1: // top left - bitmap->combine(symbolBitmap, tt, s, combOp); - break; - case 2: // bottom right - bitmap->combine(symbolBitmap, tt - bw, s, combOp); - break; - case 3: // top right - bitmap->combine(symbolBitmap, tt - bw, s, combOp); - break; - } - s += bh; - } else { - switch (refCorner) { - case 0: // bottom left - bitmap->combine(symbolBitmap, s, tt - bh, combOp); - break; - case 1: // top left - bitmap->combine(symbolBitmap, s, tt, combOp); - break; - case 2: // bottom right - bitmap->combine(symbolBitmap, s, tt - bh, combOp); - break; - case 3: // top right - bitmap->combine(symbolBitmap, s, tt, combOp); - break; - } - s += bw; - } - if (ri) { - delete symbolBitmap; - } - } else { - // NULL symbolBitmap only happens on error - delete bitmap; - return NULL; - } - } - - // next instance - ++inst; - - // next S value - if (huff) { - if (!huffDecoder->decodeInt(&ds, huffDSTable)) { - break; - } - } else { - if (!arithDecoder->decodeInt(&ds, iadsStats)) { - break; - } - } - s += sOffset + ds; - } - } - - return bitmap; -} - -void JBIG2Stream::readPatternDictSeg(Guint segNum, Guint length) { - JBIG2PatternDict *patternDict; - JBIG2Bitmap *bitmap; - Guint flags, patternW, patternH, grayMax, templ, mmr; - int atx[4], aty[4]; - Guint i, x; - - // halftone dictionary flags, pattern width and height, max gray value - if (!readUByte(&flags) || - !readUByte(&patternW) || - !readUByte(&patternH) || - !readULong(&grayMax)) { - goto eofError; - } - templ = (flags >> 1) & 3; - mmr = flags & 1; - - // set up the arithmetic decoder - if (!mmr) { - resetGenericStats(templ, NULL); - arithDecoder->start(); - } - - // read the bitmap - atx[0] = -(int)patternW; aty[0] = 0; - atx[1] = -3; aty[1] = -1; - atx[2] = 2; aty[2] = -2; - atx[3] = -2; aty[3] = -2; - bitmap = readGenericBitmap(mmr, (grayMax + 1) * patternW, patternH, - templ, gFalse, gFalse, NULL, - atx, aty, length - 7); - - // create the pattern dict object - patternDict = new JBIG2PatternDict(segNum, grayMax + 1); - - // split up the bitmap - x = 0; - for (i = 0; i <= grayMax; ++i) { - patternDict->setBitmap(i, bitmap->getSlice(x, 0, patternW, patternH)); - x += patternW; - } - - // free memory - delete bitmap; - - // store the new pattern dict - segments->append(patternDict); - - return; - - eofError: - error(getPos(), "Unexpected EOF in JBIG2 stream"); -} - -void JBIG2Stream::readHalftoneRegionSeg(Guint segNum, GBool imm, - GBool lossless, Guint length, - Guint *refSegs, Guint nRefSegs) { - JBIG2Bitmap *bitmap; - JBIG2Segment *seg; - JBIG2PatternDict *patternDict; - JBIG2Bitmap *skipBitmap; - Guint *grayImg; - JBIG2Bitmap *grayBitmap; - JBIG2Bitmap *patternBitmap; - Guint w, h, x, y, segInfoFlags, extCombOp; - Guint flags, mmr, templ, enableSkip, combOp; - Guint gridW, gridH, stepX, stepY, patW, patH; - int atx[4], aty[4]; - int gridX, gridY, xx, yy, bit, j; - Guint bpp, m, n, i; - - // region segment info field - if (!readULong(&w) || !readULong(&h) || - !readULong(&x) || !readULong(&y) || - !readUByte(&segInfoFlags)) { - goto eofError; - } - extCombOp = segInfoFlags & 7; - - // rest of the halftone region header - if (!readUByte(&flags)) { - goto eofError; - } - mmr = flags & 1; - templ = (flags >> 1) & 3; - enableSkip = (flags >> 3) & 1; - combOp = (flags >> 4) & 7; - if (!readULong(&gridW) || !readULong(&gridH) || - !readLong(&gridX) || !readLong(&gridY) || - !readUWord(&stepX) || !readUWord(&stepY)) { - goto eofError; - } - if (w == 0 || h == 0 || w >= INT_MAX / h) { - error(getPos(), "Bad bitmap size in JBIG2 halftone segment"); - return; - } - if (gridH == 0 || gridW >= INT_MAX / gridH) { - error(getPos(), "Bad grid size in JBIG2 halftone segment"); - return; - } - - // get pattern dictionary - if (nRefSegs != 1) { - error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); - return; - } - seg = findSegment(refSegs[0]); - if (seg == NULL || seg->getType() != jbig2SegPatternDict) { - error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment"); - return; - } - - patternDict = (JBIG2PatternDict *)seg; - bpp = 0; - i = 1; - while (i < patternDict->getSize()) { - ++bpp; - i <<= 1; - } - patW = patternDict->getBitmap(0)->getWidth(); - patH = patternDict->getBitmap(0)->getHeight(); - - // set up the arithmetic decoder - if (!mmr) { - resetGenericStats(templ, NULL); - arithDecoder->start(); - } - - // allocate the bitmap - bitmap = new JBIG2Bitmap(segNum, w, h); - if (flags & 0x80) { // HDEFPIXEL - bitmap->clearToOne(); - } else { - bitmap->clearToZero(); - } - - // compute the skip bitmap - skipBitmap = NULL; - if (enableSkip) { - skipBitmap = new JBIG2Bitmap(0, gridW, gridH); - skipBitmap->clearToZero(); - for (m = 0; m < gridH; ++m) { - for (n = 0; n < gridW; ++n) { - xx = gridX + m * stepY + n * stepX; - yy = gridY + m * stepX - n * stepY; - if (((xx + (int)patW) >> 8) <= 0 || (xx >> 8) >= (int)w || - ((yy + (int)patH) >> 8) <= 0 || (yy >> 8) >= (int)h) { - skipBitmap->setPixel(n, m); - } - } - } - } - - // read the gray-scale image - grayImg = (Guint *)gmallocn(gridW * gridH, sizeof(Guint)); - memset(grayImg, 0, gridW * gridH * sizeof(Guint)); - atx[0] = templ <= 1 ? 3 : 2; aty[0] = -1; - atx[1] = -3; aty[1] = -1; - atx[2] = 2; aty[2] = -2; - atx[3] = -2; aty[3] = -2; - for (j = bpp - 1; j >= 0; --j) { - grayBitmap = readGenericBitmap(mmr, gridW, gridH, templ, gFalse, - enableSkip, skipBitmap, atx, aty, -1); - i = 0; - for (m = 0; m < gridH; ++m) { - for (n = 0; n < gridW; ++n) { - bit = grayBitmap->getPixel(n, m) ^ (grayImg[i] & 1); - grayImg[i] = (grayImg[i] << 1) | bit; - ++i; - } - } - delete grayBitmap; - } - - // decode the image - i = 0; - for (m = 0; m < gridH; ++m) { - xx = gridX + m * stepY; - yy = gridY + m * stepX; - for (n = 0; n < gridW; ++n) { - if (!(enableSkip && skipBitmap->getPixel(n, m))) { - patternBitmap = patternDict->getBitmap(grayImg[i]); - bitmap->combine(patternBitmap, xx >> 8, yy >> 8, combOp); - } - xx += stepX; - yy -= stepY; - ++i; - } - } - - gfree(grayImg); - if (skipBitmap) { - delete skipBitmap; - } - - // combine the region bitmap into the page bitmap - if (imm) { - if (pageH == 0xffffffff && y + h > curPageH) { - pageBitmap->expand(y + h, pageDefPixel); - } - pageBitmap->combine(bitmap, x, y, extCombOp); - delete bitmap; - - // store the region bitmap - } else { - segments->append(bitmap); - } - - return; - - eofError: - error(getPos(), "Unexpected EOF in JBIG2 stream"); -} - -void JBIG2Stream::readGenericRegionSeg(Guint segNum, GBool imm, - GBool lossless, Guint length) { - JBIG2Bitmap *bitmap; - Guint w, h, x, y, segInfoFlags, extCombOp; - Guint flags, mmr, templ, tpgdOn; - int atx[4], aty[4]; - - // region segment info field - if (!readULong(&w) || !readULong(&h) || - !readULong(&x) || !readULong(&y) || - !readUByte(&segInfoFlags)) { - goto eofError; - } - extCombOp = segInfoFlags & 7; - - // rest of the generic region segment header - if (!readUByte(&flags)) { - goto eofError; - } - mmr = flags & 1; - templ = (flags >> 1) & 3; - tpgdOn = (flags >> 3) & 1; - - // AT flags - if (!mmr) { - if (templ == 0) { - if (!readByte(&atx[0]) || - !readByte(&aty[0]) || - !readByte(&atx[1]) || - !readByte(&aty[1]) || - !readByte(&atx[2]) || - !readByte(&aty[2]) || - !readByte(&atx[3]) || - !readByte(&aty[3])) { - goto eofError; - } - } else { - if (!readByte(&atx[0]) || - !readByte(&aty[0])) { - goto eofError; - } - } - } - - // set up the arithmetic decoder - if (!mmr) { - resetGenericStats(templ, NULL); - arithDecoder->start(); - } - - // read the bitmap - bitmap = readGenericBitmap(mmr, w, h, templ, tpgdOn, gFalse, - NULL, atx, aty, mmr ? length - 18 : 0); - if (!bitmap) - return; - - // combine the region bitmap into the page bitmap - if (imm) { - if (pageH == 0xffffffff && y + h > curPageH) { - pageBitmap->expand(y + h, pageDefPixel); - } - pageBitmap->combine(bitmap, x, y, extCombOp); - delete bitmap; - - // store the region bitmap - } else { - bitmap->setSegNum(segNum); - segments->append(bitmap); - } - - return; - - eofError: - error(getPos(), "Unexpected EOF in JBIG2 stream"); -} - -inline void JBIG2Stream::mmrAddPixels(int a1, int blackPixels, - int *codingLine, int *a0i, int w) { - if (a1 > codingLine[*a0i]) { - if (a1 > w) { - error(getPos(), "JBIG2 MMR row is wrong length (%d)", a1); - a1 = w; - } - if ((*a0i & 1) ^ blackPixels) { - ++*a0i; - } - codingLine[*a0i] = a1; - } -} - -inline void JBIG2Stream::mmrAddPixelsNeg(int a1, int blackPixels, - int *codingLine, int *a0i, int w) { - if (a1 > codingLine[*a0i]) { - if (a1 > w) { - error(getPos(), "JBIG2 MMR row is wrong length (%d)", a1); - a1 = w; - } - if ((*a0i & 1) ^ blackPixels) { - ++*a0i; - } - codingLine[*a0i] = a1; - } else if (a1 < codingLine[*a0i]) { - if (a1 < 0) { - error(getPos(), "Invalid JBIG2 MMR code"); - a1 = 0; - } - while (*a0i > 0 && a1 <= codingLine[*a0i - 1]) { - --*a0i; - } - codingLine[*a0i] = a1; - } -} - -JBIG2Bitmap *JBIG2Stream::readGenericBitmap(GBool mmr, int w, int h, - int templ, GBool tpgdOn, - GBool useSkip, JBIG2Bitmap *skip, - int *atx, int *aty, - int mmrDataLength) { - JBIG2Bitmap *bitmap; - GBool ltp; - Guint ltpCX, cx, cx0, cx1, cx2; - JBIG2BitmapPtr cxPtr0 = {0}, cxPtr1 = {0}; - JBIG2BitmapPtr atPtr0 = {0}, atPtr1 = {0}, atPtr2 = {0}, atPtr3 = {0}; - int *refLine, *codingLine; - int code1, code2, code3; - int x, y, a0i, b1i, blackPixels, pix, i; - - bitmap = new JBIG2Bitmap(0, w, h); - if (!bitmap->isOk()) { - delete bitmap; - return NULL; - } - bitmap->clearToZero(); - - //----- MMR decode - - if (mmr) { - - mmrDecoder->reset(); - if (w > INT_MAX - 2) { - error(getPos(), "Bad width in JBIG2 generic bitmap"); - // force a call to gmalloc(-1), which will throw an exception - w = -3; - } - // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = w - // ---> max codingLine size = w + 1 - // refLine has one extra guard entry at the end - // ---> max refLine size = w + 2 - codingLine = (int *)gmallocn(w + 1, sizeof(int)); - refLine = (int *)gmallocn(w + 2, sizeof(int)); - for (i = 0; i < w + 1; ++i) codingLine[i] = w; - - for (y = 0; y < h; ++y) { - - // copy coding line to ref line - for (i = 0; codingLine[i] < w; ++i) { - refLine[i] = codingLine[i]; - } - refLine[i++] = w; - refLine[i] = w; - - // decode a line - codingLine[0] = 0; - a0i = 0; - b1i = 0; - blackPixels = 0; - // invariant: - // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] <= w - // exception at left edge: - // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible - // exception at right edge: - // refLine[b1i] = refLine[b1i+1] = w is possible - while (codingLine[a0i] < w) { - code1 = mmrDecoder->get2DCode(); - switch (code1) { - case twoDimPass: - mmrAddPixels(refLine[b1i + 1], blackPixels, codingLine, &a0i, w); - if (refLine[b1i + 1] < w) { - b1i += 2; - } - break; - case twoDimHoriz: - code1 = code2 = 0; - if (blackPixels) { - do { - code1 += code3 = mmrDecoder->getBlackCode(); - } while (code3 >= 64); - do { - code2 += code3 = mmrDecoder->getWhiteCode(); - } while (code3 >= 64); - } else { - do { - code1 += code3 = mmrDecoder->getWhiteCode(); - } while (code3 >= 64); - do { - code2 += code3 = mmrDecoder->getBlackCode(); - } while (code3 >= 64); - } - mmrAddPixels(codingLine[a0i] + code1, blackPixels, - codingLine, &a0i, w); - if (codingLine[a0i] < w) { - mmrAddPixels(codingLine[a0i] + code2, blackPixels ^ 1, - codingLine, &a0i, w); - } - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { - b1i += 2; - } - break; - case twoDimVertR3: - mmrAddPixels(refLine[b1i] + 3, blackPixels, codingLine, &a0i, w); - blackPixels ^= 1; - if (codingLine[a0i] < w) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { - b1i += 2; - } - } - break; - case twoDimVertR2: - mmrAddPixels(refLine[b1i] + 2, blackPixels, codingLine, &a0i, w); - blackPixels ^= 1; - if (codingLine[a0i] < w) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { - b1i += 2; - } - } - break; - case twoDimVertR1: - mmrAddPixels(refLine[b1i] + 1, blackPixels, codingLine, &a0i, w); - blackPixels ^= 1; - if (codingLine[a0i] < w) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { - b1i += 2; - } - } - break; - case twoDimVert0: - mmrAddPixels(refLine[b1i], blackPixels, codingLine, &a0i, w); - blackPixels ^= 1; - if (codingLine[a0i] < w) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { - b1i += 2; - } - } - break; - case twoDimVertL3: - mmrAddPixelsNeg(refLine[b1i] - 3, blackPixels, codingLine, &a0i, w); - blackPixels ^= 1; - if (codingLine[a0i] < w) { - if (b1i > 0) { - --b1i; - } else { - ++b1i; - } - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { - b1i += 2; - } - } - break; - case twoDimVertL2: - mmrAddPixelsNeg(refLine[b1i] - 2, blackPixels, codingLine, &a0i, w); - blackPixels ^= 1; - if (codingLine[a0i] < w) { - if (b1i > 0) { - --b1i; - } else { - ++b1i; - } - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { - b1i += 2; - } - } - break; - case twoDimVertL1: - mmrAddPixelsNeg(refLine[b1i] - 1, blackPixels, codingLine, &a0i, w); - blackPixels ^= 1; - if (codingLine[a0i] < w) { - if (b1i > 0) { - --b1i; - } else { - ++b1i; - } - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < w) { - b1i += 2; - } - } - break; - case EOF: - mmrAddPixels(w, 0, codingLine, &a0i, w); - break; - default: - error(getPos(), "Illegal code in JBIG2 MMR bitmap data"); - mmrAddPixels(w, 0, codingLine, &a0i, w); - break; - } - } - - // convert the run lengths to a bitmap line - i = 0; - while (1) { - for (x = codingLine[i]; x < codingLine[i+1]; ++x) { - bitmap->setPixel(x, y); - } - if (codingLine[i+1] >= w || codingLine[i+2] >= w) { - break; - } - i += 2; - } - } - - if (mmrDataLength >= 0) { - mmrDecoder->skipTo(mmrDataLength); - } else { - if (mmrDecoder->get24Bits() != 0x001001) { - error(getPos(), "Missing EOFB in JBIG2 MMR bitmap data"); - } - } - - gfree(refLine); - gfree(codingLine); - - //----- arithmetic decode - - } else { - // set up the typical row context - ltpCX = 0; // make gcc happy - if (tpgdOn) { - switch (templ) { - case 0: - ltpCX = 0x3953; // 001 11001 0101 0011 - break; - case 1: - ltpCX = 0x079a; // 0011 11001 101 0 - break; - case 2: - ltpCX = 0x0e3; // 001 1100 01 1 - break; - case 3: - ltpCX = 0x18a; // 01100 0101 1 - break; - } - } - - ltp = 0; - cx = cx0 = cx1 = cx2 = 0; // make gcc happy - for (y = 0; y < h; ++y) { - - // check for a "typical" (duplicate) row - if (tpgdOn) { - if (arithDecoder->decodeBit(ltpCX, genericRegionStats)) { - ltp = !ltp; - } - if (ltp) { - if (y > 0) { - bitmap->duplicateRow(y, y-1); - } - continue; - } - } - - switch (templ) { - case 0: - - // set up the context - bitmap->getPixelPtr(0, y-2, &cxPtr0); - cx0 = bitmap->nextPixel(&cxPtr0); - cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0); - bitmap->getPixelPtr(0, y-1, &cxPtr1); - cx1 = bitmap->nextPixel(&cxPtr1); - cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); - cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); - cx2 = 0; - bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0); - bitmap->getPixelPtr(atx[1], y + aty[1], &atPtr1); - bitmap->getPixelPtr(atx[2], y + aty[2], &atPtr2); - bitmap->getPixelPtr(atx[3], y + aty[3], &atPtr3); - - // decode the row - for (x = 0; x < w; ++x) { - - // build the context - cx = (cx0 << 13) | (cx1 << 8) | (cx2 << 4) | - (bitmap->nextPixel(&atPtr0) << 3) | - (bitmap->nextPixel(&atPtr1) << 2) | - (bitmap->nextPixel(&atPtr2) << 1) | - bitmap->nextPixel(&atPtr3); - - // check for a skipped pixel - if (useSkip && skip->getPixel(x, y)) { - pix = 0; - - // decode the pixel - } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { - bitmap->setPixel(x, y); - } - - // update the context - cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 0x07; - cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x1f; - cx2 = ((cx2 << 1) | pix) & 0x0f; - } - break; - - case 1: - - // set up the context - bitmap->getPixelPtr(0, y-2, &cxPtr0); - cx0 = bitmap->nextPixel(&cxPtr0); - cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0); - cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0); - bitmap->getPixelPtr(0, y-1, &cxPtr1); - cx1 = bitmap->nextPixel(&cxPtr1); - cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); - cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); - cx2 = 0; - bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0); - - // decode the row - for (x = 0; x < w; ++x) { - - // build the context - cx = (cx0 << 9) | (cx1 << 4) | (cx2 << 1) | - bitmap->nextPixel(&atPtr0); - - // check for a skipped pixel - if (useSkip && skip->getPixel(x, y)) { - pix = 0; - - // decode the pixel - } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { - bitmap->setPixel(x, y); - } - - // update the context - cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 0x0f; - cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x1f; - cx2 = ((cx2 << 1) | pix) & 0x07; - } - break; - - case 2: - - // set up the context - bitmap->getPixelPtr(0, y-2, &cxPtr0); - cx0 = bitmap->nextPixel(&cxPtr0); - cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0); - bitmap->getPixelPtr(0, y-1, &cxPtr1); - cx1 = bitmap->nextPixel(&cxPtr1); - cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); - cx2 = 0; - bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0); - - // decode the row - for (x = 0; x < w; ++x) { - - // build the context - cx = (cx0 << 7) | (cx1 << 3) | (cx2 << 1) | - bitmap->nextPixel(&atPtr0); - - // check for a skipped pixel - if (useSkip && skip->getPixel(x, y)) { - pix = 0; - - // decode the pixel - } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { - bitmap->setPixel(x, y); - } - - // update the context - cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 0x07; - cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x0f; - cx2 = ((cx2 << 1) | pix) & 0x03; - } - break; - - case 3: - - // set up the context - bitmap->getPixelPtr(0, y-1, &cxPtr1); - cx1 = bitmap->nextPixel(&cxPtr1); - cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1); - cx2 = 0; - bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0); - - // decode the row - for (x = 0; x < w; ++x) { - - // build the context - cx = (cx1 << 5) | (cx2 << 1) | - bitmap->nextPixel(&atPtr0); - - // check for a skipped pixel - if (useSkip && skip->getPixel(x, y)) { - pix = 0; - - // decode the pixel - } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) { - bitmap->setPixel(x, y); - } - - // update the context - cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x1f; - cx2 = ((cx2 << 1) | pix) & 0x0f; - } - break; - } - } - } - - return bitmap; -} - -void JBIG2Stream::readGenericRefinementRegionSeg(Guint segNum, GBool imm, - GBool lossless, Guint length, - Guint *refSegs, - Guint nRefSegs) { - JBIG2Bitmap *bitmap, *refBitmap; - Guint w, h, x, y, segInfoFlags, extCombOp; - Guint flags, templ, tpgrOn; - int atx[2], aty[2]; - JBIG2Segment *seg; - - // region segment info field - if (!readULong(&w) || !readULong(&h) || - !readULong(&x) || !readULong(&y) || - !readUByte(&segInfoFlags)) { - goto eofError; - } - extCombOp = segInfoFlags & 7; - - // rest of the generic refinement region segment header - if (!readUByte(&flags)) { - goto eofError; - } - templ = flags & 1; - tpgrOn = (flags >> 1) & 1; - - // AT flags - if (!templ) { - if (!readByte(&atx[0]) || !readByte(&aty[0]) || - !readByte(&atx[1]) || !readByte(&aty[1])) { - goto eofError; - } - } - - // resize the page bitmap if needed - if (nRefSegs == 0 || imm) { - if (pageH == 0xffffffff && y + h > curPageH) { - pageBitmap->expand(y + h, pageDefPixel); - } - } - - // get referenced bitmap - if (nRefSegs > 1) { - error(getPos(), "Bad reference in JBIG2 generic refinement segment"); - return; - } - if (nRefSegs == 1) { - seg = findSegment(refSegs[0]); - if (seg == NULL || seg->getType() != jbig2SegBitmap) { - error(getPos(), "Bad bitmap reference in JBIG2 generic refinement segment"); - return; - } - refBitmap = (JBIG2Bitmap *)seg; - } else { - refBitmap = pageBitmap->getSlice(x, y, w, h); - } - - // set up the arithmetic decoder - resetRefinementStats(templ, NULL); - arithDecoder->start(); - - // read - bitmap = readGenericRefinementRegion(w, h, templ, tpgrOn, - refBitmap, 0, 0, atx, aty); - - // combine the region bitmap into the page bitmap - if (imm) { - pageBitmap->combine(bitmap, x, y, extCombOp); - delete bitmap; - - // store the region bitmap - } else { - bitmap->setSegNum(segNum); - segments->append(bitmap); - } - - // delete the referenced bitmap - if (nRefSegs == 1) { - discardSegment(refSegs[0]); - } else { - delete refBitmap; - } - - return; - - eofError: - error(getPos(), "Unexpected EOF in JBIG2 stream"); -} - -JBIG2Bitmap *JBIG2Stream::readGenericRefinementRegion(int w, int h, - int templ, GBool tpgrOn, - JBIG2Bitmap *refBitmap, - int refDX, int refDY, - int *atx, int *aty) { - JBIG2Bitmap *bitmap; - GBool ltp; - Guint ltpCX, cx, cx0, cx2, cx3, cx4, tpgrCX0, tpgrCX1, tpgrCX2; - JBIG2BitmapPtr cxPtr0 = {0}; - JBIG2BitmapPtr cxPtr1 = {0}; - JBIG2BitmapPtr cxPtr2 = {0}; - JBIG2BitmapPtr cxPtr3 = {0}; - JBIG2BitmapPtr cxPtr4 = {0}; - JBIG2BitmapPtr cxPtr5 = {0}; - JBIG2BitmapPtr cxPtr6 = {0}; - JBIG2BitmapPtr tpgrCXPtr0 = {0}; - JBIG2BitmapPtr tpgrCXPtr1 = {0}; - JBIG2BitmapPtr tpgrCXPtr2 = {0}; - int x, y, pix; - - bitmap = new JBIG2Bitmap(0, w, h); - if (!bitmap->isOk()) - { - delete bitmap; - return NULL; - } - bitmap->clearToZero(); - - // set up the typical row context - if (templ) { - ltpCX = 0x008; - } else { - ltpCX = 0x0010; - } - - ltp = 0; - for (y = 0; y < h; ++y) { - - if (templ) { - - // set up the context - bitmap->getPixelPtr(0, y-1, &cxPtr0); - cx0 = bitmap->nextPixel(&cxPtr0); - bitmap->getPixelPtr(-1, y, &cxPtr1); - refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2); - refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3); - cx3 = refBitmap->nextPixel(&cxPtr3); - cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3); - refBitmap->getPixelPtr(-refDX, y+1-refDY, &cxPtr4); - cx4 = refBitmap->nextPixel(&cxPtr4); - - // set up the typical prediction context - tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy - if (tpgrOn) { - refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0); - tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0); - tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); - tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); - refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1); - tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1); - tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); - tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); - refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2); - tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); - tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); - tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); - } else { - tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy - tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; - tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; - } - - for (x = 0; x < w; ++x) { - - // update the context - cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 7; - cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7; - cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 3; - - if (tpgrOn) { - // update the typical predictor context - tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7; - tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7; - tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7; - - // check for a "typical" pixel - if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) { - ltp = !ltp; - } - if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) { - bitmap->clearPixel(x, y); - continue; - } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) { - bitmap->setPixel(x, y); - continue; - } - } - - // build the context - cx = (cx0 << 7) | (bitmap->nextPixel(&cxPtr1) << 6) | - (refBitmap->nextPixel(&cxPtr2) << 5) | - (cx3 << 2) | cx4; - - // decode the pixel - if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) { - bitmap->setPixel(x, y); - } - } - - } else { - - // set up the context - bitmap->getPixelPtr(0, y-1, &cxPtr0); - cx0 = bitmap->nextPixel(&cxPtr0); - bitmap->getPixelPtr(-1, y, &cxPtr1); - refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2); - cx2 = refBitmap->nextPixel(&cxPtr2); - refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3); - cx3 = refBitmap->nextPixel(&cxPtr3); - cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3); - refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &cxPtr4); - cx4 = refBitmap->nextPixel(&cxPtr4); - cx4 = (cx4 << 1) | refBitmap->nextPixel(&cxPtr4); - bitmap->getPixelPtr(atx[0], y+aty[0], &cxPtr5); - refBitmap->getPixelPtr(atx[1]-refDX, y+aty[1]-refDY, &cxPtr6); - - // set up the typical prediction context - tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy - if (tpgrOn) { - refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0); - tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0); - tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); - tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0); - refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1); - tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1); - tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); - tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1); - refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2); - tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2); - tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); - tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2); - } else { - tpgrCXPtr0.p = tpgrCXPtr1.p = tpgrCXPtr2.p = NULL; // make gcc happy - tpgrCXPtr0.shift = tpgrCXPtr1.shift = tpgrCXPtr2.shift = 0; - tpgrCXPtr0.x = tpgrCXPtr1.x = tpgrCXPtr2.x = 0; - } - - for (x = 0; x < w; ++x) { - - // update the context - cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 3; - cx2 = ((cx2 << 1) | refBitmap->nextPixel(&cxPtr2)) & 3; - cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7; - cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 7; - - if (tpgrOn) { - // update the typical predictor context - tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7; - tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7; - tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7; - - // check for a "typical" pixel - if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) { - ltp = !ltp; - } - if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) { - bitmap->clearPixel(x, y); - continue; - } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) { - bitmap->setPixel(x, y); - continue; - } - } - - // build the context - cx = (cx0 << 11) | (bitmap->nextPixel(&cxPtr1) << 10) | - (cx2 << 8) | (cx3 << 5) | (cx4 << 2) | - (bitmap->nextPixel(&cxPtr5) << 1) | - refBitmap->nextPixel(&cxPtr6); - - // decode the pixel - if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) { - bitmap->setPixel(x, y); - } - } - } - } - - return bitmap; -} - -void JBIG2Stream::readPageInfoSeg(Guint length) { - Guint xRes, yRes, flags, striping; - - if (!readULong(&pageW) || !readULong(&pageH) || - !readULong(&xRes) || !readULong(&yRes) || - !readUByte(&flags) || !readUWord(&striping)) { - goto eofError; - } - pageDefPixel = (flags >> 2) & 1; - defCombOp = (flags >> 3) & 3; - - // allocate the page bitmap - if (pageH == 0xffffffff) { - curPageH = striping & 0x7fff; - } else { - curPageH = pageH; - } - pageBitmap = new JBIG2Bitmap(0, pageW, curPageH); - - if (!pageBitmap->isOk()) { - delete pageBitmap; - pageBitmap = NULL; - return; - } - - // default pixel value - if (pageDefPixel) { - pageBitmap->clearToOne(); - } else { - pageBitmap->clearToZero(); - } - - return; - - eofError: - error(getPos(), "Unexpected EOF in JBIG2 stream"); -} - -void JBIG2Stream::readEndOfStripeSeg(Guint length) { - Guint i; - - // skip the segment - for (i = 0; i < length; ++i) { - curStr->getChar(); - } -} - -void JBIG2Stream::readProfilesSeg(Guint length) { - Guint i; - - // skip the segment - for (i = 0; i < length; ++i) { - curStr->getChar(); - } -} - -void JBIG2Stream::readCodeTableSeg(Guint segNum, Guint length) { - JBIG2HuffmanTable *huffTab; - Guint flags, oob, prefixBits, rangeBits; - int lowVal, highVal, val; - Guint huffTabSize, i; - - if (!readUByte(&flags) || !readLong(&lowVal) || !readLong(&highVal)) { - goto eofError; - } - oob = flags & 1; - prefixBits = ((flags >> 1) & 7) + 1; - rangeBits = ((flags >> 4) & 7) + 1; - - huffDecoder->reset(); - huffTabSize = 8; - huffTab = (JBIG2HuffmanTable *) - gmallocn(huffTabSize, sizeof(JBIG2HuffmanTable)); - i = 0; - val = lowVal; - while (val < highVal) { - if (i == huffTabSize) { - huffTabSize *= 2; - huffTab = (JBIG2HuffmanTable *) - greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable)); - } - huffTab[i].val = val; - huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); - huffTab[i].rangeLen = huffDecoder->readBits(rangeBits); - val += 1 << huffTab[i].rangeLen; - ++i; - } - if (i + oob + 3 > huffTabSize) { - huffTabSize = i + oob + 3; - huffTab = (JBIG2HuffmanTable *) - greallocn(huffTab, huffTabSize, sizeof(JBIG2HuffmanTable)); - } - huffTab[i].val = lowVal - 1; - huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); - huffTab[i].rangeLen = jbig2HuffmanLOW; - ++i; - huffTab[i].val = highVal; - huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); - huffTab[i].rangeLen = 32; - ++i; - if (oob) { - huffTab[i].val = 0; - huffTab[i].prefixLen = huffDecoder->readBits(prefixBits); - huffTab[i].rangeLen = jbig2HuffmanOOB; - ++i; - } - huffTab[i].val = 0; - huffTab[i].prefixLen = 0; - huffTab[i].rangeLen = jbig2HuffmanEOT; - huffDecoder->buildTable(huffTab, i); - - // create and store the new table segment - segments->append(new JBIG2CodeTable(segNum, huffTab)); - - return; - - eofError: - error(getPos(), "Unexpected EOF in JBIG2 stream"); -} - -void JBIG2Stream::readExtensionSeg(Guint length) { - Guint i; - - // skip the segment - for (i = 0; i < length; ++i) { - curStr->getChar(); - } -} - -JBIG2Segment *JBIG2Stream::findSegment(Guint segNum) { - JBIG2Segment *seg; - int i; - - for (i = 0; i < globalSegments->getLength(); ++i) { - seg = (JBIG2Segment *)globalSegments->get(i); - if (seg->getSegNum() == segNum) { - return seg; - } - } - for (i = 0; i < segments->getLength(); ++i) { - seg = (JBIG2Segment *)segments->get(i); - if (seg->getSegNum() == segNum) { - return seg; - } - } - return NULL; -} - -void JBIG2Stream::discardSegment(Guint segNum) { - JBIG2Segment *seg; - int i; - - for (i = 0; i < globalSegments->getLength(); ++i) { - seg = (JBIG2Segment *)globalSegments->get(i); - if (seg->getSegNum() == segNum) { - globalSegments->del(i); - return; - } - } - for (i = 0; i < segments->getLength(); ++i) { - seg = (JBIG2Segment *)segments->get(i); - if (seg->getSegNum() == segNum) { - segments->del(i); - return; - } - } -} - -void JBIG2Stream::resetGenericStats(Guint templ, - JArithmeticDecoderStats *prevStats) { - int size; - - size = contextSize[templ]; - if (prevStats && prevStats->getContextSize() == size) { - if (genericRegionStats->getContextSize() == size) { - genericRegionStats->copyFrom(prevStats); - } else { - delete genericRegionStats; - genericRegionStats = prevStats->copy(); - } - } else { - if (genericRegionStats->getContextSize() == size) { - genericRegionStats->reset(); - } else { - delete genericRegionStats; - genericRegionStats = new JArithmeticDecoderStats(1 << size); - } - } -} - -void JBIG2Stream::resetRefinementStats(Guint templ, - JArithmeticDecoderStats *prevStats) { - int size; - - size = refContextSize[templ]; - if (prevStats && prevStats->getContextSize() == size) { - if (refinementRegionStats->getContextSize() == size) { - refinementRegionStats->copyFrom(prevStats); - } else { - delete refinementRegionStats; - refinementRegionStats = prevStats->copy(); - } - } else { - if (refinementRegionStats->getContextSize() == size) { - refinementRegionStats->reset(); - } else { - delete refinementRegionStats; - refinementRegionStats = new JArithmeticDecoderStats(1 << size); - } - } -} - -void JBIG2Stream::resetIntStats(int symCodeLen) { - iadhStats->reset(); - iadwStats->reset(); - iaexStats->reset(); - iaaiStats->reset(); - iadtStats->reset(); - iaitStats->reset(); - iafsStats->reset(); - iadsStats->reset(); - iardxStats->reset(); - iardyStats->reset(); - iardwStats->reset(); - iardhStats->reset(); - iariStats->reset(); - if (iaidStats->getContextSize() == 1 << (symCodeLen + 1)) { - iaidStats->reset(); - } else { - delete iaidStats; - iaidStats = new JArithmeticDecoderStats(1 << (symCodeLen + 1)); - } -} - -GBool JBIG2Stream::readUByte(Guint *x) { - int c0; - - if ((c0 = curStr->getChar()) == EOF) { - return gFalse; - } - *x = (Guint)c0; - return gTrue; -} - -GBool JBIG2Stream::readByte(int *x) { - int c0; - - if ((c0 = curStr->getChar()) == EOF) { - return gFalse; - } - *x = c0; - if (c0 & 0x80) { - *x |= -1 - 0xff; - } - return gTrue; -} - -GBool JBIG2Stream::readUWord(Guint *x) { - int c0, c1; - - if ((c0 = curStr->getChar()) == EOF || - (c1 = curStr->getChar()) == EOF) { - return gFalse; - } - *x = (Guint)((c0 << 8) | c1); - return gTrue; -} - -GBool JBIG2Stream::readULong(Guint *x) { - int c0, c1, c2, c3; - - if ((c0 = curStr->getChar()) == EOF || - (c1 = curStr->getChar()) == EOF || - (c2 = curStr->getChar()) == EOF || - (c3 = curStr->getChar()) == EOF) { - return gFalse; - } - *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3); - return gTrue; -} - -GBool JBIG2Stream::readLong(int *x) { - int c0, c1, c2, c3; - - if ((c0 = curStr->getChar()) == EOF || - (c1 = curStr->getChar()) == EOF || - (c2 = curStr->getChar()) == EOF || - (c3 = curStr->getChar()) == EOF) { - return gFalse; - } - *x = ((c0 << 24) | (c1 << 16) | (c2 << 8) | c3); - if (c0 & 0x80) { - *x |= -1 - (int)0xffffffff; - } - return gTrue; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.h deleted file mode 100644 index f3443b3d5..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JBIG2Stream.h +++ /dev/null @@ -1,149 +0,0 @@ -//======================================================================== -// -// JBIG2Stream.h -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef JBIG2STREAM_H -#define JBIG2STREAM_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "Object.h" -#include "Stream.h" - -class GList; -class JBIG2Segment; -class JBIG2Bitmap; -class JArithmeticDecoder; -class JArithmeticDecoderStats; -class JBIG2HuffmanDecoder; -struct JBIG2HuffmanTable; -class JBIG2MMRDecoder; - -//------------------------------------------------------------------------ - -class JBIG2Stream: public FilterStream { -public: - - JBIG2Stream(Stream *strA, Object *globalsStreamA); - virtual ~JBIG2Stream(); - virtual StreamKind getKind() { return strJBIG2; } - virtual void reset(); - virtual void close(); - virtual int getChar(); - virtual int lookChar(); - virtual GString *getPSFilter(int psLevel, char *indent); - virtual GBool isBinary(GBool last = gTrue); - -private: - - void readSegments(); - GBool readSymbolDictSeg(Guint segNum, Guint length, - Guint *refSegs, Guint nRefSegs); - void readTextRegionSeg(Guint segNum, GBool imm, - GBool lossless, Guint length, - Guint *refSegs, Guint nRefSegs); - JBIG2Bitmap *readTextRegion(GBool huff, GBool refine, - int w, int h, - Guint numInstances, - Guint logStrips, - int numSyms, - JBIG2HuffmanTable *symCodeTab, - Guint symCodeLen, - JBIG2Bitmap **syms, - Guint defPixel, Guint combOp, - Guint transposed, Guint refCorner, - int sOffset, - JBIG2HuffmanTable *huffFSTable, - JBIG2HuffmanTable *huffDSTable, - JBIG2HuffmanTable *huffDTTable, - JBIG2HuffmanTable *huffRDWTable, - JBIG2HuffmanTable *huffRDHTable, - JBIG2HuffmanTable *huffRDXTable, - JBIG2HuffmanTable *huffRDYTable, - JBIG2HuffmanTable *huffRSizeTable, - Guint templ, - int *atx, int *aty); - void readPatternDictSeg(Guint segNum, Guint length); - void readHalftoneRegionSeg(Guint segNum, GBool imm, - GBool lossless, Guint length, - Guint *refSegs, Guint nRefSegs); - void readGenericRegionSeg(Guint segNum, GBool imm, - GBool lossless, Guint length); - void mmrAddPixels(int a1, int blackPixels, - int *codingLine, int *a0i, int w); - void mmrAddPixelsNeg(int a1, int blackPixels, - int *codingLine, int *a0i, int w); - JBIG2Bitmap *readGenericBitmap(GBool mmr, int w, int h, - int templ, GBool tpgdOn, - GBool useSkip, JBIG2Bitmap *skip, - int *atx, int *aty, - int mmrDataLength); - void readGenericRefinementRegionSeg(Guint segNum, GBool imm, - GBool lossless, Guint length, - Guint *refSegs, - Guint nRefSegs); - JBIG2Bitmap *readGenericRefinementRegion(int w, int h, - int templ, GBool tpgrOn, - JBIG2Bitmap *refBitmap, - int refDX, int refDY, - int *atx, int *aty); - void readPageInfoSeg(Guint length); - void readEndOfStripeSeg(Guint length); - void readProfilesSeg(Guint length); - void readCodeTableSeg(Guint segNum, Guint length); - void readExtensionSeg(Guint length); - JBIG2Segment *findSegment(Guint segNum); - void discardSegment(Guint segNum); - void resetGenericStats(Guint templ, - JArithmeticDecoderStats *prevStats); - void resetRefinementStats(Guint templ, - JArithmeticDecoderStats *prevStats); - void resetIntStats(int symCodeLen); - GBool readUByte(Guint *x); - GBool readByte(int *x); - GBool readUWord(Guint *x); - GBool readULong(Guint *x); - GBool readLong(int *x); - - Object globalsStream; - Guint pageW, pageH, curPageH; - Guint pageDefPixel; - JBIG2Bitmap *pageBitmap; - Guint defCombOp; - GList *segments; // [JBIG2Segment] - GList *globalSegments; // [JBIG2Segment] - Stream *curStr; - Guchar *dataPtr; - Guchar *dataEnd; - - JArithmeticDecoder *arithDecoder; - JArithmeticDecoderStats *genericRegionStats; - JArithmeticDecoderStats *refinementRegionStats; - JArithmeticDecoderStats *iadhStats; - JArithmeticDecoderStats *iadwStats; - JArithmeticDecoderStats *iaexStats; - JArithmeticDecoderStats *iaaiStats; - JArithmeticDecoderStats *iadtStats; - JArithmeticDecoderStats *iaitStats; - JArithmeticDecoderStats *iafsStats; - JArithmeticDecoderStats *iadsStats; - JArithmeticDecoderStats *iardxStats; - JArithmeticDecoderStats *iardyStats; - JArithmeticDecoderStats *iardwStats; - JArithmeticDecoderStats *iardhStats; - JArithmeticDecoderStats *iariStats; - JArithmeticDecoderStats *iaidStats; - JBIG2HuffmanDecoder *huffDecoder; - JBIG2MMRDecoder *mmrDecoder; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.cc deleted file mode 100644 index 79b9c75d6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.cc +++ /dev/null @@ -1,3154 +0,0 @@ -//======================================================================== -// -// JPXStream.cc -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "gmem.h" -#include "Error.h" -#include "JArithmeticDecoder.h" -#include "JPXStream.h" - -//~ to do: -// - precincts -// - ROI -// - progression order changes -// - packed packet headers -// - support for palettes, channel maps, etc. -// - make sure all needed JP2/JPX subboxes are parsed (readBoxes) -// - can we assume that QCC segments must come after the QCD segment? -// - skip EPH markers (readTilePartData) -// - handle tilePartToEOC in readTilePartData -// - deal with multiple codeword segments (readTilePartData, -// readCodeBlockData) -// - progression orders 2, 3, and 4 -// - in coefficient decoding (readCodeBlockData): -// - termination pattern: terminate after every coding pass -// - error resilience segmentation symbol -// - selective arithmetic coding bypass -// - vertically causal context formation -// - coeffs longer than 31 bits (should just ignore the extra bits?) -// - handle boxes larger than 2^32 bytes -// - the fixed-point arithmetic won't handle 16-bit pixels - -//------------------------------------------------------------------------ - -// number of contexts for the arithmetic decoder -#define jpxNContexts 19 - -#define jpxContextSigProp 0 // 0 - 8: significance prop and cleanup -#define jpxContextSign 9 // 9 - 13: sign -#define jpxContextMagRef 14 // 14 -16: magnitude refinement -#define jpxContextRunLength 17 // cleanup: run length -#define jpxContextUniform 18 // cleanup: first signif coeff - -//------------------------------------------------------------------------ - -#define jpxPassSigProp 0 -#define jpxPassMagRef 1 -#define jpxPassCleanup 2 - -//------------------------------------------------------------------------ - -// arithmetic decoder context for the significance propagation and -// cleanup passes: -// [horiz][vert][diag][subband] -// where subband = 0 for HL -// = 1 for LH and LL -// = 2 for HH -static Guint sigPropContext[3][3][5][3] = { - {{{ 0, 0, 0 }, // horiz=0, vert=0, diag=0 - { 1, 1, 3 }, // horiz=0, vert=0, diag=1 - { 2, 2, 6 }, // horiz=0, vert=0, diag=2 - { 2, 2, 8 }, // horiz=0, vert=0, diag=3 - { 2, 2, 8 }}, // horiz=0, vert=0, diag=4 - {{ 5, 3, 1 }, // horiz=0, vert=1, diag=0 - { 6, 3, 4 }, // horiz=0, vert=1, diag=1 - { 6, 3, 7 }, // horiz=0, vert=1, diag=2 - { 6, 3, 8 }, // horiz=0, vert=1, diag=3 - { 6, 3, 8 }}, // horiz=0, vert=1, diag=4 - {{ 8, 4, 2 }, // horiz=0, vert=2, diag=0 - { 8, 4, 5 }, // horiz=0, vert=2, diag=1 - { 8, 4, 7 }, // horiz=0, vert=2, diag=2 - { 8, 4, 8 }, // horiz=0, vert=2, diag=3 - { 8, 4, 8 }}}, // horiz=0, vert=2, diag=4 - {{{ 3, 5, 1 }, // horiz=1, vert=0, diag=0 - { 3, 6, 4 }, // horiz=1, vert=0, diag=1 - { 3, 6, 7 }, // horiz=1, vert=0, diag=2 - { 3, 6, 8 }, // horiz=1, vert=0, diag=3 - { 3, 6, 8 }}, // horiz=1, vert=0, diag=4 - {{ 7, 7, 2 }, // horiz=1, vert=1, diag=0 - { 7, 7, 5 }, // horiz=1, vert=1, diag=1 - { 7, 7, 7 }, // horiz=1, vert=1, diag=2 - { 7, 7, 8 }, // horiz=1, vert=1, diag=3 - { 7, 7, 8 }}, // horiz=1, vert=1, diag=4 - {{ 8, 7, 2 }, // horiz=1, vert=2, diag=0 - { 8, 7, 5 }, // horiz=1, vert=2, diag=1 - { 8, 7, 7 }, // horiz=1, vert=2, diag=2 - { 8, 7, 8 }, // horiz=1, vert=2, diag=3 - { 8, 7, 8 }}}, // horiz=1, vert=2, diag=4 - {{{ 4, 8, 2 }, // horiz=2, vert=0, diag=0 - { 4, 8, 5 }, // horiz=2, vert=0, diag=1 - { 4, 8, 7 }, // horiz=2, vert=0, diag=2 - { 4, 8, 8 }, // horiz=2, vert=0, diag=3 - { 4, 8, 8 }}, // horiz=2, vert=0, diag=4 - {{ 7, 8, 2 }, // horiz=2, vert=1, diag=0 - { 7, 8, 5 }, // horiz=2, vert=1, diag=1 - { 7, 8, 7 }, // horiz=2, vert=1, diag=2 - { 7, 8, 8 }, // horiz=2, vert=1, diag=3 - { 7, 8, 8 }}, // horiz=2, vert=1, diag=4 - {{ 8, 8, 2 }, // horiz=2, vert=2, diag=0 - { 8, 8, 5 }, // horiz=2, vert=2, diag=1 - { 8, 8, 7 }, // horiz=2, vert=2, diag=2 - { 8, 8, 8 }, // horiz=2, vert=2, diag=3 - { 8, 8, 8 }}} // horiz=2, vert=2, diag=4 -}; - -// arithmetic decoder context and xor bit for the sign bit in the -// significance propagation pass: -// [horiz][vert][k] -// where horiz/vert are offset by 2 (i.e., range is -2 .. 2) -// and k = 0 for the context -// = 1 for the xor bit -static Guint signContext[5][5][2] = { - {{ 13, 1 }, // horiz=-2, vert=-2 - { 13, 1 }, // horiz=-2, vert=-1 - { 12, 1 }, // horiz=-2, vert= 0 - { 11, 1 }, // horiz=-2, vert=+1 - { 11, 1 }}, // horiz=-2, vert=+2 - {{ 13, 1 }, // horiz=-1, vert=-2 - { 13, 1 }, // horiz=-1, vert=-1 - { 12, 1 }, // horiz=-1, vert= 0 - { 11, 1 }, // horiz=-1, vert=+1 - { 11, 1 }}, // horiz=-1, vert=+2 - {{ 10, 1 }, // horiz= 0, vert=-2 - { 10, 1 }, // horiz= 0, vert=-1 - { 9, 0 }, // horiz= 0, vert= 0 - { 10, 0 }, // horiz= 0, vert=+1 - { 10, 0 }}, // horiz= 0, vert=+2 - {{ 11, 0 }, // horiz=+1, vert=-2 - { 11, 0 }, // horiz=+1, vert=-1 - { 12, 0 }, // horiz=+1, vert= 0 - { 13, 0 }, // horiz=+1, vert=+1 - { 13, 0 }}, // horiz=+1, vert=+2 - {{ 11, 0 }, // horiz=+2, vert=-2 - { 11, 0 }, // horiz=+2, vert=-1 - { 12, 0 }, // horiz=+2, vert= 0 - { 13, 0 }, // horiz=+2, vert=+1 - { 13, 0 }}, // horiz=+2, vert=+2 -}; - -//------------------------------------------------------------------------ - -// constants used in the IDWT -#define idwtAlpha -1.586134342059924 -#define idwtBeta -0.052980118572961 -#define idwtGamma 0.882911075530934 -#define idwtDelta 0.443506852043971 -#define idwtKappa 1.230174104914001 -#define idwtIKappa (1.0 / idwtKappa) - -// number of bits to the right of the decimal point for the fixed -// point arithmetic used in the IDWT -#define fracBits 16 - -//------------------------------------------------------------------------ - -// floor(x / y) -#define jpxFloorDiv(x, y) ((x) / (y)) - -// floor(x / 2^y) -#define jpxFloorDivPow2(x, y) ((x) >> (y)) - -// ceil(x / y) -#define jpxCeilDiv(x, y) (((x) + (y) - 1) / (y)) - -// ceil(x / 2^y) -#define jpxCeilDivPow2(x, y) (((x) + (1 << (y)) - 1) >> (y)) - -//------------------------------------------------------------------------ - -#if 1 //----- disable coverage tracking - -#define cover(idx) - -#else //----- enable coverage tracking - -class JPXCover { -public: - - JPXCover(int sizeA); - ~JPXCover(); - void incr(int idx); - -private: - - int size, used; - int *data; -}; - -JPXCover::JPXCover(int sizeA) { - size = sizeA; - used = -1; - data = (int *)gmallocn(size, sizeof(int)); - memset(data, 0, size * sizeof(int)); -} - -JPXCover::~JPXCover() { - int i; - - printf("JPX coverage:\n"); - for (i = 0; i <= used; ++i) { - printf(" %4d: %8d\n", i, data[i]); - } - gfree(data); -} - -void JPXCover::incr(int idx) { - if (idx < size) { - ++data[idx]; - if (idx > used) { - used = idx; - } - } -} - -JPXCover jpxCover(150); - -#define cover(idx) jpxCover.incr(idx) - -#endif //----- coverage tracking - -//------------------------------------------------------------------------ - -JPXStream::JPXStream(Stream *strA): - FilterStream(strA) -{ - nComps = 0; - bpc = NULL; - width = height = 0; - haveCS = gFalse; - havePalette = gFalse; - haveCompMap = gFalse; - haveChannelDefn = gFalse; - - img.xSize = 0; - img.ySize = 0; - img.xOffset = 0; - img.yOffset = 0; - curX = 0; - curY = 0; - img.tiles = NULL; - bitBuf = 0; - bitBufLen = 0; - bitBufSkip = gFalse; - byteCount = 0; -} - -JPXStream::~JPXStream() { - close(); - delete str; -} - -void JPXStream::reset() { - str->reset(); - if (readBoxes()) { - curY = img.yOffset; - } else { - // readBoxes reported an error, so we go immediately to EOF - curY = img.ySize; - } - curX = img.xOffset; - curComp = 0; - readBufLen = 0; -} - -void JPXStream::close() { - JPXTile *tile; - JPXTileComp *tileComp; - JPXResLevel *resLevel; - JPXPrecinct *precinct; - JPXSubband *subband; - JPXCodeBlock *cb; - Guint comp, i, k, r, pre, sb; - - gfree(bpc); - bpc = NULL; - if (havePalette) { - gfree(palette.bpc); - gfree(palette.c); - havePalette = gFalse; - } - if (haveCompMap) { - gfree(compMap.comp); - gfree(compMap.type); - gfree(compMap.pComp); - haveCompMap = gFalse; - } - if (haveChannelDefn) { - gfree(channelDefn.idx); - gfree(channelDefn.type); - gfree(channelDefn.assoc); - haveChannelDefn = gFalse; - } - - if (img.tiles) { - for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { - tile = &img.tiles[i]; - if (tile->tileComps) { - for (comp = 0; comp < img.nComps; ++comp) { - tileComp = &tile->tileComps[comp]; - gfree(tileComp->quantSteps); - gfree(tileComp->data); - gfree(tileComp->buf); - if (tileComp->resLevels) { - for (r = 0; r <= tileComp->nDecompLevels; ++r) { - resLevel = &tileComp->resLevels[r]; - if (resLevel->precincts) { - for (pre = 0; pre < 1; ++pre) { - precinct = &resLevel->precincts[pre]; - if (precinct->subbands) { - for (sb = 0; sb < (Guint)(r == 0 ? 1 : 3); ++sb) { - subband = &precinct->subbands[sb]; - gfree(subband->inclusion); - gfree(subband->zeroBitPlane); - if (subband->cbs) { - for (k = 0; k < subband->nXCBs * subband->nYCBs; ++k) { - cb = &subband->cbs[k]; - gfree(cb->coeffs); - if (cb->arithDecoder) { - delete cb->arithDecoder; - } - if (cb->stats) { - delete cb->stats; - } - } - gfree(subband->cbs); - } - } - gfree(precinct->subbands); - } - } - gfree(img.tiles[i].tileComps[comp].resLevels[r].precincts); - } - } - gfree(img.tiles[i].tileComps[comp].resLevels); - } - } - gfree(img.tiles[i].tileComps); - } - } - gfree(img.tiles); - img.tiles = NULL; - } - FilterStream::close(); -} - -int JPXStream::getChar() { - int c; - - if (readBufLen < 8) { - fillReadBuf(); - } - if (readBufLen == 8) { - c = readBuf & 0xff; - readBufLen = 0; - } else if (readBufLen > 8) { - c = (readBuf >> (readBufLen - 8)) & 0xff; - readBufLen -= 8; - } else if (readBufLen == 0) { - c = EOF; - } else { - c = (readBuf << (8 - readBufLen)) & 0xff; - readBufLen = 0; - } - return c; -} - -int JPXStream::lookChar() { - int c; - - if (readBufLen < 8) { - fillReadBuf(); - } - if (readBufLen == 8) { - c = readBuf & 0xff; - } else if (readBufLen > 8) { - c = (readBuf >> (readBufLen - 8)) & 0xff; - } else if (readBufLen == 0) { - c = EOF; - } else { - c = (readBuf << (8 - readBufLen)) & 0xff; - } - return c; -} - -void JPXStream::fillReadBuf() { - JPXTileComp *tileComp; - Guint tileIdx, tx, ty; - int pix, pixBits; - - do { - if (curY >= img.ySize) { - return; - } - tileIdx = ((curY - img.yTileOffset) / img.yTileSize) * img.nXTiles - + (curX - img.xTileOffset) / img.xTileSize; -#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid - tileComp = &img.tiles[tileIdx].tileComps[curComp]; -#else - tileComp = &img.tiles[tileIdx].tileComps[havePalette ? 0 : curComp]; -#endif - tx = jpxCeilDiv((curX - img.xTileOffset) % img.xTileSize, tileComp->hSep); - ty = jpxCeilDiv((curY - img.yTileOffset) % img.yTileSize, tileComp->vSep); - pix = (int)tileComp->data[ty * (tileComp->x1 - tileComp->x0) + tx]; - pixBits = tileComp->prec; -#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid - if (++curComp == img.nComps) { -#else - if (havePalette) { - if (pix >= 0 && pix < palette.nEntries) { - pix = palette.c[pix * palette.nComps + curComp]; - } else { - pix = - pixBits = palette.bpc[curComp]; - } - if (++curComp == (Guint)(havePalette ? palette.nComps : img.nComps)) { -#endif - curComp = 0; - if (++curX == img.xSize) { - curX = img.xOffset; - ++curY; - } - } - if (pixBits == 8) { - readBuf = (readBuf << 8) | (pix & 0xff); - } else { - readBuf = (readBuf << pixBits) | (pix & ((1 << pixBits) - 1)); - } - readBufLen += pixBits; - } while (readBufLen < 8); -} - -GString *JPXStream::getPSFilter(int psLevel, char *indent) { - return NULL; -} - -GBool JPXStream::isBinary(GBool last) { - return str->isBinary(gTrue); -} - -void JPXStream::getImageParams(int *bitsPerComponent, - StreamColorSpaceMode *csMode) { - Guint boxType, boxLen, dataLen, csEnum; - Guint bpc1, dummy, i; - int csMeth, csPrec, csPrec1, dummy2; - StreamColorSpaceMode csMode1; - GBool haveBPC, haveCSMode; - - csPrec = 0; // make gcc happy - Guint num_components = 0; - haveBPC = haveCSMode = gFalse; - str->reset(); - if (str->lookChar() == 0xff) { - getImageParams2(bitsPerComponent, csMode); - } else { - while (readBoxHdr(&boxType, &boxLen, &dataLen)) { - if (boxType == 0x6a703268) { // JP2 header - cover(0); - // skip the superbox - } else if (boxType == 0x69686472) { // image header - cover(1); - if (readULong(&dummy) && - readULong(&dummy) && - readUWord(&num_components) && - readUByte(&bpc1) && - readUByte(&dummy) && - readUByte(&dummy) && - readUByte(&dummy)) { - *bitsPerComponent = bpc1 + 1; - haveBPC = gTrue; - } - } else if (boxType == 0x636F6C72) { // color specification - cover(2); - if (readByte(&csMeth) && - readByte(&csPrec1) && - readByte(&dummy2)) { - if (csMeth == 1) { - if (readULong(&csEnum)) { - csMode1 = streamCSNone; - if (csEnum == jpxCSBiLevel || - csEnum == jpxCSGrayscale) { - csMode1 = streamCSDeviceGray; - } else if (csEnum == jpxCSCMYK) { - csMode1 = streamCSDeviceCMYK; - } else if (csEnum == jpxCSsRGB || - csEnum == jpxCSCISesRGB || - csEnum == jpxCSROMMRGB) { - csMode1 = streamCSDeviceRGB; - } - if (csMode1 != streamCSNone && - (!haveCSMode || csPrec1 > csPrec)) { - *csMode = csMode1; - csPrec = csPrec1; - haveCSMode = gTrue; - } - for (i = 0; i < dataLen - 7; ++i) { - str->getChar(); - } - } - } else { - for (i = 0; i < dataLen - 3; ++i) { - str->getChar(); - } - } - } - } else if (boxType == 0x6A703263) { // codestream - cover(3); - if (!(haveBPC && haveCSMode)) { - getImageParams2(bitsPerComponent, csMode); - } - break; - } else { - cover(4); - for (i = 0; i < dataLen; ++i) { - str->getChar(); - } - } - } - } - if(*csMode == streamCSDeviceRGB && num_components == 4) { - *csMode = streamCSDeviceRGBX; - } - str->close(); -} - -// Get image parameters from the codestream. -void JPXStream::getImageParams2(int *bitsPerComponent, - StreamColorSpaceMode *csMode) { - int segType; - Guint segLen, nComps1, bpc1, dummy, i; - - while (readMarkerHdr(&segType, &segLen)) { - if (segType == 0x51) { // SIZ - image and tile size - cover(5); - if (readUWord(&dummy) && - readULong(&dummy) && - readULong(&dummy) && - readULong(&dummy) && - readULong(&dummy) && - readULong(&dummy) && - readULong(&dummy) && - readULong(&dummy) && - readULong(&dummy) && - readUWord(&nComps1) && - readUByte(&bpc1)) { - *bitsPerComponent = (bpc1 & 0x7f) + 1; - // if there's no color space info, take a guess - if (nComps1 == 1) { - *csMode = streamCSDeviceGray; - } else if (nComps1 == 3) { - *csMode = streamCSDeviceRGB; - } else if (nComps1 == 4) { - *csMode = streamCSDeviceCMYK; - } - } - break; - } else { - cover(6); - if (segLen > 2) { - for (i = 0; i < segLen - 2; ++i) { - str->getChar(); - } - } - } - } -} - -GBool JPXStream::readBoxes() { - Guint boxType, boxLen, dataLen; - Guint bpc1, compression, unknownColorspace, ipr; - Guint i, j; - - haveImgHdr = gFalse; - - // check for a naked JPEG 2000 codestream (without the JP2/JPX - // wrapper) -- this appears to be a violation of the PDF spec, but - // Acrobat allows it - if (str->lookChar() == 0xff) { - cover(7); - error(getPos(), "Naked JPEG 2000 codestream, missing JP2/JPX wrapper"); - readCodestream(0); - nComps = img.nComps; - bpc = (Guint *)gmallocn(nComps, sizeof(Guint)); - for (i = 0; i < nComps; ++i) { - bpc[i] = img.tiles[0].tileComps[i].prec; - } - width = img.xSize - img.xOffset; - height = img.ySize - img.yOffset; - return gTrue; - } - - while (readBoxHdr(&boxType, &boxLen, &dataLen)) { - switch (boxType) { - case 0x6a703268: // JP2 header - // this is a grouping box ('superbox') which has no real - // contents and doesn't appear to be used consistently, i.e., - // some things which should be subboxes of the JP2 header box - // show up outside of it - so we simply ignore the JP2 header - // box - cover(8); - break; - case 0x69686472: // image header - cover(9); - if (!readULong(&height) || - !readULong(&width) || - !readUWord(&nComps) || - !readUByte(&bpc1) || - !readUByte(&compression) || - !readUByte(&unknownColorspace) || - !readUByte(&ipr)) { - error(getPos(), "Unexpected EOF in JPX stream"); - return gFalse; - } - if (compression != 7) { - error(getPos(), "Unknown compression type in JPX stream"); - return gFalse; - } - bpc = (Guint *)gmallocn(nComps, sizeof(Guint)); - for (i = 0; i < nComps; ++i) { - bpc[i] = bpc1; - } - haveImgHdr = gTrue; - break; - case 0x62706363: // bits per component - cover(10); - if (!haveImgHdr) { - error(getPos(), "Found bits per component box before image header box in JPX stream"); - return gFalse; - } - if (dataLen != nComps) { - error(getPos(), "Invalid bits per component box in JPX stream"); - return gFalse; - } - for (i = 0; i < nComps; ++i) { - if (!readUByte(&bpc[i])) { - error(getPos(), "Unexpected EOF in JPX stream"); - return gFalse; - } - } - break; - case 0x636F6C72: // color specification - cover(11); - if (!readColorSpecBox(dataLen)) { - return gFalse; - } - break; - case 0x70636c72: // palette - cover(12); - if (!readUWord(&palette.nEntries) || - !readUByte(&palette.nComps)) { - error(getPos(), "Unexpected EOF in JPX stream"); - return gFalse; - } - palette.bpc = (Guint *)gmallocn(palette.nComps, sizeof(Guint)); - palette.c = - (int *)gmallocn(palette.nEntries * palette.nComps, sizeof(int)); - for (i = 0; i < palette.nComps; ++i) { - if (!readUByte(&palette.bpc[i])) { - error(getPos(), "Unexpected EOF in JPX stream"); - return gFalse; - } - ++palette.bpc[i]; - } - for (i = 0; i < palette.nEntries; ++i) { - for (j = 0; j < palette.nComps; ++j) { - if (!readNBytes(((palette.bpc[j] & 0x7f) + 7) >> 3, - (palette.bpc[j] & 0x80) ? gTrue : gFalse, - &palette.c[i * palette.nComps + j])) { - error(getPos(), "Unexpected EOF in JPX stream"); - return gFalse; - } - } - } - havePalette = gTrue; - break; - case 0x636d6170: // component mapping - cover(13); - compMap.nChannels = dataLen / 4; - compMap.comp = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint)); - compMap.type = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint)); - compMap.pComp = (Guint *)gmallocn(compMap.nChannels, sizeof(Guint)); - for (i = 0; i < compMap.nChannels; ++i) { - if (!readUWord(&compMap.comp[i]) || - !readUByte(&compMap.type[i]) || - !readUByte(&compMap.pComp[i])) { - error(getPos(), "Unexpected EOF in JPX stream"); - return gFalse; - } - } - haveCompMap = gTrue; - break; - case 0x63646566: // channel definition - cover(14); - if (!readUWord(&channelDefn.nChannels)) { - error(getPos(), "Unexpected EOF in JPX stream"); - return gFalse; - } - channelDefn.idx = - (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint)); - channelDefn.type = - (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint)); - channelDefn.assoc = - (Guint *)gmallocn(channelDefn.nChannels, sizeof(Guint)); - for (i = 0; i < channelDefn.nChannels; ++i) { - if (!readUWord(&channelDefn.idx[i]) || - !readUWord(&channelDefn.type[i]) || - !readUWord(&channelDefn.assoc[i])) { - error(getPos(), "Unexpected EOF in JPX stream"); - return gFalse; - } - } - haveChannelDefn = gTrue; - break; - case 0x6A703263: // contiguous codestream - cover(15); - if (!bpc) { - error(getPos(), "JPX stream is missing the image header box"); - } - if (!haveCS) { - error(getPos(), "JPX stream has no supported color spec"); - } - if (!readCodestream(dataLen)) { - return gFalse; - } - break; - default: - cover(16); - for (i = 0; i < dataLen; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Unexpected EOF in JPX stream"); - return gFalse; - } - } - break; - } - } - return gTrue; -} - -GBool JPXStream::readColorSpecBox(Guint dataLen) { - JPXColorSpec newCS; - Guint csApprox, csEnum; - Guint i; - GBool ok; - - ok = gFalse; - if (!readUByte(&newCS.meth) || - !readByte(&newCS.prec) || - !readUByte(&csApprox)) { - goto err; - } - switch (newCS.meth) { - case 1: // enumerated colorspace - cover(17); - if (!readULong(&csEnum)) { - goto err; - } - newCS.enumerated.type = (JPXColorSpaceType)csEnum; - switch (newCS.enumerated.type) { - case jpxCSBiLevel: - ok = gTrue; - break; - case jpxCSYCbCr1: - ok = gTrue; - break; - case jpxCSYCbCr2: - ok = gTrue; - break; - case jpxCSYCBCr3: - ok = gTrue; - break; - case jpxCSPhotoYCC: - ok = gTrue; - break; - case jpxCSCMY: - ok = gTrue; - break; - case jpxCSCMYK: - ok = gTrue; - break; - case jpxCSYCCK: - ok = gTrue; - break; - case jpxCSCIELab: - if (dataLen == 7 + 7*4) { - if (!readULong(&newCS.enumerated.cieLab.rl) || - !readULong(&newCS.enumerated.cieLab.ol) || - !readULong(&newCS.enumerated.cieLab.ra) || - !readULong(&newCS.enumerated.cieLab.oa) || - !readULong(&newCS.enumerated.cieLab.rb) || - !readULong(&newCS.enumerated.cieLab.ob) || - !readULong(&newCS.enumerated.cieLab.il)) { - goto err; - } - } else if (dataLen == 7) { - //~ this assumes the 8-bit case - cover(92); - newCS.enumerated.cieLab.rl = 100; - newCS.enumerated.cieLab.ol = 0; - newCS.enumerated.cieLab.ra = 255; - newCS.enumerated.cieLab.oa = 128; - newCS.enumerated.cieLab.rb = 255; - newCS.enumerated.cieLab.ob = 96; - newCS.enumerated.cieLab.il = 0x00443530; - } else { - goto err; - } - ok = gTrue; - break; - case jpxCSsRGB: - ok = gTrue; - break; - case jpxCSGrayscale: - ok = gTrue; - break; - case jpxCSBiLevel2: - ok = gTrue; - break; - case jpxCSCIEJab: - // not allowed in PDF - goto err; - case jpxCSCISesRGB: - ok = gTrue; - break; - case jpxCSROMMRGB: - ok = gTrue; - break; - case jpxCSsRGBYCbCr: - ok = gTrue; - break; - case jpxCSYPbPr1125: - ok = gTrue; - break; - case jpxCSYPbPr1250: - ok = gTrue; - break; - default: - goto err; - } - break; - case 2: // restricted ICC profile - case 3: // any ICC profile (JPX) - case 4: // vendor color (JPX) - cover(18); - for (i = 0; i < dataLen - 3; ++i) { - if (str->getChar() == EOF) { - goto err; - } - } - break; - } - - if (ok && (!haveCS || newCS.prec > cs.prec)) { - cs = newCS; - haveCS = gTrue; - } - - return gTrue; - - err: - error(getPos(), "Error in JPX color spec"); - return gFalse; -} - -GBool JPXStream::readCodestream(Guint len) { - JPXTile *tile; - JPXTileComp *tileComp; - int segType; - GBool haveSIZ, haveCOD, haveQCD, haveSOT; - Guint precinctSize, style; - Guint segLen, capabilities, comp, i, j, r; - - //----- main header - haveSIZ = haveCOD = haveQCD = haveSOT = gFalse; - do { - if (!readMarkerHdr(&segType, &segLen)) { - error(getPos(), "Error in JPX codestream"); - return gFalse; - } - switch (segType) { - case 0x4f: // SOC - start of codestream - // marker only - cover(19); - break; - case 0x51: // SIZ - image and tile size - cover(20); - if (!readUWord(&capabilities) || - !readULong(&img.xSize) || - !readULong(&img.ySize) || - !readULong(&img.xOffset) || - !readULong(&img.yOffset) || - !readULong(&img.xTileSize) || - !readULong(&img.yTileSize) || - !readULong(&img.xTileOffset) || - !readULong(&img.yTileOffset) || - !readUWord(&img.nComps)) { - error(getPos(), "Error in JPX SIZ marker segment"); - return gFalse; - } - if (haveImgHdr && img.nComps != nComps) { - error(getPos(), "Different number of components in JPX SIZ marker segment"); - return gFalse; - } - img.nXTiles = (img.xSize - img.xTileOffset + img.xTileSize - 1) - / img.xTileSize; - img.nYTiles = (img.ySize - img.yTileOffset + img.yTileSize - 1) - / img.yTileSize; - // check for overflow before allocating memory - if (img.nXTiles <= 0 || img.nYTiles <= 0 || - img.nXTiles >= INT_MAX / img.nYTiles) { - error(getPos(), "Bad tile count in JPX SIZ marker segment"); - return gFalse; - } - img.tiles = (JPXTile *)gmallocn(img.nXTiles * img.nYTiles, - sizeof(JPXTile)); - for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { - img.tiles[i].tileComps = (JPXTileComp *)gmallocn(img.nComps, - sizeof(JPXTileComp)); - for (comp = 0; comp < img.nComps; ++comp) { - img.tiles[i].tileComps[comp].quantSteps = NULL; - img.tiles[i].tileComps[comp].data = NULL; - img.tiles[i].tileComps[comp].buf = NULL; - img.tiles[i].tileComps[comp].resLevels = NULL; - } - } - for (comp = 0; comp < img.nComps; ++comp) { - if (!readUByte(&img.tiles[0].tileComps[comp].prec) || - !readUByte(&img.tiles[0].tileComps[comp].hSep) || - !readUByte(&img.tiles[0].tileComps[comp].vSep)) { - error(getPos(), "Error in JPX SIZ marker segment"); - return gFalse; - } - img.tiles[0].tileComps[comp].sgned = - (img.tiles[0].tileComps[comp].prec & 0x80) ? gTrue : gFalse; - img.tiles[0].tileComps[comp].prec = - (img.tiles[0].tileComps[comp].prec & 0x7f) + 1; - for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { - img.tiles[i].tileComps[comp] = img.tiles[0].tileComps[comp]; - } - } - haveSIZ = gTrue; - break; - case 0x52: // COD - coding style default - cover(21); - if (!readUByte(&img.tiles[0].tileComps[0].style) || - !readUByte(&img.tiles[0].progOrder) || - !readUWord(&img.tiles[0].nLayers) || - !readUByte(&img.tiles[0].multiComp) || - !readUByte(&img.tiles[0].tileComps[0].nDecompLevels) || - !readUByte(&img.tiles[0].tileComps[0].codeBlockW) || - !readUByte(&img.tiles[0].tileComps[0].codeBlockH) || - !readUByte(&img.tiles[0].tileComps[0].codeBlockStyle) || - !readUByte(&img.tiles[0].tileComps[0].transform)) { - error(getPos(), "Error in JPX COD marker segment"); - return gFalse; - } - img.tiles[0].tileComps[0].codeBlockW += 2; - img.tiles[0].tileComps[0].codeBlockH += 2; - for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { - if (i != 0) { - img.tiles[i].progOrder = img.tiles[0].progOrder; - img.tiles[i].nLayers = img.tiles[0].nLayers; - img.tiles[i].multiComp = img.tiles[0].multiComp; - } - for (comp = 0; comp < img.nComps; ++comp) { - if (!(i == 0 && comp == 0)) { - img.tiles[i].tileComps[comp].style = - img.tiles[0].tileComps[0].style; - img.tiles[i].tileComps[comp].nDecompLevels = - img.tiles[0].tileComps[0].nDecompLevels; - img.tiles[i].tileComps[comp].codeBlockW = - img.tiles[0].tileComps[0].codeBlockW; - img.tiles[i].tileComps[comp].codeBlockH = - img.tiles[0].tileComps[0].codeBlockH; - img.tiles[i].tileComps[comp].codeBlockStyle = - img.tiles[0].tileComps[0].codeBlockStyle; - img.tiles[i].tileComps[comp].transform = - img.tiles[0].tileComps[0].transform; - } - img.tiles[i].tileComps[comp].resLevels = - (JPXResLevel *)gmallocn( - (img.tiles[i].tileComps[comp].nDecompLevels + 1), - sizeof(JPXResLevel)); - for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { - img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL; - } - } - } - for (r = 0; r <= img.tiles[0].tileComps[0].nDecompLevels; ++r) { - if (img.tiles[0].tileComps[0].style & 0x01) { - cover(91); - if (!readUByte(&precinctSize)) { - error(getPos(), "Error in JPX COD marker segment"); - return gFalse; - } - img.tiles[0].tileComps[0].resLevels[r].precinctWidth = - precinctSize & 0x0f; - img.tiles[0].tileComps[0].resLevels[r].precinctHeight = - (precinctSize >> 4) & 0x0f; - } else { - img.tiles[0].tileComps[0].resLevels[r].precinctWidth = 15; - img.tiles[0].tileComps[0].resLevels[r].precinctHeight = 15; - } - } - for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { - for (comp = 0; comp < img.nComps; ++comp) { - if (!(i == 0 && comp == 0)) { - for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { - img.tiles[i].tileComps[comp].resLevels[r].precinctWidth = - img.tiles[0].tileComps[0].resLevels[r].precinctWidth; - img.tiles[i].tileComps[comp].resLevels[r].precinctHeight = - img.tiles[0].tileComps[0].resLevels[r].precinctHeight; - } - } - } - } - haveCOD = gTrue; - break; - case 0x53: // COC - coding style component - cover(22); - if (!haveCOD) { - error(getPos(), "JPX COC marker segment before COD segment"); - return gFalse; - } - if ((img.nComps > 256 && !readUWord(&comp)) || - (img.nComps <= 256 && !readUByte(&comp)) || - comp >= img.nComps || - !readUByte(&style) || - !readUByte(&img.tiles[0].tileComps[comp].nDecompLevels) || - !readUByte(&img.tiles[0].tileComps[comp].codeBlockW) || - !readUByte(&img.tiles[0].tileComps[comp].codeBlockH) || - !readUByte(&img.tiles[0].tileComps[comp].codeBlockStyle) || - !readUByte(&img.tiles[0].tileComps[comp].transform)) { - error(getPos(), "Error in JPX COC marker segment"); - return gFalse; - } - img.tiles[0].tileComps[comp].style = - (img.tiles[0].tileComps[comp].style & ~1) | (style & 1); - img.tiles[0].tileComps[comp].codeBlockW += 2; - img.tiles[0].tileComps[comp].codeBlockH += 2; - for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { - if (i != 0) { - img.tiles[i].tileComps[comp].style = - img.tiles[0].tileComps[comp].style; - img.tiles[i].tileComps[comp].nDecompLevels = - img.tiles[0].tileComps[comp].nDecompLevels; - img.tiles[i].tileComps[comp].codeBlockW = - img.tiles[0].tileComps[comp].codeBlockW; - img.tiles[i].tileComps[comp].codeBlockH = - img.tiles[0].tileComps[comp].codeBlockH; - img.tiles[i].tileComps[comp].codeBlockStyle = - img.tiles[0].tileComps[comp].codeBlockStyle; - img.tiles[i].tileComps[comp].transform = - img.tiles[0].tileComps[comp].transform; - } - img.tiles[i].tileComps[comp].resLevels = - (JPXResLevel *)greallocn( - img.tiles[i].tileComps[comp].resLevels, - (img.tiles[i].tileComps[comp].nDecompLevels + 1), - sizeof(JPXResLevel)); - for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { - img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL; - } - } - for (r = 0; r <= img.tiles[0].tileComps[comp].nDecompLevels; ++r) { - if (img.tiles[0].tileComps[comp].style & 0x01) { - if (!readUByte(&precinctSize)) { - error(getPos(), "Error in JPX COD marker segment"); - return gFalse; - } - img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = - precinctSize & 0x0f; - img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = - (precinctSize >> 4) & 0x0f; - } else { - img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = 15; - img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = 15; - } - } - for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { - for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) { - img.tiles[i].tileComps[comp].resLevels[r].precinctWidth = - img.tiles[0].tileComps[comp].resLevels[r].precinctWidth; - img.tiles[i].tileComps[comp].resLevels[r].precinctHeight = - img.tiles[0].tileComps[comp].resLevels[r].precinctHeight; - } - } - break; - case 0x5c: // QCD - quantization default - cover(23); - if (!readUByte(&img.tiles[0].tileComps[0].quantStyle)) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x00) { - img.tiles[0].tileComps[0].nQuantSteps = segLen - 3; - img.tiles[0].tileComps[0].quantSteps = - (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, - img.tiles[0].tileComps[0].nQuantSteps, - sizeof(Guint)); - for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) { - if (!readUByte(&img.tiles[0].tileComps[0].quantSteps[i])) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - } - } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x01) { - img.tiles[0].tileComps[0].nQuantSteps = 1; - img.tiles[0].tileComps[0].quantSteps = - (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, - img.tiles[0].tileComps[0].nQuantSteps, - sizeof(Guint)); - if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[0])) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x02) { - img.tiles[0].tileComps[0].nQuantSteps = (segLen - 3) / 2; - img.tiles[0].tileComps[0].quantSteps = - (Guint *)greallocn(img.tiles[0].tileComps[0].quantSteps, - img.tiles[0].tileComps[0].nQuantSteps, - sizeof(Guint)); - for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) { - if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[i])) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - } - } else { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { - for (comp = 0; comp < img.nComps; ++comp) { - if (!(i == 0 && comp == 0)) { - img.tiles[i].tileComps[comp].quantStyle = - img.tiles[0].tileComps[0].quantStyle; - img.tiles[i].tileComps[comp].nQuantSteps = - img.tiles[0].tileComps[0].nQuantSteps; - img.tiles[i].tileComps[comp].quantSteps = - (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps, - img.tiles[0].tileComps[0].nQuantSteps, - sizeof(Guint)); - for (j = 0; j < img.tiles[0].tileComps[0].nQuantSteps; ++j) { - img.tiles[i].tileComps[comp].quantSteps[j] = - img.tiles[0].tileComps[0].quantSteps[j]; - } - } - } - } - haveQCD = gTrue; - break; - case 0x5d: // QCC - quantization component - cover(24); - if (!haveQCD) { - error(getPos(), "JPX QCC marker segment before QCD segment"); - return gFalse; - } - if ((img.nComps > 256 && !readUWord(&comp)) || - (img.nComps <= 256 && !readUByte(&comp)) || - comp >= img.nComps || - !readUByte(&img.tiles[0].tileComps[comp].quantStyle)) { - error(getPos(), "Error in JPX QCC marker segment"); - return gFalse; - } - if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x00) { - img.tiles[0].tileComps[comp].nQuantSteps = - segLen - (img.nComps > 256 ? 5 : 4); - img.tiles[0].tileComps[comp].quantSteps = - (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, - img.tiles[0].tileComps[comp].nQuantSteps, - sizeof(Guint)); - for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) { - if (!readUByte(&img.tiles[0].tileComps[comp].quantSteps[i])) { - error(getPos(), "Error in JPX QCC marker segment"); - return gFalse; - } - } - } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x01) { - img.tiles[0].tileComps[comp].nQuantSteps = 1; - img.tiles[0].tileComps[comp].quantSteps = - (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, - img.tiles[0].tileComps[comp].nQuantSteps, - sizeof(Guint)); - if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[0])) { - error(getPos(), "Error in JPX QCC marker segment"); - return gFalse; - } - } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x02) { - img.tiles[0].tileComps[comp].nQuantSteps = - (segLen - (img.nComps > 256 ? 5 : 4)) / 2; - img.tiles[0].tileComps[comp].quantSteps = - (Guint *)greallocn(img.tiles[0].tileComps[comp].quantSteps, - img.tiles[0].tileComps[comp].nQuantSteps, - sizeof(Guint)); - for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) { - if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[i])) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - } - } else { - error(getPos(), "Error in JPX QCC marker segment"); - return gFalse; - } - for (i = 1; i < img.nXTiles * img.nYTiles; ++i) { - img.tiles[i].tileComps[comp].quantStyle = - img.tiles[0].tileComps[comp].quantStyle; - img.tiles[i].tileComps[comp].nQuantSteps = - img.tiles[0].tileComps[comp].nQuantSteps; - img.tiles[i].tileComps[comp].quantSteps = - (Guint *)greallocn(img.tiles[i].tileComps[comp].quantSteps, - img.tiles[0].tileComps[comp].nQuantSteps, - sizeof(Guint)); - for (j = 0; j < img.tiles[0].tileComps[comp].nQuantSteps; ++j) { - img.tiles[i].tileComps[comp].quantSteps[j] = - img.tiles[0].tileComps[comp].quantSteps[j]; - } - } - break; - case 0x5e: // RGN - region of interest - cover(25); -#if 1 //~ ROI is unimplemented - fprintf(stderr, "RGN\n"); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX PPM marker segment"); - return gFalse; - } - } -#else - if ((img.nComps > 256 && !readUWord(&comp)) || - (img.nComps <= 256 && !readUByte(&comp)) || - comp >= img.nComps || - !readUByte(&compInfo[comp].defROI.style) || - !readUByte(&compInfo[comp].defROI.shift)) { - error(getPos(), "Error in JPX RGN marker segment"); - return gFalse; - } -#endif - break; - case 0x5f: // POC - progression order change - cover(26); -#if 1 //~ progression order changes are unimplemented - fprintf(stderr, "POC\n"); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX PPM marker segment"); - return gFalse; - } - } -#else - nProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7); - progs = (JPXProgOrder *)gmallocn(nProgs, sizeof(JPXProgOrder)); - for (i = 0; i < nProgs; ++i) { - if (!readUByte(&progs[i].startRes) || - !(img.nComps > 256 && readUWord(&progs[i].startComp)) || - !(img.nComps <= 256 && readUByte(&progs[i].startComp)) || - !readUWord(&progs[i].endLayer) || - !readUByte(&progs[i].endRes) || - !(img.nComps > 256 && readUWord(&progs[i].endComp)) || - !(img.nComps <= 256 && readUByte(&progs[i].endComp)) || - !readUByte(&progs[i].progOrder)) { - error(getPos(), "Error in JPX POC marker segment"); - return gFalse; - } - } -#endif - break; - case 0x60: // PPM - packed packet headers, main header - cover(27); -#if 1 //~ packed packet headers are unimplemented - fprintf(stderr, "PPM\n"); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX PPM marker segment"); - return gFalse; - } - } -#endif - break; - case 0x55: // TLM - tile-part lengths - // skipped - cover(28); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX TLM marker segment"); - return gFalse; - } - } - break; - case 0x57: // PLM - packet length, main header - // skipped - cover(29); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX PLM marker segment"); - return gFalse; - } - } - break; - case 0x63: // CRG - component registration - // skipped - cover(30); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX CRG marker segment"); - return gFalse; - } - } - break; - case 0x64: // COM - comment - // skipped - cover(31); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX COM marker segment"); - return gFalse; - } - } - break; - case 0x90: // SOT - start of tile - cover(32); - haveSOT = gTrue; - break; - default: - cover(33); - error(getPos(), "Unknown marker segment %02x in JPX stream", segType); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - break; - } - } - break; - } - } while (!haveSOT); - - if (!haveSIZ) { - error(getPos(), "Missing SIZ marker segment in JPX stream"); - return gFalse; - } - if (!haveCOD) { - error(getPos(), "Missing COD marker segment in JPX stream"); - return gFalse; - } - if (!haveQCD) { - error(getPos(), "Missing QCD marker segment in JPX stream"); - return gFalse; - } - - //----- read the tile-parts - while (1) { - if (!readTilePart()) { - return gFalse; - } - if (!readMarkerHdr(&segType, &segLen)) { - error(getPos(), "Error in JPX codestream"); - return gFalse; - } - if (segType != 0x90) { // SOT - start of tile - break; - } - } - - if (segType != 0xd9) { // EOC - end of codestream - error(getPos(), "Missing EOC marker in JPX codestream"); - return gFalse; - } - - //----- finish decoding the image - for (i = 0; i < img.nXTiles * img.nYTiles; ++i) { - tile = &img.tiles[i]; - for (comp = 0; comp < img.nComps; ++comp) { - tileComp = &tile->tileComps[comp]; - inverseTransform(tileComp); - } - if (!inverseMultiCompAndDC(tile)) { - return gFalse; - } - } - - //~ can free memory below tileComps here, and also tileComp.buf - - return gTrue; -} - -GBool JPXStream::readTilePart() { - JPXTile *tile; - JPXTileComp *tileComp; - JPXResLevel *resLevel; - JPXPrecinct *precinct; - JPXSubband *subband; - JPXCodeBlock *cb; - GBool haveSOD; - Guint tileIdx, tilePartLen, tilePartIdx, nTileParts; - GBool tilePartToEOC; - Guint precinctSize, style; - Guint n, nSBs, nx, ny, sbx0, sby0, comp, segLen; - Guint i, j, k, cbX, cbY, r, pre, sb, cbi; - int segType, level; - - // process the SOT marker segment - if (!readUWord(&tileIdx) || - !readULong(&tilePartLen) || - !readUByte(&tilePartIdx) || - !readUByte(&nTileParts)) { - error(getPos(), "Error in JPX SOT marker segment"); - return gFalse; - } - - if (tileIdx >= img.nXTiles * img.nYTiles) { - error(getPos(), "Weird tile index in JPX stream"); - return gFalse; - } - - tilePartToEOC = tilePartLen == 0; - tilePartLen -= 12; // subtract size of SOT segment - - haveSOD = gFalse; - do { - if (!readMarkerHdr(&segType, &segLen)) { - error(getPos(), "Error in JPX tile-part codestream"); - return gFalse; - } - tilePartLen -= 2 + segLen; - switch (segType) { - case 0x52: // COD - coding style default - cover(34); - if (!readUByte(&img.tiles[tileIdx].tileComps[0].style) || - !readUByte(&img.tiles[tileIdx].progOrder) || - !readUWord(&img.tiles[tileIdx].nLayers) || - !readUByte(&img.tiles[tileIdx].multiComp) || - !readUByte(&img.tiles[tileIdx].tileComps[0].nDecompLevels) || - !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockW) || - !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockH) || - !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockStyle) || - !readUByte(&img.tiles[tileIdx].tileComps[0].transform)) { - error(getPos(), "Error in JPX COD marker segment"); - return gFalse; - } - img.tiles[tileIdx].tileComps[0].codeBlockW += 2; - img.tiles[tileIdx].tileComps[0].codeBlockH += 2; - for (comp = 0; comp < img.nComps; ++comp) { - if (comp != 0) { - img.tiles[tileIdx].tileComps[comp].style = - img.tiles[tileIdx].tileComps[0].style; - img.tiles[tileIdx].tileComps[comp].nDecompLevels = - img.tiles[tileIdx].tileComps[0].nDecompLevels; - img.tiles[tileIdx].tileComps[comp].codeBlockW = - img.tiles[tileIdx].tileComps[0].codeBlockW; - img.tiles[tileIdx].tileComps[comp].codeBlockH = - img.tiles[tileIdx].tileComps[0].codeBlockH; - img.tiles[tileIdx].tileComps[comp].codeBlockStyle = - img.tiles[tileIdx].tileComps[0].codeBlockStyle; - img.tiles[tileIdx].tileComps[comp].transform = - img.tiles[tileIdx].tileComps[0].transform; - } - img.tiles[tileIdx].tileComps[comp].resLevels = - (JPXResLevel *)greallocn( - img.tiles[tileIdx].tileComps[comp].resLevels, - (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1), - sizeof(JPXResLevel)); - for (r = 0; - r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; - ++r) { - img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL; - } - } - for (r = 0; r <= img.tiles[tileIdx].tileComps[0].nDecompLevels; ++r) { - if (img.tiles[tileIdx].tileComps[0].style & 0x01) { - if (!readUByte(&precinctSize)) { - error(getPos(), "Error in JPX COD marker segment"); - return gFalse; - } - img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth = - precinctSize & 0x0f; - img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight = - (precinctSize >> 4) & 0x0f; - } else { - img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth = 15; - img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight = 15; - } - } - for (comp = 1; comp < img.nComps; ++comp) { - for (r = 0; - r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; - ++r) { - img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = - img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth; - img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = - img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight; - } - } - break; - case 0x53: // COC - coding style component - cover(35); - if ((img.nComps > 256 && !readUWord(&comp)) || - (img.nComps <= 256 && !readUByte(&comp)) || - comp >= img.nComps || - !readUByte(&style) || - !readUByte(&img.tiles[tileIdx].tileComps[comp].nDecompLevels) || - !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockW) || - !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockH) || - !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockStyle) || - !readUByte(&img.tiles[tileIdx].tileComps[comp].transform)) { - error(getPos(), "Error in JPX COC marker segment"); - return gFalse; - } - img.tiles[tileIdx].tileComps[comp].style = - (img.tiles[tileIdx].tileComps[comp].style & ~1) | (style & 1); - img.tiles[tileIdx].tileComps[comp].codeBlockW += 2; - img.tiles[tileIdx].tileComps[comp].codeBlockH += 2; - img.tiles[tileIdx].tileComps[comp].resLevels = - (JPXResLevel *)greallocn( - img.tiles[tileIdx].tileComps[comp].resLevels, - (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1), - sizeof(JPXResLevel)); - for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) { - img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL; - } - for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) { - if (img.tiles[tileIdx].tileComps[comp].style & 0x01) { - if (!readUByte(&precinctSize)) { - error(getPos(), "Error in JPX COD marker segment"); - return gFalse; - } - img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = - precinctSize & 0x0f; - img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = - (precinctSize >> 4) & 0x0f; - } else { - img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = 15; - img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = 15; - } - } - break; - case 0x5c: // QCD - quantization default - cover(36); - if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantStyle)) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x00) { - img.tiles[tileIdx].tileComps[0].nQuantSteps = - segLen - 3; - img.tiles[tileIdx].tileComps[0].quantSteps = - (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps, - img.tiles[tileIdx].tileComps[0].nQuantSteps, - sizeof(Guint)); - for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) { - if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - } - } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x01) { - img.tiles[tileIdx].tileComps[0].nQuantSteps = 1; - img.tiles[tileIdx].tileComps[0].quantSteps = - (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps, - img.tiles[tileIdx].tileComps[0].nQuantSteps, - sizeof(Guint)); - if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[0])) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x02) { - img.tiles[tileIdx].tileComps[0].nQuantSteps = (segLen - 3) / 2; - img.tiles[tileIdx].tileComps[0].quantSteps = - (Guint *)greallocn(img.tiles[tileIdx].tileComps[0].quantSteps, - img.tiles[tileIdx].tileComps[0].nQuantSteps, - sizeof(Guint)); - for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) { - if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - } - } else { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - for (comp = 1; comp < img.nComps; ++comp) { - img.tiles[tileIdx].tileComps[comp].quantStyle = - img.tiles[tileIdx].tileComps[0].quantStyle; - img.tiles[tileIdx].tileComps[comp].nQuantSteps = - img.tiles[tileIdx].tileComps[0].nQuantSteps; - img.tiles[tileIdx].tileComps[comp].quantSteps = - (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, - img.tiles[tileIdx].tileComps[0].nQuantSteps, - sizeof(Guint)); - for (j = 0; j < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++j) { - img.tiles[tileIdx].tileComps[comp].quantSteps[j] = - img.tiles[tileIdx].tileComps[0].quantSteps[j]; - } - } - break; - case 0x5d: // QCC - quantization component - cover(37); - if ((img.nComps > 256 && !readUWord(&comp)) || - (img.nComps <= 256 && !readUByte(&comp)) || - comp >= img.nComps || - !readUByte(&img.tiles[tileIdx].tileComps[comp].quantStyle)) { - error(getPos(), "Error in JPX QCC marker segment"); - return gFalse; - } - if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) == 0x00) { - img.tiles[tileIdx].tileComps[comp].nQuantSteps = - segLen - (img.nComps > 256 ? 5 : 4); - img.tiles[tileIdx].tileComps[comp].quantSteps = - (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, - img.tiles[tileIdx].tileComps[comp].nQuantSteps, - sizeof(Guint)); - for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) { - if (!readUByte(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) { - error(getPos(), "Error in JPX QCC marker segment"); - return gFalse; - } - } - } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) - == 0x01) { - img.tiles[tileIdx].tileComps[comp].nQuantSteps = 1; - img.tiles[tileIdx].tileComps[comp].quantSteps = - (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, - img.tiles[tileIdx].tileComps[comp].nQuantSteps, - sizeof(Guint)); - if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[0])) { - error(getPos(), "Error in JPX QCC marker segment"); - return gFalse; - } - } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) - == 0x02) { - img.tiles[tileIdx].tileComps[comp].nQuantSteps = - (segLen - (img.nComps > 256 ? 5 : 4)) / 2; - img.tiles[tileIdx].tileComps[comp].quantSteps = - (Guint *)greallocn(img.tiles[tileIdx].tileComps[comp].quantSteps, - img.tiles[tileIdx].tileComps[comp].nQuantSteps, - sizeof(Guint)); - for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) { - if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) { - error(getPos(), "Error in JPX QCD marker segment"); - return gFalse; - } - } - } else { - error(getPos(), "Error in JPX QCC marker segment"); - return gFalse; - } - break; - case 0x5e: // RGN - region of interest - cover(38); -#if 1 //~ ROI is unimplemented - fprintf(stderr, "RGN\n"); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX PPM marker segment"); - return gFalse; - } - } -#else - if ((img.nComps > 256 && !readUWord(&comp)) || - (img.nComps <= 256 && !readUByte(&comp)) || - comp >= img.nComps || - !readUByte(&compInfo[comp].roi.style) || - !readUByte(&compInfo[comp].roi.shift)) { - error(getPos(), "Error in JPX RGN marker segment"); - return gFalse; - } -#endif - break; - case 0x5f: // POC - progression order change - cover(39); -#if 1 //~ progression order changes are unimplemented - fprintf(stderr, "POC\n"); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX PPM marker segment"); - return gFalse; - } - } -#else - nTileProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7); - tileProgs = (JPXProgOrder *)gmallocn(nTileProgs, sizeof(JPXProgOrder)); - for (i = 0; i < nTileProgs; ++i) { - if (!readUByte(&tileProgs[i].startRes) || - !(img.nComps > 256 && readUWord(&tileProgs[i].startComp)) || - !(img.nComps <= 256 && readUByte(&tileProgs[i].startComp)) || - !readUWord(&tileProgs[i].endLayer) || - !readUByte(&tileProgs[i].endRes) || - !(img.nComps > 256 && readUWord(&tileProgs[i].endComp)) || - !(img.nComps <= 256 && readUByte(&tileProgs[i].endComp)) || - !readUByte(&tileProgs[i].progOrder)) { - error(getPos(), "Error in JPX POC marker segment"); - return gFalse; - } - } -#endif - break; - case 0x61: // PPT - packed packet headers, tile-part hdr - cover(40); -#if 1 //~ packed packet headers are unimplemented - fprintf(stderr, "PPT\n"); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX PPT marker segment"); - return gFalse; - } - } -#endif - case 0x58: // PLT - packet length, tile-part header - // skipped - cover(41); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX PLT marker segment"); - return gFalse; - } - } - break; - case 0x64: // COM - comment - // skipped - cover(42); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - error(getPos(), "Error in JPX COM marker segment"); - return gFalse; - } - } - break; - case 0x93: // SOD - start of data - cover(43); - haveSOD = gTrue; - break; - default: - cover(44); - error(getPos(), "Unknown marker segment %02x in JPX tile-part stream", - segType); - for (i = 0; i < segLen - 2; ++i) { - if (str->getChar() == EOF) { - break; - } - } - break; - } - } while (!haveSOD); - - //----- initialize the tile, precincts, and code-blocks - if (tilePartIdx == 0) { - tile = &img.tiles[tileIdx]; - i = tileIdx / img.nXTiles; - j = tileIdx % img.nXTiles; - if ((tile->x0 = img.xTileOffset + j * img.xTileSize) < img.xOffset) { - tile->x0 = img.xOffset; - } - if ((tile->y0 = img.yTileOffset + i * img.yTileSize) < img.yOffset) { - tile->y0 = img.yOffset; - } - if ((tile->x1 = img.xTileOffset + (j + 1) * img.xTileSize) > img.xSize) { - tile->x1 = img.xSize; - } - if ((tile->y1 = img.yTileOffset + (i + 1) * img.yTileSize) > img.ySize) { - tile->y1 = img.ySize; - } - tile->comp = 0; - tile->res = 0; - tile->precinct = 0; - tile->layer = 0; - tile->maxNDecompLevels = 0; - for (comp = 0; comp < img.nComps; ++comp) { - tileComp = &tile->tileComps[comp]; - if (tileComp->nDecompLevels > tile->maxNDecompLevels) { - tile->maxNDecompLevels = tileComp->nDecompLevels; - } - tileComp->x0 = jpxCeilDiv(tile->x0, tileComp->hSep); - tileComp->y0 = jpxCeilDiv(tile->y0, tileComp->hSep); - tileComp->x1 = jpxCeilDiv(tile->x1, tileComp->hSep); - tileComp->y1 = jpxCeilDiv(tile->y1, tileComp->hSep); - tileComp->cbW = 1 << tileComp->codeBlockW; - tileComp->cbH = 1 << tileComp->codeBlockH; - tileComp->data = (int *)gmallocn((tileComp->x1 - tileComp->x0) * - (tileComp->y1 - tileComp->y0), - sizeof(int)); - if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) { - n = tileComp->x1 - tileComp->x0; - } else { - n = tileComp->y1 - tileComp->y0; - } - tileComp->buf = (int *)gmallocn(n + 8, sizeof(int)); - for (r = 0; r <= tileComp->nDecompLevels; ++r) { - resLevel = &tileComp->resLevels[r]; - k = r == 0 ? tileComp->nDecompLevels - : tileComp->nDecompLevels - r + 1; - resLevel->x0 = jpxCeilDivPow2(tileComp->x0, k); - resLevel->y0 = jpxCeilDivPow2(tileComp->y0, k); - resLevel->x1 = jpxCeilDivPow2(tileComp->x1, k); - resLevel->y1 = jpxCeilDivPow2(tileComp->y1, k); - if (r == 0) { - resLevel->bx0[0] = resLevel->x0; - resLevel->by0[0] = resLevel->y0; - resLevel->bx1[0] = resLevel->x1; - resLevel->by1[0] = resLevel->y1; - } else { - resLevel->bx0[0] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k); - resLevel->by0[0] = resLevel->y0; - resLevel->bx1[0] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k); - resLevel->by1[0] = resLevel->y1; - resLevel->bx0[1] = resLevel->x0; - resLevel->by0[1] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k); - resLevel->bx1[1] = resLevel->x1; - resLevel->by1[1] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k); - resLevel->bx0[2] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k); - resLevel->by0[2] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k); - resLevel->bx1[2] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k); - resLevel->by1[2] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k); - } - resLevel->precincts = (JPXPrecinct *)gmallocn(1, sizeof(JPXPrecinct)); - for (pre = 0; pre < 1; ++pre) { - precinct = &resLevel->precincts[pre]; - precinct->x0 = resLevel->x0; - precinct->y0 = resLevel->y0; - precinct->x1 = resLevel->x1; - precinct->y1 = resLevel->y1; - nSBs = r == 0 ? 1 : 3; - precinct->subbands = - (JPXSubband *)gmallocn(nSBs, sizeof(JPXSubband)); - for (sb = 0; sb < nSBs; ++sb) { - subband = &precinct->subbands[sb]; - subband->x0 = resLevel->bx0[sb]; - subband->y0 = resLevel->by0[sb]; - subband->x1 = resLevel->bx1[sb]; - subband->y1 = resLevel->by1[sb]; - subband->nXCBs = jpxCeilDivPow2(subband->x1, - tileComp->codeBlockW) - - jpxFloorDivPow2(subband->x0, - tileComp->codeBlockW); - subband->nYCBs = jpxCeilDivPow2(subband->y1, - tileComp->codeBlockH) - - jpxFloorDivPow2(subband->y0, - tileComp->codeBlockH); - n = subband->nXCBs > subband->nYCBs ? subband->nXCBs - : subband->nYCBs; - for (subband->maxTTLevel = 0, --n; - n; - ++subband->maxTTLevel, n >>= 1) ; - n = 0; - for (level = subband->maxTTLevel; level >= 0; --level) { - nx = jpxCeilDivPow2(subband->nXCBs, level); - ny = jpxCeilDivPow2(subband->nYCBs, level); - n += nx * ny; - } - subband->inclusion = - (JPXTagTreeNode *)gmallocn(n, sizeof(JPXTagTreeNode)); - subband->zeroBitPlane = - (JPXTagTreeNode *)gmallocn(n, sizeof(JPXTagTreeNode)); - for (k = 0; k < n; ++k) { - subband->inclusion[k].finished = gFalse; - subband->inclusion[k].val = 0; - subband->zeroBitPlane[k].finished = gFalse; - subband->zeroBitPlane[k].val = 0; - } - subband->cbs = (JPXCodeBlock *)gmallocn(subband->nXCBs * - subband->nYCBs, - sizeof(JPXCodeBlock)); - sbx0 = jpxFloorDivPow2(subband->x0, tileComp->codeBlockW); - sby0 = jpxFloorDivPow2(subband->y0, tileComp->codeBlockH); - cb = subband->cbs; - for (cbY = 0; cbY < subband->nYCBs; ++cbY) { - for (cbX = 0; cbX < subband->nXCBs; ++cbX) { - cb->x0 = (sbx0 + cbX) << tileComp->codeBlockW; - cb->x1 = cb->x0 + tileComp->cbW; - if (subband->x0 > cb->x0) { - cb->x0 = subband->x0; - } - if (subband->x1 < cb->x1) { - cb->x1 = subband->x1; - } - cb->y0 = (sby0 + cbY) << tileComp->codeBlockH; - cb->y1 = cb->y0 + tileComp->cbH; - if (subband->y0 > cb->y0) { - cb->y0 = subband->y0; - } - if (subband->y1 < cb->y1) { - cb->y1 = subband->y1; - } - cb->seen = gFalse; - cb->lBlock = 3; - cb->nextPass = jpxPassCleanup; - cb->nZeroBitPlanes = 0; - cb->coeffs = - (JPXCoeff *)gmallocn((1 << (tileComp->codeBlockW - + tileComp->codeBlockH)), - sizeof(JPXCoeff)); - for (cbi = 0; - cbi < (Guint)(1 << (tileComp->codeBlockW - + tileComp->codeBlockH)); - ++cbi) { - cb->coeffs[cbi].flags = 0; - cb->coeffs[cbi].len = 0; - cb->coeffs[cbi].mag = 0; - } - cb->arithDecoder = NULL; - cb->stats = NULL; - ++cb; - } - } - } - } - } - } - } - - return readTilePartData(tileIdx, tilePartLen, tilePartToEOC); -} - -GBool JPXStream::readTilePartData(Guint tileIdx, - Guint tilePartLen, GBool tilePartToEOC) { - JPXTile *tile; - JPXTileComp *tileComp; - JPXResLevel *resLevel; - JPXPrecinct *precinct; - JPXSubband *subband; - JPXCodeBlock *cb; - Guint ttVal; - Guint bits, cbX, cbY, nx, ny, i, j, n, sb; - int level; - - tile = &img.tiles[tileIdx]; - - // read all packets from this tile-part - while (1) { - if (tilePartToEOC) { - //~ peek for an EOC marker - cover(93); - } else if (tilePartLen == 0) { - break; - } - - tileComp = &tile->tileComps[tile->comp]; - resLevel = &tileComp->resLevels[tile->res]; - precinct = &resLevel->precincts[tile->precinct]; - - //----- packet header - - // setup - startBitBuf(tilePartLen); - - // zero-length flag - if (!readBits(1, &bits)) { - goto err; - } - if (!bits) { - // packet is empty -- clear all code-block inclusion flags - cover(45); - for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) { - subband = &precinct->subbands[sb]; - for (cbY = 0; cbY < subband->nYCBs; ++cbY) { - for (cbX = 0; cbX < subband->nXCBs; ++cbX) { - cb = &subband->cbs[cbY * subband->nXCBs + cbX]; - cb->included = gFalse; - } - } - } - } else { - - for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) { - subband = &precinct->subbands[sb]; - for (cbY = 0; cbY < subband->nYCBs; ++cbY) { - for (cbX = 0; cbX < subband->nXCBs; ++cbX) { - cb = &subband->cbs[cbY * subband->nXCBs + cbX]; - - // skip code-blocks with no coefficients - if (cb->x0 >= cb->x1 || cb->y0 >= cb->y1) { - cover(46); - cb->included = gFalse; - continue; - } - - // code-block inclusion - if (cb->seen) { - cover(47); - if (!readBits(1, &cb->included)) { - goto err; - } - } else { - cover(48); - ttVal = 0; - i = 0; - for (level = subband->maxTTLevel; level >= 0; --level) { - nx = jpxCeilDivPow2(subband->nXCBs, level); - ny = jpxCeilDivPow2(subband->nYCBs, level); - j = i + (cbY >> level) * nx + (cbX >> level); - if (!subband->inclusion[j].finished && - !subband->inclusion[j].val) { - subband->inclusion[j].val = ttVal; - } else { - ttVal = subband->inclusion[j].val; - } - while (!subband->inclusion[j].finished && - ttVal <= tile->layer) { - if (!readBits(1, &bits)) { - goto err; - } - if (bits == 1) { - subband->inclusion[j].finished = gTrue; - } else { - ++ttVal; - } - } - subband->inclusion[j].val = ttVal; - if (ttVal > tile->layer) { - break; - } - i += nx * ny; - } - cb->included = level < 0; - } - - if (cb->included) { - cover(49); - - // zero bit-plane count - if (!cb->seen) { - cover(50); - ttVal = 0; - i = 0; - for (level = subband->maxTTLevel; level >= 0; --level) { - nx = jpxCeilDivPow2(subband->nXCBs, level); - ny = jpxCeilDivPow2(subband->nYCBs, level); - j = i + (cbY >> level) * nx + (cbX >> level); - if (!subband->zeroBitPlane[j].finished && - !subband->zeroBitPlane[j].val) { - subband->zeroBitPlane[j].val = ttVal; - } else { - ttVal = subband->zeroBitPlane[j].val; - } - while (!subband->zeroBitPlane[j].finished) { - if (!readBits(1, &bits)) { - goto err; - } - if (bits == 1) { - subband->zeroBitPlane[j].finished = gTrue; - } else { - ++ttVal; - } - } - subband->zeroBitPlane[j].val = ttVal; - i += nx * ny; - } - cb->nZeroBitPlanes = ttVal; - } - - // number of coding passes - if (!readBits(1, &bits)) { - goto err; - } - if (bits == 0) { - cover(51); - cb->nCodingPasses = 1; - } else { - if (!readBits(1, &bits)) { - goto err; - } - if (bits == 0) { - cover(52); - cb->nCodingPasses = 2; - } else { - cover(53); - if (!readBits(2, &bits)) { - goto err; - } - if (bits < 3) { - cover(54); - cb->nCodingPasses = 3 + bits; - } else { - cover(55); - if (!readBits(5, &bits)) { - goto err; - } - if (bits < 31) { - cover(56); - cb->nCodingPasses = 6 + bits; - } else { - cover(57); - if (!readBits(7, &bits)) { - goto err; - } - cb->nCodingPasses = 37 + bits; - } - } - } - } - - // update Lblock - while (1) { - if (!readBits(1, &bits)) { - goto err; - } - if (!bits) { - break; - } - ++cb->lBlock; - } - - // length of compressed data - //~ deal with multiple codeword segments - for (n = cb->lBlock, i = cb->nCodingPasses >> 1; - i; - ++n, i >>= 1) ; - if (!readBits(n, &cb->dataLen)) { - goto err; - } - } - } - } - } - } - tilePartLen = finishBitBuf(); - - //----- packet data - - for (sb = 0; sb < (Guint)(tile->res == 0 ? 1 : 3); ++sb) { - subband = &precinct->subbands[sb]; - for (cbY = 0; cbY < subband->nYCBs; ++cbY) { - for (cbX = 0; cbX < subband->nXCBs; ++cbX) { - cb = &subband->cbs[cbY * subband->nXCBs + cbX]; - if (cb->included) { - if (!readCodeBlockData(tileComp, resLevel, precinct, subband, - tile->res, sb, cb)) { - return gFalse; - } - tilePartLen -= cb->dataLen; - cb->seen = gTrue; - } - } - } - } - - //----- next packet - - switch (tile->progOrder) { - case 0: // layer, resolution level, component, precinct - cover(58); - if (++tile->comp == img.nComps) { - tile->comp = 0; - if (++tile->res == tile->maxNDecompLevels + 1) { - tile->res = 0; - if (++tile->layer == tile->nLayers) { - tile->layer = 0; - } - } - } - break; - case 1: // resolution level, layer, component, precinct - cover(59); - if (++tile->comp == img.nComps) { - tile->comp = 0; - if (++tile->layer == tile->nLayers) { - tile->layer = 0; - if (++tile->res == tile->maxNDecompLevels + 1) { - tile->res = 0; - } - } - } - break; - case 2: // resolution level, precinct, component, layer - //~ this isn't correct -- see B.12.1.3 - cover(60); - if (++tile->layer == tile->nLayers) { - tile->layer = 0; - if (++tile->comp == img.nComps) { - tile->comp = 0; - if (++tile->res == tile->maxNDecompLevels + 1) { - tile->res = 0; - } - } - } - break; - case 3: // precinct, component, resolution level, layer - //~ this isn't correct -- see B.12.1.4 - cover(61); - if (++tile->layer == tile->nLayers) { - tile->layer = 0; - if (++tile->res == tile->maxNDecompLevels + 1) { - tile->res = 0; - if (++tile->comp == img.nComps) { - tile->comp = 0; - } - } - } - break; - case 4: // component, precinct, resolution level, layer - //~ this isn't correct -- see B.12.1.5 - cover(62); - if (++tile->layer == tile->nLayers) { - tile->layer = 0; - if (++tile->res == tile->maxNDecompLevels + 1) { - tile->res = 0; - if (++tile->comp == img.nComps) { - tile->comp = 0; - } - } - } - break; - } - } - - return gTrue; - - err: - error(getPos(), "Error in JPX stream"); - return gFalse; -} - -GBool JPXStream::readCodeBlockData(JPXTileComp *tileComp, - JPXResLevel *resLevel, - JPXPrecinct *precinct, - JPXSubband *subband, - Guint res, Guint sb, - JPXCodeBlock *cb) { - JPXCoeff *coeff0, *coeff1, *coeff; - Guint horiz, vert, diag, all, cx, xorBit; - int horizSign, vertSign; - Guint i, x, y0, y1, y2; - - if (cb->arithDecoder) { - cover(63); - cb->arithDecoder->restart(cb->dataLen); - } else { - cover(64); - cb->arithDecoder = new JArithmeticDecoder(); - cb->arithDecoder->setStream(str, cb->dataLen); - cb->arithDecoder->start(); - cb->stats = new JArithmeticDecoderStats(jpxNContexts); - cb->stats->setEntry(jpxContextSigProp, 4, 0); - cb->stats->setEntry(jpxContextRunLength, 3, 0); - cb->stats->setEntry(jpxContextUniform, 46, 0); - } - - for (i = 0; i < cb->nCodingPasses; ++i) { - switch (cb->nextPass) { - - //----- significance propagation pass - case jpxPassSigProp: - cover(65); - for (y0 = cb->y0, coeff0 = cb->coeffs; - y0 < cb->y1; - y0 += 4, coeff0 += 4 << tileComp->codeBlockW) { - for (x = cb->x0, coeff1 = coeff0; - x < cb->x1; - ++x, ++coeff1) { - for (y1 = 0, coeff = coeff1; - y1 < 4 && y0+y1 < cb->y1; - ++y1, coeff += tileComp->cbW) { - if (!(coeff->flags & jpxCoeffSignificant)) { - horiz = vert = diag = 0; - horizSign = vertSign = 2; - if (x > cb->x0) { - if (coeff[-1].flags & jpxCoeffSignificant) { - ++horiz; - horizSign += (coeff[-1].flags & jpxCoeffSign) ? -1 : 1; - } - if (y0+y1 > cb->y0) { - diag += (coeff[-(int)tileComp->cbW - 1].flags - >> jpxCoeffSignificantB) & 1; - } - if (y0+y1 < cb->y1 - 1) { - diag += (coeff[tileComp->cbW - 1].flags - >> jpxCoeffSignificantB) & 1; - } - } - if (x < cb->x1 - 1) { - if (coeff[1].flags & jpxCoeffSignificant) { - ++horiz; - horizSign += (coeff[1].flags & jpxCoeffSign) ? -1 : 1; - } - if (y0+y1 > cb->y0) { - diag += (coeff[-(int)tileComp->cbW + 1].flags - >> jpxCoeffSignificantB) & 1; - } - if (y0+y1 < cb->y1 - 1) { - diag += (coeff[tileComp->cbW + 1].flags - >> jpxCoeffSignificantB) & 1; - } - } - if (y0+y1 > cb->y0) { - if (coeff[-(int)tileComp->cbW].flags & jpxCoeffSignificant) { - ++vert; - vertSign += (coeff[-(int)tileComp->cbW].flags & jpxCoeffSign) - ? -1 : 1; - } - } - if (y0+y1 < cb->y1 - 1) { - if (coeff[tileComp->cbW].flags & jpxCoeffSignificant) { - ++vert; - vertSign += (coeff[tileComp->cbW].flags & jpxCoeffSign) - ? -1 : 1; - } - } - cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb]; - if (cx != 0) { - if (cb->arithDecoder->decodeBit(cx, cb->stats)) { - coeff->flags |= jpxCoeffSignificant | jpxCoeffFirstMagRef; - coeff->mag = (coeff->mag << 1) | 1; - cx = signContext[horizSign][vertSign][0]; - xorBit = signContext[horizSign][vertSign][1]; - if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) { - coeff->flags |= jpxCoeffSign; - } - } - ++coeff->len; - coeff->flags |= jpxCoeffTouched; - } - } - } - } - } - ++cb->nextPass; - break; - - //----- magnitude refinement pass - case jpxPassMagRef: - cover(66); - for (y0 = cb->y0, coeff0 = cb->coeffs; - y0 < cb->y1; - y0 += 4, coeff0 += 4 << tileComp->codeBlockW) { - for (x = cb->x0, coeff1 = coeff0; - x < cb->x1; - ++x, ++coeff1) { - for (y1 = 0, coeff = coeff1; - y1 < 4 && y0+y1 < cb->y1; - ++y1, coeff += tileComp->cbW) { - if ((coeff->flags & jpxCoeffSignificant) && - !(coeff->flags & jpxCoeffTouched)) { - if (coeff->flags & jpxCoeffFirstMagRef) { - all = 0; - if (x > cb->x0) { - all += (coeff[-1].flags >> jpxCoeffSignificantB) & 1; - if (y0+y1 > cb->y0) { - all += (coeff[-(int)tileComp->cbW - 1].flags - >> jpxCoeffSignificantB) & 1; - } - if (y0+y1 < cb->y1 - 1) { - all += (coeff[tileComp->cbW - 1].flags - >> jpxCoeffSignificantB) & 1; - } - } - if (x < cb->x1 - 1) { - all += (coeff[1].flags >> jpxCoeffSignificantB) & 1; - if (y0+y1 > cb->y0) { - all += (coeff[-(int)tileComp->cbW + 1].flags - >> jpxCoeffSignificantB) & 1; - } - if (y0+y1 < cb->y1 - 1) { - all += (coeff[tileComp->cbW + 1].flags - >> jpxCoeffSignificantB) & 1; - } - } - if (y0+y1 > cb->y0) { - all += (coeff[-(int)tileComp->cbW].flags - >> jpxCoeffSignificantB) & 1; - } - if (y0+y1 < cb->y1 - 1) { - all += (coeff[tileComp->cbW].flags - >> jpxCoeffSignificantB) & 1; - } - cx = all ? 15 : 14; - } else { - cx = 16; - } - coeff->mag = (coeff->mag << 1) | - cb->arithDecoder->decodeBit(cx, cb->stats); - ++coeff->len; - coeff->flags |= jpxCoeffTouched; - coeff->flags &= ~jpxCoeffFirstMagRef; - } - } - } - } - ++cb->nextPass; - break; - - //----- cleanup pass - case jpxPassCleanup: - cover(67); - for (y0 = cb->y0, coeff0 = cb->coeffs; - y0 < cb->y1; - y0 += 4, coeff0 += 4 << tileComp->codeBlockW) { - for (x = cb->x0, coeff1 = coeff0; - x < cb->x1; - ++x, ++coeff1) { - y1 = 0; - if (y0 + 3 < cb->y1 && - !(coeff1->flags & jpxCoeffTouched) && - !(coeff1[tileComp->cbW].flags & jpxCoeffTouched) && - !(coeff1[2 * tileComp->cbW].flags & jpxCoeffTouched) && - !(coeff1[3 * tileComp->cbW].flags & jpxCoeffTouched) && - (x == cb->x0 || y0 == cb->y0 || - !(coeff1[-(int)tileComp->cbW - 1].flags - & jpxCoeffSignificant)) && - (y0 == cb->y0 || - !(coeff1[-(int)tileComp->cbW].flags - & jpxCoeffSignificant)) && - (x == cb->x1 - 1 || y0 == cb->y0 || - !(coeff1[-(int)tileComp->cbW + 1].flags - & jpxCoeffSignificant)) && - (x == cb->x0 || - (!(coeff1[-1].flags & jpxCoeffSignificant) && - !(coeff1[tileComp->cbW - 1].flags - & jpxCoeffSignificant) && - !(coeff1[2 * tileComp->cbW - 1].flags - & jpxCoeffSignificant) && - !(coeff1[3 * tileComp->cbW - 1].flags - & jpxCoeffSignificant))) && - (x == cb->x1 - 1 || - (!(coeff1[1].flags & jpxCoeffSignificant) && - !(coeff1[tileComp->cbW + 1].flags - & jpxCoeffSignificant) && - !(coeff1[2 * tileComp->cbW + 1].flags - & jpxCoeffSignificant) && - !(coeff1[3 * tileComp->cbW + 1].flags - & jpxCoeffSignificant))) && - (x == cb->x0 || y0+4 == cb->y1 || - !(coeff1[4 * tileComp->cbW - 1].flags & jpxCoeffSignificant)) && - (y0+4 == cb->y1 || - !(coeff1[4 * tileComp->cbW].flags & jpxCoeffSignificant)) && - (x == cb->x1 - 1 || y0+4 == cb->y1 || - !(coeff1[4 * tileComp->cbW + 1].flags - & jpxCoeffSignificant))) { - if (cb->arithDecoder->decodeBit(jpxContextRunLength, cb->stats)) { - y1 = cb->arithDecoder->decodeBit(jpxContextUniform, cb->stats); - y1 = (y1 << 1) | - cb->arithDecoder->decodeBit(jpxContextUniform, cb->stats); - for (y2 = 0, coeff = coeff1; - y2 < y1; - ++y2, coeff += tileComp->cbW) { - ++coeff->len; - } - coeff->flags |= jpxCoeffSignificant | jpxCoeffFirstMagRef; - coeff->mag = (coeff->mag << 1) | 1; - ++coeff->len; - cx = signContext[2][2][0]; - xorBit = signContext[2][2][1]; - if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) { - coeff->flags |= jpxCoeffSign; - } - ++y1; - } else { - for (y1 = 0, coeff = coeff1; - y1 < 4; - ++y1, coeff += tileComp->cbW) { - ++coeff->len; - } - y1 = 4; - } - } - for (coeff = &coeff1[y1 << tileComp->codeBlockW]; - y1 < 4 && y0 + y1 < cb->y1; - ++y1, coeff += tileComp->cbW) { - if (!(coeff->flags & jpxCoeffTouched)) { - horiz = vert = diag = 0; - horizSign = vertSign = 2; - if (x > cb->x0) { - if (coeff[-1].flags & jpxCoeffSignificant) { - ++horiz; - horizSign += (coeff[-1].flags & jpxCoeffSign) ? -1 : 1; - } - if (y0+y1 > cb->y0) { - diag += (coeff[-(int)tileComp->cbW - 1].flags - >> jpxCoeffSignificantB) & 1; - } - if (y0+y1 < cb->y1 - 1) { - diag += (coeff[tileComp->cbW - 1].flags - >> jpxCoeffSignificantB) & 1; - } - } - if (x < cb->x1 - 1) { - if (coeff[1].flags & jpxCoeffSignificant) { - ++horiz; - horizSign += (coeff[1].flags & jpxCoeffSign) ? -1 : 1; - } - if (y0+y1 > cb->y0) { - diag += (coeff[-(int)tileComp->cbW + 1].flags - >> jpxCoeffSignificantB) & 1; - } - if (y0+y1 < cb->y1 - 1) { - diag += (coeff[tileComp->cbW + 1].flags - >> jpxCoeffSignificantB) & 1; - } - } - if (y0+y1 > cb->y0) { - if (coeff[-(int)tileComp->cbW].flags & jpxCoeffSignificant) { - ++vert; - vertSign += (coeff[-(int)tileComp->cbW].flags & jpxCoeffSign) - ? -1 : 1; - } - } - if (y0+y1 < cb->y1 - 1) { - if (coeff[tileComp->cbW].flags & jpxCoeffSignificant) { - ++vert; - vertSign += (coeff[tileComp->cbW].flags & jpxCoeffSign) - ? -1 : 1; - } - } - cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb]; - if (cb->arithDecoder->decodeBit(cx, cb->stats)) { - coeff->flags |= jpxCoeffSignificant | jpxCoeffFirstMagRef; - coeff->mag = (coeff->mag << 1) | 1; - cx = signContext[horizSign][vertSign][0]; - xorBit = signContext[horizSign][vertSign][1]; - if (cb->arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) { - coeff->flags |= jpxCoeffSign; - } - } - ++coeff->len; - } else { - coeff->flags &= ~jpxCoeffTouched; - } - } - } - } - cb->nextPass = jpxPassSigProp; - break; - } - } - - cb->arithDecoder->cleanup(); - return gTrue; -} - -// Inverse quantization, and wavelet transform (IDWT). This also does -// the initial shift to convert to fixed point format. -void JPXStream::inverseTransform(JPXTileComp *tileComp) { - JPXResLevel *resLevel; - JPXPrecinct *precinct; - JPXSubband *subband; - JPXCodeBlock *cb; - JPXCoeff *coeff0, *coeff; - Guint qStyle, guard, eps, shift; - int shift2; - double mu; - int val; - int *dataPtr; - Guint nx0, ny0, nx1, ny1; - Guint r, cbX, cbY, x, y; - - cover(68); - - //----- (NL)LL subband (resolution level 0) - - resLevel = &tileComp->resLevels[0]; - precinct = &resLevel->precincts[0]; - subband = &precinct->subbands[0]; - - // i-quant parameters - qStyle = tileComp->quantStyle & 0x1f; - guard = (tileComp->quantStyle >> 5) & 7; - if (qStyle == 0) { - cover(69); - eps = (tileComp->quantSteps[0] >> 3) & 0x1f; - shift = guard + eps - 1; - mu = 0; // make gcc happy - } else { - cover(70); - shift = guard - 1 + tileComp->prec; - mu = (double)(0x800 + (tileComp->quantSteps[0] & 0x7ff)) / 2048.0; - } - if (tileComp->transform == 0) { - cover(71); - shift += fracBits; - } - - // copy (NL)LL into the upper-left corner of the data array, doing - // the fixed point adjustment and dequantization along the way - cb = subband->cbs; - for (cbY = 0; cbY < subband->nYCBs; ++cbY) { - for (cbX = 0; cbX < subband->nXCBs; ++cbX) { - for (y = cb->y0, coeff0 = cb->coeffs; - y < cb->y1; - ++y, coeff0 += tileComp->cbW) { - dataPtr = &tileComp->data[(y - subband->y0) - * (tileComp->x1 - tileComp->x0) - + (cb->x0 - subband->x0)]; - for (x = cb->x0, coeff = coeff0; x < cb->x1; ++x, ++coeff) { - val = (int)coeff->mag; - if (val != 0) { - shift2 = shift - (cb->nZeroBitPlanes + coeff->len); - if (shift2 > 0) { - cover(94); - val = (val << shift2) + (1 << (shift2 - 1)); - } else { - cover(95); - val >>= -shift2; - } - if (qStyle == 0) { - cover(96); - if (tileComp->transform == 0) { - cover(97); - val &= -1 << fracBits; - } - } else { - cover(98); - val = (int)((double)val * mu); - } - if (coeff->flags & jpxCoeffSign) { - cover(99); - val = -val; - } - } - *dataPtr++ = val; - } - } - ++cb; - } - } - - //----- IDWT for each level - - for (r = 1; r <= tileComp->nDecompLevels; ++r) { - resLevel = &tileComp->resLevels[r]; - - // (n)LL is already in the upper-left corner of the - // tile-component data array -- interleave with (n)HL/LH/HH - // and inverse transform to get (n-1)LL, which will be stored - // in the upper-left corner of the tile-component data array - if (r == tileComp->nDecompLevels) { - cover(72); - nx0 = tileComp->x0; - ny0 = tileComp->y0; - nx1 = tileComp->x1; - ny1 = tileComp->y1; - } else { - cover(73); - nx0 = tileComp->resLevels[r+1].x0; - ny0 = tileComp->resLevels[r+1].y0; - nx1 = tileComp->resLevels[r+1].x1; - ny1 = tileComp->resLevels[r+1].y1; - } - inverseTransformLevel(tileComp, r, resLevel, nx0, ny0, nx1, ny1); - } -} - -// Do one level of the inverse transform: -// - take (n)LL from the tile-component data array -// - take (n)HL/LH/HH from -// - leave the resulting (n-1)LL in the tile-component data array -void JPXStream::inverseTransformLevel(JPXTileComp *tileComp, - Guint r, JPXResLevel *resLevel, - Guint nx0, Guint ny0, - Guint nx1, Guint ny1) { - JPXPrecinct *precinct; - JPXSubband *subband; - JPXCodeBlock *cb; - JPXCoeff *coeff0, *coeff; - Guint qStyle, guard, eps, shift, t; - int shift2; - double mu; - int val; - int *dataPtr; - Guint xo, yo; - Guint x, y, sb, cbX, cbY; - int xx, yy; - - //----- interleave - - // spread out LL - for (yy = resLevel->y1 - 1; yy >= (int)resLevel->y0; --yy) { - for (xx = resLevel->x1 - 1; xx >= (int)resLevel->x0; --xx) { - tileComp->data[(2 * yy - ny0) * (tileComp->x1 - tileComp->x0) - + (2 * xx - nx0)] = - tileComp->data[(yy - resLevel->y0) * (tileComp->x1 - tileComp->x0) - + (xx - resLevel->x0)]; - } - } - - // i-quant parameters - qStyle = tileComp->quantStyle & 0x1f; - guard = (tileComp->quantStyle >> 5) & 7; - - // interleave HL/LH/HH - precinct = &resLevel->precincts[0]; - for (sb = 0; sb < 3; ++sb) { - - // i-quant parameters - if (qStyle == 0) { - cover(100); - eps = (tileComp->quantSteps[3*r - 2 + sb] >> 3) & 0x1f; - shift = guard + eps - 1; - mu = 0; // make gcc happy - } else { - cover(101); - shift = guard + tileComp->prec; - if (sb == 2) { - cover(102); - ++shift; - } - t = tileComp->quantSteps[qStyle == 1 ? 0 : (3*r - 2 + sb)]; - mu = (double)(0x800 + (t & 0x7ff)) / 2048.0; - } - if (tileComp->transform == 0) { - cover(103); - shift += fracBits; - } - - // copy the subband coefficients into the data array, doing the - // fixed point adjustment and dequantization along the way - xo = (sb & 1) ? 0 : 1; - yo = (sb > 0) ? 1 : 0; - subband = &precinct->subbands[sb]; - cb = subband->cbs; - for (cbY = 0; cbY < subband->nYCBs; ++cbY) { - for (cbX = 0; cbX < subband->nXCBs; ++cbX) { - for (y = cb->y0, coeff0 = cb->coeffs; - y < cb->y1; - ++y, coeff0 += tileComp->cbW) { - dataPtr = &tileComp->data[(2 * y + yo - ny0) - * (tileComp->x1 - tileComp->x0) - + (2 * cb->x0 + xo - nx0)]; - for (x = cb->x0, coeff = coeff0; x < cb->x1; ++x, ++coeff) { - val = (int)coeff->mag; - if (val != 0) { - shift2 = shift - (cb->nZeroBitPlanes + coeff->len); - if (shift2 > 0) { - cover(74); - val = (val << shift2) + (1 << (shift2 - 1)); - } else { - cover(75); - val >>= -shift2; - } - if (qStyle == 0) { - cover(76); - if (tileComp->transform == 0) { - val &= -1 << fracBits; - } - } else { - cover(77); - val = (int)((double)val * mu); - } - if (coeff->flags & jpxCoeffSign) { - cover(78); - val = -val; - } - } - *dataPtr = val; - dataPtr += 2; - } - } - ++cb; - } - } - } - - //----- horizontal (row) transforms - dataPtr = tileComp->data; - for (y = 0; y < ny1 - ny0; ++y) { - inverseTransform1D(tileComp, dataPtr, 1, nx0, nx1); - dataPtr += tileComp->x1 - tileComp->x0; - } - - //----- vertical (column) transforms - dataPtr = tileComp->data; - for (x = 0; x < nx1 - nx0; ++x) { - inverseTransform1D(tileComp, dataPtr, - tileComp->x1 - tileComp->x0, ny0, ny1); - ++dataPtr; - } -} - -void JPXStream::inverseTransform1D(JPXTileComp *tileComp, - int *data, Guint stride, - Guint i0, Guint i1) { - int *buf; - Guint offset, end, i; - - //----- special case for length = 1 - if (i1 - i0 == 1) { - cover(79); - if (i0 & 1) { - cover(104); - *data >>= 1; - } - - } else { - cover(80); - - // choose an offset: this makes even buf[] indexes correspond to - // odd values of i, and vice versa - offset = 3 + (i0 & 1); - end = offset + i1 - i0; - - //----- gather - buf = tileComp->buf; - for (i = 0; i < i1 - i0; ++i) { - buf[offset + i] = data[i * stride]; - } - - //----- extend right - buf[end] = buf[end - 2]; - if (i1 - i0 == 2) { - cover(81); - buf[end+1] = buf[offset + 1]; - buf[end+2] = buf[offset]; - buf[end+3] = buf[offset + 1]; - } else { - cover(82); - buf[end+1] = buf[end - 3]; - if (i1 - i0 == 3) { - cover(105); - buf[end+2] = buf[offset + 1]; - buf[end+3] = buf[offset + 2]; - } else { - cover(106); - buf[end+2] = buf[end - 4]; - if (i1 - i0 == 4) { - cover(107); - buf[end+3] = buf[offset + 1]; - } else { - cover(108); - buf[end+3] = buf[end - 5]; - } - } - } - - //----- extend left - buf[offset - 1] = buf[offset + 1]; - buf[offset - 2] = buf[offset + 2]; - buf[offset - 3] = buf[offset + 3]; - if (offset == 4) { - cover(83); - buf[0] = buf[offset + 4]; - } - - //----- 9-7 irreversible filter - - if (tileComp->transform == 0) { - cover(84); - // step 1 (even) - for (i = 1; i <= end + 2; i += 2) { - buf[i] = (int)(idwtKappa * buf[i]); - } - // step 2 (odd) - for (i = 0; i <= end + 3; i += 2) { - buf[i] = (int)(idwtIKappa * buf[i]); - } - // step 3 (even) - for (i = 1; i <= end + 2; i += 2) { - buf[i] = (int)(buf[i] - idwtDelta * (buf[i-1] + buf[i+1])); - } - // step 4 (odd) - for (i = 2; i <= end + 1; i += 2) { - buf[i] = (int)(buf[i] - idwtGamma * (buf[i-1] + buf[i+1])); - } - // step 5 (even) - for (i = 3; i <= end; i += 2) { - buf[i] = (int)(buf[i] - idwtBeta * (buf[i-1] + buf[i+1])); - } - // step 6 (odd) - for (i = 4; i <= end - 1; i += 2) { - buf[i] = (int)(buf[i] - idwtAlpha * (buf[i-1] + buf[i+1])); - } - - //----- 5-3 reversible filter - - } else { - cover(85); - // step 1 (even) - for (i = 3; i <= end; i += 2) { - buf[i] -= (buf[i-1] + buf[i+1] + 2) >> 2; - } - // step 2 (odd) - for (i = 4; i < end; i += 2) { - buf[i] += (buf[i-1] + buf[i+1]) >> 1; - } - } - - //----- scatter - for (i = 0; i < i1 - i0; ++i) { - data[i * stride] = buf[offset + i]; - } - } -} - -// Inverse multi-component transform and DC level shift. This also -// converts fixed point samples back to integers. -GBool JPXStream::inverseMultiCompAndDC(JPXTile *tile) { - JPXTileComp *tileComp; - int coeff, d0, d1, d2, t, minVal, maxVal, zeroVal; - int *dataPtr; - Guint j, comp, x, y; - - //----- inverse multi-component transform - - if (tile->multiComp == 1) { - cover(86); - if (img.nComps < 3 || - tile->tileComps[0].hSep != tile->tileComps[1].hSep || - tile->tileComps[0].vSep != tile->tileComps[1].vSep || - tile->tileComps[1].hSep != tile->tileComps[2].hSep || - tile->tileComps[1].vSep != tile->tileComps[2].vSep) { - return gFalse; - } - - // inverse irreversible multiple component transform - if (tile->tileComps[0].transform == 0) { - cover(87); - j = 0; - for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) { - for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) { - d0 = tile->tileComps[0].data[j]; - d1 = tile->tileComps[1].data[j]; - d2 = tile->tileComps[2].data[j]; - tile->tileComps[0].data[j] = (int)(d0 + 1.402 * d2 + 0.5); - tile->tileComps[1].data[j] = - (int)(d0 - 0.34413 * d1 - 0.71414 * d2 + 0.5); - tile->tileComps[2].data[j] = (int)(d0 + 1.772 * d1 + 0.5); - ++j; - } - } - - // inverse reversible multiple component transform - } else { - cover(88); - j = 0; - for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) { - for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) { - d0 = tile->tileComps[0].data[j]; - d1 = tile->tileComps[1].data[j]; - d2 = tile->tileComps[2].data[j]; - tile->tileComps[1].data[j] = t = d0 - ((d2 + d1) >> 2); - tile->tileComps[0].data[j] = d2 + t; - tile->tileComps[2].data[j] = d1 + t; - ++j; - } - } - } - } - - //----- DC level shift - for (comp = 0; comp < img.nComps; ++comp) { - tileComp = &tile->tileComps[comp]; - - // signed: clip - if (tileComp->sgned) { - cover(89); - minVal = -(1 << (tileComp->prec - 1)); - maxVal = (1 << (tileComp->prec - 1)) - 1; - dataPtr = tileComp->data; - for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) { - for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) { - coeff = *dataPtr; - if (tileComp->transform == 0) { - cover(109); - coeff >>= fracBits; - } - if (coeff < minVal) { - cover(110); - coeff = minVal; - } else if (coeff > maxVal) { - cover(111); - coeff = maxVal; - } - *dataPtr++ = coeff; - } - } - - // unsigned: inverse DC level shift and clip - } else { - cover(90); - maxVal = (1 << tileComp->prec) - 1; - zeroVal = 1 << (tileComp->prec - 1); - dataPtr = tileComp->data; - for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) { - for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) { - coeff = *dataPtr; - if (tileComp->transform == 0) { - cover(112); - coeff >>= fracBits; - } - coeff += zeroVal; - if (coeff < 0) { - cover(113); - coeff = 0; - } else if (coeff > maxVal) { - cover(114); - coeff = maxVal; - } - *dataPtr++ = coeff; - } - } - } - } - - return gTrue; -} - -GBool JPXStream::readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen) { - Guint len, lenH; - - if (!readULong(&len) || - !readULong(boxType)) { - return gFalse; - } - if (len == 1) { - if (!readULong(&lenH) || !readULong(&len)) { - return gFalse; - } - if (lenH) { - error(getPos(), "JPX stream contains a box larger than 2^32 bytes"); - return gFalse; - } - *boxLen = len; - *dataLen = len - 16; - } else if (len == 0) { - *boxLen = 0; - *dataLen = 0; - } else { - *boxLen = len; - *dataLen = len - 8; - } - return gTrue; -} - -int JPXStream::readMarkerHdr(int *segType, Guint *segLen) { - int c; - - do { - do { - if ((c = str->getChar()) == EOF) { - return gFalse; - } - } while (c != 0xff); - do { - if ((c = str->getChar()) == EOF) { - return gFalse; - } - } while (c == 0xff); - } while (c == 0x00); - *segType = c; - if ((c >= 0x30 && c <= 0x3f) || - c == 0x4f || c == 0x92 || c == 0x93 || c == 0xd9) { - *segLen = 0; - return gTrue; - } - return readUWord(segLen); -} - -GBool JPXStream::readUByte(Guint *x) { - int c0; - - if ((c0 = str->getChar()) == EOF) { - return gFalse; - } - *x = (Guint)c0; - return gTrue; -} - -GBool JPXStream::readByte(int *x) { - int c0; - - if ((c0 = str->getChar()) == EOF) { - return gFalse; - } - *x = c0; - if (c0 & 0x80) { - *x |= -1 - 0xff; - } - return gTrue; -} - -GBool JPXStream::readUWord(Guint *x) { - int c0, c1; - - if ((c0 = str->getChar()) == EOF || - (c1 = str->getChar()) == EOF) { - return gFalse; - } - *x = (Guint)((c0 << 8) | c1); - return gTrue; -} - -GBool JPXStream::readULong(Guint *x) { - int c0, c1, c2, c3; - - if ((c0 = str->getChar()) == EOF || - (c1 = str->getChar()) == EOF || - (c2 = str->getChar()) == EOF || - (c3 = str->getChar()) == EOF) { - return gFalse; - } - *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3); - return gTrue; -} - -GBool JPXStream::readNBytes(int nBytes, GBool signd, int *x) { - int y, c, i; - - y = 0; - for (i = 0; i < nBytes; ++i) { - if ((c = str->getChar()) == EOF) { - return gFalse; - } - y = (y << 8) + c; - } - if (signd) { - if (y & (1 << (8 * nBytes - 1))) { - y |= -1 << (8 * nBytes); - } - } - *x = y; - return gTrue; -} - -GBool JPXStream::readBits(int nBits, Guint *x) { - int c; - - while (bitBufLen < nBits) { - if (byteCount == 0 || (c = str->getChar()) == EOF) { - return gFalse; - } - --byteCount; - if (bitBufSkip) { - bitBuf = (bitBuf << 7) | (c & 0x7f); - bitBufLen += 7; - } else { - bitBuf = (bitBuf << 8) | (c & 0xff); - bitBufLen += 8; - } - bitBufSkip = c == 0xff; - } - *x = (bitBuf >> (bitBufLen - nBits)) & ((1 << nBits) - 1); - bitBufLen -= nBits; - return gTrue; -} - -void JPXStream::startBitBuf(Guint byteCountA) { - bitBufLen = 0; - bitBufSkip = gFalse; - byteCount = byteCountA; -} - -Guint JPXStream::finishBitBuf() { - if (bitBufSkip) { - str->getChar(); - --byteCount; - } - return byteCount; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.h deleted file mode 100644 index e96e7d388..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/JPXStream.h +++ /dev/null @@ -1,351 +0,0 @@ -//======================================================================== -// -// JPXStream.h -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef JPXSTREAM_H -#define JPXSTREAM_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "Object.h" -#include "Stream.h" - -class JArithmeticDecoder; -class JArithmeticDecoderStats; - -//------------------------------------------------------------------------ - -enum JPXColorSpaceType { - jpxCSBiLevel = 0, - jpxCSYCbCr1 = 1, - jpxCSYCbCr2 = 3, - jpxCSYCBCr3 = 4, - jpxCSPhotoYCC = 9, - jpxCSCMY = 11, - jpxCSCMYK = 12, - jpxCSYCCK = 13, - jpxCSCIELab = 14, - jpxCSsRGB = 16, - jpxCSGrayscale = 17, - jpxCSBiLevel2 = 18, - jpxCSCIEJab = 19, - jpxCSCISesRGB = 20, - jpxCSROMMRGB = 21, - jpxCSsRGBYCbCr = 22, - jpxCSYPbPr1125 = 23, - jpxCSYPbPr1250 = 24 -}; - -struct JPXColorSpecCIELab { - Guint rl, ol, ra, oa, rb, ob, il; -}; - -struct JPXColorSpecEnumerated { - JPXColorSpaceType type; // color space type - union { - JPXColorSpecCIELab cieLab; - }; -}; - -struct JPXColorSpec { - Guint meth; // method - int prec; // precedence - union { - JPXColorSpecEnumerated enumerated; - }; -}; - -//------------------------------------------------------------------------ - -struct JPXPalette { - Guint nEntries; // number of entries in the palette - Guint nComps; // number of components in each entry - Guint *bpc; // bits per component, for each component - int *c; // color data: - // c[i*nComps+j] = entry i, component j -}; - -//------------------------------------------------------------------------ - -struct JPXCompMap { - Guint nChannels; // number of channels - Guint *comp; // codestream components mapped to each channel - Guint *type; // 0 for direct use, 1 for palette mapping - Guint *pComp; // palette components to use -}; - -//------------------------------------------------------------------------ - -struct JPXChannelDefn { - Guint nChannels; // number of channels - Guint *idx; // channel indexes - Guint *type; // channel types - Guint *assoc; // channel associations -}; - -//------------------------------------------------------------------------ - -struct JPXTagTreeNode { - GBool finished; // true if this node is finished - Guint val; // current value -}; - -//------------------------------------------------------------------------ - -struct JPXCoeff { - Gushort flags; // flag bits - Gushort len; // number of significant bits in mag - Guint mag; // magnitude value -}; - -// coefficient flags -#define jpxCoeffSignificantB 0 -#define jpxCoeffTouchedB 1 -#define jpxCoeffFirstMagRefB 2 -#define jpxCoeffSignB 7 -#define jpxCoeffSignificant (1 << jpxCoeffSignificantB) -#define jpxCoeffTouched (1 << jpxCoeffTouchedB) -#define jpxCoeffFirstMagRef (1 << jpxCoeffFirstMagRefB) -#define jpxCoeffSign (1 << jpxCoeffSignB) - -//------------------------------------------------------------------------ - -struct JPXCodeBlock { - //----- size - Guint x0, y0, x1, y1; // bounds - - //----- persistent state - GBool seen; // true if this code-block has already - // been seen - Guint lBlock; // base number of bits used for pkt data length - Guint nextPass; // next coding pass - - //---- info from first packet - Guint nZeroBitPlanes; // number of zero bit planes - - //----- info for the current packet - Guint included; // code-block inclusion in this packet: - // 0=not included, 1=included - Guint nCodingPasses; // number of coding passes in this pkt - Guint dataLen; // pkt data length - - //----- coefficient data - JPXCoeff *coeffs; // the coefficients - JArithmeticDecoder // arithmetic decoder - *arithDecoder; - JArithmeticDecoderStats // arithmetic decoder stats - *stats; -}; - -//------------------------------------------------------------------------ - -struct JPXSubband { - //----- computed - Guint x0, y0, x1, y1; // bounds - Guint nXCBs, nYCBs; // number of code-blocks in the x and y - // directions - - //----- tag trees - Guint maxTTLevel; // max tag tree level - JPXTagTreeNode *inclusion; // inclusion tag tree for each subband - JPXTagTreeNode *zeroBitPlane; // zero-bit plane tag tree for each - // subband - - //----- children - JPXCodeBlock *cbs; // the code-blocks (len = nXCBs * nYCBs) -}; - -//------------------------------------------------------------------------ - -struct JPXPrecinct { - //----- computed - Guint x0, y0, x1, y1; // bounds of the precinct - - //----- children - JPXSubband *subbands; // the subbands -}; - -//------------------------------------------------------------------------ - -struct JPXResLevel { - //----- from the COD and COC segments (main and tile) - Guint precinctWidth; // log2(precinct width) - Guint precinctHeight; // log2(precinct height) - - //----- computed - Guint x0, y0, x1, y1; // bounds of the tile-comp (for this res level) - Guint bx0[3], by0[3], // subband bounds - bx1[3], by1[3]; - - //---- children - JPXPrecinct *precincts; // the precincts -}; - -//------------------------------------------------------------------------ - -struct JPXTileComp { - //----- from the SIZ segment - GBool sgned; // 1 for signed, 0 for unsigned - Guint prec; // precision, in bits - Guint hSep; // horizontal separation of samples - Guint vSep; // vertical separation of samples - - //----- from the COD and COC segments (main and tile) - Guint style; // coding style parameter (Scod / Scoc) - Guint nDecompLevels; // number of decomposition levels - Guint codeBlockW; // log2(code-block width) - Guint codeBlockH; // log2(code-block height) - Guint codeBlockStyle; // code-block style - Guint transform; // wavelet transformation - - //----- from the QCD and QCC segments (main and tile) - Guint quantStyle; // quantization style - Guint *quantSteps; // quantization step size for each subband - Guint nQuantSteps; // number of entries in quantSteps - - //----- computed - Guint x0, y0, x1, y1; // bounds of the tile-comp, in ref coords - Guint cbW; // code-block width - Guint cbH; // code-block height - - //----- image data - int *data; // the decoded image data - int *buf; // intermediate buffer for the inverse - // transform - - //----- children - JPXResLevel *resLevels; // the resolution levels - // (len = nDecompLevels + 1) -}; - -//------------------------------------------------------------------------ - -struct JPXTile { - //----- from the COD segments (main and tile) - Guint progOrder; // progression order - Guint nLayers; // number of layers - Guint multiComp; // multiple component transformation - - //----- computed - Guint x0, y0, x1, y1; // bounds of the tile, in ref coords - Guint maxNDecompLevels; // max number of decomposition levels used - // in any component in this tile - - //----- progression order loop counters - Guint comp; // component - Guint res; // resolution level - Guint precinct; // precinct - Guint layer; // layer - - //----- children - JPXTileComp *tileComps; // the tile-components (len = JPXImage.nComps) -}; - -//------------------------------------------------------------------------ - -struct JPXImage { - //----- from the SIZ segment - Guint xSize, ySize; // size of reference grid - Guint xOffset, yOffset; // image offset - Guint xTileSize, yTileSize; // size of tiles - Guint xTileOffset, // offset of first tile - yTileOffset; - Guint nComps; // number of components - - //----- computed - Guint nXTiles; // number of tiles in x direction - Guint nYTiles; // number of tiles in y direction - - //----- children - JPXTile *tiles; // the tiles (len = nXTiles * nYTiles) -}; - -//------------------------------------------------------------------------ - -class JPXStream: public FilterStream { -public: - - JPXStream(Stream *strA); - virtual ~JPXStream(); - virtual StreamKind getKind() { return strJPX; } - virtual void reset(); - virtual void close(); - virtual int getChar(); - virtual int lookChar(); - virtual GString *getPSFilter(int psLevel, char *indent); - virtual GBool isBinary(GBool last = gTrue); - virtual void getImageParams(int *bitsPerComponent, - StreamColorSpaceMode *csMode); - -private: - - void fillReadBuf(); - void getImageParams2(int *bitsPerComponent, StreamColorSpaceMode *csMode); - GBool readBoxes(); - GBool readColorSpecBox(Guint dataLen); - GBool readCodestream(Guint len); - GBool readTilePart(); - GBool readTilePartData(Guint tileIdx, - Guint tilePartLen, GBool tilePartToEOC); - GBool readCodeBlockData(JPXTileComp *tileComp, - JPXResLevel *resLevel, - JPXPrecinct *precinct, - JPXSubband *subband, - Guint res, Guint sb, - JPXCodeBlock *cb); - void inverseTransform(JPXTileComp *tileComp); - void inverseTransformLevel(JPXTileComp *tileComp, - Guint r, JPXResLevel *resLevel, - Guint nx0, Guint ny0, - Guint nx1, Guint ny1); - void inverseTransform1D(JPXTileComp *tileComp, - int *data, Guint stride, - Guint i0, Guint i1); - GBool inverseMultiCompAndDC(JPXTile *tile); - GBool readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen); - int readMarkerHdr(int *segType, Guint *segLen); - GBool readUByte(Guint *x); - GBool readByte(int *x); - GBool readUWord(Guint *x); - GBool readULong(Guint *x); - GBool readNBytes(int nBytes, GBool signd, int *x); - GBool readBits(int nBits, Guint *x); - void startBitBuf(Guint byteCountA); - Guint finishBitBuf(); - - Guint nComps; // number of components - Guint *bpc; // bits per component, for each component - Guint width, height; // image size - GBool haveImgHdr; // set if a JP2/JPX image header has been - // found - JPXColorSpec cs; // color specification - GBool haveCS; // set if a color spec has been found - JPXPalette palette; // the palette - GBool havePalette; // set if a palette has been found - JPXCompMap compMap; // the component mapping - GBool haveCompMap; // set if a component mapping has been found - JPXChannelDefn channelDefn; // channel definition - GBool haveChannelDefn; // set if a channel defn has been found - - JPXImage img; // JPEG2000 decoder data - Guint bitBuf; // buffer for bit reads - int bitBufLen; // number of bits in bitBuf - GBool bitBufSkip; // true if next bit should be skipped - // (for bit stuffing) - Guint byteCount; // number of available bytes left - - Guint curX, curY, curComp; // current position for lookChar/getChar - Guint readBuf; // read buffer - Guint readBufLen; // number of valid bits in readBuf -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.cc deleted file mode 100644 index ee9dc5952..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.cc +++ /dev/null @@ -1,493 +0,0 @@ -//======================================================================== -// -// Lexer.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#include "Lexer.h" -#include "Error.h" - -//------------------------------------------------------------------------ - -// A '1' in this array means the character is white space. A '1' or -// '2' means the character ends a name or command. -static char specialChars[256] = { - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x - 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx -}; - -//------------------------------------------------------------------------ -// Lexer -//------------------------------------------------------------------------ - -Lexer::Lexer(XRef *xref, Stream *str) { - Object obj; - - curStr.initStream(str); - streams = new Array(xref); - streams->add(curStr.copy(&obj)); - strPtr = 0; - freeArray = gTrue; - curStr.streamReset(); -} - -Lexer::Lexer(XRef *xref, Object *obj) { - Object obj2; - - if (obj->isStream()) { - streams = new Array(xref); - freeArray = gTrue; - streams->add(obj->copy(&obj2)); - } else { - streams = obj->getArray(); - freeArray = gFalse; - } - strPtr = 0; - if (streams->getLength() > 0) { - streams->get(strPtr, &curStr); - curStr.streamReset(); - } -} -static int illegalChars = 0; - -Lexer::~Lexer() { - if (!curStr.isNone()) { - curStr.streamClose(); - curStr.free(); - } - if (freeArray) { - delete streams; - } - if(illegalChars) - error(0, "Illegal characters in hex string (%d)", illegalChars); - illegalChars = 0; -} - -int Lexer::getChar() { - int c; - - c = EOF; - while (!curStr.isNone() && (c = curStr.streamGetChar()) == EOF) { - curStr.streamClose(); - curStr.free(); - ++strPtr; - if (strPtr < streams->getLength()) { - streams->get(strPtr, &curStr); - curStr.streamReset(); - } - } - return c; -} - -int Lexer::lookChar() { - if (curStr.isNone()) { - return EOF; - } - return curStr.streamLookChar(); -} - -Object *Lexer::getObj(Object *obj) { - char *p; - int c, c2; - GBool comment, neg, done; - int numParen; - int xi; - double xf, scale; - GString *s; - int n, m; - - // skip whitespace and comments - comment = gFalse; - while (1) { - if ((c = getChar()) == EOF) { - return obj->initEOF(); - } - if (comment) { - if (c == '\r' || c == '\n') - comment = gFalse; - } else if (c == '%') { - comment = gTrue; - } else if (specialChars[c] != 1) { - break; - } - } - - // start reading token - switch (c) { - - // number - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case '-': case '.': - neg = gFalse; - xi = 0; - if (c == '-') { - neg = gTrue; - } else if (c == '.') { - goto doReal; - } else { - xi = c - '0'; - } - while (1) { - c = lookChar(); - if (isdigit(c)) { - getChar(); - xi = xi * 10 + (c - '0'); - } else if (c == '.') { - getChar(); - goto doReal; - } else { - break; - } - } - if (neg) - xi = -xi; - obj->initInt(xi); - break; - doReal: - xf = xi; - scale = 0.1; - while (1) { - c = lookChar(); - if (c == '-') { - // ignore minus signs in the middle of numbers to match - // Adobe's behavior - error(getPos(), "Badly formatted number"); - getChar(); - continue; - } - if (!isdigit(c)) { - break; - } - getChar(); - xf = xf + scale * (c - '0'); - scale *= 0.1; - } - if (neg) - xf = -xf; - obj->initReal(xf); - break; - - // string - case '(': - p = tokBuf; - n = 0; - numParen = 1; - done = gFalse; - s = NULL; - do { - c2 = EOF; - switch (c = getChar()) { - - case EOF: -#if 0 - // This breaks some PDF files, e.g., ones from Photoshop. - case '\r': - case '\n': -#endif - error(getPos(), "Unterminated string"); - done = gTrue; - break; - - case '(': - ++numParen; - c2 = c; - break; - - case ')': - if (--numParen == 0) { - done = gTrue; - } else { - c2 = c; - } - break; - - case '\\': - switch (c = getChar()) { - case 'n': - c2 = '\n'; - break; - case 'r': - c2 = '\r'; - break; - case 't': - c2 = '\t'; - break; - case 'b': - c2 = '\b'; - break; - case 'f': - c2 = '\f'; - break; - case '\\': - case '(': - case ')': - c2 = c; - break; - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - c2 = c - '0'; - c = lookChar(); - if (c >= '0' && c <= '7') { - getChar(); - c2 = (c2 << 3) + (c - '0'); - c = lookChar(); - if (c >= '0' && c <= '7') { - getChar(); - c2 = (c2 << 3) + (c - '0'); - } - } - break; - case '\r': - c = lookChar(); - if (c == '\n') { - getChar(); - } - break; - case '\n': - break; - case EOF: - error(getPos(), "Unterminated string"); - done = gTrue; - break; - default: - c2 = c; - break; - } - break; - - default: - c2 = c; - break; - } - - if (c2 != EOF) { - if (n == tokBufSize) { - if (!s) - s = new GString(tokBuf, tokBufSize); - else - s->append(tokBuf, tokBufSize); - p = tokBuf; - n = 0; - } - *p++ = (char)c2; - ++n; - } - } while (!done); - if (!s) - s = new GString(tokBuf, n); - else - s->append(tokBuf, n); - obj->initString(s); - break; - - // name - case '/': - p = tokBuf; - n = 0; - while ((c = lookChar()) != EOF && !specialChars[c]) { - getChar(); - if (c == '#') { - c2 = lookChar(); - if (c2 >= '0' && c2 <= '9') { - c = c2 - '0'; - } else if (c2 >= 'A' && c2 <= 'F') { - c = c2 - 'A' + 10; - } else if (c2 >= 'a' && c2 <= 'f') { - c = c2 - 'a' + 10; - } else { - goto notEscChar; - } - getChar(); - c <<= 4; - c2 = getChar(); - if (c2 >= '0' && c2 <= '9') { - c += c2 - '0'; - } else if (c2 >= 'A' && c2 <= 'F') { - c += c2 - 'A' + 10; - } else if (c2 >= 'a' && c2 <= 'f') { - c += c2 - 'a' + 10; - } else { - illegalChars++; - //error(getPos(), "Illegal digit in hex char in name"); - } - } - notEscChar: - if (++n == tokBufSize) { - error(getPos(), "Name token too long"); - break; - } - *p++ = c; - } - *p = '\0'; - obj->initName(tokBuf); - break; - - // array punctuation - case '[': - case ']': - tokBuf[0] = c; - tokBuf[1] = '\0'; - obj->initCmd(tokBuf); - break; - - // hex string or dict punctuation - case '<': - c = lookChar(); - - // dict punctuation - if (c == '<') { - getChar(); - tokBuf[0] = tokBuf[1] = '<'; - tokBuf[2] = '\0'; - obj->initCmd(tokBuf); - - // hex string - } else { - p = tokBuf; - m = n = 0; - c2 = 0; - s = NULL; - while (1) { - c = getChar(); - if (c == '>') { - break; - } else if (c == EOF) { - error(getPos(), "Unterminated hex string"); - break; - } else if (specialChars[c] != 1) { - c2 = c2 << 4; - if (c >= '0' && c <= '9') - c2 += c - '0'; - else if (c >= 'A' && c <= 'F') - c2 += c - 'A' + 10; - else if (c >= 'a' && c <= 'f') - c2 += c - 'a' + 10; - else { - illegalChars++; - //error(getPos(), "Illegal character <%02x> in hex string", c); - } - if (++m == 2) { - if (n == tokBufSize) { - if (!s) - s = new GString(tokBuf, tokBufSize); - else - s->append(tokBuf, tokBufSize); - p = tokBuf; - n = 0; - } - *p++ = (char)c2; - ++n; - c2 = 0; - m = 0; - } - } - } - if (!s) - s = new GString(tokBuf, n); - else - s->append(tokBuf, n); - if (m == 1) - s->append((char)(c2 << 4)); - obj->initString(s); - } - break; - - // dict punctuation - case '>': - c = lookChar(); - if (c == '>') { - getChar(); - tokBuf[0] = tokBuf[1] = '>'; - tokBuf[2] = '\0'; - obj->initCmd(tokBuf); - } else { - illegalChars++; - //error(getPos(), "Illegal character '>'"); - obj->initError(); - } - break; - - // error - case ')': - case '{': - case '}': - //error(getPos(), "Illegal character '%c'", c); - illegalChars++; - obj->initError(); - break; - - // command - default: - p = tokBuf; - *p++ = c; - n = 1; - while ((c = lookChar()) != EOF && !specialChars[c]) { - getChar(); - if (++n == tokBufSize) { - error(getPos(), "Command token too long"); - break; - } - *p++ = c; - } - *p = '\0'; - if (tokBuf[0] == 't' && !strcmp(tokBuf, "true")) { - obj->initBool(gTrue); - } else if (tokBuf[0] == 'f' && !strcmp(tokBuf, "false")) { - obj->initBool(gFalse); - } else if (tokBuf[0] == 'n' && !strcmp(tokBuf, "null")) { - obj->initNull(); - } else { - obj->initCmd(tokBuf); - } - break; - } - return obj; -} - -void Lexer::skipToNextLine() { - int c; - - while (1) { - c = getChar(); - if (c == EOF || c == '\n') { - return; - } - if (c == '\r') { - if ((c = lookChar()) == '\n') { - getChar(); - } - return; - } - } -} - -GBool Lexer::isSpace(int c) { - return c >= 0 && c <= 0xff && specialChars[c] == 1; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.h deleted file mode 100644 index f6ad9ce96..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Lexer.h +++ /dev/null @@ -1,80 +0,0 @@ -//======================================================================== -// -// Lexer.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef LEXER_H -#define LEXER_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "Object.h" -#include "Stream.h" - -class XRef; - -#define tokBufSize 128 // size of token buffer - -//------------------------------------------------------------------------ -// Lexer -//------------------------------------------------------------------------ - -class Lexer { -public: - - // Construct a lexer for a single stream. Deletes the stream when - // lexer is deleted. - Lexer(XRef *xref, Stream *str); - - // Construct a lexer for a stream or array of streams (assumes obj - // is either a stream or array of streams). - Lexer(XRef *xref, Object *obj); - - // Destructor. - ~Lexer(); - - // Get the next object from the input stream. - Object *getObj(Object *obj); - - // Skip to the beginning of the next line in the input stream. - void skipToNextLine(); - - // Skip over one character. - void skipChar() { getChar(); } - - // Get stream. - Stream *getStream() - { return curStr.isNone() ? (Stream *)NULL : curStr.getStream(); } - - // Get current position in file. This is only used for error - // messages, so it returns an int instead of a Guint. - int getPos() - { return curStr.isNone() ? -1 : (int)curStr.streamGetPos(); } - - // Set position in file. - void setPos(Guint pos, int dir = 0) - { if (!curStr.isNone()) curStr.streamSetPos(pos, dir); } - - // Returns true if is a whitespace character. - static GBool isSpace(int c); - -private: - - int getChar(); - int lookChar(); - - Array *streams; // array of input streams - int strPtr; // index of current stream - Object curStr; // current stream - GBool freeArray; // should lexer free the streams array? - char tokBuf[tokBufSize]; // temporary token buffer -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.cc deleted file mode 100644 index 97f82038b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.cc +++ /dev/null @@ -1,782 +0,0 @@ -//======================================================================== -// -// Link.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "GString.h" -#include "Error.h" -#include "Object.h" -#include "Array.h" -#include "Dict.h" -#include "Link.h" - -//------------------------------------------------------------------------ -// LinkAction -//------------------------------------------------------------------------ - -LinkAction *LinkAction::parseDest(Object *obj) { - LinkAction *action; - - action = new LinkGoTo(obj); - if (!action->isOk()) { - delete action; - return NULL; - } - return action; -} - -LinkAction *LinkAction::parseAction(Object *obj, GString *baseURI) { - LinkAction *action; - Object obj2, obj3, obj4; - - if (!obj->isDict()) { - error(-1, "Bad annotation action"); - return NULL; - } - - obj->dictLookup("S", &obj2); - - // GoTo action - if (obj2.isName("GoTo")) { - obj->dictLookup("D", &obj3); - action = new LinkGoTo(&obj3); - obj3.free(); - - // GoToR action - } else if (obj2.isName("GoToR")) { - obj->dictLookup("F", &obj3); - obj->dictLookup("D", &obj4); - action = new LinkGoToR(&obj3, &obj4); - obj3.free(); - obj4.free(); - - // Launch action - } else if (obj2.isName("Launch")) { - action = new LinkLaunch(obj); - - // URI action - } else if (obj2.isName("URI")) { - obj->dictLookup("URI", &obj3); - action = new LinkURI(&obj3, baseURI); - obj3.free(); - - // Named action - } else if (obj2.isName("Named")) { - obj->dictLookup("N", &obj3); - action = new LinkNamed(&obj3); - obj3.free(); - - // Movie action - } else if (obj2.isName("Movie")) { - obj->dictLookupNF("Annot", &obj3); - obj->dictLookup("T", &obj4); - action = new LinkMovie(&obj3, &obj4); - obj3.free(); - obj4.free(); - - // unknown action - } else if (obj2.isName()) { - action = new LinkUnknown(obj2.getName()); - - // action is missing or wrong type - } else { - error(-1, "Bad annotation action"); - action = NULL; - } - - obj2.free(); - - if (action && !action->isOk()) { - delete action; - return NULL; - } - return action; -} - -GString *LinkAction::getFileSpecName(Object *fileSpecObj) { - GString *name; - Object obj1; - - name = NULL; - - // string - if (fileSpecObj->isString()) { - name = fileSpecObj->getString()->copy(); - - // dictionary - } else if (fileSpecObj->isDict()) { -#ifdef WIN32 - if (!fileSpecObj->dictLookup("DOS", &obj1)->isString()) { -#else - if (!fileSpecObj->dictLookup("Unix", &obj1)->isString()) { -#endif - obj1.free(); - fileSpecObj->dictLookup("F", &obj1); - } - if (obj1.isString()) { - name = obj1.getString()->copy(); - } else { - error(-1, "Illegal file spec in link"); - } - obj1.free(); - - // error - } else { - error(-1, "Illegal file spec in link"); - } - - // system-dependent path manipulation - if (name) { -#ifdef WIN32 - int i, j; - - // "//...." --> "\...." - // "/x/...." --> "x:\...." - // "/server/share/...." --> "\\server\share\...." - // convert escaped slashes to slashes and unescaped slashes to backslashes - i = 0; - if (name->getChar(0) == '/') { - if (name->getLength() >= 2 && name->getChar(1) == '/') { - name->del(0); - i = 0; - } else if (name->getLength() >= 2 && - ((name->getChar(1) >= 'a' && name->getChar(1) <= 'z') || - (name->getChar(1) >= 'A' && name->getChar(1) <= 'Z')) && - (name->getLength() == 2 || name->getChar(2) == '/')) { - name->setChar(0, name->getChar(1)); - name->setChar(1, ':'); - i = 2; - } else { - for (j = 2; j < name->getLength(); ++j) { - if (name->getChar(j-1) != '\\' && - name->getChar(j) == '/') { - break; - } - } - if (j < name->getLength()) { - name->setChar(0, '\\'); - name->insert(0, '\\'); - i = 2; - } - } - } - for (; i < name->getLength(); ++i) { - if (name->getChar(i) == '/') { - name->setChar(i, '\\'); - } else if (name->getChar(i) == '\\' && - i+1 < name->getLength() && - name->getChar(i+1) == '/') { - name->del(i); - } - } -#else - // no manipulation needed for Unix -#endif - } - - return name; -} - -//------------------------------------------------------------------------ -// LinkDest -//------------------------------------------------------------------------ - -LinkDest::LinkDest(Array *a) { - Object obj1, obj2; - - // initialize fields - left = bottom = right = top = zoom = 0; - ok = gFalse; - - // get page - if (a->getLength() < 2) { - error(-1, "Annotation destination array is too short"); - return; - } - a->getNF(0, &obj1); - if (obj1.isInt()) { - pageNum = obj1.getInt() + 1; - pageIsRef = gFalse; - } else if (obj1.isRef()) { - pageRef.num = obj1.getRefNum(); - pageRef.gen = obj1.getRefGen(); - pageIsRef = gTrue; - } else { - error(-1, "Bad annotation destination"); - goto err2; - } - obj1.free(); - - // get destination type - a->get(1, &obj1); - - // XYZ link - if (obj1.isName("XYZ")) { - kind = destXYZ; - if (a->getLength() < 3) { - changeLeft = gFalse; - } else { - a->get(2, &obj2); - if (obj2.isNull()) { - changeLeft = gFalse; - } else if (obj2.isNum()) { - changeLeft = gTrue; - left = obj2.getNum(); - } else { - error(-1, "Bad annotation destination position"); - goto err1; - } - obj2.free(); - } - if (a->getLength() < 4) { - changeTop = gFalse; - } else { - a->get(3, &obj2); - if (obj2.isNull()) { - changeTop = gFalse; - } else if (obj2.isNum()) { - changeTop = gTrue; - top = obj2.getNum(); - } else { - error(-1, "Bad annotation destination position"); - goto err1; - } - obj2.free(); - } - if (a->getLength() < 5) { - changeZoom = gFalse; - } else { - a->get(4, &obj2); - if (obj2.isNull()) { - changeZoom = gFalse; - } else if (obj2.isNum()) { - changeZoom = gTrue; - zoom = obj2.getNum(); - } else { - error(-1, "Bad annotation destination position"); - goto err1; - } - obj2.free(); - } - - // Fit link - } else if (obj1.isName("Fit")) { - if (a->getLength() < 2) { - error(-1, "Annotation destination array is too short"); - goto err2; - } - kind = destFit; - - // FitH link - } else if (obj1.isName("FitH")) { - if (a->getLength() < 3) { - error(-1, "Annotation destination array is too short"); - goto err2; - } - kind = destFitH; - if (!a->get(2, &obj2)->isNum()) { - error(-1, "Bad annotation destination position"); - kind = destFit; - } - top = obj2.getNum(); - obj2.free(); - - // FitV link - } else if (obj1.isName("FitV")) { - if (a->getLength() < 3) { - error(-1, "Annotation destination array is too short"); - goto err2; - } - kind = destFitV; - if (!a->get(2, &obj2)->isNum()) { - error(-1, "Bad annotation destination position"); - kind = destFit; - } - left = obj2.getNum(); - obj2.free(); - - // FitR link - } else if (obj1.isName("FitR")) { - if (a->getLength() < 6) { - error(-1, "Annotation destination array is too short"); - goto err2; - } - kind = destFitR; - if (!a->get(2, &obj2)->isNum()) { - error(-1, "Bad annotation destination position"); - kind = destFit; - } - left = obj2.getNum(); - obj2.free(); - if (!a->get(3, &obj2)->isNum()) { - error(-1, "Bad annotation destination position"); - kind = destFit; - } - bottom = obj2.getNum(); - obj2.free(); - if (!a->get(4, &obj2)->isNum()) { - error(-1, "Bad annotation destination position"); - kind = destFit; - } - right = obj2.getNum(); - obj2.free(); - if (!a->get(5, &obj2)->isNum()) { - error(-1, "Bad annotation destination position"); - kind = destFit; - } - top = obj2.getNum(); - obj2.free(); - - // FitB link - } else if (obj1.isName("FitB")) { - if (a->getLength() < 2) { - error(-1, "Annotation destination array is too short"); - goto err2; - } - kind = destFitB; - - // FitBH link - } else if (obj1.isName("FitBH")) { - if (a->getLength() < 3) { - error(-1, "Annotation destination array is too short"); - goto err2; - } - kind = destFitBH; - if (!a->get(2, &obj2)->isNum()) { - error(-1, "Bad annotation destination position"); - kind = destFit; - } - top = obj2.getNum(); - obj2.free(); - - // FitBV link - } else if (obj1.isName("FitBV")) { - if (a->getLength() < 3) { - error(-1, "Annotation destination array is too short"); - goto err2; - } - kind = destFitBV; - if (!a->get(2, &obj2)->isNum()) { - error(-1, "Bad annotation destination position"); - kind = destFit; - } - left = obj2.getNum(); - obj2.free(); - - // unknown link kind - } else { - error(-1, "Unknown annotation destination type"); - goto err2; - } - - obj1.free(); - ok = gTrue; - return; - - err1: - obj2.free(); - err2: - obj1.free(); -} - -LinkDest::LinkDest(LinkDest *dest) { - kind = dest->kind; - pageIsRef = dest->pageIsRef; - if (pageIsRef) - pageRef = dest->pageRef; - else - pageNum = dest->pageNum; - left = dest->left; - bottom = dest->bottom; - right = dest->right; - top = dest->top; - zoom = dest->zoom; - changeLeft = dest->changeLeft; - changeTop = dest->changeTop; - changeZoom = dest->changeZoom; - ok = gTrue; -} - -//------------------------------------------------------------------------ -// LinkGoTo -//------------------------------------------------------------------------ - -LinkGoTo::LinkGoTo(Object *destObj) { - dest = NULL; - namedDest = NULL; - - // named destination - if (destObj->isName()) { - namedDest = new GString(destObj->getName()); - } else if (destObj->isString()) { - namedDest = destObj->getString()->copy(); - - // destination dictionary - } else if (destObj->isArray()) { - dest = new LinkDest(destObj->getArray()); - if (!dest->isOk()) { - delete dest; - dest = NULL; - } - // error - } else { - error(-1, "Illegal annotation destination %d", destObj->getType()); - } -} - -LinkGoTo::~LinkGoTo() { - if (dest) - delete dest; - if (namedDest) - delete namedDest; -} - -//------------------------------------------------------------------------ -// LinkGoToR -//------------------------------------------------------------------------ - -LinkGoToR::LinkGoToR(Object *fileSpecObj, Object *destObj) { - dest = NULL; - namedDest = NULL; - - // get file name - fileName = getFileSpecName(fileSpecObj); - - // named destination - if (destObj->isName()) { - namedDest = new GString(destObj->getName()); - } else if (destObj->isString()) { - namedDest = destObj->getString()->copy(); - - // destination dictionary - } else if (destObj->isArray()) { - dest = new LinkDest(destObj->getArray()); - if (!dest->isOk()) { - delete dest; - dest = NULL; - } - // error - } else { - error(-1, "Illegal annotation destination %d", destObj->getType()); - } -} - -LinkGoToR::~LinkGoToR() { - if (fileName) - delete fileName; - if (dest) - delete dest; - if (namedDest) - delete namedDest; -} - - -//------------------------------------------------------------------------ -// LinkLaunch -//------------------------------------------------------------------------ - -LinkLaunch::LinkLaunch(Object *actionObj) { - Object obj1, obj2; - - fileName = NULL; - params = NULL; - - if (actionObj->isDict()) { - if (!actionObj->dictLookup("F", &obj1)->isNull()) { - fileName = getFileSpecName(&obj1); - } else { - obj1.free(); -#ifdef WIN32 - if (actionObj->dictLookup("Win", &obj1)->isDict()) { - obj1.dictLookup("F", &obj2); - fileName = getFileSpecName(&obj2); - obj2.free(); - if (obj1.dictLookup("P", &obj2)->isString()) { - params = obj2.getString()->copy(); - } - obj2.free(); - } else { - error(-1, "Bad launch-type link action"); - } -#else - //~ This hasn't been defined by Adobe yet, so assume it looks - //~ just like the Win dictionary until they say otherwise. - if (actionObj->dictLookup("Unix", &obj1)->isDict()) { - obj1.dictLookup("F", &obj2); - fileName = getFileSpecName(&obj2); - obj2.free(); - if (obj1.dictLookup("P", &obj2)->isString()) { - params = obj2.getString()->copy(); - } - obj2.free(); - } else { - error(-1, "Bad launch-type link action"); - } -#endif - } - obj1.free(); - } -} - -LinkLaunch::~LinkLaunch() { - if (fileName) - delete fileName; - if (params) - delete params; -} - -//------------------------------------------------------------------------ -// LinkURI -//------------------------------------------------------------------------ - -LinkURI::LinkURI(Object *uriObj, GString *baseURI) { - GString *uri2; - int n; - char c; - - uri = NULL; - if (uriObj->isString()) { - uri2 = uriObj->getString()->copy(); - if (baseURI && baseURI->getLength() > 0) { - n = strcspn(uri2->getCString(), "/:"); - if (n == uri2->getLength() || uri2->getChar(n) == '/') { - uri = baseURI->copy(); - c = uri->getChar(uri->getLength() - 1); - if (c == '/' || c == '?') { - if (uri2->getChar(0) == '/') { - uri2->del(0); - } - } else { - if (uri2->getChar(0) != '/') { - uri->append('/'); - } - } - uri->append(uri2); - delete uri2; - } else { - uri = uri2; - } - } else { - uri = uri2; - } - } else { - error(-1, "Illegal URI-type link"); - } -} - -LinkURI::~LinkURI() { - if (uri) - delete uri; -} - -//------------------------------------------------------------------------ -// LinkNamed -//------------------------------------------------------------------------ - -LinkNamed::LinkNamed(Object *nameObj) { - name = NULL; - if (nameObj->isName()) { - name = new GString(nameObj->getName()); - } -} - -LinkNamed::~LinkNamed() { - if (name) { - delete name; - } -} - -//------------------------------------------------------------------------ -// LinkMovie -//------------------------------------------------------------------------ - -LinkMovie::LinkMovie(Object *annotObj, Object *titleObj) { - annotRef.num = -1; - title = NULL; - if (annotObj->isRef()) { - annotRef = annotObj->getRef(); - } else if (titleObj->isString()) { - title = titleObj->getString()->copy(); - } else { - error(-1, "Movie action is missing both the Annot and T keys"); - } -} - -LinkMovie::~LinkMovie() { - if (title) { - delete title; - } -} - -//------------------------------------------------------------------------ -// LinkUnknown -//------------------------------------------------------------------------ - -LinkUnknown::LinkUnknown(char *actionA) { - action = new GString(actionA); -} - -LinkUnknown::~LinkUnknown() { - delete action; -} - -//------------------------------------------------------------------------ -// Link -//------------------------------------------------------------------------ - -Link::Link(Dict *dict, GString *baseURI) { - Object obj1, obj2; - double t; - - action = NULL; - ok = gFalse; - - // get rectangle - if (!dict->lookup("Rect", &obj1)->isArray()) { - error(-1, "Annotation rectangle is wrong type"); - goto err2; - } - if (!obj1.arrayGet(0, &obj2)->isNum()) { - error(-1, "Bad annotation rectangle"); - goto err1; - } - x1 = obj2.getNum(); - obj2.free(); - if (!obj1.arrayGet(1, &obj2)->isNum()) { - error(-1, "Bad annotation rectangle"); - goto err1; - } - y1 = obj2.getNum(); - obj2.free(); - if (!obj1.arrayGet(2, &obj2)->isNum()) { - error(-1, "Bad annotation rectangle"); - goto err1; - } - x2 = obj2.getNum(); - obj2.free(); - if (!obj1.arrayGet(3, &obj2)->isNum()) { - error(-1, "Bad annotation rectangle"); - goto err1; - } - y2 = obj2.getNum(); - obj2.free(); - obj1.free(); - if (x1 > x2) { - t = x1; - x1 = x2; - x2 = t; - } - if (y1 > y2) { - t = y1; - y1 = y2; - y2 = t; - } - - // look for destination - if (!dict->lookup("Dest", &obj1)->isNull()) { - action = LinkAction::parseDest(&obj1); - - // look for action - } else { - obj1.free(); - if (dict->lookup("A", &obj1)->isDict()) { - action = LinkAction::parseAction(&obj1, baseURI); - } - } - obj1.free(); - - // check for bad action - if (action) { - ok = gTrue; - } - - return; - - err1: - obj2.free(); - err2: - obj1.free(); -} - -Link::~Link() { - if (action) { - delete action; - } -} - -//------------------------------------------------------------------------ -// Links -//------------------------------------------------------------------------ - -Links::Links(Object *annots, GString *baseURI) { - Link *link; - Object obj1, obj2; - int size; - int i; - - links = NULL; - size = 0; - numLinks = 0; - - if (annots->isArray()) { - for (i = 0; i < annots->arrayGetLength(); ++i) { - if (annots->arrayGet(i, &obj1)->isDict()) { - if (obj1.dictLookup("Subtype", &obj2)->isName("Link")) { - link = new Link(obj1.getDict(), baseURI); - if (link->isOk()) { - if (numLinks >= size) { - size += 16; - links = (Link **)greallocn(links, size, sizeof(Link *)); - } - links[numLinks++] = link; - } else { - delete link; - } - } - obj2.free(); - } - obj1.free(); - } - } -} - -Links::~Links() { - int i; - - for (i = 0; i < numLinks; ++i) - delete links[i]; - gfree(links); -} - -LinkAction *Links::find(double x, double y) { - int i; - - for (i = numLinks - 1; i >= 0; --i) { - if (links[i]->inRect(x, y)) { - return links[i]->getAction(); - } - } - return NULL; -} - -GBool Links::onLink(double x, double y) { - int i; - - for (i = 0; i < numLinks; ++i) { - if (links[i]->inRect(x, y)) - return gTrue; - } - return gFalse; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.h deleted file mode 100644 index 698f2c852..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Link.h +++ /dev/null @@ -1,369 +0,0 @@ -//======================================================================== -// -// Link.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef LINK_H -#define LINK_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "Object.h" - -class GString; -class Array; -class Dict; - -//------------------------------------------------------------------------ -// LinkAction -//------------------------------------------------------------------------ - -enum LinkActionKind { - actionGoTo, // go to destination - actionGoToR, // go to destination in new file - actionLaunch, // launch app (or open document) - actionURI, // URI - actionNamed, // named action - actionMovie, // movie action - actionUnknown // anything else -}; - -class LinkAction { -public: - - // Destructor. - virtual ~LinkAction() {} - - // Was the LinkAction created successfully? - virtual GBool isOk() = 0; - - // Check link action type. - virtual LinkActionKind getKind() = 0; - - // Parse a destination (old-style action) name, string, or array. - static LinkAction *parseDest(Object *obj); - - // Parse an action dictionary. - static LinkAction *parseAction(Object *obj, GString *baseURI = NULL); - - // Extract a file name from a file specification (string or - // dictionary). - static GString *getFileSpecName(Object *fileSpecObj); -}; - -//------------------------------------------------------------------------ -// LinkDest -//------------------------------------------------------------------------ - -enum LinkDestKind { - destXYZ, - destFit, - destFitH, - destFitV, - destFitR, - destFitB, - destFitBH, - destFitBV -}; - -class LinkDest { -public: - - // Build a LinkDest from the array. - LinkDest(Array *a); - - // Copy a LinkDest. - LinkDest *copy() { return new LinkDest(this); } - - // Was the LinkDest created successfully? - GBool isOk() { return ok; } - - // Accessors. - LinkDestKind getKind() { return kind; } - GBool isPageRef() { return pageIsRef; } - int getPageNum() { return pageNum; } - Ref getPageRef() { return pageRef; } - double getLeft() { return left; } - double getBottom() { return bottom; } - double getRight() { return right; } - double getTop() { return top; } - double getZoom() { return zoom; } - GBool getChangeLeft() { return changeLeft; } - GBool getChangeTop() { return changeTop; } - GBool getChangeZoom() { return changeZoom; } - -private: - - LinkDestKind kind; // destination type - GBool pageIsRef; // is the page a reference or number? - union { - Ref pageRef; // reference to page - int pageNum; // one-relative page number - }; - double left, bottom; // position - double right, top; - double zoom; // zoom factor - GBool changeLeft, changeTop; // for destXYZ links, which position - GBool changeZoom; // components to change - GBool ok; // set if created successfully - - LinkDest(LinkDest *dest); -}; - -//------------------------------------------------------------------------ -// LinkGoTo -//------------------------------------------------------------------------ - -class LinkGoTo: public LinkAction { -public: - - // Build a LinkGoTo from a destination (dictionary, name, or string). - LinkGoTo(Object *destObj); - - // Destructor. - virtual ~LinkGoTo(); - - // Was the LinkGoTo created successfully? - virtual GBool isOk() { return dest || namedDest; } - - // Accessors. - virtual LinkActionKind getKind() { return actionGoTo; } - LinkDest *getDest() { return dest; } - GString *getNamedDest() { return namedDest; } - -private: - - LinkDest *dest; // regular destination (NULL for remote - // link with bad destination) - GString *namedDest; // named destination (only one of dest and - // and namedDest may be non-NULL) -}; - -//------------------------------------------------------------------------ -// LinkGoToR -//------------------------------------------------------------------------ - -class LinkGoToR: public LinkAction { -public: - - // Build a LinkGoToR from a file spec (dictionary) and destination - // (dictionary, name, or string). - LinkGoToR(Object *fileSpecObj, Object *destObj); - - // Destructor. - virtual ~LinkGoToR(); - - // Was the LinkGoToR created successfully? - virtual GBool isOk() { return fileName && (dest || namedDest); } - - // Accessors. - virtual LinkActionKind getKind() { return actionGoToR; } - GString *getFileName() { return fileName; } - LinkDest *getDest() { return dest; } - GString *getNamedDest() { return namedDest; } - -private: - - GString *fileName; // file name - LinkDest *dest; // regular destination (NULL for remote - // link with bad destination) - GString *namedDest; // named destination (only one of dest and - // and namedDest may be non-NULL) -}; - -//------------------------------------------------------------------------ -// LinkLaunch -//------------------------------------------------------------------------ - -class LinkLaunch: public LinkAction { -public: - - // Build a LinkLaunch from an action dictionary. - LinkLaunch(Object *actionObj); - - // Destructor. - virtual ~LinkLaunch(); - - // Was the LinkLaunch created successfully? - virtual GBool isOk() { return fileName != NULL; } - - // Accessors. - virtual LinkActionKind getKind() { return actionLaunch; } - GString *getFileName() { return fileName; } - GString *getParams() { return params; } - -private: - - GString *fileName; // file name - GString *params; // parameters -}; - -//------------------------------------------------------------------------ -// LinkURI -//------------------------------------------------------------------------ - -class LinkURI: public LinkAction { -public: - - // Build a LinkURI given the URI (string) and base URI. - LinkURI(Object *uriObj, GString *baseURI); - - // Destructor. - virtual ~LinkURI(); - - // Was the LinkURI created successfully? - virtual GBool isOk() { return uri != NULL; } - - // Accessors. - virtual LinkActionKind getKind() { return actionURI; } - GString *getURI() { return uri; } - -private: - - GString *uri; // the URI -}; - -//------------------------------------------------------------------------ -// LinkNamed -//------------------------------------------------------------------------ - -class LinkNamed: public LinkAction { -public: - - // Build a LinkNamed given the action name. - LinkNamed(Object *nameObj); - - virtual ~LinkNamed(); - - virtual GBool isOk() { return name != NULL; } - - virtual LinkActionKind getKind() { return actionNamed; } - GString *getName() { return name; } - -private: - - GString *name; -}; - -//------------------------------------------------------------------------ -// LinkMovie -//------------------------------------------------------------------------ - -class LinkMovie: public LinkAction { -public: - - LinkMovie(Object *annotObj, Object *titleObj); - - virtual ~LinkMovie(); - - virtual GBool isOk() { return annotRef.num >= 0 || title != NULL; } - - virtual LinkActionKind getKind() { return actionMovie; } - GBool hasAnnotRef() { return annotRef.num >= 0; } - Ref *getAnnotRef() { return &annotRef; } - GString *getTitle() { return title; } - -private: - - Ref annotRef; - GString *title; -}; - -//------------------------------------------------------------------------ -// LinkUnknown -//------------------------------------------------------------------------ - -class LinkUnknown: public LinkAction { -public: - - // Build a LinkUnknown with the specified action type. - LinkUnknown(char *actionA); - - // Destructor. - virtual ~LinkUnknown(); - - // Was the LinkUnknown create successfully? - virtual GBool isOk() { return action != NULL; } - - // Accessors. - virtual LinkActionKind getKind() { return actionUnknown; } - GString *getAction() { return action; } - -private: - - GString *action; // action subtype -}; - -//------------------------------------------------------------------------ -// Link -//------------------------------------------------------------------------ - -class Link { -public: - - // Construct a link, given its dictionary. - Link(Dict *dict, GString *baseURI); - - // Destructor. - ~Link(); - - // Was the link created successfully? - GBool isOk() { return ok; } - - // Check if point is inside the link rectangle. - GBool inRect(double x, double y) - { return x1 <= x && x <= x2 && y1 <= y && y <= y2; } - - // Get action. - LinkAction *getAction() { return action; } - - // Get the link rectangle. - void getRect(double *xa1, double *ya1, double *xa2, double *ya2) - { *xa1 = x1; *ya1 = y1; *xa2 = x2; *ya2 = y2; } - -private: - - double x1, y1; // lower left corner - double x2, y2; // upper right corner - LinkAction *action; // action - GBool ok; // is link valid? -}; - -//------------------------------------------------------------------------ -// Links -//------------------------------------------------------------------------ - -class Links { -public: - - // Extract links from array of annotations. - Links(Object *annots, GString *baseURI); - - // Destructor. - ~Links(); - - // Iterate through list of links. - int getNumLinks() { return numLinks; } - Link *getLink(int i) { return links[i]; } - - // If point , is in a link, return the associated action; - // else return NULL. - LinkAction *find(double x, double y); - - // Return true if , is in a link. - GBool onLink(double x, double y); - -private: - - Link **links; - int numLinks; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.cc deleted file mode 100644 index 7ebf4e165..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.cc +++ /dev/null @@ -1,116 +0,0 @@ -//======================================================================== -// -// NameToCharCode.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "gmem.h" -#include "NameToCharCode.h" - -//------------------------------------------------------------------------ - -struct NameToCharCodeEntry { - char *name; - CharCode c; -}; - -//------------------------------------------------------------------------ - -NameToCharCode::NameToCharCode() { - int i; - - size = 31; - len = 0; - tab = (NameToCharCodeEntry *)gmallocn(size, sizeof(NameToCharCodeEntry)); - for (i = 0; i < size; ++i) { - tab[i].name = NULL; - } -} - -NameToCharCode::~NameToCharCode() { - int i; - - for (i = 0; i < size; ++i) { - if (tab[i].name) { - gfree(tab[i].name); - } - } - gfree(tab); -} - -void NameToCharCode::add(char *name, CharCode c) { - NameToCharCodeEntry *oldTab; - int h, i, oldSize; - - // expand the table if necessary - if (len >= size / 2) { - oldSize = size; - oldTab = tab; - size = 2*size + 1; - tab = (NameToCharCodeEntry *)gmallocn(size, sizeof(NameToCharCodeEntry)); - for (h = 0; h < size; ++h) { - tab[h].name = NULL; - } - for (i = 0; i < oldSize; ++i) { - if (oldTab[i].name) { - h = hash(oldTab[i].name); - while (tab[h].name) { - if (++h == size) { - h = 0; - } - } - tab[h] = oldTab[i]; - } - } - gfree(oldTab); - } - - // add the new name - h = hash(name); - while (tab[h].name && strcmp(tab[h].name, name)) { - if (++h == size) { - h = 0; - } - } - if (!tab[h].name) { - tab[h].name = copyString(name); - } - tab[h].c = c; - - ++len; -} - -CharCode NameToCharCode::lookup(char *name) { - int h; - - h = hash(name); - while (tab[h].name) { - if (!strcmp(tab[h].name, name)) { - return tab[h].c; - } - if (++h == size) { - h = 0; - } - } - return 0; -} - -int NameToCharCode::hash(char *name) { - char *p; - unsigned int h; - - h = 0; - for (p = name; *p; ++p) { - h = 17 * h + (int)(*p & 0xff); - } - return (int)(h % size); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.h deleted file mode 100644 index 65453c3a3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToCharCode.h +++ /dev/null @@ -1,42 +0,0 @@ -//======================================================================== -// -// NameToCharCode.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef NAMETOCHARCODE_H -#define NAMETOCHARCODE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "CharTypes.h" - -struct NameToCharCodeEntry; - -//------------------------------------------------------------------------ - -class NameToCharCode { -public: - - NameToCharCode(); - ~NameToCharCode(); - - void add(char *name, CharCode c); - CharCode lookup(char *name); - -private: - - int hash(char *name); - - NameToCharCodeEntry *tab; - int size; - int len; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToUnicodeTable.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToUnicodeTable.h deleted file mode 100644 index c5ecba496..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/NameToUnicodeTable.h +++ /dev/null @@ -1,1097 +0,0 @@ -//======================================================================== -// -// NameToUnicodeTable.h -// -// Copyright 2001-2004 Glyph & Cog, LLC -// -//======================================================================== - -static struct { - Unicode u; - char *name; -} nameToUnicodeTab[] = { - {0x0021, "!"}, - {0x0023, "#"}, - {0x0024, "$"}, - {0x0025, "%"}, - {0x0026, "&"}, - {0x0027, "'"}, - {0x0028, "("}, - {0x0029, ")"}, - {0x002a, "*"}, - {0x002b, "+"}, - {0x002c, ","}, - {0x002d, "-"}, - {0x002e, "."}, - {0x002f, "/"}, - {0x0030, "0"}, - {0x0031, "1"}, - {0x0032, "2"}, - {0x0033, "3"}, - {0x0034, "4"}, - {0x0035, "5"}, - {0x0036, "6"}, - {0x0037, "7"}, - {0x0038, "8"}, - {0x0039, "9"}, - {0x003a, ":"}, - {0x003b, ";"}, - {0x003c, "<"}, - {0x003d, "="}, - {0x003e, ">"}, - {0x003f, "?"}, - {0x0040, "@"}, - {0x0041, "A"}, - {0x00c6, "AE"}, - {0x01fc, "AEacute"}, - {0xf7e6, "AEsmall"}, - {0x00c1, "Aacute"}, - {0xf7e1, "Aacutesmall"}, - {0x0102, "Abreve"}, - {0x00c2, "Acircumflex"}, - {0xf7e2, "Acircumflexsmall"}, - {0xf6c9, "Acute"}, - {0xf7b4, "Acutesmall"}, - {0x00c4, "Adieresis"}, - {0xf7e4, "Adieresissmall"}, - {0x00c0, "Agrave"}, - {0xf7e0, "Agravesmall"}, - {0x0391, "Alpha"}, - {0x0386, "Alphatonos"}, - {0x0100, "Amacron"}, - {0x0104, "Aogonek"}, - {0x00c5, "Aring"}, - {0x01fa, "Aringacute"}, - {0xf7e5, "Aringsmall"}, - {0xf761, "Asmall"}, - {0x00c3, "Atilde"}, - {0xf7e3, "Atildesmall"}, - {0x0042, "B"}, - {0x0392, "Beta"}, - {0xf6f4, "Brevesmall"}, - {0xf762, "Bsmall"}, - {0x0043, "C"}, - {0x0106, "Cacute"}, - {0xf6ca, "Caron"}, - {0xf6f5, "Caronsmall"}, - {0x010c, "Ccaron"}, - {0x00c7, "Ccedilla"}, - {0xf7e7, "Ccedillasmall"}, - {0x0108, "Ccircumflex"}, - {0x010a, "Cdotaccent"}, - {0xf7b8, "Cedillasmall"}, - {0x03a7, "Chi"}, - {0xf6f6, "Circumflexsmall"}, - {0xf763, "Csmall"}, - {0x0044, "D"}, - {0x010e, "Dcaron"}, - {0x0110, "Dcroat"}, - {0x2206, "Delta"}, - {0xf6cb, "Dieresis"}, - {0xf6cc, "DieresisAcute"}, - {0xf6cd, "DieresisGrave"}, - {0xf7a8, "Dieresissmall"}, - {0xf6f7, "Dotaccentsmall"}, - {0xf764, "Dsmall"}, - {0x0045, "E"}, - {0x00c9, "Eacute"}, - {0xf7e9, "Eacutesmall"}, - {0x0114, "Ebreve"}, - {0x011a, "Ecaron"}, - {0x00ca, "Ecircumflex"}, - {0xf7ea, "Ecircumflexsmall"}, - {0x00cb, "Edieresis"}, - {0xf7eb, "Edieresissmall"}, - {0x0116, "Edotaccent"}, - {0x00c8, "Egrave"}, - {0xf7e8, "Egravesmall"}, - {0x0112, "Emacron"}, - {0x014a, "Eng"}, - {0x0118, "Eogonek"}, - {0x0395, "Epsilon"}, - {0x0388, "Epsilontonos"}, - {0xf765, "Esmall"}, - {0x0397, "Eta"}, - {0x0389, "Etatonos"}, - {0x00d0, "Eth"}, - {0xf7f0, "Ethsmall"}, - {0x20ac, "Euro"}, - {0x0046, "F"}, - {0xf766, "Fsmall"}, - {0x0047, "G"}, - {0x0393, "Gamma"}, - {0x011e, "Gbreve"}, - {0x01e6, "Gcaron"}, - {0x011c, "Gcircumflex"}, - {0x0122, "Gcommaaccent"}, - {0x0120, "Gdotaccent"}, - {0xf6ce, "Grave"}, - {0xf760, "Gravesmall"}, - {0xf767, "Gsmall"}, - {0x0048, "H"}, - {0x25cf, "H18533"}, - {0x25aa, "H18543"}, - {0x25ab, "H18551"}, - {0x25a1, "H22073"}, - {0x0126, "Hbar"}, - {0x0124, "Hcircumflex"}, - {0xf768, "Hsmall"}, - {0xf6cf, "Hungarumlaut"}, - {0xf6f8, "Hungarumlautsmall"}, - {0x0049, "I"}, - {0x0132, "IJ"}, - {0x00cd, "Iacute"}, - {0xf7ed, "Iacutesmall"}, - {0x012c, "Ibreve"}, - {0x00ce, "Icircumflex"}, - {0xf7ee, "Icircumflexsmall"}, - {0x00cf, "Idieresis"}, - {0xf7ef, "Idieresissmall"}, - {0x0130, "Idotaccent"}, - {0x2111, "Ifraktur"}, - {0x00cc, "Igrave"}, - {0xf7ec, "Igravesmall"}, - {0x012a, "Imacron"}, - {0x012e, "Iogonek"}, - {0x0399, "Iota"}, - {0x03aa, "Iotadieresis"}, - {0x038a, "Iotatonos"}, - {0xf769, "Ismall"}, - {0x0128, "Itilde"}, - {0x004a, "J"}, - {0x0134, "Jcircumflex"}, - {0xf76a, "Jsmall"}, - {0x004b, "K"}, - {0x039a, "Kappa"}, - {0x0136, "Kcommaaccent"}, - {0xf76b, "Ksmall"}, - {0x004c, "L"}, - {0xf6bf, "LL"}, - {0x0139, "Lacute"}, - {0x039b, "Lambda"}, - {0x013d, "Lcaron"}, - {0x013b, "Lcommaaccent"}, - {0x013f, "Ldot"}, - {0x0141, "Lslash"}, - {0xf6f9, "Lslashsmall"}, - {0xf76c, "Lsmall"}, - {0x004d, "M"}, - {0xf6d0, "Macron"}, - {0xf7af, "Macronsmall"}, - {0xf76d, "Msmall"}, - {0x039c, "Mu"}, - {0x004e, "N"}, - {0x0143, "Nacute"}, - {0x0147, "Ncaron"}, - {0x0145, "Ncommaaccent"}, - {0xf76e, "Nsmall"}, - {0x00d1, "Ntilde"}, - {0xf7f1, "Ntildesmall"}, - {0x039d, "Nu"}, - {0x004f, "O"}, - {0x0152, "OE"}, - {0xf6fa, "OEsmall"}, - {0x00d3, "Oacute"}, - {0xf7f3, "Oacutesmall"}, - {0x014e, "Obreve"}, - {0x00d4, "Ocircumflex"}, - {0xf7f4, "Ocircumflexsmall"}, - {0x00d6, "Odieresis"}, - {0xf7f6, "Odieresissmall"}, - {0xf6fb, "Ogoneksmall"}, - {0x00d2, "Ograve"}, - {0xf7f2, "Ogravesmall"}, - {0x01a0, "Ohorn"}, - {0x0150, "Ohungarumlaut"}, - {0x014c, "Omacron"}, - {0x2126, "Omega"}, - {0x038f, "Omegatonos"}, - {0x039f, "Omicron"}, - {0x038c, "Omicrontonos"}, - {0x00d8, "Oslash"}, - {0x01fe, "Oslashacute"}, - {0xf7f8, "Oslashsmall"}, - {0xf76f, "Osmall"}, - {0x00d5, "Otilde"}, - {0xf7f5, "Otildesmall"}, - {0x0050, "P"}, - {0x03a6, "Phi"}, - {0x03a0, "Pi"}, - {0x03a8, "Psi"}, - {0xf770, "Psmall"}, - {0x0051, "Q"}, - {0xf771, "Qsmall"}, - {0x0052, "R"}, - {0x0154, "Racute"}, - {0x0158, "Rcaron"}, - {0x0156, "Rcommaaccent"}, - {0x211c, "Rfraktur"}, - {0x03a1, "Rho"}, - {0xf6fc, "Ringsmall"}, - {0xf772, "Rsmall"}, - {0x0053, "S"}, - {0x250c, "SF010000"}, - {0x2514, "SF020000"}, - {0x2510, "SF030000"}, - {0x2518, "SF040000"}, - {0x253c, "SF050000"}, - {0x252c, "SF060000"}, - {0x2534, "SF070000"}, - {0x251c, "SF080000"}, - {0x2524, "SF090000"}, - {0x2500, "SF100000"}, - {0x2502, "SF110000"}, - {0x2561, "SF190000"}, - {0x2562, "SF200000"}, - {0x2556, "SF210000"}, - {0x2555, "SF220000"}, - {0x2563, "SF230000"}, - {0x2551, "SF240000"}, - {0x2557, "SF250000"}, - {0x255d, "SF260000"}, - {0x255c, "SF270000"}, - {0x255b, "SF280000"}, - {0x255e, "SF360000"}, - {0x255f, "SF370000"}, - {0x255a, "SF380000"}, - {0x2554, "SF390000"}, - {0x2569, "SF400000"}, - {0x2566, "SF410000"}, - {0x2560, "SF420000"}, - {0x2550, "SF430000"}, - {0x256c, "SF440000"}, - {0x2567, "SF450000"}, - {0x2568, "SF460000"}, - {0x2564, "SF470000"}, - {0x2565, "SF480000"}, - {0x2559, "SF490000"}, - {0x2558, "SF500000"}, - {0x2552, "SF510000"}, - {0x2553, "SF520000"}, - {0x256b, "SF530000"}, - {0x256a, "SF540000"}, - {0x015a, "Sacute"}, - {0x0160, "Scaron"}, - {0xf6fd, "Scaronsmall"}, - {0x015e, "Scedilla"}, - {0x015c, "Scircumflex"}, - {0x0218, "Scommaaccent"}, - {0x03a3, "Sigma"}, - {0xf773, "Ssmall"}, - {0x0054, "T"}, - {0x03a4, "Tau"}, - {0x0166, "Tbar"}, - {0x0164, "Tcaron"}, - {0x0162, "Tcommaaccent"}, - {0x0398, "Theta"}, - {0x00de, "Thorn"}, - {0xf7fe, "Thornsmall"}, - {0xf6fe, "Tildesmall"}, - {0xf774, "Tsmall"}, - {0x0055, "U"}, - {0x00da, "Uacute"}, - {0xf7fa, "Uacutesmall"}, - {0x016c, "Ubreve"}, - {0x00db, "Ucircumflex"}, - {0xf7fb, "Ucircumflexsmall"}, - {0x00dc, "Udieresis"}, - {0xf7fc, "Udieresissmall"}, - {0x00d9, "Ugrave"}, - {0xf7f9, "Ugravesmall"}, - {0x01af, "Uhorn"}, - {0x0170, "Uhungarumlaut"}, - {0x016a, "Umacron"}, - {0x0172, "Uogonek"}, - {0x03a5, "Upsilon"}, - {0x03d2, "Upsilon1"}, - {0x03ab, "Upsilondieresis"}, - {0x038e, "Upsilontonos"}, - {0x016e, "Uring"}, - {0xf775, "Usmall"}, - {0x0168, "Utilde"}, - {0x0056, "V"}, - {0xf776, "Vsmall"}, - {0x0057, "W"}, - {0x1e82, "Wacute"}, - {0x0174, "Wcircumflex"}, - {0x1e84, "Wdieresis"}, - {0x1e80, "Wgrave"}, - {0xf777, "Wsmall"}, - {0x0058, "X"}, - {0x039e, "Xi"}, - {0xf778, "Xsmall"}, - {0x0059, "Y"}, - {0x00dd, "Yacute"}, - {0xf7fd, "Yacutesmall"}, - {0x0176, "Ycircumflex"}, - {0x0178, "Ydieresis"}, - {0xf7ff, "Ydieresissmall"}, - {0x1ef2, "Ygrave"}, - {0xf779, "Ysmall"}, - {0x005a, "Z"}, - {0x0179, "Zacute"}, - {0x017d, "Zcaron"}, - {0xf6ff, "Zcaronsmall"}, - {0x017b, "Zdotaccent"}, - {0x0396, "Zeta"}, - {0xf77a, "Zsmall"}, - {0x0022, "\""}, - {0x005c, "\\"}, - {0x005d, "]"}, - {0x005e, "^"}, - {0x005f, "_"}, - {0x0060, "`"}, - {0x0061, "a"}, - {0x00e1, "aacute"}, - {0x0103, "abreve"}, - {0x00e2, "acircumflex"}, - {0x00b4, "acute"}, - {0x0301, "acutecomb"}, - {0x00e4, "adieresis"}, - {0x00e6, "ae"}, - {0x01fd, "aeacute"}, - {0x2015, "afii00208"}, - {0x0410, "afii10017"}, - {0x0411, "afii10018"}, - {0x0412, "afii10019"}, - {0x0413, "afii10020"}, - {0x0414, "afii10021"}, - {0x0415, "afii10022"}, - {0x0401, "afii10023"}, - {0x0416, "afii10024"}, - {0x0417, "afii10025"}, - {0x0418, "afii10026"}, - {0x0419, "afii10027"}, - {0x041a, "afii10028"}, - {0x041b, "afii10029"}, - {0x041c, "afii10030"}, - {0x041d, "afii10031"}, - {0x041e, "afii10032"}, - {0x041f, "afii10033"}, - {0x0420, "afii10034"}, - {0x0421, "afii10035"}, - {0x0422, "afii10036"}, - {0x0423, "afii10037"}, - {0x0424, "afii10038"}, - {0x0425, "afii10039"}, - {0x0426, "afii10040"}, - {0x0427, "afii10041"}, - {0x0428, "afii10042"}, - {0x0429, "afii10043"}, - {0x042a, "afii10044"}, - {0x042b, "afii10045"}, - {0x042c, "afii10046"}, - {0x042d, "afii10047"}, - {0x042e, "afii10048"}, - {0x042f, "afii10049"}, - {0x0490, "afii10050"}, - {0x0402, "afii10051"}, - {0x0403, "afii10052"}, - {0x0404, "afii10053"}, - {0x0405, "afii10054"}, - {0x0406, "afii10055"}, - {0x0407, "afii10056"}, - {0x0408, "afii10057"}, - {0x0409, "afii10058"}, - {0x040a, "afii10059"}, - {0x040b, "afii10060"}, - {0x040c, "afii10061"}, - {0x040e, "afii10062"}, - {0xf6c4, "afii10063"}, - {0xf6c5, "afii10064"}, - {0x0430, "afii10065"}, - {0x0431, "afii10066"}, - {0x0432, "afii10067"}, - {0x0433, "afii10068"}, - {0x0434, "afii10069"}, - {0x0435, "afii10070"}, - {0x0451, "afii10071"}, - {0x0436, "afii10072"}, - {0x0437, "afii10073"}, - {0x0438, "afii10074"}, - {0x0439, "afii10075"}, - {0x043a, "afii10076"}, - {0x043b, "afii10077"}, - {0x043c, "afii10078"}, - {0x043d, "afii10079"}, - {0x043e, "afii10080"}, - {0x043f, "afii10081"}, - {0x0440, "afii10082"}, - {0x0441, "afii10083"}, - {0x0442, "afii10084"}, - {0x0443, "afii10085"}, - {0x0444, "afii10086"}, - {0x0445, "afii10087"}, - {0x0446, "afii10088"}, - {0x0447, "afii10089"}, - {0x0448, "afii10090"}, - {0x0449, "afii10091"}, - {0x044a, "afii10092"}, - {0x044b, "afii10093"}, - {0x044c, "afii10094"}, - {0x044d, "afii10095"}, - {0x044e, "afii10096"}, - {0x044f, "afii10097"}, - {0x0491, "afii10098"}, - {0x0452, "afii10099"}, - {0x0453, "afii10100"}, - {0x0454, "afii10101"}, - {0x0455, "afii10102"}, - {0x0456, "afii10103"}, - {0x0457, "afii10104"}, - {0x0458, "afii10105"}, - {0x0459, "afii10106"}, - {0x045a, "afii10107"}, - {0x045b, "afii10108"}, - {0x045c, "afii10109"}, - {0x045e, "afii10110"}, - {0x040f, "afii10145"}, - {0x0462, "afii10146"}, - {0x0472, "afii10147"}, - {0x0474, "afii10148"}, - {0xf6c6, "afii10192"}, - {0x045f, "afii10193"}, - {0x0463, "afii10194"}, - {0x0473, "afii10195"}, - {0x0475, "afii10196"}, - {0xf6c7, "afii10831"}, - {0xf6c8, "afii10832"}, - {0x04d9, "afii10846"}, - {0x200e, "afii299"}, - {0x200f, "afii300"}, - {0x200d, "afii301"}, - {0x066a, "afii57381"}, - {0x060c, "afii57388"}, - {0x0660, "afii57392"}, - {0x0661, "afii57393"}, - {0x0662, "afii57394"}, - {0x0663, "afii57395"}, - {0x0664, "afii57396"}, - {0x0665, "afii57397"}, - {0x0666, "afii57398"}, - {0x0667, "afii57399"}, - {0x0668, "afii57400"}, - {0x0669, "afii57401"}, - {0x061b, "afii57403"}, - {0x061f, "afii57407"}, - {0x0621, "afii57409"}, - {0x0622, "afii57410"}, - {0x0623, "afii57411"}, - {0x0624, "afii57412"}, - {0x0625, "afii57413"}, - {0x0626, "afii57414"}, - {0x0627, "afii57415"}, - {0x0628, "afii57416"}, - {0x0629, "afii57417"}, - {0x062a, "afii57418"}, - {0x062b, "afii57419"}, - {0x062c, "afii57420"}, - {0x062d, "afii57421"}, - {0x062e, "afii57422"}, - {0x062f, "afii57423"}, - {0x0630, "afii57424"}, - {0x0631, "afii57425"}, - {0x0632, "afii57426"}, - {0x0633, "afii57427"}, - {0x0634, "afii57428"}, - {0x0635, "afii57429"}, - {0x0636, "afii57430"}, - {0x0637, "afii57431"}, - {0x0638, "afii57432"}, - {0x0639, "afii57433"}, - {0x063a, "afii57434"}, - {0x0640, "afii57440"}, - {0x0641, "afii57441"}, - {0x0642, "afii57442"}, - {0x0643, "afii57443"}, - {0x0644, "afii57444"}, - {0x0645, "afii57445"}, - {0x0646, "afii57446"}, - {0x0648, "afii57448"}, - {0x0649, "afii57449"}, - {0x064a, "afii57450"}, - {0x064b, "afii57451"}, - {0x064c, "afii57452"}, - {0x064d, "afii57453"}, - {0x064e, "afii57454"}, - {0x064f, "afii57455"}, - {0x0650, "afii57456"}, - {0x0651, "afii57457"}, - {0x0652, "afii57458"}, - {0x0647, "afii57470"}, - {0x06a4, "afii57505"}, - {0x067e, "afii57506"}, - {0x0686, "afii57507"}, - {0x0698, "afii57508"}, - {0x06af, "afii57509"}, - {0x0679, "afii57511"}, - {0x0688, "afii57512"}, - {0x0691, "afii57513"}, - {0x06ba, "afii57514"}, - {0x06d2, "afii57519"}, - {0x06d5, "afii57534"}, - {0x20aa, "afii57636"}, - {0x05be, "afii57645"}, - {0x05c3, "afii57658"}, - {0x05d0, "afii57664"}, - {0x05d1, "afii57665"}, - {0x05d2, "afii57666"}, - {0x05d3, "afii57667"}, - {0x05d4, "afii57668"}, - {0x05d5, "afii57669"}, - {0x05d6, "afii57670"}, - {0x05d7, "afii57671"}, - {0x05d8, "afii57672"}, - {0x05d9, "afii57673"}, - {0x05da, "afii57674"}, - {0x05db, "afii57675"}, - {0x05dc, "afii57676"}, - {0x05dd, "afii57677"}, - {0x05de, "afii57678"}, - {0x05df, "afii57679"}, - {0x05e0, "afii57680"}, - {0x05e1, "afii57681"}, - {0x05e2, "afii57682"}, - {0x05e3, "afii57683"}, - {0x05e4, "afii57684"}, - {0x05e5, "afii57685"}, - {0x05e6, "afii57686"}, - {0x05e7, "afii57687"}, - {0x05e8, "afii57688"}, - {0x05e9, "afii57689"}, - {0x05ea, "afii57690"}, - {0xfb2a, "afii57694"}, - {0xfb2b, "afii57695"}, - {0xfb4b, "afii57700"}, - {0xfb1f, "afii57705"}, - {0x05f0, "afii57716"}, - {0x05f1, "afii57717"}, - {0x05f2, "afii57718"}, - {0xfb35, "afii57723"}, - {0x05b4, "afii57793"}, - {0x05b5, "afii57794"}, - {0x05b6, "afii57795"}, - {0x05bb, "afii57796"}, - {0x05b8, "afii57797"}, - {0x05b7, "afii57798"}, - {0x05b0, "afii57799"}, - {0x05b2, "afii57800"}, - {0x05b1, "afii57801"}, - {0x05b3, "afii57802"}, - {0x05c2, "afii57803"}, - {0x05c1, "afii57804"}, - {0x05b9, "afii57806"}, - {0x05bc, "afii57807"}, - {0x05bd, "afii57839"}, - {0x05bf, "afii57841"}, - {0x05c0, "afii57842"}, - {0x02bc, "afii57929"}, - {0x2105, "afii61248"}, - {0x2113, "afii61289"}, - {0x2116, "afii61352"}, - {0x202c, "afii61573"}, - {0x202d, "afii61574"}, - {0x202e, "afii61575"}, - {0x200c, "afii61664"}, - {0x066d, "afii63167"}, - {0x02bd, "afii64937"}, - {0x00e0, "agrave"}, - {0x2135, "aleph"}, - {0x03b1, "alpha"}, - {0x03ac, "alphatonos"}, - {0x0101, "amacron"}, - {0x0026, "ampersand"}, - {0xf726, "ampersandsmall"}, - {0x2220, "angle"}, - {0x2329, "angleleft"}, - {0x232a, "angleright"}, - {0x0387, "anoteleia"}, - {0x0105, "aogonek"}, - {0x2248, "approxequal"}, - {0x00e5, "aring"}, - {0x01fb, "aringacute"}, - {0x2194, "arrowboth"}, - {0x21d4, "arrowdblboth"}, - {0x21d3, "arrowdbldown"}, - {0x21d0, "arrowdblleft"}, - {0x21d2, "arrowdblright"}, - {0x21d1, "arrowdblup"}, - {0x2193, "arrowdown"}, - {0xf8e7, "arrowhorizex"}, - {0x2190, "arrowleft"}, - {0x2192, "arrowright"}, - {0x2191, "arrowup"}, - {0x2195, "arrowupdn"}, - {0x21a8, "arrowupdnbse"}, - {0xf8e6, "arrowvertex"}, - {0x005e, "asciicircum"}, - {0x007e, "asciitilde"}, - {0x002a, "asterisk"}, - {0x2217, "asteriskmath"}, - {0xf6e9, "asuperior"}, - {0x0040, "at"}, - {0x00e3, "atilde"}, - {0x0062, "b"}, - {0x005c, "backslash"}, - {0x007c, "bar"}, - {0x03b2, "beta"}, - {0x2588, "block"}, - {0xf8f4, "braceex"}, - {0x007b, "braceleft"}, - {0xf8f3, "braceleftbt"}, - {0xf8f2, "braceleftmid"}, - {0xf8f1, "bracelefttp"}, - {0x007d, "braceright"}, - {0xf8fe, "bracerightbt"}, - {0xf8fd, "bracerightmid"}, - {0xf8fc, "bracerighttp"}, - {0x005b, "bracketleft"}, - {0xf8f0, "bracketleftbt"}, - {0xf8ef, "bracketleftex"}, - {0xf8ee, "bracketlefttp"}, - {0x005d, "bracketright"}, - {0xf8fb, "bracketrightbt"}, - {0xf8fa, "bracketrightex"}, - {0xf8f9, "bracketrighttp"}, - {0x02d8, "breve"}, - {0x00a6, "brokenbar"}, - {0xf6ea, "bsuperior"}, - {0x2022, "bullet"}, - {0x0063, "c"}, - {0x0107, "cacute"}, - {0x02c7, "caron"}, - {0x21b5, "carriagereturn"}, - {0x010d, "ccaron"}, - {0x00e7, "ccedilla"}, - {0x0109, "ccircumflex"}, - {0x010b, "cdotaccent"}, - {0x00b8, "cedilla"}, - {0x00a2, "cent"}, - {0xf6df, "centinferior"}, - {0xf7a2, "centoldstyle"}, - {0xf6e0, "centsuperior"}, - {0x03c7, "chi"}, - {0x25cb, "circle"}, - {0x2297, "circlemultiply"}, - {0x2295, "circleplus"}, - {0x02c6, "circumflex"}, - {0x2663, "club"}, - {0x003a, "colon"}, - {0x20a1, "colonmonetary"}, - {0x002c, "comma"}, - {0xf6c3, "commaaccent"}, - {0xf6e1, "commainferior"}, - {0xf6e2, "commasuperior"}, - {0x2245, "congruent"}, - {0x00a9, "copyright"}, - {0x00a9, "copyrightsans"}, - {0x00a9, "copyrightserif"}, - {0x00a4, "currency"}, - {0xf6d1, "cyrBreve"}, - {0xf6d2, "cyrFlex"}, - {0xf6d4, "cyrbreve"}, - {0xf6d5, "cyrflex"}, - {0x0064, "d"}, - {0x2020, "dagger"}, - {0x2021, "daggerdbl"}, - {0xf6d3, "dblGrave"}, - {0xf6d6, "dblgrave"}, - {0x010f, "dcaron"}, - {0x0111, "dcroat"}, - {0x00b0, "degree"}, - {0x03b4, "delta"}, - {0x2666, "diamond"}, - {0x00a8, "dieresis"}, - {0xf6d7, "dieresisacute"}, - {0xf6d8, "dieresisgrave"}, - {0x0385, "dieresistonos"}, - {0x00f7, "divide"}, - {0x2593, "dkshade"}, - {0x2584, "dnblock"}, - {0x0024, "dollar"}, - {0xf6e3, "dollarinferior"}, - {0xf724, "dollaroldstyle"}, - {0xf6e4, "dollarsuperior"}, - {0x20ab, "dong"}, - {0x02d9, "dotaccent"}, - {0x0323, "dotbelowcomb"}, - {0x0131, "dotlessi"}, - {0xf6be, "dotlessj"}, - {0x22c5, "dotmath"}, - {0xf6eb, "dsuperior"}, - {0x0065, "e"}, - {0x00e9, "eacute"}, - {0x0115, "ebreve"}, - {0x011b, "ecaron"}, - {0x00ea, "ecircumflex"}, - {0x00eb, "edieresis"}, - {0x0117, "edotaccent"}, - {0x00e8, "egrave"}, - {0x0038, "eight"}, - {0x2088, "eightinferior"}, - {0xf738, "eightoldstyle"}, - {0x2078, "eightsuperior"}, - {0x2208, "element"}, - {0x2026, "ellipsis"}, - {0x0113, "emacron"}, - {0x2014, "emdash"}, - {0x2205, "emptyset"}, - {0x2013, "endash"}, - {0x014b, "eng"}, - {0x0119, "eogonek"}, - {0x03b5, "epsilon"}, - {0x03ad, "epsilontonos"}, - {0x003d, "equal"}, - {0x2261, "equivalence"}, - {0x212e, "estimated"}, - {0xf6ec, "esuperior"}, - {0x03b7, "eta"}, - {0x03ae, "etatonos"}, - {0x00f0, "eth"}, - {0x0021, "exclam"}, - {0x203c, "exclamdbl"}, - {0x00a1, "exclamdown"}, - {0xf7a1, "exclamdownsmall"}, - {0x0021, "exclamleft"}, - {0xf721, "exclamsmall"}, - {0x2203, "existential"}, - {0x0066, "f"}, - {0x2640, "female"}, - {0xfb00, "ff"}, - {0xfb03, "ffi"}, - {0xfb04, "ffl"}, - {0xfb01, "fi"}, - {0x2012, "figuredash"}, - {0x25a0, "filledbox"}, - {0x25ac, "filledrect"}, - {0x0035, "five"}, - {0x215d, "fiveeighths"}, - {0x2085, "fiveinferior"}, - {0xf735, "fiveoldstyle"}, - {0x2075, "fivesuperior"}, - {0xfb02, "fl"}, - {0x0192, "florin"}, - {0x0034, "four"}, - {0x2084, "fourinferior"}, - {0xf734, "fouroldstyle"}, - {0x2074, "foursuperior"}, - {0x2044, "fraction"}, - {0x20a3, "franc"}, - {0x0067, "g"}, - {0x03b3, "gamma"}, - {0x011f, "gbreve"}, - {0x01e7, "gcaron"}, - {0x011d, "gcircumflex"}, - {0x0123, "gcommaaccent"}, - {0x0121, "gdotaccent"}, - {0x00df, "germandbls"}, - {0x2207, "gradient"}, - {0x0060, "grave"}, - {0x0300, "gravecomb"}, - {0x003e, "greater"}, - {0x2265, "greaterequal"}, - {0x00ab, "guillemotleft"}, - {0x00bb, "guillemotright"}, - {0x2039, "guilsinglleft"}, - {0x203a, "guilsinglright"}, - {0x0068, "h"}, - {0x0127, "hbar"}, - {0x0125, "hcircumflex"}, - {0x2665, "heart"}, - {0x0309, "hookabovecomb"}, - {0x2302, "house"}, - {0x02dd, "hungarumlaut"}, - {0x002d, "hyphen"}, - {0xf6e5, "hypheninferior"}, - {0xf6e6, "hyphensuperior"}, - {0x0069, "i"}, - {0x00ed, "iacute"}, - {0x012d, "ibreve"}, - {0x00ee, "icircumflex"}, - {0x00ef, "idieresis"}, - {0x00ec, "igrave"}, - {0x0133, "ij"}, - {0x012b, "imacron"}, - {0x221e, "infinity"}, - {0x222b, "integral"}, - {0x2321, "integralbt"}, - {0xf8f5, "integralex"}, - {0x2320, "integraltp"}, - {0x2229, "intersection"}, - {0x25d8, "invbullet"}, - {0x25d9, "invcircle"}, - {0x263b, "invsmileface"}, - {0x012f, "iogonek"}, - {0x03b9, "iota"}, - {0x03ca, "iotadieresis"}, - {0x0390, "iotadieresistonos"}, - {0x03af, "iotatonos"}, - {0xf6ed, "isuperior"}, - {0x0129, "itilde"}, - {0x006a, "j"}, - {0x0135, "jcircumflex"}, - {0x006b, "k"}, - {0x03ba, "kappa"}, - {0x0137, "kcommaaccent"}, - {0x0138, "kgreenlandic"}, - {0x006c, "l"}, - {0x013a, "lacute"}, - {0x03bb, "lambda"}, - {0x013e, "lcaron"}, - {0x013c, "lcommaaccent"}, - {0x0140, "ldot"}, - {0x003c, "less"}, - {0x2264, "lessequal"}, - {0x258c, "lfblock"}, - {0x20a4, "lira"}, - {0xf6c0, "ll"}, - {0x2227, "logicaland"}, - {0x00ac, "logicalnot"}, - {0x2228, "logicalor"}, - {0x017f, "longs"}, - {0x25ca, "lozenge"}, - {0x0142, "lslash"}, - {0xf6ee, "lsuperior"}, - {0x2591, "ltshade"}, - {0x006d, "m"}, - {0x00af, "macron"}, - {0x2642, "male"}, - {0x2212, "minus"}, - {0x2032, "minute"}, - {0xf6ef, "msuperior"}, - {0x00b5, "mu"}, - {0x00d7, "multiply"}, - {0x266a, "musicalnote"}, - {0x266b, "musicalnotedbl"}, - {0x006e, "n"}, - {0x0144, "nacute"}, - {0x0149, "napostrophe"}, - {0x00a0, "nbspace"}, - {0x0148, "ncaron"}, - {0x0146, "ncommaaccent"}, - {0x0039, "nine"}, - {0x2089, "nineinferior"}, - {0xf739, "nineoldstyle"}, - {0x2079, "ninesuperior"}, - {0x00a0, "nonbreakingspace"}, - {0x2209, "notelement"}, - {0x2260, "notequal"}, - {0x2284, "notsubset"}, - {0x207f, "nsuperior"}, - {0x00f1, "ntilde"}, - {0x03bd, "nu"}, - {0x0023, "numbersign"}, - {0x006f, "o"}, - {0x00f3, "oacute"}, - {0x014f, "obreve"}, - {0x00f4, "ocircumflex"}, - {0x00f6, "odieresis"}, - {0x0153, "oe"}, - {0x02db, "ogonek"}, - {0x00f2, "ograve"}, - {0x01a1, "ohorn"}, - {0x0151, "ohungarumlaut"}, - {0x014d, "omacron"}, - {0x03c9, "omega"}, - {0x03d6, "omega1"}, - {0x03ce, "omegatonos"}, - {0x03bf, "omicron"}, - {0x03cc, "omicrontonos"}, - {0x0031, "one"}, - {0x2024, "onedotenleader"}, - {0x215b, "oneeighth"}, - {0xf6dc, "onefitted"}, - {0x00bd, "onehalf"}, - {0x2081, "oneinferior"}, - {0xf731, "oneoldstyle"}, - {0x00bc, "onequarter"}, - {0x00b9, "onesuperior"}, - {0x2153, "onethird"}, - {0x25e6, "openbullet"}, - {0x00aa, "ordfeminine"}, - {0x00ba, "ordmasculine"}, - {0x221f, "orthogonal"}, - {0x00f8, "oslash"}, - {0x01ff, "oslashacute"}, - {0xf6f0, "osuperior"}, - {0x00f5, "otilde"}, - {0x0070, "p"}, - {0x00b6, "paragraph"}, - {0x0028, "parenleft"}, - {0xf8ed, "parenleftbt"}, - {0xf8ec, "parenleftex"}, - {0x208d, "parenleftinferior"}, - {0x207d, "parenleftsuperior"}, - {0xf8eb, "parenlefttp"}, - {0x0029, "parenright"}, - {0xf8f8, "parenrightbt"}, - {0xf8f7, "parenrightex"}, - {0x208e, "parenrightinferior"}, - {0x207e, "parenrightsuperior"}, - {0xf8f6, "parenrighttp"}, - {0x2202, "partialdiff"}, - {0x0025, "percent"}, - {0x002e, "period"}, - {0x00b7, "periodcentered"}, - {0xf6e7, "periodinferior"}, - {0xf6e8, "periodsuperior"}, - {0x22a5, "perpendicular"}, - {0x2030, "perthousand"}, - {0x20a7, "peseta"}, - {0x03c6, "phi"}, - {0x03d5, "phi1"}, - {0x03c0, "pi"}, - {0x002b, "plus"}, - {0x00b1, "plusminus"}, - {0x211e, "prescription"}, - {0x220f, "product"}, - {0x2282, "propersubset"}, - {0x2283, "propersuperset"}, - {0x221d, "proportional"}, - {0x03c8, "psi"}, - {0x0071, "q"}, - {0x003f, "question"}, - {0x00bf, "questiondown"}, - {0xf7bf, "questiondownsmall"}, - {0xf73f, "questionsmall"}, - {0x0022, "quotedbl"}, - {0x201e, "quotedblbase"}, - {0x201c, "quotedblleft"}, - {0x201d, "quotedblright"}, - {0x2018, "quoteleft"}, - {0x201b, "quotereversed"}, - {0x2019, "quoteright"}, - {0x201a, "quotesinglbase"}, - {0x0027, "quotesingle"}, - {0x0072, "r"}, - {0x0155, "racute"}, - {0x221a, "radical"}, - {0xf8e5, "radicalex"}, - {0x0159, "rcaron"}, - {0x0157, "rcommaaccent"}, - {0x2286, "reflexsubset"}, - {0x2287, "reflexsuperset"}, - {0x00ae, "registered"}, - {0x00ae, "registersans"}, - {0x00ae, "registerserif"}, - {0x2310, "revlogicalnot"}, - {0x03c1, "rho"}, - {0x02da, "ring"}, - {0xf6f1, "rsuperior"}, - {0x2590, "rtblock"}, - {0xf6dd, "rupiah"}, - {0x0073, "s"}, - {0x015b, "sacute"}, - {0x0161, "scaron"}, - {0x015f, "scedilla"}, - {0x015d, "scircumflex"}, - {0x0219, "scommaaccent"}, - {0x2033, "second"}, - {0x00a7, "section"}, - {0x003b, "semicolon"}, - {0x0037, "seven"}, - {0x215e, "seveneighths"}, - {0x2087, "seveninferior"}, - {0xf737, "sevenoldstyle"}, - {0x2077, "sevensuperior"}, - {0x2592, "shade"}, - {0x03c3, "sigma"}, - {0x03c2, "sigma1"}, - {0x223c, "similar"}, - {0x0036, "six"}, - {0x2086, "sixinferior"}, - {0xf736, "sixoldstyle"}, - {0x2076, "sixsuperior"}, - {0x002f, "slash"}, - {0x263a, "smileface"}, - {0x0020, "space"}, - {0x2660, "spade"}, - {0xf6f2, "ssuperior"}, - {0x00a3, "sterling"}, - {0x220b, "suchthat"}, - {0x2211, "summation"}, - {0x263c, "sun"}, - {0x0074, "t"}, - {0x03c4, "tau"}, - {0x0167, "tbar"}, - {0x0165, "tcaron"}, - {0x0163, "tcommaaccent"}, - {0x2234, "therefore"}, - {0x03b8, "theta"}, - {0x03d1, "theta1"}, - {0x00fe, "thorn"}, - {0x0033, "three"}, - {0x215c, "threeeighths"}, - {0x2083, "threeinferior"}, - {0xf733, "threeoldstyle"}, - {0x00be, "threequarters"}, - {0xf6de, "threequartersemdash"}, - {0x00b3, "threesuperior"}, - {0x02dc, "tilde"}, - {0x0303, "tildecomb"}, - {0x0384, "tonos"}, - {0x2122, "trademark"}, - {0x2122, "trademarksans"}, - {0x2122, "trademarkserif"}, - {0x25bc, "triagdn"}, - {0x25c4, "triaglf"}, - {0x25ba, "triagrt"}, - {0x25b2, "triagup"}, - {0xf6f3, "tsuperior"}, - {0x0032, "two"}, - {0x2025, "twodotenleader"}, - {0x2082, "twoinferior"}, - {0xf732, "twooldstyle"}, - {0x00b2, "twosuperior"}, - {0x2154, "twothirds"}, - {0x0075, "u"}, - {0x00fa, "uacute"}, - {0x016d, "ubreve"}, - {0x00fb, "ucircumflex"}, - {0x00fc, "udieresis"}, - {0x00f9, "ugrave"}, - {0x01b0, "uhorn"}, - {0x0171, "uhungarumlaut"}, - {0x016b, "umacron"}, - {0x005f, "underscore"}, - {0x2017, "underscoredbl"}, - {0x222a, "union"}, - {0x2200, "universal"}, - {0x0173, "uogonek"}, - {0x2580, "upblock"}, - {0x03c5, "upsilon"}, - {0x03cb, "upsilondieresis"}, - {0x03b0, "upsilondieresistonos"}, - {0x03cd, "upsilontonos"}, - {0x016f, "uring"}, - {0x0169, "utilde"}, - {0x0076, "v"}, - {0x0077, "w"}, - {0x1e83, "wacute"}, - {0x0175, "wcircumflex"}, - {0x1e85, "wdieresis"}, - {0x2118, "weierstrass"}, - {0x1e81, "wgrave"}, - {0x0078, "x"}, - {0x03be, "xi"}, - {0x0079, "y"}, - {0x00fd, "yacute"}, - {0x0177, "ycircumflex"}, - {0x00ff, "ydieresis"}, - {0x00a5, "yen"}, - {0x1ef3, "ygrave"}, - {0x007a, "z"}, - {0x017a, "zacute"}, - {0x017e, "zcaron"}, - {0x017c, "zdotaccent"}, - {0x0030, "zero"}, - {0x2080, "zeroinferior"}, - {0xf730, "zerooldstyle"}, - {0x2070, "zerosuperior"}, - {0x03b6, "zeta"}, - {0x007b, "{"}, - {0x007c, "|"}, - {0x007d, "}"}, - {0x007e, "~"}, - { 0, NULL } -}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.cc deleted file mode 100644 index 71c632a1a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.cc +++ /dev/null @@ -1,231 +0,0 @@ -//======================================================================== -// -// Object.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "Object.h" -#include "Array.h" -#include "Dict.h" -#include "Error.h" -#include "Stream.h" -#include "XRef.h" - -//------------------------------------------------------------------------ -// Object -//------------------------------------------------------------------------ - -char *objTypeNames[numObjTypes] = { - "boolean", - "integer", - "real", - "string", - "name", - "null", - "array", - "dictionary", - "stream", - "ref", - "cmd", - "error", - "eof", - "none" -}; - -#ifdef DEBUG_MEM -int Object::numAlloc[numObjTypes] = - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -#endif - -Object *Object::initArray(XRef *xref) { - initObj(objArray); - array = new Array(xref); - return this; -} - -Object *Object::initDict(XRef *xref) { - initObj(objDict); - dict = new Dict(xref); - return this; -} - -Object *Object::initDict(Dict *dictA) { - initObj(objDict); - dict = dictA; - dict->incRef(); - return this; -} - -Object *Object::initStream(Stream *streamA) { - initObj(objStream); - stream = streamA; - return this; -} - -Object *Object::copy(Object *obj) { - *obj = *this; - switch (type) { - case objString: - obj->string = string->copy(); - break; - case objName: - obj->name = copyString(name); - break; - case objArray: - array->incRef(); - break; - case objDict: - dict->incRef(); - break; - case objStream: - stream->incRef(); - break; - case objCmd: - obj->cmd = copyString(cmd); - break; - default: - break; - } -#ifdef DEBUG_MEM - ++numAlloc[type]; -#endif - return obj; -} - -Object *Object::fetch(XRef *xref, Object *obj) { - return (type == objRef && xref) ? - xref->fetch(ref.num, ref.gen, obj) : copy(obj); -} - -void Object::free() { - switch (type) { - case objString: - delete string; - break; - case objName: - gfree(name); - break; - case objArray: - if (!array->decRef()) { - delete array; - } - break; - case objDict: - if (!dict->decRef()) { - delete dict; - } - break; - case objStream: - if (!stream->decRef()) { - delete stream; - } - break; - case objCmd: - gfree(cmd); - break; - default: - break; - } -#ifdef DEBUG_MEM - --numAlloc[type]; -#endif - type = objNone; -} - -char *Object::getTypeName() { - return objTypeNames[type]; -} - -void Object::print(FILE *f) { - Object obj; - int i; - - switch (type) { - case objBool: - fprintf(f, "%s", booln ? "true" : "false"); - break; - case objInt: - fprintf(f, "%d", intg); - break; - case objReal: - fprintf(f, "%g", real); - break; - case objString: - fprintf(f, "("); - fwrite(string->getCString(), 1, string->getLength(), f); - fprintf(f, ")"); - break; - case objName: - fprintf(f, "/%s", name); - break; - case objNull: - fprintf(f, "null"); - break; - case objArray: - fprintf(f, "["); - for (i = 0; i < arrayGetLength(); ++i) { - if (i > 0) - fprintf(f, " "); - arrayGetNF(i, &obj); - obj.print(f); - obj.free(); - } - fprintf(f, "]"); - break; - case objDict: - fprintf(f, "<<"); - for (i = 0; i < dictGetLength(); ++i) { - fprintf(f, " /%s ", dictGetKey(i)); - dictGetValNF(i, &obj); - obj.print(f); - obj.free(); - } - fprintf(f, " >>"); - break; - case objStream: - fprintf(f, ""); - break; - case objRef: - fprintf(f, "%d %d R", ref.num, ref.gen); - break; - case objCmd: - fprintf(f, "%s", cmd); - break; - case objError: - fprintf(f, ""); - break; - case objEOF: - fprintf(f, ""); - break; - case objNone: - fprintf(f, ""); - break; - } -} - -void Object::memCheck(FILE *f) { -#ifdef DEBUG_MEM - int i; - int t; - - t = 0; - for (i = 0; i < numObjTypes; ++i) - t += numAlloc[i]; - if (t > 0) { - fprintf(f, "Allocated objects:\n"); - for (i = 0; i < numObjTypes; ++i) { - if (numAlloc[i] > 0) - fprintf(f, " %-20s: %6d\n", objTypeNames[i], numAlloc[i]); - } - } -#endif -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.h deleted file mode 100644 index 8b1807c5b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Object.h +++ /dev/null @@ -1,303 +0,0 @@ -//======================================================================== -// -// Object.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef OBJECT_H -#define OBJECT_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include -#include "gtypes.h" -#include "gmem.h" -#include "GString.h" - -class XRef; -class Array; -class Dict; -class Stream; - -//------------------------------------------------------------------------ -// Ref -//------------------------------------------------------------------------ - -struct Ref { - int num; // object number - int gen; // generation number -}; - -//------------------------------------------------------------------------ -// object types -//------------------------------------------------------------------------ - -enum ObjType { - // simple objects - objBool, // boolean - objInt, // integer - objReal, // real - objString, // string - objName, // name - objNull, // null - - // complex objects - objArray, // array - objDict, // dictionary - objStream, // stream - objRef, // indirect reference - - // special objects - objCmd, // command name - objError, // error return from Lexer - objEOF, // end of file return from Lexer - objNone // uninitialized object -}; - -#define numObjTypes 14 // total number of object types - -//------------------------------------------------------------------------ -// Object -//------------------------------------------------------------------------ - -#ifdef DEBUG_MEM -#define initObj(t) ++numAlloc[type = t] -#else -#define initObj(t) type = t -#endif - -class Object { -public: - - // Default constructor. - Object(): - type(objNone) {} - - // Initialize an object. - Object *initBool(GBool boolnA) - { initObj(objBool); booln = boolnA; return this; } - Object *initInt(int intgA) - { initObj(objInt); intg = intgA; return this; } - Object *initReal(double realA) - { initObj(objReal); real = realA; return this; } - Object *initString(GString *stringA) - { initObj(objString); string = stringA; return this; } - Object *initName(char *nameA) - { initObj(objName); name = copyString(nameA); return this; } - Object *initNull() - { initObj(objNull); return this; } - Object *initArray(XRef *xref); - Object *initDict(XRef *xref); - Object *initDict(Dict *dictA); - Object *initStream(Stream *streamA); - Object *initRef(int numA, int genA) - { initObj(objRef); ref.num = numA; ref.gen = genA; return this; } - Object *initCmd(char *cmdA) - { initObj(objCmd); cmd = copyString(cmdA); return this; } - Object *initError() - { initObj(objError); return this; } - Object *initEOF() - { initObj(objEOF); return this; } - - // Copy an object. - Object *copy(Object *obj); - - // If object is a Ref, fetch and return the referenced object. - // Otherwise, return a copy of the object. - Object *fetch(XRef *xref, Object *obj); - - // Free object contents. - void free(); - - // Type checking. - ObjType getType() { return type; } - GBool isBool() { return type == objBool; } - GBool isInt() { return type == objInt; } - GBool isReal() { return type == objReal; } - GBool isNum() { return type == objInt || type == objReal; } - GBool isString() { return type == objString; } - GBool isName() { return type == objName; } - GBool isNull() { return type == objNull; } - GBool isArray() { return type == objArray; } - GBool isDict() { return type == objDict; } - GBool isStream() { return type == objStream; } - GBool isRef() { return type == objRef; } - GBool isCmd() { return type == objCmd; } - GBool isError() { return type == objError; } - GBool isEOF() { return type == objEOF; } - GBool isNone() { return type == objNone; } - - // Special type checking. - GBool isName(char *nameA) - { return type == objName && !strcmp(name, nameA); } - GBool isDict(char *dictType); - GBool isStream(char *dictType); - GBool isCmd(char *cmdA) - { return type == objCmd && !strcmp(cmd, cmdA); } - - // Accessors. NB: these assume object is of correct type. - GBool getBool() { return booln; } - int getInt() { return intg; } - double getReal() { return real; } - double getNum() { return type == objInt ? (double)intg : real; } - GString *getString() { return string; } - char *getName() { return name; } - Array *getArray() { return array; } - Dict *getDict() { return dict; } - Stream *getStream() { return stream; } - Ref getRef() { return ref; } - int getRefNum() { return ref.num; } - int getRefGen() { return ref.gen; } - char *getCmd() { return cmd; } - - // Array accessors. - int arrayGetLength(); - void arrayAdd(Object *elem); - Object *arrayGet(int i, Object *obj); - Object *arrayGetNF(int i, Object *obj); - - // Dict accessors. - int dictGetLength(); - void dictAdd(char *key, Object *val); - GBool dictIs(char *dictType); - Object *dictLookup(char *key, Object *obj); - Object *dictLookupNF(char *key, Object *obj); - char *dictGetKey(int i); - Object *dictGetVal(int i, Object *obj); - Object *dictGetValNF(int i, Object *obj); - - // Stream accessors. - GBool streamIs(char *dictType); - void streamReset(); - void streamClose(); - int streamGetChar(); - int streamLookChar(); - char *streamGetLine(char *buf, int size); - Guint streamGetPos(); - void streamSetPos(Guint pos, int dir = 0); - Dict *streamGetDict(); - - // Output. - char *getTypeName(); - void print(FILE *f = stdout); - - // Memory testing. - static void memCheck(FILE *f); - -private: - - ObjType type; // object type - union { // value for each type: - GBool booln; // boolean - int intg; // integer - double real; // real - GString *string; // string - char *name; // name - Array *array; // array - Dict *dict; // dictionary - Stream *stream; // stream - Ref ref; // indirect reference - char *cmd; // command - }; - -#ifdef DEBUG_MEM - static int // number of each type of object - numAlloc[numObjTypes]; // currently allocated -#endif -}; - -//------------------------------------------------------------------------ -// Array accessors. -//------------------------------------------------------------------------ - -#include "Array.h" - -inline int Object::arrayGetLength() - { return array->getLength(); } - -inline void Object::arrayAdd(Object *elem) - { array->add(elem); } - -inline Object *Object::arrayGet(int i, Object *obj) - { return array->get(i, obj); } - -inline Object *Object::arrayGetNF(int i, Object *obj) - { return array->getNF(i, obj); } - -//------------------------------------------------------------------------ -// Dict accessors. -//------------------------------------------------------------------------ - -#include "Dict.h" - -inline int Object::dictGetLength() - { return dict->getLength(); } - -inline void Object::dictAdd(char *key, Object *val) - { dict->add(key, val); } - -inline GBool Object::dictIs(char *dictType) - { return dict->is(dictType); } - -inline GBool Object::isDict(char *dictType) - { return type == objDict && dictIs(dictType); } - -inline Object *Object::dictLookup(char *key, Object *obj) - { return dict->lookup(key, obj); } - -inline Object *Object::dictLookupNF(char *key, Object *obj) - { return dict->lookupNF(key, obj); } - -inline char *Object::dictGetKey(int i) - { return dict->getKey(i); } - -inline Object *Object::dictGetVal(int i, Object *obj) - { return dict->getVal(i, obj); } - -inline Object *Object::dictGetValNF(int i, Object *obj) - { return dict->getValNF(i, obj); } - -//------------------------------------------------------------------------ -// Stream accessors. -//------------------------------------------------------------------------ - -#include "Stream.h" - -inline GBool Object::streamIs(char *dictType) - { return stream->getDict()->is(dictType); } - -inline GBool Object::isStream(char *dictType) - { return type == objStream && streamIs(dictType); } - -inline void Object::streamReset() - { stream->reset(); } - -inline void Object::streamClose() - { stream->close(); } - -inline int Object::streamGetChar() - { return stream->getChar(); } - -inline int Object::streamLookChar() - { return stream->lookChar(); } - -inline char *Object::streamGetLine(char *buf, int size) - { return stream->getLine(buf, size); } - -inline Guint Object::streamGetPos() - { return stream->getPos(); } - -inline void Object::streamSetPos(Guint pos, int dir) - { stream->setPos(pos, dir); } - -inline Dict *Object::streamGetDict() - { return stream->getDict(); } - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.cc deleted file mode 100644 index 39e89a3c3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.cc +++ /dev/null @@ -1,151 +0,0 @@ -//======================================================================== -// -// Outline.cc -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "gmem.h" -#include "GString.h" -#include "GList.h" -#include "Link.h" -#include "PDFDocEncoding.h" -#include "Outline.h" - -//------------------------------------------------------------------------ - -Outline::Outline(Object *outlineObj, XRef *xref) { - Object first, last; - - items = NULL; - if (!outlineObj->isDict()) { - return; - } - items = OutlineItem::readItemList(outlineObj->dictLookupNF("First", &first), - outlineObj->dictLookupNF("Last", &last), - xref); - first.free(); - last.free(); -} - -Outline::~Outline() { - if (items) { - deleteGList(items, OutlineItem); - } -} - -//------------------------------------------------------------------------ - -OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) { - Object obj1; - GString *s; - int i; - - xref = xrefA; - title = NULL; - action = NULL; - kids = NULL; - - if (dict->lookup("Title", &obj1)->isString()) { - s = obj1.getString(); - if ((s->getChar(0) & 0xff) == 0xfe && - (s->getChar(1) & 0xff) == 0xff) { - titleLen = (s->getLength() - 2) / 2; - title = (Unicode *)gmallocn(titleLen, sizeof(Unicode)); - for (i = 0; i < titleLen; ++i) { - title[i] = ((s->getChar(2 + 2*i) & 0xff) << 8) | - (s->getChar(3 + 2*i) & 0xff); - } - } else { - titleLen = s->getLength(); - title = (Unicode *)gmallocn(titleLen, sizeof(Unicode)); - for (i = 0; i < titleLen; ++i) { - title[i] = pdfDocEncoding[s->getChar(i) & 0xff]; - } - } - } else { - titleLen = 0; - } - obj1.free(); - - if (!dict->lookup("Dest", &obj1)->isNull()) { - action = LinkAction::parseDest(&obj1); - } else { - obj1.free(); - if (!dict->lookup("A", &obj1)->isNull()) { - action = LinkAction::parseAction(&obj1); - } - } - obj1.free(); - - dict->lookupNF("First", &firstRef); - dict->lookupNF("Last", &lastRef); - dict->lookupNF("Next", &nextRef); - - startsOpen = gFalse; - if (dict->lookup("Count", &obj1)->isInt()) { - if (obj1.getInt() > 0) { - startsOpen = gTrue; - } - } - obj1.free(); -} - -OutlineItem::~OutlineItem() { - close(); - if (title) { - gfree(title); - } - if (action) { - delete action; - } - firstRef.free(); - lastRef.free(); - nextRef.free(); -} - -GList *OutlineItem::readItemList(Object *firstItemRef, Object *lastItemRef, - XRef *xrefA) { - GList *items; - OutlineItem *item; - Object obj; - Object *p; - - items = new GList(); - p = firstItemRef; - while (p->isRef()) { - if (!p->fetch(xrefA, &obj)->isDict()) { - obj.free(); - break; - } - item = new OutlineItem(obj.getDict(), xrefA); - obj.free(); - items->append(item); - if (p->getRef().num == lastItemRef->getRef().num && - p->getRef().gen == lastItemRef->getRef().gen) { - break; - } - p = &item->nextRef; - } - return items; -} - -void OutlineItem::open() { - if (!kids) { - kids = readItemList(&firstRef, &lastRef, xref); - } -} - -void OutlineItem::close() { - if (kids) { - deleteGList(kids, OutlineItem); - kids = NULL; - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.h deleted file mode 100644 index f38f8d161..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Outline.h +++ /dev/null @@ -1,76 +0,0 @@ -//======================================================================== -// -// Outline.h -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef OUTLINE_H -#define OUTLINE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "Object.h" -#include "CharTypes.h" - -class GString; -class GList; -class XRef; -class LinkAction; - -//------------------------------------------------------------------------ - -class Outline { -public: - - Outline(Object *outlineObj, XRef *xref); - ~Outline(); - - GList *getItems() { return items; } - -private: - - GList *items; // NULL if document has no outline - // [OutlineItem] -}; - -//------------------------------------------------------------------------ - -class OutlineItem { -public: - - OutlineItem(Dict *dict, XRef *xrefA); - ~OutlineItem(); - - static GList *readItemList(Object *firstItemRef, Object *lastItemRef, - XRef *xrefA); - - void open(); - void close(); - - Unicode *getTitle() { return title; } - int getTitleLength() { return titleLen; } - LinkAction *getAction() { return action; } - GBool isOpen() { return startsOpen; } - GBool hasKids() { return firstRef.isRef(); } - GList *getKids() { return kids; } - -private: - - XRef *xref; - Unicode *title; - int titleLen; - LinkAction *action; - Object firstRef; - Object lastRef; - Object nextRef; - GBool startsOpen; - GList *kids; // NULL unless this item is open [OutlineItem] -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.cc deleted file mode 100644 index 8d4763b7d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.cc +++ /dev/null @@ -1,131 +0,0 @@ -//======================================================================== -// -// OutputDev.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "Object.h" -#include "Stream.h" -#include "GfxState.h" -#include "OutputDev.h" - -//------------------------------------------------------------------------ -// OutputDev -//------------------------------------------------------------------------ - -void OutputDev::setDefaultCTM(double *ctm) { - int i; - double det; - - for (i = 0; i < 6; ++i) { - defCTM[i] = ctm[i]; - } - det = 1 / (defCTM[0] * defCTM[3] - defCTM[1] * defCTM[2]); - defICTM[0] = defCTM[3] * det; - defICTM[1] = -defCTM[1] * det; - defICTM[2] = -defCTM[2] * det; - defICTM[3] = defCTM[0] * det; - defICTM[4] = (defCTM[2] * defCTM[5] - defCTM[3] * defCTM[4]) * det; - defICTM[5] = (defCTM[1] * defCTM[4] - defCTM[0] * defCTM[5]) * det; -} - -void OutputDev::cvtDevToUser(double dx, double dy, double *ux, double *uy) { - *ux = defICTM[0] * dx + defICTM[2] * dy + defICTM[4]; - *uy = defICTM[1] * dx + defICTM[3] * dy + defICTM[5]; -} - -void OutputDev::cvtUserToDev(double ux, double uy, int *dx, int *dy) { - *dx = (int)(defCTM[0] * ux + defCTM[2] * uy + defCTM[4] + 0.5); - *dy = (int)(defCTM[1] * ux + defCTM[3] * uy + defCTM[5] + 0.5); -} - -void OutputDev::updateAll(GfxState *state) { - updateLineDash(state); - updateFlatness(state); - updateLineJoin(state); - updateLineCap(state); - updateMiterLimit(state); - updateLineWidth(state); - updateStrokeAdjust(state); - updateFillColorSpace(state); - updateFillColor(state); - updateStrokeColorSpace(state); - updateStrokeColor(state); - updateBlendMode(state); - updateFillOpacity(state); - updateStrokeOpacity(state); - updateFillOverprint(state); - updateStrokeOverprint(state); - updateTransfer(state); - updateFont(state); -} - -GBool OutputDev::beginType3Char(GfxState *state, double x, double y, - double dx, double dy, - CharCode code, Unicode *u, int uLen) { - return gFalse; -} - -void OutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - GBool inlineImg) { - int i, j; - - if (inlineImg) { - str->reset(); - j = height * ((width + 7) / 8); - for (i = 0; i < j; ++i) - str->getChar(); - str->close(); - } -} - -void OutputDev::drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - int *maskColors, GBool inlineImg) { - int i, j; - - if (inlineImg) { - str->reset(); - j = height * ((width * colorMap->getNumPixelComps() * - colorMap->getBits() + 7) / 8); - for (i = 0; i < j; ++i) - str->getChar(); - str->close(); - } -} - -void OutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, - int maskWidth, int maskHeight, - GBool maskInvert) { - drawImage(state, ref, str, width, height, colorMap, NULL, gFalse); -} - -void OutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap) { - drawImage(state, ref, str, width, height, colorMap, NULL, gFalse); -} - -#if OPI_SUPPORT -void OutputDev::opiBegin(GfxState *state, Dict *opiDict) { -} - -void OutputDev::opiEnd(GfxState *state, Dict *opiDict) { -} -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.h deleted file mode 100644 index d9255a986..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/OutputDev.h +++ /dev/null @@ -1,251 +0,0 @@ -//======================================================================== -// -// OutputDev.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef OUTPUTDEV_H -#define OUTPUTDEV_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "CharTypes.h" -#include "Object.h" - -class GString; -class GfxState; -struct GfxColor; -class GfxColorSpace; -class GfxImageColorMap; -class GfxFunctionShading; -class GfxAxialShading; -class GfxRadialShading; -class Stream; -class Links; -class Link; -class Catalog; -class Page; -class Function; - -//------------------------------------------------------------------------ -// OutputDev -//------------------------------------------------------------------------ - -class OutputDev { -public: - - // Constructor. - OutputDev() {} - - // Destructor. - virtual ~OutputDev() {} - - //----- get info about output device - - // Does this device use upside-down coordinates? - // (Upside-down means (0,0) is the top left corner of the page.) - virtual GBool upsideDown() = 0; - - // Does this device use drawChar() or drawString()? - virtual GBool useDrawChar() = 0; - - // Does this device use tilingPatternFill()? If this returns false, - // tiling pattern fills will be reduced to a series of other drawing - // operations. - virtual GBool useTilingPatternFill() { return gFalse; } - - // Does this device use functionShadedFill(), axialShadedFill(), and - // radialShadedFill()? If this returns false, these shaded fills - // will be reduced to a series of other drawing operations. - virtual GBool useShadedFills() { return gFalse; } - - // Does this device use drawForm()? If this returns false, - // form-type XObjects will be interpreted (i.e., unrolled). - virtual GBool useDrawForm() { return gFalse; } - - // Does this device use beginType3Char/endType3Char? Otherwise, - // text in Type 3 fonts will be drawn with drawChar/drawString. - virtual GBool interpretType3Chars() = 0; - - // Does this device need non-text content? - virtual GBool needNonText() { return gTrue; } - - //----- initialization and control - - // Set default transform matrix. - virtual void setDefaultCTM(double *ctm); - - // Check to see if a page slice should be displayed. If this - // returns false, the page display is aborted. Typically, an - // OutputDev will use some alternate means to display the page - // before returning false. - virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL) - { return gTrue; } - - // Start a page. - virtual void startPage(int pageNum, GfxState *state) {} - - // End a page. - virtual void endPage() {} - - // Dump page contents to display. - virtual void dump() {} - - //----- coordinate conversion - - // Convert between device and user coordinates. - virtual void cvtDevToUser(double dx, double dy, double *ux, double *uy); - virtual void cvtUserToDev(double ux, double uy, int *dx, int *dy); - - double *getDefCTM() { return defCTM; } - double *getDefICTM() { return defICTM; } - - //----- save/restore graphics state - virtual void saveState(GfxState *state) {} - virtual void restoreState(GfxState *state) {} - - //----- update graphics state - virtual void updateAll(GfxState *state); - virtual void updateCTM(GfxState *state, double m11, double m12, - double m21, double m22, double m31, double m32) {} - virtual void updateLineDash(GfxState *state) {} - virtual void updateFlatness(GfxState *state) {} - virtual void updateLineJoin(GfxState *state) {} - virtual void updateLineCap(GfxState *state) {} - virtual void updateMiterLimit(GfxState *state) {} - virtual void updateLineWidth(GfxState *state) {} - virtual void updateStrokeAdjust(GfxState *state) {} - virtual void updateFillColorSpace(GfxState *state) {} - virtual void updateStrokeColorSpace(GfxState *state) {} - virtual void updateFillColor(GfxState *state) {} - virtual void updateStrokeColor(GfxState *state) {} - virtual void updateBlendMode(GfxState *state) {} - virtual void updateFillOpacity(GfxState *state) {} - virtual void updateStrokeOpacity(GfxState *state) {} - virtual void updateFillOverprint(GfxState *state) {} - virtual void updateStrokeOverprint(GfxState *state) {} - virtual void updateTransfer(GfxState *state) {} - - //----- update text state - virtual void updateFont(GfxState *state) {} - virtual void updateTextMat(GfxState *state) {} - virtual void updateCharSpace(GfxState *state) {} - virtual void updateRender(GfxState *state) {} - virtual void updateRise(GfxState *state) {} - virtual void updateWordSpace(GfxState *state) {} - virtual void updateHorizScaling(GfxState *state) {} - virtual void updateTextPos(GfxState *state) {} - virtual void updateTextShift(GfxState *state, double shift) {} - - //----- path painting - virtual void stroke(GfxState *state) {} - virtual void fill(GfxState *state) {} - virtual void eoFill(GfxState *state) {} - virtual void tilingPatternFill(GfxState *state, Object *str, - int paintType, Dict *resDict, - double *mat, double *bbox, - int x0, int y0, int x1, int y1, - double xStep, double yStep) {} - virtual GBool functionShadedFill(GfxState *state, - GfxFunctionShading *shading) - { return gFalse; } - virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading) - { return gFalse; } - virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading) - { return gFalse; } - - //----- path clipping - virtual void clip(GfxState *state) {} - virtual void eoClip(GfxState *state) {} - virtual void clipToStrokePath(GfxState *state) {} - - //----- text drawing - virtual void beginStringOp(GfxState *state) {} - virtual void endStringOp(GfxState *state) {} - virtual void beginString(GfxState *state, GString *s) {} - virtual void endString(GfxState *state) {} - virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen) {} - virtual void drawString(GfxState *state, GString *s) {} - virtual GBool beginType3Char(GfxState *state, double x, double y, - double dx, double dy, - CharCode code, Unicode *u, int uLen); - virtual void endType3Char(GfxState *state) {} - virtual void endTextObject(GfxState *state) {} - - //----- image drawing - virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - GBool inlineImg); - virtual void drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - int *maskColors, GBool inlineImg); - virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, int maskWidth, int maskHeight, - GBool maskInvert); - virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap); - -#if OPI_SUPPORT - //----- OPI functions - virtual void opiBegin(GfxState *state, Dict *opiDict); - virtual void opiEnd(GfxState *state, Dict *opiDict); -#endif - - //----- Type 3 font operators - virtual void type3D0(GfxState *state, double wx, double wy) {} - virtual void type3D1(GfxState *state, double wx, double wy, - double llx, double lly, double urx, double ury) {} - - //----- form XObjects - virtual void drawForm(Ref id) {} - - //----- PostScript XObjects - virtual void psXObject(Stream *psStream, Stream *level1Stream) {} - - //----- transparency groups and soft masks - virtual void beginTransparencyGroup(GfxState *state, double *bbox, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool forSoftMask) {} - virtual void endTransparencyGroup(GfxState *state) {} - virtual void paintTransparencyGroup(GfxState *state, double *bbox) {} - virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, - Function *transferFunc, GfxColor *backdropColor) {} - virtual void clearSoftMask(GfxState *state) {} - - //----- links - virtual void processLink(Link *link, Catalog *catalog) {} - -#if 1 //~tmp: turn off anti-aliasing temporarily - virtual GBool getVectorAntialias() { return gFalse; } - virtual void setVectorAntialias(GBool vaa) {} -#endif - -private: - - double defCTM[6]; // default coordinate transform matrix - double defICTM[6]; // inverse of default CTM -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.cc deleted file mode 100644 index c559eefcf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.cc +++ /dev/null @@ -1,402 +0,0 @@ -//======================================================================== -// -// PDFDoc.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#ifdef WIN32 -# include -#endif -#include "GString.h" -#include "config.h" -#include "GlobalParams.h" -#include "Page.h" -#include "Catalog.h" -#include "Stream.h" -#include "XRef.h" -#include "Link.h" -#include "OutputDev.h" -#include "Error.h" -#include "ErrorCodes.h" -#include "Lexer.h" -#include "Parser.h" -#include "SecurityHandler.h" -#ifndef DISABLE_OUTLINE -#include "Outline.h" -#endif -#include "PDFDoc.h" - -//------------------------------------------------------------------------ - -#define headerSearchSize 1024 // read this many bytes at beginning of - // file to look for '%PDF' - -//------------------------------------------------------------------------ -// PDFDoc -//------------------------------------------------------------------------ - -PDFDoc::PDFDoc(GString *fileNameA, GString *ownerPassword, - GString *userPassword, void *guiDataA) { - Object obj; - GString *fileName1, *fileName2; - - ok = gFalse; - errCode = errNone; - - guiData = guiDataA; - - file = NULL; - str = NULL; - xref = NULL; - catalog = NULL; -#ifndef DISABLE_OUTLINE - outline = NULL; -#endif - - fileName = fileNameA; - fileName1 = fileName; - - - // try to open file - fileName2 = NULL; -#ifdef VMS - if (!(file = fopen(fileName1->getCString(), "rb", "ctx=stm"))) { - error(-1, "Couldn't open file '%s'", fileName1->getCString()); - errCode = errOpenFile; - return; - } -#else - if (!(file = fopen(fileName1->getCString(), "rb"))) { - fileName2 = fileName->copy(); - fileName2->lowerCase(); - if (!(file = fopen(fileName2->getCString(), "rb"))) { - fileName2->upperCase(); - if (!(file = fopen(fileName2->getCString(), "rb"))) { - error(-1, "Couldn't open file '%s'", fileName->getCString()); - delete fileName2; - errCode = errOpenFile; - return; - } - } - delete fileName2; - } -#endif - - // create stream - obj.initNull(); - str = new FileStream(file, 0, gFalse, 0, &obj); - - ok = setup(ownerPassword, userPassword); -} - -#ifdef WIN32 -PDFDoc::PDFDoc(wchar_t *fileNameA, int fileNameLen, GString *ownerPassword, - GString *userPassword, void *guiDataA) { - OSVERSIONINFO version; - wchar_t fileName2[_MAX_PATH + 1]; - Object obj; - int i; - - ok = gFalse; - errCode = errNone; - - guiData = guiDataA; - - file = NULL; - str = NULL; - xref = NULL; - catalog = NULL; -#ifndef DISABLE_OUTLINE - outline = NULL; -#endif - - //~ file name should be stored in Unicode (?) - fileName = new GString(); - for (i = 0; i < fileNameLen; ++i) { - fileName->append((char)fileNameA[i]); - } - - // zero-terminate the file name string - for (i = 0; i < fileNameLen && i < _MAX_PATH; ++i) { - fileName2[i] = fileNameA[i]; - } - fileName2[i] = 0; - - // try to open file - // NB: _wfopen is only available in NT - version.dwOSVersionInfoSize = sizeof(version); - GetVersionEx(&version); - if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { - file = _wfopen(fileName2, L"rb"); - } else { - file = fopen(fileName->getCString(), "rb"); - } - if (!file) { - error(-1, "Couldn't open file '%s'", fileName->getCString()); - errCode = errOpenFile; - return; - } - - // create stream - obj.initNull(); - str = new FileStream(file, 0, gFalse, 0, &obj); - - ok = setup(ownerPassword, userPassword); -} -#endif - -PDFDoc::PDFDoc(BaseStream *strA, GString *ownerPassword, - GString *userPassword, void *guiDataA) { - ok = gFalse; - errCode = errNone; - guiData = guiDataA; - if (strA->getFileName()) { - fileName = strA->getFileName()->copy(); - } else { - fileName = NULL; - } - file = NULL; - str = strA; - xref = NULL; - catalog = NULL; -#ifndef DISABLE_OUTLINE - outline = NULL; -#endif - ok = setup(ownerPassword, userPassword); -} - -GBool PDFDoc::setup(GString *ownerPassword, GString *userPassword) { - str->reset(); - - // check header - checkHeader(); - - // read xref table - xref = new XRef(str); - if (!xref->isOk()) { - error(-1, "Couldn't read xref table"); - errCode = xref->getErrorCode(); - return gFalse; - } - - // check for encryption - if (!checkEncryption(ownerPassword, userPassword)) { - errCode = errEncrypted; - return gFalse; - } - - // read catalog - catalog = new Catalog(xref); - if (!catalog->isOk()) { - error(-1, "Couldn't read page catalog"); - errCode = errBadCatalog; - return gFalse; - } - -#ifndef DISABLE_OUTLINE - // read outline - outline = new Outline(catalog->getOutline(), xref); -#endif - - // done - return gTrue; -} - -PDFDoc::~PDFDoc() { -#ifndef DISABLE_OUTLINE - if (outline) { - delete outline; - } -#endif - if (catalog) { - delete catalog; - } - if (xref) { - delete xref; - } - if (str) { - delete str; - } - if (file) { - fclose(file); - } - if (fileName) { - delete fileName; - } -} - -// Check for a PDF header on this stream. Skip past some garbage -// if necessary. -void PDFDoc::checkHeader() { - char hdrBuf[headerSearchSize+1]; - char *p; - int i; - - pdfVersion = 0; - for (i = 0; i < headerSearchSize; ++i) { - hdrBuf[i] = str->getChar(); - } - hdrBuf[headerSearchSize] = '\0'; - for (i = 0; i < headerSearchSize - 5; ++i) { - if (!strncmp(&hdrBuf[i], "%PDF-", 5)) { - break; - } - } - if (i >= headerSearchSize - 5) { - error(-1, "May not be a PDF file (continuing anyway)"); - return; - } - str->moveStart(i); - if (!(p = strtok(&hdrBuf[i+5], " \t\n\r"))) { - error(-1, "May not be a PDF file (continuing anyway)"); - return; - } - pdfVersion = atof(p); - if (!(hdrBuf[i+5] >= '0' && hdrBuf[i+5] <= '9') || - pdfVersion > supportedPDFVersionNum + 0.0001) { - error(-1, "PDF version %s -- xpdf supports version %s" - " (continuing anyway)", p, supportedPDFVersionStr); - } -} - -GBool PDFDoc::checkEncryption(GString *ownerPassword, GString *userPassword) { - Object encrypt; - GBool encrypted; - SecurityHandler *secHdlr; - GBool ret; - - xref->getTrailerDict()->dictLookup("Encrypt", &encrypt); - if ((encrypted = encrypt.isDict())) { - if ((secHdlr = SecurityHandler::make(this, &encrypt))) { - if (secHdlr->checkEncryption(ownerPassword, userPassword)) { - // authorization succeeded - xref->setEncryption(secHdlr->getPermissionFlags(), - secHdlr->getOwnerPasswordOk(), - secHdlr->getFileKey(), - secHdlr->getFileKeyLength(), - secHdlr->getEncVersion(), - secHdlr->getEncAlgorithm()); - ret = gTrue; - } else { - // authorization failed - ret = gFalse; - } - delete secHdlr; - } else { - // couldn't find the matching security handler - ret = gFalse; - } - } else { - // document is not encrypted - ret = gTrue; - } - encrypt.free(); - return ret; -} - -void PDFDoc::displayPage(OutputDev *out, int page, - double hDPI, double vDPI, int rotate, - GBool useMediaBox, GBool crop, GBool printing, - GBool (*abortCheckCbk)(void *data), - void *abortCheckCbkData) { - if (globalParams->getPrintCommands()) { - printf("***** page %d *****\n", page); - } - catalog->getPage(page)->display(out, hDPI, vDPI, - rotate, useMediaBox, crop, printing, catalog, - abortCheckCbk, abortCheckCbkData); -} - -void PDFDoc::displayPages(OutputDev *out, int firstPage, int lastPage, - double hDPI, double vDPI, int rotate, - GBool useMediaBox, GBool crop, GBool printing, - GBool (*abortCheckCbk)(void *data), - void *abortCheckCbkData) { - int page; - - for (page = firstPage; page <= lastPage; ++page) { - displayPage(out, page, hDPI, vDPI, rotate, useMediaBox, crop, printing, - abortCheckCbk, abortCheckCbkData); - } -} - -void PDFDoc::displayPageSlice(OutputDev *out, int page, - double hDPI, double vDPI, int rotate, - GBool useMediaBox, GBool crop, GBool printing, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool (*abortCheckCbk)(void *data), - void *abortCheckCbkData) { - catalog->getPage(page)->displaySlice(out, hDPI, vDPI, - rotate, useMediaBox, crop, - sliceX, sliceY, sliceW, sliceH, - printing, catalog, - abortCheckCbk, abortCheckCbkData); -} - -Links *PDFDoc::getLinks(int page) { - return catalog->getPage(page)->getLinks(catalog); -} - -void PDFDoc::processLinks(OutputDev *out, int page) { - catalog->getPage(page)->processLinks(out, catalog); -} - -GBool PDFDoc::isLinearized() { - Parser *parser; - Object obj1, obj2, obj3, obj4, obj5; - GBool lin; - - lin = gFalse; - obj1.initNull(); - parser = new Parser(xref, - new Lexer(xref, - str->makeSubStream(str->getStart(), gFalse, 0, &obj1)), - gTrue); - parser->getObj(&obj1); - parser->getObj(&obj2); - parser->getObj(&obj3); - parser->getObj(&obj4); - if (obj1.isInt() && obj2.isInt() && obj3.isCmd("obj") && - obj4.isDict()) { - obj4.dictLookup("Linearized", &obj5); - if (obj5.isNum() && obj5.getNum() > 0) { - lin = gTrue; - } - obj5.free(); - } - obj4.free(); - obj3.free(); - obj2.free(); - obj1.free(); - delete parser; - return lin; -} - -GBool PDFDoc::saveAs(GString *name) { - FILE *f; - int c; - - if (!(f = fopen(name->getCString(), "wb"))) { - error(-1, "Couldn't open file '%s'", name->getCString()); - return gFalse; - } - str->reset(); - while ((c = str->getChar()) != EOF) { - fputc(c, f); - } - str->close(); - fclose(f); - return gTrue; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.h deleted file mode 100644 index 208b61efa..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDoc.h +++ /dev/null @@ -1,183 +0,0 @@ -//======================================================================== -// -// PDFDoc.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef PDFDOC_H -#define PDFDOC_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include "XRef.h" -#include "Catalog.h" -#include "Page.h" - -class GString; -class BaseStream; -class OutputDev; -class Links; -class LinkAction; -class LinkDest; -class Outline; - -//------------------------------------------------------------------------ -// PDFDoc -//------------------------------------------------------------------------ - -class PDFDoc { -public: - - PDFDoc(GString *fileNameA, GString *ownerPassword = NULL, - GString *userPassword = NULL, void *guiDataA = NULL); -#ifdef WIN32 - PDFDoc(wchar_t *fileNameA, int fileNameLen, GString *ownerPassword = NULL, - GString *userPassword = NULL, void *guiDataA = NULL); -#endif - PDFDoc(BaseStream *strA, GString *ownerPassword = NULL, - GString *userPassword = NULL, void *guiDataA = NULL); - ~PDFDoc(); - - // Was PDF document successfully opened? - GBool isOk() { return ok; } - - // Get the error code (if isOk() returns false). - int getErrorCode() { return errCode; } - - // Get file name. - GString *getFileName() { return fileName; } - - // Get the xref table. - XRef *getXRef() { return xref; } - - // Get catalog. - Catalog *getCatalog() { return catalog; } - - // Get base stream. - BaseStream *getBaseStream() { return str; } - - // Get page parameters. - double getPageMediaWidth(int page) - { return catalog->getPage(page)->getMediaWidth(); } - double getPageMediaHeight(int page) - { return catalog->getPage(page)->getMediaHeight(); } - double getPageCropWidth(int page) - { return catalog->getPage(page)->getCropWidth(); } - double getPageCropHeight(int page) - { return catalog->getPage(page)->getCropHeight(); } - int getPageRotate(int page) - { return catalog->getPage(page)->getRotate(); } - - // Get number of pages. - int getNumPages() { return catalog->getNumPages(); } - - // Return the contents of the metadata stream, or NULL if there is - // no metadata. - GString *readMetadata() { return catalog->readMetadata(); } - - // Return the structure tree root object. - Object *getStructTreeRoot() { return catalog->getStructTreeRoot(); } - - // Display a page. - void displayPage(OutputDev *out, int page, - double hDPI, double vDPI, int rotate, - GBool useMediaBox, GBool crop, GBool printing, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL); - - // Display a range of pages. - void displayPages(OutputDev *out, int firstPage, int lastPage, - double hDPI, double vDPI, int rotate, - GBool useMediaBox, GBool crop, GBool printing, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL); - - // Display part of a page. - void displayPageSlice(OutputDev *out, int page, - double hDPI, double vDPI, int rotate, - GBool useMediaBox, GBool crop, GBool printing, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL); - - // Find a page, given its object ID. Returns page number, or 0 if - // not found. - int findPage(int num, int gen) { return catalog->findPage(num, gen); } - - // Returns the links for the current page, transferring ownership to - // the caller. - Links *getLinks(int page); - - // Find a named destination. Returns the link destination, or - // NULL if is not a destination. - LinkDest *findDest(GString *name) - { return catalog->findDest(name); } - - // Process the links for a page. - void processLinks(OutputDev *out, int page); - -#ifndef DISABLE_OUTLINE - // Return the outline object. - Outline *getOutline() { return outline; } -#endif - - // Is the file encrypted? - GBool isEncrypted() { return xref->isEncrypted(); } - - // Check various permissions. - GBool okToPrint(GBool ignoreOwnerPW = gFalse) - { return xref->okToPrint(ignoreOwnerPW); } - GBool okToChange(GBool ignoreOwnerPW = gFalse) - { return xref->okToChange(ignoreOwnerPW); } - GBool okToCopy(GBool ignoreOwnerPW = gFalse) - { return xref->okToCopy(ignoreOwnerPW); } - GBool okToAddNotes(GBool ignoreOwnerPW = gFalse) - { return xref->okToAddNotes(ignoreOwnerPW); } - - // Is this document linearized? - GBool isLinearized(); - - // Return the document's Info dictionary (if any). - Object *getDocInfo(Object *obj) { return xref->getDocInfo(obj); } - Object *getDocInfoNF(Object *obj) { return xref->getDocInfoNF(obj); } - - // Return the PDF version specified by the file. - double getPDFVersion() { return pdfVersion; } - - // Save this file with another name. - GBool saveAs(GString *name); - - // Return a pointer to the GUI (XPDFCore or WinPDFCore object). - void *getGUIData() { return guiData; } - - -private: - - GBool setup(GString *ownerPassword, GString *userPassword); - void checkHeader(); - GBool checkEncryption(GString *ownerPassword, GString *userPassword); - - GString *fileName; - FILE *file; - BaseStream *str; - void *guiData; - double pdfVersion; - XRef *xref; - Catalog *catalog; -#ifndef DISABLE_OUTLINE - Outline *outline; -#endif - - - GBool ok; - int errCode; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.cc deleted file mode 100644 index 89dc38283..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.cc +++ /dev/null @@ -1,44 +0,0 @@ -//======================================================================== -// -// PDFDocEncoding.h -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include "PDFDocEncoding.h" - -Unicode pdfDocEncoding[256] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 00 - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 10 - 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, // 20 - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, // 30 - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, // 40 - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, // 50 - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, // 60 - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, // 70 - 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, - 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, // 80 - 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, - 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, // 90 - 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, - 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, // a0 - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, // b0 - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, // c0 - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, // d0 - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, // e0 - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, // f0 - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff -}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.h deleted file mode 100644 index 3259d3e10..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PDFDocEncoding.h +++ /dev/null @@ -1,16 +0,0 @@ -//======================================================================== -// -// PDFDocEncoding.h -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef PDFDOCENCODING_H -#define PDFDOCENCODING_H - -#include "CharTypes.h" - -extern Unicode pdfDocEncoding[256]; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.cc deleted file mode 100644 index 0ad376185..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.cc +++ /dev/null @@ -1,135 +0,0 @@ -//======================================================================== -// -// PSTokenizer.cc -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "PSTokenizer.h" - -//------------------------------------------------------------------------ - -// A '1' in this array means the character is white space. A '1' or -// '2' means the character ends a name or command. -static char specialChars[256] = { - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x - 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx -}; - -//------------------------------------------------------------------------ - -PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) { - getCharFunc = getCharFuncA; - data = dataA; - charBuf = -1; -} - -PSTokenizer::~PSTokenizer() { -} - -GBool PSTokenizer::getToken(char *buf, int size, int *length) { - GBool comment, backslash; - int c; - int i; - - // skip whitespace and comments - comment = gFalse; - while (1) { - if ((c = getChar()) == EOF) { - buf[0] = '\0'; - *length = 0; - return gFalse; - } - if (comment) { - if (c == '\x0a' || c == '\x0d') { - comment = gFalse; - } - } else if (c == '%') { - comment = gTrue; - } else if (specialChars[c] != 1) { - break; - } - } - - // read a token - i = 0; - buf[i++] = c; - if (c == '(') { - backslash = gFalse; - while ((c = lookChar()) != EOF) { - if (i < size - 1) { - buf[i++] = c; - } - getChar(); - if (c == '\\') { - backslash = gTrue; - } else if (!backslash && c == ')') { - break; - } else { - backslash = gFalse; - } - } - } else if (c == '<') { - while ((c = lookChar()) != EOF) { - getChar(); - if (i < size - 1 && specialChars[c] != 1) { - buf[i++] = c; - } - if (c == '>') { - break; - } - } - } else if (c != '[' && c != ']') { - while ((c = lookChar()) != EOF && !specialChars[c]) { - getChar(); - if (i < size - 1) { - buf[i++] = c; - } - } - } - buf[i] = '\0'; - *length = i; - - return gTrue; -} - -int PSTokenizer::lookChar() { - if (charBuf < 0) { - charBuf = (*getCharFunc)(data); - } - return charBuf; -} - -int PSTokenizer::getChar() { - int c; - - if (charBuf < 0) { - charBuf = (*getCharFunc)(data); - } - c = charBuf; - charBuf = -1; - return c; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.h deleted file mode 100644 index 4d5ee97f4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/PSTokenizer.h +++ /dev/null @@ -1,41 +0,0 @@ -//======================================================================== -// -// PSTokenizer.h -// -// Copyright 2002-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef PSTOKENIZER_H -#define PSTOKENIZER_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -//------------------------------------------------------------------------ - -class PSTokenizer { -public: - - PSTokenizer(int (*getCharFuncA)(void *), void *dataA); - ~PSTokenizer(); - - // Get the next PostScript token. Returns false at end-of-stream. - GBool getToken(char *buf, int size, int *length); - -private: - - int lookChar(); - int getChar(); - - int (*getCharFunc)(void *); - void *data; - int charBuf; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.cc deleted file mode 100644 index c93066548..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.cc +++ /dev/null @@ -1,441 +0,0 @@ -//======================================================================== -// -// Page.cc -// -// Copyright 1996-2007 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "GlobalParams.h" -#include "Object.h" -#include "Array.h" -#include "Dict.h" -#include "XRef.h" -#include "Link.h" -#include "OutputDev.h" -#ifndef PDF_PARSER_ONLY -#include "Gfx.h" -#include "GfxState.h" -#include "Annot.h" -#endif -#include "Error.h" -#include "Catalog.h" -#include "Page.h" - -//------------------------------------------------------------------------ -// PDFRectangle -//------------------------------------------------------------------------ - -void PDFRectangle::clipTo(PDFRectangle *rect) { - if (x1 < rect->x1) { - x1 = rect->x1; - } else if (x1 > rect->x2) { - x1 = rect->x2; - } - if (x2 < rect->x1) { - x2 = rect->x1; - } else if (x2 > rect->x2) { - x2 = rect->x2; - } - if (y1 < rect->y1) { - y1 = rect->y1; - } else if (y1 > rect->y2) { - y1 = rect->y2; - } - if (y2 < rect->y1) { - y2 = rect->y1; - } else if (y2 > rect->y2) { - y2 = rect->y2; - } -} - -//------------------------------------------------------------------------ -// PageAttrs -//------------------------------------------------------------------------ - -PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) { - Object obj1; - - // get old/default values - if (attrs) { - mediaBox = attrs->mediaBox; - cropBox = attrs->cropBox; - haveCropBox = attrs->haveCropBox; - rotate = attrs->rotate; - attrs->resources.copy(&resources); - } else { - // set default MediaBox to 8.5" x 11" -- this shouldn't be necessary - // but some (non-compliant) PDF files don't specify a MediaBox - mediaBox.x1 = 0; - mediaBox.y1 = 0; - mediaBox.x2 = 612; - mediaBox.y2 = 792; - cropBox.x1 = cropBox.y1 = cropBox.x2 = cropBox.y2 = 0; - haveCropBox = gFalse; - rotate = 0; - resources.initNull(); - } - - // media box - readBox(dict, "MediaBox", &mediaBox); - - // crop box - if (readBox(dict, "CropBox", &cropBox)) { - haveCropBox = gTrue; - } - if (!haveCropBox) { - cropBox = mediaBox; - } - - // other boxes - bleedBox = cropBox; - readBox(dict, "BleedBox", &bleedBox); - trimBox = cropBox; - readBox(dict, "TrimBox", &trimBox); - artBox = cropBox; - readBox(dict, "ArtBox", &artBox); - - // clip all other boxes to the media box - cropBox.clipTo(&mediaBox); - bleedBox.clipTo(&mediaBox); - trimBox.clipTo(&mediaBox); - artBox.clipTo(&mediaBox); - - // rotate - dict->lookup("Rotate", &obj1); - if (obj1.isInt()) { - rotate = obj1.getInt(); - } - obj1.free(); - while (rotate < 0) { - rotate += 360; - } - while (rotate >= 360) { - rotate -= 360; - } - - // misc attributes - dict->lookup("LastModified", &lastModified); - dict->lookup("BoxColorInfo", &boxColorInfo); - dict->lookup("Group", &group); - dict->lookup("Metadata", &metadata); - dict->lookup("PieceInfo", &pieceInfo); - dict->lookup("SeparationInfo", &separationInfo); - - // resource dictionary - dict->lookup("Resources", &obj1); - if (obj1.isDict()) { - resources.free(); - obj1.copy(&resources); - } - obj1.free(); -} - -PageAttrs::~PageAttrs() { - lastModified.free(); - boxColorInfo.free(); - group.free(); - metadata.free(); - pieceInfo.free(); - separationInfo.free(); - resources.free(); -} - -GBool PageAttrs::readBox(Dict *dict, char *key, PDFRectangle *box) { - PDFRectangle tmp; - double t; - Object obj1, obj2; - GBool ok; - - dict->lookup(key, &obj1); - if (obj1.isArray() && obj1.arrayGetLength() == 4) { - ok = gTrue; - obj1.arrayGet(0, &obj2); - if (obj2.isNum()) { - tmp.x1 = obj2.getNum(); - } else { - ok = gFalse; - } - obj2.free(); - obj1.arrayGet(1, &obj2); - if (obj2.isNum()) { - tmp.y1 = obj2.getNum(); - } else { - ok = gFalse; - } - obj2.free(); - obj1.arrayGet(2, &obj2); - if (obj2.isNum()) { - tmp.x2 = obj2.getNum(); - } else { - ok = gFalse; - } - obj2.free(); - obj1.arrayGet(3, &obj2); - if (obj2.isNum()) { - tmp.y2 = obj2.getNum(); - } else { - ok = gFalse; - } - obj2.free(); - if (ok) { - if (tmp.x1 > tmp.x2) { - t = tmp.x1; tmp.x1 = tmp.x2; tmp.x2 = t; - } - if (tmp.y1 > tmp.y2) { - t = tmp.y1; tmp.y1 = tmp.y2; tmp.y2 = t; - } - *box = tmp; - } - } else { - ok = gFalse; - } - obj1.free(); - return ok; -} - -//------------------------------------------------------------------------ -// Page -//------------------------------------------------------------------------ - -Page::Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA) { - ok = gTrue; - xref = xrefA; - num = numA; - - // get attributes - attrs = attrsA; - - // annotations - pageDict->lookupNF("Annots", &annots); - if (!(annots.isRef() || annots.isArray() || annots.isNull())) { - error(-1, "Page annotations object (page %d) is wrong type (%s)", - num, annots.getTypeName()); - annots.free(); - goto err2; - } - - // contents - pageDict->lookupNF("Contents", &contents); - if (!(contents.isRef() || contents.isArray() || - contents.isNull())) { - error(-1, "Page contents object (page %d) is wrong type (%s)", - num, contents.getTypeName()); - contents.free(); - goto err1; - } - - return; - - err2: - annots.initNull(); - err1: - contents.initNull(); - ok = gFalse; -} - -Page::~Page() { - delete attrs; - annots.free(); - contents.free(); -} - -Links *Page::getLinks(Catalog *catalog) { - Links *links; - Object obj; - - links = new Links(getAnnots(&obj), catalog->getBaseURI()); - obj.free(); - return links; -} - -void Page::display(OutputDev *out, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data), - void *abortCheckCbkData) { - displaySlice(out, hDPI, vDPI, rotate, useMediaBox, crop, - -1, -1, -1, -1, printing, catalog, - abortCheckCbk, abortCheckCbkData); -} - -void Page::displaySlice(OutputDev *out, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data), - void *abortCheckCbkData) { -#ifndef PDF_PARSER_ONLY - PDFRectangle *mediaBox, *cropBox; - PDFRectangle box; - Gfx *gfx; - Object obj; - Annots *annotList; - Dict *acroForm; - int i; - - if (!out->checkPageSlice(this, hDPI, vDPI, rotate, useMediaBox, crop, - sliceX, sliceY, sliceW, sliceH, - printing, catalog, - abortCheckCbk, abortCheckCbkData)) { - return; - } - - rotate += getRotate(); - if (rotate >= 360) { - rotate -= 360; - } else if (rotate < 0) { - rotate += 360; - } - - makeBox(hDPI, vDPI, rotate, useMediaBox, out->upsideDown(), - sliceX, sliceY, sliceW, sliceH, &box, &crop); - cropBox = getCropBox(); - - if (globalParams->getPrintCommands()) { - mediaBox = getMediaBox(); - printf("***** MediaBox = ll:%g,%g ur:%g,%g\n", - mediaBox->x1, mediaBox->y1, mediaBox->x2, mediaBox->y2); - printf("***** CropBox = ll:%g,%g ur:%g,%g\n", - cropBox->x1, cropBox->y1, cropBox->x2, cropBox->y2); - printf("***** Rotate = %d\n", attrs->getRotate()); - } - - gfx = new Gfx(xref, out, num, attrs->getResourceDict(), - hDPI, vDPI, &box, crop ? cropBox : (PDFRectangle *)NULL, - rotate, abortCheckCbk, abortCheckCbkData); - contents.fetch(xref, &obj); - if (!obj.isNull()) { - gfx->saveState(); - gfx->display(&obj); - gfx->restoreState(); - } - obj.free(); - - // draw annotations - annotList = new Annots(xref, catalog, getAnnots(&obj)); - obj.free(); - acroForm = catalog->getAcroForm()->isDict() ? - catalog->getAcroForm()->getDict() : NULL; - if (acroForm) { - if (acroForm->lookup("NeedAppearances", &obj)) { - if (obj.isBool() && obj.getBool()) { - annotList->generateAppearances(acroForm); - } - } - obj.free(); - } - if (annotList->getNumAnnots() > 0) { - if (globalParams->getPrintCommands()) { - printf("***** Annotations\n"); - } - for (i = 0; i < annotList->getNumAnnots(); ++i) { - annotList->getAnnot(i)->draw(gfx, printing); - } - out->dump(); - } - delete annotList; - - delete gfx; -#endif -} - -void Page::makeBox(double hDPI, double vDPI, int rotate, - GBool useMediaBox, GBool upsideDown, - double sliceX, double sliceY, double sliceW, double sliceH, - PDFRectangle *box, GBool *crop) { - PDFRectangle *mediaBox, *cropBox, *baseBox; - double kx, ky; - - mediaBox = getMediaBox(); - cropBox = getCropBox(); - if (sliceW >= 0 && sliceH >= 0) { - baseBox = useMediaBox ? mediaBox : cropBox; - kx = 72.0 / hDPI; - ky = 72.0 / vDPI; - if (rotate == 90) { - if (upsideDown) { - box->x1 = baseBox->x1 + ky * sliceY; - box->x2 = baseBox->x1 + ky * (sliceY + sliceH); - } else { - box->x1 = baseBox->x2 - ky * (sliceY + sliceH); - box->x2 = baseBox->x2 - ky * sliceY; - } - box->y1 = baseBox->y1 + kx * sliceX; - box->y2 = baseBox->y1 + kx * (sliceX + sliceW); - } else if (rotate == 180) { - box->x1 = baseBox->x2 - kx * (sliceX + sliceW); - box->x2 = baseBox->x2 - kx * sliceX; - if (upsideDown) { - box->y1 = baseBox->y1 + ky * sliceY; - box->y2 = baseBox->y1 + ky * (sliceY + sliceH); - } else { - box->y1 = baseBox->y2 - ky * (sliceY + sliceH); - box->y2 = baseBox->y2 - ky * sliceY; - } - } else if (rotate == 270) { - if (upsideDown) { - box->x1 = baseBox->x2 - ky * (sliceY + sliceH); - box->x2 = baseBox->x2 - ky * sliceY; - } else { - box->x1 = baseBox->x1 + ky * sliceY; - box->x2 = baseBox->x1 + ky * (sliceY + sliceH); - } - box->y1 = baseBox->y2 - kx * (sliceX + sliceW); - box->y2 = baseBox->y2 - kx * sliceX; - } else { - box->x1 = baseBox->x1 + kx * sliceX; - box->x2 = baseBox->x1 + kx * (sliceX + sliceW); - if (upsideDown) { - box->y1 = baseBox->y2 - ky * (sliceY + sliceH); - box->y2 = baseBox->y2 - ky * sliceY; - } else { - box->y1 = baseBox->y1 + ky * sliceY; - box->y2 = baseBox->y1 + ky * (sliceY + sliceH); - } - } - } else if (useMediaBox) { - *box = *mediaBox; - } else { - *box = *cropBox; - *crop = gFalse; - } -} - -void Page::processLinks(OutputDev *out, Catalog *catalog) { - Links *links; - int i; - - links = getLinks(catalog); - for (i = 0; i < links->getNumLinks(); ++i) { - out->processLink(links->getLink(i), catalog); - } - delete links; -} - -void Page::getDefaultCTM(double *ctm, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool upsideDown) { - GfxState *state; - int i; - - rotate += getRotate(); - if (rotate >= 360) { - rotate -= 360; - } else if (rotate < 0) { - rotate += 360; - } - state = new GfxState(hDPI, vDPI, - useMediaBox ? getMediaBox() : getCropBox(), - rotate, upsideDown); - for (i = 0; i < 6; ++i) { - ctm[i] = state->getCTM()[i]; - } - delete state; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.h deleted file mode 100644 index 2b011756e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Page.h +++ /dev/null @@ -1,187 +0,0 @@ -//======================================================================== -// -// Page.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef PAGE_H -#define PAGE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "Object.h" - -class Dict; -class XRef; -class OutputDev; -class Links; -class Catalog; - -//------------------------------------------------------------------------ - -class PDFRectangle { -public: - double x1, y1, x2, y2; - - PDFRectangle() { x1 = y1 = x2 = y2 = 0; } - PDFRectangle(double x1A, double y1A, double x2A, double y2A) - { x1 = x1A; y1 = y1A; x2 = x2A; y2 = y2A; } - GBool isValid() { return x1 != 0 || y1 != 0 || x2 != 0 || y2 != 0; } - void clipTo(PDFRectangle *rect); -}; - -//------------------------------------------------------------------------ -// PageAttrs -//------------------------------------------------------------------------ - -class PageAttrs { -public: - - // Construct a new PageAttrs object by merging a dictionary - // (of type Pages or Page) into another PageAttrs object. If - // is NULL, uses defaults. - PageAttrs(PageAttrs *attrs, Dict *dict); - - // Destructor. - ~PageAttrs(); - - // Accessors. - PDFRectangle *getMediaBox() { return &mediaBox; } - PDFRectangle *getCropBox() { return &cropBox; } - GBool isCropped() { return haveCropBox; } - PDFRectangle *getBleedBox() { return &bleedBox; } - PDFRectangle *getTrimBox() { return &trimBox; } - PDFRectangle *getArtBox() { return &artBox; } - int getRotate() { return rotate; } - GString *getLastModified() - { return lastModified.isString() - ? lastModified.getString() : (GString *)NULL; } - Dict *getBoxColorInfo() - { return boxColorInfo.isDict() ? boxColorInfo.getDict() : (Dict *)NULL; } - Dict *getGroup() - { return group.isDict() ? group.getDict() : (Dict *)NULL; } - Stream *getMetadata() - { return metadata.isStream() ? metadata.getStream() : (Stream *)NULL; } - Dict *getPieceInfo() - { return pieceInfo.isDict() ? pieceInfo.getDict() : (Dict *)NULL; } - Dict *getSeparationInfo() - { return separationInfo.isDict() - ? separationInfo.getDict() : (Dict *)NULL; } - Dict *getResourceDict() - { return resources.isDict() ? resources.getDict() : (Dict *)NULL; } - -private: - - GBool readBox(Dict *dict, char *key, PDFRectangle *box); - - PDFRectangle mediaBox; - PDFRectangle cropBox; - GBool haveCropBox; - PDFRectangle bleedBox; - PDFRectangle trimBox; - PDFRectangle artBox; - int rotate; - Object lastModified; - Object boxColorInfo; - Object group; - Object metadata; - Object pieceInfo; - Object separationInfo; - Object resources; -}; - -//------------------------------------------------------------------------ -// Page -//------------------------------------------------------------------------ - -class Page { -public: - - // Constructor. - Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA); - - // Destructor. - ~Page(); - - // Is page valid? - GBool isOk() { return ok; } - - // Get page parameters. - int getNum() { return num; } - PDFRectangle *getMediaBox() { return attrs->getMediaBox(); } - PDFRectangle *getCropBox() { return attrs->getCropBox(); } - GBool isCropped() { return attrs->isCropped(); } - double getMediaWidth() - { return attrs->getMediaBox()->x2 - attrs->getMediaBox()->x1; } - double getMediaHeight() - { return attrs->getMediaBox()->y2 - attrs->getMediaBox()->y1; } - double getCropWidth() - { return attrs->getCropBox()->x2 - attrs->getCropBox()->x1; } - double getCropHeight() - { return attrs->getCropBox()->y2 - attrs->getCropBox()->y1; } - PDFRectangle *getBleedBox() { return attrs->getBleedBox(); } - PDFRectangle *getTrimBox() { return attrs->getTrimBox(); } - PDFRectangle *getArtBox() { return attrs->getArtBox(); } - int getRotate() { return attrs->getRotate(); } - GString *getLastModified() { return attrs->getLastModified(); } - Dict *getBoxColorInfo() { return attrs->getBoxColorInfo(); } - Dict *getGroup() { return attrs->getGroup(); } - Stream *getMetadata() { return attrs->getMetadata(); } - Dict *getPieceInfo() { return attrs->getPieceInfo(); } - Dict *getSeparationInfo() { return attrs->getSeparationInfo(); } - - // Get resource dictionary. - Dict *getResourceDict() { return attrs->getResourceDict(); } - - // Get annotations array. - Object *getAnnots(Object *obj) { return annots.fetch(xref, obj); } - - // Return a list of links. - Links *getLinks(Catalog *catalog); - - // Get contents. - Object *getContents(Object *obj) { return contents.fetch(xref, obj); } - - // Display a page. - void display(OutputDev *out, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL); - - // Display part of a page. - void displaySlice(OutputDev *out, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool crop, - int sliceX, int sliceY, int sliceW, int sliceH, - GBool printing, Catalog *catalog, - GBool (*abortCheckCbk)(void *data) = NULL, - void *abortCheckCbkData = NULL); - - void makeBox(double hDPI, double vDPI, int rotate, - GBool useMediaBox, GBool upsideDown, - double sliceX, double sliceY, double sliceW, double sliceH, - PDFRectangle *box, GBool *crop); - - void processLinks(OutputDev *out, Catalog *catalog); - - // Get the page's default CTM. - void getDefaultCTM(double *ctm, double hDPI, double vDPI, - int rotate, GBool useMediaBox, GBool upsideDown); - -private: - - XRef *xref; // the xref table for this PDF file - int num; // page number - PageAttrs *attrs; // page attributes - Object annots; // annotations array - Object contents; // page contents - GBool ok; // true if page is valid -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.cc deleted file mode 100644 index c1fc71521..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.cc +++ /dev/null @@ -1,227 +0,0 @@ -//======================================================================== -// -// Parser.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "Object.h" -#include "Array.h" -#include "Dict.h" -#include "Decrypt.h" -#include "Parser.h" -#include "XRef.h" -#include "Error.h" - -Parser::Parser(XRef *xrefA, Lexer *lexerA, GBool allowStreamsA) { - xref = xrefA; - lexer = lexerA; - inlineImg = 0; - allowStreams = allowStreamsA; - lexer->getObj(&buf1); - lexer->getObj(&buf2); -} - -Parser::~Parser() { - buf1.free(); - buf2.free(); - delete lexer; -} - -Object *Parser::getObj(Object *obj, Guchar *fileKey, - CryptAlgorithm encAlgorithm, int keyLength, - int objNum, int objGen) { - char *key; - Stream *str; - Object obj2; - int num; - DecryptStream *decrypt; - GString *s, *s2; - int c; - - // refill buffer after inline image data - if (inlineImg == 2) { - buf1.free(); - buf2.free(); - lexer->getObj(&buf1); - lexer->getObj(&buf2); - inlineImg = 0; - } - - // array - if (buf1.isCmd("[")) { - shift(); - obj->initArray(xref); - while (!buf1.isCmd("]") && !buf1.isEOF()) - obj->arrayAdd(getObj(&obj2, fileKey, encAlgorithm, keyLength, - objNum, objGen)); - if (buf1.isEOF()) - error(getPos(), "End of file inside array"); - shift(); - - // dictionary or stream - } else if (buf1.isCmd("<<")) { - shift(); - obj->initDict(xref); - while (!buf1.isCmd(">>") && !buf1.isEOF()) { - if (!buf1.isName()) { - error(getPos(), "Dictionary key must be a name object"); - shift(); - } else { - key = copyString(buf1.getName()); - shift(); - if (buf1.isEOF() || buf1.isError()) { - gfree(key); - break; - } - obj->dictAdd(key, getObj(&obj2, fileKey, encAlgorithm, keyLength, - objNum, objGen)); - } - } - if (buf1.isEOF()) - error(getPos(), "End of file inside dictionary"); - // stream objects are not allowed inside content streams or - // object streams - if (allowStreams && buf2.isCmd("stream")) { - if ((str = makeStream(obj, fileKey, encAlgorithm, keyLength, - objNum, objGen))) { - obj->initStream(str); - } else { - obj->free(); - obj->initError(); - } - } else { - shift(); - } - - // indirect reference or integer - } else if (buf1.isInt()) { - num = buf1.getInt(); - shift(); - if (buf1.isInt() && buf2.isCmd("R")) { - obj->initRef(num, buf1.getInt()); - shift(); - shift(); - } else { - obj->initInt(num); - } - - // string - } else if (buf1.isString() && fileKey) { - s = buf1.getString(); - s2 = new GString(); - obj2.initNull(); - decrypt = new DecryptStream(new MemStream(s->getCString(), 0, - s->getLength(), &obj2), - fileKey, encAlgorithm, keyLength, - objNum, objGen); - decrypt->reset(); - while ((c = decrypt->getChar()) != EOF) { - s2->append((char)c); - } - delete decrypt; - obj->initString(s2); - shift(); - - // simple object - } else { - buf1.copy(obj); - shift(); - } - - return obj; -} - -Stream *Parser::makeStream(Object *dict, Guchar *fileKey, - CryptAlgorithm encAlgorithm, int keyLength, - int objNum, int objGen) { - Object obj; - BaseStream *baseStr; - Stream *str; - Guint pos, endPos, length; - - // get stream start position - lexer->skipToNextLine(); - pos = lexer->getPos(); - - // get length - dict->dictLookup("Length", &obj); - if (obj.isInt()) { - length = (Guint)obj.getInt(); - obj.free(); - } else { - error(getPos(), "Bad 'Length' attribute in stream"); - obj.free(); - return NULL; - } - - // check for length in damaged file - if (xref && xref->getStreamEnd(pos, &endPos)) { - length = endPos - pos; - } - - // in badly damaged PDF files, we can run off the end of the input - // stream immediately after the "stream" token - if (!lexer->getStream()) { - return NULL; - } - baseStr = lexer->getStream()->getBaseStream(); - - // skip over stream data - lexer->setPos(pos + length); - - // refill token buffers and check for 'endstream' - shift(); // kill '>>' - shift(); // kill 'stream' - if (buf1.isCmd("endstream")) { - shift(); - } else { - error(getPos(), "Missing 'endstream'"); - // kludge for broken PDF files: just add 5k to the length, and - // hope its enough - length += 5000; - } - - // make base stream - str = baseStr->makeSubStream(pos, gTrue, length, dict); - - // handle decryption - if (fileKey) { - str = new DecryptStream(str, fileKey, encAlgorithm, keyLength, - objNum, objGen); - } - - // get filters - str = str->addFilters(dict); - - return str; -} - -void Parser::shift() { - if (inlineImg > 0) { - if (inlineImg < 2) { - ++inlineImg; - } else { - // in a damaged content stream, if 'ID' shows up in the middle - // of a dictionary, we need to reset - inlineImg = 0; - } - } else if (buf2.isCmd("ID")) { - lexer->skipChar(); // skip char after 'ID' command - inlineImg = 1; - } - buf1.free(); - buf1 = buf2; - if (inlineImg > 0) // don't buffer inline image data - buf2.initNull(); - else - lexer->getObj(&buf2); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.h deleted file mode 100644 index a109558b0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Parser.h +++ /dev/null @@ -1,59 +0,0 @@ -//======================================================================== -// -// Parser.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef PARSER_H -#define PARSER_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "Lexer.h" - -//------------------------------------------------------------------------ -// Parser -//------------------------------------------------------------------------ - -class Parser { -public: - - // Constructor. - Parser(XRef *xrefA, Lexer *lexerA, GBool allowStreamsA); - - // Destructor. - ~Parser(); - - // Get the next object from the input stream. - Object *getObj(Object *obj, Guchar *fileKey = NULL, - CryptAlgorithm encAlgorithm = cryptRC4, int keyLength = 0, - int objNum = 0, int objGen = 0); - - // Get stream. - Stream *getStream() { return lexer->getStream(); } - - // Get current position in file. - int getPos() { return lexer->getPos(); } - -private: - - XRef *xref; // the xref table for this PDF file - Lexer *lexer; // input stream - GBool allowStreams; // parse stream objects? - Object buf1, buf2; // next two tokens - int inlineImg; // set when inline image data is encountered - - Stream *makeStream(Object *dict, Guchar *fileKey, - CryptAlgorithm encAlgorithm, int keyLength, - int objNum, int objGen); - void shift(); -}; - -#endif - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.cc deleted file mode 100644 index ea0f9341d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.cc +++ /dev/null @@ -1,390 +0,0 @@ -//======================================================================== -// -// SecurityHandler.cc -// -// Copyright 2004 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "GString.h" -#include "PDFDoc.h" -#include "Decrypt.h" -#include "Error.h" -#include "GlobalParams.h" -#if HAVE_XPDFCORE -# include "XPDFCore.h" -#elif HAVE_WINPDFCORE -# include "WinPDFCore.h" -#endif -#ifdef ENABLE_PLUGINS -# include "XpdfPluginAPI.h" -#endif -#include "SecurityHandler.h" - -//------------------------------------------------------------------------ -// SecurityHandler -//------------------------------------------------------------------------ - -SecurityHandler *SecurityHandler::make(PDFDoc *docA, Object *encryptDictA) { - Object filterObj; - SecurityHandler *secHdlr; -#ifdef ENABLE_PLUGINS - XpdfSecurityHandler *xsh; -#endif - - encryptDictA->dictLookup("Filter", &filterObj); - if (filterObj.isName("Standard")) { - secHdlr = new StandardSecurityHandler(docA, encryptDictA); - } else if (filterObj.isName()) { -#ifdef ENABLE_PLUGINS - if ((xsh = globalParams->getSecurityHandler(filterObj.getName()))) { - secHdlr = new ExternalSecurityHandler(docA, encryptDictA, xsh); - } else { -#endif - error(-1, "Couldn't find the '%s' security handler", - filterObj.getName()); - secHdlr = NULL; -#ifdef ENABLE_PLUGINS - } -#endif - } else { - error(-1, "Missing or invalid 'Filter' entry in encryption dictionary"); - secHdlr = NULL; - } - filterObj.free(); - return secHdlr; -} - -SecurityHandler::SecurityHandler(PDFDoc *docA) { - doc = docA; -} - -SecurityHandler::~SecurityHandler() { -} - -GBool SecurityHandler::checkEncryption(GString *ownerPassword, - GString *userPassword) { - void *authData; - GBool ok; - int i; - - if (ownerPassword || userPassword) { - authData = makeAuthData(ownerPassword, userPassword); - } else { - authData = NULL; - } - ok = authorize(authData); - if (authData) { - freeAuthData(authData); - } - for (i = 0; !ok && i < 3; ++i) { - if (!(authData = getAuthData())) { - break; - } - ok = authorize(authData); - if (authData) { - freeAuthData(authData); - } - } - if (!ok) { - error(-1, "Incorrect password"); - } - return ok; -} - -//------------------------------------------------------------------------ -// StandardSecurityHandler -//------------------------------------------------------------------------ - -class StandardAuthData { -public: - - StandardAuthData(GString *ownerPasswordA, GString *userPasswordA) { - ownerPassword = ownerPasswordA; - userPassword = userPasswordA; - } - - ~StandardAuthData() { - if (ownerPassword) { - delete ownerPassword; - } - if (userPassword) { - delete userPassword; - } - } - - GString *ownerPassword; - GString *userPassword; -}; - -StandardSecurityHandler::StandardSecurityHandler(PDFDoc *docA, - Object *encryptDictA): - SecurityHandler(docA) -{ - Object versionObj, revisionObj, lengthObj; - Object ownerKeyObj, userKeyObj, permObj, fileIDObj; - Object fileIDObj1; - Object cryptFiltersObj, streamFilterObj, stringFilterObj; - Object cryptFilterObj, cfmObj, cfLengthObj; - Object encryptMetadataObj; - - ok = gFalse; - fileID = NULL; - ownerKey = NULL; - userKey = NULL; - - encryptDictA->dictLookup("V", &versionObj); - encryptDictA->dictLookup("R", &revisionObj); - encryptDictA->dictLookup("Length", &lengthObj); - encryptDictA->dictLookup("O", &ownerKeyObj); - encryptDictA->dictLookup("U", &userKeyObj); - encryptDictA->dictLookup("P", &permObj); - doc->getXRef()->getTrailerDict()->dictLookup("ID", &fileIDObj); - if (versionObj.isInt() && - revisionObj.isInt() && - ownerKeyObj.isString() && ownerKeyObj.getString()->getLength() == 32 && - userKeyObj.isString() && userKeyObj.getString()->getLength() == 32 && - permObj.isInt()) { - encVersion = versionObj.getInt(); - encRevision = revisionObj.getInt(); - encAlgorithm = cryptRC4; - // revision 2 forces a 40-bit key - some buggy PDF generators - // set the Length value incorrectly - if (encRevision == 2 || !lengthObj.isInt()) { - fileKeyLength = 5; - } else { - fileKeyLength = lengthObj.getInt() / 8; - } - encryptMetadata = gTrue; - //~ this currently only handles a subset of crypt filter functionality - if (encVersion == 4 && encRevision == 4) { - encryptDictA->dictLookup("CF", &cryptFiltersObj); - encryptDictA->dictLookup("StmF", &streamFilterObj); - encryptDictA->dictLookup("StrF", &stringFilterObj); - if (cryptFiltersObj.isDict() && - streamFilterObj.isName() && - stringFilterObj.isName() && - !strcmp(streamFilterObj.getName(), stringFilterObj.getName())) { - if (cryptFiltersObj.dictLookup(streamFilterObj.getName(), - &cryptFilterObj)->isDict()) { - cryptFilterObj.dictLookup("CFM", &cfmObj); - if (cfmObj.isName("V2")) { - encVersion = 2; - encRevision = 3; - if (cryptFilterObj.dictLookup("Length", &cfLengthObj)->isInt()) { - //~ according to the spec, this should be cfLengthObj / 8 - fileKeyLength = cfLengthObj.getInt(); - } - cfLengthObj.free(); - } else if (cfmObj.isName("AESV2")) { - encVersion = 2; - encRevision = 3; - encAlgorithm = cryptAES; - if (cryptFilterObj.dictLookup("Length", &cfLengthObj)->isInt()) { - //~ according to the spec, this should be cfLengthObj / 8 - fileKeyLength = cfLengthObj.getInt(); - } - cfLengthObj.free(); - } - cfmObj.free(); - } - cryptFilterObj.free(); - } - stringFilterObj.free(); - streamFilterObj.free(); - cryptFiltersObj.free(); - if (encryptDictA->dictLookup("EncryptMetadata", - &encryptMetadataObj)->isBool()) { - encryptMetadata = encryptMetadataObj.getBool(); - } - encryptMetadataObj.free(); - } - permFlags = permObj.getInt(); - ownerKey = ownerKeyObj.getString()->copy(); - userKey = userKeyObj.getString()->copy(); - if (encVersion >= 1 && encVersion <= 2 && - encRevision >= 2 && encRevision <= 3) { - if (fileIDObj.isArray()) { - if (fileIDObj.arrayGet(0, &fileIDObj1)->isString()) { - fileID = fileIDObj1.getString()->copy(); - } else { - fileID = new GString(); - } - fileIDObj1.free(); - } else { - fileID = new GString(); - } - ok = gTrue; - } else { - error(-1, "Unsupported version/revision (%d/%d) of Standard security handler", - encVersion, encRevision); - } - } else { - error(-1, "Weird encryption info"); - } - if (fileKeyLength > 16) { - fileKeyLength = 16; - } - fileIDObj.free(); - permObj.free(); - userKeyObj.free(); - ownerKeyObj.free(); - lengthObj.free(); - revisionObj.free(); - versionObj.free(); -} - -StandardSecurityHandler::~StandardSecurityHandler() { - if (fileID) { - delete fileID; - } - if (ownerKey) { - delete ownerKey; - } - if (userKey) { - delete userKey; - } -} - -void *StandardSecurityHandler::makeAuthData(GString *ownerPassword, - GString *userPassword) { - return new StandardAuthData(ownerPassword ? ownerPassword->copy() - : (GString *)NULL, - userPassword ? userPassword->copy() - : (GString *)NULL); -} - -void *StandardSecurityHandler::getAuthData() { -#if HAVE_XPDFCORE - XPDFCore *core; - GString *password; - - if (!(core = (XPDFCore *)doc->getGUIData()) || - !(password = core->getPassword())) { - return NULL; - } - return new StandardAuthData(password, password->copy()); -#elif HAVE_WINPDFCORE - WinPDFCore *core; - GString *password; - - if (!(core = (WinPDFCore *)doc->getGUIData()) || - !(password = core->getPassword())) { - return NULL; - } - return new StandardAuthData(password, password->copy()); -#else - return NULL; -#endif -} - -void StandardSecurityHandler::freeAuthData(void *authData) { - delete (StandardAuthData *)authData; -} - -GBool StandardSecurityHandler::authorize(void *authData) { - GString *ownerPassword, *userPassword; - - if (!ok) { - return gFalse; - } - if (authData) { - ownerPassword = ((StandardAuthData *)authData)->ownerPassword; - userPassword = ((StandardAuthData *)authData)->userPassword; - } else { - ownerPassword = NULL; - userPassword = NULL; - } - if (!Decrypt::makeFileKey(encVersion, encRevision, fileKeyLength, - ownerKey, userKey, permFlags, fileID, - ownerPassword, userPassword, fileKey, - encryptMetadata, &ownerPasswordOk)) { - return gFalse; - } - return gTrue; -} - -#ifdef ENABLE_PLUGINS - -//------------------------------------------------------------------------ -// ExternalSecurityHandler -//------------------------------------------------------------------------ - -ExternalSecurityHandler::ExternalSecurityHandler(PDFDoc *docA, - Object *encryptDictA, - XpdfSecurityHandler *xshA): - SecurityHandler(docA) -{ - encryptDictA->copy(&encryptDict); - xsh = xshA; - encAlgorithm = cryptRC4; //~ this should be obtained via getKey - ok = gFalse; - - if (!(*xsh->newDoc)(xsh->handlerData, (XpdfDoc)docA, - (XpdfObject)encryptDictA, &docData)) { - return; - } - - ok = gTrue; -} - -ExternalSecurityHandler::~ExternalSecurityHandler() { - (*xsh->freeDoc)(xsh->handlerData, docData); - encryptDict.free(); -} - -void *ExternalSecurityHandler::makeAuthData(GString *ownerPassword, - GString *userPassword) { - char *opw, *upw; - void *authData; - - opw = ownerPassword ? ownerPassword->getCString() : (char *)NULL; - upw = userPassword ? userPassword->getCString() : (char *)NULL; - if (!(*xsh->makeAuthData)(xsh->handlerData, docData, opw, upw, &authData)) { - return NULL; - } - return authData; -} - -void *ExternalSecurityHandler::getAuthData() { - void *authData; - - if (!(*xsh->getAuthData)(xsh->handlerData, docData, &authData)) { - return NULL; - } - return authData; -} - -void ExternalSecurityHandler::freeAuthData(void *authData) { - (*xsh->freeAuthData)(xsh->handlerData, docData, authData); -} - -GBool ExternalSecurityHandler::authorize(void *authData) { - char *key; - int length; - - if (!ok) { - return gFalse; - } - permFlags = (*xsh->authorize)(xsh->handlerData, docData, authData); - if (!(permFlags & xpdfPermissionOpen)) { - return gFalse; - } - if (!(*xsh->getKey)(xsh->handlerData, docData, &key, &length, &encVersion)) { - return gFalse; - } - if ((fileKeyLength = length) > 16) { - fileKeyLength = 16; - } - memcpy(fileKey, key, fileKeyLength); - (*xsh->freeKey)(xsh->handlerData, docData, key, length); - return gTrue; -} - -#endif // ENABLE_PLUGINS diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.h deleted file mode 100644 index a27868c24..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SecurityHandler.h +++ /dev/null @@ -1,160 +0,0 @@ -//======================================================================== -// -// SecurityHandler.h -// -// Copyright 2004 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef SECURITYHANDLER_H -#define SECURITYHANDLER_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "Object.h" - -class GString; -class PDFDoc; -struct XpdfSecurityHandler; - -//------------------------------------------------------------------------ -// SecurityHandler -//------------------------------------------------------------------------ - -class SecurityHandler { -public: - - static SecurityHandler *make(PDFDoc *docA, Object *encryptDictA); - - SecurityHandler(PDFDoc *docA); - virtual ~SecurityHandler(); - - // Check the document's encryption. If the document is encrypted, - // this will first try and (in - // "batch" mode), and if those fail, it will attempt to request a - // password from the user. This is the high-level function that - // calls the lower level functions for the specific security handler - // (requesting a password three times, etc.). Returns true if the - // document can be opened (if it's unencrypted, or if a correct - // password is obtained); false otherwise (encrypted and no correct - // password). - GBool checkEncryption(GString *ownerPassword, - GString *userPassword); - - // Create authorization data for the specified owner and user - // passwords. If the security handler doesn't support "batch" mode, - // this function should return NULL. - virtual void *makeAuthData(GString *ownerPassword, - GString *userPassword) = 0; - - // Construct authorization data, typically by prompting the user for - // a password. Returns an authorization data object, or NULL to - // cancel. - virtual void *getAuthData() = 0; - - // Free the authorization data returned by makeAuthData or - // getAuthData. - virtual void freeAuthData(void *authData) = 0; - - // Attempt to authorize the document, using the supplied - // authorization data (which may be NULL). Returns true if - // successful (i.e., if at least the right to open the document was - // granted). - virtual GBool authorize(void *authData) = 0; - - // Return the various authorization parameters. These are only - // valid after authorize has returned true. - virtual int getPermissionFlags() = 0; - virtual GBool getOwnerPasswordOk() = 0; - virtual Guchar *getFileKey() = 0; - virtual int getFileKeyLength() = 0; - virtual int getEncVersion() = 0; - virtual CryptAlgorithm getEncAlgorithm() = 0; - -protected: - - PDFDoc *doc; -}; - -//------------------------------------------------------------------------ -// StandardSecurityHandler -//------------------------------------------------------------------------ - -class StandardSecurityHandler: public SecurityHandler { -public: - - StandardSecurityHandler(PDFDoc *docA, Object *encryptDictA); - virtual ~StandardSecurityHandler(); - - virtual void *makeAuthData(GString *ownerPassword, - GString *userPassword); - virtual void *getAuthData(); - virtual void freeAuthData(void *authData); - virtual GBool authorize(void *authData); - virtual int getPermissionFlags() { return permFlags; } - virtual GBool getOwnerPasswordOk() { return ownerPasswordOk; } - virtual Guchar *getFileKey() { return fileKey; } - virtual int getFileKeyLength() { return fileKeyLength; } - virtual int getEncVersion() { return encVersion; } - virtual CryptAlgorithm getEncAlgorithm() { return encAlgorithm; } - -private: - - int permFlags; - GBool ownerPasswordOk; - Guchar fileKey[16]; - int fileKeyLength; - int encVersion; - int encRevision; - CryptAlgorithm encAlgorithm; - GBool encryptMetadata; - - GString *ownerKey, *userKey; - GString *fileID; - GBool ok; -}; - -#ifdef ENABLE_PLUGINS -//------------------------------------------------------------------------ -// ExternalSecurityHandler -//------------------------------------------------------------------------ - -class ExternalSecurityHandler: public SecurityHandler { -public: - - ExternalSecurityHandler(PDFDoc *docA, Object *encryptDictA, - XpdfSecurityHandler *xshA); - virtual ~ExternalSecurityHandler(); - - virtual void *makeAuthData(GString *ownerPassword, - GString *userPassword); - virtual void *getAuthData(); - virtual void freeAuthData(void *authData); - virtual GBool authorize(void *authData); - virtual int getPermissionFlags() { return permFlags; } - virtual GBool getOwnerPasswordOk() { return gFalse; } - virtual Guchar *getFileKey() { return fileKey; } - virtual int getFileKeyLength() { return fileKeyLength; } - virtual int getEncVersion() { return encVersion; } - virtual CryptAlgorithm getEncAlgorithm() { return encAlgorithm; } - -private: - - Object encryptDict; - XpdfSecurityHandler *xsh; - void *docData; - int permFlags; - Guchar fileKey[16]; - int fileKeyLength; - int encVersion; - CryptAlgorithm encAlgorithm; - GBool ok; -}; -#endif // ENABLE_PLUGINS - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.cc deleted file mode 100644 index 537ee1a79..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.cc +++ /dev/null @@ -1,3310 +0,0 @@ -//======================================================================== -// -// Splash.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "SplashErrorCodes.h" -#include "SplashMath.h" -#include "SplashBitmap.h" -#include "SplashState.h" -#include "SplashPath.h" -#include "SplashXPath.h" -#include "SplashXPathScanner.h" -#include "SplashPattern.h" -#include "SplashScreen.h" -#include "SplashFont.h" -#include "SplashGlyphBitmap.h" -#include "Splash.h" - -//------------------------------------------------------------------------ - -// distance of Bezier control point from center for circle approximation -// = (4 * (sqrt(2) - 1) / 3) * r -#define bezierCircle ((SplashCoord)0.55228475) -#define bezierCircle2 ((SplashCoord)(0.5 * 0.55228475)) - -// Divide a 16-bit value (in [0, 255*255]) by 255, returning an 8-bit result. -static inline Guchar div255(int x) { - return (Guchar)((x + (x >> 8) + 0x80) >> 8); -} - -//------------------------------------------------------------------------ -// SplashPipe -//------------------------------------------------------------------------ - -#define splashPipeMaxStages 9 - -struct SplashPipe { - // pixel coordinates - int x, y; - - // source pattern - SplashPattern *pattern; - - // source alpha and color - SplashCoord aInput; - GBool usesShape; - Guchar aSrc; - SplashColorPtr cSrc; - SplashColor cSrcVal; - - // non-isolated group alpha0 - Guchar *alpha0Ptr; - - // soft mask - SplashColorPtr softMaskPtr; - - // destination alpha and color - SplashColorPtr destColorPtr; - int destColorMask; - Guchar *destAlphaPtr; - - // shape - SplashCoord shape; - - // result alpha and color - GBool noTransparency; - SplashPipeResultColorCtrl resultColorCtrl; - - // non-isolated group correction - int nonIsolatedGroup; -}; - -SplashPipeResultColorCtrl Splash::pipeResultColorNoAlphaBlend[] = { - splashPipeResultColorNoAlphaBlendMono, - splashPipeResultColorNoAlphaBlendMono, - splashPipeResultColorNoAlphaBlendRGB, - splashPipeResultColorNoAlphaBlendRGB -#if SPLASH_CMYK - , - splashPipeResultColorNoAlphaBlendCMYK -#endif -}; - -SplashPipeResultColorCtrl Splash::pipeResultColorAlphaNoBlend[] = { - splashPipeResultColorAlphaNoBlendMono, - splashPipeResultColorAlphaNoBlendMono, - splashPipeResultColorAlphaNoBlendRGB, - splashPipeResultColorAlphaNoBlendRGB -#if SPLASH_CMYK - , - splashPipeResultColorAlphaNoBlendCMYK -#endif -}; - -SplashPipeResultColorCtrl Splash::pipeResultColorAlphaBlend[] = { - splashPipeResultColorAlphaBlendMono, - splashPipeResultColorAlphaBlendMono, - splashPipeResultColorAlphaBlendRGB, - splashPipeResultColorAlphaBlendRGB -#if SPLASH_CMYK - , - splashPipeResultColorAlphaBlendCMYK -#endif -}; - -//------------------------------------------------------------------------ - -static void blendXor(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = src[i] ^ dest[i]; - } -} - -//------------------------------------------------------------------------ -// modified region -//------------------------------------------------------------------------ - -void Splash::clearModRegion() { - modXMin = bitmap->getWidth(); - modYMin = bitmap->getHeight(); - modXMax = -1; - modYMax = -1; -} - -inline void Splash::updateModX(int x) { - if (x < modXMin) { - modXMin = x; - } - if (x > modXMax) { - modXMax = x; - } -} - -inline void Splash::updateModY(int y) { - if (y < modYMin) { - modYMin = y; - } - if (y > modYMax) { - modYMax = y; - } -} - -//------------------------------------------------------------------------ -// pipeline -//------------------------------------------------------------------------ - -inline void Splash::pipeInit(SplashPipe *pipe, int x, int y, - SplashPattern *pattern, SplashColorPtr cSrc, - SplashCoord aInput, GBool usesShape, - GBool nonIsolatedGroup) { - pipeSetXY(pipe, x, y); - pipe->pattern = NULL; - - // source color - if (pattern) { - if (pattern->isStatic()) { - pattern->getColor(x, y, pipe->cSrcVal); - } else { - pipe->pattern = pattern; - } - pipe->cSrc = pipe->cSrcVal; - } else { - pipe->cSrc = cSrc; - } - - // source alpha - pipe->aInput = aInput; - if (!state->softMask) { - if (usesShape) { - pipe->aInput *= 255; - } else { - pipe->aSrc = (Guchar)splashRound(pipe->aInput * 255); - } - } - pipe->usesShape = usesShape; - - // result alpha - if (aInput == 1 && !state->softMask && !usesShape && - !state->inNonIsolatedGroup) { - pipe->noTransparency = gTrue; - } else { - pipe->noTransparency = gFalse; - } - - // result color - if (pipe->noTransparency) { - // the !state->blendFunc case is handled separately in pipeRun - pipe->resultColorCtrl = pipeResultColorNoAlphaBlend[bitmap->mode]; - } else if (!state->blendFunc) { - pipe->resultColorCtrl = pipeResultColorAlphaNoBlend[bitmap->mode]; - } else { - pipe->resultColorCtrl = pipeResultColorAlphaBlend[bitmap->mode]; - } - - // non-isolated group correction - if (nonIsolatedGroup) { - pipe->nonIsolatedGroup = splashColorModeNComps[bitmap->mode]; - } else { - pipe->nonIsolatedGroup = 0; - } -} - -inline void Splash::pipeRun(SplashPipe *pipe) { - Guchar aSrc, aDest, alpha2, alpha0, aResult; - SplashColor cDest, cBlend; - Guchar cResult0, cResult1, cResult2, cResult3; - - //----- source color - - // static pattern: handled in pipeInit - // fixed color: handled in pipeInit - - // dynamic pattern - if (pipe->pattern) { - pipe->pattern->getColor(pipe->x, pipe->y, pipe->cSrcVal); - } - - if (pipe->noTransparency && !state->blendFunc) { - - //----- write destination pixel - - switch (bitmap->mode) { - case splashModeMono1: - cResult0 = pipe->cSrc[0]; - if (state->screen->test(pipe->x, pipe->y, cResult0)) { - *pipe->destColorPtr |= pipe->destColorMask; - } else { - *pipe->destColorPtr &= ~pipe->destColorMask; - } - if (!(pipe->destColorMask >>= 1)) { - pipe->destColorMask = 0x80; - ++pipe->destColorPtr; - } - break; - case splashModeMono8: - *pipe->destColorPtr++ = pipe->cSrc[0]; - break; - case splashModeRGB8: - *pipe->destColorPtr++ = pipe->cSrc[0]; - *pipe->destColorPtr++ = pipe->cSrc[1]; - *pipe->destColorPtr++ = pipe->cSrc[2]; - break; - case splashModeBGR8: - *pipe->destColorPtr++ = pipe->cSrc[2]; - *pipe->destColorPtr++ = pipe->cSrc[1]; - *pipe->destColorPtr++ = pipe->cSrc[0]; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - *pipe->destColorPtr++ = pipe->cSrc[0]; - *pipe->destColorPtr++ = pipe->cSrc[1]; - *pipe->destColorPtr++ = pipe->cSrc[2]; - *pipe->destColorPtr++ = pipe->cSrc[3]; - break; -#endif - } - if (pipe->destAlphaPtr) { - *pipe->destAlphaPtr++ = 255; - } - - } else { - - //----- read destination pixel - - switch (bitmap->mode) { - case splashModeMono1: - cDest[0] = (*pipe->destColorPtr & pipe->destColorMask) ? 0xff : 0x00; - break; - case splashModeMono8: - cDest[0] = *pipe->destColorPtr; - break; - case splashModeRGB8: - cDest[0] = pipe->destColorPtr[0]; - cDest[1] = pipe->destColorPtr[1]; - cDest[2] = pipe->destColorPtr[2]; - break; - case splashModeBGR8: - cDest[0] = pipe->destColorPtr[2]; - cDest[1] = pipe->destColorPtr[1]; - cDest[2] = pipe->destColorPtr[0]; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - cDest[0] = pipe->destColorPtr[0]; - cDest[1] = pipe->destColorPtr[1]; - cDest[2] = pipe->destColorPtr[2]; - cDest[3] = pipe->destColorPtr[3]; - break; -#endif - } - if (pipe->destAlphaPtr) { - aDest = *pipe->destAlphaPtr; - } else { - aDest = 0xff; - } - - //----- blend function - - if (state->blendFunc) { - (*state->blendFunc)(pipe->cSrc, cDest, cBlend, bitmap->mode); - } - - //----- source alpha - - if (state->softMask) { - if (pipe->usesShape) { - aSrc = (Guchar)splashRound(pipe->aInput * *pipe->softMaskPtr++ - * pipe->shape); - } else { - aSrc = (Guchar)splashRound(pipe->aInput * *pipe->softMaskPtr++); - } - } else if (pipe->usesShape) { - // pipe->aInput is premultiplied by 255 in pipeInit - aSrc = (Guchar)splashRound(pipe->aInput * pipe->shape); - } else { - // precomputed in pipeInit - aSrc = pipe->aSrc; - } - - //----- result alpha and non-isolated group element correction - - if (pipe->noTransparency) { - alpha2 = aResult = 255; - } else { - aResult = aSrc + aDest - div255(aSrc * aDest); - - if (pipe->alpha0Ptr) { - alpha0 = *pipe->alpha0Ptr++; - alpha2 = aResult + alpha0 - div255(aResult * alpha0); - } else { - alpha2 = aResult; - } - } - - //----- result color - - cResult0 = cResult1 = cResult2 = cResult3 = 0; // make gcc happy - - switch (pipe->resultColorCtrl) { - -#if SPLASH_CMYK - case splashPipeResultColorNoAlphaBlendCMYK: - cResult3 = div255((255 - aDest) * pipe->cSrc[3] + aDest * cBlend[3]); -#endif - case splashPipeResultColorNoAlphaBlendRGB: - cResult2 = div255((255 - aDest) * pipe->cSrc[2] + aDest * cBlend[2]); - cResult1 = div255((255 - aDest) * pipe->cSrc[1] + aDest * cBlend[1]); - case splashPipeResultColorNoAlphaBlendMono: - cResult0 = div255((255 - aDest) * pipe->cSrc[0] + aDest * cBlend[0]); - break; - - case splashPipeResultColorAlphaNoBlendMono: - if (alpha2 == 0) { - cResult0 = 0; - } else { - cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + - aSrc * pipe->cSrc[0]) / alpha2); - } - break; - case splashPipeResultColorAlphaNoBlendRGB: - if (alpha2 == 0) { - cResult0 = 0; - cResult1 = 0; - cResult2 = 0; - } else { - cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + - aSrc * pipe->cSrc[0]) / alpha2); - cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] + - aSrc * pipe->cSrc[1]) / alpha2); - cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] + - aSrc * pipe->cSrc[2]) / alpha2); - } - break; -#if SPLASH_CMYK - case splashPipeResultColorAlphaNoBlendCMYK: - if (alpha2 == 0) { - cResult0 = 0; - cResult1 = 0; - cResult2 = 0; - cResult3 = 0; - } else { - cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + - aSrc * pipe->cSrc[0]) / alpha2); - cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] + - aSrc * pipe->cSrc[1]) / alpha2); - cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] + - aSrc * pipe->cSrc[2]) / alpha2); - cResult3 = (Guchar)(((alpha2 - aSrc) * cDest[3] + - aSrc * pipe->cSrc[3]) / alpha2); - } - break; -#endif - - case splashPipeResultColorAlphaBlendMono: - if (alpha2 == 0) { - cResult0 = 0; - } else { - cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + - aSrc * ((255 - aDest) * pipe->cSrc[0] + - aDest * cBlend[0]) / 255) / - alpha2); - } - break; - case splashPipeResultColorAlphaBlendRGB: - if (alpha2 == 0) { - cResult0 = 0; - cResult1 = 0; - cResult2 = 0; - } else { - cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + - aSrc * ((255 - aDest) * pipe->cSrc[0] + - aDest * cBlend[0]) / 255) / - alpha2); - cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] + - aSrc * ((255 - aDest) * pipe->cSrc[1] + - aDest * cBlend[1]) / 255) / - alpha2); - cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] + - aSrc * ((255 - aDest) * pipe->cSrc[2] + - aDest * cBlend[2]) / 255) / - alpha2); - } - break; -#if SPLASH_CMYK - case splashPipeResultColorAlphaBlendCMYK: - if (alpha2 == 0) { - cResult0 = 0; - cResult1 = 0; - cResult2 = 0; - cResult3 = 0; - } else { - cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] + - aSrc * ((255 - aDest) * pipe->cSrc[0] + - aDest * cBlend[0]) / 255) / - alpha2); - cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] + - aSrc * ((255 - aDest) * pipe->cSrc[1] + - aDest * cBlend[1]) / 255) / - alpha2); - cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] + - aSrc * ((255 - aDest) * pipe->cSrc[2] + - aDest * cBlend[2]) / 255) / - alpha2); - cResult3 = (Guchar)(((alpha2 - aSrc) * cDest[3] + - aSrc * ((255 - aDest) * pipe->cSrc[3] + - aDest * cBlend[3]) / 255) / - alpha2); - } - break; -#endif - } - - //----- non-isolated group correction - - if (aResult != 0) { - switch (pipe->nonIsolatedGroup) { -#if SPLASH_CMYK - case 4: - cResult3 += (cResult3 - cDest[3]) * aDest * - (255 - aResult) / (255 * aResult); -#endif - case 3: - cResult2 += (cResult2 - cDest[2]) * aDest * - (255 - aResult) / (255 * aResult); - cResult1 += (cResult1 - cDest[1]) * aDest * - (255 - aResult) / (255 * aResult); - case 1: - cResult0 += (cResult0 - cDest[0]) * aDest * - (255 - aResult) / (255 * aResult); - case 0: - break; - } - } - - //----- write destination pixel - - switch (bitmap->mode) { - case splashModeMono1: - if (state->screen->test(pipe->x, pipe->y, cResult0)) { - *pipe->destColorPtr |= pipe->destColorMask; - } else { - *pipe->destColorPtr &= ~pipe->destColorMask; - } - if (!(pipe->destColorMask >>= 1)) { - pipe->destColorMask = 0x80; - ++pipe->destColorPtr; - } - break; - case splashModeMono8: - *pipe->destColorPtr++ = cResult0; - break; - case splashModeRGB8: - *pipe->destColorPtr++ = cResult0; - *pipe->destColorPtr++ = cResult1; - *pipe->destColorPtr++ = cResult2; - break; - case splashModeBGR8: - *pipe->destColorPtr++ = cResult2; - *pipe->destColorPtr++ = cResult1; - *pipe->destColorPtr++ = cResult0; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - *pipe->destColorPtr++ = cResult0; - *pipe->destColorPtr++ = cResult1; - *pipe->destColorPtr++ = cResult2; - *pipe->destColorPtr++ = cResult3; - break; -#endif - } - if (pipe->destAlphaPtr) { - *pipe->destAlphaPtr++ = aResult; - } - - } - - ++pipe->x; -} - -inline void Splash::pipeSetXY(SplashPipe *pipe, int x, int y) { - pipe->x = x; - pipe->y = y; - if (state->softMask) { - pipe->softMaskPtr = - &state->softMask->data[y * state->softMask->rowSize + x]; - } - switch (bitmap->mode) { - case splashModeMono1: - pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + (x >> 3)]; - pipe->destColorMask = 0x80 >> (x & 7); - break; - case splashModeMono8: - pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + x]; - break; - case splashModeRGB8: - case splashModeBGR8: - pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 3 * x]; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 4 * x]; - break; -#endif - } - if (bitmap->alpha) { - pipe->destAlphaPtr = &bitmap->alpha[y * bitmap->width + x]; - } else { - pipe->destAlphaPtr = NULL; - } - if (state->inNonIsolatedGroup && alpha0Bitmap->alpha) { - pipe->alpha0Ptr = - &alpha0Bitmap->alpha[(alpha0Y + y) * alpha0Bitmap->width + - (alpha0X + x)]; - } else { - pipe->alpha0Ptr = NULL; - } -} - -inline void Splash::pipeIncX(SplashPipe *pipe) { - ++pipe->x; - if (state->softMask) { - ++pipe->softMaskPtr; - } - switch (bitmap->mode) { - case splashModeMono1: - if (!(pipe->destColorMask >>= 1)) { - pipe->destColorMask = 0x80; - ++pipe->destColorPtr; - } - break; - case splashModeMono8: - ++pipe->destColorPtr; - break; - case splashModeRGB8: - case splashModeBGR8: - pipe->destColorPtr += 3; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - pipe->destColorPtr += 4; - break; -#endif - } - if (pipe->destAlphaPtr) { - ++pipe->destAlphaPtr; - } - if (pipe->alpha0Ptr) { - ++pipe->alpha0Ptr; - } -} - -inline void Splash::drawPixel(SplashPipe *pipe, int x, int y, GBool noClip) { - if (noClip || state->clip->test(x, y)) { - pipeSetXY(pipe, x, y); - pipeRun(pipe); - updateModX(x); - updateModY(y); - } -} - -inline void Splash::drawAAPixelInit() { - aaBufY = -1; -} - -inline void Splash::drawAAPixel(SplashPipe *pipe, int x, int y) { -#if splashAASize == 4 - static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3, - 1, 2, 2, 3, 2, 3, 3, 4 }; - int w; -#else - int xx, yy; -#endif - SplashColorPtr p; - int x0, x1, t; - - if (x < 0 || x >= bitmap->width || - y < state->clip->getYMinI() || y > state->clip->getYMaxI()) { - return; - } - - // update aaBuf - if (y != aaBufY) { - memset(aaBuf->getDataPtr(), 0xff, - aaBuf->getRowSize() * aaBuf->getHeight()); - x0 = 0; - x1 = bitmap->width - 1; - state->clip->clipAALine(aaBuf, &x0, &x1, y); - aaBufY = y; - } - - // compute the shape value -#if splashAASize == 4 - p = aaBuf->getDataPtr() + (x >> 1); - w = aaBuf->getRowSize(); - if (x & 1) { - t = bitCount4[*p & 0x0f] + bitCount4[p[w] & 0x0f] + - bitCount4[p[2*w] & 0x0f] + bitCount4[p[3*w] & 0x0f]; - } else { - t = bitCount4[*p >> 4] + bitCount4[p[w] >> 4] + - bitCount4[p[2*w] >> 4] + bitCount4[p[3*w] >> 4]; - } -#else - t = 0; - for (yy = 0; yy < splashAASize; ++yy) { - for (xx = 0; xx < splashAASize; ++xx) { - p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + - ((x * splashAASize + xx) >> 3); - t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1; - } - } -#endif - - // draw the pixel - if (t != 0) { - pipeSetXY(pipe, x, y); - pipe->shape *= aaGamma[t]; - pipeRun(pipe); - updateModX(x); - updateModY(y); - } -} - -inline void Splash::drawSpan(SplashPipe *pipe, int x0, int x1, int y, - GBool noClip) { - int x; - - pipeSetXY(pipe, x0, y); - if (noClip) { - for (x = x0; x <= x1; ++x) { - pipeRun(pipe); - } - updateModX(x0); - updateModX(x1); - updateModY(y); - } else { - for (x = x0; x <= x1; ++x) { - if (state->clip->test(x, y)) { - pipeRun(pipe); - updateModX(x); - updateModY(y); - } else { - pipeIncX(pipe); - } - } - } -} - -inline void Splash::drawAALine(SplashPipe *pipe, int x0, int x1, int y) { -#if splashAASize == 4 - static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3, - 1, 2, 2, 3, 2, 3, 3, 4 }; - SplashColorPtr p0, p1, p2, p3; - int t; -#else - SplashColorPtr p; - int xx, yy, t; -#endif - int x; - -#if splashAASize == 4 - p0 = aaBuf->getDataPtr() + (x0 >> 1); - p1 = p0 + aaBuf->getRowSize(); - p2 = p1 + aaBuf->getRowSize(); - p3 = p2 + aaBuf->getRowSize(); -#endif - pipeSetXY(pipe, x0, y); - for (x = x0; x <= x1; ++x) { - - // compute the shape value -#if splashAASize == 4 - if (x & 1) { - t = bitCount4[*p0 & 0x0f] + bitCount4[*p1 & 0x0f] + - bitCount4[*p2 & 0x0f] + bitCount4[*p3 & 0x0f]; - ++p0; ++p1; ++p2; ++p3; - } else { - t = bitCount4[*p0 >> 4] + bitCount4[*p1 >> 4] + - bitCount4[*p2 >> 4] + bitCount4[*p3 >> 4]; - } -#else - t = 0; - for (yy = 0; yy < splashAASize; ++yy) { - for (xx = 0; xx < splashAASize; ++xx) { - p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + - ((x * splashAASize + xx) >> 3); - t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1; - } - } -#endif - - if (t != 0) { - pipe->shape = aaGamma[t]; - pipeRun(pipe); - updateModX(x); - updateModY(y); - } else { - pipeIncX(pipe); - } - } -} - -//------------------------------------------------------------------------ - -// Transform a point from user space to device space. -inline void Splash::transform(SplashCoord *matrix, - SplashCoord xi, SplashCoord yi, - SplashCoord *xo, SplashCoord *yo) { - // [ m[0] m[1] 0 ] - // [xo yo 1] = [xi yi 1] * [ m[2] m[3] 0 ] - // [ m[4] m[5] 1 ] - *xo = xi * matrix[0] + yi * matrix[2] + matrix[4]; - *yo = xi * matrix[1] + yi * matrix[3] + matrix[5]; -} - -//------------------------------------------------------------------------ -// Splash -//------------------------------------------------------------------------ - -Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, - SplashScreenParams *screenParams) { - int i; - - bitmap = bitmapA; - vectorAntialias = vectorAntialiasA; - state = new SplashState(bitmap->width, bitmap->height, vectorAntialias, - screenParams); - if (vectorAntialias) { - aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize, - 1, splashModeMono1, gFalse); - for (i = 0; i <= splashAASize * splashAASize; ++i) { - aaGamma[i] = splashPow((SplashCoord)i / - (SplashCoord)(splashAASize * splashAASize), - 1.5); - } - } else { - aaBuf = NULL; - } - clearModRegion(); - debugMode = gFalse; -} - -Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, - SplashScreen *screenA) { - int i; - - bitmap = bitmapA; - vectorAntialias = vectorAntialiasA; - state = new SplashState(bitmap->width, bitmap->height, vectorAntialias, - screenA); - if (vectorAntialias) { - aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize, - 1, splashModeMono1, gFalse); - for (i = 0; i <= splashAASize * splashAASize; ++i) { - aaGamma[i] = splashPow((SplashCoord)i / - (SplashCoord)(splashAASize * splashAASize), - 1.5); - } - } else { - aaBuf = NULL; - } - clearModRegion(); - debugMode = gFalse; -} - -Splash::~Splash() { - while (state->next) { - restoreState(); - } - delete state; - if (vectorAntialias) { - delete aaBuf; - } -} - -//------------------------------------------------------------------------ -// state read -//------------------------------------------------------------------------ - -SplashCoord *Splash::getMatrix() { - return state->matrix; -} - -SplashPattern *Splash::getStrokePattern() { - return state->strokePattern; -} - -SplashPattern *Splash::getFillPattern() { - return state->fillPattern; -} - -SplashScreen *Splash::getScreen() { - return state->screen; -} - -SplashBlendFunc Splash::getBlendFunc() { - return state->blendFunc; -} - -SplashCoord Splash::getStrokeAlpha() { - return state->strokeAlpha; -} - -SplashCoord Splash::getFillAlpha() { - return state->fillAlpha; -} - -SplashCoord Splash::getLineWidth() { - return state->lineWidth; -} - -int Splash::getLineCap() { - return state->lineCap; -} - -int Splash::getLineJoin() { - return state->lineJoin; -} - -SplashCoord Splash::getMiterLimit() { - return state->miterLimit; -} - -SplashCoord Splash::getFlatness() { - return state->flatness; -} - -SplashCoord *Splash::getLineDash() { - return state->lineDash; -} - -int Splash::getLineDashLength() { - return state->lineDashLength; -} - -SplashCoord Splash::getLineDashPhase() { - return state->lineDashPhase; -} - -SplashClip *Splash::getClip() { - return state->clip; -} - -SplashBitmap *Splash::getSoftMask() { - return state->softMask; -} - -GBool Splash::getInNonIsolatedGroup() { - return state->inNonIsolatedGroup; -} - -//------------------------------------------------------------------------ -// state write -//------------------------------------------------------------------------ - -void Splash::setMatrix(SplashCoord *matrix) { - memcpy(state->matrix, matrix, 6 * sizeof(SplashCoord)); -} - -void Splash::setStrokePattern(SplashPattern *strokePattern) { - state->setStrokePattern(strokePattern); -} - -void Splash::setFillPattern(SplashPattern *fillPattern) { - state->setFillPattern(fillPattern); -} - -void Splash::setScreen(SplashScreen *screen) { - state->setScreen(screen); -} - -void Splash::setBlendFunc(SplashBlendFunc func) { - state->blendFunc = func; -} - -void Splash::setStrokeAlpha(SplashCoord alpha) { - state->strokeAlpha = alpha; -} - -void Splash::setFillAlpha(SplashCoord alpha) { - state->fillAlpha = alpha; -} - -void Splash::setLineWidth(SplashCoord lineWidth) { - state->lineWidth = lineWidth; -} - -void Splash::setLineCap(int lineCap) { - state->lineCap = lineCap; -} - -void Splash::setLineJoin(int lineJoin) { - state->lineJoin = lineJoin; -} - -void Splash::setMiterLimit(SplashCoord miterLimit) { - state->miterLimit = miterLimit; -} - -void Splash::setFlatness(SplashCoord flatness) { - if (flatness < 1) { - state->flatness = 1; - } else { - state->flatness = flatness; - } -} - -void Splash::setLineDash(SplashCoord *lineDash, int lineDashLength, - SplashCoord lineDashPhase) { - state->setLineDash(lineDash, lineDashLength, lineDashPhase); -} - -void Splash::setStrokeAdjust(GBool strokeAdjust) { - state->strokeAdjust = strokeAdjust; -} - -void Splash::clipResetToRect(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1) { - state->clip->resetToRect(x0, y0, x1, y1); -} - -SplashError Splash::clipToRect(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1) { - return state->clip->clipToRect(x0, y0, x1, y1); -} - -SplashError Splash::clipToPath(SplashPath *path, GBool eo) { - return state->clip->clipToPath(path, state->matrix, state->flatness, eo); -} - -void Splash::setSoftMask(SplashBitmap *softMask) { - state->setSoftMask(softMask); -} - -void Splash::setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA, - int alpha0XA, int alpha0YA) { - alpha0Bitmap = alpha0BitmapA; - alpha0X = alpha0XA; - alpha0Y = alpha0YA; - state->inNonIsolatedGroup = gTrue; -} - -//------------------------------------------------------------------------ -// state save/restore -//------------------------------------------------------------------------ - -void Splash::saveState() { - SplashState *newState; - - newState = state->copy(); - newState->next = state; - state = newState; -} - -SplashError Splash::restoreState() { - SplashState *oldState; - - if (!state->next) { - return splashErrNoSave; - } - oldState = state; - state = state->next; - delete oldState; - return splashOk; -} - -//------------------------------------------------------------------------ -// drawing operations -//------------------------------------------------------------------------ - -void Splash::clear(SplashColorPtr color, Guchar alpha) { - SplashColorPtr row, p; - Guchar mono; - int x, y; - - switch (bitmap->mode) { - case splashModeMono1: - mono = (color[0] & 0x80) ? 0xff : 0x00; - if (bitmap->rowSize < 0) { - memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), - mono, -bitmap->rowSize * bitmap->height); - } else { - memset(bitmap->data, mono, bitmap->rowSize * bitmap->height); - } - break; - case splashModeMono8: - if (bitmap->rowSize < 0) { - memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), - color[0], -bitmap->rowSize * bitmap->height); - } else { - memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); - } - break; - case splashModeRGB8: - if (color[0] == color[1] && color[1] == color[2]) { - if (bitmap->rowSize < 0) { - memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), - color[0], -bitmap->rowSize * bitmap->height); - } else { - memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); - } - } else { - row = bitmap->data; - for (y = 0; y < bitmap->height; ++y) { - p = row; - for (x = 0; x < bitmap->width; ++x) { - *p++ = color[2]; - *p++ = color[1]; - *p++ = color[0]; - } - row += bitmap->rowSize; - } - } - break; - case splashModeBGR8: - if (color[0] == color[1] && color[1] == color[2]) { - if (bitmap->rowSize < 0) { - memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), - color[0], -bitmap->rowSize * bitmap->height); - } else { - memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); - } - } else { - row = bitmap->data; - for (y = 0; y < bitmap->height; ++y) { - p = row; - for (x = 0; x < bitmap->width; ++x) { - *p++ = color[0]; - *p++ = color[1]; - *p++ = color[2]; - } - row += bitmap->rowSize; - } - } - break; -#if SPLASH_CMYK - case splashModeCMYK8: - if (color[0] == color[1] && color[1] == color[2] && color[2] == color[3]) { - if (bitmap->rowSize < 0) { - memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1), - color[0], -bitmap->rowSize * bitmap->height); - } else { - memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height); - } - } else { - row = bitmap->data; - for (y = 0; y < bitmap->height; ++y) { - p = row; - for (x = 0; x < bitmap->width; ++x) { - *p++ = color[0]; - *p++ = color[1]; - *p++ = color[2]; - *p++ = color[3]; - } - row += bitmap->rowSize; - } - } - break; -#endif - } - - if (bitmap->alpha) { - memset(bitmap->alpha, alpha, bitmap->width * bitmap->height); - } - - updateModX(0); - updateModY(0); - updateModX(bitmap->width - 1); - updateModY(bitmap->height - 1); -} - -SplashError Splash::stroke(SplashPath *path) { - SplashPath *path2, *dPath; - - if (debugMode) { - printf("stroke [dash:%d] [width:%.2f]:\n", - state->lineDashLength, (double)state->lineWidth); - dumpPath(path); - } - opClipRes = splashClipAllOutside; - if (path->length == 0) { - return splashErrEmptyPath; - } - path2 = flattenPath(path, state->matrix, state->flatness); - if (state->lineDashLength > 0) { - dPath = makeDashedPath(path2); - delete path2; - path2 = dPath; - } - if (state->lineWidth == 0) { - strokeNarrow(path2); - } else { - strokeWide(path2); - } - delete path2; - return splashOk; -} - -void Splash::strokeNarrow(SplashPath *path) { - SplashPipe pipe; - SplashXPath *xPath; - SplashXPathSeg *seg; - int x0, x1, x2, x3, y0, y1, x, y, t; - SplashCoord dx, dy, dxdy; - SplashClipResult clipRes; - int nClipRes[3]; - int i; - - nClipRes[0] = nClipRes[1] = nClipRes[2] = 0; - - xPath = new SplashXPath(path, state->matrix, state->flatness, gFalse); - - pipeInit(&pipe, 0, 0, state->strokePattern, NULL, state->strokeAlpha, - gFalse, gFalse); - - for (i = 0, seg = xPath->segs; i < xPath->length; ++i, ++seg) { - - x0 = splashFloor(seg->x0); - x1 = splashFloor(seg->x1); - y0 = splashFloor(seg->y0); - y1 = splashFloor(seg->y1); - - // horizontal segment - if (y0 == y1) { - if (x0 > x1) { - t = x0; x0 = x1; x1 = t; - } - if ((clipRes = state->clip->testSpan(x0, x1, y0)) - != splashClipAllOutside) { - drawSpan(&pipe, x0, x1, y0, clipRes == splashClipAllInside); - } - - // segment with |dx| > |dy| - } else if (splashAbs(seg->dxdy) > 1) { - dx = seg->x1 - seg->x0; - dy = seg->y1 - seg->y0; - dxdy = seg->dxdy; - if (y0 > y1) { - t = y0; y0 = y1; y1 = t; - t = x0; x0 = x1; x1 = t; - dx = -dx; - dy = -dy; - } - if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0, - x0 <= x1 ? x1 : x0, y1)) - != splashClipAllOutside) { - if (dx > 0) { - x2 = x0; - x3 = splashFloor(seg->x0 + ((SplashCoord)y0 + 1 - seg->y0) * dxdy); - drawSpan(&pipe, x2, (x2 <= x3 - 1) ? x3 - 1 : x2, y0, - clipRes == splashClipAllInside); - x2 = x3; - for (y = y0 + 1; y <= y1 - 1; ++y) { - x3 = splashFloor(seg->x0 + ((SplashCoord)y + 1 - seg->y0) * dxdy); - drawSpan(&pipe, x2, x3 - 1, y, clipRes == splashClipAllInside); - x2 = x3; - } - drawSpan(&pipe, x2, x2 <= x1 ? x1 : x2, y1, - clipRes == splashClipAllInside); - } else { - x2 = x0; - x3 = splashFloor(seg->x0 + ((SplashCoord)y0 + 1 - seg->y0) * dxdy); - drawSpan(&pipe, (x3 + 1 <= x2) ? x3 + 1 : x2, x2, y0, - clipRes == splashClipAllInside); - x2 = x3; - for (y = y0 + 1; y <= y1 - 1; ++y) { - x3 = splashFloor(seg->x0 + ((SplashCoord)y + 1 - seg->y0) * dxdy); - drawSpan(&pipe, x3 + 1, x2, y, clipRes == splashClipAllInside); - x2 = x3; - } - drawSpan(&pipe, x1, (x1 <= x2) ? x2 : x1, y1, - clipRes == splashClipAllInside); - } - } - - // segment with |dy| > |dx| - } else { - dxdy = seg->dxdy; - if (y0 > y1) { - t = x0; x0 = x1; x1 = t; - t = y0; y0 = y1; y1 = t; - } - if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0, - x0 <= x1 ? x1 : x0, y1)) - != splashClipAllOutside) { - drawPixel(&pipe, x0, y0, clipRes == splashClipAllInside); - for (y = y0 + 1; y <= y1 - 1; ++y) { - x = splashFloor(seg->x0 + ((SplashCoord)y - seg->y0) * dxdy); - drawPixel(&pipe, x, y, clipRes == splashClipAllInside); - } - drawPixel(&pipe, x1, y1, clipRes == splashClipAllInside); - } - } - ++nClipRes[clipRes]; - } - if (nClipRes[splashClipPartial] || - (nClipRes[splashClipAllInside] && nClipRes[splashClipAllOutside])) { - opClipRes = splashClipPartial; - } else if (nClipRes[splashClipAllInside]) { - opClipRes = splashClipAllInside; - } else { - opClipRes = splashClipAllOutside; - } - - delete xPath; -} - -void Splash::strokeWide(SplashPath *path) { - SplashPath *path2; - - path2 = makeStrokePath(path, gFalse); - fillWithPattern(path2, gFalse, state->strokePattern, state->strokeAlpha); - delete path2; -} - -SplashPath *Splash::flattenPath(SplashPath *path, SplashCoord *matrix, - SplashCoord flatness) { - SplashPath *fPath; - SplashCoord flatness2; - Guchar flag; - int i; - - fPath = new SplashPath(); - flatness2 = flatness * flatness; - i = 0; - while (i < path->length) { - flag = path->flags[i]; - if (flag & splashPathFirst) { - fPath->moveTo(path->pts[i].x, path->pts[i].y); - ++i; - } else { - if (flag & splashPathCurve) { - flattenCurve(path->pts[i-1].x, path->pts[i-1].y, - path->pts[i ].x, path->pts[i ].y, - path->pts[i+1].x, path->pts[i+1].y, - path->pts[i+2].x, path->pts[i+2].y, - matrix, flatness2, fPath); - i += 3; - } else { - fPath->lineTo(path->pts[i].x, path->pts[i].y); - ++i; - } - if (path->flags[i-1] & splashPathClosed) { - fPath->close(); - } - } - } - return fPath; -} - -void Splash::flattenCurve(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1, - SplashCoord x2, SplashCoord y2, - SplashCoord x3, SplashCoord y3, - SplashCoord *matrix, SplashCoord flatness2, - SplashPath *fPath) { - SplashCoord cx[splashMaxCurveSplits + 1][3]; - SplashCoord cy[splashMaxCurveSplits + 1][3]; - int cNext[splashMaxCurveSplits + 1]; - SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh; - SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh; - SplashCoord dx, dy, mx, my, tx, ty, d1, d2; - int p1, p2, p3; - - // initial segment - p1 = 0; - p2 = splashMaxCurveSplits; - cx[p1][0] = x0; cy[p1][0] = y0; - cx[p1][1] = x1; cy[p1][1] = y1; - cx[p1][2] = x2; cy[p1][2] = y2; - cx[p2][0] = x3; cy[p2][0] = y3; - cNext[p1] = p2; - - while (p1 < splashMaxCurveSplits) { - - // get the next segment - xl0 = cx[p1][0]; yl0 = cy[p1][0]; - xx1 = cx[p1][1]; yy1 = cy[p1][1]; - xx2 = cx[p1][2]; yy2 = cy[p1][2]; - p2 = cNext[p1]; - xr3 = cx[p2][0]; yr3 = cy[p2][0]; - - // compute the distances (in device space) from the control points - // to the midpoint of the straight line (this is a bit of a hack, - // but it's much faster than computing the actual distances to the - // line) - transform(matrix, (xl0 + xr3) * 0.5, (yl0 + yr3) * 0.5, &mx, &my); - transform(matrix, xx1, yy1, &tx, &ty); - dx = tx - mx; - dy = ty - my; - d1 = dx*dx + dy*dy; - transform(matrix, xx2, yy2, &tx, &ty); - dx = tx - mx; - dy = ty - my; - d2 = dx*dx + dy*dy; - - // if the curve is flat enough, or no more subdivisions are - // allowed, add the straight line segment - if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) { - fPath->lineTo(xr3, yr3); - p1 = p2; - - // otherwise, subdivide the curve - } else { - xl1 = (xl0 + xx1) * 0.5; - yl1 = (yl0 + yy1) * 0.5; - xh = (xx1 + xx2) * 0.5; - yh = (yy1 + yy2) * 0.5; - xl2 = (xl1 + xh) * 0.5; - yl2 = (yl1 + yh) * 0.5; - xr2 = (xx2 + xr3) * 0.5; - yr2 = (yy2 + yr3) * 0.5; - xr1 = (xh + xr2) * 0.5; - yr1 = (yh + yr2) * 0.5; - xr0 = (xl2 + xr1) * 0.5; - yr0 = (yl2 + yr1) * 0.5; - // add the new subdivision points - p3 = (p1 + p2) / 2; - cx[p1][1] = xl1; cy[p1][1] = yl1; - cx[p1][2] = xl2; cy[p1][2] = yl2; - cNext[p1] = p3; - cx[p3][0] = xr0; cy[p3][0] = yr0; - cx[p3][1] = xr1; cy[p3][1] = yr1; - cx[p3][2] = xr2; cy[p3][2] = yr2; - cNext[p3] = p2; - } - } -} - -SplashPath *Splash::makeDashedPath(SplashPath *path) { - SplashPath *dPath; - SplashCoord lineDashTotal; - SplashCoord lineDashStartPhase, lineDashDist, segLen; - SplashCoord x0, y0, x1, y1, xa, ya; - GBool lineDashStartOn, lineDashOn, newPath; - int lineDashStartIdx, lineDashIdx; - int i, j, k; - - lineDashTotal = 0; - for (i = 0; i < state->lineDashLength; ++i) { - lineDashTotal += state->lineDash[i]; - } - lineDashStartPhase = state->lineDashPhase; - i = splashFloor(lineDashStartPhase / lineDashTotal); - lineDashStartPhase -= (SplashCoord)i * lineDashTotal; - lineDashStartOn = gTrue; - lineDashStartIdx = 0; - while (lineDashStartPhase >= state->lineDash[lineDashStartIdx]) { - lineDashStartOn = !lineDashStartOn; - lineDashStartPhase -= state->lineDash[lineDashStartIdx]; - ++lineDashStartIdx; - } - - dPath = new SplashPath(); - - // process each subpath - i = 0; - while (i < path->length) { - - // find the end of the subpath - for (j = i; - j < path->length - 1 && !(path->flags[j] & splashPathLast); - ++j) ; - - // initialize the dash parameters - lineDashOn = lineDashStartOn; - lineDashIdx = lineDashStartIdx; - lineDashDist = state->lineDash[lineDashIdx] - lineDashStartPhase; - - // process each segment of the subpath - newPath = gTrue; - for (k = i; k < j; ++k) { - - // grab the segment - x0 = path->pts[k].x; - y0 = path->pts[k].y; - x1 = path->pts[k+1].x; - y1 = path->pts[k+1].y; - segLen = splashDist(x0, y0, x1, y1); - - // process the segment - while (segLen > 0) { - - if (lineDashDist >= segLen) { - if (lineDashOn) { - if (newPath) { - dPath->moveTo(x0, y0); - newPath = gFalse; - } - dPath->lineTo(x1, y1); - } - lineDashDist -= segLen; - segLen = 0; - - } else { - xa = x0 + (lineDashDist / segLen) * (x1 - x0); - ya = y0 + (lineDashDist / segLen) * (y1 - y0); - if (lineDashOn) { - if (newPath) { - dPath->moveTo(x0, y0); - newPath = gFalse; - } - dPath->lineTo(xa, ya); - } - x0 = xa; - y0 = ya; - segLen -= lineDashDist; - lineDashDist = 0; - } - - // get the next entry in the dash array - if (lineDashDist <= 0) { - lineDashOn = !lineDashOn; - if (++lineDashIdx == state->lineDashLength) { - lineDashIdx = 0; - } - lineDashDist = state->lineDash[lineDashIdx]; - newPath = gTrue; - } - } - } - i = j + 1; - } - - return dPath; -} - -SplashError Splash::fill(SplashPath *path, GBool eo) { - if (debugMode) { - printf("fill [eo:%d]:\n", eo); - dumpPath(path); - } - return fillWithPattern(path, eo, state->fillPattern, state->fillAlpha); -} - -SplashError Splash::fillWithPattern(SplashPath *path, GBool eo, - SplashPattern *pattern, - SplashCoord alpha) { - SplashPipe pipe; - SplashXPath *xPath; - SplashXPathScanner *scanner; - int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y; - SplashClipResult clipRes, clipRes2; - - if (path->length == 0) { - return splashErrEmptyPath; - } - xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue); - if (vectorAntialias) { - xPath->aaScale(); - } - xPath->sort(); - scanner = new SplashXPathScanner(xPath, eo); - - // get the min and max x and y values - if (vectorAntialias) { - scanner->getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI); - } else { - scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI); - } - - // check clipping - if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI)) - != splashClipAllOutside) { - - // limit the y range - if (yMinI < state->clip->getYMinI()) { - yMinI = state->clip->getYMinI(); - } - if (yMaxI > state->clip->getYMaxI()) { - yMaxI = state->clip->getYMaxI(); - } - - pipeInit(&pipe, 0, yMinI, pattern, NULL, alpha, vectorAntialias, gFalse); - - // draw the spans - if (vectorAntialias) { - for (y = yMinI; y <= yMaxI; ++y) { - scanner->renderAALine(aaBuf, &x0, &x1, y); - if (clipRes != splashClipAllInside) { - state->clip->clipAALine(aaBuf, &x0, &x1, y); - } - drawAALine(&pipe, x0, x1, y); - } - } else { - for (y = yMinI; y <= yMaxI; ++y) { - while (scanner->getNextSpan(y, &x0, &x1)) { - if (clipRes == splashClipAllInside) { - drawSpan(&pipe, x0, x1, y, gTrue); - } else { - // limit the x range - if (x0 < state->clip->getXMinI()) { - x0 = state->clip->getXMinI(); - } - if (x1 > state->clip->getXMaxI()) { - x1 = state->clip->getXMaxI(); - } - clipRes2 = state->clip->testSpan(x0, x1, y); - drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside); - } - } - } - } - } - opClipRes = clipRes; - - delete scanner; - delete xPath; - return splashOk; -} - -SplashError Splash::xorFill(SplashPath *path, GBool eo) { - SplashPipe pipe; - SplashXPath *xPath; - SplashXPathScanner *scanner; - int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y; - SplashClipResult clipRes, clipRes2; - SplashBlendFunc origBlendFunc; - - if (path->length == 0) { - return splashErrEmptyPath; - } - xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue); - xPath->sort(); - scanner = new SplashXPathScanner(xPath, eo); - - // get the min and max x and y values - scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI); - - // check clipping - if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI)) - != splashClipAllOutside) { - - // limit the y range - if (yMinI < state->clip->getYMinI()) { - yMinI = state->clip->getYMinI(); - } - if (yMaxI > state->clip->getYMaxI()) { - yMaxI = state->clip->getYMaxI(); - } - - origBlendFunc = state->blendFunc; - state->blendFunc = &blendXor; - pipeInit(&pipe, 0, yMinI, state->fillPattern, NULL, 1, gFalse, gFalse); - - // draw the spans - for (y = yMinI; y <= yMaxI; ++y) { - while (scanner->getNextSpan(y, &x0, &x1)) { - if (clipRes == splashClipAllInside) { - drawSpan(&pipe, x0, x1, y, gTrue); - } else { - // limit the x range - if (x0 < state->clip->getXMinI()) { - x0 = state->clip->getXMinI(); - } - if (x1 > state->clip->getXMaxI()) { - x1 = state->clip->getXMaxI(); - } - clipRes2 = state->clip->testSpan(x0, x1, y); - drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside); - } - } - } - state->blendFunc = origBlendFunc; - } - opClipRes = clipRes; - - delete scanner; - delete xPath; - return splashOk; -} - -SplashError Splash::fillChar(SplashCoord x, SplashCoord y, - int c, SplashFont *font) { - SplashGlyphBitmap glyph; - SplashCoord xt, yt; - int x0, y0, xFrac, yFrac; - SplashError err; - - if (debugMode) { - printf("fillChar: x=%.2f y=%.2f c=%3d=0x%02x='%c'\n", - (double)x, (double)y, c, c, c); - } - transform(state->matrix, x, y, &xt, &yt); - x0 = splashFloor(xt); - xFrac = splashFloor((xt - x0) * splashFontFraction); - y0 = splashFloor(yt); - yFrac = splashFloor((yt - y0) * splashFontFraction); - if (!font->getGlyph(c, xFrac, yFrac, &glyph)) { - return splashErrNoGlyph; - } - err = fillGlyph2(x0, y0, &glyph); - if (glyph.freeData) { - gfree(glyph.data); - } - return err; -} - -SplashError Splash::fillGlyph(SplashCoord x, SplashCoord y, - SplashGlyphBitmap *glyph) { - SplashCoord xt, yt; - int x0, y0; - - transform(state->matrix, x, y, &xt, &yt); - x0 = splashFloor(xt); - y0 = splashFloor(yt); - return fillGlyph2(x0, y0, glyph); -} - -SplashError Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph) { - SplashPipe pipe; - SplashClipResult clipRes; - GBool noClip; - int alpha0, alpha; - Guchar *p; - int x1, y1, xx, xx1, yy; - - if ((clipRes = state->clip->testRect(x0 - glyph->x, - y0 - glyph->y, - x0 - glyph->x + glyph->w - 1, - y0 - glyph->y + glyph->h - 1)) - != splashClipAllOutside) { - noClip = clipRes == splashClipAllInside; - - if (noClip) { - if (glyph->aa) { - pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y, - state->fillPattern, NULL, state->fillAlpha, gTrue, gFalse); - p = glyph->data; - for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) { - pipeSetXY(&pipe, x0 - glyph->x, y1); - for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) { - alpha = *p++; - if (alpha != 0) { - pipe.shape = (SplashCoord)(alpha / 255.0); - pipeRun(&pipe); - updateModX(x1); - updateModY(y1); - } else { - pipeIncX(&pipe); - } - } - } - } else { - pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y, - state->fillPattern, NULL, state->fillAlpha, gFalse, gFalse); - p = glyph->data; - for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) { - pipeSetXY(&pipe, x0 - glyph->x, y1); - for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; xx += 8) { - alpha0 = *p++; - for (xx1 = 0; xx1 < 8 && xx + xx1 < glyph->w; ++xx1, ++x1) { - if (alpha0 & 0x80) { - pipeRun(&pipe); - updateModX(x1); - updateModY(y1); - } else { - pipeIncX(&pipe); - } - alpha0 <<= 1; - } - } - } - } - } else { - if (glyph->aa) { - pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y, - state->fillPattern, NULL, state->fillAlpha, gTrue, gFalse); - p = glyph->data; - for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) { - pipeSetXY(&pipe, x0 - glyph->x, y1); - for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) { - if (state->clip->test(x1, y1)) { - alpha = *p++; - if (alpha != 0) { - pipe.shape = (SplashCoord)(alpha / 255.0); - pipeRun(&pipe); - updateModX(x1); - updateModY(y1); - } else { - pipeIncX(&pipe); - } - } else { - pipeIncX(&pipe); - ++p; - } - } - } - } else { - pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y, - state->fillPattern, NULL, state->fillAlpha, gFalse, gFalse); - p = glyph->data; - for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) { - pipeSetXY(&pipe, x0 - glyph->x, y1); - for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; xx += 8) { - alpha0 = *p++; - for (xx1 = 0; xx1 < 8 && xx + xx1 < glyph->w; ++xx1, ++x1) { - if (state->clip->test(x1, y1)) { - if (alpha0 & 0x80) { - pipeRun(&pipe); - updateModX(x1); - updateModY(y1); - } else { - pipeIncX(&pipe); - } - } else { - pipeIncX(&pipe); - } - alpha0 <<= 1; - } - } - } - } - } - } - opClipRes = clipRes; - - return splashOk; -} - -SplashError Splash::fillImageMask(SplashImageMaskSource src, void *srcData, - int w, int h, SplashCoord *mat, - GBool glyphMode) { - SplashPipe pipe; - GBool rot; - SplashCoord xScale, yScale, xShear, yShear, yShear1; - int tx, tx2, ty, ty2, scaledWidth, scaledHeight, xSign, ySign; - int ulx, uly, llx, lly, urx, ury, lrx, lry; - int ulx1, uly1, llx1, lly1, urx1, ury1, lrx1, lry1; - int xMin, xMax, yMin, yMax; - SplashClipResult clipRes, clipRes2; - int yp, yq, yt, yStep, lastYStep; - int xp, xq, xt, xStep, xSrc; - int k1, spanXMin, spanXMax, spanY; - SplashColorPtr pixBuf, p; - int pixAcc; - int x, y, x1, x2, y2; - SplashCoord y1; - int n, m, i, j; - - if (debugMode) { - printf("fillImageMask: w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n", - w, h, (double)mat[0], (double)mat[1], (double)mat[2], - (double)mat[3], (double)mat[4], (double)mat[5]); - } - - // check for singular matrix - if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.000001) { - return splashErrSingularMatrix; - } - - // compute scale, shear, rotation, translation parameters - rot = splashAbs(mat[1]) > splashAbs(mat[0]); - if (rot) { - xScale = -mat[1]; - yScale = mat[2] - (mat[0] * mat[3]) / mat[1]; - xShear = -mat[3] / yScale; - yShear = -mat[0] / mat[1]; - } else { - xScale = mat[0]; - yScale = mat[3] - (mat[1] * mat[2]) / mat[0]; - xShear = mat[2] / yScale; - yShear = mat[1] / mat[0]; - } - // Note 1: The PDF spec says that all pixels whose *centers* lie - // within the region get painted -- but that doesn't seem to match - // up with what Acrobat actually does: it ends up leaving gaps - // between image stripes. So we use the same rule here as for - // fills: any pixel that overlaps the region gets painted. - // Note 2: The "glyphMode" flag is a kludge: it switches back to - // "correct" behavior (matching the spec), for use in rendering Type - // 3 fonts. - // Note 3: The +/-0.01 in these computations is to avoid floating - // point precision problems which can lead to gaps between image - // stripes (it can cause image stripes to overlap, but that's a much - // less visible problem). - if (glyphMode) { - if (xScale >= 0) { - tx = splashRound(mat[4]); - tx2 = splashRound(mat[4] + xScale) - 1; - } else { - tx = splashRound(mat[4]) - 1; - tx2 = splashRound(mat[4] + xScale); - } - } else { - if (xScale >= 0) { - tx = splashFloor(mat[4] - 0.01); - tx2 = splashFloor(mat[4] + xScale + 0.01); - } else { - tx = splashFloor(mat[4] + 0.01); - tx2 = splashFloor(mat[4] + xScale - 0.01); - } - } - scaledWidth = abs(tx2 - tx) + 1; - if (glyphMode) { - if (yScale >= 0) { - ty = splashRound(mat[5]); - ty2 = splashRound(mat[5] + yScale) - 1; - } else { - ty = splashRound(mat[5]) - 1; - ty2 = splashRound(mat[5] + yScale); - } - } else { - if (yScale >= 0) { - ty = splashFloor(mat[5] - 0.01); - ty2 = splashFloor(mat[5] + yScale + 0.01); - } else { - ty = splashFloor(mat[5] + 0.01); - ty2 = splashFloor(mat[5] + yScale - 0.01); - } - } - scaledHeight = abs(ty2 - ty) + 1; - xSign = (xScale < 0) ? -1 : 1; - ySign = (yScale < 0) ? -1 : 1; - yShear1 = (SplashCoord)xSign * yShear; - - // clipping - ulx1 = 0; - uly1 = 0; - urx1 = xSign * (scaledWidth - 1); - ury1 = (int)(yShear * urx1); - llx1 = splashRound(xShear * ySign * (scaledHeight - 1)); - lly1 = ySign * (scaledHeight - 1) + (int)(yShear * llx1); - lrx1 = xSign * (scaledWidth - 1) + - splashRound(xShear * ySign * (scaledHeight - 1)); - lry1 = ySign * (scaledHeight - 1) + (int)(yShear * lrx1); - if (rot) { - ulx = tx + uly1; uly = ty - ulx1; - urx = tx + ury1; ury = ty - urx1; - llx = tx + lly1; lly = ty - llx1; - lrx = tx + lry1; lry = ty - lrx1; - } else { - ulx = tx + ulx1; uly = ty + uly1; - urx = tx + urx1; ury = ty + ury1; - llx = tx + llx1; lly = ty + lly1; - lrx = tx + lrx1; lry = ty + lry1; - } - xMin = (ulx < urx) ? (ulx < llx) ? (ulx < lrx) ? ulx : lrx - : (llx < lrx) ? llx : lrx - : (urx < llx) ? (urx < lrx) ? urx : lrx - : (llx < lrx) ? llx : lrx; - xMax = (ulx > urx) ? (ulx > llx) ? (ulx > lrx) ? ulx : lrx - : (llx > lrx) ? llx : lrx - : (urx > llx) ? (urx > lrx) ? urx : lrx - : (llx > lrx) ? llx : lrx; - yMin = (uly < ury) ? (uly < lly) ? (uly < lry) ? uly : lry - : (lly < lry) ? lly : lry - : (ury < lly) ? (ury < lry) ? ury : lry - : (lly < lry) ? lly : lry; - yMax = (uly > ury) ? (uly > lly) ? (uly > lry) ? uly : lry - : (lly > lry) ? lly : lry - : (ury > lly) ? (ury > lry) ? ury : lry - : (lly > lry) ? lly : lry; - clipRes = state->clip->testRect(xMin, yMin, xMax, yMax); - opClipRes = clipRes; - - // compute Bresenham parameters for x and y scaling - yp = h / scaledHeight; - yq = h % scaledHeight; - xp = w / scaledWidth; - xq = w % scaledWidth; - - // allocate pixel buffer - pixBuf = (SplashColorPtr)gmalloc((yp + 1) * w); - - // initialize the pixel pipe - pipeInit(&pipe, 0, 0, state->fillPattern, NULL, state->fillAlpha, - gTrue, gFalse); - if (vectorAntialias) { - drawAAPixelInit(); - } - - // init y scale Bresenham - yt = 0; - lastYStep = 1; - - for (y = 0; y < scaledHeight; ++y) { - - // y scale Bresenham - yStep = yp; - yt += yq; - if (yt >= scaledHeight) { - yt -= scaledHeight; - ++yStep; - } - - // read row(s) from image - n = (yp > 0) ? yStep : lastYStep; - if (n > 0) { - p = pixBuf; - for (i = 0; i < n; ++i) { - (*src)(srcData, p); - p += w; - } - } - lastYStep = yStep; - - // loop-invariant constants - k1 = splashRound(xShear * ySign * y); - - // clipping test - if (clipRes != splashClipAllInside && - !rot && - (int)(yShear * k1) == - (int)(yShear * (xSign * (scaledWidth - 1) + k1))) { - if (xSign > 0) { - spanXMin = tx + k1; - spanXMax = spanXMin + (scaledWidth - 1); - } else { - spanXMax = tx + k1; - spanXMin = spanXMax - (scaledWidth - 1); - } - spanY = ty + ySign * y + (int)(yShear * k1); - clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY); - if (clipRes2 == splashClipAllOutside) { - continue; - } - } else { - clipRes2 = clipRes; - } - - // init x scale Bresenham - xt = 0; - xSrc = 0; - - // x shear - x1 = k1; - - // y shear - y1 = (SplashCoord)ySign * y + yShear * x1; - // this is a kludge: if yShear1 is negative, then (int)y1 would - // change immediately after the first pixel, which is not what we - // want - if (yShear1 < 0) { - y1 += 0.999; - } - - // loop-invariant constants - n = yStep > 0 ? yStep : 1; - - for (x = 0; x < scaledWidth; ++x) { - - // x scale Bresenham - xStep = xp; - xt += xq; - if (xt >= scaledWidth) { - xt -= scaledWidth; - ++xStep; - } - - // rotation - if (rot) { - x2 = (int)y1; - y2 = -x1; - } else { - x2 = x1; - y2 = (int)y1; - } - - // compute the alpha value for (x,y) after the x and y scaling - // operations - m = xStep > 0 ? xStep : 1; - p = pixBuf + xSrc; - pixAcc = 0; - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - pixAcc += *p++; - } - p += w - m; - } - - // blend fill color with background - if (pixAcc != 0) { - pipe.shape = (pixAcc == n * m) - ? (SplashCoord)1 - : (SplashCoord)pixAcc / (SplashCoord)(n * m); - if (vectorAntialias && clipRes2 != splashClipAllInside) { - drawAAPixel(&pipe, tx + x2, ty + y2); - } else { - drawPixel(&pipe, tx + x2, ty + y2, clipRes2 == splashClipAllInside); - } - } - - // x scale Bresenham - xSrc += xStep; - - // x shear - x1 += xSign; - - // y shear - y1 += yShear1; - } - } - - // free memory - gfree(pixBuf); - - return splashOk; -} - -SplashError Splash::drawImage(SplashImageSource src, void *srcData, - SplashColorMode srcMode, GBool srcAlpha, - int w, int h, SplashCoord *mat) { - SplashPipe pipe; - GBool ok, rot; - SplashCoord xScale, yScale, xShear, yShear, yShear1; - int tx, tx2, ty, ty2, scaledWidth, scaledHeight, xSign, ySign; - int ulx, uly, llx, lly, urx, ury, lrx, lry; - int ulx1, uly1, llx1, lly1, urx1, ury1, lrx1, lry1; - int xMin, xMax, yMin, yMax; - SplashClipResult clipRes, clipRes2; - int yp, yq, yt, yStep, lastYStep; - int xp, xq, xt, xStep, xSrc; - int k1, spanXMin, spanXMax, spanY; - SplashColorPtr colorBuf, p; - SplashColor pix; - Guchar *alphaBuf, *q; -#if SPLASH_CMYK - int pixAcc0, pixAcc1, pixAcc2, pixAcc3; -#else - int pixAcc0, pixAcc1, pixAcc2; -#endif - int alphaAcc; - SplashCoord pixMul, alphaMul, alpha; - int x, y, x1, x2, y2; - SplashCoord y1; - int nComps, n, m, i, j; - - if (debugMode) { - printf("drawImage: srcMode=%d srcAlpha=%d w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n", - srcMode, srcAlpha, w, h, (double)mat[0], (double)mat[1], (double)mat[2], - (double)mat[3], (double)mat[4], (double)mat[5]); - } - - // check color modes - ok = gFalse; // make gcc happy - nComps = 0; // make gcc happy - switch (bitmap->mode) { - case splashModeMono1: - case splashModeMono8: - ok = srcMode == splashModeMono8; - nComps = 1; - break; - case splashModeRGB8: - ok = srcMode == splashModeRGB8; - nComps = 3; - break; - case splashModeBGR8: - ok = srcMode == splashModeBGR8; - nComps = 3; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - ok = srcMode == splashModeCMYK8; - nComps = 4; - break; -#endif - } - if (!ok) { - return splashErrModeMismatch; - } - - // check for singular matrix - if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.000001) { - return splashErrSingularMatrix; - } - - // compute scale, shear, rotation, translation parameters - rot = splashAbs(mat[1]) > splashAbs(mat[0]); - if (rot) { - xScale = -mat[1]; - yScale = mat[2] - (mat[0] * mat[3]) / mat[1]; - xShear = -mat[3] / yScale; - yShear = -mat[0] / mat[1]; - } else { - xScale = mat[0]; - yScale = mat[3] - (mat[1] * mat[2]) / mat[0]; - xShear = mat[2] / yScale; - yShear = mat[1] / mat[0]; - } - // Note 1: The PDF spec says that all pixels whose *centers* lie - // within the region get painted -- but that doesn't seem to match - // up with what Acrobat actually does: it ends up leaving gaps - // between image stripes. So we use the same rule here as for - // fills: any pixel that overlaps the region gets painted. - // Note 2: The +/-0.01 in these computations is to avoid floating - // point precision problems which can lead to gaps between image - // stripes (it can cause image stripes to overlap, but that's a much - // less visible problem). - if (xScale >= 0) { - tx = splashFloor(mat[4] - 0.01); - tx2 = splashFloor(mat[4] + xScale + 0.01); - } else { - tx = splashFloor(mat[4] + 0.01); - tx2 = splashFloor(mat[4] + xScale - 0.01); - } - scaledWidth = abs(tx2 - tx) + 1; - if (yScale >= 0) { - ty = splashFloor(mat[5] - 0.01); - ty2 = splashFloor(mat[5] + yScale + 0.01); - } else { - ty = splashFloor(mat[5] + 0.01); - ty2 = splashFloor(mat[5] + yScale - 0.01); - } - scaledHeight = abs(ty2 - ty) + 1; - xSign = (xScale < 0) ? -1 : 1; - ySign = (yScale < 0) ? -1 : 1; - yShear1 = (SplashCoord)xSign * yShear; - - // clipping - ulx1 = 0; - uly1 = 0; - urx1 = xSign * (scaledWidth - 1); - ury1 = (int)(yShear * urx1); - llx1 = splashRound(xShear * ySign * (scaledHeight - 1)); - lly1 = ySign * (scaledHeight - 1) + (int)(yShear * llx1); - lrx1 = xSign * (scaledWidth - 1) + - splashRound(xShear * ySign * (scaledHeight - 1)); - lry1 = ySign * (scaledHeight - 1) + (int)(yShear * lrx1); - if (rot) { - ulx = tx + uly1; uly = ty - ulx1; - urx = tx + ury1; ury = ty - urx1; - llx = tx + lly1; lly = ty - llx1; - lrx = tx + lry1; lry = ty - lrx1; - } else { - ulx = tx + ulx1; uly = ty + uly1; - urx = tx + urx1; ury = ty + ury1; - llx = tx + llx1; lly = ty + lly1; - lrx = tx + lrx1; lry = ty + lry1; - } - xMin = (ulx < urx) ? (ulx < llx) ? (ulx < lrx) ? ulx : lrx - : (llx < lrx) ? llx : lrx - : (urx < llx) ? (urx < lrx) ? urx : lrx - : (llx < lrx) ? llx : lrx; - xMax = (ulx > urx) ? (ulx > llx) ? (ulx > lrx) ? ulx : lrx - : (llx > lrx) ? llx : lrx - : (urx > llx) ? (urx > lrx) ? urx : lrx - : (llx > lrx) ? llx : lrx; - yMin = (uly < ury) ? (uly < lly) ? (uly < lry) ? uly : lry - : (lly < lry) ? lly : lry - : (ury < lly) ? (ury < lry) ? ury : lry - : (lly < lry) ? lly : lry; - yMax = (uly > ury) ? (uly > lly) ? (uly > lry) ? uly : lry - : (lly > lry) ? lly : lry - : (ury > lly) ? (ury > lry) ? ury : lry - : (lly > lry) ? lly : lry; - clipRes = state->clip->testRect(xMin, yMin, xMax, yMax); - opClipRes = clipRes; - if (clipRes == splashClipAllOutside) { - return splashOk; - } - - // compute Bresenham parameters for x and y scaling - yp = h / scaledHeight; - yq = h % scaledHeight; - xp = w / scaledWidth; - xq = w % scaledWidth; - - // allocate pixel buffers - colorBuf = (SplashColorPtr)gmalloc((yp + 1) * w * nComps); - if (srcAlpha) { - alphaBuf = (Guchar *)gmalloc((yp + 1) * w); - } else { - alphaBuf = NULL; - } - - pixAcc0 = pixAcc1 = pixAcc2 = 0; // make gcc happy -#if SPLASH_CMYK - pixAcc3 = 0; // make gcc happy -#endif - - // initialize the pixel pipe - pipeInit(&pipe, 0, 0, NULL, pix, state->fillAlpha, - srcAlpha || (vectorAntialias && clipRes != splashClipAllInside), - gFalse); - if (vectorAntialias) { - drawAAPixelInit(); - } - - if (srcAlpha) { - - // init y scale Bresenham - yt = 0; - lastYStep = 1; - - for (y = 0; y < scaledHeight; ++y) { - - // y scale Bresenham - yStep = yp; - yt += yq; - if (yt >= scaledHeight) { - yt -= scaledHeight; - ++yStep; - } - - // read row(s) from image - n = (yp > 0) ? yStep : lastYStep; - if (n > 0) { - p = colorBuf; - q = alphaBuf; - for (i = 0; i < n; ++i) { - (*src)(srcData, p, q); - p += w * nComps; - q += w; - } - } - lastYStep = yStep; - - // loop-invariant constants - k1 = splashRound(xShear * ySign * y); - - // clipping test - if (clipRes != splashClipAllInside && - !rot && - (int)(yShear * k1) == - (int)(yShear * (xSign * (scaledWidth - 1) + k1))) { - if (xSign > 0) { - spanXMin = tx + k1; - spanXMax = spanXMin + (scaledWidth - 1); - } else { - spanXMax = tx + k1; - spanXMin = spanXMax - (scaledWidth - 1); - } - spanY = ty + ySign * y + (int)(yShear * k1); - clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY); - if (clipRes2 == splashClipAllOutside) { - continue; - } - } else { - clipRes2 = clipRes; - } - - // init x scale Bresenham - xt = 0; - xSrc = 0; - - // x shear - x1 = k1; - - // y shear - y1 = (SplashCoord)ySign * y + yShear * x1; - // this is a kludge: if yShear1 is negative, then (int)y1 would - // change immediately after the first pixel, which is not what - // we want - if (yShear1 < 0) { - y1 += 0.999; - } - - // loop-invariant constants - n = yStep > 0 ? yStep : 1; - - switch (srcMode) { - - case splashModeMono1: - case splashModeMono8: - for (x = 0; x < scaledWidth; ++x) { - - // x scale Bresenham - xStep = xp; - xt += xq; - if (xt >= scaledWidth) { - xt -= scaledWidth; - ++xStep; - } - - // rotation - if (rot) { - x2 = (int)y1; - y2 = -x1; - } else { - x2 = x1; - y2 = (int)y1; - } - - // compute the filtered pixel at (x,y) after the x and y scaling - // operations - m = xStep > 0 ? xStep : 1; - alphaAcc = 0; - p = colorBuf + xSrc; - q = alphaBuf + xSrc; - pixAcc0 = 0; - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - pixAcc0 += *p++; - alphaAcc += *q++; - } - p += w - m; - q += w - m; - } - pixMul = (SplashCoord)1 / (SplashCoord)(n * m); - alphaMul = pixMul * (1.0 / 255.0); - alpha = (SplashCoord)alphaAcc * alphaMul; - - if (alpha > 0) { - pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); - - // set pixel - pipe.shape = alpha; - if (vectorAntialias && clipRes != splashClipAllInside) { - drawAAPixel(&pipe, tx + x2, ty + y2); - } else { - drawPixel(&pipe, tx + x2, ty + y2, - clipRes2 == splashClipAllInside); - } - } - - // x scale Bresenham - xSrc += xStep; - - // x shear - x1 += xSign; - - // y shear - y1 += yShear1; - } - break; - - case splashModeRGB8: - case splashModeBGR8: - for (x = 0; x < scaledWidth; ++x) { - - // x scale Bresenham - xStep = xp; - xt += xq; - if (xt >= scaledWidth) { - xt -= scaledWidth; - ++xStep; - } - - // rotation - if (rot) { - x2 = (int)y1; - y2 = -x1; - } else { - x2 = x1; - y2 = (int)y1; - } - - // compute the filtered pixel at (x,y) after the x and y scaling - // operations - m = xStep > 0 ? xStep : 1; - alphaAcc = 0; - p = colorBuf + xSrc * 3; - q = alphaBuf + xSrc; - pixAcc0 = pixAcc1 = pixAcc2 = 0; - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - pixAcc0 += *p++; - pixAcc1 += *p++; - pixAcc2 += *p++; - alphaAcc += *q++; - } - p += 3 * (w - m); - q += w - m; - } - pixMul = (SplashCoord)1 / (SplashCoord)(n * m); - alphaMul = pixMul * (1.0 / 255.0); - alpha = (SplashCoord)alphaAcc * alphaMul; - - if (alpha > 0) { - pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); - pix[1] = (int)((SplashCoord)pixAcc1 * pixMul); - pix[2] = (int)((SplashCoord)pixAcc2 * pixMul); - - // set pixel - pipe.shape = alpha; - if (vectorAntialias && clipRes != splashClipAllInside) { - drawAAPixel(&pipe, tx + x2, ty + y2); - } else { - drawPixel(&pipe, tx + x2, ty + y2, - clipRes2 == splashClipAllInside); - } - } - - // x scale Bresenham - xSrc += xStep; - - // x shear - x1 += xSign; - - // y shear - y1 += yShear1; - } - break; - -#if SPLASH_CMYK - case splashModeCMYK8: - for (x = 0; x < scaledWidth; ++x) { - - // x scale Bresenham - xStep = xp; - xt += xq; - if (xt >= scaledWidth) { - xt -= scaledWidth; - ++xStep; - } - - // rotation - if (rot) { - x2 = (int)y1; - y2 = -x1; - } else { - x2 = x1; - y2 = (int)y1; - } - - // compute the filtered pixel at (x,y) after the x and y scaling - // operations - m = xStep > 0 ? xStep : 1; - alphaAcc = 0; - p = colorBuf + xSrc * 4; - q = alphaBuf + xSrc; - pixAcc0 = pixAcc1 = pixAcc2 = pixAcc3 = 0; - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - pixAcc0 += *p++; - pixAcc1 += *p++; - pixAcc2 += *p++; - pixAcc3 += *p++; - alphaAcc += *q++; - } - p += 4 * (w - m); - q += w - m; - } - pixMul = (SplashCoord)1 / (SplashCoord)(n * m); - alphaMul = pixMul * (1.0 / 255.0); - alpha = (SplashCoord)alphaAcc * alphaMul; - - if (alpha > 0) { - pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); - pix[1] = (int)((SplashCoord)pixAcc1 * pixMul); - pix[2] = (int)((SplashCoord)pixAcc2 * pixMul); - pix[3] = (int)((SplashCoord)pixAcc3 * pixMul); - - // set pixel - pipe.shape = alpha; - if (vectorAntialias && clipRes != splashClipAllInside) { - drawAAPixel(&pipe, tx + x2, ty + y2); - } else { - drawPixel(&pipe, tx + x2, ty + y2, - clipRes2 == splashClipAllInside); - } - } - - // x scale Bresenham - xSrc += xStep; - - // x shear - x1 += xSign; - - // y shear - y1 += yShear1; - } - break; -#endif // SPLASH_CMYK - } - } - - } else { - - // init y scale Bresenham - yt = 0; - lastYStep = 1; - - for (y = 0; y < scaledHeight; ++y) { - - // y scale Bresenham - yStep = yp; - yt += yq; - if (yt >= scaledHeight) { - yt -= scaledHeight; - ++yStep; - } - - // read row(s) from image - n = (yp > 0) ? yStep : lastYStep; - if (n > 0) { - p = colorBuf; - for (i = 0; i < n; ++i) { - (*src)(srcData, p, NULL); - p += w * nComps; - } - } - lastYStep = yStep; - - // loop-invariant constants - k1 = splashRound(xShear * ySign * y); - - // clipping test - if (clipRes != splashClipAllInside && - !rot && - (int)(yShear * k1) == - (int)(yShear * (xSign * (scaledWidth - 1) + k1))) { - if (xSign > 0) { - spanXMin = tx + k1; - spanXMax = spanXMin + (scaledWidth - 1); - } else { - spanXMax = tx + k1; - spanXMin = spanXMax - (scaledWidth - 1); - } - spanY = ty + ySign * y + (int)(yShear * k1); - clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY); - if (clipRes2 == splashClipAllOutside) { - continue; - } - } else { - clipRes2 = clipRes; - } - - // init x scale Bresenham - xt = 0; - xSrc = 0; - - // x shear - x1 = k1; - - // y shear - y1 = (SplashCoord)ySign * y + yShear * x1; - // this is a kludge: if yShear1 is negative, then (int)y1 would - // change immediately after the first pixel, which is not what - // we want - if (yShear1 < 0) { - y1 += 0.999; - } - - // loop-invariant constants - n = yStep > 0 ? yStep : 1; - - switch (srcMode) { - - case splashModeMono1: - case splashModeMono8: - for (x = 0; x < scaledWidth; ++x) { - - // x scale Bresenham - xStep = xp; - xt += xq; - if (xt >= scaledWidth) { - xt -= scaledWidth; - ++xStep; - } - - // rotation - if (rot) { - x2 = (int)y1; - y2 = -x1; - } else { - x2 = x1; - y2 = (int)y1; - } - - // compute the filtered pixel at (x,y) after the x and y scaling - // operations - m = xStep > 0 ? xStep : 1; - p = colorBuf + xSrc; - pixAcc0 = 0; - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - pixAcc0 += *p++; - } - p += w - m; - } - pixMul = (SplashCoord)1 / (SplashCoord)(n * m); - - pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); - - // set pixel - if (vectorAntialias && clipRes != splashClipAllInside) { - pipe.shape = (SplashCoord)1; - drawAAPixel(&pipe, tx + x2, ty + y2); - } else { - drawPixel(&pipe, tx + x2, ty + y2, - clipRes2 == splashClipAllInside); - } - - // x scale Bresenham - xSrc += xStep; - - // x shear - x1 += xSign; - - // y shear - y1 += yShear1; - } - break; - - case splashModeRGB8: - case splashModeBGR8: - for (x = 0; x < scaledWidth; ++x) { - - // x scale Bresenham - xStep = xp; - xt += xq; - if (xt >= scaledWidth) { - xt -= scaledWidth; - ++xStep; - } - - // rotation - if (rot) { - x2 = (int)y1; - y2 = -x1; - } else { - x2 = x1; - y2 = (int)y1; - } - - // compute the filtered pixel at (x,y) after the x and y scaling - // operations - m = xStep > 0 ? xStep : 1; - p = colorBuf + xSrc * 3; - pixAcc0 = pixAcc1 = pixAcc2 = 0; - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - pixAcc0 += *p++; - pixAcc1 += *p++; - pixAcc2 += *p++; - } - p += 3 * (w - m); - } - pixMul = (SplashCoord)1 / (SplashCoord)(n * m); - - pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); - pix[1] = (int)((SplashCoord)pixAcc1 * pixMul); - pix[2] = (int)((SplashCoord)pixAcc2 * pixMul); - - // set pixel - if (vectorAntialias && clipRes != splashClipAllInside) { - pipe.shape = (SplashCoord)1; - drawAAPixel(&pipe, tx + x2, ty + y2); - } else { - drawPixel(&pipe, tx + x2, ty + y2, - clipRes2 == splashClipAllInside); - } - - // x scale Bresenham - xSrc += xStep; - - // x shear - x1 += xSign; - - // y shear - y1 += yShear1; - } - break; - -#if SPLASH_CMYK - case splashModeCMYK8: - for (x = 0; x < scaledWidth; ++x) { - - // x scale Bresenham - xStep = xp; - xt += xq; - if (xt >= scaledWidth) { - xt -= scaledWidth; - ++xStep; - } - - // rotation - if (rot) { - x2 = (int)y1; - y2 = -x1; - } else { - x2 = x1; - y2 = (int)y1; - } - - // compute the filtered pixel at (x,y) after the x and y scaling - // operations - m = xStep > 0 ? xStep : 1; - p = colorBuf + xSrc * 4; - pixAcc0 = pixAcc1 = pixAcc2 = pixAcc3 = 0; - for (i = 0; i < n; ++i) { - for (j = 0; j < m; ++j) { - pixAcc0 += *p++; - pixAcc1 += *p++; - pixAcc2 += *p++; - pixAcc3 += *p++; - } - p += 4 * (w - m); - } - pixMul = (SplashCoord)1 / (SplashCoord)(n * m); - - pix[0] = (int)((SplashCoord)pixAcc0 * pixMul); - pix[1] = (int)((SplashCoord)pixAcc1 * pixMul); - pix[2] = (int)((SplashCoord)pixAcc2 * pixMul); - pix[3] = (int)((SplashCoord)pixAcc3 * pixMul); - - // set pixel - if (vectorAntialias && clipRes != splashClipAllInside) { - pipe.shape = (SplashCoord)1; - drawAAPixel(&pipe, tx + x2, ty + y2); - } else { - drawPixel(&pipe, tx + x2, ty + y2, - clipRes2 == splashClipAllInside); - } - - // x scale Bresenham - xSrc += xStep; - - // x shear - x1 += xSign; - - // y shear - y1 += yShear1; - } - break; -#endif // SPLASH_CMYK - } - } - - } - - gfree(colorBuf); - gfree(alphaBuf); - - return splashOk; -} - -SplashError Splash::composite(SplashBitmap *src, int xSrc, int ySrc, - int xDest, int yDest, int w, int h, - GBool noClip, GBool nonIsolated) { - SplashPipe pipe; - SplashColor pixel; - Guchar alpha; - Guchar *ap; - int x, y; - - if (src->mode != bitmap->mode) { - return splashErrModeMismatch; - } - - if (src->alpha) { - pipeInit(&pipe, xDest, yDest, NULL, pixel, state->fillAlpha, - gTrue, nonIsolated); - for (y = 0; y < h; ++y) { - pipeSetXY(&pipe, xDest, yDest + y); - ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc; - for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); - alpha = *ap++; - if (noClip || state->clip->test(xDest + x, yDest + y)) { - // this uses shape instead of alpha, which isn't technically - // correct, but works out the same - pipe.shape = (SplashCoord)(alpha / 255.0); - pipeRun(&pipe); - updateModX(xDest + x); - updateModY(yDest + y); - } else { - pipeIncX(&pipe); - } - } - } - } else { - pipeInit(&pipe, xDest, yDest, NULL, pixel, state->fillAlpha, - gFalse, nonIsolated); - for (y = 0; y < h; ++y) { - pipeSetXY(&pipe, xDest, yDest + y); - for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); - if (noClip || state->clip->test(xDest + x, yDest + y)) { - pipeRun(&pipe); - updateModX(xDest + x); - updateModY(yDest + y); - } else { - pipeIncX(&pipe); - } - } - } - } - - return splashOk; -} - -void Splash::compositeBackground(SplashColorPtr color) { - SplashColorPtr p; - Guchar *q; - Guchar alpha, alpha1, c, color0, color1, color2, color3; - int x, y, mask; - - switch (bitmap->mode) { - case splashModeMono1: - color0 = color[0]; - for (y = 0; y < bitmap->height; ++y) { - p = &bitmap->data[y * bitmap->rowSize]; - q = &bitmap->alpha[y * bitmap->width]; - mask = 0x80; - for (x = 0; x < bitmap->width; ++x) { - alpha = *q++; - alpha1 = 255 - alpha; - c = (*p & mask) ? 0xff : 0x00; - c = div255(alpha1 * color0 + alpha * c); - if (c & 0x80) { - *p |= mask; - } else { - *p &= ~mask; - } - if (!(mask >>= 1)) { - mask = 0x80; - ++p; - } - } - } - break; - case splashModeMono8: - color0 = color[0]; - for (y = 0; y < bitmap->height; ++y) { - p = &bitmap->data[y * bitmap->rowSize]; - q = &bitmap->alpha[y * bitmap->width]; - for (x = 0; x < bitmap->width; ++x) { - alpha = *q++; - alpha1 = 255 - alpha; - p[0] = div255(alpha1 * color0 + alpha * p[0]); - ++p; - } - } - break; - case splashModeRGB8: - case splashModeBGR8: - color0 = color[0]; - color1 = color[1]; - color2 = color[2]; - for (y = 0; y < bitmap->height; ++y) { - p = &bitmap->data[y * bitmap->rowSize]; - q = &bitmap->alpha[y * bitmap->width]; - for (x = 0; x < bitmap->width; ++x) { - alpha = *q++; - alpha1 = 255 - alpha; - p[0] = div255(alpha1 * color0 + alpha * p[0]); - p[1] = div255(alpha1 * color1 + alpha * p[1]); - p[2] = div255(alpha1 * color2 + alpha * p[2]); - p += 3; - } - } - break; -#if SPLASH_CMYK - case splashModeCMYK8: - color0 = color[0]; - color1 = color[1]; - color2 = color[2]; - color3 = color[3]; - for (y = 0; y < bitmap->height; ++y) { - p = &bitmap->data[y * bitmap->rowSize]; - q = &bitmap->alpha[y * bitmap->width]; - for (x = 0; x < bitmap->width; ++x) { - alpha = *q++; - alpha1 = 255 - alpha; - p[0] = div255(alpha1 * color0 + alpha * p[0]); - p[1] = div255(alpha1 * color1 + alpha * p[1]); - p[2] = div255(alpha1 * color2 + alpha * p[2]); - p[3] = div255(alpha1 * color3 + alpha * p[3]); - p += 4; - } - } - break; -#endif - } - memset(bitmap->alpha, 255, bitmap->width * bitmap->height); -} - -SplashError Splash::blitTransparent(SplashBitmap *src, int xSrc, int ySrc, - int xDest, int yDest, int w, int h) { - SplashColor pixel; - SplashColorPtr p; - Guchar *q; - int x, y, mask; - - if (src->mode != bitmap->mode) { - return splashErrModeMismatch; - } - - switch (bitmap->mode) { - case splashModeMono1: - for (y = 0; y < h; ++y) { - p = &bitmap->data[(yDest + y) * bitmap->rowSize + (xDest >> 3)]; - mask = 0x80 >> (xDest & 7); - for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); - if (pixel[0]) { - *p |= mask; - } else { - *p &= ~mask; - } - if (!(mask >>= 1)) { - mask = 0x80; - ++p; - } - } - } - break; - case splashModeMono8: - for (y = 0; y < h; ++y) { - p = &bitmap->data[(yDest + y) * bitmap->rowSize + xDest]; - for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); - *p++ = pixel[0]; - } - } - break; - case splashModeRGB8: - case splashModeBGR8: - for (y = 0; y < h; ++y) { - p = &bitmap->data[(yDest + y) * bitmap->rowSize + 3 * xDest]; - for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); - *p++ = pixel[0]; - *p++ = pixel[1]; - *p++ = pixel[2]; - } - } - break; -#if SPLASH_CMYK - case splashModeCMYK8: - for (y = 0; y < h; ++y) { - p = &bitmap->data[(yDest + y) * bitmap->rowSize + 4 * xDest]; - for (x = 0; x < w; ++x) { - src->getPixel(xSrc + x, ySrc + y, pixel); - *p++ = pixel[0]; - *p++ = pixel[1]; - *p++ = pixel[2]; - *p++ = pixel[3]; - } - } - break; -#endif - } - - if (bitmap->alpha) { - for (y = 0; y < h; ++y) { - q = &bitmap->alpha[(yDest + y) * bitmap->width + xDest]; - for (x = 0; x < w; ++x) { - *q++ = 0x00; - } - } - } - - return splashOk; -} - -SplashPath *Splash::makeStrokePath(SplashPath *path, GBool flatten) { - SplashPath *pathIn, *pathOut; - SplashCoord w, d, dx, dy, wdx, wdy, dxNext, dyNext, wdxNext, wdyNext; - SplashCoord crossprod, dotprod, miter, m; - GBool first, last, closed; - int subpathStart, next, i; - int left0, left1, left2, right0, right1, right2, join0, join1, join2; - int leftFirst, rightFirst, firstPt; - - if (flatten) { - pathIn = flattenPath(path, state->matrix, state->flatness); - if (state->lineDashLength > 0) { - pathOut = makeDashedPath(pathIn); - delete pathIn; - pathIn = pathOut; - } - } else { - pathIn = path; - } - - subpathStart = 0; // make gcc happy - closed = gFalse; // make gcc happy - left0 = left1 = right0 = right1 = join0 = join1 = 0; // make gcc happy - leftFirst = rightFirst = firstPt = 0; // make gcc happy - - pathOut = new SplashPath(); - w = state->lineWidth; - - for (i = 0; i < pathIn->length - 1; ++i) { - if (pathIn->flags[i] & splashPathLast) { - continue; - } - if ((first = pathIn->flags[i] & splashPathFirst)) { - subpathStart = i; - closed = pathIn->flags[i] & splashPathClosed; - } - last = pathIn->flags[i+1] & splashPathLast; - - // compute the deltas for segment (i, i+1) - d = splashDist(pathIn->pts[i].x, pathIn->pts[i].y, - pathIn->pts[i+1].x, pathIn->pts[i+1].y); - if (d == 0) { - // we need to draw end caps on zero-length lines - //~ not clear what the behavior should be for splashLineCapButt - //~ with d==0 - dx = 0; - dy = 1; - } else { - d = (SplashCoord)1 / d; - dx = d * (pathIn->pts[i+1].x - pathIn->pts[i].x); - dy = d * (pathIn->pts[i+1].y - pathIn->pts[i].y); - } - wdx = (SplashCoord)0.5 * w * dx; - wdy = (SplashCoord)0.5 * w * dy; - - // compute the deltas for segment (i+1, next) - next = last ? subpathStart + 1 : i + 2; - d = splashDist(pathIn->pts[i+1].x, pathIn->pts[i+1].y, - pathIn->pts[next].x, pathIn->pts[next].y); - if (d == 0) { - // we need to draw end caps on zero-length lines - //~ not clear what the behavior should be for splashLineCapButt - //~ with d==0 - dxNext = 0; - dyNext = 1; - } else { - d = (SplashCoord)1 / d; - dxNext = d * (pathIn->pts[next].x - pathIn->pts[i+1].x); - dyNext = d * (pathIn->pts[next].y - pathIn->pts[i+1].y); - } - wdxNext = (SplashCoord)0.5 * w * dxNext; - wdyNext = (SplashCoord)0.5 * w * dyNext; - - // draw the start cap - pathOut->moveTo(pathIn->pts[i].x - wdy, pathIn->pts[i].y + wdx); - if (i == subpathStart) { - firstPt = pathOut->length - 1; - } - if (first && !closed) { - switch (state->lineCap) { - case splashLineCapButt: - pathOut->lineTo(pathIn->pts[i].x + wdy, pathIn->pts[i].y - wdx); - break; - case splashLineCapRound: - pathOut->curveTo(pathIn->pts[i].x - wdy - bezierCircle * wdx, - pathIn->pts[i].y + wdx - bezierCircle * wdy, - pathIn->pts[i].x - wdx - bezierCircle * wdy, - pathIn->pts[i].y - wdy + bezierCircle * wdx, - pathIn->pts[i].x - wdx, - pathIn->pts[i].y - wdy); - pathOut->curveTo(pathIn->pts[i].x - wdx + bezierCircle * wdy, - pathIn->pts[i].y - wdy - bezierCircle * wdx, - pathIn->pts[i].x + wdy - bezierCircle * wdx, - pathIn->pts[i].y - wdx - bezierCircle * wdy, - pathIn->pts[i].x + wdy, - pathIn->pts[i].y - wdx); - break; - case splashLineCapProjecting: - pathOut->lineTo(pathIn->pts[i].x - wdx - wdy, - pathIn->pts[i].y + wdx - wdy); - pathOut->lineTo(pathIn->pts[i].x - wdx + wdy, - pathIn->pts[i].y - wdx - wdy); - pathOut->lineTo(pathIn->pts[i].x + wdy, - pathIn->pts[i].y - wdx); - break; - } - } else { - pathOut->lineTo(pathIn->pts[i].x + wdy, pathIn->pts[i].y - wdx); - } - - // draw the left side of the segment rectangle - left2 = pathOut->length - 1; - pathOut->lineTo(pathIn->pts[i+1].x + wdy, pathIn->pts[i+1].y - wdx); - - // draw the end cap - if (last && !closed) { - switch (state->lineCap) { - case splashLineCapButt: - pathOut->lineTo(pathIn->pts[i+1].x - wdy, pathIn->pts[i+1].y + wdx); - break; - case splashLineCapRound: - pathOut->curveTo(pathIn->pts[i+1].x + wdy + bezierCircle * wdx, - pathIn->pts[i+1].y - wdx + bezierCircle * wdy, - pathIn->pts[i+1].x + wdx + bezierCircle * wdy, - pathIn->pts[i+1].y + wdy - bezierCircle * wdx, - pathIn->pts[i+1].x + wdx, - pathIn->pts[i+1].y + wdy); - pathOut->curveTo(pathIn->pts[i+1].x + wdx - bezierCircle * wdy, - pathIn->pts[i+1].y + wdy + bezierCircle * wdx, - pathIn->pts[i+1].x - wdy + bezierCircle * wdx, - pathIn->pts[i+1].y + wdx + bezierCircle * wdy, - pathIn->pts[i+1].x - wdy, - pathIn->pts[i+1].y + wdx); - break; - case splashLineCapProjecting: - pathOut->lineTo(pathIn->pts[i+1].x + wdy + wdx, - pathIn->pts[i+1].y - wdx + wdy); - pathOut->lineTo(pathIn->pts[i+1].x - wdy + wdx, - pathIn->pts[i+1].y + wdx + wdy); - pathOut->lineTo(pathIn->pts[i+1].x - wdy, - pathIn->pts[i+1].y + wdx); - break; - } - } else { - pathOut->lineTo(pathIn->pts[i+1].x - wdy, pathIn->pts[i+1].y + wdx); - } - - // draw the right side of the segment rectangle - right2 = pathOut->length - 1; - pathOut->close(); - - // draw the join - join2 = pathOut->length; - if (!last || closed) { - crossprod = dx * dyNext - dy * dxNext; - dotprod = -(dx * dxNext + dy * dyNext); - if (dotprod > 0.99999) { - // avoid a divide-by-zero -- set miter to something arbitrary - // such that sqrt(miter) will exceed miterLimit (and m is never - // used in that situation) - miter = (state->miterLimit + 1) * (state->miterLimit + 1); - m = 0; - } else { - miter = (SplashCoord)2 / ((SplashCoord)1 - dotprod); - if (miter < 1) { - // this can happen because of floating point inaccuracies - miter = 1; - } - m = splashSqrt(miter - 1); - } - - // round join - if (state->lineJoin == splashLineJoinRound) { - pathOut->moveTo(pathIn->pts[i+1].x + (SplashCoord)0.5 * w, - pathIn->pts[i+1].y); - pathOut->curveTo(pathIn->pts[i+1].x + (SplashCoord)0.5 * w, - pathIn->pts[i+1].y + bezierCircle2 * w, - pathIn->pts[i+1].x + bezierCircle2 * w, - pathIn->pts[i+1].y + (SplashCoord)0.5 * w, - pathIn->pts[i+1].x, - pathIn->pts[i+1].y + (SplashCoord)0.5 * w); - pathOut->curveTo(pathIn->pts[i+1].x - bezierCircle2 * w, - pathIn->pts[i+1].y + (SplashCoord)0.5 * w, - pathIn->pts[i+1].x - (SplashCoord)0.5 * w, - pathIn->pts[i+1].y + bezierCircle2 * w, - pathIn->pts[i+1].x - (SplashCoord)0.5 * w, - pathIn->pts[i+1].y); - pathOut->curveTo(pathIn->pts[i+1].x - (SplashCoord)0.5 * w, - pathIn->pts[i+1].y - bezierCircle2 * w, - pathIn->pts[i+1].x - bezierCircle2 * w, - pathIn->pts[i+1].y - (SplashCoord)0.5 * w, - pathIn->pts[i+1].x, - pathIn->pts[i+1].y - (SplashCoord)0.5 * w); - pathOut->curveTo(pathIn->pts[i+1].x + bezierCircle2 * w, - pathIn->pts[i+1].y - (SplashCoord)0.5 * w, - pathIn->pts[i+1].x + (SplashCoord)0.5 * w, - pathIn->pts[i+1].y - bezierCircle2 * w, - pathIn->pts[i+1].x + (SplashCoord)0.5 * w, - pathIn->pts[i+1].y); - - } else { - pathOut->moveTo(pathIn->pts[i+1].x, pathIn->pts[i+1].y); - - // angle < 180 - if (crossprod < 0) { - pathOut->lineTo(pathIn->pts[i+1].x - wdyNext, - pathIn->pts[i+1].y + wdxNext); - // miter join inside limit - if (state->lineJoin == splashLineJoinMiter && - splashSqrt(miter) <= state->miterLimit) { - pathOut->lineTo(pathIn->pts[i+1].x - wdy + wdx * m, - pathIn->pts[i+1].y + wdx + wdy * m); - pathOut->lineTo(pathIn->pts[i+1].x - wdy, - pathIn->pts[i+1].y + wdx); - // bevel join or miter join outside limit - } else { - pathOut->lineTo(pathIn->pts[i+1].x - wdy, pathIn->pts[i+1].y + wdx); - } - - // angle >= 180 - } else { - pathOut->lineTo(pathIn->pts[i+1].x + wdy, - pathIn->pts[i+1].y - wdx); - // miter join inside limit - if (state->lineJoin == splashLineJoinMiter && - splashSqrt(miter) <= state->miterLimit) { - pathOut->lineTo(pathIn->pts[i+1].x + wdy + wdx * m, - pathIn->pts[i+1].y - wdx + wdy * m); - pathOut->lineTo(pathIn->pts[i+1].x + wdyNext, - pathIn->pts[i+1].y - wdxNext); - // bevel join or miter join outside limit - } else { - pathOut->lineTo(pathIn->pts[i+1].x + wdyNext, - pathIn->pts[i+1].y - wdxNext); - } - } - } - - pathOut->close(); - } - - // add stroke adjustment hints - if (state->strokeAdjust) { - if (i >= subpathStart + 1) { - if (i >= subpathStart + 2) { - pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0); - pathOut->addStrokeAdjustHint(left1, right1, join0, left2); - } else { - pathOut->addStrokeAdjustHint(left1, right1, firstPt, left2); - } - pathOut->addStrokeAdjustHint(left1, right1, right2 + 1, right2 + 1); - } - left0 = left1; - left1 = left2; - right0 = right1; - right1 = right2; - join0 = join1; - join1 = join2; - if (i == subpathStart) { - leftFirst = left2; - rightFirst = right2; - } - if (last) { - if (i >= subpathStart + 2) { - pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0); - pathOut->addStrokeAdjustHint(left1, right1, - join0, pathOut->length - 1); - } else { - pathOut->addStrokeAdjustHint(left1, right1, - firstPt, pathOut->length - 1); - } - if (closed) { - pathOut->addStrokeAdjustHint(left1, right1, firstPt, leftFirst); - pathOut->addStrokeAdjustHint(left1, right1, - rightFirst + 1, rightFirst + 1); - pathOut->addStrokeAdjustHint(leftFirst, rightFirst, - left1 + 1, right1); - pathOut->addStrokeAdjustHint(leftFirst, rightFirst, - join1, pathOut->length - 1); - } - } - } - } - - if (pathIn != path) { - delete pathIn; - } - - return pathOut; -} - -void Splash::dumpPath(SplashPath *path) { - int i; - - for (i = 0; i < path->length; ++i) { - printf(" %3d: x=%8.2f y=%8.2f%s%s%s%s\n", - i, (double)path->pts[i].x, (double)path->pts[i].y, - (path->flags[i] & splashPathFirst) ? " first" : "", - (path->flags[i] & splashPathLast) ? " last" : "", - (path->flags[i] & splashPathClosed) ? " closed" : "", - (path->flags[i] & splashPathCurve) ? " curve" : ""); - } -} - -void Splash::dumpXPath(SplashXPath *path) { - int i; - - for (i = 0; i < path->length; ++i) { - printf(" %4d: x0=%8.2f y0=%8.2f x1=%8.2f y1=%8.2f %s%s%s%s%s%s%s\n", - i, (double)path->segs[i].x0, (double)path->segs[i].y0, - (double)path->segs[i].x1, (double)path->segs[i].y1, - (path->segs[i].flags & splashXPathFirst) ? "F" : " ", - (path->segs[i].flags & splashXPathLast) ? "L" : " ", - (path->segs[i].flags & splashXPathEnd0) ? "0" : " ", - (path->segs[i].flags & splashXPathEnd1) ? "1" : " ", - (path->segs[i].flags & splashXPathHoriz) ? "H" : " ", - (path->segs[i].flags & splashXPathVert) ? "V" : " ", - (path->segs[i].flags & splashXPathFlip) ? "P" : " "); - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.h deleted file mode 100644 index c6246227c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Splash.h +++ /dev/null @@ -1,293 +0,0 @@ -//======================================================================== -// -// Splash.h -// -//======================================================================== - -#ifndef SPLASH_H -#define SPLASH_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" -#include "SplashClip.h" - -class Splash; -class SplashBitmap; -struct SplashGlyphBitmap; -class SplashState; -class SplashPattern; -class SplashScreen; -class SplashPath; -class SplashXPath; -class SplashFont; -struct SplashPipe; - -//------------------------------------------------------------------------ - -// Retrieves the next line of pixels in an image mask. Normally, -// fills in * and returns true. If the image stream is -// exhausted, returns false. -typedef GBool (*SplashImageMaskSource)(void *data, SplashColorPtr pixel); - -// Retrieves the next line of pixels in an image. Normally, fills in -// * and returns true. If the image stream is exhausted, -// returns false. -typedef GBool (*SplashImageSource)(void *data, SplashColorPtr colorLine, - Guchar *alphaLine); - -//------------------------------------------------------------------------ - -enum SplashPipeResultColorCtrl { -#if SPLASH_CMYK - splashPipeResultColorNoAlphaBlendCMYK, -#endif - splashPipeResultColorNoAlphaBlendRGB, - splashPipeResultColorNoAlphaBlendMono, - splashPipeResultColorAlphaNoBlendMono, - splashPipeResultColorAlphaNoBlendRGB, -#if SPLASH_CMYK - splashPipeResultColorAlphaNoBlendCMYK, -#endif - splashPipeResultColorAlphaBlendMono, - splashPipeResultColorAlphaBlendRGB -#if SPLASH_CMYK - , - splashPipeResultColorAlphaBlendCMYK -#endif -}; - -//------------------------------------------------------------------------ -// Splash -//------------------------------------------------------------------------ - -class Splash { -public: - - // Create a new rasterizer object. - Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, - SplashScreenParams *screenParams = NULL); - Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA, - SplashScreen *screenA); - - ~Splash(); - - //----- state read - - SplashCoord *getMatrix(); - SplashPattern *getStrokePattern(); - SplashPattern *getFillPattern(); - SplashScreen *getScreen(); - SplashBlendFunc getBlendFunc(); - SplashCoord getStrokeAlpha(); - SplashCoord getFillAlpha(); - SplashCoord getLineWidth(); - int getLineCap(); - int getLineJoin(); - SplashCoord getMiterLimit(); - SplashCoord getFlatness(); - SplashCoord *getLineDash(); - int getLineDashLength(); - SplashCoord getLineDashPhase(); - SplashClip *getClip(); - SplashBitmap *getSoftMask(); - GBool getInNonIsolatedGroup(); - - //----- state write - - void setMatrix(SplashCoord *matrix); - void setStrokePattern(SplashPattern *strokeColor); - void setFillPattern(SplashPattern *fillColor); - void setScreen(SplashScreen *screen); - void setBlendFunc(SplashBlendFunc func); - void setStrokeAlpha(SplashCoord alpha); - void setFillAlpha(SplashCoord alpha); - void setLineWidth(SplashCoord lineWidth); - void setLineCap(int lineCap); - void setLineJoin(int lineJoin); - void setMiterLimit(SplashCoord miterLimit); - void setFlatness(SplashCoord flatness); - // the array will be copied - void setLineDash(SplashCoord *lineDash, int lineDashLength, - SplashCoord lineDashPhase); - void setStrokeAdjust(GBool strokeAdjust); - // NB: uses transformed coordinates. - void clipResetToRect(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1); - // NB: uses transformed coordinates. - SplashError clipToRect(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1); - // NB: uses untransformed coordinates. - SplashError clipToPath(SplashPath *path, GBool eo); - void setSoftMask(SplashBitmap *softMask); - void setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA, - int alpha0XA, int alpha0YA); - - //----- state save/restore - - void saveState(); - SplashError restoreState(); - - //----- drawing operations - - // Fill the bitmap with . This is not subject to clipping. - void clear(SplashColorPtr color, Guchar alpha = 0x00); - - // Stroke a path using the current stroke pattern. - SplashError stroke(SplashPath *path); - - // Fill a path using the current fill pattern. - SplashError fill(SplashPath *path, GBool eo); - - // Fill a path, XORing with the current fill pattern. - SplashError xorFill(SplashPath *path, GBool eo); - - // Draw a character, using the current fill pattern. - SplashError fillChar(SplashCoord x, SplashCoord y, int c, SplashFont *font); - - // Draw a glyph, using the current fill pattern. This function does - // not free any data, i.e., it ignores glyph->freeData. - SplashError fillGlyph(SplashCoord x, SplashCoord y, - SplashGlyphBitmap *glyph); - - // Draws an image mask using the fill color. This will read - // lines of pixels from , starting with the top line. "1" - // pixels will be drawn with the current fill color; "0" pixels are - // transparent. The matrix: - // [ mat[0] mat[1] 0 ] - // [ mat[2] mat[3] 0 ] - // [ mat[4] mat[5] 1 ] - // maps a unit square to the desired destination for the image, in - // PostScript style: - // [x' y' 1] = [x y 1] * mat - // Note that the Splash y axis points downward, and the image source - // is assumed to produce pixels in raster order, starting from the - // top line. - SplashError fillImageMask(SplashImageMaskSource src, void *srcData, - int w, int h, SplashCoord *mat, - GBool glyphMode); - - // Draw an image. This will read lines of pixels from - // , starting with the top line. These pixels are assumed to - // be in the source mode, . If is true, the - // alpha values returned by are used; otherwise they are - // ignored. The following combinations of source and target modes - // are supported: - // source target - // ------ ------ - // Mono1 Mono1 - // Mono8 Mono1 -- with dithering - // Mono8 Mono8 - // RGB8 RGB8 - // BGR8 BGR8 - // CMYK8 CMYK8 - // The matrix behaves as for fillImageMask. - SplashError drawImage(SplashImageSource src, void *srcData, - SplashColorMode srcMode, GBool srcAlpha, - int w, int h, SplashCoord *mat); - - // Composite a rectangular region from onto this Splash - // object. - SplashError composite(SplashBitmap *src, int xSrc, int ySrc, - int xDest, int yDest, int w, int h, - GBool noClip, GBool nonIsolated); - - // Composite this Splash object onto a background color. The - // background alpha is assumed to be 1. - void compositeBackground(SplashColorPtr color); - - // Copy a rectangular region from onto the bitmap belonging to - // this Splash object. The destination alpha values are all set to - // zero. - SplashError blitTransparent(SplashBitmap *src, int xSrc, int ySrc, - int xDest, int yDest, int w, int h); - - //----- misc - - // Construct a path for a stroke, given the path to be stroked, and - // using the current line parameters. If is true, this - // function will first flatten the path and handle the linedash. - SplashPath *makeStrokePath(SplashPath *path, GBool flatten = gTrue); - - // Return the associated bitmap. - SplashBitmap *getBitmap() { return bitmap; } - - // Get a bounding box which includes all modifications since the - // last call to clearModRegion. - void getModRegion(int *xMin, int *yMin, int *xMax, int *yMax) - { *xMin = modXMin; *yMin = modYMin; *xMax = modXMax; *yMax = modYMax; } - - // Clear the modified region bounding box. - void clearModRegion(); - - // Get clipping status for the last drawing operation subject to - // clipping. - SplashClipResult getClipRes() { return opClipRes; } - - // Toggle debug mode on or off. - void setDebugMode(GBool debugModeA) { debugMode = debugModeA; } - -#if 1 //~tmp: turn off anti-aliasing temporarily - GBool getVectorAntialias() { return vectorAntialias; } - void setVectorAntialias(GBool vaa) { vectorAntialias = vaa; } -#endif - -private: - - void pipeInit(SplashPipe *pipe, int x, int y, - SplashPattern *pattern, SplashColorPtr cSrc, - SplashCoord aInput, GBool usesShape, - GBool nonIsolatedGroup); - void pipeRun(SplashPipe *pipe); - void pipeSetXY(SplashPipe *pipe, int x, int y); - void pipeIncX(SplashPipe *pipe); - void drawPixel(SplashPipe *pipe, int x, int y, GBool noClip); - void drawAAPixelInit(); - void drawAAPixel(SplashPipe *pipe, int x, int y); - void drawSpan(SplashPipe *pipe, int x0, int x1, int y, GBool noClip); - void drawAALine(SplashPipe *pipe, int x0, int x1, int y); - void transform(SplashCoord *matrix, SplashCoord xi, SplashCoord yi, - SplashCoord *xo, SplashCoord *yo); - void updateModX(int x); - void updateModY(int y); - void strokeNarrow(SplashPath *path); - void strokeWide(SplashPath *path); - SplashPath *flattenPath(SplashPath *path, SplashCoord *matrix, - SplashCoord flatness); - void flattenCurve(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1, - SplashCoord x2, SplashCoord y2, - SplashCoord x3, SplashCoord y3, - SplashCoord *matrix, SplashCoord flatness2, - SplashPath *fPath); - SplashPath *makeDashedPath(SplashPath *xPath); - SplashError fillWithPattern(SplashPath *path, GBool eo, - SplashPattern *pattern, SplashCoord alpha); - SplashError fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph); - void dumpPath(SplashPath *path); - void dumpXPath(SplashXPath *path); - - static SplashPipeResultColorCtrl pipeResultColorNoAlphaBlend[]; - static SplashPipeResultColorCtrl pipeResultColorAlphaNoBlend[]; - static SplashPipeResultColorCtrl pipeResultColorAlphaBlend[]; - static int pipeNonIsoGroupCorrection[]; - - SplashBitmap *bitmap; - SplashState *state; - SplashBitmap *aaBuf; - int aaBufY; - SplashBitmap *alpha0Bitmap; // for non-isolated groups, this is the - // bitmap containing the alpha0 values - int alpha0X, alpha0Y; // offset within alpha0Bitmap - SplashCoord aaGamma[splashAASize * splashAASize + 1]; - int modXMin, modYMin, modXMax, modYMax; - SplashClipResult opClipRes; - GBool vectorAntialias; - GBool debugMode; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.cc deleted file mode 100644 index 0cb1a752a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.cc +++ /dev/null @@ -1,188 +0,0 @@ -//======================================================================== -// -// SplashBitmap.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "gmem.h" -#include "SplashErrorCodes.h" -#include "SplashBitmap.h" - -//------------------------------------------------------------------------ -// SplashBitmap -//------------------------------------------------------------------------ - -SplashBitmap::SplashBitmap(int widthA, int heightA, int rowPad, - SplashColorMode modeA, GBool alphaA, - GBool topDown) { - width = widthA; - height = heightA; - mode = modeA; - switch (mode) { - case splashModeMono1: - rowSize = (width + 7) >> 3; - break; - case splashModeMono8: - rowSize = width; - break; - case splashModeRGB8: - case splashModeBGR8: - rowSize = width * 3; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - rowSize = width * 4; - break; -#endif - } - rowSize += rowPad - 1; - rowSize -= rowSize % rowPad; - data = (SplashColorPtr)gmalloc(rowSize * height); - if (!topDown) { - data += (height - 1) * rowSize; - rowSize = -rowSize; - } - if (alphaA) { - alpha = (Guchar *)gmalloc(width * height); - } else { - alpha = NULL; - } -} - - -SplashBitmap::~SplashBitmap() { - if (rowSize < 0) { - gfree(data + (height - 1) * rowSize); - } else { - gfree(data); - } - gfree(alpha); -} - -SplashError SplashBitmap::writePNMFile(char *fileName) { - FILE *f; - SplashColorPtr row, p; - int x, y; - - if (!(f = fopen(fileName, "wb"))) { - return splashErrOpenFile; - } - - switch (mode) { - - case splashModeMono1: - fprintf(f, "P4\n%d %d\n", width, height); - row = data; - for (y = 0; y < height; ++y) { - p = row; - for (x = 0; x < width; x += 8) { - fputc(*p ^ 0xff, f); - ++p; - } - row += rowSize; - } - break; - - case splashModeMono8: - fprintf(f, "P5\n%d %d\n255\n", width, height); - row = data; - for (y = 0; y < height; ++y) { - p = row; - for (x = 0; x < width; ++x) { - fputc(*p, f); - ++p; - } - row += rowSize; - } - break; - - case splashModeRGB8: - fprintf(f, "P6\n%d %d\n255\n", width, height); - row = data; - for (y = 0; y < height; ++y) { - p = row; - for (x = 0; x < width; ++x) { - fputc(splashRGB8R(p), f); - fputc(splashRGB8G(p), f); - fputc(splashRGB8B(p), f); - p += 3; - } - row += rowSize; - } - break; - - case splashModeBGR8: - fprintf(f, "P6\n%d %d\n255\n", width, height); - row = data; - for (y = 0; y < height; ++y) { - p = row; - for (x = 0; x < width; ++x) { - fputc(splashBGR8R(p), f); - fputc(splashBGR8G(p), f); - fputc(splashBGR8B(p), f); - p += 3; - } - row += rowSize; - } - break; - -#if SPLASH_CMYK - case splashModeCMYK8: - // PNM doesn't support CMYK - break; -#endif - } - - fclose(f); - return splashOk; -} - -void SplashBitmap::getPixel(int x, int y, SplashColorPtr pixel) { - SplashColorPtr p; - - if (y < 0 || y >= height || x < 0 || x >= width) { - return; - } - switch (mode) { - case splashModeMono1: - p = &data[y * rowSize + (x >> 3)]; - pixel[0] = (p[0] & (0x80 >> (x & 7))) ? 0xff : 0x00; - break; - case splashModeMono8: - p = &data[y * rowSize + x]; - pixel[0] = p[0]; - break; - case splashModeRGB8: - p = &data[y * rowSize + 3 * x]; - pixel[0] = p[0]; - pixel[1] = p[1]; - pixel[2] = p[2]; - break; - case splashModeBGR8: - p = &data[y * rowSize + 3 * x]; - pixel[0] = p[2]; - pixel[1] = p[1]; - pixel[2] = p[0]; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - p = &data[y * rowSize + 4 * x]; - pixel[0] = p[0]; - pixel[1] = p[1]; - pixel[2] = p[2]; - pixel[3] = p[3]; - break; -#endif - } -} - -Guchar SplashBitmap::getAlpha(int x, int y) { - return alpha[y * width + x]; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.h deleted file mode 100644 index 69ab058e5..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashBitmap.h +++ /dev/null @@ -1,61 +0,0 @@ -//======================================================================== -// -// SplashBitmap.h -// -//======================================================================== - -#ifndef SPLASHBITMAP_H -#define SPLASHBITMAP_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" - -//------------------------------------------------------------------------ -// SplashBitmap -//------------------------------------------------------------------------ - -class SplashBitmap { -public: - - // Create a new bitmap. It will have x pixels in - // color mode . Rows will be padded out to a multiple of - // bytes. If is false, the bitmap will be stored - // upside-down, i.e., with the last row first in memory. - SplashBitmap(int widthA, int heightA, int rowPad, - SplashColorMode modeA, GBool alphaA, - GBool topDown = gTrue); - - ~SplashBitmap(); - - int getWidth() { return width; } - int getHeight() { return height; } - int getRowSize() { return rowSize; } - int getAlphaRowSize() { return width; } - SplashColorMode getMode() { return mode; } - SplashColorPtr getDataPtr() { return data; } - Guchar *getAlphaPtr() { return alpha; } - - SplashError writePNMFile(char *fileName); - - void getPixel(int x, int y, SplashColorPtr pixel); - Guchar getAlpha(int x, int y); - -private: - - int width, height; // size of bitmap - int rowSize; // size of one row of data, in bytes - // - negative for bottom-up bitmaps - SplashColorMode mode; // color mode - SplashColorPtr data; // pointer to row zero of the color data - Guchar *alpha; // pointer to row zero of the alpha data - // (always top-down) - - friend class Splash; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.cc deleted file mode 100644 index ef8acbabd..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.cc +++ /dev/null @@ -1,382 +0,0 @@ -//======================================================================== -// -// SplashClip.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "SplashErrorCodes.h" -#include "SplashPath.h" -#include "SplashXPath.h" -#include "SplashXPathScanner.h" -#include "SplashBitmap.h" -#include "SplashClip.h" - -//------------------------------------------------------------------------ -// SplashClip.flags -//------------------------------------------------------------------------ - -#define splashClipEO 0x01 // use even-odd rule - -//------------------------------------------------------------------------ -// SplashClip -//------------------------------------------------------------------------ - -SplashClip::SplashClip(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1, - GBool antialiasA) { - antialias = antialiasA; - if (x0 < x1) { - xMin = x0; - xMax = x1; - } else { - xMin = x1; - xMax = x0; - } - if (y0 < y1) { - yMin = y0; - yMax = y1; - } else { - yMin = y1; - yMax = y0; - } - xMinI = splashFloor(xMin); - yMinI = splashFloor(yMin); - xMaxI = splashFloor(xMax); - yMaxI = splashFloor(yMax); - paths = NULL; - flags = NULL; - scanners = NULL; - length = size = 0; -} - -SplashClip::SplashClip(SplashClip *clip) { - int i; - - antialias = clip->antialias; - xMin = clip->xMin; - yMin = clip->yMin; - xMax = clip->xMax; - yMax = clip->yMax; - xMinI = clip->xMinI; - yMinI = clip->yMinI; - xMaxI = clip->xMaxI; - yMaxI = clip->yMaxI; - length = clip->length; - size = clip->size; - paths = (SplashXPath **)gmallocn(size, sizeof(SplashXPath *)); - flags = (Guchar *)gmallocn(size, sizeof(Guchar)); - scanners = (SplashXPathScanner **) - gmallocn(size, sizeof(SplashXPathScanner *)); - for (i = 0; i < length; ++i) { - paths[i] = clip->paths[i]->copy(); - flags[i] = clip->flags[i]; - scanners[i] = new SplashXPathScanner(paths[i], flags[i] & splashClipEO); - } -} - -SplashClip::~SplashClip() { - int i; - - for (i = 0; i < length; ++i) { - delete paths[i]; - delete scanners[i]; - } - gfree(paths); - gfree(flags); - gfree(scanners); -} - -void SplashClip::grow(int nPaths) { - if (length + nPaths > size) { - if (size == 0) { - size = 32; - } - while (size < length + nPaths) { - size *= 2; - } - paths = (SplashXPath **)greallocn(paths, size, sizeof(SplashXPath *)); - flags = (Guchar *)greallocn(flags, size, sizeof(Guchar)); - scanners = (SplashXPathScanner **) - greallocn(scanners, size, sizeof(SplashXPathScanner *)); - } -} - -void SplashClip::resetToRect(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1) { - int i; - - for (i = 0; i < length; ++i) { - delete paths[i]; - delete scanners[i]; - } - gfree(paths); - gfree(flags); - gfree(scanners); - paths = NULL; - flags = NULL; - scanners = NULL; - length = size = 0; - - if (x0 < x1) { - xMin = x0; - xMax = x1; - } else { - xMin = x1; - xMax = x0; - } - if (y0 < y1) { - yMin = y0; - yMax = y1; - } else { - yMin = y1; - yMax = y0; - } - xMinI = splashFloor(xMin); - yMinI = splashFloor(yMin); - xMaxI = splashFloor(xMax); - yMaxI = splashFloor(yMax); -} - -SplashError SplashClip::clipToRect(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1) { - if (x0 < x1) { - if (x0 > xMin) { - xMin = x0; - xMinI = splashFloor(xMin); - } - if (x1 < xMax) { - xMax = x1; - xMaxI = splashFloor(xMax); - } - } else { - if (x1 > xMin) { - xMin = x1; - xMinI = splashFloor(xMin); - } - if (x0 < xMax) { - xMax = x0; - xMaxI = splashFloor(xMax); - } - } - if (y0 < y1) { - if (y0 > yMin) { - yMin = y0; - yMinI = splashFloor(yMin); - } - if (y1 < yMax) { - yMax = y1; - yMaxI = splashFloor(yMax); - } - } else { - if (y1 > yMin) { - yMin = y1; - yMinI = splashFloor(yMin); - } - if (y0 < yMax) { - yMax = y0; - yMaxI = splashFloor(yMax); - } - } - return splashOk; -} - -SplashError SplashClip::clipToPath(SplashPath *path, SplashCoord *matrix, - SplashCoord flatness, GBool eo) { - SplashXPath *xPath; - - xPath = new SplashXPath(path, matrix, flatness, gTrue); - - // check for an empty path - if (xPath->length == 0) { - xMax = xMin - 1; - yMax = yMin - 1; - xMaxI = splashFloor(xMax); - yMaxI = splashFloor(yMax); - delete xPath; - - // check for a rectangle - } else if (xPath->length == 4 && - ((xPath->segs[0].x0 == xPath->segs[0].x1 && - xPath->segs[0].x0 == xPath->segs[1].x0 && - xPath->segs[0].x0 == xPath->segs[3].x1 && - xPath->segs[2].x0 == xPath->segs[2].x1 && - xPath->segs[2].x0 == xPath->segs[1].x1 && - xPath->segs[2].x0 == xPath->segs[3].x0 && - xPath->segs[1].y0 == xPath->segs[1].y1 && - xPath->segs[1].y0 == xPath->segs[0].y1 && - xPath->segs[1].y0 == xPath->segs[2].y0 && - xPath->segs[3].y0 == xPath->segs[3].y1 && - xPath->segs[3].y0 == xPath->segs[0].y0 && - xPath->segs[3].y0 == xPath->segs[2].y1) || - (xPath->segs[0].y0 == xPath->segs[0].y1 && - xPath->segs[0].y0 == xPath->segs[1].y0 && - xPath->segs[0].y0 == xPath->segs[3].y1 && - xPath->segs[2].y0 == xPath->segs[2].y1 && - xPath->segs[2].y0 == xPath->segs[1].y1 && - xPath->segs[2].y0 == xPath->segs[3].y0 && - xPath->segs[1].x0 == xPath->segs[1].x1 && - xPath->segs[1].x0 == xPath->segs[0].x1 && - xPath->segs[1].x0 == xPath->segs[2].x0 && - xPath->segs[3].x0 == xPath->segs[3].x1 && - xPath->segs[3].x0 == xPath->segs[0].x0 && - xPath->segs[3].x0 == xPath->segs[2].x1))) { - clipToRect(xPath->segs[0].x0, xPath->segs[0].y0, - xPath->segs[2].x0, xPath->segs[2].y0); - delete xPath; - - } else { - grow(1); - if (antialias) { - xPath->aaScale(); - } - xPath->sort(); - paths[length] = xPath; - flags[length] = eo ? splashClipEO : 0; - scanners[length] = new SplashXPathScanner(xPath, eo); - ++length; - } - - return splashOk; -} - -GBool SplashClip::test(int x, int y) { - int i; - - // check the rectangle - if (x < xMinI || x > xMaxI || y < yMinI || y > yMaxI) { - return gFalse; - } - - // check the paths - if (antialias) { - for (i = 0; i < length; ++i) { - if (!scanners[i]->test(x * splashAASize, y * splashAASize)) { - return gFalse; - } - } - } else { - for (i = 0; i < length; ++i) { - if (!scanners[i]->test(x, y)) { - return gFalse; - } - } - } - - return gTrue; -} - -SplashClipResult SplashClip::testRect(int rectXMin, int rectYMin, - int rectXMax, int rectYMax) { - // This tests the rectangle: - // x = [rectXMin, rectXMax + 1) (note: rect coords are ints) - // y = [rectYMin, rectYMax + 1) - // against the clipping region: - // x = [xMin, xMax] (note: clipping coords are fp) - // y = [yMin, yMax] - if ((SplashCoord)(rectXMax + 1) <= xMin || (SplashCoord)rectXMin > xMax || - (SplashCoord)(rectYMax + 1) <= yMin || (SplashCoord)rectYMin > yMax) { - return splashClipAllOutside; - } - if ((SplashCoord)rectXMin >= xMin && (SplashCoord)(rectXMax + 1) <= xMax && - (SplashCoord)rectYMin >= yMin && (SplashCoord)(rectYMax + 1) <= yMax && - length == 0) { - return splashClipAllInside; - } - return splashClipPartial; -} - -SplashClipResult SplashClip::testSpan(int spanXMin, int spanXMax, int spanY) { - int i; - - // This tests the rectangle: - // x = [spanXMin, spanXMax + 1) (note: span coords are ints) - // y = [spanY, spanY + 1) - // against the clipping region: - // x = [xMin, xMax] (note: clipping coords are fp) - // y = [yMin, yMax] - if ((SplashCoord)(spanXMax + 1) <= xMin || (SplashCoord)spanXMin > xMax || - (SplashCoord)(spanY + 1) <= yMin || (SplashCoord)spanY > yMax) { - return splashClipAllOutside; - } - if (!((SplashCoord)spanXMin >= xMin && (SplashCoord)(spanXMax + 1) <= xMax && - (SplashCoord)spanY >= yMin && (SplashCoord)(spanY + 1) <= yMax)) { - return splashClipPartial; - } - if (antialias) { - for (i = 0; i < length; ++i) { - if (!scanners[i]->testSpan(spanXMin * splashAASize, - spanXMax * splashAASize + (splashAASize - 1), - spanY * splashAASize)) { - return splashClipPartial; - } - } - } else { - for (i = 0; i < length; ++i) { - if (!scanners[i]->testSpan(spanXMin, spanXMax, spanY)) { - return splashClipPartial; - } - } - } - return splashClipAllInside; -} - -void SplashClip::clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y) { - int xx0, xx1, xx, yy, i; - SplashColorPtr p; - - // zero out pixels with x < xMin - xx0 = *x0 * splashAASize; - xx1 = splashFloor(xMin * splashAASize); - if (xx1 > aaBuf->getWidth()) { - xx1 = aaBuf->getWidth(); - } - if (xx0 < xx1) { - xx0 &= ~7; - for (yy = 0; yy < splashAASize; ++yy) { - p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx0 >> 3); - for (xx = xx0; xx + 7 < xx1; xx += 8) { - *p++ = 0; - } - if (xx < xx1) { - *p &= 0xff >> (xx1 & 7); - } - } - *x0 = splashFloor(xMin); - } - - // zero out pixels with x > xMax - xx0 = splashFloor(xMax * splashAASize) + 1; - if (xx0 < 0) { - xx0 = 0; - } - xx1 = (*x1 + 1) * splashAASize; - if (xx0 < xx1) { - for (yy = 0; yy < splashAASize; ++yy) { - p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx0 >> 3); - xx = xx0; - if (xx & 7) { - *p &= 0xff00 >> (xx & 7); - xx = (xx & ~7) + 8; - ++p; - } - for (; xx < xx1; xx += 8) { - *p++ = 0; - } - } - *x1 = splashFloor(xMax); - } - - // check the paths - for (i = 0; i < length; ++i) { - scanners[i]->clipAALine(aaBuf, x0, x1, y); - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.h deleted file mode 100644 index 8ae2154bf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashClip.h +++ /dev/null @@ -1,107 +0,0 @@ -//======================================================================== -// -// SplashClip.h -// -//======================================================================== - -#ifndef SPLASHCLIP_H -#define SPLASHCLIP_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" -#include "SplashMath.h" - -class SplashPath; -class SplashXPath; -class SplashXPathScanner; -class SplashBitmap; - -//------------------------------------------------------------------------ - -enum SplashClipResult { - splashClipAllInside, - splashClipAllOutside, - splashClipPartial -}; - -//------------------------------------------------------------------------ -// SplashClip -//------------------------------------------------------------------------ - -class SplashClip { -public: - - // Create a clip, for the given rectangle. - SplashClip(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1, - GBool antialiasA); - - // Copy a clip. - SplashClip *copy() { return new SplashClip(this); } - - ~SplashClip(); - - // Reset the clip to a rectangle. - void resetToRect(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1); - - // Intersect the clip with a rectangle. - SplashError clipToRect(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1); - - // Interesect the clip with . - SplashError clipToPath(SplashPath *path, SplashCoord *matrix, - SplashCoord flatness, GBool eo); - - // Returns true if (,) is inside the clip. - GBool test(int x, int y); - - // Tests a rectangle against the clipping region. Returns one of: - // - splashClipAllInside if the entire rectangle is inside the - // clipping region, i.e., all pixels in the rectangle are - // visible - // - splashClipAllOutside if the entire rectangle is outside the - // clipping region, i.e., all the pixels in the rectangle are - // clipped - // - splashClipPartial if the rectangle is part inside and part - // outside the clipping region - SplashClipResult testRect(int rectXMin, int rectYMin, - int rectXMax, int rectYMax); - - // Similar to testRect, but tests a horizontal span. - SplashClipResult testSpan(int spanXMin, int spanXMax, int spanY); - - // Clips an anti-aliased line by setting pixels to zero. On entry, - // all non-zero pixels are between and . This function - // will update and . - void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); - - // Get the rectangle part of the clip region, in integer coordinates. - int getXMinI() { return xMinI; } - int getXMaxI() { return xMaxI; } - int getYMinI() { return yMinI; } - int getYMaxI() { return yMaxI; } - - // Get the number of arbitrary paths used by the clip region. - int getNumPaths() { return length; } - -private: - - SplashClip(SplashClip *clip); - void grow(int nPaths); - - GBool antialias; - SplashCoord xMin, yMin, xMax, yMax; - int xMinI, yMinI, xMaxI, yMaxI; - SplashXPath **paths; - Guchar *flags; - SplashXPathScanner **scanners; - int length, size; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashErrorCodes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashErrorCodes.h deleted file mode 100644 index 2a70d4b77..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashErrorCodes.h +++ /dev/null @@ -1,32 +0,0 @@ -//======================================================================== -// -// SplashErrorCodes.h -// -//======================================================================== - -#ifndef SPLASHERRORCODES_H -#define SPLASHERRORCODES_H - -#include - -//------------------------------------------------------------------------ - -#define splashOk 0 // no error - -#define splashErrNoCurPt 1 // no current point - -#define splashErrEmptyPath 2 // zero points in path - -#define splashErrBogusPath 3 // only one point in subpath - -#define splashErrNoSave 4 // state stack is empty - -#define splashErrOpenFile 5 // couldn't open file - -#define splashErrNoGlyph 6 // couldn't get the requested glyph - -#define splashErrModeMismatch 7 // invalid combination of color modes - -#define splashErrSingularMatrix 8 // matrix is singular - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.cc deleted file mode 100644 index c46c77038..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.cc +++ /dev/null @@ -1,379 +0,0 @@ -//======================================================================== -// -// SplashFTFont.cc -// -//======================================================================== - -#include - -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include FT_OUTLINE_H -#include FT_SIZES_H -#include FT_GLYPH_H -#include "gmem.h" -#include "SplashMath.h" -#include "SplashGlyphBitmap.h" -#include "SplashPath.h" -#include "SplashFTFontEngine.h" -#include "SplashFTFontFile.h" -#include "SplashFTFont.h" - -//------------------------------------------------------------------------ - -static int glyphPathMoveTo(const FT_Vector *pt, void *path); -static int glyphPathLineTo(const FT_Vector *pt, void *path); -static int glyphPathConicTo(const FT_Vector *ctrl, const FT_Vector *pt, - void *path); -static int glyphPathCubicTo(const FT_Vector *ctrl1, const FT_Vector *ctrl2, - const FT_Vector *pt, void *path); - -//------------------------------------------------------------------------ -// SplashFTFont -//------------------------------------------------------------------------ - -SplashFTFont::SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA, - SplashCoord *textMatA): - SplashFont(fontFileA, matA, textMatA, fontFileA->engine->aa) -{ - FT_Face face; - SplashCoord size, div; - int x, y; - - face = fontFileA->face; - - if (FT_New_Size(face, &sizeObj)) { - return; - } - face->size = sizeObj; - size = splashSqrt(mat[2]*mat[2] + mat[3]*mat[3]); - if (FT_Set_Pixel_Sizes(face, 0, (int)size)) { - return; - } - - this->ascender = face->ascender; - this->descender = face->descender; - - // if the textMat values are too small, FreeType's fixed point - // arithmetic doesn't work so well - textScale = splashSqrt(textMat[2]*textMat[2] + textMat[3]*textMat[3]) / size; - - div = face->bbox.xMax > 20000 ? 65536 : 1; - - // transform the four corners of the font bounding box -- the min - // and max values form the bounding box of the transformed font - x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMin) / - (div * face->units_per_EM)); - xMin = xMax = x; - y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMin) / - (div * face->units_per_EM)); - yMin = yMax = y; - x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMax) / - (div * face->units_per_EM)); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMax) / - (div * face->units_per_EM)); - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMin) / - (div * face->units_per_EM)); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMin) / - (div * face->units_per_EM)); - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMax) / - (div * face->units_per_EM)); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMax) / - (div * face->units_per_EM)); - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - // This is a kludge: some buggy PDF generators embed fonts with - // zero bounding boxes. - if (xMax == xMin) { - xMin = 0; - xMax = (int)size; - } - if (yMax == yMin) { - yMin = 0; - yMax = (int)((SplashCoord)1.2 * size); - } - - // compute the transform matrix -#if USE_FIXEDPOINT - matrix.xx = (FT_Fixed)((mat[0] / size).getRaw()); - matrix.yx = (FT_Fixed)((mat[1] / size).getRaw()); - matrix.xy = (FT_Fixed)((mat[2] / size).getRaw()); - matrix.yy = (FT_Fixed)((mat[3] / size).getRaw()); - textMatrix.xx = (FT_Fixed)((textMat[0] / (size * textScale)).getRaw()); - textMatrix.yx = (FT_Fixed)((textMat[1] / (size * textScale)).getRaw()); - textMatrix.xy = (FT_Fixed)((textMat[2] / (size * textScale)).getRaw()); - textMatrix.yy = (FT_Fixed)((textMat[3] / (size * textScale)).getRaw()); -#else - matrix.xx = (FT_Fixed)((mat[0] / size) * 65536); - matrix.yx = (FT_Fixed)((mat[1] / size) * 65536); - matrix.xy = (FT_Fixed)((mat[2] / size) * 65536); - matrix.yy = (FT_Fixed)((mat[3] / size) * 65536); - textMatrix.xx = (FT_Fixed)((textMat[0] / (size * textScale)) * 65536); - textMatrix.yx = (FT_Fixed)((textMat[1] / (size * textScale)) * 65536); - textMatrix.xy = (FT_Fixed)((textMat[2] / (size * textScale)) * 65536); - textMatrix.yy = (FT_Fixed)((textMat[3] / (size * textScale)) * 65536); -#endif -} - -SplashFTFont::~SplashFTFont() { -} - -GBool SplashFTFont::getGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap) { - return SplashFont::getGlyph(c, xFrac, 0, bitmap); -} - -GBool SplashFTFont::makeGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap) { - SplashFTFontFile *ff; - FT_Vector offset; - FT_GlyphSlot slot; - FT_UInt gid; - int rowSize; - Guchar *p, *q; - int i; - - ff = (SplashFTFontFile *)fontFile; - - ff->face->size = sizeObj; - offset.x = (FT_Pos)(int)((SplashCoord)xFrac * splashFontFractionMul * 64); - offset.y = 0; - FT_Set_Transform(ff->face, &matrix, &offset); - slot = ff->face->glyph; - - if (ff->codeToGID && c < ff->codeToGIDLen) { - gid = (FT_UInt)ff->codeToGID[c]; - } else { - gid = (FT_UInt)c; - } - if (ff->trueType && gid == 0) { - // skip the TrueType notdef glyph - return gFalse; - } - - // if we have the FT2 bytecode interpreter, autohinting won't be used -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - if (FT_Load_Glyph(ff->face, gid, - aa ? FT_LOAD_NO_BITMAP : FT_LOAD_DEFAULT)) { - return gFalse; - } -#else - // FT2's autohinting doesn't always work very well (especially with - // font subsets), so turn it off if anti-aliasing is enabled; if - // anti-aliasing is disabled, this seems to be a tossup - some fonts - // look better with hinting, some without, so leave hinting on - if (FT_Load_Glyph(ff->face, gid, - aa ? FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP - : FT_LOAD_DEFAULT)) { - return gFalse; - } -#endif - if (FT_Render_Glyph(slot, aa ? ft_render_mode_normal - : ft_render_mode_mono)) { - return gFalse; - } - - bitmap->x = -slot->bitmap_left; - bitmap->y = slot->bitmap_top; - bitmap->w = slot->bitmap.width; - bitmap->h = slot->bitmap.rows; - bitmap->aa = aa; - if (aa) { - rowSize = bitmap->w; - } else { - rowSize = (bitmap->w + 7) >> 3; - } - bitmap->data = (Guchar *)gmalloc(rowSize * bitmap->h); - bitmap->freeData = gTrue; - for (i = 0, p = bitmap->data, q = slot->bitmap.buffer; - i < bitmap->h; - ++i, p += rowSize, q += slot->bitmap.pitch) { - memcpy(p, q, rowSize); - } - - return gTrue; -} - -struct SplashFTFontPath { - SplashPath *path; - SplashCoord textScale; - GBool needClose; -}; - -int SplashFTFont::getNumChars() -{ - SplashFTFontFile* ff = (SplashFTFontFile *)fontFile; - return ff->face->num_glyphs; -} - -SplashPath *SplashFTFont::getGlyphPath(int c) { - static FT_Outline_Funcs outlineFuncs = { -#if FREETYPE_MINOR <= 1 - (int (*)(FT_Vector *, void *))&glyphPathMoveTo, - (int (*)(FT_Vector *, void *))&glyphPathLineTo, - (int (*)(FT_Vector *, FT_Vector *, void *))&glyphPathConicTo, - (int (*)(FT_Vector *, FT_Vector *, FT_Vector *, void *))&glyphPathCubicTo, -#else - &glyphPathMoveTo, - &glyphPathLineTo, - &glyphPathConicTo, - &glyphPathCubicTo, -#endif - 0, 0 - }; - SplashFTFontFile *ff; - SplashFTFontPath path; - FT_GlyphSlot slot; - FT_UInt gid; - FT_Glyph glyph; - - this->last_advance = -1; - - ff = (SplashFTFontFile *)fontFile; - ff->face->size = sizeObj; - FT_Set_Transform(ff->face, &textMatrix, NULL); - slot = ff->face->glyph; - if (ff->codeToGID && c < ff->codeToGIDLen) { - gid = ff->codeToGID[c]; - } else { - gid = (FT_UInt)c; - } - if (ff->trueType && gid == 0) { - // skip the TrueType notdef glyph - return NULL; - } - int error = 0; - if ((error=FT_Load_Glyph(ff->face, gid, FT_LOAD_NO_BITMAP))) { - if ((error=FT_Load_Glyph(ff->face, gid, FT_LOAD_NO_BITMAP|FT_LOAD_NO_HINTING))) { - fprintf(stderr, "Truetype wasn't able to load glyph %d, error %d\n", gid, error); - return NULL; - } - } - if (FT_Get_Glyph(slot, &glyph)) { - return NULL; - } - this->last_advance = glyph->advance.x/65536.0; - - path.path = new SplashPath(); - path.textScale = textScale; - path.needClose = gFalse; - error = FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline, - &outlineFuncs, &path); - if(error) { - fprintf(stderr, "Truetype wasn't able to read glyph %d, error %d\n", gid, error); - } - if (path.needClose) { - path.path->close(); - } - FT_Done_Glyph(glyph); - return path.path; -} - -static int glyphPathMoveTo(const FT_Vector *pt, void *path) { - SplashFTFontPath *p = (SplashFTFontPath *)path; - - if (p->needClose) { - p->path->close(); - p->needClose = gFalse; - } - p->path->moveTo((SplashCoord)pt->x * p->textScale / 64.0, - (SplashCoord)pt->y * p->textScale / 64.0); - return 0; -} - -static int glyphPathLineTo(const FT_Vector *pt, void *path) { - SplashFTFontPath *p = (SplashFTFontPath *)path; - - p->path->lineTo((SplashCoord)pt->x * p->textScale / 64.0, - (SplashCoord)pt->y * p->textScale / 64.0); - p->needClose = gTrue; - return 0; -} - -static int glyphPathConicTo(const FT_Vector *ctrl, const FT_Vector *pt, - void *path) { - SplashFTFontPath *p = (SplashFTFontPath *)path; - SplashCoord x0, y0, x1, y1, x2, y2, x3, y3, xc, yc; - - if (!p->path->getCurPt(&x0, &y0)) { - return 0; - } - xc = (SplashCoord)ctrl->x * p->textScale / 64.0; - yc = (SplashCoord)ctrl->y * p->textScale / 64.0; - x3 = (SplashCoord)pt->x * p->textScale / 64.0; - y3 = (SplashCoord)pt->y * p->textScale / 64.0; - - // A second-order Bezier curve is defined by two endpoints, p0 and - // p3, and one control point, pc: - // - // p(t) = (1-t)^2*p0 + t*(1-t)*pc + t^2*p3 - // - // A third-order Bezier curve is defined by the same two endpoints, - // p0 and p3, and two control points, p1 and p2: - // - // p(t) = (1-t)^3*p0 + 3t*(1-t)^2*p1 + 3t^2*(1-t)*p2 + t^3*p3 - // - // Applying some algebra, we can convert a second-order curve to a - // third-order curve: - // - // p1 = (1/3) * (p0 + 2pc) - // p2 = (1/3) * (2pc + p3) - - x1 = (SplashCoord)(1.0 / 3.0) * (x0 + (SplashCoord)2 * xc); - y1 = (SplashCoord)(1.0 / 3.0) * (y0 + (SplashCoord)2 * yc); - x2 = (SplashCoord)(1.0 / 3.0) * ((SplashCoord)2 * xc + x3); - y2 = (SplashCoord)(1.0 / 3.0) * ((SplashCoord)2 * yc + y3); - - p->path->curveTo(x1, y1, x2, y2, x3, y3); - p->needClose = gTrue; - return 0; -} - -static int glyphPathCubicTo(const FT_Vector *ctrl1, const FT_Vector *ctrl2, - const FT_Vector *pt, void *path) { - SplashFTFontPath *p = (SplashFTFontPath *)path; - - p->path->curveTo((SplashCoord)ctrl1->x * p->textScale / 64.0, - (SplashCoord)ctrl1->y * p->textScale / 64.0, - (SplashCoord)ctrl2->x * p->textScale / 64.0, - (SplashCoord)ctrl2->y * p->textScale / 64.0, - (SplashCoord)pt->x * p->textScale / 64.0, - (SplashCoord)pt->y * p->textScale / 64.0); - p->needClose = gTrue; - return 0; -} - -#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.h deleted file mode 100644 index 8ca0cd19e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFont.h +++ /dev/null @@ -1,61 +0,0 @@ -//======================================================================== -// -// SplashFTFont.h -// -//======================================================================== - -#ifndef SPLASHFTFONT_H -#define SPLASHFTFONT_H - -#include - -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include FT_FREETYPE_H -#include "SplashFont.h" - -class SplashFTFontFile; - -//------------------------------------------------------------------------ -// SplashFTFont -//------------------------------------------------------------------------ - -class SplashFTFont: public SplashFont { -public: - - SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA, - SplashCoord *textMatA); - - virtual ~SplashFTFont(); - - // Munge xFrac and yFrac before calling SplashFont::getGlyph. - virtual GBool getGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap); - - // Rasterize a glyph. The and values are the same - // as described for getGlyph. - virtual GBool makeGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap); - - // return the number of characters in this font - virtual int getNumChars(); - - // Return the path for a glyph. - virtual SplashPath *getGlyphPath(int c); - -private: - - FT_Size sizeObj; - FT_Matrix matrix; - FT_Matrix textMatrix; - SplashCoord textScale; -}; - -#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.cc deleted file mode 100644 index 0e23a7531..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.cc +++ /dev/null @@ -1,177 +0,0 @@ -//======================================================================== -// -// SplashFTFontEngine.cc -// -//======================================================================== - -#include - -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -# include -#include "gmem.h" -#include "GString.h" -#include "gfile.h" -#include "FoFiTrueType.h" -#include "FoFiType1C.h" -#include "SplashFTFontFile.h" -#include "SplashFTFontEngine.h" - -#ifdef VMS -#if (__VMS_VER < 70000000) -extern "C" int unlink(char *filename); -#endif -#endif - -//------------------------------------------------------------------------ - -static void fileWrite(void *stream, char *data, int len) { - fwrite(data, 1, len, (FILE *)stream); -} - -//------------------------------------------------------------------------ -// SplashFTFontEngine -//------------------------------------------------------------------------ - -SplashFTFontEngine::SplashFTFontEngine(GBool aaA, FT_Library libA) { - FT_Int major, minor, patch; - - aa = aaA; - lib = libA; - - // as of FT 2.1.8, CID fonts are indexed by CID instead of GID - FT_Library_Version(lib, &major, &minor, &patch); - useCIDs = major > 2 || - (major == 2 && (minor > 1 || (minor == 1 && patch > 7))); -} - -SplashFTFontEngine *SplashFTFontEngine::init(GBool aaA) { - FT_Library libA; - - if (FT_Init_FreeType(&libA)) { - return NULL; - } - return new SplashFTFontEngine(aaA, libA); -} - -SplashFTFontEngine::~SplashFTFontEngine() { - FT_Done_FreeType(lib); -} - -SplashFontFile *SplashFTFontEngine::loadType1Font(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, - char **enc) { - return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc); -} - -SplashFontFile *SplashFTFontEngine::loadType1CFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, - char **enc) { - return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc); -} - -SplashFontFile *SplashFTFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, - char **enc) { - return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc); -} - -SplashFontFile *SplashFTFontEngine::loadCIDFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile) { - FoFiType1C *ff; - Gushort *cidToGIDMap; - int nCIDs; - SplashFontFile *ret; - - // check for a CFF font - if (useCIDs) { - cidToGIDMap = NULL; - nCIDs = 0; - } else if ((ff = FoFiType1C::load(fileName))) { - cidToGIDMap = ff->getCIDToGIDMap(&nCIDs); - delete ff; - } else { - cidToGIDMap = NULL; - nCIDs = 0; - } - ret = SplashFTFontFile::loadCIDFont(this, idA, fileName, deleteFile, - cidToGIDMap, nCIDs); - if (!ret) { - gfree(cidToGIDMap); - } - return ret; -} - -SplashFontFile *SplashFTFontEngine::loadOpenTypeCFFFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile) { - FoFiTrueType *ff; - GBool isCID; - Gushort *cidToGIDMap; - int nCIDs; - SplashFontFile *ret; - - cidToGIDMap = NULL; - nCIDs = 0; - isCID = gFalse; - if (!useCIDs) { - if ((ff = FoFiTrueType::load(fileName))) { - if (ff->isOpenTypeCFF()) { - cidToGIDMap = ff->getCIDToGIDMap(&nCIDs); - } - delete ff; - } - } - ret = SplashFTFontFile::loadCIDFont(this, idA, fileName, deleteFile, - cidToGIDMap, nCIDs); - if (!ret) { - gfree(cidToGIDMap); - } - return ret; -} - -SplashFontFile *SplashFTFontEngine::loadTrueTypeFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, - Gushort *codeToGID, - int codeToGIDLen) { - FoFiTrueType *ff; - GString *tmpFileName; - FILE *tmpFile; - SplashFontFile *ret; - - if (!(ff = FoFiTrueType::load(fileName))) { - return NULL; - } - tmpFileName = NULL; - if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) { - delete ff; - return NULL; - } - ff->writeTTF(&fileWrite, tmpFile); - delete ff; - fclose(tmpFile); - ret = SplashFTFontFile::loadTrueTypeFont(this, idA, - tmpFileName->getCString(), - gTrue, codeToGID, codeToGIDLen); - if (ret) { - if (deleteFile) { - unlink(fileName); - } - } else { - unlink(tmpFileName->getCString()); - } - delete tmpFileName; - return ret; -} - -#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.h deleted file mode 100644 index b8b9f7fbc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontEngine.h +++ /dev/null @@ -1,65 +0,0 @@ -//======================================================================== -// -// SplashFTFontEngine.h -// -//======================================================================== - -#ifndef SPLASHFTFONTENGINE_H -#define SPLASHFTFONTENGINE_H - -#include - -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include FT_FREETYPE_H -#include "gtypes.h" - -class SplashFontFile; -class SplashFontFileID; - -//------------------------------------------------------------------------ -// SplashFTFontEngine -//------------------------------------------------------------------------ - -class SplashFTFontEngine { -public: - - static SplashFTFontEngine *init(GBool aaA); - - ~SplashFTFontEngine(); - - // Load fonts. - SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName, - GBool deleteFile, char **enc); - SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile, char **enc); - SplashFontFile *loadOpenTypeT1CFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile, char **enc); - SplashFontFile *loadCIDFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile); - SplashFontFile *loadOpenTypeCFFFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile); - SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile, - Gushort *codeToGID, int codeToGIDLen); - -private: - - SplashFTFontEngine(GBool aaA, FT_Library libA); - - GBool aa; - FT_Library lib; - GBool useCIDs; - - friend class SplashFTFontFile; - friend class SplashFTFont; -}; - -#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.cc deleted file mode 100644 index dd3767609..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.cc +++ /dev/null @@ -1,114 +0,0 @@ -//======================================================================== -// -// SplashFTFontFile.cc -// -//======================================================================== - -#include - -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "gmem.h" -#include "SplashFTFontEngine.h" -#include "SplashFTFont.h" -#include "SplashFTFontFile.h" - -//------------------------------------------------------------------------ -// SplashFTFontFile -//------------------------------------------------------------------------ - -SplashFontFile *SplashFTFontFile::loadType1Font(SplashFTFontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, - GBool deleteFileA, - char **encA) { - FT_Face faceA; - Gushort *codeToGIDA; - char *name; - int i; - - if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) { - return NULL; - } - codeToGIDA = (Gushort *)gmallocn(256, sizeof(int)); - for (i = 0; i < 256; ++i) { - codeToGIDA[i] = 0; - if ((name = encA[i])) { - codeToGIDA[i] = (Gushort)FT_Get_Name_Index(faceA, name); - } - } - - return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA, - faceA, codeToGIDA, 256, gFalse); -} - -SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, - GBool deleteFileA, - Gushort *codeToGIDA, - int codeToGIDLenA) { - FT_Face faceA; - - if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) { - return NULL; - } - - return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA, - faceA, codeToGIDA, codeToGIDLenA, gFalse); -} - -SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, - GBool deleteFileA, - Gushort *codeToGIDA, - int codeToGIDLenA) { - FT_Face faceA; - - if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) { - return NULL; - } - - return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA, - faceA, codeToGIDA, codeToGIDLenA, gTrue); -} - -SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, GBool deleteFileA, - FT_Face faceA, - Gushort *codeToGIDA, int codeToGIDLenA, - GBool trueTypeA): - SplashFontFile(idA, fileNameA, deleteFileA) -{ - engine = engineA; - face = faceA; - codeToGID = codeToGIDA; - codeToGIDLen = codeToGIDLenA; - trueType = trueTypeA; -} - -SplashFTFontFile::~SplashFTFontFile() { - if (face) { - FT_Done_Face(face); - } - if (codeToGID) { - gfree(codeToGID); - } -} - -SplashFont *SplashFTFontFile::makeFont(SplashCoord *mat, - SplashCoord *textMat) { - SplashFont *font; - - font = new SplashFTFont(this, mat, textMat); - font->initCache(); - return font; -} - -#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.h deleted file mode 100644 index af6a8a0e0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFTFontFile.h +++ /dev/null @@ -1,73 +0,0 @@ -//======================================================================== -// -// SplashFTFontFile.h -// -//======================================================================== - -#ifndef SPLASHFTFONTFILE_H -#define SPLASHFTFONTFILE_H - -#include - -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include FT_FREETYPE_H -#include "SplashFontFile.h" - -class SplashFontFileID; -class SplashFTFontEngine; - -//------------------------------------------------------------------------ -// SplashFTFontFile -//------------------------------------------------------------------------ - -class SplashFTFontFile: public SplashFontFile { -public: - - static SplashFontFile *loadType1Font(SplashFTFontEngine *engineA, - SplashFontFileID *idA, char *fileNameA, - GBool deleteFileA, char **encA); - static SplashFontFile *loadCIDFont(SplashFTFontEngine *engineA, - SplashFontFileID *idA, char *fileNameA, - GBool deleteFileA, - Gushort *codeToCIDA, int codeToGIDLenA); - static SplashFontFile *loadTrueTypeFont(SplashFTFontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, - GBool deleteFileA, - Gushort *codeToGIDA, - int codeToGIDLenA); - - virtual ~SplashFTFontFile(); - - // Create a new SplashFTFont, i.e., a scaled instance of this font - // file. - virtual SplashFont *makeFont(SplashCoord *mat, - SplashCoord *textMat); - -private: - - SplashFTFontFile(SplashFTFontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, GBool deleteFileA, - FT_Face faceA, - Gushort *codeToGIDA, int codeToGIDLenA, - GBool trueTypeA); - - SplashFTFontEngine *engine; - FT_Face face; - Gushort *codeToGID; - int codeToGIDLen; - GBool trueType; - - friend class SplashFTFont; -}; - -#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.cc deleted file mode 100644 index 72a8412a1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.cc +++ /dev/null @@ -1,184 +0,0 @@ -//======================================================================== -// -// SplashFont.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "gmem.h" -#include "SplashMath.h" -#include "SplashGlyphBitmap.h" -#include "SplashFontFile.h" -#include "SplashFont.h" - -//------------------------------------------------------------------------ - -struct SplashFontCacheTag { - int c; - short xFrac, yFrac; // x and y fractions - int mru; // valid bit (0x80000000) and MRU index - int x, y, w, h; // offset and size of glyph -}; - -//------------------------------------------------------------------------ -// SplashFont -//------------------------------------------------------------------------ - -SplashFont::SplashFont(SplashFontFile *fontFileA, SplashCoord *matA, - SplashCoord *textMatA, GBool aaA) { - fontFile = fontFileA; - fontFile->incRefCnt(); - mat[0] = matA[0]; - mat[1] = matA[1]; - mat[2] = matA[2]; - mat[3] = matA[3]; - textMat[0] = textMatA[0]; - textMat[1] = textMatA[1]; - textMat[2] = textMatA[2]; - textMat[3] = textMatA[3]; - aa = aaA; - - cache = NULL; - cacheTags = NULL; - - xMin = yMin = xMax = yMax = 0; - - last_advance = -1; - ascender = -1; - descender = -1; -} - -void SplashFont::initCache() { - int i; - - // this should be (max - min + 1), but we add some padding to - // deal with rounding errors - glyphW = xMax - xMin + 3; - glyphH = yMax - yMin + 3; - if (aa) { - glyphSize = glyphW * glyphH; - } else { - glyphSize = ((glyphW + 7) >> 3) * glyphH; - } - - // set up the glyph pixmap cache - cacheAssoc = 8; - if (glyphSize <= 256) { - cacheSets = 8; - } else if (glyphSize <= 512) { - cacheSets = 4; - } else if (glyphSize <= 1024) { - cacheSets = 2; - } else { - cacheSets = 1; - } - cache = (Guchar *)gmallocn_noexit(cacheSets * cacheAssoc, glyphSize); - if(cache) { - cacheTags = (SplashFontCacheTag *)gmallocn(cacheSets * cacheAssoc, - sizeof(SplashFontCacheTag)); - for (i = 0; i < cacheSets * cacheAssoc; ++i) { - cacheTags[i].mru = i & (cacheAssoc - 1); - } - } else { - cacheAssoc = 0; - } -} - -SplashFont::~SplashFont() { - fontFile->decRefCnt(); - if (cache) { - gfree(cache); - } - if (cacheTags) { - gfree(cacheTags); - } -} - -GBool SplashFont::getGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap) { - SplashGlyphBitmap bitmap2; - int size; - Guchar *p; - int i, j, k; - - // no fractional coordinates for large glyphs or non-anti-aliased - // glyphs - if (!aa || glyphH > 50) { - xFrac = yFrac = 0; - } - - // check the cache - i = (c & (cacheSets - 1)) * cacheAssoc; - for (j = 0; j < cacheAssoc; ++j) { - if ((cacheTags[i+j].mru & 0x80000000) && - cacheTags[i+j].c == c && - (int)cacheTags[i+j].xFrac == xFrac && - (int)cacheTags[i+j].yFrac == yFrac) { - bitmap->x = cacheTags[i+j].x; - bitmap->y = cacheTags[i+j].y; - bitmap->w = cacheTags[i+j].w; - bitmap->h = cacheTags[i+j].h; - for (k = 0; k < cacheAssoc; ++k) { - if (k != j && - (cacheTags[i+k].mru & 0x7fffffff) < - (cacheTags[i+j].mru & 0x7fffffff)) { - ++cacheTags[i+k].mru; - } - } - cacheTags[i+j].mru = 0x80000000; - bitmap->aa = aa; - bitmap->data = cache + (i+j) * glyphSize; - bitmap->freeData = gFalse; - return gTrue; - } - } - - // generate the glyph bitmap - if (!makeGlyph(c, xFrac, yFrac, &bitmap2)) { - return gFalse; - } - - // if the glyph doesn't fit in the bounding box, return a temporary - // uncached bitmap - if (bitmap2.w > glyphW || bitmap2.h > glyphH) { - *bitmap = bitmap2; - return gTrue; - } - - // insert glyph pixmap in cache - if (aa) { - size = bitmap2.w * bitmap2.h; - } else { - size = ((bitmap2.w + 7) >> 3) * bitmap2.h; - } - p = NULL; // make gcc happy - for (j = 0; j < cacheAssoc; ++j) { - if ((cacheTags[i+j].mru & 0x7fffffff) == cacheAssoc - 1) { - cacheTags[i+j].mru = 0x80000000; - cacheTags[i+j].c = c; - cacheTags[i+j].xFrac = (short)xFrac; - cacheTags[i+j].yFrac = (short)yFrac; - cacheTags[i+j].x = bitmap2.x; - cacheTags[i+j].y = bitmap2.y; - cacheTags[i+j].w = bitmap2.w; - cacheTags[i+j].h = bitmap2.h; - p = cache + (i+j) * glyphSize; - memcpy(p, bitmap2.data, size); - } else { - ++cacheTags[i+j].mru; - } - } - *bitmap = bitmap2; - bitmap->data = p; - bitmap->freeData = gFalse; - if (bitmap2.freeData) { - gfree(bitmap2.data); - } - return gTrue; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.h deleted file mode 100644 index 3cb167f85..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFont.h +++ /dev/null @@ -1,110 +0,0 @@ -//======================================================================== -// -// SplashFont.h -// -//======================================================================== - -#ifndef SPLASHFONT_H -#define SPLASHFONT_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "SplashTypes.h" - -struct SplashGlyphBitmap; -struct SplashFontCacheTag; -class SplashFontFile; -class SplashPath; - -//------------------------------------------------------------------------ - -// Fractional positioning uses this many bits to the right of the -// decimal points. -#define splashFontFractionBits 2 -#define splashFontFraction (1 << splashFontFractionBits) -#define splashFontFractionMul \ - ((SplashCoord)1 / (SplashCoord)splashFontFraction) - -//------------------------------------------------------------------------ -// SplashFont -//------------------------------------------------------------------------ - -class SplashFont { -public: - - SplashFont(SplashFontFile *fontFileA, SplashCoord *matA, - SplashCoord *textMatA, GBool aaA); - - // This must be called after the constructor, so that the subclass - // constructor has a chance to compute the bbox. - void initCache(); - - virtual ~SplashFont(); - - SplashFontFile *getFontFile() { return fontFile; } - - // Return true if matches the specified font file and matrix. - GBool matches(SplashFontFile *fontFileA, SplashCoord *matA, - SplashCoord *textMatA) { - return fontFileA == fontFile && - matA[0] == mat[0] && matA[1] == mat[1] && - matA[2] == mat[2] && matA[3] == mat[3] && - textMatA[0] == textMat[0] && textMatA[1] == textMat[1] && - textMatA[2] == textMat[2] && textMatA[3] == textMat[3]; - } - - // Get a glyph - this does a cache lookup first, and if not found, - // creates a new bitmap and adds it to the cache. The and - // values are splashFontFractionBits bits each, representing - // the numerators of fractions in [0, 1), where the denominator is - // splashFontFraction = 1 << splashFontFractionBits. Subclasses - // should override this to zero out xFrac and/or yFrac if they don't - // support fractional coordinates. - virtual GBool getGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap); - - // Rasterize a glyph. The and values are the same - // as described for getGlyph. - virtual GBool makeGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap) = 0; - - // return the number of characters in this font - virtual int getNumChars() = 0; - - // Return the path for a glyph. - virtual SplashPath *getGlyphPath(int c) = 0; - - // Return the font transform matrix. - SplashCoord *getMatrix() { return mat; } - - // Return the glyph bounding box. - void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA) - { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } - - double ascender; - double descender; - double last_advance; //set after getGlyphPath() -protected: - - SplashFontFile *fontFile; - SplashCoord mat[4]; // font transform matrix - // (text space -> device space) - SplashCoord textMat[4]; // text transform matrix - // (text space -> user space) - GBool aa; // anti-aliasing - int xMin, yMin, xMax, yMax; // glyph bounding box - Guchar *cache; // glyph bitmap cache - SplashFontCacheTag * // cache tags - cacheTags; - int glyphW, glyphH; // size of glyph bitmaps - int glyphSize; // size of glyph bitmaps, in bytes - int cacheSets; // number of sets in cache - int cacheAssoc; // cache associativity (glyphs per set) -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.cc deleted file mode 100644 index 1c090f6e8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.cc +++ /dev/null @@ -1,317 +0,0 @@ -//======================================================================== -// -// SplashFontEngine.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#if HAVE_T1LIB_H -#include -#endif - -#include -#include -#ifndef WIN32 -# include -#endif -#include "gmem.h" -#include "GString.h" -#include "SplashMath.h" -#include "SplashT1FontEngine.h" -#include "SplashFTFontEngine.h" -#include "SplashFontFile.h" -#include "SplashFontFileID.h" -#include "SplashFont.h" -#include "SplashFontEngine.h" - -#ifdef VMS -#if (__VMS_VER < 70000000) -extern "C" int unlink(char *filename); -#endif -#endif - -//------------------------------------------------------------------------ -// SplashFontEngine -//------------------------------------------------------------------------ - -SplashFontEngine::SplashFontEngine( -#if HAVE_T1LIB_H - GBool enableT1lib, -#endif -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - GBool enableFreeType, -#endif - GBool aa) { - int i; - - for (i = 0; i < splashFontCacheSize; ++i) { - fontCache[i] = NULL; - } - -#if HAVE_T1LIB_H - if (enableT1lib) { - t1Engine = SplashT1FontEngine::init(aa); - } else { - t1Engine = NULL; - } -#endif -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - if (enableFreeType) { - ftEngine = SplashFTFontEngine::init(aa); - } else { - ftEngine = NULL; - } -#endif -} - -SplashFontEngine::~SplashFontEngine() { - int i; - - for (i = 0; i < splashFontCacheSize; ++i) { - if (fontCache[i]) { - delete fontCache[i]; - } - } - -#if HAVE_T1LIB_H - if (t1Engine) { - delete t1Engine; - } -#endif -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - if (ftEngine) { - delete ftEngine; - } -#endif -} - -SplashFontFile *SplashFontEngine::getFontFile(SplashFontFileID *id) { - SplashFontFile *fontFile; - int i; - - for (i = 0; i < splashFontCacheSize; ++i) { - if (fontCache[i]) { - fontFile = fontCache[i]->getFontFile(); - if (fontFile && fontFile->getID()->matches(id)) { - return fontFile; - } - } - } - return NULL; -} - -SplashFontFile *SplashFontEngine::loadType1Font(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, char **enc) { - SplashFontFile *fontFile; - - fontFile = NULL; -#if HAVE_T1LIB_H - if (!fontFile && t1Engine) { - fontFile = t1Engine->loadType1Font(idA, fileName, deleteFile, enc); - } -#endif -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - if (!fontFile && ftEngine) { - fontFile = ftEngine->loadType1Font(idA, fileName, deleteFile, enc); - } -#endif - -#ifndef WIN32 - // delete the (temporary) font file -- with Unix hard link - // semantics, this will remove the last link; otherwise it will - // return an error, leaving the file to be deleted later (if - // loadXYZFont failed, the file will always be deleted) - if (deleteFile) { - unlink(fontFile ? fontFile->fileName->getCString() : fileName); - } -#endif - - return fontFile; -} - -SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, - char **enc) { - SplashFontFile *fontFile; - - fontFile = NULL; -#if HAVE_T1LIB_H - if (!fontFile && t1Engine) { - fontFile = t1Engine->loadType1CFont(idA, fileName, deleteFile, enc); - } -#endif -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - if (!fontFile && ftEngine) { - fontFile = ftEngine->loadType1CFont(idA, fileName, deleteFile, enc); - } -#endif - -#ifndef WIN32 - // delete the (temporary) font file -- with Unix hard link - // semantics, this will remove the last link; otherwise it will - // return an error, leaving the file to be deleted later (if - // loadXYZFont failed, the file will always be deleted) - if (deleteFile) { - unlink(fontFile ? fontFile->fileName->getCString() : fileName); - } -#endif - - return fontFile; -} - -SplashFontFile *SplashFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, - char **enc) { - SplashFontFile *fontFile; - - fontFile = NULL; -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - if (!fontFile && ftEngine) { - fontFile = ftEngine->loadOpenTypeT1CFont(idA, fileName, deleteFile, enc); - } -#endif - -#ifndef WIN32 - // delete the (temporary) font file -- with Unix hard link - // semantics, this will remove the last link; otherwise it will - // return an error, leaving the file to be deleted later (if - // loadXYZFont failed, the file will always be deleted) - if (deleteFile) { - unlink(fontFile ? fontFile->fileName->getCString() : fileName); - } -#endif - - return fontFile; -} - -SplashFontFile *SplashFontEngine::loadCIDFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile) { - SplashFontFile *fontFile; - - fontFile = NULL; -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - if (!fontFile && ftEngine) { - fontFile = ftEngine->loadCIDFont(idA, fileName, deleteFile); - } -#endif - -#ifndef WIN32 - // delete the (temporary) font file -- with Unix hard link - // semantics, this will remove the last link; otherwise it will - // return an error, leaving the file to be deleted later (if - // loadXYZFont failed, the file will always be deleted) - if (deleteFile) { - unlink(fontFile ? fontFile->fileName->getCString() : fileName); - } -#endif - - return fontFile; -} - -SplashFontFile *SplashFontEngine::loadOpenTypeCFFFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile) { - SplashFontFile *fontFile; - - fontFile = NULL; -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - if (!fontFile && ftEngine) { - fontFile = ftEngine->loadOpenTypeCFFFont(idA, fileName, deleteFile); - } -#endif - -#ifndef WIN32 - // delete the (temporary) font file -- with Unix hard link - // semantics, this will remove the last link; otherwise it will - // return an error, leaving the file to be deleted later (if - // loadXYZFont failed, the file will always be deleted) - if (deleteFile) { - unlink(fontFile ? fontFile->fileName->getCString() : fileName); - } -#endif - - return fontFile; -} - -SplashFontFile *SplashFontEngine::loadTrueTypeFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, - Gushort *codeToGID, - int codeToGIDLen) { - SplashFontFile *fontFile; - - fontFile = NULL; -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - if (!fontFile && ftEngine) { - fontFile = ftEngine->loadTrueTypeFont(idA, fileName, deleteFile, - codeToGID, codeToGIDLen); - } -#endif - - if (!fontFile) { - gfree(codeToGID); - } - -#ifndef WIN32 - // delete the (temporary) font file -- with Unix hard link - // semantics, this will remove the last link; otherwise it will - // return an error, leaving the file to be deleted later (if - // loadXYZFont failed, the file will always be deleted) - if (deleteFile) { - unlink(fontFile ? fontFile->fileName->getCString() : fileName); - } -#endif - - return fontFile; -} - -SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile, - SplashCoord *textMat, - SplashCoord *ctm) { - SplashCoord mat[4]; - SplashFont *font; - int i, j; - - mat[0] = textMat[0] * ctm[0] + textMat[1] * ctm[2]; - mat[1] = -(textMat[0] * ctm[1] + textMat[1] * ctm[3]); - mat[2] = textMat[2] * ctm[0] + textMat[3] * ctm[2]; - mat[3] = -(textMat[2] * ctm[1] + textMat[3] * ctm[3]); - if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.01) { - // avoid a singular (or close-to-singular) matrix - mat[0] = 0.01; mat[1] = 0; - mat[2] = 0; mat[3] = 0.01; - } - - font = fontCache[0]; - if (font && font->matches(fontFile, mat, textMat)) { - return font; - } - for (i = 1; i < splashFontCacheSize; ++i) { - font = fontCache[i]; - if (font && font->matches(fontFile, mat, textMat)) { - for (j = i; j > 0; --j) { - fontCache[j] = fontCache[j-1]; - } - fontCache[0] = font; - return font; - } - } - font = fontFile->makeFont(mat, textMat); - if (fontCache[splashFontCacheSize - 1]) { - delete fontCache[splashFontCacheSize - 1]; - } - for (j = splashFontCacheSize - 1; j > 0; --j) { - fontCache[j] = fontCache[j-1]; - } - fontCache[0] = font; - return font; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.h deleted file mode 100644 index 6da4a7489..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontEngine.h +++ /dev/null @@ -1,91 +0,0 @@ -//======================================================================== -// -// SplashFontEngine.h -// -//======================================================================== - -#ifndef SPLASHFONTENGINE_H -#define SPLASHFONTENGINE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -class SplashT1FontEngine; -class SplashFTFontEngine; -class SplashDTFontEngine; -class SplashDT4FontEngine; -class SplashFontFile; -class SplashFontFileID; -class SplashFont; - -//------------------------------------------------------------------------ - -#define splashFontCacheSize 16 - -//------------------------------------------------------------------------ -// SplashFontEngine -//------------------------------------------------------------------------ - -class SplashFontEngine { -public: - - // Create a font engine. - SplashFontEngine( -#if HAVE_T1LIB_H - GBool enableT1lib, -#endif -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - GBool enableFreeType, -#endif - GBool aa); - - ~SplashFontEngine(); - - // Get a font file from the cache. Returns NULL if there is no - // matching entry in the cache. - SplashFontFile *getFontFile(SplashFontFileID *id); - - // Load fonts - these create new SplashFontFile objects. - SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName, - GBool deleteFile, char **enc); - SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile, char **enc); - SplashFontFile *loadOpenTypeT1CFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile, char **enc); - SplashFontFile *loadCIDFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile); - SplashFontFile *loadOpenTypeCFFFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile); - SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile, - Gushort *codeToGID, int codeToGIDLen); - - // Get a font - this does a cache lookup first, and if not found, - // creates a new SplashFont object and adds it to the cache. The - // matrix, mat = textMat * ctm: - // [ mat[0] mat[1] ] - // [ mat[2] mat[3] ] - // specifies the font transform in PostScript style: - // [x' y'] = [x y] * mat - // Note that the Splash y axis points downward. - SplashFont *getFont(SplashFontFile *fontFile, - SplashCoord *textMat, SplashCoord *ctm); - -private: - - SplashFont *fontCache[splashFontCacheSize]; - -#if HAVE_T1LIB_H - SplashT1FontEngine *t1Engine; -#endif -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - SplashFTFontEngine *ftEngine; -#endif -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.cc deleted file mode 100644 index edeb63eab..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.cc +++ /dev/null @@ -1,53 +0,0 @@ -//======================================================================== -// -// SplashFontFile.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "GString.h" -#include "SplashFontFile.h" -#include "SplashFontFileID.h" - -#ifdef VMS -#if (__VMS_VER < 70000000) -extern "C" int unlink(char *filename); -#endif -#endif - -//------------------------------------------------------------------------ -// SplashFontFile -//------------------------------------------------------------------------ - -SplashFontFile::SplashFontFile(SplashFontFileID *idA, char *fileNameA, - GBool deleteFileA) { - id = idA; - fileName = new GString(fileNameA); - deleteFile = deleteFileA; - refCnt = 0; -} - -SplashFontFile::~SplashFontFile() { - if (deleteFile) { - unlink(fileName->getCString()); - } - delete fileName; - delete id; -} - -void SplashFontFile::incRefCnt() { - ++refCnt; -} - -void SplashFontFile::decRefCnt() { - if (!--refCnt) { - delete this; - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.h deleted file mode 100644 index 9f8931295..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFile.h +++ /dev/null @@ -1,60 +0,0 @@ -//======================================================================== -// -// SplashFontFile.h -// -//======================================================================== - -#ifndef SPLASHFONTFILE_H -#define SPLASHFONTFILE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "SplashTypes.h" - -class GString; -class SplashFontEngine; -class SplashFont; -class SplashFontFileID; - -//------------------------------------------------------------------------ -// SplashFontFile -//------------------------------------------------------------------------ - -class SplashFontFile { -public: - - virtual ~SplashFontFile(); - - // Create a new SplashFont, i.e., a scaled instance of this font - // file. - virtual SplashFont *makeFont(SplashCoord *mat, SplashCoord *textMat) = 0; - - // Get the font file ID. - SplashFontFileID *getID() { return id; } - - // Increment the reference count. - void incRefCnt(); - - // Decrement the reference count. If the new value is zero, delete - // the SplashFontFile object. - void decRefCnt(); - -protected: - - SplashFontFile(SplashFontFileID *idA, char *fileNameA, - GBool deleteFileA); - - SplashFontFileID *id; - GString *fileName; - GBool deleteFile; - int refCnt; - - friend class SplashFontEngine; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.cc deleted file mode 100644 index af37cb2fd..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.cc +++ /dev/null @@ -1,23 +0,0 @@ -//======================================================================== -// -// SplashFontFileID.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "SplashFontFileID.h" - -//------------------------------------------------------------------------ -// SplashFontFileID -//------------------------------------------------------------------------ - -SplashFontFileID::SplashFontFileID() { -} - -SplashFontFileID::~SplashFontFileID() { -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.h deleted file mode 100644 index bed11d336..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashFontFileID.h +++ /dev/null @@ -1,30 +0,0 @@ -//======================================================================== -// -// SplashFontFileID.h -// -//======================================================================== - -#ifndef SPLASHFONTFILEID_H -#define SPLASHFONTFILEID_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -//------------------------------------------------------------------------ -// SplashFontFileID -//------------------------------------------------------------------------ - -class SplashFontFileID { -public: - - SplashFontFileID(); - virtual ~SplashFontFileID(); - virtual GBool matches(SplashFontFileID *id) = 0; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashGlyphBitmap.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashGlyphBitmap.h deleted file mode 100644 index 044ba4a66..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashGlyphBitmap.h +++ /dev/null @@ -1,26 +0,0 @@ -//======================================================================== -// -// SplashGlyphBitmap.h -// -//======================================================================== - -#ifndef SPLASHGLYPHBITMAP_H -#define SPLASHGLYPHBITMAP_H - -#include - -#include "gtypes.h" - -//------------------------------------------------------------------------ -// SplashGlyphBitmap -//------------------------------------------------------------------------ - -struct SplashGlyphBitmap { - int x, y, w, h; // offset and size of glyph - GBool aa; // anti-aliased: true means 8-bit alpha - // bitmap; false means 1-bit - Guchar *data; // bitmap data - GBool freeData; // true if data memory should be freed -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashMath.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashMath.h deleted file mode 100644 index 1dd60dd05..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashMath.h +++ /dev/null @@ -1,89 +0,0 @@ -//======================================================================== -// -// SplashMath.h -// -//======================================================================== - -#ifndef SPLASHMATH_H -#define SPLASHMATH_H - -#include -#if USE_FIXEDPONT -#include "FixedPoint.h" -#else -#include -#endif -#include "SplashTypes.h" - -static inline SplashCoord splashAbs(SplashCoord x) { -#if USE_FIXEDPOINT - return FixedPoint::abs(x); -#else - return fabs(x); -#endif -} - -static inline int splashFloor(SplashCoord x) { -#if USE_FIXEDPOINT - return FixedPoint::floor(x); -#else - return (int)floor(x); -#endif -} - -static inline int splashCeil(SplashCoord x) { -#if USE_FIXEDPOINT - return FixedPoint::ceil(x); -#else - return (int)ceil(x); -#endif -} - -static inline int splashRound(SplashCoord x) { -#if USE_FIXEDPOINT - return FixedPoint::round(x); -#else - return (int)floor(x + 0.5); -#endif -} - -static inline SplashCoord splashSqrt(SplashCoord x) { -#if USE_FIXEDPOINT - return FixedPoint::sqrt(x); -#else - return sqrt(x); -#endif -} - -static inline SplashCoord splashPow(SplashCoord x, SplashCoord y) { -#if USE_FIXEDPOINT - return FixedPoint::pow(x, y); -#else - return pow(x, y); -#endif -} - -static inline SplashCoord splashDist(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1) { - SplashCoord dx, dy; - dx = x1 - x0; - dy = y1 - y0; -#if USE_FIXEDPOINT - // this handles the situation where dx*dx or dy*dy is too large to - // fit in the 16.16 fixed point format - SplashCoord dxa, dya; - dxa = splashAbs(dx); - dya = splashAbs(dy); - if (dxa == 0 && dya == 0) { - return 0; - } else if (dxa > dya) { - return dxa * FixedPoint::sqrt(dya / dxa + 1); - } else { - return dya * FixedPoint::sqrt(dxa / dya + 1); - } -#else - return sqrt(dx * dx + dy * dy); -#endif -} - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.cc deleted file mode 100644 index 2d81faf31..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.cc +++ /dev/null @@ -1,2846 +0,0 @@ -//======================================================================== -// -// SplashOutputDev.cc -// -// Copyright 2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include "gfile.h" -#include "GlobalParams.h" -#include "Error.h" -#include "Object.h" -#include "GfxFont.h" -#include "Link.h" -#include "CharCodeToUnicode.h" -#include "FontEncodingTables.h" -#include "FoFiTrueType.h" -#include "SplashBitmap.h" -#include "SplashGlyphBitmap.h" -#include "SplashPattern.h" -#include "SplashScreen.h" -#include "SplashPath.h" -#include "SplashState.h" -#include "SplashErrorCodes.h" -#include "SplashFontEngine.h" -#include "SplashFont.h" -#include "SplashFontFile.h" -#include "SplashFontFileID.h" -#include "Splash.h" -#include "SplashOutputDev.h" - -#ifdef VMS -#if (__VMS_VER < 70000000) -extern "C" int unlink(char *filename); -#endif -#endif - -//------------------------------------------------------------------------ - -// Divide a 16-bit value (in [0, 255*255]) by 255, returning an 8-bit result. -static inline Guchar div255(int x) { - return (Guchar)((x + (x >> 8) + 0x80) >> 8); -} - -//------------------------------------------------------------------------ -// Blend functions -//------------------------------------------------------------------------ - -static void splashOutBlendMultiply(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = (dest[i] * src[i]) / 255; - } -} - -static void splashOutBlendScreen(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] + src[i] - (dest[i] * src[i]) / 255; - } -} - -static void splashOutBlendOverlay(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] < 0x80 - ? (src[i] * 2 * dest[i]) / 255 - : 255 - 2 * ((255 - src[i]) * (255 - dest[i])) / 255; - } -} - -static void splashOutBlendDarken(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] < src[i] ? dest[i] : src[i]; - } -} - -static void splashOutBlendLighten(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] > src[i] ? dest[i] : src[i]; - } -} - -static void splashOutBlendColorDodge(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, - SplashColorMode cm) { - int i, x; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - if (src[i] == 255) { - blend[i] = 255; - } else { - x = (dest[i] * 255) / (255 - src[i]); - blend[i] = x <= 255 ? x : 255; - } - } -} - -static void splashOutBlendColorBurn(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i, x; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - if (src[i] == 0) { - blend[i] = 0; - } else { - x = ((255 - dest[i]) * 255) / src[i]; - blend[i] = x <= 255 ? 255 - x : 0; - } - } -} - -static void splashOutBlendHardLight(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = src[i] < 0x80 - ? (dest[i] * 2 * src[i]) / 255 - : 255 - 2 * ((255 - dest[i]) * (255 - src[i])) / 255; - } -} - -static void splashOutBlendSoftLight(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i, x; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - if (src[i] < 0x80) { - blend[i] = dest[i] - (255 - 2 * src[i]) * dest[i] * (255 - dest[i]) / - (255 * 255); - } else { - if (dest[i] < 0x40) { - x = (((((16 * dest[i] - 12 * 255) * dest[i]) / 255) - + 4 * 255) * dest[i]) / 255; - } else { - x = (int)sqrt(255.0 * dest[i]); - } - blend[i] = dest[i] + (2 * src[i] - 255) * (x - dest[i]) / 255; - } - } -} - -static void splashOutBlendDifference(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, - SplashColorMode cm) { - int i; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] < src[i] ? src[i] - dest[i] : dest[i] - src[i]; - } -} - -static void splashOutBlendExclusion(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] + src[i] - (2 * dest[i] * src[i]) / 255; - } -} - -static void cvtRGBToHSV(Guchar r, Guchar g, Guchar b, int *h, int *s, int *v) { - int cmax, cmid, cmin, x; - - if (r >= g) { - if (g >= b) { x = 0; cmax = r; cmid = g; cmin = b; } - else if (b >= r) { x = 4; cmax = b; cmid = r; cmin = g; } - else { x = 5; cmax = r; cmid = b; cmin = g; } - } else { - if (r >= b) { x = 1; cmax = g; cmid = r; cmin = b; } - else if (g >= b) { x = 2; cmax = g; cmid = b; cmin = r; } - else { x = 3; cmax = b; cmid = g; cmin = r; } - } - if (cmax == cmin) { - *h = *s = 0; - } else { - *h = x * 60; - if (x & 1) { - *h += ((cmax - cmid) * 60) / (cmax - cmin); - } else { - *h += ((cmid - cmin) * 60) / (cmax - cmin); - } - *s = (255 * (cmax - cmin)) / cmax; - } - *v = cmax; -} - -static void cvtHSVToRGB(int h, int s, int v, Guchar *r, Guchar *g, Guchar *b) { - int x, f, cmax, cmid, cmin; - - if (s == 0) { - *r = *g = *b = v; - } else { - x = h / 60; - f = h % 60; - cmax = v; - if (x & 1) { - cmid = div255(v * 255 - ((s * f) / 60)); - } else { - cmid = div255(v * (255 - ((s * (60 - f)) / 60))); - } - cmin = div255(v * (255 - s)); - switch (x) { - case 0: *r = cmax; *g = cmid; *b = cmin; break; - case 1: *g = cmax; *r = cmid; *b = cmin; break; - case 2: *g = cmax; *b = cmid; *r = cmin; break; - case 3: *b = cmax; *g = cmid; *r = cmin; break; - case 4: *b = cmax; *r = cmid; *g = cmin; break; - case 5: *r = cmax; *b = cmid; *g = cmin; break; - } - } -} - -static void splashOutBlendHue(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int hs, ss, vs, hd, sd, vd; -#if SPLASH_CMYK - Guchar r, g, b; -#endif - - switch (cm) { - case splashModeMono1: - case splashModeMono8: - blend[0] = dest[0]; - break; - case splashModeRGB8: - case splashModeBGR8: - cvtRGBToHSV(src[0], src[1], src[2], &hs, &ss, &vs); - cvtRGBToHSV(dest[0], dest[1], dest[2], &hd, &sd, &vd); - cvtHSVToRGB(hs, sd, vd, &blend[0], &blend[1], &blend[2]); - break; -#if SPLASH_CMYK - case splashModeCMYK8: - //~ (0xff - ...) should be clipped - cvtRGBToHSV(0xff - (src[0] + src[3]), - 0xff - (src[1] + src[3]), - 0xff - (src[2] + src[3]), &hs, &ss, &vs); - cvtRGBToHSV(0xff - (dest[0] + dest[3]), - 0xff - (dest[1] + dest[3]), - 0xff - (dest[2] + dest[3]), &hd, &sd, &vd); - cvtHSVToRGB(hs, sd, vd, &r, &g, &b); - //~ should do black generation - blend[0] = 0xff - r; - blend[1] = 0xff - g; - blend[2] = 0xff - b; - blend[3] = 0; - break; -#endif - } -} - -static void splashOutBlendSaturation(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, - SplashColorMode cm) { - int hs, ss, vs, hd, sd, vd; -#if SPLASH_CMYK - Guchar r, g, b; -#endif - - switch (cm) { - case splashModeMono1: - case splashModeMono8: - blend[0] = dest[0]; - break; - case splashModeRGB8: - case splashModeBGR8: - cvtRGBToHSV(src[0], src[1], src[2], &hs, &ss, &vs); - cvtRGBToHSV(dest[0], dest[1], dest[2], &hd, &sd, &vd); - cvtHSVToRGB(hd, ss, vd, &blend[0], &blend[1], &blend[2]); - break; -#if SPLASH_CMYK - case splashModeCMYK8: - //~ (0xff - ...) should be clipped - cvtRGBToHSV(0xff - (src[0] + src[3]), - 0xff - (src[1] + src[3]), - 0xff - (src[2] + src[3]), &hs, &ss, &vs); - cvtRGBToHSV(0xff - (dest[0] + dest[3]), - 0xff - (dest[1] + dest[3]), - 0xff - (dest[2] + dest[3]), &hd, &sd, &vd); - cvtHSVToRGB(hd, ss, vd, &r, &g, &b); - //~ should do black generation - blend[0] = 0xff - r; - blend[1] = 0xff - g; - blend[2] = 0xff - b; - blend[3] = 0; - break; -#endif - } -} - -static void splashOutBlendColor(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int hs, ss, vs, hd, sd, vd; -#if SPLASH_CMYK - Guchar r, g, b; -#endif - - switch (cm) { - case splashModeMono1: - case splashModeMono8: - blend[0] = dest[0]; - break; - case splashModeRGB8: - case splashModeBGR8: - cvtRGBToHSV(src[0], src[1], src[2], &hs, &ss, &vs); - cvtRGBToHSV(dest[0], dest[1], dest[2], &hd, &sd, &vd); - cvtHSVToRGB(hs, ss, vd, &blend[0], &blend[1], &blend[2]); - break; -#if SPLASH_CMYK - case splashModeCMYK8: - //~ (0xff - ...) should be clipped - cvtRGBToHSV(0xff - (src[0] + src[3]), - 0xff - (src[1] + src[3]), - 0xff - (src[2] + src[3]), &hs, &ss, &vs); - cvtRGBToHSV(0xff - (dest[0] + dest[3]), - 0xff - (dest[1] + dest[3]), - 0xff - (dest[2] + dest[3]), &hd, &sd, &vd); - cvtHSVToRGB(hs, ss, vd, &r, &g, &b); - //~ should do black generation - blend[0] = 0xff - r; - blend[1] = 0xff - g; - blend[2] = 0xff - b; - blend[3] = 0; - break; -#endif - } -} - -static void splashOutBlendLuminosity(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, - SplashColorMode cm) { - int hs, ss, vs, hd, sd, vd; -#if SPLASH_CMYK - Guchar r, g, b; -#endif - - switch (cm) { - case splashModeMono1: - case splashModeMono8: - blend[0] = dest[0]; - break; - case splashModeRGB8: - case splashModeBGR8: - cvtRGBToHSV(src[0], src[1], src[2], &hs, &ss, &vs); - cvtRGBToHSV(dest[0], dest[1], dest[2], &hd, &sd, &vd); - cvtHSVToRGB(hd, sd, vs, &blend[0], &blend[1], &blend[2]); - break; -#if SPLASH_CMYK - case splashModeCMYK8: - //~ (0xff - ...) should be clipped - cvtRGBToHSV(0xff - (src[0] + src[3]), - 0xff - (src[1] + src[3]), - 0xff - (src[2] + src[3]), &hs, &ss, &vs); - cvtRGBToHSV(0xff - (dest[0] + dest[3]), - 0xff - (dest[1] + dest[3]), - 0xff - (dest[2] + dest[3]), &hd, &sd, &vd); - cvtHSVToRGB(hd, sd, vs, &r, &g, &b); - //~ should do black generation - blend[0] = 0xff - r; - blend[1] = 0xff - g; - blend[2] = 0xff - b; - blend[3] = 0; - break; -#endif - } -} - -// NB: This must match the GfxBlendMode enum defined in GfxState.h. -SplashBlendFunc splashOutBlendFuncs[] = { - NULL, - &splashOutBlendMultiply, - &splashOutBlendScreen, - &splashOutBlendOverlay, - &splashOutBlendDarken, - &splashOutBlendLighten, - &splashOutBlendColorDodge, - &splashOutBlendColorBurn, - &splashOutBlendHardLight, - &splashOutBlendSoftLight, - &splashOutBlendDifference, - &splashOutBlendExclusion, - &splashOutBlendHue, - &splashOutBlendSaturation, - &splashOutBlendColor, - &splashOutBlendLuminosity -}; - -//------------------------------------------------------------------------ -// Font substitutions -//------------------------------------------------------------------------ - -struct SplashOutFontSubst { - char *name; - double mWidth; -}; - -// index: {symbolic:12, fixed:8, serif:4, sans-serif:0} + bold*2 + italic -static SplashOutFontSubst splashOutSubstFonts[16] = { - {"Helvetica", 0.833}, - {"Helvetica-Oblique", 0.833}, - {"Helvetica-Bold", 0.889}, - {"Helvetica-BoldOblique", 0.889}, - {"Times-Roman", 0.788}, - {"Times-Italic", 0.722}, - {"Times-Bold", 0.833}, - {"Times-BoldItalic", 0.778}, - {"Courier", 0.600}, - {"Courier-Oblique", 0.600}, - {"Courier-Bold", 0.600}, - {"Courier-BoldOblique", 0.600}, - {"Symbol", 0.576}, - {"Symbol", 0.576}, - {"Symbol", 0.576}, - {"Symbol", 0.576} -}; - -//------------------------------------------------------------------------ -// SplashOutFontFileID -//------------------------------------------------------------------------ - -class SplashOutFontFileID: public SplashFontFileID { -public: - - SplashOutFontFileID(Ref *rA) { r = *rA; substIdx = -1; } - - ~SplashOutFontFileID() {} - - GBool matches(SplashFontFileID *id) { - return ((SplashOutFontFileID *)id)->r.num == r.num && - ((SplashOutFontFileID *)id)->r.gen == r.gen; - } - - void setSubstIdx(int substIdxA) { substIdx = substIdxA; } - int getSubstIdx() { return substIdx; } - -private: - - Ref r; - int substIdx; -}; - -//------------------------------------------------------------------------ -// T3FontCache -//------------------------------------------------------------------------ - -struct T3FontCacheTag { - Gushort code; - Gushort mru; // valid bit (0x8000) and MRU index -}; - -class T3FontCache { -public: - - T3FontCache(Ref *fontID, double m11A, double m12A, - double m21A, double m22A, - int glyphXA, int glyphYA, int glyphWA, int glyphHA, - GBool aa, GBool validBBoxA); - ~T3FontCache(); - GBool matches(Ref *idA, double m11A, double m12A, - double m21A, double m22A) - { return fontID.num == idA->num && fontID.gen == idA->gen && - m11 == m11A && m12 == m12A && m21 == m21A && m22 == m22A; } - - Ref fontID; // PDF font ID - double m11, m12, m21, m22; // transform matrix - int glyphX, glyphY; // pixel offset of glyph bitmaps - int glyphW, glyphH; // size of glyph bitmaps, in pixels - GBool validBBox; // false if the bbox was [0 0 0 0] - int glyphSize; // size of glyph bitmaps, in bytes - int cacheSets; // number of sets in cache - int cacheAssoc; // cache associativity (glyphs per set) - Guchar *cacheData; // glyph pixmap cache - T3FontCacheTag *cacheTags; // cache tags, i.e., char codes -}; - -T3FontCache::T3FontCache(Ref *fontIDA, double m11A, double m12A, - double m21A, double m22A, - int glyphXA, int glyphYA, int glyphWA, int glyphHA, - GBool validBBoxA, GBool aa) { - int i; - - fontID = *fontIDA; - m11 = m11A; - m12 = m12A; - m21 = m21A; - m22 = m22A; - glyphX = glyphXA; - glyphY = glyphYA; - glyphW = glyphWA; - glyphH = glyphHA; - validBBox = validBBoxA; - if (aa) { - glyphSize = glyphW * glyphH; - } else { - glyphSize = ((glyphW + 7) >> 3) * glyphH; - } - cacheAssoc = 8; - if (glyphSize <= 256) { - cacheSets = 8; - } else if (glyphSize <= 512) { - cacheSets = 4; - } else if (glyphSize <= 1024) { - cacheSets = 2; - } else { - cacheSets = 1; - } - cacheData = (Guchar *)gmallocn(cacheSets * cacheAssoc, glyphSize); - cacheTags = (T3FontCacheTag *)gmallocn(cacheSets * cacheAssoc, - sizeof(T3FontCacheTag)); - for (i = 0; i < cacheSets * cacheAssoc; ++i) { - cacheTags[i].mru = i & (cacheAssoc - 1); - } -} - -T3FontCache::~T3FontCache() { - gfree(cacheData); - gfree(cacheTags); -} - -struct T3GlyphStack { - Gushort code; // character code - - //----- cache info - T3FontCache *cache; // font cache for the current font - T3FontCacheTag *cacheTag; // pointer to cache tag for the glyph - Guchar *cacheData; // pointer to cache data for the glyph - - //----- saved state - SplashBitmap *origBitmap; - Splash *origSplash; - double origCTM4, origCTM5; - - T3GlyphStack *next; // next object on stack -}; - -//------------------------------------------------------------------------ -// SplashTransparencyGroup -//------------------------------------------------------------------------ - -struct SplashTransparencyGroup { - int tx, ty; // translation coordinates - SplashBitmap *tBitmap; // bitmap for transparency group - GfxColorSpace *blendingColorSpace; - GBool isolated; - - //----- saved state - SplashBitmap *origBitmap; - Splash *origSplash; - - SplashTransparencyGroup *next; -}; - -//------------------------------------------------------------------------ -// SplashOutputDev -//------------------------------------------------------------------------ - -SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA, - int bitmapRowPadA, - GBool reverseVideoA, - SplashColorPtr paperColorA, - GBool bitmapTopDownA, - GBool allowAntialiasA) { - colorMode = colorModeA; - bitmapRowPad = bitmapRowPadA; - bitmapTopDown = bitmapTopDownA; - allowAntialias = allowAntialiasA; - vectorAntialias = allowAntialias && - globalParams->getVectorAntialias() && - colorMode != splashModeMono1; - setupScreenParams(72.0, 72.0); - reverseVideo = reverseVideoA; - splashColorCopy(paperColor, paperColorA); - - xref = NULL; - - bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode, - colorMode != splashModeMono1, bitmapTopDown); - splash = new Splash(bitmap, vectorAntialias, &screenParams); - splash->clear(paperColor, 0); - - fontEngine = NULL; - - nT3Fonts = 0; - t3GlyphStack = NULL; - - font = NULL; - needFontUpdate = gFalse; - textClipPath = NULL; - - transpGroupStack = NULL; -} - -void SplashOutputDev::setupScreenParams(double hDPI, double vDPI) { - screenParams.size = globalParams->getScreenSize(); - screenParams.dotRadius = globalParams->getScreenDotRadius(); - screenParams.gamma = (SplashCoord)globalParams->getScreenGamma(); - screenParams.blackThreshold = - (SplashCoord)globalParams->getScreenBlackThreshold(); - screenParams.whiteThreshold = - (SplashCoord)globalParams->getScreenWhiteThreshold(); - switch (globalParams->getScreenType()) { - case screenDispersed: - screenParams.type = splashScreenDispersed; - if (screenParams.size < 0) { - screenParams.size = 4; - } - break; - case screenClustered: - screenParams.type = splashScreenClustered; - if (screenParams.size < 0) { - screenParams.size = 10; - } - break; - case screenStochasticClustered: - screenParams.type = splashScreenStochasticClustered; - if (screenParams.size < 0) { - screenParams.size = 100; - } - if (screenParams.dotRadius < 0) { - screenParams.dotRadius = 2; - } - break; - case screenUnset: - default: - // use clustered dithering for resolution >= 300 dpi - // (compare to 299.9 to avoid floating point issues) - if (hDPI > 299.9 && vDPI > 299.9) { - screenParams.type = splashScreenStochasticClustered; - if (screenParams.size < 0) { - screenParams.size = 100; - } - if (screenParams.dotRadius < 0) { - screenParams.dotRadius = 2; - } - } else { - screenParams.type = splashScreenDispersed; - if (screenParams.size < 0) { - screenParams.size = 4; - } - } - } -} - -SplashOutputDev::~SplashOutputDev() { - int i; - - for (i = 0; i < nT3Fonts; ++i) { - delete t3FontCache[i]; - } - if (fontEngine) { - delete fontEngine; - } - if (splash) { - delete splash; - } - if (bitmap) { - delete bitmap; - } -} - -void SplashOutputDev::startDoc(XRef *xrefA) { - int i; - - xref = xrefA; - if (fontEngine) { - delete fontEngine; - } - fontEngine = new SplashFontEngine( -#if HAVE_T1LIB_H - globalParams->getEnableT1lib(), -#endif -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - globalParams->getEnableFreeType(), -#endif - allowAntialias && - globalParams->getAntialias() && - colorMode != splashModeMono1); - for (i = 0; i < nT3Fonts; ++i) { - delete t3FontCache[i]; - } - nT3Fonts = 0; -} - -void SplashOutputDev::startPage(int pageNum, GfxState *state) { - int w, h; - double *ctm; - SplashCoord mat[6]; - SplashColor color; - - if (state) { - setupScreenParams(state->getHDPI(), state->getVDPI()); - w = (int)(state->getPageWidth() + 0.5); - if (w <= 0) { - w = 1; - } - h = (int)(state->getPageHeight() + 0.5); - if (h <= 0) { - h = 1; - } - } else { - w = h = 1; - } - if (splash) { - delete splash; - } - if (!bitmap || w != bitmap->getWidth() || h != bitmap->getHeight()) { - if (bitmap) { - delete bitmap; - } - bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, - colorMode != splashModeMono1, bitmapTopDown); - } - splash = new Splash(bitmap, vectorAntialias, &screenParams); - if (state) { - ctm = state->getCTM(); - mat[0] = (SplashCoord)ctm[0]; - mat[1] = (SplashCoord)ctm[1]; - mat[2] = (SplashCoord)ctm[2]; - mat[3] = (SplashCoord)ctm[3]; - mat[4] = (SplashCoord)ctm[4]; - mat[5] = (SplashCoord)ctm[5]; - splash->setMatrix(mat); - } - switch (colorMode) { - case splashModeMono1: - case splashModeMono8: - color[0] = 0; - break; - case splashModeRGB8: - case splashModeBGR8: - color[0] = color[1] = color[2] = 0; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - color[0] = color[1] = color[2] = color[3] = 0; - break; -#endif - } - splash->setStrokePattern(new SplashSolidColor(color)); - splash->setFillPattern(new SplashSolidColor(color)); - splash->setLineCap(splashLineCapButt); - splash->setLineJoin(splashLineJoinMiter); - splash->setLineDash(NULL, 0, 0); - splash->setMiterLimit(10); - splash->setFlatness(1); - // the SA parameter supposedly defaults to false, but Acrobat - // apparently hardwires it to true - splash->setStrokeAdjust(globalParams->getStrokeAdjust()); - splash->clear(paperColor, 0); -} - -void SplashOutputDev::endPage() { - if (colorMode != splashModeMono1) { - splash->compositeBackground(paperColor); - } -} - -void SplashOutputDev::saveState(GfxState *state) { - splash->saveState(); -} - -void SplashOutputDev::restoreState(GfxState *state) { - splash->restoreState(); - needFontUpdate = gTrue; -} - -void SplashOutputDev::updateAll(GfxState *state) { - updateLineDash(state); - updateLineJoin(state); - updateLineCap(state); - updateLineWidth(state); - updateFlatness(state); - updateMiterLimit(state); - updateStrokeAdjust(state); - updateFillColor(state); - updateStrokeColor(state); - needFontUpdate = gTrue; -} - -void SplashOutputDev::updateCTM(GfxState *state, double m11, double m12, - double m21, double m22, - double m31, double m32) { - double *ctm; - SplashCoord mat[6]; - - ctm = state->getCTM(); - mat[0] = (SplashCoord)ctm[0]; - mat[1] = (SplashCoord)ctm[1]; - mat[2] = (SplashCoord)ctm[2]; - mat[3] = (SplashCoord)ctm[3]; - mat[4] = (SplashCoord)ctm[4]; - mat[5] = (SplashCoord)ctm[5]; - splash->setMatrix(mat); -} - -void SplashOutputDev::updateLineDash(GfxState *state) { - double *dashPattern; - int dashLength; - double dashStart; - SplashCoord dash[20]; - int i; - - state->getLineDash(&dashPattern, &dashLength, &dashStart); - if (dashLength > 20) { - dashLength = 20; - } - for (i = 0; i < dashLength; ++i) { - dash[i] = (SplashCoord)dashPattern[i]; - if (dash[i] < 0) { - dash[i] = 0; - } - } - splash->setLineDash(dash, dashLength, (SplashCoord)dashStart); -} - -void SplashOutputDev::updateFlatness(GfxState *state) { - splash->setFlatness(state->getFlatness()); -} - -void SplashOutputDev::updateLineJoin(GfxState *state) { - splash->setLineJoin(state->getLineJoin()); -} - -void SplashOutputDev::updateLineCap(GfxState *state) { - splash->setLineCap(state->getLineCap()); -} - -void SplashOutputDev::updateMiterLimit(GfxState *state) { - splash->setMiterLimit(state->getMiterLimit()); -} - -void SplashOutputDev::updateLineWidth(GfxState *state) { - splash->setLineWidth(state->getLineWidth()); -} - -void SplashOutputDev::updateStrokeAdjust(GfxState *state) { -#if 0 // the SA parameter supposedly defaults to false, but Acrobat - // apparently hardwires it to true - splash->setStrokeAdjust(state->getStrokeAdjust()); -#endif -} - -void SplashOutputDev::updateFillColor(GfxState *state) { - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - - state->getFillGray(&gray); - state->getFillRGB(&rgb); -#if SPLASH_CMYK - state->getFillCMYK(&cmyk); - splash->setFillPattern(getColor(gray, &rgb, &cmyk)); -#else - splash->setFillPattern(getColor(gray, &rgb)); -#endif -} - -void SplashOutputDev::updateStrokeColor(GfxState *state) { - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - - state->getStrokeGray(&gray); - state->getStrokeRGB(&rgb); -#if SPLASH_CMYK - state->getStrokeCMYK(&cmyk); - splash->setStrokePattern(getColor(gray, &rgb, &cmyk)); -#else - splash->setStrokePattern(getColor(gray, &rgb)); -#endif -} - -#if SPLASH_CMYK -SplashPattern *SplashOutputDev::getColor(GfxGray gray, GfxRGB *rgb, - GfxCMYK *cmyk) { -#else -SplashPattern *SplashOutputDev::getColor(GfxGray gray, GfxRGB *rgb) { -#endif - SplashPattern *pattern; - SplashColor color; - GfxColorComp r, g, b; - - if (reverseVideo) { - gray = gfxColorComp1 - gray; - r = gfxColorComp1 - rgb->r; - g = gfxColorComp1 - rgb->g; - b = gfxColorComp1 - rgb->b; - } else { - r = rgb->r; - g = rgb->g; - b = rgb->b; - } - - pattern = NULL; // make gcc happy - switch (colorMode) { - case splashModeMono1: - case splashModeMono8: - color[0] = colToByte(gray); - pattern = new SplashSolidColor(color); - break; - case splashModeRGB8: - case splashModeBGR8: - color[0] = colToByte(r); - color[1] = colToByte(g); - color[2] = colToByte(b); - pattern = new SplashSolidColor(color); - break; -#if SPLASH_CMYK - case splashModeCMYK8: - color[0] = colToByte(cmyk->c); - color[1] = colToByte(cmyk->m); - color[2] = colToByte(cmyk->y); - color[3] = colToByte(cmyk->k); - pattern = new SplashSolidColor(color); - break; -#endif - } - - return pattern; -} - -void SplashOutputDev::updateBlendMode(GfxState *state) { - splash->setBlendFunc(splashOutBlendFuncs[state->getBlendMode()]); -} - -void SplashOutputDev::updateFillOpacity(GfxState *state) { - splash->setFillAlpha((SplashCoord)state->getFillOpacity()); -} - -void SplashOutputDev::updateStrokeOpacity(GfxState *state) { - splash->setStrokeAlpha((SplashCoord)state->getStrokeOpacity()); -} - -void SplashOutputDev::updateFont(GfxState *state) { - needFontUpdate = gTrue; -} - -void SplashOutputDev::doUpdateFont(GfxState *state) { - GfxFont *gfxFont; - GfxFontType fontType; - SplashOutFontFileID *id; - SplashFontFile *fontFile; - FoFiTrueType *ff; - Ref embRef; - Object refObj, strObj; - GString *tmpFileName, *fileName, *substName; - FILE *tmpFile; - Gushort *codeToGID; - DisplayFontParam *dfp; - CharCodeToUnicode *ctu; - double *textMat; - double m11, m12, m21, m22, w1, w2, fontSize; - SplashCoord mat[4]; - char *name; - Unicode uBuf[8]; - int c, substIdx, n, code, cmap; - - needFontUpdate = gFalse; - font = NULL; - tmpFileName = NULL; - substIdx = -1; - dfp = NULL; - - if (!(gfxFont = state->getFont())) { - goto err1; - } - fontType = gfxFont->getType(); - if (fontType == fontType3) { - goto err1; - } - - // check the font file cache - id = new SplashOutFontFileID(gfxFont->getID()); - if ((fontFile = fontEngine->getFontFile(id))) { - delete id; - - } else { - - // if there is an embedded font, write it to disk - if (gfxFont->getEmbeddedFontID(&embRef)) { - if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) { - error(-1, "Couldn't create temporary font file"); - goto err2; - } - refObj.initRef(embRef.num, embRef.gen); - refObj.fetch(xref, &strObj); - refObj.free(); - if (!strObj.isStream()) { - error(-1, "Embedded font object is wrong type"); - strObj.free(); - fclose(tmpFile); - goto err2; - } - strObj.streamReset(); - while ((c = strObj.streamGetChar()) != EOF) { - fputc(c, tmpFile); - } - strObj.streamClose(); - strObj.free(); - fclose(tmpFile); - fileName = tmpFileName; - - // if there is an external font file, use it - } else if (!(fileName = gfxFont->getExtFontFile())) { - - // look for a display font mapping or a substitute font - if (gfxFont->isCIDFont()) { - if (((GfxCIDFont *)gfxFont)->getCollection()) { - dfp = globalParams-> - getDisplayCIDFont(gfxFont->getName(), - ((GfxCIDFont *)gfxFont)->getCollection()); - } - } else { - if (gfxFont->getName()) { - dfp = globalParams->getDisplayFont(gfxFont->getName()); - } - if (!dfp) { - // 8-bit font substitution - if (gfxFont->isFixedWidth()) { - substIdx = 8; - } else if (gfxFont->isSerif()) { - substIdx = 4; - } else { - substIdx = 0; - } - if (gfxFont->isBold()) { - substIdx += 2; - } - if (gfxFont->isItalic()) { - substIdx += 1; - } - substName = new GString(splashOutSubstFonts[substIdx].name); - dfp = globalParams->getDisplayFont(substName); - delete substName; - id->setSubstIdx(substIdx); - } - } - if (!dfp) { - error(-1, "Couldn't find a font for '%s'", - gfxFont->getName() ? gfxFont->getName()->getCString() - : "(unnamed)"); - goto err2; - } - switch (dfp->kind) { - case displayFontT1: - fileName = dfp->t1.fileName; - fontType = gfxFont->isCIDFont() ? fontCIDType0 : fontType1; - break; - case displayFontTT: - fileName = dfp->tt.fileName; - fontType = gfxFont->isCIDFont() ? fontCIDType2 : fontTrueType; - break; - } - } - - // load the font file - switch (fontType) { - case fontType1: - if (!(fontFile = fontEngine->loadType1Font( - id, - fileName->getCString(), - fileName == tmpFileName, - ((Gfx8BitFont *)gfxFont)->getEncoding()))) { - error(-1, "Couldn't create a font for '%s'", - gfxFont->getName() ? gfxFont->getName()->getCString() - : "(unnamed)"); - goto err2; - } - break; - case fontType1C: - if (!(fontFile = fontEngine->loadType1CFont( - id, - fileName->getCString(), - fileName == tmpFileName, - ((Gfx8BitFont *)gfxFont)->getEncoding()))) { - error(-1, "Couldn't create a font for '%s'", - gfxFont->getName() ? gfxFont->getName()->getCString() - : "(unnamed)"); - goto err2; - } - break; - case fontType1COT: - if (!(fontFile = fontEngine->loadOpenTypeT1CFont( - id, - fileName->getCString(), - fileName == tmpFileName, - ((Gfx8BitFont *)gfxFont)->getEncoding()))) { - error(-1, "Couldn't create a font for '%s'", - gfxFont->getName() ? gfxFont->getName()->getCString() - : "(unnamed)"); - goto err2; - } - break; - case fontTrueType: - case fontTrueTypeOT: - if ((ff = FoFiTrueType::load(fileName->getCString()))) { - codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff); - n = 256; - delete ff; - } else { - codeToGID = NULL; - n = 0; - } - if (!(fontFile = fontEngine->loadTrueTypeFont( - id, - fileName->getCString(), - fileName == tmpFileName, - codeToGID, n))) { - error(-1, "Couldn't create a font for '%s'", - gfxFont->getName() ? gfxFont->getName()->getCString() - : "(unnamed)"); - goto err2; - } - break; - case fontCIDType0: - case fontCIDType0C: - if (!(fontFile = fontEngine->loadCIDFont( - id, - fileName->getCString(), - fileName == tmpFileName))) { - error(-1, "Couldn't create a font for '%s'", - gfxFont->getName() ? gfxFont->getName()->getCString() - : "(unnamed)"); - goto err2; - } - break; - case fontCIDType0COT: - if (!(fontFile = fontEngine->loadOpenTypeCFFFont( - id, - fileName->getCString(), - fileName == tmpFileName))) { - error(-1, "Couldn't create a font for '%s'", - gfxFont->getName() ? gfxFont->getName()->getCString() - : "(unnamed)"); - goto err2; - } - break; - case fontCIDType2: - case fontCIDType2OT: - codeToGID = NULL; - n = 0; - if (dfp) { - // create a CID-to-GID mapping, via Unicode - if ((ctu = ((GfxCIDFont *)gfxFont)->getToUnicode())) { - if ((ff = FoFiTrueType::load(fileName->getCString()))) { - // look for a Unicode cmap - for (cmap = 0; cmap < ff->getNumCmaps(); ++cmap) { - if ((ff->getCmapPlatform(cmap) == 3 && - ff->getCmapEncoding(cmap) == 1) || - ff->getCmapPlatform(cmap) == 0) { - break; - } - } - if (cmap < ff->getNumCmaps()) { - // map CID -> Unicode -> GID - n = ctu->getLength(); - codeToGID = (Gushort *)gmallocn(n, sizeof(Gushort)); - for (code = 0; code < n; ++code) { - if (ctu->mapToUnicode(code, uBuf, 8) > 0) { - codeToGID[code] = ff->mapCodeToGID(cmap, uBuf[0]); - } else { - codeToGID[code] = 0; - } - } - } - delete ff; - } - ctu->decRefCnt(); - } else { - error(-1, "Couldn't find a mapping to Unicode for font '%s'", - gfxFont->getName() ? gfxFont->getName()->getCString() - : "(unnamed)"); - } - } else { - if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { - n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); - codeToGID = (Gushort *)gmallocn(n, sizeof(Gushort)); - memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), - n * sizeof(Gushort)); - } - } - if (!(fontFile = fontEngine->loadTrueTypeFont( - id, - fileName->getCString(), - fileName == tmpFileName, - codeToGID, n))) { - error(-1, "Couldn't create a font for '%s'", - gfxFont->getName() ? gfxFont->getName()->getCString() - : "(unnamed)"); - goto err2; - } - break; - default: - // this shouldn't happen - goto err2; - } - } - - // get the font matrix - textMat = state->getTextMat(); - fontSize = state->getFontSize(); - m11 = textMat[0] * fontSize * state->getHorizScaling(); - m12 = textMat[1] * fontSize * state->getHorizScaling(); - m21 = textMat[2] * fontSize; - m22 = textMat[3] * fontSize; - - // for substituted fonts: adjust the font matrix -- compare the - // width of 'm' in the original font and the substituted font - substIdx = ((SplashOutFontFileID *)fontFile->getID())->getSubstIdx(); - if (substIdx >= 0) { - for (code = 0; code < 256; ++code) { - if ((name = ((Gfx8BitFont *)gfxFont)->getCharName(code)) && - name[0] == 'm' && name[1] == '\0') { - break; - } - } - if (code < 256) { - w1 = ((Gfx8BitFont *)gfxFont)->getWidth(code); - w2 = splashOutSubstFonts[substIdx].mWidth; - if (!gfxFont->isSymbolic()) { - // if real font is substantially narrower than substituted - // font, reduce the font size accordingly - if (w1 > 0.01 && w1 < 0.9 * w2) { - w1 /= w2; - m11 *= w1; - m21 *= w1; - } - } - } - } - - // create the scaled font - mat[0] = m11; mat[1] = m12; - mat[2] = m21; mat[3] = m22; - font = fontEngine->getFont(fontFile, mat, splash->getMatrix()); - - if (tmpFileName) { - delete tmpFileName; - } - return; - - err2: - delete id; - err1: - if (tmpFileName) { - unlink(tmpFileName->getCString()); - delete tmpFileName; - } - return; -} - -void SplashOutputDev::stroke(GfxState *state) { - SplashPath *path; - - if (state->getStrokeColorSpace()->isNonMarking()) { - return; - } - path = convertPath(state, state->getPath()); - splash->stroke(path); - delete path; -} - -void SplashOutputDev::fill(GfxState *state) { - SplashPath *path; - - if (state->getFillColorSpace()->isNonMarking()) { - return; - } - path = convertPath(state, state->getPath()); - splash->fill(path, gFalse); - delete path; -} - -void SplashOutputDev::eoFill(GfxState *state) { - SplashPath *path; - - if (state->getFillColorSpace()->isNonMarking()) { - return; - } - path = convertPath(state, state->getPath()); - splash->fill(path, gTrue); - delete path; -} - -void SplashOutputDev::clip(GfxState *state) { - SplashPath *path; - - path = convertPath(state, state->getPath()); - splash->clipToPath(path, gFalse); - delete path; -} - -void SplashOutputDev::eoClip(GfxState *state) { - SplashPath *path; - - path = convertPath(state, state->getPath()); - splash->clipToPath(path, gTrue); - delete path; -} - -void SplashOutputDev::clipToStrokePath(GfxState *state) { - SplashPath *path, *path2; - - path = convertPath(state, state->getPath()); - path2 = splash->makeStrokePath(path); - delete path; - splash->clipToPath(path2, gFalse); - delete path2; -} - -SplashPath *SplashOutputDev::convertPath(GfxState *state, GfxPath *path) { - SplashPath *sPath; - GfxSubpath *subpath; - int i, j; - - sPath = new SplashPath(); - for (i = 0; i < path->getNumSubpaths(); ++i) { - subpath = path->getSubpath(i); - if (subpath->getNumPoints() > 0) { - sPath->moveTo((SplashCoord)subpath->getX(0), - (SplashCoord)subpath->getY(0)); - j = 1; - while (j < subpath->getNumPoints()) { - if (subpath->getCurve(j)) { - sPath->curveTo((SplashCoord)subpath->getX(j), - (SplashCoord)subpath->getY(j), - (SplashCoord)subpath->getX(j+1), - (SplashCoord)subpath->getY(j+1), - (SplashCoord)subpath->getX(j+2), - (SplashCoord)subpath->getY(j+2)); - j += 3; - } else { - sPath->lineTo((SplashCoord)subpath->getX(j), - (SplashCoord)subpath->getY(j)); - ++j; - } - } - if (subpath->isClosed()) { - sPath->close(); - } - } - } - return sPath; -} - -void SplashOutputDev::drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, - Unicode *u, int uLen) { - SplashPath *path; - int render; - - // check for invisible text -- this is used by Acrobat Capture - render = state->getRender(); - if (render == 3) { - return; - } - - if (needFontUpdate) { - doUpdateFont(state); - } - if (!font) { - return; - } - - x -= originX; - y -= originY; - - // fill - if (!(render & 1)) { - if (!state->getFillColorSpace()->isNonMarking()) { - splash->fillChar((SplashCoord)x, (SplashCoord)y, code, font); - } - } - - // stroke - if ((render & 3) == 1 || (render & 3) == 2) { - if (!state->getStrokeColorSpace()->isNonMarking()) { - if ((path = font->getGlyphPath(code))) { - path->offset((SplashCoord)x, (SplashCoord)y); - splash->stroke(path); - delete path; - } - } - } - - // clip - if (render & 4) { - if ((path = font->getGlyphPath(code))) { - path->offset((SplashCoord)x, (SplashCoord)y); - if (textClipPath) { - textClipPath->append(path); - delete path; - } else { - textClipPath = path; - } - } - } -} - -GBool SplashOutputDev::beginType3Char(GfxState *state, double x, double y, - double dx, double dy, - CharCode code, Unicode *u, int uLen) { - GfxFont *gfxFont; - Ref *fontID; - double *ctm, *bbox; - T3FontCache *t3Font; - T3GlyphStack *t3gs; - GBool validBBox; - double x1, y1, xMin, yMin, xMax, yMax, xt, yt; - int i, j; - - if (!(gfxFont = state->getFont())) { - return gFalse; - } - fontID = gfxFont->getID(); - ctm = state->getCTM(); - state->transform(0, 0, &xt, &yt); - - // is it the first (MRU) font in the cache? - if (!(nT3Fonts > 0 && - t3FontCache[0]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3]))) { - - // is the font elsewhere in the cache? - for (i = 1; i < nT3Fonts; ++i) { - if (t3FontCache[i]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3])) { - t3Font = t3FontCache[i]; - for (j = i; j > 0; --j) { - t3FontCache[j] = t3FontCache[j - 1]; - } - t3FontCache[0] = t3Font; - break; - } - } - if (i >= nT3Fonts) { - - // create new entry in the font cache - if (nT3Fonts == splashOutT3FontCacheSize) { - delete t3FontCache[nT3Fonts - 1]; - --nT3Fonts; - } - for (j = nT3Fonts; j > 0; --j) { - t3FontCache[j] = t3FontCache[j - 1]; - } - ++nT3Fonts; - bbox = gfxFont->getFontBBox(); - if (bbox[0] == 0 && bbox[1] == 0 && bbox[2] == 0 && bbox[3] == 0) { - // unspecified bounding box -- just take a guess - xMin = xt - 5; - xMax = xMin + 30; - yMax = yt + 15; - yMin = yMax - 45; - validBBox = gFalse; - } else { - state->transform(bbox[0], bbox[1], &x1, &y1); - xMin = xMax = x1; - yMin = yMax = y1; - state->transform(bbox[0], bbox[3], &x1, &y1); - if (x1 < xMin) { - xMin = x1; - } else if (x1 > xMax) { - xMax = x1; - } - if (y1 < yMin) { - yMin = y1; - } else if (y1 > yMax) { - yMax = y1; - } - state->transform(bbox[2], bbox[1], &x1, &y1); - if (x1 < xMin) { - xMin = x1; - } else if (x1 > xMax) { - xMax = x1; - } - if (y1 < yMin) { - yMin = y1; - } else if (y1 > yMax) { - yMax = y1; - } - state->transform(bbox[2], bbox[3], &x1, &y1); - if (x1 < xMin) { - xMin = x1; - } else if (x1 > xMax) { - xMax = x1; - } - if (y1 < yMin) { - yMin = y1; - } else if (y1 > yMax) { - yMax = y1; - } - validBBox = gTrue; - } - t3FontCache[0] = new T3FontCache(fontID, ctm[0], ctm[1], ctm[2], ctm[3], - (int)floor(xMin - xt), - (int)floor(yMin - yt), - (int)ceil(xMax) - (int)floor(xMin) + 3, - (int)ceil(yMax) - (int)floor(yMin) + 3, - validBBox, - colorMode != splashModeMono1); - } - } - t3Font = t3FontCache[0]; - - // is the glyph in the cache? - i = (code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc; - for (j = 0; j < t3Font->cacheAssoc; ++j) { - if ((t3Font->cacheTags[i+j].mru & 0x8000) && - t3Font->cacheTags[i+j].code == code) { - drawType3Glyph(t3Font, &t3Font->cacheTags[i+j], - t3Font->cacheData + (i+j) * t3Font->glyphSize); - return gTrue; - } - } - - // push a new Type 3 glyph record - t3gs = new T3GlyphStack(); - t3gs->next = t3GlyphStack; - t3GlyphStack = t3gs; - t3GlyphStack->code = code; - t3GlyphStack->cache = t3Font; - t3GlyphStack->cacheTag = NULL; - t3GlyphStack->cacheData = NULL; - - return gFalse; -} - -void SplashOutputDev::endType3Char(GfxState *state) { - T3GlyphStack *t3gs; - double *ctm; - - if (t3GlyphStack->cacheTag) { - memcpy(t3GlyphStack->cacheData, bitmap->getDataPtr(), - t3GlyphStack->cache->glyphSize); - delete bitmap; - delete splash; - bitmap = t3GlyphStack->origBitmap; - splash = t3GlyphStack->origSplash; - ctm = state->getCTM(); - state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3], - t3GlyphStack->origCTM4, t3GlyphStack->origCTM5); - updateCTM(state, 0, 0, 0, 0, 0, 0); - drawType3Glyph(t3GlyphStack->cache, - t3GlyphStack->cacheTag, t3GlyphStack->cacheData); - } - t3gs = t3GlyphStack; - t3GlyphStack = t3gs->next; - delete t3gs; -} - -void SplashOutputDev::type3D0(GfxState *state, double wx, double wy) { -} - -void SplashOutputDev::type3D1(GfxState *state, double wx, double wy, - double llx, double lly, double urx, double ury) { - double *ctm; - T3FontCache *t3Font; - SplashColor color; - double xt, yt, xMin, xMax, yMin, yMax, x1, y1; - int i, j; - - t3Font = t3GlyphStack->cache; - - // check for a valid bbox - state->transform(0, 0, &xt, &yt); - state->transform(llx, lly, &x1, &y1); - xMin = xMax = x1; - yMin = yMax = y1; - state->transform(llx, ury, &x1, &y1); - if (x1 < xMin) { - xMin = x1; - } else if (x1 > xMax) { - xMax = x1; - } - if (y1 < yMin) { - yMin = y1; - } else if (y1 > yMax) { - yMax = y1; - } - state->transform(urx, lly, &x1, &y1); - if (x1 < xMin) { - xMin = x1; - } else if (x1 > xMax) { - xMax = x1; - } - if (y1 < yMin) { - yMin = y1; - } else if (y1 > yMax) { - yMax = y1; - } - state->transform(urx, ury, &x1, &y1); - if (x1 < xMin) { - xMin = x1; - } else if (x1 > xMax) { - xMax = x1; - } - if (y1 < yMin) { - yMin = y1; - } else if (y1 > yMax) { - yMax = y1; - } - if (xMin - xt < t3Font->glyphX || - yMin - yt < t3Font->glyphY || - xMax - xt > t3Font->glyphX + t3Font->glyphW || - yMax - yt > t3Font->glyphY + t3Font->glyphH) { - if (t3Font->validBBox) { - error(-1, "Bad bounding box in Type 3 glyph"); - } - return; - } - - // allocate a cache entry - i = (t3GlyphStack->code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc; - for (j = 0; j < t3Font->cacheAssoc; ++j) { - if ((t3Font->cacheTags[i+j].mru & 0x7fff) == t3Font->cacheAssoc - 1) { - t3Font->cacheTags[i+j].mru = 0x8000; - t3Font->cacheTags[i+j].code = t3GlyphStack->code; - t3GlyphStack->cacheTag = &t3Font->cacheTags[i+j]; - t3GlyphStack->cacheData = t3Font->cacheData + (i+j) * t3Font->glyphSize; - } else { - ++t3Font->cacheTags[i+j].mru; - } - } - - // save state - t3GlyphStack->origBitmap = bitmap; - t3GlyphStack->origSplash = splash; - ctm = state->getCTM(); - t3GlyphStack->origCTM4 = ctm[4]; - t3GlyphStack->origCTM5 = ctm[5]; - - // create the temporary bitmap - if (colorMode == splashModeMono1) { - bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1, - splashModeMono1, gFalse); - splash = new Splash(bitmap, gFalse, - t3GlyphStack->origSplash->getScreen()); - color[0] = 0; - splash->clear(color); - color[0] = 1; - } else { - bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1, - splashModeMono8, gFalse); - splash = new Splash(bitmap, vectorAntialias, - t3GlyphStack->origSplash->getScreen()); - color[0] = 0x00; - splash->clear(color); - color[0] = 0xff; - } - splash->setFillPattern(new SplashSolidColor(color)); - splash->setStrokePattern(new SplashSolidColor(color)); - //~ this should copy other state from t3GlyphStack->origSplash? - state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3], - -t3Font->glyphX, -t3Font->glyphY); - updateCTM(state, 0, 0, 0, 0, 0, 0); -} - -void SplashOutputDev::drawType3Glyph(T3FontCache *t3Font, - T3FontCacheTag *tag, Guchar *data) { - SplashGlyphBitmap glyph; - - glyph.x = -t3Font->glyphX; - glyph.y = -t3Font->glyphY; - glyph.w = t3Font->glyphW; - glyph.h = t3Font->glyphH; - glyph.aa = colorMode != splashModeMono1; - glyph.data = data; - glyph.freeData = gFalse; - splash->fillGlyph(0, 0, &glyph); -} - -void SplashOutputDev::endTextObject(GfxState *state) { - if (textClipPath) { - splash->clipToPath(textClipPath, gFalse); - delete textClipPath; - textClipPath = NULL; - } -} - -struct SplashOutImageMaskData { - ImageStream *imgStr; - GBool invert; - int width, height, y; -}; - -GBool SplashOutputDev::imageMaskSrc(void *data, SplashColorPtr line) { - SplashOutImageMaskData *imgMaskData = (SplashOutImageMaskData *)data; - Guchar *p; - SplashColorPtr q; - int x; - - if (imgMaskData->y == imgMaskData->height) { - return gFalse; - } - for (x = 0, p = imgMaskData->imgStr->getLine(), q = line; - x < imgMaskData->width; - ++x) { - *q++ = *p++ ^ imgMaskData->invert; - } - ++imgMaskData->y; - return gTrue; -} - -void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - GBool inlineImg) { - double *ctm; - SplashCoord mat[6]; - SplashOutImageMaskData imgMaskData; - - if (state->getFillColorSpace()->isNonMarking()) { - return; - } - - ctm = state->getCTM(); - mat[0] = ctm[0]; - mat[1] = ctm[1]; - mat[2] = -ctm[2]; - mat[3] = -ctm[3]; - mat[4] = ctm[2] + ctm[4]; - mat[5] = ctm[3] + ctm[5]; - - imgMaskData.imgStr = new ImageStream(str, width, 1, 1); - imgMaskData.imgStr->reset(); - imgMaskData.invert = invert ? 0 : 1; - imgMaskData.width = width; - imgMaskData.height = height; - imgMaskData.y = 0; - - splash->fillImageMask(&imageMaskSrc, &imgMaskData, width, height, mat, - t3GlyphStack != NULL); - if (inlineImg) { - while (imgMaskData.y < height) { - imgMaskData.imgStr->getLine(); - ++imgMaskData.y; - } - } - - delete imgMaskData.imgStr; - str->close(); -} - -struct SplashOutImageData { - ImageStream *imgStr; - GfxImageColorMap *colorMap; - SplashColorPtr lookup; - int *maskColors; - SplashColorMode colorMode; - int width, height, y; -}; - -GBool SplashOutputDev::imageSrc(void *data, SplashColorPtr colorLine, - Guchar *alphaLine) { - SplashOutImageData *imgData = (SplashOutImageData *)data; - Guchar *p; - SplashColorPtr q, col; - GfxRGB rgb; - GfxGray gray; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - int nComps, x; - - if (imgData->y == imgData->height) { - return gFalse; - } - - nComps = imgData->colorMap->getNumPixelComps(); - - if (imgData->lookup) { - switch (imgData->colorMode) { - case splashModeMono1: - case splashModeMono8: - for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; - x < imgData->width; - ++x, ++p) { - *q++ = imgData->lookup[*p]; - } - break; - case splashModeRGB8: - case splashModeBGR8: - for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; - x < imgData->width; - ++x, ++p) { - col = &imgData->lookup[3 * *p]; - *q++ = col[0]; - *q++ = col[1]; - *q++ = col[2]; - } - break; -#if SPLASH_CMYK - case splashModeCMYK8: - for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; - x < imgData->width; - ++x, ++p) { - col = &imgData->lookup[4 * *p]; - *q++ = col[0]; - *q++ = col[1]; - *q++ = col[2]; - *q++ = col[3]; - } - break; -#endif - } - } else { - switch (imgData->colorMode) { - case splashModeMono1: - case splashModeMono8: - for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; - x < imgData->width; - ++x, p += nComps) { - imgData->colorMap->getGray(p, &gray); - *q++ = colToByte(gray); - } - break; - case splashModeRGB8: - case splashModeBGR8: - for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; - x < imgData->width; - ++x, p += nComps) { - imgData->colorMap->getRGB(p, &rgb); - *q++ = colToByte(rgb.r); - *q++ = colToByte(rgb.g); - *q++ = colToByte(rgb.b); - } - break; -#if SPLASH_CMYK - case splashModeCMYK8: - for (x = 0, p = imgData->imgStr->getLine(), q = colorLine; - x < imgData->width; - ++x, p += nComps) { - imgData->colorMap->getCMYK(p, &cmyk); - *q++ = colToByte(cmyk.c); - *q++ = colToByte(cmyk.m); - *q++ = colToByte(cmyk.y); - *q++ = colToByte(cmyk.k); - } - break; -#endif - } - } - - ++imgData->y; - return gTrue; -} - -GBool SplashOutputDev::alphaImageSrc(void *data, SplashColorPtr colorLine, - Guchar *alphaLine) { - SplashOutImageData *imgData = (SplashOutImageData *)data; - Guchar *p, *aq; - SplashColorPtr q, col; - GfxRGB rgb; - GfxGray gray; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - Guchar alpha; - int nComps, x, i; - - if (imgData->y == imgData->height) { - return gFalse; - } - - nComps = imgData->colorMap->getNumPixelComps(); - - for (x = 0, p = imgData->imgStr->getLine(), q = colorLine, aq = alphaLine; - x < imgData->width; - ++x, p += nComps) { - alpha = 0; - for (i = 0; i < nComps; ++i) { - if (p[i] < imgData->maskColors[2*i] || - p[i] > imgData->maskColors[2*i+1]) { - alpha = 0xff; - break; - } - } - if (imgData->lookup) { - switch (imgData->colorMode) { - case splashModeMono1: - case splashModeMono8: - *q++ = imgData->lookup[*p]; - *aq++ = alpha; - break; - case splashModeRGB8: - case splashModeBGR8: - col = &imgData->lookup[3 * *p]; - *q++ = col[0]; - *q++ = col[1]; - *q++ = col[2]; - *aq++ = alpha; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - col = &imgData->lookup[4 * *p]; - *q++ = col[0]; - *q++ = col[1]; - *q++ = col[2]; - *q++ = col[3]; - *aq++ = alpha; - break; -#endif - } - } else { - switch (imgData->colorMode) { - case splashModeMono1: - case splashModeMono8: - imgData->colorMap->getGray(p, &gray); - *q++ = colToByte(gray); - *aq++ = alpha; - break; - case splashModeRGB8: - case splashModeBGR8: - imgData->colorMap->getRGB(p, &rgb); - *q++ = colToByte(rgb.r); - *q++ = colToByte(rgb.g); - *q++ = colToByte(rgb.b); - *aq++ = alpha; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - imgData->colorMap->getCMYK(p, &cmyk); - *q++ = colToByte(cmyk.c); - *q++ = colToByte(cmyk.m); - *q++ = colToByte(cmyk.y); - *q++ = colToByte(cmyk.k); - *aq++ = alpha; - break; -#endif - } - } - } - - ++imgData->y; - return gTrue; -} - -void SplashOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - int *maskColors, GBool inlineImg) { - double *ctm; - SplashCoord mat[6]; - SplashOutImageData imgData; - SplashColorMode srcMode; - SplashImageSource src; - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - Guchar pix; - int n, i; - - ctm = state->getCTM(); - mat[0] = ctm[0]; - mat[1] = ctm[1]; - mat[2] = -ctm[2]; - mat[3] = -ctm[3]; - mat[4] = ctm[2] + ctm[4]; - mat[5] = ctm[3] + ctm[5]; - - imgData.imgStr = new ImageStream(str, width, - colorMap->getNumPixelComps(), - colorMap->getBits()); - imgData.imgStr->reset(); - imgData.colorMap = colorMap; - imgData.maskColors = maskColors; - imgData.colorMode = colorMode; - imgData.width = width; - imgData.height = height; - imgData.y = 0; - - // special case for one-channel (monochrome/gray/separation) images: - // build a lookup table here - imgData.lookup = NULL; - if (colorMap->getNumPixelComps() == 1) { - n = 1 << colorMap->getBits(); - switch (colorMode) { - case splashModeMono1: - case splashModeMono8: - imgData.lookup = (SplashColorPtr)gmalloc(n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getGray(&pix, &gray); - imgData.lookup[i] = colToByte(gray); - } - break; - case splashModeRGB8: - case splashModeBGR8: - imgData.lookup = (SplashColorPtr)gmalloc(3 * n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getRGB(&pix, &rgb); - imgData.lookup[3*i] = colToByte(rgb.r); - imgData.lookup[3*i+1] = colToByte(rgb.g); - imgData.lookup[3*i+2] = colToByte(rgb.b); - } - break; -#if SPLASH_CMYK - case splashModeCMYK8: - imgData.lookup = (SplashColorPtr)gmalloc(4 * n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getCMYK(&pix, &cmyk); - imgData.lookup[4*i] = colToByte(cmyk.c); - imgData.lookup[4*i+1] = colToByte(cmyk.m); - imgData.lookup[4*i+2] = colToByte(cmyk.y); - imgData.lookup[4*i+3] = colToByte(cmyk.k); - } - break; -#endif - break; - } - } - - if (colorMode == splashModeMono1) { - srcMode = splashModeMono8; - } else { - srcMode = colorMode; - } - src = maskColors ? &alphaImageSrc : &imageSrc; - splash->drawImage(src, &imgData, srcMode, maskColors ? gTrue : gFalse, - width, height, mat); - if (inlineImg) { - while (imgData.y < height) { - imgData.imgStr->getLine(); - ++imgData.y; - } - } - - gfree(imgData.lookup); - delete imgData.imgStr; - str->close(); -} - -struct SplashOutMaskedImageData { - ImageStream *imgStr; - GfxImageColorMap *colorMap; - SplashBitmap *mask; - SplashColorPtr lookup; - SplashColorMode colorMode; - int width, height, y; -}; - -GBool SplashOutputDev::maskedImageSrc(void *data, SplashColorPtr colorLine, - Guchar *alphaLine) { - SplashOutMaskedImageData *imgData = (SplashOutMaskedImageData *)data; - Guchar *p, *aq; - SplashColor maskColor; - SplashColorPtr q, col; - GfxRGB rgb; - GfxGray gray; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - Guchar alpha; - int nComps, x; - - if (imgData->y == imgData->height) { - return gFalse; - } - - nComps = imgData->colorMap->getNumPixelComps(); - - for (x = 0, p = imgData->imgStr->getLine(), q = colorLine, aq = alphaLine; - x < imgData->width; - ++x, p += nComps) { - imgData->mask->getPixel(x, imgData->y, maskColor); - alpha = maskColor[0] ? 0xff : 0x00; - if (imgData->lookup) { - switch (imgData->colorMode) { - case splashModeMono1: - case splashModeMono8: - *q++ = imgData->lookup[*p]; - *aq++ = alpha; - break; - case splashModeRGB8: - case splashModeBGR8: - col = &imgData->lookup[3 * *p]; - *q++ = col[0]; - *q++ = col[1]; - *q++ = col[2]; - *aq++ = alpha; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - col = &imgData->lookup[4 * *p]; - *q++ = col[0]; - *q++ = col[1]; - *q++ = col[2]; - *q++ = col[3]; - *aq++ = alpha; - break; -#endif - } - } else { - switch (imgData->colorMode) { - case splashModeMono1: - case splashModeMono8: - imgData->colorMap->getGray(p, &gray); - *q++ = colToByte(gray); - *aq++ = alpha; - break; - case splashModeRGB8: - case splashModeBGR8: - imgData->colorMap->getRGB(p, &rgb); - *q++ = colToByte(rgb.r); - *q++ = colToByte(rgb.g); - *q++ = colToByte(rgb.b); - *aq++ = alpha; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - imgData->colorMap->getCMYK(p, &cmyk); - *q++ = colToByte(cmyk.c); - *q++ = colToByte(cmyk.m); - *q++ = colToByte(cmyk.y); - *q++ = colToByte(cmyk.k); - *aq++ = alpha; - break; -#endif - } - } - } - - ++imgData->y; - return gTrue; -} - -void SplashOutputDev::drawMaskedImage(GfxState *state, Object *ref, - Stream *str, int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, int maskWidth, - int maskHeight, GBool maskInvert) { - GfxImageColorMap *maskColorMap; - Object maskDecode, decodeLow, decodeHigh; - double *ctm; - SplashCoord mat[6]; - SplashOutMaskedImageData imgData; - SplashOutImageMaskData imgMaskData; - SplashColorMode srcMode; - SplashBitmap *maskBitmap; - Splash *maskSplash; - SplashColor maskColor; - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - Guchar pix; - int n, i; - - // If the mask is higher resolution than the image, use - // drawSoftMaskedImage() instead. - if (maskWidth > width || maskHeight > height) { - decodeLow.initInt(maskInvert ? 0 : 1); - decodeHigh.initInt(maskInvert ? 1 : 0); - maskDecode.initArray(xref); - maskDecode.arrayAdd(&decodeLow); - maskDecode.arrayAdd(&decodeHigh); - maskColorMap = new GfxImageColorMap(1, &maskDecode, - new GfxDeviceGrayColorSpace()); - maskDecode.free(); - drawSoftMaskedImage(state, ref, str, width, height, colorMap, - maskStr, maskWidth, maskHeight, maskColorMap); - delete maskColorMap; - - } else { - - //----- scale the mask image to the same size as the source image - - mat[0] = (SplashCoord)width; - mat[1] = 0; - mat[2] = 0; - mat[3] = (SplashCoord)height; - mat[4] = 0; - mat[5] = 0; - imgMaskData.imgStr = new ImageStream(maskStr, maskWidth, 1, 1); - imgMaskData.imgStr->reset(); - imgMaskData.invert = maskInvert ? 0 : 1; - imgMaskData.width = maskWidth; - imgMaskData.height = maskHeight; - imgMaskData.y = 0; - maskBitmap = new SplashBitmap(width, height, 1, splashModeMono1, gFalse); - maskSplash = new Splash(maskBitmap, gFalse); - maskColor[0] = 0; - maskSplash->clear(maskColor); - maskColor[0] = 0xff; - maskSplash->setFillPattern(new SplashSolidColor(maskColor)); - maskSplash->fillImageMask(&imageMaskSrc, &imgMaskData, - maskWidth, maskHeight, mat, gFalse); - delete imgMaskData.imgStr; - maskStr->close(); - delete maskSplash; - - //----- draw the source image - - ctm = state->getCTM(); - mat[0] = ctm[0]; - mat[1] = ctm[1]; - mat[2] = -ctm[2]; - mat[3] = -ctm[3]; - mat[4] = ctm[2] + ctm[4]; - mat[5] = ctm[3] + ctm[5]; - - imgData.imgStr = new ImageStream(str, width, - colorMap->getNumPixelComps(), - colorMap->getBits()); - imgData.imgStr->reset(); - imgData.colorMap = colorMap; - imgData.mask = maskBitmap; - imgData.colorMode = colorMode; - imgData.width = width; - imgData.height = height; - imgData.y = 0; - - // special case for one-channel (monochrome/gray/separation) images: - // build a lookup table here - imgData.lookup = NULL; - if (colorMap->getNumPixelComps() == 1) { - n = 1 << colorMap->getBits(); - switch (colorMode) { - case splashModeMono1: - case splashModeMono8: - imgData.lookup = (SplashColorPtr)gmalloc(n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getGray(&pix, &gray); - imgData.lookup[i] = colToByte(gray); - } - break; - case splashModeRGB8: - case splashModeBGR8: - imgData.lookup = (SplashColorPtr)gmalloc(3 * n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getRGB(&pix, &rgb); - imgData.lookup[3*i] = colToByte(rgb.r); - imgData.lookup[3*i+1] = colToByte(rgb.g); - imgData.lookup[3*i+2] = colToByte(rgb.b); - } - break; -#if SPLASH_CMYK - case splashModeCMYK8: - imgData.lookup = (SplashColorPtr)gmalloc(4 * n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getCMYK(&pix, &cmyk); - imgData.lookup[4*i] = colToByte(cmyk.c); - imgData.lookup[4*i+1] = colToByte(cmyk.m); - imgData.lookup[4*i+2] = colToByte(cmyk.y); - imgData.lookup[4*i+3] = colToByte(cmyk.k); - } - break; -#endif - } - } - - if (colorMode == splashModeMono1) { - srcMode = splashModeMono8; - } else { - srcMode = colorMode; - } - splash->drawImage(&maskedImageSrc, &imgData, srcMode, gTrue, - width, height, mat); - - delete maskBitmap; - gfree(imgData.lookup); - delete imgData.imgStr; - str->close(); - } -} - -void SplashOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, - Stream *str, int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap) { - double *ctm; - SplashCoord mat[6]; - SplashOutImageData imgData; - SplashOutImageData imgMaskData; - SplashColorMode srcMode; - SplashBitmap *maskBitmap; - Splash *maskSplash; - SplashColor maskColor; - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - Guchar pix; - int n, i; - - ctm = state->getCTM(); - mat[0] = ctm[0]; - mat[1] = ctm[1]; - mat[2] = -ctm[2]; - mat[3] = -ctm[3]; - mat[4] = ctm[2] + ctm[4]; - mat[5] = ctm[3] + ctm[5]; - - //----- set up the soft mask - - imgMaskData.imgStr = new ImageStream(maskStr, maskWidth, - maskColorMap->getNumPixelComps(), - maskColorMap->getBits()); - imgMaskData.imgStr->reset(); - imgMaskData.colorMap = maskColorMap; - imgMaskData.maskColors = NULL; - imgMaskData.colorMode = splashModeMono8; - imgMaskData.width = maskWidth; - imgMaskData.height = maskHeight; - imgMaskData.y = 0; - n = 1 << maskColorMap->getBits(); - imgMaskData.lookup = (SplashColorPtr)gmalloc(n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - maskColorMap->getGray(&pix, &gray); - imgMaskData.lookup[i] = colToByte(gray); - } - maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), - 1, splashModeMono8, gFalse); - maskSplash = new Splash(maskBitmap, vectorAntialias); - maskColor[0] = 0; - maskSplash->clear(maskColor); - maskSplash->drawImage(&imageSrc, &imgMaskData, splashModeMono8, gFalse, - maskWidth, maskHeight, mat); - delete imgMaskData.imgStr; - maskStr->close(); - gfree(imgMaskData.lookup); - delete maskSplash; - splash->setSoftMask(maskBitmap); - - //----- draw the source image - - imgData.imgStr = new ImageStream(str, width, - colorMap->getNumPixelComps(), - colorMap->getBits()); - imgData.imgStr->reset(); - imgData.colorMap = colorMap; - imgData.maskColors = NULL; - imgData.colorMode = colorMode; - imgData.width = width; - imgData.height = height; - imgData.y = 0; - - // special case for one-channel (monochrome/gray/separation) images: - // build a lookup table here - imgData.lookup = NULL; - if (colorMap->getNumPixelComps() == 1) { - n = 1 << colorMap->getBits(); - switch (colorMode) { - case splashModeMono1: - case splashModeMono8: - imgData.lookup = (SplashColorPtr)gmalloc(n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getGray(&pix, &gray); - imgData.lookup[i] = colToByte(gray); - } - break; - case splashModeRGB8: - case splashModeBGR8: - imgData.lookup = (SplashColorPtr)gmalloc(3 * n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getRGB(&pix, &rgb); - imgData.lookup[3*i] = colToByte(rgb.r); - imgData.lookup[3*i+1] = colToByte(rgb.g); - imgData.lookup[3*i+2] = colToByte(rgb.b); - } - break; -#if SPLASH_CMYK - case splashModeCMYK8: - imgData.lookup = (SplashColorPtr)gmalloc(4 * n); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getCMYK(&pix, &cmyk); - imgData.lookup[4*i] = colToByte(cmyk.c); - imgData.lookup[4*i+1] = colToByte(cmyk.m); - imgData.lookup[4*i+2] = colToByte(cmyk.y); - imgData.lookup[4*i+3] = colToByte(cmyk.k); - } - break; -#endif - } - } - - if (colorMode == splashModeMono1) { - srcMode = splashModeMono8; - } else { - srcMode = colorMode; - } - splash->drawImage(&imageSrc, &imgData, srcMode, gFalse, width, height, mat); - - splash->setSoftMask(NULL); - gfree(imgData.lookup); - delete imgData.imgStr; - str->close(); -} - -void SplashOutputDev::beginTransparencyGroup(GfxState *state, double *bbox, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool forSoftMask) { - SplashTransparencyGroup *transpGroup; - SplashColor color; - double xMin, yMin, xMax, yMax, x, y; - int tx, ty, w, h; - - // transform the bbox - state->transform(bbox[0], bbox[1], &x, &y); - xMin = xMax = x; - yMin = yMax = y; - state->transform(bbox[0], bbox[3], &x, &y); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - state->transform(bbox[2], bbox[1], &x, &y); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - state->transform(bbox[2], bbox[3], &x, &y); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - tx = (int)floor(xMin); - if (tx < 0) { - tx = 0; - } else if (tx > bitmap->getWidth()) { - tx = bitmap->getWidth(); - } - ty = (int)floor(yMin); - if (ty < 0) { - ty = 0; - } else if (ty > bitmap->getHeight()) { - ty = bitmap->getHeight(); - } - w = (int)ceil(xMax) - tx + 1; - if (tx + w > bitmap->getWidth()) { - w = bitmap->getWidth() - tx; - } - if (w < 1) { - w = 1; - } - h = (int)ceil(yMax) - ty + 1; - if (ty + h > bitmap->getHeight()) { - h = bitmap->getHeight() - ty; - } - if (h < 1) { - h = 1; - } - - // push a new stack entry - transpGroup = new SplashTransparencyGroup(); - transpGroup->tx = tx; - transpGroup->ty = ty; - transpGroup->blendingColorSpace = blendingColorSpace; - transpGroup->isolated = isolated; - transpGroup->next = transpGroupStack; - transpGroupStack = transpGroup; - - // save state - transpGroup->origBitmap = bitmap; - transpGroup->origSplash = splash; - - //~ this ignores the blendingColorSpace arg - - // create the temporary bitmap - bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, gTrue, - bitmapTopDown); - splash = new Splash(bitmap, vectorAntialias, - transpGroup->origSplash->getScreen()); - if (isolated) { - switch (colorMode) { - case splashModeMono1: - case splashModeMono8: - color[0] = 0; - break; - case splashModeRGB8: - case splashModeBGR8: - color[0] = color[1] = color[2] = 0; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - color[0] = color[1] = color[2] = color[3] = 0; - break; -#endif - default: - // make gcc happy - break; - } - splash->clear(color, 0); - } else { - splash->blitTransparent(transpGroup->origBitmap, tx, ty, 0, 0, w, h); - splash->setInNonIsolatedGroup(transpGroup->origBitmap, tx, ty); - } - transpGroup->tBitmap = bitmap; - state->shiftCTM(-tx, -ty); - updateCTM(state, 0, 0, 0, 0, 0, 0); -} - -void SplashOutputDev::endTransparencyGroup(GfxState *state) { - double *ctm; - - // restore state - delete splash; - bitmap = transpGroupStack->origBitmap; - splash = transpGroupStack->origSplash; - ctm = state->getCTM(); - state->shiftCTM(transpGroupStack->tx, transpGroupStack->ty); - updateCTM(state, 0, 0, 0, 0, 0, 0); -} - -void SplashOutputDev::paintTransparencyGroup(GfxState *state, double *bbox) { - SplashBitmap *tBitmap; - SplashTransparencyGroup *transpGroup; - GBool isolated; - int tx, ty; - - tx = transpGroupStack->tx; - ty = transpGroupStack->ty; - tBitmap = transpGroupStack->tBitmap; - isolated = transpGroupStack->isolated; - - // paint the transparency group onto the parent bitmap - // - the clip path was set in the parent's state) - splash->composite(tBitmap, 0, 0, tx, ty, - tBitmap->getWidth(), tBitmap->getHeight(), - gFalse, !isolated); - - // pop the stack - transpGroup = transpGroupStack; - transpGroupStack = transpGroup->next; - delete transpGroup; - - delete tBitmap; -} - -void SplashOutputDev::setSoftMask(GfxState *state, double *bbox, - GBool alpha, Function *transferFunc, - GfxColor *backdropColor) { - SplashBitmap *softMask, *tBitmap; - Splash *tSplash; - SplashTransparencyGroup *transpGroup; - SplashColor color; - SplashColorPtr p; - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - double lum, lum2; - int tx, ty, x, y; - - tx = transpGroupStack->tx; - ty = transpGroupStack->ty; - tBitmap = transpGroupStack->tBitmap; - - // composite with backdrop color - if (!alpha && colorMode != splashModeMono1) { - //~ need to correctly handle the case where no blending color - //~ space is given - tSplash = new Splash(tBitmap, vectorAntialias, - transpGroupStack->origSplash->getScreen()); - if (transpGroupStack->blendingColorSpace) { - switch (colorMode) { - case splashModeMono1: - // transparency is not supported in mono1 mode - break; - case splashModeMono8: - transpGroupStack->blendingColorSpace->getGray(backdropColor, &gray); - color[0] = colToByte(gray); - tSplash->compositeBackground(color); - break; - case splashModeRGB8: - case splashModeBGR8: - transpGroupStack->blendingColorSpace->getRGB(backdropColor, &rgb); - color[0] = colToByte(rgb.r); - color[1] = colToByte(rgb.g); - color[2] = colToByte(rgb.b); - tSplash->compositeBackground(color); - break; -#if SPLASH_CMYK - case splashModeCMYK8: - transpGroupStack->blendingColorSpace->getCMYK(backdropColor, &cmyk); - color[0] = colToByte(cmyk.c); - color[1] = colToByte(cmyk.m); - color[2] = colToByte(cmyk.y); - color[3] = colToByte(cmyk.k); - tSplash->compositeBackground(color); - break; -#endif - } - delete tSplash; - } - } - - softMask = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), - 1, splashModeMono8, gFalse); - memset(softMask->getDataPtr(), 0x00, softMask->getRowSize()*softMask->getHeight()); - p = softMask->getDataPtr() + ty * softMask->getRowSize() + tx; - if (txgetWidth() && tygetHeight()) - for (y = 0; y < tBitmap->getHeight(); ++y) { - for (x = 0; x < tBitmap->getWidth(); ++x) { - tBitmap->getPixel(x, y, color); - if (alpha) { - //~ unimplemented - } else { - // convert to luminosity - switch (colorMode) { - case splashModeMono1: - case splashModeMono8: - lum = color[0] / 255.0; - break; - case splashModeRGB8: - case splashModeBGR8: - lum = (0.3 / 255.0) * color[0] + - (0.59 / 255.0) * color[1] + - (0.11 / 255.0) * color[2]; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - lum = (1 - color[4] / 255.0) - - (0.3 / 255.0) * color[0] - - (0.59 / 255.0) * color[1] - - (0.11 / 255.0) * color[2]; - if (lum < 0) { - lum = 0; - } - break; -#endif - } - if (transferFunc) { - transferFunc->transform(&lum, &lum2); - } else { - lum2 = lum; - } - p[x] = (int)(lum2 * 255.0 + 0.5); - } - } - p += softMask->getRowSize(); - } - splash->setSoftMask(softMask); - - // pop the stack - transpGroup = transpGroupStack; - transpGroupStack = transpGroup->next; - delete transpGroup; - - delete tBitmap; -} - -void SplashOutputDev::clearSoftMask(GfxState *state) { - splash->setSoftMask(NULL); -} - -void SplashOutputDev::setPaperColor(SplashColorPtr paperColorA) { - splashColorCopy(paperColor, paperColorA); -} - -int SplashOutputDev::getBitmapWidth() { - return bitmap->getWidth(); -} - -int SplashOutputDev::getBitmapHeight() { - return bitmap->getHeight(); -} - -SplashBitmap *SplashOutputDev::takeBitmap() { - SplashBitmap *ret; - - ret = bitmap; - bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode, - colorMode != splashModeMono1, bitmapTopDown); - return ret; -} - -void SplashOutputDev::getModRegion(int *xMin, int *yMin, - int *xMax, int *yMax) { - splash->getModRegion(xMin, yMin, xMax, yMax); -} - -void SplashOutputDev::clearModRegion() { - splash->clearModRegion(); -} - -void SplashOutputDev::setFillColor(int r, int g, int b) { - GfxRGB rgb; - GfxGray gray; -#if SPLASH_CMYK - GfxCMYK cmyk; -#endif - - rgb.r = byteToCol(r); - rgb.g = byteToCol(g); - rgb.b = byteToCol(b); - gray = (GfxColorComp)(0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.g + 0.5); - if (gray > gfxColorComp1) { - gray = gfxColorComp1; - } -#if SPLASH_CMYK - cmyk.c = gfxColorComp1 - rgb.r; - cmyk.m = gfxColorComp1 - rgb.g; - cmyk.y = gfxColorComp1 - rgb.b; - cmyk.k = 0; - splash->setFillPattern(getColor(gray, &rgb, &cmyk)); -#else - splash->setFillPattern(getColor(gray, &rgb)); -#endif -} - -SplashFont *SplashOutputDev::getFont(GString *name, double *textMatA) { - DisplayFontParam *dfp; - Ref ref; - SplashOutFontFileID *id; - SplashFontFile *fontFile; - SplashFont *fontObj; - FoFiTrueType *ff; - Gushort *codeToGID; - Unicode u; - SplashCoord textMat[4]; - int cmap, i; - - for (i = 0; i < 16; ++i) { - if (!name->cmp(splashOutSubstFonts[i].name)) { - break; - } - } - if (i == 16) { - return NULL; - } - ref.num = i; - ref.gen = -1; - id = new SplashOutFontFileID(&ref); - - // check the font file cache - if ((fontFile = fontEngine->getFontFile(id))) { - delete id; - - // load the font file - } else { - dfp = globalParams->getDisplayFont(name); - if (dfp && dfp->kind == displayFontT1) { - fontFile = fontEngine->loadType1Font(id, dfp->t1.fileName->getCString(), - gFalse, winAnsiEncoding); - } else if (dfp && dfp->kind == displayFontTT) { - if (!(ff = FoFiTrueType::load(dfp->tt.fileName->getCString()))) { - return NULL; - } - for (cmap = 0; cmap < ff->getNumCmaps(); ++cmap) { - if ((ff->getCmapPlatform(cmap) == 3 && - ff->getCmapEncoding(cmap) == 1) || - ff->getCmapPlatform(cmap) == 0) { - break; - } - } - if (cmap == ff->getNumCmaps()) { - delete ff; - return NULL; - } - codeToGID = (Gushort *)gmallocn(256, sizeof(Gushort)); - for (i = 0; i < 256; ++i) { - codeToGID[i] = 0; - if (winAnsiEncoding[i] && - (u = globalParams->mapNameToUnicode(winAnsiEncoding[i]))) { - codeToGID[i] = ff->mapCodeToGID(cmap, u); - } - } - delete ff; - fontFile = fontEngine->loadTrueTypeFont(id, - dfp->tt.fileName->getCString(), - gFalse, codeToGID, 256); - } else { - return NULL; - } - } - - // create the scaled font - textMat[0] = (SplashCoord)textMatA[0]; - textMat[1] = (SplashCoord)textMatA[1]; - textMat[2] = (SplashCoord)textMatA[2]; - textMat[3] = (SplashCoord)textMatA[3]; - fontObj = fontEngine->getFont(fontFile, textMat, splash->getMatrix()); - - return fontObj; -} - -#if 1 //~tmp: turn off anti-aliasing temporarily -GBool SplashOutputDev::getVectorAntialias() { - return splash->getVectorAntialias(); -} - -void SplashOutputDev::setVectorAntialias(GBool vaa) { - splash->setVectorAntialias(vaa); -} -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.h deleted file mode 100644 index 1dd610926..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashOutputDev.h +++ /dev/null @@ -1,248 +0,0 @@ -//======================================================================== -// -// SplashOutputDev.h -// -// Copyright 2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef SPLASHOUTPUTDEV_H -#define SPLASHOUTPUTDEV_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "SplashTypes.h" -#include "config.h" -#include "OutputDev.h" -#include "GfxState.h" - -class Gfx8BitFont; -class SplashBitmap; -class Splash; -class SplashPath; -class SplashPattern; -class SplashFontEngine; -class SplashFont; -class T3FontCache; -struct T3FontCacheTag; -struct T3GlyphStack; -struct SplashTransparencyGroup; - -//------------------------------------------------------------------------ - -// number of Type 3 fonts to cache -#define splashOutT3FontCacheSize 8 - -//------------------------------------------------------------------------ -// SplashOutputDev -//------------------------------------------------------------------------ - -class SplashOutputDev: public OutputDev { -public: - - // Constructor. - SplashOutputDev(SplashColorMode colorModeA, int bitmapRowPadA, - GBool reverseVideoA, SplashColorPtr paperColorA, - GBool bitmapTopDownA = gTrue, - GBool allowAntialiasA = gTrue); - - // Destructor. - virtual ~SplashOutputDev(); - - //----- get info about output device - - // Does this device use upside-down coordinates? - // (Upside-down means (0,0) is the top left corner of the page.) - virtual GBool upsideDown() { return gTrue; } - - // Does this device use drawChar() or drawString()? - virtual GBool useDrawChar() { return gTrue; } - - // Does this device use beginType3Char/endType3Char? Otherwise, - // text in Type 3 fonts will be drawn with drawChar/drawString. - virtual GBool interpretType3Chars() { return gTrue; } - - //----- initialization and control - - // Start a page. - virtual void startPage(int pageNum, GfxState *state); - - // End a page. - virtual void endPage(); - - //----- save/restore graphics state - virtual void saveState(GfxState *state); - virtual void restoreState(GfxState *state); - - //----- update graphics state - virtual void updateAll(GfxState *state); - virtual void updateCTM(GfxState *state, double m11, double m12, - double m21, double m22, double m31, double m32); - virtual void updateLineDash(GfxState *state); - virtual void updateFlatness(GfxState *state); - virtual void updateLineJoin(GfxState *state); - virtual void updateLineCap(GfxState *state); - virtual void updateMiterLimit(GfxState *state); - virtual void updateLineWidth(GfxState *state); - virtual void updateStrokeAdjust(GfxState *state); - virtual void updateFillColor(GfxState *state); - virtual void updateStrokeColor(GfxState *state); - virtual void updateBlendMode(GfxState *state); - virtual void updateFillOpacity(GfxState *state); - virtual void updateStrokeOpacity(GfxState *state); - - //----- update text state - virtual void updateFont(GfxState *state); - - //----- path painting - virtual void stroke(GfxState *state); - virtual void fill(GfxState *state); - virtual void eoFill(GfxState *state); - - //----- path clipping - virtual void clip(GfxState *state); - virtual void eoClip(GfxState *state); - virtual void clipToStrokePath(GfxState *state); - - //----- text drawing - virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode code, int nBytes, Unicode *u, int uLen); - virtual GBool beginType3Char(GfxState *state, double x, double y, - double dx, double dy, - CharCode code, Unicode *u, int uLen); - virtual void endType3Char(GfxState *state); - virtual void endTextObject(GfxState *state); - - //----- image drawing - virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - GBool inlineImg); - virtual void drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, GfxImageColorMap *colorMap, - int *maskColors, GBool inlineImg); - virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, int maskWidth, int maskHeight, - GBool maskInvert); - virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, - Stream *maskStr, - int maskWidth, int maskHeight, - GfxImageColorMap *maskColorMap); - - //----- Type 3 font operators - virtual void type3D0(GfxState *state, double wx, double wy); - virtual void type3D1(GfxState *state, double wx, double wy, - double llx, double lly, double urx, double ury); - - //----- transparency groups and soft masks - virtual void beginTransparencyGroup(GfxState *state, double *bbox, - GfxColorSpace *blendingColorSpace, - GBool isolated, GBool knockout, - GBool forSoftMask); - virtual void endTransparencyGroup(GfxState *state); - virtual void paintTransparencyGroup(GfxState *state, double *bbox); - virtual void setSoftMask(GfxState *state, double *bbox, GBool alpha, - Function *transferFunc, GfxColor *backdropColor); - virtual void clearSoftMask(GfxState *state); - - //----- special access - - // Called to indicate that a new PDF document has been loaded. - void startDoc(XRef *xrefA); - - void setPaperColor(SplashColorPtr paperColorA); - - GBool isReverseVideo() { return reverseVideo; } - void setReverseVideo(GBool reverseVideoA) { reverseVideo = reverseVideoA; } - - // Get the bitmap and its size. - SplashBitmap *getBitmap() { return bitmap; } - int getBitmapWidth(); - int getBitmapHeight(); - - // Returns the last rasterized bitmap, transferring ownership to the - // caller. - SplashBitmap *takeBitmap(); - - // Get the Splash object. - Splash *getSplash() { return splash; } - - // Get the modified region. - void getModRegion(int *xMin, int *yMin, int *xMax, int *yMax); - - // Clear the modified region. - void clearModRegion(); - - // Set the Splash fill color. - void setFillColor(int r, int g, int b); - - // Get a font object for a Base-14 font, using the Latin-1 encoding. - SplashFont *getFont(GString *name, double *textMatA); - - SplashFont *getCurrentFont() { return font; } - -#if 1 //~tmp: turn off anti-aliasing temporarily - virtual GBool getVectorAntialias(); - virtual void setVectorAntialias(GBool vaa); -#endif - - void doUpdateFont(GfxState *state); - GBool needFontUpdate; // set when the font needs to be updated - - SplashPath *convertPath(GfxState *state, GfxPath *path); -private: - - void setupScreenParams(double hDPI, double vDPI); -#if SPLASH_CMYK - SplashPattern *getColor(GfxGray gray, GfxRGB *rgb, GfxCMYK *cmyk); -#else - SplashPattern *getColor(GfxGray gray, GfxRGB *rgb); -#endif - void drawType3Glyph(T3FontCache *t3Font, - T3FontCacheTag *tag, Guchar *data); - static GBool imageMaskSrc(void *data, SplashColorPtr line); - static GBool imageSrc(void *data, SplashColorPtr colorLine, - Guchar *alphaLine); - static GBool alphaImageSrc(void *data, SplashColorPtr line, - Guchar *alphaLine); - static GBool maskedImageSrc(void *data, SplashColorPtr line, - Guchar *alphaLine); - - SplashColorMode colorMode; - int bitmapRowPad; - GBool bitmapTopDown; - GBool allowAntialias; - GBool vectorAntialias; - GBool reverseVideo; // reverse video mode - SplashColor paperColor; // paper color - SplashScreenParams screenParams; - - XRef *xref; // xref table for current document - - SplashBitmap *bitmap; - Splash *splash; - SplashFontEngine *fontEngine; - - T3FontCache * // Type 3 font cache - t3FontCache[splashOutT3FontCacheSize]; - int nT3Fonts; // number of valid entries in t3FontCache - T3GlyphStack *t3GlyphStack; // Type 3 glyph context stack - - SplashFont *font; // current font - SplashPath *textClipPath; // clipping path built with text object - - SplashTransparencyGroup * // transparency group stack - transpGroupStack; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.cc deleted file mode 100644 index e3a89271f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.cc +++ /dev/null @@ -1,184 +0,0 @@ -//======================================================================== -// -// SplashPath.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "gmem.h" -#include "SplashErrorCodes.h" -#include "SplashPath.h" - -//------------------------------------------------------------------------ -// SplashPath -//------------------------------------------------------------------------ - -// A path can be in three possible states: -// -// 1. no current point -- zero or more finished subpaths -// [curSubpath == length] -// -// 2. one point in subpath -// [curSubpath == length - 1] -// -// 3. open subpath with two or more points -// [curSubpath < length - 1] - -SplashPath::SplashPath() { - pts = NULL; - flags = NULL; - length = size = 0; - curSubpath = 0; - hints = NULL; - hintsLength = hintsSize = 0; -} - -SplashPath::SplashPath(SplashPath *path) { - length = path->length; - size = path->size; - pts = (SplashPathPoint *)gmallocn(size, sizeof(SplashPathPoint)); - flags = (Guchar *)gmallocn(size, sizeof(Guchar)); - memcpy(pts, path->pts, length * sizeof(SplashPathPoint)); - memcpy(flags, path->flags, length * sizeof(Guchar)); - curSubpath = path->curSubpath; - if (path->hints) { - hintsLength = hintsSize = path->hintsLength; - hints = (SplashPathHint *)gmallocn(hintsSize, sizeof(SplashPathHint)); - memcpy(hints, path->hints, hintsLength * sizeof(SplashPathHint)); - } else { - hints = NULL; - } -} - -SplashPath::~SplashPath() { - gfree(pts); - gfree(flags); - gfree(hints); -} - -// Add space for more points. -void SplashPath::grow(int nPts) { - if (length + nPts > size) { - if (size == 0) { - size = 32; - } - while (size < length + nPts) { - size *= 2; - } - pts = (SplashPathPoint *)greallocn(pts, size, sizeof(SplashPathPoint)); - flags = (Guchar *)greallocn(flags, size, sizeof(Guchar)); - } -} - -void SplashPath::append(SplashPath *path) { - int i; - - curSubpath = length + path->curSubpath; - grow(path->length); - for (i = 0; i < path->length; ++i) { - pts[length] = path->pts[i]; - flags[length] = path->flags[i]; - ++length; - } -} - -SplashError SplashPath::moveTo(SplashCoord x, SplashCoord y) { - if (onePointSubpath()) { - return splashErrBogusPath; - } - grow(1); - pts[length].x = x; - pts[length].y = y; - flags[length] = splashPathFirst | splashPathLast; - curSubpath = length++; - return splashOk; -} - -SplashError SplashPath::lineTo(SplashCoord x, SplashCoord y) { - if (noCurrentPoint()) { - return splashErrNoCurPt; - } - flags[length-1] &= ~splashPathLast; - grow(1); - pts[length].x = x; - pts[length].y = y; - flags[length] = splashPathLast; - ++length; - return splashOk; -} - -SplashError SplashPath::curveTo(SplashCoord x1, SplashCoord y1, - SplashCoord x2, SplashCoord y2, - SplashCoord x3, SplashCoord y3) { - if (noCurrentPoint()) { - return splashErrNoCurPt; - } - flags[length-1] &= ~splashPathLast; - grow(3); - pts[length].x = x1; - pts[length].y = y1; - flags[length] = splashPathCurve; - ++length; - pts[length].x = x2; - pts[length].y = y2; - flags[length] = splashPathCurve; - ++length; - pts[length].x = x3; - pts[length].y = y3; - flags[length] = splashPathLast; - ++length; - return splashOk; -} - -SplashError SplashPath::close() { - if (noCurrentPoint()) { - return splashErrNoCurPt; - } - if (curSubpath == length - 1 || - pts[length - 1].x != pts[curSubpath].x || - pts[length - 1].y != pts[curSubpath].y) { - lineTo(pts[curSubpath].x, pts[curSubpath].y); - } - flags[curSubpath] |= splashPathClosed; - flags[length - 1] |= splashPathClosed; - curSubpath = length; - return splashOk; -} - -void SplashPath::addStrokeAdjustHint(int ctrl0, int ctrl1, - int firstPt, int lastPt) { - if (hintsLength == hintsSize) { - hintsSize = hintsLength ? 2 * hintsLength : 8; - hints = (SplashPathHint *)greallocn(hints, hintsSize, - sizeof(SplashPathHint)); - } - hints[hintsLength].ctrl0 = ctrl0; - hints[hintsLength].ctrl1 = ctrl1; - hints[hintsLength].firstPt = firstPt; - hints[hintsLength].lastPt = lastPt; - ++hintsLength; -} - -void SplashPath::offset(SplashCoord dx, SplashCoord dy) { - int i; - - for (i = 0; i < length; ++i) { - pts[i].x += dx; - pts[i].y += dy; - } -} - -GBool SplashPath::getCurPt(SplashCoord *x, SplashCoord *y) { - if (noCurrentPoint()) { - return gFalse; - } - *x = pts[length - 1].x; - *y = pts[length - 1].y; - return gTrue; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.h deleted file mode 100644 index b63ee5df8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPath.h +++ /dev/null @@ -1,121 +0,0 @@ -//======================================================================== -// -// SplashPath.h -// -//======================================================================== - -#ifndef SPLASHPATH_H -#define SPLASHPATH_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" - -//------------------------------------------------------------------------ -// SplashPathPoint -//------------------------------------------------------------------------ - -struct SplashPathPoint { - SplashCoord x, y; -}; - -//------------------------------------------------------------------------ -// SplashPath.flags -//------------------------------------------------------------------------ - -// first point on each subpath sets this flag -#define splashPathFirst 0x01 - -// last point on each subpath sets this flag -#define splashPathLast 0x02 - -// if the subpath is closed, its first and last points must be -// identical, and must set this flag -#define splashPathClosed 0x04 - -// curve control points set this flag -#define splashPathCurve 0x08 - -//------------------------------------------------------------------------ -// SplashPathHint -//------------------------------------------------------------------------ - -struct SplashPathHint { - int ctrl0, ctrl1; - int firstPt, lastPt; -}; - -//------------------------------------------------------------------------ -// SplashPath -//------------------------------------------------------------------------ - -class SplashPath { -public: - - // Create an empty path. - SplashPath(); - - // Copy a path. - SplashPath *copy() { return new SplashPath(this); } - - ~SplashPath(); - - // Append to . - void append(SplashPath *path); - - // Start a new subpath. - SplashError moveTo(SplashCoord x, SplashCoord y); - - // Add a line segment to the last subpath. - SplashError lineTo(SplashCoord x, SplashCoord y); - - // Add a third-order (cubic) Bezier curve segment to the last - // subpath. - SplashError curveTo(SplashCoord x1, SplashCoord y1, - SplashCoord x2, SplashCoord y2, - SplashCoord x3, SplashCoord y3); - - // Close the last subpath, adding a line segment if necessary. - SplashError close(); - - // Add a stroke adjustment hint. The controlling segments are - // and (where segments are identified by their first - // point), and the points to be adjusted are .. . - void addStrokeAdjustHint(int ctrl0, int ctrl1, int firstPt, int lastPt); - - // Add (, ) to every point on this path. - void offset(SplashCoord dx, SplashCoord dy); - - // Get the points on the path. - int getLength() { return length; } - void getPoint(int i, double *x, double *y, Guchar *f) - { *x = pts[i].x; *y = pts[i].y; *f = flags[i]; } - - // Get the current point. - GBool getCurPt(SplashCoord *x, SplashCoord *y); - -private: - - SplashPath(SplashPath *path); - void grow(int nPts); - GBool noCurrentPoint() { return curSubpath == length; } - GBool onePointSubpath() { return curSubpath == length - 1; } - GBool openSubpath() { return curSubpath < length - 1; } - - SplashPathPoint *pts; // array of points - Guchar *flags; // array of flags - int length, size; // length/size of the pts and flags arrays - int curSubpath; // index of first point in last subpath - - SplashPathHint *hints; // list of hints - int hintsLength, hintsSize; - - friend class SplashXPath; - friend class Splash; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.cc deleted file mode 100644 index b77658ef4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.cc +++ /dev/null @@ -1,40 +0,0 @@ -//======================================================================== -// -// SplashPattern.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "SplashMath.h" -#include "SplashScreen.h" -#include "SplashPattern.h" - -//------------------------------------------------------------------------ -// SplashPattern -//------------------------------------------------------------------------ - -SplashPattern::SplashPattern() { -} - -SplashPattern::~SplashPattern() { -} - -//------------------------------------------------------------------------ -// SplashSolidColor -//------------------------------------------------------------------------ - -SplashSolidColor::SplashSolidColor(SplashColorPtr colorA) { - splashColorCopy(color, colorA); -} - -SplashSolidColor::~SplashSolidColor() { -} - -void SplashSolidColor::getColor(int x, int y, SplashColorPtr c) { - splashColorCopy(c, color); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.h deleted file mode 100644 index 0a02e9c29..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashPattern.h +++ /dev/null @@ -1,65 +0,0 @@ -//======================================================================== -// -// SplashPattern.h -// -//======================================================================== - -#ifndef SPLASHPATTERN_H -#define SPLASHPATTERN_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" - -class SplashScreen; - -//------------------------------------------------------------------------ -// SplashPattern -//------------------------------------------------------------------------ - -class SplashPattern { -public: - - SplashPattern(); - - virtual SplashPattern *copy() = 0; - - virtual ~SplashPattern(); - - // Return the color value for a specific pixel. - virtual void getColor(int x, int y, SplashColorPtr c) = 0; - - // Returns true if this pattern object will return the same color - // value for all pixels. - virtual GBool isStatic() = 0; - -private: -}; - -//------------------------------------------------------------------------ -// SplashSolidColor -//------------------------------------------------------------------------ - -class SplashSolidColor: public SplashPattern { -public: - - SplashSolidColor(SplashColorPtr colorA); - - virtual SplashPattern *copy() { return new SplashSolidColor(color); } - - virtual ~SplashSolidColor(); - - virtual void getColor(int x, int y, SplashColorPtr c); - - virtual GBool isStatic() { return gTrue; } - -private: - - SplashColor color; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.cc deleted file mode 100644 index af082f8d7..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.cc +++ /dev/null @@ -1,385 +0,0 @@ -//======================================================================== -// -// SplashScreen.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "SplashMath.h" -#include "SplashScreen.h" - -//------------------------------------------------------------------------ - -static SplashScreenParams defaultParams = { - splashScreenDispersed, // type - 2, // size - 2, // dotRadius - 1.0, // gamma - 0.0, // blackThreshold - 1.0 // whiteThreshold -}; - -//------------------------------------------------------------------------ - -struct SplashScreenPoint { - int x, y; - int dist; -}; - -static int cmpDistances(const void *p0, const void *p1) { - return ((SplashScreenPoint *)p0)->dist - ((SplashScreenPoint *)p1)->dist; -} - -//------------------------------------------------------------------------ -// SplashScreen -//------------------------------------------------------------------------ - -// If is true, this generates a 45 degree screen using a -// circular dot spot function. DPI = resolution / ((size / 2) * -// sqrt(2)). If is false, this generates an optimal -// threshold matrix using recursive tesselation. Gamma correction -// (gamma = 1 / 1.33) is also computed here. -SplashScreen::SplashScreen(SplashScreenParams *params) { - Guchar u, black, white; - int i; - - if (!params) { - params = &defaultParams; - } - - switch (params->type) { - - case splashScreenDispersed: - // size must be a power of 2 - for (size = 1; size < params->size; size <<= 1) ; - mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); - buildDispersedMatrix(size/2, size/2, 1, size/2, 1); - break; - - case splashScreenClustered: - // size must be even - size = (params->size >> 1) << 1; - if (size < 2) { - size = 2; - } - mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); - buildClusteredMatrix(); - break; - - case splashScreenStochasticClustered: - // size must be at least 2*r - if (params->size < 2 * params->dotRadius) { - size = 2 * params->dotRadius; - } else { - size = params->size; - } - mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); - buildSCDMatrix(params->dotRadius); - break; - } - - // do gamma correction and compute minVal/maxVal - minVal = 255; - maxVal = 0; - black = splashRound((SplashCoord)255.0 * params->blackThreshold); - if (black < 1) { - black = 1; - } - white = splashRound((SplashCoord)255.0 * params->whiteThreshold); - if (white > 255) { - white = 255; - } - for (i = 0; i < size * size; ++i) { - u = splashRound((SplashCoord)255.0 * - splashPow((SplashCoord)mat[i] / 255.0, params->gamma)); - if (u < black) { - u = black; - } else if (u >= white) { - u = white; - } - mat[i] = u; - if (u < minVal) { - minVal = u; - } else if (u > maxVal) { - maxVal = u; - } - } -} - -void SplashScreen::buildDispersedMatrix(int i, int j, int val, - int delta, int offset) { - if (delta == 0) { - // map values in [1, size^2] --> [1, 255] - mat[i * size + j] = 1 + (254 * (val - 1)) / (size * size - 1); - } else { - buildDispersedMatrix(i, j, - val, delta / 2, 4*offset); - buildDispersedMatrix((i + delta) % size, (j + delta) % size, - val + offset, delta / 2, 4*offset); - buildDispersedMatrix((i + delta) % size, j, - val + 2*offset, delta / 2, 4*offset); - buildDispersedMatrix((i + 2*delta) % size, (j + delta) % size, - val + 3*offset, delta / 2, 4*offset); - } -} - -void SplashScreen::buildClusteredMatrix() { - SplashCoord *dist; - SplashCoord u, v, d; - Guchar val; - int size2, x, y, x1, y1, i; - - size2 = size >> 1; - - // initialize the threshold matrix - for (y = 0; y < size; ++y) { - for (x = 0; x < size; ++x) { - mat[y * size + x] = 0; - } - } - - // build the distance matrix - dist = (SplashCoord *)gmallocn(size * size2, sizeof(SplashCoord)); - for (y = 0; y < size2; ++y) { - for (x = 0; x < size2; ++x) { - if (x + y < size2 - 1) { - u = (SplashCoord)x + 0.5 - 0; - v = (SplashCoord)y + 0.5 - 0; - } else { - u = (SplashCoord)x + 0.5 - (SplashCoord)size2; - v = (SplashCoord)y + 0.5 - (SplashCoord)size2; - } - dist[y * size2 + x] = u*u + v*v; - } - } - for (y = 0; y < size2; ++y) { - for (x = 0; x < size2; ++x) { - if (x < y) { - u = (SplashCoord)x + 0.5 - 0; - v = (SplashCoord)y + 0.5 - (SplashCoord)size2; - } else { - u = (SplashCoord)x + 0.5 - (SplashCoord)size2; - v = (SplashCoord)y + 0.5 - 0; - } - dist[(size2 + y) * size2 + x] = u*u + v*v; - } - } - - // build the threshold matrix - minVal = 1; - maxVal = 0; - x1 = y1 = 0; // make gcc happy - for (i = 0; i < size * size2; ++i) { - d = -1; - for (y = 0; y < size; ++y) { - for (x = 0; x < size2; ++x) { - if (mat[y * size + x] == 0 && - dist[y * size2 + x] > d) { - x1 = x; - y1 = y; - d = dist[y1 * size2 + x1]; - } - } - } - // map values in [0, 2*size*size2-1] --> [1, 255] - val = 1 + (254 * (2*i)) / (2*size*size2 - 1); - mat[y1 * size + x1] = val; - val = 1 + (254 * (2*i+1)) / (2*size*size2 - 1); - if (y1 < size2) { - mat[(y1 + size2) * size + x1 + size2] = val; - } else { - mat[(y1 - size2) * size + x1 + size2] = val; - } - } - - gfree(dist); -} - -// Compute the distance between two points on a toroid. -int SplashScreen::distance(int x0, int y0, int x1, int y1) { - int dx0, dx1, dx, dy0, dy1, dy; - - dx0 = abs(x0 - x1); - dx1 = size - dx0; - dx = dx0 < dx1 ? dx0 : dx1; - dy0 = abs(y0 - y1); - dy1 = size - dy0; - dy = dy0 < dy1 ? dy0 : dy1; - return dx * dx + dy * dy; -} - -// Algorithm taken from: -// Victor Ostromoukhov and Roger D. Hersch, "Stochastic Clustered-Dot -// Dithering" in Color Imaging: Device-Independent Color, Color -// Hardcopy, and Graphic Arts IV, SPIE Vol. 3648, pp. 496-505, 1999. -void SplashScreen::buildSCDMatrix(int r) { - SplashScreenPoint *dots, *pts; - int dotsLen, dotsSize; - char *tmpl; - char *grid; - int *region, *dist; - int x, y, xx, yy, x0, x1, y0, y1, i, j, d, iMin, dMin, n; - - //~ this should probably happen somewhere else - srand(123); - - // generate the random space-filling curve - pts = (SplashScreenPoint *)gmallocn(size * size, sizeof(SplashScreenPoint)); - i = 0; - for (y = 0; y < size; ++y) { - for (x = 0; x < size; ++x) { - pts[i].x = x; - pts[i].y = y; - ++i; - } - } - for (i = 0; i < size * size; ++i) { - j = i + (int)((double)(size * size - i) * - (double)rand() / ((double)RAND_MAX + 1.0)); - x = pts[i].x; - y = pts[i].y; - pts[i].x = pts[j].x; - pts[i].y = pts[j].y; - pts[j].x = x; - pts[j].y = y; - } - - // construct the circle template - tmpl = (char *)gmallocn((r+1)*(r+1), sizeof(char)); - for (y = 0; y <= r; ++y) { - for (x = 0; x <= r; ++x) { - tmpl[y*(r+1) + x] = (x * y <= r * r) ? 1 : 0; - } - } - - // mark all grid cells as free - grid = (char *)gmallocn(size * size, sizeof(char)); - for (y = 0; y < size; ++y) { - for (x = 0; x < size; ++x) { - grid[y*size + x] = 0; - } - } - - // walk the space-filling curve, adding dots - dotsLen = 0; - dotsSize = 32; - dots = (SplashScreenPoint *)gmallocn(dotsSize, sizeof(SplashScreenPoint)); - for (i = 0; i < size * size; ++i) { - x = pts[i].x; - y = pts[i].y; - if (!grid[y*size + x]) { - if (dotsLen == dotsSize) { - dotsSize *= 2; - dots = (SplashScreenPoint *)greallocn(dots, dotsSize, - sizeof(SplashScreenPoint)); - } - dots[dotsLen++] = pts[i]; - for (yy = 0; yy <= r; ++yy) { - y0 = (y + yy) % size; - y1 = (y - yy + size) % size; - for (xx = 0; xx <= r; ++xx) { - if (tmpl[yy*(r+1) + xx]) { - x0 = (x + xx) % size; - x1 = (x - xx + size) % size; - grid[y0*size + x0] = 1; - grid[y0*size + x1] = 1; - grid[y1*size + x0] = 1; - grid[y1*size + x1] = 1; - } - } - } - } - } - - gfree(tmpl); - gfree(grid); - - // assign each cell to a dot, compute distance to center of dot - region = (int *)gmallocn(size * size, sizeof(int)); - dist = (int *)gmallocn(size * size, sizeof(int)); - for (y = 0; y < size; ++y) { - for (x = 0; x < size; ++x) { - iMin = 0; - dMin = distance(dots[0].x, dots[0].y, x, y); - for (i = 1; i < dotsLen; ++i) { - d = distance(dots[i].x, dots[i].y, x, y); - if (d < dMin) { - iMin = i; - dMin = d; - } - } - region[y*size + x] = iMin; - dist[y*size + x] = dMin; - } - } - - // compute threshold values - for (i = 0; i < dotsLen; ++i) { - n = 0; - for (y = 0; y < size; ++y) { - for (x = 0; x < size; ++x) { - if (region[y*size + x] == i) { - pts[n].x = x; - pts[n].y = y; - pts[n].dist = distance(dots[i].x, dots[i].y, x, y); - ++n; - } - } - } - qsort(pts, n, sizeof(SplashScreenPoint), &cmpDistances); - for (j = 0; j < n; ++j) { - // map values in [0 .. n-1] --> [255 .. 1] - mat[pts[j].y * size + pts[j].x] = 255 - (254 * j) / (n - 1); - } - } - - gfree(pts); - gfree(region); - gfree(dist); - - gfree(dots); -} - -SplashScreen::SplashScreen(SplashScreen *screen) { - size = screen->size; - mat = (Guchar *)gmallocn(size * size, sizeof(Guchar)); - memcpy(mat, screen->mat, size * size * sizeof(Guchar)); - minVal = screen->minVal; - maxVal = screen->maxVal; -} - -SplashScreen::~SplashScreen() { - gfree(mat); -} - -int SplashScreen::test(int x, int y, Guchar value) { - int xx, yy; - - return 1; - - if (value < minVal) { - return 0; - } - if (value >= maxVal) { - return 1; - } - if ((xx = x % size) < 0) { - xx = -xx; - } - if ((yy = y % size) < 0) { - yy = -yy; - } - return value < mat[yy * size + xx] ? 0 : 1; -} - -GBool SplashScreen::isStatic(Guchar value) { - return value < minVal || value >= maxVal; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.h deleted file mode 100644 index 2baa9b5d7..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashScreen.h +++ /dev/null @@ -1,56 +0,0 @@ -//======================================================================== -// -// SplashScreen.h -// -//======================================================================== - -#ifndef SPLASHSCREEN_H -#define SPLASHSCREEN_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" - -//------------------------------------------------------------------------ -// SplashScreen -//------------------------------------------------------------------------ - -class SplashScreen { -public: - - SplashScreen(SplashScreenParams *params); - SplashScreen(SplashScreen *screen); - ~SplashScreen(); - - SplashScreen *copy() { return new SplashScreen(this); } - - // Return the computed pixel value (0=black, 1=white) for the gray - // level at (, ). - int test(int x, int y, Guchar value); - - // Returns true if value is above the white threshold or below the - // black threshold, i.e., if the corresponding halftone will be - // solid white or black. - GBool isStatic(Guchar value); - -private: - - void buildDispersedMatrix(int i, int j, int val, - int delta, int offset); - void buildClusteredMatrix(); - int distance(int x0, int y0, int x1, int y1); - void buildSCDMatrix(int r); - - Guchar *mat; // threshold matrix - int size; // size of the threshold matrix - Guchar minVal; // any pixel value below minVal generates - // solid black - Guchar maxVal; // any pixel value above maxVal generates - // solid white -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.cc deleted file mode 100644 index e2c34c442..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.cc +++ /dev/null @@ -1,165 +0,0 @@ -//======================================================================== -// -// SplashState.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include "gmem.h" -#include "SplashPattern.h" -#include "SplashScreen.h" -#include "SplashClip.h" -#include "SplashBitmap.h" -#include "SplashState.h" - -//------------------------------------------------------------------------ -// SplashState -//------------------------------------------------------------------------ - -// number of components in each color mode -int splashColorModeNComps[] = { - 1, 1, 3, 3, 4 -}; - -SplashState::SplashState(int width, int height, GBool vectorAntialias, - SplashScreenParams *screenParams) { - SplashColor color; - - matrix[0] = 1; matrix[1] = 0; - matrix[2] = 0; matrix[3] = 1; - matrix[4] = 0; matrix[5] = 0; - memset(&color, 0, sizeof(SplashColor)); - strokePattern = new SplashSolidColor(color); - fillPattern = new SplashSolidColor(color); - screen = new SplashScreen(screenParams); - blendFunc = NULL; - strokeAlpha = 1; - fillAlpha = 1; - lineWidth = 0; - lineCap = splashLineCapButt; - lineJoin = splashLineJoinMiter; - miterLimit = 10; - flatness = 1; - lineDash = NULL; - lineDashLength = 0; - lineDashPhase = 0; - strokeAdjust = gFalse; - clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias); - softMask = NULL; - deleteSoftMask = gFalse; - inNonIsolatedGroup = gFalse; - next = NULL; -} - -SplashState::SplashState(int width, int height, GBool vectorAntialias, - SplashScreen *screenA) { - SplashColor color; - - matrix[0] = 1; matrix[1] = 0; - matrix[2] = 0; matrix[3] = 1; - matrix[4] = 0; matrix[5] = 0; - memset(&color, 0, sizeof(SplashColor)); - strokePattern = new SplashSolidColor(color); - fillPattern = new SplashSolidColor(color); - screen = screenA->copy(); - blendFunc = NULL; - strokeAlpha = 1; - fillAlpha = 1; - lineWidth = 0; - lineCap = splashLineCapButt; - lineJoin = splashLineJoinMiter; - miterLimit = 10; - flatness = 1; - lineDash = NULL; - lineDashLength = 0; - lineDashPhase = 0; - strokeAdjust = gFalse; - clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias); - softMask = NULL; - deleteSoftMask = gFalse; - inNonIsolatedGroup = gFalse; - next = NULL; -} - -SplashState::SplashState(SplashState *state) { - memcpy(matrix, state->matrix, 6 * sizeof(SplashCoord)); - strokePattern = state->strokePattern->copy(); - fillPattern = state->fillPattern->copy(); - screen = state->screen->copy(); - blendFunc = state->blendFunc; - strokeAlpha = state->strokeAlpha; - fillAlpha = state->fillAlpha; - lineWidth = state->lineWidth; - lineCap = state->lineCap; - lineJoin = state->lineJoin; - miterLimit = state->miterLimit; - flatness = state->flatness; - if (state->lineDash) { - lineDashLength = state->lineDashLength; - lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord)); - memcpy(lineDash, state->lineDash, lineDashLength * sizeof(SplashCoord)); - } else { - lineDash = NULL; - lineDashLength = 0; - } - lineDashPhase = state->lineDashPhase; - strokeAdjust = state->strokeAdjust; - clip = state->clip->copy(); - softMask = state->softMask; - deleteSoftMask = gFalse; - inNonIsolatedGroup = state->inNonIsolatedGroup; - next = NULL; -} - -SplashState::~SplashState() { - delete strokePattern; - delete fillPattern; - delete screen; - gfree(lineDash); - delete clip; - if (deleteSoftMask && softMask) { - delete softMask; - } -} - -void SplashState::setStrokePattern(SplashPattern *strokePatternA) { - delete strokePattern; - strokePattern = strokePatternA; -} - -void SplashState::setFillPattern(SplashPattern *fillPatternA) { - delete fillPattern; - fillPattern = fillPatternA; -} - -void SplashState::setScreen(SplashScreen *screenA) { - delete screen; - screen = screenA; -} - -void SplashState::setLineDash(SplashCoord *lineDashA, int lineDashLengthA, - SplashCoord lineDashPhaseA) { - gfree(lineDash); - lineDashLength = lineDashLengthA; - if (lineDashLength > 0) { - lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord)); - memcpy(lineDash, lineDashA, lineDashLength * sizeof(SplashCoord)); - } else { - lineDash = NULL; - } - lineDashPhase = lineDashPhaseA; -} - -void SplashState::setSoftMask(SplashBitmap *softMaskA) { - if (deleteSoftMask) { - delete softMask; - } - softMask = softMaskA; - deleteSoftMask = gTrue; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.h deleted file mode 100644 index 1f5a88da2..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashState.h +++ /dev/null @@ -1,103 +0,0 @@ -//======================================================================== -// -// SplashState.h -// -//======================================================================== - -#ifndef SPLASHSTATE_H -#define SPLASHSTATE_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" - -class SplashPattern; -class SplashScreen; -class SplashClip; -class SplashBitmap; - -//------------------------------------------------------------------------ -// line cap values -//------------------------------------------------------------------------ - -#define splashLineCapButt 0 -#define splashLineCapRound 1 -#define splashLineCapProjecting 2 - -//------------------------------------------------------------------------ -// line join values -//------------------------------------------------------------------------ - -#define splashLineJoinMiter 0 -#define splashLineJoinRound 1 -#define splashLineJoinBevel 2 - -//------------------------------------------------------------------------ -// SplashState -//------------------------------------------------------------------------ - -class SplashState { -public: - - // Create a new state object, initialized with default settings. - SplashState(int width, int height, GBool vectorAntialias, - SplashScreenParams *screenParams); - SplashState(int width, int height, GBool vectorAntialias, - SplashScreen *screenA); - - // Copy a state object. - SplashState *copy() { return new SplashState(this); } - - ~SplashState(); - - // Set the stroke pattern. This does not copy . - void setStrokePattern(SplashPattern *strokePatternA); - - // Set the fill pattern. This does not copy . - void setFillPattern(SplashPattern *fillPatternA); - - // Set the screen. This does not copy . - void setScreen(SplashScreen *screenA); - - // Set the line dash pattern. This copies the array. - void setLineDash(SplashCoord *lineDashA, int lineDashLengthA, - SplashCoord lineDashPhaseA); - - // Set the soft mask bitmap. - void setSoftMask(SplashBitmap *softMaskA); - -private: - - SplashState(SplashState *state); - - SplashCoord matrix[6]; - SplashPattern *strokePattern; - SplashPattern *fillPattern; - SplashScreen *screen; - SplashBlendFunc blendFunc; - SplashCoord strokeAlpha; - SplashCoord fillAlpha; - SplashCoord lineWidth; - int lineCap; - int lineJoin; - SplashCoord miterLimit; - SplashCoord flatness; - SplashCoord *lineDash; - int lineDashLength; - SplashCoord lineDashPhase; - GBool strokeAdjust; - SplashClip *clip; - SplashBitmap *softMask; - GBool deleteSoftMask; - GBool inNonIsolatedGroup; - - SplashState *next; // used by Splash class - - friend class Splash; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.cc deleted file mode 100644 index 8219596c6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.cc +++ /dev/null @@ -1,287 +0,0 @@ -//======================================================================== -// -// SplashT1Font.cc -// -//======================================================================== - -#include - -#if HAVE_T1LIB_H - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "SplashMath.h" -#include "SplashGlyphBitmap.h" -#include "SplashPath.h" -#include "SplashT1FontEngine.h" -#include "SplashT1FontFile.h" -#include "SplashT1Font.h" - -//------------------------------------------------------------------------ - -static Guchar bitReverse[256] = { - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, - 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, - 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, - 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, - 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, - 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, - 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, - 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, - 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, - 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, - 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, - 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, - 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, - 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, - 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, - 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, - 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, - 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, - 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, - 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, - 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, - 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, - 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, - 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, - 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, - 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, - 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, - 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, - 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, - 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, - 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, - 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff -}; - -//------------------------------------------------------------------------ -// SplashT1Font -//------------------------------------------------------------------------ - -SplashT1Font::SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA, - SplashCoord *textMatA): - SplashFont(fontFileA, matA, textMatA, fontFileA->engine->aa) -{ - T1_TMATRIX matrix; - BBox bbox; - SplashCoord bbx0, bby0, bbx1, bby1; - int x, y; - - t1libID = T1_CopyFont(fontFileA->t1libID); - outlineID = -1; - - // compute font size - size = (float)splashSqrt(mat[2]*mat[2] + mat[3]*mat[3]); - - // transform the four corners of the font bounding box -- the min - // and max values form the bounding box of the transformed font - bbox = T1_GetFontBBox(t1libID); - bbx0 = 0.001 * bbox.llx; - bby0 = 0.001 * bbox.lly; - bbx1 = 0.001 * bbox.urx; - bby1 = 0.001 * bbox.ury; - // some fonts are completely broken, so we fake it (with values - // large enough that most glyphs should fit) - if (bbx0 == 0 && bby0 == 0 && bbx1 == 0 && bby1 == 0) { - bbx0 = bby0 = -0.5; - bbx1 = bby1 = 1.5; - } - x = (int)(mat[0] * bbx0 + mat[2] * bby0); - xMin = xMax = x; - y = (int)(mat[1] * bbx0 + mat[3] * bby0); - yMin = yMax = y; - x = (int)(mat[0] * bbx0 + mat[2] * bby1); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - y = (int)(mat[1] * bbx0 + mat[3] * bby1); - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - x = (int)(mat[0] * bbx1 + mat[2] * bby0); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - y = (int)(mat[1] * bbx1 + mat[3] * bby0); - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - x = (int)(mat[0] * bbx1 + mat[2] * bby1); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - y = (int)(mat[1] * bbx1 + mat[3] * bby1); - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - // This is a kludge: some buggy PDF generators embed fonts with - // zero bounding boxes. - if (xMax == xMin) { - xMin = 0; - xMax = (int)size; - } - if (yMax == yMin) { - yMin = 0; - yMax = (int)(1.2 * size); - } - // Another kludge: an unusually large xMin or yMin coordinate is - // probably wrong. - if (xMin > 0) { - xMin = 0; - } - if (yMin > 0) { - yMin = 0; - } - // Another kludge: t1lib doesn't correctly handle fonts with - // real (non-integer) bounding box coordinates. - if (xMax - xMin > 5000) { - xMin = 0; - xMax = (int)size; - } - if (yMax - yMin > 5000) { - yMin = 0; - yMax = (int)(1.2 * size); - } - - // transform the font - matrix.cxx = (double)mat[0] / size; - matrix.cxy = (double)mat[1] / size; - matrix.cyx = (double)mat[2] / size; - matrix.cyy = (double)mat[3] / size; - T1_TransformFont(t1libID, &matrix); -} - -SplashT1Font::~SplashT1Font() { - T1_DeleteFont(t1libID); - if (outlineID >= 0) { - T1_DeleteFont(outlineID); - } -} - -GBool SplashT1Font::getGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap) { - return SplashFont::getGlyph(c, 0, 0, bitmap); -} - -GBool SplashT1Font::makeGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap) { - GLYPH *glyph; - int n, i; - - if (aa) { - glyph = T1_AASetChar(t1libID, c, size, NULL); - } else { - glyph = T1_SetChar(t1libID, c, size, NULL); - } - if (!glyph) { - return gFalse; - } - - bitmap->x = -glyph->metrics.leftSideBearing; - bitmap->y = glyph->metrics.ascent; - bitmap->w = glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; - bitmap->h = glyph->metrics.ascent - glyph->metrics.descent; - bitmap->aa = aa; - if (aa) { - bitmap->data = (Guchar *)glyph->bits; - bitmap->freeData = gFalse; - } else { - n = bitmap->h * ((bitmap->w + 7) >> 3); - bitmap->data = (Guchar *)gmalloc(n); - for (i = 0; i < n; ++i) { - bitmap->data[i] = bitReverse[glyph->bits[i] & 0xff]; - } - bitmap->freeData = gTrue; - } - - return gTrue; -} - -SplashPath *SplashT1Font::getGlyphPath(int c) { - T1_TMATRIX matrix; - SplashPath *path; - T1_OUTLINE *outline; - T1_PATHSEGMENT *seg; - T1_BEZIERSEGMENT *bez; - SplashCoord x, y, x1, y1; - GBool needClose; - - if (outlineID < 0) { - outlineID = T1_CopyFont(((SplashT1FontFile *)fontFile)->t1libID); - outlineSize = (float)splashSqrt(textMat[2]*textMat[2] + - textMat[3]*textMat[3]); - matrix.cxx = (double)textMat[0] / outlineSize; - matrix.cxy = (double)textMat[1] / outlineSize; - matrix.cyx = (double)textMat[2] / outlineSize; - matrix.cyy = (double)textMat[3] / outlineSize; - // t1lib doesn't seem to handle small sizes correctly here, so set - // the size to 1000, and scale the resulting coordinates later - outlineMul = (float)(outlineSize / 65536000.0); - outlineSize = 1000; - T1_TransformFont(outlineID, &matrix); - } - - path = new SplashPath(); - if ((outline = T1_GetCharOutline(outlineID, c, outlineSize, NULL))) { - x = 0; - y = 0; - needClose = gFalse; - for (seg = outline; seg; seg = seg->link) { - switch (seg->type) { - case T1_PATHTYPE_MOVE: - if (needClose) { - path->close(); - needClose = gFalse; - } - x += seg->dest.x * outlineMul; - y += seg->dest.y * outlineMul; - path->moveTo(x, -y); - break; - case T1_PATHTYPE_LINE: - x += seg->dest.x * outlineMul; - y += seg->dest.y * outlineMul; - path->lineTo(x, -y); - needClose = gTrue; - break; - case T1_PATHTYPE_BEZIER: - bez = (T1_BEZIERSEGMENT *)seg; - x1 = x + (SplashCoord)(bez->dest.x * outlineMul); - y1 = y + (SplashCoord)(bez->dest.y * outlineMul); - path->curveTo(x + (SplashCoord)(bez->B.x * outlineMul), - -(y + (SplashCoord)(bez->B.y * outlineMul)), - x + (SplashCoord)(bez->C.x * outlineMul), - -(y + (SplashCoord)(bez->C.y * outlineMul)), - x1, -y1); - x = x1; - y = y1; - needClose = gTrue; - break; - } - } - if (needClose) { - path->close(); - } - T1_FreeOutline(outline); - } - - return path; -} - -#endif // HAVE_T1LIB_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.h deleted file mode 100644 index 8ea74de48..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1Font.h +++ /dev/null @@ -1,57 +0,0 @@ -//======================================================================== -// -// SplashT1Font.h -// -//======================================================================== - -#ifndef SPLASHT1FONT_H -#define SPLASHT1FONT_H - -#include - -#if HAVE_T1LIB_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashFont.h" - -class SplashT1FontFile; - -//------------------------------------------------------------------------ -// SplashT1Font -//------------------------------------------------------------------------ - -class SplashT1Font: public SplashFont { -public: - - SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA, - SplashCoord *textMatA); - - virtual ~SplashT1Font(); - - // Munge xFrac and yFrac before calling SplashFont::getGlyph. - virtual GBool getGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap); - - // Rasterize a glyph. The and values are the same - // as described for getGlyph. - virtual GBool makeGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap); - - // Return the path for a glyph. - virtual SplashPath *getGlyphPath(int c); - -private: - - int t1libID; // t1lib font ID - int outlineID; // t1lib font ID for glyph outlines - float size; - float outlineSize; // size for glyph outlines - float outlineMul; -}; - -#endif // HAVE_T1LIB_H - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.cc deleted file mode 100644 index ca1453a5f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.cc +++ /dev/null @@ -1,124 +0,0 @@ -//======================================================================== -// -// SplashT1FontEngine.cc -// -//======================================================================== - -#include - -#if HAVE_T1LIB_H - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#ifndef WIN32 -# include -#endif -#include -#include "GString.h" -#include "gfile.h" -#include "FoFiType1C.h" -#include "SplashT1FontFile.h" -#include "SplashT1FontEngine.h" - -#ifdef VMS -#if (__VMS_VER < 70000000) -extern "C" int unlink(char *filename); -#endif -#endif - -//------------------------------------------------------------------------ - -int SplashT1FontEngine::t1libInitCount = 0; - -//------------------------------------------------------------------------ - -static void fileWrite(void *stream, char *data, int len) { - fwrite(data, 1, len, (FILE *)stream); -} - -//------------------------------------------------------------------------ -// SplashT1FontEngine -//------------------------------------------------------------------------ - -SplashT1FontEngine::SplashT1FontEngine(GBool aaA) { - aa = aaA; -} - -SplashT1FontEngine *SplashT1FontEngine::init(GBool aaA) { - // grayVals[i] = round(i * 255 / 16) - static unsigned long grayVals[17] = { - 0, 16, 32, 48, 64, 80, 96, 112, 128, 143, 159, 175, 191, 207, 223, 239, 255 - }; - - //~ for multithreading: need a mutex here - if (t1libInitCount == 0) { - T1_SetBitmapPad(8); - if (!T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE | - T1_NO_AFM)) { - return NULL; - } - if (aaA) { - T1_AASetBitsPerPixel(8); - T1_AASetLevel(T1_AA_HIGH); - T1_AAHSetGrayValues(grayVals); - } else { - T1_AANSetGrayValues(0, 1); - } - } - ++t1libInitCount; - - return new SplashT1FontEngine(aaA); -} - -SplashT1FontEngine::~SplashT1FontEngine() { - //~ for multithreading: need a mutex here - if (--t1libInitCount == 0) { - T1_CloseLib(); - } -} - -SplashFontFile *SplashT1FontEngine::loadType1Font(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, - char **enc) { - return SplashT1FontFile::loadType1Font(this, idA, fileName, deleteFile, enc); -} - -SplashFontFile *SplashT1FontEngine::loadType1CFont(SplashFontFileID *idA, - char *fileName, - GBool deleteFile, - char **enc) { - FoFiType1C *ff; - GString *tmpFileName; - FILE *tmpFile; - SplashFontFile *ret; - - if (!(ff = FoFiType1C::load(fileName))) { - return NULL; - } - tmpFileName = NULL; - if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) { - delete ff; - return NULL; - } - ff->convertToType1(NULL, NULL, gTrue, &fileWrite, tmpFile); - delete ff; - fclose(tmpFile); - ret = SplashT1FontFile::loadType1Font(this, idA, tmpFileName->getCString(), - gTrue, enc); - if (ret) { - if (deleteFile) { - unlink(fileName); - } - } else { - unlink(tmpFileName->getCString()); - } - delete tmpFileName; - return ret; -} - -#endif // HAVE_T1LIB_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.h deleted file mode 100644 index 57a04487d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontEngine.h +++ /dev/null @@ -1,53 +0,0 @@ -//======================================================================== -// -// SplashT1FontEngine.h -// -//======================================================================== - -#ifndef SPLASHT1FONTENGINE_H -#define SPLASHT1FONTENGINE_H - -#include - -#if HAVE_T1LIB_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" - -class SplashFontFile; -class SplashFontFileID; - -//------------------------------------------------------------------------ -// SplashT1FontEngine -//------------------------------------------------------------------------ - -class SplashT1FontEngine { -public: - - static SplashT1FontEngine *init(GBool aaA); - - ~SplashT1FontEngine(); - - // Load fonts. - SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName, - GBool deleteFile, char **enc); - SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName, - GBool deleteFile, char **enc); - -private: - - SplashT1FontEngine(GBool aaA); - - static int t1libInitCount; - GBool aa; - - friend class SplashT1FontFile; - friend class SplashT1Font; -}; - -#endif // HAVE_T1LIB_H - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.cc deleted file mode 100644 index 0dbb8f055..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.cc +++ /dev/null @@ -1,97 +0,0 @@ -//======================================================================== -// -// SplashT1FontFile.cc -// -//======================================================================== - -#include - -#if HAVE_T1LIB_H - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "SplashT1FontEngine.h" -#include "SplashT1Font.h" -#include "SplashT1FontFile.h" - -//------------------------------------------------------------------------ -// SplashT1FontFile -//------------------------------------------------------------------------ - -SplashFontFile *SplashT1FontFile::loadType1Font(SplashT1FontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, - GBool deleteFileA, - char **encA) { - int t1libIDA; - char **encTmp; - char *encStrTmp; - int encStrSize; - char *encPtr; - int i; - - // load the font file - if ((t1libIDA = T1_AddFont(fileNameA)) < 0) { - return NULL; - } - T1_LoadFont(t1libIDA); - - // reencode it - encStrSize = 0; - for (i = 0; i < 256; ++i) { - if (encA[i]) { - encStrSize += strlen(encA[i]) + 1; - } - } - encTmp = (char **)gmallocn(257, sizeof(char *)); - encStrTmp = (char *)gmallocn(encStrSize, sizeof(char)); - encPtr = encStrTmp; - for (i = 0; i < 256; ++i) { - if (encA[i]) { - strcpy(encPtr, encA[i]); - encTmp[i] = encPtr; - encPtr += strlen(encPtr) + 1; - } else { - encTmp[i] = ".notdef"; - } - } - encTmp[256] = "custom"; - T1_ReencodeFont(t1libIDA, encTmp); - - return new SplashT1FontFile(engineA, idA, fileNameA, deleteFileA, - t1libIDA, encTmp, encStrTmp); -} - -SplashT1FontFile::SplashT1FontFile(SplashT1FontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, GBool deleteFileA, - int t1libIDA, char **encA, char *encStrA): - SplashFontFile(idA, fileNameA, deleteFileA) -{ - engine = engineA; - t1libID = t1libIDA; - enc = encA; - encStr = encStrA; -} - -SplashT1FontFile::~SplashT1FontFile() { - gfree(encStr); - gfree(enc); - T1_DeleteFont(t1libID); -} - -SplashFont *SplashT1FontFile::makeFont(SplashCoord *mat, - SplashCoord *textMat) { - SplashFont *font; - - font = new SplashT1Font(this, mat, textMat); - font->initCache(); - return font; -} - -#endif // HAVE_T1LIB_H diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.h deleted file mode 100644 index 69c9caf0e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashT1FontFile.h +++ /dev/null @@ -1,58 +0,0 @@ -//======================================================================== -// -// SplashT1FontFile.h -// -//======================================================================== - -#ifndef SPLASHT1FONTFILE_H -#define SPLASHT1FONTFILE_H - -#include - -#if HAVE_T1LIB_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashFontFile.h" - -class SplashT1FontEngine; - -//------------------------------------------------------------------------ -// SplashT1FontFile -//------------------------------------------------------------------------ - -class SplashT1FontFile: public SplashFontFile { -public: - - static SplashFontFile *loadType1Font(SplashT1FontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, GBool deleteFileA, - char **encA); - - virtual ~SplashT1FontFile(); - - // Create a new SplashT1Font, i.e., a scaled instance of this font - // file. - virtual SplashFont *makeFont(SplashCoord *mat, - SplashCoord *textMat); - -private: - - SplashT1FontFile(SplashT1FontEngine *engineA, - SplashFontFileID *idA, - char *fileNameA, GBool deleteFileA, - int t1libIDA, char **encA, char *encStrA); - - SplashT1FontEngine *engine; - int t1libID; // t1lib font ID - char **enc; - char *encStr; - - friend class SplashT1Font; -}; - -#endif // HAVE_T1LIB_H - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashTypes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashTypes.h deleted file mode 100644 index 35551b90a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashTypes.h +++ /dev/null @@ -1,132 +0,0 @@ -//======================================================================== -// -// SplashTypes.h -// -//======================================================================== - -#ifndef SPLASHTYPES_H -#define SPLASHTYPES_H - -#include -#include "gtypes.h" - -//------------------------------------------------------------------------ -// coordinates -//------------------------------------------------------------------------ - -#if USE_FIXEDPOINT -#include "FixedPoint.h" -typedef FixedPoint SplashCoord; -#else -typedef double SplashCoord; -#endif - -//------------------------------------------------------------------------ -// antialiasing -//------------------------------------------------------------------------ - -#define splashAASize 4 - -//------------------------------------------------------------------------ -// colors -//------------------------------------------------------------------------ - -enum SplashColorMode { - splashModeMono1, // 1 bit per component, 8 pixels per byte, - // MSbit is on the left - splashModeMono8, // 1 byte per component, 1 byte per pixel - splashModeRGB8, // 1 byte per component, 3 bytes per pixel: - // RGBRGB... - splashModeBGR8 // 1 byte per component, 3 bytes per pixel: - // BGRBGR... - -#if SPLASH_CMYK - , - splashModeCMYK8 // 1 byte per component, 4 bytes per pixel: - // CMYKCMYK... -#endif -}; - -// number of components in each color mode -// (defined in SplashState.cc) -extern int splashColorModeNComps[]; - -// max number of components in any SplashColor -#if SPLASH_CMYK -# define splashMaxColorComps 4 -#else -# define splashMaxColorComps 3 -#endif - -typedef Guchar SplashColor[splashMaxColorComps]; -typedef Guchar *SplashColorPtr; - -// RGB8 -static inline Guchar splashRGB8R(SplashColorPtr rgb8) { return rgb8[0]; } -static inline Guchar splashRGB8G(SplashColorPtr rgb8) { return rgb8[1]; } -static inline Guchar splashRGB8B(SplashColorPtr rgb8) { return rgb8[2]; } - -// BGR8 -static inline Guchar splashBGR8R(SplashColorPtr bgr8) { return bgr8[2]; } -static inline Guchar splashBGR8G(SplashColorPtr bgr8) { return bgr8[1]; } -static inline Guchar splashBGR8B(SplashColorPtr bgr8) { return bgr8[0]; } - -#if SPLASH_CMYK -// CMYK8 -static inline Guchar splashCMYK8C(SplashColorPtr cmyk8) { return cmyk8[0]; } -static inline Guchar splashCMYK8M(SplashColorPtr cmyk8) { return cmyk8[1]; } -static inline Guchar splashCMYK8Y(SplashColorPtr cmyk8) { return cmyk8[2]; } -static inline Guchar splashCMYK8K(SplashColorPtr cmyk8) { return cmyk8[3]; } -#endif - -static inline void splashColorCopy(SplashColorPtr dest, SplashColorPtr src) { - dest[0] = src[0]; - dest[1] = src[1]; - dest[2] = src[2]; -#if SPLASH_CMYK - dest[3] = src[3]; -#endif -} - -static inline void splashColorXor(SplashColorPtr dest, SplashColorPtr src) { - dest[0] ^= src[0]; - dest[1] ^= src[1]; - dest[2] ^= src[2]; -#if SPLASH_CMYK - dest[3] ^= src[3]; -#endif -} - -//------------------------------------------------------------------------ -// blend functions -//------------------------------------------------------------------------ - -typedef void (*SplashBlendFunc)(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm); - -//------------------------------------------------------------------------ -// screen parameters -//------------------------------------------------------------------------ - -enum SplashScreenType { - splashScreenDispersed, - splashScreenClustered, - splashScreenStochasticClustered -}; - -struct SplashScreenParams { - SplashScreenType type; - int size; - int dotRadius; - SplashCoord gamma; - SplashCoord blackThreshold; - SplashCoord whiteThreshold; -}; - -//------------------------------------------------------------------------ -// error results -//------------------------------------------------------------------------ - -typedef int SplashError; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.cc deleted file mode 100644 index da296b171..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.cc +++ /dev/null @@ -1,438 +0,0 @@ -//======================================================================== -// -// SplashXPath.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "SplashMath.h" -#include "SplashPath.h" -#include "SplashXPath.h" - -//------------------------------------------------------------------------ - -struct SplashXPathPoint { - SplashCoord x, y; -}; - -struct SplashXPathAdjust { - int firstPt, lastPt; // range of points - GBool vert; // vertical or horizontal hint - SplashCoord x0a, x0b, // hint boundaries - xma, xmb, - x1a, x1b; - SplashCoord x0, x1, xm; // adjusted coordinates -}; - -//------------------------------------------------------------------------ - -// Transform a point from user space to device space. -inline void SplashXPath::transform(SplashCoord *matrix, - SplashCoord xi, SplashCoord yi, - SplashCoord *xo, SplashCoord *yo) { - // [ m[0] m[1] 0 ] - // [xo yo 1] = [xi yi 1] * [ m[2] m[3] 0 ] - // [ m[4] m[5] 1 ] - *xo = xi * matrix[0] + yi * matrix[2] + matrix[4]; - *yo = xi * matrix[1] + yi * matrix[3] + matrix[5]; -} - -//------------------------------------------------------------------------ -// SplashXPath -//------------------------------------------------------------------------ - -SplashXPath::SplashXPath() { - segs = NULL; - length = size = 0; -} - -SplashXPath::SplashXPath(SplashPath *path, SplashCoord *matrix, - SplashCoord flatness, GBool closeSubpaths) { - SplashPathHint *hint; - SplashXPathPoint *pts; - SplashXPathAdjust *adjusts, *adjust; - SplashCoord x0, y0, x1, y1, x2, y2, x3, y3, xsp, ysp; - SplashCoord adj0, adj1, w; - int ww; - int curSubpath, curSubpathX, i, j; - - // transform the points - pts = (SplashXPathPoint *)gmallocn(path->length, sizeof(SplashXPathPoint)); - for (i = 0; i < path->length; ++i) { - transform(matrix, path->pts[i].x, path->pts[i].y, &pts[i].x, &pts[i].y); - } - - // set up the stroke adjustment hints - if (path->hints) { - adjusts = (SplashXPathAdjust *)gmallocn(path->hintsLength, - sizeof(SplashXPathAdjust)); - for (i = 0; i < path->hintsLength; ++i) { - hint = &path->hints[i]; - x0 = pts[hint->ctrl0 ].x; y0 = pts[hint->ctrl0 ].y; - x1 = pts[hint->ctrl0 + 1].x; y1 = pts[hint->ctrl0 + 1].y; - x2 = pts[hint->ctrl1 ].x; y2 = pts[hint->ctrl1 ].y; - x3 = pts[hint->ctrl1 + 1].x; y3 = pts[hint->ctrl1 + 1].y; - if (x0 == x1 && x2 == x3) { - adjusts[i].vert = gTrue; - adj0 = x0; - adj1 = x2; - } else if (y0 == y1 && y2 == y3) { - adjusts[i].vert = gFalse; - adj0 = y0; - adj1 = y2; - } else { - gfree(adjusts); - adjusts = NULL; - break; - } - if (adj0 > adj1) { - x0 = adj0; - adj0 = adj1; - adj1 = x0; - } - w = adj1 - adj0; - ww = splashRound(w); - if (ww == 0) { - ww = 1; - } - adjusts[i].x0a = adj0 - 0.01; - adjusts[i].x0b = adj0 + 0.01; - adjusts[i].xma = (SplashCoord)0.5 * (adj0 + adj1) - 0.01; - adjusts[i].xmb = (SplashCoord)0.5 * (adj0 + adj1) + 0.01; - adjusts[i].x1a = adj1 - 0.01; - adjusts[i].x1b = adj1 + 0.01; - adjusts[i].x0 = (SplashCoord)splashRound(adj0); - adjusts[i].x1 = adjusts[i].x0 + ww - 0.01; - adjusts[i].xm = (SplashCoord)0.5 * (adjusts[i].x0 + adjusts[i].x1); - adjusts[i].firstPt = hint->firstPt; - adjusts[i].lastPt = hint->lastPt; - } - - } else { - adjusts = NULL; - } - - // perform stroke adjustment - if (adjusts) { - for (i = 0, adjust = adjusts; i < path->hintsLength; ++i, ++adjust) { - for (j = adjust->firstPt; j <= adjust->lastPt; ++j) { - strokeAdjust(adjust, &pts[j].x, &pts[j].y); - } - } - gfree(adjusts); - } - - segs = NULL; - length = size = 0; - - x0 = y0 = xsp = ysp = 0; // make gcc happy - adj0 = adj1 = 0; // make gcc happy - curSubpath = 0; - curSubpathX = 0; - i = 0; - while (i < path->length) { - - // first point in subpath - skip it - if (path->flags[i] & splashPathFirst) { - x0 = pts[i].x; - y0 = pts[i].y; - xsp = x0; - ysp = y0; - curSubpath = i; - curSubpathX = length; - ++i; - - } else { - - // curve segment - if (path->flags[i] & splashPathCurve) { - x1 = pts[i].x; - y1 = pts[i].y; - x2 = pts[i+1].x; - y2 = pts[i+1].y; - x3 = pts[i+2].x; - y3 = pts[i+2].y; - addCurve(x0, y0, x1, y1, x2, y2, x3, y3, - flatness, - (path->flags[i-1] & splashPathFirst), - (path->flags[i+2] & splashPathLast), - !closeSubpaths && - (path->flags[i-1] & splashPathFirst) && - !(path->flags[i-1] & splashPathClosed), - !closeSubpaths && - (path->flags[i+2] & splashPathLast) && - !(path->flags[i+2] & splashPathClosed)); - x0 = x3; - y0 = y3; - i += 3; - - // line segment - } else { - x1 = pts[i].x; - y1 = pts[i].y; - addSegment(x0, y0, x1, y1, - path->flags[i-1] & splashPathFirst, - path->flags[i] & splashPathLast, - !closeSubpaths && - (path->flags[i-1] & splashPathFirst) && - !(path->flags[i-1] & splashPathClosed), - !closeSubpaths && - (path->flags[i] & splashPathLast) && - !(path->flags[i] & splashPathClosed)); - x0 = x1; - y0 = y1; - ++i; - } - - // close a subpath - if (closeSubpaths && - (path->flags[i-1] & splashPathLast) && - (pts[i-1].x != pts[curSubpath].x || - pts[i-1].y != pts[curSubpath].y)) { - addSegment(x0, y0, xsp, ysp, - gFalse, gTrue, gFalse, gFalse); - } - } - } - - gfree(pts); -} - -// Apply the stroke adjust hints to point : (*, *). -void SplashXPath::strokeAdjust(SplashXPathAdjust *adjust, - SplashCoord *xp, SplashCoord *yp) { - SplashCoord x, y; - - if (adjust->vert) { - x = *xp; - if (x > adjust->x0a && x < adjust->x0b) { - *xp = adjust->x0; - } else if (x > adjust->xma && x < adjust->xmb) { - *xp = adjust->xm; - } else if (x > adjust->x1a && x < adjust->x1b) { - *xp = adjust->x1; - } - } else { - y = *yp; - if (y > adjust->x0a && y < adjust->x0b) { - *yp = adjust->x0; - } else if (y > adjust->xma && y < adjust->xmb) { - *yp = adjust->xm; - } else if (y > adjust->x1a && y < adjust->x1b) { - *yp = adjust->x1; - } - } -} - -SplashXPath::SplashXPath(SplashXPath *xPath) { - length = xPath->length; - size = xPath->size; - segs = (SplashXPathSeg *)gmallocn(size, sizeof(SplashXPathSeg)); - memcpy(segs, xPath->segs, length * sizeof(SplashXPathSeg)); -} - -SplashXPath::~SplashXPath() { - gfree(segs); -} - -// Add space for more segments -void SplashXPath::grow(int nSegs) { - if (length + nSegs > size) { - if (size == 0) { - size = 32; - } - while (size < length + nSegs) { - size *= 2; - } - segs = (SplashXPathSeg *)greallocn(segs, size, sizeof(SplashXPathSeg)); - } -} - -void SplashXPath::addCurve(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1, - SplashCoord x2, SplashCoord y2, - SplashCoord x3, SplashCoord y3, - SplashCoord flatness, - GBool first, GBool last, GBool end0, GBool end1) { - SplashCoord cx[splashMaxCurveSplits + 1][3]; - SplashCoord cy[splashMaxCurveSplits + 1][3]; - int cNext[splashMaxCurveSplits + 1]; - SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh; - SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh; - SplashCoord dx, dy, mx, my, d1, d2, flatness2; - int p1, p2, p3; - - flatness2 = flatness * flatness; - - // initial segment - p1 = 0; - p2 = splashMaxCurveSplits; - cx[p1][0] = x0; cy[p1][0] = y0; - cx[p1][1] = x1; cy[p1][1] = y1; - cx[p1][2] = x2; cy[p1][2] = y2; - cx[p2][0] = x3; cy[p2][0] = y3; - cNext[p1] = p2; - - while (p1 < splashMaxCurveSplits) { - - // get the next segment - xl0 = cx[p1][0]; yl0 = cy[p1][0]; - xx1 = cx[p1][1]; yy1 = cy[p1][1]; - xx2 = cx[p1][2]; yy2 = cy[p1][2]; - p2 = cNext[p1]; - xr3 = cx[p2][0]; yr3 = cy[p2][0]; - - // compute the distances from the control points to the - // midpoint of the straight line (this is a bit of a hack, but - // it's much faster than computing the actual distances to the - // line) - mx = (xl0 + xr3) * 0.5; - my = (yl0 + yr3) * 0.5; - dx = xx1 - mx; - dy = yy1 - my; - d1 = dx*dx + dy*dy; - dx = xx2 - mx; - dy = yy2 - my; - d2 = dx*dx + dy*dy; - - // if the curve is flat enough, or no more subdivisions are - // allowed, add the straight line segment - if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) { - addSegment(xl0, yl0, xr3, yr3, - p1 == 0 && first, - p2 == splashMaxCurveSplits && last, - p1 == 0 && end0, - p2 == splashMaxCurveSplits && end1); - p1 = p2; - - // otherwise, subdivide the curve - } else { - xl1 = (xl0 + xx1) * 0.5; - yl1 = (yl0 + yy1) * 0.5; - xh = (xx1 + xx2) * 0.5; - yh = (yy1 + yy2) * 0.5; - xl2 = (xl1 + xh) * 0.5; - yl2 = (yl1 + yh) * 0.5; - xr2 = (xx2 + xr3) * 0.5; - yr2 = (yy2 + yr3) * 0.5; - xr1 = (xh + xr2) * 0.5; - yr1 = (yh + yr2) * 0.5; - xr0 = (xl2 + xr1) * 0.5; - yr0 = (yl2 + yr1) * 0.5; - // add the new subdivision points - p3 = (p1 + p2) / 2; - cx[p1][1] = xl1; cy[p1][1] = yl1; - cx[p1][2] = xl2; cy[p1][2] = yl2; - cNext[p1] = p3; - cx[p3][0] = xr0; cy[p3][0] = yr0; - cx[p3][1] = xr1; cy[p3][1] = yr1; - cx[p3][2] = xr2; cy[p3][2] = yr2; - cNext[p3] = p2; - } - } -} - -void SplashXPath::addSegment(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1, - GBool first, GBool last, GBool end0, GBool end1) { - grow(1); - segs[length].x0 = x0; - segs[length].y0 = y0; - segs[length].x1 = x1; - segs[length].y1 = y1; - segs[length].flags = 0; - if (first) { - segs[length].flags |= splashXPathFirst; - } - if (last) { - segs[length].flags |= splashXPathLast; - } - if (end0) { - segs[length].flags |= splashXPathEnd0; - } - if (end1) { - segs[length].flags |= splashXPathEnd1; - } - if (y1 == y0) { - segs[length].dxdy = segs[length].dydx = 0; - segs[length].flags |= splashXPathHoriz; - if (x1 == x0) { - segs[length].flags |= splashXPathVert; - } - } else if (x1 == x0) { - segs[length].dxdy = segs[length].dydx = 0; - segs[length].flags |= splashXPathVert; - } else { -#if USE_FIXEDPOINT - if (FixedPoint::divCheck(x1 - x0, y1 - y0, &segs[length].dxdy)) { - segs[length].dydx = (SplashCoord)1 / segs[length].dxdy; - } else { - segs[length].dxdy = segs[length].dydx = 0; - if (splashAbs(x1 - x0) > splashAbs(y1 - y0)) { - segs[length].flags |= splashXPathHoriz; - } else { - segs[length].flags |= splashXPathVert; - } - } -#else - segs[length].dxdy = (x1 - x0) / (y1 - y0); - segs[length].dydx = (SplashCoord)1 / segs[length].dxdy; -#endif - } - if (y0 > y1) { - segs[length].flags |= splashXPathFlip; - } - ++length; -} - -static int cmpXPathSegs(const void *arg0, const void *arg1) { - SplashXPathSeg *seg0 = (SplashXPathSeg *)arg0; - SplashXPathSeg *seg1 = (SplashXPathSeg *)arg1; - SplashCoord x0, y0, x1, y1; - - if (seg0->flags & splashXPathFlip) { - x0 = seg0->x1; - y0 = seg0->y1; - } else { - x0 = seg0->x0; - y0 = seg0->y0; - } - if (seg1->flags & splashXPathFlip) { - x1 = seg1->x1; - y1 = seg1->y1; - } else { - x1 = seg1->x0; - y1 = seg1->y0; - } - if (y0 != y1) { - return (y0 > y1) ? 1 : -1; - } - if (x0 != x1) { - return (x0 > x1) ? 1 : -1; - } - return 0; -} - -void SplashXPath::aaScale() { - SplashXPathSeg *seg; - int i; - - for (i = 0, seg = segs; i < length; ++i, ++seg) { - seg->x0 *= splashAASize; - seg->y0 *= splashAASize; - seg->x1 *= splashAASize; - seg->y1 *= splashAASize; - } -} - -void SplashXPath::sort() { - qsort(segs, length, sizeof(SplashXPathSeg), &cmpXPathSegs); -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.h deleted file mode 100644 index 43276b848..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPath.h +++ /dev/null @@ -1,100 +0,0 @@ -//======================================================================== -// -// SplashXPath.h -// -//======================================================================== - -#ifndef SPLASHXPATH_H -#define SPLASHXPATH_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" - -class SplashPath; -struct SplashXPathAdjust; - -//------------------------------------------------------------------------ - -#define splashMaxCurveSplits (1 << 10) - -//------------------------------------------------------------------------ -// SplashXPathSeg -//------------------------------------------------------------------------ - -struct SplashXPathSeg { - SplashCoord x0, y0; // first endpoint - SplashCoord x1, y1; // second endpoint - SplashCoord dxdy; // slope: delta-x / delta-y - SplashCoord dydx; // slope: delta-y / delta-x - Guint flags; -}; - -#define splashXPathFirst 0x01 // first segment of a subpath -#define splashXPathLast 0x02 // last segment of a subpath -#define splashXPathEnd0 0x04 // first endpoint is end of an open subpath -#define splashXPathEnd1 0x08 // second endpoint is end of an open subpath -#define splashXPathHoriz 0x10 // segment is vertical (y0 == y1) - // (dxdy is undef) -#define splashXPathVert 0x20 // segment is horizontal (x0 == x1) - // (dydx is undef) -#define splashXPathFlip 0x40 // y0 > y1 - -//------------------------------------------------------------------------ -// SplashXPath -//------------------------------------------------------------------------ - -class SplashXPath { -public: - - // Expands (converts to segments) and flattens (converts curves to - // lines) . Transforms all points from user space to device - // space, via . If is true, closes all open - // subpaths. - SplashXPath(SplashPath *path, SplashCoord *matrix, - SplashCoord flatness, GBool closeSubpaths); - - // Copy an expanded path. - SplashXPath *copy() { return new SplashXPath(this); } - - ~SplashXPath(); - - // Multiply all coordinates by splashAASize, in preparation for - // anti-aliased rendering. - void aaScale(); - - // Sort by upper coordinate (lower y), in y-major order. - void sort(); - -private: - - SplashXPath(); - SplashXPath(SplashXPath *xPath); - void transform(SplashCoord *matrix, SplashCoord xi, SplashCoord yi, - SplashCoord *xo, SplashCoord *yo); - void strokeAdjust(SplashXPathAdjust *adjust, - SplashCoord *xp, SplashCoord *yp); - void grow(int nSegs); - void addCurve(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1, - SplashCoord x2, SplashCoord y2, - SplashCoord x3, SplashCoord y3, - SplashCoord flatness, - GBool first, GBool last, GBool end0, GBool end1); - void addSegment(SplashCoord x0, SplashCoord y0, - SplashCoord x1, SplashCoord y1, - GBool first, GBool last, GBool end0, GBool end1); - - SplashXPathSeg *segs; - int length, size; // length and size of segs array - - friend class SplashXPathScanner; - friend class SplashClip; - friend class Splash; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.cc deleted file mode 100644 index e9383373d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.cc +++ /dev/null @@ -1,428 +0,0 @@ -//======================================================================== -// -// SplashXPathScanner.cc -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "SplashMath.h" -#include "SplashXPath.h" -#include "SplashBitmap.h" -#include "SplashXPathScanner.h" - -//------------------------------------------------------------------------ - -struct SplashIntersect { - int x0, x1; // intersection of segment with [y, y+1) - int count; // EO/NZWN counter increment -}; - -static int cmpIntersect(const void *p0, const void *p1) { - return ((SplashIntersect *)p0)->x0 - ((SplashIntersect *)p1)->x0; -} - -//------------------------------------------------------------------------ -// SplashXPathScanner -//------------------------------------------------------------------------ - -SplashXPathScanner::SplashXPathScanner(SplashXPath *xPathA, GBool eoA) { - SplashXPathSeg *seg; - SplashCoord xMinFP, yMinFP, xMaxFP, yMaxFP; - int i; - - xPath = xPathA; - eo = eoA; - - // compute the bbox - if (xPath->length == 0) { - xMin = yMin = 1; - xMax = yMax = 0; - } else { - seg = &xPath->segs[0]; - if (seg->x0 <= seg->x1) { - xMinFP = seg->x0; - xMaxFP = seg->x1; - } else { - xMinFP = seg->x1; - xMaxFP = seg->x0; - } - if (seg->flags & splashXPathFlip) { - yMinFP = seg->y1; - yMaxFP = seg->y0; - } else { - yMinFP = seg->y0; - yMaxFP = seg->y1; - } - for (i = 1; i < xPath->length; ++i) { - seg = &xPath->segs[i]; - if (seg->x0 < xMinFP) { - xMinFP = seg->x0; - } else if (seg->x0 > xMaxFP) { - xMaxFP = seg->x0; - } - if (seg->x1 < xMinFP) { - xMinFP = seg->x1; - } else if (seg->x1 > xMaxFP) { - xMaxFP = seg->x1; - } - if (seg->flags & splashXPathFlip) { - if (seg->y0 > yMaxFP) { - yMaxFP = seg->y0; - } - } else { - if (seg->y1 > yMaxFP) { - yMaxFP = seg->y1; - } - } - } - xMin = splashFloor(xMinFP); - xMax = splashFloor(xMaxFP); - yMin = splashFloor(yMinFP); - yMax = splashFloor(yMaxFP); - } - - interY = yMin - 1; - xPathIdx = 0; - inter = NULL; - interLen = interSize = 0; -} - -SplashXPathScanner::~SplashXPathScanner() { - gfree(inter); -} - -void SplashXPathScanner::getBBoxAA(int *xMinA, int *yMinA, - int *xMaxA, int *yMaxA) { - *xMinA = xMin / splashAASize; - *yMinA = yMin / splashAASize; - *xMaxA = xMax / splashAASize; - *yMaxA = yMax / splashAASize; -} - -void SplashXPathScanner::getSpanBounds(int y, int *spanXMin, int *spanXMax) { - if (interY != y) { - computeIntersections(y); - } - if (interLen > 0) { - *spanXMin = inter[0].x0; - *spanXMax = inter[interLen - 1].x1; - } else { - *spanXMin = xMax + 1; - *spanXMax = xMax; - } -} - -GBool SplashXPathScanner::test(int x, int y) { - int count, i; - - if (interY != y) { - computeIntersections(y); - } - count = 0; - for (i = 0; i < interLen && inter[i].x0 <= x; ++i) { - if (x <= inter[i].x1) { - return gTrue; - } - count += inter[i].count; - } - return eo ? (count & 1) : (count != 0); -} - -GBool SplashXPathScanner::testSpan(int x0, int x1, int y) { - int count, xx1, i; - - if (interY != y) { - computeIntersections(y); - } - - count = 0; - for (i = 0; i < interLen && inter[i].x1 < x0; ++i) { - count += inter[i].count; - } - - // invariant: the subspan [x0,xx1] is inside the path - xx1 = x0 - 1; - while (xx1 < x1) { - if (i >= interLen) { - return gFalse; - } - if (inter[i].x0 > xx1 + 1 && - !(eo ? (count & 1) : (count != 0))) { - return gFalse; - } - if (inter[i].x1 > xx1) { - xx1 = inter[i].x1; - } - count += inter[i].count; - ++i; - } - - return gTrue; -} - -GBool SplashXPathScanner::getNextSpan(int y, int *x0, int *x1) { - int xx0, xx1; - - if (interY != y) { - computeIntersections(y); - } - if (interIdx >= interLen) { - return gFalse; - } - xx0 = inter[interIdx].x0; - xx1 = inter[interIdx].x1; - interCount += inter[interIdx].count; - ++interIdx; - while (interIdx < interLen && - (inter[interIdx].x0 <= xx1 || - (eo ? (interCount & 1) : (interCount != 0)))) { - if (inter[interIdx].x1 > xx1) { - xx1 = inter[interIdx].x1; - } - interCount += inter[interIdx].count; - ++interIdx; - } - *x0 = xx0; - *x1 = xx1; - return gTrue; -} - -void SplashXPathScanner::computeIntersections(int y) { - SplashCoord xSegMin, xSegMax, ySegMin, ySegMax, xx0, xx1; - SplashXPathSeg *seg; - int i, j; - - // find the first segment that intersects [y, y+1) - i = (y >= interY) ? xPathIdx : 0; - while (i < xPath->length && - xPath->segs[i].y0 < y && xPath->segs[i].y1 < y) { - ++i; - } - xPathIdx = i; - - // find all of the segments that intersect [y, y+1) and create an - // Intersect element for each one - interLen = 0; - for (j = i; j < xPath->length; ++j) { - seg = &xPath->segs[j]; - if (seg->flags & splashXPathFlip) { - ySegMin = seg->y1; - ySegMax = seg->y0; - } else { - ySegMin = seg->y0; - ySegMax = seg->y1; - } - - // ensure that: ySegMin < y+1 - // y <= ySegMax - if (ySegMin >= y + 1) { - break; - } - if (ySegMax < y) { - continue; - } - - if (interLen == interSize) { - if (interSize == 0) { - interSize = 16; - } else { - interSize *= 2; - } - inter = (SplashIntersect *)greallocn(inter, interSize, - sizeof(SplashIntersect)); - } - - if (seg->flags & splashXPathHoriz) { - xx0 = seg->x0; - xx1 = seg->x1; - } else if (seg->flags & splashXPathVert) { - xx0 = xx1 = seg->x0; - } else { - if (seg->x0 < seg->x1) { - xSegMin = seg->x0; - xSegMax = seg->x1; - } else { - xSegMin = seg->x1; - xSegMax = seg->x0; - } - // intersection with top edge - xx0 = seg->x0 + ((SplashCoord)y - seg->y0) * seg->dxdy; - // intersection with bottom edge - xx1 = seg->x0 + ((SplashCoord)y + 1 - seg->y0) * seg->dxdy; - // the segment may not actually extend to the top and/or bottom edges - if (xx0 < xSegMin) { - xx0 = xSegMin; - } else if (xx0 > xSegMax) { - xx0 = xSegMax; - } - if (xx1 < xSegMin) { - xx1 = xSegMin; - } else if (xx1 > xSegMax) { - xx1 = xSegMax; - } - } - if (xx0 < xx1) { - inter[interLen].x0 = splashFloor(xx0); - inter[interLen].x1 = splashFloor(xx1); - } else { - inter[interLen].x0 = splashFloor(xx1); - inter[interLen].x1 = splashFloor(xx0); - } - if (ySegMin <= y && - (SplashCoord)y < ySegMax && - !(seg->flags & splashXPathHoriz)) { - inter[interLen].count = eo ? 1 - : (seg->flags & splashXPathFlip) ? 1 : -1; - } else { - inter[interLen].count = 0; - } - ++interLen; - } - - qsort(inter, interLen, sizeof(SplashIntersect), &cmpIntersect); - - interY = y; - interIdx = 0; - interCount = 0; -} - -void SplashXPathScanner::renderAALine(SplashBitmap *aaBuf, - int *x0, int *x1, int y) { - int xx0, xx1, xx, xxMin, xxMax, yy; - Guchar mask; - SplashColorPtr p; - - memset(aaBuf->getDataPtr(), 0, aaBuf->getRowSize() * aaBuf->getHeight()); - xxMin = aaBuf->getWidth(); - xxMax = -1; - for (yy = 0; yy < splashAASize; ++yy) { - computeIntersections(splashAASize * y + yy); - while (interIdx < interLen) { - xx0 = inter[interIdx].x0; - xx1 = inter[interIdx].x1; - interCount += inter[interIdx].count; - ++interIdx; - while (interIdx < interLen && - (inter[interIdx].x0 <= xx1 || - (eo ? (interCount & 1) : (interCount != 0)))) { - if (inter[interIdx].x1 > xx1) { - xx1 = inter[interIdx].x1; - } - interCount += inter[interIdx].count; - ++interIdx; - } - if (xx0 < 0) { - xx0 = 0; - } - ++xx1; - if (xx1 > aaBuf->getWidth()) { - xx1 = aaBuf->getWidth(); - } - // set [xx0, xx1) to 1 - if (xx0 < xx1) { - xx = xx0; - p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3); - if (xx & 7) { - mask = 0xff >> (xx & 7); - if ((xx & ~7) == (xx1 & ~7)) { - mask &= (Guchar)(0xff00 >> (xx1 & 7)); - } - *p++ |= mask; - xx = (xx & ~7) + 8; - } - for (; xx + 7 < xx1; xx += 8) { - *p++ |= 0xff; - } - if (xx < xx1) { - *p |= (Guchar)(0xff00 >> (xx1 & 7)); - } - } - if (xx0 < xxMin) { - xxMin = xx0; - } - if (xx1 > xxMax) { - xxMax = xx1; - } - } - } - *x0 = xxMin / splashAASize; - *x1 = (xxMax - 1) / splashAASize; -} - -void SplashXPathScanner::clipAALine(SplashBitmap *aaBuf, - int *x0, int *x1, int y) { - int xx0, xx1, xx, yy; - Guchar mask; - SplashColorPtr p; - - for (yy = 0; yy < splashAASize; ++yy) { - xx = *x0 * splashAASize; - computeIntersections(splashAASize * y + yy); - while (interIdx < interLen && xx < (*x1 + 1) * splashAASize) { - xx0 = inter[interIdx].x0; - xx1 = inter[interIdx].x1; - interCount += inter[interIdx].count; - ++interIdx; - while (interIdx < interLen && - (inter[interIdx].x0 <= xx1 || - (eo ? (interCount & 1) : (interCount != 0)))) { - if (inter[interIdx].x1 > xx1) { - xx1 = inter[interIdx].x1; - } - interCount += inter[interIdx].count; - ++interIdx; - } - if (xx0 > aaBuf->getWidth()) { - xx0 = aaBuf->getWidth(); - } - // set [xx, xx0) to 0 - if (xx < xx0) { - p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3); - if (xx & 7) { - mask = (Guchar)(0xff00 >> (xx & 7)); - if ((xx & ~7) == (xx0 & ~7)) { - mask |= 0xff >> (xx0 & 7); - } - *p++ &= mask; - xx = (xx & ~7) + 8; - } - for (; xx + 7 < xx0; xx += 8) { - *p++ = 0x00; - } - if (xx < xx0) { - *p &= 0xff >> (xx0 & 7); - } - } - if (xx1 >= xx) { - xx = xx1 + 1; - } - } - xx0 = (*x1 + 1) * splashAASize; - // set [xx, xx0) to 0 - if (xx < xx0) { - p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() + (xx >> 3); - if (xx & 7) { - mask = (Guchar)(0xff00 >> (xx & 7)); - if ((xx & ~7) == (xx0 & ~7)) { - mask &= 0xff >> (xx0 & 7); - } - *p++ &= mask; - xx = (xx & ~7) + 8; - } - for (; xx + 7 < xx0; xx += 8) { - *p++ = 0x00; - } - if (xx < xx0) { - *p &= 0xff >> (xx0 & 7); - } - } - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.h deleted file mode 100644 index ab02fcc99..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/SplashXPathScanner.h +++ /dev/null @@ -1,87 +0,0 @@ -//======================================================================== -// -// SplashXPathScanner.h -// -//======================================================================== - -#ifndef SPLASHXPATHSCANNER_H -#define SPLASHXPATHSCANNER_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" - -class SplashXPath; -class SplashBitmap; -struct SplashIntersect; - -//------------------------------------------------------------------------ -// SplashXPathScanner -//------------------------------------------------------------------------ - -class SplashXPathScanner { -public: - - // Create a new SplashXPathScanner object. must be sorted. - SplashXPathScanner(SplashXPath *xPathA, GBool eoA); - - ~SplashXPathScanner(); - - // Return the path's bounding box. - void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA) - { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } - - // Return the path's bounding box. - void getBBoxAA(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA); - - // Return the min/max x values for the span at . - void getSpanBounds(int y, int *spanXMin, int *spanXMax); - - // Returns true if (,) is inside the path. - GBool test(int x, int y); - - // Returns true if the entire span ([,], ) is inside the - // path. - GBool testSpan(int x0, int x1, int y); - - // Returns the next span inside the path at . If is - // different than the previous call to getNextSpan, this returns the - // first span at ; otherwise it returns the next span (relative - // to the previous call to getNextSpan). Returns false if there are - // no more spans at . - GBool getNextSpan(int y, int *x0, int *x1); - - // Renders one anti-aliased line into . Returns the min and - // max x coordinates with non-zero pixels in and . - void renderAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); - - // Clips an anti-aliased line by setting pixels to zero. On entry, - // all non-zero pixels are between and . This function - // will update and . - void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); - -private: - - void computeIntersections(int y); - - SplashXPath *xPath; - GBool eo; - int xMin, yMin, xMax, yMax; - - int interY; // current y value - int interIdx; // current index into - used by - // getNextSpan - int interCount; // current EO/NZWN counter - used by - // getNextSpan - int xPathIdx; // current index into - used by - // computeIntersections - SplashIntersect *inter; // intersections array for - int interLen; // number of intersections in - int interSize; // size of the array -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream-CCITT.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream-CCITT.h deleted file mode 100644 index c4458fe71..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream-CCITT.h +++ /dev/null @@ -1,459 +0,0 @@ -//======================================================================== -// -// Stream-CCITT.h -// -// Tables for CCITT Fax decoding. -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -struct CCITTCode { - short bits; - short n; -}; - -#define ccittEOL -2 - -//------------------------------------------------------------------------ -// 2D codes -//------------------------------------------------------------------------ - -#define twoDimPass 0 -#define twoDimHoriz 1 -#define twoDimVert0 2 -#define twoDimVertR1 3 -#define twoDimVertL1 4 -#define twoDimVertR2 5 -#define twoDimVertL2 6 -#define twoDimVertR3 7 -#define twoDimVertL3 8 - -// 1-7 bit codes -static CCITTCode twoDimTab1[128] = { - {-1, -1}, {-1, -1}, // 000000x - {7, twoDimVertL3}, // 0000010 - {7, twoDimVertR3}, // 0000011 - {6, twoDimVertL2}, {6, twoDimVertL2}, // 000010x - {6, twoDimVertR2}, {6, twoDimVertR2}, // 000011x - {4, twoDimPass}, {4, twoDimPass}, // 0001xxx - {4, twoDimPass}, {4, twoDimPass}, - {4, twoDimPass}, {4, twoDimPass}, - {4, twoDimPass}, {4, twoDimPass}, - {3, twoDimHoriz}, {3, twoDimHoriz}, // 001xxxx - {3, twoDimHoriz}, {3, twoDimHoriz}, - {3, twoDimHoriz}, {3, twoDimHoriz}, - {3, twoDimHoriz}, {3, twoDimHoriz}, - {3, twoDimHoriz}, {3, twoDimHoriz}, - {3, twoDimHoriz}, {3, twoDimHoriz}, - {3, twoDimHoriz}, {3, twoDimHoriz}, - {3, twoDimHoriz}, {3, twoDimHoriz}, - {3, twoDimVertL1}, {3, twoDimVertL1}, // 010xxxx - {3, twoDimVertL1}, {3, twoDimVertL1}, - {3, twoDimVertL1}, {3, twoDimVertL1}, - {3, twoDimVertL1}, {3, twoDimVertL1}, - {3, twoDimVertL1}, {3, twoDimVertL1}, - {3, twoDimVertL1}, {3, twoDimVertL1}, - {3, twoDimVertL1}, {3, twoDimVertL1}, - {3, twoDimVertL1}, {3, twoDimVertL1}, - {3, twoDimVertR1}, {3, twoDimVertR1}, // 011xxxx - {3, twoDimVertR1}, {3, twoDimVertR1}, - {3, twoDimVertR1}, {3, twoDimVertR1}, - {3, twoDimVertR1}, {3, twoDimVertR1}, - {3, twoDimVertR1}, {3, twoDimVertR1}, - {3, twoDimVertR1}, {3, twoDimVertR1}, - {3, twoDimVertR1}, {3, twoDimVertR1}, - {3, twoDimVertR1}, {3, twoDimVertR1}, - {1, twoDimVert0}, {1, twoDimVert0}, // 1xxxxxx - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0}, - {1, twoDimVert0}, {1, twoDimVert0} -}; - -//------------------------------------------------------------------------ -// white run lengths -//------------------------------------------------------------------------ - -// 11-12 bit codes (upper 7 bits are 0) -static CCITTCode whiteTab1[32] = { - {-1, -1}, // 00000 - {12, ccittEOL}, // 00001 - {-1, -1}, {-1, -1}, // 0001x - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 001xx - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 010xx - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 011xx - {11, 1792}, {11, 1792}, // 1000x - {12, 1984}, // 10010 - {12, 2048}, // 10011 - {12, 2112}, // 10100 - {12, 2176}, // 10101 - {12, 2240}, // 10110 - {12, 2304}, // 10111 - {11, 1856}, {11, 1856}, // 1100x - {11, 1920}, {11, 1920}, // 1101x - {12, 2368}, // 11100 - {12, 2432}, // 11101 - {12, 2496}, // 11110 - {12, 2560} // 11111 -}; - -// 1-9 bit codes -static CCITTCode whiteTab2[512] = { - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000000xx - {8, 29}, {8, 29}, // 00000010x - {8, 30}, {8, 30}, // 00000011x - {8, 45}, {8, 45}, // 00000100x - {8, 46}, {8, 46}, // 00000101x - {7, 22}, {7, 22}, {7, 22}, {7, 22}, // 0000011xx - {7, 23}, {7, 23}, {7, 23}, {7, 23}, // 0000100xx - {8, 47}, {8, 47}, // 00001010x - {8, 48}, {8, 48}, // 00001011x - {6, 13}, {6, 13}, {6, 13}, {6, 13}, // 000011xxx - {6, 13}, {6, 13}, {6, 13}, {6, 13}, - {7, 20}, {7, 20}, {7, 20}, {7, 20}, // 0001000xx - {8, 33}, {8, 33}, // 00010010x - {8, 34}, {8, 34}, // 00010011x - {8, 35}, {8, 35}, // 00010100x - {8, 36}, {8, 36}, // 00010101x - {8, 37}, {8, 37}, // 00010110x - {8, 38}, {8, 38}, // 00010111x - {7, 19}, {7, 19}, {7, 19}, {7, 19}, // 0001100xx - {8, 31}, {8, 31}, // 00011010x - {8, 32}, {8, 32}, // 00011011x - {6, 1}, {6, 1}, {6, 1}, {6, 1}, // 000111xxx - {6, 1}, {6, 1}, {6, 1}, {6, 1}, - {6, 12}, {6, 12}, {6, 12}, {6, 12}, // 001000xxx - {6, 12}, {6, 12}, {6, 12}, {6, 12}, - {8, 53}, {8, 53}, // 00100100x - {8, 54}, {8, 54}, // 00100101x - {7, 26}, {7, 26}, {7, 26}, {7, 26}, // 0010011xx - {8, 39}, {8, 39}, // 00101000x - {8, 40}, {8, 40}, // 00101001x - {8, 41}, {8, 41}, // 00101010x - {8, 42}, {8, 42}, // 00101011x - {8, 43}, {8, 43}, // 00101100x - {8, 44}, {8, 44}, // 00101101x - {7, 21}, {7, 21}, {7, 21}, {7, 21}, // 0010111xx - {7, 28}, {7, 28}, {7, 28}, {7, 28}, // 0011000xx - {8, 61}, {8, 61}, // 00110010x - {8, 62}, {8, 62}, // 00110011x - {8, 63}, {8, 63}, // 00110100x - {8, 0}, {8, 0}, // 00110101x - {8, 320}, {8, 320}, // 00110110x - {8, 384}, {8, 384}, // 00110111x - {5, 10}, {5, 10}, {5, 10}, {5, 10}, // 00111xxxx - {5, 10}, {5, 10}, {5, 10}, {5, 10}, - {5, 10}, {5, 10}, {5, 10}, {5, 10}, - {5, 10}, {5, 10}, {5, 10}, {5, 10}, - {5, 11}, {5, 11}, {5, 11}, {5, 11}, // 01000xxxx - {5, 11}, {5, 11}, {5, 11}, {5, 11}, - {5, 11}, {5, 11}, {5, 11}, {5, 11}, - {5, 11}, {5, 11}, {5, 11}, {5, 11}, - {7, 27}, {7, 27}, {7, 27}, {7, 27}, // 0100100xx - {8, 59}, {8, 59}, // 01001010x - {8, 60}, {8, 60}, // 01001011x - {9, 1472}, // 010011000 - {9, 1536}, // 010011001 - {9, 1600}, // 010011010 - {9, 1728}, // 010011011 - {7, 18}, {7, 18}, {7, 18}, {7, 18}, // 0100111xx - {7, 24}, {7, 24}, {7, 24}, {7, 24}, // 0101000xx - {8, 49}, {8, 49}, // 01010010x - {8, 50}, {8, 50}, // 01010011x - {8, 51}, {8, 51}, // 01010100x - {8, 52}, {8, 52}, // 01010101x - {7, 25}, {7, 25}, {7, 25}, {7, 25}, // 0101011xx - {8, 55}, {8, 55}, // 01011000x - {8, 56}, {8, 56}, // 01011001x - {8, 57}, {8, 57}, // 01011010x - {8, 58}, {8, 58}, // 01011011x - {6, 192}, {6, 192}, {6, 192}, {6, 192}, // 010111xxx - {6, 192}, {6, 192}, {6, 192}, {6, 192}, - {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664}, // 011000xxx - {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664}, - {8, 448}, {8, 448}, // 01100100x - {8, 512}, {8, 512}, // 01100101x - {9, 704}, // 011001100 - {9, 768}, // 011001101 - {8, 640}, {8, 640}, // 01100111x - {8, 576}, {8, 576}, // 01101000x - {9, 832}, // 011010010 - {9, 896}, // 011010011 - {9, 960}, // 011010100 - {9, 1024}, // 011010101 - {9, 1088}, // 011010110 - {9, 1152}, // 011010111 - {9, 1216}, // 011011000 - {9, 1280}, // 011011001 - {9, 1344}, // 011011010 - {9, 1408}, // 011011011 - {7, 256}, {7, 256}, {7, 256}, {7, 256}, // 0110111xx - {4, 2}, {4, 2}, {4, 2}, {4, 2}, // 0111xxxxx - {4, 2}, {4, 2}, {4, 2}, {4, 2}, - {4, 2}, {4, 2}, {4, 2}, {4, 2}, - {4, 2}, {4, 2}, {4, 2}, {4, 2}, - {4, 2}, {4, 2}, {4, 2}, {4, 2}, - {4, 2}, {4, 2}, {4, 2}, {4, 2}, - {4, 2}, {4, 2}, {4, 2}, {4, 2}, - {4, 2}, {4, 2}, {4, 2}, {4, 2}, - {4, 3}, {4, 3}, {4, 3}, {4, 3}, // 1000xxxxx - {4, 3}, {4, 3}, {4, 3}, {4, 3}, - {4, 3}, {4, 3}, {4, 3}, {4, 3}, - {4, 3}, {4, 3}, {4, 3}, {4, 3}, - {4, 3}, {4, 3}, {4, 3}, {4, 3}, - {4, 3}, {4, 3}, {4, 3}, {4, 3}, - {4, 3}, {4, 3}, {4, 3}, {4, 3}, - {4, 3}, {4, 3}, {4, 3}, {4, 3}, - {5, 128}, {5, 128}, {5, 128}, {5, 128}, // 10010xxxx - {5, 128}, {5, 128}, {5, 128}, {5, 128}, - {5, 128}, {5, 128}, {5, 128}, {5, 128}, - {5, 128}, {5, 128}, {5, 128}, {5, 128}, - {5, 8}, {5, 8}, {5, 8}, {5, 8}, // 10011xxxx - {5, 8}, {5, 8}, {5, 8}, {5, 8}, - {5, 8}, {5, 8}, {5, 8}, {5, 8}, - {5, 8}, {5, 8}, {5, 8}, {5, 8}, - {5, 9}, {5, 9}, {5, 9}, {5, 9}, // 10100xxxx - {5, 9}, {5, 9}, {5, 9}, {5, 9}, - {5, 9}, {5, 9}, {5, 9}, {5, 9}, - {5, 9}, {5, 9}, {5, 9}, {5, 9}, - {6, 16}, {6, 16}, {6, 16}, {6, 16}, // 101010xxx - {6, 16}, {6, 16}, {6, 16}, {6, 16}, - {6, 17}, {6, 17}, {6, 17}, {6, 17}, // 101011xxx - {6, 17}, {6, 17}, {6, 17}, {6, 17}, - {4, 4}, {4, 4}, {4, 4}, {4, 4}, // 1011xxxxx - {4, 4}, {4, 4}, {4, 4}, {4, 4}, - {4, 4}, {4, 4}, {4, 4}, {4, 4}, - {4, 4}, {4, 4}, {4, 4}, {4, 4}, - {4, 4}, {4, 4}, {4, 4}, {4, 4}, - {4, 4}, {4, 4}, {4, 4}, {4, 4}, - {4, 4}, {4, 4}, {4, 4}, {4, 4}, - {4, 4}, {4, 4}, {4, 4}, {4, 4}, - {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 1100xxxxx - {4, 5}, {4, 5}, {4, 5}, {4, 5}, - {4, 5}, {4, 5}, {4, 5}, {4, 5}, - {4, 5}, {4, 5}, {4, 5}, {4, 5}, - {4, 5}, {4, 5}, {4, 5}, {4, 5}, - {4, 5}, {4, 5}, {4, 5}, {4, 5}, - {4, 5}, {4, 5}, {4, 5}, {4, 5}, - {4, 5}, {4, 5}, {4, 5}, {4, 5}, - {6, 14}, {6, 14}, {6, 14}, {6, 14}, // 110100xxx - {6, 14}, {6, 14}, {6, 14}, {6, 14}, - {6, 15}, {6, 15}, {6, 15}, {6, 15}, // 110101xxx - {6, 15}, {6, 15}, {6, 15}, {6, 15}, - {5, 64}, {5, 64}, {5, 64}, {5, 64}, // 11011xxxx - {5, 64}, {5, 64}, {5, 64}, {5, 64}, - {5, 64}, {5, 64}, {5, 64}, {5, 64}, - {5, 64}, {5, 64}, {5, 64}, {5, 64}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 1110xxxxx - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 6}, {4, 6}, {4, 6}, {4, 6}, - {4, 7}, {4, 7}, {4, 7}, {4, 7}, // 1111xxxxx - {4, 7}, {4, 7}, {4, 7}, {4, 7}, - {4, 7}, {4, 7}, {4, 7}, {4, 7}, - {4, 7}, {4, 7}, {4, 7}, {4, 7}, - {4, 7}, {4, 7}, {4, 7}, {4, 7}, - {4, 7}, {4, 7}, {4, 7}, {4, 7}, - {4, 7}, {4, 7}, {4, 7}, {4, 7}, - {4, 7}, {4, 7}, {4, 7}, {4, 7} -}; - -//------------------------------------------------------------------------ -// black run lengths -//------------------------------------------------------------------------ - -// 10-13 bit codes (upper 6 bits are 0) -static CCITTCode blackTab1[128] = { - {-1, -1}, {-1, -1}, // 000000000000x - {12, ccittEOL}, {12, ccittEOL}, // 000000000001x - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000001xx - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000010xx - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000011xx - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000100xx - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000101xx - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000110xx - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000111xx - {11, 1792}, {11, 1792}, {11, 1792}, {11, 1792}, // 00000001000xx - {12, 1984}, {12, 1984}, // 000000010010x - {12, 2048}, {12, 2048}, // 000000010011x - {12, 2112}, {12, 2112}, // 000000010100x - {12, 2176}, {12, 2176}, // 000000010101x - {12, 2240}, {12, 2240}, // 000000010110x - {12, 2304}, {12, 2304}, // 000000010111x - {11, 1856}, {11, 1856}, {11, 1856}, {11, 1856}, // 00000001100xx - {11, 1920}, {11, 1920}, {11, 1920}, {11, 1920}, // 00000001101xx - {12, 2368}, {12, 2368}, // 000000011100x - {12, 2432}, {12, 2432}, // 000000011101x - {12, 2496}, {12, 2496}, // 000000011110x - {12, 2560}, {12, 2560}, // 000000011111x - {10, 18}, {10, 18}, {10, 18}, {10, 18}, // 0000001000xxx - {10, 18}, {10, 18}, {10, 18}, {10, 18}, - {12, 52}, {12, 52}, // 000000100100x - {13, 640}, // 0000001001010 - {13, 704}, // 0000001001011 - {13, 768}, // 0000001001100 - {13, 832}, // 0000001001101 - {12, 55}, {12, 55}, // 000000100111x - {12, 56}, {12, 56}, // 000000101000x - {13, 1280}, // 0000001010010 - {13, 1344}, // 0000001010011 - {13, 1408}, // 0000001010100 - {13, 1472}, // 0000001010101 - {12, 59}, {12, 59}, // 000000101011x - {12, 60}, {12, 60}, // 000000101100x - {13, 1536}, // 0000001011010 - {13, 1600}, // 0000001011011 - {11, 24}, {11, 24}, {11, 24}, {11, 24}, // 00000010111xx - {11, 25}, {11, 25}, {11, 25}, {11, 25}, // 00000011000xx - {13, 1664}, // 0000001100100 - {13, 1728}, // 0000001100101 - {12, 320}, {12, 320}, // 000000110011x - {12, 384}, {12, 384}, // 000000110100x - {12, 448}, {12, 448}, // 000000110101x - {13, 512}, // 0000001101100 - {13, 576}, // 0000001101101 - {12, 53}, {12, 53}, // 000000110111x - {12, 54}, {12, 54}, // 000000111000x - {13, 896}, // 0000001110010 - {13, 960}, // 0000001110011 - {13, 1024}, // 0000001110100 - {13, 1088}, // 0000001110101 - {13, 1152}, // 0000001110110 - {13, 1216}, // 0000001110111 - {10, 64}, {10, 64}, {10, 64}, {10, 64}, // 0000001111xxx - {10, 64}, {10, 64}, {10, 64}, {10, 64} -}; - -// 7-12 bit codes (upper 4 bits are 0) -static CCITTCode blackTab2[192] = { - {8, 13}, {8, 13}, {8, 13}, {8, 13}, // 00000100xxxx - {8, 13}, {8, 13}, {8, 13}, {8, 13}, - {8, 13}, {8, 13}, {8, 13}, {8, 13}, - {8, 13}, {8, 13}, {8, 13}, {8, 13}, - {11, 23}, {11, 23}, // 00000101000x - {12, 50}, // 000001010010 - {12, 51}, // 000001010011 - {12, 44}, // 000001010100 - {12, 45}, // 000001010101 - {12, 46}, // 000001010110 - {12, 47}, // 000001010111 - {12, 57}, // 000001011000 - {12, 58}, // 000001011001 - {12, 61}, // 000001011010 - {12, 256}, // 000001011011 - {10, 16}, {10, 16}, {10, 16}, {10, 16}, // 0000010111xx - {10, 17}, {10, 17}, {10, 17}, {10, 17}, // 0000011000xx - {12, 48}, // 000001100100 - {12, 49}, // 000001100101 - {12, 62}, // 000001100110 - {12, 63}, // 000001100111 - {12, 30}, // 000001101000 - {12, 31}, // 000001101001 - {12, 32}, // 000001101010 - {12, 33}, // 000001101011 - {12, 40}, // 000001101100 - {12, 41}, // 000001101101 - {11, 22}, {11, 22}, // 00000110111x - {8, 14}, {8, 14}, {8, 14}, {8, 14}, // 00000111xxxx - {8, 14}, {8, 14}, {8, 14}, {8, 14}, - {8, 14}, {8, 14}, {8, 14}, {8, 14}, - {8, 14}, {8, 14}, {8, 14}, {8, 14}, - {7, 10}, {7, 10}, {7, 10}, {7, 10}, // 0000100xxxxx - {7, 10}, {7, 10}, {7, 10}, {7, 10}, - {7, 10}, {7, 10}, {7, 10}, {7, 10}, - {7, 10}, {7, 10}, {7, 10}, {7, 10}, - {7, 10}, {7, 10}, {7, 10}, {7, 10}, - {7, 10}, {7, 10}, {7, 10}, {7, 10}, - {7, 10}, {7, 10}, {7, 10}, {7, 10}, - {7, 10}, {7, 10}, {7, 10}, {7, 10}, - {7, 11}, {7, 11}, {7, 11}, {7, 11}, // 0000101xxxxx - {7, 11}, {7, 11}, {7, 11}, {7, 11}, - {7, 11}, {7, 11}, {7, 11}, {7, 11}, - {7, 11}, {7, 11}, {7, 11}, {7, 11}, - {7, 11}, {7, 11}, {7, 11}, {7, 11}, - {7, 11}, {7, 11}, {7, 11}, {7, 11}, - {7, 11}, {7, 11}, {7, 11}, {7, 11}, - {7, 11}, {7, 11}, {7, 11}, {7, 11}, - {9, 15}, {9, 15}, {9, 15}, {9, 15}, // 000011000xxx - {9, 15}, {9, 15}, {9, 15}, {9, 15}, - {12, 128}, // 000011001000 - {12, 192}, // 000011001001 - {12, 26}, // 000011001010 - {12, 27}, // 000011001011 - {12, 28}, // 000011001100 - {12, 29}, // 000011001101 - {11, 19}, {11, 19}, // 00001100111x - {11, 20}, {11, 20}, // 00001101000x - {12, 34}, // 000011010010 - {12, 35}, // 000011010011 - {12, 36}, // 000011010100 - {12, 37}, // 000011010101 - {12, 38}, // 000011010110 - {12, 39}, // 000011010111 - {11, 21}, {11, 21}, // 00001101100x - {12, 42}, // 000011011010 - {12, 43}, // 000011011011 - {10, 0}, {10, 0}, {10, 0}, {10, 0}, // 0000110111xx - {7, 12}, {7, 12}, {7, 12}, {7, 12}, // 0000111xxxxx - {7, 12}, {7, 12}, {7, 12}, {7, 12}, - {7, 12}, {7, 12}, {7, 12}, {7, 12}, - {7, 12}, {7, 12}, {7, 12}, {7, 12}, - {7, 12}, {7, 12}, {7, 12}, {7, 12}, - {7, 12}, {7, 12}, {7, 12}, {7, 12}, - {7, 12}, {7, 12}, {7, 12}, {7, 12}, - {7, 12}, {7, 12}, {7, 12}, {7, 12} -}; - -// 2-6 bit codes -static CCITTCode blackTab3[64] = { - {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000xx - {6, 9}, // 000100 - {6, 8}, // 000101 - {5, 7}, {5, 7}, // 00011x - {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 0010xx - {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 0011xx - {3, 1}, {3, 1}, {3, 1}, {3, 1}, // 010xxx - {3, 1}, {3, 1}, {3, 1}, {3, 1}, - {3, 4}, {3, 4}, {3, 4}, {3, 4}, // 011xxx - {3, 4}, {3, 4}, {3, 4}, {3, 4}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, // 10xxxx - {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 3}, {2, 3}, {2, 3}, {2, 3}, - {2, 2}, {2, 2}, {2, 2}, {2, 2}, // 11xxxx - {2, 2}, {2, 2}, {2, 2}, {2, 2}, - {2, 2}, {2, 2}, {2, 2}, {2, 2}, - {2, 2}, {2, 2}, {2, 2}, {2, 2} -}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.cc deleted file mode 100644 index 567c10219..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.cc +++ /dev/null @@ -1,4703 +0,0 @@ -//======================================================================== -// -// Stream.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#ifndef WIN32 -#include -#else -extern "C" int unlink(char *filename); -#endif -#include -#include -#include "gmem.h" -#include "gfile.h" -#include "config.h" -#include "Error.h" -#include "Object.h" -#include "Lexer.h" -#include "GfxState.h" -#include "Stream.h" -#include "JBIG2Stream.h" -#include "JPXStream.h" -#include "Stream-CCITT.h" - -#ifdef __DJGPP__ -static GBool setDJSYSFLAGS = gFalse; -#endif - -#ifdef VMS -#ifdef __GNUC__ -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 -#endif -#endif - -//------------------------------------------------------------------------ -// Stream (base class) -//------------------------------------------------------------------------ - -Stream::Stream() { - ref = 1; -} - -Stream::~Stream() { -} - -void Stream::close() { -} - -int Stream::getRawChar() { - error(-1, "Internal: called getRawChar() on non-predictor stream"); - return EOF; -} - -char *Stream::getLine(char *buf, int size) { - int i; - int c; - - if (lookChar() == EOF) - return NULL; - for (i = 0; i < size - 1; ++i) { - c = getChar(); - if (c == EOF || c == '\n') - break; - if (c == '\r') { - if ((c = lookChar()) == '\n') - getChar(); - break; - } - buf[i] = c; - } - buf[i] = '\0'; - return buf; -} - -GString *Stream::getPSFilter(int psLevel, char *indent) { - return new GString(); -} - -Stream *Stream::addFilters(Object *dict) { - Object obj, obj2; - Object params, params2; - Stream *str; - int i; - - str = this; - dict->dictLookup("Filter", &obj); - if (obj.isNull()) { - obj.free(); - dict->dictLookup("F", &obj); - } - dict->dictLookup("DecodeParms", ¶ms); - if (params.isNull()) { - params.free(); - dict->dictLookup("DP", ¶ms); - } - if (obj.isName()) { - str = makeFilter(obj.getName(), str, ¶ms); - } else if (obj.isArray()) { - for (i = 0; i < obj.arrayGetLength(); ++i) { - obj.arrayGet(i, &obj2); - if (params.isArray()) - params.arrayGet(i, ¶ms2); - else - params2.initNull(); - if (obj2.isName()) { - str = makeFilter(obj2.getName(), str, ¶ms2); - } else { - error(getPos(), "Bad filter name"); - str = new EOFStream(str); - } - obj2.free(); - params2.free(); - } - } else if (!obj.isNull()) { - error(getPos(), "Bad 'Filter' attribute in stream"); - } - obj.free(); - params.free(); - - return str; -} - -Stream *Stream::makeFilter(char *name, Stream *str, Object *params) { - int pred; // parameters - int colors; - int bits; - int early; - int encoding; - GBool endOfLine, byteAlign, endOfBlock, black; - int columns, rows; - int colorXform; - Object globals, obj; - - if (!strcmp(name, "ASCIIHexDecode") || !strcmp(name, "AHx")) { - str = new ASCIIHexStream(str); - } else if (!strcmp(name, "ASCII85Decode") || !strcmp(name, "A85")) { - str = new ASCII85Stream(str); - } else if (!strcmp(name, "LZWDecode") || !strcmp(name, "LZW")) { - pred = 1; - columns = 1; - colors = 1; - bits = 8; - early = 1; - if (params->isDict()) { - params->dictLookup("Predictor", &obj); - if (obj.isInt()) - pred = obj.getInt(); - obj.free(); - params->dictLookup("Columns", &obj); - if (obj.isInt()) - columns = obj.getInt(); - obj.free(); - params->dictLookup("Colors", &obj); - if (obj.isInt()) - colors = obj.getInt(); - obj.free(); - params->dictLookup("BitsPerComponent", &obj); - if (obj.isInt()) - bits = obj.getInt(); - obj.free(); - params->dictLookup("EarlyChange", &obj); - if (obj.isInt()) - early = obj.getInt(); - obj.free(); - } - str = new LZWStream(str, pred, columns, colors, bits, early); - } else if (!strcmp(name, "RunLengthDecode") || !strcmp(name, "RL")) { - str = new RunLengthStream(str); - } else if (!strcmp(name, "CCITTFaxDecode") || !strcmp(name, "CCF")) { - encoding = 0; - endOfLine = gFalse; - byteAlign = gFalse; - columns = 1728; - rows = 0; - endOfBlock = gTrue; - black = gFalse; - if (params->isDict()) { - params->dictLookup("K", &obj); - if (obj.isInt()) { - encoding = obj.getInt(); - } - obj.free(); - params->dictLookup("EndOfLine", &obj); - if (obj.isBool()) { - endOfLine = obj.getBool(); - } - obj.free(); - params->dictLookup("EncodedByteAlign", &obj); - if (obj.isBool()) { - byteAlign = obj.getBool(); - } - obj.free(); - params->dictLookup("Columns", &obj); - if (obj.isInt()) { - columns = obj.getInt(); - } - obj.free(); - params->dictLookup("Rows", &obj); - if (obj.isInt()) { - rows = obj.getInt(); - } - obj.free(); - params->dictLookup("EndOfBlock", &obj); - if (obj.isBool()) { - endOfBlock = obj.getBool(); - } - obj.free(); - params->dictLookup("BlackIs1", &obj); - if (obj.isBool()) { - black = obj.getBool(); - } - obj.free(); - } - str = new CCITTFaxStream(str, encoding, endOfLine, byteAlign, - columns, rows, endOfBlock, black); - } else if (!strcmp(name, "DCTDecode") || !strcmp(name, "DCT")) { - colorXform = -1; - if (params->isDict()) { - if (params->dictLookup("ColorTransform", &obj)->isInt()) { - colorXform = obj.getInt(); - } - obj.free(); - } - str = new DCTStream(str, colorXform); - } else if (!strcmp(name, "FlateDecode") || !strcmp(name, "Fl")) { - pred = 1; - columns = 1; - colors = 1; - bits = 8; - if (params->isDict()) { - params->dictLookup("Predictor", &obj); - if (obj.isInt()) - pred = obj.getInt(); - obj.free(); - params->dictLookup("Columns", &obj); - if (obj.isInt()) - columns = obj.getInt(); - obj.free(); - params->dictLookup("Colors", &obj); - if (obj.isInt()) - colors = obj.getInt(); - obj.free(); - params->dictLookup("BitsPerComponent", &obj); - if (obj.isInt()) - bits = obj.getInt(); - obj.free(); - } - str = new FlateStream(str, pred, columns, colors, bits); - } else if (!strcmp(name, "JBIG2Decode")) { - if (params->isDict()) { - params->dictLookup("JBIG2Globals", &globals); - } - str = new JBIG2Stream(str, &globals); - globals.free(); - } else if (!strcmp(name, "JPXDecode")) { - str = new JPXStream(str); - } else { - error(getPos(), "Unknown filter '%s'", name); - str = new EOFStream(str); - } - return str; -} - -//------------------------------------------------------------------------ -// BaseStream -//------------------------------------------------------------------------ - -BaseStream::BaseStream(Object *dictA) { - dict = *dictA; -} - -BaseStream::~BaseStream() { - dict.free(); -} - -//------------------------------------------------------------------------ -// FilterStream -//------------------------------------------------------------------------ - -FilterStream::FilterStream(Stream *strA) { - str = strA; -} - -FilterStream::~FilterStream() { -} - -void FilterStream::close() { - str->close(); -} - -void FilterStream::setPos(Guint pos, int dir) { - error(-1, "Internal: called setPos() on FilterStream"); -} - -//------------------------------------------------------------------------ -// ImageStream -//------------------------------------------------------------------------ - -ImageStream::ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA) { - int imgLineSize; - - str = strA; - width = widthA; - nComps = nCompsA; - nBits = nBitsA; - - nVals = width * nComps; - if (nBits == 1) { - imgLineSize = (nVals + 7) & ~7; - } else { - imgLineSize = nVals; - } - imgLine = (Guchar *)gmallocn(imgLineSize, sizeof(Guchar)); - imgIdx = nVals; -} - -ImageStream::~ImageStream() { - gfree(imgLine); -} - -void ImageStream::reset() { - str->reset(); -} - -GBool ImageStream::getPixel(Guchar *pix) { - int i; - - if (imgIdx >= nVals) { - getLine(); - imgIdx = 0; - } - for (i = 0; i < nComps; ++i) { - pix[i] = imgLine[imgIdx++]; - } - return gTrue; -} - -Guchar *ImageStream::getLine() { - Gulong buf, bitMask; - int bits; - int c; - int i; - - if (nBits == 1) { - for (i = 0; i < nVals; i += 8) { - c = str->getChar(); - imgLine[i+0] = (Guchar)((c >> 7) & 1); - imgLine[i+1] = (Guchar)((c >> 6) & 1); - imgLine[i+2] = (Guchar)((c >> 5) & 1); - imgLine[i+3] = (Guchar)((c >> 4) & 1); - imgLine[i+4] = (Guchar)((c >> 3) & 1); - imgLine[i+5] = (Guchar)((c >> 2) & 1); - imgLine[i+6] = (Guchar)((c >> 1) & 1); - imgLine[i+7] = (Guchar)(c & 1); - } - } else if (nBits == 8) { - for (i = 0; i < nVals; ++i) { - imgLine[i] = str->getChar(); - } - } else { - bitMask = (1 << nBits) - 1; - buf = 0; - bits = 0; - for (i = 0; i < nVals; ++i) { - if (bits < nBits) { - buf = (buf << 8) | (str->getChar() & 0xff); - bits += 8; - } - imgLine[i] = (Guchar)((buf >> (bits - nBits)) & bitMask); - bits -= nBits; - } - } - return imgLine; -} - -void ImageStream::skipLine() { - int n, i; - - n = (nVals * nBits + 7) >> 3; - for (i = 0; i < n; ++i) { - str->getChar(); - } -} - -//------------------------------------------------------------------------ -// StreamPredictor -//------------------------------------------------------------------------ - -StreamPredictor::StreamPredictor(Stream *strA, int predictorA, - int widthA, int nCompsA, int nBitsA) { - str = strA; - predictor = predictorA; - width = widthA; - nComps = nCompsA; - nBits = nBitsA; - predLine = NULL; - ok = gFalse; - - nVals = width * nComps; - pixBytes = (nComps * nBits + 7) >> 3; - rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes; - if (width <= 0 || nComps <= 0 || nBits <= 0 || - nComps > gfxColorMaxComps || - nBits > 16 || - width >= INT_MAX / nComps || // check for overflow in nVals - nVals >= (INT_MAX - 7) / nBits) { // check for overflow in rowBytes - return; - } - predLine = (Guchar *)gmalloc(rowBytes); - memset(predLine, 0, rowBytes); - predIdx = rowBytes; - - ok = gTrue; -} - -StreamPredictor::~StreamPredictor() { - gfree(predLine); -} - -int StreamPredictor::lookChar() { - if (predIdx >= rowBytes) { - if (!getNextLine()) { - return EOF; - } - } - return predLine[predIdx]; -} - -int StreamPredictor::getChar() { - if (predIdx >= rowBytes) { - if (!getNextLine()) { - return EOF; - } - } - return predLine[predIdx++]; -} - -GBool StreamPredictor::getNextLine() { - int curPred; - Guchar upLeftBuf[gfxColorMaxComps * 2 + 1]; - int left, up, upLeft, p, pa, pb, pc; - int c; - Gulong inBuf, outBuf, bitMask; - int inBits, outBits; - int i, j, k, kk; - - // get PNG optimum predictor number - if (predictor >= 10) { - if ((curPred = str->getRawChar()) == EOF) { - return gFalse; - } - curPred += 10; - } else { - curPred = predictor; - } - - // read the raw line, apply PNG (byte) predictor - memset(upLeftBuf, 0, pixBytes + 1); - for (i = pixBytes; i < rowBytes; ++i) { - for (j = pixBytes; j > 0; --j) { - upLeftBuf[j] = upLeftBuf[j-1]; - } - upLeftBuf[0] = predLine[i]; - if ((c = str->getRawChar()) == EOF) { - if (i > pixBytes) { - // this ought to return false, but some (broken) PDF files - // contain truncated image data, and Adobe apparently reads the - // last partial line - break; - } - return gFalse; - } - switch (curPred) { - case 11: // PNG sub - predLine[i] = predLine[i - pixBytes] + (Guchar)c; - break; - case 12: // PNG up - predLine[i] = predLine[i] + (Guchar)c; - break; - case 13: // PNG average - predLine[i] = ((predLine[i - pixBytes] + predLine[i]) >> 1) + - (Guchar)c; - break; - case 14: // PNG Paeth - left = predLine[i - pixBytes]; - up = predLine[i]; - upLeft = upLeftBuf[pixBytes]; - p = left + up - upLeft; - if ((pa = p - left) < 0) - pa = -pa; - if ((pb = p - up) < 0) - pb = -pb; - if ((pc = p - upLeft) < 0) - pc = -pc; - if (pa <= pb && pa <= pc) - predLine[i] = left + (Guchar)c; - else if (pb <= pc) - predLine[i] = up + (Guchar)c; - else - predLine[i] = upLeft + (Guchar)c; - break; - case 10: // PNG none - default: // no predictor or TIFF predictor - predLine[i] = (Guchar)c; - break; - } - } - - // apply TIFF (component) predictor - if (predictor == 2) { - if (nBits == 1) { - inBuf = predLine[pixBytes - 1]; - for (i = pixBytes; i < rowBytes; i += 8) { - // 1-bit add is just xor - inBuf = (inBuf << 8) | predLine[i]; - predLine[i] ^= inBuf >> nComps; - } - } else if (nBits == 8) { - for (i = pixBytes; i < rowBytes; ++i) { - predLine[i] += predLine[i - nComps]; - } - } else { - memset(upLeftBuf, 0, nComps + 1); - bitMask = (1 << nBits) - 1; - inBuf = outBuf = 0; - inBits = outBits = 0; - j = k = pixBytes; - for (i = 0; i < width; ++i) { - for (kk = 0; kk < nComps; ++kk) { - if (inBits < nBits) { - inBuf = (inBuf << 8) | (predLine[j++] & 0xff); - inBits += 8; - } - upLeftBuf[kk] = (Guchar)((upLeftBuf[kk] + - (inBuf >> (inBits - nBits))) & bitMask); - inBits -= nBits; - outBuf = (outBuf << nBits) | upLeftBuf[kk]; - outBits += nBits; - if (outBits >= 8) { - predLine[k++] = (Guchar)(outBuf >> (outBits - 8)); - outBits -= 8; - } - } - } - if (outBits > 0) { - predLine[k++] = (Guchar)((outBuf << (8 - outBits)) + - (inBuf & ((1 << (8 - outBits)) - 1))); - } - } - } - - // reset to start of line - predIdx = pixBytes; - - return gTrue; -} - -//------------------------------------------------------------------------ -// FileStream -//------------------------------------------------------------------------ - -FileStream::FileStream(FILE *fA, Guint startA, GBool limitedA, - Guint lengthA, Object *dictA): - BaseStream(dictA) { - f = fA; - start = startA; - limited = limitedA; - length = lengthA; - bufPtr = bufEnd = buf; - bufPos = start; - savePos = 0; - saved = gFalse; -} - -FileStream::~FileStream() { - close(); -} - -Stream *FileStream::makeSubStream(Guint startA, GBool limitedA, - Guint lengthA, Object *dictA) { - return new FileStream(f, startA, limitedA, lengthA, dictA); -} - -void FileStream::reset() { -#if HAVE_FSEEKO - savePos = (Guint)ftello(f); - fseeko(f, start, SEEK_SET); -#elif HAVE_FSEEK64 - savePos = (Guint)ftell64(f); - fseek64(f, start, SEEK_SET); -#else - savePos = (Guint)ftell(f); - fseek(f, start, SEEK_SET); -#endif - saved = gTrue; - bufPtr = bufEnd = buf; - bufPos = start; -} - -void FileStream::close() { - if (saved) { -#if HAVE_FSEEKO - fseeko(f, savePos, SEEK_SET); -#elif HAVE_FSEEK64 - fseek64(f, savePos, SEEK_SET); -#else - fseek(f, savePos, SEEK_SET); -#endif - saved = gFalse; - } -} - -GBool FileStream::fillBuf() { - int n; - - bufPos += bufEnd - buf; - bufPtr = bufEnd = buf; - if (limited && bufPos >= start + length) { - return gFalse; - } - if (limited && bufPos + fileStreamBufSize > start + length) { - n = start + length - bufPos; - } else { - n = fileStreamBufSize; - } - n = fread(buf, 1, n, f); - bufEnd = buf + n; - if (bufPtr >= bufEnd) { - return gFalse; - } - return gTrue; -} - -void FileStream::setPos(Guint pos, int dir) { - Guint size; - - if (dir >= 0) { -#if HAVE_FSEEKO - fseeko(f, pos, SEEK_SET); -#elif HAVE_FSEEK64 - fseek64(f, pos, SEEK_SET); -#else - fseek(f, pos, SEEK_SET); -#endif - bufPos = pos; - } else { -#if HAVE_FSEEKO - fseeko(f, 0, SEEK_END); - size = (Guint)ftello(f); -#elif HAVE_FSEEK64 - fseek64(f, 0, SEEK_END); - size = (Guint)ftell64(f); -#else - fseek(f, 0, SEEK_END); - size = (Guint)ftell(f); -#endif - if (pos > size) - pos = (Guint)size; -#ifdef __CYGWIN32__ - //~ work around a bug in cygwin's implementation of fseek - rewind(f); -#endif -#if HAVE_FSEEKO - fseeko(f, -(int)pos, SEEK_END); - bufPos = (Guint)ftello(f); -#elif HAVE_FSEEK64 - fseek64(f, -(int)pos, SEEK_END); - bufPos = (Guint)ftell64(f); -#else - fseek(f, -(int)pos, SEEK_END); - bufPos = (Guint)ftell(f); -#endif - } - bufPtr = bufEnd = buf; -} - -void FileStream::moveStart(int delta) { - start += delta; - bufPtr = bufEnd = buf; - bufPos = start; -} - -//------------------------------------------------------------------------ -// MemStream -//------------------------------------------------------------------------ - -MemStream::MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA): - BaseStream(dictA) { - buf = bufA; - start = startA; - length = lengthA; - bufEnd = buf + start + length; - bufPtr = buf + start; - needFree = gFalse; -} - -MemStream::~MemStream() { - if (needFree) { - gfree(buf); - } -} - -Stream *MemStream::makeSubStream(Guint startA, GBool limited, - Guint lengthA, Object *dictA) { - MemStream *subStr; - Guint newLength; - - if (!limited || startA + lengthA > start + length) { - newLength = start + length - startA; - } else { - newLength = lengthA; - } - subStr = new MemStream(buf, startA, newLength, dictA); - return subStr; -} - -void MemStream::reset() { - bufPtr = buf + start; -} - -void MemStream::close() { -} - -void MemStream::setPos(Guint pos, int dir) { - Guint i; - - if (dir >= 0) { - i = pos; - } else { - i = start + length - pos; - } - if (i < start) { - i = start; - } else if (i > start + length) { - i = start + length; - } - bufPtr = buf + i; -} - -void MemStream::moveStart(int delta) { - start += delta; - length -= delta; - bufPtr = buf + start; -} - -//------------------------------------------------------------------------ -// EmbedStream -//------------------------------------------------------------------------ - -EmbedStream::EmbedStream(Stream *strA, Object *dictA, - GBool limitedA, Guint lengthA): - BaseStream(dictA) { - str = strA; - limited = limitedA; - length = lengthA; -} - -EmbedStream::~EmbedStream() { -} - -Stream *EmbedStream::makeSubStream(Guint start, GBool limitedA, - Guint lengthA, Object *dictA) { - error(-1, "Internal: called makeSubStream() on EmbedStream"); - return NULL; -} - -int EmbedStream::getChar() { - if (limited && !length) { - return EOF; - } - --length; - return str->getChar(); -} - -int EmbedStream::lookChar() { - if (limited && !length) { - return EOF; - } - return str->lookChar(); -} - -void EmbedStream::setPos(Guint pos, int dir) { - error(-1, "Internal: called setPos() on EmbedStream"); -} - -Guint EmbedStream::getStart() { - error(-1, "Internal: called getStart() on EmbedStream"); - return 0; -} - -void EmbedStream::moveStart(int delta) { - error(-1, "Internal: called moveStart() on EmbedStream"); -} - -//------------------------------------------------------------------------ -// ASCIIHexStream -//------------------------------------------------------------------------ - -ASCIIHexStream::ASCIIHexStream(Stream *strA): - FilterStream(strA) { - buf = EOF; - eof = gFalse; -} - -ASCIIHexStream::~ASCIIHexStream() { - delete str; -} - -void ASCIIHexStream::reset() { - str->reset(); - buf = EOF; - eof = gFalse; -} - -int ASCIIHexStream::lookChar() { - int c1, c2, x; - - if (buf != EOF) - return buf; - if (eof) { - buf = EOF; - return EOF; - } - do { - c1 = str->getChar(); - } while (isspace(c1)); - if (c1 == '>') { - eof = gTrue; - buf = EOF; - return buf; - } - do { - c2 = str->getChar(); - } while (isspace(c2)); - if (c2 == '>') { - eof = gTrue; - c2 = '0'; - } - if (c1 >= '0' && c1 <= '9') { - x = (c1 - '0') << 4; - } else if (c1 >= 'A' && c1 <= 'F') { - x = (c1 - 'A' + 10) << 4; - } else if (c1 >= 'a' && c1 <= 'f') { - x = (c1 - 'a' + 10) << 4; - } else if (c1 == EOF) { - eof = gTrue; - x = 0; - } else { - error(getPos(), "Illegal character <%02x> in ASCIIHex stream", c1); - x = 0; - } - if (c2 >= '0' && c2 <= '9') { - x += c2 - '0'; - } else if (c2 >= 'A' && c2 <= 'F') { - x += c2 - 'A' + 10; - } else if (c2 >= 'a' && c2 <= 'f') { - x += c2 - 'a' + 10; - } else if (c2 == EOF) { - eof = gTrue; - x = 0; - } else { - error(getPos(), "Illegal character <%02x> in ASCIIHex stream", c2); - } - buf = x & 0xff; - return buf; -} - -GString *ASCIIHexStream::getPSFilter(int psLevel, char *indent) { - GString *s; - - if (psLevel < 2) { - return NULL; - } - if (!(s = str->getPSFilter(psLevel, indent))) { - return NULL; - } - s->append(indent)->append("/ASCIIHexDecode filter\n"); - return s; -} - -GBool ASCIIHexStream::isBinary(GBool last) { - return str->isBinary(gFalse); -} - -//------------------------------------------------------------------------ -// ASCII85Stream -//------------------------------------------------------------------------ - -ASCII85Stream::ASCII85Stream(Stream *strA): - FilterStream(strA) { - index = n = 0; - eof = gFalse; -} - -ASCII85Stream::~ASCII85Stream() { - delete str; -} - -void ASCII85Stream::reset() { - str->reset(); - index = n = 0; - eof = gFalse; -} - -int ASCII85Stream::lookChar() { - int k; - Gulong t; - - if (index >= n) { - if (eof) - return EOF; - index = 0; - do { - c[0] = str->getChar(); - } while (Lexer::isSpace(c[0])); - if (c[0] == '~' || c[0] == EOF) { - eof = gTrue; - n = 0; - return EOF; - } else if (c[0] == 'z') { - b[0] = b[1] = b[2] = b[3] = 0; - n = 4; - } else { - for (k = 1; k < 5; ++k) { - do { - c[k] = str->getChar(); - } while (Lexer::isSpace(c[k])); - if (c[k] == '~' || c[k] == EOF) - break; - } - n = k - 1; - if (k < 5 && (c[k] == '~' || c[k] == EOF)) { - for (++k; k < 5; ++k) - c[k] = 0x21 + 84; - eof = gTrue; - } - t = 0; - for (k = 0; k < 5; ++k) - t = t * 85 + (c[k] - 0x21); - for (k = 3; k >= 0; --k) { - b[k] = (int)(t & 0xff); - t >>= 8; - } - } - } - return b[index]; -} - -GString *ASCII85Stream::getPSFilter(int psLevel, char *indent) { - GString *s; - - if (psLevel < 2) { - return NULL; - } - if (!(s = str->getPSFilter(psLevel, indent))) { - return NULL; - } - s->append(indent)->append("/ASCII85Decode filter\n"); - return s; -} - -GBool ASCII85Stream::isBinary(GBool last) { - return str->isBinary(gFalse); -} - -//------------------------------------------------------------------------ -// LZWStream -//------------------------------------------------------------------------ - -LZWStream::LZWStream(Stream *strA, int predictor, int columns, int colors, - int bits, int earlyA): - FilterStream(strA) { - if (predictor != 1) { - pred = new StreamPredictor(this, predictor, columns, colors, bits); - if (!pred->isOk()) { - delete pred; - pred = NULL; - } - } else { - pred = NULL; - } - early = earlyA; - eof = gFalse; - inputBits = 0; - clearTable(); -} - -LZWStream::~LZWStream() { - if (pred) { - delete pred; - } - delete str; -} - -int LZWStream::getChar() { - if (pred) { - return pred->getChar(); - } - if (eof) { - return EOF; - } - if (seqIndex >= seqLength) { - if (!processNextCode()) { - return EOF; - } - } - return seqBuf[seqIndex++]; -} - -int LZWStream::lookChar() { - if (pred) { - return pred->lookChar(); - } - if (eof) { - return EOF; - } - if (seqIndex >= seqLength) { - if (!processNextCode()) { - return EOF; - } - } - return seqBuf[seqIndex]; -} - -int LZWStream::getRawChar() { - if (eof) { - return EOF; - } - if (seqIndex >= seqLength) { - if (!processNextCode()) { - return EOF; - } - } - return seqBuf[seqIndex++]; -} - -void LZWStream::reset() { - str->reset(); - eof = gFalse; - inputBits = 0; - clearTable(); -} - -GBool LZWStream::processNextCode() { - int code; - int nextLength; - int i, j; - - // check for EOF - if (eof) { - return gFalse; - } - - // check for eod and clear-table codes - start: - code = getCode(); - if (code == EOF || code == 257) { - eof = gTrue; - return gFalse; - } - if (code == 256) { - clearTable(); - goto start; - } - if (nextCode >= 4097) { - error(getPos(), "Bad LZW stream - expected clear-table code"); - clearTable(); - } - - // process the next code - nextLength = seqLength + 1; - if (code < 256) { - seqBuf[0] = code; - seqLength = 1; - } else if (code < nextCode) { - seqLength = table[code].length; - for (i = seqLength - 1, j = code; i > 0; --i) { - seqBuf[i] = table[j].tail; - j = table[j].head; - } - seqBuf[0] = j; - } else if (code == nextCode) { - seqBuf[seqLength] = newChar; - ++seqLength; - } else { - error(getPos(), "Bad LZW stream - unexpected code"); - eof = gTrue; - return gFalse; - } - newChar = seqBuf[0]; - if (first) { - first = gFalse; - } else { - table[nextCode].length = nextLength; - table[nextCode].head = prevCode; - table[nextCode].tail = newChar; - ++nextCode; - if (nextCode + early == 512) - nextBits = 10; - else if (nextCode + early == 1024) - nextBits = 11; - else if (nextCode + early == 2048) - nextBits = 12; - } - prevCode = code; - - // reset buffer - seqIndex = 0; - - return gTrue; -} - -void LZWStream::clearTable() { - nextCode = 258; - nextBits = 9; - seqIndex = seqLength = 0; - first = gTrue; -} - -int LZWStream::getCode() { - int c; - int code; - - while (inputBits < nextBits) { - if ((c = str->getChar()) == EOF) - return EOF; - inputBuf = (inputBuf << 8) | (c & 0xff); - inputBits += 8; - } - code = (inputBuf >> (inputBits - nextBits)) & ((1 << nextBits) - 1); - inputBits -= nextBits; - return code; -} - -GString *LZWStream::getPSFilter(int psLevel, char *indent) { - GString *s; - - if (psLevel < 2 || pred) { - return NULL; - } - if (!(s = str->getPSFilter(psLevel, indent))) { - return NULL; - } - s->append(indent)->append("<< "); - if (!early) { - s->append("/EarlyChange 0 "); - } - s->append(">> /LZWDecode filter\n"); - return s; -} - -GBool LZWStream::isBinary(GBool last) { - return str->isBinary(gTrue); -} - -//------------------------------------------------------------------------ -// RunLengthStream -//------------------------------------------------------------------------ - -RunLengthStream::RunLengthStream(Stream *strA): - FilterStream(strA) { - bufPtr = bufEnd = buf; - eof = gFalse; -} - -RunLengthStream::~RunLengthStream() { - delete str; -} - -void RunLengthStream::reset() { - str->reset(); - bufPtr = bufEnd = buf; - eof = gFalse; -} - -GString *RunLengthStream::getPSFilter(int psLevel, char *indent) { - GString *s; - - if (psLevel < 2) { - return NULL; - } - if (!(s = str->getPSFilter(psLevel, indent))) { - return NULL; - } - s->append(indent)->append("/RunLengthDecode filter\n"); - return s; -} - -GBool RunLengthStream::isBinary(GBool last) { - return str->isBinary(gTrue); -} - -GBool RunLengthStream::fillBuf() { - int c; - int n, i; - - if (eof) - return gFalse; - c = str->getChar(); - if (c == 0x80 || c == EOF) { - eof = gTrue; - return gFalse; - } - if (c < 0x80) { - n = c + 1; - for (i = 0; i < n; ++i) - buf[i] = (char)str->getChar(); - } else { - n = 0x101 - c; - c = str->getChar(); - for (i = 0; i < n; ++i) - buf[i] = (char)c; - } - bufPtr = buf; - bufEnd = buf + n; - return gTrue; -} - -//------------------------------------------------------------------------ -// CCITTFaxStream -//------------------------------------------------------------------------ - -CCITTFaxStream::CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA, - GBool byteAlignA, int columnsA, int rowsA, - GBool endOfBlockA, GBool blackA): - FilterStream(strA) { - encoding = encodingA; - endOfLine = endOfLineA; - byteAlign = byteAlignA; - columns = columnsA; - if (columns < 1) { - columns = 1; - } else if (columns > INT_MAX - 2) { - columns = INT_MAX - 2; - } - rows = rowsA; - endOfBlock = endOfBlockA; - black = blackA; - // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = columns - // ---> max codingLine size = columns + 1 - // refLine has one extra guard entry at the end - // ---> max refLine size = columns + 2 - codingLine = (int *)gmallocn(columns + 1, sizeof(int)); - refLine = (int *)gmallocn(columns + 2, sizeof(int)); - - eof = gFalse; - row = 0; - nextLine2D = encoding < 0; - inputBits = 0; - codingLine[0] = columns; - a0i = 0; - outputBits = 0; - - buf = EOF; -} - -CCITTFaxStream::~CCITTFaxStream() { - delete str; - gfree(refLine); - gfree(codingLine); -} - -void CCITTFaxStream::reset() { - short code1; - - str->reset(); - eof = gFalse; - row = 0; - nextLine2D = encoding < 0; - inputBits = 0; - codingLine[0] = columns; - a0i = 0; - outputBits = 0; - buf = EOF; - - // skip any initial zero bits and end-of-line marker, and get the 2D - // encoding tag - while ((code1 = lookBits(12)) == 0) { - eatBits(1); - } - if (code1 == 0x001) { - eatBits(12); - } - if (encoding > 0) { - nextLine2D = !lookBits(1); - eatBits(1); - } -} - -inline void CCITTFaxStream::addPixels(int a1, int blackPixels) { - if (a1 > codingLine[a0i]) { - if (a1 > columns) { - error(getPos(), "CCITTFax row is wrong length (%d)", a1); - err = gTrue; - a1 = columns; - } - if ((a0i & 1) ^ blackPixels) { - ++a0i; - } - codingLine[a0i] = a1; - } -} - -inline void CCITTFaxStream::addPixelsNeg(int a1, int blackPixels) { - if (a1 > codingLine[a0i]) { - if (a1 > columns) { - error(getPos(), "CCITTFax row is wrong length (%d)", a1); - err = gTrue; - a1 = columns; - } - if ((a0i & 1) ^ blackPixels) { - ++a0i; - } - codingLine[a0i] = a1; - } else if (a1 < codingLine[a0i]) { - if (a1 < 0) { - error(getPos(), "Invalid CCITTFax code"); - err = gTrue; - a1 = 0; - } - while (a0i > 0 && a1 <= codingLine[a0i - 1]) { - --a0i; - } - codingLine[a0i] = a1; - } -} - -int CCITTFaxStream::lookChar() { - short code1, code2, code3; - int b1i, blackPixels, i, bits; - GBool gotEOL; - - if (buf != EOF) { - return buf; - } - - // read the next row - if (outputBits == 0) { - - // if at eof just return EOF - if (eof) { - return EOF; - } - - err = gFalse; - - // 2-D encoding - if (nextLine2D) { - for (i = 0; codingLine[i] < columns; ++i) { - refLine[i] = codingLine[i]; - } - refLine[i++] = columns; - refLine[i] = columns; - codingLine[0] = 0; - a0i = 0; - b1i = 0; - blackPixels = 0; - // invariant: - // refLine[b1i-1] <= codingLine[a0i] < refLine[b1i] < refLine[b1i+1] - // <= columns - // exception at left edge: - // codingLine[a0i = 0] = refLine[b1i = 0] = 0 is possible - // exception at right edge: - // refLine[b1i] = refLine[b1i+1] = columns is possible - while (codingLine[a0i] < columns) { - code1 = getTwoDimCode(); - switch (code1) { - case twoDimPass: - addPixels(refLine[b1i + 1], blackPixels); - if (refLine[b1i + 1] < columns) { - b1i += 2; - } - break; - case twoDimHoriz: - code1 = code2 = 0; - if (blackPixels) { - do { - code1 += code3 = getBlackCode(); - } while (code3 >= 64); - do { - code2 += code3 = getWhiteCode(); - } while (code3 >= 64); - } else { - do { - code1 += code3 = getWhiteCode(); - } while (code3 >= 64); - do { - code2 += code3 = getBlackCode(); - } while (code3 >= 64); - } - addPixels(codingLine[a0i] + code1, blackPixels); - if (codingLine[a0i] < columns) { - addPixels(codingLine[a0i] + code2, blackPixels ^ 1); - } - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - } - break; - case twoDimVertR3: - addPixels(refLine[b1i] + 3, blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - } - } - break; - case twoDimVertR2: - addPixels(refLine[b1i] + 2, blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - } - } - break; - case twoDimVertR1: - addPixels(refLine[b1i] + 1, blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - } - } - break; - case twoDimVert0: - addPixels(refLine[b1i], blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - } - } - break; - case twoDimVertL3: - addPixelsNeg(refLine[b1i] - 3, blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - if (b1i > 0) { - --b1i; - } else { - ++b1i; - } - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - } - } - break; - case twoDimVertL2: - addPixelsNeg(refLine[b1i] - 2, blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - if (b1i > 0) { - --b1i; - } else { - ++b1i; - } - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - } - } - break; - case twoDimVertL1: - addPixelsNeg(refLine[b1i] - 1, blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - if (b1i > 0) { - --b1i; - } else { - ++b1i; - } - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - } - } - break; - case EOF: - addPixels(columns, 0); - eof = gTrue; - break; - default: - error(getPos(), "Bad 2D code %04x in CCITTFax stream", code1); - addPixels(columns, 0); - err = gTrue; - break; - } - } - - // 1-D encoding - } else { - codingLine[0] = 0; - a0i = 0; - blackPixels = 0; - while (codingLine[a0i] < columns) { - code1 = 0; - if (blackPixels) { - do { - code1 += code3 = getBlackCode(); - } while (code3 >= 64); - } else { - do { - code1 += code3 = getWhiteCode(); - } while (code3 >= 64); - } - addPixels(codingLine[a0i] + code1, blackPixels); - blackPixels ^= 1; - } - } - - // byte-align the row - if (byteAlign) { - inputBits &= ~7; - } - - // check for end-of-line marker, skipping over any extra zero bits - gotEOL = gFalse; - if (!endOfBlock && row == rows - 1) { - eof = gTrue; - } else { - code1 = lookBits(12); - while (code1 == 0) { - eatBits(1); - code1 = lookBits(12); - } - if (code1 == 0x001) { - eatBits(12); - gotEOL = gTrue; - } else if (code1 == EOF) { - eof = gTrue; - } - } - - // get 2D encoding tag - if (!eof && encoding > 0) { - nextLine2D = !lookBits(1); - eatBits(1); - } - - // check for end-of-block marker - if (endOfBlock && gotEOL) { - code1 = lookBits(12); - if (code1 == 0x001) { - eatBits(12); - if (encoding > 0) { - lookBits(1); - eatBits(1); - } - if (encoding >= 0) { - for (i = 0; i < 4; ++i) { - code1 = lookBits(12); - if (code1 != 0x001) { - error(getPos(), "Bad RTC code in CCITTFax stream"); - } - eatBits(12); - if (encoding > 0) { - lookBits(1); - eatBits(1); - } - } - } - eof = gTrue; - } - - // look for an end-of-line marker after an error -- we only do - // this if we know the stream contains end-of-line markers because - // the "just plow on" technique tends to work better otherwise - } else if (err && endOfLine) { - while (1) { - code1 = lookBits(13); - if (code1 == EOF) { - eof = gTrue; - return EOF; - } - if ((code1 >> 1) == 0x001) { - break; - } - eatBits(1); - } - eatBits(12); - if (encoding > 0) { - eatBits(1); - nextLine2D = !(code1 & 1); - } - } - - // set up for output - if (codingLine[0] > 0) { - outputBits = codingLine[a0i = 0]; - } else { - outputBits = codingLine[a0i = 1]; - } - - ++row; - } - - // get a byte - if (outputBits >= 8) { - buf = (a0i & 1) ? 0x00 : 0xff; - outputBits -= 8; - if (outputBits == 0 && codingLine[a0i] < columns) { - ++a0i; - outputBits = codingLine[a0i] - codingLine[a0i - 1]; - } - } else { - bits = 8; - buf = 0; - do { - if (outputBits > bits) { - buf <<= bits; - if (!(a0i & 1)) { - buf |= 0xff >> (8 - bits); - } - outputBits -= bits; - bits = 0; - } else { - buf <<= outputBits; - if (!(a0i & 1)) { - buf |= 0xff >> (8 - outputBits); - } - bits -= outputBits; - outputBits = 0; - if (codingLine[a0i] < columns) { - ++a0i; - outputBits = codingLine[a0i] - codingLine[a0i - 1]; - } else if (bits > 0) { - buf <<= bits; - bits = 0; - } - } - } while (bits); - } - if (black) { - buf ^= 0xff; - } - return buf; -} - -short CCITTFaxStream::getTwoDimCode() { - short code; - CCITTCode *p; - int n; - - code = 0; // make gcc happy - if (endOfBlock) { - code = lookBits(7); - p = &twoDimTab1[code]; - if (p->bits > 0) { - eatBits(p->bits); - return p->n; - } - } else { - for (n = 1; n <= 7; ++n) { - code = lookBits(n); - if (n < 7) { - code <<= 7 - n; - } - p = &twoDimTab1[code]; - if (p->bits == n) { - eatBits(n); - return p->n; - } - } - } - error(getPos(), "Bad two dim code (%04x) in CCITTFax stream", code); - return EOF; -} - -short CCITTFaxStream::getWhiteCode() { - short code; - CCITTCode *p; - int n; - - code = 0; // make gcc happy - if (endOfBlock) { - code = lookBits(12); - if (code == EOF) { - return 1; - } - if ((code >> 5) == 0) { - p = &whiteTab1[code]; - } else { - p = &whiteTab2[code >> 3]; - } - if (p->bits > 0) { - eatBits(p->bits); - return p->n; - } - } else { - for (n = 1; n <= 9; ++n) { - code = lookBits(n); - if (code == EOF) { - return 1; - } - if (n < 9) { - code <<= 9 - n; - } - p = &whiteTab2[code]; - if (p->bits == n) { - eatBits(n); - return p->n; - } - } - for (n = 11; n <= 12; ++n) { - code = lookBits(n); - if (code == EOF) { - return 1; - } - if (n < 12) { - code <<= 12 - n; - } - p = &whiteTab1[code]; - if (p->bits == n) { - eatBits(n); - return p->n; - } - } - } - error(getPos(), "Bad white code (%04x) in CCITTFax stream", code); - // eat a bit and return a positive number so that the caller doesn't - // go into an infinite loop - eatBits(1); - return 1; -} - -short CCITTFaxStream::getBlackCode() { - short code; - CCITTCode *p; - int n; - - code = 0; // make gcc happy - if (endOfBlock) { - code = lookBits(13); - if (code == EOF) { - return 1; - } - if ((code >> 7) == 0) { - p = &blackTab1[code]; - } else if ((code >> 9) == 0 && (code >> 7) != 0) { - p = &blackTab2[(code >> 1) - 64]; - } else { - p = &blackTab3[code >> 7]; - } - if (p->bits > 0) { - eatBits(p->bits); - return p->n; - } - } else { - for (n = 2; n <= 6; ++n) { - code = lookBits(n); - if (code == EOF) { - return 1; - } - if (n < 6) { - code <<= 6 - n; - } - p = &blackTab3[code]; - if (p->bits == n) { - eatBits(n); - return p->n; - } - } - for (n = 7; n <= 12; ++n) { - code = lookBits(n); - if (code == EOF) { - return 1; - } - if (n < 12) { - code <<= 12 - n; - } - if (code >= 64) { - p = &blackTab2[code - 64]; - if (p->bits == n) { - eatBits(n); - return p->n; - } - } - } - for (n = 10; n <= 13; ++n) { - code = lookBits(n); - if (code == EOF) { - return 1; - } - if (n < 13) { - code <<= 13 - n; - } - p = &blackTab1[code]; - if (p->bits == n) { - eatBits(n); - return p->n; - } - } - } - error(getPos(), "Bad black code (%04x) in CCITTFax stream", code); - // eat a bit and return a positive number so that the caller doesn't - // go into an infinite loop - eatBits(1); - return 1; -} - -short CCITTFaxStream::lookBits(int n) { - int c; - - while (inputBits < n) { - if ((c = str->getChar()) == EOF) { - if (inputBits == 0) { - return EOF; - } - // near the end of the stream, the caller may ask for more bits - // than are available, but there may still be a valid code in - // however many bits are available -- we need to return correct - // data in this case - return (inputBuf << (n - inputBits)) & (0xffff >> (16 - n)); - } - inputBuf = (inputBuf << 8) + c; - inputBits += 8; - } - return (inputBuf >> (inputBits - n)) & (0xffff >> (16 - n)); -} - -GString *CCITTFaxStream::getPSFilter(int psLevel, char *indent) { - GString *s; - char s1[50]; - - if (psLevel < 2) { - return NULL; - } - if (!(s = str->getPSFilter(psLevel, indent))) { - return NULL; - } - s->append(indent)->append("<< "); - if (encoding != 0) { - sprintf(s1, "/K %d ", encoding); - s->append(s1); - } - if (endOfLine) { - s->append("/EndOfLine true "); - } - if (byteAlign) { - s->append("/EncodedByteAlign true "); - } - sprintf(s1, "/Columns %d ", columns); - s->append(s1); - if (rows != 0) { - sprintf(s1, "/Rows %d ", rows); - s->append(s1); - } - if (!endOfBlock) { - s->append("/EndOfBlock false "); - } - if (black) { - s->append("/BlackIs1 true "); - } - s->append(">> /CCITTFaxDecode filter\n"); - return s; -} - -GBool CCITTFaxStream::isBinary(GBool last) { - return str->isBinary(gTrue); -} - -//------------------------------------------------------------------------ -// DCTStream -//------------------------------------------------------------------------ - -// IDCT constants (20.12 fixed point format) -#define dctCos1 4017 // cos(pi/16) -#define dctSin1 799 // sin(pi/16) -#define dctCos3 3406 // cos(3*pi/16) -#define dctSin3 2276 // sin(3*pi/16) -#define dctCos6 1567 // cos(6*pi/16) -#define dctSin6 3784 // sin(6*pi/16) -#define dctSqrt2 5793 // sqrt(2) -#define dctSqrt1d2 2896 // sqrt(2) / 2 - -// color conversion parameters (16.16 fixed point format) -#define dctCrToR 91881 // 1.4020 -#define dctCbToG -22553 // -0.3441363 -#define dctCrToG -46802 // -0.71413636 -#define dctCbToB 116130 // 1.772 - -// clip [-256,511] --> [0,255] -#define dctClipOffset 256 -static Guchar dctClip[768]; -static int dctClipInit = 0; - -// zig zag decode map -static int dctZigZag[64] = { - 0, - 1, 8, - 16, 9, 2, - 3, 10, 17, 24, - 32, 25, 18, 11, 4, - 5, 12, 19, 26, 33, 40, - 48, 41, 34, 27, 20, 13, 6, - 7, 14, 21, 28, 35, 42, 49, 56, - 57, 50, 43, 36, 29, 22, 15, - 23, 30, 37, 44, 51, 58, - 59, 52, 45, 38, 31, - 39, 46, 53, 60, - 61, 54, 47, - 55, 62, - 63 -}; - -DCTStream::DCTStream(Stream *strA, GBool colorXformA): - FilterStream(strA) { - int i, j; - - colorXform = colorXformA; - progressive = interleaved = gFalse; - width = height = 0; - mcuWidth = mcuHeight = 0; - numComps = 0; - comp = 0; - x = y = dy = 0; - for (i = 0; i < 4; ++i) { - for (j = 0; j < 32; ++j) { - rowBuf[i][j] = NULL; - } - frameBuf[i] = NULL; - } - - if (!dctClipInit) { - for (i = -256; i < 0; ++i) - dctClip[dctClipOffset + i] = 0; - for (i = 0; i < 256; ++i) - dctClip[dctClipOffset + i] = i; - for (i = 256; i < 512; ++i) - dctClip[dctClipOffset + i] = 255; - dctClipInit = 1; - } -} - -DCTStream::~DCTStream() { - close(); - delete str; -} - -void DCTStream::reset() { - int i, j; - - str->reset(); - - progressive = interleaved = gFalse; - width = height = 0; - numComps = 0; - numQuantTables = 0; - numDCHuffTables = 0; - numACHuffTables = 0; - gotJFIFMarker = gFalse; - gotAdobeMarker = gFalse; - restartInterval = 0; - - if (!readHeader()) { - y = height; - return; - } - - // compute MCU size - if (numComps == 1) { - compInfo[0].hSample = compInfo[0].vSample = 1; - } - mcuWidth = compInfo[0].hSample; - mcuHeight = compInfo[0].vSample; - for (i = 1; i < numComps; ++i) { - if (compInfo[i].hSample > mcuWidth) { - mcuWidth = compInfo[i].hSample; - } - if (compInfo[i].vSample > mcuHeight) { - mcuHeight = compInfo[i].vSample; - } - } - mcuWidth *= 8; - mcuHeight *= 8; - - // figure out color transform - if (colorXform == -1) { - if (numComps == 3) { - if (gotJFIFMarker) { - colorXform = 1; - } else if (compInfo[0].id == 82 && compInfo[1].id == 71 && - compInfo[2].id == 66) { // ASCII "RGB" - colorXform = 0; - } else { - colorXform = 1; - } - } else { - colorXform = 0; - } - } - - if (progressive || !interleaved) { - - // allocate a buffer for the whole image - bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth; - bufHeight = ((height + mcuHeight - 1) / mcuHeight) * mcuHeight; - if (bufWidth <= 0 || bufHeight <= 0 || - bufWidth > INT_MAX / bufWidth / (int)sizeof(int)) { - error(getPos(), "Invalid image size in DCT stream"); - y = height; - return; - } - for (i = 0; i < numComps; ++i) { - frameBuf[i] = (int *)gmallocn(bufWidth * bufHeight, sizeof(int)); - memset(frameBuf[i], 0, bufWidth * bufHeight * sizeof(int)); - } - - // read the image data - do { - restartMarker = 0xd0; - restart(); - readScan(); - } while (readHeader()); - - // decode - decodeImage(); - - // initialize counters - comp = 0; - x = 0; - y = 0; - - } else { - - // allocate a buffer for one row of MCUs - bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth; - for (i = 0; i < numComps; ++i) { - for (j = 0; j < mcuHeight; ++j) { - rowBuf[i][j] = (Guchar *)gmallocn(bufWidth, sizeof(Guchar)); - } - } - - // initialize counters - comp = 0; - x = 0; - y = 0; - dy = mcuHeight; - - restartMarker = 0xd0; - restart(); - } -} - -void DCTStream::close() { - int i, j; - - for (i = 0; i < 4; ++i) { - for (j = 0; j < 32; ++j) { - gfree(rowBuf[i][j]); - rowBuf[i][j] = NULL; - } - gfree(frameBuf[i]); - frameBuf[i] = NULL; - } - FilterStream::close(); -} - -int DCTStream::getChar() { - int c; - - if (y >= height) { - return EOF; - } - if (progressive || !interleaved) { - c = frameBuf[comp][y * bufWidth + x]; - if (++comp == numComps) { - comp = 0; - if (++x == width) { - x = 0; - ++y; - } - } - } else { - if (dy >= mcuHeight) { - if (!readMCURow()) { - y = height; - return EOF; - } - comp = 0; - x = 0; - dy = 0; - } - c = rowBuf[comp][dy][x]; - if (++comp == numComps) { - comp = 0; - if (++x == width) { - x = 0; - ++y; - ++dy; - if (y == height) { - readTrailer(); - } - } - } - } - return c; -} - -int DCTStream::lookChar() { - if (y >= height) { - return EOF; - } - if (progressive || !interleaved) { - return frameBuf[comp][y * bufWidth + x]; - } else { - if (dy >= mcuHeight) { - if (!readMCURow()) { - y = height; - return EOF; - } - comp = 0; - x = 0; - dy = 0; - } - return rowBuf[comp][dy][x]; - } -} - -void DCTStream::restart() { - int i; - - inputBits = 0; - restartCtr = restartInterval; - for (i = 0; i < numComps; ++i) { - compInfo[i].prevDC = 0; - } - eobRun = 0; -} - -// Read one row of MCUs from a sequential JPEG stream. -GBool DCTStream::readMCURow() { - int data1[64]; - Guchar data2[64]; - Guchar *p1, *p2; - int pY, pCb, pCr, pR, pG, pB; - int h, v, horiz, vert, hSub, vSub; - int x1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i; - int c; - - for (x1 = 0; x1 < width; x1 += mcuWidth) { - - // deal with restart marker - if (restartInterval > 0 && restartCtr == 0) { - c = readMarker(); - if (c != restartMarker) { - error(getPos(), "Bad DCT data: incorrect restart marker"); - return gFalse; - } - if (++restartMarker == 0xd8) - restartMarker = 0xd0; - restart(); - } - - // read one MCU - for (cc = 0; cc < numComps; ++cc) { - h = compInfo[cc].hSample; - v = compInfo[cc].vSample; - horiz = mcuWidth / h; - vert = mcuHeight / v; - hSub = horiz / 8; - vSub = vert / 8; - for (y2 = 0; y2 < mcuHeight; y2 += vert) { - for (x2 = 0; x2 < mcuWidth; x2 += horiz) { - if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]], - &acHuffTables[scanInfo.acHuffTable[cc]], - &compInfo[cc].prevDC, - data1)) { - return gFalse; - } - transformDataUnit(quantTables[compInfo[cc].quantTable], - data1, data2); - if (hSub == 1 && vSub == 1) { - for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { - p1 = &rowBuf[cc][y2+y3][x1+x2]; - p1[0] = data2[i]; - p1[1] = data2[i+1]; - p1[2] = data2[i+2]; - p1[3] = data2[i+3]; - p1[4] = data2[i+4]; - p1[5] = data2[i+5]; - p1[6] = data2[i+6]; - p1[7] = data2[i+7]; - } - } else if (hSub == 2 && vSub == 2) { - for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) { - p1 = &rowBuf[cc][y2+y3][x1+x2]; - p2 = &rowBuf[cc][y2+y3+1][x1+x2]; - p1[0] = p1[1] = p2[0] = p2[1] = data2[i]; - p1[2] = p1[3] = p2[2] = p2[3] = data2[i+1]; - p1[4] = p1[5] = p2[4] = p2[5] = data2[i+2]; - p1[6] = p1[7] = p2[6] = p2[7] = data2[i+3]; - p1[8] = p1[9] = p2[8] = p2[9] = data2[i+4]; - p1[10] = p1[11] = p2[10] = p2[11] = data2[i+5]; - p1[12] = p1[13] = p2[12] = p2[13] = data2[i+6]; - p1[14] = p1[15] = p2[14] = p2[15] = data2[i+7]; - } - } else { - i = 0; - for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) { - for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) { - for (y5 = 0; y5 < vSub; ++y5) - for (x5 = 0; x5 < hSub; ++x5) - rowBuf[cc][y2+y4+y5][x1+x2+x4+x5] = data2[i]; - ++i; - } - } - } - } - } - } - --restartCtr; - - // color space conversion - if (colorXform) { - // convert YCbCr to RGB - if (numComps == 3) { - for (y2 = 0; y2 < mcuHeight; ++y2) { - for (x2 = 0; x2 < mcuWidth; ++x2) { - pY = rowBuf[0][y2][x1+x2]; - pCb = rowBuf[1][y2][x1+x2] - 128; - pCr = rowBuf[2][y2][x1+x2] - 128; - pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; - rowBuf[0][y2][x1+x2] = dctClip[dctClipOffset + pR]; - pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16; - rowBuf[1][y2][x1+x2] = dctClip[dctClipOffset + pG]; - pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; - rowBuf[2][y2][x1+x2] = dctClip[dctClipOffset + pB]; - } - } - // convert YCbCrK to CMYK (K is passed through unchanged) - } else if (numComps == 4) { - for (y2 = 0; y2 < mcuHeight; ++y2) { - for (x2 = 0; x2 < mcuWidth; ++x2) { - pY = rowBuf[0][y2][x1+x2]; - pCb = rowBuf[1][y2][x1+x2] - 128; - pCr = rowBuf[2][y2][x1+x2] - 128; - pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; - rowBuf[0][y2][x1+x2] = 255 - dctClip[dctClipOffset + pR]; - pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16; - rowBuf[1][y2][x1+x2] = 255 - dctClip[dctClipOffset + pG]; - pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; - rowBuf[2][y2][x1+x2] = 255 - dctClip[dctClipOffset + pB]; - } - } - } - } - } - return gTrue; -} - -// Read one scan from a progressive or non-interleaved JPEG stream. -void DCTStream::readScan() { - int data[64]; - int x1, y1, dx1, dy1, x2, y2, y3, cc, i; - int h, v, horiz, vert, vSub; - int *p1; - int c; - - if (scanInfo.numComps == 1) { - for (cc = 0; cc < numComps; ++cc) { - if (scanInfo.comp[cc]) { - break; - } - } - dx1 = mcuWidth / compInfo[cc].hSample; - dy1 = mcuHeight / compInfo[cc].vSample; - } else { - dx1 = mcuWidth; - dy1 = mcuHeight; - } - - for (y1 = 0; y1 < height; y1 += dy1) { - for (x1 = 0; x1 < width; x1 += dx1) { - - // deal with restart marker - if (restartInterval > 0 && restartCtr == 0) { - c = readMarker(); - if (c != restartMarker) { - error(getPos(), "Bad DCT data: incorrect restart marker"); - return; - } - if (++restartMarker == 0xd8) { - restartMarker = 0xd0; - } - restart(); - } - - // read one MCU - for (cc = 0; cc < numComps; ++cc) { - if (!scanInfo.comp[cc]) { - continue; - } - - h = compInfo[cc].hSample; - v = compInfo[cc].vSample; - horiz = mcuWidth / h; - vert = mcuHeight / v; - vSub = vert / 8; - for (y2 = 0; y2 < dy1; y2 += vert) { - for (x2 = 0; x2 < dx1; x2 += horiz) { - - // pull out the current values - p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; - for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { - data[i] = p1[0]; - data[i+1] = p1[1]; - data[i+2] = p1[2]; - data[i+3] = p1[3]; - data[i+4] = p1[4]; - data[i+5] = p1[5]; - data[i+6] = p1[6]; - data[i+7] = p1[7]; - p1 += bufWidth * vSub; - } - - // read one data unit - if (progressive) { - if (!readProgressiveDataUnit( - &dcHuffTables[scanInfo.dcHuffTable[cc]], - &acHuffTables[scanInfo.acHuffTable[cc]], - &compInfo[cc].prevDC, - data)) { - return; - } - } else { - if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]], - &acHuffTables[scanInfo.acHuffTable[cc]], - &compInfo[cc].prevDC, - data)) { - return; - } - } - - // add the data unit into frameBuf - p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; - for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { - p1[0] = data[i]; - p1[1] = data[i+1]; - p1[2] = data[i+2]; - p1[3] = data[i+3]; - p1[4] = data[i+4]; - p1[5] = data[i+5]; - p1[6] = data[i+6]; - p1[7] = data[i+7]; - p1 += bufWidth * vSub; - } - } - } - } - --restartCtr; - } - } -} - -// Read one data unit from a sequential JPEG stream. -GBool DCTStream::readDataUnit(DCTHuffTable *dcHuffTable, - DCTHuffTable *acHuffTable, - int *prevDC, int data[64]) { - int run, size, amp; - int c; - int i, j; - - if ((size = readHuffSym(dcHuffTable)) == 9999) { - return gFalse; - } - if (size > 0) { - if ((amp = readAmp(size)) == 9999) { - return gFalse; - } - } else { - amp = 0; - } - data[0] = *prevDC += amp; - for (i = 1; i < 64; ++i) { - data[i] = 0; - } - i = 1; - while (i < 64) { - run = 0; - while ((c = readHuffSym(acHuffTable)) == 0xf0 && run < 0x30) { - run += 0x10; - } - if (c == 9999) { - return gFalse; - } - if (c == 0x00) { - break; - } else { - run += (c >> 4) & 0x0f; - size = c & 0x0f; - amp = readAmp(size); - if (amp == 9999) { - return gFalse; - } - i += run; - if (i < 64) { - j = dctZigZag[i++]; - data[j] = amp; - } - } - } - return gTrue; -} - -// Read one data unit from a sequential JPEG stream. -GBool DCTStream::readProgressiveDataUnit(DCTHuffTable *dcHuffTable, - DCTHuffTable *acHuffTable, - int *prevDC, int data[64]) { - int run, size, amp, bit, c; - int i, j, k; - - // get the DC coefficient - i = scanInfo.firstCoeff; - if (i == 0) { - if (scanInfo.ah == 0) { - if ((size = readHuffSym(dcHuffTable)) == 9999) { - return gFalse; - } - if (size > 0) { - if ((amp = readAmp(size)) == 9999) { - return gFalse; - } - } else { - amp = 0; - } - data[0] += (*prevDC += amp) << scanInfo.al; - } else { - if ((bit = readBit()) == 9999) { - return gFalse; - } - data[0] += bit << scanInfo.al; - } - ++i; - } - if (scanInfo.lastCoeff == 0) { - return gTrue; - } - - // check for an EOB run - if (eobRun > 0) { - while (i <= scanInfo.lastCoeff) { - if(i>=64) { - return gFalse; - } - j = dctZigZag[i++]; - if (data[j] != 0) { - if ((bit = readBit()) == EOF) { - return gFalse; - } - if (bit) { - data[j] += 1 << scanInfo.al; - } - } - } - --eobRun; - return gTrue; - } - - // read the AC coefficients - while (i <= scanInfo.lastCoeff) { - if ((c = readHuffSym(acHuffTable)) == 9999) { - return gFalse; - } - - // ZRL - if (c == 0xf0) { - k = 0; - while (k < 16) { - if(i>=64) { - return gFalse; - } - j = dctZigZag[i++]; - if (data[j] == 0) { - ++k; - } else { - if ((bit = readBit()) == EOF) { - return gFalse; - } - if (bit) { - data[j] += 1 << scanInfo.al; - } - } - } - - // EOB run - } else if ((c & 0x0f) == 0x00) { - j = c >> 4; - eobRun = 0; - for (k = 0; k < j; ++k) { - if ((bit = readBit()) == EOF) { - return gFalse; - } - eobRun = (eobRun << 1) | bit; - } - eobRun += 1 << j; - while (i <= scanInfo.lastCoeff) { - if(i>=64) { - return gFalse; - } - j = dctZigZag[i++]; - if (data[j] != 0) { - if ((bit = readBit()) == EOF) { - return gFalse; - } - if (bit) { - data[j] += 1 << scanInfo.al; - } - } - } - --eobRun; - break; - - // zero run and one AC coefficient - } else { - run = (c >> 4) & 0x0f; - size = c & 0x0f; - if ((amp = readAmp(size)) == 9999) { - return gFalse; - } - k = 0; - do { - if(i>=64) { - return gFalse; - } - j = dctZigZag[i++]; - while (data[j] != 0) { - if ((bit = readBit()) == EOF) { - return gFalse; - } - if (bit) { - data[j] += 1 << scanInfo.al; - } - if(i>=64) { - return gFalse; - } - j = dctZigZag[i++]; - } - ++k; - } while (k <= run); - data[j] = amp << scanInfo.al; - } - } - - return gTrue; -} - -// Decode a progressive JPEG image. -void DCTStream::decodeImage() { - int dataIn[64]; - Guchar dataOut[64]; - Gushort *quantTable; - int pY, pCb, pCr, pR, pG, pB; - int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i; - int h, v, horiz, vert, hSub, vSub; - int *p0, *p1, *p2; - - for (y1 = 0; y1 < bufHeight; y1 += mcuHeight) { - for (x1 = 0; x1 < bufWidth; x1 += mcuWidth) { - for (cc = 0; cc < numComps; ++cc) { - quantTable = quantTables[compInfo[cc].quantTable]; - h = compInfo[cc].hSample; - v = compInfo[cc].vSample; - horiz = mcuWidth / h; - vert = mcuHeight / v; - hSub = horiz / 8; - vSub = vert / 8; - for (y2 = 0; y2 < mcuHeight; y2 += vert) { - for (x2 = 0; x2 < mcuWidth; x2 += horiz) { - - // pull out the coded data unit - p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; - for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { - dataIn[i] = p1[0]; - dataIn[i+1] = p1[1]; - dataIn[i+2] = p1[2]; - dataIn[i+3] = p1[3]; - dataIn[i+4] = p1[4]; - dataIn[i+5] = p1[5]; - dataIn[i+6] = p1[6]; - dataIn[i+7] = p1[7]; - p1 += bufWidth * vSub; - } - - // transform - transformDataUnit(quantTable, dataIn, dataOut); - - // store back into frameBuf, doing replication for - // subsampled components - p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)]; - if (hSub == 1 && vSub == 1) { - for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) { - p1[0] = dataOut[i] & 0xff; - p1[1] = dataOut[i+1] & 0xff; - p1[2] = dataOut[i+2] & 0xff; - p1[3] = dataOut[i+3] & 0xff; - p1[4] = dataOut[i+4] & 0xff; - p1[5] = dataOut[i+5] & 0xff; - p1[6] = dataOut[i+6] & 0xff; - p1[7] = dataOut[i+7] & 0xff; - p1 += bufWidth; - } - } else if (hSub == 2 && vSub == 2) { - p2 = p1 + bufWidth; - for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) { - p1[0] = p1[1] = p2[0] = p2[1] = dataOut[i] & 0xff; - p1[2] = p1[3] = p2[2] = p2[3] = dataOut[i+1] & 0xff; - p1[4] = p1[5] = p2[4] = p2[5] = dataOut[i+2] & 0xff; - p1[6] = p1[7] = p2[6] = p2[7] = dataOut[i+3] & 0xff; - p1[8] = p1[9] = p2[8] = p2[9] = dataOut[i+4] & 0xff; - p1[10] = p1[11] = p2[10] = p2[11] = dataOut[i+5] & 0xff; - p1[12] = p1[13] = p2[12] = p2[13] = dataOut[i+6] & 0xff; - p1[14] = p1[15] = p2[14] = p2[15] = dataOut[i+7] & 0xff; - p1 += bufWidth * 2; - p2 += bufWidth * 2; - } - } else { - i = 0; - for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) { - for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) { - p2 = p1 + x4; - for (y5 = 0; y5 < vSub; ++y5) { - for (x5 = 0; x5 < hSub; ++x5) { - p2[x5] = dataOut[i] & 0xff; - } - p2 += bufWidth; - } - ++i; - } - p1 += bufWidth * vSub; - } - } - } - } - } - - // color space conversion - if (colorXform) { - // convert YCbCr to RGB - if (numComps == 3) { - for (y2 = 0; y2 < mcuHeight; ++y2) { - p0 = &frameBuf[0][(y1+y2) * bufWidth + x1]; - p1 = &frameBuf[1][(y1+y2) * bufWidth + x1]; - p2 = &frameBuf[2][(y1+y2) * bufWidth + x1]; - for (x2 = 0; x2 < mcuWidth; ++x2) { - pY = *p0; - pCb = *p1 - 128; - pCr = *p2 - 128; - pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; - *p0++ = dctClip[dctClipOffset + pR]; - pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + - 32768) >> 16; - *p1++ = dctClip[dctClipOffset + pG]; - pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; - *p2++ = dctClip[dctClipOffset + pB]; - } - } - // convert YCbCrK to CMYK (K is passed through unchanged) - } else if (numComps == 4) { - for (y2 = 0; y2 < mcuHeight; ++y2) { - p0 = &frameBuf[0][(y1+y2) * bufWidth + x1]; - p1 = &frameBuf[1][(y1+y2) * bufWidth + x1]; - p2 = &frameBuf[2][(y1+y2) * bufWidth + x1]; - for (x2 = 0; x2 < mcuWidth; ++x2) { - pY = *p0; - pCb = *p1 - 128; - pCr = *p2 - 128; - pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16; - *p0++ = 255 - dctClip[dctClipOffset + pR]; - pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + - 32768) >> 16; - *p1++ = 255 - dctClip[dctClipOffset + pG]; - pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16; - *p2++ = 255 - dctClip[dctClipOffset + pB]; - } - } - } - } - } - } -} - -// Transform one data unit -- this performs the dequantization and -// IDCT steps. This IDCT algorithm is taken from: -// Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, -// "Practical Fast 1-D DCT Algorithms with 11 Multiplications", -// IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, -// 988-991. -// The stage numbers mentioned in the comments refer to Figure 1 in this -// paper. -void DCTStream::transformDataUnit(Gushort *quantTable, - int dataIn[64], Guchar dataOut[64]) { - int v0, v1, v2, v3, v4, v5, v6, v7, t; - int *p; - int i; - - // dequant - for (i = 0; i < 64; ++i) { - dataIn[i] *= quantTable[i]; - } - - // inverse DCT on rows - for (i = 0; i < 64; i += 8) { - p = dataIn + i; - - // check for all-zero AC coefficients - if (p[1] == 0 && p[2] == 0 && p[3] == 0 && - p[4] == 0 && p[5] == 0 && p[6] == 0 && p[7] == 0) { - t = (dctSqrt2 * p[0] + 512) >> 10; - p[0] = t; - p[1] = t; - p[2] = t; - p[3] = t; - p[4] = t; - p[5] = t; - p[6] = t; - p[7] = t; - continue; - } - - // stage 4 - v0 = (dctSqrt2 * p[0] + 128) >> 8; - v1 = (dctSqrt2 * p[4] + 128) >> 8; - v2 = p[2]; - v3 = p[6]; - v4 = (dctSqrt1d2 * (p[1] - p[7]) + 128) >> 8; - v7 = (dctSqrt1d2 * (p[1] + p[7]) + 128) >> 8; - v5 = p[3] << 4; - v6 = p[5] << 4; - - // stage 3 - t = (v0 - v1+ 1) >> 1; - v0 = (v0 + v1 + 1) >> 1; - v1 = t; - t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; - v3 = t; - t = (v4 - v6 + 1) >> 1; - v4 = (v4 + v6 + 1) >> 1; - v6 = t; - t = (v7 + v5 + 1) >> 1; - v5 = (v7 - v5 + 1) >> 1; - v7 = t; - - // stage 2 - t = (v0 - v3 + 1) >> 1; - v0 = (v0 + v3 + 1) >> 1; - v3 = t; - t = (v1 - v2 + 1) >> 1; - v1 = (v1 + v2 + 1) >> 1; - v2 = t; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p[0] = v0 + v7; - p[7] = v0 - v7; - p[1] = v1 + v6; - p[6] = v1 - v6; - p[2] = v2 + v5; - p[5] = v2 - v5; - p[3] = v3 + v4; - p[4] = v3 - v4; - } - - // inverse DCT on columns - for (i = 0; i < 8; ++i) { - p = dataIn + i; - - // check for all-zero AC coefficients - if (p[1*8] == 0 && p[2*8] == 0 && p[3*8] == 0 && - p[4*8] == 0 && p[5*8] == 0 && p[6*8] == 0 && p[7*8] == 0) { - t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14; - p[0*8] = t; - p[1*8] = t; - p[2*8] = t; - p[3*8] = t; - p[4*8] = t; - p[5*8] = t; - p[6*8] = t; - p[7*8] = t; - continue; - } - - // stage 4 - v0 = (dctSqrt2 * p[0*8] + 2048) >> 12; - v1 = (dctSqrt2 * p[4*8] + 2048) >> 12; - v2 = p[2*8]; - v3 = p[6*8]; - v4 = (dctSqrt1d2 * (p[1*8] - p[7*8]) + 2048) >> 12; - v7 = (dctSqrt1d2 * (p[1*8] + p[7*8]) + 2048) >> 12; - v5 = p[3*8]; - v6 = p[5*8]; - - // stage 3 - t = (v0 - v1 + 1) >> 1; - v0 = (v0 + v1 + 1) >> 1; - v1 = t; - t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; - v3 = t; - t = (v4 - v6 + 1) >> 1; - v4 = (v4 + v6 + 1) >> 1; - v6 = t; - t = (v7 + v5 + 1) >> 1; - v5 = (v7 - v5 + 1) >> 1; - v7 = t; - - // stage 2 - t = (v0 - v3 + 1) >> 1; - v0 = (v0 + v3 + 1) >> 1; - v3 = t; - t = (v1 - v2 + 1) >> 1; - v1 = (v1 + v2 + 1) >> 1; - v2 = t; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p[0*8] = v0 + v7; - p[7*8] = v0 - v7; - p[1*8] = v1 + v6; - p[6*8] = v1 - v6; - p[2*8] = v2 + v5; - p[5*8] = v2 - v5; - p[3*8] = v3 + v4; - p[4*8] = v3 - v4; - } - - // convert to 8-bit integers - for (i = 0; i < 64; ++i) { - dataOut[i] = dctClip[dctClipOffset + 128 + ((dataIn[i] + 8) >> 4)]; - } -} - -int DCTStream::readHuffSym(DCTHuffTable *table) { - Gushort code; - int bit; - int codeBits; - - code = 0; - codeBits = 0; - do { - // add a bit to the code - if ((bit = readBit()) == EOF) - return 9999; - code = (code << 1) + bit; - ++codeBits; - - // look up code - if (code - table->firstCode[codeBits] < table->numCodes[codeBits]) { - code -= table->firstCode[codeBits]; - return table->sym[table->firstSym[codeBits] + code]; - } - } while (codeBits < 16); - - error(getPos(), "Bad Huffman code in DCT stream"); - return 9999; -} - -int DCTStream::readAmp(int size) { - int amp, bit; - int bits; - - amp = 0; - for (bits = 0; bits < size; ++bits) { - if ((bit = readBit()) == EOF) - return 9999; - amp = (amp << 1) + bit; - } - if (amp < (1 << (size - 1))) - amp -= (1 << size) - 1; - return amp; -} - -int DCTStream::readBit() { - int bit; - int c, c2; - - if (inputBits == 0) { - if ((c = str->getChar()) == EOF) - return EOF; - if (c == 0xff) { - do { - c2 = str->getChar(); - } while (c2 == 0xff); - if (c2 != 0x00) { - error(getPos(), "Bad DCT data: missing 00 after ff"); - return EOF; - } - } - inputBuf = c; - inputBits = 8; - } - bit = (inputBuf >> (inputBits - 1)) & 1; - --inputBits; - return bit; -} - -GBool DCTStream::readHeader() { - GBool doScan; - int n; - int c = 0; - int i; - - // read headers - doScan = gFalse; - while (!doScan) { - c = readMarker(); - switch (c) { - case 0xc0: // SOF0 (sequential) - case 0xc1: // SOF1 (extended sequential) - if (!readBaselineSOF()) { - return gFalse; - } - break; - case 0xc2: // SOF2 (progressive) - if (!readProgressiveSOF()) { - return gFalse; - } - break; - case 0xc4: // DHT - if (!readHuffmanTables()) { - return gFalse; - } - break; - case 0xd8: // SOI - break; - case 0xd9: // EOI - return gFalse; - case 0xda: // SOS - if (!readScanInfo()) { - return gFalse; - } - doScan = gTrue; - break; - case 0xdb: // DQT - if (!readQuantTables()) { - return gFalse; - } - break; - case 0xdd: // DRI - if (!readRestartInterval()) { - return gFalse; - } - break; - case 0xe0: // APP0 - if (!readJFIFMarker()) { - return gFalse; - } - break; - case 0xee: // APP14 - if (!readAdobeMarker()) { - return gFalse; - } - break; - case EOF: - error(getPos(), "Bad DCT header"); - return gFalse; - default: - // skip APPn / COM / etc. - if (c >= 0xe0) { - n = read16() - 2; - for (i = 0; i < n; ++i) { - str->getChar(); - } - } else { - error(getPos(), "Unknown DCT marker <%02x>", c); - return gFalse; - } - break; - } - } - - return gTrue; -} - -GBool DCTStream::readBaselineSOF() { - int length; - int prec; - int i; - int c; - - length = read16(); - prec = str->getChar(); - height = read16(); - width = read16(); - numComps = str->getChar(); - if (numComps <= 0 || numComps > 4) { - error(getPos(), "Bad number of components in DCT stream"); - numComps = 0; - return gFalse; - } - if (prec != 8) { - error(getPos(), "Bad DCT precision %d", prec); - return gFalse; - } - for (i = 0; i < numComps; ++i) { - compInfo[i].id = str->getChar(); - c = str->getChar(); - compInfo[i].hSample = (c >> 4) & 0x0f; - compInfo[i].vSample = c & 0x0f; - compInfo[i].quantTable = str->getChar(); - } - progressive = gFalse; - return gTrue; -} - -GBool DCTStream::readProgressiveSOF() { - int length; - int prec; - int i; - int c; - - length = read16(); - prec = str->getChar(); - height = read16(); - width = read16(); - numComps = str->getChar(); - if (numComps <= 0 || numComps > 4) { - error(getPos(), "Bad number of components in DCT stream"); - numComps = 0; - return gFalse; - } - if (prec != 8) { - error(getPos(), "Bad DCT precision %d", prec); - return gFalse; - } - for (i = 0; i < numComps; ++i) { - compInfo[i].id = str->getChar(); - c = str->getChar(); - compInfo[i].hSample = (c >> 4) & 0x0f; - compInfo[i].vSample = c & 0x0f; - compInfo[i].quantTable = str->getChar(); - } - progressive = gTrue; - return gTrue; -} - -GBool DCTStream::readScanInfo() { - int length; - int id, c; - int i, j; - - length = read16() - 2; - scanInfo.numComps = str->getChar(); - if (scanInfo.numComps <= 0 || scanInfo.numComps > 4) { - error(getPos(), "Bad number of components in DCT stream"); - scanInfo.numComps = 0; - return gFalse; - } - --length; - if (length != 2 * scanInfo.numComps + 3) { - error(getPos(), "Bad DCT scan info block"); - return gFalse; - } - interleaved = scanInfo.numComps == numComps; - for (j = 0; j < numComps; ++j) { - scanInfo.comp[j] = gFalse; - } - for (i = 0; i < scanInfo.numComps; ++i) { - id = str->getChar(); - // some (broken) DCT streams reuse ID numbers, but at least they - // keep the components in order, so we check compInfo[i] first to - // work around the problem - if (id == compInfo[i].id) { - j = i; - } else { - for (j = 0; j < numComps; ++j) { - if (id == compInfo[j].id) { - break; - } - } - if (j == numComps) { - error(getPos(), "Bad DCT component ID in scan info block"); - return gFalse; - } - } - scanInfo.comp[j] = gTrue; - c = str->getChar(); - scanInfo.dcHuffTable[j] = (c >> 4) & 0x0f; - scanInfo.acHuffTable[j] = c & 0x0f; - } - scanInfo.firstCoeff = str->getChar(); - scanInfo.lastCoeff = str->getChar(); - if (scanInfo.firstCoeff < 0 || scanInfo.lastCoeff > 63 || - scanInfo.firstCoeff > scanInfo.lastCoeff) { - error(getPos(), "Bad DCT coefficient numbers in scan info block"); - return gFalse; - } - c = str->getChar(); - scanInfo.ah = (c >> 4) & 0x0f; - scanInfo.al = c & 0x0f; - return gTrue; -} - -GBool DCTStream::readQuantTables() { - int length, prec, i, index; - - length = read16() - 2; - while (length > 0) { - index = str->getChar(); - prec = (index >> 4) & 0x0f; - index &= 0x0f; - if (prec > 1 || index >= 4) { - error(getPos(), "Bad DCT quantization table"); - return gFalse; - } - if (index == numQuantTables) { - numQuantTables = index + 1; - } - for (i = 0; i < 64; ++i) { - if (prec) { - quantTables[index][dctZigZag[i]] = read16(); - } else { - quantTables[index][dctZigZag[i]] = str->getChar(); - } - } - if (prec) { - length -= 129; - } else { - length -= 65; - } - } - return gTrue; -} - -GBool DCTStream::readHuffmanTables() { - DCTHuffTable *tbl; - int length; - int index; - Gushort code; - Guchar sym; - int i; - int c; - - length = read16() - 2; - while (length > 0) { - index = str->getChar(); - --length; - if ((index & 0x0f) >= 4) { - error(getPos(), "Bad DCT Huffman table"); - return gFalse; - } - if (index & 0x10) { - index &= 0x0f; - if (index >= numACHuffTables) - numACHuffTables = index+1; - tbl = &acHuffTables[index]; - } else { - index &= 0x0f; - if (index >= numDCHuffTables) - numDCHuffTables = index+1; - tbl = &dcHuffTables[index]; - } - sym = 0; - code = 0; - for (i = 1; i <= 16; ++i) { - c = str->getChar(); - tbl->firstSym[i] = sym; - tbl->firstCode[i] = code; - tbl->numCodes[i] = c; - sym += c; - code = (code + c) << 1; - } - length -= 16; - for (i = 0; i < sym; ++i) - tbl->sym[i] = str->getChar(); - length -= sym; - } - return gTrue; -} - -GBool DCTStream::readRestartInterval() { - int length; - - length = read16(); - if (length != 4) { - error(getPos(), "Bad DCT restart interval"); - return gFalse; - } - restartInterval = read16(); - return gTrue; -} - -GBool DCTStream::readJFIFMarker() { - int length, i; - char buf[5]; - int c; - - length = read16(); - length -= 2; - if (length >= 5) { - for (i = 0; i < 5; ++i) { - if ((c = str->getChar()) == EOF) { - error(getPos(), "Bad DCT APP0 marker"); - return gFalse; - } - buf[i] = c; - } - length -= 5; - if (!memcmp(buf, "JFIF\0", 5)) { - gotJFIFMarker = gTrue; - } - } - while (length > 0) { - if (str->getChar() == EOF) { - error(getPos(), "Bad DCT APP0 marker"); - return gFalse; - } - --length; - } - return gTrue; -} - -GBool DCTStream::readAdobeMarker() { - int length, i; - char buf[12]; - int c; - - length = read16(); - if (length < 14) { - goto err; - } - for (i = 0; i < 12; ++i) { - if ((c = str->getChar()) == EOF) { - goto err; - } - buf[i] = c; - } - if (strncmp(buf, "Adobe", 5)) { - goto err; - } - colorXform = buf[11]; - gotAdobeMarker = gTrue; - for (i = 14; i < length; ++i) { - if (str->getChar() == EOF) { - goto err; - } - } - return gTrue; - - err: - error(getPos(), "Bad DCT Adobe APP14 marker"); - return gFalse; -} - -GBool DCTStream::readTrailer() { - int c; - - c = readMarker(); - if (c != 0xd9) { // EOI - error(getPos(), "Bad DCT trailer"); - return gFalse; - } - return gTrue; -} - -int DCTStream::readMarker() { - int c; - - do { - do { - c = str->getChar(); - } while (c != 0xff && c != EOF); - do { - c = str->getChar(); - } while (c == 0xff); - } while (c == 0x00); - return c; -} - -int DCTStream::read16() { - int c1, c2; - - if ((c1 = str->getChar()) == EOF) - return EOF; - if ((c2 = str->getChar()) == EOF) - return EOF; - return (c1 << 8) + c2; -} - -GString *DCTStream::getPSFilter(int psLevel, char *indent) { - GString *s; - - if (psLevel < 2) { - return NULL; - } - if (!(s = str->getPSFilter(psLevel, indent))) { - return NULL; - } - s->append(indent)->append("<< >> /DCTDecode filter\n"); - return s; -} - -GBool DCTStream::isBinary(GBool last) { - return str->isBinary(gTrue); -} - -//------------------------------------------------------------------------ -// FlateStream -//------------------------------------------------------------------------ - -int FlateStream::codeLenCodeMap[flateMaxCodeLenCodes] = { - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 -}; - -FlateDecode FlateStream::lengthDecode[flateMaxLitCodes-257] = { - {0, 3}, - {0, 4}, - {0, 5}, - {0, 6}, - {0, 7}, - {0, 8}, - {0, 9}, - {0, 10}, - {1, 11}, - {1, 13}, - {1, 15}, - {1, 17}, - {2, 19}, - {2, 23}, - {2, 27}, - {2, 31}, - {3, 35}, - {3, 43}, - {3, 51}, - {3, 59}, - {4, 67}, - {4, 83}, - {4, 99}, - {4, 115}, - {5, 131}, - {5, 163}, - {5, 195}, - {5, 227}, - {0, 258}, - {0, 258}, - {0, 258} -}; - -FlateDecode FlateStream::distDecode[flateMaxDistCodes] = { - { 0, 1}, - { 0, 2}, - { 0, 3}, - { 0, 4}, - { 1, 5}, - { 1, 7}, - { 2, 9}, - { 2, 13}, - { 3, 17}, - { 3, 25}, - { 4, 33}, - { 4, 49}, - { 5, 65}, - { 5, 97}, - { 6, 129}, - { 6, 193}, - { 7, 257}, - { 7, 385}, - { 8, 513}, - { 8, 769}, - { 9, 1025}, - { 9, 1537}, - {10, 2049}, - {10, 3073}, - {11, 4097}, - {11, 6145}, - {12, 8193}, - {12, 12289}, - {13, 16385}, - {13, 24577} -}; - -static FlateCode flateFixedLitCodeTabCodes[512] = { - {7, 0x0100}, - {8, 0x0050}, - {8, 0x0010}, - {8, 0x0118}, - {7, 0x0110}, - {8, 0x0070}, - {8, 0x0030}, - {9, 0x00c0}, - {7, 0x0108}, - {8, 0x0060}, - {8, 0x0020}, - {9, 0x00a0}, - {8, 0x0000}, - {8, 0x0080}, - {8, 0x0040}, - {9, 0x00e0}, - {7, 0x0104}, - {8, 0x0058}, - {8, 0x0018}, - {9, 0x0090}, - {7, 0x0114}, - {8, 0x0078}, - {8, 0x0038}, - {9, 0x00d0}, - {7, 0x010c}, - {8, 0x0068}, - {8, 0x0028}, - {9, 0x00b0}, - {8, 0x0008}, - {8, 0x0088}, - {8, 0x0048}, - {9, 0x00f0}, - {7, 0x0102}, - {8, 0x0054}, - {8, 0x0014}, - {8, 0x011c}, - {7, 0x0112}, - {8, 0x0074}, - {8, 0x0034}, - {9, 0x00c8}, - {7, 0x010a}, - {8, 0x0064}, - {8, 0x0024}, - {9, 0x00a8}, - {8, 0x0004}, - {8, 0x0084}, - {8, 0x0044}, - {9, 0x00e8}, - {7, 0x0106}, - {8, 0x005c}, - {8, 0x001c}, - {9, 0x0098}, - {7, 0x0116}, - {8, 0x007c}, - {8, 0x003c}, - {9, 0x00d8}, - {7, 0x010e}, - {8, 0x006c}, - {8, 0x002c}, - {9, 0x00b8}, - {8, 0x000c}, - {8, 0x008c}, - {8, 0x004c}, - {9, 0x00f8}, - {7, 0x0101}, - {8, 0x0052}, - {8, 0x0012}, - {8, 0x011a}, - {7, 0x0111}, - {8, 0x0072}, - {8, 0x0032}, - {9, 0x00c4}, - {7, 0x0109}, - {8, 0x0062}, - {8, 0x0022}, - {9, 0x00a4}, - {8, 0x0002}, - {8, 0x0082}, - {8, 0x0042}, - {9, 0x00e4}, - {7, 0x0105}, - {8, 0x005a}, - {8, 0x001a}, - {9, 0x0094}, - {7, 0x0115}, - {8, 0x007a}, - {8, 0x003a}, - {9, 0x00d4}, - {7, 0x010d}, - {8, 0x006a}, - {8, 0x002a}, - {9, 0x00b4}, - {8, 0x000a}, - {8, 0x008a}, - {8, 0x004a}, - {9, 0x00f4}, - {7, 0x0103}, - {8, 0x0056}, - {8, 0x0016}, - {8, 0x011e}, - {7, 0x0113}, - {8, 0x0076}, - {8, 0x0036}, - {9, 0x00cc}, - {7, 0x010b}, - {8, 0x0066}, - {8, 0x0026}, - {9, 0x00ac}, - {8, 0x0006}, - {8, 0x0086}, - {8, 0x0046}, - {9, 0x00ec}, - {7, 0x0107}, - {8, 0x005e}, - {8, 0x001e}, - {9, 0x009c}, - {7, 0x0117}, - {8, 0x007e}, - {8, 0x003e}, - {9, 0x00dc}, - {7, 0x010f}, - {8, 0x006e}, - {8, 0x002e}, - {9, 0x00bc}, - {8, 0x000e}, - {8, 0x008e}, - {8, 0x004e}, - {9, 0x00fc}, - {7, 0x0100}, - {8, 0x0051}, - {8, 0x0011}, - {8, 0x0119}, - {7, 0x0110}, - {8, 0x0071}, - {8, 0x0031}, - {9, 0x00c2}, - {7, 0x0108}, - {8, 0x0061}, - {8, 0x0021}, - {9, 0x00a2}, - {8, 0x0001}, - {8, 0x0081}, - {8, 0x0041}, - {9, 0x00e2}, - {7, 0x0104}, - {8, 0x0059}, - {8, 0x0019}, - {9, 0x0092}, - {7, 0x0114}, - {8, 0x0079}, - {8, 0x0039}, - {9, 0x00d2}, - {7, 0x010c}, - {8, 0x0069}, - {8, 0x0029}, - {9, 0x00b2}, - {8, 0x0009}, - {8, 0x0089}, - {8, 0x0049}, - {9, 0x00f2}, - {7, 0x0102}, - {8, 0x0055}, - {8, 0x0015}, - {8, 0x011d}, - {7, 0x0112}, - {8, 0x0075}, - {8, 0x0035}, - {9, 0x00ca}, - {7, 0x010a}, - {8, 0x0065}, - {8, 0x0025}, - {9, 0x00aa}, - {8, 0x0005}, - {8, 0x0085}, - {8, 0x0045}, - {9, 0x00ea}, - {7, 0x0106}, - {8, 0x005d}, - {8, 0x001d}, - {9, 0x009a}, - {7, 0x0116}, - {8, 0x007d}, - {8, 0x003d}, - {9, 0x00da}, - {7, 0x010e}, - {8, 0x006d}, - {8, 0x002d}, - {9, 0x00ba}, - {8, 0x000d}, - {8, 0x008d}, - {8, 0x004d}, - {9, 0x00fa}, - {7, 0x0101}, - {8, 0x0053}, - {8, 0x0013}, - {8, 0x011b}, - {7, 0x0111}, - {8, 0x0073}, - {8, 0x0033}, - {9, 0x00c6}, - {7, 0x0109}, - {8, 0x0063}, - {8, 0x0023}, - {9, 0x00a6}, - {8, 0x0003}, - {8, 0x0083}, - {8, 0x0043}, - {9, 0x00e6}, - {7, 0x0105}, - {8, 0x005b}, - {8, 0x001b}, - {9, 0x0096}, - {7, 0x0115}, - {8, 0x007b}, - {8, 0x003b}, - {9, 0x00d6}, - {7, 0x010d}, - {8, 0x006b}, - {8, 0x002b}, - {9, 0x00b6}, - {8, 0x000b}, - {8, 0x008b}, - {8, 0x004b}, - {9, 0x00f6}, - {7, 0x0103}, - {8, 0x0057}, - {8, 0x0017}, - {8, 0x011f}, - {7, 0x0113}, - {8, 0x0077}, - {8, 0x0037}, - {9, 0x00ce}, - {7, 0x010b}, - {8, 0x0067}, - {8, 0x0027}, - {9, 0x00ae}, - {8, 0x0007}, - {8, 0x0087}, - {8, 0x0047}, - {9, 0x00ee}, - {7, 0x0107}, - {8, 0x005f}, - {8, 0x001f}, - {9, 0x009e}, - {7, 0x0117}, - {8, 0x007f}, - {8, 0x003f}, - {9, 0x00de}, - {7, 0x010f}, - {8, 0x006f}, - {8, 0x002f}, - {9, 0x00be}, - {8, 0x000f}, - {8, 0x008f}, - {8, 0x004f}, - {9, 0x00fe}, - {7, 0x0100}, - {8, 0x0050}, - {8, 0x0010}, - {8, 0x0118}, - {7, 0x0110}, - {8, 0x0070}, - {8, 0x0030}, - {9, 0x00c1}, - {7, 0x0108}, - {8, 0x0060}, - {8, 0x0020}, - {9, 0x00a1}, - {8, 0x0000}, - {8, 0x0080}, - {8, 0x0040}, - {9, 0x00e1}, - {7, 0x0104}, - {8, 0x0058}, - {8, 0x0018}, - {9, 0x0091}, - {7, 0x0114}, - {8, 0x0078}, - {8, 0x0038}, - {9, 0x00d1}, - {7, 0x010c}, - {8, 0x0068}, - {8, 0x0028}, - {9, 0x00b1}, - {8, 0x0008}, - {8, 0x0088}, - {8, 0x0048}, - {9, 0x00f1}, - {7, 0x0102}, - {8, 0x0054}, - {8, 0x0014}, - {8, 0x011c}, - {7, 0x0112}, - {8, 0x0074}, - {8, 0x0034}, - {9, 0x00c9}, - {7, 0x010a}, - {8, 0x0064}, - {8, 0x0024}, - {9, 0x00a9}, - {8, 0x0004}, - {8, 0x0084}, - {8, 0x0044}, - {9, 0x00e9}, - {7, 0x0106}, - {8, 0x005c}, - {8, 0x001c}, - {9, 0x0099}, - {7, 0x0116}, - {8, 0x007c}, - {8, 0x003c}, - {9, 0x00d9}, - {7, 0x010e}, - {8, 0x006c}, - {8, 0x002c}, - {9, 0x00b9}, - {8, 0x000c}, - {8, 0x008c}, - {8, 0x004c}, - {9, 0x00f9}, - {7, 0x0101}, - {8, 0x0052}, - {8, 0x0012}, - {8, 0x011a}, - {7, 0x0111}, - {8, 0x0072}, - {8, 0x0032}, - {9, 0x00c5}, - {7, 0x0109}, - {8, 0x0062}, - {8, 0x0022}, - {9, 0x00a5}, - {8, 0x0002}, - {8, 0x0082}, - {8, 0x0042}, - {9, 0x00e5}, - {7, 0x0105}, - {8, 0x005a}, - {8, 0x001a}, - {9, 0x0095}, - {7, 0x0115}, - {8, 0x007a}, - {8, 0x003a}, - {9, 0x00d5}, - {7, 0x010d}, - {8, 0x006a}, - {8, 0x002a}, - {9, 0x00b5}, - {8, 0x000a}, - {8, 0x008a}, - {8, 0x004a}, - {9, 0x00f5}, - {7, 0x0103}, - {8, 0x0056}, - {8, 0x0016}, - {8, 0x011e}, - {7, 0x0113}, - {8, 0x0076}, - {8, 0x0036}, - {9, 0x00cd}, - {7, 0x010b}, - {8, 0x0066}, - {8, 0x0026}, - {9, 0x00ad}, - {8, 0x0006}, - {8, 0x0086}, - {8, 0x0046}, - {9, 0x00ed}, - {7, 0x0107}, - {8, 0x005e}, - {8, 0x001e}, - {9, 0x009d}, - {7, 0x0117}, - {8, 0x007e}, - {8, 0x003e}, - {9, 0x00dd}, - {7, 0x010f}, - {8, 0x006e}, - {8, 0x002e}, - {9, 0x00bd}, - {8, 0x000e}, - {8, 0x008e}, - {8, 0x004e}, - {9, 0x00fd}, - {7, 0x0100}, - {8, 0x0051}, - {8, 0x0011}, - {8, 0x0119}, - {7, 0x0110}, - {8, 0x0071}, - {8, 0x0031}, - {9, 0x00c3}, - {7, 0x0108}, - {8, 0x0061}, - {8, 0x0021}, - {9, 0x00a3}, - {8, 0x0001}, - {8, 0x0081}, - {8, 0x0041}, - {9, 0x00e3}, - {7, 0x0104}, - {8, 0x0059}, - {8, 0x0019}, - {9, 0x0093}, - {7, 0x0114}, - {8, 0x0079}, - {8, 0x0039}, - {9, 0x00d3}, - {7, 0x010c}, - {8, 0x0069}, - {8, 0x0029}, - {9, 0x00b3}, - {8, 0x0009}, - {8, 0x0089}, - {8, 0x0049}, - {9, 0x00f3}, - {7, 0x0102}, - {8, 0x0055}, - {8, 0x0015}, - {8, 0x011d}, - {7, 0x0112}, - {8, 0x0075}, - {8, 0x0035}, - {9, 0x00cb}, - {7, 0x010a}, - {8, 0x0065}, - {8, 0x0025}, - {9, 0x00ab}, - {8, 0x0005}, - {8, 0x0085}, - {8, 0x0045}, - {9, 0x00eb}, - {7, 0x0106}, - {8, 0x005d}, - {8, 0x001d}, - {9, 0x009b}, - {7, 0x0116}, - {8, 0x007d}, - {8, 0x003d}, - {9, 0x00db}, - {7, 0x010e}, - {8, 0x006d}, - {8, 0x002d}, - {9, 0x00bb}, - {8, 0x000d}, - {8, 0x008d}, - {8, 0x004d}, - {9, 0x00fb}, - {7, 0x0101}, - {8, 0x0053}, - {8, 0x0013}, - {8, 0x011b}, - {7, 0x0111}, - {8, 0x0073}, - {8, 0x0033}, - {9, 0x00c7}, - {7, 0x0109}, - {8, 0x0063}, - {8, 0x0023}, - {9, 0x00a7}, - {8, 0x0003}, - {8, 0x0083}, - {8, 0x0043}, - {9, 0x00e7}, - {7, 0x0105}, - {8, 0x005b}, - {8, 0x001b}, - {9, 0x0097}, - {7, 0x0115}, - {8, 0x007b}, - {8, 0x003b}, - {9, 0x00d7}, - {7, 0x010d}, - {8, 0x006b}, - {8, 0x002b}, - {9, 0x00b7}, - {8, 0x000b}, - {8, 0x008b}, - {8, 0x004b}, - {9, 0x00f7}, - {7, 0x0103}, - {8, 0x0057}, - {8, 0x0017}, - {8, 0x011f}, - {7, 0x0113}, - {8, 0x0077}, - {8, 0x0037}, - {9, 0x00cf}, - {7, 0x010b}, - {8, 0x0067}, - {8, 0x0027}, - {9, 0x00af}, - {8, 0x0007}, - {8, 0x0087}, - {8, 0x0047}, - {9, 0x00ef}, - {7, 0x0107}, - {8, 0x005f}, - {8, 0x001f}, - {9, 0x009f}, - {7, 0x0117}, - {8, 0x007f}, - {8, 0x003f}, - {9, 0x00df}, - {7, 0x010f}, - {8, 0x006f}, - {8, 0x002f}, - {9, 0x00bf}, - {8, 0x000f}, - {8, 0x008f}, - {8, 0x004f}, - {9, 0x00ff} -}; - -FlateHuffmanTab FlateStream::fixedLitCodeTab = { - flateFixedLitCodeTabCodes, 9 -}; - -static FlateCode flateFixedDistCodeTabCodes[32] = { - {5, 0x0000}, - {5, 0x0010}, - {5, 0x0008}, - {5, 0x0018}, - {5, 0x0004}, - {5, 0x0014}, - {5, 0x000c}, - {5, 0x001c}, - {5, 0x0002}, - {5, 0x0012}, - {5, 0x000a}, - {5, 0x001a}, - {5, 0x0006}, - {5, 0x0016}, - {5, 0x000e}, - {0, 0x0000}, - {5, 0x0001}, - {5, 0x0011}, - {5, 0x0009}, - {5, 0x0019}, - {5, 0x0005}, - {5, 0x0015}, - {5, 0x000d}, - {5, 0x001d}, - {5, 0x0003}, - {5, 0x0013}, - {5, 0x000b}, - {5, 0x001b}, - {5, 0x0007}, - {5, 0x0017}, - {5, 0x000f}, - {0, 0x0000} -}; - -FlateHuffmanTab FlateStream::fixedDistCodeTab = { - flateFixedDistCodeTabCodes, 5 -}; - -FlateStream::FlateStream(Stream *strA, int predictor, int columns, - int colors, int bits): - FilterStream(strA) { - if (predictor != 1) { - pred = new StreamPredictor(this, predictor, columns, colors, bits); - if (!pred->isOk()) { - delete pred; - pred = NULL; - } - } else { - pred = NULL; - } - litCodeTab.codes = NULL; - distCodeTab.codes = NULL; - memset(buf, 0, flateWindow); -} - -FlateStream::~FlateStream() { - if (litCodeTab.codes != fixedLitCodeTab.codes) { - gfree(litCodeTab.codes); - } - if (distCodeTab.codes != fixedDistCodeTab.codes) { - gfree(distCodeTab.codes); - } - if (pred) { - delete pred; - } - delete str; -} - -void FlateStream::reset() { - int cmf, flg; - - index = 0; - remain = 0; - codeBuf = 0; - codeSize = 0; - compressedBlock = gFalse; - endOfBlock = gTrue; - eof = gTrue; - - str->reset(); - - // read header - //~ need to look at window size? - endOfBlock = eof = gTrue; - cmf = str->getChar(); - flg = str->getChar(); - if (cmf == EOF || flg == EOF) - return; - if ((cmf & 0x0f) != 0x08) { - error(getPos(), "Unknown compression method in flate stream"); - return; - } - if ((((cmf << 8) + flg) % 31) != 0) { - error(getPos(), "Bad FCHECK in flate stream"); - return; - } - if (flg & 0x20) { - error(getPos(), "FDICT bit set in flate stream"); - return; - } - - eof = gFalse; -} - -int FlateStream::getChar() { - int c; - - if (pred) { - return pred->getChar(); - } - while (remain == 0) { - if (endOfBlock && eof) - return EOF; - readSome(); - } - c = buf[index]; - index = (index + 1) & flateMask; - --remain; - return c; -} - -int FlateStream::lookChar() { - int c; - - if (pred) { - return pred->lookChar(); - } - while (remain == 0) { - if (endOfBlock && eof) - return EOF; - readSome(); - } - c = buf[index]; - return c; -} - -int FlateStream::getRawChar() { - int c; - - while (remain == 0) { - if (endOfBlock && eof) - return EOF; - readSome(); - } - c = buf[index]; - index = (index + 1) & flateMask; - --remain; - return c; -} - -GString *FlateStream::getPSFilter(int psLevel, char *indent) { - GString *s; - - if (psLevel < 3 || pred) { - return NULL; - } - if (!(s = str->getPSFilter(psLevel, indent))) { - return NULL; - } - s->append(indent)->append("<< >> /FlateDecode filter\n"); - return s; -} - -GBool FlateStream::isBinary(GBool last) { - return str->isBinary(gTrue); -} - -void FlateStream::readSome() { - int code1, code2; - int len, dist; - int i, j, k; - int c; - - if (endOfBlock) { - if (!startBlock()) - return; - } - - if (compressedBlock) { - if ((code1 = getHuffmanCodeWord(&litCodeTab)) == EOF) - goto err; - if (code1 < 256) { - buf[index] = code1; - remain = 1; - } else if (code1 == 256) { - endOfBlock = gTrue; - remain = 0; - } else { - code1 -= 257; - code2 = lengthDecode[code1].bits; - if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF) - goto err; - len = lengthDecode[code1].first + code2; - if ((code1 = getHuffmanCodeWord(&distCodeTab)) == EOF) - goto err; - code2 = distDecode[code1].bits; - if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF) - goto err; - dist = distDecode[code1].first + code2; - i = index; - j = (index - dist) & flateMask; - for (k = 0; k < len; ++k) { - buf[i] = buf[j]; - i = (i + 1) & flateMask; - j = (j + 1) & flateMask; - } - remain = len; - } - - } else { - len = (blockLen < flateWindow) ? blockLen : flateWindow; - for (i = 0, j = index; i < len; ++i, j = (j + 1) & flateMask) { - if ((c = str->getChar()) == EOF) { - endOfBlock = eof = gTrue; - break; - } - buf[j] = c & 0xff; - } - remain = i; - blockLen -= len; - if (blockLen == 0) - endOfBlock = gTrue; - } - - return; - -err: - error(getPos(), "Unexpected end of file in flate stream"); - endOfBlock = eof = gTrue; - remain = 0; -} - -GBool FlateStream::startBlock() { - int blockHdr; - int c; - int check; - - // free the code tables from the previous block - if (litCodeTab.codes != fixedLitCodeTab.codes) { - gfree(litCodeTab.codes); - } - litCodeTab.codes = NULL; - if (distCodeTab.codes != fixedDistCodeTab.codes) { - gfree(distCodeTab.codes); - } - distCodeTab.codes = NULL; - - // read block header - blockHdr = getCodeWord(3); - if (blockHdr & 1) - eof = gTrue; - blockHdr >>= 1; - - // uncompressed block - if (blockHdr == 0) { - compressedBlock = gFalse; - if ((c = str->getChar()) == EOF) - goto err; - blockLen = c & 0xff; - if ((c = str->getChar()) == EOF) - goto err; - blockLen |= (c & 0xff) << 8; - if ((c = str->getChar()) == EOF) - goto err; - check = c & 0xff; - if ((c = str->getChar()) == EOF) - goto err; - check |= (c & 0xff) << 8; - if (check != (~blockLen & 0xffff)) - error(getPos(), "Bad uncompressed block length in flate stream"); - codeBuf = 0; - codeSize = 0; - - // compressed block with fixed codes - } else if (blockHdr == 1) { - compressedBlock = gTrue; - loadFixedCodes(); - - // compressed block with dynamic codes - } else if (blockHdr == 2) { - compressedBlock = gTrue; - if (!readDynamicCodes()) { - goto err; - } - - // unknown block type - } else { - goto err; - } - - endOfBlock = gFalse; - return gTrue; - -err: - error(getPos(), "Bad block header in flate stream"); - endOfBlock = eof = gTrue; - return gFalse; -} - -void FlateStream::loadFixedCodes() { - litCodeTab.codes = fixedLitCodeTab.codes; - litCodeTab.maxLen = fixedLitCodeTab.maxLen; - distCodeTab.codes = fixedDistCodeTab.codes; - distCodeTab.maxLen = fixedDistCodeTab.maxLen; -} - -GBool FlateStream::readDynamicCodes() { - int numCodeLenCodes; - int numLitCodes; - int numDistCodes; - int codeLenCodeLengths[flateMaxCodeLenCodes]; - FlateHuffmanTab codeLenCodeTab; - int len, repeat, code; - int i; - - codeLenCodeTab.codes = NULL; - - // read lengths - if ((numLitCodes = getCodeWord(5)) == EOF) { - goto err; - } - numLitCodes += 257; - if ((numDistCodes = getCodeWord(5)) == EOF) { - goto err; - } - numDistCodes += 1; - if ((numCodeLenCodes = getCodeWord(4)) == EOF) { - goto err; - } - numCodeLenCodes += 4; - if (numLitCodes > flateMaxLitCodes || - numDistCodes > flateMaxDistCodes || - numCodeLenCodes > flateMaxCodeLenCodes) { - goto err; - } - - // build the code length code table - for (i = 0; i < flateMaxCodeLenCodes; ++i) { - codeLenCodeLengths[i] = 0; - } - for (i = 0; i < numCodeLenCodes; ++i) { - if ((codeLenCodeLengths[codeLenCodeMap[i]] = getCodeWord(3)) == -1) { - goto err; - } - } - compHuffmanCodes(codeLenCodeLengths, flateMaxCodeLenCodes, &codeLenCodeTab); - - // build the literal and distance code tables - len = 0; - repeat = 0; - i = 0; - while (i < numLitCodes + numDistCodes) { - if ((code = getHuffmanCodeWord(&codeLenCodeTab)) == EOF) { - goto err; - } - if (code == 16) { - if ((repeat = getCodeWord(2)) == EOF) { - goto err; - } - repeat += 3; - if (i + repeat > numLitCodes + numDistCodes) { - goto err; - } - for (; repeat > 0; --repeat) { - codeLengths[i++] = len; - } - } else if (code == 17) { - if ((repeat = getCodeWord(3)) == EOF) { - goto err; - } - repeat += 3; - if (i + repeat > numLitCodes + numDistCodes) { - goto err; - } - len = 0; - for (; repeat > 0; --repeat) { - codeLengths[i++] = 0; - } - } else if (code == 18) { - if ((repeat = getCodeWord(7)) == EOF) { - goto err; - } - repeat += 11; - if (i + repeat > numLitCodes + numDistCodes) { - goto err; - } - len = 0; - for (; repeat > 0; --repeat) { - codeLengths[i++] = 0; - } - } else { - codeLengths[i++] = len = code; - } - } - compHuffmanCodes(codeLengths, numLitCodes, &litCodeTab); - compHuffmanCodes(codeLengths + numLitCodes, numDistCodes, &distCodeTab); - - gfree(codeLenCodeTab.codes); - return gTrue; - -err: - error(getPos(), "Bad dynamic code table in flate stream"); - gfree(codeLenCodeTab.codes); - return gFalse; -} - -// Convert an array of lengths, in value order, into a -// Huffman code lookup table. -void FlateStream::compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab) { - int tabSize, len, code, code2, skip, val, i, t; - - // find max code length - tab->maxLen = 0; - for (val = 0; val < n; ++val) { - if (lengths[val] > tab->maxLen) { - tab->maxLen = lengths[val]; - } - } - - // allocate the table - tabSize = 1 << tab->maxLen; - tab->codes = (FlateCode *)gmallocn(tabSize, sizeof(FlateCode)); - - // clear the table - for (i = 0; i < tabSize; ++i) { - tab->codes[i].len = 0; - tab->codes[i].val = 0; - } - - // build the table - for (len = 1, code = 0, skip = 2; - len <= tab->maxLen; - ++len, code <<= 1, skip <<= 1) { - for (val = 0; val < n; ++val) { - if (lengths[val] == len) { - - // bit-reverse the code - code2 = 0; - t = code; - for (i = 0; i < len; ++i) { - code2 = (code2 << 1) | (t & 1); - t >>= 1; - } - - // fill in the table entries - for (i = code2; i < tabSize; i += skip) { - tab->codes[i].len = (Gushort)len; - tab->codes[i].val = (Gushort)val; - } - - ++code; - } - } - } -} - -int FlateStream::getHuffmanCodeWord(FlateHuffmanTab *tab) { - FlateCode *code; - int c; - - while (codeSize < tab->maxLen) { - if ((c = str->getChar()) == EOF) { - break; - } - codeBuf |= (c & 0xff) << codeSize; - codeSize += 8; - } - code = &tab->codes[codeBuf & ((1 << tab->maxLen) - 1)]; - if (codeSize == 0 || codeSize < code->len || code->len == 0) { - return EOF; - } - codeBuf >>= code->len; - codeSize -= code->len; - return (int)code->val; -} - -int FlateStream::getCodeWord(int bits) { - int c; - - while (codeSize < bits) { - if ((c = str->getChar()) == EOF) - return EOF; - codeBuf |= (c & 0xff) << codeSize; - codeSize += 8; - } - c = codeBuf & ((1 << bits) - 1); - codeBuf >>= bits; - codeSize -= bits; - return c; -} - -//------------------------------------------------------------------------ -// EOFStream -//------------------------------------------------------------------------ - -EOFStream::EOFStream(Stream *strA): - FilterStream(strA) { -} - -EOFStream::~EOFStream() { - delete str; -} - -//------------------------------------------------------------------------ -// FixedLengthEncoder -//------------------------------------------------------------------------ - -FixedLengthEncoder::FixedLengthEncoder(Stream *strA, int lengthA): - FilterStream(strA) { - length = lengthA; - count = 0; -} - -FixedLengthEncoder::~FixedLengthEncoder() { - if (str->isEncoder()) - delete str; -} - -void FixedLengthEncoder::reset() { - str->reset(); - count = 0; -} - -int FixedLengthEncoder::getChar() { - if (length >= 0 && count >= length) - return EOF; - ++count; - return str->getChar(); -} - -int FixedLengthEncoder::lookChar() { - if (length >= 0 && count >= length) - return EOF; - return str->getChar(); -} - -GBool FixedLengthEncoder::isBinary(GBool last) { - return str->isBinary(gTrue); -} - -//------------------------------------------------------------------------ -// ASCIIHexEncoder -//------------------------------------------------------------------------ - -ASCIIHexEncoder::ASCIIHexEncoder(Stream *strA): - FilterStream(strA) { - bufPtr = bufEnd = buf; - lineLen = 0; - eof = gFalse; -} - -ASCIIHexEncoder::~ASCIIHexEncoder() { - if (str->isEncoder()) { - delete str; - } -} - -void ASCIIHexEncoder::reset() { - str->reset(); - bufPtr = bufEnd = buf; - lineLen = 0; - eof = gFalse; -} - -GBool ASCIIHexEncoder::fillBuf() { - static char *hex = "0123456789abcdef"; - int c; - - if (eof) { - return gFalse; - } - bufPtr = bufEnd = buf; - if ((c = str->getChar()) == EOF) { - *bufEnd++ = '>'; - eof = gTrue; - } else { - if (lineLen >= 64) { - *bufEnd++ = '\n'; - lineLen = 0; - } - *bufEnd++ = hex[(c >> 4) & 0x0f]; - *bufEnd++ = hex[c & 0x0f]; - lineLen += 2; - } - return gTrue; -} - -//------------------------------------------------------------------------ -// ASCII85Encoder -//------------------------------------------------------------------------ - -ASCII85Encoder::ASCII85Encoder(Stream *strA): - FilterStream(strA) { - bufPtr = bufEnd = buf; - lineLen = 0; - eof = gFalse; -} - -ASCII85Encoder::~ASCII85Encoder() { - if (str->isEncoder()) - delete str; -} - -void ASCII85Encoder::reset() { - str->reset(); - bufPtr = bufEnd = buf; - lineLen = 0; - eof = gFalse; -} - -GBool ASCII85Encoder::fillBuf() { - Gulong t; - char buf1[5]; - int c0, c1, c2, c3; - int n, i; - - if (eof) { - return gFalse; - } - c0 = str->getChar(); - c1 = str->getChar(); - c2 = str->getChar(); - c3 = str->getChar(); - bufPtr = bufEnd = buf; - if (c3 == EOF) { - if (c0 == EOF) { - n = 0; - t = 0; - } else { - if (c1 == EOF) { - n = 1; - t = c0 << 24; - } else if (c2 == EOF) { - n = 2; - t = (c0 << 24) | (c1 << 16); - } else { - n = 3; - t = (c0 << 24) | (c1 << 16) | (c2 << 8); - } - for (i = 4; i >= 0; --i) { - buf1[i] = (char)(t % 85 + 0x21); - t /= 85; - } - for (i = 0; i <= n; ++i) { - *bufEnd++ = buf1[i]; - if (++lineLen == 65) { - *bufEnd++ = '\n'; - lineLen = 0; - } - } - } - *bufEnd++ = '~'; - *bufEnd++ = '>'; - eof = gTrue; - } else { - t = (c0 << 24) | (c1 << 16) | (c2 << 8) | c3; - if (t == 0) { - *bufEnd++ = 'z'; - if (++lineLen == 65) { - *bufEnd++ = '\n'; - lineLen = 0; - } - } else { - for (i = 4; i >= 0; --i) { - buf1[i] = (char)(t % 85 + 0x21); - t /= 85; - } - for (i = 0; i <= 4; ++i) { - *bufEnd++ = buf1[i]; - if (++lineLen == 65) { - *bufEnd++ = '\n'; - lineLen = 0; - } - } - } - } - return gTrue; -} - -//------------------------------------------------------------------------ -// RunLengthEncoder -//------------------------------------------------------------------------ - -RunLengthEncoder::RunLengthEncoder(Stream *strA): - FilterStream(strA) { - bufPtr = bufEnd = nextEnd = buf; - eof = gFalse; -} - -RunLengthEncoder::~RunLengthEncoder() { - if (str->isEncoder()) - delete str; -} - -void RunLengthEncoder::reset() { - str->reset(); - bufPtr = bufEnd = nextEnd = buf; - eof = gFalse; -} - -// -// When fillBuf finishes, buf[] looks like this: -// +-----+--------------+-----------------+-- -// + tag | ... data ... | next 0, 1, or 2 | -// +-----+--------------+-----------------+-- -// ^ ^ ^ -// bufPtr bufEnd nextEnd -// -GBool RunLengthEncoder::fillBuf() { - int c, c1, c2; - int n; - - // already hit EOF? - if (eof) - return gFalse; - - // grab two bytes - if (nextEnd < bufEnd + 1) { - if ((c1 = str->getChar()) == EOF) { - eof = gTrue; - return gFalse; - } - } else { - c1 = bufEnd[0] & 0xff; - } - if (nextEnd < bufEnd + 2) { - if ((c2 = str->getChar()) == EOF) { - eof = gTrue; - buf[0] = 0; - buf[1] = c1; - bufPtr = buf; - bufEnd = &buf[2]; - return gTrue; - } - } else { - c2 = bufEnd[1] & 0xff; - } - - // check for repeat - c = 0; // make gcc happy - if (c1 == c2) { - n = 2; - while (n < 128 && (c = str->getChar()) == c1) - ++n; - buf[0] = (char)(257 - n); - buf[1] = c1; - bufEnd = &buf[2]; - if (c == EOF) { - eof = gTrue; - } else if (n < 128) { - buf[2] = c; - nextEnd = &buf[3]; - } else { - nextEnd = bufEnd; - } - - // get up to 128 chars - } else { - buf[1] = c1; - buf[2] = c2; - n = 2; - while (n < 128) { - if ((c = str->getChar()) == EOF) { - eof = gTrue; - break; - } - ++n; - buf[n] = c; - if (buf[n] == buf[n-1]) - break; - } - if (buf[n] == buf[n-1]) { - buf[0] = (char)(n-2-1); - bufEnd = &buf[n-1]; - nextEnd = &buf[n+1]; - } else { - buf[0] = (char)(n-1); - bufEnd = nextEnd = &buf[n+1]; - } - } - bufPtr = buf; - return gTrue; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.h deleted file mode 100644 index 4695878e7..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/Stream.h +++ /dev/null @@ -1,861 +0,0 @@ -//======================================================================== -// -// Stream.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef STREAM_H -#define STREAM_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include "gtypes.h" -#include "Object.h" - -class BaseStream; - -//------------------------------------------------------------------------ - -enum StreamKind { - strFile, - strASCIIHex, - strASCII85, - strLZW, - strRunLength, - strCCITTFax, - strDCT, - strFlate, - strJBIG2, - strJPX, - strWeird // internal-use stream types -}; - -enum StreamColorSpaceMode { - streamCSNone, - streamCSDeviceGray, - streamCSDeviceRGB, - streamCSDeviceCMYK, - streamCSDeviceRGBX -}; - -//------------------------------------------------------------------------ - -// This is in Stream.h instead of Decrypt.h to avoid really annoying -// include file dependency loops. -enum CryptAlgorithm { - cryptRC4, - cryptAES -}; - -//------------------------------------------------------------------------ -// Stream (base class) -//------------------------------------------------------------------------ - -class Stream { -public: - - // Constructor. - Stream(); - - // Destructor. - virtual ~Stream(); - - // Reference counting. - int incRef() { return ++ref; } - int decRef() { return --ref; } - - // Get kind of stream. - virtual StreamKind getKind() = 0; - - // Reset stream to beginning. - virtual void reset() = 0; - - // Close down the stream. - virtual void close(); - - // Get next char from stream. - virtual int getChar() = 0; - - // Peek at next char in stream. - virtual int lookChar() = 0; - - // Get next char from stream without using the predictor. - // This is only used by StreamPredictor. - virtual int getRawChar(); - - // Get next line from stream. - virtual char *getLine(char *buf, int size); - - // Get current position in file. - virtual int getPos() = 0; - - // Go to a position in the stream. If is negative, the - // position is from the end of the file; otherwise the position is - // from the start of the file. - virtual void setPos(Guint pos, int dir = 0) = 0; - - // Get PostScript command for the filter(s). - virtual GString *getPSFilter(int psLevel, char *indent); - - // Does this stream type potentially contain non-printable chars? - virtual GBool isBinary(GBool last = gTrue) = 0; - - // Get the BaseStream of this stream. - virtual BaseStream *getBaseStream() = 0; - - // Get the stream after the last decoder (this may be a BaseStream - // or a DecryptStream). - virtual Stream *getUndecodedStream() = 0; - - // Get the dictionary associated with this stream. - virtual Dict *getDict() = 0; - - // Is this an encoding filter? - virtual GBool isEncoder() { return gFalse; } - - // Get image parameters which are defined by the stream contents. - virtual void getImageParams(int *bitsPerComponent, - StreamColorSpaceMode *csMode) {} - - // Return the next stream in the "stack". - virtual Stream *getNextStream() { return NULL; } - - // Add filters to this stream according to the parameters in . - // Returns the new stream. - Stream *addFilters(Object *dict); - -private: - - Stream *makeFilter(char *name, Stream *str, Object *params); - - int ref; // reference count -}; - -//------------------------------------------------------------------------ -// BaseStream -// -// This is the base class for all streams that read directly from a file. -//------------------------------------------------------------------------ - -class BaseStream: public Stream { -public: - - BaseStream(Object *dictA); - virtual ~BaseStream(); - virtual Stream *makeSubStream(Guint start, GBool limited, - Guint length, Object *dict) = 0; - virtual void setPos(Guint pos, int dir = 0) = 0; - virtual GBool isBinary(GBool last = gTrue) { return last; } - virtual BaseStream *getBaseStream() { return this; } - virtual Stream *getUndecodedStream() { return this; } - virtual Dict *getDict() { return dict.getDict(); } - virtual GString *getFileName() { return NULL; } - - // Get/set position of first byte of stream within the file. - virtual Guint getStart() = 0; - virtual void moveStart(int delta) = 0; - -private: - - Object dict; -}; - -//------------------------------------------------------------------------ -// FilterStream -// -// This is the base class for all streams that filter another stream. -//------------------------------------------------------------------------ - -class FilterStream: public Stream { -public: - - FilterStream(Stream *strA); - virtual ~FilterStream(); - virtual void close(); - virtual int getPos() { return str->getPos(); } - virtual void setPos(Guint pos, int dir = 0); - virtual BaseStream *getBaseStream() { return str->getBaseStream(); } - virtual Stream *getUndecodedStream() { return str->getUndecodedStream(); } - virtual Dict *getDict() { return str->getDict(); } - virtual Stream *getNextStream() { return str; } - -protected: - - Stream *str; -}; - -//------------------------------------------------------------------------ -// ImageStream -//------------------------------------------------------------------------ - -class ImageStream { -public: - - // Create an image stream object for an image with the specified - // parameters. Note that these are the actual image parameters, - // which may be different from the predictor parameters. - ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA); - - ~ImageStream(); - - // Reset the stream. - void reset(); - - // Gets the next pixel from the stream. should be able to hold - // at least nComps elements. Returns false at end of file. - GBool getPixel(Guchar *pix); - - // Returns a pointer to the next line of pixels. Returns NULL at - // end of file. - Guchar *getLine(); - - // Skip an entire line from the image. - void skipLine(); - -private: - - Stream *str; // base stream - int width; // pixels per line - int nComps; // components per pixel - int nBits; // bits per component - int nVals; // components per line - Guchar *imgLine; // line buffer - int imgIdx; // current index in imgLine -}; - -//------------------------------------------------------------------------ -// StreamPredictor -//------------------------------------------------------------------------ - -class StreamPredictor { -public: - - // Create a predictor object. Note that the parameters are for the - // predictor, and may not match the actual image parameters. - StreamPredictor(Stream *strA, int predictorA, - int widthA, int nCompsA, int nBitsA); - - ~StreamPredictor(); - - GBool isOk() { return ok; } - - int lookChar(); - int getChar(); - -private: - - GBool getNextLine(); - - Stream *str; // base stream - int predictor; // predictor - int width; // pixels per line - int nComps; // components per pixel - int nBits; // bits per component - int nVals; // components per line - int pixBytes; // bytes per pixel - int rowBytes; // bytes per line - Guchar *predLine; // line buffer - int predIdx; // current index in predLine - GBool ok; -}; - -//------------------------------------------------------------------------ -// FileStream -//------------------------------------------------------------------------ - -#define fileStreamBufSize 256 - -class FileStream: public BaseStream { -public: - - FileStream(FILE *fA, Guint startA, GBool limitedA, - Guint lengthA, Object *dictA); - virtual ~FileStream(); - virtual Stream *makeSubStream(Guint startA, GBool limitedA, - Guint lengthA, Object *dictA); - virtual StreamKind getKind() { return strFile; } - virtual void reset(); - virtual void close(); - virtual int getChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } - virtual int lookChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } - virtual int getPos() { return bufPos + (bufPtr - buf); } - virtual void setPos(Guint pos, int dir = 0); - virtual Guint getStart() { return start; } - virtual void moveStart(int delta); - -private: - - GBool fillBuf(); - - FILE *f; - Guint start; - GBool limited; - Guint length; - char buf[fileStreamBufSize]; - char *bufPtr; - char *bufEnd; - Guint bufPos; - int savePos; - GBool saved; -}; - -//------------------------------------------------------------------------ -// MemStream -//------------------------------------------------------------------------ - -class MemStream: public BaseStream { -public: - - MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA); - virtual ~MemStream(); - virtual Stream *makeSubStream(Guint start, GBool limited, - Guint lengthA, Object *dictA); - virtual StreamKind getKind() { return strWeird; } - virtual void reset(); - virtual void close(); - virtual int getChar() - { return (bufPtr < bufEnd) ? (*bufPtr++ & 0xff) : EOF; } - virtual int lookChar() - { return (bufPtr < bufEnd) ? (*bufPtr & 0xff) : EOF; } - virtual int getPos() { return (int)(bufPtr - buf); } - virtual void setPos(Guint pos, int dir = 0); - virtual Guint getStart() { return start; } - virtual void moveStart(int delta); - -private: - - char *buf; - Guint start; - Guint length; - char *bufEnd; - char *bufPtr; - GBool needFree; -}; - -//------------------------------------------------------------------------ -// EmbedStream -// -// This is a special stream type used for embedded streams (inline -// images). It reads directly from the base stream -- after the -// EmbedStream is deleted, reads from the base stream will proceed where -// the BaseStream left off. Note that this is very different behavior -// that creating a new FileStream (using makeSubStream). -//------------------------------------------------------------------------ - -class EmbedStream: public BaseStream { -public: - - EmbedStream(Stream *strA, Object *dictA, GBool limitedA, Guint lengthA); - virtual ~EmbedStream(); - virtual Stream *makeSubStream(Guint start, GBool limitedA, - Guint lengthA, Object *dictA); - virtual StreamKind getKind() { return str->getKind(); } - virtual void reset() {} - virtual int getChar(); - virtual int lookChar(); - virtual int getPos() { return str->getPos(); } - virtual void setPos(Guint pos, int dir = 0); - virtual Guint getStart(); - virtual void moveStart(int delta); - -private: - - Stream *str; - GBool limited; - Guint length; -}; - -//------------------------------------------------------------------------ -// ASCIIHexStream -//------------------------------------------------------------------------ - -class ASCIIHexStream: public FilterStream { -public: - - ASCIIHexStream(Stream *strA); - virtual ~ASCIIHexStream(); - virtual StreamKind getKind() { return strASCIIHex; } - virtual void reset(); - virtual int getChar() - { int c = lookChar(); buf = EOF; return c; } - virtual int lookChar(); - virtual GString *getPSFilter(int psLevel, char *indent); - virtual GBool isBinary(GBool last = gTrue); - -private: - - int buf; - GBool eof; -}; - -//------------------------------------------------------------------------ -// ASCII85Stream -//------------------------------------------------------------------------ - -class ASCII85Stream: public FilterStream { -public: - - ASCII85Stream(Stream *strA); - virtual ~ASCII85Stream(); - virtual StreamKind getKind() { return strASCII85; } - virtual void reset(); - virtual int getChar() - { int ch = lookChar(); ++index; return ch; } - virtual int lookChar(); - virtual GString *getPSFilter(int psLevel, char *indent); - virtual GBool isBinary(GBool last = gTrue); - -private: - - int c[5]; - int b[4]; - int index, n; - GBool eof; -}; - -//------------------------------------------------------------------------ -// LZWStream -//------------------------------------------------------------------------ - -class LZWStream: public FilterStream { -public: - - LZWStream(Stream *strA, int predictor, int columns, int colors, - int bits, int earlyA); - virtual ~LZWStream(); - virtual StreamKind getKind() { return strLZW; } - virtual void reset(); - virtual int getChar(); - virtual int lookChar(); - virtual int getRawChar(); - virtual GString *getPSFilter(int psLevel, char *indent); - virtual GBool isBinary(GBool last = gTrue); - -private: - - StreamPredictor *pred; // predictor - int early; // early parameter - GBool eof; // true if at eof - int inputBuf; // input buffer - int inputBits; // number of bits in input buffer - struct { // decoding table - int length; - int head; - Guchar tail; - } table[4097]; - int nextCode; // next code to be used - int nextBits; // number of bits in next code word - int prevCode; // previous code used in stream - int newChar; // next char to be added to table - Guchar seqBuf[4097]; // buffer for current sequence - int seqLength; // length of current sequence - int seqIndex; // index into current sequence - GBool first; // first code after a table clear - - GBool processNextCode(); - void clearTable(); - int getCode(); -}; - -//------------------------------------------------------------------------ -// RunLengthStream -//------------------------------------------------------------------------ - -class RunLengthStream: public FilterStream { -public: - - RunLengthStream(Stream *strA); - virtual ~RunLengthStream(); - virtual StreamKind getKind() { return strRunLength; } - virtual void reset(); - virtual int getChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } - virtual int lookChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } - virtual GString *getPSFilter(int psLevel, char *indent); - virtual GBool isBinary(GBool last = gTrue); - -private: - - char buf[128]; // buffer - char *bufPtr; // next char to read - char *bufEnd; // end of buffer - GBool eof; - - GBool fillBuf(); -}; - -//------------------------------------------------------------------------ -// CCITTFaxStream -//------------------------------------------------------------------------ - -struct CCITTCodeTable; - -class CCITTFaxStream: public FilterStream { -public: - - CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA, - GBool byteAlignA, int columnsA, int rowsA, - GBool endOfBlockA, GBool blackA); - virtual ~CCITTFaxStream(); - virtual StreamKind getKind() { return strCCITTFax; } - virtual void reset(); - virtual int getChar() - { int c = lookChar(); buf = EOF; return c; } - virtual int lookChar(); - virtual GString *getPSFilter(int psLevel, char *indent); - virtual GBool isBinary(GBool last = gTrue); - -private: - - int encoding; // 'K' parameter - GBool endOfLine; // 'EndOfLine' parameter - GBool byteAlign; // 'EncodedByteAlign' parameter - int columns; // 'Columns' parameter - int rows; // 'Rows' parameter - GBool endOfBlock; // 'EndOfBlock' parameter - GBool black; // 'BlackIs1' parameter - GBool eof; // true if at eof - GBool nextLine2D; // true if next line uses 2D encoding - int row; // current row - int inputBuf; // input buffer - int inputBits; // number of bits in input buffer - int *codingLine; // coding line changing elements - int *refLine; // reference line changing elements - int a0i; // index into codingLine - GBool err; // error on current line - int outputBits; // remaining ouput bits - int buf; // character buffer - - void addPixels(int a1, int black); - void addPixelsNeg(int a1, int black); - short getTwoDimCode(); - short getWhiteCode(); - short getBlackCode(); - short lookBits(int n); - void eatBits(int n) { if ((inputBits -= n) < 0) inputBits = 0; } -}; - -//------------------------------------------------------------------------ -// DCTStream -//------------------------------------------------------------------------ - -// DCT component info -struct DCTCompInfo { - int id; // component ID - int hSample, vSample; // horiz/vert sampling resolutions - int quantTable; // quantization table number - int prevDC; // DC coefficient accumulator -}; - -struct DCTScanInfo { - GBool comp[4]; // comp[i] is set if component i is - // included in this scan - int numComps; // number of components in the scan - int dcHuffTable[4]; // DC Huffman table numbers - int acHuffTable[4]; // AC Huffman table numbers - int firstCoeff, lastCoeff; // first and last DCT coefficient - int ah, al; // successive approximation parameters -}; - -// DCT Huffman decoding table -struct DCTHuffTable { - Guchar firstSym[17]; // first symbol for this bit length - Gushort firstCode[17]; // first code for this bit length - Gushort numCodes[17]; // number of codes of this bit length - Guchar sym[256]; // symbols -}; - -class DCTStream: public FilterStream { -public: - - DCTStream(Stream *strA, int colorXformA); - virtual ~DCTStream(); - virtual StreamKind getKind() { return strDCT; } - virtual void reset(); - virtual void close(); - virtual int getChar(); - virtual int lookChar(); - virtual GString *getPSFilter(int psLevel, char *indent); - virtual GBool isBinary(GBool last = gTrue); - Stream *getRawStream() { return str; } - -private: - - GBool progressive; // set if in progressive mode - GBool interleaved; // set if in interleaved mode - int width, height; // image size - int mcuWidth, mcuHeight; // size of min coding unit, in data units - int bufWidth, bufHeight; // frameBuf size - DCTCompInfo compInfo[4]; // info for each component - DCTScanInfo scanInfo; // info for the current scan - int numComps; // number of components in image - int colorXform; // color transform: -1 = unspecified - // 0 = none - // 1 = YUV/YUVK -> RGB/CMYK - GBool gotJFIFMarker; // set if APP0 JFIF marker was present - GBool gotAdobeMarker; // set if APP14 Adobe marker was present - int restartInterval; // restart interval, in MCUs - Gushort quantTables[4][64]; // quantization tables - int numQuantTables; // number of quantization tables - DCTHuffTable dcHuffTables[4]; // DC Huffman tables - DCTHuffTable acHuffTables[4]; // AC Huffman tables - int numDCHuffTables; // number of DC Huffman tables - int numACHuffTables; // number of AC Huffman tables - Guchar *rowBuf[4][32]; // buffer for one MCU (non-progressive mode) - int *frameBuf[4]; // buffer for frame (progressive mode) - int comp, x, y, dy; // current position within image/MCU - int restartCtr; // MCUs left until restart - int restartMarker; // next restart marker - int eobRun; // number of EOBs left in the current run - int inputBuf; // input buffer for variable length codes - int inputBits; // number of valid bits in input buffer - - void restart(); - GBool readMCURow(); - void readScan(); - GBool readDataUnit(DCTHuffTable *dcHuffTable, - DCTHuffTable *acHuffTable, - int *prevDC, int data[64]); - GBool readProgressiveDataUnit(DCTHuffTable *dcHuffTable, - DCTHuffTable *acHuffTable, - int *prevDC, int data[64]); - void decodeImage(); - void transformDataUnit(Gushort *quantTable, - int dataIn[64], Guchar dataOut[64]); - int readHuffSym(DCTHuffTable *table); - int readAmp(int size); - int readBit(); - GBool readHeader(); - GBool readBaselineSOF(); - GBool readProgressiveSOF(); - GBool readScanInfo(); - GBool readQuantTables(); - GBool readHuffmanTables(); - GBool readRestartInterval(); - GBool readJFIFMarker(); - GBool readAdobeMarker(); - GBool readTrailer(); - int readMarker(); - int read16(); -}; - -//------------------------------------------------------------------------ -// FlateStream -//------------------------------------------------------------------------ - -#define flateWindow 32768 // buffer size -#define flateMask (flateWindow-1) -#define flateMaxHuffman 15 // max Huffman code length -#define flateMaxCodeLenCodes 19 // max # code length codes -#define flateMaxLitCodes 288 // max # literal codes -#define flateMaxDistCodes 30 // max # distance codes - -// Huffman code table entry -struct FlateCode { - Gushort len; // code length, in bits - Gushort val; // value represented by this code -}; - -struct FlateHuffmanTab { - FlateCode *codes; - int maxLen; -}; - -// Decoding info for length and distance code words -struct FlateDecode { - int bits; // # extra bits - int first; // first length/distance -}; - -class FlateStream: public FilterStream { -public: - - FlateStream(Stream *strA, int predictor, int columns, - int colors, int bits); - virtual ~FlateStream(); - virtual StreamKind getKind() { return strFlate; } - virtual void reset(); - virtual int getChar(); - virtual int lookChar(); - virtual int getRawChar(); - virtual GString *getPSFilter(int psLevel, char *indent); - virtual GBool isBinary(GBool last = gTrue); - -private: - - StreamPredictor *pred; // predictor - Guchar buf[flateWindow]; // output data buffer - int index; // current index into output buffer - int remain; // number valid bytes in output buffer - int codeBuf; // input buffer - int codeSize; // number of bits in input buffer - int // literal and distance code lengths - codeLengths[flateMaxLitCodes + flateMaxDistCodes]; - FlateHuffmanTab litCodeTab; // literal code table - FlateHuffmanTab distCodeTab; // distance code table - GBool compressedBlock; // set if reading a compressed block - int blockLen; // remaining length of uncompressed block - GBool endOfBlock; // set when end of block is reached - GBool eof; // set when end of stream is reached - - static int // code length code reordering - codeLenCodeMap[flateMaxCodeLenCodes]; - static FlateDecode // length decoding info - lengthDecode[flateMaxLitCodes-257]; - static FlateDecode // distance decoding info - distDecode[flateMaxDistCodes]; - static FlateHuffmanTab // fixed literal code table - fixedLitCodeTab; - static FlateHuffmanTab // fixed distance code table - fixedDistCodeTab; - - void readSome(); - GBool startBlock(); - void loadFixedCodes(); - GBool readDynamicCodes(); - void compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab); - int getHuffmanCodeWord(FlateHuffmanTab *tab); - int getCodeWord(int bits); -}; - -//------------------------------------------------------------------------ -// EOFStream -//------------------------------------------------------------------------ - -class EOFStream: public FilterStream { -public: - - EOFStream(Stream *strA); - virtual ~EOFStream(); - virtual StreamKind getKind() { return strWeird; } - virtual void reset() {} - virtual int getChar() { return EOF; } - virtual int lookChar() { return EOF; } - virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } - virtual GBool isBinary(GBool last = gTrue) { return gFalse; } -}; - -//------------------------------------------------------------------------ -// FixedLengthEncoder -//------------------------------------------------------------------------ - -class FixedLengthEncoder: public FilterStream { -public: - - FixedLengthEncoder(Stream *strA, int lengthA); - ~FixedLengthEncoder(); - virtual StreamKind getKind() { return strWeird; } - virtual void reset(); - virtual int getChar(); - virtual int lookChar(); - virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } - virtual GBool isBinary(GBool last = gTrue); - virtual GBool isEncoder() { return gTrue; } - -private: - - int length; - int count; -}; - -//------------------------------------------------------------------------ -// ASCIIHexEncoder -//------------------------------------------------------------------------ - -class ASCIIHexEncoder: public FilterStream { -public: - - ASCIIHexEncoder(Stream *strA); - virtual ~ASCIIHexEncoder(); - virtual StreamKind getKind() { return strWeird; } - virtual void reset(); - virtual int getChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } - virtual int lookChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } - virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } - virtual GBool isBinary(GBool last = gTrue) { return gFalse; } - virtual GBool isEncoder() { return gTrue; } - -private: - - char buf[4]; - char *bufPtr; - char *bufEnd; - int lineLen; - GBool eof; - - GBool fillBuf(); -}; - -//------------------------------------------------------------------------ -// ASCII85Encoder -//------------------------------------------------------------------------ - -class ASCII85Encoder: public FilterStream { -public: - - ASCII85Encoder(Stream *strA); - virtual ~ASCII85Encoder(); - virtual StreamKind getKind() { return strWeird; } - virtual void reset(); - virtual int getChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } - virtual int lookChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } - virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } - virtual GBool isBinary(GBool last = gTrue) { return gFalse; } - virtual GBool isEncoder() { return gTrue; } - -private: - - char buf[8]; - char *bufPtr; - char *bufEnd; - int lineLen; - GBool eof; - - GBool fillBuf(); -}; - -//------------------------------------------------------------------------ -// RunLengthEncoder -//------------------------------------------------------------------------ - -class RunLengthEncoder: public FilterStream { -public: - - RunLengthEncoder(Stream *strA); - virtual ~RunLengthEncoder(); - virtual StreamKind getKind() { return strWeird; } - virtual void reset(); - virtual int getChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); } - virtual int lookChar() - { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); } - virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; } - virtual GBool isBinary(GBool last = gTrue) { return gTrue; } - virtual GBool isEncoder() { return gTrue; } - -private: - - char buf[131]; - char *bufPtr; - char *bufEnd; - char *nextEnd; - GBool eof; - - GBool fillBuf(); -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.cc deleted file mode 100644 index a78f0ee8d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.cc +++ /dev/null @@ -1,4090 +0,0 @@ -//======================================================================== -// -// TextOutputDev.cc -// -// Copyright 1997-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#include -#ifdef WIN32 -#include // for O_BINARY -#include // for setmode -#endif -#include "gmem.h" -#include "GString.h" -#include "GList.h" -#include "config.h" -#include "Error.h" -#include "GlobalParams.h" -#include "UnicodeMap.h" -#include "UnicodeTypeTable.h" -#include "GfxState.h" -#include "Link.h" -#include "TextOutputDev.h" - -#ifdef MACOS -// needed for setting type/creator of MacOS files -#include "ICSupport.h" -#endif - -//------------------------------------------------------------------------ -// parameters -//------------------------------------------------------------------------ - -// Each bucket in a text pool includes baselines within a range of -// this many points. -#define textPoolStep 4 - -// Inter-character space width which will cause addChar to start a new -// word. -#define minWordBreakSpace 0.1 - -// Negative inter-character space width, i.e., overlap, which will -// cause addChar to start a new word. -#define minDupBreakOverlap 0.2 - -// Max distance between baselines of two lines within a block, as a -// fraction of the font size. -#define maxLineSpacingDelta 1.5 - -// Max difference in primary font sizes on two lines in the same -// block. Delta1 is used when examining new lines above and below the -// current block; delta2 is used when examining text that overlaps the -// current block; delta3 is used when examining text to the left and -// right of the current block. -#define maxBlockFontSizeDelta1 0.05 -#define maxBlockFontSizeDelta2 0.6 -#define maxBlockFontSizeDelta3 0.2 - -// Max difference in font sizes inside a word. -#define maxWordFontSizeDelta 0.05 - -// Maximum distance between baselines of two words on the same line, -// e.g., distance between subscript or superscript and the primary -// baseline, as a fraction of the font size. -#define maxIntraLineDelta 0.5 - -// Minimum inter-word spacing, as a fraction of the font size. (Only -// used for raw ordering.) -#define minWordSpacing 0.15 - -// Maximum inter-word spacing, as a fraction of the font size. -#define maxWordSpacing 1.5 - -// Maximum horizontal spacing which will allow a word to be pulled -// into a block. -#define minColSpacing1 0.3 - -// Minimum spacing between columns, as a fraction of the font size. -#define minColSpacing2 1.0 - -// Maximum vertical spacing between blocks within a flow, as a -// multiple of the font size. -#define maxBlockSpacing 2.5 - -// Minimum spacing between characters within a word, as a fraction of -// the font size. -#define minCharSpacing -0.2 - -// Maximum spacing between characters within a word, as a fraction of -// the font size, when there is no obvious extra-wide character -// spacing. -#define maxCharSpacing 0.03 - -// When extra-wide character spacing is detected, the inter-character -// space threshold is set to the minimum inter-character space -// multiplied by this constant. -#define maxWideCharSpacingMul 1.3 - -// Upper limit on spacing between characters in a word. -#define maxWideCharSpacing 0.4 - -// Max difference in primary,secondary coordinates (as a fraction of -// the font size) allowed for duplicated text (fake boldface, drop -// shadows) which is to be discarded. -#define dupMaxPriDelta 0.1 -#define dupMaxSecDelta 0.2 - -// Max width of underlines (in points). -#define maxUnderlineWidth 3 - -// Min distance between baseline and underline (in points). -//~ this should be font-size-dependent -#define minUnderlineGap -2 - -// Max distance between baseline and underline (in points). -//~ this should be font-size-dependent -#define maxUnderlineGap 4 - -// Max horizontal distance between edge of word and start of underline -// (in points). -//~ this should be font-size-dependent -#define underlineSlack 1 - -// Max distance between edge of text and edge of link border -#define hyperlinkSlack 2 - -//------------------------------------------------------------------------ -// TextUnderline -//------------------------------------------------------------------------ - -class TextUnderline { -public: - - TextUnderline(double x0A, double y0A, double x1A, double y1A) - { x0 = x0A; y0 = y0A; x1 = x1A; y1 = y1A; horiz = y0 == y1; } - ~TextUnderline() {} - - double x0, y0, x1, y1; - GBool horiz; -}; - -//------------------------------------------------------------------------ -// TextLink -//------------------------------------------------------------------------ - -class TextLink { -public: - - TextLink(int xMinA, int yMinA, int xMaxA, int yMaxA, Link *linkA) - { xMin = xMinA; yMin = yMinA; xMax = xMaxA; yMax = yMaxA; link = linkA; } - ~TextLink() {} - - int xMin, yMin, xMax, yMax; - Link *link; -}; - -//------------------------------------------------------------------------ -// TextFontInfo -//------------------------------------------------------------------------ - -TextFontInfo::TextFontInfo(GfxState *state) { - gfxFont = state->getFont(); -#if TEXTOUT_WORD_LIST - fontName = (gfxFont && gfxFont->getOrigName()) - ? gfxFont->getOrigName()->copy() - : (GString *)NULL; - flags = gfxFont ? gfxFont->getFlags() : 0; -#endif -} - -TextFontInfo::~TextFontInfo() { -#if TEXTOUT_WORD_LIST - if (fontName) { - delete fontName; - } -#endif -} - -GBool TextFontInfo::matches(GfxState *state) { - return state->getFont() == gfxFont; -} - -//------------------------------------------------------------------------ -// TextWord -//------------------------------------------------------------------------ - -TextWord::TextWord(GfxState *state, int rotA, double x0, double y0, - int charPosA, TextFontInfo *fontA, double fontSizeA) { - GfxFont *gfxFont; - double x, y, ascent, descent; - - rot = rotA; - charPos = charPosA; - charLen = 0; - font = fontA; - fontSize = fontSizeA; - state->transform(x0, y0, &x, &y); - if ((gfxFont = font->gfxFont)) { - ascent = gfxFont->getAscent() * fontSize; - descent = gfxFont->getDescent() * fontSize; - } else { - // this means that the PDF file draws text without a current font, - // which should never happen - ascent = 0.95 * fontSize; - descent = -0.35 * fontSize; - } - switch (rot) { - case 0: - yMin = y - ascent; - yMax = y - descent; - if (yMin == yMax) { - // this is a sanity check for a case that shouldn't happen -- but - // if it does happen, we want to avoid dividing by zero later - yMin = y; - yMax = y + 1; - } - base = y; - break; - case 1: - xMin = x + descent; - xMax = x + ascent; - if (xMin == xMax) { - // this is a sanity check for a case that shouldn't happen -- but - // if it does happen, we want to avoid dividing by zero later - xMin = x; - xMax = x + 1; - } - base = x; - break; - case 2: - yMin = y + descent; - yMax = y + ascent; - if (yMin == yMax) { - // this is a sanity check for a case that shouldn't happen -- but - // if it does happen, we want to avoid dividing by zero later - yMin = y; - yMax = y + 1; - } - base = y; - break; - case 3: - xMin = x - ascent; - xMax = x - descent; - if (xMin == xMax) { - // this is a sanity check for a case that shouldn't happen -- but - // if it does happen, we want to avoid dividing by zero later - xMin = x; - xMax = x + 1; - } - base = x; - break; - } - text = NULL; - edge = NULL; - len = size = 0; - spaceAfter = gFalse; - next = NULL; - -#if TEXTOUT_WORD_LIST - GfxRGB rgb; - - if ((state->getRender() & 3) == 1) { - state->getStrokeRGB(&rgb); - } else { - state->getFillRGB(&rgb); - } - colorR = colToDbl(rgb.r); - colorG = colToDbl(rgb.g); - colorB = colToDbl(rgb.b); -#endif - - underlined = gFalse; - link = NULL; -} - -TextWord::~TextWord() { - gfree(text); - gfree(edge); -} - -void TextWord::addChar(GfxState *state, double x, double y, - double dx, double dy, Unicode u) { - if (len == size) { - size += 16; - text = (Unicode *)greallocn(text, size, sizeof(Unicode)); - edge = (double *)greallocn(edge, size + 1, sizeof(double)); - } - text[len] = u; - switch (rot) { - case 0: - if (len == 0) { - xMin = x; - } - edge[len] = x; - xMax = edge[len+1] = x + dx; - break; - case 1: - if (len == 0) { - yMin = y; - } - edge[len] = y; - yMax = edge[len+1] = y + dy; - break; - case 2: - if (len == 0) { - xMax = x; - } - edge[len] = x; - xMin = edge[len+1] = x + dx; - break; - case 3: - if (len == 0) { - yMax = y; - } - edge[len] = y; - yMin = edge[len+1] = y + dy; - break; - } - ++len; -} - -void TextWord::merge(TextWord *word) { - int i; - - if (word->xMin < xMin) { - xMin = word->xMin; - } - if (word->yMin < yMin) { - yMin = word->yMin; - } - if (word->xMax > xMax) { - xMax = word->xMax; - } - if (word->yMax > yMax) { - yMax = word->yMax; - } - if (len + word->len > size) { - size = len + word->len; - text = (Unicode *)greallocn(text, size, sizeof(Unicode)); - edge = (double *)greallocn(edge, size + 1, sizeof(double)); - } - for (i = 0; i < word->len; ++i) { - text[len + i] = word->text[i]; - edge[len + i] = word->edge[i]; - } - edge[len + word->len] = word->edge[word->len]; - len += word->len; - charLen += word->charLen; -} - -inline int TextWord::primaryCmp(TextWord *word) { - double cmp; - - cmp = 0; // make gcc happy - switch (rot) { - case 0: - cmp = xMin - word->xMin; - break; - case 1: - cmp = yMin - word->yMin; - break; - case 2: - cmp = word->xMax - xMax; - break; - case 3: - cmp = word->yMax - yMax; - break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -double TextWord::primaryDelta(TextWord *word) { - double delta; - - delta = 0; // make gcc happy - switch (rot) { - case 0: - delta = word->xMin - xMax; - break; - case 1: - delta = word->yMin - yMax; - break; - case 2: - delta = xMin - word->xMax; - break; - case 3: - delta = yMin - word->yMax; - break; - } - return delta; -} - -int TextWord::cmpYX(const void *p1, const void *p2) { - TextWord *word1 = *(TextWord **)p1; - TextWord *word2 = *(TextWord **)p2; - double cmp; - - cmp = word1->yMin - word2->yMin; - if (cmp == 0) { - cmp = word1->xMin - word2->xMin; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -#if TEXTOUT_WORD_LIST - -GString *TextWord::getText() { - GString *s; - UnicodeMap *uMap; - char buf[8]; - int n, i; - - s = new GString(); - if (!(uMap = globalParams->getTextEncoding())) { - return s; - } - for (i = 0; i < len; ++i) { - n = uMap->mapUnicode(text[i], buf, sizeof(buf)); - s->append(buf, n); - } - uMap->decRefCnt(); - return s; -} - -void TextWord::getCharBBox(int charIdx, double *xMinA, double *yMinA, - double *xMaxA, double *yMaxA) { - if (charIdx < 0 || charIdx >= len) { - return; - } - switch (rot) { - case 0: - *xMinA = edge[charIdx]; - *xMaxA = edge[charIdx + 1]; - *yMinA = yMin; - *yMaxA = yMax; - break; - case 1: - *xMinA = xMin; - *xMaxA = xMax; - *yMinA = edge[charIdx]; - *yMaxA = edge[charIdx + 1]; - break; - case 2: - *xMinA = edge[charIdx + 1]; - *xMaxA = edge[charIdx]; - *yMinA = yMin; - *yMaxA = yMax; - break; - case 3: - *xMinA = xMin; - *xMaxA = xMax; - *yMinA = edge[charIdx + 1]; - *yMaxA = edge[charIdx]; - break; - } -} - -#endif // TEXTOUT_WORD_LIST - -//------------------------------------------------------------------------ -// TextPool -//------------------------------------------------------------------------ - -TextPool::TextPool() { - minBaseIdx = 0; - maxBaseIdx = -1; - pool = NULL; - cursor = NULL; - cursorBaseIdx = -1; -} - -TextPool::~TextPool() { - int baseIdx; - TextWord *word, *word2; - - for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) { - for (word = pool[baseIdx - minBaseIdx]; word; word = word2) { - word2 = word->next; - delete word; - } - } - gfree(pool); -} - -int TextPool::getBaseIdx(double base) { - int baseIdx; - - baseIdx = (int)(base / textPoolStep); - if (baseIdx < minBaseIdx) { - return minBaseIdx; - } - if (baseIdx > maxBaseIdx) { - return maxBaseIdx; - } - return baseIdx; -} - -void TextPool::addWord(TextWord *word) { - TextWord **newPool; - int wordBaseIdx, newMinBaseIdx, newMaxBaseIdx, baseIdx; - TextWord *w0, *w1; - - // expand the array if needed - wordBaseIdx = (int)(word->base / textPoolStep); - if (minBaseIdx > maxBaseIdx) { - minBaseIdx = wordBaseIdx - 128; - maxBaseIdx = wordBaseIdx + 128; - pool = (TextWord **)gmallocn(maxBaseIdx - minBaseIdx + 1, - sizeof(TextWord *)); - for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) { - pool[baseIdx - minBaseIdx] = NULL; - } - } else if (wordBaseIdx < minBaseIdx) { - newMinBaseIdx = wordBaseIdx - 128; - newPool = (TextWord **)gmallocn(maxBaseIdx - newMinBaseIdx + 1, - sizeof(TextWord *)); - for (baseIdx = newMinBaseIdx; baseIdx < minBaseIdx; ++baseIdx) { - newPool[baseIdx - newMinBaseIdx] = NULL; - } - memcpy(&newPool[minBaseIdx - newMinBaseIdx], pool, - (maxBaseIdx - minBaseIdx + 1) * sizeof(TextWord *)); - gfree(pool); - pool = newPool; - minBaseIdx = newMinBaseIdx; - } else if (wordBaseIdx > maxBaseIdx) { - newMaxBaseIdx = wordBaseIdx + 128; - pool = (TextWord **)greallocn(pool, newMaxBaseIdx - minBaseIdx + 1, - sizeof(TextWord *)); - for (baseIdx = maxBaseIdx + 1; baseIdx <= newMaxBaseIdx; ++baseIdx) { - pool[baseIdx - minBaseIdx] = NULL; - } - maxBaseIdx = newMaxBaseIdx; - } - - // insert the new word - if (cursor && wordBaseIdx == cursorBaseIdx && - word->primaryCmp(cursor) > 0) { - w0 = cursor; - w1 = cursor->next; - } else { - w0 = NULL; - w1 = pool[wordBaseIdx - minBaseIdx]; - } - for (; w1 && word->primaryCmp(w1) > 0; w0 = w1, w1 = w1->next) ; - word->next = w1; - if (w0) { - w0->next = word; - } else { - pool[wordBaseIdx - minBaseIdx] = word; - } - cursor = word; - cursorBaseIdx = wordBaseIdx; -} - -//------------------------------------------------------------------------ -// TextLine -//------------------------------------------------------------------------ - -TextLine::TextLine(TextBlock *blkA, int rotA, double baseA) { - blk = blkA; - rot = rotA; - xMin = yMin = 0; - xMax = yMax = -1; - base = baseA; - words = lastWord = NULL; - text = NULL; - edge = NULL; - col = NULL; - len = 0; - convertedLen = 0; - hyphenated = gFalse; - next = NULL; -} - -TextLine::~TextLine() { - TextWord *word; - - while (words) { - word = words; - words = words->next; - delete word; - } - gfree(text); - gfree(edge); - gfree(col); -} - -void TextLine::addWord(TextWord *word) { - if (lastWord) { - lastWord->next = word; - } else { - words = word; - } - lastWord = word; - - if (xMin > xMax) { - xMin = word->xMin; - xMax = word->xMax; - yMin = word->yMin; - yMax = word->yMax; - } else { - if (word->xMin < xMin) { - xMin = word->xMin; - } - if (word->xMax > xMax) { - xMax = word->xMax; - } - if (word->yMin < yMin) { - yMin = word->yMin; - } - if (word->yMax > yMax) { - yMax = word->yMax; - } - } -} - -double TextLine::primaryDelta(TextLine *line) { - double delta; - - delta = 0; // make gcc happy - switch (rot) { - case 0: - delta = line->xMin - xMax; - break; - case 1: - delta = line->yMin - yMax; - break; - case 2: - delta = xMin - line->xMax; - break; - case 3: - delta = yMin - line->yMax; - break; - } - return delta; -} - -int TextLine::primaryCmp(TextLine *line) { - double cmp; - - cmp = 0; // make gcc happy - switch (rot) { - case 0: - cmp = xMin - line->xMin; - break; - case 1: - cmp = yMin - line->yMin; - break; - case 2: - cmp = line->xMax - xMax; - break; - case 3: - cmp = line->yMax - yMax; - break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -int TextLine::secondaryCmp(TextLine *line) { - double cmp; - - cmp = (rot == 0 || rot == 3) ? base - line->base : line->base - base; - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -int TextLine::cmpYX(TextLine *line) { - int cmp; - - if ((cmp = secondaryCmp(line))) { - return cmp; - } - return primaryCmp(line); -} - -int TextLine::cmpXY(const void *p1, const void *p2) { - TextLine *line1 = *(TextLine **)p1; - TextLine *line2 = *(TextLine **)p2; - int cmp; - - if ((cmp = line1->primaryCmp(line2))) { - return cmp; - } - return line1->secondaryCmp(line2); -} - -void TextLine::coalesce(UnicodeMap *uMap) { - TextWord *word0, *word1; - double space, delta, minSpace; - GBool isUnicode; - char buf[8]; - int i, j; - - if (words->next) { - - // compute the inter-word space threshold - if (words->len > 1 || words->next->len > 1) { - minSpace = 0; - } else { - minSpace = words->primaryDelta(words->next); - for (word0 = words->next, word1 = word0->next; - word1 && minSpace > 0; - word0 = word1, word1 = word0->next) { - if (word1->len > 1) { - minSpace = 0; - } - delta = word0->primaryDelta(word1); - if (delta < minSpace) { - minSpace = delta; - } - } - } - if (minSpace <= 0) { - space = maxCharSpacing * words->fontSize; - } else { - space = maxWideCharSpacingMul * minSpace; - if (space > maxWideCharSpacing * words->fontSize) { - space = maxWideCharSpacing * words->fontSize; - } - } - - // merge words - word0 = words; - word1 = words->next; - while (word1) { - if (word0->primaryDelta(word1) >= space) { - word0->spaceAfter = gTrue; - word0 = word1; - word1 = word1->next; - } else if (word0->font == word1->font && - word0->underlined == word1->underlined && - fabs(word0->fontSize - word1->fontSize) < - maxWordFontSizeDelta * words->fontSize && - word1->charPos == word0->charPos + word0->charLen) { - word0->merge(word1); - word0->next = word1->next; - delete word1; - word1 = word0->next; - } else { - word0 = word1; - word1 = word1->next; - } - } - } - - // build the line text - isUnicode = uMap ? uMap->isUnicode() : gFalse; - len = 0; - for (word1 = words; word1; word1 = word1->next) { - len += word1->len; - if (word1->spaceAfter) { - ++len; - } - } - text = (Unicode *)gmallocn(len, sizeof(Unicode)); - edge = (double *)gmallocn(len + 1, sizeof(double)); - i = 0; - for (word1 = words; word1; word1 = word1->next) { - for (j = 0; j < word1->len; ++j) { - text[i] = word1->text[j]; - edge[i] = word1->edge[j]; - ++i; - } - edge[i] = word1->edge[word1->len]; - if (word1->spaceAfter) { - text[i] = (Unicode)0x0020; - ++i; - } - } - - // compute convertedLen and set up the col array - col = (int *)gmallocn(len + 1, sizeof(int)); - convertedLen = 0; - for (i = 0; i < len; ++i) { - col[i] = convertedLen; - if (isUnicode) { - ++convertedLen; - } else if (uMap) { - convertedLen += uMap->mapUnicode(text[i], buf, sizeof(buf)); - } - } - col[len] = convertedLen; - - // check for hyphen at end of line - //~ need to check for other chars used as hyphens - hyphenated = text[len - 1] == (Unicode)'-'; -} - -//------------------------------------------------------------------------ -// TextLineFrag -//------------------------------------------------------------------------ - -class TextLineFrag { -public: - - TextLine *line; // the line object - int start, len; // offset and length of this fragment - // (in Unicode chars) - double xMin, xMax; // bounding box coordinates - double yMin, yMax; - double base; // baseline virtual coordinate - int col; // first column - - void init(TextLine *lineA, int startA, int lenA); - void computeCoords(GBool oneRot); - - static int cmpYXPrimaryRot(const void *p1, const void *p2); - static int cmpYXLineRot(const void *p1, const void *p2); - static int cmpXYLineRot(const void *p1, const void *p2); - static int cmpXYColumnPrimaryRot(const void *p1, const void *p2); - static int cmpXYColumnLineRot(const void *p1, const void *p2); -}; - -void TextLineFrag::init(TextLine *lineA, int startA, int lenA) { - line = lineA; - start = startA; - len = lenA; - col = line->col[start]; -} - -void TextLineFrag::computeCoords(GBool oneRot) { - TextBlock *blk; - double d0, d1, d2, d3, d4; - - if (oneRot) { - - switch (line->rot) { - case 0: - xMin = line->edge[start]; - xMax = line->edge[start + len]; - yMin = line->yMin; - yMax = line->yMax; - break; - case 1: - xMin = line->xMin; - xMax = line->xMax; - yMin = line->edge[start]; - yMax = line->edge[start + len]; - break; - case 2: - xMin = line->edge[start + len]; - xMax = line->edge[start]; - yMin = line->yMin; - yMax = line->yMax; - break; - case 3: - xMin = line->xMin; - xMax = line->xMax; - yMin = line->edge[start + len]; - yMax = line->edge[start]; - break; - } - base = line->base; - - } else { - - if (line->rot == 0 && line->blk->page->primaryRot == 0) { - - xMin = line->edge[start]; - xMax = line->edge[start + len]; - yMin = line->yMin; - yMax = line->yMax; - base = line->base; - - } else { - - blk = line->blk; - d0 = line->edge[start]; - d1 = line->edge[start + len]; - d2 = d3 = d4 = 0; // make gcc happy - - switch (line->rot) { - case 0: - d2 = line->yMin; - d3 = line->yMax; - d4 = line->base; - d0 = (d0 - blk->xMin) / (blk->xMax - blk->xMin); - d1 = (d1 - blk->xMin) / (blk->xMax - blk->xMin); - d2 = (d2 - blk->yMin) / (blk->yMax - blk->yMin); - d3 = (d3 - blk->yMin) / (blk->yMax - blk->yMin); - d4 = (d4 - blk->yMin) / (blk->yMax - blk->yMin); - break; - case 1: - d2 = line->xMax; - d3 = line->xMin; - d4 = line->base; - d0 = (d0 - blk->yMin) / (blk->yMax - blk->yMin); - d1 = (d1 - blk->yMin) / (blk->yMax - blk->yMin); - d2 = (blk->xMax - d2) / (blk->xMax - blk->xMin); - d3 = (blk->xMax - d3) / (blk->xMax - blk->xMin); - d4 = (blk->xMax - d4) / (blk->xMax - blk->xMin); - break; - case 2: - d2 = line->yMax; - d3 = line->yMin; - d4 = line->base; - d0 = (blk->xMax - d0) / (blk->xMax - blk->xMin); - d1 = (blk->xMax - d1) / (blk->xMax - blk->xMin); - d2 = (blk->yMax - d2) / (blk->yMax - blk->yMin); - d3 = (blk->yMax - d3) / (blk->yMax - blk->yMin); - d4 = (blk->yMax - d4) / (blk->yMax - blk->yMin); - break; - case 3: - d2 = line->xMin; - d3 = line->xMax; - d4 = line->base; - d0 = (blk->yMax - d0) / (blk->yMax - blk->yMin); - d1 = (blk->yMax - d1) / (blk->yMax - blk->yMin); - d2 = (d2 - blk->xMin) / (blk->xMax - blk->xMin); - d3 = (d3 - blk->xMin) / (blk->xMax - blk->xMin); - d4 = (d4 - blk->xMin) / (blk->xMax - blk->xMin); - break; - } - - switch (line->blk->page->primaryRot) { - case 0: - xMin = blk->xMin + d0 * (blk->xMax - blk->xMin); - xMax = blk->xMin + d1 * (blk->xMax - blk->xMin); - yMin = blk->yMin + d2 * (blk->yMax - blk->yMin); - yMax = blk->yMin + d3 * (blk->yMax - blk->yMin); - base = blk->yMin + base * (blk->yMax - blk->yMin); - break; - case 1: - xMin = blk->xMax - d3 * (blk->xMax - blk->xMin); - xMax = blk->xMax - d2 * (blk->xMax - blk->xMin); - yMin = blk->yMin + d0 * (blk->yMax - blk->yMin); - yMax = blk->yMin + d1 * (blk->yMax - blk->yMin); - base = blk->xMax - d4 * (blk->xMax - blk->xMin); - break; - case 2: - xMin = blk->xMax - d1 * (blk->xMax - blk->xMin); - xMax = blk->xMax - d0 * (blk->xMax - blk->xMin); - yMin = blk->yMax - d3 * (blk->yMax - blk->yMin); - yMax = blk->yMax - d2 * (blk->yMax - blk->yMin); - base = blk->yMax - d4 * (blk->yMax - blk->yMin); - break; - case 3: - xMin = blk->xMin + d2 * (blk->xMax - blk->xMin); - xMax = blk->xMin + d3 * (blk->xMax - blk->xMin); - yMin = blk->yMax - d1 * (blk->yMax - blk->yMin); - yMax = blk->yMax - d0 * (blk->yMax - blk->yMin); - base = blk->xMin + d4 * (blk->xMax - blk->xMin); - break; - } - - } - } -} - -int TextLineFrag::cmpYXPrimaryRot(const void *p1, const void *p2) { - TextLineFrag *frag1 = (TextLineFrag *)p1; - TextLineFrag *frag2 = (TextLineFrag *)p2; - double cmp; - - cmp = 0; // make gcc happy - switch (frag1->line->blk->page->primaryRot) { - case 0: - if (fabs(cmp = frag1->yMin - frag2->yMin) < 0.01) { - cmp = frag1->xMin - frag2->xMin; - } - break; - case 1: - if (fabs(cmp = frag2->xMax - frag1->xMax) < 0.01) { - cmp = frag1->yMin - frag2->yMin; - } - break; - case 2: - if (fabs(cmp = frag2->yMin - frag1->yMin) < 0.01) { - cmp = frag2->xMax - frag1->xMax; - } - break; - case 3: - if (fabs(cmp = frag1->xMax - frag2->xMax) < 0.01) { - cmp = frag2->yMax - frag1->yMax; - } - break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -int TextLineFrag::cmpYXLineRot(const void *p1, const void *p2) { - TextLineFrag *frag1 = (TextLineFrag *)p1; - TextLineFrag *frag2 = (TextLineFrag *)p2; - double cmp; - - cmp = 0; // make gcc happy - switch (frag1->line->rot) { - case 0: - if ((cmp = frag1->yMin - frag2->yMin) == 0) { - cmp = frag1->xMin - frag2->xMin; - } - break; - case 1: - if ((cmp = frag2->xMax - frag1->xMax) == 0) { - cmp = frag1->yMin - frag2->yMin; - } - break; - case 2: - if ((cmp = frag2->yMin - frag1->yMin) == 0) { - cmp = frag2->xMax - frag1->xMax; - } - break; - case 3: - if ((cmp = frag1->xMax - frag2->xMax) == 0) { - cmp = frag2->yMax - frag1->yMax; - } - break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -int TextLineFrag::cmpXYLineRot(const void *p1, const void *p2) { - TextLineFrag *frag1 = (TextLineFrag *)p1; - TextLineFrag *frag2 = (TextLineFrag *)p2; - double cmp; - - cmp = 0; // make gcc happy - switch (frag1->line->rot) { - case 0: - if ((cmp = frag1->xMin - frag2->xMin) == 0) { - cmp = frag1->yMin - frag2->yMin; - } - break; - case 1: - if ((cmp = frag1->yMin - frag2->yMin) == 0) { - cmp = frag2->xMax - frag1->xMax; - } - break; - case 2: - if ((cmp = frag2->xMax - frag1->xMax) == 0) { - cmp = frag2->yMin - frag1->yMin; - } - break; - case 3: - if ((cmp = frag2->yMax - frag1->yMax) == 0) { - cmp = frag1->xMax - frag2->xMax; - } - break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -int TextLineFrag::cmpXYColumnPrimaryRot(const void *p1, const void *p2) { - TextLineFrag *frag1 = (TextLineFrag *)p1; - TextLineFrag *frag2 = (TextLineFrag *)p2; - double cmp; - - // if columns overlap, compare y values - if (frag1->col < frag2->col + (frag2->line->col[frag2->start + frag2->len] - - frag2->line->col[frag2->start]) && - frag2->col < frag1->col + (frag1->line->col[frag1->start + frag1->len] - - frag1->line->col[frag1->start])) { - cmp = 0; // make gcc happy - switch (frag1->line->blk->page->primaryRot) { - case 0: cmp = frag1->yMin - frag2->yMin; break; - case 1: cmp = frag2->xMax - frag1->xMax; break; - case 2: cmp = frag2->yMin - frag1->yMin; break; - case 3: cmp = frag1->xMax - frag2->xMax; break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; - } - - // otherwise, compare starting column - return frag1->col - frag2->col; -} - -int TextLineFrag::cmpXYColumnLineRot(const void *p1, const void *p2) { - TextLineFrag *frag1 = (TextLineFrag *)p1; - TextLineFrag *frag2 = (TextLineFrag *)p2; - double cmp; - - // if columns overlap, compare y values - if (frag1->col < frag2->col + (frag2->line->col[frag2->start + frag2->len] - - frag2->line->col[frag2->start]) && - frag2->col < frag1->col + (frag1->line->col[frag1->start + frag1->len] - - frag1->line->col[frag1->start])) { - cmp = 0; // make gcc happy - switch (frag1->line->rot) { - case 0: cmp = frag1->yMin - frag2->yMin; break; - case 1: cmp = frag2->xMax - frag1->xMax; break; - case 2: cmp = frag2->yMin - frag1->yMin; break; - case 3: cmp = frag1->xMax - frag2->xMax; break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; - } - - // otherwise, compare starting column - return frag1->col - frag2->col; -} - -//------------------------------------------------------------------------ -// TextBlock -//------------------------------------------------------------------------ - -TextBlock::TextBlock(TextPage *pageA, int rotA) { - page = pageA; - rot = rotA; - xMin = yMin = 0; - xMax = yMax = -1; - priMin = 0; - priMax = page->pageWidth; - pool = new TextPool(); - lines = NULL; - curLine = NULL; - next = NULL; - stackNext = NULL; -} - -TextBlock::~TextBlock() { - TextLine *line; - - delete pool; - while (lines) { - line = lines; - lines = lines->next; - delete line; - } -} - -void TextBlock::addWord(TextWord *word) { - pool->addWord(word); - if (xMin > xMax) { - xMin = word->xMin; - xMax = word->xMax; - yMin = word->yMin; - yMax = word->yMax; - } else { - if (word->xMin < xMin) { - xMin = word->xMin; - } - if (word->xMax > xMax) { - xMax = word->xMax; - } - if (word->yMin < yMin) { - yMin = word->yMin; - } - if (word->yMax > yMax) { - yMax = word->yMax; - } - } -} - -void TextBlock::coalesce(UnicodeMap *uMap) { - TextWord *word0, *word1, *word2, *bestWord0, *bestWord1, *lastWord; - TextLine *line, *line0, *line1; - int poolMinBaseIdx, startBaseIdx, minBaseIdx, maxBaseIdx; - int baseIdx, bestWordBaseIdx, idx0, idx1; - double minBase, maxBase; - double fontSize, delta, priDelta, secDelta; - TextLine **lineArray; - GBool found; - int col1, col2; - int i, j, k; - - // discard duplicated text (fake boldface, drop shadows) - for (idx0 = pool->minBaseIdx; idx0 <= pool->maxBaseIdx; ++idx0) { - word0 = pool->getPool(idx0); - while (word0) { - priDelta = dupMaxPriDelta * word0->fontSize; - secDelta = dupMaxSecDelta * word0->fontSize; - if (rot == 0 || rot == 3) { - maxBaseIdx = pool->getBaseIdx(word0->base + secDelta); - } else { - maxBaseIdx = pool->getBaseIdx(word0->base - secDelta); - } - found = gFalse; - word1 = word2 = NULL; // make gcc happy - for (idx1 = idx0; idx1 <= maxBaseIdx; ++idx1) { - if (idx1 == idx0) { - word1 = word0; - word2 = word0->next; - } else { - word1 = NULL; - word2 = pool->getPool(idx1); - } - for (; word2; word1 = word2, word2 = word2->next) { - if (word2->len == word0->len && - !memcmp(word2->text, word0->text, - word0->len * sizeof(Unicode))) { - switch (rot) { - case 0: - case 2: - found = fabs(word0->xMin - word2->xMin) < priDelta && - fabs(word0->xMax - word2->xMax) < priDelta && - fabs(word0->yMin - word2->yMin) < secDelta && - fabs(word0->yMax - word2->yMax) < secDelta; - break; - case 1: - case 3: - found = fabs(word0->xMin - word2->xMin) < secDelta && - fabs(word0->xMax - word2->xMax) < secDelta && - fabs(word0->yMin - word2->yMin) < priDelta && - fabs(word0->yMax - word2->yMax) < priDelta; - break; - } - } - if (found) { - break; - } - } - if (found) { - break; - } - } - if (found) { - if (word1) { - word1->next = word2->next; - } else { - pool->setPool(idx1, word2->next); - } - delete word2; - } else { - word0 = word0->next; - } - } - } - - // build the lines - curLine = NULL; - poolMinBaseIdx = pool->minBaseIdx; - charCount = 0; - nLines = 0; - while (1) { - - // find the first non-empty line in the pool - for (; - poolMinBaseIdx <= pool->maxBaseIdx && !pool->getPool(poolMinBaseIdx); - ++poolMinBaseIdx) ; - if (poolMinBaseIdx > pool->maxBaseIdx) { - break; - } - - // look for the left-most word in the first four lines of the - // pool -- this avoids starting with a superscript word - startBaseIdx = poolMinBaseIdx; - for (baseIdx = poolMinBaseIdx + 1; - baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx; - ++baseIdx) { - if (!pool->getPool(baseIdx)) { - continue; - } - if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx)) - < 0) { - startBaseIdx = baseIdx; - } - } - - // create a new line - word0 = pool->getPool(startBaseIdx); - pool->setPool(startBaseIdx, word0->next); - word0->next = NULL; - line = new TextLine(this, word0->rot, word0->base); - line->addWord(word0); - lastWord = word0; - - // compute the search range - fontSize = word0->fontSize; - minBase = word0->base - maxIntraLineDelta * fontSize; - maxBase = word0->base + maxIntraLineDelta * fontSize; - minBaseIdx = pool->getBaseIdx(minBase); - maxBaseIdx = pool->getBaseIdx(maxBase); - - // find the rest of the words in this line - while (1) { - - // find the left-most word whose baseline is in the range for - // this line - bestWordBaseIdx = 0; - bestWord0 = bestWord1 = NULL; - for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) { - for (word0 = NULL, word1 = pool->getPool(baseIdx); - word1; - word0 = word1, word1 = word1->next) { - if (word1->base >= minBase && - word1->base <= maxBase && - (delta = lastWord->primaryDelta(word1)) >= - minCharSpacing * fontSize) { - if (delta < maxWordSpacing * fontSize && - (!bestWord1 || word1->primaryCmp(bestWord1) < 0)) { - bestWordBaseIdx = baseIdx; - bestWord0 = word0; - bestWord1 = word1; - } - break; - } - } - } - if (!bestWord1) { - break; - } - - // remove it from the pool, and add it to the line - if (bestWord0) { - bestWord0->next = bestWord1->next; - } else { - pool->setPool(bestWordBaseIdx, bestWord1->next); - } - bestWord1->next = NULL; - line->addWord(bestWord1); - lastWord = bestWord1; - } - - // add the line - if (curLine && line->cmpYX(curLine) > 0) { - line0 = curLine; - line1 = curLine->next; - } else { - line0 = NULL; - line1 = lines; - } - for (; - line1 && line->cmpYX(line1) > 0; - line0 = line1, line1 = line1->next) ; - if (line0) { - line0->next = line; - } else { - lines = line; - } - line->next = line1; - curLine = line; - line->coalesce(uMap); - charCount += line->len; - ++nLines; - } - - // sort lines into xy order for column assignment - lineArray = (TextLine **)gmallocn(nLines, sizeof(TextLine *)); - for (line = lines, i = 0; line; line = line->next, ++i) { - lineArray[i] = line; - } - qsort(lineArray, nLines, sizeof(TextLine *), &TextLine::cmpXY); - - // column assignment - nColumns = 0; - for (i = 0; i < nLines; ++i) { - line0 = lineArray[i]; - col1 = 0; - for (j = 0; j < i; ++j) { - line1 = lineArray[j]; - if (line1->primaryDelta(line0) >= 0) { - col2 = line1->col[line1->len] + 1; - } else { - k = 0; // make gcc happy - switch (rot) { - case 0: - for (k = 0; - k < line1->len && - line0->xMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]); - ++k) ; - break; - case 1: - for (k = 0; - k < line1->len && - line0->yMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]); - ++k) ; - break; - case 2: - for (k = 0; - k < line1->len && - line0->xMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]); - ++k) ; - break; - case 3: - for (k = 0; - k < line1->len && - line0->yMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]); - ++k) ; - break; - } - col2 = line1->col[k]; - } - if (col2 > col1) { - col1 = col2; - } - } - for (k = 0; k <= line0->len; ++k) { - line0->col[k] += col1; - } - if (line0->col[line0->len] > nColumns) { - nColumns = line0->col[line0->len]; - } - } - gfree(lineArray); -} - -void TextBlock::updatePriMinMax(TextBlock *blk) { - double newPriMin, newPriMax; - GBool gotPriMin, gotPriMax; - - gotPriMin = gotPriMax = gFalse; - newPriMin = newPriMax = 0; // make gcc happy - switch (page->primaryRot) { - case 0: - case 2: - if (blk->yMin < yMax && blk->yMax > yMin) { - if (blk->xMin < xMin) { - newPriMin = blk->xMax; - gotPriMin = gTrue; - } - if (blk->xMax > xMax) { - newPriMax = blk->xMin; - gotPriMax = gTrue; - } - } - break; - case 1: - case 3: - if (blk->xMin < xMax && blk->xMax > xMin) { - if (blk->yMin < yMin) { - newPriMin = blk->yMax; - gotPriMin = gTrue; - } - if (blk->yMax > yMax) { - newPriMax = blk->yMin; - gotPriMax = gTrue; - } - } - break; - } - if (gotPriMin) { - if (newPriMin > xMin) { - newPriMin = xMin; - } - if (newPriMin > priMin) { - priMin = newPriMin; - } - } - if (gotPriMax) { - if (newPriMax < xMax) { - newPriMax = xMax; - } - if (newPriMax < priMax) { - priMax = newPriMax; - } - } -} - -int TextBlock::cmpXYPrimaryRot(const void *p1, const void *p2) { - TextBlock *blk1 = *(TextBlock **)p1; - TextBlock *blk2 = *(TextBlock **)p2; - double cmp; - - cmp = 0; // make gcc happy - switch (blk1->page->primaryRot) { - case 0: - if ((cmp = blk1->xMin - blk2->xMin) == 0) { - cmp = blk1->yMin - blk2->yMin; - } - break; - case 1: - if ((cmp = blk1->yMin - blk2->yMin) == 0) { - cmp = blk2->xMax - blk1->xMax; - } - break; - case 2: - if ((cmp = blk2->xMax - blk1->xMax) == 0) { - cmp = blk2->yMin - blk1->yMin; - } - break; - case 3: - if ((cmp = blk2->yMax - blk1->yMax) == 0) { - cmp = blk1->xMax - blk2->xMax; - } - break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -int TextBlock::cmpYXPrimaryRot(const void *p1, const void *p2) { - TextBlock *blk1 = *(TextBlock **)p1; - TextBlock *blk2 = *(TextBlock **)p2; - double cmp; - - cmp = 0; // make gcc happy - switch (blk1->page->primaryRot) { - case 0: - if ((cmp = blk1->yMin - blk2->yMin) == 0) { - cmp = blk1->xMin - blk2->xMin; - } - break; - case 1: - if ((cmp = blk2->xMax - blk1->xMax) == 0) { - cmp = blk1->yMin - blk2->yMin; - } - break; - case 2: - if ((cmp = blk2->yMin - blk1->yMin) == 0) { - cmp = blk2->xMax - blk1->xMax; - } - break; - case 3: - if ((cmp = blk1->xMax - blk2->xMax) == 0) { - cmp = blk2->yMax - blk1->yMax; - } - break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -int TextBlock::primaryCmp(TextBlock *blk) { - double cmp; - - cmp = 0; // make gcc happy - switch (rot) { - case 0: - cmp = xMin - blk->xMin; - break; - case 1: - cmp = yMin - blk->yMin; - break; - case 2: - cmp = blk->xMax - xMax; - break; - case 3: - cmp = blk->yMax - yMax; - break; - } - return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; -} - -double TextBlock::secondaryDelta(TextBlock *blk) { - double delta; - - delta = 0; // make gcc happy - switch (rot) { - case 0: - delta = blk->yMin - yMax; - break; - case 1: - delta = xMin - blk->xMax; - break; - case 2: - delta = yMin - blk->yMax; - break; - case 3: - delta = blk->xMin - xMax; - break; - } - return delta; -} - -GBool TextBlock::isBelow(TextBlock *blk) { - GBool below; - - below = gFalse; // make gcc happy - switch (page->primaryRot) { - case 0: - below = xMin >= blk->priMin && xMax <= blk->priMax && - yMin > blk->yMin; - break; - case 1: - below = yMin >= blk->priMin && yMax <= blk->priMax && - xMax < blk->xMax; - break; - case 2: - below = xMin >= blk->priMin && xMax <= blk->priMax && - yMax < blk->yMax; - break; - case 3: - below = yMin >= blk->priMin && yMax <= blk->priMax && - xMin > blk->xMin; - break; - } - - return below; -} - -//------------------------------------------------------------------------ -// TextFlow -//------------------------------------------------------------------------ - -TextFlow::TextFlow(TextPage *pageA, TextBlock *blk) { - page = pageA; - xMin = blk->xMin; - xMax = blk->xMax; - yMin = blk->yMin; - yMax = blk->yMax; - priMin = blk->priMin; - priMax = blk->priMax; - blocks = lastBlk = blk; - next = NULL; -} - -TextFlow::~TextFlow() { - TextBlock *blk; - - while (blocks) { - blk = blocks; - blocks = blocks->next; - delete blk; - } -} - -void TextFlow::addBlock(TextBlock *blk) { - if (lastBlk) { - lastBlk->next = blk; - } else { - blocks = blk; - } - lastBlk = blk; - if (blk->xMin < xMin) { - xMin = blk->xMin; - } - if (blk->xMax > xMax) { - xMax = blk->xMax; - } - if (blk->yMin < yMin) { - yMin = blk->yMin; - } - if (blk->yMax > yMax) { - yMax = blk->yMax; - } -} - -GBool TextFlow::blockFits(TextBlock *blk, TextBlock *prevBlk) { - GBool fits; - - // lower blocks must use smaller fonts - if (blk->lines->words->fontSize > lastBlk->lines->words->fontSize) { - return gFalse; - } - - fits = gFalse; // make gcc happy - switch (page->primaryRot) { - case 0: - fits = blk->xMin >= priMin && blk->xMax <= priMax; - break; - case 1: - fits = blk->yMin >= priMin && blk->yMax <= priMax; - break; - case 2: - fits = blk->xMin >= priMin && blk->xMax <= priMax; - break; - case 3: - fits = blk->yMin >= priMin && blk->yMax <= priMax; - break; - } - return fits; -} - -#if TEXTOUT_WORD_LIST - -//------------------------------------------------------------------------ -// TextWordList -//------------------------------------------------------------------------ - -TextWordList::TextWordList(TextPage *text, GBool physLayout) { - TextFlow *flow; - TextBlock *blk; - TextLine *line; - TextWord *word; - TextWord **wordArray; - int nWords, i; - - words = new GList(); - - if (text->rawOrder) { - for (word = text->rawWords; word; word = word->next) { - words->append(word); - } - - } else if (physLayout) { - // this is inefficient, but it's also the least useful of these - // three cases - nWords = 0; - for (flow = text->flows; flow; flow = flow->next) { - for (blk = flow->blocks; blk; blk = blk->next) { - for (line = blk->lines; line; line = line->next) { - for (word = line->words; word; word = word->next) { - ++nWords; - } - } - } - } - wordArray = (TextWord **)gmallocn(nWords, sizeof(TextWord *)); - i = 0; - for (flow = text->flows; flow; flow = flow->next) { - for (blk = flow->blocks; blk; blk = blk->next) { - for (line = blk->lines; line; line = line->next) { - for (word = line->words; word; word = word->next) { - wordArray[i++] = word; - } - } - } - } - qsort(wordArray, nWords, sizeof(TextWord *), &TextWord::cmpYX); - for (i = 0; i < nWords; ++i) { - words->append(wordArray[i]); - } - gfree(wordArray); - - } else { - for (flow = text->flows; flow; flow = flow->next) { - for (blk = flow->blocks; blk; blk = blk->next) { - for (line = blk->lines; line; line = line->next) { - for (word = line->words; word; word = word->next) { - words->append(word); - } - } - } - } - } -} - -TextWordList::~TextWordList() { - delete words; -} - -int TextWordList::getLength() { - return words->getLength(); -} - -TextWord *TextWordList::get(int idx) { - if (idx < 0 || idx >= words->getLength()) { - return NULL; - } - return (TextWord *)words->get(idx); -} - -#endif // TEXTOUT_WORD_LIST - -//------------------------------------------------------------------------ -// TextPage -//------------------------------------------------------------------------ - -TextPage::TextPage(GBool rawOrderA) { - int rot; - - rawOrder = rawOrderA; - curWord = NULL; - charPos = 0; - curFont = NULL; - curFontSize = 0; - nest = 0; - nTinyChars = 0; - lastCharOverlap = gFalse; - if (!rawOrder) { - for (rot = 0; rot < 4; ++rot) { - pools[rot] = new TextPool(); - } - } - flows = NULL; - blocks = NULL; - rawWords = NULL; - rawLastWord = NULL; - fonts = new GList(); - lastFindXMin = lastFindYMin = 0; - haveLastFind = gFalse; - underlines = new GList(); - links = new GList(); -} - -TextPage::~TextPage() { - int rot; - - clear(); - if (!rawOrder) { - for (rot = 0; rot < 4; ++rot) { - delete pools[rot]; - } - } - delete fonts; - deleteGList(underlines, TextUnderline); - deleteGList(links, TextLink); -} - -void TextPage::startPage(GfxState *state) { - clear(); - if (state) { - pageWidth = state->getPageWidth(); - pageHeight = state->getPageHeight(); - } else { - pageWidth = pageHeight = 0; - } -} - -void TextPage::endPage() { - if (curWord) { - endWord(); - } -} - -void TextPage::clear() { - int rot; - TextFlow *flow; - TextWord *word; - - if (curWord) { - delete curWord; - curWord = NULL; - } - if (rawOrder) { - while (rawWords) { - word = rawWords; - rawWords = rawWords->next; - delete word; - } - } else { - for (rot = 0; rot < 4; ++rot) { - delete pools[rot]; - } - while (flows) { - flow = flows; - flows = flows->next; - delete flow; - } - gfree(blocks); - } - deleteGList(fonts, TextFontInfo); - - curWord = NULL; - charPos = 0; - curFont = NULL; - curFontSize = 0; - nest = 0; - nTinyChars = 0; - if (!rawOrder) { - for (rot = 0; rot < 4; ++rot) { - pools[rot] = new TextPool(); - } - } - flows = NULL; - blocks = NULL; - rawWords = NULL; - rawLastWord = NULL; - fonts = new GList(); -} - -void TextPage::updateFont(GfxState *state) { - GfxFont *gfxFont; - double *fm; - char *name; - int code, mCode, letterCode, anyCode; - double w; - int i; - - // get the font info object - curFont = NULL; - for (i = 0; i < fonts->getLength(); ++i) { - curFont = (TextFontInfo *)fonts->get(i); - if (curFont->matches(state)) { - break; - } - curFont = NULL; - } - if (!curFont) { - curFont = new TextFontInfo(state); - fonts->append(curFont); - } - - // adjust the font size - gfxFont = state->getFont(); - curFontSize = state->getTransformedFontSize(); - if (gfxFont && gfxFont->getType() == fontType3) { - // This is a hack which makes it possible to deal with some Type 3 - // fonts. The problem is that it's impossible to know what the - // base coordinate system used in the font is without actually - // rendering the font. This code tries to guess by looking at the - // width of the character 'm' (which breaks if the font is a - // subset that doesn't contain 'm'). - mCode = letterCode = anyCode = -1; - for (code = 0; code < 256; ++code) { - name = ((Gfx8BitFont *)gfxFont)->getCharName(code); - if (name && name[0] == 'm' && name[1] == '\0') { - mCode = code; - } - if (letterCode < 0 && name && name[1] == '\0' && - ((name[0] >= 'A' && name[0] <= 'Z') || - (name[0] >= 'a' && name[0] <= 'z'))) { - letterCode = code; - } - if (anyCode < 0 && name && - ((Gfx8BitFont *)gfxFont)->getWidth(code) > 0) { - anyCode = code; - } - } - if (mCode >= 0 && - (w = ((Gfx8BitFont *)gfxFont)->getWidth(mCode)) > 0) { - // 0.6 is a generic average 'm' width -- yes, this is a hack - curFontSize *= w / 0.6; - } else if (letterCode >= 0 && - (w = ((Gfx8BitFont *)gfxFont)->getWidth(letterCode)) > 0) { - // even more of a hack: 0.5 is a generic letter width - curFontSize *= w / 0.5; - } else if (anyCode >= 0 && - (w = ((Gfx8BitFont *)gfxFont)->getWidth(anyCode)) > 0) { - // better than nothing: 0.5 is a generic character width - curFontSize *= w / 0.5; - } - fm = gfxFont->getFontMatrix(); - if (fm[0] != 0) { - curFontSize *= fabs(fm[3] / fm[0]); - } - } -} - -void TextPage::beginWord(GfxState *state, double x0, double y0) { - double *fontm; - double m[4], m2[4]; - int rot; - - // This check is needed because Type 3 characters can contain - // text-drawing operations (when TextPage is being used via - // {X,Win}SplashOutputDev rather than TextOutputDev). - if (curWord) { - ++nest; - return; - } - - // compute the rotation - state->getFontTransMat(&m[0], &m[1], &m[2], &m[3]); - if (state->getFont()->getType() == fontType3) { - fontm = state->getFont()->getFontMatrix(); - m2[0] = fontm[0] * m[0] + fontm[1] * m[2]; - m2[1] = fontm[0] * m[1] + fontm[1] * m[3]; - m2[2] = fontm[2] * m[0] + fontm[3] * m[2]; - m2[3] = fontm[2] * m[1] + fontm[3] * m[3]; - m[0] = m2[0]; - m[1] = m2[1]; - m[2] = m2[2]; - m[3] = m2[3]; - } - if (fabs(m[0] * m[3]) > fabs(m[1] * m[2])) { - rot = (m[3] < 0) ? 0 : 2; - } else { - rot = (m[2] > 0) ? 1 : 3; - } - - curWord = new TextWord(state, rot, x0, y0, charPos, curFont, curFontSize); -} - -void TextPage::addChar(GfxState *state, double x, double y, - double dx, double dy, - CharCode c, int nBytes, Unicode *u, int uLen) { - double x1, y1, w1, h1, dx2, dy2, base, sp, delta; - GBool overlap; - int i; - - // subtract char and word spacing from the dx,dy values - sp = state->getCharSpace(); - if (c == (CharCode)0x20) { - sp += state->getWordSpace(); - } - state->textTransformDelta(sp * state->getHorizScaling(), 0, &dx2, &dy2); - dx -= dx2; - dy -= dy2; - state->transformDelta(dx, dy, &w1, &h1); - - // throw away chars that aren't inside the page bounds - // (and also do a sanity check on the character size) - state->transform(x, y, &x1, &y1); - if (x1 + w1 < 0 || x1 > pageWidth || - y1 + h1 < 0 || y1 > pageHeight || - w1 > pageWidth || h1 > pageHeight) { - charPos += nBytes; - return; - } - - // check the tiny chars limit - if (!globalParams->getTextKeepTinyChars() && - fabs(w1) < 3 && fabs(h1) < 3) { - if (++nTinyChars > 50000) { - charPos += nBytes; - return; - } - } - - // break words at space character - if (uLen == 1 && u[0] == (Unicode)0x20) { - if (curWord) { - ++curWord->charLen; - } - charPos += nBytes; - endWord(); - return; - } - - // start a new word if: - // (1) this character doesn't fall in the right place relative to - // the end of the previous word (this places upper and lower - // constraints on the position deltas along both the primary - // and secondary axes), or - // (2) this character overlaps the previous one (duplicated text), or - // (3) the previous character was an overlap (we want each duplicated - // character to be in a word by itself at this stage), - // (4) the font size has changed - if (curWord && curWord->len > 0) { - base = sp = delta = 0; // make gcc happy - switch (curWord->rot) { - case 0: - base = y1; - sp = x1 - curWord->xMax; - delta = x1 - curWord->edge[curWord->len - 1]; - break; - case 1: - base = x1; - sp = y1 - curWord->yMax; - delta = y1 - curWord->edge[curWord->len - 1]; - break; - case 2: - base = y1; - sp = curWord->xMin - x1; - delta = curWord->edge[curWord->len - 1] - x1; - break; - case 3: - base = x1; - sp = curWord->yMin - y1; - delta = curWord->edge[curWord->len - 1] - y1; - break; - } - overlap = fabs(delta) < dupMaxPriDelta * curWord->fontSize && - fabs(base - curWord->base) < dupMaxSecDelta * curWord->fontSize; - if (overlap || lastCharOverlap || - sp < -minDupBreakOverlap * curWord->fontSize || - sp > minWordBreakSpace * curWord->fontSize || - fabs(base - curWord->base) > 0.5 || - curFontSize != curWord->fontSize) { - endWord(); - } - lastCharOverlap = overlap; - } else { - lastCharOverlap = gFalse; - } - - if (uLen != 0) { - // start a new word if needed - if (!curWord) { - beginWord(state, x, y); - } - - // page rotation and/or transform matrices can cause text to be - // drawn in reverse order -- in this case, swap the begin/end - // coordinates and break text into individual chars - if ((curWord->rot == 0 && w1 < 0) || - (curWord->rot == 1 && h1 < 0) || - (curWord->rot == 2 && w1 > 0) || - (curWord->rot == 3 && h1 > 0)) { - endWord(); - beginWord(state, x + dx, y + dy); - x1 += w1; - y1 += h1; - w1 = -w1; - h1 = -h1; - } - - // add the characters to the current word - w1 /= uLen; - h1 /= uLen; - for (i = 0; i < uLen; ++i) { - curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, u[i]); - } - } - if (curWord) { - curWord->charLen += nBytes; - } - charPos += nBytes; -} - -void TextPage::endWord() { - // This check is needed because Type 3 characters can contain - // text-drawing operations (when TextPage is being used via - // {X,Win}SplashOutputDev rather than TextOutputDev). - if (nest > 0) { - --nest; - return; - } - - if (curWord) { - addWord(curWord); - curWord = NULL; - } -} - -void TextPage::addWord(TextWord *word) { - // throw away zero-length words -- they don't have valid xMin/xMax - // values, and they're useless anyway - if (word->len == 0) { - delete word; - return; - } - - if (rawOrder) { - if (rawLastWord) { - rawLastWord->next = word; - } else { - rawWords = word; - } - rawLastWord = word; - } else { - pools[word->rot]->addWord(word); - } -} - -void TextPage::addUnderline(double x0, double y0, double x1, double y1) { - underlines->append(new TextUnderline(x0, y0, x1, y1)); -} - -void TextPage::addLink(int xMin, int yMin, int xMax, int yMax, Link *link) { - links->append(new TextLink(xMin, yMin, xMax, yMax, link)); -} - -void TextPage::coalesce(GBool physLayout, GBool doHTML) { - UnicodeMap *uMap; - TextPool *pool; - TextWord *word0, *word1, *word2; - TextLine *line; - TextBlock *blkList, *blkStack, *blk, *lastBlk, *blk0, *blk1; - TextBlock **blkArray; - TextFlow *flow, *lastFlow; - TextUnderline *underline; - TextLink *link; - int rot, poolMinBaseIdx, baseIdx, startBaseIdx, endBaseIdx; - double minBase, maxBase, newMinBase, newMaxBase; - double fontSize, colSpace1, colSpace2, lineSpace, intraLineSpace, blkSpace; - GBool found; - int count[4]; - int lrCount; - int firstBlkIdx, nBlocksLeft; - int col1, col2; - int i, j, n; - - if (rawOrder) { - primaryRot = 0; - primaryLR = gTrue; - return; - } - - uMap = globalParams->getTextEncoding(); - blkList = NULL; - lastBlk = NULL; - nBlocks = 0; - primaryRot = -1; - -#if 0 // for debugging - printf("*** initial words ***\n"); - for (rot = 0; rot < 4; ++rot) { - pool = pools[rot]; - for (baseIdx = pool->minBaseIdx; baseIdx <= pool->maxBaseIdx; ++baseIdx) { - for (word0 = pool->getPool(baseIdx); word0; word0 = word0->next) { - printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f rot=%d link=%p '", - word0->xMin, word0->xMax, word0->yMin, word0->yMax, - word0->base, word0->fontSize, rot*90, word0->link); - for (i = 0; i < word0->len; ++i) { - fputc(word0->text[i] & 0xff, stdout); - } - printf("'\n"); - } - } - } - printf("\n"); -#endif - -#if 0 //~ for debugging - for (i = 0; i < underlines->getLength(); ++i) { - underline = (TextUnderline *)underlines->get(i); - printf("underline: x=%g..%g y=%g..%g horiz=%d\n", - underline->x0, underline->x1, underline->y0, underline->y1, - underline->horiz); - } -#endif - - if (doHTML) { - - //----- handle underlining - for (i = 0; i < underlines->getLength(); ++i) { - underline = (TextUnderline *)underlines->get(i); - if (underline->horiz) { - // rot = 0 - if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) { - startBaseIdx = pools[0]->getBaseIdx(underline->y0 + minUnderlineGap); - endBaseIdx = pools[0]->getBaseIdx(underline->y0 + maxUnderlineGap); - for (j = startBaseIdx; j <= endBaseIdx; ++j) { - for (word0 = pools[0]->getPool(j); word0; word0 = word0->next) { - //~ need to check the y value against the word baseline - if (underline->x0 < word0->xMin + underlineSlack && - word0->xMax - underlineSlack < underline->x1) { - word0->underlined = gTrue; - } - } - } - } - - // rot = 2 - if (pools[2]->minBaseIdx <= pools[2]->maxBaseIdx) { - startBaseIdx = pools[2]->getBaseIdx(underline->y0 - maxUnderlineGap); - endBaseIdx = pools[2]->getBaseIdx(underline->y0 - minUnderlineGap); - for (j = startBaseIdx; j <= endBaseIdx; ++j) { - for (word0 = pools[2]->getPool(j); word0; word0 = word0->next) { - if (underline->x0 < word0->xMin + underlineSlack && - word0->xMax - underlineSlack < underline->x1) { - word0->underlined = gTrue; - } - } - } - } - } else { - // rot = 1 - if (pools[1]->minBaseIdx <= pools[1]->maxBaseIdx) { - startBaseIdx = pools[1]->getBaseIdx(underline->x0 - maxUnderlineGap); - endBaseIdx = pools[1]->getBaseIdx(underline->x0 - minUnderlineGap); - for (j = startBaseIdx; j <= endBaseIdx; ++j) { - for (word0 = pools[1]->getPool(j); word0; word0 = word0->next) { - if (underline->y0 < word0->yMin + underlineSlack && - word0->yMax - underlineSlack < underline->y1) { - word0->underlined = gTrue; - } - } - } - } - - // rot = 3 - if (pools[3]->minBaseIdx <= pools[3]->maxBaseIdx) { - startBaseIdx = pools[3]->getBaseIdx(underline->x0 + minUnderlineGap); - endBaseIdx = pools[3]->getBaseIdx(underline->x0 + maxUnderlineGap); - for (j = startBaseIdx; j <= endBaseIdx; ++j) { - for (word0 = pools[3]->getPool(j); word0; word0 = word0->next) { - if (underline->y0 < word0->yMin + underlineSlack && - word0->yMax - underlineSlack < underline->y1) { - word0->underlined = gTrue; - } - } - } - } - } - } - - //----- handle links - for (i = 0; i < links->getLength(); ++i) { - link = (TextLink *)links->get(i); - - // rot = 0 - if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) { - startBaseIdx = pools[0]->getBaseIdx(link->yMin); - endBaseIdx = pools[0]->getBaseIdx(link->yMax); - for (j = startBaseIdx; j <= endBaseIdx; ++j) { - for (word0 = pools[0]->getPool(j); word0; word0 = word0->next) { - if (link->xMin < word0->xMin + hyperlinkSlack && - word0->xMax - hyperlinkSlack < link->xMax && - link->yMin < word0->yMin + hyperlinkSlack && - word0->yMax - hyperlinkSlack < link->yMax) { - word0->link = link->link; - } - } - } - } - - // rot = 2 - if (pools[2]->minBaseIdx <= pools[2]->maxBaseIdx) { - startBaseIdx = pools[2]->getBaseIdx(link->yMin); - endBaseIdx = pools[2]->getBaseIdx(link->yMax); - for (j = startBaseIdx; j <= endBaseIdx; ++j) { - for (word0 = pools[2]->getPool(j); word0; word0 = word0->next) { - if (link->xMin < word0->xMin + hyperlinkSlack && - word0->xMax - hyperlinkSlack < link->xMax && - link->yMin < word0->yMin + hyperlinkSlack && - word0->yMax - hyperlinkSlack < link->yMax) { - word0->link = link->link; - } - } - } - } - - // rot = 1 - if (pools[1]->minBaseIdx <= pools[1]->maxBaseIdx) { - startBaseIdx = pools[1]->getBaseIdx(link->xMin); - endBaseIdx = pools[1]->getBaseIdx(link->xMax); - for (j = startBaseIdx; j <= endBaseIdx; ++j) { - for (word0 = pools[1]->getPool(j); word0; word0 = word0->next) { - if (link->yMin < word0->yMin + hyperlinkSlack && - word0->yMax - hyperlinkSlack < link->yMax && - link->xMin < word0->xMin + hyperlinkSlack && - word0->xMax - hyperlinkSlack < link->xMax) { - word0->link = link->link; - } - } - } - } - - // rot = 3 - if (pools[3]->minBaseIdx <= pools[3]->maxBaseIdx) { - startBaseIdx = pools[3]->getBaseIdx(link->xMin); - endBaseIdx = pools[3]->getBaseIdx(link->xMax); - for (j = startBaseIdx; j <= endBaseIdx; ++j) { - for (word0 = pools[3]->getPool(j); word0; word0 = word0->next) { - if (link->yMin < word0->yMin + hyperlinkSlack && - word0->yMax - hyperlinkSlack < link->yMax && - link->xMin < word0->xMin + hyperlinkSlack && - word0->xMax - hyperlinkSlack < link->xMax) { - word0->link = link->link; - } - } - } - } - } - } - - //----- assemble the blocks - - //~ add an outer loop for writing mode (vertical text) - - // build blocks for each rotation value - for (rot = 0; rot < 4; ++rot) { - pool = pools[rot]; - poolMinBaseIdx = pool->minBaseIdx; - count[rot] = 0; - - // add blocks until no more words are left - while (1) { - - // find the first non-empty line in the pool - for (; - poolMinBaseIdx <= pool->maxBaseIdx && - !pool->getPool(poolMinBaseIdx); - ++poolMinBaseIdx) ; - if (poolMinBaseIdx > pool->maxBaseIdx) { - break; - } - - // look for the left-most word in the first four lines of the - // pool -- this avoids starting with a superscript word - startBaseIdx = poolMinBaseIdx; - for (baseIdx = poolMinBaseIdx + 1; - baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx; - ++baseIdx) { - if (!pool->getPool(baseIdx)) { - continue; - } - if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx)) - < 0) { - startBaseIdx = baseIdx; - } - } - - // create a new block - word0 = pool->getPool(startBaseIdx); - pool->setPool(startBaseIdx, word0->next); - word0->next = NULL; - blk = new TextBlock(this, rot); - blk->addWord(word0); - - fontSize = word0->fontSize; - minBase = maxBase = word0->base; - colSpace1 = minColSpacing1 * fontSize; - colSpace2 = minColSpacing2 * fontSize; - lineSpace = maxLineSpacingDelta * fontSize; - intraLineSpace = maxIntraLineDelta * fontSize; - - // add words to the block - do { - found = gFalse; - - // look for words on the line above the current top edge of - // the block - newMinBase = minBase; - for (baseIdx = pool->getBaseIdx(minBase); - baseIdx >= pool->getBaseIdx(minBase - lineSpace); - --baseIdx) { - word0 = NULL; - word1 = pool->getPool(baseIdx); - while (word1) { - if (word1->base < minBase && - word1->base >= minBase - lineSpace && - ((rot == 0 || rot == 2) - ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin) - : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) && - fabs(word1->fontSize - fontSize) < - maxBlockFontSizeDelta1 * fontSize) { - word2 = word1; - if (word0) { - word0->next = word1->next; - } else { - pool->setPool(baseIdx, word1->next); - } - word1 = word1->next; - word2->next = NULL; - blk->addWord(word2); - found = gTrue; - newMinBase = word2->base; - } else { - word0 = word1; - word1 = word1->next; - } - } - } - minBase = newMinBase; - - // look for words on the line below the current bottom edge of - // the block - newMaxBase = maxBase; - for (baseIdx = pool->getBaseIdx(maxBase); - baseIdx <= pool->getBaseIdx(maxBase + lineSpace); - ++baseIdx) { - word0 = NULL; - word1 = pool->getPool(baseIdx); - while (word1) { - if (word1->base > maxBase && - word1->base <= maxBase + lineSpace && - ((rot == 0 || rot == 2) - ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin) - : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) && - fabs(word1->fontSize - fontSize) < - maxBlockFontSizeDelta1 * fontSize) { - word2 = word1; - if (word0) { - word0->next = word1->next; - } else { - pool->setPool(baseIdx, word1->next); - } - word1 = word1->next; - word2->next = NULL; - blk->addWord(word2); - found = gTrue; - newMaxBase = word2->base; - } else { - word0 = word1; - word1 = word1->next; - } - } - } - maxBase = newMaxBase; - - // look for words that are on lines already in the block, and - // that overlap the block horizontally - for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); - baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); - ++baseIdx) { - word0 = NULL; - word1 = pool->getPool(baseIdx); - while (word1) { - if (word1->base >= minBase - intraLineSpace && - word1->base <= maxBase + intraLineSpace && - ((rot == 0 || rot == 2) - ? (word1->xMin < blk->xMax + colSpace1 && - word1->xMax > blk->xMin - colSpace1) - : (word1->yMin < blk->yMax + colSpace1 && - word1->yMax > blk->yMin - colSpace1)) && - fabs(word1->fontSize - fontSize) < - maxBlockFontSizeDelta2 * fontSize) { - word2 = word1; - if (word0) { - word0->next = word1->next; - } else { - pool->setPool(baseIdx, word1->next); - } - word1 = word1->next; - word2->next = NULL; - blk->addWord(word2); - found = gTrue; - } else { - word0 = word1; - word1 = word1->next; - } - } - } - - // only check for outlying words (the next two chunks of code) - // if we didn't find anything else - if (found) { - continue; - } - - // scan down the left side of the block, looking for words - // that are near (but not overlapping) the block; if there are - // three or fewer, add them to the block - n = 0; - for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); - baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); - ++baseIdx) { - word1 = pool->getPool(baseIdx); - while (word1) { - if (word1->base >= minBase - intraLineSpace && - word1->base <= maxBase + intraLineSpace && - ((rot == 0 || rot == 2) - ? (word1->xMax <= blk->xMin && - word1->xMax > blk->xMin - colSpace2) - : (word1->yMax <= blk->yMin && - word1->yMax > blk->yMin - colSpace2)) && - fabs(word1->fontSize - fontSize) < - maxBlockFontSizeDelta3 * fontSize) { - ++n; - break; - } - word1 = word1->next; - } - } - if (n > 0 && n <= 3) { - for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); - baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); - ++baseIdx) { - word0 = NULL; - word1 = pool->getPool(baseIdx); - while (word1) { - if (word1->base >= minBase - intraLineSpace && - word1->base <= maxBase + intraLineSpace && - ((rot == 0 || rot == 2) - ? (word1->xMax <= blk->xMin && - word1->xMax > blk->xMin - colSpace2) - : (word1->yMax <= blk->yMin && - word1->yMax > blk->yMin - colSpace2)) && - fabs(word1->fontSize - fontSize) < - maxBlockFontSizeDelta3 * fontSize) { - word2 = word1; - if (word0) { - word0->next = word1->next; - } else { - pool->setPool(baseIdx, word1->next); - } - word1 = word1->next; - word2->next = NULL; - blk->addWord(word2); - if (word2->base < minBase) { - minBase = word2->base; - } else if (word2->base > maxBase) { - maxBase = word2->base; - } - found = gTrue; - break; - } else { - word0 = word1; - word1 = word1->next; - } - } - } - } - - // scan down the right side of the block, looking for words - // that are near (but not overlapping) the block; if there are - // three or fewer, add them to the block - n = 0; - for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); - baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); - ++baseIdx) { - word1 = pool->getPool(baseIdx); - while (word1) { - if (word1->base >= minBase - intraLineSpace && - word1->base <= maxBase + intraLineSpace && - ((rot == 0 || rot == 2) - ? (word1->xMin >= blk->xMax && - word1->xMin < blk->xMax + colSpace2) - : (word1->yMin >= blk->yMax && - word1->yMin < blk->yMax + colSpace2)) && - fabs(word1->fontSize - fontSize) < - maxBlockFontSizeDelta3 * fontSize) { - ++n; - break; - } - word1 = word1->next; - } - } - if (n > 0 && n <= 3) { - for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace); - baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace); - ++baseIdx) { - word0 = NULL; - word1 = pool->getPool(baseIdx); - while (word1) { - if (word1->base >= minBase - intraLineSpace && - word1->base <= maxBase + intraLineSpace && - ((rot == 0 || rot == 2) - ? (word1->xMin >= blk->xMax && - word1->xMin < blk->xMax + colSpace2) - : (word1->yMin >= blk->yMax && - word1->yMin < blk->yMax + colSpace2)) && - fabs(word1->fontSize - fontSize) < - maxBlockFontSizeDelta3 * fontSize) { - word2 = word1; - if (word0) { - word0->next = word1->next; - } else { - pool->setPool(baseIdx, word1->next); - } - word1 = word1->next; - word2->next = NULL; - blk->addWord(word2); - if (word2->base < minBase) { - minBase = word2->base; - } else if (word2->base > maxBase) { - maxBase = word2->base; - } - found = gTrue; - break; - } else { - word0 = word1; - word1 = word1->next; - } - } - } - } - - } while (found); - - //~ need to compute the primary writing mode (horiz/vert) in - //~ addition to primary rotation - - // coalesce the block, and add it to the list - blk->coalesce(uMap); - if (lastBlk) { - lastBlk->next = blk; - } else { - blkList = blk; - } - lastBlk = blk; - count[rot] += blk->charCount; - if (primaryRot < 0 || count[rot] > count[primaryRot]) { - primaryRot = rot; - } - ++nBlocks; - } - } - -#if 0 // for debugging - printf("*** rotation ***\n"); - for (rot = 0; rot < 4; ++rot) { - printf(" %d: %6d\n", rot, count[rot]); - } - printf(" primary rot = %d\n", primaryRot); - printf("\n"); -#endif - -#if 0 // for debugging - printf("*** blocks ***\n"); - for (blk = blkList; blk; blk = blk->next) { - printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f\n", - blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax); - for (line = blk->lines; line; line = line->next) { - printf(" line: x=%.2f..%.2f y=%.2f..%.2f base=%.2f\n", - line->xMin, line->xMax, line->yMin, line->yMax, line->base); - for (word0 = line->words; word0; word0 = word0->next) { - printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", - word0->xMin, word0->xMax, word0->yMin, word0->yMax, - word0->base, word0->fontSize, word0->spaceAfter); - for (i = 0; i < word0->len; ++i) { - fputc(word0->text[i] & 0xff, stdout); - } - printf("'\n"); - } - } - } - printf("\n"); -#endif - - // determine the primary direction - lrCount = 0; - for (blk = blkList; blk; blk = blk->next) { - for (line = blk->lines; line; line = line->next) { - for (word0 = line->words; word0; word0 = word0->next) { - for (i = 0; i < word0->len; ++i) { - if (unicodeTypeL(word0->text[i])) { - ++lrCount; - } else if (unicodeTypeR(word0->text[i])) { - --lrCount; - } - } - } - } - } - primaryLR = lrCount >= 0; - -#if 0 // for debugging - printf("*** direction ***\n"); - printf("lrCount = %d\n", lrCount); - printf("primaryLR = %d\n", primaryLR); -#endif - - //----- column assignment - - // sort blocks into xy order for column assignment - blocks = (TextBlock **)gmallocn(nBlocks, sizeof(TextBlock *)); - for (blk = blkList, i = 0; blk; blk = blk->next, ++i) { - blocks[i] = blk; - } - qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpXYPrimaryRot); - - // column assignment - for (i = 0; i < nBlocks; ++i) { - blk0 = blocks[i]; - col1 = 0; - for (j = 0; j < i; ++j) { - blk1 = blocks[j]; - col2 = 0; // make gcc happy - switch (primaryRot) { - case 0: - if (blk0->xMin > blk1->xMax) { - col2 = blk1->col + blk1->nColumns + 3; - } else if (blk1->xMax == blk1->xMin) { - col2 = blk1->col; - } else { - col2 = blk1->col + (int)(((blk0->xMin - blk1->xMin) / - (blk1->xMax - blk1->xMin)) * - blk1->nColumns); - } - break; - case 1: - if (blk0->yMin > blk1->yMax) { - col2 = blk1->col + blk1->nColumns + 3; - } else if (blk1->yMax == blk1->yMin) { - col2 = blk1->col; - } else { - col2 = blk1->col + (int)(((blk0->yMin - blk1->yMin) / - (blk1->yMax - blk1->yMin)) * - blk1->nColumns); - } - break; - case 2: - if (blk0->xMax < blk1->xMin) { - col2 = blk1->col + blk1->nColumns + 3; - } else if (blk1->xMin == blk1->xMax) { - col2 = blk1->col; - } else { - col2 = blk1->col + (int)(((blk0->xMax - blk1->xMax) / - (blk1->xMin - blk1->xMax)) * - blk1->nColumns); - } - break; - case 3: - if (blk0->yMax < blk1->yMin) { - col2 = blk1->col + blk1->nColumns + 3; - } else if (blk1->yMin == blk1->yMax) { - col2 = blk1->col; - } else { - col2 = blk1->col + (int)(((blk0->yMax - blk1->yMax) / - (blk1->yMin - blk1->yMax)) * - blk1->nColumns); - } - break; - } - if (col2 > col1) { - col1 = col2; - } - } - blk0->col = col1; - for (line = blk0->lines; line; line = line->next) { - for (j = 0; j <= line->len; ++j) { - line->col[j] += col1; - } - } - } - -#if 0 // for debugging - printf("*** blocks, after column assignment ***\n"); - for (blk = blkList; blk; blk = blk->next) { - printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f col=%d nCols=%d\n", - blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, blk->col, - blk->nColumns); - for (line = blk->lines; line; line = line->next) { - printf(" line:\n"); - for (word0 = line->words; word0; word0 = word0->next) { - printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", - word0->xMin, word0->xMax, word0->yMin, word0->yMax, - word0->base, word0->fontSize, word0->spaceAfter); - for (i = 0; i < word0->len; ++i) { - fputc(word0->text[i] & 0xff, stdout); - } - printf("'\n"); - } - } - } - printf("\n"); -#endif - - //----- reading order sort - - // sort blocks into yx order (in preparation for reading order sort) - qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpYXPrimaryRot); - - // compute space on left and right sides of each block - for (i = 0; i < nBlocks; ++i) { - blk0 = blocks[i]; - for (j = 0; j < nBlocks; ++j) { - blk1 = blocks[j]; - if (blk1 != blk0) { - blk0->updatePriMinMax(blk1); - } - } - } - -#if 0 // for debugging - printf("*** blocks, after yx sort ***\n"); - for (i = 0; i < nBlocks; ++i) { - blk = blocks[i]; - printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f space=%.2f..%.2f\n", - blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, - blk->priMin, blk->priMax); - for (line = blk->lines; line; line = line->next) { - printf(" line:\n"); - for (word0 = line->words; word0; word0 = word0->next) { - printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", - word0->xMin, word0->xMax, word0->yMin, word0->yMax, - word0->base, word0->fontSize, word0->spaceAfter); - for (j = 0; j < word0->len; ++j) { - fputc(word0->text[j] & 0xff, stdout); - } - printf("'\n"); - } - } - } - printf("\n"); -#endif - - // build the flows - //~ this needs to be adjusted for writing mode (vertical text) - //~ this also needs to account for right-to-left column ordering - blkArray = (TextBlock **)gmallocn(nBlocks, sizeof(TextBlock *)); - memcpy(blkArray, blocks, nBlocks * sizeof(TextBlock *)); - flows = lastFlow = NULL; - firstBlkIdx = 0; - nBlocksLeft = nBlocks; - while (nBlocksLeft > 0) { - - // find the upper-left-most block - for (; !blkArray[firstBlkIdx]; ++firstBlkIdx) ; - i = firstBlkIdx; - blk = blkArray[i]; - for (j = firstBlkIdx + 1; j < nBlocks; ++j) { - blk1 = blkArray[j]; - if (blk1) { - if (blk && blk->secondaryDelta(blk1) > 0) { - break; - } - if (blk1->primaryCmp(blk) < 0) { - i = j; - blk = blk1; - } - } - } - blkArray[i] = NULL; - --nBlocksLeft; - blk->next = NULL; - - // create a new flow, starting with the upper-left-most block - flow = new TextFlow(this, blk); - if (lastFlow) { - lastFlow->next = flow; - } else { - flows = flow; - } - lastFlow = flow; - fontSize = blk->lines->words->fontSize; - - // push the upper-left-most block on the stack - blk->stackNext = NULL; - blkStack = blk; - - // find the other blocks in this flow - while (blkStack) { - - // find the upper-left-most block under (but within - // maxBlockSpacing of) the top block on the stack - blkSpace = maxBlockSpacing * blkStack->lines->words->fontSize; - blk = NULL; - i = -1; - for (j = firstBlkIdx; j < nBlocks; ++j) { - blk1 = blkArray[j]; - if (blk1) { - if (blkStack->secondaryDelta(blk1) > blkSpace) { - break; - } - if (blk && blk->secondaryDelta(blk1) > 0) { - break; - } - if (blk1->isBelow(blkStack) && - (!blk || blk1->primaryCmp(blk) < 0)) { - i = j; - blk = blk1; - } - } - } - - // if a suitable block was found, add it to the flow and push it - // onto the stack - if (blk && flow->blockFits(blk, blkStack)) { - blkArray[i] = NULL; - --nBlocksLeft; - blk->next = NULL; - flow->addBlock(blk); - fontSize = blk->lines->words->fontSize; - blk->stackNext = blkStack; - blkStack = blk; - - // otherwise (if there is no block under the top block or the - // block is not suitable), pop the stack - } else { - blkStack = blkStack->stackNext; - } - } - } - gfree(blkArray); - -#if 0 // for debugging - printf("*** flows ***\n"); - for (flow = flows; flow; flow = flow->next) { - printf("flow: x=%.2f..%.2f y=%.2f..%.2f pri:%.2f..%.2f\n", - flow->xMin, flow->xMax, flow->yMin, flow->yMax, - flow->priMin, flow->priMax); - for (blk = flow->blocks; blk; blk = blk->next) { - printf(" block: rot=%d x=%.2f..%.2f y=%.2f..%.2f pri=%.2f..%.2f\n", - blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, - blk->priMin, blk->priMax); - for (line = blk->lines; line; line = line->next) { - printf(" line:\n"); - for (word0 = line->words; word0; word0 = word0->next) { - printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '", - word0->xMin, word0->xMax, word0->yMin, word0->yMax, - word0->base, word0->fontSize, word0->spaceAfter); - for (i = 0; i < word0->len; ++i) { - fputc(word0->text[i] & 0xff, stdout); - } - printf("'\n"); - } - } - } - } - printf("\n"); -#endif - - if (uMap) { - uMap->decRefCnt(); - } -} - -GBool TextPage::findText(Unicode *s, int len, - GBool startAtTop, GBool stopAtBottom, - GBool startAtLast, GBool stopAtLast, - GBool caseSensitive, GBool backward, - double *xMin, double *yMin, - double *xMax, double *yMax) { - TextBlock *blk; - TextLine *line; - Unicode *s2, *txt; - Unicode *p; - int txtSize, m, i, j, k; - double xStart, yStart, xStop, yStop; - double xMin0, yMin0, xMax0, yMax0; - double xMin1, yMin1, xMax1, yMax1; - GBool found; - - //~ needs to handle right-to-left text - - if (rawOrder) { - return gFalse; - } - - // convert the search string to uppercase - if (!caseSensitive) { - s2 = (Unicode *)gmallocn(len, sizeof(Unicode)); - for (i = 0; i < len; ++i) { - s2[i] = unicodeToUpper(s[i]); - } - } else { - s2 = s; - } - - txt = NULL; - txtSize = 0; - - xStart = yStart = xStop = yStop = 0; - if (startAtLast && haveLastFind) { - xStart = lastFindXMin; - yStart = lastFindYMin; - } else if (!startAtTop) { - xStart = *xMin; - yStart = *yMin; - } - if (stopAtLast && haveLastFind) { - xStop = lastFindXMin; - yStop = lastFindYMin; - } else if (!stopAtBottom) { - xStop = *xMax; - yStop = *yMax; - } - - found = gFalse; - xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy - xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy - - for (i = backward ? nBlocks - 1 : 0; - backward ? i >= 0 : i < nBlocks; - i += backward ? -1 : 1) { - blk = blocks[i]; - - // check: is the block above the top limit? - if (!startAtTop && (backward ? blk->yMin > yStart : blk->yMax < yStart)) { - continue; - } - - // check: is the block below the bottom limit? - if (!stopAtBottom && (backward ? blk->yMax < yStop : blk->yMin > yStop)) { - break; - } - - for (line = blk->lines; line; line = line->next) { - - // check: is the line above the top limit? - if (!startAtTop && - (backward ? line->yMin > yStart : line->yMin < yStart)) { - continue; - } - - // check: is the line below the bottom limit? - if (!stopAtBottom && - (backward ? line->yMin < yStop : line->yMin > yStop)) { - continue; - } - - // convert the line to uppercase - m = line->len; - if (!caseSensitive) { - if (m > txtSize) { - txt = (Unicode *)greallocn(txt, m, sizeof(Unicode)); - txtSize = m; - } - for (k = 0; k < m; ++k) { - txt[k] = unicodeToUpper(line->text[k]); - } - } else { - txt = line->text; - } - - // search each position in this line - j = backward ? m - len : 0; - p = txt + j; - while (backward ? j >= 0 : j <= m - len) { - - // compare the strings - for (k = 0; k < len; ++k) { - if (p[k] != s2[k]) { - break; - } - } - - // found it - if (k == len) { - switch (line->rot) { - case 0: - xMin1 = line->edge[j]; - xMax1 = line->edge[j + len]; - yMin1 = line->yMin; - yMax1 = line->yMax; - break; - case 1: - xMin1 = line->xMin; - xMax1 = line->xMax; - yMin1 = line->edge[j]; - yMax1 = line->edge[j + len]; - break; - case 2: - xMin1 = line->edge[j + len]; - xMax1 = line->edge[j]; - yMin1 = line->yMin; - yMax1 = line->yMax; - break; - case 3: - xMin1 = line->xMin; - xMax1 = line->xMax; - yMin1 = line->edge[j + len]; - yMax1 = line->edge[j]; - break; - } - if (backward) { - if ((startAtTop || - yMin1 < yStart || (yMin1 == yStart && xMin1 < xStart)) && - (stopAtBottom || - yMin1 > yStop || (yMin1 == yStop && xMin1 > xStop))) { - if (!found || - yMin1 > yMin0 || (yMin1 == yMin0 && xMin1 > xMin0)) { - xMin0 = xMin1; - xMax0 = xMax1; - yMin0 = yMin1; - yMax0 = yMax1; - found = gTrue; - } - } - } else { - if ((startAtTop || - yMin1 > yStart || (yMin1 == yStart && xMin1 > xStart)) && - (stopAtBottom || - yMin1 < yStop || (yMin1 == yStop && xMin1 < xStop))) { - if (!found || - yMin1 < yMin0 || (yMin1 == yMin0 && xMin1 < xMin0)) { - xMin0 = xMin1; - xMax0 = xMax1; - yMin0 = yMin1; - yMax0 = yMax1; - found = gTrue; - } - } - } - } - if (backward) { - --j; - --p; - } else { - ++j; - ++p; - } - } - } - } - - if (!caseSensitive) { - gfree(s2); - gfree(txt); - } - - if (found) { - *xMin = xMin0; - *xMax = xMax0; - *yMin = yMin0; - *yMax = yMax0; - lastFindXMin = xMin0; - lastFindYMin = yMin0; - haveLastFind = gTrue; - return gTrue; - } - - return gFalse; -} - -GString *TextPage::getText(double xMin, double yMin, - double xMax, double yMax) { - GString *s; - UnicodeMap *uMap; - GBool isUnicode; - TextBlock *blk; - TextLine *line; - TextLineFrag *frags; - int nFrags, fragsSize; - TextLineFrag *frag; - char space[8], eol[16]; - int spaceLen, eolLen; - int lastRot; - double x, y, delta; - int col, idx0, idx1, i, j; - GBool multiLine, oneRot; - - s = new GString(); - - if (rawOrder) { - return s; - } - - // get the output encoding - if (!(uMap = globalParams->getTextEncoding())) { - return s; - } - isUnicode = uMap->isUnicode(); - spaceLen = uMap->mapUnicode(0x20, space, sizeof(space)); - eolLen = 0; // make gcc happy - switch (globalParams->getTextEOL()) { - case eolUnix: - eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol)); - break; - case eolDOS: - eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); - eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen); - break; - case eolMac: - eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); - break; - } - - //~ writing mode (horiz/vert) - - // collect the line fragments that are in the rectangle - fragsSize = 256; - frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag)); - nFrags = 0; - lastRot = -1; - oneRot = gTrue; - for (i = 0; i < nBlocks; ++i) { - blk = blocks[i]; - if (xMin < blk->xMax && blk->xMin < xMax && - yMin < blk->yMax && blk->yMin < yMax) { - for (line = blk->lines; line; line = line->next) { - if (xMin < line->xMax && line->xMin < xMax && - yMin < line->yMax && line->yMin < yMax) { - idx0 = idx1 = -1; - switch (line->rot) { - case 0: - y = 0.5 * (line->yMin + line->yMax); - if (yMin < y && y < yMax) { - j = 0; - while (j < line->len) { - if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) { - idx0 = j; - break; - } - ++j; - } - j = line->len - 1; - while (j >= 0) { - if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) { - idx1 = j; - break; - } - --j; - } - } - break; - case 1: - x = 0.5 * (line->xMin + line->xMax); - if (xMin < x && x < xMax) { - j = 0; - while (j < line->len) { - if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) { - idx0 = j; - break; - } - ++j; - } - j = line->len - 1; - while (j >= 0) { - if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) { - idx1 = j; - break; - } - --j; - } - } - break; - case 2: - y = 0.5 * (line->yMin + line->yMax); - if (yMin < y && y < yMax) { - j = 0; - while (j < line->len) { - if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) { - idx0 = j; - break; - } - ++j; - } - j = line->len - 1; - while (j >= 0) { - if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) { - idx1 = j; - break; - } - --j; - } - } - break; - case 3: - x = 0.5 * (line->xMin + line->xMax); - if (xMin < x && x < xMax) { - j = 0; - while (j < line->len) { - if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) { - idx0 = j; - break; - } - ++j; - } - j = line->len - 1; - while (j >= 0) { - if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) { - idx1 = j; - break; - } - --j; - } - } - break; - } - if (idx0 >= 0 && idx1 >= 0) { - if (nFrags == fragsSize) { - fragsSize *= 2; - frags = (TextLineFrag *) - greallocn(frags, fragsSize, sizeof(TextLineFrag)); - } - frags[nFrags].init(line, idx0, idx1 - idx0 + 1); - ++nFrags; - if (lastRot >= 0 && line->rot != lastRot) { - oneRot = gFalse; - } - lastRot = line->rot; - } - } - } - } - } - - // sort the fragments and generate the string - if (nFrags > 0) { - - for (i = 0; i < nFrags; ++i) { - frags[i].computeCoords(oneRot); - } - assignColumns(frags, nFrags, oneRot); - - // if all lines in the region have the same rotation, use it; - // otherwise, use the page's primary rotation - if (oneRot) { - qsort(frags, nFrags, sizeof(TextLineFrag), - &TextLineFrag::cmpYXLineRot); - } else { - qsort(frags, nFrags, sizeof(TextLineFrag), - &TextLineFrag::cmpYXPrimaryRot); - } - i = 0; - while (i < nFrags) { - delta = maxIntraLineDelta * frags[i].line->words->fontSize; - for (j = i+1; - j < nFrags && fabs(frags[j].base - frags[i].base) < delta; - ++j) ; - qsort(frags + i, j - i, sizeof(TextLineFrag), - oneRot ? &TextLineFrag::cmpXYColumnLineRot - : &TextLineFrag::cmpXYColumnPrimaryRot); - i = j; - } - - col = 0; - multiLine = gFalse; - for (i = 0; i < nFrags; ++i) { - frag = &frags[i]; - - // insert a return - if (frag->col < col || - (i > 0 && fabs(frag->base - frags[i-1].base) > - maxIntraLineDelta * frags[i-1].line->words->fontSize)) { - s->append(eol, eolLen); - col = 0; - multiLine = gTrue; - } - - // column alignment - for (; col < frag->col; ++col) { - s->append(space, spaceLen); - } - - // get the fragment text - col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s); - } - - if (multiLine) { - s->append(eol, eolLen); - } - } - - gfree(frags); - uMap->decRefCnt(); - - return s; -} - -GBool TextPage::findCharRange(int pos, int length, - double *xMin, double *yMin, - double *xMax, double *yMax) { - TextBlock *blk; - TextLine *line; - TextWord *word; - double xMin0, xMax0, yMin0, yMax0; - double xMin1, xMax1, yMin1, yMax1; - GBool first; - int i, j0, j1; - - if (rawOrder) { - return gFalse; - } - - //~ this doesn't correctly handle: - //~ - ranges split across multiple lines (the highlighted region - //~ is the bounding box of all the parts of the range) - //~ - cases where characters don't convert one-to-one into Unicode - first = gTrue; - xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy - xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy - for (i = 0; i < nBlocks; ++i) { - blk = blocks[i]; - for (line = blk->lines; line; line = line->next) { - for (word = line->words; word; word = word->next) { - if (pos < word->charPos + word->charLen && - word->charPos < pos + length) { - j0 = pos - word->charPos; - if (j0 < 0) { - j0 = 0; - } - j1 = pos + length - 1 - word->charPos; - if (j1 >= word->len) { - j1 = word->len - 1; - } - switch (line->rot) { - case 0: - xMin1 = word->edge[j0]; - xMax1 = word->edge[j1 + 1]; - yMin1 = word->yMin; - yMax1 = word->yMax; - break; - case 1: - xMin1 = word->xMin; - xMax1 = word->xMax; - yMin1 = word->edge[j0]; - yMax1 = word->edge[j1 + 1]; - break; - case 2: - xMin1 = word->edge[j1 + 1]; - xMax1 = word->edge[j0]; - yMin1 = word->yMin; - yMax1 = word->yMax; - break; - case 3: - xMin1 = word->xMin; - xMax1 = word->xMax; - yMin1 = word->edge[j1 + 1]; - yMax1 = word->edge[j0]; - break; - } - if (first || xMin1 < xMin0) { - xMin0 = xMin1; - } - if (first || xMax1 > xMax0) { - xMax0 = xMax1; - } - if (first || yMin1 < yMin0) { - yMin0 = yMin1; - } - if (first || yMax1 > yMax0) { - yMax0 = yMax1; - } - first = gFalse; - } - } - } - } - if (!first) { - *xMin = xMin0; - *xMax = xMax0; - *yMin = yMin0; - *yMax = yMax0; - return gTrue; - } - return gFalse; -} - -void TextPage::dump(void *outputStream, TextOutputFunc outputFunc, - GBool physLayout) { - UnicodeMap *uMap; - TextFlow *flow; - TextBlock *blk; - TextLine *line; - TextLineFrag *frags; - TextWord *word; - int nFrags, fragsSize; - TextLineFrag *frag; - char space[8], eol[16], eop[8]; - int spaceLen, eolLen, eopLen; - GBool pageBreaks; - GString *s; - double delta; - int col, i, j, d, n; - - // get the output encoding - if (!(uMap = globalParams->getTextEncoding())) { - return; - } - spaceLen = uMap->mapUnicode(0x20, space, sizeof(space)); - eolLen = 0; // make gcc happy - switch (globalParams->getTextEOL()) { - case eolUnix: - eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol)); - break; - case eolDOS: - eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); - eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen); - break; - case eolMac: - eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol)); - break; - } - eopLen = uMap->mapUnicode(0x0c, eop, sizeof(eop)); - pageBreaks = globalParams->getTextPageBreaks(); - - //~ writing mode (horiz/vert) - - // output the page in raw (content stream) order - if (rawOrder) { - - for (word = rawWords; word; word = word->next) { - s = new GString(); - dumpFragment(word->text, word->len, uMap, s); - (*outputFunc)(outputStream, s->getCString(), s->getLength()); - delete s; - if (word->next && - fabs(word->next->base - word->base) < - maxIntraLineDelta * word->fontSize) { - if (word->next->xMin > word->xMax + minWordSpacing * word->fontSize) { - (*outputFunc)(outputStream, space, spaceLen); - } - } else { - (*outputFunc)(outputStream, eol, eolLen); - } - } - - // output the page, maintaining the original physical layout - } else if (physLayout) { - - // collect the line fragments for the page and sort them - fragsSize = 256; - frags = (TextLineFrag *)gmallocn(fragsSize, sizeof(TextLineFrag)); - nFrags = 0; - for (i = 0; i < nBlocks; ++i) { - blk = blocks[i]; - for (line = blk->lines; line; line = line->next) { - if (nFrags == fragsSize) { - fragsSize *= 2; - frags = (TextLineFrag *)greallocn(frags, - fragsSize, sizeof(TextLineFrag)); - } - frags[nFrags].init(line, 0, line->len); - frags[nFrags].computeCoords(gTrue); - ++nFrags; - } - } - qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpYXPrimaryRot); - i = 0; - while (i < nFrags) { - delta = maxIntraLineDelta * frags[i].line->words->fontSize; - for (j = i+1; - j < nFrags && fabs(frags[j].base - frags[i].base) < delta; - ++j) ; - qsort(frags + i, j - i, sizeof(TextLineFrag), - &TextLineFrag::cmpXYColumnPrimaryRot); - i = j; - } - -#if 0 // for debugging - printf("*** line fragments ***\n"); - for (i = 0; i < nFrags; ++i) { - frag = &frags[i]; - printf("frag: x=%.2f..%.2f y=%.2f..%.2f base=%.2f '", - frag->xMin, frag->xMax, frag->yMin, frag->yMax, frag->base); - for (n = 0; n < frag->len; ++n) { - fputc(frag->line->text[frag->start + n] & 0xff, stdout); - } - printf("'\n"); - } - printf("\n"); -#endif - - // generate output - col = 0; - for (i = 0; i < nFrags; ++i) { - frag = &frags[i]; - - // column alignment - for (; col < frag->col; ++col) { - (*outputFunc)(outputStream, space, spaceLen); - } - - // print the line - s = new GString(); - col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s); - (*outputFunc)(outputStream, s->getCString(), s->getLength()); - delete s; - - // print one or more returns if necessary - if (i == nFrags - 1 || - frags[i+1].col < col || - fabs(frags[i+1].base - frag->base) > - maxIntraLineDelta * frag->line->words->fontSize) { - if (i < nFrags - 1) { - d = (int)((frags[i+1].base - frag->base) / - frag->line->words->fontSize); - if (d < 1) { - d = 1; - } else if (d > 5) { - d = 5; - } - } else { - d = 1; - } - for (; d > 0; --d) { - (*outputFunc)(outputStream, eol, eolLen); - } - col = 0; - } - } - - gfree(frags); - - // output the page, "undoing" the layout - } else { - for (flow = flows; flow; flow = flow->next) { - for (blk = flow->blocks; blk; blk = blk->next) { - for (line = blk->lines; line; line = line->next) { - n = line->len; - if (line->hyphenated && (line->next || blk->next)) { - --n; - } - s = new GString(); - dumpFragment(line->text, n, uMap, s); - (*outputFunc)(outputStream, s->getCString(), s->getLength()); - delete s; - if (!line->hyphenated) { - if (line->next) { - (*outputFunc)(outputStream, space, spaceLen); - } else if (blk->next) { - //~ this is a bit of a kludge - we should really do a more - //~ intelligent determination of paragraphs - if (blk->next->lines->words->fontSize == - blk->lines->words->fontSize) { - (*outputFunc)(outputStream, space, spaceLen); - } else { - (*outputFunc)(outputStream, eol, eolLen); - } - } - } - } - } - (*outputFunc)(outputStream, eol, eolLen); - (*outputFunc)(outputStream, eol, eolLen); - } - } - - // end of page - if (pageBreaks) { - (*outputFunc)(outputStream, eop, eopLen); - } - - uMap->decRefCnt(); -} - -void TextPage::assignColumns(TextLineFrag *frags, int nFrags, GBool oneRot) { - TextLineFrag *frag0, *frag1; - int rot, col1, col2, i, j, k; - - // all text in the region has the same rotation -- recompute the - // column numbers based only on the text in the region - if (oneRot) { - qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpXYLineRot); - rot = frags[0].line->rot; - for (i = 0; i < nFrags; ++i) { - frag0 = &frags[i]; - col1 = 0; - for (j = 0; j < i; ++j) { - frag1 = &frags[j]; - col2 = 0; // make gcc happy - switch (rot) { - case 0: - if (frag0->xMin >= frag1->xMax) { - col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - - frag1->line->col[frag1->start]) + 1; - } else { - for (k = frag1->start; - k < frag1->start + frag1->len && - frag0->xMin >= 0.5 * (frag1->line->edge[k] + - frag1->line->edge[k+1]); - ++k) ; - col2 = frag1->col + - frag1->line->col[k] - frag1->line->col[frag1->start]; - } - break; - case 1: - if (frag0->yMin >= frag1->yMax) { - col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - - frag1->line->col[frag1->start]) + 1; - } else { - for (k = frag1->start; - k < frag1->start + frag1->len && - frag0->yMin >= 0.5 * (frag1->line->edge[k] + - frag1->line->edge[k+1]); - ++k) ; - col2 = frag1->col + - frag1->line->col[k] - frag1->line->col[frag1->start]; - } - break; - case 2: - if (frag0->xMax <= frag1->xMin) { - col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - - frag1->line->col[frag1->start]) + 1; - } else { - for (k = frag1->start; - k < frag1->start + frag1->len && - frag0->xMax <= 0.5 * (frag1->line->edge[k] + - frag1->line->edge[k+1]); - ++k) ; - col2 = frag1->col + - frag1->line->col[k] - frag1->line->col[frag1->start]; - } - break; - case 3: - if (frag0->yMax <= frag1->yMin) { - col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] - - frag1->line->col[frag1->start]) + 1; - } else { - for (k = frag1->start; - k < frag1->start + frag1->len && - frag0->yMax <= 0.5 * (frag1->line->edge[k] + - frag1->line->edge[k+1]); - ++k) ; - col2 = frag1->col + - frag1->line->col[k] - frag1->line->col[frag1->start]; - } - break; - } - if (col2 > col1) { - col1 = col2; - } - } - frag0->col = col1; - } - - // the region includes text at different rotations -- use the - // globally assigned column numbers, offset by the minimum column - // number (i.e., shift everything over to column 0) - } else { - col1 = frags[0].col; - for (i = 1; i < nFrags; ++i) { - if (frags[i].col < col1) { - col1 = frags[i].col; - } - } - for (i = 0; i < nFrags; ++i) { - frags[i].col -= col1; - } - } -} - -int TextPage::dumpFragment(Unicode *text, int len, UnicodeMap *uMap, - GString *s) { - char lre[8], rle[8], popdf[8], buf[8]; - int lreLen, rleLen, popdfLen, n; - int nCols, i, j, k; - - nCols = 0; - - if (uMap->isUnicode()) { - - lreLen = uMap->mapUnicode(0x202a, lre, sizeof(lre)); - rleLen = uMap->mapUnicode(0x202b, rle, sizeof(rle)); - popdfLen = uMap->mapUnicode(0x202c, popdf, sizeof(popdf)); - - if (primaryLR) { - - i = 0; - while (i < len) { - // output a left-to-right section - for (j = i; j < len && !unicodeTypeR(text[j]); ++j) ; - for (k = i; k < j; ++k) { - n = uMap->mapUnicode(text[k], buf, sizeof(buf)); - s->append(buf, n); - ++nCols; - } - i = j; - // output a right-to-left section - for (j = i; j < len && !unicodeTypeL(text[j]); ++j) ; - if (j > i) { - s->append(rle, rleLen); - for (k = j - 1; k >= i; --k) { - n = uMap->mapUnicode(text[k], buf, sizeof(buf)); - s->append(buf, n); - ++nCols; - } - s->append(popdf, popdfLen); - i = j; - } - } - - } else { - - s->append(rle, rleLen); - i = len - 1; - while (i >= 0) { - // output a right-to-left section - for (j = i; j >= 0 && !unicodeTypeL(text[j]); --j) ; - for (k = i; k > j; --k) { - n = uMap->mapUnicode(text[k], buf, sizeof(buf)); - s->append(buf, n); - ++nCols; - } - i = j; - // output a left-to-right section - for (j = i; j >= 0 && !unicodeTypeR(text[j]); --j) ; - if (j < i) { - s->append(lre, lreLen); - for (k = j + 1; k <= i; ++k) { - n = uMap->mapUnicode(text[k], buf, sizeof(buf)); - s->append(buf, n); - ++nCols; - } - s->append(popdf, popdfLen); - i = j; - } - } - s->append(popdf, popdfLen); - - } - - } else { - for (i = 0; i < len; ++i) { - n = uMap->mapUnicode(text[i], buf, sizeof(buf)); - s->append(buf, n); - nCols += n; - } - } - - return nCols; -} - -#if TEXTOUT_WORD_LIST -TextWordList *TextPage::makeWordList(GBool physLayout) { - return new TextWordList(this, physLayout); -} -#endif - -//------------------------------------------------------------------------ -// TextOutputDev -//------------------------------------------------------------------------ - -static void outputToFile(void *stream, char *text, int len) { - fwrite(text, 1, len, (FILE *)stream); -} - -TextOutputDev::TextOutputDev(char *fileName, GBool physLayoutA, - GBool rawOrderA, GBool append) { - text = NULL; - physLayout = physLayoutA; - rawOrder = rawOrderA; - doHTML = gFalse; - ok = gTrue; - - // open file - needClose = gFalse; - if (fileName) { - if (!strcmp(fileName, "-")) { - outputStream = stdout; -#ifdef WIN32 - // keep DOS from munging the end-of-line characters - setmode(fileno(stdout), O_BINARY); -#endif - } else if ((outputStream = fopen(fileName, append ? "ab" : "wb"))) { - needClose = gTrue; - } else { - error(-1, "Couldn't open text file '%s'", fileName); - ok = gFalse; - return; - } - outputFunc = &outputToFile; - } else { - outputStream = NULL; - } - - // set up text object - text = new TextPage(rawOrderA); -} - -TextOutputDev::TextOutputDev(TextOutputFunc func, void *stream, - GBool physLayoutA, GBool rawOrderA) { - outputFunc = func; - outputStream = stream; - needClose = gFalse; - physLayout = physLayoutA; - rawOrder = rawOrderA; - doHTML = gFalse; - text = new TextPage(rawOrderA); - ok = gTrue; -} - -TextOutputDev::~TextOutputDev() { - if (needClose) { -#ifdef MACOS - ICS_MapRefNumAndAssign((short)((FILE *)outputStream)->handle); -#endif - fclose((FILE *)outputStream); - } - if (text) { - delete text; - } -} - -void TextOutputDev::startPage(int pageNum, GfxState *state) { - text->startPage(state); -} - -void TextOutputDev::endPage() { - text->endPage(); - text->coalesce(physLayout, doHTML); - if (outputStream) { - text->dump(outputStream, outputFunc, physLayout); - } -} - -void TextOutputDev::updateFont(GfxState *state) { - text->updateFont(state); -} - -void TextOutputDev::beginString(GfxState *state, GString *s) { -} - -void TextOutputDev::endString(GfxState *state) { -} - -void TextOutputDev::drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode c, int nBytes, Unicode *u, int uLen) { - text->addChar(state, x, y, dx, dy, c, nBytes, u, uLen); -} - -void TextOutputDev::stroke(GfxState *state) { - GfxPath *path; - GfxSubpath *subpath; - double x[2], y[2]; - - if (!doHTML) { - return; - } - path = state->getPath(); - if (path->getNumSubpaths() != 1) { - return; - } - subpath = path->getSubpath(0); - if (subpath->getNumPoints() != 2) { - return; - } - state->transform(subpath->getX(0), subpath->getY(0), &x[0], &y[0]); - state->transform(subpath->getX(1), subpath->getY(1), &x[1], &y[1]); - - // look for a vertical or horizontal line - if (x[0] == x[1] || y[0] == y[1]) { - text->addUnderline(x[0], y[0], x[1], y[1]); - } -} - -void TextOutputDev::fill(GfxState *state) { - GfxPath *path; - GfxSubpath *subpath; - double x[5], y[5]; - double rx0, ry0, rx1, ry1, t; - int i; - - if (!doHTML) { - return; - } - path = state->getPath(); - if (path->getNumSubpaths() != 1) { - return; - } - subpath = path->getSubpath(0); - if (subpath->getNumPoints() != 5) { - return; - } - for (i = 0; i < 5; ++i) { - if (subpath->getCurve(i)) { - return; - } - state->transform(subpath->getX(i), subpath->getY(i), &x[i], &y[i]); - } - - // look for a rectangle - if (x[0] == x[1] && y[1] == y[2] && x[2] == x[3] && y[3] == y[4] && - x[0] == x[4] && y[0] == y[4]) { - rx0 = x[0]; - ry0 = y[0]; - rx1 = x[2]; - ry1 = y[1]; - } else if (y[0] == y[1] && x[1] == x[2] && y[2] == y[3] && x[3] == x[4] && - x[0] == x[4] && y[0] == y[4]) { - rx0 = x[0]; - ry0 = y[0]; - rx1 = x[1]; - ry1 = y[2]; - } else { - return; - } - if (rx1 < rx0) { - t = rx0; - rx0 = rx1; - rx1 = t; - } - if (ry1 < ry0) { - t = ry0; - ry0 = ry1; - ry1 = t; - } - - // skinny horizontal rectangle - if (ry1 - ry0 < rx1 - rx0) { - if (ry1 - ry0 < maxUnderlineWidth) { - ry0 = 0.5 * (ry0 + ry1); - text->addUnderline(rx0, ry0, rx1, ry0); - } - - // skinny vertical rectangle - } else { - if (rx1 - rx0 < maxUnderlineWidth) { - rx0 = 0.5 * (rx0 + rx1); - text->addUnderline(rx0, ry0, rx0, ry1); - } - } -} - -void TextOutputDev::eoFill(GfxState *state) { - if (!doHTML) { - return; - } - fill(state); -} - -void TextOutputDev::processLink(Link *link, Catalog *catalog) { - double x1, y1, x2, y2; - int xMin, yMin, xMax, yMax, x, y; - - if (!doHTML) { - return; - } - link->getRect(&x1, &y1, &x2, &y2); - cvtUserToDev(x1, y1, &x, &y); - xMin = xMax = x; - yMin = yMax = y; - cvtUserToDev(x1, y2, &x, &y); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - cvtUserToDev(x2, y1, &x, &y); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - cvtUserToDev(x2, y2, &x, &y); - if (x < xMin) { - xMin = x; - } else if (x > xMax) { - xMax = x; - } - if (y < yMin) { - yMin = y; - } else if (y > yMax) { - yMax = y; - } - text->addLink(xMin, yMin, xMax, yMax, link); -} - -GBool TextOutputDev::findText(Unicode *s, int len, - GBool startAtTop, GBool stopAtBottom, - GBool startAtLast, GBool stopAtLast, - GBool caseSensitive, GBool backward, - double *xMin, double *yMin, - double *xMax, double *yMax) { - return text->findText(s, len, startAtTop, stopAtBottom, - startAtLast, stopAtLast, caseSensitive, backward, - xMin, yMin, xMax, yMax); -} - -GString *TextOutputDev::getText(double xMin, double yMin, - double xMax, double yMax) { - return text->getText(xMin, yMin, xMax, yMax); -} - -GBool TextOutputDev::findCharRange(int pos, int length, - double *xMin, double *yMin, - double *xMax, double *yMax) { - return text->findCharRange(pos, length, xMin, yMin, xMax, yMax); -} - -#if TEXTOUT_WORD_LIST -TextWordList *TextOutputDev::makeWordList() { - return text->makeWordList(physLayout); -} -#endif - -TextPage *TextOutputDev::takeText() { - TextPage *ret; - - ret = text; - text = new TextPage(rawOrder); - return ret; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.h deleted file mode 100644 index 9d4c29b06..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/TextOutputDev.h +++ /dev/null @@ -1,662 +0,0 @@ -//======================================================================== -// -// TextOutputDev.h -// -// Copyright 1997-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef TEXTOUTPUTDEV_H -#define TEXTOUTPUTDEV_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include -#include "gtypes.h" -#include "GfxFont.h" -#include "OutputDev.h" - -class GString; -class GList; -class GfxFont; -class GfxState; -class UnicodeMap; -class Link; - -class TextWord; -class TextPool; -class TextLine; -class TextLineFrag; -class TextBlock; -class TextFlow; -class TextWordList; -class TextPage; - -//------------------------------------------------------------------------ - -typedef void (*TextOutputFunc)(void *stream, char *text, int len); - -//------------------------------------------------------------------------ -// TextFontInfo -//------------------------------------------------------------------------ - -class TextFontInfo { -public: - - TextFontInfo(GfxState *state); - ~TextFontInfo(); - - GBool matches(GfxState *state); - -#if TEXTOUT_WORD_LIST - // Get the font name (which may be NULL). - GString *getFontName() { return fontName; } - - // Get font descriptor flags. - GBool isFixedWidth() { return flags & fontFixedWidth; } - GBool isSerif() { return flags & fontSerif; } - GBool isSymbolic() { return flags & fontSymbolic; } - GBool isItalic() { return flags & fontItalic; } - GBool isBold() { return flags & fontBold; } -#endif - -private: - - GfxFont *gfxFont; -#if TEXTOUT_WORD_LIST - GString *fontName; - int flags; -#endif - - friend class TextWord; - friend class TextPage; -}; - -//------------------------------------------------------------------------ -// TextWord -//------------------------------------------------------------------------ - -class TextWord { -public: - - // Constructor. - TextWord(GfxState *state, int rotA, double x0, double y0, - int charPosA, TextFontInfo *fontA, double fontSize); - - // Destructor. - ~TextWord(); - - // Add a character to the word. - void addChar(GfxState *state, double x, double y, - double dx, double dy, Unicode u); - - // Merge onto the end of . - void merge(TextWord *word); - - // Compares to , returning -1 (<), 0 (=), or +1 (>), - // based on a primary-axis comparison, e.g., x ordering if rot=0. - int primaryCmp(TextWord *word); - - // Return the distance along the primary axis between and - // . - double primaryDelta(TextWord *word); - - static int cmpYX(const void *p1, const void *p2); - - // Get the TextFontInfo object associated with this word. - TextFontInfo *getFontInfo() { return font; } - - // Get the next TextWord on the linked list. - TextWord *getNext() { return next; } - -#if TEXTOUT_WORD_LIST - int getLength() { return len; } - Unicode getChar(int idx) { return text[idx]; } - GString *getText(); - GString *getFontName() { return font->fontName; } - void getColor(double *r, double *g, double *b) - { *r = colorR; *g = colorG; *b = colorB; } - void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA) - { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } - void getCharBBox(int charIdx, double *xMinA, double *yMinA, - double *xMaxA, double *yMaxA); - double getFontSize() { return fontSize; } - int getRotation() { return rot; } - int getCharPos() { return charPos; } - int getCharLen() { return charLen; } - GBool getSpaceAfter() { return spaceAfter; } -#endif - - GBool isUnderlined() { return underlined; } - Link *getLink() { return link; } - -private: - - int rot; // rotation, multiple of 90 degrees - // (0, 1, 2, or 3) - double xMin, xMax; // bounding box x coordinates - double yMin, yMax; // bounding box y coordinates - double base; // baseline x or y coordinate - Unicode *text; // the text - double *edge; // "near" edge x or y coord of each char - // (plus one extra entry for the last char) - int len; // length of text and edge arrays - int size; // size of text and edge arrays - int charPos; // character position (within content stream) - int charLen; // number of content stream characters in - // this word - TextFontInfo *font; // font information - double fontSize; // font size - GBool spaceAfter; // set if there is a space between this - // word and the next word on the line - TextWord *next; // next word in line - -#if TEXTOUT_WORD_LIST - double colorR, // word color - colorG, - colorB; -#endif - - GBool underlined; - Link *link; - - friend class TextPool; - friend class TextLine; - friend class TextBlock; - friend class TextFlow; - friend class TextWordList; - friend class TextPage; - friend class XMLOutputDev; -}; - -//------------------------------------------------------------------------ -// TextPool -//------------------------------------------------------------------------ - -class TextPool { -public: - - TextPool(); - ~TextPool(); - - TextWord *getPool(int baseIdx) { return pool[baseIdx - minBaseIdx]; } - void setPool(int baseIdx, TextWord *p) { pool[baseIdx - minBaseIdx] = p; } - - int getBaseIdx(double base); - - void addWord(TextWord *word); - -private: - - int minBaseIdx; // min baseline bucket index - int maxBaseIdx; // max baseline bucket index - TextWord **pool; // array of linked lists, one for each - // baseline value (multiple of 4 pts) - TextWord *cursor; // pointer to last-accessed word - int cursorBaseIdx; // baseline bucket index of last-accessed word - - friend class TextBlock; - friend class TextPage; -}; - -//------------------------------------------------------------------------ -// TextLine -//------------------------------------------------------------------------ - -class TextLine { -public: - - TextLine(TextBlock *blkA, int rotA, double baseA); - ~TextLine(); - - void addWord(TextWord *word); - - // Return the distance along the primary axis between and - // . - double primaryDelta(TextLine *line); - - // Compares to , returning -1 (<), 0 (=), or +1 (>), - // based on a primary-axis comparison, e.g., x ordering if rot=0. - int primaryCmp(TextLine *line); - - // Compares to , returning -1 (<), 0 (=), or +1 (>), - // based on a secondary-axis comparison of the baselines, e.g., y - // ordering if rot=0. - int secondaryCmp(TextLine *line); - - int cmpYX(TextLine *line); - - static int cmpXY(const void *p1, const void *p2); - - void coalesce(UnicodeMap *uMap); - - // Get the head of the linked list of TextWords. - TextWord *getWords() { return words; } - - // Get the next TextLine on the linked list. - TextLine *getNext() { return next; } - - // Returns true if the last char of the line is a hyphen. - GBool isHyphenated() { return hyphenated; } - -private: - - TextBlock *blk; // parent block - int rot; // text rotation - double xMin, xMax; // bounding box x coordinates - double yMin, yMax; // bounding box y coordinates - double base; // baseline x or y coordinate - TextWord *words; // words in this line - TextWord *lastWord; // last word in this line - Unicode *text; // Unicode text of the line, including - // spaces between words - double *edge; // "near" edge x or y coord of each char - // (plus one extra entry for the last char) - int *col; // starting column number of each Unicode char - int len; // number of Unicode chars - int convertedLen; // total number of converted characters - GBool hyphenated; // set if last char is a hyphen - TextLine *next; // next line in block - - friend class TextLineFrag; - friend class TextBlock; - friend class TextFlow; - friend class TextWordList; - friend class TextPage; -}; - -//------------------------------------------------------------------------ -// TextBlock -//------------------------------------------------------------------------ - -class TextBlock { -public: - - TextBlock(TextPage *pageA, int rotA); - ~TextBlock(); - - void addWord(TextWord *word); - - void coalesce(UnicodeMap *uMap); - - // Update this block's priMin and priMax values, looking at . - void updatePriMinMax(TextBlock *blk); - - static int cmpXYPrimaryRot(const void *p1, const void *p2); - - static int cmpYXPrimaryRot(const void *p1, const void *p2); - - int primaryCmp(TextBlock *blk); - - double secondaryDelta(TextBlock *blk); - - // Returns true if is below , relative to the page's - // primary rotation. - GBool isBelow(TextBlock *blk); - - // Get the head of the linked list of TextLines. - TextLine *getLines() { return lines; } - - // Get the next TextBlock on the linked list. - TextBlock *getNext() { return next; } - -private: - - TextPage *page; // the parent page - int rot; // text rotation - double xMin, xMax; // bounding box x coordinates - double yMin, yMax; // bounding box y coordinates - double priMin, priMax; // whitespace bounding box along primary axis - - TextPool *pool; // pool of words (used only until lines - // are built) - TextLine *lines; // linked list of lines - TextLine *curLine; // most recently added line - int nLines; // number of lines - int charCount; // number of characters in the block - int col; // starting column - int nColumns; // number of columns in the block - - TextBlock *next; - TextBlock *stackNext; - - friend class TextLine; - friend class TextLineFrag; - friend class TextFlow; - friend class TextWordList; - friend class TextPage; -}; - -//------------------------------------------------------------------------ -// TextFlow -//------------------------------------------------------------------------ - -class TextFlow { -public: - - TextFlow(TextPage *pageA, TextBlock *blk); - ~TextFlow(); - - // Add a block to the end of this flow. - void addBlock(TextBlock *blk); - - // Returns true if fits below in the flow, i.e., (1) - // it uses a font no larger than the last block added to the flow, - // and (2) it fits within the flow's [priMin, priMax] along the - // primary axis. - GBool blockFits(TextBlock *blk, TextBlock *prevBlk); - - // Get the head of the linked list of TextBlocks. - TextBlock *getBlocks() { return blocks; } - - // Get the next TextFlow on the linked list. - TextFlow *getNext() { return next; } - -private: - - TextPage *page; // the parent page - double xMin, xMax; // bounding box x coordinates - double yMin, yMax; // bounding box y coordinates - double priMin, priMax; // whitespace bounding box along primary axis - TextBlock *blocks; // blocks in flow - TextBlock *lastBlk; // last block in this flow - TextFlow *next; - - friend class TextWordList; - friend class TextPage; -}; - -#if TEXTOUT_WORD_LIST - -//------------------------------------------------------------------------ -// TextWordList -//------------------------------------------------------------------------ - -class TextWordList { -public: - - // Build a flat word list, in content stream order (if - // text->rawOrder is true), physical layout order (if - // is true and text->rawOrder is false), or reading order (if both - // flags are false). - TextWordList(TextPage *text, GBool physLayout); - - ~TextWordList(); - - // Return the number of words on the list. - int getLength(); - - // Return the th word from the list. - TextWord *get(int idx); - -private: - - GList *words; // [TextWord] -}; - -#endif // TEXTOUT_WORD_LIST - -//------------------------------------------------------------------------ -// TextPage -//------------------------------------------------------------------------ - -class TextPage { -public: - - // Constructor. - TextPage(GBool rawOrderA); - - // Destructor. - ~TextPage(); - - // Start a new page. - void startPage(GfxState *state); - - // End the current page. - void endPage(); - - // Update the current font. - void updateFont(GfxState *state); - - // Begin a new word. - void beginWord(GfxState *state, double x0, double y0); - - // Add a character to the current word. - void addChar(GfxState *state, double x, double y, - double dx, double dy, - CharCode c, int nBytes, Unicode *u, int uLen); - - // End the current word, sorting it into the list of words. - void endWord(); - - // Add a word, sorting it into the list of words. - void addWord(TextWord *word); - - // Add a (potential) underline. - void addUnderline(double x0, double y0, double x1, double y1); - - // Add a hyperlink. - void addLink(int xMin, int yMin, int xMax, int yMax, Link *link); - - // Coalesce strings that look like parts of the same line. - void coalesce(GBool physLayout, GBool doHTML); - - // Find a string. If is true, starts looking at the - // top of the page; else if is true, starts looking - // immediately after the last find result; else starts looking at - // ,. If is true, stops looking at the - // bottom of the page; else if is true, stops looking - // just before the last find result; else stops looking at - // ,. - GBool findText(Unicode *s, int len, - GBool startAtTop, GBool stopAtBottom, - GBool startAtLast, GBool stopAtLast, - GBool caseSensitive, GBool backward, - double *xMin, double *yMin, - double *xMax, double *yMax); - - // Get the text which is inside the specified rectangle. - GString *getText(double xMin, double yMin, - double xMax, double yMax); - - // Find a string by character position and length. If found, sets - // the text bounding rectangle and returns true; otherwise returns - // false. - GBool findCharRange(int pos, int length, - double *xMin, double *yMin, - double *xMax, double *yMax); - - // Dump contents of page to a file. - void dump(void *outputStream, TextOutputFunc outputFunc, - GBool physLayout); - - // Get the head of the linked list of TextFlows. - TextFlow *getFlows() { return flows; } - -#if TEXTOUT_WORD_LIST - // Build a flat word list, in content stream order (if - // this->rawOrder is true), physical layout order (if - // is true and this->rawOrder is false), or reading order (if both - // flags are false). - TextWordList *makeWordList(GBool physLayout); -#endif - -private: - - void clear(); - void assignColumns(TextLineFrag *frags, int nFrags, int rot); - int dumpFragment(Unicode *text, int len, UnicodeMap *uMap, GString *s); - - GBool rawOrder; // keep text in content stream order - - double pageWidth, pageHeight; // width and height of current page - TextWord *curWord; // currently active string - int charPos; // next character position (within content - // stream) - TextFontInfo *curFont; // current font - double curFontSize; // current font size - int nest; // current nesting level (for Type 3 fonts) - int nTinyChars; // number of "tiny" chars seen so far - GBool lastCharOverlap; // set if the last added char overlapped the - // previous char - - TextPool *pools[4]; // a "pool" of TextWords for each rotation - TextFlow *flows; // linked list of flows - TextBlock **blocks; // array of blocks, in yx order - int nBlocks; // number of blocks - int primaryRot; // primary rotation - GBool primaryLR; // primary direction (true means L-to-R, - // false means R-to-L) - TextWord *rawWords; // list of words, in raw order (only if - // rawOrder is set) - TextWord *rawLastWord; // last word on rawWords list - - GList *fonts; // all font info objects used on this - // page [TextFontInfo] - - double lastFindXMin, // coordinates of the last "find" result - lastFindYMin; - GBool haveLastFind; - - GList *underlines; // [TextUnderline] - GList *links; // [TextLink] - - friend class TextLine; - friend class TextLineFrag; - friend class TextBlock; - friend class TextFlow; - friend class TextWordList; -}; - -//------------------------------------------------------------------------ -// TextOutputDev -//------------------------------------------------------------------------ - -class TextOutputDev: public OutputDev { -public: - - // Open a text output file. If is NULL, no file is - // written (this is useful, e.g., for searching text). If - // is true, the original physical layout of the text - // is maintained. If is true, the text is kept in - // content stream order. - TextOutputDev(char *fileName, GBool physLayoutA, - GBool rawOrderA, GBool append); - - // Create a TextOutputDev which will write to a generic stream. If - // is true, the original physical layout of the text - // is maintained. If is true, the text is kept in - // content stream order. - TextOutputDev(TextOutputFunc func, void *stream, - GBool physLayoutA, GBool rawOrderA); - - // Destructor. - virtual ~TextOutputDev(); - - // Check if file was successfully created. - virtual GBool isOk() { return ok; } - - //---- get info about output device - - // Does this device use upside-down coordinates? - // (Upside-down means (0,0) is the top left corner of the page.) - virtual GBool upsideDown() { return gTrue; } - - // Does this device use drawChar() or drawString()? - virtual GBool useDrawChar() { return gTrue; } - - // Does this device use beginType3Char/endType3Char? Otherwise, - // text in Type 3 fonts will be drawn with drawChar/drawString. - virtual GBool interpretType3Chars() { return gFalse; } - - // Does this device need non-text content? - virtual GBool needNonText() { return gFalse; } - - //----- initialization and control - - // Start a page. - virtual void startPage(int pageNum, GfxState *state); - - // End a page. - virtual void endPage(); - - //----- update text state - virtual void updateFont(GfxState *state); - - //----- text drawing - virtual void beginString(GfxState *state, GString *s); - virtual void endString(GfxState *state); - virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, - double originX, double originY, - CharCode c, int nBytes, Unicode *u, int uLen); - - //----- path painting - virtual void stroke(GfxState *state); - virtual void fill(GfxState *state); - virtual void eoFill(GfxState *state); - - //----- link borders - virtual void processLink(Link *link, Catalog *catalog); - - //----- special access - - // Find a string. If is true, starts looking at the - // top of the page; else if is true, starts looking - // immediately after the last find result; else starts looking at - // ,. If is true, stops looking at the - // bottom of the page; else if is true, stops looking - // just before the last find result; else stops looking at - // ,. - GBool findText(Unicode *s, int len, - GBool startAtTop, GBool stopAtBottom, - GBool startAtLast, GBool stopAtLast, - GBool caseSensitive, GBool backward, - double *xMin, double *yMin, - double *xMax, double *yMax); - - // Get the text which is inside the specified rectangle. - GString *getText(double xMin, double yMin, - double xMax, double yMax); - - // Find a string by character position and length. If found, sets - // the text bounding rectangle and returns true; otherwise returns - // false. - GBool findCharRange(int pos, int length, - double *xMin, double *yMin, - double *xMax, double *yMax); - -#if TEXTOUT_WORD_LIST - // Build a flat word list, in content stream order (if - // this->rawOrder is true), physical layout order (if - // this->physLayout is true and this->rawOrder is false), or reading - // order (if both flags are false). - TextWordList *makeWordList(); -#endif - - // Returns the TextPage object for the last rasterized page, - // transferring ownership to the caller. - TextPage *takeText(); - - // Turn extra processing for HTML conversion on or off. - void enableHTMLExtras(GBool doHTMLA) { doHTML = doHTMLA; } - -private: - - TextOutputFunc outputFunc; // output function - void *outputStream; // output stream - GBool needClose; // need to close the output file? - // (only if outputStream is a FILE*) - TextPage *text; // text for the current page - GBool physLayout; // maintain original physical layout when - // dumping text - GBool rawOrder; // keep text in content stream order - GBool doHTML; // extra processing for HTML conversion - GBool ok; // set up ok? -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UTF8.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UTF8.h deleted file mode 100644 index 8536dbf94..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UTF8.h +++ /dev/null @@ -1,56 +0,0 @@ -//======================================================================== -// -// UTF8.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -static int mapUTF8(Unicode u, char *buf, int bufSize) { - if (u <= 0x0000007f) { - if (bufSize < 1) { - return 0; - } - buf[0] = (char)u; - return 1; - } else if (u <= 0x000007ff) { - if (bufSize < 2) { - return 0; - } - buf[0] = (char)(0xc0 + (u >> 6)); - buf[1] = (char)(0x80 + (u & 0x3f)); - return 2; - } else if (u <= 0x0000ffff) { - if (bufSize < 3) { - return 0; - } - buf[0] = (char)(0xe0 + (u >> 12)); - buf[1] = (char)(0x80 + ((u >> 6) & 0x3f)); - buf[2] = (char)(0x80 + (u & 0x3f)); - return 3; - } else if (u <= 0x0010ffff) { - if (bufSize < 4) { - return 0; - } - buf[0] = (char)(0xf0 + (u >> 18)); - buf[1] = (char)(0x80 + ((u >> 12) & 0x3f)); - buf[2] = (char)(0x80 + ((u >> 6) & 0x3f)); - buf[3] = (char)(0x80 + (u & 0x3f)); - return 4; - } else { - return 0; - } -} - -static int mapUCS2(Unicode u, char *buf, int bufSize) { - if (u <= 0xffff) { - if (bufSize < 2) { - return 0; - } - buf[0] = (char)((u >> 8) & 0xff); - buf[1] = (char)(u & 0xff); - return 2; - } else { - return 0; - } -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.cc deleted file mode 100644 index 2b8cb1f7a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.cc +++ /dev/null @@ -1,293 +0,0 @@ -//======================================================================== -// -// UnicodeMap.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include "gmem.h" -#include "gfile.h" -#include "GString.h" -#include "GList.h" -#include "Error.h" -#include "GlobalParams.h" -#include "UnicodeMap.h" - -//------------------------------------------------------------------------ - -#define maxExtCode 16 - -struct UnicodeMapExt { - Unicode u; // Unicode char - char code[maxExtCode]; - Guint nBytes; -}; - -//------------------------------------------------------------------------ - -UnicodeMap *UnicodeMap::parse(GString *encodingNameA) { - FILE *f; - UnicodeMap *map; - UnicodeMapRange *range; - UnicodeMapExt *eMap; - int size, eMapsSize; - char buf[256]; - int line, nBytes, i, x; - char *tok1, *tok2, *tok3; - - if (!(f = globalParams->getUnicodeMapFile(encodingNameA))) { - error(-1, "Couldn't find unicodeMap file for the '%s' encoding", - encodingNameA->getCString()); - return NULL; - } - - map = new UnicodeMap(encodingNameA->copy()); - - size = 8; - map->ranges = (UnicodeMapRange *)gmallocn(size, sizeof(UnicodeMapRange)); - eMapsSize = 0; - - line = 1; - while (getLine(buf, sizeof(buf), f)) { - if ((tok1 = strtok(buf, " \t\r\n")) && - (tok2 = strtok(NULL, " \t\r\n"))) { - if (!(tok3 = strtok(NULL, " \t\r\n"))) { - tok3 = tok2; - tok2 = tok1; - } - nBytes = strlen(tok3) / 2; - if (nBytes <= 4) { - if (map->len == size) { - size *= 2; - map->ranges = (UnicodeMapRange *) - greallocn(map->ranges, size, sizeof(UnicodeMapRange)); - } - range = &map->ranges[map->len]; - sscanf(tok1, "%x", &range->start); - sscanf(tok2, "%x", &range->end); - sscanf(tok3, "%x", &range->code); - range->nBytes = nBytes; - ++map->len; - } else if (tok2 == tok1) { - if (map->eMapsLen == eMapsSize) { - eMapsSize += 16; - map->eMaps = (UnicodeMapExt *) - greallocn(map->eMaps, eMapsSize, sizeof(UnicodeMapExt)); - } - eMap = &map->eMaps[map->eMapsLen]; - sscanf(tok1, "%x", &eMap->u); - for (i = 0; i < nBytes; ++i) { - sscanf(tok3 + i*2, "%2x", &x); - eMap->code[i] = (char)x; - } - eMap->nBytes = nBytes; - ++map->eMapsLen; - } else { - error(-1, "Bad line (%d) in unicodeMap file for the '%s' encoding", - line, encodingNameA->getCString()); - } - } else { - error(-1, "Bad line (%d) in unicodeMap file for the '%s' encoding", - line, encodingNameA->getCString()); - } - ++line; - } - - fclose(f); - - return map; -} - -UnicodeMap::UnicodeMap(GString *encodingNameA) { - encodingName = encodingNameA; - unicodeOut = gFalse; - kind = unicodeMapUser; - ranges = NULL; - len = 0; - eMaps = NULL; - eMapsLen = 0; - refCnt = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -UnicodeMap::UnicodeMap(char *encodingNameA, GBool unicodeOutA, - UnicodeMapRange *rangesA, int lenA) { - encodingName = new GString(encodingNameA); - unicodeOut = unicodeOutA; - kind = unicodeMapResident; - ranges = rangesA; - len = lenA; - eMaps = NULL; - eMapsLen = 0; - refCnt = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -UnicodeMap::UnicodeMap(char *encodingNameA, GBool unicodeOutA, - UnicodeMapFunc funcA) { - encodingName = new GString(encodingNameA); - unicodeOut = unicodeOutA; - kind = unicodeMapFunc; - func = funcA; - eMaps = NULL; - eMapsLen = 0; - refCnt = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -UnicodeMap::~UnicodeMap() { - delete encodingName; - if (kind == unicodeMapUser && ranges) { - gfree(ranges); - } - if (eMaps) { - gfree(eMaps); - } -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -void UnicodeMap::incRefCnt() { -#if MULTITHREADED - gLockMutex(&mutex); -#endif - ++refCnt; -#if MULTITHREADED - gUnlockMutex(&mutex); -#endif -} - -void UnicodeMap::decRefCnt() { - GBool done; - -#if MULTITHREADED - gLockMutex(&mutex); -#endif - done = --refCnt == 0; -#if MULTITHREADED - gUnlockMutex(&mutex); -#endif - if (done) { - delete this; - } -} - -GBool UnicodeMap::match(GString *encodingNameA) { - return !encodingName->cmp(encodingNameA); -} - -int UnicodeMap::mapUnicode(Unicode u, char *buf, int bufSize) { - int a, b, m, n, i, j; - Guint code; - - if (kind == unicodeMapFunc) { - return (*func)(u, buf, bufSize); - } - - a = 0; - b = len; - if (u >= ranges[a].start) { - // invariant: ranges[a].start <= u < ranges[b].start - while (b - a > 1) { - m = (a + b) / 2; - if (u >= ranges[m].start) { - a = m; - } else if (u < ranges[m].start) { - b = m; - } - } - if (u <= ranges[a].end) { - n = ranges[a].nBytes; - if (n > bufSize) { - return 0; - } - code = ranges[a].code + (u - ranges[a].start); - for (i = n - 1; i >= 0; --i) { - buf[i] = (char)(code & 0xff); - code >>= 8; - } - return n; - } - } - - for (i = 0; i < eMapsLen; ++i) { - if (eMaps[i].u == u) { - n = eMaps[i].nBytes; - for (j = 0; j < n; ++j) { - buf[j] = eMaps[i].code[j]; - } - return n; - } - } - - return 0; -} - -//------------------------------------------------------------------------ - -UnicodeMapCache::UnicodeMapCache() { - int i; - - for (i = 0; i < unicodeMapCacheSize; ++i) { - cache[i] = NULL; - } -} - -UnicodeMapCache::~UnicodeMapCache() { - int i; - - for (i = 0; i < unicodeMapCacheSize; ++i) { - if (cache[i]) { - cache[i]->decRefCnt(); - } - } -} - -UnicodeMap *UnicodeMapCache::getUnicodeMap(GString *encodingName) { - UnicodeMap *map; - int i, j; - - if (cache[0] && cache[0]->match(encodingName)) { - cache[0]->incRefCnt(); - return cache[0]; - } - for (i = 1; i < unicodeMapCacheSize; ++i) { - if (cache[i] && cache[i]->match(encodingName)) { - map = cache[i]; - for (j = i; j >= 1; --j) { - cache[j] = cache[j - 1]; - } - cache[0] = map; - map->incRefCnt(); - return map; - } - } - if ((map = UnicodeMap::parse(encodingName))) { - if (cache[unicodeMapCacheSize - 1]) { - cache[unicodeMapCacheSize - 1]->decRefCnt(); - } - for (j = unicodeMapCacheSize - 1; j >= 1; --j) { - cache[j] = cache[j - 1]; - } - cache[0] = map; - map->incRefCnt(); - return map; - } - return NULL; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.h deleted file mode 100644 index 0f86101e0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMap.h +++ /dev/null @@ -1,123 +0,0 @@ -//======================================================================== -// -// UnicodeMap.h -// -// Mapping from Unicode to an encoding. -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef UNICODEMAP_H -#define UNICODEMAP_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "CharTypes.h" - -#if MULTITHREADED -#include "GMutex.h" -#endif - -class GString; - -//------------------------------------------------------------------------ - -enum UnicodeMapKind { - unicodeMapUser, // read from a file - unicodeMapResident, // static list of ranges - unicodeMapFunc // function pointer -}; - -typedef int (*UnicodeMapFunc)(Unicode u, char *buf, int bufSize); - -struct UnicodeMapRange { - Unicode start, end; // range of Unicode chars - Guint code, nBytes; // first output code -}; - -struct UnicodeMapExt; - -//------------------------------------------------------------------------ - -class UnicodeMap { -public: - - // Create the UnicodeMap specified by . Sets the - // initial reference count to 1. Returns NULL on failure. - static UnicodeMap *parse(GString *encodingNameA); - - // Create a resident UnicodeMap. - UnicodeMap(char *encodingNameA, GBool unicodeOutA, - UnicodeMapRange *rangesA, int lenA); - - // Create a resident UnicodeMap that uses a function instead of a - // list of ranges. - UnicodeMap(char *encodingNameA, GBool unicodeOutA, - UnicodeMapFunc funcA); - - ~UnicodeMap(); - - void incRefCnt(); - void decRefCnt(); - - GString *getEncodingName() { return encodingName; } - - GBool isUnicode() { return unicodeOut; } - - // Return true if this UnicodeMap matches the specified - // . - GBool match(GString *encodingNameA); - - // Map Unicode to the target encoding. Fills in with the - // output and returns the number of bytes used. Output will be - // truncated at bytes. No string terminator is written. - // Returns 0 if no mapping is found. - int mapUnicode(Unicode u, char *buf, int bufSize); - -private: - - UnicodeMap(GString *encodingNameA); - - GString *encodingName; - UnicodeMapKind kind; - GBool unicodeOut; - union { - UnicodeMapRange *ranges; // (user, resident) - UnicodeMapFunc func; // (func) - }; - int len; // (user, resident) - UnicodeMapExt *eMaps; // (user) - int eMapsLen; // (user) - int refCnt; -#if MULTITHREADED - GMutex mutex; -#endif -}; - -//------------------------------------------------------------------------ - -#define unicodeMapCacheSize 4 - -class UnicodeMapCache { -public: - - UnicodeMapCache(); - ~UnicodeMapCache(); - - // Get the UnicodeMap for . Increments its reference - // count; there will be one reference for the cache plus one for the - // caller of this function. Returns NULL on failure. - UnicodeMap *getUnicodeMap(GString *encodingName); - -private: - - UnicodeMap *cache[unicodeMapCacheSize]; -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMapTables.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMapTables.h deleted file mode 100644 index 9c5103461..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeMapTables.h +++ /dev/null @@ -1,361 +0,0 @@ -//======================================================================== -// -// UnicodeMapTables.h -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -static UnicodeMapRange latin1UnicodeMapRanges[] = { - { 0x000a, 0x000a, 0x0a, 1 }, - { 0x000c, 0x000d, 0x0c, 1 }, - { 0x0020, 0x007e, 0x20, 1 }, - { 0x00a0, 0x00a0, 0x20, 1 }, - { 0x00a1, 0x00ac, 0xa1, 1 }, - { 0x00ae, 0x00ff, 0xae, 1 }, - { 0x010c, 0x010c, 0x43, 1 }, - { 0x010d, 0x010d, 0x63, 1 }, - { 0x0131, 0x0131, 0x69, 1 }, - { 0x0141, 0x0141, 0x4c, 1 }, - { 0x0142, 0x0142, 0x6c, 1 }, - { 0x0152, 0x0152, 0x4f45, 2 }, - { 0x0153, 0x0153, 0x6f65, 2 }, - { 0x0160, 0x0160, 0x53, 1 }, - { 0x0161, 0x0161, 0x73, 1 }, - { 0x0178, 0x0178, 0x59, 1 }, - { 0x017d, 0x017d, 0x5a, 1 }, - { 0x017e, 0x017e, 0x7a, 1 }, - { 0x02c6, 0x02c6, 0x5e, 1 }, - { 0x02da, 0x02da, 0xb0, 1 }, - { 0x02dc, 0x02dc, 0x7e, 1 }, - { 0x2013, 0x2013, 0xad, 1 }, - { 0x2014, 0x2014, 0x2d2d, 2 }, - { 0x2018, 0x2018, 0x60, 1 }, - { 0x2019, 0x2019, 0x27, 1 }, - { 0x201a, 0x201a, 0x2c, 1 }, - { 0x201c, 0x201c, 0x22, 1 }, - { 0x201d, 0x201d, 0x22, 1 }, - { 0x201e, 0x201e, 0x2c2c, 2 }, - { 0x2022, 0x2022, 0xb7, 1 }, - { 0x2026, 0x2026, 0x2e2e2e, 3 }, - { 0x2039, 0x2039, 0x3c, 1 }, - { 0x203a, 0x203a, 0x3e, 1 }, - { 0x2044, 0x2044, 0x2f, 1 }, - { 0x2122, 0x2122, 0x544d, 2 }, - { 0x2212, 0x2212, 0x2d, 1 }, - { 0xf6f9, 0xf6f9, 0x4c, 1 }, - { 0xf6fa, 0xf6fa, 0x4f45, 2 }, - { 0xf6fc, 0xf6fc, 0xb0, 1 }, - { 0xf6fd, 0xf6fd, 0x53, 1 }, - { 0xf6fe, 0xf6fe, 0x7e, 1 }, - { 0xf6ff, 0xf6ff, 0x5a, 1 }, - { 0xf721, 0xf721, 0x21, 1 }, - { 0xf724, 0xf724, 0x24, 1 }, - { 0xf726, 0xf726, 0x26, 1 }, - { 0xf730, 0xf739, 0x30, 1 }, - { 0xf73f, 0xf73f, 0x3f, 1 }, - { 0xf761, 0xf77a, 0x41, 1 }, - { 0xf7a1, 0xf7a2, 0xa1, 1 }, - { 0xf7bf, 0xf7bf, 0xbf, 1 }, - { 0xf7e0, 0xf7f6, 0xc0, 1 }, - { 0xf7f8, 0xf7fe, 0xd8, 1 }, - { 0xf7ff, 0xf7ff, 0x59, 1 }, - { 0xfb00, 0xfb00, 0x6666, 2 }, - { 0xfb01, 0xfb01, 0x6669, 2 }, - { 0xfb02, 0xfb02, 0x666c, 2 }, - { 0xfb03, 0xfb03, 0x666669, 3 }, - { 0xfb04, 0xfb04, 0x66666c, 3 } -}; -#define latin1UnicodeMapLen (sizeof(latin1UnicodeMapRanges) / sizeof(UnicodeMapRange)) - -static UnicodeMapRange ascii7UnicodeMapRanges[] = { - { 0x000a, 0x000a, 0x0a, 1 }, - { 0x000c, 0x000d, 0x0c, 1 }, - { 0x0020, 0x005f, 0x20, 1 }, - { 0x0061, 0x007e, 0x61, 1 }, - { 0x00a6, 0x00a6, 0x7c, 1 }, - { 0x00a9, 0x00a9, 0x286329, 3 }, - { 0x00ae, 0x00ae, 0x285229, 3 }, - { 0x00b7, 0x00b7, 0x2a, 1 }, - { 0x00bc, 0x00bc, 0x312f34, 3 }, - { 0x00bd, 0x00bd, 0x312f32, 3 }, - { 0x00be, 0x00be, 0x332f34, 3 }, - { 0x00c0, 0x00c0, 0x41, 1 }, - { 0x00c1, 0x00c1, 0x41, 1 }, - { 0x00c2, 0x00c2, 0x41, 1 }, - { 0x00c3, 0x00c3, 0x41, 1 }, - { 0x00c4, 0x00c4, 0x41, 1 }, - { 0x00c5, 0x00c5, 0x41, 1 }, - { 0x00c6, 0x00c6, 0x4145, 2 }, - { 0x00c7, 0x00c7, 0x43, 1 }, - { 0x00c8, 0x00c8, 0x45, 1 }, - { 0x00c9, 0x00c9, 0x45, 1 }, - { 0x00ca, 0x00ca, 0x45, 1 }, - { 0x00cb, 0x00cb, 0x45, 1 }, - { 0x00cc, 0x00cc, 0x49, 1 }, - { 0x00cd, 0x00cd, 0x49, 1 }, - { 0x00ce, 0x00ce, 0x49, 1 }, - { 0x00cf, 0x00cf, 0x49, 1 }, - { 0x00d1, 0x00d2, 0x4e, 1 }, - { 0x00d3, 0x00d3, 0x4f, 1 }, - { 0x00d4, 0x00d4, 0x4f, 1 }, - { 0x00d5, 0x00d5, 0x4f, 1 }, - { 0x00d6, 0x00d6, 0x4f, 1 }, - { 0x00d7, 0x00d7, 0x78, 1 }, - { 0x00d8, 0x00d8, 0x4f, 1 }, - { 0x00d9, 0x00d9, 0x55, 1 }, - { 0x00da, 0x00da, 0x55, 1 }, - { 0x00db, 0x00db, 0x55, 1 }, - { 0x00dc, 0x00dc, 0x55, 1 }, - { 0x00dd, 0x00dd, 0x59, 1 }, - { 0x00e0, 0x00e0, 0x61, 1 }, - { 0x00e1, 0x00e1, 0x61, 1 }, - { 0x00e2, 0x00e2, 0x61, 1 }, - { 0x00e3, 0x00e3, 0x61, 1 }, - { 0x00e4, 0x00e4, 0x61, 1 }, - { 0x00e5, 0x00e5, 0x61, 1 }, - { 0x00e6, 0x00e6, 0x6165, 2 }, - { 0x00e7, 0x00e7, 0x63, 1 }, - { 0x00e8, 0x00e8, 0x65, 1 }, - { 0x00e9, 0x00e9, 0x65, 1 }, - { 0x00ea, 0x00ea, 0x65, 1 }, - { 0x00eb, 0x00eb, 0x65, 1 }, - { 0x00ec, 0x00ec, 0x69, 1 }, - { 0x00ed, 0x00ed, 0x69, 1 }, - { 0x00ee, 0x00ee, 0x69, 1 }, - { 0x00ef, 0x00ef, 0x69, 1 }, - { 0x00f1, 0x00f2, 0x6e, 1 }, - { 0x00f3, 0x00f3, 0x6f, 1 }, - { 0x00f4, 0x00f4, 0x6f, 1 }, - { 0x00f5, 0x00f5, 0x6f, 1 }, - { 0x00f6, 0x00f6, 0x6f, 1 }, - { 0x00f7, 0x00f7, 0x2f, 1 }, - { 0x00f8, 0x00f8, 0x6f, 1 }, - { 0x00f9, 0x00f9, 0x75, 1 }, - { 0x00fa, 0x00fa, 0x75, 1 }, - { 0x00fb, 0x00fb, 0x75, 1 }, - { 0x00fc, 0x00fc, 0x75, 1 }, - { 0x00fd, 0x00fd, 0x79, 1 }, - { 0x00ff, 0x00ff, 0x79, 1 }, - { 0x0131, 0x0131, 0x69, 1 }, - { 0x0141, 0x0141, 0x4c, 1 }, - { 0x0152, 0x0152, 0x4f45, 2 }, - { 0x0153, 0x0153, 0x6f65, 2 }, - { 0x0160, 0x0160, 0x53, 1 }, - { 0x0178, 0x0178, 0x59, 1 }, - { 0x017d, 0x017d, 0x5a, 1 }, - { 0x2013, 0x2013, 0x2d, 1 }, - { 0x2014, 0x2014, 0x2d2d, 2 }, - { 0x2018, 0x2018, 0x60, 1 }, - { 0x2019, 0x2019, 0x27, 1 }, - { 0x201c, 0x201c, 0x22, 1 }, - { 0x201d, 0x201d, 0x22, 1 }, - { 0x2022, 0x2022, 0x2a, 1 }, - { 0x2026, 0x2026, 0x2e2e2e, 3 }, - { 0x2122, 0x2122, 0x544d, 2 }, - { 0x2212, 0x2212, 0x2d, 1 }, - { 0xf6f9, 0xf6f9, 0x4c, 1 }, - { 0xf6fa, 0xf6fa, 0x4f45, 2 }, - { 0xf6fd, 0xf6fd, 0x53, 1 }, - { 0xf6fe, 0xf6fe, 0x7e, 1 }, - { 0xf6ff, 0xf6ff, 0x5a, 1 }, - { 0xf721, 0xf721, 0x21, 1 }, - { 0xf724, 0xf724, 0x24, 1 }, - { 0xf726, 0xf726, 0x26, 1 }, - { 0xf730, 0xf739, 0x30, 1 }, - { 0xf73f, 0xf73f, 0x3f, 1 }, - { 0xf761, 0xf77a, 0x41, 1 }, - { 0xf7e0, 0xf7e0, 0x41, 1 }, - { 0xf7e1, 0xf7e1, 0x41, 1 }, - { 0xf7e2, 0xf7e2, 0x41, 1 }, - { 0xf7e3, 0xf7e3, 0x41, 1 }, - { 0xf7e4, 0xf7e4, 0x41, 1 }, - { 0xf7e5, 0xf7e5, 0x41, 1 }, - { 0xf7e6, 0xf7e6, 0x4145, 2 }, - { 0xf7e7, 0xf7e7, 0x43, 1 }, - { 0xf7e8, 0xf7e8, 0x45, 1 }, - { 0xf7e9, 0xf7e9, 0x45, 1 }, - { 0xf7ea, 0xf7ea, 0x45, 1 }, - { 0xf7eb, 0xf7eb, 0x45, 1 }, - { 0xf7ec, 0xf7ec, 0x49, 1 }, - { 0xf7ed, 0xf7ed, 0x49, 1 }, - { 0xf7ee, 0xf7ee, 0x49, 1 }, - { 0xf7ef, 0xf7ef, 0x49, 1 }, - { 0xf7f1, 0xf7f2, 0x4e, 1 }, - { 0xf7f3, 0xf7f3, 0x4f, 1 }, - { 0xf7f4, 0xf7f4, 0x4f, 1 }, - { 0xf7f5, 0xf7f5, 0x4f, 1 }, - { 0xf7f6, 0xf7f6, 0x4f, 1 }, - { 0xf7f8, 0xf7f8, 0x4f, 1 }, - { 0xf7f9, 0xf7f9, 0x55, 1 }, - { 0xf7fa, 0xf7fa, 0x55, 1 }, - { 0xf7fb, 0xf7fb, 0x55, 1 }, - { 0xf7fc, 0xf7fc, 0x55, 1 }, - { 0xf7fd, 0xf7fd, 0x59, 1 }, - { 0xf7ff, 0xf7ff, 0x59, 1 }, - { 0xfb00, 0xfb00, 0x6666, 2 }, - { 0xfb01, 0xfb01, 0x6669, 2 }, - { 0xfb02, 0xfb02, 0x666c, 2 }, - { 0xfb03, 0xfb03, 0x666669, 3 }, - { 0xfb04, 0xfb04, 0x66666c, 3 } -}; -#define ascii7UnicodeMapLen (sizeof(ascii7UnicodeMapRanges) / sizeof(UnicodeMapRange)) - -static UnicodeMapRange symbolUnicodeMapRanges[] = { - { 0x0020, 0x0021, 0x20, 1 }, - { 0x0023, 0x0023, 0x23, 1 }, - { 0x0025, 0x0026, 0x25, 1 }, - { 0x0028, 0x0029, 0x28, 1 }, - { 0x002b, 0x002c, 0x2b, 1 }, - { 0x002e, 0x003f, 0x2e, 1 }, - { 0x005b, 0x005b, 0x5b, 1 }, - { 0x005d, 0x005d, 0x5d, 1 }, - { 0x005f, 0x005f, 0x5f, 1 }, - { 0x007b, 0x007d, 0x7b, 1 }, - { 0x00ac, 0x00ac, 0xd8, 1 }, - { 0x00b0, 0x00b1, 0xb0, 1 }, - { 0x00b5, 0x00b5, 0x6d, 1 }, - { 0x00d7, 0x00d7, 0xb4, 1 }, - { 0x00f7, 0x00f7, 0xb8, 1 }, - { 0x0192, 0x0192, 0xa6, 1 }, - { 0x0391, 0x0392, 0x41, 1 }, - { 0x0393, 0x0393, 0x47, 1 }, - { 0x0395, 0x0395, 0x45, 1 }, - { 0x0396, 0x0396, 0x5a, 1 }, - { 0x0397, 0x0397, 0x48, 1 }, - { 0x0398, 0x0398, 0x51, 1 }, - { 0x0399, 0x0399, 0x49, 1 }, - { 0x039a, 0x039d, 0x4b, 1 }, - { 0x039e, 0x039e, 0x58, 1 }, - { 0x039f, 0x03a0, 0x4f, 1 }, - { 0x03a1, 0x03a1, 0x52, 1 }, - { 0x03a3, 0x03a5, 0x53, 1 }, - { 0x03a6, 0x03a6, 0x46, 1 }, - { 0x03a7, 0x03a7, 0x43, 1 }, - { 0x03a8, 0x03a8, 0x59, 1 }, - { 0x03b1, 0x03b2, 0x61, 1 }, - { 0x03b3, 0x03b3, 0x67, 1 }, - { 0x03b4, 0x03b5, 0x64, 1 }, - { 0x03b6, 0x03b6, 0x7a, 1 }, - { 0x03b7, 0x03b7, 0x68, 1 }, - { 0x03b8, 0x03b8, 0x71, 1 }, - { 0x03b9, 0x03b9, 0x69, 1 }, - { 0x03ba, 0x03bb, 0x6b, 1 }, - { 0x03bd, 0x03bd, 0x6e, 1 }, - { 0x03be, 0x03be, 0x78, 1 }, - { 0x03bf, 0x03c0, 0x6f, 1 }, - { 0x03c1, 0x03c1, 0x72, 1 }, - { 0x03c2, 0x03c2, 0x56, 1 }, - { 0x03c3, 0x03c5, 0x73, 1 }, - { 0x03c6, 0x03c6, 0x66, 1 }, - { 0x03c7, 0x03c7, 0x63, 1 }, - { 0x03c8, 0x03c8, 0x79, 1 }, - { 0x03c9, 0x03c9, 0x77, 1 }, - { 0x03d1, 0x03d1, 0x4a, 1 }, - { 0x03d2, 0x03d2, 0xa1, 1 }, - { 0x03d5, 0x03d5, 0x6a, 1 }, - { 0x03d6, 0x03d6, 0x76, 1 }, - { 0x2022, 0x2022, 0xb7, 1 }, - { 0x2026, 0x2026, 0xbc, 1 }, - { 0x2032, 0x2032, 0xa2, 1 }, - { 0x2033, 0x2033, 0xb2, 1 }, - { 0x2044, 0x2044, 0xa4, 1 }, - { 0x2111, 0x2111, 0xc1, 1 }, - { 0x2118, 0x2118, 0xc3, 1 }, - { 0x211c, 0x211c, 0xc2, 1 }, - { 0x2126, 0x2126, 0x57, 1 }, - { 0x2135, 0x2135, 0xc0, 1 }, - { 0x2190, 0x2193, 0xac, 1 }, - { 0x2194, 0x2194, 0xab, 1 }, - { 0x21b5, 0x21b5, 0xbf, 1 }, - { 0x21d0, 0x21d3, 0xdc, 1 }, - { 0x21d4, 0x21d4, 0xdb, 1 }, - { 0x2200, 0x2200, 0x22, 1 }, - { 0x2202, 0x2202, 0xb6, 1 }, - { 0x2203, 0x2203, 0x24, 1 }, - { 0x2205, 0x2205, 0xc6, 1 }, - { 0x2206, 0x2206, 0x44, 1 }, - { 0x2207, 0x2207, 0xd1, 1 }, - { 0x2208, 0x2209, 0xce, 1 }, - { 0x220b, 0x220b, 0x27, 1 }, - { 0x220f, 0x220f, 0xd5, 1 }, - { 0x2211, 0x2211, 0xe5, 1 }, - { 0x2212, 0x2212, 0x2d, 1 }, - { 0x2217, 0x2217, 0x2a, 1 }, - { 0x221a, 0x221a, 0xd6, 1 }, - { 0x221d, 0x221d, 0xb5, 1 }, - { 0x221e, 0x221e, 0xa5, 1 }, - { 0x2220, 0x2220, 0xd0, 1 }, - { 0x2227, 0x2228, 0xd9, 1 }, - { 0x2229, 0x222a, 0xc7, 1 }, - { 0x222b, 0x222b, 0xf2, 1 }, - { 0x2234, 0x2234, 0x5c, 1 }, - { 0x223c, 0x223c, 0x7e, 1 }, - { 0x2245, 0x2245, 0x40, 1 }, - { 0x2248, 0x2248, 0xbb, 1 }, - { 0x2260, 0x2261, 0xb9, 1 }, - { 0x2264, 0x2264, 0xa3, 1 }, - { 0x2265, 0x2265, 0xb3, 1 }, - { 0x2282, 0x2282, 0xcc, 1 }, - { 0x2283, 0x2283, 0xc9, 1 }, - { 0x2284, 0x2284, 0xcb, 1 }, - { 0x2286, 0x2286, 0xcd, 1 }, - { 0x2287, 0x2287, 0xca, 1 }, - { 0x2295, 0x2295, 0xc5, 1 }, - { 0x2297, 0x2297, 0xc4, 1 }, - { 0x22a5, 0x22a5, 0x5e, 1 }, - { 0x22c5, 0x22c5, 0xd7, 1 }, - { 0x2320, 0x2320, 0xf3, 1 }, - { 0x2321, 0x2321, 0xf5, 1 }, - { 0x2329, 0x2329, 0xe1, 1 }, - { 0x232a, 0x232a, 0xf1, 1 }, - { 0x25ca, 0x25ca, 0xe0, 1 }, - { 0x2660, 0x2660, 0xaa, 1 }, - { 0x2663, 0x2663, 0xa7, 1 }, - { 0x2665, 0x2665, 0xa9, 1 }, - { 0x2666, 0x2666, 0xa8, 1 }, - { 0xf6d9, 0xf6d9, 0xd3, 1 }, - { 0xf6da, 0xf6da, 0xd2, 1 }, - { 0xf6db, 0xf6db, 0xd4, 1 }, - { 0xf8e5, 0xf8e5, 0x60, 1 }, - { 0xf8e6, 0xf8e7, 0xbd, 1 }, - { 0xf8e8, 0xf8ea, 0xe2, 1 }, - { 0xf8eb, 0xf8f4, 0xe6, 1 }, - { 0xf8f5, 0xf8f5, 0xf4, 1 }, - { 0xf8f6, 0xf8fe, 0xf6, 1 } -}; -#define symbolUnicodeMapLen (sizeof(symbolUnicodeMapRanges) / sizeof(UnicodeMapRange)) - -static UnicodeMapRange zapfDingbatsUnicodeMapRanges[] = { - { 0x0020, 0x0020, 0x20, 1 }, - { 0x2192, 0x2192, 0xd5, 1 }, - { 0x2194, 0x2195, 0xd6, 1 }, - { 0x2460, 0x2469, 0xac, 1 }, - { 0x25a0, 0x25a0, 0x6e, 1 }, - { 0x25b2, 0x25b2, 0x73, 1 }, - { 0x25bc, 0x25bc, 0x74, 1 }, - { 0x25c6, 0x25c6, 0x75, 1 }, - { 0x25cf, 0x25cf, 0x6c, 1 }, - { 0x25d7, 0x25d7, 0x77, 1 }, - { 0x2605, 0x2605, 0x48, 1 }, - { 0x260e, 0x260e, 0x25, 1 }, - { 0x261b, 0x261b, 0x2a, 1 }, - { 0x261e, 0x261e, 0x2b, 1 }, - { 0x2660, 0x2660, 0xab, 1 }, - { 0x2663, 0x2663, 0xa8, 1 }, - { 0x2665, 0x2665, 0xaa, 1 }, - { 0x2666, 0x2666, 0xa9, 1 }, - { 0x2701, 0x2704, 0x21, 1 }, - { 0x2706, 0x2709, 0x26, 1 }, - { 0x270c, 0x2727, 0x2c, 1 }, - { 0x2729, 0x274b, 0x49, 1 }, - { 0x274d, 0x274d, 0x6d, 1 }, - { 0x274f, 0x2752, 0x6f, 1 }, - { 0x2756, 0x2756, 0x76, 1 }, - { 0x2758, 0x275e, 0x78, 1 }, - { 0x2761, 0x2767, 0xa1, 1 }, - { 0x2776, 0x2794, 0xb6, 1 }, - { 0x2798, 0x27af, 0xd8, 1 }, - { 0x27b1, 0x27be, 0xf1, 1 } -}; -#define zapfDingbatsUnicodeMapLen (sizeof(zapfDingbatsUnicodeMapRanges) / sizeof(UnicodeMapRange)) diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.cc deleted file mode 100644 index b89604036..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.cc +++ /dev/null @@ -1,949 +0,0 @@ -//======================================================================== -// -// UnicodeTypeTable.cc -// -// Copyright 2004 Glyph & Cog, LLC -// -//======================================================================== - -#include -#include "CharTypes.h" -#include "UnicodeTypeTable.h" - -struct UnicodeMapTableEntry { - char *vector; - char type; -}; - -struct UnicodeCaseTableVector { - Unicode codes[256]; -}; - -static UnicodeMapTableEntry typeTable[256] = { - { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNLNNNNLNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL", 'X' }, - { NULL, 'L' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLNNNNNNNNNNNNNNLLNNNNNNNNNNNNNNLLLLLNNNNNNNNNLNNNNNNNNNNNNNNNNN", 'X' }, - { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLNNNNNNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRNRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR", 'X' }, - { "RRRRNNNNNNNNNRNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNRNNNNNNNRRNNNNNNNRRNNNNNNNNNNRRRRRR", 'X' }, - { "RRRRRRRRRRRRRRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, - { NULL, 'N' }, - { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLNNNNLLLLLLLLLLLLLNNLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNLLLLLLLLNLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLNNLLLLLLLNNNNN", 'X' }, - { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLNNNNNNNNNNNNNNNN", 'X' }, - { "NNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLNLNNNLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLLLLLLLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNNNNNNNLLLLLLLNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNNNNLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNLNNNNNLNNLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLNLLNNNNNNNNNNNLLLLLLLNLNLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' }, - { "NNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLNNNNNLLLLLLNLLLLLLNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNNNLLLLLLLLLLLNNNLLLLLLLLLLLLNNNNLLLLLLLLLLLLLNNNLLLLLLLLLLLLLNNN", 'X' }, - { "NNNNNNNNNNNNNNLRNNNNNNNNNNNNNNNNNNNNNNNNNNLRNLRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, - { "NNLNNNNLNNLLLLLLLLLLNLNNNLLLLLNNNNNNLNLNLNLLLLNLLLNLLLLLLLNNLLLLNNNNNLLLLLNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, - { NULL, 'N' }, - { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, - { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' }, - { NULL, 'N' }, - { NULL, 'N' }, - { NULL, 'N' }, - { NULL, 'L' }, - { NULL, 'N' }, - { NULL, 'N' }, - { NULL, 'N' }, - { NULL, 'N' }, - { NULL, 'N' }, - { NULL, 'N' }, - { NULL, 'N' }, - { "NNNNNLLLNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNNNNNNNLLLLLNNLLLLLNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLL", 'X' }, - { NULL, 'L' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNLLLLLLLLLLLLNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN", 'X' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { NULL, 'L' }, - { "LLLLLLLLLLLLLLLLLLLLLLLLRRRRRRNRRRRRRRRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR", 'X' }, - { NULL, 'R' }, - { "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNN", 'X' }, - { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNN", 'X' }, - { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLL", 'X' } -}; - -static UnicodeCaseTableVector caseTable00 = {{ - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, - 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, - 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, - 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, - 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, - 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, - 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, - 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x03bc, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00d7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff -}}; -static UnicodeCaseTableVector caseTable01 = {{ - 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, - 0x0109, 0x0109, 0x010b, 0x010b, 0x010d, 0x010d, 0x010f, 0x010f, - 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, - 0x0119, 0x0119, 0x011b, 0x011b, 0x011d, 0x011d, 0x011f, 0x011f, - 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, - 0x0129, 0x0129, 0x012b, 0x012b, 0x012d, 0x012d, 0x012f, 0x012f, - 0x0130, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0137, - 0x0138, 0x013a, 0x013a, 0x013c, 0x013c, 0x013e, 0x013e, 0x0140, - 0x0140, 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, - 0x0148, 0x0149, 0x014b, 0x014b, 0x014d, 0x014d, 0x014f, 0x014f, - 0x0151, 0x0151, 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, - 0x0159, 0x0159, 0x015b, 0x015b, 0x015d, 0x015d, 0x015f, 0x015f, - 0x0161, 0x0161, 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, - 0x0169, 0x0169, 0x016b, 0x016b, 0x016d, 0x016d, 0x016f, 0x016f, - 0x0171, 0x0171, 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, - 0x00ff, 0x017a, 0x017a, 0x017c, 0x017c, 0x017e, 0x017e, 0x0073, - 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, - 0x0188, 0x0256, 0x0257, 0x018c, 0x018c, 0x018d, 0x01dd, 0x0259, - 0x025b, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, - 0x0199, 0x0199, 0x019a, 0x019b, 0x026f, 0x0272, 0x019e, 0x0275, - 0x01a1, 0x01a1, 0x01a3, 0x01a3, 0x01a5, 0x01a5, 0x0280, 0x01a8, - 0x01a8, 0x0283, 0x01aa, 0x01ab, 0x01ad, 0x01ad, 0x0288, 0x01b0, - 0x01b0, 0x028a, 0x028b, 0x01b4, 0x01b4, 0x01b6, 0x01b6, 0x0292, - 0x01b9, 0x01b9, 0x01ba, 0x01bb, 0x01bd, 0x01bd, 0x01be, 0x01bf, - 0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x01c6, 0x01c6, 0x01c6, 0x01c9, - 0x01c9, 0x01c9, 0x01cc, 0x01cc, 0x01cc, 0x01ce, 0x01ce, 0x01d0, - 0x01d0, 0x01d2, 0x01d2, 0x01d4, 0x01d4, 0x01d6, 0x01d6, 0x01d8, - 0x01d8, 0x01da, 0x01da, 0x01dc, 0x01dc, 0x01dd, 0x01df, 0x01df, - 0x01e1, 0x01e1, 0x01e3, 0x01e3, 0x01e5, 0x01e5, 0x01e7, 0x01e7, - 0x01e9, 0x01e9, 0x01eb, 0x01eb, 0x01ed, 0x01ed, 0x01ef, 0x01ef, - 0x01f0, 0x01f3, 0x01f3, 0x01f3, 0x01f5, 0x01f5, 0x0195, 0x01bf, - 0x01f9, 0x01f9, 0x01fb, 0x01fb, 0x01fd, 0x01fd, 0x01ff, 0x01ff -}}; -static UnicodeCaseTableVector caseTable02 = {{ - 0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, - 0x0209, 0x0209, 0x020b, 0x020b, 0x020d, 0x020d, 0x020f, 0x020f, - 0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, - 0x0219, 0x0219, 0x021b, 0x021b, 0x021d, 0x021d, 0x021f, 0x021f, - 0x019e, 0x0221, 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227, - 0x0229, 0x0229, 0x022b, 0x022b, 0x022d, 0x022d, 0x022f, 0x022f, - 0x0231, 0x0231, 0x0233, 0x0233, 0x0234, 0x0235, 0x0236, 0x0237, - 0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d, 0x023e, 0x023f, - 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245, 0x0246, 0x0247, - 0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d, 0x024e, 0x024f, - 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, - 0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f, - 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, - 0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f, - 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, - 0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f, - 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, - 0x0288, 0x0289, 0x028a, 0x028b, 0x028c, 0x028d, 0x028e, 0x028f, - 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, - 0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f, - 0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7, - 0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af, - 0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7, - 0x02b8, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, - 0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, - 0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf, - 0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7, - 0x02d8, 0x02d9, 0x02da, 0x02db, 0x02dc, 0x02dd, 0x02de, 0x02df, - 0x02e0, 0x02e1, 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x02e6, 0x02e7, - 0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef, - 0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7, - 0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff -}}; -static UnicodeCaseTableVector caseTable03 = {{ - 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, - 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f, - 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, - 0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f, - 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, - 0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f, - 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, - 0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f, - 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x03b9, 0x0346, 0x0347, - 0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f, - 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, - 0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f, - 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, - 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, - 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, - 0x0378, 0x0379, 0x037a, 0x037b, 0x037c, 0x037d, 0x037e, 0x037f, - 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x03ac, 0x0387, - 0x03ad, 0x03ae, 0x03af, 0x038b, 0x03cc, 0x038d, 0x03cd, 0x03ce, - 0x0390, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, - 0x03c0, 0x03c1, 0x03a2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, - 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03ac, 0x03ad, 0x03ae, 0x03af, - 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, - 0x03c0, 0x03c1, 0x03c3, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, - 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x03cf, - 0x03b2, 0x03b8, 0x03d2, 0x03d3, 0x03d4, 0x03c6, 0x03c0, 0x03d7, - 0x03d9, 0x03d9, 0x03db, 0x03db, 0x03dd, 0x03dd, 0x03df, 0x03df, - 0x03e1, 0x03e1, 0x03e3, 0x03e3, 0x03e5, 0x03e5, 0x03e7, 0x03e7, - 0x03e9, 0x03e9, 0x03eb, 0x03eb, 0x03ed, 0x03ed, 0x03ef, 0x03ef, - 0x03ba, 0x03c1, 0x03f2, 0x03f3, 0x03b8, 0x03b5, 0x03f6, 0x03f8, - 0x03f8, 0x03f2, 0x03fb, 0x03fb, 0x03fc, 0x03fd, 0x03fe, 0x03ff -}}; -static UnicodeCaseTableVector caseTable04 = {{ - 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, - 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, - 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, - 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, - 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, - 0x0469, 0x0469, 0x046b, 0x046b, 0x046d, 0x046d, 0x046f, 0x046f, - 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, 0x0477, 0x0477, - 0x0479, 0x0479, 0x047b, 0x047b, 0x047d, 0x047d, 0x047f, 0x047f, - 0x0481, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, - 0x0488, 0x0489, 0x048b, 0x048b, 0x048d, 0x048d, 0x048f, 0x048f, - 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, - 0x0499, 0x0499, 0x049b, 0x049b, 0x049d, 0x049d, 0x049f, 0x049f, - 0x04a1, 0x04a1, 0x04a3, 0x04a3, 0x04a5, 0x04a5, 0x04a7, 0x04a7, - 0x04a9, 0x04a9, 0x04ab, 0x04ab, 0x04ad, 0x04ad, 0x04af, 0x04af, - 0x04b1, 0x04b1, 0x04b3, 0x04b3, 0x04b5, 0x04b5, 0x04b7, 0x04b7, - 0x04b9, 0x04b9, 0x04bb, 0x04bb, 0x04bd, 0x04bd, 0x04bf, 0x04bf, - 0x04c0, 0x04c2, 0x04c2, 0x04c4, 0x04c4, 0x04c6, 0x04c6, 0x04c8, - 0x04c8, 0x04ca, 0x04ca, 0x04cc, 0x04cc, 0x04ce, 0x04ce, 0x04cf, - 0x04d1, 0x04d1, 0x04d3, 0x04d3, 0x04d5, 0x04d5, 0x04d7, 0x04d7, - 0x04d9, 0x04d9, 0x04db, 0x04db, 0x04dd, 0x04dd, 0x04df, 0x04df, - 0x04e1, 0x04e1, 0x04e3, 0x04e3, 0x04e5, 0x04e5, 0x04e7, 0x04e7, - 0x04e9, 0x04e9, 0x04eb, 0x04eb, 0x04ed, 0x04ed, 0x04ef, 0x04ef, - 0x04f1, 0x04f1, 0x04f3, 0x04f3, 0x04f5, 0x04f5, 0x04f6, 0x04f7, - 0x04f9, 0x04f9, 0x04fa, 0x04fb, 0x04fc, 0x04fd, 0x04fe, 0x04ff -}}; -static UnicodeCaseTableVector caseTable05 = {{ - 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, 0x0507, 0x0507, - 0x0509, 0x0509, 0x050b, 0x050b, 0x050d, 0x050d, 0x050f, 0x050f, - 0x0510, 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, - 0x0518, 0x0519, 0x051a, 0x051b, 0x051c, 0x051d, 0x051e, 0x051f, - 0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527, - 0x0528, 0x0529, 0x052a, 0x052b, 0x052c, 0x052d, 0x052e, 0x052f, - 0x0530, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, - 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, - 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, - 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, - 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0557, - 0x0558, 0x0559, 0x055a, 0x055b, 0x055c, 0x055d, 0x055e, 0x055f, - 0x0560, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, - 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, - 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, - 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, - 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587, - 0x0588, 0x0589, 0x058a, 0x058b, 0x058c, 0x058d, 0x058e, 0x058f, - 0x0590, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, - 0x0598, 0x0599, 0x059a, 0x059b, 0x059c, 0x059d, 0x059e, 0x059f, - 0x05a0, 0x05a1, 0x05a2, 0x05a3, 0x05a4, 0x05a5, 0x05a6, 0x05a7, - 0x05a8, 0x05a9, 0x05aa, 0x05ab, 0x05ac, 0x05ad, 0x05ae, 0x05af, - 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, - 0x05b8, 0x05b9, 0x05ba, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, - 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05c4, 0x05c5, 0x05c6, 0x05c7, - 0x05c8, 0x05c9, 0x05ca, 0x05cb, 0x05cc, 0x05cd, 0x05ce, 0x05cf, - 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, - 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, - 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, - 0x05e8, 0x05e9, 0x05ea, 0x05eb, 0x05ec, 0x05ed, 0x05ee, 0x05ef, - 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0x05f5, 0x05f6, 0x05f7, - 0x05f8, 0x05f9, 0x05fa, 0x05fb, 0x05fc, 0x05fd, 0x05fe, 0x05ff -}}; -static UnicodeCaseTableVector caseTable1e = {{ - 0x1e01, 0x1e01, 0x1e03, 0x1e03, 0x1e05, 0x1e05, 0x1e07, 0x1e07, - 0x1e09, 0x1e09, 0x1e0b, 0x1e0b, 0x1e0d, 0x1e0d, 0x1e0f, 0x1e0f, - 0x1e11, 0x1e11, 0x1e13, 0x1e13, 0x1e15, 0x1e15, 0x1e17, 0x1e17, - 0x1e19, 0x1e19, 0x1e1b, 0x1e1b, 0x1e1d, 0x1e1d, 0x1e1f, 0x1e1f, - 0x1e21, 0x1e21, 0x1e23, 0x1e23, 0x1e25, 0x1e25, 0x1e27, 0x1e27, - 0x1e29, 0x1e29, 0x1e2b, 0x1e2b, 0x1e2d, 0x1e2d, 0x1e2f, 0x1e2f, - 0x1e31, 0x1e31, 0x1e33, 0x1e33, 0x1e35, 0x1e35, 0x1e37, 0x1e37, - 0x1e39, 0x1e39, 0x1e3b, 0x1e3b, 0x1e3d, 0x1e3d, 0x1e3f, 0x1e3f, - 0x1e41, 0x1e41, 0x1e43, 0x1e43, 0x1e45, 0x1e45, 0x1e47, 0x1e47, - 0x1e49, 0x1e49, 0x1e4b, 0x1e4b, 0x1e4d, 0x1e4d, 0x1e4f, 0x1e4f, - 0x1e51, 0x1e51, 0x1e53, 0x1e53, 0x1e55, 0x1e55, 0x1e57, 0x1e57, - 0x1e59, 0x1e59, 0x1e5b, 0x1e5b, 0x1e5d, 0x1e5d, 0x1e5f, 0x1e5f, - 0x1e61, 0x1e61, 0x1e63, 0x1e63, 0x1e65, 0x1e65, 0x1e67, 0x1e67, - 0x1e69, 0x1e69, 0x1e6b, 0x1e6b, 0x1e6d, 0x1e6d, 0x1e6f, 0x1e6f, - 0x1e71, 0x1e71, 0x1e73, 0x1e73, 0x1e75, 0x1e75, 0x1e77, 0x1e77, - 0x1e79, 0x1e79, 0x1e7b, 0x1e7b, 0x1e7d, 0x1e7d, 0x1e7f, 0x1e7f, - 0x1e81, 0x1e81, 0x1e83, 0x1e83, 0x1e85, 0x1e85, 0x1e87, 0x1e87, - 0x1e89, 0x1e89, 0x1e8b, 0x1e8b, 0x1e8d, 0x1e8d, 0x1e8f, 0x1e8f, - 0x1e91, 0x1e91, 0x1e93, 0x1e93, 0x1e95, 0x1e95, 0x1e96, 0x1e97, - 0x1e98, 0x1e99, 0x1e9a, 0x1e61, 0x1e9c, 0x1e9d, 0x1e9e, 0x1e9f, - 0x1ea1, 0x1ea1, 0x1ea3, 0x1ea3, 0x1ea5, 0x1ea5, 0x1ea7, 0x1ea7, - 0x1ea9, 0x1ea9, 0x1eab, 0x1eab, 0x1ead, 0x1ead, 0x1eaf, 0x1eaf, - 0x1eb1, 0x1eb1, 0x1eb3, 0x1eb3, 0x1eb5, 0x1eb5, 0x1eb7, 0x1eb7, - 0x1eb9, 0x1eb9, 0x1ebb, 0x1ebb, 0x1ebd, 0x1ebd, 0x1ebf, 0x1ebf, - 0x1ec1, 0x1ec1, 0x1ec3, 0x1ec3, 0x1ec5, 0x1ec5, 0x1ec7, 0x1ec7, - 0x1ec9, 0x1ec9, 0x1ecb, 0x1ecb, 0x1ecd, 0x1ecd, 0x1ecf, 0x1ecf, - 0x1ed1, 0x1ed1, 0x1ed3, 0x1ed3, 0x1ed5, 0x1ed5, 0x1ed7, 0x1ed7, - 0x1ed9, 0x1ed9, 0x1edb, 0x1edb, 0x1edd, 0x1edd, 0x1edf, 0x1edf, - 0x1ee1, 0x1ee1, 0x1ee3, 0x1ee3, 0x1ee5, 0x1ee5, 0x1ee7, 0x1ee7, - 0x1ee9, 0x1ee9, 0x1eeb, 0x1eeb, 0x1eed, 0x1eed, 0x1eef, 0x1eef, - 0x1ef1, 0x1ef1, 0x1ef3, 0x1ef3, 0x1ef5, 0x1ef5, 0x1ef7, 0x1ef7, - 0x1ef9, 0x1ef9, 0x1efa, 0x1efb, 0x1efc, 0x1efd, 0x1efe, 0x1eff -}}; -static UnicodeCaseTableVector caseTable1f = {{ - 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, - 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, - 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f16, 0x1f17, - 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f1e, 0x1f1f, - 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, - 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, - 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, - 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, - 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f46, 0x1f47, - 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f4e, 0x1f4f, - 0x1f50, 0x1f51, 0x1f52, 0x1f53, 0x1f54, 0x1f55, 0x1f56, 0x1f57, - 0x1f58, 0x1f51, 0x1f5a, 0x1f53, 0x1f5c, 0x1f55, 0x1f5e, 0x1f57, - 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, - 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, - 0x1f70, 0x1f71, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1f76, 0x1f77, - 0x1f78, 0x1f79, 0x1f7a, 0x1f7b, 0x1f7c, 0x1f7d, 0x1f7e, 0x1f7f, - 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, - 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, - 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, - 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, - 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, - 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, - 0x1fb0, 0x1fb1, 0x1fb2, 0x1fb3, 0x1fb4, 0x1fb5, 0x1fb6, 0x1fb7, - 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x1fb3, 0x1fbd, 0x03b9, 0x1fbf, - 0x1fc0, 0x1fc1, 0x1fc2, 0x1fc3, 0x1fc4, 0x1fc5, 0x1fc6, 0x1fc7, - 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1fc3, 0x1fcd, 0x1fce, 0x1fcf, - 0x1fd0, 0x1fd1, 0x1fd2, 0x1fd3, 0x1fd4, 0x1fd5, 0x1fd6, 0x1fd7, - 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x1fdc, 0x1fdd, 0x1fde, 0x1fdf, - 0x1fe0, 0x1fe1, 0x1fe2, 0x1fe3, 0x1fe4, 0x1fe5, 0x1fe6, 0x1fe7, - 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0x1fed, 0x1fee, 0x1fef, - 0x1ff0, 0x1ff1, 0x1ff2, 0x1ff3, 0x1ff4, 0x1ff5, 0x1ff6, 0x1ff7, - 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x1ff3, 0x1ffd, 0x1ffe, 0x1fff -}}; -static UnicodeCaseTableVector caseTable21 = {{ - 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, - 0x2108, 0x2109, 0x210a, 0x210b, 0x210c, 0x210d, 0x210e, 0x210f, - 0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, - 0x2118, 0x2119, 0x211a, 0x211b, 0x211c, 0x211d, 0x211e, 0x211f, - 0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x03c9, 0x2127, - 0x2128, 0x2129, 0x006b, 0x00e5, 0x212c, 0x212d, 0x212e, 0x212f, - 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, - 0x2138, 0x2139, 0x213a, 0x213b, 0x213c, 0x213d, 0x213e, 0x213f, - 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147, - 0x2148, 0x2149, 0x214a, 0x214b, 0x214c, 0x214d, 0x214e, 0x214f, - 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, - 0x2158, 0x2159, 0x215a, 0x215b, 0x215c, 0x215d, 0x215e, 0x215f, - 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, - 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, - 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, - 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, - 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187, - 0x2188, 0x2189, 0x218a, 0x218b, 0x218c, 0x218d, 0x218e, 0x218f, - 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, - 0x2198, 0x2199, 0x219a, 0x219b, 0x219c, 0x219d, 0x219e, 0x219f, - 0x21a0, 0x21a1, 0x21a2, 0x21a3, 0x21a4, 0x21a5, 0x21a6, 0x21a7, - 0x21a8, 0x21a9, 0x21aa, 0x21ab, 0x21ac, 0x21ad, 0x21ae, 0x21af, - 0x21b0, 0x21b1, 0x21b2, 0x21b3, 0x21b4, 0x21b5, 0x21b6, 0x21b7, - 0x21b8, 0x21b9, 0x21ba, 0x21bb, 0x21bc, 0x21bd, 0x21be, 0x21bf, - 0x21c0, 0x21c1, 0x21c2, 0x21c3, 0x21c4, 0x21c5, 0x21c6, 0x21c7, - 0x21c8, 0x21c9, 0x21ca, 0x21cb, 0x21cc, 0x21cd, 0x21ce, 0x21cf, - 0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x21d4, 0x21d5, 0x21d6, 0x21d7, - 0x21d8, 0x21d9, 0x21da, 0x21db, 0x21dc, 0x21dd, 0x21de, 0x21df, - 0x21e0, 0x21e1, 0x21e2, 0x21e3, 0x21e4, 0x21e5, 0x21e6, 0x21e7, - 0x21e8, 0x21e9, 0x21ea, 0x21eb, 0x21ec, 0x21ed, 0x21ee, 0x21ef, - 0x21f0, 0x21f1, 0x21f2, 0x21f3, 0x21f4, 0x21f5, 0x21f6, 0x21f7, - 0x21f8, 0x21f9, 0x21fa, 0x21fb, 0x21fc, 0x21fd, 0x21fe, 0x21ff -}}; -static UnicodeCaseTableVector caseTable24 = {{ - 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, - 0x2408, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x240e, 0x240f, - 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, 0x2417, - 0x2418, 0x2419, 0x241a, 0x241b, 0x241c, 0x241d, 0x241e, 0x241f, - 0x2420, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, - 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, - 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, - 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, - 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, - 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, - 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, - 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, - 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, - 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, - 0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, - 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, - 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, - 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, - 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, - 0x2498, 0x2499, 0x249a, 0x249b, 0x249c, 0x249d, 0x249e, 0x249f, - 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7, - 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, - 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x24d0, 0x24d1, - 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, - 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, - 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, - 0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, - 0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, - 0x24e0, 0x24e1, 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, - 0x24e8, 0x24e9, 0x24ea, 0x24eb, 0x24ec, 0x24ed, 0x24ee, 0x24ef, - 0x24f0, 0x24f1, 0x24f2, 0x24f3, 0x24f4, 0x24f5, 0x24f6, 0x24f7, - 0x24f8, 0x24f9, 0x24fa, 0x24fb, 0x24fc, 0x24fd, 0x24fe, 0x24ff -}}; -static UnicodeCaseTableVector caseTableff = {{ - 0xff00, 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, - 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, - 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, - 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, - 0xff20, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, - 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, - 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, - 0xff58, 0xff59, 0xff5a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, - 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, - 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, - 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, - 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xff5e, 0xff5f, - 0xff60, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67, - 0xff68, 0xff69, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, - 0xff70, 0xff71, 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, - 0xff78, 0xff79, 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f, - 0xff80, 0xff81, 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87, - 0xff88, 0xff89, 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f, - 0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97, - 0xff98, 0xff99, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f, - 0xffa0, 0xffa1, 0xffa2, 0xffa3, 0xffa4, 0xffa5, 0xffa6, 0xffa7, - 0xffa8, 0xffa9, 0xffaa, 0xffab, 0xffac, 0xffad, 0xffae, 0xffaf, - 0xffb0, 0xffb1, 0xffb2, 0xffb3, 0xffb4, 0xffb5, 0xffb6, 0xffb7, - 0xffb8, 0xffb9, 0xffba, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbf, - 0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc4, 0xffc5, 0xffc6, 0xffc7, - 0xffc8, 0xffc9, 0xffca, 0xffcb, 0xffcc, 0xffcd, 0xffce, 0xffcf, - 0xffd0, 0xffd1, 0xffd2, 0xffd3, 0xffd4, 0xffd5, 0xffd6, 0xffd7, - 0xffd8, 0xffd9, 0xffda, 0xffdb, 0xffdc, 0xffdd, 0xffde, 0xffdf, - 0xffe0, 0xffe1, 0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0xffe7, - 0xffe8, 0xffe9, 0xffea, 0xffeb, 0xffec, 0xffed, 0xffee, 0xffef, - 0xfff0, 0xfff1, 0xfff2, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xfff7, - 0xfff8, 0xfff9, 0xfffa, 0xfffb, 0xfffc, 0xfffd, 0xfffe, 0xffff -}}; -static UnicodeCaseTableVector *caseTable[256] = { - &caseTable00, - &caseTable01, - &caseTable02, - &caseTable03, - &caseTable04, - &caseTable05, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - &caseTable1e, - &caseTable1f, - NULL, - &caseTable21, - NULL, - NULL, - &caseTable24, - 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, - 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, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - &caseTableff -}; - -static inline char getType(Unicode c) { - int i; - char type; - - if (c > 0xffff) { - type = 'X'; - } else { - i = (c >> 8) & 0xff; - if ((type = typeTable[i].type) == 'X') { - type = typeTable[i].vector[c & 0xff]; - } - } - return type; -} - -GBool unicodeTypeL(Unicode c) { - return getType(c) == 'L'; -} - -GBool unicodeTypeR(Unicode c) { - return getType(c) == 'R'; -} - -Unicode unicodeToUpper(Unicode c) { - int i; - - if (c > 0xffff) { - return c; - } - i = (c >> 8) & 0xff; - if (caseTable[i]) { - return caseTable[i]->codes[c & 0xff]; - } - return c; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.h deleted file mode 100644 index 7103dbddf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/UnicodeTypeTable.h +++ /dev/null @@ -1,20 +0,0 @@ -//======================================================================== -// -// UnicodeTypeTable.h -// -// Copyright 2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef UNICODETYPETABLE_H -#define UNICODETYPETABLE_H - -#include "gtypes.h" - -extern GBool unicodeTypeL(Unicode c); - -extern GBool unicodeTypeR(Unicode c); - -extern Unicode unicodeToUpper(Unicode c); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.cc deleted file mode 100644 index 6a5b6c83b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.cc +++ /dev/null @@ -1,896 +0,0 @@ -//======================================================================== -// -// XRef.cc -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include -#include -#include -#include -#include "gmem.h" -#include "Object.h" -#include "Stream.h" -#include "Lexer.h" -#include "Parser.h" -#include "Dict.h" -#include "Error.h" -#include "ErrorCodes.h" -#include "XRef.h" - -//------------------------------------------------------------------------ - -#define xrefSearchSize 1024 // read this many bytes at end of file - // to look for 'startxref' - -//------------------------------------------------------------------------ -// Permission bits -//------------------------------------------------------------------------ - -#define permPrint (1<<2) -#define permChange (1<<3) -#define permCopy (1<<4) -#define permNotes (1<<5) -#define defPermFlags 0xfffc - -//------------------------------------------------------------------------ -// ObjectStream -//------------------------------------------------------------------------ - -class ObjectStream { -public: - - // Create an object stream, using object number , - // generation 0. - ObjectStream(XRef *xref, int objStrNumA); - - ~ObjectStream(); - - // Return the object number of this object stream. - int getObjStrNum() { return objStrNum; } - - // Get the th object from this stream, which should be - // object number , generation 0. - Object *getObject(int objIdx, int objNum, Object *obj); - -private: - - int objStrNum; // object number of the object stream - int nObjects; // number of objects in the stream - Object *objs; // the objects (length = nObjects) - int *objNums; // the object numbers (length = nObjects) -}; - -ObjectStream::ObjectStream(XRef *xref, int objStrNumA) { - Stream *str; - Parser *parser; - int *offsets; - Object objStr, obj1, obj2; - int first, i; - - objStrNum = objStrNumA; - nObjects = 0; - objs = NULL; - objNums = NULL; - - if (!xref->fetch(objStrNum, 0, &objStr)->isStream()) { - goto err1; - } - - if (!objStr.streamGetDict()->lookup("N", &obj1)->isInt()) { - obj1.free(); - goto err1; - } - nObjects = obj1.getInt(); - obj1.free(); - if (nObjects <= 0) { - goto err1; - } - - if (!objStr.streamGetDict()->lookup("First", &obj1)->isInt()) { - obj1.free(); - goto err1; - } - first = obj1.getInt(); - obj1.free(); - if (first < 0) { - goto err1; - } - - objs = new Object[nObjects]; - objNums = (int *)gmallocn(nObjects, sizeof(int)); - offsets = (int *)gmallocn(nObjects, sizeof(int)); - - // parse the header: object numbers and offsets - objStr.streamReset(); - obj1.initNull(); - str = new EmbedStream(objStr.getStream(), &obj1, gTrue, first); - parser = new Parser(xref, new Lexer(xref, str), gFalse); - for (i = 0; i < nObjects; ++i) { - parser->getObj(&obj1); - parser->getObj(&obj2); - if (!obj1.isInt() || !obj2.isInt()) { - obj1.free(); - obj2.free(); - delete parser; - gfree(offsets); - goto err1; - } - objNums[i] = obj1.getInt(); - offsets[i] = obj2.getInt(); - obj1.free(); - obj2.free(); - if (objNums[i] < 0 || offsets[i] < 0 || - (i > 0 && offsets[i] < offsets[i-1])) { - delete parser; - gfree(offsets); - goto err1; - } - } - while (str->getChar() != EOF) ; - delete parser; - - // skip to the first object - this shouldn't be necessary because - // the First key is supposed to be equal to offsets[0], but just in - // case... - for (i = first; i < offsets[0]; ++i) { - objStr.getStream()->getChar(); - } - - // parse the objects - for (i = 0; i < nObjects; ++i) { - obj1.initNull(); - if (i == nObjects - 1) { - str = new EmbedStream(objStr.getStream(), &obj1, gFalse, 0); - } else { - str = new EmbedStream(objStr.getStream(), &obj1, gTrue, - offsets[i+1] - offsets[i]); - } - parser = new Parser(xref, new Lexer(xref, str), gFalse); - parser->getObj(&objs[i]); - while (str->getChar() != EOF) ; - delete parser; - } - - gfree(offsets); - - err1: - objStr.free(); - return; -} - -ObjectStream::~ObjectStream() { - int i; - - if (objs) { - for (i = 0; i < nObjects; ++i) { - objs[i].free(); - } - delete[] objs; - } - gfree(objNums); -} - -Object *ObjectStream::getObject(int objIdx, int objNum, Object *obj) { - if (objIdx < 0 || objIdx >= nObjects || objNum != objNums[objIdx]) { - return obj->initNull(); - } - return objs[objIdx].copy(obj); -} - -//------------------------------------------------------------------------ -// XRef -//------------------------------------------------------------------------ - -XRef::XRef(BaseStream *strA) { - Guint pos; - Object obj; - - ok = gTrue; - errCode = errNone; - size = 0; - entries = NULL; - streamEnds = NULL; - streamEndsLen = 0; - objStr = NULL; - - encrypted = gFalse; - permFlags = defPermFlags; - ownerPasswordOk = gFalse; - - // read the trailer - str = strA; - start = str->getStart(); - pos = getStartXref(); - - // if there was a problem with the 'startxref' position, try to - // reconstruct the xref table - if (pos == 0) { - if (!(ok = constructXRef())) { - errCode = errDamaged; - return; - } - - // read the xref table - } else { - while (readXRef(&pos)) ; - - // if there was a problem with the xref table, - // try to reconstruct it - if (!ok) { - if (!(ok = constructXRef())) { - errCode = errDamaged; - return; - } - } - } - - // get the root dictionary (catalog) object - trailerDict.dictLookupNF("Root", &obj); - if (obj.isRef()) { - rootNum = obj.getRefNum(); - rootGen = obj.getRefGen(); - obj.free(); - } else { - obj.free(); - if (!(ok = constructXRef())) { - errCode = errDamaged; - return; - } - } - - // now set the trailer dictionary's xref pointer so we can fetch - // indirect objects from it - trailerDict.getDict()->setXRef(this); -} - -XRef::~XRef() { - gfree(entries); - trailerDict.free(); - if (streamEnds) { - gfree(streamEnds); - } - if (objStr) { - delete objStr; - } -} - -// Read the 'startxref' position. -Guint XRef::getStartXref() { - char buf[xrefSearchSize+1]; - char *p; - int c, n, i; - - // read last xrefSearchSize bytes - str->setPos(xrefSearchSize, -1); - for (n = 0; n < xrefSearchSize; ++n) { - if ((c = str->getChar()) == EOF) { - break; - } - buf[n] = c; - } - buf[n] = '\0'; - - // find startxref - for (i = n - 9; i >= 0; --i) { - if (!strncmp(&buf[i], "startxref", 9)) { - break; - } - } - if (i < 0) { - return 0; - } - for (p = &buf[i+9]; isspace(*p); ++p) ; - lastXRefPos = strToUnsigned(p); - - return lastXRefPos; -} - -// Read one xref table section. Also reads the associated trailer -// dictionary, and returns the prev pointer (if any). -GBool XRef::readXRef(Guint *pos) { - Parser *parser; - Object obj; - GBool more; - - // start up a parser, parse one token - obj.initNull(); - parser = new Parser(NULL, - new Lexer(NULL, - str->makeSubStream(start + *pos, gFalse, 0, &obj)), - gTrue); - parser->getObj(&obj); - - // parse an old-style xref table - if (obj.isCmd("xref")) { - obj.free(); - more = readXRefTable(parser, pos); - - // parse an xref stream - } else if (obj.isInt()) { - obj.free(); - if (!parser->getObj(&obj)->isInt()) { - goto err1; - } - obj.free(); - if (!parser->getObj(&obj)->isCmd("obj")) { - goto err1; - } - obj.free(); - if (!parser->getObj(&obj)->isStream()) { - goto err1; - } - more = readXRefStream(obj.getStream(), pos); - obj.free(); - - } else { - goto err1; - } - - delete parser; - return more; - - err1: - obj.free(); - delete parser; - ok = gFalse; - return gFalse; -} - -GBool XRef::readXRefTable(Parser *parser, Guint *pos) { - XRefEntry entry; - GBool more; - Object obj, obj2; - Guint pos2; - int first, n, newSize, i; - - while (1) { - parser->getObj(&obj); - if (obj.isCmd("trailer")) { - obj.free(); - break; - } - if (!obj.isInt()) { - goto err1; - } - first = obj.getInt(); - obj.free(); - if (!parser->getObj(&obj)->isInt()) { - goto err1; - } - n = obj.getInt(); - obj.free(); - if (first < 0 || n < 0 || first + n < 0) { - goto err1; - } - if (first + n > size) { - for (newSize = size ? 2 * size : 1024; - first + n > newSize && newSize > 0; - newSize <<= 1) ; - if (newSize < 0) { - goto err1; - } - entries = (XRefEntry *)greallocn(entries, newSize, sizeof(XRefEntry)); - for (i = size; i < newSize; ++i) { - entries[i].offset = 0xffffffff; - entries[i].type = xrefEntryFree; - } - size = newSize; - } - for (i = first; i < first + n; ++i) { - if (!parser->getObj(&obj)->isInt()) { - goto err1; - } - entry.offset = (Guint)obj.getInt(); - obj.free(); - if (!parser->getObj(&obj)->isInt()) { - goto err1; - } - entry.gen = obj.getInt(); - obj.free(); - parser->getObj(&obj); - if (obj.isCmd("n")) { - entry.type = xrefEntryUncompressed; - } else if (obj.isCmd("f")) { - entry.type = xrefEntryFree; - } else { - goto err1; - } - obj.free(); - if (entries[i].offset == 0xffffffff) { - entries[i] = entry; - // PDF files of patents from the IBM Intellectual Property - // Network have a bug: the xref table claims to start at 1 - // instead of 0. - if (i == 1 && first == 1 && - entries[1].offset == 0 && entries[1].gen == 65535 && - entries[1].type == xrefEntryFree) { - i = first = 0; - entries[0] = entries[1]; - entries[1].offset = 0xffffffff; - } - } - } - } - - // read the trailer dictionary - if (!parser->getObj(&obj)->isDict()) { - goto err1; - } - - // get the 'Prev' pointer - obj.getDict()->lookupNF("Prev", &obj2); - if (obj2.isInt()) { - *pos = (Guint)obj2.getInt(); - more = gTrue; - } else if (obj2.isRef()) { - // certain buggy PDF generators generate "/Prev NNN 0 R" instead - // of "/Prev NNN" - *pos = (Guint)obj2.getRefNum(); - more = gTrue; - } else { - more = gFalse; - } - obj2.free(); - - // save the first trailer dictionary - if (trailerDict.isNone()) { - obj.copy(&trailerDict); - } - - // check for an 'XRefStm' key - if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) { - pos2 = (Guint)obj2.getInt(); - readXRef(&pos2); - if (!ok) { - obj2.free(); - goto err1; - } - } - obj2.free(); - - obj.free(); - return more; - - err1: - obj.free(); - ok = gFalse; - return gFalse; -} - -GBool XRef::readXRefStream(Stream *xrefStr, Guint *pos) { - Dict *dict; - int w[3]; - GBool more; - Object obj, obj2, idx; - int newSize, first, n, i; - - dict = xrefStr->getDict(); - - if (!dict->lookupNF("Size", &obj)->isInt()) { - goto err1; - } - newSize = obj.getInt(); - obj.free(); - if (newSize < 0) { - goto err1; - } - if (newSize > size) { - entries = (XRefEntry *)greallocn(entries, newSize, sizeof(XRefEntry)); - for (i = size; i < newSize; ++i) { - entries[i].offset = 0xffffffff; - entries[i].type = xrefEntryFree; - } - size = newSize; - } - - if (!dict->lookupNF("W", &obj)->isArray() || - obj.arrayGetLength() < 3) { - goto err1; - } - for (i = 0; i < 3; ++i) { - if (!obj.arrayGet(i, &obj2)->isInt()) { - obj2.free(); - goto err1; - } - w[i] = obj2.getInt(); - obj2.free(); - if (w[i] < 0 || w[i] > 4) { - goto err1; - } - } - obj.free(); - - xrefStr->reset(); - dict->lookupNF("Index", &idx); - if (idx.isArray()) { - for (i = 0; i+1 < idx.arrayGetLength(); i += 2) { - if (!idx.arrayGet(i, &obj)->isInt()) { - idx.free(); - goto err1; - } - first = obj.getInt(); - obj.free(); - if (!idx.arrayGet(i+1, &obj)->isInt()) { - idx.free(); - goto err1; - } - n = obj.getInt(); - obj.free(); - if (first < 0 || n < 0 || - !readXRefStreamSection(xrefStr, w, first, n)) { - idx.free(); - goto err0; - } - } - } else { - if (!readXRefStreamSection(xrefStr, w, 0, newSize)) { - idx.free(); - goto err0; - } - } - idx.free(); - - dict->lookupNF("Prev", &obj); - if (obj.isInt()) { - *pos = (Guint)obj.getInt(); - more = gTrue; - } else { - more = gFalse; - } - obj.free(); - if (trailerDict.isNone()) { - trailerDict.initDict(dict); - } - - return more; - - err1: - obj.free(); - err0: - ok = gFalse; - return gFalse; -} - -GBool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) { - Guint offset; - int type, gen, c, newSize, i, j; - - if (first + n < 0) { - return gFalse; - } - if (first + n > size) { - for (newSize = size ? 2 * size : 1024; - first + n > newSize && newSize > 0; - newSize <<= 1) ; - if (newSize < 0) { - return gFalse; - } - entries = (XRefEntry *)greallocn(entries, newSize, sizeof(XRefEntry)); - for (i = size; i < newSize; ++i) { - entries[i].offset = 0xffffffff; - entries[i].type = xrefEntryFree; - } - size = newSize; - } - for (i = first; i < first + n; ++i) { - if (w[0] == 0) { - type = 1; - } else { - for (type = 0, j = 0; j < w[0]; ++j) { - if ((c = xrefStr->getChar()) == EOF) { - return gFalse; - } - type = (type << 8) + c; - } - } - for (offset = 0, j = 0; j < w[1]; ++j) { - if ((c = xrefStr->getChar()) == EOF) { - return gFalse; - } - offset = (offset << 8) + c; - } - for (gen = 0, j = 0; j < w[2]; ++j) { - if ((c = xrefStr->getChar()) == EOF) { - return gFalse; - } - gen = (gen << 8) + c; - } - if (entries[i].offset == 0xffffffff) { - switch (type) { - case 0: - entries[i].offset = offset; - entries[i].gen = gen; - entries[i].type = xrefEntryFree; - break; - case 1: - entries[i].offset = offset; - entries[i].gen = gen; - entries[i].type = xrefEntryUncompressed; - break; - case 2: - entries[i].offset = offset; - entries[i].gen = gen; - entries[i].type = xrefEntryCompressed; - break; - default: - return gFalse; - } - } - } - - return gTrue; -} - -// Attempt to construct an xref table for a damaged file. -GBool XRef::constructXRef() { - Parser *parser; - Object newTrailerDict, obj; - char buf[256]; - Guint pos; - int num, gen; - int newSize; - int streamEndsSize; - char *p; - int i; - GBool gotRoot; - - gfree(entries); - size = 0; - entries = NULL; - - error(-1, "PDF file is damaged - attempting to reconstruct xref table..."); - gotRoot = gFalse; - streamEndsLen = streamEndsSize = 0; - - str->reset(); - while (1) { - pos = str->getPos(); - if (!str->getLine(buf, 256)) { - break; - } - p = buf; - - // skip whitespace - while (*p && Lexer::isSpace(*p & 0xff)) ++p; - - // got trailer dictionary - if (!strncmp(p, "trailer", 7)) { - obj.initNull(); - parser = new Parser(NULL, - new Lexer(NULL, - str->makeSubStream(pos + 7, gFalse, 0, &obj)), - gFalse); - parser->getObj(&newTrailerDict); - if (newTrailerDict.isDict()) { - newTrailerDict.dictLookupNF("Root", &obj); - if (obj.isRef()) { - rootNum = obj.getRefNum(); - rootGen = obj.getRefGen(); - if (!trailerDict.isNone()) { - trailerDict.free(); - } - newTrailerDict.copy(&trailerDict); - gotRoot = gTrue; - } - obj.free(); - } - newTrailerDict.free(); - delete parser; - - // look for object - } else if (isdigit(*p)) { - num = atoi(p); - if (num > 0) { - do { - ++p; - } while (*p && isdigit(*p)); - if (isspace(*p)) { - do { - ++p; - } while (*p && isspace(*p)); - if (isdigit(*p)) { - gen = atoi(p); - do { - ++p; - } while (*p && isdigit(*p)); - if (isspace(*p)) { - do { - ++p; - } while (*p && isspace(*p)); - if (!strncmp(p, "obj", 3)) { - if (num >= size) { - newSize = (num + 1 + 255) & ~255; - if (newSize < 0) { - error(-1, "Bad object number"); - return gFalse; - } - entries = (XRefEntry *) - greallocn(entries, newSize, sizeof(XRefEntry)); - for (i = size; i < newSize; ++i) { - entries[i].offset = 0xffffffff; - entries[i].type = xrefEntryFree; - } - size = newSize; - } - if (entries[num].type == xrefEntryFree || - gen >= entries[num].gen) { - entries[num].offset = pos - start; - entries[num].gen = gen; - entries[num].type = xrefEntryUncompressed; - } - } - } - } - } - } - - } else if (!strncmp(p, "endstream", 9)) { - if (streamEndsLen == streamEndsSize) { - streamEndsSize += 64; - streamEnds = (Guint *)greallocn(streamEnds, - streamEndsSize, sizeof(int)); - } - streamEnds[streamEndsLen++] = pos; - } - } - - if (gotRoot) - return gTrue; - - error(-1, "Couldn't find trailer dictionary"); - return gFalse; -} - -void XRef::setEncryption(int permFlagsA, GBool ownerPasswordOkA, - Guchar *fileKeyA, int keyLengthA, int encVersionA, - CryptAlgorithm encAlgorithmA) { - int i; - - encrypted = gTrue; - permFlags = permFlagsA; - ownerPasswordOk = ownerPasswordOkA; - if (keyLengthA <= 16) { - keyLength = keyLengthA; - } else { - keyLength = 16; - } - for (i = 0; i < keyLength; ++i) { - fileKey[i] = fileKeyA[i]; - } - encVersion = encVersionA; - encAlgorithm = encAlgorithmA; -} - -GBool XRef::okToPrint(GBool ignoreOwnerPW) { - return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permPrint); -} - -GBool XRef::okToChange(GBool ignoreOwnerPW) { - return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permChange); -} - -GBool XRef::okToCopy(GBool ignoreOwnerPW) { - return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permCopy); -} - -GBool XRef::okToAddNotes(GBool ignoreOwnerPW) { - return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permNotes); -} - -Object *XRef::fetch(int num, int gen, Object *obj) { - XRefEntry *e; - Parser *parser; - Object obj1, obj2, obj3; - - // check for bogus ref - this can happen in corrupted PDF files - if (num < 0 || num >= size) { - goto err; - } - - e = &entries[num]; - switch (e->type) { - - case xrefEntryUncompressed: - if (e->gen != gen) { - goto err; - } - obj1.initNull(); - parser = new Parser(this, - new Lexer(this, - str->makeSubStream(start + e->offset, gFalse, 0, &obj1)), - gTrue); - parser->getObj(&obj1); - parser->getObj(&obj2); - parser->getObj(&obj3); - if (!obj1.isInt() || obj1.getInt() != num || - !obj2.isInt() || obj2.getInt() != gen || - !obj3.isCmd("obj")) { - obj1.free(); - obj2.free(); - obj3.free(); - delete parser; - goto err; - } - parser->getObj(obj, encrypted ? fileKey : (Guchar *)NULL, - encAlgorithm, keyLength, num, gen); - obj1.free(); - obj2.free(); - obj3.free(); - delete parser; - break; - - case xrefEntryCompressed: - if (gen != 0) { - goto err; - } - if (!objStr || objStr->getObjStrNum() != (int)e->offset) { - if (objStr) { - delete objStr; - } - objStr = new ObjectStream(this, e->offset); - } - objStr->getObject(e->gen, num, obj); - break; - - default: - goto err; - } - - return obj; - - err: - return obj->initNull(); -} - -Object *XRef::getDocInfo(Object *obj) { - return trailerDict.dictLookup("Info", obj); -} - -// Added for the pdftex project. -Object *XRef::getDocInfoNF(Object *obj) { - return trailerDict.dictLookupNF("Info", obj); -} - -GBool XRef::getStreamEnd(Guint streamStart, Guint *streamEnd) { - int a, b, m; - - if (streamEndsLen == 0 || - streamStart > streamEnds[streamEndsLen - 1]) { - return gFalse; - } - - a = -1; - b = streamEndsLen - 1; - // invariant: streamEnds[a] < streamStart <= streamEnds[b] - while (b - a > 1) { - m = (a + b) / 2; - if (streamStart <= streamEnds[m]) { - b = m; - } else { - a = m; - } - } - *streamEnd = streamEnds[b]; - return gTrue; -} - -Guint XRef::strToUnsigned(char *s) { - Guint x; - char *p; - int i; - - x = 0; - for (p = s, i = 0; *p && isdigit(*p) && i < 10; ++p, ++i) { - x = 10 * x + (*p - '0'); - } - return x; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.h deleted file mode 100644 index 8a5e66c02..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/XRef.h +++ /dev/null @@ -1,133 +0,0 @@ -//======================================================================== -// -// XRef.h -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef XREF_H -#define XREF_H - -#include - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "gtypes.h" -#include "Object.h" - -class Dict; -class Stream; -class Parser; -class ObjectStream; - -//------------------------------------------------------------------------ -// XRef -//------------------------------------------------------------------------ - -enum XRefEntryType { - xrefEntryFree, - xrefEntryUncompressed, - xrefEntryCompressed -}; - -struct XRefEntry { - Guint offset; - int gen; - XRefEntryType type; -}; - -class XRef { -public: - - // Constructor. Read xref table from stream. - XRef(BaseStream *strA); - - // Destructor. - ~XRef(); - - // Is xref table valid? - GBool isOk() { return ok; } - - // Get the error code (if isOk() returns false). - int getErrorCode() { return errCode; } - - // Set the encryption parameters. - void setEncryption(int permFlagsA, GBool ownerPasswordOkA, - Guchar *fileKeyA, int keyLengthA, int encVersionA, - CryptAlgorithm encAlgorithmA); - - // Is the file encrypted? - GBool isEncrypted() { return encrypted; } - - // Check various permissions. - GBool okToPrint(GBool ignoreOwnerPW = gFalse); - GBool okToChange(GBool ignoreOwnerPW = gFalse); - GBool okToCopy(GBool ignoreOwnerPW = gFalse); - GBool okToAddNotes(GBool ignoreOwnerPW = gFalse); - - // Get catalog object. - Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); } - - // Fetch an indirect reference. - Object *fetch(int num, int gen, Object *obj); - - // Return the document's Info dictionary (if any). - Object *getDocInfo(Object *obj); - Object *getDocInfoNF(Object *obj); - - // Return the number of objects in the xref table. - int getNumObjects() { return size; } - - // Return the offset of the last xref table. - Guint getLastXRefPos() { return lastXRefPos; } - - // Return the catalog object reference. - int getRootNum() { return rootNum; } - int getRootGen() { return rootGen; } - - // Get end position for a stream in a damaged file. - // Returns false if unknown or file is not damaged. - GBool getStreamEnd(Guint streamStart, Guint *streamEnd); - - // Direct access. - int getSize() { return size; } - XRefEntry *getEntry(int i) { return &entries[i]; } - Object *getTrailerDict() { return &trailerDict; } - -private: - - BaseStream *str; // input stream - Guint start; // offset in file (to allow for garbage - // at beginning of file) - XRefEntry *entries; // xref entries - int size; // size of array - int rootNum, rootGen; // catalog dict - GBool ok; // true if xref table is valid - int errCode; // error code (if is false) - Object trailerDict; // trailer dictionary - Guint lastXRefPos; // offset of last xref table - Guint *streamEnds; // 'endstream' positions - only used in - // damaged files - int streamEndsLen; // number of valid entries in streamEnds - ObjectStream *objStr; // cached object stream - GBool encrypted; // true if file is encrypted - int permFlags; // permission bits - GBool ownerPasswordOk; // true if owner password is correct - Guchar fileKey[16]; // file decryption key - int keyLength; // length of key, in bytes - int encVersion; // encryption version - CryptAlgorithm encAlgorithm; // encryption algorithm - - Guint getStartXref(); - GBool readXRef(Guint *pos); - GBool readXRefTable(Parser *parser, Guint *pos); - GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n); - GBool readXRefStream(Stream *xrefStr, Guint *pos); - GBool constructXRef(); - Guint strToUnsigned(char *s); -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/config.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/config.h deleted file mode 100644 index 81d4dd071..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/config.h +++ /dev/null @@ -1,112 +0,0 @@ -//======================================================================== -// -// config.h -// -// Copyright 1996-2007 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef CONFIG_H -#define CONFIG_H - -//------------------------------------------------------------------------ -// version -//------------------------------------------------------------------------ - -// xpdf version -#define xpdfVersion "3.02" -#define xpdfVersionNum 3.02 -#define xpdfMajorVersion 3 -#define xpdfMinorVersion 2 -#define xpdfUpdateVersion 0 -#define xpdfMajorVersionStr "3" -#define xpdfMinorVersionStr "2" -#define xpdfUpdateVersionStr "0" - -// supported PDF version -#define supportedPDFVersionStr "1.7" -#define supportedPDFVersionNum 1.7 - -// copyright notice -#define xpdfCopyright "Copyright 1996-2007 Glyph & Cog, LLC" - -// Windows resource file stuff -#define winxpdfVersion "WinXpdf 3.02" -#define xpdfCopyrightAmp "Copyright 1996-2007 Glyph && Cog, LLC" - -//------------------------------------------------------------------------ -// paper size -//------------------------------------------------------------------------ - -// default paper size (in points) for PostScript output -#ifdef A4_PAPER -#define defPaperWidth 595 // ISO A4 (210x297 mm) -#define defPaperHeight 842 -#else -#define defPaperWidth 612 // American letter (8.5x11") -#define defPaperHeight 792 -#endif - -//------------------------------------------------------------------------ -// config file (xpdfrc) path -//------------------------------------------------------------------------ - -// user config file name, relative to the user's home directory -#if defined(VMS) || (defined(WIN32) && !defined(__CYGWIN32__)) -#define xpdfUserConfigFile "xpdfrc" -#else -#define xpdfUserConfigFile ".xpdfrc" -#endif - -// system config file name (set via the configure script) -#ifdef SYSTEM_XPDFRC -#define xpdfSysConfigFile SYSTEM_XPDFRC -#else -// under Windows, we get the directory with the executable and then -// append this file name -#define xpdfSysConfigFile "xpdfrc" -#endif - -//------------------------------------------------------------------------ -// X-related constants -//------------------------------------------------------------------------ - -// default maximum size of color cube to allocate -#define defaultRGBCube 5 - -// number of fonts (combined t1lib, FreeType, X server) to cache -#define xOutFontCacheSize 64 - -// number of Type 3 fonts to cache -#define xOutT3FontCacheSize 8 - -//------------------------------------------------------------------------ -// popen -//------------------------------------------------------------------------ - -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define popen _popen -#define pclose _pclose -#endif - -#if defined(VMS) || defined(VMCMS) || defined(DOS) || defined(OS2) || defined(__EMX__) || defined(WIN32) || defined(__DJGPP__) || defined(MACOS) -#define POPEN_READ_MODE "rb" -#else -#define POPEN_READ_MODE "r" -#endif - -//------------------------------------------------------------------------ -// Win32 stuff -//------------------------------------------------------------------------ - -#ifdef CDECL -#undef CDECL -#endif - -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define CDECL __cdecl -#else -#define CDECL -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.cc deleted file mode 100644 index b2ec1735c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.cc +++ /dev/null @@ -1,777 +0,0 @@ -//======================================================================== -// -// gfile.cc -// -// Miscellaneous file and directory name manipulation. -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#include - -#ifdef WIN32 -# include -#else -# if defined(MACOS) -# include -# elif !defined(ACORN) -# include -# include -# include -# endif -# include -# include -# if !defined(VMS) && !defined(ACORN) && !defined(MACOS) -# include -# endif -# if defined(VMS) && (__DECCXX_VER < 50200000) -# include -# endif -#endif // WIN32 -#include "GString.h" -#include "gfile.h" - -// Some systems don't define this, so just make it something reasonably -// large. -#ifndef PATH_MAX -#define PATH_MAX 1024 -#endif - -//------------------------------------------------------------------------ - -GString *getHomeDir() { -#ifdef VMS - //---------- VMS ---------- - return new GString("SYS$LOGIN:"); - -#elif defined(__EMX__) || defined(WIN32) - //---------- OS/2+EMX and Win32 ---------- - char *s; - GString *ret; - - if ((s = getenv("HOME"))) - ret = new GString(s); - else - ret = new GString("."); - return ret; - -#elif defined(ACORN) - //---------- RISCOS ---------- - return new GString("@"); - -#elif defined(MACOS) - //---------- MacOS ---------- - return new GString(":"); - -#else - //---------- Unix ---------- - char *s; - struct passwd *pw; - GString *ret; - - if ((s = getenv("HOME"))) { - ret = new GString(s); - } else { - if ((s = getenv("USER"))) - pw = getpwnam(s); - else - pw = getpwuid(getuid()); - if (pw) - ret = new GString(pw->pw_dir); - else - ret = new GString("."); - } - return ret; -#endif -} - -GString *getCurrentDir() { - char buf[PATH_MAX+1]; - -#if defined(__EMX__) - if (_getcwd2(buf, sizeof(buf))) -#elif defined(WIN32) - if (GetCurrentDirectory(sizeof(buf), buf)) -#elif defined(ACORN) - if (strcpy(buf, "@")) -#elif defined(MACOS) - if (strcpy(buf, ":")) -#else - if (getcwd(buf, sizeof(buf))) -#endif - return new GString(buf); - return new GString(); -} - -GString *appendToPath(GString *path, char *fileName) { -#if defined(VMS) - //---------- VMS ---------- - //~ this should handle everything necessary for file - //~ requesters, but it's certainly not complete - char *p0, *p1, *p2; - char *q1; - - p0 = path->getCString(); - p1 = p0 + path->getLength() - 1; - if (!strcmp(fileName, "-")) { - if (*p1 == ']') { - for (p2 = p1; p2 > p0 && *p2 != '.' && *p2 != '['; --p2) ; - if (*p2 == '[') - ++p2; - path->del(p2 - p0, p1 - p2); - } else if (*p1 == ':') { - path->append("[-]"); - } else { - path->clear(); - path->append("[-]"); - } - } else if ((q1 = strrchr(fileName, '.')) && !strncmp(q1, ".DIR;", 5)) { - if (*p1 == ']') { - path->insert(p1 - p0, '.'); - path->insert(p1 - p0 + 1, fileName, q1 - fileName); - } else if (*p1 == ':') { - path->append('['); - path->append(']'); - path->append(fileName, q1 - fileName); - } else { - path->clear(); - path->append(fileName, q1 - fileName); - } - } else { - if (*p1 != ']' && *p1 != ':') - path->clear(); - path->append(fileName); - } - return path; - -#elif defined(WIN32) - //---------- Win32 ---------- - GString *tmp; - char buf[256]; - char *fp; - - tmp = new GString(path); - tmp->append('/'); - tmp->append(fileName); - GetFullPathName(tmp->getCString(), sizeof(buf), buf, &fp); - delete tmp; - path->clear(); - path->append(buf); - return path; - -#elif defined(ACORN) - //---------- RISCOS ---------- - char *p; - int i; - - path->append("."); - i = path->getLength(); - path->append(fileName); - for (p = path->getCString() + i; *p; ++p) { - if (*p == '/') { - *p = '.'; - } else if (*p == '.') { - *p = '/'; - } - } - return path; - -#elif defined(MACOS) - //---------- MacOS ---------- - char *p; - int i; - - path->append(":"); - i = path->getLength(); - path->append(fileName); - for (p = path->getCString() + i; *p; ++p) { - if (*p == '/') { - *p = ':'; - } else if (*p == '.') { - *p = ':'; - } - } - return path; - -#elif defined(__EMX__) - //---------- OS/2+EMX ---------- - int i; - - // appending "." does nothing - if (!strcmp(fileName, ".")) - return path; - - // appending ".." goes up one directory - if (!strcmp(fileName, "..")) { - for (i = path->getLength() - 2; i >= 0; --i) { - if (path->getChar(i) == '/' || path->getChar(i) == '\\' || - path->getChar(i) == ':') - break; - } - if (i <= 0) { - if (path->getChar(0) == '/' || path->getChar(0) == '\\') { - path->del(1, path->getLength() - 1); - } else if (path->getLength() >= 2 && path->getChar(1) == ':') { - path->del(2, path->getLength() - 2); - } else { - path->clear(); - path->append(".."); - } - } else { - if (path->getChar(i-1) == ':') - ++i; - path->del(i, path->getLength() - i); - } - return path; - } - - // otherwise, append "/" and new path component - if (path->getLength() > 0 && - path->getChar(path->getLength() - 1) != '/' && - path->getChar(path->getLength() - 1) != '\\') - path->append('/'); - path->append(fileName); - return path; - -#else - //---------- Unix ---------- - int i; - - // appending "." does nothing - if (!strcmp(fileName, ".")) - return path; - - // appending ".." goes up one directory - if (!strcmp(fileName, "..")) { - for (i = path->getLength() - 2; i >= 0; --i) { - if (path->getChar(i) == '/') - break; - } - if (i <= 0) { - if (path->getChar(0) == '/') { - path->del(1, path->getLength() - 1); - } else { - path->clear(); - path->append(".."); - } - } else { - path->del(i, path->getLength() - i); - } - return path; - } - - // otherwise, append "/" and new path component - if (path->getLength() > 0 && - path->getChar(path->getLength() - 1) != '/') - path->append('/'); - path->append(fileName); - return path; -#endif -} - -GString *grabPath(char *fileName) { -#ifdef VMS - //---------- VMS ---------- - char *p; - - if ((p = strrchr(fileName, ']'))) - return new GString(fileName, p + 1 - fileName); - if ((p = strrchr(fileName, ':'))) - return new GString(fileName, p + 1 - fileName); - return new GString(); - -#elif defined(__EMX__) || defined(WIN32) - //---------- OS/2+EMX and Win32 ---------- - char *p; - - if ((p = strrchr(fileName, '/'))) - return new GString(fileName, p - fileName); - if ((p = strrchr(fileName, '\\'))) - return new GString(fileName, p - fileName); - if ((p = strrchr(fileName, ':'))) - return new GString(fileName, p + 1 - fileName); - return new GString(); - -#elif defined(ACORN) - //---------- RISCOS ---------- - char *p; - - if ((p = strrchr(fileName, '.'))) - return new GString(fileName, p - fileName); - return new GString(); - -#elif defined(MACOS) - //---------- MacOS ---------- - char *p; - - if ((p = strrchr(fileName, ':'))) - return new GString(fileName, p - fileName); - return new GString(); - -#else - //---------- Unix ---------- - char *p; - - if ((p = strrchr(fileName, '/'))) - return new GString(fileName, p - fileName); - return new GString(); -#endif -} - -GBool isAbsolutePath(char *path) { -#ifdef VMS - //---------- VMS ---------- - return strchr(path, ':') || - (path[0] == '[' && path[1] != '.' && path[1] != '-'); - -#elif defined(__EMX__) || defined(WIN32) - //---------- OS/2+EMX and Win32 ---------- - return path[0] == '/' || path[0] == '\\' || path[1] == ':'; - -#elif defined(ACORN) - //---------- RISCOS ---------- - return path[0] == '$'; - -#elif defined(MACOS) - //---------- MacOS ---------- - return path[0] != ':'; - -#else - //---------- Unix ---------- - return path[0] == '/'; -#endif -} - -GString *makePathAbsolute(GString *path) { -#ifdef VMS - //---------- VMS ---------- - char buf[PATH_MAX+1]; - - if (!isAbsolutePath(path->getCString())) { - if (getcwd(buf, sizeof(buf))) { - path->insert(0, buf); - } - } - return path; - -#elif defined(WIN32) - //---------- Win32 ---------- - char buf[_MAX_PATH]; - char *fp; - - buf[0] = '\0'; - if (!GetFullPathName(path->getCString(), _MAX_PATH, buf, &fp)) { - path->clear(); - return path; - } - path->clear(); - path->append(buf); - return path; - -#elif defined(ACORN) - //---------- RISCOS ---------- - path->insert(0, '@'); - return path; - -#elif defined(MACOS) - //---------- MacOS ---------- - path->del(0, 1); - return path; - -#else - //---------- Unix and OS/2+EMX ---------- - struct passwd *pw; - char buf[PATH_MAX+1]; - GString *s; - char *p1, *p2; - int n; - - if (path->getChar(0) == '~') { - if (path->getChar(1) == '/' || -#ifdef __EMX__ - path->getChar(1) == '\\' || -#endif - path->getLength() == 1) { - path->del(0, 1); - s = getHomeDir(); - path->insert(0, s); - delete s; - } else { - p1 = path->getCString() + 1; -#ifdef __EMX__ - for (p2 = p1; *p2 && *p2 != '/' && *p2 != '\\'; ++p2) ; -#else - for (p2 = p1; *p2 && *p2 != '/'; ++p2) ; -#endif - if ((n = p2 - p1) > PATH_MAX) - n = PATH_MAX; - strncpy(buf, p1, n); - buf[n] = '\0'; - if ((pw = getpwnam(buf))) { - path->del(0, p2 - p1 + 1); - path->insert(0, pw->pw_dir); - } - } - } else if (!isAbsolutePath(path->getCString())) { - if (getcwd(buf, sizeof(buf))) { -#ifndef __EMX__ - path->insert(0, '/'); -#endif - path->insert(0, buf); - } - } - return path; -#endif -} - -time_t getModTime(char *fileName) { -#ifdef WIN32 - //~ should implement this, but it's (currently) only used in xpdf - return 0; -#else - struct stat statBuf; - - if (stat(fileName, &statBuf)) { - return 0; - } - return statBuf.st_mtime; -#endif -} - -static char* getTempDir() -{ -#ifdef WIN32 - char*dir = getenv("TMP"); - if(!dir) dir = getenv("TEMP"); - if(!dir) dir = getenv("tmp"); - if(!dir) dir = getenv("temp"); - if(!dir) dir = "C:\\"; -#else - char* dir = "/tmp/"; -#endif - return dir; -} - -char* mktmpname(char*ptr) { - static char tmpbuf[128]; - char*dir = getTempDir(); - int l = strlen(dir); - char*sep = ""; - if(!ptr) - ptr = tmpbuf; - if(l && dir[l-1]!='/' && dir[l-1]!='\\') { -#ifdef WIN32 - sep = "\\"; -#else - sep = "/"; -#endif - } - - // used to be mktemp. This does remove the warnings, but - // It's not exactly an improvement. -#ifdef HAVE_LRAND48 - sprintf(ptr, "%s%s%08x%08x",dir,sep,(unsigned int)lrand48(),(unsigned int)lrand48()); -#else -# ifdef HAVE_RAND - sprintf(ptr, "%s%s%08x%08x",dir,sep,rand(),rand()); -# else - static int count = 1; - sprintf(ptr, "%s%s%08x%04x%04x",dir,sep,time(0),(unsigned int)tmpbuf^((unsigned int)tmpbuf)>>16,count); - count ++; -# endif -#endif - return ptr; -} - - -GBool openTempFile(GString **name, FILE **f, char *mode, char *ext) { -#if defined(WIN32) - //---------- Win32 ---------- - char *tempDir; - GString *s, *s2; - char buf[32]; - FILE *f2; - int t, i; - - // this has the standard race condition problem, but I haven't found - // a better way to generate temp file names with extensions on - // Windows - if ((tempDir = getenv("TEMP"))) { - s = new GString(tempDir); - s->append('\\'); - } else { - s = new GString(); - } - s->append("x"); - t = (int)time(NULL); - for (i = 0; i < 1000; ++i) { - sprintf(buf, "%08x-%08x", t + i, GetCurrentThreadId()); - s2 = s->copy()->append(buf); - if (ext) { - s2->append(ext); - } - if (!(f2 = fopen(s2->getCString(), "r"))) { - if (!(f2 = fopen(s2->getCString(), mode))) { - delete s2; - continue; - } - *name = s2; - *f = f2; - delete s; - return gTrue; - } - fclose(f2); - delete s2; - } - fprintf(stderr, "Couldn't create temporary file\n"); - delete s; - return gFalse; -#elif defined(VMS) || defined(__EMX__) || defined(ACORN) || defined(MACOS) - //---------- non-Unix ---------- - char *s; - - // There is a security hole here: an attacker can create a symlink - // with this file name after the tmpnam call and before the fopen - // call. I will happily accept fixes to this function for non-Unix - // OSs. - if (!(s = mktmpname(NULL))) { - return gFalse; - } - *name = new GString(s); - if (ext) { - (*name)->append(ext); - } - if (!(*f = fopen((*name)->getCString(), mode))) { - delete (*name); - return gFalse; - } - return gTrue; -#else - //---------- Unix ---------- - char *s; - int fd; - - if (ext) { -#if HAVE_MKSTEMPS - if ((s = getenv("TMPDIR"))) { - *name = new GString(s); - } else { - *name = new GString("/tmp"); - } - (*name)->append("/XXXXXX")->append(ext); - fd = mkstemps((*name)->getCString(), strlen(ext)); -#else - if (!(s = mktmpname(NULL))) { - return gFalse; - } - *name = new GString(s); - (*name)->append(ext); - fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600); -#endif - } else { -#if HAVE_MKSTEMP - if ((s = getenv("TMPDIR"))) { - *name = new GString(s); - } else { - *name = new GString("/tmp"); - } - (*name)->append("/XXXXXX"); - fd = mkstemp((*name)->getCString()); -#else // HAVE_MKSTEMP - if (!(s = mktmpname(NULL))) { - return gFalse; - } - *name = new GString(s); - fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600); -#endif // HAVE_MKSTEMP - } - if (fd < 0 || !(*f = fdopen(fd, mode))) { - delete *name; - return gFalse; - } - return gTrue; -#endif -} - -GBool executeCommand(char *cmd) { -#ifdef VMS - return system(cmd) ? gTrue : gFalse; -#else - return system(cmd) ? gFalse : gTrue; -#endif -} - -char *getLine(char *buf, int size, FILE *f) { - int c, i; - - i = 0; - while (i < size - 1) { - if ((c = fgetc(f)) == EOF) { - break; - } - buf[i++] = (char)c; - if (c == '\x0a') { - break; - } - if (c == '\x0d') { - c = fgetc(f); - if (c == '\x0a' && i < size - 1) { - buf[i++] = (char)c; - } else if (c != EOF) { - ungetc(c, f); - } - break; - } - } - buf[i] = '\0'; - if (i == 0) { - return NULL; - } - return buf; -} - -//------------------------------------------------------------------------ -// GDir and GDirEntry -//------------------------------------------------------------------------ - -GDirEntry::GDirEntry(char *dirPath, char *nameA, GBool doStat) { -#ifdef VMS - char *p; -#elif defined(WIN32) - int fa; - GString *s; -#elif defined(ACORN) -#else - struct stat st; - GString *s; -#endif - - name = new GString(nameA); - dir = gFalse; - if (doStat) { -#ifdef VMS - if (!strcmp(nameA, "-") || - ((p = strrchr(nameA, '.')) && !strncmp(p, ".DIR;", 5))) - dir = gTrue; -#elif defined(ACORN) -#else - s = new GString(dirPath); - appendToPath(s, nameA); -#ifdef WIN32 - fa = GetFileAttributes(s->getCString()); - dir = (fa != 0xFFFFFFFF && (fa & FILE_ATTRIBUTE_DIRECTORY)); -#else - if (stat(s->getCString(), &st) == 0) - dir = S_ISDIR(st.st_mode); -#endif - delete s; -#endif - } -} - -GDirEntry::~GDirEntry() { - delete name; -} - -GDir::GDir(char *name, GBool doStatA) { - path = new GString(name); - doStat = doStatA; -#if defined(WIN32) - GString *tmp; - - tmp = path->copy(); - tmp->append("/*.*"); - hnd = FindFirstFile(tmp->getCString(), &ffd); - delete tmp; -#elif defined(ACORN) -#elif defined(MACOS) -#else - dir = opendir(name); -#ifdef VMS - needParent = strchr(name, '[') != NULL; -#endif -#endif -} - -GDir::~GDir() { - delete path; -#if defined(WIN32) - if (hnd) { - FindClose(hnd); - hnd = NULL; - } -#elif defined(ACORN) -#elif defined(MACOS) -#else - if (dir) - closedir(dir); -#endif -} - -GDirEntry *GDir::getNextEntry() { - GDirEntry *e; - -#if defined(WIN32) - if (hnd) { - e = new GDirEntry(path->getCString(), ffd.cFileName, doStat); - if (hnd && !FindNextFile(hnd, &ffd)) { - FindClose(hnd); - hnd = NULL; - } - } else { - e = NULL; - } -#elif defined(ACORN) -#elif defined(MACOS) -#elif defined(VMS) - struct dirent *ent; - e = NULL; - if (dir) { - if (needParent) { - e = new GDirEntry(path->getCString(), "-", doStat); - needParent = gFalse; - return e; - } - ent = readdir(dir); - if (ent) { - e = new GDirEntry(path->getCString(), ent->d_name, doStat); - } - } -#else - struct dirent *ent; - e = NULL; - if (dir) { - ent = (struct dirent *)readdir(dir); - if (ent && !strcmp(ent->d_name, ".")) { - ent = (struct dirent *)readdir(dir); - } - if (ent) { - e = new GDirEntry(path->getCString(), ent->d_name, doStat); - } - } -#endif - - return e; -} - -void GDir::rewind() { -#ifdef WIN32 - GString *tmp; - - if (hnd) - FindClose(hnd); - tmp = path->copy(); - tmp->append("/*.*"); - hnd = FindFirstFile(tmp->getCString(), &ffd); - delete tmp; -#elif defined(ACORN) -#elif defined(MACOS) -#else - if (dir) - rewinddir(dir); -#ifdef VMS - needParent = strchr(path->getCString(), '[') != NULL; -#endif -#endif -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.h deleted file mode 100644 index 10a422607..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gfile.h +++ /dev/null @@ -1,141 +0,0 @@ -//======================================================================== -// -// gfile.h -// -// Miscellaneous file and directory name manipulation. -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -#ifndef GFILE_H -#define GFILE_H - -#include -#include -#include -#if defined(WIN32) -# include -# ifdef FPTEX -# include -# else -# include -# endif -#elif defined(ACORN) -#elif defined(MACOS) -# include -#else -# include -# include -# ifdef VMS -# include "vms_dirent.h" -# elif HAVE_DIRENT_H -# include -# define NAMLEN(d) strlen((d)->d_name) -# else -# define dirent direct -# define NAMLEN(d) (d)->d_namlen -# if HAVE_SYS_NDIR_H -# include -# endif -# if HAVE_SYS_DIR_H -# include -# endif -# if HAVE_NDIR_H -# include -# endif -# endif -#endif -#include "gtypes.h" - -class GString; - -//------------------------------------------------------------------------ - -// Get home directory path. -extern GString *getHomeDir(); - -// Get current directory. -extern GString *getCurrentDir(); - -/* create a temporary filename */ -char* mktmpname(char*ptr); - -// Append a file name to a path string. may be an empty -// string, denoting the current directory). Returns . -extern GString *appendToPath(GString *path, char *fileName); - -// Grab the path from the front of the file name. If there is no -// directory component in , returns an empty string. -extern GString *grabPath(char *fileName); - -// Is this an absolute path or file name? -extern GBool isAbsolutePath(char *path); - -// Make this path absolute by prepending current directory (if path is -// relative) or prepending user's directory (if path starts with '~'). -extern GString *makePathAbsolute(GString *path); - -// Get the modification time for . Returns 0 if there is an -// error. -extern time_t getModTime(char *fileName); - -// Create a temporary file and open it for writing. If is not -// NULL, it will be used as the file name extension. Returns both the -// name and the file pointer. For security reasons, all writing -// should be done to the returned file pointer; the file may be -// reopened later for reading, but not for writing. The string -// should be "w" or "wb". Returns true on success. -extern GBool openTempFile(GString **name, FILE **f, char *mode, char *ext); - -// Execute . Returns true on success. -extern GBool executeCommand(char *cmd); - -// Just like fgets, but handles Unix, Mac, and/or DOS end-of-line -// conventions. -extern char *getLine(char *buf, int size, FILE *f); - -//------------------------------------------------------------------------ -// GDir and GDirEntry -//------------------------------------------------------------------------ - -class GDirEntry { -public: - - GDirEntry(char *dirPath, char *nameA, GBool doStat); - ~GDirEntry(); - GString *getName() { return name; } - GBool isDir() { return dir; } - -private: - - GString *name; // dir/file name - GBool dir; // is it a directory? -}; - -class GDir { -public: - - GDir(char *name, GBool doStatA = gTrue); - ~GDir(); - GDirEntry *getNextEntry(); - void rewind(); - -private: - - GString *path; // directory path - GBool doStat; // call stat() for each entry? -#if defined(WIN32) - WIN32_FIND_DATA ffd; - HANDLE hnd; -#elif defined(ACORN) -#elif defined(MACOS) -#else - DIR *dir; // the DIR structure from opendir() -#ifdef VMS - GBool needParent; // need to return an entry for [-] -#endif -#endif -}; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.cc b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.cc deleted file mode 100644 index 7a905c466..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.cc +++ /dev/null @@ -1,348 +0,0 @@ -/* - * gmem.c - * - * Memory routines with out-of-memory checking. - * - * Copyright 1996-2003 Glyph & Cog, LLC - */ - -#include -#include -#include -#include -#include -#include -#include -#include "gmem.h" - -#ifdef DEBUG_MEM - -typedef struct _GMemHdr { - unsigned int magic; - int size; - int index; - struct _GMemHdr *next, *prev; -} GMemHdr; - -#define gMemHdrSize ((sizeof(GMemHdr) + 7) & ~7) -#define gMemTrlSize (sizeof(long)) - -#define gMemMagic 0xabcd9999 - -#if gmemTrlSize==8 -#define gMemDeadVal 0xdeadbeefdeadbeefUL -#else -#define gMemDeadVal 0xdeadbeefUL -#endif - -/* round data size so trailer will be aligned */ -#define gMemDataSize(size) \ - ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize) - -static GMemHdr *gMemHead = NULL; -static GMemHdr *gMemTail = NULL; - -static int gMemIndex = 0; -static int gMemAlloc = 0; -static int gMemInUse = 0; - -#endif /* DEBUG_MEM */ - -void *gmalloc(int size, bool exit_on_error) GMEM_EXCEP { -#ifdef DEBUG_MEM - int size1; - char *mem; - GMemHdr *hdr; - void *data; - unsigned long *trl, *p; - - if (size < 0) { -#if USE_EXCEPTIONS - throw GMemException(); -#else - fprintf(stderr, "Invalid memory allocation size\n"); - if(exit_on_error) - exit(1); - else - return NULL; -#endif - } - if (size == 0) { - return NULL; - } - size1 = gMemDataSize(size); - if (!(mem = (char *)malloc(size1 + gMemHdrSize + gMemTrlSize))) { -#if USE_EXCEPTIONS - throw GMemException(); -#else - fprintf(stderr, "Out of memory\n"); - if(exit_on_error) - exit(1); - else - return NULL; -#endif - } - hdr = (GMemHdr *)mem; - data = (void *)(mem + gMemHdrSize); - trl = (unsigned long *)(mem + gMemHdrSize + size1); - hdr->magic = gMemMagic; - hdr->size = size; - hdr->index = gMemIndex++; - if (gMemTail) { - gMemTail->next = hdr; - hdr->prev = gMemTail; - gMemTail = hdr; - } else { - hdr->prev = NULL; - gMemHead = gMemTail = hdr; - } - hdr->next = NULL; - ++gMemAlloc; - gMemInUse += size; - for (p = (unsigned long *)data; p <= trl; ++p) { - *p = gMemDeadVal; - } - return data; -#else - void *p; - - if (size < 0) { -#if USE_EXCEPTIONS - throw GMemException(); -#else - fprintf(stderr, "Invalid memory allocation size\n"); - if(exit_on_error) - exit(1); - else - return NULL; -#endif - } - if (size == 0) { - return NULL; - } - if (!(p = malloc(size))) { -#if USE_EXCEPTIONS - throw GMemException(); -#else - fprintf(stderr, "Out of memory\n"); - if(exit_on_error) - exit(1); - else - return NULL; -#endif - } - return p; -#endif -} -void *gmalloc(int size) GMEM_EXCEP { - return gmalloc(size, true); -} -void *gmalloc_noexit(int size) GMEM_EXCEP { - return gmalloc(size, false); -} - -void *grealloc(void *p, int size, bool exit_on_error) GMEM_EXCEP { -#ifdef DEBUG_MEM - GMemHdr *hdr; - void *q; - int oldSize; - - if (size < 0) { -#if USE_EXCEPTIONS - throw GMemException(); -#else - fprintf(stderr, "Invalid memory allocation size\n"); - if(exit_on_error) - exit(1); - else - return NULL; -#endif - } - if (size == 0) { - if (p) { - gfree(p); - } - return NULL; - } - if (p) { - hdr = (GMemHdr *)((char *)p - gMemHdrSize); - oldSize = hdr->size; - q = gmalloc(size); - memcpy(q, p, size < oldSize ? size : oldSize); - gfree(p); - } else { - q = gmalloc(size); - } - return q; -#else - void *q; - - if (size < 0) { -#if USE_EXCEPTIONS - throw GMemException(); -#else - fprintf(stderr, "Invalid memory allocation size\n"); - if(exit_on_error) - exit(1); - else - return NULL; -#endif - } - if (size == 0) { - if (p) { - free(p); - } - return NULL; - } - if (p) { - q = realloc(p, size); - } else { - q = malloc(size); - } - if (!q) { -#if USE_EXCEPTIONS - throw GMemException(); -#else - fprintf(stderr, "Out of memory\n"); - if(exit_on_error) - exit(1); - else - return NULL; -#endif - } - return q; -#endif -} -void *grealloc(void *p, int size) GMEM_EXCEP { - return grealloc(p, size, true); -} -void *grealloc_noexit(void *p, int size) GMEM_EXCEP { - return grealloc(p, size, false); -} - -void *gmallocn(int nObjs, int objSize, bool exit_on_error) GMEM_EXCEP { - int n; - - if (nObjs == 0) { - return NULL; - } - n = nObjs * objSize; - if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) { -#if USE_EXCEPTIONS - throw GMemException(); -#else - fprintf(stderr, "Bogus memory allocation size\n"); - if(exit_on_error) - exit(1); - else - return NULL; -#endif - } - return gmalloc(n); -} -void *gmallocn(int nObjs, int objSize) GMEM_EXCEP { - return gmallocn(nObjs, objSize, true); -} -void *gmallocn_noexit(int nObjs, int objSize) GMEM_EXCEP { - return gmallocn(nObjs, objSize, false); -} - -void *greallocn(void *p, int nObjs, int objSize, bool exit_on_error) GMEM_EXCEP { - int n; - - if (nObjs == 0) { - if (p) { - gfree(p); - } - return NULL; - } - n = nObjs * objSize; - if (objSize <= 0 || nObjs < 0 || nObjs >= INT_MAX / objSize) { -#if USE_EXCEPTIONS - throw GMemException(); -#else - fprintf(stderr, "Bogus memory allocation size\n"); - if(exit_on_error) - exit(1); - else - return NULL; -#endif - } - return grealloc(p, n); -} -void *greallocn(void *p, int nObjs, int objSize) GMEM_EXCEP { - return greallocn(p, nObjs, objSize, true); -} -void *greallocn_noexit(void *p, int nObjs, int objSize) GMEM_EXCEP { - return greallocn(p, nObjs, objSize, false); -} - -void gfree(void *p) { -#ifdef DEBUG_MEM - int size; - GMemHdr *hdr; - unsigned long *trl, *clr; - - if (p) { - hdr = (GMemHdr *)((char *)p - gMemHdrSize); - if (hdr->magic == gMemMagic && - ((hdr->prev == NULL) == (hdr == gMemHead)) && - ((hdr->next == NULL) == (hdr == gMemTail))) { - if (hdr->prev) { - hdr->prev->next = hdr->next; - } else { - gMemHead = hdr->next; - } - if (hdr->next) { - hdr->next->prev = hdr->prev; - } else { - gMemTail = hdr->prev; - } - --gMemAlloc; - gMemInUse -= hdr->size; - size = gMemDataSize(hdr->size); - trl = (unsigned long *)((char *)hdr + gMemHdrSize + size); - if (*trl != gMemDeadVal) { - fprintf(stderr, "Overwrite past end of block %d at address %p\n", - hdr->index, p); - } - for (clr = (unsigned long *)hdr; clr <= trl; ++clr) { - *clr = gMemDeadVal; - } - free(hdr); - } else { - fprintf(stderr, "Attempted to free bad address %p\n", p); - } - } -#else - if (p) { - free(p); - } -#endif -} - -#ifdef DEBUG_MEM -void gMemReport(FILE *f) { - GMemHdr *p; - - fprintf(f, "%d memory allocations in all\n", gMemIndex); - if (gMemAlloc > 0) { - fprintf(f, "%d memory blocks left allocated:\n", gMemAlloc); - fprintf(f, " index size\n"); - fprintf(f, "-------- --------\n"); - for (p = gMemHead; p; p = p->next) { - fprintf(f, "%8d %8d\n", p->index, p->size); - } - } else { - fprintf(f, "No memory blocks left allocated\n"); - } -} -#endif - -char *copyString(char *s) { - char *s1; - - s1 = (char *)gmalloc(strlen(s) + 1); - strcpy(s1, s); - return s1; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.h deleted file mode 100644 index 1c247cb70..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gmem.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * gmem.h - * - * Memory routines with out-of-memory checking. - * - * Copyright 1996-2003 Glyph & Cog, LLC - */ - -#ifndef GMEM_H -#define GMEM_H - -#include -#include - -#if USE_EXCEPTIONS - -class GMemException { -public: - GMemException() {} - ~GMemException() {} -}; - -#define GMEM_EXCEP throw(GMemException) - -#else // USE_EXCEPTIONS - -#define GMEM_EXCEP - -#endif // USE_EXCEPTIONS - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Same as malloc, but prints error message and exits if malloc() - * returns NULL. - */ -extern void *gmalloc(int size) GMEM_EXCEP; -extern void *gmalloc_noexit(int size) GMEM_EXCEP; - -/* - * Same as realloc, but prints error message and exits if realloc() - * returns NULL. If

is NULL, calls malloc instead of realloc(). - */ -extern void *grealloc(void *p, int size) GMEM_EXCEP; -extern void *grealloc_noexit(void *p, int size) GMEM_EXCEP; - -/* - * These are similar to gmalloc and grealloc, but take an object count - * and size. The result is similar to allocating nObjs * objSize - * bytes, but there is an additional error check that the total size - * doesn't overflow an int. - */ -extern void *gmallocn(int nObjs, int objSize) GMEM_EXCEP; -extern void *greallocn(void *p, int nObjs, int objSize) GMEM_EXCEP; -extern void *gmallocn_noexit(int nObjs, int objSize) GMEM_EXCEP; -extern void *greallocn_noexit(void *p, int nObjs, int objSize) GMEM_EXCEP; - -/* - * Same as free, but checks for and ignores NULL pointers. - */ -extern void gfree(void *p); - -#ifdef DEBUG_MEM -/* - * Report on unfreed memory. - */ -extern void gMemReport(FILE *f); -#else -#define gMemReport(f) -#endif - -/* - * Allocate memory and copy a string into it. - */ -extern char *copyString(char *s); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gtypes.h b/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gtypes.h deleted file mode 100644 index 9f64f57d4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/pdf/xpdf/gtypes.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * gtypes.h - * - * Some useful simple types. - * - * Copyright 1996-2003 Glyph & Cog, LLC - */ - -#ifndef GTYPES_H -#define GTYPES_H - -/* - * These have stupid names to avoid conflicts with some (but not all) - * C++ compilers which define them. - */ -typedef int GBool; -#define gTrue 1 -#define gFalse 0 - -/* - * These have stupid names to avoid conflicts with , - * which on various systems defines some random subset of these. - */ -typedef unsigned char Guchar; -typedef unsigned short Gushort; -typedef unsigned int Guint; -typedef unsigned long Gulong; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/png.c b/fluidbook/tools/swftools-special-swfdump/lib/png.c deleted file mode 100644 index 66eebb44d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/png.c +++ /dev/null @@ -1,1711 +0,0 @@ -/* png.c - - Copyright (c) 2003/2004/2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef EXPORT -#undef EXPORT -#endif - -#ifdef PNG_INLINE_EXPORTS -#define EXPORT static -#else -#define EXPORT -#include "png.h" -#endif - -typedef unsigned u32; - -typedef struct _COL { - unsigned char a,r,g,b; -} COL; - -static int png_read_chunk(char (*head)[4], int*destlen, unsigned char**destdata, FILE*fi) -{ - unsigned int len; - unsigned char blen[4]; - if(destlen) *destlen=0; - if(destdata) *destdata=0; - if(!fread(&blen, 4, 1, fi)) { - return 0; - } - if(!fread(head, 4, 1, fi)) { - return 0; - } - len = blen[0]<<24|blen[1]<<16|blen[2]<<8|blen[3]; - if(destlen) *destlen = len; - if(destdata) { - if(!len) { - *destdata = 0; - } else { - *destdata = (unsigned char*)malloc(len); - if(!fread(*destdata, len, 1, fi)) { - *destdata = 0; - if(destlen) *destlen=0; - return 0; - } - } - fseek(fi, 4, SEEK_CUR); - - } else { - fseek(fi, len+4, SEEK_CUR); - } - return 1; -} - -static unsigned int png_get_dword(FILE*fi) -{ - unsigned int a; - unsigned char b[4]; - fread(&b,4,1,fi); - return b[0]<<24|b[1]<<16|b[2]<<8|b[3]; -} - -struct png_header -{ - unsigned width; - unsigned height; - int bpp; - int mode; -}; - -static int png_read_header(FILE*fi, struct png_header*header) -{ - char id[4]; - int len; - int ok=0; - unsigned char head[8] = {137,80,78,71,13,10,26,10}; - unsigned char head2[8]; - unsigned char*data; - fread(head2,8,1,fi); - if(strncmp((const char*)head,(const char*)head2,4)) - return 0; // not a png file - - while(png_read_chunk(&id, &len, &data, fi)) - { - //printf("Chunk: %c%c%c%c (len:%d)\n", id[0],id[1],id[2],id[3], len); - if(!strncmp(id, "IHDR", 4)) { - char a,b,c,f,i; - if(len < 8) exit(1); - header->width = data[0]<<24|data[1]<<16|data[2]<<8|data[3]; - header->height = data[4]<<24|data[5]<<16|data[6]<<8|data[7]; - a = data[8]; // should be 8 - b = data[9]; // should be 3(indexed) or 2(rgb) - - c = data[10]; // compression mode (0) - f = data[11]; // filter mode (0) - i = data[12]; // interlace mode (0) - - if(b!=0 && b!=4 && b!=2 && b!=3 && b!=6) { - fprintf(stderr, "Image mode %d not supported!\n", b); - return 0; - } - if(a!=8 && (b==2 || b==6)) { - printf("Bpp %d in mode %d not supported!\n", b, a); - return 0; - } - if(c!=0) { - printf("Compression mode %d not supported!\n", c); - return 0; - } - if(f!=0) { - printf("Filter mode %d not supported!\n", f); - return 0; - } - if(i!=0) { - printf("Interlace mode %d not supported!\n", i); - return 0; - } - //printf("%dx%d bpp:%d mode:%d comp:%d filter:%d interlace:%d\n",header->width, header->height, a,b,c,f,i); - header->bpp = a; - header->mode = b; - ok = 1; - } - - free(data); - } - return ok; -} - -typedef unsigned char byte; -#define ABS(a) ((a)>0?(a):(-(a))) -static inline byte PaethPredictor (byte a,byte b,byte c) -{ - // a = left, b = above, c = upper left - int p = a + b - c; // initial estimate - int pa = ABS(p - a); // distances to a, b, c - int pb = ABS(p - b); - int pc = ABS(p - c); - // return nearest of a,b,c, - // breaking ties in order a,b,c. - if (pa <= pb && pa <= pc) - return a; - else if (pb <= pc) - return b; - else return c; -} - -static void applyfilter1(int mode, unsigned char*src, unsigned char*old, unsigned char*dest, unsigned width) -{ - int x; - unsigned char last=0; - unsigned char upperlast=0; - - if(mode==0) { - for(x=0;x 0xffffffff) - return 0; - unsigned long imagedatalen = (unsigned long)imagedatalen_64; - imagedata = (unsigned char*)malloc(imagedatalen); - - fseek(fi,8,SEEK_SET); - while(!feof(fi)) - { - if(!png_read_chunk(&tagid, &len, &data, fi)) - break; - if(!strncmp(tagid, "IEND", 4)) { - break; - } - if(!strncmp(tagid, "PLTE", 4)) { - palette = data; - palettelen = len/3; - data = 0; //don't free data - //printf("%d colors in palette\n", palettelen); - } - if(!strncmp(tagid, "tRNS", 4)) { - if(header.mode == 3) { - alphapalette = data; - alphapalettelen = len; - data = 0; //don't free data - //printf("found %d alpha colors\n", alphapalettelen); - } else if(header.mode == 0 || header.mode == 2) { - int t; - if(header.mode == 2) { - alphacolor[0] = data[1]; - alphacolor[1] = data[3]; - alphacolor[2] = data[5]; - } else { - alphacolor[0] = alphacolor[1] = alphacolor[2] = data[1]; - } - hasalphacolor = 1; - } - } - if(!strncmp(tagid, "IDAT", 4)) { - if(!zimagedata) { - zimagedatalen = len; - zimagedata = (unsigned char*)malloc(len); - memcpy(zimagedata,data,len); - } else { - zimagedata = (unsigned char*)realloc(zimagedata, zimagedatalen+len); - memcpy(&zimagedata[zimagedatalen], data, len); - zimagedatalen += len; - } - } - if(!strncmp(tagid, "tEXt", 4)) { - /*int t; - printf("Image Text: "); - for(t=0;t=32 && data[t]<128) - printf("%c", data[t]); - else - printf("?"); - } - printf("\n");*/ - } - if(data) { - free(data); data=0; - } - } - - fclose(fi); - if(!zimagedata || uncompress(imagedata, &imagedatalen, zimagedata, zimagedatalen) != Z_OK) { - printf("Couldn't uncompress %s!\n", sname); - if(zimagedata) - free(zimagedata); - return 0; - } - free(zimagedata); - - *destwidth = header.width; - *destheight = header.height; - - data2 = (unsigned char*)malloc(header.width*header.height*4); - - if(header.mode == 4) - { - int i,s=0; - int x,y; - int pos=0; - unsigned char* old= (unsigned char*)malloc(header.width*2); - memset(old, 0, header.width*2); - *destdata = data2; - for(y=0;y=0;x--) { - unsigned char gray = dest[x*2+0]; - unsigned char alpha = dest[x*2+1]; - dest[x*4+0] = alpha; - dest[x*4+1] = gray; - dest[x*4+2] = gray; - dest[x*4+3] = gray; - } - } - free(old); - free(imagedata); - } else if(header.mode == 6 || header.mode == 2) { - int i,s=0; - int x,y; - int pos=0; - *destdata = data2; - - unsigned char* firstline = malloc(header.width*4); - memset(firstline,0,header.width*4); - for(y=0;y>header.bpp); - palettelen = 1<32 bit conversion */ - for(i=0;i>(16-header.bpp-(s&7)))&v; - s+=header.bpp; - } - src = tmpline; - pos+=(header.width*header.bpp+7)/8; - } - - if(!y) { - memset(destline,0,header.width); - old = &destline[y*header.width]; - } else { - old = tmpline; - } - applyfilter1(mode, src, old, destline, header.width); - memcpy(tmpline,destline,header.width); - for(x=0;xnum - c1->num; -} - -static colornum_t* getColors(COL*image, int size, int*num) -{ - unsigned char*colexists = malloc((256*256*256)/8); - memset(colexists, 0, (256*256*256)/8); - int t; - int count=0; - - /* find all different colors in the image */ - for(t=0;t= col) max=i; - else min=i+1; - } - assert(colors[i].color==col); - colors[i].num++; - } - free(colexists); - *num = count; - return colors; -} - -static void getOptimalPalette(COL*image, int size, int palettesize, COL*palette) -{ - int num; - memset(palette, 0, sizeof(COL)*256); - colornum_t*colors = getColors(image, size, &num); - - assert(palettesize<=256); - - qsort(colors, num, sizeof(colornum_t), compare_colors); - - if(num<=palettesize) { - /* if there are not more than palettesize different colors in - the image anyway, we are done */ - int t; - for(t=0;t>8; - palette[t].b = colors[t].color>>16; - palette[t].a = 255; - } - return; - } - - if(num>2048) { - /* if there are too many different colors, pick the ones that - occur most often */ - num = 2048; - } - - colornum_t*centers = malloc(sizeof(colornum_t)*palettesize); - int t; - for(t=0;t= (palettesize+num)*2) { - fprintf(stderr, "Warning: didn't find optimal palette\n"); - break; - } - change = 0; - int s,t; - for(s=0;s>0&0xff) - (colors[t].color>>0&0xff)); - distance += abs((centers[s].color>>8&0xff) - (colors[t].color>>8&0xff)); - distance += abs((centers[s].color>>16&0xff) - (colors[t].color>>16&0xff)); - distance *= colors[t].num; - if(distance>0)&0xff)*colors[t].num; - g += ((colors[t].color>>8)&0xff)*colors[t].num; - b += ((colors[t].color>>16)&0xff)*colors[t].num; - count+=colors[t].num; - } - } - if(!count) { - int random = rand()%num; - centers[s].color = colors[random].color; - centers[s].num = 0; - change = 1; - } else { - r /= count; - g /= count; - b /= count; - centers[s].color = r|g<<8|b<<16; - centers[s].num = count; - } - } - } - free(belongsto); - free(colors); - for(t=0;t>8; - palette[t].b = centers[t].color>>16; - palette[t].a = 255; - } - free(centers); -} - -static int sqr(const int x) {return x*x;} - -static void png_quantize_image(unsigned char*_image, int size, int numcolors, unsigned char**newimage, COL*palette) -{ - COL*image = (COL*)_image; - getOptimalPalette(image, size, numcolors, palette); - *newimage = (unsigned char*)malloc(size); - int t; - for(t=0;t> 1); - } - crc32_table[t] = c; - } -} -static inline void png_write_byte(FILE*fi, unsigned char byte) -{ - fwrite(&byte,1,1,fi); - mycrc32 = crc32_table[(mycrc32 ^ byte) & 0xff] ^ (mycrc32 >> 8); -} -static long png_start_chunk(FILE*fi, char*type, int len) -{ - unsigned char mytype[4]={0,0,0,0}; - unsigned char mylen[4]; - long filepos; - mylen[0] = len>>24; - mylen[1] = len>>16; - mylen[2] = len>>8; - mylen[3] = len; - memcpy(mytype,type,strlen(type)); - filepos = ftell(fi); - fwrite(&mylen, 4, 1, fi); - mycrc32=0xffffffff; - png_write_byte(fi,mytype[0]); - png_write_byte(fi,mytype[1]); - png_write_byte(fi,mytype[2]); - png_write_byte(fi,mytype[3]); - return filepos; -} -static void png_patch_len(FILE*fi, int pos, int len) -{ - unsigned char mylen[4]; - long filepos; - mylen[0] = len>>24; - mylen[1] = len>>16; - mylen[2] = len>>8; - mylen[3] = len; - fseek(fi, pos, SEEK_SET); - fwrite(&mylen, 4, 1, fi); - fseek(fi, 0, SEEK_END); -} -static void png_write_bytes(FILE*fi, unsigned char*bytes, int len) -{ - int t; - for(t=0;t>24); - png_write_byte(fi,dword>>16); - png_write_byte(fi,dword>>8); - png_write_byte(fi,dword); -} -static void png_end_chunk(FILE*fi) -{ - u32 tmp = mycrc32^0xffffffff; - unsigned char tmp2[4]; - tmp2[0] = tmp>>24; - tmp2[1] = tmp>>16; - tmp2[2] = tmp>>8; - tmp2[3] = tmp; - fwrite(&tmp2,4,1,fi); -} - -#define ZLIB_BUFFER_SIZE 16384 - -static long compress_line(z_stream*zs, Bytef*line, int len, FILE*fi) -{ - long size = 0; - zs->next_in = line; - zs->avail_in = len; - - while(1) { - int ret = deflate(zs, Z_NO_FLUSH); - if (ret != Z_OK) { - fprintf(stderr, "error in deflate(): %s", zs->msg?zs->msg:"unknown"); - return 0; - } - if(zs->avail_out != ZLIB_BUFFER_SIZE) { - int consumed = ZLIB_BUFFER_SIZE - zs->avail_out; - size += consumed; - png_write_bytes(fi, zs->next_out - consumed , consumed); - zs->next_out = zs->next_out - consumed; - zs->avail_out = ZLIB_BUFFER_SIZE; - } - if(!zs->avail_in) { - break; - } - } - return size; -} - -static int test_line(z_stream*zs_orig, Bytef*line, int linelen) -{ - z_stream zs; - int ret = deflateCopy(&zs, zs_orig); - if(ret != Z_OK) { - fprintf(stderr, "Couldn't copy stream\n"); - return 0; - } - - zs.next_in = line; - zs.avail_in = linelen; - - long size = 0; - - int mode = Z_SYNC_FLUSH; - while(1) { - int ret = deflate(&zs, mode); - if (ret != Z_OK && ret != Z_STREAM_END) { - fprintf(stderr, "error in deflate(): %s (mode %s, %d bytes remaining)\n", zs.msg?zs.msg:"unknown", - mode==Z_SYNC_FLUSH?"Z_SYNC_FLUSH":"Z_FINISH", zs.avail_in); - return 0; - } - if(zs.avail_out != ZLIB_BUFFER_SIZE) { - int consumed = ZLIB_BUFFER_SIZE - zs.avail_out; - size += consumed; - zs.next_out = zs.next_out - consumed; - zs.avail_out = ZLIB_BUFFER_SIZE; - } - if (ret == Z_STREAM_END) { - break; - } - if(!zs.avail_in) { - mode = Z_FINISH; - } - } - ret = deflateEnd(&zs); - if (ret != Z_OK) { - fprintf(stderr, "error in deflateEnd(): %s\n", zs.msg?zs.msg:"unknown"); - return 0; - } - return size; -} - -static int finishzlib(z_stream*zs, FILE*fi) -{ - int size = 0; - int ret; - while(1) { - ret = deflate(zs, Z_FINISH); - if (ret != Z_OK && - ret != Z_STREAM_END) { - fprintf(stderr, "error in deflate(finish): %s\n", zs->msg?zs->msg:"unknown"); - return 0; - } - - if(zs->avail_out != ZLIB_BUFFER_SIZE) { - int consumed = ZLIB_BUFFER_SIZE - zs->avail_out; - size += consumed; - png_write_bytes(fi, zs->next_out - consumed , consumed); - zs->next_out = zs->next_out - consumed; - zs->avail_out = ZLIB_BUFFER_SIZE; - } - if (ret == Z_STREAM_END) { - break; - } - } - ret = deflateEnd(zs); - if (ret != Z_OK) { - fprintf(stderr, "error in deflateEnd(): %s\n", zs->msg?zs->msg:"unknown"); - return 0; - } - return size; -} - -static inline u32 color_hash(COL*col) -{ - u32 col32 = *(u32*)col; - u32 hash = (col32 >> 17) ^ col32; - hash ^= ((hash>>8) + 1) ^ hash; - return hash; -} - -static int png_get_number_of_palette_entries(COL*img, unsigned width, unsigned height, COL*palette, char*has_alpha) -{ - int len = width*height; - int t; - int palsize = 0; - int size[256]; - int palette_overflow = 0; - u32 lastcol32 = 0; - - memset(size, 0, sizeof(size)); - - u32*pal = (u32*)malloc(65536*sizeof(u32)); - int*count = (int*)malloc(65536*sizeof(int)); - - assert(sizeof(COL)==sizeof(u32)); - assert(width && height); - - lastcol32 = (*(u32*)&img[0])^0xffffffff; // don't match - - for(t=0;t0?5:2; //don't apply y-direction filter in first line - - int bytes_per_pixel = bpp>>3; - int w = width*bytes_per_pixel; - int back_x = bytes_per_pixel; - int back_y = y?width*bytes_per_pixel:0; - - unsigned char*pairs[5]; - pairs[0] = calloc(1, 8192); - pairs[1] = calloc(1, 8192); - pairs[2] = calloc(1, 8192); - pairs[3] = calloc(1, 8192); - pairs[4] = calloc(1, 8192); - - unsigned char old[5]; - int l = bytes_per_pixel - 1; - old[0] = src[l]; - old[1] = src[l]; - old[2] = src[l] - src[l-back_y]; - old[3] = src[l] - src[l-back_y]; - old[4] = src[l] - PaethPredictor(0, src[l-back_y], 0); - - int different_pairs[5] = {0,0,0,0,0}; - - int x; - for(x=bytes_per_pixel;x>3; - int b = 1<<(v&7); - if(!pairs[i][p]&b) { - pairs[i][p]|=b; - different_pairs[i]++; - } - } - memcpy(old, dest, sizeof(old)); - } - int f; - int best_nr = 0; - int best_energy = INT_MAX; - for(f=0;f0?5:2; //don't apply y-direction filter in first line - int f; - int best_energy = INT_MAX; - int w = width*(bpp/8); - unsigned char* pairs = malloc(8192); - assert(bpp==8 || bpp==32); - for(f=0;f>3; - int b = 1<<(v&7); - if(!pairs[p]&b) { - pairs[p]|=b; - different_pairs ++; - } - } - int energy = different_pairs; - if(energy256) { - bpp = 32; - cols = 0; - format = 5; - } else if(!numcolors) { - int num = png_get_number_of_palette_entries((COL*)data, width, height, palette, &has_alpha); - if(num<=255) { - //printf("image has %d different colors (alpha=%d)\n", num, has_alpha); - data2 = malloc(width*height); - png_map_to_palette((COL*)data, data2, width*height, palette, num); - data = data2; - bpp = 8; - cols = num; - format = 3; - } else { - bpp = 32; - cols = 0; - format = 5; - } - } else { - bpp = 8; - cols = numcolors; - format = 3; - png_quantize_image(data, width*height, numcolors, &data, palette); - } - - fi = fopen(filename, "wb"); - if(!fi) { - perror("open"); - return; - } - fwrite(head,sizeof(head),1,fi); - - png_start_chunk(fi, "IHDR", 13); - png_write_dword(fi,width); - png_write_dword(fi,height); - png_write_byte(fi,8); - if(format == 3) - png_write_byte(fi,3); //indexed - else if(format == 5 && alpha==0) - png_write_byte(fi,2); //rgb - else if(format == 5 && alpha==1) - png_write_byte(fi,6); //rgba - else return; - - png_write_byte(fi,0); //compression mode - png_write_byte(fi,0); //filter mode - png_write_byte(fi,0); //interlace mode - png_end_chunk(fi); - - if(format == 3) { - png_start_chunk(fi, "PLTE", cols*3); - for(t=0;t=2) - continue; // don't do y direction filters in the first row - - line[0]=filtermode; //filter type - if(bpp==8) - png_apply_specific_filter_8(filtermode, line+1, &data[y*srcwidth], width); - else - png_apply_specific_filter_32(filtermode, line+1, &data[y*srcwidth], width); - - int size = test_line(&zs, line, linelen); - if(size < bestsize) { - memcpy(bestline, line, linelen); - bestsize = size; - } - } - idatsize += compress_line(&zs, bestline, linelen, fi); - } - free(bestline); -#else - for(y=0;y - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __png_h__ -#define __png_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -int png_apply_filter_32(unsigned char*dest, unsigned char*src, unsigned width, int y); -void png_inverse_filter_32(int mode, unsigned char*src, unsigned char*old, unsigned char*dest, unsigned width); - -int png_load(const char*sname, unsigned*destwidth, unsigned*destheight, unsigned char**destdata); -int png_getdimensions(const char*sname, unsigned*destwidth, unsigned*destheight); - -void png_write_palette_based(const char*filename, unsigned char*data, unsigned width, unsigned height, int numcolors); - -void png_write(const char*filename, unsigned char*data, unsigned width, unsigned height); -void png_write_quick(const char*filename, unsigned char*data, unsigned width, unsigned height); -void png_write_palette_based_2(const char*filename, unsigned char*data, unsigned width, unsigned height); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile deleted file mode 100644 index d13b16bb3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile +++ /dev/null @@ -1,81 +0,0 @@ -top_builddir = ../.. -srcdir = . -top_srcdir = ../.. -include ../../Makefile.common - -all: gfx.$(SLEXT) -static: SWF$(A) gfx$(A) -exe: mypython$(E) swfpython$(E) testmem$(E) - -primitives.$(O): primitives.c primitives.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c primitives.c -o primitives.$(O) -tagmap.$(O): tagmap.c tagmap.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tagmap.c -o tagmap.$(O) -taglist.$(O): taglist.c taglist.h tagmap.h tag.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c taglist.c -o taglist.$(O) -tag.$(O): tag.c tag.h tagmap.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tag.c -o tag.$(O) -tags.$(O): tags.c tags.h tagmap.h tag.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tags.c -o tags.$(O) -image.$(O): image.c image.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c image.c -o image.$(O) -action.$(O): action.c action.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c action.c -o action.$(O) -pyutils.$(O): pyutils.c pyutils.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c pyutils.c -o pyutils.$(O) -gfx.$(O): gfx.c - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c gfx.c -o gfx.$(O) - -SWF.$(O): SWF.c pyutils.h primitives.h taglist.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c SWF.c -o SWF.$(O) - -SWF_OBJS=SWF.$(O) taglist.$(O) tag.$(O) image.$(O) tags.$(O) tagmap.$(O) action.$(O) primitives.$(O) pyutils.$(O) -SWF_DEPS=../librfxswf$(A) ../libbase$(A) -SWF.$(SLEXT): $(SWF_OBJS) $(SWF_DEPS) Makefile - $(L) -g $(SHARED) $(SWF_OBJS) $(SWF_DEPS) -o SWF.$(SLEXT) $(PYTHON_LIB) $(LIBS) -SWF$(A): $(SWF_OBJS) $(SWF_DEPS) Makefile - $(AR) cru SWF$(A) $(SWF_OBJS) $(SWF_DEPS) - $(RANLIB) SWF$(A) - -GFX_DEPS=../libgfxpdf$(A) ../libgfxswf$(A) ../librfxswf$(A) ../libgfx$(A) ../libocr$(A) ../libbase$(A) -gfx.$(SLEXT): gfx.$(O) $(GFX_DEPS) Makefile - $(L) -g $(SHARED) gfx.$(O) -o gfx.$(SLEXT) $(GFX_DEPS) $(PYTHON_LIB) $(LIBS) $(CXXLIBS) -gfx$(A): gfx.$(O) $(GFX_DEPS) Makefile - mkdir -p tmp - ar cru gfx$(A) gfx.$(O) - for file in $(GFX_DEPS);do rm -f tmp/*;cd tmp;ar x ../$$file || cp ../$$file .;cd ..;$(AR) q gfx$(A) tmp/*.$(O) || break;done - $(RANLIB) gfx$(A) - -#TODO: -install: - -# for debugging: -mypython$(E): mypython.c Makefile - $(L) -Wno-redundant-decls -g $(PYTHON_INCLUDES) mypython.c -o mypython$(E) $(PYTHON_LIB) -swfpython$(E): swfpython.c Makefile primitives.$(O) tagmap.$(O) taglist.$(O) tag.$(O) tags.$(O) action.$(O) pyutils.$(O) SWF.$(O) - $(L) -Wno-redundant-decls -g $(PYTHON_INCLUDES) swfpython.c -o swfpython$(E) $(PYTHON_LIB) ../librfxswf$(A) ../png.$(O) $(LIBS) -testmem$(E): testmem.c Makefile - $(L) $(PYTHON_INCLUDES) testmem.c -o testmem$(E) $(PYTHON_LIB) $(LIBS) - -test: test6 - -test1: SWF.$(SLEXT) - ./test_create.py - swfdump -p tmp/test.swf -test2: SWF.$(SLEXT) - ./test_combine.py - swfdump -u -p tmp/combined.swf -test3: SWF.$(SLEXT) - ./test_simple.py -test4: SWF.$(SLEXT) - ./test_movie.py - swfdump -u -p tmp/test.swf -test5: SWF.$(SLEXT) - ./test_image.py - swfdump -u -p tmp/test.swf -test6: SWF.$(SLEXT) - ./test_sprite.py -clean: - rm -f *.o *.obj *.so mypython swfpython - -.PHONY: test test1 test2 static all exe diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile.in deleted file mode 100644 index 703949bdf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/Makefile.in +++ /dev/null @@ -1,81 +0,0 @@ -top_builddir = ../.. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -include ../../Makefile.common - -all: gfx.$(SLEXT) -static: SWF$(A) gfx$(A) -exe: mypython$(E) swfpython$(E) testmem$(E) - -primitives.$(O): primitives.c primitives.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c primitives.c -o primitives.$(O) -tagmap.$(O): tagmap.c tagmap.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tagmap.c -o tagmap.$(O) -taglist.$(O): taglist.c taglist.h tagmap.h tag.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c taglist.c -o taglist.$(O) -tag.$(O): tag.c tag.h tagmap.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tag.c -o tag.$(O) -tags.$(O): tags.c tags.h tagmap.h tag.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c tags.c -o tags.$(O) -image.$(O): image.c image.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c image.c -o image.$(O) -action.$(O): action.c action.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c action.c -o action.$(O) -pyutils.$(O): pyutils.c pyutils.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c pyutils.c -o pyutils.$(O) -gfx.$(O): gfx.c - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c gfx.c -o gfx.$(O) - -SWF.$(O): SWF.c pyutils.h primitives.h taglist.h - $(C) -Wall -Wno-unused -fPIC $(PYTHON_INCLUDES) -c SWF.c -o SWF.$(O) - -SWF_OBJS=SWF.$(O) taglist.$(O) tag.$(O) image.$(O) tags.$(O) tagmap.$(O) action.$(O) primitives.$(O) pyutils.$(O) -SWF_DEPS=../librfxswf$(A) ../libbase$(A) -SWF.$(SLEXT): $(SWF_OBJS) $(SWF_DEPS) Makefile - $(L) -g $(SHARED) $(SWF_OBJS) $(SWF_DEPS) -o SWF.$(SLEXT) $(PYTHON_LIB) $(LIBS) -SWF$(A): $(SWF_OBJS) $(SWF_DEPS) Makefile - $(AR) cru SWF$(A) $(SWF_OBJS) $(SWF_DEPS) - $(RANLIB) SWF$(A) - -GFX_DEPS=../libgfxpdf$(A) ../libgfxswf$(A) ../librfxswf$(A) ../libgfx$(A) ../libocr$(A) ../libbase$(A) -gfx.$(SLEXT): gfx.$(O) $(GFX_DEPS) Makefile - $(L) -g $(SHARED) gfx.$(O) -o gfx.$(SLEXT) $(GFX_DEPS) $(PYTHON_LIB) $(LIBS) $(CXXLIBS) -gfx$(A): gfx.$(O) $(GFX_DEPS) Makefile - mkdir -p tmp - ar cru gfx$(A) gfx.$(O) - for file in $(GFX_DEPS);do rm -f tmp/*;cd tmp;ar x ../$$file || cp ../$$file .;cd ..;$(AR) q gfx$(A) tmp/*.$(O) || break;done - $(RANLIB) gfx$(A) - -#TODO: -install: - -# for debugging: -mypython$(E): mypython.c Makefile - $(L) -Wno-redundant-decls -g $(PYTHON_INCLUDES) mypython.c -o mypython$(E) $(PYTHON_LIB) -swfpython$(E): swfpython.c Makefile primitives.$(O) tagmap.$(O) taglist.$(O) tag.$(O) tags.$(O) action.$(O) pyutils.$(O) SWF.$(O) - $(L) -Wno-redundant-decls -g $(PYTHON_INCLUDES) swfpython.c -o swfpython$(E) $(PYTHON_LIB) ../librfxswf$(A) ../png.$(O) $(LIBS) -testmem$(E): testmem.c Makefile - $(L) $(PYTHON_INCLUDES) testmem.c -o testmem$(E) $(PYTHON_LIB) $(LIBS) - -test: test6 - -test1: SWF.$(SLEXT) - ./test_create.py - swfdump -p tmp/test.swf -test2: SWF.$(SLEXT) - ./test_combine.py - swfdump -u -p tmp/combined.swf -test3: SWF.$(SLEXT) - ./test_simple.py -test4: SWF.$(SLEXT) - ./test_movie.py - swfdump -u -p tmp/test.swf -test5: SWF.$(SLEXT) - ./test_image.py - swfdump -u -p tmp/test.swf -test6: SWF.$(SLEXT) - ./test_sprite.py -clean: - rm -f *.o *.obj *.so mypython swfpython - -.PHONY: test test1 test2 static all exe diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/SWF.c b/fluidbook/tools/swftools-special-swfdump/lib/python/SWF.c deleted file mode 100644 index 050b36a43..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/SWF.c +++ /dev/null @@ -1,465 +0,0 @@ -/* SWF.c - - Python wrapper for librfxswf- module core. - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#undef HAVE_STAT -#include "../rfxswf.h" -#include "../log.h" -#include "./pyutils.h" -#include "./tags.h" -#include "./taglist.h" -#include "./primitives.h" -#include "./action.h" - -/* -TODO: - 1) taglist is rfxswflib's linked list. It should maybe implemented as Python - list, which would, however, mean that we would have to convert the list - back and forth for the following functions: - load, save, writeCGI, unfoldAll, foldAll, optimizeOrder - 2) taglist should have an ID handler. Every time a tag is inserted, it's ID - is stored in a lookup list. - 3) -*/ - -//-------------------------- Types ------------------------------------------- - -staticforward PyTypeObject SWFClass; - -/* Tags, Objects */ - -typedef struct { - PyObject_HEAD - SWF swf; //swf.firstTag is not used - PyObject*taglist; - char*filename; -} SWFObject; - - -//---------------------------------------------------------------------------- -static PyObject* f_create(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"version", "fps", "bbox", "name", NULL}; - SWFObject* swf; - int version = 6; - double framerate = 25; - PyObject * obbox = 0; - SRECT bbox = {0,0,0,0}; - char* filename = 0; - - swf = PyObject_New(SWFObject, &SWFClass); - mylog("+%08x(%d) create\n", (int)swf, swf->ob_refcnt); - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|idOs", - kwlist, &version, &framerate, - &obbox, &filename)) - return NULL; - - if(obbox) { - if (!PY_CHECK_TYPE(obbox, &BBoxClass)) { - obbox = f_BBox(0, obbox, 0); - if(!obbox) - return NULL; - } - bbox = bbox_getSRECT(obbox); - } - - memset(&swf->swf, 0, sizeof(SWF)); - if(filename) - swf->filename = strdup(filename); - else - swf->filename = 0; - - swf->swf.fileVersion = version; - swf->swf.frameRate = (int)(framerate*0x100); - swf->swf.movieSize = bbox; - swf->taglist = taglist_new(); - - if(swf->swf.fileVersion>=6) - swf->swf.compressed = 1; - - mylog(" %08x(%d) create: done\n", (int)swf, swf->ob_refcnt); - return (PyObject*)swf; -} -//---------------------------------------------------------------------------- -static PyObject* f_load(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist1[] = {"filename", NULL}; - static char *kwlist2[] = {"data", NULL}; - char* filename = 0; - char* data = 0; - int len = 0; - SWFObject* swf; - int fi; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist1, &filename)) { - PyErr_Clear(); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#", kwlist2, &data, &len)) { - PyErr_Clear(); - PyArg_ParseTupleAndKeywords(args, kwargs, "s:load", kwlist1, &filename); - return 0; - } - } - - swf = PyObject_New(SWFObject, &SWFClass); - mylog("+%08x(%d) f_load\n", (int)swf, swf->ob_refcnt); - - memset(&swf->swf, 0, sizeof(SWF)); - - if(filename) { - if(!filename) { - PyErr_SetString(PyExc_Exception, setError("Couldn't open file %s", filename)); - return 0; - } - swf->filename = strdup(filename); - fi = open(filename,O_RDONLY|O_BINARY); - if (fi<0) { - return PY_ERROR("Couldn't open file %s", filename); - } - if(swf_ReadSWF(fi,&swf->swf)<0) { - close(fi); - return PY_ERROR("%s is not a valid SWF file or contains errors",filename); - } - close(fi); - } else { - reader_t r; - reader_init_memreader(&r, data, len); - swf->filename = 0; - if(swf_ReadSWF2(&r, &swf->swf)<0) { - return PY_ERROR(" is not a valid SWF file or contains errors"); - } - r.dealloc(&r); - } - swf_FoldAll(&swf->swf); - - swf->taglist = taglist_new2(swf->swf.firstTag); - if(swf->taglist == NULL) { - return NULL; - } - - swf_FreeTags(&swf->swf); - swf->swf.firstTag = 0; - - return (PyObject*)swf; -} -//---------------------------------------------------------------------------- -static PyObject * swf_save(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"name", "compress", NULL}; - SWFObject*swfo; - SWF*swf; - int fi; - char*filename = 0; - int compress = 0; - - if(!self) - return NULL; - - swfo = (SWFObject*)self; - swf = &swfo->swf; - - filename = swfo->filename; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|si", kwlist, &filename, &compress)) - return NULL; - - mylog(" %08x(%d) f_save filename=%s compress=%d\n", (int)self, self->ob_refcnt, filename, compress); - - // keyword arg compress (=1) forces compression - if(compress) - swf->compressed = 1; - - swf->firstTag = taglist_getTAGs(swfo->taglist); - - /*if(!swf->firstTag) - return NULL;*/ - - // fix the file, in case it is empty or not terminated properly - { - TAG*tag = swf->firstTag; - if(!tag) - tag = swf->firstTag = swf_InsertTag(0,ST_END); - while(tag && tag->next) { - tag = tag->next; - } - if(tag->id != ST_END) { - tag = swf_InsertTag(tag,ST_END); - } - } - - fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - if(fi<0) { - PyErr_SetString(PyExc_Exception, setError("couldn't create output file %s", filename)); - return 0; - } - if(swf_WriteSWF(fi, swf)<0) { - close(fi); - PyErr_SetString(PyExc_Exception, setError("WriteSWC() failed.")); - return 0; - } - close(fi); - - swf_FreeTags(swf); - /*{ TAG * t = swf->firstTag; - while (t) - { - mylog("tag: %08x\n",t); - mylog(" id: %d (%s)\n", t->id, swf_TagGetName(t)); - mylog(" data: %08x (%d bytes)\n", t->data, t->len); - mylog(" next: %08x\n", t->next); - TAG * tnew = t->next; - mylog("->free data\n"); - if (t->data) free(t->data); - mylog("->free tag\n"); - free(t); - t = tnew; - } - }*/ - swf->firstTag = 0; - - mylog(" %08x(%d) f_save filename=%s done\n", (int)self, self->ob_refcnt, filename); - - return PY_NONE; -} -//---------------------------------------------------------------------------- -static PyObject * swf_writeCGI(PyObject* self, PyObject* args) -{ - SWFObject*swf = (SWFObject*)self; - if(!self || !PyArg_ParseTuple(args,"")) - return NULL; - swf->swf.firstTag = taglist_getTAGs(swf->taglist); - if(!swf->swf.firstTag) - return NULL; - swf_WriteCGI(&swf->swf); - swf_FreeTags(&swf->swf); - swf->swf.firstTag = 0; - return PY_NONE; -} -//---------------------------------------------------------------------------- - -//TODO: void swf_Relocate(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[a]==0 means id a is free - -static PyMethodDef swf_functions[] = -{{"save", (PyCFunction)swf_save, METH_KEYWORDS, "Save SWF to disk"}, - {"writeCGI", (PyCFunction)swf_writeCGI, METH_VARARGS, "print SWF as CGI to stdout"}, - {NULL, NULL, 0, NULL} -}; - -//---------------------------------------------------------------------------- -static void swf_dealloc(PyObject* self) -{ - mylog("-%08x(%d) swf_dealloc\n", (int)self, self->ob_refcnt); - SWFObject*swfo; - SWF*swf; - swfo = (SWFObject*)self; - swf = &swfo->swf; - if(swfo->filename) { - free(swfo->filename); - swfo->filename = 0; - } - Py_DECREF(swfo->taglist); - swfo->taglist = 0; - PyObject_Del(self); -} -//---------------------------------------------------------------------------- -static int swf_print(PyObject * self, FILE *fi, int flags) //flags&Py_PRINT_RAW -{ - mylog(" %08x(%d) print \n", (int)self, self->ob_refcnt); - SWFObject*swf = (SWFObject*)self; - swf_DumpHeader(fi, &swf->swf); - //void swf_DumpSWF(FILE * f,SWF*swf); - return 0; -} -//---------------------------------------------------------------------------- -static PyObject* swf_getattr(PyObject * self, char* a) -{ - SWFObject*swf = (SWFObject*)self; - PyObject* ret = 0; - - if(!strcmp(a, "fps")) { - double fps = swf->swf.frameRate/256.0; - mylog(" %08x(%d) swf_getattr %s = %f\n", (int)self, self->ob_refcnt, a, fps); - return Py_BuildValue("d", fps); - } else if(!strcmp(a, "version")) { - int version = swf->swf.fileVersion;; - mylog(" %08x(%d) swf_getattr %s = %d\n", (int)self, self->ob_refcnt, a, version); - return Py_BuildValue("i", version); - } else if(!strcmp(a, "name")) { - char*filename = swf->filename; - mylog(" %08x(%d) swf_getattr %s = %s\n", (int)self, self->ob_refcnt, a, filename); - return Py_BuildValue("s", filename); - } else if(!strcmp(a, "bbox")) { - return f_BBox2(swf->swf.movieSize); - } else if(!strcmp(a, "tags")) { - PyObject*ret = (PyObject*)(swf->taglist); - Py_INCREF(ret); - mylog(" %08x(%d) swf_getattr %s = %08x(%d)\n", (int)self, self->ob_refcnt, a, ret, ret->ob_refcnt); - return ret; - } else if(!strcmp(a, "filesize")) { - int s = swf->swf.fileSize; - return Py_BuildValue("i", s); - } else if(!strcmp(a, "width")) { - int w = (swf->swf.movieSize.xmax - swf->swf.movieSize.xmin) / 20; - return Py_BuildValue("i", w); - } else if(!strcmp(a, "height")) { - int h = (swf->swf.movieSize.ymax - swf->swf.movieSize.ymin) / 20; - return Py_BuildValue("i", h); - } else if(!strcmp(a, "framecount")) { - int f = swf->swf.frameCount; - return Py_BuildValue("i", f); - } - - ret = Py_FindMethod(swf_functions, self, a); - mylog(" %08x(%d) swf_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); - return ret; -} -//---------------------------------------------------------------------------- -static int swf_setattr(PyObject * self, char* a, PyObject * o) -{ - SWFObject*swf = (SWFObject*)self; - if(!strcmp(a, "fps")) { - double fps; - if (!PyArg_Parse(o, "d", &fps)) - goto err; - swf->swf.frameRate = (int)(fps*0x100); - mylog(" %08x(%d) swf_setattr %s = %f\n", (int)self, self->ob_refcnt, a, fps); - return 0; - } else if(!strcmp(a, "version")) { - int version; - if (!PyArg_Parse(o, "i", &version)) - goto err; - swf->swf.fileVersion = version; - mylog(" %08x(%d) swf_setattr %s = %d\n", (int)self, self->ob_refcnt, a, version); - return 0; - } else if(!strcmp(a, "name")) { - char*filename; - if (!PyArg_Parse(o, "s", &filename)) - goto err; - if(swf->filename) { - free(swf->filename);swf->filename=0; - } - swf->filename = strdup(filename); - mylog(" %08x(%d) swf_setattr %s = %s\n", (int)self, self->ob_refcnt, a, filename); - return 0; - } else if(!strcmp(a, "bbox")) { - PyObject *obbox = o; - if (!PY_CHECK_TYPE(obbox, &BBoxClass)) { - obbox = f_BBox(0, o, 0); - if(!obbox) - return 1; - } - SRECT bbox = bbox_getSRECT(obbox); - - swf->swf.movieSize = bbox; - mylog(" %08x(%d) swf_setattr %s = (%d,%d,%d,%d)\n", (int)self, self->ob_refcnt, a, bbox.xmin,bbox.ymin,bbox.xmax,bbox.ymax); - return 0; - } else if(!strcmp(a, "tags")) { - PyObject* taglist; - taglist = o; - PY_ASSERT_TYPE(taglist,&TagListClass); - Py_DECREF(swf->taglist); - swf->taglist = taglist; - Py_INCREF(swf->taglist); - mylog(" %08x(%d) swf_setattr %s = %08x\n", (int)self, self->ob_refcnt, a, swf->taglist); - return 0; - } -err: - mylog(" %08x(%d) swf_setattr %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o); - return 1; -} - -//---------------------------------------------------------------------------- -static PyTypeObject SWFClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "SWF", - tp_basicsize: sizeof(SWFObject), - tp_itemsize: 0, - tp_dealloc: swf_dealloc, - tp_print: swf_print, - tp_getattr: swf_getattr, - tp_setattr: swf_setattr, -}; -//---------------------------------------------------------------------------- - -static PyMethodDef SWFMethods[] = -{ - /* SWF creation*/ - {"load", (PyCFunction)f_load, METH_KEYWORDS, "Load a SWF from disc."}, - {"create", (PyCFunction)f_create, METH_KEYWORDS, "Create a new SWF from scratch."}, - {0,0,0,0} - // save is a member function -}; -PyMethodDef* swf_getMethods() -{ - SWFClass.ob_type = &PyType_Type; - return SWFMethods; -} - -// ============================================================================= - -#include "primitives.h" -#include "action.h" -#include "tag.h" -#include "taglist.h" - -static PyObject* module_verbose(PyObject* self, PyObject* args, PyObject* kwargs) -{ - int _verbose = 0; - static char *kwlist[] = {"verbosity", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &_verbose)) - return NULL; - setVerbosity(_verbose); - - return Py_BuildValue("s", 0); -} - -static PyMethodDef LoggingMethods[] = -{ - /* Module functions */ - {"verbose", (PyCFunction)module_verbose, METH_KEYWORDS, "Set the module verbosity"}, - {0,0,0,0} -}; - -void initSWF(void) -{ - PyObject*module; - PyMethodDef* primitive_methods = primitive_getMethods(); - PyMethodDef* tag_methods = tags_getMethods(); - PyMethodDef* action_methods = action_getMethods(); - PyMethodDef* swf_methods = swf_getMethods(); - - PyMethodDef* all_methods = 0; - all_methods = addMethods(all_methods, primitive_methods); - all_methods = addMethods(all_methods, tag_methods); - all_methods = addMethods(all_methods, action_methods); - all_methods = addMethods(all_methods, swf_methods); - - all_methods = addMethods(all_methods, LoggingMethods); - - module = Py_InitModule("SWF", all_methods); - - /* Python doesn't copy the PyMethodDef struct, so we need - to keep it around */ - // free(all_methods) -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/action.c b/fluidbook/tools/swftools-special-swfdump/lib/python/action.c deleted file mode 100644 index 7ef6c9cef..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/action.c +++ /dev/null @@ -1,115 +0,0 @@ -/* action.c - - Python wrapper for librfxswf- actionscript stuff - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#undef HAVE_STAT -#include "../rfxswf.h" -#include "../log.h" -#include "./pyutils.h" -#include "action.h" - - -typedef struct { - PyObject_HEAD - ActionTAG*action; -} ActionObject; - -PyObject* f_Action(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"code", NULL}; - ActionObject* action; - char*code = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &code)) - return NULL; - action = PyObject_New(ActionObject, &ActionClass); - action->action = 0; - return (PyObject*)action; -} -static PyObject* action_getattr(PyObject * self, char* a) -{ - ActionObject*action = (ActionObject*)self; -/* if(!strcmp(a, "r")) { - return Py_BuildValue("r", action->rgba.r); - } else if(!strcmp(a, "g")) { - return Py_BuildValue("g", action->rgba.g); - } else if(!strcmp(a, "b")) { - return Py_BuildValue("b", action->rgba.b); - } else if(!strcmp(a, "a")) { - return Py_BuildValue("a", action->rgba.a); - }*/ - return NULL; -} -static int action_setattr(PyObject * self, char* attr, PyObject* o) -{ - ActionObject*action = (ActionObject*)self; -/* if(!strcmp(attr, "r")) { - if (!PyArg_Parse(o, "d", &action->rgba.r)) goto err; - return 0; - } else if(!strcmp(attr, "g")) { - if (!PyArg_Parse(o, "d", &action->rgba.g)) goto err; - return 0; - } else if(!strcmp(attr, "b")) { - if (!PyArg_Parse(o, "d", &action->rgba.b)) goto err; - return 0; - } else if(!strcmp(attr, "a")) { - if (!PyArg_Parse(o, "d", &action->rgba.a)) goto err; - return 0; - } -err: - mylog("swf_setattr %08x(%d) %s = ? (%08x)\n", (int)self, self->ob_refcnt, attr, o);*/ - return 1; -} - -ActionTAG* action_getAction(PyObject*self) -{ - ActionObject*action= 0; - if (!PyArg_Parse(self, "O!", &ActionClass, &action)) { - return 0; - } - return action->action; -} - -PyTypeObject ActionClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "Action", - tp_basicsize: sizeof(ActionObject), - tp_itemsize: 0, - tp_dealloc: dummy_dealloc, - tp_print: 0, - tp_getattr: action_getattr, - tp_setattr: action_setattr, -}; - -static PyMethodDef action_methods[] = -{ - {"Action", (PyCFunction)f_Action, METH_KEYWORDS, "Create a new action object."}, - {NULL, NULL, 0, NULL} -}; - -PyMethodDef* action_getMethods() -{ - ActionClass.ob_type = &PyType_Type; - return action_methods; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/action.h b/fluidbook/tools/swftools-special-swfdump/lib/python/action.h deleted file mode 100644 index 22637a95e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/action.h +++ /dev/null @@ -1,35 +0,0 @@ -/* action.h - - Python wrapper for librfxswf- actionscript stuff (header) - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __action_h__ -#define __action_h__ - -#include -#undef HAVE_STAT -#include "../rfxswf.h" - -extern PyTypeObject ActionClass; -PyObject* f_Action(PyObject* self, PyObject* args, PyObject* kwargs); -ActionTAG* action_getAction(PyObject* self); - -PyMethodDef* action_getMethods(); -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/gfx.c b/fluidbook/tools/swftools-special-swfdump/lib/python/gfx.c deleted file mode 100644 index b0ce8f325..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/gfx.c +++ /dev/null @@ -1,2016 +0,0 @@ -/* gfx.c - - Python wrapper for gfx convert - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#undef HAVE_STAT -#include "../../config.h" -#include "../gfxtools.h" -#include "../devices/swf.h" -#include "../devices/render.h" -#include "../devices/ocr.h" -#include "../devices/rescale.h" -#include "../devices/text.h" -#ifdef USE_OPENGL -#include "../devices/opengl.h" -#endif -#include "../pdf/pdf.h" -#include "../readers/swf.h" -#include "../readers/image.h" -#include "../log.h" -#include "../kdtree.h" -#include "../utf8.h" -#include "../gfxdevice.h" -#include "../gfximage.h" - -#if PY_MAJOR_VERSION >= 3 -#define PYTHON3 -#define M_FLAGS (METH_VARARGS|METH_KEYWORDS) -#else -#define M_FLAGS (METH_KEYWORDS) -#endif - -typedef struct _state { - gfxsource_t*pdfdriver; - gfxsource_t*swfdriver; - gfxsource_t*imagedriver; -} state_t; - -#ifdef PYTHON3 -#define STATE(m) ((state_t*)PyModule_GetState(m)) -#else -static state_t global_state = {0,0,0}; -#define STATE(m) &global_state; -#endif - - -static PyTypeObject OutputClass; -static PyTypeObject PageClass; -static PyTypeObject DocClass; -static PyTypeObject FontClass; -static PyTypeObject GlyphClass; -static PyTypeObject CharClass; -static PyTypeObject KDTreeClass; -static PyTypeObject BitmapClass; - -typedef struct { - PyObject_HEAD - gfxdevice_t*output_device; - PyObject*pyobj; //only for passthrough -} OutputObject; - -typedef struct { - PyObject_HEAD - PyObject*parent; - gfxpage_t*page; - int nr; -} PageObject; - -typedef struct { - PyObject_HEAD - gfxdocument_t*doc; - char*filename; - int page_pos; -} DocObject; - -typedef struct { - PyObject_HEAD - gfxfont_t*gfxfont; -} FontObject; - -typedef struct { - PyObject_HEAD - FontObject*font; - int nr; -} GlyphObject; - -typedef struct { - PyObject_HEAD - FontObject*font; - int nr; - gfxmatrix_t matrix; - int size; - gfxcolor_t color; -} CharObject; - -typedef struct { - PyObject_HEAD - kdtree_t*kdtree; -} KDTreeObject; - -typedef struct { - PyObject_HEAD - gfximage_t*image; -} BitmapObject; - -static char* strf(char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - return strdup(buf); -} -static inline PyObject*pystring_fromstring(const char*s) -{ -#ifdef PYTHON3 - return PyUnicode_FromString(s); -#else - return PyString_FromString(s); -#endif -} -static inline int pystring_check(PyObject*o) -{ -#ifdef PYTHON3 - return PyUnicode_Check(o); -#else - return PyString_Check(o); -#endif -} -static inline PyObject*pyint_fromlong(long l) -{ -#ifdef PYTHON3 - return PyLong_FromLong(l); -#else - return PyInt_FromLong(l); -#endif -} -static inline const char*pystring_asstring(PyObject*s) -{ -#ifdef PYTHON3 - return PyUnicode_AS_DATA(s); -#else - return PyString_AsString(s); -#endif -} -PyObject*forward_getattr(PyObject*self, char *a) -{ - PyObject*o = pystring_fromstring(a); - PyObject*ret = PyObject_GenericGetAttr(self, o); - Py_DECREF(o); - return ret; -} - -#define PY_ERROR(s,args...) (PyErr_SetString(PyExc_Exception, strf(s, ## args)),(void*)NULL) -#define PY_NONE Py_BuildValue("s", 0) - -//--------------------------------------------------------------------- -PyDoc_STRVAR(output_save_doc, \ -"save(filename)\n\n" -"Saves the contents of an output device to a file\n" -"Depending on what the output device is, the contents\n" -"of the file may be plain text, an image, an SWF file,\n" -"etc.\n" -"For the ImageList device, several files (named\n" -"filename.1.png, filename.2.png etc.) might be created)\n" -); -static PyObject* output_save(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - OutputObject* self = (OutputObject*)_self; - char*filename = 0; - static char *kwlist[] = {"filename", NULL}; - int ret; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename)) - return NULL; - - Py_BEGIN_ALLOW_THREADS - gfxresult_t*result = self->output_device->finish(self->output_device); - self->output_device = 0; - ret = result->save(result, filename); - result->destroy(result); - Py_END_ALLOW_THREADS - if(ret < 0) { - return PY_ERROR("Couldn't write to %s", filename); - } - return PY_NONE; -} - -PyDoc_STRVAR(output_startpage_doc, \ -"startpage(width, height)\n\n" -"Starts a new page/frame in the output device.\n" -"The usual way to render documents is to start a new page in the\n" -"device for each page in the document:\n" -"\n" -"for pagenr in range(1,doc.pages+1):\n" -" page = doc.getPage(pagenr)\n" -" output.startpage(page.width, page.height)\n" -" page.render(output)\n" -" output.endpage()\n" -"\n" -"It is, however, also possible to render more than one document page\n" -"to a single output page. E.g. for side-by-side or book views.\n" -); -static PyObject* output_startpage(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - OutputObject* self = (OutputObject*)_self; - int width=0, height=0; - if (!PyArg_ParseTuple(args, "ii", &width, &height)) - return NULL; - Py_BEGIN_ALLOW_THREADS - self->output_device->startpage(self->output_device, width, height); - Py_END_ALLOW_THREADS - return PY_NONE; -} - -/* as the definition of the python image type comes from another module (not - included here, reproduce the necessary structure and extract the image - without using the type definition */ -typedef struct { - PyObject_HEAD - gfximage_t*image; - PyObject* strrepr; -} ImageObject; -static gfximage_t*toImage(PyObject*_bitmap) -{ - if(!_bitmap || !_bitmap->ob_type->tp_name || strcmp(_bitmap->ob_type->tp_name, "Image")) { - PY_ERROR("Second argument to fillbitmap must be an image"); - return 0; - } - ImageObject*bitmap = (ImageObject*)_bitmap; - return bitmap->image; -} - -static gfxline_t*toLine(PyObject*_line) -{ - int t; - int num = PyList_Size(_line); - gfxline_t first; - first.next = 0; - gfxline_t*last=&first; - for(t=0;tnext = l; - last = l; - if(type[0]=='m') { - l->type = gfx_moveTo; - if(size!=3) - return PY_ERROR("need 2 values for move"); - l->x = PyFloat_AsDouble(PyTuple_GetItem(p, 1)); - l->y = PyFloat_AsDouble(PyTuple_GetItem(p, 2)); - } else if(type[0]=='l') { - l->type = gfx_lineTo; - if(size!=3) - return PY_ERROR("need 2 values for line"); - l->x = PyFloat_AsDouble(PyTuple_GetItem(p, 1)); - l->y = PyFloat_AsDouble(PyTuple_GetItem(p, 2)); - } else if(type[0]=='s') { - l->type = gfx_splineTo; - if(size!=5) - return PY_ERROR("need 4 values for spline"); - l->x = PyFloat_AsDouble(PyTuple_GetItem(p, 1)); - l->y = PyFloat_AsDouble(PyTuple_GetItem(p, 2)); - l->sx = PyFloat_AsDouble(PyTuple_GetItem(p, 3)); - l->sy = PyFloat_AsDouble(PyTuple_GetItem(p, 4)); - } else { - return PY_ERROR("Unknown line code '%s'", type); - } - } - return first.next; -} - -PyDoc_STRVAR(output_fillbitmap_doc, \ -"fillbitmap()\n\n" -"fill a polygon with a bitmap pattern\n" -); -static PyObject* output_fillbitmap(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - OutputObject* self = (OutputObject*)_self; - PyObject*_line=0; - PyObject*_bitmap=0; - static char *kwlist[] = {"line", "bitmap", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O", kwlist, &PyList_Type, &_line, &_bitmap)) - return NULL; - - gfximage_t*image = toImage(_bitmap); - if(!image) - return PY_ERROR("invalid image"); - - gfxline_t*line = toLine(_line); - if(!line) - return 0; - - /* TODO */ - gfxmatrix_t m; - memset(&m, 0, sizeof(gfxmatrix_t)); - m.m00 = m.m11 = 1.0; - - self->output_device->fillbitmap(self->output_device, line, image, &m, 0); - gfxline_free(line); - return PY_NONE; -} - -PyDoc_STRVAR(output_fill_doc, \ -"fill()\n\n" -"fill a polygon with a color\n" -); -static PyObject* output_fill(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - OutputObject* self = (OutputObject*)_self; - PyObject*_line=0; - PyObject*_bitmap=0; - static char *kwlist[] = {"line", "color", NULL}; - - PyObject* color=0; - - int a=255,r=0,g=0,b=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O", kwlist, &PyList_Type, &_line, &color)) - return NULL; - - if(!PyArg_ParseTuple(color, "iiii:color", &a, &r, &g, &b)) { - return NULL; - } - - gfxcolor_t c; - c.r = r; c.g = g; c.b = b; c.a = a; - - gfxline_t*line = toLine(_line); - if(!line) - return 0; - - /* TODO */ - gfxmatrix_t m; - memset(&m, 0, sizeof(gfxmatrix_t)); - m.m00 = m.m11 = 1.0; - - self->output_device->fill(self->output_device, line, &c); - gfxline_free(line); - return PY_NONE; -} - -PyDoc_STRVAR(output_stroke_doc, \ -"stroke()\n\n" -"stroke a polygon with a color\n" -); -static PyObject* output_stroke(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - OutputObject* self = (OutputObject*)_self; - PyObject*_line=0; - PyObject*_bitmap=0; - static char *kwlist[] = {"line", "width", "color", NULL}; - - PyObject* color=0; - - int a=255,r=0,g=0,b=0; - float width = 1.0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!fO", kwlist, &PyList_Type, &_line, &width, &color)) - return NULL; - - if(!PyArg_ParseTuple(color, "iiii:color", &a, &r, &g, &b)) { - return NULL; - } - - gfxcolor_t c; - c.r = r; c.g = g; c.b = b; c.a = a; - - gfxline_t*line = toLine(_line); - if(!line) - return 0; - - self->output_device->stroke(self->output_device, line, width, &c, - /*TODO*/ gfx_capRound, gfx_joinRound, 0.0); - gfxline_free(line); - return PY_NONE; -} - -PyDoc_STRVAR(output_endpage_doc, \ -"endpage()\n\n" -"Ends a page in the output device. This function should be called\n" -"once for every startpage()\n" -); -static PyObject* output_endpage(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - OutputObject* self = (OutputObject*)_self; - if (!PyArg_ParseTuple(args, "")) - return NULL; - Py_BEGIN_ALLOW_THREADS - self->output_device->endpage(self->output_device); - Py_END_ALLOW_THREADS - return PY_NONE; -} -PyDoc_STRVAR(output_setparameter_doc, \ -"setparameter(key, value)\n\n" -"Set a output-device dependent parameter" -); -static PyObject* output_setparameter(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - OutputObject* self = (OutputObject*)_self; - static char *kwlist[] = {"key", "value", NULL}; - char*key=0,*value=0; - if (args && !PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key, &value)) - return NULL; - self->output_device->setparameter(self->output_device, key, value); - return PY_NONE; -} -PyDoc_STRVAR(f_createSWF_doc, \ -"SWF()\n\n" -"Creates a device which renders documents to SWF (Flash) files.\n" -"Depending on the way the document parser behaves (see the poly2bitmap\n" -"and bitmap parameters), the resulting SWF might use vector operations\n" -"and Flash Texts to display the document, or just a single bitmap.\n" -); -static PyObject* f_createSWF(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {NULL}; - if (args && !PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) - return NULL; - OutputObject*self = PyObject_New(OutputObject, &OutputClass); - - self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_swf_init(self->output_device); - return (PyObject*)self; -} - -PyDoc_STRVAR(f_createOCR_doc, \ -"OCR()\n\n" -"Creates a device which processes documents using OCR (optical\n" -"character recognition).\n" -"This is handy for e.g. extracting fulltext from PDF documents\n" -"which have broken fonts, and where hence the \"PlainText\"\n" -"device doesn't work.\n" -); -static PyObject* f_createOCR(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {NULL}; - if (args && !PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) - return NULL; - OutputObject*self = PyObject_New(OutputObject, &OutputClass); - - self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_ocr_init(self->output_device); - return (PyObject*)self; -} - - -PyDoc_STRVAR(f_createImageList_doc, \ -"ImageList()\n\n" -"Creates a device which renders documents to bitmaps.\n" -"Each page that is rendered will create new bitmap.\n" -"Using save(), you can save the images to a number\n" -"of files\n" -); -static PyObject* f_createImageList(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) - return NULL; - OutputObject*self = PyObject_New(OutputObject, &OutputClass); - - self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_render_init(self->output_device); - return (PyObject*)self; -} - -PyDoc_STRVAR(f_createPlainText_doc, \ -"PlainText()\n\n" -"Creates a device which can be used to extract text from documents,\n" -"by passing it as parameter to page.render().\n" -"The extracted text can be saved by plaintext.save(filename).\n" -); -static PyObject* f_createPlainText(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) - return NULL; - OutputObject*self = PyObject_New(OutputObject, &OutputClass); - - self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_text_init(self->output_device); - return (PyObject*)self; -} - -#ifdef USE_OPENGL -PyDoc_STRVAR(f_createOpenGL_doc, \ -"OpenGL()\n\n" -"Creates a device which renders everything to OpenGL.\n" -"Can be used for desktop display and debugging.\n" -"This device is not available on all systems.\n" -); -static PyObject* f_createOpenGL(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) - return NULL; - OutputObject*self = PyObject_New(OutputObject, &OutputClass); - - self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_opengl_init(self->output_device); - return (PyObject*)self; -} -#endif - -static jmp_buf backjump; -static int has_backjump = 0; - -static PyObject* convert_gfxline(gfxline_t*line) -{ - gfxline_t*l; - int len = 0, i = 0; - l = line; - while(l) {l=l->next;len++;} - PyObject*list = PyList_New(len); - l = line; - while(l) { - PyObject*point=0; - if(l->type == gfx_moveTo) { - point = PyTuple_New(3); - PyTuple_SetItem(point, 0, pystring_fromstring("m")); - PyTuple_SetItem(point, 1, PyFloat_FromDouble(l->x)); - PyTuple_SetItem(point, 2, PyFloat_FromDouble(l->y)); - } else if(l->type == gfx_lineTo) { - point = PyTuple_New(3); - PyTuple_SetItem(point, 0, pystring_fromstring("l")); - PyTuple_SetItem(point, 1, PyFloat_FromDouble(l->x)); - PyTuple_SetItem(point, 2, PyFloat_FromDouble(l->y)); - } else if(l->type == gfx_splineTo) { - point = PyTuple_New(5); - PyTuple_SetItem(point, 0, pystring_fromstring("s")); - PyTuple_SetItem(point, 1, PyFloat_FromDouble(l->x)); - PyTuple_SetItem(point, 2, PyFloat_FromDouble(l->y)); - PyTuple_SetItem(point, 3, PyFloat_FromDouble(l->sx)); - PyTuple_SetItem(point, 4, PyFloat_FromDouble(l->sy)); - } else { - point = PY_NONE; - } - PyList_SetItem(list, i, point); - l = l->next; - i++; - } - return list; -} -static PyObject* convert_matrix(gfxmatrix_t*m) -{ - PyObject*columns = PyTuple_New(3); - PyObject*column0 = PyTuple_New(2); - PyTuple_SetItem(column0, 0, PyFloat_FromDouble(m->m00)); - PyTuple_SetItem(column0, 1, PyFloat_FromDouble(m->m10)); - PyTuple_SetItem(columns, 0, column0); - PyObject*column1 = PyTuple_New(2); - PyTuple_SetItem(column1, 0, PyFloat_FromDouble(m->m01)); - PyTuple_SetItem(column1, 1, PyFloat_FromDouble(m->m11)); - PyTuple_SetItem(columns, 1, column1); - PyObject*column2 = PyTuple_New(2); - PyTuple_SetItem(column2, 0, PyFloat_FromDouble(m->tx)); - PyTuple_SetItem(column2, 1, PyFloat_FromDouble(m->ty)); - PyTuple_SetItem(columns, 2, column2); - return columns; -} -static PyObject* convert_color(gfxcolor_t*col) -{ - PyObject*obj = PyTuple_New(4); - PyTuple_SetItem(obj, 0, pyint_fromlong(col->a)); - PyTuple_SetItem(obj, 1, pyint_fromlong(col->r)); - PyTuple_SetItem(obj, 2, pyint_fromlong(col->g)); - PyTuple_SetItem(obj, 3, pyint_fromlong(col->b)); - return obj; -} - -static PyObject* lookup_font(gfxfont_t*font); -static PyObject* char_new(gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix); -static PyObject* create_bitmap(gfximage_t*img); - -static gfxfontlist_t* global_fonts; -static char callback_python(char*function, gfxdevice_t*dev, const char*format, ...) -{ - OutputObject*self = (OutputObject*)dev->internal; - - if(!PyObject_HasAttrString(self->pyobj, function)) - return 0; - - va_list ap; - va_start(ap, format); - - PyObject*tuple = PyTuple_New(strlen(format)); - int pos = 0; - while(format[pos]) { - char p = format[pos]; - PyObject*obj = 0; - switch(p) { - case 's': { - char*s = va_arg(ap, char*); - obj = pystring_fromstring(s); - break; - } - case 'i': { - int i = va_arg(ap, int); - obj = pyint_fromlong(i); - break; - } - case 'd': { - int i = va_arg(ap, double); - obj = PyFloat_FromDouble(i); - break; - } - case 'c': { - void* ptr = va_arg(ap, void*); - gfxcolor_t*col = (gfxcolor_t*)ptr; - obj = convert_color(col); - break; - } - case 'f': { - void* ptr = va_arg(ap, void*); - obj = lookup_font((gfxfont_t*)ptr); - break; - } - case 'l': { - void* ptr = va_arg(ap, void*); - gfxline_t*line = (gfxline_t*)ptr; - obj = convert_gfxline(line); - break; - } - case 'I': { - void* ptr = va_arg(ap, void*); - obj = create_bitmap((gfximage_t*)ptr); - break; - } - case 'O': { - void* ptr = va_arg(ap, void*); - obj = (PyObject*)ptr; - break; - } - case 'm': { - void* ptr = va_arg(ap, void*); - obj = convert_matrix((gfxmatrix_t*)ptr); - break; - } - default: { - obj = PY_NONE; - break; - } - } - PyTuple_SetItem(tuple, pos, obj); - pos++; - } - va_end(ap); - PyObject*f = PyObject_GetAttrString(self->pyobj, function); - if(!f) - return 0; - PyErr_Clear(); - PyObject* result = PyObject_CallObject(f, tuple); - Py_DECREF(tuple); - - if(!result) { - if(!has_backjump) { - PyErr_Print(); - PyErr_Clear(); - return 1; - } else { - longjmp(backjump, 1); - } - } else { - Py_DECREF(result); - return 1; - } -} - -static int my_setparameter(gfxdevice_t*dev, const char*key, const char*value) -{ - callback_python("setparameter", dev, "ss", key, value); - return 1; -} -static void my_startpage(gfxdevice_t*dev, int width, int height) -{ - callback_python("startpage", dev, "ii", width, height); -} -static void my_startclip(gfxdevice_t*dev, gfxline_t*line) -{ - callback_python("startclip", dev, "l", line); -} -static void my_endclip(gfxdevice_t*dev) -{ - callback_python("endclip", dev, ""); -} -static void my_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - char*cap = 0; - char*joint = 0; - if(cap_style == gfx_capButt) - cap = "butt"; - else if(cap_style == gfx_capRound) - cap = "round"; - else if(cap_style == gfx_capSquare) - cap = "square"; - if(joint_style == gfx_joinMiter) - joint = "miter"; - else if(joint_style == gfx_joinRound) - joint = "round"; - else if(joint_style == gfx_joinBevel) - joint = "bevel"; - callback_python("stroke", dev, "ldcssi", line, width, color, cap, joint, miterLimit); -} -static void my_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) -{ - callback_python("fill", dev, "lc", line, color); -} -static void my_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*imgcoord2devcoord, gfxcxform_t*cxform) -{ - callback_python("fillbitmap", dev, "lImx", line, img, imgcoord2devcoord, cxform); -} -static void my_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - callback_python("fillgradient", dev, "lgsm", line, gradient, type, matrix); -} -static void my_addfont(gfxdevice_t*dev, gfxfont_t*font) -{ - callback_python("addfont", dev, "f", font); -} -static void my_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - PyMethodObject*obj = (PyMethodObject*)PyObject_GetAttrString(((OutputObject*)(dev->internal))->pyobj, "drawchar"); - if(!obj) { - /* if the device doesn't support chars, try drawing a polygon instead */ - if(!font) - return; - gfxglyph_t*glyph = &font->glyphs[glyphnr]; - gfxline_t*line2 = gfxline_clone(glyph->line); - gfxline_transform(line2, matrix); - my_fill(dev, line2, color); - gfxline_free(line2); - return; - } - PyFunctionObject*f = (PyFunctionObject*)obj->im_func; - PyCodeObject*c = (PyCodeObject*)f->func_code; - if(c->co_argcount == 2) { - /* new style drawchar method */ - CharObject*chr = (CharObject*)char_new(font, glyphnr, color, matrix); - callback_python("drawchar", dev, "O", chr); - } else { - callback_python("drawchar", dev, "ficm", font, glyphnr, color, matrix); - } -} -static void my_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action, const char*text) -{ - callback_python("drawlink", dev, "lss", line, action, text); -} -static void my_endpage(gfxdevice_t*dev) -{ - callback_python("endpage", dev, ""); -} -static gfxresult_t* my_finish(gfxdevice_t*dev) -{ - callback_python("finish", dev, ""); - return 0; -} - -PyObject* passthrough_create(PyObject*obj) -{ - OutputObject*self = PyObject_New(OutputObject, &OutputClass); - self->pyobj = obj; - Py_INCREF(obj); - self->output_device = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - memset(self->output_device, 0, sizeof(gfxdevice_t)); - self->output_device->name = strdup("passthrough"); - - self->output_device->setparameter = my_setparameter; - self->output_device->startpage = my_startpage; - self->output_device->startclip = my_startclip; - self->output_device->addfont = my_addfont; - self->output_device->endclip = my_endclip; - self->output_device->stroke = my_stroke; - self->output_device->fill = my_fill; - self->output_device->fillbitmap = my_fillbitmap; - self->output_device->fillgradient = my_fillgradient; - self->output_device->drawchar = my_drawchar; - self->output_device->drawlink = my_drawlink; - self->output_device->endpage = my_endpage; - self->output_device->finish = my_finish; - self->output_device->internal = self; - - return (PyObject*)self; -} - -PyDoc_STRVAR(f_createPassThrough_doc, \ -"PassThrough(device)\n\n" -"Creates a PassThrough device, which can be used as parameter in calls\n" -"to page.render().\n" -"device needs to be a class implementing at least the following functions:\n\n" -"setparameter(key,value)\n" -"startclip(outline)\n" -"endclip()\n" -"stroke(outline, width, color, capstyle, jointstyle, miterLimit)\n" -"fill(outline, color)\n" -"fillbitmap(outline, image, matrix, colortransform)\n" -"fillgradient(outline, gradient, gradienttype, matrix)\n" -"addfont(font)\n" -"drawchar(font, glyph, color, matrix)\n" -"drawlink(outline, url)\n" -"If any of these functions are not defined, a error message will be printed,\n" -"however the rendering process will *not* be aborted.\n" -); -static PyObject* f_createPassThrough(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"device", NULL}; - PyObject*obj; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &obj)) - return NULL; - return passthrough_create(obj); -} - -static PyMethodDef output_methods[] = -{ - /* Output functions */ - {"save", (PyCFunction)output_save, M_FLAGS, output_save_doc}, - {"startpage", (PyCFunction)output_startpage, M_FLAGS, output_startpage_doc}, - {"fill", (PyCFunction)output_fill, M_FLAGS, output_fill_doc}, - {"fillbitmap", (PyCFunction)output_fillbitmap, M_FLAGS, output_fillbitmap_doc}, - {"stroke", (PyCFunction)output_stroke, M_FLAGS, output_stroke_doc}, - {"endpage", (PyCFunction)output_endpage, M_FLAGS, output_endpage_doc}, - {"setparameter", (PyCFunction)output_setparameter, M_FLAGS, output_setparameter_doc}, - {0,0,0,0} -}; - -static void output_dealloc(PyObject* _self) { - OutputObject* self = (OutputObject*)_self; - - if(self->output_device) { - gfxresult_t*result = self->output_device->finish(self->output_device); - if(result) { - result->destroy(result);result=0; - } - self->output_device = 0; - } - - PyObject_Del(self); -} -static PyObject* output_getattr(PyObject * _self, char* a) -{ - OutputObject*self = (OutputObject*)_self; - -/* if(!strcmp(a, "x1")) { - return pyint_fromlong(self->output_device->x1); - } else if(!strcmp(a, "y1")) { - return pyint_fromlong(self->output_device->y1); - } else if(!strcmp(a, "x2")) { - return pyint_fromlong(self->output_device->x2); - } else if(!strcmp(a, "y2")) { - return pyint_fromlong(self->output_device->y2); - }*/ - - return forward_getattr(_self, a); -} -static int output_setattr(PyObject * _self, char* a, PyObject * o) -{ - OutputObject*self = (OutputObject*)_self; - if(!pystring_check(o)) - return -1; - const char*value = pystring_asstring(o); - self->output_device->setparameter(self->output_device, a, value); - return -1; -} -static int output_print(PyObject * _self, FILE *fi, int flags) -{ - OutputObject*self = (OutputObject*)_self; - fprintf(fi, "", _self, _self?_self->ob_refcnt:0); - return 0; -} - -//--------------------------------------------------------------------- -static PyMethodDef glyph_methods[]; - -static void glyph_dealloc(PyObject* _self) { - GlyphObject* self = (GlyphObject*)_self; - Py_DECREF(self->font); - PyObject_Del(self); -} -static PyObject* glyph_getattr(PyObject * _self, char* a) -{ - GlyphObject*self = (GlyphObject*)_self; - FontObject*font = self->font; - if(!strcmp(a, "unicode")) { - return pyint_fromlong(font->gfxfont->glyphs[self->nr].unicode); - } else if(!strcmp(a, "advance")) { - return PyFloat_FromDouble(font->gfxfont->glyphs[self->nr].advance); - } else if(!strcmp(a, "polygon")) { - return convert_gfxline(font->gfxfont->glyphs[self->nr].line); - } - return forward_getattr(_self, a); -} -static int glyph_setattr(PyObject * self, char* a, PyObject * o) { - return -1; -} -static PyObject* glyph_new(FontObject*font, int nr) { - GlyphObject*glyph = PyObject_New(GlyphObject, &GlyphClass); - glyph->font = font; - Py_INCREF(glyph->font); - glyph->nr = nr; - return (PyObject*)glyph; -} -static int glyph_print(PyObject * _self, FILE *fi, int flags) -{ - GlyphObject*self = (GlyphObject*)_self; - fprintf(fi, "", _self, _self?_self->ob_refcnt:0); - return 0; -} -static PyMethodDef glyph_methods[] = -{ - /* Glyph functions */ - {0,0,0,0} -}; - -//--------------------------------------------------------------------- -static PyMethodDef font_methods[]; - -static void font_dealloc(PyObject* _self) { - FontObject* self = (FontObject*)_self; - PyObject_Del(self); -} -static PyObject* font_new(gfxfont_t*gfxfont) -{ - FontObject*font = PyObject_New(FontObject, &FontClass); - font->gfxfont = gfxfont; - return (PyObject*)font; -} -static gfxfontlist_t* global_fonts = 0; - -static PyObject* lookup_font(gfxfont_t*font) -{ - PyObject*fontobj = gfxfontlist_getuserdata(global_fonts, font->id); - if(!fontobj) { - fontobj = font_new(font); - global_fonts = gfxfontlist_addfont2(global_fonts, font, fontobj); - } - Py_INCREF(fontobj); - return fontobj; -} -static PyObject* font_getattr(PyObject * _self, char* a) -{ - FontObject*self = (FontObject*)_self; - if(!strcmp(a, "num_glyphs")) { - return pyint_fromlong(self->gfxfont->num_glyphs); - } else if(!strcmp(a, "name")) { - return pystring_fromstring(self->gfxfont->id); - } - return forward_getattr(_self, a); -} -static int font_setattr(PyObject * self, char* a, PyObject * o) { - return -1; -} -static PyObject* font_glyph(PyObject * _self, PyObject* args, PyObject* kwargs) { - FontObject*self = (FontObject*)_self; - static char *kwlist[] = {"nr", NULL}; - static long nr = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &nr)) - return NULL; - return glyph_new(self, nr); -} -static int font_print(PyObject * _self, FILE *fi, int flags) -{ - FontObject*self = (FontObject*)_self; - fprintf(fi, "", self->gfxfont->id, _self, _self?_self->ob_refcnt:0); - return 0; -} -static PyMethodDef font_methods[] = -{ - /* Font functions */ - {"get_glyph", (PyCFunction)font_glyph, M_FLAGS, "get a glyph from this font"}, - {0,0,0,0} -}; - -//--------------------------------------------------------------------- -static PyMethodDef char_methods[]; - -static void char_dealloc(PyObject* _self) { - CharObject* self = (CharObject*)_self; - Py_DECREF(self->font); - PyObject_Del(self); -} -static PyObject* char_getattr(PyObject * _self, char* a) -{ - CharObject*self = (CharObject*)_self; - FontObject*font = self->font; - gfxglyph_t*glyph = &font->gfxfont->glyphs[self->nr]; - if(!strcmp(a, "unicode")) { - return pyint_fromlong(glyph->unicode); - } else if(!strcmp(a, "advance")) { - return PyFloat_FromDouble((self->matrix.m00 * glyph->advance)); - } else if(!strcmp(a, "matrix")) { - return convert_matrix(&self->matrix); - } else if(!strcmp(a, "color")) { - return convert_color(&self->color); - } else if(!strcmp(a, "size")) { - return pyint_fromlong(self->size); - } else if(!strcmp(a, "glyph")) { - return glyph_new(font, self->nr); - } else if(!strcmp(a, "font")) { - Py_INCREF(font); - return (PyObject*)font; - } else if(!strcmp(a, "x")) { - int x = self->matrix.tx; - return pyint_fromlong(x); - } else if(!strcmp(a, "y")) { - int y = self->matrix.ty; - return pyint_fromlong(y); - } - - int lsb = 0; //left side bearing - int x1 = self->matrix.tx - (self->matrix.m00) * lsb; - int y1 = self->matrix.ty - (-self->matrix.m11) * font->gfxfont->ascent; - int x2 = self->matrix.tx + (self->matrix.m00) * font->gfxfont->glyphs[self->nr].advance; - int y2 = self->matrix.ty + (-self->matrix.m11) * font->gfxfont->descent; - if(!strcmp(a, "bbox")) { - PyObject*bbox = PyTuple_New(4); - PyTuple_SetItem(bbox, 0, pyint_fromlong(x1)); - PyTuple_SetItem(bbox, 1, pyint_fromlong(y1)); - PyTuple_SetItem(bbox, 2, pyint_fromlong(x2)); - PyTuple_SetItem(bbox, 3, pyint_fromlong(y2)); - return bbox; - } else if(!strcmp(a, "x1")) { - return pyint_fromlong(x1); - } else if(!strcmp(a, "y1")) { - return pyint_fromlong(y1); - } else if(!strcmp(a, "x2")) { - return pyint_fromlong(x2); - } else if(!strcmp(a, "y2")) { - return pyint_fromlong(y2); - } - return forward_getattr(_self, a); -} -static int char_setattr(PyObject * self, char* a, PyObject * o) { - return -1; -} -static PyObject* char_new(gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - FontObject*fontobj = (FontObject*)lookup_font(font); - CharObject*chr = PyObject_New(CharObject, &CharClass); - chr->font = fontobj; - Py_INCREF(fontobj); - chr->nr = glyphnr; - chr->matrix = *matrix; - chr->size = ceil(1024*fabs(matrix->m00 + matrix->m10)); //horizontal size - chr->color = *color; - return (PyObject*)chr; - return 0; -} -static int char_print(PyObject * _self, FILE *fi, int flags) -{ - CharObject*self = (CharObject*)_self; - fprintf(fi, "", _self, _self?_self->ob_refcnt:0); - return 0; -} -static PyMethodDef char_methods[] = -{ - /* char functions */ - {0,0,0,0} -}; - -//--------------------------------------------------------------------- -static PyObject* page_render(PyObject* _self, PyObject* args, PyObject* kwargs); -static PyObject* page_asImage(PyObject* _self, PyObject* args, PyObject* kwargs); - -PyDoc_STRVAR(page_render_doc, \ -"render(output, move=(0,0), clip=None)\n\n" -"Renders a page to the rendering backend specified by the output\n" -"parameter. Rendering consists of calling a number of functions on the\n" -"output device, see the description of the \"PassThrough\" device.\n" -"The page may be shifted to a given position using the move parameter,\n" -"and may also be clipped to a specific size using the clip parameter.\n" -"The clipping operation is applied after the move operation.\n" -"If you don't need to specify custom page sizes or clippings, use\n" -"page.draw instead.\n" -); -static PyObject* page_render(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - PageObject* self = (PageObject*)_self; - - static char *kwlist[] = {"dev", "move", "clip", NULL}; - OutputObject*output = 0; - PyObject*move=0; - PyObject*clip=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|OO", kwlist, &OutputClass, &output, - &move,&clip - )) - return NULL; - - int x=0,y=0; - int cx1=0,cy1=0,cx2=0,cy2=0; - - if(move) { - if (!PyArg_ParseTuple(move, "ii", &x,&y)) - return NULL; - } - if(clip) { - if (!PyArg_ParseTuple(clip, "iiii", &cx1,&cy1,&cx2,&cy2)) - return NULL; - } - - Py_BEGIN_ALLOW_THREADS - if(x|y|cx1|cx2|cy1|cy2) - self->page->rendersection(self->page, output->output_device,x,y,cx1,cy1,cx2,cy2); - else - self->page->render(self->page, output->output_device); - Py_END_ALLOW_THREADS - return PY_NONE; -} - -PyDoc_STRVAR(page_draw_doc, \ -"draw(output)\n\n" -"Renders a page to the rendering backend specified by the output\n" -"parameter, with the default for page width and height.\n" -); -static PyObject* page_draw(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - PageObject* self = (PageObject*)_self; - static char *kwlist[] = {"dev", NULL}; - PyObject*output = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &output)) - return NULL; - - PyObject*passthrough = 0; - if(output->ob_type != &OutputClass) { - passthrough = passthrough_create(output); - output = passthrough; - } - gfxdevice_t*device = ((OutputObject*)passthrough)->output_device; - - if(setjmp(backjump)) { - /* exception in the code below*/ - has_backjump = 0; - //FIXME: this clear the exception, for some reason - //if(passthrough) { - // Py_DECREF(passthrough); - //} - return 0; - } - has_backjump = 1; - device->startpage(device, self->page->width, self->page->height); - self->page->render(self->page, device); - device->endpage(device); - has_backjump = 0; - - if(passthrough) { - Py_DECREF(passthrough); - } - return PY_NONE; -} - -PyDoc_STRVAR(page_asImage_doc, \ -"asImage(width, height)\n\n" -"Creates a bitmap from a page. The bitmap will be returned as a string\n" -"containing RGB triplets. The bitmap will be rescaled to the specified width and\n" -"height. The aspect ratio of width and height doesn't need to be the same\n" -"as the page.\n" -); -static PyObject* page_asImage(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - PageObject* self = (PageObject*)_self; - - static char *kwlist[] = {"width", "height", "allow_threads", NULL}; - int width=0,height=0; - int allow_threads=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii|i", kwlist, &width, &height, &allow_threads)) - return NULL; - - if(!width || !height) { - return PY_ERROR("invalid dimensions: %dx%d", width,height); - } - - PyThreadState *_save=0; - if (allow_threads) { - Py_UNBLOCK_THREADS - } - gfxdevice_t dev1,dev2; - gfxdevice_render_init(&dev1); - dev1.setparameter(&dev1, "antialise", "2"); - dev1.setparameter(&dev1, "fillwhite", "1"); - gfxdevice_rescale_init(&dev2, &dev1, width, height, 0); - dev2.startpage(&dev2, self->page->width, self->page->height); - self->page->render(self->page, &dev2); - dev2.endpage(&dev2); - gfxresult_t*result = dev2.finish(&dev2); - gfximage_t*img = (gfximage_t*)result->get(result,"page0"); - int l = img->width*img->height; - int ll = l*3; - unsigned char*data = (unsigned char*)malloc(ll); - int s,t; - for(t=0,s=0;tdata[t].r; - data[s+1] = img->data[t].g; - data[s+2] = img->data[t].b; - } - result->destroy(result); result=0; - free(img->data); free(img); - - PyObject *ret; -#ifdef PYTHON3 - ret = PyByteArray_FromStringAndSize((char*)data,ll); -#else - ret = PyString_FromStringAndSize((char*)data,ll); -#endif - free(data); - - if (allow_threads) { - Py_BLOCK_THREADS - } - return ret; -} - -static PyMethodDef page_methods[] = -{ - /* Page functions */ - {"render", (PyCFunction)page_render, M_FLAGS, page_render_doc}, - {"draw", (PyCFunction)page_draw, M_FLAGS, page_draw_doc}, - {"asImage", (PyCFunction)page_asImage, M_FLAGS, page_asImage_doc}, - {0,0,0,0} -}; -static void page_dealloc(PyObject* _self) { - PageObject* self = (PageObject*)_self; - if(self->page) { - self->page->destroy(self->page); - self->page=0; - } - if(self->parent) { - Py_DECREF(self->parent); - self->parent=0; - } - - PyObject_Del(self); -} - -static PyObject* page_getattr(PyObject * _self, char* a) -{ - PageObject*self = (PageObject*)_self; - - if(!strcmp(a, "size")) { - return Py_BuildValue("(ii)", self->page->width, self->page->height); - } if(!strcmp(a, "doc")) { - Py_INCREF(self->parent); - return self->parent; - } if(!strcmp(a, "nr")) { - return pyint_fromlong(self->nr); - } else if(!strcmp(a, "width")) { - return pyint_fromlong(self->page->width); - } else if(!strcmp(a, "height")) { - return pyint_fromlong(self->page->height); - } - return forward_getattr(_self, a); -} - -static int page_setattr(PyObject * self, char* a, PyObject * o) { - return -1; -} -static int page_print(PyObject * _self, FILE *fi, int flags) -{ - PageObject*self = (PageObject*)_self; - fprintf(fi, "", _self, _self?_self->ob_refcnt:0); - return 0; -} - -//--------------------------------------------------------------------- - -PyDoc_STRVAR(doc_getPage_doc, -"getPage(nr)\n\n" -"Get one page from a document file. The nr parameter specifies\n" -"which page to retrieve. Counting starts at 1, so the first page\n" -"can be retrieved by\n" -" page = doc.getPage(1)\n" -".\n" -"You can find out how many pages a document contains by querying\n" -"its pages field (doc.pages)\n" -); -static PyObject*page_new(DocObject*doc, int pagenr) -{ - PageObject*page = PyObject_New(PageObject, &PageClass); - page->page = doc->doc->getpage(doc->doc, pagenr); - page->nr = pagenr; - page->parent = (PyObject*)doc; - Py_INCREF(page->parent); - if(!page->page) { - PyObject_Del(page); - return PY_ERROR("Couldn't extract page %d", pagenr); - } - return (PyObject*)page; -} - -static PyObject* doc_getPage(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - DocObject* self = (DocObject*)_self; - - static char *kwlist[] = {"nr", NULL}; - int pagenr = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &pagenr)) - return NULL; - return page_new(self, pagenr); -} -static PyObject* doc_getiter(PyObject* _self) -{ - DocObject* self = (DocObject*)_self; - self->page_pos = 1; - Py_INCREF(self); - return (PyObject*)self; -} -static PyObject* doc_iternext(PyObject* _self) -{ - DocObject* self = (DocObject*)_self; - if(self->page_pos > self->doc->num_pages) { - return NULL; - } - return page_new(self, self->page_pos++); -} - - -PyDoc_STRVAR(doc_getInfo_doc, -"getInfo(key)\n\n" -"Retrieve some information about a document. For PDF files, key\n" -"can have the following values:\n\n" -"\"title\", \"subject\", \"keywords\", \"author\", \"creator\", \"producer\",\n" -"\"creationdate\", \"moddate\", \"linearized\", \"tagged\", \"encrypted\",\n" -"\"oktoprint\", \"oktocopy\", \"oktochange\", \"oktoaddnotes\", \"version\".\n\n" -"If the \"oktocopy\" digital rights management flag is set to \"no\", then the\n" -"pdf parser won't allow you to access the PDF file. Trying to extract pages\n" -"from it will raise an exception.\n" -); -static PyObject* doc_getInfo(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - DocObject* self = (DocObject*)_self; - - static char *kwlist[] = {"key", NULL}; - char*key = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &key)) - return NULL; - - char*s = self->doc->getinfo(self->doc, key); - return pystring_fromstring(s); -} - -PyDoc_STRVAR(doc_setparameter_doc, -"setparameter(key, value)\n\n" -"Pass a parameter or setting to the document parser. Unlike\n" -"the module level setparameter() function, the parameters set\n" -"using setparameter will only be valid for the object itself\n" -"during its lifetime.\n" -); -static PyObject* doc_setparameter(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - DocObject* self = (DocObject*)_self; - - static char *kwlist[] = {"key", "value", NULL}; - char*key = 0, *value=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key,&value)) - return NULL; - - self->doc->setparameter(self->doc, key, value); - return PY_NONE; -} - -PyDoc_STRVAR(f_open_doc, -"open(type, filename) -> object\n\n" -"Open a PDF, SWF or image file. The type argument should be \"pdf\",\n" -"\"swf\" or \"image\" accordingly. It returns a doc object which can be\n" -"used to process the file contents.\n" -"E.g.\n" -" doc = open(\"pdf\", \"document.pdf\")\n" -" doc = open(\"swf\", \"flashfile.swf\")\n" -" doc = open(\"image\", \"image.png\")\n" -"If the file could not be loaded, or is a encrypted PDF file without\n" -"a proper password specified, an exception is being raised.\n" -"If the filename argument contains a '|' char, everything behind\n" -"the '|' is treated as password used for opening the file.\n" -"E.g.\n" -" doc = open(\"pdf\", \"document.pdf|mysecretpassword\")\n" -".\n" -"Notice that for image files, the only supported file formats right now\n" -"are jpeg and png.\n" -); -static PyObject* f_open(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"type", "filename", NULL}; - char*filename=0; - char*type=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &type, &filename)) { - static char *kwlist2[] = {"filename", NULL}; - type = 0; - PyErr_Clear(); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist2, &filename)) - return NULL; - } - - DocObject*self = PyObject_New(DocObject, &DocClass); - - if(!type) { //autodetect - type = "pdf"; //default - int l = strlen(filename); - if(l>4) { - if(filename[l-4]=='.') { - if(strchr("pP", filename[l-3]) && strchr("dD", filename[l-2]) && strchr("fF", filename[l-1])) - type = "pdf"; - if(strchr("jJ", filename[l-3]) && strchr("pP", filename[l-2]) && strchr("gG", filename[l-1])) - type = "image"; - if(strchr("pP", filename[l-3]) && strchr("nN", filename[l-2]) && strchr("gG", filename[l-1])) - type = "image"; - if(strchr("sS", filename[l-3]) && strchr("wW", filename[l-2]) && strchr("fF", filename[l-1])) - type = "swf"; - } else if(filename[l-5]=='.') { - type = "image"; - } - } - } - - state_t*state = STATE(module); - if(!strcmp(type,"pdf")) { - Py_BEGIN_ALLOW_THREADS - self->doc = state->pdfdriver->open(state->pdfdriver,filename); - Py_END_ALLOW_THREADS - } - else if(!strcmp(type, "image") || !strcmp(type, "img")) { - Py_BEGIN_ALLOW_THREADS - self->doc = state->imagedriver->open(state->imagedriver, filename); - Py_END_ALLOW_THREADS - } - else if(!strcmp(type, "swf") || !strcmp(type, "SWF")) { - Py_BEGIN_ALLOW_THREADS - self->doc = state->swfdriver->open(state->imagedriver, filename); - Py_END_ALLOW_THREADS - } - else - return PY_ERROR("Unknown type %s", type); - - if(!self->doc) { - PyObject_Del(self); - return PY_ERROR("Couldn't open %s", filename); - } - self->filename = strdup(filename); - return (PyObject*)self; -} - -static PyMethodDef doc_methods[] = -{ - /* PDF functions */ - {"getPage", (PyCFunction)doc_getPage, METH_KEYWORDS, doc_getPage_doc}, - {"getInfo", (PyCFunction)doc_getInfo, METH_KEYWORDS, doc_getInfo_doc}, - {"setparameter", (PyCFunction)doc_setparameter, METH_KEYWORDS, doc_setparameter_doc}, - {0,0,0,0} -}; - -static void doc_dealloc(PyObject* _self) { - DocObject* self = (DocObject*)_self; - if(self->doc) { - self->doc->destroy(self->doc); - self->doc=0; - } - if(self->filename) { - free(self->filename);self->filename=0; - } - PyObject_Del(self); -} -static PyObject* doc_getattr(PyObject * _self, char* a) -{ - DocObject*self = (DocObject*)_self; - if(!strcmp(a, "pages")) { - return pyint_fromlong(self->doc->num_pages); - } - if(!strcmp(a, "filename")) { - return pystring_fromstring(self->filename); - } - return forward_getattr(_self, a); -} -static int doc_setattr(PyObject * self, char* a, PyObject * o) { - return -1; -} -static int doc_print(PyObject * _self, FILE *fi, int flags) -{ - DocObject*self = (DocObject*)_self; - fprintf(fi, "", _self, _self?_self->ob_refcnt:0); - return 0; -} - -//--------------------------------------------------------------------- -PyDoc_STRVAR(f_createKDTree_doc, \ -"KDTree()\n\n" -"Creates a KDTree, which can be used to store bounding boxes\n" -); -static PyObject* f_createKDTree(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) - return NULL; - KDTreeObject*self = PyObject_New(KDTreeObject, &KDTreeClass); - self->kdtree = kdtree_new(); - return (PyObject*)self; -} -static void gfx_kdtree_dealloc(PyObject* _self) { - KDTreeObject* self = (KDTreeObject*)_self; - /* FIXME: we still need to Py_DECREF all PyObjects in the tree */ - kdtree_destroy(self->kdtree); - PyObject_Del(self); -} -static PyObject* gfx_kdtree_getattr(PyObject * _self, char* a) -{ - KDTreeObject*self = (KDTreeObject*)_self; - return forward_getattr(_self, a); -} -static int gfx_kdtree_setattr(PyObject * self, char* a, PyObject * o) { - return -1; -} -static int gfx_kdtree_print(PyObject * _self, FILE *fi, int flags) -{ - KDTreeObject*self = (KDTreeObject*)_self; - fprintf(fi, "", _self, _self?_self->ob_refcnt:0); - return 0; -} -PyDoc_STRVAR(gfx_kdtree_add_box_doc, -"put(bbox, data)\n\n" -"Add a rectangular area to the tree. All queries within that area\n" -"will subsequently return 'data'\n" -); -static PyObject* gfx_kdtree_add_box(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - KDTreeObject* self = (KDTreeObject*)_self; - - static char *kwlist[] = {"bbox", "data", NULL}; - int x1=0,y1=0,x2=0,y2=0; - PyObject*value=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "(iiii)O", kwlist, &x1, &y1, &x2, &y2, &value)) - return NULL; - - kdtree_add_box(self->kdtree, x1,y1,x2,y2, value); - Py_INCREF(value); - - return PY_NONE; -} - -PyDoc_STRVAR(gfx_kdtree_find_doc, -"find(x,y)\n\n" -"Look for a coordinate in the kdtree. It will return last inserted object covering that position, or None.\n" -); -static PyObject* gfx_kdtree_find(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - KDTreeObject* self = (KDTreeObject*)_self; - - static char *kwlist[] = {"x", "y", NULL}; - int x=0,y=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", kwlist, &x, &y)) - return NULL; - PyObject*value = (PyObject*)kdtree_find(self->kdtree, x,y); - if(!value) { - return PY_NONE; - } else { - Py_INCREF(value); - return value; - } -} - -static PyMethodDef gfx_kdtree_methods[] = -{ - {"add_box", (PyCFunction)gfx_kdtree_add_box, METH_KEYWORDS, gfx_kdtree_add_box_doc}, - {"find", (PyCFunction)gfx_kdtree_find, METH_KEYWORDS, gfx_kdtree_find_doc}, - {0,0,0,0} -}; - -//--------------------------------------------------------------------- -PyDoc_STRVAR(f_createBitmap_doc, \ -"Bitmap()\n\n" -"Creates a Bitmap, which can be used to store bounding boxes\n" -); -static PyObject* create_bitmap(gfximage_t*img) -{ - BitmapObject*self = PyObject_New(BitmapObject, &BitmapClass); - self->image = malloc(sizeof(gfximage_t)); - self->image->data = malloc(sizeof(gfxcolor_t)*img->width*img->height); - memcpy(self->image->data, img->data, sizeof(gfxcolor_t)*img->width*img->height); - self->image->width = img->width; - self->image->height = img->height; - return (PyObject*)self; -} -static void gfx_bitmap_dealloc(PyObject* _self) { - BitmapObject* self = (BitmapObject*)_self; - free(self->image->data); - free(self->image); - PyObject_Del(self); -} -static PyObject* gfx_bitmap_getattr(PyObject * _self, char* a) -{ - BitmapObject*self = (BitmapObject*)_self; - if(!strcmp(a, "width")) { - return pyint_fromlong(self->image->width); - } else if(!strcmp(a, "height")) { - return pyint_fromlong(self->image->height); - } - return forward_getattr(_self, a); -} -static int gfx_bitmap_setattr(PyObject * self, char* a, PyObject * o) { - return -1; -} -PyDoc_STRVAR(gfx_bitmap_save_png_doc, -"save_jpeg(filename, quality)\n\n" -"Save bitmap to a png file.\n" -); -static PyObject* gfx_bitmap_save_png(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - ImageObject* self = (ImageObject*)_self; - static char *kwlist[] = {"filename", NULL}; - char*filename=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename)) - return NULL; - gfximage_save_png_quick(self->image, filename); - return PY_NONE; -} -PyDoc_STRVAR(gfx_bitmap_save_jpeg_doc, -"save_jpeg(filename, quality)\n\n" -"Save bitmap to a jpeg file. The quality parameter is optional.\n" -); -static PyObject* gfx_bitmap_save_jpeg(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - ImageObject* self = (ImageObject*)_self; - static char *kwlist[] = {"filename", "quality", NULL}; - char*filename=0; - int quality=95; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", kwlist, &filename, &quality)) - return NULL; - gfximage_save_jpeg(self->image, filename, quality); - return PY_NONE; -} -static int gfx_bitmap_print(PyObject * _self, FILE *fi, int flags) -{ - BitmapObject*self = (BitmapObject*)_self; - fprintf(fi, "", _self, _self?_self->ob_refcnt:0); - return 0; -} -static PyMethodDef gfx_bitmap_methods[] = -{ - {"save_png", (PyCFunction)gfx_bitmap_save_png, METH_KEYWORDS, gfx_bitmap_save_png_doc}, - {"save_jpeg", (PyCFunction)gfx_bitmap_save_jpeg, METH_KEYWORDS, gfx_bitmap_save_jpeg_doc}, - {0,0,0,0} -}; - -//--------------------------------------------------------------------- - -#ifndef PYTHON3 -#define PYTHON23_HEAD_INIT \ - PyObject_HEAD_INIT(NULL) \ - 0, -#else -#define PYTHON23_HEAD_INIT \ - PyVarObject_HEAD_INIT(&PyType_Type, 0) -#endif - -PyDoc_STRVAR(output_doc, -"An Output object can be used as parameter to the render()\n" -"call of a page. It's not possible to create this type of\n" -"object directly (i.e., from a class), however you can\n" -"use a PassThrough() device to pass things over to Python.\n" -"Examples for classes implementing the Output class are: \n" -"ImageList, SWF, PlainText and PassThrough.\n" -); -static PyTypeObject OutputClass = -{ - PYTHON23_HEAD_INIT - tp_name: "gfx.Output", - tp_basicsize: sizeof(OutputObject), - tp_itemsize: 0, - tp_dealloc: output_dealloc, - tp_print: output_print, - tp_getattr: output_getattr, - tp_setattr: output_setattr, - tp_doc: output_doc, - tp_methods: output_methods -}; -PyDoc_STRVAR(page_doc, -"A Page object contains a single page of a document.\n" -"page.width and page.height (or page.size) contain the\n" -"page dimensions. page.nr is the number of the page, and\n" -"page.doc is the parent document.\n" -); -static PyTypeObject PageClass = -{ - PYTHON23_HEAD_INIT - tp_name: "gfx.Page", - tp_basicsize: sizeof(PageObject), - tp_itemsize: 0, - tp_dealloc: page_dealloc, - tp_print: page_print, - tp_getattr: page_getattr, - tp_setattr: page_setattr, - tp_doc: page_doc, - tp_methods: page_methods -}; -PyDoc_STRVAR(doc_doc, -"A Doc object is used for storing a document (like a PDF).\n" -"doc.pages contains the number of pages in the document,\n" -"and doc.filename the name of the file the document was\n" -"created (loaded) from. If the document was created from\n" -"an image file, the number of pages is always 1\n" -); -static PyTypeObject DocClass = -{ - PYTHON23_HEAD_INIT - tp_name: "gfx.Doc", - tp_basicsize: sizeof(DocObject), - tp_itemsize: 0, - tp_dealloc: doc_dealloc, - - tp_print: doc_print, - tp_getattr: doc_getattr, - tp_setattr: doc_setattr, - tp_doc: doc_doc, - tp_methods: doc_methods, - - tp_iter: doc_getiter, - tp_iternext: doc_iternext, - -#ifndef PYTHON3 - tp_flags: Py_TPFLAGS_HAVE_ITER, -#endif -}; -PyDoc_STRVAR(font_doc, -"A font is a list of glyphs\n" -); -static PyTypeObject FontClass = -{ - PYTHON23_HEAD_INIT - tp_name: "gfx.Font", - tp_basicsize: sizeof(FontObject), - tp_itemsize: 0, - tp_dealloc: font_dealloc, - tp_print: font_print, - tp_getattr: font_getattr, - tp_setattr: font_setattr, - tp_doc: font_doc, - tp_methods: font_methods, -}; -PyDoc_STRVAR(glyph_doc, -"A glyph is a polygon and a unicode index\n" -); -static PyTypeObject GlyphClass = -{ - PYTHON23_HEAD_INIT - tp_name: "gfx.Glyph", - tp_basicsize: sizeof(GlyphObject), - tp_itemsize: 0, - tp_dealloc: glyph_dealloc, - tp_print: glyph_print, - tp_getattr: glyph_getattr, - tp_setattr: glyph_setattr, - tp_doc: glyph_doc, - tp_methods: glyph_methods, -}; -PyDoc_STRVAR(char_doc, -"A char is a glyph at a given position (in a given color)\n" -); -static PyTypeObject CharClass = -{ - PYTHON23_HEAD_INIT - tp_name: "gfx.Char", - tp_basicsize: sizeof(CharObject), - tp_itemsize: 0, - tp_dealloc: char_dealloc, - tp_print: char_print, - tp_getattr: char_getattr, - tp_setattr: char_setattr, - tp_doc: char_doc, - tp_methods: char_methods, -}; - -PyDoc_STRVAR(gfx_bitmap_doc, -"A bitmap.\n" -); -static PyTypeObject BitmapClass = -{ - PYTHON23_HEAD_INIT - tp_name: "gfx.Bitmap", - tp_basicsize: sizeof(BitmapObject), - tp_itemsize: 0, - tp_dealloc: gfx_bitmap_dealloc, - tp_print: gfx_bitmap_print, - tp_getattr: gfx_bitmap_getattr, - tp_setattr: gfx_bitmap_setattr, - tp_doc: gfx_bitmap_doc, - tp_methods: gfx_bitmap_methods, -}; - - -PyDoc_STRVAR(gfx_kdtree_doc, -"A kdtree is a two dimensional tree for storing bounding box data\n" -); -static PyTypeObject KDTreeClass = -{ - PYTHON23_HEAD_INIT - tp_name: "gfx.KDTree", - tp_basicsize: sizeof(KDTreeObject), - tp_itemsize: 0, - tp_dealloc: gfx_kdtree_dealloc, - tp_print: gfx_kdtree_print, - tp_getattr: gfx_kdtree_getattr, - tp_setattr: gfx_kdtree_setattr, - tp_doc: gfx_kdtree_doc, - tp_methods: gfx_kdtree_methods, -}; - - -//===================================================================== - -PyDoc_STRVAR(f_setparameter_doc, \ -"setparameter(key,value)\n\n" -"Set a parameter in the gfx module (which might affect the PDF\n" -"parser or any of the rendering backends). This is a parameter\n" -"which would usually be passed with the \"-s\" option to pdf2swf.\n" -"For a list of all parameters, see the output of\n" -" pdf2swf -s help\n" -"and\n" -" pdf2swf somefile.pdf -s help\n" -".\n" -); -static PyObject* f_setparameter(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"key", "value", NULL}; - char*key=0,*value=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key, &value)) - return NULL; - state_t*state = STATE(module); - state->pdfdriver->setparameter(state->pdfdriver,key,value); - return PY_NONE; -} - -PyDoc_STRVAR(f_verbose_doc, \ -"verbose(level)\n\n" -"Set the logging verbosity of the gfx module. Log levels are:\n" -"level=-1 Log nothing\n" -"level=0 (fatal) Log only fatal errors\n" -"level=1 (error) Log only fatal errors and errors\n" -"level=2 (warn) Log all errors and warnings\n" -"level=3 (notice) Log also some rudimentary data about the parsing/conversion\n" -"level=4 (verbose) Log some additional parsing information\n" -"level=5 (debug) Log debug statements\n" -"level=6 (trace) Log extended debug statements\n" -"All logging messages are written to stdout.\n" -); -static PyObject* f_verbose(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"val", NULL}; - int val; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &val)) - return NULL; - setConsoleLogging(val); - return PY_NONE; -} - -PyDoc_STRVAR(f_addfont_doc, \ -"addfont(filename)\n\n" -"Passes an additional font file to the PDF parser. If a PDF contains\n" -"external fonts (i.e. fonts which are not contained in the PDF itself)\n" -"then the files added by addfont() will be searched.\n" -); - -static PyObject* f_addfont(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"filename", NULL}; - char*filename=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename)) - return NULL; - state_t*state = STATE(module); - state->pdfdriver->setparameter(state->pdfdriver,"font", filename); - return PY_NONE; -} - -PyDoc_STRVAR(f_addfontdir_doc, \ -"addfontdir(dirname)\n\n" -"Passes a complete directory containing fonts to the PDF parser. Any\n" -"font file within this directory might be used to resolve external fonts\n" -"in PDF files\n" -); -static PyObject* f_addfontdir(PyObject* module, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"filename", NULL}; - char*filename=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename)) - return NULL; - state_t*state = STATE(module); - state->pdfdriver->setparameter(state->pdfdriver,"fontdir", filename); - return PY_NONE; -} - -static PyMethodDef gfx_methods[] = -{ - /* sources */ - {"open", (PyCFunction)f_open, M_FLAGS, f_open_doc}, - {"addfont", (PyCFunction)f_addfont, M_FLAGS, f_addfont_doc}, - {"addfontdir", (PyCFunction)f_addfontdir, M_FLAGS, f_addfontdir_doc}, - {"setparameter", (PyCFunction)f_setparameter, M_FLAGS, f_setparameter_doc}, - {"verbose", (PyCFunction)f_verbose, M_FLAGS, f_verbose_doc}, - - /* devices */ - {"SWF", (PyCFunction)f_createSWF, M_FLAGS, f_createSWF_doc}, - {"OCR", (PyCFunction)f_createOCR, M_FLAGS, f_createOCR_doc}, - {"ImageList", (PyCFunction)f_createImageList, M_FLAGS, f_createImageList_doc}, - {"PlainText", (PyCFunction)f_createPlainText, M_FLAGS, f_createPlainText_doc}, - {"PassThrough", (PyCFunction)f_createPassThrough, M_FLAGS, f_createPassThrough_doc}, -#ifdef USE_OPENGL - {"OpenGL", (PyCFunction)f_createOpenGL, M_FLAGS, f_createOpenGL_doc}, -#endif - {"KDTree", (PyCFunction)f_createKDTree, M_FLAGS, f_createKDTree_doc}, - - /* sentinel */ - {0, 0, 0, 0} -}; - -PyDoc_STRVAR(gfx_doc, \ -"This module contains a PDF parser (based on xpdf) and a number of\n" -"rendering backends. In particular, it can extract text from PDF pages,\n" -"create bitmaps from them, or convert PDF files to SWF.\n" -"The latter functionality is similar to what is offered by swftools'\n" -"(http://www.swftools.org) pdf2swf utility, however more powerful-\n" -"You can also create individual SWF files from single pages of the PDF\n" -"or mix pages from different PDF files.\n" -); - -void gfx_free(void*module) -{ - state_t*state = STATE(module); - if(state->pdfdriver && state->pdfdriver->destroy) - state->pdfdriver->destroy(state->pdfdriver); - if(state->swfdriver && state->swfdriver->destroy) - state->swfdriver->destroy(state->swfdriver); - if(state->imagedriver && state->imagedriver->destroy) - state->imagedriver->destroy(state->imagedriver); - memset(state, 0, sizeof(state_t)); -} - -#ifdef PYTHON3 -static struct PyModuleDef gfx_moduledef = { - PyModuleDef_HEAD_INIT, - "gfx", - gfx_doc, - sizeof(state_t), - gfx_methods, - /*reload*/NULL, - /*traverse*/NULL, - /*clear*/NULL, - gfx_free, -}; -#endif - -PyObject * PyInit_gfx(void) -{ - initLog(0,0,0,0,0,2); -#ifdef PYTHON3 - PyObject*module = PyModule_Create(&gfx_moduledef); -#else - PyObject*module = Py_InitModule3("gfx", gfx_methods, gfx_doc); - OutputClass.ob_type = &PyType_Type; - PageClass.ob_type = &PyType_Type; - DocClass.ob_type = &PyType_Type; - FontClass.ob_type = &PyType_Type; - CharClass.ob_type = &PyType_Type; - KDTreeClass.ob_type = &PyType_Type; - BitmapClass.ob_type = &PyType_Type; -#endif - - state_t* state = STATE(module); - memset(state, 0, sizeof(state_t)); - state->pdfdriver = gfxsource_pdf_create(); - state->swfdriver = gfxsource_swf_create(); - state->imagedriver = gfxsource_image_create(); - - PyObject*module_dict = PyModule_GetDict(module); - PyDict_SetItemString(module_dict, "Doc", (PyObject*)&DocClass); - PyDict_SetItemString(module_dict, "Page", (PyObject*)&PageClass); - PyDict_SetItemString(module_dict, "Output", (PyObject*)&OutputClass); - PyDict_SetItemString(module_dict, "Char", (PyObject*)&CharClass); - PyDict_SetItemString(module_dict, "Font", (PyObject*)&FontClass); - PyDict_SetItemString(module_dict, "KDTree", (PyObject*)&KDTreeClass); - PyDict_SetItemString(module_dict, "Bitmap", (PyObject*)&BitmapClass); - - return module; -} -#ifndef PYTHON3 -void initgfx(void) { - PyInit_gfx(); -} -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/image.c b/fluidbook/tools/swftools-special-swfdump/lib/python/image.c deleted file mode 100644 index 5b125e623..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/image.c +++ /dev/null @@ -1,160 +0,0 @@ -#include -#ifdef HAVE_STAT -#undef HAVE_STAT -#endif -//#include "/usr/include/python2.3/Imaging.h" -#include "../../config.h" -#ifdef HAVE_PYTHON_IMAGING -#include -#endif -#include "pyutils.h" -#undef HAVE_STAT -#include "../rfxswf.h" - -/* redefine the ImagingObject struct defined in _imagingmodule.c */ -/* there should be a better way to do this... */ -typedef struct { - PyObject_HEAD -#ifdef HAVE_PYTHON_IMAGING - Imaging image; -#endif -} ImagingObject; - -int image_getWidth(PyObject*_image) { -#ifdef HAVE_PYTHON_IMAGING - if(strcmp(_image->ob_type->tp_name, "ImagingCore")) { - PyErr_SetString(PyExc_Exception, setError("not an image: %s", _image->ob_type->tp_name)); - return 0; - } - ImagingObject*image = (ImagingObject*)_image; - return image->image->xsize; -#else - PyErr_SetString(PyExc_Exception, "imaging not compiled in"); - return 0; -#endif -} - -int image_getHeight(PyObject*_image) { -#ifdef HAVE_PYTHON_IMAGING - if(strcmp(_image->ob_type->tp_name, "ImagingCore")) { - PyErr_SetString(PyExc_Exception, setError("not an image: %s", _image->ob_type->tp_name)); - return 0; - } - ImagingObject*image = (ImagingObject*)_image; - return image->image->ysize; -#else - PyErr_SetString(PyExc_Exception, "imaging not compiled in"); - return 0; -#endif -} - -int image_getBPP(PyObject*_image) { -#ifdef HAVE_PYTHON_IMAGING - if(strcmp(_image->ob_type->tp_name, "ImagingCore")) { - PyErr_SetString(PyExc_Exception, setError("not an image: %s", _image->ob_type->tp_name)); - return 0; - } - ImagingObject*image = (ImagingObject*)_image; - if(!strcmp(image->image->mode, "1") || - !strcmp(image->image->mode, "L") || - !strcmp(image->image->mode, "P")) { - return 8; - } - if(!strcmp(image->image->mode, "I") || - !strcmp(image->image->mode, "F")) { - return 32; - } - if(!strcmp(image->image->mode, "RGB") || - !strcmp(image->image->mode, "RGBA") || - !strcmp(image->image->mode, "CMYK") || - !strcmp(image->image->mode, "YCbCr")) { - return 32; - } - PyErr_SetString(PyExc_Exception, setError("Unknown image format (%s).", image->image->mode)); - return 0; -#else - PyErr_SetString(PyExc_Exception, "imaging not compiled in"); - return 0; -#endif -} - -RGBA* image_toRGBA(PyObject*_image) -{ -#ifdef HAVE_PYTHON_IMAGING - if(strcmp(_image->ob_type->tp_name, "ImagingCore")) { - PyErr_SetString(PyExc_Exception, setError("not an image: %s", _image->ob_type->tp_name)); - return 0; - } - ImagingObject*image = (ImagingObject*)_image; - printf("mode: %s\n", image->image->mode); - printf("depth: %d\n", image->image->depth); - printf("bands: %d\n", image->image->bands); - printf("xsize: %d\n", image->image->xsize); - printf("ysize: %d\n", image->image->ysize); - int bpp = image_getBPP(_image); - if(!bpp) - return 0; - - RGBA*rgba = (RGBA*)malloc(image->image->xsize * image->image->ysize * sizeof(RGBA)); - - if(!strcmp(image->image->mode, "RGBA")) { - int y,ymax=image->image->ysize; - int width = image->image->xsize; - RGBA*dest = rgba; - for(y=0;yimage->image32[y]); - int x; - for(x=0;ximage->mode)); -#else - PyErr_SetString(PyExc_Exception, "imaging not compiled in"); -#endif - return 0; -} - -#ifdef HAVE_PYTHON_IMAGING -extern PyObject*PyImagingNew(Imaging imOut); -#endif - -PyObject* rgba_to_image(RGBA*rgba, int width, int height) -{ -#ifdef HAVE_PYTHON_IMAGING -#ifndef WIN32 - Imaging img = ImagingNew("RGBA", width, height); - int y; - if(!img->image32) { - fprintf(stderr, "No array allocated!\n"); - return 0; - } - for(y=0;yimage32[y]); - RGBA* src = &rgba[width*y]; - int x; - for(x=0;x - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __image_h__ -#define __image_h__ - -#include -#undef HAVE_STAT -#include "../rfxswf.h" - -int image_getWidth(PyObject*image); -int image_getHeight(PyObject*image); -int image_getBPP(PyObject*image); -RGBA* image_toRGBA(PyObject*image); -PyObject* rgba_to_image(RGBA*rgba, int width, int height); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.c b/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.c deleted file mode 100644 index eaaeef2f4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.c +++ /dev/null @@ -1,655 +0,0 @@ -/* primitives.c - - Python wrapper for librfxswf- primitive objects (implementation) - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#undef HAVE_STAT -#include "../rfxswf.h" -#include "../log.h" -#include "./pyutils.h" -#include "primitives.h" - -//---------------------------------------------------------------------------- -typedef struct { - PyObject_HEAD - RGBA rgba; -} ColorObject; - -PyObject* f_Color2(U8 r, U8 g, U8 b, U8 a) -{ - ColorObject* color = PyObject_New(ColorObject, &ColorClass); - color->rgba.r = r; - color->rgba.g = g; - color->rgba.b = b; - color->rgba.a = a; - return (PyObject*)color; -} -PyObject* f_Color(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"r", "g", "b", "a", NULL}; - ColorObject* color; - int r=0,g=0,b=0,a=255; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iii|i", kwlist, &r,&g,&b,&a)) { - char*s= 0; - int mya = -1; - PyErr_Clear(); - static char *kwlist[] = {"col", "alpha", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", kwlist, &s, &mya)) - return NULL; - if(mya>=0) a=mya; - sscanf(s, "%02x%02x%02x%02x",&r,&g,&b,&a); - } - color = PyObject_New(ColorObject, &ColorClass); - mylog("+%08x(%d) color_new(%d,%d,%d,%d)\n", (int)color, color->ob_refcnt, r,g,b,a); - return f_Color2(r,g,b,a); -} -static PyObject* color_getattr(PyObject * self, char* a) -{ - ColorObject*color = (ColorObject*)self; - if(!strcmp(a, "r")) { - return Py_BuildValue("i", color->rgba.r); - } else if(!strcmp(a, "g")) { - return Py_BuildValue("i", color->rgba.g); - } else if(!strcmp(a, "b")) { - return Py_BuildValue("i", color->rgba.b); - } else if(!strcmp(a, "a")) { - return Py_BuildValue("i", color->rgba.a); - } else if(!strcmp(a, "alpha")) { - return Py_BuildValue("i", color->rgba.a); - } else if(!strcmp(a, "rgb")) { - char text[80]; - sprintf(text, "%02x%02x%02x", color->rgba.r, color->rgba.g, color->rgba.b); - return PyString_FromString(text); - } else if(!strcmp(a, "rgba")) { - char text[80]; - sprintf(text, "%02x%02x%02x%02x", color->rgba.r, color->rgba.g, color->rgba.b, color->rgba.a); - return PyString_FromString(text); - } - return PY_ERROR("bad attribute"); -} -static int color_setattr(PyObject * self, char* attr, PyObject* o) -{ - ColorObject*color = (ColorObject*)self; - if(!strcmp(attr, "r")) { - if (!PyArg_Parse(o, "d", &color->rgba.r)) goto err; - return 0; - } else if(!strcmp(attr, "g")) { - if (!PyArg_Parse(o, "d", &color->rgba.g)) goto err; - return 0; - } else if(!strcmp(attr, "b")) { - if (!PyArg_Parse(o, "d", &color->rgba.b)) goto err; - return 0; - } else if(!strcmp(attr, "a")) { - if (!PyArg_Parse(o, "d", &color->rgba.a)) goto err; - return 0; - } -err: - mylog("swf_setattr %08x(%d) %s = ? (%08x)\n", (int)self, self->ob_refcnt, attr, o); - return 1; -} -RGBA color_getRGBA(PyObject*self) -{ - ColorObject*color = 0; - if (!PyArg_Parse(self, "O!", &ColorClass, &color)) { - RGBA dummy; - memset(&dummy, 0, sizeof(dummy)); - mylog("Error: wrong type for function color_getRGBA"); - return dummy; - } - return color->rgba; -} -void color_dealloc(PyObject* self) -{ - mylog("-%08x(%d) color_dealloc\n", (int)self, self->ob_refcnt); - PyObject_Del(self); -} -PyTypeObject ColorClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "Color", - tp_basicsize: sizeof(ColorObject), - tp_itemsize: 0, - tp_dealloc: color_dealloc, - tp_print: 0, - tp_getattr: color_getattr, - tp_setattr: color_setattr, -}; -//---------------------------------------------------------------------------- -typedef struct { - PyObject_HEAD - SRECT bbox; -} BBoxObject; -//void swf_ExpandRect(SRECT*src, SPOINT add); -//void swf_ExpandRect2(SRECT*src, SRECT*add); - -PyObject* f_BBox(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"xmin", "ymin", "xmax", "ymax", NULL}; - BBoxObject* bbox; - float xmin,ymin,xmax,ymax; - if(!kwargs) { - if (!PyArg_ParseTuple(args, "ffff", &xmin, &ymin, &xmax, &ymax)) - return NULL; - } else { - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ffff", kwlist, &xmin, &ymin, &xmax, &ymax)) - return NULL; - } - SRECT box; - box.xmin = (int)(xmin*20); - box.ymin = (int)(ymin*20); - box.xmax = (int)(xmax*20); - box.ymax = (int)(ymax*20); - mylog("+%08x(%d) bbox_new(%d,%d,%d,%d)\n", (int)self, self?self->ob_refcnt:0, box.xmin, box.ymin, box.xmax,box.ymax); - bbox = PyObject_New(BBoxObject, &BBoxClass); - bbox->bbox = box; - return (PyObject*)bbox; -} -PyObject* f_BBox2(SRECT box) -{ - BBoxObject* bbox; - bbox = PyObject_New(BBoxObject, &BBoxClass); - bbox->bbox = box; - return (PyObject*)bbox; -} -static PyObject* bbox_getattr(PyObject * self, char* a) -{ - BBoxObject*bbox = (BBoxObject*)self; - if(!strcmp(a, "xmin")) { - return Py_BuildValue("f", bbox->bbox.xmin/20.0); - } else if(!strcmp(a, "ymin")) { - return Py_BuildValue("f", bbox->bbox.ymin/20.0); - } else if(!strcmp(a, "xmax")) { - return Py_BuildValue("f", bbox->bbox.xmax/20.0); - } else if(!strcmp(a, "ymax")) { - return Py_BuildValue("f", bbox->bbox.ymax/20.0); - } - return NULL; -} -static int bbox_setattr(PyObject * self, char* a, PyObject* o) -{ - BBoxObject*bbox= (BBoxObject*)self; - if(!strcmp(a, "xmin")) { - float xmin; - if (!PyArg_Parse(o, "f", &xmin)) goto err; - bbox->bbox.xmin = (int)(xmin*20); - return 0; - } else if(!strcmp(a, "ymin")) { - float ymin; - if (!PyArg_Parse(o, "f", &ymin)) goto err; - bbox->bbox.ymin = (int)(ymin*20); - return 0; - } else if(!strcmp(a, "xmax")) { - float xmax; - if (!PyArg_Parse(o, "f", &xmax)) goto err; - bbox->bbox.xmax = (int)(xmax*20); - return 0; - } else if(!strcmp(a, "ymax")) { - float ymax; - if (!PyArg_Parse(o, "f", &ymax)) goto err; - bbox->bbox.ymax = (int)(ymax*20); - return 0; - } -err: - mylog("swf_setattr %08x(%d) %s = ? (%08x)\n", (int)self, self->ob_refcnt, a, o); - return 1; -} -void bbox_dealloc(PyObject* self) -{ - mylog("-%08x(%d) bbox_dealloc\n", (int)self, self->ob_refcnt); - PyObject_Del(self); -} -SRECT bbox_getSRECT(PyObject*self) -{ - BBoxObject*bbox= 0; - if (!PyArg_Parse(self, "O!", &BBoxClass, &bbox)) { - SRECT dummy; - memset(&dummy, 0, sizeof(dummy)); - mylog("Error: wrong type for function color_getRGBA"); - return dummy; - } - return bbox->bbox; -} -PyTypeObject BBoxClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "BBox", - tp_basicsize: sizeof(BBoxObject), - tp_itemsize: 0, - tp_dealloc: bbox_dealloc, - tp_print: 0, - tp_getattr: bbox_getattr, - tp_setattr: bbox_setattr, -}; -SRECT bbox_getBBox(PyObject*self); -//---------------------------------------------------------------------------- -typedef struct { - PyObject_HEAD - MATRIX matrix; -} MatrixObject; - -PyObject* f_Matrix2(MATRIX* m) -{ - PyObject*self = (PyObject*)PyObject_New(MatrixObject, &MatrixClass); - MatrixObject*matrix = (MatrixObject*)self; - matrix->matrix = *m; - return self; -} - -PyObject* f_Matrix(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - PyObject*self = (PyObject*)PyObject_New(MatrixObject, &MatrixClass); - MatrixObject*matrix = (MatrixObject*)self; - mylog("+%08x(%d) f_Matrix", self, self->ob_refcnt); - static char *kwlist[] = {"x", "y", "scale", "rotate", "pivotx", "pivoty", NULL}; - float x=0,y=0,scale=1.0,rotate=0,pivotx=0,pivoty=0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ffffff", kwlist, &x,&y,&scale,&rotate,&pivotx,&pivoty)) - return NULL; - mylog(" %08x(%d) f_Matrix: x=%f y=%f scale=%f rotate=%f", self, self->ob_refcnt, x,y,scale,rotate); - swf_GetMatrix(0, &matrix->matrix); - - matrix->matrix.tx = (int)(x*20); - matrix->matrix.ty = (int)(y*20); - - if(!rotate) { - matrix->matrix.sx = (int)(scale*65536); - matrix->matrix.sy = (int)(scale*65536); - } else { - matrix->matrix.sx = (int)(scale*cos(rotate)*65536); - matrix->matrix.sy = (int)(scale*cos(rotate)*65536); - matrix->matrix.r0 = (int)(scale*sin(rotate)*65536); - matrix->matrix.r1 = (int)(-scale*sin(rotate)*65536); - } - if(pivotx || pivoty) { - SPOINT p,d; - p.x = (int)(pivotx*20); - p.y = (int)(pivoty*20); - p = swf_TurnPoint(p, &matrix->matrix); - matrix->matrix.tx += matrix->matrix.tx-p.x; - matrix->matrix.ty += matrix->matrix.ty-p.y; - } - - /* TODO: rotate */ - return self; -} -static PyObject* matrix_getattr(PyObject * self, char* a) -{ - PY_ASSERT_TYPE(self,&MatrixClass); - MatrixObject*matrix = (MatrixObject*)self; - if(!strcmp(a, "entries")) { - return Py_BuildValue("(ffffff)", - matrix->matrix.sx/65536.0, - matrix->matrix.r0/65536.0, - matrix->matrix.r1/65536.0, - matrix->matrix.sy/65536.0, - matrix->matrix.tx/20.0, - matrix->matrix.ty/20.0 - ); - } - return NULL; -} -static int matrix_setattr(PyObject * self, char* a, PyObject* o) -{ - PY_ASSERT_TYPE(self,&MatrixClass); - return 0; -} -MATRIX matrix_getMatrix(PyObject*self) -{ - mylog(" %08x(%d) matrix_getMatrix", self, self->ob_refcnt); - PY_ASSERT_TYPE(self,&MatrixClass); - MatrixObject*matrix = (MatrixObject*)self; - return matrix->matrix; -} -void matrix_dealloc(PyObject* self) -{ - mylog("-%08x(%d) matrix_dealloc", self, self->ob_refcnt); - PyObject_Del(self); -} -//SPOINT swf_TurnPoint(SPOINT p, MATRIX* m); -//SRECT swf_TurnRect(SRECT r, MATRIX* m); -PyTypeObject MatrixClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "Matrix", - tp_basicsize: sizeof(MatrixObject), - tp_itemsize: 0, - tp_dealloc: matrix_dealloc, - tp_print: 0, - tp_getattr: matrix_getattr, - tp_setattr: matrix_setattr, - tp_compare: 0, - tp_repr: 0, - tp_as_number: 0, - tp_as_sequence: 0, - tp_as_mapping: 0, - tp_hash: 0, // dict(x) - tp_call: 0, // x() - tp_str: 0 // str(x) -}; -//---------------------------------------------------------------------------- -typedef struct { - PyObject_HEAD - CXFORM cxform; -} CXFormObject; - -PyObject* f_ColorTransform(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - int r0=256,g0=256,b0=256,a0=256,r1=0,g1=0,b1=0,a1=0; - static char *kwlist[] = {"r_mul", "g_mul", "b_mul", "a_mul", "r_add", "g_add", "b_add", "a_add", NULL}; - PyObject*color; - if(!kwargs) { - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iiiiiiii", kwlist, - &r0,&g0,&b0,&a0, - &r1,&g1,&b1,&a1)) - return NULL; - } - - CXFORM c; - c.r0 = r0; c.g0 = g0; c.b0 = b0; c.a0 = a0; - c.r1 = r1; c.g1 = g1; c.b1 = b1; c.a1 = a1; - - CXFormObject*self = PyObject_New(CXFormObject, &CXFormClass); - self->cxform = c; - return (PyObject*)self; -} -static PyObject* colortransform_getattr(PyObject * self, char* a) -{ - return NULL; -} -static int colortransform_setattr(PyObject * self, char* a, PyObject* o) -{ - return 0; -} -CXFORM colortransform_getCXForm(PyObject*self) -{ - CXFormObject*cxform= 0; - if (!PyArg_Parse(self, "O!", &CXFormClass, &cxform)) { - CXFORM dummy; - memset(&dummy, 0, sizeof(dummy)); - mylog("Error: wrong type for function color_getRGBA"); - return dummy; - } - return cxform->cxform; -} -void colortransform_dealloc(PyObject* self) -{ - mylog("-%08x(%d) colortransform_dealloc", self, self->ob_refcnt); - PyObject_Del(self); -} -PyTypeObject CXFormClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "ColorTransform", - tp_basicsize: sizeof(CXFormObject), - tp_itemsize: 0, - tp_dealloc: colortransform_dealloc, - tp_print: 0, - tp_getattr: colortransform_getattr, - tp_setattr: colortransform_setattr, -}; -//---------------------------------------------------------------------------- -typedef struct { - PyObject_HEAD - GRADIENT gradient; -} GradientObject; - -PyObject* f_Gradient(PyObject* self, PyObject* args, PyObject* kwargs) -{ - return NULL; -} -static PyObject* gradient_getattr(PyObject * self, char* a) -{ - return NULL; -} -static int gradient_setattr(PyObject * self, char* a, PyObject* o) -{ - return 0; -} -GRADIENT gradient_getGradient(PyObject*self) -{ - GradientObject*gradient = 0; - if (!PyArg_Parse(self, "O!", &gradient, &gradient)) { - GRADIENT dummy; - memset(&dummy, 0, sizeof(dummy)); - mylog("Error: wrong type for function color_getRGBA"); - return dummy; - } - return gradient->gradient; -} -void gradient_dealloc(PyObject* self) -{ - mylog("-%08x(%d) gradient_dealloc", self, self->ob_refcnt); - PyObject_Del(self); -} -PyTypeObject GradientClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "Gradient", - tp_basicsize: sizeof(GradientObject), - tp_itemsize: 0, - tp_dealloc: gradient_dealloc, - tp_print: 0, - tp_getattr: gradient_getattr, - tp_setattr: gradient_setattr, -}; -//---------------------------------------------------------------------------- - -typedef struct { - PyObject_HEAD - LINESTYLE ls; -} LineStyleObject; - -PyObject* f_LineStyle2(RGBA color, int width) -{ - LineStyleObject* self = PyObject_New(LineStyleObject, &LineStyleClass); - self->ls.color = color; - self->ls.width = width; - return (PyObject*)self; -} -PyObject* f_LineStyle3(LINESTYLE ls) -{ - LineStyleObject* self = PyObject_New(LineStyleObject, &LineStyleClass); - self->ls = ls; - return (PyObject*)self; -} -PyObject* f_LineStyle(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"line", "color", NULL}; - float linewidth; - PyObject*color; - if(!kwargs) { - if (!PyArg_ParseTuple(args, "fO!", &linewidth, &ColorClass, &color)) - return NULL; - } - return f_LineStyle2(color_getRGBA(color), (int)(linewidth*20)); -} -LINESTYLE linestyle_getLineStyle(PyObject*_self) -{ - LineStyleObject* self = (LineStyleObject*)_self; - return self->ls; -} -static PyObject* linestyle_getattr(PyObject * _self, char* a) -{ - LineStyleObject*self = (LineStyleObject*)_self; - if(!strcmp(a, "width")) { - return Py_BuildValue("i", self->ls.width); - } else if(!strcmp(a, "color")) { - return f_Color2(self->ls.color.r, self->ls.color.g, self->ls.color.b, self->ls.color.a); - } - return NULL; -} -static int linestyle_setattr(PyObject * _self, char* a, PyObject* o) -{ - LineStyleObject*self = (LineStyleObject*)_self; - if(!strcmp(a, "color")) { - self->ls.color = color_getRGBA(o); - return 0; - } - return -1; -} -static LINESTYLE linestyle_getlinestyle(PyObject*_self) -{ - LineStyleObject*self = (LineStyleObject*)_self; - return self->ls; -} -static void linestyle_dealloc(PyObject* self) -{ - mylog("-%08x(%d) linestyle_dealloc", self, self->ob_refcnt); - PyObject_Del(self); -} -static int linestyle_print(PyObject * _self, FILE *fi, int flags) //flags&Py_PRINT_RAW -{ - LineStyleObject* self = (LineStyleObject*)_self; - fprintf(fi, "line-%d-%02x%02x%02x%02x", self->ls.width, self->ls.color.r, self->ls.color.g, self->ls.color.b, self->ls.color.a); - return 0; -} -PyTypeObject LineStyleClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "linestyle", - tp_basicsize: sizeof(LineStyleObject), - tp_itemsize: 0, - tp_dealloc: linestyle_dealloc, - tp_print: linestyle_print, - tp_getattr: linestyle_getattr, - tp_setattr: linestyle_setattr, -}; -//---------------------------------------------------------------------------- - -typedef struct { - PyObject_HEAD - FILLSTYLE fs; -} FillStyleObject; - -PyObject* f_FillStyle2(FILLSTYLE fs) -{ - FillStyleObject* self = PyObject_New(FillStyleObject, &FillStyleClass); - self->fs = fs; - return (PyObject*)self; -} -PyObject* f_SolidFillStyle2(RGBA color) -{ - FillStyleObject* self = PyObject_New(FillStyleObject, &FillStyleClass); - self->fs.type = FILL_SOLID; - self->fs.color = color; - return (PyObject*)self; -} -PyObject* f_SolidFillStyle(PyObject* _self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"color", NULL}; - PyObject*color; - if(!kwargs) { - if (!PyArg_ParseTuple(args, "O!", &ColorClass, &color)) - return NULL; - } - return f_SolidFillStyle2(color_getRGBA(color)); -} -FILLSTYLE fillstyle_getFillStyle(PyObject*_self) -{ - FillStyleObject* self = (FillStyleObject*)_self; - return self->fs; -} -static void fillstyle_dealloc(PyObject* self) -{ - mylog("-%08x(%d) linestyle_dealloc", self, self->ob_refcnt); - PyObject_Del(self); -} -static int fillstyle_print(PyObject * _self, FILE *fi, int flags) //flags&Py_PRINT_RAW -{ - FillStyleObject* self = (FillStyleObject*)_self; - if(self->fs.type == FILL_SOLID) - fprintf(fi, "fill-solid(%02x%02x%02x%02x)", self->fs.color.r, self->fs.color.g, self->fs.color.b, self->fs.color.a); - else - fprintf(fi, "fill-%02x", self->fs.type); - return 0; -} -PyObject* fillstyle_issolid(PyObject*_self, PyObject*args) -{ - FillStyleObject* self = (FillStyleObject*)_self; - int b = self->fs.type == FILL_SOLID; - return PyInt_FromLong(b); -} -static PyMethodDef FillStyleMethods[] = -{ - /* Module functions */ - {"isSolid", fillstyle_issolid, METH_VARARGS, "Queries whether this is a solid fill"}, - {0,0,0,0} -}; -static PyObject* fillstyle_getattr(PyObject * _self, char* a) -{ - FillStyleObject* self = (FillStyleObject*)_self; - if(!strcmp(a, "color")) { - return f_Color2(self->fs.color.r, self->fs.color.g, self->fs.color.b, self->fs.color.a); - } - return Py_FindMethod(FillStyleMethods, _self, a); -} -static int fillstyle_setattr(PyObject * _self, char* a, PyObject* o) -{ - FillStyleObject*self = (FillStyleObject*)_self; - if(!strcmp(a, "color")) { - self->fs.color = color_getRGBA(o); - return 0; - } - return -1; -} - -PyTypeObject FillStyleClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "fillstyle", - tp_basicsize: sizeof(FillStyleObject), - tp_itemsize: 0, - tp_dealloc: fillstyle_dealloc, - tp_print: fillstyle_print, - tp_getattr: fillstyle_getattr, - tp_setattr: fillstyle_setattr, -}; -//---------------------------------------------------------------------------- -static PyMethodDef primitive_methods[] = -{ - {"Color", (PyCFunction)f_Color, METH_KEYWORDS, "Create a new color object."}, - {"Gradient", (PyCFunction)f_Gradient, METH_KEYWORDS, "Create a new gradient object."}, - {"ColorTransform", (PyCFunction)f_ColorTransform, METH_KEYWORDS, "Create a new colortransform object."}, - {"Matrix", (PyCFunction)f_Matrix, METH_KEYWORDS, "Create a new matrix object."}, - {"BBox", (PyCFunction)f_BBox, METH_KEYWORDS, "Create a new bounding box object."}, - {"SolidFillStyle", (PyCFunction)f_SolidFillStyle, METH_KEYWORDS, "Creates a new solid fill style."}, - {"LineStyle", (PyCFunction)f_SolidFillStyle, METH_KEYWORDS, "Creates a new line style."}, - {NULL, NULL, 0, NULL} -}; - -PyMethodDef* primitive_getMethods() -{ - GradientClass.ob_type = &PyType_Type; - CXFormClass.ob_type = &PyType_Type; - BBoxClass.ob_type = &PyType_Type; - MatrixClass.ob_type = &PyType_Type; - FillStyleClass.ob_type = &PyType_Type; - LineStyleClass.ob_type = &PyType_Type; - return primitive_methods; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.h b/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.h deleted file mode 100644 index d9ea336d5..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/primitives.h +++ /dev/null @@ -1,64 +0,0 @@ -/* primitives.h - - Python wrapper for librfxswf- primitive objects (structs, prototypes) - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __primitives_h__ -#define __primitives_h__ - -#include -#undef HAVE_STAT - -#include "../rfxswf.h" - -/* exported to allow casting to this type */ -extern PyTypeObject ColorClass; -extern PyTypeObject BBoxClass; -extern PyTypeObject CXFormClass; -extern PyTypeObject GradientClass; -extern PyTypeObject MatrixClass; -extern PyTypeObject LineStyleClass; -extern PyTypeObject FillStyleClass; - -PyObject* f_Color(PyObject* self, PyObject* args, PyObject* kwargs); -PyObject* f_ColorTransform(PyObject* self, PyObject* args, PyObject* kwargs); -PyObject* f_Gradient(PyObject* self, PyObject* args, PyObject* kwargs); -PyObject* f_BBox(PyObject* self, PyObject* args, PyObject* kwargs); -PyObject* f_BBox2(SRECT bbox); -PyObject* f_Matrix(PyObject* self, PyObject* args, PyObject* kwargs); -PyObject* f_Matrix2(MATRIX* m); -PyObject* f_FillStyle2(FILLSTYLE fs); -PyObject* f_SolidFillstyle(PyObject* self, PyObject* args, PyObject* kwargs); -PyObject* f_SolidFillstyle2(RGBA color); -PyObject* f_LineStyle(PyObject* self, PyObject* args, PyObject* kwargs); -PyObject* f_LineStyle2(RGBA color, int width); -PyObject* f_LineStyle3(LINESTYLE ls); - -RGBA color_getRGBA(PyObject*self); -CXFORM colortransform_getCXForm(PyObject*self); -GRADIENT gradient_getGradient(PyObject*self); -SRECT bbox_getSRECT(PyObject*self); -MATRIX matrix_getMatrix(PyObject*self); -FILLSTYLE fillstyle_getFillStyle(PyObject*self); -LINESTYLE linestyle_getLineStyle(PyObject*self); - -extern PyMethodDef* primitive_getMethods(); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/pyutils.c b/fluidbook/tools/swftools-special-swfdump/lib/python/pyutils.c deleted file mode 100644 index f5362fcbf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/pyutils.c +++ /dev/null @@ -1,85 +0,0 @@ -#include -#include -#include -#include -#include - -char* setError(char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - return strdup(buf); -} - -static int verbose = 0; -void mylog(char*format, ...) -{ - char buf[1024]; - int l; - va_list arglist; - if(!verbose) - return; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - fprintf(stderr, "[SWF] %s\n", buf); - fflush(stderr); -} - -#define PY_NONE Py_BuildValue("s", 0) - -PyObject* FindMethodMore(PyObject*ret, PyMethodDef f[], PyObject*self, char* a) -{ - if(ret==NULL) { - ret = Py_FindMethod(f, self, a); - } else { - if(!strcmp(a, "__methods__")) { - /* we are being dir()ed. Complete the function table */ - PyObject* add = Py_FindMethod(f, self, a); - int t; - mylog("taglist_getattr: append common funtions %08x %08x\n", ret, add); - for(t=0;t - -#define PY_NONE Py_BuildValue("s", 0) - -extern int verbose; - -void setVerbosity(int verbose); - -char* setError(char*format, ...); -void mylog(char*format, ...); -PyObject* FindMethodMore(PyObject*ret, PyMethodDef f[], PyObject*self, char* a); -void dummy_dealloc(PyObject* self); -PyMethodDef* addMethods(PyMethodDef*obj1, PyMethodDef*obj2); - -#define PY_CHECK_TYPE(o,c) ((o)->ob_type == (c)) -#define PY_ASSERT_TYPE(o,c) {if((o)->ob_type != (c)) {printf("Invalid type: %08x(%d)", (int)(o), (o)->ob_refcnt);exit(1);}} - -#define PY_ERROR(s,args...) (PyErr_SetString(PyExc_Exception, setError(s, ## args)),NULL) -#define PY_TYPE(o) ((o)->ob_type->tp_name) -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tag.c b/fluidbook/tools/swftools-special-swfdump/lib/python/tag.c deleted file mode 100644 index f495499fb..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/tag.c +++ /dev/null @@ -1,390 +0,0 @@ -#include -#undef HAVE_STAT -#include "../rfxswf.h" -#include "../log.h" -#include "./pyutils.h" -#include "primitives.h" -#include "action.h" -#include "tag.h" -#include "tagmap.h" - -//---------------------------------------------------------------------------- - -typedef struct _TagObject { - PyObject_HEAD - tag_internals_t internals; -} TagObject; - -//---------------------------------------------------------------------------- -static PyMethodDef generic_methods[] = -{ - {NULL, NULL, 0, NULL} -}; -static tag_internals_t generic_tag = -{ - parse: 0, - dealloc: 0, - fillTAG: 0, - tagfunctions: generic_methods, - datasize: 0, -}; -//---------------------------------------------------------------------------- - -static struct tag_parser { - int id; - tag_internals_t*spec; - struct tag_parser* next; -} tag_parsers[1024]; -static char parsers_initialized = 0; - -void register_tag(int id, tag_internals_t*spec) -{ - assert(id>=0 && id<1024); - if(!parsers_initialized) { - memset(tag_parsers, 0, sizeof(tag_parsers)); - parsers_initialized = 1; - } - tag_parsers[id].id = id; - tag_parsers[id].spec = spec; -}; - -static tag_internals_t* get_parser(int id) -{ - if(parsers_initialized<2) { - int t; - struct tag_parser*last = &tag_parsers[0]; - for(t=0;t<1024;t++) { - if(tag_parsers[t].spec) { - last->next = &tag_parsers[t]; - last = &tag_parsers[t]; - } - } - parsers_initialized = 2; - } - assert(id>=0 && id<1024); - return tag_parsers[id].spec; -} - -//---------------------------------------------------------------------------- -static void tag_dealloc(PyObject * self) -{ - TagObject*tag = (TagObject*)self; - if(tag->internals.tag) - mylog("-%08x(%d) tag_dealoc [%s]\n", (int)self, self->ob_refcnt, swf_TagGetName(tag->internals.tag)); - else - mylog("-%08x(%d) tag_dealoc [?]\n", (int)self, self->ob_refcnt); - if(tag->internals.dealloc) { - if(!tag->internals.data) - mylog("-%08x(%d) tag_dealoc: Warning: calling dealloc without any data(?)\n", (int)self, self->ob_refcnt); - tag->internals.dealloc(&tag->internals); - } - if(tag->internals.data) { - free(tag->internals.data); - tag->internals.data = 0; - } - if(tag->internals.tag) { - swf_DeleteTag(0, tag->internals.tag); - tag->internals.tag = 0; - } - Py_DECREF(tag->internals.tagmap); - tag->internals.tagmap = 0; - PyObject_Del(self); -} -//---------------------------------------------------------------------------- -static int fillTAG(PyObject*self) -{ - TagObject*tag = (TagObject*)self; - if(tag->internals.tag) - return 1; - if(!tag->internals.fillTAG) { - PyErr_SetString(PyExc_Exception, setError("No way to fill TAG with data")); - return 0; - } - if(!tag->internals.fillTAG(&tag->internals)) { - return 0; // pass through exception - } - if(!tag->internals.tag) { - PyErr_SetString(PyExc_Exception, setError("Couldn't fill tag")); - return 0; - } - return 1; -} -//---------------------------------------------------------------------------- -static PyObject* tag_isShape(PyObject * _self, PyObject*args) -{ - TagObject*self = (TagObject*)_self; - if(!PyArg_ParseTuple(args, "")) return NULL; - if(!fillTAG((PyObject*)self)) return NULL; - return PyInt_FromLong(swf_isShapeTag(self->internals.tag)); -} -static PyObject* tag_isFont(PyObject * _self, PyObject*args) -{ - TagObject*self = (TagObject*)_self; - if(!PyArg_ParseTuple(args, "")) return NULL; - if(!fillTAG((PyObject*)self)) return NULL; - int id = self->internals.tag->id; - int isfont=0; - if(id == ST_DEFINEFONT || id == ST_DEFINEFONT2) - isfont = 1; - return PyInt_FromLong(isfont); -} -static PyObject* tag_isImage(PyObject * _self, PyObject*args) -{ - TagObject*self = (TagObject*)_self; - if(!PyArg_ParseTuple(args, "")) return NULL; - if(!fillTAG((PyObject*)self)) return NULL; - return PyInt_FromLong(swf_isImageTag(self->internals.tag)); -} -static PyObject* tag_isDefiningTag(PyObject * _self, PyObject*args) -{ - TagObject*self = (TagObject*)_self; - if(!PyArg_ParseTuple(args, "")) return NULL; - if(!fillTAG((PyObject*)self)) return NULL; - return PyInt_FromLong(swf_isDefiningTag(self->internals.tag)); -} -static PyObject* tag_isPlacement(PyObject * _self, PyObject*args) -{ - TagObject*self = (TagObject*)_self; - if(!PyArg_ParseTuple(args, "")) return NULL; - if(!fillTAG((PyObject*)self)) return NULL; - return PyInt_FromLong((self->internals.tag->id == ST_PLACEOBJECT || - self->internals.tag->id == ST_PLACEOBJECT2)); -} -static PyObject* tag_getBBox(PyObject * _self, PyObject*args) -{ - TagObject*self = (TagObject*)_self; - if(!PyArg_ParseTuple(args, "")) return NULL; - if(!fillTAG((PyObject*)self)) return NULL; - return f_BBox2(swf_GetDefineBBox(self->internals.tag)); -} -static PyObject* tag_setBBox(PyObject * _self, PyObject*args) -{ - TagObject*self = (TagObject*)_self; - PyObject*bbox = 0; - if(!PyArg_ParseTuple(args, "O!", &BBoxClass, &bbox)) return NULL; - if(!fillTAG((PyObject*)self)) return NULL; - swf_SetDefineBBox(self->internals.tag, bbox_getSRECT(bbox)); - return PY_NONE; -} -//---------------------------------------------------------------------------- -static PyMethodDef common_tagfunctions[] = -{{"isShape", tag_isShape, METH_VARARGS, "tests whether the tag is a shape tag"}, - {"isImage", tag_isImage, METH_VARARGS, "tests whether the tag is an image"}, - {"isFont", tag_isFont, METH_VARARGS, "tests whether the tag is a font"}, - {"isDefiningTag", tag_isDefiningTag, METH_VARARGS, "tests whether the tag is a defining tag"}, - {"isPlacement", tag_isPlacement, METH_VARARGS, "tests whether the tag is a placement"}, - {"getBBox", tag_getBBox, METH_VARARGS, "get's the tags bounding box"}, - {"setBBox", tag_setBBox, METH_VARARGS, "set's the tags bounding box"}, - {NULL, NULL, 0, NULL} -}; - -static PyObject* tag_getattr(PyObject * self, char* a) -{ - TagObject*tag = (TagObject*)self; - PyObject* ret = NULL; - int t; - - /* -- fields -- */ - if(!strcmp(a, "tagid")) { - if(!fillTAG(self)) - return 0; - return Py_BuildValue("i", tag->internals.tag->id); - } - if(!strcmp(a, "name")) { - if(!fillTAG(self)) - return 0; - char* name = swf_TagGetName(tag->internals.tag); - return Py_BuildValue("s", name); - } - if(!strcmp(a, "data")) { - if(!fillTAG(self)) - return 0; - return Py_BuildValue("s#", tag->internals.tag->data, tag->internals.tag->len); - } - if(tag->internals.getattr) { - PyObject* ret = tag->internals.getattr(&tag->internals, a); - if(ret) return ret; - } - - /* search for a tag specific function */ - if(tag->internals.tagfunctions) { - mylog(" %08x(%d) tag_getattr: tag has specific functions\n", (int)self, self->ob_refcnt); - ret = Py_FindMethod(tag->internals.tagfunctions, self, a); - if(ret) return ret; - PyErr_Clear(); - ret = FindMethodMore(ret, common_tagfunctions, self, a); - mylog(" %08x(%d) tag_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); - if(ret) return ret; - PyErr_Clear(); - } - - ret = Py_FindMethod(common_tagfunctions, self, a); - - mylog(" %08x(%d) tag_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); - return ret; -} -static int tag_setattr(PyObject * _self, char* a, PyObject * o) -{ - TagObject*self= (TagObject*)_self; - /* a setattr will almost certainly change the tag data, - so delete the tag */ - if(self->internals.tag) { - swf_DeleteTag(0, self->internals.tag); - self->internals.tag = 0; - } - if(self->internals.setattr) { - int ret = self->internals.setattr(&self->internals, a, o); - return ret; - } - return 1; -} -//---------------------------------------------------------------------------- -// Tag Constructors -//---------------------------------------------------------------------------- -PyObject* tag_new(tag_internals_t*tag_internals) -{ - TagObject*tag = PyObject_New(TagObject, &TagClass); - mylog("+%08x(%d) tag_new\n", (int)tag, tag->ob_refcnt); - memcpy(&tag->internals, tag_internals, sizeof(tag_internals_t)); - if(tag->internals.datasize) { - tag->internals.data = malloc(tag->internals.datasize); - memset(tag->internals.data , 0, tag->internals.datasize); - } else { - tag->internals.data = 0; - } - tag->internals.tag = 0; - tag->internals.tagmap = tagmap_new(); - - return (PyObject*)tag; -} -PyObject* tag_new2(TAG*t, PyObject* tagmap) -{ - TagObject*tag = PyObject_New(TagObject, &TagClass); - mylog("+%08x(%d) tag_new2 tag=%08x id=%d (%s)\n", (int)tag, tag->ob_refcnt, t, t->id, swf_TagGetName(t)); - - PyObject*mytagmap = tagmap_new(); - - int num = swf_GetNumUsedIDs(t); - if(num) { // tag has dependencies - int * positions = malloc(num*sizeof(int)); - swf_GetUsedIDs(t, positions); - int i; - for(i=0;idata[positions[i]]); - PyObject*obj = tagmap_id2obj(tagmap, id); - if(obj==NULL) { - PyErr_SetString(PyExc_Exception, setError("TagID %d not defined", id)); - return NULL; - } - //mylog("+%08x(%d) tag_new2 handling id %d at %d/%d\n", (int)tag, tag->ob_refcnt, id, positions[i], t->len); - //mylog("+%08x(%d) tag_new2 add dependency %d to id %d, object %08x(%d)\n", (int)tag, tag->ob_refcnt, i, id, obj, obj->ob_refcnt); - tagmap_addMapping(mytagmap, id, obj); - } - free(positions); - } - - tag_internals_t*spec = get_parser(t->id); - if(spec) { - memcpy(&tag->internals, spec, sizeof(tag_internals_t)); - } else { - memcpy(&tag->internals, &generic_tag, sizeof(tag_internals_t)); - } - if(tag->internals.datasize) { - tag->internals.data = malloc(tag->internals.datasize); - memset(tag->internals.data, 0, tag->internals.datasize); - } else { - tag->internals.data = 0; - } - tag->internals.tag = swf_InsertTag(0, t->id); - swf_SetBlock(tag->internals.tag, t->data, t->len); - tag->internals.tagmap = mytagmap; - - // call tag->internals.init()? - - return (PyObject*)tag; -} -//---------------------------------------------------------------------------- -/* serialize */ -TAG* tag_getTAG(PyObject*self, TAG*prevTag, PyObject*tagmap) -{ - TagObject*tag = (TagObject*)self; - - if(!fillTAG(self)) - return 0; - mylog(" %08x(%d) tag_getTAG: tag=%08x id=%d (%s)", (int)self, self->ob_refcnt, tag->internals.tag, tag->internals.tag->id, swf_TagGetName(tag->internals.tag)); - - TAG* t = swf_InsertTag(prevTag, tag->internals.tag->id); - swf_SetBlock(t, tag->internals.tag->data, tag->internals.tag->len); - - if(swf_isDefiningTag(t)) { - int newid = tagmap_add(tagmap, self); - swf_SetDefineID(t, newid); - } - - int num = swf_GetNumUsedIDs(t); - if(num) { // tag has dependencies - int * positions = malloc(num*sizeof(int)); - swf_GetUsedIDs(t, positions); - int i; - for(i=0;idata[positions[i]]); - PyObject* obj = tagmap_id2obj(tag->internals.tagmap, id); - if(obj==NULL) { - PyErr_SetString(PyExc_Exception, setError("Internal error: id %d not known in taglist:")); - free(positions); - return 0; - } - //int newid = tagmap_obj2id(tag->internals.tagmap, obj); - int newid = tagmap_obj2id(tagmap, obj); - if(newid>=0) { - mylog(" %08x(%d) tag_getTAG: dependency %d) %d->%08x -> assigning(%08x) id %d", (int)self, self->ob_refcnt, i, id, obj, tagmap, newid); - } else { - /* TODO: this is only needed for sprites, so maybe it should throw an - exception otherwise */ - newid = tagmap_add(tagmap, obj); - mylog(" %08x(%d) tag_getTAG: added dependency %d) %d->%08x -> assigning(%08x) id %d", (int)self, self->ob_refcnt, i, id, obj, tagmap, newid); - } - PUT16(&t->data[positions[i]], newid); - } - free(positions); - } - return t; -} -//---------------------------------------------------------------------------- -tag_internals_t* tag_getinternals(PyObject*self) -{ - TagObject*tag = (TagObject*)self; - mylog(" %08x(%d) tag_getInternals\n", (int)self, self->ob_refcnt); - return &tag->internals; -} -//---------------------------------------------------------------------------- -PyObject* tag_getDependencies(PyObject*self) -{ - TagObject*tag = (TagObject*)self; - mylog(" %08x(%d) tag_getDependencies\n", (int)self, self->ob_refcnt); - return tagmap_getObjectList(tag->internals.tagmap); -} -//---------------------------------------------------------------------------- -int tag_print(PyObject * self, FILE * fi, int flags) -{ - TagObject*tag = (TagObject*)self; - mylog(" %08x(%d) tag_print flags=%08x\n", (int)self, self->ob_refcnt, flags); - if(!fillTAG(self)) - return -1; - //fprintf(fi, "tag-%08x-%d-%s", (int)tag->internals.tag, tag->internals.tag->id, swf_TagGetName(tag->internals.tag)); - fprintf(fi, "%s", swf_TagGetName(tag->internals.tag)); - return 0; -} -//---------------------------------------------------------------------------- -PyTypeObject TagClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "Tag", - tp_basicsize: sizeof(TagObject), - tp_itemsize: 0, - tp_dealloc: tag_dealloc, - tp_print: tag_print, - tp_getattr: tag_getattr, - tp_setattr: tag_setattr, -}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tag.h b/fluidbook/tools/swftools-special-swfdump/lib/python/tag.h deleted file mode 100644 index 98f8b82a9..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/tag.h +++ /dev/null @@ -1,57 +0,0 @@ -/* tag.h - - Python wrapper for librfxswf- tag handlers - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __tag_h__ -#define __tag_h__ - -#include -#undef HAVE_STAT -#include "../rfxswf.h" - -#include "tagmap.h" - -typedef struct _tag_internals -{ - int (*parse)(struct _tag_internals*); - int (*fillTAG)(struct _tag_internals*); - void (*dealloc)(struct _tag_internals*); - int datasize; - void*data; - PyObject* (*getattr)(struct _tag_internals*, char* a); - int (*setattr)(struct _tag_internals*, char* a, PyObject*val); - PyMethodDef* tagfunctions; - TAG*tag; - PyObject* tagmap; -} tag_internals_t; - -PyObject* tag_new(tag_internals_t*tag_internals); -PyObject* tag_new2(TAG*_tag, PyObject* tagmap); -TAG* tag_getTAG(PyObject*self, TAG*prevTag, PyObject*tagmap); -PyObject* tag_getDependencies(PyObject*self); -tag_internals_t* tag_getinternals(PyObject*tag); -void register_tag(int id, tag_internals_t*spec); - -PyMethodDef* tag_getMethods(); - -extern PyTypeObject TagClass; - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.c b/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.c deleted file mode 100644 index 0a30c08e3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.c +++ /dev/null @@ -1,332 +0,0 @@ -#include -#undef HAVE_STAT -#include "../rfxswf.h" -#include "../log.h" -#include "./pyutils.h" -#include "primitives.h" -#include "action.h" -#include "tag.h" -#include "tagmap.h" -#include "taglist.h" - -//---------------------------------------------------------------------------- -typedef struct { - PyObject_HEAD - PyObject* taglist; -} TagListObject; -//---------------------------------------------------------------------------- -static void taglist_showcontents(PyObject* self) -{ - TagListObject*taglist = (TagListObject*)self; - int t, l = PyList_Size(taglist->taglist); - for(t=0;ttaglist, t); - mylog(" %08x(%d) taglist_showcontents item=%08x(%d)\n", (int)self, self->ob_refcnt, item, item->ob_refcnt); - } -} -//---------------------------------------------------------------------------- -PyObject * taglist_new() -{ - TagListObject* taglist = PyObject_New(TagListObject, &TagListClass); - mylog("+%08x(%d) taglist_new", (int)taglist, taglist->ob_refcnt); - taglist->taglist = PyList_New(0); - return (PyObject*)taglist; -} -//---------------------------------------------------------------------------- -PyObject * taglist_new2(TAG*tag) -{ - TagListObject* taglist = PyObject_New(TagListObject, &TagListClass); - mylog("+%08x(%d) taglist_new2 tag=%08x", (int)taglist, taglist->ob_refcnt, tag); - PyObject* tagmap = tagmap_new(); - - int nr=0, len=0; - TAG*t = tag; - TAG*last = t; - while(t) {len++;last=t;t=t->next;} - - if(last && last->id==ST_END) { - swf_DeleteTag(0, last); last = 0; - len--; - if(len==0) tag = 0; - } - - taglist->taglist = PyList_New(len); - - nr = 0; - t = tag; - while(t) { - PyObject*newtag = tag_new2(t, tagmap); - if(newtag==NULL) { - // pass through exception - Py_DECREF(tagmap); - return NULL; - } - PyList_SET_ITEM(taglist->taglist,nr,newtag);Py_INCREF(newtag); - if(swf_isDefiningTag(t)) { - int id = swf_GetDefineID(t); - tagmap_addMapping(tagmap, id, newtag); - } - nr++; - t=t->next; - Py_DECREF(newtag); - } - Py_DECREF(tagmap); - return (PyObject*)taglist; -} -//---------------------------------------------------------------------------- -TAG* taglist_getTAGs(PyObject*self) -{ - PyObject* tagmap = tagmap_new(); - TAG* tag = taglist_getTAGs2(self, tagmap, 1); - Py_DECREF(tagmap); - return tag; -} -//---------------------------------------------------------------------------- -TAG* taglist_getTAGs2(PyObject*self, PyObject*tagmap, int addDependencies) -{ - if(!PY_CHECK_TYPE(self,&TagListClass)) { - PyErr_SetString(PyExc_Exception, setError("Not a taglist (%08x).", self)); - return 0; - } - TagListObject*taglist = (TagListObject*)self; - - /* TODO: the tags will be modified by this. We should set mutexes. */ - - int l = PyList_Size(taglist->taglist); - int t; - TAG* tag = 0; - TAG* firstTag = 0; - mylog(" %08x(%d) taglist_getTAGs", (int)self, self->ob_refcnt); - for(t=0;ttaglist, t); - if(addDependencies) { - PyObject* deps = tag_getDependencies(item); - int l = PyList_Size(deps); - int t; - for(t=0;tfirstTag; - swf_FoldAll(&swf); - taglist->firstTag = swf.firstTag; - taglist->lastTag = 0; // FIXME - taglist->searchTag = 0;*/ - return PY_NONE; -} -//---------------------------------------------------------------------------- -static PyObject * taglist_unfoldAll(PyObject* self, PyObject* args) -{ - SWF swf; -/* TagListObject*taglist = (TagListObject*)self; - if(!self || !PyArg_ParseTuple(args,"")) - return NULL; - swf.firstTag = taglist->firstTag; - swf_UnFoldAll(&swf); - taglist->firstTag = swf.firstTag; - taglist->lastTag = 0; // FIXME - taglist->searchTag = 0;*/ - return PY_NONE; -} -//---------------------------------------------------------------------------- -static PyObject * taglist_optimizeOrder(PyObject* self, PyObject* args) -{ - SWF swf; -/* TagListObject*taglist = (TagListObject*)self; - if(!self || !PyArg_ParseTuple(args,"")) - return NULL; - swf.firstTag = taglist->firstTag; - swf_UnFoldAll(&swf); - taglist->firstTag = swf.firstTag; - taglist->lastTag = 0; // FIXME - taglist->searchTag = 0;*/ - return PY_NONE; -} -//---------------------------------------------------------------------------- -static PyMethodDef taglist_functions[] = -{{"foldAll", taglist_foldAll, METH_VARARGS, "fold all sprites (movieclips) in the list"}, - {"unfoldAll", taglist_unfoldAll, METH_VARARGS, "unfold (expand) all sprites (movieclips) in the list"}, - {"optimizeOrder", taglist_optimizeOrder, METH_VARARGS, "Reorder the Tag structure"}, - {NULL, NULL, 0, NULL} -}; - -static PyObject* taglist_getattr(PyObject * self, char* a) -{ - PyObject* ret = Py_FindMethod(taglist_functions, self, a); - mylog(" %08x(%d) taglist_getattr %s: %08x\n", (int)self, self->ob_refcnt, a, ret); - return ret; -} -//---------------------------------------------------------------------------- -static int taglist_length(PyObject * self) -{ - TagListObject*tags = (TagListObject*)self; - mylog(" %08x(%d) taglist_length", (int)self, self->ob_refcnt); - return PyList_GET_SIZE(tags->taglist); -} -//---------------------------------------------------------------------------- -static int taglist_contains(PyObject * self, PyObject * tag) -{ - /* TODO: optimize! */ - TagListObject*taglist = (TagListObject*)self; - PyObject*list = taglist->taglist; - int l = PyList_Size(list); - int t; - for(t=0;tob_refcnt, list, list->ob_refcnt); - - if (PyArg_Parse(list, "O!", &TagClass, &tag)) { - if(!taglist_contains(self, tag)) { - mylog(" %08x(%d) taglist_concat: Adding Tag %08x(%d)", (int)self, self->ob_refcnt, tag, tag->ob_refcnt); - PyList_Append(taglist->taglist, tag); - } else { - mylog(" %08x(%d) taglist_concat: Already contains Tag %08x(%d)", (int)self, self->ob_refcnt, tag, tag->ob_refcnt); - } - Py_INCREF(self); - return self; - /* copy tag, so we don't have to do INCREF(tag) (and don't - get problems if the tag is appended to more than one - taglist) */ - /* TODO: handle IDs */ - /* - TAG*t = tag_getTAG(tag); - TAG*nt = 0; - mylog("taglist_concat: Tag", (int)self, self->ob_refcnt); - // copy tag - nt = swf_InsertTag(0, t->id); - swf_SetBlock(nt,t->data,t->len); - PyObject*newtag = tag_new(taglist->swf, nt); - if(swf_isDefiningTag(t)) { - int id = swf_GetDefineID(t); - PyObject*id = PyLong_FromLong(id); - PyDict_SetItem((PyObject*)(taglist->char2id), list, id); - Py_INCREF(id); - PyDict_SetItem((PyObject*)(taglist->id2char), id, list); - Py_INCREF(id); - } - Py_INCREF(self); - return self;*/ - } - PyErr_Clear(); - if (PyList_Check(list)) { - int l = PyList_Size(list); - int t; - for(t=0;ttaglist); - - /*TAG* tags = taglist_getTAGs(self); - TAG* tags2 = taglist_getTAGs(list); - TAG* tags3; - tags3 = swf_Concatenate(tags,tags2); - PyObject* newtaglist = taglist_new(tags3); - swf_FreeTags(tags3); - Py_INCREF(newtaglist);*/ - } - PyErr_Clear(); - - PyErr_SetString(PyExc_Exception, setError("taglist concatenation only works with tags and lists (%08x).", list)); - return 0; -} -//---------------------------------------------------------------------------- -static PyObject * taglist_item(PyObject * self, int index) -{ - TagListObject*taglist = (TagListObject*)self; - PyObject*tag; - tag = PyList_GetItem(taglist->taglist, index); - if(!tag) - return 0; - mylog(" %08x(%d) taglist_item(%d): %08x", (int)self, self->ob_refcnt, index, tag); - Py_INCREF(tag); - return tag; -} -//---------------------------------------------------------------------------- -static void taglist_dealloc(PyObject* self) -{ - TagListObject*taglist = (TagListObject*)self; - mylog("-%08x(%d) taglist_dealloc list=%08x(%d)\n", (int)self, self->ob_refcnt, taglist->taglist, taglist->taglist->ob_refcnt); - Py_DECREF(taglist->taglist); - taglist->taglist = 0; - PyObject_Del(self); -} -//---------------------------------------------------------------------------- -static PySequenceMethods taglist_as_sequence = -{ - sq_length: taglist_length, // len(obj) - sq_concat: taglist_concat, // obj += [...], obj1+obj2 - sq_repeat: 0, // x*n, intargfunc - sq_item: taglist_item, // obj[3] - sq_slice: 0, // x[i:j] intintargfunc - sq_ass_item: 0, // x[i] = y intobjargproc - sq_ass_slice: 0, // x[i:j] = v intintobjargproc - sq_contains: taglist_contains, //??? -}; -PyTypeObject TagListClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "TagList", - tp_basicsize: sizeof(TagListObject), - tp_itemsize: 0, - tp_dealloc: taglist_dealloc, - tp_print: 0, // print x - tp_getattr: taglist_getattr, // x.attr - tp_setattr: 0, // x.attr = v - tp_compare: 0, // x>y - tp_repr: 0, // `x`, print x - tp_as_number: 0, - tp_as_sequence: &taglist_as_sequence, -}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.h b/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.h deleted file mode 100644 index 8eb9d7a9f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/taglist.h +++ /dev/null @@ -1,44 +0,0 @@ -/* taglist.h - - Python wrapper for librfxswf- taglist handlers, header file - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __taglist_h__ -#define __taglist_h__ - -#include -#undef HAVE_STAT -#include "../rfxswf.h" - -#include "./tagmap.h" - -extern PyTypeObject TagListClass; - -PyObject * taglist_new(); - -/* warning: will modify tag order*/ -PyObject * taglist_new2(TAG*tag); - -TAG* taglist_getTAGs(PyObject*); -/* for sprites: */ -TAG* taglist_getTAGs2(PyObject*self, PyObject*tagmap, int addDependencies); - -PyMethodDef* taglist_getMethods(); -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.c b/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.c deleted file mode 100644 index 66429e571..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.c +++ /dev/null @@ -1,165 +0,0 @@ -/* tagmap.c - - Python wrapper for librfxswf. - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#undef HAVE_STAT -#include "pyutils.h" -#include "tagmap.h" - -typedef struct { - PyObject_HEAD - PyObject* obj2id; - PyObject* id2obj; - PyObject* objlist; - int currentID; -} TagMapObject; - -//---------------------------------------------------------------------------- -PyObject* tagmap_new() -{ - PyObject* self = (PyObject*)PyObject_New(TagMapObject, &TagMapClass); - TagMapObject*tagmap = (TagMapObject*)self; - tagmap->obj2id = PyDict_New(); - tagmap->id2obj = PyDict_New(); - tagmap->objlist = PyList_New(0); - tagmap->currentID = 0; //IDs start at 1 -/* mylog("+%08x(%d) tagmap_new %08x(%d) %08x(%d), %08x(%d)", (int)self, self->ob_refcnt, - tagmap->obj2id, tagmap->obj2id->ob_refcnt , - tagmap->id2obj, tagmap->id2obj->ob_refcnt , - tagmap->objlist, tagmap->objlist->ob_refcnt);*/ - return self; -} - -//---------------------------------------------------------------------------- -int tagmap_obj2id(PyObject* self, PyObject* obj) -{ - TagMapObject*tagmap = (TagMapObject*)self; - PyObject*id = PyDict_GetItem(tagmap->obj2id, obj); - if(id == 0) - return -1; - int _id = PyLong_AsLong(id); - return _id; -} - -//---------------------------------------------------------------------------- -PyObject* tagmap_id2obj(PyObject* self, int _id) -{ - TagMapObject*tagmap = (TagMapObject*)self; - PyObject*id = PyLong_FromLong(_id); - PyObject*obj = PyDict_GetItem(tagmap->id2obj, id); - Py_DECREF(id); - return obj; -} -//---------------------------------------------------------------------------- -int tagmap_getFreeID(PyObject*self) -{ - TagMapObject*tagmap = (TagMapObject*)self; - int last = tagmap->currentID; - do { - tagmap->currentID++; - PyObject*id = PyLong_FromLong(tagmap->currentID); - PyObject*test = PyDict_GetItem(tagmap->id2obj,id); - Py_DECREF(id); - if(test == 0) { - PyErr_Clear(); - mylog(" %08x(%d) tagmap_getFreeID -> %d", (int)self, self->ob_refcnt, tagmap->currentID); - return tagmap->currentID; - } - } while(last != tagmap->currentID); - mylog(" %08x(%d) tagmap_getFreeID -> -1", (int)self, self->ob_refcnt); - return -1; -} -//---------------------------------------------------------------------------- -static void tagmap_add_mapping(PyObject*self, int id, PyObject* obj) -{ - TagMapObject*tagmap = (TagMapObject*)self; - PyList_Append(tagmap->objlist, obj);//Py_INCREF(obj); done by PyList_Append - PyObject*id_obj = PyLong_FromLong(id); - PyDict_SetItem(tagmap->obj2id, obj, id_obj);//Py_INCREF(id_obj);Py_INCREF(obj); done by PyDict_SetItem - PyDict_SetItem(tagmap->id2obj, id_obj, obj);//Py_INCREF(id_obj);Py_INCREF(obj); done by PyDict_SetItem - Py_DECREF(id_obj); -} -//---------------------------------------------------------------------------- -void tagmap_addMapping(PyObject*self, int id, PyObject* obj) -{ - TagMapObject*tagmap = (TagMapObject*)self; - int id2 = tagmap_obj2id(self, obj); - if(id2>=0) { - assert(id==id2); - return; - } - tagmap_add_mapping(self, id, obj); -} -//---------------------------------------------------------------------------- -int tagmap_add(PyObject* self, PyObject* obj) -{ - TagMapObject*tagmap = (TagMapObject*)self; - int id = tagmap_obj2id(self, obj); - if(id>=0) { - mylog(" %08x(%d) tagmap_add %08x->%d (again)", (int)self, self->ob_refcnt, (int)obj, id); - return id; - } - id = tagmap_getFreeID(self); - - tagmap_add_mapping(self, id, obj); - - mylog(" %08x(%d) tagmap_add %08x->%d", (int)self, self->ob_refcnt, (int)obj, id); - return id; -} - -//---------------------------------------------------------------------------- -void tagmap_dealloc(PyObject* self) -{ - TagMapObject*tagmap = (TagMapObject*)self; - mylog("-%08x(%d) tagmap_dealloc %08x(%d) %08x(%d), %08x(%d)", (int)self, self->ob_refcnt, - tagmap->obj2id, tagmap->obj2id->ob_refcnt , - tagmap->id2obj, tagmap->id2obj->ob_refcnt , - tagmap->objlist, tagmap->objlist->ob_refcnt); - - Py_DECREF(tagmap->obj2id); - tagmap->obj2id = 0; - Py_DECREF(tagmap->id2obj); - tagmap->id2obj = 0; - Py_DECREF(tagmap->objlist); - tagmap->objlist = 0; - PyObject_Del(self); -} -//---------------------------------------------------------------------------- -PyObject* tagmap_getObjectList(PyObject* self) -{ - mylog(" %08x(%d) tagmap_getObjectList", (int)self, self->ob_refcnt); - TagMapObject*tagmap = (TagMapObject*)self; - return tagmap->objlist; -} -//---------------------------------------------------------------------------- -PyTypeObject TagMapClass = -{ - PyObject_HEAD_INIT(NULL) - 0, - tp_name: "TagMap", - tp_basicsize: sizeof(TagMapObject), - tp_itemsize: 0, - tp_dealloc: tagmap_dealloc, - tp_print: 0, - tp_getattr: 0, - tp_setattr: 0, -}; diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.h b/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.h deleted file mode 100644 index 66f6ed42e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/tagmap.h +++ /dev/null @@ -1,39 +0,0 @@ -/* action.h - - Python wrapper for librfxswf- actionscript stuff (header) - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __tagmap_h__ -#define __tagmap_h__ - -#include -#undef HAVE_STAT -#include "../rfxswf.h" - -extern PyTypeObject TagMapClass; -int tagmap_obj2id(PyObject* self, PyObject* obj); -PyObject* tagmap_id2obj(PyObject* self, int _id); -int tagmap_add(PyObject* self, PyObject* obj); -void tagmap_addMapping(PyObject*self, int id, PyObject*obj); -PyObject* tagmap_getObjectList(PyObject* self); - -PyObject* tagmap_new(); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tags.c b/fluidbook/tools/swftools-special-swfdump/lib/python/tags.c deleted file mode 100644 index ca49a25d8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/tags.c +++ /dev/null @@ -1,1229 +0,0 @@ -#include "pyutils.h" -#include "primitives.h" -#include "action.h" -#include "taglist.h" -#include "tag.h" -#include "tags.h" -#include "image.h" -#include "../png.h" - -//---------------------------------------------------------------------------- - -typedef struct _font_internal -{ - SWFFONT* font; -} font_internal_t; -staticforward tag_internals_t font_tag; - -static int font_parse(tag_internals_t*self) -{ - font_internal_t*font = (font_internal_t*)self->data; - /* TODO */ - PyErr_SetString(PyExc_Exception, setError("Font parsing not implemented yet")); - return 0; -} -static void font_dealloc(tag_internals_t*self) -{ - font_internal_t*font = (font_internal_t*)self->data; - if(font->font) { - swf_FontFree(font->font); - font->font = 0; - } -} -static int font_fillTAG(tag_internals_t*self) -{ - font_internal_t*fi = (font_internal_t*)self->data; - if(self->tag) - return 1; - self->tag = swf_InsertTag(0, ST_DEFINEFONT2); - swf_FontSetDefine2(self->tag, fi->font); - return 1; -} -static PyObject* f_DefineFont(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"filename", NULL}; - char*filename = 0; - PyObject*tag; - SWFFONT* font; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &filename)) - return NULL; - - font = swf_LoadFont(filename, 0); - if(!font) { - PyErr_SetString(PyExc_Exception, setError("Could not load %s", filename)); - return NULL; - } - - tag = tag_new(&font_tag); - tag_internals_t*itag = tag_getinternals(tag); - font_internal_t*fi = (font_internal_t*)itag->data; - font->id = 0; - fi->font = font; - return (PyObject*)tag; -} -static SWFFONT* font_getSWFFONT(PyObject*self) -{ - PY_ASSERT_TYPE(self, &TagClass); - tag_internals_t*itag = tag_getinternals(self); - font_internal_t*fi = (font_internal_t*)itag->data; - return fi->font; -} -static tag_internals_t font_tag = -{ - parse: font_parse, - fillTAG: font_fillTAG, - dealloc: font_dealloc, - getattr: 0, - setattr: 0, - tagfunctions: 0, - datasize: sizeof(font_internal_t), -}; -//---------------------------------------------------------------------------- - -typedef struct _placeobject_internal -{ - SWFPLACEOBJECT* po; - PyObject*character; -} placeobject_internal_t; -staticforward tag_internals_t placeobject_tag; - -static void po_dealloc(tag_internals_t*self) -{ - placeobject_internal_t*pi = (placeobject_internal_t*)self->data; - if(pi->po) { - swf_PlaceObjectFree(pi->po); - pi->po = 0; - } -} -static int po_parse(tag_internals_t*self) -{ - placeobject_internal_t*i = (placeobject_internal_t*)self->data; - if(i->po) - return 1; - if(!self->tag) - return 0; - SWFPLACEOBJECT* swfpo = malloc(sizeof(SWFPLACEOBJECT)); - swf_GetPlaceObject(self->tag, swfpo); - i->po = swfpo; - swf_DeleteTag(0, self->tag);self->tag = 0; - - if(i->po->id) { - i->character = tagmap_id2obj(self->tagmap, i->po->id); - if(i->character) { - Py_INCREF(i->character); - } else { - //PyErr_Clear(); //? - } - } - return 1; -} -static int po_fillTAG(tag_internals_t*self) -{ - placeobject_internal_t*pi = (placeobject_internal_t*)self->data; - self->tag = swf_InsertTag(0, ST_PLACEOBJECT2); - swf_SetPlaceObject(self->tag, pi->po); - return 1; -} -static PyObject* po_getattr(tag_internals_t*self,char*a) -{ - placeobject_internal_t*i = (placeobject_internal_t*)self->data; - if(!po_parse(self)) - return PY_ERROR("Couldn't parse placeobject"); - if(!strcmp(a, "character")) { - if(!i->character) - return PY_NONE; - Py_INCREF(i->character); //TODO: ?? - return i->character; - } else if(!strcmp(a, "matrix")) { - return f_Matrix2(&i->po->matrix); - } else if(!strcmp(a, "cxform")) { - /* TODO */ - return 0; - } - return 0; -} -static int po_setattr(tag_internals_t*self,char*a, PyObject*obj) -{ - placeobject_internal_t*si = (placeobject_internal_t*)self->data; - if(!strcmp(a, "cxform")) { - /* TODO */ - return 0; - } - return -1; -} -static PyObject* po_create(PyObject* self, PyObject* args, PyObject* kwargs,char move) -{ - static char *kwlist[] = {"character", "depth", "matrix", "colortransform", "ratio", "name", "clipdepth", "action", NULL}; - - PyObject*character = 0; - int depth; - int clipdepth = 0; - PyObject*matrix = 0; - PyObject*cxform = 0; - PyObject*action = 0; - int ratio = 0; - char* name = 0; - SWFPLACEOBJECT* po; - po = malloc(sizeof(SWFPLACEOBJECT)); - memset(po, 0, sizeof(SWFPLACEOBJECT)); - - swf_GetPlaceObject(0, po); - - PyErr_Clear(); - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Oi|O!O!isiO!", kwlist, - &character, - &depth, - &MatrixClass, &matrix, - &CXFormClass, &cxform, - &ratio, - &name, - &clipdepth, - &ActionClass, &action - )) - return NULL; - - po->depth = depth; - po->clipdepth = clipdepth; - po->ratio = ratio; - po->name = name; - po->move = move; - if(clipdepth) po->clipdepth = clipdepth; - if(matrix) po->matrix = matrix_getMatrix(matrix); - if(cxform) po->cxform = colortransform_getCXForm(cxform); - if(action) po->actions = action_getAction(action); - - PyObject*tag; - tag = tag_new(&placeobject_tag); - tag_internals_t*itag = tag_getinternals(tag); - placeobject_internal_t*pi = (placeobject_internal_t*)itag->data; - pi->po = po; - if(!move) { - pi->po->id = tagmap_add(itag->tagmap,(PyObject*)character); - } else { - pi->po->id = 0; - } - - mylog("+%08x(%d) PlaceObject %08x(%d)\n", (int)tag, tag->ob_refcnt, character, character->ob_refcnt); - - return (PyObject*)tag; -} -static PyObject* f_PlaceObject(PyObject* self, PyObject* args, PyObject* kwargs) -{ - return po_create(self, args, kwargs, 0); -} -static PyObject* f_MoveObject(PyObject* self, PyObject* args, PyObject* kwargs) -{ - return po_create(self, args, kwargs, 1); -} -static tag_internals_t placeobject_tag = -{ - parse: po_parse, - fillTAG: po_fillTAG, - dealloc: po_dealloc, - getattr: po_getattr, - setattr: po_setattr, - tagfunctions: 0, - datasize: sizeof(placeobject_internal_t), -}; -//---------------------------------------------------------------------------- -staticforward tag_internals_t bgcolor_tag; -static PyObject* tag_setbackgroundcolor_getrgb(PyObject * self, PyObject*other) -{ - tag_internals_t*itag = tag_getinternals(self); - int r,g,b; - r = itag->tag->data[0]; - g = itag->tag->data[1]; - b = itag->tag->data[2]; - return Py_BuildValue("(iii)", r,g,b); -} -static PyMethodDef setbgcolor_methods[] = -{{"getRGB", tag_setbackgroundcolor_getrgb, METH_VARARGS, "get's the color set by this tag"}, - {NULL, NULL, 0, NULL} -}; -static PyObject* f_SetBackgroundColor(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"color", NULL}; - int r=0,g=0,b=0; - PyObject*tag; - PyObject*color; - - tag = tag_new(&bgcolor_tag); - tag_internals_t*itag = tag_getinternals(tag); - - /* 1st try- copy constructor */ - if(!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &ColorClass, &color)) { - PyErr_Clear(); - /* 2nd try- color's contructor */ - color = f_Color(NULL, args, kwargs); - } - if(!color) - return NULL; - - itag->tag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR); - RGBA rgba = color_getRGBA(color); - swf_SetU8(itag->tag, rgba.r); - swf_SetU8(itag->tag, rgba.g); - swf_SetU8(itag->tag, rgba.b); - mylog(" %08x(%d) SetBackgroundColor(%02x,%02x,%02x) (colorobj=%08x(%d))\n", (int)tag, tag->ob_refcnt, rgba.r, rgba.g, rgba.b, color, color->ob_refcnt); - Py_DECREF(color); - return (PyObject*)tag; -} -static tag_internals_t bgcolor_tag = -{ - parse: 0, - fillTAG: 0, - dealloc: 0, - getattr: 0, - setattr: 0, - tagfunctions: setbgcolor_methods, - datasize: 0, -}; -//---------------------------------------------------------------------------- -staticforward tag_internals_t protect_tag; -static PyObject* f_Protect(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"password", NULL}; - char*password = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &password)) - return NULL; - - PyObject*tag = tag_new(&protect_tag); - tag_internals_t*itag = tag_getinternals(tag); - itag->tag = swf_InsertTag(0, ST_PROTECT); - if(password) { - swf_SetPassword(itag->tag, password); - } - mylog("+%08x(%d) f_Protect", (int)tag, tag->ob_refcnt); - return (PyObject*)tag; -} -static tag_internals_t protect_tag = -{ - parse: 0, - fillTAG: 0, - dealloc: 0, - getattr: 0, - setattr: 0, - tagfunctions: 0, - datasize: 0, -}; -//---------------------------------------------------------------------------- -staticforward tag_internals_t showframe_tag; -static PyObject* f_ShowFrame(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"name", NULL}; - char*name= 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &name)) - return NULL; - - PyObject*tag = tag_new(&showframe_tag); - tag_internals_t*itag = tag_getinternals(tag); - itag->tag = swf_InsertTag(0, ST_SHOWFRAME); - mylog("+%08x(%d) f_ShowFrame", (int)tag, tag->ob_refcnt); - return (PyObject*)tag; -} -static tag_internals_t showframe_tag = -{ - parse: 0, - fillTAG: 0, - dealloc: 0, - getattr: 0, - setattr: 0, - tagfunctions: 0, - datasize: 0, -}; -//---------------------------------------------------------------------------- -staticforward tag_internals_t removeobject_tag; -static PyObject* f_RemoveObject(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"depth", NULL}; - int depth; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &depth)) - return NULL; - - PyObject*tag = tag_new(&removeobject_tag); - tag_internals_t*itag = tag_getinternals(tag); - itag->tag = swf_InsertTag(0, ST_REMOVEOBJECT); - swf_SetU16(itag->tag, depth); - mylog("+%08x(%d) f_RemoveObject", (int)tag, tag->ob_refcnt); - return (PyObject*)tag; -} -static tag_internals_t removeobject_tag = -{ - parse: 0, - fillTAG: 0, - dealloc: 0, - getattr: 0, - setattr: 0, - tagfunctions: 0, - datasize: 0, -}; -//---------------------------------------------------------------------------- -staticforward tag_internals_t sprite_tag; -typedef struct _sprite_internal -{ - PyObject* taglist; -} sprite_internal_t; - -static int sprite_fillTAG(tag_internals_t*self) -{ - mylog("+%08x(?) sprite_fillTAG", (int)self); - - sprite_internal_t*si = (sprite_internal_t*)self->data; - - TAG*sprite = swf_InsertTag(0, ST_DEFINESPRITE); - swf_SetU16(sprite, 0); //id - swf_SetU16(sprite, 0); //frames - - TAG*tag = taglist_getTAGs2(si->taglist, self->tagmap, 0); - if(!tag) { - /* pass through exception */ - return 0; - } - TAG*tag2 = tag; - while(tag2->next) tag2 = tag2->next; - swf_InsertTag(tag2, ST_END); - - sprite->next = tag; - tag->prev = sprite; - - swf_FoldSprite(sprite); - self->tag = sprite; - return 1; -} - -static PyObject* f_Sprite(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"name", NULL}; - char*name= 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", kwlist, &name)) - return NULL; - - PyObject*tag = tag_new(&sprite_tag); - tag_internals_t*itag = tag_getinternals(tag); - sprite_internal_t*si = (sprite_internal_t*)itag->data; - si->taglist = taglist_new(); - mylog("+%08x(%d) f_DefineSprite", (int)tag, tag->ob_refcnt); - return (PyObject*)tag; -} -static PyObject* sprite_getattr(tag_internals_t*self,char*a) -{ - sprite_internal_t*si = (sprite_internal_t*)self->data; - if(!strcmp(a, "tags")) { - Py_INCREF(si->taglist); - return si->taglist; - } - return 0; -} -static int sprite_setattr(tag_internals_t*self,char*a, PyObject*obj) -{ - sprite_internal_t*si = (sprite_internal_t*)self->data; - if(self->tag) { - swf_DeleteTag(0, self->tag); - self->tag = 0; - } - if(!strcmp(a, "tags")) { - PY_ASSERT_TYPE(obj,&TagListClass); - Py_DECREF(si->taglist); - si->taglist = obj; - Py_INCREF(si->taglist); - return 0; - } - return 1; -} -static tag_internals_t sprite_tag = -{ - parse: 0, - fillTAG: sprite_fillTAG, - dealloc: 0, - getattr: sprite_getattr, - setattr: sprite_setattr, - tagfunctions: 0, - datasize: sizeof(sprite_internal_t), -}; -//---------------------------------------------------------------------------- -staticforward tag_internals_t end_tag; -static tag_internals_t end_tag = -{ - parse: 0, - fillTAG: 0, - dealloc: 0, - getattr: 0, - setattr: 0, - tagfunctions: 0, - datasize: 0, -}; -//---------------------------------------------------------------------------- -staticforward tag_internals_t text_tag; - -typedef struct _text_internal -{ - char*text; - SWFFONT* swffont; - RGBA rgba; - int size; - SRECT bbox; -} text_internal_t; -staticforward tag_internals_t placeobject_tag; - -static int text_fillTAG(tag_internals_t*self) -{ - text_internal_t*ti = (text_internal_t*)self->data; - self->tag= swf_InsertTag(0, ST_DEFINETEXT2); - swf_SetU16(self->tag, /*ID*/0); - ti->bbox = swf_SetDefineText(self->tag, ti->swffont, &ti->rgba, ti->text, ti->size); - return 1; -} -static PyObject* text_getattr(tag_internals_t*self,char*a) -{ - text_internal_t*si = (text_internal_t*)self->data; - if(!strcmp(a, "bbox")) { - return f_BBox2(si->bbox); - } - return 0; -} -static PyObject* f_DefineText(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"font", "text", "size", "color", NULL}; - PyObject*tag = 0; - PyObject*otext; - char*text = 0; - int size = 0; - RGBA rgba = {255,0,0,0}; - PyObject*color = 0; - PyObject*font = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!Oi|O!", kwlist, &TagClass, &font, &otext, &size, &ColorClass, &color)) - return NULL; - if(PyUnicode_Check(otext)) { - text = PyString_AS_STRING(PyUnicode_AsUTF8String(otext)); - } else if(PyString_Check(otext)) { - text = PyString_AS_STRING(otext); - } - - if(color) - rgba = color_getRGBA(color); - - mylog("DefineText: text = %s", text); - - tag = tag_new(&text_tag); - tag_internals_t* itag = tag_getinternals(tag); - text_internal_t*ti = (text_internal_t*)itag->data; - - ti->swffont = font_getSWFFONT(font); - int font_id = tagmap_add(itag->tagmap, font); // add dependency on font - ti->swffont->id = font_id; // for swf_SetDefineTexts - ti->text = strdup(text); - ti->rgba = rgba; - ti->size = size; - - return (PyObject*)tag; -} -static tag_internals_t text_tag = -{ - parse: 0, - fillTAG: text_fillTAG, - dealloc: 0, - getattr: text_getattr, - setattr: 0, - tagfunctions: 0, - datasize: sizeof(text_internal_t), -}; -//---------------------------------------------------------------------------- -staticforward tag_internals_t image_tag; - -typedef struct _image_internal -{ - RGBA*rgba; - int size; - int width; - int height; - int bpp; - char isindexed; - char islossless; -} image_internal_t; -staticforward tag_internals_t image_tag; - -static int image_fillTAG(tag_internals_t*self) -{ - image_internal_t*ti = (image_internal_t*)self->data; - self->tag= swf_InsertTag(0, ST_DEFINEBITSLOSSLESS2); - swf_SetU16(self->tag, /*ID*/0); - swf_SetLosslessBits(self->tag, ti->width, ti->height, ti->rgba, BMF_32BIT); - return 1; -} -static void image_dealloc(tag_internals_t*self) -{ - image_internal_t*pi = (image_internal_t*)self->data; - if(pi->rgba) { - free(pi->rgba);pi->rgba = 0; - } -} -static int image_parse(tag_internals_t*self) -{ - image_internal_t*i= (image_internal_t*)self->data; - if(i->rgba) - return 1; - if(!self->tag) - return 0; - - i->rgba = swf_ExtractImage(self->tag, &i->width, &i->height); - i->bpp = 32; - i->isindexed = 0; - i->islossless = 1; - - swf_DeleteTag(0, self->tag);self->tag = 0; - return 1; -} -static int imagetag_getWidth(PyObject* self) -{ - tag_internals_t*itag = tag_getinternals(self); - image_internal_t*pi = (image_internal_t*)itag->data; - return pi->width; -} -static int imagetag_getHeight(PyObject* self) -{ - tag_internals_t*itag = tag_getinternals(self); - image_internal_t*pi = (image_internal_t*)itag->data; - return pi->height; -} -static PyObject* f_DefineImage(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"image", NULL}; - PyObject*image = 0; - PyObject*tag = tag_new(&image_tag); - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &image)) - return NULL; - - tag = tag_new(&image_tag); - tag_internals_t* itag = tag_getinternals(tag); - image_internal_t*ti = (image_internal_t*)itag->data; - - ti->rgba = image_toRGBA(image); - if(!ti->rgba) // pass through exception - return 0; - ti->width = image_getWidth(image); - ti->height = image_getHeight(image); - ti->isindexed = 0; - ti->islossless = 1; - ti->bpp = 32; - ti->size = ti->width*ti->height; - - return (PyObject*)tag; -} -static PyObject* image_getattr(tag_internals_t*self,char*a) -{ - image_internal_t*i = (image_internal_t*)self->data; - if(!strcmp(a, "image")) { - if(!i->rgba) { - image_parse(self); - } - PyObject* image = rgba_to_image(i->rgba, i->width, i->height); - return image; - } - return 0; -} - -static PyObject* image_save(PyObject*self, PyObject*args) -{ - tag_internals_t*itag = tag_getinternals(self); - if(!image_parse(itag)) - return PY_ERROR("Couldn't parse image"); - image_internal_t*fi = (image_internal_t*)itag->data; - - char*filename = 0; - if(!PyArg_ParseTuple(args, "s", &filename)) - return NULL; - - png_write(filename, (unsigned char*)fi->rgba ,fi->width, fi->height); - - return PY_NONE; -} - -static PyMethodDef image_methods[] = -{{"save", image_save, METH_VARARGS, "saves an image as PNG"}, - {NULL, NULL, 0, NULL} -}; - -static tag_internals_t image_tag = -{ - parse: image_parse, - fillTAG: image_fillTAG, - dealloc: image_dealloc, - getattr: image_getattr, - setattr: 0, - tagfunctions: image_methods, - datasize: sizeof(image_internal_t), -}; -//---------------------------------------------------------------------------- -staticforward tag_internals_t shape_tag; - -typedef struct _shape_internal -{ - SHAPE2*shape2; -} shape_internal_t; -staticforward tag_internals_t shape_tag; - -static int shape_fillTAG(tag_internals_t*self) -{ - shape_internal_t*ti = (shape_internal_t*)self->data; - self->tag= swf_InsertTag(0, ST_DEFINESHAPE3); - swf_SetU16(self->tag, /*ID*/0); - swf_SetShape2(self->tag, ti->shape2); - return 1; -} -static int shape_parse(tag_internals_t*self) -{ - shape_internal_t*i= (shape_internal_t*)self->data; - if(i->shape2) - return 1; - if(!self->tag) - return 0; - SHAPE2* shape2 = malloc(sizeof(SHAPE2)); - swf_ParseDefineShape(self->tag, shape2); - i->shape2 = shape2; - swf_DeleteTag(0, self->tag);self->tag = 0; - return 1; -} -static void shape_dealloc(tag_internals_t*self) -{ - shape_internal_t*pi = (shape_internal_t*)self->data; - if(pi->shape2) { - swf_Shape2Free(pi->shape2); - pi->shape2 = 0; - } -} -static PyObject* f_DefineImageShape(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"image", NULL}; - PyObject*image = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &TagClass, &image)) - return NULL; - - PyObject*tag = tag_new(&shape_tag); - tag_internals_t* itag = tag_getinternals(tag); - shape_internal_t*ti = (shape_internal_t*)itag->data; - ti->shape2 = 0; /*HACK*/ - - int width = imagetag_getWidth(image); - int height = imagetag_getHeight(image); - int id = tagmap_add(itag->tagmap, image); - itag->tag= swf_InsertTag(0, ST_DEFINESHAPE3); - swf_SetU16(itag->tag, 0); - swf_ShapeSetBitmapRect(itag->tag, id, width, height); - return (PyObject*)tag; -} - -/* TODO: move to lib/ */ -SHAPE2*swf_StringToShape2(char*s,FILLSTYLE*f, LINESTYLE*l) -{ - drawer_t draw; - swf_Shape11DrawerInit(&draw, 0); - draw_string(&draw, s); - draw.finish(&draw); - SHAPE*s1 = swf_ShapeDrawerToShape(&draw); - SRECT r = swf_ShapeDrawerGetBBox(&draw); - RGBA col;col.r=col.g=col.b=128;col.a=255; - if(l) - swf_ShapeAddLineStyle(s1, 1, &col); - if(f) - swf_ShapeAddSolidFillStyle(s1, &col); - draw.dealloc(&draw); - SHAPE2*shape2 = swf_ShapeToShape2(s1); - swf_ShapeFree(s1); - shape2->bbox = malloc(sizeof(SRECT)); - *(shape2->bbox) = r; - if(f && shape2->numfillstyles) - shape2->fillstyles[0] = *f; - if(l && shape2->numlinestyles) - shape2->linestyles[0] = *l; - return shape2; -} - -static PyObject* f_DefineShape(PyObject* self, PyObject* args, PyObject* kwargs) -{ - static char *kwlist[] = {"s", "fill", "line", NULL}; - char*s = 0; - PyObject*fillstyle=0,*linestyle=0; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|OO", kwlist, &s,&fillstyle,&linestyle)) - return NULL; - - PyObject*tag = tag_new(&shape_tag); - tag_internals_t* itag = tag_getinternals(tag); - shape_internal_t*ti = (shape_internal_t*)itag->data; - - FILLSTYLE _f,*f=0; - LINESTYLE _l,*l=0; - - if(fillstyle) { - f = &_f; - if(PY_CHECK_TYPE(fillstyle, &ColorClass)) { - f->type = /*FILL_SOLID*/ 0; - f->color = color_getRGBA(fillstyle); - } else { - return PY_ERROR("Invalid Fillstyle"); - } - } - - if(linestyle) { - l = &_l; - if(PyTuple_Check(linestyle) && PyTuple_GET_SIZE(linestyle)==2) { - float f = 0.0; - PyObject*color = 0; - if(!PyArg_ParseTuple(linestyle, "fO!", &f, &ColorClass, &color)) - return 0; - - l->width = (int)(f*20); - l->color = color_getRGBA(color); - } else { - return PY_ERROR("Invalid Linestyle"); - } - } - ti->shape2 = swf_StringToShape2(s,f,l); - - itag->tag = 0; - - return (PyObject*)tag; -} -static PyObject* shape_getfillstyles(PyObject*self, PyObject*args) -{ - tag_internals_t*itag = tag_getinternals(self); - if(!shape_parse(itag)) - return PY_ERROR("Couldn't parse shape"); - shape_internal_t*fi = (shape_internal_t*)itag->data; - int num = fi->shape2->numfillstyles; - return Py_BuildValue("i", num); -} -static PyObject* shape_getlinestyles(PyObject*self, PyObject*args) -{ - tag_internals_t*itag = tag_getinternals(self); - if(!shape_parse(itag)) - return PY_ERROR("Couldn't parse shape"); - shape_internal_t*fi = (shape_internal_t*)itag->data; - int num = fi->shape2->numlinestyles; - return Py_BuildValue("i", num); -} -static PyObject* shape_getfillstyle(PyObject*self, PyObject*args) -{ - tag_internals_t*itag = tag_getinternals(self); - if(!shape_parse(itag)) - return PY_ERROR("Couldn't parse shape"); - shape_internal_t*fi = (shape_internal_t*)itag->data; - int nr = 0; - if(!PyArg_ParseTuple(args, "i", &nr)) - return NULL; - - int num = fi->shape2->numfillstyles; - if(nr < 0 || nr >=num) - return PY_ERROR("fillstyle index out of range"); - return f_FillStyle2(fi->shape2->fillstyles[nr]); -} -static PyObject* shape_getlinestyle(PyObject*self, PyObject*args) -{ - tag_internals_t*itag = tag_getinternals(self); - if(!shape_parse(itag)) - return PY_ERROR("Couldn't parse shape"); - shape_internal_t*fi = (shape_internal_t*)itag->data; - int nr = 0; - if(!PyArg_ParseTuple(args, "i", &nr)) - return NULL; - - int num = fi->shape2->numfillstyles; - if(nr < 0 || nr >=num) - return PY_ERROR("fillstyle index out of range"); - return f_LineStyle3(fi->shape2->linestyles[nr]); -} -static PyObject* shape_setfillstyle(PyObject*self, PyObject*args) -{ - tag_internals_t*itag = tag_getinternals(self); - if(!shape_parse(itag)) - return PY_ERROR("Couldn't parse shape"); - shape_internal_t*fi = (shape_internal_t*)itag->data; - int nr = 0; - PyObject*fs = 0; - if(!PyArg_ParseTuple(args, "iO!", &nr, &FillStyleClass, &fs)) - return NULL; - - int num = fi->shape2->numfillstyles; - if(nr < 0 || nr >=num) - return PY_ERROR("fillstyle index out of range"); - fi->shape2->fillstyles[nr] = fillstyle_getFillStyle(fs); - return PY_NONE; -} -static PyObject* shape_setlinestyle(PyObject*self, PyObject*args) -{ - tag_internals_t*itag = tag_getinternals(self); - if(!shape_parse(itag)) - return PY_ERROR("Couldn't parse shape"); - shape_internal_t*fi = (shape_internal_t*)itag->data; - int nr = 0; - PyObject*ls = 0; - if(!PyArg_ParseTuple(args, "iO!", &nr, &LineStyleClass, &ls)) - return NULL; - - int num = fi->shape2->numlinestyles; - if(nr < 0 || nr >=num) - return PY_ERROR("linestyle index out of range"); - fi->shape2->linestyles[nr] = linestyle_getLineStyle(ls); - return PY_NONE; -} -static PyMethodDef shape_methods[] = -{{"numfillstyles", shape_getfillstyles, METH_VARARGS, "get's the number of fillstyles"}, - {"numlinestyles", shape_getlinestyles, METH_VARARGS, "get's the number of linestyles"}, - {"getfillstyle", shape_getfillstyle, METH_VARARGS, "get's one fillstyle"}, - {"getlinestyle", shape_getlinestyle, METH_VARARGS, "get's one linestyle"}, - {"setfillstyle", shape_setfillstyle, METH_VARARGS, "set's one fillstyle"}, - {"setlinestyle", shape_setlinestyle, METH_VARARGS, "set's one linestyle"}, - {NULL, NULL, 0, NULL} -}; - -static tag_internals_t shape_tag = -{ - parse: shape_parse, - fillTAG: shape_fillTAG, - dealloc: shape_dealloc, - getattr: 0, - setattr: 0, - tagfunctions: shape_methods, - datasize: sizeof(shape_internal_t), -}; -//---------------------------------------------------------------------------- - -typedef struct _videostream_internal -{ - VIDEOSTREAM* stream; - int lastiframe; -} videostream_internal_t; -staticforward tag_internals_t videostream_tag; -staticforward tag_internals_t videoframe_tag; - -static int videostream_parse(tag_internals_t*self) -{ - videostream_internal_t*videostream = (videostream_internal_t*)self->data; - /* TODO */ - PyErr_SetString(PyExc_Exception, setError("videostream parsing not implemented yet")); - return 0; -} -static void videostream_dealloc(tag_internals_t*self) -{ - videostream_internal_t*videostream = (videostream_internal_t*)self->data; - if(videostream->stream) { - swf_VideoStreamClear(videostream->stream); - free(videostream->stream); - videostream->stream = 0; - } -} -static int videostream_fillTAG(tag_internals_t*self) -{ - videostream_internal_t*fi = (videostream_internal_t*)self->data; - if(self->tag) - return 1; - PyErr_SetString(PyExc_Exception, setError("videostream filling not implemented")); - return 0; -} -static PyObject* f_DefineVideoStream(PyObject* self, PyObject* args, PyObject* kwargs) -{ - PyObject*tag = tag_new(&videostream_tag); - - int width=0,height=0,frames=65535; - static char *kwlist[] = {"width", "height", "frames", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii|i", kwlist, &width, &height, &frames)) - return NULL; - - tag_internals_t*itag = tag_getinternals(tag); - videostream_internal_t*fi = (videostream_internal_t*)itag->data; - fi->stream = malloc(sizeof(VIDEOSTREAM)); - memset(fi->stream, 0, sizeof(VIDEOSTREAM)); - - TAG*t = swf_InsertTag(0, ST_DEFINEVIDEOSTREAM); - swf_SetU16(t, 0); /* id */ - swf_SetVideoStreamDefine(t, fi->stream, frames, width, height); - itag->tag = t; - fi->lastiframe = -65536; - return (PyObject*)tag; -} -static VIDEOSTREAM* videostream_getVIDEOSTREAM(PyObject*self) -{ - PY_ASSERT_TYPE(self, &TagClass); - tag_internals_t*itag = tag_getinternals(self); - videostream_internal_t*fi = (videostream_internal_t*)itag->data; - return fi->stream; -} -static PyObject* videostream_getbwidth(PyObject*self, PyObject*args) -{ - tag_internals_t*itag = tag_getinternals(self); - videostream_internal_t*fi = (videostream_internal_t*)itag->data; - int width = fi->stream->bbx; - return Py_BuildValue("i", width); -} -static PyObject* videostream_getbheight(PyObject*self, PyObject*args) -{ - tag_internals_t*itag = tag_getinternals(self); - videostream_internal_t*fi = (videostream_internal_t*)itag->data; - int height = fi->stream->bby; - return Py_BuildValue("i", height); -} -static PyObject* videostream_addBlackFrame(PyObject*self, PyObject*args, PyObject*kwargs) -{ - tag_internals_t*_itag = tag_getinternals(self); - videostream_internal_t*fi = (videostream_internal_t*)_itag->data; - - TAG* t = swf_InsertTag(0, ST_VIDEOFRAME); - - PyObject*tag = tag_new(&videoframe_tag); - tag_internals_t*itag = tag_getinternals(tag); - - swf_SetU16(t,0); /* id */ - swf_SetVideoStreamBlackFrame(t, fi->stream); - fi->lastiframe = fi->stream->frame; - - itag->tag = t; - tagmap_addMapping(itag->tagmap, 0, self); - return tag; -} -static PyObject* videostream_addFrame(PyObject*self, PyObject*args, PyObject*kwargs) -{ - tag_internals_t*_itag = tag_getinternals(self); - videostream_internal_t*fi = (videostream_internal_t*)_itag->data; - - PyObject*image = 0; - char*type=0; // none, "i", "p" - int quant=7; - static char *kwlist[] = {"image", "quant", "type", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|is", kwlist, &image, &quant, &type)) - return NULL; - if(fi->stream->owidth != image_getWidth(image)) { - PyErr_SetString(PyExc_Exception, setError("bad image width %d!=%d", image_getWidth(image), fi->stream->width));return 0; - } - if(fi->stream->oheight != image_getHeight(image)) { - PyErr_SetString(PyExc_Exception, setError("bad image width %d!=%d", image_getHeight(image), fi->stream->height));return 0; - } - PyObject*tag = tag_new(&videoframe_tag); - tag_internals_t*itag = tag_getinternals(tag); - - RGBA*pic = image_toRGBA(image); - if(!pic) - return 0; - -/*{ int f,j=0,i=0,rr,gg,bb; - FILE *o; - RGBA*it = pic; - char*filename="test.ppm"; - printf("Creating %s %dx%d\n",filename, 512,512); - o=fopen(filename, "wb"); - fprintf(o,"P6\n%d %d\n255\n",512, 512); - - while(j<512*512) { - rr=it->r; - gg=it->g; - bb=it->b; - fprintf(o,"%c%c%c",rr,gg,bb); - it++; - j++; - } - fclose(o); -}*/ - - TAG* t = swf_InsertTag(0, ST_VIDEOFRAME); - if((type && (type[0]=='I' || type[0]=='i')) || (type==0 && fi->lastiframe+64 < fi->stream->frame)) { - swf_SetU16(t,0); /* id */ - swf_SetVideoStreamIFrame(t, fi->stream, pic, quant); - fi->lastiframe = fi->stream->frame; - } else { - swf_SetU16(t,0); - swf_SetVideoStreamPFrame(t, fi->stream, pic, quant); - } - itag->tag = t; - tagmap_addMapping(itag->tagmap, 0, self); - free(pic); - return tag; -} -static PyObject* videostream_addDistortionFrame(PyObject*self, PyObject*args, PyObject*kwargs) -{ - tag_internals_t*_itag = tag_getinternals(self); - videostream_internal_t*fi = (videostream_internal_t*)_itag->data; - - static char *kwlist[] = {"image", "quant", NULL}; - int quant=7; - PyObject* array = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|i", kwlist, &array, &quant)) - return NULL; - - signed char* movex = malloc(fi->stream->bbx * fi->stream->bby * 1); - signed char* movey = malloc(fi->stream->bbx * fi->stream->bby * 1); - RGBA** pics = (RGBA**)malloc(fi->stream->bbx * fi->stream->bby * sizeof(void*)); - signed char* itx=movex; - signed char* ity=movey; - RGBA**pic=pics; - int x,y; - if(!array || !PySequence_Check(array)) - return PY_ERROR("Not an array"); - if(PySequence_Length(array) < fi->stream->bby) - return PY_ERROR("Array (y) has to have at least %d elements, but has only %d ", fi->stream->bby, PySequence_Length(array)); - for(y=0;ystream->bby;y++) { - PyObject*line = PySequence_GetItem(array, y); - if(!line || !PySequence_Check(line)) - return PY_ERROR("Not an array of arrays"); - if(PySequence_Length(line) < fi->stream->bbx) - return PY_ERROR("Inner arrays (x) have to be at least %d long- %dth is only %d", fi->stream->bbx, y, PySequence_Length(line)); - - for(x=0;xstream->bbx;x++) { - PyObject*pixel = PySequence_GetItem(line, x); - PyObject*xy = 0; - PyObject*image = 0; - - if(!pixel) { - xy = image = 0; - } else { - if(PyComplex_Check(pixel)) { - xy = pixel; image = 0; - } else if(PyString_Check(pixel)) { - xy = 0; image = pixel; - } else if(PyTuple_Check(pixel)) { - int size = PyTuple_GET_SIZE(pixel); - if(size!=2) return PY_ERROR("Tuples have to have size 2 (xy,img)"); - xy = PyTuple_GetItem(pixel, 0); - if(!xy) return 0; - if(!PyComplex_Check(xy)) return PY_ERROR("Tuples must be (COMPLEX,string)"); - image = PyTuple_GetItem(pixel, 1); - if(!image) return 0; - if(!PyString_Check(image)) return PY_ERROR("Tuples must be (complex,STRING)"); - } - } - - *itx = *ity = 0; - *pic= 0; - - if(xy) { - *itx = (signed char)PyComplex_RealAsDouble(pixel); - *ity = (signed char)PyComplex_ImagAsDouble(pixel); - } - if(image) { - char*string; - int size; - PyString_AsStringAndSize(image,&string,&size); - if(size<256*3) { - return PY_ERROR("image strings must be >= 256*3"); - } - *pic = malloc(sizeof(RGBA)*16*16); - int t; - for(t=0;t<16*16;t++) { - (*pic)[t].r = string[t*3]; - (*pic)[t].g = string[t*3+1]; - (*pic)[t].b = string[t*3+2]; - (*pic)[t].a = 255; - } - } - itx++; - ity++; - pic++; - } - } - - PyObject*tag = tag_new(&videoframe_tag); - tag_internals_t*itag = tag_getinternals(tag); - - TAG* t = swf_InsertTag(0, ST_VIDEOFRAME); - swf_SetU16(t,0); /* id */ - swf_SetVideoStreamMover(t, fi->stream, movex, movey,(void**)pics, quant); - - itag->tag = t; - tagmap_addMapping(itag->tagmap, 0, self); - - for(x=0;xstream->bbx*fi->stream->bby;x++) { - if(pics[x]) { - free(pics[x]);pics[x] = 0; - } - } - - free(movex); - free(movey); - free(pics); - - return tag; -} -static PyMethodDef videostream_methods[] = -{{"xblocks", videostream_getbwidth, METH_VARARGS, "get's the number of horizontal blocks"}, - {"yblocks", videostream_getbheight, METH_VARARGS, "get's the number of vertical blocks"}, - {"addFrame", (PyCFunction)videostream_addFrame, METH_KEYWORDS, "add a Video Frame"}, - {"addBlackFrame", (PyCFunction)videostream_addBlackFrame, METH_KEYWORDS, "add a black Video Frame"}, - {"addDistortionFrame", (PyCFunction)videostream_addDistortionFrame, METH_KEYWORDS, "add a MVD frame"}, - {NULL, NULL, 0, NULL} -}; - -static tag_internals_t videostream_tag = -{ - parse: videostream_parse, - fillTAG: videostream_fillTAG, - dealloc: videostream_dealloc, - getattr: 0, - setattr: 0, - tagfunctions: videostream_methods, - datasize: sizeof(videostream_internal_t), -}; - -//============================================================================ - -static tag_internals_t videoframe_tag = -{ - parse: 0, - fillTAG: 0, - dealloc: 0, - getattr: 0, - setattr: 0, - tagfunctions: 0, - datasize: 0 -}; - -//============================================================================ -static PyMethodDef TagMethods[] = -{ - /* TAGS */ - {"BackgroundColor", (PyCFunction)f_SetBackgroundColor, METH_KEYWORDS, "Create a SetBackGroundColor Tag."}, - {"Protect", (PyCFunction)f_Protect, METH_KEYWORDS, "Create a Protect Tag."}, - {"Font", (PyCFunction)f_DefineFont, METH_KEYWORDS, "Create a DefineFont Tag."}, - {"Text", (PyCFunction)f_DefineText, METH_KEYWORDS, "Create a DefineText Tag."}, - {"PlaceObject", (PyCFunction)f_PlaceObject, METH_KEYWORDS, "Create a PlaceObject Tag."}, - {"RemoveObject", (PyCFunction)f_RemoveObject, METH_KEYWORDS, "Create a RemoveObject Tag."}, - {"MoveObject", (PyCFunction)f_MoveObject, METH_KEYWORDS, "Create a PlaceObject Move Tag."}, - {"VideoStream", (PyCFunction)f_DefineVideoStream, METH_KEYWORDS, "Create a Videostream."}, - {"Image", (PyCFunction)f_DefineImage, METH_KEYWORDS, "Create an SWF Image Tag."}, - {"ImageShape", (PyCFunction)f_DefineImageShape, METH_KEYWORDS, "Create an SWF Image Shape Tag."}, - {"Shape", (PyCFunction)f_DefineShape, METH_KEYWORDS, "Create an SWF Shape Tag."}, - {"ShowFrame", (PyCFunction)f_ShowFrame, METH_KEYWORDS, "Create an SWF Show Frame Tag."}, - {"Sprite", (PyCFunction)f_Sprite, METH_KEYWORDS, "Create an SWF Sprite Tag."}, - - {NULL, NULL, 0, NULL} -}; -PyMethodDef* tags_getMethods() -{ - TagClass.ob_type = &PyType_Type; - - register_tag(ST_PLACEOBJECT,&placeobject_tag); - register_tag(ST_PLACEOBJECT2,&placeobject_tag); - register_tag(ST_REMOVEOBJECT,&removeobject_tag); - register_tag(ST_REMOVEOBJECT2,&removeobject_tag); - register_tag(ST_SETBACKGROUNDCOLOR,&bgcolor_tag); - register_tag(ST_DEFINEFONT,&font_tag); - register_tag(ST_PROTECT,&protect_tag); - register_tag(ST_DEFINETEXT,&text_tag); - register_tag(ST_DEFINEBITSJPEG,&image_tag); - register_tag(ST_DEFINEBITSJPEG2,&image_tag); - register_tag(ST_DEFINEBITSJPEG3,&image_tag); - register_tag(ST_DEFINEBITSLOSSLESS,&image_tag); - register_tag(ST_DEFINEBITSLOSSLESS2,&image_tag); - register_tag(ST_DEFINESHAPE,&shape_tag); - register_tag(ST_DEFINESHAPE2,&shape_tag); - register_tag(ST_DEFINESHAPE3,&shape_tag); - register_tag(ST_SHOWFRAME,&showframe_tag); - register_tag(ST_DEFINEVIDEOSTREAM,&videostream_tag); - register_tag(ST_VIDEOFRAME,&videoframe_tag); - register_tag(ST_DEFINESPRITE,&sprite_tag); - register_tag(ST_END,&end_tag); - - return TagMethods; -} diff --git a/fluidbook/tools/swftools-special-swfdump/lib/python/tags.h b/fluidbook/tools/swftools-special-swfdump/lib/python/tags.h deleted file mode 100644 index c338d998a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/python/tags.h +++ /dev/null @@ -1,32 +0,0 @@ -/* tags.h - - Python wrapper for librfxswf- various tag implementations - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __tags_h__ -#define __tags_h__ - -#include -#undef HAVE_STAT -#include "../rfxswf.h" - -PyMethodDef* tags_getMethods(); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/q.c b/fluidbook/tools/swftools-special-swfdump/lib/q.c deleted file mode 100644 index 6807b0ee7..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/q.c +++ /dev/null @@ -1,1689 +0,0 @@ -/* q.c - - Part of the swftools package. - - Copyright (c) 2001,2002,2003,2004 Matthias Kramm - - This program is rfx_free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the rfx_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 rfx_free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - - -#include -#include -#include -#include -#include -#include -#include "mem.h" -#include "types.h" -#include "q.h" - -// ------------------------------- malloc, alloc routines --------------------- - -#ifndef STRNDUP -char* strdup_n(const char*str, int size) -{ - char*m = (char*)rfx_alloc(size+1); - memcpy(m, str, size); - m[size] = 0; - return m; -} -#endif -char*qstrdup(const char*string) -{ - return strdup(string); -} -char*qstrndup(const char*string, int len) -{ - return strdup_n(string, len); -} -char* allocprintf(const char*format, ...) -{ - va_list arglist1; - va_start(arglist1, format); - char dummy; - int l = vsnprintf(&dummy, 1, format, arglist1); - va_end(arglist1); - - va_list arglist2; - va_start(arglist2, format); - char*buf = malloc(l+1); - vsnprintf(buf, l+1, format, arglist2); - va_end(arglist2); - return buf; -} - -// ------------------------------- mem_t -------------------------------------- - -void mem_init(mem_t*mem) -{ - memset(mem, 0, sizeof(mem_t)); -} -void mem_clear(mem_t*mem) -{ - rfx_free(mem->buffer);mem->buffer = 0; -} -void mem_destroy(mem_t*mem) -{ - mem_clear(mem); - rfx_free(mem); -} -static int mem_put_(mem_t*m,const void*data, int length, int null) -{ - int n = m->pos; - m->pos += length + (null?1:0); - if(m->pos > m->len) { - int v1 = (m->pos+63)&~63; - int v2 = m->len + m->len / 2; - m->len = v1>v2?v1:v2; - m->buffer = m->buffer?(char*)rfx_realloc(m->buffer,m->len):(char*)rfx_alloc(m->len); - } - assert(n+length <= m->len); - memcpy(&m->buffer[n], data, length); - if(null) - m->buffer[n + length] = 0; - return n; -} -int mem_put(mem_t*m,void*data, int length) -{ - return mem_put_(m, data, length, 0); -} -int mem_putstring(mem_t*m,string_t str) -{ - return mem_put_(m, str.str, str.len, 1); -} -int mem_get(mem_t*m, void*data, int length) -{ - if(m->read_pos + length > m->pos) { - length = m->pos - m->read_pos; - } - memcpy(data, m->buffer+m->read_pos, length); - m->read_pos += length; - return length; -} - -// ------------------------------- median ------------------------------------- - -float medianf(float*a, int n) -{ - int i,j,l,m; - float x; - int k=n&1?n/2:n/2-1; - l=0; - m=n-1; - while(linternal = i; - i->buffer = (unsigned char*)rfx_alloc(1024); - i->buffersize = 1024; -} -int ringbuffer_read(ringbuffer_t*r, void*buf, int len) -{ - unsigned char* data = (unsigned char*)buf; - ringbuffer_internal_t*i = (ringbuffer_internal_t*)r->internal; - if(r->available < len) - len = r->available; - if(!len) - return 0; - if(i->readpos + len > i->buffersize) { - int read1 = i->buffersize-i->readpos; - memcpy(data, &i->buffer[i->readpos], read1); - memcpy(&data[read1], &i->buffer[0], len - read1); - i->readpos = len - read1; - } else { - memcpy(data, &i->buffer[i->readpos], len); - i->readpos += len; - i->readpos %= i->buffersize; - } - r->available -= len; - return len; -} -void ringbuffer_put(ringbuffer_t*r, void*buf, int len) -{ - unsigned char* data = (unsigned char*)buf; - ringbuffer_internal_t*i = (ringbuffer_internal_t*)r->internal; - - if(i->buffersize - r->available < len) - { - unsigned char* buf2; - int newbuffersize = i->buffersize; - int oldavailable = r->available; - newbuffersize*=3;newbuffersize/=2; /*grow at least by 50% each time */ - - if(newbuffersize < r->available + len) - newbuffersize = r->available + len + 1024; - - buf2 = (unsigned char*)rfx_alloc(newbuffersize); - ringbuffer_read(r, buf2, r->available); - rfx_free(i->buffer); - i->buffer = buf2; - i->buffersize = newbuffersize; - i->readpos = 0; - i->writepos = oldavailable; - r->available = oldavailable; - } - if(i->writepos + len > i->buffersize) { - int read1 = i->buffersize-i->writepos; - memcpy(&i->buffer[i->writepos], data, read1); - memcpy(&i->buffer[0], &data[read1], len - read1); - i->writepos = len - read1; - } else { - memcpy(&i->buffer[i->writepos], data, len); - i->writepos += len; - i->writepos %= i->buffersize; - } - r->available += len; -} -void ringbuffer_clear(ringbuffer_t*r) -{ - ringbuffer_internal_t*i = (ringbuffer_internal_t*)r->internal; - rfx_free(i->buffer);i->buffer = 0; - rfx_free(i); -} - -// ------------------------------- heap_t ------------------------------- - -void heap_init(heap_t*h,int elem_size, int(*compare)(const void *, const void *)) -{ - memset(h, 0, sizeof(heap_t)); - h->size = 0; - h->elem_size = elem_size; - h->compare = compare; - h->elements = 0; - h->max_size = 0; -} -heap_t* heap_new(int elem_size, int(*compare)(const void *, const void *)) -{ - heap_t*h = malloc(sizeof(heap_t)); - heap_init(h, elem_size, compare); - return h; -} -heap_t* heap_clone(heap_t*o) -{ - heap_t*h = malloc(sizeof(heap_t)); - memcpy(h, o, sizeof(heap_t)); - h->elements = rfx_alloc(sizeof(void*)*h->size); - int t; - for(t=0;tsize;t++) { - h->elements[t] = rfx_alloc(h->elem_size); - memcpy(h->elements[t], o->elements[t], h->elem_size); - } - return h; -} -void heap_clear(heap_t*h) -{ - int t; - for(t=0;tsize;t++) { - rfx_free(h->elements[t]); - h->elements[t]=0; - } - rfx_free(h->elements); -} -void heap_destroy(heap_t*h) -{ - heap_clear(h); - free(h); -} - -#define HEAP_NODE_LARGER(h,node1,node2) ((h)->compare((node1),(node2))>0) -#define HEAP_NODE_SMALLER(h,node1,node2) ((h)->compare((node1),(node2))<0) - -static void up(heap_t*h, int node) -{ - void*node_p = h->elements[node]; - int parent = node; - int tmp = node; - do { - node = parent; - if(!node) break; - parent = (node-1)/2; - h->elements[node] = h->elements[parent]; - } while(HEAP_NODE_SMALLER(h, h->elements[parent], node_p)); - h->elements[node] = node_p; -} -static void down(heap_t*h, int node) -{ - void*node_p = h->elements[node]; - int child = node; - do { - node = child; - - /* determine new child's position */ - child = node<<1|1; - if(child >= h->size) - break; - if(child+1 < h->size && HEAP_NODE_SMALLER(h,h->elements[child],h->elements[child+1])) // search for bigger child - child++; - - h->elements[node] = h->elements[child]; - } while(HEAP_NODE_SMALLER(h,node_p, h->elements[child])); - - h->elements[node] = node_p; -} -void heap_put(heap_t*h, void*e) -{ - int pos = h->size++; - void*data = rfx_alloc(h->elem_size); - memcpy(data,e,h->elem_size); - - if(pos>=h->max_size) { - h->max_size = h->max_size<15?15:(h->max_size+1)*2-1; - h->elements = (void**)rfx_realloc(h->elements, h->max_size*sizeof(void*)); - assert(posmax_size); - } - - h->elements[pos] = data; - up(h, pos); -} -int heap_size(heap_t*h) -{ - return h->size; -} -void* heap_peek(heap_t*h) -{ - if(!h || !h->size) - return 0; - return h->elements[0]; -} -void* heap_chopmax(heap_t*h) -{ - if(!h->size) - return 0; - void*p = h->elements[0]; - h->elements[0] = h->elements[--h->size]; - down(h,0); - return p; -} -void heap_dump(heap_t*h, FILE*fi) -{ - int t; - for(t=0;tsize;t++) { - int s; - for(s=0;s<=t;s=(s+1)*2-1) { - if(s==t) fprintf(fi,"\n"); - } - //fprintf(fi,"%d ", h->elements[t]->x); //? - } -} -void** heap_flatten(heap_t*h) -{ - void**nodes = (void**)rfx_alloc((h->size+1)*sizeof(void*)); - void**p = nodes; - - while(h->size) { - /*printf("Heap Size: %d\n", h->size); - heap_print(stdout, h); - printf("\n");*/ - *p++ = heap_chopmax(h); - } - *p++ = 0; - return nodes; -} - -// ------------------------------- trie -------------------------------------- - -trie_t*trie_new() -{ - return (trie_t*)rfx_calloc(sizeof(trie_t)); -} -static char _trie_put(trielayer_t**t, unsigned const char*id, void*data) -{ - if(!*t) { - (*t) = rfx_calloc(sizeof(trielayer_t)); - (*t)->rest = (unsigned char*)strdup((char*)id); - (*t)->data = data; - return 0; - } - if((*t)->rest && (*t)->rest[0]) { - // make room: shift whatever's currently in here one node down - _trie_put(&(*t)->row[(*t)->rest[0]], (*t)->rest+1, (*t)->data); - (*t)->rest = 0; - } - if(id[0]) { - return _trie_put(&(*t)->row[id[0]], id+1, data); - } else { - char overwrite = 0; - if((*t)->rest) - overwrite = 1; - (*t)->rest = (unsigned char*)strdup(""); - (*t)->data = data; - return overwrite; - } -} -static char _trie_remove(trielayer_t*t, unsigned const char*id) -{ - while(t) { - if(t->rest && !strcmp((char*)t->rest, (char*)id)) { - free(t->rest); - t->rest = 0; - return 1; - } - if(!*id) - return 0; - t = t->row[*id++]; - } - return 0; -} - -static void trie_rollback_removes(trie_t*t, unsigned const char*id, void*data); -static void trie_rollback_adds(trie_t*t, unsigned const char*id, void*data); - -void trie_put(trie_t*t, unsigned const char*id, void*data) -{ - if(!t->rollback) { - _trie_put(&t->start, id, data); - } else { - char contains = trie_contains(t, id); - void*olddata = contains?trie_lookup(t, id):0; - _trie_put(&t->start, id, data); - if(contains) { - trie_rollback_adds(t, id, olddata); - } - trie_rollback_removes(t, id, data); - } -} -char trie_remove(trie_t*t, unsigned const char*id) -{ - if(!t->rollback) { - return _trie_remove(t->start, id); - } else { - void*olddata = trie_lookup(t, id); - char exists = _trie_remove(t->start, id); - if(exists) { - trie_rollback_adds(t, id, olddata); - } - return exists; - } -} -int trie_contains(trie_t*trie, unsigned const char*id) -{ - trielayer_t*t = trie->start; - while(t) { - if(t->rest && !strcmp((char*)t->rest, (char*)id)) - return 1; - if(!*id) - return 0; - t = t->row[*id++]; - } - return 0; -} -void* trie_lookup(trie_t*trie, unsigned const char*id) -{ - trielayer_t*t = trie->start; - while(t) { - if(t->rest && !strcmp((char*)t->rest, (char*)id)) - return t->data; - if(!*id) - return 0; - t = t->row[*id++]; - } - return 0; -} - -typedef struct _triememory { - const unsigned char*key; - void*data; - char del; // 0/1 - struct _triememory*next; -} triememory_t; - -typedef struct _trierollback { - triememory_t*ops; - struct _trierollback*prev; -} trierollback_t; - -static void trie_rollback_adds(trie_t*t, unsigned const char*id, void*data) -{ - trierollback_t*rollback = (trierollback_t*)t->rollback; - triememory_t*m = (triememory_t*)rfx_calloc(sizeof(triememory_t)); - m->key = id; - m->data = data; - m->del = 0; - m->next = rollback->ops; - rollback->ops = m; -} -static void trie_rollback_removes(trie_t*t, unsigned const char*id, void*data) -{ - trierollback_t*rollback = (trierollback_t*)t->rollback; - triememory_t*m = (triememory_t*)rfx_calloc(sizeof(triememory_t)); - m->key = id; - m->data = data; - m->del = 1; - m->next = rollback->ops; - rollback->ops = m; -} - -void _trie_dump(trielayer_t*t, char*buffer, int pos) -{ - int i; - for(i=0;i<256;i++) { - if(t->row[i]) { - buffer[pos]=i; - _trie_dump(t->row[i], buffer, pos+1); - } - } - if(t->rest) { - buffer[pos]=0; - printf("%s%s %08x\n", buffer, t->rest, (int)t->data); - } -} - -void trie_dump(trie_t*t) -{ - char buffer[256]; - _trie_dump(t->start, buffer, 0); -} - - -void trie_remember(trie_t*t) -{ - trierollback_t*old = (trierollback_t*)t->rollback; - t->rollback = (trierollback_t*)rfx_calloc(sizeof(trierollback_t)); - ((trierollback_t*)t->rollback)->prev = old; -} - -void trie_rollback(trie_t*t) -{ - trierollback_t*rollback = (trierollback_t*)t->rollback; - if(!rollback) { - fprintf(stderr, "Internal error: can't roll back this trie any further\n"); - return; - } - t->rollback = ((trierollback_t*)t->rollback)->prev; - - triememory_t*op = rollback->ops; - while(op) { - triememory_t*next = op->next; - if(op->del) { - if(!_trie_remove(t->start, op->key)) { - fprintf(stderr, "Internal error: can't delete key %s in trie during rollback\n", op->key); - } - } else { - if(_trie_put(&t->start, op->key, op->data)) { - fprintf(stderr, "Internal error: overwrote key %s in trie during rollback\n", op->key); - } - } - free(op); - op = next; - } -} - - -// ------------------------------- crc32 -------------------------------------- -static unsigned int crc32[256]; -static char crc32_initialized=0; -static void crc32_init(void) -{ - int t; - if(crc32_initialized) - return; - crc32_initialized = 1; - for(t=0; t<256; t++) { - unsigned int c = t; - int s; - for (s = 0; s < 8; s++) { - c = (0xedb88320L*(c&1)) ^ (c >> 1); - } - crc32[t] = c; - } -} -static uint64_t crc64[256]; -static char crc64_initialized=0; -static void crc64_init(void) -{ - int t; - if(crc64_initialized) - return; - crc64_initialized = 1; - for(t=0; t<256; t++) { - unsigned int c = t; - int s; - for (s = 0; s < 8; s++) { - c = ((c&1)?0xC96C5795D7870F42ll:0) ^ (c >> 1); - } - crc64[t] = c; - } -} -// ------------------------------- string_t ----------------------------------- - -void string_set2(string_t*str, const char*text, int len) -{ - str->len = len; - str->str = text; -} -void string_set(string_t*str, const char*text) -{ - if(text) { - str->len = strlen(text); - } else { - str->len = 0; - } - str->str = text; -} -string_t string_new(const char*text, int len) -{ - string_t s; - s.len = len; - s.str = text; - return s; -} -string_t string_new2(const char*text) -{ - string_t s; - if(text) { - s.len = strlen(text); - } else { - s.len = 0; - } - s.str = text; - return s; -} -string_t* string_new3(const char*text, int len) -{ - if(!text) { - string_t*s = malloc(sizeof(string_t)); - s->len = 0; - s->str = 0; - return s; - } else { - string_t*s = malloc(sizeof(string_t)+len+1); - s->len = len; - s->str = (const char*)(s+1); - memcpy((char*)s->str, text, len); - ((char*)s->str)[len]=0; - return s; - } -} -string_t* string_new4(const char*text) -{ - int l = strlen(text); - return string_new3(text, l); -} - -void string_free(string_t*s) -{ - if(!s) - return; - s->len = 0; - if((string_t*)(s->str) == s+1) { - s->str = 0; - rfx_free(s); - } else { - rfx_free((char*)(s->str)); - s->str = 0; - rfx_free(s); - } -} -char* string_cstr(string_t*str) -{ - return strdup_n(str->str, str->len); -} -char* string_escape(string_t*str) -{ - int t; - int len = 0; - for(t=0;tlen;t++) { - if(str->str[t]<0x20) - len+=3; - else - len++; - } - char*s = malloc(len+1); - char*p=s; - for(t=0;tlen;t++) { - if(str->str[t]<0x20) { - *p++ ='\\'; - unsigned char c = str->str[t]; - *p++ = "0123456789abcdef"[c>>4]; - *p++ = "0123456789abcdef"[c&0x0f]; - } else { - *p++ = str->str[t]; - } - } - *p++ = 0; - assert(p == &s[len+1]); - return s; -} - -unsigned int crc32_add_byte(unsigned int checksum, unsigned char b) -{ - crc32_init(); - return checksum>>8 ^ crc32[(b^checksum)&0xff]; -} -unsigned int crc32_add_string(unsigned int checksum, const char*s) -{ - crc32_init(); - if(!s) - return checksum; - while(*s) { - checksum = checksum>>8 ^ crc32[(*s^checksum)&0xff]; - s++; - } - return checksum; -} -unsigned int crc32_add_bytes(unsigned int checksum, const void*_s, int len) -{ - unsigned char*s = (unsigned char*)_s; - crc32_init(); - if(!s || !len) - return checksum; - do { - checksum = checksum>>8 ^ crc32[(*s^checksum)&0xff]; - s++; - } while(--len); - return checksum; -} - -unsigned int string_hash(const string_t*str) -{ - int t; - unsigned int checksum = 0; - crc32_init(); - for(t=0;tlen;t++) { - checksum = checksum>>8 ^ crc32[(str->str[t]^checksum)&0xff]; - } - return checksum; -} -unsigned int string_hash2(const char*str) -{ - unsigned int checksum = 0; - const char*p = str; - crc32_init(); - while(*p) { - checksum = checksum>>8 ^ crc32[(*p^checksum)&0xff]; - p++; - } - return checksum; -} -uint64_t string_hash64(const char*str) -{ - uint64_t checksum = 0; - const char*p = str; - crc64_init(); - while(*p) { - checksum = checksum>>8 ^ crc64[(*p^checksum)&0xff]; - p++; - } - return checksum; -} -unsigned int string_hash3(const char*str, int len) -{ - string_t s; - s.str = str; - s.len = len; - return string_hash(&s); -} -void string_dup2(string_t*str, const char*text, int len) -{ - str->len = len; - str->str = strdup_n(text, len); -} -void string_dup(string_t*str, const char*text) -{ - str->len = strlen(text); - str->str = strdup(text); -} -int string_equals(string_t*str, const char*text) -{ - int l = strlen(text); - if(str->len == l && !memcmp(str->str, text, l)) - return 1; - return 0; -} -int string_equals2(string_t*str, string_t*str2) -{ - if(str->len == str2->len && !memcmp(str->str, str2->str, str->len)) - return 1; - return 0; -} - -char* concat2(const char* t1, const char* t2) -{ - int l1 = strlen(t1); - int l2 = strlen(t2); - char*text = malloc(l1+l2+1); - memcpy(text , t1, l1); - memcpy(text+l1, t2, l2); - text[l1+l2] = 0; - return text; -} - -char* concat3(const char* t1, const char* t2, const char* t3) -{ - int l1 = strlen(t1); - int l2 = strlen(t2); - int l3 = strlen(t3); - char*text = malloc(l1+l2+l3+1); - memcpy(text , t1, l1); - memcpy(text+l1, t2, l2); - memcpy(text+l1+l2, t3, l3); - text[l1+l2+l3] = 0; - return text; -} - -// ------------------------------- stringarray_t ------------------------------ - -typedef struct _stringlist { - int index; - struct _stringlist*next; -} stringlist_t; - -typedef struct _stringarray_internal_t -{ - mem_t pos; - stringlist_t**hash; - int num; - int hashsize; -} stringarray_internal_t; - -void stringarray_init(stringarray_t*sa, int hashsize) -{ - stringarray_internal_t*s; - int t; - sa->internal = (stringarray_internal_t*)rfx_calloc(sizeof(stringarray_internal_t)); - s = (stringarray_internal_t*)sa->internal; - mem_init(&s->pos); - s->hash = rfx_calloc(sizeof(stringlist_t*)*hashsize); - s->hashsize = hashsize; -} -void stringarray_put(stringarray_t*sa, string_t str) -{ - stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; - int pos; - int hash = string_hash(&str) % s->hashsize; - - char*ss = string_cstr(&str); - mem_put(&s->pos, &ss, sizeof(char*)); - - stringlist_t*l = rfx_alloc(sizeof(stringlist_t)); - l->index = s->num; - l->next = s->hash[hash]; - s->hash[hash] = l; - - s->num++; -} -char* stringarray_at(stringarray_t*sa, int pos) -{ - stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; - char*p; - if(pos<0 || pos>=s->num) - return 0; - p = *(char**)&s->pos.buffer[pos*sizeof(char*)]; - if(p<0) - return 0; - return p; -} -string_t stringarray_at2(stringarray_t*sa, int pos) -{ - string_t s; - s.str = stringarray_at(sa, pos); - s.len = s.str?strlen(s.str):0; - return s; -} -static stringlist_t* stringlist_del(stringarray_t*sa, stringlist_t*l, int index) -{ - stringlist_t*ll = l; - stringlist_t*old = l; - while(l) { - if(index==l->index) { - old->next = l->next; - memset(l, 0, sizeof(stringlist_t)); - rfx_free(l); - if(old==l) - return 0; - else - return ll; - } - old = l; - l = l->next; - } - fprintf(stderr, "Internal error: did not find string %d in hash\n", index); - return ll; -} - -void stringarray_del(stringarray_t*sa, int pos) -{ - stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; - string_t str = stringarray_at2(sa, pos); - int hash = string_hash(&str) % s->hashsize; - s->hash[hash] = stringlist_del(sa, s->hash[hash], pos); - *(char**)&s->pos.buffer[pos*sizeof(char*)] = 0; -} -int stringarray_find(stringarray_t*sa, string_t* str) -{ - stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; - int hash = string_hash(str) % s->hashsize; - int t; - stringlist_t*l = s->hash[hash]; - //TODO: statistics - while(l) { - string_t s = stringarray_at2(sa, l->index); - if(string_equals2(str, &s)) { - return l->index; - } - l = l->next; - } - return -1; -} -void stringarray_clear(stringarray_t*sa) -{ - stringarray_internal_t*s = (stringarray_internal_t*)sa->internal; - mem_clear(&s->pos); - int t; - for(t=0;thashsize;t++) { - stringlist_t*l = s->hash[t]; - while(l) { - stringlist_t*next = l->next; - memset(l, 0, sizeof(stringlist_t)); - rfx_free(l); - l = next; - } - } - rfx_free(s->hash);s->hash=0; - rfx_free(s); -} -void stringarray_destroy(stringarray_t*sa) -{ - stringarray_clear(sa); - rfx_free(sa); -} - -// ------------------------------- type_t ------------------------------- - -char ptr_equals(const void*o1, const void*o2) -{ - return o1==o2; -} -unsigned int ptr_hash(const void*o) -{ - return string_hash3((const char*)&o, sizeof(o)); -} -void* ptr_dup(const void*o) -{ - return (void*)o; -} -void ptr_free(void*o) -{ - return; -} - -char int_equals(const void*o1, const void*o2) -{ - return o1==o2; -} -unsigned int int_hash(const void*o) -{ - return string_hash3((const char*)&o, sizeof(o)); -} -void* int_dup(const void*o) -{ - return (void*)o; -} -void int_free(void*o) -{ - return; -} - -char charptr_equals(const void*o1, const void*o2) -{ - if(!o1 || !o2) - return o1==o2; - return !strcmp(o1,o2); -} -unsigned int charptr_hash(const void*o) -{ - if(!o) - return 0; - return string_hash2(o); -} -void* charptr_dup(const void*o) -{ - if(!o) - return 0; - return strdup(o); -} -void charptr_free(void*o) -{ - if(o) { - rfx_free(o); - } -} - -char stringstruct_equals(const void*o1, const void*o2) -{ - if(!o1 || !o2) - return o1==o2; - string_t*s1 = (string_t*)o1; - string_t*s2 = (string_t*)o2; - int l = s1->lenlen?s1->len:s2->len; - int r = memcmp(s1->str, s2->str, l); - if(r) - return 0; - else - return s1->len==s2->len; -} -unsigned int stringstruct_hash(const void*o) -{ - if(!o) return 0; - return string_hash(o); -} -string_t*string_dup3(string_t*o) -{ - if(!o) return 0; - if(!o->str) { - string_t*s = malloc(sizeof(string_t)); - s->str=0; - s->len=0; - return s; - } - string_t*s = rfx_alloc(sizeof(string_t)+o->len+1); - s->len = o->len; - s->str = (const char*)(s+1); - memcpy((char*)s->str, o->str, s->len); - ((char*)s->str)[s->len]=0; - return s; -} -void stringstruct_free(void*o) -{ - if(o) - string_free(o); -} - -type_t int_type = { - equals: int_equals, - hash: int_hash, - dup: int_dup, - free: int_free, -}; - -type_t ptr_type = { - equals: ptr_equals, - hash: ptr_hash, - dup: ptr_dup, - free: ptr_free, -}; - -type_t charptr_type = { - equals: charptr_equals, - hash: charptr_hash, - dup: charptr_dup, - free: charptr_free, -}; - -type_t stringstruct_type = { - equals: stringstruct_equals, - hash: stringstruct_hash, - dup: (dup_func)string_dup3, - free: stringstruct_free, -}; - -// ------------------------------- dictionary_t ------------------------------- - -#define INITIAL_SIZE 1 - -static int max(int x, int y) { - return x>y?x:y; -} - -dict_t*dict_new() -{ - dict_t*d = rfx_alloc(sizeof(dict_t)); - dict_init(d, INITIAL_SIZE); - return d; -} -dict_t*dict_new2(type_t*t) -{ - dict_t*d = rfx_alloc(sizeof(dict_t)); - dict_init(d, INITIAL_SIZE); - d->key_type = t; - return d; -} -void dict_init(dict_t*h, int size) -{ - memset(h, 0, sizeof(dict_t)); - h->hashsize = size; - h->slots = h->hashsize?(dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*h->hashsize):0; - h->num = 0; - h->key_type = &charptr_type; -} -void dict_init2(dict_t*h, type_t*t, int size) -{ - memset(h, 0, sizeof(dict_t)); - h->hashsize = size; - h->slots = h->hashsize?(dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*h->hashsize):0; - h->num = 0; - h->key_type = t; -} - -dict_t*dict_clone(dict_t*o) -{ - dict_t*h = rfx_alloc(sizeof(dict_t)); - memcpy(h, o, sizeof(dict_t)); - h->slots = h->hashsize?(dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*h->hashsize):0; - int t; - for(t=0;thashsize;t++) { - dictentry_t*e = o->slots[t]; - while(e) { - dictentry_t*n = (dictentry_t*)rfx_alloc(sizeof(dictentry_t)); - memcpy(n, e, sizeof(dictentry_t)); - n->key = h->key_type->dup(e->key); - n->data = e->data; - n->next = h->slots[t]; - h->slots[t] = n; - e = e->next; - } - } - return h; -} - -static void dict_expand(dict_t*h, int newlen) -{ - assert(h->hashsize < newlen); - dictentry_t**newslots = (dictentry_t**)rfx_calloc(sizeof(dictentry_t*)*newlen); - int t; - for(t=0;thashsize;t++) { - dictentry_t*e = h->slots[t]; - while(e) { - dictentry_t*next = e->next; - unsigned int newhash = e->hash%newlen; - e->next = newslots[newhash]; - newslots[newhash] = e; - e = next; - } - } - if(h->slots) - rfx_free(h->slots); - h->slots = newslots; - h->hashsize = newlen; -} - -dictentry_t* dict_put(dict_t*h, const void*key, void* data) -{ - unsigned int hash = h->key_type->hash(key); - dictentry_t*e = (dictentry_t*)rfx_alloc(sizeof(dictentry_t)); - - if(!h->hashsize) - dict_expand(h, 1); - - unsigned int hash2 = hash % h->hashsize; - - e->key = h->key_type->dup(key); - e->hash = hash; //for resizing - e->next = h->slots[hash2]; - e->data = data; - h->slots[hash2] = e; - h->num++; - return e; -} -void dict_put2(dict_t*h, const char*s, void*data) -{ - assert(h->key_type == &charptr_type); - dict_put(h, s, data); -} -void dict_dump(dict_t*h, FILE*fi, const char*prefix) -{ - int t; - for(t=0;thashsize;t++) { - dictentry_t*e = h->slots[t]; - while(e) { - if(h->key_type!=&charptr_type) { - fprintf(fi, "%s%08x=%08x\n", prefix, (int)e->key, (int)e->data); - } else { - fprintf(fi, "%s%s=%08x\n", prefix, (char*)e->key, (int)e->data); - } - e = e->next; - } - } -} - -int dict_count(dict_t*h) -{ - return h->num; -} - -static inline dictentry_t* dict_do_lookup(dict_t*h, const void*key) -{ - if(!h->num) { - return 0; - } - - unsigned int ohash = h->key_type->hash(key); - unsigned int hash = ohash % h->hashsize; - - /* check first entry for match */ - dictentry_t*e = h->slots[hash]; - if(e && h->key_type->equals(e->key, key)) { - return e; - } else if(e) { - e = e->next; - } - - /* if dict is 2/3 filled, double the size. Do - this the first time we have to actually iterate - through a slot to find our data */ - if(e && h->num*3 >= h->hashsize*2) { - int newsize = h->hashsize; - while(h->num*3 >= newsize*2) { - newsize = newsize<15?15:(newsize+1)*2-1; - } - dict_expand(h, newsize); - hash = ohash % h->hashsize; - e = h->slots[hash]; - if(e && h->key_type->equals(e->key, key)) { - // omit move to front - return e; - } else if(e) { - e = e->next; - } - } - - /* check subsequent entries for a match */ - dictentry_t*last = h->slots[hash]; - while(e) { - if(h->key_type->equals(e->key, key)) { - /* move to front- makes a difference of about 10% in most applications */ - last->next = e->next; - e->next = h->slots[hash]; - h->slots[hash] = e; - return e; - } - last=e; - e = e->next; - } - return 0; -} -void* dict_lookup(dict_t*h, const void*key) -{ - dictentry_t*e = dict_do_lookup(h, key); - if(e) - return e->data; - return 0; -} -char dict_contains(dict_t*h, const void*key) -{ - dictentry_t*e = dict_do_lookup(h, key); - return !!e; -} - -char dict_del(dict_t*h, const void*key) -{ - if(!h->num) - return 0; - unsigned int hash = h->key_type->hash(key) % h->hashsize; - dictentry_t*head = h->slots[hash]; - dictentry_t*e = head, *prev=0; - while(e) { - if(h->key_type->equals(e->key, key)) { - dictentry_t*next = e->next; - h->key_type->free(e->key); - memset(e, 0, sizeof(dictentry_t)); - rfx_free(e); - if(e == head) { - h->slots[hash] = next; - } else { - assert(prev); - prev->next = next; - } - h->num--; - return 1; - } - prev = e; - e = e->next; - } - return 0; -} - -char dict_del2(dict_t*h, const void*key, void*data) -{ - if(!h->num) - return 0; - unsigned int hash = h->key_type->hash(key) % h->hashsize; - dictentry_t*head = h->slots[hash]; - dictentry_t*e = head, *prev=0; - while(e) { - if(h->key_type->equals(e->key, key) && e->data == data) { - dictentry_t*next = e->next; - h->key_type->free(e->key); - memset(e, 0, sizeof(dictentry_t)); - rfx_free(e); - if(e == head) { - h->slots[hash] = next; - } else { - assert(prev); - prev->next = next; - } - h->num--; - return 1; - } - prev = e; - e = e->next; - } - return 0; -} - -dictentry_t* dict_get_slot(dict_t*h, const void*key) -{ - if(!h->num) - return 0; - unsigned int ohash = h->key_type->hash(key); - unsigned int hash = ohash % h->hashsize; - return h->slots[hash]; -} - -void dict_foreach_keyvalue(dict_t*h, void (*runFunction)(void*data, const void*key, void*val), void*data) -{ - int t; - for(t=0;thashsize;t++) { - dictentry_t*e = h->slots[t]; - while(e) { - dictentry_t*next = e->next; - if(runFunction) { - runFunction(data, e->key, e->data); - } - e = e->next; - } - } -} -void dict_foreach_value(dict_t*h, void (*runFunction)(void*)) -{ - int t; - for(t=0;thashsize;t++) { - dictentry_t*e = h->slots[t]; - while(e) { - dictentry_t*next = e->next; - if(runFunction) { - runFunction(e->data); - } - e = e->next; - } - } -} - -void dict_free_all(dict_t*h, char free_keys, void (*free_data_function)(void*)) -{ - int t; - for(t=0;thashsize;t++) { - dictentry_t*e = h->slots[t]; - while(e) { - dictentry_t*next = e->next; - if(free_keys) { - h->key_type->free(e->key); - } - if(free_data_function) { - free_data_function(e->data); - } - memset(e, 0, sizeof(dictentry_t)); - rfx_free(e); - e = next; - } - h->slots[t]=0; - } - rfx_free(h->slots); - memset(h, 0, sizeof(dict_t)); -} - -void dict_clear_shallow(dict_t*h) -{ - dict_free_all(h, 0, 0); -} - -void dict_clear(dict_t*h) -{ - dict_free_all(h, 1, 0); -} - -void dict_destroy_shallow(dict_t*dict) -{ - dict_clear_shallow(dict); - rfx_free(dict); -} - -void dict_destroy(dict_t*dict) -{ - if(!dict) - return; - dict_clear(dict); - rfx_free(dict); -} - -// ------------------------------- mtf_t -------------------------------------- -mtf_t* mtf_new(type_t*type) -{ - NEW(mtf_t, mtf); - mtf->type = type; - return mtf; -} -void mtf_increase(mtf_t*m, const void*key) -{ - mtf_item_t*item = m->first; - mtf_item_t*last = 0; - while(item) { - if(m->type->equals(item->key, key)) { - item->num++; - if(item->num>m->first->num) { - if(last) last->next = item->next; - else m->first = item->next; - item->next = m->first; - m->first = item; - } - return; - } - last = item; - item = item->next; - } - NEW(mtf_item_t,n); - if(last) last->next = n; - else m->first = n; - n->key = key; - n->num = 1; -} -void mtf_destroy(mtf_t*m) -{ - if(!m) return; - mtf_item_t*item = m->first; - m->first = 0; - while(item) { - mtf_item_t*next = item->next; - item->next = 0; - free(item); - item = next; - } - free(m); -} - -// ------------------------------- map_t -------------------------------------- - -typedef struct _map_internal_t -{ - dict_t d; -} map_internal_t; - -void map_init(map_t*map) -{ - map_internal_t*m; - map->internal = (map_internal_t*)rfx_calloc(sizeof(map_internal_t)); - m = (map_internal_t*)map->internal; - dict_init(&m->d, INITIAL_SIZE); -} -void map_put(map_t*map, string_t t1, string_t t2) -{ - map_internal_t*m = (map_internal_t*)map->internal; - string_t s; - char* s1 = string_cstr(&t1); - dict_put2(&m->d, s1, (void*)string_cstr(&t2)); - rfx_free(s1); -} -const char* map_lookup(map_t*map, const char*name) -{ - map_internal_t*m = (map_internal_t*)map->internal; - const char*value = dict_lookup(&m->d, name); - return value; -} -static void freestring(void*data) -{ - rfx_free(data); -} -static void dumpmapentry(void*data, const void*key, void*value) -{ - FILE*fi = (FILE*)data; - fprintf(fi, "%s=%s\n", (char*)key, (char*)value); -} -void map_dump(map_t*map, FILE*fi, const char*prefix) -{ - int t; - map_internal_t*m = (map_internal_t*)map->internal; - dict_foreach_keyvalue(&m->d, dumpmapentry, fi); -} -void map_clear(map_t*map) -{ - map_internal_t*m = (map_internal_t*)map->internal; - dict_free_all(&m->d, 1, freestring); - rfx_free(m); -} -void map_destroy(map_t*map) -{ - map_clear(map); - rfx_free(map); -} - -// ------------------------------- array_t -------------------------------------- - -array_t* array_new() { - array_t*d = malloc(sizeof(array_t)); - memset(d, 0, sizeof(array_t)); - d->entry2pos = dict_new(); - return d; -} -array_t* array_new2(type_t*type) { - array_t*d = malloc(sizeof(array_t)); - memset(d, 0, sizeof(array_t)); - d->entry2pos = dict_new2(type); - return d; -} -void*array_getkey(array_t*array, int nr) { - if(nr >= array->num || nr<0) { - fprintf(stderr, "error: reference to element %d in array[%d]\n", nr, array->num); - return 0; - } - return array->d[nr].name; -} -void*array_getvalue(array_t*array, int nr) { - if(nr >= array->num || nr<0) { - fprintf(stderr, "error: reference to element %d in array[%d]\n", nr, array->num); - return 0; - } - return array->d[nr].data; -} -int array_append(array_t*array, const void*name, void*data) { - while(array->size <= array->num) { - array->size += 64; - if(!array->d) { - array->d = malloc(sizeof(array_entry_t)*array->size); - } else { - array->d = realloc(array->d, sizeof(array_entry_t)*array->size); - } - } - - dictentry_t*e = dict_put(array->entry2pos, name, (void*)(ptroff_t)(array->num+1)); - - if(name) { - array->d[array->num].name = e->key; - } else { - array->d[array->num].name = 0; - } - array->d[array->num].data = (void*)data; - return array->num++; -} -int array_find(array_t*array, const void*name) -{ - int pos = (int)(ptroff_t)dict_lookup(array->entry2pos, name); - return pos-1; -} -int array_find2(array_t*array, const void*name, void*data) -{ - dict_t*h= array->entry2pos; - dictentry_t*e = dict_get_slot(array->entry2pos, name); - - while(e) { - int index = ((int)(ptroff_t)e->data) - 1; - if(h->key_type->equals(e->key, name) && array->d[index].data == data) { - return index; - } - e = e->next; - } - return -1; -} -int array_update(array_t*array, const void*name, void*data) { - int pos = array_find(array, name); - if(pos>=0) { - array->d[pos].data = data; - return pos; - } - return array_append(array, name, data); -} -int array_append_if_new(array_t*array, const void*name, void*data) { - int pos = array_find(array, name); - if(pos>=0) - return pos; - return array_append(array, name, data); -} -void array_free(array_t*array) { - dict_destroy(array->entry2pos); - if(array->d) { - free(array->d);array->d = 0; - } - free(array); -} - -// ------------------------------- list_t -------------------------------------- - -struct _commonlist; -typedef struct _listinfo { - int size; - struct _commonlist*last; -} listinfo_t; - -typedef struct _commonlist { - void*entry; - struct _commonlist*next; - listinfo_t info[0]; -} commonlist_t; - -int list_length_(void*_list) -{ - commonlist_t*l = (commonlist_t*)_list; - if(!l) - return 0; - return l->info[0].size; -} -void list_concat_(void*_l1, void*_l2) -{ - commonlist_t**l1 = (commonlist_t**)_l1; - commonlist_t**l2 = (commonlist_t**)_l2; - - if(!*l1) { - *l1 = *l2; - } else if(*l2) { - (*l1)->info[0].last->next = *l2; - (*l1)->info[0].last = (*l2)->info[0].last; - (*l1)->info[0].size += (*l2)->info[0].size; - } - *l2 = 0; -} -void list_append_(void*_list, void*entry) -{ - commonlist_t**list = (commonlist_t**)_list; - commonlist_t* n = 0; - if(!*list) { - n = (commonlist_t*)malloc(sizeof(commonlist_t)+sizeof(listinfo_t)); - *list = n; - (*list)->info[0].size = 0; - } else { - n = malloc(sizeof(commonlist_t)); - (*list)->info[0].last->next = n; - } - n->next = 0; - n->entry = entry; - (*list)->info[0].last = n; - (*list)->info[0].size++; -} -/* notice: prepending uses slighly more space than appending */ -void list_prepend_(void*_list, void*entry) -{ - commonlist_t**list = (commonlist_t**)_list; - commonlist_t* n = (commonlist_t*)malloc(sizeof(commonlist_t)+sizeof(listinfo_t)); - int size = 0; - commonlist_t* last = 0; - if(*list) { - last = (*list)->info[0].last; - size = (*list)->info[0].size; - } - n->next = *list; - n->entry = entry; - *list = n; - (*list)->info[0].last = last; - (*list)->info[0].size = size+1; -} -void list_free_(void*_list) -{ - commonlist_t**list = (commonlist_t**)_list; - commonlist_t*l = *list; - while(l) { - commonlist_t*next = l->next; - free(l); - l = next; - } - *list = 0; -} -void list_deep_free_(void*_list) -{ - commonlist_t**list = (commonlist_t**)_list; - commonlist_t*l = *list; - while(l) { - commonlist_t*next = l->next; - if(l->entry) { - free(l->entry);l->entry=0; - } - free(l); - l = next; - } - *list = 0; -} -void*list_clone_(void*_list) -{ - commonlist_t*l = *(commonlist_t**)_list; - - void*dest = 0; - while(l) { - commonlist_t*next = l->next; - list_append_(&dest, l->entry); - l = next; - } - return dest; - -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/q.h b/fluidbook/tools/swftools-special-swfdump/lib/q.h deleted file mode 100644 index 7080eca5d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/q.h +++ /dev/null @@ -1,310 +0,0 @@ -/* q.h - Header file for q.c. - - Part of the swftools package. - - Copyright (c) 2001,2002,2003,2004 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __q_h__ -#define __q_h__ - -#include -#include -#include "mem.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define NEW(t,y) t*y = (t*)rfx_calloc(sizeof(t)); -#define PTR_AS_INT(p) (((char*)(p))-((char*)NULL)) -#define INT_AS_PTR(i) (((char*)NULL)+(int)(i)) - -/* dynamically growing mem section */ -typedef struct _mem_t { - char*buffer; - int len; - int pos; - int read_pos; -} mem_t; - -/* fifo buffered growing mem region */ -typedef struct _ringbuffer_t -{ - void*internal; - int available; -} ringbuffer_t; - -/* non-nul terminated string */ -typedef struct _string_t { - const char*str; - int len; -} string_t; - -/* key/value pairs of strings */ -typedef struct _map_t { - void*internal; -} map_t; - -/* type information */ -typedef char (*equals_func)(const void*o1, const void*o2); -typedef unsigned int (*hash_func)(const void*o); -typedef void* (*dup_func)(const void*o); -typedef void (*free_func)(void*o); - -typedef struct _type_t { - equals_func equals; - hash_func hash; - dup_func dup; - free_func free; -} type_t; - -extern type_t charptr_type; -extern type_t stringstruct_type; -extern type_t ptr_type; -extern type_t int_type; - -typedef struct _dictentry { - void*key; - unsigned int hash; - void*data; - struct _dictentry*next; -} dictentry_t; - -/* (void*) pointers referenced by strings */ -typedef struct _dict { - dictentry_t**slots; - type_t*key_type; - int hashsize; - int num; -} dict_t; - -/* array of key/value pairs, with fast lookup */ -typedef struct _array_entry { - void*name; - void*data; -} array_entry_t; - -typedef struct _array { - int num; - int size; - array_entry_t*d; - dict_t*entry2pos; -} array_t; - -/* array of strings, string<->int mapping, - with O(1) for int->string lookup and - ~O(n/hashsize) for string->int lookup */ -typedef struct _stringarray_t -{ - void*internal; -} stringarray_t; - -/* heap */ -typedef struct _heap { - void**elements; - char*data; - int elem_size; - int size; - int max_size; - int(*compare)(const void *, const void *); -} heap_t; - -/* trie (with rollback) */ -typedef struct _trielayer { - struct _trielayer*row[256]; - unsigned char*rest; - void*data; -} trielayer_t; - -typedef struct _trie { - trielayer_t* start; - void*rollback; -} trie_t; - -/* move to front list structure */ -typedef struct _mtf_item { - const void*key; - int num; - struct _mtf_item*next; -} mtf_item_t; - -typedef struct _mtf { - mtf_item_t*first; - type_t*type; -} mtf_t; - -char* strdup_n(const char*str, int size); -char* allocprintf(const char*str, ...); - -float medianf(float*values, int n); - -unsigned int crc32_add_byte(unsigned int crc32, unsigned char b); -unsigned int crc32_add_string(unsigned int crc32, const char*s); -unsigned int crc32_add_bytes(unsigned int checksum, const void*s, int len); - -void mem_init(mem_t*mem); -int mem_put(mem_t*m, void*data, int length); -int mem_putstring(mem_t*m, string_t str); -int mem_get(mem_t*m, void*data, int length); -void mem_clear(mem_t*mem); -void mem_destroy(mem_t*mem); - -void ringbuffer_init(ringbuffer_t*r); -void ringbuffer_put(ringbuffer_t*r, void*buf, int size); -int ringbuffer_read(ringbuffer_t*r, void*buf, int size); -void ringbuffer_clear(ringbuffer_t*r); - -/* old style functions- should be renamed */ -string_t string_new(const char*text, int len); -string_t string_new2(const char*text); -void string_dup(string_t*str, const char*text); -void string_dup2(string_t*str, const char*text, int len); - -char* string_cstr(string_t*str); -char* string_escape(string_t*str); -string_t* string_new3(const char*text, int len); -string_t* string_new4(const char*text); -void string_free(string_t*s); -unsigned int string_hash(const string_t*str); -unsigned int string_hash2(const char*str); -unsigned int string_hash3(const char*str, int len); -uint64_t string_hash64(const char*str); -void string_set(string_t*str, const char*text); -void string_set2(string_t*str, const char*text, int len); -string_t*string_dup3(string_t*s); -int string_equals(string_t*str, const char*text); - -char* concat2(const char* t1, const char* t2); -char* concat3(const char* t1, const char* t2, const char* t3); - -void stringarray_init(stringarray_t*sa, int hashsize); -void stringarray_put(stringarray_t*sa, string_t str); - -char* stringarray_at(stringarray_t*sa, int pos); -string_t stringarray_at2(stringarray_t*sa, int pos); -int stringarray_find(stringarray_t*sa, string_t*str); -void stringarray_clear(stringarray_t*sa); -void stringarray_destroy(stringarray_t*sa); - -dict_t*dict_new(); -dict_t*dict_new2(type_t*type); -void dict_init(dict_t*dict, int size); -void dict_init2(dict_t*dict, type_t*type, int size); -dictentry_t*dict_put(dict_t*h, const void*key, void* data); -void dict_put2(dict_t*h, const char*s, void*data); -int dict_count(dict_t*h); -void dict_dump(dict_t*h, FILE*fi, const char*prefix); -dictentry_t* dict_get_slot(dict_t*h, const void*key); -char dict_contains(dict_t*h, const void*s); -void* dict_lookup(dict_t*h, const void*s); -char dict_del(dict_t*h, const void*s); -char dict_del2(dict_t*h, const void*key, void*data); -dict_t*dict_clone(dict_t*); - -void dict_foreach_keyvalue(dict_t*h, void (*runFunction)(void*data, const void*key, void*val), void*data); -void dict_foreach_value(dict_t*h, void (*runFunction)(void*)); -void dict_free_all(dict_t*h, char free_keys, void (*free_data_function)(void*)); -void dict_clear(dict_t*h); -void dict_destroy_shallow(dict_t*dict); -void dict_destroy(dict_t*dict); -#define DICT_ITERATE_DATA(d,t,v) \ - int v##_i;dictentry_t*v##_e;t v;\ - for(v##_i=0;v##_i<(d)->hashsize;v##_i++) \ - for(v##_e=(d)->slots[v##_i]; v##_e && ((v=(t)v##_e->data)||1); v##_e=v##_e->next) -#define DICT_ITERATE_KEY(d,t,v) \ - int v##_i;dictentry_t*v##_e;t v;\ - for(v##_i=0;v##_i<(d)->hashsize;v##_i++) \ - for(v##_e=(d)->slots[v##_i];v##_e && ((v=(t)v##_e->key)||1);v##_e=v##_e->next) -#define DICT_ITERATE_ITEMS(d,t1,v1,t2,v2) \ - int v1##_i;dictentry_t*v1##_e;t1 v1;t2 v2; \ - for(v1##_i=0;v1##_i<(d)->hashsize;v1##_i++) \ - for(v1##_e=(d)->slots[v1##_i]; v1##_e && (((v1=(t1)v1##_e->key)||1)&&((v2=(t2)v1##_e->data)||1)); v1##_e=v1##_e->next) - -void map_init(map_t*map); -void map_put(map_t*map, string_t t1, string_t t2); -const char* map_lookup(map_t*map, const char*name); -void map_dump(map_t*map, FILE*fi, const char*prefix); -void map_clear(map_t*map); -void map_destroy(map_t*map); - -void heap_init(heap_t*h,int elem_size, int(*compare)(const void *, const void *)); -heap_t* heap_new(int elem_size, int(*compare)(const void *, const void *)); -heap_t* heap_clone(heap_t*o); -void heap_clear(heap_t*h); -void heap_destroy(heap_t*h); -void heap_put(heap_t*h, void*e); -int heap_size(heap_t*h); -void* heap_peek(heap_t*h); -void* heap_chopmax(heap_t*h); -void heap_dump(heap_t*h, FILE*fi); -void** heap_flatten(heap_t*h); - -trie_t*trie_new(); -void trie_put(trie_t*t, unsigned const char*id, void*data); -char trie_remove(trie_t*t, unsigned const char*id); -void*trie_lookup(trie_t*t, unsigned const char*id); -int trie_contains(trie_t*t, unsigned const char*id); -void trie_remember(trie_t*t); -void trie_rollback(trie_t*t); -void trie_dump(trie_t*t); - -mtf_t* mtf_new(type_t*type); -void mtf_increase(mtf_t*m, const void*key); -void mtf_destroy(mtf_t*m); - -array_t* array_new(); -array_t* array_new2(type_t*type); -void array_free(array_t*array); -void*array_getkey(array_t*array, int nr); -void*array_getvalue(array_t*array, int nr); -int array_append(array_t*array, const void*name, void*data); -#define array_contains(a,b) (array_find((a),(b))>=0) -int array_find(array_t*array, const void*name); -int array_find2(array_t*array, const void*name, void*data); -int array_update(array_t*array, const void*name, void*data); -int array_append_if_new(array_t*array, const void*name, void*data); -#define array_length(a) ((a)->num) - -#define DECLARE(x) struct _##x;typedef struct _##x x##_t; -#define DECLARE_LIST(x) \ -struct _##x##_list { \ - struct _##x* x; \ - struct _##x##_list*next; \ -}; \ -typedef struct _##x##_list x##_list_t; -int list_length_(void*_list); -void*list_clone_(void*_list); -void list_append_(void*_list, void*entry); -void list_prepend_(void*_list, void*entry); -void list_free_(void*_list); -void list_deep_free_(void*_list); -void list_concat_(void*l1, void*l2); -#define list_new() ((void*)0) -#define list_append(list, e) {sizeof((list)->next);list_append_(&(list),(e));} -#define list_concat(l1, l2) {sizeof((l1)->next);sizeof((l2)->next);list_concat_(&(l1),&(l2));} -#define list_prepend(list, e) {sizeof((list)->next);list_prepend_(&(list),(e));} -#define list_free(list) {sizeof((list)->next);list_free_(&(list));} -#define list_deep_free(list) {sizeof((list)->next);list_deep_free_(&(list));} -#define list_clone(list) (sizeof((list)->next),(list?list_clone_(&(list)):0)) -#define list_length(list) (sizeof((list)->next),list_length_(list)) - -#ifdef __cplusplus -} -#endif - -#endif //__q_h__ diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile b/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile deleted file mode 100644 index 967e113b6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -# Generated automatically from Makefile.in by configure. -top_builddir = ../.. -srcdir = . -top_srcdir = ../.. -include ../../Makefile.common - -all: swf.$(O) image.$(O) - -libswf: ../libswf$(A) - -swf.$(O): swf.c swf.h - $(C) swf.c -o swf.$(O) - -image.$(O): image.c image.h - $(C) image.c -o image.$(O) - -swfrender: $(libswf_objects) ../../src/swfrender.c ../devices/render.$(O) - $(L) ../../src/swfrender.c $(libswf_objects) ../librfxswf$(A) ../gfxtools.$(O) ../png.$(O) ../devices/render.$(O) -o swfrender $(LIBS) - -install: -uninstall: - -clean: - rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile.in b/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile.in deleted file mode 100644 index 967e113b6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/readers/Makefile.in +++ /dev/null @@ -1,25 +0,0 @@ -# Generated automatically from Makefile.in by configure. -top_builddir = ../.. -srcdir = . -top_srcdir = ../.. -include ../../Makefile.common - -all: swf.$(O) image.$(O) - -libswf: ../libswf$(A) - -swf.$(O): swf.c swf.h - $(C) swf.c -o swf.$(O) - -image.$(O): image.c image.h - $(C) image.c -o image.$(O) - -swfrender: $(libswf_objects) ../../src/swfrender.c ../devices/render.$(O) - $(L) ../../src/swfrender.c $(libswf_objects) ../librfxswf$(A) ../gfxtools.$(O) ../png.$(O) ../devices/render.$(O) -o swfrender $(LIBS) - -install: -uninstall: - -clean: - rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/image.c b/fluidbook/tools/swftools-special-swfdump/lib/readers/image.c deleted file mode 100644 index a9f96e836..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/readers/image.c +++ /dev/null @@ -1,160 +0,0 @@ -#include -#include -#include -#include "../gfxdevice.h" -#include "../gfxsource.h" -#include "../gfxtools.h" -#include "../log.h" -#include "../mem.h" -#include "../jpeg.h" -#include "../png.h" -#include "image.h" - -typedef struct _image_page_internal -{ -} image_page_internal_t; - -typedef struct _image_doc_internal -{ - gfximage_t img; -} image_doc_internal_t; - -void imagepage_destroy(gfxpage_t*image_page) -{ - image_page_internal_t*i= (image_page_internal_t*)image_page->internal; - free(image_page->internal);image_page->internal = 0; - free(image_page);image_page=0; -} - -void imagepage_render(gfxpage_t*page, gfxdevice_t*output) -{ - image_page_internal_t*i = (image_page_internal_t*)page->internal; - image_doc_internal_t*pi = (image_doc_internal_t*)page->parent->internal; - - gfxcxform_t cxform; - memset(&cxform, 0, sizeof(cxform)); - cxform.rr = 1; - cxform.gg = 1; - cxform.bb = 1; - cxform.aa = 1; - - gfxmatrix_t m; - memset(&m, 0, sizeof(m)); - m.m00 = 1; - m.m11 = 1; - - gfxline_t* rect = gfxline_makerectangle(0, 0, pi->img.width, pi->img.height); - output->fillbitmap(output, rect, &pi->img, &m, &cxform); - gfxline_free(rect); -} - -void imagepage_rendersection(gfxpage_t*page, gfxdevice_t*output, gfxcoord_t x, gfxcoord_t y, gfxcoord_t _x1, gfxcoord_t _y1, gfxcoord_t _x2, gfxcoord_t _y2) -{ - image_page_internal_t*i = (image_page_internal_t*)page->internal; - image_doc_internal_t*pi = (image_doc_internal_t*)page->parent->internal; - - gfxcxform_t cxform; - memset(&cxform, 0, sizeof(cxform)); - cxform.rr = 1; - cxform.gg = 1; - cxform.bb = 1; - cxform.aa = 1; - - gfxmatrix_t m; - memset(&m, 0, sizeof(m)); - m.m00 = 1; - m.m11 = 1; - m.tx = x; - m.ty = y; - - gfxline_t* rect = gfxline_makerectangle(0, 0, pi->img.width, pi->img.height); - gfxline_t* rect2 = gfxline_makerectangle(_x1, _y1, _x2, _y2); - - output->startclip(output, rect2); - output->fillbitmap(output, rect, &pi->img, &m, &cxform); - output->endclip(output); - gfxline_free(rect); - gfxline_free(rect2); -} - -void image_doc_destroy(gfxdocument_t*gfx) -{ - image_doc_internal_t*i= (image_doc_internal_t*)gfx->internal; - - free(i->img.data);i->img.data = 0; - - free(gfx->internal);gfx->internal=0; - free(gfx);gfx=0; -} - -void image_doc_setparameter(gfxdocument_t*gfx, const char*name, const char*value) -{ - image_doc_internal_t*i= (image_doc_internal_t*)gfx->internal; -} - -gfxpage_t* image_doc_getpage(gfxdocument_t*doc, int page) -{ - image_doc_internal_t*di= (image_doc_internal_t*)doc->internal; - if(page != 1) - return 0; - - gfxpage_t* image_page = (gfxpage_t*)malloc(sizeof(gfxpage_t)); - image_page_internal_t*pi= (image_page_internal_t*)malloc(sizeof(image_page_internal_t)); - memset(pi, 0, sizeof(image_page_internal_t)); - - image_page->internal = pi; - image_page->destroy = imagepage_destroy; - image_page->render = imagepage_render; - image_page->rendersection = imagepage_rendersection; - image_page->width = di->img.width; - image_page->height = di->img.height; - image_page->parent = doc; - image_page->nr = page; - return image_page; -} - -static void image_setparameter(gfxsource_t*src, const char*name, const char*value) -{ - msg(" (gfxsource_image) setting parameter %s to \"%s\"", name, value); -} - -static gfxdocument_t*image_open(gfxsource_t*src, const char*filename) -{ - gfxdocument_t*image_doc = (gfxdocument_t*)malloc(sizeof(gfxdocument_t)); - memset(image_doc, 0, sizeof(gfxdocument_t)); - image_doc_internal_t*i= (image_doc_internal_t*)malloc(sizeof(image_doc_internal_t)); - memset(i, 0, sizeof(image_doc_internal_t)); - - gfxcolor_t*data = 0; - unsigned width = 0; - unsigned height = 0; - - if(!png_load(filename, &width, &height, (unsigned char**)&data)) { - if(!jpeg_load(filename, (unsigned char**)&data, &width, &height)) { - msg(" Couldn't load image %s", filename); - return 0; - } - } - i->img.data = data; - i->img.width = width; - i->img.height = height; - - image_doc->num_pages = 1; - image_doc->internal = i; - image_doc->get = 0; - image_doc->destroy = image_doc_destroy; - image_doc->setparameter = image_doc_setparameter; - image_doc->getpage = image_doc_getpage; - - return image_doc; -} - -gfxsource_t*gfxsource_image_create() -{ - gfxsource_t*src = (gfxsource_t*)malloc(sizeof(gfxsource_t)); - memset(src, 0, sizeof(gfxsource_t)); - src->setparameter = image_setparameter; - src->open = image_open; - return src; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/image.h b/fluidbook/tools/swftools-special-swfdump/lib/readers/image.h deleted file mode 100644 index c81839f1b..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/readers/image.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __image_h__ -#define __image_h__ - -#include "../gfxdevice.h" -#include "../gfxsource.h" - -#ifdef __cplusplus -extern "C" { -#endif - -gfxsource_t*gfxsource_image_create(); - -#ifdef __cplusplus -} -#endif - -#endif - - - - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.c b/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.c deleted file mode 100644 index ea25c71c8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.c +++ /dev/null @@ -1,770 +0,0 @@ -#include -#include -#include "../gfxdevice.h" -#include "../gfxsource.h" -#include "../gfxtools.h" -#include "../log.h" -#include "../mem.h" -#include "../png.h" -#include "../rfxswf.h" -#include "swf.h" - -typedef struct _map16_t -{ - void** ids; -} map16_t; - -typedef struct _swf_page_internal -{ - int frame; -} swf_page_internal_t; - -typedef struct _swf_doc_internal -{ - map16_t*id2char; - SWF swf; - int width,height; - MATRIX m; -} swf_doc_internal_t; - -#define TYPE_SHAPE 1 -#define TYPE_BITMAP 2 -#define TYPE_SPRITE 3 -#define TYPE_FONT 4 -#define TYPE_TEXT 5 - -typedef struct _character -{ - U16 id; - TAG*tag; - char type; - void*data; -} character_t; - -typedef struct _placement -{ - SWFPLACEOBJECT po; - int age; - int startFrame; -} placement_t; - -typedef struct _sprite -{ - int frameCount; -} sprite_t; - -typedef struct _render -{ - map16_t*id2char; - gfxdevice_t*device; - MATRIX m; - int clips; - int*clips_waiting; - - placement_t*current_placement; -} render_t; - - -//---- object/depth handling ---- - -map16_t* map16_new() -{ - map16_t*map = rfx_calloc(sizeof(map16_t)); - /* TODO: replace this by a more sophisticated data structure */ - map->ids = (void**)rfx_calloc(sizeof(character_t)*65536); - return map; -} -character_t*map16_get_id(map16_t*map, int id) -{ - if(id<0 || id>=65536) - return 0; - return map->ids[id]; -} -void map16_free(map16_t*map) -{ - free(map->ids); -} -void map16_add_id(map16_t*map, int nr, void*id) -{ - if(map->ids[nr]) - fprintf(stderr, "Warning: ID %d defined more than once\n", nr); - map->ids[nr] = id; -} -void map16_remove_id(map16_t*map, int nr) -{ - map->ids[nr] = 0; -} -void map16_enumerate(map16_t*map, void (*f)(void*self, int id, void*data), void*self) -{ - int t; - for(t=0;t<65536;t++) { - if(map->ids[t]) { - f(self, t, map->ids[t]); - } - } -} -//---- placements ---- - -placement_t* placement_unit() -{ - placement_t*placement = rfx_calloc(sizeof(placement_t)); - swf_GetPlaceObject(0, &placement->po); - return placement; -} - -placement_t* placement_join(placement_t*p1, placement_t*p2) -{ - placement_t*placement = rfx_alloc(sizeof(placement_t)); - *placement = *p1; - swf_MatrixJoin(&placement->po.matrix, &p1->po.matrix, &p2->po.matrix); - return placement; -} - -static void placement_free(placement_t*p) -{ - swf_PlaceObjectFree(&p->po); - free(p); -} - -//---- conversion stuff ---- - -static void convertMatrix(MATRIX*from, gfxmatrix_t*to) -{ - to->m00 = from->sx / 65536.0; to->m10 = from->r1 / 65536.0; - to->m01 = from->r0 / 65536.0; to->m11 = from->sy / 65536.0; - to->tx = from->tx/20.0; - to->ty = from->ty/20.0; -} - -static void convertCXForm(CXFORM*from, gfxcxform_t*to) -{ - memset(to, 0, sizeof(gfxcxform_t)); - to->aa = from->a0 / 256.0; - to->rr = from->r0 / 256.0; - to->gg = from->g0 / 256.0; - to->bb = from->b0 / 256.0; - to->ta = from->a1; - to->tr = from->r1; - to->tg = from->g1; - to->tb = from->b1; -} - -static gfxgradient_t* convertGradient(GRADIENT*from) -{ - gfxgradient_t*g = rfx_calloc(from->num * sizeof(gfxgradient_t)); - int t; - for(t=0;tnum;t++) { - g[t].pos = from->ratios[t] / 255.0; - g[t].color = *(gfxcolor_t*)&from->rgba[t]; - if(tnum-1) - g[t].next = &g[t+1]; - else - g[t].next = 0; - } - return g; -} - -gfxline_t* swfline_to_gfxline(SHAPELINE*line, int linestyle, int fillstyle0) -{ - gfxdrawer_t d; - SCOORD x=0,y=0,xx=0,yy=0; - gfxline_t*l; - gfxdrawer_target_gfxline(&d); - if(line && line->type != moveTo) { - fprintf(stderr, "Warning: Shape doesn't start with a moveTo\n"); - } - xx = line?line->x+1:0; - while(line) { - if(line->fillstyle0 == fillstyle0 || - line->fillstyle1 == fillstyle0 || - line->linestyle == linestyle) { - if(line->type == lineTo) { - if(xx!=x || yy!=y) d.moveTo(&d, x/20.0,y/20.0); - d.lineTo(&d, line->x/20.0,line->y/20.0); - xx = line->x; - yy = line->y; - } else if(line->type == splineTo) { - if(xx!=x || yy!=y) d.moveTo(&d, x/20.0,y/20.0); - d.splineTo(&d, line->sx/20.0, line->sy/20.0, line->x/20.0,line->y/20.0); - xx = line->x; - yy = line->y; - } - } - x = line->x; - y = line->y; - line = line->next; - } - l = d.result(&d); - return l; -} - - -//---- bitmap handling ---- - -static gfximage_t* gfximage_new(RGBA*data, int width, int height) -{ - gfximage_t* b = (gfximage_t*)rfx_calloc(sizeof(gfximage_t)); - b->data = (gfxcolor_t*)data; - b->width = width; - b->height = height; - return b; -} - -static gfximage_t* findimage(render_t*r, U16 id) -{ - character_t*c = (character_t*)map16_get_id(r->id2char, id); - assert(c && c->type == TYPE_BITMAP); - gfximage_t*img = (gfximage_t*)c->data; - - /*char filename[80]; - sprintf(filename, "bitmap%d.png", id); - png_write(filename, (unsigned char*)img->data, img->width, img->height); - printf("saving bitmap %d to %s\n", id, filename);*/ - - return c->data; -} -//---- shape handling ---- - -static void renderFilled(render_t*r, gfxline_t*line, FILLSTYLE*f, CXFORM*cx, MATRIX*po_m) -{ - if(f->type == FILL_SOLID) { - gfxcolor_t c = *(gfxcolor_t*)&f->color; - r->device->fill(r->device, line, &c); - } else if(f->type == FILL_TILED || f->type == FILL_CLIPPED) { - gfximage_t* img = findimage(r, f->id_bitmap); - gfxmatrix_t m; - gfxcxform_t gfxcx; - convertCXForm(cx, &gfxcx); - MATRIX m2; - swf_MatrixJoin(&m2, po_m, &f->m); - convertMatrix(&m2, &m); - m.m00/=20.0; m.m10/=20.0; - m.m01/=20.0; m.m11/=20.0; - /* TODO: handle clipped */ - r->device->fillbitmap(r->device, line, img, &m, &gfxcx); - } else if(f->type == FILL_LINEAR || f->type == FILL_RADIAL) { - gfxmatrix_t m; - gfxgradient_t* g; - MATRIX* m2 = &f->m; - //swf_MatrixJoin(&m2, po_m, &f->m); - - double z = f->type==FILL_RADIAL?4:4; - m.m00 = m2->sx/z/20.0; m.m10 = m2->r1/z/20.0; - m.m01 = m2->r0/z/20.0; m.m11 = m2->sy/z/20.0; - m.tx = m2->tx/20.0; - m.ty = m2->ty/20.0; - - g = convertGradient(&f->gradient); - r->device->fillgradient(r->device, line, g, f->type == FILL_LINEAR ? gfxgradient_linear : gfxgradient_radial, &m); - free(g); - } -} - -//---- font handling ---- - -typedef struct -{ - int numchars; - gfxline_t**glyphs; -} font_t; - -typedef struct textcallbackblock -{ - render_t*r; - MATRIX m; -} textcallbackblock_t; - -static void textcallback(void*self, int*chars, int*xpos, int nr, int fontid, int fontsize, - int xstart, int ystart, RGBA* color) -{ - textcallbackblock_t * info = (textcallbackblock_t*)self; - font_t*font = 0; - int t; - character_t*cfont = map16_get_id(info->r->id2char, fontid); - if(!cfont) { - fprintf(stderr, "Font %d unknown\n", fontid); - return; - } - if(cfont->type != TYPE_FONT) { - fprintf(stderr, "ID %d is not a font\n", fontid); - return; - } - font = cfont->data; - - for(t=0;tm; - SPOINT p; - - p.x = x; p.y = y; - p = swf_TurnPoint(p, &m); - - m.sx = (m.sx * fontsize) / 1024; - m.sy = (m.sy * fontsize) / 1024; - m.r0 = (m.r0 * fontsize) / 1024; - m.r1 = (m.r1 * fontsize) / 1024; - m.tx = p.x; - m.ty = p.y; - - gfxmatrix_t gm; - convertMatrix(&m, &gm); - - if(chars[t]<0 || chars[t]>= font->numchars) { - fprintf(stderr, "Character out of range: %d\n", chars[t]); - } else { - gfxline_t*line = gfxline_clone(font->glyphs[chars[t]]); - gfxline_transform(line, &gm); - FILLSTYLE f; - f.type = FILL_SOLID; - f.color = *color; - renderFilled(info->r, line, &f, 0, 0); - gfxline_free(line); - } - } -} - - -//---- tag handling ---- - -static map16_t* extractDefinitions(SWF*swf) -{ - map16_t*map = map16_new(); - TAG*tag = swf->firstTag; - while(tag) - { - int id = 0; - if(swf_isDefiningTag(tag)) { - id = swf_GetDefineID(tag); - } - - if(tag->id == ST_DEFINESPRITE) { - character_t*c = rfx_calloc(sizeof(character_t)); - sprite_t*s = rfx_calloc(sizeof(sprite_t)); - swf_SetTagPos(tag, 0); - swf_GetU16(tag); //id - s->frameCount = swf_GetU16(tag); //frameno - c->tag = tag; - c->type = TYPE_SPRITE; - c->data = s; - map16_add_id(map, id, c); - } - else if(tag->id == ST_DEFINESHAPE || - tag->id == ST_DEFINESHAPE2 || - tag->id == ST_DEFINESHAPE3) { - character_t*c = rfx_calloc(sizeof(character_t)); - c->tag = tag; - c->type = TYPE_SHAPE; - map16_add_id(map, id, c); - } - else if(tag->id == ST_DEFINEFONT || - tag->id == ST_DEFINEFONT2 || - tag->id == ST_DEFINEFONT3) { - character_t*c = rfx_calloc(sizeof(character_t)); - SWFFONT*swffont = 0; - font_t*font = (font_t*)rfx_calloc(sizeof(font_t)); - swf_FontExtract(swf, id, &swffont); - font->numchars = swffont->numchars; - font->glyphs = (gfxline_t**)rfx_calloc(sizeof(gfxline_t*)*font->numchars); - int t; - RGBA color_white = {255,255,255,255}; - for(t=0;tnumchars;t++) { - if(!swffont->glyph[t].shape->fillstyle.n) { - swf_ShapeAddSolidFillStyle(swffont->glyph[t].shape, &color_white); - } - SHAPE2*s2 = swf_ShapeToShape2(swffont->glyph[t].shape); - font->glyphs[t] = swfline_to_gfxline(s2->lines, 0, 1); - if(tag->id==ST_DEFINEFONT3) { - gfxmatrix_t m = {1/20.0,0,0, 0,1/20.0,0}; - gfxline_transform(font->glyphs[t], &m); - } - swf_Shape2Free(s2); - } - swf_FontFree(swffont); - - c->tag = tag; - c->type = TYPE_FONT; - c->data = font; - map16_add_id(map, id, c); - } - else if(tag->id == ST_DEFINETEXT || - tag->id == ST_DEFINETEXT2) { - character_t*c = rfx_calloc(sizeof(character_t)); - c->tag = tag; - c->type = TYPE_TEXT; - c->data = 0; - map16_add_id(map, id, c); - } - else if(tag->id == ST_DEFINEBITSJPEG || - tag->id == ST_DEFINEBITSJPEG2 || - tag->id == ST_DEFINEBITSJPEG3 || - tag->id == ST_DEFINEBITSLOSSLESS || - tag->id == ST_DEFINEBITSLOSSLESS2) { - character_t*c = rfx_calloc(sizeof(character_t)); - int width, height; - void*data = swf_ExtractImage(tag, &width, &height); - gfximage_t*b = gfximage_new(data, width, height); - c->tag = tag; - c->type = TYPE_BITMAP; - c->data = b; - map16_add_id(map, id, c); - } - - tag = tag->next; - } - return map; -} - -void swf_FreeTaglist(TAG*tag) -{ - while(tag) - { - TAG * tnew = tag->next; - if (tag->data) - rfx_free(tag->data); - rfx_free(tag); - tag = tnew; - } -} - -static void increaseAge(void*self, int id, void*data) -{ - placement_t*p = (placement_t*)data; - p->age++; -} - -static map16_t* extractFrame(TAG*startTag, int frame_to_extract) -{ - map16_t*depthmap = map16_new(); - TAG*tag = startTag; - int frame = 1; - int insprite = 0; - - for(;tag;tag = tag->next) { - if(tag->id == ST_DEFINESPRITE) { - while(tag->id != ST_END) - tag = tag->next; - continue; - } - if(tag->id == ST_PLACEOBJECT || - tag->id == ST_PLACEOBJECT2) { - placement_t* p = rfx_calloc(sizeof(placement_t)); - p->age = 1; - p->startFrame = frame; - swf_GetPlaceObject(tag, &p->po); - if(p->po.move) { - placement_t*old = (placement_t*)map16_get_id(depthmap, p->po.depth); - - if(!(p->po.flags&PF_CHAR)) p->po.id = old->po.id; - if(!(p->po.flags&PF_MATRIX)) p->po.matrix = old->po.matrix; - if(!(p->po.flags&PF_CXFORM)) p->po.cxform = old->po.cxform; - if(!(p->po.flags&PF_RATIO)) p->po.ratio = old->po.ratio; - - map16_remove_id(depthmap, old->po.depth); - placement_free(old); - } - map16_add_id(depthmap, p->po.depth, p); - } - if(tag->id == ST_REMOVEOBJECT || - tag->id == ST_REMOVEOBJECT2) { - U16 depth = swf_GetDepth(tag); - map16_remove_id(depthmap, depth); - } - if(tag->id == ST_SHOWFRAME || tag->id == ST_END || !tag->next) { - if(frame == frame_to_extract) { - return depthmap; - } - if(tag->id == ST_SHOWFRAME) { - frame++; - map16_enumerate(depthmap, increaseAge, 0); - } - } - if(tag->id == ST_END) - break; - } - return depthmap; -} - -// ---- rendering ---- - -void swf_ShapeApplyMatrix(SHAPE2*shape, MATRIX*m) -{ -} - -RGBA swf_ColorTransform(RGBA*color, CXFORM*cx) -{ - RGBA dest; - dest.r = (cx->r0*color->r + cx->r1*256) >> 8; - dest.g = (cx->g0*color->g + cx->g1*256) >> 8; - dest.b = (cx->b0*color->b + cx->b1*256) >> 8; - dest.a = (cx->a0*color->a + cx->a1*256) >> 8; - return dest; -} - -void renderOutline(render_t*r, gfxline_t*line, LINESTYLE*l, CXFORM*cx) -{ - RGBA c = swf_ColorTransform(&l->color, cx); - gfxcoord_t width = l->width/20.0; - r->device->stroke(r->device, line, width, (gfxcolor_t*)&c, gfx_capRound, gfx_joinRound, 0.0); -} - -void swf_ApplyMatrixToShape(SHAPE2*shape, MATRIX*m) -{ - SHAPELINE*line = shape->lines; - while(line) { - SPOINT p; - - p.x = line->x; p.y = line->y; - p = swf_TurnPoint(p, m); - line->x = p.x; line->y = p.y; - - p.x = line->sx; p.y = line->sy; - p = swf_TurnPoint(p, m); - line->sx = p.x; line->sy = p.y; - - line = line->next; - } -} - -static void renderCharacter(render_t*r, placement_t*p, character_t*c) -{ - if(c->type == TYPE_SHAPE) { - SHAPE2 shape; - swf_ParseDefineShape(c->tag, &shape); - - MATRIX m,m2; - swf_MatrixJoin(&m2, &r->m, &r->current_placement->po.matrix); - swf_MatrixJoin(&m, &m2, &p->po.matrix); - - swf_ApplyMatrixToShape(&shape, &m); - - SHAPELINE*line = shape.lines; - int t; - - for(t=1;t<=shape.numlinestyles;t++) { - gfxline_t*line = swfline_to_gfxline(shape.lines, t, -1); - if(line) renderOutline(r, line, &shape.linestyles[t-1], &p->po.cxform); - gfxline_free(line); - } - - for(t=1;t<=shape.numfillstyles;t++) { - gfxline_t*line; - line = swfline_to_gfxline(shape.lines, -1, t); - if(line) { - if(!p->po.clipdepth) { - renderFilled(r, line, &shape.fillstyles[t-1], &p->po.cxform, &p->po.matrix); - } else { - r->device->startclip(r->device, line); - r->clips_waiting[p->po.clipdepth]++; - } - } - gfxline_free(line); - /*line = swfline_to_gfxline(shape.lines, -1, -1, t); - if(line) renderFilled(r, line, &shape.fillstyles[t-1], &p->po.cxform); - gfxline_free(line);*/ - } - - } else if(c->type == TYPE_TEXT) { - TAG* tag = c->tag; - textcallbackblock_t info; - MATRIX mt,mt2; - swf_SetTagPos(tag, 0); - swf_GetU16(tag); - swf_GetRect(tag,0); - swf_GetMatrix(tag,&mt); - - swf_MatrixJoin(&mt2, &r->m, &mt); - swf_MatrixJoin(&info.m, &mt2, &p->po.matrix); - info.r = r; - swf_ParseDefineText(tag, textcallback, &info); - } -} - -// ---- main ---- - -static void placeObject(void*self, int id, void*data) -{ - render_t*r = (render_t*)self; - placement_t*p = (placement_t*)data; - character_t*c = map16_get_id(r->id2char, p->po.id); - - if(!c) { - fprintf(stderr, "Error: ID %d unknown\n", p->po.id); - return; - } - - if(c->type == TYPE_SPRITE) { - placement_t*oldp = r->current_placement; - r->current_placement = placement_join(oldp, p); - - int*old_clips_waiting = r->clips_waiting; - r->clips_waiting = rfx_calloc(sizeof(r->clips_waiting[0])*65536); - - sprite_t* s = (sprite_t*)c->data; - - TAG*spritetags = c->tag->next; - map16_t* depths = extractFrame(spritetags, s->frameCount>0? p->age % s->frameCount : 0); - map16_enumerate(depths, placeObject, r); - - int t; - for(t=0;t<65536;t++) { - int i; - for(i=0; iclips_waiting[t]; i++) { - r->device->endclip(r->device); - } - } - free(r->clips_waiting); - r->clips_waiting = old_clips_waiting; - - placement_free(r->current_placement); - r->current_placement = oldp; - } else { - renderCharacter(r, p, c); - } -} - -void swfpage_destroy(gfxpage_t*swf_page) -{ - swf_page_internal_t*i= (swf_page_internal_t*)swf_page->internal; - free(swf_page->internal);swf_page->internal = 0; - free(swf_page);swf_page=0; -} - -void swfpage_render(gfxpage_t*page, gfxdevice_t*output) -{ - swf_page_internal_t*i = (swf_page_internal_t*)page->internal; - swf_doc_internal_t*pi = (swf_doc_internal_t*)page->parent->internal; - map16_t* depths = extractFrame(pi->swf.firstTag, i->frame); - render_t r; - r.id2char = pi->id2char; - r.clips = 0; - r.device = output; - r.m = pi->m; - r.clips_waiting = malloc(sizeof(r.clips_waiting[0])*65536); - r.current_placement = placement_unit(); - memset(r.clips_waiting, 0, sizeof(r.clips_waiting[0])*65536); - - int t; - for(t=0;t<65536;t++) { - if(depths->ids[t]) { - placeObject(&r, t, depths->ids[t]); - } - int i; - for(i=0; iendclip(output); - } - } - free(r.clips_waiting); -} - -void swfpage_rendersection(gfxpage_t*page, gfxdevice_t*output, gfxcoord_t x, gfxcoord_t y, gfxcoord_t _x1, gfxcoord_t _y1, gfxcoord_t _x2, gfxcoord_t _y2) -{ - swf_doc_internal_t*pi = (swf_doc_internal_t*)page->parent->internal; - /* FIXME */ - swfpage_render(page,output); -} - -void swf_doc_destroy(gfxdocument_t*gfx) -{ - swf_doc_internal_t*i= (swf_doc_internal_t*)gfx->internal; - swf_FreeTags(&i->swf); - free(gfx->internal);gfx->internal=0; - free(gfx);gfx=0; -} - -void swf_doc_setparameter(gfxdocument_t*gfx, const char*name, const char*value) -{ - swf_doc_internal_t*i= (swf_doc_internal_t*)gfx->internal; -} - -gfxpage_t* swf_doc_getpage(gfxdocument_t*doc, int page) -{ - swf_doc_internal_t*di= (swf_doc_internal_t*)doc->internal; - if(page < 1 || page > doc->num_pages) - return 0; - - gfxpage_t* swf_page = (gfxpage_t*)malloc(sizeof(gfxpage_t)); - swf_page_internal_t*pi= (swf_page_internal_t*)malloc(sizeof(swf_page_internal_t)); - memset(pi, 0, sizeof(swf_page_internal_t)); - - pi->frame = page; - - swf_page->internal = pi; - swf_page->destroy = swfpage_destroy; - swf_page->render = swfpage_render; - swf_page->rendersection = swfpage_rendersection; - swf_page->width = di->width; - swf_page->height = di->height; - swf_page->parent = doc; - swf_page->nr = page; - return swf_page; -} - -void swf_setparameter(gfxsource_t*src, const char*name, const char*value) -{ - msg(" setting parameter %s to \"%s\"", name, value); -} - -gfxdocument_t*swf_open(gfxsource_t*src, const char*filename) -{ - gfxdocument_t*swf_doc = (gfxdocument_t*)malloc(sizeof(gfxdocument_t)); - memset(swf_doc, 0, sizeof(gfxdocument_t)); - swf_doc_internal_t*i= (swf_doc_internal_t*)malloc(sizeof(swf_doc_internal_t)); - memset(i, 0, sizeof(swf_doc_internal_t)); - - TAG*tag = 0; - int f; - int frame; - render_t r; - gfxdevice_t d; - - if(!filename) { - return 0; - } - f = open(filename,O_RDONLY|O_BINARY); - if (f<0) { - perror("Couldn't open file: "); - return 0; - } - if FAILED(swf_ReadSWF(f,&i->swf)) { - fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); - close(f); - return 0; - } - swf_UnFoldAll(&i->swf); - - i->id2char = extractDefinitions(&i->swf); - i->width = (i->swf.movieSize.xmax - i->swf.movieSize.xmin) / 20; - i->height = (i->swf.movieSize.ymax - i->swf.movieSize.ymin) / 20; - - swf_GetMatrix(0, &i->m); - i->m.tx = -i->swf.movieSize.xmin; - i->m.ty = -i->swf.movieSize.ymin; - - swf_doc->num_pages = i->swf.frameCount; - swf_doc->internal = i; - swf_doc->get = 0; - swf_doc->destroy = swf_doc_destroy; - swf_doc->setparameter = swf_doc_setparameter; - swf_doc->getpage = swf_doc_getpage; - - return swf_doc; -} - -static void swf_destroy(gfxsource_t*src) -{ - memset(src, 0, sizeof(*src)); - free(src); -} - - -gfxsource_t*gfxsource_swf_create() -{ - gfxsource_t*src = (gfxsource_t*)malloc(sizeof(gfxsource_t)); - memset(src, 0, sizeof(gfxsource_t)); - src->setparameter = swf_setparameter; - src->open = swf_open; - src->destroy = swf_destroy; - return src; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.h b/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.h deleted file mode 100644 index 26bee4995..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/readers/swf.h +++ /dev/null @@ -1,41 +0,0 @@ -/* swf.h - - Part of the swftools package. - - Copyright (c) 2008 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __swfsource_h__ -#define __swfsource_h__ - -#include "../gfxsource.h" - -#ifdef __cplusplus -extern "C" { -#endif - -gfxsource_t*gfxsource_swf_create(); - -#ifdef __cplusplus -} -#endif - -#endif //__pdfsource_h__ - - - - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.c b/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.c deleted file mode 100644 index 77417ddfd..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.c +++ /dev/null @@ -1,1937 +0,0 @@ -/* vi: set sts=2 sw=2 :*/ -/* rfxswf.c - - Library for creating and reading SWF files or parts of it. - There's a module directory which provides some extended functionality. - Most modules are included at the bottom of this file. - - Part of the swftools package. - - Copyright (c) 2000-2003 Rainer Böhme - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "mem.h" -#include "rfxswf.h" -#ifdef HAVE_ZLIB -#include -#endif // HAVE_ZLIB - -#ifndef RFXSWF_DISABLESOUND -#ifdef HAVE_LAME -#include "lame/lame.h" -#endif -#endif - -#ifdef HAVE_TIME_H -#include -#endif - -#ifdef HAVE_IO_H -#include -#endif - -#include "./bitio.h" -#include "./os.h" - -// internal constants - -#define MALLOC_SIZE 128 -#define INSERT_RFX_TAG - -#define MEMSIZE(l) (((l/MALLOC_SIZE)+1)*MALLOC_SIZE) - -// inline wrapper functions - -TAG * swf_NextTag(TAG * t) { return t->next; } -TAG * swf_PrevTag(TAG * t) { return t->prev; } -U16 swf_GetTagID(TAG * t) { return t->id; } -U32 swf_GetTagLen(TAG * t) { return t->len; } -U8* swf_GetTagLenPtr(TAG * t) { return &(t->data[t->len]); } -U32 swf_GetTagPos(TAG * t) { return t->pos; } - -void swf_SetTagPos(TAG * t,U32 pos) -{ swf_ResetReadBits(t); - if (pos<=t->len) t->pos = pos; - else { -#ifdef DEBUG_RFXSWF - fprintf(stderr,"SetTagPos(%d) out of bounds: TagID = %i\n",pos, t->id); -#endif - } -} - -char* swf_GetString(TAG*t) -{ - int pos = t->pos; - while(t->pos < t->len && swf_GetU8(t)); - /* make sure we always have a trailing zero byte */ - if(t->pos == t->len) { - if(t->len == t->memsize) { - swf_ResetWriteBits(t); - swf_SetU8(t, 0); - t->len = t->pos; - } - t->data[t->len] = 0; - } - return (char*)&(t->data[pos]); -} - -U8 swf_GetU8(TAG * t) -{ swf_ResetReadBits(t); - #ifdef DEBUG_RFXSWF - if ((int)t->pos>=(int)t->len) - { fprintf(stderr,"GetU8() out of bounds: TagID = %i\n",t->id); - *(int*)0=0; - return 0; - } - #endif - return t->data[t->pos++]; -} - -U16 swf_GetU16(TAG * t) -{ U16 res; - swf_ResetReadBits(t); - #ifdef DEBUG_RFXSWF - if ((int)t->pos>((int)t->len-2)) - { fprintf(stderr,"GetU16() out of bounds: TagID = %i\n",t->id); - return 0; - } - #endif - res = t->data[t->pos] | (t->data[t->pos+1]<<8); - t->pos+=2; - return res; -} - -U32 swf_GetU32(TAG * t) -{ U32 res; - swf_ResetReadBits(t); - #ifdef DEBUG_RFXSWF - if ((int)t->pos>((int)t->len-4)) - { fprintf(stderr,"GetU32() out of bounds: TagID = %i\n",t->id); - return 0; - } - #endif - res = t->data[t->pos] | (t->data[t->pos+1]<<8) | - (t->data[t->pos+2]<<16) | (t->data[t->pos+3]<<24); - t->pos+=4; - return res; -} - -int swf_GetBlock(TAG * t,U8 * b,int l) -// returns number of bytes written (<=l) -// b = NULL -> skip data -{ swf_ResetReadBits(t); - if ((t->len-t->pos)len-t->pos; - if (b && l) memcpy(b,&t->data[t->pos],l); - t->pos+=l; - return l; -} - -int swf_SetBlock(TAG * t,const U8 * b,int l) -// Appends Block to the end of Tagdata, returns size -{ U32 newlen = t->len + l; - swf_ResetWriteBits(t); - if (newlen>t->memsize) - { U32 newmem = MEMSIZE(newlen); - U8 * newdata = (U8*)(rfx_realloc(t->data,newmem)); - t->memsize = newmem; - t->data = newdata; - } - if (b) memcpy(&t->data[t->len],b,l); - else memset(&t->data[t->len],0x00,l); - t->len+=l; - return l; -} - -int swf_SetU8(TAG * t,U8 v) -{ swf_ResetWriteBits(t); - if ((t->len+1)>t->memsize) return (swf_SetBlock(t,&v,1)==1)?0:-1; - t->data[t->len++] = v; - return 0; -} - -int swf_SetU16(TAG * t,U16 v) -{ U8 a[2]; - a[0] = v&0xff; - a[1] = v>>8; - - swf_ResetWriteBits(t); - if ((t->len+2)>t->memsize) return (swf_SetBlock(t,a,2)==2)?0:-1; - t->data[t->len++] = a[0]; - t->data[t->len++] = a[1]; - return 0; -} -void swf_SetS16(TAG * t,int v) -{ - if(v>32767 || v<-32768) { - #ifdef DEBUG_RFXSWF - fprintf(stderr, "Warning: S16 overflow: %d\n", v); - #endif - } - swf_SetU16(t, (S16)v); -} - -int swf_SetU32(TAG * t,U32 v) -{ U8 a[4]; - a[0] = v&0xff; // to ensure correct handling of non-intel byteorder - a[1] = (v>>8)&0xff; - a[2] = (v>>16)&0xff; - a[3] = (v>>24)&0xff; - - swf_ResetWriteBits(t); - if ((t->len+4)>t->memsize) return (swf_SetBlock(t,a,4)==4)?0:-1; - t->data[t->len++] = a[0]; - t->data[t->len++] = a[1]; - t->data[t->len++] = a[2]; - t->data[t->len++] = a[3]; - return 0; -} - -U32 swf_GetBits(TAG * t,int nbits) -{ U32 res = 0; - if (!nbits) return 0; - if (!t->readBit) t->readBit = 0x80; - while (nbits) - { res<<=1; -#ifdef DEBUG_RFXSWF - if (t->pos>=t->len) - { fprintf(stderr,"GetBits() out of bounds: TagID = %i, pos=%d, len=%d\n",t->id, t->pos, t->len); - int i,m=t->len>10?10:t->len; - for(i=-1;idata[i]); - } - fprintf(stderr, "\n"); - return res; - } -#endif - if (t->data[t->pos]&t->readBit) res|=1; - t->readBit>>=1; - nbits--; - if (!t->readBit) - { if (nbits) t->readBit = 0x80; - t->pos++; - } - } - return res; -} - -S32 swf_GetSBits(TAG * t,int nbits) -{ U32 res = swf_GetBits(t,nbits); - if (res&(1<<(nbits-1))) res|=(0xffffffff<writeBit) - { if (FAILED(swf_SetU8(t,0))) return -1; - t->writeBit = 0x80; - } - if (v&bm) t->data[t->len-1] |= t->writeBit; - bm>>=1; - t->writeBit>>=1; - nbits--; - } - return 0; -} - -// Advanced Data Access Functions - -double swf_GetFixed(TAG * t) -{ - U16 low = swf_GetU16(t); - U16 high = swf_GetU16(t); - return high + low*(1/65536.0); -} -void swf_SetFixed(TAG * t, double f) -{ - U16 fr = (U16)((f-(int)f)*65536); - swf_SetU16(t, fr); - swf_SetU16(t, (U16)f - (f<0 && fr!=0)); -} -float swf_GetFixed8(TAG * t) -{ - U8 low = swf_GetU8(t); - U8 high = swf_GetU8(t); - return (float)(high + low*(1/256.0)); -} -void swf_SetFixed8(TAG * t, float f) -{ - U8 fr = (U8)((f-(int)f)*256); - swf_SetU8(t, fr); - swf_SetU8(t, (U8)f - (f<0 && fr!=0)); -} - -U32 swf_GetU30(TAG*tag) -{ - U32 shift = 0; - U32 s = 0; - int nr=0; - while(1) { - U8 b = swf_GetU8(tag); - nr++; - s|=(b&127)<=32) - break; - } - /*int nr2= swf_SetU30(0, s); - if(nr!=nr2) { - printf("Unsigned value %d stored in %d bytes, I'd store it in %d bytes\n", s, nr, nr2); - }*/ - return s; -} - -int swf_SetU30(TAG*tag, U32 u) -{ - int nr = 0; - do { - if(tag) - swf_SetU8(tag, (u&~0x7f?0x80:0) | (u&0x7F)); - u>>=7; - nr++; - } while(u); - return nr; -} - -void swf_SetABCU32(TAG*tag, U32 u) -{ - do { - swf_SetU8(tag, (u&~0x7f?0x80:0) | (u&0x7F)); - u>>=7; - } while(u); -} -U32 swf_GetABCU32(TAG*tag) -{ - return swf_GetU30(tag); -} -void swf_SetABCS32(TAG*tag, S32 v) -{ - swf_SetABCU32(tag, v); -} -S32 swf_GetABCS32(TAG*tag) -{ - return swf_GetABCU32(tag); -} - -#if 0 - -/*The AVM2 spec is just plain wrong, claiming that S32 values are sign -extended. They're not. -This wastes up to 4 bytes for every negative value. */ - -void swf_SetABCS32(TAG*tag, S32 s) -{ - printf("write S32: %d\n", s); - S32 neg = s<0?-1:0; - U8 sign = s<0?0x40:0; - while(1) { - U8 val = s&0x7f; - U8 vsign = s&0x40; - s>>=7; - neg>>=7; - if(s==neg && vsign==sign) { - /* if the value we now write has the same sign as s - and all the remaining bits are equal to the sign of s - too, stop writing */ - swf_SetU8(tag, val); - printf("put %02x\n", val); - break; - } else { - swf_SetU8(tag, 0x80 | val); - printf("put %02x\n", 0x80|val); - } - }; -} -int swf_GetS30(TAG*tag) -{ - U32 shift = 0; - U32 s = 0; - int nr=0; - while(1) { - U8 b = swf_GetU8(tag); - nr++; - nt i,m=t->len>10?10:t->len; - for(i=0;idata[i]); - } - fprintf(stderr, "\n"); - s|=(b&127)<=32) { - if(b&64) { - if(shift<32) - s|=0xffffffff<>10)&0x1f; - U16 m = f1&0x3ff; - /* find highest bit in mantissa */ - int h=0; - while(!(m&0x400)) { - m<<=1; - h++; - } - m&=0x3ff; - e -= h; - e += 0x6f; - - f2.u = (f1&0x8000)<<16; //sign - f2.u |= e<<23; //exponent - f2.u |= m<<13; //mantissa - return *(float*)&f2; -} - -void swf_SetF16(TAG * t, float f) -{ - union { - U32 u; - float f; - } v; - v.f = f; - - U16 result = (v.u>>16)&0x8000; //sign - int exp = ((v.u>>23)&0xff)-0x7f+0x10; - U16 m = (v.u>>13)&0x3ff; - //fprintf(stderr, "%f: %04x sign, %d exp, %04x mantissa\n", f, result, exp, m); - if(exp<-10) { - // underflow (clamp to 0.0) - exp = 0; - m = 0; - } else if(exp<0) { - // partial underflow- strip some bits - m = (m|0x400)>>-exp; - exp = 0; - } else if(exp>=32) { - exp = 31; - m = 0x3ff; - fprintf(stderr, "Exponent overflow in FLOAT16 encoding\n"); - } else { - exp++; - m = (m>>1)|0x200; - } - result |= exp<<10; - result |= m; - swf_SetU16(t, result); -} - -float F16toFloat(U16 x) -{ - TAG t; - t.data = (void*)&x; - t.readBit = 0; - t.pos = 0; - t.len = 2; - return swf_GetF16(&t); -} - -float floatToF16(float f) -{ - U16 u = 0; - TAG t; - t.data = (void*)&u; - t.len = 0; - t.memsize = 2; - t.writeBit = 0; - swf_SetF16(&t, f); - return u; -} - -double swf_GetD64(TAG*tag) -{ - /* FIXME: this is not big-endian compatible */ - double value = *(double*)&tag->data[tag->pos]; - swf_GetU32(tag); - swf_GetU32(tag); - return value; -} -int swf_SetD64(TAG*tag, double v) -{ - /* FIXME: this is not big-endian compatible */ - swf_SetU32(tag, ((U32*)&v)[0]); - swf_SetU32(tag, ((U32*)&v)[1]); - return 8; -} -int swf_GetU24(TAG*tag) -{ - int b1 = swf_GetU8(tag); - int b2 = swf_GetU8(tag); - int b3 = swf_GetU8(tag); - return b3<<16|b2<<8|b1; -} -int swf_GetS24(TAG*tag) -{ - int b1 = swf_GetU8(tag); - int b2 = swf_GetU8(tag); - int b3 = swf_GetU8(tag); - if(b3&0x80) { - return -1-((b3<<16|b2<<8|b1)^0xffffff); - } else { - return b3<<16|b2<<8|b1; - } -} -int swf_SetU24(TAG*tag, U32 v) -{ - if(tag) { - if(v&0xff000000) - fprintf(stderr, "Error: Overflow in swf_SetU24()\n"); - swf_SetU8(tag, v); - swf_SetU8(tag, v>>8); - swf_SetU8(tag, v>>16); - } - return 3; -} -int swf_SetS24(TAG*tag, U32 v) -{ - if(tag) { - if(!(v&0xff000000)) - return swf_SetU24(tag, v); - if((v&0xff000000)!=0xff000000) { - fprintf(stderr, "Error: Overflow in swf_SetS24()\n"); - } - swf_SetU8(tag, v); - swf_SetU8(tag, v>>8); - swf_SetU8(tag, v>>16); - } - return 3; -} - - -int swf_SetRGB(TAG * t,RGBA * col) -{ if (!t) return -1; - if (col) - { swf_SetU8(t,col->r); - swf_SetU8(t,col->g); - swf_SetU8(t,col->b); - } else swf_SetBlock(t,NULL,3); - return 0; -} -void swf_GetRGB(TAG * t, RGBA * col) -{ - RGBA dummy; - if(!col) - col = &dummy; - col->r = swf_GetU8(t); - col->g = swf_GetU8(t); - col->b = swf_GetU8(t); - col->a = 255; -} - -int swf_SetRGBA(TAG * t,RGBA * col) -{ if (!t) return -1; - if (col) - { swf_SetU8(t,col->r); - swf_SetU8(t,col->g); - swf_SetU8(t,col->b); - swf_SetU8(t,col->a); - } else swf_SetBlock(t,NULL,4); - return 0; -} -void swf_GetRGBA(TAG * t, RGBA * col) -{ - RGBA dummy; - if(!col) - col = &dummy; - col->r = swf_GetU8(t); - col->g = swf_GetU8(t); - col->b = swf_GetU8(t); - col->a = swf_GetU8(t); -} - -void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha) -{ - int t; - if(!tag) { - memset(gradient, 0, sizeof(GRADIENT)); - return; - } - U8 num = swf_GetU8(tag) & 15; - if(gradient) { - gradient->num = num; - gradient->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*gradient->num); - gradient->ratios = (U8*)rfx_calloc(sizeof(gradient->ratios[0])*gradient->num); - } - for(t=0;tratios[t] = ratio; - gradient->rgba[t] = color; - } - } -} - -void swf_SetGradient(TAG * tag, GRADIENT * gradient, char alpha) -{ - int t; - if(!tag) { - memset(gradient, 0, sizeof(GRADIENT)); - return; - } - swf_SetU8(tag, gradient->num); - for(t=0; t<8 && tnum; t++) - { - swf_SetU8(tag, gradient->ratios[t]); - if(!alpha) - swf_SetRGB(tag, &gradient->rgba[t]); - else - swf_SetRGBA(tag, &gradient->rgba[t]); - } -} - -void swf_FreeGradient(GRADIENT* gradient) -{ - if(gradient->ratios) - rfx_free(gradient->ratios); - if(gradient->rgba) - rfx_free(gradient->rgba); - memset(gradient, 0, sizeof(GRADIENT)); -} - -int swf_CountUBits(U32 v,int nbits) -{ int n = 32; - U32 m = 0x80000000; - if(v == 0x00000000) n = 0; - else - while (!(v&m)) - { n--; - m>>=1; - } - return (n>nbits)?n:nbits; -} - -int swf_CountBits(U32 v,int nbits) -{ int n = 33; - U32 m = 0x80000000; - if (v&m) - { if(v == 0xffffffff) n = 1; - else - while (v&m) - { n--; - m>>=1; - } - } - else - { if(v == 0x00000000) n = 0; - else - while (!(v&m)) - { n--; - m>>=1; - } - } - return (n>nbits)?n:nbits; -} - -int swf_GetRect(TAG * t,SRECT * r) -{ int nbits; - SRECT dummy; - if(!t) {r->xmin=r->xmax=r->ymin=r->ymax=0;return 0;} - if (!r) r = &dummy; - nbits = (int) swf_GetBits(t,5); - r->xmin = swf_GetSBits(t,nbits); - r->xmax = swf_GetSBits(t,nbits); - r->ymin = swf_GetSBits(t,nbits); - r->ymax = swf_GetSBits(t,nbits); - return 0; -} - -int reader_GetRect(reader_t*reader,SRECT * r) -{ int nbits; - SRECT dummy; - if (!r) r = &dummy; - nbits = (int) reader_GetBits(reader,5); - r->xmin = reader_GetSBits(reader,nbits); - r->xmax = reader_GetSBits(reader,nbits); - r->ymin = reader_GetSBits(reader,nbits); - r->ymax = reader_GetSBits(reader,nbits); - return 0; -} - -int swf_SetRect(TAG * t,SRECT * r) -{ int nbits; - - nbits = swf_CountBits(r->xmin,0); - nbits = swf_CountBits(r->xmax,nbits); - nbits = swf_CountBits(r->ymin,nbits); - nbits = swf_CountBits(r->ymax,nbits); - if(nbits>=32) { - #ifdef DEBUG_RFXSWF - fprintf(stderr, "rfxswf: Warning: num_bits overflow in swf_SetRect\n"); - #endif - nbits=31; - } - - swf_SetBits(t,nbits,5); - swf_SetBits(t,r->xmin,nbits); - swf_SetBits(t,r->xmax,nbits); - swf_SetBits(t,r->ymin,nbits); - swf_SetBits(t,r->ymax,nbits); - - return 0; -} - -SRECT swf_ClipRect(SRECT border, SRECT r) -{ - if(r.xmax > border.xmax) r.xmax = border.xmax; - if(r.ymax > border.ymax) r.ymax = border.ymax; - if(r.xmax < border.xmin) r.xmax = border.xmin; - if(r.ymax < border.ymin) r.ymax = border.ymin; - - if(r.xmin > border.xmax) r.xmin = border.xmax; - if(r.ymin > border.ymax) r.ymin = border.ymax; - if(r.xmin < border.xmin) r.xmin = border.xmin; - if(r.ymin < border.ymin) r.ymin = border.ymin; - return r; -} - -void swf_ExpandRect(SRECT*src, SPOINT add) -{ - if((src->xmin | src->ymin | src->xmax | src->ymax)==0) { - src->xmin = add.x; - src->ymin = add.y; - src->xmax = add.x; - src->ymax = add.y; - if((add.x|add.y) == 0) src->xmax++; //make sure the bbox is not NULL anymore - return; - } - if(add.x < src->xmin) - src->xmin = add.x; - if(add.x > src->xmax) - src->xmax = add.x; - if(add.y < src->ymin) - src->ymin = add.y; - if(add.y > src->ymax) - src->ymax = add.y; -} -void swf_ExpandRect2(SRECT*src, SRECT*add) -{ - if((add->xmin | add->ymin | add->xmax | add->ymax)==0) - return; - if((src->xmin | src->ymin | src->xmax | src->ymax)==0) - *src = *add; - if(add->xmin < src->xmin) - src->xmin = add->xmin; - if(add->ymin < src->ymin) - src->ymin = add->ymin; - if(add->xmax > src->xmax) - src->xmax = add->xmax; - if(add->ymax > src->ymax) - src->ymax = add->ymax; -} -void swf_ExpandRect3(SRECT*src, SPOINT center, int radius) -{ - if((src->xmin | src->ymin | src->xmax | src->ymax)==0) { - src->xmin = center.x-radius; - src->ymin = center.y-radius; - src->xmax = center.x+radius; - src->ymax = center.y+radius; - if((center.x|center.y|radius) == 0) src->xmax++; //make sure the bbox is not NULL anymore - return; - } - if(center.x - radius < src->xmin) - src->xmin = center.x - radius; - if(center.x + radius > src->xmax) - src->xmax = center.x + radius; - if(center.y - radius < src->ymin) - src->ymin = center.y - radius; - if(center.y + radius > src->ymax) - src->ymax = center.y + radius; -} -SPOINT swf_TurnPoint(SPOINT p, MATRIX* m) -{ - SPOINT r; - r.x = (int)(m->sx*(1/65536.0)*p.x + m->r1*(1/65536.0)*p.y + 0.5) + m->tx; - r.y = (int)(m->r0*(1/65536.0)*p.x + m->sy*(1/65536.0)*p.y + 0.5) + m->ty; - return r; -} -SRECT swf_TurnRect(SRECT r, MATRIX* m) -{ - SRECT g; - SPOINT p1,p2,p3,p4,pp1,pp2,pp3,pp4; - if(!m) - return r; - p1.x = r.xmin;p1.y = r.ymin; - p2.x = r.xmax;p2.y = r.ymin; - p3.x = r.xmin;p3.y = r.ymax; - p4.x = r.xmax;p4.y = r.ymax; - pp1 = swf_TurnPoint(p1, m); - pp2 = swf_TurnPoint(p2, m); - pp3 = swf_TurnPoint(p3, m); - pp4 = swf_TurnPoint(p4, m); - g.xmin = g.xmax = pp1.x; - g.ymin = g.ymax = pp1.y; - swf_ExpandRect(&g, pp2); - swf_ExpandRect(&g, pp3); - swf_ExpandRect(&g, pp4); - return g; -} - - -int swf_GetMatrix(TAG * t,MATRIX * m) -{ MATRIX dummy; - int nbits; - - if (!m) m = &dummy; - - if (!t) - { m->sx = m->sy = 0x10000; - m->r0 = m->r1 = 0; - m->tx = m->ty = 0; - return -1; - } - - swf_ResetReadBits(t); - - if (swf_GetBits(t,1)) - { nbits = swf_GetBits(t,5); - m->sx = swf_GetSBits(t,nbits); - m->sy = swf_GetSBits(t,nbits); - } - else m->sx = m->sy = 0x10000; - - if (swf_GetBits(t,1)) - { nbits = swf_GetBits(t,5); - m->r0 = swf_GetSBits(t,nbits); - m->r1 = swf_GetSBits(t,nbits); - } - else m->r0 = m->r1 = 0x0; - - nbits = swf_GetBits(t,5); - m->tx = swf_GetSBits(t,nbits); - m->ty = swf_GetSBits(t,nbits); - - return 0; -} - -int swf_SetMatrix(TAG * t,MATRIX * m) -{ int nbits; - MATRIX ma; - - if (!m) - { m = &ma; - ma.sx = ma.sy = 0x10000; - ma.r0 = ma.r1 = 0; - ma.tx = ma.ty = 0; - } - - swf_ResetWriteBits(t); - - if ((m->sx==0x10000)&&(m->sy==0x10000)) swf_SetBits(t,0,1); - else - { swf_SetBits(t,1,1); - nbits = swf_CountBits(m->sx,0); - nbits = swf_CountBits(m->sy,nbits); - if(nbits>=32) { - /* TODO: happens on AMD64 systems for normal values? */ - #ifdef DEBUG_RFXSWF - fprintf(stderr,"rfxswf: Error: matrix values too large\n"); - #endif - nbits = 31; - } - swf_SetBits(t,nbits,5); - swf_SetBits(t,m->sx,nbits); - swf_SetBits(t,m->sy,nbits); - } - - if ((!m->r0)&&(!m->r1)) swf_SetBits(t,0,1); - else - { swf_SetBits(t,1,1); - nbits = swf_CountBits(m->r0,0); - nbits = swf_CountBits(m->r1,nbits); - if(nbits>=32) { - #ifdef DEBUG_RFXSWF - fprintf(stderr,"rfxswf: Error: matrix values too large\n"); - #endif - nbits = 31; - } - swf_SetBits(t,nbits,5); - swf_SetBits(t,m->r0,nbits); - swf_SetBits(t,m->r1,nbits); - } - - nbits = swf_CountBits(m->tx,0); - nbits = swf_CountBits(m->ty,nbits); - if(nbits>=32) { - #ifdef DEBUG_RFXSWF - fprintf(stderr,"rfxswf: Error: matrix values too large\n"); - #endif - nbits = 31; - } - swf_SetBits(t,nbits,5); - swf_SetBits(t,m->tx,nbits); - swf_SetBits(t,m->ty,nbits); - - return 0; -} - -int swf_GetCXForm(TAG * t,CXFORM * cx,U8 alpha) -{ CXFORM cxf; - int hasadd; - int hasmul; - int nbits; - - if (!cx) cx = &cxf; - - cx->a0 = cx->r0 = cx->g0 = cx->b0 = 256; - cx->a1 = cx->r1 = cx->g1 = cx->b1 = 0; - - if (!t) return 0; - - swf_ResetReadBits(t); - hasadd = swf_GetBits(t,1); - hasmul = swf_GetBits(t,1); - nbits = swf_GetBits(t,4); - - if (hasmul) - { cx->r0 = (S16)swf_GetSBits(t,nbits); - cx->g0 = (S16)swf_GetSBits(t,nbits); - cx->b0 = (S16)swf_GetSBits(t,nbits); - if (alpha) - cx->a0 = (S16)swf_GetSBits(t,nbits); - } - - if (hasadd) - { cx->r1 = (S16)swf_GetSBits(t,nbits); - cx->g1 = (S16)swf_GetSBits(t,nbits); - cx->b1 = (S16)swf_GetSBits(t,nbits); - if (alpha) - cx->a1 = (S16)swf_GetSBits(t,nbits); - } - - return 0; -} - -int swf_SetCXForm(TAG * t,CXFORM * cx,U8 alpha) -{ CXFORM cxf; - int hasadd; - int hasmul; - int nbits; - - if (!cx) - { cx = &cxf; - cx->a0 = cx->r0 = cx->g0 = cx->b0 = 256; - cx->a1 = cx->r1 = cx->g1 = cx->b1 = 0; - } - - if (!alpha) - { cx->a0 = 256; - cx->a1 = 0; - } - - nbits = 0; - - hasmul = (cx->a0!=256)||(cx->r0!=256)||(cx->g0!=256)||(cx->b0!=256); - hasadd = cx->a1|cx->r1|cx->g1|cx->b1; - - if (hasmul) - { if (alpha) nbits = swf_CountBits((S32)cx->a0,nbits); - nbits = swf_CountBits((S32)cx->r0,nbits); - nbits = swf_CountBits((S32)cx->g0,nbits); - nbits = swf_CountBits((S32)cx->b0,nbits); - } - - if (hasadd) - { if (alpha) nbits = swf_CountBits((S32)cx->a1,nbits); - nbits = swf_CountBits((S32)cx->r1,nbits); - nbits = swf_CountBits((S32)cx->g1,nbits); - nbits = swf_CountBits((S32)cx->b1,nbits); - } - - swf_ResetWriteBits(t); - swf_SetBits(t,hasadd?1:0,1); - swf_SetBits(t,hasmul?1:0,1); - swf_SetBits(t,nbits,4); - - if (hasmul) - { swf_SetBits(t,cx->r0,nbits); - swf_SetBits(t,cx->g0,nbits); - swf_SetBits(t,cx->b0,nbits); - if (alpha) swf_SetBits(t,cx->a0,nbits); - } - - if (hasadd) - { swf_SetBits(t,cx->r1,nbits); - swf_SetBits(t,cx->g1,nbits); - swf_SetBits(t,cx->b1,nbits); - if (alpha) swf_SetBits(t,cx->a1,nbits); - } - - return 0; -} - -//int swf_GetPoint(TAG * t,SPOINT * p) { return 0; } -//int swf_SetPoint(TAG * t,SPOINT * p) { return 0; } - -void swf_SetPassword(TAG * t, const char * password) -{ -#ifdef HAVE_MD5 - /* WARNING: crypt_md5 is not reentrant */ - char salt[3]; - char* md5string; - -#if defined(HAVE_LRAND48) && defined(HAVE_SRAND48) && defined(HAVE_TIME_H) && defined(HAVE_TIME) - srand48(time(0)); - salt[0] = "abcdefghijklmnopqrstuvwxyz0123456789"[lrand48()%36]; - salt[1] = "abcdefghijklmnopqrstuvwxyz0123456789"[lrand48()%36]; -#else - salt[0] = 'l'; - salt[1] = '8'; - fprintf(stderr, "rfxswf: Warning- no usable random generator found\n"); - fprintf(stderr, "Your password will be vulnerable to dictionary attacks\n"); -#endif - salt[2] = 0; - - md5string = crypt_md5(password, salt); - - swf_SetU16(t,0); - swf_SetString(t, md5string); -#else - fprintf(stderr, "Error: No MD5 compiled in"); -#endif -} - -void swf_SetString(TAG*t, const char* s) -{ - if(!s) { - swf_SetU8(t, 0); - } else { - swf_SetBlock(t,(U8*)s,strlen(s)+1); - } -} - -int swf_VerifyPassword(TAG * t, const char * password) -{ -#ifdef HAVE_MD5 - char*md5string1, *md5string2; - char*x; - char*salt; - int n; - - if(t->len >= 5 && t->pos==0 && - t->data[0] == 0 && - t->data[1] == 0) { - swf_GetU16(t); - } else { - printf("%d %d %d %d\n", t->len, t->pos, t->data[0], t->data[1]); - } - - md5string1 = swf_GetString(t); - - if(strncmp(md5string1, "$1$",3 )) { - fprintf(stderr, "rfxswf: no salt in pw string\n"); - return 0; - } - x = strchr(md5string1+3, '$'); - if(!x) { - fprintf(stderr, "rfxswf: invalid salt format in pw string\n"); - return 0; - } - n = x-(md5string1+3); - salt = (char*)rfx_alloc(n+1); - memcpy(salt, md5string1+3, n); - salt[n] = 0; - - md5string2 = crypt_md5(password, salt); - rfx_free(salt); - if(strcmp(md5string1, md5string2) != 0) - return 0; - return 1; -#else - fprintf(stderr, "Error: No MD5 compiled in"); - return 1; -#endif -} - -// Tag List Manipulating Functions - -TAG * swf_InsertTag(TAG * after,U16 id) -{ TAG * t; - - t = (TAG *)rfx_calloc(sizeof(TAG)); - t->id = id; - - if (after) - { - t->prev = after; - t->next = after->next; - after->next = t; - if (t->next) t->next->prev = t; - } - return t; -} - -TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id) -{ TAG * t; - - t = (TAG *)rfx_calloc(sizeof(TAG)); - t->id = id; - - if (before) - { - t->next = before; - t->prev = before->prev; - before->prev = t; - if (t->prev) t->prev->next = t; - } - if(swf && swf->firstTag == before) { - swf->firstTag = t; - } - return t; -} - -void swf_ClearTag(TAG * t) -{ - if (t->data) rfx_free(t->data); - t->data = 0; - t->pos = 0; - t->len = 0; - t->readBit = 0; - t->writeBit = 0; - t->memsize = 0; -} - -void swf_ResetTag(TAG*tag, U16 id) -{ - tag->len = tag->pos = tag->readBit = tag->writeBit = 0; - tag->id = id; -} - -TAG* swf_CopyTag(TAG*tag, TAG*to_copy) -{ - tag = swf_InsertTag(tag, to_copy->id); - swf_SetBlock(tag, to_copy->data, to_copy->len); - return tag; -} - -TAG* swf_DeleteTag(SWF*swf, TAG * t) -{ - TAG*next = t->next; - - if (swf && swf->firstTag==t) - swf->firstTag = t->next; - if (t->prev) t->prev->next = t->next; - if (t->next) t->next->prev = t->prev; - - if (t->data) rfx_free(t->data); - rfx_free(t); - return next; -} - -TAG * swf_ReadTag(reader_t*reader, TAG * prev) -{ TAG * t; - U16 raw; - U32 len; - int id; - - if (reader->read(reader, &raw, 2) !=2 ) return NULL; - raw = LE_16_TO_NATIVE(raw); - - len = raw&0x3f; - id = raw>>6; - - if (len==0x3f) - { - len = reader_readU32(reader); - } - - if (id==ST_DEFINESPRITE) len = 2*sizeof(U16); - // Sprite handling fix: Flatten sprite tree - - t = (TAG *)rfx_calloc(sizeof(TAG)); - - t->len = len; - t->id = id; - - if (t->len) - { t->data = (U8*)rfx_alloc(t->len); - t->memsize = t->len; - if (reader->read(reader, t->data, t->len) != t->len) { - #ifdef DEBUG_RFXSWF - fprintf(stderr, "rfxswf: Warning: Short read (tagid %d). File truncated?\n", t->id); - #endif - free(t->data);t->data=0; - free(t); - return NULL; - } - } - - if (prev) - { - t->prev = prev; - prev->next = t; - } - - return t; -} - -int swf_DefineSprite_GetRealSize(TAG * t); - -int swf_WriteTag2(writer_t*writer, TAG * t) -// returns tag length in bytes (incl. Header), -1 = Error -// writer = 0 -> no output -{ U16 raw[3]; - U32 len; - int short_tag; - - if (!t) return -1; - - len = (t->id==ST_DEFINESPRITE)?swf_DefineSprite_GetRealSize(t):t->len; - - short_tag = len<0x3f&& - (t->id!=ST_DEFINEBITSLOSSLESS&&t->id!=ST_DEFINEBITSLOSSLESS2&&t->id!=ST_SOUNDSTREAMBLOCK&& - t->id!=ST_DEFINEBITSJPEG&&t->id!=ST_DEFINEBITSJPEG2&&t->id!=ST_DEFINEBITSJPEG3); - - if (writer) - { -#ifdef MEASURE - int oldpos = writer->pos; -#endif - - if (short_tag) - { raw[0] = LE_16_TO_NATIVE(len|((t->id&0x3ff)<<6)); - if (writer->write(writer,raw,2)!=2) - { - #ifdef DEBUG_RFXSWF - fprintf(stderr,"WriteTag() failed: Short Header.\n"); - #endif - return -1; - } - } - else - { - raw[0] = LE_16_TO_NATIVE((t->id<<6)|0x3f); - if (writer->write(writer,raw,2)!=2) - { -#ifdef DEBUG_RFXSWF - fprintf(stderr,"WriteTag() failed: Long Header (1).\n"); -#endif - return -1; - } - - writer_writeU32(writer, len); - } - - if (t->data) - { if (writer->write(writer,t->data,t->len)!=t->len) - { - #ifdef DEBUG_RFXSWF - fprintf(stderr,"WriteTag() failed: Data.\n"); - #endif - return -1; - } - } - #ifdef DEBUG_RFXSWF - else if (t->len) fprintf(stderr,"WriteTag(): Tag Data Error, id=%i\n",t->id); - #endif - -#ifdef MEASURE - writer->flush(writer); - printf("TAG %s costs %d bytes\n", swf_TagGetName(t), writer->pos-oldpos); -#endif - } - - return t->len+(short_tag?2:6); -} - -int swf_WriteTag(int handle, TAG * t) -{ - writer_t writer; - int len = 0; - if(handle<0) - return swf_WriteTag2(0, t); - writer_init_filewriter(&writer, handle); - len = swf_WriteTag2(&writer, t); - writer.finish(&writer); - return len; -} - -int swf_DefineSprite_GetRealSize(TAG * t) -// Sprite Handling: Helper function to pack DefineSprite-Tag -{ U32 len = t->len; - if(len>4) { // folded sprite - return t->len; - } - do - { t = swf_NextTag(t); - if (t && t->id!=ST_DEFINESPRITE) len += swf_WriteTag(-1, t); - else t = NULL; - } while (t&&(t->id!=ST_END)); - return len; -} - -void swf_UnFoldSprite(TAG * t) -{ - U16 id,tmp; - U32 len; - TAG*next = t; - U16 spriteid,spriteframes; - int level; - if(t->id!=ST_DEFINESPRITE) - return; - if(t->len<=4) // not folded - return; - - swf_SetTagPos(t,0); - - spriteid = swf_GetU16(t); //id - spriteframes = swf_GetU16(t); //frames - - level = 1; - - while(1) - { - TAG*it = 0; - tmp = swf_GetU16(t); - len = tmp&0x3f; - id = tmp>>6; - if(id == ST_END) - level--; - if(id == ST_DEFINESPRITE && len<=4) - level++; - - if (len==0x3f) - len = swf_GetU32(t); - it = swf_InsertTag(next, id); - next = it; - it->len = len; - it->id = id; - if (it->len) - { it->data = (U8*)rfx_alloc(it->len); - it->memsize = it->len; - swf_GetBlock(t, it->data, it->len); - } - - if(!level) - break; - } - - rfx_free(t->data); t->data = 0; - t->memsize = t->len = t->pos = 0; - - swf_SetU16(t, spriteid); - swf_SetU16(t, spriteframes); -} - -void swf_FoldSprite(TAG * t) -{ - TAG*sprtag=t,*tmp; - U16 id,frames; - int level; - if(t->id!=ST_DEFINESPRITE) - return; - if(!t->len) { - #ifdef DEBUG_RFXSWF - fprintf(stderr, "Error: Sprite has no ID!"); - #endif - return; - } - if(t->len>4) { - /* sprite is already folded */ - return; - } - - t->pos = 0; - id = swf_GetU16(t); - rfx_free(t->data); - t->len = t->pos = t->memsize = 0; - t->data = 0; - - frames = 0; - - t = swf_NextTag(sprtag); - level = 1; - - do - { - if(t->id==ST_SHOWFRAME) frames++; - if(t->id == ST_DEFINESPRITE && t->len<=4) - level++; - if(t->id == ST_END) - level--; - t = swf_NextTag(t); - } while(t && level); - if(level) - fprintf(stderr, "rfxswf error: sprite doesn't end(1)\n"); - - swf_SetU16(sprtag, id); - swf_SetU16(sprtag, frames); - - t = swf_NextTag(sprtag); - level = 1; - - do - { - if(t->len<0x3f&& - (t->id!=ST_DEFINEBITSLOSSLESS&&t->id!=ST_DEFINEBITSLOSSLESS2&&t->id!=ST_SOUNDSTREAMBLOCK&& - t->id!=ST_DEFINEBITSJPEG&&t->id!=ST_DEFINEBITSJPEG2&&t->id!=ST_DEFINEBITSJPEG3) - ) { - swf_SetU16(sprtag,t->len|(t->id<<6)); - } else { - swf_SetU16(sprtag,0x3f|(t->id<<6)); - swf_SetU32(sprtag,t->len); - } - if(t->len) - swf_SetBlock(sprtag,t->data, t->len); - tmp = t; - if(t->id == ST_DEFINESPRITE && t->len<=4) - level++; - if(t->id == ST_END) - level--; - t = swf_NextTag(t); - swf_DeleteTag(0, tmp); - } - while (t && level); - if(level) - fprintf(stderr, "rfxswf error: sprite doesn't end(2)\n"); - -// sprtag->next = t; -// t->prev = sprtag; -} - -int swf_IsFolded(TAG * t) -{ - return (t->id == ST_DEFINESPRITE && t->len>4); -} - -void swf_FoldAll(SWF*swf) -{ - TAG*tag = swf->firstTag; - //swf_DumpSWF(stdout, swf); - while(tag) { - if(tag->id == ST_DEFINESPRITE) { - swf_FoldSprite(tag); - //swf_DumpSWF(stdout, swf); - } - tag = swf_NextTag(tag); - } -} - -void swf_UnFoldAll(SWF*swf) -{ - TAG*tag = swf->firstTag; - while(tag) { - if(tag->id == ST_DEFINESPRITE) - swf_UnFoldSprite(tag); - tag = tag->next; - } -} - -void swf_OptimizeTagOrder(SWF*swf) -{ - TAG*tag,*next; - TAG*level0; - int level; - int changes; - swf_UnFoldAll(swf); - /* at the moment, we don't actually do optimizing, - only fixing of non-spec-conformant things like - sprite tags */ - - do { - changes = 0; - level = 0; - level0 = 0; - tag = swf->firstTag; - while(tag) { - next = tag->next; - if(tag->id == ST_DEFINESPRITE) { - if(tag->len>4) { - /* ??? all sprites are supposed to be unfolded */ - fprintf(stderr, "librfxswf error - internal error in OptimizeTagOrder/UnfoldAll\n"); - } - level++; - if(level==1) { - level0 = tag; - tag = next; - continue; - } - } - if(level>=1) { - /* move non-sprite tags out of sprite */ - if(!swf_isAllowedSpriteTag(tag) || level>=2) { - /* remove tag from current position */ - tag->prev->next = tag->next; - if(tag->next) - tag->next->prev = tag->prev; - - /* insert before tag level0 */ - tag->next = level0; - tag->prev = level0->prev; - level0->prev = tag; - if(tag->prev) - tag->prev->next = tag; - else - swf->firstTag = tag; - changes = 1; - } - } - if(tag->id == ST_END) { - level--; - } - - tag = next; - } - } while(changes); -} - -// Movie Functions - -int swf_ReadSWF2(reader_t*reader, SWF * swf) // Reads SWF to memory (malloc'ed), returns length or <0 if fails -{ - if (!swf) return -1; - memset(swf,0x00,sizeof(SWF)); - - { char b[32]; // read Header - int len; - TAG * t; - TAG t1; - reader_t zreader; - - if ((len = reader->read(reader ,b,8))<8) return -1; - - if (b[0]!='F' && b[0]!='C') return -1; - if (b[1]!='W') return -1; - if (b[2]!='S') return -1; - swf->fileVersion = b[3]; - swf->compressed = (b[0]=='C')?1:0; - swf->fileSize = GET32(&b[4]); - - if(swf->compressed) { - reader_init_zlibinflate(&zreader, reader); - reader = &zreader; - } - swf->compressed = 0; // derive from version number from now on - - reader_GetRect(reader, &swf->movieSize); - reader->read(reader, &swf->frameRate, 2); - swf->frameRate = LE_16_TO_NATIVE(swf->frameRate); - reader->read(reader, &swf->frameCount, 2); - swf->frameCount = LE_16_TO_NATIVE(swf->frameCount); - - /* read tags and connect to list */ - t1.next = 0; - t = &t1; - while (t) { - t = swf_ReadTag(reader,t); - if(t && t->id == ST_FILEATTRIBUTES) { - swf->fileAttributes = swf_GetU32(t); - swf_ResetReadBits(t); - } - } - swf->firstTag = t1.next; - if(t1.next) - t1.next->prev = NULL; - } - - return reader->pos; -} - -SWF* swf_OpenSWF(char*filename) -{ - int fi = open(filename, O_RDONLY|O_BINARY); - if(fi<0) { - fprintf(stderr, "Failed to open %s\n", filename); - return 0; - } - SWF* swf = rfx_alloc(sizeof(SWF)); - swf_ReadSWF(fi, swf); - close(fi); - return swf; -} - -int swf_ReadSWF(int handle, SWF * swf) -{ - reader_t reader; - reader_init_filereader(&reader, handle); - return swf_ReadSWF2(&reader, swf); -} - -void swf_ReadABCfile(char*filename, SWF*swf) -{ - memset(swf, 0, sizeof(SWF)); - swf->fileVersion=9; - swf->fileAttributes=FILEATTRIBUTE_AS3; //as3 - TAG*tag = swf->firstTag = swf_InsertTag(0, ST_RAWABC); - memfile_t*file = memfile_open(filename); - swf_SetBlock(tag, file->data, file->len); - memfile_close(file); -} - -int no_extra_tags = 0; - -int WriteExtraTags(SWF*swf, writer_t*writer) -{ - TAG*t = swf->firstTag; - TAG* has_fileattributes=0; - int has_scenedescription=0; - int has_version_8_action=0; - int has_version_9_action=0; - int len = 0; - while(t) { - if(t->id == ST_FILEATTRIBUTES) - has_fileattributes = t; - if(t->id == ST_SCENEDESCRIPTION) - has_scenedescription = 1; - if(t->id == ST_DOABC) - has_version_9_action=1; - /* FIXME: this doesn't yet find actionscript in buttons */ - if(t->id == ST_DOACTION || t->id == ST_DOINITACTION) - has_version_8_action=1; - if(t->id == ST_PLACEOBJECT2 && t->len && (t->data[0]&0x80)) - has_version_8_action=1; - t = t->next; - } - if(has_version_8_action && has_version_9_action) { - fprintf(stderr, "Warning: File contains both flash 8 and flash 9 actionscript\n"); - } - - if(swf->fileVersion >= 9) { - if(!has_fileattributes) { - U32 flags = swf->fileAttributes|FILEATTRIBUTE_AS3; // 16 = has symbolclass tag | 8 = actionscript3 | 1 = usenetwork - if(has_version_8_action && !has_version_9_action) - flags &= ~FILEATTRIBUTE_AS3; - TAG*fileattrib = swf_InsertTag(0, ST_FILEATTRIBUTES); - swf_SetU32(fileattrib, flags); - if(writer) { - if(swf_WriteTag2(writer, fileattrib)<0) - return -1; - } else { - len += swf_WriteTag(-1,fileattrib); - } - swf_DeleteTag(0, fileattrib); - } else { - if(swf->fileAttributes) { - /* if we're writing a file out again where we might have possible - modified the fileattributes in the header, adjust the tag data */ - TAG*tt = swf_CopyTag(0,has_fileattributes); - U32 flags = swf_GetU32(tt) | swf->fileAttributes; - swf_ResetTag(tt, tt->id); - swf_SetU32(tt, flags); - if(swf_WriteTag2(writer, has_fileattributes)<0) return -1; - swf_DeleteTag(0, tt); - } else { - if(swf_WriteTag2(writer, has_fileattributes)<0) - return -1; - } - } - if(0 && !has_scenedescription) { - TAG*scene = swf_InsertTag(0, ST_SCENEDESCRIPTION); - swf_SetU16(scene, 1); - swf_SetString(scene, "Scene 1"); - swf_SetU8(scene, 0); - if(writer) { - if(swf_WriteTag2(writer, scene)<0) - return -1; - } else { - len += swf_WriteTag(-1,scene); - } - swf_DeleteTag(0, scene); - } - } - return len; -} - -int swf_WriteSWF2(writer_t*writer, SWF * swf) // Writes SWF to file, returns length or <0 if fails -{ U32 len; - TAG * t; - int frameCount=0; - writer_t zwriter; - int fileSize = 0; - int inSprite = 0; - int ret; - writer_t*original_writer = writer; - int writer_lastpos = 0; - - if (!swf) return -1; - if (!writer) return -1; // the caller should provide a nullwriter, not 0, for querying SWF size - - if(original_writer) writer_lastpos = original_writer->pos; - - // Count Frames + File Size - - len = 0; - t = swf->firstTag; - frameCount = 0; - - if(swf->firstTag && !no_extra_tags) { - len += WriteExtraTags(swf, 0); - } - while(t) { - len += swf_WriteTag(-1,t); - if(t->id == ST_DEFINESPRITE && !swf_IsFolded(t)) inSprite++; - else if(t->id == ST_END && inSprite) inSprite--; - else if(t->id == ST_END && !inSprite) { - if(t->prev && t->prev->id!=ST_SHOWFRAME) - frameCount++; - } - else if(t->id == ST_SHOWFRAME && !inSprite) frameCount++; - t = swf_NextTag(t); - } - - { TAG t1; - char b[64],b4[4]; - U32 l; - - memset(&t1,0x00,sizeof(TAG)); - t1.data = (U8*)b; - t1.memsize = 64; - - { // measure header file size - TAG t2; - char b2[64]; - memset(&t2,0x00,sizeof(TAG)); - t2.data = (U8*)b2; - t2.memsize = 64; - swf_SetRect(&t2, &swf->movieSize); - swf_SetU16(&t2, swf->frameRate); - swf_SetU16(&t2, swf->frameCount); - l = swf_GetTagLen(&t2)+8; - } - if(swf->compressed == 8) { - l -= 8; - } - - fileSize = l+len; - if(len) {// don't touch headers without tags - swf->fileSize = fileSize; - swf->frameCount = frameCount; - } - - if(swf->compressed != 8) { - /* compressed flag set to 8 means "skip first 8 - header bytes". This is necessary if the caller wants to - create compressed SWFs himself . - It also means that we don't initialize our own zlib - writer, but assume the caller provided one. - */ - if(swf->compressed==1 || (swf->compressed==0 && swf->fileVersion>=6)) { - char*id = "CWS"; - writer->write(writer, id, 3); - } else { - char*id = "FWS"; - writer->write(writer, id, 3); - } - - writer->write(writer, &swf->fileVersion, 1); - PUT32(b4, swf->fileSize); - writer->write(writer, b4, 4); - - if(swf->compressed==1 || (swf->compressed==0 && swf->fileVersion>=6)) { - writer_init_zlibdeflate(&zwriter, writer); - writer = &zwriter; - } - } - - swf_SetRect(&t1,&swf->movieSize); - swf_SetU16(&t1,swf->frameRate); - swf_SetU16(&t1,swf->frameCount); - - ret = writer->write(writer,b,swf_GetTagLen(&t1)); - if (ret!=swf_GetTagLen(&t1)) - { - #ifdef DEBUG_RFXSWF - fprintf(stderr, "ret:%d\n",ret); - perror("write:"); - fprintf(stderr,"WriteSWF() failed: Header.\n"); - #endif - return -1; - } - - if(swf->firstTag && !no_extra_tags) { - WriteExtraTags(swf, writer); - } - t = swf->firstTag; - - while (t) { - if(no_extra_tags || t->id != ST_FILEATTRIBUTES) { - if(swf_WriteTag2(writer, t)<0) - return -1; - } - t = t->next; - } - if(swf->compressed==1 || (swf->compressed==0 && swf->fileVersion>=6) || swf->compressed==8) { - if(swf->compressed != 8) { - zwriter.finish(&zwriter); - return original_writer->pos - writer_lastpos; - } - return (int)fileSize; - } else { - return (int)fileSize; - } - } -} - -int swf_SaveSWF(SWF * swf, char*filename) -{ - int fi = open(filename, O_BINARY|O_RDWR|O_TRUNC|O_CREAT, 0777); - if(fi<0) { - perror(filename); - return 0; - } - if(swf_WriteSWF(fi, swf)<0) { - fprintf(stderr, "Unable to write output file: %s\n", filename); - return 0; - } - close(fi); - return 1; -} - -int swf_WriteSWF(int handle, SWF * swf) // Writes SWF to file, returns length or <0 if fails -{ - writer_t writer; - int len = 0; - - if(handle<0) { - writer_init_nullwriter(&writer); - len = swf_WriteSWF2(&writer, swf); - return len; - } - writer_init_filewriter(&writer, handle); - len = swf_WriteSWF2(&writer, swf); - writer.finish(&writer); - return len; -} - -int swf_WriteHeader2(writer_t*writer,SWF * swf) -{ - SWF myswf; - memcpy(&myswf,swf,sizeof(SWF)); - myswf.firstTag = 0; - return swf_WriteSWF2(writer, &myswf); -} - -int swf_WriteHeader(int handle,SWF * swf) -{ - SWF myswf; - memcpy(&myswf,swf,sizeof(SWF)); - myswf.firstTag = 0; - return swf_WriteSWF(handle, &myswf); -} - -int swf_WriteCGI(SWF * swf) -{ int len; - char s[1024]; - - len = swf_WriteSWF(-1,swf); - - if (len<0) return -1; - - sprintf(s,"Content-type: application/x-shockwave-flash\n" - "Accept-Ranges: bytes\n" - "Content-Length: %d\n" - "Expires: Thu, 13 Apr 2000 23:59:59 GMT\n" - "\n",len); - - write(fileno(stdout),s,strlen(s)); - return swf_WriteSWF(fileno(stdout),swf); -} - -SWF* swf_CopySWF(SWF*swf) -{ - SWF*nswf = (SWF*)rfx_alloc(sizeof(SWF)); - TAG*tag, *ntag; - memcpy(nswf, swf, sizeof(SWF)); - nswf->firstTag = 0; - tag = swf->firstTag; - ntag = 0; - while(tag) { - ntag = swf_CopyTag(ntag, tag); - if(!nswf->firstTag) - nswf->firstTag = ntag; - tag = tag->next; - } - return nswf; -} - -void swf_FreeTags(SWF * swf) // Frees all malloc'ed memory for tags -{ TAG * t = swf->firstTag; - - while (t) - { TAG * tnew = t->next; - if (t->data) rfx_free(t->data); - rfx_free(t); - t = tnew; - } - swf->firstTag = 0; -} - -// include advanced functions - -//#include "modules/swfdump.c" -//#include "modules/swfshape.c" -//#include "modules/swftext.c" -//#include "modules/swffont.c" -//#include "modules/swfobject.c" -//#include "modules/swfbutton.c" -//#include "modules/swftools.c" -//#include "modules/swfcgi.c" -//#include "modules/swfbits.c" -//#include "modules/swfaction.c" -//#include "modules/swfabc.c" -//#include "modules/swfsound.c" -//#include "modules/swfdraw.c" -//#include "modules/swfrender.c" -//#include "modules/swffilter.c" diff --git a/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.h b/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.h deleted file mode 100644 index 20d350286..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/rfxswf.h +++ /dev/null @@ -1,1209 +0,0 @@ -/* rfxswf.h - - Headers for rfxswf.c and modules - - Part of the swftools package. - - Copyright (c) 2000, 2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - - -#ifndef __RFX_SWF_INCLUDED__ -#define __RFX_SWF_INCLUDED__ - -#include -#include -#include -#include -#ifndef WIN32 -#include -#endif -#include -#include -#include "../config.h" -#include "./bitio.h" -#include "./drawer.h" -#include "./mem.h" -#include "./types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define DEBUG_RFXSWF -#ifdef RFXSWF_DISABLESOUND -#define NO_MP3 -#endif - -typedef signed SFIXED; -typedef signed SCOORD; - -#define SCOORD_MAX 0x7fffffffl -#define SCOORD_MIN -0x80000000l - -// Basic Structures - -typedef struct _SPOINT -{ SCOORD x; - SCOORD y; -} SPOINT; - -typedef struct _RGBA -{ U8 a; - U8 r; - U8 g; - U8 b; -} RGBA; - -typedef struct _YUV -{ - U8 y,u,v; -} YUV; - -typedef struct _SRECT -{ SCOORD xmin; - SCOORD ymin; - SCOORD xmax; - SCOORD ymax; -} SRECT; - -typedef struct _MATRIX -{ SFIXED sx,r1, tx; - SFIXED r0,sy, ty; -} MATRIX; - -typedef struct _CXFORM -{ S16 a0, a1; /* mult, add */ - S16 r0, r1; - S16 g0, g1; - S16 b0, b1; -} CXFORM; - -#define GRADIENT_LINEAR 0x10 -#define GRADIENT_RADIAL 0x12 -typedef struct _GRADIENT -{ - int num; - U8* ratios; - RGBA* rgba; -} GRADIENT; - -typedef struct _FILTER -{ - U8 type; -} FILTER; - -typedef struct _FILTERLIST -{ - int num; - FILTER*filter[8]; -} FILTERLIST; - -typedef struct _TAG // NEVER access a Tag-Struct directly ! -{ U16 id; - U8 * data; - U32 memsize; // to minimize realloc() calls - - U32 len; // for Set-Access - U32 pos; // for Get-Access - - struct _TAG * next; - struct _TAG * prev; - - U8 readBit; // for Bit-Manipulating Functions [read] - U8 writeBit; // [write] - -} TAG; - -#define swf_ResetReadBits(tag) if (tag->readBit) { tag->pos++; tag->readBit = 0; } -#define swf_ResetWriteBits(tag) if (tag->writeBit) { tag->writeBit = 0; } - -typedef struct _SOUNDINFO -{ - U8 stop; - U8 nomultiple; //continue playing if already started - - U32 inpoint; - U32 outpoint; - - U16 loops; - U8 envelopes; - - //envelope: - U32* pos; - U32* left; - U32* right; -} SOUNDINFO; - -#define FILEATTRIBUTE_USENETWORK 1 -#define FILEATTRIBUTE_AS3 8 -#define FILEATTRIBUTE_SYMBOLCLASS 16 -#define FILEATTRIBUTE_USEACCELERATEDBLIT 32 -#define FILEATTRIBUTE_USEHARDWAREGPU 64 - -typedef struct _SWF -{ U8 fileVersion; - U8 compressed; // SWF or SWC? - U32 fileSize; // valid after load and save - SRECT movieSize; - U16 frameRate; - U16 frameCount; // valid after load and save - TAG * firstTag; - U32 fileAttributes; // for SWFs >= Flash9 -} SWF; - -// Basic Functions - -SWF* swf_OpenSWF(char*filename); -int swf_ReadSWF2(reader_t*reader, SWF * swf); // Reads SWF via callback -int swf_ReadSWF(int handle,SWF * swf); // Reads SWF to memory (malloc'ed), returns length or <0 if fails -int swf_WriteSWF2(writer_t*writer, SWF * swf); // Writes SWF via callback, returns length or <0 if fails -int swf_WriteSWF(int handle,SWF * swf); // Writes SWF to file, returns length or <0 if fails -int swf_SaveSWF(SWF * swf, char*filename); -int swf_WriteCGI(SWF * swf); // Outputs SWF with valid CGI header to stdout -void swf_FreeTags(SWF * swf); // Frees all malloc'ed memory for swf -SWF* swf_CopySWF(SWF*swf); -void swf_ReadABCfile(char*filename, SWF*swf); - -// for streaming: -int swf_WriteHeader(int handle,SWF * swf); // Writes Header of swf to file -int swf_WriteHeader2(writer_t*writer,SWF * swf); // Writes Header of swf to file -int swf_WriteTag(int handle,TAG * tag); // Writes TAG to file -int swf_WriteTag2(writer_t*writer, TAG * t); //Write TAG via callback - -int swf_ReadHeader(reader_t*reader, SWF * swf); // Reads SWF Header via callback - -// folding/unfolding: - -void swf_FoldAll(SWF*swf); -void swf_UnFoldAll(SWF*swf); -void swf_FoldSprite(TAG*tag); -void swf_UnFoldSprite(TAG*tag); -int swf_IsFolded(TAG*tag); - -// tag reordering: - -void swf_OptimizeTagOrder(SWF*swf); - -// basic routines: - -TAG * swf_InsertTag(TAG * after,U16 id); // updates frames, if necessary -TAG * swf_InsertTagBefore(SWF*swf, TAG * before,U16 id); // like InsertTag, but insert tag before argument -TAG * swf_DeleteTag(SWF*swf, TAG * t); - -void swf_ClearTag(TAG * t); //frees tag data -void swf_ResetTag(TAG*tag, U16 id); //set's tag position and length to 0, without freeing it -TAG* swf_CopyTag(TAG*tag, TAG*to_copy); //stores a copy of another tag into this taglist - -void swf_SetTagPos(TAG * t,U32 pos); // resets Bitcount -U32 swf_GetTagPos(TAG * t); - -TAG * swf_NextTag(TAG * t); -TAG * swf_PrevTag(TAG * t); - -U16 swf_GetTagID(TAG * t); // ... TagGetID -U32 swf_GetTagLen(TAG * t); // ... TagGetTagLen -U8* swf_GetTagLenPtr(TAG * t); - -U32 swf_GetBits(TAG * t,int nbits); -S32 swf_GetSBits(TAG * t,int nbits); -int swf_SetBits(TAG * t,U32 v,int nbits); -int swf_CountUBits(U32 v,int nbits); -int swf_CountBits(U32 v,int nbits); - -int swf_GetBlock(TAG * t,U8 * b,int l); // resets Bitcount -int swf_SetBlock(TAG * t,const U8 * b,int l); - -U8 swf_GetU8(TAG * t); // resets Bitcount -U16 swf_GetU16(TAG * t); -#define swf_GetS16(tag) ((S16)swf_GetU16(tag)) -U32 swf_GetU32(TAG * t); -float swf_GetF16(TAG * t); -void swf_GetRGB(TAG * t, RGBA * col); -void swf_GetRGBA(TAG * t, RGBA * col); -void swf_GetGradient(TAG * t, GRADIENT * gradient, char alpha); -void swf_SetGradient(TAG * tag, GRADIENT * gradient, char alpha); -void swf_FreeGradient(GRADIENT* gradient); -char* swf_GetString(TAG*t); -int swf_SetU8(TAG * t,U8 v); // resets Bitcount -int swf_SetU16(TAG * t,U16 v); -void swf_SetS16(TAG * t,int v); -int swf_SetU32(TAG * t,U32 v); -void swf_SetF16(TAG * t,float f); -void swf_SetString(TAG*t,const char*s); - -float floatToF16(float f); -float F16toFloat(U16 x); - -/* abc datatypes */ -U32 swf_GetU30(TAG*tag); -int swf_SetU30(TAG*tag, U32 u); -void swf_SetABCU32(TAG*tag, U32 u); -U32 swf_GetABCU32(TAG*tag); -void swf_SetABCS32(TAG*tag, S32 v); -S32 swf_GetABCS32(TAG*tag); -int swf_SetU30String(TAG*tag, const char*str, int len); -double swf_GetD64(TAG*tag); -int swf_SetD64(TAG*tag, double v); -int swf_GetU24(TAG*tag); -int swf_GetS24(TAG*tag); -int swf_SetU24(TAG*tag, U32 v); -int swf_SetS24(TAG*tag, U32 v); - -//int swf_GetPoint(TAG * t,SPOINT * p); // resets Bitcount -int swf_GetRect(TAG * t,SRECT * r); -int swf_GetMatrix(TAG * t,MATRIX * m); -int swf_GetCXForm(TAG * t,CXFORM * cx,U8 alpha); - -double swf_GetFixed(TAG * t); -void swf_SetFixed(TAG * t, double f); -float swf_GetFixed8(TAG * t); -void swf_SetFixed8(TAG * t, float f); - -//int swf_SetPoint(TAG * t,SPOINT * p); // resets Bitcount -int swf_SetRect(TAG * t,SRECT * r); -int swf_SetMatrix(TAG * t,MATRIX * m); -int swf_SetCXForm(TAG * t,CXFORM * cx,U8 alpha); -int swf_SetRGB(TAG * t,RGBA * col); -int swf_SetRGBA(TAG * t,RGBA * col); -void swf_SetPassword(TAG * t, const char * password); - -int swf_VerifyPassword(TAG * t, const char * password); - -// helper functions: - -SRECT swf_ClipRect(SRECT border, SRECT r); -void swf_ExpandRect(SRECT*src, SPOINT add); -void swf_ExpandRect2(SRECT*src, SRECT*add); -void swf_ExpandRect3(SRECT*src, SPOINT center, int radius); -SPOINT swf_TurnPoint(SPOINT p, MATRIX* m); -SRECT swf_TurnRect(SRECT r, MATRIX* m); - -#ifndef FAILED -#define FAILED(b) ((b)<0) -#endif - -// Tag IDs (adopted from J. C. Kessels' Form2Flash) - -#define ST_END 0 -#define ST_SHOWFRAME 1 -#define ST_DEFINESHAPE 2 -#define ST_FREECHARACTER 3 -#define ST_PLACEOBJECT 4 -#define ST_REMOVEOBJECT 5 -#define ST_DEFINEBITS 6 -#define ST_DEFINEBITSJPEG 6 -#define ST_DEFINEBUTTON 7 -#define ST_JPEGTABLES 8 -#define ST_SETBACKGROUNDCOLOR 9 -#define ST_DEFINEFONT 10 -#define ST_DEFINETEXT 11 -#define ST_DOACTION 12 -#define ST_DEFINEFONTINFO 13 -#define ST_DEFINESOUND 14 /* Event sound tags. */ -#define ST_STARTSOUND 15 -#define ST_DEFINEBUTTONSOUND 17 -#define ST_SOUNDSTREAMHEAD 18 -#define ST_SOUNDSTREAMBLOCK 19 -#define ST_DEFINEBITSLOSSLESS 20 /* A bitmap using lossless zlib compression. */ -#define ST_DEFINEBITSJPEG2 21 /* A bitmap using an internal JPEG compression table. */ -#define ST_DEFINESHAPE2 22 -#define ST_DEFINEBUTTONCXFORM 23 -#define ST_PROTECT 24 /* This file should not be importable for editing. */ -#define ST_PLACEOBJECT2 26 /* The new style place w/ alpha color transform and name. */ -#define ST_REMOVEOBJECT2 28 /* A more compact remove object that omits the character tag (just depth). */ -#define ST_FREEALL 31 /* ? */ -#define ST_DEFINESHAPE3 32 /* A shape V3 includes alpha values. */ -#define ST_DEFINETEXT2 33 /* A text V2 includes alpha values. */ -#define ST_DEFINEBUTTON2 34 /* A button V2 includes color transform, alpha and multiple actions */ -#define ST_DEFINEBITSJPEG3 35 /* A JPEG bitmap with alpha info. */ -#define ST_DEFINEBITSLOSSLESS2 36 /* A lossless bitmap with alpha info. */ -#define ST_DEFINEEDITTEXT 37 -#define ST_DEFINEMOVIE 38 -#define ST_DEFINESPRITE 39 /* Define a sequence of tags that describe the behavior of a sprite. */ -#define ST_NAMECHARACTER 40 /* Name a character definition, character id and a string, (used for buttons, bitmaps, sprites and sounds). */ -#define ST_SERIALNUMBER 41 -#define ST_GENERATORTEXT 42 /* contains an id */ -#define ST_FRAMELABEL 43 /* A string label for the current frame. */ -#define ST_SOUNDSTREAMHEAD2 45 /* For lossless streaming sound, should not have needed this... */ -#define ST_DEFINEMORPHSHAPE 46 /* A morph shape definition */ -#define ST_DEFINEFONT2 48 -#define ST_TEMPLATECOMMAND 49 -#define ST_GENERATOR3 51 -#define ST_EXTERNALFONT 52 -#define ST_EXPORTASSETS 56 -#define ST_IMPORTASSETS 57 -#define ST_ENABLEDEBUGGER 58 -#define ST_DOINITACTION 59 -#define ST_DEFINEVIDEOSTREAM 60 -#define ST_VIDEOFRAME 61 -#define ST_DEFINEFONTINFO2 62 -#define ST_MX4 63 /*(?) */ -#define ST_ENABLEDEBUGGER2 64 /* version 8 */ -#define ST_SCRIPTLIMITS 65 /* version 7- u16 maxrecursedepth, u16 scripttimeoutseconds */ -#define ST_SETTABINDEX 66 /* version 7- u16 depth(!), u16 tab order value */ -#define ST_FILEATTRIBUTES 69 /* version 8 (required)- */ -#define ST_PLACEOBJECT3 70 /* version 8 */ -#define ST_IMPORTASSETS2 71 /* version 8 */ -#define ST_RAWABC 72 /* version 9, used by flex */ -#define ST_DEFINEFONTALIGNZONES 73 /* version 8 */ -#define ST_CSMTEXTSETTINGS 74 /* version 8 */ -#define ST_DEFINEFONT3 75 /* version 8 */ -#define ST_SYMBOLCLASS 76 /* version 9 */ -#define ST_METADATA 77 /* version 8 */ -#define ST_DEFINESCALINGGRID 78 /* version 8 */ -#define ST_DOABC 82 /* version 9 */ -#define ST_DEFINESHAPE4 83 /* version 8 */ -#define ST_DEFINEMORPHSHAPE2 84 /* version 8 */ -#define ST_SCENEDESCRIPTION 86 /* version 9 */ -#define ST_DEFINEBINARY 87 /* version 9 */ -#define ST_DEFINEFONTNAME 88 /* version 9 */ - -/* custom tags- only valid for swftools */ -#define ST_REFLEX 777 /* to identify generator software */ -#define ST_GLYPHNAMES 778 - -// Advanced Funtions - -// swfshape.c - -typedef struct _LINESTYLE -{ U16 width; - RGBA color; -} LINESTYLE; - -#define FILL_SOLID 0x00 -#define FILL_LINEAR 0x10 // Gradient -#define FILL_RADIAL 0x12 -#define FILL_TILED 0x40 // Bitmap -#define FILL_CLIPPED 0x41 - -typedef struct _FILLSTYLE -{ U8 type; - RGBA color; - MATRIX m; - U16 id_bitmap; - GRADIENT gradient; -} FILLSTYLE; - -typedef struct _SHAPE // NEVER access a Shape-Struct directly ! -{ - struct - { LINESTYLE * data; - U16 n; - } linestyle; - - struct - { FILLSTYLE * data; - U16 n; - } fillstyle; - - struct - { U16 fill; - U16 line; - } bits; - // used by Get/SetSimpleShape and glyph handling - U8 * data; - U32 bitlen; // length of data in bits -} SHAPE; - -/* SHAPE can be converted into SHAPE2: */ - -struct _SHAPELINE; -typedef struct _SHAPE2 -{ - LINESTYLE * linestyles; - int numlinestyles; - FILLSTYLE* fillstyles; - int numfillstyles; - struct _SHAPELINE * lines; - SRECT* bbox; // may be NULL -} SHAPE2; - -enum SHAPELINETYPE {moveTo, lineTo, splineTo}; -typedef struct _SHAPELINE -{ - enum SHAPELINETYPE type; - SCOORD x,y; - SCOORD sx,sy; //only if type==splineTo - int fillstyle0; - int fillstyle1; - int linestyle; - struct _SHAPELINE * next; -} SHAPELINE; - -// Shapes - -int swf_ShapeNew(SHAPE ** s); -void swf_ShapeFree(SHAPE * s); -char swf_ShapeIsEmpty(SHAPE*s); - -int swf_GetSimpleShape(TAG * t,SHAPE ** s); // without Linestyle/Fillstyle Record -int swf_SetSimpleShape(TAG * t,SHAPE * s); // without Linestyle/Fillstyle Record - -int swf_ShapeAddLineStyle(SHAPE * s,U16 width,RGBA * color); -int swf_ShapeAddSolidFillStyle(SHAPE * s,RGBA * color); -int swf_ShapeAddBitmapFillStyle(SHAPE * s,MATRIX * m,U16 id_bitmap,int clip); -int swf_ShapeAddGradientFillStyle(SHAPE * s,MATRIX * m,GRADIENT* gradient,int radial); -int swf_ShapeAddFillStyle2(SHAPE * s,FILLSTYLE*fs); - -int swf_SetShapeStyles(TAG * t,SHAPE * s); -int swf_ShapeCountBits(SHAPE * s,U8 * fbits,U8 * lbits); -int swf_SetShapeBits(TAG * t,SHAPE * s); -int swf_SetShapeHeader(TAG * t,SHAPE * s); // one call for upper three functions - -int swf_ShapeSetMove(TAG * t,SHAPE * s,S32 x,S32 y); -int swf_ShapeSetStyle(TAG * t,SHAPE * s,int line,int fill0,int fill1); -#define UNDEFINED_COORD 0x7fffffff -int swf_ShapeSetAll(TAG * t,SHAPE * s,S32 x,S32 y,int line,int fill0,int fill1); - -int swf_ShapeSetLine(TAG * t,SHAPE * s,S32 x,S32 y); -int swf_ShapeSetCurve(TAG * t,SHAPE * s,S32 x,S32 y,S32 ax,S32 ay); -int swf_ShapeSetCircle(TAG * t,SHAPE * s,S32 x,S32 y,S32 rx,S32 ry); -int swf_ShapeSetEnd(TAG * t); -int swf_SetShapeStyleCount(TAG * t,U16 n); -int swf_SetFillStyle(TAG * t,FILLSTYLE * f); -int swf_SetLineStyle(TAG * t,LINESTYLE * l); - - -void swf_ShapeSetRectangle(TAG*tag, U16 shapeid, int width, int height, RGBA*rgba); -void swf_ShapeSetRectangleWithBorder(TAG*tag, U16 shapeid, int width, int height, RGBA*rgba, int linewidth, RGBA*linecolor); -void swf_ShapeSetBitmapRect(TAG * t, U16 gfxid, int width, int height); - -//SHAPELINE* swf_ParseShapeData(U8*data, int bits, int fillbits, int linebits); -SHAPE2* swf_ShapeToShape2(SHAPE*shape); -void swf_Shape2ToShape(SHAPE2*shape2, SHAPE*shape); -SRECT swf_GetShapeBoundingBox(SHAPE2*shape); -void swf_SetShape2(TAG*tag, SHAPE2*shape); -SHAPE2* swf_Shape2Clone(SHAPE2 * s); -void swf_Shape2Free(SHAPE2 * s); -void swf_DumpShape(SHAPE2*shape2); - -void swf_ParseDefineShape(TAG*tag, SHAPE2*shape); -void swf_SetShape2(TAG*tag, SHAPE2*shape2); - -void swf_RecodeShapeData(U8*data, int bitlen, int in_bits_fill, int in_bits_line, - U8**destdata, U32*destbitlen, int out_bits_fill, int out_bits_line); - -// swfdraw.c - -void swf_Shape10DrawerInit(drawer_t*draw, TAG*tag); -void swf_Shape01DrawerInit(drawer_t*draw, TAG*tag); -void swf_Shape11DrawerInit(drawer_t*draw, TAG*tag); -SHAPE* swf_ShapeDrawerToShape(drawer_t*draw); -SRECT swf_ShapeDrawerGetBBox(drawer_t*draw); - -void swf_DrawString(drawer_t*draw, const char*source); - -// swftext.c - -typedef struct _KERNING -{ - U16 char1; - U16 char2; - U16 adjustment; -} SWFKERNING; - -typedef struct _SWFLAYOUT -{ U16 ascent; - U16 descent; - U16 leading; - SRECT * bounds; - U16 kerningcount; - SWFKERNING * kerning; -} SWFLAYOUT; - -typedef struct -{ S16 advance; - SHAPE * shape; -} SWFGLYPH; - -typedef struct _SWFGLYPHPAIR -{ - U16 char1; - U16 char2; - int num; -} SWFGLYPHPAIR; - -typedef struct _FONTUSAGE -{ int* chars; - char is_reduced; - int used_glyphs; - int glyphs_specified; - U16 smallest_size; - - SWFGLYPHPAIR* neighbors; - int num_neighbors; - int neighbors_size; - int* neighbors_hash; - int neighbors_hash_size; -} FONTUSAGE; - -#define FONT_STYLE_BOLD 1 -#define FONT_STYLE_ITALIC 2 -#define FONT_ENCODING_UNICODE 1 -#define FONT_ENCODING_ANSI 2 -#define FONT_ENCODING_SHIFTJIS 4 - -#define FONTALIGN_THIN 0 -#define FONTALIGN_MEDIUM 1 -#define FONTALIGN_THICK 2 - -typedef struct _ALIGNZONE -{ - U16 x,y; - U16 dx,dy; -} ALIGNZONE; - -typedef struct _SWFFONT -{ int id; // -1 = not set - U8 version; // 0 = not set, 1 = definefont, 2 = definefont2, 3 = definefont3 - U8 * name; - SWFLAYOUT * layout; - int numchars; - int maxascii; // highest mapped ascii/unicode value - - U8 style; - U8 encoding; - - U16 * glyph2ascii; - int * ascii2glyph; - int * glyph2glyph; // only if the font is resorted - SWFGLYPH * glyph; - ALIGNZONE * alignzones; - U8 alignzone_flags; - U8 language; - char ** glyphnames; - - FONTUSAGE * use; - -} SWFFONT; - - -#define ET_HASTEXT 32768 -#define ET_WORDWRAP 16384 -#define ET_MULTILINE 8192 -#define ET_PASSWORD 4096 -#define ET_READONLY 2048 -#define ET_HASTEXTCOLOR 1024 -#define ET_HASMAXLENGTH 512 -#define ET_HASFONT 256 -#define ET_X3 128 -#define ET_AUTOSIZE 64 /* MX */ -#define ET_HASLAYOUT 32 -#define ET_NOSELECT 16 -#define ET_BORDER 8 -#define ET_X1 4 -#define ET_HTML 2 /* MX? */ -#define ET_USEOUTLINES 1 - -#define ET_ALIGN_LEFT 0 -#define ET_ALIGN_RIGHT 1 -#define ET_ALIGN_CENTER 2 -#define ET_ALIGN_JUSTIFY 3 - -typedef struct _EditTextLayout -{ - U8 align; // 0=left, 1=right, 2=center, 3=justify - U16 leftmargin; - U16 rightmargin; - U16 indent; - U16 leading; -} EditTextLayout; - -int swf_FontEnumerate(SWF * swf,void (*FontCallback) (void*,U16,U8*), void*self); -// -> void fontcallback(U16 id,U8 * name); returns number of defined fonts - -int swf_FontExtract(SWF * swf,int id,SWFFONT ** f); -// Fetches all available information from DefineFont, DefineFontInfo, DefineText, ... -// id = FontID, id=0 -> Extract first Font -int swf_FontExtract_DefineFont2(int id, SWFFONT * font, TAG * tag); -int swf_FontExtract_DefineFontInfo(int id, SWFFONT * f, TAG * t); -int swf_FontExtract_DefineFont(int id, SWFFONT * f, TAG * t); -int swf_FontExtract_GlyphNames(int id, SWFFONT * f, TAG * tag); -int swf_FontExtract_DefineFontAlignZones(int id, SWFFONT * font, TAG * tag); - - -int swf_FontIsItalic(SWFFONT * f); -int swf_FontIsBold(SWFFONT * f); - -int swf_FontSetID(SWFFONT * f,U16 id); -int swf_FontReduce(SWFFONT * f); -int swf_FontReduce_swfc(SWFFONT * f); - -int swf_FontInitUsage(SWFFONT * f); -int swf_FontUseGlyph(SWFFONT * f, int glyph, U16 size); -void swf_FontUsePair(SWFFONT * f, int char1, int char2); -int swf_FontUseGetPair(SWFFONT * f, int char1, int char2); -int swf_FontUseAll(SWFFONT* f); -int swf_FontUseUTF8(SWFFONT * f, const U8 * s, U16 size); -int swf_FontUse(SWFFONT* f,U8 * s); -void swf_FontSort(SWFFONT * font); - -int swf_FontSetDefine(TAG * t,SWFFONT * f); -int swf_FontSetDefine2(TAG * t,SWFFONT * f); -int swf_FontSetInfo(TAG * t,SWFFONT * f); -void swf_FontSetAlignZones(TAG*t, SWFFONT *f); - -void swf_FontCreateLayout(SWFFONT*f); -void swf_FontCreateAlignZones(SWFFONT * f); -void swf_FontAddLayout(SWFFONT * f, int ascent, int descent, int leading); -void swf_FontPostprocess(SWF*swf); - -int swf_ParseDefineText(TAG * t, void(*callback)(void*self, int*chars, int*xpos, int nr, int fontid, int fontsize, int xstart, int ystart, RGBA* color), void*self); - -void swf_WriteFont(SWFFONT* font, char* filename); -SWFFONT* swf_ReadFont(const char* filename); - -void swf_FontFree(SWFFONT * f); - -U32 swf_TextGetWidth(SWFFONT * font,U8 * s,int scale); -int swf_TextCountBits(SWFFONT * font,U8 * s,int scale,U8 * gbits,U8 * abits); - -#define SET_TO_ZERO 0x80000000 -int swf_TextSetInfoRecord(TAG * t,SWFFONT * font,U16 size,RGBA * color,int dx,int dy); -int swf_TextSetCharRecord(TAG * t,SWFFONT * font,U8 * s,int scale,U8 gbits,U8 abits); - -int swf_TextPrintDefineText(TAG * t,SWFFONT * f); -// Prints text defined in tag t with font f to stdout - -void swf_FontPrepareForEditText(SWFFONT * f); - -/* notice: if you set the fontid, make sure you call swf_FontPrepareForEditText() for the font first */ -void swf_SetEditText(TAG*tag, U16 flags, SRECT r, const char*text, RGBA*color, - int maxlength, U16 font, U16 height, EditTextLayout*layout, const char*variable); - -SRECT swf_SetDefineText(TAG*tag, SWFFONT*font, RGBA*rgb, const char*text, int scale); - -void swf_DrawText(drawer_t*draw, SWFFONT*font, int size, const char*text); - -// swffont.c - -SWFFONT* swf_LoadTrueTypeFont(const char*filename, char flashtype); -SWFFONT* swf_LoadT1Font(const char*filename); -SWFFONT* swf_LoadFont(const char*filename, char flashtype); - -void swf_SetLoadFontParameters(int scale, int skip_unused, int full_unicode); - -// swfdump.c - -void swf_DumpHeader(FILE * f,SWF * swf); -void swf_DumpMatrix(FILE * f,MATRIX * m); -void swf_DumpTag(FILE * f,TAG * t); -void swf_DumpSWF(FILE * f,SWF*swf); -void swf_DumpGradient(FILE* f, GRADIENT*gradient); -char* swf_TagGetName(TAG*tag); -void swf_DumpFont(SWFFONT * font); - -// swfbits.c - -int swf_ImageHasAlpha(RGBA*img, int width, int height); -int swf_ImageGetNumberOfPaletteEntries(RGBA*img, int width, int height, RGBA*palette); - -typedef int JPEGBITS; -JPEGBITS * swf_SetJPEGBitsStart(TAG * t,int width,int height,int quality); // deprecated -int swf_SetJPEGBitsLines(JPEGBITS * jpegbits,U8 ** data,int n); // deprecated -int swf_SetJPEGBitsLine(JPEGBITS * jpegbits,U8 * data); // deprecated -int swf_SetJPEGBitsFinish(JPEGBITS * jpegbits); // deprecated - -void swf_GetJPEGSize(const char * fname, int*width, int*height); - -int swf_SetJPEGBits(TAG * t,const char * fname,int quality); -void swf_SetJPEGBits2(TAG * t,U16 width,U16 height,RGBA * bitmap,int quality); -int swf_SetJPEGBits3(TAG * tag,U16 width,U16 height,RGBA* bitmap, int quality); -RGBA* swf_JPEG2TagToImage(TAG*tag, int*width, int*height); -void swf_RemoveJPEGTables(SWF*swf); - -void swf_SaveJPEG(char*filename, RGBA*pixels, int width, int height, int quality); - -#define BYTES_PER_SCANLINE(width) ((width+3)&0xfffffffc) - -#define BMF_8BIT 3 // Bitmap formats -#define BMF_16BIT 4 -#define BMF_32BIT 5 - -int swf_SetLosslessBits(TAG * t,U16 width,U16 height,void * bitmap,U8 bitmap_flags); -int swf_SetLosslessBitsIndexed(TAG * t,U16 width,U16 height,U8 * bitmap,RGBA * palette,U16 ncolors); -int swf_SetLosslessBitsGrayscale(TAG * t,U16 width,U16 height,U8 * bitmap); -void swf_SetLosslessImage(TAG*tag, RGBA*data, int width, int height); //WARNING: will change tag->id - -RGBA* swf_DefineLosslessBitsTagToImage(TAG*tag, int*width, int*height); - -RGBA* swf_ExtractImage(TAG*tag, int*dwidth, int*dheight); -TAG* swf_AddImage(TAG*tag, int bitid, RGBA*mem, int width, int height, int quality); - -// swfsound.c -void swf_SetSoundStreamHead(TAG*tag, int avgnumsamples); -void swf_SetSoundStreamBlock(TAG*tag, S16*samples, int seek, char first); /* expects 2304 samples */ -void swf_SetSoundDefine(TAG*tag, S16*samples, int num); -void swf_SetSoundDefineMP3(TAG*tag, U8* data, unsigned length, - unsigned SampRate, - unsigned Channels, - unsigned NumFrames); -void swf_SetSoundInfo(TAG*tag, SOUNDINFO*info); - -// swftools.c - -void swf_Optimize(SWF*swf); -U8 swf_isDefiningTag(TAG * t); -U8 swf_isPseudoDefiningTag(TAG * t); -U8 swf_isAllowedSpriteTag(TAG * t); -U8 swf_isImageTag(TAG*tag); -U8 swf_isShapeTag(TAG*tag); -U8 swf_isTextTag(TAG*tag); -U8 swf_isFontTag(TAG*tag); -U8 swf_isPlaceTag(TAG*tag); - -U16 swf_GetDefineID(TAG * t); -SRECT swf_GetDefineBBox(TAG * t); -void swf_SetDefineBBox(TAG * t, SRECT r); - -void swf_SetDefineID(TAG * t, U16 newid); -U16 swf_GetPlaceID(TAG * t); //PLACEOBJECT, PLACEOBJECT2 (sometimes), REMOVEOBJECT -int swf_GetDepth(TAG * t); //PLACEOBJECT,PLACEOBJECT2,REMOVEOBJECT,REMOVEOBJECT2,SETTABINDEX -char* swf_GetName(TAG * t); //PLACEOBJECT2, FRAMELABEL -MATRIX * swf_MatrixJoin(MATRIX * d,MATRIX * s1,MATRIX * s2); -MATRIX * swf_MatrixMapTriangle(MATRIX * m,int dx,int dy, - int x0,int y0,int x1,int y1,int x2,int y2); -int swf_GetNumUsedIDs(TAG * t); -void swf_GetUsedIDs(TAG * t, int * positions); -char swf_Relocate(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[a]==0 means id a is free -void swf_RelocateDepth(SWF*swf, char*bitmap); // bitmap is 65536 bytes, bitmap[d]==0 means depth d is free - -TAG* swf_Concatenate (TAG*list1,TAG*list2); // warning: both list1 and list2 are invalid after this call. - -RGBA swf_GetSWFBackgroundColor(SWF*swf); - -// swfcgi.c - -void swf_uncgi(); // same behaviour as Steven Grimm's uncgi-library - -// as3/abc.c -void*swf_ReadABC(TAG*tag); -void*swf_DumpABC(FILE*fo, void*code, char*prefix); -void swf_WriteABC(TAG*tag, void*code); -void swf_FreeABC(void*code); -void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events); -TAG*swf_AddAS3FontDefine(TAG*tag, U16 id, char*fontname); -#include "as3/compiler.h" -#include "as3/import.h" - -// swfaction.c - -typedef struct _ActionTAG -{ U8 op; - U16 len; - U8 * data; - - struct _ActionTAG * next; - struct _ActionTAG * prev; - - struct _ActionTAG * parent; - U8 tmp[8]; // store small operands here. -} ActionTAG; - -typedef struct _ActionMarker -{ - ActionTAG* atag; -} ActionMarker; - -ActionTAG* swf_ActionGet(TAG*tag); -void swf_ActionFree(ActionTAG*tag); -void swf_ActionSet(TAG*tag, ActionTAG*actions); -void swf_DumpActions(ActionTAG*atag, char*prefix); -void swf_ActionEnumerateURLs(ActionTAG*atag, char*(*callback)(char*)); -void swf_ActionEnumerateTargets(ActionTAG*atag, char*(*callback)(char*)); -void swf_ActionEnumerateStrings(ActionTAG*atag, char*(*callback)(char*)); - -// using action/actioncompiler.h: -ActionTAG* swf_ActionCompile(const char* source, int version); - -#define ACTION__GOTOFRAME 0x81 -#define ACTION__GETURL 0x83 -ActionTAG* action_End(ActionTAG*atag); -ActionTAG* action_NextFrame(ActionTAG*atag); -ActionTAG* action_PreviousFrame(ActionTAG*atag); -ActionTAG* action_Play(ActionTAG*atag); -ActionTAG* action_Stop(ActionTAG*atag); -ActionTAG* action_ToggleQuality(ActionTAG*atag); -ActionTAG* action_StopSounds(ActionTAG*atag); -ActionTAG* action_Add(ActionTAG*atag); -ActionTAG* action_Subtract(ActionTAG*atag); -ActionTAG* action_Multiply(ActionTAG*atag); -ActionTAG* action_Divide(ActionTAG*atag); -ActionTAG* action_Equals(ActionTAG*atag); -ActionTAG* action_Less(ActionTAG*atag); -ActionTAG* action_And(ActionTAG*atag); -ActionTAG* action_Or(ActionTAG*atag); -ActionTAG* action_Not(ActionTAG*atag); -ActionTAG* action_StringEquals(ActionTAG*atag); -ActionTAG* action_StringLength(ActionTAG*atag); -ActionTAG* action_StringExtract(ActionTAG*atag); -ActionTAG* action_Pop(ActionTAG*atag); -ActionTAG* action_ToInteger(ActionTAG*atag); -ActionTAG* action_GetVariable(ActionTAG*atag); -ActionTAG* action_SetVariable(ActionTAG*atag); -ActionTAG* action_SetTarget2(ActionTAG*atag); -ActionTAG* action_StringAdd(ActionTAG*atag); -ActionTAG* action_GetProperty(ActionTAG*atag); -ActionTAG* action_SetProperty(ActionTAG*atag); -ActionTAG* action_CloneSprite(ActionTAG*atag); -ActionTAG* action_RemoveSprite(ActionTAG*atag); -ActionTAG* action_Trace(ActionTAG*atag); -ActionTAG* action_StartDrag(ActionTAG*atag); -ActionTAG* action_EndDrag(ActionTAG*atag); -ActionTAG* action_StringLess(ActionTAG*atag); -ActionTAG* action_RandomNumber(ActionTAG*atag); -ActionTAG* action_MBStringLength(ActionTAG*atag); -ActionTAG* action_CharToAscii(ActionTAG*atag); -ActionTAG* action_AsciiToChar(ActionTAG*atag); -ActionTAG* action_GetTime(ActionTAG*atag); -ActionTAG* action_MBStringExtract(ActionTAG*atag); -ActionTAG* action_MBCharToAscii(ActionTAG*atag); -ActionTAG* action_MBAsciiToChar(ActionTAG*atag); -ActionTAG* action_Delete(ActionTAG*atag); -ActionTAG* action_Delete2(ActionTAG*atag); -ActionTAG* action_DefineLocal(ActionTAG*atag); -ActionTAG* action_CallFunction(ActionTAG*atag); -ActionTAG* action_Return(ActionTAG*atag); -ActionTAG* action_Modulo(ActionTAG*atag); -ActionTAG* action_NewObject(ActionTAG*atag); -ActionTAG* action_DefineLocal2(ActionTAG*atag); -ActionTAG* action_InitArray(ActionTAG*atag); -ActionTAG* action_Makehash(ActionTAG*atag); -ActionTAG* action_TypeOf(ActionTAG*atag); -ActionTAG* action_TargetPath(ActionTAG*atag); -ActionTAG* action_Enumerate(ActionTAG*atag); -ActionTAG* action_Add2(ActionTAG*atag); -ActionTAG* action_Less2(ActionTAG*atag); -ActionTAG* action_Equals2(ActionTAG*atag); -ActionTAG* action_ToNumber(ActionTAG*atag); -ActionTAG* action_ToString(ActionTAG*atag); -ActionTAG* action_PushDuplicate(ActionTAG*atag); -ActionTAG* action_StackSwap(ActionTAG*atag); -ActionTAG* action_GetMember(ActionTAG*atag); -ActionTAG* action_SetMember(ActionTAG*atag); -ActionTAG* action_Increment(ActionTAG*atag); -ActionTAG* action_Decrement(ActionTAG*atag); -ActionTAG* action_CallMethod(ActionTAG*atag); -ActionTAG* action_NewMethod(ActionTAG*atag); -ActionTAG* action_BitAnd(ActionTAG*atag); -ActionTAG* action_BitOr(ActionTAG*atag); -ActionTAG* action_BitXor(ActionTAG*atag); -ActionTAG* action_BitLShift(ActionTAG*atag); -ActionTAG* action_BitRShift(ActionTAG*atag); -ActionTAG* action_BitURShift(ActionTAG*atag); -ActionTAG* action_GotoFrame(ActionTAG*atag, U16 frame); -ActionTAG* action_GetUrl(ActionTAG*atag, const char* url, char* label); -ActionTAG* action_StoreRegister(ActionTAG*atag, U8 reg); -ActionTAG* action_Constantpool(ActionTAG*atag, char* constantpool); -ActionTAG* action_WaitForFrame(ActionTAG*atag, U16 frame, U8 skip); -ActionTAG* action_SetTarget(ActionTAG*atag, const char* target); -ActionTAG* action_GotoLabel(ActionTAG*atag, char* label); -ActionTAG* action_WaitForFrame2(ActionTAG*atag, U8 skip); -ActionTAG* action_With(ActionTAG*atag, char*object); -ActionTAG* action_PushString(ActionTAG*atag, const char*str); -ActionTAG* action_PushFloat(ActionTAG*atag, float f); -ActionTAG* action_PushNULL(ActionTAG*atag); -ActionTAG* action_PushRegister(ActionTAG*atag, U8 reg); -ActionTAG* action_PushBoolean(ActionTAG*atag, char c); -ActionTAG* action_PushDouble(ActionTAG*atag, double d); -ActionTAG* action_PushInt(ActionTAG*atag, int i); -ActionTAG* action_PushLookup(ActionTAG*atag, U8 index); -ActionTAG* action_Jump(ActionTAG*atag, U16 branch); -ActionTAG* action_GetUrl2(ActionTAG*atag, U8 method); -ActionTAG* action_DefineFunction(ActionTAG*atag, U8*data, int len); -ActionTAG* action_If(ActionTAG*atag, U16 branch); -ActionTAG* action_Call(ActionTAG*atag); -ActionTAG* action_GotoFrame2(ActionTAG*atag, U8 method); -ActionMarker action_setMarker(ActionTAG*atag); -void action_fixjump(ActionMarker m1, ActionMarker m2); - -// swfobject.c - -// The following 3 routines only use placeobject2: - -extern char*blendModeNames[]; - -int swf_ObjectPlace(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char* name); -int swf_ObjectPlaceClip(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char* name, U16 clipaction); -int swf_ObjectPlaceBlend(TAG * t,U16 id,U16 depth,MATRIX * m,CXFORM * cx,const char* name, U8 blendmode); -int swf_ObjectMove(TAG * t,U16 depth,MATRIX * m,CXFORM * cx); - -#define PF_MOVE 0x01 -#define PF_CHAR 0x02 -#define PF_MATRIX 0x04 -#define PF_CXFORM 0x08 -#define PF_RATIO 0x10 -#define PF_NAME 0x20 -#define PF_CLIPDEPTH 0x40 -#define PF_ACTIONEVENT 0x80 - -#define PF2_FILTERS 0x01 -#define PF2_BLENDMODE 0x02 -#define PF2_ASBITMAP 0x04 -//... - -#define BLENDMODE_NORMAL 0 -#define BLENDMODE_NORMAL2 1 -#define BLENDMODE_LAYER 2 -#define BLENDMODE_MULTIPLY 3 -#define BLENDMODE_SCREEN 4 -#define BLENDMODE_LIGHTEN 5 -#define BLENDMODE_DARKEN 6 -#define BLENDMODE_ADD 7 -#define BLENDMODE_SUBSTRACT 8 -#define BLENDMODE_DIFFERENCE 9 -#define BLENDMODE_INVERT 10 -#define BLENDMODE_ALPHA 11 -#define BLENDMODE_ERASE 12 -#define BLENDMODE_OVERLAY 13 -#define BLENDMODE_HARDLIGHT 14 - -typedef struct _SWFPLACEOBJECT { - U8 flags; - U16 depth; - U16 id; // may be 0 - char move; //true: move/replace character, false: set character - MATRIX matrix; - CXFORM cxform; - U16 ratio; - char*name; - U16 clipdepth; - ActionTAG* actions; - U8 blendmode; - FILTERLIST*filters; -} SWFPLACEOBJECT; - -void swf_SetPlaceObject(TAG * t,SWFPLACEOBJECT* obj); -void swf_GetPlaceObject(TAG * t,SWFPLACEOBJECT* obj); -void swf_PlaceObjectFree(SWFPLACEOBJECT* obj); - -// swfvideo.c - -typedef struct _VIDEOSTREAM -{ - int width; - int height; - int linex; - - int owidth; - int oheight; - int olinex; - - int frame; - YUV*oldpic; - YUV*current; - int bbx; - int bby; - int*mvdx; - int*mvdy; - int quant; - - /* modifyable: */ - int do_motion; //enable motion compensation (slow!) - -} VIDEOSTREAM; - -void swf_SetVideoStreamDefine(TAG*tag, VIDEOSTREAM*stream, U16 frames, U16 width, U16 height); -void swf_SetVideoStreamIFrame(TAG*tag, VIDEOSTREAM*s, RGBA*pic, int quant/* 1-31, 1=best quality, 31=best compression*/); -void swf_SetVideoStreamBlackFrame(TAG*tag, VIDEOSTREAM*s); -void swf_SetVideoStreamPFrame(TAG*tag, VIDEOSTREAM*s, RGBA*pic, int quant/* 1-31, 1=best quality, 31=best compression*/); -void swf_SetVideoStreamMover(TAG*tag, VIDEOSTREAM*s, signed char* movex, signed char* movey, void** image, int quant); -void swf_VideoStreamClear(VIDEOSTREAM*stream); - -// swfbutton.c - -// Button States - -#define BS_HIT 0x08 -#define BS_DOWN 0x04 -#define BS_OVER 0x02 -#define BS_UP 0x01 - -// Button Conditions - -/* missing: IDLE_OUTDOWN - OUTDOWN_OVERUP - OVERUP_OUTDOWN -*/ -#define BC_OVERDOWN_IDLE 0x0100 -#define BC_IDLE_OVERDOWN 0x0080 -#define BC_OUTDOWN_IDLE 0x0040 -#define BC_OUTDOWN_OVERDOWN 0x0020 -#define BC_OVERDOWN_OUTDOWN 0x0010 -#define BC_OVERDOWN_OVERUP 0x0008 -#define BC_OVERUP_OVERDOWN 0x0004 -#define BC_OVERUP_IDLE 0x0002 -#define BC_IDLE_OVERUP 0x0001 - -#define BC_KEY(c) (c<<9) - -#define BC_CURSORLEFT 0x0200 -#define BC_CURSORRIGHT 0x0400 -#define BC_POS1 0x0600 -#define BC_END 0x0800 -#define BC_INSERT 0x0a00 -#define BC_DELETE 0x0c00 -#define BC_CLEAR 0x0e00 -#define BC_BACKSPACE 0x1000 -#define BC_ENTER 0x1a00 -#define BC_CURSORUP 0x1c00 -#define BC_CURSORDOWN 0x1e00 -#define BC_PAGEUP 0x2000 -#define BC_PAGEDOWN 0x2200 -#define BC_TAB 0x2400 -#define BC_ESCAPE 0x3600 -#define BC_SPACE 0x4000 - -/* these are probably only valid with linux: - Ctrl-A 0x0200 - Ctrl-X 0x3000 - Ctrl-Y 0x3200 - Ctrl-Z 0x3400 - Escape/Ctrl-[ 0x3600 - Ctrl-\ 0x3800 - Ctrl-] 0x3a00 - Ctrl-^ 0x3c00 - Ctrl-/ 0x3e00 - */ - -/* everything above 0x4000 is standard ascii: - 0x4000 ' ' 0x4200 '!' 0x4600 '#' 0x4800 '$' 0x4a00 '%' 0x4c00 '&' ... - 0x6000 '0' ... 0x7200 '9' - 0x8000 '@' - 0x8200 'A' ... 0xb400 'Z' - ... - 0xfc00 '~' - */ - -// Button Flag - -#define BF_TRACKMENU 0x01 - -int swf_ButtonSetRecord(TAG * t,U8 state,U16 id,U16 layer,MATRIX * m,CXFORM * cx); -int swf_ButtonSetCondition(TAG * t,U16 condition); // for DefineButton2 -int swf_ButtonSetFlags(TAG * t,U8 flags); // necessary for DefineButton2 -int swf_ButtonPostProcess(TAG * t,int anz_action); // Set all offsets in DefineButton2-Tags (how many conditions to process) -ActionTAG* swf_ButtonGetAction(TAG*t); - -// swfrender.c - -typedef struct RENDERBUF -{ - int width; - int height; - int posx,posy; - void*internal; -} RENDERBUF; - -void swf_Render_Init(RENDERBUF*buf, int posx, int posy, int width, int height, int antialize, int multiply); -void swf_Render_SetBackground(RENDERBUF*buf, RGBA*img, int width, int height); -void swf_Render_SetBackgroundColor(RENDERBUF*buf, RGBA color); -RGBA* swf_Render(RENDERBUF*dest); -void swf_RenderShape(RENDERBUF*dest, SHAPE2*shape, MATRIX*m, CXFORM*c, U16 depth,U16 clipdepth); -void swf_RenderSWF(RENDERBUF*buf, SWF*swf); -void swf_Render_AddImage(RENDERBUF*buf, U16 id, RGBA*img, int width, int height); /* img is non-premultiplied */ -void swf_Render_ClearCanvas(RENDERBUF*dest); -void swf_Render_Delete(RENDERBUF*dest); - -// swffilter.c - -#define FILTERTYPE_DROPSHADOW 0 -#define FILTERTYPE_BLUR 1 -#define FILTERTYPE_GLOW 2 -#define FILTERTYPE_BEVEL 3 -#define FILTERTYPE_GRADIENTGLOW 4 -#define FILTERTYPE_CONVOLUTION 5 -#define FILTERTYPE_COLORMATRIX 6 -#define FILTERTYPE_GRADIENTBEVEL 7 - -extern char*filtername[]; - -typedef struct _FILTER_GRADIENTGLOW { - U8 type; - GRADIENT*gradient; - double blurx; - double blury; - double angle; - double distance; - float strength; - char innershadow; - char knockout; - char composite; - char ontop; - int passes; -} FILTER_GRADIENTGLOW; - -typedef struct _FILTER_DROPSHADOW { - U8 type; - RGBA color; - double blurx; - double blury; - double angle; - double distance; - float strength; - char innershadow; - char knockout; - char composite; - int passes; -} FILTER_DROPSHADOW; - -typedef struct _FILTER_BEVEL { - U8 type; - RGBA shadow; - RGBA highlight; - double blurx; - double blury; - double angle; - double distance; - float strength; - char innershadow; - char knockout; - char composite; - char ontop; - int passes; -} FILTER_BEVEL; - -typedef struct _FILTER_BLUR { - U8 type; - double blurx; - double blury; - int passes; -} FILTER_BLUR; - -typedef struct _FILTER_GLOW { - U8 type; - RGBA rgba; - double blurx; - double blury; - double strength; - int passes; - char innerglow; - char knockout; - char composite; -} FILTER_GLOW; - -void swf_SetFilter(TAG*tag, FILTER*f); -FILTER*swf_GetFilter(TAG*tag); -FILTER*swf_NewFilter(U8 type); -void swf_DeleteFilter(FILTER*f); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/ttf.c b/fluidbook/tools/swftools-special-swfdump/lib/ttf.c deleted file mode 100644 index 0e22cb08f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/ttf.c +++ /dev/null @@ -1,2470 +0,0 @@ -/* ttf.c - Parser and writer for truetype font files. - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include "log.h" -#include "os.h" -#include "q.h" -#include "mem.h" -#include "ttf.h" - -#define TTCFTAG 0x74746366 - -#define OPENTYPE 0x4f54544f -#define TRUETYPE_MACOS 0x74727565 -#define VERSION_1_0 0x00010000 - -#define TAG_OS2 0x4f532f32 -#define TAG_CMAP 0x636d6170 -#define TAG_GLYF 0x676c7966 //required for non opentype -#define TAG_HEAD 0x68656164 //required -#define TAG_HHEA 0x68686561 //required -#define TAG_HMTX 0x686d7478 //required -#define TAG_VHEA 0x86686561 -#define TAG_VMTX 0x866d7478 -#define TAG_KERN 0x6b65726e -#define TAG_LOCA 0x6c6f6361 //required for non opentype -#define TAG_MAXP 0x6d617870 //required -#define TAG_NAME 0x6e616d65 -#define TAG_POST 0x706f7374 -#define TAG_CFF 0x43464620 //required for opentype -#define TAG_CVT 0x63767420 -#define TAG_FPGM 0x6670676d -#define TAG_GASP 0x67617370 -#define TAG_PREP 0x70726570 - - -static U32 checksum_block(U8*_data, int len) -{ - U32 sum = 0; - U8*data = (U8*)_data; - - int pos; - int len_minus_4 = len-4; - for(pos=0;pos<=len_minus_4;pos+=4) { - sum += data[pos]<<24|data[pos+1]<<16|data[pos+2]<<8|data[pos+3]; - } - int left = len-pos; - if(left == 1) sum+= data[pos+0]<<24; - if(left == 2) sum+= data[pos+0]<<24|data[pos+1]<<16; - if(left == 3) sum+= data[pos+0]<<24|data[pos+1]<<16|data[pos+2]<<8; - return sum; -} - -typedef struct _memreader { - U8*mem; - int pos; - int size; -} memreader_t; - -static U8 readU8(memreader_t*r) -{ - return r->mem[r->pos++]; -} -static inline U16 readU16(memreader_t*r) -{ - if(r->pos+2>r->size) return 0; - U16 val = r->mem[r->pos]<<8| - r->mem[r->pos+1]; - r->pos += 2; - return val; -} -static S16 readS16(memreader_t*r) -{ - return (S16)readU16(r); -} -static U32 readU32(memreader_t*r) -{ - if(r->pos+4>r->size) return 0; - U32 val = r->mem[r->pos]<<24| - r->mem[r->pos+1]<<16| - r->mem[r->pos+2]<<8| - r->mem[r->pos+3]; - r->pos += 4; - return val; -} -static void readBlock(memreader_t*r, void*dest, int len) -{ - int remaining = r->size-r->pos; - if(len > remaining) { - memcpy(dest, r->mem+r->pos, remaining); - memset(dest+remaining, 0, len - remaining); - r->pos += remaining; - } else { - memcpy(dest, r->mem+r->pos, len); - r->pos += len; - } -} -static void reader_reset(memreader_t*r) -{ - r->pos; -} -#define INIT_READ(r,data,length,pos) memreader_t r = {(data),(pos),(length)}; - -static void expand(ttf_table_t*w, int newsize) -{ - int v1 = (newsize+63)&~63; - int v2 = w->len + w->len / 2; - w->memsize = v1>v2?v1:v2; - w->data = rfx_realloc(w->data, w->memsize); -} -static inline void writeU8(ttf_table_t*w, unsigned char b) -{ - if(w->memsizelen+1) - expand(w, w->len+1); - w->data[w->len++] = b; -} -static inline void writeU16(ttf_table_t*w, unsigned short v) -{ - if(w->memsizelen+2) - expand(w, w->len+2); - w->data[w->len++] = v>>8; - w->data[w->len++] = v; -} -static inline void writeU16_LE(ttf_table_t*w, unsigned short v) -{ - if(w->memsizelen+2) - expand(w, w->len+2); - w->data[w->len++] = v; - w->data[w->len++] = v>>8; -} -#define writeS16 writeU16 -static inline void writeU32(ttf_table_t*w, unsigned long v) -{ - if(w->memsizelen+4) - expand(w, w->len+4); - w->data[w->len++] = v>>24; - w->data[w->len++] = v>>16; - w->data[w->len++] = v>>8; - w->data[w->len++] = v; -} -static inline void writeU32_LE(ttf_table_t*w, unsigned long v) -{ - if(w->memsizelen+4) - expand(w, w->len+4); - w->data[w->len++] = v; - w->data[w->len++] = v>>8; - w->data[w->len++] = v>>16; - w->data[w->len++] = v>>24; -} -static inline void writeBlock(ttf_table_t*w, void*data, int len) -{ - if(w->memsizelen+len) - expand(w, w->len+len); - memcpy(w->data+w->len, data, len); - w->len += len; -} - -ttf_table_t*ttf_table_new(U32 id) -{ - ttf_table_t*t = rfx_calloc(sizeof(ttf_table_t)); - t->id = id; - return t; -} - -ttf_table_t*ttf_addtable(ttf_t*ttf, U32 id) -{ - ttf_table_t*t = ttf_table_new(id); - - ttf_table_t*before,*after=0; - for(before=ttf->tables; before&&before->idnext) { - after=before; - } - if(before && before->id == id) { - msg(" Error: duplicate table %08x", id); - free(before->data); - before->data = 0; - before->len = 0; - return before; - } - - if(!after) { - t->next = ttf->tables; - ttf->tables = t; - } else { - t->prev = after; - t->next = after->next; - after->next = t; - } - if(t->next) - t->next->prev = t; - return t; -} -ttf_table_t*ttf_find_table(ttf_t*ttf, U32 id) -{ - ttf_table_t*table = ttf->tables; - while(table) { - if(table->id == id) - return table; - table = table->next; - } - return 0; -} -void ttf_table_delete(ttf_t*ttf, ttf_table_t*table) -{ - if(ttf && ttf->tables == table) { - ttf->tables = table->next; - } - if(table->prev) - table->prev->next = table->next; - if(table->next) - table->next->prev = table->prev; - free(table->data); - free(table); -} -U32 ttf_table_checksum(ttf_table_t*t) -{ - U32 checksum = checksum_block(t->data, t->len); - if(t->id==TAG_HEAD && t->len>=12) { - /* the checksum for the HEAD table is calculated by masking out - the checksumadjust field */ - U32 adjust = t->data[8]<<24|t->data[9]<<16|t->data[10]<<8|t->data[11]; - checksum -= adjust; - } - return checksum; -} -static U8 printable(U8 a) -{ - if(a<32 || a==127) return '.'; - else return a; -} -static void hexdump(U8*data, int len, const char*prefix) -{ - int t; - char ascii[32]; - printf("%s -=> ",prefix); - for(t=0;t ",ascii,prefix); - } - } -} -static void ttf_table_dump(ttf_table_t*t, const char*prefix) -{ - if(!t) return; - hexdump(t->data, t->len, prefix); -} - -static table_head_t*head_new(ttf_t*ttf) -{ - table_head_t*head = rfx_calloc(sizeof(table_head_t)); - head->units_per_em = 1024; - int t; - if(ttf->num_glyphs) { - head->xmin = ttf->glyphs[0].xmin; - head->ymin = ttf->glyphs[0].ymin; - head->xmax = ttf->glyphs[0].xmax; - head->ymax = ttf->glyphs[0].ymax; - for(t=1;tnum_glyphs;t++) { - if(ttf->glyphs[t].xmin < head->xmin) head->xmin = ttf->glyphs[t].xmin; - if(ttf->glyphs[t].ymin < head->ymin) head->ymin = ttf->glyphs[t].ymin; - if(ttf->glyphs[t].xmax > head->xmax) head->xmax = ttf->glyphs[t].xmax; - if(ttf->glyphs[t].ymax > head->ymax) head->ymax = ttf->glyphs[t].ymax; - } - } - head->macStyle = 0; - head->lowest_readable_size = 8; // not sure what font renderers actually do with this - head->dir_hint = 0; - return head; -} -static int head_parse(ttf_t*ttf, memreader_t*r) -{ - ttf->head = rfx_calloc(sizeof(table_head_t)); - U32 version = readU32(r); - if(version!=VERSION_1_0) - msg(" Font HEAD has unknown version %08x", version); - U32 revision = readU32(r); - U32 checksum2 = readU32(r); - U32 magic = readU32(r); - if(magic!=0x5f0f3cf5) - msg(" Font HEAD has unknown magic number %08x", magic); - ttf->head->flags = readU16(r); - ttf->head->units_per_em = readU16(r); - readU32(r);readU32(r); //created - readU32(r);readU32(r); //modified - ttf->head->xmin = readU16(r); - ttf->head->ymin = readU16(r); - ttf->head->xmax = readU16(r); - ttf->head->ymax = readU16(r); - ttf->head->macStyle = readU16(r); - ttf->head->lowest_readable_size = readU16(r); //in pixels - ttf->head->dir_hint = readS16(r); - int loc_index = readS16(r); //used in 'loca' table - if(loc_index>1) - msg(" loca index format %d unknown", loc_index); - U16 glyph_data_format = readS16(r); - if(glyph_data_format!=0) - msg(" Font glyph data format unknown: %04x", glyph_data_format); - if(r->pos < r->size) { - msg(" Leftover bytes (%d) in HEAD tag", r->size - r->pos); - } - return loc_index; -} -static void head_write(ttf_t*ttf, ttf_table_t*w, int loca_size) -{ - writeU32(w, 0x10000); - writeU32(w, 0x10000); - writeU32(w, 0); //checksum - writeU32(w, 0x5f0f3cf5); //magic - writeU16(w, ttf->head->flags); - writeU16(w, ttf->head->units_per_em); - writeU32(w, 0);writeU32(w, 0); //created - writeU32(w, 0);writeU32(w, 0); //modified - writeU16(w, ttf->head->xmin); - writeU16(w, ttf->head->ymin); - writeU16(w, ttf->head->xmax); - writeU16(w, ttf->head->ymax); - writeU16(w, ttf->head->macStyle); - writeU16(w, ttf->head->lowest_readable_size); - writeS16(w, ttf->head->dir_hint); - writeS16(w, loca_size); //loca index size (32 bit) - writeS16(w, 0); //glyph data format -} -static void head_dump(ttf_t*ttf) -{ - printf("head->flags: %d\n", ttf->head->flags); - printf("head->units_per_em: %d\n", ttf->head->units_per_em); - printf("head->xmin: %d\n", ttf->head->xmin); - printf("head->ymin: %d\n", ttf->head->ymin); - printf("head->xmax: %d\n", ttf->head->xmax); - printf("head->ymax: %d\n", ttf->head->ymax); - printf("head->macStyle: %d\n", ttf->head->macStyle); - printf("head->lowest_readable_size: %d\n", ttf->head->lowest_readable_size); - printf("head->dir_hint: %d\n", ttf->head->dir_hint); -} -static void head_delete(ttf_t*ttf) -{ - if(ttf->head) { - free(ttf->head); - ttf->head=0; - } -} - -static table_os2_t*os2_new(ttf_t*ttf) -{ - table_os2_t*os2 = rfx_calloc(sizeof(table_os2_t)); - if(ttf->num_glyphs) { - int average_width=0; - int t; - for(t=0;tnum_glyphs;t++) { - average_width += (ttf->glyphs[t].advance + ttf->glyphs[t].bearing); - } - os2->xAvgCharWidth = average_width / ttf->num_glyphs; - } - - /* that's what everybody seems to fill in */ - os2->usWeightClass = 400; - os2->usWidthClass = 5; - - if(ttf->head) { - int advance = (ttf->head->xmax - ttf->head->xmin)/2; - int height = (ttf->head->xmax - ttf->head->xmin); - int ymid = height/2; - /* I do believe a sane font rendering engine will actually use - the font advance here- the subscript/superscript position will - not be the same for each glyph */ - os2->ySuperscriptXSize = os2->ySubscriptXSize = (ttf->head->xmax - ttf->head->xmin)/2; - os2->ySuperscriptYSize = os2->ySubscriptYSize = (ttf->head->ymax - ttf->head->ymin)/2; - os2->ySubscriptXOffset = advance; - os2->ySubscriptYOffset = 0; - os2->ySuperscriptXOffset = advance; - os2->ySuperscriptYOffset = (ttf->head->ymax - ttf->head->ymin)/2; - os2->yStrikeoutSize = ttf->head->units_per_em / 10; - os2->yStrikeoutPosition = ymid; - os2->usWinAscent = ttf->ascent; - os2->usWinDescent = ttf->descent>0?0:-ttf->descent; - os2->sxHeight = ymid; - os2->sCapHeight = height*2/3; - } - os2->panose_Weight = 4; - - /* strictly speaking we'd have to set 92/64 bits in these tables, depending on - what parts of the unicode table is filled. (e.g. bit 90 = tibetan). */ - os2->ulCharRange[0] = 1; - os2->ulCharRange[1] = 0; - os2->ulCharRange[2] = 0; - os2->ulCharRange[3] = 0; - os2->ulCodePageRange1 = 1; - os2->ulCodePageRange2 = 0; - - if(ttf->unicode_size) { - int min,max; - for(min=0;minunicode_size;min++) - if(ttf->unicode[min]) break; - for(max=ttf->unicode_size-1;max>=0;max--) - if(ttf->unicode[max]) break; - if(min<=max) { - os2->fsFirstCharIndex = min; - os2->fsLastCharIndex = max; - } - } - os2->sTypoAscender = ttf->ascent; - os2->sTypoDescender = ttf->descent; - os2->sTypoLineGap = ttf->lineGap; - - os2->usDefaultChar = 0; - os2->usBreakChar = (ttf->unicode_size>0x20 && ttf->unicode[0x20])?0x20:0; - os2->usMaxContext = 0; // we don't use ligatures yet - return os2; -} -static table_os2_t*os2_parse(memreader_t*r) -{ - table_os2_t*os2 = rfx_calloc(sizeof(table_os2_t)); - U16 version = readU16(r); - /* 0 = TrueType 1.5 - 1 = TrueType 1.66 - 2 = OpenType 1.2 - 3 = OpenType 1.4 */ - if(version!=0 && version!=1 && version!=2 && version!=3) - msg(" Unknown OS2 version: %04x", version); - os2->xAvgCharWidth = readS16(r); - os2->usWeightClass = readU16(r); - os2->usWidthClass = readU16(r); - readU16(r); //fstype - os2->ySubscriptXSize = readU16(r); - os2->ySubscriptYSize = readU16(r); - os2->ySubscriptXOffset = readU16(r); - os2->ySubscriptYOffset = readU16(r); - os2->ySuperscriptXSize = readU16(r); - os2->ySuperscriptYSize = readU16(r); - os2->ySuperscriptXOffset = readU16(r); - os2->ySuperscriptYOffset = readU16(r); - os2->yStrikeoutSize = readU16(r); - os2->yStrikeoutPosition = readU16(r); - os2->sFamilyClass = readU16(r); - os2->panose_FamilyType = readU8(r); - os2->panose_SerifStyle = readU8(r); - os2->panose_Weight = readU8(r); - os2->panose_Proportion = readU8(r); - os2->panose_Contrast = readU8(r); - os2->panose_StrokeVariation = readU8(r); - os2->panose_ArmStyle = readU8(r); - os2->panose_Letterform = readU8(r); - os2->panose_Midline = readU8(r); - os2->panose_XHeight = readU8(r); - os2->ulCharRange[0] = readU32(r); - os2->ulCharRange[1] = readU32(r); - os2->ulCharRange[2] = readU32(r); - os2->ulCharRange[3] = readU32(r); - readU32(r); //vendor - os2->fsSelection = readU16(r); - os2->fsFirstCharIndex = readU16(r); - os2->fsLastCharIndex = readU16(r); - os2->sTypoAscender = readS16(r); - os2->sTypoDescender = readS16(r); - os2->sTypoLineGap = readS16(r); - os2->usWinAscent = readU16(r); - os2->usWinDescent = readU16(r); - if(version<1) return os2; - os2->ulCodePageRange1 = readU32(r); - os2->ulCodePageRange2 = readU32(r); - if(version<2) return os2; - os2->sxHeight = readS16(r); - os2->sCapHeight = readS16(r); - os2->usDefaultChar = readU16(r); - os2->usBreakChar = readU16(r); - os2->usMaxContext = readU16(r); - - if(r->pos < r->size) { - msg(" Leftover bytes (%d) in OS2 tag", r->size - r->pos); - } - return os2; -} -static void os2_write(ttf_t*ttf, ttf_table_t*w) -{ - table_os2_t*os2 = ttf->os2; - U16 version=1; - if(os2->sxHeight|os2->sCapHeight|os2->usDefaultChar|os2->usBreakChar|os2->usMaxContext) { - version=2; - } - writeU16(w, version); - writeS16(w, os2->xAvgCharWidth); - writeU16(w, os2->usWeightClass); - writeU16(w, os2->usWidthClass); - writeU16(w, 0); //fstype - writeU16(w, os2->ySubscriptXSize); - writeU16(w, os2->ySubscriptYSize); - writeU16(w, os2->ySubscriptXOffset); - writeU16(w, os2->ySubscriptYOffset); - writeU16(w, os2->ySuperscriptXSize); - writeU16(w, os2->ySuperscriptYSize); - writeU16(w, os2->ySuperscriptXOffset); - writeU16(w, os2->ySuperscriptYOffset); - writeU16(w, os2->yStrikeoutSize); - writeU16(w, os2->yStrikeoutPosition); - writeU16(w, os2->sFamilyClass); - writeU8(w, os2->panose_FamilyType); - writeU8(w, os2->panose_SerifStyle); - writeU8(w, os2->panose_Weight); - writeU8(w, os2->panose_Proportion); - writeU8(w, os2->panose_Contrast); - writeU8(w, os2->panose_StrokeVariation); - writeU8(w, os2->panose_ArmStyle); - writeU8(w, os2->panose_Letterform); - writeU8(w, os2->panose_Midline); - writeU8(w, os2->panose_XHeight); - writeU32(w, os2->ulCharRange[0]); - writeU32(w, os2->ulCharRange[1]); - writeU32(w, os2->ulCharRange[2]); - writeU32(w, os2->ulCharRange[3]); - writeU32(w, 0x53434244); //vendor - writeU16(w, os2->fsSelection); - writeU16(w, os2->fsFirstCharIndex); - writeU16(w, os2->fsLastCharIndex); - writeS16(w, os2->sTypoAscender); - writeS16(w, os2->sTypoDescender); - writeS16(w, os2->sTypoLineGap); - writeU16(w, os2->usWinAscent); - writeU16(w, os2->usWinDescent); - if(version<1) return; - writeU32(w, os2->ulCodePageRange1); - writeU32(w, os2->ulCodePageRange2); - if(version<2) return; - writeS16(w, os2->sxHeight); - writeS16(w, os2->sCapHeight); - writeU16(w, os2->usDefaultChar); - writeU16(w, os2->usBreakChar); - writeU16(w, os2->usMaxContext); -} -static void os2_dump(ttf_t*ttf) -{ - table_os2_t*os2 = ttf->os2; - if(!os2) return; - printf("os2->xAvgCharWidth: %d\n", os2->xAvgCharWidth); - printf("os2->usWeightClass: %d\n", os2->usWeightClass); - printf("os2->usWidthClass: %d\n", os2->usWidthClass); - printf("os2->ySubscriptXSize: %d\n", os2->ySubscriptXSize); - printf("os2->ySubscriptYSize: %d\n", os2->ySubscriptYSize); - printf("os2->ySubscriptXOffset: %d\n", os2->ySubscriptXOffset); - printf("os2->ySubscriptYOffset: %d\n", os2->ySubscriptYOffset); - printf("os2->ySuperscriptXSize: %d\n", os2->ySuperscriptXSize); - printf("os2->ySuperscriptYSize: %d\n", os2->ySuperscriptYSize); - printf("os2->ySuperscriptXOffset: %d\n", os2->ySuperscriptXOffset); - printf("os2->ySuperscriptYOffset: %d\n", os2->ySuperscriptYOffset); - printf("os2->yStrikeoutSize: %d\n", os2->yStrikeoutSize); - printf("os2->yStrikeoutPosition: %d\n", os2->yStrikeoutPosition); - printf("os2->sFamilyClass: %d\n", os2->sFamilyClass); - printf("os2->panose_FamilyType: %d\n", os2->panose_FamilyType); - printf("os2->panose_SerifStyle: %d\n", os2->panose_SerifStyle); - printf("os2->panose_Weight: %d\n", os2->panose_Weight); - printf("os2->panose_Proportion: %d\n", os2->panose_Proportion); - printf("os2->panose_Contrast: %d\n", os2->panose_Contrast); - printf("os2->panose_StrokeVariation: %d\n", os2->panose_StrokeVariation); - printf("os2->panose_ArmStyle: %d\n", os2->panose_ArmStyle); - printf("os2->panose_Letterform: %d\n", os2->panose_Letterform); - printf("os2->panose_Midline: %d\n", os2->panose_Midline); - printf("os2->panose_XHeight: %d\n", os2->panose_XHeight); - printf("os2->ulCharRange[0]: %d\n", os2->ulCharRange[0]); - printf("os2->ulCharRange[1]: %d\n", os2->ulCharRange[1]); - printf("os2->ulCharRange[2]: %d\n", os2->ulCharRange[2]); - printf("os2->ulCharRange[3]: %d\n", os2->ulCharRange[3]); - printf("os2->fsSelection: %d\n", os2->fsSelection); - printf("os2->fsFirstCharIndex: %d\n", os2->fsFirstCharIndex); - printf("os2->fsLastCharIndex: %d\n", os2->fsLastCharIndex); - printf("os2->sTypoAscender: %d\n", os2->sTypoAscender); - printf("os2->sTypoDescender: %d\n", os2->sTypoDescender); - printf("os2->sTypoLineGap: %d\n", os2->sTypoLineGap); - printf("os2->usWinAscent: %d\n", os2->usWinAscent); - printf("os2->usWinDescent: %d\n", os2->usWinDescent); - printf("os2->ulCodePageRange1: %d\n", os2->ulCodePageRange1); - printf("os2->ulCodePageRange2: %d\n", os2->ulCodePageRange2); - printf("os2->sxHeight: %d\n", os2->sxHeight); - printf("os2->sCapHeight: %d\n", os2->sCapHeight); - printf("os2->usDefaultChar: %d\n", os2->usDefaultChar); - printf("os2->usBreakChar: %d\n", os2->usBreakChar); - printf("os2->usMaxContext: %d\n", os2->usMaxContext); -} -static void os2_delete(ttf_t*ttf) -{ - if(ttf->os2) - free(ttf->os2); - ttf->os2=0; -} - -static table_maxp_t*maxp_new(ttf_t*ttf) -{ - table_maxp_t*maxp = rfx_calloc(sizeof(table_maxp_t)); - int t; - maxp->maxContours=1; - if(ttf->num_glyphs) { - int max = 1; - for(t=0;tnum_glyphs;t++) { - if(ttf->glyphs[t].num_points>max) - max = ttf->glyphs[t].num_points; - int contours = 0; - int s; - for(s=0;sglyphs[t].num_points;s++) { - if(ttf->glyphs[t].points[s].flags&GLYPH_CONTOUR_END) - contours++; - } - if(maxp->maxContours < contours) - maxp->maxContours = contours; - } - maxp->maxPoints = max; - - /* we don't generate composite glyphs yet */ - maxp->maxComponentPoints = 0; - maxp->maxComponentContours = 0; - } - maxp->maxZones = 2; // we don't use the Z0 zone - return maxp; -} -static table_maxp_t* maxp_parse(ttf_t*ttf, memreader_t*r) -{ - U32 version = readU32(r); - ttf->num_glyphs = readU16(r); - /* according to freetype, older fonts (version<0x10000) - apparently only contain the number of glyphs. this is - rather rare, though. */ - if(version<0x10000 && r->size==6) return 0; - - if(r->size<32) - msg(" Truncated maxp table (version %d)", version); - - table_maxp_t*maxp = rfx_calloc(sizeof(table_maxp_t)); - maxp->maxPoints = readU16(r); - maxp->maxContours = readU16(r); - maxp->maxComponentPoints = readU16(r); - maxp->maxComponentContours = readU16(r); - maxp->maxZones = readU16(r); - maxp->maxTwilightPoints = readU16(r); - maxp->maxStorage = readU16(r); - maxp->maxFunctionDefs = readU16(r); - maxp->maxInstructionDefs = readU16(r); - maxp->maxStackElements = readU16(r); - maxp->maxSizeOfInstructions = readU16(r); - maxp->maxComponentElements = readU16(r); - maxp->maxComponentDepth = readU16(r); - return maxp; -} -static void maxp_write(ttf_t*ttf, ttf_table_t*w) -{ - table_maxp_t*maxp = ttf->maxp; - if(!maxp) { - /* version 0.5 simplified maxp table */ - writeU32(w, 0x00005000); - writeU16(w, ttf->num_glyphs); - return; - } - writeU32(w, 0x10000); //version - writeU16(w, ttf->num_glyphs); - writeU16(w, maxp->maxPoints); - writeU16(w, maxp->maxContours); - writeU16(w, maxp->maxComponentPoints); - writeU16(w, maxp->maxComponentContours); - writeU16(w, maxp->maxZones); - writeU16(w, maxp->maxTwilightPoints); - writeU16(w, maxp->maxStorage); - writeU16(w, maxp->maxFunctionDefs); - writeU16(w, maxp->maxInstructionDefs); - writeU16(w, maxp->maxStackElements); - writeU16(w, maxp->maxSizeOfInstructions); - writeU16(w, maxp->maxComponentElements); - writeU16(w, maxp->maxComponentDepth); -} -static void maxp_dump(ttf_t*ttf) -{ - table_maxp_t*maxp = ttf->maxp; - if(!maxp) return; - printf("maxp->maxPoints: %d\n", maxp->maxPoints); - printf("maxp->maxContours: %d\n", maxp->maxContours); - printf("maxp->maxComponentPoints: %d\n", maxp->maxComponentPoints); - printf("maxp->maxComponentContours: %d\n", maxp->maxComponentContours); - printf("maxp->maxZones: %d\n", maxp->maxZones); - printf("maxp->maxTwilightPoints: %d\n", maxp->maxTwilightPoints); - printf("maxp->maxStorage: %d\n", maxp->maxStorage); - printf("maxp->maxFunctionDefs: %d\n", maxp->maxFunctionDefs); - printf("maxp->maxInstructionDefs: %d\n", maxp->maxInstructionDefs); - printf("maxp->maxStackElements: %d\n", maxp->maxStackElements); - printf("maxp->maxSizeOfInstructions: %d\n", maxp->maxSizeOfInstructions); - printf("maxp->maxComponentElements: %d\n", maxp->maxComponentElements); - printf("maxp->maxComponentDepth: %d\n", maxp->maxComponentDepth); -} -static void maxp_delete(ttf_t*ttf) -{ - if(ttf->maxp) - free(ttf->maxp); - ttf->maxp=0; -} - -static table_hea_t*hea_new(ttf_t*ttf) -{ - table_hea_t*hea = rfx_calloc(sizeof(table_hea_t)); - if(ttf->num_glyphs) { - int t; - for(t=0;tnum_glyphs;t++) { - if(ttf->glyphs[t].advance > hea->advanceWidthMax) - hea->advanceWidthMax = ttf->glyphs[t].advance; - if(ttf->glyphs[t].bearing < hea->minLeftSideBearing) - hea->minLeftSideBearing = ttf->glyphs[t].bearing; - if(ttf->glyphs[t].xmax < hea->minRightSideBearing) - hea->minRightSideBearing = ttf->glyphs[t].xmax; - int width = ttf->glyphs[t].xmax - ttf->glyphs[t].xmin; - if(width > hea->xMaxExtent) - hea->xMaxExtent = width; - } - hea->caretSlopeRise = 1; - } - return hea; -} -static int hea_parse(memreader_t*r, ttf_t*ttf) -{ - table_hea_t*hea = ttf->hea = rfx_calloc(sizeof(table_hea_t)); - U32 version = readU32(r); - ttf->ascent = readS16(r); - ttf->descent = readS16(r); - ttf->lineGap = readS16(r); - hea->advanceWidthMax = readU16(r); - hea->minLeftSideBearing = readS16(r); - hea->minRightSideBearing = readS16(r); - hea->xMaxExtent = readS16(r); - hea->caretSlopeRise = readS16(r); - hea->caretSlopeRun = readS16(r); - hea->caretOffset = readS16(r); - readS16(r); //reserved[0] - readS16(r); //reserved[1] - readS16(r); //reserved[2] - readS16(r); //reserved[3] - S16 metricDataFormat = readS16(r); //should be 0 - if(metricDataFormat!=0) { - msg(" Unknown metric format %d", metricDataFormat); - } - int num_advances = readU16(r); - if(num_advances > ttf->num_glyphs) { - msg(" bad number of horizontal metrics: %d", num_advances); - num_advances = ttf->num_glyphs; - } - return num_advances; -} -static table_hea_t*hea_write(ttf_t*ttf, ttf_table_t*w, int num_advances) -{ - table_hea_t*hea = ttf->hea; - writeU32(w, 0x00010000); - writeS16(w, ttf->ascent); - writeS16(w, ttf->descent); - writeS16(w, ttf->lineGap); - writeU16(w, hea->advanceWidthMax); - writeS16(w, hea->minLeftSideBearing); - writeS16(w, hea->minRightSideBearing); - writeS16(w, hea->xMaxExtent); - writeS16(w, hea->caretSlopeRise); - writeS16(w, hea->caretSlopeRun); - writeS16(w, hea->caretOffset); - writeS16(w, 0); //reserved - writeS16(w, 0); //reserved - writeS16(w, 0); //reserved - writeS16(w, 0); //reserved - writeS16(w, 0); //metricDataFormat - writeU16(w, num_advances); - return hea; -} -static void hea_dump(ttf_t*ttf) -{ - table_hea_t*hea = ttf->hea; - if(!hea) return; - const char*dir = ttf->is_vertical?"v":"h"; - printf("%shea->ascent: %d\n", dir, ttf->ascent); - printf("%shea->descent: %d\n", dir, ttf->descent); - printf("%shea->lineGap: %d\n", dir, ttf->lineGap); - printf("%shea->advanceWidthMax: %d\n", dir, hea->advanceWidthMax); - printf("%shea->minLeftSideBearing: %d\n", dir, hea->minLeftSideBearing); - printf("%shea->minRightSideBearing: %d\n", dir, hea->minRightSideBearing); - printf("%shea->xMaxExtent: %d\n", dir, hea->xMaxExtent); - printf("%shea->caretSlopeRise: %d\n", dir, hea->caretSlopeRise); - printf("%shea->caretSlopeRun: %d\n", dir, hea->caretSlopeRun); - printf("%shea->caretOffset: %d\n", dir, hea->caretOffset); -} -static void hea_delete(ttf_t*ttf) -{ - if(ttf->hea) { - free(ttf->hea); - ttf->hea=0; - } -} - -static void mtx_parse(memreader_t*r, ttf_t*ttf, int num_advances) -{ - U16 old_advance = 0; - int t; - if(num_advances > r->size/4) - num_advances = r->size/4; - for(t=0;tglyphs[t].advance = readU16(r); - ttf->glyphs[t].bearing = readS16(r); - } - int rest = (r->size - num_advances*4)/2; - if(ttf->num_glyphs < num_advances+rest) { - rest = ttf->num_glyphs-num_advances; - } - for(t=0;tglyphs[t].advance = old_advance; - ttf->glyphs[t].bearing = readS16(r); - } -} -static int mtx_write(ttf_t*ttf, ttf_table_t*w) -{ - int num_advances = ttf->num_glyphs; - if(ttf->num_glyphs>=2) { - int t; - for(t=ttf->num_glyphs-1;t>0;t--) { - if(ttf->glyphs[t-1].advance != - ttf->glyphs[t].advance) break; - } - /* we need to store all individual advances as well - as one entry for the constant */ - num_advances = t+1; - } - - int t; - for(t=0;tglyphs[t].advance); - writeS16(w, ttf->glyphs[t].bearing); - } - for(;tnum_glyphs;t++) { - writeS16(w, ttf->glyphs[t].bearing); - } - return num_advances; -} - -static U32*loca_parse(memreader_t*r, ttf_t*ttf, int size) -{ - int t; - int num = ttf->num_glyphs+1; - U32*locations = rfx_calloc(num*sizeof(U32)); - U32 lastloc = 0; - U32 loc = 0; - char warn_unsorted = 1; - if(size) { - if(num*4 > r->size) { - msg(" Short 'loca' table (32 bit): %d/%d", r->size/4, num); - num=r->size/4; - } - if(num*4 < r->size) { - msg(" Extraneous data (%d bytes) in 'loca' table (32 bit)", r->size-num*4); - } - for(t=0;t loc && warn_unsorted) { - msg(" Unsorted 'loca' table (32 bit)"); - warn_unsorted=0; - } - lastloc = loc; - } - } else { - if(num*2 > r->size) { - msg(" Short 'loca' table (16 bit)"); - num=r->size/2; - } - if(num*2 < r->size) { - msg(" Extraneous data (%d bytes) in 'loca' table (16 bit)", r->size-num*2); - } - for(t=0;t loc && warn_unsorted) { - msg(" Unsorted 'loca' table"); - warn_unsorted=0; - } - lastloc = loc; - } - } - return locations; -} -static int loca_write(ttf_t*ttf, ttf_table_t*w, U32*locations) -{ - int t; - char use_32bit = 0; - for(t=0;t<=ttf->num_glyphs;t++) { - if(locations[t]>=0x20000 || (locations[t]&1)) { - use_32bit = 1; - break; - } - } - - if(use_32bit) { - for(t=0;t<=ttf->num_glyphs;t++) { - writeU32(w, locations[t]); - } - return 1; - } else { - for(t=0;t<=ttf->num_glyphs;t++) { - writeU16(w, locations[t]/2); - } - return 0; - } -} - -static int parse_simple_glyph(ttf_t*ttf, memreader_t*r, int num_contours, int glyphnr) -{ - ttfglyph_t*glyph = &ttf->glyphs[glyphnr]; - - U16*endpoints = 0; - if(num_contours>0) { - endpoints = malloc(sizeof(U16)*num_contours); - int s; - int lastpos = -1; - for(s=0;s Unsorted endpoints array (len:%d) last=%d now=%d", s, pos, lastpos); - } - lastpos = pos; - } - } - U16 code_len = readU16(r); - if(code_len) { - glyph->code = malloc(sizeof(U16)*code_len); - readBlock(r, glyph->code, code_len); - glyph->code_size = code_len; - } - - if(!endpoints) - return 1; - - /*msg(" TTF Glyph %d) code_size=%d num_contours=%d glyph->num_points=%d %d/%d/%d/%d", - glyphnr, code_len, num_contours, glyph->num_points, - xmin, ymin, xmax, ymax);*/ - INIT_READ(fx, r->mem, r->size, r->pos); - INIT_READ(fy, r->mem, r->size, r->pos); - - glyph->num_points = endpoints[num_contours-1] + 1; - glyph->points = rfx_calloc(sizeof(ttfpoint_t)*glyph->num_points); - - /* parse flag array (1st pass- to determine start of coordinates) */ - int num=0; - while(numnum_points) { - U8 flag = readU8(r); - if(flag&0xc0) { - msg(" Bad flags in glyph outline: %02x (at pos %d)", flag, num); - free(glyph->points); - glyph->points = 0; - glyph->num_points = 0; - return 0; - } - int count = 1; - if(flag & 0x08) - count += readU8(r); - if(count+num>glyph->num_points) { - msg(" Bad count (%d) in glyph (%d) (at pos %d)", count, glyphnr, num); - count = glyph->num_points-num; - } - num+=count; - } - - /* parse flag array (2nd pass) and x coordinates */ - num=0; - int x = 0; - char is_start=1; - int contour_pos=0; - int bytepos = r->pos; - while(numnum_points) { - U8 flag = readU8(&fx); - int count = flag&8?readU8(&fx)+1:1; - count=count>glyph->num_points-num?glyph->num_points-num:(count?count:1); - do { - char is_end=0; - if(contour_pospoints[num].x = x; - U8 f = flag&GLYPH_ON_CURVE; - if(is_start) f|=GLYPH_CONTOUR_START; - if(is_end) f|=GLYPH_CONTOUR_END; - glyph->points[num].flags = f; - num++; - is_start = is_end; - } while(--count); - } - - /* parse flag array (3rd pass) and y coordinates */ - num=0; - int y = 0; - while(numnum_points) { - U8 flag = readU8(&fy); - int count = flag&8?readU8(&fy)+1:1; - count=count>glyph->num_points-num?glyph->num_points-num:(count?count:1); - do { - if((flag&0x24) == 0x24) y += readU8(r); - else if((flag&0x24) == 0x04) y -= readU8(r); - else if((flag&0x24) == 0x00) y += readS16(r); - glyph->points[num].y = y; - num++; - } while(--count); - } - free(endpoints); - return 1; -} -static void glyf_parse(memreader_t*rr, ttf_t*ttf, U32*loca) -{ - int t; - char warn_about_compound_glyphs=0; - for(t=0;tnum_glyphs;t++) { - INIT_READ(r, rr->mem, rr->size, loca[t]); - if(loca[t]==loca[t+1] || loca[t]==r.size) - continue; //empty glyph - if(r.pos+10>r.size) { - msg(" Truncated glyph entry %d/%d (or bad loca entry %d/%d, next loca: %d)", - t, ttf->num_glyphs, loca[t], r.size, loca[t+1]); - break; - } - S16 num_contours = readS16(&r); - ttf->glyphs[t].xmin = readS16(&r); - ttf->glyphs[t].ymin = readS16(&r); - ttf->glyphs[t].xmax = readS16(&r); - ttf->glyphs[t].ymax = readS16(&r); - - if(num_contours<0) { - if(warn_about_compound_glyphs) - msg(" Compound glyphs not supported yet"); - warn_about_compound_glyphs=0; - } else { - if(!parse_simple_glyph(ttf, &r, num_contours, t)) - return; - } - } - -} -void write_simple_glyph(ttf_table_t*w, ttfglyph_t*g) -{ - /* endpoints array */ - int s; - for(s=0;snum_points;s++) { - if(g->points[s].flags&GLYPH_CONTOUR_END) - writeU16(w, s); - } - - /* bytecode */ - writeU16(w, g->code_size); - if(g->code_size) - writeBlock(w, g->code, g->code_size); - - /* flags */ - int lastx=0; - int lasty=0; - int lastflag=-1; - int flagcount=0; - for(s=0;snum_points;s++) { - ttfpoint_t*p = &g->points[s]; - int dx = p->x - lastx; - int dy = p->y - lasty; - U8 flags = p->flags&GLYPH_ON_CURVE; - if(!dx) { - flags|=0x10; - } else if(dx<0 && dx>=-255) { - flags|=0x02; - } else if(dx>0 && dx<=255) { - flags|=0x12; - } - if(!dy) { - flags|=0x20; - } else if(dy<0 && dy>=-255) { - flags|=0x04; - } else if(dy>0 && dy<=255) { - flags|=0x24; - } - if(flags == lastflag && flagcount<255) { - flagcount++; - } else { - if(lastflag>=0) { - if(flagcount) { - writeU8(w, lastflag|8); - writeU8(w, flagcount); - } else { - writeU8(w, lastflag); - } - } - lastflag = flags; - flagcount = 0; - } - lastx = p->x; - lasty = p->y; - } - if(lastflag>=0) { - if(flagcount) { - writeU8(w, lastflag|8); - writeU8(w, flagcount); - } else { - writeU8(w, lastflag); - } - } - /* coordinates */ - lastx=0; - int bytepos = w->len; - for(s=0;snum_points;s++) { - ttfpoint_t*p = &g->points[s]; - int dx = p->x - lastx; - if(dx>32767 || dx<-32768) { - msg(" Coordinate overflow in glyph"); - } - lastx = p->x; - if(dx>0 && dx<=255) writeU8(w, dx); - else if(dx<0 && dx>=-255) writeU8(w, -dx); - else if(dx) writeS16(w, dx); - } - - lasty=0; - for(s=0;snum_points;s++) { - ttfpoint_t*p = &g->points[s]; - int dy = p->y - lasty; - if(dy>32767 || dy<-32768) { - msg(" Coordinate overflow in glyph"); - } - lasty = p->y; - if(dy>0 && dy<=255) writeU8(w, dy); - else if(dy<0 && dy>=-255) writeU8(w, -dy); - else if(dy) writeS16(w, dy); - } -} -U32* glyf_write(ttf_t* ttf, ttf_table_t*w) -{ - U32*locations = malloc(sizeof(U32)*(ttf->num_glyphs+1)); - int t; - for(t=0;tnum_glyphs;t++) { - locations[t] = w->len; - ttfglyph_t*g = &ttf->glyphs[t]; - int s; - int num_contours = 0; - for(s=0;snum_points;s++) { - if(g->points[s].flags&GLYPH_CONTOUR_END) - num_contours++; - } - writeS16(w, num_contours?num_contours:1); - writeS16(w, g->xmin); - writeS16(w, g->ymin); - writeS16(w, g->xmax); - writeS16(w, g->ymax); - - if(!num_contours) { - /* some ttf parsers can't deal with zero contours, so in the case - of an empty glyph, write a single point (0,0) */ - writeU16(w, 0); //endpoint of 1st contour - writeU16(w, g->code_size); - if(g->code_size) - writeBlock(w, g->code, g->code_size); - writeU8(w, 0x31); //flag (xy=(0,0),on curve) - } else { - write_simple_glyph(w, g); - } - } - locations[t] = w->len; - return locations; -} -void glyf_dump(ttf_t* ttf) -{ - if(!ttf->glyphs) return; - int t; - for(t=0;tnum_glyphs;t++) { - ttfglyph_t*g = &ttf->glyphs[t]; - printf("glyph %d)\n", t); - printf(" advance=%d\n", g->advance); - printf(" bearing=%d\n", g->bearing); - printf(" bbox=(%d/%d/%d/%d)\n", g->xmin, g->ymin, g->xmax, g->ymax); - printf(" points=("); - int s; - for(s=0;snum_points;s++) { - if(s) printf(","); - printf("%d/%d/0x%02x", g->points[s].x, g->points[s].y, g->points[s].flags); - } - printf(")\n"); - if(g->code_size) - hexdump(g->code, g->code_size, " "); - } -} -void glyf_delete(ttf_t* ttf) -{ - if(!ttf->glyphs) - return; - int t; - for(t=0;tnum_glyphs;t++) { - if(ttf->glyphs[t].code) { - free(ttf->glyphs[t].code); - ttf->glyphs[t].code = 0; - } - if(ttf->glyphs[t].points) { - free(ttf->glyphs[t].points); - ttf->glyphs[t].points = 0; - } - } - free(ttf->glyphs);ttf->glyphs=0; -} - -static void grow_unicode(ttf_t*ttf, int index) -{ - int size = index+1; - if(!ttf->unicode) { - ttf->unicode = rfx_calloc(sizeof(ttf->unicode[0])*size); - } else if(ttf->unicode_sizeunicode = rfx_realloc(ttf->unicode, sizeof(ttf->unicode[0])*size); - memset(ttf->unicode+ttf->unicode_size, 0, sizeof(ttf->unicode[0])*(size - ttf->unicode_size)); - } - ttf->unicode_size = size; -} -void cmap_parse(memreader_t*r, ttf_t*ttf) -{ - readU16(r); // version (0) - int num_subtables = readU16(r); - int t; - char warn=1; - if(r->pos+num_subtables*8 > r->size) { - msg(" CMap overflow"); - num_subtables = (r->size-r->pos)/8; - } - unicode_t*data = 0; - for(t=0;tr->size) { - msg(" CMAP table %d %d is out of bounds (%d)", platform, encoding, offset); - continue; - } - - int is_unicode = platform==0 || - platform==3 && encoding == 1 || - platform==3 && encoding == 10; - - if(!is_unicode) - continue; - - INIT_READ(t, r->mem, r->size, offset); - U16 format = readU16(&t); - int length = readU16(&t); - U16 language = readU16(&t); - - if(language) - msg(" Language code %02x in unicode mapping", language); - - int num = 0; - if(format == 0) { - num = length-6; - if(t.pos+length > t.size) { - msg(" overflow in format 0 cmap table"); - num = t.size-t.pos; - } - data = malloc(num*sizeof(unicode_t)); - int s; - grow_unicode(ttf, num); - for(s=0;sunicode[s] = readU8(&t); - } - } else if(format == 4) { - U16 segment_count = readU16(&t); - if(segment_count&1) { - msg(" Bad segmentx2 count %d", segment_count); - continue; - } - segment_count>>=1; - readU16(&t); //searchrange - readU16(&t); //entry selector - readU16(&t); //range shift - INIT_READ(r_end, t.mem, t.size, t.pos); - INIT_READ(r_start, t.mem, t.size, t.pos+2+segment_count*2); - INIT_READ(r_delta, t.mem, t.size, t.pos+2+segment_count*4); - INIT_READ(r_range, t.mem, t.size, t.pos+2+segment_count*6); - int glyphmap_start = t.pos+2+segment_count*8; - int glyphmap_size = t.size - glyphmap_start; - int s; - for(s=0;sunicode[u] = (u + delta) & 0xffff; - } - } else { - int pos = r_range.pos-2+range; - if(warn && pos+end-start+1 > t.size) { - msg(" glyphmap index out of bounds (%d-%d/%d)", pos, pos+end-start, t.size); - warn=0; - } - INIT_READ(g, t.mem, t.size, pos); - for(u=start;u<=end;u++) { - ttf->unicode[u] = readU16(&g); - } - } - } - } - } -} -static int segment_size(unicode_t*unicode, int pos, int size) -{ - int s; - int count=0; - for(s=pos;s4) { - /* a segment costs us 8 bytes, so for more than 4 consecutive - zero entries (16 bit each) in the glyph index array, - it pays off to start a new segment */ - break; - } - } - s -= count; // go to the last filled in entry - if(s==size) - return size-1; - return s; -} -void cmap_write(ttf_t* ttf, ttf_table_t*w) -{ - writeU16(w, 0); //version - writeU16(w, 2); //two tables - - writeU16(w, 0); //platform (unicode) - writeU16(w, 3); //encoding (unicode 2.0) - writeU32(w, 20); //offset - - writeU16(w, 3); //platform (windows) - writeU16(w, 1); //encoding (unicode basic multilingual plane UCS-2) - writeU32(w, 20); //offset - - writeU16(w, 4); // format=4 - int length_pos = w->len; - writeU16(w, 0); // length: we don't know yet - writeU16(w, 0); // language (n/a for unicode) - int num_segments_pos = w->len; - writeU16(w, 0); //number of segments: we don't know yet either - writeU16(w, 0); //searchrange - writeU16(w, 0); //entry selector - writeU16(w, 0); //range shift - - int pos=0; - int num_segments=0; - while(pos < ttf->unicode_size) { - if(!ttf->unicode[pos]) { - pos++; - continue; - } - int s = segment_size(ttf->unicode, pos, ttf->unicode_size); - pos = s+1; - num_segments++; - } - - num_segments++; // account for 0xffff mapping - - int glyphmap_start = w->len+2+num_segments*8; - - int t; - int end_pos = w->len; - for(t=0;tlen; - for(t=0;tlen; - for(t=0;tlen; - for(t=0;tdata[num_segments_pos++]=(num_segments*2)>>8; - w->data[num_segments_pos++]=(num_segments*2); - /* backpatch search range */ - int tmp = num_segments; - int search_range = 0; - while(tmp) { - search_range = tmp; - tmp = tmp&(tmp-1); - } - w->data[num_segments_pos++]=(search_range*2)>>8; - w->data[num_segments_pos++]=(search_range*2); - /* backpatch entry selector */ - int entry_selector = 0; - tmp = search_range; - while(tmp>1) {tmp>>=1;entry_selector++;} - w->data[num_segments_pos++]=entry_selector>>8; - w->data[num_segments_pos++]=entry_selector; - /* backpatch range shift */ - int range_shift = num_segments*2 - search_range*2; - w->data[num_segments_pos++]=range_shift>>8; - w->data[num_segments_pos++]=range_shift; - - pos=0; - num_segments = 0; - while(pos < ttf->unicode_size) { - if(!ttf->unicode[pos]) { - pos++; - continue; - } - U16 end = segment_size(ttf->unicode, pos, ttf->unicode_size); - w->data[end_pos++]=end>>8; - w->data[end_pos++]=end; - w->data[start_pos++]=pos>>8; - w->data[start_pos++]=pos; - int s; - U16 delta = ttf->unicode[pos]-pos; - char do_delta=1; - for(s=pos+1;s<=end;s++) { - U16 delta2 = ttf->unicode[s]-s; - if(delta2!=delta) { - do_delta=0; - break; - } - } - U16 range; - if(do_delta) { - range = 0; - } else { - delta = 0; - range = w->len - range_pos; - for(s=pos;s<=end;s++) { - writeU16(w, ttf->unicode[s]); - } - } - w->data[delta_pos++]=delta>>8; - w->data[delta_pos++]=delta; - w->data[range_pos++]=range>>8; - w->data[range_pos++]=range; - num_segments++; - pos = end+1; - } - - /* write out a mapping from 0xffff to 0- seems to be required - by some libraries (e.g. fonttools) */ - w->data[end_pos++]=0xff; - w->data[end_pos++]=0xff; - w->data[start_pos++]=0xff; - w->data[start_pos++]=0xff; - w->data[delta_pos++]=0; - w->data[delta_pos++]=1; - w->data[range_pos++]=0; - w->data[range_pos++]=0; - - w->data[length_pos]=(w->len-20)>>8; - w->data[length_pos+1]=w->len-20; -} -void cmap_delete(ttf_t*ttf) -{ - if(ttf->unicode) { - free(ttf->unicode); - ttf->unicode=0; - } - ttf->unicode_size=0; -} -static char*readString(memreader_t*r, int len) -{ - char*s = malloc(len+1); - readBlock(r, s, len); - s[len] = 0; - return s; -} -void name_parse(memreader_t*r, ttf_t*ttf) -{ - U16 format = readU16(r); - U16 count = readU16(r); - U16 offset = readU16(r); - - int t; - for(t=0;tmem, r->size, offset+offset_2); - if(!(platform==0 || (platform==1 && encoding==0))) - continue; - - INIT_READ(s, r->mem, r->size, offset+offset_2); - - switch (name_id) { - case 1: read_name = &ttf->family_name; break; - case 2: read_name = &ttf->subfamily_name; break; - case 3: read_name = &ttf->font_uid; break; - case 4: read_name = &ttf->full_name; break; - case 5: read_name = &ttf->version_string; break; - case 6: read_name = &ttf->postscript_name; break; - default: read_name = 0; - } - - if (read_name) { - if (*read_name) free(*read_name); - *read_name = readString(&s, len); - } - } -} -void name_write(ttf_t*ttf, ttf_table_t*table) -{ - char*strings[6] = {ttf->family_name, ttf->subfamily_name, ttf->font_uid, ttf->full_name, ttf->version_string, ttf->postscript_name}; - int codes[6] = {1,2,3,4,5,6}; - - writeU16(table, 0); //format - int count = 0; - int t; - int nr = sizeof(strings)/sizeof(strings[0]); - - for(t=0;tlen; - writeU16(table, 0); //offset (will be filled in later) - - /* Windows expects the name table to be sorted by platform/encoding/language/name_id */ - int offset = 0; - for(t=0;tdata[offset_pos] = table->len>>8; - table->data[offset_pos+1] = table->len; - - for(t=0;tfull_name) { - free(ttf->full_name); - ttf->full_name=0; - } - if(ttf->family_name) { - free(ttf->family_name); - ttf->family_name=0; - } - if(ttf->subfamily_name) { - free(ttf->subfamily_name); - ttf->subfamily_name=0; - } - if(ttf->version_string) { - free(ttf->version_string); - ttf->version_string=0; - } - if(ttf->font_uid) { - free(ttf->font_uid); - ttf->font_uid=0; - } - if(ttf->postscript_name) { - free(ttf->postscript_name); - ttf->postscript_name=0; - } -} - -static table_post_t*post_new(ttf_t*ttf) -{ - table_post_t*post = rfx_calloc(sizeof(table_post_t)); - return post; -} -void post_parse(memreader_t*r, ttf_t*ttf) -{ - table_post_t*post = ttf->post = rfx_calloc(sizeof(table_post_t)); - U32 format = readU32(r); - post->italic_angle = readU32(r); - post->underline_position = readU16(r); - post->underline_thickness = readU16(r); - U16 is_monospaced = readU32(r); - readU32(r); // min mem 42 - readU32(r); - readU32(r); // min mem 1 - readU32(r); -} -void post_write(ttf_t*ttf, ttf_table_t*table) -{ - table_post_t*post = ttf->post; - writeU32(table, 0x00030000); - writeU32(table, post->italic_angle); - writeU16(table, post->underline_position); - writeU16(table, post->underline_thickness); - writeU32(table, 0); //is monospaced TODO - writeU32(table, 0); //min mem 42 - writeU32(table, 0); - writeU32(table, 0); //min mem 1 - writeU32(table, 0); -} -void post_delete(ttf_t*ttf) -{ - if(ttf->post) { - free(ttf->post); - ttf->post = 0; - } -} - -void cvt_parse(memreader_t*r, ttf_t*ttf) -{ - table_cvt_t*cvt = ttf->cvt = rfx_calloc(sizeof(table_cvt_t)); - cvt->num = r->size/2; - cvt->values = malloc(cvt->num*sizeof(S16)); - int t; - for(t=0;tnum;t++) { - cvt->values[t] = readS16(r); - } -} -void cvt_write(ttf_t*ttf, ttf_table_t*table) -{ - table_cvt_t*cvt = ttf->cvt; - int t; - for(t=0;tnum;t++) { - writeS16(table, cvt->values[t]); - } -} -void cvt_delete(ttf_t*ttf) -{ - if(ttf->cvt) { - if(ttf->cvt->values) - free(ttf->cvt->values); - free(ttf->cvt); - ttf->cvt = 0; - } -} - -static table_gasp_t*gasp_new(ttf_t*ttf) -{ - table_gasp_t*gasp = rfx_calloc(sizeof(table_gasp_t)); - gasp->num = 1; - gasp->records = rfx_calloc(sizeof(gasp->records[0])*gasp->num); - - gasp->records[0].size = 65535; - gasp->records[0].behaviour = 15; //gridfit+grayscale rendering - return gasp; -} -void gasp_parse(memreader_t*r, ttf_t*ttf) -{ - table_gasp_t*gasp = ttf->gasp = rfx_calloc(sizeof(table_gasp_t)); - readU16(r); //version - int num = readU16(r); - int t; - if(!num) return; - gasp->records = malloc(sizeof(gasp->records[0])*num); - for(t=0;trecords[t].size = readU16(r); - gasp->records[t].behaviour = readU16(r); - } -} - -#define GASP_SYMMETRIC_GRIDFIT 0x0008 -#define GASP_SYMMETRIC_SMOOTHING 0x0004 -#define GASP_DOGRAY 0x0002 -#define GASP_GRIDFIT 0x0001 - -void gasp_write(ttf_t*ttf, ttf_table_t*table) -{ - table_gasp_t*gasp = ttf->gasp; - int version = 0; - int t; - for(t=0;tnum;t++) { - if(gasp->records[t].behaviour & ~(GASP_GRIDFIT | GASP_DOGRAY)) { - version = 1; - } - } - writeU16(table, version); - writeU16(table, gasp->num); - for(t=0;tnum;t++) { - writeU16(table, gasp->records[t].size); - writeU16(table, gasp->records[t].behaviour); - } -} -void gasp_delete(ttf_t*ttf) -{ - if(ttf->gasp) { - if(ttf->gasp->records) - free(ttf->gasp->records); - free(ttf->gasp); - ttf->gasp = 0; - } -} - -table_code_t*prep_new(ttf_t*ttf) -{ - table_code_t*prep = ttf->prep = rfx_calloc(sizeof(table_code_t)); - ttf_table_t*t = ttf_table_new(0); - writeU8(t,0xb8);writeU16(t,0x1ff); // pushword(0x1ff) - writeU8(t,0x85); //scanctrl (always do dropout, for all sizes) - writeU8(t,0xb0);writeU8(t,1); // pushbyte(1) - writeU8(t,0x8d); //scantype (simple dropout control w/o stubs) - writeU8(t,0xb0);writeU8(t,5); // pushbyte(5) - writeU8(t,0x8d); //scantype (for windows) smart dropout control w/o stubs - prep->code = t->data; - prep->size = t->len; - free(t); - return prep; - -} -void fpgm_parse(memreader_t*r, ttf_t*ttf) -{ - table_code_t*fpgm = ttf->fpgm = rfx_calloc(sizeof(table_code_t)); - if(!r->size) return; - fpgm->size = r->size; - fpgm->code = malloc(r->size); - readBlock(r, fpgm->code, r->size); -} -void fpgm_write(ttf_t*ttf, ttf_table_t*table) -{ - table_code_t*code = ttf->fpgm; - writeBlock(table, code->code, code->size); -} -void fpgm_delete(ttf_t*ttf) -{ - if(ttf->fpgm) { - if(ttf->fpgm->code) - free(ttf->fpgm->code); - free(ttf->fpgm); - ttf->fpgm = 0; - } -} - -void prep_parse(memreader_t*r, ttf_t*ttf) -{ - table_code_t*prep = ttf->prep = rfx_calloc(sizeof(table_code_t)); - if(!r->size) return; - prep->size = r->size; - prep->code = malloc(r->size); - readBlock(r, prep->code, r->size); -} -void prep_write(ttf_t*ttf, ttf_table_t*table) -{ - table_code_t*code = ttf->prep; - writeBlock(table, code->code, code->size); -} -void prep_delete(ttf_t*ttf) -{ - if(ttf->prep) { - if(ttf->prep->code) - free(ttf->prep->code); - free(ttf->prep); - ttf->prep = 0; - } -} - -static int ttf_parse_tables(ttf_t*ttf) -{ - ttf_table_t*table; - - table = ttf_find_table(ttf, TAG_HEAD); - if(!table) { - msg(" Font has no head table"); - return 0; - } - INIT_READ(m, table->data, table->len, 0); - int loc_index = head_parse(ttf, &m); - ttf_table_delete(ttf, table); - - table = ttf_find_table(ttf, TAG_MAXP); - if(!table) { - msg(" Font has no maxp table"); - return 0; - } - INIT_READ(m2, table->data, table->len, 0); - ttf->maxp = maxp_parse(ttf, &m2); - ttf_table_delete(ttf, table); - - if(!ttf->num_glyphs) { - msg(" Invalid number of characters"); - return 0; - } - ttf->glyphs = rfx_calloc(sizeof(ttfglyph_t)*ttf->num_glyphs); - - table = ttf_find_table(ttf, TAG_OS2); - if(table) { - INIT_READ(m, table->data, table->len, 0); - ttf->os2 = os2_parse(&m); - ttf_table_delete(ttf, table); - } - - - table = ttf_find_table(ttf, TAG_HHEA); - if(table) { - INIT_READ(m, table->data, table->len, 0); - int num_advances = hea_parse(&m, ttf); - ttf_table_delete(ttf, table); - - table = ttf_find_table(ttf, TAG_HMTX); - if(table) { - INIT_READ(m, table->data, table->len, 0); - mtx_parse(&m, ttf, num_advances); - ttf_table_delete(ttf, table); - } - } else { - table = ttf_find_table(ttf, TAG_VHEA); - if(table) { - ttf->is_vertical=1; - INIT_READ(m, table->data, table->len, 0); - int num_advances = hea_parse(&m, ttf); - ttf_table_delete(ttf, table); - - table = ttf_find_table(ttf, TAG_VMTX); - if(table) { - INIT_READ(m, table->data, table->len, 0); - mtx_parse(&m, ttf, num_advances); - ttf_table_delete(ttf, table); - } - } else { - msg(" Font contains neither HHEA nor VHEA"); - } - } - table = ttf_find_table(ttf, TAG_LOCA); - if(table) { - INIT_READ(m, table->data, table->len, 0); - U32*loca = loca_parse(&m, ttf, loc_index); - ttf_table_delete(ttf, table); - table = ttf_find_table(ttf, TAG_GLYF); - if(table) { - INIT_READ(m, table->data, table->len, 0); - glyf_parse(&m, ttf, loca); - ttf_table_delete(ttf, table); - } - free(loca); - } - - table = ttf_find_table(ttf, TAG_CMAP); - if(table) { - INIT_READ(m, table->data, table->len, 0); - cmap_parse(&m, ttf); - ttf_table_delete(ttf, table); - } - - table = ttf_find_table(ttf, TAG_POST); - if(table) { - INIT_READ(m, table->data, table->len, 0); - post_parse(&m, ttf); - ttf_table_delete(ttf, table); - } - - table = ttf_find_table(ttf, TAG_NAME); - if(table) { - INIT_READ(m, table->data, table->len, 0); - name_parse(&m, ttf); - ttf_table_delete(ttf, table); - } - - table = ttf_find_table(ttf, TAG_CVT); - if(table) { - INIT_READ(m, table->data, table->len, 0); - cvt_parse(&m, ttf); - ttf_table_delete(ttf, table); - } - - table = ttf_find_table(ttf, TAG_GASP); - if(table) { - INIT_READ(m, table->data, table->len, 0); - gasp_parse(&m, ttf); - ttf_table_delete(ttf, table); - } - - table = ttf_find_table(ttf, TAG_PREP); - if(table) { - INIT_READ(m, table->data, table->len, 0); - prep_parse(&m, ttf); - ttf_table_delete(ttf, table); - } - - table = ttf_find_table(ttf, TAG_FPGM); - if(table) { - INIT_READ(m, table->data, table->len, 0); - fpgm_parse(&m, ttf); - ttf_table_delete(ttf, table); - } - - return 1; -} -static void ttf_collapse_tables(ttf_t*ttf) -{ - ttf_table_t*table; - - ttf_table_t*head = ttf_find_table(ttf, TAG_HEAD); - if(head) - return; //already collapsed - - if(ttf->maxp) { - table = ttf_addtable(ttf, TAG_MAXP); - maxp_write(ttf, table); - maxp_delete(ttf); - } - - if(ttf->os2) { - table = ttf_addtable(ttf, TAG_OS2); - os2_write(ttf, table); - os2_delete(ttf); - } - - if(ttf->hea) { - if(!ttf->is_vertical) { - table = ttf_addtable(ttf, TAG_HMTX); - int num_advances = mtx_write(ttf, table); - table = ttf_addtable(ttf, TAG_HHEA); - hea_write(ttf, table, num_advances); - hea_delete(ttf); - } else { - table = ttf_addtable(ttf, TAG_VMTX); - int num_advances = mtx_write(ttf, table); - table = ttf_addtable(ttf, TAG_VHEA); - hea_write(ttf, table, num_advances); - hea_delete(ttf); - } - } - - int loca_size=0; - if(ttf->num_glyphs) { - if(ttf->unicode) { - table = ttf_addtable(ttf, TAG_CMAP); - cmap_write(ttf, table); - cmap_delete(ttf); - } - - if(ttf->glyphs) { - table = ttf_addtable(ttf, TAG_GLYF); - U32*locations = glyf_write(ttf, table); - table = ttf_addtable(ttf, TAG_LOCA); - loca_size = loca_write(ttf, table, locations); - free(locations); - glyf_delete(ttf); - } - } - - if(ttf->full_name || ttf->family_name || ttf->subfamily_name || ttf->font_uid || ttf->postscript_name) { - table = ttf_addtable(ttf, TAG_NAME); - name_write(ttf, table); - name_delete(ttf); - } - if(ttf->post) { - table = ttf_addtable(ttf, TAG_POST); - post_write(ttf, table); - post_delete(ttf); - } - if(ttf->cvt) { - table = ttf_addtable(ttf, TAG_CVT); - cvt_write(ttf, table); - cvt_delete(ttf); - } - if(ttf->gasp) { - table = ttf_addtable(ttf, TAG_GASP); - gasp_write(ttf, table); - gasp_delete(ttf); - } - if(ttf->fpgm) { - table = ttf_addtable(ttf, TAG_FPGM); - fpgm_write(ttf, table); - fpgm_delete(ttf); - } - if(ttf->prep) { - table = ttf_addtable(ttf, TAG_PREP); - prep_write(ttf, table); - prep_delete(ttf); - } - - table = ttf_addtable(ttf, TAG_HEAD); - head_write(ttf, table, loca_size); - head_delete(ttf); -} - -ttf_t*ttf_new() -{ - ttf_t*ttf = rfx_calloc(sizeof(ttf_t)); - ttf->version = VERSION_1_0; - return ttf; -} -ttf_t* ttf_load(void*data, int length) -{ - INIT_READ(r,data,length, 0); - - if(length<12) { - msg(" Truncated Truetype file (%d bytes)", length); - return 0; - } - - ttf_t*ttf = rfx_calloc(sizeof(ttf_t)); - ttf->version = readU32(&r); - if(ttf->version == SWAP32(length)) { - U32 fontDataSize = readU32(&r); - U32 version = readU32(&r); - U32 flags = readU32(&r); - U8 panose[10]; - readBlock(&r, panose, 10); - readU8(&r); //charset - readU8(&r); //italoc - readU32(&r); //weight - readU16(&r); //fstype - U16 magic = readU16(&r); //magicNumber - /* we're being paranoid: it's entirely possible for the font - size to be exactly 0x10000. Only treat this font as eot if - it has the right magic number */ - if(magic == 0x4c50) { - readU32(&r); //unicoderange[0] - readU32(&r); //unicoderange[1] - readU32(&r); //unicoderange[2] - readU32(&r); //unicoderange[3] - readU32(&r); //codepagerange[0] - readU32(&r); //codepagerange[1] - readU32(&r); //checksumadjustment - readU32(&r); //reserved[0] - readU32(&r); //reserved[1] - readU32(&r); //reserved[2] - readU32(&r); //reserved[3] - readU16(&r); //padding - - int nr=0; - for(nr=0;nr<4;nr++) { - int t, len; - /* All of ttf is big-endian. All of ttf? No. One small eot table - of indomitable little-endian... */ - len = readU8(&r); - len |= readU8(&r)<<8; - len /= 2; - for(t=0;t>8; - } - readU16(&r); // zero terminator - } - readU16(&r); // more padding - - /* adjust the offset to the start of the actual truetype - data- the positions in the table header will be relative - to the ttf data after the header, not to the file */ - r.mem += r.pos; - r.size -= r.pos; - r.pos = 0; - ttf->version = readU32(&r); - } else { - reader_reset(&r); - ttf->version = readU32(&r); - } - } - - if(ttf->version == TTCFTAG) { - /* a ttc collection is a number of truetype fonts - packaged together */ - if(length<16) { - msg(" Truncated TTC file (%d bytes)", length); - return 0; - } - U32 ttcf_version = readU32(&r); // 0x00000100: v1.0, 0x00000200: v2.0, includes DSIG table - U32 num_fonts = readU32(&r); // number of fonts - U32 font1_position = readU32(&r); - if(font1_position+12 > length) {\ - msg(" Truncated TTC file (%d bytes, first font at %d)", length, font1_position); - return 0; - } - r.pos = font1_position; - ttf->version = readU32(&r); - } - - int num_tables = readU16(&r); - - readU16(&r); //search range - readU16(&r); //entry selector - readU16(&r); //range shift - - if(num_tables*16 > length) { - msg(" Truncated TTF file (table entries: %d)", num_tables); - if(ttf->version != OPENTYPE && - ttf->version != TRUETYPE_MACOS && - ttf->version != VERSION_1_0) { - // bad table length, weird version. This is probably not a ttf file. - return 0; - } - } - - U32*table_data = malloc(16*num_tables); - int t; - for(t=0;t length) { - msg(" TTF Table %02x%02x%02x%02x outside of stream (pos %d)", (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, pos); - } else { - U8*mem = malloc(len); - r.pos = pos; - readBlock(&r, mem, len); - - ttf_table_t*table = ttf_addtable(ttf, tag); - table->data = mem; - table->len = table->memsize = len; -#if 0 - U32 checksum2 = ttf_table_checksum(table); - if(checksum2!=checksum) { - msg(" Checksum mismatch in tag %02x%02x%02x%02x %c%c%c%c (%d bytes) %08x!=%08x", - (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, - (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, - len, checksum2, checksum); - } -#endif - } - } - free(table_data); - - if(!ttf_parse_tables(ttf)) - return 0; - - return ttf; -} -void ttf_create_truetype_tables(ttf_t*ttf) -{ - if(!ttf->head) - ttf->head = head_new(ttf); - if(!ttf->maxp) - ttf->maxp = maxp_new(ttf); - if(!ttf->hea) - ttf->hea = hea_new(ttf); - if(!ttf->os2) - ttf->os2 = os2_new(ttf); - if(!ttf->post) - ttf->post = post_new(ttf); - if(!ttf->gasp) - ttf->gasp = gasp_new(ttf); - if(!ttf->prep) - ttf->prep = prep_new(ttf); -} - -ttf_table_t* ttf_write(ttf_t*ttf, U32*checksum_adjust) -{ - ttf_collapse_tables(ttf); - - ttf_table_t*file = ttf_table_new(0); - writeU32(file, VERSION_1_0); - - /* write number of tables */ - int num_tables=0; - ttf_table_t*t = ttf->tables; - while(t) { - num_tables++; - t = t->next; - } - writeU16(file, num_tables); - - /* write search range */ - int tmp = num_tables; - int search_range = 0; - while(tmp) { - search_range = tmp; - tmp = tmp&(tmp-1); - } - tmp = search_range; - search_range*=16; - writeU16(file, search_range); - - /* write entry selector */ - int entry_selector = 0; - while(tmp>1) { - tmp>>=1; - entry_selector++; - } - writeU16(file, entry_selector); - - /* write range shift */ - int range_shift = num_tables*16 - search_range; - writeU16(file, range_shift); - - /* write table dictionary */ - int table_dictionary_pos = file->len; - int data_pos = file->len + num_tables*16; - for(t=ttf->tables;t;t=t->next) { - writeU32(file, t->id); - writeU32(file, ttf_table_checksum(t)); - writeU32(file, data_pos); - writeU32(file, t->len); - data_pos += t->len; - data_pos += (-t->len)&3; //pad - } - - /* write tables */ - int head_pos = 0; - U8 zero[4]={0,0,0,0}; - for(t=ttf->tables;t;t=t->next) { - if(t->id == TAG_HEAD) - head_pos = file->len; - writeBlock(file, t->data, t->len); - writeBlock(file, zero, (-t->len)&3); //pad - } - U32 checksum = 0xb1b0afba - ttf_table_checksum(file); - if(checksum_adjust) - *checksum_adjust = checksum; - U8*checksum2 = file->data + head_pos + 8; - checksum2[0] = checksum>>24; - checksum2[1] = checksum>>16; - checksum2[2] = checksum>>8; - checksum2[3] = checksum>>0; - return file; -} - -ttf_table_t* ttf_eot_head(ttf_t*ttf) -{ - ttf_table_t*file = ttf_table_new(0); - writeU32(file, 0); //file size (filled in later) - writeU32(file, 0); //fontdatasize (filled in later) - writeU32(file, 0x01000200); - writeU32(file, 0); //flags - writeU8(file, ttf->os2->panose_FamilyType); - writeU8(file, ttf->os2->panose_SerifStyle); - writeU8(file, ttf->os2->panose_Weight); - writeU8(file, ttf->os2->panose_Proportion); - writeU8(file, ttf->os2->panose_Contrast); - writeU8(file, ttf->os2->panose_StrokeVariation); - writeU8(file, ttf->os2->panose_ArmStyle); - writeU8(file, ttf->os2->panose_Letterform); - writeU8(file, ttf->os2->panose_Midline); - writeU8(file, ttf->os2->panose_XHeight); - writeU8(file, 1); //charset (default) - writeU8(file, ttf->os2->fsSelection&1); //italic - writeU32_LE(file, ttf->os2->usWeightClass); - writeU16(file, 0); //fstype - writeU16(file, 0x4c50); //magic - writeU32_LE(file, ttf->os2->ulCharRange[0]); - writeU32_LE(file, ttf->os2->ulCharRange[1]); - writeU32_LE(file, ttf->os2->ulCharRange[2]); - writeU32_LE(file, ttf->os2->ulCharRange[3]); - writeU32_LE(file, ttf->os2->ulCodePageRange1); - writeU32_LE(file, ttf->os2->ulCodePageRange2); - writeU32(file, 0); //checksum adjust (filled in later) - writeU32(file, 0); //reserved[0] - writeU32(file, 0); //reserved[1] - writeU32(file, 0); //reserved[2] - writeU32(file, 0); //reserved[3] - writeU16(file, 0); //padding(1) - - int i,t,len; - - char* strings[] = {ttf->family_name, ttf->subfamily_name, ttf->version_string, ttf->full_name}; - int nr = sizeof(strings)/sizeof(strings[0]); - - for(i=0;idata; - U32 full_len = eot->len + t->len; - len_data[0] = full_len>>0; - len_data[1] = full_len>>8; - len_data[2] = full_len>>16; - len_data[3] = full_len>>24; - - U8*len_data2 = eot->data+4; - len_data2[0] = t->len>>0; - len_data2[1] = t->len>>8; - len_data2[2] = t->len>>16; - len_data2[3] = t->len>>24; - - U8*checksum_data = eot->data + 60; - checksum_data[0] = checksum_adjust>>0; - checksum_data[1] = checksum_adjust>>8; - checksum_data[2] = checksum_adjust>>16; - checksum_data[3] = checksum_adjust>>24; - - FILE*fi = fopen(filename, "wb"); - if(!fi) { - perror(filename); - return; - } - - fwrite(eot->data, eot->len, 1, fi); - fwrite(t->data, t->len, 1, fi); - fclose(fi); - ttf_table_delete(0, t); - ttf_table_delete(0, eot); -} - -void ttf_save(ttf_t*ttf, const char*filename) -{ - ttf_table_t* t = ttf_write(ttf, 0); - FILE*fi = fopen(filename, "wb"); - if(!fi) { - perror(filename); - return; - } - fwrite(t->data, t->len, 1, fi); - fclose(fi); - ttf_table_delete(0, t); -} - -void ttf_dump(ttf_t*ttf) -{ - msg(" Truetype file version %08x%s", ttf->version, ttf->version == OPENTYPE?" (opentype)":""); - ttf_table_t*table = ttf->tables; - while(table) { - U32 tag = table->id; - msg(" Tag %02x%02x%02x%02x [%c%c%c%c] (length: %d)", - (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, - (tag>>24)&0xff, (tag>>16)&0xff, (tag>>8)&0xff, (tag)&0xff, table->len); - table = table->next; - } - //ttf_table_dump(ttf_find_table(ttf, TAG_MAXP)); - - head_dump(ttf); - hea_dump(ttf); - os2_dump(ttf); - maxp_dump(ttf); - glyf_dump(ttf); -} -void ttf_destroy_tables(ttf_t*ttf) -{ - ttf_table_t*table = ttf->tables; - while(table) { - ttf_table_t*next = table->next; - free(table->data); - free(table); - table = next; - } - ttf->tables = 0; -} -void ttf_reduce(ttf_t*ttf) -{ - ttf_destroy_tables(ttf); -} -void ttf_destroy(ttf_t*ttf) -{ - ttf_destroy_tables(ttf); - maxp_delete(ttf); - os2_delete(ttf); - head_delete(ttf); - hea_delete(ttf); - glyf_delete(ttf); - post_delete(ttf); - cvt_delete(ttf); - name_delete(ttf); - free(ttf); -} - -ttf_t* ttf_open(const char*filename) -{ - memfile_t*m = memfile_open(filename); - ttf_t*ttf = ttf_load(m->data, m->len); - memfile_close(m); - return ttf; -} - -#ifdef MAIN -int main(int argn, const char*argv[]) -{ - setConsoleLogging(7); - const char*filename = "comic.ttf"; - if(argn>1) - filename = argv[1]; - //msg(" Loading %s", filename); - memfile_t*m = memfile_open(filename); - ttf_t*ttf = ttf_load(m->data, m->len); - - if(!ttf) { - msg(" Couldn't load %s", filename); - return 1; - } - ttf_reduce(ttf); - - ttf_create_truetype_tables(ttf); - - if(!ttf) return 1; - memfile_close(m); - //ttf_dump(ttf); - //printf("os2 version: %04x (%d), maxp size: %d\n", -// ttf->os2->version, ttf->os2->size, ttf->maxp->size); - ttf_save_eot(ttf, "testfont.eot"); - ttf_save(ttf, "testfont.ttf"); - ttf_destroy(ttf); - return 0; - -} -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/ttf.h b/fluidbook/tools/swftools-special-swfdump/lib/ttf.h deleted file mode 100644 index 02011305d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/ttf.h +++ /dev/null @@ -1,214 +0,0 @@ -/* ttf.h - Parser and writer for truetype font files. - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __ttf_h__ -#define __ttf_h__ - -#include "types.h" - -typedef struct _ttf_table { - U32 id; - struct _ttf_table*prev; - struct _ttf_table*next; - - U8*data; - int len; - int memsize; -} ttf_table_t; - -typedef struct _table_maxp { - U16 maxPoints; - U16 maxContours; - U16 maxComponentPoints; - U16 maxComponentContours; - U16 maxZones; - U16 maxTwilightPoints; - U16 maxStorage; - U16 maxFunctionDefs; - U16 maxInstructionDefs; - U16 maxStackElements; - U16 maxSizeOfInstructions; - U16 maxComponentElements; - U16 maxComponentDepth; -} table_maxp_t; - -typedef struct _table_os2 { - S16 xAvgCharWidth; - U16 usWeightClass; - U16 usWidthClass; - U16 ySubscriptXSize; - U16 ySubscriptYSize; - U16 ySubscriptXOffset; - U16 ySubscriptYOffset; - U16 ySuperscriptXSize; - U16 ySuperscriptYSize; - U16 ySuperscriptXOffset; - U16 ySuperscriptYOffset; - U16 yStrikeoutSize; - U16 yStrikeoutPosition; - U16 sFamilyClass; - U8 panose_FamilyType; - U8 panose_SerifStyle; - U8 panose_Weight; - U8 panose_Proportion; - U8 panose_Contrast; - U8 panose_StrokeVariation; - U8 panose_ArmStyle; - U8 panose_Letterform; - U8 panose_Midline; - U8 panose_XHeight; - U32 ulCharRange[4]; - - U16 fsSelection; - U16 fsFirstCharIndex; - U16 fsLastCharIndex; - - S16 sTypoAscender; - S16 sTypoDescender; - S16 sTypoLineGap; - U16 usWinAscent; - U16 usWinDescent; - - /* for version >= 0x0001 */ - U32 ulCodePageRange1; - U32 ulCodePageRange2; - - /* for version >= 0x0002 */ - S16 sxHeight; - S16 sCapHeight; - U16 usDefaultChar; - U16 usBreakChar; - U16 usMaxContext; -} table_os2_t; - -typedef struct _table_hea -{ - U16 advanceWidthMax; - S16 minLeftSideBearing; - S16 minRightSideBearing; - S16 xMaxExtent; - S16 caretSlopeRise; - S16 caretSlopeRun; - S16 caretOffset; -} table_hea_t; - -#define GLYPH_ON_CURVE 0x01 -#define GLYPH_CONTOUR_START 0x40 -#define GLYPH_CONTOUR_END 0x80 - -typedef U32 unicode_t; - -typedef struct _ttfpoint { - int x,y; - U8 flags; -} ttfpoint_t; -typedef struct _ttfglyph { - U16 advance; - S16 bearing; - S16 xmin,ymin,xmax,ymax; - int code_size; - U8*code; - int num_points; - ttfpoint_t*points; -} ttfglyph_t; - -typedef struct _table_head { - U16 flags; - U16 units_per_em; - S16 xmin,ymin,xmax,ymax; - U16 macStyle; - U16 lowest_readable_size; - S16 dir_hint; -} table_head_t; - -typedef struct _table_post { - U32 italic_angle; - U16 underline_position; - U16 underline_thickness; -} table_post_t; - -typedef struct _table_cvt { - S16*values; - int num; -} table_cvt_t; - -typedef struct _table_gasp { - int num; - struct { - U16 size; - U16 behaviour; - } *records; -} table_gasp_t; - -typedef struct _table_code { - U8*code; - int size; -} table_code_t; - -typedef struct _ttf { - char*family_name; /* nameId 1 */ - char*subfamily_name; /* nameId 2 */ - char*font_uid; /* nameId 3 */ - char*full_name; /* nameId 4 */ - char*version_string; /* nameId 5 */ - char*postscript_name; /* nameId 6 */ - - ttf_table_t*tables; - - table_head_t*head; - table_maxp_t*maxp; - table_os2_t*os2; - table_hea_t*hea; - table_post_t*post; - table_cvt_t*cvt; - table_gasp_t*gasp; - table_code_t*prep; - table_code_t*fpgm; - - U16 flags; - char is_vertical; - - S16 ascent; - S16 descent; // ymin, *not* negative ymin - S16 lineGap; - - int num_glyphs; - ttfglyph_t*glyphs; - - int unicode_size; - unicode_t*unicode; - - U32 version; -} ttf_t; - - -ttf_t*ttf_new(); -ttf_t* ttf_open(const char*filename); -void ttf_reduce(ttf_t*ttf); -ttf_t*ttf_load(void*data, int length); -ttf_table_t*ttf_addtable(ttf_t*ttf, U32 tag); -void ttf_create_truetype_tables(ttf_t*ttf); -void ttf_dump(ttf_t*ttf); -void ttf_destroy(ttf_t*ttf); -void ttf_save(ttf_t*ttf, const char*filename); -void ttf_save_eot(ttf_t*ttf, const char*filename); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/types.h b/fluidbook/tools/swftools-special-swfdump/lib/types.h deleted file mode 100644 index 499c840b4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/types.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef __rfxtypes_h__ -#define __rfxtypes_h__ - -#include "../config.h" - -#ifndef TRUE -#define TRUE (1) -#endif -#ifndef FALSE -#define FALSE (0) -#endif - -/* little/big endian stuff */ - -#define PUT8(ptr,x) {((U8*)(ptr))[0]=x;} -#define PUT16(ptr,x) {((U8*)(ptr))[0]=(U8)(x);((U8*)(ptr))[1]=(U8)((x)>>8);} -#define PUT32(ptr,x) {((U8*)(ptr))[0]=(U8)(x);((U8*)(ptr))[1]=(U8)((x)>>8);((U8*)(ptr))[2]=(U8)((x)>>16);((U8*)(ptr))[3]=(U8)((x)>>24);} -#define GET16(ptr) (((U16)(((U8*)(ptr))[0]))+(((U16)(((U8*)(ptr))[1]))<<8)) -#define GET32(ptr) (((U16)(((U8*)(ptr))[0]))+(((U16)(((U8*)(ptr))[1]))<<8)+(((U16)(((U8*)(ptr))[2]))<<16)+(((U16)(((U8*)(ptr))[3]))<<24)) - -#define SWAP16(s) ((((s)>>8)&0x00ff)|(((s)<<8)&0xff00)) -#define SWAP32(s) (SWAP16(((s)>>16)&0x0000ffff)|((SWAP16(s)<<16)&0xffff0000)) - -#ifdef WORDS_BIGENDIAN -#define LE_16_TO_NATIVE(s) SWAP16(s) -#define LE_32_TO_NATIVE(s) SWAP32(s) -#define BE_16_TO_NATIVE(x) (x) -#define BE_32_TO_NATIVE(x) (x) -#else -#define LE_16_TO_NATIVE(x) (x) -#define LE_32_TO_NATIVE(x) (x) -#define BE_16_TO_NATIVE(s) SWAP16(s) -#define BE_32_TO_NATIVE(s) SWAP32(s) -#endif - -// SWF Types - -#if SIZEOF_SIGNED_LONG_LONG != 8 -#error "no way to define 64 bit integer" -#endif -#if SIZEOF_SIGNED != 4 -#error "don't know how to define 32 bit integer" -#endif -#if SIZEOF_SIGNED_SHORT != 2 -#error "don't know how to define 16 bit integer" -#endif -#if SIZEOF_SIGNED_CHAR != 1 -#error "don't know how to define 8 bit integer" -#endif - -typedef unsigned long long U64; -typedef signed long long S64; -typedef unsigned U32; -typedef signed S32; -typedef unsigned short U16; -typedef signed short S16; -typedef unsigned char U8; -typedef signed char S8; - -#if SIZEOF_VOIDP == SIZEOF_SIGNED_LONG_LONG -typedef unsigned long long ptroff_t; -#elif SIZEOF_VOIDP == SIZEOF_SIGNED -typedef unsigned ptroff_t; -#else -#error "Unknown pointer size" -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/utf8.c b/fluidbook/tools/swftools-special-swfdump/lib/utf8.c deleted file mode 100644 index 3170d3ffd..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/utf8.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include "utf8.h" - -static char utf8buf[16]; - -int writeUTF8(unsigned int charnum, char*dest) -{ - dest[0] = 0; - if(charnum < 0x80) { - dest[0] = charnum; - dest[1] = 0; - return 1; - } else if(charnum <0x800) { - /* 0000 0080-0000 07FF 110xxxxx 10xxxxxx */ - dest[0] = 0xc0 | (charnum >> 6); - dest[1] = 0x80 | (charnum & 0x3f); - dest[2] = 0; - return 2; - } else if(charnum < 0x10000) { - /* 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx */ - dest[0] = 0xe0 | (charnum >> 12); - dest[1] = 0x80 |((charnum >> 6)&0x3f); - dest[2] = 0x80 |((charnum )&0x3f); - dest[3] = 0; - return 3; - } else if(charnum < 0x200000) { - /* 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ - dest[0] = 0xf0 | (charnum >> 18); - dest[1] = 0x80 |((charnum >> 12)&0x3f); - dest[2] = 0x80 |((charnum >> 6 )&0x3f); - dest[3] = 0x80 |((charnum )&0x3f); - dest[4] = 0; - return 4; - } else if(charnum < 0x4000000) { - /* 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ - dest[0] = 0xf8 | (charnum >> 24); - dest[1] = 0x80 |((charnum >> 18)&0x3f); - dest[2] = 0x80 |((charnum >> 12)&0x3f); - dest[3] = 0x80 |((charnum >> 6 )&0x3f); - dest[4] = 0x80 |((charnum )&0x3f); - dest[5] = 0; - return 5; - } else if(charnum < 0x80000000) { - /* 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx */ - dest[0] = 0xfc | (charnum >> 30); - dest[1] = 0x80 |((charnum >> 24)&0x3f); - dest[2] = 0x80 |((charnum >> 18)&0x3f); - dest[3] = 0x80 |((charnum >> 12)&0x3f); - dest[4] = 0x80 |((charnum >> 6 )&0x3f); - dest[5] = 0x80 |((charnum )&0x3f); - dest[6] = 0; - return 6; - } else { - fprintf(stderr, "Illegal character: 0x%08x\n", charnum); - dest[0] = 0; - return 0; - } -} - -char* getUTF8(unsigned int charnum) -{ - memset(utf8buf, 0, sizeof(utf8buf)); - writeUTF8(charnum, utf8buf); - return utf8buf; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/utf8.h b/fluidbook/tools/swftools-special-swfdump/lib/utf8.h deleted file mode 100644 index 9340ad60a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/utf8.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __utf8_h__ -#define __utf8_h__ - -#ifdef __cplusplus -extern "C" { -#endif - -int writeUTF8(unsigned int charnum, char*dest); -char* getUTF8(unsigned int charnum); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/wav.c b/fluidbook/tools/swftools-special-swfdump/lib/wav.c deleted file mode 100644 index 5bd30d792..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/wav.c +++ /dev/null @@ -1,293 +0,0 @@ -/* wav.c - Routines for handling .wav files - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "wav.h" - -struct WAVBlock { - char id[5]; - unsigned int size; -}; - -int getWAVBlock(FILE*fi, struct WAVBlock*block) -{ - unsigned int size; - unsigned char b[4]; - if(fread(block->id,1,4,fi)<4) - return 0; - block->id[4] = 0; - if(fread(b,1,4,fi)<4) - return 0; - block->size = b[0]|b[1]<<8|b[2]<<16|b[3]<<24; - /*printf("Chunk: [%c%c%c%c] (%d bytes)\n", - block->id[0],block->id[1], - block->id[2],block->id[3], - block->size);*/ - return 1; -} - -int wav_read(struct WAV*wav, const char* filename) -{ - FILE*fi = fopen(filename, "rb"); - unsigned char b[16]; - long int filesize; - struct WAVBlock block; - long int pos; - - if(!fi) - return 0; - fseek(fi, 0, SEEK_END); - filesize = ftell(fi); - fseek(fi, 0, SEEK_SET); - - //printf("Filesize: %d\n", filesize); - - if(!getWAVBlock (fi, &block)) - { - fclose(fi); - return 0; - } - if(strncmp(block.id,"RIFF",4)) - { - fprintf(stderr, "wav_read: not a WAV file\n"); - fclose(fi); - return 0; - } - if(block.size + 8 < filesize) - fprintf(stderr, "wav_read: warning - more tags (%lu extra bytes)\n", filesize - block.size - 8); - - if(block.size == filesize) - /* some buggy software doesn't generate the right tag length */ - block.size = filesize - 8; - - if(block.size + 8 > filesize) - fprintf(stderr, "wav_read: warning - short file (%lu bytes missing)\n", block.size + 8 - filesize); - if(fread(b, 1, 4, fi) < 4) - { - fclose(fi); - return 0; - } - if(strncmp((const char*)b, "WAVE", 4)) - { - fprintf(stderr, "wav_read: not a WAV file (2)\n"); - fclose(fi); - return 0; - } - - do - { - getWAVBlock(fi, &block); - pos = ftell(fi); - if(!strncmp(block.id, "fmt ", 4)) - { - if(fread(&b, 1, 16, fi)<16) - { - fclose(fi); - return 0; - } - wav->tag = b[0]|b[1]<<8; - wav->channels = b[2]|b[3]<<8; - wav->sampsPerSec = b[4]|b[5]<<8|b[6]<<16|b[7]<<24; - wav->bytesPerSec = b[8]|b[9]<<8|b[10]<<16|b[11]<<24; - wav->align = b[12]|b[13]<<8; - wav->bps = b[14]|b[15]<<8; - } - else - if (!strncmp(block.id, "LIST", 4)) - { - // subchunk ICMT (comment) may exist - } - else - if (!strncmp(block.id, "data", 4)) - { - int l; - wav->data = (unsigned char*)malloc(block.size); - if(!wav->data) - { - fprintf(stderr, "Out of memory (%d bytes needed)", block.size); - fclose(fi); - return 0; - } - l = fread(wav->data, 1, block.size, fi); - if(l<=0) { - fprintf(stderr, "Error: Couldn't read WAV data block\n"); - fclose(fi); - return 0; - } else if(l < block.size) - { - fprintf(stderr, "Warning: data block of size %d is only %d bytes (%d bytes missing)\n", block.size, l, block.size-l); - wav->size = l; - } else { - wav->size = block.size; - } - } - pos+=block.size; - fseek(fi, pos, SEEK_SET); - } - while (pos < filesize); - fclose(fi); - return 1; -} - -int wav_write(struct WAV*wav, const char*filename) -{ - FILE*fi = fopen(filename, "wb"); - char*b="RIFFWAVEfmt \x10\0\0\0data"; - char c[16]; - unsigned long int w32; - if(!fi) - return 0; - fwrite(b, 4, 1, fi); - w32=(/*fmt*/8+0x10+/*data*/8+wav->size); - c[0] = w32; - c[1] = w32>>8; - c[2] = w32>>16; - c[3] = w32>>24; - fwrite(c, 4, 1, fi); - fwrite(&b[4], 12, 1, fi); - c[0] = wav->tag; - c[1] = wav->tag>>8; - c[2] = wav->channels; - c[3] = wav->channels>>8; - c[4] = wav->sampsPerSec; - c[5] = wav->sampsPerSec>>8; - c[6] = wav->sampsPerSec>>16; - c[7] = wav->sampsPerSec>>24; - c[8] = wav->bytesPerSec; - c[9] = wav->bytesPerSec>>8; - c[10] = wav->bytesPerSec>>16; - c[11] = wav->bytesPerSec>>24; - c[12] = wav->align; - c[13] = wav->align>>8; - c[14] = wav->bps; - c[15] = wav->bps>>8; - fwrite(c, 16, 1, fi); - fwrite(&b[16], 4, 1, fi); - c[0] = wav->size; - c[1] = wav->size>>8; - c[2] = wav->size>>16; - c[3] = wav->size>>24; - fwrite(c,4,1,fi); - printf("writing %d converted bytes\n", wav->size); - fwrite(wav->data,wav->size,1,fi); - fclose(fi); - return 1; -} - -void wav_print(struct WAV*wav) -{ - printf("tag:%04x channels:%d samples/sec:%lu bytes/sec:%lu align:%d bits/sample:%d size:%d\n", - wav->tag, wav->channels, wav->sampsPerSec, wav->bytesPerSec, - wav->align, wav->bps, wav->size); -} - -int wav_convert2mono(struct WAV*src, struct WAV*dest, int rate) -{ - int samplelen=src->size/src->align; - int bps=src->bps; - double ratio; - double pos = 0; - int pos2 = 0; - int channels=src->channels; - int i; - int fill; - - dest->sampsPerSec = rate; - dest->bps = 16; - dest->channels = 1; - dest->align = 2; - dest->tag = src->tag; - dest->bytesPerSec = dest->sampsPerSec*dest->align; - - ratio = (double)dest->sampsPerSec/(double)src->sampsPerSec; - fill = (int)(ratio+1)*2; - - dest->data = (unsigned char*)malloc((int)(samplelen*ratio*2)+128); - if(!dest->data) - return 0; - dest->size = (int)(samplelen*ratio)*2; - - if(bps == 8) { - if(ratio <= 1) { - for(i=0; isize; i+=channels) { - int pos2 = ((int)pos)*2; - dest->data[pos2] = 0; - dest->data[pos2+1] = src->data[i]+128; - pos += ratio; - } - } else { - for(i=0; isize; i+=channels) { - int j; - int pos2 = ((int)pos)*2; - for(j=0;jdata[pos2+j+0] = 0; - dest->data[pos2+j+1] = src->data[i]+128; - } - pos += ratio; - } - } - } else if(bps == 16) { - if(ratio <= 1) { - for(i=0; isize/2; i+=channels) { - int pos2 = ((int)pos)*2; - dest->data[pos2+0]=src->data[i*2]; - dest->data[pos2+1]=src->data[i*2+1]; - pos += ratio; - } - } else { - for(i=0; isize/2; i+=channels) { - int j; - int pos2 = ((int)pos)*2; - for(j=0;jdata[pos2+j+0] = src->data[i*2]; - dest->data[pos2+j+1] = src->data[i*2+1]; - } - pos += ratio; - } - } - } else if(bps == 32) { - if(ratio <= 1) { - for(i=0; isize/4; i+=channels) { - int pos2 = ((int)pos)*2; - dest->data[pos2+0]=src->data[i*4+2]; - dest->data[pos2+1]=src->data[i*4+3]; - pos += ratio; - } - } else { - for(i=0; isize/4; i+=channels) { - int j; - int pos2 = ((int)pos)*2; - for(j=0;jdata[pos2+j+0] = src->data[i*4+2]; - dest->data[pos2+j+1] = src->data[i*4+3]; - } - pos += ratio; - } - } - } else { - fprintf(stderr, "Unsupported bitspersample value: %d\n", bps); - } - return 1; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/wav.h b/fluidbook/tools/swftools-special-swfdump/lib/wav.h deleted file mode 100644 index 8f253266e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/wav.h +++ /dev/null @@ -1,26 +0,0 @@ -/* wav.h - Header file for wav.c - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This file is distributed under the GPL, see file COPYING for details */ - -struct WAV { - unsigned short tag; - unsigned short channels; - unsigned long sampsPerSec; - unsigned long bytesPerSec; - unsigned short align; - unsigned short bps; - - unsigned char*data; - unsigned int size; -}; - -int wav_read(struct WAV*wav, const char* filename); -int wav_write(struct WAV*wav, const char*filename); -void wav_print(struct WAV*wav); -int wav_convert2mono(struct WAV*src, struct WAV*dest, int rate); - diff --git a/fluidbook/tools/swftools-special-swfdump/lib/xml.c b/fluidbook/tools/swftools-special-swfdump/lib/xml.c deleted file mode 100644 index ff65c9eff..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/xml.c +++ /dev/null @@ -1,382 +0,0 @@ -/* xml.c - Lightweight and fast xml parser. - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include "xml.h" - -/* -group: 0=data 1=whitespace 2='"' 3='<' 4='>' 5='&' 6=';' 7='?' 8='/' 9='=' 10='!' 11=EOF -*/ - -static int group[256] = -{ -// 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f -// \t \n \r - 13, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, -// 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f -// - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f -// ! " # $ % & ' ( ) * + , - . / - 1,10, 2, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 8, -// 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f -// 0 1 2 3 4 5 6 7 8 9 : ; < = > ? - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 9, 4, 7, -// 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f -// @ A B C D E F G H I J K L M N O - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f -// P Q R S T U V W X Y Z [ \ ] ^ _ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,11, 0,12, 0, 0, -// 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f -// ` a b c d e f g h i j k l m n o - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f -// p q r s t u v w x y z { | } ~ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f -// - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f -// - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af -// - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf -// - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf -// - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df -// - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef -// - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -// f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff -// - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static const char*errors[]= -{ - 0, -#define E1 -0x41 - /*E1*/"xml file must start with & ; ? / = ! [ ] - EOB*/ - /* 0 */{ E1, 0,E1, 1,E1,E1,E1,E1,E1,E1,E3,E1,E1,-63}, // .< - /* 1 */{ E1,E1,E1,E1,E1,E1,E1, 9,E1,E1,E3,E1,E1,-63}, // <.? - /* 2 */{ -3, 2,E3,E2,E2,E2,E2,E2,12,E2,16,E2,E2,-63}, // <. - /* 3 */{ E3,E3,E3,E3,-1,E3,E3,E3,E3,E1,E3,E3,E3,-63}, // < /.> - /* 4 */{ E3,E3,E3,E3,-2,E3,E3,E3,E3,E1,E1,E3,E3,-63}, // < .> - /* 5 */{ 5, 5, 5,-4, 5, 5, 5, 5, 5, 5, 5,E3,E3,-63}, // da.ta - /* 6 */{ 6,-7,E3,E2,-6,E2,E2,E3,-9,E3,E3,E3,E3,-63}, // %d\n", - buffer[pos], state, new_state[state][group[buffer[pos]]]);*/ - - /* inner loop */ - do { - state = new_state[old=state][group[(unsigned char)buffer[pos++]]]; - } while(state>=0); - - switch(state) { - tag_stack_t*st; - xmlattribute_t*a; - case -63: // end of buffer - if(pos!=num+1) { - // we could backtrace, but the spec says this is indeed illegal - fprintf(stderr, "error: xml contains \\0 chars\n"); - return 0; - } - // undo - pos = num; - state = old; - break; - case -1: // self closing tag - attributes = attributes_reverse(attributes); - out->start_tag(out, tagname.result, attributes); - out->end_tag(out, tagname.result); - stringstate_clear(&tagname); - attributes_free(attributes);attributes = 0; - stringstate_start(&data, buffer, pos); - state = 5; - break; - case -6: // after - stringstate_finish(&tagname, buffer, pos-1); - // fallthrough - case -2: // . - st = malloc(sizeof(tag_stack_t)); - st->name = tagname.result; - st->prev = stack; - stack = st; - attributes = attributes_reverse(attributes); - if(!first) out->start_tag(out, tagname.result, attributes); - attributes_free(attributes);attributes = 0; - stringstate_start(&data, buffer, pos); - state = 5; - break; - case -3: case -13: // after <, start of tag name - first=0; - stringstate_start(&tagname, buffer, pos-1); - state = state==-3?6:13; - break; - case -14: // after , end of tag name - stringstate_finish(&tagname, buffer, pos-1); - // fallthrough - case -15: // after - out->end_tag(out, tagname.result); - stringstate_clear(&tagname); - stringstate_start(&data, buffer, pos); - state = 5; - break; - case -4: // end of data - stringstate_finish(&data, buffer, pos-1); - if(!first) out->data(out, data.result, data.len); - stringstate_clear(&data); - state = 2; - break; - case -7: // after <, at whitespace, end of tag name - stringstate_finish(&tagname, buffer, pos-1); - state = 7; - break; - case -8: // inside tag, start of attribute name - stringstate_start(&attr_name, buffer, pos-1); - state = 8; - break; - case -9: - stringstate_finish(&tagname, buffer, pos-1); - state = 3; - break; - case -12: // end of attribute name, at ws - stringstate_finish(&attr_name, buffer, pos-1); - state = 15; - break; - case -10: // end of attribute name, at = - stringstate_finish(&attr_name, buffer, pos-1); - state = 10; - break; - case -11: // start of attribute value - stringstate_start(&attr_value, buffer, pos); - state = 11; - break; - case -5: // end of attribute value - stringstate_finish(&attr_value, buffer, pos-1); - a = malloc(sizeof(xmlattribute_t)); - a->name = attr_name.result;attr_name.result=0; - a->value = attr_value.result;attr_value.result=0; - a->next = attributes; - attributes = a; - state = 7; - break; - case -20: - state = 5; - break; - default: - if(-state&0x40) { - fprintf(stderr, "%s (state %d, char '%c')\n", errors[(-state)&0x3f], old, buffer[pos-1]); - return 0; - } else { - fprintf(stderr, "internal error: no action %d\n", state); - } - return 0; - break; - } - } - stringstate_save(&tagname, buffer, pos); - stringstate_save(&attr_name, buffer, pos); - stringstate_save(&attr_value, buffer, pos); - stringstate_save(&data, buffer, pos); - } - - /* note: any of these except data *has* to be empty for a well formed xml */ - stringstate_clear(&tagname); - stringstate_clear(&attr_name); - stringstate_clear(&attr_value); - stringstate_clear(&data); - - while(stack) { - tag_stack_t*next = stack->prev; - free((void*)stack->name); - free(stack); - stack = next; - } - return 1; -} - -#ifdef MAIN -void my_start_tag(xmlconsumer_t*c, char*name, xmlattribute_t*attr) -{ - printf("<%s", name); - for(;attr;attr=attr->next) { - printf(" %s=\"%s\"", attr->name, attr->value); - } - printf(">"); -} -void my_data(xmlconsumer_t*c, char*data, int len) -{ - printf("%s", data); -} -void my_end_tag(xmlconsumer_t*c, char*name) -{ - printf("", name); -} -int main() -{ - xmlconsumer_t c = {my_start_tag, my_data, my_end_tag, 0}; - - reader_t r; - reader_init_filereader2(&r, "test.xml"); - xml_parse(&r, &c); - r.dealloc(&r); - printf("\n"); -} -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/lib/xml.h b/fluidbook/tools/swftools-special-swfdump/lib/xml.h deleted file mode 100644 index 206970acb..000000000 --- a/fluidbook/tools/swftools-special-swfdump/lib/xml.h +++ /dev/null @@ -1,42 +0,0 @@ -/* xml.h - Lightweight and fast xml parser. - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __xml_h__ -#define __xml_h__ - -#include "bitio.h" - -typedef struct _xmlattribute { - const char*name; - const char*value; - struct _xmlattribute*next; -} xmlattribute_t; - -typedef struct _xmlconsumer { - void (*start_tag)(struct _xmlconsumer*, char*name, xmlattribute_t*attributes); - void (*data)(struct _xmlconsumer*, char*data, int len); - void (*end_tag)(struct _xmlconsumer*, char*name); - void*internal; -} xmlconsumer_t; - -int xml_parse(reader_t*reader, xmlconsumer_t*out); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/ltmain.sh b/fluidbook/tools/swftools-special-swfdump/ltmain.sh deleted file mode 100644 index e589475dd..000000000 --- a/fluidbook/tools/swftools-special-swfdump/ltmain.sh +++ /dev/null @@ -1,6975 +0,0 @@ -# ltmain.sh - Provide generalized library-building support services. -# NOTE: Changing this file will not affect anything until you rerun configure. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008 Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 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. -# -# 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. - -basename="s,^.*/,,g" - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath="$0" - -# The name of this program: -progname=`echo "$progpath" | $SED $basename` -modename="$progname" - -# Global variables: -EXIT_SUCCESS=0 -EXIT_FAILURE=1 - -PROGRAM=ltmain.sh -PACKAGE=libtool -VERSION=1.5.26 -TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" - -# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# Check that we have a working $echo. -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : -else - # Restart under the correct shell, and then maybe $echo will work. - exec $SHELL "$progpath" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <&2 - $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit $EXIT_FAILURE -fi - -# Global variables. -mode=$default_mode -nonopt= -prev= -prevopt= -run= -show="$echo" -show_help= -execute_dlfiles= -duplicate_deps=no -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" -extracted_archives= -extracted_serial=0 - -##################################### -# Shell function definitions: -# This seems to be the best place for them - -# func_mktempdir [string] -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, STRING is the basename for that directory. -func_mktempdir () -{ - my_template="${TMPDIR-/tmp}/${1-$progname}" - - if test "$run" = ":"; then - # Return a directory name, but don't create it in dry-run mode - my_tmpdir="${my_template}-$$" - else - - # If mktemp works, use that first and foremost - my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` - - if test ! -d "$my_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" - - save_mktempdir_umask=`umask` - umask 0077 - $mkdir "$my_tmpdir" - umask $save_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$my_tmpdir" || { - $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 - exit $EXIT_FAILURE - } - fi - - $echo "X$my_tmpdir" | $Xsed -} - - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -func_win32_libid () -{ - win32_libid_type="unknown" - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ - $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then - win32_nmres=`eval $NM -f posix -A $1 | \ - $SED -n -e '1,100{ - / I /{ - s,.*,import, - p - q - } - }'` - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $echo $win32_libid_type -} - - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - CC_quoted="$CC_quoted $arg" - done - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - CC_quoted="$CC_quoted $arg" - done - # user sometimes does CC=-gcc so we need to match that to 'gcc' - trimedcc=`echo ${CC} | $SED -e "s/${host}-//g"` - # and sometimes libtool has CC=-gcc but user does CC=gcc - extendcc=${host}-${CC} - # and sometimes libtool has CC=-gcc but user has CC=-gcc - # (Gentoo-specific hack because we always export $CHOST) - mungedcc=${CHOST-${host}}-${trimedcc} - case "$@ " in - "cc "* | " cc "* | "${host}-cc "* | " ${host}-cc "*|\ - "gcc "* | " gcc "* | "${host}-gcc "* | " ${host}-gcc "*) - tagname=CC - break ;; - "$trimedcc "* | " $trimedcc "* | "`$echo $trimedcc` "* | " `$echo $trimedcc` "*|\ - "$extendcc "* | " $extendcc "* | "`$echo $extendcc` "* | " `$echo $extendcc` "*|\ - "$mungedcc "* | " $mungedcc "* | "`$echo $mungedcc` "* | " `$echo $mungedcc` "*|\ - " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - $echo "$modename: unable to infer tagged configuration" - $echo "$modename: specify a tag with \`--tag'" 1>&2 - exit $EXIT_FAILURE -# else -# $echo "$modename: using $tagname tagged configuration" - fi - ;; - esac - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - - $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" - $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 - exit $EXIT_FAILURE - fi -} - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - my_status="" - - $show "${rm}r $my_gentop" - $run ${rm}r "$my_gentop" - $show "$mkdir $my_gentop" - $run $mkdir "$my_gentop" - my_status=$? - if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then - exit $my_status - fi - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - extracted_serial=`expr $extracted_serial + 1` - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" - - $show "${rm}r $my_xdir" - $run ${rm}r "$my_xdir" - $show "$mkdir $my_xdir" - $run $mkdir "$my_xdir" - exit_status=$? - if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then - exit $exit_status - fi - case $host in - *-darwin*) - $show "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - if test -z "$run"; then - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` - darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` - if test -n "$darwin_arches"; then - darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - $show "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" - lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" - cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" - func_extract_an_archive "`pwd`" "${darwin_base_archive}" - cd "$darwin_curdir" - $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" - done # $darwin_arches - ## Okay now we have a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` - lipo -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - ${rm}r unfat-$$ - cd "$darwin_orig_dir" - else - cd "$darwin_orig_dir" - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - fi # $run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` - done - func_extract_archives_result="$my_oldobjs" -} -# End of Shell function definitions -##################################### - -# Darwin sucks -eval std_shrext=\"$shrext_cmds\" - -disable_libs=no - -# Parse our command line options once, thoroughly. -while test "$#" -gt 0 -do - arg="$1" - shift - - case $arg in - -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - execute_dlfiles) - execute_dlfiles="$execute_dlfiles $arg" - ;; - tag) - tagname="$arg" - preserve_args="${preserve_args}=$arg" - - # Check whether tagname contains only valid characters - case $tagname in - *[!-_A-Za-z0-9,/]*) - $echo "$progname: invalid tag name: $tagname" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - case $tagname in - CC) - # Don't test for the "default" C tag, as we know, it's there, but - # not specially marked. - ;; - *) - if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then - taglist="$taglist $tagname" - # Evaluate the configuration. - eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" - else - $echo "$progname: ignoring unknown tag $tagname" 1>&2 - fi - ;; - esac - ;; - *) - eval "$prev=\$arg" - ;; - esac - - prev= - prevopt= - continue - fi - - # Have we seen a non-optional argument yet? - case $arg in - --help) - show_help=yes - ;; - - --version) - echo "\ -$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP - -Copyright (C) 2008 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." - exit $? - ;; - - --config) - ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath - # Now print the configurations for the tags. - for tagname in $taglist; do - ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" - done - exit $? - ;; - - --debug) - $echo "$progname: enabling shell trace mode" - set -x - preserve_args="$preserve_args $arg" - ;; - - --dry-run | -n) - run=: - ;; - - --features) - $echo "host: $host" - if test "$build_libtool_libs" = yes; then - $echo "enable shared libraries" - else - $echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - $echo "enable static libraries" - else - $echo "disable static libraries" - fi - exit $? - ;; - - --finish) mode="finish" ;; - - --mode) prevopt="--mode" prev=mode ;; - --mode=*) mode="$optarg" ;; - - --preserve-dup-deps) duplicate_deps="yes" ;; - - --quiet | --silent) - show=: - preserve_args="$preserve_args $arg" - ;; - - --tag) - prevopt="--tag" - prev=tag - preserve_args="$preserve_args --tag" - ;; - --tag=*) - set tag "$optarg" ${1+"$@"} - shift - prev=tag - preserve_args="$preserve_args --tag" - ;; - - -dlopen) - prevopt="-dlopen" - prev=execute_dlfiles - ;; - - -*) - $echo "$modename: unrecognized option \`$arg'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; - - *) - nonopt="$arg" - break - ;; - esac -done - -if test -n "$prevopt"; then - $echo "$modename: option \`$prevopt' requires an argument" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE -fi - -case $disable_libs in -no) - ;; -shared) - build_libtool_libs=no - build_old_libs=yes - ;; -static) - build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` - ;; -esac - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -if test -z "$show_help"; then - - # Infer the operation mode. - if test -z "$mode"; then - $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 - $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 - case $nonopt in - *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) - mode=link - for arg - do - case $arg in - -c) - mode=compile - break - ;; - esac - done - ;; - *db | *dbx | *strace | *truss) - mode=execute - ;; - *install*|cp|mv) - mode=install - ;; - *rm) - mode=uninstall - ;; - *) - # If we have no mode, but dlfiles were specified, then do execute mode. - test -n "$execute_dlfiles" && mode=execute - - # Just use the default operation mode. - if test -z "$mode"; then - if test -n "$nonopt"; then - $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 - else - $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 - fi - fi - ;; - esac - fi - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$execute_dlfiles" && test "$mode" != execute; then - $echo "$modename: unrecognized option \`-dlopen'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$modename --help --mode=$mode' for more information." - - # These modes are in order of execution frequency so that they run quickly. - case $mode in - # libtool compile mode - compile) - modename="$modename: compile" - # Get the compilation command and the source file. - base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg="$arg" - arg_mode=normal - ;; - - target ) - libobj="$arg" - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - if test -n "$libobj" ; then - $echo "$modename: you cannot specify \`-o' more than once" 1>&2 - exit $EXIT_FAILURE - fi - arg_mode=target - continue - ;; - - -static | -prefer-pic | -prefer-non-pic) - later="$later $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - lastarg="$lastarg $arg" - done - IFS="$save_ifs" - lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` - - # Add the arguments to base_compile. - base_compile="$base_compile $lastarg" - continue - ;; - - * ) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg="$srcfile" - srcfile="$arg" - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` - - case $lastarg in - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, and some SunOS ksh mistreat backslash-escaping - # in scan sets (worked around with variable expansion), - # and furthermore cannot handle '|' '&' '(' ')' in scan sets - # at all, so we specify them separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - lastarg="\"$lastarg\"" - ;; - esac - - base_compile="$base_compile $lastarg" - done # for arg - - case $arg_mode in - arg) - $echo "$modename: you must specify an argument for -Xcompile" - exit $EXIT_FAILURE - ;; - target) - $echo "$modename: you must specify a target with \`-o'" 1>&2 - exit $EXIT_FAILURE - ;; - *) - # Get the name of the library object. - [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - xform='[cCFSifmso]' - case $libobj in - *.ada) xform=ada ;; - *.adb) xform=adb ;; - *.ads) xform=ads ;; - *.asm) xform=asm ;; - *.c++) xform=c++ ;; - *.cc) xform=cc ;; - *.ii) xform=ii ;; - *.class) xform=class ;; - *.cpp) xform=cpp ;; - *.cxx) xform=cxx ;; - *.[fF][09]?) xform=[fF][09]. ;; - *.for) xform=for ;; - *.java) xform=java ;; - *.obj) xform=obj ;; - *.sx) xform=sx ;; - esac - - libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` - - case $libobj in - *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; - *) - $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -static) - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` - case $qlibobj in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - qlibobj="\"$qlibobj\"" ;; - esac - test "X$libobj" != "X$qlibobj" \ - && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." - objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir= - else - xdir=$xdir/ - fi - lobj=${xdir}$objdir/$objname - - if test -z "$base_compile"; then - $echo "$modename: you must specify a compilation command" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - $run $rm $removelist - trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2*) - pic_mode=default - ;; - esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - removelist="$removelist $output_obj $lockfile" - trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until $run ln "$srcfile" "$lockfile" 2>/dev/null; do - $show "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - $echo "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit $EXIT_FAILURE - fi - $echo "$srcfile" > "$lockfile" - fi - - if test -n "$fix_srcfile_path"; then - eval srcfile=\"$fix_srcfile_path\" - fi - qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` - case $qsrcfile in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - qsrcfile="\"$qsrcfile\"" ;; - esac - - $run $rm "$libobj" "${libobj}T" - - # Create a libtool object file (analogous to a ".la" file), - # but don't create it if we're doing a dry run. - test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then - $echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - $show "$mv $output_obj $lobj" - if $run $mv $output_obj $lobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Append the name of the PIC object to the libtool object file. - test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then - $echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - $show "$mv $output_obj $obj" - if $run $mv $output_obj $obj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Append the name of the non-PIC object the libtool object file. - # Only append if the libtool object file exists. - test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg="$1" - shift - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test - ;; - *) qarg=$arg ;; - esac - libtool_args="$libtool_args $qarg" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - compile_command="$compile_command @OUTPUT@" - finalize_command="$finalize_command @OUTPUT@" - ;; - esac - - case $prev in - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - compile_command="$compile_command @SYMFILE@" - finalize_command="$finalize_command @SYMFILE@" - preload=yes - fi - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - else - dlprefiles="$dlprefiles $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - if test ! -f "$arg"; then - $echo "$modename: symbol file \`$arg' does not exist" - exit $EXIT_FAILURE - fi - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - inst_prefix) - inst_prefix_dir="$arg" - prev= - continue - ;; - precious_regex) - precious_files_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat $save_arg` - do -# moreargs="$moreargs $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - pic_object= - non_pic_object= - - # Read the .lo file - # If there is no directory component, then add one. - case $arg in - */* | *\\*) . $arg ;; - *) . ./$arg ;; - esac - - if test -z "$pic_object" || \ - test -z "$non_pic_object" || - test "$pic_object" = none && \ - test "$non_pic_object" = none; then - $echo "$modename: cannot find name of object for \`$arg'" 1>&2 - exit $EXIT_FAILURE - fi - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - libobjs="$libobjs $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if test -z "$run"; then - $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 - exit $EXIT_FAILURE - else - # Dry-run case. - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` - non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - fi - done - else - $echo "$modename: link input file \`$save_arg' does not exist" - exit $EXIT_FAILURE - fi - arg=$save_arg - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit $EXIT_FAILURE - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) rpath="$rpath $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) xrpath="$xrpath $arg" ;; - esac - fi - prev= - continue - ;; - xcompiler) - compiler_flags="$compiler_flags $qarg" - prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" - continue - ;; - xlinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $wl$qarg" - prev= - compile_command="$compile_command $wl$qarg" - finalize_command="$finalize_command $wl$qarg" - continue - ;; - xcclinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $qarg" - prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" - continue - ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - darwin_framework|darwin_framework_skip) - test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - prev= - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg="$arg" - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 - continue - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: more than one -exported-symbols argument is not allowed" - exit $EXIT_FAILURE - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework|-arch|-isysroot) - case " $CC " in - *" ${arg} ${1} "* | *" ${arg} ${1} "*) - prev=darwin_framework_skip ;; - *) compiler_flags="$compiler_flags $arg" - prev=darwin_framework ;; - esac - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - ;; - esac - continue - ;; - - -L*) - dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 - absdir="$dir" - notinst_path="$notinst_path $dir" - fi - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "*) ;; - *) - deplibs="$deplibs -L$dir" - lib_search_path="$lib_search_path $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - *) dllsearchpath="$dllsearchpath:$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - *) dllsearchpath="$dllsearchpath:$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - deplibs="$deplibs -framework System" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test "X$arg" = "X-lc" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test "X$arg" = "X-lc" && continue - ;; - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - deplibs="$deplibs $arg" - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - -model) - compile_command="$compile_command $arg" - compiler_flags="$compiler_flags $arg" - finalize_command="$finalize_command $arg" - prev=xcompiler - continue - ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - compiler_flags="$compiler_flags $arg" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - continue - ;; - - -multi_module) - single_module="${wl}-multi_module" - continue - ;; - - -module) - module=yes - continue - ;; - - # -64, -mips[0-9] enable 64-bit mode on the SGI compiler - # -r[0-9][0-9]* specifies the processor on the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler - # +DA*, +DD* enable 64-bit mode on the HP compiler - # -q* pass through compiler args for the IBM compiler - # -m* pass through architecture-specific compiler args for GCC - # -m*, -t[45]*, -txscale* pass through architecture-specific - # compiler args for GCC - # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC - # -F/path gives path to uninstalled frameworks, gcc on darwin - # @file GCC response files - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) - - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - compiler_flags="$compiler_flags $arg" - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 - $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit $EXIT_FAILURE - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - continue - ;; - - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case $flag in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Wl,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case $flag in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $wl$flag" - linker_flags="$linker_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # Some other compiler flag. - -* | +*) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - - *.$objext) - # A standard object. - objs="$objs $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - pic_object= - non_pic_object= - - # Read the .lo file - # If there is no directory component, then add one. - case $arg in - */* | *\\*) . $arg ;; - *) . ./$arg ;; - esac - - if test -z "$pic_object" || \ - test -z "$non_pic_object" || - test "$pic_object" = none && \ - test "$non_pic_object" = none; then - $echo "$modename: cannot find name of object for \`$arg'" 1>&2 - exit $EXIT_FAILURE - fi - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles $pic_object" - prev= - fi - - # A PIC object. - libobjs="$libobjs $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - non_pic_objects="$non_pic_objects $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if test -z "$run"; then - $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 - exit $EXIT_FAILURE - else - # Dry-run case. - - # Extract subdirectory from the argument. - xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$arg"; then - xdir= - else - xdir="$xdir/" - fi - - pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` - non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` - libobjs="$libobjs $pic_object" - non_pic_objects="$non_pic_objects $non_pic_object" - fi - fi - ;; - - *.$libext) - # An archive. - deplibs="$deplibs $arg" - old_deplibs="$old_deplibs $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - dlfiles="$dlfiles $arg" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - dlprefiles="$dlprefiles $arg" - prev= - else - deplibs="$deplibs $arg" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - done # argument parsing loop - - if test -n "$prev"; then - $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` - if test "X$output_objdir" = "X$output"; then - output_objdir="$objdir" - else - output_objdir="$output_objdir/$objdir" - fi - # Create the object directory. - if test ! -d "$output_objdir"; then - $show "$mkdir $output_objdir" - $run $mkdir $output_objdir - exit_status=$? - if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then - exit $exit_status - fi - fi - - # Determine the type of output - case $output in - "") - $echo "$modename: you must specify an output file" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - case $host in - *cygwin* | *mingw* | *pw32*) - # don't eliminate duplications in $postdeps and $predeps - duplicate_compiler_generated_deps=yes - ;; - *) - duplicate_compiler_generated_deps=$duplicate_deps - ;; - esac - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if test "X$duplicate_deps" = "Xyes" ; then - case "$libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - libs="$libs $deplib" - done - - if test "$linkmode" = lib; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; - esac - pre_post_deps="$pre_post_deps $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - case $linkmode in - lib) - passes="conv link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 - exit $EXIT_FAILURE - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - for pass in $passes; do - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" - deplibs= - fi - if test "$linkmode" = prog; then - case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; - link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; - esac - fi - if test "$pass" = dlopen; then - # Collect dlpreopened libraries - save_deplibs="$deplibs" - deplibs= - fi - for deplib in $libs; do - lib= - found=no - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - compiler_flags="$compiler_flags $deplib" - fi - continue - ;; - -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 - continue - fi - name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` - if test "$linkmode" = lib; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib="$searchdir/lib${name}${search_ext}" - if test -f "$lib"; then - if test "$search_ext" = ".la"; then - found=yes - else - found=no - fi - break 2 - fi - done - done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - else # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $deplib "*) - if (${SED} -e '2q' $lib | - grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - library_names= - old_library= - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - for l in $old_library $library_names; do - ll="$l" - done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no - ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` - test "X$ladir" = "X$lib" && ladir="." - lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - fi - ;; # -l - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test "$pass" = conv && continue - newdependency_libs="$deplib $newdependency_libs" - newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - ;; - prog) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - if test "$pass" = scan; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - ;; - *) - $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test "$pass" = link; then - dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) lib="$deplib" ;; - *.$libext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method - match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` - if eval $echo \"$deplib\" 2>/dev/null \ - | $SED 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=yes - fi - ;; - pass_all) - valid_a_lib=yes - ;; - esac - if test "$valid_a_lib" != yes; then - $echo - $echo "*** Warning: Trying to link with static lib archive $deplib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because the file extensions .$libext of this argument makes me believe" - $echo "*** that it is just a static archive that I should not used here." - else - $echo - $echo "*** Warning: Linking the shared library $output against the" - $echo "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - continue - ;; - prog) - if test "$pass" != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test "$pass" = conv; then - deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - newdlprefiles="$newdlprefiles $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - newdlfiles="$newdlfiles $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - if test "$found" = yes || test -f "$lib"; then : - else - $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 - exit $EXIT_FAILURE - fi - - # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - - ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` - test "X$ladir" = "X$lib" && ladir="." - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && dlfiles="$dlfiles $dlopen" - test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" - fi - - if test "$pass" = conv; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit $EXIT_FAILURE - fi - # It is a libtool convenience library, so add in its objects. - convenience="$convenience $ladir/$objdir/$old_library" - old_convenience="$old_convenience $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if test "X$duplicate_deps" = "Xyes" ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done - elif test "$linkmode" != prog && test "$linkmode" != lib; then - $echo "$modename: \`$lib' is not a convenience library" 1>&2 - exit $EXIT_FAILURE - fi - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - for l in $old_library $library_names; do - linklib="$l" - done - if test -z "$linklib"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit $EXIT_FAILURE - fi - - # This library was specified with -dlopen. - if test "$pass" = dlopen; then - if test -z "$libdir"; then - $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 - exit $EXIT_FAILURE - fi - if test -z "$dlname" || - test "$dlopen_support" != yes || - test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - dlprefiles="$dlprefiles $lib $dependency_libs" - else - newdlfiles="$newdlfiles $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 - $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 - abs_ladir="$ladir" - fi - ;; - esac - laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - $echo "$modename: warning: library \`$lib' was moved." 1>&2 - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$libdir" - absdir="$libdir" - fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir="$ladir" - absdir="$abs_ladir" - # Remove this search path later - notinst_path="$notinst_path $abs_ladir" - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - notinst_path="$notinst_path $abs_ladir" - fi - fi # $installed = yes - name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - - # This library was specified with -dlpreopen. - if test "$pass" = dlpreopen; then - if test -z "$libdir"; then - $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 - exit $EXIT_FAILURE - fi - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - newdlprefiles="$newdlprefiles $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - newdlprefiles="$newdlprefiles $dir/$dlname" - else - newdlprefiles="$newdlprefiles $dir/$linklib" - fi - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test "$linkmode" = lib; then - deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test "$linkmode" = prog && test "$pass" != link; then - newlib_search_path="$newlib_search_path $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test - esac - # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if test "X$duplicate_deps" = "Xyes" ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test "$linkmode,$pass" = "prog,link"; then - if test -n "$library_names" && - { { test "$prefer_static_libs" = no || - test "$prefer_static_libs,$installed" = "built,yes"; } || - test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath " in - *" $dir "*) ;; - *" $absdir "*) ;; - *) temp_rpath="$temp_rpath $absdir" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test "$use_static_libs" = built && test "$installed" = yes ; then - use_static_libs=no - fi - if test -n "$library_names" && - { test "$use_static_libs" = no || test -z "$old_library"; }; then - if test "$installed" = no; then - notinst_deplibs="$notinst_deplibs $lib" - need_relink=yes - fi - # This is a shared library - - # Warn about portability, can't link against -module's on - # some systems (darwin) - if test "$shouldnotlink" = yes && test "$pass" = link ; then - $echo - if test "$linkmode" = prog; then - $echo "*** Warning: Linking the executable $output against the loadable module" - else - $echo "*** Warning: Linking the shared library $output against the loadable module" - fi - $echo "*** $linklib is not portable!" - fi - if test "$linkmode" = lib && - test "$hardcode_into_libs" = yes; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - realname="$2" - shift; shift - libname=`eval \\$echo \"$libname_spec\"` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname="$dlname" - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw*) - major=`expr $current - $age` - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - soname=`$echo $soroot | ${SED} -e 's/^.*\///'` - newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - $show "extracting exported symbol list from \`$soname'" - save_ifs="$IFS"; IFS='~' - cmds=$extract_expsyms_cmds - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - $show "generating import library for \`$soname'" - save_ifs="$IFS"; IFS='~' - cmds=$old_archive_from_expsyms_cmds - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test "$linkmode" = prog || test "$mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" - case $host in - *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; - *-*-sysv4*uw2*) add_dir="-L$dir" ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir="-L$dir" ;; - *-*-darwin* ) - # if the lib is a module then we can not link against - # it, someone is ignoring the new warnings I added - if /usr/bin/file -L $add 2> /dev/null | - $EGREP ": [^:]* bundle" >/dev/null ; then - $echo "** Warning, lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then - $echo - $echo "** And there doesn't seem to be a static archive available" - $echo "** The link will probably fail, sorry" - else - add="$dir/$old_library" - fi - fi - esac - elif test "$hardcode_minus_L" = no; then - case $host in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$dir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - add_dir="$add_dir -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - $echo "$modename: configuration error: unsupported hardcode properties" - exit $EXIT_FAILURE - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; - esac - fi - if test "$linkmode" = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && \ - test "$hardcode_minus_L" != yes && \ - test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - fi - fi - fi - - if test "$linkmode" = prog || test "$mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - add="-l$name" - elif test "$hardcode_automatic" = yes; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" - else - add="$libdir/$linklib" - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - add_dir="$add_dir -L$inst_prefix_dir$libdir" - ;; - esac - fi - add="-l$name" - fi - - if test "$linkmode" = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test "$linkmode" = prog; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - $echo - $echo "*** Warning: This system can not link to static lib archive $lib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then - $echo "*** But as you try to build a module library, libtool will still create " - $echo "*** a static module, that should work as long as the dlopening application" - $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - $echo - $echo "*** However, this would only work if libtool was able to extract symbol" - $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - $echo "*** not find such a program. So, this module is probably useless." - $echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test "$linkmode" = lib; then - if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || - test "$build_old_libs" = yes || - test "$link_static" = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) xrpath="$xrpath $temp_xrpath";; - esac;; - *) temp_deplibs="$temp_deplibs $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - newlib_search_path="$newlib_search_path $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - if test "X$duplicate_deps" = "Xyes" ; then - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - fi - tmp_libs="$tmp_libs $deplib" - done - - if test "$link_all_deplibs" != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - case $deplib in - -L*) path="$deplib" ;; - *.la) - dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$deplib" && dir="." - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 - absdir="$dir" - fi - ;; - esac - if grep "^installed=no" $deplib > /dev/null; then - path="$absdir/$objdir" - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - if test "$absdir" != "$libdir"; then - $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 - fi - path="$absdir" - fi - depdepl= - case $host in - *-*-darwin*) - # we do not want to link against static libs, - # but need to link against shared - eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names" ; then - for tmp in $deplibrary_names ; do - depdepl=$tmp - done - if test -f "$deplibdir/$depdepl" ; then - depdepl="$deplibdir/$depdepl" - elif test -f "$path/$depdepl" ; then - depdepl="$path/$depdepl" - else - # Can't find it, oh well... - depdepl= - fi - # do not add paths which are already there - case " $newlib_search_path " in - *" $path "*) ;; - *) newlib_search_path="$newlib_search_path $path";; - esac - fi - path="" - ;; - *) - path="-L$path" - ;; - esac - ;; - -l*) - case $host in - *-*-darwin*) - # Again, we only want to link against shared libraries - eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` - for tmp in $newlib_search_path ; do - if test -f "$tmp/lib$tmp_libs.dylib" ; then - eval depdepl="$tmp/lib$tmp_libs.dylib" - break - fi - done - path="" - ;; - *) continue ;; - esac - ;; - *) continue ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - case " $deplibs " in - *" $depdepl "*) ;; - *) deplibs="$depdepl $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - dependency_libs="$newdependency_libs" - if test "$pass" = dlpreopen; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test "$pass" != dlopen; then - if test "$pass" != conv; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) lib_search_path="$lib_search_path $dir" ;; - esac - done - newlib_search_path= - fi - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs ; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i="" - ;; - esac - if test -n "$i" ; then - tmp_libs="$tmp_libs $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test "$linkmode" = prog; then - dlfiles="$newdlfiles" - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - case " $deplibs" in - *\ -l* | *\ -L*) - $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; - esac - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 - fi - - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 - fi - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - objs="$objs$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - if test "$module" = no; then - $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 - exit $EXIT_FAILURE - else - $echo - $echo "*** Warning: Linking the shared library $output against the non-libtool" - $echo "*** objects $objs is not portable!" - libobjs="$libobjs $objs" - fi - fi - - if test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 - fi - - set dummy $rpath - if test "$#" -gt 2; then - $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 - fi - install_libdir="$2" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 - fi - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - IFS="$save_ifs" - - if test -n "$8"; then - $echo "$modename: too many parameters to \`-version-info'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major="$2" - number_minor="$3" - number_revision="$4" - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # which has an extra 1 added just for fun - # - case $version_type in - darwin|linux|osf|windows|none) - current=`expr $number_major + $number_minor` - age="$number_minor" - revision="$number_revision" - ;; - freebsd-aout|freebsd-elf|sunos) - current="$number_major" - revision="$number_minor" - age="0" - ;; - irix|nonstopux) - current=`expr $number_major + $number_minor` - age="$number_minor" - revision="$number_minor" - lt_irix_increment=no - ;; - esac - ;; - no) - current="$2" - revision="$3" - age="$4" - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - if test "$age" -gt "$current"; then - $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit $EXIT_FAILURE - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - minor_current=`expr $current + 1` - xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current"; - ;; - - irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then - major=`expr $current - $age` - else - major=`expr $current - $age + 1` - fi - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring="$verstring_prefix$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test "$loop" -ne 0; do - iface=`expr $revision - $loop` - loop=`expr $loop - 1` - verstring="$verstring_prefix$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - ;; - - osf) - major=.`expr $current - $age` - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test "$loop" -ne 0; do - iface=`expr $current - $loop` - loop=`expr $loop - 1` - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - verstring="$verstring:${current}.0" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - major=`expr $current - $age` - versuffix="-$major" - ;; - - *) - $echo "$modename: unknown library version type \`$version_type'" 1>&2 - $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit $EXIT_FAILURE - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring="0.0" - ;; - esac - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - fi - - if test "$mode" != relink; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$echo "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - if test "X$precious_files_regex" != "X"; then - if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - removelist="$removelist $p" - ;; - *) ;; - esac - done - if test -n "$removelist"; then - $show "${rm}r $removelist" - $run ${rm}r $removelist - fi - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - oldlibs="$oldlibs $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` - # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` - # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` - #done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - temp_xrpath="$temp_xrpath -R$libdir" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) dlfiles="$dlfiles $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) dlprefiles="$dlprefiles $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - deplibs="$deplibs -framework System" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then - deplibs="$deplibs -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $rm conftest.c - cat > conftest.c </dev/null` - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null \ - | grep " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ - | ${SED} 10q \ - | $EGREP "$file_magic_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - $echo - $echo "*** Warning: linker path does not have real file for library $a_deplib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $echo "*** with $libname but no candidates were found. (...for file magic test)" - else - $echo "*** with $libname and none of the candidates passed a file format test" - $echo "*** using a file magic. Last file checked: $potlib" - fi - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method - match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` - for a_deplib in $deplibs; do - name=`expr $a_deplib : '-l\(.*\)'` - # If $name is empty we are operating on a -L argument. - if test -n "$name" && test "$name" != "0"; then - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - case " $predeps $postdeps " in - *" $a_deplib "*) - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - ;; - esac - fi - if test -n "$a_deplib" ; then - libname=`eval \\$echo \"$libname_spec\"` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib="$potent_lib" # see symlink-check above in file_magic test - if eval $echo \"$potent_lib\" 2>/dev/null \ - | ${SED} 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - fi - if test -n "$a_deplib" ; then - droppeddeps=yes - $echo - $echo "*** Warning: linker path does not have real file for library $a_deplib." - $echo "*** I have the capability to make that library automatically link in when" - $echo "*** you link to this library. But I can only do this if you have a" - $echo "*** shared version of the library, which you do not appear to have" - $echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib" ; then - $echo "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $echo "*** with $libname and none of the candidates passed a file format test" - $echo "*** using a regex pattern. Last file checked: $potlib" - fi - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ - -e 's/ -[LR][^ ]*//g'` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then - for i in $predeps $postdeps ; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` - done - fi - if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ - | grep . >/dev/null; then - $echo - if test "X$deplibs_check_method" = "Xnone"; then - $echo "*** Warning: inter-library dependencies are not supported in this platform." - else - $echo "*** Warning: inter-library dependencies are not known to be supported." - fi - $echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - fi - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` - ;; - esac - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - $echo - $echo "*** Warning: libtool could not satisfy all declared inter-library" - $echo "*** dependencies of module $libname. Therefore, libtool will create" - $echo "*** a static module, that should work as long as the dlopening" - $echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - $echo - $echo "*** However, this would only work if libtool was able to extract symbol" - $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - $echo "*** not find such a program. So, this module is probably useless." - $echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - $echo "*** The inter-library dependencies that have been dropped here will be" - $echo "*** automatically added whenever a program is linked with this library" - $echo "*** or is declared to -dlopen it." - - if test "$allow_undefined" = no; then - $echo - $echo "*** Since this library must not contain undefined symbols," - $echo "*** because either the platform does not support them or" - $echo "*** it was explicitly requested with -no-undefined," - $echo "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - new_libs="$new_libs -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$new_libs $deplib" ;; - esac - ;; - *) new_libs="$new_libs $deplib" ;; - esac - done - deplibs="$new_libs" - - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - if test "$hardcode_into_libs" = yes; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - dep_rpath="$dep_rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - if test -n "$hardcode_libdir_flag_spec_ld"; then - case $archive_cmds in - *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; - *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; - esac - else - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - realname="$2" - shift; shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib="$output_objdir/$realname" - linknames= - for link - do - linknames="$linknames $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - $show "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - cmds=$export_symbols_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - if len=`expr "X$cmd" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - $show "$cmd" - $run eval "$cmd" || exit $? - skipped_export=false - else - # The command line is too long to execute in one step. - $show "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS="$save_ifs" - if test -n "$export_symbols_regex"; then - $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" - $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - $show "$mv \"${export_symbols}T\" \"$export_symbols\"" - $run eval '$mv "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - tmp_deplibs="$tmp_deplibs $test_deplib" - ;; - esac - done - deplibs="$tmp_deplibs" - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - else - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $convenience - libobjs="$libobjs $func_extract_archives_result" - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - linker_flags="$linker_flags $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test "X$skipped_export" != "X:" && - len=`expr "X$test_cmds" : ".*" 2>/dev/null` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise. - $echo "creating reloadable object files..." - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - output_la=`$echo "X$output" | $Xsed -e "$basename"` - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - delfiles= - last_robj= - k=1 - output=$output_objdir/$output_la-${k}.$objext - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - eval test_cmds=\"$reload_cmds $objlist $last_robj\" - if test "X$objlist" = X || - { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && - test "$len" -le "$max_cmd_len"; }; then - objlist="$objlist $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - eval concat_cmds=\"$reload_cmds $objlist $last_robj\" - else - # All subsequent reloadable object files will link in - # the last one created. - eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - k=`expr $k + 1` - output=$output_objdir/$output_la-${k}.$objext - objlist=$obj - len=1 - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" - - if ${skipped_export-false}; then - $show "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - libobjs=$output - # Append the command to create the export file. - eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" - fi - - # Set up a command to remove the reloadable object files - # after they are used. - i=0 - while test "$i" -lt "$k" - do - i=`expr $i + 1` - delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" - done - - $echo "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - - # Append the command to remove the reloadable object files - # to the just-reset $cmds. - eval cmds=\"\$cmds~\$rm $delfiles\" - fi - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - case " $deplibs" in - *\ -l* | *\ -L*) - $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; - esac - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 - fi - - case $output in - *.lo) - if test -n "$objs$old_deplibs"; then - $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 - exit $EXIT_FAILURE - fi - libobj="$output" - obj=`$echo "X$output" | $Xsed -e "$lo2o"` - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $run $rm $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec and hope we can get by with - # turning comma into space.. - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` - else - gentop="$output_objdir/${obj}x" - generated="$generated $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - cmds=$reload_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit $EXIT_SUCCESS - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $run eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - cmds=$reload_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; - esac - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 - fi - - if test "$preload" = yes; then - if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && - test "$dlopen_self_static" = unknown; then - $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." - fi - fi - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` - finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` - ;; - esac - - case $host in - *darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - if test "$tagname" = CXX ; then - compile_command="$compile_command ${wl}-bind_at_load" - finalize_command="$finalize_command ${wl}-bind_at_load" - fi - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - new_libs="$new_libs -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$new_libs $deplib" ;; - esac - ;; - *) new_libs="$new_libs $deplib" ;; - esac - done - compile_deplibs="$new_libs" - - - compile_command="$compile_command $compile_deplibs" - finalize_command="$finalize_command $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - *) dllsearchpath="$dllsearchpath:$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - *) dllsearchpath="$dllsearchpath:$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - fi - - dlsyms= - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - dlsyms="${outputname}S.c" - else - $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 - fi - fi - - if test -n "$dlsyms"; then - case $dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${outputname}.nm" - - $show "$rm $nlist ${nlist}S ${nlist}T" - $run $rm "$nlist" "${nlist}S" "${nlist}T" - - # Parse the name list into a source file. - $show "creating $output_objdir/$dlsyms" - - test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ -/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ -/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -/* Prevent the only kind of declaration conflicts we can make. */ -#define lt_preloaded_symbols some_other_symbol - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - $show "generating symbol list for \`$output'" - - test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - for arg in $progfiles; do - $show "extracting global C symbols from \`$arg'" - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - if test -n "$export_symbols_regex"; then - $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $run $rm $export_symbols - $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* ) - $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - else - $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - $run eval 'mv "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* ) - $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - fi - fi - - for arg in $dlprefiles; do - $show "extracting global C symbols from \`$arg'" - name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` - $run eval '$echo ": $name " >> "$nlist"' - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -z "$run"; then - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $mv "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if grep -v "^: " < "$nlist" | - if sort -k 3 /dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - grep -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' - else - $echo '/* NONE */' >> "$output_objdir/$dlsyms" - fi - - $echo >> "$output_objdir/$dlsyms" "\ - -#undef lt_preloaded_symbols - -#if defined (__STDC__) && __STDC__ -# define lt_ptr void * -#else -# define lt_ptr char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -" - - case $host in - *cygwin* | *mingw* ) - $echo >> "$output_objdir/$dlsyms" "\ -/* DATA imports from DLLs on WIN32 can't be const, because - runtime relocations are performed -- see ld's documentation - on pseudo-relocs */ -struct { -" - ;; - * ) - $echo >> "$output_objdir/$dlsyms" "\ -const struct { -" - ;; - esac - - - $echo >> "$output_objdir/$dlsyms" "\ - const char *name; - lt_ptr address; -} -lt_preloaded_symbols[] = -{\ -" - - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" - - $echo >> "$output_objdir/$dlsyms" "\ - {0, (lt_ptr) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - fi - - pic_flag_for_symtable= - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; - esac;; - *-*-hpux*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag";; - esac - esac - - # Now compile the dynamic symbol file. - $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" - $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? - - # Clean up the generated files. - $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" - $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" - - # Transform the symbol file into the correct name. - case $host in - *cygwin* | *mingw* ) - if test -f "$output_objdir/${outputname}.def" ; then - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` - else - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` - fi - ;; - * ) - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` - ;; - esac - ;; - *) - $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 - exit $EXIT_FAILURE - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` - fi - - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - # Replace the output file specification. - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - $show "$link_command" - $run eval "$link_command" - exit_status=$? - - # Delete the generated files. - if test -n "$dlsyms"; then - $show "$rm $output_objdir/${outputname}S.${objext}" - $run $rm "$output_objdir/${outputname}S.${objext}" - fi - - exit $exit_status - fi - - if test -n "$shlibpath_var"; then - # We should set the shlibpath_var - rpath= - for dir in $temp_rpath; do - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) - # Absolute path. - rpath="$rpath$dir:" - ;; - *) - # Relative path: add a thisdir entry. - rpath="$rpath\$thisdir/$dir:" - ;; - esac - done - temp_rpath="$rpath" - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - rpath="$rpath$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $run $rm $output - # Link the executable and exit - $show "$link_command" - $run eval "$link_command" || exit $? - exit $EXIT_SUCCESS - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 - $echo "$modename: \`$output' will be relinked during installation" 1>&2 - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname - - $show "$link_command" - $run eval "$link_command" || exit $? - - # Now create the wrapper script. - $show "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` - relink_command="$var=\"$var_value\"; export $var; $relink_command" - fi - done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` - fi - - # Quote $echo for shipping. - if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then - case $progpath in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; - *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; - esac - qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` - else - qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` - fi - - # Only actually do things if our run command is non-null. - if test -z "$run"; then - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - output_name=`basename $output` - output_path=`dirname $output` - cwrappersource="$output_path/$objdir/lt-$output_name.c" - cwrapper="$output_path/$output_name.exe" - $rm $cwrappersource $cwrapper - trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - cat > $cwrappersource <> $cwrappersource<<"EOF" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) -# define HAVE_DOS_BASED_FILE_SYSTEM -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -/* -DDEBUG is fairly common in CFLAGS. */ -#undef DEBUG -#if defined DEBUGWRAPPER -# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) -#else -# define DEBUG(format, ...) -#endif - -const char *program_name = NULL; - -void * xmalloc (size_t num); -char * xstrdup (const char *string); -const char * base_name (const char *name); -char * find_executable(const char *wrapper); -int check_executable(const char *path); -char * strendzap(char *str, const char *pat); -void lt_fatal (const char *message, ...); - -int -main (int argc, char *argv[]) -{ - char **newargz; - int i; - - program_name = (char *) xstrdup (base_name (argv[0])); - DEBUG("(main) argv[0] : %s\n",argv[0]); - DEBUG("(main) program_name : %s\n",program_name); - newargz = XMALLOC(char *, argc+2); -EOF - - cat >> $cwrappersource <> $cwrappersource <<"EOF" - newargz[1] = find_executable(argv[0]); - if (newargz[1] == NULL) - lt_fatal("Couldn't find %s", argv[0]); - DEBUG("(main) found exe at : %s\n",newargz[1]); - /* we know the script has the same name, without the .exe */ - /* so make sure newargz[1] doesn't end in .exe */ - strendzap(newargz[1],".exe"); - for (i = 1; i < argc; i++) - newargz[i+1] = xstrdup(argv[i]); - newargz[argc+1] = NULL; - - for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" - return 127; -} - -void * -xmalloc (size_t num) -{ - void * p = (void *) malloc (num); - if (!p) - lt_fatal ("Memory exhausted"); - - return p; -} - -char * -xstrdup (const char *string) -{ - return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL -; -} - -const char * -base_name (const char *name) -{ - const char *base; - -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - /* Skip over the disk name in MSDOS pathnames. */ - if (isalpha ((unsigned char)name[0]) && name[1] == ':') - name += 2; -#endif - - for (base = name; *name; name++) - if (IS_DIR_SEPARATOR (*name)) - base = name + 1; - return base; -} - -int -check_executable(const char * path) -{ - struct stat st; - - DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); - if ((!path) || (!*path)) - return 0; - - if ((stat (path, &st) >= 0) && - ( - /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ -#if defined (S_IXOTH) - ((st.st_mode & S_IXOTH) == S_IXOTH) || -#endif -#if defined (S_IXGRP) - ((st.st_mode & S_IXGRP) == S_IXGRP) || -#endif - ((st.st_mode & S_IXUSR) == S_IXUSR)) - ) - return 1; - else - return 0; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise */ -char * -find_executable (const char* wrapper) -{ - int has_slash = 0; - const char* p; - const char* p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - int tmp_len; - char* concat_name; - - DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable(concat_name)) - return concat_name; - XFREE(concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable(concat_name)) - return concat_name; - XFREE(concat_name); - } -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char* path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char* q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR(*q)) - break; - p_len = q - p; - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); - tmp_len = strlen(tmp); - concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable(concat_name)) - return concat_name; - XFREE(concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal ("getcwd failed"); - tmp_len = strlen(tmp); - concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable(concat_name)) - return concat_name; - XFREE(concat_name); - return NULL; -} - -char * -strendzap(char *str, const char *pat) -{ - size_t len, patlen; - - assert(str != NULL); - assert(pat != NULL); - - len = strlen(str); - patlen = strlen(pat); - - if (patlen <= len) - { - str += len - patlen; - if (strcmp(str, pat) == 0) - *str = '\0'; - } - return str; -} - -static void -lt_error_core (int exit_status, const char * mode, - const char * message, va_list ap) -{ - fprintf (stderr, "%s: %s: ", program_name, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, "FATAL", message, ap); - va_end (ap); -} -EOF - # we should really use a build-platform specific compiler - # here, but OTOH, the wrappers (shell script and this C one) - # are only useful if you want to execute the "real" binary. - # Since the "real" binary is built for $host, then this - # wrapper might as well be built for $host, too. - $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource - ;; - esac - $rm $output - trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 - - $echo > $output "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='${SED} -e 1s/^X//' -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variable: - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$echo are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - echo=\"$qecho\" - file=\"\$0\" - # Make sure echo works. - if test \"X\$1\" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift - elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then - # Yippee, \$echo works! - : - else - # Restart under the correct shell, and then maybe \$echo will work. - exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} - fi - fi\ -" - $echo >> $output "\ - - # Find the directory that this script lives in. - thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` - done - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $echo >> $output "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || \\ - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $mkdir \"\$progdir\" - else - $rm \"\$progdir/\$file\" - fi" - - $echo >> $output "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $echo \"\$relink_command_output\" >&2 - $rm \"\$progdir/\$file\" - exit $EXIT_FAILURE - fi - fi - - $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $rm \"\$progdir/\$program\"; - $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $rm \"\$progdir/\$file\" - fi" - else - $echo >> $output "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $echo >> $output "\ - - if test -f \"\$progdir/\$program\"; then" - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $echo >> $output "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` - - export $shlibpath_var -" - fi - - # fixup the dll searchpath if we need to. - if test -n "$dllsearchpath"; then - $echo >> $output "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - $echo >> $output "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - - # Make sure env LD_LIBRARY_PATH does not mess us up - if test -n \"\${LD_LIBRARY_PATH+set}\"; then - export LD_LIBRARY_PATH=\$progdir:\$LD_LIBRARY_PATH - fi -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2*) - $echo >> $output "\ - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $echo >> $output "\ - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $echo >> $output "\ - \$echo \"\$0: cannot exec \$program \$*\" - exit $EXIT_FAILURE - fi - else - # The program doesn't exist. - \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 - \$echo \"This script is just a wrapper for \$program.\" 1>&2 - $echo \"See the $PACKAGE documentation for more information.\" 1>&2 - exit $EXIT_FAILURE - fi -fi\ -" - chmod +x $output - fi - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$old_deplibs $non_pic_objects" - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - func_extract_archives $gentop $addlibs - oldobjs="$oldobjs $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - cmds=$old_archive_from_new_cmds - else - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - $echo "X$obj" | $Xsed -e 's%^.*/%%' - done | sort | sort -uc >/dev/null 2>&1); then - : - else - $echo "copying selected object files to avoid basename conflicts..." - - if test -z "$gentop"; then - gentop="$output_objdir/${outputname}x" - generated="$generated $gentop" - - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "$mkdir $gentop" - $run $mkdir "$gentop" - exit_status=$? - if test "$exit_status" -ne 0 && test ! -d "$gentop"; then - exit $exit_status - fi - fi - - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - counter=`expr $counter + 1` - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - $run ln "$obj" "$gentop/$newobj" || - $run cp "$obj" "$gentop/$newobj" - oldobjs="$oldobjs $gentop/$newobj" - ;; - *) oldobjs="$oldobjs $obj" ;; - esac - done - fi - - eval cmds=\"$old_archive_cmds\" - - if len=`expr "X$cmds" : ".*"` && - test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - $echo "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - for obj in $save_oldobjs - do - oldobjs="$objlist $obj" - objlist="$objlist $obj" - eval test_cmds=\"$old_archive_cmds\" - if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && - test "$len" -le "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" - objlist= - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test "X$oldobjs" = "X" ; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - eval cmd=\"$cmd\" - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$generated"; then - $show "${rm}r$generated" - $run ${rm}r$generated - fi - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - $show "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` - relink_command="$var=\"$var_value\"; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` - if test "$hardcode_automatic" = yes ; then - relink_command= - fi - - - # Only create the output if not a dry run. - if test -z "$run"; then - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - newdependency_libs="$newdependency_libs $libdir/$name" - ;; - *) newdependency_libs="$newdependency_libs $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - for lib in $dlfiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - newdlfiles="$newdlfiles $libdir/$name" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit $EXIT_FAILURE - fi - newdlprefiles="$newdlprefiles $libdir/$name" - done - dlprefiles="$newdlprefiles" - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - newdlfiles="$newdlfiles $abs" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; - *) abs=`pwd`"/$lib" ;; - esac - newdlprefiles="$newdlprefiles $abs" - done - dlprefiles="$newdlprefiles" - fi - $rm $output - # place dlname in correct position for cygwin - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; - esac - $echo > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then - $echo >> $output "\ -relink_command=\"$relink_command\"" - fi - done - fi - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" - $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? - ;; - esac - exit $EXIT_SUCCESS - ;; - - # libtool install mode - install) - modename="$modename: install" - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - $echo "X$nonopt" | grep shtool > /dev/null; then - # Aesthetically quote it. - arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - install_prog="$arg " - arg="$1" - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog$arg" - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - for arg - do - if test -n "$dest"; then - files="$files $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) - case " $install_prog " in - *[\\\ /]cp\ *) ;; - *) prev=$arg ;; - esac - ;; - -g | -m | -o) prev=$arg ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog $arg" - done - - if test -z "$install_prog"; then - $echo "$modename: you must specify an install program" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - if test -n "$prev"; then - $echo "$modename: the \`$prev' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - if test -z "$files"; then - if test -z "$dest"; then - $echo "$modename: no file or destination specified" 1>&2 - else - $echo "$modename: you must specify a destination" 1>&2 - fi - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Strip any trailing slash from the destination. - dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` - test "X$destdir" = "X$dest" && destdir=. - destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` - - # Not a directory, so check to see that there is only one file specified. - set dummy $files - if test "$#" -gt 2; then - $echo "$modename: \`$dest' is not a directory" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - staticlibs="$staticlibs $file" - ;; - - *.la) - # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - library_names= - old_library= - relink_command= - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) current_libdirs="$current_libdirs $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) future_libdirs="$future_libdirs $libdir" ;; - esac - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ - test "X$dir" = "X$file/" && dir= - dir="$dir$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - if test "$inst_prefix_dir" = "$destdir"; then - $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 - exit $EXIT_FAILURE - fi - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` - else - relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` - fi - - $echo "$modename: warning: relinking \`$file'" 1>&2 - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - exit $EXIT_FAILURE - fi - fi - - # See the names of the shared library. - set dummy $library_names - if test -n "$2"; then - realname="$2" - shift - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - $show "$install_prog $dir/$srcname $destdir/$realname" - $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? - if test -n "$stripme" && test -n "$striplib"; then - $show "$striplib $destdir/$realname" - $run eval "$striplib $destdir/$realname" || exit $? - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - if test "$linkname" != "$realname"; then - $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" - $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" - fi - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - cmds=$postinstall_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' - fi - - exit $lt_exit - } - done - IFS="$save_ifs" - fi - - # Install the pseudo-library for information purposes. - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - instname="$dir/$name"i - $show "$install_prog $instname $destdir/$name" - $run eval "$install_prog $instname $destdir/$name" || exit $? - - # Maybe install the static library, too. - test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - # Install the libtool object if requested. - if test -n "$destfile"; then - $show "$install_prog $file $destfile" - $run eval "$install_prog $file $destfile" || exit $? - fi - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` - - $show "$install_prog $staticobj $staticdest" - $run eval "$install_prog \$staticobj \$staticdest" || exit $? - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - file=`$echo $file|${SED} 's,.exe$,,'` - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin*|*mingw*) - wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` - ;; - *) - wrapper=$file - ;; - esac - if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then - notinst_deplibs= - relink_command= - - # Note that it is not necessary on cygwin/mingw to append a dot to - # foo even if both foo and FILE.exe exist: automatic-append-.exe - # behavior happens only for exec(3), not for open(2)! Also, sourcing - # `FILE.' does not work on cygwin managed mounts. - # - # If there is no directory component, then add one. - case $wrapper in - */* | *\\*) . ${wrapper} ;; - *) . ./${wrapper} ;; - esac - - # Check the variables that should have been set. - if test -z "$notinst_deplibs"; then - $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 - exit $EXIT_FAILURE - fi - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - # If there is no directory component, then add one. - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - fi - libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 - finalize=no - fi - done - - relink_command= - # Note that it is not necessary on cygwin/mingw to append a dot to - # foo even if both foo and FILE.exe exist: automatic-append-.exe - # behavior happens only for exec(3), not for open(2)! Also, sourcing - # `FILE.' does not work on cygwin managed mounts. - # - # If there is no directory component, then add one. - case $wrapper in - */* | *\\*) . ${wrapper} ;; - *) . ./${wrapper} ;; - esac - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - if test "$finalize" = yes && test -z "$run"; then - tmpdir=`func_mktempdir` - file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` - - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - ${rm}r "$tmpdir" - continue - fi - file="$outputname" - else - $echo "$modename: warning: cannot relink \`$file'" 1>&2 - fi - else - # Install the binary that we compiled earlier. - file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` - ;; - esac - ;; - esac - $show "$install_prog$stripme $file $destfile" - $run eval "$install_prog\$stripme \$file \$destfile" || exit $? - test -n "$outputname" && ${rm}r "$tmpdir" - ;; - esac - done - - for file in $staticlibs; do - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - $show "$install_prog $file $oldlib" - $run eval "$install_prog \$file \$oldlib" || exit $? - - if test -n "$stripme" && test -n "$old_striplib"; then - $show "$old_striplib $oldlib" - $run eval "$old_striplib $oldlib" || exit $? - fi - - # Do each command in the postinstall commands. - cmds=$old_postinstall_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$future_libdirs"; then - $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 - fi - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - test -n "$run" && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi - ;; - - # libtool finish mode - finish) - modename="$modename: finish" - libdirs="$nonopt" - admincmds= - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for dir - do - libdirs="$libdirs $dir" - done - - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - cmds=$finish_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" || admincmds="$admincmds - $cmd" - done - IFS="$save_ifs" - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $run eval "$cmds" || admincmds="$admincmds - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - test "$show" = : && exit $EXIT_SUCCESS - - $echo "X----------------------------------------------------------------------" | $Xsed - $echo "Libraries have been installed in:" - for libdir in $libdirs; do - $echo " $libdir" - done - $echo - $echo "If you ever happen to want to link against installed libraries" - $echo "in a given directory, LIBDIR, you must either use libtool, and" - $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - $echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - $echo " during execution" - fi - if test -n "$runpath_var"; then - $echo " - add LIBDIR to the \`$runpath_var' environment variable" - $echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $echo " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - $echo " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - $echo - $echo "See any operating system documentation about shared libraries for" - $echo "more information, such as the ld(1) and ld.so(8) manual pages." - $echo "X----------------------------------------------------------------------" | $Xsed - exit $EXIT_SUCCESS - ;; - - # libtool execute mode - execute) - modename="$modename: execute" - - # The first argument is the command name. - cmd="$nonopt" - if test -z "$cmd"; then - $echo "$modename: you must specify a COMMAND" 1>&2 - $echo "$help" - exit $EXIT_FAILURE - fi - - # Handle -dlopen flags immediately. - for file in $execute_dlfiles; do - if test ! -f "$file"; then - $echo "$modename: \`$file' is not a file" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - dir= - case $file in - *.la) - # Check to see that this really is a libtool archive. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Read the libtool library. - dlname= - library_names= - - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" - continue - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - - if test -f "$dir/$objdir/$dlname"; then - dir="$dir/$objdir" - else - if test ! -f "$dir/$dlname"; then - $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 - exit $EXIT_FAILURE - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - ;; - - *) - $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -*) ;; - *) - # Do a test to see if this is really a libtool program. - if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` - args="$args \"$file\"" - done - - if test -z "$run"; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - fi" - done - - # Now prepare to actually exec the command. - exec_cmd="\$cmd$args" - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" - $echo "export $shlibpath_var" - fi - $echo "$cmd$args" - exit $EXIT_SUCCESS - fi - ;; - - # libtool clean and uninstall mode - clean | uninstall) - modename="$modename: $mode" - rm="$nonopt" - files= - rmforce= - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case $arg in - -f) rm="$rm $arg"; rmforce=yes ;; - -*) rm="$rm $arg" ;; - *) files="$files $arg" ;; - esac - done - - if test -z "$rm"; then - $echo "$modename: you must specify an RM program" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - fi - - rmdirs= - - origobjdir="$objdir" - for file in $files; do - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$file"; then - dir=. - objdir="$origobjdir" - else - objdir="$dir/$origobjdir" - fi - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - test "$mode" = uninstall && objdir="$dir" - - # Remember objdir for removal later, being careful to avoid duplicates - if test "$mode" = clean; then - case " $rmdirs " in - *" $objdir "*) ;; - *) rmdirs="$rmdirs $objdir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if (test -L "$file") >/dev/null 2>&1 \ - || (test -h "$file") >/dev/null 2>&1 \ - || test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif test "$rmforce" = yes; then - continue - fi - - rmfiles="$file" - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - . $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - rmfiles="$rmfiles $objdir/$n" - done - test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - - case "$mode" in - clean) - case " $library_names " in - # " " in the beginning catches empty $dlname - *" $dlname "*) ;; - *) rmfiles="$rmfiles $objdir/$dlname" ;; - esac - test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - cmds=$postuninstall_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" - if test "$?" -ne 0 && test "$rmforce" != yes; then - exit_status=1 - fi - done - IFS="$save_ifs" - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - cmds=$old_postuninstall_cmds - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - eval cmd=\"$cmd\" - $show "$cmd" - $run eval "$cmd" - if test "$?" -ne 0 && test "$rmforce" != yes; then - exit_status=1 - fi - done - IFS="$save_ifs" - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - - # Read the .lo file - . $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" \ - && test "$pic_object" != none; then - rmfiles="$rmfiles $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" \ - && test "$non_pic_object" != none; then - rmfiles="$rmfiles $dir/$non_pic_object" - fi - fi - ;; - - *) - if test "$mode" = clean ; then - noexename=$name - case $file in - *.exe) - file=`$echo $file|${SED} 's,.exe$,,'` - noexename=`$echo $name|${SED} 's,.exe$,,'` - # $file with .exe has already been added to rmfiles, - # add $file without .exe - rmfiles="$rmfiles $file" - ;; - esac - # Do a test to see if this is a libtool program. - if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - relink_command= - . $dir/$noexename - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - rmfiles="$rmfiles $objdir/lt-$name" - fi - if test "X$noexename" != "X$name" ; then - rmfiles="$rmfiles $objdir/lt-${noexename}.c" - fi - fi - fi - ;; - esac - $show "$rm $rmfiles" - $run $rm $rmfiles || exit_status=1 - done - objdir="$origobjdir" - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - $show "rmdir $dir" - $run rmdir $dir >/dev/null 2>&1 - fi - done - - exit $exit_status - ;; - - "") - $echo "$modename: you must specify a MODE" 1>&2 - $echo "$generic_help" 1>&2 - exit $EXIT_FAILURE - ;; - esac - - if test -z "$exec_cmd"; then - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$generic_help" 1>&2 - exit $EXIT_FAILURE - fi -fi # test -z "$show_help" - -if test -n "$exec_cmd"; then - eval exec $exec_cmd - exit $EXIT_FAILURE -fi - -# We need to display help for each of the modes. -case $mode in -"") $echo \ -"Usage: $modename [OPTION]... [MODE-ARG]... - -Provide generalized library-building support services. - - --config show all configuration variables - --debug enable verbose shell tracing --n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --finish same as \`--mode=finish' - --help display this help message and exit - --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] - --quiet same as \`--silent' - --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG - --version print version information - -MODE must be one of the following: - - clean remove files from the build directory - compile compile a source file into a libtool object - execute automatically set library path, then run a program - finish complete the installation of libtool libraries - install install libraries or executables - link create a library or an executable - uninstall remove libraries from an installed directory - -MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for -a more detailed description of MODE. - -Report bugs to ." - exit $EXIT_SUCCESS - ;; - -clean) - $echo \ -"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - -compile) - $echo \ -"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -prefer-pic try to building PIC objects only - -prefer-non-pic try to building non-PIC objects only - -static always build a \`.o' file suitable for static linking - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - -execute) - $echo \ -"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - -finish) - $echo \ -"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - -install) - $echo \ -"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - -link) - $echo \ -"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE Use a list of object files found in FILE to specify objects - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - -uninstall) - $echo \ -"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - -*) - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$help" 1>&2 - exit $EXIT_FAILURE - ;; -esac - -$echo -$echo "Try \`$modename --help' for more information about other modes." - -exit $? - -# The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -disable_libs=shared -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -disable_libs=static -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/fluidbook/tools/swftools-special-swfdump/m4/Makefile b/fluidbook/tools/swftools-special-swfdump/m4/Makefile deleted file mode 100644 index 1995f6233..000000000 --- a/fluidbook/tools/swftools-special-swfdump/m4/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# simple pmake detecting Makefile - -all: clear test.o -clean: all -install: -uninstall: - -CC=@echo "*******************************************************";\ - echo "Your make is broken- try to get yourself a working one.";\ - echo "gmake 3.79.1 or newer should be fine. ";\ - echo "*******************************************************";\ - exit 1;exec >/dev/null;echo - -clear: - @rm -f test.c - -%.o: %.c - -test.c: - @touch test.c - -test.o: test.c - -.SUFFIXES: .o .cpp diff --git a/fluidbook/tools/swftools-special-swfdump/m4/avi2swf.m4 b/fluidbook/tools/swftools-special-swfdump/m4/avi2swf.m4 deleted file mode 100644 index 906fef12e..000000000 --- a/fluidbook/tools/swftools-special-swfdump/m4/avi2swf.m4 +++ /dev/null @@ -1,124 +0,0 @@ -AC_DEFUN([RFX_CHECK_AVI2SWF], -[ - -AC_CHECK_PROGS([AVIFILE_CONFIG], [avifile-config]) - -if test "x$AVIFILE_CONFIG" '!=' "x";then - OLDCPPFLAGS="$CPPFLAGS" - # temporarily add avifile paths to CPPFLAGS... - CPPFLAGS="$CPPFLAGS $CXXFLAGS "`$AVIFILE_CONFIG --cflags` - AC_CHECK_HEADERS(avifile/version.h version.h) - # ... and reset - CPPFLAGS="$OLDCPPFLAGS" -fi - -AC_MSG_CHECKING([whether we can compile the avifile test program]) - -if test "x${ac_cv_header_version_h}" '=' "xyes";then - HAVE_VERSION_H_DEFINE='#define HAVE_VERSION_H' -fi -if test "x${ac_cv_header_avifile_version_h}" '=' "xyes";then - HAVE_AVIFILE_VERSION_H_DEFINE='#define HAVE_AVIFILE_VERSION_H' -fi - -cat > conftest.cpp << EOF - -// hack- we can't yet access the variables in config.h (because it hasn't been generated yet), -// so we have to introduce them this way -$HAVE_VERSION_H_DEFINE -$HAVE_AVIFILE_VERSION_H_DEFINE - -#ifdef HAVE_VERSION_H - #include -#endif -#ifdef HAVE_AVIFILE_VERSION_H - #include -#endif - -#if (AVIFILE_MAJOR_VERSION == 0) && (AVIFILE_MINOR_VERSION>=6) - #include - #include - #include - #include - #include - #define VERSION6 -#else - #include - #include - #include - #define Width width - #define Height height - #define Data data - #define Bpp bpp -#endif - -void test() -{ - IAviReadFile* player; - IAviReadStream* astream; - IAviReadStream* vstream; - player = CreateIAviReadFile(0); - astream = player->GetStream(0, AviStream::Audio); - vstream = player->GetStream(0, AviStream::Video); - vstream -> StartStreaming(); - astream -> StartStreaming(); -#ifndef VERSION6 - MainAVIHeader head; - player->GetFileHeader(&head); - head.dwMicroSecPerFrame; - head.dwTotalFrames; - head.dwStreams; - head.dwWidth; - head.dwHeight; - head.dwMicroSecPerFrame; - astream->GetEndPos(), - astream->GetEndTime()); - player->StreamCount(); -#else - StreamInfo*audioinfo; - StreamInfo*videoinfo; - audioinfo = astream->GetStreamInfo(); - videoinfo = vstream->GetStreamInfo(); - videoinfo->GetVideoWidth(); - videoinfo->GetVideoHeight(); - audioinfo->GetAudioSamplesPerSec(); - videoinfo->GetFps(); -#endif - CImage*img = vstream->GetFrame(); - img->ToRGB(); - img->Data(); - img->Bpp(); - img->Width(); - img->Height(); - WAVEFORMATEX wave; - astream->GetAudioFormatInfo(&wave,0); - uint_t a,b; - astream->ReadFrames(0,0,0,a,b); -} -int main (int argc, char*argv[]) -{ - return 0; -} -EOF - -if test "x$AVIFILE_CONFIG" '!=' "x";then - AVIFILE_LIBS=`$AVIFILE_CONFIG --libs` - AVIFILE_CFLAGS=`$AVIFILE_CONFIG --cflags` - avifile_link='$CXX $CPPFLAGS $CXXFLAGS $AVIFILE_CFLAGS conftest.cpp $AVIFILE_LIBS -o conftest${ac_exeext}' - if { (eval echo avi2swf.m4:71: \"$avifile_link\") 1>&5; (eval $avifile_link) 2>&5; } && test -s conftest${ac_exeext} && ./conftest${ac_exeext}; then - AC_MSG_RESULT(yes) - AVIFILE=true - export AVIFILE - AC_DEFINE([AVIFILE], [true], [Define if Avifile is available]) - else - echo "configure: failed program was:" >&5 - cat conftest.cpp >&5 - AC_MSG_RESULT(no) - fi -else - AC_MSG_RESULT(no) -fi -rm -f conftest* -]) - - diff --git a/fluidbook/tools/swftools-special-swfdump/m4/backticks.m4 b/fluidbook/tools/swftools-special-swfdump/m4/backticks.m4 deleted file mode 100644 index 6c7b62069..000000000 --- a/fluidbook/tools/swftools-special-swfdump/m4/backticks.m4 +++ /dev/null @@ -1,30 +0,0 @@ -AC_DEFUN([RFX_CHECK_SYSTEM_BACKTICKS], -[ -AC_MSG_CHECKING([whether system() can handle command substitution]) -AC_TRY_RUN([ -#include "stdlib.h" -int main (int argc, char*argv[]) -{ - return system("test `touch config.tmp2`"); -} -], [OK=OK],,[CROSSCOMPILE=1]) - -if test "x${OK}" = "xOK";then - test -f config.tmp2 || OK= -fi - -if test "x${CROSSCOMPILE}" = "x1";then - OK=no; -fi -if test "x${OK}" = "xOK";then -rm -f config.tmp2 -AC_MSG_RESULT(yes) -SYSTEM_BACKTICKS=1 -export SYSTEM_BACKTICKS -AC_DEFINE([SYSTEM_BACKTICKS], [1], [Define if system handles command substitution]) -else -AC_MSG_RESULT(no) -fi -]) - - diff --git a/fluidbook/tools/swftools-special-swfdump/m4/byteorder.m4 b/fluidbook/tools/swftools-special-swfdump/m4/byteorder.m4 deleted file mode 100644 index 953753377..000000000 --- a/fluidbook/tools/swftools-special-swfdump/m4/byteorder.m4 +++ /dev/null @@ -1,47 +0,0 @@ -AC_DEFUN([RFX_CHECK_BYTEORDER], -[ -AC_MSG_CHECKING([for byte order]) -AC_TRY_RUN([ -int main (int argc, char *argv[]) -{ - int i = 1; - return *(char*)&i; -} -], [BIGENDIAN=1], [LITTLEENDIAN=1], [CROSSCOMPILE=1]) -export CROSSCOMPILE - -if test "x${CROSSCOMPILE}" = "x1"; then - AC_MSG_RESULT([we are cross compiling- trying to guess from system type]) - AC_CANONICAL_SYSTEM - AC_MSG_CHECKING([for byte order, try 2]) - case "${target}" in - *86* | *-pc-* ) - LITTLEENDIAN=1 - ;; - *sparc* | *68* | *88k* | *mac* | *Mac* | *sun* | *Sun* | *Amiga* | *amiga* ) - BIGENDIAN=1 - ;; - esac -fi - -export LITTLEENDIAN -if test "x${LITTLEENDIAN}" = "x1"; then -AC_MSG_RESULT([little endian]) -BYTEORDERCHECKOK=1 -fi -export BIGENDIAN -if test "x${BIGENDIAN}" = "x1"; then -AC_MSG_RESULT([big endian]) -BYTEORDERCHECKOK=1 -WORDS_BIGENDIAN=1 -export WORDS_BIGENDIAN -AC_DEFINE([WORDS_BIGENDIAN], [1], [Define to 1 if this machine has network byte order]) -fi -if test "x${BYTEORDERCHECKOK}" != "x1"; then -AC_MSG_RESULT(unknown) -echo Byte order could not determined. -exit 1 -fi -]) - - diff --git a/fluidbook/tools/swftools-special-swfdump/m4/fontconfig.m4 b/fluidbook/tools/swftools-special-swfdump/m4/fontconfig.m4 deleted file mode 100644 index 98da5a2ca..000000000 --- a/fluidbook/tools/swftools-special-swfdump/m4/fontconfig.m4 +++ /dev/null @@ -1,102 +0,0 @@ -# ----------- freetype.m4 ---------------- -# -# Checks for: -# * freetype library (-lfreetype) -# * freetype headers (freetype2/freetype/freetype.h) -# * whether a freetype test program can be compiled -# -# Environment set: -# * HAVE_FREETYPE -# -# Defines: -# * HAVE_FREETYPE -# * USE_FREETYPE -# -# Substitutes: -# - -AC_DEFUN([RFX_CHECK_FONTCONFIG], -[ -OLDCPPFLAGS="${CPPFLAGS}" -OLDLIBS="${LIBS}" - -if test -d /usr/include/fontconfig; then - CPPFLAGS="$CPPFLAGS -I/usr/include/fontconfig" -fi - -AC_CHECK_LIB(fontconfig, FcInit, [HAVE_LIB_FONTCONFIG=1],) -AC_CHECK_HEADERS(fontconfig.h,[HAVE_FONTCONFIG_H=1]) - -if test "x${HAVE_LIB_FONTCONFIG}" != "x";then -if test "x${HAVE_FONTCONFIG_H}" != "x";then - HAVE_FONTCONFIG=1 -fi -fi - -if test "x${HAVE_FONTCONFIG}" = "x1"; then - LIBS="$LIBS -lfontconfig" -AC_MSG_CHECKING([whether we can compile the fontconfig test program]) - -if (echo $LIBS | grep lfreetype >/dev/null 2>&1); then - #move freetype library to the end of libraries, otherwise fontconfig - #won't compile. - LIBS=`echo $LIBS | sed -e 's/-lfreetype//g' -e 's/$/ -lfreetype/'` -fi - -cat > conftest.c << EOF -#include -#include - -int main() -{ - FcPattern *pattern, *match; - FcResult result; - FcChar8 *v; - char*s1="abc",*s2="ABC"; - strcasecmp(s1,s2); - FcInit(); - pattern = FcPatternBuild(0, FC_FAMILY, FcTypeString, "", 0); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); - FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); - - FcConfig*c = FcConfigCreate(); - FcConfigParseAndLoad(c, (FcChar8*)"", 1); - FcConfigBuildFonts(c); - FcConfigSetCurrent(c); - - FcFontSet * set = FcConfigGetFonts(c, FcSetSystem); - FcFontSetDestroy(set); - - FcConfigSubstitute(0, pattern, FcMatchPattern); - FcDefaultSubstitute(pattern); - match = FcFontMatch(0, pattern, &result); - FcPatternGetString(match, "family", 0, &v) == FcResultMatch; - FcPatternGetBool(match, "family", 0, &v) == FcResultMatch; - FcPatternPrint(pattern); - FcPatternDestroy(pattern); - FcPatternDestroy(match); - FcFini(); - return 0; -} -EOF - - ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' - if { (eval echo freetype.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - AC_MSG_RESULT(yes) - AC_DEFINE([HAVE_FONTCONFIG], [1], [Define if fontconfig is available]) - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - HAVE_FONTCONFIG=0 - AC_MSG_RESULT(no) - fi - rm -f conftest* -fi - -# if the above didn't work out, reset all changes to the compiler variables. -if test "x${HAVE_FONTCONFIG}" "!=" "x1"; then - CPPFLAGS=$OLDCPPFLAGS - LIBS=$OLDLIBS -fi -]) - diff --git a/fluidbook/tools/swftools-special-swfdump/m4/freetype.m4 b/fluidbook/tools/swftools-special-swfdump/m4/freetype.m4 deleted file mode 100644 index f4ed0315d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/m4/freetype.m4 +++ /dev/null @@ -1,147 +0,0 @@ -# ----------- freetype.m4 ---------------- -# -# Checks for: -# * freetype library (-lfreetype) -# * freetype headers (freetype2/freetype/freetype.h) -# * whether a freetype test program can be compiled -# -# Environment set: -# * HAVE_FREETYPE -# -# Defines: -# * HAVE_FREETYPE -# * USE_FREETYPE -# -# Substitutes: -# - -AC_DEFUN([RFX_CHECK_FREETYPE], -[ - -AC_PATH_PROG([FREETYPE_CONFIG], [freetype-config],, ["$PATH:/usr/local/bin:/sw/bin:/opt/local/bin"]) - -OLDCPPFLAGS="${CPPFLAGS}" -OLDLIBS="${LIBS}" -if test "x${FREETYPE_CONFIG}" '!=' "x"; then - CPPFLAGS="$CPPFLAGS "`$FREETYPE_CONFIG --cflags` -else if test -d /usr/include/freetype2; then - CPPFLAGS="$CPPFLAGS -I/usr/include/freetype2" -else if test -d /usr/local/include/freetype2; then - CPPFLAGS="$CPPFLAGS -I/usr/local/include/freetype2" -fi -fi -fi - -if test "x${FREETYPE_CONFIG}" '=' "x";then - # if we didn't find the freetype-config program, we won't - # know where the libs are expected to be. So just blindly - # try to link against them. - AC_CHECK_LIB([freetype], [FT_Init_FreeType],[HAVE_LIB_FREETYPE=1],) -fi - -AC_CHECK_HEADERS([ft2build.h],[HAVE_FT2BUILD_H=1]) -if test "x${HAVE_FT2BUILD_H}" '=' "x";then - AC_CHECK_HEADERS([freetype/freetype.h],[HAVE_FREETYPE_FREETYPE_H=1]) -fi - -if test "x${HAVE_LIB_FREETYPE}" '!=' "x" -o \ - "x${FREETYPE_CONFIG}" '!=' "x";then - if test "x${HAVE_FREETYPE_FREETYPE_H}" '!=' "x";then - HAVE_FREETYPE=1 - fi - if test "x${HAVE_FT2BUILD_H}" '!=' "x";then - HAVE_FREETYPE=1 - fi -fi - -if test "x${HAVE_FREETYPE}" = "x1"; then - if test "x${FREETYPE_CONFIG}" '!=' "x"; then - LIBS="$LIBS "`$FREETYPE_CONFIG --libs` - else - LIBS="$LIBS -lfreetype" - fi - - if test "x${HAVE_FT2BUILD_H}" = "x1"; then - HAVE_FT2BUILD_H_DEFINE='#define HAVE_FT2BUILD_H' - fi - - AC_MSG_CHECKING([whether we can compile the freetype test program]) - - cat > conftest.c << EOF -$HAVE_FT2BUILD_H_DEFINE - -#ifdef HAVE_FT2BUILD_H -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H -#include FT_SIZES_H -#include FT_SFNT_NAMES_H -#include FT_TRUETYPE_IDS_H -#include FT_OUTLINE_H -#else -#include -#include -#include -#include -#include -#include -#endif - -int main() -{ - FT_Library ftlibrary; - FT_Face face; - FT_Error error; - FT_ULong charcode; - FT_UInt gindex; - FT_Glyph glyph; - FT_BBox bbox; - FT_Matrix matrix; - FT_UInt i; - char* name = 0; - char italic, bold; - - FT_Init_FreeType(&ftlibrary); - FT_New_Face(ftlibrary, "filename", 0, &face); - i = face->num_glyphs - 1; - italic = face->style_flags&FT_STYLE_FLAG_ITALIC; - bold = face->style_flags&FT_STYLE_FLAG_BOLD; - FT_Get_Postscript_Name(face); - FT_Get_Char_Index(face, 33); - FT_Get_First_Char(face, &i); - FT_Get_Next_Char(face, 33, &i); - if(FT_HAS_GLYPH_NAMES(face)) { - FT_Get_Glyph_Name(face, 33, name, 127); - } - FT_Load_Glyph(face, 33, FT_LOAD_NO_BITMAP|FT_LOAD_NO_SCALE); - FT_Get_Glyph(face->glyph, &glyph); - FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_unscaled, &bbox); - FT_Done_Glyph(glyph); - FT_Done_Face(face); - FT_Done_FreeType(ftlibrary); - return 0; -} -EOF - - ac_link='$CC $CPPFLAGS $CFLAGS conftest.c $LDFLAGS $LIBS -o conftest${ac_exeext}' - if { (eval echo freetype.m4:71: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_FREETYPE], [1], [have/use freetype library]) - AC_DEFINE([HAVE_FREETYPE_FREETYPE_H], [1], [Define if freetype headers are available]) - AC_DEFINE([USE_FREETYPE], [1], [Define if freetype is available]) # for ttf2tp1 - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - HAVE_FREETYPE=0 - AC_MSG_RESULT([no]) - fi - rm -f conftest* -fi - -# if the above didn't work out, reset all changes to the compiler variables. -if test "x${HAVE_FREETYPE}" '!=' "x1"; then - CPPFLAGS=$OLDCPPFLAGS - LIBS=$OLDLIBS -fi -]) - diff --git a/fluidbook/tools/swftools-special-swfdump/m4/gcc.2.95.m4 b/fluidbook/tools/swftools-special-swfdump/m4/gcc.2.95.m4 deleted file mode 100644 index f8fa03997..000000000 --- a/fluidbook/tools/swftools-special-swfdump/m4/gcc.2.95.m4 +++ /dev/null @@ -1,30 +0,0 @@ -AC_DEFUN([RFX_CHECK_OLDGCC], -[ -AC_MSG_CHECKING([whether gcc supports lazy variable declaration]) - -cat > conftest.c << EOF -#include -#include - -int main (int argc, char*argv[]) -{ - int a,b; - b=3; - int c; - c=4; - return 0; -} -EOF - -testprog_link='$CC $CPPFLAGS $CFLAGS conftest.c -o conftest${ac_exeext}' -if { (eval echo gcc.2.95.m4:19: \"$testprog_link\") 1>&5; (eval $testprog_link) 2>&5; } && test -s conftest${ac_exeext}; then - AC_MSG_RESULT(yes) - GCC_IS_OK=true - export GCC_IS_OK -else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - AC_MSG_RESULT(no) -fi -rm -f conftest* -]) diff --git a/fluidbook/tools/swftools-special-swfdump/m4/mingw.m4 b/fluidbook/tools/swftools-special-swfdump/m4/mingw.m4 deleted file mode 100644 index c4d0434a6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/m4/mingw.m4 +++ /dev/null @@ -1,55 +0,0 @@ -AC_DEFUN([RFX_CHECK_MING], -[ -AC_CANONICAL_HOST -AC_EXEEXT - -AC_MSG_CHECKING([for target system]) -CYGWIN= -MINGW= -case $host_os in - *cygwin* ) CYGWIN=yes;; - *mingw* ) MINGW=yes;; -esac - -AR=ar -if test "x$MINGW" = "xyes"; then - #fix for the debian distribution of mingw - if test -x "/usr/i586-mingw32msvc/bin/ar";then - AR="/usr/i586-mingw32msvc/bin/ar" - fi - if test -x "/usr/i586-mingw32msvc/bin/ranlib";then - RANLIB="/usr/i586-mingw32msvc/bin/ranlib" - fi - #fix for the gentoo distribution of mingw - if test -x "/opt/xmingw/bin/i386-mingw32msvc-ar";then - AR="/opt/xmingw/bin/i386-mingw32msvc-ar" - fi - if test -x "/opt/xmingw/bin/i386-mingw32msvc-ranlib";then - RANLIB="/opt/xmingw/bin/i386-mingw32msvc-ranlib" - fi - if test -x "/opt/xmingw/bin/i386-mingw32msvc-strip";then - STRIP="/opt/xmingw/bin/i386-mingw32msvc-strip" - fi -fi -AC_SUBST(AR) - -dnl Checks for system services - -if test "x${CYGWIN}" = "xyes"; then - AC_DEFINE([CYGWIN], [1], [Define on cygwin]) - AC_MSG_RESULT(cygwin) -else - if test "x${MINGW}" = "xyes"; then - AC_DEFINE([MINGW], [1], [Define on Mingw]) - WIN32=1 - AC_DEFINE([WIN32], [1], [Define on windows]) - LIBS="$LIBS -lws2_32 -lgdi32" - AC_MSG_RESULT([mingw]) - else - LINUX=1 - export LINUX - AC_DEFINE([LINUX], [1], [Define if not on cygwin or mingw]) - AC_MSG_RESULT() - fi -fi -]) diff --git a/fluidbook/tools/swftools-special-swfdump/m4/python.m4 b/fluidbook/tools/swftools-special-swfdump/m4/python.m4 deleted file mode 100644 index 1d7c3d9e0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/m4/python.m4 +++ /dev/null @@ -1,173 +0,0 @@ -AC_DEFUN([RFX_CHECK_PYTHON], -[ -AC_MSG_CHECKING([for Python version]) - -if test "x$PYTHON_LIB" '!=' "x" -a "x$PYTHON_INCLUDES" '!=' "x";then - # you can override the python detection by putting PYTHON_LIB - # and PYTHON_INCLUDES into the environment - case "$PYTHON_INCLUDES" in - *python2.4*) PY_VERSION=2.4 - ;; - *python2.5*) PY_VERSION=2.5 - ;; - *python2.6*) PY_VERSION=2.6 - ;; - *python2.7*) PY_VERSION=2.7 - ;; - *python3.0*) PY_VERSION=3.0 - ;; - *python3.1*) PY_VERSION=3.1 - ;; - *python3.2*) PY_VERSION=3.2 - ;; - *python3.3*) PY_VERSION=3.3 - ;; - *) PY_VERSION=unknown - ;; - esac -else - if test "x$PYTHON_LIB" '!=' "x" -o "x$PYTHON_INCLUDES" '!=' "x";then - echo "Set both PYTHON_LIB and PYTHON_INCLUDES, or none at all" - fi - # iterate through version 2.4 to 3.3 - VERSIONS="2.4 2.5 2.6 2.7 3.0 3.1 3.2 3.3" - case "$PYTHON" in - 2*) VERSIONS="2.4 2.5 2.6 2.7 $PYTHON" - ;; - 3*) VERSIONS="3.0 3.1 3.2 3.3 $PYTHON" - ;; - esac - for v in $VERSIONS; do - # Linux - if test -f "/usr/include/python$v/Python.h";then - PY_VERSION=$v - PYTHON_LIB="-lpython$PY_VERSION" - if test -f "/usr/lib/python$v/site-packages/PIL/_imaging.so";then - PYTHON_LIB2="$PYTHON_LIB /usr/lib/python$v/site-packages/PIL/_imaging.so" - HAVE_PYTHON_IMAGING_LIB=1 - else - PYTHON_LIB2="$PYTHON_LIB" - fi - PYTHON_INCLUDES="-I/usr/include/python$PY_VERSION" - # Mac OS X - elif test -f "/Library/Frameworks/Python.framework/Versions/$v/include/python$v/Python.h";then - PY_VERSION=$v - PYTHON_LIB="-framework Python" - if test -f "/Library/Frameworks/Python.framework/Versions/$v/site-packages/PIL/_imaging.so";then - PYTHON_LIB2="$PYTHON_LIB /Library/Python/$v/PIL/_imaging.so" - HAVE_PYTHON_IMAGING_LIB=1 - else - PYTHON_LIB2="$PYTHON_LIB" - fi - PYTHON_INCLUDES="-I/Library/Frameworks/Python.framework/Versions/$v/include/python$v/" - # Mac OS X [Fink]: - elif test "(" -f "/sw/lib/python$v/config/libpython$v.dylib" \ - -o -f "/sw/lib/python$v/config/libpython$v.a" \ - -o -f "/sw/lib/python$v/config/libpython$v.so" \ - ")" \ - -a -f "/sw/include/python$v/Python.h"; then - PY_VERSION=$v - PYTHON_LIB="-L /sw/lib/python$v/config/ -lpython$PY_VERSION /sw/lib/python$v/site-packages/PIL/_imaging.so" - if test -f "/sw/lib/python$v/site-packages/PIL/_imaging.so";then - PYTHON_LIB2="$PYTHON_LIB /sw/lib/python$v/site-packages/PIL/_imaging.so" - HAVE_PYTHON_IMAGING_LIB=1 - else - PYTHON_LIB2="$PYTHON_LIB" - fi - PYTHON_INCLUDES="-I /sw/include/python$v/" - fi - done -fi -AC_MSG_RESULT($PY_VERSION) - -if test "x$PY_VERSION" "!=" "x"; then - AC_MSG_CHECKING([for Python executable]) - if python$PY_VERSION -V 2>&5;then - PYTHON_EXECUTABLE=python$PY_VERSION - AC_SUBST(PYTHON_EXECUTABLE) - AC_MSG_RESULT([$PYTHON_EXECUTABLE]) - else - AC_MSG_RESULT([failed]) - fi -fi - -if test "x$PY_VERSION" "!=" "x" -a "x$PYTHON_EXECUTABLE" "!=" "x"; then - export PYTHON_INCLUDES PYTHON_LIB - AC_SUBST(PYTHON_LIB) - AC_SUBST(PYTHON_INCLUDES) - AC_MSG_CHECKING([whether we can compile the Python test program]) - - cat > conftest.c << EOF -# include - - int main() - { - int ret; - ret = Py_Main(0, 0); - int x; // check also for gcc 2.95.x incompatibilities - return ret; - } -EOF - - ac_link='$CC $CPPFLAGS $CFLAGS $PYTHON_INCLUDES conftest.c $LDFLAGS $PYTHON_LIB $LIBS -o conftest${ac_exeext}' - if { (eval echo python.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - AC_MSG_RESULT(yes) - PYTHON_OK=yes - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - AC_MSG_RESULT(no) - fi - rm -f conftest* - - AC_MSG_CHECKING([for Python install path]) -cat > _pypath.py << EOF -import distutils -import distutils.sysconfig -import sys -sys.stdout.write(distutils.sysconfig.get_python_lib(plat_specific=0,standard_lib=0)) -EOF - echo $PYTHON_EXECUTABLE _pypath.py 1>&5 - if $PYTHON_EXECUTABLE _pypath.py >_pypath.txt 2>&5;then - PYTHON_INSTALL_PATH=`cat _pypath.txt` - AC_SUBST(PYTHON_INSTALL_PATH) - AC_MSG_RESULT($PYTHON_INSTALL_PATH) - else - AC_MSG_RESULT([failed]) - fi - #rm -f _pypath.txt _pypath.py - - if test "x$PYTHON_OK" = "xyes";then - AC_MSG_CHECKING([for Python-Imaging]) - cat > conftest.c << EOF -# include -# include - - int main() - { - Py_Main(0, 0); - return 0; - } -EOF - if test "$HAVE_PYTHON_IMAGING_LIB"; then - ac_link='$CC $CPPFLAGS $CFLAGS $PYTHON_INCLUDES conftest.c $LDFLAGS ${PYTHON_LIB2} $LIBS -o conftest${ac_exeext}' - if { (eval echo python.m4: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - PYTHON_LIB="${PYTHON_LIB2}" - AC_DEFINE([HAVE_PYTHON_IMAGING], [1], [whether Python-Imaging was found]) - HAVE_PYTHON_IMAGING=yes - export HAVE_PYTHON_IMAGING - AC_SUBST(HAVE_PYTHON_IMAGING) - AC_MSG_RESULT(yes) - else - echo "configure: failed program was:" >&5 - cat conftest.c >&5 - AC_MSG_RESULT(no) - fi - else - echo "(didn't find the Python-Imaging libraries)" >&5 - AC_MSG_RESULT(no) - fi - fi - rm -f conftest* -fi -]) diff --git a/fluidbook/tools/swftools-special-swfdump/m4/test.c b/fluidbook/tools/swftools-special-swfdump/m4/test.c deleted file mode 100644 index e69de29bb..000000000 diff --git a/fluidbook/tools/swftools-special-swfdump/missing b/fluidbook/tools/swftools-special-swfdump/missing deleted file mode 100644 index 22e101ab1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/missing +++ /dev/null @@ -1,198 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. -# Copyright (C) 1996, 1997, 2001, 2002 Free Software Foundation, Inc. -# Franc,ois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.in; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -case "$1" in - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - yacc create \`y.tab.[ch]', if possible, from existing .[ch]" - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing - GNU libit 0.0" - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - - aclocal*) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acinclude.m4' or \`$configure_ac'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`$configure_ac'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acconfig.h' or \`$configure_ac'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' $configure_ac` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case "$f" in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`$configure_ac'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if [ ! -f y.tab.h ]; then - echo >y.tab.h - fi - if [ ! -f y.tab.c ]; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex|flex) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if [ ! -f lex.yy.c ]; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - makeinfo) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` - fi - touch $file - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and you do not seem to have it handy on your - system. You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequirements for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 diff --git a/fluidbook/tools/swftools-special-swfdump/mkinstalldirs b/fluidbook/tools/swftools-special-swfdump/mkinstalldirs deleted file mode 100644 index 3159597e1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/mkinstalldirs +++ /dev/null @@ -1,40 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman -# Created: 1993-05-16 -# Public domain - -# - -errstatus=0 - -for file -do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d - do - pathcomp="$pathcomp$d" - case "$pathcomp" in - -* ) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - fi - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# mkinstalldirs ends here diff --git a/fluidbook/tools/swftools-special-swfdump/setup.py b/fluidbook/tools/swftools-special-swfdump/setup.py deleted file mode 100644 index 5ebbdcdcf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/setup.py +++ /dev/null @@ -1,338 +0,0 @@ -#!/usr/bin/env python - -from distutils import ccompiler -from distutils.core import CompileError - -try: - from setuptools import setup, Extension -except ImportError: - from distutils.core import setup, Extension - -cc = ccompiler.new_compiler() - -# leave it to gcc to detect c/c++ files. we'll be linking against -lstdc++ -# later on to ensure we do have all the c++ libraries, so we don't need to -# compile *everything* as c++ just because of the few .cc files. -cc.language_map[".cc"] = "c" - -import os -import sys -import stat -import re - -DATADIR = "/usr/share/swftools/" - -def update_dirs(list1, list2): - for v in list2: - if v not in list1 and os.path.isdir(v): - list1.append(v) - -def update_list(list1, list2): - for v in list2: - if v not in list1: - list1.append(v) - -COMPILER_OPTIONS = ['-fPIC', '-Wparentheses', '-Wimplicit', '-Wreturn-type', - '-O3', '-fomit-frame-pointer', '-Winline', - '-Wno-unused', '-Wno-strict-prototypes','-DHAVE_CONFIG_H', - '-DSWFTOOLS_DATADIR="'+DATADIR+'"'] -INCLUDE=['lib/lame/', 'lib/pdf/xpdf', 'lib/pdf'] - -if 'library_dirs' in os.environ: - update_dirs(cc.library_dirs, [path.strip() for path in os.environ.get('library_dirs').strip().split(":")]) -else: - update_dirs(cc.library_dirs, [os.path.join(sys.prefix, 'lib'), - os.path.join(sys.prefix, 'local/lib')]) - if sys.platform == "darwin": - update_list(cc.library_dirs, ["/sw/lib", "/opt/local/lib"]) - -if 'include_dirs' in os.environ: - update_dirs(cc.include_dirs, [path.strip() for path in os.environ.get('include_dirs').strip().split(":")]) -else: - update_dirs(cc.include_dirs, [os.path.join(sys.prefix, 'include'), - os.path.join(sys.prefix, 'include/freetype2'), - os.path.join(sys.prefix, 'include/fontconfig')]) - if sys.platform == "darwin": - update_dirs(cc.include_dirs, ["/sw/include/freetype2", "/sw/lib/freetype2/include", "/sw/include", "/opt/local/include"]) - - -class ConfigScript: - def __init__(self): - self.defines = [] - self.includefiles = [] - self.libraries = [] - - def unlink(self, filename): - try: - os.unlink(filename) - except OSError: - pass - - def test_code(self, head, body, stdh=1): - fi = open("setup_test.c", "wb") - if stdh: - fi.write("#include \n") - fi.write("#include \n") - for i in self.includefiles: - fi.write("#include <%s>\n" % i) - for d in self.defines: - fi.write("%s;\n" % d) - fi.write(head) - fi.write("\nint main()\n") - fi.write("{\n") - fi.write(body) - fi.write("\n}\n") - fi.close() - #fi = open("setup_test.c", "rb") - #print fi.read() - #fi.close() - - quiet = 1 - if quiet: - try: - # redirect stderr - sys.stderr.flush() - err = open('/dev/null', 'a+', 0) - olderr = open('/dev/null', 'a+', 0) - os.dup2(2, olderr.fileno()) - os.dup2(err.fileno(), 2) - except: - pass - - error = 0 - try: - cc.compile(["setup_test.c"], include_dirs=cc.include_dirs) - except CompileError: - error = 1 - - if quiet: - try: - # unredirect stderr - sys.stderr.flush() - err = open('/dev/null', 'a+', 0) - os.dup2(olderr.fileno(), 2) - olderr.close() - err.close() - except: - pass - - self.unlink("setup_test.o") - self.unlink("setup_test.obj") - self.unlink("setup_test.c") - if error: - return None - else: - return 1 - - def system_has_property(self,name): - if name.startswith("STD"): - return 1 - elif name.startswith("INTERNAL"): - return 1 - elif name == "PACKAGE": - return "\"swftools\"" - elif name == "VERSION": - fi = open("configure.in", "rb") - for line in fi.readlines(): - if line.startswith("VERSION="): - return '"'+line[8:].strip()+'"' - return "unknown" - elif "POPPLER" in name: - return None - elif name.startswith("HAVE_") and name.endswith("_H"): - header = name[5:].lower() - c = header.rfind("_") - if c>=0: - header = header[0:c]+"."+header[c+1] - header = header.replace("_","/") - ok = 0 - for dir in cc.include_dirs: - if os.path.isfile(os.path.join(dir,header)): - ok = 1 - break - if ok and self.test_code("#include <"+header+">", ""): - if header.startswith("sys"): - self.includefiles += [header] - return 1 - elif name.startswith("HAVE_LIB") \ - or name.startswith("HAVE_FONTCONFIG") \ - or name.startswith("HAVE_FREETYPE"): - if name.startswith("HAVE_LIB"): - libname = name[8:].lower() - else: - libname = name[5:].lower() - if cc.find_library_file(cc.library_dirs, libname): - update_list(self.libraries, [libname]) - return 1 - elif name.startswith("HAVE_LAME"): - return None - elif name.startswith("O_BINARY"): - if sys.platform.startswith("win"): - return None - else: - return 0 - elif name == "boolean": - if self.test_code("", "boolean b;"): - return None - else: - self.defines += ["typedef int boolean"] - return "int" - elif name.startswith("SIZEOF_"): - t = name[7:].lower().replace("_", " ") - if t == "voidp": - t = "void*" - for i in [1,2,4,8]: - s = "static int test_array [%d+1-sizeof(%s)*2];\ntest_array [0] = 0;" % (i*2,t) - if self.test_code("", s): - return i - return None - elif name.startswith("USE_FREEETYPE"): - # TODO: run a test here? - return 1 - elif name.startswith("HAVE_"): - function = name[5:].lower() - params="" - if function=="bcopy": - params = "0,0,0" - elif function=="bzero": - params = "0,0" - return self.test_code("", "%s(%s);" % (function,params), stdh=0) - return None - - def create_config(self): - print "Creating config.h..." - - fi = open("config.h.in", "rb") - fo = open("config.h", "wb") - for line in fi.readlines(): - if line.startswith("#undef "): - line = line.strip() - name = line[7:] - if " " in name: - name = name.split(" ")[0] - value = self.system_has_property(name) - if value is None: - fo.write("// %s is not set\n" % (name)) - else: - fo.write("#define %s %s\n" % (name, value)) - else: - fo.write(line) - fo.write("// python:lib "+(" ".join(self.libraries))+"\n") - fo.close() - fi.close() - - def load(self): - if not os.path.isfile("config.h"): - return 0 - fi = open("config.h", "rb") - for line in fi.readlines(): - if line.startswith("// python: lib "): - self.libraries = line[15:].split(" ") - fi.close() - return - -config = ConfigScript() -# if either setup.py or config.h.in were modfied, rebuild config.h -if not config.load() or \ - os.stat("setup.py")[stat.ST_MTIME] > os.stat("config.h")[stat.ST_MTIME] or \ - os.stat("config.h.in")[stat.ST_MTIME] > os.stat("config.h")[stat.ST_MTIME]: - config.create_config() -#print dir(cc) -#sys.exit(0) - -if "jpeg" not in config.libraries: - print "Error: Couldn't find jpeg library on your system" - sys.exit(1) - -if "freetype" not in config.libraries: - print "Error: Couldn't find freetype library on your system" - sys.exit(1) - -base_sources = [ -"lib/q.c", "lib/utf8.c", "lib/png.c", "lib/jpeg.c", "lib/wav.c", "lib/mp3.c", "lib/os.c", "lib/bitio.c", "lib/log.c", "lib/mem.c", -] -rfxswf_sources = [ -"lib/modules/swfaction.c", "lib/modules/swfbits.c", "lib/modules/swfbutton.c", -"lib/modules/swfcgi.c", "lib/modules/swfdraw.c", "lib/modules/swfdump.c", "lib/modules/swffilter.c", -"lib/modules/swffont.c", "lib/modules/swfobject.c", "lib/modules/swfrender.c", "lib/modules/swfshape.c", -"lib/modules/swfsound.c", "lib/modules/swftext.c", "lib/modules/swftools.c", -"lib/rfxswf.c", "lib/drawer.c", "lib/MD5.c", "lib/h.263/dct.c", "lib/h.263/h263tables.c", -"lib/h.263/swfvideo.c", "lib/action/assembler.c", "lib/action/compile.c", -"lib/action/lex.swf4.c", "lib/action/lex.swf5.c", "lib/action/libming.c", -"lib/action/swf4compiler.tab.c", "lib/action/swf5compiler.tab.c", "lib/action/actioncompiler.c", -"lib/as3/abc.c", "lib/as3/code.c", "lib/as3/pool.c", "lib/as3/files.c", "lib/as3/opcodes.c", -"lib/as3/scripts.c", "lib/as3/common.c", "lib/as3/builtin.c", "lib/as3/compiler.c", "lib/as3/expr.c", "lib/as3/import.c", -"lib/as3/initcode.c", "lib/as3/parser.tab.c", "lib/as3/registry.c", "lib/as3/tokenizer.yy.c", -] -libpdf_sources = [ -"lib/pdf/GFXOutputDev.cc", "lib/pdf/InfoOutputDev.cc", "lib/pdf/BitmapOutputDev.cc", -"lib/pdf/FullBitmapOutputDev.cc", "lib/pdf/pdf.cc", "lib/pdf/fonts.c", "lib/pdf/xpdf/GHash.cc", -"lib/pdf/xpdf/GList.cc", "lib/pdf/xpdf/GString.cc", "lib/pdf/xpdf/gmem.cc", "lib/pdf/xpdf/gfile.cc", -"lib/pdf/xpdf/FoFiTrueType.cc", "lib/pdf/xpdf/FoFiType1.cc", "lib/pdf/xpdf/FoFiType1C.cc", -"lib/pdf/xpdf/FoFiBase.cc", "lib/pdf/xpdf/FoFiEncodings.cc", "lib/pdf/xpdf/OutputDev.cc", "lib/pdf/xpdf/PDFDoc.cc", -"lib/pdf/xpdf/Error.cc", "lib/pdf/xpdf/Stream.cc", "lib/pdf/xpdf/Object.cc", "lib/pdf/xpdf/Decrypt.cc", -"lib/pdf/xpdf/Array.cc", "lib/pdf/xpdf/XRef.cc", "lib/pdf/xpdf/Dict.cc", "lib/pdf/xpdf/Parser.cc", -"lib/pdf/xpdf/Lexer.cc", "lib/pdf/xpdf/Outline.cc", "lib/pdf/xpdf/PDFDocEncoding.cc", "lib/pdf/xpdf/Catalog.cc", -"lib/pdf/xpdf/Link.cc", "lib/pdf/xpdf/GlobalParams.cc", "lib/pdf/xpdf/JBIG2Stream.cc", "lib/pdf/xpdf/Page.cc", -"lib/pdf/xpdf/JPXStream.cc", "lib/pdf/xpdf/JArithmeticDecoder.cc", "lib/pdf/xpdf/Gfx.cc", "lib/pdf/xpdf/GfxFont.cc", -"lib/pdf/xpdf/CMap.cc", "lib/pdf/xpdf/CharCodeToUnicode.cc", "lib/pdf/xpdf/PSTokenizer.cc", "lib/pdf/xpdf/FontEncodingTables.cc", -"lib/pdf/xpdf/BuiltinFont.cc", "lib/pdf/xpdf/BuiltinFontTables.cc", "lib/pdf/xpdf/GfxState.cc", "lib/pdf/xpdf/Function.cc", -"lib/pdf/xpdf/Annot.cc", "lib/pdf/xpdf/NameToCharCode.cc", "lib/pdf/xpdf/UnicodeMap.cc", "lib/pdf/xpdf/SecurityHandler.cc", -"lib/pdf/xpdf/SplashOutputDev.cc", "lib/pdf/xpdf/SplashFont.cc", "lib/pdf/xpdf/SplashState.cc", "lib/pdf/xpdf/Splash.cc", -"lib/pdf/xpdf/SplashBitmap.cc", "lib/pdf/xpdf/SplashClip.cc", "lib/pdf/xpdf/SplashPattern.cc", "lib/pdf/xpdf/SplashFontEngine.cc", -"lib/pdf/xpdf/SplashFontFile.cc", "lib/pdf/xpdf/SplashFontFileID.cc", "lib/pdf/xpdf/SplashScreen.cc", "lib/pdf/xpdf/SplashPath.cc", -"lib/pdf/xpdf/SplashXPath.cc", "lib/pdf/xpdf/SplashXPathScanner.cc", "lib/pdf/xpdf/SplashFTFontEngine.cc", -"lib/pdf/xpdf/SplashFTFontFile.cc", "lib/pdf/xpdf/SplashFTFont.cc"] - -libgfx_sources = [ -"lib/gfxtools.c", "lib/gfxfont.c", "lib/gfxpoly.c", -"lib/devices/dummy.c", "lib/devices/file.c", "lib/devices/render.c", "lib/devices/text.c", "lib/devices/record.c", -"lib/devices/ops.c", "lib/devices/polyops.c", "lib/devices/bbox.c", "lib/devices/rescale.c", -"lib/art/art_affine.c", "lib/art/art_alphagamma.c", "lib/art/art_bpath.c", "lib/art/art_gray_svp.c", -"lib/art/art_misc.c", "lib/art/art_pixbuf.c", "lib/art/art_rect.c", "lib/art/art_rect_svp.c", -"lib/art/art_rect_uta.c", "lib/art/art_render.c", "lib/art/art_render_gradient.c", "lib/art/art_render_mask.c", -"lib/art/art_render_svp.c", "lib/art/art_rgb.c", "lib/art/art_rgb_a_affine.c", "lib/art/art_rgb_affine.c", -"lib/art/art_rgb_affine_private.c", "lib/art/art_rgb_bitmap_affine.c", "lib/art/art_rgb_pixbuf_affine.c", -"lib/art/art_rgb_rgba_affine.c", "lib/art/art_rgb_svp.c", "lib/art/art_rgba.c", "lib/art/art_svp.c", -"lib/art/art_svp_intersect.c", "lib/art/art_svp_ops.c", "lib/art/art_svp_point.c", -"lib/art/art_svp_render_aa.c", "lib/art/art_svp_vpath.c", "lib/art/art_svp_vpath_stroke.c", -"lib/art/art_svp_wind.c", "lib/art/art_uta.c", "lib/art/art_uta_ops.c", "lib/art/art_uta_rect.c", -"lib/art/art_uta_svp.c", "lib/art/art_uta_vpath.c", "lib/art/art_vpath.c", "lib/art/art_vpath_bpath.c", -"lib/art/art_vpath_dash.c", "lib/art/art_vpath_svp.c", "lib/gocr/box.c", -"lib/gocr/database.c", "lib/gocr/detect.c", "lib/gocr/job.c", "lib/gocr/lines.c", "lib/gocr/list.c", -"lib/gocr/ocr0.c", "lib/gocr/ocr0n.c", "lib/gocr/ocr1.c", "lib/gocr/otsu.c", "lib/gocr/output.c", -"lib/gocr/pgm2asc.c", "lib/gocr/pixel.c", "lib/gocr/progress.c", "lib/gocr/remove.c", "lib/gocr/unicode.c", -"lib/devices/ocr.c", -] -gfxswf_sources = ["lib/devices/swf.c", "lib/readers/swf.c", "lib/readers/image.c"] - -swf_module = Extension( - name='SWF', - include_dirs=cc.include_dirs+INCLUDE, - sources=['lib/python/SWF.c', 'lib/python/taglist.c', 'lib/python/tag.c', 'lib/python/image.c', - 'lib/python/tags.c', 'lib/python/tagmap.c', 'lib/python/action.c', 'lib/python/primitives.c', - 'lib/python/pyutils.c'] + base_sources + rfxswf_sources, - library_dirs=cc.library_dirs, - libraries=config.libraries, - extra_objects=['%s/lib/python%s/site-packages/PIL/_imaging.so' % (sys.prefix, sys.version[:3])], - extra_compile_args=COMPILER_OPTIONS, - ) - -gfx_module = Extension( - name='gfx', - sources=['lib/python/gfx.c'] + base_sources + libgfx_sources + rfxswf_sources + libpdf_sources + gfxswf_sources, - include_dirs=cc.include_dirs+INCLUDE, - library_dirs=cc.library_dirs, - libraries=config.libraries + ["stdc++"], - extra_objects=[], - extra_compile_args=COMPILER_OPTIONS, - ) - -setup(name='SWFTools', - version='0.9dev', - description='Python wrapper for SWFTools', - author='Matthias Kramm', - author_email='kramm@quiss.org', - url='http://www.swftools.org/', - ext_modules=[swf_module, gfx_module], -) diff --git a/fluidbook/tools/swftools-special-swfdump/src/Makefile b/fluidbook/tools/swftools-special-swfdump/src/Makefile deleted file mode 100644 index 33375ef96..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/Makefile +++ /dev/null @@ -1,164 +0,0 @@ -top_builddir = .. -srcdir = . -top_srcdir = .. -include ../Makefile.common - -install_programs = wav2swf$(E) png2swf$(E) swfcombine$(E) swfstrings$(E) swfextract$(E) swfdump$(E) swfc$(E) jpeg2swf$(E) swfbbox$(E) font2swf$(E) swfrender$(E) as3compile$(E) pdf2swf$(E) -programs = $(install_programs) swfbytes$(E) ttftool$(E) - -all: $(programs) - -wav2swf.$(O): wav2swf.c ../lib/wav.h - $(C) wav2swf.c -o $@ -png2swf.$(O): png2swf.c - $(C) png2swf.c -o $@ -pdf2swf.$(O): pdf2swf.c - $(C) pdf2swf.c -o $@ -pdf2pdf.$(O): pdf2pdf.c - $(C) pdf2pdf.c -o $@ -gfx2gfx.$(O): gfx2gfx.c - $(C) gfx2gfx.c -o $@ -gif2swf.$(O): gif2swf.c - $(C) gif2swf.c -o $@ -swfcombine.$(O): swfcombine.c - $(C) swfcombine.c -o $@ -swfdump.$(O): swfdump.c - $(C) swfdump.c -o $@ -swfextract.$(O): swfextract.c - $(C) swfextract.c -o $@ -swfstrings.$(O): swfstrings.c - $(C) swfstrings.c -o $@ -swfbbox.$(O): swfbbox.c - $(C) swfbbox.c -o $@ -swf2png.$(O): swf2png.c - $(C) swf2png.c -o $@ -jpeg2swf.$(O): jpeg2swf.c - $(C) jpeg2swf.c -o $@ -swfrender.$(O): swfrender.c - $(C) swfrender.c -o $@ -swfbytes.$(O): swfbytes.c - $(C) swfbytes.c -o $@ -font2swf.$(O): font2swf.c - $(C) font2swf.c -o $@ -ttftool.$(O): ttftool.c - $(C) ttftool.c -o $@ -as3compile.$(O): as3compile.c - $(C) as3compile.c -o $@ -swfc.$(O): swfc.c parser.h ../lib/q.h - $(C) swfc.c -o $@ -swfc-feedback.$(O): swfc-feedback.c swfc-feedback.h - $(C) swfc-feedback.c -o $@ -swfc-history.$(O): swfc-history.c swfc-history.h swfc-interpolation.h ../lib/q.h - $(C) swfc-history.c -o $@ -swfc-interpolation.$(O): swfc-interpolation.c swfc-interpolation.h ../lib/q.h - $(C) swfc-interpolation.c -o $@ -parser.$(O): parser.yy.c parser.h ../lib/q.h - $(C) parser.yy.c -o $@ - -../lib/librfxswf$(A): ../lib/modules/swfrender.c ../lib/modules/swfshape.c ../lib/modules/swftext.c ../lib/modules/swffont.c ../lib/modules/swfbits.c ../lib/rfxswf.c ../lib/devices/swf.c ../lib/modules/swfalignzones.c - cd ../lib;$(MAKE) librfxswf$(A);cd - - -../lib/libgfxpdf$(A): ../lib/pdf/VectorGraphicOutputDev.cc - cd ../lib;$(MAKE) libgfxpdf$(A);cd - - -../lib/libgfx$(A): ../lib/devices/*.c ../lib/gfxdevice.h ../lib/gfxtools.c ../lib/gfxfont.c - cd ../lib;$(MAKE) libgfx$(A);cd - - -../lib/libgfxswf$(A): ../lib/devices/swf.c ../lib/readers/swf.c - cd ../lib;$(MAKE) libgfxswf$(A);cd - - -# TODO: include the following rule only if lex is available -parser.yy.c: parser.lex - flex -B -s -oparser.yy.c parser.lex - -wav2swf$(E): wav2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) wav2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -png2swf$(E): png2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) png2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -gif2swf$(E): gif2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) gif2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfcombine$(E): swfcombine.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfcombine.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfdump$(E): swfdump.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfdump.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfbytes$(E): swfbytes.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfbytes.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swf2png$(E): swf2png.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swf2png.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfextract$(E): swfextract.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfextract.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfstrings$(E): swfstrings.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfstrings.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfbbox$(E): swfbbox.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfbbox.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -font2swf$(E): font2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) font2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -ttftool$(E): ttftool.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) ttftool.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -as3compile$(E): as3compile.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) as3compile.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -jpeg2swf$(E): jpeg2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) jpeg2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfrender$(E): swfrender.$(O) ../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) - $(L) swfrender.$(O) -o $@ ../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ - -PDF2SWF_OBJ=../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfxpdf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) -OCR_OBJ=../lib/libocr$(A) - -pdf2swf$(E): pdf2swf.$(O) $(PDF2SWF_OBJ) - $(LL) pdf2swf.$(O) -o $@ $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) - $(STRIP) $@ -pdf2pdf$(E): pdf2pdf.$(O) $(PDF2SWF_OBJ) - $(LL) pdf2pdf.$(O) -o $@ $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) - $(STRIP) $@ -gfx2gfx$(E): gfx2gfx.$(O) $(OCR_OBJ) $(PDF2SWF_OBJ) - $(LL) gfx2gfx.$(O) -o $@ $(OCR_OBJ) $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) - $(STRIP) $@ -swfc$(E): parser.$(O) swfc.$(O) swfc-feedback.$(O) swfc-history.$(O) swfc-interpolation.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) parser.$(O) swfc.$(O) swfc-feedback.$(O) swfc-history.$(O) swfc-interpolation.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ - -install: - $(mkinstalldirs) $(bindir) - $(mkinstalldirs) $(man1dir) - @for file in $(install_programs); do if test -f $$file;then $(INSTALL_BIN);$(INSTALL_MAN1);fi;done - -uninstall: - @for file in $(install_programs); do $(UNINSTALL_BIN);$(UNINSTALL_MAN1);done - -clean: - rm -f *.o *.obj *.lo *.la *~ gmon.out - rm -f as3compile gif2swf swfbbox swfbytes swfbytes swfdump pdf2swf wav2swf png2swf swfcombine swfextract swfstrings png2swf jpeg2swf swfc font2swf pdf2pdf gfx2gfx - @rm -f gif2swf.exe swfbytes.exe swfbytes.exe pdf2swf.exe swfbbox.exe swfdump.exe wav2swf.exe png2swf.exe swfcombine.exe swfextract.exe swfstrings.exe png2swf.exe jpeg2swf.exe swfc.exe font2swf.exe pdf2pdf.exe gfx2gfx.exe - @rm -f gif2swf$(E) pdf2swf$(E) swfbytes$(E) swfbytes$(E) swfbbox$(E) swfdump$(E) wav2swf$(E) png2swf$(E) swfcombine$(E) swfextract$(E) swfstrings$(E) png2swf$(E) jpeg2swf$(E) swfc$(E) font2swf$(E) pdf2pdf$(E) gfx2gfx$(E) - -doc: - perl ../parsedoc.pl wav2swf.doc - perl ../parsedoc.pl png2swf.doc - perl ../parsedoc.pl gif2swf.doc - perl ../parsedoc.pl swfbbox.doc - perl ../parsedoc.pl font2swf.doc - perl ../parsedoc.pl jpeg2swf.doc - perl ../parsedoc.pl swfcombine.doc - perl ../parsedoc.pl swfdump.doc - perl ../parsedoc.pl swfc.doc - perl ../parsedoc.pl as3compile.doc - perl ../parsedoc.pl swfbytes.doc - perl ../parsedoc.pl pdf2pdf.doc - -.PHONY: clean doc diff --git a/fluidbook/tools/swftools-special-swfdump/src/Makefile.in b/fluidbook/tools/swftools-special-swfdump/src/Makefile.in deleted file mode 100644 index e2712e00a..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/Makefile.in +++ /dev/null @@ -1,164 +0,0 @@ -top_builddir = .. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -include ../Makefile.common - -install_programs = wav2swf$(E) @PNG2SWF@ swfcombine$(E) swfstrings$(E) swfextract$(E) swfdump$(E) swfc$(E) @JPEG2SWF@ @GIF2SWF@ swfbbox$(E) font2swf$(E) swfrender$(E) as3compile$(E) @PDF2SWF@ @PDF2PDF@ -programs = $(install_programs) swfbytes$(E) ttftool$(E) - -all: $(programs) - -wav2swf.$(O): wav2swf.c ../lib/wav.h - $(C) wav2swf.c -o $@ -png2swf.$(O): png2swf.c - $(C) png2swf.c -o $@ -pdf2swf.$(O): pdf2swf.c - $(C) pdf2swf.c -o $@ -pdf2pdf.$(O): pdf2pdf.c - $(C) pdf2pdf.c -o $@ -gfx2gfx.$(O): gfx2gfx.c - $(C) gfx2gfx.c -o $@ -gif2swf.$(O): gif2swf.c - $(C) gif2swf.c -o $@ -swfcombine.$(O): swfcombine.c - $(C) swfcombine.c -o $@ -swfdump.$(O): swfdump.c - $(C) swfdump.c -o $@ -swfextract.$(O): swfextract.c - $(C) swfextract.c -o $@ -swfstrings.$(O): swfstrings.c - $(C) swfstrings.c -o $@ -swfbbox.$(O): swfbbox.c - $(C) swfbbox.c -o $@ -swf2png.$(O): swf2png.c - $(C) swf2png.c -o $@ -jpeg2swf.$(O): jpeg2swf.c - $(C) jpeg2swf.c -o $@ -swfrender.$(O): swfrender.c - $(C) swfrender.c -o $@ -swfbytes.$(O): swfbytes.c - $(C) swfbytes.c -o $@ -font2swf.$(O): font2swf.c - $(C) font2swf.c -o $@ -ttftool.$(O): ttftool.c - $(C) ttftool.c -o $@ -as3compile.$(O): as3compile.c - $(C) as3compile.c -o $@ -swfc.$(O): swfc.c parser.h ../lib/q.h - $(C) swfc.c -o $@ -swfc-feedback.$(O): swfc-feedback.c swfc-feedback.h - $(C) swfc-feedback.c -o $@ -swfc-history.$(O): swfc-history.c swfc-history.h swfc-interpolation.h ../lib/q.h - $(C) swfc-history.c -o $@ -swfc-interpolation.$(O): swfc-interpolation.c swfc-interpolation.h ../lib/q.h - $(C) swfc-interpolation.c -o $@ -parser.$(O): parser.yy.c parser.h ../lib/q.h - $(C) parser.yy.c -o $@ - -../lib/librfxswf$(A): ../lib/modules/swfrender.c ../lib/modules/swfshape.c ../lib/modules/swftext.c ../lib/modules/swffont.c ../lib/modules/swfbits.c ../lib/rfxswf.c ../lib/devices/swf.c ../lib/modules/swfalignzones.c - cd ../lib;$(MAKE) librfxswf$(A);cd - - -../lib/libgfxpdf$(A): ../lib/pdf/VectorGraphicOutputDev.cc - cd ../lib;$(MAKE) libgfxpdf$(A);cd - - -../lib/libgfx$(A): ../lib/devices/*.c ../lib/gfxdevice.h ../lib/gfxtools.c ../lib/gfxfont.c - cd ../lib;$(MAKE) libgfx$(A);cd - - -../lib/libgfxswf$(A): ../lib/devices/swf.c ../lib/readers/swf.c - cd ../lib;$(MAKE) libgfxswf$(A);cd - - -# TODO: include the following rule only if lex is available -parser.yy.c: parser.lex - flex -B -s -oparser.yy.c parser.lex - -wav2swf$(E): wav2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) wav2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -png2swf$(E): png2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) png2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -gif2swf$(E): gif2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) gif2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfcombine$(E): swfcombine.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfcombine.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfdump$(E): swfdump.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfdump.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfbytes$(E): swfbytes.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfbytes.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swf2png$(E): swf2png.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swf2png.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfextract$(E): swfextract.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfextract.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfstrings$(E): swfstrings.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfstrings.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfbbox$(E): swfbbox.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) swfbbox.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -font2swf$(E): font2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) font2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -ttftool$(E): ttftool.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) ttftool.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -as3compile$(E): as3compile.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) as3compile.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -jpeg2swf$(E): jpeg2swf.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) jpeg2swf.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ -swfrender$(E): swfrender.$(O) ../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) - $(L) swfrender.$(O) -o $@ ../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ - -PDF2SWF_OBJ=../lib/libgfxswf$(A) ../lib/librfxswf$(A) ../lib/libgfxpdf$(A) ../lib/libgfx$(A) ../lib/libbase$(A) -OCR_OBJ=../lib/libocr$(A) - -pdf2swf$(E): pdf2swf.$(O) $(PDF2SWF_OBJ) - $(LL) pdf2swf.$(O) -o $@ $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) - $(STRIP) $@ -pdf2pdf$(E): pdf2pdf.$(O) $(PDF2SWF_OBJ) - $(LL) pdf2pdf.$(O) -o $@ $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) - $(STRIP) $@ -gfx2gfx$(E): gfx2gfx.$(O) $(OCR_OBJ) $(PDF2SWF_OBJ) - $(LL) gfx2gfx.$(O) -o $@ $(OCR_OBJ) $(PDF2SWF_OBJ) $(LIBS) $(CXXLIBS) - $(STRIP) $@ -swfc$(E): parser.$(O) swfc.$(O) swfc-feedback.$(O) swfc-history.$(O) swfc-interpolation.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) parser.$(O) swfc.$(O) swfc-feedback.$(O) swfc-history.$(O) swfc-interpolation.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - $(STRIP) $@ - -install: - $(mkinstalldirs) $(bindir) - $(mkinstalldirs) $(man1dir) - @for file in $(install_programs); do if test -f $$file;then $(INSTALL_BIN);$(INSTALL_MAN1);fi;done - -uninstall: - @for file in $(install_programs); do $(UNINSTALL_BIN);$(UNINSTALL_MAN1);done - -clean: - rm -f *.o *.obj *.lo *.la *~ gmon.out - rm -f as3compile gif2swf swfbbox swfbytes swfbytes swfdump pdf2swf wav2swf png2swf swfcombine swfextract swfstrings png2swf jpeg2swf swfc font2swf pdf2pdf gfx2gfx - @rm -f gif2swf.exe swfbytes.exe swfbytes.exe pdf2swf.exe swfbbox.exe swfdump.exe wav2swf.exe png2swf.exe swfcombine.exe swfextract.exe swfstrings.exe png2swf.exe jpeg2swf.exe swfc.exe font2swf.exe pdf2pdf.exe gfx2gfx.exe - @rm -f gif2swf$(E) pdf2swf$(E) swfbytes$(E) swfbytes$(E) swfbbox$(E) swfdump$(E) wav2swf$(E) png2swf$(E) swfcombine$(E) swfextract$(E) swfstrings$(E) png2swf$(E) jpeg2swf$(E) swfc$(E) font2swf$(E) pdf2pdf$(E) gfx2gfx$(E) - -doc: - perl ../parsedoc.pl wav2swf.doc - perl ../parsedoc.pl png2swf.doc - perl ../parsedoc.pl gif2swf.doc - perl ../parsedoc.pl swfbbox.doc - perl ../parsedoc.pl font2swf.doc - perl ../parsedoc.pl jpeg2swf.doc - perl ../parsedoc.pl swfcombine.doc - perl ../parsedoc.pl swfdump.doc - perl ../parsedoc.pl swfc.doc - perl ../parsedoc.pl as3compile.doc - perl ../parsedoc.pl swfbytes.doc - perl ../parsedoc.pl pdf2pdf.doc - -.PHONY: clean doc diff --git a/fluidbook/tools/swftools-special-swfdump/src/as3compile b/fluidbook/tools/swftools-special-swfdump/src/as3compile deleted file mode 100644 index 0eb99eb9feb9635ff8bf9cc3429a3ce39318322c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813707 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 z 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%0ADMeuup~{X!?oH|_y_lX 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�E{AQ!4% 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%0A{&MUlrR9{Bq-3f58`US0TLo~g!)$f~^ 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 can be an .abc or .swf file. -.TP -\fB\-I\fR, \fB\-\-include\fR \fIdir\fR - Add additional include dir \fIdir\fR. -.TP -\fB\-N\fR, \fB\-\-local-with-network\fR - Make output file "local with networking" -.TP -\fB\-L\fR, \fB\-\-local-with-filesystem\fR - Make output file "local with filesystem" -.TP -\fB\-T\fR, \fB\-\-flashversion\fR \fInum\fR - \fInum\fR must be >= 9. -.TP -\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR - Set output file to \fIfilename\fR. -.SH EXAMPLE - - The following is a basic as3 file that can be compiled e.g. - with \fBas3compile -X 400 -Y 400 smiley.as\fR - - // smiley.as - package - { - import flash.display.MovieClip - - public class Main extends MovieClip - { - function Main() - { - this.graphics.beginFill(0xcccc00) - this.graphics.drawCircle(200,200,200) - this.graphics.endFill() - this.graphics.beginFill(0x000000) - this.graphics.drawCircle(140,150,50) - this.graphics.drawCircle(260,150,50) - this.graphics.drawRoundRect(140,270,120,10,20); - this.graphics.endFill() - } - } - } - -.SH AUTHOR - -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/as3compile.c b/fluidbook/tools/swftools-special-swfdump/src/as3compile.c deleted file mode 100644 index 9ee4569ed..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/as3compile.c +++ /dev/null @@ -1,277 +0,0 @@ -/* as3compile.c - Compiles ActionScript 3.0 (.as) files into .swf files. - - Part of the swftools package. - - Copyright (c) 2008/2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" -#include "../lib/q.h" -#include "../lib/os.h" - -static char * filename = 0; -static char * outputname = 0; -static int override_outputname = 0; -static int do_cgi = 0; -static double framerate = 25.0; -static double width = 400; -static double height = 300; -static int flashversion = 9; -static int verbose = 1; -static char local_with_networking = 0; -static char local_with_filesystem = 0; -static char*mainclass = 0; - -static struct options_t options[] = { -{"h", "help"}, -{"V", "version"}, -{"v", "verbose"}, -{"q", "quiet"}, -{"C", "cgi"}, -{"R", "resolve"}, -{"D", "define"}, -{"X", "width"}, -{"Y", "height"}, -{"r", "rate"}, -{"M", "mainclass"}, -{"l", "library"}, -{"I", "include"}, -{"N", "local-with-network"}, -{"L", "local-with-filesystem"}, -{"T", "flashversion"}, -{"o", "output"}, -{0,0} -}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("swfc - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else if(!strcmp(name, "o")) { - outputname = val; - override_outputname = 1; - return 1; - } - else if(!strcmp(name, "r")) { - framerate = atof(val); - return 1; - } - else if(!strcmp(name, "M")) { - mainclass = val; - return 1; - } - else if(!strcmp(name, "v")) { - verbose++; - return 0; - } - else if(!strcmp(name, "q")) { - verbose--; - return 0; - } - else if(!strcmp(name, "X")) { - width = atof(val); - return 1; - } - else if(!strcmp(name, "Y")) { - height = atof(val); - return 1; - } - else if(!strcmp(name, "T")) { - flashversion = atoi(val); - return 1; - } - else if(!strcmp(name, "C")) { - do_cgi = 1; - return 0; - } - else if(!strcmp(name, "l")) { - as3_import_file(val); - return 1; - } - else if(!strcmp(name, "I")) { - as3_add_include_dir(val); - return 1; - } - else if(!strcmp(name, "R")) { - as3_set_option("recurse","1"); - return 0; - } - else if(!strcmp(name, "D")) { - if(!strstr(val, "::")) { - fprintf(stderr, "Error: compile definition must contain \"::\"\n"); - exit(1); - } - as3_set_define(val); - return 1; - } - else if (!strcmp(name, "N")) - { - local_with_networking = 1; - return 0; - } - else if (!strcmp(name, "L")) - { - local_with_filesystem = 1; - return 0; - } - else { - printf("Unknown option: -%s\n", name); - exit(1); - } - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s file.as [-o file.swf] \n", name); - printf("\n"); - printf("-h , --help Print short help message and exit\n"); - printf("-V , --version Print version info and exit\n"); - printf("-v , --verbose Increase verbosity\n"); - printf("-q , --quiet Decrease verbosity\n"); - printf("-C , --cgi Output to stdout (for use in CGI environments)\n"); - printf("-R , --resolve Try to resolve undefined classes automatically.\n"); - printf("-D , --define Set a compile time variable (for doing conditional compilation)\n"); - printf("-X , --width Set target SWF width\n"); - printf("-Y , --height Set target SWF width\n"); - printf("-r , --rate Set target SWF framerate\n"); - printf("-M , --mainclass Set the name of the main class (extending flash.display.MovieClip or .Sprite)\n"); - printf("-l , --library Include library file . can be an .abc or .swf file.\n"); - printf("-I , --include

Add additional include dir .\n"); - printf("-N , --local-with-network Make output file \"local with networking\"\n"); - printf("-L , --local-with-filesystem Make output file \"local with filesystem\"\n"); - printf("-T , --flashversion Set target SWF flash version to .\n"); - printf("-o , --output Set output file to .\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", - filename, name); - } - filename = name; - return 0; -} - -void writeSWF(SWF*swf) -{ - int fi = -1; - if(do_cgi || !strcmp(filename, "-")) - fi = fileno(stdout); - else - fi = open(outputname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - if(fi<0) { - fprintf(stderr, "couldn't create output file %s\n", filename); - exit(1); - } - if(do_cgi) { - if(swf_WriteCGI(swf)<0) { - fprintf(stderr, "WriteCGI failed.\n"); - exit(1); - } - } else { - if(swf_WriteSWF(fi, swf)<0) { - fprintf(stderr, "WriteSWF() failed.\n"); - exit(1); - } - } -} - -int main (int argc,char ** argv) -{ - char buf[512]; - char*currentdir = getcwd(buf, 512); - if(!currentdir) { - as3_warning("Could not determine the current directory"); - } else { - as3_add_include_dir(currentdir); - } - - int t; - processargs(argc, argv); - as3_setverbosity(verbose); - - if(!filename) { - args_callback_usage(argv[0]); - exit(1); - } - if(!outputname) { - outputname = stripFilename(filename, ".swf"); - //as3_warning("output name not given, writing to %s", outputname); - } - - if(!strcmp(filename, ".")) { - as3_parse_directory("."); - } else { - as3_parse_file(filename); - } - - void*code = as3_getcode(); - - SWF swf; - memset(&swf, 0, sizeof(swf)); - swf.fileVersion = flashversion; - swf.frameRate = framerate*0x100; - swf.movieSize.xmin = 0; - swf.movieSize.ymin = 0; - swf.movieSize.xmax = width*20; - swf.movieSize.ymax = height*20; - TAG*tag = swf.firstTag = swf_InsertTag(0, ST_DOABC); - swf_WriteABC(tag, code); - - if(!mainclass) - mainclass = as3_getglobalclass(); - if(mainclass) { - tag = swf_InsertTag(tag, ST_SYMBOLCLASS); - swf_SetU16(tag, 1); - swf_SetU16(tag, 0); - swf_SetString(tag, mainclass); - } else { - as3_warning("no global public MovieClip subclass"); - } - - as3_destroy(); - - tag = swf_InsertTag(tag, ST_SHOWFRAME); - tag = swf_InsertTag(tag, ST_END); - - swf_FreeABC(code); - - if(local_with_filesystem) - swf.fileAttributes &= ~FILEATTRIBUTE_USENETWORK; - if(local_with_networking) - swf.fileAttributes |= FILEATTRIBUTE_USENETWORK; - - writeSWF(&swf); - swf_FreeTags(&swf); - - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/src/font2swf b/fluidbook/tools/swftools-special-swfdump/src/font2swf deleted file mode 100644 index ef8e4c8aaac9a77d535574227650daf2dcdc70fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819938 zcmceZ*$dMFq<>O8!-pXYcMMVE*wac}j2my;!+W z=>a%h;26U=&l&IBQ~@g1+bKaM4Q~gY3NyYU)dPsIhc9K2_}lfiB;=dR|f>%dLR8r3X*v>CF9Q}{u0X+d1ksiGoAHTO!=+1RX&!D z&jvGoL#hW5VGmy>_pUc-`J47hZ~?>HT4X7=wfF_zdT+WyfQt3D(%p=7vSc#;$NpM! z-eTr=)_O6kP*mua)2M@x!8PTJmWHaXsmdFD&FGQC zmME*rp^>>t@^jLFAVI@@XQmjigF#^!|`Z%W|+8qyf4CYIi4|iX5m?m zX9^zc*WU~@;GKo14o?}LOYz)@XCa=6c>3X4gl8xo{%*%}10J@@SUk0OX5*QJX9Aw7 zc=)?XzR*+T?^g5e!F!q+wq89E2%12Zg*4wTyi4(%XTl@!E-=G`w9?h%--Ki8VU0p{DX8+Ue*BtqAip_O=B{Vp{T+Z9MNgBe{YWi`U*ns7DV zSK%qg^MHxt>q=X=65)+Dn8E99@WlxGOqllVJ~O-l?;&QGuWVcRr?xPI_u_Hl$s}O@ zrdt8LFT_I~re2edWsW+XiqDg-l++ZRo9j}P)D%yRG9%Y}ztZcb%h#p%2c4(KX4svv z*`A+1sr2?B&9wfhi(qdqas1TNpS<{^j?-qa&#_;W;#q))dc6=2^?orP))94wI$^aP zb&9&qcA#BgIaq$`Ap0xpm;K3JUaOuT1m60wu2{#DSI$wUY8A6aWaPcOGqS$V6u@7M z{nY!<=jP=de)CAbW%ZX`_|%+7*L~N%`;}v_Z2S2+|M}nkzny++_0pCt{ocIx4}A~b z-#ln$i+4fOHv|6iyO;ZqFF*gvM=qZG-+x%VXXCbEyM8+Bw%ZP0b>e}*iu5afxj%OO zHP1iu`{1miSUl^!du9)s*!z(IjicWF zpTGX|;nl7Ong?C+;O0F==gu)+IQ);^J7$kRw!itF`)~RE_Gb$GZ+~`2{g~J8{oVbu zIyY9#dZGTyejgl|`n#u7U#fhg)a&z`6m6ZljOhGq+gW8$C9Te32(`8O%lG$ z>|gtn@?B@e}GWqmP;&Z8qAC!b&Y|8T}-uCiNGU*2-@&CZYXC?8u#Kd2b#3$FpNAR}ur~k>{ ze`T>CXyAzLHp6ktgqe=9eNsON_34chUm5E99{AZK@{-knooa67-Bt9=mv@$Y@ z{&f?-EeUVghe=8K)|m9AN&N3O@h{?SFE4!#{-!7Kw`l6l!hcy3eU4NJn8iA8 z^O+d=3YhdIN%Sq?PdW1oCB0#$DmL?NH1lnvG9+X@^470hkuy(+=XY# zzZ!Vv8(QZTd{FJ;_k_v6CW-$&LY@m0m&wPf|NBijOP)GYo}ig;P7?iFqW-g$k|h2P zlaK3Z$!DP{PnyZ6J$R=4Lrr|iT@r7}bG|8OMN&J?HTicW)#nE$ezPgRmG5n4J$TIa z0-5;z+N7^d(ucvoNW=ep8;+ zN%H*Jq~C4Un^ivxP5k<#eE))cGnFsnO0ld@v$#ssl*eV(gV`OGDwB`X>_-;=CXE@%y7Ge{wy1D(JJ7%}IJY&MKE#pDvS6Ka+oriMQ%!9^wZmeU#l-c}z7>qWjIOJzZs$kF0eh(yH}@(h47fyWXi8?7wAr!uINmMtm|C}mX@ z0VPnrY*}T11c7BsgQd%s1{R5|Mko_!6c;USEi0Z_SyndV-ik6J zCY1$?CoZa79xN_cIKPq@k+Gd*YT3%-iStVnug0d=$fnZ-eb^a1TBlEB&m|9k4 zvZsj1Jc!I?QIOwsNHA?tRatrQ^hNifVl62XGE>AZfF%)97fe_t1o%lPhy~lSVqaP5 zvLzMEmJ1oklyWYaUttM3ZQ1hR^3uvh6+tN}WGR(GRD^=1Ed26dWogB|cr92K3MxxN zOPTtf<;zgpOUjlos-mp2a#^LaWPW-1vQlNy^7+Bwy~>K^ODifDEe!_9Ah;}4t^@+* zq2&veKxsL}DHkfRgv>y&v~>RRveG3Y99&keRF*Aey&KsamGAu6(D$6R$mX02Y zjHt&@@4);;Q^*!rS-B`!24odF zOAv1mE?vf``N2iYmO??%5sHfgW_00CiUkvPm8Hv+0EIy`+rsQ^OXkahuriq8a!QX3 z$`;HI&Ijq8%a=<^pwKH=H+Rl2U0kp%v^1!M&&`N?Yhan=h*AMvIlnkK|E}c< zD-W`XWY9j8g$b#M2vVCWf|W8INu+uqfU?bBzGOlu5GaGbl`ji+@t;0xA}bFPGKCO< zs1;?E%TbY2LrX*s)J&0S+0wfdQTLU__o4bsQ&KE7Z)vE!T$YQG40~`8#LPqP{HOw}>ZB(x)cq^VUj#tq0<)HDRXn*zjC$wtkuoztKYC zJn@Lb=vekC?M*Q>4HLK}Xmg~YqUhPUR7jIOfb@3GO>*znwsv3~1q`1KYN z?*<#5Yv(q0vmpt4PR-)H`?%A$G3jFZTPz_ zB;M^de2opi&xT)Y!*|&5Kegcv8=iX#*6*kd&;17L*J;CFW+C~m?$WE(HoVh@=bnf4 z%e3K3EhOIAHaz!ct)I(=f6zkWonynVwBd7Y_+>VHo(+G$4eznxOKf<}hOe;Ur`hma z!?J#}ZFug1TE7w-K5QZJUTDKN*zgrLytN0+=qeljP8)rV4R7r=FnYZWztBeCV8fT$ z@Q>Q?vPEU&W*gpTqkqzdx6h=Wwc&5G(QmWiImfVmjW#^@w5;E58~#=ciFdmVUu(nf zv*GJ(_zoNXE*oB{k)`YjoHb`;w9|%%c}@H>ZFo$D62EL49#f&j&t=1#CR@bi*zi3P z)YucZ;VF~#%d_FFIU3_UHarG~#80!~tu-Y^PP5@LP$Yh{ZTNl(EcWYdcx!Ez(F<*O zYwRJu!iKl6vsKyf)><6tYixM#ms`K}Hhh+a#Jj zc&v^ke$U$Q*4`N-x7qO4-VpJPHvEM|n7`dN{2&X7ce@RLkqy7khUeb4_3N|!#i#G!8UxR4S$6VpKZfmX~Vm0_#7KP$A%wb z!{^%YSK07+HvH8#yvK$gYQt+b{53ZGG#h@H4L{q4A8x~!*zmbF{6ZUkgbiO|!(VH| zSK09Ne63%N4R4*dp^*zhxL^y_W-SvGuw z4L{q4f7FJbW5a9V&zuG~BaFlR^Yt)?qJ?)lTjHa7&%8p356-|}^%4(4goTF`?TF(y zIF&G6f@r&dznuY?u0XU=z{d#F1&BT?;KPJD^hY-f_#?u|Q;9YRct7DDglh!6moSI; zXoY}ZAbKAI`u#|U$1 zk17Iwm@tR*=+Wd|Qa3x_5+0kbOd^ceZ)zQrY zzLPMA=xBq0ZzIg1Ia(v&TL^PVj#dcxCc+$wqa^~KK$t^tbee!~Ak3jR>Jjj@ggN9! za|L`AVGgxXmw+!L%po?KDd2&GIkZL<0S_R|AvJpRG|S(cu#0eqfKv%`2#vN2_}l4# zFC*M2;A4b2lt!Nw@L|FnLZh1n{1M^7gc}6BpD>5aXpMmP66R1Dtq|}lggHb;O9b3Z zm_uW9nt)#<%po!A5%8Z0b101F3ixTl90H>*0so3HhrVd0fFC2wAup;3_+i2v>Y_)# z6YWo!LtL~&!1oj8&=zeM@O^|iq(vJATuGQiS@c-}-%Xf9Sah?1?W ziq;7D7Q!5=q7?$Zi7McFVx?-L(@Of!XF=*$a8fcTXNcxDWS14LtV=y(|E=+QR{Z}*Y-eFMwnVSAdFf-;xnntIlr=N>V<9m@f z0|70PsnzWbecYNp1+*zIw*&&i)Jtk15)+2U-8C8AjSSA+Milev^YV^doYaqAv}Z^B zNe^YVDUYbWLcwAPDZlSk#)T)sOpg zjzf8YW5svJf2%&ytUlbB*Bm-Wi>y(M2!;%qcQ52E(yeB?w$vj1d*c?wrnE%gLsBbG zb$dk$SS|od;~i8ui+zP)yG{tfW;V+D(0$QLaB)5bzd%Zl`hb6BlDcTc6LG*(#p z)=d%L=St1$%oHWKUDMyu^k#L7BX_;e-9xJno`;NAyL%Y#JCHKI6B)l2^I9TP+$$hK zxHEO_RcOH*rmzK_FVX~VXO%+eEfo4s=$^8~=R?etmUxRV|G2v0VOVYI$=ut$^Srlv z@9-A4B$`Y=h2|>M-`URouIWdN4^dZz`c9U;N2{U~#&>GrF=&Bj86Q~%Rrbp*Vc+Y5Z5AOUIe6kr|Dnn?Z^J8oqVIH-Z7%EzAAM}-N(UxMfxGc9Q$LD-lh%N zW4znRTy|-Z>omR1=mmbH8d;=&S_B#1hI3HY7`j-~4{PI<=Lv;0dZMHv z6e}pwPcY5@B28?x7H-KD^44+am+2q5LZo-t)3ZOxn)>`?JZ@D?OR_GbG$#x7liuwt zn)h$~`=Y4ux)W;cV+hsUh^nElqi*Rr)}?N09@|&l)Yz;2$&^s$GyW6A2Rk(VG~&ZX?$}-{`)ToA>K4BupcTio{L`VFBK=#`!_`-ca*RdaOw>ah zttHDb80Ap6+^)33aK1=qN62ivj*8Zs*5A&ytvN*rYfjljJVg;t{Tm|s^FL94*{E)5 z^wk{=_VVQ)RO^3=O#HPcf|;^K2LLSDLfb`L70t0c;3n07gKqdlY({kVCWsgbAG&Q$;w|SG*cx=|T~8VH&NL zrOKaSrwaA&(6HaZ%u;)WDhZ{npA)ZNm9CY>jggS6P;ZU@U0wfMloXwDg1UXA3w>># z8-49BsBdIy3d0HwbET64!U3}#tkF&1Clz_p_QI4N;za} zplcB0)q85CA8Pu3q5mh1A;9_c!$S_on~PG8qv^lC98Iqukh;H^f|Y)KQ+@D?6d;ZN z16-sZjW)2+>87Bs8Mg}QcTqx3-{l+f$r%~!M(l)E$92QvyC`a_BX@8jwBV-t)wwA} z=;oCat*s{&9{gk1nbOS#x~RLlo6zPP5g#^qfzp*I$?R~15So5#$f0hTl!8v~*6Ppo zuz2;O3dL*OWW0>l<4|m5tQbXKQL)iGmL<~k)AUg@(G8wWiBbtg?21IJGoHTT${|W@ zsld-j;Cr>ER|B6Cn<*leCL;QP-5rQ|HYIk0h?<{>%4kc^V;bZVgE{&h?b&*nLy-+} z8D(UY@gzcGBo+g-eoRvCg~A&TbL`=~X}YGL+QE)#JVt8$AK>*+g4a98z)QrgW^Dbq zKd=@&G8|=iqzsRuI_1dlB8CScEK^QEXl{!TAv|vN6>tKA94`7ylEVc(dTY2Cij0l> zp#@TY1G#JZxI&~6MU!RG=edt+dbzt3EVD68sM|-42Zga2b0;4ssGtwPSL6G2__$hRo*OPqxf^DBXEt~sk0N~m@>uuTqY%)m!{#2> z^h4WgSXFz__^2u$GZ(W8`!TK}l~qM_D{^wuKCt9@jb*EV#l`;4PK25hhXwdoeT z#1RAvdF|y?%^RRYLl83D&>>h~DyUu{71V_auoU!j7xYYF-xU@la0EOeVT{XE>7 zr9Lz2x9B5HpE|S%xah}>-+jUCeC|9gT;)=#hiVbcB{|=Wh5+YxCQxLP^Dh#dU+4j! zdLfEo9J-K0(ylhKBqB0v3^%5&_d9m5l*VomjsERNJ2Ib0l}l?n^J5 znPZwUPR7mFBL2)kn>nM%_`< zM;bY7Exid%GExaniOg`1l;Vt;=2~+Z^2rH=$4*m1=LhtRX+bjE1_GtIqe=hfshfEi#40@+zV9fKMOl^~QJk@|O&%{=H8R4Qlge zCpSu}vGW3lQV4&)t=2t_N{%1Hv(2!SOXjUN3q@2nZiE}J)z`YkbVK*Kvo-YX5)GkD z{(%Mbxm~j3wMr_K@!b;>(Bd~2MHaZTU!WIOq<`c?-}xEp34JH8<|V;T2@ZpovEgEe z@Q`MFF4{UYknYkWp8+VHlC4E%&en9tE7BX4^&lG)ZoN-G7Cx2&AGoeP*f%`xR&+ji zrEOT*6m|Nd6FD>6yJMo~=jlyw;*jGl7l|$v9&hVX6RAOMK6eglB|NUTN*g1YhHSOZK4ILQL4WV?<(;Ovu0j12*>NmM_(E@UM zFdT_u=V|pX3EX!tVEQTT^l|O~w3Cm!^FYbB#&=|s+r#%5$zcr~qIT`NT9H)KB~lyF zuIaUs4)h`&=*cHRFPMT}yd^#9*nF8nEVjt;zA4IISvjWk?lWp-UE6L%p_x&=F)!S# zPovOhEFmm#JCQoR$<4~Edp~%MY=U175>24oXlsHND1fBh4B9BVj+NJFsR|*F)^rdi z6Ro60JkUf(jn>qGRfh)A&%&K?O`Y1THFahNbjOI;0Q7Py5K?tG0&NaqXjZ#jMk%iJ zQExq(KEtgsG>st`q$!zN=}e?4bZSi>VW4!t4*3wF`+8#~N ziMW8C8h*(=4|K}C8Is6DT~bJ5WISm;JfZyrAAR+h@;!8Q{D*Z(;PN? zbt%LIhurYk2bHQmTB+kfZ^ZF{j+beC4ixEeP^#bgm zeN8Lql5yWaP7!A$k=%SkYuu^t@_~0c?2YaYnCZvQr#%tl`R82p>*Y2(aN133535JUVLu&3z zRf3m?52{TEk%dUs)X}3?6T+#IMOqSzPO>1MkYBJEFIeQ)+?OWyw}QjN2YWUh9FSm^ zkzi&qPLqt$fzOcbJ2EEs&}_l@7QwiPjDr(v?sI^>4+Hm@@WHgEgV_oG18n?dUgU4( z<&b%$C*}1$^J0df#UigVkyo+EYYy`YPOrHy9XTq&o5BZEnhsu^$S>QLpUhk4C-Y{0 zR^I6{jArOzW#7}@jF{59!X2qC@||K|a#{CTHuSSlKT)W^yNx~u6j80^ikcQFc6nby z0L#qptF^yl0Q%E&F+K&-sMdx7!~L03cOtl|6;)EFjTr815W3YaA)+19u=o3$Jl1!CqK%cN)**f{j<*@?rg|6yt9QYkDiaa4wP^ zGD=ZCpKhpI+A*RyTQSxWn;0=#; z-x%sc7LAa3z5ix7(b*a%9X^qor`wP6Ycy1+It!uSkvE3Xzv%;0btMg>><&@zI-DD z|K@=40bmrdqpahxSia zW6j6-L6x*k%EO=K>8C`;dM6>;bTCK5-Z&YKd$=*xi0W9T!>KZy%5bI#Un;^b85T4i z85X(T4IX-nPum^N=@Vm92&49e#W79^_uJhFZYthLg&;qyHr ztNO4XdoTSNwGmO+s$x_ObH%sFM*x!&EH1!8GD*Lw7fp`X|B+k{kxLe2W$gQ1v9Ufj zMhP|}zy_+9;Y}O)KTPn%25Qniy3U1ZC|`XAEYwNkHePK+{q{lJi|gu&*Yp-$5oWimE4n|7#}nD3Ckoc0CnAqreQ1N^{%H-w zQdFJS$9K4pi_y`G%v!)KlY(xBYymy3Fmk&9e@($!_Q{R*0MmoK{-3{*MsATeCJ7M%NohTenWkg*MK_>|z&Y?uA&e!RDiu zRw){z^S_`SoO(p2ISV6>^Tk}eFycF3%*u0MVqASNSHk1QGc;5PVozaYbx)^p^^KeY z!MwB?pWYy6Lz$cdWsA%rw>S%R@B;^|3krS*j0s~&cfc5gdKG0+H{5~{OS>k*uG&Uf zuoO|1$ude~>44@8Rp5C?oUGJ>?0}zsMjMJrB1BZ05uy%c>{EzkPjLjV7sZ2uM@lf= z8#EW)jQRCNet`+P<8nqbj>ygj1=4qUYHVEh$%3Td0Faz?ZdU}7cc1td7JEm07t5A! zs1MCT`Mr@T(#y|Fayou+c-AmHXBFySY5Lm<3pqk(mpft%M^18h&Qj}s%~2T0ZHV;3 z1Wqd~U5!N;8u71t(rEeITx7^Zl_{7wj`3%y;blmJrpxr^qy5y4B_@jySg2d})fdFW zohd6W(>ZmR#4#+AUNy`%br^%r8@<|0^eg5|Z|;ckhzPcM#Yh)El^Vi6%@Jdrz_tb; zL_aKk0o|AAyMYcsIBX3aF;1(~J1($|#My8{h~p$=>7=r(SR>uBv(XmvX@K_Y|g4iQwh7Pvk z;sc<=3Joaci4-&3<+K2~7z5!lyEzWSfG~b6;^C9meXiCXgj!(!sp?N5YY)7*KtoU^ z&3&ZV$|OFZ9a#JWGL4KQMef}7UTk0x!QYEP>hDxnIAT>8sgddqFb_f2+=;8$E6jmvQm4;tkqS>vCY0pjUTfWvb6WF0Hg#Thw@0AP~@+3|CWU-==Rb8Pe`cF|dQHFV4i| zn?>GmE+qXoOb(XRax}~)^|5Z45HzV$gLj7c7UKrby48=GhnA;5ki|FWn6@)XUi~Ya zN#YX0re@6i#gUp9+3-)MsC9EuJ#rzgG=(D)N;KCc)(!?EMszUx4L9B|`XiSE?!}+# zYr~y=)Y|`rAP7|V3wQPo{)Fe3qi+jT-{4AE0<4dywQGQg?hx2Q*qbTg&O*}P7@R5S zeVO`{`BO|$T@jht%`DF^vWF0Z4#?#D$O;hw?V$)G?w>n{qsB*MIus6m$y{8#1 zPBIXSDPwiEn66i68|h%AwH0JTWK82%$!Yv5r}6ps0#8MN2nUQ00ncp_#|5!&8m^wL z1Pf)yBD1waIoXN$XKUfH`;_3hT4d}#<7u)WuFbKJY@m_8{Icxox3Eqy+t?s7@Xuxp zC70r{2M3p8Pq;)2V=oUU0`rVJ1)qWvjlB%gL=X&Dp#;dLD%&VXM0;c@WIT3G7@uQY z-W8uC)2}Kq`ia~NN{E{IH*h}4RD-c?rh(*;f)@kfL-BmTH66+MDeo77% ztm6K{6a}$>KdGdq3MqSw#k1(m&~&*@-c@(%M(Qkm{YZg_Cs4RM5MJE_sbEJ?)`$`w zyG;q^i$(S67$+R}VWM!8AQu}QSy33g-p1l{;J8zSHXpF~5r7AT(~_dj1sA2wfn5~1v+!=&oTb_7 zLtetd#)em6v(nG(3roM!B9n8q(yTuT`5Tmbd$l?K#H6tctw@R~2_lXL-SH>C{;6a- zsQRxyeL4193rbo&&J>@%IGZ{+lg)zn3XT|X}SX{=Q|H%zW&M0I{n{k)=k{S`uCgFY|{Z~D3;5o zFU+vD?b5>1SGCA=ZtTR@Vk1m6;Dc5RXF)kk#mQ}RtQU=aok+1f*QDJDTG7}DEJv*s zP({{jkse5jx>x+zH%+mW;Nk9+U@7*ter%2DM-@SgHb1ToM<9`LfJcg-bD=n>lhx-sjpORs8z_ds zzn~=U$*|Q+c6EcTMQ$)VQ+Vv3;%hGGczcCjRv|j8^*eb>8 zT<+dRuzL&Gg^q^ZTZD2neI(jWkPyX&1LP`{z0sY6*))1%c-3qLo_VBT_DzwjMlF)j ziC*0)U_GM|(dhUKpylZJ6S3|x7Kc7piwPtQG;+c6AQpY6${l1OgTtK=0huC3A1lN_ z0|_x`LZ%_c;kG1!qYX*C@fOzG298>0{i+ZBp0=`dm28wzC)40??d+=awdbNiv{GN4 z;@7iktwxDi1hC@R!hOZ;>0Mj6wPFjGEjXz90B7uNC(c;y1< z1v<{Fu%~kyx^`WyeWc)AIZ9rM`S`^bb3X2Tk=LWFqgGSXur>Sh*Pxifl3cSR50SCzCjhm`?NE3u`cwD%h^REF$CzbcKb5C9IUo<0S>*`N0zO4Q2#%)e@+sgG zeEYQ+*GrHKe1fh`V*R)&@rhs_4vq(hsaw*<_y^%!gt`R|iXYanL8;1&jBJ48#UdXu z{sS(c7H_E;qlEU_#j%*;^!`Y<{&s@zc(y7JFOA^V^3Ohs$MXvYt-Vm3@hOn}`+>i@ z^=($@C~}txLVN7&MQP1RP(2htOt6HBqMo9n-hlZvEp5Che{y!Ufi^CQ6lCiYc zCp>n&66&FkT#vesH^(~YFyh3W4hN*T1kQf2M|f4P63P-%$EM2HBz&j-x2&9GJ9QUpyiL@q_|f< z;f1GTR>*3oVIkIDN+Q!;^;x%I=t*hJZ(dz2jWsr}R^=FX?WP&TbeB>F(*=#rF{)E2 z*wbH8_X={v@DX0+LN~z%2&xtm&Dfoa8T@WN$`)!z<;QpBFLqTQz(E!tuR0tujsl4j z27yR{YfOPVbW#1Y{9ui~+^vZO+}Hly84i+>e7fMYew^)N*3zvQUhCekO6L|=PucOH zoKv7XuvRHzcuR|Wc~(TCEOo+y+{Zx}D0EC;eo58}9yTkH&3xvN0#lJ~U*HnU1>a)} zGO{)sJ9iHrqp4~Wv&Uu)lX70mNX#Mmab&D}k3idC&3gnU=-gsGY232%OuxEoZ|z30 zbb`Y@dXsRz!mIJc`XH>^&VXMZIti`@WcFy0V2YD&xMGy|Nm0BhyX5{`vtZ=Q|L2-Z zC)E!{L$zRKapWXl$`|TZwCPFXy%pTB1;Ofnq5?wKz?4nDK$@~kz|Asck6=_ZUV(Cn zwGbxUjD%fMUTH~*eH6HrnGmrrWXcrl_xtfFY$?ur_Of#WWzv^viaEXGvWnHv$=4<@ zf?x~qYq=Y$ZXIo0hTO$ebXyJ7#i#l^eR^kjx5K+`O?C?E*r!gB7;MJ+T`36y?8Ew9 zsR@wugXHe#luk^cM;1obc(_o3a=pMw1qzpk!a-4ddCrI@H{94$Z)%FB zO|18&q{N%^Z_Tc5=jK(t&y(uYzYV|Q9LLX;K%Q^C;XN5b%1j7xX_pW#f?Xnd2s$Vt zcA-zw7QR=fweljJ3;FQ4F$B+@OCba&+$HT?oWGu!H4iq4_d&O#k? zpGV!AOXe|@hT**hn2A7H1|{TVoIg zXQ_@D7a^TUfkTq&)?k__k`u_-bwrCqJU%J*)6^|8(SO`yOSHvIv{oQzA_=VNEj)1v zFFZH_2TP6^TM>t9<%XfUbwVZvYxSW38rAY!vTa6-^R|v|&fjqEu78EG9811CTqu@N z`k5FexsS+UlJA93Y7wY#h=6%y9A0yqTo@{flxCVPvBNk32HX{cKaHC$;-Fj7*_kd! z;xw+d$jPE?GR}H7VQ@-X;2Z&Esi_vtIEh0OE?!|nuEJW|6pL#(%)83j&GofK@pY$Z zNVlQ?;XtL~QMY`}M< zh&EC}&NHA)K(vrD&Sj8HM4Cy>3ko%tJNW;#2V=S~&Q4yUoZY0%AqYJ}O6 zobsYJ3%Ed~@fu-Ybt}#p9Wnj_Cb2&176D8LK+h<<`p@RTWwn38?<9h5`VOxfa zznhx5!fW#bg4yEGB-TxF(}Guq|9B`KH@V4S&|1;c{} zPcv(6eh>4)$tXCIFvn|hjmIQD*Tkc`h|e+Zm-rkLk68fmdB)umpC|CB#~@G1;yu-T zFB2zEj~FfH+ll65{Iy8OO8qxZf1zWEqd~9v^__lP=CmL38wu^w!r!M{&=~IMOkWQv zc+?X)vUi0em&I>tnV1r#<*t*rtdfqmx0l5G+ola00B=fC=T!y z-!1p<8o2)}u9>Z?qI#IX-{Hv7lbq&V_Z@Pq3EtqXuXQUm*j^Ds)5SP%gH4Fv9YGaG z(hZe^lzH3b|8{U;2&NK8u8?D5KsjJM1rQs`!Jl~1$;dR{TVHnuPagLVOP-tTJZA}> zLd*qc@|+3KDkZ#(1I8XGtn3Mit8zbhT&w+uj^$}QoXl-5?9F8q>aR}0ii&Vgh0%fO zfdP`&m2pUNcTq1R*b_R8iIus|%x!sTvABiZn>)F$YxU__n7_zd_t?R)P9ozFvePR@ z^q60g9m5>t1?-{mR(KK_khoD(_?v1K#gNE>sKyPT& z37e;^?ih=$u+`WKTNHnD%AJ{7(-BwGk)FoiK<~w|LradjDu}>~>b=x0Ruz_O^Dl90DWU%dUl*ej2 zKl>f_j&TENTq$Nl|MHmxr@ZA7!|s5jnm{ViUT3ta$Ta4{z5scRx)M}quIDps&9(9+ zY!~~pI1a+E!m(Mns*9Mt)q;4zW=+@D1zzei_5Lly!fTtaonNVFu*m1&Dk$d>%V)$~PA%m7He7S!Bu2%oOzNNCDd zw+yYyLm3!!{7&Ecp_yGiRH7sPSgT_8SybOQ1=A?wF3fy6ddSg{4ZhMo84jqJ$c6eBJrE#a!t6fwzFxAYh@ zY0#QJSXw#{YgM_CtcJS1RYN$1ip-K#wH5onJDR!kt0+xIW}vAvEztC>8W__4XiAe7 zZw0f^bFk0B^YqHg*)+G0*uhTO^X!FF==~a-o%Rn)Gew1!jbkkFuRVX zgG>IDLFz_Yd9f~qUeB_s>kkt{N49joSnm|~XdLH|5vPskU^a%;Q;Y-L1qT&(!KKb{ z7rdvr3x1U3CJ`1>&Q4@;$~qg70Zv&aC!8njo)d`%vCcACH!foq#xc4G*sV`PBfQmp zIvfc}RBYYv;C>NuvBTy-(Q?o9j5sC;Cx;4D%gt+1t3uU{@3B;)x70OOA%6}VIIp*X zALF=psJtHfjv+e#R;R7=-^VlujO(5^ou}A!fCd8+W|^lyoZBZ(g|j^nr*V0{;&^c6Jp{Im)N zhPj;k;@l-%>KcnTQDQ zc1=OO`3-gJhc9B;P2mpwA>;CeI78T$61)II3moo4hO>-*XVBe)z^Mfocuww896=mE z6>E5J!F?qL=ZQ#FLaMhxh4VzNpa(YedSaFW1BNScdg+j{#RPC9^N{hB2?+L&n*dgM z4jB&t&?3*fYakop>b1zJ?(=)O4kRwe8B2iSYy}-m92r}{BV*-m4-b!Ntj1|jn%QTr zt+CFr^22J!Ld4(wJdD4`D0vQzjCw{(>@rVzDAK=>=MzSF7r&Ebo>6G$wijq&D0sgN zArC{EoPl~AKsaL>29~)!s9Vk#^HG4ry4R;Lk$e9lj;Hy6=kYX;`7Yu={|Z<$-%eBj zEDKH-vG~Q9hYI~B@I06IAQCT(59dAWVWx1E-|{09LH96Hb>7LbD(D_gAO@gj4G^{1 z)>d!@wCN*w7wo*2F>LBg7q$Wgz(f^ezgPtF>)-JF6Ban3qdfnEX8VE+pZQ9ZB7@RP z&&6dJuV4tm$*dx`OWl%!YcD_Nhh%=<2*0?lIe1P@es2KbQ)|^<^1M0@FYXo{T-~DZ zdo#^r6E?H2*$OqjG-$OTs>$mc>WA+Vb(v9@l~Gb+XDg;7IBDqeE`B`=XV;3{!|~V0 zO2Uj$2w#lv3JL#4R7qW5j+{`KOk)MMD*w zE4B%-fMBi?i8E7AbN5=DfC+I`>SUVKu>s&>>DU5HcZ{XbXt^r&)-%-CHe+-@ro^5a zlvNBFPpr7LUC71U6WG{*8Lfii z%m7ZQ$wxap$&DfOkqUNGEW`MCYLulysDvS0ITiO*Q7sszs*EeKB(1mV&4rPPxxR?I z0R_Ny4!KIl`o~o4-fIiF7g_gmsHaxnw>QQS{TRH-G&!IIQrRHp3~b1saU%FU$RPK$ zkss{BYrno#%H>s znN;R6DWTi{ZSD)t%6&H_&xHsY3=6(X!5ng;JhLAjld9J7Aeu;<@voBoOBqT8W#+$9 z-qy}sa*)e3$Ju1I)y3=|meyrT3pZ1qT7}4H0C_;Ku1>fnH~?xaz~;NGX`8B`d%%0& zWy+X-6^uUG#C*@*eM}wNgvOged8_C{)>YFdUbmCVY_~Ah*XS_HaJxd78SEq9FGiq4 z-|-_Ba=wOJ?yU}YFV1c84>RF!=59pcoyB(;WE$8#l3_`nG;jPP|u?J!4p48Q?}=r^a~|DcbI5Sj?Uw-ELImj!REppX$ zhZW+Gkp8^8ol?*mqnhSoEDYc~4X*;1qA>J2LaF$wQx8^zR{xT_9f723tQANn$qkZu z5a?ilgLAF>V+PSVxA($ZP6vL%y(1p=uXP_q?Dh`CuoU;sH36>ql@s7vCV^rCYzG3F zGCBMyCYt#PHekYQagt);b{@+l#TS@wAOpF4)Ml(eYJ^w7V?1Ik0`OOGQoP}{SdqLA z+mf(dJa*WQlaX3vWIL$}zyWvI>qq6{2muk-0ugWV=HHQB{hC-cSyE6*9^v@Q@k&%tAbD*|5_P>DEG&BgWM40aR#Y(pr}T0CxZCZ1n`}l zV`~3eH@TT>{n+C)%HH8{C_jSX1tQ*t&z50(In9`C#yrUcXT*#!V>Tznq#EZVM!IgI zM%0bN(I$nZ2ZR}y7qc+ZvdV(88D?H`~FD6_gz_l3z zfvowiCQ!HT#1PCoobD00yy?$hi^Gd=z_hJS{@Vtak_00qLU;3LA*AXioZNB0RJaad@B*kAeY-Eo_5d_p2a9~Yz&*3Ey zZ0C{`d!N{7(s!v_pBF+>1^;&z8nXU*Ar46@u$W=`p}5hpSn9t(7)KUhxZGuKA7mlj zcGcwD699_D^I+_?FcNQxI|Vg5^p5X#w%DAApG3ct}0Bl;v%qzY3EKPuLEsA&&*b> z5aylZ5l3ia)*&QD5eaDZn}j{yo&{o~|53Dji>2aSx@~Y$bHunE8KC)TwfIAjmdG5q zXsP%EmgYzSL+TrenO1>PakkA&31_0QE!fI=Par|w z_k9sL4`w7&m>}YXNm#g8YTjp3)e=c(gU=o5PgrCnU}ABVQMwg1Tkx3%KUuAPm)XM9 zVbug;U^Xd?&q64tA<<5Oo+i*GK<|@iOm@zo?v!ZEY=G{fZsbQDln@rbWi9LP$!+hq zp%<|tMy7-Y>hBGC1K(LaW)ZO|MnZvNSCb$$tW_rc>(Y1OS86!?fN7SLM7D2@9AUUd6g;z$Q=zWv z*0jLo1rA(J#1ieBs3~>p7-Pz81>Z=#t&xp1`aL$v9NPLKQFXWth|0x9PEuYjC}G9N zs#{k%j4T1dw2!rtpWJtr9jVvI1& z*0>IssVh-<#*D?D8D=bJ9jTt13SycQ691OKKodx{QU=`>|6*HTWD=U!ar==3VUd2% zLNh&MngNKbbU}Bvu)l^MCJHuf6VkenlQ(i}wr>bNmG!v%-dp{syTx4Mz&7$T-uZ7V zpeEV)LUa}p%k{==IoAI5J+QKTgi0uPC@)b3@ z2J|8^V=Am{&m8!$-u_XN+ z0ZY;}nSias1t_d)%SNmz7DIsa@nI{{FGk)_T>9Q5#LI;j+Buti@mnNqyn+uRnp2dk zZ5a1Nt#E%aQ7g9r5E}k3wK4?%aJ;Qn%pym? zNvc52^EG|xpPw;-{s0nhci|6n{l4sM4NVV%({oLCxTVb0945ADj_?H!e-DOMGyK6~ z__&+|i54F|85FE6W_cL_s}a^pa(ksnt3hhn$}hbGdO#xaRM00X#%tvzD+X%fdh?75 zk@~iZ47h%UP5tKAuwZ@VRu-#edxpvM8#tt*BR}u1AsJL_-!J$U7e!w~Fp+=eO~fBC ziiosI^n#UMelyef?_Y3<|0OX$F&a!@GdLSz0100ABN;x(`3Bfv+wXC)7(~<9E@U`h ze6vF4_3XWPuiMF`C)#I^wY~K6yJwx_HupEw)Fa9B|2x<7%idW#K;nN)cA-i5g@la>)2dDAqBF=DqEKk)D zjpHac=#%j|qk=4B6{OJ9(35@WDoY6zWb%IWNn^eMaJB_eabvoGu*QvZcyN<&j*@#! z_|nP(euJzWUxg5h$r1Zks&EL9Uk#VvHS|U9%4(ZL`w!D}!q_m0J9VX5f|WRui6v0^ zv2i2$*1{>dqGs?@eEKe-&+HRf0Qv4LAWIw{%&9I9ce>Pi+Erd4zm6vrm`JUsLg3%# zP-}l}1~&YT0iy@LdlG0+A3*m~q7R6;{(x&&%b3 z?wlIDFm^?_a~9)QUli_~y|$0ItWKEcnN!`W5GJvTNtj9BC zl&J6{#;*Zu^@+108!)-z0$ml*qW-6^oToS9-wODK;*~n?*HYT!9i*s03yFjTW+GYa zI)>%|T~rURTr9R9F~*Q#{XFi>iIYQDiwwlx{c+6y@!ejgx`?keZ)_A$OHGY<&=AfviI<o^#m51G*=P$4tYqLV`i>Jh$gN0g3fqJ zYnJ$GkjMu8*KUVilY<%X^)Il+!sEQL!T4u%uY{S+LkORQ&L8hwh3-<>t}M@gyKO8?s5{|1vAH*!5}pPh;R z?gmW#cH%ACXJ8P0aA5U0VZ(vWsXnkCRUrCT?6Pp@gy22+Bl}x*&v56U;AOG9(QKmq z^4W9;jD04@cEQnz-9%)I35+8!!=(75iG=zbFvgq6>&^Gi%t$mHz7Z<{;Ts(=D#oLo zjkEN`qwI;6eZ)EF;UG2(h7Vc{q~ft)E0@GzItJm3saAP{eteQ5QsDHghyG7@;*bol zeoRP-&F>aFSz;GrE4qs~H8!$a;)|t;>Hl|OVk$qjnV3C;|EADfPYhma!hZnFL>D2E-iYh1MQNqZ z=p!cf8De(@!eb`#`VRK|%`CpbTYL{lU}F-(x8`VyU}Fv#=`#d@6L*yKPt6$^w)tiW zY$i^)gXVde%p;-SO2`$wxQ4d|d&Ud0TMKf9Z0p9^WD`C2fN>9S7~aonq-^{B@@|~` z{+IC~(s_5ND4+LI+>iSh=U4TyZXT?5`1Cb6jQnx%a$*X_Zc?go`mgeaL#8(})@>Xy zA?)OT9&|B*MfWyhcwU1C>0g#%r#!am&p*AUoR`(^WHIm|y&zA+oHVY3_ss0h$A=4e zzSFsW5H2|5U>Cv;ToESC@H3MrNWz?P?-=(b{Y=3#5M}}#?nGXzH$i>uci3nM+NntU zy8U{oJPjd^u)kZV;|P1JUw_ruG8Q_-uTX_<#dpI}*XB@cd?4t6u^N6eeV*Fd6w{j~ zHUMn25|{+t=0cN>pS#|U`W8+3Ah6M!fC-<@*VXNe5I!X~-k{I)5v*)(SdQ;r%>O6??O=*G9a?4$`DU<-EVGS1*NUMnnn5y z0NiDKMK|05cg!VC#XH2}Ql1zgaZSeX*M1(F6h57b+rH2x9E>|)IXVVo$eFggQxAOcntEg{_I1wZ;-IG6@HX!=Ne z3;sx{e1MM};0t@8(3`{tdI0ySFT+a3LBIZ` z-;^lJEuE||4mEST{DbO`YIuL8Cq6RY>ZeINV%%!a1pfdBP`~;2xQ@nj!Q`6M(a$h> z8YX*a%RxM@h0lELf$PZ~K3uI5l1$2Oos^414cJovl0J~b4L4t{tw`hekfT0y66kPe zf3@~?_SVk+)fM5+bolSkLV)Sja0Jrm&yN>yn)=XG5x_*CxhFcyrrspOH>cXuWx(|J z&k1+-RBM9{)1Qcz3%b5I{f1QV3Dw%Q;1iuG&@S*V7kHO7U%<@ce6{vlA=CMR2Dm7l z=c%=mK_vW>=pd1BAXeB@(Tokz3;|!J)}9vPU8ZgrBLo@@3J4MIyi%=oBg*6-{h$|- zlhoR8L>7~(E5n`nYHdtF`3;=;3`0^ZLLeaXze=sW0h!7C9~bHK)LMQQ68Ucs@Qu|M zhC9dc`&#u2Mba^9?Meh1qU9ofB8nj8ohRU_YAyfOMa*Sb&xPs+zd+yApl-|&_#(9y zC-abgsEC-Y)@~IN&c@TOs{6aTax4rStd zbeJh0GThgj*VN7u??8M2C*m=f9Ws7C8YSMc4V4o@j9f zM={wQ0C23*5S_<|FLPf)Y!>MG{uN^RehhEk2al~j7~cguqi$RTrKi1(j_qFlC_lEw zq{T>zZ-fi}`7yOVqkDRijx=+7WfVWQ9{LKm!(*%8jP8dnAzJ!JMj;|e{2TNA-{$)y z-u8T+K&rFU+pA`hJMr$y$MnCb-rb~&&NvHxEbzixIH91c4Ku02t@xy))t1rhGiZ7z zXyA4vXug78beHc3XTk3T-it%wSq}B5+Ym;bi22!(k+OacnePL5>n)hu2E0w5_kdmb znrjA%QH-$~2WP_n93MV4J|sRCelhApZxLt9YsYwOK@mt?ceZLn{ zW*0(Rord}VmSwwiR~Ua7{v$@JINSDx%<0x!z-qr3FxYUTkxTSWs1MHeiZ7FogM=tZ zM#@^D^{-wh3vh*5fR_M6d>(D0>9XZ#)g8HZnyHSG8i(s)RQq_513n^*LyOib<00d; zW@R?G8#3V-CnUYR2)y`(_N$n~NN^TfT-zAD06m5{H+&neY0g0!XzPd7hxr|MwU*y5 zWxRqk(d$iMCV&L*8w$FWlZpO*Et`R%CWO$TrDg1<;L#nhm{v8O0C9r-`;;W<=b|XKt7>_JK;J}=Z zIuMed3}DQW8{t{VPX-X&gejw#;#}BG79{w3gdj)>o{iuwN#Hyy!E+$kZk1~mdxI?3 zY>Y?UWGb`)ml@RB58wl+Tk#2gahu{Iq{OUw#U{*B-W3V)H#($$y zIMb%rEpIpKBXOSoAc(f_wTP-fBnWKI_`1(>6nril+c$8?ai3td+l5wl;AAg;#^E)b zv@CXE+&Di)p8mlUU#)!(-HKz|Hr!L^V6>G&0Un7ncCp zdo$`DlSJw^Pm)>Rf;#xr|6}c6;G-_C|9^awY+%9QJ8ICVAW?&ci#ArML_o77fsF=5 z5dlR@i&86Et?UX`AfXAB?Gmy5sI{%FwjbNti@o|mr4|SX!F#+_@J77yjzLjT!E1ic z*O~WjHbDCMd>{XR9*^vMX3kvC%$zxM=FAz1S01wGO*qt7q<;zhH5DIu%|9n1Pjc1H zDQc3m!&_Cr#pmk6987C952CCM)>>cwr{i7-bb^~#m0|o_E8ikv=(%3QtRC%C)fH7w7x*CPd?M}cgk0^Nat+3 zZ5?!$*Ys0W6O>H*gT5_EnTB6M5tM$Bl^&cslu%-KHTP=3Z@MAf4Ui4EBlgpPFIUlk zAJqp9u=;?eNV1NKKB|Ei>f{aP4XIg8B@#x>DO%yAOWf@#z&S0F+|sfK3po8TDv6Bg zBX7l}^pr@^qD30LS8_Y$9dFrW_TSzbvP0saA)htRqUl=+$Q3@)qeo`4_^*bEZT_>2 zY1o`0k_nvmrpEWWXbQ7>+>|^3^A`&4L$JOx*i<9BhSpq}9z(zQo!CWmveByC=6_QW ztfOiw+80;W&e;>26aN>;J(B?xKFM2k-bpzvuSIg&Vz;HsIAnR47dbG4C<#ucq3cM$ zXq`IhC)ZQ92G|s4kY=}Qm@~C;nOgHN%`D7IH;m&3dbsQH>vr*?v>tTYKnoF{9+8+A zJhAjVQ(t!WIqI0=VOYO1#~-i6ONP>S7eC;q&!K!0Setx!ER`Z6x3diV8Z z_0M%oz@cf$-9d93PcMldU^vG)HIZ*JpIt%pu#0{~I(jDJ#JwWQMhV$FBPH0n)(yaQ zK_=Ys6RbR)iOM{)yUYQ5W!1+;ADE7Q1ksO;7x7yZKQLX5kcEL36_CV7lICG`0T8(I^(OM!rtn^)$n~Y2DnL65P<<=1;+NA#-3;Q&@%PNFT0o&t7nc}_&iGQWWFYDkWQuwP;KgTw-F|3wmfEFp0$pcH6`vu zFnJjVB6_=V=|jSi9jmXo;IyC2Gdta5&n}ujtd2K`xgq*4_Vio0!^;bAe_4--FMhwh z?l+?!+?lf}`PA6yMc2HTd~YaYsy_QZ4tCRPlX~+!C*=R|F3o33$D14S*ZjA<8}LN9 zp%}oVrd7zUGVm7C8DMkHdQ6s9b**2DY86vzr;NM3j?BC^b(K-5rgydUFr$C;(Y>I^-|L!0aA~>4SEAY1OFytYiIc9Siq~-3D`AwLIKE4bP@P{vzY}e)DVLV5k4b z*Bvv^X@qm9e>{~&`q(a*R1BiY7FQBwr*gSWy_cN8 zrtAbY?_K5uYsArVmlKcqfpJDm)lRKgucKXyegV-X{MGr4x9n^%5=+5u`Ir7m_}k`R zq%R@G{?x!#=-0}{S#Q>Ar6ZFqIx=b3Y-Q_hFG;#*>|!P`W{Y4KVQrVcYYzTmY0FbAhwM$Ef%lT*#>)TE(ixx5BG@kxGjypbe?MB~ZS&7E%)PywrkGLI z(}clQ>ss0imqN2bUHw?rvEWZ=OM9_`x=YjUB)`isZDsb0Sn4P>p(>Wji_Mt= zyT`5URM?r*kFS80fcCj|5R;(4O5FRo?BYx8_ z)ucSjphe%bjd)p8xT zn|hRnF`8Bg2*5^}GkTV)FZUl&tCj3 z=$J&E)%_O4ITl=HJ?rdR%UW)sU*W>lk2WQS;lI!h>-L8-9?@J|LQMb1Y~MlFx2 z)m-|H5*t5mp$LPw``2Q#;|X>#&$EM+)Ws^ZL&_>pkfs3lHfqJ-JMYTAr}Q?9taB+8EY?vPtaqiNg<8eyD&~~L zPmRr)PKmPojTK<*h*N5`Yjf=!qG5q_9G_akq{$e@CZtPgmD*I@T!Un5x7CSKoxjDV?q~8Te&q8kI@({vH&>QkBpwqCR zxvHo*^<5E|NqvfXZTxMndj12uhq{}}X2!<8QH4HYx zcmaGi1N{671EOEK&Hp37;2n_U^VnNUwp2EKoG44K*INzEc<{0MRnpT}UY zQRzMTMaD6bjoRdH$Oneq>XHSe%j-(L*qjLk6U2OS7Hz{xn}%gy7{*UD!OH8ng{8Vw z2@-2h2CAnNcIKf+QLEkjgobftT(18sv9P1mbhpJWDm6Z8PHk$4Be+FWs5aTR4#`n+ z24ra>=?cmUU510}unRjmiAeiZo&Bc}6G74n{g>IAb{>M)~_F&?}=fU%l77Z&;H#7Db&qM7|VuNFTGYWr3%$EHwS>Z(dnlq&WMJSrG+ z=*YJk)i4W7uxJArn-Rf$YbX?7JUO`&)4(BHhqQ+9n#_>e6spCQ7P ztFA8XJK>n{SNl`UgyrF{#!|!Ru=vRhi;F{XP^f`jJUMk~Q09;32@5KWcNA6hY~YS( zf7}XB{J^bl8DXEB`k~aqLdPUyBDrg`#`=i5)cNQqx75yAR|{cE#R_W>RNcJ3;uG(7 zGZ5(2e8POLsc5Nx$&j|JYst91@)*uMcLjvohG9U;$V`|Zo?f9q?mVls>WX#s|4#1N zwV^JRI~m@grWSZzD$?|DB0p7G*cp!UOE~&R(Snb|O8#r)dz|~P6DQ;830P5 z_4MRY*V}d{-R*VkYP!4qz{_11?A`6?05EN!!=>u`V3>8qVQz+K&`Z0VhQyM&{y1`A zLBdu!(^1+`aXZ|MrA&xVzcX0UgX~TYfnA4}r3V?RB6DhNzLy8OC)l^CmIigP8<KiN|zOQvf&WiT&#(Ho0U zPH35my7A=QXu?|711t|AiTpjtK#nQt5~P`RPYXm@<8>IExMow7UZ4%N;H9B7HyD`@ zY!lf@zRiOhkcjR6x1kPh3U!CAhWVf$2Sx8MA@T!kc(YTSB3e@ALLQ#^t z5&j)T3`2seWNfSKo55{|9} zq}RdW*J7-Zd0rE0C@3r^Dm$=aUDSFP)uvdIS`b|{F^t81+qOhpipiv^$V^HRWZooj z6EesDqvf%MrATzawvnCG4&|#z6B&#N%>8u5p>`@i z*`tiV(_i7T@0?2Bv}H1Pd21rUfY|9rGI@Kvu%dD}`0Dacf|oG6f72)}!6Lj>SzTz0 zC{KHEa@TRlzWr|d`u%D_n*2$d5#G;;CZAkeMqB-yAKR|Vc|QD+JPdb8NL}*Sx?~y5 zG!_jP@;@KOS`YC;+LBXCYLkPYdu*MOQ*dj6+7e3*D%D;CyxG+b>E1wa+=fGMdn6ao zQA4!N9PH-Q7!9}U`toez%W6lk-+i5(Uyr?-oeA5>oNR{-Zo}4ET^J!1dSVq9Me5&j zk+9Z}8mFGXbdk({{B<7c)Np#S=5d8SyUifU7OYFq_UR?q zYCEyz+QW8no6Z8uF$=Mad;At}r1Na@PUI|j!NJbAewSBBVh;lyl67Bm-%v(VWHnNW z%=yx$I}t{AFhn|TMb;K%V#z3Z)@E0b%O>L=>6LB3L+%&oKJdeUc~g`Siq;ic!uXdB zh;y(faN@e}<;MHza<~6J<=BnvVoOqvHG{4$tA3Ho!{0ea0fpz47I`POB~JL>2wJ;7 zb{n~JHo-k)PIT-BatZl!S=`ynS{CZqN|W}kMmoBgBtd={l)30q6)|#4P~u`MapY#Y ziBfov$>Bf^>~0P;m12>Px@KKKlMf;)lqow69%?Q`v=NM<1XAobUGjyBM;8yX`Uzgg zsGK8g(#D?cf*d}w=ylda>?!@9lt~do89ocD8S4esdj*VtxgcS(RVn8zIZe6v8M>pC zc~V-cyJIJNWlvQjc_R+vhTBr);a>rvPfgWTF?M^URJyb@9Y^^njpQkej+vrhl~x2Vd2JqAh2~#hOC*>j&tdt@-N^Q*7l#bnC3r zqMC|N^wRyQ9e>K@WU_fNCz!HWlT zI{EtU7kP1|{@8S6*Ws9gBVu|eyT~sa0YM$F{_BANZK*6f%aofX|7NiN1ii+W_$9=}#@j5j z=g=B>h+4?tpZOF3eTg~?14t)6Kfe#ZPhO+LS?Xk1`pmmgY})=YR2X2W5DXOu7@`-7 z4_H(>XyFmGq_~1AFVT&GLEx)63CGfBe||9ov8T>NYI-;| zsbKe(v(=AL8PwP>E3t8AY#KJky{2z!#=w{7B+ib)9Z>dDySLUcB_oW(OUSGFW-G>< z{vwOe7H|5~jGE!o!rpX<u@-A^^=6VdT2%=6EQFS%d)*n;BtR zNL??eE3L$j1`FpjVHu4KRdZ^;QYP%+juh_){tgYU2@Y1&Pu$S zky<`mJ>rtmY8}#U<`72@I}fLCSU^T80pF3qcTDgt*OyF~D>bt@@~bQ&lF5wunoJo3 zNt$89+LB>jAYW11fG0YPYl#d|nV}x#4+jxsQN7B@@%9X`P&?w>0 zt9!Uqv#4}rXyF*zR-H$683c@ui}Qc}Uv4?_pFLPi(8zT2+pDm_DoQCat1pi~R9$&p=<<^YF>km--Y z6i+p8cuOlQIE&i6;DN0i@5YbRP&6l`c(lW776UhV&PS6GF4_yVi+N=PtWDF?n4_-Y zWQ5l-Cp3OJ+xz9Z#!qHvE{F7M{N#JyjW>~4p}>fti$%IPlHd5{_m(Wg06Kbkw#wZE zi?G37oO?_D!{u*DZt1r^EF9Kj+=fOfZi z-dxm2FPMs)5}&Qa*jUb&waw#BPd?@M-NkU%+gCfh6(@m3_W#utS7Nm906b1w(o@W# z0p9kXE{tuag|a2kSdXEfWve;qaMm-$*8lvEj;*gCPFij3uv_3u4rVfS+^D$jk<&c? z*G=wfT}(RDQ*vq<5@=>c^yLBia~>cEQ#qGe<7t)<;XG4`7ns{5H!x>)8v{4v4rhh; zp?NLQ3YhfzjU59?FF`>&(;QYyO4Rp$U`$#am0t6Qp&^9jSia2vBhImf^~WpA*->Uo zaW&!qa9tOb9JhJ=4{uHjz8|V*M~Lx|233?lxitgzXB?CC{#=Ir48icpI0o6-YASnas7kA6i;p(@h5`@ z^L0d1sb;DuP8L^L)u;_Cs|q86S2SaDUgQm)T*T_b0bnEpS4j|MjMF=;9=oWt&THNX zB@%KG3g1Rek()uxW6e_jz*WeJNOyR#NET&7F(KhLa77>nPNNloW*Z2{WpZR8#k+AO z0UCXU%9Je!&sgwMv%TzFUBQdKiAz{h@~cSW8~FMh7DNG5*!(s|ZGnW0EPh(l0nqVP-cvTq?(9YAzGh(PuSH zO;WNksvheG*I%I1XtQOZYsqo3Igc8G?9C_;R2WJ0vtb`gj@q0aATOX4=sI!5CCK{J z@=AZJRRLDqe-f8^r`5i@{XVEv#8S7L4YXM5Po;MnlJ7EWCw2IB22z*0*R18~GT}P> ztcRQVqz##K0E3>1sq@8Qt>%?*&VOd&e4XB;{zdNT#Yu`~EFefuw)+RwyQ-mk0s%=3 z@l!BkYigA_$-Xv3=s;YkIeMf5X+^|ec?*f0-qLMQ`9hOU>`x%8hZ&P$D2KP|+9@jT zczNJ0MNF`E>)j}|_AJX}S=PoXy<0Fp}S}4|gTdfV;j= zR~&5@Z0qWIvF-jwhzmN_IeN{2=gPMG{U|c)D#51?o~!ru=G$uqnElRUk4JrXx##2Ibf zqao6m)@C%p=uIq@C6K5|vV72YLuyiy{$qKQB7CtSg4nyq1;UC2Mc3pf7ZmH3s+W{S z^Us*DkkOleqh%mCb)PP3KtX8@k>qEotBP6D##R;0w>!l#I)|H4J6u@e#IaR{39f;k z6uODW{HjiJns*u;7eefbgn5U=0 zE31C@F&|pPLp4P7XRB;y5$SmCG&LQy(W3rc>ymietQGrU0TiKCRWYe}$xv6wS+0~k6Hvx#3(4a=KU z)cpcrMNQ%SBe+TMdP8Gp18OFb`H7R(rSA$-|MVa=Qi)!S)xi_xMb=ivnm+Dp@ ze=8Hy)NF(7Psqx?57}Ftl9P%s36oOio=2fYIXw%7hkH*vTwnx)=ZTveLk;N%;0D`V z9d(njNPh~@Q)!A$F?u}Hw9E#0p(5^Dsl)HYPrg3 zsw!u-YMWQy^@I!*Bo5#KK?rDh1I9FH$g)$Y0TVGb2v!6o$^B|SC3pFcG5&a${LC&p zW`3rf?aKl8tMB_)1|3qBuQMG^d?vv;PdCklLk2Px>I|KS}+bKwe z8~;ozUn2?K4rhQ%I&3BqieOmKCpj`(1V8w?ZOHzPjSkQ)%q#z0cpXV~k?U1+kL)Mw z=5kHomi4R!>yB=lI}G;2Sc+Dnscg7fQ%<|2)SVTHdiHEd0nDOnNiHt3Q4?72gNGz$ z=J#_=p;;IF-rm-o|;oYbDGqe zquY{im$C6h^>n-cI}p6Trsy0CYS%dNdngbyV(jIa zXOjQ+#}b#@EYX~oq{(ZK#l8dv(reWICaBH4>)6fA{e4$nqOW5qPD{4TZRzOW`05ZI z(^>jjSDwwEoTs}seY`0g-#vHO`;9GE4Hf-wdG#4HnT>l z;u_^tJj<4uDjo>vMEsv?d8d$<#1Owd)6#j^($^8sgc>`q(xh(LF<@?V=^I^njh}tI zc!1l-m~^Fc*0L9`JA&r%*cg*8xpnteHUAkm3OY}tlb4+EPj&!EV^l*3-x)s_WsR&p zj=;1);o2V{P-r=WWxk+m!`$doJ1Fh3P%gKW+WYt0Sl#bUn?*bQrQouA1`C@UyJ8xI zuCv8{#$2R~2Wo43ptfbj$RR2vge#*geM{Y%tV1JvyoI-%)Z;VsWXgeB&e91LH%L>W zG-MP7tb~7on0j3FInYg}b(Bpen#O4oQVcbOJA>1h<=sMP zC6B1=^t(Ve_Zv0ndeHnVDxo6hx*`*O{mYoVowK;iqAHBn&)l1=CO^4t-`{|MrY5$8WwuQis@Zivg?6bP<1pJ9KbB2yj$dPW%|}qP)30#uJh@N6 z-RVg_=XOwj1D%kyHtsbHwUrlIKi0So$Gqw-{$G%hEw8e>-FKPOcCSA*XWphfH@Uh; zWd>E*6`iDto@f=l-3EcH=uOUT6>T#2$*S{pIH|L^MaQ>4hWIkO&e8KU_R*o)r?R=- zmEHZm>TQ+XVNO(Gw)?NjnaALbT*$l5dkYVQU7l_Rw~3<9AFzRd;;&uh>bQ~W_`fE( zs8!<|o)k5XX8Zqn5(PAOi2LkSFhiL5L;?I^=Zx5@RMYfE{9Il>{ZNvZue&VtkS`DG zz}PDAS|~)PnNBnBk=DU4#t*f3!mA?H%Ox+Gnzr(V*rDRx`oCK%y6-V-GWN>iLbt7L z|5n=$+N*7y7kjI|=I2UCY$O^r_9bW5&e`D@%TZ;j;TvF+`ECj;;Tno|9SR7aH6{*Iw!?(z>dT`2RAF@_NL;_)#;z z2fwSY8v@B~T&TNn!|D?HLm>?`DExO`5?t1rh;%*jl)tPsz9;!!#lO9}^&3_nor%?o zUCAy*&FLILl;d60#Gacv2a!X89W*-ohWpKFUs5Nwj|bL;&|_LB7En;Ab)p6>AJN@V zYajhutvl;9r@ZPNcA4M*4yaDwM;BHJwxou>%9MRw32K68LI6eSodE;0n<2v)%k!N9{wrR zy^uufl8?@7!`3U}`jKQ3uZ`cy^WG*^c`m_H}w)YH(zM?eRFV9@&ydYmExn@_O`B zv3?w44?hbX0A=PfDpW@449Fx%Si~7gN#mJjqqz(qEJ_wq@VJ^Kio@9M2T!H*y6odR zulfy<&C_LkjstA2nA)2l`oeaA19KQjRY*}f#K@|#KOL_U)5Ve)NWTyyVI55w5u=%J%=Rx~aC6iyvJC@&9GWq?LfOLLs0j~wk*-10+p zgt0W{_!{D5i>CVp=%tH^f}xMWOBY)gB#L^PqB@tFbS`mWoR%29J&mvoiN8~ujm3qK z^ILIslk?k~9XUUqL}?~`;dPMnL&on*&UXkEX>z^|PbyL9i1yQX8W$IY5=S&H4u|%x z-Mv8fuHBtVzPP~gjJZ}jEjxSID0kQH%N6_9?uCWaE-`N3+MQ(;3RaP*d4lz2l$908 zm2ag41kIGSqDNUj-cMQIQCa==Q`T!c)c9a6d(J#X4ilU4xOKlVc*$1G$bTd-F*i_* zmo>g)Zfi|JD2LyO{f6zA{wIW8EWgMo`GsTQm+h-7PbBG4x^dr$rq%cEw>9=RSs%-P z8-5;Q&={0AY2b~p$(7D#(OsCanVYPEt1v@Vw>U2>hk1YCyah1EaWs-G>>3w_{m+l% z(ID(%7uF~6p6$H-18=4C9+;iWNEeoy;horLL;6Io%0#cwW`_`qUR6S`V*fk&cGz`0 zg^v@b#*(i~8esU>L%@}je2M-L!EQ5FA<4MxT1^v(^>F<1tobN#A`%aL-fke-BK^GGAe;z1oLXkTB zak(QYQr%4xyc`${|ClkXlx#IkL|B{L!_tS$;AdQ6?>sh^-2Hj1wMD#!75BlPW4oV< zbv=x=j5@)=jamf3q30Dn+JP80Z_ zRz?9RP=PIZr`R>Gg4zmZVIsd4E}T-^dhQaf)TxN5&=AP%4S)4@3TbtBkXx&YX;`SW z%D4mB3D+@kYZZ$bx_TQnO*$zg`?jr!it=09v-UtJjJ)%UiMhhNl{v(=I?N_uc$w5v!aA(6XclxLYPoq6}oDm@S*n6lqPf+{GKluqsnCP8r8|LxIY5f>wn{3;GDI{b;fnS$SH+gXU& z5E+L}u#E>L=P}y9U@vtN`d(_mcE2CNbRJF_ zC=QN9Sg9}RX>LTyBt=QT@r&?+3Qea|U)I#sWwiKVa~sDTkJXCgrnSPdzmT7tjh*>+ zAR!SRukVcwB_8gfoA4i5D>nnXup@Q6w~W`5Lyh$^i2H^5ga45K!b{FB+7@adTV1A* z^Jw4+yMz*6p9tc*t+Ut#cmaXfkj%+auSt8_>u}v zEwkRT1lXuG-Kt5%tIcc_a2VCp9wxK-GQ#TJhjxPU7`Bad8ILI@4Z_n+D7&RYn!LV~Oml%6~PM!f28C}-NVrF-CpO}GMT@6VzS zU`-JqM*J&g=B1Z~o@+*WB{8l`<0hALJJ1-_o6GdVSZR0YR5nM?UmTx^Fd6crjn5h= z+V~QP<>{ao(qj!0f}Q%b4oqULjMhW-^H(&u`e)DB7(z`ykNQV>u1Vsz7wFI6#Og_$ z3W~d&U2Q1(v;`A+2VidFC(x{Qe4tqx9GuLbi0_bi8NYqv$M8EaK8W9Ayoc` zUb^g^CDT=t)KARJRX)Ha6ZhpNV4}oaOhGI^Po@@_IaMs87r|qR|G*TH7>yYvo#EQ# z#U;_T>A~FiGGz62Rd(4_>xnLJ*+?9Y>&RG0Flo)w9XC;7)5rSo0pie|tgKVX%9*#j zA1L76vTX+!a`kGh@T@tkE*4!D{%^F05>bb`dfY^Y>bNSm#u|LtdT&`ixtWLE!*{29 z%cOvx_FpsATlOY?X;aOQE)SOy=jy7ccXM?qigM?b#sx^A#g@Yqs4l&hvqR@vfQ_h} z^-);Luy!Rmp*Y97Xxnqqyjqm-O(~k^glefYz0M2iJ`@m7an_<*ju z87Z6k^lP11rjfEH#*bV1&)6mDBuji%iD=D%W2~~K$6c;m%k7iGhvR!3}vb-q0|{S$6Yc>=0_{(uWg&kOE}(5@6K-#_u@-Fka2p zROJ4^3*UkOg#USWtwQ{T4BH$~p#UHu ze+2mNyau&sNXK+kCtc_km%nnq{y9l?q6b`D=G~Xj9QS_(&`pB(=p53h(2KhZ<%P6# zK93VsCMYb**sLgFWXEBrOsi2Jy~uQrvwCysju~Jp5Mx?`7Fb$#E1)Y9!0S~W@2_*_`wyBlB zW~hsW5OM#hBJrfG3N_0D*c~uJ4`R3ZmwzHuC-PAT@4T2`y%-}_IK4arc)YVF3vhF= zZXf0-Hug%YSiHyN#7p#iK&LhzVm*|HMK%7f5w6;1!mOv&_o6)BvTq3s%@3BgQ^C(| zWqhEo)wRtib5rS^=4&eT`EobqJwBBRLN8_Z-#D3Z@kErs(q-W0Y6oUbgxJki^NvCk zLDv_{eKLaqHzSQD6}P@GJO$6NF48<@Ps8Gzh*!OSV)M9iNpZMjcA=?h;pMvU3%MSY zL_aLDoKrBqh07=Aw!B@u{QNuslm&x9m>T^z2a1J zsYuyaN77F_PRYkt5au5vcj|!EN0L>VRva(D)}iTLqDrxm8^`KM{^1EXYS|Llj_+OV z0~q5B+W5%2)Cr%&hjOW4aR~F^jHwz~g0;iszrCjsyYQSezw@FYM}5Tofx?GY+|b8fK`KC5Q|YlB|*bm{>SP?+b{k9kO|EWGGS3~ z-&<^gJ$hC{lbn3HmY7}sdu+9XMPuPNlIy|k?ItqZ?s{c6`GJ{zMV58V-{@kbJvkp` zW*z*0c@*8(T9daaLK5UZ(ZuH(qjAmskB7l z*bnEEQGEK$F*Em`NryAJFg_%+Dri3Q6-NwaYd|bduqA82t2kuYEfy;bhum7@unT{0 z3!Em%5GI4ald}OW1H3BXpA*QX^&5gs13iiX$mxvd6Yq(xJ{t9sJUnpF&plqwd&{@=5V|NZO5G3j# z@vr%lhJaab&3UCc7(V>CdP+_taTrnK_?yR{thfV%xcya3=h6EqtP7E?|1KGcA>AhP zopr;u$GTemQ|T?OFj$GH8}?eP3#tZrY4v}sxKy}qSo@|h=AC$BnzftrU8!Ta8T|~3 z!iVniW<2ecag%$-BpEpw`~n5-@-D`N30J#O9^!}Kv(Pu4@vx~A&p>y;!7CMbFdj1E zW;&FZAA-&#{NhImJA+Qb(9b6Sx1I)1o;d1=X0!CUR1I{T*I7Y!Z2%=~GmdhWuEal0 zcu{FA`5JDF1YmX~?4RC6n~WIPMd3ZYCGVO-my2fnZ_(I>?M+(B{0O5SE;nE$wTI+(eE8{|Mz#b+0b-BrP5*}7^=cWj1KU_vUEyti~6&W6+AWbVxe zA3C7IUe{j7-_TnDby)@cEM34~E#uqms$!;qMf(&`*73be0fSV47^UnM9O(*=2o?d> z-MGYeGx?ULOT9b0IR_FNOM!A)T*<|l0HM1j`v%ah4k{eHpxcgDJ4BRs zJS`s95V7nc>H^-g>zTMFlmAcB`CBiiOO@7!Dsx%S%3Pj~tevJh#C?Ox)a_N7%f!8`=Q8L+=T?ZocP25DS{KyV+azmi1H6KYt>H zVJ(BlpD838vB@CHdzmN;f)GEzmw1sur2*a#3Y(dwSaOgv(_b&f6u`TJ`2(E^D5&UR&aF3k+2BhOnwbBOr9}z+CJ=o*@ zAuCnhvY%(;;!e`pv@&{@9`-*}IShN*o64Gl^V5+Vva`4-h|JQG9eJXQtb6$Ee)tKn zuM0xN)KuLnttS``3|pynCH-JcOR41d;z#Kat9kTCh?`@n{97;2Vo7HnA=K>j&pAwW zY;rVv42BaLR1bHZI*VNf=j}|4Ng#jbLtygkLWbzWcpk$uc+?b4msv024=k+|cH;gD z|9lHE$ujfoGJX_!I?Le^4gJ+&?O=IIpHFp8$zwmXwZ}F89-kIe@t17{j|M(2Wl_8~>&;nEEs{&6m z^Y3*4oBuNzrLv(@C_v4KiP4j{ZQNYR#Y- zAJkyuizMgajCwOwuc0UN%qjx_ZMzSu)!)@-ho|s!Mfila3gcDf^3if zzJUOM3d6L`oYUR?PqfivDF{AIox zT?3-$D163%A6c4Nnj}i60n<)n?=raw0a*j)EQ@Mob`O>c7pOUalO_odNH#LQFIzDH?aIOzfP{r_%>2t(vYaKXQsZTsf8_>uK5;HPV1Tm z%apFMN>MolsB$7A>Y8+Ax8S!1&mdFgJ8lHC6upO{kw22XG_-|$k(%d$&$0?^BcxaA zpVd9tv_GqRWKwVcbl;6CH;uEpC!LQbau8fh9_f5QYBt5UK1c<9LmxE+&31j0ZvM@s zcPbpT+|8Ga(?mAtBS9@xSfahIj}#Zre*4IS@zsf;=dHLOCt55yP*6??bRbsAG4MdR zpGDQf_Heo23T*d3wF5IBopaP9?PP0aXmR__4GZJM!Gt3>akK$9vXdsG*|*X>m@(j%_%Z)*cmYpS?o;o{NUC%Z)+6` zCtM-DU=o8Ka!?{?fjP@?_AysEF6rz8$9Uugx#p_GHNgeOa6&@>Pr(&+fiolro-M(4 z33$yv5G|6`4YbuSp<;;YOyi?s!{Y1fh*wzG%;k5PVrmXoqE^qI?dDReT#g1oLm|h4 z8A(8)LW1Ax)lilWAx;g75!j{HwZg7xkg}q+3T=MHmi!vJhoIoUj8yS zl(BQZ(Vg#HR*0mby0p#&^9KXPbcs=J#A8QJ+x^CW2jQ{QqS7*dY=Z=i zmz70Zc}sz$dtXTPAdn4?!c8 z^+VlRxFeJ1(E}C!V7se12ji!QIG(bDMxAncO}|3Qz>+VjTIbm9P4*QPz)*!u5tx^qi+!C+-M`W4qMOX$ymF!$_&8c~AO zj4~vF55Q~sQHx>9Ts&15@qc)T6uOH0s6(m-L96(dZ6%1}4|lv%Wy zYuB$^&aLvNXWC@NJNIQ*Vn>H^4rT&YRLQ3rcq}!}*s+j*M_*x#`d*$M1iD>2Iwm~b zpB_mTbeQsedx!G1^8E9<%l2d4ZoM_*ukVf*koeIbDgF0tNcE`iLuU~F>z9K1nlw+i zDW~EMV;ZqP<}K51!6D;{02y~HQE`v@{aHcz-9fdOxAITTst1{9JpMrOKD8mxqaM=~ zenh$+e^X@P<=k$Jlek=sxbw9P5(w(5CFtqSOprgWyG*~l+imsvLwCG1US3wYm+xDj zKPlfIzNmbw3Oh>~F!3SG#D7!d(+*Mn1G1TuI8u7| zT%KlO`OGR&Q)uKBmTFLXb&eMVG??Yc6UyrXBvvXaUtGZrmpw?Jx#3I*)ww}Jb_ab++8${N~=F!Vlqn1~# ze=Yu+?)db@H3I)S3w%cp@OK4n%mO#`0MAe-Uy=p>Mi1~e1g^;fPv`+YNtqv)1wOV1 zc)>)#eY3#f9^e@Q`|X*AY27OG&+cBg{Fk%bPi46`X1O28a^I8X{#BMcScV)z5&Y+< z%vb#1bu$zGx2T%IIWm9hf2{l6^-i~}{Ox-R+U6gs;Xpmh)$=9(`d{K*`jD8`G*25? zM{d)J^A@RvwafC2Uzg;*wG2AzVhSqM&qb5F*NDIKYaeH*CpWqUWbk}9l$r;2f*qJR zt&aoZ3bf_z4yy+zlhmRTPH|zOf0DzX|2x;D&5}OXjpMQZy zLmicn!1s#BtZ^AWb=TimslEGl3$`7%wUCErA5}CzmP)JR>DZ66Kf9&YLxq}y@vAShL~UYOAj_yT3H_-QexjvF8Ctuj+0C;qjot6^;Dx&m3< z6wL&K{S6( z`1`S(wyyU3Mc~k=-1`bwa`W!C|NjKL5=?PrL-4CIy&;vM!0)Z<6YJWPT#wOA9xu++ z#O{$bM{_pZ51Srp_!Qp$9vqfO!>75PsbB@ZJg@0Tf+^>QPs3hQW4A9qe%<~3EWA(r zsvxhv@k@iak@$rTpY~(hiTI(pIz(v!M&5VTqEa8@O18Fak5EgL=v7(cZs+E-#t-rC z!}5)S6p=?op09ted1CIc%^Qpi^mr_Z=LC+{{KtL?bca34NNT0MipCO47JKE@p%R9b zy#5`Zf7ungza;pR_@$E6`o@Cql;Arf_|6W#mj&OegYQDVo0>`+_@HscI!9Ug!w~Ss zyc%s@wS%>X35G`O&VHH9B;O`E!cEFy7%DUq-m_h+E_)som_8mm_`B1Fh8D9s8qkCz zHSnAKN)FM|o{t&3Nc7a2P`nS1_B^wwW9;A>fY?Uhrd2NHV``W}b)_Ya{x*-l9SMh{ znm^;P9SbAPU>D=nbtu}RK1YTru zF8jR!Fxq1WuO^k(l!H6SjybX3a*7v5&|?Mo1|tp~ls=7qmCc<7{5E&aWu45-9dA_v zweA}6*t}lcJpR&5!Owj9Wmm_UBy#70Q!;?n0(>$~!pOefP0ML{ErMK#9zQBQ{>+&1 z_?I~xcU^Fp3S3DVHIG)cWguUC0wmE5Nn{|e3vwY4_BZK9{~`n32ozLzZO~(siH~qn zouV>X@!r5lVYo%G`D|2tZqEAnS&;8fqs@~f)+vt7*%ix?CdK-#=?Y#;cGVTEDoYL` zd~Bwei+dJh<|en-uUR`xv*~>YofmZlCg!^-e-ElX)5aTVgvRKP&h~SX&YwF}Mb@I0nDVF^HU(u|fq{sNL$?aO# ze06S=!`3eEtW7yB$sgVil&&i?+wQ96rRky7UBRiDTFj>w{}i3F%($AzQ>k;F;RXc; zBuBC98oxCYH73Kz8!TSMmU=t$%`~ep6YH2B%{r8De z!-`kvbdAF1In3&bbZ3{h#C|VeNgRKg$|IAIf4K7dk@Cw;pjJEn z#7s@PJ_fQtkUWDNk%7D^$VGyL6Gu{zX}R^ufHw(zn!x#q6QT`Bp5WTfK{to7QIBzN zsPKD~^jb8Hja!spfD-f}K?)NeSWJn+n}l(=^BB&V#;;ZaV!`$+0sGC+xW0*TRsn0S zBTVKrBy2LLkYMC$S*E~JrN3S2BMBt3t^wc4fb#*@GEqxeJRYhH#S_r&hbpPT`I#uM zeFWXUXk5QU4ao;(^}zzl`q&P05Gh}_n28I4S5G#~^2sWK|U{MqfESQ zA5!xIBWdHx{H3IFqVmUy_0>$Q2Z-g&-hMruFV^?V7N4TmF(4f_QJZ5qjqCCpc{sae zSW{7~gv*%^+9%{Ke|ZnILPq<`7CkIl6pDW{#$&%Q^!D^){H0m12#^q{CgDn#od|$e2r-&MST|Z_9Ae`5kZBi{Rgpc@|^Wk6hGZ zVEB)hv%xwz-*!5J=ha)SYFC%q&mY3bM@g_=6k?u z7^5|IV4umb8pktl4#$xiu)9vIhFU9DgDu>w((+UD;5PKA+goD?J`X&BTDiCzo}e`j z2kKhV@f~sw60+()Ml|kp7Q#P}K^=@V#^=Q-j3!#N0m*XH2qmC$wg=%`V3jm8HO3zT4C2G39pV6$ z6ejl{|Bp$<_$p~QzUcp<#LlzlGI0;(f1)FubLo_$Ix7h1Q`>yLsO||a*W+Tz=hN*l z4&60D8V}(4`E(PQt*E(w?0=6-IkDSnb2fp_y=H4;dk&X@Ya6$51G#&0#++#W_cTMY z#dJ}&PEZ~<%yzd`H($p3Oy_#{EzBLkD|yv9yxVz{c6i8c=t}L0_!bV^6`Rv(H}YHk zJFq6j^RH(#FJkPZkSyLvKy^;1o)WQv;@vkTw=U;{*c_Q1&7((R!#=3Xd0m_0IYbRc z)53`V=3shQN%SIVUGw}L8!F45>IiR}eEQL7C{S?(#Td+ovx1 zjYua4B~h}EM&>5Jom;(pnED9hGpV@R*1i3w)@9UgkK6PyxvuN$-8YHL_IXqqEJUqE z(Fd%w)Y-I0rubtO?`Liwo#-}u6_zrpl+m1Z(Jt&j*X|oT@w75nb|cyK$eA~UIpbBv zU;d|zhmkQBxw|v|Bpur_Hc`OhDvhMbYB88jF48>y=&>**AAZ16aQ42nwM@NLeaHQR z)6Q`}O`{R=IVpl5BGh?g!|6Xvn74X)EVr|u;q>MN#_J|wHdC76ZfqEaj4qmiBELT? z&HjMw8AAR$8kGA<$?gZ~XfHr^S|R@*y#U!GhWuN50rnH{x?X@fck*ZT0z5!Ky?ngC z+KTG>$MgamAfVKB_m>iTMTjQTlSbn#3w_cC>N&}>fTH;RpLIJA7?7xl*?fx({NWe|K00#^B`(A)00L6Y#-afTsv}M=!ur z1^j+5z_9{e+6!=;fU#bH;{_bi3-B}n59|eax`6M)C+`mll>$E73ot6+eZ2rD2>7#J zfK>u6?gdyapp2UDuR=8fR`mj$DBy9u04E99uNPoUz#ZBy?Pmd~74XSkfM*E!_g;W! z3V2H|KphwO3wr@h7VyGefM*GKS}(w}1w6VJ;1mJFy#UV<0;UZ1YGjz^O`k zPcOjP0^ZaM@EZco?*;fx0nhIRI7h&WUVxVfIH(ukr2@+8`~KSbO95Z&1qdwUZ%hMu z{p11mJR!$mEEVkcz~&}rlwob82k@r?uIL5G*%9==2QVj-?F|B+3vhWl*KXJyf_-iO zu%8Kb#QtH;f_=%we9Kd8FsF2vIP-C`h5qaVdBkwd`k~@JOXBS2VA{lr$DlC1gc4^60qVyw5 zatpTBBFiTYhg)~gEwt}_>y`}#=NK5i$~vzx{yn`#V~5tfIM;u&P@9Ymo4`=>Ld*fa z<@=ztxhB`UZ!;(HYgD?b^ zWcid_eG8XQ$!qB-ULFhEH5@7BxRSQ}FJZ?)Xx1gmp6^bqHRg4&YRo%6kxijKQb#4r z9BQM%Dz8_l zcU5;c5Doja0vh)F8unZE2>HDKv8QnPq!IcSFQ0@^pUy}R%)es_x%YvI@x@?luCRJ+ z^WS>k#wL@Z?SDDW#_Y(4diJ+<6GA3Vb)C{9H{9P>*FF;4{dDu?1n&$2+;)6n*M#Op z<8%G?1FgG*OSWIUK_%yW!NJxLy8d1N9sCoTtH-B1ztK8>w_i);_SgCQ*xcG<`$z2| zHNAbcBs0eukDv42Lm-(+OKR3==dhOlkpIVfgyoIuTei%vIr9PMuy&vhbD&8b;(ghx zW2U#ijb!wNI;DQf?NtQ2jM2g$r!_F~+<`~(34hA~HF>9B{;IO4Vu9U}UvM@Z*rj1R z-Q(G#%oS?2VvAbQE=q-Ffwd=YG>aYe7j?-Elao*A4VvWRl^7xQhfyjLLS`N3zs~)U z+;deMXUOFC-^#hu@4pi2*0|@Ggj45o`n!JT?*rY{SSs6wfX?SRq>r0;Lc8?64EF@) z@cl1;q%&uV#5Olh!&7(9F|7hi1Zq=YxAU{)NB)ubCiJ|A(yh zj~TtU<&Pm(bOn*x&aIKy77Ytbc@P*pB*s${h1{a&u|wWiT!-~3&H-C?=mm;gUJ$F6 zLi09%cQfe95dXdK(Bp|ON?b)`;nZ7(x`kE!UP1y38ULVUA8({I(73t0ur8H@kkskjE5~}n| zEQ2^ii5GT)u)p)|VJs?B?8aY{H}rm+-~ScSAyF~EF-UfJ@SV?BXOYDECdKPJI{?iH zzK^|}USYAC);IlV%_(?}@rJ-*6Y?vFR;O(3wV&jKGb4moAr~=x9ZDen^jE(O2Cf*w zoBp>s2sw;O$L9%WT=bv)jl!XwLWcRZWNeBm&G}A;m`exE`M0^y5}XyVQbgdSAb$vJ zF3xhC7($klL!A77IA>*G?Nz#Hhp!R;<%rhDcbj%NP&J`0IVU2#j425;k1-gLtbssX zADHj%r~XalAxpZf#C@+mrnRaJoYbRO>OR_&Hndia)Mr!GsF2zBY4KJ)th)~~^ut4i z*9X$LSn6c|>%*z+f20-?s;GLlr1^i`R~#jv|6e`AExv_cpAO%(!32Q_AU}zv4ogia z8arW7B9fX=Ja$4!d;%A(CKPcsVZe4?zvj{wx7zlyjxc-zS6wpU6T`6-FWxT1Xl)-} z?(90J+nPad%3LfVsN#QIm--533;O73xJknqFsokr(yk}-Tyo(=j5o~8FIVs#3fAp! zu6p-tN0Qz63?0NeL(+Bq`7kQg-__MuU2CkaO$y%iV!Ez=P}k>p zd3Mm)s#4y-s47L;JGQD!&N2%f$r~6|BQ3OC&hm}H80o9do3G&46wH-#;c1e^o~7VNgV@=9nyMKz zwnliWDNWUsjI9x#YRW8Bc&Zs`p~6#5dBsJ-(?#IvQp3}wWfd0*PZxowOASw#mRDCK zN`=D&v97dOSC$brQdmq7?@EhzCHU+ZF}Vay>k-pH=;BCC^3|GQ9ns{Lnqlw7G_3vz zX=7BOzy@}a63ZUQ1Q5Kh=zT9n3Y(Eb8m=D|N}S@aKw`M`dZP@9L9JMx=FiavK9YO! zDb)u`fqfQK+5S$b+Y~^mGpqa;WZ9^fjtNmfX;=m6)*pTI0=#Dxj=*WZ1ViQXEmhgr3LVGVY zp`0&ANmz`oENTvKM9RXuLM~uoQP-3H2YITARKJN$tSLoZk8s;ZYGVFLTg9L|t1=mW zZ<;;!Wwwg+;F~1<`D3j5WvQuXjf_5;dc(XKU**5cV8j~G2Zw-2qsXFM$~fz= ztXki*MP-og8th&KNs=THLzmTkQZ!9|vii`h`Exu~^-mEQ~u@cFu&^&%I0shqP)P;mC$wXT1B7I+x zP9zd-FCoHBnFv260)a;p_=8MflM6hD!1_$!RRoHacBZ_%rl;vY82}%ZI&%;^AUaD^ zNYk)N^KZak3N&dh&i@@>GMarn7!#xEA4f)*Y3w!OwL!w~xP;R)3Ez2233C%?WtVuN zN}Q^RA534$9DK6NV&Dk(9dK-r<&iGSQOXiV7}+{m2II+Fb|M7#!VUHaef}-S|7$H0bFAMG=^U` zKwkYQ0_RyEsv4UK#D8hvU#WWGKMBh|%bxa{evh}~4i`4r;^ccxH#`3sfqzAl^G`H? zAFnCy{59t9%e_PV9T&L3@fKL%HJy#W@za9(p(@P+`+H5Nx=14f|H|P?DI;@4I>rJI z^qK}b|51T|MZWV7HoxaJeWaa7bAGY;5AvGc#NY9v3mj;HL%gOo{EeRusjnwy!~zfX zn*M2lhgzLN7Fgsp{nn+-3;Zi(SfQiI1%7$7x~bS}TI&2C2mTd2t)M!5V*Vq%rf+1! z2YF4Htq65Ya)CQ7QmNN84u9jPrS&zWeAfbx_L>+g%IWREzXFOU|90~q<2Chl{x{8k ztk<-gankXQ8!YV>c%0Ytn)AOD_*Xpb{4bjSc&}-_^KUVKnb-7p{2h0@z^5#5g4gs5 z{EeSZ@K&DVM%+UN7~?fH8DNaJQWA3NcE15m^qS@w;KcgT1m0_bBfO^bUABJ-{3|9p z|2^hE!E5>&{*I9@@b?yYlGk)J{>D#Fsvk&BcUfS$*HoaGxi03;iAJ!0`|d{EeTEH%vEK;Hh5Izg(ooz`x=i=Wj6oSlaLWi_JgIYih>d(dYud zXMv}CO$(j>JAr@2W!e5puW3fMKk7Bb@SCFf7Q7cX~3L}d+DeB7~b*Yf<#L{?Jw_PovbqXLxE!j zAirE+TMT!(Yxx=eGsga^U0ge&#!DnRb^NEBY0Syid){wlRQ#Ex00fxk}=mX7Hzdt%)#Z31~3syTpvR_O0oXB+~s0fHf3kI zAn;&eYrB7W;3<*kB0Sp6mB};Y`;@$9{>YZMctgGF1l|_uw+Y9IXaM%xRM~%idAdG* zRG+^x0vg7Ky=5Oz3yjjUlEWdDE2Fm-b#?tql~Y*bn9!1=r8XU#!&Vwa!RAqaRiqrM z+qF@Ein97`7Tsd;m^$L3(R^IUQq#nqwh{(q6BVo!@y46lD3MY@CCCF9#0XtaFR zwj0wvYg|LxXRW&ipKaN#iYL=>^yg|uwY2w*_OBU(j1%8zYqMNmvqsBx3fi4CKj?}B zs7D7k-e`KB(|k&!|D+q(0yWRiS8a#l&UEM}_0D58+!1)Jg4+U*)$eIM>I$pg%~TfD zt9JdXsNDZY-J8cpRV?k}lVkz|1SYb`uqY!24Tu;OG%+k0$iPGsMG-{>#fwH%RFoM& zAtX5A%5faUeSg(^)r-D*U9Q5Ft84*+J8p<82nrnr4JtcIe$P{V&Y3e=l=pqV|NQ)X zBy*~}tE;Q4tGlbKtMOaYh98s(N{LwR9b9yte8g)rhXwthB_4)3$ z%nNJf$-5O=G6~DD2-_dkW0Rctk-zb`o0G0ACtVE~NhDwB`o;VZ zx?Vyy5-BWQ6){bc1GhO-Zk}pO5{%R8={3lLoqwb0 zaKYSR@@{CGxs}=c5pEY9=8ANS;w#cAHY!WMRxBqo?M8JDXPRgKHRULm7AY#9Tj|E% zeEj8uhI#ml2Mr^Le_sh7aygH{<29A7T#+vL)0Xkbv&1J9UmaXwgwaQBXW#>Gf}V;$ z9#^D4{@?%-&u{<*^8Zo!Omm87H>_hfv}D!}L2;HC@0IacU7TwNj6HPjJ`#g@bUCaQ zIJ!n8Hw+~+;$~dV;&0dah`K=k8UQKQ^LP(5l@1DJGdeR{44aHR34Z+ zlT0~|KggA%_ycUw{P5x{-<2kmmwJnpcoZ)$w@w~dNhi)xlMXSeyO}Mx3HT4Cbz8o7 zU361A6vaDklrvU%gYOt?qia39l@MGjhfUf;nSlGXhjJEi3)8*DJB@eR{9>$&t`(nb z4<3wLNn}OzK5vDW?gB z`vKzfQAaZU8+`1kNe?4+F#{&4_XOY$TXF4w$I4<)jVElK%Hq(nUX8_h*Pfc}aC`H_ ztX>i6o|+;&U4%GKEQVN{*kC zDITtx!ut)WZ-XNIvv={wq!Xv*7yxn=)gyo1IsBuZ`W@;>4s~13>s<_|c38Vq*v|ZC z0y$3ZdY2;df>B#$ybqW3PjKPw3WQaQ4jUQvV{vfok=mx)3shJ(-3MXpQ;)2sUGfv2 zL0d$lA6C)mW}f_)8FgiJhzELJ^A@jqFas7^VZjxA@MQ{v0)=xzJZc$@29BcxI@JC; zFM?uNc=6ZC4DFa+0^fFHg>;jO{$_F~c}%RI0)REtTm1@#5ZdF8obFvb-K|#LL@9~L zdhy@*&9@mS=|6I%5s&yqw-8WrI~H+a6b{Abc+|xQIS}9|?p?GY6tD2BDig2*Qs}ls zRmKEf_bA5OQ5X=_Z=0f>jZCHiGUPuiZpkqcT}(9q()o3IA}vl_M$zeV~1kk`~c5P%zZ6wKxx!lHxXkDHrlGg|2) zjXs`1$^1B%gqAjKaS?l zWfcFTCG~3i(nEN_=KIKTC1|id23dtLX zzYT_7+omouKhlYmfQW@sSG!Fuf)v$N10mFogj4IT!>NrluNZi%M={Z^?io~P)R|CA+)@!{Uj)oI&h9fm+5B2M>BLFZ5UY`(jD!)iEO> zWNNM&s#9}WmL~iG_}0D`|Hdf5nyDe&QLn$YGN+LtOltgIoOxOWRk{*|marrg5^kqJ z;A5v&LBE7sHw1laf_W~vj>2i^q8mhdNBV8ZC==3KU-QC;*sfTNHT zSGO6s=?xH$pLS9@lHja0!N&SC21a~bdLX(g)6Vn_V94b6F8)e8M7;-q{Hm$BBha`-rU`D;V58&u>B6oWiZ_pU3Y+TdrUsLQ~f59){ zf2{5upjZlXwBRXaI-aRrm08Y4Ed&_%R8O+g`y-vHeA`ysZ?OCa$o$y>KS#xLrf?{A zf#l&SKG3!gg8&~R{kR;?A(c$|HYLTQQ)ElG%1r4kWwLRs6U+Qh2R+Z`kzh0)lg^MC zM_`^k1tUMvO24=l6)(Zq{Bi8MPxgUWa01OSGo7x1`3XS#dCin@2F?ZJzq zqmZ%N6x==GOYjD69=O&T9$gufi3&Pl(Ynl8U3%T+Ii8AYZ zD)w{u9)jR6A^;K8f;3qNK9AirUg0*s9>W(`sD2PhU!M51Typw3>{`wJi)OZc07$+{ zYtW_!XPY8}_?&b*)&xc_Dc4lOS27;KK{{U00*$yJXnuWwuha@SgC_Tf&?CmL<#P`m za!v2Kv;oXgM9h*==d`;PjFhV?hp_%4`@PNfaKS_{w@?hgUnB@lVC_lAJCvKDD*)aPQ(upI%GuWBH^k`#Qjhx)VSm}3dqp{Kr zfIsQeknyW32QTmj*D;b++C%Z!uc7Tsztk(i*QAM0dXob32RqlfJLaQPg>9de81I)E z?_uj2G-^#{0;MzvBEt6yyD?^57H0pf2CO?WT=*xQ|D+-H$4JKzQZdp@$K3o|_{QM( zk*=k2xci%H(5-r5wumcp@nbn2BhA;ahGHXA?KqqmSz63n{iYCxV0yj9RH4*&oIpop z>q$77?>^>3hhZx=CL6caTNTeocn&83u6nbx{ThVyPzEmF#zUC;;e=p}#$VW`akUnI zv+>s~Yi0}}lQBB2apBw&aRnNUzu3aCG=E6(ayY(v7mx8l<6>Zqke^d+sW-U#{kcjGdwQ*?5oX0@%DyD~*S8F<~QxkP38;e zJjg%XHg_eZWdU0Sc|ceXOIj!_lob&b9G-`B(Cr>{J4SmbZ4bScF58ss`0!|~k`hNP zlgqQaHp-$2UG9PFBcvNEs^#GU>p8*?gzxQz-(B-Zj=`Mb(!ht=W4Y(AJ9)ot_cnQmd`&#KGF4lbTpIrn)U@!c_ zmQ$$PP5cw%&CVPxsm^go{R1X$s!w*Q@~gsFg`5Cf;cN^yjP4t zIa=>$n`^aqUK;dYU@k^iLnZ7~b8#1vKg9B-ZC=3*4#u1Xa;y22H4hPB`0`+O%o6Ls zda#I$DgMRe5e#Zc9(9s(;bK#Y_Np7P4i_nEQ04N|DF;7Xq2)lVUmMI1g!Zdf@8W}u z?abH-aJU(5G51wT_%S6xB0R5)NQJ zU`_*?C znFwqC(Se55$;`Jmm;2sHg#c%^`Fustm@ceuipTfJk{b-z+U!Bj!j+F=(OS!;f?v;NbgRuQN zB&%|QUIIvqDp!4kJPru926%3Fo4Q+mW7P4Z8XtAM><3joG8OUFNNR-m0)TWT3vsa% z+3EO5j7Y_DY*Q@RHWt(?e zHOg3n+G73OrZ!kV>(%@C3CTNR`Uo896dV0>=ss-hD@OQ>_#n4iB<(Gi!*WrD_+%sE zr9)hJ1!*8{%vdngt6yN_OkAq@L+wvk2Ab>OGC?~hk{hP3++u#n5MFP7h&p)N{1A2U zCO+(G;ZJPUDUpLPw_`@w%Q@@sXh@Pn|3VjIEUn<6!kZv?_rnh_QOsq08mRwTB&}o; zejtg@VpvJ*)b0Bk8otRa1-dUbeS^R;Kn@*+EZ85QtbXl;*fRad1ITjf=x;JR>Jsws zm^;VJk4phN_1XsB+QtgFaF;T;X}#Ky1q(2n8U1+fsQ)JEmz}bvF}^hOeWdeQ6i7xD zH0t#F2afhhl+RjO*`Ca3h7h*_NKrLB$VEe%SZAeVoye>pKxs;Y28<85uwdpr2YHKO zL(c*lp$+f-nn?pKG{TN+%J4xOeKZVP9h&t3#|?S3I~g zx-Vl!S;}Q4X2W86qw+y#r=$?I_X%#MnFrE`Yg|Ad{k>D;wj-bCrkBHHQ} zyVM8c2_jt$OUFasi_;Q)@$<-tC$NkIJkbMRetyYzygk0gh-+rCw|E~9RIa&@GQ4PQ zIhGrYx)z8wqzQL;c-NLWo<|Ox&MjUM$O!si!}eiWd`4)}PT7JpYIxRXvN3A&H40_5D{-+wJx(LRF-HWW}aV^KC?nHDk)b1)aeh3y^>G9tAHJXjRqZb*! zDZ@Lpp?J?rLTO*Io{g+$xZyq)t<0D+lA!khGHQ$s(M@@<+0Y)pSN$6>8nSusZ1O?& zoM%Zsuv#WHcSE{MZG8Sv1FK1c$=VB}f^I6KzGkboXfK?KN@8WG-CYEqj3bQm1L=u; z)SEsBM;N=c{UM0t@KhWk!5TXWVuSFQO;dJZvJ&ROxW1ooix>y?UMLV<0JhXJM z6MYMImeLa@KC(k}O>1vx=ZZra0b@FL2h%$TYDWqyWkrd#aZXw|=j9{$BR$-Me=?RZ zZpF)fZ*XNoUu3RBG;KV2Vzjc}jux?`484Le!)|y0Z8q7xS3L$G?$pv&jU6Fv)&1Su?%1pD!B@bj4eVK!9`1zILw^F#MfMB{U)dQ6?qou~osf+LPq;Hm z1})i}BZ}h#A4UzrPC_8@NCs-bEkWRpRr+|b3{?0?#li!^m+H5$td;Ws z0;@Uj5nR^>Ow)i|&JctzN1d%i1Z8ti2T~W0$;zZ<~Uj$4XZPqN~#FjNbr;A%u1OR+c+} za%t!#^D}|ZKw53$csu`#$Zyn`$y9FG4relpo5ggC+BjQ8ia_!IrbSVxIh*)_QgO5< zT?^2;CZYOkgr>8YS0jV49E*$%NXg>YSu}-Lec<3Z=dogAVis<}W;-bTV{UKbX+9na z6D!f&RUGM#MM)@jp;%*NBy9n3?z^>SEcOxXY|JDeJu{LA4I|U6Psd%Diq$BL> z@T?}tvYSDc)dX2~Dp5DNi+K$%cAlR+nuklPunfEnOD$Q6_Djf3@(^Pk5C$&YX&+eN zu3@F$8YP^ey2%}w+EIQMP@~?XC~RaH{B3YzfO|Az@MGRTiE!(>VYC8w6$#H)T{T?B zCGz9=lyE$N_O9g5B~ltWFPTtd&y83pf{M$`hs<<5#qW_{;!pCTD-H@^xz(qW&vjkHR$o$N@-t~%R&N0i#DYfSvww9#F%JBaYAp^M11@6&U z5pB}^l9LeY=ch0Vr40km?Z5-T0rNA1?1sy04B*B^v( zkOk%OET$Q8tzCxZ@i8VNre&)arNmji0rbbFuBvw^3fwATH zlG^XivV>lQIUhMN4Nu7#NLCLft1&>fsfV#}XN$372WPgJA1145b3mK~ZF3MYVy^#S zq(~7b^DZ>m4=b`3IOZGOYV0%D4{&aLl()rin5;H?^ZRO+Y)|g}lOH zA)Dr@QQxuYmtao*3fJtgZgDPlgqt`b^Hx8Ce#NYuT`;0&xJxktMifI$We4f6TZJC? z7B5F?R>6qQOg*b}F(X`KcDGX3BGpqc!WTXwc9xG0$!3zbcrDg9#ckHMS&PGrz+9{q z?bD1%8}pbW>^HJ7bbl7bBj(^IAcKLom^ZML|MDhl_t;sU;=cQFr~U*yABvM-cJc8L zqQptOui7s*EgO`1Vk5FZz8l#3?l)F4YoPDXfxgSl0%t)sc%jx)9J?0l6-1OqUUXuy zM7Pjvn#XJ0#QrFh4)?&A0fV{R0(a(Zlb}d^pNB9ZM_2hQoo7BQm3p`bT}O|G5SQ(+ zexvn#_7s~Uc*$T>B=CB5@LT(5XG}v_7v)7)wqCIvVGYd8*NoEg3;l2f^#g<$b;HB; z56;-~A-||w%c*G?T9lSJPYgp@0kJxZzY2V%VH|235K}(z$`}W~O$(To##cT*>hG0X(Z*TBCM)quIJ7iujG491BOvE_Ts|;i< z=58l?C}U2lAq|`%qT`UtzwZDsW>^0F4zmue2`P3rA(g4Gg@DdjZGS(FZ$1#E%G;<2 z8}eUux*79mq%bO;#lmKm$yFCBX<=Sh$hdm(2b z{*)q~S52{SiSH288G9JQBHMrn0%_po1w4YJp1}T_+IXUzGx67Gwdp?Y@0q&Z z{FSZVlV1qJRwF;KXyU3FgD(#TKrY&+T0>6X{1_9OyJHEwiR@_PH8;Lp@Keu7t$8(N}4~LO8^ib7ox4&(qlkv{Hx97BvpNZ|k3ITRV$ap_gOKXIymR1v%dieVsmw~NF zW)*&faGMlCVB%dSLEXy^D)S;@wZLIaE&xXl;a!=cMF`URIy{;%JNz{bJ}E>vZ+Rq; z=p_@l#CyB%3!UMa>cgkfTpSq;TzD56BuB26`(@1nhpiKC%5vNS zhqd)QZn^z2cvKm+G$~c$Csuv5L}A2i)w|4-$sQd1R^J0?pzlW6az8SRvW(X^p^kB8 zDICPhi})KXsIM$6i49fHAP%u)`ECgh94wQbQqZ$6-pc?!qRL-2%YL~4{`IlxaG|b% zV_vsX94V2%R1~?QYG@F7p3Tn(Eqtoa zNLl)3TZ^{>OzhtHd(!fH)taez&6gXS=`g#>$mWdw6J|Axa<>+p+=sYVuGOy3#f4Yo zxGSz?uC>f1Z<8+NuhpgTLHDBF^hbd!ieU8vD;|u5B;L%FACdBtPH83e)vARE+y~Do zIhSux>roY4rlpeEkA|QM(fxep@cPRaFrL6qqOCYft+)qDJO7TDqsU~MdOH+ z`V`6dBsA%O`tD9#4KP+=Kxo7K<3rH`oF0nNaVtK!is?_<=)uXg2%dsS2{JiG`<_1p zL=b?Kb?-*ZTABCGlq!US3%HQ`PWU_bbZ@!kL@W>xVZlTKi(Dhr8~x8vcyu778*84-eUNk`1W z-+W->H`PA!ZV)DL82~0+!4Pk_m_?>*KhYE?FPMn*I`DJVDZs)IkZsB%Ki5D3vDOpW zXEA5wI3V-YRGkw_<3H*A$E{Zv7_X-f5_)}AXN5f4|DOZ;jWY;c6N=XOIo-G(=H-At zIZWiMJ+TX6JQ|K3or?c&f#GN+h(T}f749RBz(;zPx*9Nato|yFU(E=yC#HucHK=Fr z5YYjXaeVcSGzs1TwdznD;bGUfj~#$ozHY1I8B??m`K5{vQ zH5KlGfC>51giX!(&S`BHGCqN8MJP7X7jqe-(3&|g_-{rhcmDyM{LuXzs6BIn)jx)V z%SNN`)Vnxnp-99k^0YMk{5>+>fQ&HS@4tkHA8`?rfK`c2{+i#XsxAPi+g;qv|bbpF{n zAFC1LVjM^O1!uk2fcZE1`P3AIncdo~qWEKV1cz!}`#DlO6baoQ&DyC**1*McL>gwQ zNf@!$;%3lL^%lC1VPR=5;*6FdDnpOb=2X=mQXuMsb|v+`VXCqw6r?q#ps*1Ib16_} zpSDDSYOE)42Mss#E<{YY^yn{XxEs$t{<|zCWL8;!nhf!h=qkuA6vsAos_tBTqOnc% z2b+0#l?+W*a-&@d27*+ASPqn+!>>fFCwtM6DhJ5$N-s(6rtv~Q<%#K`)DTl+J!?KJ z(vw&}fC4nJ)`%{o)+=&ieYkn7rW76EAw!o?tZl)K*%91;SqpV=o(FrKNJ2ZSG-8^r z8G{2}>*{QoA=Wqyh`4#O49jendXz^_oIdf&akK`T@Qv!`d#P9svuB{jApxp>piC3I z@&-fUJrr$6ZJ5H0Z*_eqNPQ5E$v(&ggdbIJQ>|F#|3Drb9;K(_GAbCW!&Q9vSCRfw zBiDLTiqB(_s$8u(7sFv%4O-ArZ7IvJnLJ>D*$}fKmY>-8;-c_-q3E0X)<@-N6#{w*_^;TSK&=q|&83OZ{)g%QE_oXJHlz&PZJZaKvJWRijNm6hRTW;k6k{LX7- zlA*05!;{Q#q+~cqhZo7v-jU&UX4nlLMz`$cl}*XOVE9%QGnnC1$*`>YD@LlWTjC_) za;CqA^r|hDSO^~}JFW=;+Rgl2dg!NR6M$7MsYaXO9RLrZo;1JZ#YW@)#Gq501)env zup!Do0U8;wEY>W{MphZ;>RZ8uJJMl<1R4t?d$mYgD0WBA%P7hPw2x-e$f;k4^SR=UPR)J$bMO!&btJmixOD%MkYRytGDO;urSO?8_31-upc#z6xS_r3i zQ3O<=k2GGOyC|Q?GBD6+V8G9I-bHDMfPz=WTA5dVc?tAppE}9RDS?n#7+1)-E0e;0 zUARz1qo6_GGKB#cs_m;toLus#|J;QJLRlaV-=eOtISfwsKCq(dKqhNh8{L%F$PkWI z7F;vAck-yZe7y;>Z`5o1VxVA+H~tUEwVt-Gd5IjvvJIOYj+GgArem(&rv96yp`aSn zoROdxL$!4t|8m{EO?{t-)D?lZc49&c9P@tkJMa8<#q+OCiw8jA46(XiLj*c()n$T< zyCE#dX8P2`80+N8=eWGOZD2yx{!D%Gd{DAbzea^la29%13b`Y2bJ?a`$wIqNC)HL> zezoUzT~pm$6u`aw`&L%%w|nS37Or6lP3FI)Fq@2E$XROux(eGwcJwg5BOb&IQC8e74b5 z_PX*A2B!IrVqqbZ#-Vs!PY5qowrV;gLeHTAfJI;PMh0FS2lusS;42twI?K_>!UvFx z+D6iN$C21Bh7{w(o*9Ksd)12|wAhqa8t-$<=jpD&*^xH*8N<&+_rd<;NBhBfhR|ex6zxb797Xw7aosagG~-W-e!D)k=#P6)^cpFe`6orI+PhO~eU(K|lA`X& zILZ^2KC}-;dd14J*+|TN;MkxWrOpObU4{3b4{_AODGpgmVX$lurN(_#$Occ+}#>|FAm`^={Ux}XH zMTlpnTi-!C%Pce(g}D5>8M$a+EW`cod6T&u}ZbvL9t<9&q*&j)D<2MuFeE8 znv(uNS`zb`i%Fr;TugS9>bS-{(+NH}=Meoy`h$}g5Tmd}XXrNXo&QbN8lOWV`>XR2 zT@*2BG}5D;rQbs761)T}*=9?&)!OI?By)zD*E1$b0zLkyBU@=~CB_Dga1*?v!3RzM z6dmfEzgrgRHWO@CNAe<-dLq6y5SSb0FHn(P5HCfQJD7js>ks&fLDn_X&mo$OIm|V z);co>bgC&8W`=Z~foEh^h9JUJ&Ij{^$JacA0dy; zt)a-vJ=|%xup78|dIV+xJMSWA-i~J8w#XvvG=RAY%9l+V2cKV!ha|{(wgVO-3~k4P`{XkC zedH%Ka;Y&m2ijsD&_W@I7UDInH#I~bBfG^RR|c=y`0+DtNFMEskz_t zc;P;)fGzAKR*{=p1*G0Y4<+McWfUw#)Kmi!P_bFBESv62P-qO%5_<9IiO!ZBjFedYkZ%F+N&RgqE{ zAvk|x+(6NRU9ooH*ys*!a_l}~T$kWFG7d|Pdi7seeDM;x)d&-O@jeV!J%V#JRh18G zmEj-&+E%Nf7eol;GQHMCT}?{3hB}{0&ijpLj6DKVD;V^mbAR? zlok&f8yk}kc5Mf>P)T~2pNrh74J#8Tgl|yur{yYK;A{@cUa)%mo^|4rr!msqa$UuG` z*N3@r~W=&+V~aVf?~&(=q4hKz(}02oFr;{RP)DhGe@2xWY$?8u^qhie;Yo zwqq%~6S61bxL17z3Rvu+6R?iP;f?kn3KZ0OBMY2gb33`KdG#nE^(z`Aqixu z9~HQ)tefOzd#ON}yT+DtcswK9!vOMcrOqBG z*f?A9doDBMu+`4)jei3EGO65I>u_H|p7+k}l2oh4YufZFPbV;(y)YU)vU}m^8+9)n z10)m!A)>SS0mBu}f6Wg(yi>0Z9Ivza>HUSrKV(l)ueJb8CnlT&;RqtvsL7asLo>5K zO0oVyhyH9ThkAAKr5u?McmuhB^cj|R=dc6w*n##q@W!9Vr#7LC6+(s05vfhU|i4#NMGSP5(m%~N3r{Y)@_?r zCb&$4g|+>TM!ESx4%MTHrv~$f9)&lVxo?Ko6p-ltM`~je#@&FKCJZ9DRS;O?&ZiiP z6~(dCN%HwZc$NW{XN@xN9X%QiT!c|H^$S}(3^>ezdo0j9QDp%Y1fj@6H5-T0_3C%b zXizlv5UiL==r%yLHH>}hQwqxi3^RRR@Wk~TUO2C#-v^i{eT4J6QsY=>eUBxiJ~+{7 z`f{<%Lf2mdzZ$^@I^aw)djW-YQ-D3kk&3hRKbYt-74QWyo-gner@a=B+*8Q+TJy4* zR|7BD$m)So)Pm@6b$Nk?!M?i&12c;Q(whP1)5UoLL`_Up6W2UmLUS)RWVQpiw(ub(BIfS%2k zmZ~?!>WU*$rgl1?skBmFnVaaVNqz+$144~f_z+k2%g1mxR->i86Y%05tm%;}b^f`? zkIuKKM}F?0{>J=%N( zit(u^OyZiNV1K4i@rI3}C>2FsOH^1W23ZZ64iwT!Q?ZAcnXQVZ3CBWCZdusgZJ|xx zJ70!~S{QQ#?t+*$}(iM?<+aZj9N--aAJ-2Ihs+$R0fA zFb-3}M)eH3UF+hheh7|S9)sqJU}!a{t$npAcdr_Q#Dr!4+^dS27b{8(q*IykEjwdB zrkLj`n}H5Pk?1hG8`MPX$8}xqRCK$0aYZ}UAKjcO(R^hzBWy4Jg2nB?NvQUsP}|Xn zT>GV-emcS>gvW80VW*$1Hll|#=I4P5JNj%|0Y+Hu7?Wcec=sv;8F1F)m1mMUI@WeW z(`fI7@l}S)VgM|oz*|mcnhbZUa*?Nqf0?OiL#0IF3y> z@4Ci;N3$r_+5;4p=L ze?k+7-hei3Pz%^>i=+csifEE{;ulT}LhO@)KAPM^9=@%pW#@CYL$)nzkx#6w+i$Wu z{dECN;4KbYB>UOSeNa;M5g$boH~V{GPyHo)?U&pHuLNk@d+5>~A96qbsOJ&ej}jM~ znom+LlG0-#889j|s1LV-FU{#)7vL>0XU=3xlYDst8H3nyGcie!h_NK%W=%wUO++se z(MO0V$~TGlv?tp{YT-{-hqgZ2_u$T~)JKdsbq)Af@ho01E7;d86 z@FIX8JM`EaTxoiifStA>aRy0DznXl?FeyAmQ-}^0HZA-il})*(`o7(wFi%r>5R0yBBDqUfiPM)a!w@<8Q#)H=u?-@w50Gze$AXSm;u;9ksI zFx5S~eQYX1Oz%}yD3O4C?p4$A3*k}u^I8k(R8NM6TqKYP76piT0H;#s+BhCk1NS&} z6)MtFd5UD4kVg@m3buq|uGmyT>5~)yNVz~-*^q1#vJ2Ww3QZM7c|G-&2>Vxd0`^P| zYOI~GQWCUKFF->ftHSt`zE5SmIn#OX`q!ZrIX%aoJI}aI%V%t6NL?@mjjV-}C;oFv zyghf)3(=2&qeIW5pgX2le>oJl)!vjyHF`o}-gs;-N8D52^#-CG+!3ABc zwqGm!)T$e+EuVg|{SyJ#s)oOyQ&tz8P^mZ-C%}B@uAfQ_t&=K}@=Zs!vxWr}{X+nurs}4IE9iK@YKpViPc1nk6pe zuC{53Z1t=zA#~_z9Y?b`_!^8R0FzHJ$?5@47_hxReh~$qFe#|{hlbg+33vKt!=Amy9QiZz^c~Gw#N8IUD~i=&Z}F2Kl8y-07o1e$`($ zNDA5wvb61~W@Em%S_DECrfr0F9m<^j|MNr(Gag6oSNXm~m0pi-MgK!;9sO@>NbXy# z{s(5+YhcOi#wNkGDe`0>Up@9U$b_cNCn6r9KvVq~z5qO7YYD_(lNPv<>u+vT!M0gG z^%XYgNY~vQo8?#UXnDCgSDSGL$`rT!)P}R0#4b&VT}70-%0)?r zCpF;Gqc5u1IeNncF4{%Rgm^ar51i$y`q5D9wGB1VgRSQzSOWqf;JFMO6E%c0RSD6t zTE5zz5~UJ>W7>ua_QFvJ@g{2!_N=wsx-a(*Xmv|^xHkZ4_`MvzkHGI%R^swV>szd+ zZBpp(pq&^eUyAdBPNd$ZJ3ZD~UXC|OT7(>$q(7i1*1C}1CL}GT7QBXhy4J9J&tbdy zoV7Y0EPy|>ZnPu(D4N*LYT~-YXz!xdqG!)&6)A=?#0xWsR2rSbzspZvCrJy_B7G$Z z8yu!^O^4eou}Y760-TgQxYU#BxR~RJIsxx0@Ho}}Dr_?&6RUuPud1+D`2zmVNMyxFr$v{$s|x3MN3IMt z)KuZl>-zXic;7du1LJ8Jh3N}ExmyBN@UQe%FGuB7g`OG5==a?2k{Zopn@32~L!q?Q zb$o0UmCTq>RoFg)z{o+@_?sANHxyl+o(NYJwl#s*+rY~}oe2!vz%z9vBmT{1nUxH( zDoOMQ(KF!tmVw~dp@!8w-scl@-JQ8xTe)@9yz`1M($-*DbO}hBEQe%a&4i_ch z!Mb-n^c}wC+5`@|PtH`;tO{Jm)(i*RG>D$FSn83^RD;kdiF|gGnRzLmS=Hc|rr9P(TXS9BHx850AV+g%U` zJcE8+iQu9uy3X|ib2XyN zXXd)s&NYL%AY@Kl-6U7|MvdpvW@_uMbDX1dlrl%7wo$FXB6y-4whuZ5Ik4w>@CAo; z{bC3gkCV@XXP|U`VnFfyW7#QwKwu)oTD4vcl;0Z?9oM*yWSZMdvu-#vy1@g%GjBps zK6dh&0~WSBd~zvW3&&04WJJu@_rGW`LPc;A6|gC8O=X!1+c>1>y~i;8^sHb)*^%;E zKnj#yqNX;^%PvqCH-?hss<<(fY*tw1r`9GK8yk5I<&?wuv!`hOOt!*YXW+I9mp{K; zD35#V@r8`1hGM;BTH@jqV>Sck88x;<&rsM-P4%c-%`d$T`r6oM&F@X7x^pzvzO@Ne%WP^EW0o%xUAeqKMuC zHGmeGX$+$@6;sS$#H>~zwlMK9X;fF_KHbtbiAe865BV+e2D-@4L^&rzgSfM)lAhofaSa|DJ8pp6V*Ove8&Rx)m8r z6kOmWw>-Z)CgCr}n!0BvIBCra2c94SwW>dQvF>vu=mk~mBrY?HN@~|Y4jN2-#{EIn zev-8kv%=3PR%~q2b3wz~@$v0&UFvhSg|(QjIq%13A>LDix(qPPGUc_dSy;ouja4J`fz(?*yteq5hW@U^GA4v-SCCri z0Y`EL6xJqt1!{E#ITOyKKv{dJj=!U6jkgw136m}-i|}F{3DK-~uEV_5^T9TIEq3il zNIKS1v#5KA*WF zae(DUCLu4=D{E40jIEAT#PYe;=vP`nDt!x(E?zAX9fCBFB-6G zcj|7i2=^G5`H@}SR>{7usdaIZgqZS0jv>$eH_T>#JwU-9;lVR9kcBFE%kqnY`q6n5 zRGv3)Xl9jS$y;*hpR23tDOIhGA@m9u&c;GqurBE%s4-DU;|R-EZ;CSD8JQ_o*xFqz z)$;7ssSx0v>R*!XiZ*z{Gw}Pn7y0|h@U{5;wfyc1(|bI#UVi(+WAOV^`Q0r%3co*+ z-`#Nx7tj1merLj~UFXMm$uSOKowgMTm~Hz$sce;ci zG_@<6iZbn4rX3Qr1a}az?eHs)s%x!_TQ_S2$%|W^@6(0XolEtHfCLRqRaE>UxC*$U z`&whJitcOA_H&kM3zN)I-gzaEVLcvjUIme$k@O*WwLqDoR+*?X>{|H=l5^$gwN_m$ zwXQPNECf{>H=OE|?+wOhr}a`x&!Gs{KtT__5nQky znQ!*N0eGXzM+OeKDxtQScq5^Px647|8E331ZpRZ?L^9u~(ow1oyEzy6Oi4_eF(p3B z&v~i#Y-u)HeN&ii&W;?%HaD3^fH$?}B(q5_v&m+)F%Vhz0s0SkkBFSGj0#0vzzX51 z)>#~Y(OK_3uSMiV-2ruv>jE7kCobbzz3QV2;JvNRO9()bC(RX#>ljm>bR+5Wf*x!H?LP@(KYrC)lmUuFrpL;r}}_|0CGZIjv~(gn0l>34az0;L)pVos?q-7FmL!<+RWQGV%0s z;JFvgRo|kmQi5|`z)@n5St7?#VlGR(fD(FMyXhf=chQq8;n`|CRu+JB!|O7ae^47efCa$^jDvbtcRgHNjB%b?#JrcVLl*o33(nRu zSV43L-eSOW@sJFNhc0|FGT{OrO4BL|%3%@|>xI34gt<&-Z6#SHkj9ELSZai)HUlz( zUz!ba}#_r<@N+#iK`YI^(&I5ov$ zifXL=vmhuwWC~1jsy;-KaV}#t1^XlEu38sw3&@&+R!yC-NfKy$Xp~SZ38E>v3Q3mu zrzD_&E@3rQ`%!b9GF4-KO-QMctsxu|Iq9McVt6FcBkJ`?YliL~E$kZZ5-s$Fv!jJ* zZ`){L_i$#kFf#(51guvtg})$+CORX`AKpjDLJrVhhU;!%Z|bcCESZK8Ta4|WY789j)Ih0%lE!dcOS-NUV;2Q&FT zyZ92+tHod^S2Rn-IWFj_<5?7XDI?O!%<(DsioULUSSPscgzwFSDxJ_O($OrTkN}|% zdJ>a?DJ?RK~JNy`rToCpvTAZmi zjzj@22RDF+)^gBwH|wuer=Z8{=;@7xYU57s5gkT;4kJH@k)OlJ&tc>zmw+C1<96I% zyA_3_!!jcM8E_{4SdNQz#|Nb^Upj`E0ABVT=(lkTefS`yk> zCi!=RCQnuYZt>*N&uP=CRY!x`I&Sr%!`h+%wU&CsDnR3&JWB;S24O_Az>lo@7AcSw z>7!SsSL*`datr(8=3;s|GABmk-QY-HnRO)|SfQCa-`5V?AAIbwH$^vX za(oZv_#P_bdnm{E(9Fn0*{z8i$aHA0CEa+SjCBHuix0UBf7H>%V6N=*T?HAU`bwGe zD4nyT&RNKuyGAf44sQO5G-GAm?d0Lmj0KS_9JVOT001UtMu)mJAOT_lxGFldRip!i zVWdZm(Rt2~4o$;u6{WnriqT!21Ycr^G?Zs^r!th%CfN98V~kyNZ@&CDXu*@h)A0{F zc-jlyFXd=Yund6XC{=JWfz+Qj5Z79Z{%7Mw&%ytsi>!4{3F&?v&2MV5V1!zAWf^AN z6?m+(6HaMjh_Ah3lN-)}*&btUB3pN#K9!G`vIW*!3>v^!6C3F{VH6Mg_9c&`a zo!;<4Xwn`wA{4Df_=WZ#!(b#)9n|yEXF*&$Vki(QEjY8ovq2P>^)4k;7-86S^PhO; zBPebvwry(J5FX{?C?9L?e}}jPyH1A$gHm+O$%&7{In^g@Oqp&>Y#LOOPzvxhdJ?V4d&EF$T!V?LTI2eQ#`QFD6z?q*K;c)X0tJZ4!GV{I`Xh-Y zrm^(YSURzb4&kg#(_*)mG~~)7W_Ek_VLn)Lk1qY~W6~Z!X;_ZZ(jL9QNkNgPUc%|R zjp8$+cvz!&RHOI?e^iA71&`633sJjGXR-?lxN6oBVe+t1SEGR*9*dls=D_g=7GOM- zDE(}(uD|KJPSSPV$hwX|T{1o$OINJqQssIEj|9+>l{xT8azm;*iBx5-y2qiHZX0gv zrRD|v z)P78uVPIFIXgpwIy&0yedR4GlxQc7x23^Y+=?Xr-+tJuZI1<6-dxj<}O4V}Cc`O_h z`N^|rKaE9q!9khllv2m-x{hhiI!-g|7?7-^kv0~?T5`G!pGTRv{=`2TmTcIvDnxQIpR*-cb~#!Zg7UA^K*iH@*rZ!fjGX) z^f#33kj+dVqQ61fkTdSW_lf%3kMF-R{V4sNi|=%%x7Xi!(nhiK@=R+Bq1cKip=zB5 z=?Psjs<$-A`CP>F8syh3ix2wgNz`$_2Ie}j-Ks&3YSj${F|ekrW6_5%YlL6`f$e`i)F9RfbfiXMuAG1(Tb-Xo@iB96sRy~MlWiDJ;0FZO1mH@C zNAEnC0IujuhT^3VPRb$v8qHthj4!48Sf;R!8ednayHPI0t1a05N~3?8{WSC4)TqKs z2z+fDE99>+NEVzhdwF>|3+z^J(0R;Q<6U%6g*R#SX4Yg%2VQ}gCA;j6stB(HnDsqF zgz2o0*DtMZ^2VQqE@#rVpWwu2)avupxmSu$o}5e;7yMo^jyYB%hf#we4x!IH@eXP- z&yt=fZdu?SzaNv`(}l^VKkawe+vH|iy}EWQV!z}4*0 zOpP;~*zPcE9P26QUilVk%$6D>&ODPHHDf1Z3uRA^2U>~aY-f5sHNZ6)dYu9f$ z*+wvqONs^LqrwMTrVk<0SEYsF4<`$@H({W%JMRu4m(+ftNeCh=*QOatMW{Q;N^Eb3 zuqYjSIG{})&61M4Hx@Rzl4PsAzu8)uqB?+Xy3#gWl zGFv{5b7KAWG<~$P{!~rHSU-A=Y|9l2S~>H+ioBMb69kE-F9&Blx{#lRzCoQjYyrn-I`04>r~+nu8yUro zX-Biooq$Q_$x?K(XZO2`3y!bc3_KoL8#wTkJMma5=NOZywKxFLsOB)6FvCNVHUgEt zNbEq>!--0C316usJAT7{m_+}IHI85j;?{@1@;hMB7q1;yKEn)bH;gJ_PJxM~i`-dR z6Ed3EHh3Y2_)oW}4B`TYzY^ZvLH(?w1AoMc-|B@zv%#O|Q*7ZFFFbx^6XzHB(g1Z2 zco5LX3f_-IAgqwyfo&(Ky)qn?WIHRd&PRBBq~&b)>CP7Zdn0i3xX)Wny~`t; z)^beM-ae+HHR?C0>?P;IR|3$*(aA z@QR5Tbzvhcq80u^6vW!df2(6{wB_VOFp5YZqxIjza(${M#Od83rlBzDxIoj9rs*gm z9a~P6X29>tZblnvMhCkY1EYnlalTgAKHM)_=neOY7G^IHoPOfGSmS*0c4=D{ao$Co zrYbnvZkr#ZUpZH=V|#;R);c!8B46j(&G51r7ewLl?zL9<T? zXvY;V$--HfmuF$wVi&p{+J4DjG*w+SRjpXX{{GTZcyP@oqQxT*z$qnH=r^-vu`1oN6C5o&i6zp}GTvORSEr!~i6OdfHo{tB z!utkQgZ>^u|2xp?ORmvXU#P1-l86dWwU%KjRqtKpF#chA=C{^a&3jG7t zVg19WUeZ7O>RJ6GS3RzO20h?o$91*Awi#|fF2}hWeVsy zf?i4iJx|bM7HEv|>(T%rw-W*jI&ai8cK-j>_-yG2X1bD@3_REHSqKk&HaZtzDV6H| zCr=nGEoISuQWOjPZED1~x~-FN{0*x}vz~o_jO-hP=rDP{AB!jQ{C|aPBq>{vME0C) zB>ykSMkJA4_J5)598$K2_dm60dH*kz39{#s$X2gEJf7`jZq&N#8@|+3HtV>Os%oU@e^oePHV4J;pZs}Ok=zmz@f^!pG=rdvQ$S&YMx}tJ5;QOcR8P<`HmFG_|IG9>rt3l9^GME8hc%x_(KU#f zY!=1 zcFAjt>YQZJ8;)+NC}|Tn)njZz2%;Z|>W~7uiJ*g6S|wX>BSFdrHEF@6Okc}%&E4-z z1%DXYL5jwcMW0*O5_g-_I)SyGmn?ei;nylfyC#dCdib?o#9F^bpPFs8l>cG0Rf;~9 zEc(`mEwza0-Fj9l)mJ5WYz+Rm&`zzD?%La2RZtqIV>VE_}ZQ`b71;#ELFu zZkxj|6LeMzh(5n6-v*H<_EO5=N(!q)m+Hz4B1z3JsK>ySYH26t{PB3?ti>-ja2z}> zB&j2lK5jP2$E3y0Cdtjl$C^!&tB`Y>O_Ez2<;^B}S=U+3CUsy^Ub9KCVPU($%jqX&RHP@qZ5?mlNWcH&+r^>HtdN zy9qtbDlDMo1RZOGnhcc5OwVAtmf@ZswIqnm7hT)OF8cjDEfuAfc!d=`!rUUmO|ZSn z^jnhH?mc|vEJcSUi(c}Fg#3#Y9bpk7GM!D(p&Zawi(hPzh&u*?hbee0)n>jhwGE*k z5NeOde-iYc6wr$VEwn&VQ4fOPYK0nnrUl>`f?#fP;Ch;%8&W`jBWQdIh@`5L6wm^K zPD=r;BIwu@(1iqLTOjJX3kW%MY_gREUQA$}6G+W4j?hmCWecQHMFcIkLC7?gkbgRg z3fGP%^dUlRuHnO_=B0qr3A!l-#PdCMSqcc69rB+7I*OnI3&a+ni7s_KAf<&!!;BWRD`q*g%d3EGkZ`kbJ37KjzxK*&-;tO}a2 z?Q&*$lvy;#UwgNuu5Z5R#AMOgt6L~aQm$h?r!sSkq+~Knb`oFT!zV?GeujmH*@~Z6 zwLpsS?gdu#59YQ9{8I$omjYTt(A*RdmgsmvA_bH|&?PCL`w0rAfc`X~5KFoenj;A%NJRd&_Zd5g&2~;Gsz? zLUDH$9N#lS-bJ1BLTOl{yFYJOF?T=FPTz#sP z_@D))-}x|kb5r>!T+ z#UU|vj>q^#w+7C2t8vz?l{dqN#7;*`ew}UkxJ>TIvle5%53lEUT|xW#(Atb!-g6fPEY}RzDK={VeILPp)+I)dO8{t%hFc%VgrNgS!e2 z?2CoK>r^y51-dZ@B-9c^<^#DP*yp;iW6bF+wK z(IkgRWC#2t2l8LX@zF05b^nOEg7-1gz+(d=&m0E z*)scwQX`STrHo<xOWXgo;;a4Bh~whW{bZRB5aPOjV#3OT)i1QIy8>fd8q| z5Y>=b$*fTCdx~-pZag;D6-$vt%iH!h3Aaa9O;6~$`OG_phV^N&eI{GSkFNDW}Pz{ug2cM-l zculm`lzl2$=uz7E-B`{K!_;d`Pu{wI2A@#=rdO1@2<9HTT+zw&6m(A+qsro)ukktL z_Kc#Y+&&*L<;_ZRd&FhJ?ZJQ_Cby4ZR&YBMKk6ko0;BSKfu(d8wR z5c0MEs;a_MB5mpAG8Msx5*Jq$o~=Juy@t=Tyh}OD4aQAsb$~4eF3J2BC`_EFQy+K@ zsb8C^-9nV(oj%lS%06-5iR`Se*3E?l;s@3sHY+KaHyxgR*2_rTBwm4>WyUUf6Yv8} z#*wcW7eg^1KKrHQXrEzCIhqcbdaG@cqd!j&j&2`%*c@HPtg)W! zLa}SjsYeSZs0_D9ck*r8y=w1&#Gj%(IxEL@b1A^V{)qoLIBf<(CgJ*De9-=|sH0ad zb*Q6o2QadinPJon$*{ngVGJ_J7_R;h+8^T^!y3=Kt#$>X4e4{}5%e~++>#BDE>!Uh zt3bpb{81O7&EBO98gfc>-w5w**P*=Aa^95ekvq_dvR=J##px7+-lfp2zR zR*^gpyH^!1k-n?D6bXUY*j$X$tiJ1`KeQ76dD<+hj;La&f;w07!VSfqZJVW$e#B4G+EfD<_>)Va$4f`t= z%vqQo$=tKb6CO*Sc76VL7v%&uIH=u@#N4x_Li42d2I0xfo4}J(@ zbS2#Q*AwWA$0#=UUAZUN$5ZSLZq^cp7={vgHa;?~a8%Zu4CDXf?5@M3y1KT3L(pOg zlA;3?ch|x|fB?bWN^$oB3GTttFt}R_6f4kDibHWJPzn@jafbr|0>%Bi*S^m=Yue|% z-uJn_f6DZ?_gQ;wIWlK5XR0TA`i~)e$0tCU2g6O4#~YZlBX$m7{199z?ZcBp%mvbc zGXJ?mmcXnpH>h@Wt;ASa72?aUZuq=!@Pu>@{jc#pe0)&_mskby%q<+XGRWWD zV&6oiyKbdrsDx+0`MeiFRxr{I!-M)pl_`eNmhVn9_*vfL$b(zQ;}7~7xQ}d;i}mV8 z;H@v}m0so4Ywgynj(U6!(L=n#DZXmio;eZ+PWjP(S8dP2KTqZOv++t%FDpfz!~5bi zWd|k>oLm#{Y|Vvi6YK~Wf80NK5gHT}H+(>7*%Cn!NpPi>rflt?_~BpH=x`N%M6FCM z!}i{cH>!5Lpn%%ZIqP8pLd~Pz;-HfC6`6Pz8j z;uY+0=KJ9H_T$~8@b?5(a}T+d@rqueB~!i6!MYRc#21m>>p;e%r5nxtEE58 zDiolrr9FOJ0i)d#{$H+^BB+Wx`6uOXK%e1&QYr4C!NvWO994T?P(Tf2g&#+g=iSBO zZd$gf-){O2yHC}4_(q=`g0jZN0Wq{}M9^@osfZw40;eh4B+c-6QBBgwkJIKz93DTi zPP!0zoio099e~ID7HA%UhY3_Q-7g!~9M!{`3x`Bx6y~pbV1PpMn1J>3pho>XCScs~ z`ts|Le7b;q*}S0K0>N!1ysawNF9P3gMe?}HIgWz|emW0tUd(LRPt3lA-#wM9=!gQ5 zckq`xu~tr0Fma27C*iau!vRBnhZ0v}4a_M#!uy{CgqsPWc$B)YWFk4PL?=imGvOS^ zE@ICxtLEMwIg3a4%32j)-MIIiTp-ApgoJnfzXLzQ@zRM9Nt(P{t9j+cm)eexg<__gM>__PFas2d=JCsv#FfhG|8T23RKF0b* zZ|!?@&F%Mfcs|Ws`PI9!!xN9F=r?g#7yA;|C|f7UoGue#U2iXn9TZczwwpOM$ge0^ zZ9l&MD4PaO*^KC1IsdxK@H=}xw|>UL!@D%|wp{*39v2o#<=bI3aPe>?;`#2Z7!9i> zg36O_JG>3^l^y@9sdOJpEUAMRI9{?tEQ7zCT{Jh>+&e&%;qMf zeO!w|XQEo<(WY*gx7g;}bG##oP0SGa8oQEb~XGJ zdV1_?^206+f^}ndo+`GEfE8`(?vUw-GB zZ;%6rEfgnD*9=?8(Ad4iLk{sjc;D=Q@rQ2%hRZv1{FHPZoR9ECm83{So=+l=O*w4I zH`?T;P*#jW;Mk4$u*SUQni!fR3oZ^Lz3Geo=fU>{{!qgD>D_zxUdHWuSf@Vk75IO7 z@ckK8Ye$#IdqMt|Mc~*`$X#}a+GX=ZU=HLSrmy6#F7jormu9xCDRFq-sa>{fP(&@< zhD&GNUt@n63kOQMEq4L`kDGTjqV`~=I6=nw2dRl5atT>kh7}i4pPS+3Z-|eoBae!b z-w($nQ^|JN4C7s+zTZBW3|pII?#+|4YjmF=9B|F@l)JCESQt{H1HMg#BSO}&=# z9=HqVy3pukL6x>vMK53M4Twk`^(!w&s;1vlDe_u_N|Af=SHgY!8hBijOh;nI`BLKG z`8@GMqC@w^m&1lVFjqSJ4a@*6=$OxB^E$G*UFD>Il}4z-_rJ|$iFH8M_({5haga4G zN0F)byQr+edA zu|q^D{%rc~)h4EF@TDAh@XRg$ZJNt2iG=D)BQ>~fw}{MmzNmSYrt^K58@S11J-}+X zmlJhx+aXT*2z;rfd=2M2EeX+)CeD}?z#DmYVZM;9D4EnMUU(a`2nj}@mu}b%dP`<6sYR-Q3Wq)ad zPPmoZNag0JTqC+kRum@pFO>CvuN))wkHF6WVtPXGM_Tve;wXjhRmk&5>iIXF5*x@c zeuC9;FMu0{Mtp|YxWuS~-M{4ej(&~bz|`Kmh>l}S8U>D9g;#RY#Uk0=Qify0YlOo& zP#$w04?n_)?IZoSUyAKx@SyJ}+wp$Y{Zdj-RI#edsRHV(kX)BlKsE7|Nf87?EN40@g^KUt(6Wv#4Wg0IQ2`Q zBogS%D@oD*nI60)lfzoq#1WNwipge9F=04P@F=&~f4Q#4GL3N$fNT7VCZouCsQMaQ zO9ja>dt7aEYQoXS>W6!_&UxDZ>!o~$Yt_M*pKeYI zZv~^`;a7|0X@~e3@G9mp*BQ*cVE0jl_*mMCCmoEGuOG>0!|tC9;$2A8Q+`TS1z{&P zFCY!!m&?22=@m_IV;G-Ajr#*PQq9LvRfA%J@Us~_ejW}n=ly?uRYy*)=JUhZ?VZC@ zo)_;wM)$|VfxOdPOJgiCY_e-{VE&JR!^1&w(v>H<-~rlr8G$Euyz+YxbugbEDizY1 zmv#mDvjlmDAnw?{wASH9YfOE72po~r>@SPt|3geX^L$HOsN3Pq=U)*Rn#cIv9DEBG zaq+!>`E^@~E59{12%pHk#1#={<$oGU`;nu0(G9s`!u2oya7&&xA%6|y9JPLy#as%@ zma}S}bNWe`58pD&8&9USs{L5ie?BtkpH~RD^gn)rR{Sf6x;*$7pCibLOFqv@ zS0ga=u(X`cT)32%=R}kbun*ed`1}mN`DZ>K$zx6YJ8m3v$TT|%K1$uP#)vMFu?xK%=iVX~*7Yk)IL|2@#lrp(Y1}PmJVHNZ%b3oH8R}P3 z;Mse|jH!(hoU6<>s98HYD?dElj;@+*@t15dx$S$8Zx&$QL!M(HBKK5oJ2i3d(bUC( z5KpHtJsDR@*0a1DmT5D6tsON8(|`k%d&t83_K)(@OyMQvah>Vp0z5y@Wq8jkPgcPv z*;ZG~mRT!(OfyxT%_GjTyw7WtOGDUu{_|+(tmyEHVbN`H@acmiP4#pbD}16-oktqn zt;K<;2aZS&*4OymOZk=`09Rr7wRgPn;T=QsM-Fbx{APzYm+hBuyxD#j7lSxs z^!^gF>+@!6jnT^X_xq1lUuWNTw=5F4xq5-}?PZOgbS^B?jv86uRCr4K_mA+TrY2sV zj^Iy+Jk?(fVWSOj`;{g_>T5p_XhDb zo~HNLy`Fe2mGViYHu696dx&-MB5-pLxdECh=YQ@7@nF`j$GRK*UB&DMF**K=-5~0I z;AUJ;1n-i{(aH9OZAH@`(O{ggvX#=|d$xn+SGuISQ!tQI)-rL4B01*+ouGjQw+{Ex(nw3^^Er6h9s5IFWB zFf4K~4$U=RR?6`L%|%qgm&kF{#;?o|P3Nu{`*G4%H>r=GTEhb%uHf7llS#(&0+y*< zI^pm(ZiA_C)fy{*@_>Uoe*DG!UD1D>E$v_Bn1%O+FYwK7{n0hNAst{&CRQ1&B;3W- z-@wQXFi-rz&X~Zw0mM_o{&|2m?@6NvCgyGY^fzQr=^uov^Avc=KOzo`9%%nE=bP&& z<{9YKemocTP<6R6*T#IDfj70~M#;%Cfh9jp>bwQM_ph(sVjsd9nvWrWQ9U3eaNJZG z{CWW)qwqZ3Ci4C`a%5Zci(4bxS_={97nGyTpg%I(X2ASUrPc)5f5XEjj9-c`HYa0cAhxl*>T#1*?4y{x6wbii;E{k! z!dzJ(2cLIiUb&s=IDYUne~k`j zaPf)@ReWlTX7Kk!cv5;RGng&qH)$ds;SVuF%XTU=@~pF2eRs2ve{PoRKR2uIY=%4S zSPEHdbhw12aJj2B+U!4}m%Ado{EbuOu!C3-=I47jbCKRra!ThfMIOvt@-G}Iu~pv?nPq!4O5n(br63mo^1$S< zs07*MyzhAkj`RjgQxUW5eFP8cmT%VKLEYx(W5Uh%j`LKK&)A;hV>Vy;<6mKMTUFAd z85|A{hjf+2eke}7(1~s1)sE_lPb9y>)!#n(cpy5#^ok}8>%l!NK;O_j+vWCcSait^ z6|gFw+%*{D;3C0Gg4i8)nd8l0`bvi%j#FEAx|bW&W3>i=55F#lz((pTkVf zWoks>Pidajh{AW|k5!F2w7ZPt9W8%!5OwfSoB+ue-)g|QTXG(hr|Q@j5h-ikM<8I+$GcW1R3)DQ2wPxjh_`N2c7J;~%`7AY!48=fz_IROcrp3wsld%c<5_EvirHCf;SeH! zg5s@!7C9&j?n-;Ta4dWn@jDJywWIFiEeak^)HZ13S~*}iAJ#dy%CXbE3zfUC_?sJ? z^YK@^=GlOOp%{Sh9ErysiO5}*H>&T1VOO)-W5({uNnXYdyPDNNV6}m_qh7}yfwvMo z@su1@E`E5Ckg*SOmm3EXc~o;wnQn~Xa6pJa8XJ0=b1IJC$L!xa#@i_zfa{yjYrj0u zRYH}NBmO_*oxQ_&1)X>YY`{$%oTCx%r2JYm{zNHq*Z~}{*E?rB`}*AdlP>uc?x?32 z_Ne1k)Njr&-}aX$L|AcOAz-;zpKrKu!ecK|SZJ_Lme&B~-xNr@^BNrQSkw z!jQY`5yk#lBYkt$7@{?TVm`s_%lq{hUO(ZntL|S&9ZrB# zl7-J3Gv<=QyY(|U$pqspbhiwS@`L4~EGoe=XiP@ne7wMJU^TogE*%XVCm)IIHYb~N zspP=8|4>N0PqCstnm-V(k{EBu0wOX3Iu(-QD*T|(l0Vxq7Zl}CA)cu)xT$}IrcQ+n zs1O(1=cp@tSn$w%_$M$F2Y>t~ot&#sPtH{dCE==)FqWBvPf7!em|pZ~jt-p9Djkqr z*@|;h`hb__VYl|LGrPl>Q7&^5n`hKdwSP!aE{3qqt7nxx3MV$XWcsa1K%8v}kbwL1 zr1+6j{ysAQmIarj;T3qTRvQ1{-cJ!Zw~xXRD>vuDTc;rQWBFp36+5cY$D~W`*Cj8%nnJd0X@0lzz*BP*W^W>G0_13|M|JHN4kr$O< zD++Op`bqvV-Ie=Kk=|AAHr@N0ZPLp&d%4XdZZqy*+YEEJ*~(+`?ef^h$8Fkjn->4t zroOw)`zfZKpJbaB+@=J#Dfq8#a=6<(sb#hqF5BefHi@}S+<$HJDzh^Ni}?;#9_D8~ zF}E5MTtXqn;H>=PHwM4C+a$7>;)VAbRW5Es*RZI|*qOeUJK5$vBM!Y)vf^|i+k{}LaGOV0 zak7paUPOK~GJ1Fs>%u&q*nQs5%Q|(AqK^EDR(P7|2>i5zcR>TEWIalFcfTpxmSxFz z_3}4lxL)!$FOCD=zKe3}?I8MJRQ}>P>YRKe7IZ}pjh^a|?fA+VW~k)pVp4k53cM6I zj&pUtTg>MzgKE}G#6ggrPLQkCvCBs0t8AnEs6NOBtoo zhVp|-9m*w@a+D^L7fNlFHIyML z^C+uSCQ!~%O&o!`0LXM zY0;A(ubpJF*vYhHGW8im(kslcBUEITu}IdcB&A$Xd2RX|oLIhe$7Jq8oYsCSWJV?x zO09c;nvuzj*G}_gM&=76o|Ij64SVcH zTcA-Vkx!Us0IFG)m`o|WwpU0n!**2REC)|ldBXABqjHt`jr3_SQN?EQFN;$1kj1sq}8#ybbuu2L_E0uQ~RookLa=uU5 zrt%l%uF4@wa4)l!jK)Sv6_urwzA95G->8hB99OYt`K`(qtdqC5+g2E*nMx_jIF%ff zpH)&(t~(NI#eq1h>}WoO_jzMbY6YAzi|{30JH>0H7>n>OzQ=({&(y~xBeH|bpr*=d z${>|Flob@S{*8EcLYyTRW;ZbwO<>7wlOp>jWI+_kAa`TyS2VJhk$>CiF1h@aH(Dn> zCC^uG&WR{ZRi2wJ2OrQlHz|LsoT9YVt#(r;tE{8!R9Qf|uM$Q1OCt}YB<$;E*ojg? zr4gmQN+rrvmBN%=Djv!Mm86vU+WKpb>aQyHEWhAZGV*6xCr3Y%p~!y9AKXgj^e0M) zQwJZr8}T%SI7g56c_hMBYw;;vdv(Qp-s-4kjfZ1_4P_9i`31wSRtcm0sZxqEPP>qU z@>J`jqI}lh9ppHaDZ14oe2*5bd$rCbN)MHzlzA#!DTh^7P@b#Iq+}0wTOUJdpz;-E zBt?d_wGq!O$o7i7e)}vp2e8#i9l+#b_!ECrv#P?;g*Q9gJt95BuF{4QQO>D6=dj1u zp}0vYrgDmMO}E-jsjGF?QHH53pxoE3q9}8<&Opi`l}?mrx>X~}4Xsm&67-AP)54Sw zx|N4gAi^E?q?8Q0)oYGen95yBDc$NUrK8Gz%5;^VC?Oi>8%l2#A7!D+P|DXDryFIf zN;AqG6?>LvYMkP%6EMK->1UK8DuI;ND(_F2)iOyXhB8DWpQo%+IZTw)~QeVM(b3d z99Jnod8?9v(oN$erp!@!!MQl7a*Og*B=`Ws%0gX6`CDZgrLAr?k}_GP7v-I9)sm7AU&FQsxdx>< zMLJd5h^IHixte^FgFiQD0k+#otAvUn8`w%apY$$0!$6 zwowufb2D5?DWx)t(orRnGF_!FWsgc5$|IFJluX0jw#rdzs^p~%Qb|i$p^|`dM&&6- zBVdFZ*`DPhDkoT{waPD)Nh)h7+bJ^6^C*_e1j?r)O{p3uhO3KM5R6@OQf5O%ra)P4n>kF0C8G-kEk7c;Q$Y5f{HEavm>K{e~+ zev|FSZSJ-8X^zqj4Z9cO#Ea&(4`kc@*w*p>e!hk=vyO8|U?gMKRq18K(-Go?C}OAD z(=Ti$hHZjsR%3>ZVh|aVJPf-<z%)$wBGwNUW90h$jl- zb?kcJ*ru0&oL|H(QI728$9Er8M8u46( zIH&dec0OI0&m}3cFXw{nd}=eFxRcy`vNCdEl@ydko7~BI$MHF)a-ULGxB826SL+<2 zG|@U6De-ivETt4xnM!G+GJ;Y^8M&Y(D;C<~`i6XcdYi@+}l$-sdrn>;hXk@`qJcP@b#Iq-3A$&dwN0 z1ByiciZap>-2bAiQ{gOo_CuUY{XjeCTFiNm6xnOzS!(87ggM`49LYI8Bd69m{Ttsd zLcc1hT%*M5R=-nPX`P*vq*L5}eNP#zb>>oXYn}0wSz0HYvR|b=<%vptN*0Y%fs$NT zQ~^pkt&@S$O(iiUt#0*#<5N||p5^|!)gP?WPV4NUOwl?&P=;%rg_JcaUsL9BE1CB} zl*6ne2fEIbO-`Lyt1-lx)y%0d*go%Wlv+)9$gFve;k9$)7*4zDf;B zy6J9Pr76`^a#F%oQd5?y#HE~6iRFlWP`OMgFvD%@808CBD=C{*W>IdbL{d`C zbR+krgs8Nk^j4`uS*T*q@==w%tn*4GEhX11x2*(}#uQm{Pq&+uFh=D%WxdJ?Bc4ML zXDv<-l$iMZd#kR`5n?{?7F4q~!*NuJVGybLHN&Q#?ItsbQeCApB|@b!Wf?^hu1qQdXs*3Plz$wOu}y%RuVo>S*3LjQ$C&Jc3~4G zRAm`ugKjmA(pKw?q)etrr+Pu0+)FdhxhS>zY>})y-{G}WoX+lAV^b7-M8oD`*q17w zQgY696OK=5r1Ce1Vl+jPxn{&O2jVokEIG&X>Sl9(oat9I5k+z|JAfk0_%@9^myz$P zjHd+8bMpzOR8eV9=}VEw^(o(|RG=JJDL{GaNUW8?h$rQI^uqqDugl5Ui}Xm<>Ddu6 zpEm&2thnq#DZIAtxt--8=h)z`ll_#2TIVOqD3xz0KdAU9msEyQk}PoB>P9J}(u~qs zr7C5nN^#0QmCq=TRRSrCe{y^Ao;^*r&}}`2^0~@+$|~LJFr}&1*+dzuvW&7pWg6w0 z%1BCzMQ-c8DCH@#2wNKQG=w-)l{u-@$2+5qI(tn`1rF4(pE7Jt?LvIY z3~lJ|O=cHcEe+Z0WK$A0^yFu=+E+-CePuNtMY1N(p$Kgq)3&}hae`l~%%$XB>~?cJ zrHM*7B~qn5+ zPvr;7aFvCWH7Z|I&Z`WfBwFG|?o27E(wNeLA|r3l@-#B zPT&Vq6x@M9q@ghkJ5A*)%5Ig`l!p{)y0%}_pR(zfD7EUc>3GYu>6eMv_u_0i4~p!g zSt5pQs`8xUFqR?>-K1<#IpsHo3naGByA!3>>Gh`9zv8v?c6FHD^j1?8{BWInz?sCb z7a3N@VF=}uAKW@!DWz4KQf}*3p_E2irx<0lN>)m&Zk2-K`OY1RcO0Br6zTYVh%lqm`xuVI%n>_(Ltlp89eDM8CkGSYM(Bc5Ck=MYrP zZlX7uaGK4`tkR;I)s#)wVh~9tAHxn-Nk>_!l8`b>=j9n^YQNUGLHSARoTOaUI=d*z zSGeQ3mQqe-KBb$=M9LhM0hEI(9Vt&$8dBP6J|UFAm2T^WC|;FJlpZQcDDx;X?5{Yp zKSG=#-VvWO`*NKQ`${pN_ghr6uEKHLIHO^I=0pUna+6s?DWWoka%HVq>eBRZN^RB= z=|LHy(gNb-m7O_^MXA-&{b^8*m_zt;SAnkG2H)0HS6OV({%V6_n>r|L%LLD zFXbc~l0p8FvPn4K zk$JJ_w>RZIMVkK7h$rMavDbNpb|itrt+AR zzMCR(u23GT{6@*R)L%v%WqzQfvPzvnpQUwNusWE8#QcdhP|N@S0w5xCL;NdCLb%7^HPETD+ynw^i(-UnXe+Vj3B?NtfXxI z-aUHEqTFH~=~Sc<&l`x-fok{}KWTK#O6^oJG5lRJs#)FPXei5icl0VSY#o&Xl%Xma zD63TxQ~p$W!Qo2qlZh?E8jD{n=3TE8Dc(fGE}pU!I54FgGfidVc6a( zKFUIsp_HR4-6*eAWR?***9N!aRVj^Cic`j@d`4NX5=gnC@}5Il8^85wA1GodZ?w*N zN}iwH)(=yfs%)Z+Rar*apfZheO=Tn{#YQ)BFG_ipmXz))H7IjcN>dK0S{WoER8;k8p--)?%6 zDGFYqVcRn736;8(_bTNn`M0_wna{83XRl4KOQO^&z@{tVwbS%jDMlYtvgytYB66GK zFjM6;WuMAk%43xuDVevq$t*JBDFJa#j&1Em7cSKys?9ueqM9`pj-CDWa(9<(&al-P zR?@3RiBKs)S*F5S4nCz4#5x~UKCt7*wXFw~jN9GmzCfu#k;(lP;tb*RS7wA8q0~CM z#7u4*yxu;Nf34nMijnY-rYLx<{ZU8mGnIYAkr@(X3H${NZAm3frJzqpYnP)eypP&%q~piEb3K-r^G zk@85TASKf-x2=qnnkt`A2C2N{?5t3^O*x}-ni8lW_QcC*KO+_rMb$Vl<_JDDH~OO zrrc0jLJ8XEMxH{cpfa4&Q>6!GzDf(quPW6kFH}lWa_o28%1&vhl9Dn?<>NP|??0$K zq+FuN&VJE|=WmE}A+-1zcj^m^^f>Uf7=A$!)vSGR9Kq5aaFdzMuvJyYQu?d(qbyNr zOF5xZm-1evJSG1@x2=4X7Aol|6I2pXHmN*YY;wLyk&fS>Jo(lfheb|OK5Cs^5a&oZ z@u?YsPYz)O_AHcWo?yIoin~cMj)coiQSj#|vM(wIGi+CtE|l36X}XCK&sx8L>Fj`w z5zuKQK66-vYF2qRbV|bpG3-Z`51grjhuvfzP+F?UEMqpKRDPvwQQ1tnt@0fu^{*zf zbYZ#?PhN>QCE%!=OeIPYmBN(P6iLqmaoWH8*o;M2lv-JsUN~Mm z#lK21(u>dZ=4sf!I1PtY4pE*{q@j&|gFAu^eMG6Xd7c@Eq{pN8o8!h=X(_Tl&OC-9NiPv2f5|u!`67qnYn3CEttwk6cT|>B(wuaM zYX+sV%4o`0Dt#!6Ra#MgQ>jIHqf(ZV=ak!4Zc0;?V9HpPc$5t)PuTZsDpx5f{%|87 zr<7OOLFultnle{q4&{)_ILb4X{*-K|-L~vmuCG#$bw;RoDQi{oQ!c2arzAe(Mz&|U zl*;qjX2Ewa*DD?WjE!K$~sD>vu;}pC^c20D1%f6QdX#RqMT7_L_}fUFG#G(|1edF6Gld-L}qBLRI!t`lzlze}= zZFQqGS7}BWuTqt=QKdNLhRSD@p!06zKuQIb_cKl3d#c1x=Bu2i{Hk)8@`57AjZKss z7ff3s%P0+1rcp*Y5^Ie#;+YL`4n&pj@fbB?x*in^iTS(}P|fNL$B}slgUA8ubB6t7 zj(hINL-|wdd`d}h(H)BTl+?P_-!n|)N-EbVf!sVuD z9HqQg*-FWM)op79rHRT+N~Fpd%1CK<4>D6R<*-_0J14nwz7(~)*%CO^9LMcD16r;q|E@Y*g&^jq7?^WJ$ zD3a<{_bKUba5jD3Dd?VchFXOxd(J+H)1yhZ%;45Rsdd1o9`5IB;po+9jWEhDLQU3; zmIz}^P0t*>b{fbp#TbY#46>6!M9ML-`x-W{5l@_(y7_~f+&m99$CclEzsRRhBnvA! zBWJ@__PdemoQC=;CnzISexa;YSwp#?GLMq@mb-{2P)eypP&%q~piFlp)@oqHvkKx2 zOB%ah^(X0=#}V^+=b@Ta297a5&LA>e$r$#n${Th(?`^l^7Nr?Q=K7owPcMjb8++aj z4(ZuwZF-y-elHHytY6@0db)<4#;|)-Mp7QB^rB?C<0jLRQd6Y{Wspi~$_ka7lrt)+ zDFJug$Z;t}DALVXGhCi(5NCupTxT~QeXZSGEavl;Mm6gk9NkPh%{_2@&oM8nGM7?a z8yXLBTBy%x4J6t`zgEil`B!XZoJI&`stX{_j3lyCt>PEt={1w;Bnh6MLH00+EQXJq zqem(aDVZ#HlrBU z!1!BGYW*-#;(PYvwNu>8PHBcI3br(C7l!>b#!aRPC6po!$t)w`ekw(ccqT%eCZ1hk zuZy4w$F7O_yn|8AO2?+xF^DXQ2ONisDi{+g-GMROTs|=&8QRz-OuVT+~q9<Yx);2gsCdD&1e;>n^R~bs_uF{P%mm+;^25~y^8RIWS zsnx>7_xym@PH}*pQUx}BTEnJd*tpN#Wa3Z?t32Y!w4zAUmmp5;73WRYx}em$GDf=Q z>5tb=@dPQxA!xrT3ZAQB=P>Lc4Li<==aOu0f7v3;-h3=JcS4q6i^oyT>dCNiU%2^) zFl=F!LX=i2nJCdJNhsS?UU97Ms@$OjzjWI=L&+ZH?(h33MYYa)N*k5M6rai@$_|ww zlzS>&DQRE1tv97qRSBi^S1CqWqLP(zf+Dk-!ieWK#2MmKe{$B6kJe%TMGVg;LpAI9 zD6@u>ympg0!ii`;(H)8{lw4Y8IVD`{%%D`(I-@CHQ6#-S5S;18L!9)AAr(1x^)_jE zBK?Ze+LE770-w#1H@T@ht6>*0uaz?e}kCMn-tZo z`y&U|3EPM7soJFwi3>U_|;bwjA@++E- zB3YlmqX;YErna?|kyCzfbDnCiABt=>g3`;8SgWTIPb9=?y|CSS4>aLeMlqi^9M!Bw zY-C_K2SYh|LW8D|DZ>Lj6@S9!$&%h*t^;VOz!%NnY~IM>fl!ZG`uG{Scr z*r5>TdcKQnfUYe=WsJihDYCEUYokbVo5(ne7)L69$=r^q)TFdv{!*t5<*wGrMTyWl zX(-E70w_;(tH+#$EOE`~N#rY(b-LAWlyX{UJEfb-D#{#{*_4ASV<|HZQd9QWKQ;un!e3bM7ZZFbNs;eZVoYk$KapXH_og0)VTF0K{EV`rZVx3;P)mln9 ztuvp}O~sz&IVuBKr<2C%NSUG1kg``Lgfd0r6rx<#I+-X*7HcwQJ!d>^^`10+}0OU>ZnYj z3{@FISxu31Xjdbi-4N$Jc>dqG2X%=s=Z>9HWS={NP$c_oZ4}`gbX_B7W#m4Za|+6P zt@Cbx*(zG=+^3{Z>h|ItX0a0=QzX}me)r)VkN`%pmAHw=iP;BmIsdE`kO)Ipz(wQm^HbbOssVk;v9rl zbK86lS4JmYX=4|LnQL200Jk}^_d7iFEwTFOP0`IJwB+{hCtrBwz{I;nJ| z%us1a*{c#liB%~?@uYOy%0#K9l7uo?<&~MX;FT(OC}&m9P~xR>Bk!XWRasAIqq3Od zQ<+5Bp)!PWPo*m*ZEClzrj)8Gp_KkA#VAWuvQkc{q@cW4dDqYE2Km#Nw#@qqygmC|6Wk z8Sy-WILTzSlljswnPg1nHmX^nOeTG>J9_CDwz^6}N`%U@zNQPyRBljCQ6#;SMm%>R zPBJqNab!;P(UBP`hUW{RnzaRvkxBNcn@lvreom3FgCS15D%>^{rPffht*1U-JHH_qQ3G+n!mQtMK0>6+&W zUOQ*0aZ-%g-)oA3KTYfQdKSZmszg#!X?lGrAu4Ssy;bT^%4?i*lTTFaYj3>-Ed*W79$D-B}1^*u}%$W%HghRY2>+ zP`*$(PnoE4m@-@AY@&Rpb(T^7P?<)FlffO&kw!e9LY(oeyr1JaqNk2$Au*pf5vp08 z;TX?y3?k$CIm33-uz47Eq+i&WeGHr1FYKRUKJQl&HjrVz)37%=dVi>#qQuGQ=D*vB z=TnH2{}{WWT|LZ&T57+dE+~>qoMk9N7s@b>bYUPPcUI{{nW-YPjIH)jBu*vDW0k^` z%$eK_Jw`kwAWnwY_HrmPF~g#MMF&wNk>fJMri>#Qp5^$ARoPG3pz;&t8b#uKLrLLr z^YKBPM4Cw=K5sgdT2s2KSM>9NaP+#iMyTZ%A(%CrN`yM5rl&n#I}NST z-ATyAHmN*gmv5@vprp*~CV$e1CpW}tVuszsiEd`PbNCevLXix@Miik7H5f-)pUB7q zRR&O&Q)H`-l+!8=DRHyd`QRxBl)@^7D6JfcwPcoY$m$PqjvH5Zb67GWF{dBL#C+b4 zsAk1u!gCo!68@6|cu3_S<(bOQlx$f|da~6LN_`cXWemj#mEn}NDm^F{D01j)VZ`$o z;-s6&?n3jfX4oJ46~#r744@Z9Xe-rcZayg)IYi|nd)k{KTRo&KbOhi3q8wE@LV2aK z#fT?GHqCIzE)MeME;`7a#eCk6*w9)GM|#DviT$BzKZb3m(v~tsr7qupZ5T&S=rh2D-HXSW0fnro6K!WW0ljC8w1^Q$6iX%AXk2*wAQT_ zQ3`0CXvz?+GnleUr3>YpN)t-_9BzhHD8*EYQrfCyp-fguPT8sQmZNcB<(?7GT$x`y z-#Mq-?c463aDorTy zbGgY>p%haoN@=T-g)&(sIb|nB5`NoRTKD_`aT4COg9*Rss0n{B=JW1HHR}c(3BS~^ zn@y15oVnffzN0jvNJG;hP77Z$S}T-VGyPf#_48qDWtv8)&s0}JoMTyPJJouAK|XFb zsm_()r5WTm29cvuQYQ9Bf{6x8?@(m?LUN^FjQeI^! zrMpTu%3PIZltU_2DbFY}yu~5T@V?(>M&JWVt&$zg{3gk#^Ls^#F%%h0QE*`t*~g$q z9IjR>mnhLHM=9GV()3m%o)ZvfUWVFDY-z7qbzxR}P|f-VjwRGM+&y;mXV@_+?Izro3G2ke4?P9tfV!+KP+ z>an3)8a6w_rYh);OiD_K%16#ZZ*M^%ncUa80|V_tFr`95l?xD^X;>) zTR0})wKeDLvQlK{Qu7xv#RClCFr``W#9%m2s3b+IoLVd#%%sGF8Q%<;=R3 zmvz=^o&1ywD(NYSi@NzFqLfm3&XMn^a+5M$Km`QbeUNrL~HOGD#&VWxLAjHfGgXDt9TLmT=oTO9@rkPwA)f z6Xjc#Zz#X3_$cpGhEnpCbld7i8T6IAGMiDVX`QN+aFyber7E9MPO1b_KB&BJZTeoI zl-qg?bDVtR`QEsU$qx{{+?Zq@ooYHPvBPoScdQrYqX-WB7r3PiIN@>a= zZ7V0`jMhm_2`FP)m!nNwN)bo!_wTLr=(=r#Il_OAQtL@e86{6Oymk&*^Q9OEsB@+$ zxCeuXe2*YFh|N=(OF2xDBm8*3hU&ASQz*42vZ2d(?KD)>Zm1U<3MlK2UL}StqEeXB zTE#7~+>vOwhvN;mC77-fsrDMh)hl7rG;w@O8cTh7fV4rPkgdBj2X zXq`)xHCpE=rL5N3O6j7qf-*~GCS||M7|Ih{eBRu$0(w$2mbaHFe*c|PLnVwdP^A=Q zxk?U*vxFY~XlCw5lv=r3n91IO*G};XDaOK0YKnrdF^I@jPIC&cJ7mWxr@^IBh0j{G=$gDx3J8 zw0P|l$Na!P=4R978AST{mc8z-a*r}s+L%kW+Q_&spFDbQDYElNPl%cFt;VcJ7Xu@e&XFuym!T}H` zquQ>0S`Ax_pW*P2cZLa9~QWbPS@*G} zg34|(2Pnl=Hc;A8B$;n1Q&c7!@hpcphuQ{q8onl)xtE#GMl~w}j-BNwgGjja5=p#;C-ltXGNUP+U>DOi32%Mm|RQqPu%W*+$8ubyiZEs?4H{Rf(i* zQ0Yqv(a3Emy;bT^cIsB;DEC$JQqom*b52XCrjmdXuJV-Qyp$r-cinGB)_iZ)(pr>S zHyfEfdMjQ#lQ>C=F*U!MqTtIKb|J$it>z~4HKnY|AW9dN&XidyjVb$8DpQ`Q6rp6P z?zWYgQb#2jWvI%V#%6)7R0idZ927I)0bD7rmslT!HDm) zdC(pGpnwd~)oi;T+dGOjP9wx;|ek+62VGxl?Tp>eMhEP^h zq@k`xJiGk@=C=cOK|rUGw9H{Ws#*2e&@By{onceebf+vOB}C;T$F{f1L&`#mBy-Vk ze3q{?Q`7SpubnQ1N-;)h6oUlUa+7b& z#Hy%Nru0=QLit7|Gv&BSGRj+(HypaWwcWNXN;8TK!Z{^m46jLa=JPA1w8~~mCzbCgGgPKi_Nv&k9IMisbv*Ulw!Wm)QmIK9 ztWt)uQY9DVtV$Y6y!vkB07_An$DFS=Dpx2zmER~kRP0&4r?QH5(l&70noX&yGM3U` zr5|O9N?XbamAaJoD&;Bp8@g@fqqI;-N133KkkX{1JMYixnzg!2>)fE6QaMTasIrSv zu#st9*8EyZIYt(lPpP4GCQ=5f44^Dm=}0-P(vT9jvD;P%rLamNN-Ib3`KJ+2e~5Fk zzPglqZpPYr1Un{%&p%PkiU-GTJC{M^aP(&#BZpKDQl6>&Ov%>7oroor`YKZ>BUFY{ z)~fWNTu^C2N!-+pT%A%%r6i@JN_NV0m6Vh{Dj(U?M=B2~nVPw6U8K}hIYJqvvW2oj zWjW=H$_z?Cb2sv6N)d`2X8RcNRD(E&*C2jAn7!DJvPdNp<(Ntm%4?NZ9K-7E+%ddE32y1OeumOP>+GWx)jI1bZB!Oh zd@7SDJ5+{H?x}R8r2W!u-Ja#DDxs{?U!@pjiAq+=36&I-_bTsdn0e3N%Csem@V*gG zC5UrbvTiXK;l1j*2Y6 zilkQy;^Y;~9Garks$+8Sw8v}bI^@M7rd^EbP0+9j8FrJ(voOwBTZQZsyQW~i=q>QG>P=pxq%z-!~63^~(#cJlNY^Gn4 zwUAe3IZ%Yj+NP0TaeVHo+@Wl0?d}n0DDm3a>*TJrk5W`+J*AB!vDRWEo(PDOVLPND zD`ZhslVLx*ti3yiSy`tZMb5=3D8n7W^S>|} zPHKl1m?b>{rPhZ~$-y%NubtwRQjBD7nxf#X3?j0HLwZMLIVDX8d$?k)8Ad$$AkK-n zsU2`S0y>RUW)2xq%^Jdn>M@8kRF`3gtCXj#QOQRs+sd80bd)YC2`RHwo^j0gtK6VW z)5s?&yH$2k9;&RRWbEk9!hFhVjXaT3TI&p;bfU=G?g(+lq|kgbFMUvIb*^IOWhh=d z#eq_c!Kr16g1^Qe$vV9(XX7B z(kh!N3AB&jQ5tC-nPsf%&$P}cN*}G$o3e-^Neq@nW=C(<&B8>wN( z81c;W+q|m1`Dkp8Z^+K}E6Rr=If8X&(JLQmU%Nr}U>tWSM2m z=H4&NaYN)9Wr|Y=&wu3DE{8Z>o;I6fd%U8K(r_`KcQ&e7o8Sn0ltE-Dq8Rp-%0LnG zOGMebo1CpqtkanPD_b?9j8UmXS+7!uO9 zvJOre@vMS4ou4_2oj+MYJ3mSc&tF3|YbzX`KW>LcHzqOcTa_V{ygl6%yHc8|G^LDF z38nn3QjBt)A_-?T;&};i623W;31{(3_=K3xYoVHzhzY-I?w&j@a{iL^a??9PDWkH5 z(phCWWv0pu%089Rl*cN4D4BbkwxkQKAWrVNnP(o9T5Y^Cu$~fl?Gz`ryB2DSf?F_% zES+==J3%EOWs}M?cKoKw4NA&BZZiI}Jb#86w2UaV{wQyf$&J^}+qR)njHb7kqTt#L zA`;E8LsSM+R;hHMoKtB+iT{;53soq^REkpCs>m#3`At?yPT8sQmcw;lb!rYu!iLOH22h4MjVIHf>8x2+zOFH~AkCaP4YY*r~rxuuewlB&NOIVB}T z~IC`2{7y;o}7~4KK3nK+yJH_p#7|UR>DGDx* zBIoa)8Md8DTgnubx|Cli(sX&hrW3O1!zi^XAimS)qp2n(_wKGu3u&McC9 z8q+f3`3P}BtdS5%`)*kcJBMK(OLHgSSZO&T-0m!6*oG?8D5F$HQhreBMY*KXl9FVA z8@UFhj7n)rXO*0knJTF%`zSJWagBKXf;ingFooTW`snn z{()|K-&0ypq@lTfbJ3pBI-t~=Z=!kn;I)%L6+3~EY-py2ZN#wqR4P#(s}!bW9%Pb{ zragX5-<@nak_V+$7B*c1ubrlUm10bBd^SC}k$VdGi<4WOVWrL?N`%Tr$}*Lul)f5g zDrGn8NO~h6PWxd@?+8k*QKij}a~7|i;=FcxolH^i7aF!K!%kGmO*yB@1XI4#I`Jrf zYcfyR@vMX0(Ys2it8$#<))C?)Hr2;*`>m9@Xlv(J6oDeSkopNl*gM8Ejtt;9M&78> zpK?Q`9VKXpyR_<2Do`Y{m(tUbSSvroN$vS0GvfnLY86Bdj$iikVCMF{M!3hp-vex3DU=E-!zn#gdQj%8w4nS-k+!N+ zUN{nKl{Df>HcWGV70sMWATg&Ox5Rwj_t?_nT* zXme0%{a!+Sgr9GQV_1%9gs&O%waOsBn3cJ0yy1vB#BA#c#A~O?>{5)eZNso7P-G`x zoMGFmd`6k75=hxak?y=VgWx#>ahllkHJf->Tzj-u48O~PYSt|{dh}YuZskbk9^odl zg3?4~CMA+0O^<;%ZPsRdA4;vUCcbALUOUAF?UcH)>0KJu%dihLY<>vdI|Yo?%^yW^ ziRNSEkA9I)qe#Xxkdbp>D~zYCv6~#>hAO8hqf~ZNeo$FQxumjyl4O)SI8l@`Dg!B< zRXR~-sx+ePQ>jFGtWubgd9>XN9RH1YN!qgq`X!6f|9qs+g2E*nMx_j zIF%ffpH)&(uB*hM1U7IZKa#%tg1su2C_Pk;Qs${_r5sjSL3yq+lajrm+twIL1C_5R zBUM^cjyuaK)~XG0c8gCZm|6Q1rB>Y{lDX$5UOUAv$8(~Ko1);vx=s=?Y$=NDjL(aj z&1*xP&9~Z{KP#*)ekbPhdQr`~1jktQ)v)VLkl=4r7E_L^OrpG{NYg{ubV^yG_V*#Y zcGH9Xn$F9n17wM|W7DPZ+CKV~WY~@>*(uXiQd0I%r0I_s8K=!7<4o6%qST6O;(N~F zwNw1P6l3MzDP(&6R>N-R@a7%kCbNptOl3A@oXS|rX|6^|rXOVq>xi^9;@JXm(#US7 z(FSSYD7VqCC^3rUz!l02&ud%h7&%d-n_)sqNfnu8%w`9b8vCc2ORxtfgce z>$WwYQbT1TWgtaz9za>{2=4zvoK6=SYo_K$lv)GDX4H7(^rs z!=@PLCX<}9kcSr;d?il(7Rx^Nst7{K=0))GdZ zsxpPLOJz9afl3cbhVdq6iQIw`rc#|Uz!6;k81YPkIG=vK8pE7RATg&Ox5Rwj;izV1 zV!}T$hz!?b4&YUlE0p9D+yVTJQch(%rJKqs${dy1lumjE8B6(D>-3{sS7}S>qg&Ob zyk{Mmtnx-YsVC}WeH_h>m&>mmj}h~Eoyz>4biaMIG(FiR#MKX z%%a4Pc9V&u6jSL-X{*wPGMOR?*D>Px4&r=@7Gx(}8;RkNxI~KV^T_j&+&7Cd=R+Df z0V6lA?VgUGa*)TUT&JAWtxixrsQf}HFv;!L8p;rjGmjFcbtX^-s6tubtvY!?~pMnWEr| z3?fIo4|&XD?xpg8vOwhm<%r6!l$R7)mYX3?Yonw!pEvGQB(pV_NhUd7JH_qnWEPpC z;9@AUk3xMJwyjDV%4C%~l${i5x}0Cr3E1=@lv-Xk{Rdt77!99Kz3c}tNvZ#WuxXShqt;?PxuIQgs@%AvcPLnnHUn9o}T z)vOb6B-4>WWN9s9*y$?MD0@^!QXZ-FqGX!s4p&P`O^OUx4TzIhYUa=wrB*G!+};i` zxfw6c+$L&-L?)(ZF~kXUR5n1`3H^d>W{@co{84t(!46^W0dpV6f11jA%5Ig#6d#+G z_>(9*REALQQKW-ijd(snoQs+Kc6wcqhLdtyruP`tta?l@$1Hc;vNLQ$m6ViGDjzvA zKd3yUTvEA6Niy4we1uX)WecUV%5us~l^K+MDx)cnDbn#iMm!1UpyT$h0u&p}dFh=^ zJDyq0=Y5F{t)_4+y!_b2K8)mJ*cK}3C=*mLvuA2jT6hAptbO|J*#3zZg> zi7M48n^j6uZmDFaq*~}kPDu$-`S_X1r#D49_0WiCEX3*5`T^|JgDl#qgeK8cBi~nX->JTTUDb3hq_yppj1)$f3&>^d=ypp2D~W?0l^Jr zB_e?cp$j5K6Cgk!fsKYDV0!^u6bp(i0g>*4u&%4vd+*|_VxcM!0$C76Kt&W4#KNpm zK~RWN_IsXlX6|edef|Hw@8hSLd!KXeIp>~R=gyhgmWtfqBI$~3S2?WIkpx$-EfqUs zw9_MYX8w+}GZDQ^G7SDcQ>xJPN#m;}+AaYXc~OxGE^@yj&$$R&8LrsuA~z`FdCEw> zNRiGiGFXw(F49Yp+g+r+B8y$5i6TF^h*y!uPa9qPv}yXg$Tx~y?;;;5@`Q`Lr^pA2 z(53SQ$=nIV>Dc3MQrErGOg1yy6G$UK;wI!Skl>BfXN)~1D!HqRoUO>kim+5)MecME zy#EQrQG4JN{6#h5EDM3&t3>GFr2ri#(~w zctxl>0>qJho~phXRO>FtcksRm_(awFsw?5F1POlSTu2Fng)?&%(vG10*QxPcRmd(C z!s^sg!~8EA<9}1%4sem3irnBL8x?udMV2e_p^Ln#$U#L|Y|D)urL8KB5LE^?Y8D_x|8BEPsueMOqRY$P94=bY&x zF-2~6k%-J*|KHIJyH2fN5miX3!HeW6JE`KDrP z6*)veW3L0%s%$KsZ!*#j`8twOh517A zKjn&@u3|U1$hC?ba*sESER`KiqM$ER!&l5E(O)fRb$2@?HIH3YBi?08gs8J zcCY%p+(mXMvRe@<+Mr108)6KRcY!#vZ=-B{#|2btc_Z;dH>4f%6}IYUh2%e9h0rq- zRqSmpa=9XJyT}Mdb}B;E`GRCt194QO+A8`%1@-~ICy-)S={}&fYHzy0`122SMZiUN zDKf!DK2_v77pYKWvx_WH#Pg<+{G=kC72(bxqR40$nXJg|E^?J3i(TYAMSgIQ-BuwG zr_w&u3~t{8sx_#giyyes#ZLu}0hRrhX}A=Tnb{MFBdC%E&>YDLLf%v%9l>V(*g%9_ zq(aE4t?ZAu$gAq!WiIlFA~6@4t4Nc#jWH7xDRhy`6uHSoh68adZKhUD1=SiUR%M2e zcF2dX(2C@$!LO+h8eCt+e(53y)iZV9F|8I;B*#TQQ)H}*tWo4X7kNvORW9pM-8@0Hb-C22&SI#} zQq_K>9o6edMvc6xx+h4s!#~$1xY9+Uiag*V?+#>as*Ep@g9#GjkviM^HoC>>*&rj5i>Gbl@_b@w%y;D^(8bSX*s-z(s!7 zTCaAIZxz|=BAXP+T53GALXjbgaDMx*B2!#MTiO4Li-eTt{L{_N&>q)6Iw;~Be^n*(u7>0p~T7G^lu32L4X zY}ODpZ$Ni52ewqPr>R)_DqWF_T%IH9&xng?EBkx7rM^&}mtCHDrvcW|pxp7V% zK{7LFVZ?v7OW32np6()FEAn4O*oq$rl34-7X~nxPQje@pb3HPdSS0Uluvu>bha$@r zJ4eNyu*%p}rbvN{lqhnei=3^}Rfs+89N%jzc6X7F6}i+!$`zUCBCjj5+(jN&#Tc?Kvl+~qkCiZ*`HUmFEo?xl56+U1X{v^(u|zafL(nSU-@_>u zv{GcRi`cE46*aozwWVhcagm=Dnc^bb6nVu()+w^pMHVSiYps#|ydvFQi84ir4|9=L1#1Xk5jRKy2u5JyyU7Lq{s=Uno>O! zS?%()Qe>}-G*Be#LsQMTy8U=p&d-YUc6qibaF)B}tH`A; zGEIdc{H%;lM&NTJJfnIijK zp5cmI;_~!U#Mi}igU*WNxkxib#<`{HD)O+4RKo-4goE5tKPd8!%kzmMB`(h@MK-xS zZzvLXktYjrO0lV=Xgaj zPct5~Tlp*(`BB?F*OjwXktmT4(= z-Twe_rqk?mrGKsg)fyeg9ww5x32BGyB^lFczL5O;UDbXSo4wJvJw=h>F7m5Ky1@(= z*{;ZIF7lxwUn)ZLmMKzqlSn4=vLKmRK%9C0nsd~!myUS2JqxEX^1~j3jVBh#+XXi31>mUWHg{a#qGIcOY#ewc5Jz5DE!zlG z>uM>R*#c>Y+{jipRK*sk5PGkbioMZA8W55DkjE9Y;_CAaF3-=39CDFuigftIcyFB| z=ex)vMQ(GE=M{O|MebE(r;E%~B>huU@#_T1Yy-rpVAm1q&+&&`pEM_i-&X{ibuMuD zbG^G?nfNgA_QjxDXZ$G*bPduDc?Zep70ra?zuQ%`N1G<@ zR_bd-I=QMpP-K)MRJ~M@kZa6Kf@D6KpmdzA^u<41JI_-)=Yh?-3pjekYS)+&6}#6( z&Q>IAtMOG|MTWRYCq<^X$VrO4;v#hv+3F$()D^WpHf4poGS8PKkgfuWv*`06p{9?xk|(L;wJvgnBKuwB97VFf5DO`1fFi>kWVdx1 z5XX>%L!=Lk2G!~&8Z)m%+97{QGG_)gCZa-!{G<)B%tgLXB&G-}zE+UTc!I#NEiigO zDt;(|bUjEk_*IZl@sqb1C(lsHLtSLNB2!&tv?B8rp`0@n`P@P9{2Pcr4*5{ARx?LP{-0F{+qa&I zJ?U$^BjNiW>ZQ|wIK|(yi~sSvtMO%Gk-U~*v%Ue2raV`LQ0zMp67{}(b1NJyG4-sZ zs;5W2vkf*~QhTNshpbWgqw~j9%rpP;&&@w4f8;qMib6*Mp^uBh9q575TMoxV1JVNz z1tPs?Q>^v;ABW;aq1Azs$?1XeU8&an$Ol3L(uzYru)uf}c#n+1$?2YHmjy~b4TLrY z%D+hsq@0zOA5Oh5l%G~q()hljaADe5-@@+czJ&$pN##4zk}7?RwiJa2rUk;O8v~)F z!0eS}%>e}>J$5d}rZDVX&)SD`7K<5o9y%0{ugM*kKK(Iv$my_R)EL$%|H2BlCWlsJ zf!nHRo#ZJBtqFwlo;<6S$7=tZ2id~(6&_C-c0)oeOe+dslbscq{j+b@Q%P_w$JphE zO151mNAg16m>J2j!;s8o9~+$N zDK48vfuR=;#|wOm_T;|{+*6qQ+te!v-v~HVJ{FBuXKa475O!A$@-5oPW)6g#Z4Aub zR+i;kv2*ovCU3qw1KLwiyChZo{-IJ8?k@jCR{;?RDy_@JRl9>t#el$~?+GJ02Jq7pY_ zC}jsqDgxy@Fpm0TtnCbhyKuN&6UV=bK=>R_?tjv!f62~Kx*r2Fd~F&nn>`j}V|*a^ zQ<~KiNFca6ts*cx&I(V2o2Io3L(BF=yaPw8oNBLB;=-W`LnR>8KebHx!(#GzI{n%(hHqIhZAxw_948-JEZ#R`k2Xi9)7)=H9JTuS%eY4m< zi^ExBv{b(ct>~D38cqM&s^G3Td_AhZzqC;xQk-3@IP@pS^^33vgD;LTH!?dbx9Rkc zmJeq~0O_OU9P(>mIfv%{yN<+{7u%$_Ymjb1iv`dwvwtpa5(rLh=P6BxkJ{O8zPX*J zY|r4?`^!+TN?!|4)p13kfmy|&>)REDei@7b!79z}ByAhF@~~ei4(;JcaJ+*yHj5z= zQEw$S;h4ug73YlL&JhXA|Yk|;)z=18O81l#+ zz?@fl8tlfevi;7b5-Z3rtmu?|%prahGXyu7FqyZJ7yu4OzJQcbRI3%syEAx>~ zZ9G$32g02eAi-%UT)GC%+hx6sDxi<&#VdMcmVq{9XP~4X=3-xG2NhSLOD>)S@B*elV$b@^G4<6dv7C9L|y*d>FntD!AG)gn`g+Ea86&A)~5CY-uTLYm3 z=u&?ag!VZ0N6t>7kX{gypM>3v_he!1z15nrhr6L(o%VD@BP@=3zr&UPqTZc$svz_W z%RY`_m>(&GKhbvr*zu&Z17#F*?^BFvyj^j4N_H1?g`A2Jx_5eKH$7f)XbH4xmC=>= z1?I1qfxPvgP*b=8tc1D&jfqAFr1KJp4#>a-O|o@V#R!g`a9?YS6xeQUz;#rGb`A_D zZ+K8z$J+bE{X6J>IQ=p@{TgvPwkHR3CpMmXZRq!o*ENoR7%7|{#J*B`xhb8UCfv*FDI;rDAUCD7V<0#gBO|RKJT9%Ep z9cGkxMQ+uUA2E|1qZN#TJ#>T20s$_;`;4zz*s1-ce)JJ*F=oXO_MqK3nOq9Bu2jgv zynq?yfA;92(Ej3Z=kWNng7!ZLWD@C`KVz!rfwGS1X3z9%&g?jPWi0Q=|XG_w_E36d?d;g53=uCr@&mNM`L^L@o1l3{s5Ae{^-sCED-}TY+}uc z91`+Fzb$7uD}zg6ctBdg+^j%+KwA8)#!^I@&7IEkN6MmuE*07r33{*)1&_piL$*eO zm^(eegXsMgZ+Jpqx39GBMx&P>Osh$0UlID6{jC(l#hk8Cl{DP*{X^%)miD*Mr`lK_ zn_ip6%~EGb`B%O6*n^jn^FyC5r4)3iv-@a=n!JoaFmG)$Ojo6K*_&_u0}W7t>Xl{b zoCxI$&^!g9A7z7puZ^Hc1glt|nFr~K>CKkQDL(i@Y{suS45lMRo~Fy|u;xInH8kEm zfQEJGpGKd>{^Bmg7=m=p$1wiBJTZRysn#JhWaOqKiXQ@@#@;0A;@uf35vm)ITGd^K zRarx;5~U3535l%lGE)(%WUGEOx=-VZ`8yPD^K5X{@2 z&1zl>Lvcs6-RcJrX)n{=HC>D8cABoubTds$1=2Mw6-(8$RJa;*qvMF5kgmGe$$hO9 z;o7WeDP5^)k-AjVqU|+JixtmkTC96O(_;1QNYjmV;J0+MnMqtm4$9uc_1e0g>a}L? zIenu&WXLSVDo#QMPLoONiQhqxX#|8U5F&+1?f{Z$k~3b-o{6ROpt&J8Z8gHyn$RWR z{4+s%vZ|#rt1Zc~;e$X}<>Y@gP>yZR>fFC{omPqF+=L9g zAm%*u8_eNGh{~ISz^y!j8vlnGiSvl819MonFEG^^U)P5S98yr)D&UJn2`4CbMc^_t zqpzp5nf0{AJz06cw;UU}2I16O=cWYW6*GEy%6`JC6gr6Ua5DGOhw*nx`*4rnaSc}1 z4fXg53Efe{V|kmAv-}v9*ilys#UJG*>|KmYsM)-@cM%e!u73)(l&lJ;&J0#3l{Ubi8+}151=oqS8L-JSX;Ik!62!r*(;@l(1j$LIjc8V52%P8>DaR_mN#zH^zCiBKvT>JY`1ik+O^#lai*FH4KDnw_h8ylIJFsSEtR*PpWD*BR5{wM2NhPORGUe z;pD33fp|IY_~fsgrmhN83P- z9mxE!U2;rf$u-DeL!Wfw{sUWP{t%z8YF`IRd&`c)%}-K3PkO2v=Ev6rf)!bXxmaI) zchyJVIoc7^&MLs&L{SM=F+ql400=Eohr*jO3=EwEY-JgK++OckH=#Z;d6eVwWF}zaL;-USZ8BLhMP*+ za1Es%@RolLl zzQ^g|w;%p`LF>k{`bZ=Pt!re$NrB8l)R%J+kF(UtzvKDD zU!42^6y>Zcyd<5VGVVZQtn${Qb*;gq}xNjq%~Pzk=4K!Riwx z_6@DX)8KYX;HZ++TLVcO<2xz~lhUf%;%~jGlkvB1)k*kUzsirlb$C8r4}E3ZQaoww z*AmSf8G{=Txp_|cnmfYn%SWU2t#fG%&PMQH?`}Ck7$c3~?r7zJLaJlEZ^h#)P{?EL z^Lsp@%$C?9;j5b;H<827V;;$d>c0nS)Vm0O`7i2S*FsZ)h<7PKY)#(+;`&-|HEg@t748T7!rt~GFUR`N3Cz~NUAX=C@`B@Q>o<6>INUmnyl?v!MN-$hSj2ln&*o*>k;5 zf-k=^HJf!i&yPEuKQ8gjxfbh7Xf0*qfvXu3aOVx=hC89>79_)+uEF0}DQwX$bW(F^ zq8B={VRNinpQHbW{VkXcB`@xXipN?)wle>cDa?~>=FhhZ^WF{#%)etMR_1arufXbt zZ)cMaTS`1TX|j|E9DE*MoW*0Icc>7wuy?+QNmHG#88NpQF-?yl=A!;8X1oz|S)!OL zjF@f^vpAX68DX#%#1LEHiS;$ual~p7>u9h8&46)TiZwCVx5T`}QVjMHF}wrgiS5S1 zpk7!;tTwT2278eh-kS2nq6WK{7}g@9;$Cx$o2Jh3MYHjWtf4xU)pVCNCT>y@6^ zM1u_=<|9^Ouv3ZQJzP(0sKHJmhPLp;dKs)XF}$kniM2J@zLS9AO?FSLk-@eT4Auk~I$(!(tvpc=`{&}$WawZR_BR!V zI>G>w%}~cMe5wpqTT0+Rm0)2ftZsQ542xS(>L&(!idYu0l?JL>6zPKH+76z*# z)}GjL2K$T{-g5KA4qz*(73Ta8pALaXIIq0+iA)vIHabZNQtd8mD0 zQ)R(vN1&jWH4Vqai@AA?ooK{?4CcN~}AvWd@r=j7J->7Y%k3u^eLe8tfusIMVRMrW@=mVm*nCGuRo#dJ#L%V6BMt zCN{ueK4N*qPBqv;Y|i+TlAhQ}2HQof7kyRRU>_69BeoBR>*|9Q#5xk&Zm{{pIuToM zum_1@FX@RbGFXsU2V&0}>^fqn61&S_qlleMY_h=y5o<^63WIec)}Gi1gS8+widbKR z9Y<^ov5p2i&=}ZcVoeP8EwQP@QVjMHF+Mnr?ZzsiK3GPqGqG(3dyyE9xv>5l>|SC$ ziM?g8>A<4i7aP$vGT(Swa=z&nh*x49uLo`o4Ma8VoVzDsAQ(UObX^$&%vTtCmsXQ=-BrlgLxpR1)*;{X2jQHs{68`8j72NsdYKi z_-~U->ifZ)dwa^dh5KcNyvx882seHorL8O)CG%IV4B3VZ3V0mM3^mKOI!JYvtrpXol7yhYE~W9`9-19;!8c`y(2 z&xy!Kz27&`*0eU`gcsZlIB4%w&pQWV!}TNh8($Y%TW+<8q$X{ujsz}=od8{UCc)Ca z*&FssTWo4Ux8zu*SeIf;i7{9y^9#aKy&MR#=AeHf+$`L>19GTbY`&ECryvXE_2eS% zDuQ%zSIB!L4J8LVCHEi))|n7o9L|ZIj+&r@)O{6GdAH-CyALJuz|Rg*W%wYUV}|`t zXvr7lfq}mDBO?cVnR3O2M%PBP^;?1Di@R@GKxB5Uj*4Ii6FDgVz~^RF#Gp4eZ0HYjT>W zjNbe96?pG4+_Uj!GlfAK-Y%ll-#|@hDwoC^3qm^%Yz$SV+(@hMJQKHsGmj)?apJ-s z-{3tkdV4MLi6xiRjYTDg0x37AS?Ryv^w`@}wkY+N3DLh=E{)$0_1BQeVBR0t6nM(c zC`90Q<9_ep@u@c}Q#))0MqE{Mi7EqniwX#;l2sVcXhB4gEk*hKNbl}}l8<1@NFjU2 z$OZoEbymiNo|}$Dx}PE8PjJe)>@jc(nA<9I7ZtfN5WLxT&ipL%KOY)G z{^9tGnP{I^+g~oJYxzJa+%K&%H629%7A0<1BIXu7=SPM8LD0!$=h%T4<&jGx*f73ojmt2*J%lk4)H2y z*9UP4XO05@GIU1Ij6R;yIsxCpS~wtRHYZS0J~lttdmxWM>QAqaI)!@7;H9KoPCa}J zKTbFTSzCG*&OZ9xN5TFJ=JDda=WZ&^I}6%S2uB(9@@M|x9D!6&$*qc~_OpfYI3#y% z*`^vgSg-&~RdMduzFSA2ci}|SogeTikVjJ6cyNHnj`|snzea_U5P08v7!A*>tS5#? zc@gSi*akJj>{AzaYRqe1*Iu3Nw1=&x||v%MlLj zCrzolMsovcH+~h`(|#?UM<-PT7#->FraZmng84k$KO^Lw0HGL> zAU9TWrXvD%i)$+`uC=gS7FCVnn%bhDr))Tcf0V(|lVjZoLDmf1 zjxR+&LyT_O#lgI3(B>)gf$L?PtC(E*?1`(Y`pR1Ae~qLRoQZquskvTUdjd%!+>aViz ztI(zXSG@Uvh0tHBQoK#r8=)~31nwa|Ie`EUWs~Q6??4ebr#~tlhllmQujmJDR!8iS z7>tg-!S3GYIdu1l*zW~O5NtXbV=$U*)fOHsAU4y9WEu{p=m4IoV5=<8LvBKn5$p&c zI4W3;4?7txKOA0uE8ZH-cmiDX2vRWkSzdB`Z!E1{brP7$NSdysxx7SEH$pI8B*SK) zj;!+c)}kW(emk!A!=Piw3S;`QzFd7MUJ!0a{yAb`$LIjwFS5nkLcZE^yee$M3%W;H z?W#uT8l}fa2XrBCbU=6f_1H0Ic=4bq!w;S=KNQFIxalf}zb__Vfp6%Jf>232Yb>>f z+PR@oZhSR1ga{pmH_nX?%A!<;a#Y%vewdz-4TJ`zM+fmV$P*pJJ91h(>4;F4w z2k;V2U4_En&ufJ&_gu}S_(mLdc^gPF??hZ^c4!sI^#$Y5_gUj`FB$a?u&t5@ONb80 ziyZ=g*?F?pSi#Mv^)+q`Aa4^0&REIB;}fe5Hg18EZGlMRuf&RQ-fLiy2aVR06+9Ws zyq{&F-diaX|Eg|4MQ0L=^pE2nU_6o&$3*^<7AVEolb`GT`7T-ylzOU>LjYhtr70`fays3>r8=|^FZ)O(uCt@OgZC-r>r(E zaYX6rQjh0{SLj5tlXcW5gq%pm&8}5}^&n7@Jbc? zWGajlCKs3BS@LeHnbg8ehtVfdiz^{x32n-aO>Gb;*@UNMsV(QGHjS6(#-{AX-9#ns z(>#@_8JGwq4)AS+izLjcZ&FArl((l#nIr%D-i6K!@`BNyco1{|hxX`)Up2sV?!4{# z6eb*fbX55sPcOYI(p!1LnBu{Q6pjLzyj_Y&vNn=`rGqt;L(Z32NR#KVkS1R-g`Pr+ zSk(LHAKEXG-0mj7bd%rMNtcds?2yCWKGYPY6Im(C%}JZtFD>Og$O5Hh==#%;0^=NB zWQ?h{BbF2+_6%UUBWbQoZF!;mvZpXe zPDIW+ohC-Tb;yc;_%MlmWTV{(?PIwOutim>-i zDS*V&%;V7DVO-&W+i}s`GcWfM_G@cZ#WVA`XE=fxV>-IAf1Gf8N8>WLS#sPv3W?ys zx@9`Dtzp;?2JKKm0upNFXo<29R@W`9OWXg8R9V|#UMUzn zrFiGZ8&8V@jpziNU;U_p>UU!#yrXBEBK`1A5XA=th>~ZK4)(9-i zc(N4E%w;7a{zVW0NpCum;*I3R0>0b66Zn%ZestIelpM8A@!hDfxB57{IXtC(t!-Gf zLlqX^FhJ~{^(C%+qdXML#~w9OKNsS0*a1ad5q2PE7Ki<>K|+4KVO2BhF&3wfx;bR{ z=q`})isWBcBKM6^E;M`0TSmD(X5k(p+-VyAy74~O@lL~u_Zh{T48;3XperEWrx@Ax zord7=zmNC%4u{PqxB+oJ|1;jF>H#cCX>GYWn|Pl_=&&ZQ?oh(XTqsbjr@8LEFRs8R0~oCxqQ>Yao_{D@q_jd#}5f_eKn_?&p3ACTd;GMM)*;l)h*3ca5pgFPGmqJeAGg;*!v zXNl;5Ef{P5x0!J$*OASM_nAp)67O@R2=U&)i>xXgt<}xl``njBUXFF~Nia8Dzo)7k zzzgGj=sg@q_d*`e01R5r1PhU~1A{w4-!&dY+-2!M6axOL4HewmXUNBgc*onmMG1yzgni894 zuqTP(w#5^>+F)T~_>nWTzriLFllY_l1}h=foP3=PHk4QkVoeR!i&z%1S_W%NjKM*% zy?E4Nw?8q74f@((@#erJHt2nWRT1MUR&1fcJ|iZvLC+Yhf>;~!-D$AbiCseM7K1%X z>@s3w4K|0^<-~>?>?UGki1jhpMZ_*7*1=$B5xa=k2?jfZ*u}(>4c3Ynk9uOi;5<=% z;3LLE)z}vXJD3TqEwM_2?II@eOm7q>aG_5#u>rtf9dqZt*l?M@*cd#4UCu_M^chZc(r; z29vl&i8ongFo|0f%nh-WxJ8LUdBpHZ+@fH&8BF39CBo)LgGt;XBWz+98cgCAbBUd4 zFo|32N$hlkN!(&DVl53Oaf=d{a=gJLZZVI1e_{dAHkY`?KE!@7n8YpiCAQgM61Uio z*m8qO++selR}3a`i~Wf`U@(bW96;<=gGtXGc zSA$91Vt`n4gGtPxWx;|x6oh`w>XN}GX`Va z;^NW7?ljoz#2OO2#bA#D!^Y;w;g;Mw$>W3f=gXF+;s_w@gsx_RB2(aME%2chupU?D z2W;kR$lS~@=LvJ>&7_9C58Fx*wm6o>aJ%-u!xk4ICS&n9id|FNan=tRG&=KS72Dqx z>-*PYFE(PwLo9ZiZ(tdB!xqQxHuTB5yc4ei!m(SFrY+KUpkdlIxS2ES_m0O5ZL z+WV^ZY6w#8%jZHnKO(2vZ-jO&crW7yVKolaPJpko5gMb}TMXeR5{@&3OF+Q;D6v22 zNhvv$tT(Z#ni{#ih?NqnWiW|b98YYo*U>6*i`NnR+F%m5crCH_4JL7m*ArW4Fo|2d zf!H$!leonjiQQ>1iCdgV>=uJb+~NdcV+|&8i)F<4&`j$laf>$->tis9TfBu>2ZKr6 z;$&hc7);_8rw~gvn8YnkCH4y*eX0(LTbxGh3xi4A;&ft_29vnO8N}W+n8Yp4B=&^C zByLgSLvJ^j#4YwgbHyeYOyU-M5xdl261SK~Y>2@mZm}b=o(7Y+#ZJW97);_8+YoDL zFo|27LX4+mT3?A{zyg+^0m7-}v{oWc^R z25U{MGcfG$e@R9fNqmlmXkT)EVX%XEHA>?tD-E`b*fjFJX|Rv^3RO7s^lHwuc4TFP z12`Z5=|$%xbQkVRG0{bFnwSt>Ipr4|RU|}Leg_FM#WA|_QS#c+l_S6ytGAnH_TG;U zPz{epZ=L0yE1ry^@rE%AQB~l1l%`08WqUEoL|EP$U_FCoHm8JMN^u^-TRQLGeH zH^Q>1Z7hyomi^30(Z5Mfi-dG6q=*!Wup9@}iLl(YA9aur#B+dJaWtSrSSDc{Cq`JFK}ix}*$F9)usnp< z4RJiw3_$E%)Y57U?F<5G$smyWc=|b+@gK1zd@YgjmG{Cp^oN&`k9u3fApWyD;Bs!Mt6+L4a@eC`d!mucc^?m4?MGHi(#n zSk^Z6D}yYnh13s5Ux6G$EOVr^zaO#?QY07g*KLq)hgkMv$?wq-B{;K_vcC2^7EXj% zR!~4B@5NiO?99f^Pi*~90C4n|5JF{#SZ=ElCEv-#gjik_*$wsEWM~MD9DixuX&7{)7ygs0N%1&o! zWuv$Fl>cPt@o>&>9L;UOHl8VU691Fem zHk!lp*&aW^*9d*|-XVv-Pdvs;>oXp}C7kI2|1!=={}B3^O(R1+TJ!P`p^t0kQLz7s z+j;Rm7^c#^F3{$NK02qt{~v}v_O)6khCX^wR}=a;ZjTs#4KEUpm<*$8hCa@Fv_|M- zlGfo1?2u81k5QExp^uLJ|04A9L6mh>Mf}nGm}lrCh5SS4^2nEx!+atVDLh&(#r zP`Mlx`pEe@JSc;~hmr2-n4xY!slSVSJp6+QswIN{Ci3xf<=H70gy=BvF%vQ|UeNoO zDRs46I6u}5d~A%3qtz03UMBFd!ya~A4Sd{;#T!v8ccHKed|XZ}?41lu0v~TgLINM( zmQm+FQ#5%;$VF!Tc`T8V5cqhzaC&ou#lK`Xwhkunu@yio3$Y+v^G@cPmo|Il*mH0-gZ%~cF#)&M@NHerv0pi#pf-}zoD^BOKD?D1)0 z8us{r;Qg_sS&Q|!M%d$xAnD_v3&O$>WqLuu`9#Y#Fy zm`&8s}2x!#f=_v9) zq8@+5y<MEIR+Q+!Xh6q5M(Hl2+bs_`eOqAA^8^o&1S5TVuHCFJ1z{L-+$FVxVaull( zwwMKG__dH1PpGh&9mp6h)LvWIop@BE7a1Kq?*I3&#e&GS$pwE6TI|UhTnS^A(4zkt zw1`haGdOxl&7j5B6w-<{(kbuX1ugd9#}@Rqi^<9+Znmm0X{_M>+G=n=&n~?Ut(JCB z;zLN;L5t_O$u|vs@h(IE3P}x5EFq^Rv)p8%Dbx!o4O;yEEA4majqkh3sGI!2PP+7{ zceO*tdyZ5er4w1Hx7?gm%n4e&l?5bd@hYUicq1<|PEF9_g~G$2#X{v7A{PWLZq}g1 z&I+HwixafCM}rny0@M9O9c60B3*}4DVk&Z0PnsC@{`RF-_!vQpp}4j8UbsJKhb@No zTP+_<$Xf;XCFV|%FXe%EF~=|h7gtiW1TKE8OYmx3G;r|+kQlhg-{OgS-vG{kZs6i0 zz%_7j9%zVHERzCA%w--M-5I#TH#gv72QH2!#s0n#0vAUiYhwC_3%7RwE)vt%ABn#N zE^@n}fr}MCuoE$G@mEY4+9&^2;9`3QE{3+*fr|`GJb>j{g^o8uAA?XkZgHz254Fj= zt*M-*;B+T$@omG?(TKPJJTvnqf@1189vO6{i*S)TUWkO6KIYhQi=)Ayaf=^+FZI+W9;(9G{i@$s;3hlVXxxnqX#o0(66}NZ}ez8j876&7d7`J#f@*1~zGfwQq z5cHZVn8&!qGaSu~TkK5DVQ&ju?6}3oMDT)3LdgYEQisGp#4V0=;udGp5fOhJj};*4 zPh7+X#4WZH7L8ln<>LP~ZgJyIyEz!Q$UsHJE#m8261T|s#l*P9nGmmWi?=wffw;x} zkf3pkkFz-A7AHGo_~-eG00^LH{Jt5Q=3V%4-`i|=z2K1EX~HR$b4FrT7)B|v4x>F z0sI6=S|Dk2AY4qz_;zM-?jGM9mMzA6gY7?L(Eq0DK;+7#z)XCQ)Yle!qB(8QIRZ2P zY=F$-bo>eU`md7TY$*zTh+n6g5r|CbTidF27lxg@*5sS@8!Ut2ozNj*0za;FK6)?X zH1YBQemo&^ zO{|(J$SOEfs&U&yXw45Ey2dwaEK)@!pCGbv7{YDw1*~Dg!%Ka$=scXTH~XfgC)n#q zSv?(CXTF8zOF`F7C7$D%USC#mIt3f3mLOCiPHhR-)0sJZEpD%C{qyt_@k1#0tqLBVgY%0z8(&KD%}&CC zf8eXCLHPV@c2aO;b~cym$>EHpZMoXW=()${=lzid19T=x>~&jIEC^pJSCaG z8MCk@Y9|I9yq{>}Wb~R;SxwsGOJjq>Q`UH99-fP8_~slr85=4KBkQ{bJYTZETgP9V zp`Y>UR&s0`Sny*|)kXN#9;@3^_&ut1K=N16E3xHB4hB)a9~^tb5H$ak7TqI7tDi*C zI}JxHs6>^!4a9k|>j7z7Bt6dW2u7F7sRX)B7wBD%eJQ$U+$uo^7Hv(4-TO6y+ap9T z$E|@j(fZ{M%#%rWkv)(vpQ|Oyx6H5^nK?oEJ=WgG@Ja3Ky~L6Q1?U;EL9h$m zZtL=hUCne#a2k6+VrD=1jiMMcj-qCcqUuLX%cmu18kAV_^~91pk&%{Pj*?o-j|9?| zKOX7WbIrv>%b0jAB{(KNm6#d9jN^-e%s3`aV#aC8YZBR7B(e=hMw+s-v8S&<>auC* zda=ew+w&DrV^2E8ImT6x;@Gp08ONR&GNNeB!%oGw2&9VqNXHnK2A&=AU1@8gme?U8 zte2hgvr!&{jeOR9HjB&>o7vA;n){)LulF;Lctw2J? zhs<}@S&)%9NNzz{Gf4icdJ_jpuaGlH=GjCmXKunE>B;g=Lv&)sX^4xJA79OaN_*BS z7ED_rjE-PR?qkL&*#=yko>EW{=iQ;o1Nf1Wxa9*J+jElCOWj6v2}?e1kFi%1#cW3g z&hl8x9yA857fcPPOJ>LP8xu=Dj|^qsih>CS+-buXJp)4+md1ue3sjT$T{O6{BRf&r zd3LexHKp~l;Rcj;BBT`sr|$5SrR!w&>;r74!W~s-vD;`T*#H%iV|A^SPEI<>Ud?%| z4JgPTEkq}&Kr&LAqFs2C%`QF0CmFj-COd+pKVRkKMC_w>&YB2Wwkv3Yb*n=d{oSp!OzhVao!S1@qY5raEchKW{H{Coe@6X_O~E3&U^`eqjW?70upxIa##i&lwT|_E ziu}Y@-1?K&Jpn0H(v=!nDP}H5241SR>d!{dfrMX?WNo<5am@dc{Y0YdE$BE#b{$9d zf?1ILO@{Qs>gCw?it1Ou8(Z(7ZEW;DqVFhbIX$*6#Xe$l+{lbGyFSkh2qN)(mYt+! zx1ucGgpErtGi6UtEPE9)`SzH|WYIn-x|qVOkM5P~FApL^&mTdb3Pda7_y=!Udar=5 zf_#o|?BGS+(EEV{o9RX%`rdBR=aJI7_(&I~21uqY(nL-H{EA-E=OO&ETiohRlc9uWDZsv&FvG*-kn%>H8RxPZ^nih zR9(vA_oKKrRGWLGp`5SIcKJ!$tByKdrn?W>mF><@j`VWeY>Bg}GJh4luk zYuV%vBow<{)A$X&xHV1FBKk(89o1u(s?so64L{bHmYAkCiW3NMVIJ= zY~>co8A!9#Z3=m z493U}GFs0Ok;fW<_EZ{ibbdJ%g)b3fpzM2IPNPr^dcZjQFc8 zW6Od&Yud5{eb2SU{wZa5c1-l|@9d`GGQ3!d1*^tvXxq|BjTL7$0`qcKn4X=?j5DLW z#taBTxkO}Q7g00~=1;=Uv7kxzEYGsZ{e`R>sdDrTBe8v=#LPWg;l{5cVf_cUR&K)` zQaP|<;fh+JgkpnmU%R}eUF>@ypzC}%1-?IQUS+$}l*d{YwGP5p#*YgUgzcmgZF{n5 zkK^n+ka4Egy3w9qQ~T6J?cKoYXuK>z`wQsQM*Hyz z+9PkPj(6ap<%kUvg+G(q(Y^zjSQ50e$Lu3v6}gyu%V>;GE9bVx96 zT_pa7xF;#@BlF_h#s6Ad7ssG6ln^lzni~l^wH)K;a_tG`7fxRCo7r(|3hqr!S8nPU zmkiNpj6K#Llc1x$(Xlk-xNVO;+rj_GUQGDg8gVO_psIm=YyGzq-?<6Q17+v@53^+Z z1m;D!*>pO{Hw(0T)&bp&lzfba{KxLhWc&D%U0f*%AILwEV&);UXWO{7@63$wyLE( zTg10`%3oI{Ke8R*c^)l!tdq&w-?0kon;3E&(Nh$aGiO>i6GOn58e_&${v|T8!*B|! zX4r?5gL+t&!$*E3A(5jCIndpN;~{eJH+K>_jwgrX>m>Eu|zx|`f@CUVzx=-7gJtQ(x1aF>vKRwDP8b8OkdJ%IGf66x^(fz z{iO2^K9si)J#SS8`_S`k&3UYOv)n_^Cv6sS?N_%+_3cB?f*PeKXl{=+9Hr%ea)))P zVD<^qQz#re9s1b?SIEIq@FqMb!g0kPwVq%)6pih{ z-I8orS8&&AeNcu;0PyEE;dg9!6=2oZ=xBYf)=n0|S3@5qJV;iKXv@0MG0h&}cj3Vt zZRl&WUISLt1V0kuB>sbhZt<#a6+6}Jf80kbQ?IGMScZ}C^1qfa$&v5^ERJo#Z6>U$ zj(w;J47wwnAwCUa%s6vjc(yzD)t#>cvn#}yx!`IrnCWK>GO=kj#od-Du6KgCWv{5X zZ_(Ih;y5W$-0>85D#WR)R?c)>^)FZckn}-aZkpg;+N=rhpx-(DsJm^(Xqth!MCP9R zzJ;c1)43XIcMa|55=juzRp= z&gQ+Wv$E}mXPsJ%e_0KGfd0dBA>13l@Q<~)GC}nD+#)))xKB!=7E=(sC(F}KNW`8^ zO_)*+vfp8RO6%kI!q8Shn;yVVxZlavBAH#u8ej`#MXYkCBo`&ColR0XO(~~Wf}DXh z2o+C0jIQG0{GmD(loRVyQ>mes6a&D)b`54%a zoP{;yj7yXgb4+CeSi@?_=}$Q&kfXiew`uT>9CPjXAGZ&y#XY+Ey`8YxngV5}y}nb; zJFE}JOMBrgABosLOr5H4R)W5N)$0Z)sLfNgYU#0#3$hZJc~fn=XtCI(eRn+^XSN~T z60L9JSbw}@J-$#GkM%ItS59@k^{=eIOMI_Ro38uFzqkI<1m-;)1uTSfp zEm9dX&RDrpxbTQ$*tNFr2O$yTo4o4#wEwI1o78La$h{n!M0C=>xBj^V=B|m>Z=5bA zWhNMkw3*x%G2>YOig3aDd#3K==(+q2BrKj>wi!eOI1sGyX5%3 zVS@E{qw|_c?GI)g>wjXm=HsPL#@W`dMxbbPaJhuKy9iNGO%HCTobQJ6eX+7|``w9i3iLvpS83fqcuIDL zb?VhPGu|4Qxtd{N39neXpSzoPRQ#BQM}HDOMtQ^V%#E>G5;r!iX55(5xcYOP^cE~c zz>oJP)GNv~Ge;zIB+mFT7*rJ6!uYW$44M(~XtM26tB zKxA~^7J=ZmI|3<)D`O;J`A#o+(-}>+>ni1yXfp8%qsbU0{vlN$3N2$uWXi?Z&F#R~ zK2Z)4b_g#^-=RTetU4mgh9a`8+IQRf0*n#qxGNt*??y1!%){w$k#APDI4yJCvKk>} zyU_j;QnrBju|moo0>KU`n~h1(2`PK}PL4DUDVvQWSl^rnsX$b(sif-EVYzF4vu6^; z?*lxp)}Z4ylhCr6hdZL-Omtb-0TNwyP4IAvZ&n|%H+ z`+0Iv2p|0KkI(%ML;zaWb+4pbZZYeJx! z&bpsWz;qJ!f4>CQ;wvX`2_E1p)}A#$5ZfFSSHg=Vpkv{d^Zu9R@X{wb%g9NB z>~oR+f)p?mE+dw2q+BB6?FhLJfQ!PXL)20!m}AvLsaPWepJl_p-wgOrKXTV%?YhKv zOJ>>*j@vGfVQnVM=Rg_d*#$Mhd)C4;5IijLUJcsoHE2&uZrTiyw){R1{ICl0IH7cr z=TlZY7*-UXw!=zA1rV!Biq%NK3Fz_64Wk9;L6Y7CuEE+8s+hfU5 zC1eyGNUP%OZ*HVo@Prk=(gP9k^^@=uHWXNmMNx@;NbExS2l_hlFHe;J!*7s3%*a1j zdTjYWPgMCuVaMo4fh6eo0NL2R(1E(Hq+2Hgm=~L=i0z-pY0WdHAg5_74aOCP`&i#Y zGs0@L0{a{uN;=KSNK}P&smV(Dwa8MZ^&A8^{(Vcp2`g3F9(X=>0IndPwv?PhWEe?e zSRIoU!Pkk5K2~vp+))k-?RuDEpMqGogF;T-%jSjm2T{?==q zGL};@x=Wy>I6Eg${tbd>P6&h=Cl!Uyoq;w=O{zoQd#33cNE|1<&=tg=iOc5wqS z2`>s1lg$PqA&J>t2ts&iK)qd8t*?EvrN63et$op7i%K;H0tB?SQGB6Vg^I-+qJpA; zg6{J@XXZ}sZo*5Se}2!CkFs~}IdkUBIcLtCIWzZO;*X@&9ahLoVv&FSE*d}ww<_dY z74qa*0DuQzA zxq|Wlh5U1cyebyC=2xf#Ilo2xu{3TcWKNmhq>!ly%J&`=lz*d;iwT(*>nRGEia>6V z$SV}`1%%A%KKebggHql1ZWU}ySI7r)%?`ezkYxw=bqeGw6!J@i%#j{}tDd#I>DgwD#A}>+M zLkO8g*FE2qh7{c#i9A^${|lZ~bnr!mEIYVOBA=^}|47IK(XMfyLZ%|v_`?&TgZqg; zmd5uL0X&m?3XDLD#Rj+Do@3gmkfa+;!?sE{S)_nsBV3l#G48$g+T z-Fx#)X-Ho;^HU+`Y=!)HLS{DpppYdSk4fYNh5SoGrgn|B3R$udFOhc>e=LoFLavBK z{>6U5^Y0Y$RK><9g)G^)ahpJ1rI0ToWLEb#bIlG)bzj;ckZ)4RpI#4S_8YG$Wa$bj zJ`vJLQONCt%#=4MWJx(oA|ECGxPuQW%6^3`DcdCSD+;+rAy0`#{-j5+@t8u+Rmc~{ zBJY&QjS6{~LjL3yQyP+uCna)`Lf(^OcJO6|EIZgLkXpx`2lQol7G%o$gdMJv+;~VmTb^*UqVh)$d3~;cW|9TmK|(7AT; z*$P>Tu0$gLK_O2gWVX6%6tYyxXonTl}cgC+8X3i&UD zd@dnBtdOY)HSs~9QWR^z0LYC5aP9i^`kjD@* zD`kX2mP&a@BKs6_93j(|wejy+rZlJsHX0@Jc!m6CmPz@~3RzMvlgMW&qu{7==WDZlCt`klE@qg)FV^Wr;jn zAs@!_ULfz9X-Y#P|3V^PqmZ`~GRLA%Dr6apu9nE(Qj^@l9}_agImU8@EW@5#ByyKR zt|MfgG(8Ggj=>>AL#oN7T5soWV$~b<1OfJj#7XwZPChu*X*{?HFVnzEkynZ9 zK%^uzrQJg!!Xk195gC7aBGW;HSD{59AaWuX*CV%v_oZejzHS0v=nwPN_EVC)dm-+a z=kHgoi9K|M&mX)@vPebhy6V@AF6UKm)BC6qve~qd^^f9S(pb@OOFv>t*Xc^b)!f<-d<%%54~yPkZ8{_ z3nD#Kq>5bsw`S2;2MY3$AECl~6=*(mB04q*Tz3C$G?;8%wFckE90_J&6s$!^5j9&|kaEI=sD{iO9 z_B=#`JW{2+0q!pdZ z9ok4&T&s<&64k|nT8GRM_w+-v#2s~WLlcdwL609VM4LIXaneq}#AYs^G)r7}xXENU z8dgtZfxwp%&DaXLU|4Pt3QNOnA+H6uL0+lXT8y@B3Q1uKFhu{dK@zVLZ6mpn+pDd` zzT6`y;43}GXE@LP$NKz(n0TqZ_Dm;M#UVL-(11kIo1^TUp2wAN3McKbYdt#U-Ku+DSruUKT zC%_Pr-Tl32$=awNrewDPO-VMxWP*6#OAu4CKc@m&6G47R1yizLqafO8L_23J*#goV z=y89Kz_qm@`^AN^ASfkkz$U2ccYv~#><<7X9v0%3laXWafX;9%SY>zG#Z0 zaz0U)^BoVSo2fg!F6U)cq(=-5V!C?(k>{|a5royI!Z#m)^jt-HkcBk913R?s0x)NM z0}B)6xwRfuq|O^Rsn+PZM5B;eduSBrskv|6cgX@r0(Zy)RqbAa0@Bd1Q`mc-G-S$~&BMCHf5c3EO(yW4k5+KPf+Zx1PwUay*$Mrx-g6+ zwpX~klONk>BE~e6c3T0FyHQbR?M*Goo3&W zBuQo+Iakft1B2;)5;Xsd@Z+bF)Xr%pDI_d4;~^q77o>>U-ifw=Op+U9ta`%A5m-W2 zZ4jJh%%c03iu-HK+U-UJN)@$#LRguK7+I6?2#OH3+#uXr zg7i|G*h_|U+Mfm9&(P7{&BO1J6{>l?RFTBcMJ5r&ZkHmt$U+j+tUZFafnOF?KZ#3X z0;b*>kz1^deU1|M$z*8n8nkj2GqiE$Ndk2T<&O=1Q}tug~u7 zX&cGK30!}V8;r-(e85*pKt z0ipt^#XhoUR#+Zg;q{xrzxN7Lnys@e(u^mHD+r-bAyior5(wcILbyU9IIIYR2qBjc zG=*TdB9N0dk_lmt-Q*!M)560LLO2T3>uysBA6O9*3E^!*cuXO@WJOp@2!A2tWibt) z;>BpO*Yymi_7|wytF5)~A@pTbTj_9btPag*Cb!Sj!%>~L=jDoWW#ZF8L z|GC^cxPL(n4pQvKQL#=HQNrWHD0cr5wZvHeM}1gp%q|EIi!Kn4L(sE6m!!63(zW(u{p?J}!;E}{1J z!-l$lkNZLbua#RQfGn(LY$JqwqAF52Wc;4)2cqtC+VNq!KQHQjGU2z-{o<(m$mD5; zkM56-x{rJ(&VSH-df`m;GwhKr==W)@PUY_Q+^rMo{VjnB zummx0x2{Um0%u`NBpQE$W%M8+vlNH$D7@G}M#!Uzb7QZg*!?3S5?X~rHDq+`EMB1d zYj9u4f5QwV|1-#e*0E+M8b6tYaG692PI=`xnJ&81xw$FrJl+KT$^RAoVPq?yE6BZj zA#p!t1Cuk;TayVso}1gmaB;4w4LarlQv(w60l|sJ-(X$c5B7&PiO@(_G{~MHv^p!= zIT8{gNEt)SLs}ky3_tD*VLwL2YE|S3^%WF}?yslQ;Fr_fUla~6g|f^dndnEQXr?Eb zl?CaMvbdRHCXz^beG4>8tDmVNw^|`v&9b&SNm1Zd|7upDR_m$NptV)HJI6#}DH=K< zmBu2CRY){OjA}x0=HVgi=)7gnI)!mA0f}OAWt;Gy8EQK|k0yFlRB_0XW zWK+h~s7%jFqVDy4Zz(uMAprF571Vm`s&*}~2sfp%wXWJB9PAEb29Vgn;=>%|U?-u> zSJZsASrAkC28y}Z`Ocu;RYXINlg}N-ofWnrM)w$C!GFv7f3L?RQ9>lnRwNK+U@3!Q z_fAA-y{v+Zr&XN_LV6#??#F@jJW86e)eVYfa*pq~VN2ltv{{^W5SHl9WFoYl=z2us zdwEcDgmGMmbi--Msw(1iMXV-jXBQ>{oD&&nremmzaVL{idjFmM**)wNdS5B ztw0eX+AC^KQ9v|-#j|qBY%6Ke(0`Bv+=~GS;ouA`43EsMW12~yNvO%Ajd}Txg7U2K zwkk4mi*mz^{JerPtG`9Dm(`ytAXnX~sxqrB(a;oPH3zH;4b7a|t09h1+DTe5^ma08oB2@M!R zC8>%v7Q*AIJ?{1!$^)~+?u@EBJ{tFO6W0MX%~LRzR|$&UBZ<+_szXwj*snXH8t2xk zO$tJp$%+Q^Jwz25`A^E6nYA88iu>^|Rb=F$CS~HSR~yXRGtsDXK)1U#$<(FpjMAlH zd^sgbmwr{7nXER8)X;1cdL=!?1c~0|sUoZLS`_({@n(3J+5M5tWFp?e1PCAfz|dg` z-5m;HUvV#&)becveq4dKTEI09+c|@3Y$MxiY_k(y#gj8e2F6|YGKKtTEV40-5N0Wa zr4|Hg>{0ShHz@FI3)mP=u!|KeAF$p<&gs(IgQ0PX9&^TFx%Ku4wjMblK%*FTxQLa&x?~I~+I;P7^!fg(sRZg^eKN+6~T6i+2 zW4(9^Ck~C^DVaZ0kv@Kig+%wK!>Ob4A%(qMkaH!%CCqIzkyLB%>0yT>wD7H56FLIRFv ztWyr2NsL!e9y;l&$jDvF)iLr}3d)?G0OP%!ex|y?%#+15@?h^y&agnqx`KxQ%uZfg-MkL%G4;#uh|r6g~J`Z z#>8ynK3t4q_lF4bqdn$URf&a^9WA8&3d;R`M->@)m2#lm;0p@MoIYh1iPOi-f?(!e z6uV~%W(;=UA}&~}&{&`g%_5Pw#Vm*?^KT>)=MV`FG^e3kawuB@&HWIbHPC$96ebPQ zon}Gs^bLyLn~{?TC7fK6;lbkyiM2@D=>8cYQLDCfDPmac(8PXjV5MS1bm$4-LzglT z9pZ@6<=rN2;wB%3UISbbRqt{WQE0YQ6+B~uyyDKyseYO_cLvr*_J zSZ#uY)@P#FeF+FUa3;qwa1cAVVJP#nc=UYW8uEPOjnP14;6Wtrf!yvGIAt&05Tp|x zka&&xAowb9(DW&z?Sxxpjc-iK52F^oap1!JHriish4PI9$koAE>GB2`D83v+9(b|9 zyo@kutAfDoz~rfu3dehKCkfmyRs)yzJqY|zFIAnAfr9FJz!WDFLJ1u}r*7W{FgJM& z9D%vt5gFQFAu=TZ!g*U>n|aBY6A@e6Ap&Oh5`GbN9U&pxKj9ir@MfB_-XQ3f6WvG5 zu1pe*@`8aVIygv?8_~R-elPe^-?vEh*wuwwL;Q1b#eGO7kfK-YS4| zB=8jz7$#t)0Om{J?@b_mU4*k?VCXUlyx#=UC-2%Qg9Bik1o}BqM!99FpGeb1#pi9-edwt z5|CE3Xmg7Mjx&KrVfAgad?UZjiupOyFAtL_k8oRtfwH?vVY*^8_3&fHe}h+XViU zfFlIZErEYEfvX5;6Ts0D_;V9jNkFWHs7;#$t~G(h1jL$-fM47pgivh)M-h;+X8^t> zfm2Q3Py!xC4qfXM<_DS^98 z;3EX2$rCk;C2*q&TuwlmXaO80fj>5Z^9V?>H-JMWaHR>HL_nGq0sM5i5W)fzcqIWT z5CO1D0t-!G0s-v;_`edEY65ZUUTeET03VUSL=*Tb0aFBUxdisWJF_MHfq2j}n@6;^bW!t434F)|&L$x3a-e2{1THgyc?8T7K%-d*;T98k zDFL$u@Kp&cFoE=0#OXu9U`t7Jyg>u3f$;wO)~ zV16CV_imB+-Bu5+7 z{5qPKal6m!Xns(EV}Ie{1I6oT{&h3Gj%FLZjz+vjM7)uPx$gIkG)UG9UM1gFV_++=|F_lLf4^g^qF!4&v-=(8>g@5MFt3(8vV8biVUrV?_?F zbHFADCKBl+P)+WTf$SvI`ohoO{|i!*$-AAtu)4g;wlRMEgdgMcViO*d?|%towQe8i z^8VcgP_FFXcxtaWDKY&}t1;m2_*{BR!`qvWCEgvM7unu(ITg3#y)FFq23*9C-@G?5 zZc8|j9oI7;vfYuNx$@q_9hP?y(Ip*`h*kjJ5%aBnIJ_dxNWgT%x_!^3zw4pzp5lf7 z5PRYF_^WX4dN1{px`=*4j@(ZuFwsc70z1yF^2?dVPo&y~WG%X0`$;lft4j~0%%K;^ z-0IRjDU0YypGFU^nr$1qT;ceK+2q3KWsv2iZ*hg!r9^NU`Ouc${JAZ?@!z)eMX%e^ zZ{2K5pYx0@z4Vv1bk`4U>66!@7qsb(6%Cyu7{~JhD%-h9I4SxzUn#Xa8Q+YjBO~AN zsdK!^D8*(xi5{RebbZF>Y-+)W2gwp@-kbYUcbT9QXUfb+g2uX&)v zqWW11O(dSs<0*;!`*cbYv9fk638CY}3-Hk*O?cS#JA6JEAEypYGU{&xN+*HLPnLg3 z(nM<&fQWBfqw%_wy(CxYv5p2(z#K@&-TD!S{-#5JEz~e<{Z8A%?GS2VxEP-r-lESQ zmOndjRc?6Nq}G48hh``0U7L-|!|?-NKNcRBl>2v^=W~5oqN{b1MsK&8WK2VYJ&B>! ziN|UWbDoLQHq8T@IJew{YaFz0z>hKiGMIw*TY9_LzCXg~!O$C*LMlw8Pb0nn zIcmlMj8I{TFziDl8geSY#K*pm>TiW^ObQnd*Yb;otr{FE8m4cPJPfn$vZ zs4#AE5;0?X2c|W%TtCFZ8RWoW@Yj#)hw!=9)?;yw*7r2_iN)brk>cE4EkU=p=ddkl z*dHDGZm0gb+uLp%GwiOV!yJ)zdA;mQw|6s8;_tGJ*}OE#5!q=eFFWMS-Ld*ow|7Tq z+!J8Z_4xbragU-tFacckv@`dg4x4AUGq=NO^Sq8mSKjOPb}&VJG?j)kETCHS z+O3~>nSxE@n447A;f761+rI?3|^xb&Dlefzq8kcfoc)|_FKHPPnH;Fx0Lql$FASF@MIcn_S3XXy3 z%#R&MSEeL6$OatgOA@V`>-FnoM``pzv`lDoJj>{Gz533fzr)rQx-K*$F*Gwt?@HfM zoO`Ur>(KvJ93EX(tQ)WhN4Pja!&4uQ*S{?a$Bzo%PeLrtHHvLB4$!BjJFwd3=LhIr zIe3NdQRBB{pY%HH2N^UUA17Us)ahic6zjfWPQ3=r4ReI!FUWT$t;!G0hsa#sZ#>?8 zu7NG^x*xhAA!FMmbOyc!wU0@`xkB+N?(n#H<0*jj`NMjyaCuvXxxMdDHLmkR0DwQx zIqb(rTaxsd!<=zAZKN#yr1C0vg)XP4^50l*OJ_tL=nWL-cDVIpC-`v+Ry%x`qjNH? zj3AXpymhS9?(U?LhTCL`_FpZ5%$;u5a0V;PSXGecS8by1a+o zA-sBzxCiTc{1<}f2|F-}J0cY+_Vw+}2o`qHZI3>>izaIk0CqTL$)Z3)VEDD>4)09X8kdZts__&`b#N zRg(>YHx6tZWvu4k(8K_Nc=T~yW(3L>vbX=h(4`*^%^n#pjMJx%#Kaa_on+ivOzv!( z%R3W#<|+5LkQl_8yn6cclr(52!G` zJQ7A0iGUAkZUJlOQ6F&t0vrri#*jNdjzrp1@jQtSfXkU9HL0 z0;61^`}t$c_`(um=3IQ+_?Y1*-g&&O;TkmL)=Wsz0++kPfs{D6ZQ}%pAL9|o2-ytE zncLdhX`PIlvKfc%;jLhhqeF3scTsYGJUVP`Tl@2-Yz)FNAO`u0Ok$3!^{=7}nV!(E z=*p#kM!mlmO2fM8BD((YJhaluk^tY@^Az6nT(zb}(}IIp9zExyqu?{L4bBm!_FnKe zd|#*qZuV4>AvkgCZ@OAnCxVut*s~2ykzPg{KLd9(+QAcM zq$hFTp>HKFIpStU-=z+mN*CsG_A8p#@U-G2r40;3)(glR17V1?g#A<8X@tI+g)T-` zM=b4PMf(y9?O#K+pgqJDY9*UJO#?4l8|Y{Hgj0knJqW#CwxjRHS(C}0@KV)V6Sq%J z!Zs9quwIH~9c%^aAU9=Qu|Wwj^KmS}P1sQAC5SiwosyvC`{-~Da4{J3h^E*}dAwgZ z!wqqiEoj9Tt+l|&qPs7-8vBCV5Xl^%XOP=41S1`5kJBP=)jO`%m&7=^#_jFIveS+p zgn5{U9wq>4z(c1!AwMl|Og|fAMongp?>QE9xbTs7GDLm5o-#< zHK}kX&g}{7a1qBt{$+dX^PhUc2@m3q{sk|(TzVJQJ1*NFJ6}JLwI#B-_3Oc_dXQ^y z=p)xewy*t;b+zko$C`qPOs`^lLJrY;nFQ{BzR-5pI}gvU+vy1ppLiRHe$DOZJ6<>F zS%NK|tSv`2$GP;)E}Qd}$oAIn2Cv%Z@^(nZ$cP){P(NQbzt zsB?%-WN$z52(5j{od+)x^WSD0k_MASyCUfA$@F;lyOB{i+jty6%p&?Cy!yBqk;-`Z zNzB#8i6q<)4HUMGcSrXVj`IXU(=5f>{e6B_|2sWdjHfL`)`h}H>ST^7gz(fPSMK28 z2v_G|>X?z751#{HH^~@*D@#Zp$>XE~nhIg*5BLY4N}8r$JI-+jE4Fn-qP7ZNZ7h@( zE*Th}8MkJ_pv(2wu=I&^=B`Lw{c*SjBRyjLb_69xpz7_t^(tJUvtSR)e+discCMKa zclqjTw-1`q|IGYPSHq?Q=HdU7Hb&GtxQ4?x7tI=5hSP9pmyVnKDl9~#3zGEX`d7yL z2=DdXn~g;MK-RmqjcjrWQUgH>B|)n=YcGjMf3tXO3XzMv7TgD*&OtOyLNZrtAQX=97;bHWw$fbm@tAPI zb5&sLU668lH$#YnvUU?|yT)E}S7dW;N#g2#w44DMRyM53cmsaP?9&}o`P6-~)HGzx zRCHl7oPtX~;IhcWg?^76y;({Gp#_OVBy1+6VB})Ne{75vmYpopVo2k>t(PYng*}j! zK5#DIjT#s53~ET<2nt7yrNe0S0hgQyJuMjfNMG0y$t_HTBS-js4lu|a<-%m&HeV9J z*`@JY0tqZleFwt(#QZ6V!KEG~eFj%n0H|SkN#o^}2lyG%{=75jku~u*vyBU}FQwUn7Y=4Z-Qyw6^@={EgM+_b1 z67NTj?eUjD9sRnT|2AWS4IT^uetSDIF{j|4jsU^?sV)_V?|}PTNqV;Qs!{aH8TX~? zSoP4p9cxEtOS}hV#}4r8lf5OPCxDTu`J z;$zAZO~$BpvDc4@i?H-|=wFF^!;{#$gFkoclyB%XCLF*)81J{diV88PD7jc)jMc>% z1YF~l=)lwEo^UlKkUutZFm^d+IqFYw=x@=jN=)`Hy*MRt6HPNNEMg$IJ;wWJUCcpc z*lrA!+x4UpSU{*e8Eq&XqC(Z1STsM6ve z(MNn24aYR&T^fUEIY~rOc;_;*DV_Zcq?;m0#-SgScfkyr4Ekv@FM=@jOI`sT2^8d> z8_aNpiom`T_QDx%S7(u&wD%Z6?5VnP-{%0vZF6qzxyGfx?+VRDxbFJM_ffw*&%Qj;RO%XS^L%DK_P*V!YZ2Xqs z2nW^$j(kTV^SA?Z3yH_V;pk(s%Vreztpd(;Q7T0Sppz58v4}in9NLqE4V%`^vyD9B zT<-|YOeAL@B2YFqe64CZb<|4>ih)#++-!QFzGFyt4z8JDFvwF~Xa!2%< z)~!cGcRsp~^JVVPV44Tq2npQeoNvXr?y{uS>uGp!|&f+>vsnK73p;3LR72q`B(qB}5n`)ZWw^Rd8BKBS z;fNbMInWGTZKO02nJppKbf&kpwIxXl4wv?O(1?e>!p@FhFPNlLW*h5&)PzFgQ=Di# zQAf6(GAZ%9Nyo`0*a{;xz>ZUPN1P)`n96u)5)fw#Vk0W@DWQZZ6|mXdsfoN$x%45( z_#PqSF}Q||@5PUCVcdy`F@iiPc_T}L9%*1CeuNdV5iOyZhnW-e2Ub}L`^u>aXCgWF zvx-AS2rWK@5^n-!kA9FX)L0geq{3wcq-7byCtBgN0msAwvw1K0G|Z+rH<+~gLDB-* zi^z0izTHjQ=x5SRV?}($Ql*@?ZCxs-278sV)s(mcu|14}GgUMN+SctPm%>`0lwSm9 z{qDMU+xmTUo8Z4?IP+#(N9n%?pp8j{bJ8W{e`1-ik?`)fF zxM%Zh(YJ@=ug~4wg7Ii3cv~!wl>i@qra3|uJ z|IcXv`8_^2(SBOtpMf*_lJzOZKs#)(*D;x9r@!87|8D&Q@wqQH^bqhJ`agup?B}t7 zyx$^9BGNs&QJQ?>1^5rKU4nQG+p)AfNK3~on|nBja~w`>x}I{ZC#?h%0QvR*y$?R; zOW|`i;Tk??#{KX)PnTV)pE zymkh{*<%sTkASc5bm_w|!_bgY@@ewq`jdinXCNhd)1fE#IMQT1j7MT;G^MLoQV-k< zNhKxl40u1TA*oad%vf>!RFbOyFC;}Fj}k%P;#k}8Cy`}fYLD;2cA(s*#d1dMry z{L;i#vykTxoQ3I0grYqFV0!00Aex!zdcM|^DQ27`kPQA_1hszyLsSPmL)em-gmoZ^7xQu?a3PkFNmxH7(GBDLuaA=usFjatt{p^W7A|M+ zM8oB17&!%muN;pVUmuRp$%l$^$ag%YNbIygM=-$$>=1fk6;G>myD_bsWQ?=`LNTL& z3)n*E^Oz4F5#p!sC8EXgb8$+8SD(mkyN=43if$MK1O~RRDK^tzcVR*g=j^yix>KVJ z1D$v_s|)x)pk4zXa}^+H1zz>Mr*TuplzWUg#1&)!|8tdT0LEL=ChilrMEAdclw@Q* z35Z%SLgW4~hyW?<o*zrgvCAzgv1LpJVseh5A; zlyJ{9OM+#_H^+tFrwsgd-u>c}xAAoNQwZi{2(-gU+C~`RB%JevC!K*if zxuL1?`j-5`tMkK!ll7u_7i~WTapL+ImQ?YE^9TvAD6!`}oaKwh`3}TOD-w-*w!5Ol zP%XkfTBPCr*HNXTyJNXnrvq2C>%3$sm6O|pi!=9v8*Y%+3+kJBD7Tx4%@ zLW`3kud#>gjR*thV>g4pv<4nLxhsDa^QtX!$6pJP0V( zz>uPW7mY>q%{c#aE@dSwJ<)gcU=!Wk+{dOKB7SSMiS8teq-ZQ@+Wa8WCs0S1qk3~71HPm{5@EW}NlD|CLyku>8%N+64lp#l9|mp&~yJS9%2RY6n( zDoI2h8S;Wq7bF@FF>&_52bG@|9#}5+$#r33Nylu9;fIzXuzX`4)sy*III$8Y!}IDp z?#_6)OqK3y{REs0rZ;{GF~FuV3Cw{WGRZL~8uxP=bGMiTcqVV%nlv}&KsuiK`25Z| zp_r4dX0Y3EifxkUJ(931!rNH-uE?u_G&*?@I&WbyrHbAzv~4U-i{uRmo(<4&faHxq zfrGiPwE!0fYtGA8xbc}lJqIWLUTZ<-Xd94mXHeiX{U7NE!z(Yx7nUQ&OP?R-L*U-` zdXLOsNHW8@|Dr23+eWSM?)a-*-mg4yN2Z16U4?z`J;n|oaN58+-eS(m^!ma!q**j$ z+!x$X8=tubjT9>5NPC<+_g^mC)OTI*ORn7Ad?~h*&=LnJw4#WC zkQ^W!;z6+obM*CT;gxX__^bk7wFNj zO%%X!L~Z69Pgm!4GEK;^YtiDj|(>J`TVmXZF2Q?U5y zEO022uX{<~*3GlEpQKF&DW1!X0~vFeWEY2hgK_lHVIU2Gm0SCl4J6s@c6gXlCFV0B=?(m1+~_MsJuP4G!qps*7#s!8h{ zw1pEkD858s%6vU;@`YOZvShGD*3&Or`cdvY_ty9wn8Qm@A@ctLh0Y>738HUK9zg@i zEmV>mawJ~sOhcy5vzsYk4ni~rkp|OTI5hDd=*7)Xv+h%iP$V=p8GDvzoS*?cc>Ji$af>z>t#s&_Y9UXm%PBC+S_eyI0|a^f#mcJU3v>2Y-$@ zY-i$0zLd~Z%!$Xahm_7yG{Fl1#|?S_L)1T6pl4CY5Xcqr9b5Zc+Uz^6CKet*4LWq z654)?I1mh*fn6)OiSgmIpIe99d{k3NnWKW;B;e>E6Kg*#K#l|ws6z;{2OzA%ozMVR zCk+CvL;5YaFgC-JD4C8^@I<&C=Y%lt)3znbFVjE9?R-z{x(u_758>0G+zJjTN#oD) z8k;qqAT^F{MbbEV9}LISX`GjCQek@d&NwYRNtoK*q@oBwX z|5{{E9$CRzfl+yuB*Ot%pfM9nw~p74w+t6NgF41m+!e#4aN2XCRoy97tEYNSr#e-0IIK?7LfPUdo_(6bB~oiKV%dRPUukz$3;T5uP7 zaKV{SJY9-7EZW10z~j`j1CEHn<`yI)CL0)_nPJ)uLh{$3eN*z^HAC{7(Ky>;_pbn= zW$`GWUo6q-XoQJ=bUDx;FwuLKNed3tyY#V0`Fg_sX4(Bc##!jT=n~d|Id7sSx)j8~ z#YRXnJu*|2oW7f$olI*rnjH{u8g4Zr6_lL*ZtH<&)9O9K>(D^pOxrJDfziU~XS#{8 z1uX28B(PDMF!}nvlK65Ny7nB*tNVT_1UgKAzQnW&;R}*k7??e^(esvg?F9x~(udZr z9|S(Seg`%cJz;ONC)b-CxK4C`pp!bUJ7c@Pp9j30IjHN=J!bWr`8+!DXsVey=gsNc zxeKUs?_v~m|5|j;w(jS+V13cP2Sv$q|BVPs--@S+$#syVl2N2o8z$@N_cK8y(B`6CJT zng@+b!By{o9tHWs1eW21mt%WzN~%Wxrl69u*@Y(oJDqk?vPf6NL`ygTzGii5Vh{oU zvJ_rLM$R?kh{;E`#Rbl@Z7fQCfx_(c&Ck>1ylZb_QOb8ku!X2}98FbwW7oqtQ3?A& zWT5Zj9m6voku7(Zr=DaDuXyJ0P_TWt<=nXUh}8$d z>5z`dw&L9Xto+ovR*T`+T#|?dj(!aK7%cJqBR+`Shdvl2n-ih z<&l1>JWExEbMqA`BQ}4CGyQ0F2t7QDEGBJIMRNjnh7(W2`r|35p9XYl;At3e|2z%o zr^+m1q z%^xP4(%`U9KemaT9E2MmNx~Znu;t2HGocg}`z?_+Y&URs=0JLi)zwF!>wzK0?#Bp*`1%vQj z7`$_Dcq$TMp@dt;;H@)!Rf?tua_kAO&|R_u#O4og!811cZqBi--x3(@T=x+s!<+_0YT<;&+wp^J zE(LA1@6ybZ@Br%Smp(KsRl}xVXToYpsxzSlx0q%foobb zX+m&}E1Yp2dSGi?hJ^n?1JL@xJclBJkkX`AJm-Bd&duJc51t;kM()TcNzGGREq zW@xB+RQjTmL4x~HV|#oiq>mS87%5=c@iOtm?+qlMe>>};gWrEi`JL(js@6dH#;w*E$G_$Cs9;R9_f zAulNj*QLZc*5GLudvK^5&$Z)uXnWv@Q$N~+m#l0D^}9fQJq{Rp;b^XrfE4Igv(MV{Y17S=ILj3xj%l8!L z7ko1$Ra<=lsd~aY&_*a>$+hH(#~Uv}jDUYYaO_$Z{4JME4sm}$2d>02z??>#AZgjL!6LX-xrl#h8`akvsci1fbPdUCQ znY6M7=fC*SeL9-$Ns`|makcg&M!M)^1-;epb5i)+o!HwWT%&=6PbNU&g!qfo255_X zb&cAjMcT~z#q|x#>g^4Uf!c=pJbOk)s(+}KnUy_uT+a13jL+3lQ&X#}wT57zF&G%* zUsj_n^)*#B_ij8Cm1Aax@?Z8XD^ST1`WJAR8rn zhP|<}DPV7?v8Vd+-_X9T^G$!{LSG)COrV-IwROIUL$%U6U!~t?_c!{ywKdD_4fS>O zkIzmhL$#Y5g7zgrf57e!HZ}rMX{T!Sl}mhMhH4oZm34LY`i6kLc1dHMZ;7uy;H$PT z_XX%I0RC!GZmO@Wv-_Hw8k+32^>%N=k|mY()%Lntv;dy{we<^!YO^bw>T!{0pTWXn zS=j@Xi+z3&Cp0t%N@!91If-1J{mNATmG)Y~34pJqm36h%;JRr^Wx$?RUAwS0VD~kn zSKujK)I5WF5Ud>>F1L@$80DAMw2Vde(O`;HYwzc;va6mNzc4 zr&ik+Rr>8szCf^vOsE>ws)?wgx6l``FO;~Wg|+1g6c)X*FIZC`3v9_YtH1!{!Q9XQ zQFuj_)EmJihJk%)w%`_AsL^RpOCI0Rv^%#EDf)&t%VOINUdfBY@!TuXD z#uc+ewWca<%ItEj2>)wSrVC4Hs%gfk&a(?PXqdp3>S`C(-$8~Ds9fl`FRKl(VCatD zv@gZ~GGA>|H4V0^+WJcJKja#EDOA-4{H#KZnIHyP8hCEbOU)eDoI(HCm-k-t5HR^! zW{%S-BovH1-;&0_azs*5<2=vKU>ZqPwF|kO*|pWa88tP2AKHZg7qZGxl9r+Pb~QBB zqDKL^4DX`KCOc$RE7*ti)zmdCgZF~w75*$=Q=ry+8f;C2$BS_j<+EXI)Co313@fER zc2$1iYNo?BDwkv6z_5j5fhaTVUbYTWWf0>k;A;-ptEw8B?Ui0{unB{+Zn;zld{Pre zanSGc)cOOydJNkFd%bU&eMZ%77`$oe`HTVA3%6Nd&lJTa%bR-(px6YrT0%r-KnSDl z@=g)tlOIidOhY~671O*^V6O?*dr5d{>Gl<3O#7hkv?~`hH8cdqkbJMa)(T;ATl>(_&v!HdydOoxXzXoa?X2GWm!> zX%;AH&9IKSwHaCSGsM;W^pjU9kSNzexcT;$lL)S)VX3cQ!PVBJEm+QqoB+<0JV{EX z@=7WLi^fz|`O_9OGh#+gR(ASCU{6ZJRffEqe%<&yDcu&kuMXpS#SjY-69mzKM>|Fc z4=qxgMV%{HJNA<^#Y!1%Z!R!-5fUUzt*UGqvj8G6|6tZ>wJe=6nAR5t7G-4R*G|mL zug%Da>L&2fUh@Pc^mKa_W}?Ntlv+%ZeJlkct?k9LYO{ZR6QO9VGf{azwW76d@)s)% z`?VN)V={9Di=rFoD=g(&R_?@1t0eeVfvG5=Lo4MmDSazGfHDaHB0IFT56qFo5_(2P2{zh zFz$e33M{Mj`m~u9Q^sqx{)UY4<8yK|vQ&iWtH*@Q!CR_dD_>NJd0$Le>_~@dlQeiy zcIKF55CO8+rOB2qG%_cRpsCfGU|y3}DvNkGfcbaxWN|f4{w6u7+#cB@%ZDaWS<~K} z%s*PGEH}#XURgdQ%Z#;#|CRr!c?EueryF7z;bc>7GlJl{Ky70kW*hRUV&XFAMHyFO zVy4-j;sOp>5N*_QoYFrY#WX;v_B93;MbR_k`!Qa-xr)FvRp$>Zuk+<)Hm7E0Hxpyr zTxK>}K!pWmzPbkRhWK7ZMNR6~3`}8&0NllpJO0!>UQ*fE2;G5AiUHCwH=*NpQfZK; zbSS^d2M^(+=16DquTKl26aG9zQ#55ZA@&uaMO44+6@3Ln6DK3xl6fLR|0l^`v)teB znc$f9&J>sMVsT^3CQa+_s59W#if>+@32hVizx^fJsnx7ejSRA;w#komL>)p(Xj!vo z0CXL$GA7!GYPSb{L0?v$U0h`2!r}K*T!pAH)sHY*7<5e~0^RC7))f!!JQ>6`+x>y2 zhQ++VAS0`S?Nkd}k>i4gd_7_u1f6C;MN1hKkoqYKukyi)0=!(4%SUYj0%-W2iT1)^ zZ5=ro;XPD6n57EK0BVxXg^ihgP9+w9P5#j|Dmn75M<^wVjg^oI1-G9x|9&sbdNSS= zItlp^`dcl{T>jVrqrc?I<-Pz+xU|8~qNTV{^*4`<+g*&QF140rL^Y=R0yD=W{5l;b z;bmQadPKq-n|(%jg$VIag*cjG>w?tk(RNJx_+_4*aK|JfyVd_q@yu{kWL?i*fph>& zsaJ|eDJUoJKrRU4nVCHYY&Q1d%0Q)^J24urxIkHu;9IU|G28PxzPiEZr`4&i zz8VCX$J63v3p`qovnXUjCIgzo0Ex=bPzq)V=6!T`MiV-B-As(Jx@t#Von_s{f>KMS zss^k@d0lKD&&xe=or?t#c@e+2skV_-HnYA`F1eRkQxdcWqqLNgcM(DZm|+HG5%TPq zqs(ddy56n z%(W45&YB|o=(O}9Lx*dglDZ|@wHewHbfuy}!zzw{{g7!r-)N|>^%9`A$y?{sFdYM@ zif@73`m7CnCe<|pmI6D4NGf%MRm1} z8q5(BQP3M`Xc|-L*RIj#HdcBUBMmn{FAr(ThGoSKOVB{n?ds|&lv^xk3)O1qT39Pl zu+;Yl8XC2{ysBUz&`^(1RWN~I3DXJjfW^6!3cxAyxQlMYuNOAE*sMUk0T^O0Ijl^}}6Ry68&Wx%^gv?kc7hppt*S1zqx2(MMqFtf}f`C|Zz zWj@UD{(!uzL|4v9+d}RWxDz>vn67a<#j;UfQ!ELBKn+nG%PJJr=jBbIm>>Hq zre;J3{L7IXS(2Am?t^vK29_(h>7C}YC0NA5cGHKBPwJxrZ3zKMJY}~ka1At7*8A%q zFS}3?hA^^C1$P3$|59d5uoKZmCa7Lbe-&7bPunQ7}iy z)LCDxO@;c|6nn3-IeciU(}H#KDqEY5o(Z(lCg0Lp*qtam-3Bn8WLnUCC`@Vwv& zdnLt9l?zGo{99Cqut!2cf_#vM38lJW$@JioDq^gmI#}1BA*jL_r5{iEqS~4OUCn5s zf6G*PX7A;kh9<4p=WXJR5hO{?E9!Z1P)uszKL9sXzO1qlS6FJ5`4&>Hu!%c5MW*mT zrUtg6ie;P%Coz=xm_c+_UXgrCe1Sy`)yO-;BUaW28nIcV6?r8Q50;5_*6VDo1Y0eb zj~3x>9YS#VlMVRM{LHXHeAXjaOv z0u%X+8V%Nxt&uUn^w=<_ip`APhNuPN*-Pkz;|)klN~JV)4i=;|!KcgNn1{RYk{GU< z9gZ%Kc7!xU;>3n5uqn%H(Woe3E=LH37C=q2UrQ8H{b|~0yT-o2j}VB~KH5+;(f?nn ze}y@xBL`1AUlejy`+SWW&Yeub?g8fT8qGd^rpE*J>ai679ip8ksbbLAuv}`WLpL;g zbwd#5%r)Tm80KkcSR8ER%QWg57!|j&uIHOGr{6ez#_Z{HDJGe(+0$TYa487d$diG2 zmK7eKn1_b??MAAfqb}tiY3qiTS$FuFu*bvEn>`IV3S@L3E4(R4{GC)6GA@t|X$ABr z0$bYK6A4BUd;0AR6!b((3u~`?FPhP)|-%k9$694<;J!?I>UWWgxp2zzArT?4%Ki-6P zE$u(|T>pFw1J0i$UJ~l0{8iu$#qT4ye;D=NJxSeH0FN6Gul?+0yjt%6@c%{sFWP=K zrcMURU$mWwkR|)fZEg`ozzGS<&XZf5GPsbIyuqQy9rl=L{}@(}HE4aUe-Q$G+-tIn z$lJ`q!EqxXTxiFng?PN8fzz#G2a^2NkksH%OjQVou{~HFSY#OS z{{B#9Jl5E#`n~@Cu!C4ER#>ydCbK9|UKj$zEm2?aVUe9z0&UmS8#>6u14gp z3OLfhIcbK7gj60mGTx81;&G-by03VB)KoMT=xV-^he^eHp6@(M>;g%u(wiaW%w0~48rzie3` zK0GtZ%h9cJ%PnFpTPrP_Q91f}6J*N9 zghG&RQ@GAzcZF3JrDg64y!#H)wO$gGEetcvy3@ z+{Mlr!ZMuG$#ROFg)^s4g~_-}tX$1-Pj^>DDV}Qz+tW(sjI*>x%0_S(MGg^JQJK56 z!s9N1HnkFGg`?O};n2z)vmJ#+R#lCSYB^h*;`TTl6%}P}SPSgBsJw)F4_Q^Xr%yHI zMSXF2+*7CDG6TkK;bp8=esf9T3{Q~<@&ykNL$On^!ZtjET9-Cg1ParqPAzkrqGJV^ zJ?mA8X#>}x@y+wazxLFeG1-W+djB1&;kW~mPyuWiH8vs~gnO#36&oSKfr%W9Jrxy4(?67% zudB<1^PzJHby;*l$q)Q;!j7&h8qOTwOzK!_oMBtlST*?RKGLLhOqT(As*Wy8~KfUE`uk%=DEwsYlsC5Y;eGRWli3Cfc$l%KBoO zM}l=BS|^zxwnq@V1Zjred~_l5&&acqamWY(*%Ys@p^8q2kbI`hLDEm118QpUV(o+z zWni}&LgX0_%aAKSoq$N-l_6bzN9t&BO@no`; z)F;wdUKUZ}FoQTnwbAB(*8FoG67+(RGu^jT@y`@kKX-^WlKkeuK$ZzC1xFw1aP&}F zk4VCxqavA|XRa`?yyVkDI1fa_Ns1@R@I+PKpcYGN?w&Z|hz%$Tu)qf&uBsGLB{lXQ zII4oiEUF(toHiMQ-FJ7@nWft zY@}JHY!r_bc>}5MfJVF03(UG29WPl>-CU14bf3vDpp%`rK|>Y@bq%}_1uOUiH!Bdx z`CE`Ax1LPHNP*pmk&XZeYc?oA{?G_%Lhi_}O~4V(%4%f7Cu)d`DZzo}=_l1s&A_m* z?nAzfI$l6$km!$^>kFmW4@X?cFQHQfRvd6jdzLIcLQC~u#s5&ZM9_#k$XhTce1H@? znz&_0HOLuT={_7k!m^)Jk2M&KcCE3gL2OG-FXyd&&16%PLy=n3dXK>RHH^?E9F)aD zHxPv+K{fzoc$s05qDG@FL(xiY0CJ&Z4M*FeS;$Y`bk}1u3%gUIXh%8**(foWRQktW zhrHw%ujb8|XeErIXl;S@E_y+RicM7M6$N*jyyFtnyP#%$Yv*cC_iC6Gpp2w(asK$9k-c_N% zVqR)?gEo)XG1}Zz|9no>&;?F`(+~72Q`K4{vNN?_vuO4js-`?1j`#|hD_eop&;Z1_ z88h#Ld>_mR3hLgs9G1R06mNF5Ed^0IUXRC3*byVIck`|2sva z8k@-G@k$a-1At(?ACo1Btg_L!U4UF_%P4gKBh zw|Z`Wn3et9%*-(pcS31|Qtvl4Sx|6`vup+j!lhVX^3Ye?B%FT>LLqRK)i`TUr>~{8 zkQJGNi^e}KdhdZ~rZ4boPEI}sU#Xe>w>`D-4Ea*^7QhBX-IH`Exe!%`3J^{hO2RXlKKjsEjq?g2CXL-)MDPHX;l8u zzB6(K*ygIHA1qMl2b+cXw;4aQ3gLfb6u1P-Zrnm_fi09~ExWhK8=WR>X+v!_BZ^Q& zTn4cj+IuBX7Wur3#rhl?_BBD{;%7mnd4Y+a{5*xKy;szJZwae0qKwo4m{?Gyu4>g4 zn2}JNE|FJ=E98}5tM*j|7m9zujZa+BIto`_I?P(9E+9eNlN+h(ito~fC2_{0s1_U5 z)xk!M7B>G6d+z~YM^*O!pP5aEKmwt+O&|r*6B0V%Zc8@VmMy8kve~_xU6SlByBm@~ zLX{3d5EMi}suZOtyhspf0s_)RKmFEHXLk7N$ja zdLz16ePc)cgtTA%#Ef%N#yMHebQN%0_MY=skhmVZS~EwBzO)t$sf#TD!=^(Db~v{- z*p2u)$#r(R*5>3~>`?t6 zSyH5Ej+2wo=gY8pRX*6&Mk-|8Nl4-RnmAw6$gNp`3CwrM*g=O(J11tGlQPc9az;H} zeUH0z_rz`eQCI7aasRL`h_uWL%VG!bp-c7*-7TF+5B1J@`O7=~JCrrwD(eUJ^?Hnm zzpAfy^`H_v@bmx@<)t=xFw~9TY_{x@SsVQv3TskNb*>5OSfjd zC-gl*SS@%)Ju1udKM~yow=rRgG-i#kJ7T>hEf{;SX`H;6W5NV%9pKCJm$i0b#M;;* zW{PZyk3z}o1s6$vq2!o|nm!CCIg3NDt)8E6k{R5EiQ2*$h$$!p;m{_U0V)#Bf6q!u zz~eoq{SNaC^&bHh8_!k9R)Hb%g5Sp3TL z{26z;8OE4D=d{nVhL!a+H9`w(4eQoOHdvqFJ!}-!+ae0@F;tAIrbOh?u^cphJ(_Qz zsp-C8HVKk#32}30`!X^&L8*y1y;O5k=_OCiiMFw3HffqC&W8 zBjh7KK!k#18tL&(6(hnn?z?nGj*Yy|9_4s~cT{~n4UmMPZf~ov&*yd#2K1ESMM9$J zI`T)2Y#X_!NW-BU4{q-md$8q>wGFX+bh`VI@ z=8wuG8k2AN?@xGKIL*G%NPEWoY0|Ijw%2W~;mylUvVhn*EvSz9r)bdGTlJ%#mdkm+ z^kF}gOfbxQ%Wn6aUhxUjTLVWuOoN}gcEd|sl@~H(4;!ZmBcc$8HpVewd15!MitV1# zHa14_Y!t7_A3r|7xT460^Qajp2+N912p0E7$M|G~Zz5hiU=%xQpKKJG4^3oCeR9O% z5vv%*_ub2Qau#m4F%4xJMNd^v9`^jcSJrz1muEQY)DKhNJN>i6eWz`h$7>tO`<#vV z?G%;2ej{NYSGNT!H!IzaS@n1l|E{e2>$z{pimSY55`Ik-XMe8NSiW_vW7IDLb3s#s z(yVtxjS1~zuEyov&?HdW%e(94FuVv#$rWZw_26aUU51$a)Y`cULtW{EK=Q;A?2KSFy}$x}@}u1Q!` zN8xrq4Y`)??vDM(k4LSz2prnJYLR-i2g@ZHZl^SUlwWk*_PO_H$k$Ah0{_d+k2~(SvHt*nOGlIG@>*)I_V=!E^-~M zE0aqLykWCn>w_nBp;qfyR)tbdXY%mRyS&xSO0Ft{KeM8-%&D)!6o)6RC`wcpMV0lo z*^|I*45OOmXsD3IR#_k;RAfjE=xAGHn?U+28@Aqj3vocW=v)i1r#x>PSof!s8&ZO z8fxS&L>#!VWbIf4UB`|&8jm*owD!dIJ1D8DQ5@Q4WBHYt!NDTrCuZjcL&#gOVQ@5^ z*oT7reD-8BI~s8~%dJ8_3Vo~)X0MZHV2*4V$9joq%1L(GteIHa$~q7q7{AO`8@mb9 z<+LucyV7{`8{fmoww~BEPzEM1&`pJy$~XWKgdYY36t$y=77ybGX&k4dy%B^FCCH7T ztSyH)n86FD*wwv!QS4LQPM3q2YHNq*HUsEnQ^6`4s4+bZ^z1Dxsw^$?=G@U(vDu{n z?$-Mn4l6*)mqhS@+@Yz+jFi0sP0_q78UTvGGI9B%(bfvDa_Lws9)|4fmjQRhvK~c? zls%a|=rR_PNuqdJdBF#XNse{|vAEvLN}}9Mt-74YOvMx`J3xyZRno_fidUiLk^Nj| zxot_}I$13j>9G<=vsTNN9k5sm6*Ptztx?m&kK`+r{g81sKI6E${?Y6qvl>{>5plJ? z!s%!5Z>Xz5os9vcH6C*7@oHAJHTro9q8!1FVS<|Z6@}DK6h>WjX`wcr(b`T;m~BEe zpeckyEcUaZ8Tm4dmSfD`h|LErz<6=2hLpmUyAI?|XgbJ(d5~8T4OQ>O1c@OGQ+II# zVityYcV(L&(irl~E(s~4Xd9u=m3aASo5H+QpsStnab!CPxyzz5z&n{N^~NEV!69B0 zf+d$s#56-OIhD??E3T=muEnIQwywIujP;6{)2kEnU16f8xU{0CxT2=Cwv^eBX&=MP zLLt>?CmIRTl5Kuh8t=BQM^$NFmcD1*naxiWQyKIO%DN|E6mdFs4<)VLwUYbR)D={f z&SQS|OMn_}MF@-UJ!xQ5=iKT75N7 zEv=1R;2?};oGtVzYj1%5Db%t_D5FLRc&plJ$W;`8sCl`Jm~2%`Y0)aAQmu{PVw0Fw z+V*477|0FEl%(~Gnp&8Lq)}%=FIZ(0n#pp^KBCk|ac#W_n>tMWpvaP)Gux3@Ymv!P5VJf~FS-Mh)0|`{yPz3E#5#D5EAga0 zvxJ6Jy%{GcBfV-*wXxPuBa7h@x2xPmty+fE#T0>US=559T}y0(4K-&qi;|c@899is z69@(I)BL;?;}+|sP^GQZj89X$Z;+{OCzV!gj!VD9+mI%Ps4;S*>k#bSYWW)GClQ0v!bmaL_X5dU?`bIJ?tN{ z($IWqQ6X5cNXiDSF+*U^$VoB?SiQEqskJ?_12o!Ep{3=;x)ft-(}b1X92&P>9<^mP zsch=@MOsPmz0t7=Ba5rmd^vUU<$2r0Y6&CF z?sA^Rv0@538SIVX7patgg4hC`XKq`L(GvTl`C_ZIGo5B{BQP}?R11l>b{PsIeR=%)gC$j<)*#u71L`7AlPRl)+OEjtVtRrL7-V??^bXTkeJ0migeqCeySkG}w z!1Rp<6uk-@8RSXe0l3bo{iJsDYXLxebN4M!fZ`*Y( zW7jK0^NVd>75Q6;zdA3i44LAJK@eDB7tUw4E-aKOJNTonq@=X4w787tyO1Wv&V!2Mj}`{~MMOT~Owh>2$4v83 z1J9tEwh?MgE%j9^+yQZIFApD;X^(Mlnc4fbIaz69YExHJ9kT?q%FiQkhiJ+QY*!aU z$UZCMSuH2@IT-Dkvn@^z{h;w{3r^#@(RnPXVj89D3!tQQsaAhaow7JDUZg3-pNNu( zZDs7RI{?$Jgq0!-;N?8hgw#n!YqpK{s%08OMP#Us{QNR$1`woyEF(3y!J~^xGjwR` zM`fn%apL?fILbrK4vw@w5S8Owl)1Qlg?~E#mb^!mHMcMZGrwU3dv1?=OF=XRt1=i; zG!nc`k+z}q{gj0eGT6te9S#|b_5^lajx`2#Wr=FX^F*t(%e^@u95@_bdGSitMDv6- zeuA^P&oTcM(tuU!Vz#{`$U#fs7qv5v!KgG7i$U8VpcYFu)P-fJJ9=5%1lh8Rm@z7= zoQuhSQE6Sdn^8J_MntAW>$*i&V0Figf-c*47dpB}eO)qd>#PzUq9pYkivUiN2FTp> zQDHB08};WfV@!vTQ&vcPNBXSX(&gf<4nk$DM zcT;jf#DX}Z*Kag^jAmQAG*anT@rbpN$XnFhAQqYFp|-lt*4orpR2CJxLamta&Z5df z2u`Mr+WA$*Q7EfEB+E)95r~Y^#0#$>?UpLVS|N7$ zcgXNhNAVO)`j*s1un-U)ra*7)O2o65O>TZd&`tnV?J%vK*1kpXyRu()P3?_p=OQcs zAZs9z9doALf&3Wj#eSPvXLj|;xh=vBK1AfQO1NzQY`o;gn~`(PFyYHso(9{4b3 zmC^#%zBy?#yd0&z!@65}duK-rG&E#{8ric&tBesUgrO@dEYg(dr&iS)w1ULX%}G?3 zCT#f}Sa)%H!-IliCQEU|wwm8d(JZen2@BJ7CW2NLuO}NcfzCj96jhY9F2+!Kw$`%H za+q3ECrftd=hdpj^ho+vvbQTl(20o7mF(k6Chjfn5}9KC+Eu*ZYXE1l^iB&(35k@r5aW2!6RKSe|eVps=XtQCVL z6XS4L&RQ)ljPLh#TH{n>Hl9UHGPUU}&A_;-Y(9z850EG-iWBaKKdZdhce-TaL@3~x zGK8^2OaQK>+SWFR8ly@we<8Rm!A>snm=ZgRO0_I)<7_YlB?9L85V0K|q1gRA-FuwH ztS-7KmSoJ!IOhvh@L+bI-;7zS*1ygXN#3K z64_6bHVv0DrO&q3tV4=KdoabZr=+KeK@>u^+QK*%!$g~JKrhtQ7M9b_t$y`C>>M*> zizw_Ftc&J0JB;Y;9m6I8R%Pakq{C>Uvx_{Gf{Xce=N3jP6`zxpQb<`RO50Z=F3$WE z%+(vwOXF*sVEG@p)SsZ~!oe8D--(A}$kBW@*&WaZ29pzUN6{Xww znVZNoDlw-x{{V5`O~~iGPn^!*S<^(7joX;q;$%dMW2DQ*FWc>#2v7e!KCieC?&7TC zr;8e(yPaYpHoWbBnW-DBL zuF)upmK;)A12z)rK2`@~*jWhD$0y^K<%MWmvuM+eW)D1|XXuwqf>a*%T+=~1r?Pf- z42W{dxMlew(nc9X6OpHoObc3t49+V{&E<(vxVC=ToIm8+EEHk>#q3(+@*pV%J>oL{@kSR^Emlw~b@9OJOqu1Au zI~t4;W4eMQi;5yVWYTKpXEC-i_S45aw zU+9P^Xrp0~dwMlAC5YlwZH!7U$kaLt%BDRl+se?{YmSH$rRiQhS|kvPf+M+ebQf!r zTP5X$awLjY7M_Eb%QFpWS60QAw?)G{*`(AyiQl0@RV#>yf0!O43mBjJ;0Ei4 zd`zO0XVoHpnuzewIEtJR!ljk5p40h%m72=6q*B+S95v@${0?G}breYQd_6saN3w zBtnQqI61ZyM!=O;u&aVYX)UrS+9EDnsD^-)g^b1?dtT3vD@KHN=PNa?R}6-xOS=)VP2ZTYya^>DvK0zS-$h`W>adO( z%Pf?UiI5eDW$bMz-4CR+R*UMas*i z*o73C%8_p;NY0FiS3R#WNq`rjBmb|Gs-PgF{gUu{l53FE-{+p4Kqd#2hEO;1^|E!Z zJd5Unu4EEE!35Dh)K-PEaay-+z-Q$l-?l)kd?b?QQ5 zNaG+zsbngq2tn=VKQJUo83Bo|h_9qCTb3?%ERd~)D(ekAqTXy;B}q8u5mC}Z$sp2c z=6n8ifhWTz7uB{;w{;_twApi=XfTo+6gy9SL-dph3dL9J{;n7e@8nL$hgvms5V))9Yt9p!KDrF@7S=SOT zN1g8&YKYf;Mf^1Hn!D6Lw1g=(7%(lktQw%QsgO}%w&Rf(<5Ls|rcO;>KgQzpiK@E#57N>074%!7pI9l8T#2SForU&l zLZ;$#vVyfSj<;EpyjjM#THu8=!w`1dBjGfdHX~}GsmX-;9rUY+YLU|iTD-`YEk!_X zzR%LwY%L(X?rJn{GweoP6YS5GPbnhGQtB(yz$VPWF~c zv14U1aV4F}`h~|KF@L~R6x*SqBu4`d?~7$2`yIKO*>#D?+9XRaLdRBNUMsGav0DZt zRgT@(=eXAu-onpt#!ZSXkd!!%5vPc!H2GJ6CLxBEp+%G6ns>p5muSc4l(H1Pm_5{r zii+vMB_*CrvF;k%%A(cr6s%u_MUyoyDUPNM!eXbXg5sM-A+D8lqqgO+s@T}sESfXf z_ps(u-OLInu4u$5Ekfik<|b+vdjxw;)vb*!cIU}91O`m)bCg>2xz)I`Sxh%*-6Uuh zIkNe((!8vj4hNqJ#n{rlY^lW&Qcvd|gF)jCn>GN#JvcqzRmaglq8t}2%M z>Di(CFx(Y6&Vd;v7Rb3eIfgNHyO-6Ox?&*OU;cR=cdO8MxQ6zFl zU8EalRO5z~aX-+0y-n)t#I~+6Bkmeelb|$fHO|NoSyx72m1%~!=lB|WeiJT19kNGx zSS&QG)H|^zQU`>>r&p<}(bJ_FK~J&8FN=|aRZ&-@V#5l9Dho|Bxrm;K(N|>_CMrYA zZN5X<}8 z(gnr!Y{XYnTc0SB)wYz#&SD}Kn}wFBa#o!v)=tl-t5WRD$Zmx7llGYqJJXK+(yod7 zPQX-@mXFzc?4x)m*>u>;%Y30&}ShiD~1%Ekx-GAhFjBy%1qWQ-kDKsr3aYI++*b3Y)RjG+KZ$fjOhmK_>F8L-kZGi&)6hxsj{3 zw3enY1tr6_z6Nz=S-oyGA}g?xPcIB$#aQMBI;gvQm5qLNA)^c;BHF9unIqJj#bPO@ z@Ev`dc%IVskr-(k;{|=7DfK<08(~F_IZEqd({Y6H8puX#FqXw`bU}=HZG+iadVXI4 z(S&N!1l@Znm%lZkKs@70Ah1EQCPdXevahMGt>t4F?b_Wj5-^)EA(Oek&CYyLy5Km& z4XUB!QB^EXc5=(Gti7wN8ex$)aO+Vi`WFmvcMsomy|P+I_)tisM^qa_o|&~}2SyUL z`cA4sHTOd)<*a9ErbB|!FrfAXcIF;+COb-49%8Yuh|=l?W(;9Nqq~@d((FwpT|}El zXq!4wvQcPWf}O>GFuS*d=VE?D#JTLmEn8oktkOh3)BDhfAm{9i#2j!F-nzk-eMtM8 zbnJLKqq3-`UV}m6uNu!iCaT%PG!8SiF2^Swn?VonC_yE&OPYVkIAZCdLSuK7trIs8 znHbkHyH=+;HfOia&%ELqBXJ)_;;jBLb}o{h!kc+@NQu_%FbQN)LW@|1j|R!CWI%Z2 zlVpL@QaD?<>lJP0=;DJqJ_c69%UCoKkA91tF>CWP7KNsbpGzc$*6U)uN=X@*2?kn< zZkgx{`)AV}X#{UbJ5e+z!Q=@C5(#x3xL<f*g_ws zEiiqz$i(J$^7O(m%p4PtmbT7Db0QkDwEYZ2ptBnbK4)B@U+Pz&wb-R?p0jI=?e_ew zt&2>Df%=iU8wZ$He7}!0%#)Hx)gq{n*D_N5~(Yzzyd?J6YJUhw0$wN z|MZCyiqQ<|(-w%h;Jz9lrnHG20a$QF;sz@@aSVW{nK&;kI2QeaZ z!x31Ay=;|8Ki+9%;0TG5af*xcvV&|^H>Wv{Y1f)T3Fp+pGF?lwH5qr_nOp(V%kA2> z&IN&iU+@xR%)$s+VnP|M{V1M}l^u&f%+#VB6{0q-v9I^mXl-IA1|D>13(cM8WK$%5 z8=|;gy zYnI=cTpKB;@t*Z~u`UP=x-fk%Cj89Bw z*vFl$_R`Q5LuYhoKuB9BIiMzTk^S1{Ml6?q3P1WxmuLisxyaG1Zp=p+#6@W4vcz!= zpFF1wubA}mSj)f)Gcg4N(R{@ImY}e75nim01<){MqMjlKlIm)tlYOFUMkz~AyltqyTccHHWo%;(9?)b9 z0bNi!J$5or*=iQw6ERt(ewZ@Uu#q)OVLaY2X)&3D{Iq~%GHBkDK$^l-YO$t33SUF3ACXG3y6hLynr+3L+@cB9c?29#d)3J+_dXDKry zpQu5s8bT#3(9yU;vTdS7RyD#lp&u~{Nb@+)-lT1-py>IUam`W7g{l}SnMfVpN)~hn zSrtbYZy9}QW3w%Hv%vrf^Pzr3|bX!|Z&9)@LJyW%v2{ZbofwmB-hztKz;bho7!k^qZ~#{qe&}KOzlgYC3L;m z&uet!IWe9JZI%KPY@mXL_H9^dVl^m#ty0SFA%?1a=abb^2a|!eEvRkxg`nMT;l^sA zwnr@PgUu%j^-(b;ai$UEHN|ok8cMQpKaHjp^G0Xc$3Pj~GJVx|LHTx6g027OO`6A- zn-Dkvdq-Y-^UVQ^Guh%>xOe(<6uP(4#Mw-qr>_eX`;LjjC}Bh6vXR$JWU^6d^XZwS z6s1lVGD{ODg-y9We_{&;An3&GsQ+os65ZtUHGyzs-P_t_OuE0z;cyx=$xv?7qYfuGcwK1MIw>|*7SPh8F1XN)GSWT+$T@~!$M#XI#V)JKX>xY z1qN*aQX-ayAoGPxmnC`JS%jX&S4-Q56a%ACRwEVHYneaVWQX$KJIq&2BHtD|0Rx}~ z^bNn1x%C6B3#*Iv6+Xzjy+4D?*b(GsVho_ZOiJbNpqgk)iRopsVLZ4Z89$k>Y!(jp zYp$TiwRG5a%h$vsa(hLaciG@bbQw{*yu@*?EMz6_;BF zvDqqCAVpJIgnqnUMy&$cLac1_VdhpdW#$eBAak<hn9pO>kiQbO%ZXse(H@@Z^@vsh|a>L9PM)Td<47|(^-WWuSrPvXwBe; zfE(e=t$V94+g2fRV3{A$Ipqy)2w&JD5)%wwJIh-m)q2_kCK%B#$uL%0ZJJ+XnHeQ!iGK9L96S9m0ALM7C{Z z`VrC&o{dtYRJaV|d#hI~Bd!wmK3Xl}m!(A$rDU;MeP5PCM%Pv7`&F8m=T&O2C}yeB zau$w44rqnPD$u<+07kEIMUBnP@jNXl1{!}`^Cx$t?Uysc=jcS@3CVh{Xhb?Ni>!3n z*Iy?43#*^x$?_y!SfQi~iz9z)hf?{oE`h8QDqKVZI7AE4Dy!<@QD@Y~ zzWzqu7M|9ld(<6m(B?6C8=I{5G%=0VrAG1SwAr-uhD(K`c+viFD^{!+=XW=w$NT-^ z)S~ESjffa;#g6Z=g@cxI)Afi9a}p zQT4|sjqi8icUo9p4}a8!Ngs2EgsFU!#hh%)XAZW~TgaQ#W_(d$UA{V2B##76T;{(w zCH13S8MhaA!^aI;$H$zJ=^!`FK0u!-WwRdT_3v?? ziMgSxz|A0EU6{aU*&2I)aaZknlV}S3xh} zCj=)a9&cH6fuE1_UJ}?v*2J8;(0SpI50BXNcfOh)a3m6TI0mcI3fboDnyD z0vg%+3}YFf^yNSWPzk8q|H6OUfNt=K`$5I1scDC?EaJ;S7ZC14cTS?E6d{1 zINI{s?RR9}oV;?^lvm+&Uz=CLbvom*5)3Y%n!M_~*<9!3A+TYL&H|Uu0n;yW?O^(| z+!^jnceP{xT#MbFx1Hr$k$1Ga7@s4!YjRiOsyBaM=Ip#%@cEjhD9ihXyU`Wp9Z2}Z zyzzN=xbM0<-92tx-UIF-_e1xHd%`{Ho^+%0e(D}}uecw(pSZW&uiVew-`(r(H||5% zJ9y3I1@G`O2L;;)TLqg3DrL{Sk$JnDYg8~IFF)8R7@jvQ7#&Ow#ss_PjSHp*6NCJ` z1A~2o{eyyF*SxZzHYf>Z2X(>RU|vujEDWlH`ryc*Jy;nm4_bm_gI)4=&RY|#4$cTp z4bBdB%DW)=a&S>_NpNxSwcwk);qH2Uu+EC0W-Hr)cyE9v(w*9M&vk6z%8KCUm+UVkXP z&7krILg8%*bvGEwZfmHvAy94GLa}WRrM4qf+RjjDyF#7iLz(RaWwR5%-GM!z%tmk> z301Zy*S(;~6gGx3#&X>--AAPw2mLkyT5Uh*uPM+@)1b)`&|KxvT;@QS;X zA0l*MKY)+41N#G&t`0tKHgo)ZX8CgF`M<&6?F}baPL2yWmqYg*0H4-?YaZ#^8Pz^j zeL7vOafKbEI)b=9RXMpR)f7^dJ8WD?x1Vcvi(NfA?(dMB`+|U=68G;;K}~ zxf9%}T$S#4&L^7tWOuAP&0Jq_Ujo~$2H&mW{&dov0_O9n&cy!)ROL~s zi*cO~TmtxXSAc7;a$n{C8g~Qf%E8Uok?wMLJ??UMt@|c;S*~x``9?b{RXOQyAyql) ze5#w>ZSH?8-L?39)7|R6WvOlgUw_Aa8^3aQJJ`CMba&WYIhfn0y34J@=X-!sm4nZ3 z;;dA6yYG|gUQ4G`_W??$^ZicgzULkQ)BnJH?tubOh*If#ubs=?gO=_g_ap8fA>HFp z3FT3`C!rV0E#1>xUk1wEW6%vs^%UoafFF_S8B+a}bid~Qc_<8}dKP%jJx!{g;PR!-5c)DmP&Enwp8zu>V5YY()|^` z-$NIbyZ0>ZpExU3x%&t3X9rph*5mrXrQEx&SMWaWzmO`=M$z9%^&vi)Ul=G||G=mF z!1WDMr0Q+4`#@*q1^t38g2BOuZZrG_n18toqicVz+nBp=FpyMR;_d^Dwt19lt3b4Z zQf(Iuv3M$Z2VA=ZKHWgv+mdca=(<6;cLJ1Z*I;K{+W|h^Zov*gey|JoLxEv{((P{P zlzSA^V!0b>Zl7+rxhDnV zE#2PSO%BEd6U=vF5T{eBeSj&!0i35==)Qqc9SFU-U$8fHXt|pZ92^`39jcPzU(Zwp zZr`B59Y`FdQ>>LvsV2jh$G?5y!QY`gfaaz``2u5y>!uYh@TTF~i^ zBDXRq`kCtODKb#p$0aC9@q-ZzcsjjOYXNe z>R=b65QgC%%6mIF7!GxikL#ddXX5S3-7rG(nGbdacHun_gIbu3-(FA*%Aap`K`G=D zwih8j)gI||yW+PC;lqf%FR4Ubi~#>CmCgqSBQ4#27P1F9?+0EjBGuGj1nKr5_LN{x z&ZGFv;8#lT5&j*?wE#-R(<^)8u7n1dP0T&XS?B5~RV^X=K}{THQr-D(@1Tm%c~Ap; z@)NCa1aakaDCdbmE%6QmgG-iN2iBhpPESIGRN=#?8%WoRk59FP^h(zNed1H0t0vWA zQZ<9!=Y!*qBwY)sunHvI5sbACQnio@GhnEX@j)Xo*^VCU&u)z1`4%V-*207T+raUx zc<0y7Xj_R-i(&dTVEtoB^#xKLPpURBeG7QL1I)e*>Otv_BcvTF;UxTz0gInN>@}o1 z73$%9;-5h*Vf~ZA|L2nKi{N&p`V#5ZlIlXzjR=(L9O7RV8Z0 zFzIe3)2_ zQawtV{=rjV`X7OWJ!#(})gKJk|D066 z2gAQdx|d1wE*SaG;Oq5Z+qX&gJ|RBc>x8{UD&hIRlj42S`Ix`P=L6D(VB!=dxu8$b zD|ipuJp|kSk#v72)d%4JKY`)jk5Z+G_g7No5jOxo_XA7+1`IubG-2>26v*Gf>v_Qk zt{Z(Z!@rdFK}{zyk!V9Kp#RjH!Qt1A=`n!^9WJ8or0I347LY555#{n zF!k1i?i38QbUTx72k`lzU=Pv_1*eWA-6+HGdx3kEZY=3WBd77{hJbB<=Jq814&c_& z;KaR1Hxk^sf0S-=@KY#=eTesf8$-J9gU#=P-ke14dk}vgaPMeR-2q-dz*5}=jd~TB z@oP}#CPVP&0wfa!!7Nu0@!~~+ ze#OB|Fmf>*x_${bld0g_@o;!Mz$0!4_c#D>H3zs9xD|L1cma4D2xhHMZ3FBH90be;lE5n9 z9N-GzcHj}h-DNz3&=X=|M{AOF>@JZ8Q zpON3*jA4L2m6FeQSi6#ZZO+QGob|!ibdhW&9mm8P(AMr)Ijqi6Cef~~`Fs?UP1vQc zU$x3Up)QLgzJ{qHMoG_>^CbEh?pRqY=cn`BWPTVP>|O8ePqOp-$oN=0VhSHc_n%a? zN>GoFOjobx&MxJX#b@19SDe2-3mCO5jbWAdnMRT52I>P*7ijJA{s+W;gN~8z7j?9y z)^5?K*fz|+?EDpMRF%xfG)gx3_^EsFuEvc__aJ*soW21SvjVE*8mO9UpmEOUd@=OR zh0sBlLk)=v%Hww>6qKm3bD(N20SjCJMfdT)OQEAK18;nE%&Vd9upxoha!`3+;LNV~ zoKJwRJPG`AGF0Z#NSk`0r_RIwRH(+)(2JrfvwvIX+$m%*^2Y2K9i+~^&)l5?b(y)# zxCU+DJ8c7>4(b*_f1U~5xkD5>yhp4p)AzfZYa2W7VdwUASf*ULhM0c=a!K9s?Fo2L zKAz2Q85~D$T-|MhRI&q}V#AOjNH)(h|AASdn<07KFm7KspN#M5w7a*twol(@;%wTr z6uD(~Xq?-=`1Z>Q>63GpohI8oj96Q3GN$;G#hVPx&d0m+E$+5aiV=3*EuDTBT-({* zP~_JgP$I2%H-~eHxw3Oi;8SS6Y{;?E-_W%07LjXY+Gpb_{&&9p$#npH@h3~o#}oJ^ zfx1nkXoMqFoLXQUFdkrqtjXg$kfvvsGZWgc1Br?J768+Mxj+S=n3aI!*Bzj{YR)^G zy8}snoXbJDX2GAv_qtZ)+{GdF@TA3Xxd#w>1bnae-#fY<38#7>?!)YUBIhx1wQ*WZ zRQXK>CIhn7=y^cKF{U>S(uHd_(pAt4_^9}wCQSMD2Kr>>*%$Yxv7O1bjgfs!Hpo^c z+g_%pt&HkA4A>pm0~ijB07e3z)HWvDE@o4Ys2%2@nzy% z;?4=r`jgiSBKr6XxOWA8r{A;;w(#i{FRX0QKfPAbcOIpnn7**LQ>Wf_JbE z`hd=ijgb4RBzss4{U&%53!*oIUlacO;Ln7-4g4bbW$bDJPjL_D0l|I2 zI<7wg9>uolyTLud!@*s_x3On(?z_PKSUov+Z}6?)?%?*|e}eA-w+7z`?g;t^H*t3x z?wg2lS#VWw8P_YZmAcy8mj++udU0?ba9Qwm?#{uo>ayTcEUeZdS^QFPdT;_(S0@K& z1}6sR;yx$%BJR_DF<66bFDQFIo+;!sW!osVA zm`zxDIky-%l+Xo)%n#;Z1=bwY1c&oeUj2i^xK;smfGopw@9$;?Riv81xz_w#R~Xmg1B7oq@%jujeO=pBwA5l$@K>N8SBvO8KZ7{5R~sE%5Kz z0-6#1&(Dt^ZTlBn{%wzDr>Fg2AD53lUfO(b`RDcM!;nc0<0p;%7^DT`xXO}mBG*Z# z{U3&QeF_}?KIrrJL+W$@-2V+&`OQRnRt^<9%^hNveuYRA*s~J3!5k>l*+_EuUava> z3B@94&N?X57m!?(AxXQLncx2oLi}5dc6%8z%68jjPo*NnCBvIJP|tga^#!mkjEF1xn7JM<~(w1 zCHJo&J7q6!B&}aY-uhJ}vu(&|kA)__1gY$m=;Br*S*=1IJCibI@`SU2r}6oN$#egR zE_pUOO_-i8`&oaUe$vCBspH?H*lE3p4mL#& zuRy)tithDZa<~tj?4Qwv{*Ihpw-Q|NhHJof>P_^b{h`I)a*Kk$K%2*Pxjvoe58WPE z{7k~u<`A&^WH4`kaP&S<2NSUXY5}(&2Q6?i+Qe!oohPA|`i5@>r$KACLNh%DCGwl# z6ll{gKy9A{t(XX9gHZ~vp&twPpwv&mqWd`PxmRP~eGGKD=<%b&m+vHjZo4J(BJh?-iL*ULSrw0nw|$uJtwRSYr~qbI-CtHT?wUK z9+p8%&&1MvhEdza(94C;(9^IwKPWsfJRsaZ+z(25pKvPF^xjyePYNeOACHH29t(v$ z8cKRkXylRDuMdYt-W@CUp-{`aK_!bq-YMKM+#%c^d-rXzdmjSzycJgIgP@JKz!rY< za5JNy`#>A_f@+5B4qccE)(0O#75@X;SoH8;v7~x*$fA3H41N3r6!DLO$DocM!HWOk;Gy6_ zsNx5pdG8DEh3fr2^zHYceAfkcLIvLrUHcuQf^UKTy$R~~o57924bZmNLGNB0Tw^ru zmBAIzwU>A$2QsOt*KK%llh?lUod>-ox z@uAOPf$=2v7ms6y@d%b14-xwZjM00s^7x)vkKT!<{|@+R*_z&r)#;5kcVCAtXsub~ zG&2h|VBFpU|@AS+b&+z}stH&lAo<)8CU;U&H^S^V#JS@%fux-~l{%wJVA`kiM z5YAheOZMsmk#z1t$Pik2TjFoWb-VO$dt!QQsIx5IM`H6e3Vb()yS>10lOsP_we5v_ z6gW^Aa11z5?uq0z#hn)Ji*EsU`&;M)+!Mfv!iNWe0r%y4Fn0%n4-YiI1G!HSB78Xw z4aOAQh2Y18o!L~0*)#!u(VRLHELH{fktLkYRbYS0>1FrVqY-D z-i9T{=irCo5oXvGtgz!Iu)zRuVc$=P3;vkK0>42X^3j-}CmwhToV+ny;4wi44+sm~ z0rt+u1i}M1Zh!;6ZZeIp+RT4Jde+aL^EKmV=KJHA@i#r+FSEJ66-pvA-!EduKYXLJ zeKmAP_KcrB-xolkOk=*+Y%e?GeW6lhqdW;pWdbxz&)I)C5{TV{Va)!!+04JOd4G#& z#_tc^qgmh2_znv)&G~=B4(%`4w*8q|{~fbz{|%JXo7l(w8anG&P+z}*4%6)aGiX-L z{?9HhECn`$4OZg|3%9?qGD3{n2v$E3wIjWueyLK!5DIb^#^=#lR=E0~?C%*A$=>I1D%n zI0d*E_!e*<@GS5a@F6f58?oWQen2_U04xX204@b?1s()m0Nw@yY{j+#_5=tu41#mm?2=FrS4$vE0u^oW1KmzClE(iVs$ZqU0pcEUhMZmGZIlvXb?Z6|z%fLH8 zZ|uW%0LB6dpblsS)&S=L*8q0{j{~m)?*aYmXh&coPz=lmmH{UM7XsGfNVrzy1R@ z+kD^_TMin$)z(9{*>=0_ci3^Kop;%FxBQ{QcHd+8h>@fA+-vlhvE#;1m^f+j-czRT zv+sWUA8_D72Twbsyh6K0e8e$l?!0;P7evRxg@+z`=wZ=u_~G>&M;y_xsPUtYru30a zHh;{qcyWszt*xy`_BfVoqK+^|Ft{FF20@++!T~f!zy5uDyP$vXKK=2ai8%W7>%+fa zpDp_3*&)APy?XcVWuXd&Q}+4fNxMX{o=0!OqXS16_UdIZdh0+t@DYd1%{Dkz@Wn0H z)rl>~Q7+8utv7hgs-uav$I#t3h#Yww>sI#}oE2DIWjB0irPc+#(4A-#5R@>(;37cN z(J?%_`d6s&X#YQe%RkI1qd9di6@+VJiLoPuwooJLe2yBS1)pI z&2exC>7$YzAdg(Kba8WwTh!Q4f5c&j*GY4tU0rsjZ1!T&_A4BRBnsFS-%X$4+?;vt zv{O$x{R>0U9XS^EXj_%NB;Om4bD1LBJ}z9et-=uP?=snq9yh_|W6-kwE^g-5GGl?N z$URaiFE!i?-lGnFY0F>?G>W8#w;2H0Q8h#EM`X}zksnt-iKTds@-5h?L(%lm7 zSG#*sT9@YYN`{%*txG+K?>)#=e%foR;0dVnb*W#t`%;gmSVNO~IsJsbM*jRa%jeo4 zehM`E(CW`3v-zp@jTfSN|Hb0{mGeJ=q5pq_^vCzE z&GRHFRSZ3;+DpIR5gI@Hx|EB2uVvP}menr!eB|Nt*d>@k%=ouWmU{v7ULR~CA4@&G z(R?Oip}T*e)}F}NyvJJmev{KrL8sf7HBFP<8L6qPqdXwkhqs}%%W}NvekYwk;}{?RbM!squ_kH%z7oW-$5B1QD)BrtxB(;KWXNOwI4gcOZlA-wy>x9 zw)M~3>7REX<=>52Mxl0lS;tr$3Lkbp+}r3Nx5b8`eIJ125E}qS?L*Y-3hFhG zRXuT=Ug^$cgv!c$A|v`iIK7GRds@wUJ!5tfvck!npMZCqjO_5ooFz$oj{d1u_$l1w z&)_vD@q3Y0eF>gZ@~EHFKVL;3@GJV`o31Y_qmFSqA<^6e+2%+jpnD?s)EcH?@WI<5 z)t9#8WVpvukh|;^oXM)8v*9aGPfdi2o{D^Qw?Oh9EOOkwwg%~7*@#P9XZ!A$n(b`*_l9|7#$(Wh13E!OShSQWX8OFGh<$NB|*SgJOXOm&)=WCjz_q`MrZu<>KMJ6=yHVH+se!J z?TKUj*vXv-u{k7>a7;W8DvxGppAkJ~nB2S_(sF-Hg@zM8@6E0DW{`b^+Zn(? z%}czy);5F{WZBmEobs8chEZBmnlj{HgTLO4ey>AY z=DMYsOho=;qgZ+ya!(9KlR9CLFdyZpe0~CWn;`!zV=Y(F_659$T4rvQGz&dNIdu9M z3$3LUwC8TE-RYY7X*Uk5eXK;&Ukg2d9hAJ%D)-^$(p~P6oqKMGa?JQV0S}8SSfybQ@Y#3>OC^3;jV5YaWlE?ht@88mhm&oT|MR##eXm>pW3W;@p&DV z<&!;PeCSd_+X6pgyiW=aGL_05F>y$It<5Si_DiK=u5KWCiuM%cnM!$TGZQP7%8YsW zX6)&7H#+D!=2Iy@=2I!j!*ZV>)Bf=j`1arM31+2hti5fj8F6a=|7|T($jowQrj6H9 zPn6wDa%-uu+;;xg)>7qX4z*?OILY*7jgw5wS?~dVoK)c(x8*2{kr^kM_}MKG`}(|d z%gcYBQ_=-3XcN0XLZ+|qhvbxn26f|`vTEv+rBvlkrdb$#1zx9e`B z$4uR)w5+D7nRIS`QJq)q6;v-g;>b~D%}e^1EzwasdU4B=(Om5qJ!T0vqnFgx&CV)C zS&u7AJjs-^^zGTdjng#l+3QHC&P;zCL7(2Ge67W6wF-!W^jv;R=CPBWVn~zYu1vtl# zA20uO!rCPZ`u0UTxdgAolEf0V`rr<11c2eP72rBGy3XKQ12jbUalGuSY!6P3!q;-W z0_ehqU=lU~j{?ik|7#zaX7vBR0S-pTFFSy0U?{r#8-VwL7tqNo-(PXfN8dglSPA?D zn1HUm1UMA92zUlKZ5}ooKrkO01za~9(ECvI{y-9V z0eA~o1z>p;E49o+L0lo%&ANU0jHe<^G)C1=L-vS;7-UfDBygqdR zunCE^wlPg|WlIB}7*C4n^vB0(_`gJi^Un$| zz3hu?zi{qX&dWqU{cC5Oa^`87`wd(dg%_W*foGP-SI@rWf~?#B8|P=WFGv&=qT#i9 zqzqews@c^wwRPAO%wMqZ(8CU|m+?STQj-_@;$>~^9Y=NYF|4CktXy@>v8&e{cl-$_ zo^)sik3aFmQ%}an(@#J18e)J}T=V)j0mbI6RtF$97D+l=15`s(P_XN$ak zz4~}74R6koHs9@xcD%MB_+zGT$XwuAfLc|2h6CbdB(IXoO3LK9cW)iB6w87(G^ZK;rmxvzY!P&fL~8Q{ zSJ}AtMjPB0yY_AD`#nR@A^P1)^z9z$7QB8^skB1>EZZqb-`I(taZ^t?i+V|(AnmHk z9m$H^{=D8VVdW~_^OLk#z|M=(BZa|86~J*Ppzi>^3p|Altzy1U+&^%A7U=7n9@qco zxDzW7jBVh?<71%ZcfYN)&^I|AW_{D6tdRN<5gq}y2)5*WhP4WIFm|Yp4$a{QXu+Pd z^&1W?uXFdx8;g#=asIoxKiNrpxcDR1=*9OgEhmzV@5YYH(Zz*4gFqTAZ4-u-5{I+| zTe3dIYv!ac)XEgU6O5j~Ydy8crc9Wm4SmBTX>XcM@>^!7;Lynb3jMKk#j;{}(KN_> z5y>p4hoLd9VZ}`an%?QA+m#G!CR$GCh6cN%O&%VMi1f*OvAQPK%E|J2Z&uw*#SU9v zC^-Pj?1Qk+)=IJjYjX-&qods4XB=Z;Ia~In8`{Jl}%}2s_ zD3;z@dwzBlayG6Hf%D8~7``W4h}!lfbDhrl9c&f8hqhVA4rtf6V+GNUwnyl$!T*@= zm3GdYF2$*phj(*TK3D>J>6zTByah{3=%!%ll?{Hs_ zLQadWBhcUb9f9O=7I2vyIY%lbO=JsJR;cxa?GX+S zf1vNeb2CbQm?1pNWGc*t))@=P5plNu`x0!e;>vDL+XzkP4!Odz0~`u zf21Y>!bmVaXNwf*9-Pjj8< zzE1i(EsuLStDN|^liRlc+J0;M<@H;)*`W2xf4J3U(0Y~pWGa8_r%54y#riOnXL04$ zZ!B}QzE(HEbPNjX`J3V{>px;Z9_dH+R+(%2jdW}Ko$DS=RS(+u(>#(W&LF<1XjvjJ<-W$A& zecUbKzHZoNPi_9*=1&cp6SaYFrTyJ|gLWLeOs#8ECN^Gy2YUN`CI=rbtUg>Z9o4$&rF?`dJZy2HPo~CoX;ZVw^IwZ zz84&^aO+}zJ7P<)qkDg_eDdx0O6rxAf7)3&wTjRYX+Zo2ee9=Fd?_Tgu#b9K6>py&2;CwJ$owr2cllfYj`RqB8XJMb`xXQJ*-|zbTW2H*ua9^|kBw^i3bhE$-L<}u>-y9loVRe_F~4)5G#4^2kFcC}bI0R5!a{ydx*0%j4UU0k zc^!;Bi#5-k?xoaAshwGCycCU86Pl#=f@9qWsrRsQI)VF+R1=u0DVUI&fDKv`^z%tz zj1%dxOH%=9j$obfA6S>%65QqnhHJ3C+&=6`O$n1hWq309YkX=v)|OWrWtwYoC0g}9 zD3Eut;}fOv9+ckw?vOAMzL0t$^?=(3%HjvmG_oz)CK!_%gJ$PAR}enr28R<<6H|Y~ zUM&?I0zw+_6iz8Z@czGLXU-dI~GcA3@fy+bmQQO#)qQnjxoyjSSZS; zpmyE~o`wdv3R+1!nLh{SlpXH#z!K=X4_tZpg4-u}DK#GYV`u1^U4u1HNm@%UOS+#E zFGJyEyI(QOIu~5YGc3e9YFE~R=Z8aC{kMB~9J>7D*gIz+w9i#gQVXCgwxI<@2Q?BR zT4)BAW)HJI`%U*GYrCIdW#i8Xd5I^!&Amq4Us8|vSsT7N-&Fe$E2l7=6bue;qxPq! z^j)>pZX|GW>ZH`cxs)w8y&N*je7I-5bF*S>YL{r}7=Gry2^j zp#^oUaldCpJ^Y5%!_#LwK%wmv^cXnA^*z9nahhPyw;Sp5gQ3BOPjH+?JkDk3IWcOJ zIFFurdjC!58Mnh*R$DzWJBRVs;=|L5jy6$DAN!3cuHt0gk7D}RJ5Z-%XooFw>UK<& zTB$UeGRGRXBV+y8$ZtPV`Or+>aa@(ZhCRh}?^{DItr$Mg{500I?^JyF`YL7|JAMjZ zn`6^;TEh-#N_8wT{gddd(W|s^YM+m6G1sumn&QWYu$-WtC-HU2tw|;arO32zCVj?F zE+0SpO&zCMc4&zYIMYJ3EJy*h%B< zz-#Jd4XC3Zkoyfh@OLB?$+iXeR-v-#+Rf$n(1uGY6iZ6{s{f3o&eVUJG{~wSof;7i zcza|CT7-G?SS^J#Ane2beEo54mNPbdvMtT;x6!-JH*E+e@qY1gGPsXz~^-|BO6+5 z_AScsKWx-wHPYwXW|hHz+bpYbKY_EEy-WYwW*^^BjbU$#WV09eYw>>u{>pmrPdgI( zWTnkGuSLEZ$yVv+uQG58~JO5Agl0NLz^ZAUT|BUu14Wt``o(?|itn#1H9QzT-}3Pe|v^1kPfQ$aB~$($6gZEUxoh z_K-Y}UB$k{o{|@`x8zsYWAbA5n!JR)-Y#Y5vCG+k@`~U}c3QuhT`8|+cgpM7q3j0s zDf=e7mEFYdmA9~8`?qbUcJ1GO2m6}c$sTccvD@X{?0R_*yI{#5t5)c2BRrEbVK+5 z$KLtCMN#bye^p8{A}lI0s;$s0Dbc9VP|+x{$VjO$u|PqgRzO%4ixQKRjFO5<6N!q9 zij0biii(PEWMo)WRMf>T-D^endb?D{F3$V??aab39QyM-z0arTecL*Im+$YKGv}N+ zGdnvwyW@S;9vIQhZ+ZQH$FuCgwy)n(Q}gdu)2`pGCbS~SOGM`TNyfXYAGxOBnt)_9mTTPe$ZZ&yFe8JHF?uaM- zZf#2W)in*=mzlRa?>6~Mv%s6LKdm*%HQ|y&HBQ#N-kMZ-z2{V>4wZ8%wqH1>B02tN z&Z&6YrJw8h?0pFA<@cbteNS>7%e@}vP?nL4? zex=Zl$i1Fu8Q1=malIsWsN{E4`HTPbzc<6JI4QT4l5!pW3gdS`U&)&*Jd0$G|dz7x6K>6l`Hy7xyPjbiPlz@ zx0t+XB)JMCk2^NrWE(-Qtt?OeUGDie+qP(k{FUeVOPjr43QOWi_$4&geg z8@Re(?jj*M_5borXRdBEJ=dc*@$G=EjP^Fq_k+COT=KT;NoswbBx5~^-@22rla}dY zSms>|}*I5=4O`~UW?}=`fF=xp4Tt9onkmvdC(%F2e?#Q7Za<%ODHrtSCeA(?M zzC|YACqIIJM-Jg`0G7w$CNpxV9@O1#WBjC~`SGIXw|duI8NANjo;o${OM|kEGSlev#eX2O&y&lWSL*(o zQBKqP;@{&A8M>Q0E9pzu|2>kcY`uR6a~CJ?b1C@)_iOUT1Bq~jH4pFl?#mg0Kg1~8 zSG$zd>yF?qA$nQ8Oq{2lzLxQOLzwxb1>EII)8d9Edva)++yhq1%%k?c_-?L{)--R+ zBrdg2V$9>X6PEn#ef%(F-q3wR=2KQ`mb#OB>y|uv?cUtx-s{e~483;qnx4lM;(aZX z`mJkPmNEF6_Aa}RaYM`aj8Z;@?3r|NWSs+7FUYP z-{yz+nsE80U-=bP?=L9z<>{cz-;Hu#Lv#Q1Tr##l8aev+Pqq%9A-~)|^O323EO7h~ z)ocI2W%sr7w{At|lHTWK>^lw3r1x90-d+ip z+8Wt|>gFBKciNh{OPZ#=&z*ul;Ld59*4l5&*K>a1aprx8?!7h1U-wdLDR(s1Bl^F; zZ9N_FGuuG_noi{|bg~55gNE^}|7_Ej{qwW!LQi=;r?)2I<^8+@FCxF@Vzt= z*v2**Vf^JicQm$oV*2>#t@!_OeDqO~@zKXXA0HVNeSCPA@dv!#L2v8-jaeh( zVV*VmlKN)JR(@aQk9YmYpW`vlCU;@*{*un09{Z1car{avTIv^*bp22kV9 zTyiv`Keqhg_oLpH3i}_8m?Qty=lZ;m(pyY-Bl_cg166&dMcVD{fgGv!-B0O{+XM3% zo&M|dw;pSoYm$+$KKh^0u}00?mba$C&giIX@@`vy*5v(e*Pr90&$2(~llPYr`?k72 z&epQI_tnqay8r4H{PQ(=YyUNSmH%E%-dA+_{Q8go&d7WOvh;sJd%dG8>vQQJ{&?w+ z-dcU%=sj!T-A44WHUIU?&-I!H&!>Jh^5*Zq&CBP9gMU8yXHEL3$<;Z3j+5NGM;{OK zzy0Tv9+B^zsjk-eb3WG`|-ez`@;@DYB8_#YZD^02@o zjy%e9o0MaZJKlSzl(F0@CG@n@$Ln_{(eH2~x1Hzi@xSKg0!y9C?=5}c!H2dzT={6# zDH|yWr@M21xC!CGxy4?7Nsn$erM;>`qvxZ3XmHV zIF@d_vt-k~rCT3*s{S=8yyNYrt@m#I`Nx)uZ4Yj(-n#9rdo~$&HQ<&8H?8~2o27?7 zQvJfaJ8ml2de5fnv~+&)|JApv8{XKl^{t!UoTT3ff%_kRs=BNLvb|Jp~2&|3Xju%F3QB+q!l0!S7br)W5#t zu^rpWHoyAz+YJR}h4;Sy(KQaomJjKQv?uN59WU>=w`|*vSGU%b-Lt9mz_RLXJ1TbR z_l0Qrpse5}YL@#e6qIe>R#x_ES#9->7q)FVydZIbql{tUvBUSEEl-ryZrfbeLQ8fO zZhLM=Va2wBiXFoWN_UiH#BpyB(hL6kwSSOKJ5>K$Tr|(;ld?&x4SyGWkn|+!6~lS! zu<{+^M+NNHR+1$4Dg0Lc9=TuJNopf~McPN2c-Vd|hV&4rf%FAQ%GeI4O{6PG>q#}F z-6a1&?sq~;Bi%)Mjr1>4@Dbd1hO~n8AgP(uLpt@y{o3WE0@9PD&q)U##r;%BsiZqd zuaG)PM+b2)7g7$Xob(Q`?X6*H;^79wUQ1vmj08jA{CLIC;gpt_;LHSDAH2Wy`(ouU8EC^->=Ok zT}P@UeLxy&->;1)C6aC?Jw*DNH0}iMn?v$Bk#QlFki6^Z1)je{`i%4~sfYByN%TL2 zyrUVvF}RcU{D+L)uQ^Dckp4mHA`LlZzm`OLi*(4T`!y%2k#zVt?t??Rgj7QMjC4}y zel49;MS7n!=Cu9VOQg?9XPmxYyO4D7c<#qTx`>oP+DNJPe@BvkcPnq@AP=(!WXjNr#-dUmHa_ znG{Z%PMS?xK)RZ=l2kyto#Y+MfAajiv*<5LTn+q`H1urdBxx<_C(>~d%nMQ)=~mKH zq>o5$(g~B8ccg1b_mP@N-;jbP@7K;IT}E0?`VZ-$bM)oxfG0-o*Orm)A-zfRw#mzH zaZgU=-bqpWwGE`lNIOVBl7gmFH)$?O@^6CMNxn0f>!hWmH6)4M1|K5Tk^G{WYv=9P z-XlqD&P=ue(rVI!q>o9%VwjVpd88Gjr${f8c9PsADRGGg3F{sEe5|q)SK{q+3Xp zq&G-kklduR=yP_eb9r`#J#)D;Cp{(AzIb`YB4>JLhAks?r7b1Zk?KsfElG7=Iw#h^ z1e-H+$r4BECCif?>CRQQ9A{?M+|1<}DLJ;BROg)3CF$Imi7yc(I~?bG>yke%N_D1X zrq~>*IXUrZ$r-lv41S$EWBJn5>|_>^o{{d%TzGZrBB$qRa&~s|Dp??Rd|F6t)a-qh zmcH2ONL}o-<;b(_^d)KLrxR@}lCx8n(Y730rXyu~N{XOQ$l{%{ct_@vbeff%L6h{S znJk9-GM1z+GoCn7GnP2hq#0D2p1jbJDh)9|cP3{OP0h{9rd}Dfl;v3t>UDCXsuk&} ziyY}$wrqKB`a6e0&XnxrC7z)(p2%{0+qRS?d6v9%Vb1b}dZTPh7iMOs@b99uY}>-@ zmq5DZBb^1Gd*K@YVS&SWM*bj zPipcty((vAx^q#QeZ1WhyULNeBGoZE#il<|9wXZL>WcATU0s#6+Jo-~Wp+A! z&CHU02wUG|drGo1*`DlRCa0{jFG*jKnqg07Bk>gCpV2v!?bkZe7wYTDK6Z41V ztFrC0qU~dir&3b(aOvzauT4#vc8alpg{aKa7fqJ-re1SBH41>+H4lILm!U!WLcbfCmYtUjBJC^69Ssj%QkkSB8e(+8%@$K{%J_{RRGi--5@1)!~ zn{5pYf`{MLt;N7oVG>*lbKzTX6O6u_df-CX2=ie(Ja|*L77)t42=49H!k}Xd{fF5w z4c@l3TPuc-z)E;r8RcODY=@6SZdq^hyN~w6I2ZxbVH_-jSumiSdSK}N^dCM0+u>0U z(*DzJwx);459d{qAMSXB^#_l9l>9Ipw!&i`>(=(cnkveT=Qp^wvphJZnsI}3AiGan z4lIO)upB-DYhn14tUuWC6zvYHgK6;X52**< z@e#|1yIQFSe)=)}h8>?${tV`48|{S+pV3~pZx8Dix?m$b;4793!{9!62@D8ld+21I zz%##PoZy&$vR>e&uoB(?>*2ky6}|=c!Xf|a)_l*T++OAhTn=NP|9{v%V00Jlg^jQt zegRwI;oq}-m;+Ixo1k_*xyz&Ry4-fv4c?xfb)o}Pe))PD*?twS`MESFs-`$jl zSHn2?5KM#LxmZ5*bF-e|mvAp!)Non zAL`NqCUIYZVJZh|L|qW$nQ*a!~_rXMg2+NRiSQ(+KH zg<m;g^cmT`cUuo(UTD`C!Y)B~S|d*JubcPi`cc-jLaU=%zbCct=@1s{dQ@DMxo z!2iHTcxHN=Y>)aEIo~Jfsc)+A2S&53G@R_JcIIZK1_pm!+h8PH^F1WSx@jz*bH~VJ#Y`? z2H&>PXR@B)%`gI%pGCi5as>T?Ps3t(;3VpS3nx<#d^pmj?S-#G-)Nid8)%3AQ>X_H zpUSwx_0wnv92!M=cs6W=&%ix!?F`DDNBhrbx$rxf3on|D)_%nRs-0W%rrE12&vcRuCdti`k! zRxY8x@Pag!7sLF7LGYk-`U#7!X8hqjIm{pU*b3^0FT+;23+{y-(03NggLZiDO4)Jz`w#I=!UuQ=xZ4V zcowXLb74Kqg01jYxEDSOeJ`}x-h_780VCj$>*yyu4yM6#U_MNMo8WR-4ex-B@Cn!s zo8Uh96%2@F9_6t;!;@eXjDiVp0nCEe!a{ftEQd9)7Vd)0@SkuGJotM0e-U?(g+cH< z7zP)@7`PfH!BUtDpNGZpLs$v_1M6YH4fG$L2KT}Xpzmys51<_uzzBFhjDs)3H25jZ zhx_0rc*JV@4=2J#crk2;4!95A3$MVL6P4wQw11 zhPS~z@G;2c#%hhZn(i_%5`~VLcU4A1sAY@DrE-gKnbV z@IzQE9#+E7VLki;w!+GFj3bO%Pk-mq9vBASgfTFtkaodKZ>Ant4lCj3upWkPpdOfU z3-!QtFd&}o4~~V;!YEh^6W|Ll3m#L%`hai3N{Qb}|KRZ(Sr2d_~O&>pyRE9((1zMpo$gCAgC zz_G9vUIm-sw{Q;}{SfQ#a*o@e9o_&V;KXh83ueMB7+uMFgIgY@9#{*TVen(r1E)f6 zLujjiobvFJ?UaY3pI|=0b#N2>7*@j@tLYEyf&1VUPck0!c%6V@F!pK6!(}iFZi0pI zbyyDf!dh5gLp`wi8R~%>pQWBFIKHW+9WV;U!Mk3d9=Pj8#udKw66*!N0^4Ed%d~$! z^Z!-G6UM$qIXLGpEEj(GCd-8hjm!^N^cMYw(|0g_iTp<1+bj=uHPLRkXeaX>KF~}% zVc;&>2`k^Do$xO(U;*o`h4lubK487U)gMw0MtsEb;OVWDgVR1H|CQ{wVHh0w3G)~} z3e(_^un@XoIUMpS%Y_HRW*7|jz)6rBTHD;v4j*h|`EWl>f+v2)`hw@fVz?7l!?@3> z2fhdQ!n6NMdy?2bVHo@l#=)3&#u++bA>0Kk;mqBPH+%-}f%P3MKbh_COO_8EFaak2 zgXO|=_At({@GF)F=XbJR7IHlJ9qohx-OMNWlaE_#h6@jHYkT3peBGLT5y!g+xwQy5 z7RJG3m<64%5H`Yc_;*+fyI?aMKEkc-fu}>h`e?fh2Em;$42Ju;wFG$1A#N=fmcU|I zbEsRZhQkA>2ObOez%!uS3}_Y%f>*&XxE#j7TVN8rALhbFSPXqfy0uF9ci0HeIgI+? zrI4T2u`N5Cdf>A#4$cX5YiTg+2)C9Gcf)cRd!$>dhpn&`eh2r$F-N&I-zDttj&W;a z;nZVk54;a1!RKHud>0nOpI|jS=Q!E}i{Ku3`0><}#{Lr8;dw9uUJ2viN|*+R*co>i ze**o2b5Eik=!EU?fe^R04<0a@JBOw-?rLa5LG4V+!?trM2ggQI z4xR&>;cU1E-VFI7uB`zE!H-}V{2Io<9+(6Jrm!C2Nw643z)F|_>*0&A9r{kCz6|CU zw8IBr6#N%Vf|1i0CzuU4!B=1{^owF%!Fg~W+y;X(Ievm+unWe(@zbdX&Vae_QdkVH zhL!L+*a&@Q&_8%IKYOV_+&wg1Imk-U5qZ8LWgK!+IEaF71P-z`bxP z^j*gMgLb$WM!;1t4%Wal_%E0bhep$1cm%A5aj+5I0^4C3+y|e80okk%I2L{cqu^oZ zF)!dnFbfvKLijo?hx=hIoOC|x7skRpFd1@5p{*1K!H-}V?1V8;gGunPne-oyhQ%-f zR>B-u54Xcs_&VGRTcNL$?KXz~!`UzbCc`-BgnYzjTMzT$D{vG11XjcEVIvHfMgQSA zxDTEW1C~<{91HVc6ubu}z^7mqdeH{ydLg_cR=53Sr5<-eJ`f} z@E8~e$HO!@1Lng^;U<^{tKoI95#9#d;e&7=d=>^=$N0jrunk7Rf58Ok6G#8yG*}3) zh2?M~tc5#ZGd$oD`VWJk+-!3k41!Z(7`z0=z!aDSSHfJl0T#piU?uzn*25#_(0@1< z?uCn>@AYiA&<;O_5ioEr{f8IBG`I=o!JPJZ|~tb`X`&2r$CS&S>Jf8de@CU@k0%q1RC#d=xgq_&nA#+zWlz zQvdbT1O0EHU9cFY!N*}f+z&Uw#MRUTcf(e=C!cvz!2Wm*{erbH2L1?>pmrnW;c06r z4`;(_xCJ)CJ+K`H7tk*l2Lo>6eLNfsYhe`ZgbC1o6Z06x!$MdH%V8a?g?nK$3|UA2 zU;^ZaC2d782$sMwSPEm{BQObez+70jo_50Aj2^8P&dBW1_P~kDdbFVRyq|_K@QUmn zEf=Q2Vz>rY!c93nT02a1_Gkfxv~M~2;hiuE?uYp>VnvU(30@DYVF7G}H>_lNurRkr z^Szn(JL zc*;Z613!mZ@SJUo3q0WA9<3af!CIJ8NqsQn5yl5z41G7U{lT&D#7F5D4222sY?uXS zz(N=c%i-m)7AC`H=zx3RO32OmY-?Z;yak5AZ($6)`!U8HR=`~N6fB1IuoCWs^{@rD zLVFeMgr`8?+d1zK?eGE^0Y^PfJ7F2jf|1*4Cwvx`!(*PHov;?R!o#bn58e&~?qL7@ zB>jeG!YDZT4cZ0&@h0m5e%HwQgU`Rk`h(kd(7!ur_uKRjhBeVYxEIF2Y46ZK_!7*A zqjpjcd>7Wj(03Ux_ygPnH#SpW3HzB{)CWI>5%9qGSfB7Qm<2zAg>W}4hn=t%{s^1l zkoTz%`a#=Wd_Dt%;0Z7chQb(l7EFRsFc&@mi{XVWj6a+Y>)|!96|RDN;d`@?xVE%b>VsFq2w1tF{=!FL zAxz*}!Fu=<+yiHw&-Hnmc)f;WVFcFrQT!FKoq z+y_7Bn!%vW9M8cpIFf4wW8eaq1c!4yU_QJQZi3^u_OBMsm+SmsF5C+rfxh>0z88*# za;;wsY=UXgjHJGi!QAG{j|Y+-)Ev9KLR!3md89upAzJ8Ow(ea4*b&zFRrYxSZv~0vHAV z1{2`dFbj@KpdIjJSPtjITG$R-;lcB$4_*j;%Q$ZV?J(*J>Vwz81o%A6g?{rHS2!2e z!dqc0Y=ZmXmoVTyJ~xJA;mL{A1DC-BSOK%(f(5K^c*&KlZ}=!|hEuPiJ#aqsEoVOg z?JyvTdf-Da2_BzJzu@h#5>~)^xE;2_Mz|L?LErnCPtXoqVFdgR#=#$88r%o-;kbqL z51tFF;e6N#GhjP>2kwJk!hi=jK3K#&giBxy%!EmBBg}=(uo(KK&`x+ItcSBxsRw=s zgC6Al#A4b7zk+cvZwc*z`EU~)n$CE`)mPI$xcM5&!`B^@ui*F_hQXOjSw6fE7Q&Pa zmIw1-D=dL~;lt4PA+|SYhwsA(n3G9)_&m&qAHz*BG>hfKDXa}vgfXxTCc*n*E^LRz@F!RakH3!k;3U`zSHiup9Qr=W{tMdSh&=iUC%`!P z7|eq8un@ir%i&kB7KU6;Kj9X*7d{VtA7i|s9md|kb^;GuP5WRb%!O-UF)W6aupHLI zsrmF5Ccu60W*AV#>%tngUpNs)!3dZDXTmIa4=jZLgyrz)wbUnZ*b0}!z3}P+>U*5! z-^BRA^mX(T&Rx&^f>DK(hnrz7{1LXoBX6cWya@VkXTHL*uo_0eA7BE^-$4K1ZMQH_ zVHK=~Z^A|xSj0SqmqOnscs~Q}@DUgV18-%V;6#`U<6tqo99F_)SPz%ORygK1#tBY= z0o5Eo!?Dm^Og%8Bgm%FBuo^CajqnNB4oBTZd6)|Wp5%S`-K>8ok3b!^A=l2a4ap4{ za*W?_-{K+c7H_H4_tRZky0sMXv;FPshOQkZW9h&z#n+0z#J_w<5dnG5L+UFc9x%I`Ux?~^h_Ap0;$uad zmQ#n1QFythOdfu3@*gB~PRRp&Y=a7qy)!$w;bltGE zKJtg&{wm`3gl^4y|2wa5!2fL?*GPGC>io&wqdvW6dkbcz_r6Y z{U_d&*sZb48&F=_RYbgSLAU020DlZ@SG0fDfM$8dt$}ih3%Rz8ezDv*^Kzx$4&w1C z-CCW*2i7~&zkTF@iUY|S%-FXs?$*Ze+`N9n@qfpUGI{A=EPfAurQZL3?U4E$#HXco zYm@bIVFH;u1^8tA9a65hed_&%)Kf$L*VEa*@Z9?l--Le+f38SlJC$~I;J?Kuil=_& z-E`)i&$?knL#3P#<9*82-P&~$H*Md+_#*sq79Wnk!{VhMvG`5+TYg19q+NOB|Ianu z+Cj2j6!WQ+cpKLWCrEvkxU{>DcwlC?#`Nobgz&5dKNKHqtZ%))(f&z#mpyrs{8Dn|Lnq;9t4ELfJpc zwb?gIeU|-GI4YL-JH!|EtM8Xz#|kL-qm$QJ=4s#jH4)~`M4?MlYWj~(cV*BP%fiuE2!d^U0O_8{e=@$vY7$bv27Eb$cL z$K-Wuo24C!{bB*}lIy#*r}cQh{f3mUAb#>{_PdI>%$o+{pKmK2z246x>wdh7_*-0i@43fU@A6FZq@ZO=YTl;FT*NJ*{{n3>BdIS5BzHwmx$~==nIAEPm(Xd;GO8pM3w8Kw@rQ~x9x~1?_+|JWafi`RLoD zXZ;fod7xYC)Z=01xGcAb_+H{uC2l-C{l_24cMPn)4j*app8n$(;(wAlEbWx~x`>}s z(aoJxc$kh){rp&u_-WEVOZ&r7p~Mf`)~$``ThG7ven9453gtefoac2e)xUU%d14cn zhqSwhe07x^$4UK)q}?5qi+;3Q3#Z@8a`^-2wTx5nA-q?7 zrd#9isrMm196t`vH0phbkHsI0A1BsyoSuRY!=GUC(yl!GB>bVWfPwwtxGX=wxwp;r^>eI`4x3@6w_9o-mM!uKG_ixGP-QUnxIpCJ|x{2TRe781U;>JUKpg*tE z_*1-694Qq4EMDsNKEy}kUr^MOh~I^e@Meb6ekcCl_;6z$>HDLZ{`qTsd-q6EZz=hD zUf??-Joi4rc~XNP{UWa?>iv}Lbq2gIl{R-$Zrw}W+F7#P1^#i?<99!HB&9ERYuC%d zyyIoOKk@Wmb~LXHJnoIg55-SVl#}JA5I>xF>LBp~;t9kj4HB;)zKr?<4Lx zu2SspI*5Nx{BbF7IZlv%`S1?-n)+^Sol(E+U!~o__>b``#4E~05+DC6`wLUKP@c!* zFB5O9U;Vtn;Kv;WOtY4{kHvp1V&HbF-0w(ziIn@6az#?kc!+o6li%pp=6WR* zUxY8koA>jw{0jVQ_>+D^f23R+{q#c30K2L4rJ5oINKE#LOFT+pw zN+`>T#;?Y&{|(EL`ISexoo{t(eAMH4f8%{w@V=ieB_6%Q*gxspW5473I^uJQFO~9^ zc_a0=5icixwCpFm+jCss@s^wT=B94#3n{O7y$R+7#{73EuiigL`w#NE5l^|u=5CGQ z?|sNPIq+xV|Eb<@&Gc^`_&Oy0sG!_8?{#bU%lIa+RMUZj)Z0MZ(ZcpI*!U~vyX=SE zlyiR2t&R5Kk5rcKT>)~!0woX07sAS4_Hnm%lZf7Nj`k1h-COJPAeMYP$#=aaZ@`w@$ci8TfEPa9G`r~`wH>K@t}-P zFg_FitSP@NKOBF^=bZPG^{hBA5l{T+zjkXUOF7!_JzjU<$KrVz?$@pY{Bf52GVe<9 zr{Pygeto|?;5bLx*+9M<$Tv&!nT}`M@K4~^h@a~pW<8(iCLYjkysnzc1#)8Pe7xs4 zz*5fBf8q}k_nc?y-5&IfLE`bm|3cjJx~PadiGNA_Olg;8{YrmIh<6jWj#CwWufjLr z|8DWpjy8N7{xVsP;`Q52{IK2K+9HXY=6PTcs}=uuqnveqg%dyN3*-F}M_ZCj+8v9Z zfj>`#$*15m@zcdK&ffP^dH7BE)5S9m(VUc%U86jt{iVdW5%!i7abC}~e!K9u;BO?4b^N8?z@vHHCO%IQmwLmAkLlpMyAn6`Cl-GtUbTOa zdL6_cAnuu``n-@Xa~4wHe-;scoA^6YuRh;@@%@$5+d#RbFT1tpq?}@V>>&Ol@v|jv z+8*8bBmZuk-<22->0clxc0=$Nc#Qs!EGHCy8NOVUV!MbX{vq)^BQEpCd;Z?jf8rDW z(XDNlxMjPL_r_DEV&xn(bcl^|oIQ|2(IXk^1XpJo&1=p+1?+gXEL( z$RppK-*#(P>dPH)-m8@Ou7C1AOzN>5pLqID{FA-L`!v&jz6Jjc{v3*Vw`))T@&5ld zwl`CL9~u*apC|cE+et7!6~98fV*83D{vvVDa!m6o9{)L>;qHCN@*Vhg{1maKu12{Ig!LS@ZJCOWc?_%yF}to@ZEpwI5_c7;!lzaaCvjdB}*;DUtA8tJ+B|q?k3{% zeOy|k#Cc^Ai0{C!#(R#(Ox}&ZP2mG6xfO40FB~_m9TrYKq4Q+y69=ND=ychKQ3ZB)PcrJrA5l1wn4c$ejL zkbfWfca7i=)pDv27;wT!)@Seu?C+0rDYt)VMdLqI%b(SQm%sdTg2B6k%Ia|`c;PyKhdQf%=!Jk<@cWF;Qi#e z1NtT9x+ph%oJ$K-Z)eKSnWY_}C-S)ozx}}5#(u9W(fH35J`w-1!aMOTcn-sQA2JR_ zhA$JVcwbXRe9q~v0q^@7@Kf=gb{REFd)x4n@TbVQnO^U@@E44CY3v^Rc|Uf%7b|=S zK3?G?@$(cu9)G36JMfDXz5t)5@TK^r3SWcIR`@3TN`>#h=PA4!zeeE$dGT1M@S*ry z6h0bXtni8WyA+p{#d<%ZN!gu1IR(PM$T>Gu?!T6UHJ{($8!k6GzD0~(EI)!h*=PP_0{w9U*!f#M`KR)oS+?r|=#4I!vG`Q{jp8lGFA{eUf0MZ9eYSr5-+TVYbNoZx zHqoUyr9ADE;81zaL&l+scsy~>_?X(?fWOw_rM@amEyYLUFEn{sUJZUF zevNp`c}-s8Z7sxGi60`zefsgf^1QK|d@u1^W1jj=;~97w=UMUAaSp{Fd6rANNS13H zPkQ=~kHycB#!lhp~VCj#P4=28d_!8-_VqV1)A3xcppC31ks{?-p z{wi6nX+0O<@5lRzHy*N_Qv6-`*Tm`D3+u7({c;`gsB>KU`BIi+zD`lfw-NuAc%78D z#ATkiiQgRQ(m#Lft-t^0T2fC48~TsrTPpSR=Id)mH1X&uE-gpmmgUI$Ng;j@ak(zs zyx+;gzdzNbfBtA1rxN_uX)bNb0aBs+BJu0-w|R{IkF+x$--C~k zb}G(WI*A`K+vUA(+%6@hz9Rf7c&2B+`C5UWimwsB(7)exaZ;{<_55qT0J&M=2XyWa}_e$KdT}t^B;??tA+FvDZnO_nwAfB0MoZnGwFBQb! zTj1*boXmTDP91&^{!*DwihA3KADhJMs=lA@_xVCNMcl+ECA&2FUWjr&Dz2lFaSf;N zw+s8f-bg=U@gLz&llm;8s4{5(2AIP5WFpl3W^HkauO1zl3_qw&g z_9yY=D_!c+o{_pO^>D~xa}uAB;nJ?@>mU08?|DNmDlwfnly+5+-;v30vPu30{z>M~ zKcrm^#7nYVTBgJY`TR=8tCM`6E^}$q2HXEAt`m{vhn&Uv@Eqg(?Ogr3R`ch2(Zs`@ zF0DjwU%$_1WV};|S1xz;yKY>@ArHSD-~T!-?>LkX7>6qIH?QEg+GIJ5D=YXQ?*X#3 zvx#`?O8PfQypy>6mT4_{t?Na`$B!4d;#Dr~2Z;}yPs;1Oq+B%RW?$>lM#^$kx2FUDfW^!5-1zPILdmb#e+EzDc>jjJ_jCGo z*LOX4B=Ovzi6;{Ogm|jdZ&?qX^-uix)q}@NiKh_1Y>@JG#P1y>F5}TgyqUOXJfsdD zvfM6w+s`aFa5As^`L5p2ea)ZmN%?T%D~V@Fg_eGWqvDCbLHuCjICQ}0e|!LGy+Bv$ zEu!3}wJz;0sh4>(;QcT0Lke8|zV{`|Yry;AzaMP-Q|#Ad|Kq0ITQ|A1Ph@$$+pWI; zG4F#VEcrwEpgU)sdVgijFYQVsfAM;k_Woe|+pGb@;JKc%gmU9HxU?qOKzrL|`dmlx zx+cqOqTDMRUD{W}mF1MzMN2uKNWQmq59LPu`f{?qA}M#m11>F{=hk^3V*RB)({Wq{z7cO1Z`z;K;hXVHXOB0(|C9RKh<`==aEY7h>%w>7 zZ7FuT$bf@MG|vcA4@=;)C(l`s49O;XTKlru+`09!@{@_Cx9~z@J6_ zT=7ObWt%O<-;H0~H?O_NLH(}tZy;aG!!B*OS;2 zr0^a16Y!q(VS1f%ww1;lz)u;<#H8m+_7#ej)Ku5;w+0 zwg(6PBK)uYzF{f(Cp~UlpFq3K?U3cv5x;XVD87!PS*Vieag;=@H44_S^git(%F zILwDX6vqK2#JAVDv?OW2WnN0XHN^kxl5pQ|@lX~Ncml9tuam6?~i4S{j;Q53iypO_H;15vv zI{bkaFUxPi565p%EMMYX#Fr7DJA^+H{NqfQv3QOT0_ku?txMA+PW!oH$k%(EE#n+c zeC-Ryd3XMnhxk~05&m?eoOivX;2(I=rC(=iS}%F{Z}FaSH0G()Q-U8;$No$zHXh=u z@JHZf+ISzbpKQPn!M`L@f4%hXC*!>D7o~hB`R*nkn|;6e>vJyK5}w^*ua|KO#_z^w zinpvsiANF-dx_u3HsW%oZKyowAiAUT@kcx1QgU|Lg#BIq&=HxPFJM zGA@2hjPQ3|`tOXG`V)dr!&{GYBJqn9J|2H1p2N}J{if9Kz^_sG0(^y{o>KgM3SWc2 zSK*uRcPV@azF6Vi_*?KtNIOma4P?V9#GfVJnD;V=Lh;-17l~KAe#R1i|7YS3*&v$- zFJDCbw4aGr5x?SR;!VWY4-%L0?<8JB+}ban7|t&aQcn6ELR|Zqcr@|QU4!>4h4{Qd z;?k}H;_HZ8=T|9y4c-Efk{7AgDp9Oe7g)hYqSNIzIP=#;8_bB?=f#0X_Zv1}~KJWsLukhA! z55-IStv(tbjyI2^^fwVdLE)YF(-po5KMrplp9=gKg|EY(fVZ}%1s|>Oo%kh+dVF|+ zUa0WF_yvl3!twbEAB%rbQBMlKOyTqJn-#tUU!w3;_>FjLe;e>mDSR9L1BLIx?^Afc zSU&%Fe_;I~_^ApXiBHB`*H=6~5pSIj4*WbtJq7qYg)hb5r>Lg}Uy8Rbw+Vlb!gt{B zPss_=Mn>D10P- zp~A=G7bv^~pP=vs__+#Sil2?QjzbOpLOh4>{oY?R;d{ry)cy{ z<@FbDUGJgzjS3%)-=Oe`_?z(7S+C)#5|wV<$e~L#`8&^OOD06ZU?d5=bbJ6I+LTWV~*f#xWEhfR7@N zcY6!xX*6E$sn_1`JWKEAbnVDdV`{hJ_c~-8!xOlk;|tCs{K7aUlJD8SaUCvY zybmew#6O1j{vMs`IvQzTDf!$TeEvSz`7%Ynr2ZDlozK1f4*Z4oxycvub^q)1WW5CP zLD}i}OrD$9b142M{Ky0Gs_{~shm-RODU`c%uS?^w(^H@IbDRR=Ma2CjZklhU_#5$8 zi8szeN&9N>Z{eqlH@)6B;lIP5Al`UL{tmoL;oW$je;enoP0J0uf^!)7Yorcixw1Y& z@ekualat)PrT>(R?J}-opuGe7Py9yW*7NeE_)2`Fw8MDFc-G*X@NdfcRn*r)Jog8q zU#4;E#5dxPm%2>j<};uDJN_u~rf~?y@5IaW^FCxe!|^ZRz32KRCO#Hlfj?P>%vP6f3V~?9@6hB{6*wX7N_WU6Y<*=^>rBjYNMQd-XQh4 z@$KZV5zqQ$z3{n-eqFQlCpeL9b)QSSLE^@^NV#zQC-_Ij^ZA_hx|n$4DL)yXODaC! za}sa=nRp5D#O}ebyQv}m@*r_(cMEa5tN(sgd?$W1p2J`1PnbZw&jPkj{FNe%`6By~ zV0;DsCh_`w_kOO_`+6byqRBVJZG8UTKVR?fU&?;nLB4kKJ=j-Y?{$CuPR0|Lc9oKU zZjW(2s+8d&z6PI$=i}VoegyNh3BM8V{XD|Doplmlx!<^s)HKh1==iO8>wY5`e>a}f z2E7kiemMSZg^!g1)Qr!2P4%bXgB3mxAEEFi_;`h{!e=Rb1HMS%+wheN--T~bct3Wu z?Ft`)cPo4(K8Q%TjEA< z{yBTNH=XRC_4)>#=aRpG{D*z*)?aUaMgAJ{Uqt?wDEmwG%eZuq{}b|CUtit$X8h6Q z@jhf-2C{?Qh3|j=0@HDk;!({dEYU(%l% z%0+zZ)~v4&P55zm&+E2jJxjSx;wy+x=DF7Ge)BjO{|0`zc;g}S zB^+Oa?-oZt&9560k0*ZHKi&H8#9H?MvOFj8+<&=ykB53c|Hf~}A1U>kUOy}FRrrzO zjfX6!4*w8-n>fpLA`)*SK5nmDf4#KCr5$eK4&t#=-q`O;xxhtyZw^0H){CP3;lywJ zH}~!%>@6qt#o`~u2Z=YeKgICJT6`Y<2~$1Z>q|=TAK^JX^Nz1vn&SDL4{2Ww@qq8# z`tKoG`X%ue;ujEal=6yr7xC|iZbIiaL&JX>E?N^WY``t8oy$dHkt;?-{ub_AR z5B#1{BKhWi@7AvqHI1(m{|J8LAj>Zy9`u7-zkbHjJ{jj4;;V`CaZbN^+=PD;f3kSf z_;=vz@tpqX=iPW0{#@~<{dZt0pEvzz%wLJ|kmZKrgZ8<#Jde@;k?lSjpNGFm=F2Z^ z_fn6O{JVZ){3XB9PFZh7_{&_zeAUObcfCuwD&qGL=VQCxa^f5Cjd;1Qg}J^qe8v90 z?ZbSWCgt43!!)<|cX4{}QxdqC>s;|SkVopX9!G=|-$i__#7+B=SbU_dM?a1*#xtBO zDfsj7cgPO7cYJ<+KPTf+O1b;|d$c2l>E+D(85#FF;w2+{w1fMNdvCq{-g8TTJISAU zSdad@*ZeIHS&q*Vet+=r9_>dFz4N*6I5>p(_ryK#Cr$Gz692crp5Aft?#JTsvySM| zUX}Vx`5pN0@SJwH{FbA8v?rxvMY|J;hmPv$ z_dP4=uM>(HgA_z_)qX7#2XLkPXoRQZ+<=W^dJ9yK2PBt_)JAT1^8rzFU8Nr^D@=@kbc$Rx8ffWYg$iD_|uQ+ z8E~A_fe%r5H-41D2VTwVi^7NE55ynX+Zug7MdQ0@kLPvNh)FvW@ngw8r$ z#TVgy@uN&$=1T>B1io23^VPaPY9Rgs@d6|6-45IEV}g6MGV!Ky>cUsyueEqT4xIdt z?a{xlVeHpr`62lE_&X)PVxC76Zzay#>E7c3DVK;p=D5E7gSFjx#8(lw?ng`T9rzQZ zKGS}*3jZzs02$ohupjN9+zS(Xw8!Q3!LomoZOq5PJ=D(p_50Cq@}GFt!2M_}ei#0G z>a;FLn(QFH?d%@S$Mm`A!heMKylyGh zQz!8=ClB0@`Yh#hQ2b!~(GcQ?o-=Si8i|j`@36El9)Dou!2PHLzaH20sfFF zJ^JrrD%xE^d<*e$vK(VR$o#6qZ^u6*Ua=o-BYwuzf&0-e{7n1^DQ7%nT>UcmTp53` zS3>b2_)vw9#2>GyCmugik>7#$QRFYc|3E*i%Pqx!rSLWQHoUd{P57M(-+`~kTlb@G z{0Q3fi1gRAe+cBn?-qQ3#fReWRQPE8EqH%R{zUv5g?Hjt;;sA9B77=7R_ZYxGX53# z&3Nm6v<|-kZ{3f!;8)?T`_WGPb@+FsZpD7oFN^Dmrw!bXhT!kUTlb@p_~594`_Xv( z4R{VOdyfxgzB=%4;|JT177>q{-lNHG%KHfCNd^8?{262TW8i*|`^E(HJJyr3GHz{@ z3tKX`l zB>Y#5YLXcu2V_{9gRU;@D4^zn3TdZ6ba=_pr9k!w&or7BBU=@dx8Q z-$%L3zkH~vLa8q}o9hp`2lk;n_ddjj@Ew0}#%|A5~k`7PhG zl==#Yzszzx$*GiuY_MruUUi`0w$LN`8HQ_uel+meWamHTUqI zEpgN9yH5_Ef8#$CZ+X8j;}k;tny0u&w!Cgx;!GyqC@rn3+`~;qRAD;D( z-;BRNq-8xyyoC7c#P5{2<@H+PHN?-V>Cvx$u*7A#EyNRvA1>vM^&s=N6Ms3L!@fc1 zZz!QaC+CC6=Q%Fv-QLva`=mY5=tMHL{PG|Q%#5dsA;;pZP zZTM__SZ{8RoZmM-N0f36_+#pN^v_TAa=rUKiFXj6 zM0_sKt>Z0mpIqi9@tG1=ln)_(C-KRH#G{EnPJEgoF6~Ys-bCDUp53$`&%?iiKhh}Y zJ?<~Tzm1oDk$K#z@PEa7_L~ypA@w)lN4~`Ifye0oNWa?fq4?)TS@zo!cN2euc$XgU z_xmUk4_?K7`sE(|Jgj1SiX{FX@e(ONSO48{@9$zryAp|?|BCUtAbEI*cj7O^pDV)n z98#87gkOQ@WlFi8s)#odzf0nLZ_j)_PxkLk#HZ97$78+QRsY|om*sSkZzK6s%aQg4 z^2T^KanJsd`QTkIq4+lZ2=aIzl0O>16F*9%>GeAi-;B5J_nr7Uy!kj!>M6o+Q`BF9 z-=wI&4u7wr{ucZ?Mg5)lEWBr)nA+)c9mntZAWQp$2l3&C_l%FJo>;sr*Sdd7!M|gv zU)DpO;WK5qitW9Wc<`(JU#Dc8YVb$leWjf75Z{C!j<<_5t+x*Rq4??IP3LRf_y~NY zC4XQZa~D6y$S>C`g!4QUe>Z-w_+R<@ApK0C-0atk*Tvp>+4uWt1;pPY{*u&d*-oWj z6~r@NH}*fqc+0+_4u3oTPAS*h9`$jG)YD1+F7lh_V=&(5dOr8X-zcy9mg7^2hY+9f zMvr#=An|D8_x*+WFL6uzrF;tU&2RQ-rz+yot^(o@Hum4&N&iam&*2kz{!9G}Axjha z|JpzQfa4=sk6q+D^sOH4jehn1^6Px)4YY}J*6k#E5T9sx>wd(EzsFmTX`U7tUdF^b zf2Cg)_&dp8E?!^H1NtT7+(f>EcNoXTitVYB_ypp1smEBZXZ^3{^$|Z;ygomp{kcz= z+?Pe#5<=WTe5Axp+j}HF6>ojN6_20qU5+Wg1HTA=jHR9e{9^ox;!WdGiqFDZ$FBx| z4gNGs{w91r{vz?F?Ysm34Bqp;(bOI{z7y{`&N94=M_@jEe!EA%4~u1cmGKBC{xosV zdNRs|<74qp;GI10o3B4VuVi@z`MiIi+q8=B|A1mxK2l@0h&b8eSLip4Ua=eWm0N!GDEMmb`|Sc17YRzGJ+< zv&=V%ClWuG_<2&!GL90@Bc4WlvcxGb2m9XFL|JYr@nYiU{k)W`!RO;WzmKNaU$qd= z+G%_)V_B}J|HOy9JFs5A8~GhU%I%l-DE4Ea#NVad4vAmJRjsBKA@#-*U)9{Bjg`2u z9;Ce~_?z*b{SEicFyFvV$`ueleOHhEJ4G}37BtS&e|!}FDE{`=C%y(h4R2kqP586$ z@^PW}A^AJ-C*Y@fB^2+*$Ka0^Z<;rOyz!ldm(xvVABw*mKT5o5JBr57!%r1&Jf!|a z{A&Cu;!O2B@x^%0`!v%$E5g5p_q4}UPX&Gl{$x`7Xqor2ye8t05?>(YP2<{u{}=u+@y0{)yYXM)t>X}Q z6UPJi0B>d}?F+@X;>*Na+9&nJ62Giv;P|EB6YvwHoM{~L@XPR?^+$WX*W;An-^Y)) z7J(SL{1G@qjJOT6CbpNv-`{(AiPJXh`4^N7#+i0xaJXIY<8zLfZ^R^z;(Wxww^ z{v$r};~wp6sh|Cv{ySsp<3Fjdll*U!|63!!^}LYZdfsPzV!Yoo?dL=AALFl-a;o?L z#E<&aIR9ZXJ2`17TlX}vYz@5XNs&vMMK zBhv2<;xt=C|D7v6llBK3vif5dx^GxXP&-s2^S#}g0v z%y_?{Se}#kdBl$;uel#Z_zUpf@v`=#ig+?{KF(D3qltJGace(1@K52*{g8gU@wNEj zQlIe(hShwZ7|~`}@9Lf9Lh8b#D@vns$A|gmhWV=65h4G4{_(&+9{9%t|9IdZ5B&e?fj{Mg`tx_lqorT; z;qpXy*OTva%i{0#<$GN@fP04udz0a@4dghIXh{@(KE1R@A;nrE zFN?ouoe_Po7A)*Jgx^2iJQM!^mweHt@%OTVG`vqz3|&LML;oLt#`PH?`NMYU8)bps z74rS`O)^6MllzdW$pMRA<|C5iv~QTkK8Z88PHhLX0BbQeiGOM0xNJtQ3@>2OJJ zmUM!ok4id6(uI$n1m2{4z3nl$n z(jO(Qx2@=xw1uR*NZMJ_VuxL6Q!a^kzvXNcyOxb0l3T>Bo}(C~3XzM8BjhB;7^Q&XOK0X%9&UNjhB8 zn7$a)k#wP?A4~e9r1jc~eo0$M8qjBJisPeX{HJWiudU_ymXaR-OsB%JQ{?-= z=%JqBr-yuh^NRR;Kl$GNrTF{#v*WaoxypZa!@rAjRTVk@Y|uVa`15#4$4k1!9!hc=De+PyCwhsSA`@nmJ|LTX6YQ&uq z{*4dj*<<^g{$Jzr_&biDD948g*nLoZJhDCdoG!=jioXVL&o}wLa{MwmK1jZUA1vQ* zRrn#4pY6L!j?45O@bUJa#P&q(7k&8nVXwx=v7X@L|CaKxj^N|>%JDVg;#VnunjF7U zjz1&cQU6);{c1UW)S7WWg8yHW<5$V?AyZ;|!7rBM<#L?uTQ0{($?=_{hwz3U@W0H6 z^>2CK8nle!^eM?<54_DA3px49FO`^^x@;X4T$ZD;ywEC@onUI)VHD!AFneo z<{QR`S2@1E9FO`&^kKeC%8&Y4^x@+T|%Evd92+rPhRE?dl;gwX_?=4mBjtEBc1Iuf&rNc?u!o*- ze5@Rg=8x#Z`~z})i}>&=$DfenTPerq$nj{NiauQaYjQlAFQN}0UnIx3j1RAJylM2X z@9-1Nh0%xkWy0?iA7177mvTIsbE6M9CC3j}j_)tW4^fUEBgYR_j-M*WuaM&#$anbv zZ22CoBcczt&joV)w)k++P}T?FN6PVNtrC5hA1%kDbxZW&fYY zahwOh|Lx>>v}TPytiSj2*#3j#!>b(MUHCZHs(eO{@2~KkLX8rxT2(uR^YmJ|lHc_r>~`IqA~CutLrKO^a# zl4d2HEa}>>#@xs9{rlJA?&=rUlgZ(^6`Xx zRrQ`PU*_(Ae% z?S}cUj;!yimM5wTd-{Xq%ess6Df#+IzWq}2 zeIxn0NWO>U{9nYyCQ`mAo})O%C+fq| zXTh-8Z%KYG3y-f}$Q9lvl~A4>3Zi`XBhk$lgj+*0lrQp2)qL1DdzA8VdDwq@ zDkWcZO(Xi`Qu1NHaCS<*b>iZJms0X!fA+PMeAp*mn350s&F`kP^!Y9&U!yo%uvErf!~wVObjgQxpBB&8OTOPlZ`JWd4i(~XmVBvqLp-i&`L2_E zjU*rRM)o0|qbxbew{c27oZq&Td>A*X#%a{YACmHRqVl-^PLq5cs64jsVaeAyrM!lc z?+D3<_7HI)$%g+&b7u58R`O~7TO-aE{EPI8I8H)GJ}82&l#lECfaI&6GEW!oeGc=U zCFLFSX57wI<0@Ln-XrA=PSHDF@?}%<-7WcWevf$Jdb}X{u1G0wwB);<@^SkJ5)) zqD62gNL=((O1^fI?;y$tzri*<`Yx#YVrr950m8%g=Nz6VHo z*DLv=!_l0uzvR1<@`<>RMENF&V6U6v_D8(%_;;G*yHCo)`~mx-!;yd9lzh`jFXwwp z^36=iw@~uUP09DRiYlziH}f41cNnaYd&Cx;5jYWO04 z*2aKtrPNL42`nXk$l@xzN-E!5A)n4`F2jo7sUxa z_sSo8Qa+Bqqa@#ck`MD+q!;BycK%25b&-6D{X84~wo3AyLV879NXo-}zl-3Egz}1c z!+d|pmka(TU&AmTg5rvle8sZqkIFqd79?eR#_8UYc9ayyTPnxH_A8t!p`Uk>xFt0u z`^x&qmso#2stJFm!(n`93;r2;M?4t} zeV_EZ^2g}3{){|eIY>c1a}&%G1(d)xT?lXzGE9opTk{un>kyffySNQxkUetfU) zv^I^OEl7VbRmM%EWI&x@NMZbk{cSX!xa#`K<2UXbK=~B|dKLc6DfTnJ7uoO1cV_-# z8UHNx|N4v>Kd$<_kpA+#n|_{uvTwNg?>JBW-8}hT#Jl>hk0(FSk+ zlKxVUAGLy^#`^dc(vR^sGd+3zRh#(f#AE!|c+~$H;a(@crtAL^=`Y&za>9C`TvHJSH+CBCNpUv`%{e!~B`NA3K-jwj#Pli$>l$NFJw;jVe#tbghKAD{o> z{Htt;sXte%cVYg`Jg)iQz}5d`|s++WB#z! z-;nw5r2kshzZvmZzuW3>@5%2=e478b{SP8O&Hmac=bwmQ+xj2jsGsdWfq2*YR}i08 ze_sEcNql0=g8vk7Vcekhh2R!*lJ^5!HdCcE9f0{>pP0!!& zk$$vac9u4OnDM{DlmE?;hyT_X8_zqJRk<%9nrkZ#tl9Z@1F-}1JjSowbDICm`L{Xq z*uS#mcktw|_vDZD~a6?ZhK~ZRpze9wD>{)TO!;i#8+4U%ik*JkuBmB^kaiaN;^*`g#5N z0P$!)O+T-HrzyPVceLL-vVLv*p4tDZ>-^bw{tOn_wVyWs+49=_XUl8zpDnM=UmDNx zw}9Fo{nwUXLOjMFjpzQS&3_ut_G|O6#U=KQyu;veI0+W3j{kB{@E89z1s9Dggxe)QkWqU7fpE3zLP)&cmA zl=*hV!~eGYZp1^6E#HB7SN#_~Vzxi@B85Fjx&8-}esD;^A!Yso+W$p9TmDGWkNMM< zKaqI!KU;pD{GOBTw&hPH{TRP&`O}F9hZJ@pW&fW+ylegOJ5`jA)K-5#((lTjOFZ-< zMR`cM{udLU7C$`xs^|Z5A3gLU<@1N3&ic*y?`ltej3dE(X&5nn35qg?1m`+r@- z`mz6v{g2;Be_H$V`FnPt8UJZK{P5qVJb&`~8|S~-&ywSZ*Z&RgHSLF8wtP=I|4ZZ9 z{tX@VqyJ+4TTXmU`+pbGkN$_>p}-$Vx&9rA&(DzS_3}Fwa7cOmb`QdIJo+E5pN=CQ*B?o3wSDFI*Un$EUu*4e&Y#oBe#EcFvwrRRtHyKu zJx2PA@uS!e|6~4~MSOK#|I`|c$1m;v+hB#A{}-_RedPXUOJ2Kw*H%A2e+2Ds%P(g8 zW&dB}dHt}I_{1#5P#_Z-;n*mR;9I{`=8qXze~2C<9F7P z=JQkF|E$8ZezpHAJp2Do@?Ww4D?I#<_4}F=&H1OM`@eeqd!?QK8Np8T(#e62}l|8cc{15duCC%>yFzd!NC@zXN?jwjyLe`gTys{bP5UG-n<$&Vr4 zwf~Iup^yEMFQ{Nau~)*rZkpf~Zw=YNvk>iWv-KkfO8*}BR5 zP`rLyW&J15-PCy2-x*k&2o$G>%nNBi6A z=jWHeUY$4Nhxd=t?Kk;yNBepFY)5>W{TM&@5UvyPH61^Pl78Ixon2Gwzh?ZMPCPiI z@CQ1gi_Qa$AqQ2Fgvj5cn*D!hf!}yK+C(1rF{a@49PrH!+aQ>KSlx#o8Z#Ux6{=lB^)&wq5SzjptLrk~sI8md3e-);FZ#H0V&^5cki zZ9nb(HMaVvkbazh+VYPP?`r=n;_=)PTm5s151xvz-`Vo>iO()^<3A+cHGaSM1C_tltBL=lz2n zh%bHp&GWClNI%B!ps`kelRwClKhlwh|FC{Jk@%YS-$8jZe&D}M6FdK%N%p7l=zn(3VuU(^1(g7stl+|T3N zY|>xT{(pz`WB(@D#LoZkdGgB~dCVVJ|9?h&UY@_N#lNqd*Pp=@v;B+fpG}kf$NU<^ zWB$lk^38~M)xY%@rv1hBhoYb7&;3b1;>XthqdfVp#Jkr2EKmM?PyRCE)BMlzGm7}M z`g8kDB0fz&^N)M-&l6wyP26v^_(A{2{I%=<@%mBy{b%#!{?Gnu{(HEr`d_+@^(C1(4l z@#w!;{~ky6*RJ~({p$G#kDsTJe)vDPtyX{Y{*k_pJdeNH_;0KKTu=QM6A%B}>c5J3 z^dF7q`rkr)n*KV$NaOiQQ;0|Vd4`FKbNp!6UxRjb@$-~sza_6-f3?-Gy}!$rf0pbo z&L4{XJpR2ze5u=yTC%^~HmT$MqHDukIB3@qE!^ zNPkVoXLr(%_$Y607oWX7dF}oZO+WmH`$Ntq{Wa~sA*3JvtJuTNe@`pV*R|!JQN|aI zhyM`&SCRcS?LWRh0sgDp)6Rcw7SM2o}VX> z{aBxt@2&aY++TQz`FrB^i7lUFUi8}XbD5X>i){IY#8(b-v;Q;VF@I?K(f_bMSxJ0N z_rKpsKd!HqXSDV=*C(q_H{;ip@A{D+U*A*zx}N+7o_rHeesfQLdry83PktXyzLO`P zdDJidx_IiJ{kfn1KTh}KkMp$uMBfuqU$s5$Z|JGN3Gr$5=l#j%o_t$Reg{u}4@Vy7U-*5-fyCGJ z^N~&^{rG)p<)Pa7mwEo(gLu53!j|t#ysQ2}#Am;c&!27eXNfQFpIFvkd%v5l{>w=} z`j5u*^%1^54e_J#y#G>nsJVW3_5WyR`{VO>?4LKL`|IIFaOy|9PapSpOrm`kVX$Pkxan|Gp=`+>`&>lV9n` zbN~63`09$Eistb+ocq*#&M%KY+W1+1v|apY^ehM40o zexFx&z8S} z^tA-N3wdf4#KkN%fGCAs~I=WmzC{pLxsztr)^?SB~QFP{IOnruJwT|N2U zjy%WTMUFh%uf>0*W&MXb>Sz1EeS^kN8NW3B%wOfGpX)!ylON~Ev;Frw@@)TfN1pXR zoQztEHa*pX-Zzjox={$Cw=*1y{0X8hy)!8ZOI6Q4GIvHjZf*=+T1>8PLU zzpW>qAwJE2tp8Br)BMN$v7UTa;?wNs_8UmNtNj;y@}nGiw*MAKp8bE9CqKoJXZvS5 z@@)UJp8R}Iez7Od>+iJqWB={ussCe7ex)b>n~h5k$Bhk>*~q(a^%_mfsQ=;?*dPLm?O{jFY#P|-9Y+XL5@yp!5nBizY_Al`Jt69t+81Fy&?o((y$ImOIAJ?BM`>N;vh2Otn z|78*Llj7@rw){uLWB)_rv44l_|Gz7|R)1eP$6uo-&H1ai|K2azf6Q;@$fN$)f8UmP z{Jz?^o*K{blOg>WKl0}!*FPLTjrigFS75)!qyC7$qiVSQdHip8kJeewO+VCjGAbzdY-Ix~Kkbq~EpudK2$je{KH}<#0db_`A?k{}rD6 zHN<27u(kh2;<0|P<)56{$#4-kq{hMU3;XXb)-TteZ21R>cdh@!#6vGqwx7pe_4j9HlB3ep`7_a{Lv?ugl|p(`8YO_a9^Y z<@FoZFG#r^c>dGYAGUmdYCp_dwtUu;AK}Pz|GANP*o~C^$GkTG+VXcg>PP&c|DN(m z&Bh;(pA!}P^Oq*~ALgeKkMY-*=l9DZ{xlx`!};^b_x^AF_XO1+>)-MrcK(~^$-nQ( zf91*7nqm6Ca%^00+xo9gysQ73dGgzN@*Ny`%-{I^%)f}|@v6GN*de^G{3u*Ju3ncOm`w{i&_} z6UhI?@!Qh=-JVg--!1tEJoQiasGYWBh{uJ|e#K{xh#%tswnaKUI#@{Acq2apZCR z4e#e%eP;6brH$9{AAbL_A@Qa6pLzXa%#Eh~@L&E)&3`7Zu3r@%^Dox_2h?!=;eV{3 z7t`~ZYx?pZQ_LWB#?(e<$&2_H+HG z5s&%HR{u;-ejf2y|7-f${&$Ek{{BSqKl7h3kKdnI^4jyAZSDVo^~?UTE&nI+c&@Q6 zzsA$%_>~sF?7vN!ceH;8N1pr7?v6a$f2bqR`cEQ0e?@%%hUS0f&tg6o&l?)g_FqW6 z>-eEP-`ZCHZKNL@(zNk!Jo732kNr2pk!SzC<;j1*d`kSY{hu)JSpT0LdEUQlz~_&t z`s4K<)^8gVpSJ$O`T^^=>HW;{CynQLa{bQj-;LgHkNLCmM!WUf;yXOW(+pZ=XmzpMSb)B6R{ewzJ!{bx_o|37p6=jP=0$N3B5w-ec4S((fsPI>))4Ds+E z@>h4t@z3Wk#rV4=xgN}G@5iaMcvt(Ic>4bd(vSXP>;FASKlUFqz81xw_I_WD=l*vT>Bsq##$)`!`*ElLAB{iv zir(3zANE(=l{|i;{@|B;@nC`>^pEWSl0U!5+36OFex7_l_fMzk=lZYme$ABnGymEQ^ZKuA z{Au^EY5r&ZC-gPrH%&kDOP)6Eca5L!)PAn~Vo(2FHpQ%eTKm_g{&No555FTtzd_3W zJCFD@|FeF+ehs}yp%*FZpQ)@LH6G(P=Kssd{$Q)*c^CS9Q?9=j{}uNp+rd2hFY}S? zUn@M%e`BcrSpRDJv3|n-$-Tt;`X`OY{sFF^zD4>=zy2`K|5uQH_^E|AigZoz{`@AN_aQ{igqG`u97%sQx(rt(dI!A9MXTjn@D9?PUD3 zY&`^UDtwtr;HkE821uI>K- z+3#BaImEl_AM9!WhonC({y2VC67O37$0kt!$MsLk{&O$!uJPYumZ{&h{_Ti&ZNJmT zn)+S+r#*knHvYBW59++R{@9!9pYA`CKh%-O{Dt|mg82WH>kpOFlIIUxzk~gAYk2>P z*FSy8e-#hMb|dBapZW8NFW*w;KPe}TAK}U0M0_#+EcK7| z&)+QTKZWhb{Tr72c69$L?6tLjKIwPmKP28Y{Ez{os(IK1jL$44zEmzxdsj z|MWUPo}VA$>c5{n>#yw}+15XJ&a8iN{DdG-k9XWr-^|PaLX8(cx$Y0%Q82`rkyLSBq`}nNC z7V+Bk2aRX_8{TBr9~{y&{o4MwEx*e6gZnRLB(I;@{$)el>}OtEKWX+e&->rtkh1@9 z{~y->_fY(TLz>2`zu!~+XP$ozrr+N}FH+Wz{&Ti)y={}SuR^H1bHc+Gz7 z-#0qPjGyY-e=Jv?|H1YzBKvXvpI7W>zR{hg{g^*&`42tyf5H6G@%f*v{yNW__Pf@< zKJn0tl-r;Ew+`_YJG*{R#OFu4jb9HFpXPt|-&4e6|4p->dF}np8qe)N zoAt}O$Ch8<$g}+)67Smo`TQx(e_a2iq~A6Ez9JreLz*^!en-4({nhgq%lT71|4?|` zzk%PM{X+H!8zrB2upj>0?;JmT|5wp}FD2W-`~=#6P2+L?f#?5hINMx*A^x=bvH!Lv z9^;qB`^vfgTK_43+0K72y=T@R*Y7l*`=56HsPSz73ABF;|7$$XziyE8wjIg;ndZs$ z_Vqh>w!ahUNBmX3l57X!2lg+g^Uvx!|AM`o^8GVslKq(fDqc;tpZP5DXg`fd|HJwJ zwZua|+l}w+znhpZ`TgJK{=uE3AN8-CZ|A>Bp8PwW{3pc2|F-t8J;xkBT=`9iclF;E zjy%Q>?0*cV_qS{FKH|?e4*QY|8)rI zFa7vs*8dpRFV}C&7ufl)mm|;fU)ep$@o%etfTMnnpNl>Dk;J3_Y4&6M#q+mrVqRHy z`t}>}T>lYt|3K0Hx02f*_T%|Wm1IBOp8JO64QUK{1l46G@je< zdE!z3>S`}8hyAa$U*)3Y_GACQLG~klHJ;JJt`nlclo&C4>+sW}?xmas|v;Q3QpdWwEQa7IaPrVmR{(t57NBJem z{zvceR<6lS3{`ZpGpZPBM8)vgLa-kL!n)_75Pw7{8YM1&%!82m2StjW137V7%ot?Ehtv ztevd;`2H=lAJQ~lo4+-l$B$L+U%5DrTaCy55B8rgCI6@OKk(SUy@q(SKi3=I(SBI} zUqa7+%U>AJyU1VNDfi#;Y`>g8n`lsk;{!&k#f4_tNV{8Ae3(fdR zRc~ z`uBVAKc4?Mjr8OF6^PgBPT7Cz`(Hk{^M7Z$|Fih~H%nf9|BEHBzW>FN*Ph>*x8&9L z$5`^}`(G@1_5ClFy!!qZOJ05dizTn#Kd$g;<3IY3)_&-J82@Hd|4Tdn@$HX%{x+ZV zWBpw5wbuX4^}}19d}CP$pk8VE>&WjvaQ*3B(qC%-ar@VO(H#F_f8{sH{$qZ9;<5hH zcpg8uARgnN#cpG4w|{dj*^`44vS)8Hj@{6_rP^6L?g{;Tn! z{l@dJ%87T?-{Qh!JN1o@Oe-ZEM|Felt^B?OU^ zeq4Wb|J^eFXOe!`_3-c|qC#JlRRJS<|5TE9M=8q&kO+WkpWJjL$_a;8ge%5~;@x}Y+mG)!)3gTVk|2pE+ z?C1L5N<8j=)#8`!pG>@~{o4E6Z1q1)`d#Da1>)1}XaBuHJbr&wa7Pmk{sTes>V>8h`f@@7n&;9eHm5nZ)N0j?X`B{r58Q zuJ(UPe479H`s1&TJobO^`-L@MF~={QKl`4iYCP}XY)1MK|M@z}_n|P~%8^I?asIvo z@ikrl4y3$C4VsKNBn9$_CN6a=5v@oFxhS`9$e)-|6EG?;lJ{F$#yWW zJ^$F2*Ph>O%WKasw&k_w_uBGHlBhUW3XQtVHHSNFoiv5*q z+xhQ8y8jCPx8)am>R;-~f91%d{qX#U)#&}VHQjz2k$(8UqM=>;we{q8@#GKn zPx9pZc=B0C9`T3y`+DMQI{wCze#BpXUAy?3bN#jV zKWjYCKkv}^Rnzm&Qqqt4r=m&n_{ICLpLz1%c=Eq^^0i(w&mUatKY6+zzq+UXwLSSJ zo_x6{ztGcvpL_DheeBnMW!nAQmi?!tqyI2|;P+$O5nt2e$Ihf5{ikx%|@_OFg5{Wa}BEq?ONlKscy@A-89C;YGRh##E)oL-{(=g*AoPy7AZVA5Z-e>1KA z=KkFf;wy&5*T3_Y{FR>k^^QE=Ukv}>O1yU7Q(bbjKjMEP>96Vdf1LCe+h3ml!}aF) z*Pfq~x8!Ge>R;l?zwF6>=*hp~$n*OP?|;agKT91y;rhEQiU~abgWq3>_Xi>6_+egq zf1xd}y}!_w*WO=f%k%wDc<+%duf6}!mS5%f)AIgDTV8$sijTb|!P;@W=d??)`hAMO2zw)Si9KeXkw_aEBwt2{r;as1Za ze`u@!N9ups&*Ip$B0i*5Yw?Wmvo&mo?CH&1?mCqKlKzsZxo-;;mFk;nb>*#BEdJl>yI-QzCG%^U=g0r(=zrGV zjQoe+uWI$@_N%|Zv>*3xYdq^e-&4Q#{!L9k+uxMz$L~*VdF}m~8qf6)JnO$d@mRlV z`nmp-h);`O=C>pNx$>QfceVdW;?v@f?O#Ff|8VX9%N_ea>pzX`Pt(u5_WX0(_J7>7 z{rj=~^4uF+{ezhAAD@5N^20s(JBUw3>XMhAkNb!5{N=5PPt(tQTjE{y@9N3# zOFZ^JZQK7a;?wGn{)6{l9Y_5C%KMY@`y}_DwDAY_YdrVgZdCu`_^0S+{v1c1{eK?u zupe<)-6{J|+rOyTH`)I@e`&v;(|Fd;^9Sm$@vNWUUzVE}Uq8@!bNs!6{Ezn6c&s0A z{(b}TH9h~dns1K3u)n;M)_!LF$C3SMJmMGo#}kRK>Gxl#&mZfYTz`(gN6CJyzseP! z<8LPMm8Z)7yCwet@kRez@>=}c+RyJF$N85n&)2V9?f-=8pXNW@KZ^PPXW~nJ|0s|D z+V$hg1Crwp{Ri{!cf5Zj*Kd5s{ffKdIOK9T{?+|2?|C-gPrH%&j{AMKy1@%A^@AL{+@huXz|7qY+De-s|^ zkKdmkM||ny->iQR(x2}V*BdFvFYHJA?Q@RV{-w5`$Nzz3Kh{r`hiUC+_Ww(WNBi0G zS9tQ*Ir6-Ja4Ye6{*PuquV0?My=L2w$InN}e)zxQh~)MQ+rKP|N!))ulX$eh#m$v@Zc#K~^j*a8~d$zxt z*1w1YPC5S8)ZX89baMPNzmX^3g7{+pv(&Ghe^prWJ9z5fgZN_nDf+Sg!1b5*ynn5% z+qoV8+wa_dN0I$_?;GAj!FrhQMto(rIBsnDzQkkx(0HDIdH)O?(lq<~)A?uRjdJ}? z-ouf`Ur6>B+h5_){#d_^WWMD6-yFYYe{Rmd#r}7^*8fd@i6>w2k)M9`{ZWej@IUrX zZmVJc^ZKch^cT-xPO$U;J&ru2et{>y$diB9lmEz*|Jae|`1#zC=lFTklmFV0XZyc* zUtB{aAnGE9~aKZ9Ms19C_?t;QhTFi7)l_ z7qlPF9}Xh@rEfoT|Ee47m*4;3JRoiTyqKradWvdHiAjYuC>!6dwH- zT_{;Z7_8;?~(DV1f^SFoa z;PL$XdW%f`xc>wBImP&e`xjn(*W_{k7IW40oyQ;T{)6%}lKscy|AF-TCHPO{SwHW; zq5c}r`VXf0J54{2KOd6+(|CUV)VkFE)zwZ~IUGObq#yp%cwagDzYXcf^TR66N{%0H ze=Ytrp7rlT_kU-(}B><5~ZXRR7}rlS=(L{vKIw_J72mrXTH(`F}6cU+Vdb z>%SlAFWTQHx&4{v`|t8s$^N;*^ZC<}q`%bXPZ9(E&T`VM#n zrtwcY^5{QUKfFwQsrwI)KQF#x#_#{i_)~sfa{q<@F#o?r_6Hj!-#5zU%d-|6!LcKjB7`N8D;W{D=L!<>bFo#~;^!1?k85Sw1+q{h8P9KeFY2 zb<_|4q5sxiZ2G_S{xjEq>yv)$e^gwc`OoB=c=G)I0ayJ8(D{EFkMl3A-?t_EOYeVk z{kSLT$NqQzLe2jse*p6*%J^Z)A45F)kF9=w{;n(ki{qE2{oTm^^4nv-+1mdn zy+1Fvy_^5~k$%_uufe~+xHwI}+5gTb{fK|9{uqC-|2cyA(#OAP|FxvQ=)X&}_&51G z9C`GA?B7l#zNYuz#?k(3vHdPhu0QX8Y3Cn#h3ENiu%~`)|4r9#w%?=V|6=>A_M7}O zjy&2Q*N^5AkMS4dP<5x=ey_8BId9AlNp62`KQ(?V`FBWv{s%W!f|2@z4 zFQ(s*7299Y&-{C2KdwL9`j6uu*UxPERnA{i+7I!E{jbm1{t{n*WB+NtKdcyL7k}FC z4{dqv_lLIpO7b7hUu^lhOU(6$E3f^2QPYq47wx|u>96VecT>`j{#P+vYkzb6-O7`1 z?a6QF$ix3w|L;P4>HTl6-w!7Jn1AwDX#O|(BZ&uxl;H>B)8 z=3gcMfkT?cFCo6T{<5^6&mW){DeGtd&Ai*JzpMY%^_yzHIsXlm`>0@Nx_*=YnEZ!& zBSpDL`TEIMjy$e^+Td-jmnfKWMA}-=6v>dGgad`I(M9#y{*o&L+Op`;R>TYwNFy8Q1@-FVp?6#rgN9WdAe&JK2x= z=PmiNdzAH)E&ra$yXxQ2kw^bQ`!y%N)Z;Jf--h(pbo?x#``@wtE+1nTKMROQ|I>KX ze@$8U?o9O$rpC`7t?qt<@;LtM4mINs{ipojcJ<$%?04nMhM4;C`ypHXhk5EBe}}0b z*N<%VA5Hp;@nh+~Zp5egFKzxn{Mg!m2I+UTzaQ~w_GA5r{loK#FZKAt{u|Evhs66| zxDJkfgOvNvO~hmTw&m~g5_KHz(fJ{;NruwJ(592TPFZLzAy2js%=5ZY7J~h`fT>s-qKl)$gSiAMdS;V9Mw*2%N zX8dFQVauF5GuAj-@ocw{|7wnzli+js(*r`evZF0Y5%{v;t&0mQ;xqkzBJpv zxPBjR7k}FG^U4(-^~e1)Bgy|YUH>tpAN{9Xen*|=zuP_eiJts)PyQ)SevTtwCJx2# zXYjrJ-Z4Wx@4@1ynw_M?2vl$N44B@82fArq8b%Pc-`%;yX)r!+!3cpOF0+ zpEMr*3-jC8#6v&yRd>qQM{3jaJ&N{E)W#Qcf3D1vU(1tU-;;0V$#3q-xAf$<_vCl; zIe14)`U&u{P9zU4p^BY`W z(0Crd`cVBberY_$U)-N}3Gp>O{*EU7us?V(*?(OBA1*cLuQVR$O6Oi8Xk>__}RLiQtmise-EA3XohA^mxIzi3XepZPb4$NqrEbN^BMpQZjUNq?IC ztY7WFs(y3*@H^|5_p564=lEYEZ^jSeU*pmL5kF0duj&5373s(RelRUL{<;1;dGh-? z^6($Vk1oX5wEyPMO>Y0p!*>2Vf$T^8*z%`3^0+>Y-)D6vzSREX_Ul)}`Z<1wk$&uN z1drIY-?g6nm7e@9p8P$Ye5E6g_Q&*X|Fs<@X}}*x$0{XHflJ`97Zd=aGI_|Nr`o>3>)IdwJUbHrem0 zzccHX-}h?mS35A{m)B3l{-?w*?(fC?v6StH{$h_a|G@eg^Y^2lnf}jgTH5tL_x~yM z`_w$nKb}hN|LnhJQ%w6^`STrlw!hYgrv6ML@t>vrXF2NU`Uj3Y#(%W`reuG0tv_t9 zueD?S@_f}`W^((p|9AD|wdWJs>esHX>Abmreknbl#q6!Ceybzn2iosddcO_M-&Q57 zN5cN!oBWUdmwVc-{SNTt&!p!&Vg9z&e#0CtNvEg-Rx)o4=4RK?SJk4 zrny;m{?~qAtns}5xsL0G{7i=|}x@FD17>&tHdl@<)5}Jw5r0J^9g|{4I_=;^$uB9woli@x$@2UjKc?E`H{+ z{n$USWBYu|H*p9*R=n%_XB5Nv-6+!eqdW(JO8%jw;=za{WTu_ z59_yWh%a^jL;Iuu52F3QQn!D&{wj;sCb++spO268C#1ZNVP0Fm+49=+@ojnS`S`ZH z_I!Me=kbG|j}Hzh`;U2b{C&f&|MBzjp%*FZNBrUWSpTBG2@3{Zs39`R<{g*p#HGQu|*PrK*e%ybPU8MQXynela->)R^g|g)rdg@>9$$#(2 zBmS{}yk3dk&yhbf_J7*%6W3g(#P4Fe_G?Bw-Vc|t6j#t`0pB(?(ey_jj z#&i6=MD;KFU(wI}65@;TtMF|9az~!WuU_=~g;LL7Tz~EUS#2C;{!69)8qfaw$&qLM zKhW>n;Xh43^Y!WdtQbFS`3;Cq)6ezS#$Q|gd$N96e`q}G*Tzp<{xs5${-^Oge)jj| zFZblH^5jQ*^5Z@E37-5EPyT67ezqt7iYNbuC%?>-|H6~M;$w6EbnSn?dFo%&Q~!E- zKl|79)Zf&TZ|2Ew>B+bDCS3oU=FS_>-+9KJH}uc* z*nhRue>&@z=Lgv8A4Gid`iG_d%ZPXN-<8A{#}7;WV~KaQ|8Y-V`~8gO ze~kZ#|K~}6b&db!7bW*2K7XE1`mukI{XRMVnO{jfu77Ae?_aF;sS^K|`Zprp)&AXx zFYcdN>dz3Lrl0G-%KP%UD&fARPG(qN+}na}s-_Wy|9PhR@= zH`h-s$o^vc%X79l?l}H;^5i>s@|V!{UswAN_SCOEUmMRUPxIfgj{150o<;hx{>c1pH+~NAu-(c z_WOXJKQtg7_iXtahr8L&`t$Vs&b0b7f9tt!`q_UUJNl1#?fSjuKjwM<2Zt2xj+E_x&e%$~3HD9x=bvR)OSYfe zPkVlwE#Hm$Z*l*{Qor_oB29l<{KEel&-L$2_80dbEbZ5xzh|pod%uk>uRT9b<1zo> z{?+{`{wo(H?>nOZ`=;D}+W3_zOO9XWdHlkCKN`>Ne>Bw}@vHOZ`u$Ymi|Yr)evBVD z|2UKQnjZhu=ijW6?0??B(dwU5c*Gy}uP(0f`kU*Yt4KfEFIQiyzsYOw_tN;Z_yvcQ z`x~Es-$C|+L&`kI-^0Y$bo^<*zs)qz{BQQZk@Wj*w4W{iG}Yggf60?Sg7-h<`k$@+ z+V7uj`8Pf7|InE?_dl!(;hB5o^J+5a42?4N#4`b+)$XCD8w-@gXyB*!ntKaBr} z(ev~0{5#aYx>KJ27LxwTL2~}3*w5q7I9flIOM7LeoBP(N2lMwh^XB;b*(&GHvEIxK zO~1)Ek@FDP2m5o++3^`q{vc1jk0<|#C!cfX8-^P>Q!;?SGlYeAZC&R^Pe_Q|c@zj65Cx5dif0rl! zyeI#bC;y=*-(b97|Jln^e@}yf%K>^4j=i%gwG#iCMRxuF7ry@&>winW?4IQD`)~A@MZ+1M|I}RJaUW}yp|9{KkADX% ze2`b`U(g?X5!?OF1jT-OFE{L9{V(5}%m*t}{l@vP=0970vx$oSm3I2I`8TlS)%nAc z-^SDaojiGU{;;%vw5I_|W@8ueg0hdx9e=oj2x&1QrlCOg?uZ@4U{A5r4$4^eSKf9)#{m*&w%RKr0 z>HSGKf6q45?2p?YzdsxDpi=*)cKi*V{1{LEAy0m~GjHyHwxRbg!T;KOv^f5E_vCML z=HvFq`@`}IPu;%wHMGC5emiGs95>qfKhr{sACuS4-)wnp{cg)^=fAeRcK&M1Yv+%) zymtO$%WLPKw!F6gV9RU!C$_wH{%Ff<=g&HCj-S^_KR^d5_WzcDAODBT`Hy=3&|2k< z^Op$^C6C{^ZSD9=R{8xyyl&2IZ^z$3*S}DI?RTs^{(a!g%lbvGd)@X(a{bXBoU;C9 zbp06iSDa{9|KB}%ZT(Z(*G~TzPbAmhmS5?~Yx@_K=iAw@)xZ1#JASXHlI#CBd}01N zOx}BYCcXa_?VrC))o<|UJM(e;wwxK;y^ExXQ|QNcPC0(Bemc4S6{G&%{?YQ@Rc-$> zf9v1#_X_{Iq_7kASKMXCccAwdTJXmB*CLl(fBX&*b|Gc|Y1a>I`9nPQpWw+~;?5W1 zcZAG8Piy={t^I~JjeLpohZfH!`(L{cD!hNe;5#_;=K5PZ|E!p-*>CdN{*x`Qoj=*~ z+WChqU#a-dmd|=e_novgLwmKZF+vQHvZ~-JpbeQ*A3|YJo4nTlZ231{ zQ1mag)BnCF|FtLo+1zCNE5EU`|7TDBu$Pkcm;Yd=f2t=x$CGdVvY-7UJ^A;Yd2{?Z z`juq+^L2ai&{z1*<1fEI4&!HeJv;v2ihf&OTR+AV>~+Vzi$oi+cP{1$l~#>nFCnx_@D5zjpt9 zejmH~zr@eqm-~mxJKOQAJip(OU+k%0yMM>ler^1)<<Hj|6?`Y)W2{+GM_eoVE<>{+sS-oPdokJdh%NQ%2LB zy|v2wqvGo?_#F|q1FwJH_vAnKsQFnDUaXU`XxU^o4?HYLp%Sm<*#0nT>tz?JN-9#^4H(sr~gS${c}8d z&Hv?N?EI&m|6B6v{-GtW?Z0O4^|RlW*Y;m+d9D7oyw-j?ACDinet(N{{fGNKzH|S- zPvfW9`Txs&a{mdQvg3dCy3f9?IP%xmj+TYf!H{o4A+R=>7>wB@z^7w!Fz?7uCREB^mTYkzb8 z-p`Xi+LLefNwWRg^ZU8}J9_emdh*)!cU${kQ?5VS^0#=}|1V|zXsiE0PyO2cd$#%) zYxKa#H3A}+Uuq?b#2 zholW!#>cm-VoTDWsKcM(C#fEhe6?CZl!Tu;h5zgQS+{oKkMO^Bo{OKi)J^Vt-9Wx? zD(RMzwvn{yWHY{Y5P5q^J4$+xq(@46qNLp=(la*z_#1BZP%u}U+?bQ?$&nKw!60qsuA7A(7MaE{dXwuw|(1P z{?fjSseSu)tE&H}46`Nw@y9>@KyUr0zx*?P{4<_nR{Lju`DbqUXKwhrxxr%!F@tFP6zgnj|}SGe?afPeT*-shR6DMKdWm5$Y1@=8W^|G@6&hyV8o zzl6v7p5Ap}*Pw0pUZ?ix-}UV7r}jEMWbrL%d)mOh{Re~!O%UC-`)TBxvZ zSWNg|+d|oKIo$??xlikR_SxZ*Jn8JiUAA$EMCUBE1?^WmQ~0Z&2sRNpk|=N0&lcgA z=sXAfsM?wETM&#AL3!cZU;owp>(9bpJBR_6219O6ISJQGTS;M2_u zNsyOzi1-HKKj;U4VJM5L2sh1boe94M!Q9q`BtX9STWl--j?zKlzp8v*_`L9k!*GER zHx1?c5aQdl%M^~ZYZqr&)CxrW9bEh^2(AeKsH(s0#Qh3~%1(^AwUJR$v$P<%T6p-s zT=;U~$MlX$|Lar!*Pn&IZVLa8a)5ta&f_0{F0S~EElhy*k0bu@&pQ=>!#|Jt8CRM- z+7HqPgpc|_^l5le4@u(|Wq&b0JFr-*MSd^_P;AAiq<KcW#{DAl?{x8QLl71AXRK@s+@VWXX zzmhl{$aWX<)C^?y-C7X8V5^xdps47BSX^XF${A{x$43kQ1m4dY6bD@p&v?_$H- zk2W=$-(p?b|8+uZ`_;~@a=1=tG3Lpt2kV5EOij#RH^97R=3gzqd}Ye(1(=6S`RW1Y z7gJsqVBRq0YXq1NOnLoqe9u%B75=Uh&ZHQ>s~)Tqj{F#xP5D{@##>Xqc7Sozl&=$D zd^F_^1B`p7yitJh%#^QN9H&hAdI82CQ@(zHamAEx5MaD8aWG8ehlGFE3Yr9EGH#%M9aE4u4stRcLEcUB zHNU!H9yqagZ0i72)^jGdlbi+5h5hndob9dg1>d zxIIjh{5Bz!*9uo3nakpKgq@Fwd_R&uTaY&iwkG?d@jcSppnWF%D+nTgMW1)Vf06un zk}nhac#&TkWez_p!hcczE%wMnUxTTI|AXMSFpcc25PRB*eC^O7kw4p!-x`PVsGKkM z%@lIpCi$C%@+3cOT_|UrpyHJM3OV72our&mN5q1;NH5FCP}i+nyqCBk~H7?5$ZwlJ9ZU9* z{OgGPWRV{#aDDpufpYVJv$2c%l%`?8Dfzb)dB+W6d4G}bEb{3hKUpTij-foMUWX|1Xdk37Zpb*03)iyIr$Xd6 ziah*U`1CEv*9i_8ykFsaEs>uu@lKuB6@+nfz zvP0u?I*LKhiM-EYv0TC=_(0_SNd6y@FA(`;v8T~$v7MJ59+&g2$XklM-x0CAr|9h< z^0$wS<@-whV?^Hcs91ig$j=aYf6?1jkg0Q^+G>JpXDO2xH*<%9$XR1lj>EgUhL=BZi(|p z>x1aCmdJk|6U#e@ym2T`DyNy`UvX=k|HrtPptZ<9zActFl5%zz`Puix@-@T$9DO>8 zJo7*-Um*28LgeR9jOEcjN%T2ciVs{M^6&4D^B*emD?)j# zV4Yy@75f!3#%G&BaEIidJ2TGznVkPl2<1tBKsm2n6PE*f9+2`^hecYt*dFNJSmf;kX{H11n@5h>eD_P#%q+hi}xepm8gT zpR(IxJ7t?WXe9ZYm&f@(kvK;@Y<+v2A9kX>b`*I7saG>8r`=X@IlGA7)*|oGB9=q% z?jj!`^1+fH?cPDkN1X2~`M+!#mov0(toRU-_h}Q$>q$9?lLMq2YzrYyjubiUL7bc_ z^0lR2{|d`bYL_0Ow`|W??`D#JpvYT_9Q|vU$oCexm>-N5c}J1gmU8YC`Fuh=jggZ6c2Mmeum^zc`(^5XFkd&`S&QF|Gs29n%5P2}gEWd-u zGbBF+<-8N;hab9&JWKhnKz@?nE%IQhS(L#F+khXa08U%b~D zcD5FImhvAd@*K$rqnwL-79tbnTq5#dnyGi3$TK9LC-U;VSo-QKKkbHp1vm}qM>lWgK!1U!eR)&GOe@C$=X;@(v=;l6-*3b0UY{ zYf;W)X8F@l4$0p}IVAsCeM4lu0o+1xsnB|-(a=a%Tdiz5zzkh}N za+FWyj7Ry6%zpF=qxk!MKWQRG>YcNKY#!cm~EDS ztjM!e{s5Fi^6N#Op>igp9FosQIV68is74nmOop8gU&@NO?8<7WdO?x^aKb6x>HNy)Q1%HzK5RnJ#nf||4xVaz6#OagFN3^| z$g|{!!;t@F)6Ra#Px5O;o}+T6h&))|Y_HdmpUPP&@(kr~5^nHD_Gd}nUgW_mrk!0y zo}>I(>7SvbhV=P3VUkW>BzA`jj&>-DwBGbFFSm9!VhTZ=r{*sRw+ zBF~WgG?YW~tjKdDza4VY`-sScg{J-UMV=w~HzLoHeDxM_y>cXPE%M-Pv;2cao*{V; zqH(bjmz&P^W#L6 zBXW!z(eF>9{+=WGa+I^ow6oSWVyDPaek+mZDF1OH50;zd3`032pC)rfJoAa^xATx+@|_oB1z6IV8UZ<&gXik>^PM5c11@GW_s9@{_z_+qhnM z{}=3RF7n_@)6PRho+0@KBF~B(<=laCzB0?1jdDo-CCVZBdfSQrNxp~3gRjlA^BG#&yjrncCr1zinx5}Z6op=#oNIm&q{u@V{eqx zthceQxB}%+{s|(l=o4#%-ltH`w`P48i#$W}UqqfIdDHEsT||!ZTZ%lhM$dwskhg{W zJ5z5*k!MAY{HKaM*vc&DJjlN{%ee#PlRSs=NxoF%Ig&TnLE3Aj*~NV+BrhxS;{{dx*{(P~=&WqhG8Z{!v&@lDv(`gWpZR9WU|>$uALkmgIM#e3HL}^8YZ){{rQcyvgq3 zPm*^Md5+|LMIQWVmj7>&XGs1$$|v~>luzXGwmo z$a5rr6y?{7#|M=EF3KnQFDRenTkj$5OY#Fn9@I9=KUd@#l2?j6OY&JLpX48-{5od& zYwj7_lOg%8BF~ciUn0+ue5lBSx@P(Jp?s3RhVn&@e(@Q~SCHVm& z&yl>R$b))j`RAZ~k;9(LM4r#Z`60gx`KiA@E%F?dzeMC&%KyE{gVjxY8tyIiC3#zs z=ct^+MV_VnXCc4HVgF4izs%G-7v+%rSCm8YZ92qu2C|++zvwCQ9LWbEe|=N$AdnjMz@Xt3Wr-4~cgN)R7OLLrWE%FTIKS1PJlAk8> z9LcjNe=Sq*9VnmVPojL1zlHKi{x!;9+bqBSJ`!&v-%8|Jl1D$!iRP&c`Qa>)=P3UO zkq7ITddH)DD(6|0Px$iTtOboDEHTt`T{L@V^R$xjw}R^%xE z9F((_ISyY1`Nlni=!1IQFY*lKe_rHSk}pSoDrdC=q+XPN6OjikOnY_}d6vpK2IY|a zY>`*I8r$EiP>UeAMC8FHro2+*S&^f@b3~pa`8OzM)3_Yu-|)b=UKx@161{tfJV*I^ zi#%v%mNO3JkbEKJ`oz<&PJ6hUAM-4%y$}5YbEdJBU0-@_r%@nwxs>7CGK;kM?>}rp<*A3-@=$K}KRmr>4Errxhm4$0R%O#I)%%->4n z8S>|mBF~b1fXH)H&aIGB{+!5zte6Y-##)Gm&RRj`rFCaw_L&k>{wKb5XvuJL3E%3sFAh|2N9t#u8Ymnf&L zS`dBtKZ>!S<&8XNf#R@=++Coz{`UVRy<*R1D-4<$El9b+nQg?J${dCy~(N4pMDy+{dB=&#`Exm z@zr?J_{(@|hIFWXevNw#-Q|`UApOLQx5K?Z-JB74!ql(Alg8iCoJQ_)f5BtM&l|}8 zgKPiQaIdkO6T@T12WpP-$#~NEV$E;j=5N$|yfoM0AK*QV|BA;=PT@haUIDJ_<>UT! zvRw71T8}qoxdZW(@#&h=)b0O%JdSJr3z}o<4{A;`H>dDm=|66~CLZ9L-wyYiyE(%& z$M{^$G5#2yGQLyuTe#!)B_1=!;~CATUdOZI5LvI3@#eVysH~B$SAX@E?s`qew6uZGTvQtTDj{r0*@QNP4kVf(0t=h zXnt!q|1Hfo{=McKFObRhGF}WAQg@uhgm_$#<~RoFoIq1*8X+#l@rQ+~Ac6EpQ~@wlna z#RKCH;VI)!;QkPIyF8;gxc0e2bBuqYIXAlfAHw6tf6;v7XEh(!@h?3_#vz{R=GVdl zTdn? zzteoz$g{C&+geo*s`|EBrl-26flm>-N+ z#slMZ@RaeUxIf;_Z>Rajdul$e^ZW?Snc(Kk!xQGb`H1G5`W>2Y{1BcrIr%2aIC!<) z^LSM}MUM8_29Hm4`^?1y;}2^Nt~qaO&LlU-o5cQaycQnMb?cjIz40!1%6RyHvPIW# zex92%Uh|FLs`7_n#LuXS$p76&^GD^Pie;>MQ3lKE~VP zDdQt>|7KaP_A^U!aJ|laOmmFy)SMY^|KH&W(|>`<(r4V%SHlD2?eV0^8HuM%{Sw@t z>8{sPns59Ct-r3Dry7fo!xbZ*nzxu+n_mNu8^0D0jJMW& zT(@su%}KcVd75K(iRfcv*ej^^*w99;LGKQza9jj1vY{%p6O-gw;jTs$zo5l{f3BPJFdjF)OY@EYruoJz-^}*9)6H*($BmE01LODNDdS1apXcU(ulcx+|6iJ8 z>MPEm&-rdn13YfL7ari6KSp!za&s1Ij`3}pV|+KB!ZrVA&AHpnFEx|xZoCejF#A<^ zJVm|ck5pga<}b$mdtBd&$BiGw1LK$6B7LTeUyu6>-TXW}Zu|i}FuqgsjsL3oi`@JQ zw@N>8AJ{R{FyZPHR-}twhZ@lm<#>aR=++X76$MLxFyEW%d*|NHQ|APmn z{wu9FUNj;7B+dSF4el>>`?&#+8=ry)#vjL1#`kOfGB-cpZEP>&)$zc1PdsHjf&0td z{EeD#{0+^=bv!@UoO|7zGn!+(>}=^jFy0VP8NUJdSGf7(@VN1LnvZLrOEqVuoAa>d z7=KxF0;$)W9qQDpAJqI+ZhoQL*U0029KHX z*`@jH=ephh!V{*x=AG=%roJ!kuXFnxq4mZmYyCrR{X(rb{xlvK{|HYR{|!%?{>#i` ze|UIAw1eyV*1_Y(JK=%x(Rj-EJk5W^&3{DmjVCqV_!qcW&)uI-;W6VC=d=HqoJM%U z)c42zN8LWh<8kBj@xb^-JZ1b%&40|zKcxA_|IvKo7v05r8E=65>)rgWc+#xzNIXvc zNanYBns0KpX#NH_f3M~kFLbx`>0Ld_*{@pQ{^OFP%Z=j!uKVF!JZ1bDt>5VO^O4pY z{|@&zx%GeJapT1nNdJNHig?Vd*L8Tpcpp4Pj;`-$+#f2Up1|WzxZ|^2b8sD>XEf(Y zcfEFLeO)*IFrGAh7Q9E+H*Rt+#l36X?br;D8Sje+CTAL+GQJE?n4HbHzuBx89yk6I z9vDAwA;*jHx_Htow+HS&Yv7Arv6hrF!jITDdQyFnAwgcm$IK5zYO=c zyZto8((tP7d%{TtB=0E4=AJTl|CpF*rdCNFnj910| z=iU5fc-(kjJTN|7^Nml@{1@E(6`F7SQO!60g6124PxD`N^S{=7<7YJAc$wugK1s9x z)WB1wzCG^0=~9y9e{;3-r8JMO>YF1PT# zG7fR$m*9c%`gqFt^|=44o1dfk#%F52@fDhH{29$pO1{oxyEO;bdHx(8f6eWu+6r0U zz<5VIWqcg&zwYKdgvWck^Xdocrv5k{7%#h$~?}+n9uy$9$Y*X3S<`yaSD-SMPZugQ4I)Gx%nM(+9L z3C;h|&EJK`jemj%xc2#j=6vMl6kp4JWxPHfGyM#}6UJxYN#kqrz~sM3{6@-vo~v?~4b~{0FYL4+wHOKgGxc`adXnyg4{Rh|mvko3J z>w7((GW8R2|5LZmMR?r!7Cd3{KfnW1e*#Y#zhE8XzsFs#tMCBV_3D79O#Mha{+a1t zbBw>DIk=AJ9?jY7=A6_V<7FR`{!_;5;Qr@sPG>xBdKQ{7pQC>v9ih&R1@JzDL;4jbDnVjJL!6 z{cg?}JZ^ls<{N)r^KtF-GtK$h&Hr0-j8}h@{ls{8+&|#vOvK~HSK)#2mo(q_*IJ)) z^MBQP;~9^!KYZiXm%-!4>)?U$9(W4Zahs?)2i^QNnq&NJ%`tuo_YX;q=9gN}euC?~ zQ43EQ?|}Pj^n)AJz zb3${BSK3IQ#yjFE;}dZI2RDBu9>=xM=QPLEr!?oNn^R=baSTQ zf$;}5$M{a%|H;icruoJ%c!F^=-U3eBs-Y&99Be zaUIWgc*@jgYtFB3&TP#w{ve(($L~%&Y5b_>A9M4|Zf3h1Z-NKL2jMB>Gjad8n;&St z@%J>}_>Y>8>$nwpiat-c`B&kA@xEIBn_E9i>y7^hPZ{5j`@g$6#h#`g;|qoX#QC@ z|6|QJeoXU?m)b`E#v9=N-){b3JZ^jj9vEM(`Np5u{D0j1l;#^Rx?TDVj9-DLjNgF! z=iL19c-;76JZbjBXYjz(@5WQcPvAbU#OZue_F3saZoDoY81ICqjE}+n44J_+e}U#3 ze@gR>f2jG!f5p9~?)+2XIqBce=PtJi9ydM!4~$R6Q^xO8?;`m+KX1qV{O)r1<1y2x z_dMfl>Mz3sB4Bdo>?#%=PwG%{Tsu<`j1O{2h-Quk<4Q8*hTAj1R(-rvGWUU&LMRYCLZIMcixV z?w|Ydz|{YP$4q_Ym!$ucsc(TNO#O|xU)1gM9z1URIXp0a2u~S5r}@R){Ms+GKO1j_ z2gYy2Q^xPW{o;}@|9akf&B1j)*{wOo|JIxmZq9|Tus`6M(-cn`zY+IKy6d|TkK@|s zGn!-SztfyjZcdF?88_pD@ubV=jQjo1LIRQ$M{;@Ki|#Sq4~zY(0p9``9*WeyE(<)V1F}S0}qUM#8bwHDE@r8K8EO$MgH2xayS8)3| zg2#;)dXxRucr`p_yd~~ebn`RuI4hIN@i`<-NG{^WJJTQJz^Np9=$#$va z=GVvL#(Uv`@hN!9_`RB6+0Eao`NsEXzVYLlZ@lzd^nbCNUl)%X?~Vt!{FLY2s5w>K zoIKoX;m(uu@R;%Y@i;k}|2&>DzEA5fahL18&HiS*8lJ*6zk~W{5%p|5?u+Pob0HoW ze*sS!{}%VFx;drakv>zneAn}?!Q+>@^*7>y@p+nKd@Jr>=H`5(`NoUB%eWb@ho_7W z*LvRHsN*wP>y6)q`_MZ&o-|(K zJ+`CCsf7DA+cecZ3*=J(Kiigh< z@ez2+_+;F#>n?Yt<{N)f^Nqi*_4VAGpS0e1#Sa(<<1yU7+ReEMj~icw2gcvfeB&w2 zzsAik^dbAd@!EJ`ydR!2J{|Y3b@SI~zVW2y8~;V~jbHeY^y$}k^PA&wAv_)0uw z{0+@-;O3ve6J|d=|6{hJsc(e)4c(kRc+%wL;c-)cFCG}*f~SmsjQfq;<^HDm#w+cX z{sZI9@s#l_+;8mWC-AuO`!wJ94$U|IwdOZ*^Z(L(M$co8JeI8_&f9-F7%+3E;^NpX?eB+h& z&_6C|o>w1_H+S=g;DPa5HOKgaxZlFfc}4S$AJBYU`#G*TE!~_;K9m0A#v9^+@qu{C z_ypXKx%taA-}qCSZ~R@&H~y{Ww{r9I@1=j^Rq?=hQ#^(1`1I18)^2{D<``d!C(Lp2 zqUM|WgSg+u&G$a1e_Z>y7*Cn{Hn`u`%^9UR#uwm$@y(iVe6QxWlYH&xq~_p_qpKay ztFVv#-*{8pZ|~;x!UJ4$CTNcFMViyWUEi&E(v1HnxYx>^-+sqq#>;#m{U?mq!{cVT zJ@CNzSUhF?F5K_v_P-uan&s}m3Qo#`oeW<7aTco10U4zw{Y5 z-U1Jd55iNpu2-JsT<_*D*Bs;9wZ6MspVE3<^N-3H-Ee47=IHFjPKTbhK36C2;ga^jYPjMU>?}Yn(-Taw&(rmAXG{@BM)SP~9&i8mQ zR9yb`yrSQ*znS`)cwoF8o-&?^`~BVJ&enWfm;0dRnEKZ=XMme?SaXaQImmW5UK3B@ zy4-qre4v}(RCA1X&>Z7Eaet7TGf4A|57T_(V>I9RG|eCE=HIUQ#+PWm@%uF2_y)}% z;^uGDeB(*YH~y~X8{eb(H@f);G~f7-ns5B1<{Lk!`I&Bh(L?Od#>?S>@hW)Acum}o zyZQAs-*`*SH{M0_aY^&M37V7T=C9Kn;~#5|@qCA6eZ4mBdA}&`XS?}z@wo9mcwl@6 zo-+QB<_~l8cWb`!KQ-TY)o-Q$l=05EpX26Fz~i`l*Yg%=j;Y_GIm6wYPc;YEoD-U3 z>MMRHeflHZoERQAo{a~%=HHCR%=TKR`6J!@4>aHS@0xG?f+Nyr!sIu=Q`Boe9q^>7 zkKR-lF#`oa z9ydM)4~#F+`Z1Ct|9ak|cna72H*tTgRH`4r ze+(WozD)CtKd1S|Kga#4vj51xp7$*t;JV$<;3-po;jgk@@oDaUcpV-X&%{&46SzO! z?dM+2!L^^Qnqz#A=G^S|a{`a!y1r$PN&hKR-w5|-xH&`cxbfTZ!1#LH>+EjF*EDCQ zoBxaE7_WSsK8<(A{af6e33%N28ay!mj^^AiIr6XP{eY)T{rM-PAOBW&xy|vo@kw}K z{9!zW>vFei&MY^7ujUv(iO0-1m;8-!qh9l`z~c!wzdIfn&($2`t8xD}H|GV-H~zKe z8!z}fed5~Zg?N0nn}0PP81Jq*#&dB0b~k6H<{MwC`Np5d6K0&>!c(UHFz(NBm-{!K zG&$u@$~eTS*Kw$Yr%X;K+`q%k&(R#?v+=@<98+KU4~~~R z-JFJa+;~4cFrKUR^W2f84*vUG7voZhQ$I7+L=<%{Tt1<{K~nC)?3@L)>5F z=J&+oxO~_1CTotVe?)T@yE$KKj`8#UV*HJ_!c({|cQ77b;^xoN9OLUW$9NL=mr9Q2 zf2lcmBq2`^(&ZI^l8Slkvd#D$O_kismnO^S{x2T>Jk=b4-1;zomcw zUN@%$9ydN34~#FzQ@Aeo8O>SY=6|L+#=UbBy zkD2586+B`53p{E3H#{I;_meW`STEzXaeuYjPd7ZkH78edjNhj@Ya~bOU&rIdk7&N} zlHvc_75#s&#+%~)eQtg>9ydN84~##Br;P8_daiG^|3Vq`W4s>jKj8M0g~yFA!UN+; z%{P8R^Vhoh74k_xapP_9!1!o9WqdjAKj`M~(0t=3G~al|{EUzBPPiYq`BU(?@dxn0 z_#2vU{0Gfn=jLBffblWj77uXwDbE{$`wzJ}Yc&(_ztVi; z1qw56>m|Q5=ezQFJ>!?*FfPMytNEI5e3QD#*@Y)e{hxT! zc*P>JzTWlja+}}@^0og#TK~A)|Lu6p_(sh!{t2Emeopf@y7|?MN}n;~UGaqRX?W83 zI^5gj=D(x)#*b;f@e0MHpQP~^?mgk=kHTZd7vl-zFKIq5X`Z)RbDnhbk86(clEvxM z__esVS#mVL2cE!nf6mh!<16u)*?%@`{!?!LPR++P|B$-LDO`g7O-^+@_Ov?=-SLF+ zJ2l7nX58E2=Iqye;~6ETpM>#Rc+&Vl-20C^4wEzo*Kt^_ImTbpoM+rV58*LfzUz5s zHOJIfDkc4UTiu-N@R;!dcmmh_37WG_M185&GoCc{yVOnn5!~zHu2->g^#8K-FaLU8Ej)qie%K378lRy#uejr| z9*-ISQ1gv{q4~J>b5e6&b@MMeU;0lNZ;2<355>Ktn=>De8GlCejen*2#?NW~Yi@px z^3rDv*Y#?TCr$k*+4S)@6}x8e!oUur(C%RQ|*Z@BrDFJL^4x4@Ie`{CXW$d)v()ipOvrhZ&kPO*!m|CsS+c*6KlJZXFh?!7Ph+W&tv2iN`l zbImcHzY_hJdAJ_#ec<*#OzVv=#1pvovs!aLbaOUo4zBfY;Ym~fv*vu{=9H;S|HkX% z30(8L&-)IY-x@u7Ia_(D8s`~}V5@8+M-eB+l~D*YsI9p~$C?`t>bMm%QxHq9}SM)Qq-tog=&)_mjV)u8_) zZvK^c%y?ToVSF&2G=7`rfA8ksr}@TT)qLaoG~f7Nn*W2FU;YY?3*&Y1gz?UJ(s&l` z9d+|>)_mj3G~f6}%{Tsz=KtvCAJTl|8CS}BC5%_Xlg69i-cN3Re>`S@pf9@+g;x=c*4{#(Hv9%jMf|9iziLaS#?uir4If7=Jwwjj~O4X z^?ls_Z&&}_%~`KGrv6PlVf=eMX}m;T_6L(+7x((Q{dC6@ran(|O#L!EY3jFYj;a4b z>y4koy_4=Z`1R=Dcx&A2=k`AoPni1Inq%tM<4IG$Q}h3D`}tP$O-{+H>C@CV!4t*@ z;z^S;6ZiVN>-C`K8-HDMO#Tme!qgYPM*2(|uZw#F+~sytKjn_Y1UzQ^emr6PRjoJq zU*kzre^zr$ebsB}-*{`>J1u?6zn(V~PvH7|`EJcI{vXXb&7Xg zPHn9>-V0Bfe#WVr`rC1DkemM?9y9)&*5`NYcWJ%x6rM0Sr`1h;i6(4E$;rXJA#VK=%`yHc zo*-YB`-6x;1_1dH|_}izxA^y^bD_}_x%Xz zzW_OF@SlvY$B!A`hL;}c=DZqt1#cSjlIHKCz6kY2Sng-|Y4X)mxM%W@;suPK2>rjU z@88rnHp?v&lW~X{ua0*#-T?1mJcjqjb$vVHgN^r${5;S9S+;v3pA5txJor^ST$$)2 zOZ_+T@XP396rTEBd?7g#@x&?Dr{Vse;EkHTUH1P$_=otH_^tTo__#?@pM$5!-(d2O zQa@#w)Q7+J6@8q*`;HdhgBNQh{rqQycz3*N=;`BY0r_k$uMWP-EVn%#;5rUN$nQH* z^4F4|jpv&n{t-SJ-;K|~^TNk&-`m4zK5g(f)UWnx$$G;gVzK!~Pt!4b%j1wPt?)1=>NZY>GM2y|JQjbWnAZ_?~Uucbj-NU zOQ&%?j&xo+Yh350WJ#F^&Mzn{pz~6ythnw!IxnRz5D$OND*E`JdFev&%H-(0d@C}Q_ z?Ywjq`F37vY?iC@QVh5AQmHlWa&=yMah3Ro^r`dGU8}|Iyc8#2_bWY4+mWNksm@pR zOrJVmJ$Sd|+xcqa0&zQEotP*7B#}6#t)b)_nXR+v|jS6Sw|P&A(23W-)0fU)XTE z|Ddhw#c;p7xb{;f^z`+Hf4^);7VA|G{lATyj!)_a$(d`$C(&Dc2(IIk>f^eOPpqH# zM@%$2KK@|wNsRN4I&Qeu>-Z$H+V^QE8X$&?{;0sC$?35Bm<%26Mx+upSu6Y z_%vlaOBZb$EpQdUbm$Kw4i5T8iS&3I5jyeEDSe%$!Op{M8n#BI_c@!mG- zf4WF=dXST(KA>Lb&z<;fCg*cD*N!LO$Ne(E`Vy$<+eX1ff*pEC7D+RE{J@>$O{>x=s=*AM-_9oN;V@6=T4b-n6^p59);Ju+?qIZghLoL1!2YauxoQr{ErfS-qt z!u#U+@#**~T<-(S$G6~@Q@;-1i|ct|JKn#g^rQRdoA~3n=6{O6j@KanM?59*omQ~wHn6z6i)+k+p&b$x%vySI~^e&n3SAH&196GR`y+spWT++OPIP+ti@ zXS^YPX-BEo`#;_Bs-4A;k~1pw|F)lx4?X?+?`?0C{kZ`3x8fa*-yL~HFSbzX^|)9@ zeS&(upSBL~YH~K=Nj%1KUkLrb^_fi9=eyARe%5d*<>9l?y?kZ85;I*t@_+cBQBHZU zv8m7BA;T*hp7-~*lJnXzmQof^m2VwMQ~Yv#!njtE48!Y(?uX+U%y#=}N&O;7{x^fKYNB^S%M zCCDkzQMOAt&O6er=beuat1s)T^ZaF@r*q;FoqLCzF>aRteVQ9mCq%l4{@FU8+HB$eOc4@Axv;X^e(-9r7ql`;a4 z9+7@>@B{d@Rb-r7;K%Us1*Ok!c>Yc@&fl|rwa>D6&{XPmf4dZayM%Zpa%zR1 z9{-pb|Ay4xv`G5b=f$n@k2*^KuaMINpL;qMiO$bM@HwN!@1cG?Ua^?;qsQsZky8{t zJjAC9sqg);EVnQI0A7ygQ+j{?as1f9SX8O|+q3wJZ^ipW-}SuL@h zT((Q)4EcdQ_$yzzIS25KUr3+z$^Q-a*zUTY6zVM7@urgQb}5bDwOaDekaKb9>Fwn+ z57Ul!74=QH&!+R$b@-xE?l^bF&-Io3>&TDesa?{46MQsYk^JKL6g;*}aysJ)yeRXq z&WCs5OU?ZJAb#6<(x=X28}K>YSJdl)7xBTqY?tR*?i=_Wmy1`x_uwTtjx_&JakNWEPezRTbg`VEN z-cp$lJ8}WqnEKm(mgVM>(-m)biR8D$2jYJmh()5;fj6nABqxjdnfOiIFV*Aa4m{RG zjtJfE%kiJNKJQM>I(+jHS*|`0dII;l%5qC)$Pc`ZPiQCGUHjjM?<(Z(4@d9=JU{xM z;|p(lkK}KopMqUwyZqKz#z&rwhUZCqbt7@T4!jf}+ESLgk(>tjfKMe~$Fl=oub!+g z<=*x9od(JHCed44*6;lg%s=?wjbc%yo?kBPCgVTY>{plJH!=Qo z$*+T#ds_P6RZzZh9o~WGt@2&ZYa2N~96sp&)}8vhuaWT#C>b1jG=K7Xw4NV_Q-6y4 zv3kCnju+rOrSrz!_}*%gug|X^i1Nex11sF??Z>Epiv7F@X9G{kpJbWFzjI5VFpSl?DRYs1B z_S9d6?-&}3M1IQin&Mk~i?qxyKhP1c&vw!IxmW1v`F4UCx53oExli)h9lVkF`-P<+ zy?&U8Z)QAik;QtmqWlV8;&Jyna}o7bI9?v5{sFv5HOaq%?X@Aw37=18y61)M)VJ*{ z^?IGWD{?}^hk*s;^KYoH-(L1)-CoD>1EnQLxBEG~8`mK^KNsolZpXe1&;^l~^p>@j z{EKPfQd1wE;i8X*)c<3y4_o4&@cQgB>O0}xV{U#Xepz$ZC*m*PB=gK_a^~VCyGeZ) z{6759g|hz)#vjL@H_wk=!0#9!In5b|cks)(FSnDNy;|Q(>R-oy2|c|Zjx_IcI2pQ6 z&HsKV(Br>*h0xQ_PfPZY{&oCo;M?+KxkCtRjDN`Wk8bx)k^j5Iw=(4OLDXllzv=!z z5^p>(78Tx2{fyAl^WMxM?tVL$`jck4OYr{OZ&^zVoAE~i$^RVRi8n1I>-9Ou`=|IO z<`dn24&cqMll|dOa(=`+x0D zPLlI7eQvOjhvtHJ)ekQfakx#ooDnqp?u^e zz17?&(d$DWKWgTmdM2k#hAf~9^_OSJIOuo|!jJR(Nc$g(H|r?%dL1|wAHn>o=j%E6 z?`_@jxfkDhow)Ajk7>T?e=ENEC#mni_`HFi#C5xWjBl7K^&e4x1TQ@_7D*rcH@p_- zYt1=_5B*;1J5gV}m+b$kbCR#)Qw|@&{$H8;>Uc|D*T}-J##eQa{c|SX7SF3K<9sRJ z9skTcZygwUDX+*tIW8#o;?(cl9*Zb^TX^&_3IB=fmZ$Lr_(aCRmvZl3yjyeWNBe&a z-&|dmn~(aZ@b&e?`{Qro*Pn_-QV0J$^z=NLF!SUg>W_1Oz6JGv;xTi+E7;pTUiA9m zqR2~n^SF*}Mou;SU9K~AJ6?;wayAxK4rYAX;=8^S*ZUzo@$0xR`T+Ua_#I_s+;l$7 zjhv$J;V&-eXHfr(x&JvI?|HOU^h4wM(FgEjJWp(gKZCDG#Uj!DHi_?H{HIX=DPH3y z$=}2J9>Le|64&dW-|)_6z4G;un6zZ&&d z;crxy<1vOe#w#=y(dT7d@hN5=9uhe}96o%=`c5>i&rj!&^OC*J2|azhCpq4IBG+g= z`-866MtmXn3H3aWgPVS_B(u|xu5wL-i7CPy4)iDWSr;ny1DK@ zW$_W_dZ{{oe7MZ#uhCjl{FA1!NcI($Z}h+u?@OP0T`?&1^!TLA_>81}p}8)af{)FS z{Gp7)Jp3H5yXo`v2l0)}+XbW@Z#`bf%&RZq`ONpJZ;g6GFaDZ%=L%eQPkM%tt zzkQA5>+^!D_-nVx-rigXcEy+EO8>gtOuX(PaUHjDc>cDsM&s!7*2wuHe7J~D z7g1j`zpSrrmk02zY%iX+dQaj5znA4^lk*}z?qDnuym&8LU)9BLH`gaE@C|01`)NM&hVF+q;T6sGd>+1y^SkaRx8ju>Nk896``$AAF!zV` z`QTc75EsvTbcWEweWhE$bR@S7aT3{{N{DZj(B^sUVZQn%=73te!8>d z>+^-Fci%{mezd;yKbrcc__QBlkvxlc!N2AG+ne#h_^0C}|5AJuJ}D;oZ{xS)r|y^f z;rL>_x7n{A3O#+@6*u>*pQe6YOUb#IoE`YX{lyRByYZ_yUV7sP@L$bw`XgT1+@Jpk zzmnHmuO+ACjWYhb_r)U7^FxYK;mbazGM+l0Ou}1pUr5h8cSOz)hYx)(l+W*>e%S-D2#V$t-+*8Aj`Vp? ze(~*i!8$T-W!Q0F!~6d!Ij?0%{fBra*V{#fy;S6U5kBbg_y_fEczsZ>e@ew=yL`|4 zaFYCJwb0YoX>r~^tjAp)>Q^j}MV0SU-!^i-2p_7^XFuwDG?Fd5gObsB>6S7My1(6m zS2XkdBD}yCQon$lHF%8csH*tZ$oV3C_>fO`Qs1h%Y~MHWkMKJ=?{vnG;FEbDS0(%u z{sjBEUZ>^HlJTs`eo}$@3-B)7C(+~dGW>n!jqr9;^idlxc9*R09K0P~zn1i0fczeK z_lDwm_+UI~j+asR@T0M)@^b2@;h&5XU(IqC;ar+mGVAn#nlme)0!ijQ4NoJWwFKAy7Izui5uomI*z5Jr=JeIS;YEm*CT; ziR<~j9$t?3S7?57{I%bu|0_AJyWp*+iqB)c2I2GX7uWka6Y!>NFTIYMfmb{$^*4C( zF%K`y`E)(L3NLa@`q$UoH{&bJ{ix^g54y^J(ukb5@G0#j$H%|Gf8e~+5kG<#GWX?9 z;3drSUoTt6f8cV-pF~b6{A&Gu3j9L+EB3cq_!W3XUT@Ot_C}FY6h3s~)2`IN+&LD> zCVYgc*X=Ti`ojmMPrYAy2i}A8ruMTA?`_UIPvhBU9A3jaww8Hb_va7sZ`+GkrO$(S z_eRps`J6BQz!z}*>U>pTn2hsw@^2*P0{jo|x9EOS4-d?Fwk3X&>#Hv0bkO|v(vOc1 zh@3CNhm{%f`AF(7I3)Etp0n`Z=ZNd|&tiNe=e71kt~L3(-##09be=Nr>qwGw!d&;h zjn6XIA^Y*AW}f*4pTzS5eV^4CJU`FV_4qBABjdlRm8_R;-*R{^_i5$3;s5)9moFv9 z<3`r^TKqk8zpfSjfZ4Bl;Y0a7taS|B5WFC-|LS>a0^W6XELx&oFU`ZVct2Yf{j9+2 znfdk+d3sDRKBJ904oSQTulwu$iZAgBJg*tZa*yNtCrOU>lW({@f0<)mM=KM0 zdY&J)Na{OgNKg&DGxwMDdbJULe67^K!E!s}Kk$1lH{)^qlGakM+jjzfeq%X5`YiW0 z{59_X==d+gE8u#5xes4#w)+O$Zx@R?`I7u?ctws=-4EZ2oTkHvNBHzh>i3)10gvK? z%rY_IK_&;2F6-}N>= z$6VijiC^4D@?RqVD1HsE8|r!O54^nTv&hKw`2YLSoKG(fJv|@3ZT=2G^{Bq2SINwW z_3^GeAJ_e`6MkTu^!YD-yruhwzx0-?ro9c)g$(eeS^5@%(xj{sDd&_lGOtd+`I@$J6udxA;(g zUq<(zQ}~{au_)pD3<7Uj!$*`lzAPnAwGYWtnW|cbi(JD_aWSXe{9C* zM*P=@BqxXUnvD12{*s=T=i_Z#NuRT+e*`Z&N^FW0B}}WAU40JZol(SI#FtPyt_fxAdv~*TA1*o-ZinUSs^u zr7~|1!8_w!Kb9Py{7k$z>sylg3Hb2iQop2teB)-kNhcYH@2OvgpSefsM`y@4HsW{l zcOi8D+={=*>zjK2c^Cc-$DPg_`|u3zYw3OFpYV^EXY_bKgU{+B{oF>MCBw%4_dJup zt43bZJ7}I?T!kk;m7K4sZ-uWm^JjOH|05eFoBE=h_dg{k5AV@i^54gA$A2`htFFV( zGxPuE$ob*$;SN4cQeV=%zhXE3?!H)5$>#MA;7iSYwjc31%o}=qoyIrtzVr?(x8NAr zpO>GL_3Db3jhrvShnF(s^UJB9xh@t#{o>+{@bcUb)a$WUc+9?DgD>X3ik>$o;GeaZ zesq7E6MC6^6}%1R_ZgQ^pJ(zP!+Y|4Q=gAKiy!7Za+9?0y^f##S=MU?z8gRFqx2(3 ztLGiXpJ*fXS5bck|AW`Zb$%`~R>rx+w~})%Lw?|*$ob*$A&XCIQNN;-)a!O{gull5 z<#uvf;az`~dR^`f_-8+e>-BaH{x#$O91EC+x6g`2o#^>!8D5a*M|z$7Fy6PRlY=Z{b4^iD%=xBj=0oVS0vq{w?+6K95Dv6aUN9C#2jfHO`$kbPl;R@{(Sm z4l>VoqrNFVi}Ps=?}R^M?%(#ox0&Y`!|{6jKGZyNrr`Hak>p45+wr5LWZatLOYy0{ zNd4V-fNyIid*EaE(|9M|e|tOr3SNNwU>v62d-!^;lXZK2hTmw`>j?e^_lpLR|2ux& zPtt!LUUIzb=btjp_3`TX2WB3-7GJ$A7FGUDeQP{n-apeBzl_&e^mXK3_^w~1pMK}d5*B5G0KLdYbP%IL?f4&G$G#1zUJdffV`8yIXld~DGZLY&##m9dmed>MM zkMXC?^SiI{QRel{pYT7-`S&lpH_x-0(of+DvR!t3BK=qAc=z#fd!-+}{;7+%ts`EX z8~rWui@5JsBtsU^5x>%0Klj03;CWU9`pLq#2a;b6zZw7NM)B=j|IEYtUEMaSe3SYW z`09O9KN^1wUvJK*&*5M3d+t@Ke?9c{>yiPlOOC{MQQ!H#SR^eo=H~4#B_XxZ`C{F9)B&`{DI^EEiwK`=)fBpA)$( zEB)^#K3!q_A^O=!P6K|ghuad~OZY?PeME2JE4YsJ$^SC+^f-TH{{G>Q)PHs~7F7n+ zpTghH7T5WtaGs2RCG+}M<?_=zZZ~9)=OP_}h3q8GF9)CZwS_V z|9ajc{3)(`^}KdJ-e`^V`5gIMaDRp*=ym(f(9`|I`8z5dssEVzk9obj2EG@cYM#%g z@RFRTbl&?F-!(**+do5s{=u)ylRkA`Ei*;7%Wvj9SS|GEcrm{h*?{`D`MYY5&}WOt z`67HM!>5C(zy8ZuB)8%t@IK4~x_xKjLwTOKocaa$w29LH68u5D2-ks4@y8?Qi}0Zc zpT0!>jH!}S8~+0TjpzHiKOe>~;Poaw9#4m!9-k!V1)rRZsWP7DIIn$%SH`o=e%lC- zvmfem+k{>^{dddxy<=j$?$qxx_l*bRt+`Injs zLOid+G#TfL?@PWe_i}s(e^;jiKY9&5!`zo{hyTgnfj^cZKhOuy;`e#ApBy}wzi+1d z;f&DJ`$NjS?s+Tq&$7LAyDY%>ndi}~@QLPqEDz&t%E&P*S;e?icU2h0~58-BV%He-=9bOTyjyJwu&KIQ^ z=lY?i$E~#ayDQD8&-7%87m?EmfAU}~5`Es(4{ylzXBPG2@D;UXzZ#EE!w2&Bxb(by z2mU+Hj~Y_H9Dl`}_t)Xqn(NXh@J<{rx_>6|<);3_$XQtUP?b*)QGexL8HaZG8GMPE z2MXOR+vO4SdSZF}^6ruoo)M#uT6kyPPon!z1AGhDw|c$W3BR+0N6d z#!dKV=KOLCKAZdAI&a^NkKykCOeKFMett)pH|`*R6JGSmSX6mle))mt@I~gl@J{4} zh7Y63*-w3!cGAB-uQ_4rbw2TC$T$};?|UhU_chm_Rq)Gxm3%#4*TK&|8;hE{h1NRa zPjR325_|wY`wOWbif7|bv%g)7Pr@5=KW!_1C%&l=xB7FFYPsdPSyo=0lKjU-o zye@JC{pUOR#>&vs*MTwfcNZU~KKLmX73%ZHr}4S`U7bSYKTl5FT;IM$eGSgbKJ_2r z{mgx~Z?vBGf$06=vv^OjQrpH^Z4{~>US~@XYi(YHqR3q;a%`@r(%)laWnvb!d#CH#}_j%>3MuS z{tSKUeTkd#tIhjW?!oJFA3*zAi~n;_`Y9E4<#|uwJI(9nJMd@Q%kfx;`aSsJm6G!l zei+Zn6TcfjiF>@Rr|0*7@Hu5=9#AhnOSa34=04;__z!y}{|@r&;4PUy8{fd3cQ1Q?AEv#mjNNSc%_-H!}AbR^v6f&eZMo zI6l$Tzl>kY^?z0J-^Po5F6&h#L%y*OpK5-;^83j7;qXD1TR0)(KY;t&w^LFcfBul< z_agrad}NncR9S+7Zi^S>`e!ydeeo;yNzO!k7(Rvb(M&uya=r*3rf}VIC-qy+>#7gq zcReKeIsE8WlT#gkoBE!0Wk0ORdhN!m@OpPw>c7L^H}{$Uz#lR5UZLA$JZCZw=yl-v zcpLM)uO|Li`&hI@ov)hW<;qB(I&XKydztq$3<^E{yx3nqiq7RBPW{{FKHg|Ni~P>~ zR31M0HW^P&JKpV){~NuUPghWXV1F!MQ-3~wi1}Hc7gWVp^Lyg@ zdPf8N*EZ6pZm;(EC*R3(^|c{Fr(DZXRC8)Gx)? zaz4^=xF7F#p7gKpZ`pvSIIi>P^96iqC#l!|KfrgG`6q=Z%0y^{2_nCs_;)Ysk`i;`EfAGX1BTDOk8C(G@rJ~S3d zCZ2^q7IU}z1pJk?;(EO?7yrxbS4;8x_`AoqtJudl@=6Q4QT>ehT zt>iDp4|6@Q*Z+^<3(fxj5`M_smwpp((Os6S^U0U^-)8?ghVSbm^(*KnBYc9NzP~hk ztgNq|rz+yZxIbBm`dava){>+1Mss{rQ}HV^6qH^Yil1%aECV(DUGisQ%w?l%>yYQGEq3VdnoGUrw3)M(jUFslRoFj88X~`wxEA5%D^BnYprEUgh^A^!l(WUc|iK+87Va`(AqB zotgi2Ke-W~Y0l$g@#}g1tMmC(e0neGvjju95MRgtTcOWW9>srtIu=zPr~X-d#R18Q zv%b6V@qNYhxc(fUZ}#UO@m1VU(|PqI-kbYH+E1Z7WjuSgl6>87E8-P5iGM+#)$tYG z#Pxc<3BKvDte0N*w#CPoKKtSKel7J^Wyk`u@y*L*|JUoEY523xOTC^K?!XV5*9Vv3 z4S1htd5QPd;k(WC!!vjbUI)39`j;c;i|`@f(@%{b!M_VVeI9IU{$A@z@*g+XlLh9< z_#fka(GAHdi+8wL#yOn!qmN4?rzm{*58jaaD(3xT?eY6c$PBFKmmBcK}KcJunkE|dQfIs2&Z*;Ll+ zAN(->uDS2}2j1757fQ^R@qenBjDzm~Rq=N@UUb~*;n#C~>AZ0r{$BrB)X9bP(-H69 zPx5=Sz53vf^ZK<fj<)Ze|ueT z6ZNNg{kIqO|G~RRWv4gE9{5$v=s|Gc6WLKlY!(cgc1s z!0RJ@sV|M+!0XO+@hbRKuCLC=FUS8d{nW)D;XZ?&6PrcO4~Gwn`LrkXN%MD0hHCye zS+CjjKNnwBdR%c>S@`daVi}8uPZm8oQ;1{Q)emea;fxpmJmaF^ib9gQDzREZ8 z4~I+6wgM9LIbM$Em6ORogqLQ!*T>I9&KKcBf=^4_E!(S=IbJG9{%`$kKCMmt1BqB9 zE4koniudF96!iM`di+xU-@R+OknN8bEH2~Fj{H%05p&;Q3VwF9)a(8>AAgAF1$zH; zIX-~c!F{>*2l##e@$|D7|NcNM61@)m4li!{{2gz>@u=4!8TZKXGNieTj~>5e@EgtjoT~V@ z<~pqb{)@?p;jPSdPEY)qC!~LU{vO9~HaQa_XXV3(1fR~Pej)RxKJQ)}diwg|n7I$I z+T>h8&L(mya6P;Se;$8{_i5XxqtCt)8(3nv}CuL2V z9NS)m{B9f-8_C=7?-(GbSh8TmI*p;UdC~{qL8PCxwGHVp7(Gk=c{; zGN+E8G&*-eR6y8chvtRbKHRa#4xOBvmnmP2%*h^|8Lf;rY<%Xh;kn+h zNm)~)J@((vGN(-skFv0xq2cl5jmsGk?oyf4<@?#;HVv1N7cMn(`2Q>I-PRMyk+os2 zXr8IvteLY98(hUS1`pt>?m5W^o3za;Ofqb$%5(Mq`$mM6Ql^y9>p$o&lL|?pkQ55V zPSw7U->=K>rM0?$`i0rR9I)MTk3XKvQ12z(R(?2jQ*&8eObMeRBu(+R%d-BJk zKl?mf=->0jY&7}Y14B6W7yZv%OAn{xQ5wVF90r=jU&Z`oxhn@UtkHHYt2q3I1wY0J z=Epa3iWnYcH|xzNS#~QlXx3m;i>mo`E(B?Rzrp^|eGp=F%~gS!{59OJ?u39G(CKxj z0|KW!$_(La_3*!#QGC}wz*iq-5ZL;=5}$X={h_Rf5dZA&_scgy^^Ralr{!_kBlD59 z1->p5gvGc6`{uHc4N#Q(eYLm0e=hgi-tys5yIZ~<3gW6=7q4IjU~S7Dzwy^gwd!G$ zf#)cg{mm}*dx1kEh7+t^rJrOly`s3A4Ht_)ikth%^Hw=4g}Kh^F%m>M|VdpSb2 zywGVm9C4TxuWKB&IDfV)ESd6oeZX>+`Iq7zj^vG0<^KvWi2~n+EfRG9hCU9P>bTxM zRRs^R-fQ{#P=e{Z-&jhoZ^a{|4X{o5n*s!wXAdWQLC$>aowk^?YV!jp{^9YZT%9m^ z=ih9s1+T=WL^E2!Lm4^sqVYe?K=K0{w9g2y64W+=9!WA&xRt zO!-4uoQ~_wp}2++TD|t|!jmm2Okx|Oqh1~g7q2Za*=)`?2>x*%sL`5^PB<(U7nq+g zTFPW!v5Hn)N9RF``J%tTGjJC`e(jHOzqg~+PB)!y>f zpj{`+ipg|#+aGs=d>zg((lbDl>15d1%9rVE^lw~seLK%(^;#@&?LXkieYLvr#{x&+ ze*G&fyKQ~(O%%Iwf7n6NUH>TW_7!Dbsuy(h((v6mfVwSQz8-NC+2X%dSD&))eYLQ& zYo49S6918M&8&o)0~l*3P+SN2roPpcck5r}<_dR7T&sghxRhfT*E}vs(zu_x&2ZSs z0i4#wZ{^##0&!~M#vhCE@Md8cHA-fq&tEb{ll$A^4smTdl14pjw#lGBbEV}EoWO_T zwt^@(n*eYN=2qOCKtleRn(12JjXna#gz-@UQ36vE_F0v5JJA zHo%_CqFhDigxkTREs!HC{Slud?N-(YSzfN4(RTSrW!(C~pMdQ;hnMx!5p&!0}qZRgvU;m|SQc3+pYaEsxb>E!`SOU%pp&~o_~HrTw=Ui2GwzbXK^ql)FW+wV=uGzPkEOeBL@=+o z$5z|L`n41_t#FhG;OBbfW#Fg)9bcdJP`hTZ8dud$RL2RVUqsQEs>mCTJ9MM&L~)#G z>hZLPoPNByo2QxslGxH`so-SzMEgphF?L6ieh*M0WJ&aT0vk=CB@7h8Ubfjy2k|hb zf7zWQfv>Cw&S|!79Q@G|Y?0Zmvn@0qPCar>okM@KUb;fZ&DXsA6n*3E@@oY1N%@LN z3D4<^;YHyB=sBu8`SDLzp3o+v)cMnO=TPT|;@jm70CG^lc(Ocg>}v3T#o?xUgof(> zIDr3u7+?@ef&XjwxXGOUJn;|5)5HI@#~H54f4VL-#9LU^gyUU4#p}a(`G5tox^hCw z<#hqs5MD2@%T4>T-mFH0Py?ek;H$S|+5S2jK&w64?r43JK`O9(o}P})@4gY$l*X!u zMnB*R%hjMd)uLPzpdn*6i$xjB9wXEmC`9sSvjt*szqnx)w@;cN(#b8h;<}?JC{dwQ zhq5)-igdI+z%t1>@5UGhZDv5Q8mUD&n2CD0?Bg7wggHCfIZfLc6rd1ahxaB?p2RqG zRTpZ4;+fX{jOOTAi4u7TatG?-=9F=eozo5reXWvf)>ag4uJUssV4bU1AkR)DBx^Fdm|{5+2kfLYBYM@A9chFy2A`#~CQ}T`!}Z&NQ@yks zb>Kk1r7W4{Qr1-QbI7R6sR z0IY?sR5ix#mnaY2kJC2#d8lw7bl9k^(SH3e{8wDbA?zB=82%LowSz~2{V9%S_V=DZ z;9d@j`^Ww^NyUB*hV$#;gbF8Dem@!g>wY+&&KB+q{6+3(lhI@_{Cx<8^Q`}eE4l8^ zhoi}SIGK+YBk0?#QK+qlI23HsMAshc%?p^`%IVWny--p>&+u&7UIryh6BFbYWU9SA ztQM5I&%ufLq62xGUEK?*j>MdM7ID(xB77QWdA7%k8Uqm`%tTlCdB0xWtd9%&hw8AJ zpNskZ)!pcKuas?-cNPYQFmKltoByMzV{VpOMtdEo1D z|Mqg|(PtP8hauq>@Km{3mz!0SqESIH_+!$)_4`Cf8Uu_bcV55j4IQ89u(^IbK){2S zp>?aevN;W3W4Q2^`)hbK0E;ul@MeU6T+ejmNj>5}yZ9Nw87Znr#i1Is+@ylLLAOsFUCY$gAVko9NYw8*@GC`M=->Bp0*# z1Kig(V4n`Opi@=w6aJRRN*tww{hhRt7Ehev>C@LWd~VMIqg^w;UPDff`INdUo^9e- zrEH%W+-T4nhnG@WUS`|B!mt&woRgOS?0>r0HQCQQ6bqw>SEPs zVlrHaqs0B(8gh%B9z*5+pOsTLw!UMn!V|@*``g8#zQ0`x>#G--5~b345~JitpjkxL zl6I5k%BJ(tF2;_)2@m~N@fALbPj5riCZPP=q3Enprr>%;eZjWDUT z0byr=nUyfeg{NXTvlb=M$4Qex2`x|skCTWenS@~ke-<#3QeX~0d8x3jQJnVc5CrOD z_`-)@5^74!0MGN<$|~}uJ86J9RcX|O6h(jjp(u(Uab&#K6(7dOrDjXj*Jm;QnomxECBY42>Kp{9--So28V zRn!I|Rzc@DhEOc$m}0j`;&MYFS(jliItTfd#a#*g*A7T=`)i5zN;kj!8HiVLHACxM z>pHq*>!EK;vh6%g#GA{K|Fl}W z#g>9aybvzXa`W!!7A=l$hur`}_$9AaKskY8_ zD>E!5!POqux<_c8x{)}yCN|LQpCndNPO?;&ugmS}363DA{W&t;F`lrtO{5w_cwc^g z#c_?-&KY!|IAjB}Q>raY@$KD*j`o&6zAX1EL{*g+HP#P(LpqwJDy?R#Da>?62X~{6 zRv6)ct8=Yl$v0Fl4R@7F!P2iEp(NgYDg}d3OJEmF8W_=F4nQ0Q=kl z=5#4n@TJF0))(7$0hN9&fBU*#Bts`^$F5Kb05<24xeBb<}S zC=oyx%Ohg4UJ@Qj(pd3>yzpDg2~7(_SvqWURZ1*My=THgY4JF5J;_ zL5=zS_4RP>&W{T!K=*uqb2GXg4JV7@+i0-(($o7R;vf-TkLYImDOWfI9N15;eFoe? zwxCL1u8Re9SpILPHPRA*%OAIKqsNzh^-~Irj=x?v#qYP{NgZDhe1WPBZZa%$EHNxp z0ZKe++KnOF`qyy|2jzNh!@7)u4){t~ghjJo!vQ$i=hJ$BQ0JXQmyGA!9y3GncMs(i zVUKp_Xcq{x7d2hGj3dYtf%g7Jgt)&uz0$OsKs*a{k5?s3I!?e2(W1R3M_rLnGb7#O zTKA*O6mrGLRShQa6bWI4S;HMaKXW+I1Sz(kS``?)4j3c%R7mth`i0(Yyu>2*`|EPQ z=9%i6Zhmg+KU(Fy{Iz3cM87<$6=9B{s^Xai7SjaD1p({Oy@|_BoR>(VHfqBq_sDNY{bW9NTa6Ri+Z?)0F8g}xS z+%Vl@h(8v`+ThYCfl?PqP;@DW2j*b?ygr7~NxBfp0H${^^&$^|k3q{o4u&`V`|+Z) zuVT@^x*zwQRnGXytVC{-!|_&A7$~l(qJk+ZI*JkBw}>JnZ*PacN~A9FRMT7eT>f$7 z4Zp!mfV+IM1mCa0>+V{2BWTMD8|!oHh?au+u>kze|rJo z7sS08nA@_0P$Z`X6YSn!Lc4(qWb6qK_%qPhl`8lj?%~C;4=r$KYN|vaU3o3%nJR~$ z%biq!NOjSOkw^oM&ObL9NQdwzEAV2mUG5Gq$mF3T z5%#}me>WzhXBqb1U-O>BRS1m>Xe^%lts8OFHKThP=5irkvl^Nlmxt| zLAbIJ1XqRhO^RQ6Sn__#=ses!7qfd!pfi~chUs>S>j6?MA)Y)7FqmG$SqisTNz>E; zh}*Qlb%0<<#b5~El^LS&r!Ee&F|=Ya{C&}d(Qu5rJ`f5zGD|lXMJV*zXSo5(_vU?~ z4G0v=P5bzmYfV=7eLaWnrSB)%h5tBQX*wq689{+VcJ^BfQ3Gw z8IaJ`GXv6eJa1uq9+6a}O{4HEgqipA!h5g@U#&psikoOscwDaf@M zR*E5v(lG$@f-Nd&iG7LyTZw*sXV!60Uh}?I-NX{FD~?B#M(A^0CL1&K_)=QIY|rd; zqOK3Vh~HAfq#qXJ?C&VW8P-usbyL6`!)9HP_`W8vf<~jGVNDj;0RX%Pa5cu7fT`Ba zZ`l9((03}WMDN5d)Po%H8&L|9&*TP2)?I~YKCd6jl*Z{lazG;_?eMO9#$yKvj%0YL zVb=Istg1&IBZKnM=_i^HYoyiKWooB&Zm!D$O?5QPJZ;BvsL`*P4iHHO-PyO7T6f+= zPg~)NZ7ak)BDiZGN*qPjixZ60xhV|$OOzBT)k{zlCXYHiFjYUPbcq|N!?;roF!W_x zZrsufXP@J~f)+D%-S%ZgO(Uw?jR?(VI*O!+;sGgl!Z_(>0}6%R!j9QmA2R83AMVO@ z73x9H_Rdt8&^wCq@*9$wNvX@CSJ%vZ`DJ68}~N1=L$;f=YK z&f@2YB%^NRU~5eSXi_%(Sej!|TyeSB2W}r}pjbB;!pIE(nRz3Y5&|sz%HUTH@*>-l zA{P#s2LkoTwFx%thD7Oxs1e~3odB7Om#3?6@h0&3=(=`_B>A)heXR+5qJ$O5^CPKw z^dob1EW9+|C<~l&n-%%XvG)*U|w@Pje zSY2M1?ljMo7GL|bQ6G72=GIXT?rJpY&z$)*2SgdLK_VC`pUYTD=cpGJ1=_h}aio?@ zLL~HYQ3qE;s9%+szCLo=`uj}$QNp&6JJ_YLY?NwJqF{C#;XgwcqxXf)tLFB+fcLIx&d-5>KqULibUq1io^ir9O| z0TU{YgD=SY^*PF?6qen5Gz`LzxU~BOPT}`!B$z|`rbLaK|4Ds(mueg#T}VV$d`MKV zB4{2)b=JHHf&Seb%hM-)3d`nSMvc5^LJt}e@?HHkQG_72#8<=ZU81O!kWD+j`FjHP z<{ycVP?f@E*GYrnpl;qLzzvlYac?@vnriCH)I02j-C7T+NwuQCCGfgQe*BbxWTc;G zw_(SKA?)8d6tCmOy6Rv5mMa@TrRCjF68+r5 ztTnnDJKh{Z+#nZmYqJ)HA747n7N%Cr4bmI8E41_f*-CtunuHtVNp82{Q<;Uxx!S_di1R&U*0r#tWLHL!91FTZhUYfYRw*?~D;kWxj=bvB8Jz|q88jjXt@%zE zebd5Cb2li0c|)5}H!xzOH$JanHz?ZG#KMNKJ9qSBAdjDErgqEd1`K0a&p}!a2j`A@ z23(Se>!fx=YI5UCAjQj_X(ZenseGxi=e7DYOp*(wI8O5F6;7+G21#*PuNV>&DD)k* z!=eH@xuG{%Cn0A2!N{A(RR|dkJ_H^x(KpD+uYndQE_;&)3PhO~7r;B+pCxe#gbJnx zRszOF2Rs`SDC*+E=MtIRlhu}+hm&(43y~00EY!ZN;;Q|I4Pl|PUPzXDQ3fYkmA+QSvI5tIIdet82bA>Kb`Bp5+xJgFo9n6om%b zttX6nDOI%-Cep}{&v)>raIpoDZT7VNQ&dJ27oTzY^Hfp2sRj|#a9I3HxT^l6$&tek zJ{nKJYHN|fOB9|KIX~iiWIh3Vfx7R%wS_|b2+HZe)*1rZlVet z7V=JcW^4XZ`n*fRQR}ZzP2r6$vapCf2LNHfO0zOV)95{dW;v!oT1sQ2T=hB*>j-)V zEyCJPTGSUTx;)4e5C!xJ@O+tH&qjBP4~9=iixIrLn}?^-5azP}0Z9$J>_2Uw;(t#; z^6zkX-Hlrels*0fYo{fc($$O1T5`U*$ARJ`R0iYssr|-cL<(|W1&`z%j{EwjCYCbT z1K1<8VcAc&o9^-8*ZvxIt)N6ff)8yVK9mPvH`f|8=|S5pq$nByC~A}M!!-+*El1c5CfIS8 zcKwjQv`fK3h(xw^c$Gx9n05=&erFrF4kNq$rbQ98GZiD#z~Hq*2}3QYHZV!e|LFxZ zxDeGj8Tg}?t@PLMmnOu7$R`gl0pJEtldRkinAacI5*EWS&f>QJI}AzV`=OS*r7K0F zi4~~^z_GJAyky+G|a%d`fsN{IXSe zQLC5Z?Fn-c=HSv|^S%gcun2vyE`nCw*=YC+7i|Oyum2lFS0~FPdA0*LBBTK&r(^@t zDPEjv?Fx=@o1_LO0Rj0W`KDP4G#v+=f(#%0=|Hc3*DTgiCY$6#ZElfvwRx=Lyt}~m z492~rJyED#0;o~Y=SPwX#!ihGtR?mSSqe1Nu*vROK&3G|xsZqO6CT=yQ=VSC71yW~ z{(spr0!D{{uPHjeK-=3cD3HGLwLi(R6l3s3Ww7Sgp&ufMThJezhv(U&OaGf;2cE%8~Dbm zPgjS>k-&*tQk|wJ*%oL)H<|@zLtJ*Qk`vm*z-op5G*dhX^5oRp=ej!M*(BJrjVOw~ ztI;SKUl(BXrdSg2bGcH4g)|)@7CwXImTS zvZ*|6?UGZj*u+^JmUQbqH_un*4+uwH(Z+Y-%e*XjV5wZ4?Ha4@Hkh1_MlS@TR*tJ5 zT#!bSjt2P-uR)nwvI|(Utg+#9J2`M6wQXFr#8gg&>+Z4AO_yVb(JS*ya|vYcRh zYw_vkmS18xA-_!G3xWQE)j`T!o$-v7O%V?*G~_0Gr}RxLprw$|1F6OI-RT=MZJW;c zBVFYhA?*!-IwHGKu-9N&Jx9`Ax<|eh&qn>#`WdmdX{=VfW8ttGISsV^<*qe#gCL+h ztaSC(m#39*k(8&M6Ne6>q%}z0`izexUmBfzIhb`KP*J_N>vj^7RrpkIaQ-{Nt67Yv z&wcXIEX-&!@m8=b5MF-+Pywx^#IG4yqn|NtO`hiV7FT$Yxs$Ovb#XdUr!LP&DAh2T zpdtl07Y?zD;@Qd#?3P;ezo=IBoX z=3>F>!DZsN6acbs^AQz^x~i+kfms%SG#Vyf>dTZO&|~kz6e4s zitY4V4IFuY1{{Ige+HbqqfWn}jEPZSmbKYFmsz{p62;1FZ$?Lv?6Py^wI)+3pKU10*OrHx z53eC`EdFR^K2Cdlq>{qd$u*ta0ETYqRzce+uSf?(G5hR%io2lH9ZZ1DyM^2Z>bv9H z=rDwC66eW`O$ha=TO(w%@B(#_oH@EX-D}&LD5C%zuJzoxbme^^# zLq$K`9g4{nivcrY5nD~+QEy)kPxL>@XI~8=gS}K)I0tgSUfSStKozAE5%=_0=69Rt~bqZD0o|v zL*FO_=y58@>v{{`pae9c!4 z!Ir5RsbS5{Fu(+`wE1t!UoGH(3jHT~kopejA`mv~4p)cdZeKmZz6ke%5uzCPCwWLY z=u`$#Hy7sP^nG~W3fHJOD8y5@-p;X1)YpdVFX*Bv6S!7vQ8XspuK|YjL&w7S*Pt;L z*XW`NSsKwS_!+fLC}N}t%|%<@*YEXy(%m0ai9~9JjwH?i6rLP(XOARlt>M^c0NlQ* zDJWKT8}HP$K*3w`vVLYxes^CDI)wljTD5`_xdUn@f9oE>eUjz6kaX90_hc%u$nKQS z6=MUUUjLxlCu_?Io&z<>o8$-iQKq*O$dpi>Fs`A0cS5Q&PhBCvPY)kP8=~k$lj}q&^0knd`lD3#gDj}G1P&+1KlK&js0P;s6KCyqu!ukuFc|84bUx@HsK+&x`sIxJH6n@YN7>1*y(T7_6ED@^R66r3l5Y0p1buWKq z8kFU=P@iR=@+b}a1O7twyUb}Aly6swsOmw)Z)6s_XZ$%ttdnZ8RW8~n|Ltr?4z#Wr z2k|2#Y?=bE%Y(ZEWB`~}uY2FPqb}WmJHwoT2vBmBzd|^h+ zT|JPv9&$4s5ycx==o{tDXBb)nqM_6J4o`V#3qx;)HVCBRAVqPzd&f$m)ChOKK!PMNG`-C#xf6nO8>+)t=C;GNuzX>a@!4@5WQ4=y1<& zz}Kw_%ZP~|@asz89u;Nqk72My*FP|0e!m++F;rrtF#sbrzQR7x*rVn%1BH7k7+F01 zuB$y%hCx~=w+|bo#q{Q;(Rvdijwa2v<2b&J)HLe}YKA2lVn!edDn;d^X=FZ0^k00% zi`zG`l_dpcC(GI92BZ0J5s)K_n;0Ch_3OjwLe003kVfM+idV)0kJtF8F-;9P;mu$4 zGTsddfunh6YqW)Taw3QG%n0}hdmYtae)Nr|m@uPPm{Got3UD91c;rDMjfWGLAl)KI z{6neleAw_*z(bMbf1X$#NY7WDY46W~eajVymU# zlF}+e6ZeO5`1n%IPdn(Dp=|Vq-xjdE{&BcN=6N9H!}eNWuLyp1!fLB9sf=$yVN4)u zoItDvge%d7h#xMXlEKiPQa>x&>Juu>>^hLc1t-@*qgA|0Gfr}ahsk|e#EA zWnhN4SHr4aNX`z^#}!D(I!ZVdw*glbZ22Y5gvam0NJr$BQ@aY>1JK%FI=*t2rnCW?gQaC?YfCKT3`g zLWJp38z2uzBkdhW8)bU7r8kB23dIPH$=Ukxg?)z0tHwcn>E>dn_?ia6@?>;?tcU3n z48kwR*G;|)9^u^sw$bF90KkpD@W{mAbfABxz@Hwo zXLGg8dIYTt86#)j`CtUsj=Jn8X7?K!Pq(eM^gN=EFx?{=cAc2L(X(uxZ^&-3iFZ%~ zOqUVxPscCS*g|00@0!8Jb#ZVmH+l#cP#=#8tlPX-*DCbLw@4M zt$48-XTZ%gsw~qEEN(ZjnAK6K>7hjt#0?NWz^x{&VEL<)2~)?hqBxMlKsdNdaMvIMf2N0x`QXCp+9RwSDJ2?>BeVHhqMh=) z`m1k!`iV2Ubw@4aGJ6UusbRBqlTwX%v45i=+N)D7EvQaCM)PZ9mAu~lfOwVbd zo$cV;>a5kt-yrI&N|=PgS4SGtg7>_!T4>sXSOO8vDBChUOj}lkE|6l3O!r~h;!a>b zkvZ#+7R_0m!P*W^)siFJ_rh3Jpab=z^Dv$3&O>2BLuE+28EoDD>cYEXpGf@9QZ*G_wM2lcyrp#!jluW(TMsKf9Vt~MU< z^Ktr%cHxP>fQ#`wI|_IV{(1{|LAwbU<680l6PlqNeKjuWvC3nC>u%G(J*b}X{|z9F z2-!iLp#2kU$`zgBp|ywKzvBw+5z&FX_MOKH$%EGIo~08LBC6cj?$Kmvb)WEgL}Blz z))J8;V$)|%U~9qY%h!j`YM_(~2n`xP}~YeEGIU+?}^& zbwCuuufs_(9XNY<7wBX{ z;UkTcOXd z>1^0P3)LUr;n^F!!U<+mT+(|~A&4c<;^7DRWi;!51_f;`Io1Kshv#xmuhc+LNEa6K zFVk;D-^Z_KpeEDeYC0SE2=)xv@OPNsiyJT4WWdlGL?!P>B^_jXwj>)kGFM7g&C!VvekG%Ia*beXS#B2gqu)TLqgH*{#(!9{WJF%E2k;|tHz zbO)VOX!`iIJIUcEVOjkj%Qf=9c_BKkPQS9`*qTC08u9!DaPWG-C!1$+7!n_21rfWB zhmVVds8t24oIB9m0=|MNH{}QGzeE22qqRHg(&4P{c~`4VFp1efvP9W%+7MH?W1xp@ zxv-FIY2#^>cJreN+IMGVyLd3Vxf#xe6R$~6fFKdp(6PpL@%&4_%{*%IG+s<;*RP*O zX_p~8>#(Ei$#hmfBh;=fbobSv7?-EgjFj$Y0T;tV<*sG^>j8S0CgjU{<*t;@CaKTz z&A&y_wBebqmof+!0lUtY=bsaenn_qQoOp^n4PtzxnA%t~{#AxVS*kh+gB0OeF*od~ zfQSHpJkPP*R3w|F@O&ZY=|`CBGb9`CTGg}qq(~yyK-KJo<`|;5$MXua>w2qpwAOer zpbK(5{dRGybF9^If#;9hJ+iCe#c1IV(Jr_PnpTnx;VbMJfs<-sDDMFkm_Eb5Mj_GUVL9~Odlkr&`8Lo%l#NLop1exzBC8= zZfYMvXkQTEShRv0^MQ>(Odej*C^-h6@7H)|4l7tNXa+NaE|yN2G$XRr5&6XQ0;E-< z$VLhYlH5bfk`axCxk_1==}1Ooe8tOqWVZNlmfgM+czv_RHP!(kq=$9>L7S67XVrWPag*>(o_>3fk=g+axM+@c!1`Y zh<5Pig0nj`n#QCltV|#yi_S$L>DsHY`K%BrtJ}aoa57bd3$v%?z$D=ROoI~Ke{uJM zD<#(R!n8O81FV1pr?87$@9Zo+xT%-p;>3UoK4(9{%^X0@AKo49_BTrf+JiO67xSoF@ai#0{)feyhnA7xPqe-aQRzN?VUT!s5#9v{`XEf7QvUQp2M;1Kt^< zt#iHbm$A4dJ+y^kB1e9zr6-7TFtwHCHneiat>E(=r5)BX`QS?|aY z1O8mET4JdZ(siE19+qH#8l*-iM*mKT!_Vc;0c1!-fqzgwEn$>~&WkgDTRYXn!vM14 z$lu6u76To)HX|EiTwW8c14#6`Nt!@hIFEz%2oihG(HIGd?hI}waVeaZ9MO_Ei0@Fc z1ZIp1S#>f&7dqt)7&<~%KG-NmL}(eV+}O#9PPv9gy8vti(h@R@?oCwG6_fxhBVVor z0KE4DOIQjZc<3-u97p9c?Lk>A_s7hk3WmD!nQYOc|K{n=-Kd#LL}EmvO_ zg3qoI2^7p!ts`DKyHB7v9wF4P&U_hGr_mT8CC-)=7D3+XDvHwvh84vS9VHbEOKqrz zriHW6t9&opB=BW?I@m$myA1ifynT^>wdyD*45Zx_l{O=qlK*g2lpYUOXvLbw8_uDp0xZ7rcw z<3sFDXe&{6+rUI9WW8@oTN%KHD4&5+kxDvgobs6pne#XUosl3i&|L6MNs&}Xy5oIm z+VY#t>F~mX{uG)GG7!bh7?xNcrrpt2!8b`qlh3xVL=&}uY!vwY!2aG!$lU}91;1n) z?TqiuCZM?wjPA)sA`vwS;X+EJ(7V0_jvMWQgibc92!r(3KGf&V#&4EA7s{?-^;9zR zLKOwsOJ8(Y3W>|#k_dkDwtI0?=^=|J6pLy`_g-AkvcyYctkN8z6hORXg32RqPz@J5 zDc<9i1{}A0{^%8Ws{rp5xqtcC6a;<$6W2r!Q#@-P9IH~4zwn5x`(Zj6c_2)iM5f9k zeQz8D{4dPG*L}fqqwf@wt67cOanya;s18ht;%-ZlvnZF92$aMCG|!mP|FU}9st<3_ zF<(ZimE)IH$$ZUORohjA6F*?S&g>&2spZW z?c_cB4w#2?tz6Iz9?Yv=JNgI(m&QOaXD+U@QR0ygu6?q-7Fd7c%gA{TjM(Wyc&Xet zDI^0i z{<<64Cu^b5^g{|Zp1k{O(9XNUwX~_A?U(k))6ehz>gyt1N%iXbc=X*Nipzb3|D63< zl8Hzg5FNL!KoPlYJ>XVwDQH+gQDLrG^`%_-_TuE8FXU3S`I*D9~$n zzAbTnJr4%<`g6I5d+90&rS9l_U;cz)@O-=Zy&cgdR?Kzu+sM}%3FneOG$Z6n-pnVk z%(FnzCBiKMXFa`6+E^Q<#ocrc7r3uOBTuFgqyqZfzXXhoLx-iI(9qh!0|HMDIxBed zGp%JiSjXmgMhE#Y-HL00K^&E~QYy<9Fhq#$YSDNvwgsh$e0d+wpp5w4YR6#b<*Irp z3w7&+>FIvd{!-X|sRc@1vt=xNOH_mEp`(ke!Qr#q7JxFw9xmIIrWKssatweKe4 ztE4{UI}F)^++|*be5s0gsXY?d)&b9<@(N(3fjX+)FRoR!h9*%whd1NBQ#QGBxs?wS zXx9aB26%+Ftud^iJbeShRR#X>(sVm*QoH+Nz2A`s zxv^Azcl7I6xODujmLL}+Scy9@yhOIZ z+UrD39z1lk$Pq#C*Ys^&$O$zPNdz3ilI1W@Ox#wxT4%iO4PKMZA<5nq$IbymrO-8_ zVFHpCRY|PtHG&=7an*tlO6iK|8Veh8(u&howAzxXp-r%uzrii$m+kxDhuiqNRUEUN zlt0xKR5jB^uS{vE$<2YNckh{Yd?rn&*u?mu2C-W4M<_R-n+THkG>Y3d{szG7@-fiO zILhhlb6X%V58lSj?ba$UuJ|5w%xKy`pHt41K0~2(1&49?xSwrn=5IkNamjLP$U5QS zBQ{k$NupT;3OSDT1x4$s1DKJ-JF9sfnhkY?Y%~xd^!YXsQ@aniR0po+)YXoPwX@xZ zku6W4mwSz~0m_|t(O`(Zw3!ZmH$)q)f1dU4z98sfI35PEH#+yj(Cs?>gqIQ*aAPc} zL-xTH5x~{xb6m>(v0eUHKSM9MsNg+rlVkE5#PDaP%Nn*t(5R@OPtRe@bldJynQ9>; zVkepkUnxnp6kbe|0C%$~HsHJ=QO8})r`Nv?7ooK*xDXj7f-hu0F!#Cz9G0}lAC|6H z9}=wvci|AYet$Cjx<06TSS_fArGW`3{47|7qznrqC2m*%(s~(4wjS5{ket_zyzw<> zlF&M^71eGi&6;ULgjFQ4r~)IGjb;-bD)d-r0<~=w)U$^NzSQs^i`nq={kT61c~xC_ zH61(qL!%l?iqWD!9$lxaw#$qGEHKzH!@Gm$aFKtJ$+*Inx}b4~`msh1ZRqXm2x397 ztJVXhI44Y;h350Mf3AIF(U%T_7?2JIFYiBml`HOtL6LgCqAp~Z)|E@I7FR^5C2WjX z!I|>*s~f)A5$MZf2ZB-Z1qJpP1dUvl_=gmoc}euuIQ&t96HMzwF{KJ)e=+yPZuIh}``=njlm8-E4>`qgrO{uBN^GxjMe9Ahg(t({u2l)(UYr^&-{uNg-Rp42JY0D0bwNR|eHKHdons%NL>JwL zsT`+Bo5&|*;$jSr=j+$UO!Qw2`2ha^eJcLNcw*PTr<}(G2{6DN_ECc8JT$D|>n&3A zT*0k{$~z-SzJgEJadC}sDdgJ~inMMWN#cFa+8AQeJ@Ho3NPU)Ukbr}hgG(OQ2P4+} zW$oXE&O=K~+IhmloAXRqXgoUJp7~Hr@Q!vT4&Oa5%7cYFCl3`qAeDz=Nrx^gJ(%!i zYA3`v&9zgd-{f`pAqc_`q5703?!Zu!5>%>XSd4J>k)($Ry;(jL*{sKtbVyY3C06AWuLFn(f-c0W8EoQMSuQ*VYIw6 zK_v*!rSOCNGV)L?ka%I7{q1CBjS@Pk)q0~uRmcO)*N{?Bz>Iz6QGj3LYyAj8stM_6 zlzQYS1>KO6+QX_vFSnf3e8Z%muXuHApD;8eAmAH3ZQpRjG#Isnq%l*cobBjPn|t3_ z$*F#C`-|D=_xHbF0z2~ApSrpR)W?fE{`mVPutJ;<7c@%hTsV?To4XY5;&EI82pV28 z44u3WzdIc5LWQ80VOvx0zGg0SzBoKd8x0l!l4u(7jEX%P7C1E3zB15PSZuoFm~9op zPS5zNZkQ{)66T&*gSH6*F}xG(kH%u)<7T(jk9G6l@!#Qu)Uuz~g$#s5IYVTvVH-J^ z8wWt|)C5VJrG>;qE|z=9)ZOjieL6{tqOgfr(@g)F$!j43M(OaL{@nV@WUkf3oVS{U z0qVY(!xH6nHM!OVa;2#Rkp%vrYC;tHt<9lKTw+yLpuA=EARPLb*Q zbb<_>Q0KdMUUD`4?{GY%f26wmN zD=dQzTQv*Tzff(YwQl38g|Hcbbo+zN*HKkrHV~? zF9}|1Inr$mD?CX^AAFyKw4F(iblY9={MG}H3Fby<1+&NK>962vkOmeT7|10P!&yYq z0IZ)baR{bML2b`;8z{kLRz}7gExAjcy0+Zp@31vMp-*f!&~S_?fMbrMr8_GfP6@aN z?=W+|O}nWUuxB#H(JK#J^BR71bvhpX>tCs&0`ByPNaVb z!eEkMN%!p}B%Eiy;0(DA^Q@%-cW3dp7iK~@5$jAPg$&j{d96)Pu9$8o=Rn$FIEj8} zAn*zHvb_z4*P}XDT?j^%=eIDqM!GN&hiJ&u4d71Z{Q#7S!O(_~vxhQq_q&6`|0eT% zZB!O|8@qXn0VWVGnzBa>(I0>7|1mduoBSlnO+?npeJ{S3Z`Ums_qtw21`Pn#@IBaI z<5-kzUc3$JghxRORXkw^edTYZ6Pnrp`>@08$Zn?B_jBAm&Hx};au(vZ;U9%IbB(05 z-elOu=yrOKl)NcWeOV2UNml!}&|TfynDAK`3OK{|B`z*2USMHu3il0=hJQh_kCf%E z(TsTA*Gaz-cOkD9Li{#Lh5KiLD^rJ(JuHTR4O8fuHW1V`Cs#NJ2GJGXUg|QJ=OO`e z1*d2*y@k1avM8=_*=XKM9qS1zh230D7mMlbImG&Z8vTVA>(Mi;2Fpz`v_Hh(^Qlf? zk_QMcy&X`?M$*|X(Dp?+iyl1-jJ7A-f$NYD`Q=$gVLzjA5Bp}p z9`@_b#qIR8P7vrJ5ays`g+9o`e5cEY)AKWQI}q*R@oT>fb@9pxo(}ooS=Ik4te)o#u;tacuiq0YhLc;_MC$3M5j+v)5NFyP7Og?pGOi+n15h{;b7MJ4A# zLPU#-GJ>kuFN+hu*%>7*yNo+o-x63W^0`5DCiv4LT;h$lYa$Fm>Mavr10fT@` zCRQm|U-2?BXX_H!E}+d4F9f-);x_CdF9xBKGy1OK*1;nJQR$kym-!ZPWV0Es9*Lli z2^+>xdKIvo`rc*SNtr;jdV1Aq8Dq*v$Qz931db(Wzgxl|sI}r1_TlvKu<@zS1*ro> zM$(1NoT;5yl3Evz25iGf6t8N9coH#e;qq!nn@1sL;4xqE`t1#_HdIqI?}!R@jfZvI z?OpnG=ueUSDb?|!e^ubkmhk}Z2H=nO-Ba5g4Dn(J97h+B{x6!6IkS(tQqy3vVjd{4_qODYA_QA5xzsbq$sr zXqqa^Xlpy_k3H#9F~Wr~Z%@OKc5Z(z7(-SVrqmWr#< z;?)*mQq1yAX1Y_m~jj^lxN8!7FN) zA&wWEzWf;qA{6n$aWWYzZsmBZET)S(Bj6DdI0rBU!`8Bsq5XHJp7=3;EWIOX8{)Y- zRxmHo0X^G_$&BJ>=9f|v2fW@0g#aCd&b8BxP};6g56O_pdcM_=K@ehl+~O4%hjq4r zn2pe%$L(TRrUVUDL7W?Q%1tjo7BkgNJ)5b7A+T;GBu*9|PE_|C9GOT@u*pw%-ndhv zL#d^KhT6#(0Zk`uQSEpMdHr-8N*=mqwM1Sg&QPCFg>tN#KH}59h z^Pgrq+c8LC00~ z{p60QE?};IuT|&*WUHMv_>genmA$Lc%xmOfl?4uU3*vB3Oz~4=*W-CPr^AU)sk#7e z){xmhW-Ds>|C}lR`$jOj;3&Vr!mEXd=JkFT*89_7A;oL4LQXZpqJ!ngl&Zz;!8ZkF} zLnhI_gphR<2V!TUcG^cY=sn|t8$g6XeTg1IUsls5-S~%@LPDntbKXvI6DbdxMlVJE z_K;C4(;+o$c+NSIHVh7U&n3iI-qu5BJSUR1%47GnJXpKS=6Pvvyu(OOD`NEGyN#x! z2ICSPXUKzv`#BEQj0l*#J^*28;`+Doo_e#RzNMVds#moddmauNr%5Y z!mhP~&)AMK@Ai@GZ*_Xz6;j;$xnCd40xR17(yzQSBF+bOk*HO}5Dz_M8n1uwg_Qai zkN0X%Hv>4l)}J4J-N)lE@Hhtc@UKT?IXcQ;%ngCWoqsv}eENvq-rfpLdaS_M^}E(L zCOmJz@%JNZ76Q(T0Y9Nb99j5-j2>Bv@fV(B!2b~vxa7Z#!{)!M@`?X!A${VX$CvNK zNmG2)e~p3afnEZdGqv}6ct(#P%i)=uu?G%(dX>>=&CwQVqkAW)<0LgQGJ=a`lOtWx zxdvUG1cYDU#)0cXH25CBi$oQC#?cN8sd53D%RPVa(FhwME;Jmp0yVxr;%*2Wh4A_; zD1OQFpznHz|8iVxY%9$k_$RiwXk(egs&4hTe=8>UW9DdwBbk9wKW9kt(`vo)DF0j^ zA76@UTa=a1_z9BUrYI$o*4hsrvDWLb1^M|bZ)qHQKtv%0d!cnO4Y;F&>^3L-zThQ7 zGPUoJFwd>7Pgq?b=qDvT|H_d3Q-b6Kk5JsKACUIoS=;<*yJi0uJQ^p9ScoIy;@jK) z9Z0f&kN;tnF<+hhLDeY!!n3~ou(O}24=(!l_V`j_r@XyE$wwN)0D;WofFvG`&bVJ+ zQEQKmaU))-&K5gf|M(9+zm|xJJ{^l5?u|5_Gr|74L*tXe zVHNEkKfD)utd|?`fmQHD|K$Jw_OS_KU$n4?F@b~|Xfm1hUw7DsfB9?gfjL}I#(YOOAh!?=_-FGsI)i6G z6~P_K^1FkB>{5pH-0x;R|2?b>QipZ%Gf~=X>A(M7?{EXIQI!u3H07H#CLDVY9`>rd zTmG-yJNQcN$l-;gdwnaO_&|~aK}OM^>B>=wHDJAQw2AKO&oMZOp8&5v8~A^*k&GFT z0GKv@S#NQZ1rrNCg=7psJSh!L7GayQb|IhKpu+;|8!vibwLndd{9*XpGQwk={s;cJ z!S5daUBB{yM!q=4UjloGzrW``LxaWV@$?G5hIm^LX{HeJ2s>%fE0ldKnUx(5mUz!6 z{GbO_G5BNBM=q%z*7H-j|HhLUUdFxU!(&ktPgu3kw^ygM?JAp|4=~@J^1NA3H7(-lxE+=dv*^FI<4j{N3MhX2Wgu z|NXzu*%iHwPlkX7W{42uqmmiL%Ss?`p9TIn+%LMKj@3<1#q7(Ungwu;A3ii5;his-w- z6AB$A$QtXXXWmS!r8yuG3D{yp;IU~0UGDcA8zzXbfQ-kX+(6&g=lSpk_hZ2pGr~0@ z!+wefC)g4Df>^LVx>5egwm{AP)%6^Dc>ZFK??3jy%^~FV1WMbKQo!E-y(jNiF@p!z z9X6@t^1yMq=G$2I*=ns zMBMY=6e$k(US6uaKj7YGM1%X}i?5DncV;)gV;vN8_^pAu+-E=KuL8&9;RVO^choKL z8W4-WGx&~uqhnaNoY;nCN=*>Dl?{adV@BzyiJcWrG8qN1jtNaccvn>$NFQ8@VA+^k zIl3`B;1*zPSSN=QskD~%u++H)s-5f(tt=!YP4#(pMMO~e+egPvLCiUfG7wzheumsl zmbs#|;mh&8N3IuHutz-l?m7{i zWuioaGt{=_Pn{;=4aOp{9aSnQK?iL3LVtrq&zSz8eckZ5b@(Csp*VIJPKE6s4q$!g zGu27CLJ~xRvM8j6rfQV6nmjyR5>6bd8tz_PUPNhkL9w<2;0JER~Rp2R9-H zf5tOUqJy+@&FjJ8?;!CaB7;F`^IYkhX@qh+Pp3mBiiizxo5L-C7i zG7l-QIzOuQN@j-x`lN4o`qj%Z01uP8Ww#4Ov^PzuPb@Zk(8cp4O@JI zqnG`CKn6I7kcVf0X`GHy!(;u4stkdr!zB^na96)@hhZb=(Jj$H3}=#zpw&2z?{?=TEpq{e~>FHj)ssqFm+ z8)LhIq>j2&(HEcj7^15LzWu(pJ}i&Nw|Eh8H0vj2mml?ZW&PY<&1D+LvU^-ZbKI=; zxgw7L;|`fo?bPNutCZE9{q8e(ya)z*8vv6#BDW9J3o0!vDn>%lt(SxZWdT0{Q;F{m zN@bq^1NcXjdnXKF=|D#T{`UL|$wSUBNH@hle;@;+KEZg+<%LCH5}y2nbHrv%*oJU3 zQXo9Vd$`{mVj^)?$ur3CzwvY}#0H&9}j~khn{Z*~vvW$P6bRh7(1I5e(IVJ|ZdJkp2cf3x<1;Sl>fyxc#NJa1z*p5lFf?fT6cCc4 zY4DT3SXY)Qg)XoHO?ASr#=3+@2S+gFD4ec+As*I?>&&C`UiX$R5j$s)u#{dE|HN5< z)mO{PG67EzMarIv4uX!wgOpb^#qbMR^7V4_c%oFsulI`^2y2e-dXhoL6z2^LOl5Jo zvcn)%E}`auc%WR2O~P!uetNsZ?)_=v_9xq1T!IkIWk*q>*57WJAQSg4)m!m&N>{Ap z7AS7<&?Tw-aKF7_)>k>rWkevNJ{}R?V1yG&b)F)+f!;%4)%zx}{seYp8%U%vCt;X8 zrfuQM^7z7aZakHvMRyvD#~(~=wx_^-RgyHi1hADi2p82?UF6dZWE&pboTD0_V3%-H za4y%6Si(nmh(OgsVDiip7>4_ygm~vD_zmJTl=8B41L+E!gX>Q!xots-Kt5nEh=dRJ zjvg_)>|2(NQD;OAouCc=#l5|C=LDDW&>mw52xP=jIqCX$AoMCsBc9Zl%G@s;AXJ*z zSt@PI{-k80ln?|dSyTR3kxe9_SaLdvtZ%$xxJ8OSdP`wJQ}q*L@C5$0jXx0uaPh+t zFVOUM$Grx580E=Lc)jRBPt1Fc$>zWgOo(ak;iD#%o2(%~^1~@x1 zGrR*6FAffxD})g@)C)#gNJPKu{h0OS^pQc)0$}@Fmqai@6Ns&pItLZRRbt8|B)ySY z)ci)5EpD2)2Kd%w3mTdnnNAFJx{xe>3jPiDtOW5pQx^hlRAcJcFpdG-s%j&@PHVG^ZHL{US%Om{wIjWZlZV8T3ySpKPixn`@5E{69O zPU4t1(w$t|o#}F9(w;)`Q;y48w?lhay+rKLWOhxbX!sYy3tGY>&qr`RyV=OS&a1Bi zE{n?q$ghSDqYM|+e#2F2Dlm}Y*DGGoJD7Z9b0bUPi=4l@ke=`sq5So*CP$6AXmIyL zdz8N1N`yK=_6H||%(z}2*tfwIQdD)(y<0FKg9|Z|#i_w0)Po_DOiWKmr#z8VM;UyN$rB0+NDZiec)9D*EgW%q59>$7{;Elk{oyj9$_?3$&~124r)bXH zEf!l+>BSoqb~JDHq@PKBeZ55)ML*jUgfePd&h?%W`cJSK0*pZh97D{)CkU|}-q-2# zE`z|{;X3=Fae)5r&okO>%^C8j{J{bCysKkI~cTWj36p~3Zdp(RMai&ek%94jDqS4K2e=(p~_m%hSpD8@Ca6rrRpYEd0;M4b&=z#4s#PTisjWIVL>MggYfGue`$OCT z0o?+bzr8+G2*EINVL$1OTIB+~v4-uwxAm$%V()>o%q-Uu;IF;vN*F&EP~06igODfO zW~k_SgAi^(KDm*c80d*;1#mU!@@` zhIM#cF(TKquCUyD9$?|>|0;@-B;Y?$*{FsC@;seu;~O zXn}as#N9~-thXEoidjHdn-0*X)Gqoax)?gjKBNI?R`lw(2FZT$CK0bf5+IZtM3*?B zdBELyd5~Z-h5O5u4`xQ_D1~yy#DEv{0N}b#F1BgI$VOaW`V&xNea^sdWs$(^Uo=V3 ziXx5cgnIE$zR6-lJApR!uzaGZ1BF0f8mT$;0SkgFXZ=K?;ClQY(H-G*aA=YKV|AGq z3%YPD&QUz-I!U1)`RFiw-Qi9{U??m257drW`aJcD2k06D4)cKn_$XYK_-w)D9dnTb zZD`kH`#8aBRK*f^xLR=BvG7P%V{ovDQUe)ZA^q@iMMRAL_DM+aY$^eN(twcnGo2CO z_6ZR{)IAH+-mWOaD9MEK>%-llJgq8`E5Sl|T8aq<(U^1_E2JXUi752#JmmEH-nbjZ z;Og#;kuL#|!*w=fg*_+8IfeDP{~L z#CpO}-{uDkT=z-F;BpNlxcB|Y52EsQYw(JP-JzQ#51;HKCN92_JD*Y)9v7 zIvzK~!oX;Tu0{0`?UpgEh*+Nc$Cri*kSp0)t%V6AED9F^p^|A(Yf%!km|@q7M2NpX zgQ?19G(y5;Ol}|o3ohT3CQ(dArv?H;i5$}XsZZr`++<4iCQ_lNFPv}=o}~CtF+dHf zXb9Lgyz@+|2xM<^sHqCDA*4H37L>ihLJx9~u3iVSiR^MOr2^H zB8@j7a=7=05;JwTgliWE#ZPm%-qdX1yGN>KSd^?+SjCk1uAy z;UN4gn$ioD){+r-`t*ePg>k>!{_SJDiCJkQnK&C;*h#D?C;zgO{J6)+;})zZtaLll z`C)*`GG6M5BNBlf+u%)-0I}ZorZ2*56*p`2Qjk$dvC}TsUKjuZb45ZyV!wX!xN%RA z4S%p(un4$?PKq~)9QTlV;~_LvCvq3lo0yk4p35V|NRS^Qbl~jZ{Z7q+@Q_<_&8d|~WuD|*r{%N78RGXvx7M4#Q33ymr>%@k5z&_4s zVW{i9+#HBNGFD}Dm``~eOI3Yjh`1KO#0|eQyH0=};xvWZSi=(QIs>zm0D*s_7X0bx z5jq`=Z5Wwdc%u?d~pEnP_JAgF4tIm zM|gLvpSQY5{19r1hpbE2q+QcQn9(T*zn8E z?o||Z5tpM44MxNYsm?)?kG1@`S+U@SG7kK9*kK!j(wMvmv2Tknqs5&w+OZ3jtyC!G{9t8l++NoEvNsqSMs#cB>fDR9 zthRBZb8p}dM@lBE!?aP1yblDM(dB2?`cH`K1IE!j>aN6g5z~b^>k=2?{iMA7!2SRR zA|UcNhGLqJx)WY7<>;1F#pHFo9n1d3jMQG8s^rmraf#kF?ja~>3FEgsyiZ}g54*() zLB3++=5m-heK>HWh$g1q1mBQ_L45NKhSw*Q_9RTNew) z=XG96NBo}-s;b3zHZr}+U@X|*aOxC{xKQMR#Pc2EEx4%mat$52bXs$2b1Q}vEaD;< zAKfgK)vuqRpdpUXH_#P=yoW#QGe>^PWxrMi89{;4*CiCZ^!xK$O*RrF2doPVXrW#h zu6evvQ!r>xH|TH=e`RZx>+|00&y_B^>1;a0ehTk@jG7Z7tBxk2_wdxiwWQs?fZ-%` z#IB`m&Y^5aOdVYCNmaRo9dHj*LaS?~QN(mc#;t_=CgxXf5)976MH9wDdZ6Q?NQZ5n z8iFqkP&^srholmbIcIAQ+j+HF2e$7(k{YP1Whn5@WgE&`wmXLs4*%zZ5}CuFL~@4! zLxDpWkw7~uG5x%N0pU1S-d!!qpcBmqN?F|$m`PB+Xp)Pn4%2c!C zu68mA&c2O??9d0&?0XNYO2am{Ed~mGI$)Zd%Hgr1c}CZOx}59b3YgpF9?!}KM=6;_ zNVFSTdU`*wgrgg^lU+F(SegSER&{K;3Pt%D9SxK&MET^Dk{HfbtUWsH(SeqBy%2Np zLjA!J2ZYB*e;j(djjl<=gW$HLt46H;q9kye1rZE3dSsO6%e5h*j{Lbsf+){n_SM?tiVOtdH2R_gnQAn|JNOOlP?frUxFG?u~0IGY& zV#td%+m!Db^k(!kd+S`{M1)!4i4C$ET@+3$B&Ymr-f@I5fYo2@Y1jGW2DZC(&J(B@o$ z)vFoe8-+cJ%&4j^>hL+Z%UkG`#sJ6jTMNu)Srf0SU_Cnf2zr70sakb$ zM97(G%4ow~;}-bCdKLm{AcP)V+(P0U;XNC<8~WHXT!>A1Gh_ongcv3p#~19RoI-Oy zhP`*=g2adbbzV+z`6wo6QuV!u5ebVtAX=K7GV3%_kV6=Tx~^s{I6lj0u60f0mO)E2 zeG2JrsdDHB8l~08zsKBCmk6lgcRG=-wGy&$a7w{G$CE{A=5_=wOl~vM(@|j6zmkNM zJ#u=0>pM`Nb*3$I03mG{ zYXi-%#M*E&FbBpqKPGyoZpYmNck$C?KZnX|-C#Zz5`PYgw1n z7^-P45R)R|&L+RchI^710dxuS%N8b9p*4?DjTxI8k2YB-dWEx9`+C|!{)%^?>{M(9 zU=v*8p!@WumV(zwMw-C|(e|6uXUPijUc|9ffuMYP;?#oo=rBSwDCg-nQKV|p#tgd zz}=exO&p7?E;h}j4mv{$rc$Mz2H6&11Spg1JXD+R27^x~v|!qCwtnyjmh4zB{PVO0 zCeXgZpSB*~dG6T=GNyU|op45X@x)vucWyP+X z;)RLGZbO(kohwL}3J5C_g*sd7u7Y05tg|EnwLMA-dT#&?BxprgvR4?9qXZAUY7aO_#}Di4kw}j$;zq&ETAWo3O;DLn&;*MaJVkxXCv#766Ulkg$I7p@T%S~5 zubPR%ooOOZbL#bs!?g^a=(65zH-L7ypAaMH>|Wo9mhLpHKqMy+AGvBPK5{l~ZU%)H zC}$U64&SuJ+PXdMQP4f^ud`-z^os{H#^1P?sJtoLo$ii2P>3Lc?Uav6iAh{uuyM1m z2zmC$X+jj1ZcVvb{q|J?6)h8Ua`1zjTL z1WlM(IYa7pBR-u#;iE8rA(f&b@oCr{B0(C_WmOS#{VmW=^4G}ZnzIGQMvjom>EJ*P zr(O?x$9&iawxGrq80B>O$Bc8)&4g?HcVy3I!>YFeqJ33c!PJ6qCAnom+r>=Wx%RCp&D0#;<8g?L|k(^JxY{eFa$&z&N$ z;a$jt=2NYU%bos4v zf=dwA+rDb-ZQ*%DkiMGW{U*X-czWePw1v0^uT~6z@y)S3j4&3rKqvjPC3Uzqd#yYz2LQ zRu+~tXS#g`L=j>JKFc0sr+(G309DyY!B&tau&LB{CYTBxlRt-|*bxv67Dmg6pIOyD zdJ?PJ_7P=#HMX;#Z@i_;EGsP}I?bsC0r1f?_t0SqVkzh%Tnj!lGGfpq@BuO9jtIOV z7o`5lxS*c$8V?PTQW|j^^_mZ1nY*;eqP*g88jyL1J^S+sw3J{+O-dwkz~Mhl#VTbU zcU?PHr-ngTmaDEpNcFa4>mv#41v0aXpCicvZHFL(d61iF@h%c0fnl>-uZekF~Qzew1KEvmU)v87P*F+i}Q3~lAX(SW&B zW(ND4`*Y4@Yjf@p5}k5AL~yw1y7F7*W#G)y#U$pXcKy8aH^NU;ZS-LIZCr6kN_PrI z8b+(SK2U=ql$EuiH%V?PB)bG3jJqZA;Mk75Cbq634T;={v%*L?g}FgacCN#w$KWa8Tl>w?jpi$!t7q5>%x@+i`x#s5>b^yWR8Pz+cl mf%=$OYsv@}&xlDN+bcU3^hA$@Mawns=x3*NaM=$$1O7iw;!Umq diff --git a/fluidbook/tools/swftools-special-swfdump/src/font2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/font2swf.1 deleted file mode 100644 index 9b4a9f6dc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/font2swf.1 +++ /dev/null @@ -1,33 +0,0 @@ -.TH font2swf "1" "April 2009" "font2swf" "swftools" -.SH NAME -font2swf - Converts a font to SWF. - -.SH Synopsis -.B font2swf - -.SH DESCRIPTION -Takes a font file (.ttf, .afm, .pfa, .pfb and all other types -supported by FreeType) and converts it into a SWF file. -.PP -The SWF will contain the Font in SWF format (that is, a -DefineFont2 Tag) as well as a textfield containing all the -characters the font has. This means the resulting SWF will -be viewable. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR - Print short help message and exit -.TP -\fB\-v\fR, \fB\-\-verbose\fR - Be verbose. Use more than one -v for greater effect. -.TP -\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR - Write output to file \fIfilename\fR. (If not given, the output will go - to a file called "output.swf") -.TP -\fB\-V\fR, \fB\-\-version\fR - Print version info and exit -.SH AUTHOR - -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/font2swf.c b/fluidbook/tools/swftools-special-swfdump/src/font2swf.c deleted file mode 100644 index 972f29430..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/font2swf.c +++ /dev/null @@ -1,137 +0,0 @@ -/* font2swf.c - - Utility for converting TrueType and Type 1 fonts to SWF. - - Part of the swftools package. - - Copyright (c) 2004 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" - -static char * filename = 0; -static char * destfilename = "output.swf"; -static int all=0; -static int verbose=0; -static char * fontname = 0; -static char config_flashtype = 0; - -static struct options_t options[] = { -{"h", "help"}, -{"v", "verbose"}, -{"T", "flashtype"}, -{"o", "output"}, -{"V", "version"}, -{0,0} -}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("font2swf - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else if(!strcmp(name, "o")) { - destfilename = val; - return 1; - } - else if(!strcmp(name, "v")) { - verbose ++; - return 0; - } - else if(!strcmp(name, "T")) { - config_flashtype=1; - return 0; - } - else if(!strcmp(name, "n")) { - fontname = val; - return 1; - } - else if(!strcmp(name, "a")) { - all = 1; - return 0; - } - else { - printf("Unknown option: -%s\n", name); - exit(1); - } - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s \n", name); - printf("\n"); - printf("-h , --help Print short help message and exit\n"); - printf("-v , --verbose Be verbose. Use more than one -v for greater effect.\n"); - printf("-o , --output Write output to file .\n"); - printf("-V , --version Print version info and exit\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Please specify only one font\n"); - exit(1); - } - filename = name; - return 0; -} - -static void convertFont(char*infile, char*outfile) -{ - SWFFONT * font; - - font = swf_LoadFont(infile, config_flashtype); - swf_FontCreateAlignZones(font); - - if(fontname) - font->name = strdup(fontname); - - swf_WriteFont(font, outfile); - swf_FontFree(font); -} - -int main(int argc, char ** argv) -{ - char cwd[128]; - getcwd(cwd, 128); - processargs(argc, argv); - if(!all && !filename) { - fprintf(stderr, "You must supply a filename.\n"); - exit(1); - } - - if(!all) { - convertFont(filename, destfilename); - return 0; - } - - /* TODO */ - printf("--all not implemented yet.\n"); - - return 0; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/src/gif2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/gif2swf.1 deleted file mode 100644 index 56fd09d8f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/gif2swf.1 +++ /dev/null @@ -1,42 +0,0 @@ -.TH gif2swf "1" "April 2009" "gif2swf" "swftools" -.SH NAME -gif2swf - Takes a number of gif files and converts them to a swf movie, one -picture per frame. - -.SH Synopsis -.B gif2swf [-X width] [-Y height] [-o file.swf] [-r rate] file1.gif [file2.gif ...] - -.SH DESCRIPTION -This tools converts gif image files into an SWF animation. It takes any -number of input pictures, and converts them to SWF one-by-one, where every -converted picture is a seperate frame in the target SWF. - -.SH OPTIONS -.TP -\fB\-r\fR, \fB\-\-rate\fR \fIframerate\fR - Set movie framerate (frames per second) -.TP -\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR - Explicitly specify output file. (Otherwise, output will go to stdout / output.swf) -.TP -\fB\-z\fR, \fB\-\-zlib\fR \fIzlib\fR - Use Flash MX (SWF 6) Zlib encoding for the output. The resulting SWF will be - smaller, but not playable in Flash Plugins of Version 5 and below. -.TP -\fB\-l\fR, \fB\-\-loop\fR \fIloop count\fR - Set loop count. (default: 0 [=infinite loop]) -.TP -\fB\-X\fR, \fB\-\-pixel\fR \fIwidth\fR - Force movie width to \fIwidth\fR (default: autodetect) -.TP -\fB\-Y\fR, \fB\-\-pixel\fR \fIheight\fR - Force movie height to \fIheight\fR (default: autodetect) -.TP -\fB\-v\fR, \fB\-\-verbose\fR \fIlevel\fR - Set verbose level (0=quiet, 1=default, 2=debug) -.TP -\fB\-C\fR, \fB\-\-cgi\fR - For use as CGI- prepend http header, write to stdout -.TP -\fB\-V\fR, \fB\-\-version\fR - Print version information and exit diff --git a/fluidbook/tools/swftools-special-swfdump/src/gif2swf.c b/fluidbook/tools/swftools-special-swfdump/src/gif2swf.c deleted file mode 100644 index 2359da5cc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/gif2swf.c +++ /dev/null @@ -1,702 +0,0 @@ -/* -*- mode: c; tab-width: 4; -*- ---------------------------[for (x)emacs]-- - - $Id: gif2swf.c,v 1.7 2008/02/08 11:43:12 kramm Exp $ - GIF to SWF converter tool - - Part of the swftools package. - - Copyright (c) 2005 Daichi Shinozaki - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - - This file is derived from png2swf.c */ - -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" - -#define MAX_INPUT_FILES 1024 -#define VERBOSE(x) (global.verbose>=x) -#define AS_FIRSTFRAME "if(!n) n=0;" -#define AS_LASTFRAME "if(n<%d){n=n+1;gotoAndPlay(1);}else stop();" - -static struct { - float framerate; - int max_image_width; - int max_image_height; - int force_width; - int force_height; - int nfiles; - int verbose; - int do_cgi; - int version; - char *outfile; - int imagecount; - int loopcount; -} global; - -struct { - char *filename; -} image[MAX_INPUT_FILES]; - -struct gif_header { - int width; - int height; -}; - -enum disposal_method { - NONE, - DO_NOT_DISPOSE, - RESTORE_TO_BGCOLOR, - RESTORE_TO_PREVIOUS -}; - - -void SetFrameAction(TAG ** t, const char *src, int ver) -{ - ActionTAG *as; - - as = swf_ActionCompile(src, ver); - if (!as) - fprintf(stderr, "Couldn't compile ActionScript\n"); - else { - *t = swf_InsertTag(*t, ST_DOACTION); - swf_ActionSet(*t, as); - swf_ActionFree(as); - } -} - -int getGifDisposalMethod(GifFileType * gft, int framenum) -{ - int i; - ExtensionBlock *ext = gft->SavedImages[framenum].ExtensionBlocks; - - for (i = 0; i < gft->SavedImages[framenum].ExtensionBlockCount; i++, ext++) - if (ext->Function == GRAPHICS_EXT_FUNC_CODE) - return ((ext->Bytes[0] & 0x1C) >> 2); - - return -1; -} - -int getGifLoopCount(GifFileType * gft) -{ - int i, loop = -1; - ExtensionBlock *ext = gft->SavedImages[0].ExtensionBlocks; - - for (i = 0; i < gft->SavedImages[0].ExtensionBlockCount; i++, ext++) - if (ext->Function == APPLICATION_EXT_FUNC_CODE) { - // info: http://semmix.pl/color/exgraf/eeg24.htm - if (ext->ByteCount == 11 && - (strncmp(&ext->Bytes[0], "NETSCAPE2.0", 11) == 0 || - strncmp(&ext->Bytes[0], "ANIMEXTS1.0", 11) == 0)) { - // check for the subblock - ext++; - if (ext->ByteCount != 3) - ext--; - else { - loop = GET16(&ext->Bytes[1]); - break; - } - } - } - - return loop; -} - -U16 getGifDelayTime(GifFileType * gft, int framenum) -{ - int i; - ExtensionBlock *ext = gft->SavedImages[framenum].ExtensionBlocks; - - for (i = 0; i < gft->SavedImages[framenum].ExtensionBlockCount; i++, ext++) - if (ext->Function == GRAPHICS_EXT_FUNC_CODE) - return GET16(&ext->Bytes[1]); - - return 0; -} - -int getTransparentColor(GifFileType * gft, int framenum) -{ - int i; - ExtensionBlock *ext = gft->SavedImages[framenum].ExtensionBlocks; - - // Get transparency color from graphic extension block - for (i = 0; i < gft->SavedImages[framenum].ExtensionBlockCount; i++, ext++) - if ((ext->Function == GRAPHICS_EXT_FUNC_CODE) && (ext->Bytes[0] & 1)) { - // there is a transparent color - return ext->Bytes[3] == 0 ? 0 : // exception - (U8) ext->Bytes[3]; // transparency color - } - - return -1; -} - -TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) -{ - TAG *t; - RGBA rgb; - - memset(swf, 0x00, sizeof(SWF)); - - swf->fileVersion = global.version; - swf->frameRate = (int) (256.0 * framerate); - swf->movieSize.xmax = dx * 20; - swf->movieSize.ymax = dy * 20; - - t = swf->firstTag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); - - rgb.r = rgb.g = rgb.b = rgb.a = 0x00; - - //rgb.g = 0xff; //<--- handy for testing alpha conversion - swf_SetRGB(t, &rgb); - - return t; -} - -int MovieFinish(SWF * swf, TAG * t, char *sname) -{ - int f, so = fileno(stdout); - t = swf_InsertTag(t, ST_END); - - if ((!isatty(so)) && (!sname)) - f = so; - else { - if (!sname) - sname = "output.swf"; - f = open(sname, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644); - } - - if (global.do_cgi) { - if FAILED - (swf_WriteCGI(swf)) fprintf(stderr, "WriteCGI() failed.\n"); - } else { - if (swf_WriteSWF(f, swf) < 0) - fprintf(stderr, "Unable to write output file: %s\n", sname); - if (f != so) - close(f); - } - - swf_FreeTags(swf); - return 0; -} - -TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int id, int imgidx) -{ - SHAPE *s; - SRECT r; - MATRIX m; - int fs; - - U8 *imagedata, *from, *to; - GifImageDesc *img; - RGBA *pal; - - struct gif_header header; - - int i, j, numcolors, alphapalette; - U8 bgcolor; - int bpp; // byte per pixel - int swf_width, padlen; - - ColorMapObject *colormap; - GifColorType c; - int interlacedOffset[] = { 0, 4, 2, 1 }; // The way Interlaced image should - int interlacedJumps[] = { 8, 8, 4, 2 }; // be read - offsets and jumps... - U16 delay, depth; - int disposal; - char *as_lastframe; - - GifFileType *gft; - FILE *fi; - - if ((fi = fopen(sname, "rb")) == NULL) { - if (VERBOSE(1)) - fprintf(stderr, "Read access failed: %s\n", sname); - return t; - } - fclose(fi); - - if ((gft = DGifOpenFileName(sname)) == NULL) { - fprintf(stderr, "%s is not a GIF file!\n", sname); - return t; - } - - if (DGifSlurp(gft) != GIF_OK) { - PrintGifError(); - return t; - } - - header.width = gft->SWidth; - header.height = gft->SHeight; - - pal = (RGBA *) malloc(256 * sizeof(RGBA)); - memset(pal, 0, 256 * sizeof(RGBA)); - - img = &gft->SavedImages[imgidx].ImageDesc; - - // Local colormap has precedence over Global colormap - colormap = img->ColorMap ? img->ColorMap : gft->SColorMap; - numcolors = colormap->ColorCount; - alphapalette = getTransparentColor(gft, imgidx); - if (VERBOSE(3)) - fprintf(stderr, "transparent palette index => %d\n", alphapalette); - bpp = (alphapalette >= 0 ? 4 : 3); - - // bgcolor is the background color to fill the bitmap - if (gft->SColorMap) // There is a GlobalColorMap - bgcolor = (U8) gft->SBackGroundColor; // The SBGColor is meaningful - else if (alphapalette >= 0) // There is a transparency color - bgcolor = alphapalette; // set the bgcolor to tranparent - else - bgcolor = 0; - // Don't know what to do here. - // If this doesn't work, we could - // create a new color and set the - // alpha-channel to transparent - // (unless we are using all the 256 - // colors, in which case either we - // give up, or move to 16-bits palette - if (VERBOSE(3)) - fprintf(stderr, "BG palette index => %u\n", bgcolor); - - for (i = 0; i < numcolors; i++) { - c = colormap->Colors[i]; - if (i == bgcolor || i == alphapalette) - pal[i].r = pal[i].g = pal[i].b = pal[i].a = 0; // Fully transparent - else { - pal[i].r = c.Red; - pal[i].g = c.Green; - pal[i].b = c.Blue; - pal[i].a = 255; // Fully opaque - } - } - - t = swf_InsertTag(t, bpp == 4 ? ST_DEFINEBITSLOSSLESS2 : ST_DEFINEBITSLOSSLESS); - swf_SetU16(t, id); // id - - // Ah! The Flash specs says scanlines must be DWORD ALIGNED! - // (but image width is the correct number of pixels) - swf_width = BYTES_PER_SCANLINE(header.width); - - if ((imagedata = (U8 *) malloc(swf_width * header.height)) == NULL) { - fprintf(stderr, "Failed to allocate memory required, aborted."); - exit(2); - } - - to = imagedata; - from = (U8 *) gft->SavedImages[imgidx].RasterBits; - - if (swf_width == header.width) { - // we are all nicely aligned and don't need to move the bitmap around. - // Just copy the bits into the image buffer. - if (!gft->Image.Interlace) - if (header.width == img->Width && header.height == img->Height) - memcpy(to, from, header.width * header.height); - else { //small screen - for (i = 0; i < header.height; i++, to += header.width) { - memset(to, bgcolor, header.width); - if (i >= img->Top && i < img->Top + img->Height) { - memcpy(to + img->Left, from, img->Width); - from += img->Width; - } - } - } - - else // Need to perform 4 passes on the interlaced images - for (i = 0; i < 4; i++) - for (j = interlacedOffset[i]; j < header.height; - j += interlacedJumps[i], from += header.width) - memcpy(to + header.width * j, from, header.width); - } else { - padlen = swf_width - header.width; - - // here we need to pad the scanline - if (!gft->Image.Interlace) { - if (header.width == img->Width && header.height == img->Height) { - for (i = 0; i < header.height; i++, from += header.width, to += swf_width) { - memcpy(to, from, header.width); - memset(to + header.width, bgcolor, padlen); - } - } else { //small screen - for (i = 0; i < header.height; i++, to += swf_width) { - memset(to, bgcolor, swf_width); - if (i >= img->Top && i < img->Top + img->Height) { - memcpy(to + img->Left, from, img->Width); - from += img->Width; - } - } - } - } else { // Need to perform 4 passes on the interlaced images - for (i = 0; i < 4; i++) - for (j = interlacedOffset[i]; j < header.height; - j += interlacedJumps[i], from += header.width) { - memcpy(to + swf_width * j, from, header.width); - memset(to + swf_width * j, bgcolor, padlen); - } - } - } - swf_SetLosslessBitsIndexed(t, header.width, header.height, imagedata, pal, 256); - - t = swf_InsertTag(t, ST_DEFINESHAPE); - - swf_ShapeNew(&s); - swf_GetMatrix(NULL, &m); - m.sx = 20 * 0x10000; - m.sy = 20 * 0x10000; - fs = swf_ShapeAddBitmapFillStyle(s, &m, id, 0); - - swf_SetU16(t, id + 1); // id - - r.xmin = r.ymin = 0; - r.xmax = header.width * 20; - r.ymax = header.height * 20; - swf_SetRect(t, &r); - - swf_SetShapeHeader(t, s); - - swf_ShapeSetAll(t, s, 0, 0, 0, fs, 0); - swf_ShapeSetLine(t, s, r.xmax, 0); - swf_ShapeSetLine(t, s, 0, r.ymax); - swf_ShapeSetLine(t, s, -r.xmax, 0); - swf_ShapeSetLine(t, s, 0, -r.ymax); - - swf_ShapeSetEnd(t); - - depth = imgidx + 1; - if ((imgidx > 0) && // REMOVEOBJECT2 not needed at frame 1(imgidx==0) - (global.imagecount > 1)) { - // check last frame's disposal method - if ((disposal = getGifDisposalMethod(gft, imgidx - 1)) >= 0) { - switch (disposal) { - case NONE: - // [Replace one full-size, non-transparent frame with another] - t = swf_InsertTag(t, ST_REMOVEOBJECT2); - swf_SetU16(t, depth - 1); - if (VERBOSE(3)) - fprintf(stdout, " [none]\n"); - break; - case DO_NOT_DISPOSE: - // [Any pixels not covered up by the next frame continue to display] - if (VERBOSE(3)) - fprintf(stdout, " [don't dispose]\n"); - break; - case RESTORE_TO_BGCOLOR: - // [The background color or background tile -rather than a previous frame- - // shows through transparent pixels] - t = swf_InsertTag(t, ST_REMOVEOBJECT2); - swf_SetU16(t, depth - 2); - if (VERBOSE(3)) - fprintf(stdout, " [restore to bg color]\n"); - break; - case RESTORE_TO_PREVIOUS: - // [Restores to the state of a previous, undisposed frame] - // ** NOT IMPLEMENTED YET (same as "restore to bgcolor") ** - t = swf_InsertTag(t, ST_REMOVEOBJECT2); - swf_SetU16(t, depth - 1); - if (VERBOSE(3)) - fprintf(stdout, " [restore to previous]\n"); - break; - default: - break; - } - } - } - - swf_SetU16(t, depth); - t = swf_InsertTag(t, ST_PLACEOBJECT2); - - swf_GetMatrix(NULL, &m); - m.tx = (swf->movieSize.xmax - (int) header.width * 20) / 2; - m.ty = (swf->movieSize.ymax - (int) header.height * 20) / 2; - swf_ObjectPlace(t, id + 1, depth, &m, NULL, NULL); - - if ((global.imagecount > 1) && (global.loopcount > 0)) { // 0 means infinite loop - if (imgidx == 0) - SetFrameAction(&t, AS_FIRSTFRAME, global.version); - } - - t = swf_InsertTag(t, ST_SHOWFRAME); - - if (global.imagecount > 1) { // multi-frame GIF? - int framecnt; - delay = getGifDelayTime(gft, imgidx); // delay in 1/100 sec - framecnt = (int) (global.framerate * (delay / 100.0)); - if (framecnt > 1) { - if (VERBOSE(2)) - fprintf(stderr, "at frame %d: pad %d frames(%.3f sec)\n", - imgidx + 1, framecnt, delay / 100.0); - - framecnt -= 1; // already inserted a frame - while (framecnt--) - t = swf_InsertTag(t, ST_SHOWFRAME); - } - if ((imgidx == global.imagecount - 1) &&global.loopcount > 0) { // last frame - as_lastframe = malloc(strlen(AS_LASTFRAME) + 5); // 0-99999 - sprintf(as_lastframe, AS_LASTFRAME, global.loopcount); - SetFrameAction(&t, as_lastframe, global.version); - if (as_lastframe) - free(as_lastframe); - } - } - - free(pal); - free(imagedata); - DGifCloseFile(gft); - - return t; -} - -int CheckInputFile(char *fname, char **realname) -{ - FILE *fi; - char *s = malloc(strlen(fname) + 5); - GifFileType *gft; - - if (!s) - exit(2); - (*realname) = s; - strcpy(s, fname); - - // Check whether file exists (with typical extensions) - - if ((fi = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.gif", fname); - if ((fi = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.GIF", fname); - if ((fi = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.Gif", fname); - if ((fi = fopen(s, "rb")) == NULL) { - fprintf(stderr, "Couldn't open %s!\n", fname); - return -1; - } - } - } - } - fclose(fi); - - if ((gft = DGifOpenFileName(s)) == NULL) { - fprintf(stderr, "%s is not a GIF file!\n", fname); - return -1; - } - - if (global.max_image_width < gft->SWidth) - global.max_image_width = gft->SWidth; - if (global.max_image_height < gft->SHeight) - global.max_image_height = gft->SHeight; - - if (DGifSlurp(gft) != GIF_OK) { - PrintGifError(); - return -1; - } - // After DGifSlurp() call, gft->ImageCount become available - if ((global.imagecount = gft->ImageCount) >1) { - if (global.loopcount < 0) { - global.loopcount = getGifLoopCount(gft); - if (VERBOSE(3)) - fprintf(stderr, "Loops => %d\n", global.loopcount); - } - } - if (VERBOSE(2)) { - U8 i; - fprintf(stderr, "%d x %d, %d images total\n", gft->SWidth, gft->SHeight, gft->ImageCount); - - for (i = 0; i < gft->ImageCount; i++) - fprintf(stderr, "frame: %u, delay: %.3f sec\n", i + 1, getGifDelayTime(gft, i) / 100.0); - } - - DGifCloseFile(gft); - - return 0; -} - -int args_callback_option(char *arg, char *val) -{ - int res = 0; - if (arg[1]) - res = -1; - else - switch (arg[0]) { - case 'l': - if (val) - global.loopcount = atoi(val); - res = 1; - break; - - case 'r': - if (val) - global.framerate = atof(val); - if ((global.framerate < 1.0 / 256) ||(global.framerate >= 256.0)) { - if (VERBOSE(1)) - fprintf(stderr, - "Error: You must specify a valid framerate between 1/256 and 255.\n"); - exit(1); - } - res = 1; - break; - - case 'o': - if (val) - global.outfile = val; - res = 1; - break; - - case 'z': - global.version = 6; - res = 0; - break; - - case 'C': - global.do_cgi = 1; - break; - - case 'v': - if (val) - global.verbose = atoi(val); - res = 1; - break; - - case 'X': - if (val) - global.force_width = atoi(val); - res = 1; - break; - - case 'Y': - if (val) - global.force_height = atoi(val); - res = 1; - break; - - case 'V': - printf("gif2swf - part of %s %s\n", PACKAGE, VERSION); - exit(0); - - default: - res = -1; - break; - } - - if (res < 0) { - if (VERBOSE(1)) - fprintf(stderr, "Unknown option: -%s\n", arg); - exit(1); - return 0; - } - return res; -} - -static struct options_t options[] = { -{"r", "rate"}, -{"o", "output"}, -{"z", "zlib"}, -{"l", "loop"}, -{"X", "pixel"}, -{"Y", "pixel"}, -{"v", "verbose"}, -{"C", "cgi"}, -{"V", "version"}, -{0,0} -}; - -int args_callback_longoption(char *name, char *val) -{ - return args_long2shortoption(options, name, val); -} - -int args_callback_command(char *arg, char *next) // actually used as filename -{ - char *s; - if (CheckInputFile(arg, &s) < 0) { - if (VERBOSE(1)) - fprintf(stderr, "Error opening input file: %s\n", arg); - free(s); - - } else { - image[global.nfiles].filename = s; - global.nfiles++; - if (global.nfiles >= MAX_INPUT_FILES) { - if (VERBOSE(1)) - fprintf(stderr, "Error: Too many input files.\n"); - exit(1); - } - } - - return 0; -} - -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-X width] [-Y height] [-o file.swf] [-r rate] file1.gif [file2.gif ...]\n", name); - printf("\n"); - printf("-r , --rate Set movie framerate (frames per second)\n"); - printf("-o , --output Set name for SWF output file.\n"); - printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); - printf("-l , --loop Set loop count. (default: 0 [=infinite loop])\n"); - printf("-X , --pixel Force movie width to (default: autodetect)\n"); - printf("-Y , --pixel Force movie height to (default: autodetect)\n"); - printf("-v , --verbose Set verbose level (0=quiet, 1=default, 2=debug)\n"); - printf("-C , --cgi For use as CGI- prepend http header, write to stdout\n"); - printf("-V , --version Print version information and exit\n"); - printf("\n"); -} - -int main(int argc, char **argv) -{ - SWF swf; - TAG *t; - - memset(&global, 0x00, sizeof(global)); - - global.framerate = 1.0; - global.verbose = 1; - global.version = 5; - global.loopcount = -1; - - processargs(argc, argv); - - if (global.nfiles <= 0) { - fprintf(stderr, "No gif files found in arguments\n"); - return 1; - } - - if (VERBOSE(2)) - fprintf(stderr, "Processing %i file(s)...\n", global.nfiles); - - if (global.imagecount > 1) // multi-frame GIF? - if (global.framerate == 1.0) // user not specified '-r' option? - global.framerate = 10.0; - - t = MovieStart(&swf, global.framerate, - global.force_width ? global.force_width : global.max_image_width, - global.force_height ? global.force_height : global.max_image_height); - { - int i, j; - for (i = 0; i < global.nfiles; i++) { - if (VERBOSE(3)) - fprintf(stderr, "[%03i] %s\n", i, image[i].filename); - t = MovieAddFrame(&swf, t, image[i].filename, (i * 2) + 1, 0); - for (j = 2; j <= global.imagecount; j++) - t = MovieAddFrame(&swf, t, image[i].filename, (j * 2) - 1, j - 1); - free(image[i].filename); - } - } - - MovieFinish(&swf, t, global.outfile); - - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf b/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf deleted file mode 100644 index 5978542d3f838bf70e08d1137e049a6bb4c2f92c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147702 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

o1q&anp-zCFh+ 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

MNPiigKn7{Co>J_0_F^kFF1Wk76H4P>L@{TV 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

QSyv!jED% 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�iJw#;7b1KLX`6v#z^J@+2dTEZ|of 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℞;4D;%+G87#f%^9QGz}b@Nu$_61Z99X@ zSR3yJ%y?||uz!nXVIIRJ&Ul_);3)QN11x(5XuR9QMyZB0j_+qpUx?_p`W{f@8qzv} zoqN!*#&6|qVB>WFw+U)bX%idu1Q{znOi29kS!;d6waGV1@!*>Q4L95-|8Bcee~Hz-zLLCu11n1Q~f zyDRr#G%0(9hqLSh^tjtQM!mmSmUX#*76wpp-YOcMrqbN?IB zO9LU_!RPz&D#FIC`a24FzQsKQklxy2(Ll)g5)?XU`@LBQ3lwrcCos+RH)eCG5r(|2 zxEmdAIOP2}dkf&G1CjdzVCU3Z9adUb+Jw1VbLEH}H-fcC6;g#ezma{MI*6#UfsMX4 zEOOWkydjQ^w!*50MP9rcf;TMkTX`E6xu0|xtYK`gXI(Zd@;nvU8oUXMyk3fL#pw-< zJYP6$nfVMx-fG_%k|i2>yjU@n#y)xOaDyWcc77qX9{MI8Id;9Sd%O+U8q5A`S2sww zSGwBm&`UpJU8JG@_EL0jOikQopR=gnknSgaev0eOoYB zKj4!0Wo1MD1u!}Mnt%S;-}}#v=?d9++&H|cz+#%_Ez`0cYbYmFXcHlRcXyD|0$$LYb+rY`i zyFL3GIC+iDhP#`=$!{$%fRig4z{ym5lRI~_p_AY0uNyk~t&%(}tGShTfli*mlcOCsemh^;+B}Z%SHuL$RHX&B{ujQTNxpA#JM zm@TZuza698V@(@&bb8AK3Zi`Necvq1h*6GXUi(hR;_HKbpSf~S*+9y@eh7n!b+Q5T zeV(rsGS0_O16C^@LCSGVZHLci7|^YbE-=a=2Umyo5y;%%hEYz#@sm5gX_|REMtKHS z7@92uZXo5^+pR!(#wf>IEA$j5uoX-;jB*NYYskj_ZGlk^Go$N(t!Vk;rn?>`*vy;YJw=Yt*D(_Vn4EVj59%$*H=oL1=_JLKWRdT zw^ZCf%2hM;yT#m5%Ddzn=CguQ9&4gYw0`&zFy(YVm{|5RA^Qky#WOdY@~GK%TzZ8& zk9|+We%GT0&#}>w%CSRpB_G?du>BBWMXV92+&qze*J7WQ=-a1RvI(jD4kdc(d+$s9 zGGJ?sAA!m>dF;c6^`)r;l_LiTdSGvI?Z5RMb|IBx3Bw#i7q%9$0jV5du?jDc%5%BFX8~K5cRn5j=9JmkDhQ|?{uxO|F+w*4 z{sT}s7VP?U=06QouEZ`Ks9Xt|9H?9g6db7hm_L*rfXb8h7i1q`Itd3V*KfjsMUD>! z_+xKeb1F1KJ3(*M9KS}>ueYQKa_W%awS}Gpz@R{k`taE0lAbvum==5hM7Ok z?m*>A$+(78jx%>pt8ngk6ww#_PF)F+7I@{#x3a)1Pr82YcrOJ-0stkVInUHIXCd(4 zT1)Y5CO=QRr<5%dV!5)0IAXc-^PD?s8-L}0j{Lv(loQ$!%d;OJ?W08Ym72oW6fxi= zdq1zUf$m5u27o zOJ60`l7M_l`nkVEZAvCbejn&xx!wzn)Jof2^TE~;tx}CJv>7=zTC#`ijX|20SYn@G6>uS0+h+W{9}VAW z&FKBUtq^|SCIIi(jX$5Q7`{K7joyjP;QfAe$eW=%(}t1Pv)RD?Ni%N0Z-(vn&8Ypp z8MNOwW9D~0%@Rmxra(fo1rnMukkG7wgk}yTGjei?;)ij{5+|IoGmYIOj#^qgK?axM=infeMAX*o9({=8^!kKIL+Cob#k(bd|!? zan2RgI?lOLIXcd{lJz;xxe#dz=e!6*2WXvOYaK{hbRY@pK;B0Of`ATK;-jy={qe|w z&ZVIN=samiG$#}mz?RDdiqPa?QY>G+CJLMoXgm`q6SZE&M`k|n}J>>dQmRnD9*Y;#5OmzXRZMqE9t zOO8@LX_`!0ij)*;F>hUmc}ES#t+`5$!k0%dy10ZpRfY}Sm)Xv;3kEL zNeOt5B>jbXUW95VX;82>RRiXE(y;!?A`SDLB01!FUeW^c zHrq&wiywDbKGm@S?mQl2F;xy>V3p&VbF1*qi_k2sv1RLxCZAD7$K~nkBdAC=M$q#R z2CK5p1in71pJx=!7HJx!gPvy{SYqS^6ZBk$yF@*wX^g1n_i5UWdM?k3>*`w4pd4AO zqn<0(BCa1|=s1IL6Kh!#s-|MnTnHXh6Ai9opC`%GM9Bepj%x~B@aIKnZ3Po7U-Pm6 z(2Gz7igu|~!ij&LkK|(oFX;H^*{4WGnFM&w6fDwb7NHt0S_Bo;a-pCrH@c&sCwJ43 zXpV!fsYD!f&0O3_EA_P6FB-Ly_vQ?FuH!i9I{9-PbSlen(6vZA4!V{Xeej8hBI;uE ztwIuD(ori3aI~tL_h#E1js7;M)zju>tE^F54cX-;SkhXZNozGGtt3p+kLZQQDQT@) zI)qj~39WJxS`iw8iK))hhgcn)2l_1$>d+yx2v!FtmE)kxaEODhJhFv@UQbi(dqvYS zz>a-;gvdsTXB`J!Cw7H{UWBTwXciOD&m|6eK8(Ocigp}yjc4JYCm{kC#XXLLuJrwd zgIs2R*U9vGb5E7Z7?qEV+_q z+T{Y|K^E`m!M25z(Qq#%_r6^*B^_;_N9i-y9( zB_Vaep#`>i`dVCb28Z(nA)9S91Rl|6#0K*6g@#^)Dx9>BXpM3@9=ZZ0;-S|~h(W)C zr&Uui(b)4Is!$SS;-N=b+ZMC0#6zb^e{a}6ipw1jT@gO<(4|w{NRoQm+*Iu420ZlQ zR8Ua_xoR$QD5M}G8L*o;3ogNf1_;63;XKt{E$^P0B-&zmO>1U5R)1O^*j)h~yaqY+8eEy+g!jjQG)!L-TG&W0r! zOI6jnr4>t;S}XC<+9{-DliWLm)y1{EnqrBpX+~;8atf~BShC9@YD5(1=$y7PJh}{Q zc#s`e={*Qm$1SRE#-ec~FcnMxFwbgXB>ka@8^tWuFl}>6X9bu!e#_a(fTSCOEs&ua zfecNBCS4cL{iY!mMODiPP5j-KK+^1sXd5t2_ z+EH3YfTi;!CeYH^)eKy^A-D)69T04mK$@lm(gfD1R4585ffNIrhNlezO=sxvrsOqR zbMP7^z5)Y~p-_XS^GaWUrfaD&Q}O-&5+2?181~_~u<6p3o9ewAB{uf^IK>gT=~{)# zVRS>vVHioNDftWgvkP##pE3d_BbhNaC2x`a6v*kEvJ2#NZrcSpUDNOdL;r@_ST=#3 z&Pk2IPUlsPz)oi+2<&u@B+W<$9%ceNopW`GozDF**y-l2?I4C~9K_I6Sdqg8b#ZQ{ zpH);*1b8e@{LS4E=k#yHISnz+OK6K=3uM@gK!(Nw8G?!dGPoM-bj<;mW$e7>vp`Sh9d3c1 z&O1N?Jv~4UU03vUHmX2R=cQs0rDME&5a{V#d60~jXiYIng2gQf@MKj)o82m)d5nIkGRBUwd&~hXs3O*&w#r#l(jXVMs8$UYj=I8t7bKw}-otRg zQD>YbK%r}Q!fz?6@-Gmy=ct7OXryx)4)7qO96Kby)1eY+4g;jF2?V4rM`=d_zT+^` zk$~@bBnu#Qj;Vk`2VF)M{ASS%!H8xGpm{bpN~pX}H7Q(!tf>T%Tl=?U?>SS-jXc{dJq!{Ylh16CB9S!w?J$_L|Th#f6&BamF z`PSGj0S4(-@xP?0iN}_s-X@p^;EwbS;SxSh7& z#@lI|Ax@{QmyS+bZ(KWVy>RWc^}_13E2=uDW&%~6U5BS#XoIs^MSvD~s3{8f-oa;j z?RX)3>q+Jsour8SiU!4OE;j1&modj5yag6}h zd0X2RVVy^;Kv?I!P=T<{LJEj=PTp;Zb*>fAQ8HR`o@hg?Gmx@?Sm*A$Lag%=T|lh! z5=%g=vls$nUG`64taAhr80#z%2T5p3m65)J*_R8-XHtor73^y#Fng$Gwf5tqS=DPk z(}E@;xlkf%n$@t(ysWx(ZpNbO)J%yA-LmV(g;@`f9!WEmL@(v7P(hH`rTk@pC=zF# z^LirCKP4DBk$x*TRbiTFJn4Dx)|ns?im3{}M387bc1;BIQ-V`&;t+U3n5E@t7D(%y z7zwC#wi~xk1u*bs3c)mIe#nk#zf}n$=i!94&M}9;);TV!dL*p6N>N>@2$9lFT*!!V z{D%fE!f-QHM@N7&2F}n@l8LMDz;rcacja*hhXJZzttD^wP!) z2NIj4qno^|>?$D{($yOzKlM~5cYpRv#?RTLXfVspv>Nxai7I@s%*0iSI4X&v9GgaOcUe%a#mu z5ZUg7lnkN9gQr@HR|PXqdmPFFNSNaRRmXQ44^CRFYGOdO{a@D5ov1RHS-d?!<&QKL zwHK)DS^!4Z?u6g$1?*oSSc^pEb)XtG8crlSA{oJJIb&G-Qn8vBVbJ_m=S5ZSqoLM0 z$*`c-<=i5m)>#2jlr-@g62Dn|L$Jj+RF+Q@u$*L*M7hzPsEnQxa9y>@S)!f=1mZep zX997ZcLAbkZ$ZenxM{i^GY#Le?;E9H|OJVyz@b>7XvZ|l#Q*bxQdI?t36ab1pJT8xH;@ID@=ScJIF z`@T__@bpjY7s=critaHNmO9u!QF$y zRl1_`c*)6#>+EKdCUcemsU0TCtc7(VX(Aus4QffzdgSCqQsuu@8p1S@t8nHnNt~@P zd@a)`Us3SwD8hRPa)fKhb^dm3L9R1Ku7F(UeG$N>LyOX>@mq~?O|V9@rYS6F4Y{t% zD+RkttqaI?o_7r7x+Y-HO-{-Ja-Acqfm}BPBZQ{e-ltAMyFjk9>7@EtLEM@EVHalN z6iG6%LD)YjCzQnkxHBL~+e)7!23175xhvv2cM}llSUidmg`ccn{cOh|O*GxrBn)9G z1?u1-tl!B1svr3afO@8QDjh>3u5%9!;yMRRLR?n?Q)8}M1Y1}wjs}BP@==hKW7S}< z^GC|=ZisoD5ddIa4`2LNjwf{sf>8pGanMxo(o8CNDS{qpTKSkJb@#0x#2FVL$I4?TT;!$ zqNr!sMP`N?hFzDZnMkTo;IONXDWmA;xP4b9(JX8c)siv@F9rn;JKMt*hg}vR9CnTg z0*IaSBmu&&p3E*hHpfQnj_2kKfl zd(qEqU|kr)Ps_v6kt37AVrPX2EOuUv8!UE1a1mIBGO#I$6ai-DaBRTXISCbD?7Z_O zz}PtzF<|V5VDw;U+>{}xy>IDaz08W7Kb8nEcHMnz`0;lE3yht&)C5IDS)OMFfx|4K z_5T(a`~Pq7*egbacK9bec6$Gx!PtrU|9eR6xLwB|x3c-;tb>Kbj@=E7#EvZ&3yIwm z$G|G!f<*$G$5ku;CrIqL90YfLh=0@VDNfiD8;KovJYi)40BYPh&R4pCY+RK>>@T2J8m_>dIr3>bIzAh zkq9Ts=0|iluy26V5`Dn+JH8A9MqRP_9Z>Azwq@MjNEZSTAPFhS0rq31d32SLCvH~q zLPOp_wxW(uk$-_=7oY)jp&;Gc#^{^Cy>gKYm)``3%cU~4f?J2s6Cm;cIYSq5Ak?@Z zu@h_<0qPJGlrJF&l30+=?z=%^hau!WY(9KP6ad~_Smlm_xVj0~g+UYmlmXDhgIt1Y zb{LvhpMoEC6Tl8#4ClqS&f!uXm)dzs7V2cb^8)M!U7;&#ci33Qc;dz#H`qpiN(l6m zaHU8VhlNGB7Lwq~VsZ!aPUX^ZFlw-KO1!vH4Oi%p*zEgGbQ(&vi4h=GbW@P2(TPnX z6M16AwMDXdt5$~zMRqS_g^xf0!i-_#!T2sZ6H7l)t(UBp28H5vSWm;S6Zjin?xj2C zFrA#(gbWyBxGKpP-mEKj7|w!Who8yb!RM6D9Cj1i=b~oFAead*NHIIiCNmS_Cb%Tx z77%4L-eF|iYv!U2Gm*>s*+=OrMQ<)bo^5+SU6LhCNOwLF))=tiDcVu>bS0b3OZOZ~ z{8rpMC6FE=wKr>L9$6va5baSA_2LH0uEy`3_IR} z6Czs|&N(3`B@8=82>B?2y$_-9QTH5XlsN3@4q2Km*J3t@{Ui>%aAT;8E{KD;qCSW1 zBn&%(q4XSGpTlSphF!9Wp2%i#DWr=&B@DY{!yS{VHe6EX!X{zZF=DXRgLDYsEFCTo zbzzh!?1;ON4zrG~&tVve!Y%>tRJp4(~ORRB{A5gk`dfAo5L0o zgB`vI>F9Dawguf|X*-$3V8?DL`1}Cqs`(tIkRa>;t|Rzxt2&1%BnUgSA(V%xsFVk5 zyR;jKM;eksJktxhj?EUYzF?E}A>!H5>ih_Rt7beN;DhA~*r12o>T!Jk92?NK?s1V5NSzAW*Y84AM-t zE8wq@`)D?YL7Gc8SQg!&`=r?qa4(&UUL*iJ?id7{$1xb)bKg%A~QshMUhC&=5} zb#z5496dI?4%>7SycAl6ZQ$dE)nS_`!3x(whtMk1npnR019TJVw1$;%N2OpOlf z#0XBY8UZJ6f%l9 zU;L2kNcK@5!3nGS2))&ou$QP$pxp~iB9Ak?4g*QdbzIg-UJgU*IvvJwK(0&J5QI!x zpC~t`$Y9H%A=kyFz_iGNtE!CqUm@4AQbQhyLQtJ)!eKTiSE9mMwKsCMcx!EL?MTz^{G)uA#b`ISr>8`To*D40^u=JTNo;)nA7lb z@+ct!8EmN|J#gULk@ z2k1J6ew-rC%vx@OI6&8-8;n&6y3Rum0nnu>2k1IM!h0YW@P+qkXC$Yz^<<;2V|7TN z@IGV!3~ga-gjW}SIX)OD02KNj!;%8v<|)$Wz{ zW8+;IG*0Kjt=ul9TwvFEtHHPvyN^#-92#pG?(8HO2t3|%XUB|$c z!4%UT?Z*nOJCkYoaYL-P5G}lErl+VuSuKr7%)%~m$*0&qc z1g11^q`!oaXUaIDr2Ld5*%9mD*1{l|-K0bggIIW5gfS*?JrS!Z?UnovQy4%j0{ix% zy-r%olbuC}9foklko7{APN}>%3`~)Wiu?=gIyEAek_hy=gkyM#uW3T5l*7POgiBBB zd|AI^V5!qVRKSBK659Io61k1!cNifq?7A?6GM(y$!wfd;IyMxL2x5ID<~Z4i!wd#t z!BhAVIV%2PKl&%wbpm;#O;GrR+Ph5%cAd8(P_c?S|BAa#)0YP=(FsS6cW*ua0e2nx zq=^D1;7QgKeRdfF^~}~Vtpc$Ur;hR*o)GLhJU}vWXV`VUP*GXtKf$guGkVDjP8w(~I^jPD5~5&t5lZo;tKlhn&6gZ{`6mnV{N|pa}F1$go$br>9WJYuse2n_?3_6eYxM!LCCcP&>A_667`A z{8wHJc3nw<4klDH|9v*;n-UixGe8CtK%{V@u8Wl(rH=TALc$fZQ%v z>sSQH_=0>!g?3dv$@rC9UAOi|i+a<~%)N2AO&HMJCWUiy+d%8IMM*wDPM(k~^5hrk z#oEwRsZ5;8O|Hk>1nWf~TI2KHAd|XjZj-q=>$ZT_m23TjN%@46L+*qefKOEkZdz+l zwqTNGrzGa=oU?j|yC{3Q;H;CQlhSEMN+`NmIP3o*m|8IF|ApJd+3f-eNN<6x3vNsV zr1%7!Jr2e?d<$qL^wGd<5jr($L9ELNiA|t{BBT>x{XaNE9Dw!z5NzyIlTI@y5JnsT z>pIr^(HbqD=xyPvlaeS%(Rwg}+HH7s^L5rQ0i-tzUtQHr^(RnwTzGY)HNtB4*D$Bm z9PsL9a-}d9Pk$|Vb$ioVC85shZFqG#$71^~q5kr1<76q7Ng$_9$cO5gkojM@T}F&u zAc2lr*yrcxB~KQ%y5>ztYztfcUwJKTb@{OaiIqAX;MBB*tuA@tDhbKpz*dKA zQ!IdC5^!=0S{>_1@X~jj1l-UGt*$FiNSL_D>gvOZaCW&`arQRCOj3#)b8$kGl*Uy@ zbQFm&;$A}Q0{d@S$P-od_==NImvKha73>@5g{~twiz^R+)4Qs@wRU1xSNKZ*A1qzgmk3SBay1n}GgNoxT zWd0Px*^2}c9}7%fehcD5gYi{vfvGcZ!ZW!Armi)UP=s@WssC#M7cg~^dtoo`pK>n? zOZ{I1w1uVquYy!DbL_wJ#=%mjkw{6SeI(22l5wEa(Tpr)9SL$4a)nYif+aAMTTtq3 z)`XKN8%muLWx2Y>$|`}7Y$K`LX*h3mJ0-V()TP*P^Mt&{0#e6t!baskBa5>_ zQKv6>*s2ysjPc+2s&|D^hh0Ptg=Gx>8y~-oqE6MrfAPi2hjypqNrx-wuLLHY$GQG^ zd0k=DaVpglU#R^4VG@i3qmHpH2Zwd0!>Jt$MqRiKtzQ#zF&jqR&T|s*UJFIt^fsZK z*a@R9gz-U)PbiDBVALh=KO~uPVAL_Ng=YR~7bFghI+~G%#4HtmqUj2wj>#3?CeB62 z&yG}3!>HqXIGAzDBB2}*%r=a=aKDpP~McBn>TKZhTAElk#4hVH@mC7@W@Kbg0(OD!8gu0$-5Ly!Qy$UYdeU{A=SR*io zI%NcOrcxYRrSC-Xn8F1^UHnC*`n$^iV+?h^@Wcf}UH%ofz)@SqhPtNJ zN6eBpV@M2j^}DhD!*7G3&VLFGf^{B9{e3v7T7ec#{n54j`}_)o6sPdM-I}6pc^!$w zP?vv)T>*diF8>;wFx2^CC4r&NcMaGW>U^J##!%l`Z3{SSQWivdvQ>zx3Oj+e?D>Y$}OX;y;o<#Pb2^BpV# zKwTRo7PTl_sFtHxRLff|s^u~km2W6heqgRtyRtK*txbz9S{PHURgWlgg>tZ7zvHO=a*rdeIpG^?YUriX{7m=U5$)*vx7*Kwlh zW~gYA86Acc{{V4$AI})k@14U$zpzG%rX^@FYrJUY1mdRad*_hSZ>>?KY1Y8fG;3^W znl-#M%^G2HPP2SW5-bOk1k1Z5!E!B0u>49AET@tL%cCU0awkc!d`S`<<3$pknirc; zRu{yx)dTTtbwE5@@{4CneDQ2aFP<&o#j_>5c(z0r&w2=mC*%I&(Qz8?%Q=~ehLXbUl2raU0n&6yIW zJwuZt)T)**CgOCcA|=gy2a-fgm)TrJLVM%8q$@!S@|raKs$zah9q2c@bxjeSRZqZ4 z=X_J*q)Sx_oOHhb+Tf%cg058I2Uk+t{}oiaEpXBq8PedS8-lGXLp2o}8tcjsq_xa5 zn@bab;>TDw0wdag`5u&6agFzM1$B}}?p$pGjabeZqsHxE)nFhUv{38`vQh!y&+iU;^Z z8Zq*#3e+WK83aeU)cJoCCSA%-FzHgnYFPS84M>o5`CfvgOFDz3OG~(dq-zFgEnWx; zkaTu>0g}$w%L$NlzFtm(q|3YR3`V+nX;iOi4G|HfDg{P5TLH-DpbKr|rzxgMxMEYf zEMBvi%neg=;4>KM>?HytUALe-!w^h6ng;9Yep=W0YZ|6H#*q7e3?p5tS7M|~&$BSn zHNlP-9D2ZJdT3~Ba?nLNK4=b@i0v*g(iw6AxagougScX(D;mwm>Nicr(qOg4q@p^( zV_Ldg9Efzje$*8r-GeVr6&UG!ajy$TI-9??08Nm+iU%WIO7?$&kuJOAf{`wVSzQ7W z5}v- zJ2|uJu|}m;nMJi~&|S6!(=@A2O|xp$G$WxVHA6q;OliE&YF35=tA0taDwhPSi1Y)9 z$)l0~%Ezihh7_v~NicN?gmgxgk_hR%iE9wj&0F0S1xy7d=?t2OavC|HBtp70lZBA3 z38pf>^%_i=LpZV-gmhIv@Q8K~%07y#G+q?>m}EKP%PInxyY={$5@ z0MdChHK0tGH);hyI`3OcfOHx88(_YdaR|TUSdvi%kGgTq5RAY76tg|v3cIT}P?a=O z10CJevo?hE3Lv24a}`&jG6DUpn=~v)I8;^02^1&)g@k#ITe261o0L`nqw}mPfzi!_ z>@z-w36WfY(G87byW)Wf*h?fZx}syu^L!zJ(WQ1IFuLqLFv?*Pse1gbVn47X=B*W- ztTLvfhLbZ1Ly!WSXU;4%f%XNYbOIP%|HkO`lR6W?=&V2duEKZ!8(4Jn&X&_qjhu$Y zavB0pWITPKau!r`AO&J{Uk5C@k`j@O(^vtE&chwQY4oZtVuOi+4h$?hk5vPU&ZA1e zqH_=e;<=95abVFI04NSBx~417*Wlv>`X_xwf}+b?Ys%lx5ivpWeto`wnatAK0^%5Vg9d0L(jc7K9w3==N)+9@2O*3K}l2da1 z#u8o*P9viPM3>`C0;2Q0VgaJ-x3))cnh7@Dj7o4p;}~F=IJoMn*hMr0ViiwfO(?(D zzcGpOY-9nVt6JY^N!42O!Iii6f=GKLc%y0kJt(2;}6=?T9PeR!!# z_~#NPm}8RxMCaA91VopkR05()kNCd;L|4)w;&8guL~PDTKgDnEBPY#GOgh6zApZb} zE`zEBL{~zaxmE(A%l0K8IuB?I5M94@@fuAvM&j8NMU~fRCiWWrth`1M;5E`10uNm# zTLKPUif_=+^|LLECK_2ZiAB-R%3Z`LHc05|J)DKdjQ~QI8fz-HS!CqJZ>%Gg+{#(p zrCVtzbiSKkK%q-30_7YY$F1s1Z{+vx{|tn#S}}OE5(r(1sT@T$siQA$A+HtK47**3 zAiSz^0YcaE(nb!m!b@a50tlVYoCqLvo^M@%&@~NTBzP<}BehAz3LJC}odyS;w+;mk zIv<3PIOwWfh`{-T#6g!snsLx&mnWMwA(O62$xY3*dMHwzaprG@Z5-8}L{tFaz)|Eg(X9z=A6m;GL5-8|=97Ld?^P*j# zptCM{3DzBBN;)GGdLTEEqlgLcV^u^O-72MNRzXd($`ZIYFRu`Udf;j~F;wxpmxAWv zzq_|8mmX!+ED2V%!so3L;@K)7o(;c%L6^oM6m;29fr8Fqkx{9gYr=npKbPVHz#L&nx+8w80H_H@G#;a1GD|)@sA*X$y`u{% zoB}L&qvex~5FLT~rt*JrslE#`m!Jq=~iWNa0G+H$M5w1oVl8>=oG=(1_>?V`Rqz zdoJw_~;;-te?xAkP`Y3@GPN zsC0XScy0(rC{0uOHisRFcrJDI9}v$O%}OAibIc>ebDrf1@ti|BL7sD)1bHq+l!)gt z*bw5mqS^;udATS6&shZm@LUcpfp^ZU0~_yL1`a`y;gQ)10G-1lhfslc&Vj}i@0`DI z3cPbxxWGH-Jsg2|E)^y4&NZ2)P3cP<7ir3shGzn1TP`TQ#wuY=zcgJ)vCW^M$49fO z*Y-6nXi`rjg{D~z%M{D1ODAD0s?Nbw=b%dVTii@41~{o&!H04wP{d58PVN(noWcU6 z^Amyb&RItw2%9Mb;aNGUjb*N8Ii6mr2;t8_)zYDeAVG1|YCuqcr=t-6=vkollwer| z+_@|*(9U^>h+8Li9NU+Z9@CtuAcL3NZ&fbHAFv4RTz2#yz|PrSRP7Q2og$<3D;GM& zHaT!y$cS(*5XZpJ64fBkvBq53Dc-SI1a1p%vCc<)jt_yHzAJDVt7?(#90lVoqrEQv zDrH2BuOxcNL)@h?^pNAJ3z;IhbS)P$I>@_WimYd2p79-YbdlFpju+g=_)D2i#{XXS zGTwLSCZD%*Z4mwB48xUQHa&~`PWCDe z9X;Y*0n-3_WA{=>LO$t~4!vL`VNq5a%YzT8*i;%BK2}ednY$8S3DcSQ-pcO8^M>Oc zZg>^(&XNJAhZT&nMMbOu_=%HOMKfG<>U@PX*@Kt+Ry9~esE;!iH3n3U#TK7wue*2Mg_76O1>pDZmu$CUuIRJaQGg`iP);gY{%&(9U^wiowFq zMmy(iMT2&32u27^vz-q>9AZegpq;CHPwI~~BwbgMq?zPcmK4?!&o2h<+`>PXh2;3P z;m&2nu5jl(^#Gq-eLKKU9>j7Y#-N)HErEdhEo3(_oxS4fY`9 zdCoKh#O{u8hpqP+|aJR}qF~Oygew6a`C>-S93bEF`p7LT{VOM5aM-r`XV-C>IoScPOSt zbk&fa!5soaV%m3h>lhRo9h|Z;AsdEbM=UTRT1W+V#_p^pH|iYHzANq;jRqV{$|e9o zB+au^WzXVA)V=afb(2f(chS~`9EDcJpR%_H5y z9vdFg9g1QMU)(83tiV6Sm06;8#`_Q$y0L3(0W*T{aJbEguKbeM z#L)fSgyG>Wen5w@?K{VGW}skky%4T01o8tR>QH~_N)zH&+7w{pV#QB-$HgZI&OkM% zi?H~5JcVuIQbG=7DuPS*L=jKmZ0RCwSfx}2PaYN&BZ0SY-2to zS_tJZfe+o+OB$puu!WV|$Q=M7zAt2f$p{}w0ALcgGB6v=x;v1r4y0;*+&oc0R1H~3 zJF04quvE9e8^=(9F9^I&s+vtpS6q^@WPB!O@)}RvN2;6vh7k2Cg@`aqjC9#0Eb2`z zzz(cHTof;bXJRFoMPTt@B&u5B1}?QKU~=|BT=~RRD)bgrrA)c0QuJT64;^S`hw;RO zAq4P6``!fc!k$5pVWcfptyrUpUU98-Co!Xq(B-T)ufiqAcoG88MMk(uij3f+EJio= zkXpq`QPk^A}Rxwz;Vnzcd$09#yS(4gcP+foSfdg+cpxfi_3wlbL@ zA>aVS?18xGO{j(>F%Lq;Y^GjOfNTt}^u%RKsst{2lA^FzYD99}J_m1yTlnz(w+fq4 zjSGWEPUvm83CRZ+lX@`}r@|vw%r+i*+?v^Z-eN%2#mDmCXff52(1cP(j!8E;u}X0F zq>Id$Iy*(h($r1`1kyOk;?0o>V_dL{i+o|m3ZapmC8n;pKpeMCDkI`*Ex}3G#FD`) z2FFN7+<8lPXh8%Hrh)+;r|PWKnc)G6(T~816(gIEfGemjr*B2KP`w|!&YzKdq zjiUp^StT+$gz`q}6DBAy6Z8pJ3$4gL2{_BTZh_ps(5)XLrDmkcAShiUMYUE73Jc>t ziQdy);;K#_Z>mpKxbqmA=o3M3DMq%J3dA)c6eo%4Mc3>pPPUYow9q=zqnIF)2xjsZ zcBLzsm0ihRB&!mjR#0T5loe5dL@@d%m;%u)atTyiJ1DGO2gxh+iol@ss$duW1%_T- zw>q(+eE~1vk6W{~tZXUOdR^v|y+?hjPi!Z}S1&B2eH7bC&5O7~O?8Swl;{)!3rQL% z9YusjKZ1wkYB8E6pP1(Ax-}wI2}$FtRE0*mN)MGb=qz!5MW=k=6S`J575OePHVo;+ z=9gFI8KYttNR6`lH42jb$6QB#YV<_GQK+7-ZbOxgEkBi@mzcwJ`)ntj6;S)q0T2(7 zQ{whpL|z|^a2f-IvS%x+URZD^_5cBp23DR>6y^MI%`buIkuK=gL(+w#6)WMPGSmzb7cH8yqL?=7(tb!Ja7IJgQ{s>MFz&=v zu(%jd7h!v>@q*<4K@?UXGr2??k1K{o_?5(&c=R?O`=79!%}V>?Y^reck7 zF0khyMu*@~HOzRTflH{GvC@!2EB6hyd>yrliHTB2?xV&!_rVNHos3jr*-wh?O-U2` zn+81hW{2yfL$ePF4tzX}NmI45EC+I>5gtW8E@H4r1zsY=2vGrAcF_ynGWD`4)dT^N z<@lt8h{h-3kQ#24xp2DB)r4q@6FzV|!^qE@b z7Jnp%3#mFEtTK!gD!8(>#q1^oLB1(`1F=$@8*3jaGpjC&V>Xg!=otwue8Wi17F1S= z)^S@bbLd8LXqs=3#Jz8_YUQRe9J>Xe1m#XPud*PkIo5J%cqv&0YB7Sa5!EU-f+DhX z5E@@#r)xje-IoS0o#$o2E>*(ZwojwiLM7fJ*41_E$#bI`El7#{C?_M63mwBQLZ39W zR2-*K4mYLHsinpK;i<2BY$dT>}Zf|&#pMs1<3L?41TwT}A6+j&>EyAo9U31Da zfCt?vO3_S$yP^n3SA=6MLJ|6C9iy4qnBtyyNF(Yuaa_QJpdgvalu;3uy(KyX8$2q6 zqkcqSAEabn$RmV$R37gqGH+y$u~9N5pp`U%#ZthB-AI)xllK++*E6`ZY6+QYQk;UP z2zFK`VZx9yY2g|p=Pg<~!;d_Xcle>ll3k4oYeiw!3Nn*MnyLW5JXAI>;mzy1xge~I ztsmr+w0KhLgsOz@l}m<%cMJ&+iRlF@*0H|g0$WP{XtzO1q;$#aI16W;oDz4%3V0md zUmhWTVp$3JywKQoqHdbkNpk4ghn6ZrIcj_`bBB1s8m%S z=VIo#!$7SQR1sIO2tPNu?WAt3rrjTxK@b@g5g8Fht7f(Thaf>ftLTL{%@5QI1>3HY zALq@?aBdt0!QKGEDfycyqk^M|FbH1Qg$|Yu3x(o93aW>)5W6Hh8(Ve51;fG(MuW$i zPOzC3v&%Kza5^NO7-^`TLWvMYjbx53h$|u8gF=JDdAk-JrfdZlOndWgo`-O1Yd%N9 z5*5+Y1SAxpxrOp4Z>+{;Gi+^Si!?)Fb2T(H1QSlQFt`W2lqNn}P^uj`3!t6!#e)d@ zy)m2d@^%UlvKS9_e=+4z5*{2WH$pv-Ghuwd^1ifA7HzQQ)r?yM zk-00Xmr6i)u(RcZ9Y;U(NETq*`|(n%fn7lO7I5n@%>5W2#Y6DHHYzgo2oAvxIlxJx zS<_%f@(0Lbgh9fKkj=0Y`0;prTvk*K}<}0Qg8()>f z(2S04r`mzV1&BALten4lV$&;5L?ZD_A=)-37I6RQ@Qx@8GAx}yZX(30WBs!K#WQ-BTcnrhKe zYMpJ-dWz-<+C}G`6AI-*S1RU-fUk~J>!t#*{eu}_7h?M>;Zz~cxxk8nh`t9vbD}qD z0px7OO1sFAXoiBgZiWZFvl)|l(N>rbT;DXrrdKJ23y24;oRCc*>Z>3@%N6nzwKE}x zmd-VWb78N^3j+DkM-nn6CJqaiA2|7%<;FwPM``| zyPGT?8ltg=eQ6^cyFomKSUf63G1ih!`2u&yYKY}i4Y^wlu{S7x(`$8>jb_Ob$Yp3N z#7M{95T{UBh+3%$={!k1UdIxasW4KULM)tY3A33?OY96Tg;WYCL_>J9l^}Neodd#* zQe>uB9MOoNl$=L|SlXeCCuKy)H7V1;v=b_Phn8!|FFcX>1aRI@uy>*>Dw9(MSZ7|e z#sl(^AH`^j9OOIdO5cSe?>MK;RNhZ|9bE$S@88iS(n7nHIHZRdz0Y)|DlVkn6I zvvBnJREz}-b8S%d!8>j#B_4K=DMKL`dTmi}wrJc^EMWX?u}M`ac2iqM=uC_VUrR(Z z>@vpfVoFFP9W*GsL^;->`a~XIbK3LbX^w}wi{sfc(&hr}B%O~#ir7%7;0IjL0OKb>bP;PyXv3ao%zg=id4ji&QZ7~D8+6dXy5iQ@ECCoCjdoVmi9 z6hj{Ypo3dX1R?=8tFS*5(;4)RP!76@>c%#?b=r-Jsxxp{n}_xirSXTA;LLd0|L=_HG>AEtS=jvi57u$kqmM}z)-fRti#aW+nVdX)X0k9J znsmOd5fcQjtsqv0I72CYDkRQ9N=etpCe3L|nDT0CSeRIpAE z&d>IAYl$u*d!dfw< z#`G13VN=ooMmADPp1=fMQoP(s;iHp&^v0v7dGw)2BuM(bF9=@d(GQQ_=FuOIKISn1 zkM!M2l}1ub1b;*D5ClI%fPmmI&q6%YK2j&VHv(W&0?$SQY)#_Xh=6Pc&%UNUk`ViS zh9G1#0wA{lgOLz91D;J6kT8-)ba~A4cs2rK0>`rv81poqjleJ*o{hjrJn?Mg!G;N* zjlkHZ!?TeO`3#S{GIU?Cnnc~!dy)+cDrG)w z3gX%H75fNyHho1>h-cGRe5t^*=_>{%o=soz)d|l=c;wu8Hqs-f!m|+{`w4h9@?p6M z?=$jY!xYa(J}lYrY~;hr3eQG9j8!}v`LKtNXCoi-c03#Tu$aQLkq^lmo{fB1+Tz*B zhm9!=2O}RosNmVihuud!8~L!H#kK>_`LO=Pvyl(WSUel~a5xChMn0^I@oeP7 zhfO>i`LJ;d-!bwbvB$HK58JMIHuBMqJP1ZWI>Z5jk&sSlfM7(VlNcZv8L_291S2F3 zMi7jYxZ;!uMoe0B!Ksa$_yc<)7(wZP0|=I+@M;h&NfA>(up~vk180YL%DX)fR={G( zj<`ZBb|I1#ZfMGotnfoa5VBgmK`a4>)f)s8j7dv)L=zA!;So+iup~n~0l|_30R;ou zY8DX%1glwu6cDUt5mRWeTUr#MgG{J}7tw=kXeiVW8PQOvC9J+^1rj(G` zip+G@fJ#{oAp#8kR@W*eWVYfn{XGShvU)1QjE5Ch>0=>ytjOviLXC$NTRlXu@vx$+ zhX^;g63w(O0*;3jVd;|`)ojTuf{uq3W$Akw@mSUofycv&wDb{-cq~1O;NxLMTRI#K z9xL9`k$j?9dKMvw5+ki=5rjOfs7v3EsFWqM2t@e1eyfy_*^0gNfrm;NJ=1!cC`M*V zTtKlRFpYPj7$2kIO%x-urwB-d536LRqj|(*eBM)pB>F;Ycxaq^Skaia+KFQHOef}u zV#zGRl7|(OJw;r?9SEjo5try>iEc{-CJ!qRdm`mQ%~m9)jeSs{ZBt6<*$U2{A~t!z zvW7>!XzMix=5zGGw&#p(s6!k}2Tz{nzs)eDR)P~hiULX0d>Fvbl< z>e((OWVRwa?RU~dVwVy!TS4CwPzBtX7GdpUqp*h`BX%dSa#PRZZvlgYdj_{pGvJejvlAt{Gb+W|wmss%1+2fgblCl(d$NBlR_t=ymZNVJtoujD3MK00+gEdM{$JkpY5d9S-A`{eFZPw& zgi~c^yt#k!^z7lwwk+|yUOrjLaq|N`>(9#8d0=?u^;cthOiEO?mwS;};dzR-{E()3 z>x2C=rx<>8;JLG}8ho62sdvtt&3_2Vl>0%VmKB;MofkGDqwl3pkLGw)e8Z#dKFdem ze)lnIMOfR2d`%k1eE&R=dx_Pr9$sti)$4Qr$7iy5oN1M{$vL+i%vohZra^qb7dUu|^ zxaGOBasNtrHn>e%lXrZL4Tav-dUf?kg=N219+PTrSgISbhvt8b9Qk+1iR*br%vib8 z`_gwo7iXufobE-bk&6#`)asSe{b6+34LA18d2_H+gFfS1v@6r2L^_{bb$1TT_vP(7 z564#>v(tO@SLw60{dQH&Yik1Aj(=9H;h)1-%zs{eBsq8=g#zsoJLR$z^?(U+(*&Qy;g*Lkdj3d-c`vI%$t3Niw)_o<#5F z$39p*B}-7nA2NGB{PxLgOR->7(d`FQcWXNI{El8% zSDgOXHdDE~pN_h>W6`e4uUkdlNHQ%Z-@{>Pj?8>~qS(6QllyzE{kW?2#;g(VbHvV{ z4q@2bV!JWlk#^svGDWg7r)%dmd*+TbcTyipS)f=J&waz^j_4;MqS94##y^taF*H3@=B-y%|cfC8$-1jhL zwF$}gfBpH%B}F$C`Zeh7;}%}NY5w;8qwLV9p4s14_-o(NjU|t-+L>x)g;q&g4UhOe z-;W=6g>5-p+N(|SJd0+f95B56!SflLyFH%w`@q?)UpyFEs6^{}d0K~@PyLBcp|p#7 z_O94;$;qsvGEV!=V@vFsi#_jE^!a7bP`_#e^6tx=`$^Uac{PJitvfe$H@%O;| zeUklJAocrg`3h%9RLs3#g;PGuZXEX?S0c1mhAU^L)}1uG)QGiTwoO^<<)5v_ep=Ue zS@WlLBE5!GF5>y!q%&>upUU#<_1lA=rQEjRLak{NH`Ok`EB3=Cza6RPf1T#jd3|p6 zDc$&9nH$I21<$(^en0J;N_T=X{t+2dKUdR2*L?OD9@#C)`j4rO%{?*s^XaFOh8Oa# zad+jDpTBFiywRLrS3NH^v39Zz;S;KVow?ldV|(6p)T zHm1EyH|%&yzMp#?KFIq~#*^2344*FE07?3be# zeA?8zl5^9y!{E0<#A)yJJrpC}Uerr#ycm&-fe8Fsdo z&nJi9eLbRC<~_bY`>*&UPr!>rFLGu6vfqf3cdk52|8Ql+kx$%>0acBI<;evO~x9P!h%3h$PU%ae1)sgg(B#*XQ+V@2$w;6-f*Jxb-3 z`}?xR8{K?RdgF>InF7AJ6I{;y^6Im}p$le)MK!s5^-BKpsdIeSf5d^_JFWz*N!tJI z_!7?_9ewpx(iR(jKl;^E3w zQq4JW{`Tc5K3iY)nm+VQ(fX-M^=aAa-J1%-Cp_;^CdIUOT|RvBeL3F?-CFlt_EUxo z0pqV{-jcpxjmI~a&25@L*DbdmK8yZ*m9a{7FYoq0R6AQH(}X(dyEbWf(r?u7sVn=X zs-5Rjsn*Y%PwD<(T%sonf4n%b`|DlZ>MvPW;NhQl7c8Cs3A_{Bf-_r*91UczWV*y({N0dVNHPoLtZ=a6)#YrEYG9`y3; z%CK|0^G*1zdEKB#HBz5CJbd)d<)innEj{JEWA}BZJiAZnx!aKd(OyP z8$)kSSevdwi*b2(b{#)za-}3Citir#ea2#=0)FYgx_Gu!`KPoE-I62t{8x268gwf* zI3jfLUL3crxBv1NyG->xGHF8NMamiy=Xmw*0-XTUN`pvTD?TJmJNw=HAjX@P~%achAlF)yYZ|Gu?lDD&ph3 z;_uUruU2nBuPzOak18>6|Mpc23y)p)Xv9RH3GJR#OXa)qQqjeOA9d)T?Z)n)R*Nr0 zPRU!SL%!C5Q{I(2zv7d%XJG0Ebk!bM5w#k?D@Si#PXrt4~>uh*Cz$eYt4K4R<&ix`u+sOf=Mx{SDx=y=e z#s025xlESR2dfu9S?00NfH!&CUAud2ntzp@YfEp)x%@hi=@;ynpPA(hnc|ES@~=>G&*fpMSFT*}`AKP6t-*z2|<_`j=+? z==SnPi(bPE?RwKOO{HVcdylUBcef>}%3t?NJa&NRg2I7m>fitJm$Wbzi3&dw=(|=v*=Hy5((Id8Xg;7g1T-9vD*K&xw)ErHDmW&J}#S??K1! z2V8!7)qVTG6Z3}mP1EZ}?oD2l+F517+w>J4*RNQsPyZLQmUpky zpzGD}Ne6$QKK*^iC0)j!@(F2vG3a`SbI1Rz8t9*A^7(507VMe7^!()!CtKJ07}+Dy z!q2bv`)2>?bPZQ{Zu~B7hiMNQ)y_5fTy)Jk^9EfkerrC zfBQOkP1bSgM&5ZjJbU!dyEk4xUcczZYZ1#+wy)cH`^gjUf9|*QbN^1Cg*88YchI#3 zo38IoHE(>icNe;TyLw2jPG40Sb7J$y#-$t1NxJ=1r(z>go?n|dbU=rz*H-7b>N_Fv z_AwbVzVPjwby(V-{s*r=9yTlUl^2T}uCF<*a+!6B_FtUppJG^#X5}B`^ec5}#nr9* z_y19%O1i(69QgU_Bln!;f-meoROJUTE9e`6)B?JUaZB%L^_=1=Z}(>9ZsE7iAw;BD|s32cN5p`jnhfc=?Ke z^qV)|Df;N=Y~>52+?+?_Km_THvlPTh$AD zS0w-8UTw3c`8hhz%IGJhFQiztuF2F|Nv^FscszaKTaT7s@0#m)=VobIJwJPN=!Z1r z+~23}H~0SdfTahktt;JN$k2xsL${QAGdXK{_ij~uFT5UbaZ%)-cfYPaw#2FPcb=xa zAHF4e(d%mMtM9FIs@&7;Exyb5zW%(i2j0EDHDONj;!W2~30Z%lV2)e(Rb_KOS|P-j$AhzMEFfwwXEKlO?3-T%w916=`J&BH{Wve>3N@RQ>ty; zzWDE?ec!jMxwhQ>rw_*LxKb=SpvK-W@@9N+Hc$}&HVRN*-+mr>w&y=y_zK%l5;@$vB$zcE*{coVX-AycUSp(f9`t??;NX> zuj9Q>ze{>^*RPv)1>Bo-;qk~LDR!6r>v7*70ul{sUAAn;)PvJzOf~7(gMGaNKL7r5 zJ@-b3Qk9 z-H*Lo>preThHVY@W!>_&?YXFJbsMd(nR#r(;h7sQD!95ygMd**m%fjF{_V0)o4$9e z6XbEKt55cWtz6)v45&L*~>l}F`@m^KYrgZ^1y`op0D2Am{2G(Lw=7s$;U5R>5*Y) z*Rhpq?5dM5w&&}<;SC==U)ytay>exWY-)Grc#XxS57zqX>a|+W?<||!DLi&_hhrm- zHCsCS{`ub=@(k!7Xs{H)4d#2Q1o*Qzc z`10lF+BMC3uf(FL3M)Q*nSW{PTZ{jg*t>1yjIp2o_*tvi%~=}Ho0C7^+Og}lR0^0p zdeW2!9eQLL{ORR1XFGWv4XyF%v0d{nelg(Hwg>a}@93TG;vL^7ZQcxuiO9G3)2$wL zN-p{F+g+_^KgvJx$@{Y&tqZLx64WVMhZVb0H2ovG$DY%(hObPY{I7CnKOX7(BkMq@mU6X((rx$zem3Kwa(d@ z^NRZn4hybR&FlKi4u|(1O*v~z>z{sn*|@LgnxP@>_m;joxVgkPBH7!hAm&r zUH$F)o(2AxK6F*k(^^v}t;p{&pk1P9k1yA(NWcE;q1iiD^2_J`Xv*la+qTU2t$1xg z->c6a7vG+*?54OsQT}khL%$^78?t3@`ptJ9m3AvWwdPNEXVplbC@e5)X!R;j zR!vQEF0}gePZzYg^8LqlosyI+GvnQWph6E9w)A<|q2$s@=Vn)U(6`gYd4E5do!2+l z#4`)r8&@gYsmPgO2Zk2y_N-Rz6k}HPUG!%^?=|h`zMk{hk6r^WotfMq!{XiVbENZ} zI%e0~s6TrDU|^G^%CN>sP*C!>OLSE+Vt`p~{ta*X*aHf^%Xu{(AYPgS{l)EA*+ z%1xNRp+?%uUo`usQ1aGUh9vE|CNxpKqz@XGO#FUduFJ#s&MbNGx5!TuPp@`lX7WW} z4_baAajBl)_8;^jN4>$hoAj%%BJO(CS%9EALzsHnDzz zk(Z;}Cfhsgr*`>voLj%FQRlwN=ZvhrHrP9`V%qOAtx9ue(}BZ(o|qLnBs6nH_c1lf z?9BV(@VauXCms0e%QX+aoON`9TaPamubI-V{*8LsO3vuz{p^>b1*h!jaH~hA)Q{8t z*wpWOx6k+AoLr;fjtT+yj^)jB@QEqK3n(}JJ zh~D#kuI`(9`*D-afA{D&=2pPTWS@O=q{k0m^=y-DZPv)K^@~=2wQcQ;nlF1~7+NPy z=&nhD_Xlp?_uDt!d|PGTF(uKR2krrl`#%|zyV``CEk;xc8&GUXg@PZ;?915g`kl7> zYgByRzDvG{b}I&CJ=mb4-_SuP4<0Rh#4pW^^y^#In;uiUS{I`S;y1P zS(~i%V!|$f}m+qWoUjH%+=Vm(ZHLXEF+njyM zS6_Bzeg2%S&;Gf3$l`CdjyxFn&3Cu+Pf9$pc%e5>$G;e|<5X;W_xWAgrz)`O%-6n2 z0}FV}p8qaK)XL0rTDOVKQg-lw3gt4-FZ9i$c@G0VuY9A@uwToo7&idT)}?@%epT zvEBJUTah#+pBb)mg~;+nX|`S|F&YGTB`!?4cl^X^xp?xJ+1!nVexN@l)hc#QGr8G z&Na=|y2-t~ZKC`#t!S2YPudkVqlWi>)Nk31Z=XFH)pUT{(LHOch0b~vvoZ7Efmzx& zoPF+>1{JbL<@zdb)m+bp9!>sg@DHhr9-kgq^RKJH2U_f$Ihhjv`}D4z zIq%!1k=-jD-1NuqwMXXOd2`jQG0_i}oow~~+usV_X)riC`@>{w({AmyWk!?UbBau9 z|I%;Sv8BC_CVSVZ^{+cJ+^f80R~W{UlP@+b_rB*>ztonZJ;v5wd2rX$)TvVRoc~4U(}#ORWazxSd7FO8 zrhYx}`r|@2^_&zK^Zm{Szt=xEsMxR^ySFtS(K1VTzYjwOq`#Z_ zi*L_YzFA>y_SAV(*IBS=*4P35uSa^!pVMPOqleK~yS12Jx$edv$LI2z`*CgEXOFM? z7u&qEe*b-$f7&$n>7(Vj-Ajf|Zc;JyV&e6uO22;Czq0p-UvjrUR(Ms1fdh^oFE{<0 zJPQZ*Y4UXM{_3qK1x(sD!SlyQ+qQa!&Q9~Nc}@4v{EEIxR3iAqxSQ>l?4Q|m#FK3G zfBkjbcjZg&xnHjF#)erNC(AUiX!58FH8-UDt@6iu1^VnsaqIfDmV3%iYvbGht4S47 zc_&@}vR1h+rza%qHF8h=XIoZhI#OfExmdq+WozbW`d#v}_3w^r+23FlW)-FD5cJ18V6D3{N_I9<*8BWwc)qCRoQJJ?tn!Ch*Q`rYGt#&>7JWG!s znx3dqIBA=;$341?Onc{T-Yvrm-r4pIHTlHb%z_ZJT`rf?zb-#Wep6zh^v+1{ix#l!FdpUcRZuLV} zMC^awV0^MhBiem(Ib-^6x;n*otXp6M|Y}q@M5EgP0P15_z^xB`+J=chwp9 zH_3KwxV|gdz#MLu_N0m(w!Y1zZx(Iz+E;wL?-8VH{udt2sMP*YvW2nZfBNi?G`lkI zycbjWo7ppyJ#kC9<3)GIG1@EBpwb@G2UnbwbXfITrDjwgIN<57@e4*pRz21;Pjtcl!?tu-S+jJf zN!}wuJ#+t_CUDENR*f#Cd)1_A+Ppin-Pu|ueXUkuvoqwoQtN_ON4HWQQw}d)7reC9 zl^0XKT^f9S(U6`go{f0l{@c@yTUDu+%Rj7R7D{k`> zXD^!j@AsR3`}Omw8S5A5d#Ky`HH)JBhWxo=+s>llXM*13x>ROV-AjQ*LOXQK_x^p; zfFHj3b9CpuN6Rms6}a)tkt4xh)yVj9b(%&E1JediN&G%}h6&Glu9`9IVV0?0-%mMz ztkCk#TW=4af3#rv?KM4y4ovJf-uK6YeLlQj8CAZ<$=dz}>xAc7vU~5rq!9%Y-}DpWHal-v71YnQ5(Z z)I7B2@56J-q`CX^{bt1m=DpYW$%kcr)oxxNRKCR2x4D~jn_Fm5&kEy87YjU6KX`Yp z>FILcYmutf3_Udp*`Cpdyg-Bb=SyA7uYhQrlDc8*+?ZCgdpNxc&< z*!=yt^c_Nn9P^&m>br}NQhr_K-qqb3eqL9)_b*MC4=o+hG4sZ+$Ay*2r_TSn|y)g^gY(aKMb%)NW2!WTK~^&ee6qF(kyzpe<(+_L1-vR`f- zvGZi;q=~V=`SjdBZF7S(8P^@XIU#%PT%UHV|5N^IUxavFPg=2MWZUQKqc$Yo<}r44 zhDYni9p03-^02wverjL+@n>&JZ|>M}X@jowPDQOx+_7f6>kD5utoc02@#S;ZWSnx! zx7cqlXI#z`RyxzxWdWB)58Cs;03Sf$zv&y8y0ZXz3j6b0K=M-I+j&vp2fI05nrfEi zMwWpCpboB*Fhor5AWf-}rql5T10?_|5z!F16d9b2MfUcg_TknOiSc?3{!_kf18&ZR zAEM$88bK@PqqVe8+n=Wg^#A>P@n>{+} zk}ul!kuA*ehU?w~7lO?cS~st}Ft!d|o%|41YgRs2xNw$u2yJXgWLfzmM@}*w2RHdw zxk8qG1P#iq*fP|gD}ol$+M}fIC=06iW6V10t~|I@NdSb6eJqf&8cgl0o?(3VA`}2M z#wwi8K3g|ccIXm5O97q2V)W&O@1km@sb8jxBJ;-bu%yb03glg4*(RLHBnbo(j?K5b){)n#uS_HefNQ}m+Zewn%a2rc)-pYC)a#l*f7P}$P`;eQf$ka}z|hy*G_a>_nyg0_g`ATLA@{K0B| z5LFy~-8411wVs;Vuj9CV;ZHro9UF%w9n?IOgZQMz5n<*yAX_(vn-vCC@+!+uvqWQdnRy$Oax23tx3u;HkmS)z zq>@D@gv#AB<#4RCs@;|ki6j3nIw|BwpedudE+zb+7oo+yPpXWoBEF+X6VwmoJqS#xFf(VQ@^PaDmD} zm|qv&h7+Qao1t@=F{&mEK4j}nl$h4c6o3MzK7=cIfTp4j@1-Z1;|eEid$3;E zjtbAA5sFj1cJb4u1uys)DhT8zq;iST=)pDkvfQ4fBAN3CLz#MBbs=U@e?G3Co1fQ| z?;eTF{~|(%e8GVEs|$?4WF^Lv1w~h*OscCVrhy0ng0zgT6J8+sw)SXr9yM(-wA@+5 zdco%1`^%&zMr=*ri5%4P(jx}_hHxb|SVmC+7a0Lgp8h6_Ok`rH^zWB;IPWoA|JbM? z)-SuhV@&!oAhTvybK+Mg3C3&(eU8EIh&yQ-_mT z?5*=nVE_%+BoHS3m+h4fwBjmNilk>b!tU}jKKzKNGI8rzjNvEZ$rx{}*HCPaF+87` z!*JeJeq-i7MEg(uoP{~?Y9mrw%e;~40%nvz>s7`78V)qKx#1EHQuC3r_`dgJjKcKF zx0LEWj6W2@dF(d*oTH%W2TE#L=J?W(l*?9qvG+Q)^zN)%>oMpzFA69;bwqwLCZiaj@VF6-CVA+vJx}h2b6lrL z3TUJ}-oi*Z=>73Lm!S?EzdGKKqS*d6#dky7@N-)sO-m`5hDle;=`u1+x}d~dd#U?o z3C7@uolSje@s!_uK`tVIkKnpmlYP?vPf-nN z;x?Wv~*~so^5VGCs%Cqp#7a8#hk1EFj4H7%$x{zI})of+#NCoJWRM-L;&1 zvj3#SKzmbGp28}xx}F($NkH|+bk1ONzK_#&&lSMTh^xsVAi4tVgLGtM{c>%b3wya( zpUgC>KSn>h;3$79JimJW1J1(7Dg;Rb!z6B$ODQAYD@=S??FD8?wJBCg>l`A7)nb?k zu+F1%PTTHHvq?DGjw8U-Ij*F>BZrnk=T%7DRDAxXloR}&T}1Gz=C}4vXk1FOdPxuF!^nlDeLBJyL^A)T$cr4V95P z`cECY@11C{8)MK;3es4MOu_^1=NNOXE?1Jiv&(6%-k+ITdp7X{lt09iW;|u13U&`E zrWZ48v3);bb|BnTn{xwn^(7pl?h;#F1dgd`f1gpQ7wRXm}d+gRUsk^muXL7sIZxqLLJt|xU-EuC!TQRQD~h-DHXznO>;@923e z(U&6*H%F^wk?lzYM|i68S$y=BmRmB3SM|Lup-EwuMzKmIyFhW=aME0mmLHcRikQPG zh}5ymnhTYMdi>SlEO6j`5s9693xgsN4O#sV-ypHcK(ub+5AD2>{teq%^1IoI<)YM< z)@!pxt1}eGyEIdzn77Ou9`6b0hHe#_!apDd$qA9Ogu~9{zgHlvyo&Xta`8Aoiz;x^ zdJ6r5im&#Z32V?*ZBTFy0s8yrhH+(>(vYn6Q6M0Y)3}>1B8yd@J^bmcSK~?m_BYnC zmozKLtq=m6IMa*uCgQcXFmw){?ZIjPg#(Y-zd0g81hd)l0)CxSUnkHO@V@B@4*cV3b?+ zrs|*>_&&d^RCD?!LN$&SFCB|8OkKcPiA#m?`}M~j%OFi{4;|0&kO`3n9(u%*K7i&? zd|*C2r1)69w{)P!FIQYKUwdb!`a1;NvXV0WwUl1+EJYfk9;AzyB|>>~42PCa3q_Ad zB){2@;+{sMV_hm@jyx&Php{x^Y?pY<+_HK-)#WA@SCA#xLM^w2tH-2Gt)vB+Ss`F* zBc>WQ{b-{vt})$a8tXAL#Ttg~g%*@1sgMqW*E{{#1tebPHq3W?B4Fr~J%4$>c&NYu`7*8u+n_dUi z8QtU5zu_BBC~*8?xf7X!jsckZFV?U0U|kmGpkECR0@}G*VtuF{Ul*-`*5~(oewx=g z)E`>#8|r|QZ+nj3x9EIIa#`z}`5U6*(v`Ks5{y4t#=EL<^Kb-DOrc`W(J#-ewfN{o zT~n+zpL^oa$Oi=%Ku%?a1usKw({^xao&>*AMT(G#YR!HOZ(l2&7}hPxU>dlM=*^V^4@Nk>D@mUz=oDfDuB>Vr zCY5je!*9{@Z14pB2I&p&5@Ywxz=MyJ5bmu>?RhnVy@}9evKNW9onK|)f7g<3&VS}W zXFyO(cMUuNPdD^S?N>QCfLgx^uR5D|`V79@ACL7#S1&cj%PI1>Lk{r>%b%J=Z7OFR z)KM+=89Mmo&V!;K_-(01XkxD>|j1qiy}M?DbpmsfV|EKqMT!%l8GZAwtASm z(_RUnFl(w=yg(d3zM4Gvq(vXhw{NbDk+%y!|E$xsp<-ZolCWRu^+(c=X6bOYVzHe&;VE8=lNYA6|N>Z`P{jjd=T)o zwo2CFeoq36TM=mF>q_dD^U`*bn=jI&|7^0}0|?Uk2QwWtV*MD`BoA73hIE6l;8wk# z?016JecvSxI;*S!EqT&U6)arP3v-aoJcrwhak70)Ek~?^LqsAfb)^0ht<->aJdqcb zbEnX_aAU^^&H?gVRV~2)Ftm0VQ2u@L&%@Ygq9I`ceIC|b5vi?Ce@v0c2l1n_o;K!; zI@_4I=g%;2Us}9W-h%CevI>i_x|W8!?(Z{2&!k4hL3|QBpQoM1%P5p3 zWgwI_UJ~TLAksqMBJiVX92qWqfy~m9#Q>|o84hqw;%$?!g4E$*Dt|Py>1R)n%#6`! z{KcI&y}m6u(4*eE4U~Nf1P)QgZECSsP&P14XLKpD*LV$J1_dSmG|2R45H93o;z9^g zF-#4zS}$BO{l=p3=5aF166&x2kYs4 zPd|wAz8#3ai!LW@ZD5`E;7!AhCdMaj#FpL^Fy@pnK&RY^h_x9&zHC3{k4}jWNWH{;~kLq5mji z8k-f4yH$m0*22j6Ge#kUf1F<#GQjJ_8sr*KMqu7CNa#uNGDqBVe!VOR6=8J1`Tuyk z_AS-Y00Op8NoZ7xT4l{_DIMhR-d(u&cI=ZA*LK-9+ycd6OEEkCFH(ZC!UAjr%98<^ zVw`iLR=C9?l*426r$9>EZOig_6Y7nPl@i|&$LxH)&PH9GOnB!nIxhNV6!0G24I=~` zPr+>DP)q9<20E7oE$rhP?B%+pf)qr5sVa53uILTu#jdzS77zxsP{NyaY#rxuv;WYN zyX}a|7^Bs2iM% znvfG97b@X&AF5K^pC~7~!HXLO>m_?QxJ32;1VTYs9|bFsXd)uB%qu@`;c^Qc`J#?o zn~@b5MXOu?bYHCzDJSI%Lu@+PIt+SyMJ-TKK;J{E_vyZ3h=ZI0}Y#iKWU+{Y(a z1*Qz*Y#Pps&5vXT%K)uLMP2#dM&AA{i$C`>-LV9gQkt#qiwU{;*mA!6o4Y8OSX=Z? z{vv%3sqFSNFd;TzREg{@BxGs?-;GU=ip zIXE)$$9&s#+z~0`4!Cma_`tDGytKy$YEtsD{Y%}}C9xmE*VmB$1Qi*!_%Ut4kBJJ7 zfWqa@>HQh(o2EOd7k1kw>pWU;oo#se{aO%*Ui(P;-1J+ik8P7O9m&A6)+aA2wQQ=@ zDb=G}IYnKAH2KM{40`-tm{2~sVAE12TKZjJDR=1%51r^KBBq|^ulv_h7RU8E3~mvd zQUuPfO4*d#+hy=+nc!eW+E#|(^U}Q`z0>*59K4&hRq)c4r=*y1V>yA*cge_UG*EMi zB-vC)xhb?`ST*U**&wj@;=?NSg*4*iIF^4L{`CCAY!3H7Ntuikm$y#R)Hg?+$5^rr zi;l`qi8hOkO0(Kik8g+))c9Hz2T&z|W_Eeo=C)25h$U94;)| zIY`i}iW1Tv@o{)e!40oU^*GLF|3mY|AXx2b$?9L}%6XKjhY3Y|fZA&@`(sb^dRn4O z;LADr4#c*xxPq$KDW4HPq=+7%#lf!O?nuP#H|GP?3PHw>9FO?!7vFie#7cG=K9tQ* z3}@Y1O>oY#!<<#X02K=|?U^_nt|xAY^f@Tu6W#ok*;DQ?Mju(CF1RS3Dnd$?@s$M} zXmGobI9FK-6~xNhIjF6kJ~*8k>^E10U8NUgQ^p;LnQWb3;ZTRw0lfzPM4PvT9CLh@ ze4R{G38H^++k7mxT|dw@D2`g-{qp1uQfhpFSu|bRFa|}W1*QEA&mRdvDS-bAFZ*tR zPAPa(>pmm{C=5#e9w>fYeKHv0m||Im{BH+~?BA8dx*;ovePym+VUqRGnHrikc0ZSS zK4GWv0-vSnTia}$icz6{U#H@a+ehtKy%+R+WHrgO*-WdOZ|SPohHkVC^3l=qEUK1q zCf|poHNzMNN}#kmF-9cT4MSge!0--YIsOSxK~87Fo8Q%yiuePO#aJtDWRddJiA|vu z2BG`j13JlE-g_N4YxTlon7Nzz-IXJSN$!iG5&L+({7KLSnSoysIN>gWK8{9Q6c0P@^RL)A?+V7{J=y3!^J) zZQIPB;=?fmvG>g0tD$%b`2JyI#S}kVsB;3|gO~1$-bUit>8U!%gT{Db!OfbKYT(t) zbqUQ`6dfYD?NYBccdsMrZbMv9RqaNt*)1!^h``6I58-aogqUvRq!{Je2%^QnWB=1m zM*>gMgG)mJGyXrPh927aB^u7~Ewl1v0TM?AS4VmkrG=yoQe^>55>I29d1Z-^cG=M( zF6$Obu%4Cwgvld4wsk_SqkQL_eIOU$eqB9FL<3;tn86M+G1@8n|0dpyr^P-nYVYp5 z#T6P~p^#dX?Sa7Bc8~7Cxh^nf!#V%8BP3sOJCobmwxl@zzWbw~(1sXp9slx`HR-1l zU9lZB2I$F1COWK_l=7uaI>RZ3wc`=_k|<77?gpEV^4M**Inno^1IxbK96Q;6C~wb2_b#c?@qT<<$-i|kRKQKWg{Lj@DDAO7 zu+*8Lf~PNXEt{-XUfs~TDdYzvZlS1h{l(dJqXQmlNZ>XE^6jMJckKBG-2Q;c;U z0ZwaS8QX6%L4UkA-8uMqX@9eo15iZol5Xj;@Oa;io=f)>HsO$os{2yGxoHYx#3As) zX56XV9M#3@uJN{G4?V$w{GISapHV5T;WzF1uK-x=+eX<<;&iT#zmW&8wNhbL?KNck zRkvw%9Fm+^H}cRI_7WmVP+?u7131d&HX>}#<-hJs!IM==!DHl;TJj3qG26nbrlOLlibh30>>T0 z7rr(pFy5^c?sFqJ*07Pe78yA?+eJ^-XYyk3U$}o*EeXiR8TklkBBB@E|1ylXJ>Cn? zw&=Yc^2I*1x1zrk?#b1e^O>kwpN3!Hvwe7w2uV>}kBeFVY6qr`ja!QRol9#Pa#$VkU58PvH^&N2nnF#kV23 zM7uHI)PccN-Wz)0xITh9GpLIoJ+5s=y ztW4xT7{6_M1)59lrgQTijt8#!2srZTiXluT5N%z}72EHNf8l*8em77g2^^?v*_;jK zq`n)Frg6kkK7#GpLYDLOk&fYrjZ63k#IBQYaMZMQH`M--9KxG=^U9_lNS_6k~^k^;d}pE_yIC^a6S7w3vMkx@5ZH9;Yi*#v0fR#Z{?CmIc!MLRM*u(-(F5|L*%O zic+N&JzA1*5z7oM%xgFftp-wbOHA8W&3%}G=mly2T!ZPWRQO32U3%}92Wjw(d%LwdfQkOIbWHzS>{K-uK&Y--*kyl!hf zEU;%i7g7|Oz!>Qhc_3N4p?f%RrG zL)E(IC-?;m?rS&U9}WHfASF{P202F>Mp?QbLd0xD<6E&b^XAX=AS}ylXMJcS`g)3M;8eJ>RSCSsLil(v#vM2X)tHm7wU)(KjeYK5@#e|M zEMPZcHo_9bu{LNZxU7w+pHA_7IM}fMv}Jsi*JCJAaaRM|zY$}3qc~Fdg-l3_0q3oO zY%oF(ToO+!@nHT)CKj8Qg|$am05fFaGSWOTqIPn(b+ufHJFG&`SS@s8A*_30Byy;+ zrZ>#cXsBm%26gMvwgB=sWmMhUeGPOY_yn^ARMg#is;JlbeN))Z;x;#Q*XFW;J*EU9 zT8lnm&+%vha&~D{!o|NMPMA&Dn;83*eSv<7l}ttP|B6&Tg!;xYamJe30aQ$G*GycZ zgu8r}f{L=ka|qcZa(A*Gb5|5qO~AR!mQGtZ4|rGU;c`zu_AJ%ma-(7x@d1BS;_`n8 z8%_tPqXyKOOYg%sO9$5`6j;ZmDcxNoX&~Q$sLdvrSsAKXkD_&6?1B>c(kZhp)vAM4 zAH>#|?+p4>VHO@~(FOe^BddDF$P=R$eIfZylY%4D+o>Q*L2;$ z@>t5638$6iGUj5}Xi~?*TkD%~Rq-mT*H*Lc~wDhKW=D7{(m~moo zz8TmS2To2;IfQZjzMQa?L8_LG+`69TG*cutU|VQL{*Q3TwO$l^SVzo1A#m#4}I(>z#Iv?o20}oiF1<$I`mQVV6q$+aGjpIv0Nw9rajj%rL*4 zdqCC^xt9c)i%O#S-<`p#K*1~JInVP&B&w6iuhv^{eJd5Kf4!B;h?^NueT7`C zkTVO*KGF=e556zC^YdG3%5RXK^d@+t)N{Uc6$Fq}X-~gr9ytDGWFCGbz!XlRjp(>h z_3uaJJi)E)nmd$CCLuG2iO@Kq?3G=UYr0`~mHkiU7Z=}OiY__y6*cz9hrZv!uGBZs z>wz4R%^DP61V1e22IHSFYLc-~9MU;-=WRsX;jDqqmi&uYK2`-YHFgqkWiCr1qt_C$ z<{qLiPTeoyOW|BTnvS1D)c%n3_fVQ*iuAPJLltN~AWdIL50A+dyp}!^4;>c1Zp@OW z<0*5@wYqU#aB9c~UfTPbzhqJy1duh3c&3s%;0%Dy9 zj+&G7;sPlWA98xA9Hy+w<%X-Xz^(!o_8zdYUiy~$P+@AYqFEl@drGjH$bDQS-Zw~+ zrj7z?c^gIVFbMz522x-6we?0_>&?){cP}$`R~J_u!m74mSD8}FeOyXOMijs0T(ukg zf(i*IuEX@o`crL~E!l0pM~Jv4E^1%uVZXg!6}3qNa8*S`*=(wj+}W-Mibp zIHgt>ywrj|N3eMV;f!vB_+3?f9~GVU&Ogm#@q)ZX(6*1`tMM6svaonb#idcKN_{hO z({Ios4)g04d(D+tX}AT4(QrMF=XOCDz0!0D9F5hjjUd`)q-(;K$AAZj|Kc7}5T}n8 ze>ig9`a9)2575*%7zY*`;V-TkR^lQ>Y?*xJE+F$|NRBUPD}B!1r2o`*vHTAIA55%P zQwl|&zildjR_)v&9@J|wQN5wsItziLS~x@Sc1)b;Hfa%Y<8~t2E)I^;ew=3STp|j> zF|vyp>asvm%j}iPT}r}wO2T|7VZHWGbl5HAVe*Md}-FNM(AA^elW-B#n~<9 z8s5ca5HV7K^SAV{aD6wM-j!927K~8(Bmxzh=$avl$zQpG{4GxCcb~AiY1vMf#LkqH zaFo)+0G7?PJ2ih1+`7cr-~!{O>!v-bo_F!w6o@c}B3GfXeht4Q#t8Fx`5|a(;>LVr z#>0GMF%8g!4&{`cT^fEQa0wai-*_ThMiOw*@djPzCrTGe#F!qFsMZT3r!kf}-<{~r zjOE^314-KvsnvwVjm6bI>qH3Ju^b##zgJqGg^ z11L-L}z}rx`>pOz(yiiZD%t8w$elF!5g73VKFw{7pzye*0-wP@2-$E8` zmFUE8>tihYUj3GU5uF}52vO4B1L`#SsSsv;i3bK%oHE1W>AJY5FNI?%aw{B zLgkhm5XpGJrnWEs*=tPqUsQrVnzef&Aif{Fk6q-z@lF;ANTo~Aqv;6B>twZP{3--F zgXUq^U9Es+A8NVVFAS~=fg`8>ooXZknGGUo0$BTMWS5~eDm+03a{J8s$Z~@X+Z;}d zvfH^R2J_0u`d}IiW`l~|Mgf@nSy`61$9()21Q5(tIae@}mw3%cJ^z&TItqY3R*$!g z&0b)x$_e?*%vlk34T4-*UEg0gkzoz!>opVJM^bHTi0+R6(_9uR=g|BwYqkCAPul=_ z0teT5U$eTS_(G-78h!jh>hn?|k+@o9=5^N0_Ib8l_2yZ_%f18q=S{%4SX0$wlD-yR zOpcG6`{qY{*`sHVP>DpD)f^SK?bP(_-+7@@sUti5u^~OntEs&qYl9>noYe`c9f~wP zQa7crkxe>;)46O{B)&az<@GOI3xYgGw-}r}lAVf@B;a>I4)j^UH?y2Yr2Sxc%*UeS zg}H;vpr?VA#uXodXA5vYcLzO_egU@4`)BTiDo|JtXX>D1uy1I_OTlD+g}=PRI|Fp` zl3lP#pmOo_@H|l=I}^xGgUnXMo(8G9O;;|G3qlj*UJ^0XpCSXrX0al6BV>P@X(ea( znw(IUQVcZm#Hv@O0$|q(=kOq8L4ddL?7r(Y!}F)T#-{c53g#pxQMlN}_JbO>*#hJC z$m-&cm3+1=)5|Hl&+NX;P!7{d>|-u=YQ74RvuwsKGg3*$W)Qpniy&JU*LK{DK4ifv z$uk9&2l;12Q`{JK5!ri;%X1#pk)7Hvsmk0IuIwzqq)@>1(R5D3%e%7U6E^9NdZO8} zCwh6=LOB-673RjZ0WZ}Dl0+li)dfq$OfdW}7k~grH5V#G-rv z!e>%c%U>FlhV-=H=K>ln42hQyr?)!A3TAmGYBr`cn|@7-5y2+@eHte&DIEPKn2h0X zM@fhoIgDFaGMtSOME1?wfCTguh)6~a{hjhpF%_bpN_%XLQwFbg`ErQEK!UOAX%dMMuD6taYJ3uT z%+pr|2e{FYWvFpFNHq<+EvuEK6yOI4JO*rJ%(a^Is)JF?9yc8P$|@YiCtLqY*+I*8>W# z#33Cufg})dJEm>FGDKsfjbOfmP~h$HR8uw3Sorji8z zer}`jHmI`l+Can9Mx_y+kOmkZMDNLJtWy&*1z^0bn=z*gl$CyaK(mLwTgK9jaKq8TTR+eZeFiX$^PVu zcvy!#pra^c@?vugC+Ob+{3}LA$&@A3<(V|hF43PW9dex8Qoax7d7(Fp-|guAo5M3A zqYg%it#PsCA(As^(}^Je8gN3fuk2?>wx=K+6qW^|NTokgsYM8!AUWB^Ikz}_T=r|g zU2q|W#y-_zzkT1!aYHo2wF~(m3>W86H=C)iXqewRcFaB0 z-|VzRd@`tvoX1y@T^u4Q7;*q9R2)I4Wvfy=KZ2RNZ&XU~qNjzweYJYapC%AW)yunp z^Jn9aM9j?Fi|H_O}|yP71kB{%SI6jf<@ymyR_)njL+XEh)tsrxY>yL#RXh? zkO3y5#<4HArggIT+B8fIOIp#^JC>C&vph5?xlh*^!l93nUMKII9wb){dFs#Ay!?Nj zWpK^~|10jUG@h!`mZ9*%c*D{g@1Cw#)E1k7eX9MqY?_N=mz0G4Vc3*%RCIj#AY=9j zn-ajK^l+1J+K49rL+>;C)?Wxj66woJdDb0KxhtfETvei(herK<_l9C(695C1f)@!j^!8ho6pXU$d6jXn(ekP+YAd#GA#67NKJ%3;Mr(#S%+qqb@e0pB)al1sf=^Pp)*^|sEly1{(At`@ zD#oBzsx|bqgqhXg@Rh(zMKS(X@1D)VRWbpYs1wq@6nv!=&CW0F#J5waqCPOT7jt{t zEPu{I5(Q@qkeavF*G^P%uP$Vyxb+5G<6p=N)Y3za&uLLvj&1Z!)0^>Lox7ZdWnI;5*-`QZl#(cKT_&( zmA3;7oDSPDn}sF0=_NQ{fB$q7QBjSz6mz^;Mp)eRP4{f_T@j5$awaozU=RGWzaYk= zd%S8B@R|On<#H*GD)H(Z{>p{tcp&Ohu74)E&NrWzR}jo27Elg1R}7*WDCuAs1v!OK!W|P5U!O*0?7h00C$Mju$_QZ_ z9ELlBE-Ggb@L*3sXZ-_)Av$var)*XEZEertbytNYxYTiRLY zR+*E5b58n7jEXrTc~@B3o3I>SddJD&M?twZmYsJN61@2-=KwVCop_pNhwhzmd&)66 z;jym!o)aVKxW08z^GFWvO7|kX*MN>85I`%z-(wmgi0N+l*uh%fhw|bI?w)E_)C$Df z2q9J^$7Kdioi9d-_O?Or>oUL%Jx!BhnCbff5DJqG2{Q6r8Bd-4qm~ZX(-nqa7dlZr zO!}VFnyLwqHH9IG(qQWhM+XZ#k1BklYyAhoB~6f(-lrot$6dXPY5?#mX>aClg~$p$ zT2&bYQ8vu9Qz#FSRtRc4kF?Wcl%i;$c|uDaFSms@4F{@7+SK1g<*0_{t;w7#IZ$Zi z-=p&%D9wT5~5#ioQl!qTOHpp#qr<0nf7C z7Rl{!Vf9-QLa%Q6e_;os4+NHX{=;@nYSa?NomVt zBGb#$oVPN&d-I^^QZNa#y&gGtLf)qS5>Qtz``hFdtD{!xlAi|Ju(q?Jk7Z@H?Jwt~ z{SIy_(xk$FxxhJ1FDDqqE`0pXImOODz9aIi2gbU17et{367t+lij#v5Ll-{PNnI@u z0nAKXGh7t<2h?#M>eNX3{21rqXQnpkQ~R-`gYrH>@z!Gko#T z)*Gf8*orHVEOB1U-Hw0}i}}vBh$ZvXB9juCSQnP}b;Hrr+OPsCYM*UG$B6~HPDt2j z;or?+c_cHLuTV@2VcjzNnM=kw8(cLlMivilAABMi(}&HRg3xw^slnb(|90Lb` zuDiOTHW8^SUhYoj`*!hmxcVR+Yuh`H>}EmPw|5sO{&CSJ;0K(^6pEx+>eBFhFJ?KY zbDHU~#)%`TB@~eaE4%5RuWL}&aVgSs@oNcwtLTA#J+4n6BKTw2?3PNbEGNC0nuVnY zk*6lRbd2c&m{ox2wL3ixg4LsLu|qPm*4G=B z@{H!2v3gojiq+oQdPm|AZlhA^B#a@EDEwZRPvjD}gbyA31+1Ek!z2O}22tfZ51o`& z@J{<#uDUbb2wQqC_|#4m8@OV|y+4(W1#g{UFqqj6=(zr5m_T3C!%78t#pccFZIrS+?#1( zR__D*e)lvt?j_YXxJx05;(B|>LKd`;!=QsUYcUk*naW#$O>7p*?}Yafha9*;<+Q|vW{7a z5iIXWh(T;HbF>;NfljRk>ki?Y;+Ff&9lrWmEDT(r{P81yJgW=F-#9VU;v<%Wk1Zo= zSJ*n|YD)JH(L7Suon@Ld@)1^zjO2T*k%EmaQ*-Ag+sY+`20GvIDjwVh9Sz1a5_Kv| zTVZn-gCQZU^Nc^n=3ahwCCH&x%d<7F?dPzg=6{i0y-))6ZLuE7){moi1=ya#PW2%4 zSp&OgkUf>!66rhorBlJ;7Bq^ud%UCz{uDA(cTP8is$ckG7d+(lrri+wdj-H+tr3IE z8olr1Onngok4lz0(732tzFsitNp-EDegeZT+ zo=Ex@AjG$TUun=~fbJ!&N>Do$Btvmiz=Nnq;z)e_ax`F2I$7G-D>Pe>v-7P<1s zZjzu_vN-`}?6&wznH&0PSU%Owv&o#mfqi%sa?gLp0ii1_p~&^2Frj>CfKKGK834T@ zIF}3Ou{J|ukWtn|1hCrt&OeK}OO8RuQhUwm zt{8Oc{FPLQ?JQa@h#i`al#rc)tY5tr@|cpg*cfHrQv7Ee%m!o2p3-XF# z@Pj}o+cxY@kXhX(s>J{GgOKnCJM_P_hD8P%rQ(#l5oRvQ4`~H=%EWAbCym#K)&{J< zLjbu~z+m8k>}?r4ZD5OdQkfV*K^UJA1MY66*ZXNantXfwc?<9qA&vc_2U!X(nDsq* zPg&RUsR$UPU*NVcvaDUu(@7rbTd+Ip41iw6!^~m^?7_Z}DV9kjYk$z?{uX0$PcaEH z^hc>w_mW7ze|)-*0N*9gLmPPqL{shc<4o_5!n;#iTtD^+G$7nwkr`sF+k^Wf`jgA< zw~8;0R5w4D7>9kQ{2J(rb3Iob=J2F-qdmD(V%&0G&pq5rfRO~xoF{px8OaiEjJ>4i ztEwK(^$f~kGxFs(fgbJ(N|I_#1xtgvhcPe*IZ?%*J_!|nB2D1bNq`PMDuJEJTY=7# zPUkT*dywi=pcy5eK(wtf=Ey0LzSZY`2g7b@M@fq`WJV#QV8RqxWx<~ys%)6feZp~~ zb$zvQ_VbQ_z=v@>j3L>~1mTCi_J8^g6F(_;uyyu=8jOoi*js@XT5qF#w@xk$V!My_ zd>DA2c}t>rM}YzjG3NYW_{WyM&%2p?314t9!Ijy4WNsqq@0YX9xT$V|81p%--{e{;A$bQa_UAwa`#G~7gB(Pdb%Fn$C& z=#CvnxLtq@!F({EHfOpEQ<*+fmff8Yj5QH-ET8uBvmDxxM6#aKJ7xmvQkSpyCo_3B z^;(#!(0Dd@%YV*?g4^!;O5*%Ek8~;xJcZs_@x&l*IvEU48{%32u2|_j0+v9R6ms$6 zktVz0m}|0DZ7!$P(@n}Q9Tp6k`T)+fa3VI{yl&IF0Ft7r?HCciMcSR~Mc$-lIj33# zXAIVs=t|=2?43iCFify!+qP}nwr$(CZNF{Xwr$(CZM*L`^B3-B7L&`0s9MyjBJ0U> zEYg?8T11(33Wv8$(?H}yuHtWNoosl@=p#&2d)7ht8Zpr0Yw3e=*jZ=~MM|1FVKJrL zqrIe*N8pxXZ+=jFltTY1#A5dg6uJVxxZ{%0QZP=@t&TNcF6+tyM?kKFHw-ea<|0X@ zTgh<7zV4IfU+s!c8ijIVxv!(Cya#;NPM`UKcg5)xL7zWiaGTNie_*UBKMw8U<~k%z zNjxRNs@G+^BCp(NX@iSru`i~(c+|`}W=bula7&vH_@*!+=}Xq}Q*SkU@8L|mzf?np z+r=sF1Qb(Sfn7;3Z;@skV%x-Ws|iNSjE3y4A9y-mDT0=$=js!4l3(cFgp$A99XvXH zIivvTtU2@wHIC=MCBz! zvAjcFrGJdnY;TbamW6c4N&!9E&)+*Zxw}CCB+o1w-$ZFrucC6jQs1~ACu@Rj(s5X9 z`ET-ts3^YPGXW|x?^)(xbu|_RZ{y@8HM6LBEzvgqZ`v-wV3Df<2tN4=EcS#3kl_1=R(dqZqcT0 z%FXSn5}_W8O^v-+OT_wdU>=DRxkSPv`j+2Xq--Ac=eBgr+I5a*IP_Vb9t25UeG4Db z{-dW9=sxtZ(@;%|zEl89n1>5o2Fbg`p5G=}*QImdxFreAVjQJXChIda3Xi^h4WAT0 zX&apKaHvvV{~dBe9_y6|yO;~dHn!npF-u*cmPq#PKg`&%IVr*mHHVjK*cI8&{bl1U zL#x2XgWzjp9G-Y?M0JBgwd)h4@FBH?_=*diWVWd2zgIIXu{TFyGove~s%8Rqp@^ns z&2ELTxzh!m3&E{aRSSWy3EN`#kxW#Hm4$0O@4ih7Zg+gDyk^_A&U& zG4xqrU4g}KYV9YHlOw)P;0%T61DfG2xhJyZm4eo-w~C+T+m2J<#hWdU#U{}ISs8F@ zoP*_(Xv~h0JV7fj&oYEb*tUs6ePIk1Ho&!U&H^J(=#_GA0^j{TFuBnz(K*uAGJ(_5 zG_?$H9v?BRdFeHvoLi7i@P7zr?E+x`wghP%E}jGBmVLpt6Rq0PE>rd z?w|rielNyYDa9B8$L28MOmL3&HK;&Se>Q2B$_cvI!vF$FO9tJ9WTCrD{D&_dxQwV% zN*-wGIlbS|=72r|_nnTemgoWE7d;}hUogSEb1CyKZjsc6rfZC|8cLxs+JG55rCsXN zf6IWa<}B82iDB%&Ae*rM(VP|+I{1tw4RJ$pU$<5}u=E&f@H2exyH^JiW~X5~d-7cVHvw z%_v~4^pJzJ#p(r;Jbh2{UKsWkbH0(DkDTUo*ky18)(}qTLP^tnC%}Xq24}%DwWS@{ zdy6_oAX2q+Cx@l}xPtgTBK5nN`5zQ)+6MdjjqFfHKLa3gu_V0gZ`1*z<#gXavJE=w zj1)&9vp3*n*MYGELDc?PFQb`rpQ6{Hj#|Y}@On>8*>H|YVdA-Y9l9fz-(tVEM=v2{ zwSH}f8j>&uS|sE=xZVgL&_j<kMSCMLjT1EF>u`{BEh}a@rj69*>;{ch~T&@)Nj{ zDLgia_l{uCW%9#aV#(70fkJHQ*F}MCW)-e>)khB)RoOe-@6L(lX(XQ+5E>>32{HDr zsNz4NDl@;w@qXCvbG_9HZpKO-Bfua#LmnDJ)l?uG1Yu1wZ z;A6*qmQp`8N3MvaKZHK$8cK606Ui;g9##6~2snM$WI;xhCBLJA-)~VJ3L6@28mmVh zai_Po6xy1OJH+N?RL5kAQ65;L!^s=;s<&I-OQ5F$IkbHKTDZt@05AKb7P_dCed@6= zibw5PRxz~1yE;?^3Ix>i1|m4yhdIZjkB(}Rz>}Uveqnk+oz3&h!MD+c4YTrmiY$sm zE~66aCg%IFb3$DSiwu{+0Z`ITH<>e`CT6mAn0u2!@|T}9u-Q54;CkX4>0s2=%rbV< zrb=2_+%XAECRFoL&-DH>I!=L20DHMUXmu<#BzyvsY^U&HoR71UXhDKj?P-m3C=8o?Y8uG(vryAs0+0)YD{1>*K>-J2)Stfoix@L( z?W3YWYN#CpPH3Lcgy5Iiq>W=%RleQRChCll2Fvm@-&aj44YM-MfKrjimhJ=wDjzOM8ce_H2>!z9WwQd(b_ z6)lvJR9@qC#f91YYe{`qL7OUq7IG^8$h~T4 zu!IdS2)I9fEB2qWMdni(`i01qSI}l|n>3Pj#JFX`*vV|=g`kG4m#E2Qj9U)U(1?B) zu+@?obG(~A5Z@iyowk1@BI`BkrRdB)&e~ee6;aun6FxlHqEGOj&xZb`4`u{LNUbRb zkjwr>Ks|fMoCO=?qYTkxki=5Bqm1tc)Kx6w2f zNnfdh=`kKjgR8XEAfM*58sXkoRaY=VGQ8_D1O%Dm_G>Fr3&>JG0(@&j5{@|5m#-j4 zWe2`PW6Wd`RTM!HD3_0Q-C|N55d8NuUz&QH1M=jSArob2)QLTmBo-vT4J35X#79I_ zFeBIMsK0&XlfUv#&ug?B%@Yt3c&!X`-Ju@%&XXYd3KCD*l;|{1#mq742!ZAxC$RGm zw{U^SxP2zmsMZVmFcOE`cQ98KTHBKXqf;a6AV54UMux#ySsSxnT$m#` zu6qUPsZl;jH94}f0p0V^dT`26^Y-9oPsj6;xQEHD1+Q%`U`)SBdg-?;otdJ}^l~g=C78p@SQ0tM{{;@b|$fGV36!H`L-e*Xs5Xb(%HGE+_%2u zaOO2<4+M>o$ANwpG9i8=KKyU`NpKlvgk}E|GqU^y!K^G)Ydq8v+?wN>uS$FZ8HF|# z{#<4x$UWvZ0jmI*qrf*_osIfX*>Mq_&5H=jUR3}7a+GeFU2TywyfhKLl~tX9{Zm0PlpH0DB_9S2xy%YyoGJ0<;0KrfbpDA?CI=Ep0# z1lNpbfx1t3wp$j%$(!IivtK3$&iKi@k2#UO1p=9*$EcXkbtozmwRDf&moRm?OY`x2 zWL(*Kj$37qKm8R&nRyGza)H+I3moGT=+U`E&8O#hXa5+v=cGq8nB2#VzjTgha+zFj z4*iyUQ6in>uBT~9H`ieu*F7n3jqSQ>8aN3}bf+|GdIR6y8<@35%N za&A6Ip5%v-0*ZEIPaN2`q+HX+kU8oR;(B*pA5E2_wdP~aYqN>X5Y2C2tz4_K zSM3nQa@--CUSOnbab13@_|(&w;-y;L?$AhHisRrgK!<_Spdr55KM}DHU8&fM5W9^9+sR;d{4&sk>hdkBR$5 zW@^141c^&+ZfC?!PWqx8T8tjSO_{NY{uXK5vqfHg=@b?W%X;m|!Y%?)P4$ zVy#be&GoCg^Snuupy95sUh4B^L6hm zD0y!m^6Bk~rau@^Du7N&pB~~|<+~&g0I|FUJ=z_CYB4L+C@{nL3Tg#Ngk9X(h1Bkm zkrsLl3XdK1;qsKGvBF1SM;<_0>q|=NK_0j%_Y}rXcKWrgL$P+H3%S2>v+OOzG7}kh8J-!KqcVrNc_uuN_?830&3dV6&NMZLa z97LL>{xNy?)`PA4eVC7Gjg8&3^bMCZ6yiZf)l9!Q6G)bA^OG*)FZ0|D{^IBqXUNjC%DEJ=JD91d0kJIS`QQVIj|t?9NDlcWB?c5$q}t|BPB8{{6(gv^vK z>Y$r?8CH>t;W0l`Cd(*yX!PwqG#8dqS2F7*QUN-E&%|=*WHd8YA-DR>3@i~(i!qdU z@6fI>#U#+=&hJrp>sp_hh)qG|4;mH2@|T&T&XmbxE@|m}l_>DUzFV(MZ9r9y(12ho zN+MQ~F40%X$fu!=$*ZYZN@mmVJkISn_Dt2P%|W__wpzQkqx5FNjdC@dijy9sv{Ug^ zjUpdB+5DOU6*eKNqrAF3dlb5+^5vN+$}iM0mywh#n?_)8$1+IE!|aRqPc7SDs^+mhr9XK{|9#B5-xD~y5>YRxLjHeUcZSJ0EUnte$~1Bj(N zWZvM12hF$5^!cl?Fa%-G{@v~SrH5I=Q#%f~FmIKX+W_^!_~ey7G>Z!H?HxTKi$*$c zJC%wTL-@h<`&8`+h(I>;ZnPDt_J+sJZD{Pesa`bVJ9awcvuW{Nj!KRZ}hO5*8x(`CBgtOe?QP8PI1 ziPjKr`QD;)z4sxmZ24Y4FwOlfS`!6oyJ~t%G*&1N6J41`W}kF%zeB0l^5MJdBC8bj zmZ70{LukJQNB~~RN&Uw>1!Vo(Uky$xDEM6tgL*|x%OKS@1In*N#zxT*x9q%`B&cun zPZq%4%b`nTER$fC7o>P#aW`b_XcuL9zfcm*p9yl#+pQ~`XV|uQbMmUQahO&5v5t?ufi0fYlDHiI4Ih_fr0dM7qSt_icZ-Mas4nSM-m` zgrad(%X>8_M|nUD<|#JCr^hGOAz5=A$IoyV#|W8jnKMZ*sB>RfR>_gUF_a@jCQh_1 zZzbKe6Zn*+nBQfSlTajW^h(Q3)8kt`;s$E}c{lLr9!SRJUu(;#V1U)6B#A+IKSvFj zDA!{pr_v+!Y%r)5T-%Ft>_Ch0@QT-9>?OqTF_BYmD-=ZUye(HiUA$<;>NWYH>7YrY zf8r_Kq44rngAo_%pDvHbdR`AtDjj1*o1Xg>u1kxN9Q7s2n0Js~Dif)Y1=DN^{g{fn zYPkcR&iEw^O32OJw*!xx(Glbbm@^n+QPpqw6mG>O(}mV%PBjovfM2o&h+)Sho&0(c zaHq)q)2{rf7><>FwmK<#A#OXx1{HwBkmUn6)U3A0mJHh0(Xtx1fn_FfE-#K7<7F*8 zxro0>0LK_xeEHQ`C#g+*A1KZ!e5nQipxsNYGMVf6dO*3yOw-= z*HgEH;L8BZSs!%DVjzt>{km680Vdgt_EQw}(mId#)kakg%H|&%7Zpd*?Wg5-e)^z- z#fq?)<*gy5=N?DIA02QUu}b5S+A7Lnh@VtSt}9Z2iJ%lc4@RYlxoCA_?c4eC0vC6eure~8qp(U(!39l%na zk9O^fq&}QkpiXbjUyyvS)cj%*`=V@uD@Y6|Yv3B8Rdr{473`Y6MtQ9at;ho*32_xJ zz&s_ULKR3g3l7?ySyJ)vY^+X68R@q9`dML@xAWz$$?+P&`cxTU>qRFe?eLpKFG?qI zd}G3~bOubmgz1|K%YAZaC5t>=*b*2;ZhSJ;ur20n#MtRv| z(6dFw0RT-)zI~gVLAr#?#gnk{;`zvlvA-XN5Q|h-Up}kVIOa=D3|(U1bpz(=KbPxRN6c-3k1hj38*SeQ>>pqsiR84y<{B!cq(fi53`LyMe*NSmtw4rVghhI zeF%KLL4qwDZ6tGt37v2G>OdX#!OzM(5P#a<#A@>6`BXx&Qe;22*mE+fD3!f7XE2!W zY1$(Btcr)h3tF7DX*QWTSl;wJqJ0I>zwFZO&OkT2;1`_aN~O;9@xAYvJL1BsO`M7s z%9x?d6xs#oq()&Dwr(io(CBDBx+Up6Fo68ja5Ntw)LCZ<;e|rkI3!=$8CK@Yr3LdP zUiB-kj>Gt14K}Vk-Uk(R?2R6|_{nD~fH)b#DBt>2afc!Y03VqoKyuuINKE{$e@%~( zvM@6%%_4Qj`6YMaKQR=b!C&+($@OBrpT__JyyimLF{m%jwHOQ02-RQxxF3iDO{w;v z&HJ`^{NO_E~O8=Y)^@`NpwWvmu(*Ic#4Sg38 zs#0weB;hn~Njh#^lPtObh>00_6$}u-k&*tT5@t^y6i~%j-YuN5AQQqTNU)sC+TO%m z*aE*qOB$h#gcXa5{F&PGG&Lt-)F?uubkVoDMm!+7mIv{wz?)K94SE)nkB+k~AN@r( zG;x)c;Dq8uQ$5x$1;Fq1w3mC&M;r#j`9gz*ZnA?Os8*;MRQay?N?tQ|eA2Oo>=FxI zOi_^7@pP(lB`9@_3&|K|pqs?Q=R?NDS*+DTnB2J|GkiFYf}jDf;IGD{NRu+?f-d2p zJ(@|`<8{Y&uKcWxONfnB?}D(|Gau`fC~Njr8|rb=N2Wn<!4>jZxwWRrXBA#tL9ASSv_Z&f^*K%2t)AOplB4-7&oGHW~dTrk6rU@YlD zNZd>eY(oeJVpBaQF6Wh+wO9L~l0go#Tw7u%8__9)wEmf96OqJT&SnTzK7=h>^tgBg zH7)DH(y!Olq3nSO%|8+zB)D;=`-!nv%M>TQM^@$#Qth3 z#y`vhFog1|JqqV+ISbCZCkZCZr^cP_${c`KudjzLd)!a(5~@&&vzN4iPD=@Is4Qfw zpSAsIQffH$(CdL;n5wysc-s!9iZZjv1tW~r6n+?XiOt&?`?r#l&?*)qIBf7OA6zr} z2e)TgHbS-~duZ_c0!?FG{v*^IH-r(;4y(uE8`4+gyAagr1$ges<2DrXHw=Og?5AP?J zNCPmpiuZ!xU}IHzAZH8hfuN;X5>5G{Pq=J*?N7?p^s8JosAgxjB(80f&FQxLF)4ue zpZS7Kiyjqo#%`67DgE`F3_n-@rYdp0YFIKE_i&Xoldx4RVp68qj`sxwKfIi5$sr_S zSGSJv63r*X45H2?D8}!kiv)Xl2Tx;L`1q zva!re27}RB)$6Jg$)UM~oyyKI`z+=3i_5UutNf;_)22>p^%tZil@*8~p~D#)rys>g zc8g%43(~H(<03E!QCMZ98i|h9>!$^TWa*+xWZJ+#RtvU4?FAkIvsORBs4csOoR?x$ zh_;0xYWqEsbx$M$Gz|qTf*jwTlb5~Q{wTNlw=9QYaa$%C7DUrwKQ@mZbS5jhBV%!6 z61%fN*hYSyrMflCI&>>*k)DSa-_=`XKT{S8b@l6pR503<#mi9Nd;*NSI2OSq^)mUE zrg*qn$Ta1YkjhmnPX;$?y9RiDH_YN9Thfw4O_I!VOZ28-THp@3FirQi%%cIN4`; zqC}HXZ>8*8bjGNJFO4EEz&*v6q=7SJmVA_T4O0sPY^qjtu-wJGu~ls*TBTux(37{= zYjoj}g{zb^Ly&R`XtNWL;GDe&(})yQ$bX@BQXGx+#XDwv)@pu2k=T^7RC5(H6vt!H zK!=v}=5I$v27=vG;n#NtKAqo`8a6J3<`?PnzT21iu56nP!a~*TLYb#y$^zkv8&y=y zelju`sj>uW$bnbL=dr`9gV2{ZeTjn!J#M*ei$`c~YxN6p@lSqmQ4574MRF`Y&&{Em zplMDuo57)ivH>(WIb3#wsB$1_Hf>C_8oh%`*Ob1@-ejS|=qO#a2_zMNdlddQ2l!ph z@cv-;gn-N$kwdd2$AgVx9N!VN9MqiPKYdDg5-z81n3XC8N-M!*C^GQSSvPHF!HTm(MB`+y#mDmLUSR@x+_)iSYeqJes2H zG*TFn83+bs(YUrf4JBU@-g>`3+(MWWiHOiDuLqh8pDP*a{kvu@ zy$JsWUJd4lb8T{}P52PB8U)p+aRAel5TXphE~^a;?9MD{cpj76cpD1M{mzB*x(JeF zByxS=k5Uq~6{sdOq(NE>jJzHMNcbA;V9Q8Y%-V+^>{etfzHP>n5%R3)@S+^cJLEuH zzFSL2AL!BvgP|=wjAd)B49G5zrSZ3#-NMM$&KS{W!FV1U|3UrtJ?l^nsXE=+AKIFw zqeYk*o*Hjz0F{=>SaTy;o9o}`HkUZWjDsBkxt!6@zLvCS&Q|VMOaDL$F^5^A&4>Z8 zI9*C#k-%!Sa#!HP4-e1_aZ9%-Nn3%=&g`*BY5-E!OwLl3@I1DP_UiUBN>p-rr*?&5 z%-x+>S-`;Zc~RyXjBgcX!M5@=-5e~B_eyQ==Tb{|LpqmoQ81&O>byZ=Fq8MhZpr&N z1eNlGEAJg#Kgl?yj*D?KxVKo+j$m^N*bJr)nk*)goedBu3p^ByHL1fk!fl9^9= zyAHYGS(?*2(2-0ph{Rq%8)gkIH(hB1UhW*`YDDXN}`CKXZUcgg{=`z4;ffT}vX zE-6IJ(Cx`um5ombFE8D3@prnCl>P#OR&qclPXLoD5mhv_RT&N%Q|hZ65iEvbnX9Z+ zd=pjB+H;eneYNV^Mz?02)J`_awT^BCor8PGs$HI3sl&Paj5my2r3VKOrO0lEf4XfyDJU(Q^|HoB}cOKDrp4%&T$7BHy0W zx`g3K+O?jj14BLT7IU=u+~>=)I-8F?hOel6WY_7r%ul5E42X2Cg0%sTmq3h7)Pwhw zu3-FuoU=H(1dEWL>V)CJsY(o8yGAoCDaG=IW(nLXOR*(II z+7P6(P?2za)<3K{oqXcc{&^^MywjURDmwPH&n<+f9C+8$ILG2M@a+ppc#W=jS6e4| z-5K4-EJoqPZ9*I4N*_P1F8*4vjFdqi(1V}q}I3@Zv z<@~}O8^0d`xEAaw@5g?Y(?FT`%pP=ICGfP`a6w9K=$!w>YhT| zx&WXnNras-5D#gyTwTRuHZ_tK$N7~-*j`@8`1_TR$$)s}hF>2c+pY*Q{wT9lWFAb@ zdR@tVcH}4s?CQ8*A@>3o#FF$MPUt{hNmBp; zTVt-KCd;8xRL9kg%JdmnMFts~^+0$11B*!RLKs-Pr|8SicX=;|N~Qpb$xN((`ziE{ z9l;7>{h>S8;S&Bu3wlz!Z}l{kC+&An_Il~RH9?+#pt+}B2%dNEJ<$%2Q2-=Szg$t# zc0pNm<2W8IPav9u*y8lzV^P%$j~=@!$6h{kr4>~|R7W{3mN(Z)`IBLL&H%ocd2cKD8Zt-<$IJk7Kmof+KghlTWv;fT znkl|noaW>}JZe4!!!}GfSyX=ZZ5D=M`sduURhOF}0tKuY!I(e~W2CSDAZ3ymeV5R_i$9HoOMc;N%bBGVg;=;=1Ul zV$D8!mwt_Zl}PtTwchWf8CaS(LGL?vr%-g~#brdsQS8e_BQCr&R416cP_MFmPi?;p zttc;2z$zr?qx${>ibU{Vds_jykM7cP1hY;tm>O3++=p+)it!TpZ*(#sk?+kXFmXm> z0<;4xOqNanIfR{htXdcN5|+oG+`tj=KXHlgF*(-92ZS2oWO%PcX3o}- z&pj0&z8a?Ne6zpz3Hl~9dtv_vnll32KP`o1D;A)cN$!*;#D%_sqA?5r!+1>8{%o0f z*#nV)S&gArI~IFCrQCdPCBx8CG2y~@oNQhXA2QWX#&coC#1up@fhw|49++>Kt8P`a zX592n(CT04)RWb0^7S4vLP4cmT}L8%ydYokEWPTUTl%{RN$K&mrf6M_737;)HFFWw z`a^R>(^xh(HfrlaJTqn9h%Z`nP*RD$`ZWv~p8Wui1f+xt<0tYhMcHc`vG$JfEp-$wV@m)x<9?R8|>7)SkEsD z#I>C)jY4yXf{-;b{GiZVZhzhGwGfg}G&mn>rliK;_<0f`T|j4Fc;;B({mK7X5>Mz8 zN3r7=&O>Q5d$x#bK}m2R=o9k9N1|C_WRX?99$1-wCTV_=vXfC(B@(N!OG+&+tffZA zHvw+p(9#Bp0JUTR#cMG#1fW&P((>(2E7nQGnHaww)3I?KBrf$%WOs`AOjlq=W1CmOajPl+Cx+IWJn}tfm%pgxL z7w>Zzd>q(+7eBj=slTAbW`L1qeNRz9u;qD%Mn#0HQFzLWk3uzc=+L<=Fl;JVB{nJ) z^9Rjhff5^WLebwzPHoC{7xPz8Hq|KP%qGO?4&|77py>W_Q+F*~koyD##v-?3KEMTO z(mu&V9F;(iWG2OQa%++ ziDMogth-aDKlZs)QVtAbiBo+qu+%vj9^^uMG|6#4a>YmKrPd4yqMG;3%c12?=LdV;Nrld;oWsy z5#g4CaAPn?lYrc}$h1dPi=G;2sfP@bTjPfWmZTH=7i@1&W{A+n)Btr2ON+8Zkjfpp zz^Y~4#Ni|%FNd>18G?v6vG6UjXSX@*2baxoCEcE)I*Xi`)0W%{Rei}>J*T$_D@IxA zGIC>uiV`!_n{UY24MINB`}1WZWUj^SR1l!7i=~H4w=?6X(TEjob_nx;vD_|JkfDRP z>mI5iJRI=9Cq_#Z!Vh<8q6r7MK!x?lWa|IGvG!(4!%-EFS{?YF`#ghWtrZt~oJPcN zdgAi}P&FW3QM{?j{`klarT4BR=}{=~(GH&>XgWId8Ptx)S)ADnb@L)^$Y~nx@8Ciu z4s&Qz@|$y>Ks=CAxYNJb`$$lEctWW~YFJ=!Q|9*8%zhkaurWTAO+Bd*udN&45k>C-)Sz%!F*QH8}&?B?lR6@@gUZayPQ=~D}Y{QpNx+3h6 zH^Nb)qnGI0Y|3@yUX^R`dX>EMeHSR^+=B+B`wVO0p$h30j(n%D8sA(@Z zjmOUVL9^bFh$4zFadDHH{9)2D~qqG8$+jHt~}-ATzLz6~4r)TSCGObx%?yuJH3;SWLHJYg9;0 zQ!yA%I7gH;Tjum#pQguMk+=mCMN`e5cJWUjiK_kTQx8_t2x;O-15_C~VmwTymr1_q zUgBElP=8Dx{_ux~LwqFJwG4Ap@~d~ZwWnvfXrtN2d3WIyYCeTb^Me zZc1$;{CDskn`VFO4pO)kLf=rQCuiCk^mPZ|K#n4#B4@8(eQy~3xzX|B>eB^iX z+SC)E(dZr=#G14TXPZ0HsJ=WLeJi`h%?gzU9oc|S7%NrekPecmD+8e4Q%hK`acWB& zcWhYpYLRE!f@y-A5yPHje?c-)RF}PSU|JDqDP)sAZV#UigYZDw%=0hi_%7kbB7Xdc zSipfYIy7OuFy(bu9!}=OvlLiSpiA@hfv703=~-^A2OQojkLNLxJQ@>+(d-vO;j;Pq zUao#?W~!(b5rI`1!O9M?P@1Tk;;H`#aArXbTySZ>BG5Ln`fJMQa6Qe8z-uTO`NAO6 ziP_}DS&qLsn89jfrwhGAPLJ?=L)1$TTh+L#VWZJa?42{-< zkYk$k5!!2C_BeMTro4d+bzD%5?;}XXY6r8?X1xg`e%o;a<|=0~Ymf~nt06F{M8U!j zCgqM3IYR7r7hs)uHLhloOZbvk1?y))$3k_tR65&Kk3D9xK{r!jl&BROyIh-wJUcc2 zRCdc@B#$gq zg&CZK!g%kMF*H3zx`6Fq5nASeCuB(%Eor75iTLh!48_vTc#|W&b*OXEtYJ2mDvUc)76|do0Y&W=2I2Ub7*3&XRk) za60k><9_vh+3iZHZ^SVxQquOaEP?4grjGI&xLVzc46GUnVE&^ccpUc`izbwMjhOB3 zy%HVi{kt9{6cn8tyNoS@Mr=3JL_FM8E6|Eay{7;h5wC>ko5!HZrjAU_sqN?(3UtJAxNq6LzNEQfP5l2o&@@Ds4fjoYJg^}DY46ro`A39BMlcyh@NwLWg))vU4X|LP4Z*HCV5X3 z#d+|7(>qy!PqS|kF)!>L+}FoLKKPMpoc*^Fu32WgsG0_dsc$)>@+#N-O|viz2~h%k z0*ZFgYGQBovRLgq3W4fp1DjfB7PBPw0wo_>ch8oQgj7c2UbZ z{T1mzbyIQ=PEQ=IH^)fDdXV&d;H|Uz+YEV4*`)x}EiU)1X#x?VcQ}aI*I2;`4C$W& zSWJ`LZ0W;Y0i>QOk`P86fQW5DN8HqZIaf(pe`KVqJ3%IoUaBb>2ULd*HAaj33Cm8h zwoh1=FskDG{6~E29q#m$k-Q&@l-+gwkpkxJ#Vv;4bxYznz)YB7dDc<6$917lU~{)s zg``WHpmKFzug39I8wzN!m3uQ#SsQDUVCI)OdU9+lX{IJgY+pI>&xZ$NQnY zYv@mM5l{GdZH-0!zJ~2|c*IcjK}_|DXjwZ=>#RYspUhM|uEwS3HFn6vB*k0gCzBYM z>LmS-fBM9KVO)2z9VAc`HGuiOH0)((a4awhD2+5{;;N|yOu*ru8>AnY7Yxtk?S*gp zV7Q=Ai5Qx)AGvW}>!D(rJjs$y5%M-RlK%RC`1_E=GcOBA9fi}gz~`vW`>pSY^qLh& zl#h?tI%Jmq!=rTD7p$gmY7KQ`uHb&ry$yTV*e44dvCK$S;y4oTLM`p2r1PB4oq9b* z5A2?$138;h56xc5Bk74KV23EOHJD`2>+L^$Aa)dI?L^m+ex@D$w z4(cvOin6eLUSA{md?TzYLQ64zxu=lkl}oX67|9|A`t0u2-MzD~n7;P<4C?<@BK;nz zeAMVw1iTsmlzow!oUT24u}@LEaU#k12%>b*Qei1s!>hYC@|RP7%TfNF2|EsOUST~@ z70h(BekHcLIC(tR={_IQ=Q-Xsl}I|74}W+F6(^jS#p*M7LLk>j-*8NR7Rxy45@$V* z!UtdP9#>i2tchb6XSmb?qlt~OuLzsf=7+-ycxyi776v{dvEnz=*`~J@ux&+cJb}tP z-N59F;(aa1F+(H+sQmm+R6^WcsLoXip{>)6y16h7DC%`8oH6`q;09&gVAJp)Edm?^h)uSM#V02yH4S?t>#kfkVYo^tQyc`q2k5=0Jn$a`R&`1TG zCFF}ajh1be0|N0w1*G!olu#g}z+PsNt=Y z!)kW{J51o4MXZEH9V*j?Ml|zInqn@*YvCsy8ROcav;-Vt3$iZ%j;gTFz3f~J7x2lO zvLK-Pw3M4i+nPOf34o!*UPYIAKxi3B3@&cKIF5x$v_Vi7_Mi)lM;|w|fdz$jQoj(cPg`X<^ zJbaFDU}i4<+qR5htUq@E0Q~XX;pR@!!u0NUBqTS<=sa#rE;NK>^6j+(tw&|wQdApJ z-%|`i<@fo7@?=w4yCdSDK)CjMJ*fH&M__^_%o_c)OsRI+JH3a?2PNrv;x0+*?nuxP z*getH1-F~V@v$sfIhc^(^cjPl@+YwaBF4TH|J$A3wc?(HYEfsBpT;n=urCY&)id~) zaJ(JBN%?V6@9-Y?Lme)UQ#HSMts&KoVz@=kkVXfxw#j7%mJ?<6)!4)jk zTLgGDP=T+6+?nkZe(cudjgloCc@tX0?Daf(iTy!3)H(RVd;qWJvu2fX&Ly zw1?Io=JG=lKF4dDg#SUQ07=*JL&1Rr47Ya&d&AnGY52m5hzKkyxCGIMxtTOwmf@*Y zX@5>&+svoSbBic89mIQO;%V{d+>BZ}87Ri0QjSnfa3kwkl}Pu7sz>t(COJJ)QRjTh z;25%Y)a)pKojSQ?@TvybRX}5Xr6-Od-mkA)4rWyui_HT(^C)lTdF|DF+y|17596ic z`q!r^-@99LTD$=lgWh8#xSMlecx}Jmbo_&CI==Jl)83!>jW$ z{{HtEZRmzKbl`9xrQYl`0a<~Ry0Q4=QM;Wxtum3Y#-`Ljk#x9Dz5~5TR4(I_$+sq` z_B70xr5dIyJfAzO1;cFE_2!xIZfO#5J}CCA8_rK8yJ;T#Esnp{2_|c0=}LnCPEqV6 zo#TlpjfpCk(tK1VQ4bNLKbC@PB2wz&Q0&kZC!1^I3_C#YEGwm<(TnNeLzL7RN zkb}g=w_Jk1To_6jNYRAm=V3eB)#b%L7%P>Pg#qpt}@~&Yx~8Y z0PT)(yuvv(&NP&PpJw%$#x|7gesOdGsNOBDDwA-frF9E+NqM0(I(Z*3oq;8l)eT{9S?N2S&>oMVl3%gc6>6k@$yA_U0YDIMI;p>Q4JCq zhk5uM0Zf%iGcw!?eSK4Q!TzU37Nu4)5=$tAT@kXm863T{ZUf~6i+fxj*YTVS&NDKQ z*a2xj%m51a}do$#1bvIhwD4ZG+ZtmIw_xNnUyI`q*Y|gJbSr-qz5`8Y%!7;Qv$r zpe`5y04bq@GOeJAy^*Pyy`2j!BOL=5ft;nSk*l+^p`8q^lBu~X!GDXaP^6^7PNs$~ zmiBfchAyUD1nQjQ_*hJ4RRfHT$BmZD+-{ZKq?~w#|;&LC3aj+qTV) z+40H$-Fu&X$9vEHa_;`H#&~AcEX=A|zlG;nHMzLBV8{R>_70v-mgW{N07_LQbt)Pf z+W)5fGX-Ge`CpuGNoPxQI{^9jg`263y@Rc(oy)h1|7$^IQ&WJ8g(<+y(#8}ZBCnt+ zB_{!(l#o*eNSNB0IvLsk6kLsLER6xOmd2)b&ZblVGkYh%H{qWFz}Vi-#PXk|In#eT zA><4&1UNgG8e4vgnR*zTI{d?;1vr>G*;+a~e_sPEodM=fhITIBF>tX5SlSuexSIUq zz&G9OJB;5-9GvXGXV`x8zLhE1JG(d=J6Sro0KTm%h>HJ*pDq@LF8|new)|!T?9IMs zn%En={u7IDU55Xt`R2M9TG}}STueQ_iS_^^Q-F!3vxAMH=eO-|We!f3|8m3C+0xGZ zzdfJ@IGLIoI+@s*Iy-->`PThUbpCst|A_wA>J1$nY&`!ZZU3)X|Jw&k7iUu&GkO>% z=5L$EF5kAzE$v_!{@Ex}c4qbfCdU7uo47js7thVq>0be&{AbTleLG=jVsB^T2{17= zgJF=fcli!Dfb#z?%k+T%u_XTwr1*a%!T%%a{r{KTf6vi>mn`M~W&*{(Yjl>3@LE|A!ta7sKzJE@Wr^ zjSP(R-&^*dt!U{iZs}oaqG0J_YymJcwD|^sf6-O#OiZ0@EbUCcOZH!g0H9-HWBNCq ziiM@IwcU4R0oeXSovEG4zist@YUE$8GyFT4{>zNQcTKyfcshK0^dGv_f7pKm$bSz0 z5f&D<_W*d)F>$a0=$JX#zH5z<3Bbk1;`@Iv^e;vK>Eu7MKMY-*EIk0)->dx=`e)7m z`TFmX?!T!Kvop3g`3D1(T@39^zJcR^6aF(SmX5BbQlj4rW@hAK{KkXtAR4BKe%Z84Cmzt&X1lb?XGC))5ofB*OLiRLx2X=Nl%+HEq`dY%a*$dwn8}kUsAw$ZC0qKj zf6i_#;dxZjbyt^L0()A}pcQXs9HM#I-qZ`rC`hPdlCe6oOB}puVJ_5&ZLvG+fybbP2R%Rf2nBB1br?vY#P98x+~4LuP)D(F z3mg}L@>k>K;_M(nnwPnl0NFJ@hw(ZeQTG#nD1qZ zN$^j2!VQosw@rpzCwJWH$W}8{O^LlaN_YpD{gC`ms(~Rd@ThkU@O!l*jWJZJ577z#@c9ZSXWWzk>WP+u zI|hDc8kbnKSg5vEp0*C1h1+$cK8M8YB#BDXHoSrTj4>4oJ9p&k$HM!;@26o$6s?7j%US9n|$17@h1-e3)aI!6rvETl=%DR2G21{ zK%XG1rEcIb->+a*^#W#JedUW}u_oxhlb;LMmN;MWk!iLy7|)UBdrg9elJJ`{wB?^Z zUa#{uso}Q4PBii1VuuKp3jVM7s4ae1>d34tT&d7|{0dprs-MwbxVLXM!>g0(0_Nf4 zW<`2`jF8{oKND0VTevx|zxI|FCXDP(oe?4?g^NC>8@704mv2zfcY||r;%+fb_6COu zjUsq3cY!ZFhVIj8v_+`}O$G(P*IsbW+tOkzNBy$b7rL|#e}|44m*$cmh@}5s%Qysg zSl)fbV_6RrnX(FCZY%Dk*GFeYW$`4#srA89RmkFn=|{Te=tX zYywic@(vvG!r-p`A?*Zj^mW6u!N-A2cysWHP6bRzI?$juM)}8CBNoDU3zS;*rDUF> zv2wRMSXw=?quD9u*Ekz_f%?dMy7!fgBgB>JS(U5v(T8}*$^E{zjJUt5YyeXnnOoz- z7{^MK2dwHo80hDgMRWRG2Q-5w!~POpD%y>MVpp`>vo`??xe!9y#`G>kQ}&-X(v6l~ z1-1b$Wb4;G=^p_tww@B#f7x=YTHH*p=3PSJcwk%$Mlj34lb5cwil`?Y#&E-|Bq5<{ zVINi-YG!jmG7ygdTcGU9SxN6|-wh=^mrovW+8=@NJ}I6 z9_CcOZ)yf`Ko2VnaNg;qbVv(EXNEJz0p%%oQMRlwDX~pu29h$GOA4J58_t>j5%&hF z<#dKU=R$eD-WS1O-^&=AE=i{Jq;+{wrPn%zDwn3*bm9xWX9(1mM2W%G)_Dpx(lcj` zq@0X2wU;fz9y_gWP!<$MhK2_uV?(rieI?XNFdgI_i zyL2cQfb_Vynnup-flQecNff&t3fz;UI*;mj`W&8mLflr}U~gRf%pJ0%sR*jVA5H}u z*~}Tk_)brfX)yV|Y;*moi9l4^KWtLL!?@n(sshoHSZIErD1{09pBMoD|nwI zpVAhYgr0*1jd_~6MA0@p88qS9>|z&Uw}SwvN3lTofGx;F+ej6BJIBf^UOu%oY8U{* z1`hcvP6xM+FRP?5yD(K+$DGPOX=rvwbWb1o#uF|~T>^45!;=M{@_hRx0R>z)r$F)A zkd!weGer62KAwFq@Q_gupb2jQr{MGLB1bDh&yCTQDZCKlBR)9|JEE5;s~zwG&Hixk7sXPEygsE>MXSad+@?gH!gR z7W4$-Q-2yp+ruPbg%mG(u%J0CF%`}_;VvrV-x-ek;4q?1MZ~5n?W*YA2PDVTO7$RK z;w1#ZoSss`+vU*|BIoW^?-mjDkE0j|2qI}JJ6EXAZ;;IM{LC?NhxbXgjRNMlAkTJr zz%~5ZnLsd`!&bXyzz2d_?=T!n8TQXWyba1#7n@ae)GC|PYcABxtEb6!t%A{|C$aP$ zqJ{IVQY4j(Co~XUs?njPhb@nO&9vNkxO(VVqoLlFT& zmj2)(kydD*P;UK2&xU@bEjN~eZJe|2UY^Tl5LN%U<6r50=QDopD>c(wJXJ=$Uzjsp z$Q`i+?Oa^Zb#!*LK9riu>>FW_4n4q)c$9ZSjydY>uXT^j<9fHQYJ>@mB(s6|=1!BZ zhR&g!4tp8D!LKtFF4o)*kC1<{f}{r}zmskm2=XOC=Mjg61}|tfX4oShM^+xbq^ugS zw;--TOYew-!>sHDb=hD97Y2+_aAa&xa(O6UDFYJD5+AATZQ@&>7E;ol>?jCs&xO>* zP>1BYWPK3lK$5dWd|4HF8dQ|inFVg1MFqoVWzqLC!*!ROSu*_EjPb&TP+4ByMf_LU ztznZwC;3W0Qk>&j40h9V?n67bB!CBUNzQ;ToCuF8L{Ubci+oDr@6;659F)6z%RW43 zJcp^Wht|d=m|`#fWI}8BlITZRNo!+HCh`56vm+~ZCm2QBT1|zekiB9Qe7_>EusJdN zUue$#5?_VG^6|u0+hP+%bcn|nv0aEH>xt}1<`-sdufAZ=4jx_Q;Tg}_ z`c&R4qA%TutYM)OUDP_w5@YfTDJt{qTjV8`L+`8ppKVXO<7>1+{dhAUMh12ItGRfB zcWdfoY)jgN?qeGK;1zL21(DR=mp<5#TaVH_Wfy~PO+*$CD)XtpDAfWj84xh=>YxzD zq?4zO3!=fC&=VJn_(#FGT5O`fAP}(Q@`|pAZlrP4PJ8-IF!j(m?8@xh+|gmpw-lWfTxYMyX11p;q?qYrYp{+0dtOk$8fTKs#(? zM1$`=9E`RQ0|QP;=nM+U9|s#O>N@0VnQGh78{v2YEgF&E{|Qd#F>$Jl_*wYzn5E+@ zWQx!k{`jW#>>Ta`pTyI}z#qEILY3=Q1C*$?-Fye5ucE9~xA);()40Y~o5P;3$@i(d z22<&C5qnvFSMX*GD;z^v0>kgj9Cy^l9p>{W)LFaG=ujMP5gK+yt0JdA%S!!b!n zI`TdhzWl3ZLQ!-{2qZDg+(0RoA`#Tq_};+q2a~F;RK`P2bU))!-~5%Sc^xwJE^p0m zhT`~Tj(*gUFhzy)c#D^+iYCxa#jOqUhFu4-T^tmYP@l+xdihZzAay~$k2@AD*Cg=p(PTnJtR z?@7}3HS#+6kGbf&1LJi)qY;Xo)u<13Fwly}5S0)dp>7I>SsXA+( z)>OJgxj*TZ$kvv@7^$C5?j0~E2`-Oe@qPC;C%AY1z0Nmo9b)$QmmA+;LX_l#77pig z@y`?VqNLw*IJsGooJIR}zF?@nkp@L$Y$PTy1K3cp*B;&%0wVz?#BIq@3X71!20yKT z1w|`_$aq9lIqmDJxq&>VZ>SxkX~D!mTN z4KpiTo6oiGP;C5r!SmZ?_(Hb~);S{gU^pIaQFyX4Oa1|A*HrCs%775X&xT>pcWPAs zvBBEj)?zIDU2|ykeoI#Vk)-^ek;08`$qe&1idse+fLYUVgITuYN{79=Cb%?54GKq% zif+3cRaOa1q-MB?A0ADA@Xi~LdAu8|16M=Ge*E?4G8S&cT#)cz=`%ze&)u~#zSc1&ZSjcP# zA0uZH%h+oE=q%Dz3T?!yzj*yuMPqC?g8{V*Tj8ed3Eol8~JR*C`BvBBd5NPix-^Fm_1#i)YoAbkE+^$TRZjIQ$oxkFRrQ z`TO@nfZP_=oSn_MpvT)Nztj^3H3lhUY!JgDWLXWp*;~(h=p1+sg50ge@d$t| zsg@^$p@@MMr&es3>H+*~JvnIW&dDMY!Fq*y80++eo6DfnZqMHhc^A%eM|p@sV2z*8 z&YIAVxeUVg6QgOl9FX#Qk2(acMqa+VHtI0K=D%SVgAxLp*B&+7XEvaVKS&_PjODU( z?jO4LrZ_3lY!|?#GYMtwS}YK3F>ie)j@k&=Dg*yuVy*Y&7!WMh3$z+!9Alz1L3pMo}22S`}x{u4z4(%_l3YeGWp@2fam$> z`gS-^52R1jL(){}N4^Pt`mEZQ)fw<{IEo_$sM@xetPZIC`up@2yu zl^S9+FsRyfz*GXcjgIYd$uq&7=?}^uwo}13UIRV3f3WvHL6!j5x;7uCmtzB&`ZyT4 zzvBz#TzCbha5yMl0nQI%5)IO+@3s>xx(g06-+e4ppM>p&BF7bGsBiJg`F<6iFGrGw;rforzFEAg7FJ%%u_D3 zPiab!v-`z6R^=&?;R0F%EpV|cuJ)FC0s$=EU%OQSKCX_0=;p#Ey6_o{q6|iM)KZ5&zRn|n++~ouM?Nkj6H;si!<$}R)N zQLfq~4PPZ1S>X3{4~HF-T05K~g=LEK>ms`Jv_fAbhsXiCMduv;O@My2*V=>TkYEtQ zx+mFu6;3s=t|D2%^j)(Q7r!zvS2yNHBrhyL5UT{2Jz{GeQ3@OyAApgT^Bw z0elz|MX>s+X~twAOfFIld8N-E;U1OKjTE?@>H3>#Dh>UWJ3Be#fK*0&5PyV)u_NLN3^E0Gw5H-t4pvy{<|daYF3p(Rjrz`U zNe8rk4*^f(SZKPXYC4Qs7Q}DUPOI0lKkGtf9m?I}LbNoo1fS(7?={1Y){9;G$(hGU z91HBQr3GMj7rM9tJ$ZOI{UB7g-kf8}OL8tLYHjR3%)J-JHDs1NTizP)fY~pBBB5%h z{%b<<{nGY65t0l|n-1!V@oyDnaAaY4rU7&FVXL&nv_L@LLL?Y1~@0SkTv5=Q3cFnqf_K}JL%NHN$jcjiE)}TIF3<) zW7Q2NoNYfq9u1QwTB=hdy?hBNr@3&irv%*q`+NF@zoMdk&uWX>B#TG#1ZlMjtq+{%i;|?LobS^%DaJ@Z=Hf*106)Qa#U94NCIE8{+0*LchNPl?slP@Vml?Ip1C#8!JL1zgoHD?)@kq^(zhj; zI|vM;|Ddb_zg|QXI8vE`OV2xFD-LjYe~e5x`a^OBV`XvIYfyd?gLgIRi+qeJ^V%14 zG31~u#-qG1_nt{U>bRy!{fTc9{$|FTCPr3Nv%?n1vj#awd=K)~tb>6y(joq6T6xM3tU+2RBgA!@@mX{( z#4WH|NHNudZU)!CRjHaKcc*1X7E7UP&>3;2*A?2(c2h=ZM6bqV^`hfIn6Qj49ho8Z zOE|%{dyujPA`dfElU0{}OYQ2}=XBa0Y^wv5_GYWhe}yIR`^d8hE-TT9S@FTe63su7 zc;M}SMiD8SLt$lkI7G@Lo05HjiV24&>Lh{Ni4KhL&J0@DEbA?x)>Eu>QF6|L7VEPf z`Z;0{dEd)1jgLjL1Q*0oZGX2E5&tz)l_BQE8!k1gf&CaFSn80mnxbFTuC3TJ*xceW za{)%}*EeeDdeeOTB3QS?e9Z>2(krPGaTOE~co1Am4DoTWLl)M2NuuZRXCbFcJ`l`h z&VUR1^Xiad+N><{*W-?^q_&J}pp@pLQBE~701H~6;I!SWfWbptqLw#L10^X}(+BPk z;CM#KG+;}nWYF8fywZ?X+Pfe}Zz>(7Lq$I(gzdKuTR$g(rpN<4KUXl-^@ftqiIJB8 z?HEI7_tsozHh>AiKRwW2uZ0vNa{V;V(Ry?ZX5-aa*?IDQ2zX#A4am${aqVQ`Pou=g z_^|%cxjJ=gga{`P`-OorYVyJZE2q2TZ(DnWm8VOa20s<@jTVAGNYFs)y{N==lb6y$ zzniw4V+{d~$>;>O1{arX8HqeO;(t#lOH%Vb1#z-Dg1J8$JIZT)#|gdj%&w)pLTUV$e19Om?F(Pt}_wQ z&g*=Kog*T0yk*p0w0-w`n#rBY@Ab^;-ROfj!y`vzSStd6j?H}F5Pvi;`#hq;n;Aa zU0Y8UAdp?{ZS^i8vfkB)1=UJaX2#)=R;W@>>> z0o%5T;??L*qSJIW&9OrjsVb2bFmED}@Q!v*$H{k8iXqege2X1Jr3$bz)21eGh6Q@s zmT2gZe2R*(I{+U8%jFOnb#8(}PSk&8XDYaqZ$KMllVXgKWnD(eOP)o~GX^*Oqrrr$;gcI{-+B0TI{QI!G)|}4L=`ql=iV3To4aLa1P$5F84Ctvi6tjXm zd8NC_Kb}A5D`jVXLvyRFkNgNgEdo>TgE&(Sx*(A#TU%l^7cx=frU~Kv;HY|Gr$(7F zsrB7s24T(sBGLHWTW-45uN1tBfN(CYciWz%4ot6n(1k3jTKSP06buziuoL0gKjQSO zk`xQVJXzmC@dl%%-lgV-&`UTLVU(S=P#?T(Fx6c`drlDny-T?eo2d>wwBk>yzvDf{ z$cRog_IyGo9#EBrfQ@B&Uj$)y2SM2=RHn?>L5>>h(oid%$5`~oeVifQvVutE;xIsI zN&*W{iRSL3xB>7iwl^2y%OYRy*Mh-FfzM5pL~Wify<1E0e&M@45`nGjY6e4fF(wv- z*{(=5Y4($19QevSmCk_HS+VjZsm%RPdh~a1@i|o8FlLqo$9kFo0_ner*iW_N5o8g? za=jp!=S75G1Kfd0{?(0OB~dG;rSAcji*rx#`e!uUh(K^^OPj@O+lC&%lc;zp35AYYyYO80LkHYv$f>&g~u*%tAgLcoz#C(tI$d>;i{- zbK~SDBBP&-^SlnKKsqJeMJ3emPJV|cr+$-knjqz4s_77-wb(Iaua8FSf#ft(LnjL- z7$b)TajbUQ$byA5f?$J5M zwCs}^;WaB(T5MB}AD}R!kOqYd8dZmd%sLS+VaH4js|?}RqLm(qnWCjyo}5I88%kVK zG?z}NHy}(DA2+NDG^TY&zi12BeY08Nt)XS8RH5k1MDCDt6WnUO;7Nc*RpYT8T8OZ; zK`+I#fYspD7Q7r*HFP!nz9l1<%XdP{vmZ_rZ)oqy*MPbk$b`q+ImaNQ;dV!=CYt94 z_3Vzb)J{oATcs#DqcXZ%7Br|n-9@2%`945HM7NftM1xH+3#Fsu;kP}?D?TcYO7O}i zq(N?85(Zu{hgfwsUwlDBeY;X$K<%wP8^2HsQ1`ab6-Vg2!wW-H z!$gWhtK1;WL9fiNB(=5NtTFMiY(f{k6tP)Je2t&Igu*;=u1p>#IxPe(3k*&#X#n7F zk=;I^I447l9AFU~Bp@;mPbf>AX>=T2GD&?)de`zX?~i@V=7H=|hyg0~*H^L9tz0FX ztlHJ>1ypro8zG=L^NiX0%eX}EfQ`#lx1?Ng(wYd_0~!F59i2ViEf$Mf{Z=(?#vW!P zef!>o|8_5cLjSUIc~E>uTXNZKdVR&9kphnxsMbM^B-)HIT*PI{$dURak9bI9_sV<) z)GY3~r~g?dkE{0HOuz*X`CenQ+qSJ)r_RP#m3|0nVA)DT6Yv3M7kYZk`+Yu~7SsAR zNb0Mo2EC_)$BRkkeP~FP*E>6YHN&TFRaS1JW`5%_&VfnxbdIOwl&4SP(ZE0@b2PE< zZEATN-#udeK)+=E)w7y;LMopd-DAog6-=x2tC3dP*+#@5lVa8z!>n?HdJMOXl514E zLu5HEo%3biem`)atw^qQ5DfQ$qr1X{u15yE>>k;kNI}S|91`xMsCX^uPS)6g$?5N3kpc<4mR=p@n<*4~ZJ`{6*Z&!V@i*T2X``zV1 zoH_!vd@VW=wKPVyu*Zi1@+=TnN_9ZRJz1W5)v(4Q@c~3|iB@!FmtG{BKMr>S;;r$1 zWJmc$<(I21mjqD3Tf0N+Uz&pjaG)${1zGymwd3at`wU#BTQ>yR&D)7J*#z~yw;u)e z13D(gc`B*7DEO*zMOz8v&W~MKeU8Yv2ygyq%cs!^d(5|iwa-Re5v+}n|@Q#*O9b`KXlqf zox-xz0}$!smP(Kg45@}$<|>3cC-NxY4yy~5%A0Tk!@i#S-bp%eni%ZUy~F$alpp23 z6SszV+jZ0@9Ai{K=bz@;O@YRzq_*3UoUq!n<&mot>|s zHng|hC`We6l@ryXe4O-eC@STD;C|RomztjzdfQo6xfBR7_QpiHMiK2Ssrd|c^NZBY zZea2#nH+v(Q5PpDm#15&{^9-IB5Ky8<`+L<48)IH29D(1h#`KdODM)(f?a~g^K`ak zR^Vl_KlOX{bW@DDVtAVG`<)uIIoIrD9IBhi?L<%fM9jAD)MAS2b&BXE$$s#Qb@%2T z=8Jk7XpM<-BM1g+Jbe`{7Wo*)jASc_*5c*P_*WYz;UbLJ^&MuKd9Hk{Oo=(4i3$k6 zywkyC-$i3WG!2G#_f~6WEwv@lIpsb9R4WrQV7IC2J?w7FJk6{{RiVxHvJN3$Lptsw z-t*3b{x7vR_7ZujYK|box{QiW*!UA;g{suIo)C!+LYqhP+NaO0*{sI4)W0#tfW!wp zpupoo)6WLdT2U_eg6#z6MX zYfoTNz!iZ6EyGti@n-cPiWZBFpEn?k8d^ayR`$dPDn4&yH23hc0X5 zqzW?M78BpM@DZpzTw>!6egB3t*wxrvfH2b;=?hy4*Uif`xZRj-Up|Rq;f|bBTcQ1g zP`j7@IN7?~0cLJq6V*(TA)2GkK*y0Gj9W=djjYfXle%odQN@7jaHr}8hO@(_-4YXw z%5}#9JMwm473sq-61iCSlJUysr~wmVO-|4E&AC5W&k|l(i1&(Wg|3j13y-=S0jV>+ z=SUNc!3^h|>cC{M0z-F=!|wD}u(Pm%l1d%beL+reho$Ok__robD-}s*J5s$QCoB%y zDGS%`==sQEN?v*kUo9-#XUI5BmN3=*Z2MB0;$6pLAw{}7On!DEP)hNd^vzm4Hr+B( z5jR(&HD*?2z&6Aev^@_ zOkA^yfca?=4+sZiJb&tufIa+ZO>pPgK(>q~O^ z0%Ox6!NRb2@ct`QR!cBBv?GMpvws`DlQ7sCv*q1q1HCdZQ2#>Xvw3){nGJM?=KFZh zyX3Jct~KB1NU?j|^&dQw{kya)%klHhM4R9$2H`4xLQpMuKhJF^RUem7h&Z}%?T#1) zG(EE-cjMZ5HxfsldtRv8Q&0kOLPGWA0^L#zjrtHqU!H4t*Ejb+ZNpTvdjDk0hR!F{ zsldc?MRTC%84Iue<%LR=hNk1#1Si zC;e0WnouL}<;VM@`=H&pqA2&JFhzd~NKYVG0J4qnmBIL50~ST0R<3)tzo8q3HgVlx z?)}AWWNp=_Z<=p6+OY-yRrZNJp2{|#1B|i}-jNEi3&A=*U>0+XGFl0z=`?{(ZWXxz zL+H^6SJaJ+5SY8!^lJJ(K()(Bnyr%3fi@NY;I{>D=T zYKF*X%G|sEAgQ&eL_OWs6P@QT7C*LRrVd=xmz)wzKYNJtUw>#zm9xr`vdNJKE6z90 zuB}Vq9#h_Xu1Maxci>ng)d51z$bvuP$J9QZn(k%^LMU4C*aL#^G^nW4i_*1W-Dx{P zG#*;!zB-bc7pmvZClr>Ci`7JDgt7-_yTIn1Q^Vmp&vo7fx9rDM`*o5 zW@PRQg)SjG~&$F2M3V3 zg1GqF%jUHoKx3kDFT9N6yl1D;wAD*6Fx0KXE(<)g=Ii3>Gf!rZ6xMVo+E%oZ)mSL| zTh5affL~Yb2h~2Ux7jnv~(^_Q4XmDXy1kl zg7TYx)7&2P<)C83arDJozMI(hZKm<@tWPU&n)%7e(&&X(Yjo+VJz5FrUrWdspm-l9MLOp8smu=1;B5 zgR~{zU_(_)u1*bp`UG2h>eP~HVj}dfveq-OA zAZ{%76{EHMLydPVSX%U@xlDQb)JeAB(CSszl8f4S%yLf5lwt?}>@_vP6HncGkd!< zW0bPrtkTN_=rhSTo#1X4MBN1rRh4#T-@-}fxiu(qdFi(uR^1CUQDMzTZ_I@)2NCH6 zo0nlb;ZjQ6(52bd!Xz%-Wks%y%Zo zgpDGl*FUw&mSwjLz^3o~M1I8k<)kl4wHS8XeK~#7GB$mg^-{6J*9~b};uJl)7mAn- z!@{Ur>L0w?w$-}lwUm1iN;;53Ipdp`%cgcYv?r*XZ)Zy z;uLq2EeW#}V*zWEO*qr5f;Kpgi3(yo7u-%8#lgze$@L1ULGpCH_0=~~OMb=Hi~I?T zpj9<{rnJI@GV0Hp{aLP?9Yw0A(Ds;mx(v*T4C@x)*VgmUU+hE1#z7jAITnIM{iM61 zNNMC4(dp*BPq!j0pfwj28LE$=@SjO{uY0ZEAirZ{J+g&QAU5c0>o;Goc)eUUOp8na!rArs3szikA=dCX-Q zxZ1eOM@~GKn}7m%Y)MZ@?+m2_Xc%m2xM6!I@p)&0c#FCOh^}y!OX>2JuK+9YZC#8}fztfipFzV092V0Kw6~EVbDbO6`|BYQ(%y}7 zd-wPxCv>MhP*OY_t!L>cH19N(;5|qDmJd8OU*y(&m6@v%nSz|#AR{iwlr~btFa3Kt zVY^V>(RKn8f9a?wFp#)O;K}zWY^y&HcKk&2)MC8s&cQqx3K&;|GdB_ZF{UMOl5!Vu z*W`AFlw7T^s!X~Nn65+JU}2F(d=MIa$g?wQyodVkQjPu?CG6&hZ#3AO8EpORN_{L` z`%OY(;E*{!(QtHV1L1dF?6>|br?!C(W?CKW%7vQj@X*%sb`VJ|s{)>VG9Wjkf0SYQ zr2A^sTWo844JRmmlYPobS!IlF0mkLpQ0zwFpNl)zMmAc zbKs#qKB(E)zx7Z6mG`V+j9Vw1>0Hsi>$4)=djQXHldaef!oOMYulx!9#bmLl3?`a9 zZ;e!zO$6sjwa?&HR*1>`2z-T?b79pBZhuVq{mES9ku-W`JXB3>%h`xZK3S1pr6c1* z9(x6G+(aV2j6n42y6Szv(Z3xZMS>0SEG#+{=+xJb#;i>xAEv9S@CX;*V5mz&FJ00% zQVF8y^Q{SWPGQq^8+JC6ezQLT`TVI!76E#x(5i(*c`$tx$CU6H_;BgIlTBuq?=^

0BCz4*HQ#c7~2G7I;gE65i8~$Jwj3a?U=fz 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

jTsy>*DI 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

Y>;1_ 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�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

7b~No6SD(z@Onw z%R_Zw2qr2wEwbdT??n(bVOzrsXTQ>16tCGfBfAu`vR(4Iz@AdHSQ3~Y718jODH7^N zm}5(Ah3$x_U9e~~^oiD~UM0WK?&{ubz>llHlou&#HMdx^%OH)np*d_p6Kof&B8&`~ z3l4klfq#jh;kLYb)5NfCAjha|pJ{&eHhI1M<=iF&8wA$t5cFGV&y2^3cA1Lzd zZ?x$Sdr76>s;!h|!?HWv0%L0ZP-1w*_npvT4>gQ>&lK-U!F)(*I?l!Woo(;+AjX1B zv%KFXVrW!Zq^?+T^0~L@nhy0|LqX#Z>LBSNMNk_xBT@^Ms9mnLkVhgSur$;a#-Ruy zPe#-R4<6&+?~K(=g%vljVEN}&C^9w;GQ48f~vqXx)YpF!>8 zMvw*t6zqc9lT)wQdit11+FT@4BHX}7{=AN5;e&K@Ut+f75`39OVYQz@w@4ig+Hg4U zW;@JDIx#u$Web{qO0F&>x8bOI+_&~LU%Veq`drGg2*g^uA%x7dD`cQ*0Bj{603-Ql zMEGM~?P0jP%(FsjH4TrwlhXzW- z)d@0FNnSDGb^PO7N(-+IOO^=1nve!U8r`(PL3%@3w_b9@B}o1PwXi2tg*Ztf>{6kH ztGPE<@#mQ^<6x4WwjbWtqHnT!F6D!)u#6dqV>`9?Pv!Pb1IYpUD7b#NfNn!0N4<7e z*f%FZT7QKnqQ690?9^|I!?{O$lp62$vi4J-qo&z*YeMJR%eg8RA_#{Rs!@LB&?uk| zXR5UYV+x6FW0Iv^R3`M2So|v*#7fb-w;-=Ak%ogze=NtEp(=(ZyV-WqKwdr8H4qN^ zUr7SY#*+i9U|w(9!X$%9ds^rI;+T`)vBFtld)Y>~4OQld1Z1xVd_FT#M-W8DX=|Q~ zyNdpLM~$=ItIwPMyjZrMepW0_n4EgfCEY?w6o3D8_DqN7d-6|>)80$b6n zjxS!Pj+l}io9rN#D6^y$#PhB0B6Y5edP+3(!I8S{T84~NM5Oo?jfn>&NV4|#eTE0e zrz)DJLap|$dB}o&*c zVYc{8Ym)=p`GArQzj*DJ1|*bPR0bO1h(yGZ_+0#wL4KMFUCtoJL=3|jW<0JLF}?{F zX)&6^2va1Pq$;oR=2j2ML5;t}HiQACpO1J|tHR3|#wXMg&8+elSPefMDJnoNiq!~rPemZ+Wy4X3LF zGbNZ?RgxwN@3VVawnM_g5+xLN$}iGlb^CaZ7i$e_kY)c}hpdaF+RCDKI+`Mg2YSaU z{x7pRw!Tn)Is1-Fp=e$L=jNoU!1v>IF6BKagGS=mbS!Bq3zc6XdUh@gE%C<2v+cAl$uO;4MW zkcN|G?B}Rb9;th&^JlX*KgC5yb2$?yk8=hden)6gI|K8 zt(_qdOUq7~dr|{!y8cj&I(;-!gB*`jxshT1a!B6iMs%kNN!YYUDRoZgDbDLc`Yslp z1dlRC^P-8nyv%1QTLW*BZWFw_;yxH#3KiEST75 z%+c^F77V=h{2ZcR6B9dd`>;&e_Bv!XAJphn%k60Ohc8_e?IB^WvSw;K-2%KNPR-*5 zG#!KP*mtYo<_-Y)QNmYMXX((*K!+wqW6VO}{TmeXZuKJ{2yzY16wU&uD40D7CI%UH z)A;=+(A4|!Ze)=Z4kS;b1yu~tvv=SdITAc!)QDqK1^*&0L

3v0JHZT-|A%J1nKV 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 diff --git a/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.1 deleted file mode 100644 index f1eb3aa8f..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.1 +++ /dev/null @@ -1,87 +0,0 @@ -.TH pdf2swf "1" "June 2008" "pdf2swf" "swftools" -.SH NAME -pdf2swf - Converts Acrobat PDF files into Flash SWF Animation files. - -.SH Synopsis -.B pdf2swf [-options] file.pdf -o file.swf - -.SH DESCRIPTION -Converts a PDF file to a SWF file. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR - Print short help message and exit -.TP -\fB\-V\fR, \fB\-\-version\fR - Print version info and exit -.TP -\fB\-o\fR, \fB\-\-output\fR file.swf - will go into a seperate file. -.TP -\fB\-p\fR, \fB\-\-pages\fR range - 3-5,10-12 -.TP -\fB\-P\fR, \fB\-\-password\fR password - Use password for deciphering the pdf. -.TP -\fB\-v\fR, \fB\-\-verbose\fR - Be verbose. Use more than one -v for greater effect. -.TP -\fB\-z\fR, \fB\-\-zlib\fR - The resulting SWF will not be playable in browsers with Flash Plugins 5 and below! -.TP -\fB\-i\fR, \fB\-\-ignore\fR - SWF files a little bit smaller, but it may also cause the images in the pdf to look funny. -.TP -\fB\-j\fR, \fB\-\-jpegquality\fR quality - Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85) -.TP -\fB\-s\fR, \fB\-\-set\fR param=value - Set a SWF encoder specific parameter. See pdf2swf -s help for more information. -.TP -\fB\-w\fR, \fB\-\-samewindow\fR - When clicked on, the page they point to will be opened in the window the SWF is displayed. -.TP -\fB\-t\fR, \fB\-\-stop\fR - The resulting SWF file will not turn pages automatically. -.TP -\fB\-T\fR, \fB\-\-flashversion\fR num - Set Flash Version in the SWF header to num. -.TP -\fB\-F\fR, \fB\-\-fontdir\fR directory - Add directory to the font search path. -.TP -\fB\-b\fR, \fB\-\-defaultviewer\fR - Therefore the swf file will be "browseable", i.e. display some buttons for turning pages. - The viewer swf to be used is determined by a symlink named "default_viewer.swf" in - the swftools data directory. -.TP -\fB\-l\fR, \fB\-\-defaultloader\fR - The loader swf to be used is determined by a symlink named "default_loader.swf" in - the swftools data directory. -.TP -\fB\-B\fR, \fB\-\-viewer\fR filename - See http://www.quiss.org/swftools/pdf2swf_usage.html for information on how to create your own viewers. -.TP -\fB\-L\fR, \fB\-\-preloader\fR filename - filename is an arbitrary swf animation. -.TP -\fB\-q\fR, \fB\-\-quiet\fR - Suppress normal messages. Use -qq to suppress warnings, also. -.TP -\fB\-S\fR, \fB\-\-shapes\fR - Don't use SWF Fonts, but store everything as shape. -.TP -\fB\-f\fR, \fB\-\-fonts\fR - Store full fonts in SWF. (Don't reduce to used characters). -.TP -\fB\-G\fR, \fB\-\-flatten\fR - This usually makes the file faster to render and also usually smaller, but will increase - conversion time. -.TP -\fB\-I\fR, \fB\-\-info\fR - Don't do actual conversion, just display a list of all pages in the PDF. -.TP -\fB\-Q\fR, \fB\-\-maxtime\fR n - Abort conversion after n seconds. Only available on Unix. diff --git a/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.c b/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.c deleted file mode 100644 index 3b67bccbf..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/pdf2swf.c +++ /dev/null @@ -1,924 +0,0 @@ -/* pdf2swf.c - main routine for pdf2swf(1) - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include -#include "../config.h" -#ifdef HAVE_SIGNAL_H -#include -#endif -#ifdef HAVE_DIRENT_H -#include -#endif -#ifdef HAVE_MALLOC_H -#include -#endif - -#include "../lib/args.h" -#include "../lib/os.h" -#include "../lib/rfxswf.h" -#include "../lib/devices/swf.h" -#include "../lib/devices/polyops.h" -#include "../lib/devices/record.h" -#include "../lib/devices/rescale.h" -#include "../lib/gfxfilter.h" -#include "../lib/pdf/pdf.h" -#include "../lib/log.h" - -#define SWFDIR concatPaths(getInstallationPath(), "swfs") - -static gfxsource_t*driver = 0; -static gfxdevice_t*out = 0; - -static int maxwidth=0, maxheight=0; - -static char * outputname = 0; -static int loglevel = 3; -static char * pagerange = 0; -static char * filename = 0; -static char * password = 0; -static int zlib = 0; - -static char * preloader = 0; -static char * viewer = 0; -static int xnup = 1; -static int ynup = 1; - -static int info_only = 0; - -static int max_time = 0; - -static int flatten = 0; - -static char* filters = 0; - -char* fontpaths[256]; -int fontpathpos = 0; - -int move_x=0; -int move_y=0; -int custom_move = 0; -int clip_x1=0,clip_y1=0,clip_x2=0,clip_y2=0; -int custom_clip = 0; - -static int system_quiet=0; - -int systemf(const char* format, ...) -{ - char buf[1024]; - int ret; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - - if(!system_quiet) { - printf("%s\n", buf); - fflush(stdout); - } - ret = system(buf); - if(ret) { - fprintf(stderr, "system() returned %d\n", ret); - exit(ret); - } - return ret; -} - -#ifdef HAVE_SIGNAL_H -void sigalarm(int signal) -{ - msg(" Aborting rendering after %d seconds", max_time); -#if 0 && defined(HAVE_SYS_TIME_H) && defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRUSAGE) - struct rusage usage; - getrusage(RUSAGE_CHILDREN, &usage); - msg(" Memory used: %d,%d,%d", usage.ru_maxrss, usage.ru_idrss, usage.ru_isrss); -#endif -#if defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_H) - struct mallinfo info = mallinfo(); - msg(" Memory used: %d Mb (%d bytes)", info.uordblks/1048576, info.uordblks); -#endif - exit(1); -} -#endif - -typedef struct _parameter { - struct _parameter*next; - const char*name; - const char*value; -} parameter_t; - -static parameter_t* device_config = 0; -static parameter_t* device_config_next = 0; -static void store_parameter(const char*name, const char*value) -{ - parameter_t*o = device_config; - while(o) { - if(!strcmp(name, o->name)) { - /* overwrite old value */ - free((void*)o->value); - o->value = strdup(value); - return; - } - o = o->next; - } - parameter_t*p = (parameter_t*)malloc(sizeof(parameter_t)); - p->name = strdup(name); - p->value = strdup(value); - p->next = 0; - - if(device_config_next) { - device_config_next->next = p; - device_config_next = p; - } else { - device_config = p; - device_config_next = p; - } -} - -int args_callback_option(char*name,char*val) { - if (!strcmp(name, "o")) - { - outputname = val; - return 1; - } - else if (!strcmp(name, "v")) - { - loglevel ++; - setConsoleLogging(loglevel); - return 0; - } - else if (!strcmp(name, "2")) - { - xnup = 2; - ynup = 1; - return 0; - } - else if (!strcmp(name, "4")) - { - xnup = 2; - ynup = 2; - return 0; - } - else if (!strcmp(name, "9")) - { - xnup = 3; - ynup = 3; - return 0; - } - else if (!strcmp(name, "X")) - { - maxwidth = atoi(val); - return 1; - } - else if (!strcmp(name, "Y")) - { - maxheight = atoi(val); - return 1; - } - else if (!strcmp(name, "q")) - { - loglevel --; - setConsoleLogging(loglevel); - system_quiet = 1; - return 0; - } - else if (name[0]=='p') - { - /* check whether the page range follows the p directly, like - in -p1,2 */ - do { - name++; - } while(*name == 32 || *name == 13 || *name == 10 || *name == '\t'); - - if(*name) { - pagerange = name; - return 0; - } - pagerange = val; - return 1; - } - else if (!strcmp(name, "P")) - { - password = val; - return 1; - } - else if (!strcmp(name, "c")) - { - char*s = strdup(val); - char*x1 = strtok(s, ":"); - char*y1 = strtok(0, ":"); - char*x2 = strtok(0, ":"); - char*y2 = strtok(0, ":"); - if(!(x1 && y1 && x2 && y2)) { - fprintf(stderr, "-c option requires four arguments, :::\n"); - exit(1); - } - custom_clip = 1; - clip_x1 = atoi(x1); - clip_y1 = atoi(y1); - clip_x2 = atoi(x2); - clip_y2 = atoi(y2); - free(s); - return 1; - } - else if (!strcmp(name, "m")) - { - char*s = strdup(val); - char*c = strchr(s, ':'); - if(!c) { - fprintf(stderr, "-m option requires two arguments, :\n"); - exit(1); - } - *c = 0; - custom_move = 1; - move_x = atoi(val); - move_y = atoi(c+1); - free(s); - return 1; - } - else if (!strcmp(name, "s")) - { - char*s = val; - char*c = strchr(s, '='); - if(c && *c && c[1]) { - *c = 0; - c++; - store_parameter(s,c); - } else if(!strcmp(s,"help")) { - printf("PDF Parameters:\n"); - gfxsource_t*pdf = gfxsource_pdf_create(); - pdf->setparameter(pdf, "help", ""); - gfxdevice_t swf; - gfxdevice_swf_init(&swf); - printf("SWF Parameters:\n"); - swf.setparameter(&swf, "help", ""); - exit(0); - } else { - store_parameter(s,"1"); - } - return 1; - } - else if (!strcmp(name, "S")) - { - store_parameter("drawonlyshapes", "1"); - return 0; - } - else if (!strcmp(name, "i")) - { - store_parameter("ignoredraworder", "1"); - return 0; - } -#ifndef WIN32 - else if (!strcmp(name, "Q")) - { - max_time = atoi(val); - alarm(max_time); -# ifdef HAVE_SIGNAL_H - signal(SIGALRM, sigalarm); -# endif - return 1; - } -#endif - else if (!strcmp(name, "z")) - { - store_parameter("enablezlib", "1"); - zlib = 1; - return 0; - } - else if (!strcmp(name, "n")) - { - store_parameter("opennewwindow", "1"); - return 0; - } - else if (!strcmp(name, "I")) - { - info_only = 1; - return 0; - } - else if (!strcmp(name, "t")) - { - store_parameter("insertstop", "1"); - return 0; - } - else if (!strcmp(name, "T")) - { - if(!strcasecmp(val, "mx")) - store_parameter("flashversion", "6"); - else - store_parameter("flashversion", val); - - return 1; - } - else if (!strcmp(name, "f")) - { - store_parameter("storeallcharacters", "1"); - store_parameter("extrafontdata", "1"); - return 0; - } - else if (!strcmp(name, "ff")) - { - if(filters) { - // append this to the current filter expression (we allow more than one --filter) - int l = strlen(filters); - int new_len = l + strlen(val) + 2; - filters = (char*)realloc(filters, new_len); - filters[l] = ':'; - strcpy(filters+l+1, val); - } else { - filters = strdup(val); - } - return 1; - } - else if (!strcmp(name, "w")) - { - store_parameter("linksopennewwindow", "0"); - return 0; - } - else if (!strcmp(name, "O")) - { - int level = 1; - int ret=0; - if(val&& val[0] && val[1]==0 && isdigit(val[0])) { - level = atoi(val); - ret=1; - } - if(level>=1) - store_parameter("poly2bitmap", "1"); - if(level>=2) - store_parameter("bitmapfonts", "1"); - if(level>=3) - store_parameter("ignoredraworder", "1"); - return ret; - } - else if (!strcmp(name, "G")) - { - //store_parameter("optimize_polygons", "1"); - flatten = 1; - return 0; - } - else if (!strcmp(name, "F")) - { - char *s = strdup(val); - int l = strlen(s); - while(l && s[l-1]=='/') { - s[l-1] = 0; - l--; - } - fontpaths[fontpathpos++] = s; - return 1; - } - else if (!strcmp(name, "l")) - { - char buf[256]; - sprintf(buf, "%s/default_loader.swf", SWFDIR); - preloader = strdup(buf); - return 0; - } - else if (!strcmp(name, "b")) - { - char buf[256]; - sprintf(buf, "%s/default_viewer.swf", SWFDIR); - viewer = strdup(buf); - return 0; - } - else if (!strcmp(name, "L")) - { - if(val) - { - preloader = val; - } - else - { - systemf("ls %s/*_loader.swf", SWFDIR); - if(!system_quiet) - printf("\n"); - exit(1); - } - return 1; - } - else if (!strcmp(name, "B")) - { - if(val) - { - viewer = val; - } - else - { - systemf("ls %s/*_viewer.swf", SWFDIR); - if(!system_quiet) - printf("\n"); - exit(1); - } - return 1; - } - else if (!strcmp(name, "j")) - { - if(name[1]) { - store_parameter("jpegquality", &name[1]); - return 0; - } else { - store_parameter("jpegquality", val); - return 1; - } - } - else if (!strcmp(name, "V")) - { - printf("pdf2swf - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else - { - fprintf(stderr, "Unknown option: -%s\n", name); - exit(1); - } - return 0; -} - -static struct options_t options[] = { -{"h", "help"}, -{"V", "version"}, -{"o", "output"}, -{"p", "pages"}, -{"P", "password"}, -{"v", "verbose"}, -{"z", "zlib"}, -{"i", "ignore"}, -{"j", "jpegquality"}, -{"s", "set"}, -{"w", "samewindow"}, -{"t", "stop"}, -{"T", "flashversion"}, -{"F", "fontdir"}, -{"ff", "filter"}, -{"b", "defaultviewer"}, -{"l", "defaultloader"}, -{"B", "viewer"}, -{"L", "preloader"}, -{"q", "quiet"}, -{"S", "shapes"}, -{"f", "fonts"}, -{"G", "flatten"}, -{"I", "info"}, -{"Q", "maxtime"}, -{"X", "width"}, -{"Y", "height"}, -{0,0} -}; - -int args_callback_longoption(char*name,char*val) { - return args_long2shortoption(options, name, val); -} - -int args_callback_command(char*name, char*val) { - if (!filename) - filename = name; - else { - if(outputname) - { - fprintf(stderr, "Error: Do you want the output to go to %s or to %s?", - outputname, name); - exit(1); - } - outputname = name; - } - return 0; -} - -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-options] file.pdf -o file.swf\n", name); - printf("\n"); - printf("-h , --help Print short help message and exit\n"); - printf("-V , --version Print version info and exit\n"); - printf("-o , --output file.swf Direct output to file.swf. If file.swf contains '%%' (file%%.swf), then each page goes to a seperate file.\n"); - printf("-p , --pages range Convert only pages in range with range e.g. 1-20 or 1,4,6,9-11 or\n"); - printf("-P , --password password Use password for deciphering the pdf.\n"); - printf("-v , --verbose Be verbose. Use more than one -v for greater effect.\n"); - printf("-z , --zlib Use Flash 6 (MX) zlib compression.\n"); - printf("-i , --ignore Allows pdf2swf to change the draw order of the pdf. This may make the generated\n"); - printf("-j , --jpegquality quality Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85)\n"); - printf("-s , --set param=value Set a SWF encoder specific parameter. See pdf2swf -s help for more information.\n"); - printf("-w , --samewindow When converting pdf hyperlinks, don't make the links open a new window. \n"); - printf("-t , --stop Insert a stop() command in each page. \n"); - printf("-T , --flashversion num Set Flash Version in the SWF header to num.\n"); - printf("-F , --fontdir directory Add directory to the font search path.\n"); - printf("-b , --defaultviewer Link a standard viewer to the swf file. \n"); - printf("-l , --defaultloader Link a standard preloader to the swf file which will be displayed while the main swf is loading.\n"); - printf("-B , --viewer filename Link viewer filename to the swf file. \n"); - printf("-L , --preloader filename Link preloader filename to the swf file. \n"); - printf("-q , --quiet Suppress normal messages. Use -qq to suppress warnings, also.\n"); - printf("-S , --shapes Don't use SWF Fonts, but store everything as shape.\n"); - printf("-f , --fonts Store full fonts in SWF. (Don't reduce to used characters).\n"); - printf("-G , --flatten Remove as many clip layers from file as possible. \n"); - printf("-I , --info Don't do actual conversion, just display a list of all pages in the PDF.\n"); - printf("-Q , --maxtime n Abort conversion after n seconds. Only available on Unix.\n"); - printf("\n"); -} - -float getRate(char*filename) -{ - int fi; - SWF swf; - fi = open(filename,O_RDONLY|O_BINARY); - if(fi<0) { - char buffer[256]; - sprintf(buffer, "Couldn't open %s", filename); - perror(buffer); - exit(1); - } - if(swf_ReadSWF(fi,&swf) < 0) - { - fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); - close(fi); - exit(1); - } - swf_FreeTags(&swf); - return swf.frameRate / 256.0; -} - -void show_info(gfxsource_t*driver, char*filename) -{ - gfxdocument_t* pdf = driver->open(driver, filename); - int pagenr; - FILE*fo=0; - if(!pdf) { - msg(" Couldn't open %s", filename); - exit(1); - } - if(outputname) { - fo = fopen(outputname, "wb"); - if(!fo) { - perror(outputname);exit(1);; - } - } else { - fo = stdout; - } - - for(pagenr = 1; pagenr <= pdf->num_pages; pagenr++) - { - gfxpage_t*page = pdf->getpage(pdf,pagenr); - if(is_in_range(pagenr, pagerange)) { - fprintf(fo, "page=%d width=%.2f height=%.2f\n", pagenr, page->width, page->height); - } - } - pdf->destroy(pdf); -} - - -static gfxdevice_t swf,wrap,rescale; -gfxdevice_t*create_output_device() -{ - gfxdevice_swf_init(&swf); - - /* set up filter chain */ - - out = &swf; - if(flatten) { - gfxdevice_removeclippings_init(&wrap, &swf); - out = &wrap; - } - - if(maxwidth || maxheight) { - gfxdevice_rescale_init(&rescale, out, maxwidth, maxheight, 0); - out = &rescale; - } - - if(filters) { - gfxfilterchain_t*chain = gfxfilterchain_parse(filters); - if(!chain) { - fprintf(stderr, "Unable to parse filters: %s\n", filters); - exit(1); - } - out = gfxfilterchain_apply(chain, out); - gfxfilterchain_destroy(chain); - } - - /* pass global parameters to output device */ - parameter_t*p = device_config; - while(p) { - out->setparameter(out, p->name, p->value); - p = p->next; - } - return out; -} - -int main(int argn, char *argv[]) -{ - int ret; - char buf[256]; - int numfonts = 0; - int t; - char t1searchpath[1024]; - int nup_pos = 0; - int x,y; - int one_file_per_page = 0; - - initLog(0,-1,0,0,-1,loglevel); - - /* not needed anymore since fonts are embedded - if(installPath) { - fontpaths[fontpathpos++] = concatPaths(installPath, "fonts"); - }*/ - -#ifdef HAVE_SRAND48 - srand48(time(0)); -#else -#ifdef HAVE_SRAND - srand(time(0)); -#endif -#endif - - processargs(argn, argv); - - driver = gfxsource_pdf_create(); - - /* pass global parameters to PDF driver*/ - parameter_t*p = device_config; - while(p) { - driver->setparameter(driver, p->name, p->value); - p = p->next; - } - - if(!filename) - { - fprintf(stderr, "Please specify an input file\n"); - exit(1); - } - - if (!info_only) { - if(!outputname) - { - if(filename) { - outputname = stripFilename(filename, ".swf"); - msg(" Output filename not given. Writing to %s", outputname); - } - } - - if(!outputname) - { - fprintf(stderr, "Please use -o to specify an output file\n"); - exit(1); - } - } - - // test if the page range is o.k. - is_in_range(0x7fffffff, pagerange); - - if (!filename) { - args_callback_usage(argv[0]); - exit(0); - } - - char fullname[256]; - if(password && *password) { - sprintf(fullname, "%s|%s", filename, password); - filename = fullname; - } - - if(pagerange) - driver->setparameter(driver, "pages", pagerange); - - /* add fonts */ - for(t=0;tsetparameter(driver, "fontdir", fontpaths[t]); - } - - if(info_only) { - show_info(driver, filename); - return 0; - } - - char*u = 0; - if((u = strchr(outputname, '%'))) { - if(strchr(u+1, '%') || - strchr(outputname, '%')!=u) { - msg(" only one %% allowed in filename\n"); - return 1; - } - if(preloader || viewer) { - msg(" -b/-l/-B/-L not supported together with %% in filename\n"); - return 1; - } - msg(" outputting one file per page"); - one_file_per_page = 1; - char*pattern = (char*)malloc(strlen(outputname)+2); - /* convert % to %d */ - int l = u-outputname+1; - memcpy(pattern, outputname, l); - pattern[l]='d'; - strcpy(pattern+l+1, outputname+l); - outputname = pattern; - } - - gfxdocument_t* pdf = driver->open(driver, filename); - if(!pdf) { - msg(" Couldn't open %s", filename); - exit(1); - } - /* pass global parameters document */ - p = device_config; - while(p) { - pdf->setparameter(pdf, p->name, p->value); - p = p->next; - } - - struct mypage_t { - int x; - int y; - gfxpage_t*page; - } pages[4]; - - int pagenum = 0; - int frame = 1; - int pagenr; - - for(pagenr = 1; pagenr <= pdf->num_pages; pagenr++) - { - if(is_in_range(pagenr, pagerange)) { - char mapping[80]; - sprintf(mapping, "%d:%d", pagenr, frame); - pdf->setparameter(pdf, "pagemap", mapping); - pagenum++; - } - if(pagenum == xnup*ynup || (pagenr == pdf->num_pages && pagenum>1)) { - pagenum = 0; - frame++; - } - } - if(pagerange && !pagenum && frame==1) { - fprintf(stderr, "No pages in range %s", pagerange); - exit(1); - } - - pagenum = 0; - - gfxdevice_t*out = create_output_device();; - pdf->prepare(pdf, out); - - for(pagenr = 1; pagenr <= pdf->num_pages; pagenr++) - { - if(is_in_range(pagenr, pagerange)) { - gfxpage_t* page = pages[pagenum].page = pdf->getpage(pdf, pagenr); - pages[pagenum].x = 0; - pages[pagenum].y = 0; - pages[pagenum].page = page; - pagenum++; - } - if(pagenum == xnup*ynup || (pagenr == pdf->num_pages && pagenum>1)) { - - int t; - int xmax[xnup], ymax[xnup]; - int x,y; - int width=0, height=0; - - memset(xmax, 0, xnup*sizeof(int)); - memset(ymax, 0, ynup*sizeof(int)); - - for(y=0;ywidth > xmax[x]) - xmax[x] = (int)pages[t].page->width; - if(pages[t].page->height > ymax[y]) - ymax[y] = (int)pages[t].page->height; - } - for(x=0;xstartpage(out,clip_x2 - clip_x1, clip_y2 - clip_y1); - } else { - out->startpage(out,width,height); - } - for(t=0;t0?xmax[x-1]:0; - int ypos = y>0?ymax[y-1]:0; - msg(" Render (%d,%d) move:%d/%d\n", - (int)(pages[t].page->width + xpos), - (int)(pages[t].page->height + ypos), xpos, ypos); - pages[t].page->rendersection(pages[t].page, out, custom_move? move_x : xpos, - custom_move? move_y : ypos, - custom_clip? clip_x1 : 0 + xpos, - custom_clip? clip_y1 : 0 + ypos, - custom_clip? clip_x2 : pages[t].page->width + xpos, - custom_clip? clip_y2 : pages[t].page->height + ypos); - } - out->endpage(out); - for(t=0;tdestroy(pages[t].page); - } - pagenum = 0; - - if(one_file_per_page) { - gfxresult_t*result = out->finish(out);out=0; - char buf[1024]; - sprintf(buf, outputname, pagenr); - if(result->save(result, buf) < 0) { - return 1; - } - result->destroy(result);result=0; - out = create_output_device();; - msg(" Writing SWF file %s", buf); - } - } - } - - if(one_file_per_page) { - // remove empty device - gfxresult_t*result = out->finish(out);out=0; - result->destroy(result);result=0; - } else { - gfxresult_t*result = out->finish(out); - msg(" Writing SWF file %s", outputname); - if(result->save(result, outputname) < 0) { - exit(1); - } - int width = (int)(ptroff_t)result->get(result, "width"); - int height = (int)(ptroff_t)result->get(result, "height"); - result->destroy(result);result=0; - - if(preloader || viewer) { - const char*zip = ""; - if(zlib) { - zip = "-z"; - } - if(!preloader && viewer) { - systemf("swfcombine %s -X %d -Y %d \"%s\" viewport=\"%s\" -o \"%s\"",zip,width,height, - viewer, outputname, outputname); - if(!system_quiet) - printf("\n"); - } - if(preloader && !viewer) { - msg(" --preloader option without --viewer option doesn't make very much sense."); - ret = systemf("swfcombine %s -Y %d -X %d %s/PreLoaderTemplate.swf loader=\"%s\" movie=\"%s\" -o \"%s\"",zip,width,height, - SWFDIR, preloader, outputname, outputname); - if(!system_quiet) - printf("\n"); - } - if(preloader && viewer) { -#ifdef HAVE_MKSTEMP - char tmpname[] = "__swf__XXXXXX"; - mkstemp(tmpname); -#else - char*tmpname = "__tmp__.swf"; -#endif - systemf("swfcombine \"%s\" viewport=%s -o %s", - viewer, outputname, tmpname); - systemf("swfcombine %s -X %d -Y %d -r %f %s/PreLoaderTemplate.swf loader=%s movie=%s -o \"%s\"",zip,width,height, - getRate(preloader), SWFDIR, preloader, tmpname, outputname); - systemf("rm %s", tmpname); - } - } - } - - pdf->destroy(pdf); - driver->destroy(driver); - - - /* free global parameters */ - p = device_config; - while(p) { - parameter_t*next = p->next; - if(p->name) free((void*)p->name);p->name = 0; - if(p->value) free((void*)p->value);p->value =0; - p->next = 0;free(p); - p = next; - } - if(filters) { - free(filters); - } - - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/src/png2swf b/fluidbook/tools/swftools-special-swfdump/src/png2swf deleted file mode 100644 index 9b1c4c441917e751c1227cdcff322c91602da50d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144618 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 diff --git a/fluidbook/tools/swftools-special-swfdump/src/png2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/png2swf.1 deleted file mode 100644 index e69679f53..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/png2swf.1 +++ /dev/null @@ -1,58 +0,0 @@ -.TH png2swf "1" "April 2009" "png2swf" "swftools" -.SH NAME -png2swf - Takes a number of png files and converts them to a swf movie, one -picture per frame. - -.SH Synopsis -.B png2swf [-X width] [-Y height] [-o file.swf] [-r rate] file1.png [file2.png...] - -.SH DESCRIPTION -This tools converts png image files into an SWF animation. It takes any -number of input pictures, and converts them to SWF one-by-one, where every -converted picture is a seperate frame in the target SWF. -.PP -The way the -images are encoded in SWF is very similar to PNG (in that a zlib-based, lossless -compression algorithm is used). - -.SH OPTIONS -.TP -\fB\-r\fR, \fB\-\-rate\fR \fIframerate\fR - Set movie framerate (frames per second) -.TP -\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR - Explicitly specify output file. (Otherwise, output will go to stdout / output.swf) -.TP -\fB\-j\fR, \fB\-\-jpeg\fR \fIquality\fR - Generate a lossy jpeg bitmap inside the SWF, with a given quality (1-100) -.TP -\fB\-z\fR, \fB\-\-zlib\fR \fIzlib\fR - Use Flash MX (SWF 6) Zlib encoding for the output. The resulting SWF will be - smaller, but not playable in Flash Plugins of Version 5 and below. -.TP -\fB\-T\fR, \fB\-\-flashversion\fR - Set the flash version to generate -.TP -\fB\-X\fR, \fB\-\-pixel\fR \fIwidth\fR - Force movie width to \fIwidth\fR (default: autodetect) -.TP -\fB\-Y\fR, \fB\-\-pixel\fR \fIheight\fR - Force movie height to \fIheight\fR (default: autodetect) -.TP -\fB\-v\fR, \fB\-\-verbose\fR \fIlevel\fR - Set verbose level (0=quiet, 1=default, 2=debug) -.TP -\fB\-q\fR, \fB\-\-quiet\fR - Omit normal log messages, only log errors -.TP -\fB\-C\fR, \fB\-\-cgi\fR - For use as CGI- prepend http header, write to stdout -.TP -\fB\-V\fR, \fB\-\-version\fR - Print version information and exit -.TP -\fB\-s\fR, \fB\-\-scale\fR \fIpercent\fR - Scale image to \fIpercent\fR% size. -.SH AUTHOR - -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/png2swf.c b/fluidbook/tools/swftools-special-swfdump/src/png2swf.c deleted file mode 100644 index 92a71a592..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/png2swf.c +++ /dev/null @@ -1,824 +0,0 @@ -/* png2swf.c - - PNG to SWF converter tool - - Part of the swftools package. - - Copyright (c) 2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" -#include "../lib/log.h" -#include "../lib/png.h" - -#define MAX_INPUT_FILES 1024 -#define VERBOSE(x) (global.verbose>=x) - -static struct { - float framerate; - int max_image_width; - int max_image_height; - int force_width; - int force_height; - int nfiles; - int verbose; - int do_cgi; - int version; - char *outfile; - int mkjpeg; - float scale; -} global; - -static struct { - char *filename; -} image[MAX_INPUT_FILES]; - -static int custom_move=0; -static int move_x=0; -static int move_y=0; -static int clip_x1=0,clip_y1=0,clip_x2=0,clip_y2=0; -static int custom_clip = 0; - -TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) -{ - TAG *t; - RGBA rgb; - - memset(swf, 0x00, sizeof(SWF)); - - swf->fileVersion = global.version; - swf->frameRate = (int)(256.0 * framerate); - if(custom_clip) { - swf->movieSize.xmin = clip_x1 * 20; - swf->movieSize.ymin = clip_y1 * 20; - swf->movieSize.xmax = clip_x2 * 20; - swf->movieSize.ymax = clip_y2 * 20; - } else { - swf->movieSize.xmax = dx * 20; - swf->movieSize.ymax = dy * 20; - } - - t = swf->firstTag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); - - rgb.r = rgb.g = rgb.b = rgb.a = 0x00; - //rgb.g = 0xff; //<--- handy for testing alpha conversion - swf_SetRGB(t, &rgb); - - return t; -} - -int MovieFinish(SWF * swf, TAG * t, char *sname) -{ - int f, so = fileno(stdout); - t = swf_InsertTag(t, ST_END); - - if ((!isatty(so)) && (!sname)) - f = so; - else { - if (!sname) - sname = "output.swf"; - f = open(sname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - } - - if(global.do_cgi) { - if FAILED(swf_WriteCGI(swf)) fprintf(stderr,"WriteCGI() failed.\n"); - } else { - if (swf_WriteSWF(f, swf)<0) - fprintf(stderr, "Unable to write output file: %s\n", sname); - if (f != so) - close(f); - } - - swf_FreeTags(swf); - return 0; -} - -int png_read_chunk(char (*head)[4], int*destlen, U8**destdata, FILE*fi) -{ - unsigned int len; - if(destlen) *destlen=0; - if(destdata) *destdata=0; - if(!fread(&len, 4, 1, fi)) - return 0; - if(!fread(head, 4, 1, fi)) - return 0; - len = BE_32_TO_NATIVE(len); - if(destlen) *destlen = len; - if(destdata) { - if(len) - *destdata = malloc(len); - else - *destdata = 0; - if(!fread(*destdata, len, 1, fi)) { - *destdata = 0; - if(destlen) *destlen=0; - return 0; - } - fseek(fi, 4, SEEK_CUR); - - } else { - fseek(fi, len+4, SEEK_CUR); - } - return 1; -} - -unsigned int png_get_dword(FILE*fi) -{ - unsigned int a; - fread(&a,4,1,fi); - return BE_32_TO_NATIVE(a); -} - -struct png_header -{ - int width; - int height; - int bpp; - int mode; -}; - -int png_read_header(FILE*fi, struct png_header*header) -{ - char id[4]; - int len; - int ok=0; - U8 head[8] = {137,80,78,71,13,10,26,10}; - U8 head2[8]; - U8*data; - fread(head2,8,1,fi); - if(strncmp((char*)head,(char*)head2,4)) - return 0; - - while(png_read_chunk(&id, &len, &data, fi)) - { - if(VERBOSE(2)) - printf("%c%c%c%c %d\n", id[0],id[1],id[2],id[3],len); - if(!strncasecmp(id, "IHDR", 4)) { - char a,b,c,f,i; - if(len < 8) exit(1); - header->width = BE_32_TO_NATIVE(*(U32*)&data[0]); - header->height = BE_32_TO_NATIVE(*(U32*)&data[4]); - a = data[8]; // should be 8 - b = data[9]; // should be 3(indexed), 2(rgb), 0(grayscale) or 6(truecolor+alpha) - - c = data[10]; // compression mode (0) - f = data[11]; // filter mode (0) - i = data[12]; // interlace mode (0) - - if(VERBOSE(2)) printf("image mode:%d\n", b); - if(VERBOSE(2)) printf("bpp: %d\n", a); - if(VERBOSE(2)) printf("compression: %d\n", c); - if(VERBOSE(2)) printf("filter: %d\n", f); - if(VERBOSE(2)) printf("interlace: %d\n", i); - - if(b!=0 && b!=2 && b!=3 && b!=6) { - fprintf(stderr, "Image mode %d not supported!\n", b); - if(b == 4) { - fprintf(stderr, "(This is a grayscale image with alpha channel-\n"); - fprintf(stderr, " try converting it into an RGB image with alpha channel)\n"); - } - exit(1); - } - if(a!=8 && (b==2 || b==6)) { - fprintf(stderr, "Bpp %d in mode %d not supported!\n", b, a); - exit(1); - } - if(c!=0) { - fprintf(stderr, "Compression mode %d not supported!\n", c); - exit(1); - } - if(f!=0) { - fprintf(stderr, "Filter mode %d not supported!\n", f); - exit(1); - } - if(i!=0) { - fprintf(stderr, "Interlace mode %d not supported!\n", i); - exit(1); - } - if(VERBOSE(2)) - printf("%dx%d %d %d %d %d %d\n",header->width, header->height, a,b,c,f,i); - header->bpp = a; - header->mode = b; - ok = 1; - } - - free(data); - } - return ok; -} - -typedef unsigned char byte; -#define ABS(a) ((a)>0?(a):(-(a))) -byte inline PaethPredictor (byte a,byte b,byte c) -{ - // a = left, b = above, c = upper left - int p = a + b - c; // initial estimate - int pa = ABS(p - a); // distances to a, b, c - int pb = ABS(p - b); - int pc = ABS(p - c); - // return nearest of a,b,c, - // breaking ties in order a,b,c. - if (pa <= pb && pa <= pc) - return a; - else if (pb <= pc) - return b; - else return c; -} - -void applyfilter3(int mode, U8*src, U8*old, U8*dest, int width) -{ - int x; - unsigned char lastr=0; - unsigned char lastg=0; - unsigned char lastb=0; - unsigned char upperlastr=0; - unsigned char upperlastg=0; - unsigned char upperlastb=0; - - if(mode==0) { - for(x=0;x No jpeg support compiled in"); - } -#endif - if(global.mkjpeg) { -#ifdef HAVE_JPEGLIB - RGBA*data = 0; - png_load(sname, &width, &height, (unsigned char**)&data); - if(!data) - exit(1); - if(swf_ImageHasAlpha(data, width, height)) { - t = swf_InsertTag(t, ST_DEFINEBITSJPEG3); - swf_SetU16(t, id); - swf_SetJPEGBits3(t, width,height,data,global.mkjpeg); - } else { - t = swf_InsertTag(t, ST_DEFINEBITSJPEG2); - swf_SetU16(t, id); - swf_SetJPEGBits2(t, width,height,data,global.mkjpeg); - } -#endif - } else { - RGBA*data = 0; - png_load(sname, &width, &height, (unsigned char**)&data); - if(!data) - exit(1); - t = swf_InsertTag(t, ST_DEFINEBITSLOSSLESS); - swf_SetU16(t, id); - swf_SetLosslessImage(t, data,width,height); - } - - t = swf_InsertTag(t, ST_DEFINESHAPE3); - - swf_ShapeNew(&s); - swf_GetMatrix(NULL, &m); - m.sx = (int)(20 * 0x10000); - m.sy = (int)(20 * 0x10000); - m.tx = 0; - m.ty = 0; - fs = swf_ShapeAddBitmapFillStyle(s, &m, id, 1); - - swf_SetU16(t, id + 1); // id - - r.xmin = r.ymin = 0; - r.xmax = width * 20; - r.ymax = height * 20; - swf_SetRect(t, &r); - - swf_SetShapeHeader(t, s); - - swf_ShapeSetAll(t, s, 0, 0, 0, fs, 0); - swf_ShapeSetLine(t, s, r.xmax, 0); - swf_ShapeSetLine(t, s, 0, r.ymax); - swf_ShapeSetLine(t, s, -r.xmax, 0); - swf_ShapeSetLine(t, s, 0, -r.ymax); - - swf_ShapeSetEnd(t); - - t = swf_InsertTag(t, ST_REMOVEOBJECT2); - swf_SetU16(t, 50); // depth - - t = swf_InsertTag(t, ST_PLACEOBJECT2); - - swf_GetMatrix(NULL, &m); - m.sx = (int)(0x10000 * global.scale); - m.sy = (int)(0x10000 * global.scale); - - if(custom_move) { - m.tx = move_x*20; - m.ty = move_y*20; - } else { - m.tx = (swf->movieSize.xmax - (int) (width * global.scale * 20)) / 2; - m.ty = (swf->movieSize.ymax - (int) (height * global.scale * 20)) / 2; - } - swf_ObjectPlace(t, id + 1, 50, &m, NULL, NULL); - - t = swf_InsertTag(t, ST_SHOWFRAME); - - return t; -} - - -int CheckInputFile(char *fname, char **realname) -{ - FILE *fi; - char *s = malloc(strlen(fname) + 5); - struct png_header head; - - if (!s) - exit(2); - (*realname) = s; - strcpy(s, fname); - - // Check whether file exists (with typical extensions) - - if ((fi = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.png", fname); - if ((fi = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.PNG", fname); - if ((fi = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.Png", fname); - if ((fi = fopen(s, "rb")) == NULL) { - fprintf(stderr, "Couldn't open %s!\n", fname); - return -1; - } - } - } - } - - if(!png_read_header(fi, &head)) { - fprintf(stderr, "%s is not a PNG file!\n", fname); - return -1; - } - - if (global.max_image_width < head.width) - global.max_image_width = head.width; - if (global.max_image_height < head.height) - global.max_image_height = head.height; - - fclose(fi); - - return 0; -} - -int args_callback_option(char *arg, char *val) -{ - int res = 0; - if (arg[1]) - res = -1; - else - switch (arg[0]) { - case 'r': - if (val) - global.framerate = atof(val); - /* removed framerate>0 restriction in order to make - Flash Communication Server compatible SWFs */ - if ((global.framerate < 0) ||(global.framerate >= 256.0)) { - if (VERBOSE(1)) - fprintf(stderr, - "Error: You must specify a valid framerate between 1/256 and 255.\n"); - exit(1); - } - res = 1; - break; - - case 'o': - if (val) - global.outfile = val; - res = 1; - break; - - case 's': - global.scale = atof(val)/100; - res = 1; - break; - - case 'z': - if(global.version<6) - global.version = 6; - res = 0; - break; - - case 'j': - global.mkjpeg = atoi(val); - res = 1; - break; - - case 'T': - global.version = atoi(val); - res = 1; - break; - - case 'C': - global.do_cgi = 1; - break; - - case 'v': - global.verbose++; - res = 0; - break; - - case 'q': - global.verbose--; - if(global.verbose<0) - global.verbose = 0; - res = 0; - break; - - case 'X': - if (val) - global.force_width = atoi(val); - res = 1; - break; - - case 'Y': - if (val) - global.force_height = atoi(val); - res = 1; - break; - - case 'V': - printf("png2swf - part of %s %s\n", PACKAGE, VERSION); - exit(0); - - case 'c': { - char*s = strdup(val); - char*x1 = strtok(s, ":"); - char*y1 = strtok(0, ":"); - char*x2 = strtok(0, ":"); - char*y2 = strtok(0, ":"); - if(!(x1 && y1 && x2 && y2)) { - fprintf(stderr, "-m option requires four arguments, :::\n"); - exit(1); - } - custom_clip = 1; - clip_x1 = atoi(x1); - clip_y1 = atoi(y1); - clip_x2 = atoi(x2); - clip_y2 = atoi(y2); - free(s); - - res = 1; - break; - } - - case 'm': { - char*s = strdup(val); - char*c = strchr(s, ':'); - if(!c) { - fprintf(stderr, "-m option requires two arguments, :\n"); - exit(1); - } - *c = 0; - custom_move = 1; - move_x = atoi(val); - move_y = atoi(c+1); - free(s); - - res = 1; - break; - } - - default: - res = -1; - break; - } - - if (res < 0) { - if (VERBOSE(1)) - fprintf(stderr, "Unknown option: -%s\n", arg); - exit(1); - return 0; - } - return res; -} - -static struct options_t options[] = { -{"r", "rate"}, -{"o", "output"}, -{"j", "jpeg"}, -{"z", "zlib"}, -{"T", "flashversion"}, -{"X", "pixel"}, -{"Y", "pixel"}, -{"v", "verbose"}, -{"q", "quiet"}, -{"C", "cgi"}, -{"V", "version"}, -{"s", "scale"}, -{0,0} -}; - -int args_callback_longoption(char *name, char *val) -{ - return args_long2shortoption(options, name, val); -} - -int args_callback_command(char *arg, char *next) // actually used as filename -{ - char *s; - if (CheckInputFile(arg, &s) < 0) { - if (VERBOSE(1)) - fprintf(stderr, "Error opening input file: %s\n", arg); - free(s); - } else { - image[global.nfiles].filename = s; - global.nfiles++; - if (global.nfiles >= MAX_INPUT_FILES) { - if (VERBOSE(1)) - fprintf(stderr, "Error: Too many input files.\n"); - exit(1); - } - } - return 0; -} - -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-X width] [-Y height] [-o file.swf] [-r rate] file1.png [file2.png...]\n", name); - printf("\n"); - printf("-r , --rate Set movie framerate (frames per second)\n"); - printf("-o , --output Set name for SWF output file.\n"); - printf("-j , --jpeg Generate a lossy jpeg bitmap inside the SWF, with a given quality (1-100)\n"); - printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); - printf("-T , --flashversion Set the flash version to generate\n"); - printf("-X , --pixel Force movie width to (default: autodetect)\n"); - printf("-Y , --pixel Force movie height to (default: autodetect)\n"); - printf("-v , --verbose Set verbose level (0=quiet, 1=default, 2=debug)\n"); - printf("-q , --quiet Omit normal log messages, only log errors\n"); - printf("-C , --cgi For use as CGI- prepend http header, write to stdout\n"); - printf("-V , --version Print version information and exit\n"); - printf("-s , --scale Scale image to %% size.\n"); - printf("\n"); -} - -int main(int argc, char **argv) -{ - SWF swf; - TAG *t; - - memset(&global, 0x00, sizeof(global)); - - global.framerate = 1.0; - global.verbose = 1; - global.version = 8; - global.scale = 1.0; - - processargs(argc, argv); - - if(global.nfiles<=0) { - fprintf(stderr, "No png files found in arguments\n"); - return 1; - } - - if (VERBOSE(2)) - fprintf(stderr, "Processing %i file(s)...\n", global.nfiles); - - t = MovieStart(&swf, global.framerate, - global.force_width ? global.force_width : (int)(global.max_image_width*global.scale), - global.force_height ? global.force_height : (int)(global.max_image_height*global.scale)); - - { - int i; - for (i = 0; i < global.nfiles; i++) { - if (VERBOSE(3)) - fprintf(stderr, "[%03i] %s\n", i, - image[i].filename); - t = MovieAddFrame(&swf, t, image[i].filename, (i * 2) + 1); - free(image[i].filename); - } - } - - MovieFinish(&swf, t, global.outfile); - - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbbox b/fluidbook/tools/swftools-special-swfdump/src/swfbbox deleted file mode 100644 index 097890b6d49e189fe12a0d7852f30e9de5959d41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799921 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

PVC#zTXj;u(tW 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 z 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 Awg3PC diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbbox.1 b/fluidbook/tools/swftools-special-swfdump/src/swfbbox.1 deleted file mode 100644 index 636a3b101..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfbbox.1 +++ /dev/null @@ -1,47 +0,0 @@ -.TH swfbbox "1" "April 2009" "swfbbox" "swftools" -.SH NAME -swfbbox - Tool for playing around with SWF bounding boxes. - -.SH Synopsis -.B swfbbox [-OS] file.swf - -.SH DESCRIPTION -This tool can, among others, recalculate some bounding boxes of SWFs -in order to speed them up or make them smaller. -.PP -It can also dump the corners of the bounding boxes of all frames of a movie. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR - Print help and exit -.TP -\fB\-b\fR, \fB\-\-bbox\fR - Show movie bounding box (default) -.TP -\fB\-B\fR, \fB\-\-newbbox\fR - Show recalculated (optimized/expanded) bounding box -.TP -\fB\-e\fR, \fB\-\-expand\fR - Write out a new file using the recalculated header bounding box -.TP -\fB\-O\fR, \fB\-\-optimize\fR - Recalculate all object bounding boxes (except for the header) -.TP -\fB\-S\fR, \fB\-\-swifty\fR - Print out transformed bounding boxes -.TP -\fB\-c\fR, \fB\-\-clip\fR - Clip bounding boxes to movie size -.TP -\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR - Set output filename to \fIfilename\fR (for -O) -.TP -\fB\-v\fR, \fB\-\-verbose\fR - Be more verbose -.TP -\fB\-V\fR, \fB\-\-version\fR - Print program version and exit -.SH AUTHOR - -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbbox.c b/fluidbook/tools/swftools-special-swfdump/src/swfbbox.c deleted file mode 100644 index 9eafc24a6..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfbbox.c +++ /dev/null @@ -1,702 +0,0 @@ -/* swfbbox.c - Tool for playing around with SWF bounding boxes. - - Part of the swftools package. - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../config.h" -#include -#include -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" -#include "../lib/log.h" - -static char * filename = 0; -static char * outfilename = "output.swf"; -static int optimize = 0; -static int swifty = 0; -static int verbose = 0; -static int showbbox = 0; -static int showorigbbox = 1; -static int expand = 0; -static int clip = 0; -static int checkclippings = 0; - -static struct options_t options[] = { -{"h", "help"}, -{"b", "bbox"}, -{"B", "newbbox"}, -{"e", "expand"}, -{"O", "optimize"}, -{"S", "swifty"}, -{"c", "clip"}, -{"o", "output"}, -{"v", "verbose"}, -{"V", "version"}, -{0,0} -}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("swfbbox - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else if(!strcmp(name, "b")) { - showorigbbox = 2; - if(showbbox == 1) showbbox = 0; - return 0; - } - else if(!strcmp(name, "B")) { - showbbox = 2; - return 0; - } - else if(!strcmp(name, "O")) { - optimize = 1; - if(showorigbbox == 1) showorigbbox = 0; - return 0; - } - else if(!strcmp(name, "S")) { - swifty = 1; - if(showorigbbox == 1) showorigbbox = 0; - return 0; - } - else if(!strcmp(name, "c")) { - if(showorigbbox == 1) showorigbbox = 0; - clip = 1; - return 0; - } - else if(!strcmp(name, "v")) { - verbose ++; - return 0; - } - else if(!strcmp(name, "q")) { - if(verbose) - verbose --; - return 0; - } - else if(!strcmp(name, "Q")) { - /* DEPRECATED- was used for testing the bbox-clip feature - of pdf2swf */ - if(showorigbbox == 1) showorigbbox = 0; - checkclippings = 1; - return 0; - } - else if(!strcmp(name, "e")) { - expand = 1; - return 0; - } - else if(!strcmp(name, "o")) { - outfilename = val; - return 1; - } - else { - printf("Unknown option: -%s\n", name); - exit(1); - } - - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-OS] file.swf\n", name); - printf("\n"); - printf("-h , --help Print help and exit\n"); - printf("-b , --bbox Show movie bounding box (default)\n"); - printf("-B , --newbbox Show recalculated (optimized/expanded) bounding box\n"); - printf("-e , --expand Write out a new file using the recalculated header bounding box\n"); - printf("-O , --optimize Recalculate all object bounding boxes (except for the header)\n"); - printf("-S , --swifty Print out transformed bounding boxes\n"); - printf("-c , --clip Clip bounding boxes to movie size\n"); - printf("-o , --output Set output filename to (for -O)\n"); - printf("-v , --verbose Be more verbose\n"); - printf("-V , --version Print program version and exit\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", - filename, name); - } - filename = name; - return 0; -} - -#define swf_ResetReadBits(tag) if (tag->readBit) { tag->pos++; tag->readBit = 0; } - -void swf_Shape2Optimize(SHAPE2*shape) -{ - if(!shape->bbox) - shape->bbox = malloc(sizeof(SRECT)); - *(shape->bbox) = swf_GetShapeBoundingBox(shape); -} - -/* - {char {x1 y1 x2 y2 x3 y3 x4 y4]] -*/ - -SRECT bboxes[65536]; -U16 depth2id[65536]; -char*depth2name[65536]; - -int hasid(TAG*tag) -{ - if(tag->id == ST_PLACEOBJECT) - return 1; - if(tag->id == ST_PLACEOBJECT2 && (tag->data[0] & 2)) - return 1; - if(tag->id == ST_PLACEOBJECT3 && (tag->data[0] & 2)) - return 1; - return 0; -} - -int hasname(TAG*tag) -{ - if(tag->id == ST_PLACEOBJECT) - return 0; - if(tag->id == ST_PLACEOBJECT2 && (tag->data[0] & 0x20)) - return 1; - if(tag->id == ST_PLACEOBJECT3 && (tag->data[0] & 0x20)) - return 1; - return 0; -} - -char* getname(TAG*tag) -{ - if(tag->id == ST_PLACEOBJECT) - return 0; - if(tag->id == ST_PLACEOBJECT2 && (tag->data[0] & 0x20)) { - SWFPLACEOBJECT o; - tag->pos = 0;tag->readBit = 0; - swf_GetPlaceObject(tag, &o); - return o.name; - } - if(tag->id == ST_PLACEOBJECT3 && (tag->data[0] & 0x20)) { - SWFPLACEOBJECT o; - tag->pos = 0;tag->readBit = 0; - swf_GetPlaceObject(tag, &o); - return o.name; - } - return 0; -} - -MATRIX getmatrix(TAG*tag) -{ - SWFPLACEOBJECT o; - tag->pos = 0;tag->readBit = 0; - swf_GetPlaceObject(tag, &o); - return o.matrix; -} - - -static int fontnum = -1; -static SWFFONT**fonts; -static SWF*c_swf; -static void fontcallback1(void*self, U16 id,U8 * name) -{ fontnum++; -} -static void fontcallback2(void*self, U16 id,U8 * name) -{ - fonts[fontnum] = 0; - swf_FontExtract(c_swf,id,&fonts[fontnum]); - if(verbose) { - if(fonts[fontnum]) printf("Extracting font %d (%s)\n", id, name); - else printf("Extracting font %d (%s) failed\n", id, name); - fflush(stdout); - } - fontnum++; -} -typedef struct _textbounds -{ - SRECT r; - MATRIX m; // character transform matrix -} textbounds_t; - -typedef struct _placement -{ - SWFPLACEOBJECT* po; - int num; -} placement_t; - -static placement_t* placements; - -static placement_t* readPlacements(SWF*swf) -{ - placement_t* p = (placement_t*)rfx_calloc(sizeof(placement_t)*65536); - TAG*tag = swf->firstTag; - while(tag) { - if(swf_isPlaceTag(tag)) { - SWFPLACEOBJECT*po = rfx_alloc(sizeof(SWFPLACEOBJECT)); - int id; - swf_GetPlaceObject(tag, po); - id = po->id; - if(po->move) { - fprintf(stderr, "MOVE tags not supported with -c"); - } - p[id].po = po; - p[id].num++; - } - tag = tag->next; - } - - return p; -} - -static void freePlacements(placement_t*p) -{ - int t; - for(t=0;t<65536;t++) { - if(p[t].po) { - swf_PlaceObjectFree(p[t].po); p[t].po = 0; - } - } - rfx_free(p); -} - -static SRECT clipBBox(TAG*tag, SRECT mbbox, SRECT r) -{ - int id = swf_GetDefineID(tag); - MATRIX m; - if(!placements[id].po) { - if(verbose) - printf("Id %d is never set\n", id); - return r; - } - if(placements[id].num>1) { - if(verbose) - printf("Id %d is set more than once\n", id); - return r; - } - m = placements[id].po->matrix; - if(m.r0 || m.r1) { - fprintf(stderr, "Rotating PLACEOBJECTS are not supported with -c\n"); - return r; - } - - if(verbose) { - printf("ID %d\n", id); - swf_DumpMatrix(stdout, &m); - } - mbbox.xmin -= m.tx; - mbbox.ymin -= m.ty; - mbbox.xmax -= m.tx; - mbbox.ymax -= m.ty; - mbbox.xmin *= 65536.0/m.sx; - mbbox.xmax *= 65536.0/m.sx; - mbbox.ymin *= 65536.0/m.sy; - mbbox.ymax *= 65536.0/m.sy; - - if(verbose) { - printf("border: %f/%f/%f/%f - rect: %f/%f/%f/%f\n", - mbbox.xmin /20.0, - mbbox.ymin /20.0, - mbbox.xmax /20.0, - mbbox.ymax /20.0, - r.xmin /20.0, - r.ymin /20.0, - r.xmax /20.0, - r.ymax /20.0); - } - - if(checkclippings) { - int clip = 0; - if(r.xmax > mbbox.xmax) clip += r.xmax - mbbox.xmax; - if(r.ymax > mbbox.ymax) clip += r.ymax - mbbox.ymax; - if(r.xmax < mbbox.xmin) clip += -(r.xmax - mbbox.xmin); - if(r.ymax < mbbox.ymin) clip += -(r.ymax - mbbox.ymin); - - if(r.xmin > mbbox.xmax) clip += r.xmin = mbbox.xmax; - if(r.ymin > mbbox.ymax) clip += r.ymin = mbbox.ymax; - if(r.xmin < mbbox.xmin) clip += -(r.xmin = mbbox.xmin); - if(r.ymin < mbbox.ymin) clip += -(r.ymin = mbbox.ymin); - if(clip > 3*20) { - printf("needs clipping: [%.2f %.2f %2.f %2.f] is outside [%.2f %2.f %2.f %2.f]\n", - r.xmin / 20.0, r.ymin / 20.0, r.xmax / 20.0, r.ymax / 20.0, - mbbox.xmin / 20.0, mbbox.ymin / 20.0, mbbox.xmax / 20.0, mbbox.ymax / 20.0 - ); - } - } - - r = swf_ClipRect(mbbox, r); - - if(verbose) { - printf("new rect: %f/%f/%f/%f\n", - r.xmin /20.0, - r.ymin /20.0, - r.xmax /20.0, - r.ymax /20.0); - } - - return r; -} - - -static void textcallback(void*self, int*chars, int*xpos, int nr, int fontid, int fontsize, - int xstart, int ystart, RGBA* color) -{ - textbounds_t * bounds = (textbounds_t*)self; - SWFFONT*font = 0; - int t; - for(t=0;tid == fontid) { - font = fonts[t]; - break; - } - } - if(!font) { - fprintf(stderr, "Font %d unknown\n", fontid); - exit(1); - } - if(!font->layout) { - /* This is an expensive operation- but what should we do, we - need the glyph's bounding boxes */ - swf_FontCreateLayout(font); - } - - if(verbose) - printf("%d chars, font %d, size %d, at (%d,%d)\n", nr, fontid, fontsize, xstart, ystart); - - for(t=0;tlayout->bounds[chars[t]]; - MATRIX m = bounds->m; - SPOINT p; - - if(chars[t] < font->numchars && font->glyph2ascii) { - ch = font->glyph2ascii[chars[t]]; - } - - p.x = x; p.y = y; - p = swf_TurnPoint(p, &m); - - m.sx = (m.sx * fontsize) / 1024; - m.sy = (m.sy * fontsize) / 1024; - m.r0 = (m.r0 * fontsize) / 1024; - m.r1 = (m.r1 * fontsize) / 1024; - - m.tx += p.x; - m.ty += p.y; - newglyphbbox = swf_TurnRect(glyphbbox, &m); - - if(ch<32) ch='?'; - - swf_ExpandRect2(&(bounds->r), &newglyphbbox); - if(verbose >= 2) { - printf("%5d %c, %d %d %d %d (%d %d %d %d) -> %d %d %d %d\n", - xpos[t], ch, - glyphbbox.xmin, glyphbbox.ymin, glyphbbox.xmax, glyphbbox.ymax, - newglyphbbox.xmin, newglyphbbox.ymin, newglyphbbox.xmax, newglyphbbox.ymax, - bounds->r.xmin, bounds->r.ymin, bounds->r.xmax, bounds->r.ymax); - } - - } -} - -static void swf_OptimizeBoundingBoxes(SWF*swf) -{ - TAG* tag = swf->firstTag; - - while (tag) { - if (tag->id == ST_DEFINESHAPE || - tag->id == ST_DEFINESHAPE2 || - tag->id == ST_DEFINESHAPE3 || - tag->id == ST_DEFINESHAPE4) { - SHAPE2 s; - if(verbose) printf("%s\n", swf_TagGetName(tag)); - swf_ParseDefineShape(tag, &s); - if(optimize) - swf_Shape2Optimize(&s); - tag->len = 2; - tag->pos = 0; - if(!s.bbox) { - fprintf(stderr, "Internal error (5)\n"); - exit(1); - } - if(clip || checkclippings) { - *s.bbox = clipBBox(tag, swf->movieSize, *s.bbox); - } - swf_SetShape2(tag, &s); - } - if (tag->id == ST_DEFINETEXT || tag->id == ST_DEFINETEXT2) { - SRECT oldbox; - int matrix_offset; - int len; - U8*data; - textbounds_t bounds; - if(verbose) printf("%s\n", swf_TagGetName(tag)); - if(fontnum < 0) { - if(verbose) printf("Extracting fonts...\n"); - c_swf = swf; - fontnum = 0; - swf_FontEnumerate(swf,&fontcallback1,0); - fonts = (SWFFONT**)malloc(fontnum*sizeof(SWFFONT*)); - memset(fonts, 0, fontnum*sizeof(SWFFONT*)); - fontnum = 0; - swf_FontEnumerate(swf,&fontcallback2,0); - } - - memset(&bounds, 0, sizeof(bounds)); - - swf_SetTagPos(tag, 0); - swf_GetU16(tag); - swf_GetRect(tag,&oldbox); - swf_ResetReadBits(tag); - matrix_offset = tag->pos; - swf_GetMatrix(tag,&bounds.m); - swf_ParseDefineText(tag, textcallback, &bounds); - if(verbose) { - printf("\n"); - swf_DumpMatrix(stdout, &bounds.m); - printf("old: %d %d %d %d\n", oldbox.xmin, oldbox.ymin, oldbox.xmax, oldbox.ymax); - printf("new: %d %d %d %d\n", bounds.r.xmin, bounds.r.ymin, bounds.r.xmax, bounds.r.ymax); - } - if(!optimize) - bounds.r = oldbox; //set to old bounds from the tag header - if(clip || checkclippings) { - bounds.r = clipBBox(tag, swf->movieSize, bounds.r); - } - - /* now comes the tricky part: - we have to fiddle the data back in - thank heavens that the bbox is follow by a matrix - struct, which always starts on a byte boundary. - */ - len = tag->len - matrix_offset; - data = malloc(len); - memcpy(data, &tag->data[matrix_offset], len); - tag->writeBit = 0; - tag->len = 2; - swf_SetRect(tag, &bounds.r); - swf_SetBlock(tag, data, len); - free(data); - tag->pos = tag->readBit = 0; - } - tag = tag->next; - } -} - -static void showSwiftyOutput(SWF*swf) -{ - TAG*tag = swf->firstTag; - int frame=0; - printf("{\n\t{frame %d}\n", frame++); - - while (tag) { - if (tag->id == ST_SHOWFRAME) { - printf("}\n{\n\t{frame %d}\n", frame++); - } - if (swf_isPlaceTag(tag)) { - if(hasid(tag)) { - depth2id[swf_GetDepth(tag)] = swf_GetPlaceID(tag); - } - if(hasname(tag)) { - depth2name[swf_GetDepth(tag)] = getname(tag); - } - } - if (swf_isPlaceTag(tag)) { - MATRIX m = getmatrix(tag); - U16 id = depth2id[swf_GetDepth(tag)]; - char*name = depth2name[swf_GetDepth(tag)]; - char buf[40]; - SRECT bbox = bboxes[id]; - SPOINT p1,p2,p3,p4; - p1.x = bbox.xmin; p1.y = bbox.ymin; - p2.x = bbox.xmax; p2.y = bbox.ymin; - p3.x = bbox.xmin; p3.y = bbox.ymax; - p4.x = bbox.xmax; p4.y = bbox.ymax; - p1 = swf_TurnPoint(p1, &m); - p2 = swf_TurnPoint(p2, &m); - p3 = swf_TurnPoint(p3, &m); - p4 = swf_TurnPoint(p4, &m); - if(!name) { - sprintf(buf, "ID%d", id);name = buf; - } - //printf("\t#%.4f %.4f %.4f %.4f | %.4f %.4f\n", m.sx/65536.0, m.r1/65536.0, m.r0/65536.0, m.sy/65536.0, m.tx/20.0, m.ty/20.0); - printf("\t{%s {%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f}}\n", name, - p1.x/20.0, p1.y/20.0, p2.x/20.0, p2.y/20.0, - p3.x/20.0, p3.y/20.0, p4.x/20.0, p4.y/20.0); - } - tag = tag->next; - } - printf("}\n"); -} -static SRECT getMovieClipBBox(TAG*tag) -{ - //TAG*tag = swf->firstTag; - int frame=0; - SRECT movieSize; - U16 depth2id[65536]; - memset(depth2id, 0, sizeof(depth2id)); - - memset(&movieSize,0,sizeof(SRECT)); - - while (tag && tag->id != ST_END) { - if (swf_isPlaceTag(tag)) { - if(hasid(tag)) { - depth2id[swf_GetDepth(tag)] = swf_GetPlaceID(tag); - } - } - if (swf_isPlaceTag(tag)) { - MATRIX m = getmatrix(tag); - U16 id = depth2id[swf_GetDepth(tag)]; - SRECT bbox = bboxes[id]; - - SRECT tbbox = swf_TurnRect(bbox, &m); - swf_ExpandRect2(&movieSize, &tbbox); - } - tag = tag->next; - } - return movieSize; -} - -static SRECT getSWFBBox(SWF*swf) -{ - SRECT movieSize = getMovieClipBBox(swf->firstTag); - - return movieSize; -} - -int main (int argc,char ** argv) -{ - TAG*tag; - SWF swf; - int fi; - SRECT oldMovieSize; - SRECT newMovieSize; - memset(bboxes, 0, sizeof(bboxes)); - memset(depth2name, 0, sizeof(depth2name)); - - processargs(argc, argv); - initLog(0,0,0,0,0,verbose?LOGLEVEL_DEBUG:LOGLEVEL_WARNING); - - if(!filename) { - fprintf(stderr, "You must supply a filename.\n"); - return 1; - } - - fi = open(filename,O_RDONLY|O_BINARY); - - if (fi<0) - { - perror("Couldn't open file: "); - exit(1); - } - if FAILED(swf_ReadSWF(fi,&swf)) - { - fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); - close(fi); - exit(1); - } - close(fi); - - swf_OptimizeTagOrder(&swf); - - if(clip || checkclippings) { - placements = readPlacements(&swf); - } - - swf_FoldAll(&swf); - - /* Optimize bounding boxes in case -O flag was set */ - if(optimize || checkclippings || clip) { - swf_OptimizeBoundingBoxes(&swf); - } - - /* Create an ID to Bounding Box table */ - tag = swf.firstTag; - while (tag) { - if(swf_isDefiningTag(tag)) { - int id = swf_GetDefineID(tag); - if(tag->id != ST_DEFINESPRITE) { - bboxes[id] = swf_GetDefineBBox(tag); - } else { - swf_UnFoldSprite(tag); - bboxes[id] = getMovieClipBBox(tag); - swf_FoldSprite(tag); - if(verbose) { - printf("sprite %d is %.2fx%.2f\n", id, - (bboxes[id].xmax - bboxes[id].xmin)/20.0, - (bboxes[id].ymax - bboxes[id].ymin)/20.0); - } - } - } - tag = tag->next; - } - - /* Create an ID->Bounding Box table for all bounding boxes */ - if(swifty) { - showSwiftyOutput(&swf); - } - - oldMovieSize = swf.movieSize; - newMovieSize = getSWFBBox(&swf); - - if(optimize || expand) { - - if(expand) - swf.movieSize = newMovieSize; - - fi = open(outfilename, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666); - if(swf_WriteSWF(fi, &swf) < 0) { - fprintf(stderr, "Error writing file %s", outfilename); - close(fi); - exit(1); - } - close(fi); - } - - if(showbbox) { - if(verbose>=0) - printf("Real Movie Size (size of visible objects): "); - printf("%.2f x %.2f :%.2f :%.2f\n", - (newMovieSize.xmax-newMovieSize.xmin)/20.0, - (newMovieSize.ymax-newMovieSize.ymin)/20.0, - (newMovieSize.xmin)/20.0, - (newMovieSize.ymin)/20.0 - ); - } - if(showorigbbox) { - if(verbose>=0) - printf("Movie Size accordings to file header: "); - printf("%.2f x %.2f :%.2f :%.2f\n", - (oldMovieSize.xmax-oldMovieSize.xmin)/20.0, - (oldMovieSize.ymax-oldMovieSize.ymin)/20.0, - (oldMovieSize.xmin)/20.0, - (oldMovieSize.ymin)/20.0 - ); - } - - swf_FreeTags(&swf); - - if(placements) { - freePlacements(placements); - } - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbytes b/fluidbook/tools/swftools-special-swfdump/src/swfbytes deleted file mode 100644 index 7f2b7f918c7d60c8e127ab3cd638744a1f35cba4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83921 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 diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbytes.1 b/fluidbook/tools/swftools-special-swfdump/src/swfbytes.1 deleted file mode 100644 index ae14406c7..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfbytes.1 +++ /dev/null @@ -1,26 +0,0 @@ -.TH swfbytes "1" "August 2009" "swfbytes" "swftools" -.SH NAME -swfbytes - Tool for simplifying the hex-editing of SWF files. - -.SH Synopsis -.B swfbytes [-v] file.swf > file.hexdump -.PP -.B swfbytes file.hexdump - -.SH DESCRIPTION -With this tool and a text editor, you can perform some basic -editing operations on SWF files. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR - Print help and exit -.TP -\fB\-v\fR, \fB\-\-verbose\fR - Be more verbose -.TP -\fB\-V\fR, \fB\-\-version\fR - Print program version and exit -.SH AUTHOR - -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfbytes.c b/fluidbook/tools/swftools-special-swfdump/src/swfbytes.c deleted file mode 100644 index b747365d5..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfbytes.c +++ /dev/null @@ -1,385 +0,0 @@ -/* swfbytes.c - A tool for modifying swfs on the tag level - - Part of the swftools package. - - Copyright (c) 2008/2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../config.h" -#include -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" - -static char * filename = 0; -static int verbose; -static char* output_filename = "output.swf"; - -static struct options_t options[] = { -{"h", "help"}, -{"v", "verbose"}, -{"V", "version"}, -{0,0} -}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("swfedit - part of %s %s\n", PACKAGE, VERSION); - return 0; - } else if(!strcmp(name, "v")) { - verbose++; - return 0; - } else if(!strcmp(name, "o")) { - output_filename = val; - return 1; - } else { - printf("Unknown option: -%s\n", name); - return 0; - } - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-v] file.swf > file.hexdump\n", name); - printf("OR: %s file.hexdump\n", name); - printf("\n"); - printf("-h , --help Print help and exit\n"); - printf("-v , --verbose Be more verbose\n"); - printf("-V , --version Print program version and exit\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", filename, name); - } - filename = name; - return 0; -} - -void dumpTag(FILE*fo, char*prefix, TAG*tag) -{ - int t; - for(t=0;tlen;t++) { - if(!(t&15)) - fprintf(fo, "%s| ", prefix); - fprintf(fo, "%02x ", tag->data[t]); - if((t && ((t&15)==15)) || (t==tag->len-1)) { - fprintf(fo, "\n"); - } - } -} - -void dumpFile(SWF*swf, FILE*fo) -{ - TAG* tag = swf->firstTag; - int indent = 0; - int t; - char whitespace[33]; - char*prefix = ""; - - memset(whitespace, 32, 32); whitespace[32] = 0; - - fprintf(fo, "Version: %d\n", swf->fileVersion); - fprintf(fo, "FrameRate: %f\n",swf->frameRate/256.0); - fprintf(fo, "FrameCount: %d\n",swf->frameCount); - fprintf(fo, "Width: %.2f\n",(swf->movieSize.xmax-swf->movieSize.xmin)/20.0); - fprintf(fo, "X-Offset: %.2f\n", swf->movieSize.xmin/20.0); - fprintf(fo, "Height: %.2f\n",(swf->movieSize.ymax-swf->movieSize.ymin)/20.0); - fprintf(fo, "Y-Offset: %.2f\n", swf->movieSize.ymin/20.0); - fprintf(fo, "\n"); - - while(tag) - { - if(swf_isDefiningTag(tag)) { - fprintf(fo, "%s%s <%d>\n", prefix, swf_TagGetName(tag), swf_GetDefineID(tag)); - swf_SetTagPos(tag, 2); - dumpTag(fo, prefix, tag); - } else if(swf_isPseudoDefiningTag(tag)) { - fprintf(fo, "%s%s <%d>\n", prefix, swf_TagGetName(tag), swf_GetDefineID(tag)); - swf_SetTagPos(tag, 2); - dumpTag(fo, prefix, tag); - } else if(tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { - SWFPLACEOBJECT po; - swf_GetPlaceObject(tag, &po); - fprintf(fo, "%s%s <%d>\n", prefix,swf_TagGetName(tag), po.id); - /* for now */ - swf_SetTagPos(tag, 0); - dumpTag(fo, prefix, tag); - swf_PlaceObjectFree(&po); - } else { - fprintf(fo, "%s%s\n", prefix, swf_TagGetName(tag)); - dumpTag(fo, prefix, tag); - } - - if(tag->id == ST_DEFINESPRITE) { - indent+=4; - if(indent>32) - indent = 32; - prefix = &whitespace[32-indent]; - } else if(tag->id == ST_END) { - indent-=4; - if(indent<0) - indent = 0; - prefix = &whitespace[32-indent]; - } - - tag = tag->next; - } -} - -static void readline(FILE*fi, char*line, int maxlen) { - int pos = 0; - while(!feof(fi)) { - if(!fread(&line[pos],1,1,fi)) - break; - - /* cut of preceding whitespace */ - if(pos == 0 && (line[0] == 32 || line[0] == '\t')) - continue; - - if(line[pos] == 13 || line[pos]==10) - break; - if(pos=1 && (line[pos-1]==32 || line[pos-1]==9)) { - pos--; - line[pos]=0; - } -} - -int getFloat(char*s) -{ - float x; - int n; - while(*s==32 || *s=='\t') s++; - sscanf(s, "%f%n", &x, &n); - if(n==0) - fprintf(stderr, "Not a float: %s\n", s); - return x; -} -int getInt(char*s) -{ - int i; - int n; - while(*s==32 || *s=='\t') s++; - sscanf(s, "%d%n", &i, &n); - if(n==0) - fprintf(stderr, "Not an integer: %s\n", s); - return i; -} -int getTwip(char*x) -{ - return (int)(getFloat(x)*20); -} - - -static char**lookup; -int swf_TagNameToID(char*name) -{ - int t; - TAG tag; - memset(&tag, 0, sizeof(tag)); - if(!lookup) { - lookup = (char**)malloc(sizeof(char*)*65536); - for(t=0;t<65536;t++) { - tag.id = t; - lookup[t] = swf_TagGetName(&tag); - } - } - for(t=0;t<65536;t++) { - if(lookup[t] && !strcasecmp(name, lookup[t])) - return t; - } - fprintf(stderr, "Not a tag name: \"%s\"\n", name); - return -1; -} - -void parseFile(FILE*fi, SWF*swf) -{ - TAG*tag = 0; - char line[1024]; - memset(swf, 0, sizeof(SWF)); - while(1) { - char*colon = 0; - readline(fi, line, 1024); - if(!line[0]) - break; - colon = strchr(line, ':'); - if(colon) { - int num = colon - line; - int n; - if(num == 9 && !strncmp(line, "FrameRate", num)) { - swf->frameRate = getFloat(colon+1)*256; - } else if(num == 10 && !strncmp(line, "FrameCount", num)) { - swf->frameCount = getInt(colon+1); - } else if(num == 7 && !strncmp(line, "Version", num)) { - swf->fileVersion = getInt(colon+1); - } else if(num == 5 && !strncmp(line, "Width", num)) { - int width = getTwip(colon+1); - swf->movieSize.xmax += width; - } else if(num == 6 && !strncmp(line, "Height", num)) { - int height = getTwip(colon+1); - swf->movieSize.ymax += height; - } else if(num == 8 && !strncmp(line, "X-Offset", num)) { - int xoffset = getTwip(colon+1); - swf->movieSize.xmin += xoffset; - swf->movieSize.xmax += xoffset; - } else if(num == 8 && !strncmp(line, "Y-Offset", num)) { - int yoffset = getTwip(colon+1); - swf->movieSize.ymin += yoffset; - swf->movieSize.ymax += yoffset; - } else { - fprintf(stderr, "Ignored line \"%s\"\n", line); - } - } - } - while(!feof(fi)) { - char*s, *tagname; - char*br; - readline(fi, line, 1024); - if(!line[0]) - continue; - s = strchr(line, ' '); - br = strchr(line, '|'); - if(!br) { - int id = 0; - /* DEFINESHAPE ... type line */ - if(!s) { - tagname = strdup(line); - } else { - tagname = strdup(line); - tagname[s-line] = 0; - } - id = swf_TagNameToID(tagname); - free(tagname); - if(id<0) { - fprintf(stderr, "Ignored line \"%s\"\n", line); - continue; - } - tag = swf_InsertTag(tag, id); - if(!swf->firstTag) - swf->firstTag = tag; - } else { - /* | 00 34 fe c7 ... type line */ - char*p = line; - int num = 0; - int digits = 0; - - if(!tag) { - fprintf(stderr, "Discarded unassignable data %s\n", line); - continue; - } - - while(*p) { - int n = 0; - if((*p>='a' && *p<='f') || - (*p>='A' && *p<='F')) { - n = 9 + (*p & 15); - num = (num<<4) | n; - digits++; - } - else if(*p>='0' && *p<='9') { - n = *p & 15; - num = (num<<4) | n; - digits++; - } else if(digits) { - swf_SetU8(tag, num); - num = 0; - digits = 0; - } - p++; - } - if(digits) - swf_SetU8(tag, num); - } - } -} - -char swf_IsSWF(char*filename) -{ - int fi = open(filename,O_RDONLY|O_BINARY); - U8 buf[3] = {0,0,0}; - if(fi<0) - return 0; - read(fi, buf, 3); - close(fi); - if((buf[0] == 'F' || buf[0] == 'C') && buf[1] == 'W' && buf[2] == 'S') - return 1; - return 0; -} - -int main (int argc,char ** argv) -{ - int fi; - TAG*tag = 0; - SWF swf; - - processargs(argc, argv); - - if(!filename) { - fprintf(stderr, "You must supply a filename.\n"); - return -1; - } - if(swf_IsSWF(filename)) { - fi = open(filename,O_RDONLY|O_BINARY); - if (fi<0) { - perror("Couldn't open file: "); - exit(1); - } - if FAILED(swf_ReadSWF(fi,&swf)) { - fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); - close(fi); - exit(1); - } - dumpFile(&swf, stdout); - swf_FreeTags(&swf); - } else { - SWF newswf; - FILE*fi = fopen(filename, "rb"); - parseFile(fi, &newswf); - fclose(fi); - int f; - char*sname = output_filename; - f = open(sname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - if FAILED(swf_WriteSWF(f,&newswf)) { - fprintf(stderr, "Unable to write output file: %s\n", sname); - } - close(f); - } - - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc b/fluidbook/tools/swftools-special-swfdump/src/swfc deleted file mode 100644 index 35540d0877e1adba01957b70062f755bb17c8c95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1182650 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

*7ME~y_sF?IRULME#FWC@ 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

%LwJUeq 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 QX8)2U`Tw7l_}j(*0-!5hCjbBd diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.c b/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.c deleted file mode 100644 index 51c5663ed..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.c +++ /dev/null @@ -1,48 +0,0 @@ -/* swfc- Compiles swf code (.sc) files into .swf files. - - Part of the swftools package. - - Copyright (c) 2007 Huub Schaeks - Copyright (c) 2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "swfc-feedback.h" - -void syntaxerror(char*format, ...) -{ - char buf[1024]; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - fprintf(stderr, "\"%s\", line %d column %d: error- %s\n", filename, line, column, buf); - if (cleanUp) - cleanUp(); - exit(1); -} - -void warning(char*format, ...) -{ - char buf[1024]; - va_list arglist; - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - fprintf(stderr, "\"%s\", line %d column %d: warning- %s\n", filename, line, column, buf); -} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.h b/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.h deleted file mode 100644 index 6196ea1c8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfc-feedback.h +++ /dev/null @@ -1,33 +0,0 @@ -/* swfc- Compiles swf code (.sc) files into .swf files. - - Part of the swftools package. - - Copyright (c) 2007 Huub Schaeks - Copyright (c) 2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __FEEDBACK_H -#define __FEEDBACK_H - -char* filename; -int line; -int column; -void (*cleanUp)(); - -void syntaxerror(char*format, ...); -void warning(char*format, ...); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-history.c b/fluidbook/tools/swftools-special-swfdump/src/swfc-history.c deleted file mode 100644 index d97605397..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfc-history.c +++ /dev/null @@ -1,1162 +0,0 @@ -/* swfc- Compiles swf code (.sc) files into .swf files. - - Part of the swftools package. - - Copyright (c) 2007 Huub Schaeks - Copyright (c) 2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "swfc-history.h" - -enum -{ - T_BEFORE, - T_AFTER, - T_SYMMETRIC -}; - -state_t* state_new(U16 frame, int function, float value, interpolation_t* inter) -{ - state_t* newState = (state_t*)malloc(sizeof(state_t)); - state_init(newState); - newState->frame = frame; - newState->function = function; - newState->value = value; - newState->interpolation = inter; - return newState; -} - -void state_free(state_t* state) -{ - if (state->next) - state_free(state->next); - free(state); -} - -void state_init(state_t* state) -{ - memset(state, 0, sizeof(state_t)); -} - -state_t* state_at(state_t* state, U16 frame) -{ - while (state->next && state->next->frame < frame) - state = state->next; - return state; -} - -void state_append(state_t* state, state_t* newState) -{ - state_t* previous = 0; - state_t* start = state; - float p0, p1, m0, m1; - int previous_frames = 0, state_frames, new_frames; - - while (state->next) - { - if (previous) - previous_frames = state->frame - previous->frame; - previous = state; - state = state->next; - } - state->next = newState; - new_frames = newState->frame - state->frame; - if (state->function == CF_SCHANGE) - { - state_frames = state->frame - previous->frame; - p0 = previous->value; - p1 = state->value; - if (previous->function == CF_SCHANGE) - m0 = (3 * previous->spline.a + 2 * previous->spline.b + previous->spline.c) * state_frames / previous_frames ; - else - if (previous->function == CF_CHANGE || previous->function == CF_SWEEP) - m0 = state_tangent(start, previous->frame, T_BEFORE) * state_frames; - else - m0 = (state->value - previous->value); - if (newState->function == CF_SCHANGE) - m1 = /*0.5 * */(newState->value - previous->value) * state_frames / (new_frames + state_frames); - else - if (newState->function == CF_CHANGE || newState->function == CF_SWEEP) - m1 = state_tangent(previous, state->frame, T_AFTER) * state_frames; - else - m1 = (newState->value - state->value); - state->spline.a = 2 * p0 + m0 - 2 * p1 + m1; - state->spline.b = -3 * p0 - 2 * m0 + 3 * p1 - m1; - state->spline.c = m0; - state->spline.d = p0; -// printf("p0: %f, p1: %f, m0: %f, m1: %f.\n", p0, p1, m0, m1); -// printf("a: %f, b: %f, c: %f, d: %f.\n", state->spline.a, state->spline.b, state->spline.c, state->spline.d); - } - if (newState->function == CF_SCHANGE) - { - p0 = state->value; - p1 = newState->value; - if (state->function == CF_SCHANGE) - m0 = m1; - else - if (state->function == CF_CHANGE || state->function == CF_SWEEP) - m0 = state_tangent(start, state->frame, T_BEFORE) * new_frames; - else - m0 = (newState->value - state->value); - m1 = (newState->value - state->value); - newState->spline.a = 2 * p0 + m0 - 2 * p1 + m1; - newState->spline.b = -3 * p0 - 2 * m0 + 3 * p1 - m1; - newState->spline.c = m0; - newState->spline.d = p0; -// printf("p0: %f, p1: %f, m0: %f, m1: %f.\n", p0, p1, m0, m1); -// printf("a: %f, b: %f, c: %f, d: %f.\n", newState->spline.a, newState->spline.b, newState->spline.c, newState->spline.d); - } - } - -void state_insert(state_t* state, state_t* newState) -{ - while (state->next && state->next->frame < newState->frame) - state = state->next; - newState->next = state->next; - state->next = newState; - // if this is going to be used to insert CF_SCHANGE states it will have to be extended - // as in state_append above. I know this is not necessary right now, so I'll be lazy. -} - -float calculateSpline(state_t* modification, float fraction) -{ - spline_t s = modification->spline; - return (((s.a * fraction) + s.b) * fraction + s.c) * fraction + s.d; -} - -float interpolateScalar(float p1, float p2, float fraction, interpolation_t* inter) -{ - if (!inter) - return linear(fraction, p1, p2 - p1); - switch (inter->function) - { - case IF_LINEAR: return linear(fraction, p1, p2 - p1); - case IF_QUAD_IN: return quadIn(fraction, p1, p2 - p1, inter->slope); - case IF_QUAD_OUT: return quadOut(fraction, p1, p2 - p1, inter->slope); - case IF_QUAD_IN_OUT: return quadInOut(fraction, p1, p2 - p1, inter->slope); - case IF_CUBIC_IN: return cubicIn(fraction, p1, p2 - p1, inter->slope); - case IF_CUBIC_OUT: return cubicOut(fraction, p1, p2 - p1, inter->slope); - case IF_CUBIC_IN_OUT: return cubicInOut(fraction, p1, p2 - p1, inter->slope); - case IF_QUART_IN: return quartIn(fraction, p1, p2 - p1, inter->slope); - case IF_QUART_OUT: return quartOut(fraction, p1, p2 - p1, inter->slope); - case IF_QUART_IN_OUT: return quartInOut(fraction, p1, p2 - p1, inter->slope); - case IF_QUINT_IN: return quintIn(fraction, p1, p2 - p1, inter->slope); - case IF_QUINT_OUT: return quintOut(fraction, p1, p2 - p1, inter->slope); - case IF_QUINT_IN_OUT: return quintInOut(fraction, p1, p2 - p1, inter->slope); - case IF_CIRCLE_IN: return circleIn(fraction, p1, p2 - p1, inter->slope); - case IF_CIRCLE_OUT: return circleOut(fraction, p1, p2 - p1, inter->slope); - case IF_CIRCLE_IN_OUT: return circleInOut(fraction, p1, p2 - p1, inter->slope); - case IF_EXPONENTIAL_IN: return exponentialIn(fraction, p1, p2 - p1); - case IF_EXPONENTIAL_OUT: return exponentialOut(fraction, p1, p2 - p1); - case IF_EXPONENTIAL_IN_OUT: return exponentialInOut(fraction, p1, p2 - p1); - case IF_SINE_IN: return sineIn(fraction, p1, p2 - p1); - case IF_SINE_OUT: return sineOut(fraction, p1, p2 - p1); - case IF_SINE_IN_OUT: return sineInOut(fraction, p1, p2 - p1); - case IF_ELASTIC_IN: return elasticIn(fraction, p1, p2 - p1, inter->amplitude, inter->bounces, inter->damping); - case IF_ELASTIC_OUT: return elasticOut(fraction, p1, p2 - p1, inter->amplitude, inter->bounces, inter->damping); - case IF_ELASTIC_IN_OUT: return elasticInOut(fraction, p1, p2 - p1, inter->amplitude, inter->bounces, inter->damping); - case IF_BACK_IN: return backIn(fraction, p1, p2 - p1, inter->speed); - case IF_BACK_OUT: return backOut(fraction, p1, p2 - p1, inter->speed); - case IF_BACK_IN_OUT: return backInOut(fraction, p1, p2 - p1, inter->speed); - case IF_BOUNCE_IN: return bounceIn(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); - case IF_BOUNCE_OUT: return bounceOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); - case IF_BOUNCE_IN_OUT: return bounceInOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); - case IF_FAST_BOUNCE_IN: return fastBounceIn(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); - case IF_FAST_BOUNCE_OUT: return fastBounceOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); - case IF_FAST_BOUNCE_IN_OUT: return fastBounceInOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); - default: return linear(fraction, p1, p2 - p1); - } -} - -float calculateSweep(state_t* modification, float fraction) -{ - arc_t* a = &(modification->arc); - float angle = a->angle + fraction * a->delta_angle; - if (a->X) - return a->cX + a->r * cos(angle); - else - return a->cY + a->r * sin(angle); - -} - -int state_differs(state_t* modification, U16 frame) -{ - state_t* previous = modification; - while (modification && modification->frame < frame) - { - previous = modification; - modification = modification->next; - } - if (!modification) - return 0; - if (modification->frame == frame) - return 1; - return (modification->function != CF_JUMP); - } - -float state_tangent(state_t* modification, U16 frame, int tangent) -{ - float deltaFrame = 0.1; - switch (tangent) -{ - case T_BEFORE: - return (state_value(modification, frame) - state_value(modification, frame - deltaFrame)) / deltaFrame; - case T_AFTER: - return (state_value(modification, frame + deltaFrame) - state_value(modification, frame)) / deltaFrame; - default: - return (state_value(modification, frame + deltaFrame) - state_value(modification, frame - deltaFrame)) / (2 * deltaFrame); - } -} - -float state_value(state_t* modification, float frame) -{ - state_t* previous = modification; - while (modification && modification->frame < frame) - { - previous = modification; - modification = modification->next; - } - if (!modification) - return previous->value; - if (modification->frame == frame) - { - do - { - previous = modification; - modification = modification->next; - } - while (modification && modification->frame == frame); - return previous->value; - } - switch (modification->function) - { - case CF_PUT: - return modification->value; - case CF_CHANGE: - { - float fraction = (frame - previous->frame) / (float)(modification->frame - previous->frame); - return interpolateScalar(previous->value, modification->value, fraction, modification->interpolation); - } - case CF_SCHANGE: - { - float fraction = (frame - previous->frame) / (float)(modification->frame - previous->frame); - fraction = interpolateScalar(0, 1, fraction, modification->interpolation); - return calculateSpline(modification, fraction); - } - case CF_SWEEP: - { - float fraction = (frame - previous->frame) / (float)(modification->frame - previous->frame); - fraction = interpolateScalar(0, 1, fraction, modification->interpolation); - return calculateSweep(modification, fraction); - } - case CF_JUMP: - return previous->value; - default: - return 0; - } -} - -filterState_t* filterState_new(U16 frame, int function, FILTERLIST* value, interpolation_t* inter) -{ - filterState_t* newChange = (filterState_t*)malloc(sizeof(filterState_t)); - filterState_init(newChange); - newChange->frame = frame; - newChange->function = function; - newChange->value = value; - newChange->interpolation = inter; - return newChange; -} - -void filterState_free(filterState_t *change) -{ - if (change->next) - filterState_free(change->next); - free(change->value); - free(change); -} - -void filterState_init(filterState_t* change) -{ - memset(change, 0, sizeof(filterState_t)); -} - -void filterState_append(filterState_t* first, filterState_t* newChange) -{ - while (first->next) - first = first->next; - if (!first->value || !newChange->value) - first->next = newChange; - else - { - int i, mergedCount = 0; - int common = first->value->num < newChange->value->num ? first->value->num : newChange->value->num; - for (i = 0; i < common; i++) - { - mergedCount++; - if (newChange->value->filter[i]->type != first->value->filter[i]->type) - mergedCount++; - } - mergedCount = mergedCount + first->value->num - common + newChange->value->num - common; - if (mergedCount > 8) - { - char* list1; - char* list2; - char* newList; - list1 = (char*)malloc(1); - *list1 = '\0'; - for (i = 0; i < first->value->num; i++) - { - newList = (char*)malloc(strlen(list1) + strlen(filtername[first->value->filter[i]->type]) + 2); - strcpy(newList, strcat(strcat(list1, "+"), filtername[first->value->filter[i]->type])); - free(list1); - list1 = newList; - } - list2 = (char*)malloc(1); - *list2 = '\0'; - for (i = 0; i < newChange->value->num; i++) - { - newList = (char*)malloc(strlen(list1) + strlen(filtername[newChange->value->filter[i]->type]) + 2); - strcpy(newList, strcat(strcat(list2, "+"), filtername[newChange->value->filter[i]->type])); - free(list2); - list2 = newList; - } - syntaxerror("filterlists %s and %s cannot be interpolated.", list1, list2); - } - first->next = newChange; - } -} - -RGBA interpolateColor(RGBA c1, RGBA c2, float ratio, interpolation_t* inter) -{ - RGBA c; - c.r = interpolateScalar(c1.r, c2.r, ratio, inter); - c.g = interpolateScalar(c1.g, c2.g, ratio, inter); - c.b = interpolateScalar(c1.b, c2.b, ratio, inter); - c.a = interpolateScalar(c1.a, c2.a, ratio, inter); - return c; -} - -GRADIENT* interpolateNodes(GRADIENT* g1, GRADIENT* g2, float fraction, interpolation_t* inter) -{ - if (g1->num != g2->num) - syntaxerror("Internal error: gradients are not equal in size"); - - int i; - GRADIENT* g = (GRADIENT*) malloc(sizeof(GRADIENT)); - g->ratios = rfx_calloc(16*sizeof(U8)); - g->rgba = rfx_calloc(16*sizeof(RGBA)); - g->num = g1->num; - for (i = 0; i < g->num; i++) - { - g->ratios[i] = interpolateScalar(g1->ratios[i], g2->ratios[i], fraction, inter); - g->rgba[i] = interpolateColor(g1->rgba[i], g2->rgba[i], fraction, inter); - } - return g; -} - -void copyGradient(GRADIENT* dest, GRADIENT* source) -{ - dest->num = source->num; - memcpy(dest->ratios, source->ratios, source->num * sizeof(U8)); - memcpy(dest->rgba, source->rgba, source->num * sizeof(RGBA)); -} - -void insertNode(GRADIENT* g, int pos) -{ - memmove(&g->ratios[pos + 1], &g->ratios[pos], (g->num - pos) * sizeof(U8)); - memmove(&g->rgba[pos + 1], &g->rgba[pos], (g->num - pos) * sizeof(RGBA)); - if (pos == 0) - { - g->ratios[0] = g->ratios[1] / 2; - g->rgba[0] = g->rgba[1]; - } - else - if (pos == g->num) - { - g->ratios[pos] = (255 + g->ratios[g->num - 1]) / 2; - g->rgba[pos] = g->rgba[pos - 1]; - } - else - { - g->ratios[pos] = (g->ratios[pos - 1] + g->ratios[pos + 1]) / 2; - g->rgba[pos] = interpolateColor(g->rgba[pos - 1], g->rgba[pos + 1], 0.5, 0); - } - g->num++; -} - -void insertOptimalNode(GRADIENT* g) -{ - int i, next_gap; - int pos = 0; - int gap = g->ratios[0]; - for (i = 0; i < g->num - 1; i++) - { - next_gap = g->ratios[i + 1] - g->ratios[i]; - if (next_gap > gap) - { - gap = next_gap; - pos = i + 1; - } - } - next_gap = 255 - g->ratios[g->num -1]; - if (next_gap > gap) - pos = g->num; - insertNode(g, pos); -} - -void growGradient(GRADIENT* start, int size) -{ - while (start->num < size) - insertOptimalNode(start); -} - -GRADIENT* interpolateGradient(GRADIENT* g1, GRADIENT* g2, float fraction, interpolation_t* inter) -{ - int i; - GRADIENT g; - g.ratios = rfx_calloc(16*sizeof(U8)); - g.rgba = rfx_calloc(16*sizeof(RGBA)); - - if (g1->num > g2->num) - { - copyGradient(&g, g2); - growGradient(&g, g1->num); - GRADIENT* result = interpolateNodes(g1, &g, fraction, inter); - rfx_free(g.rgba); - rfx_free(g.ratios); - return result; - } - else - if (g1->num < g2->num) - { - copyGradient(&g, g1); - growGradient(&g, g2->num); - GRADIENT* result = interpolateNodes(&g, g2, fraction, inter); - rfx_free(g.rgba); - rfx_free(g.ratios); - return result; - } - else - return interpolateNodes(g1, g2, fraction, inter); -} - -FILTER* copyFilter(FILTER* original) -{ - if (!original) - return original; - FILTER* copy = swf_NewFilter(original->type); - switch (original->type) - { - case FILTERTYPE_BLUR: - memcpy(copy, original, sizeof(FILTER_BLUR)); - break; - case FILTERTYPE_GRADIENTGLOW: - { - memcpy(copy, original, sizeof(FILTER_GRADIENTGLOW)); - FILTER_GRADIENTGLOW* ggcopy = (FILTER_GRADIENTGLOW*)copy; - ggcopy->gradient = (GRADIENT*)malloc(sizeof(GRADIENT)); - ggcopy->gradient->ratios = (U8*)malloc(16 * sizeof(U8)); - ggcopy->gradient->rgba = (RGBA*)malloc(16 * sizeof(RGBA)); - copyGradient(ggcopy->gradient, ((FILTER_GRADIENTGLOW*)original)->gradient); - } - break; - case FILTERTYPE_DROPSHADOW: - memcpy(copy, original, sizeof(FILTER_DROPSHADOW)); - break; - case FILTERTYPE_BEVEL: - memcpy(copy, original, sizeof(FILTER_BEVEL)); - break; - default: syntaxerror("Internal error: unsupported filterype, cannot copy"); - } - return copy; -} - -FILTER* interpolateBlur(FILTER* filter1, FILTER* filter2, float ratio, interpolation_t* inter) - { - FILTER_BLUR*f1 = (FILTER_BLUR*)filter1; - FILTER_BLUR*f2 = (FILTER_BLUR*)filter2; - if (!f1) - f1 = noBlur; - if (!f2) - f2 = noBlur; - if(f1->blurx == f2->blurx && f1->blury == f2->blury) - return copyFilter(filter1); - FILTER_BLUR*f = (FILTER_BLUR*)swf_NewFilter(FILTERTYPE_BLUR); - f->blurx= interpolateScalar(f1->blurx, (f2->blurx), ratio, inter); - f->blury= interpolateScalar(f1->blury, (f2->blury), ratio, inter); - f->passes= interpolateScalar(f1->passes, (f2->passes), ratio, inter); - return (FILTER*)f; - } - -void matchDropshadowFlags(FILTER_DROPSHADOW* unset, FILTER_DROPSHADOW* target) -{ - unset->innershadow = target->innershadow; - unset->knockout = target->knockout; - unset->composite = target->composite; -} - -FILTER* interpolateDropshadow(FILTER* filter1,FILTER* filter2, float ratio, interpolation_t* inter) - { - FILTER_DROPSHADOW*f1 = (FILTER_DROPSHADOW*)filter1; - FILTER_DROPSHADOW*f2 = (FILTER_DROPSHADOW*)filter2; - if (!f1) - f1 = noDropshadow; - if (!f2) - f2 = noDropshadow; - if(!memcmp(&f1->color,&f2->color,sizeof(RGBA)) && f1->strength == f2->strength && - f1->blurx == f2->blurx && f1->blury == f2->blury && - f1->angle == f2->angle && f1->distance == f2->distance) - return copyFilter(filter1); - FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)swf_NewFilter(FILTERTYPE_DROPSHADOW); - memcpy(f, f1, sizeof(FILTER_DROPSHADOW)); - f->color = interpolateColor(f1->color, f2->color, ratio, inter); - f->blurx= interpolateScalar(f1->blurx, (f2->blurx), ratio, inter); - f->blury= interpolateScalar(f1->blury, (f2->blury), ratio, inter); - f->passes= interpolateScalar(f1->passes, (f2->passes), ratio, inter); - f->angle= interpolateScalar(f1->angle, (f2->angle), ratio, inter); - f->distance= interpolateScalar(f1->distance, (f2->distance), ratio, inter); - f->strength= interpolateScalar(f1->strength, (f2->strength), ratio, inter); - if (f1 == noDropshadow) - { - if (f2 != noDropshadow) - matchDropshadowFlags(f, f2); - } - else - if (f2 == noDropshadow) - matchDropshadowFlags(f, f1); - else - if (ratio > 0.5) - matchDropshadowFlags(f, f2); - else - matchDropshadowFlags(f, f1); - return (FILTER*)f; -} - -void matchBevelFlags(FILTER_BEVEL* unset, FILTER_BEVEL* target) -{ - unset->innershadow = target->innershadow; - unset->knockout = target->knockout; - unset->composite = target->composite; - unset->ontop = target->ontop; -} - -FILTER* interpolateBevel(FILTER* filter1,FILTER* filter2, float ratio, interpolation_t* inter) - { - FILTER_BEVEL*f1 = (FILTER_BEVEL*)filter1; - FILTER_BEVEL*f2 = (FILTER_BEVEL*)filter2; - if (!f1) - f1 = noBevel; - if (!f2) - f2 = noBevel; - if(!memcmp(&f1->shadow,&f2->shadow,sizeof(RGBA)) && - !memcmp(&f1->highlight,&f2->highlight,sizeof(RGBA)) && - f1->blurx == f2->blurx && f1->blury == f2->blury && f1->angle == f2->angle && f1->strength == f2->strength && f1->distance == f2->distance) - return copyFilter(filter1); - FILTER_BEVEL*f = (FILTER_BEVEL*)swf_NewFilter(FILTERTYPE_BEVEL); - memcpy(f, f1, sizeof(FILTER_BEVEL)); - f->shadow = interpolateColor(f1->shadow, f2->shadow, ratio, inter); - f->highlight = interpolateColor(f1->highlight, f2->highlight, ratio, inter); - f->blurx= interpolateScalar(f1->blurx, (f2->blurx), ratio, inter); - f->blury= interpolateScalar(f1->blury, (f2->blury), ratio, inter); - f->passes= interpolateScalar(f1->passes, (f2->passes), ratio, inter); - f->angle= interpolateScalar(f1->angle, (f2->angle), ratio, inter); - f->distance= interpolateScalar(f1->distance, (f2->distance), ratio, inter); - f->strength= interpolateScalar(f1->strength, (f2->strength), ratio, inter); - if (f1 == noBevel) - { - if (f2 != noBevel) - matchBevelFlags(f, f2); - } - else - if (f2 == noBevel) - matchBevelFlags(f, f1); - else - if (ratio > 0.5) - matchBevelFlags(f, f2); - else - matchBevelFlags(f, f1); - return (FILTER*)f; -} - -void matchGradientGlowFlags(FILTER_GRADIENTGLOW* unset, FILTER_GRADIENTGLOW* target) -{ - unset->innershadow = target->innershadow; - unset->knockout = target->knockout; - unset->composite = target->composite; - unset->ontop = target->ontop; -} - -FILTER* interpolateGradientGlow(FILTER* filter1,FILTER* filter2, float ratio, interpolation_t* inter) -{ - FILTER_GRADIENTGLOW*f1 = (FILTER_GRADIENTGLOW*)filter1; - FILTER_GRADIENTGLOW*f2 = (FILTER_GRADIENTGLOW*)filter2; - if (!f1) - f1 = noGradientGlow; - if (!f2) - f2 = noGradientGlow; - if(f1->gradient->num == f2->gradient->num && - !memcmp(&f1->gradient->ratios,&f2->gradient->ratios,f1->gradient->num * sizeof(U8)) && - !memcmp(&f1->gradient->rgba,&f2->gradient->rgba,f1->gradient->num * sizeof(RGBA)) && - f1->blurx == f2->blurx && f1->blury == f2->blury && f1->angle == f2->angle && f1->strength == f2->strength && f1->distance == f2->distance) - return copyFilter(filter1); - FILTER_GRADIENTGLOW*f = (FILTER_GRADIENTGLOW*)swf_NewFilter(FILTERTYPE_GRADIENTGLOW); - memcpy(f, f1, sizeof(FILTER_GRADIENTGLOW)); - f->blurx= interpolateScalar(f1->blurx, (f2->blurx), ratio, inter); - f->blury= interpolateScalar(f1->blury, (f2->blury), ratio, inter); - f->passes= interpolateScalar(f1->passes, (f2->passes), ratio, inter); - f->angle= interpolateScalar(f1->angle, (f2->angle), ratio, inter); - f->distance= interpolateScalar(f1->distance, (f2->distance), ratio, inter); - f->strength= interpolateScalar(f1->strength, (f2->strength), ratio, inter); - f->gradient= interpolateGradient(f1->gradient, f2->gradient, ratio, inter); - if (f1 == noGradientGlow) - { - if (f2 != noGradientGlow) - matchGradientGlowFlags(f, f2); - } - else - if (f2 == noGradientGlow) - matchGradientGlowFlags(f, f1); - else - if (ratio > 0.5) - matchGradientGlowFlags(f, f2); - else - matchGradientGlowFlags(f, f1); - return (FILTER*)f; -} - -FILTER* interpolateFilter(FILTER* filter1,FILTER* filter2, float ratio, interpolation_t* inter) -{ - if(!filter1 && !filter2) - return 0; - - int filter_type; - if (!filter1) - filter_type = filter2->type; - else - if (!filter2) - filter_type = filter1->type; - else - if(filter2->type != filter1->type) - syntaxerror("can't interpolate between %s and %s filters yet", filtername[filter1->type], filtername[filter2->type]); - else - filter_type = filter1->type; - - switch (filter_type) - { - case FILTERTYPE_BLUR: - return interpolateBlur(filter1, filter2, ratio, inter); - case FILTERTYPE_BEVEL: - return interpolateBevel(filter1, filter2, ratio, inter); - case FILTERTYPE_DROPSHADOW: - return interpolateDropshadow(filter1, filter2, ratio, inter); - case FILTERTYPE_GRADIENTGLOW: - return interpolateGradientGlow(filter1, filter2, ratio, inter); - default: - syntaxerror("Filtertype %s not supported yet.\n", filtername[filter1->type]); - } - return 0; -} - -FILTERLIST* copyFilterList(FILTERLIST* original) -{ - if (!original) - return original; - int i; - FILTERLIST* copy = (FILTERLIST*)malloc(sizeof(FILTERLIST)); - copy->num = original->num; - for (i = 0; i < copy->num; i++) - copy->filter[i] = copyFilter(original->filter[i]); - return copy; -} - -FILTER* noFilter(int type) -{ - switch (type) - { - case FILTERTYPE_BLUR: - return (FILTER*)noBlur; - break; - case FILTERTYPE_BEVEL: - return (FILTER*)noBevel; - break; - case FILTERTYPE_DROPSHADOW: - return (FILTER*)noDropshadow; - break; - case FILTERTYPE_GRADIENTGLOW: - return (FILTER*)noGradientGlow; - break; - default: - syntaxerror("Internal error: unsupported filtertype, cannot match filterlists"); - } - return 0; -} - -FILTERLIST* interpolateFilterList(FILTERLIST* list1, FILTERLIST* list2, float ratio, interpolation_t* inter) -{ - if (!list1 && !list2) - return list1; - FILTERLIST start, target, dummy; - dummy.num = 0; - if (!list1) - list1 = &dummy; - if (!list2) - list2 = &dummy; - int i, j = 0; - int common = list1->num < list2->num ? list1->num : list2->num; - for (i = 0; i < common; i++) - { - start.filter[j] = list1->filter[i]; - if (list2->filter[i]->type == list1->filter[i]->type) - { - target.filter[j] = list2->filter[i]; - j++; - } - else - { - target.filter[j] = noFilter(list1->filter[i]->type); - j++; - start.filter[j] = noFilter(list2->filter[i]->type); - target.filter[j] = list2->filter[i]; - j++; - } - } - if (list1->num > common) - for (i = common; i < list1->num; i++) - { - start.filter[j] = list1->filter[i]; - target.filter[j] = noFilter(list1->filter[i]->type); - j++; - } - if (list2->num > common) - for (i = common; i < list2->num; i++) - { - start.filter[j] = noFilter(list2->filter[i]->type); - target.filter[j] = list2->filter[i]; - j++; - } - start.num = j; - target.num = j; - FILTERLIST* mixedList = (FILTERLIST*)malloc(sizeof(FILTERLIST)); - mixedList->num = j; - for (i = 0; i < j; i++) - mixedList->filter[i] = interpolateFilter(start.filter[i], target.filter[i], ratio, inter); - return mixedList; -} - -int filterState_differs(filterState_t* modification, U16 frame) -{ - filterState_t* previous = modification; - while (modification && modification->frame < frame) - { - previous = modification; - modification = modification->next; - } - if (!modification) - return 0; - if (modification->frame == frame) - return 1; - return (modification->function != CF_JUMP); -} - -FILTERLIST* filterState_value(filterState_t* modification, U16 frame) -{ - filterState_t* previous = modification; - while (modification && modification->frame < frame) - { - previous = modification; - modification = modification->next; - } - if (!modification) - return copyFilterList(previous->value); - if (modification->frame == frame) - { - do - { - previous = modification; - modification = modification->next; - } - while (modification && modification->frame == frame); - return copyFilterList(previous->value); - } - switch (modification->function) - { - case CF_PUT: - return copyFilterList(modification->value); - case CF_CHANGE: - { - float fraction = (frame - previous->frame) / (float)(modification->frame - previous->frame); - return interpolateFilterList(previous->value, modification->value, fraction, modification->interpolation); - } - case CF_JUMP: - return copyFilterList(previous->value); - default: - return 0; - } -} - -history_t* history_new() -{ - history_t* newHistory = (history_t*)malloc(sizeof(history_t)); - history_init(newHistory); - return newHistory; -} - -void history_free(history_t* past) -{ - state_free(dict_lookup(past->states, "x")); - state_free(dict_lookup(past->states, "y")); - state_free(dict_lookup(past->states, "scalex")); - state_free(dict_lookup(past->states, "scaley")); - state_free(dict_lookup(past->states, "cxform.r0")); - state_free(dict_lookup(past->states, "cxform.g0")); - state_free(dict_lookup(past->states, "cxform.b0")); - state_free(dict_lookup(past->states, "cxform.a0")); - state_free(dict_lookup(past->states, "cxform.r1")); - state_free(dict_lookup(past->states, "cxform.g1")); - state_free(dict_lookup(past->states, "cxform.b1")); - state_free(dict_lookup(past->states, "cxform.a1")); - state_free(dict_lookup(past->states, "rotate")); - state_free(dict_lookup(past->states, "shear")); - state_free(dict_lookup(past->states, "pivot.x")); - state_free(dict_lookup(past->states, "pivot.y")); - state_free(dict_lookup(past->states, "pin.x")); - state_free(dict_lookup(past->states, "pin.y")); - state_free(dict_lookup(past->states, "blendmode")); - state_free(dict_lookup(past->states, "flags")); - filterState_free(dict_lookup(past->states, "filter")); - dict_destroy(past->states); - free(past); -} - -void history_init(history_t* past) -{ - past->states = (dict_t*)malloc(sizeof(dict_t)); - dict_init(past->states, 16); -} - -void history_begin(history_t* past, char* parameter, U16 frame, TAG* tag, float value) -{ - state_t* first = state_new(frame, CF_PUT, value, 0); - past->firstTag = tag; - past->firstFrame = frame; - dict_put2(past->states, parameter, first); -} - -void history_beginFilter(history_t* past, U16 frame, TAG* tag, FILTERLIST* value) -{ - filterState_t* first = filterState_new(frame, CF_PUT, value, 0); - past->firstTag = tag; - past->firstFrame = frame; - dict_put2(past->states, "filter", first); -} - -void history_remember(history_t* past, char* parameter, U16 frame, int function, float value, interpolation_t* inter) -{ - past->lastFrame = frame; - state_t* state = dict_lookup(past->states, parameter); - if (state) //should always be true - { - state_t* next = state_new(frame, function, value, inter); - state_append(state, next); - } - else - syntaxerror("Internal error: changing parameter %s, which is unknown for the instance.", parameter); -} - -static float getAngle(float dX, float dY) -{ - float radius = sqrt(dX * dX + dY * dY); - if (radius == 0) - return 0.0; - if (dX >= 0) - if (dY > 0) - return acos(dX / radius); - else - return 2 * M_PI - acos(dX / radius); - else - if (dY > 0) - return M_PI - acos(-dX / radius); - else - return M_PI + acos(-dX / radius); -} - -static float getDeltaAngle(float angle1, float angle2, int clockwise) - { - if (!clockwise) - { - if (angle1 > angle2) - return angle2 - angle1; - else - return angle2 - angle1 - 2 * M_PI; - } - else - { - if (angle1 > angle2) - return 2 * M_PI - angle1 + angle2; - else - return angle2 - angle1; - } -} - -void history_rememberSweep(history_t* past, U16 frame, float x, float y, float r, int clockwise, int short_arc, interpolation_t* inter) -{ - float lastX, lastY, dX, dY; - U16 lastFrame; - - past->lastFrame = frame; - state_t* change = dict_lookup(past->states, "x"); - if (change) //should always be true - { - while (change->next) - change = change->next; - lastFrame = change->frame; - lastX = change->value; - change = dict_lookup(past->states, "y"); - if (change) //should always be true - { - while (change->next) - change = change->next; - lastY = change->value; - dX = x - lastX; - dY = y - lastY; - if (dX == 0 && dY == 0) - syntaxerror("sweep not possible: startpoint and endpoint must not be equal"); - if ((dX) * (dX) + (dY) * (dY) > 4 * r * r) - syntaxerror("sweep not possible: radius is to small"); - if (change->frame > lastFrame) - { - lastFrame = change->frame; - history_remember(past, "x", lastFrame, CF_JUMP, lastX, 0); - } - else - if (change->frame < lastFrame) - history_remember(past, "y", lastFrame, CF_JUMP, lastY, 0); - float c1X, c1Y, c2X, c2Y; - if (dX == 0) //vertical - { - c1Y = c2Y = (lastY + y) / 2; - c1X = x + sqrt(r * r - (c1Y - y) * (c1Y - y)); - c2X = 2 * x -c1X; - } - else - if (dY == 0) //horizontal - { - c1X = c2X = (lastX + x) / 2; - c1Y = y +sqrt(r * r - (c1X - x) * (c1X - x)); - c2Y = 2 * y -c1Y; - } - else - { - c1X = sqrt((r * r - (dX * dX + dY * dY) / 4) / (1 + dX * dX / dY / dY)); - c2X = -c1X; - c1Y = -dX / dY * c1X; - c2Y = -c1Y; - c1X += (x + lastX) / 2; - c2X += (x + lastX) / 2; - c1Y += (y + lastY) / 2; - c2Y += (y + lastY) / 2; - } - float angle1, angle2, delta_angle, centerX, centerY; - angle1 = getAngle(lastX - c1X, lastY - c1Y); - angle2 = getAngle(x - c1X, y - c1Y); - delta_angle = getDeltaAngle(angle1, angle2, clockwise); - if ((short_arc && fabs(delta_angle) <= M_PI) || (! short_arc && fabs(delta_angle) >= M_PI)) - { - centerX = c1X; - centerY = c1Y; - } - else - { - angle1 = getAngle(lastX - c2X, lastY - c2Y); - angle2 = getAngle(x - c2X, y - c2Y); - delta_angle = getDeltaAngle(angle1, angle2, clockwise); - centerX = c2X; - centerY = c2Y; - } - change = dict_lookup(past->states, "x"); - state_t* nextX = state_new(frame, CF_SWEEP, x, inter); - nextX->arc.r = r; - nextX->arc.angle = angle1; - nextX->arc.delta_angle = delta_angle; - nextX->arc.cX = centerX; - nextX->arc.cY = centerY; - nextX->arc.X = 1; - state_append(change, nextX); - change = dict_lookup(past->states, "y"); - state_t* nextY = state_new(frame, CF_SWEEP, y, inter); - nextY->arc.r = r; - nextY->arc.angle = angle1; - nextY->arc.delta_angle = delta_angle; - nextY->arc.cX = centerX; - nextY->arc.cY = centerY; - nextY->arc.X = 0; - state_append(change, nextY); - } - else - syntaxerror("Internal error: changing parameter y in sweep, which is unknown for the instance."); - } - else - syntaxerror("Internal error: changing parameter x in sweep, which is unknown for the instance."); -} - -void history_rememberFilter(history_t* past, U16 frame, int function, FILTERLIST* value, interpolation_t* inter) -{ - past->lastFrame = frame; - filterState_t* first = dict_lookup(past->states, "filter"); - if (first) //should always be true - { - filterState_t* next = filterState_new(frame, function, value, inter); - filterState_append(first, next); - } - else - syntaxerror("Internal error: changing a filter not set for the instance."); -} - -void history_processFlags(history_t* past) -// to be called after completely recording this history, before calculating any values. -{ - state_t* flagState = dict_lookup(past->states, "flags"); - state_t* nextState; - U16 nextFlags, toggledFlags, currentFlags = (U16)flagState->value; - while (flagState->next) - { - nextState = flagState->next; - nextFlags = (U16)nextState->value; - toggledFlags = currentFlags ^ nextFlags; - if (toggledFlags & IF_FIXED_ALIGNMENT) - { // the IF_FIXED_ALIGNMENT bit will change in the next state - if (nextFlags & IF_FIXED_ALIGNMENT) - { // the IF_FIXED_ALIGNMENT bit will be set - int onFrame = nextState->frame; - state_t* rotations = dict_lookup(past->states, "rotate"); - nextState->params.instanceAngle = state_value(rotations, onFrame); - state_t* resetRotate = state_new(onFrame, CF_JUMP, 0, 0); - state_insert(rotations, resetRotate); - if (onFrame == past->firstFrame) - onFrame++; - state_t *x, *y; - float dx, dy; - do - { - x = dict_lookup(past->states, "x"); - dx = state_tangent(x, onFrame, T_SYMMETRIC); - y = dict_lookup(past->states, "y"); - dy = state_tangent(y, onFrame, T_SYMMETRIC); - onFrame++; - } - while (dx == 0 && dy == 0 && onFrame < past->lastFrame); - if (onFrame == past->lastFrame) - nextState->params.pathAngle = 0; - else - nextState->params.pathAngle = getAngle(dx, dy) / M_PI * 180; - } - else // the IF_FIXED_ALIGNMENT bit will be reset - { - int offFrame = nextState->frame; - state_t* rotations = dict_lookup(past->states, "rotate"); - state_t* setRotate = state_new(offFrame, CF_JUMP, flagState->params.instanceAngle + state_value(rotations, offFrame), 0); - state_insert(rotations, setRotate); - } - } - else // the IF_FIXED_ALIGNMENT bit will not change but some processing may be - // required just the same - { - if (nextFlags & IF_FIXED_ALIGNMENT) - { - nextState->params.instanceAngle = flagState->params.instanceAngle; - nextState->params.pathAngle = flagState->params.pathAngle; - } - } -// and so on for all the other bits. - flagState = nextState; - currentFlags = nextFlags; - } -} - -int history_change(history_t* past, U16 frame, char* parameter) -{ - state_t* first = dict_lookup(past->states, parameter); - if (first) //should always be true. - return state_differs(first, frame); - syntaxerror("no history found to predict changes for parameter %s.\n", parameter); - return 0; -} - -float history_value(history_t* past, U16 frame, char* parameter) -{ - state_t* state = dict_lookup(past->states, parameter); - if (state) //should always be true. - return state_value(state, frame); - syntaxerror("no history found to get a value for parameter %s.\n", parameter); - return 0; -} - -float history_rotateValue(history_t* past, U16 frame) -{ - state_t* rotations = dict_lookup(past->states, "rotate"); - if (rotations) //should always be true. - { - float angle = state_value(rotations, frame); - state_t* flags = dict_lookup(past->states, "flags"); - U16 currentflags = state_value(flags, frame); - if (currentflags & IF_FIXED_ALIGNMENT) - { - flags = state_at(flags, frame); - if (frame == past->firstFrame) - frame++; - state_t *x, *y; - float dx, dy, pathAngle; - do - { - x = dict_lookup(past->states, "x"); - dx = state_value(x, frame) - state_value(x, frame - 1); - y = dict_lookup(past->states, "y"); - dy = state_value(y, frame) - state_value(y, frame - 1); - frame--; - } - while (dx == 0 && dy == 0 && frame > past->firstFrame); - if (frame == past->firstFrame) - pathAngle = 0; - else - pathAngle = getAngle(dx, dy) / M_PI * 180; - return angle + flags->params.instanceAngle + pathAngle - flags->params.pathAngle; - } - else - return angle; - } - syntaxerror("no history found to get a value for parameter rotate.\n"); - return 0; -} - -int history_changeFilter(history_t* past, U16 frame) -{ - filterState_t* first = dict_lookup(past->states, "filter"); - if (first) //should always be true. - return filterState_differs(first, frame); - syntaxerror("no history found to predict changes for parameter filter.\n"); - return 0; -} - -FILTERLIST* history_filterValue(history_t* past, U16 frame) -{ - filterState_t* first = dict_lookup(past->states, "filter"); - if (first) //should always be true. - return filterState_value(first, frame); - syntaxerror("no history found to get a value for parameter filter.\n"); - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-history.h b/fluidbook/tools/swftools-special-swfdump/src/swfc-history.h deleted file mode 100644 index 335089216..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfc-history.h +++ /dev/null @@ -1,138 +0,0 @@ -/* swfc- Compiles swf code (.sc) files into .swf files. - - Part of the swftools package. - - Copyright (c) 2007 Huub Schaeks - Copyright (c) 2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __HISTORY_H -#define __HISTORY_Y - -#include "../lib/types.h" -#include "../lib/rfxswf.h" -#include "../lib/q.h" -#include "swfc-feedback.h" -#include "swfc-interpolation.h" - -enum -{ - CF_PUT = 1, - CF_CHANGE = 2, - CF_SCHANGE = 3, - CF_SWEEP = 4, - CF_JUMP = 5 -}; - -#define SF_X 0x0001 -#define SF_Y 0x0002 -#define SF_SCALEX 0x0004 -#define SF_SCALEY 0x0008 -#define SF_CX_R 0x0010 -#define SF_CX_G 0x0020 -#define SF_CX_B 0x0040 -#define SF_CX_A 0x0080 -#define SF_ROTATE 0x0100 -#define SF_SHEAR 0x0200 -#define SF_PIVOT 0x0400 -#define SF_PIN 0x0800 -#define SF_BLEND 0x1000 -#define SF_FILTER 0x2000 -#define SF_ALL 0x3fff - -#define IF_FIXED_ALIGNMENT 0x0001 - -FILTER* noFilters; -FILTER_BLUR* noBlur; -FILTER_BEVEL* noBevel; -FILTER_DROPSHADOW* noDropshadow; -FILTER_GRADIENTGLOW* noGradientGlow; - -typedef struct _spline -{ - float a, b, c, d; -} spline_t; - -typedef struct _arc -{ - float r, angle, delta_angle, cX, cY; - int X; // boolean: 1 if this is for x; 0 if this is for y; -} arc_t; - -typedef struct _flagparms -{ - float pathAngle, instanceAngle; -} flagparams_t; - -typedef struct _state -{ - U16 frame; - float value; - int function; - interpolation_t* interpolation; - spline_t spline; - arc_t arc; - flagparams_t params; - struct _state* next; -} state_t; - -state_t* state_new(U16 frame, int function, float value, interpolation_t* inter); -void state_free(state_t* state); -void state_init(state_t* state); -state_t* state_at(state_t* state, U16 frame); -void state_append(state_t* state, state_t* newState); -void state_insert(state_t* state, state_t* newState); -float state_value(state_t* first, float frame); -float state_tangent(state_t* modification, U16 frame, int tangent); - -typedef struct _filterState -{ - U16 frame; - FILTERLIST* value; - int function; - interpolation_t* interpolation; - struct _filterState* next; -} filterState_t; - -filterState_t* filterState_new(U16 frame, int function, FILTERLIST* value, interpolation_t* inter); -void filterState_free(filterState_t* change); -void filterState_init(filterState_t* change); -void filterState_append(filterState_t* first, filterState_t* newChange); -FILTERLIST* filterState_value(filterState_t* first, U16 frame); - -typedef struct _history -{ - U16 firstFrame, lastFrame; - TAG* firstTag; - dict_t* states; -} history_t; - -history_t* history_new(); -void history_free(history_t* past); -void history_init(history_t* past); -void history_begin(history_t* past, char* parameter, U16 frame, TAG* tag, float value); -void history_beginFilter(history_t* past, U16 frame, TAG* tag, FILTERLIST* value); -void history_remember(history_t* past, char* parameter, U16 frame, int function, float value, interpolation_t* inter); -void history_rememberSweep(history_t* past, U16 frame, float x, float y, float r, int clockwise, int short_arc, interpolation_t* inter); -void history_rememberFilter(history_t* past, U16 frame, int function, FILTERLIST* value, interpolation_t* inter); -void history_processFlags(history_t* past); -int history_change(history_t* past, U16 frame, char* parameter); -float history_value(history_t* past, U16 frame, char* parameter); -float history_rotateValue(history_t* past, U16 frame); -int history_changeFilter(history_t* past, U16 frame); -FILTERLIST* history_filterValue(history_t* past, U16 frame); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.c b/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.c deleted file mode 100644 index f543bd2e8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.c +++ /dev/null @@ -1,302 +0,0 @@ -/* swfc- Compiles swf code (.sc) files into .swf files. - - Part of the swftools package. - - Copyright (c) 2007 Huub Schaeks - Copyright (c) 2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "swfc-interpolation.h" - -static inline float poly(float fraction, float start, float delta, float slope, int degree) -{ - return delta * ((1 - slope) * pow(fraction, degree) + slope * fraction) + start; -} - -float linear(float fraction, float start, float delta) -{ - return poly(fraction, start, delta, 0, 1); -} - -float quadIn(float fraction, float start, float delta, float slope) -{ - return poly(fraction, start, delta, slope, 2); -} - -float quadOut(float fraction, float start, float delta, float slope) -{ - return quadIn(1 - fraction, start + delta, -delta, slope); -} - -float quadInOut(float fraction, float start, float delta, float slope) -{ - if (fraction < 0.5) - return quadIn(2 * fraction, start, delta / 2, slope); - return quadOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); -} - -float cubicIn(float fraction, float start, float delta, float slope) -{ - return poly(fraction, start, delta, slope, 3); -} - -float cubicOut(float fraction, float start, float delta, float slope) -{ - return cubicIn(1 - fraction, start + delta, -delta, slope); -} - -float cubicInOut(float fraction, float start, float delta, float slope) -{ - if (fraction < 0.5) - return cubicIn(2 * fraction, start, delta / 2, slope); - return cubicOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); -} - -float quartIn(float fraction, float start, float delta, float slope) -{ - return poly(fraction, start, delta, slope, 4); -} - -float quartOut(float fraction, float start, float delta, float slope) -{ - return quartIn(1 - fraction, start + delta, -delta, slope); -} - -float quartInOut(float fraction, float start, float delta, float slope) -{ - if (fraction < 0.5) - return quartIn(2 * fraction, start, delta / 2, slope); - return quartOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); -} - -float quintIn(float fraction, float start, float delta, float slope) -{ - return poly(fraction, start, delta, slope, 5); -} - -float quintOut(float fraction, float start, float delta, float slope) -{ - return quintIn(1 - fraction, start + delta, -delta, slope); -} - -float quintInOut(float fraction, float start, float delta, float slope) -{ - if (fraction < 0.5) - return quintIn(2 * fraction, start, delta / 2, slope); - return quintOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); -} - -float circleIn(float fraction, float start, float delta, float slope) -{ - return delta * (1 - sqrt(1 - (1 - 2 * slope) * fraction * fraction - 2 * slope * fraction)) + start; -} - -float circleOut(float fraction, float start, float delta, float slope) -{ - return circleIn(1 - fraction, start + delta, -delta, slope); -} - -float circleInOut(float fraction, float start, float delta, float slope) -{ - if (fraction < 0.5) - return circleIn(2 * fraction, start, delta / 2, slope); - return circleOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); -} - -float exponentialIn(float fraction, float start, float delta) -{ - if (fraction == 0) - return start; - return delta * pow(2, 10 * (fraction - 1)) + start; -} - -float exponentialOut(float fraction, float start, float delta) -{ - return exponentialIn(1 - fraction, start + delta, -delta); -} - -float exponentialInOut(float fraction, float start, float delta) -{ - if (fraction < 0.5) - return exponentialIn(2 * fraction, start, delta / 2); - return exponentialOut(2 * fraction - 1, start + delta / 2, delta / 2); -} - -float sineIn(float fraction, float start, float delta) -{ - return delta * (1 - cos(fraction * M_PI/2)) + start; -} - -float sineOut(float fraction, float start, float delta) -{ - return sineIn(1 - fraction, start + delta, -delta); -} - -float sineInOut(float fraction, float start, float delta) -{ - if (fraction < 0.5) - return sineIn(2 * fraction, start, delta / 2); - return sineOut(2 * fraction - 1, start + delta / 2, delta / 2); -} - -float elasticIn(float fraction, float start, float delta, float amplitude, int bounces, float damping) -{ - if (fraction == 0 || delta == 0) - return start; - if (fraction == 1) - return start + delta; - if (amplitude < fabs(delta)) - amplitude = delta; - float period = 1 / (bounces + 0.25); - return amplitude * pow(2, damping * (fraction - 1)) * sin(fraction * (2 * M_PI) / period) + start; -} - -float elasticOut(float fraction, float start, float delta, float amplitude, int bounces, float damping) -{ - return elasticIn(1 - fraction, start + delta, -delta, amplitude, bounces, damping); -} - -float elasticInOut(float fraction, float start, float delta, float amplitude, int bounces, float damping) -{ - if (fraction < 0.5) - return elasticIn(2 * fraction, start, delta / 2, amplitude, bounces, damping); - return elasticOut(2 * fraction - 1, start + delta / 2, delta / 2, amplitude, bounces, damping); -} - -float backIn(float fraction, float start, float delta, float speed) -{ - return delta * fraction * fraction * ((speed + 1) * fraction - speed) + start; -} - -float backOut(float fraction, float start, float delta, float speed) -{ - return backIn(1 - fraction, start + delta, -delta, speed); -} - -float backInOut(float fraction, float start, float delta, float speed) -{ - if (fraction < 0.5) - return backIn(2 * fraction, start, delta / 2, speed); - return backOut(2 * fraction - 1, start + delta / 2, delta / 2, speed); -} - -/* when applied to movement bounceIn the object 'hits the floor' bounces times - * (after leaving the floor first) before gently reaching the final position at the top of the final bounce - * Each bounce takes growth times a long as the previous, except for the last one which lasts only half - * that time. The heights of the intermediate bounces are determined by the damping parameter. - * Set damping to 0 for an undamped movement.*/ - -float bounceIn(float fraction, float start, float delta, int bounces, float growth, float damping) -{ - if (fraction == 0 || delta == 0) - return start; - if (fraction == 1) - return start + delta; - float w0; - if (growth == 1.0) - w0 = 1 / (bounces + 0.5); - else - { - float gN = pow(growth, bounces); - w0 = 1 / ((gN - 1) / (growth - 1) + gN / 2 ); - } - float bounceStart = 0; - int i; - float w = w0; - for (i = 0; i <= bounces; i++) - { - float bounceEnd = bounceStart + w; - if (fraction >= bounceStart && fraction < bounceEnd) - { - float half = (bounceEnd + bounceStart) / 2; - float top = delta / pow(2, damping * ((bounces - i))); - fraction -= half; - fraction /= (w / 2); - return (1 - fraction * fraction) * top + start; - } - bounceStart = bounceEnd; - w = w * growth; - } - return w; -} - -/* bounceOut is a time-reversed bounceIn; therefore each bounce takes 1/growth times as long as - * the previous, which I think fits the idea when applied to movement */ - -float bounceOut(float fraction, float start, float delta, int bounces, float growth, float damping) -{ - return bounceIn(1 - fraction, start + delta, -delta, bounces, growth, damping); -} - -/* since bounceIn and bounceOut are combined, if growth > 1 then the bounce-times will increase in - * the first half and decrease in the second half */ - -float bounceInOut(float fraction, float start, float delta, int bounces, float growth, float damping) -{ - if (fraction < 0.5) - return bounceIn(2 * fraction, start, delta / 2, bounces, growth, damping); - return bounceOut(2 * fraction - 1, start + delta / 2, delta / 2, bounces, growth, damping); -} -/* fastBounce(In/Out) doesn't end or start in a horizontal slope (= gentle end or start) as - * bounce(In/Out) do which means fastBounceInOut doesn't have the 'delay' in the middle */ -float fastBounceIn(float fraction, float start, float delta, int bounces, float growth, float damping) -{ - if (fraction == 0 || delta == 0) - return start; - if (fraction == 1) - return start + delta; - float w0; - if (growth == 1.0) - w0 = 1 / (bounces + 0.25); /* in general (bounces + 1 / (2 * f)) */ - else - { - float gN = pow(growth, bounces); - w0 = 1 / ((gN - 1) / (growth - 1) + gN / 4 /* in general: gN / (2 * f) */ ); - } - float bounceStart = 0; - int i; - float w = w0; - for (i = 0; i <= bounces; i++) - { - float bounceEnd = bounceStart + w; - if (fraction >= bounceStart && fraction < bounceEnd) - { - float half = (bounceEnd + bounceStart) / 2; - float top = delta / 0.75/* in general: (1 - (1 / f) * (1 / f)) */ / pow(2, damping * ((bounces - i))); - fraction -= half; - fraction /= (w / 2); - return (1 - fraction * fraction) * top + start; - } - bounceStart = bounceEnd; - w = w * growth; - } - return 0; -} - -float fastBounceOut(float fraction, float start, float delta, int bounces, float growth, float damping) -{ - return fastBounceIn(1 - fraction, start + delta, -delta, bounces, growth, damping); -} - -float fastBounceInOut(float fraction, float start, float delta, int bounces, float growth, float damping) -{ - if (fraction < 0.5) - return fastBounceIn(2 * fraction, start, delta / 2, bounces, growth, damping); - return fastBounceOut(2 * fraction - 1, start + delta / 2, delta / 2, bounces, growth, damping); -} diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.h b/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.h deleted file mode 100644 index f29e950e3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfc-interpolation.h +++ /dev/null @@ -1,114 +0,0 @@ -/* swfc- Compiles swf code (.sc) files into .swf files. - - Part of the swftools package. - - Copyright (c) 2007 Huub Schaeks - Copyright (c) 2007 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __EASE_H -#define __EASE_H - -typedef struct _interpolation { - int function; - float slope, speed, amplitude, growth, damping; - int bounces; -} interpolation_t; - -enum { - IF_LINEAR = 1, - IF_QUAD_IN = 2, - IF_QUAD_OUT = 3, - IF_QUAD_IN_OUT = 4, - IF_CUBIC_IN = 5, - IF_CUBIC_OUT = 6, - IF_CUBIC_IN_OUT = 7, - IF_QUART_IN = 8, - IF_QUART_OUT = 9, - IF_QUART_IN_OUT = 10, - IF_QUINT_IN = 11, - IF_QUINT_OUT = 12, - IF_QUINT_IN_OUT = 13, - IF_CIRCLE_IN = 14, - IF_CIRCLE_OUT = 15, - IF_CIRCLE_IN_OUT = 16, - IF_EXPONENTIAL_IN = 17, - IF_EXPONENTIAL_OUT = 18, - IF_EXPONENTIAL_IN_OUT = 19, - IF_SINE_IN = 20, - IF_SINE_OUT = 21, - IF_SINE_IN_OUT = 22, - IF_ELASTIC_IN = 23, - IF_ELASTIC_OUT = 24, - IF_ELASTIC_IN_OUT = 25, - IF_BACK_IN = 26, - IF_BACK_OUT = 27, - IF_BACK_IN_OUT = 28, - IF_BOUNCE_IN = 29, - IF_BOUNCE_OUT = 30, - IF_BOUNCE_IN_OUT = 31, - IF_FAST_BOUNCE_IN = 32, - IF_FAST_BOUNCE_OUT = 33, - IF_FAST_BOUNCE_IN_OUT = 34 -}; - -float linear(float fraction, float start, float delta); - -float quadIn(float fraction, float start, float delta, float slope); -float quadOut(float fraction, float start, float delta, float slope); -float quadInOut(float fraction, float start, float delta, float slope); - -float cubicIn(float fraction, float start, float delta, float slope); -float cubicOut(float fraction, float start, float delta, float slope); -float cubicInOut(float fraction, float start, float delta, float slope); - -float quartIn(float fraction, float start, float delta, float slope); -float quartOut(float fraction, float start, float delta, float slope); -float quartInOut(float fraction, float start, float delta, float slope); - -float quintIn(float fraction, float start, float delta, float slope); -float quintOut(float fraction, float start, float delta, float slope); -float quintInOut(float fraction, float start, float delta, float slope); - -float circleIn(float fraction, float start, float delta, float slope); -float circleOut(float fraction, float start, float delta, float slope); -float circleInOut(float fraction, float start, float delta, float slope); - -float exponentialIn(float fraction, float start, float delta); -float exponentialOut(float fraction, float start, float delta); -float exponentialInOut(float fraction, float start, float delta); - -float sineIn(float fraction, float start, float delta); -float sineOut(float fraction, float start, float delta); -float sineInOut(float fraction, float start, float delta); - -float elasticIn(float fraction, float start, float delta, float amplitude, int bounces, float damping); -float elasticOut(float fraction, float start, float delta, float amplitude, int bounces, float damping); -float elasticInOut(float fraction, float start, float delta, float amplitude, int bounces, float damping); - -float backIn(float fraction, float start, float delta, float speed); -float backOut(float fraction, float start, float delta, float speed); -float backInOut(float fraction, float start, float delta, float speed); - -float bounceIn(float fraction, float start, float delta, int bounces, float growth, float damping); -float bounceOut(float fraction, float start, float delta, int bounces, float growth, float damping); -float bounceInOut(float fraction, float start, float delta, int bounces, float growth, float damping); - -float fastBounceIn(float fraction, float start, float delta, int bounces, float growth, float damping); -float fastBounceOut(float fraction, float start, float delta, int bounces, float growth, float damping); -float fastBounceInOut(float fraction, float start, float delta, int bounces, float growth, float damping); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc.1 b/fluidbook/tools/swftools-special-swfdump/src/swfc.1 deleted file mode 100644 index efca89cc3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfc.1 +++ /dev/null @@ -1,31 +0,0 @@ -.TH swfc "1" "April 2009" "swfc" "swftools" -.SH NAME -swfc - compile .sc files to swf. - -.SH Synopsis -.B swfc [-o file.swf] file.sc - -.SH DESCRIPTION -Compiles a file written in sc (SWF Script) into a number of SWF files. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR - Print short help message and exit -.TP -\fB\-V\fR, \fB\-\-version\fR - Print version info and exit -.TP -\fB\-C\fR, \fB\-\-cgi\fR - Output to stdout (for use in CGI environments) -.TP -\fB\-v\fR, \fB\-\-verbose\fR - Increase verbosity. Use more than one \fB-v\fR for greater effect. -.TP -\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR - Specify output file (Default: output.swf). - This affects only the parts of the .sc file which haven't - specified an output file themselves. -.SH AUTHOR - -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfc.c b/fluidbook/tools/swftools-special-swfdump/src/swfc.c deleted file mode 100644 index 20cc81d09..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfc.c +++ /dev/null @@ -1,4592 +0,0 @@ -/* swfc.c - Compiles swf code (.sc) files into .swf files. - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include -#include -#include "../config.h" -#include "../lib/rfxswf.h" -#include "../lib/drawer.h" -#include "../lib/log.h" -#include "../lib/args.h" -#include "../lib/q.h" -#include "../lib/mp3.h" -#include "../lib/wav.h" -#include "parser.h" -#include "../lib/png.h" -#include "swfc-feedback.h" -#include "swfc-interpolation.h" -#include "swfc-history.h" - -//#define DEBUG -static char * outputname = "output.swf"; -static int verbose = 2; -static int optimize = 0; -static int override_outputname = 0; -static int do_cgi = 0; -static int change_sets_all = 0; -static int do_exports = 0; -static char * mainclass = ""; - -static struct options_t options[] = { -{"h", "help"}, -{"V", "version"}, -{"C", "cgi"}, -{"v", "verbose"}, -{"o", "output"}, -{0,0} -}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("swfc - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else if(!strcmp(name, "o")) { - outputname = val; - override_outputname = 1; - return 1; - } - else if(!strcmp(name, "O")) { - optimize = 1; - return 0; - } - else if(!strcmp(name, "C")) { - do_cgi = 1; - return 0; - } - else if(!strcmp(name, "v")) { - verbose ++; - return 0; - } - else { - printf("Unknown option: -%s\n", name); - exit(1); - } - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-o file.swf] file.sc\n", name); - printf("\n"); - printf("-h , --help Print short help message and exit\n"); - printf("-V , --version Print version info and exit\n"); - printf("-C , --cgi Output to stdout (for use in CGI environments)\n"); - printf("-v , --verbose Increase verbosity. \n"); - printf("-o , --output Set output file to .\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", - filename, name); - } - filename = name; - return 0; -} - -static struct token_t* file; - -static int pos; -static char*text; -static int textlen; -static int type; - -static void readToken() -{ - type = file[pos].type; - if(type == END) { - syntaxerror("unexpected end of file"); - } - text = file[pos].text; - textlen = strlen(text); - line = file[pos].line; - column = file[pos].column; - pos++; - //printf("---> %d(%s) %s\n", type, type_names[type], text); -} - -static void pushBack() -{ - int p; - if(!pos) syntaxerror("internal error 3"); - pos--; - p = pos; - if(p) p--; - text = file[p].text; - textlen = strlen(text); - type = file[p].type; - line = file[p].line; - column = file[p].column; -} - -static int noMoreTokens() -{ - if(file[pos].type == END) - return 1; - return 0; -} - -enum -{ - PT_PUT = 0, - PT_CHANGE = 1, - PT_SCHANGE = 2, - PT_MOVE = 3, - PT_SMOVE = 4, - PT_SWEEP = 5, - PT_JUMP = 6, - PT_STARTCLIP = 7, - PT_BUTTON = 8 -}; - -// ------------------------------ swf routines ---------------------------- -struct _character; -static struct level -{ - int type; //0=swf, 1=sprite, 2=clip, 3=button - - /* for swf (0): */ - SWF*swf; - char*filename; - char as3; - - /* for sprites (1): */ - TAG*tag; - U16 id; - char*name; - char*as3name; - U16 olddepth; - int oldframe; - dict_t oldinstances; - SRECT oldrect; - TAG* cut; - - SRECT scalegrid; - -} stack[256]; -static int stackpos = 0; - -static dict_t characters; -static dict_t images; -static dict_t textures; -static dict_t outlines; -static dict_t gradients; -static dict_t filters; -static dict_t interpolations; -static char idmap[65536]; -static TAG*tag = 0; //current tag - -static int id; //current character id -static int currentframe; //current frame in current level -static SRECT currentrect; //current bounding box in current level -static U16 currentdepth; -static dict_t instances; -static dict_t fonts; -static dict_t sounds; -static dict_t fontUsage; - -typedef struct _parameters { - int x,y; - float scalex, scaley; - CXFORM cxform; - float rotate; - float shear; - SPOINT pivot; - SPOINT pin; - U8 blendmode; //not interpolated - FILTERLIST* filters; - U16 set; // bits indicating wether a parameter was set in the c_placement function - U16 flags; // bits to toggle anything you may care to implement as a toggle - int noinstancename; -} parameters_t; - -typedef struct _character { - TAG*definingTag; - U16 id; - SRECT size; -} character_t; - -typedef struct _instance { - character_t*character; - U16 depth; - parameters_t parameters; - history_t* history; -} instance_t; - -typedef struct _outline { - SHAPE* shape; - SRECT bbox; -} outline_t; - -typedef struct _gradient { - GRADIENT gradient; - char radial; - int rotate; -} gradient_t; - -typedef struct _filter { - FILTER filter; -} filter_t; - -typedef struct _texture { - FILLSTYLE fs; -} texture_t; - -char* interpolationFunctions[] = {"linear", \ - "quadIn", "quadOut", "quadInOut", \ - "cubicIn", "cubicOut", "cubicInOut", \ - "quartIn", "quartOut", "quartInOut", \ - "quintIn", "quintOut", "quintInOut", \ - "circleIn", "circleOut", "circleInOut", \ - "exponentialIn", "exponentialOut", "exponentialInOut", \ - "sineIn", "sineOut", "sineInOut", \ - "elasticIn", "elasticOut", "elasticInOut", \ - "backIn", "backOut", "backInOut", \ - "bounceIn", "bounceOut", "bounceInOut", \ - "fastBounceIn", "fastBounceOut", "fastBounceInOut"}; - -static void character_init(character_t*c) -{ - memset(c, 0, sizeof(character_t)); -} - -static character_t* character_new() -{ - character_t*c; - c = (character_t*)malloc(sizeof(character_t)); - character_init(c); - return c; -} - -static void instance_init(instance_t*i) -{ - memset(i, 0, sizeof(instance_t)); - i->history = history_new(); -} - -static void instance_free(instance_t* i) -{ - history_free(i->history); - free(i); -} - -static instance_t* instance_new() -{ - instance_t*c; - c = (instance_t*)malloc(sizeof(instance_t)); - instance_init(c); - return c; -} - -static void free_instance(void* i) -{ - instance_free((instance_t*)i); -} - -static void free_font(void* f) -{ - swf_FontFree((SWFFONT*)f); -} - -static void gradient_free(GRADIENT* grad) -{ - free(grad->ratios); - free(grad->rgba); - free(grad); -} - -static void free_gradient(void* grad) -{ - gradient_free((GRADIENT*) grad); -} - -static void outline_free(outline_t* o) -{ - free(o->shape->data); - free(o->shape); - free(o); -} - -static void free_outline(void* o) -{ - outline_free((outline_t*)o); -} - -static void freeDictionaries() -{ - dict_free_all(&instances, 1, free_instance); - dict_free_all(&characters, 1, free); - dict_free_all(&images, 1, free); - dict_free_all(&textures, 1, free); - dict_free_all(&outlines, 1, free_outline); - dict_free_all(&gradients, 1, free_gradient); - dict_free_all(&filters, 1, free); - dict_free_all(&fonts, 1, free_font); - dict_free_all(&sounds, 1, free); - dict_free_all(&interpolations, 1, free); - cleanUp = 0; -} - -static void freeFontDictionary() -{ - dict_free_all(&fonts, 1, free_font); -} - -static void incrementid() -{ - while(id<65536 && idmap[id]) { - id++; - } - if(id>=65536) - syntaxerror("Out of character ids."); - idmap[id] = 1; -} - -static void s_addcharacter(const char*name, U16 id, TAG*ctag, SRECT r) -{ - if(dict_lookup(&characters, name)) - syntaxerror("character %s defined twice", name); - character_t* c = character_new(); - - c->definingTag = ctag; - c->id = id; - c->size = r; - dict_put(&characters, name, c); - - if(do_exports) { - tag = swf_InsertTag(tag, ST_NAMECHARACTER); - swf_SetU16(tag, id); - swf_SetString(tag, name); - tag = swf_InsertTag(tag, ST_EXPORTASSETS); - swf_SetU16(tag, 1); - swf_SetU16(tag, id); - swf_SetString(tag, name); - } -} -static void s_addimage(const char*name, U16 id, TAG*ctag, SRECT r) -{ - if(dict_lookup(&images, name)) - syntaxerror("image %s defined twice", name); - - character_t* c = character_new(); - c->definingTag = ctag; - c->id = id; - c->size = r; - dict_put(&images, name, c); -} -static instance_t* s_addinstance(const char*name, character_t*c, U16 depth) -{ - if(dict_lookup(&instances, name)) - syntaxerror("object %s defined twice", name); - instance_t* i = instance_new(); - i->character = c; - i->depth = depth; - //swf_GetMatrix(0, &i->matrix); - dict_put(&instances, name, i); - return i; -} - -static void parameters_clear(parameters_t*p) -{ - p->x = 0; p->y = 0; - p->scalex = 1.0; p->scaley = 1.0; - p->pin.x = 0; //1?? - p->pin.y = 0; - p->pivot.x = 0; p->pivot.y = 0; - p->rotate = 0; - p->shear = 0; - p->blendmode = 0; - p->filters = 0; - p->noinstancename = 0; - swf_GetCXForm(0, &p->cxform, 1); -} - -static void makeMatrix(MATRIX*m, parameters_t*p) -{ - SPOINT h; - float sx,r1,r0,sy; - - /* /sx r1\ /x\ - * \r0 sy/ \y/ - */ - - sx = p->scalex*cos(p->rotate/360*2*M_PI); - r1 = -p->scalex*sin(p->rotate/360*2*M_PI)+sx*p->shear; - r0 = p->scaley*sin(p->rotate/360*2*M_PI); - sy = p->scaley*cos(p->rotate/360*2*M_PI)+r0*p->shear; - - m->sx = (int)(sx*65536+0.5); - m->r1 = (int)(r1*65536+0.5); - m->r0 = (int)(r0*65536+0.5); - m->sy = (int)(sy*65536+0.5); - - m->tx = m->ty = 0; - - h = swf_TurnPoint(p->pin, m); - m->tx = p->x - h.x; - m->ty = p->y - h.y; -} - -static MATRIX s_instancepos(SRECT rect, parameters_t*p) -{ - MATRIX m; - SRECT r; - makeMatrix(&m, p); - r = swf_TurnRect(rect, &m); - if(currentrect.xmin == 0 && currentrect.ymin == 0 && - currentrect.xmax == 0 && currentrect.ymax == 0) - currentrect = r; - else - swf_ExpandRect2(¤trect, &r); - return m; -} - -void initBuiltIns() -{ - interpolation_t* new; - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_LINEAR; - dict_put(&interpolations, "linear", new); - - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_QUAD_IN; - new->slope = 0; - dict_put(&interpolations, "quadIn", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_QUAD_OUT; - new->slope = 0; - dict_put(&interpolations, "quadOut", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_QUAD_IN_OUT; - new->slope = 0; - dict_put(&interpolations, "quadInOut", new); - - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_CUBIC_IN; - new->slope = 0; - dict_put(&interpolations, "cubicIn", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_CUBIC_OUT; - new->slope = 0; - dict_put(&interpolations, "cubicOut", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_CUBIC_IN_OUT; - new->slope = 0; - dict_put(&interpolations, "cubicInOut", new); - - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_QUART_IN; - new->slope = 0; - dict_put(&interpolations, "quartIn", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_QUART_OUT; - new->slope = 0; - dict_put(&interpolations, "quartOut", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_QUART_IN_OUT; - new->slope = 0; - dict_put(&interpolations, "quartInOut", new); - - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_QUINT_IN; - new->slope = 0; - dict_put(&interpolations, "quintIn", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_QUINT_OUT; - new->slope = 0; - dict_put(&interpolations, "quintOut", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_QUINT_IN_OUT; - new->slope = 0; - dict_put(&interpolations, "quintInOut", new); - - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_CIRCLE_IN; - dict_put(&interpolations, "circleIn", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_CIRCLE_OUT; - dict_put(&interpolations, "circleOut", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_CIRCLE_IN_OUT; - dict_put(&interpolations, "circleInOut", new); - - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_EXPONENTIAL_IN; - dict_put(&interpolations, "exponentialIn", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_EXPONENTIAL_OUT; - dict_put(&interpolations, "exponentialOut", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_EXPONENTIAL_IN_OUT; - dict_put(&interpolations, "exponentialInOut", new); - - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_SINE_IN; - dict_put(&interpolations, "sineIn", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_SINE_OUT; - dict_put(&interpolations, "sineOut", new); - new = (interpolation_t*)malloc(sizeof(interpolation_t)); - new->function = IF_SINE_IN_OUT; - dict_put(&interpolations, "sineInOut", new); - - RGBA c; - memset(&c, 0, sizeof(RGBA)); - gradient_t* noGradient = (gradient_t*)malloc(sizeof(gradient_t)); - noGradient->gradient.ratios = (U8*)malloc(16 * sizeof(U8)); - noGradient->gradient.rgba = (RGBA*)malloc(16 * sizeof(RGBA)); - noGradient->gradient.num = 2; - noGradient->gradient.rgba[0] = c; - noGradient->gradient.ratios[0] = 0; - noGradient->gradient.rgba[1] = c; - noGradient->gradient.ratios[1] = 255; - noGradient->radial = 0; - noGradient->rotate = 0; - dict_put(&gradients, "no_gradient", noGradient); - - noFilters = 0; -// put a no_filters entry in the filters dictionary to provoce a message when a user tries -// to define a no_filters filter. The real filter=no_filters case is handled in parseFilters. - FILTER* dummy = (FILTER*)malloc(sizeof(FILTER)); - dict_put(&filters, "no_filters", dummy); - noBlur = (FILTER_BLUR*) swf_NewFilter(FILTERTYPE_BLUR); - noBlur->passes = 1; - dict_put(&filters, "no_blur", noBlur); - noBevel = (FILTER_BEVEL*) swf_NewFilter(FILTERTYPE_BEVEL); - noBevel->passes = 1; - noBevel->composite = 1; - dict_put(&filters, "no_bevel", noBevel); - noDropshadow = (FILTER_DROPSHADOW*) swf_NewFilter(FILTERTYPE_DROPSHADOW); - noDropshadow->passes = 1; - noDropshadow->composite = 1; - dict_put(&filters, "no_dropshadow", noDropshadow); - noGradientGlow = (FILTER_GRADIENTGLOW*) swf_NewFilter(FILTERTYPE_GRADIENTGLOW); - noGradientGlow->passes = 1; - noGradientGlow->composite = 1; - noGradientGlow->gradient = &noGradient->gradient; - dict_put(&filters, "no_gradientglow", noGradientGlow); -} - -void s_swf(const char*name, SRECT r, int version, int fps, int compress, RGBA background) -{ - if(stackpos) - syntaxerror(".swf blocks can't be nested"); - if(stackpos==sizeof(stack)/sizeof(stack[0])) - syntaxerror("too many levels of recursion"); - - SWF*swf = (SWF*)malloc(sizeof(SWF)); - - memset(swf, 0, sizeof(swf)); - swf->fileVersion = version; - swf->movieSize = r; - swf->frameRate = fps; - swf->firstTag = tag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR); - swf->compressed = compress; - swf_SetRGB(tag,&background); - - dict_init(&characters, 16); - dict_init(&images, 16); - dict_init(&textures, 16); - dict_init(&outlines, 16); - dict_init(&gradients, 16); - dict_init(&filters, 16); - dict_init(&instances, 16); - dict_init(&sounds, 16); - dict_init(&interpolations, 16); - initBuiltIns(); - cleanUp = &freeDictionaries; - - memset(&stack[stackpos], 0, sizeof(stack[0])); - stack[stackpos].type = 0; - stack[stackpos].filename = strdup(name); - stack[stackpos].swf = swf; - stack[stackpos].oldframe = -1; - stackpos++; - - currentframe = 0; - memset(¤trect, 0, sizeof(currentrect)); - currentdepth = 1; - - memset(idmap, 0, sizeof(idmap)); - idmap[0]=1; //main movie has ID 0 - - incrementid(); -} - -void s_sprite(const char*name, SRECT*scalegrid, const char*as3name) -{ - tag = swf_InsertTag(tag, ST_DEFINESPRITE); - swf_SetU16(tag, id); //id - swf_SetU16(tag, 0); //frames - - memset(&stack[stackpos], 0, sizeof(stack[0])); - stack[stackpos].type = 1; - stack[stackpos].oldframe = currentframe; - stack[stackpos].olddepth = currentdepth; - stack[stackpos].oldrect = currentrect; - stack[stackpos].oldinstances = instances; - stack[stackpos].tag = tag; - stack[stackpos].id = id; - stack[stackpos].name = strdup(name); - stack[stackpos].as3name = strdup(as3name); - if(scalegrid) { - stack[stackpos].scalegrid = *scalegrid; - } else { - memset(&stack[stackpos].scalegrid, 0, sizeof(SRECT)); - } - - /* FIXME: those four fields should be bundled together */ - dict_init(&instances, 16); - currentframe = 0; - currentdepth = 1; - memset(¤trect, 0, sizeof(currentrect)); - - stackpos++; - incrementid(); -} - -typedef struct _buttonrecord -{ - U16 id; - MATRIX matrix; - CXFORM cxform; - char set; -} buttonrecord_t; - -typedef struct _button -{ - int endofshapes; - int nr_actions; - buttonrecord_t records[4]; -} button_t; - -static button_t mybutton; - -void s_button(const char*name, const char*as3name) -{ - tag = swf_InsertTag(tag, ST_DEFINEBUTTON2); - swf_SetU16(tag, id); //id - swf_ButtonSetFlags(tag, 0); //menu=no - - memset(&mybutton, 0, sizeof(mybutton)); - - memset(&stack[stackpos], 0, sizeof(stack[0])); - stack[stackpos].type = 3; - stack[stackpos].tag = tag; - stack[stackpos].id = id; - stack[stackpos].name = strdup(name); - stack[stackpos].as3name = strdup(as3name); - stack[stackpos].oldrect = currentrect; - memset(¤trect, 0, sizeof(currentrect)); - - stackpos++; - incrementid(); -} -void s_buttonput(const char*character, const char*as, parameters_t p) -{ - character_t* c = dict_lookup(&characters, character); - MATRIX m; - int flags = 0; - const char*o = as,*s = as; - buttonrecord_t r; - if(!stackpos || (stack[stackpos-1].type != 3)) { - syntaxerror(".show may only appear in .button"); - } - if(!c) { - syntaxerror("character %s not known (in .shape %s)", character, character); - } - if(mybutton.endofshapes) { - syntaxerror("a .do may not precede a .show", character, character); - } - - m = s_instancepos(c->size, &p); - - r.id = c->id; - r.matrix = m; - r.cxform = p.cxform; - r.set = 1; - - while(1) { - if(*s==',' || *s==0) { - if(!strncmp(o,"idle",s-o)) {mybutton.records[0]=r;o=s+1;} - else if(!strncmp(o,"shape",s-o)) {mybutton.records[0]=r;o=s+1;} - else if(!strncmp(o,"hover",s-o)) {mybutton.records[1]=r;o=s+1;} - else if(!strncmp(o,"pressed",s-o)) {mybutton.records[2]=r;o=s+1;} - else if(!strncmp(o,"area",s-o)) {mybutton.records[3]=r;o=s+1;} - else syntaxerror("unknown \"as\" argument: \"%s\"", strdup_n(o,s-o)); - } - if(!*s) - break; - s++; - } -} -static void setbuttonrecords(TAG*tag) -{ - int flags[] = {BS_UP,BS_OVER,BS_DOWN,BS_HIT}; - if(!mybutton.endofshapes) { - int t; - - if(!mybutton.records[3].set) { - memcpy(&mybutton.records[3], &mybutton.records[0], sizeof(buttonrecord_t)); - } - - for(t=0;t<4;t++) { - if(mybutton.records[t].set) { - swf_ButtonSetRecord(tag,flags[t],mybutton.records[t].id,1,&mybutton.records[t].matrix,&mybutton.records[t].cxform); - } - } - swf_SetU8(tag,0); // end of button records - mybutton.endofshapes = 1; - } -} - -void s_buttonaction(int flags, const char*action) -{ - ActionTAG* a = 0; - if(flags==0) { - return; - } - if(!stackpos || !stack[stackpos-1].tag || - stack[stackpos-1].tag->id != ST_DEFINEBUTTON2) { - syntaxerror("Need to be inside a button for .on_* commands"); - } - setbuttonrecords(stack[stackpos-1].tag); - - a = swf_ActionCompile(text, stack[0].swf->fileVersion); - if(!a) { - syntaxerror("Couldn't compile ActionScript"); - } - - swf_ButtonSetCondition(stack[stackpos-1].tag, flags); - swf_ActionSet(stack[stackpos-1].tag, a); - mybutton.nr_actions++; - - swf_ActionFree(a); -} - -static void setactionend(TAG*tag) -{ - if(!mybutton.nr_actions) { - /* no actions means we didn't have an actionoffset, - which means we can't signal the end of the - buttonaction records, so, *sigh*, we have - to insert a dummy record */ - swf_SetU16(tag, 0); //offset - swf_SetU16(tag, 0); //condition - swf_SetU8(tag, 0); //action - } -} - -static void s_endButton() -{ - SRECT r; - setbuttonrecords(stack[stackpos-1].tag); - setactionend(stack[stackpos-1].tag); - stackpos--; - - swf_ButtonPostProcess(stack[stackpos].tag, mybutton.nr_actions); - - r = currentrect; - - tag = stack[stackpos].tag; - currentrect = stack[stackpos].oldrect; - - s_addcharacter(stack[stackpos].name, stack[stackpos].id, stack[stackpos].tag, r); - - if(*stack[stackpos].as3name) { - tag = swf_InsertTag(tag, ST_SYMBOLCLASS); - swf_SetU16(tag, 1); - swf_SetU16(tag, stack[stackpos].id); - swf_SetString(tag, stack[stackpos].as3name); - } - - free(stack[stackpos].name); -} - -TAG* removeFromTo(TAG*from, TAG*to) -{ - TAG*save = from->prev; - while(from!=to) { - TAG*next = from->next; - if(swf_isAllowedSpriteTag(from)) - swf_DeleteTag(0, from); - from = next; - } - save->next = 0; - return save; -} - -static int parametersChange(history_t* history, int frame) -{ - int willChange = 0; - - willChange = willChange || history_change(history, frame, "x"); - willChange = willChange || history_change(history, frame, "y"); - willChange = willChange || history_change(history, frame, "scalex"); - willChange = willChange || history_change(history, frame, "scaley"); - willChange = willChange || history_change(history, frame, "cxform.r0"); - willChange = willChange || history_change(history, frame, "cxform.g0"); - willChange = willChange || history_change(history, frame, "cxform.b0"); - willChange = willChange || history_change(history, frame, "cxform.a0"); - willChange = willChange || history_change(history, frame, "cxform.r1"); - willChange = willChange || history_change(history, frame, "cxform.g1"); - willChange = willChange || history_change(history, frame, "cxform.b1"); - willChange = willChange || history_change(history, frame, "cxform.a1"); - willChange = willChange || history_change(history, frame, "rotate"); - willChange = willChange || history_change(history, frame, "shear"); - willChange = willChange || history_change(history, frame, "pivot.x"); - willChange = willChange || history_change(history, frame, "pivot.y"); - willChange = willChange || history_change(history, frame, "pin.x"); - willChange = willChange || history_change(history, frame, "pin.y"); - willChange = willChange || history_change(history, frame, "blendmode"); - willChange = willChange || history_changeFilter(history, frame); - - return willChange; -} - -static void free_filterlist(FILTERLIST* f_list) -{ - int i; - for (i = 0; i < f_list->num; i++) - { - if(f_list->filter[i]->type == FILTERTYPE_GRADIENTGLOW) - gradient_free(((FILTER_GRADIENTGLOW*)f_list->filter[i])->gradient); - free(f_list->filter[i]); - } - free(f_list); -} - -static void readParameters(history_t* history, parameters_t* p, int frame) -{ - p->x = history_value(history, frame, "x"); - p->y = history_value(history, frame, "y"); - p->scalex = history_value(history, frame, "scalex"); - p->scaley = history_value(history, frame, "scaley"); - p->cxform.r0 = history_value(history, frame, "cxform.r0"); - p->cxform.g0 = history_value(history, frame, "cxform.g0"); - p->cxform.b0 = history_value(history, frame, "cxform.b0"); - p->cxform.a0 = history_value(history, frame, "cxform.a0"); - p->cxform.r1 = history_value(history, frame, "cxform.r1"); - p->cxform.g1 = history_value(history, frame, "cxform.g1"); - p->cxform.b1 = history_value(history, frame, "cxform.b1"); - p->cxform.a1 = history_value(history, frame, "cxform.a1"); - p->rotate = history_rotateValue(history, frame); - p->shear = history_value(history, frame, "shear"); - p->pivot.x = history_value(history, frame, "pivot.x"); - p->pivot.y = history_value(history, frame, "pivot.y"); - p->pin.x = history_value(history, frame, "pin.x"); - p->pin.y = history_value(history, frame, "pin.y"); - p->blendmode = history_value(history, frame, "blendmode"); - p->filters = history_filterValue(history, frame); -} - -void setPlacement(TAG*tag, U16 id, U16 depth, MATRIX m, const char*name, parameters_t*p, char move) -{ - SWFPLACEOBJECT po; - FILTERLIST flist; - swf_GetPlaceObject(NULL, &po); - po.id = id; - po.depth = depth; - po.matrix = m; - po.cxform = p->cxform; - po.name = (char*)name; - po.move = move; - if(move) - po.id = 0; - if(p->blendmode) { - po.blendmode = p->blendmode; - } - if(p->filters) - po.filters = p->filters; - swf_SetPlaceObject(tag, &po); -} - -static void writeInstance(void* _i) -{ - instance_t*i = (instance_t*)_i; - parameters_t p; - MATRIX m; - int frame = i->history->firstFrame; - TAG* tag = i->history->firstTag; - history_processFlags(i->history); - while (tag && frame < currentframe) - { - frame++; - while (tag && tag->id != ST_SHOWFRAME) - tag = tag->next; - if(parametersChange(i->history, frame)) - { - readParameters(i->history, &p, frame); - m = s_instancepos(i->character->size, &p); - - if(p.blendmode || p.filters) - tag = swf_InsertTag(tag, ST_PLACEOBJECT3); - else - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - setPlacement(tag, 0, i->depth, m, 0, &p, 1); - if(p.filters) - free_filterlist(p.filters); - } else if(tag) { - tag = tag->next; - } - } -} - -void dumpSWF(SWF*swf) -{ - TAG* tag = swf->firstTag; - printf("vvvvvvvvvvvvvvvvvvvvv\n"); - while(tag) { - printf("%8d %s\n", tag->len, swf_TagGetName(tag)); - tag = tag->next; - } - printf("^^^^^^^^^^^^^^^^^^^^^\n"); -} - -static void s_endSprite() -{ - SRECT r = currentrect; - - stackpos--; - instance_t *i; - - dict_foreach_value(&instances, writeInstance); - - if(stack[stackpos].cut) - tag = removeFromTo(stack[stackpos].cut, tag); - - // the writeInstance loop above may have inserted tags after what used to be the current tag, - // so let's make sure 'tag' point to the current tag again. - while (tag->next) - tag = tag->next; - - tag = swf_InsertTag(tag, ST_SHOWFRAME); - tag = swf_InsertTag(tag, ST_END); - - tag = stack[stackpos].tag; - swf_FoldSprite(tag); - - if(stack[stackpos].scalegrid.xmin | stack[stackpos].scalegrid.ymin | - stack[stackpos].scalegrid.xmax | stack[stackpos].scalegrid.ymax) - { - tag = swf_InsertTag(tag, ST_DEFINESCALINGGRID); - swf_SetU16(tag, stack[stackpos].id); - swf_SetRect(tag, &stack[stackpos].scalegrid); - } - - if(tag->next != 0) - syntaxerror("internal error(7)"); - /* TODO: before clearing, prepend "." to names and - copy into old instances dict */ - dict_free_all(&instances, 1, free_instance); - - currentframe = stack[stackpos].oldframe; - currentrect = stack[stackpos].oldrect; - currentdepth = stack[stackpos].olddepth; - instances = stack[stackpos].oldinstances; - - s_addcharacter(stack[stackpos].name, stack[stackpos].id, stack[stackpos].tag, r); - - if(*stack[stackpos].as3name) { - tag = swf_InsertTag(tag, ST_SYMBOLCLASS); - swf_SetU16(tag, 1); - swf_SetU16(tag, stack[stackpos].id); - swf_SetString(tag, stack[stackpos].as3name); - } - - - free(stack[stackpos].name); -} - -static void s_endSWF() -{ - int fi; - SWF* swf; - char*filename; - char*mc=""; - - dict_foreach_value(&instances, writeInstance); - - if(stack[stackpos].cut) - tag = removeFromTo(stack[stackpos].cut, tag); - - stackpos--; - - swf = stack[stackpos].swf; - filename = stack[stackpos].filename; - - // the writeInstance loop above may have inserted tags after what used yo be the current tag, - // so let's make sure 'tag' point to the current tag again. - while (tag->next) - tag = tag->next; - - //if(tag->prev && tag->prev->id != ST_SHOWFRAME) - // tag = swf_InsertTag(tag, ST_SHOWFRAME); - tag = swf_InsertTag(tag, ST_SHOWFRAME); - - if(stack[0].as3) { - TAG*tag = swf->firstTag; - tag = swf_InsertTag(tag, ST_DOABC); - void*code = as3_getcode(); - swf_WriteABC(tag, code); - if(*mainclass) - mc = mainclass; - else if(as3_getglobalclass()) - mc = as3_getglobalclass(); - if(*mc) { - tag = swf_InsertTag(tag, ST_SYMBOLCLASS); - swf_SetU16(tag, 1); - swf_SetU16(tag, 0); - swf_SetString(tag, mc); - } else { - warning("no global public MovieClip subclass"); - } - as3_destroy(); - } - - tag = swf_InsertTag(tag, ST_END); - - swf_OptimizeTagOrder(swf); - - if(optimize) { - swf_Optimize(swf); - } - - if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin)) { - swf->movieSize = currentrect; /* "autocrop" */ - } - - if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin)) { - swf->movieSize.xmax += 20; /* 1 by 1 pixels */ - swf->movieSize.ymax += 20; - warning("Empty bounding box for movie"); - } - - if(do_cgi || !strcmp(filename, "-")) - fi = fileno(stdout); - else - fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - if(fi<0) { - syntaxerror("couldn't create output file %s", filename); - } - if(do_cgi) - {if(swf_WriteCGI(swf)<0) syntaxerror("WriteCGI() failed.\n");} - else - {if(swf_WriteSWF(fi, swf)<0) syntaxerror("WriteSWF() failed.\n");} - - close(fi); - - freeDictionaries(); - - swf_FreeTags(swf); - free(swf); - free(filename); -} - -void s_close() -{ - if(stackpos) { - if(stack[stackpos-1].type == 0) - syntaxerror("End of file encountered in .flash block"); - if(stack[stackpos-1].type == 1) - syntaxerror("End of file encountered in .sprite block"); - if(stack[stackpos-1].type == 2) - syntaxerror("End of file encountered in .clip block"); - } -} - -int s_getframe() -{ - return currentframe+1; -} - -void s_frame(int nr, int cut, const char*name, char anchor) -{ - int t; - TAG*now = tag; - - if(nr<1) - syntaxerror("Illegal frame number"); - nr--; // internally, frame 1 is frame 0 - - for(t=currentframe;tfs); - } else if((image = dict_lookup(&images, name))) { - MATRIX m; - swf_GetMatrix(0, &m); - m.sx = 65536.0*20.0*(r->xmax - r->xmin)/image->size.xmax; - m.sy = 65536.0*20.0*(r->ymax - r->ymin)/image->size.ymax; - m.tx = r->xmin; - m.ty = r->ymin; - return swf_ShapeAddBitmapFillStyle(s, &m, image->id, 0); - } else if((gradient = dict_lookup(&gradients, name))) { - SRECT r2; - MATRIX rot,m; - double ccos,csin; - swf_GetMatrix(0, &rot); - ccos = cos(-gradient->rotate*2*M_PI/360); - csin = sin(-gradient->rotate*2*M_PI/360); - rot.sx = ccos*65536; - rot.r1 = -csin*65536; - rot.r0 = csin*65536; - rot.sy = ccos*65536; - r2 = swf_TurnRect(*r, &rot); - swf_GetMatrix(0, &m); - m.sx = (r2.xmax - r2.xmin)*2*ccos; - m.r1 = -(r2.xmax - r2.xmin)*2*csin; - m.r0 = (r2.ymax - r2.ymin)*2*csin; - m.sy = (r2.ymax - r2.ymin)*2*ccos; - m.tx = r->xmin + (r->xmax - r->xmin)/2; - m.ty = r->ymin + (r->ymax - r->ymin)/2; - return swf_ShapeAddGradientFillStyle(s, &m, &gradient->gradient, gradient->radial); - } else if(parseColor2(name, &color)) { - return swf_ShapeAddSolidFillStyle(s, &color); - } else { - syntaxerror("not a color/fillstyle: %s", name); - return 0; - } -} - -RGBA black={r:0,g:0,b:0,a:0}; -void s_box(const char*name, int width, int height, RGBA color, int linewidth, const char*texture) -{ - SRECT r,r2; - SHAPE* s; - int ls1=0,fs1=0; - r2.xmin = 0; - r2.ymin = 0; - r2.xmax = width; - r2.ymax = height; - tag = swf_InsertTag(tag, ST_DEFINESHAPE3); - swf_ShapeNew(&s); - if(linewidth) { - linewidth = linewidth>=20?linewidth-20:0; - ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); - } - if(texture) - fs1 = addFillStyle(s, &r2, texture); - - swf_SetU16(tag,id); - r.xmin = r2.xmin-linewidth/2; - r.ymin = r2.ymin-linewidth/2; - r.xmax = r2.xmax+linewidth/2; - r.ymax = r2.ymax+linewidth/2; - swf_SetRect(tag,&r); - swf_SetShapeHeader(tag,s); - swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0); - swf_ShapeSetLine(tag,s,width,0); - swf_ShapeSetLine(tag,s,0,height); - swf_ShapeSetLine(tag,s,-width,0); - swf_ShapeSetLine(tag,s,0,-height); - swf_ShapeSetEnd(tag); - swf_ShapeFree(s); - - s_addcharacter(name, id, tag, r); - incrementid(); -} - -void s_filled(const char*name, const char*outlinename, RGBA color, int linewidth, const char*texture) -{ - SRECT rect,r2; - SHAPE* s; - int ls1,fs1=0; - outline_t* outline; - outline = dict_lookup(&outlines, outlinename); - if(!outline) { - syntaxerror("outline %s not defined", outlinename); - } - r2 = outline->bbox; - - tag = swf_InsertTag(tag, ST_DEFINESHAPE3); - swf_ShapeNew(&s); - if(linewidth) { - linewidth = linewidth>=20?linewidth-20:0; - ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); - } - if(texture) - fs1 = addFillStyle(s, &r2, texture); - - swf_SetU16(tag,id); - rect.xmin = r2.xmin-linewidth/2; - rect.ymin = r2.ymin-linewidth/2; - rect.xmax = r2.xmax+linewidth/2; - rect.ymax = r2.ymax+linewidth/2; - - swf_SetRect(tag,&rect); - swf_SetShapeStyles(tag, s); - swf_ShapeCountBits(s,0,0); - swf_RecodeShapeData(outline->shape->data, outline->shape->bitlen, outline->shape->bits.fill, outline->shape->bits.line, - &s->data, &s->bitlen, s->bits.fill, s->bits.line); - swf_SetShapeBits(tag, s); - swf_SetBlock(tag, s->data, (s->bitlen+7)/8); - swf_ShapeFree(s); - - s_addcharacter(name, id, tag, rect); - incrementid(); -} - -void s_circle(const char*name, int r, RGBA color, int linewidth, const char*texture) -{ - SRECT rect,r2; - SHAPE* s; - int ls1=0,fs1=0; - r2.xmin = r2.ymin = 0; - r2.xmax = 2*r; - r2.ymax = 2*r; - - tag = swf_InsertTag(tag, ST_DEFINESHAPE3); - swf_ShapeNew(&s); - if(linewidth) { - linewidth = linewidth>=20?linewidth-20:0; - ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); - } - if(texture) - fs1 = addFillStyle(s, &r2, texture); - swf_SetU16(tag,id); - rect.xmin = r2.xmin-linewidth/2; - rect.ymin = r2.ymin-linewidth/2; - rect.xmax = r2.xmax+linewidth/2; - rect.ymax = r2.ymax+linewidth/2; - - swf_SetRect(tag,&rect); - swf_SetShapeHeader(tag,s); - swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0); - swf_ShapeSetCircle(tag, s, r,r,r,r); - swf_ShapeSetEnd(tag); - swf_ShapeFree(s); - - s_addcharacter(name, id, tag, rect); - incrementid(); -} - -void s_textshape(const char*name, const char*fontname, float size, const char*_text) -{ - int g; - U8*text = (U8*)_text; - outline_t* outline; - - SWFFONT*font; - font = dict_lookup(&fonts, fontname); - if(!font) - syntaxerror("font \"%s\" not known!", fontname); - - if(text[0] >= font->maxascii || font->ascii2glyph[text[0]]<0) { - warning("no character 0x%02x (%c) in font \"%s\"", text[0], text[0], fontname); - s_box(name, 0, 0, black, 20, 0); - return; - } - g = font->ascii2glyph[text[0]]; - - outline = malloc(sizeof(outline_t)); - memset(outline, 0, sizeof(outline_t)); - outline->shape = font->glyph[g].shape; - outline->bbox = font->layout->bounds[g]; - - { - drawer_t draw; - swf_Shape11DrawerInit(&draw, 0); - swf_DrawText(&draw, font, (int)(size*100), (char*)_text); - draw.finish(&draw); - outline->shape = swf_ShapeDrawerToShape(&draw); - outline->bbox = swf_ShapeDrawerGetBBox(&draw); - draw.dealloc(&draw); - } - - if(dict_lookup(&outlines, name)) - syntaxerror("outline %s defined twice", name); - dict_put(&outlines, name, outline); -} - -void s_text(const char*name, const char*fontname, const char*text, int size, RGBA color) -{ - SRECT r; - MATRIX _m,*m=0; - SWFFONT*font; - font = dict_lookup(&fonts, fontname); - if(!font) - syntaxerror("font \"%s\" not known!", fontname); - - tag = swf_InsertTag(tag, ST_DEFINETEXT2); - swf_SetU16(tag, id); - if(!font->numchars) { - s_box(name, 0, 0, black, 20, 0); - return; - } - r = swf_SetDefineText(tag, font, &color, (char*)text, size); - - if(stack[0].swf->fileVersion >= 8) { - tag = swf_InsertTag(tag, ST_CSMTEXTSETTINGS); - swf_SetU16(tag, id); - swf_SetU8(tag, /*grid*/(1<<3)|/*flashtype*/0x40); - swf_SetU32(tag, 0);//thickness - swf_SetU32(tag, 0);//sharpness - swf_SetU8(tag, 0);//reserved - } - - s_addcharacter(name, id, tag, r); - incrementid(); -} - -void s_quicktime(const char*name, const char*url) -{ - SRECT r; - MATRIX _m,*m=0; - - memset(&r, 0, sizeof(r)); - - tag = swf_InsertTag(tag, ST_DEFINEMOVIE); - swf_SetU16(tag, id); - swf_SetString(tag, url); - - s_addcharacter(name, id, tag, r); - incrementid(); -} - -void s_video(const char *name, int width, int height) -{ - SRECT r; - - memset(&r, 0, sizeof(r)); - - tag = swf_InsertTag(tag, ST_DEFINEVIDEOSTREAM); - swf_SetU16(tag, id); - swf_SetU16(tag, 0); // numframes - swf_SetU16(tag, width); - swf_SetU16(tag, height); - swf_SetU8(tag, 0); // videoflags - swf_SetU8(tag, 0); // codecid - - s_addcharacter(name, id, tag, r); - incrementid(); -} - -void s_edittext(const char*name, const char*fontname, int size, int width, int height, const char*text, RGBA*color, int maxlength, const char*variable, int flags, int align) -{ - SWFFONT*font = 0; - EditTextLayout layout; - SRECT r; - - if(fontname && *fontname) { - flags |= ET_USEOUTLINES; - font = dict_lookup(&fonts, fontname); - if(!font) - syntaxerror("font \"%s\" not known!", fontname); - } - tag = swf_InsertTag(tag, ST_DEFINEEDITTEXT); - swf_SetU16(tag, id); - layout.align = align; - layout.leftmargin = 0; - layout.rightmargin = 0; - layout.indent = 0; - layout.leading = 0; - r.xmin = 0; - r.ymin = 0; - r.xmax = width; - r.ymax = height; - - swf_SetEditText(tag, flags, r, (char*)text, color, maxlength, font?font->id:0, size, &layout, (char*)variable); - - s_addcharacter(name, id, tag, r); - incrementid(); -} - -/* type: either "jpeg" or "png" - */ -void s_image(const char*name, const char*type, const char*filename, int quality) -{ - /* an image is actually two folded: 1st bitmap, 2nd character. - Both of them can be used separately */ - - /* step 1: the bitmap */ - SRECT r; - int imageID = id; - unsigned width, height; - if(!strcmp(type,"jpeg")) { -#ifndef HAVE_JPEGLIB - warning("no jpeg support compiled in"); - s_box(name, 0, 0, black, 20, 0); - return; -#else - tag = swf_InsertTag(tag, ST_DEFINEBITSJPEG2); - swf_SetU16(tag, imageID); - - if(swf_SetJPEGBits(tag, (char*)filename, quality) < 0) { - syntaxerror("Image \"%s\" not found, or contains errors", filename); - } - - swf_GetJPEGSize(filename, &width, &height); - - r.xmin = 0; - r.ymin = 0; - r.xmax = width*20; - r.ymax = height*20; - - s_addimage(name, id, tag, r); - incrementid(); -#endif - } else if(!strcmp(type,"png")) { - RGBA*data = 0; - swf_SetU16(tag, imageID); - - png_load(filename, &width, &height, (unsigned char**)&data); - - if(!data) { - syntaxerror("Image \"%s\" not found, or contains errors", filename); - } - - /*tag = swf_AddImage(tag, imageID, data, width, height, quality)*/ - tag = swf_InsertTag(tag, ST_DEFINEBITSLOSSLESS); - swf_SetU16(tag, imageID); - swf_SetLosslessImage(tag, data, width, height); - free(data); - - r.xmin = 0; - r.ymin = 0; - r.xmax = width*20; - r.ymax = height*20; - s_addimage(name, id, tag, r); - incrementid(); - } else { - warning("image type \"%s\" not supported yet!", type); - s_box(name, 0, 0, black, 20, 0); - return; - } - - /* step 2: the character */ - tag = swf_InsertTag(tag, ST_DEFINESHAPE); // todo: should be defineshape2/3 once images can be transparent.(?) - swf_SetU16(tag, id); - swf_ShapeSetBitmapRect(tag, imageID, width, height); - - s_addcharacter(name, id, tag, r); - incrementid(); -} - -void s_getBitmapSize(const char*name, int*width, int*height) -{ - character_t* image = dict_lookup(&images, name); - gradient_t* gradient = dict_lookup(&gradients,name); - if(image) { - *width = image->size.xmax; - *height = image->size.ymax; - return; - } - if(gradient) { - /* internal SWF gradient size */ - if(gradient->radial) { - *width = 16384; - *height = 16384; - } else { - *width = 32768; - *height = 32768; - } - return; - } - syntaxerror("No such bitmap/gradient: %s", name); -} - -void s_texture(const char*name, const char*object, int x, int y, float scalex, float scaley, float rotate, float shear) -{ - if(dict_lookup(&textures, name)) - syntaxerror("texture %s defined twice", name); - gradient_t* gradient = dict_lookup(&gradients, object); - character_t* bitmap = dict_lookup(&images, object); - texture_t* texture = (texture_t*)rfx_calloc(sizeof(texture_t)); - parameters_t p; - FILLSTYLE*fs = &texture->fs; - - memset(&p, 0, sizeof(parameters_t)); - - if(bitmap) { - fs->type = FILL_TILED; - fs->id_bitmap = bitmap->id; - } else if(gradient) { - fs->type = gradient->radial?FILL_RADIAL:FILL_LINEAR; - fs->gradient = gradient->gradient; - } - p.x = x;p.y = y;p.scalex = scalex;p.scaley = scaley;p.rotate=rotate;p.shear=shear; - makeMatrix(&fs->m, &p); - if(gradient && !gradient->radial) { - MATRIX m = fs->m; - SPOINT p1,p2; - m.tx = 0; - m.ty = 0; - p1.x = 16384; - p1.y = 16384; - p2 = swf_TurnPoint(p1, &m); - fs->m.tx += p2.x; - fs->m.ty += p2.y; - } - if(bitmap) { - fs->m.sx *= 20; - fs->m.sy *= 20; - } - - dict_put(&textures, name, texture); -} - -void s_createfont(const char*name, const char*filename, const char*glyphs, char flashtype) -{ - if(dict_lookup(&fonts, name)) - syntaxerror("font %s defined twice", name); - - SWFFONT* font = swf_LoadFont(filename, flashtype); - if(font == 0) { - warning("Couldn't open font file \"%s\"", filename); - font = (SWFFONT*)malloc(sizeof(SWFFONT)); - memset(font, 0, sizeof(SWFFONT)); - dict_put(&fonts, name, font); - return; - } - swf_FontPrepareForEditText(font); - - if(!strcmp(glyphs, "all")) { - swf_FontUseAll(font); - font->use->glyphs_specified = 1; - } else { - if(!glyphs[0]) { - swf_FontInitUsage(font); - } else { - swf_FontUseUTF8(font, (const U8*)glyphs, 0xffff); - font->use->glyphs_specified = 1; - } - } - dict_put(&fonts, name, font); -} - -void s_font(const char*name, const char*filename) -{ - SWFFONT* font; - font = dict_lookup(&fonts, name); - font->id = id; - swf_FontReduce_swfc(font); - - if(font->version>=3 && stack[0].swf->fileVersion < 8) { - warning("flashtype not supported for flash versions 8 and below"); - } - - tag = swf_InsertTag(tag, font->version==3?ST_DEFINEFONT3:ST_DEFINEFONT2); - swf_FontSetDefine2(tag, font); - - if(do_exports) { - tag = swf_InsertTag(tag, ST_EXPORTASSETS); - swf_SetU16(tag, 1); - swf_SetU16(tag, id); - swf_SetString(tag, name); - } - - incrementid(); -} - - - -typedef struct _sound_t -{ - U16 id; - TAG*tag; -} sound_t; - -void s_sound(const char*name, const char*filename) -{ - struct WAV wav, wav2; - struct MP3 mp3; - sound_t* sound; - U16*samples = NULL; - unsigned numsamples = 1; - unsigned blocksize = 1152; - int is_mp3 = 0; - - if(dict_lookup(&sounds, name)) - syntaxerror("sound %s defined twice", name); - - if(wav_read(&wav, filename)) - { - int t; - wav_convert2mono(&wav, &wav2, 44100); - samples = (U16*)wav2.data; - numsamples = wav2.size/2; - free(wav.data); -#ifdef WORDS_BIGENDIAN - /* swap bytes */ - for(t=0;t>8)&0xff | (samples[t]<<8)&0xff00; -#endif - } - else - if(mp3_read(&mp3, filename)) - { - fprintf(stderr, "\"%s\" seems to work as a MP3 file...\n", filename); - blocksize = 1; - is_mp3 = 1; - } - else - { - warning("Couldn't read WAV/MP3 file \"%s\"", filename); - samples = 0; - numsamples = 0; - } - - if(numsamples%blocksize != 0) - { - // apply padding, so that block is a multiple of blocksize - int numblocks = (numsamples+blocksize-1)/blocksize; - int numsamples2; - U16* samples2; - numsamples2 = numblocks * blocksize; - samples2 = malloc(sizeof(U16)*numsamples2); - memcpy(samples2, samples, numsamples*sizeof(U16)); - memset(&samples2[numsamples], 0, sizeof(U16)*(numsamples2 - numsamples)); - numsamples = numsamples2; - free(samples); - samples = samples2; - } - - tag = swf_InsertTag(tag, ST_DEFINESOUND); - swf_SetU16(tag, id); //id - if(is_mp3) - { - swf_SetSoundDefineMP3( - tag, mp3.data, mp3.size, - mp3.SampRate, - mp3.Channels, - mp3.NumFrames); - mp3_clear(&mp3); - } - else - swf_SetSoundDefine(tag, samples, numsamples); - - if(do_exports) { - tag = swf_InsertTag(tag, ST_NAMECHARACTER); - swf_SetU16(tag, id); - swf_SetString(tag, name); - tag = swf_InsertTag(tag, ST_EXPORTASSETS); - swf_SetU16(tag, 1); - swf_SetU16(tag, id); - swf_SetString(tag, name); - } - - sound = (sound_t*)malloc(sizeof(sound_t)); /* mem leak */ - sound->tag = tag; - sound->id = id; - - dict_put(&sounds, name, sound); - - incrementid(); - - if(samples) - free(samples); -} - -static char* gradient_getToken(const char**p) -{ - const char*start; - char*result; - while(**p && strchr(" \t\n\r", **p)) { - (*p)++; - } - start = *p; - while(**p && !strchr(" \t\n\r", **p)) { - (*p)++; - } - result = malloc((*p)-start+1); - memcpy(result,start,(*p)-start+1); - result[(*p)-start] = 0; - return result; -} - -float parsePercent(const char*str); -RGBA parseColor(const char*str); - -GRADIENT parseGradient(const char*str) -{ - GRADIENT gradient; - int lastpos = -1; - const char* p = str; - memset(&gradient, 0, sizeof(GRADIENT)); - gradient.ratios = rfx_calloc(16*sizeof(U8)); - gradient.rgba = rfx_calloc(16*sizeof(RGBA)); - - while(*p) - { - char*posstr,*colorstr; - int pos; - RGBA color; - posstr = gradient_getToken(&p); - if(!*posstr) - { - free(posstr); - break; - } - pos = (int)(parsePercent(posstr)*255.0); - if(pos == lastpos) - pos++; - if(!*p) - { - rfx_free(gradient.ratios); - rfx_free(gradient.rgba); - free(posstr); - syntaxerror("Error in shape data: Color expected after %s", posstr); - } - colorstr = gradient_getToken(&p); - color = parseColor(colorstr); - if(gradient.num == 16) - { - warning("gradient record too big- max size is 16, rest ignored"); - break; - } - gradient.ratios[gradient.num] = pos; - gradient.rgba[gradient.num] = color; - gradient.num++; - free(posstr); - free(colorstr); - lastpos = pos; - } - return gradient; -} - -FILTERLIST* parseFilters(char* list) -{ - if(!strcmp(list, "no_filters")) - return 0; - FILTER* f; - FILTERLIST* f_list = (FILTERLIST*)malloc(sizeof(FILTERLIST)); - f_list->num = 0; - char* f_start = list; - char* f_end; - while (f_start) - { - f_end = strchr(f_start, ','); - if(f_end) - *f_end = '\0'; - f = dict_lookup(&filters, f_start); - if(!f) - { - free(f_list); - syntaxerror("unknown filter %s", f_start); - } - if(f_list->num == 8) - { - warning("too many filters in filterlist, no more than 8 please, rest ignored"); - break; - } - f_list->filter[f_list->num] = f; - f_list->num++; - if(f_end) - { - *f_end = ','; - f_start = f_end + 1; - } - else - f_start = 0; - } - return f_list; -} - -void s_gradient(const char*name, const char*text, int radial, int rotate) -{ - gradient_t* gradient; - gradient = malloc(sizeof(gradient_t)); - memset(gradient, 0, sizeof(gradient_t)); - gradient->gradient = parseGradient(text); - gradient->radial = radial; - gradient->rotate = rotate; - - dict_put(&gradients, name, gradient); -} - -void s_gradientglow(const char*name, const char*gradient, float blurx, float blury, - float angle, float distance, float strength, char innershadow, - char knockout, char composite, char ontop, int passes) -{ - if(dict_lookup(&filters, name)) - syntaxerror("filter %s defined twice", name); - - gradient_t* g = dict_lookup(&gradients, gradient); - if(!g) - syntaxerror("unknown gradient %s", gradient); - - composite = 1; - - FILTER_GRADIENTGLOW* filter = rfx_calloc(sizeof(FILTER_GRADIENTGLOW)); - filter->type = FILTERTYPE_GRADIENTGLOW; - filter->gradient = &g->gradient; - filter->blurx = blurx; - filter->blury = blury; - filter->strength = strength; - filter->angle = angle; - filter->distance = distance; - filter->innershadow = innershadow; - filter->knockout = knockout; - filter->composite = composite; - filter->ontop = ontop; - filter->passes = passes; - - dict_put(&filters, name, filter); -} - -void s_dropshadow(const char*name, RGBA color, double blurx, double blury, double angle, double distance, double strength, char innershadow, char knockout, char composite, int passes) -{ - if(dict_lookup(&filters, name)) - syntaxerror("filter %s defined twice", name); - - composite = 1; - FILTER_DROPSHADOW* filter = rfx_calloc(sizeof(FILTER_DROPSHADOW)); - filter->type = FILTERTYPE_DROPSHADOW; - filter->color= color; - filter->blurx = blurx; - filter->blury = blury; - filter->strength = strength; - filter->angle = angle; - filter->distance = distance; - filter->innershadow = innershadow; - filter->knockout = knockout; - filter->composite = composite; - filter->passes = passes; - - dict_put(&filters, name, filter); -} - -void s_bevel(const char*name, RGBA shadow, RGBA highlight, double blurx, double blury, double angle, double distance, double strength, char innershadow, char knockout, char composite, char ontop, int passes) -{ - if(dict_lookup(&filters, name)) - syntaxerror("filter %s defined twice", name); - - composite = 1; - FILTER_BEVEL* filter = rfx_calloc(sizeof(FILTER_BEVEL)); - filter->type = FILTERTYPE_BEVEL; - filter->shadow = shadow; - filter->highlight = highlight; - filter->blurx = blurx; - filter->blury = blury; - filter->strength = strength; - filter->angle = angle; - filter->distance = distance; - filter->innershadow = innershadow; - filter->knockout = knockout; - filter->composite = composite; - filter->ontop = ontop; - filter->passes = passes; - - dict_put(&filters, name, filter); -} - -void s_blur(const char*name, double blurx, double blury, int passes) -{ - if(dict_lookup(&filters, name)) - syntaxerror("filter %s defined twice", name); - - FILTER_BLUR* filter = rfx_calloc(sizeof(FILTER_BLUR)); - filter->type = FILTERTYPE_BLUR; - filter->blurx = blurx; - filter->blury = blury; - filter->passes = passes; - - dict_put(&filters, name, filter); -} - -void s_action(const char*text) -{ - if(stack[0].swf->fileVersion < 9) { - ActionTAG* a = 0; - a = swf_ActionCompile(text, stack[0].swf->fileVersion); - if(!a) { - swf_ActionFree(a); - syntaxerror("Couldn't compile ActionScript"); - } - tag = swf_InsertTag(tag, ST_DOACTION); - swf_ActionSet(tag, a); - swf_ActionFree(a); - } else { - as3_parse_bytearray(stack[0].filename, text, strlen(text)); - stack[0].as3 = 1; - } -} - -void s_initaction(const char*character, const char*text) -{ - ActionTAG* a = 0; - character_t*c = 0; - a = swf_ActionCompile(text, stack[0].swf->fileVersion); - if(!a) - { - swf_ActionFree(a); - syntaxerror("Couldn't compile ActionScript"); - } - - c = (character_t*)dict_lookup(&characters, character); - - tag = swf_InsertTag(tag, ST_DOINITACTION); - swf_SetU16(tag, c->id); - swf_ActionSet(tag, a); - - swf_ActionFree(a); -} - -int s_swf3action(const char*name, const char*action) -{ - ActionTAG* a = 0; - instance_t* object = 0; - if(name) - object = (instance_t*)dict_lookup(&instances, name); - if(!object && name && *name) { - /* we have a name, but couldn't find it. Abort. */ - return 0; - } - a = action_SetTarget(0, name); - if(!strcmp(action, "nextframe")) a = action_NextFrame(a); - else if(!strcmp(action, "previousframe")) a = action_PreviousFrame(a); - else if(!strcmp(action, "stop")) a = action_Stop(a); - else if(!strcmp(action, "play")) a = action_Play(a); - a = action_SetTarget(a, ""); - a = action_End(a); - - tag = swf_InsertTag(tag, ST_DOACTION); - swf_ActionSet(tag, a); - swf_ActionFree(a); - return 1; -} - -void s_outline(const char*name, const char*format, const char*source) -{ - if(dict_lookup(&outlines, name)) - syntaxerror("outline %s defined twice", name); - - outline_t* outline; - - drawer_t draw; - SHAPE* shape; - SHAPE2* shape2; - SRECT bounds; - - //swf_Shape10DrawerInit(&draw, 0); - swf_Shape11DrawerInit(&draw, 0); - - draw_string(&draw, source); - draw.finish(&draw); - shape = swf_ShapeDrawerToShape(&draw); - bounds = swf_ShapeDrawerGetBBox(&draw); - draw.dealloc(&draw); - - outline = (outline_t*)rfx_calloc(sizeof(outline_t)); - outline->shape = shape; - outline->bbox = bounds; - - dict_put(&outlines, name, outline); -} - -int s_playsound(const char*name, int loops, int nomultiple, int stop) -{ - sound_t* sound; - SOUNDINFO info; - if(!name) - return 0; - sound = dict_lookup(&sounds, name); - if(!sound) - return 0; - - tag = swf_InsertTag(tag, ST_STARTSOUND); - swf_SetU16(tag, sound->id); //id - memset(&info, 0, sizeof(info)); - info.stop = stop; - info.loops = loops; - info.nomultiple = nomultiple; - swf_SetSoundInfo(tag, &info); - return 1; -} - -void s_includeswf(const char*name, const char*filename, const char*as3name) -{ - int f; - SWF swf; - TAG* ftag; - SRECT r; - TAG* s; - int level = 0; - U16 cutout[] = {ST_SETBACKGROUNDCOLOR, ST_PROTECT, ST_FREEALL, ST_REFLEX}; - f = open(filename,O_RDONLY|O_BINARY); - if(f<0) { - warning("Couldn't open file \"%s\": %s", filename, strerror(errno)); - s_box(name, 0, 0, black, 20, 0); - return; - } - if(swf_ReadSWF(f,&swf)<0) { - warning("Only SWF files supported in .shape for now. File \"%s\" wasn't SWF.", filename); - s_box(name, 0, 0, black, 20, 0); - return; - } - close(f); - - /* FIXME: The following sets the bounding Box for the character. - It is wrong for two reasons: - a) It may be too small (in case objects in the movie clip at the borders) - b) it may be too big (because the poor movie never got autocropped) - */ - r = swf.movieSize; - - s = tag = swf_InsertTag(tag, ST_DEFINESPRITE); - swf_SetU16(tag, id); - swf_SetU16(tag, swf.frameCount); - - swf_Relocate(&swf, idmap); - - ftag = swf.firstTag; - level = 1; - while(ftag) { - int t; - for(t=0;tid) { - ftag = ftag->next; - continue; - } - if(ftag->id == ST_DEFINESPRITE && !swf_IsFolded(ftag)) - level++; - if(ftag->id == ST_END) - level--; - if(!level) - break; - - if(ftag->id != ST_SETBACKGROUNDCOLOR) { - /* We simply dump all tags right after the sprite - header, relying on the fact that swf_OptimizeTagOrder() will - sort things out for us later. - We also rely on the fact that the imported SWF is well-formed. - */ - tag = swf_InsertTag(tag, ftag->id); - swf_SetBlock(tag, ftag->data, ftag->len); - } - - ftag = ftag->next; - } - if(!ftag) - syntaxerror("Included file %s contains errors", filename); - tag = swf_InsertTag(tag, ST_END); - - swf_FreeTags(&swf); - - s_addcharacter(name, id, tag, r); - - if(as3name) { - tag = swf_InsertTag(tag, ST_SYMBOLCLASS); - swf_SetU16(tag, 1); - swf_SetU16(tag, id); - swf_SetString(tag, as3name); - } - incrementid(); -} -SRECT s_getCharBBox(const char*name) -{ - character_t* c = dict_lookup(&characters, name); - if(!c) syntaxerror("character '%s' unknown(2)", name); - return c->size; -} -SRECT s_getInstanceBBox(const char*name) -{ - instance_t * i = dict_lookup(&instances, name); - character_t * c; - if(!i) syntaxerror("instance '%s' unknown(4)", name); - c = i->character; - if(!c) syntaxerror("internal error(5)"); - return c->size; -} -void s_getParameters(const char*name, parameters_t* p) -{ - instance_t * i = dict_lookup(&instances, name); - if(!i) - syntaxerror("instance '%s' unknown(10)", name); - if(change_sets_all) - readParameters(i->history, p, currentframe); - else - *p = i->parameters; -} - -void setStartparameters(instance_t* i, parameters_t* p, TAG* tag) -{ - history_begin(i->history, "x", currentframe, tag, p->x); - history_begin(i->history, "y", currentframe, tag, p->y); - history_begin(i->history, "scalex", currentframe, tag, p->scalex); - history_begin(i->history, "scaley", currentframe, tag, p->scaley); - history_begin(i->history, "cxform.r0", currentframe, tag, p->cxform.r0); - history_begin(i->history, "cxform.g0", currentframe, tag, p->cxform.g0); - history_begin(i->history, "cxform.b0", currentframe, tag, p->cxform.b0); - history_begin(i->history, "cxform.a0", currentframe, tag, p->cxform.a0); - history_begin(i->history, "cxform.r1", currentframe, tag, p->cxform.r1); - history_begin(i->history, "cxform.g1", currentframe, tag, p->cxform.g1); - history_begin(i->history, "cxform.b1", currentframe, tag, p->cxform.b1); - history_begin(i->history, "cxform.a1", currentframe, tag, p->cxform.a1); - history_begin(i->history, "rotate", currentframe, tag, p->rotate); - history_begin(i->history, "shear", currentframe, tag, p->shear); - history_begin(i->history, "pivot.x", currentframe, tag, p->pivot.x); - history_begin(i->history, "pivot.y", currentframe, tag, p->pivot.y); - history_begin(i->history, "pin.x", currentframe, tag, p->pin.x); - history_begin(i->history, "pin.y", currentframe, tag, p->pin.y); - history_begin(i->history, "blendmode", currentframe, tag, p->blendmode); - history_beginFilter(i->history, currentframe, tag, p->filters); - history_begin(i->history, "flags", currentframe, tag, 0); -} - -void s_startclip(const char*instance, const char*character, parameters_t p) -{ - character_t* c = dict_lookup(&characters, character); - instance_t* i; - MATRIX m; - if(!c) { - syntaxerror("character %s not known", character); - } - i = s_addinstance(instance, c, currentdepth); - i->parameters = p; - m = s_instancepos(i->character->size, &p); - - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - /* TODO: should be ObjectPlaceClip, with clipdepth backpatched */ - swf_ObjectPlace(tag, c->id, currentdepth, &m, &p.cxform, instance); - - stack[stackpos].tag = tag; - stack[stackpos].type = 2; - stackpos++; - - setStartparameters(i, &p, tag); - currentdepth++; -} -void s_endClip() -{ - SWFPLACEOBJECT p; - stackpos--; - swf_SetTagPos(stack[stackpos].tag, 0); - swf_GetPlaceObject(stack[stackpos].tag, &p); - p.clipdepth = currentdepth; - //p.name = 0; - swf_ClearTag(stack[stackpos].tag); - swf_SetPlaceObject(stack[stackpos].tag, &p); - currentdepth++; -} - -void s_put(const char*instance, const char*character, parameters_t p) -{ - character_t* c = dict_lookup(&characters, character); - instance_t* i; - MATRIX m; - if(!c) - syntaxerror("character %s not known (in .put %s=%s)", character, instance, character); - - i = s_addinstance(instance, c, currentdepth); - i->parameters = p; - m = s_instancepos(i->character->size, &p); - - if(p.blendmode || p.filters) - { - if(stack[0].swf->fileVersion < 8) - { - if(p.blendmode) - warning("blendmodes only supported for flash version>=8"); - else - warning("filters only supported for flash version>=8"); - } - tag = swf_InsertTag(tag, ST_PLACEOBJECT3); - } - else - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - setPlacement(tag, c->id, currentdepth, m, p.noinstancename ? NULL : instance, &p, 0); - setStartparameters(i, &p, tag); - currentdepth++; -} - -void recordChanges(history_t* history, parameters_t p, int changeFunction, interpolation_t* inter) -{ - if(p.set & SF_X) - history_remember(history, "x", currentframe, changeFunction, p.x, inter); - if(p.set & SF_Y) - history_remember(history, "y", currentframe, changeFunction, p.y, inter); - if(p.set & SF_SCALEX) - history_remember(history, "scalex", currentframe, changeFunction, p.scalex, inter); - if(p.set & SF_SCALEY) - history_remember(history, "scaley", currentframe, changeFunction, p.scaley, inter); - if(p.set & SF_CX_R) - { - history_remember(history, "cxform.r0", currentframe, changeFunction, p.cxform.r0, inter); - history_remember(history, "cxform.r1", currentframe, changeFunction, p.cxform.r1, inter); - } - if(p.set & SF_CX_G) - { - history_remember(history, "cxform.g0", currentframe, changeFunction, p.cxform.g0, inter); - history_remember(history, "cxform.g1", currentframe, changeFunction, p.cxform.g1, inter); - } - if(p.set & SF_CX_B) - { - history_remember(history, "cxform.b0", currentframe, changeFunction, p.cxform.b0, inter); - history_remember(history, "cxform.b1", currentframe, changeFunction, p.cxform.b1, inter); - } - if(p.set & SF_CX_A) - { - history_remember(history, "cxform.a0", currentframe, changeFunction, p.cxform.a0, inter); - history_remember(history, "cxform.a1", currentframe, changeFunction, p.cxform.a1, inter); - } - if(p.set & SF_ROTATE) - history_remember(history, "rotate", currentframe, changeFunction, p.rotate, inter); - if(p.set & SF_SHEAR) - history_remember(history, "shear", currentframe, changeFunction, p.shear, inter); - if(p.set & SF_PIVOT) - { - history_remember(history, "pivot.x", currentframe, changeFunction, p.pivot.x, inter); - history_remember(history, "pivot.y", currentframe, changeFunction, p.pivot.y, inter); - } - if(p.set & SF_PIN) - { - history_remember(history, "pin.x", currentframe, changeFunction, p.pin.x, inter); - history_remember(history, "pin.y", currentframe, changeFunction, p.pin.y, inter); - } - if(p.set & SF_BLEND) - history_remember(history, "blendmode", currentframe, changeFunction, p.blendmode, inter); - if(p.set & SF_FILTER) - history_rememberFilter(history, currentframe, changeFunction, p.filters, inter); -} - -void s_jump(const char* instance, parameters_t p) -{ - instance_t* i = dict_lookup(&instances, instance); - if(!i) - syntaxerror("instance %s not known", instance); - recordChanges(i->history, p, CF_JUMP, 0); -} - -void s_change(const char*instance, parameters_t p, interpolation_t* inter) -{ - instance_t* i = dict_lookup(&instances, instance); - if(!i) - syntaxerror("instance %s not known", instance); - recordChanges(i->history, p, CF_CHANGE, inter); -} - -void s_sweep(const char* instance, parameters_t p, float radius, int clockwise, int short_arc, interpolation_t* inter) -{ - instance_t* i = dict_lookup(&instances, instance); - if(!i) - syntaxerror("instance %s not known", instance); - history_rememberSweep(i->history, currentframe, p.x, p.y, radius, clockwise, short_arc, inter); -} - -void s_toggle(const char* instance, U16 flagsOn, U16 flagsOff) -{ - instance_t* i = dict_lookup(&instances, instance); - if(!i) - syntaxerror("instance %s not known", instance); - U16 flags = (U16)history_value(i->history, currentframe, "flags"); - flags |= flagsOn; - flags &= flagsOff; - history_remember(i->history, "flags", currentframe, CF_JUMP, flags, 0); -} - -void s_delinstance(const char*instance) -{ - instance_t* i = dict_lookup(&instances, instance); - if(!i) - syntaxerror("instance %s not known", instance); - writeInstance(i); - tag = swf_InsertTag(tag, ST_REMOVEOBJECT2); - swf_SetU16(tag, i->depth); - dict_del(&instances, instance); - free(i); -} - -void s_schange(const char*instance, parameters_t p, interpolation_t* inter) -{ - instance_t* i = dict_lookup(&instances, instance); - if(!i) - syntaxerror("instance %s not known", instance); - recordChanges(i->history, p, CF_SCHANGE, inter); -} - -void s_end() -{ - if(!stackpos) - syntaxerror(".end unexpected"); - switch (stack[stackpos-1].type) - { - case 0: - s_endSWF(); - break; - case 1: - s_endSprite(); - break; - case 2: - s_endClip(); - break; - case 3: - s_endButton(); - break; - default: - syntaxerror("internal error 1"); - } -} - -// ------------------------------------------------------------------------ - -typedef int command_func_t(map_t*args); - -SRECT parseBox(const char*str) -{ - SRECT r = {0,0,0,0}; - float xmin, xmax, ymin, ymax; - char*x = strchr(str, 'x'); - char*d1=0,*d2=0; - if(!strcmp(str, "autocrop")) { - r.xmin = r.ymin = r.xmax = r.ymax = 0; - return r; - } - if(!x) goto error; - d1 = strchr(x+1, ':'); - if(d1) - d2 = strchr(d1+1, ':'); - if(!d1) { - if(sscanf(str, "%fx%f", &xmax, &ymax) < 2) - goto error; - xmin = ymin = 0; - } - else if(d1 && !d2) { - if(sscanf(str, "%fx%f:%f", &xmax, &ymax, &xmin) < 3) - goto error; - xmax += xmin; - ymin = 0; - } - else { - if(sscanf(str, "%fx%f:%f:%f", &xmax, &ymax, &xmin, &ymin) < 4) - goto error; - xmax += xmin; - ymax += ymin; - } - r.xmin = (SCOORD)(xmin*20); - r.ymin = (SCOORD)(ymin*20); - r.xmax = (SCOORD)(xmax*20); - r.ymax = (SCOORD)(ymax*20); - return r; -error: - syntaxerror("expression %s is not a valid bound Box.\nE.g. 1024x768 or 1024x768:30:30 would have been valid bounding Boxes.", str); - return r; -} -float parseFloat(const char*str) -{ - return atof(str); -} -int parseInt(const char*str) -{ - int t; - int l=strlen(str); - int s=0; - if(str[0]=='+' || str[0]=='-') - s++; - - for(t=s;t'9') - syntaxerror("Not an Integer: \"%s\"", str); - return atoi(str); -} -static double parseRawTwip(const char*str) -{ - char*dot; - int sign=1; - if(str[0]=='+' || str[0]=='-') { - if(str[0]=='-') - sign = -1; - str++; - } - dot = strchr(str, '.'); - if(!dot) { - int l=strlen(str); - int t; - return sign*parseInt(str); - } else { - char* old = strdup(str); - int l=strlen(dot+1); - const char*s; - *dot++ = 0; - for(s=str;s'9') - { - free(old); - syntaxerror("Not a coordinate: \"%s\"", str); - } - } - for(s=dot;*s;s++) { - if(*s<'0' || *s>'9') - { - free(old); - syntaxerror("Not a coordinate: \"%s\"", str); - } - } - if(l>2 || (l==2 && (dot[1]!='0' && dot[1]!='5'))) { - dot[1] = ((dot[1]-0x30)/5)*5 + 0x30; - dot[2] = 0; - l=2; - warning("precision loss: %s converted to twip: %s.%s", old, str, dot); - } - free(old); - if(l==0) - return sign*(atoi(str)); - if(l==1) - return sign*(atoi(str)+0.1*atoi(dot)); - if(l==2) - return sign*(atoi(str)+0.01*atoi(dot)); - } - return 0; -} - -static dict_t defines; -static int defines_initialized = 0; -static mem_t define_values; - -static double parseNameOrTwip(const char*s) -{ - int l = 0; - double v; - if(defines_initialized) { - l = PTR_AS_INT(dict_lookup(&defines, s)); - } - if(l) { - return *(int*)&define_values.buffer[l-1]; - } else { - return parseRawTwip(s); - } -} - -/* automatically generated by yiyiyacc, http://www.quiss.org/yiyiyacc/ */ -static double parseExpression(char*s) -{ - int chr2index[256]; - memset(chr2index, -1, sizeof(chr2index)); - chr2index['+'] = 0; - chr2index['-'] = 1; - chr2index['*'] = 2; - chr2index['/'] = 3; - chr2index['('] = 5; - chr2index[')'] = 6; - chr2index['\0'] = 7; - - int stackpos = 1; - int stack[256]; - double values[256]; - stack[0]=0; - values[0]=0; - int accept = 18; - int left[10]={11,8,8,8,8,9,9,9,10,10}; //production left side - int plen[10]={1,3,2,3,1,3,3,1,1,3}; //production size - int table[18][12] = { - {0, 4, 0, 0, 5, 6, 0, 0, 1, 2, 3, 0}, - {7, 8, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0}, - {-4, -4, 9, 10, 0, 0, -4, -4, 0, 0, 0, 0}, - {-7, -7, -7, -7, 0, 0, -7, -7, 0, 0, 0, 0}, - {0, 0, 0, 0, 5, 6, 0, 0, 0, 11, 3, 0}, - {-8, -8, -8, -8, 0, 0, -8, -8, 0, 0, 0, 0}, - {0, 4, 0, 0, 5, 6, 0, 0, 12, 2, 3, 0}, - {0, 0, 0, 0, 5, 6, 0, 0, 0, 13, 3, 0}, - {0, 0, 0, 0, 5, 6, 0, 0, 0, 14, 3, 0}, - {0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 15, 0}, - {0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 16, 0}, - {-2, -2, 9, 10, 0, 0, -2, -2, 0, 0, 0, 0}, - {7, 8, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0}, - {-1, -1, 9, 10, 0, 0, -1, -1, 0, 0, 0, 0}, - {-3, -3, 9, 10, 0, 0, -3, -3, 0, 0, 0, 0}, - {-5, -5, -5, -5, 0, 0, -5, -5, 0, 0, 0, 0}, - {-6, -6, -6, -6, 0, 0, -6, -6, 0, 0, 0, 0}, - {-9, -9, -9, -9, 0, 0, -9, -9, 0, 0, 0, 0}}; - - char*p = s; - while(1) { - char*pnext = p+1; - int action; - double value = 0; - if(!stackpos) { - fprintf(stderr, "Error in expression\n"); - return 0.0; - } - - if(chr2index[*p]<0) { - action = table[stack[stackpos-1]][4]; - if(action>0) { - while(chr2index[*pnext]<0) - pnext++; - char save = *pnext; - *pnext = 0; - value = parseNameOrTwip(p); - *pnext = save; - } - } else { - action = table[stack[stackpos-1]][chr2index[*p]]; - } - - if(action == accept) { - return values[stack[stackpos-1]]; - } else if(action>0) { // shift - if(stackpos>254) { - fprintf(stderr, "Stack overflow while parsing expression\n"); - return 0.0; - } - values[stackpos]=value; - stack[stackpos++]=action; - p=pnext; - } else if(action<0) { // reduce - stackpos-=plen[-action]; - stack[stackpos] = table[stack[stackpos-1]][left[-action]]; - switch(-action) { - case 1: - values[stackpos] = values[stackpos+0] + values[stackpos+2]; - break; - case 2: - values[stackpos] = 0 - values[stackpos+1]; - break; - case 3: - values[stackpos] = values[stackpos+0] - values[stackpos+2]; - break; - case 5: - values[stackpos] = values[stackpos+0] * values[stackpos+2]; - break; - case 6: - values[stackpos] = values[stackpos+0] / values[stackpos+2]; - break; - case 9: - values[stackpos] = values[stackpos+1]; - break; - } - stackpos++; - } else { - fprintf(stderr, "Syntax error in expression\n"); - return 0.0; - } - } -} - -int parseTwip(const char*str) -{ - char*str2 = (char*)str; - int v = (int)(parseExpression(str2)*20); - return v; -} - -int parseArc(const char* str) -{ - if(!strcmp(str, "short")) - return 1; - if(!strcmp(str, "long")) - return 0; - syntaxerror("invalid value for the arc parameter: %s", str); - return 1; -} - -int parseDir(const char* str) -{ - if(!strcmp(str, "clockwise")) - return 1; - if(!strcmp(str, "counterclockwise")) - return 0; - syntaxerror("invalid value for the dir parameter: %s", str); - return 1; -} - -int isPoint(const char*str) -{ - if(strchr(str, '(')) - return 1; - else - return 0; -} - -SPOINT parsePoint(const char*str) -{ - SPOINT p; - char tmp[80]; - int l = strlen(str); - char*comma = strchr(str, ','); - if(str[0]!='(' || str[l-1]!=')' || !comma || l>70) - syntaxerror("\"%s\" is not a valid point of the form (x,y)", str); - strncpy(tmp, str+1, comma-(str+1));tmp[comma-(str+1)]=0; - p.x = parseTwip(tmp); - strncpy(tmp, comma+1, l-1-(comma+1-str));tmp[l-1-(comma+1-str)]=0; - p.y = parseTwip(tmp); - return p; -} - -int parseColor2(const char*str, RGBA*color) -{ - int l = strlen(str); - int r,g,b,a; - int t; - - struct {unsigned char r,g,b;char*name;} colors[] = - {{255,250,250,"snow"},{220,220,220,"gainsboro"},{250,240,230,"linen"},{255,228,196,"bisque"}, - {255,228,181,"moccasin"},{255,248,220,"cornsilk"},{255,255,240,"ivory"},{255,245,238,"seashell"}, - {240,255,240,"honeydew"},{240,255,255,"azure"},{230,230,250,"lavender"},{255,255,255,"white"}, - {0,0,0,"black"},{190,190,190,"gray"},{190,190,190,"grey"},{0,0,128,"navy"},{0,0,255,"blue"}, - {64,224,208,"turquoise"},{0,255,255,"cyan"},{127,255,212,"aquamarine"}, {0,255,0,"green"}, - {127,255,0,"chartreuse"},{240,230,140,"khaki"},{255,255,0,"yellow"}, - {255,215,0,"gold"},{218,165,32,"goldenrod"},{160,82,45,"sienna"},{205,133,63,"peru"}, - {222,184,135,"burlywood"},{245,245,220,"beige"},{245,222,179,"wheat"},{210,180,140,"tan"}, - {210,105,30,"chocolate"},{178,34,34,"firebrick"},{165,42,42,"brown"},{250,128,114,"salmon"}, - {255,165,0,"orange"},{255,127,80,"coral"},{255,99,71,"tomato"},{255,0,0,"red"}, - {255,192,203,"pink"},{176,48,96,"maroon"},{255,0,255,"magenta"},{238,130,238,"violet"}, - {221,160,221,"plum"},{218,112,214,"orchid"},{160,32,240,"purple"},{216,191,216,"thistle"}}; - - a=255;r=g=b=0; - - if(str[0]=='#' && (l==7 || l==9)) { - if(l == 7 && !(sscanf(str, "#%02x%02x%02x", &r, &g, &b))) - return 0; - if(l == 9 && !(sscanf(str, "#%02x%02x%02x%02x", &r, &g, &b, &a))) - return 0; - color->r = r; color->g = g; color->b = b; color->a = a; - return 1; - } - int len=strlen(str); - int alpha = 255; - if(strchr(str, '/')) { - len = strchr(str, '/')-str; - sscanf(str+len+1,"%02x", &alpha); - } - for(t=0;tr = r; color->g = g; color->b = b; color->a = a; - return 1; - } - return 0; - -} -RGBA parseColor(const char*str) -{ - RGBA c; - if(!parseColor2(str, &c)) - syntaxerror("Expression '%s' is not a color", str); - return c; -} - -typedef struct _muladd { - S16 mul; - S16 add; -} MULADD; - -MULADD parseMulAdd(const char*str) -{ - float add, mul; - char* str2 = (char*)malloc(strlen(str)+5); - int i; - MULADD m; - strcpy(str2, str); - strcat(str2, " 0"); - add = 0; - mul = 1.0; - if(sscanf(str2, "%f%f %d", &mul, &add, &i)==2+1) { add/=256.0; i=1;} - else if(sscanf(str2, "%f%%%f %d", &mul, &add, &i)==2+1) { mul/=100.0; add/=256.0; i=2;} - else if(sscanf(str2, "%f%f%% %d", &mul, &add, &i)==2+1) { add/=100.0; i=3;} - else if(sscanf(str2, "%f%%%f%% %d", &mul, &add, &i)==2+1) { mul/=100.0; add/=100.0; i=4;} - else if(sscanf(str2, "+%f%% %d", &add, &i)==1+1) { mul=1.0;add/=100.0; i=5;} - else if(sscanf(str2, "+%f %d", &add, &i)==1+1) { mul=1.0;add/=256.0; i=6;} - else if(sscanf(str2, "-%f%% %d", &add, &i)==1+1) { mul=1.0;add/=-100.0; i=7;} - else if(sscanf(str2, "-%f %d", &add, &i)==1+1) { mul=1.0;add/=-256.0; i=8;} - else if(sscanf(str2, "%f%% %d", &mul, &i)==1+1) { mul/=100.0;add=0; i=9;} - else if(sscanf(str2, "%f %d", &mul, &i)==1+1) { add=0; i=10;} - else { - syntaxerror("'%s' is not a valid color transform expression", str); - } - m.add = (int)(add*256); - m.mul = (int)(mul*256); - free(str2); - return m; -} - -MULADD mergeMulAdd(MULADD m1, MULADD m2) -{ - int a = (int)((double)m2.add+((double)m1.add*(double)m2.mul)/256.0); - double m = ((double)m1.mul*(double)m2.mul)/256.0; - MULADD r; - if(a<-32768) a=-32768; - if(a>32767) a=32767; - if(m<-32768) m=-32768; - if(m>32767) m=32767; - r.add = a; - r.mul = (int)m; - return r; -} - -float parsePxOrPercent(const char*fontname, const char*str) -{ - int l = strlen(str); - if(strchr(str, '%')) - return parsePercent(str); - if(l>2 && str[l-2]=='p' && str[l-1]=='t') { - float p = atof(str); - return p/64.0; /*64 = FT_SUBPIXELS- see ../lib/modules/swffont.c */ - } - syntaxerror("Expression '%s' is neither a point size (?pt) nor a percentage (?%)", str); - return 0; -} - -float parsePercent(const char*str) -{ - int l = strlen(str); - if(!l) - return 1.0; - if(str[l-1]=='%') { - return atof(str)/100.0; - } - syntaxerror("Expression '%s' is not a percentage", str); - return 0; -} -int isPercent(const char*str) -{ - return str[strlen(str)-1]=='%'; -} -int parseNewSize(const char*str, int size) -{ - if(isPercent(str)) - return parsePercent(str)*size; - else - return (int)(atof(str)*20); -} - -int isColor(char*str) -{ - RGBA c; - return parseColor2(str, &c); -} - -static const char* lu(map_t* args, char*name) -{ - const char* value = map_lookup(args, name); - if(!value) { - map_dump(args, stdout, ""); - syntaxerror("internal error 2: value %s should be set", name); - } - return value; -} - -static int c_flash(map_t*args) -{ - const char* filename = map_lookup(args, "filename"); - const char* compressstr = lu(args, "compress"); - const char* change_modestr = lu(args, "change-sets-all"); - const char* exportstr = lu(args, "export"); - SRECT bbox = parseBox(lu(args, "bbox")); - int version = parseInt(lu(args, "version")); - int fps = (int)(parseFloat(lu(args, "fps"))*256); - RGBA color = parseColor(lu(args, "background")); - int compress = 0; - - if(!filename || !*filename) { - /* for compatibility */ - filename = map_lookup(args, "name"); - if(!filename || !*filename) { - filename = 0; - } else { - //msg(" line %d: .flash name=... is deprecated, use .flash filename=...", line); - msg(" line %d: .flash name=... is deprecated, use .flash filename=...", line); - } - } - - if(!filename || override_outputname) - filename = outputname; - - if(!strcmp(compressstr, "default")) - compress = version>=6; - else if(!strcmp(compressstr, "yes") || !strcmp(compressstr, "compress")) - compress = 1; - else if(!strcmp(compressstr, "no")) - compress = 0; - else syntaxerror("value \"%s\" not supported for the compress argument", compressstr); - - if(!strcmp(change_modestr, "yes")) - change_sets_all = 1; - else - if(strcmp(change_modestr, "no")) - syntaxerror("value \"%s\" not supported for the change-sets-all argument", change_modestr); - - do_exports=atoi(exportstr); - mainclass=strdup(lu(args, "mainclass")); - - s_swf(filename, bbox, version, fps, compress, color); - return 0; -} -int isRelative(const char*str) -{ - return !strncmp(str, "", 6) || - !strncmp(str, "", 7); -} -const char* getOffset(const char*str) -{ - if(!strncmp(str, "", 6)) - return str+6; - if(!strncmp(str, "", 7)) - return str+7; - syntaxerror("internal error (347)"); - return 0; -} -int getSign(const char*str) -{ - if(!strncmp(str, "", 6)) - return 1; - if(!strncmp(str, "", 7)) - return -1; - syntaxerror("internal error (348)"); - return 0; -} - -static dict_t points; -static mem_t mpoints; -static int points_initialized = 0; - -static int c_interpolation(map_t *args) -{ - int i; - const char* name = lu(args, "name"); - if(dict_lookup(&interpolations, name)) - syntaxerror("interpolation %s defined twice", name); - - interpolation_t* inter = (interpolation_t*)malloc(sizeof(interpolation_t)); - const char* functionstr = lu(args, "function"); - inter->function = 0; - for (i = 0; i < sizeof(interpolationFunctions) / sizeof(interpolationFunctions[0]); i++) - if(!strcmp(functionstr,interpolationFunctions[i])) - { - inter->function = i + 1; - break; - } - if(!inter->function) - syntaxerror("unkown interpolation function %s", functionstr); - inter->speed = parseFloat(lu(args, "speed")); - inter->amplitude = parseTwip(lu(args, "amplitude")); - inter->growth = parseFloat(lu(args, "growth")); - inter->bounces = parseInt(lu(args, "bounces")); - inter->damping = parseFloat(lu(args, "damping")); - inter->slope = parseFloat(lu(args, "slope")); - - dict_put(&interpolations, name, inter); - return 0; -} - -SPOINT getPoint(SRECT r, const char*name) -{ - int l=0; - if(!strcmp(name, "center")) { - SPOINT p; - p.x = (r.xmin + r.xmax)/2; - p.y = (r.ymin + r.ymax)/2; - return p; - } - if(!strcmp(name, "bottom-center")) { - SPOINT p; - p.x = (r.xmin + r.xmax)/2; - p.y = r.ymax; - return p; - } - if(!strcmp(name, "top-center")) { - SPOINT p; - p.x = (r.xmin + r.xmax)/2; - p.y = r.ymin; - return p; - } - if(!strcmp(name, "top-left")) { - SPOINT p; - p.x = r.xmin; - p.y = r.ymin; - return p; - } - if(!strcmp(name, "top-right")) { - SPOINT p; - p.x = r.xmax; - p.y = r.ymin; - return p; - } - if(!strcmp(name, "bottom-right")) { - SPOINT p; - p.x = r.xmax; - p.y = r.ymax; - return p; - } - if(!strcmp(name, "bottom-left")) { - SPOINT p; - p.x = r.xmin; - p.y = r.ymax; - return p; - } - if(!strcmp(name, "left-center")) { - SPOINT p; - p.x = r.xmin; - p.y = (r.ymin + r.ymax)/2; - return p; - } - if(!strcmp(name, "right-center")) { - SPOINT p; - p.x = r.xmax; - p.y = (r.ymin + r.ymax)/2; - return p; - } - - - if(points_initialized) - l = PTR_AS_INT(dict_lookup(&points, name)); - if(l==0) { - syntaxerror("Invalid point: \"%s\".", name); - } - return *(SPOINT*)&mpoints.buffer[l-1]; -} - - -static int texture2(const char*name, const char*object, map_t*args, int errors) -{ - SPOINT pos,size; - const char*xstr = map_lookup(args, "x"); - const char*ystr = map_lookup(args, "y"); - const char*widthstr = map_lookup(args, "width"); - const char*heightstr = map_lookup(args, "height"); - const char*scalestr = map_lookup(args, "scale"); - const char*scalexstr = map_lookup(args, "scalex"); - const char*scaleystr = map_lookup(args, "scaley"); - const char*rotatestr = map_lookup(args, "rotate"); - const char* shearstr = map_lookup(args, "shear"); - const char* radiusstr = map_lookup(args, "r"); - float x=0,y=0; - float scalex = 1.0, scaley = 1.0; - float rotate=0, shear=0; - float r = 0; - if(!*xstr && !*ystr) { - if(errors) - syntaxerror("x and y must be set"); - return 0; - } - if(*scalestr && (*scalexstr || *scaleystr)) { - syntaxerror("scale and scalex/scaley can't both be set"); - return 0; - } - if((*widthstr || *heightstr) && *radiusstr) { - syntaxerror("width/height and radius can't both be set"); - } - if(*radiusstr) { - widthstr = radiusstr; - heightstr = radiusstr; - } - if(!*xstr) xstr="0"; - if(!*ystr) ystr="0"; - if(!*rotatestr) rotatestr="0"; - if(!*shearstr) shearstr="0"; - - if(*scalestr) { - scalex = scaley = parsePercent(scalestr); - } else if(*scalexstr || *scaleystr) { - if(scalexstr) scalex = parsePercent(scalexstr); - if(scaleystr) scaley = parsePercent(scaleystr); - } else if(*widthstr || *heightstr) { - int width=0; - int height=0; - s_getBitmapSize(object, &width, &height); - if(*widthstr) - scalex = (float)parseTwip(widthstr)/(float)width; - if(*heightstr) - scaley = (float)parseTwip(heightstr)/(float)height; - } - x = parseTwip(xstr); - y = parseTwip(ystr); - rotate = parseFloat(rotatestr); - shear = parseFloat(shearstr); - - s_texture(name, object, x,y,scalex,scaley,rotate, shear); - - return 0; -} - -static int c_texture(map_t*args) -{ - const char*name = lu(args, "instance"); - const char*object = lu(args, "character"); - return texture2(name, object, args, 1); -} - -static int c_gradient(map_t*args) -{ - const char*name = lu(args, "name"); - int radial= strcmp(lu(args, "radial"), "radial")?0:1; - int rotate = parseInt(lu(args, "rotate")); - - readToken(); - if(type != RAWDATA) - syntaxerror("colon (:) expected"); - - if(dict_lookup(&gradients, name)) - syntaxerror("gradient %s defined twice", name); - - s_gradient(name, text, radial, rotate); - - /* check whether we also have placement information, - which would make this a positioned gradient. - If there is placement information, texture2() will - add a texture, which has priority over the gradient. - */ - texture2(name, name, args, 0); - return 0; -} - -static const char* checkFiltername(map_t* args) -{ - const char* name = lu(args, "name"); - if(strchr(name, ',')) - syntaxerror("the comma (,) is used to separate filters in filterlists. Please do not use in filternames."); - return name; -} - -static int c_blur(map_t*args) -{ - const char*name = checkFiltername(args); - const char*blurstr = lu(args, "blur"); - const char*blurxstr = lu(args, "blurx"); - const char*blurystr = lu(args, "blury"); - float blurx=1.0, blury=1.0; - if(blurstr[0]) { - blurx = parseFloat(blurstr); - blury = parseFloat(blurstr); - } - if(blurxstr[0]) - blurx = parseFloat(blurxstr); - if(blurystr[0]) - blury = parseFloat(blurystr); - int passes = parseInt(lu(args, "passes")); - s_blur(name, blurx, blury, passes); - return 0; -} - -static int c_gradientglow(map_t*args) -{ - const char*name = checkFiltername(args); - const char*gradient = lu(args, "gradient"); - const char*blurstr = lu(args, "blur"); - const char*blurxstr = lu(args, "blurx"); - const char*blurystr = lu(args, "blury"); - float blurx=1.0, blury=1.0; - if(blurstr[0]) { - blurx = parseFloat(blurstr); - blury = parseFloat(blurstr); - } - if(blurxstr[0]) - blurx = parseFloat(blurxstr); - if(blurystr[0]) - blury = parseFloat(blurystr); - - float angle = parseFloat(lu(args, "angle")) / 180 * M_PI; - float distance = parseFloat(lu(args, "distance")); - float strength = parseFloat(lu(args, "strength")); - char innershadow = strcmp(lu(args, "innershadow"),"innershadow")?0:1; - char knockout = strcmp(lu(args, "knockout"),"knockout")?0:1; - char composite = strcmp(lu(args, "composite"),"composite")?0:1; - char ontop = strcmp(lu(args, "ontop"),"ontop")?0:1; - int passes = parseInt(lu(args, "passes")); - - s_gradientglow(name, gradient, blurx, blury, angle, distance, strength, innershadow, knockout, composite, ontop, passes); - return 0; -} - -static int c_dropshadow(map_t*args) -{ - const char*name = checkFiltername(args); - RGBA color = parseColor(lu(args, "color")); - const char*blurstr = lu(args, "blur"); - const char*blurxstr = lu(args, "blurx"); - const char*blurystr = lu(args, "blury"); - float blurx=1.0, blury=1.0; - if(blurstr[0]) { - blurx = parseFloat(blurstr); - blury = parseFloat(blurstr); - } - if(blurxstr[0]) - blurx = parseFloat(blurxstr); - if(blurystr[0]) - blury = parseFloat(blurystr); - - float angle = parseFloat(lu(args, "angle")) / 180 * M_PI; - float distance = parseFloat(lu(args, "distance")); - float strength = parseFloat(lu(args, "strength")); - char innershadow = strcmp(lu(args, "innershadow"),"innershadow")?0:1; - char knockout = strcmp(lu(args, "knockout"),"knockout")?0:1; - char composite = strcmp(lu(args, "composite"),"composite")?0:1; - int passes = parseInt(lu(args, "passes")); - - s_dropshadow(name, color, blurx, blury, angle, distance, strength, innershadow, knockout, composite, passes); - return 0; -} - -static int c_bevel(map_t*args) -{ - const char*name = checkFiltername(args); - RGBA shadow = parseColor(lu(args, "shadow")); - RGBA highlight = parseColor(lu(args, "highlight")); - const char*blurstr = lu(args, "blur"); - const char*blurxstr = lu(args, "blurx"); - const char*blurystr = lu(args, "blury"); - float blurx=1.0, blury=1.0; - if(blurstr[0]) { - blurx = parseFloat(blurstr); - blury = parseFloat(blurstr); - } - if(blurxstr[0]) - blurx = parseFloat(blurxstr); - if(blurystr[0]) - blury = parseFloat(blurystr); - - float angle = parseFloat(lu(args, "angle")) / 180 * M_PI; - float distance = parseFloat(lu(args, "distance")); - float strength = parseFloat(lu(args, "strength")); - char innershadow = strcmp(lu(args, "innershadow"),"innershadow")?0:1; - char knockout = strcmp(lu(args, "knockout"),"knockout")?0:1; - char composite = strcmp(lu(args, "composite"),"composite")?0:1; - char ontop = strcmp(lu(args, "ontop"),"ontop")?0:1; - int passes = parseInt(lu(args, "passes")); - - s_bevel(name, shadow, highlight, blurx, blury, angle, distance, strength, innershadow, knockout, composite, ontop, passes); - return 0; -} - -static int c_define(map_t*args) -{ - const char*name = lu(args, "name"); - const char*value = lu(args, "value"); - - if(!defines_initialized) { - dict_init(&defines, 16); - mem_init(&define_values); - defines_initialized = 1; - } - int val = parseTwip(value); - int pos = mem_put(&define_values, &val, sizeof(val)); - dict_put(&defines, name, INT_AS_PTR(pos + 1)); - return 0; -} -static int c_point(map_t*args) -{ - const char*name = lu(args, "name"); - int pos; - SPOINT p; - if(!points_initialized) { - dict_init(&points, 16); - mem_init(&mpoints); - points_initialized = 1; - } - p.x = parseTwip(lu(args, "x")); - p.y = parseTwip(lu(args, "y")); - pos = mem_put(&mpoints, &p, sizeof(p)); - dict_put(&points, name, INT_AS_PTR(pos+1)); - return 0; -} -static int c_play(map_t*args) -{ - const char*name = lu(args, "name"); - const char*loop = lu(args, "loop"); - const char*nomultiple = lu(args, "nomultiple"); - int nm = 0; - if(!strcmp(nomultiple, "nomultiple")) - nm = 1; - else - nm = parseInt(nomultiple); - - if(s_playsound(name, parseInt(loop), nm, 0)) { - return 0; - } else if(s_swf3action(name, "play")) { - return 0; - } - return 0; -} - -static int c_stop(map_t*args) -{ - const char*name = map_lookup(args, "name"); - - if(s_playsound(name, 0,0,1)) - return 0; - else if(s_swf3action(name, "stop")) - return 0; - syntaxerror("I don't know anything about sound/movie \"%s\"", name); - return 0; -} - -static int c_nextframe(map_t*args) -{ - const char*name = lu(args, "name"); - - if(s_swf3action(name, "nextframe")) { - return 0; - } - syntaxerror("I don't know anything about movie \"%s\"", name); - return 0; -} - -static int c_previousframe(map_t*args) -{ - const char*name = lu(args, "name"); - - if(s_swf3action(name, "previousframe")) { - return 0; - } - syntaxerror("I don't know anything about movie \"%s\"", name); - return 0; -} - -static int c_movement(map_t*args, int type) -{ - const char*instance = lu(args, "name"); - - const char* xstr=""; - const char* ystr=""; - SRECT oldbbox; - parameters_t p; - U16 set = 0x0000; - - xstr = lu(args, "x"); - ystr = lu(args, "y"); - - s_getParameters(instance, &p); - - /* x,y position */ - if(xstr[0]) - { - if(isRelative(xstr)) - { - if(type == PT_PUT || type == PT_STARTCLIP) - syntaxerror("relative x values not allowed for initial put or startclip"); - p.x += parseTwip(getOffset(xstr))*getSign(xstr); - } - else - { - p.x = parseTwip(xstr); - } - set = set | SF_X; - } - if(ystr[0]) - { - if(isRelative(ystr)) - { - if(type == PT_PUT || type == PT_STARTCLIP) - syntaxerror("relative y values not allowed for initial put or startclip"); - p.y += parseTwip(getOffset(ystr))*getSign(ystr); - } - else - { - p.y = parseTwip(ystr); - } - set = set | SF_Y; - } - - if(change_sets_all) - set = SF_ALL; - p.set = set; - - switch (type) - { - case PT_MOVE: - { - const char* interstr = lu(args, "interpolation"); - interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); - if(!inter) - syntaxerror("unkown interpolation %s", interstr); - s_change(instance, p, inter); - } - break; - case PT_SMOVE: - { - const char* interstr = lu(args, "interpolation"); - interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); - if(!inter) - syntaxerror("unkown interpolation %s", interstr); - s_schange(instance, p, inter); - } - break; - case PT_SWEEP: - { - const char* rstr = lu(args, "r"); - int radius = parseTwip(rstr); - if(radius <= 0) - syntaxerror("sweep not possible: radius must be greater than 0."); - const char* dirstr = lu(args, "dir"); - int clockwise = parseDir(dirstr); - const char* arcstr = lu(args, "arc"); - int short_arc = parseArc(arcstr); - const char* interstr = lu(args, "interpolation"); - interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); - if(!inter) - syntaxerror("unkown interpolation %s", interstr); - s_sweep(instance, p, radius, clockwise, short_arc, inter); - } - break; - } - return 0; -} - -static int c_placement(map_t*args, int type) -{ - const char*instance = lu(args, (type==PT_PUT||type==PT_STARTCLIP)?"instance":"name"); - const char*character = 0; - - const char* luminancestr = lu(args, "luminance"); - const char* scalestr = lu(args, "scale"); - const char* scalexstr = lu(args, "scalex"); - const char* scaleystr = lu(args, "scaley"); - const char* rotatestr = lu(args, "rotate"); - const char* shearstr = lu(args, "shear"); - const char* xstr="", *pivotstr=""; - const char* ystr="", *anglestr=""; - const char*above = lu(args, "above"); /*FIXME*/ - const char*below = lu(args, "below"); - const char* rstr = lu(args, "red"); - const char* gstr = lu(args, "green"); - const char* bstr = lu(args, "blue"); - const char* astr = lu(args, "alpha"); - const char* pinstr = lu(args, "pin"); - const char* as = map_lookup(args, "as"); - const char* blendmode = lu(args, "blend"); - const char* filterstr = lu(args, "filter"); - const char* noinstancenamestr = lu(args, "noinstancename"); - U8 blend; - MULADD r,g,b,a; - float oldwidth; - float oldheight; - SRECT oldbbox; - MULADD luminance; - parameters_t p; - U16 set = 0x0000; - - if(type==9) - { // (?) .rotate or .arcchange - pivotstr = lu(args, "pivot"); - anglestr = lu(args, "angle"); - } - else - { - xstr = lu(args, "x"); - ystr = lu(args, "y"); - } - - if(luminancestr[0]) - luminance = parseMulAdd(luminancestr); - else - { - luminance.add = 0; - luminance.mul = 256; - } - - if(scalestr[0]) - { - if(scalexstr[0]||scaleystr[0]) - syntaxerror("scalex/scaley and scale cannot both be set"); - scalexstr = scaleystr = scalestr; - } - - if(type == PT_PUT || type == PT_STARTCLIP) { - // put or startclip - character = lu(args, "character"); - parameters_clear(&p); - } else if(type == PT_BUTTON) { - character = lu(args, "name"); - parameters_clear(&p); - // button's show - } else { - s_getParameters(instance, &p); - } - - /* noinstancename */ - p.noinstancename = !strcmp(noinstancenamestr, "noinstancename"); - - /* x,y position */ - if(xstr[0]) - { - if(isRelative(xstr)) - { - if(type == PT_PUT || type == PT_STARTCLIP) - syntaxerror("relative x values not allowed for initial put or startclip"); - p.x += parseTwip(getOffset(xstr))*getSign(xstr); - } - else - { - p.x = parseTwip(xstr); - } - set = set | SF_X; - } - if(ystr[0]) - { - if(isRelative(ystr)) - { - if(type == PT_PUT || type == PT_STARTCLIP) - syntaxerror("relative y values not allowed for initial put or startclip"); - p.y += parseTwip(getOffset(ystr))*getSign(ystr); - } - else - { - p.y = parseTwip(ystr); - } - set = set | SF_Y; - } - - /* scale, scalex, scaley */ - if(character) - oldbbox = s_getCharBBox(character); - else - oldbbox = s_getInstanceBBox(instance); - oldwidth = oldbbox.xmax - oldbbox.xmin; - oldheight = oldbbox.ymax - oldbbox.ymin; - if(scalexstr[0]) - { - if(oldwidth==0) - p.scalex = 1.0; - else - if(scalexstr[0]) - p.scalex = (float)(parseNewSize(scalexstr, oldwidth))/oldwidth; - set = set | SF_SCALEX; - } - if(scaleystr[0]) - { - if(oldheight==0) - p.scaley = 1.0; - else - if(scaleystr[0]) - p.scaley = (float)(parseNewSize(scaleystr, oldheight))/oldheight; - set = set | SF_SCALEY; - } - - /* rotation */ - if(rotatestr[0]) - { - if(isRelative(rotatestr)) - p.rotate += parseFloat(getOffset(rotatestr))*getSign(rotatestr); - else - p.rotate = parseFloat(rotatestr); - set = set | SF_ROTATE; - } - - /* shearing */ - if(shearstr[0]) - { - if(isRelative(shearstr)) - p.shear += parseFloat(getOffset(shearstr))*getSign(shearstr); - else - p.shear = parseFloat(shearstr); - set = set | SF_SHEAR; - } - - if(pivotstr[0]) - { - if(isPoint(pivotstr)) - p.pivot = parsePoint(pivotstr); - else - p.pivot = getPoint(oldbbox, pivotstr); - set = set | SF_PIVOT; - } - - if(pinstr[0]) - { - if(isPoint(pinstr)) - p.pin = parsePoint(pinstr); - else - p.pin = getPoint(oldbbox, pinstr); - set = set | SF_PIN; - } - - /* color transform */ - - if(rstr[0] || luminancestr[0]) - { - MULADD r; - if(rstr[0]) - r = parseMulAdd(rstr); - else - { - r.add = p.cxform.r0; - r.mul = p.cxform.r1; - } - r = mergeMulAdd(r, luminance); - p.cxform.r0 = r.mul; - p.cxform.r1 = r.add; - set = set | SF_CX_R; - } - if(gstr[0] || luminancestr[0]) - { - MULADD g; - if(gstr[0]) - g = parseMulAdd(gstr); - else - { - g.add = p.cxform.g0; - g.mul = p.cxform.g1; - } - g = mergeMulAdd(g, luminance); - p.cxform.g0 = g.mul; - p.cxform.g1 = g.add; - set = set | SF_CX_G; - } - if(bstr[0] || luminancestr[0]) - { - MULADD b; - if(bstr[0]) - b = parseMulAdd(bstr); - else - { - b.add = p.cxform.b0; - b.mul = p.cxform.b1; - } - b = mergeMulAdd(b, luminance); - p.cxform.b0 = b.mul; - p.cxform.b1 = b.add; - set = set | SF_CX_B; - } - if(astr[0]) - { - MULADD a = parseMulAdd(astr); - p.cxform.a0 = a.mul; - p.cxform.a1 = a.add; - set = set | SF_CX_A; - } - - if(blendmode[0]) - { - int t; - blend = 255; - for(t = 0; blendModeNames[t]; t++) - { - if(!strcmp(blendModeNames[t], blendmode)) - { - blend = t; - break; - } - } - if(blend == 255) - { - syntaxerror("unknown blend mode: '%s'", blendmode); - } - p.blendmode = blend; - set = set | SF_BLEND; - } - - if(filterstr[0]) - { - p.filters = parseFilters((char*)filterstr); - set = set | SF_FILTER; - } - - if(type == PT_CHANGE && set & (SF_X | SF_Y)) - warning("As of version 0.8.2 using the .change command to modify an \ -object's position on the stage is considered deprecated. Future \ -versions may consider x and y parameters for the .change command \ -to be illegal; please use the .move command."); - - if(change_sets_all) - set = SF_ALL; - p.set = set; - - switch (type) - { - case PT_PUT: - s_put(instance, character, p); - break; - case PT_CHANGE: - { - const char* interstr = lu(args, "interpolation"); - interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); - if(!inter) - syntaxerror("unkown interpolation %s", interstr); - s_change(instance, p, inter); - } - break; - case PT_SCHANGE: - { - const char* interstr = lu(args, "interpolation"); - interpolation_t* inter = (interpolation_t*)dict_lookup(&interpolations, interstr); - if(!inter) - syntaxerror("unkown interpolation %s", interstr); - s_schange(instance, p, inter); - } - break; - case PT_JUMP: - s_jump(instance, p); - break; - case PT_STARTCLIP: - s_startclip(instance, character, p); - break; - case PT_BUTTON: - if(as && as[0]) - s_buttonput(character, as, p); - else - s_buttonput(character, "shape", p); - break; -// default: - } - return 0; -} -static int c_put(map_t*args) -{ - c_placement(args, PT_PUT); - return 0; -} -static int c_change(map_t*args) -{ - if(currentframe == 0) - warning("change commands in frame 1 will be ignored, please use the put command to set object parameters"); - c_placement(args, PT_CHANGE); - return 0; -} -static int c_schange(map_t*args) -{ - c_placement(args, PT_SCHANGE); - return 0; -} -static int c_move(map_t* args) -{ - c_movement(args, PT_MOVE); - return 0; -} -static int c_smove(map_t* args) -{ - c_movement(args, PT_SMOVE); - return 0; -} -static int c_sweep(map_t* args) -{ - c_movement(args, PT_SWEEP); - return 0; -} -static int c_arcchange(map_t*args) -{ - c_placement(args, 0); - return 0; -} -static int c_jump(map_t*args) -{ - c_placement(args, PT_JUMP); - return 0; -} -static int c_startclip(map_t*args) -{ - c_placement(args, PT_STARTCLIP); - return 0; -} -static int c_show(map_t*args) -{ - c_placement(args, PT_BUTTON); - return 0; -} -static int c_toggle(map_t* args) -{ - const char*instance = lu(args, "name"); - U16 flagsOn = 0x0000, flagsOff = 0xffff; - const char* alignstr = lu(args, "fixed_alignment"); - if(!strcmp(alignstr, "on")) - flagsOn += IF_FIXED_ALIGNMENT; - else - if(!strcmp(alignstr, "off")) - flagsOff -= IF_FIXED_ALIGNMENT; - else - syntaxerror("values for toggle must be \"on\" or \"off\". %s is not legal.", alignstr); - s_toggle(instance, flagsOn, flagsOff); - return 0; -} -static int c_del(map_t*args) -{ - const char*instance = lu(args, "name"); - s_delinstance(instance); - return 0; -} -static int c_end(map_t*args) -{ - s_end(); - return 0; -} -static int c_sprite(map_t*args) -{ - const char* name = lu(args, "name"); - const char* scalinggrid = lu(args, "scalinggrid"); - const char* as3name = lu(args, "as3name"); - - if(scalinggrid && *scalinggrid) { - SRECT r = parseBox(scalinggrid); - s_sprite(name, &r, as3name); - } else { - s_sprite(name, 0, as3name); - } - return 0; -} -static int c_frame(map_t*args) -{ - const char*framestr = lu(args, "n"); - const char*cutstr = lu(args, "cut"); - - const char*name = lu(args, "name"); - const char*anchor = lu(args, "anchor"); - char buf[40]; - - if(!strcmp(anchor, "anchor") && !*name) - name = framestr; - - int frame; - int cut = 0; - if(strcmp(cutstr, "no")) - cut = 1; - if(isRelative(framestr)) { - frame = s_getframe(); - if(getSign(framestr)<0) - syntaxerror("relative frame expressions must be positive"); - frame += parseInt(getOffset(framestr)); - } - else { - frame = parseInt(framestr); - if(s_getframe() >= frame - && !(frame==1 && s_getframe()==frame)) // equality is o.k. for frame 0 - syntaxerror("frame expression must be >%d (is:%s)", s_getframe(), framestr); - } - s_frame(frame, cut, name, !strcmp(anchor, "anchor")); - return 0; -} -static int c_primitive(map_t*args) -{ - const char*name = lu(args, "name"); - const char*command = lu(args, "commandname"); - int width=0, height=0, r=0; - int linewidth = parseTwip(lu(args, "line")); - const char*colorstr = lu(args, "color"); - RGBA color = parseColor(colorstr); - const char*fillstr = lu(args, "fill"); - int dofill = 1; - int type=0; - const char* font; - const char* text; - const char* outline=0; - RGBA fill; - if(!strcmp(command, "circle")) - type = 1; - else if(!strcmp(command, "filled")) - type = 2; - - if(type==0) { - width = parseTwip(lu(args, "width")); - height = parseTwip(lu(args, "height")); - } else if(type==1) { - r = parseTwip(lu(args, "r")); - } else if(type==2) { - outline = lu(args, "outline"); - } - - if(!strcmp(fillstr, "fill")) - fillstr = colorstr; - if(!strcmp(fillstr, "none")) - fillstr = 0; - if(width<0 || height<0 || linewidth<0 || r<0) - syntaxerror("values width, height, line, r must be positive"); - - if(type == 0) s_box(name, width, height, color, linewidth, fillstr); - else if(type==1) s_circle(name, r, color, linewidth, fillstr); - else if(type==2) s_filled(name, outline, color, linewidth, fillstr); - return 0; -} - -static int c_textshape(map_t*args) -{ - const char*name = lu(args, "name"); - const char*text = lu(args, "text"); - const char*font = lu(args, "font"); - float size = parsePxOrPercent(font, lu(args, "size")); - - s_textshape(name, font, size, text); - return 0; -} - -static int c_swf(map_t*args) -{ - const char*name = lu(args, "name"); - const char*filename = lu(args, "filename"); - const char*command = lu(args, "commandname"); - const char*as3name = lu(args, "as3name"); - - if(!strcmp(command, "shape")) - warning("Please use .swf instead of .shape"); - s_includeswf(name, filename, as3name); - return 0; -} - -static int c_font(map_t*args) -{ - const char*name = lu(args, "name"); - const char*filename = lu(args, "filename"); - s_font(name, filename); - return 0; -} - -static int c_sound(map_t*args) -{ - const char*name = lu(args, "name"); - const char*filename = lu(args, "filename"); - s_sound(name, filename); - return 0; -} - -static int c_text(map_t*args) -{ - const char*name = lu(args, "name"); - const char*text = lu(args, "text"); - const char*font = lu(args, "font"); - float size = parsePxOrPercent(font, lu(args, "size")); - RGBA color = parseColor(lu(args, "color")); - s_text(name, font, text, (int)(size*100), color); - return 0; -} - -static int c_soundtrack(map_t*args) -{ - return 0; -} - -static int c_quicktime(map_t*args) -{ - const char*name = lu(args, "name"); - const char*url = lu(args, "url"); - s_quicktime(name, url); - return 0; -} - -static int c_video(map_t*args) -{ - const char*name = lu(args, "name"); - int width = parseInt(lu(args, "width")); - int height = parseInt(lu(args, "height")); - s_video(name, width, height); - return 0; -} - -static int c_image(map_t*args) -{ - const char*command = lu(args, "commandname"); - const char*name = lu(args, "name"); - const char*filename = lu(args, "filename"); - if(!strcmp(command,"jpeg")) { - int quality = (int)(parsePercent(lu(args, "quality"))*100); - s_image(name, "jpeg", filename, quality); - } else { - s_image(name, "png", filename, 0); - } - return 0; -} - -static int c_outline(map_t*args) -{ - const char*name = lu(args, "name"); - const char*format = lu(args, "format"); - - readToken(); - if(type != RAWDATA) - syntaxerror("colon (:) expected"); - - s_outline(name, format, text); - return 0; -} - -int fakechar(map_t*args) -{ - const char*name = lu(args, "name"); - s_box(name, 0, 0, black, 20, 0); - return 0; -} - -static int c_egon(map_t*args) {return fakechar(args);} -static int c_button(map_t*args) { - const char*name = lu(args, "name"); - const char*as3name = lu(args, "as3name"); - s_button(name, as3name); - return 0; -} -static int current_button_flags = 0; -static int c_on_press(map_t*args) -{ - const char*position = lu(args, "position"); - const char*action = ""; - if(!strcmp(position, "inside")) { - current_button_flags |= BC_OVERUP_OVERDOWN; - } else if(!strcmp(position, "outside")) { - //current_button_flags |= BC_IDLE_OUTDOWN; - syntaxerror("IDLE_OVERDOWN not supported by SWF"); - } else if(!strcmp(position, "anywhere")) { - current_button_flags |= /*BC_IDLE_OUTDOWN|*/BC_OVERUP_OVERDOWN|BC_IDLE_OVERDOWN; - } - readToken(); - if(type == RAWDATA) { - action = text; - s_buttonaction(current_button_flags, action); - current_button_flags = 0; - } - else - pushBack(); - return 0; -} -static int c_on_release(map_t*args) -{ - const char*position = lu(args, "position"); - const char*action = ""; - if(!strcmp(position, "inside")) { - current_button_flags |= BC_OVERDOWN_OVERUP; - } else if(!strcmp(position, "outside")) { - current_button_flags |= BC_OUTDOWN_IDLE; - } else if(!strcmp(position, "anywhere")) { - current_button_flags |= BC_OVERDOWN_OVERUP|BC_OUTDOWN_IDLE|BC_OVERDOWN_IDLE; - } - readToken(); - if(type == RAWDATA) { - action = text; - s_buttonaction(current_button_flags, action); - current_button_flags = 0; - } - else - pushBack(); - return 0; -} -static int c_on_move_in(map_t*args) -{ - const char*position = lu(args, "state"); - const char*action = ""; - if(!strcmp(position, "pressed")) { - current_button_flags |= BC_OUTDOWN_OVERDOWN; - } else if(!strcmp(position, "not_pressed")) { - current_button_flags |= BC_IDLE_OVERUP; - } else if(!strcmp(position, "any")) { - current_button_flags |= BC_OUTDOWN_OVERDOWN|BC_IDLE_OVERUP|BC_IDLE_OVERDOWN; - } - readToken(); - if(type == RAWDATA) { - action = text; - s_buttonaction(current_button_flags, action); - current_button_flags = 0; - } - else - pushBack(); - return 0; -} -static int c_on_move_out(map_t*args) -{ - const char*position = lu(args, "state"); - const char*action = ""; - if(!strcmp(position, "pressed")) { - current_button_flags |= BC_OVERDOWN_OUTDOWN; - } else if(!strcmp(position, "not_pressed")) { - current_button_flags |= BC_OVERUP_IDLE; - } else if(!strcmp(position, "any")) { - current_button_flags |= BC_OVERDOWN_OUTDOWN|BC_OVERUP_IDLE|BC_OVERDOWN_IDLE; - } - readToken(); - if(type == RAWDATA) { - action = text; - s_buttonaction(current_button_flags, action); - current_button_flags = 0; - } - else - pushBack(); - return 0; -} -static int c_on_key(map_t*args) -{ - const char*key = lu(args, "key"); - const char*action = ""; - if(strlen(key)==1) { - /* ascii */ - if(key[0]>=32) { - current_button_flags |= 0x4000 + (key[0]*0x200); - } else { - syntaxerror("invalid character: %c"+key[0]); - return 1; - } - } else { - /* TODO: - = 0x200*(x-'a') - esc = = 0x3600 - space = = 0x4000; - */ - syntaxerror("invalid key: %s",key); - } - readToken(); - if(type == RAWDATA) { - action = text; - s_buttonaction(current_button_flags, action); - current_button_flags = 0; - } - else - pushBack(); - return 0; -} - -static int c_edittext(map_t*args) -{ - //"name font size width height text="" color=black maxlength=0 variable="" @password=0 @wordwrap=0 @multiline=0 @html=0 @noselect=0 @readonly=0 @autosize=0"}, - const char*name = lu(args, "name"); - const char*font = lu(args, "font"); - int size = (int)(1024*parsePxOrPercent(font, lu(args, "size"))); - int width = parseTwip(lu(args, "width")); - int height = parseTwip(lu(args, "height")); - const char*text = lu(args, "text"); - RGBA color = parseColor(lu(args, "color")); - int maxlength = parseInt(lu(args, "maxlength")); - const char*variable = lu(args, "variable"); - const char*passwordstr = lu(args, "password"); - const char*wordwrapstr = lu(args, "wordwrap"); - const char*multilinestr = lu(args, "multiline"); - const char*htmlstr = lu(args, "html"); - const char*noselectstr = lu(args, "noselect"); - const char*readonlystr = lu(args, "readonly"); - const char*borderstr = lu(args, "border"); - const char*autosizestr = lu(args, "autosize"); - const char*alignstr = lu(args, "align"); - int align = -1; - - int flags = 0; - if(!strcmp(passwordstr, "password")) flags |= ET_PASSWORD; - if(!strcmp(wordwrapstr, "wordwrap")) flags |= ET_WORDWRAP; - if(!strcmp(multilinestr, "multiline")) flags |= ET_MULTILINE; - if(!strcmp(readonlystr, "readonly")) flags |= ET_READONLY; - if(!strcmp(htmlstr, "html")) flags |= ET_HTML; - if(!strcmp(noselectstr, "noselect")) flags |= ET_NOSELECT; - if(!strcmp(borderstr, "border")) flags |= ET_BORDER; - if(!strcmp(autosizestr, "autosize")) flags |= ET_AUTOSIZE; - if(!strcmp(alignstr, "left") || !*alignstr) align = ET_ALIGN_LEFT; - else if(!strcmp(alignstr, "right")) align = ET_ALIGN_RIGHT; - else if(!strcmp(alignstr, "center")) align = ET_ALIGN_CENTER; - else if(!strcmp(alignstr, "justify")) align = ET_ALIGN_JUSTIFY; - else syntaxerror("Unknown alignment: %s", alignstr); - - s_edittext(name, font, size, width, height, text, &color, maxlength, variable, flags, align); - return 0; -} - -static int c_morphshape(map_t*args) {return fakechar(args);} -static int c_movie(map_t*args) {return fakechar(args);} - -static char* readfile(char*filename) -{ - FILE*fi = fopen(filename, "rb"); - int l; - char*text; - if(!fi) - syntaxerror("Couldn't find file %s: %s", filename, strerror(errno)); - fseek(fi, 0, SEEK_END); - l = ftell(fi); - fseek(fi, 0, SEEK_SET); - text = rfx_alloc(l+1); - fread(text, l, 1, fi); - text[l]=0; - fclose(fi); - return text; -} - -static int c_action(map_t*args) -{ - const char* filename = map_lookup(args, "filename"); - if(!filename ||!*filename) { - readToken(); - if(type != RAWDATA) { - syntaxerror("colon (:) expected"); - } - s_action(text); - } else { - s_action(readfile((char*)filename)); - } - - return 0; -} - -static int c_initaction(map_t*args) -{ - const char* character = lu(args, "name"); - const char* filename = map_lookup(args, "filename"); - if(!filename ||!*filename) { - readToken(); - if(type != RAWDATA) { - syntaxerror("colon (:) expected"); - } - s_initaction(character, text); - } else { - s_initaction(character, readfile((char*)filename)); - } - - return 0; -} - -static struct { - char*command; - command_func_t* func; - char*arguments; -} arguments[] = -{{"flash", c_flash, "bbox=autocrop background=black version=6 fps=50 name= filename= @compress=default @change-sets-all=no @export=1 @mainclass="}, - {"frame", c_frame, "n=1 name= @cut=no @anchor=no"}, - // "import" type stuff - {"swf", c_swf, "name filename as3name="}, - {"shape", c_swf, "name filename"}, - {"jpeg", c_image, "name filename quality=80%"}, - {"png", c_image, "name filename"}, - {"movie", c_movie, "name filename"}, - {"sound", c_sound, "name filename"}, - {"font", c_font, "name filename glyphs= @flashtype="}, - {"soundtrack", c_soundtrack, "filename"}, - {"quicktime", c_quicktime, "url"}, - {"video", c_video, "name width= height="}, - - // generators of primitives - - {"define", c_define, "name value=0"}, - {"point", c_point, "name x=0 y=0"}, - {"gradient", c_gradient, "name @radial=0 rotate=0 scale= scalex= scaley= x= y= width= height= r= shear="}, //extra parameters like .texture - {"interpolation", c_interpolation, "name function=linear speed=1.3 amplitude=0 bounces=2 growth=1.5 damping=2 slope=0"}, - {"outline", c_outline, "name format=simple"}, - {"textshape", c_textshape, "name font size=100% text"}, - - // filters - {"blur", c_blur, "name blur= blurx= blury= passes=1"}, - {"gradientglow", c_gradientglow, "name gradient blur= blurx= blury= angle=0.0 distance=0.0 strength=1.0 @innershadow=0 @knockout=0 @composite=0 @ontop=0 passes=1"}, - {"dropshadow", c_dropshadow, "name color blur= blurx= blury= angle=0.0 distance=0.0 strength=1.0 @innershadow=0 @knockout=0 @composite=0 passes=1"}, - {"bevel", c_bevel, "name shadow highlight blur= blurx= blury= angle=0.0 distance=0.0 strength=1.0 @innershadow=0 @knockout=0 @composite=0 @ontop=0 passes=1"}, - - // character generators - {"box", c_primitive, "name width height color=white line=1 @fill=none"}, - {"circle", c_primitive, "name r color=white line=1 @fill=none"}, - {"filled", c_primitive, "name outline color=white line=1 @fill=none"}, - - {"egon", c_egon, "name vertices color=white line=1 @fill=none"}, - {"text", c_text, "name text font size=100% color=white"}, - {"edittext", c_edittext, "name font= size=100% width height text="" color=white maxlength=0 variable="" @password=0 @wordwrap=0 @multiline=0 @html=0 @noselect=0 @readonly=0 @border=0 @autosize=0 align="}, - {"morphshape", c_morphshape, "name start end"}, - {"button", c_button, "name as3name="}, - {"show", c_show, "name x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= as="}, - {"on_press", c_on_press, "position=inside"}, - {"on_release", c_on_release, "position=anywhere"}, - {"on_move_in", c_on_move_in, "state=not_pressed"}, - {"on_move_out", c_on_move_out, "state=not_pressed"}, - {"on_key", c_on_key, "key=any"}, - - // control tags - {"play", c_play, "name loop=0 @nomultiple=0"}, - {"stop", c_stop, "name= "}, - {"nextframe", c_nextframe, "name"}, - {"previousframe", c_previousframe, "name"}, - - // object placement tags - {"put", c_put, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= @noinstancename=0"}, - {"startclip", c_startclip, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= @noinstancename=0"}, - {"move", c_move, "name x= y= interpolation=linear"}, - {"smove", c_smove, "name x= y= interpolation=linear"}, - {"sweep", c_sweep, "name x= y= r= dir=counterclockwise arc=short interpolation=linear"}, - {"change", c_change, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= interpolation=linear"}, - //{"arcchange", c_arcchange, "name pivot= angle= red= green= blue= alpha= luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below="}, - {"schange", c_schange, "name red= green= blue= alpha= luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below= interpolation=linear"}, - {"jump", c_jump, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= blend= filter= pivot= pin= shear= rotate= ratio= above= below="}, - {"del", c_del, "name"}, - // virtual object placement - {"texture", c_texture, " x=0 y=0 width= height= scale= scalex= scaley= r= shear= rotate="}, - // switching - {"toggle", c_toggle, "name fixed_alignment="}, - - // commands which start a block -//startclip (see above) - {"sprite", c_sprite, "name scalinggrid= as3name="}, - {"action", c_action, "filename="}, - {"initaction", c_initaction, "name filename="}, - - {"end", c_end, ""} -}; - - -static map_t parseArguments(char*command, char*pattern) -{ - char*x; - char*d,*e; - - string_t name[64]; - string_t value[64]; - int set[64]; - int isboolean[64]; - int pos; - int len; - int t; - string_t t1,t2; - map_t result; - map_init(&result); - - string_set(&t1, "commandname"); - string_set(&t2, command); - map_put(&result, t1, t2); - - if(!pattern || !*pattern) - return result; - - x = pattern; - - pos = 0; - - if(!strncmp(" ", x, 3)) { - readToken(); - if(type == COMMAND || type == RAWDATA) { - pushBack(); - syntaxerror("character name expected"); - } - name[pos].str = "instance"; - name[pos].len = 8; - value[pos].str = text; - value[pos].len = strlen(text); - set[pos] = 1; - pos++; - - if(type == ASSIGNMENT) - readToken(); - - name[pos].str = "character"; - name[pos].len = 9; - value[pos].str = text; - value[pos].len = strlen(text); - set[pos] = 1; - pos++; - - x+=4; - } - - while(*x) { - isboolean[pos] = (x[0] =='@'); - if(isboolean[pos]) - x++; - - d = strchr(x, ' '); - e = strchr(x, '='); - if(!d) - d=&x[strlen(x)]; - set[pos] = 0; - - if(!e || dtextlen?name[pos].len:textlen)) { - set[pos] = 1; - if(type == ASSIGNMENT) - readToken(); - value[pos].str = text; - value[pos].len = strlen(text); - /*printf("setting boolean parameter %s (to %s)\n", - strdup_n(name[pos], namelen[pos]), - strdup_n(value[pos], valuelen[pos]));*/ - break; - } - } - - // second, search for normal arguments - if(pos==len) - for(pos=0;postextlen?name[pos].len:textlen)) || - (type != ASSIGNMENT && !set[pos])) { - if(set[pos]) { - syntaxerror("value %s set twice (old value:%s)", text, strdup_n(value[pos].str, value[pos].len)); - } - if(type == ASSIGNMENT) - readToken(); - set[pos] = 1; - value[pos].str = text; - value[pos].len = strlen(text); -#if 0//def DEBUG - printf("setting parameter %s (to %s)\n", - strdup_n(name[pos].str, name[pos].len), - strdup_n(value[pos].str, value[pos].len)); -#endif - break; - } - } - if(pos==len) { - syntaxerror("Illegal argument \"%s\" to .%s", text, command); - } - } -#if 0//def DEBUG - for(t=0;t parse Command: %s (line %d)", command, line); - - for(t=0;t analyse Command: %s (line %d)", command, line); - - for(t=0;tuse && !font->use->glyphs_specified) { - if(!strcmp(command, "edittext")) - { - swf_FontUseAll(font); - font->use->glyphs_specified = 1; - } - else - swf_FontUseUTF8(font, (U8*)lu(&args, "text"), 0xffff); - } - } - map_clear(&args); - return; -} - -void skipParameters() -{ - do - readToken(); - while (type != COMMAND); - pushBack(); -} - -void findFontUsage() -{ - char* fontRelated = "font;text;textshape;edittext;"; - while(!noMoreTokens()) - { - readToken(); - if(type != COMMAND) - syntaxerror("command expected"); - if(strstr(fontRelated, text)) - analyseArgumentsForCommand(text); - else - if(strcmp(text, "end")) - skipParameters(); - } -} - -void firstPass() -{ - pos = 0; - id = 0; - dict_init(&fonts, 16); - cleanUp = &freeFontDictionary; - findFontUsage(); -} - -int main (int argc,char ** argv) -{ - int t; - processargs(argc, argv); - initLog(0,-1,0,0,-1,verbose); - - if(!filename) { - args_callback_usage(argv[0]); - exit(1); - } - - file = generateTokens(filename); - if(!file) { - fprintf(stderr, "parser returned error.\n"); - return 1; - } - firstPass(); - pos=0; - t=0; - - while(!noMoreTokens()) { - readToken(); - if(type != COMMAND) - syntaxerror("command expected"); - parseArgumentsForCommand(text); - } - - s_close(); - freeTokens(file); - - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfcombine b/fluidbook/tools/swftools-special-swfdump/src/swfcombine deleted file mode 100644 index 22e1ca729cf1130b578016a467f6ccff8c7efa82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121674 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

PIf_+kmC4ky3v+tTxoNKdT{S!3f}1JY*qWW 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 z zE4O=j-;WWliSUE>HJQ7pXX+?l!4kvX!{oo=Jbnrd)6?V?+~+%c^&0tpRi;Ou5eQvx zlmGlF%SX5l6o4uTDcBkv>z&O z)$x2gyFZ8Wzi#mrtf9yv@@wxjzK#59@(({CXT7Z@e|uj`cOvC~MgDX0zT_K~(*sAJ zxdeAB<@bNd*TC`mj^CjvZ@cgNfbx$#X7a;WuAStY62^B?&pz1DOFi$}X57u2-z7io zYvZFRKSVh_aQajKDU{E=W%BylbcCNlzWBGs-MYO#qUY-_5XP0Ee9hB7eD=ArxaX5! z@<(61dX6dXmE<2><%`$b%KY2`F8%Et&W|X*UcaLJtF%8SJ3FJCLU4}Z?Pki~{jjfO zDD}Th{yOczD$4JO=vhj>i}Gg<_La!KLazN$?x3CDOny{^vwFM}Bm8N~&ji=Fb~LGyi;TdMDP{s8&f?pFW$+c<>%0$kdC_GM;Qv8dJSQOaNWw6Fe) z^xdBM7VK{>-S;Tp|92+;DCPf~ys*OfyX5Wg;e^z4ucgNI8IcIjF=hSoYT3>-a^A2}Uk#~N>_){$JX7VTYvHa|# zu{`gci2iBhUr_$i>rKxqlf{Hq-%@A~Zu^6}poUqn5(l3y{~ z_<79FljO}DUk6bBHS!xyGKVPMW+v%Na4RCjZWL#`~x?JYS3a#nr|Kl0Qy<<6c!twv+#X{9w+%$B}=ioE|t! zc`FY$2-@vK*p7$wuzIdwy}d&DLF9{AKQsg0N#yhEe3d+m@>7-51INw3^^{Nl)Ym|L zrY7zdkT=n;x^Z_Ac+d8|y@q9Rm3MEeDE~m`Dn+vxa2xrx>wP8XlHWsq?`Gq!Up-E~ zZoYAShBD%8CQovFok=}!lkfkm$+K5@e+SoovO3&PzEF8ahO?Bn`}7RgziW#_ly~!1 zA86&ejPe7?@8P=C^;>!NpNxy6U-eb;$CN*nd`YCeZjUoRQ(&LHVtezw~9(vz8+N8IgaR{L2WRO+EX5C)}Uid~}%dZr+F|O#ck( z89=`B2IDd6k!Kl7yPWlsac6%fkgsBYwop9B2VBmV*7AJm6zWe>{#&k-T|LV)4^f2D zh3=u()s){wyRn4)R`4G9Trc`L;N6rTz;l2q%CC>;Pmyn>{8N;lNB$S`KYZ&exr+R2 zaIq)bBm2$053u?fz;V=<@_oo(f6nx{{KzvCr9L01Gw#+E-zUF;`>*b-|MBGey=(IS z=Gk>R`8m%RcXlA5oI-G1dtDOYhf(B4>e+d}>DjM?1^gUb?dR2D`}rW{cRX(L7f{bD zif`Czu=9P;htU#vDg50QUMe&!D2XOVX~(CTg1&BjNO%d;4zKF@o~_|fFY zkl*o&@%zY6AphHq#y=zmQuab6<7kK?F2^=u>Ga+AsLApd}T zHrGWk3wnJ*o})c<`TT~w{wrVQ`kA;V|Gy{wcH@V}uO~l%d?oFY%fCEpQsf_BX!80W z5r{LE{3!PG#ndxRIX!UZb6m^+`nf(Mp+{0go;fM{2mH}jat8TIaIv@RZlE0?zmoD- zavphv{HBQhs`eIeALTFo)K{R-62zT6t5VXvI#T~HkzdUDdYP&5wvw-8J-c!A9(e=p z@ZOaFocxeSeI@#gaok}EtM=`a$aw4uF8R5gpKmUro+HR_e%|ynl2?*n`L%I3uho!u z{DblRSP#?4?_O^FI_gQ1Kf`n5gUJ_=|C09kd*nX?@5y^{I`jTk%C8>pE15=qk8*n8 z3}=4inVC}FyGQsMcsNC#ByY!g(2cLx$=`g?T`lOL+Qo43zI)1&`cg|LC-pZ>|X``r9Q@>iZR-V9l}#*%N` z;H$q$-|@d%%ISf#l(%&e?(D`2>UnsFuaaXae*^jYYmDoEjUen79FiyzTchPoVt0v||OTtcvJAn&W*s zl}T3CdAWSHE?FqV^K%QHyv5Sl z%-q3+hHSo=&B@=*d#M8cWjvOTXXYk7{O^1cKaxofE+!ju@^|5$2^GA?_`GDH7_Xbx zh<|iX=Dk8Xjz55hsNJO!=IU>8JpB46mYo;FzqrR#4zVQ?{)oIWp7RpPT(N=o$Sdv& z$mrCXnYA-&kd;(1mOxUeOkA@^j{FpxW7(!+uBjNC(^OxNJTM5F8$(f~6m1nLEvH5U z+9;7SXl4r8rhHve%LK_ZU?2-3RhXB`k?L=WgyoZk=1g6zn3cO?JYUrKnh5owM6?3{Cxbw%9U4XPd~g5%elX{j9CqJ;9xr_5ZaPbCV93b}l$m<)hiA=#A3MkEn_ ziu?*IU%wD~OdCpq%t(Twer~cj4K*_+mG_E`In-|DAp0+Pgyoa*L^2=CG^NvW8}%bw z@pL*Hk}D*W^PHSiZZMwnN8^=vFmhwEF&G!#GNDmTix#0dg3%O2vZ+j!Es!eA$Dmv9 zV*2hysZ>3x5G~f&9IH<^;hrLM^VtREBZoq$fRUuMdK*rz6^F&8^2>;~Vu~+Hr{=_x z`Fu9-s$WPdQ?El=>I5Yf6s*R8NU18BO$kD0lGx#l1_PLOIy+aoR$V@s%-}wqoS#gq zJt=u`Q-gAQa8r#r7@&9tz1#&C!hEoYN`=DMxCxU-S51gbuBoXVJ1sV?YV?G$F)wCA zGoH`Kn`6mLA`EQ6#m1a5scPc*YVX`!vdn<={R!hopE_mixY%&?b{V)ai&s}nH70$3 z9D=K3gDVGDp5WD?i_d}WtIjsz*MS%<<1>&=qh4S@r^Jg5-W=G?#6*m|Nic~vIL9T6 z6XV5vYM~C*si=I|x54VEO%`j8A7<7z8%~Ngt+m$UIkC1F|IjzRkW7ppW9p|S3mCQd znWYv_EM`92j0S}1&%x#t!sUaZ$Q0|tNr_VAq-u0^?GVeCBr$lX%i{DAF5NL=vArA$ z8Y?7`pE!P1>8x+<6w5(1x>qq-T{d+cxW#bljaoOcc;eiqLeY}Mj3Nz!#zeoXi`5mH zV$!*6q{YnGxsHvj){e%^;j%b&+-Q#tDCJ5Os$i8CBono2BBh>Eh3S}E*d%r7Y$4Lf zIy<_S)@jmBkT!nCqMPNDjoJB9$i{32I!me7q!uOSeMq{3JFXj}={Bpk1m^QX8Ub zpaNATy%Nq?%E7&BqKevpN81hQz7G@W{+{O)8`&osAd0>w{QTUm8(4K z6s+GdGAkxWkIvdKLs_N#wW&oqf5uKv=2P{}Q&74E*?ej8((H?|wY*3<>l)(ua8V_J z>6w~rnte!%0sW&f+s(rw#*8X6rp==gFb&DP49w9tli=EAuS_u{5P9ILuUouR{W_1Ro9 z6Gj|%Y6WAB@l+&OS8^Cww#1WiSErNly!6pvuP9AQd9w?qZg+Mm&>5z~BC8a)ud}km5DTv_Ot47<27vT!dyI)n2M#9*|(|aVK8@6@y>jmRx^HP+m4$? zpVH22Yvz(wphaMI#tbuCnJUyaz)VX`v}TljTL6ag#HMsHl}k5QrE?8&9qh2zwq%Zp zNwMCGB3egMo36Erp^dpEV$GS#xO_a3lHaR~e+(9rnho_;B@*KsrR^nXtk{UUq5)N1 zNXjC+K8{?KQH@THvP?*3rbr$oPwC`@?A*CBRz+W`Fb!r$id&~0Q)a+|EH7o*rHjFO z8OGDHGReipPlg>xV2ja&*~@c_kv6shjgq!1mn5_qk;33st$p|1ZCqA)18Y}h0R-Ib~A6*V>uI!FRi6R*SfbgQlT!M(LNKN zbtO}}W|*$#KNbrtGb9Y{&4DaFRQtqiKG#rcR*ZRWB}#y+(fL22kd_h`jj%84m6}Xoyxh|4K1#NTaD7RWz8@coAYF5*wAqQ)J|<{ z@>uz`p!5eRKO2f&56wG%jAjeH(q(;uRdq3st{6@xI(~Kd+u%nxFJxnw%@P=a>@n)- z@MUt&+P9i$TdyE-w>&a?#eO7CFus@;n~`KdHhXE=(uA{!hAL*$VHQ|gN^J(3VItJ1 zSNhD9Ec%xE&t`qqx{9pTSZ-a3VaQ+zPS7oq z@Kiy|DkDt1h$PF|8M0(j+l>HQMFna{1~V*0v-V2aEY;L-4lkhA;Qo)9lNYp3=f*IC3t9PI73s+W2IL})-^_^x8N`mJ@h;4 zYF@XnRKpaEVXJCp!>wA-WNw((K#v>{spZ!BK++KT@da65Vcr%GVqoTDXDOqK#0TF(9~1m~!L1sx58Y}uT_ ztp*z@IDavA>&_8HD$NgQBI^jH-Gr1K`$$)KS6yNiwU&i!@Ge6GKO|?RBlzRm))887Yw) z?5S+5kjDxssLic8xKtZo+J;QVfpH^tR_O7Q^D@UvSx|$e;iFpJQN->iA4GBe9SX!6 zlm?tu0X83Y#*9!jO89_6#~g;LEH^RaZ75FSdQ{glSm6|SFi?xNo|t0RtU7Myv0S^! zM$9S7H7y&Ob&$HXlg@16`fY5=;50kTq(Vv?Ku=GmSVuBy>dTxuNH9_fPZAtuj9SYh z8Hmvk%|!+3L0f1Ran0jl8?M8vw4c`wDRpD@pzQ{2qL^d8Bw>CV{Aee)MnW!S$xv#i zfTBOS0bV^l3ABn81?6{{v4UH{9^(Ybr(#DM8bA(`yWRYrq)$goF>!wgL zB?g#PZb{2D5ddAx>7L88Qp(r&ZL53R;A&ATwiXQ z%;4N0o_1qgQl5(VfjTVJ6PjPfN|^#{vRq^CZf7r=XNV=XWv2Bgbh^MoIMmec0|uBC z>!o($JO_(38S1hH$EOUeDLn_0`@jU?HD#R12`Lss>~@{@`H@znbt@TrT43yC>r>d! zA{ja9#dySiP8ZnWrou9>%$Ro_(@Hrei4Bb&2jsQU!Wvk*kd@c@O%`#|&M`F;p;~Zb zOjfj!H4gUHC{;KKYgJhoOJAR+CkS5KV{JL(@$@8J>s7{*7|VM7d?T#UWleS*nEGU_ UB$9KQ=Fa6TU`0l)$x`?K0M}hFh5!Hn diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfcombine.1 b/fluidbook/tools/swftools-special-swfdump/src/swfcombine.1 deleted file mode 100644 index 00552210c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfcombine.1 +++ /dev/null @@ -1,130 +0,0 @@ -.TH swfcombine "1" "August 2009" "swfcombine" "swftools" -.SH NAME -swfcombine - a tool for combining swf (flash) files - -.SH Synopsis -.B swfcombine [-rXYomlcv] [-f] masterfile [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN -.PP -.B swfcombine [-rXYomv] --stack[1] [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN -.PP -.B swfcombine [-rXYov] --cat [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN -.PP -.B swfcombine [-rXYomlcv] --dummy [-xys] [file] - -.SH DESCRIPTION -Take two or more SWF files, and combine them into a new SWF. SWFs can either -be stacked (no masterfile is present) or inserted (into the masterfile). -.PP -SWF files are animation files which can be displayed in Web Browsers using -the Flash Plugin. -.LP -For template mechanisms, it's often convenient to separate the processes -of generating small animation fragments and merging them into a big -movie. swfcombine can be used to perform the latter. - -.SH OPTIONS -.TP -\fB\-o\fR, \fB\-\-output\fR \fIoutputfile\fR - explicitly specify output file. (otherwise, output.swf will be used) -.TP -\fB\-t\fR, \fB\-\-stack\fR - Don't assume the first file is a master file. Instead, store each - file in a seperate frame. -.TP -\fB\-T\fR, \fB\-\-stack1\fR - place each slave in the first frame (no master movie) -.TP -\fB\-m\fR, \fB\-\-merge\fR - Do not store the slave files in a sprite/MovieClip. Instead, merge the files frame by frame. -.TP -\fB\-a\fR, \fB\-\-cat\fR - concatenate all slave files (no master movie) -.TP -\fB\-l\fR, \fB\-\-overlay\fR - Don't remove any master objects, only overlay new objects -.TP -\fB\-c\fR, \fB\-\-clip\fR - Clip the slave objects by the corresponding master objects -.TP -\fB\-v\fR, \fB\-\-verbose\fR - Be verbose. Use more than one -v for greater effect -.TP -\fB\-F\fR, \fB\-\-flashversion\fR - Set the flash version of the output file. -.TP -\fB\-d\fR, \fB\-\-dummy\fR - Don't require the presence of slave objects. Usually used together with \fB\-X\fR, \fB\-Y\fR or \fB\-r\fR. -.TP -\fB\-f\fR, \fB\-\-frame\fR - The next slave replaces a frame, not an object. Therefore the slave identifier is a - frame number (#frame=) or frame label (framelabel=). -.TP -\fB\-x\fR, \fB\-\-movex\fR \fIxpos\fR - x Adjust position of slave by \fIxpos\fR pixels -.TP -\fB\-y\fR, \fB\-\-movey\fR \fIypos\fR - y Adjust position of slave by \fIypos\fR pixels -.TP -\fB\-s\fR, \fB\-\-scale\fR \fIscale\fR - Adjust size of slave by \fIscale\fR percent (e.g. 100% = original size) -.TP -\fB\-r\fR, \fB\-\-rate\fR \fIfps\fR - Force the output to have the framerate \fIfps\fR. (Otherwise, the framerate of the master file will be used) -.TP -\fB\-X\fR, \fB\-\-width\fR \fIwidth\fR - Force movie bbox width to \fIwidth\fR (default: use master width (not with -t)) -.TP -\fB\-Y\fR, \fB\-\-height\fR \fIheight\fR - Force movie bbox height to \fIheight\fR (default: use master height (not with -t)) -.TP -\fB\-N\fR, \fB\-\-local-with-networking\fR - Make output file "local-with-networking" -.TP -\fB\-G\fR, \fB\-\-hardware-gpu\fR - Set the "use hardware gpu" bit in the output file -.TP -\fB\-B\fR, \fB\-\-accelerated-blit\fR - Set the "use accelerated blit" bit in the output file -.TP -\fB\-L\fR, \fB\-\-local-with-filesystem\fR - Make output file "local-with-filesystem" -.TP -\fB\-z\fR, \fB\-\-zlib\fR \fIzlib\fR - Use Flash MX (SWF 6) Zlib encoding for the output. The resulting SWF will be - smaller, but not playable in Flash Plugins of Version 5 and below. -.PP -.SH Combining two or more .swf files using a master file -Of the flash files to be combined, all except one will be packed into a sprite -structure (Movieclip) which will then be inserted into the master .swf file. -This means that, in terms of trees, when combining several flash files, -one will form the root of the tree, while the others will be -appended to the root as a subnode. -The user has to specify which of the files will become the root -of the tree ("master") and which will be the appended nodes ("slaves"). -The slave files must all have a name, which is then used to determine -their exact position inside the master file. -The slave files will then be converted into sprites, inserted into the -master file, and all PlaceObject tags in the master file which match the -name of the slave file will be updated to correctly display the slave sprite. -The slave name may also be the object id, preceded by '#', in which case -the object to be replaced is referenced by id and not by instance name. -.SH Combining (stacking) one or more .swf files without a master -The flash files will be inserted in seperate frames. They will still be -packed into Movieclips, therefore the outputfile will have exactly as many -frames as there were inputfiles. Also, the files don't need to have names. -If you want to access the Movieclips, their names are frameXX, where XX is -the decimal number of the file, starting by zero (00). - -.SH EXAMPLES - -Create two flash movies. Insert some rectangle into one of them, and give -it a name. (E.g. "foo") Now call - -swfcombine -o combined.swf master.swf foo=slave.swf - -As a result, the slave movie should be visible inside the master movie -at the position where the rectangle used to be. - -.SH AUTHOR - -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfcombine.c b/fluidbook/tools/swftools-special-swfdump/src/swfcombine.c deleted file mode 100644 index 2766e6161..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfcombine.c +++ /dev/null @@ -1,1396 +0,0 @@ -/* swfcombine.c - main routine for swfcombine(1), a tool for merging .swf-files. - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" -#include "../lib/log.h" -#include "../config.h" - -struct config_t -{ - char overlay; - char alloctest; - char clip; - char stack; - char stack1; - char antistream; - char dummy; - char zlib; - char cat; - char merge; - char isframe; - char local_with_networking; - char local_with_filesystem; - char accelerated_blit; - char hardware_gpu; - int loglevel; - int sizex; - char hassizex; - int sizey; - char hassizey; - int flashversion; - int framerate; - int movex; - int movey; - float scalex; - float scaley; - int mastermovex; - int mastermovey; - float masterscalex; - float masterscaley; -}; -struct config_t config; - -char * master_filename = 0; -char * master_name = 0; -char * slave_filename[128]; -char * slave_name[128]; -int slave_movex[128]; -int slave_movey[128]; -float slave_scalex[128]; -float slave_scaley[128]; -char slave_isframe[128]; -int numslaves = 0; - -char * outputname = "output.swf"; - -int args_callback_option(char*name,char*val) { - if(!strcmp(name,"c")) - { - config.clip = 1; - return 0; - } - else if(!strcmp(name,"l")) - { - config.overlay = 1; - return 0; - } - else if (!strcmp(name, "o")) - { - outputname = val; - return 1; - } - else if (!strcmp(name, "v")) - { - config.loglevel ++; - return 0; - } - else if (!strcmp(name, "a")) - { - config.cat = 1; - return 0; - } - else if (!strcmp(name, "A")) - { - config.alloctest = 1; - return 0; - } - else if (!strcmp(name, "x")) - { - float x = atof(val); - config.movex = (int)(x*20+0.5); - return 1; - } - else if (!strcmp(name, "y")) - { - float y = atof(val); - config.movey = (int)(y*20+0.5); - return 1; - } - else if (!strcmp(name, "m")) - { - config.merge = 1; - return 0; - } - else if (!strcmp(name, "f")) - { - config.isframe = 1; - return 0; - } - else if (!strcmp(name, "F")) - { - config.flashversion = atoi(val); - return 1; - } - else if (!strcmp(name, "d")) - { - config.dummy = 1; - return 0; - } - else if (!strcmp(name, "z")) - { - config.zlib = 1; - return 0; - } - else if (!strcmp(name, "r")) - { - - float rate = atof(val); - if ((rate < 0) ||(rate >= 256.0)) { - fprintf(stderr, "Error: You must specify a valid framerate between 1/256 and 255.\n"); - exit(1); - } - config.framerate = (int)(rate*256); - return 1; - } - else if (!strcmp(name, "X")) - { - config.sizex = atoi(val)*20; - config.hassizex = 1; - return 1; - } - else if (!strcmp(name, "Y")) - { - config.sizey = atoi(val)*20; - config.hassizey = 1; - return 1; - } - else if (!strcmp(name, "s")) - { - config.scalex = config.scaley = atoi(val)/100.0; - return 1; - } - else if (!strcmp(name, "w")) - { - config.scalex = atoi(val)/100.0; - return 1; - } - else if (!strcmp(name, "h")) - { - config.scaley = atoi(val)/100.0; - return 1; - } - else if (!strcmp(name, "N")) - { - config.local_with_networking = 1; - return 0; - } - else if (!strcmp(name, "L")) - { - config.local_with_filesystem = 1; - return 0; - } - else if (!strcmp(name, "B")) - { - config.accelerated_blit = 1; - return 0; - } - else if (!strcmp(name, "G")) - { - config.hardware_gpu = 1; - return 0; - } - else if (!strcmp(name, "t") || !strcmp(name, "T")) - { - if(master_filename) { - fprintf(stderr, "error with arguments. Try --help.\n"); - exit(1); - } - config.stack = 1; - if(!strcmp(name,"T")) - config.stack1 = 1; - master_filename = "__none__"; - return 0; - } - else if (!strcmp(name, "V")) - { - printf("swfcombine - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else - { - fprintf(stderr, "Unknown option: -%s\n", name); - exit(1); - } -} - -static struct options_t options[] = { -{"o", "output"}, -{"t", "stack"}, -{"T", "stack1"}, -{"m", "merge"}, -{"a", "cat"}, -{"l", "overlay"}, -{"c", "clip"}, -{"v", "verbose"}, -{"F", "flashversion"}, -{"d", "dummy"}, -{"f", "frame"}, -{"x", "movex"}, -{"y", "movey"}, -{"s", "scale"}, -{"r", "rate"}, -{"X", "width"}, -{"Y", "height"}, -{"N", "local-with-networking"}, -{"G", "hardware-gpu"}, -{"B", "accelerated-blit"}, -{"L", "local-with-filesystem"}, -{"z", "zlib"}, -{0,0} -}; - -int args_callback_longoption(char*name,char*val) { - return args_long2shortoption(options, name, val); -} - -int args_callback_command(char*name, char*val) { - char*myname = strdup(name); - char*filename; - filename = strchr(myname, '='); - if(filename) { - *filename = 0; - filename++; - } else { - // argument has no explicit name field. guess one from the file name - char*path = strrchr(myname, '/'); - char*ext = strrchr(myname, '.'); - if(!path) path = myname; - else path ++; - if(ext) *ext = 0; - myname = path; - filename = name; - } - - if(!master_filename) { - master_filename = filename; - master_name = myname; - config.mastermovex = config.movex; - config.mastermovey = config.movey; - config.masterscalex = config.scalex; - config.masterscaley = config.scaley; - config.movex = config.movey = 0; - config.scalex = config.scaley = 1.0; - } else { - msg(" slave entity %s (named \"%s\")\n", filename, myname); - - slave_filename[numslaves] = filename; - slave_name[numslaves] = myname; - slave_movex[numslaves] = config.movex; - slave_movey[numslaves] = config.movey; - slave_scalex[numslaves] = config.scalex; - slave_scaley[numslaves] = config.scaley; - slave_isframe[numslaves] = config.isframe; - config.isframe = 0; - config.movex = config.movey = 0; - config.scalex = config.scaley = 1.0; - numslaves ++; - } - return 0; -} - -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-rXYomlcv] [-f] masterfile [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN\n", name); - printf("OR: %s [-rXYomv] --stack[1] [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN\n", name); - printf("OR: %s [-rXYov] --cat [-xysf] [(name1|#id1)=]slavefile1 .. [-xysf] [(nameN|#idN)=]slavefileN\n", name); - printf("OR: %s [-rXYomlcv] --dummy [-xys] [file]\n", name); - printf("\n"); - printf("-o , --output explicitly specify output file. (otherwise, output.swf will be used)\n"); - printf("-t , --stack place each slave in a seperate frame (no master movie)\n"); - printf("-T , --stack1 place each slave in the first frame (no master movie)\n"); - printf("-m , --merge Don't store the slaves in Sprites/MovieClips\n"); - printf("-a , --cat concatenate all slave files (no master movie)\n"); - printf("-l , --overlay Don't remove any master objects, only overlay new objects\n"); - printf("-c , --clip Clip the slave objects by the corresponding master objects\n"); - printf("-v , --verbose Be verbose. Use more than one -v for greater effect \n"); - printf("-F , --flashversion Set the flash version of the output file.\n"); - printf("-d , --dummy Don't require slave objects (for changing movie attributes)\n"); - printf("-f , --frame The following identifier is a frame or framelabel, not an id or objectname\n"); - printf("-x , --movex x Adjust position of slave by pixels\n"); - printf("-y , --movey y Adjust position of slave by pixels\n"); - printf("-s , --scale Adjust size of slave by percent (e.g. 100%% = original size)\n"); - printf("-r , --rate Set movie framerate to (frames/sec)\n"); - printf("-X , --width Force movie bbox width to (default: use master width (not with -t))\n"); - printf("-Y , --height Force movie bbox height to (default: use master height (not with -t))\n"); - printf("-N , --local-with-networking Make output file \"local-with-networking\"\n"); - printf("-G , --hardware-gpu Set the \"use hardware gpu\" bit in the output file\n"); - printf("-B , --accelerated-blit Set the \"use accelerated blit\" bit in the output file\n"); - printf("-L , --local-with-filesystem Make output file \"local-with-filesystem\"\n"); - printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); - printf("\n"); -} - -void removeCommonTags(SWF * swf) -{ - TAG*tag = swf->firstTag; - while(tag) { - if(tag->id == ST_SCENEDESCRIPTION || - tag->id == ST_FILEATTRIBUTES || - tag->id == ST_REFLEX) { - tag = swf_DeleteTag(swf, tag); - } else { - tag = tag->next; - } - } -} - -static void makestackmaster(SWF*swf) -{ - TAG*tag; - int t; - SRECT box; - int fileversion = config.zlib?6:3; - int frameRate = 256; - U32 fileAttributes = 0; - RGBA rgb; - rgb.r=rgb.b=rgb.g=0; - memset(&box, 0, sizeof(box)); - - /* scan all slaves for bounding box */ - for(t=numslaves-1;t>=0;t--) - { - SWF head; - int ret; - int fi=open(slave_filename[t],O_RDONLY|O_BINARY); - TAG*tag; - if(fi<0 || swf_ReadSWF(fi, &head)<0) { - msg(" Couldn't open/read %s.", slave_filename[t]); - exit(1); - } - close(fi); - swf_RemoveJPEGTables(&head); - fileAttributes |= head.fileAttributes; - removeCommonTags(&head); - - msg(" File %s has bounding box %d:%d:%d:%d\n", - slave_filename[t], - head.movieSize.xmin, head.movieSize.ymin, - head.movieSize.xmax, head.movieSize.ymax); - - tag = head.firstTag; - while(tag) { - if(tag->id == ST_SETBACKGROUNDCOLOR && tag->len>=3) { - rgb.r = tag->data[0]; - rgb.g = tag->data[1]; - rgb.b = tag->data[2]; - } - tag=tag->next; - } - frameRate = head.frameRate; - if(head.fileVersion > fileversion) - fileversion = head.fileVersion; - if(!t) - box = head.movieSize; - else { - if(head.movieSize.xmin < box.xmin) - box.xmin = head.movieSize.xmin; - if(head.movieSize.ymin < box.ymin) - box.ymin = head.movieSize.ymin; - if(head.movieSize.xmax > box.xmax) - box.xmax = head.movieSize.xmax; - if(head.movieSize.ymax > box.ymax) - box.ymax = head.movieSize.ymax; - } - msg(" New master bounding box is %d:%d:%d:%d\n", - box.xmin, box.ymin, - box.xmax, box.ymax); - swf_FreeTags(&head); - } - - memset(swf, 0, sizeof(SWF)); - swf->fileVersion = fileversion; - swf->movieSize = box; - swf->frameRate = frameRate; - swf->fileAttributes = fileAttributes; - - swf->firstTag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR); - tag = swf->firstTag; - swf_SetRGB(tag, &rgb); - - for(t=0;t temporary SWF created"); -} - -static char* slavename = 0; -static int slaveid = -1; -static int slaveframe = -1; -static char masterbitmap[65536]; -static char depthbitmap[65536]; - -#define FLAGS_WRITEDEFINES 1 -#define FLAGS_WRITENONDEFINES 2 -#define FLAGS_WRITESPRITE 4 -#define FLAGS_WRITESLAVE 8 - -int get_free_id(char*bitmap) -{ - int t; - for(t=1;t<65536;t++) - if(!bitmap[t]) { - bitmap[t] = 1; - return t; - } - return -1; -} - -void jpeg_assert(SWF*master, SWF*slave) -{ - /* TODO: if there's a jpegtable found, store it - and handle it together with the flash file - headers */ - - /* check that master and slave don't have both - jpegtables (which would be fatal) */ - int pos; - TAG *mpos=0, *spos=0; - TAG *mtag,*stag; - pos = 0; - mtag = master->firstTag; - stag = slave->firstTag; - while(mtag) - { - if(mtag->id == ST_JPEGTABLES) - mpos = mtag; - mtag = mtag->next; - } - while(stag) - { - if(stag->id == ST_JPEGTABLES) - spos = stag; - stag = stag->next; - } - if(mpos && spos) - { - if(spos->len == mpos->len && - !memcmp(spos->data, mpos->data, mpos->len)) - { - // ok, both have jpegtables, but they're identical. - // delete one and don't throw an error - swf_DeleteTag(slave, spos); - spos = 0; - } - } - if(spos && mpos) { - msg(" Master and slave have incompatible JPEGTABLES."); - } -} - -TAG* write_sprite_defines(TAG*tag, SWF*sprite) -{ - TAG*rtag = sprite->firstTag; - while(rtag && rtag->id!=ST_END) { - if(!swf_isAllowedSpriteTag(rtag)) { - msg(" processing sprite tag %02x", tag->id); - if(swf_isDefiningTag(rtag)) - { - msg(" [sprite defs] write tag %02x (%d bytes in body)", - tag->id, tag->len); - tag = swf_InsertTag(tag, rtag->id); - swf_SetBlock(tag, rtag->data, rtag->len); - } - else if(swf_isPseudoDefiningTag(rtag)) - { - msg(" [sprite defs] write tag %02x (%d bytes in body)", - tag->id, tag->len); - tag = swf_InsertTag(tag, rtag->id); - swf_SetBlock(tag, rtag->data, rtag->len); - } - else { - switch(rtag->id) - { - case ST_JPEGTABLES: - /* if we get here, jpeg_assert has already run, - ensuring this is the only one of it's kind, - so we may safely write it out */ - tag = swf_InsertTag(tag, rtag->id); - swf_SetBlock(tag, rtag->data, rtag->len); - break; - case ST_EXPORTASSETS: - msg(" deliberately ignoring EXPORTASSETS tag"); - break; - case ST_ENABLEDEBUGGER: - msg(" deliberately ignoring ENABLEDEBUGGER tag"); - break; - case ST_SETBACKGROUNDCOLOR: - msg(" deliberately ignoring BACKGROUNDCOLOR tag"); - break; - case ST_SHOWFRAME: - msg(" deliberately ignoring SHOWFRAME tag"); - break; - case ST_REFLEX: - msg(" deliberately ignoring REFLEX tag"); - break; - case 40: - case 49: - case 51: - msg(" found tag %d. This is a Generator template, isn't it?", rtag->id); - break; - default: - msg(" funny tag: %d is neither defining nor sprite", rtag->id); - } - } - } - rtag = rtag->next; - } - return tag; -} - -void changedepth(TAG*tag, int add) -{ - if(tag->id == ST_PLACEOBJECT) - PUT16(&tag->data[2],GET16(&tag->data[2])+add); - if(tag->id == ST_PLACEOBJECT2) - PUT16(&tag->data[1],GET16(&tag->data[1])+add); - if(tag->id == ST_REMOVEOBJECT) - PUT16(&tag->data[2],GET16(&tag->data[2])+add); - if(tag->id == ST_REMOVEOBJECT2) - PUT16(&tag->data[0],GET16(&tag->data[0])+add); - if(tag->id == ST_PLACEOBJECT2) { - SWFPLACEOBJECT obj; - U8 flags; - swf_SetTagPos(tag, 0); - flags = swf_GetU8(tag); - if(flags&2) swf_GetU16(tag); //id - if(flags&4) swf_GetMatrix(tag, 0); - if(flags&8) swf_GetCXForm(tag, 0,1); - if(flags&16) swf_GetU16(tag); //ratio - if(flags&64) { - swf_ResetReadBits(tag); - printf("%d->%d\n", GET16(&tag->data[tag->pos]), - GET16(&tag->data[tag->pos])+add); - PUT16(&tag->data[tag->pos],GET16(&tag->data[tag->pos])+add); - } - msg(" Depth relocation not fully working yet with clipdepths", tag->id); - } -} - -void matrix_adjust(MATRIX*m, int movex, int movey, float scalex, float scaley, int scalepos) -{ - m->sx = (int)(m->sx*scalex); - m->sy = (int)(m->sy*scaley); - m->r1 = (int)(m->r1*scalex); - m->r0 = (int)(m->r0*scaley); - if(scalepos) { - m->tx *= scalex; - m->ty *= scaley; - } - m->tx += movex; - m->ty += movey; -} - -void write_changepos(TAG*output, TAG*tag, int movex, int movey, float scalex, float scaley, int scalepos) -{ - if(movex || movey || scalex != 1.0 || scaley != 1.0) - { - switch(tag->id) - { - case ST_PLACEOBJECT2: { - MATRIX m; - U8 flags; - swf_GetMatrix(0, &m); - tag->pos = 0; - tag->readBit = 0; - - flags = swf_GetU8(tag); - swf_SetU8(output, flags|4); - swf_SetU16(output, swf_GetU16(tag)); //depth - //flags&1: move - if(flags&2) { - swf_SetU16(output, swf_GetU16(tag)); //id - } - // flags & 4 - if(flags&4) { - swf_GetMatrix(tag, &m); - } else { - swf_GetMatrix(0, &m); - } - matrix_adjust(&m, movex, movey, scalex, scaley, scalepos); - swf_SetMatrix(output, &m); - - if (tag->readBit) { tag->pos++; tag->readBit = 0; } //swf_ResetReadBits(tag); - - swf_SetBlock(output, &tag->data[tag->pos], tag->len - tag->pos); - break; - } - case ST_PLACEOBJECT: { - MATRIX m; - swf_SetU16(output, swf_GetU16(tag)); //id - swf_SetU16(output, swf_GetU16(tag)); //depth - - swf_GetMatrix(tag, &m); - matrix_adjust(&m, movex, movey, scalex, scaley, scalepos); - swf_SetMatrix(output, &m); - - if (tag->readBit) { tag->pos++; tag->readBit = 0; } //swf_ResetReadBits(tag); - - swf_SetBlock(output, &tag->data[tag->pos], tag->len - tag->pos); - break; - } - default: - swf_SetBlock(output, tag->data, tag->len); - } - } - else - { - swf_SetBlock(output, tag->data, tag->len); - } -} - -TAG* write_sprite(TAG*tag, SWF*sprite, int spriteid, int replaceddefine) -{ - TAG* definespritetag; - TAG* rtag; - int tmp; - - definespritetag = tag = swf_InsertTag(tag, ST_DEFINESPRITE); - swf_SetU16(tag, spriteid); - swf_SetU16(tag, sprite->frameCount); - msg (" sprite id is %d", spriteid); - - tmp = sprite->frameCount; - msg(" %d frames to go",tmp); - - if(config.clip) { - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_SetU8(tag, 2+64); //flags: character+clipdepth - swf_SetU16(tag, 0); //depth - swf_SetU16(tag, replaceddefine); //id - swf_SetU16(tag, 65535); //clipdepth - } - - if(config.overlay && !config.isframe) { - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_SetU8(tag, 2); //flags: character - swf_SetU16(tag, 1); //depth - swf_SetU16(tag, replaceddefine); //id - } - - rtag = sprite->firstTag; - while(rtag && rtag->id!=ST_END) - { - if (swf_isAllowedSpriteTag(rtag)) { - - msg(" [sprite main] write tag %02x (%d bytes in body)", - rtag->id, rtag->len); - tag = swf_InsertTag(tag, rtag->id); - write_changepos(tag, rtag, config.movex, config.movey, config.scalex, config.scaley, 0); - - if(config.clip || (config.overlay && !config.isframe)) - changedepth(tag, +2); - - if(tag->id == ST_SHOWFRAME) - { - tmp--; - msg(" %d frames to go",tmp); - } - } - rtag = rtag->next; - } - tag = swf_InsertTag(tag, ST_END); - return tag; -} - -static char tag_ok_for_slave(int id) -{ - if(id == ST_SETBACKGROUNDCOLOR) - return 0; - return 1; -} - -TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefine, int flags) -{ - int outputslave = 0; - int frame = 1; - int sframe = 0; - int slavewritten = 0; - int deletedepth = -1; - - TAG* rtag = master->firstTag; - TAG* stag = slave->firstTag; - - while(rtag && rtag->id!=ST_END) - { - if(rtag->id == ST_SHOWFRAME && outputslave) - { - while(stag && stag->id!=ST_END) { - if(stag->id == ST_SHOWFRAME) { - stag = stag->next; - sframe++; - break; - } - if(tag_ok_for_slave(stag->id)) { - tag = swf_InsertTag(tag, stag->id); - write_changepos(tag, stag, config.movex, config.movey, config.scalex, config.scaley, 0); - } - stag = stag->next; - } - } - if(rtag->id == ST_SHOWFRAME) - { - frame ++; - tag = swf_InsertTag(tag, ST_SHOWFRAME); - if(deletedepth>=0) { - tag = swf_InsertTag(tag, ST_REMOVEOBJECT2); - swf_SetU16(tag, deletedepth); - deletedepth=-1; - } - rtag = rtag->next; - continue; - } - - if(swf_isDefiningTag(rtag) && (flags&FLAGS_WRITEDEFINES)) - { - msg(" [master] write tag %02x (%d bytes in body)", - rtag->id, rtag->len); - if(swf_GetDefineID(rtag) == spriteid && !config.isframe) - { - if(config.overlay) - { - tag = swf_InsertTag(tag, rtag->id); - swf_SetBlock(tag, rtag->data, rtag->len); - swf_SetDefineID(tag, replaceddefine); - } else { - /* don't write this tag */ - msg(" replacing tag %d ID %d with sprite", rtag->id ,spriteid); - } - - if(flags&FLAGS_WRITESPRITE) - { - msg(" writing sprite defines"); - tag = write_sprite_defines(tag, slave); - msg(" writing sprite"); - tag = write_sprite(tag, slave, spriteid, replaceddefine); - } - if(flags&FLAGS_WRITESLAVE) - { - msg(" writing slave"); - outputslave = 1; - } - } else { - tag = swf_InsertTag(tag, rtag->id); - swf_SetBlock(tag, rtag->data, rtag->len); - } - } - if(frame == slaveframe) /* only happens with config.isframe: put slave at specific frame */ - { - if(flags&FLAGS_WRITESLAVE) { - outputslave = 1; - slavewritten = 1; - } - if((flags&FLAGS_WRITESPRITE) && !slavewritten) - { - int id = get_free_id(masterbitmap); - int depth = 65535; - deletedepth = 65535; - if(config.clip) { - msg(" Can't combine --clip and --frame"); - } - - tag = write_sprite_defines(tag, slave); - tag = write_sprite(tag, slave, id, -1); - - tag = swf_InsertTag(tag, ST_PLACEOBJECT2); - swf_SetU8(tag, 2); //flags: id - swf_SetU16(tag, depth); - swf_SetU16(tag, id); - - slavewritten = 1; - } - } - if(!swf_isDefiningTag(rtag) && (flags&FLAGS_WRITENONDEFINES)) - { - int dontwrite = 0; - switch(rtag->id) { - case ST_PLACEOBJECT: - case ST_PLACEOBJECT2: - if(frame == slaveframe && !config.overlay) - dontwrite = 1; - case ST_REMOVEOBJECT: - /* place/removetags for the object we replaced - should be discarded, too, as the object to insert - isn't a sprite - */ - if(spriteid>=0 && swf_GetPlaceID(rtag) == spriteid && - !config.isframe && config.merge) - dontwrite = 1; - break; - case ST_REMOVEOBJECT2: - break; - } - if(!dontwrite) { - msg(" [master] write tag %02x (%d bytes in body)", - rtag->id, rtag->len); - tag = swf_InsertTag(tag, rtag->id); - write_changepos(tag, rtag, config.mastermovex, config.mastermovey, config.masterscalex, config.masterscaley, 1); - - } - } - rtag = rtag->next; - } - - if(outputslave) - while(stag && stag->id!=ST_END) - { - if(tag_ok_for_slave(stag->id)) { - msg(" [slave] write tag %02x (%d bytes in body), %.2f %.2f", rtag->id, rtag->len, config.movex /20.0, config.movey /20.0); - tag = swf_InsertTag(tag, stag->id); - write_changepos(tag, stag, config.movex, config.movey, config.scalex, config.scaley, 0); - } - stag = stag->next; - } - if(!slavewritten && config.isframe && (flags&(FLAGS_WRITESLAVE|FLAGS_WRITESPRITE))) - { - if(slaveframe>=0) - msg(" Frame %d doesn't exist in file. No substitution will occur", - slaveframe); - else - msg(" Frame \"%s\" doesn't exist in file. No substitution will occur", - slavename); - } - tag = swf_InsertTag(tag, ST_END); - return tag; -} - -void adjustheader(SWF*swf) -{ - if(config.framerate) - swf->frameRate = config.framerate; - if(config.hassizex) { - swf->movieSize.xmax = - swf->movieSize.xmin + config.sizex; - } - if(config.hassizey) { - swf->movieSize.ymax = - swf->movieSize.ymin + config.sizey; - } - if(config.flashversion) - swf->fileVersion = config.flashversion; -} - -void catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf) -{ - char* depths; - int t; - TAG*tag; - TAG*mtag,*stag; - if(config.isframe) { - msg(" Can't combine --cat and --frame"); - exit(1); - } - if(config.flashversion) - master->fileVersion = config.flashversion; - - tag = master->firstTag; - while(tag) - { - if(swf_isDefiningTag(tag)) { - int defineid = swf_GetDefineID(tag); - msg(" tagid %02x defines object %d", tag->id, defineid); - masterbitmap[defineid] = 1; - } - tag = tag->next; - } - - swf_Relocate(slave, masterbitmap); - jpeg_assert(master, slave); - - memcpy(newswf, master, sizeof(SWF)); - adjustheader(newswf); - - tag = newswf->firstTag = swf_InsertTag(0, ST_REFLEX); // to be removed later - - depths = malloc(65536); - if(!depths) { - msg(" Couldn't allocate %d bytes of memory", 65536); - return; - } - memset(depths, 0, 65536); - mtag = master->firstTag; - while(mtag && mtag->id!=ST_END) - { - int num=1; - U16 depth; - msg(" [master] write tag %02x (%d bytes in body)", - mtag->id, mtag->len); - switch(mtag->id) { - case ST_PLACEOBJECT2: - num++; - case ST_PLACEOBJECT: { - depth = swf_GetDepth(mtag); - depths[depth] = 1; - } - break; - case ST_REMOVEOBJECT: { - depth = swf_GetDepth(mtag); - depths[depth] = 0; - } - break; - case ST_REMOVEOBJECT2: { - depth = swf_GetDepth(mtag); - depths[depth] = 0; - } - break; - } - tag = swf_InsertTag(tag, mtag->id); - swf_SetBlock(tag, mtag->data, mtag->len); - - mtag = mtag->next; - } - - for(t=0;t<65536;t++) - if(depths[t]) - { - char data[16]; - int len; - tag = swf_InsertTag(tag, ST_REMOVEOBJECT2); - swf_SetU16(tag, t); - } - free(depths); - - stag = slave->firstTag; - while(stag && stag->id!=ST_END) - { - msg(" [slave] write tag %02x (%d bytes in body)", - stag->id, stag->len); - tag = swf_InsertTag(tag, stag->id); - swf_SetBlock(tag, stag->data, stag->len); - stag = stag->next; - } - tag = swf_InsertTag(tag, ST_END); - - swf_DeleteTag(newswf, tag); -} - -void normalcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf) -{ - int spriteid = -1; - int replaceddefine = -1; - int frame = 0; - char*framelabel; - TAG * tag = master->firstTag; - - memset(depthbitmap, 0, sizeof(depthbitmap)); - - // set the idtab - while(tag) - { - int depth = swf_GetDepth(tag); - if(depth>=0) { - depthbitmap[depth] = 1; - } - if(swf_isDefiningTag(tag)) { - int defineid = swf_GetDefineID(tag); - msg(" tagid %02x defines object %d", tag->id, defineid); - masterbitmap[defineid] = 1; - - if (!slavename && defineid==slaveid) { - if(defineid>=0) { - spriteid = defineid; - msg(" Slave file attached to object %d.", defineid); - } - } - } else if(tag->id == ST_EXPORTASSETS) { - int t; - int num = swf_GetU16(tag); - for(t=0;t Slave file attached to object %d exported as %s.", id, name); - } - } - } else if(tag->id == ST_SYMBOLCLASS) { - /* a symbolclass tag is like a define tag: it defines id 0000 */ - int num = swf_GetU16(tag); - int t; - for(t=0;tid == ST_PLACEOBJECT2) { - char * name = swf_GetName(tag); - int id = swf_GetPlaceID(tag); - - { - SWFPLACEOBJECT obj; - swf_GetPlaceObject(tag, &obj); - swf_PlaceObjectFree(&obj); - if(obj.clipdepth) { - depthbitmap[obj.clipdepth] = 1; - } - } - - if(name) - msg(" tagid %02x places object %d named \"%s\"", tag->id, id, name); - else - msg(" tagid %02x places object %d (no name)", tag->id, id); - - if (name && slavename && !strcmp(name,slavename)) { - if(id>=0) { - spriteid = id; - msg(" Slave file attached to named object %s (%d).", name, id); - } - } - } else if(tag->id == ST_SHOWFRAME) { - if(slaveframe>=0 && frame==slaveframe) { - msg(" Slave file attached to frame %d.", frame); - } - frame++; - } else if(tag->id == ST_FRAMELABEL) { - char * name = tag->data; - if(name && slavename && config.isframe && !strcmp(name, slavename)) { - slaveframe = frame; - msg(" Slave file attached to frame %d (%s).", frame, name); - } - } - tag = tag->next; - }; - - if (spriteid<0 && !config.isframe) { - if(slavename) { - if(strcmp(slavename,"!!dummy!!")) { - msg(" Didn't find anything named %s in file. No substitutions will occur.", slavename); - if(!strcmp(slavename, "swf")) { - msg(" (If you were trying to combine rfxview with a document, try replacing 'swf' with 'viewport'."); - } - } - } - else - msg(" Didn't find id %d in file. No substitutions will occur.", slaveid); - spriteid = get_free_id(masterbitmap); - } - - swf_Relocate (slave, masterbitmap); - - if(config.merge) - swf_RelocateDepth (slave, depthbitmap); - jpeg_assert(slave, master); - - if (config.overlay) - replaceddefine = get_free_id(masterbitmap); - - // write file - - memcpy(newswf, master, sizeof(SWF)); - adjustheader(newswf); - - newswf->firstTag = tag = swf_InsertTag(0, ST_REFLEX); // to be removed later - - if (config.antistream) { - if (config.merge) { - msg(" Can't combine --antistream and --merge"); - } - tag = write_sprite_defines(tag, slave); - tag = write_sprite(tag, slave, spriteid, replaceddefine); - tag = write_master(tag, master, slave, spriteid, replaceddefine, FLAGS_WRITEDEFINES); - tag = write_master(tag, master, slave, spriteid, replaceddefine, FLAGS_WRITENONDEFINES); - } else { - if (config.merge) - tag = write_master(tag, master, slave, spriteid, replaceddefine, - FLAGS_WRITEDEFINES|FLAGS_WRITENONDEFINES| FLAGS_WRITESLAVE ); - else - tag = write_master(tag, master, slave, spriteid, replaceddefine, - FLAGS_WRITEDEFINES|FLAGS_WRITENONDEFINES| FLAGS_WRITESPRITE ); - } - - swf_DeleteTag(newswf, newswf->firstTag); -} - -void combine(SWF*master, char*slave_name, SWF*slave, SWF*newswf) -{ - slavename = slave_name; - slaveid = -1; - slaveframe = -1; - - if(!master->fileVersion && slave) - master->fileVersion = slave->fileVersion; - - master->fileAttributes |= slave->fileAttributes; - - swf_FoldAll(master); - swf_FoldAll(slave); - - if(slavename[0] == '#') - { - slaveid = atoi(&slavename[1]); - slavename = 0; - } - - if(config.isframe) - { - if(slavename && slavename[0]!='#') { - int tmp; - int len; - sscanf(slavename, "%d%n", &tmp, &len); - if(len == strlen(slavename)) { - /* if the name the slave should replace - consists only of digits and the -f - option is given, it probably is not - a frame name but a frame number. - */ - slaveid = tmp; - slavename = 0; - } - } - - if(slaveid>=0) { - slaveframe = slaveid; - slaveid = -1; - } else { - /* if id wasn't given as either #number or number, - the name is a frame label. BTW: The user wouldn't necessarily have - needed to supply the -f option in this case */ - } - } - - msg(" move x (%d)", config.movex); - msg(" move y (%d)", config.movey); - msg(" scale x (%f)", config.scalex); - msg(" scale y (%f)", config.scaley); - msg(" master move x (%d)", config.mastermovex); - msg(" master move y (%d)", config.mastermovey); - msg(" master scale x (%f)", config.masterscalex); - msg(" master scale y (%f)", config.masterscaley); - msg(" is frame (%d)", config.isframe); - - memset(masterbitmap, 0, sizeof(masterbitmap)); - - if(config.cat) - return catcombine(master, slave_name, slave, newswf); - else - return normalcombine(master, slave_name, slave, newswf); -} - -int main(int argn, char *argv[]) -{ - int fi; - SWF master; - SWF slave; - SWF newswf; - int t; - - config.overlay = 0; - config.antistream = 0; - config.alloctest = 0; - config.cat = 0; - config.merge = 0; - config.clip = 0; - config.loglevel = 2; - config.movex = 0; - config.movey = 0; - config.scalex = 1.0; - config.scaley = 1.0; - config.sizex = 0; - config.sizey = 0; - config.masterscalex = 1.0; - config.masterscaley = 1.0; - config.mastermovex = 0; - config.mastermovey = 0; - config.hassizex = 0; - config.hassizey = 0; - config.framerate = 0; - config.stack = 0; - config.stack1 = 0; - config.dummy = 0; - config.zlib = 0; - - processargs(argn, argv); - initLog(0,-1,0,0,-1,config.loglevel); - - if(config.merge && config.cat) { - msg(" Can't combine --cat and --merge"); - exit(1); - } - - if(config.stack && config.cat) { - msg(" Can't combine --cat and --stack"); - exit(1); - } - - if(config.stack) { - if(config.overlay) { - msg(" Can't combine -l and -t"); - exit(1); - } - if(config.clip) { - msg(" Can't combine -c and -t"); - exit(1); - } - msg(" (stacking) %d files found\n", numslaves); - - makestackmaster(&master); - } - else { - int ret; - msg(" master entity %s (named \"%s\")\n", master_filename, master_name); - fi = open(master_filename, O_RDONLY|O_BINARY); - if(fi<0) { - msg(" Failed to open %s\n", master_filename); - exit(1); - } - ret = swf_ReadSWF(fi, &master); - if(ret<0) { - msg(" Failed to read from %s\n", master_filename); - exit(1); - } - swf_RemoveJPEGTables(&master); - removeCommonTags(&master); - msg(" Read %d bytes from masterfile\n", ret); - close(fi); - } - - for(t=0;t slave entity(%d) %s (%s \"%s\")\n", t+1, slave_filename[t], - slave_isframe[t]?"frame":"object", slave_name[t]); - } - - if(config.dummy) - { - if(numslaves) - { - msg(" --dummy (-d) implies there are zero slave objects. You supplied %d.", numslaves); - exit(1); - } - numslaves = 1; - slave_filename[0] = "!!dummy!!"; - slave_name[0] = "!!dummy!!"; - slave_isframe[0] = 0; - } - - if (config.alloctest) - { - char*bitmap = malloc(sizeof(char)*65536); - memset(bitmap, 0, 65536*sizeof(char)); - memset(bitmap, 1, 101*sizeof(char)); - swf_Relocate(&master, bitmap); - newswf = master; - free(bitmap); -// makestackmaster(&newswf); - } - else - { - if (!numslaves) - { - if(config.cat) - msg(" You must have at least two objects."); - else - msg(" You must have at least one slave entity."); - return 0; - } - for(t = 0; t < numslaves; t++) - { - config.movex = slave_movex[t]; - config.movey = slave_movey[t]; - config.scalex = slave_scalex[t]; - config.scaley = slave_scaley[t]; - config.isframe = slave_isframe[t]; - - msg(" Combine [%s]%s and [%s]%s", master_name, master_filename, - slave_name[t], slave_filename[t]); - if(!config.dummy) - { - int ret; - fi = open(slave_filename[t], O_RDONLY|O_BINARY); - if(fi<0) { - msg(" Failed to open %s\n", slave_filename[t]); - exit(1); - } - ret = swf_ReadSWF(fi, &slave); - if(ret<0) { - msg(" Failed to read from %s\n", slave_filename[t]); - exit(1); - } - msg(" Read %d bytes from slavefile\n", ret); - close(fi); - swf_RemoveJPEGTables(&slave); - removeCommonTags(&slave); - } - else - { - memset(&slave, 0, sizeof(slave)); - slave.firstTag = swf_InsertTag(0, ST_END); - slave.frameRate = 0; - slave.fileVersion = 0; - slave.frameCount = 0; - } - - combine(&master, slave_name[t], &slave, &newswf); - master = newswf; - } - if(config.dummy && !config.hassizex && !config.hassizey && !config.mastermovex && !config.mastermovey) { - newswf.movieSize.xmin = newswf.movieSize.xmin*config.masterscalex; - newswf.movieSize.ymin = newswf.movieSize.ymin*config.masterscaley; - newswf.movieSize.xmax = newswf.movieSize.xmax*config.masterscalex; - newswf.movieSize.ymax = newswf.movieSize.ymax*config.masterscaley; - } - } - - if(!newswf.fileVersion) - newswf.fileVersion = 4; - - if(config.local_with_filesystem) - newswf.fileAttributes &= ~FILEATTRIBUTE_USENETWORK; - if(config.local_with_networking) - newswf.fileAttributes |= FILEATTRIBUTE_USENETWORK; - if(config.accelerated_blit) - newswf.fileAttributes |= FILEATTRIBUTE_USEACCELERATEDBLIT; - if(config.hardware_gpu) - newswf.fileAttributes |= FILEATTRIBUTE_USEHARDWAREGPU; - - fi = open(outputname, O_BINARY|O_RDWR|O_TRUNC|O_CREAT, 0777); - - if(config.zlib) { - if(newswf.fileVersion < 6) - newswf.fileVersion = 6; - newswf.compressed = 1; - swf_WriteSWF(fi, &newswf); - } else { - newswf.compressed = -1; // don't compress - swf_WriteSWF(fi, &newswf); - } - close(fi); - - return 0; //ok -} - diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfdump b/fluidbook/tools/swftools-special-swfdump/src/swfdump deleted file mode 100644 index 71a51ed9ce2a68d64b3adbb16d029e6eb4861ca8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 816122 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

xmo2}yGXLB1+WcqB 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 lIHL0=l`bp##=ru?MdRg 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 ia4d)G+xH#q&3=5I?dFK8 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 T2lBY)Wmr=B{RdXz{n`Hqm;ww4 diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfdump.1 b/fluidbook/tools/swftools-special-swfdump/src/swfdump.1 deleted file mode 100644 index 0bde677c0..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfdump.1 +++ /dev/null @@ -1,72 +0,0 @@ -.TH swfdump "1" "April 2009" "swfdump" "swftools" -.SH NAME -swfdump - Display an SWF file's content. - -.SH Synopsis -.B swfdump [-atpdu] file.swf - -.SH DESCRIPTION -A tool for displaying information about flash files -.PP -swfdump shows ids, names and depths of objects defined in the SWF file. -It can furthermore also disassemble Actionscript, extract texts, and -display placement information about objects. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR - Print short help message and exit -.TP -\fB\-D\fR, \fB\-\-full\fR - Show everything. Same as -atp -.TP -\fB\-V\fR, \fB\-\-version\fR - Print version info and exit -.TP -\fB\-e\fR, \fB\-\-html\fR - Print out html code for embedding the file -.TP -\fB\-E\fR, \fB\-\-xhtml\fR - Print out xhtml code for embedding the file -.TP -\fB\-a\fR, \fB\-\-action\fR - Disassemble action tags -.TP -\fB\-t\fR, \fB\-\-text\fR - Show text fields (like swfstrings). -.TP -\fB\-s\fR, \fB\-\-shapes\fR - Show shape coordinates/styles -.TP -\fB\-F\fR, \fB\-\-fonts\fR - Show font information -.TP -\fB\-p\fR, \fB\-\-placements\fR - Show placement information -.TP -\fB\-B\fR, \fB\-\-buttons\fR - Show button information -.TP -\fB\-b\fR, \fB\-\-bbox\fR - Print tag's bounding boxes -.TP -\fB\-X\fR, \fB\-\-width\fR - Print out the horizontal dimension of the movie, in a string of the form "-X width" -.TP -\fB\-Y\fR, \fB\-\-height\fR - Print out the vertical dimension of the movie, in a string of the form "-Y height" -.TP -\fB\-r\fR, \fB\-\-rate\fR - Print out the frame rate of the movie, in a string of the form "-r rate". -.TP -\fB\-f\fR, \fB\-\-frames\fR - Print out the number of frames in the movie, in a string of the form "-f frames" -.TP -\fB\-d\fR, \fB\-\-hex\fR - Print hex output of tag data, too. -.TP -\fB\-u\fR, \fB\-\-used\fR - Show referred IDs for each Tag. -.SH AUTHOR - -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfdump.c b/fluidbook/tools/swftools-special-swfdump/src/swfdump.c deleted file mode 100644 index f0006609c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfdump.c +++ /dev/null @@ -1,1621 +0,0 @@ -/* swfdump.c - Shows the structure of a swf file - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include "../config.h" - -#ifdef HAVE_SYS_STAT_H -#include -#else -#undef HAVE_STAT -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#else -#undef HAVE_STAT -#endif - -#include -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" - -static char * filename = 0; - -/* idtab stores the ids which are defined in the file. This allows us - to detect errors in the file. (i.e. ids which are defined more than - once */ -static char idtab[65536]; -static char * indent = " "; - -static int placements = 0; -static int action = 0; -static int html = 0; -static int xhtml = 0; -static int xy = 0; -static int showtext = 0; -static int showshapes = 0; -static int hex = 0; -static int used = 0; -static int bbox = 0; -static int cumulative = 0; -static int showfonts = 0; -static int showbuttons = 0; - -static struct options_t options[] = { -{"h", "help"}, -{"D", "full"}, -{"V", "version"}, -{"e", "html"}, -{"E", "xhtml"}, -{"a", "action"}, -{"t", "text"}, -{"s", "shapes"}, -{"F", "fonts"}, -{"p", "placements"}, -{"B", "buttons"}, -{"b", "bbox"}, -{"X", "width"}, -{"Y", "height"}, -{"r", "rate"}, -{"f", "frames"}, -{"d", "hex"}, -{"u", "used"}, -{0,0} -}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("swfdump - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else if(name[0]=='a') { - action = 1; - return 0; - } - else if(name[0]=='p') { - placements = 1; - return 0; - } - else if(name[0]=='t') { - showtext = 1; - return 0; - } - else if(name[0]=='s') { - showshapes = 1; - return 0; - } - else if(name[0]=='e') { - html = 1; - return 0; - } - else if(name[0]=='c') { - cumulative = 1; - return 0; - } - else if(name[0]=='E') { - html = 1; - xhtml = 1; - return 0; - } - else if(name[0]=='X') { - xy |= 1; - return 0; - } - else if(name[0]=='Y') { - xy |= 2; - return 0; - } - else if(name[0]=='r') { - xy |= 4; - return 0; - } - else if(name[0]=='f') { - xy |= 8; - return 0; - } - else if(name[0]=='F') { - showfonts = 1; - return 0; - } - else if(name[0]=='d') { - hex = 1; - return 0; - } - else if(name[0]=='u') { - used = 1; - return 0; - } - else if(name[0]=='b') { - bbox = 1; - return 0; - } - else if(name[0]=='B') { - showbuttons = 1; - return 0; - } - else if(name[0]=='D') { - showbuttons = action = placements = showtext = showshapes = 1; - return 0; - } - else { - printf("Unknown option: -%s\n", name); - exit(1); - } - - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-atpdu] file.swf\n", name); - printf("\n"); - printf("-h , --help Print short help message and exit\n"); - printf("-D , --full Show everything. Same as -atp\n"); - printf("-V , --version Print version info and exit\n"); - printf("-e , --html Print out html code for embedding the file\n"); - printf("-E , --xhtml Print out xhtml code for embedding the file\n"); - printf("-a , --action Disassemble action tags\n"); - printf("-t , --text Show text fields (like swfstrings).\n"); - printf("-s , --shapes Show shape coordinates/styles\n"); - printf("-F , --fonts Show font information\n"); - printf("-p , --placements Show placement information\n"); - printf("-B , --buttons Show button information\n"); - printf("-b , --bbox Print tag's bounding boxes\n"); - printf("-X , --width Prints out a string of the form \"-X width\".\n"); - printf("-Y , --height Prints out a string of the form \"-Y height\".\n"); - printf("-r , --rate Prints out a string of the form \"-r rate\".\n"); - printf("-f , --frames Prints out a string of the form \"-f framenum\".\n"); - printf("-d , --hex Print hex output of tag data, too.\n"); - printf("-u , --used Show referred IDs for each Tag.\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", - filename, name); - } - filename = name; - return 0; -} - -char* what; -char* testfunc(char*str) -{ - printf("%s: %s\n", what, str); - return 0; -} - -void dumpButton2Actions(TAG*tag, char*prefix) -{ - U32 oldTagPos; - U32 offsetpos; - U32 condition; - - oldTagPos = swf_GetTagPos(tag); - - // scan DefineButton2 Record - - swf_GetU16(tag); // Character ID - swf_GetU8(tag); // Flags; - - offsetpos = swf_GetTagPos(tag); // first offset - swf_GetU16(tag); - - while (swf_GetU8(tag)) // state -> parse ButtonRecord - { swf_GetU16(tag); // id - swf_GetU16(tag); // layer - swf_GetMatrix(tag,NULL); // matrix - swf_GetCXForm(tag,NULL,1); // cxform - } - - while(offsetpos) - { U8 a; - ActionTAG*actions; - - if(tag->pos >= tag->len) - break; - - offsetpos = swf_GetU16(tag); - condition = swf_GetU16(tag); // condition - - actions = swf_ActionGet(tag); - printf("%s condition %04x\n", prefix, condition); - swf_DumpActions(actions, prefix); - } - - swf_SetTagPos(tag,oldTagPos); - return; -} - -void dumpButtonActions(TAG*tag, char*prefix) -{ - ActionTAG*actions; - swf_SetTagPos(tag, 0); - swf_GetU16(tag); // id - while (swf_GetU8(tag)) // state -> parse ButtonRecord - { swf_GetU16(tag); // id - swf_GetU16(tag); // layer - swf_GetMatrix(tag,NULL); // matrix - } - actions = swf_ActionGet(tag); - swf_DumpActions(actions, prefix); - swf_ActionFree(actions); -} - -void dumpButton(TAG*tag, char*prefix) -{ - swf_SetTagPos(tag, 0); - swf_GetU16(tag); // id - while (1) { - U8 flags = swf_GetU8(tag); - if(!flags) - break; - U16 id = swf_GetU16(tag); - U16 depth = swf_GetU16(tag); - char event[80]; - sprintf(event, "%s%s%s%s", - (flags&BS_HIT)?"[hit]":"", - (flags&BS_DOWN)?"[down]":"", - (flags&BS_OVER)?"[over]":"", - (flags&BS_UP)?"[up]":""); - if(flags&0xf0) { - printf("%s | Show %d at depth %d for %s flags=%02x\n", prefix, id, depth, event, flags); - } else { - printf("%s | Show %d at depth %d for %s\n", prefix, id, depth, event); - } - swf_GetMatrix(tag,NULL); // matrix - } -} - -void dumpFont(TAG*tag, char*prefix) -{ - SWFFONT* font = malloc(sizeof(SWFFONT)); - memset(font, 0, sizeof(SWFFONT)); - if(tag->id == ST_DEFINEFONT2 || tag->id == ST_DEFINEFONT3) { - swf_FontExtract_DefineFont2(0, font, tag); - } else if(tag->id == ST_DEFINEFONT) { - swf_FontExtract_DefineFont(0, font, tag); - } else { - printf("%sCan't parse %s yet\n", prefix,swf_TagGetName(tag)); - } - printf("%sID: %d\n", prefix,font->id); - printf("%sVersion: %d\n", prefix,font->version); - printf("%sname: %s\n", prefix,font->name); - printf("%scharacters: %d\n", prefix,font->numchars); - printf("%shightest mapped unicode value: %d\n", prefix,font->maxascii); - if(font->layout) - { - printf("%sascent:%.2f\n", prefix,font->layout->ascent / 20.0); - printf("%sdescent:%.2f\n", prefix,font->layout->descent / 20.0); - printf("%sleading:%.2f\n", prefix,font->layout->leading / 20.0); - printf("%skerning records:%d\n", prefix,font->layout->kerningcount); - } - printf("%sstyle: %d\n", prefix,font->style); - printf("%sencoding: %02x\n", prefix,font->encoding); - printf("%slanguage: %02x\n", prefix,font->language); - int t; - for(t=0;tnumchars;t++) { - int u = font->glyph2ascii?font->glyph2ascii[t]:-1; - char ustr[16]; - if(u>=32) sprintf(ustr, " '%c'", u); - else sprintf(ustr, " 0x%02x", u); - printf("%s== Glyph %d: advance=%d encoding=%d%s ==\n", prefix, t, font->glyph[t].advance, u, ustr); - SHAPE2* shape = swf_ShapeToShape2(font->glyph[t].shape); - SHAPELINE*line = shape->lines; - - while(line) { - if(line->type == moveTo) { - printf("%smoveTo %.2f %.2f\n", prefix, line->x/20.0, line->y/20.0); - } else if(line->type == lineTo) { - printf("%slineTo %.2f %.2f\n", prefix, line->x/20.0, line->y/20.0); - } else if(line->type == splineTo) { - printf("%ssplineTo (%.2f %.2f) %.2f %.2f\n", prefix, - line->sx/20.0, line->sy/20.0, - line->x/20.0, line->y/20.0 - ); - } - line = line->next; - } - swf_Shape2Free(shape); - free(shape); - } - - /* - not part of the file - - printf("%sencoding table:", prefix, prefix); - char filled0=0, lastfilled=0; - for(t=0;tmaxascii;t++) { - if((t&15)==0) { - printf("\n%s%08x ", prefix, t); - int s; - if(!filled0 && t) { - for(s=t;smaxascii;s++) { - if(font->ascii2glyph[s]>=0) break; - } - if(s>t+32) { - printf("*"); - t = ((s-16)&~15)-1; - continue; - } - } - filled0 = 0; - for(s=t;smaxascii;s++) { - if(font->ascii2glyph[s]>=0) filled0=1; - } - } - printf("%4d ", font->ascii2glyph[t]); - } - printf("\n");*/ - - swf_FontFree(font); -} - -static SWF swf; -static int fontnum = 0; -static SWFFONT**fonts; - -void textcallback(void*self, int*glyphs, int*xpos, int nr, int fontid, int fontsize, int startx, int starty, RGBA*color) -{ - int font=-1,t; - if(nr<1) - return; - printf(" <%2d glyphs in font %04d size %d, color #%02x%02x%02x%02x at %.2f,%.2f> ",nr, fontid, fontsize, color->r, color->g, color->b, color->a, (startx+xpos[0])/20.0, starty/20.0); - for(t=0;tid == fontid) { - font = t; - break; - } - } - - for(t=0;t=0) { - if(glyphs[t] >= fonts[font]->numchars /*glyph is in range*/ - || !fonts[font]->glyph2ascii /* font has ascii<->glyph mapping */ - ) a = glyphs[t]; - else { - if(fonts[font]->glyph2ascii[glyphs[t]]) - a = fonts[font]->glyph2ascii[glyphs[t]]; - else - a = glyphs[t]; - } - } else { - a = glyphs[t]; - } - - printf("\\x%02x", fonts[font]->glyph2ascii[glyphs[t]]); - } - printf("\n"); -} - -void handleText(TAG*tag, char*prefix) -{ - printf("\n"); - if(placements) { - swf_SetTagPos(tag, 0); - swf_GetU16(tag); - swf_GetRect(tag, 0); - swf_ResetReadBits(tag); - MATRIX m; - swf_GetMatrix(tag, &m); - printf("%s| Matrix\n",prefix); - printf("%s| %5.3f %5.3f %6.2f\n", prefix, m.sx/65536.0, m.r1/65536.0, m.tx/20.0); - printf("%s| %5.3f %5.3f %6.2f\n", prefix, m.r0/65536.0, m.sy/65536.0, m.ty/20.0); - swf_SetTagPos(tag, 0); - } - if(showtext) { - swf_ParseDefineText(tag,textcallback, 0); - } -} - -void handleDefineSound(TAG*tag) -{ - U16 id = swf_GetU16(tag); - U8 flags = swf_GetU8(tag); - int compression = (flags>>4)&7; - int rate = (flags>>2)&3; - int bits = flags&2?16:8; - int stereo = flags&1; - printf(" ("); - if(compression == 0) printf("Raw "); - else if(compression == 1) printf("ADPCM "); - else if(compression == 2) printf("MP3 "); - else if(compression == 3) printf("Raw little-endian "); - else if(compression == 6) printf("ASAO "); - else printf("? "); - if(rate == 0) printf("5.5Khz "); - if(rate == 1) printf("11Khz "); - if(rate == 2) printf("22Khz "); - if(rate == 3) printf("44Khz "); - printf("%dBit ", bits); - if(stereo) printf("stereo"); - else printf("mono"); - printf(")"); -} - -void handleDefineBits(TAG*tag) -{ - U16 id; - U8 mode; - U16 width,height; - int bpp; - id = swf_GetU16(tag); - mode = swf_GetU8(tag); - width = swf_GetU16(tag); - height = swf_GetU16(tag); - printf(" image %dx%d",width,height); - if(mode == 3) printf(" (8 bpp)"); - else if(mode == 4) printf(" (16 bpp)"); - else if(mode == 5) printf(" (32 bpp)"); - else printf(" (? bpp)"); -} - -void handleEditText(TAG*tag) -{ - U16 id ; - U16 flags; - int t; - id = swf_GetU16(tag); - swf_GetRect(tag,0); - - //swf_ResetReadBits(tag); - - if (tag->readBit) - { tag->pos++; - tag->readBit = 0; - } - flags = swf_GetBits(tag,16); - if(flags & ET_HASFONT) { - swf_GetU16(tag); //font - swf_GetU16(tag); //fontheight - } - if(flags & ET_HASTEXTCOLOR) { - swf_GetU8(tag); //rgba - swf_GetU8(tag); - swf_GetU8(tag); - swf_GetU8(tag); - } - if(flags & ET_HASMAXLENGTH) { - swf_GetU16(tag); //maxlength - } - if(flags & ET_HASLAYOUT) { - swf_GetU8(tag); //align - swf_GetU16(tag); //left margin - swf_GetU16(tag); //right margin - swf_GetU16(tag); //indent - swf_GetU16(tag); //leading - } - printf(" variable \"%s\" ", &tag->data[tag->pos]); - if(flags & ET_HTML) printf("(html)"); - if(flags & ET_NOSELECT) printf("(noselect)"); - if(flags & ET_PASSWORD) printf("(password)"); - if(flags & ET_READONLY) printf("(readonly)"); - - if(flags & (ET_X1 | ET_X3 )) - { - printf(" undefined flags: %08x (%08x)", (flags&(ET_X1|ET_X3)), flags); - } - - while(tag->data[tag->pos++]); - if(flags & ET_HASTEXT) - // printf(" text \"%s\"\n", &tag->data[tag->pos]) //TODO - ; -} -void printhandlerflags(U32 handlerflags) -{ - if(handlerflags&1) printf("[on load]"); - if(handlerflags&2) printf("[enter frame]"); - if(handlerflags&4) printf("[unload]"); - if(handlerflags&8) printf("[mouse move]"); - if(handlerflags&16) printf("[mouse down]"); - if(handlerflags&32) printf("[mouse up]"); - if(handlerflags&64) printf("[key down]"); - if(handlerflags&128) printf("[key up]"); - - if(handlerflags&256) printf("[data]"); - if(handlerflags&512) printf("[initialize]"); - if(handlerflags&1024) printf("[mouse press]"); - if(handlerflags&2048) printf("[mouse release]"); - if(handlerflags&4096) printf("[mouse release outside]"); - if(handlerflags&8192) printf("[mouse rollover]"); - if(handlerflags&16384) printf("[mouse rollout]"); - if(handlerflags&32768) printf("[mouse drag over]"); - - if(handlerflags&0x10000) printf("[mouse drag out]"); - if(handlerflags&0x20000) printf("[key press]"); - if(handlerflags&0x40000) printf("[construct even]"); - if(handlerflags&0xfff80000) printf("[???]"); -} -void handleVideoStream(TAG*tag, char*prefix) -{ - U16 id = swf_GetU16(tag); - U16 frames = swf_GetU16(tag); - U16 width = swf_GetU16(tag); - U16 height = swf_GetU16(tag); - U8 flags = swf_GetU8(tag); //5-2(videopacket 01=off 10=on)-1(smoothing 1=on) - U8 codec = swf_GetU8(tag); - printf(" (%d frames, %dx%d", frames, width, height); - if(flags&1) - printf(" smoothed"); - if(codec == 2) - printf(" sorenson h.263)"); - else - printf(" codec 0x%02x)", codec); -} -void handleVideoFrame(TAG*tag, char*prefix) -{ - U32 code, version, reference, sizeflags; - U32 width=0, height=0; - U8 type; - U16 id = swf_GetU16(tag); - U16 frame = swf_GetU16(tag); - U8 deblock,flags, tmp, bit; - U32 quantizer; - char*types[] = {"I-frame", "P-frame", "disposable P-frame", ""}; - printf(" (frame %d) ", frame); - - /* video packet follows */ - code = swf_GetBits(tag, 17); - version = swf_GetBits(tag, 5); - reference = swf_GetBits(tag, 8); - - sizeflags = swf_GetBits(tag, 3); - switch(sizeflags) - { - case 0: width = swf_GetBits(tag, 8); height = swf_GetBits(tag, 8); break; - case 1: width = swf_GetBits(tag, 16); height = swf_GetBits(tag, 16); break; - case 2: width = 352; height = 288; break; - case 3: width = 176; height = 144; break; - case 4: width = 128; height = 96; break; - case 5: width = 320; height = 240; break; - case 6: width = 160; height = 120; break; - case 7: width = -1; height = -1;/*reserved*/ break; - } - printf("%dx%d ", width, height); - type = swf_GetBits(tag, 2); - printf("%s", types[type]); - - deblock = swf_GetBits(tag, 1); - if(deblock) - printf(" deblock %d ", deblock); - quantizer = swf_GetBits(tag, 5); - printf(" quant: %d ", quantizer); -} - -void dumpFilter(FILTER*filter) -{ - if(filter->type == FILTERTYPE_BLUR) { - FILTER_BLUR*f = (FILTER_BLUR*)filter; - printf("blurx: %f blury: %f\n", f->blurx, f->blury); - printf("passes: %d\n", f->passes); - } if(filter->type == FILTERTYPE_GLOW) { - FILTER_GLOW*f = (FILTER_GLOW*)filter; - printf("color %02x%02x%02x%02x\n", f->rgba.r,f->rgba.g,f->rgba.b,f->rgba.a); - printf("blurx: %f blury: %f strength: %f\n", f->blurx, f->blury, f->strength); - printf("passes: %d\n", f->passes); - printf("flags: %s%s%s\n", - f->knockout?"knockout ":"", - f->composite?"composite ":"", - f->innerglow?"innerglow":""); - } if(filter->type == FILTERTYPE_DROPSHADOW) { - FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)filter; - printf("blurx: %f blury: %f\n", f->blurx, f->blury); - printf("passes: %d\n", f->passes); - printf("angle: %f distance: %f\n", f->angle, f->distance); - printf("strength: %f passes: %d\n", f->strength, f->passes); - printf("flags: %s%s%s\n", - f->knockout?"knockout ":"", - f->composite?"composite ":"", - f->innershadow?"innershadow ":""); - } if(filter->type == FILTERTYPE_BEVEL) { - FILTER_BEVEL*f = (FILTER_BEVEL*)filter; - printf("blurx: %f blury: %f\n", f->blurx, f->blury); - printf("passes: %d\n", f->passes); - printf("angle: %f distance: %f\n", f->angle, f->distance); - printf("strength: %f passes: %d\n", f->strength, f->passes); - printf("flags: %s%s%s%s\n", - f->ontop?"ontop":"", - f->knockout?"knockout ":"", - f->composite?"composite ":"", - f->innershadow?"innershadow ":""); - } if(filter->type == FILTERTYPE_GRADIENTGLOW) { - FILTER_GRADIENTGLOW*f = (FILTER_GRADIENTGLOW*)filter; - swf_DumpGradient(stdout, f->gradient); - printf("blurx: %f blury: %f\n", f->blurx, f->blury); - printf("angle: %f distance: %f\n", f->angle, f->distance); - printf("strength: %f passes: %d\n", f->strength, f->passes); - printf("flags: %s%s%s%s\n", - f->knockout?"knockout ":"", - f->ontop?"ontop ":"", - f->composite?"composite ":"", - f->innershadow?"innershadow ":""); - } - rfx_free(filter); -} - -void handlePlaceObject23(TAG*tag, char*prefix) -{ - U8 flags,flags2=0; - MATRIX m; - CXFORM cx; - char pstr[3][256]; - int ppos[3] = {0,0,0}; - swf_SetTagPos(tag, 0); - flags = swf_GetU8(tag); - if(tag->id == ST_PLACEOBJECT3) - flags2 = swf_GetU8(tag); - swf_GetU16(tag); //depth - - //flags&1: move - if(flags&2) swf_GetU16(tag); //id - if(flags&4) { - swf_GetMatrix(tag,&m); - if(placements) { - ppos[0] += sprintf(pstr[0], "| Matrix "); - ppos[1] += sprintf(pstr[1], "| %5.3f %5.3f %6.2f ", m.sx/65536.0, m.r1/65536.0, m.tx/20.0); - ppos[2] += sprintf(pstr[2], "| %5.3f %5.3f %6.2f ", m.r0/65536.0, m.sy/65536.0, m.ty/20.0); - } - } - if(flags&8) { - swf_GetCXForm(tag, &cx, 1); - if(placements) { - ppos[0] += sprintf(pstr[0]+ppos[0], "| CXForm r g b a "); - ppos[1] += sprintf(pstr[1]+ppos[1], "| mul %4.1f %4.1f %4.1f %4.1f ", cx.r0/256.0, cx.g0/256.0, cx.b0/256.0, cx.a0/256.0); - ppos[2] += sprintf(pstr[2]+ppos[2], "| add %4d %4d %4d %4d ", cx.r1, cx.g1, cx.b1, cx.a1); - } - } - if(flags&16) { - U16 ratio = swf_GetU16(tag); //ratio - if(placements) { - ppos[0] += sprintf(pstr[0]+ppos[0], "| Ratio "); - ppos[1] += sprintf(pstr[1]+ppos[1], "| %-5d ", ratio); - ppos[2] += sprintf(pstr[2]+ppos[2], "| "); - } - } - if(flags&64) { - U16 clip = swf_GetU16(tag); //clip - if(placements) { - ppos[0] += sprintf(pstr[0]+ppos[0], "| Clip "); - ppos[1] += sprintf(pstr[1]+ppos[1], "| %-4d ", clip); - ppos[2] += sprintf(pstr[2]+ppos[2], "| "); - } - } - if(flags&32) { while(swf_GetU8(tag)); } - - if(flags2&1) { // filter list - U8 num = swf_GetU8(tag); - if(placements) - printf("\n%d filters\n", num); - char*filtername[] = {"dropshadow","blur","glow","bevel","gradientglow","convolution","colormatrix","gradientbevel"}; - int t; - for(t=0;ttype, (filter->typetype]:"?"); - dumpFilter(filter); - } - } - } - if(flags2&2) { // blend mode - U8 blendmode = swf_GetU8(tag); - if(placements) { - int t; - char name[80]; - sprintf(name, "%-5d", blendmode); - for(t=0;blendModeNames[t];t++) { - if(blendmode==t) { - sprintf(name, "%-5s", blendModeNames[t]); - break; - } - } - ppos[0] += sprintf(pstr[0]+ppos[0], "| Blend "); - ppos[1] += sprintf(pstr[1]+ppos[1], "| %s ", name); - ppos[2] += sprintf(pstr[2]+ppos[2], "| "); - } - } - - if(placements && ppos[0]) { - printf("\n"); - printf("%s %s\n", prefix, pstr[0]); - printf("%s %s\n", prefix, pstr[1]); - printf("%s %s", prefix, pstr[2]); - } - if(flags&128) { - if (action) { - U16 reserved; - U32 globalflags; - U32 handlerflags; - char is32 = 0; - printf("\n"); - reserved = swf_GetU16(tag); // must be 0 - globalflags = swf_GetU16(tag); //TODO: 32 if version>=6 - if(reserved) { - printf("Unknown parameter field not zero: %04x\n", reserved); - return; - } - printf("global flags: %04x\n", globalflags); - - handlerflags = swf_GetU16(tag); //TODO: 32 if version>=6 - if(!handlerflags) { - handlerflags = swf_GetU32(tag); - is32 = 1; - } - while(handlerflags) { - int length; - int t; - ActionTAG*a; - - globalflags &= ~handlerflags; - printf("%s flags %08x ",prefix, handlerflags); - printhandlerflags(handlerflags); - length = swf_GetU32(tag); - printf(", %d bytes actioncode\n",length); - a = swf_ActionGet(tag); - swf_DumpActions(a,prefix); - swf_ActionFree(a); - - handlerflags = is32?swf_GetU32(tag):swf_GetU16(tag); //TODO: 32 if version>=6 - } - if(globalflags) // should go to sterr. - printf("ERROR: unsatisfied handlerflags: %02x\n", globalflags); - } else { - printf(" has action code\n"); - } - } else printf("\n"); -} - -void handlePlaceObject(TAG*tag, char*prefix) -{ - TAG*tag2 = swf_InsertTag(0, ST_PLACEOBJECT2); - U16 id, depth; - MATRIX matrix; - CXFORM cxform; - - swf_SetTagPos(tag, 0); - id = swf_GetU16(tag); - depth = swf_GetU16(tag); - swf_GetMatrix(tag, &matrix); - swf_GetCXForm(tag, &cxform, 0); - - swf_SetU8(tag2, 14 /* char, matrix, cxform */); - swf_SetU16(tag2, depth); - swf_SetU16(tag2, id); - swf_SetMatrix(tag2, &matrix); - swf_SetCXForm(tag2, &cxform, 1); - - handlePlaceObject23(tag2, prefix); -} -char stylebuf[256]; -char* fillstyle2str(FILLSTYLE*style) -{ - switch(style->type) { - case 0x00: - sprintf(stylebuf, "SOLID %02x%02x%02x%02x", style->color.r, style->color.g, style->color.b, style->color.a); - break; - case 0x10: case 0x11: case 0x12: case 0x13: - sprintf(stylebuf, "GRADIENT (%d steps)", style->gradient.num); - break; - case 0x40: case 0x42: - /* TODO: display information about that bitmap */ - sprintf(stylebuf, "BITMAPt%s %d", (style->type&2)?"n":"", style->id_bitmap); - /* TODO: show matrix */ - //swf_DumpMatrix(stdout, &style->m); - break; - case 0x41: case 0x43: - /* TODO: display information about that bitmap */ - sprintf(stylebuf, "BITMAPc%s %d", (style->type&2)?"n":"", style->id_bitmap); - /* TODO: show matrix */ - //swf_DumpMatrix(stdout, &style->m); - break; - default: - sprintf(stylebuf, "UNKNOWN[%02x]",style->type); - } - return stylebuf; -} -char* linestyle2str(LINESTYLE*style) -{ - sprintf(stylebuf, "%.2f %02x%02x%02x%02x", style->width/20.0, style->color.r, style->color.g, style->color.b, style->color.a); - return stylebuf; -} - -void handleShape(TAG*tag, char*prefix) -{ - SHAPE2 shape; - SHAPELINE*line; - int t,max; - - tag->pos = 0; - tag->readBit = 0; - swf_ParseDefineShape(tag, &shape); - - max = shape.numlinestyles > shape.numfillstyles?shape.numlinestyles:shape.numfillstyles; - - if(max) printf("%s | fillstyles(%02d) linestyles(%02d)\n", - prefix, - shape.numfillstyles, - shape.numlinestyles - ); - else printf("%s | (Neither line nor fill styles)\n", prefix); - - for(t=0;tfillstyle0, - line->fillstyle1, - line->linestyle); - if(line->type == moveTo) { - printf("moveTo %.2f %.2f\n", line->x/20.0, line->y/20.0); - } else if(line->type == lineTo) { - printf("lineTo %.2f %.2f\n", line->x/20.0, line->y/20.0); - } else if(line->type == splineTo) { - printf("splineTo (%.2f %.2f) %.2f %.2f\n", - line->sx/20.0, line->sy/20.0, - line->x/20.0, line->y/20.0 - ); - } - line = line->next; - } - printf("%s |\n", prefix); -} - -void fontcallback1(void*self, U16 id,U8 * name) -{ fontnum++; -} - -void fontcallback2(void*self, U16 id,U8 * name) -{ - swf_FontExtract(&swf,id,&fonts[fontnum]); - fontnum++; -} - -static U8 printable(U8 a) -{ - if(a<32 || a==127) return '.'; - else return a; -} -void hexdumpTag(TAG*tag, char* prefix) -{ - int t; - char ascii[32]; - printf(" %s-=> ",prefix); - for(t=0;tlen;t++) { - printf("%02x ", tag->data[t]); - ascii[t&15] = printable(tag->data[t]); - if((t && ((t&15)==15)) || (t==tag->len-1)) - { - int s,p=((t)&15)+1; - ascii[p] = 0; - for(s=p-1;s<16;s++) { - printf(" "); - } - if(t==tag->len-1) - printf(" %s\n", ascii); - else - printf(" %s\n %s-=> ",ascii,prefix); - } - } -} - -void handleExportAssets(TAG*tag, char* prefix) -{ - int num; - U16 id; - char* name; - int t; - num = swf_GetU16(tag); - for(t=0;tpos < tag->len) { - int nr = swf_GetU8(tag); // should be 2 - int t; - if(nr>2) { - printf("*** unsupported multiboxes ***, "); - break; - } - for(t=0;tprev) swf.firstTag = swf.firstTag->prev; - SWFFONT* font = 0; - swf_FontExtract(&swf, id, &font); -#endif - swf_SetTagPos(tag, 3); - while(tag->pos < tag->len) { - printf("%sglyph %d) ", prefix, num); - int nr = swf_GetU8(tag); // should be 2 - int t; - for(t=0;t<2;t++) { - // pos - float v = swf_GetF16(tag); - printf("%f ", v*1024.0); - } - int s; - for(s=0;snumchars) { - SHAPE2* shape = swf_ShapeToShape2(font->glyph[num].shape); - SHAPELINE*line = shape->lines; - while(line) { - if(line->type == moveTo) { - printf("%smoveTo %.2f %.2f\n", prefix, line->x/20.0, line->y/20.0); - } else if(line->type == lineTo) { - printf("%slineTo %.2f %.2f\n", prefix, line->x/20.0, line->y/20.0); - } else if(line->type == splineTo) { - printf("%ssplineTo (%.2f %.2f) %.2f %.2f\n", prefix, - line->sx/20.0, line->sy/20.0, - line->x/20.0, line->y/20.0 - ); - } - line = line->next; - } - swf_Shape2Free(shape); - free(shape); - } - if(num==font->numchars-1) break; -#endif - num++; - } -} - - -void dumperror(const char* format, ...) -{ - char buf[1024]; - va_list arglist; - - va_start(arglist, format); - vsnprintf(buf, sizeof(buf)-1, format, arglist); - va_end(arglist); - - if(!html && !xy) - printf("==== Error: %s ====\n", buf); -} - -static char strbuf[800]; -static int bufpos=0; - -char* timestring(double f) -{ - int hours = (int)(f/3600); - int minutes = (int)((f-hours*3600)/60); - int seconds = (int)((f-hours*3600-minutes*60)); - int useconds = (int)((f-(int)f)*1000+0.5); - bufpos+=100; - bufpos%=800; - sprintf(&strbuf[bufpos], "%02d:%02d:%02d,%03d",hours,minutes,seconds,useconds); - return &strbuf[bufpos]; -} - -int main (int argc,char ** argv) -{ - TAG*tag; -#ifdef HAVE_STAT - struct stat statbuf; -#endif - int f; - int xsize,ysize; - char issprite = 0; // are we inside a sprite definition? - int spriteframe = 0; - int mainframe=0; - char* spriteframelabel = 0; - char* framelabel = 0; - char prefix[128]; - int filesize = 0; - int filepos = 0; - prefix[0] = 0; - memset(idtab,0,65536); - - processargs(argc, argv); - - if(!filename) - { - fprintf(stderr, "You must supply a filename.\n"); - return 1; - } - - f = open(filename,O_RDONLY|O_BINARY); - if (f<0) - { - char buffer[256]; - sprintf(buffer, "Couldn't open %.200s", filename); - perror(buffer); - exit(1); - } - char header[3]; - read(f, header, 3); - char compressed = (header[0]=='C'); - char isflash = (header[0]=='F' && header[1] == 'W' && header[2] == 'S') || - (header[0]=='C' && header[1] == 'W' && header[2] == 'S'); - close(f); - - int fl=strlen(filename); - if(!isflash && fl>3 && !strcmp(&filename[fl-4], ".abc")) { - swf_ReadABCfile(filename, &swf); - } else { - f = open(filename,O_RDONLY|O_BINARY); - if FAILED(swf_ReadSWF(f,&swf)) - { - fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); - close(f); - exit(1); - } - -#ifdef HAVE_STAT - fstat(f, &statbuf); - if(statbuf.st_size != swf.fileSize && !compressed) - dumperror("Real Filesize (%d) doesn't match header Filesize (%d)", - statbuf.st_size, swf.fileSize); - filesize = statbuf.st_size; -#endif - close(f); - } - - //if(action && swf.fileVersion>=9) { - // fprintf(stderr, "Actionscript parsing (-a) not yet supported for SWF versions>=9\n"); - // action = 0; - //} - - xsize = (swf.movieSize.xmax-swf.movieSize.xmin)/20; - ysize = (swf.movieSize.ymax-swf.movieSize.ymin)/20; - if(xy) - { - if(xy&1) - printf("-X %d", xsize); - - if((xy&1) && (xy&6)) - printf(" "); - - if(xy&2) - printf("-Y %d", ysize); - - if((xy&3) && (xy&4)) - printf(" "); - - if(xy&4) - printf("-r %.2f", swf.frameRate/256.0); - - if((xy&7) && (xy&8)) - printf(" "); - - if(xy&8) - printf("-f %d", swf.frameCount); - - printf("\n"); - return 0; - } - if(html) - { - char*fileversions[] = {"","1,0,0,0", "2,0,0,0","3,0,0,0","4,0,0,0", - "5,0,0,0","6,0,23,0","7,0,0,0","8,0,0,0","9,0,0,0","10,0,0,0", "11,0,0,0", "12,0,0,0"}; - if(swf.fileVersion>10) { - fprintf(stderr, "Fileversion>10\n"); - exit(1); - } - - if(xhtml) { - printf("\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n\n", filename, xsize, ysize, filename); - } else { - printf("\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - "\n", xsize, ysize, fileversions[swf.fileVersion], - filename, filename, xsize, ysize); - } - return 0; - } - printf("[HEADER] File version: %d\n", swf.fileVersion); - if(compressed) { - printf("[HEADER] File is zlib compressed."); - if(filesize && swf.fileSize) - printf(" Ratio: %02d%%\n", filesize*100/(swf.fileSize)); - else - printf("\n"); - } - printf("[HEADER] File size: %d%s\n", swf.fileSize, swf.compressed?" (Depacked)":""); - printf("[HEADER] Frame rate: %f\n",swf.frameRate/256.0); - printf("[HEADER] Frame count: %d\n",swf.frameCount); - printf("[HEADER] Movie width: %.2f",(swf.movieSize.xmax-swf.movieSize.xmin)/20.0); - if(swf.movieSize.xmin) - printf(" (left offset: %.2f)\n", swf.movieSize.xmin/20.0); - else - printf("\n"); - printf("[HEADER] Movie height: %.2f",(swf.movieSize.ymax-swf.movieSize.ymin)/20.0); - if(swf.movieSize.ymin) - printf(" (top offset: %.2f)\n", swf.movieSize.ymin/20.0); - else - printf("\n"); - - tag = swf.firstTag; - - if(showtext) { - fontnum = 0; - swf_FontEnumerate(&swf,&fontcallback1, 0); - fonts = (SWFFONT**)malloc(fontnum*sizeof(SWFFONT*)); - fontnum = 0; - swf_FontEnumerate(&swf,&fontcallback2, 0); - } - - while(tag) { - char*name = swf_TagGetName(tag); - char myprefix[128]; - if(!name) { - dumperror("Unknown tag:0x%03x", tag->id); - //tag = tag->next; - //continue; - } - if(!name) { - name = "UNKNOWN TAG"; - } - if(cumulative) { - filepos += tag->len; - printf("[%03x] %9d %9d %s%s", tag->id, tag->len, filepos, prefix, swf_TagGetName(tag)); - } else { - printf("[%03x] %9d %s%s", tag->id, tag->len, prefix, swf_TagGetName(tag)); - } - - if(tag->id == ST_PLACEOBJECT) { - printf(" places id %04d at depth %04x", swf_GetPlaceID(tag), swf_GetDepth(tag)); - if(swf_GetName(tag)) - printf(" name \"%s\"",swf_GetName(tag)); - } - else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) { - if(tag->data[0]&1) - printf(" moves"); - else - printf(" places"); - - if(tag->data[0]&2) - printf(" id %04d",swf_GetPlaceID(tag)); - else - printf(" object"); - - printf(" at depth %04d", swf_GetDepth(tag)); - - if(tag->id == ST_PLACEOBJECT3 && tag->data[1]&4) - printf(" as bitmap"); - - swf_SetTagPos(tag, 0); - if(tag->data[0]&64) { - SWFPLACEOBJECT po; - swf_GetPlaceObject(tag, &po); - printf(" (clip to %04d)", po.clipdepth); - swf_PlaceObjectFree(&po); - } - if(swf_GetName(tag)) - printf(" name \"%s\"",swf_GetName(tag)); - - } - else if(tag->id == ST_REMOVEOBJECT) { - printf(" removes id %04d from depth %04d", swf_GetPlaceID(tag), swf_GetDepth(tag)); - } - else if(tag->id == ST_REMOVEOBJECT2) { - printf(" removes object from depth %04d", swf_GetDepth(tag)); - } - else if(tag->id == ST_FREECHARACTER) { - printf(" frees object %04d", swf_GetPlaceID(tag)); - } - else if(tag->id == ST_FILEATTRIBUTES) { - swf_SetTagPos(tag, 0); - U32 flags = swf_GetU32(tag); - if(flags&FILEATTRIBUTE_USENETWORK) printf(" usenetwork"); - if(flags&FILEATTRIBUTE_AS3) printf(" as3"); - if(flags&FILEATTRIBUTE_SYMBOLCLASS) printf(" symbolclass"); - if(flags&FILEATTRIBUTE_USEHARDWAREGPU) printf(" hardware-gpu"); - if(flags&FILEATTRIBUTE_USEACCELERATEDBLIT) printf(" accelerated-blit"); - if(flags&~(1|8|16|32|64)) - printf(" flags=%02x", flags); - } - else if(tag->id == ST_DOABC) { - swf_SetTagPos(tag, 0); - U32 flags = swf_GetU32(tag); - char*s = swf_GetString(tag); - if(flags&~1) { - printf(" flags=%08x", flags); - } - if(*s) { - printf(" \"%s\"", s); - } - if(flags&1) { - if(name) - printf(","); - printf(" lazy load"); - } - swf_SetTagPos(tag, 0); - } - else if(tag->id == ST_STARTSOUND) { - U8 flags; - U16 id; - id = swf_GetU16(tag); - flags = swf_GetU8(tag); - if(flags & 32) - printf(" stops sound with id %04d", id); - else - printf(" starts sound with id %04d", id); - if(flags & 16) - printf(" (if not already playing)"); - if(flags & 1) - swf_GetU32(tag); - if(flags & 2) - swf_GetU32(tag); - if(flags & 4) { - printf(" looping %d times", swf_GetU16(tag)); - } - } - else if(tag->id == ST_FRAMELABEL) { - int l = strlen((char*)tag->data); - printf(" \"%s\"", tag->data); - if((l+1) < tag->len) { - printf(" has %d extra bytes", tag->len-1-l); - if(tag ->len - (l+1) == 1 && tag->data[tag->len-1] == 1) - printf(" (ANCHOR)"); - } - if((framelabel && !issprite) || - (spriteframelabel && issprite)) { - dumperror("Frame %d has more than one label", - issprite?spriteframe:mainframe); - } - if(issprite) spriteframelabel = (char*)tag->data; - else framelabel = (char*)tag->data; - } - else if(tag->id == ST_SHOWFRAME) { - char*label = issprite?spriteframelabel:framelabel; - int frame = issprite?spriteframe:mainframe; - int nframe = frame; - if(!label) { - while(tag->next && tag->next->id == ST_SHOWFRAME && tag->next->len == 0) { - tag = tag->next; - if(issprite) spriteframe++; - else mainframe++; - nframe++; - } - } - if(nframe == frame) - printf(" %d (%s)", frame+1, timestring(frame*(256.0/(swf.frameRate+0.1)))); - else - printf(" %d-%d (%s-%s)", frame+1, nframe+1, - timestring(frame*(256.0/(swf.frameRate+0.1))), - timestring(nframe*(256.0/(swf.frameRate+0.1))) - ); - if(label) - printf(" (label \"%s\")", label); - if(issprite) {spriteframe++; spriteframelabel = 0;} - if(!issprite) {mainframe++; framelabel = 0;} - } - else if(tag->id == ST_SETBACKGROUNDCOLOR) { - U8 r = swf_GetU8(tag); - U8 g = swf_GetU8(tag); - U8 b = swf_GetU8(tag); - printf(" (%02x/%02x/%02x)",r,g,b); - } - else if(tag->id == ST_PROTECT) { - if(tag->len>0) { - printf(" %s", swf_GetString(tag)); - } - } - else if(tag->id == ST_DEFINEFONTALIGNZONES) { - handleFontAlign1(tag); - } - else if(tag->id == ST_CSMTEXTSETTINGS) { - U16 id = swf_GetU16(tag); - U8 flags = swf_GetU8(tag); - printf(" ("); - if(flags&0x40) { - printf("flashtype,"); - } - switch(((flags>>3)&7)) { - case 0:printf("no grid,");break; - case 1:printf("pixel grid,");break; - case 2:printf("subpixel grid,");break; - case 3:printf("unknown grid,");break; - } - if(flags&0x87) - printf("unknown[%08x],", flags); - float thickness = swf_GetFixed(tag); - float sharpness = swf_GetFixed(tag); - printf("s=%.2f,t=%.2f)", thickness, sharpness); - swf_GetU8(tag); - } - else if(swf_isDefiningTag(tag)) { - U16 id = swf_GetDefineID(tag); - printf(" defines id %04d", id); - if(idtab[id]) - dumperror("Id %04d is defined more than once.", id); - idtab[id] = 1; - } - else if(swf_isPseudoDefiningTag(tag)) { - U16 id = swf_GetDefineID(tag); - printf(" adds information to id %04d", id); - if(!idtab[id]) - dumperror("Id %04d is not yet defined.\n", id); - } - - if(tag->id == ST_DEFINEBITSLOSSLESS || - tag->id == ST_DEFINEBITSLOSSLESS2) { - handleDefineBits(tag); - printf("\n"); - } - else if(tag->id == ST_DEFINESOUND) { - handleDefineSound(tag); - printf("\n"); - } - else if(tag->id == ST_VIDEOFRAME) { - handleVideoFrame(tag, myprefix); - printf("\n"); - } - else if(tag->id == ST_DEFINEVIDEOSTREAM) { - handleVideoStream(tag, myprefix); - printf("\n"); - } - else if(tag->id == ST_DEFINEEDITTEXT) { - handleEditText(tag); - printf("\n"); - } - else if(tag->id == ST_DEFINEMOVIE) { - U16 id = swf_GetU16(tag); - char*s = swf_GetString(tag); - printf(" URL: %s\n", s); - } - else if(tag->id == ST_DEFINETEXT || tag->id == ST_DEFINETEXT2) { - handleText(tag, myprefix); - } - else if(tag->id == ST_DEFINESCALINGGRID) { - U16 id = swf_GetU16(tag); - SRECT r; - swf_GetRect(tag, &r); - printf(" (%.2f,%.2f)-(%.2f,%.2f)\n", r.xmin/20.0, r.ymin/20.0, r.xmax/20.0, r.ymax/20.0); - } - else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) { - } - else if(tag->id == ST_NAMECHARACTER || tag->id==ST_DEFINEFONTNAME) { - swf_GetU16(tag); - printf(" \"%s\"\n", swf_GetString(tag)); - } - else { - printf("\n"); - } - - if(bbox && swf_isDefiningTag(tag) && tag->id != ST_DEFINESPRITE) { - SRECT r = swf_GetDefineBBox(tag); - printf(" %s bbox [%.2f, %.2f, %.2f, %.2f]\n", prefix, - r.xmin/20.0, - r.ymin/20.0, - r.xmax/20.0, - r.ymax/20.0); - } - - sprintf(myprefix, " %s", prefix); - - if(tag->id == ST_DEFINESPRITE) { - sprintf(prefix, " "); - if(issprite) { - dumperror("Sprite definition inside a sprite definition"); - } - issprite = 1; - spriteframe = 0; - spriteframelabel = 0; - } - else if(tag->id == ST_END) { - *prefix = 0; - issprite = 0; - spriteframelabel = 0; - if(tag->len) - dumperror("End Tag not empty"); - } - else if(tag->id == ST_EXPORTASSETS || tag->id == ST_SYMBOLCLASS) { - handleExportAssets(tag, myprefix); - } - else if(tag->id == ST_DOACTION && action) { - ActionTAG*actions; - actions = swf_ActionGet(tag); - swf_DumpActions(actions, myprefix); - } - else if((tag->id == ST_DOABC || tag->id == ST_RAWABC) && action) { - void*abccode = swf_ReadABC(tag); - swf_DumpABC(stdout, abccode, ""); - swf_FreeABC(abccode); - } - else if(tag->id == ST_DOINITACTION && action) { - ActionTAG*actions; - swf_GetU16(tag); // id - actions = swf_ActionGet(tag); - swf_DumpActions(actions, myprefix); - } - else if(tag->id == ST_DEFINEBUTTON) { - if(showbuttons) { - dumpButton(tag, myprefix); - } - if(action) { - dumpButtonActions(tag, myprefix); - } - } - else if(swf_isFontTag(tag) && showfonts) { - dumpFont(tag, myprefix); - } - else if(tag->id == ST_DEFINEBUTTON2) { - if(action) { - dumpButton2Actions(tag, myprefix); - } - } - else if(tag->id == ST_PLACEOBJECT) { - handlePlaceObject(tag, myprefix); - } - else if(tag->id == ST_PLACEOBJECT2 || tag->id == ST_PLACEOBJECT3) { - handlePlaceObject23(tag, myprefix); - } - else if(tag->id == ST_DEFINEFONTALIGNZONES) { - handleFontAlign2(tag, myprefix); - } - else if(tag->id == ST_DEFINEFONTNAME) { - swf_SetTagPos(tag, 0); - swf_GetU16(tag); //id - swf_GetString(tag); //name - char* copyright = swf_GetString(tag); - printf("%s%s\n", myprefix, copyright); - } - else if(tag->id == ST_DEFINESHAPE || - tag->id == ST_DEFINESHAPE2 || - tag->id == ST_DEFINESHAPE3 || - tag->id == ST_DEFINESHAPE4) { - if(showshapes) - handleShape(tag, myprefix); - } - - if(tag->len && used) { - int num = swf_GetNumUsedIDs(tag); - int* used; - int t; - if(num) { - used = (int*)malloc(sizeof(int)*num); - swf_GetUsedIDs(tag, used); - printf("%s%suses IDs: ", indent, prefix); - for(t=0;tid == ST_FREECHARACTER) { - U16 id; - swf_SetTagPos(tag, 0); - id = swf_GetU16(tag); - idtab[id] = 0; - } - - if(tag->len && hex) { - hexdumpTag(tag, prefix); - } - tag = tag->next; - fflush(stdout); - } - - swf_FreeTags(&swf); - return 0; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfextract b/fluidbook/tools/swftools-special-swfdump/src/swfextract deleted file mode 100644 index d3e91b20be039a324877a4d446a46b7b6cd848a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846175 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

19I7QN=K`sQB}XS!GC_D5#(U!_Wf%A|^Gr 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ð{tTy=24$r=**x2JCsplBQde2 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

ct)A{GG;YS@Br?vsc1?M!%NNPR0&ZrurwYbc{lg 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 H=d$ - diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfextract.c b/fluidbook/tools/swftools-special-swfdump/src/swfextract.c deleted file mode 100644 index 4791124c1..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfextract.c +++ /dev/null @@ -1,1403 +0,0 @@ -/* swfextract.c - Allows to extract parts of the swf into a new file. - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" -#include "../lib/log.h" -#include "../lib/jpeg.h" -#include "../lib/png.h" -#ifdef HAVE_ZLIB_H -#ifdef HAVE_LIBZ -#include "zlib.h" -#define _ZLIB_INCLUDED_ -#endif -#endif - -char * filename = 0; -char * destfilename = "output.swf"; -int verbose = 3; - -char* extractids = 0; -char* extractframes = 0; -char* extractjpegids = 0; -char* extractfontids = 0; -char* extractpngids = 0; -char* extractsoundids = 0; -char* extractmp3ids = 0; -char* extractbinaryids = 0; -char* extractanyids = 0; -char extractmp3 = 0; - -char* extractname = 0; - -char hollow = 0; -char originalplaceobjects = 0; -char movetozero = 0; - -int numextracts = 0; -char *outputformat = NULL; - -struct options_t options[] = -{ - {"o","output"}, - {"w","hollow"}, - {"v","verbose"}, - {"i","id"}, - {"j","jpegs"}, - {"p","pngs"}, - {"a","any"}, - {"P","placeobject"}, - {"0","movetozero"}, - {"m","mp3"}, - {"M","embeddedmp3"}, - {"s","sound"}, - {"n","name"}, - {"f","frame"}, - {"F","font"}, - {"V","version"}, - {"b","binary"}, - {"O","outputformat"}, - {0,0} -}; - - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("swfextract - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else if(!strcmp(name, "o")) { - destfilename = val; - return 1; - } - else if(!strcmp(name, "i")) { - extractids = val; - numextracts++; - if(extractname) { - fprintf(stderr, "You can only supply either name or id\n"); - exit(1); - } - return 1; - } - else if(!strcmp(name, "n")) { - extractname = val; - numextracts++; - if(extractids) { - fprintf(stderr, "You can only supply either name or id\n"); - exit(1); - } - return 1; - } - else if(!strcmp(name, "v")) { - verbose ++; - return 0; - } - else if(!strcmp(name, "m")) { - extractmp3 = 1; - numextracts++; - return 0; - } - else if(!strcmp(name, "M")) { - if(extractsoundids) { - fprintf(stderr, "Only one --embeddedmp3 argument is allowed. (Try to use a range, e.g. -M 1,2,3)\n"); - exit(1); - } - numextracts++; - extractmp3ids = val; - return 1; - } - else if(!strcmp(name, "j")) { - if(extractjpegids) { - fprintf(stderr, "Only one --jpegs argument is allowed. (Try to use a range, e.g. -j 1,2,3)\n"); - exit(1); - } - /* TODO: count number of IDs in val range */ - numextracts++; - extractjpegids = val; - return 1; - } - else if(!strcmp(name, "F")) { - if(extractfontids) { - fprintf(stderr, "Only one --font argument is allowed. (Try to use a range, e.g. -s 1,2,3)\n"); - exit(1); - } - numextracts++; - extractfontids = val; - return 1; - } - else if(!strcmp(name, "s")) { - if(extractsoundids) { - fprintf(stderr, "Only one --sound argument is allowed. (Try to use a range, e.g. -s 1,2,3)\n"); - exit(1); - } - numextracts++; - extractsoundids = val; - return 1; - } - else if(!strcmp(name, "b")) { - if(extractbinaryids) { - fprintf(stderr, "Only one --binary argument is allowed. (Try to use a range, e.g. -s 1,2,3)\n"); - exit(1); - } - numextracts++; - extractbinaryids = val; - return 1; - } -#ifdef _ZLIB_INCLUDED_ - else if(!strcmp(name, "p")) { - if(extractpngids) { - fprintf(stderr, "Only one --png argument is allowed. (Try to use a range, e.g. -p 1,2,3)\n"); - exit(1); - } - numextracts++; - extractpngids = val; - return 1; - } -#endif - else if(!strcmp(name, "a")) { - numextracts++; - extractanyids = val; - return 1; - } - else if(!strcmp(name, "f")) { - numextracts++; - extractframes = val; - return 1; - } - else if(!strcmp(name, "P")) { - originalplaceobjects = 1; - return 0; - } - else if(!strcmp(name, "0")) { - movetozero = 1; - return 0; - } - else if(!strcmp(name, "w")) { - hollow = 1; - return 0; - } - else if (!strcmp(name, "O")) { - outputformat = val; - return 1; - } - else { - printf("Unknown option: -%s\n", name); - exit(1); - } - - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char*name) -{ - printf("Usage: %s [-v] [-n name] [-ijf ids] file.swf\n", name); - printf("\t-v , --verbose\t\t\t Be more verbose\n"); - printf("\t-o , --output filename\t\t set output filename\n"); - printf("\t-V , --version\t\t\t Print program version and exit\n\n"); - printf("SWF Subelement extraction:\n"); - printf("\t-n , --name name\t\t instance name of the object (SWF Define) to extract\n"); - printf("\t-i , --id ID\t\t\t ID of the object, shape or movieclip to extract\n"); - printf("\t-f , --frame frames\t\t frame numbers to extract\n"); - printf("\t-w , --hollow\t\t\t hollow mode: don't remove empty frames\n"); - printf("\t \t\t\t (use with -f)\n"); - printf("\t-P , --placeobject\t\t\t Insert original placeobject into output file\n"); - printf("\t \t\t\t (use with -i)\n"); - printf("SWF Font/Text extraction:\n"); - printf("\t-F , --font ID\t\t\t Extract font(s)\n"); - printf("Picture extraction:\n"); - printf("\t-j , --jpeg ID\t\t\t Extract JPEG picture(s)\n"); -#ifdef _ZLIB_INCLUDED_ - printf("\t-p , --pngs ID\t\t\t Extract PNG picture(s)\n"); -#endif - printf("\n"); - printf("Sound extraction:\n"); - printf("\t-m , --mp3\t\t\t Extract main mp3 stream\n"); - printf("\t-M , --embeddedmp3\t\t\t Extract embedded mp3 stream(s)\n"); - printf("\t-s , --sound ID\t\t\t Extract Sound(s)\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", - filename, name); - } - filename = name; - return 0; -} - -void prepare_name(char *buf, size_t len, const char *prefix, - const char *suffix, int idx) { - if (outputformat!=NULL) { - // override default file name formatting - // make sure single-file behavior is not used - numextracts = -1; - // Other parts of codebase use vsnprintf, so I assume snprintf - // is available on all platforms that swftools currently works on. - // We need to check for buffer overflows now that the user is - // supplying the format string. - snprintf(buf,len,outputformat,idx,suffix); - } else { - // use default file name formatting, unchanged - sprintf(buf,"%s%d.%s",prefix,idx,suffix); - } -} - -U8 mainr,maing,mainb; -/* 1 = used, not expanded, - 3 = used, expanded - 5 = wanted, not expanded - 7 = wanted, expanded - */ -char used[65536]; -TAG*tags[65536]; -int changed; -char * tagused; -int extractname_id = -1; - -void idcallback(void*data) -{ - if(!(used[GET16(data)]&1)) { - changed = 1; - used[GET16(data)] |= 1; - } -} - -void enumerateIDs(TAG*tag, void(*callback)(void*)) -{ -/* U8*data; - int len = tag->len; - if(tag->len>=64) { - len += 6; - data = (U8*)malloc(len); - PUT16(data, (tag->id<<6)+63); - *(U8*)&data[2] = tag->len; - *(U8*)&data[3] = tag->len>>8; - *(U8*)&data[4] = tag->len>>16; - *(U8*)&data[5] = tag->len>>24; - memcpy(&data[6], tag->data, tag->len); - } else { - len += 2; - data = (U8*)malloc(len); - PUT16(data, (tag->id<<6)+tag->len); - memcpy(&data[2], tag->data, tag->len); - } - map_ids_mem(data, len, callback); - */ - int num = swf_GetNumUsedIDs(tag); - int *ptr = malloc(sizeof(int)*num); - int t; - swf_GetUsedIDs(tag, ptr); - for(t=0;tdata[ptr[t]]); -} - -void moveToZero(TAG*tag) -{ - if(!swf_isPlaceTag(tag)) - return; - SWFPLACEOBJECT obj; - swf_GetPlaceObject(tag, &obj); - obj.matrix.tx = 0; - obj.matrix.ty = 0; - swf_ResetTag(tag, tag->id); - swf_SetPlaceObject(tag, &obj); -} - -void extractTag(SWF*swf, char*filename) -{ - SWF newswf; - TAG*desttag; - TAG*srctag; - RGBA rgb; - SRECT objectbbox; - char sprite; - int f; - int t; - int tagnum; - int copy = 0; - memset(&newswf,0x00,sizeof(SWF)); // set global movie parameters - - newswf.fileVersion = swf->fileVersion; - newswf.frameRate = swf->frameRate; - newswf.movieSize = swf->movieSize; - if(movetozero && originalplaceobjects) { - newswf.movieSize.xmax = swf->movieSize.xmax - swf->movieSize.xmin; - newswf.movieSize.ymax = swf->movieSize.ymax - swf->movieSize.ymin; - newswf.movieSize.xmin = 0; - newswf.movieSize.ymin = 0; - } - - newswf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); - desttag = newswf.firstTag; - rgb.r = mainr; - rgb.g = maing; - rgb.b = mainb; - swf_SetRGB(desttag,&rgb); - - swf_GetRect(0, &objectbbox); - - do { - changed = 0; - for(t=0;t<65536;t++) { - if(used[t] && !(used[t]&2)) { - if(tags[t]==0) { - msg(" ID %d is referenced, but never defined.", t); - } else if(tags[t]->id==ST_DEFINESPRITE) { - TAG*tag = tags[t]; - while(tag->id != ST_END) - { - enumerateIDs(tag, idcallback); - tag = tag->next; - } - } - else - enumerateIDs(tags[t], idcallback); - used[t] |= 2; - } - } - } - while(changed); - - srctag = swf->firstTag; - tagnum = 0; - sprite = 0; - while(srctag && (srctag->id || sprite)) { - int reset = 0; - if(!sprite) { - copy = 0; - } - if(srctag->id == ST_END) { - sprite = 0; - } - if(srctag->id == ST_DEFINESPRITE) - sprite = 1; - if(srctag->id == ST_JPEGTABLES) - copy = 1; - if(swf_isDefiningTag(srctag)) { - int id = swf_GetDefineID(srctag); - if(used[id]) { - SRECT b; - copy = 1; - b = swf_GetDefineBBox(srctag); - swf_ExpandRect2(&objectbbox, &b); - } - } else - if ((((swf_isPlaceTag(srctag) && originalplaceobjects) - || srctag->id == ST_STARTSOUND) && (used[swf_GetPlaceID(srctag)]&4) ) || - (swf_isPseudoDefiningTag(srctag) && used[swf_GetDefineID(srctag)]) || - (tagused[tagnum])) - { - if(copy == 0) - reset = 1; - copy = 1; - } - if(srctag->id == ST_REMOVEOBJECT) { - if(!used[swf_GetPlaceID(srctag)]) - copy = 0; - } - - if(copy) { - TAG*ttag = (TAG*)malloc(sizeof(TAG)); - desttag = swf_InsertTag(desttag, srctag->id); - desttag->len = desttag->memsize = srctag->len; - desttag->data = malloc(srctag->len); - memcpy(desttag->data, srctag->data, srctag->len); - if(movetozero && swf_isPlaceTag(desttag)) { - moveToZero(desttag); - } - if(reset) - copy = 0; - } - - srctag = srctag->next; - tagnum ++; - } - if(!extractframes && !hollow) { - if(!originalplaceobjects && (extractids||extractname_id>=0)) { - int number = 0; - int id = 0; - int t; - TAG* objtag = 0; - SRECT bbox; - memset(&bbox, 0, sizeof(SRECT)); - if(extractids) { - for(t=0;t<65536;t++) { - if(is_in_range(t, extractids)) { - id = t; - number++; - } - } - } - if(number>=2) { - printf("warning! You should use the -P when extracting multiple objects\n"); - } - - if(number == 1) { - /* if there is only one object, we will scale it. - So let's figure out its bounding box */ - TAG*tag = swf->firstTag; - while(tag) { - if(swf_isDefiningTag(tag) && tag->id != ST_DEFINESPRITE) { - if(swf_GetDefineID(tag) == id) - bbox = swf_GetDefineBBox(tag); - objtag = tag; - } - tag = tag->next; - } - newswf.movieSize.xmin = 0; - newswf.movieSize.ymin = 0; - newswf.movieSize.xmax = 512*20; - newswf.movieSize.ymax = 512*20; - } else { - if((objectbbox.xmin|objectbbox.ymin|objectbbox.xmax|objectbbox.ymax)!=0) - newswf.movieSize = objectbbox; - } - - if(extractname_id>=0) { - desttag = swf_InsertTag(desttag, ST_PLACEOBJECT2); - swf_ObjectPlace(desttag, extractname_id, extractname_id, 0,0,extractname); - } else { - for(t=0;t<65536;t++) { - if(is_in_range(t, extractids)) { - MATRIX m; - desttag = swf_InsertTag(desttag, ST_PLACEOBJECT2); - swf_GetMatrix(0, &m); - if(objtag) { - int width = bbox.xmax - bbox.xmin; - int height = bbox.ymax - bbox.ymin; - int max = width>height?width:height; - m.tx = -bbox.xmin; - m.ty = -bbox.ymin; - if(max) { - m.sx = (512*20*65536)/max; - m.sy = (512*20*65536)/max; - } - //newswf.movieSize = swf_TurnRect(newswf.movieSize, &m); - } - swf_ObjectPlace(desttag, t, t, &m,0,0); - } - } - } - } - desttag = swf_InsertTag(desttag,ST_SHOWFRAME); - } - desttag = swf_InsertTag(desttag,ST_END); - - f = open(filename, O_TRUNC|O_WRONLY|O_CREAT|O_BINARY, 0644); - if FAILED(swf_WriteSWF(f,&newswf)) fprintf(stderr,"WriteSWF() failed.\n"); - close(f); - - swf_FreeTags(&newswf); // cleanup -} - -int isOfType(int t, TAG*tag) -{ - int show = 0; - if(t == 0 && (tag->id == ST_DEFINESHAPE || - tag->id == ST_DEFINESHAPE2 || - tag->id == ST_DEFINESHAPE3)) { - show = 1; - } - if(t==1 && tag->id == ST_DEFINESPRITE) { - show = 1; - } - if(t == 2 && (tag->id == ST_DEFINEBITS || - tag->id == ST_DEFINEBITSJPEG2 || - tag->id == ST_DEFINEBITSJPEG3)) { - show = 1; - } - if(t == 3 && (tag->id == ST_DEFINEBITSLOSSLESS || - tag->id == ST_DEFINEBITSLOSSLESS2)) { - show = 1; - } - if(t == 4 && (tag->id == ST_DEFINESOUND)) { - show = 1; - } - if(t == 5 && (tag->id == ST_DEFINEFONT || tag->id == ST_DEFINEFONT2 || tag->id == ST_DEFINEFONT3)) { - show = 1; - } - if (t== 6 && (tag->id == ST_DEFINEBINARY)) { - show = 1; - } - if (t== 7 && (tag->id == ST_DEFINESPRITE)) { - int wasFolded = swf_IsFolded(tag); - TAG *toFold = tag; - - if(wasFolded) - swf_UnFoldSprite(tag); - - while(tag->id != ST_END) { - tag = tag->next; - if(tag->id == ST_SOUNDSTREAMHEAD || tag->id == ST_SOUNDSTREAMHEAD2) { - show = 1; - break; - } - } - - if(wasFolded) - swf_FoldSprite(toFold); - } - - return show; -} - -void listObjects(SWF*swf) -{ - TAG*tag; - char first; - int t; - int frame = 0; - char*names[] = {"Shape", "MovieClip", "JPEG", "PNG", "Sound", "Font", "Binary", "Embedded MP3"}; - char*options[] = {"-i", "-i", "-j", "-p", "-s", "-F","-b","-M"}; - int mp3=0; - printf("Objects in file %s:\n",filename); - swf_FoldAll(swf); - for(t=0;tfirstTag; - first = 1; - while(tag) { - if(tag->id == ST_SOUNDSTREAMHEAD || tag->id == ST_SOUNDSTREAMHEAD2) - mp3 = 1; - if(isOfType(t,tag)) - nr++; - tag = tag->next; - } - if(!nr) - continue; - - printf(" [%s] %d %s%s: ID(s) ", options[t], nr, names[t], nr>1?"s":""); - - tag = swf->firstTag; - while(tag) { - char text[80]; - char show = isOfType(t,tag); - int id; - if(!show) { - tag = tag->next; - continue; - } - id = swf_GetDefineID(tag); - - if(id == lastid+1) { - follow=1; - } else { - if(first || !follow) { - if(!first) - printf(", "); - printf("%d", id); - } else { - if(lastprint + 1 == lastid) - printf(", %d, %d", lastid, id); - else - printf("-%d, %d", lastid, id); - } - lastprint = id; - first = 0; - follow = 0; - } - lastid = id; - tag=tag->next; - } - if(follow) { - if(lastprint + 1 == lastid) - printf(", %d", lastid); - else - printf("-%d", lastid); - } - printf("\n"); - } - - if(frame) - printf(" [-f] %d Frames: ID(s) 0-%d\n", frame, frame); - else - printf(" [-f] 1 Frame: ID(s) 0\n"); - - if(mp3) - printf(" [-m] 1 MP3 Soundstream\n"); -} - -int handlefont(SWF*swf, TAG*tag) -{ - SWFFONT* f=0; - U16 id; - char name[80]; - char*filename = name; - int t; - - id = swf_GetDefineID(tag); - prepare_name(name, sizeof(name), "font", "swf", id); - if(numextracts==1) { - filename = destfilename; - } - - swf_FontExtract(swf, id, &f); - if(!f) { - if (!extractanyids) { - printf("Couldn't extract font %d\n", id); - } - return 0; - } - - swf_WriteFont(f, filename); - swf_FontFree(f); - return 1; -} - -static char has_jpegtables=0; -static U8*jpegtables = 0; -static int jpegtablessize = 0; - -void handlejpegtables(TAG*tag) -{ - if(tag->id == ST_JPEGTABLES) { - jpegtables = tag->data; - jpegtablessize = tag->len; - has_jpegtables = 1; - } -} - -FILE* save_fopen(char* name, char* mode) -{ - FILE*fi = fopen(name, mode); - if(!fi) { - fprintf(stderr, "Error: Couldn't open %s\n", name); - exit(1); - } - return fi; -} - -int findjpegboundary(U8*data, int len) -{ - int t; - int pos=-1; - for(t=0;tid != ST_DEFINEBITSJPEG3) { - prepare_name(name, sizeof(name), "pic", "jpg", GET16(tag->data)); - if(numextracts==1) { - filename = destfilename; - if(!strcmp(filename,"output.swf")) - filename = "output.jpg"; - } - } else { - prepare_name(name, sizeof(name), "pic", "png", GET16(tag->data)); - if(numextracts==1) { - filename = destfilename; - if(!strcmp(filename,"output.swf")) - filename = "output.png"; - } - } - - /* swf jpeg images have two streams, which both start with ff d8 and - end with ff d9. The following code handles sorting the middle - bytes out, so that one stream remains */ - if(tag->id == ST_DEFINEBITSJPEG && tag->len>2 && has_jpegtables) { - fi = save_fopen(filename, "wb"); - if(jpegtablessize>=2) { - fwrite(jpegtables, 1, jpegtablessize-2, fi); //don't write end tag (ff,d8) - fwrite(&tag->data[2+2], tag->len-2-2, 1, fi); //don't write start tag (ff,d9) - } else { - fwrite(tag->data+2, tag->len-2, 1, fi); - } - fclose(fi); - } - else if(tag->id == ST_DEFINEBITSJPEG2 && tag->len>2) { - int end = tag->len; - int pos = findjpegboundary(&tag->data[2], tag->len-2); - if(pos>=0) { - pos+=2; - fi = save_fopen(filename, "wb"); - fwrite(&tag->data[2], pos-2, 1, fi); - fwrite(&tag->data[pos+4], end-(pos+4), 1, fi); - fclose(fi); - } else { - fi = save_fopen(filename, "wb"); - fwrite(&tag->data[2], end-2, 1, fi); - fclose(fi); - } - } - else if(tag->id == ST_DEFINEBITSJPEG3 && tag->len>6) { - U32 end = GET32(&tag->data[2])+6; - int pos = findjpegboundary(&tag->data[6], end); - if(end >= tag->len) { - msg(" zlib data out of bounds in definebitsjpeg3"); - return 0; - } - if(pos) { - /* TODO: do we actually need this? */ - memmove(&tag->data[pos], &tag->data[pos+4], end-(pos+4)); - } - unsigned char*image; - unsigned width=0, height=0; - jpeg_load_from_mem(&tag->data[6], end-6, &image, &width, &height); - - uLongf datalen = width*height; - Bytef *data = malloc(datalen); - - int error = uncompress(data, &datalen, &tag->data[end], (uLong)(tag->len - end)); - if(error != Z_OK) { - fprintf(stderr, "Zlib error %d\n", error); - return 0; - } - int t, size = width*height; - for(t=0;tdata); - if (!extractanyids) { - fprintf(stderr, "Object %d is not a JPEG picture!\n", id); - exit(1); - } - return 0; - } - return 1; -} - -#ifdef _ZLIB_INCLUDED_ -static U32 mycrc32; - -static U32*crc32_table = 0; -static void make_crc32_table(void) -{ - int t; - if(crc32_table) - return; - crc32_table = (U32*)malloc(1024); - - for (t = 0; t < 256; t++) { - U32 c = t; - int s; - for (s = 0; s < 8; s++) { - c = (0xedb88320L*(c&1)) ^ (c >> 1); - } - crc32_table[t] = c; - } -} -static inline void png_write_byte(FILE*fi, U8 byte) -{ - fwrite(&byte,1,1,fi); - mycrc32 = crc32_table[(mycrc32 ^ byte) & 0xff] ^ (mycrc32 >> 8); -} -static void png_start_chunk(FILE*fi, char*type, int len) -{ - U8 mytype[4]={0,0,0,0}; - U32 mylen = BE_32_TO_NATIVE(len); - memcpy(mytype,type,strlen(type)); - fwrite(&mylen, 4, 1, fi); - mycrc32=0xffffffff; - png_write_byte(fi,mytype[0]); - png_write_byte(fi,mytype[1]); - png_write_byte(fi,mytype[2]); - png_write_byte(fi,mytype[3]); -} -static void png_write_bytes(FILE*fi, U8*bytes, int len) -{ - int t; - for(t=0;t>24); - png_write_byte(fi,dword>>16); - png_write_byte(fi,dword>>8); - png_write_byte(fi,dword); -} -static void png_end_chunk(FILE*fi) -{ - U32 tmp = BE_32_TO_NATIVE((mycrc32^0xffffffff)); - fwrite(&tmp,4,1,fi); -} - - -/* extract a lossless image (png) out of a tag - This routine was originally meant to be a one-pager. I just - didn't know png is _that_ much fun. :) -mk - */ -int handlelossless(TAG*tag) -{ - char name[80]; - char*filename = name; - FILE*fi; - int width, height; - int crc; - int id; - int t; - U8 bpp = 1; - U8 format; - U8 tmp; - Bytef* data=0; - U8* data2=0; - U8* data3=0; - uLongf datalen; - uLongf datalen2; - U32 datalen3; - U8 head[] = {137,80,78,71,13,10,26,10}; - int cols; - char alpha = tag->id == ST_DEFINEBITSLOSSLESS2; - RGBA* palette; - int pos; - int error; - U32 tmp32; - - make_crc32_table(); - - if(tag->id != ST_DEFINEBITSLOSSLESS && - tag->id != ST_DEFINEBITSLOSSLESS2) { - int id = GET16(tag->data); - if (!extractanyids) { - fprintf(stderr, "Object %d is not a PNG picture!\n",id); - exit(1); - } - return 0; - } - - id =swf_GetU16(tag); - format = swf_GetU8(tag); - if(format == 3) bpp = 8; - if(format == 4) bpp = 16; - if(format == 5) bpp = 32; - if(format!=3 && format!=5) { - if(format==4) - fprintf(stderr, "Can't handle 16-bit palette images yet (image %d)\n",id); - else - fprintf(stderr, "Unknown image type %d in image %d\n", format, id); - return 0; - } - width = swf_GetU16(tag); - height = swf_GetU16(tag); - if(format == 3) cols = swf_GetU8(tag) + 1; -// this is what format means according to the flash specification. (which is -// clearly wrong) -// if(format == 4) cols = swf_GetU16(tag) + 1; -// if(format == 5) cols = swf_GetU32(tag) + 1; - else cols = 0; - - msg(" Width %d", width); - msg(" Height %d", height); - msg(" Format %d", format); - msg(" Cols %d", cols); - msg(" Bpp %d", bpp); - - datalen = (width*height*bpp/8+cols*8); - do { - if(data) - free(data); - datalen+=4096; - data = malloc(datalen); - error = uncompress (data, &datalen, &tag->data[tag->pos], tag->len-tag->pos); - } while(error == Z_BUF_ERROR); - if(error != Z_OK) { - fprintf(stderr, "Zlib error %d (image %d)\n", error, id); - return 0; - } - msg(" Uncompressed image is %d bytes (%d colormap)", datalen, (3+alpha)*cols); - pos = 0; - datalen2 = datalen+16; - data2 = malloc(datalen2); - palette = (RGBA*)malloc(cols*sizeof(RGBA)); - - for(t=0;t Compressed data is %d bytes", datalen2); - png_start_chunk(fi, "IDAT", datalen2); - png_write_bytes(fi,data2,datalen2); - png_end_chunk(fi); - png_start_chunk(fi, "IEND", 0); - png_end_chunk(fi); - - free(data); - free(data2); - free(data3); - return 1; -} -#endif - -static FILE*mp3file=0; -void handlesoundstream(TAG*tag) -{ - char*filename = "output.mp3"; - if(numextracts==1) { - filename = destfilename; - if(!strcmp(filename,"output.swf")) - filename = "output.mp3"; - } - switch(tag->id) { - case ST_SOUNDSTREAMHEAD: - if((tag->data[1]&0x30) == 0x20) { //mp3 compression - mp3file = fopen(filename, "wb"); - msg(" Writing mp3 data to %s",filename); - } - else - msg(" Soundstream is not mp3"); - break; - case ST_SOUNDSTREAMHEAD2: - if((tag->data[1]&0x30) == 0x20) {//mp3 compression - mp3file = fopen(filename, "wb"); - msg(" Writing mp3 data to %s",filename); - } - else - msg(" Soundstream is not mp3 (2)"); - break; - case ST_SOUNDSTREAMBLOCK: - if(mp3file) - fwrite(&tag->data[4],tag->len-4,1,mp3file); - break; - } -} - -int handledefinesound(TAG*tag) -{ - U8 flags; - U32 samples; - char buf[128]; - char*filename = buf; - FILE*fi; - char*extension = 0; - int format; - U16 id; - int rate,bits,stereo; - char*rates[] = {"5500","11025","22050","44100"}; - id = swf_GetU16(tag); //id - - flags = swf_GetU8(tag); - format = flags>>4; - rate = (flags>>2)&3; - bits = flags&2?16:8; - stereo = flags&1; - - samples = swf_GetU32(tag); - - extension = "raw"; - - if(format == 2) { // mp3 - swf_GetU16(tag); //numsamples_seek - extension = "mp3"; - } else if(format == 0) { // raw - printf("Sound is RAW, format: %s samples/sec, %d bit, %s\n", rates[rate], bits, stereo?"stereo":"mono"); - // TODO: convert to WAV - extension = "raw"; - } else if(format == 1) { // adpcm - printf("Sound is ADPCM, format: %s samples/sec, %d bit, %s\n", rates[rate], bits, stereo?"stereo":"mono"); - extension = "adpcm"; - } else { - return 0; - } - prepare_name(buf, sizeof(buf), "sound", extension, id); - if(numextracts==1) { - filename = destfilename; - if(!strcmp(filename,"output.swf")) { - sprintf(buf, "output.%s", extension); - filename = buf; - } - } - fi = save_fopen(filename, "wb"); - fwrite(&tag->data[tag->pos], tag->len - tag->pos, 1, fi); - fclose(fi); - return 1; -} - -int handlebinary(TAG*tag) { - FILE *fout = NULL; - char buf[100]; - char *filename = buf; - int len = tag->memsize; - int dx = 6; // offset to binary data - if (tag->id!=ST_DEFINEBINARY) { - if (!extractanyids) { - fprintf(stderr, "Object %d is not a binary entity!\n", - GET16(tag->data)); - } - return 0; - } - prepare_name(buf, sizeof(buf), "binary", "bin", GET16(tag->data)); - if(numextracts==1) { - filename = destfilename; - if(!strcmp(filename,"output.swf")) { - sprintf(buf, "output.bin"); - filename = buf; - } - } - fout = fopen(filename, "wb"); - fwrite(tag->data+dx,len-dx,1,fout); - fclose(fout); - return 1; -} - -int handleembeddedmp3(TAG*tag) { - int wasFolded; - TAG *toFold; - - if (tag->id!=ST_DEFINESPRITE) { - if (!extractanyids) { - fprintf(stderr, "Object %d is not a sprite entity!\n", - GET16(tag->data)); - } - return 0; - } - - wasFolded = swf_IsFolded(tag); - toFold = tag; - - if(wasFolded) - swf_UnFoldSprite(tag); - - while(tag->id != ST_END) { - tag = tag->next; - if(tag->id == ST_SOUNDSTREAMHEAD || - tag->id == ST_SOUNDSTREAMHEAD2 || - tag->id == ST_SOUNDSTREAMBLOCK) { - handlesoundstream(tag); - } - } - - if(wasFolded) - swf_FoldSprite(toFold); - - return 1; -} - -int main (int argc,char ** argv) -{ - TAG*tag; - SWF swf; - int f; - int found = 0; - int frame = 0; - int tagnum = 0; - char depths[65536]; - char listavailable = 0; - processargs(argc, argv); - - if(!extractframes && !extractids && ! extractname && !extractjpegids && !extractpngids - && !extractmp3 && !extractsoundids && !extractfontids && !extractbinaryids - && !extractanyids && !extractmp3ids) - listavailable = 1; - - if(!originalplaceobjects && movetozero) { - fprintf(stderr, "Error: -0 (--movetozero) can only be used in conjunction with -P (--placeobject)\n"); - return 0; - } - - if(!filename) - { - fprintf(stderr, "You must supply a filename.\n"); - return 1; - } - initLog(0,-1,0,0,-1, verbose); - - f = open(filename,O_RDONLY|O_BINARY); - - if (f<0) - { - perror("Couldn't open file: "); - exit(1); - } - if (swf_ReadSWF(f,&swf) < 0) - { - fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename); - close(f); - exit(1); - } - close(f); - - if(listavailable) { - listObjects(&swf); - swf_FreeTags(&swf); - return 0; - } - - tag = swf.firstTag; - tagnum = 0; - while(tag) { - tagnum ++; - tag = tag->next; - } - - tagused = (char*)malloc(tagnum); - memset(tagused, 0, tagnum); - memset(used, 0, 65536); - memset(depths, 0, 65536); - - tag = swf.firstTag; - tagnum = 0; - while(tag) { - if(swf_isAllowedSpriteTag(tag)) { - int write = 0; - if(extractframes && is_in_range(frame, extractframes)) { - write = 1; - if(tag->id == ST_PLACEOBJECT || tag->id == ST_PLACEOBJECT2) { - depths[swf_GetDepth(tag)] = 1; - } - if(tag->id == ST_REMOVEOBJECT || tag->id == ST_REMOVEOBJECT2) { - int depth = swf_GetDepth(tag); - if(!depths[depth]) - write = 0; - depths[swf_GetDepth(tag)] = 0; - } - } else { - if((tag->id == ST_REMOVEOBJECT || tag->id == ST_REMOVEOBJECT2) && - (depths[swf_GetDepth(tag)]) && hollow) { - write = 1; - depths[swf_GetDepth(tag)] = 0; - } - } - if(write) { - enumerateIDs(tag, idcallback); - found = 1; - tagused[tagnum] = 1; - } - } - - if(tag->id == ST_SOUNDSTREAMHEAD || - tag->id == ST_SOUNDSTREAMHEAD2 || - tag->id == ST_SOUNDSTREAMBLOCK) { - if(extractmp3) - handlesoundstream(tag); - } - - if(tag->id == ST_JPEGTABLES) { - handlejpegtables(tag); - } - - if(swf_isDefiningTag(tag)) { - int id = swf_GetDefineID(tag); - tags[id] = tag; - if(extractids && is_in_range(id, extractids)) { - used[id] = 5; - found = 1; - } - if(extractfontids && is_in_range(id, extractfontids)) { - handlefont(&swf, tag); - } - if(extractjpegids && is_in_range(id, extractjpegids)) { - handlejpeg(tag); - } - if(extractsoundids && is_in_range(id, extractsoundids)) { - handledefinesound(tag); - } - if(extractmp3ids && is_in_range(id, extractmp3ids)) { - handleembeddedmp3(tag); - } - if(extractbinaryids && is_in_range(id, extractbinaryids)) { - handlebinary(tag); - } -#ifdef _ZLIB_INCLUDED_ - if(extractpngids && is_in_range(id, extractpngids)) { - handlelossless(tag); - } -#endif - if(extractanyids && is_in_range(id, extractanyids)) { - if (handlefont(&swf,tag)) { - // pass - } else if (handlejpeg(tag)) { - // pass - } else if (handlebinary(tag)) { - // pass -#ifdef _ZLIB_INCLUDED_ - } else if (handlelossless(tag)) { - // pass -#endif - } else if (handledefinesound(tag)) { - // Not sure if sound code checks carefully for type. - // pass - } else if (handleembeddedmp3(tag)) { - // pass - } else { - printf("#%d not processed\n", id); - } - } - } - else if (tag->id == ST_SETBACKGROUNDCOLOR) { - mainr = tag->data[0]; - maing = tag->data[1]; - mainb = tag->data[2]; - } - else if(swf_isPlaceTag(tag) && tag->id != ST_PLACEOBJECT ) { - char*name = swf_GetName(tag); - if(name && extractname && !strcmp(name, extractname)) { - int id = swf_GetPlaceID(tag); - used[id] = 5; - found = 1; - if(originalplaceobjects) { - tagused[tagnum] = 1; - } - depths[swf_GetDepth(tag)] = 1; - extractname_id = id; - } - } - else if(tag->id == ST_SHOWFRAME) { - frame ++; - if(hollow) { - tagused[tagnum] = 1; - found = 1; - } - } - - if(tag->id == ST_DEFINESPRITE) { - while(tag->id != ST_END) { - tag = tag->next; - tagnum ++; - } - } - tag = tag->next; - tagnum ++; - } - if (found) - extractTag(&swf, destfilename); - - if(mp3file) { - fclose(mp3file); - } else { - if(extractmp3) { - msg(" Didn't find a soundstream in file"); - } - } - - swf_FreeTags(&swf); - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfrender b/fluidbook/tools/swftools-special-swfdump/src/swfrender deleted file mode 100644 index 1db7135c1b485ecae5dcfa779aec44225f1735f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 956014 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%0ADMeuFeS}s#JSr2_y=o0 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

  • _xePxx;PDl~ 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∈W0^{(et>UZ8&M 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 z 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

    raDT9qz9i%nV6B&$*MP?$)kxj^}$YJD5 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 Ot9C}+KS{jSz5fFoZ)f`e diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfstrings.1 b/fluidbook/tools/swftools-special-swfdump/src/swfstrings.1 deleted file mode 100644 index 979471393..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfstrings.1 +++ /dev/null @@ -1,35 +0,0 @@ -.TH swfstrings "1" "August 2009" "swfstrings" "swftools" -.SH NAME -swfstrings - Extracts strings from SWF files. - -.SH Synopsis -.B swfstrings [options] file.swf - -.SH DESCRIPTION -This tool extracts strings from SWF files. It parses SWF font records -and text records and prints unicode-encoded characters to stdout. - -.SH OPTIONS -.TP -\fB\-f\fR, \fB\-\-fonts\fR - Print out font information for each text block -.TP -\fB\-x\fR, \fB\-\-xpos\fR \fIx\fR - Set bounding box x coordinate -.TP -\fB\-y\fR, \fB\-\-ypos\fR \fIy\fR - Set bounding box y coordinate -.TP -\fB\-W\fR, \fB\-\-width\fR \fIwidth\fR - Set bounding box width -.TP -\fB\-H\fR, \fB\-\-height\fR \fIheight\fR - Set bounding box height -.TP -\fB\-V\fR, \fB\-\-version\fR - Print version information and exit -.SH AUTHORS - -Rainer Böhme -.TP -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfstrings.c b/fluidbook/tools/swftools-special-swfdump/src/swfstrings.c deleted file mode 100644 index f28827668..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/swfstrings.c +++ /dev/null @@ -1,246 +0,0 @@ -/* swfstrings.c - Scans a swf file for strings - - Part of the swftools package. - - Copyright (c) 2000,2001 Rainer Böhme - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" -#include "../lib/utf8.h" - -static char * filename = 0; -static char showfonts = 0; -static int x=0,y=0,w=0,h=0; - -static struct options_t options[] = { -{"f", "fonts"}, -{"x", "xpos"}, -{"y", "ypos"}, -{"W", "width"}, -{"H", "height"}, -{"V", "version"}, -{0,0} -}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("swfstrings - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } else if(!strcmp(name, "x")) { - x = atoi(val); - return 1; - } else if(!strcmp(name, "y")) { - y = atoi(val); - return 1; - } else if(!strcmp(name, "W")) { - w = atoi(val); - return 1; - } else if(!strcmp(name, "H")) { - h = atoi(val); - return 1; - } else if(!strcmp(name, "f")) { - showfonts = 1; - return 0; - } else if(!strcmp(name, "V")) { - printf("swfstrings - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } else { - fprintf(stderr, "Unknown option: -%s\n", name); - exit(1); - } - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [options] file.swf\n", name); - printf("\n"); - printf("-f , --fonts Print out font information for each text block\n"); - printf("-x , --xpos Set bounding box x coordinate\n"); - printf("-y , --ypos Set bounding box y coordinate\n"); - printf("-W , --width Set bounding box width\n"); - printf("-H , --height Set bounding box height\n"); - printf("-V , --version Print version information and exit\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", - filename, name); - } - filename = name; - return 0; -} - -static SWF swf; -static int fontnum = 0; -static SWFFONT**fonts = 0; - -void fontcallback1(void*self, U16 id,U8 * name) -{ fontnum++; -} - -void fontcallback2(void*self, U16 id,U8 * name) -{ - swf_FontExtract(&swf,id,&fonts[fontnum]); - fontnum++; -} - - -void textcallback(void*self, int*glyphs, int*advance, int nr, int fontid, int fontsize, int startx, int starty, RGBA*color) -{ - SWFFONT*font = 0; - int t; - for(t=0;tid == fontid) { - font = fonts[t]; - break; - } - } - - if(showfonts) { - if(font) - printf("#\n", fontid, font->name, swf_FontIsBold(font)?" bold":"",swf_FontIsItalic(font)?" italic":""); - printf("#\n", color->r, color->g, color->b, color->a); - printf("#\n", fontsize); - } - - for(t=0;t x+w || yy > y+h) { - /* outside of bounding box */ - ///printf("(%d+%d,%d) -> (%d,%d)\n", startx, advance[t]/20, starty, xx, yy); - if(t==nr-1) return; - else continue; - } - } - - unsigned char a; - int advance = 0; - if(font) { - if(glyphs[t]<0 || glyphs[t] >= font->numchars /*glyph is not in range*/ - || !font->glyph2ascii /* font has ascii<->glyph mapping */ - ) a = glyphs[t]; - else { - if(font->glyph2ascii[glyphs[t]]) - a = font->glyph2ascii[glyphs[t]]; - else - a = glyphs[t]; - } - } else { - a = glyphs[t]; - } - - if(a>=32) { - char* utf8 = getUTF8(a); - printf("%s", utf8); - } else { - printf("\\x%x", (int)a); - } - } - printf("\n"); -} - -void fontcallback(void*self,U16 id,U8 * name) -{ SWFFONT* font; - TAG* t; - - swf_FontExtract(&swf,id,&font); - - t = swf.firstTag; - - swf_FontFree(font); -} - -TAG**id2tag = 0; - -int main (int argc,char ** argv) -{ - int f; - processargs(argc, argv); - if(!filename) - exit(0); - - f = open(filename,O_RDONLY|O_BINARY); - if (f<0 || swf_ReadSWF(f,&swf)<0) { - fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",filename); - if(f>=0) close(f); - exit(-1); - } - close(f); - - if(x|y|w|h) { - if(!w) w = (swf.movieSize.xmax - swf.movieSize.xmin) / 20; - if(!h) h = (swf.movieSize.ymax - swf.movieSize.ymin) / 20; - } - - id2tag = malloc(sizeof(TAG)*65536); - - fontnum = 0; - swf_FontEnumerate(&swf,&fontcallback1, 0); - fonts = (SWFFONT**)malloc(fontnum*sizeof(SWFFONT*)); - fontnum = 0; - swf_FontEnumerate(&swf,&fontcallback2, 0); - - TAG*tag = swf.firstTag; - while (tag) - { - if(swf_isTextTag(tag)) { - id2tag[swf_GetDefineID(tag)] = tag; - } else if(swf_isPlaceTag(tag)) { - SWFPLACEOBJECT po; - swf_SetTagPos(tag, 0); - swf_GetPlaceObject(tag, &po); - if(!po.move && id2tag[po.id]) { - TAG*text = id2tag[po.id]; - swf_SetTagPos(text, 0); - swf_GetU16(text); - swf_GetRect(text, NULL); - swf_ResetReadBits(text); - MATRIX m,tm; - swf_GetMatrix(text, &tm); - swf_MatrixJoin(&m, &po.matrix, &tm); - swf_ParseDefineText(text, textcallback, &m); - } - } - tag = tag->next; - } - - swf_FreeTags(&swf); - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/src/ttftool b/fluidbook/tools/swftools-special-swfdump/src/ttftool deleted file mode 100644 index 79c23ece84799a69422c2a75f947a1ca0d84dff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76931 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 F^S_KcU623( diff --git a/fluidbook/tools/swftools-special-swfdump/src/ttftool.c b/fluidbook/tools/swftools-special-swfdump/src/ttftool.c deleted file mode 100644 index a3a8da4fc..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/ttftool.c +++ /dev/null @@ -1,92 +0,0 @@ -/* ttftool.c - - Truetype utility. - - Part of the swftools package. - - Copyright (c) 2010 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include "../lib/args.h" -#include "../lib/ttf.h" - -static char * filename = 0; -static int showname = 0; -static int verbose = 0; - -static struct options_t options[] = { -{"n", "name"}, -{0,0} -}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("ttftool - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } else if(!strcmp(name, "n")) { - showname = 1; - return 0; - } else if(!strcmp(name, "v")) { - verbose ++; - return 0; - } else { - printf("Unknown option: -%s\n", name); - exit(1); - } - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s \n", name); - printf("\n"); - printf("-h , --help Print short help message and exit\n"); - printf("-v , --verbose Be verbose. Use more than one -v for greater effect.\n"); - printf("-o , --output Write output to file .\n"); - printf("-V , --version Print version info and exit\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Please specify only one font\n"); - exit(1); - } - filename = name; - return 0; -} - - -int main(int argc, char ** argv) -{ - processargs(argc, argv); - ttf_t* font = ttf_open(filename); - if(showname && font->full_name) { - printf("%s\n", font->full_name); - } - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/src/wav2swf b/fluidbook/tools/swftools-special-swfdump/src/wav2swf deleted file mode 100644 index e03eff55ea0e0510d50bce23ea593a34cca182af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243546 zcmdSCd3;nw)<1kZ>4XjhZiJu_Q35s+6fp=Wku6O+irDY>TXk>erb&F}_j%vn zA8+T=xpkI0wVyh5s&4iA!jh>;4u@iWl9Wjbq1vJO0ww<|%D5|%1$~dJb{-39u zqoe{(5javv%kT8eO%kADJzWx1D9wp)g-NeS$_GR^pATiA_}}rga>yss>-glGLHT^R zkIbj_RFrH%XFTS$bfBb{4lEOR>v^QV0F?}nd|L6CJ;qyQ##?2^v!05Xf9q+Lk7eWc z0h9hfQa&KU`FxnU>UffupVH6#3mDGdB_rnVnj-Mlb4`W-73*omyAJV~&;Rse<@0(o zz3%GeIaytb^<+KrQ`z5HuH?w@fAZf-?~=uf=3h4ElEn)yUc6{YVAaK|#$9&tWn)Gz zUpn$qQC}<`(2je>lU*?ma ze0)6&;IlwJl$qvpI-XbIdp*7r@tuJ0czpR`c`w6v8onC7v+%tDUw$r^59JCxSwDsN zX5o7dzKNf+ftZ5tVv`_yy`oG7JkrGd49@{(c#QevV+6izevY?0@Vyvcwn`qp!}0y! zK33mM@9hfJ^tu{w+l0?OU%b`U zXK8rIIZxlXX+yt9eqH#lQ%|oscu)Pny6^h_W6({%{_DubduOIx@SAJv`AmGcIHUs@Hgk*+wUJe7TiAbnRDwdeE-f_1E=7*D`vhJ{<=@g+bfFP3P9{oS4}+moL`3H;PM{BV3`Gm!AP2yk`+j$pq8 zIn99i`Evq3)5MQRsE3{=-as6CK66ZbFadwkR79H+@RojKzqHG#1k6uXLVn&bD8_%Ao{_a)$0Bum1N33513@H07q--B}U z69e8VBVnsQ%tzRspUX}D^o06(9`X6vk|4j<;!nW8F4>h|Cg81p)jL6crOBV0z;EU4 zs&4p868LjWISUf-R{cDffVbqIK)kN%=Zb`Mt#SREZsd$hzz+k=&l%{~XDDYYIaikn z*sA|Bv?uY;l}NnV{gpuo^o4bt{O5eZZ`ozfAV1{KH|1FT&zf?w6Xbs;__LJRxt-+~ zL26&6k232ukC1Qudqc>{QZ|p0{Mja9G4RZf{*vT3O#Ekp|7_*$g!~to<$dl_DaXoZ zUz2~ciMQ(ELlgg00{-VFzI1YDIsY{4VVjw*C8t5~XDO9t{;hONO#Ix0dMGgEKb0US zQ{*3VhRAd+`PC+WYeIQPn&r(+XqP=^{m)8B_a;-0W|qs6pJw7)66Akp$|<=-=Eo{m z0Qd~$>sY>7Z&o`#Z1T@F>%r`X%7-RC+bowQ=MpPF3H@h-DSz(GGF?mlZ%zLEg#15m z;!6|i;c~NnjH{#^tGxLpey+)n!iZ0vDW^4o|A@%{*@~9XPwoYt{ZsjKzKD!1*O|d3pKmOzO6Z@>`kE#3W$`&p|wU#l5b3j_UvV7Sbrc)-9 z6VewbJ~Od0{~{T$Y@T27i8PS$MN1%2^3OrzEL#vjO3TaUE%7NnQST_u@^VD*moHwd zEUhSCa@iOr&KxaXHgCy-G2@iw@!~8%p^+e}NAay(w#Z+O{H;Qh`|$*6$x`NTo`2EO zB}(}!H0PW-K9gL0?Hm~m4ZdWl;$uo6qg~3(K6A%BRmSHF4U0O=jX^?1dg#wAWUR_ERf}^<}4_mAGlS>keL}P$~@nvEGd~czkIP| z6=Lt0w`%dyTNjtFC||6w1eeAkrflWFlyBALD2f&p00w&r=a(tKpkYNVSq(FF(PC7f z$d0Ha7Io#kWlNOB@yv{|=eww+cuK*XOGl1Ytk9(+>3V~otK(04y*hAqde_*FxTlBc zev1}ivPo8EVnQJcx&xK@+KReeirMq*@nN)LgM+94R5V!NPf2~+VJ%G#6Q_Gb`KydTb?wR4G+^Y z{>iZ6ljB(U$8300RS9ag4WDA;&#~dD%dAhX4bMDTpK&(4W!sXLZ^QSpnDNwX_;ee- z)P{$mjelm@@O|P~>=W4VmQRJ`g*LpUyNR!`;qB}GRW`ik8z6tB4R7E7sIlSge*cX& zyyY9FoJ}^owO2y?W*gpgH4?2nWy5nX$@)BJ!&^RG(ze;~*4`2EwKlwcKWeuPPoJ>$ zX|dtYvygc1wc#zF7RjwPd^Qp0$FSiCTSz>Q*ziMa_;wrqd>dXF+|mEtHoVJ*w|qP# zXV~x;*!Z(-_+d7Dwhfk78@|+rA8EtS zvf(eW;pf`$xiLV=z z{{9qTs`yB)fR7TUYL7f8;4cVMrAIak_+!FU<&lj7-ba`!JW?s(J%p*cBNYOEg)mii zWUheg3DYEulnQt|VY(qB`2v2PFjaXZSHOQJOcfr<7Vz&0Q*}o&1pGK*s_cj&;D-oP zRY#8e2*l9)2~$N!S_OO$VXEdxi-7MUOqCp|74R~`RK=0!1biD|s^G|G0naB))f?F; z;GYqu%8gVC_*fRhMQWky;A{QVDrsVXD20zOKZ zDl+n%fWIJ2)fm|<;ExGYB}O(1cpqV^!bqin_YkHEj8q8t6~a_~k+}k{Crp(WDHZT` z!c=vUd;vdCm?|!kE8ss9rfQ313;6ehsnQ}D0)Ct@Rarz4@I!>D!Xih05baNxsw>he z;Cl#DWkp&9d>3J=sz|MXml3Av7kN&=w-Khwifk6}e8N;!k&OcW8DXlZNTqndO6qxtDk`HFECD&m`s8>u6-P|Az#LlmvL)}It>5h`M%{Zlz{ zcsd$;hNge!&xpDar`DzEDW9E$64`^u`w`GW8Cvz8z^6?qr+S^QI9_h>`9`XPs*oi{ z3{E`jIJyr7^xsAl)9Ur|&I+8IiiF?a8GE_GmY`>*=LXLV&-5A7m^+XDqo#iwj5z{* zwa_Hv6x6~_swU&Jld;%88Ol4UhL<4V2~UlAc2a!a-gPdmtf3^drjbuAU&M77dXcT_kaatuToPoia5>E%^HrY(dv{4oU7ZE68-}pOEQ;$h55O zmEXr=j)qu+H}9DGz(dd?>?b$f?3wMk*>j6$PD8xO^pj|=V*TA6oa!{a&G;({Sgh}2 z*;AWvA|$p;3ywz%JV$!yZgi!uj0kwDYt`xpiED16lGZ}ww*yjs(DbkMmZQ&TC*CXx zJ4Y3VS0!Ct{i(lCiGB!_qtBG+&D!ucjA6)MvEHbKMr(Sr@igR-YfOp$c?t6H4koMW z+Q505{)HAEI}PoDQvU^gQVWd}9nu(vl8R8YphQ2;IKM-j=w({4Aw%T1np2UCf9n$> z{$hLlLr789)Yad`Vphd8B=%*L=0vf6!n1=#^Zbkdw~Gp|KCV_hj!@+!R1N1|bxV&4 z+3Lgf6MCx;*QT{RQ4};?6sBVwN)GaqFO@+uKCts0gV+V?-*VWw2 zwyiwL99EvRW$`4lc=A8UVqxBA>Thb*Ew$e2BmOjR-a$2dFA^!NI_}Sq)l)fH@y|m^ zqthxUUmVCM#mxBkvH_ys*fQ=z2apZ$>WNs)qrc`6J()rVQb-?9-mCtR05|&60VAMR zZ$dwg=R>puG7~s6s)}&5w|H!frihNH3)N_~EW3OsJyop#fQJ16YL>lMbS2Sg!#Bpl zcc*A&F{29kD%P7~|5j_BL`g9ir>Hx|WMiz2z!3w3_02(YK>yIAe^~v&>K>8xV2iz0 z{iT0^R@Mk+e>POb#2y*GYP^UCGM~{p(GOJC_+@bN%f-A#oavdcY=6#v9<{s?ukRKgw=I*3OuZy~y((D}- z8##1=(h(^^?Z`Po(~pVnenY^iZYgqLq`S3n|H&+4c&sKK6R%{gjrtay1gR^=pAZsp zmd4{`LMJ?T6kSTs+QuwKmO=vvo&|9pwK-*M3MM#`OD*!^IC(@zJFp@jI*zfD;zWez zlpmckniQRB#a$7Pi#aC6^EKvFMYKxfYZ%-j^=WaIv%vECks(U6$be*f#bPV$#MTT+ zb~bKC3TXv#Hk9Q~GgFZ&i@YpOzDx^GcRNvmIu2T~G*zgwV`@f9KGf$i^+vDTc}yKq ztEY^B5Lv28mXzg|6t(&zR8{9%SpzwG%JySJl#6v3(Gx#MU93cAo&cr>R&(Tch!RS9 zj11qw>Wec3fjI+aU!+nntRlnLGc1Pm=9Kxs47mYndwwY8XQUqd9~;#RjQ1~~dPDsu zAgqPXeHxXC5*GcIig3If4dLt&)e)gYdps?re4D9twE}+Tay62gq9l86-C{>pzU~7IJyEaYB5N zSr+rCS8tLkxc(tg&YQu;8VHO+oOS@}j?z>FKSOYQ#`-hRi1(mkW&19`p{|`AdB*2$ ztdVmEF?RSR_h#T={242kI%w&Qfq=hs$a+l5f`%Uraohjf64yU2?oo&f^&iR+5%#+) zERn|i05e(T=3J=hUUwG4n-G4}0Fe2Z=ftV%J^q_R)7_aYTLC}jc2>ZMrm2ot)6^ts;{hypQKt*Pfc`*l)ppR`Li7G{5xG%H+79(i z?#*yMu+(}JS%za-!}9(EJyB{@Am__?q5l71pAMzm0?B$tsQ>RJcvh5P93Pxm2cHB? zwu{iEJv-T>JTD;!q93y_W{4h{F8;fG%~%BCfH)pZlAaspqiqVG=<*}{=%C2v8xV;k zf=C*jt`CA02%^)S6EYhY1qe_4!(&!|`3zlF8mAURuw79ftU|>>>TI_Q|B)Ac-|%|9 zg$7r>p6M>k`@z3%2WC2viQ8l*kXCv}vfo8SvS)ksh`!IOA4j5F;>xlDiF)-T=v0l` zCJkK;Jz~t17m=nC%0xNZjIp8|g)X1EB}3hk@2G2aIqH2nrf>dBjaDGF-yjLIkRh2` zrc7w>CaZKkx=sk`SP8v47(rC3&%sq@sL-Wuf&3b@(+roo6*ym=;i{S9=+G{+ysQ*7 zkn5ON9kIrZ7J?4Je-N_GHUpv6tDh{)JG6Fqynjsbn2nV&osBzdy4wwQgt-R&WX*e? zSd-NT-n=8~&)2|~7lVftl7h&QL&*0Idi{twmM_HZ$P#d~an}VX2}hnBjBUo%DB2GC z1j*f)z+D1vuBUT<5Uv4h42Dv2;QR1F6HMTs$z{}jl;bevtd(+5{g)ew181J3$$_&0 zeUv@&)&YE41Lp|jaNw-LGcI$unKvXM@_IJl;KV0O67 zz+Bte1ErMk#FKa_z)1cw7K{FDI~G&Q4j$G8?{k9JToV_7j=Y3laJM2Va<~6_Av7C| zOS=%dokE{Ej7SHJ6A@0oW@cVRW<;H78+LJ?vMr+E_ldg>f`@a9>FxP!XD-q+9{De* zUcE3w(-&rG&G{L?A&WE6*)YU3eM+{bzf+>0FwR5C^#-X9s%lrK6So*Rue!BWF0l*Y z3c%PpWZa7$4ljWhN?30q--z?E|9i9I^XldBz}(@g`XF$RlpoxcYh@F2b#=_YKnu;u z)~Y`U3_^$ zcpeCK>$D^-v>cw4Hsfz7I7L$0zfEf@U)>Q47yT>PK2E)FF{)p$#p-Aea;ud&@6jAB zvDR(Ki-KO4xCYaApJ@621}#$%HeQ4IpJ{Uc!GzTht5v@sM9G!kJJqUS2bAJpy^T{|<@c%nrKYSN{&JJo z<-e)&`!sl3;E)J=;e@klCVdUM?&7jg+j%ghRU#^-4E_fxlGHAxg1WA%CO ztv?c;nlyZOgH#orO|?yf;Re%BX*yH}rYJhD6+GFOgqF$Qu4JQI5j1}OImXepZ1cle zIv=t5)XZn8`J81w=bBGC@X1$UK3CxhqoEQH*jvzLNGm0?CP~rMLN9d}{#{-DrCK!< z9TY<>r>->#^G*0+_eM$>Uay6x93fXW=hgERMXV6UpF0tnU@g|$y{97(>OYc-0Y2Bd z))crSU7jln6@O~1A@8j<463Po!@Tgw#uM3WBo3zg!x1>!#{Nm6ZE}tj3HVNLf-Y^Zu zpL;K2sZ|byO>r0#4+%;B43|f^;XXx=^Qb#ggGPZEJC%UN*trX@V8zFdx+Q=mV4;|F zX)V;m6K?o47K>bkNN{n2uslxqGYOZ*2@B$cUyyKioG>d+SVaQgx|E`>iWBC5uwjjR zL@XJD>E|E8+|kNr14Or?Iw(ci(PsPeBMl&-+ZH0PGaPjvyBsZ?x6ZTrpStx3vZ%!6 z_F#fPM;sOplw*%s)%oQopaeQ7o8pwWNVy3V(KBRDYva^^fQqV)HB?T>Q3Bs0i0owM zh@~TX3c8ysW@>StquzfF)c5zEa8V4o%+kt^X%5!m^Si8U_#n=kx4@mXjw^&);>ldo zIT`rAVOOl*v2!>_Q=KIGyy_Nrr<6U8UFc5VK+;)pNlr4uMu>ONo^ev-<5&zsD5sA| zJOg;+GH^$pLMv!xSSe|BAH#KmWdnzf14Abz2~3)P&vP(SkkYI87AD1N!xc%M%C$;N zy{5@gr{BK~R5V>qq(1~Pm*rO1>d4@VO;#0@As2iZ0i6`W=*%C6RerHB%f?_OIgx1! z1!Rl^D{7Z~d3)Et->F!m;{yA3Dpnrw#vGs`Zz7Ryiggi~{_|o<2NA~0j*js%3-6Q3 zO#atFq{X+R%sw|MPFYQgLr@Bpl5n|$lLWknC}TdDj2lTm=)n8ZjzEbA-O7!BUbi%a zMKGzZHN#Oag2{EQSz#w;Phpy_6aRmPDRJUFrUxO4kw$sHpuD8OnV?)3&q-S=C@V=x z7L%CrBd}LI zLNz1wW`tBk2sz!z?*tDNvlD@FKD96YBf=*zx@4xOGs1pke?pJI1d#zzT&b8uP*g&b z2(l6!R9DY1J|ZbbCgcB#@m+!OB0k8E#>w9vfEvX>bz}0_m9O{%(A&H6!LmNivIi{D znTPBfrUPv#2up?`hzxU zjz*~JGWD1BJ`Bh66mzS@e-^M6fj-6T@5RZ5E-lYknOux{n_LcGaJu`vn9%Xn1G#Tx zV_UJ%qwn$zKkOBqYd8D@vT{y*WV*z#_*gp{$_rX-(8{yW%sI&8_Bh`g;ESe%u5Ou- zV_b(E%k|1@;JPW!^)$GoGw2d<$cc2eJ7?|X^wL3fh=Cf`9KqUTsUEJa8(x*EWy8{c zNjwy_=0iBsV-4dGZOzNnMT&nuy$tXf)?@N@248ZH1HTd|(Xev?gcf?hnF~y(v7Zvp z(wWGT7R2oCjKLY?KU0o(8P$^If8pxT9T_wdsy{&eOEr(lSayh>S_mD(=zX69?#2x# zIU}t*2#bHy;7%5Qr)`sQnhr~ZmQW5>s&33i%rk7^m|FEV#=B{12t#Xp|2-eU)EI_w z6G0%5~0sT zM9liX0voo9GhjbJKnVc@?&17t+8h6osxvALEgz8Kft-)4Du-#D{JP@-FPAv!psa8FWVrZcWZYwD<7LlI5 zTRYL>4KKv}j5bxbu1dNHt_827&3FR7816Q+DY+)XGh_HMtt`r|TP$JK54qR%4z{F* zLh=~5@#B8XxQ?h+_JQmu>ekYv630=k%e04^bkIa2IQ#Yf+w;)nC?Xd0!( z;M&u3D}-XxXu_|#z5ke1jZmLOE;u5T=sA^>?+*yjTcagK(<>*313gIf*0|z*qr;)T zL-dlKKiWEujfgdaVtmO?8N}H?R|TTLM71Y*LjfHYKR)&c&3|}XOQ@dZiw_c z8~$#H^u-x7yCG(hcttlvc-R%=+-`_GQ)npN5IKU4PjJ4YtDZ2B#HMbD@a8MxOifoY zvq^lQo0ypT6=P{P#33YJ-wpA6632E!xL-2nYVRA9L1PdcSF3C#N2L(qe<-74RH*K$8lDtt4bJ4;``kYc}~%I zsT(2>EgHY=hIj>u_jE%XPhxpD#0ey7-4G{|cu_aRNhJ2^hB%qTuVE*5RSEedzTFMc zL*mwMh*L;>yc=QxiEFzddP$ty4Y82Kf^LXYNxYyNViAdH-4Hbr4_n*k3A(SC#5cMj zUP>yNc^}P zB4~=yXc4FB$6lm8Di&TlHjwr-Xg+;b4vsE#B0fgq1KkjRP2$o{L`PigeI#BFVvQxW zgGR5uaaq^2$4MK|H7!iqk2nS)WYP?V@w-46zghY*kN)5O1x}Uszz{_HJYv$r8 zEDToKsyOnwD@z{Hz$Q_z7St!VvYV}Sh=^~VN>#VMtm#L0gdmKIgnJw@IG))3Skz_~~44o@k2pA^mDK)c(CpLnh_mFgFcl1M8g&_m3IK87PMEqv1 z()4Dqq=7}>D>ieBE`+s?0(G;Xz&=K?{*7(FM%eGx5)CV~@Y*CpUCBj8LlbH!yb31) zKQ~;c(r{stx^*{BMD1YeJaRjg8R%}&;F&JYgX5f~*fw^8&$&}rx6iF`DEj+Nilb(h zL*G~Tg{!7CiO-Ch(&V~GR*mKqyS8wQm?<4H_VZ8@RKZQ2*=XkAVXV|n9u?cvJB9Ij zGem0P61S^KN#!0lL^{+h*Et{=k0c1jBe|v&=MArO)|A5ka9v7GDOj&dttst+M~|9P z*NYTorOLkHlc{FN)??mfM-;VROrog$9-{W^+Fdn87wUWK+B0g3F5)w*rU*`bG=?}k zgpRrFHAd;KV`{ON&A$17$j1TWb8+&BP1(Y=;a-l6R;~@PO7wG}tPulc9Cl&RsKxp_ z=2>i<{}j#2v)F9fSF{s*!nfg!Xq$%hw%cGy;$u7q-9tZS zd1fq6jX10#H`=4wY!aMtfx`u_Na!E&Z0o^s+}HN^5ncy>4|vnkl|WBXWOa}d^U+mQXy{ zpKfWEi&DPiVl7J7z+qvi=rZyE)gNC$RBqi#0FJgc@k$(6T>cxd*?^Y`aBu@c8USRK1J`Rc>XymLp{@ZDs%;a8q1 zJVG13yBv1d$}}JcVQ1vgda*MNe{OipFWC*#nuLeJQJdD3_G7-f5yUL|mdF1H z{S0|CyX*mD14tdc=pM3kG3b!}9P6DNcpkFx4oy)`gSxdxL#QZ|UoE-Fg{SOrmFsgA ze~(yER#Q=~lD9H*S&F_gD~h^N^`r3Cj=l$jBa||sk$uuUTe4O35O^f4^A0CNOS3`+ zS>p>bmt$ZaFle^I-*{N!0wc#4WCYHuyn7VR?>n0cMs*bECKLfodO>Dr8jkZ6xSE_9 zaJ@Ea$pyk&a?{OXP;|;8GCsa2a}7L)XCZ$L8$|wowab>jvyi`L=TO!#KSCEoGZ7EI zvd~PNd&=w?tJMLDw*tCKAv0(s$ zw5ISBOm0quGZ@AU$8c7#-ihSXj)>Ibt;M%;-szl=g3OBwvhoadiXokL@DN%)yS`f4 zJE7%SS~3r*ykXqmjF*XS&(aM!N`7L5z__3~)LW8^GAq}QQqcBAqm;bDjO7FLhTtca z!DuDkr*c6DoWd($`puZf3tiZt@MnhBX5t+wEqN^zz*j~VQj8J-G;v}$7?(EE_gjvG zaIM`A0@inajo;m)BYAZHSnc?tj1>d7(}LsCuO7xYXgWBuTb+H_)8|!SHrxz+u-Fl4kTLJZX zTwkCpQUS0m*zd-HL;Z+60mx@Y&6K3Nud?!MmL+$pykMJc&gX7o?!Q?1%~G(R43j*I=psNNoedq@E4b1>tY((FFlEe)WTy=RAN6P zG)Z(F;~oeR2O18qc^3*bx|0dy%8kSo4cJmOqL+oHL6Hs5qz=0P(;@aHFxWk?&15oq<6EEM zc(s>mKOm1rb81)w2Pe)p_7LeuFT!k4>A{fi7rH8w-g;J_vuDqOQRp{se%W&SC{OIw zz)SJLC%0XM&asb%lg2o>(qI`PfsqKQTWfI;zE<7Zh{tZ6h3}n?rZ}q3g8sL*HDv#% z8F!iyDi;$+)e#1wH)6LQYl)-kYzWGzJ5;=O?kSkT8%B60Bl#*_;o5~rW{s#}g3yIFrTYgwFh6sL-%8Qh|O zk%KLqqb$mw=(X&kD17M`7QEP479)_%liJz!f*-F(SNk~aonS)`bq7qxI%81qACmJfzVg0FkQ-0;^l@vV)`G_^vMSBF^ zHKSV-9F$|%(WnIt)G8x=$ewQ67e+or5f-+9@j@r)gE)k?>Pq8?W%P0VE&W|%Ja~Bq z!LgsO?}=AY_oD`^IZC)E5(X&eC}TBTU%sbf$$=iySec~P`RXD)g9iuc^}Y=s$CAaI z=hzc#I^N{;pYRR;I#{=KDD{8c!Lu;ulLg_Ad#BZ zM`z<*#{no_<*QB%I{p0<@3Z)C$zBkhghpO>@jqev!a8RTq4at@5vo`G;lflEYd{_nd(ZXK* zLmgz{h3owI=}asr-EvM|e~g>WI1uCknGv5wL>0&7 z`^dpmiyDRy4&%753fd6X88`h(LWq${e;+i{kMMex=x#R@3J&5>5sCf)0d!Z{{TR^R zF5zlMKp521QSfctwgWRf5KOMK+T!ZdcoRM(uet?IeZXi$Slt4q1IBg{tVK7`zrf+a zv=(n#Yv(ybWT6|OYivR*I)s)>p*XXh*-0?B@?z26op9YGX4iWdvfK&3_5}P)O3a^) zj`H$0*-^5Au{z3M;o31=J6JSf(wu{;RkxhrxXwUO|ETV(47rYK6Q0y<=yT|8opioU zOE5{FOft~JSct(Jovk0?!XY-1|9l%oP9}GeldG7Mb^nUzfLKR3qMs&0bDtUj3-182j>qNkBMM%6W$i;+$+1xXc03yQe^a3q7%rB zZj@n>(JB!Zhu&8sh&!PWOQEP z3hZ+D360=fa)u;aJaRB-odKTtL5rtK;fGP}IB3D2|M0>}+nK>dyOPjh?)();}*w(QzdM2V=J;u2r^oS++A0$`-vv-Ex_c zgj$v=8uvAVyqGs_*K5yl~Ns;iFr-<~yjF0v!F8jtrK1U>NdswZW z;1504r+D+uU;mHJgE?U`6VA=xdb~f8h661w<6pv}ygNg{cV`%X1uXL`yMTTGt#MPs z_H48VF_kEg^LZtjUfmpU#a?;SsBZSR>qqk5RZHp{w!q8EW>m}CvK zZ;TFvgmmGVRR?+TzHpb4PFHpGJ>u>QR_KuCsp5!O^Hg?PrFkm#uF?!2p5;m?;h0jr zhj+lQq!>$3)p`S8NjYRZh~BOjD$+B#K>%3alHwPDQv$aNAYIl$7p9cRAEy({DdyoH z+2%6g{W4(`iLYysKQPMAhb8w`~p#w+hm38F)D zq26Sy79l4>OGPLhp>l+NzrRbZ&E0QHYZu)KU3on;ov;M9v({ui{F7C; zFBDK%L(c$!%a4ZBA>(%fa7y4|0i;XdJ^-TPgvH1sh?wNy0O#>FjF=L4D+X5Uc(41& zIu}AmUudyj>Xd<2cAeU z@#JP}L#RiuB4@86SFfVM?n15ZQU_t|>O@ZE^& z#jP%0#0xvmVD^uswWRIFJ0jtHQ3A%0se#Q(!p!;b-B$7@BJ6Z@B#pIBADBt~XNa}V zjjsT1!`kOHJf}Jl!12#mHh@D2@4~unH<-^ICl^Nl#?q`V8Ko6kKuoWL-_+8ua=Y-F zbnru%6qG?hmH-GbBWB`EYIg8o3{h|nPRyw-G@iTLaak2V28+Fy_pr5rD!Q6yV4p!h zN7Ij?Jh26m){L<}PD^V5b^@_pSg^UpX}i2wvyUrIYvkQN4o(+3gS6d_VQ`7V?tnQi zJ^_q-NCbqdaRjsrnaja9TZ1ov-3jlH;EN;dvw@>6Nl6=^$+0A1aD@npt%=(aWd8&o zPp%?=8eIvcR0^}G+~?Aju#j6g6_}z{i6t6rRiq{M4y%ussNPShHYa;vEaSu#Ua}Qu zYx%?shdK}ep;C$A0V#nIYE_s&k%K^W@<&R|0Zn!WUZ%$G&Pbv0XagxgP}?$`jrX%X zIu6%=M5wQTkca3Qr)4EBuMV$8Lf$2DdC!UWB&EC-$o8P-(xt#U6Ld!Vo?eu=fTcD8 zKR07Q=QBr@CKz`fX2(~#tU_zbIUcwa?@d~@*UW>-4z4`p^kW`awrUPfQE{HiHEy_6 zQ$1Lkj8ZnNMGZQXz_}aNiY5qT3h$=S;OsWnBPY>y5=XZuag%_HtN6`WV1(9YK%GB= zP=`AA{#B}Tp02Xg`E&R&AS3wv>FWG2tHM&}2LOZuc%7PQ?Ew&6i;cMf!L?2$F?TP3 znwY!IjJ`Hq+KfpecbsF-IISgJ$HSXyU+f1dhV_f88T-Pj{wa1WsFG6^eaDt z6yRt^S`Tze>xwSYdh#};wYrP6KE{i*@wx0B0c6UW*bP9=`@vnZJ8-i9Nd=?Hjv{PX zVR!hN3)2+`{=39~r}&Td2L`KH{D+Sc|6#GCT%MwrR@($aYX@5=i0LRb}Fk^V~w!sHO(y%J1^VeD5;+%kz%3bB0fn7CUc zF4Y9Dm0(X3%$HyvyOa?UmlU_1u+E0+qrS?azQQ{Ie)l-)t9L_9Dq1t6-}>lSq!zp4PW%tb&iUvo0K_h6qjzE@g z!`+Y+fR_bt7&`(kJdqB@u&8x)YeAB)S3xSiJ@M`1Rd*V!t1&Eoy1H{bwnDz6@z$vB zyxR%jFaQK;mmQQrnq%(@mO}Vc$1-AXa3q0wrxi05!1I#5C)ocagMAR>Y7X~bbW$vk zldt}=iEC=1J=oSM=nKf$Y4|Vk+PGNg$v*HAK<0mfx^uZx|AI094HO`kg#IO=bO}96 zcA4SP67y>z;7k8RL`jvX`(>1#5?UjnJ`!4D3g`p&B#F8SsQrJQY3 zczKI3%pdwIW=bqIg^RElvwZb&_zWJ$JDSn+yEsB~;!Pak2w#V#cC+z5-p7nbMH+2? zIz5edaBrM35^0DXVaZLW5-pF8J)fQ9kS!x`I+v!nBqB>gGY`T$_L#W~F(vc0`We|; z@UCpdkHQcv&EYFVT-I}(nCA>mcOOX=qrW8+*gGvT0oVtHkTeC~897J*Z!9qZfTet? zz@J{6hfx?vDTWn}RFR^6PXfg;Ph{EFhQGTWiI{KHHy31~U`lg=unw@pp>UhHxd4+H zFU#S+A-AWSizHi-VDsshi{WjrqhspU%ZvtLG&PDXWo}wF8#6zl8D%8YgXP{hriGT^ zP5qd^rnTUf2!Ev(*(va4HXyZZz`nJhexIMbDiH*1aH z$;pA998ZrFVUMN(+fu`}(O7_oN48%Ut5$E+XJz`ldJdHK9OP@N$QKN!LRV-;ramJB z5}4rl!c0Hp&wzh(?5Q$D45eK2M|MzixBulo(?neBGFqQPfRheBG;dk}i`+)>TG?^G zt3(fA8I79M@wSfWbGBnM)Xh-Pd|Op7o0RK&>LgScpnf} zyiun&}uV7nU!Ot7y|UGLBK1;_XE55WIaeOj=YNorVDZHzeGF%lG1QV2T_?^EwHa@t zsbz1=i}!103TH0-S3%T&o1*M`>%SL3)IPM5$W(N6@a{~-e;)Qa(b9jQPb-wNKtwZJ z`T$t53mPuPi#e&N5w)VQz_Fre0vq)YfRkVUkSU2%d7T%;Rvn;zJJI2HstGmM=JN81Cc1 zB~+|sV-@~68lx#bZq@SXcqF^!pkQ%>AOZ37Ayb$NoHP1YNIbzdSUryQQ(N9eq#hGAzMW7MfW zg6%Hs3gV;zC^4WW2YNB`XEL(b{>&1Ypx|+ipBe=kY zKA=zI2sSSGNKCV8bpW+d47T2IPqRRVMmeY08ic;?6&JAK&WM?Z;S(_*#2 zeN70N+TNIrHh^g=lopVil(LU8enbp|G|lef@7>!*w{^KT!qm2;5)<$pvb)vaR7 zZy(yz+_8ECL3-r;QnJhqlAg43s=Bq8FZdmFRxKXTS?nBqMGjCue-8eq`iJ0ufB!)I zKi_|*{(9Z#Fb(JmL?OT8iEyw%yZN?z<3^C+YQ)3W$H7Zln zKkU8^UU^^Efo`6Hd=G0cjIGWUqE?SXZ?h_8&~HyyWB+vvD&>|Z5Vw;hkl-&C(+9gr zARQwwMd)R<07nV2AtrC^@t-HN%I48eF>42mVP+O_SKP-uP-}8RJ+NWPk&IIYxJifC z?*t;9F582ZhZC{}PQ{q_O-nOf{4bUl_Q*?WNCy`>k}CUg3(T6;iRCGdw1E%r1gG*xo~Z&<%DThpLz` z6PXR6iTLWBh`o2FKO2AI*8dup6+@Kh9d)Q54&0}ng- zNeGC0&lp;Py+a2EgV(*1_Z-xFU{X4{D#2aZ*w)1X+C#=ems1mdM&}1q9Wsqp$IV{` zG$4R1+oVl+fDPuG;HAh6tR22(EFCp7#SX2QV}@dmDGUst(Rj^X>K(5;hi7kaM6w`@ zhAF$$Zo14$i$OyVtA!=poS#FPp{sN7=In-DtZ&mj-PwdcDQ1;zP;vw=XyM}-*8yK!+e^N-)VxD6Y{{3 z@d^0=hZ7>%=HSye9KYUJ4Cx4hZxQu7)+FY9WuSa-6({L)8qt zFN`LAIq+v5fV58mLi=C#xKscWS#0!pbfSrUe+C5*_$|6hnxHX!q=$P>q7UkPH zXmQ1Q%_hW&!v6VcCo#q!3Pj;^?H5zgNnq^t<1oSI5)q zmK>a=<`_4A2cjGVN6yWAojLR2;Qnno*2P_erz9N)dkOPC_e{dE?qiRw9w7j zmTjX2*Jk6&0gf&Vq2E3#?&}L=h|$JU{vKVOCIs|l72kQnxZlY{jj`BL_c(C32oyak z_JDEQcdY6_iYL|>y#;7qOF~oFnw~*;Em~+JJZ#R}XGx8X_mB!Od5?48zHb;_Q7%4c zdQgU774}~cR<#%jv-hy=sd?1uTUiU?m)xz$;16PEe6fefYm3m#Rqo9Ks&X56Hdl#@ zLGy{ixshL?g_HbK!xM7p#Yy+-YuV0OK7GajK@*p^A>{C<-#P_FsuAW$^~V4`3C4%-bEs&q0{<5BRoN z_ytkZdcBz#?0V96g67F<^k0peYcGBT*W>E^J%Z|)RAu9(O8?D&Gy25Uz!~>2jH{^6 zK?_;B;#LxhK@fdBvYCy?p6lo3;E{)Auf>u8>!mj1E3O03$I)s1BT7OSzYIEVLBp*u zT;>!)b;(WCza3$ZU3Hyh?|dLChi#;{BbTq*&k3s+v0sS=h60;T0 zk+~r4Pg`N!#qk-BKmB2?Ov`Y?uDLShYwSO@GR0=iII)WgkAT=lg<}|j3=T86IHqDW zVW=YjQw`<Qj6kZ*Q7enwwz0yL4dsCRgu#lSzW$nVg7ZV%@$RG>`qYZll znB~Nfq8E>Gqqg7!b23;&&9MzQy6u& zpS#&e>$-&{)L(GRR={u)@B{8~c$VLL|Y0<(?@$wIDFS?kWWH{QV%KZk2 zv5(c^tG-r;R~%G_FMLxSKDSOCKI?Dl@Y3I@!?jk|Xp!~QNyS~W_B3^LOHZg<@(A|rlq@cqwlyc@TY(w`Kk07}XyI4D1r2YS= zo_0U{f1#eZ6%RWrJn=8ft!v5VKE!nRn*tl@nhmAA_j6nIUC-9Cs?YL`y`|}|Y0c2E z=mXS)jCD3*>A46fjE)Pwas5oVf0hkB{Ed*;oe%4`a5!(>);xN%N8n0f*c1+L6s<}f zS_-$o!}WA~ak(VW_~oK2^sBI|Taanoja-NmW^_d^AyAN^f8~W+ex3keV|?z#;$fPA zpnmt6y8x(ftnhx)kr~ z{vEy1H2)76nE+|Rwd2>Ra7;bep0j>&usvH1bN&dn_gX(X*xpm+c|kSI4#Dl0sy~>4 z2mZu>kqWo1Z=-r2mk*Kq1nmsKRcmBW9aM>cvc6}~=nc-5fv7KNWCq)lSKc0-9c;g9 z{jgwrv2Wwr(qMb8|0?`j?+Uh$-007bUKKRPldpi|Et(r_pT53tuzi|OBhU zInfJ(?K4SVb8fJG*1BF3dtzxsnEN8|k)wRv7s16{aAF?kh^>=uem`Btp_H{Dn`UX> zh{}N*<$&=6-$_!p?&`*zYGoHQI-NtDMKi;i4H>}jhcDw<3W`^FoAC$0H09+4Z9MQU z>%Yxd1+=LDX)9;rWw&tu!Pg*r)@B-}fOWSxn1!7Hu zAuLYXTqF_@2Q827Wp_dG+Kh9V3v_wtEAwy@%(%twe0Cy@ZiiCX1oH5H7e$3JcgpNe zExS4wZx>)D@D!e+JgR?Cuw7;2C!_DIyfc~+Y#+e(!8z6Tss78ObHGm6__?U5UD0b8 zKN|p@IkIMsHzfISB(Tl6-Q>aT4Q<8`NJH`*HB&7CnY_J7o-BFI5?=%s*`Ss$sAJfn ztb7aj@)y}+!HIu+Y>1*@bswJi6hfHf^Tym4NEOy~11@AMdlPq?J_rhbab|U^P^Y%o z$2M89zd)$#*e#%R9Xk+DdvUjEU!Rb67t0Qe_kYpKHF6u+KD*-M-3^%i8^4z-+h>3u zV{pLwet6jygHyc^vmJ&H#(Q)~uziaEPW+SOZGDem`#}GY=xt~=(SCVsx&y{uQ(}vd zXhg3hvcUu<5}0msJYyo!eGV9tP2}a~^A{!&O^4rPl7QIYJ784Qqn(XzM&c3MF#srb z;}S57jyJ%6H4BE0$AYcABMQ|q(0_isJpRJyjWC??o@x%9&o13Cf8-%LuS+a;63M&J zVP{T?j_H!w+)2zU7Aj`IeKr;I%Lh2}tUidIhgVIpKI>wXL7`Ym`?fm!D8p(GFzaaw zo}#c9`G*GEFIvyB9uf1mL!+CB9EHbXNlzo&{Vlk z@LMy9@9@k&-k1beF5*Tdz~J%&`rLF~956il1U5rPdqGCam(Y_E z%J$>Mcf0!-!ZzSdr+D7P$UR`(2^^+(R$7-zsteyJZf<$U_z>|tJ9!PBXK*u5VmJ$R z7-!fr#L=v^a7BLVKcARl^RQMz6wQ++zK;LfAd}tHzd{ z=tEl!EaqW;?=4(uZfK;wW^BV3q%#&#|LZ#=ZUexG5I#XYVyst^W6_@ zuG+F(Q&@xfG38t&hU!uNXT$~-@o|QmV9T;mhsPOs z+e&mmp?=V#!_va9h#{*etZ25rXlp72w8T#xaqO%bgdb>(8@(UDqlw;c{PQKgp}b|c zZ^L&ndb4rvz#;kvcbj|ChByfhy-u8>@L@+~2+kNCEY!a)G;@?`9kN=s}%dlK9r6vsYPUV6}?+3KyK(=KD+7hN`I)+{6 zW8*yHkOd?!)pxpK=Brf|Fq9ei`3azd?PsV}uXD7vpRv9o*q#FW9S1f6rmTk{kW71i zvVfD-pI;*aSP0a^3mjkVl&Qhzs7kN6%w-F{v`i2Doqzib6 zT6IcfZ;1N9c#)x@;6NsV?Zeb6H%O-Z$bQ^o6>Kk3tG*LS6s=ztY|m4xq5{g>$d%7X zM8#QQ1Z4Ubs#RAYF`53aMEr4T6@HtI=|3RgN$bxEwokzuLO&m)&OuZh`4jTO`#1+P2F2Ib=Q$;E5em7>ypB>VjVRR&J`!!CVdBHI8P+Ph*~k`p_GE-07<-he+IL zqu-o~Y2npjw56J1PT}n~4|17RjNa-pCRgIDPDkGr${&iq%}BzAM10%zhIb%#pO`S% zaF-#K$b57kY%k(AtV6~`@@8#hJCXZO;O1p@Br!b$%#D;dkCJf_vPS1aXGiGCk|3bzb1IeNn<220K7%{}T zzoNC(Y}|Mh&hLi257&PI{%p0%i_(#;i)o>iMb{BLeS^_!H2=HhfGV*2E=z?_z#<3XSmtfSQ zcVPp#iW>)Au!?oZIbGzRNlZo(U~pp1$375H<7H^W0wmfy4nB+}qgdjc(?t@L^z93R z!QtXzZ}V2GD%CP#xT*DTCOT_h@c1Mi}*+7BB*-TEbd(~ucC7csFaVz4iQ zqGNm-;m_-IQ3sKem}k1ee*!$)*80LUaA8W3zi%Y$1Dp&QDG!KDH;s0GPjVrm@^|r$ z{KtRCI0TA&E#fyM##w=EE07}sFaTlHA2R-cB|SW;MO~CO-Vp1-!?sFZckNHH&5E<- zbiqc8GMg!m0vn(2JTFof)73ALZI8Yezo-QT@jc%F6q6h?}i{GI%zMn1DqidPQQhqN)Q7A2+>>GyxYDN8Em$?3w`3j!(~^M2vMPKe8r5%S0V=XR55Ry4-m$FSnuwk=Al0rnj;1$Yb&?WtQ^_**b& zwya7RM1fQq`B6V`!8KLc%DOW`-YUMu!z?paVRI{E)<*_Oe5Gq*=ynX{OB@lFul0iJe3gX&n)6+c(7}RoHRLI4&;Cy z41IbPmaX_n>o((>Lnt1en^E^zB(iV63TawdySO#t;2^qJc8OEkZN`&i5+-P2-nVKP zKV1y}N@H%%)#ZS7yA$n#~AgitYV*spwzv^*Wt9nlB&;q@E&DHxDybBE^nuCKTY09h8m&@EwWzWv3V5 z0v5nw6+q+%d3Na~$mqY>@swx}I1yQfaCs$0DJEpICO*GNxB;AZ*>R6@%#chxNV$uTz!U14$ZR!YSnXWFc^Gqqff)k z8N~4P&)C0f@#A0BIP0>i7k{h|=v1KjoP|X-T-VSwcUXPs*XPn)#F-xt0&1JAH2T#zM`>jxWSZuR7qk}f*VMA_p2b44 zgOy?gadgXq$>SLdSsM5{*ryvSC-C09*lVkg#Tpr-ssSa0`*c9ycKAV=z4u_k@yCC# z)lsVATBLl3F_DqQWe}-%%C@s_>h2qjwkuqL&PO&MMs@y<0cO2r!mKjo{`oMg@{sZR z5m}|DFz!%&d3N!CsyJQz-4y>h3Mj;zmHi^x!#oP2RwH{X^g`VIg*#DU1mI#uo)SIN z^4y()1L@hgArF~C(I!s|$aCq(Om%?$==^$$Em`}=kt}O$(jB>Rz}@ekH_Qj8V{Vgn5!hA8sQ85MyMek`kIRu z#i6eq<}~odov03;AhhA$HF5aKWUON#fS2Z=HU5?=p0lxWh8VfV%odIsY|F8wt^~ks z=m{YcrP*FTn*~`cYi+iR~@i4TOt}pRLCmo%p|~_K#yW%?48 zDQ=_fiFvH2n8%!{+9o*P3UGg;MYn4pV@(s)>>smO2W`gxd?Jm3sOV*F#xP_W-p5wb zc*MY?*U2<-x8@I`C}Or79i1I2%=C<(ni&|1n|d|8YOe*Gl8Qs?@N7=f@@g>;9ea}Z z3qDjkuHJt;eqzcKhP{AGDT4nGZQmUqRq@5UAz26|EG-hH7?6%2f*>&jNJwAJOUg?ms|`5)m0z#-!4TJD55VNuqO+4~V~0%JrIK6d~P zV?;22XJAFWA!!?Uv@2fL7X!}CU!Knd<`0BLf)Px&oGa_oetVot_zOykGeketa&q~E zvtG|=#Uqp5JTfU|YsJ#rb73kr$>nRtvP+&Ks}$$ECy@~J+JfJ}iY=i(x&;{fjgie*wnav-;KC4>P)ZV^r`3?13n|=&F3Cv& z*jLtuns3GNh&Vx9fasm?h6^aB5|gjxc%f$_KO+%tuBXzzt$5Ucs{?Qi3y&Il!hS*H zt%%_eYg6=ruS4P{Ea}O-fbbN+*fr|8D1b(eu~e+6fz#0`@2j0#nYRj6Y)Av@}4SO9E6ty2Eo;- zAedW%Q#Ji6?q7MBfbHZx|2u+*cfk?}i)$y0c(!Qx8O$Ybkl@Iv#JP1mLkFD%`NdZ~ zIT?_X6>MPGPjBQ!S~|N>6s>m$@5RR%{!GkTI5f39YvIV$V{*z%>uIkXzC|CJmExmQ z*T9s(^4fvrnd}&aO_mwH)enNAd^T*%i*yLWo%3D??yxX0Nhlsx|BBuLWLRPO^#{(vlw;fp**Nth*LMHl??7P}fm%SbbSMD$=!$D^k6ui@5OFLa=q%2inm1hgZDzE zTfhra`r8|k9?mHuZjVzFza!LV-r1b|81UOx`PUCH;)47cX#A>*Nq!nD{icEdt)Ev@t{L1X(g4U^mq>~%sX(Yz;EG? zaUE?Zs3Xk>2NSq{aAOufdCMyB9eNZw9@x*m_xMt<31F=fy?=sl<|CKzmn<(hT|fO^ z04Mvy4tM8}$%uGsU5;dx@_0C*O=2FV4 z(koo*)`@Lcp(e9Ud#xEYqA>>Q~5q&dq_E{T6-eNnC3uoX82>A&9Qp=zaFhB)U-7ugfi-3uYzyfqBhUP z;sKj|N6QOS^$35^S%xZvSAO*5qZ^_WVHE3*ZzUsJvl`02H%C%#&nc(GS$HDmv|^lG zVoW&bjJLeU6%XUkzqLMxEhah;t1N^+g!0Xl^0Urz{z5_G1GW@D079+4aZKwot!@#M z>y-dUE{@HGb)3zJWud2dp>HyvFIa1T1kbyJkrTdb6RTV+R4!}>)=(akL3p{;P)!)y zN&ZQr#MHAIWxk1{0GMKrlS2h?fGdH!5GboAL1#7A8O2pJqZ=5ZjAE2bTwzD~vOJ=; z1QE~3@*bywdWLuR9w(rlF%IAba6FfF07^o?VGjk*f^yZf#Qst}iw^JOIkPCcnV%(s z9YDE7pG#ZzwX&M_-q0M)rk?IFo3~wdTsAL-R9*agRGgSOg)QscdKX7`W8IXj8$Q`T6Qwy?f8zWod}sE z(rOo7s;t)VEmJpILx$R-MHZ(Z0HbjV>^%G%7}AY^kqSmp4%W41_>yjt9ZPJ@#866K z_%|T{-4CaxO!eDKjw`EIvC6j6c?64OnV8d($(p+QEKt!)u~-QAfWj68lC+ z1P(*^@^e8$=WGn~SYibO#hA#|jwH;*Rm|lZXX65vA22H63UvSB>p7SH4gaUNj&weN z-_Yi2;m+UTLCvUPv5aj9IXNQBUo4#Dwfu?rU%^kf;o@@t%Xq-0=U7^VG9JUTZ)U@Y z|9(7_ZwdSFz%Li@$#d|K)@?54BSjgRO`;16cZ6M7NRJmP_ZN)9zsc1?<#7e4y4-sR zl~-2&3xRp`*mFO@zew`AOk&$j?She{W=sW#0SR;9i&9V<|0V>)**k7>mGaGH@!>-o z%eP_wZOUiZcf=qSN&fRXi986A_usUHau-N0@<@&=fbUS;1bOEmAW}{g|9vGt7zqT^1}09rk>BFZ zpPhDJVXt6lef;dSV}&WRr^L>oSjx)SYMc2$0f#a5xG)X z<6t>na<47_x#o-8z*m2Y@@mJGp=zvWf|GCiWn<Wylc+h@>xoqmqDezh1Ie6iIdldaI+{j)b{#`pJmjBq+v4TYx$^M}-n^y+}~jAQyyZMl^rVm)sHv)(Y9 zLUM zFSF6M%GcB9>$)K@FU^9!I3CnfgX&pOF+m&(qmtHX&_PgDa*q&1pNS}_RD-rz&|HEz z*@}WvGnGzHTF@AR*qcW|JvC^y1@%5Yx!D3LxJ>EOjsW=Ld88~~^HZXBIJ%gDIMI8L zlf(d?W#sOOfbPsY&P*}eqmsCZzXvz0wPYWKID@s zQd@L23Kk_@-Y`z;%l1mK6$z|*a~10qu#_cUZU9qp%4balSSLteWeQu^Z6|_N{!_s& zx3G1D#TXvaeg~1#(k<*M!fI4VbXS6caotF%-$>^Qh|QG?3>=%-=6cg1giGMBCR>rJcgLREPuTXB zJ+-{JpNejjIrt(VZHvo9fP07)ki1cJFMEN%4{*GLONUvobNdW?Xz&Y?C5w7Xow`OR z-)WuS9)mr{cE$J~82F=PF_iH#LOyu0bK|e`0|;On-g$gD2CKM6w<6fO-6H%yZbL%7 zlU#O5pg0EwcsUMGC-;z-`tCgkhB7bpZO(~HENhAXHOiXcf3>m(_@7jkjQ>?JKPjt$ zy3&ts7(Jmxu;>yjK;(@+Nk6=&cqB^SX+dSMH-dAS+mX5Bx2WkHt~OMhZ8+;)i%34_ zmt^>0HmZXuQeL?E#w%s>^MqTn;iMPAE%85%|NJZQuNtqO@DAK_AO^$!$3cnOS}ip& zA?+C`=3YY4`Q&yGgE}+oA}7!?_B;@C*DjPFnE#X{(ETXSL0@Q5{wCT>*Xs* z3b&g8Nhptr_yIXHur>j^lJCdi{0z_8IleTfpl@E0|Fu-gNqPsP0BVRI!f}pMjNVE` zIb8S{5FAr#Xcm#3X?P&g_+2{x*nXGUs&5x;{QIA2kb` z_xPr8^4H1ujP2SQS-AbF4l@41SSsk>h#yj6uxAER^RD=|Uv_JF)%jN<9Il1L6Phjb z-v(UfX50~ty!FY)O6QN!fd%6+zTiSI$mSbVrb)n@qltz&kQB|R zn5(RqP7t%Q60%JdeM|e6G~Pw$##`EZq|x=$ zJ&1upSz!%nyzkTf+|r&Vtr}@1mUbs;e9y#v&C+I(R-Lp*ENv`lNu)(AZ8&LssllCW zX}w4bkd|+0XOUKmw1Jk^fVA4ArCVAR(&~`b($aou09swr>RQ?!(m1bK7=v$PeYq3vR|YiW;@hVx^eyV25aBQ1rrmo04?X=wgF_W?`0iZl$ycst(GhLDEI zjL)5DX+228+}Gz`W@&9nLmT(G{Vc6MXsCc2`k`xv-vj{d320*hzr$?^fJX%YmIhR{ zfR7bmwgAA_00;9lWtP_gSP73kpZk%eEhP<|kI!9aX}6MwEd{)P^1LNZCb21j_gGp! zY3TZVZphLGlGcp0>n$yvwC1FZu(Xz>wIHpJrPU=3Zx8s~PL@`VK73^>(oVOuGSXU; zR^8G*A&qw%yN5CPQyFIe50ib>SM@7D4v>E3G6vDF;6@~$yUl{{R^VkCyk3DjYA}v& zeeOdRe2oIn)8Hiv?Dv9iu;6Y2ZnQ6#YWN4KIKlD~=MqMv-y61VOUziknnfpv+K1oY zoPG8TE%Vw-p+C$H|QR_ymF%w40!O6(u<)0JW?pS0MPR_q2$`q5Lbz(~xVI=B2C z^z7rYO$Uu1hG_3d@DjpyB$&?_dL+mIURgdDy2(0iEp+xd2?NFQ-v`C=7~%3^Plt9< znaWnFr^TdxaHOQ3S|Rlg-qfpjQeO+aN_~6%nAC4prE`@{{d*L>Qw$YV>YFjYR}t?( zMD=tIrU`Bt&BNkwrdUQ986Q~2C@|cOHh4a9aM$#?H(H??q+!m-_sK?BYD-ePLAKk+ z((01dowQDtR*v*m^2##zbW5WSD>25R{#)87q@6|DVVoK(tv8a^k+g3u?Pb#7HRyAB z2b01*KpLj8K6j0!Eg&t8w5Kg?B57SoyVKGxBkf$$W?5Q4(#|7otfiexS~_XNE$s}_ zx{=n)(gLJqkam`(9mV8qWp~mVSlT|)(rK$Imi8fO8KnJ!&2^QxwWPHrZI7irPg*}#uI%y+F za-E$uzh&Lr(1MiC`%4QcI3``pr=CJozM z82>HpPSVaJjqd9z?kvzs{P*Ahj(_ZLa@Z_81Cq&J zmjSr_WBBfXUA z9Tml5VEl!QmOM#*61IhI>gFr#6zQ27_CF6$Fj8+DV&5dPIdTA+E>M5Aim|h#Cu=cf zG*yhY@>36f{{E{eA|6*UrTZI!I$^MQ^EAq(xOjB@{wkn4V^E24DQbyxHCi<8VvMB2 z$)^F5b+K25!+GHL;0Y`3@W(E{!H2o@4iH>^?#|(yh+FJ<2{>+605PZP_Y+$KDcAcf zhI;6KPDQxH|M6w2G@TD>ai0^O8dx9oVos4g|73`bB+bD8@~z=5_;xYARrdaoqTp!v z6r>f(xSz2D^LP9#WieXfb#)3bF1f2oqqlscYe|;uwSpjL0qQ5d@)c=*8bZjN`@F!pfAL|3;r!xOu7|HXfuxF@X^qeI26%TfF^R4eh~$KhK&&AOO>5>Wz#+?! zl%j+>^ViL)#p|rrJMlrRRpDV#mJobDA8+PQOrh(koKuX2)#-#(h6|y4VIIb`aIs(^ ztv3WSJLf^H*|^xm?O~`^sgh`NoKm5h{M6ft46MFTq-*s{0sCy z1f|~_DmK|IKM6Z?^ZyFQ-<0Uo`VqUw{%SHsNqSzG$*;>#y>0k3%v;b0yA3WT1-`;_ zaSK6Vy`FF2_|*RjwqDprY($GIYb;)6pkAv4OjL<%K!ZjJ!i(%V#Lq11c1|$=J*bi` zY=3|Gf&J3^rA#{S{bNPvoGb26IJ_Cg8Uv#MTwj4xmB^jJ&`sJnV=xtVW?{vKUNJs7 zh!n!fS@@5h=v!>RL7N}sCt(W@lp;M7;m{0f@@B<+PchNAB-fBw0N}M6BA!r)7Y#!0 zqV|8)146^K%vZ7A#65D0yOtmhSFbjLCh8y_qDkX_X71}yln zmci{dNzBi!*=8zY%Pde;Rz9Sxu#C|S7HuMhI@0~Wx@gJ0#LJK(|aF5Ke> zHM-&LETg|{;Xr@VslV(8;jwqx5$aDxD#avKl-v=^V+hGoLhyRPymd0R1+q)TT_aO{ z&^6L%6?Vrky8VdZ6n#r1`F7bY^WQH&-O%KR!Ndt);-i;aa2_4EF-Y&o!{2m_8K#=zI4W*D+!iw&t7;28p0VFEP__pJzwZ= zK;6QPc4H$?JS~O)y+%iOXN98*uneRPA7 z_+^N~4rKxaIkT}GUyXVOAKk)Hp^WR0nhzgK#(t(o|Fitj`=FfF z7yEiroPSw5*u)g_>}78hIs^g-^qMf^wjLxl^_ zjU>0nJORWq5LvLv+Z59*A*Q)wnwp>j42b-05IQ!gTf{ z@Y(2bx)JGoy+D#~lAna1WZw6h8tQ)vMh0OZOuj-%x$8V8i4+sS;2h!#Az)Ls(n9}q zM3KXi3jR3Utp9CoPo(Cw#T-dpe=dXMOBlwT$(Zj2^YKo?G_=8zN=_BQU;se{Vw(sP zG#H?gUffl|R9VhLCgM@Pf^eJ<4v)I&vN{-6ejNLdK75Khl6(tyBqRPi`IFXdXF-*+ z1^^Y3b-iNU#GjIcoe=Dk$$BV&}GI|dF`?L!a?#sfJ?f5imH#8Z1 zFaSUE*R3QjJ20>mH)XbRx-ivntEg*K)V~@NLbwjY8pBHZq*5wfIiy|Trzg5+1bH`V zNgr$pAn86_kyG1iprg`ukka-d{)pw^F%8T4o%L|K`$e@s-o?ty zX$5+PKaxy!-EAxqM)Cs1U(BB{nnE1(FY#~12+pi4k0S`Y9(?FNmv)FG4_1*z@JED> zS6u|UK^(?)+vyZR3iNIxxa3a!DM{FX$iQdRMUZo@8WMdcHoN?B@|aN-KU6!s0qnoI zB_`4X&RCo$miRkqt>j>72qb+9h_7(C%r(|>vgv$j!OCzlJKvOO0_?`kj z=fTjixJflBCE|JE zD{(c#m973(|nr~QqU2~Epo5JUBuI;Hl>g=5MOtfF<*+Q z*e~$y9o!gE)cMYL*%kP6I-}ss8&m7f!^tW%M2+f-BqIJk=U`ooEwp;UN@Q0e)#Ik<<7r4zNvee>vP=B?`>1+}$M>R-??fNp*N;&?+Oc6r{5v`! zr4kyEnYxgPsgRVJy8IxNv49Z@3Q_g1!xMm$`6I1xl$i$P3x+Glz6vu$e$edi#-s@3 zPKw-(KYHwNUWYF!T5L zF5@nx-fg80g;c!ELw2cUPuA>%PG?qlSQ+oe4JpeAWxQ!IL#&9}z|6^*1&+<+Bm|Jm zRrrxij=_V{awN)?x>qZxM%`b;Q(?gi+$Y%ovX?w-oV1OWc_{mAwYkh*H9JU@6!#z*6q6E|H=FN48>87b#8!P z&wu*+jKEfjlh~4@v-S6p^o_qy7bWgGl^C^}HBF%t?mGddK)ypgW93H^O~VW$K8MGY~1M6FMTaLhtp!l9^&M1LQ8g8pCm`|QO>m4~A;a0|95 z`F7MokH62{p;XY%{Z8%gGpH>!kNW#0o{6F|{ysf`GpD?VF?FBw$FnHhz=AJpqY~2P z=YAY1+ExLJ)?@_b^22@5NV}@|@8Y5j-LsdX7-chDX2&SU_uD`r>`Pp8HZ+bTPk=T! zqrVDu$PFVA)wMlWG1db*Rwos!n;}Zkizu}yP9K+nv*|tmZVkL6RVMp)m_C( zQ?XQp8j_6vW6*vM)b_2sn(FPxA&OG3x{9(K>=LQ{E3YA7s|DUW0tm&G;F2%+(nl5GHK#VG}Y1`AWeLU##q_{(!`f&u%%5Tjb~(TcT2krG^{h> zOn^C>_8>~N+)T#6SmbkSSXw*McP`N6d@s+8hSLJ`<11YHwI07gSJ^( z8EN7hwA|7@Aq@v2D1S@aNLmZh7FpWMq>UzRs--KL}h~jY1~wGKeM!>jX=Xt;d3`z z+CI`+k@l*keMnks(jK<7wWNv1&n=erJZWu-n`CMCkjBNld%2~BNW);_a|c-3^`vo+ zz&+2>Mvx{xBP}eg4{73WQpeK7Z}Du#J!bt3#c#1AY5Ofr{1%0_%hJSe5rc!z-C$|r zw3H2o}{1)k9<6dfM;tbo* zx0p^^Q%e)S#crh4v^4Qs%pmPg3?Qn^#cxskQubP!_$~Gz?gL8`zr~)U6`U73IOb3`px@%kex!Y4Y4N1xk+#Fq4r0Q!vOj67E$wsC29WlY zrInC2khD82?KRQ{kv7xP9wF^=(yq0%2x5DQblmSY_8@% z8a$5Rh8CP5;6{#s{b%b$;9vL@qhY!B-)@U5;FGa(EX8iBVvMyng-SQNU5WiHRp}0~ z15aA)C@c0lh{bGkDTZ;*HkI4ruuRJI&w^<0g!WvdXeYGSF@|t3A0@5m5n)oeVN7~QW?^SWdZ}EE4zOpp&TO3c?HcJz~#T!Ul zZfWATcq3_#S(^AQP9SZOrHS9-WYVTun)oeFB5jPNiQi%&X*@Jj`ibA-O{8_VH1S)U zN?IFB6Tii2q@7}E;T zwXihtTWmpE9ZM6x#p$GRmrUhX{1z`IZNH_7-(nlmc3GPEEuKZ%21^sa#pa~FWNG5J z*o3tEElvCuTak9NrHS8SYtklIn)oe_Anj61qu-+Pq3mmEV@aDvTo+3l4qA!7E&L2% zf9*|~V!3IIaVBFVSXy(^+JlDq{g0LKj7OgnAhidPpIO>byc(taDK}f%KGJ3q_o}6R z$XBQ$jdnC(&!IglcQW*@j1a56 zD|-Rx);P%S-hY)OL+{F;%eD4ca4!S3ypHR@s|uLv5EK*-%T93OEf!lHS7q82`$J&me~TI1a>EQ^`#j>l!PVRspgrv!j*lQA`YZuG5jQKq( zqBv(ZQqbNIOc%?I6i}2={}^&IAB!J%`wt+E9+l;$m5XN9|&n$|C~fVOfJ8e2rV*A6oDg6@QidB*3$>D;eVYcmRHf;pBbd zeVDXR0RGz*u7d01Sj8+*Ou9ZUlUPyL$6SRNY!J%zaoQaF;t2BvzY7pXN_vcL}bKhr0Z?>tj7C8Sb3SpMP@nA@%pZRhq=sg<6g4pF`e=58{~x+Oo`npol1^1T4sSrcvaXLKu=@$cNAgFw z6QCP5vpuelKIq5oZSDGaBlh}`hrZZqL>_tp9^?9G^gjvL$0{*N6(ygG9X{pyNFo2? z`gkc$&@o2diLqQ!6e}<5__(1ilGKim8!&joYh@N9 zTgS(jNQ?N#f+miSm*YVkA77VNmwcY24i?KOLkY~pcP4KAn4>~{PDOw)+qOL|8=>3N%Yy{48gB*(<(iI zE0cD3T$6mf!y`8=S=O6z@~(7wQ5*^U%lU(f;chKt+B30v$2>l0#$4}b>5J~=qKT(Ir z4G3~7w1(u6I6S^0j~OfRV;vq}5E^}*1I`WbeJJsNgTYwU8=S1u;c+4Hh3U%I@oCKM z;i-bIastTWYgo*3a~jmfjJ(7@2vmt(;?H0_{FM!ZcHI!rPK~YcI5|t48sQsx&X>f% z4XY{04!>9h*{2X4$*3Zcx*b{F6A+cm>$Q+fxY2=j|LnOK{)K*vb>M(FyBijFRf~F+ z^P!-MED+1CTuW)rSCyEOTx~+f#cr5UIXvV*v>3O=RDfaE9RB#iISsWVV@ZyxwK?aI zUZT7g=^Z@w|GV2_cG37s*~dFAK8IP*|KPNUE1~Hey(-pe@h%EEgE{IYUEaw#Eq?U` z=2-Acs=-pz*SuG+W1JRm44}v&{>N}8t^5m91Sd|5--D?A7n_2r_=BRv@px38irQGPGMVB?@$|8M;}*2AK%oEQGSX4b;FMMr&LEuB`j8Es#i25^~X3Z z(k(zaEnb8t059i{v{UP}I6yFTTI{Sa-Q@>PiytVb#m0)t~1sg}y3c=&f`Fk2A4X6RPq%=2=cGv%f{ z@K&-7!*THyiWbMkjcN#f9Y4x(@ouo_xVQ+vCH|$L^DpYScnj#tad9?y@K?N2BH-aB zhB48-0l%=#X#8l$#bM;=`;FkZ*bhPL)0ZV^e<%EiPhUqo9Ot;m>4tJ#>{N}y>A3h4 z>Yo(d$vG~zrsHDxbM3fD$HaXYo|VwAsv4mWLa6pz++x{lHT$45gLPi^CzRjf6BhG; z6>$+Tb26?1$L8@;1W=U*;z#m001ry_OHS;!mKYP-UPb#TP(z51;53dR?G_g7BleR^;^tDSotkFWzk*25lEhXi!Dvc^jmDq zlq3ECezf0W0x3lqFL`1%k(jCpz@;#HJ!`Dr;!xwa_!BcxlzcrzK+?5F68sih2}JoV z4v*4L)^G9Z%G6f-Ez(gDev4n>hklFnU-bGd{)f9|rV63Wy(44M3m!DiSm=7iW_`ncWsx>Oby*uac3@lY9j}7L340?^GvL`YK z@1b6V;0)O!Idjnb1G7%W7j2eo2>rbP`xjMrJ`)$1ABO?|@RwzMaQ$nuxX{pM&1Byl z>8T>j4F7;D{`r#G%kffSbHh14w;f7XWv>a&f&TRV=p&?x6xteRyb*NKL;c?GUG^Yq!91c zFU3axR#4Q(4c%fq_6JjaFZ&hCP~oL2>LH1GJNXDequn0gy|1gV>5k+ zDGZpR9Os3d?u89TK#H=x)u)G$l*wkI>bdnQ>hmS2R-alFXO!DWj?rg114bVg0ZC}n zeJ10(grpKm#AnZA=26ML)* z9di0e>JoXl&x zM1ZpABBDou zMVfrsV^D-{X)H*Tz!75KM1fm9nt7!S*U`?2mDW>}Yg5{(kd_;oQR*wKr8=|6?`ApW zl$P~lwNaI12a=Ewv+JxgA*m!ktB}vxfr#OaQb{)Av8W(kRpIwFTxv`}0=i08GJ>Q& zUt>Zd_5mGoCPS7s1yyk78phy9r9$uQk5`P7lgO@c%12~*^bU< z$N~L%oHYt7<-p0;et>O7XoN(HkIhoUL@fl|pH4Ns{oD!>mw6+8#{lnjXZoKo{gpOi zu8!CW8ZgD1$iC0A+gRm~;I`lszMq1ROj7Qj)b3$OVW1;ZWTqIn5&>B0h|?eM2fE^Z zMV7N;i80K7$$r=?dlxE>m0i`y{^=NGf1M(=@JKP{y^{2Ez`ENFwS}fGA@vPKbxe(| zMzQy6!~_OR@A@PIV2H#E8Fz|`yBl%wCTzLXG8?yxH|{kEWa>82h*7&E>PiZ8-n&z> zUmQY!mOq9%6)eFA(#2YiS}Xh&41bC{cJMAxcw6xB2Q(un>eZmQPm2nwiS6SdnYu_3 znFxp955|2O#+Tj7oo-Z#i863E(qX3m2^{c(uL0P-1%6~`+}2ckP$_J7`v750HI;#$ zI-z!qJ3z&?rh42Px4JiOcLZpv(2kx|^B{n3tqLh$>5cs^1E!FC6g69?{2Jqa1eZBz zZBuUTjeEN{?%N13<({*5%x2OBjD8oQtAc8AhZNLmb^&mBJTD?yG1?krUEn7vxuI6XOr{-IOLPR2$_Y9m3$to zu+Q+hH=b?MFCpN*hpXtkMrfwcA~^-mjP(#E&va}S(Kk^9m#5^6rHEU3n;i%~r;*ZL zz6MYA^T-}=*~b=3=4ARqb~~~MSoR*x#`;+7SCj0sEPI`1SJCW)XdZ4Y%YIa|6E%A$ z*+0=~3k07tSF>@BDZ-bL{eflYYxW$?z5{IAuWmws4a+l^?{)N;o+dt{na<)r(ZS5N z5^HOTw`z$!fs3}@BNbb(G{&MErL|rlB2Ux+byr$s(rm~yYamS&;gRA;kQ7VhW7J1m z?-PNwO?wSE?icVzi@`tX#qah8BE-J{yfR|OZK?nxI#1)kKFK`I0rbS3iq6w20bmda z{((GoH9Ds1JjH(WjsE5@t~a4|DX z%T8m!^e8Ve0ETczi%d*4!$+Y06nu^aCO%Z0s@Yk>Ruif9s2NsbYp=wSUWow&+zv|6 zkz!0sC7nMI**y(ZRU*$9DJz@=7wCh-n^qBWL(P+ei#@CTB z{sXNtx8qjH9H1DuN}RAKS|6-yi<|0b-wOj(C+RS3|F?aWZIO+Sv8=>73R_t_F7pWc zhDOx-G^0Mo*ta5Jy4EurtFE;Z%gA(wV~NJfM6|yY0e6;7y;f}MGrXyH0@S2l+f5pc=@Cy z%z^}K))iuJh}-ik#Jy)eJr;yM_G9-@RIE1|KKpt_b5ysND{m>=1BVfT$iIvs0M zTa`~U%4I<`3geKI#xz>nG**X=*$(O64)#BBXQ!s!Ax~1Z_0swuJHBBaaBrD8|4T2~ z+5=vJ#ipqsmEhpPj8z5Swv!?E)7`RArxh z{)*ztQ4MY2X9i3&{T>06_5Uvs3_Eb9#)P>PF1NpYKHdD;O!ppMUZSV_ypb^Wd@(84NV5WMa{F;-Nk^h?pD@G zTKA`)v~?XkxVzDZ#8~%HM#|IWvxEU--317k#9Qjb+cR;~4UHk%Sob1t)I0>-@j9v1 z+*`!-_#1jzA_Mzb4zN78mV8bVLbHrk7~cd_ozycGRrZ`2aSob*Rn=v{B>n{g?%yy9 zvS#6fiC{X6%jP2=N$?^%5P|9@hZ$Iv5g2b zE_NhhNCm_*M4)>UJ!%ngwnD%}Y9I1uFXBf8+&~4y6<)+U3>aIkCA<{#UseZpK2BFq z7?3obM@)zjoZE?h)r+oX_?UwEoEuF@(D_8q^P<04pk)iX7x`Cs`EMG2Yf3wV{A@4( zLBmJS=X2u8Z|3DskKuo7LZZ#b2)VywAz*Vl!0<6X`kXh&-{s}EH+;-Je9m3u^9?@4 z*PEVm6+mx#zOF((XYst~rspFXBBuTFX34(Z^vsTlJxPTQIfD^fHYiJ-%Y~+Qn3f{4 z+Xd;f3a;g<()sYfv2vWh71T2=(S2S`__qBBhT5=xZZ^~8fL!7{%;#{4dkCu~nXsrG4!N=_@yQgTkCoOF+z-Z64aq9SLCk;9?O zDK#O{=L3Y~BMH=j`W%za!RYgv28*1tO-vTQbFT@BoLea8c{FSzXL*dAv0gc@QI!SY z42qGHMLGG9qiVsgGhv-@36d}UkLAPLVjea6z3!Q8O-Ew3yuMQ@mpV0EDK8xO;KBU` zU8hQKo+rJNs&)N6$!4fzm8LP9r+PM@>H%|6ZL4UW=%woJb{Ni1Lppi2Z(+0_;Ari0 z@Zff~+Hal_wbn^#f1B7|8EuxDNB*<+mwUj6*a}PoTO>uTv`?b;W{OnEfN3jN3kpXZ zi}z{m7vRC2jPXX4>}fjz|03QF(2r_6Gw- z`yW`XdAwB5XkQ% zm#qJVx9+ZOHVF4xRnCliJ9Exo;{DQGxun!A2Y5xopfQ>0l?!Xr|K(SWcMCtq?wh#C zWE?WI(V)@!#aD>W_xV?S-NaXp`G3aucp1vMd70wH7vlRI{@+TQh}#iZBe#S`{1-iQg9lh4-Oo2+^0S(FPFFA%2L*F z;#7v*W~5Q^cV7VqEfe;mmBqA5aCHim$HL!?pHna$eqIIDf|2RXQk?6*!=CZ(;GDPV z7UsF7K6>5V;tKv_4vzlBe~j`5;mnP`S>iV~DAsSx6t4OlC#?kyks<#tduT!(xX#)$ zj|%06chP^Wg#Ke^oydReNMOO&h}u8=S8i*3E~*s%V|hiRy#8ZLa*)c2{KtauAA>*p z`h74_3BAZpcWQmhnX2+48;N-Rit3^4wG&x9Y@?mX;G7mL8rkFYVCdV@U_AWF=n1&~ z8$YqN=v@7Y2pWliu?oG(=p~*+4!qD(1{6&nh1pywZu>;Mp>!%Ms8y<*%9wR{mJNhw z*^$7_+p}4L=-bsn`;*Q2yVkLC-1mG$EZ8Uw7WBB3?L+yCOIZ`rPvlaT2!?hkn~%C< zT*_)!i@KD}#};g0!97eslI{%OGroM6wk0rs4ypJ)09M-cZbQXwD6VC5{%%_iwTyRJ z$6n%HHZJscd|+NV0x@o8^S%=03Mw04vjgxGOoi{_(JxugE9Hi9;eQsq{CdLyEvpuO z@%m2|YDDi8cmLn$R79=fBJifnBB?jK>3Gz82MLvFj>jZjTogL0L7EWI|#aW zA`Rqq9nCrogvIV0MbY+oh}t}6BeI)z5}{mfq`UJyQifZN%D^uMLrG_wfOu6nm)oGk z--001be@0!W8c?=IBA`db_kYt55pA1sgja?h!iVH6su~3BKUfd(cQ`O$Q@xI)ayQq zT?(<$igSk~qHEfG1lD4y;Bzj)6w95Y6i}wfEt-T)1r&tR@C!^7lrg0=XF;-xIf*g5 zAtvf(SBUbY)k4WD)fKrn&R~E+C)^cZ2Fw2)*Wdb`k$c!}qq+q1^O|)HuKya&Gp7W@ z_2P0P!`K7FCE|e{KwK?6p#2YxODTsGcWVZ%)f>tpG9F+ykfB5{4obMsDYj6-mJAD* zD!R9VYi)8I_d0M@<{th6+R3H~t%TXa*SN2S-NapAYPH==g0Yu?4J`|15a5*>e68tkvj&dv~bw*OWqQxkVQI zRz+|FE%|i|9%aFcD}sMxzYEC=EVvWF*l_SU`4-F|bbe2RFSg*y1WWbnV!_(Z&uDNv z3;s0SfU8ynPsC+IRKsV%FIeywpBZat$$1+5A*F~lW)Uo=d)b1u>6&Xbp0eP<1Y`CE ze*g<+5E(4THC9w(iUl_(Sk}ZBSTKVCf2P5C7JTG918!9jyh4Ldx8UsrV@t&69R1W} zkU>aZqQO5?ie&I%3*J!?{Qf+|fzF#O_(pG7;As}DGx)Iv*S6rd2o}i)b{lJG$uDZ~ca$R5 zSZpP)vtTWGo(8Y5;CzB*m*q|iW)K-1slm5ca2JAQD`kuYGYD|H247;qRS6c;rCG2x zT>}m7V8LIYXH^-jVZl0sn>9Gzf?p<>YaM6LC&n5KLJcfX#Ll}YMXWK`N`BRXwd6-| zH7yI}Sqr{^U}-7yEm*gdNg6!ef?HY17h15EJV=8FTJX_xAzAvmwic}Wx|SN;)Pi>q zENUFvWiqJMcvypfqZG;DqXaWu=Y0#-YV5jNWpIlH7g+EU6~QlR@Beg0&j+ zH269TK8;{0?!FeRi~CXy&a~hIT>zGTqmc#cexsWP*R$Yt1dHTD9~*0E$){@YK1va5 z+-W6mv|ugy@Kwqht1Wnp1>ao}{E-G1S#X*KUsDmhOoK;Ra19IYRuQ~NgF9L9p3WwN z0Snd{9IL^VE%;S}rNMslk+Ftuu(=xiDW!-t<`XP-e#3&bHCk!#3l@AK!BXoMTCgr| zzXs2;;I;%yeI8-Kx<2n2qwGA`f{&eJ!0ju7*JyBa3x1zqQ6tWRwHo(m@DVa3gHI4F z8T{x&V-20b8#Q>l1y3eeO!u?}Yts$T;D;@^FTqmlrdqHrly(|?qXjpzYV@~YtwwbX z&bHt~ogi5nY^nw82J2j@OjqB6Hxev%{^bLcL2c)?8oZxU#2R-KEdBFl3)cPf0~-96 z1z$t3nC?Cc);b^7;Kdf)jbJg|I14tW)8Kpy4p?xHir{t{+{J>w=?Ka7*nQQpUmz7g%r{!922d&bD9%p+=zwx3b`m&Nh-0ELck(uE9sikPJRe zuoTKCJB>ATp>)#V9Tq&5V41i+XTf^nT1SH)wc!31JfkAG442Dt&@8avRDz|}4YFWe z>)zJjJ{J57miG#LMn&)w8hn}sZzfpgqQAdqGN|XG^ECJXrHD1|BUomPTP;{mdoI)9 zbrw91U}=L7TCi?|PtHNvAcJ>Wa1VlI#(2F2>ltG;EqROu*CALcQkDhlid1&FGF_Sl ze}9(Qq48g-SN&#{>29?=_X@19!|NoQSoOxdL4dO%<;h;YRgPMq_tm&e11m*YCC-D8 z{*m76@@OI~BDYXT*Z&qW077IH+6w~Io=Ai1u(yW$QqQ(}oe#ZWDbcI=0oL%`t3WaS z_cLc#bh^T45)SXoD>^epb_*sUdR9?EE4|?`7jdz-G5ds`S89#E5|GTuq%A6RzKWoC z7#59Dn;5B(YW5(`qB`7;;a^bGwe5}RZ^{2(%sUL0;bzI(@8S@oIfQu3 z`(H(K8se%wh5@uz1FiBDiu$abY>q6|dkNT^c#~Cv+7}D@0D|u8K&_R%kz2>HIC}cr zM=fazNQ>RuZTK1q&tX_*%NI%bMuaQu!rWm~dWd?3Y*12i5oC@xU+&o+`p95t+Bznn zwugGzpu~UH1f6-1pkMh>MYzbaEO=^lq5JH zH?o{h604ZC64BL*T8B(Xa{7%4Nk(%eq3%u#$dlI#k!EL|I7_F%phe54Oi1D;86{mL zY~RL$fL}Gtc^h^?vs|hQtQE-0UYA`9do^$CskFttX@%ZEsQh(=NL(daOuMl|z2+L6 z%iWCtzS85I4p=d}C3_^Pprvh?{ARXr7V-_Cy`w=9|dxra*??9q<>p{xI?LFWw$74>>IKS$@ za7UL@jSAArWM?oyZ5enH0bG1@_$vnPMS#E8z=UE}eo=M@N>4RYKkVdgZ+)C)e*i*R zcK4;RmJKi;#Ikz)lEc*unDxDjU&PiJ~gXIQ!lHcFa zwH0IcO9GuBP+QhPonY3dLbA5(E#Ojzt3cA09f`+S%f5nm*0SF+U@Y4Y(XC~>BS7&1 zn9y3b0B~j5=P@3*H@1RS7$7lD%YC(@5tfP381+8uR)F-*fA$FM%rAe_m}B%Ml&;4+ zX-pR}JJBv@tqt-OLx)Pcl_*}OB{x8@Jya;a7@|j5(Um=-@g3M|#r2__^CxPU5-+Kh z*&s9ToNrU(dx=gKQ(Mwf_NgUr?gAZ(wRxR%vlZqxdpvU+G!lMca~E@sBF;v9_sJG!5Z^Q+ zS~jbzKs%(j=_1(pDPtveh1ak`OL;Y+1@A}D9Ss@iXiH^?!R*3uYDs-Xm-o+Z`y#~Y zYh)K^P+UJNT}rPTg3^`Ww+X8L+1#jl8dNp;g;Eu=TyZ+L7lqEzcPNA?)v@P_oi9`v z_bJHyAEqA(l@wbE>N=u2E0nTTF%0K(hLPS#(Px|3 z>zr~Fs)~I-Q5~!>)+Xm}1Yv4@_!gvy&zgw>9uaTGia20{B4UUZF=z8SNL1y)MBUqu z6ExAr6kVRMK@n6<3kv->TS-|(DgBO<(#}Q`DVN%yNO>DU<|wqer;@@%UH@@X_OYId zRYgiltdyBriW1R*A~u}ish-6T(|X@p83wjENbmX&|TKl7oobBkawefrb@Wb1j=O|vP5)$({l~e>s`=r zz+qH9x7Y%{@&XbG*hRoY7VwrAFo%FQSb4=vl^AS*6r){F64SrT#-8PkeJkOU8QYd& zX~i-$@1&|STMMwXu;YpVYjXwpO(5_^n70;#!uO|p8}}nju(DM*j=^y@h!9>MM$mm3 zu~b`sZ>Yy!5dunB3r|+xfGC4T@z46^2n70mR1AGP$LO2N1cxC(w~?1FW9U0DtgXH$ ze#=W4q%wf2cw`K%0&y~EUcvM>HTK%4A=BH7I^@0xy0XB#Lp&D1F09YlM8K^v5jh=l zUL?IBhA!KVcac6ahMq$F4AQe>=-A2gIaiW?W(*zso$&u4ofpo;4x_)bN=fxYGw?Yr ziTbh833{k^0hG!k{pVU6Et$~{A?U7R!CVe;QkASYMv34-6fjOJqMdEkRjN^^n z6}rwwSR@g!cEY-+#OW)E7Vye7tX~+wrDYvtA1K{M86i=;yFNpJM5f{Y0hVkPlFeImfvI@y$wkqKVFV+cE&u-i^bN=_S+zB#3$o@lxF` zk!s@^e`blulbFNZi~>>RGni^Fka$=Cf42tpFXy;~egzyuU{4Hzs{Wp$64G;rM1(xj z(hzig5Tc4F^?XFO8+nt~{m0a=%xi*|P|@8t8l0dsmx3s1(ozcmlLEU1RL z$-v>$luCmb*slZUGw>w>xuNd7zonoXYJwWKLo*Y71=Z0e5}j92Gs>_bGYL+3oL($t zC6rbrdt>h-=-x{qk(qF+VWpGKVioDLL09%)I?&qxB=$hZNy&D1K3j#EH%$pmW#!nD z4{mEouJ<}=Z%Tg8|4Dug))mNA;yyc-+V@^6;>`9|Px8A;a;t@}{F;hU#?oNMK!kol zu)FgPYL|QGiC{elV_C70JxSO&FRYH{M93K|9OI;w2bMDtbY<*^7`(y;WkB7AAmu(i zfQ?@db8lFTEQQWCK~~Z41|gZU6e%oNkA)@4)G#2m<@GmUo>YIdK}mI}PW5bWsy(a( zNp+2h!c?zgs)gQENxjfO#EMRspg|Quoh*oL#JPf?wiQ7&Er@N$=|NECiXayiMCFOi z(m9Qwuc0e@PgUok)7uur=IZ>0p!;S;&?6Q!ilChY-BS@X)q>b+o#zRfP!V*21+j)W zHxtyqBB+A}1qm8WP%8oHwi=nV&Z!;?>PAp}MbKUpm@4pJB7(b2^g!2L^J)o-LbhCjM;M$8v5Kcy}kipA4XcITMtK*-UL& zf3d=B*#dLEH6dvUeRWb!3q4C63G5L-rpoa3LoO4O%JCL~>8p}P(KDUNsR@DvFy4wSV{#%d#rFlj~ ze~PGWMPQnNr3`}ZR?N<#szQqwY@DG4eTks^1VAeh@;PtkLZaE66G|@X614x%U7UF^ zmdZ{~3Yt&3c`ETzX_PX-j<0Zuz0pzvecDUvE29A0hXcx!Z`4O#ZbWNwz02~FCy&V zQ7pQAZ@DsR?6N@t&#>LFfLB_ssQN5|QB@zXOo_VHMio_O#B!Ta)y_~=mCyx!q9r6V zlyxjJv6##}dc>r3wv{D1H$^aN>yKh>?YCHI3%`TwzExXFt`sGgs|wM_PPX8C zDuSIF1Prr)Nge) zC*#k9EWDXB;@KuXyqV+1ArZVKlgA)Geu#yHdmxD!)h{WONH%3p#7=FG#ebq;5Y=`PNJ2k zvp&Uwfblu=YzHqQx>~L@oz^xe;GMRs6L59Q9Y9fkLGh@jKiX`FGJ6nopQ<7CMX&fI zg%S&sZg^#kjOQ#<+T#P1!B56xP-NGt4eI!4(3t-8Mj)fD{NpTRCed@Kk;;bBCkFY4 zR0XbZB!g`XvRLxa073T~O!8xU%(rbMF;d4^Bki?Z$?qpNDBzj41C<0hxc;1QT zE@MnK(yb<-bovuPcRlvxAqk#KdV27L1xYEgG~5RXVyc08%~Z44;#23j1=Fn>Dnm~K zkFwMg(W;p-Wx3GErZ(vaL@VIViJ+UP6yIsa!gbDmo0t^Vg|-`! z!m43qNXh;k3x0wVj_8bRkL60q?leK_9YP?g_Zx<#Z2A;}?s)92Tbt_npM^;|&oV&@ z?1(^A;1!0YO8o)^-G&gD37?$I_{!43)j(L@#Y4|G_zCuWU7a%l6y`x}+ylHWGro5z z2}-oTjmF)O4uRW&LDK&^+x8!MTuJ`ZNWKfP@Qs5~(2IG#5R9Zd`>|Jt%F4%cQ9<$L z81}$p6>>R|JgOjj9gs3~GH^7C?V+%@5X*B9vX?}qhPfH2q$UHYJQE`R5n8!x!ImVC zKqDyEi(+`bLNWcpMCa|fHnYYv$I1i6hsf*@75paRW=524U%@lp;O$^+y;R99dkk{# zHd*PR5|srTWi^AWIA(l;NU|j*mhr!gxbm)M8caV($$NnE7HD}l7JKtVbqS zv`F(}%{<3252Mx>bNLEphGy0`Onx$6938<-)yzM;X(PNvCVN&e<2Cb3!(2)xcWJ=f z`-n2aI>Y3JGsRaZ=2p#o+%U(Gd8J~$pqV!tW-ghTig}x6USpVNlG#l$CunA#VFt+L zNir0=Kr_!W%%9`I|CM0Aw(9GY^9ZLVPlFTHi=CnBz6Gk6~6L z6I%~t4${mvhIs%xSH;+3A+wWaCK={VGI{C+<|&$a=sazN*T_s!%s(DdM)=S$?e!Cb4E_Zj9$GCB7K^D)hwZkRpDV z`pHaH%zm2L+%O&VrNvDYv%O{}8s>H~n<-{(%`8LjEH&XJGMg*ruMa9C>@dvR$!wvR zpJ?VX!z>`PwPLQ;%q507oJ^i_AS(}P=48V>kIb_bbGBw)Y?zJ6?5LRenwepkJ~ICg zdv5|BRgpFP*S(!U2unu<4G7Xe0tpgG*d#1MlLR`D01^-s5JS>|NJv7`EubJ^g3^Y# zjXLhzsN=rOj4q}9#akj%sA%d%1JR!_f?wk<&e0}KzCqp8B(|=jX{oQHdG#$j z{q9~*Ay4W=x4aq-Yfo6?bu{nYWM4;f7X1)>^bgV3(Tt@Lz{N4H+?u^|BTfH38@bWL zmtkMmkw+zr*y}>l9Ccn!k2wS>znAf9TK;`pflmY=n07;Ve#zcdH%*8- zLB$l=>Wa;vJ|)w$X1P)qPxKV+^VH=e)OC2w9oX(}2qrk!y-EN-0UeXhqRewsASTHj zc-`HwJ2A((Ze!p*C~of`MR5@nLz^>as}+BtObPmj%%xOKOSJiqx2Hg9x%F1jh?}WV5kFr&jVwFx)9r&VouQ4mtx~tud4N~-d<3NxC_1yo?yEc3 zffFn1?n~@?-4r!=+bvMX069f0KrVoL)m3-!uxxR)6VX-{H{D2@x|uH0`FDB(yPHty zEL3I)m73?`X3pk!d;>q%oeq9t1pgfHo$IO@`y*RN0&_IcYC3SFBNCWSU|ls=5smz* zUpV(JI;;y}Hw_Gj#R+oFMG4Y}ACi)l?|peVbG{|rn-SbyH`wWX7kQXv&h_a;H$Cw zkZT2YC-C7&;21(etNxbjdi$ur2TFzGo^x;3!3{`U|)mfXu zu0kAFR#A8&9@7!+owZIK(cXDwFJufN{;VV7oVEL*TyrSSdF2)4K*WtYf_tDo&=HOm zg9yAv2O9h|B7ykV+Wsr0T=>`EU%kUwdq3XYw_9OLbedRa?X{NQZ~NEQTK+}a-@;kz zv;39X-_luIjDPnzR^WUc*v45q34hI@HY<|JZI%v2=LSN0Li1S>FK2exz8 zcC`GtwtsD`<@ad6(^>l?D=S2^wEqNW?PvIRzi$PO)`8uewcGL69O|}W1t|yWz>}P{ zPwBvubeT@mfgPN+_ga|!Z2y(lzE-_-hW0)Ghs}4jksJecDR&i0xndu;qVH`-fA1%YUEtk8sx3U0rM>%VkSpFMr|5|Qoke;yoqn))gqWx}Xtq1?^GpxX?HB!E_mL-egO_u?W`j_x*`bLMqq(9L7KX-S1n0^L5~O#(z`)+KrZfp^l&6 ztbNS#mui2Wv-S@ByS0j~KK48vc$Txaj=-8jXRXMjhO>0w6yJq4ho-D(N5GjnV4|;d z&s==dw6DN76Zcu#J=Hg9j|bm5+Bd`J#y#6|FOvatF78!_S~0wRy=ayox2SlZz)oJTKybWhFLz?ilS{w_k#;2V?hW#@x!`rnB~R?FgSo`!Dj; zSMwV^Uj!fH29F5I+GvuCZ4dVrei1z1_PE3|8_zyxLRN}+y73~o^O@?t4WGAkK9iN! zu&YI@tvLE|kzT8~6$$%CPu*x*anNIu$e_5PEfSHLvf@LXT&D_b5{#}~mg%XR0>we5r2YdW zCH1tp%swkV5v_5KZY_D8T>Et0t_b^d$;rZ+As&%CY+is>W7r|uQ zkq-UoRm-DG_?7L^1^m$V=<@BrBVD13cP)jb>7{h>SriVpRW=+}(Qq^^*`gN@hxVN6 zTqojws1H29E;hKfJCC837+G|Uu>DzFWm#9o?UQxITw{sLh2WU7IV`NRZwh|3?Qm#> z;m>;3MKy!{GU>*^=B>(*>nuOz)#>k@C$L?@^N#Jol4Ngi9auHHoDI7ifh=xS+qruv zvu1?pU-4{;kojV$O$JF1qeT$B`UaA{!KlQg7JE_gPzy~uSyEizId>A4h zcMBA_0-H8|*>X)mk~~|~d~B>KNZuHX<(KK#Wc89FJi$yE!3fP}s6IPdig6yr;2qhm zD(2Zl@lUpjl`A_6q5dszxyfF_k*iy(XgK$Un!!FgRaSxyM1RrQ^2g~tLoWIPaP_Di zuXinD^cWX%tGHJrgthn7q`1t^D?YZiH^bD$JtVT0ymXYO=p`BIYhvOhEz~j-SNuy- zT);g0-tD9XbQ8~ucy&w6h<#8dylf`+24iSRhC8_F;ysznq}iNqxdc-;oO{jG zq(R}P6VG7r#L|x98L}}LLrc2XWG9`@wWYhc2T9d#bgsUdW_y`QFciSFafj`lQhZ&m z?`@AR*P|qpLh2@c?m4?j0|i!tt|^E#=bC~@W3DN%n{rLo>6CX*Pv^SrOwqNy^%Tts zL`~6+SJ>}pMz*WMO}-UwB0MB9@UvbfN3RSSey24(uN*9O-Lj{Uz!(B`16*ha=8dim z`4g<(DzU<@+H*Q79sc$@rTl(pzMZ%mOWZpYtfy75ht@49p*EMk#-%8hri}>&CTdJuas8xVQ}r zF4cNm2Vd+494fGVa|w8ce{{*J6)`-A@{Hq|&a(~Al#-eiCLAzZDSsE-Ex6E`M?CiM z{Ls1(!`Dvva!Mq(VR&Mce;|)IHkroKy< zdN42G6ZXDLca4XIGdJ*Zeqc*pfS-wX2lkgR&rV`8PcC6?Y2jR#oiu}~6#IAfTQnt? z`HJM1&+pe?x3OgPe&=hkt4aj#k;jnYdT z(kflWL9Q5z)oTyAr6dqN?(zJS`oh)Y;^bZ@IHXhhsv&&@a zy%+;tpuw5*V&M6j=i~CZa5v}qXQVYWy-gBuo&H&QUmKyV8{L`xZQ#XL-v_qWJP%vp z)@0?(-Xz3Em*8um0-K#V@2y;x6dTS+5}l{0e5+0Fz&p-$`(%RNw;6tk5@@WyjoZ2I zfCODfkaN8+=_K)dfM@?^(?{(3{Sxr94v6u!Mgt@MUy&^KZ;taN=wX!?_(lS!an<4e z%?ZA?x)Ks1ME7qV?Q1KPu?^ZAtkEGZA2)sbEPk-)1H^>=+e{Lz^Cju^qZNsCtH~@# z6lUrYW||_*G(Ar)BbBSHM>7{ZGBXmL>vu>wQ9d&P^a~jrTJwxal1K2)Ul|YfEIL+N z=lbj<7uv3%FOvAT2IP#~z+n$V(Ul+AmLGT}@MGYOZ0EY-r1O{&V|^}!gO_S$g2!#> zMk$_=DT9(=eNS{I@s~?uzu{c}W2DgZ!*jwS?Ly}VcIO8U%H7q7F$aSG`bA77W^sM7 z)da=T1Z7F1r7=9x7?Y{s4BZ%>z;@^Qwl2-|k5g>w6XQSKx&DHf;ByU9aKDxp|Bl;J?~jv_{b9dl;cZhCdg?Q)lT}Nj7b#HU8Uxr$tO5D#Kp_MoWs- zI=}^?I{#1!@Npled;b>0Hw?w=3|qF3CzY0CB+M3jI%@@~Zmcm(`uJtg@mO%ZgeiE2=NDVagS~@qS4|FBy&#y>&|Q}VR<139`C z&$d0L5S3Ven51MN0qYn=yK5oHvJ;b3Qgg7g^V&^3#)dCIuN^0mk?igvyTE3M8_s%>A1UU#xp;P76cE0@~^?f`7E* zV)k!lFodh|2n6+Dh)|WZU+N*kVkn+-ZNzlF7)nT<9Wr|VW|wb18uh zCYu?by_pet#8b0ksPeV))U6mAyzw;35f)7v7ZO;uJ&`%!!(VA^#cVa1A-+ z)g_-O85L2DhEHOI`E0)AaAEv6x!LmK

    p)B3sAOr+9OUX`v)=D9&Me}sZ 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�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 diff --git a/fluidbook/tools/swftools-special-swfdump/src/wav2swf.c b/fluidbook/tools/swftools-special-swfdump/src/wav2swf.c deleted file mode 100644 index 72919e5d3..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/wav2swf.c +++ /dev/null @@ -1,376 +0,0 @@ -/* wav2swf.c - Converts WAV/WAVE files to SWF. - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/log.h" -#include "../lib/args.h" -#include "../lib/wav.h" - -char * filename = 0; -char * outputname = "output.swf"; -int verbose = 2; -int stopframe0 = 0; -int stopframe1 = 0; - -#define DEFINESOUND_MP3 1 //define sound uses mp3?- undefine for raw sound. - -static struct options_t options[] = { -{"h", "help"}, -{"V", "version"}, -{"o", "output"}, -{"r", "framerate"}, -{"s", "samplerate"}, -{"d", "definesound"}, -{"l", "loop"}, -{"C", "cgi"}, -{"S", "stop"}, -{"E", "end"}, -{"b", "bitrate"}, -{"v", "verbose"}, -{0,0} -}; - -static int loop = 0; -static int definesound = 0; -static int framerate = 0; -static int samplerate = 11025; -static int bitrate = 32; -static int do_cgi = 0; - -static int mp3_bitrates[] = -{ 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0}; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("wav2swf - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else if(!strcmp(name, "o")) { - outputname = val; - return 1; - } - else if(!strcmp(name, "d")) { - definesound = 1; - return 0; - } - else if(!strcmp(name, "l")) { - loop = atoi(val); - definesound = 1; - return 1; - } - else if(!strcmp(name, "v")) { - verbose ++; - return 0; - } - else if(!strcmp(name, "S")) { - stopframe0 = 1; - return 0; - } - else if(!strcmp(name, "E")) { - stopframe1 = 1; - return 0; - } - else if(!strcmp(name, "C")) { - do_cgi = 1; - return 0; - } - else if(!strcmp(name, "r")) { - float f; - sscanf(val, "%f", &f); - framerate = f*256; - return 1; - } - else if(!strcmp(name, "s")) { - samplerate = atoi(val); - if(samplerate > 5000 && samplerate < 6000) - samplerate = 5512; - else if(samplerate > 11000 && samplerate < 12000) - samplerate = 11025; - else if(samplerate > 22000 && samplerate < 23000) - samplerate = 22050; - else if(samplerate > 44000 && samplerate < 45000) - samplerate = 44100; - else { - fprintf(stderr, "Invalid samplerate: %d\n", samplerate); - fprintf(stderr, "Allowed values: 11025, 22050, 44100\n"); - exit(1); - } - return 1; - } - else if(!strcmp(name, "b")) { - int t; - int b = atoi(val); - if(b<=0) { - fprintf(stderr, "Not a valid bitrate: %s\n", val); - exit(1); - } - if(b>160) { - fprintf(stderr, "Bitrate must be <144. (%s)\n", val); - exit(1); - } - for(t=0;mp3_bitrates[t];t++) { - if(b== mp3_bitrates[t]) { - bitrate = b; - return 1; - } - } - fprintf(stderr, "Invalid bitrate. Allowed bitrates are:\n"); - for(t=0;mp3_bitrates[t];t++) { - printf("%d ", mp3_bitrates[t]); - } - printf("\n"); - exit(1); - } - else { - printf("Unknown option: -%s\n", name); - exit(1); - } - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-o filename] file.wav\n", name); - printf("\n"); - printf("-h , --help Print short help message and exit\n"); - printf("-V , --version Print version info and exit\n"); - printf("-o , --output Explicitly specify output file. (Otherwise, output will go to output.swf)\n"); - printf("-r , --framerate Set file framerate to frames per second.\n"); - printf("-s , --samplerate Set samplerate to frames per second (default: 11025).\n"); - printf("-d , --definesound Generate a DefineSound tag instead of streaming sound.\n"); - printf("-l , --loop n (Only used with -d)\n"); - printf("-C , --cgi For use as CGI- prepend http header, write to stdout.\n"); - printf("-S , --stop Stop the movie at frame 0\n"); - printf("-E , --end Stop the movie at the end frame\n"); - printf("-b , --bitrate Set mp3 bitrate to (default: 32)\n"); - printf("-v , --verbose Be more verbose\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", - filename, name); - } - filename = name; - return 0; -} - -extern int swf_mp3_bitrate; -extern int swf_mp3_out_samplerate; -extern int swf_mp3_in_samplerate; - -int main (int argc,char ** argv) -{ - SWF swf; - RGBA rgb; - SRECT r; - S32 width=300,height = 300; - TAG * tag; - - int f,i,ls1,fs1; - int count; - int t; - struct WAV wav,wav2; - int blocksize; - float blockspersecond; - float framespersecond; - float samplesperframe; - float framesperblock; - float samplesperblock; - U16* samples; - int numsamples; - - processargs(argc, argv); - - blocksize = (samplerate > 22050) ? 1152 : 576; - - blockspersecond = (float)samplerate/blocksize; - - framespersecond = blockspersecond; - if(framerate) - framespersecond = framerate/256.0; - - framesperblock = framespersecond / blockspersecond; - samplesperframe = (blocksize * blockspersecond) / framespersecond; - samplesperblock = samplesperframe * framesperblock; - - initLog(0,-1,0,0,-1,verbose); - - if(!filename) { - msg(" You must supply a filename"); - exit(1); - } - - if(!wav_read(&wav, filename)) - { - msg(" Error reading %s", filename); - exit(1); - } - wav_convert2mono(&wav,&wav2, samplerate); - //wav_print(&wav); - //wav_print(&wav2); - samples = (U16*)wav2.data; - numsamples = wav2.size/2; - -#ifdef WORDS_BIGENDIAN - /* swap bytes */ - for(t=0;t>8)&0xff | (samples[t]<<8)&0xff00; - } -#endif - - if(numsamples%blocksize != 0) - { - // apply padding, so that block is a multiple of blocksize - int numblocks = (numsamples+blocksize-1)/blocksize; - int numsamples2; - U16* samples2; - numsamples2 = numblocks * blocksize; - samples2 = malloc(sizeof(U16)*numsamples2); - memcpy(samples2, samples, numsamples*sizeof(U16)); - memset(&samples2[numsamples], 0, sizeof(U16)*(numsamples2 - numsamples)); - numsamples = numsamples2; - samples = samples2; - } - - memset(&swf,0x00,sizeof(SWF)); - - swf.fileVersion = 5; - swf.frameRate = (int)(framespersecond*256); - - swf.movieSize.xmax = 20*width; - swf.movieSize.ymax = 20*height; - - swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); - tag = swf.firstTag; - rgb.r = 0xff; - rgb.g = 0xff; - rgb.b = 0xff; - swf_SetRGB(tag,&rgb); - - if(stopframe0) { - ActionTAG*action = 0; - tag = swf_InsertTag(tag, ST_DOACTION); - action = action_Stop(action); - action = action_End(action); - swf_ActionSet(tag, action); - swf_ActionFree(action); - - tag = swf_InsertTag(tag, ST_SHOWFRAME); - } - - swf_mp3_bitrate = bitrate; - swf_mp3_out_samplerate = samplerate; - swf_mp3_in_samplerate = samplerate; - - if(!definesound) - { - int oldframepos=-1, newframepos=0; - float framesamplepos = 0; - float framepos = 0; - float samplepos = 0; - ActionTAG* a = 0; - U16 v1=0,v2=0; - tag = swf_InsertTag(tag, ST_SOUNDSTREAMHEAD); - swf_SetSoundStreamHead(tag, samplesperframe); - msg(" %d blocks", numsamples/blocksize); - for(t=0;t Starting block %d %d+%d", t, (int)samplepos, (int)blocksize); - block1 = &samples[t*blocksize]; - swf_SetSoundStreamBlock(tag, block1, seek, 1); - v1 = v2 = GET16(tag->data); - } else { - msg(" Adding data...", t); - block1 = &samples[t*blocksize]; - swf_SetSoundStreamBlock(tag, block1, seek, 0); - v1+=v2; - PUT16(tag->data, v1); - } - samplepos += blocksize; - - oldframepos = (int)framepos; - framepos += framesperblock; - newframepos = (int)framepos; - - for(s=oldframepos;s 11025 - swf_SetBlock(tag, samples, numsamples*2); -#endif - - - tag = swf_InsertTag(tag, ST_STARTSOUND); - swf_SetU16(tag, 24); //id - memset(&info, 0, sizeof(info)); - info.loops = loop; - swf_SetSoundInfo(tag, &info); - tag = swf_InsertTag(tag, ST_SHOWFRAME); - if(stopframe1) { - ActionTAG*action = 0; - tag = swf_InsertTag(tag, ST_DOACTION); - action = action_Stop(action); - action = action_End(action); - swf_ActionSet(tag, action); - swf_ActionFree(action); - tag = swf_InsertTag(tag, ST_SHOWFRAME); - } - tag = swf_InsertTag(tag, ST_END); - } - - if(do_cgi) { - if FAILED(swf_WriteCGI(&swf)) fprintf(stderr,"WriteCGI() failed.\n"); - } else { - f = open(outputname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); - close(f); - } - - swf_FreeTags(&swf); - return 0; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/Makefile b/fluidbook/tools/swftools-special-swfdump/swfs/Makefile deleted file mode 100644 index 1102b93ab..000000000 --- a/fluidbook/tools/swftools-special-swfdump/swfs/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -top_builddir = .. -srcdir = . -top_srcdir = .. -include ../Makefile.common - -all: simple_viewer.swf keyboard_viewer.swf PreLoaderTemplate.swf - -programs = simple_viewer$(E) keyboard_viewer$(E) PreLoaderTemplate$(E) - -simple_viewer.$(O): simple_viewer.c - $(C) -I../lib simple_viewer.c -o $@ -keyboard_viewer.$(O): keyboard_viewer.c - $(C) -I../lib keyboard_viewer.c -o $@ -PreLoaderTemplate.$(O): PreLoaderTemplate.c - $(C) -I../lib PreLoaderTemplate.c -o $@ - -simple_viewer$(E): simple_viewer.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) simple_viewer.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) -keyboard_viewer$(E): keyboard_viewer.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) keyboard_viewer.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) -PreLoaderTemplate$(E): PreLoaderTemplate.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) PreLoaderTemplate.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - -simple_viewer.swf: $(programs) - @echo Calling ./keybard_viewer to create keyboard_viewer.swf - ./simple_viewer$(E) || true - -keyboard_viewer.swf: $(programs) - @echo Calling ./simple_viewer to create simple_viewer.swf - ./keyboard_viewer$(E) || true - -PreLoaderTemplate.swf: $(programs) - @echo Calling ./PreLoaderTemplate to create PreLoaderTemplate.swf - ./PreLoaderTemplate$(E) || true - -install: - $(mkinstalldirs) $(pkgdatadir) - $(mkinstalldirs) $(pkgdatadir)/swfs - $(INSTALL_DATA) ./simple_viewer.swf $(pkgdatadir)/swfs/simple_viewer.swf - $(INSTALL_DATA) ./keyboard_viewer.swf $(pkgdatadir)/swfs/keyboard_viewer.swf - $(INSTALL_DATA) ./PreLoaderTemplate.swf $(pkgdatadir)/swfs/PreLoaderTemplate.swf - $(INSTALL_DATA) ./tessel_loader.swf $(pkgdatadir)/swfs/tessel_loader.swf - $(INSTALL_DATA) ./swft_loader.swf $(pkgdatadir)/swfs/swft_loader.swf - test -f $(pkgdatadir)/swfs/default_viewer.swf -o -L $(pkgdatadir)/swfs/default_viewer.swf || \ - $(LN_S) $(pkgdatadir)/swfs/simple_viewer.swf $(pkgdatadir)/swfs/default_viewer.swf; - test -f $(pkgdatadir)/swfs/default_loader.swf -o -L $(pkgdatadir)/swfs/default_loader.swf || \ - $(LN_S) $(pkgdatadir)/swfs/tessel_loader.swf $(pkgdatadir)/swfs/default_loader.swf; - -uninstall: - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/simple_viewer.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/keyboard_viewer.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/PreLoaderTemplate.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/tessel_loader.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/swft_loader.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/default_viewer.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/default_loader.swf - -clean: - rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out - rm -f simple_viewer keyboard_viewer PreLoaderTemplate - rm -f simple_viewer$(E) keyboard_viewer$(E) PreLoaderTemplate$(E) - rm -f simple_viewer.exe keyboard_viewer.exe PreLoaderTemplate.exe - rm -f simple_viewer.swf keyboard_viewer.swf PreLoaderTemplate.swf - diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/Makefile.in b/fluidbook/tools/swftools-special-swfdump/swfs/Makefile.in deleted file mode 100644 index bf411ca62..000000000 --- a/fluidbook/tools/swftools-special-swfdump/swfs/Makefile.in +++ /dev/null @@ -1,64 +0,0 @@ -top_builddir = .. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -include ../Makefile.common - -all: simple_viewer.swf keyboard_viewer.swf PreLoaderTemplate.swf - -programs = simple_viewer$(E) keyboard_viewer$(E) PreLoaderTemplate$(E) - -simple_viewer.$(O): simple_viewer.c - $(C) -I../lib simple_viewer.c -o $@ -keyboard_viewer.$(O): keyboard_viewer.c - $(C) -I../lib keyboard_viewer.c -o $@ -PreLoaderTemplate.$(O): PreLoaderTemplate.c - $(C) -I../lib PreLoaderTemplate.c -o $@ - -simple_viewer$(E): simple_viewer.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) simple_viewer.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) -keyboard_viewer$(E): keyboard_viewer.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) keyboard_viewer.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) -PreLoaderTemplate$(E): PreLoaderTemplate.$(O) ../lib/librfxswf$(A) ../lib/libbase$(A) - $(L) PreLoaderTemplate.$(O) -o $@ ../lib/librfxswf$(A) ../lib/libbase$(A) $(LIBS) - -simple_viewer.swf: $(programs) - @echo Calling ./keybard_viewer to create keyboard_viewer.swf - ./simple_viewer$(E) || true - -keyboard_viewer.swf: $(programs) - @echo Calling ./simple_viewer to create simple_viewer.swf - ./keyboard_viewer$(E) || true - -PreLoaderTemplate.swf: $(programs) - @echo Calling ./PreLoaderTemplate to create PreLoaderTemplate.swf - ./PreLoaderTemplate$(E) || true - -install: - $(mkinstalldirs) $(pkgdatadir) - $(mkinstalldirs) $(pkgdatadir)/swfs - $(INSTALL_DATA) ./simple_viewer.swf $(pkgdatadir)/swfs/simple_viewer.swf - $(INSTALL_DATA) ./keyboard_viewer.swf $(pkgdatadir)/swfs/keyboard_viewer.swf - $(INSTALL_DATA) ./PreLoaderTemplate.swf $(pkgdatadir)/swfs/PreLoaderTemplate.swf - $(INSTALL_DATA) ./tessel_loader.swf $(pkgdatadir)/swfs/tessel_loader.swf - $(INSTALL_DATA) ./swft_loader.swf $(pkgdatadir)/swfs/swft_loader.swf - test -f $(pkgdatadir)/swfs/default_viewer.swf -o -L $(pkgdatadir)/swfs/default_viewer.swf || \ - $(LN_S) $(pkgdatadir)/swfs/simple_viewer.swf $(pkgdatadir)/swfs/default_viewer.swf; - test -f $(pkgdatadir)/swfs/default_loader.swf -o -L $(pkgdatadir)/swfs/default_loader.swf || \ - $(LN_S) $(pkgdatadir)/swfs/tessel_loader.swf $(pkgdatadir)/swfs/default_loader.swf; - -uninstall: - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/simple_viewer.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/keyboard_viewer.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/PreLoaderTemplate.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/tessel_loader.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/swft_loader.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/default_viewer.swf - $(UNINSTALL_DATA) $(pkgdatadir)/swfs/default_loader.swf - -clean: - rm -f *.o *.obj *.lo *.a *.lib *.la gmon.out - rm -f simple_viewer keyboard_viewer PreLoaderTemplate - rm -f simple_viewer$(E) keyboard_viewer$(E) PreLoaderTemplate$(E) - rm -f simple_viewer.exe keyboard_viewer.exe PreLoaderTemplate.exe - rm -f simple_viewer.swf keyboard_viewer.swf PreLoaderTemplate.swf - diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate deleted file mode 100644 index 8237fc74d249dea86d96af4ca0f56e8c778a5d55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223815 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 diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.c b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.c deleted file mode 100644 index ed1a3ba3d..000000000 --- a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.c +++ /dev/null @@ -1,113 +0,0 @@ -/* simple_viewer.c - - Creates the swf file PreLoaderTemplate.swf. - - Part of the swftools package. - - Copyright (c) 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "rfxswf.h" - -TAG* tag; - -int main (int argc,char ** argv) -{ SWF swf; - RGBA rgb; - SRECT r; - SHAPE* s; - MATRIX m; - ActionTAG*a1,*a2,*a3; - S32 width = 826, height = 1169; - - int f,i,ls1,fs1; - int count; - int t; - - memset(&swf,0x00,sizeof(SWF)); // set global movie parameters - - swf.fileVersion = 4; // make flash 4 compatible swf - swf.frameRate = 0x1900; // about 0x19 frames per second - - swf.movieSize.xmax = 20*width; // flash units: 1 pixel = 20 units - swf.movieSize.ymax = 20*height; - - swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); - tag = swf.firstTag; - rgb.r = 0xff; - rgb.g = 0xff; - rgb.b = 0xff; - swf_SetRGB(tag,&rgb); - - tag = swf_InsertTag(tag,ST_DEFINESPRITE); - swf_SetU16(tag, 1); //id - swf_SetU16(tag, 0); //frames - tag = swf_InsertTag(tag,ST_END); - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_ObjectPlace(tag, 1, 1, 0, 0, "loader"); - - tag = swf_InsertTag(tag,ST_SHOWFRAME); - - a1 = action_PushFloat(0, 12.0); - a1 = action_PushString(a1, ""); - a1 = action_GetProperty(a1); - a1 = action_PushFloat(a1, 2.0); - a1 = action_Less(a1); - a1 = action_If(a1, 2); - a1 = action_GotoFrame(a1, 1); - a1 = action_End(a1); - - a2 = action_Stop(0); - a2 = action_End(a2); - - tag = swf_InsertTag(tag,ST_DOACTION); - swf_ActionSet(tag, a1); - - tag = swf_InsertTag(tag,ST_SHOWFRAME); - - tag = swf_InsertTag(tag,ST_DOACTION); - swf_ActionSet(tag, a2); - - tag = swf_InsertTag(tag,ST_REMOVEOBJECT2); - swf_SetU16(tag, 1); - - tag = swf_InsertTag(tag,ST_DEFINESPRITE); - swf_SetU16(tag, 2); //id - swf_SetU16(tag, 0); //frames - tag = swf_InsertTag(tag,ST_END); - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_ObjectPlace(tag, 2, 2, 0, 0, "movie"); - - tag = swf_InsertTag(tag,ST_SHOWFRAME); - - tag = swf_InsertTag(tag,ST_END); - - f = open("PreLoaderTemplate.swf",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); - close(f); - - swf_FreeTags(&swf); // cleanup - - swf_ActionFree(a1); - swf_ActionFree(a2); - - return 0; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.sc b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.sc deleted file mode 100644 index a4d085641..000000000 --- a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.sc +++ /dev/null @@ -1,19 +0,0 @@ -.flash name=PreLoaderTemplate.swf background=white version=6 - .sprite loader # to be replaced by swfcombiner - .end - .put loader - .frame 1 - .action: - if(this.framesloaded < 2) { - GotoFrame(0); - Play(); - } - .end - .frame 2 - .sprite movie # to be replaced by swfcombine - .end - .put movie - .frame 3 -.end - - diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.swf b/fluidbook/tools/swftools-special-swfdump/swfs/PreLoaderTemplate.swf deleted file mode 100644 index afe81349a8ec9d4e0fae12166b7baddc7b75588a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121 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 eECC(pVa)Y8W`_I|`ZnckpI)3Z@6W<>e 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
    }2 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 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "rfxswf.h" - -TAG* tag; - -#define SUBTITLES 1 - -int main (int argc,char ** argv) -{ SWF swf; - RGBA rgb; - SRECT r; - SHAPE* s; - MATRIX m; - ActionTAG*a1,*a2,*a3,*a4,*a5; - S32 width=1024,height = 768; - - int f,i,ls1,fs1; - - memset(&swf,0x00,sizeof(SWF)); // set global movie parameters - - swf.fileVersion = 4; // make flash 4 compatible swf - swf.frameRate = 0x1900; // about 0x19 frames per second - - swf.movieSize.xmax = 20*width; // flash units: 1 pixel = 20 units - swf.movieSize.ymax = 20*height; - - swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); - tag = swf.firstTag; - rgb.r = 0xff; - rgb.g = 0xff; - rgb.b = 0xff; - swf_SetRGB(tag,&rgb); - - // initialize matrix - m.sx = 65536; //scale - m.sy = 65536; - m.r0 = 0; //rotate - m.r1 = 0; - m.tx = 0; //move - m.ty = 0; - - /* the "viewport" object will be replaced by swfcombine - with the object to browse. It is placed at the - upper left corner (0,0), by setting m.tx and m.ty - to 0. Therefore, the buttons are "in" the viewport, - not above it*/ - tag = swf_InsertTag(tag,ST_DEFINESPRITE); - swf_SetU16(tag, 23); //id - swf_SetU16(tag, 0); //frames - tag = swf_InsertTag(tag,ST_END); - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - m.tx = 0; //move - m.ty = 0; - swf_ObjectPlace(tag, 23, 1,&m,0,"viewport"); - - a1 = action_SetTarget(0, "viewport"); - a1 = action_PreviousFrame(a1); - a1 = action_SetTarget(a1, ""); - a1 = action_End(a1); - - a2 = action_SetTarget(0, "viewport"); - a2 = action_NextFrame(a2); - a2 = action_SetTarget(a2,""); - a2 = action_End(a2); - - a3 = action_Stop(0); - a3 = action_SetTarget(a3,"viewport"); - a3 = action_Stop(a3); - a3 = action_SetTarget(a3,""); -#ifdef SUBTITLES - a3 = action_PushString(a3,"/:subtitle"); - a3 = action_PushString(a3,""); //reset variable - a3 = action_SetVariable(a3); -#endif - a3 = action_End(a3); - - a4 = action_GetUrl(0, "lichtfarbe.html", "_this"); - a4 = action_End(a4); - - a5 = action_GetUrl(0, "phybas.html","_this"); // load html in this window - a5 = action_End(a5); - - tag = swf_InsertTag(tag,ST_DEFINESHAPE); - swf_ShapeNew(&s); // create new shape instance - rgb.r = rgb.b = rgb.g = 0x00; - ls1 = swf_ShapeAddLineStyle(s,40,&rgb); - fs1 = swf_ShapeAddSolidFillStyle(s,&rgb); - swf_SetU16(tag,77); - r.xmin = 0; - r.ymin = 0; - r.xmax = 20*width; - r.ymax = 20*height; - swf_SetRect(tag,&r); // set shape bounds - swf_SetShapeHeader(tag,s); // write all styles to tag - - swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0); // move to (0,0), select linestyle ls1 and no fillstyle - /* SetLine coordinates are relative. - It's important that the start and end points match, otherwise - the Macromedia Flash player will crash. */ - swf_ShapeSetLine(tag,s,20*width,0*height); - swf_ShapeSetLine(tag,s,0*width,20*height); - swf_ShapeSetLine(tag,s,-20*width,0*height); - swf_ShapeSetLine(tag,s,0*width,-20*height); - - swf_ShapeSetEnd(tag); // finish drawing - swf_ShapeFree(s); // clean shape structure (which isn't needed anymore after writing the tag) - - tag = swf_InsertTag(tag,ST_DEFINEBUTTON2); - swf_SetU16(tag,30); //id - swf_ButtonSetFlags(tag, 0); //menu=no - swf_ButtonSetRecord(tag,BS_HIT,77,1,NULL,NULL); - swf_SetU8(tag,0); // end of button records - - swf_ButtonSetCondition(tag, BC_CURSORLEFT); - swf_ActionSet(tag,a1); - swf_ButtonSetCondition(tag, BC_CURSORRIGHT); - swf_ActionSet(tag,a2); - swf_ButtonSetCondition(tag, BC_SPACE); - swf_ActionSet(tag,a2); - swf_ButtonSetCondition(tag, BC_ESCAPE); - swf_ActionSet(tag,a4); - swf_ButtonSetCondition(tag, BC_ENTER); - swf_ActionSet(tag,a5); - - swf_ButtonPostProcess(tag, 5); // don't forget! - - - tag = swf_InsertTag(tag,ST_DOACTION); - swf_ActionSet(tag,a3); - - m.tx = 0; //move - m.ty = 0; - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_ObjectPlace(tag, 30, 2,&m,0,0); - - swf_ActionFree(a1); - swf_ActionFree(a2); - swf_ActionFree(a3); - swf_ActionFree(a4); - swf_ActionFree(a5); - - - -#ifdef SUBTITLES - tag = swf_InsertTag(tag,ST_DEFINEFONT2); { - U8 data[] = {0x90, 0x00, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x20, 0x4e, 0x65, 0x77, 0x20, 0x52, 0x6f, 0x6d, - 0x61, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; - swf_SetU16(tag, 0x76); //id - swf_SetBlock(tag, data, sizeof(data)); - } - tag = swf_InsertTag(tag,ST_DEFINEEDITTEXT); { - EditTextLayout layout; - layout.align = 0; - layout.leftmargin = 0; - layout.rightmargin = 0; - layout.indent = 0; - layout.leading = 0; - - swf_SetU16(tag, 0x77);//id - r.xmin = 20*60; - r.xmax = r.xmin+ 826*20; - r.ymin = 0; - r.ymax = 20*80; - rgb.r = rgb.g = rgb.b = 0; - rgb.a = 255; - swf_SetEditText(tag, ET_MULTILINE|ET_READONLY, r, 0, &rgb, 0, 0x76, 20*40, &layout, "/:subtitle"); - m.tx = m.ty = 0; - } - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_ObjectPlace(tag, 0x77, 4,&m,0,0); -#endif - - tag = swf_InsertTag(tag,ST_SHOWFRAME); - tag = swf_InsertTag(tag,ST_END); - - f = open("keyboard_viewer.swf",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); - close(f); - - swf_FreeTags(&swf); // cleanup - return 0; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.swf b/fluidbook/tools/swftools-special-swfdump/swfs/keyboard_viewer.swf deleted file mode 100644 index 3022b28e0d5065b649f4930ffc7a0383998c604e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366 zcmZ<@4`#_@WMF7uU}|7sV0^&9Aj!z!%=G{N|6`ou3?R_Qro_k~&QO+_T3(P}RKl=~ z!55(#s1vA514Ihy$RBE8UwweTn}I)~fq`K^M>|kdj)8%Tfy0*ptWb=BfvKAlVH9gO zNEj%}f-K4c6Lr881sZ48EXI(NnVeCQmROXOs+Uoco5K)al95>qG>U;is#%DkAfqxV zu^2^0gP9%KFm{j?(|8yd^sS0ZlS(p6a#9(lF#)y9GPJTWF#%mI$5X~Ifq_3HGdHzZ z!7sI3At*mLF%N77n8@TTXJ}Au(mcSxV8o!SP{yFZ3>5zlSAb+N&_ou7as~&W8~`m& BPg?*0 diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.sc b/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.sc deleted file mode 100644 index a65af2c90..000000000 --- a/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.sc +++ /dev/null @@ -1,683 +0,0 @@ -# rfxview.sc - a document viewer for pdf2swf converted files -# -# Copyright (c) 2008 Matthias Kramm -# -# 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 condition: -# -# 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. - - -.flash filename=rfxview.swf fps=30 bbox=600x800 version=8 compress background=#CCCCCC export=0 - -.define width 600 -.define height 800 - -#======================================== buttons =========================================================== - -.gradient grad1 radial x=4 y=4 r=28: - 0% white - 50% #666666 - 100% #202020 -.end -.gradient grad2 linear width=8 height=6 rotate=120: - 0% white - 70% #666666 - 100% #202020 -.end -.gradient grad4 linear width=8 height=6 rotate=120: - 0% white - 70% #999999 - 100% #404040 -.end - -.gradient grad2l linear width=8 height=6 rotate=120: - 0% #e0e0e0 - 100% #000000 -.end -.gradient grad4l linear width=8 height=6 rotate=120: - 0% #ffffff - 100% #404040 -.end - -.gradient grad3 radial x=4 y=4 r=28: - 0% white - 70% #999999 - 100% #404040 -.end - -.gradient grad7 linear rotate=180: - 0% #777777 - 100% #666666 -.end - -.gradient grad72 linear rotate=45: - 0% #999999 - 100% #666666 -.end - -.outline arrowoutline: - moveTo -8,-8 - lineTo -8, 8 - lineTo 8, 0 - lineTo -8,-8 -.end - -.outline larrowoutline: - moveTo 8,-8 - lineTo 8, 8 - lineTo -8, 0 - lineTo 8,-8 -.end - -.font arialbold filename="../wx/ArialBold.ttf" glyphs="1:" -.font arial filename="../wx/Arial.ttf" glyphs="0123456789 /:" - -.textshape oneoneoutline text="1:1" font=arialbold size=14pt - -.outline plusoutline: - moveTo 2,-8 - lineTo -2,-8 - lineTo -2,-2 - lineTo -8,-2 - lineTo -8,2 - lineTo -2,2 - lineTo -2,8 - lineTo 2,8 - lineTo 2,2 - lineTo 8,2 - lineTo 8,-2 - lineTo 2,-2 - lineTo 2,-8 -.end - -.outline zoomoutline: - moveTo 8,0 lineTo 4,3 lineTo 4,-3 lineTo 8,0 - moveTo -8,0 lineTo -4,3 lineTo -4,-3 lineTo -8,0 - moveTo 0,8 lineTo 3,4 lineTo -3,4 lineTo 0,8 - moveTo 0,-8 lineTo 3,-4 lineTo -3,-4 lineTo 0,-8 -.end - -.outline minusoutline: - moveTo -7,2 - lineTo -7,-2 - lineTo 7,-2 - lineTo 7,2 - lineTo -7,2 -.end - -.circle shadcircle line=0 fill=#00000033 r=11.5 - -.circle outcircle line=2 color=#00000060 fill=grad1 r=11 -.circle outcircle_over line=2 color=#00000060 fill=grad3 r=11 - -.filled incircle outline=arrowoutline fill=grad2 line=1 color=#00000060 -.filled incircle_over outline=arrowoutline fill=grad4 line=1 color=#00000060 -.filled lincircle outline=larrowoutline fill=grad2l line=1 color=#00000060 -.filled lincircle_over outline=larrowoutline fill=grad4l line=1 color=#00000060 -.filled pincircle outline=plusoutline fill=grad2l line=1 color=#00000060 -.filled pincircle_over outline=plusoutline fill=grad4l line=1 color=#00000060 -.filled mincircle outline=minusoutline fill=grad2l line=1 color=#00000060 -.filled mincircle_over outline=minusoutline fill=grad4l line=1 color=#00000060 -.filled oincircle outline=oneoneoutline fill=grad2l line=1.2 color=#00000060 -.filled oincircle_over outline=oneoneoutline fill=grad4l line=1.2 color=#00000060 -.filled zincircle outline=zoomoutline fill=grad2l line=1 color=#00000060 -.filled zincircle_over outline=zoomoutline fill=grad4l line=1 color=#00000060 - -.sprite plusface - .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put pincircle 11 11 pin=center scale=90% -.end -.sprite plusfaceover - .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put pincircle_over 11 11 pin=center scale=90% -.end -.sprite plusfacedown - .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put pincircle_over 11 11 pin=center scale=79% -.end - -.sprite minusface - .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put mincircle 11 11 pin=center scale=90% luminance=60% -.end -.sprite minusfaceover - .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put mincircle_over 11 11 pin=center scale=90% -.end -.sprite minusfacedown - .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put mincircle_over 11 11 pin=center scale=79% -.end - -.sprite rbface - .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put incircle 13 11 pin=center scale=90% -.end -.sprite rbfaceover - .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put incircle_over 13 11 pin=center scale=90% -.end -.sprite rbfacedown - .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put incircle_over 13 11 pin=center scale=79% -.end - -.sprite lbface - .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put lincircle 9 11 pin=center scale=90% -.end -.sprite lbfaceover - .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put lincircle_over 9 11 pin=center scale=90% -.end -.sprite lbfacedown - .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put lincircle_over 9 11 pin=center scale=79% -.end - -.sprite obface - .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put oincircle 9 11 pin=center scale=90% luminance=50% -.end -.sprite obfaceover - .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put oincircle_over 9 11 pin=center scale=90% -.end -.sprite obfacedown - .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put oincircle_over 9 11 pin=center scale=79% -.end - -.sprite zbface - .put shadcircle 11 13 pin=center .put outcircle 11 11 pin=center .put zincircle 10 11 pin=center scale=90% luminance=50% -.end -.sprite zbfaceover - .put shadcircle 11 13 pin=center .put outcircle_over 11 11 pin=center .put zincircle_over 10 11 pin=center scale=90% -.end -.sprite zbfacedown - .put shadcircle 11 13 pin=center scale=90% .put outcircle_over 11 11 pin=center scale=90% .put zincircle_over 10 11 pin=center scale=79% -.end - -.button rightbutton - .show rbface as=idle - .show outcircle as=area - .show rbfacedown as=pressed - .show rbfaceover as=hover -.end - -.button leftbutton - .show lbface as=idle - .show outcircle as=area - .show lbfacedown as=pressed - .show lbfaceover as=hover -.end - -.button plusbutton - .show plusface as=idle - .show outcircle as=area - .show plusfacedown as=pressed - .show plusfaceover as=hover -.end - -.button minusbutton - .show minusface as=idle - .show outcircle as=area - .show minusfacedown as=pressed - .show minusfaceover as=hover -.end - -.button oneonebutton - .show obface as=idle - .show outcircle as=area - .show obfacedown as=pressed - .show obfaceover as=hover -.end - -.button fullsizebutton - .show zbface as=idle - .show outcircle as=area - .show zbfacedown as=pressed - .show zbfaceover as=hover -.end - -#======================================== frame =========================================================== - -.frame 1 - -.box background_box line=1 color=#00000030 fill=#00000030 width=800 height=600 -.sprite background - .put background_box x=0 y=0 -.end -.put background - -# horizontal scroll outline -.box hscroll_box line=1 color=#000000 width=800-20 height=10 -.sprite hscroll_outline - .put hscroll_box x=0 y=0 -.end -.put hscroll_outline - -# vertical scroll outline -.box vscroll_box line=1 color=#000000 width=10 height=600-20 -.sprite vscroll_outline - .put vscroll_box x=0 y=0 -.end -.put vscroll_outline - -# content outline -.box content_box width=100 height=100 line=1 color=#000000 -.sprite content_outline - .put content_box x=0 y=0 -.end -.put content_outline - -.put p1=plusbutton x=width-25-20 y=20 pin=center -.put m1=minusbutton x=width-50-20 y=20 pin=center -.put o1=oneonebutton x=width-75-20 y=20 pin=center -.put z1=fullsizebutton x=width-100-20 y=20 pin=center - -.put l1=leftbutton x=width/2-100 y=20 pin=center -.put r1=rightbutton x=width/2+100 y=20 pin=center - -.sprite vscrollbar - .box vscroll2_shadow line=0 fill=#00000033 width=14 height=100 - .sprite vshadow - .put vscroll2_shadow x=0 y=0 luminance=1.8 - .end - .put vshadow - - .box vscroll2 width=14 height=100 line=1 color=#00000060 fill=grad7 - .sprite vbox - .put vscroll2 x=0 y=0 luminance=1.5 - .end - .put vbox - - .box tick line=1 color=black width=8 height=0 - - .sprite t1 .put tt1=tick y=0 x=3 .end .put t1 - .sprite t2 .put tt2=tick y=0 x=3 .end .put t2 y=50 - .sprite t3 .put tt3=tick y=0 x=3 .end .put t3 - - .button vscrollbutton - .show vscroll2 as=area - .on_press inside: - startDrag(false, _parent.fullwidth-22, 40, - _parent.fullwidth-22, 40+_parent.scrollbaryrange); - _parent.Dragging = "v"; - .end - .on_release: - stopDrag(); - _parent.refreshDrag(); - _parent.Dragging = ""; - .end - .end - .put vscrollbutton -.end - -.sprite hscrollbar - .box hscroll2_shadow width=100 line=0 fill=#00000033 height=14 - .sprite hshadow - .put hscroll2_shadow x=0 y=0 luminance=1.5 - .end - .put hshadow - - .box hscroll2 width=100 height=14 line=1 color=#00000060 fill=grad72 - .sprite hbox - .put hscroll2 x=0 y=0 luminance=1.5 - .end - .put hbox - - .box htick line=1 color=black width=0 height=8 - - .sprite th1 .put tht1=htick x=0 y=3 .end .put th1 - .sprite th2 .put tht2=htick x=0 y=3 .end .put th2 x=50 - .sprite th3 .put tht3=htick x=0 y=3 .end .put th3 - - .button hscrollbutton - .show hscroll2 as=area - .on_press inside: - startDrag(false, 10 , _parent.fullheight-22, - 10+_parent.scrollbarxrange, _parent.fullheight-22); - _parent.Dragging = "h"; - .end - .on_release: - stopDrag(); - _parent.refreshDrag(); - _parent.Dragging = ""; - .end - .end - .put hscrollbutton -.end - -.put hscrollbar y=height-22 x=10 -.put vscrollbar x=width-22 y=40 - -.edittext et width=50 height=20 font=arial size=18pt color=black variable=current_pagenumber maxlength=3 text="1" align=left -.edittext etmiddle text="/" width=10 height=25 font=arial color=black noselect size=18pt align=center -.edittext et_total_pages width=50 height=25 font=arial color=black noselect size=18pt align=right - -#.font dbgarial filename="Courier.ttf" -#.edittext debugtxt width=width height=20 font=dbgarial size=18pt color=#004000 noselect -#.put debugtxt y=20 - -.put et x=width/2-55 y=8 -.put etmiddle x=width/2-5 y=8 -.put et_total_pages x=width/2+5 y=8 - -#.swf viewport filename=paper5.viewport -.sprite viewport -.end - -.box f width=100 height=100 line=0 fill=black - -.button areabutton - .show f as=area - .on_press inside: - viewport.startDrag(false, left-scrollxrange, top-scrollyrange, left,top); - Dragging = "xy"; - .end - .on_release: - viewport.stopDrag(); - Dragging = ""; - .end -.end -.put areabutton x=10 y=40 - -.sprite cf - .put f -.end -.put cliparea=cf x=10 y=40 -.put viewport x=10 y=40 - - -.action: - et_total_pages.text=viewport._totalframes; - swfwidth = viewport._width; - swfheight = viewport._height; - - Dragging = ""; - - Stage.scaleMode="noScale"; - Stage.align ="LT"; - - //Stage.showMenu = false; - - fullwidth = Stage.width; - fullheight = Stage.height; - contentwidth = fullwidth - 40; - contentheight = fullheight - 70; - - background._width = fullwidth-1; - background._height = fullheight-1; - - // resize/position hscroll outline - hscroll_outline._x = 10; - hscroll_outline._y = fullheight-20; - hscroll_outline._width = fullwidth-40; - hscroll_outline._height = 10; - - // resize/position vscroll outline - vscroll_outline._x = fullwidth-20; - vscroll_outline._y = 40; - vscroll_outline._width = 10; - vscroll_outline._height = fullheight-70; - - // resize/position content outline - content_outline._x = 9; - content_outline._y = 39; - content_outline._width = contentwidth+1; - content_outline._height = contentheight+1; - - // move all objects to their proper positions - vscrollbar._x = fullwidth-22; - hscrollbar._y = fullheight-22; - p1._x = fullwidth-25-20 - p1._width/2; - o1._x = fullwidth-50-20 - o1._width/2; - z1._x = fullwidth-75-20 - z1._width/2; - m1._x = fullwidth-100-20 - m1._width/2; - - l1._x = fullwidth/2-100 - l1._width/2; - r1._x = fullwidth/2+100 - r1._width/2; - - et._x = fullwidth/2 - (et._width+etmiddle._width+et_total_pages._width)/2; - etmiddle._x = fullwidth/2 - (et._width+etmiddle._width+et_total_pages._width)/2 + et._width; - et_total_pages._x = fullwidth/2 - (et._width+etmiddle._width+et_total_pages._width)/2 + et._width+etmiddle._width; - - areabutton._xscale = contentwidth; - areabutton._yscale = contentheight; - cliparea._xscale = contentwidth; - cliparea._yscale = contentheight; - viewport.setMask(cliparea); - - - lastzoom = 1; - - zoom = 1; - - //debugtxt.text = Stage.width+ " x " + Stage.height; - //debugtxt.text = zoomtype; - - setPageNr = function(setscroll) { - current_pagenumber = pagenr; - viewport.gotoAndStop(pagenr); - if(!setscroll) { - viewport._y = top; - swfpos2scrollbars(); - } - else { - viewport._y = setscroll; - swfpos2scrollbars(); - } - }; - - setNoScrollZoomLevel = function() { - // determine initial zoom level - xscale = contentwidth / swfwidth; - yscale = contentheight / swfheight; - if(xscale < yscale) { - zoom = xscale; - setZoomLevel(); - } else { - zoom = yscale; - setZoomLevel(); - } - }; - - setOneDirScrollZoomLevel = function() { - xscale = contentwidth / swfwidth; - yscale = contentheight / swfheight; - if(xscale > yscale) { - zoom = xscale; - setZoomLevel(); - } else { - zoom = yscale; - setZoomLevel(); - } - }; - - set11ZoomLevel = function() { - zoom = 1.0; - setZoomLevel(); - }; - - swfpos2scrollbars = function() { - if(scrollxrange) { - hscrollbar._x = 10 + (left-viewport._x)*scrollbarxrange/scrollxrange; - } else { - hscrollbar._x = 10; - } - if(scrollyrange) { - vscrollbar._y = 40 + (top-viewport._y)*scrollbaryrange/scrollyrange; - } else { - vscrollbar._y = 40; - } - }; - setZoomLevel = function() { - - width = contentwidth; - height = contentheight; - left = 10; - top = 40; - - if(swfwidth * zoom < contentwidth) { - width = swfwidth*zoom; - left = 10+(contentwidth-width)/2; - } - if(swfheight * zoom < contentheight) { - height = swfheight*zoom; - top = 40+(contentheight-height)/2; - } - - scrollxrange = swfwidth*zoom-width; - scrollyrange = swfheight*zoom-height; - - hscrollbar._xscale = (contentwidth*width) / (swfwidth*zoom); - vscrollbar._yscale = (contentheight*height) / (swfheight*zoom); - scrollbarxrange = contentwidth - hscrollbar._xscale; - scrollbaryrange = contentheight - vscrollbar._yscale; - if(scrollbarxrange<0) { - scrollbarxrange = 0; - } - if(scrollbaryrange<0) { - scrollbaryrange = 0; - } - - viewport._xscale = zoom*100; - viewport._yscale = zoom*100; - - focusx = contentwidth/2 - (viewport._x-10); - focusy = contentheight/2 - (viewport._y-40); - - viewport._x = left - focusx * zoom / lastzoom + width/2; - viewport._y = top - focusy * zoom / lastzoom + height/2; - - if(viewport._x > left) { - viewport._x = left; - } else if(viewport._x < left-scrollxrange) { - viewport._x = left-scrollxrange; - } - if(viewport._y > top) { - viewport._y = top; - } else if(viewport._y < top-scrollyrange) { - viewport._y = top-scrollyrange; - } - - swfpos2scrollbars(); - - if(scrollxrange) { - hscrollbar._visible = 1; - } else { - //hscrollbar._visible = 0; - } - if(scrollyrange) { - vscrollbar._visible = 1; - } else { - //vscrollbar._visible = 0; - } - - lastzoom = zoom; - - // update the ruler decorations - - vscrollbar.t1._y = vscrollbar.t2._y - 600.0/vscrollbar._yscale; - vscrollbar.t3._y = vscrollbar.t2._y + 600.0/vscrollbar._yscale; - hscrollbar.th1._x = hscrollbar.th2._x - 600.0/hscrollbar._xscale; - hscrollbar.th3._x = hscrollbar.th2._x + 700.0/hscrollbar._xscale; - - vscrollbar.vshadow._x = vscrollbar.vbox._x + 500/vscrollbar._xscale; - vscrollbar.vshadow._y = vscrollbar.vbox._y + 500/vscrollbar._yscale; - - hscrollbar.hshadow._x = hscrollbar.hbox._x + 500/hscrollbar._xscale; - hscrollbar.hshadow._y = hscrollbar.hbox._y + 500/hscrollbar._yscale; - }; - - pagenr = 1; - setPageNr(); - - if(zoomtype=="1") { - set11ZoomLevel(); - } else if(zoomtype=="2") { - setNoScrollZoomLevel(); - } else { - setOneDirScrollZoomLevel(); - } - - et.onChanged = function(){ - if(current_pagenumber <= viewport._totalframes) { - if (current_pagenumber > 0) { - pagenr = int(current_pagenumber); - setPageNr(); - } - } - }; - l1.onRelease = function(){ - if(pagenr > 1) { - pagenr = pagenr - 1; - setPageNr(); - } - }; - r1.onRelease = function(){ - if(pagenr < viewport._totalframes) { - pagenr = pagenr + 1; - setPageNr(); - } - }; - p1.onRelease = function(){ - if(zoom < 4) { - zoom = zoom + 1; - setZoomLevel(); - } - }; - m1.onRelease = function(){ - if(zoom > 1) { - zoom = zoom - 1; - if(zoom < 1) - zoom = 1; - setZoomLevel(); - } - }; - o1.onRelease = function(){ - setNoScrollZoomLevel(); - }; - z1.onRelease = function(){ - setOneDirScrollZoomLevel(); - }; - refreshDrag = function(){ - if(Dragging == "h") { - viewport._x = left + (10-hscrollbar._x)*scrollxrange/scrollbarxrange; - } else if(Dragging == "v") { - viewport._y = top + (40-vscrollbar._y)*scrollyrange/scrollbaryrange; - } else if(Dragging == "xy") { - swfpos2scrollbars(); - } - }; - dragrefresh = setInterval(refreshDrag, 20); - - var mouseListener = new Object(); - - mouseListener.onMouseWheel = function(delta) { - divideDelta = delta/Math.abs(delta); - viewport._y = viewport._y + 30*zoom*divideDelta; - swfpos2scrollbars(); - if(viewport._y < top-scrollyrange) { - if(pagenr < viewport._totalframes) { - pageNr = pageNr + 1; - setPageNr(); - } - else { - viewport._y = top-scrollyrange; - swfpos2scrollbars(); - } - } - else if(viewport._y > top) { - if(pagenr > 1) { - pageNr = pageNr - 1; - setPageNr(top-scrollyrange); - } - else { - viewport._y = top; - swfpos2scrollbars(); - } - } - }; - - Mouse.addListener(mouseListener); -.end - -.end diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.swf b/fluidbook/tools/swftools-special-swfdump/swfs/rfxview.swf deleted file mode 100644 index 1862ee73b4d98543226026fef3bcaa85af873a64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4857 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
    35E0*DG8Y` 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

    I84ErI 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 VMdx}TA@L($fH^nXFK-_HO5 diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.c b/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.c deleted file mode 100644 index af02ee5d4..000000000 --- a/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.c +++ /dev/null @@ -1,282 +0,0 @@ -/* simple_viewer.c - - Creates the swf file simple_viewer.swf. - I'm not much of an designer. Suggestions and improvements concerning - this file or simple_viewer.swf are highly welcome. -mk - - Part of the swftools package. - - Copyright (c) 2000, 2001 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include "rfxswf.h" - -TAG* tag; - -int button_sizex = 20; //button size in pixels -int button_sizey = 20; - -RGBA button_colors[6]= -{{0,0x00,0x00,0x80}, //Idle left - {0,0x00,0x00,0x80}, // " right - {0,0x20,0x20,0xc0}, //MouseOver left - {0,0x20,0x20,0xc0}, // " right - {0,0x10,0x10,0xff}, //Down left - {0,0x10,0x10,0xff}};// " right - -int useDefineButton2 = 0; // set this to 1 to use DefineButton2 Tags - // instead of DefineButton1 -#define SUBTITLES 1 -//#define USE_WATERMARK 1 // set this flag to print-protect your swfs - -#define ID_WATERMARK 64 - -int main (int argc,char ** argv) -{ SWF swf; - RGBA rgb; - SRECT r; - SHAPE* s; - MATRIX m; - ActionTAG*a1,*a2,*a3; - S32 width=1024,height = 768; - - int f,i,ls1,fs1; - int count; - int t; - - memset(&swf,0x00,sizeof(SWF)); // set global movie parameters - - swf.fileVersion = 4; // make flash 4 compatible swf - swf.frameRate = 0x1900; // about 0x19 frames per second - - swf.movieSize.xmax = 20*width; // flash units: 1 pixel = 20 units - swf.movieSize.ymax = 20*height; - - swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); - tag = swf.firstTag; - rgb.r = 0xff; - rgb.g = 0xff; - rgb.b = 0xff; - swf_SetRGB(tag,&rgb); - - // initialize matrix - m.sx = 65536; //scale - m.sy = 65536; - m.r0 = 0; //rotate - m.r1 = 0; - m.tx = 0; //move - m.ty = 0; - - /* the "viewport" object will be replaced by swfcombine - with the object to browse. It is placed at the - upper left corner (0,0), by setting m.tx and m.ty - to 0. Therefore, the buttons are "in" the viewport, - not above it*/ - tag = swf_InsertTag(tag,ST_DEFINESPRITE); - swf_SetU16(tag, 23); //id - swf_SetU16(tag, 0); //frames - tag = swf_InsertTag(tag,ST_END); - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - m.tx = 0; //move - m.ty = 0; - swf_ObjectPlace(tag, 23, 1,&m,0,"viewport"); - -#ifdef USE_WATERMARK - - // Insert Alpha watermark to avoid printing - - tag = swf_InsertTag(tag,ST_DEFINESHAPE3); - swf_ShapeNew(&s); - rgb.r = rgb.g = rgb.b = 0xff; - rgb.a = 0x08; - fs1 = swf_ShapeAddSolidFillStyle(s,&rgb); - swf_SetU16(tag,ID_WATERMARK); - r.xmin = r.ymin = 0; - r.xmax = 20*width; - r.ymax = 20*height; - swf_SetRect(tag,&r); // cover whole viewport - swf_SetShapeHeader(tag,s); - swf_ShapeSetAll(tag,s,0,0,0,fs1,0); - swf_ShapeSetLine(tag,s,20*width,0); - swf_ShapeSetLine(tag,s,0,20*height); - swf_ShapeSetLine(tag,s,-20*width,0); - swf_ShapeSetLine(tag,s,0,-20*height); - swf_ShapeSetEnd(tag); - swf_ShapeFree(s); - -#endif // USE_WATERMARK - - for(count=0;count<6;count++) - { - tag = swf_InsertTag(tag,ST_DEFINESHAPE); - swf_ShapeNew(&s); // create new shape instance - rgb.r = rgb.b = rgb.g = 0x00; - ls1 = swf_ShapeAddLineStyle(s,40,&rgb); - rgb = button_colors[count]; - fs1 = swf_ShapeAddSolidFillStyle(s,&rgb); - swf_SetU16(tag,32+count); // now set character ID - r.xmin = 0; - r.ymin = 0; - r.xmax = 20*width; - r.ymax = 20*height; - swf_SetRect(tag,&r); // set shape bounds - swf_SetShapeHeader(tag,s); // write all styles to tag - if(count&1) - { - swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0); // move to (0,0), select linestyle ls1 and no fillstyle - /* SetLine coordinates are relative. - It's important that the start and end points match, otherwise - the Macromedia Flash player will crash. */ - swf_ShapeSetLine(tag,s,20*button_sizex,20*button_sizey); - swf_ShapeSetLine(tag,s,-20*button_sizex,20*button_sizey); - swf_ShapeSetLine(tag,s,0,-40*button_sizey); - } else { - swf_ShapeSetAll(tag,s,20*button_sizex,0,ls1,fs1,0); - swf_ShapeSetLine(tag,s,-20*button_sizex,20*button_sizey); - swf_ShapeSetLine(tag,s,20*button_sizex,20*button_sizey); - swf_ShapeSetLine(tag,s,0,-40*button_sizey); - } - swf_ShapeSetEnd(tag); // finish drawing - swf_ShapeFree(s); // clean shape structure (which isn't needed anymore after writing the tag) - } - - a1 = action_SetTarget(0, "viewport"); - a1 = action_PreviousFrame(a1); - a1 = action_SetTarget(a1, ""); - a1 = action_End(a1); - - a2 = action_SetTarget(0, "viewport"); - a2 = action_NextFrame(a2); - a2 = action_SetTarget(a2,""); - a2 = action_End(a2); - - a3 = action_SetTarget(0,"viewport"); - a3 = action_Stop(a3); - a3 = action_SetTarget(a3,""); -#ifdef SUBTITLES - a3 = action_PushString(a3,"/:subtitle"); - a3 = action_PushString(a3,""); //reset variable - a3 = action_SetVariable(a3); -#endif - a3 = action_End(a3); - - for(t=0;t<2;t++) - { - if(!useDefineButton2) - { - tag = swf_InsertTag(tag,ST_DEFINEBUTTON); - swf_SetU16(tag,30+t); //id - swf_ButtonSetRecord(tag,BS_UP|BS_HIT,32+t,1,NULL,NULL); - swf_ButtonSetRecord(tag,BS_OVER,34+t,1,NULL,NULL); - swf_ButtonSetRecord(tag,BS_DOWN,36+t,1,NULL,NULL); - swf_SetU8(tag,0); // end of button records - - if(t) - swf_ActionSet(tag,a2); - else - swf_ActionSet(tag,a1); - } - else - { - tag = swf_InsertTag(tag,ST_DEFINEBUTTON2); - swf_SetU16(tag,30+t); //id - swf_ButtonSetFlags(tag, 0); //menu=no - swf_ButtonSetRecord(tag,BS_UP|BS_HIT,32+t,1,NULL,NULL); - swf_ButtonSetRecord(tag,BS_OVER,34+t,1,NULL,NULL); - swf_ButtonSetRecord(tag,BS_DOWN,36+t,1,NULL,NULL); - swf_SetU8(tag,0); // end of button records - - swf_ButtonSetCondition(tag, BC_OVERDOWN_OVERUP); - if(t) - swf_ActionSet(tag,a2); - else - swf_ActionSet(tag,a1); - - swf_ButtonPostProcess(tag, 1); // don't forget! - } - } - - tag = swf_InsertTag(tag,ST_DOACTION); - swf_ActionSet(tag,a3); - - m.tx = 0; //move - m.ty = 0; - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_ObjectPlace(tag, 30, 3,&m,0,0); - m.tx = button_sizex*30; - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_ObjectPlace(tag, 31, 4,&m,0,0); - -#ifdef USE_WATERMARK - - // place watermark - - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_ObjectPlace(tag, ID_WATERMARK, 2, &m, 0,0); - -#endif // USE_WATERMARK - - swf_ActionFree(a1); - swf_ActionFree(a2); - swf_ActionFree(a3); - -#ifdef SUBTITLES - tag = swf_InsertTag(tag,ST_DEFINEFONT2); { - U8 data[] = {0x90, 0x00, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x20, 0x4e, 0x65, 0x77, 0x20, 0x52, 0x6f, 0x6d, - 0x61, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; - swf_SetU16(tag, 0x76); //id - swf_SetBlock(tag, data, sizeof(data)); - } - tag = swf_InsertTag(tag,ST_DEFINEEDITTEXT); { - EditTextLayout layout; - layout.align = 0; - layout.leftmargin = 0; - layout.rightmargin = 0; - layout.indent = 0; - layout.leading = 0; - - swf_SetU16(tag, 0x77);//id - r.xmin = button_sizex*60; - r.xmax = r.xmin+ 826*20; - r.ymin = 0; - r.ymax = button_sizey*80; - rgb.r = rgb.g = rgb.b = 0; - rgb.a = 255; - swf_SetEditText(tag, ET_MULTILINE|ET_READONLY, r, 0, &rgb, 0, 0x76, button_sizey*40, &layout, "/:subtitle"); - m.tx = m.ty = 0; - } - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_ObjectPlace(tag, 0x77, 5,&m,0,0); -#endif - - tag = swf_InsertTag(tag,ST_SHOWFRAME); - tag = swf_InsertTag(tag,ST_END); - - - f = open("simple_viewer.swf",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); - close(f); - - swf_FreeTags(&swf); // cleanup - return 0; -} - - diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.swf b/fluidbook/tools/swftools-special-swfdump/swfs/simple_viewer.swf deleted file mode 100644 index 579096d252306e12d1492bfb58e771a1af7c5797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 505 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 diff --git a/fluidbook/tools/swftools-special-swfdump/swfs/tessel_loader.swf b/fluidbook/tools/swftools-special-swfdump/swfs/tessel_loader.swf deleted file mode 100644 index 327f992d18ef42e9e70311c9a7df41bd372531f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11244 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 diff --git a/inc/ws/Controlleur/class.ws.flash.php b/inc/ws/Controlleur/class.ws.flash.php index 77d97ae03..0c06c8cd9 100644 --- a/inc/ws/Controlleur/class.ws.flash.php +++ b/inc/ws/Controlleur/class.ws.flash.php @@ -857,7 +857,6 @@ class wsFlash extends cubeFlashGateway public function compile() { global $core; - wsSecureSWF::checkProtectedSWF(); $dao = new wsDAOBook($core->con); $log = $dao->compile($this->args['book_id'], '2'); diff --git a/inc/ws/Controlleur/class.ws.url.php b/inc/ws/Controlleur/class.ws.url.php index 7651be659..2fa4afcc7 100644 --- a/inc/ws/Controlleur/class.ws.url.php +++ b/inc/ws/Controlleur/class.ws.url.php @@ -1213,161 +1213,6 @@ html.tall{height:150%}' . "\n"; exit; } - public static function viewer($args) - { - $args = cubePage::getArgs($args); - - $qs = ''; - if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) { - $qs = '?' . $_SERVER['QUERY_STRING']; - } - - $e = explode('_', $args[0]); - $newurl = null; - if (count($e) == 2 || $e[2] < TIME - 10) { - $e[2] = TIME; - http::redirect(SITE_PATH . 'viewer/' . implode('_', $e) . '/' . $qs); - exit; - } - - $book_id = $e[0]; - - $wmode = (isset($wmode) && $wmode != '') ? $wmode : 'default'; - - self::checkDocumentVersionOfBook($book_id); - wsSecureSWF::checkProtectedSWF(); - - echo self::commonViewer($book_id, $e[1], false, $wmode, $newurl); - } - - public static function commonViewer($book_id, $hash, $standalone = false, $wmode = 'default', $fps = false, $version = 2) - { - if (!defined('MINIMIZE_JS')) { - define('MINIMIZE_JS', false); - } - if (!defined('MINIMIZE_CSS')) { - define('MINIMIZE_CSS', false); - } - if (!defined('JQUERY')) { - define('JQUERY', false); - } - - global $core; - global $css; - global $js; - global $standard; - global $meta; - global $jsvar; - - if ($version == 2) { - $flashVersion = '10.0.22'; - } else { - $flashVersion = '8'; - } - - cubePage::swfobject(2); - - $dao = new wsDAOBook($core->con); - $book = $dao->selectById($book_id); - - if (!wsDroits::admin()) { - if ($book->parametres->redirectDemo != '') { - http::redirect($book->parametres->redirectDemo); - exit; - } - if ($book->parametres->disableDemo) { - commonDroits::error(); - } - } - - if ($hash != 'bcf26f9cf4a795ec00b9a44f42750d58' && $book->hash != $hash) { - commonDroits::error(); - } - - - if (is_null($core->user)) { - $dao->addDemoCount($book_id); - } - - $dao->compile($book_id, (string)$version); - - $daoTheme = new wsDAOTheme($core->con); - $theme = $daoTheme->selectById($book->theme, 'themes'); - - $webcompile = WEBROOT . '/fluidbook/compile/'; - - $standard = 'XHTML 1.0 Transitional'; - $css = $js = array(); - $css[] = $webcompile . 'style.css'; - $fv = $_GET; - if ($standalone) { - $fv['base'] = $_SERVER['REQUEST_URI']; - } - if ($fps) { - $fv['monitoring'] = '1'; - } - - if ($version == 1) { - $fv['id'] = $book_id; - $fv['mail'] = '0'; - $fv['onlineFlag'] = '1'; - $fv['loaderColor'] = $theme->parametres->loadingBackColor; - } - - $res = ''; - $res .= ''; - $res .= '' . $book->parametres->title . ''; - $res .= ''; - $res .= ''; - // Entêtes Facebook - $meta['og:title'] = ($book->parametres->facebook_title == '') ? $book->parametres->title : $book->parametres->facebook_title; - if ($book->parametres->facebook_description != '') { - $meta['og:description'] = $book->parametres->facebook_description; - } - $meta['og:image'] = 'https://workshop.fluidbook.com/services/facebook_thumbnail?cid=' . $book->cid . '&j=' . TIME; - - - $redirectPDF = 'window.location="data/document.pdf"'; - - if ($book->parametres->mobileVersion == 'pdf') { - $redirectMobile = $redirectPDF; - } else { - $redirectMobile = 'window.location="/viewerh/' . $book_id . '_' . $hash . '_' . TIME . '/";'; - } - - $alt = '

    '; - - $res .= ''; - $res .= ''; - $res .= '
    '; - $res .= "\n" . ''; - $js = array('fluidbook.js'); - $jsvar = array(); - - $gacodes = array(GA); - if ($book->parametres->googleAnalytics != '') { - $gacodes[] = $book->parametres->googleAnalytics; - } - $res .= cubePage::googleAnalytics($gacodes, false); - $res .= ''; - $res .= ''; - - self::logReferer($book_id); - - return $res; - } - public static function logReferer($id) { @@ -1537,41 +1382,6 @@ html.tall{height:150%}' . "\n"; return $res; } - public static function testAS($args) - { - global $core; - commonDroits::min(5); - if (!isset($args[1])) { - $args[1] = 2964; - } - self::checkDocumentVersionOfBook($args[1]); - wsSecureSWF::checkProtectedSWF(); - cubePHP::neverStop(); - $dao = new wsDAOBook($core->con); - - header('Content-type: text/plain'); - ob_end_clean(); - echo $dao->compile($args[1], 3, false, true); - exit; - } - - public static function testAIR($args) - { - global $core; - commonDroits::min(5); - if (!isset($args[1])) { - $args[1] = 2964; - } - self::checkDocumentVersionOfBook($args[1]); - cubePHP::neverStop(); - $dao = new wsDAOBook($core->con); - - header('Content-type: text/plain'); - ob_end_clean(); - echo $dao->compileAIR($args[1]); - exit; - } - public static function testLinksCSV($args) { global $core; diff --git a/inc/ws/Metier/class.ws.book.php b/inc/ws/Metier/class.ws.book.php index 8077d9f6c..104649a05 100644 --- a/inc/ws/Metier/class.ws.book.php +++ b/inc/ws/Metier/class.ws.book.php @@ -79,5 +79,4 @@ class wsBook extends cubeMetier { return $this->$varname; } - } \ No newline at end of file diff --git a/inc/ws/Metier/class.ws.document.php b/inc/ws/Metier/class.ws.document.php index d3cd66ec9..a6283ac7d 100644 --- a/inc/ws/Metier/class.ws.document.php +++ b/inc/ws/Metier/class.ws.document.php @@ -380,6 +380,42 @@ class wsDocument extends cubeMetier return false; } + public function getFile($page, $format = 'jpg', $resolution = 150, $withText = true, $withGraphics = true, $version = 'html') + { + if ($format === 'jpeg') { + $format = 'jpg'; + } + + $dir = $this->out . '/' . $version . '/'; + if ($format === 'svg') { + $prefix = $withGraphics ? 'f' : 't'; + $file = $dir . $prefix . 'o' . $page; + if ($withGraphics) { + $file .= '-' . $resolution; + } + $file .= '.svg'; + } else if ($format === 'png' || $format === 'jpg') { + $prefix = $withText ? 't' : 'h'; + $file = $dir . $prefix . $resolution . '-' . $page . '.' . $format; + } + if (!file_exists($file)) { + $this->makeFile($file, $page, $format, $resolution, $withText, $version); + } + return $file; + } + + public function makeFile($file, $page, $format = 'jpg', $resolution = 150, $withText = true, $withGraphics = true, $version = 'html') + { + if ($format === 'jpeg') { + $format = 'jpg'; + } + if ($format === 'svg') { + + } else if ($format === 'png' || $format === 'jpg') { + wsPDFConvert::makeShotPNM($this->getSplittedPDFPage($page), $file, 1, '', $resolution * $this->getResolutionRatio(), 85, 4, $withText, null, null, $format); + } + } + public function cutDocument($mode) { $fwstk = new cubeCommandLine('fwstk.sh'); @@ -406,11 +442,18 @@ class wsDocument extends cubeMetier { if ($force) { $this->addToLog('Processing page #' . $page); + // Thumb for composition panel $this->makeMiniShot($page); - $this->makeSWFFiles($page); + // Image for link editor + $this->getFile($page, 'jpg', 150, true, true); } } + public function makeMiniShot($page) + { + wsPDFConvert::makeMiniShot($this->getSplittedPDFPage($page), $this->out . '/p' . $page . '.jpg', 1); + } + public function processAllPages() { for ($i = 1; $i <= $this->generalInfos['pages']; $i++) { @@ -462,11 +505,6 @@ class wsDocument extends cubeMetier return 620 / $this->generalInfos['size'][0]; } - public function makeMiniShot($page) - { - $this->makeShotFixedWidth($page, 'p', 500, 65, 4, 'PNM'); - } - public function makeShotFixedWidth($page, $prefix = '', $w = 100, $quality = 90, $antialiasing = 4, $method = 'PNM') { // Make thumbs of $w width @@ -590,13 +628,6 @@ class wsDocument extends cubeMetier $pngfile = $this->out . $prefix . $page . '.png'; if (file_exists($tmp)) { - // $pnmtojpeg = new cubeCommandLine('pnmtojpeg', $jpegfile, false); - // $pnmtojpeg->setArg('-quality ' . $quality); - // $pnmtojpeg->setArg(null, $tmp); - // $pnmtojpeg->execute(); - // $this->addToLog($pnmtojpeg, false, $page); - - $cjpeg = new cubeCommandLine('/opt/mozjpeg/bin/cjpeg', null, true); $cjpeg->setArg('-quality ' . ($quality + 6)); $cjpeg->setArg('-outfile ' . $jpegfile); @@ -618,77 +649,6 @@ class wsDocument extends cubeMetier return $this->autocrop || $this->manualcrop || $this->autocut || $this->manualcut; } - public function makeSWFFiles($page, $resolution = null, $quality = null, $storeAllChars = null, $maxObjects = null, $method = null, $version = null) - { - $conversionSettings = $this->conversionInfos->pages[$page]; - if (is_null($storeAllChars)) { - $storeAllChars = true; - } - if (is_null($resolution)) { - $resolution = $conversionSettings->resolution; - } - if (is_null($method)) { - $method = $conversionSettings->method; - } - if (is_null($quality)) { - $quality = $conversionSettings->quality; - } - if (is_null($maxObjects)) { - $maxObjects = $conversionSettings->objects; - } - if (is_null($version)) { - $version = isset($conversionSettings->version) ? $conversionSettings->version : 'stable'; - } - - if ($maxObjects <= 1) { - $method = self::POLY2BITMAP; - } - - // Pour les fichiers croppés, on utilise la méthode flatten qui ne prends - // pas en compte les objets hors de la box - if ($this->isCropped()) { - // $method = max($method, self::FLATTEN); - } - - $out = $this->pdf2swf($page, $resolution * $this->getResolutionRatio(), $quality, $storeAllChars, $method, 'p', $version); - if ($method < self::BARBARE_PNM) { - // Analyse de la sortie pour détecter des typos manquantes - $overflow = false; - $overflowObjects = false; - $written = false; - $missing_fonts = array(); - if (file_exists($out)) { - $fp = fopen($out, 'rb'); - while ($line = fgets($fp)) { - if (preg_match('|Try putting a TTF version of that font \(named \"([A-Z-_0-9.]*)\"\)|Uui', trim($line), $matches)) { - $missing_fonts[] = $matches[1]; - } elseif (stristr($line, 'ID Table overflow')) { - $overflow = true; - } elseif (stristr($line, 'NOTICE SWF written')) { - $written = true; - } elseif (stristr($line, 'NOTICE Writing SWF file')) { - $written = true; - } - } - } - if (!is_null($page) && file_exists($this->out . 'p' . $page . '.swf')) { - $written = true; - } - // On teste si le fichier est écrit et qu'il a été généré par le premier niveau - if ($method < self::POLY2BITMAP && $written) { - $overflowObjects = $this->checkObjectsNumber($this->out . 'p' . $page . '.swf', $maxObjects, $page); - } - - if (!$written || $overflow || $overflowObjects) { - if ($method == self::MAX) { - return; - } - $nextMethod = $method + 1; - return $this->makeSWFFiles($page, $resolution, $quality, $storeAllChars, $maxObjects, $nextMethod, $version); - } - } - } - public function makeHTML5Files($page) { // Then make HD background shots @@ -778,191 +738,6 @@ class wsDocument extends cubeMetier file_put_contents($textFile, $svg->saveXML()); } - protected function checkObjectsNumber($file, $maxObjects, $page) - { - $swfdump = new cubeCommandLine('swfdump', null, true); - $swfdump->setPath(CONVERTER_PATH); - $swfdump->setArg(null, $file); - $swfdump->execute(); - $this->addToLog($swfdump, true, $page); - - str_replace('[01a]', '', $swfdump->output, $nbObjects); - if ($nbObjects > $maxObjects) { - return true; - } - return false; - } - - protected function dumpSWF($page, $prefix = 'p') - { - $swfdump = new cubeCommandLine('/usr/local/swftools/special-swfdump/bin/swfdump', null, true); - $swfdump->setPath(CONVERTER_PATH); - $swfdump->setArg('t'); - $swfdump->setArg('p'); - $swfdump->setArg('F'); - $swfdump->setArg(null, $this->out . $prefix . $page . '.swf'); - $swfdump->execute(); - $this->addToLog($swfdump, false, $page); - return $swfdump->output; - } - - /** - * wsDocument::pdf2swf() - * - * @param mixed $page - * @param integer $resolution - * @param integer $quality - * @param mixed $storeAllChars - * @param integer $method - * @return - */ - protected function pdf2swf($page, $resolution = 150, $quality = 90, $storeAllChars = true, $method = 0, $prefix = 'p', $version = 'stable') - { - /* - -h , --help Print short help message and exit - -V , --version Print version info and exit - -o , --output file.swf Direct output to file.swf. If file.swf contains '%' (file%.swf), then each page goes to a seperate file. - -p , --pages range Convert only pages in range with range e.g. 1-20 or 1,4,6,9-11 or - -P , --password password Use password for deciphering the pdf. - -v , --verbose Be verbose. Use more than one -v for greater effect. - -z , --zlib Use Flash 6 (MX) zlib compression. - -i , --ignore Allows pdf2swf to change the draw order of the pdf. This may make the generated - -j , --jpegquality quality Set quality of embedded jpeg pictures to quality. 0 is worst (small), 100 is best (big). (default:85) - -s , --set param=value Set a SWF encoder specific parameter. See pdf2swf -s help for more information. - -w , --samewindow When converting pdf hyperlinks, don't make the links open a new window. - -t , --stop Insert a stop() command in each page. - -T , --flashversion num Set Flash Version in the SWF header to num. - -F , --fontdir directory Add directory to the font search path. - -b , --defaultviewer Link a standard viewer to the swf file. - -l , --defaultloader Link a standard preloader to the swf file which will be displayed while the main swf is loading. - -B , --viewer filename Link viewer filename to the swf file. - -L , --preloader filename Link preloader filename to the swf file. - -q , --quiet Suppress normal messages. Use -qq to suppress warnings, also. - -S , --shapes Don't use SWF Fonts, but store everything as shape. - -f , --fonts Store full fonts in SWF. (Don't reduce to used characters). - -G , --flatten Remove as many clip layers from file as possible. - -I , --info Don't do actual conversion, just display a list of all pages in the PDF. - -Q , --maxtime n Abort conversion after n seconds. Only availableon Unix. - - PDF device global parameters: - ----------------------------- - fontdir= a directory with additional fonts - font= an additional font filename - pages= the range of pages to convert (example: pages=1-100,210-) - zoom= the resultion (default: 72) - languagedir= Add an xpdf language directory - multiply= Render everything at the resolution - poly2bitmap Convert graphics to bitmaps - bitmap Convert everything to bitmaps - - SWF Parameters : - ---------------- - SWF layer options : - ------------------- - - jpegsubpixels= resolution adjustment for jpeg images (same as jpegdpi, but in pixels) - ppmsubpixels= shortcut for setting both jpegsubpixels and ppmsubpixels - drawonlyshapes convert everything to shapes (currently broken) - ignoredraworder allow to perform a few optimizations for creating smaller SWFs - linksopennewwindow make links open a new browser window - linktarget target window name of new links - linkcolor==7) - bboxvars store the bounding box of the SWF file in actionscript variables - dots Take care to handle dots correctly - reordertags=0/1 (default: 1) perform some tag optimizations - internallinkfunction= when the user clicks a internal link (to a different page) in the converted file, this actionscript function is called - externallinkfunction= when the user clicks an external link (e.g. http://www.foo.bar/) on the converted file, this actionscript function is called - disable_polygon_conversion never convert strokes to polygons (will remove capstyles and joint styles) - caplinewidth= the minimum thichness a line needs to have so that capstyles become visible (and are converted) - insertstop put an ActionScript "STOP" tag in every frame - protect add a "protect" tag to the file, to prevent loading in the Flash editor - flashversion= the SWF fileversion (6) - framerate= SWF framerate - minlinewidth= convert horizontal/vertical boxes smaller than this width to lines (0.05) - simpleviewer Add next/previous buttons to the SWF - animate insert a showframe tag after each placeobject (animate draw order of PDF files) - jpegquality= set compression quality of jpeg images - splinequality= Set the quality of spline convertion to value (0-100, default: 100). - disablelinks Disable links. - */ - - if (file_exists($this->out . $prefix . $page . '.swf')) { - unlink($this->out . $prefix . $page . '.swf'); - } - - if (!in_array($method, array(self::BARBARE_PNM, self::BARBARE_GS))) { - if (in_array($version, array('legacy', 'stable', 'latest', 'git'))) { - $program = '/usr/local/swftools/' . $version . '/bin/pdf2swf'; - } else { - $program = 'pdf2swf'; - } - - $pdf2swf = new CubeIT_CommandLine($program, null, true); - $pdf2swf->setPath(CONVERTER_PATH); - $pdf2swf->setTimeout(120); - - $pdf2swf->setArg('p', 1); - $flashversion = 10; - - if ($method == self::NORMAL) { - // Default - $multiply = 1; - } elseif ($method == self::FLATTEN) { - $multiply = 1; - $pdf2swf->setArg('flatten'); - } elseif ($method == self::POLY2BITMAP) { - // Raster graphics, keep texts - $pdf2swf->setArg('set poly2bitmap'); - $pdf2swf->setArg('set multiply', $this->_findMultiply($resolution)); - } elseif ($method == self::BITMAP) { - // Raster all - $pdf2swf->setArg('set bitmap'); - $pdf2swf->setArg('set multiply', $this->_findMultiply($resolution)); - } - // $pdf2swf->setManualArg('-v'); - $pdf2swf->setArg('T', $flashversion); - $pdf2swf->setArg('set reordertags', '0'); - if ($storeAllChars) { - $pdf2swf->setArg('fonts'); - $pdf2swf->setArg('set storeallcharacters'); - } - if (DEV) { - $pdf2swf->setArg('F', 'C:/Windows/Fonts'); - } else { - $pdf2swf->setArg('F', '/home/typo/fonts'); - } - $pdf2swf->setArg('set subpixels', $resolution / 72); - $pdf2swf->setArg('set jpegquality', $quality); - $pdf2swf->setArg('set disablelinks'); - $pdf2swf->setArg('set dots'); - if ($version == 'git') { - $pdf2swf->setArg(null, '-T7'); - $pdf2swf->setArg('set alignfonts'); - } - $pdf2swf->setArg(null, $this->getSplittedPDFPage($page)); - $pdf2swf->setArg('output', $this->out . $prefix . $page . '.swf'); - $pdf2swf->execute(); - - if ($version == 'git') { - $f = $this->out . $prefix . $page . '.swf'; - $combine = new cubeCommandLine('swfcombine'); - $combine->setArg('d'); - $combine->setArg(null, '-F9'); - $combine->setArg(null, $f); - $combine->setArg('o', $f); - $combine->execute(); - } - - $this->addToLog($pdf2swf, true, $page); - } else { - $this->pdf2swfBarbare($page, $resolution, $quality, $method); - } - } - protected function getSplittedPDFPage($page) { $res = $this->out . 'pdf/p' . $page . '.pdf'; @@ -978,79 +753,6 @@ class wsDocument extends cubeMetier return self::$resolution2multiply[$resolution]; } - protected function makeAS3($page) - { - $swffile = $this->out . 'p' . $page . '.swf'; - - $swfcombine = new cubeCommandLine('swfcombine'); - $swfcombine->setPath(CONVERTER_PATH); - $swfcombine->setArg('merge'); - $swfcombine->setArg('stack1'); - $swfcombine->setArg('z'); - $swfcombine->setManualArg('-v'); - $swfcombine->setArg('o', $swffile); - $swfcombine->setArg(null, ROOT . '/swf/as3Container.swf'); - $swfcombine->setManualArg('content=' . $swffile); - $swfcombine->execute(); - $this->addToLog($swfcombine, true, $page); - } - - protected function pdf2swfBarbare($page, $resolution = 150, $quality = 85, $method = 4) - { - // Fabrique les images - - $this->addToLog('Making barbare swf', true, $page); - - if ($method == self::BARBARE_PNM) { - $this->makeShot($page, 'barbare', $resolution, $quality, 4, 'PNM'); - } elseif ($method == self::BARBARE_GS) { - $this->makeShot($page, 'barbare', $resolution, $quality, 4, 'GS'); - } - - $dim = getimagesize($this->out . 'barbare' . $page . '.jpg'); - - // A partir des images, on crée les swf - $jpeg2swf = new cubeCommandLine('jpeg2swf'); - $jpeg2swf->setPath(CONVERTER_PATH); - $jpeg2swf->setArg('--quality', $quality); - $jpeg2swf->setArg('--output', $this->out . 'p' . $page . '.swf'); - $jpeg2swf->setArg('--flashversion', 10); - $jpeg2swf->setArg('--width', $dim[0] * (72 / $resolution)); - $jpeg2swf->setArg('--height', $dim[1] * (72 / $resolution)); - $jpeg2swf->setArg('--fit-to-movie'); - $jpeg2swf->setArg(null, $this->out . 'barbare' . $page . '.jpg'); - $jpeg2swf->execute(); - $this->addToLog($jpeg2swf, true, $page); - // Suppression du jpeg - @unlink($this->out . '/barbare' . $page . '.jpg', true, $page); - - $pdf2swf = new cubeCommandLine('pdf2swf', null, true); - $pdf2swf->setPath(CONVERTER_PATH); - $pdf2swf->setArg('set poly2bitmap'); - $pdf2swf->setArg('p', 1); - $pdf2swf->setArg('stop'); - $pdf2swf->setArg('T', 10); - $pdf2swf->setArg('set reordertags', '0'); - $pdf2swf->setArg('fonts'); - $pdf2swf->setArg('set storeallcharacters'); - if (DEV) { - $pdf2swf->setArg('F', 'C:/Windows/Fonts'); - } else { - $pdf2swf->setArg('F', '/home/typo/fonts'); - } - if (file_exists($this->out . 't' . $page . '.swf')) { - unlink($this->out . 't' . $page . '.swf'); - } - $pdf2swf->setArg('set subpixels', '0.01'); - $pdf2swf->setArg('set jpegquality', '1'); - $pdf2swf->setArg('set disablelinks'); - $pdf2swf->setArg(null, $this->getSplittedPDFPage($page)); - $pdf2swf->setArg('output', $this->out . 't' . $page . '.swf'); - $pdf2swf->execute(); - $this->addToLog($pdf2swf, true, $page); - - return ''; - } public function resetLog() { @@ -1113,32 +815,6 @@ class wsDocument extends cubeMetier mkdir($res, 0777, true); } return $res; -// if (!is_array(self::$_docsDir)) { -// self::$_docsDir = array(); -// } -// -// if (isset(self::$_docsDir[$id])) { -// return self::$_docsDir[$id]; -// } -// -// $d = 5; -// for ($i = 0; $i <= $d; $i++) { -// $docs = 'docs'; -// if ($i > 0) { -// $docs .= '' . $i; -// } -// $dir = WS_FILES . '/' . $docs . '/' . $id . '/'; -// if (file_exists($dir . 'p1.swf')) { -// self::$_docsDir[$id] = $dir; -// return $dir; -// } -// } -// $d0 = WS_FILES . '/docs/' . $id . '/'; -// if (!file_exists($d0)) { -// mkdir($d0, 0777, true); -// } -// self::$_docsDir[$id] = $d0; -// return $d0; } public static function makeHTML5FilesIfNotExists($document_id, $document_page, $format = 'jpg') diff --git a/inc/ws/Util/_common.php b/inc/ws/Util/_common.php index da09712d9..7104abd20 100644 --- a/inc/ws/Util/_common.php +++ b/inc/ws/Util/_common.php @@ -1,13 +1,6 @@ execute(); } - protected static function makeShotPNM($in, $out, $page, $prefix = '', $resolution = 72, $quality = 90, $antialiasing = 4, $texts = true, $width = null, $height = null, $format = 'jpg') + public static function makeShotPNM($in, $out, $page, $prefix = '', $resolution = 72, $quality = 90, $antialiasing = 4, $texts = true, $width = null, $height = null, $format = 'jpg') { $tmp = cubeFiles::tempnam(); diff --git a/inc/ws/Util/class.ws.secure.swf.php b/inc/ws/Util/class.ws.secure.swf.php deleted file mode 100644 index 66a043824..000000000 --- a/inc/ws/Util/class.ws.secure.swf.php +++ /dev/null @@ -1,97 +0,0 @@ - filemtime(self::$configLocal)) { - self::updateConfigFile(); - } - } - - protected static function updateConfigFile() { - $x = simplexml_load_file(self::$configOriginal); - // Remplace les chemins par les chemins des fichiers sur le serveur - self::replacePathFiles($x, 'inputFiles', self::$unprotected); - self::replacePathFiles($x, 'outputFiles', self::$protected); - - foreach ($x->xpath("//void[@property='fileFullName']") as $f) { - $fname = trim((string)$f->string); - $fname = str_replace('\\', '/', $fname); - - $e = explode('/', $fname); - $file = array_pop($e); - $r = simplexml_load_string('' . self::$unprotected . $file . ''); - cubeXML::replace($f, $r); - } - - file_put_contents(self::$configLocal, $x->asXML()); - } - - protected static function replacePathFiles($x, $property, $dir) { - $o1 = $x->xpath("//void[@property='$property']"); - $o = array_pop($o1); - $l = simplexml_load_string(''); - $a = $l->addChild('array'); - $a->addAttribute('class', 'java.lang.String'); - $a->addAttribute('length', count(self::$files)); - foreach (self::$files as $k => $f) { - $v = $a->addChild('void'); - $v->addAttribute('index', $k); - $s = $v->addChild('string', $dir . $f); - } - cubeXML::replace($o, $l); - } - - protected static function protectFiles($type) { - /*$secureSWF = new cubeCommandLine('secureSWF', null, true); - $secureSWF->setSudo(); - $secureSWF->setPath(CONVERTER_PATH); - $secureSWF->setManualArg(self::$configLocal); - $secureSWF->setManualArg(self::$protected); - $secureSWF->execute(); - - file_put_contents(WS_COMPILE_ASSETS . '/_protect/secure_' . $type . '.log', $secureSWF->commande . "\n\n\n" . $secureSWF->output);*/ - } -} diff --git a/inc/ws/Util/class.ws.swf2html.php b/inc/ws/Util/class.ws.swf2html.php deleted file mode 100644 index f87f3d82d..000000000 --- a/inc/ws/Util/class.ws.swf2html.php +++ /dev/null @@ -1,205 +0,0 @@ -lines = explode("\n", $dump); - } - - public function process() - { - if ($this->processed) { - return; - } - - foreach($this->lines as $line) { - if (preg_match('|^\[([0-9A-Z]{3})\]\s+(.*)$|i', $line, $matches)) { - $this->rangeCurrentTag(); - - $this->currentTag = $this->addTag($matches[1], $matches[2]); - } elseif (!is_null($this->currentTag)) { - $this->currentTag->addLine($line); - } - } - - $this->lines = null; - } - - protected function rangeCurrentTag() - { - if (is_null($this->currentTag)) { - return; - } - - if ($this->currentTag instanceof wsSWF2HTMLFont) { - $this->fonts[$this->currentTag->id] = $this->currentTag; - } - } - - protected function addTag($tag, $line) - { - $tag = wsSWF2HTMLTag::factory($tag, $line, $this); - if (!is_null($tag)) { - $this->tags[] = $tag; - } - return $tag; - } - - public function getHTML() - { - $this->process(); - } - - public function getCSS() - { - $this->process(); - } -} - -class wsSWF2HTMLTag { - public static function factory($tag, $line, &$converter) - { - if ($tag == wsSWF2HTML::FONT_TAG) { - return new wsSWF2HTMLFont($line, $converter); - } else if ($tag == wsSWF2HTML::TEXT_TAG) { - return new wsSWF2HTMLParagraph($line, $converter); - } else { - return null; - } - } - public $complete = false; - public $converter; - - public function __construct($line, &$converter) - { - $this->converter = $converter; - $this->addLine($line); - } - - public function addLine($line) - { - return ltrim($line); - } -} - -class wsSWF2HTMLFont extends wsSWF2HTMLTag { - public $id = null; - public $name = null; - - public function __construct($line, &$converter) - { - parent::__construct($line, $converter); - } - - public function addLine($line) - { - $line = parent::addLine($line); - $e = explode(':', $line); - - if ($e[0] == 'ID') { - $this->id = trim($e[1]); - } elseif ($e[0] == 'name') { - $ef = explode('-', trim($e[1])); - array_pop($ef); - array_pop($ef); - $this->name = implode('-', $ef); - } - } -} - -class wsSWF2HTMLParagraph extends wsSWF2HTMLTag { - public $matrix; - public $textes = array(); - - public function __construct($line, &$converter) - { - parent::__construct($line, $converter); - $this->matrix = new wsSWF2HTMLMatrix(); - } - - public function __get($varname) - { - if ($varname == 'left') { - return $this->matrix->tx; - } elseif ($varname == 'top') { - return $this->matrix->ty; - } - } - - public function addLine($line) - { - $line = parent::addLine($line); - if (substr($line, 0, 1) == '|') { - if (preg_match('|\|\s+([0-9.-]+)\s+([0-9.-]+)\s+([0-9.-]+)|i', $line, $m)) { - if (is_null($this->matrix->a)) { - $this->matrix->a = floatval($m[1]); - $this->matrix->c = floatval($m[2]); - $this->matrix->tx = floatval($m[3]); - } else { - $this->matrix->b = floatval($m[1]); - $this->matrix->d = floatval($m[2]); - $this->matrix->ty = floatval($m[3]); - } - } - } else if (substr($line, 0, 1) == '<') { - $text = new wsSWF2HTMLText($line, $this->converter); - if ($text->valid) { - $this->textes[] = $text; - } - } - } -} - -class wsSWF2HTMLText { - public $converter; - - public $x; - public $y; - public $color; - public $font; - public $size; - public $text; - - public $valid = false; - public function __construct($line, &$converter) - { - $this->converter = $converter; - if (preg_match('|^\<\s?\d+ glyphs in font (\d+) size (\d+), color (#[0-9a-f]+) at ([0-9.-]+),([0-9.-]+)\>\s(.*)|ui', $line, $matches)) { - $this->font = intval($matches[1]); - $this->size = intval($matches[2]); - $this->color = $matches[3]; - $this->x = floatval($matches[4]); - $this->y = floatval($matches[5]); - $this->text = preg_replace_callback('|\\\\x([0-9a-f]+)|i', array($this, 'replaceUnicode') , $matches[6]); - $this->valid = true; - } else { - $this->valid = false; - } - } - - protected function replaceUnicode($m) - { - return cubeText::uchr(hexdec($m[1])); - } -} - -class wsSWF2HTMLMatrix { - public $a = null; - public $b = null; - public $c = null; - public $d = null; - public $tx = null; - public $ty = null; -} - -?> \ No newline at end of file -- 2.39.5

    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 -#include -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/png.h" -#include "../lib/args.h" -#include "../lib/gfxsource.h" -#include "../lib/readers/swf.h" -#include "../lib/devices/render.h" -#include "../lib/devices/rescale.h" - -static struct options_t options[] = { -{"h", "help"}, -{"o", "output"}, -{"p", "pages"}, -{"l", "legacy"}, -{"V", "version"}, -{"X", "width"}, -{"Y", "height"}, -{0,0} -}; - -static int ng = 1; -static char*filename = 0; -static char*outputname = "output.png"; -static int quantize = 0; -static char*pagerange = 0; - -static int width = 0; -static int height = 0; - -typedef struct _parameter { - const char*name; - const char*value; - struct _parameter*next; -} parameter_t; - -parameter_t*params = 0; - -int args_callback_option(char*name,char*val) -{ - if(!strcmp(name, "V")) { - printf("swfrender - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } else if(!strcmp(name, "o")) { - outputname = strdup(val); - return 1; - } else if(!strcmp(name, "l")) { - ng = 0; - return 0; - } else if(!strcmp(name, "q")) { - quantize = 1; - return 0; - } else if(!strcmp(name, "p")) { - pagerange = val; - return 1; - } else if(!strcmp(name, "s")) { - char*s = strdup(val); - char*c = strchr(s, '='); - parameter_t*p = malloc(sizeof(parameter_t)); - p->next = params; - params = p; - if(c && *c && c[1]) { - *c = 0; - c++; - p->name = s; - p->value = s; - } else { - p->name = s; - p->value = "1"; - } - return 1; - } else if(!strcmp(name, "X")) { - width = atoi(val); - return 1; - } else if(!strcmp(name, "Y")) { - height = atoi(val); - return 1; - } else { - printf("Unknown option: -%s\n", name); - exit(1); - } - - return 0; -} -int args_callback_longoption(char*name,char*val) -{ - return args_long2shortoption(options, name, val); -} -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s file.swf [-o output.png]\n", name); - printf("\n"); - printf("-h , --help Print short help message and exit\n"); - printf("-l , --legacy Use old rendering framework\n"); - printf("-o , --output Output file (default: output.png)\n"); - printf("\n"); -} -int args_callback_command(char*name,char*val) -{ - if(filename) { - fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n", - filename, name); - } - filename = name; - return 0; -} - - - -int main(int argn, char*argv[]) -{ - SWF swf; - int fi; - - processargs(argn, argv); - - if(!filename) { - fprintf(stderr, "You must supply a filename.\n"); - return 1; - } - - if(!ng) { - fi = open(filename, O_RDONLY|O_BINARY); - if (fi<=0) { - fprintf(stderr,"Couldn't open %s\n", filename); - perror(filename); - exit(1); - } - if(swf_ReadSWF(fi,&swf)<0) { - fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",argv[1]); - close(fi); - } - assert(swf.movieSize.xmax > swf.movieSize.xmin && swf.movieSize.ymax > swf.movieSize.ymin); - RENDERBUF buf; - swf_Render_Init(&buf, 0,0, (swf.movieSize.xmax - swf.movieSize.xmin) / 20, - (swf.movieSize.ymax - swf.movieSize.ymin) / 20, 2, 1); - swf_RenderSWF(&buf, &swf); - RGBA* img = swf_Render(&buf); - if(quantize) - png_write_palette_based_2(outputname, (unsigned char*)img, buf.width, buf.height); - else - png_write(outputname, (unsigned char*)img, buf.width, buf.height); - swf_Render_Delete(&buf); - } else { - parameter_t*p; - - gfxsource_t*src = gfxsource_swf_create(); - for(p=params;p;p=p->next) { - src->setparameter(src, p->name, p->value); - } - gfxdocument_t*doc = src->open(src, filename); - for(p=params;p;p=p->next) { - doc->setparameter(doc, p->name, p->value); - } - if(!doc) { - fprintf(stderr,"Couldn't open %s\n", filename); - exit(1); - } - gfxdevice_t dev2,*dev=&dev2; - gfxdevice_render_init(dev); - dev->setparameter(dev, "antialise", "4"); - if(quantize) { - dev->setparameter(dev, "palette", "1"); - } - if(width || height) { - dev = gfxdevice_rescale_new(dev, width, height, 0); - } - for(p=params;p;p=p->next) { - dev->setparameter(dev, p->name, p->value); - } - - int t; - for(t=1;t<=doc->num_pages;t++) { - if(!is_in_range(t, pagerange)) - continue; - gfxpage_t* page = doc->getpage(doc, t); - dev->startpage(dev, page->width, page->height); - page->render(page, dev); - dev->endpage(dev); - page->destroy(page); - break; - } - gfxresult_t*result = dev->finish(dev); - if(result) { - if(result->save(result, outputname) < 0) { - exit(1); - } - result->destroy(result); - } - doc->destroy(doc); - } - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/src/swfstrings b/fluidbook/tools/swftools-special-swfdump/src/swfstrings deleted file mode 100644 index 610902da85fe2415765e319b25ff772ea14e6014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 790078 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

  • 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 z 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%0D6wd{N5h5r@x{a=Mo!jz-KfU&<2^b1#tc^N0l& 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 QufwnEGi_e^K!V->0gC+I+yDRo diff --git a/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.1 b/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.1 deleted file mode 100644 index 3da21bba8..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.1 +++ /dev/null @@ -1,62 +0,0 @@ -.TH jpeg2swf "1" "August 2009" "jpeg2swf" "swftools" -.SH NAME -jpeg2swf - Converts jpeg images to SWF. - -.SH Synopsis -.B jpeg2swf [-options [value]] imagefiles[.jpg]|[.jpeg] [...] - -.SH DESCRIPTION -This tool converts jpeg image files into an SWF animation. It takes any -number of input pictures, and converts them to SWF one-by-one, where every -converted picture is a seperate frame in the target SWF. - -.SH OPTIONS -.TP -\fB\-o\fR, \fB\-\-output\fR \fIoutputfile\fR - Explicitly specify output file. (Otherwise, output will go to stdout / output.swf) -.TP -\fB\-q\fR, \fB\-\-quality\fR \fIquality\fR - Set compression quality (1-100, 1=worst, 100=best). - This option can be set independently for each image. -.TP -\fB\-r\fR, \fB\-\-rate\fR \fIframerate\fR - Set movie framerate (frames per second) -.TP -\fB\-z\fR, \fB\-\-zlib\fR \fIzlib\fR - Use Flash MX (SWF 6) Zlib encoding for the output. The resulting SWF will be - smaller, but not playable in Flash Plugins of Version 5 and below. -.TP -\fB\-M\fR, \fB\-\-mx\fR - Use Flash MX H.263 compression (use for correlated images) -.TP -\fB\-x\fR, \fB\-\-xoffset\fR \fIoffset\fR - horizontally offset images by \fIoffset\fR -.TP -\fB\-y\fR, \fB\-\-yoffset\fR \fIoffset\fR - vertically offset images by \fIoffset\fR -.TP -\fB\-X\fR, \fB\-\-width\fR \fIwidth\fR - Force movie width to \fIwidth\fR (default: autodetect) -.TP -\fB\-Y\fR, \fB\-\-height\fR \fIheight\fR - Force movie height to \fIheight\fR (default: autodetect) -.TP -\fB\-T\fR, \fB\-\-flashversion\fR \fIversion\fR - Set flash file version to \fIversion\fR -.TP -\fB\-v\fR, \fB\-\-verbose\fR \fIlevel\fR - Set verbose level to \fIlevel\fR (0=quiet, 1=default, 2=debug) -.TP -\fB\-V\fR, \fB\-\-version\fR - Print version information and exit -.TP -\fB\-f\fR, \fB\-\-fit-to-movie\fR - Fit images to movie size -.TP -\fB\-e\fR, \fB\-\-export\fR \fIassetname\fR - Make importable as asset with \fIassetname\fR -.SH AUTHORS - -Rainer Böhme -.TP -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.c b/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.c deleted file mode 100644 index 441745004..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/jpeg2swf.c +++ /dev/null @@ -1,646 +0,0 @@ -/* jpeg2swf.c - - JPEG to SWF converter tool - - Part of the swftools package. - - Copyright (c) 2001 Rainer Böhme - Copyright (c) 2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include "../lib/rfxswf.h" -#include "../lib/args.h" // not really a header ;-) - -#define MAX_INPUT_FILES 1024 -#define VERBOSE(x) (global.verbose>=x) - -static struct { - int quality; - float framerate; - int max_image_width; - int max_image_height; - int force_width; - int force_height; - int nfiles; - int verbose; - char *outfile; - int mx; - int next_id; - char *asset_name; - int version; - int fit_to_movie; - float scale; -} global; - -static int custom_move=0; -static int move_x=0; -static int move_y=0; -static int clip_x1=0,clip_y1=0,clip_x2=0,clip_y2=0; -static int custom_clip = 0; - -typedef struct _image { - char *filename; - int quality; - int width; - int height; -} image_t; -image_t image[MAX_INPUT_FILES]; - -VIDEOSTREAM stream; - -TAG *MovieStart(SWF * swf, float framerate, int dx, int dy) -{ - TAG *t; - RGBA rgb; - - memset(swf, 0x00, sizeof(SWF)); - - swf->fileVersion = global.version; - swf->frameRate = (int)(256.0 * framerate); - - if(custom_clip) { - swf->movieSize.xmin = clip_x1 * 20; - swf->movieSize.ymin = clip_y1 * 20; - swf->movieSize.xmax = clip_x2 * 20; - swf->movieSize.ymax = clip_y2 * 20; - } else { - swf->movieSize.xmin = 0; - swf->movieSize.ymin = 0; - swf->movieSize.xmax = swf->movieSize.xmin + dx * 20; - swf->movieSize.ymax = swf->movieSize.ymin + dy * 20; - } - - t = swf->firstTag = swf_InsertTag(NULL, ST_SETBACKGROUNDCOLOR); - - rgb.r = rgb.g = rgb.b = rgb.a = 0x00; - swf_SetRGB(t, &rgb); - - if (global.mx) { - t = swf_InsertTag(t, ST_DEFINEVIDEOSTREAM); - swf_SetU16(t, 0xf00d); - swf_SetVideoStreamDefine(t, &stream, 65535, dx, dy); - } else if (global.asset_name) { - t = swf_InsertTag(t, ST_DEFINESPRITE); - swf_SetU16(t, 1); - swf_SetU16(t, global.next_id++); - } - - return t; -} - -int MovieFinish(SWF * swf, TAG * t, char *sname) -{ - int handle, so = fileno(stdout); - - if (global.asset_name) { - SWFPLACEOBJECT obj; - - t = swf_InsertTag(t, ST_END); - t = swf_InsertTag(t, ST_EXPORTASSETS); - swf_SetU16(t, 1); - swf_SetU16(t, 1); - swf_SetString(t, global.asset_name); - - t = swf_InsertTag(t, ST_PLACEOBJECT2); - swf_GetPlaceObject(0, &obj); - obj.depth = 1; - obj.id = 1; - swf_SetPlaceObject(t, &obj); - - t = swf_InsertTag(t, ST_SHOWFRAME); - } - - t = swf_InsertTag(t, ST_END); - - if ((!isatty(so)) && (!sname)) - handle = so; - else { - if (!sname) - sname = "output.swf"; - handle = open(sname, O_BINARY | O_RDWR | O_CREAT | O_TRUNC, 0666); - } - if(handle<0 && sname) { - perror(sname); - } - if (swf_WriteSWF(handle, swf)<0) - fprintf(stderr, "Unable to write output file: %s\n", sname); - - if (handle != so) - close(handle); - - swf_FreeTags(swf); - return 0; -} - -int getJPEG(char*filename, int* width, int* height, RGBA**pic2) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - struct jpeg_source_mgr mgr; - int x,y; - FILE*f; - RGBA*pic,*js; - U8*buf; - - if ((f=fopen(filename,"rb"))==NULL) { - fprintf(stderr, "rfxswf: file open error\n"); - return 0; - } - - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - jpeg_stdio_src(&cinfo, f); - jpeg_read_header(&cinfo, TRUE); - jpeg_start_decompress(&cinfo); - - pic = malloc(cinfo.output_width*cinfo.output_height*sizeof(RGBA)); - buf = malloc(cinfo.output_width*4); - memset(pic, 255, cinfo.output_width*cinfo.output_height*sizeof(RGBA)); - js = pic; - - *width = cinfo.output_width; - *height = cinfo.output_height; - - for (y=0;y>8); - js[x].g = y - ((88*(u-128)+183*(v-128))>>8); - js[x].b = y + ((455 * (u-128))>>8); - } - } - else if(cinfo.out_color_space == JCS_CMYK) - { - for(x=0;x>8); - js[x].g = white - ((buf[x*4+1]*white)>>8); - js[x].b = white - ((buf[x*4+2]*white)>>8); - } - } - js += cinfo.output_width; - } - - jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - - free(buf); - *pic2 = pic; - return 1; -} - - -int frame = 0; -TAG *MovieAddFrame(SWF * swf, TAG * t, char *sname, int quality, - int width, int height) -{ - SHAPE *s; - SRECT r; - MATRIX m; - int fs; - int movie_width = swf->movieSize.xmax - swf->movieSize.xmin; - int movie_height = swf->movieSize.ymax - swf->movieSize.ymin; - - if(global.mx) { - int sizex, sizey; - RGBA * pic2; - SWFPLACEOBJECT obj; - int quant=0; - getJPEG(sname, &sizex, &sizey, &pic2); - if(sizex != stream.owidth || sizey != stream.oheight) { - fprintf(stderr, "All images must have the same dimensions if using -m!"); - exit(1); - } - - t = swf_InsertTag(t, ST_VIDEOFRAME); - swf_SetU16(t, 0xf00d); - quant = 1+(30-(30*quality)/100); - if(!(frame%20)) { - swf_SetVideoStreamIFrame(t, &stream, pic2, quant); - } else { - swf_SetVideoStreamPFrame(t, &stream, pic2, quant); - } - - t = swf_InsertTag(t, ST_PLACEOBJECT2); - swf_GetPlaceObject(0, &obj); - if(frame==0) { - obj.depth = 1; - obj.id = 0xf00d; - } else { - obj.depth = 1; - obj.move = 1; - obj.ratio = frame; - } - swf_SetPlaceObject(t,&obj); - - t = swf_InsertTag(t, ST_SHOWFRAME); - } else { - t = swf_InsertTag(t, ST_DEFINEBITSJPEG2); - swf_SetU16(t, global.next_id); // id - swf_SetJPEGBits(t,sname,quality); - - t = swf_InsertTag(t, ST_DEFINESHAPE); - swf_ShapeNew(&s); - swf_GetMatrix(NULL, &m); - if (global.fit_to_movie) { - m.sx = 0x10000 * movie_width / width; - m.sy = 0x10000 * movie_height / height; - width = movie_width / 20; - height = movie_height / 20; - } else { - m.sx = 20 * 0x10000; - m.sy = 20 * 0x10000; - } - m.tx = 0; - m.ty = 0; - fs = swf_ShapeAddBitmapFillStyle(s, &m, global.next_id, 1); - global.next_id++; - swf_SetU16(t, global.next_id); // id - r.xmin = 0; - r.ymin = 0; - r.xmax = r.xmin + width * 20; - r.ymax = r.ymin + height * 20; - swf_SetRect(t, &r); - swf_SetShapeHeader(t, s); - swf_ShapeSetAll(t, s, r.xmin, r.ymin, 0, fs, 0); - swf_ShapeSetLine(t, s, r.xmax - r.xmin, 0); - swf_ShapeSetLine(t, s, 0, r.ymax - r.ymin); - swf_ShapeSetLine(t, s, -r.xmax + r.xmin, 0); - swf_ShapeSetLine(t, s, 0, -r.ymax + r.ymin); - swf_ShapeSetEnd(t); - - if(frame) { - t = swf_InsertTag(t, ST_REMOVEOBJECT2); - swf_SetU16(t, 1); // depth - } - - t = swf_InsertTag(t, ST_PLACEOBJECT2); - swf_GetMatrix(NULL, &m); - m.sx = (int)(0x10000 * global.scale); - m.sy = (int)(0x10000 * global.scale); - - if(custom_move) { - m.tx = move_x*20; - m.ty = move_y*20; - } else { - m.tx = (movie_width - (width * global.scale * 20)) / 2; - m.ty = (movie_height - (height * global.scale * 20)) / 2; - } - swf_ObjectPlace(t, global.next_id, 1, &m, NULL, NULL); - global.next_id++; - t = swf_InsertTag(t, ST_SHOWFRAME); - } - frame++; - - return t; -} - -int CheckInputFile(image_t* i, char *fname, char **realname) -{ - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - FILE *f; - char *s = malloc(strlen(fname) + 5); - int width, height; - - if (!s) - exit(2); - (*realname) = s; - strcpy(s, fname); - - // Check whether file exists (with typical extensions) - - if ((f = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.jpg", fname); - if ((f = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.jpeg", fname); - if ((f = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.JPG", fname); - if ((f = fopen(s, "rb")) == NULL) { - sprintf(s, "%s.JPEG", fname); - if ((f = fopen(s, "rb")) == NULL) - return -1; - } - } - } - } - - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - jpeg_stdio_src(&cinfo, f); - jpeg_read_header(&cinfo, TRUE); - - width = cinfo.image_width; - height = cinfo.image_height; - - i->width = width; - i->height = height; - - // Get image dimensions - - if (global.max_image_width < width) - global.max_image_width = width; - if (global.max_image_height < height) - global.max_image_height = height; - - jpeg_destroy_decompress(&cinfo); - fclose(f); - - return 0; -} - -int args_callback_option(char *arg, char *val) -{ - int res = 0; - if (arg[1]) - res = -1; - else - switch (arg[0]) { - case 'q': - if (val) - global.quality = atoi(val); - if ((global.quality < 1) ||(global.quality > 100)) { - if (VERBOSE(1)) - fprintf(stderr, - "Error: You must specify a valid quality between 1 and 100.\n"); - exit(1); - } - res = 1; - break; - - case 'r': - if (val) - global.framerate = atof(val); - if ((global.framerate < 1.0/256) || (global.framerate >= 256.0)) { - if (VERBOSE(1)) - fprintf(stderr, - "Error: You must specify a valid framerate between 1 and 10000.\n"); - exit(1); - } - res = 1; - break; - - case 'o': - if (val) - global.outfile = val; - res = 1; - break; - - case 'v': - global.verbose++; - res = 0; - break; - -/* case 'q': - global.verbose--; - if(global.verbose<0) - global.verbose = 0; - res = 0; - break;*/ - - case 'X': - if (val) - global.force_width = atoi(val); - res = 1; - break; - - case 'z': - global.version = 6; - return 0; - - case 'Y': - if (val) - global.force_height = atoi(val); - res = 1; - break; - - case 'V': - printf("jpeg2swf - part of %s %s\n", PACKAGE, VERSION); - exit(0); - - case 'e': - if (val) - global.asset_name = val; - res = 1; - break; - - case 'T': - global.version = atoi(val); - res = 1; - break; - - case 'f': - global.fit_to_movie = 1; - res = 0; - break; - - case 'c': { - char*s = strdup(val); - char*x1 = strtok(s, ":"); - char*y1 = strtok(0, ":"); - char*x2 = strtok(0, ":"); - char*y2 = strtok(0, ":"); - if(!(x1 && y1 && x2 && y2)) { - fprintf(stderr, "-m option requires four arguments, :::\n"); - exit(1); - } - custom_clip = 1; - clip_x1 = atoi(x1); - clip_y1 = atoi(y1); - clip_x2 = atoi(x2); - clip_y2 = atoi(y2); - free(s); - - res = 1; - break; - } - - case 'M': { - global.mx = 1; - res = 1; - break; - } - - case 'm': { - char*s = strdup(val); - char*c = strchr(s, ':'); - if(!c) { - fprintf(stderr, "-m option requires two arguments, :\n"); - exit(1); - } - *c = 0; - custom_move = 1; - move_x = atoi(val); - move_y = atoi(c+1); - free(s); - - res = 1; - break; - } - - case 's': { - global.scale = atof(val)/100; - res = 1; - break; - } - - default: - res = -1; - break; - } - - if (res < 0) { - if (VERBOSE(1)) - fprintf(stderr, "Unknown option: -%s\n", arg); - exit(1); - return 0; - } - return res; -} - -static struct options_t options[] = { -{"o", "output"}, -{"q", "quality"}, -{"r", "rate"}, -{"z", "zlib"}, -{"M", "mx"}, -{"x", "xoffset"}, -{"y", "yoffset"}, -{"X", "width"}, -{"Y", "height"}, -{"T", "flashversion"}, -{"v", "verbose"}, -{"V", "version"}, -{"f", "fit-to-movie"}, -{"e", "export"}, -{0,0} -}; - -int args_callback_longoption(char *name, char *val) -{ - return args_long2shortoption(options, name, val); -} - -int args_callback_command(char *arg, char *next) // actually used as filename -{ - char *s; - image_t* i = &image[global.nfiles]; - if (CheckInputFile(i, arg, &s) < 0) { - if (VERBOSE(1)) - fprintf(stderr, "Unable to open input file: %s\n", arg); - free(s); - } else { - i->filename = s; - i->quality = global.quality; - global.nfiles++; - if (global.nfiles >= MAX_INPUT_FILES) { - if (VERBOSE(1)) - fprintf(stderr, "Error: Too many input files.\n"); - exit(1); - } - } - return 0; -} - -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s [-options [value]] imagefiles[.jpg]|[.jpeg] [...]\n", name); - printf("\n"); - printf("-o , --output Explicitly specify output file. (otherwise, output.swf will be used)\n"); - printf("-q , --quality Set compression quality (1-100, 1=worst, 100=best)\n"); - printf("-r , --rate Set movie framerate (frames per second)\n"); - printf("-z , --zlib Enable Flash 6 (MX) Zlib Compression\n"); - printf("-M , --mx Use Flash MX H.263 compression (use for correlated images)\n"); - printf("-x , --xoffset horizontally offset images by \n"); - printf("-y , --yoffset vertically offset images by \n"); - printf("-X , --width Force movie width to (default: autodetect)\n"); - printf("-Y , --height Force movie height to (default: autodetect)\n"); - printf("-T , --flashversion Set flash file version to \n"); - printf("-v , --verbose Set verbose level to (0=quiet, 1=default, 2=debug)\n"); - printf("-V , --version Print version information and exit\n"); - printf("-f , --fit-to-movie Fit images to movie size\n"); - printf("-e , --export Make importable as asset with \n"); - printf("\n"); -} - - -int main(int argc, char **argv) -{ - SWF swf; - TAG *t; - - memset(&global, 0x00, sizeof(global)); - - global.quality = 60; - global.framerate = 1.0; - global.verbose = 1; - global.version = 4; - global.asset_name = NULL; - global.next_id = 1; - global.fit_to_movie = 0; - global.scale = 1.0; - - processargs(argc, argv); - - if (VERBOSE(2)) - fprintf(stderr, "Processing %i file(s)...\n", global.nfiles); - - t = MovieStart(&swf, global.framerate, - global.force_width ? global.force_width : (int)(global.max_image_width*global.scale), - global.force_height ? global.force_height : (int)(global.max_image_height*global.scale)); - - { - int i; - for (i = 0; i < global.nfiles; i++) { - if (VERBOSE(3)) - fprintf(stderr, "[%03i] %s (%i%%)\n", i, - image[i].filename, image[i].quality); - t = MovieAddFrame(&swf, t, image[i].filename, image[i].quality, - image[i].width, image[i].height); - free(image[i].filename); - } - } - - MovieFinish(&swf, t, global.outfile); - - return 0; -} diff --git a/fluidbook/tools/swftools-special-swfdump/src/parser.h b/fluidbook/tools/swftools-special-swfdump/src/parser.h deleted file mode 100644 index 348468664..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/parser.h +++ /dev/null @@ -1,46 +0,0 @@ -/* parser.h - - Copyright (c) 2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __parser_h__ -#define __parser_h__ - -enum type_t { - TWIP=0, - NUMBER=1, - COMMAND=2, - STRING=3, - ASSIGNMENT=4, - IDENTIFIER=5, - RAWDATA=6, - END=7 -}; - -extern char*type_names[]; - -struct token_t { - enum type_t type; - int text_pos; - char* text; - int line; - int column; -}; - -extern struct token_t* generateTokens(char*filename); -extern void freeTokens(struct token_t*); - -#endif diff --git a/fluidbook/tools/swftools-special-swfdump/src/parser.lex b/fluidbook/tools/swftools-special-swfdump/src/parser.lex deleted file mode 100644 index 2d1d3169c..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/parser.lex +++ /dev/null @@ -1,332 +0,0 @@ -%{ - -#include -#include -#include -#include "../lib/q.h" -#include "parser.h" -#include "../lib/utf8.h" - -//RVALUE {NUMBER}|{PERCENT}|{NAME}|\"{STRING}\"|{DIM} -//. {printf("%s\n", yytext);} -// %x: exclusive, %s: inclusive -char*type_names[] = {"twip","number","command","string","assignment","identifier","label","end"}; -static int line=1; -static int column=1; - -mem_t strings; -mem_t tokens; - -static void count(char*text, int len, int condition) -{ - int t; - for(t=0;tstr; (p=strchr(p1, '\\')); p1 = p+1) - { - int nr=2; - int new=1; - switch(p[1]) - { - case '\\': p[0] = '\\'; break; - case '"': p[0] = '"'; break; - case 'b': p[0] = '\b'; break; - case 'f': p[0] = '\f'; break; - case 'n': p[0] = '\n'; break; - case 'r': p[0] = '\r'; break; - case 't': p[0] = '\t'; break; - case 'x': case 'u': { - int max=4; - int num=0; - char*utf8; - char bracket = 0; - if(p[1] == 'u') - max = 6; - if(p[2] == '{') { - bracket = 1;nr++;max++; - } - while(strchr("0123456789abcdefABCDEF", p[nr]) && (bracket || nr < max)) { - num <<= 4; - if(p[nr]>='0' && p[nr]<='9') num |= p[nr] - '0'; - if(p[nr]>='a' && p[nr]<='f') num |= p[nr] - 'a' + 10; - if(p[nr]>='A' && p[nr]<='F') num |= p[nr] - 'A' + 10; - nr++; - } - if(bracket && p[nr]=='}') { - bracket = 0; - nr++; - } - utf8 = getUTF8(num); - new = strlen(utf8); - memcpy(p, utf8, new); // do not copy the terminating zero - break; - } - default: - continue; - } - tmp->len -= (nr-new); - { - int t; - char*to=p+new,*from=p+nr; - while(*from) { - *to = *from; - to++; - from++; - } - } - } -} - -static void store(enum type_t type, int line, int column, char*text, int length) -{ - struct token_t token; - string_t tmp; - token.type = type; - token.line = line; - token.column = column; - //printf("->%d(%s) %s\n", type, type_names[type], text);fflush(stdout); - - token.text_pos = 0; - token.text = 0; - switch(type) { - case END: - string_set2(&tmp, "", 0); - token.text_pos = mem_putstring(&strings, tmp); - break; - case STRING: - string_set2(&tmp, text+1, length-2); - unescapeString(&tmp); - token.text_pos = mem_putstring(&strings, tmp); - break; - case TWIP: - case NUMBER: - case IDENTIFIER: - string_set2(&tmp, text, length); - if(prefix) { - //strcat - token.text_pos = mem_put(&strings, prefix, strlen(prefix)); - mem_putstring(&strings, tmp); - } else { - token.text_pos = mem_putstring(&strings, tmp); - } - prefix = 0; - break; - case RAWDATA: - string_set2(&tmp, text+1/*:*/, length-5/*.end*/); - token.text_pos = mem_putstring(&strings, tmp); - break; - case COMMAND: - string_set2(&tmp, text+1, length-1); - token.text_pos = mem_putstring(&strings, tmp); - break; - case ASSIGNMENT: { - char*x = &text[length-1]; - if(x[-1] == '-' || x[-1] == '+') - x--; - do{x--;} while(*x==32 || *x==10 || *x==13 || *x=='\t'); - x++; //first space - string_set2(&tmp, text, x-text); - token.text_pos = mem_putstring(&strings, tmp); - /*char*y,*x = strchr(text, '='); - if(!x) exit(1); - y=x; - do{y--;} while(*y==32 || *y==10 || *y==13 || *y=='\t'); - do{x++;} while(*x==32 || *x==10 || *x==13 || *x=='\t'); - token.text1 = (char*)put(&strings, text, y-text + 1, 1); - token.text2 = (char*)put(&strings, x, length-(x-text), 1);*/ - } break; - } - - mem_put(&tokens, &token, sizeof(struct token_t)); - prefix = 0; -} - -#define MAX_INCLUDE_DEPTH 16 -static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; -static int line_stack[MAX_INCLUDE_DEPTH]; -static int column_stack[MAX_INCLUDE_DEPTH]; -static int include_stack_ptr = 0; - -static void handleInclude(char*text, int len) -{ - text+=9;len-=9; - while(len >=1 && (text[0] == ' ' || text[0] == '\t')) { - text++;len--; - } - while(len >= 1 && - (text[len-1] == ' ' || - text[len-1] == '\r' || - text[len-1] == '\n')) { - len--; - } - if(len >= 2 && text[0] == '"' && text[len-1] == '"') { - text++; len-=2; - } - text[len] = 0; - if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { - fprintf( stderr, "Includes nested too deeply" ); - exit( 1 ); - } - include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; - line_stack[include_stack_ptr] = line; - column_stack[include_stack_ptr] = column; - include_stack_ptr++; - yyin = fopen(text, "rb"); - if (!yyin) { - fprintf(stderr, "Couldn't open %s\n", text); - exit(1); - } - yy_switch_to_buffer(yy_create_buffer( yyin, YY_BUF_SIZE ) ); - -#ifdef INITIAL - BEGIN(INITIAL); -#else - // best guess - BEGIN(0); -#endif -} - -#define c() {count(yytext, yyleng, YY_START);} -#define s(type) {store(type, line, column, yytext, yyleng);} -%} - -%s R -%x BINARY - -NAME [a-zA-Z_./](-*[a-zA-Z0-9_./])* -TWIP (-?[0-9]+(\.([0-9]([05])?)?)?) -NUMBER -?[0-9]+(\.[0-9]*)? -PERCENT {NUMBER}% -STRING (\\.|[^\\"\n])* -S [ \n\r\t] -RVALUE \"{STRING}\"|([^ \n\r\t]+) - -%% - -\] {c();BEGIN(0);} -. {c();} -\n {c();} -{TWIP}/[ \n\r\t] {s(TWIP);c();BEGIN(0);} -{NUMBER}/[ \n\r\t] {s(NUMBER);c();BEGIN(0);} -^#[^\n]*\n {c();} -[ \t\r]#[^\n]*\n {c();} -\"{STRING}\" {s(STRING);c();BEGIN(0);} -\"{STRING}$ {c();printf("unterminated string in line %d: %s\n", line, yytext);exit(1);yyterminate();} -{NAME}{S}*\+= {s(ASSIGNMENT);prefix="";c();BEGIN(R);} -{NAME}{S}*-= {s(ASSIGNMENT);prefix="";c();BEGIN(R);} -{NAME}{S}*= {s(ASSIGNMENT);c();BEGIN(R);} -{ /* values which appear only on the right-hand side of assignments, like: x=50% */ - [^ :\n\t\r]* {s(IDENTIFIER);c();BEGIN(0);} -} -\.include{S}.*\n {handleInclude(yytext, yyleng);} -\.{NAME} {s(COMMAND);c();} -:([^.]|\.[^e]|\.e[^n]|\.en[^d]|\.end[^ \n\r\t]|[ \n\r\t])*\.end {s(RAWDATA);c();} -{NAME} {s(IDENTIFIER);c();} -"[" {c();BEGIN(BINARY);} -{S} {c();} -. {char c,c1=yytext[0]; - printf("Syntax error in line %d, %d: %s", line, column, yytext); - while(1) { - c=input(); - if(c=='\n' || c==EOF) - break; - printf("%c", c); - } - if(c1>='0' && c1<='9') - printf(" (identifiers must not start with a digit)"); - printf("\n"); - exit(1); - yyterminate(); - } -<> {c(); - if ( --include_stack_ptr < 0 ) { - s(END); - yyterminate(); - } else { - yy_delete_buffer( YY_CURRENT_BUFFER ); - yy_switch_to_buffer( - include_stack[include_stack_ptr] ); - column = column_stack[include_stack_ptr]; - line = line_stack[include_stack_ptr]; - } - } - -%% - -int yywrap() -{ - return 1; -} - -void freeTokens(struct token_t*file) -{ - mem_clear(&strings); - mem_clear(&tokens); -} - -struct token_t* generateTokens(char*filename) -{ - FILE*fi; - int t; - struct token_t*result; - int num; - - if(!filename) - return 0; - - if(!strcmp(filename,"-")) - fi = stdin; - else - fi = fopen(filename, "rb"); - - if(!fi) { - printf("Couldn't find file %s\n", filename); - return 0; - } - yyin = fi; - - mem_init(&strings); - mem_init(&tokens); - mem_put(&strings, &t, 1); //hack- make all valid strings start at position >0 - - line=1; - column=1; - - yylex(); -#ifdef YY_CURRENT_BUFFER - // some newer flex versions require it like this: - yy_delete_buffer(YY_CURRENT_BUFFER); -#else - yy_delete_buffer(yy_current_buffer); -#endif - - result = (struct token_t*)tokens.buffer; - num = tokens.pos/sizeof(struct token_t); - - for(t=0;t 0 -#define FLEX_BETA -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* 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; -#endif /* ! C99 */ - -/* 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 - -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* 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 -#define YY_BUF_SIZE 16384 -#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 - -extern int yyleng; - -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - -/* 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_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - 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. - */ - yy_size_t 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 */ - -/* 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 = 0; /**< Stack as an array. */ - -/* 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)] - -/* 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 = (char *) 0; -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; - -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 (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); - -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) - -/* Begin user sect3 */ - -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; - -typedef int yy_state_type; - -extern int yylineno; - -int yylineno = 1; - -extern char *yytext; -#define yytext_ptr yytext - -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 yy_fatal_error (yyconst char msg[] ); - -/* 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; \ - yyleng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 21 -#define YY_END_OF_BUFFER 22 -/* 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 yyconst flex_int16_t yy_accept[111] = - { 0, - 0, 0, 13, 13, 0, 0, 22, 20, 19, 19, - 20, 20, 17, 17, 20, 20, 18, 20, 13, 13, - 13, 13, 13, 13, 13, 13, 2, 3, 1, 0, - 0, 9, 8, 0, 0, 0, 0, 0, 15, 17, - 12, 15, 4, 0, 0, 0, 0, 0, 6, 13, - 13, 8, 13, 13, 13, 13, 13, 13, 12, 13, - 13, 13, 0, 7, 0, 10, 0, 11, 0, 15, - 15, 0, 0, 10, 13, 11, 13, 13, 13, 13, - 0, 15, 0, 0, 0, 13, 13, 13, 13, 15, - 5, 16, 13, 15, 13, 15, 13, 15, 13, 0, - - 0, 0, 14, 0, 0, 12, 14, 10, 11, 0 - } ; - -static yyconst flex_int32_t yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 4, 5, 1, 1, 1, 1, 1, - 1, 1, 6, 1, 7, 8, 9, 10, 11, 11, - 11, 11, 10, 11, 11, 11, 11, 12, 1, 1, - 13, 1, 1, 1, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 14, 15, 16, 1, 9, 1, 9, 9, 17, 18, - - 19, 9, 9, 9, 20, 9, 9, 21, 9, 22, - 9, 9, 9, 9, 9, 9, 23, 9, 9, 9, - 9, 9, 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, 1, 1, 1, 1 - } ; - -static yyconst flex_int32_t yy_meta[24] = - { 0, - 1, 2, 2, 1, 1, 3, 3, 3, 3, 3, - 3, 4, 3, 1, 1, 1, 3, 3, 3, 3, - 3, 3, 3 - } ; - -static yyconst flex_int16_t yy_base[122] = - { 0, - 0, 230, 23, 229, 44, 45, 233, 395, 227, 395, - 47, 42, 61, 83, 95, 85, 395, 228, 0, 105, - 44, 120, 136, 158, 0, 54, 395, 395, 395, 227, - 96, 395, 395, 225, 0, 168, 214, 180, 192, 204, - 395, 216, 395, 237, 110, 144, 207, 222, 395, 0, - 247, 0, 89, 0, 211, 261, 274, 0, 0, 199, - 65, 92, 217, 395, 203, 395, 202, 395, 296, 192, - 93, 48, 191, 0, 199, 0, 308, 0, 191, 140, - 191, 141, 193, 162, 184, 187, 159, 168, 320, 150, - 395, 182, 126, 170, 114, 97, 95, 187, 194, 330, - - 99, 342, 0, 164, 188, 74, 395, 62, 46, 395, - 355, 359, 362, 365, 369, 373, 376, 380, 384, 387, - 390 - } ; - -static yyconst flex_int16_t yy_def[122] = - { 0, - 110, 1, 110, 3, 111, 111, 110, 110, 110, 110, - 112, 110, 110, 113, 110, 114, 110, 115, 116, 117, - 116, 110, 22, 116, 116, 118, 110, 110, 110, 119, - 112, 110, 110, 112, 15, 110, 110, 113, 120, 113, - 110, 120, 110, 110, 114, 114, 114, 115, 110, 116, - 117, 116, 117, 24, 116, 23, 110, 23, 116, 57, - 24, 118, 119, 110, 110, 110, 38, 110, 120, 42, - 42, 44, 114, 116, 56, 116, 57, 57, 57, 24, - 69, 42, 72, 83, 114, 77, 57, 24, 116, 42, - 110, 114, 57, 42, 57, 42, 57, 42, 57, 121, - - 121, 121, 36, 121, 121, 121, 110, 121, 121, 0, - 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110 - } ; - -static yyconst flex_int16_t yy_nxt[419] = - { 0, - 8, 9, 10, 11, 8, 8, 12, 13, 14, 15, - 15, 16, 8, 17, 8, 8, 14, 14, 14, 14, - 14, 14, 14, 19, 9, 10, 20, 19, 19, 21, - 22, 23, 24, 24, 16, 19, 25, 19, 19, 23, - 23, 23, 23, 23, 23, 23, 28, 28, 107, 32, - 33, 35, 35, 54, 54, 48, 49, 83, 84, 29, - 29, 34, 36, 36, 107, 48, 37, 38, 39, 39, - 40, 40, 50, 41, 80, 80, 107, 39, 39, 39, - 42, 39, 39, 39, 36, 36, 46, 46, 37, 38, - 31, 110, 47, 48, 49, 41, 43, 43, 32, 33, - - 31, 107, 44, 48, 35, 35, 31, 32, 52, 82, - 34, 46, 46, 99, 70, 98, 31, 47, 70, 53, - 50, 36, 36, 50, 50, 55, 56, 57, 57, 58, - 58, 97, 59, 50, 50, 50, 57, 57, 57, 60, - 57, 57, 57, 58, 58, 46, 46, 50, 95, 88, - 89, 47, 58, 58, 58, 58, 58, 58, 58, 43, - 43, 90, 70, 91, 91, 61, 107, 54, 54, 36, - 36, 70, 94, 37, 65, 50, 108, 89, 89, 93, - 41, 110, 110, 110, 110, 110, 67, 96, 100, 100, - 107, 70, 68, 36, 36, 100, 100, 37, 69, 50, - - 109, 92, 84, 110, 41, 36, 36, 87, 70, 37, - 38, 50, 85, 70, 110, 68, 41, 36, 36, 64, - 79, 37, 69, 74, 49, 73, 66, 110, 41, 64, - 49, 30, 110, 26, 18, 110, 110, 71, 43, 43, - 110, 110, 110, 110, 110, 110, 72, 72, 31, 32, - 52, 110, 110, 110, 110, 110, 110, 110, 31, 110, - 110, 53, 110, 110, 110, 110, 50, 75, 110, 110, - 110, 110, 110, 76, 50, 36, 36, 50, 50, 55, - 77, 78, 78, 78, 78, 110, 59, 50, 50, 50, - 78, 78, 78, 78, 78, 78, 78, 110, 110, 110, - - 110, 110, 81, 110, 110, 110, 110, 110, 68, 110, - 110, 110, 110, 50, 86, 110, 110, 110, 110, 110, - 76, 91, 91, 110, 110, 110, 110, 110, 110, 89, - 89, 102, 103, 110, 110, 104, 105, 110, 110, 110, - 110, 110, 106, 102, 103, 110, 110, 104, 105, 110, - 110, 110, 110, 110, 106, 27, 27, 27, 27, 31, - 31, 31, 31, 40, 40, 45, 45, 45, 45, 48, - 48, 48, 48, 50, 110, 50, 51, 51, 51, 51, - 62, 62, 62, 62, 63, 63, 63, 63, 70, 70, - 101, 101, 101, 101, 7, 110, 110, 110, 110, 110, - - 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 110 - } ; - -static yyconst flex_int16_t yy_chk[419] = - { 0, - 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, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 6, 109, 11, - 11, 12, 12, 21, 21, 26, 26, 72, 72, 5, - 6, 11, 13, 13, 108, 26, 13, 13, 13, 13, - 13, 13, 61, 13, 61, 61, 106, 13, 13, 13, - 13, 13, 13, 13, 14, 14, 16, 16, 14, 14, - 53, 53, 16, 62, 62, 14, 15, 15, 31, 31, - - 53, 101, 15, 62, 15, 15, 20, 20, 20, 71, - 31, 45, 45, 97, 71, 96, 20, 45, 96, 20, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 95, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 23, 23, 46, 46, 80, 93, 80, - 80, 46, 23, 23, 23, 23, 23, 23, 23, 24, - 24, 82, 82, 84, 84, 24, 104, 24, 24, 36, - 36, 90, 90, 36, 36, 88, 104, 88, 88, 87, - 36, 38, 38, 92, 92, 38, 38, 94, 98, 98, - 105, 94, 38, 39, 39, 99, 99, 39, 39, 86, - - 105, 85, 83, 81, 39, 40, 40, 79, 98, 40, - 40, 75, 73, 70, 67, 65, 40, 42, 42, 63, - 60, 42, 42, 55, 48, 47, 37, 34, 42, 30, - 18, 9, 7, 4, 2, 0, 0, 42, 44, 44, - 0, 0, 0, 0, 0, 0, 44, 44, 51, 51, - 51, 0, 0, 0, 0, 0, 0, 0, 51, 0, - 0, 51, 56, 56, 0, 0, 56, 56, 0, 0, - 0, 0, 0, 56, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 0, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 69, 69, 0, - - 0, 69, 69, 0, 0, 0, 0, 0, 69, 77, - 77, 0, 0, 77, 77, 0, 0, 0, 0, 0, - 77, 89, 89, 0, 0, 0, 0, 0, 0, 89, - 89, 100, 100, 0, 0, 100, 100, 0, 0, 0, - 0, 0, 100, 102, 102, 0, 0, 102, 102, 0, - 0, 0, 0, 0, 102, 111, 111, 111, 111, 112, - 112, 112, 112, 113, 113, 114, 114, 114, 114, 115, - 115, 115, 115, 116, 0, 116, 117, 117, 117, 117, - 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, - 121, 121, 121, 121, 110, 110, 110, 110, 110, 110, - - 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 110 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int yy_flex_debug; -int yy_flex_debug = 0; - -/* 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 "parser.lex" -#line 2 "parser.lex" - -#include -#include -#include -#include "../lib/q.h" -#include "parser.h" -#include "../lib/utf8.h" - -//RVALUE {NUMBER}|{PERCENT}|{NAME}|\"{STRING}\"|{DIM} -//. {printf("%s\n", yytext);} -// %x: exclusive, %s: inclusive -char*type_names[] = {"twip","number","command","string","assignment","identifier","label","end"}; -static int line=1; -static int column=1; - -mem_t strings; -mem_t tokens; - -static void count(char*text, int len, int condition) -{ - int t; - for(t=0;tstr; (p=strchr(p1, '\\')); p1 = p+1) - { - int nr=2; - int new=1; - switch(p[1]) - { - case '\\': p[0] = '\\'; break; - case '"': p[0] = '"'; break; - case 'b': p[0] = '\b'; break; - case 'f': p[0] = '\f'; break; - case 'n': p[0] = '\n'; break; - case 'r': p[0] = '\r'; break; - case 't': p[0] = '\t'; break; - case 'x': case 'u': { - int max=4; - int num=0; - char*utf8; - char bracket = 0; - if(p[1] == 'u') - max = 6; - if(p[2] == '{') { - bracket = 1;nr++;max++; - } - while(strchr("0123456789abcdefABCDEF", p[nr]) && (bracket || nr < max)) { - num <<= 4; - if(p[nr]>='0' && p[nr]<='9') num |= p[nr] - '0'; - if(p[nr]>='a' && p[nr]<='f') num |= p[nr] - 'a' + 10; - if(p[nr]>='A' && p[nr]<='F') num |= p[nr] - 'A' + 10; - nr++; - } - if(bracket && p[nr]=='}') { - bracket = 0; - nr++; - } - utf8 = getUTF8(num); - new = strlen(utf8); - memcpy(p, utf8, new); // do not copy the terminating zero - break; - } - default: - continue; - } - tmp->len -= (nr-new); - { - int t; - char*to=p+new,*from=p+nr; - while(*from) { - *to = *from; - to++; - from++; - } - } - } -} - -static void store(enum type_t type, int line, int column, char*text, int length) -{ - struct token_t token; - string_t tmp; - token.type = type; - token.line = line; - token.column = column; - //printf("->%d(%s) %s\n", type, type_names[type], text);fflush(stdout); - - token.text_pos = 0; - token.text = 0; - switch(type) { - case END: - string_set2(&tmp, "", 0); - token.text_pos = mem_putstring(&strings, tmp); - break; - case STRING: - string_set2(&tmp, text+1, length-2); - unescapeString(&tmp); - token.text_pos = mem_putstring(&strings, tmp); - break; - case TWIP: - case NUMBER: - case IDENTIFIER: - string_set2(&tmp, text, length); - if(prefix) { - //strcat - token.text_pos = mem_put(&strings, prefix, strlen(prefix)); - mem_putstring(&strings, tmp); - } else { - token.text_pos = mem_putstring(&strings, tmp); - } - prefix = 0; - break; - case RAWDATA: - string_set2(&tmp, text+1/*:*/, length-5/*.end*/); - token.text_pos = mem_putstring(&strings, tmp); - break; - case COMMAND: - string_set2(&tmp, text+1, length-1); - token.text_pos = mem_putstring(&strings, tmp); - break; - case ASSIGNMENT: { - char*x = &text[length-1]; - if(x[-1] == '-' || x[-1] == '+') - x--; - do{x--;} while(*x==32 || *x==10 || *x==13 || *x=='\t'); - x++; //first space - string_set2(&tmp, text, x-text); - token.text_pos = mem_putstring(&strings, tmp); - /*char*y,*x = strchr(text, '='); - if(!x) exit(1); - y=x; - do{y--;} while(*y==32 || *y==10 || *y==13 || *y=='\t'); - do{x++;} while(*x==32 || *x==10 || *x==13 || *x=='\t'); - token.text1 = (char*)put(&strings, text, y-text + 1, 1); - token.text2 = (char*)put(&strings, x, length-(x-text), 1);*/ - } break; - } - - mem_put(&tokens, &token, sizeof(struct token_t)); - prefix = 0; -} - -#define MAX_INCLUDE_DEPTH 16 -static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; -static int line_stack[MAX_INCLUDE_DEPTH]; -static int column_stack[MAX_INCLUDE_DEPTH]; -static int include_stack_ptr = 0; - -static void handleInclude(char*text, int len) -{ - text+=9;len-=9; - while(len >=1 && (text[0] == ' ' || text[0] == '\t')) { - text++;len--; - } - while(len >= 1 && - (text[len-1] == ' ' || - text[len-1] == '\r' || - text[len-1] == '\n')) { - len--; - } - if(len >= 2 && text[0] == '"' && text[len-1] == '"') { - text++; len-=2; - } - text[len] = 0; - if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { - fprintf( stderr, "Includes nested too deeply" ); - exit( 1 ); - } - include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; - line_stack[include_stack_ptr] = line; - column_stack[include_stack_ptr] = column; - include_stack_ptr++; - yyin = fopen(text, "rb"); - if (!yyin) { - fprintf(stderr, "Couldn't open %s\n", text); - exit(1); - } - yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE ) ); - -#ifdef INITIAL - BEGIN(INITIAL); -#else - // best guess - BEGIN(0); -#endif -} - -#define c() {count(yytext, yyleng, YY_START);} -#define s(type) {store(type, line, column, yytext, yyleng);} - - -#line 787 "parser.yy.c" - -#define INITIAL 0 -#define R 1 -#define BINARY 2 - -#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. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -static int yy_init_globals (void ); - -/* 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 ); - -/* 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 - - static void yyunput (int c,char *buf_ptr ); - -#ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); -#endif - -#ifndef YY_NO_INPUT - -#ifdef __cplusplus -static int yyinput (void ); -#else -static int input (void ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO fwrite( yytext, yyleng, 1, yyout ) -#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) \ - 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 = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - }\ -\ - -#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 -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex (void); - -#define YY_DECL int yylex (void) -#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 break; -#endif - -#define YY_RULE_SETUP \ - if ( yyleng > 0 ) \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ - (yytext[yyleng - 1] == '\n'); \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 220 "parser.lex" - - -#line 977 "parser.yy.c" - - 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 ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - 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; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); -yy_match: - do - { - register 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 >= 111 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_current_state != 110 ); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - 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 222 "parser.lex" -{c();BEGIN(0);} - YY_BREAK -case 2: -YY_RULE_SETUP -#line 223 "parser.lex" -{c();} - YY_BREAK -case 3: -/* rule 3 can match eol */ -YY_RULE_SETUP -#line 224 "parser.lex" -{c();} - YY_BREAK -case 4: -/* rule 4 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 225 "parser.lex" -{s(TWIP);c();BEGIN(0);} - YY_BREAK -case 5: -/* rule 5 can match eol */ -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 226 "parser.lex" -{s(NUMBER);c();BEGIN(0);} - YY_BREAK -case 6: -/* rule 6 can match eol */ -YY_RULE_SETUP -#line 227 "parser.lex" -{c();} - YY_BREAK -case 7: -/* rule 7 can match eol */ -YY_RULE_SETUP -#line 228 "parser.lex" -{c();} - YY_BREAK -case 8: -YY_RULE_SETUP -#line 229 "parser.lex" -{s(STRING);c();BEGIN(0);} - YY_BREAK -case 9: -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -#line 230 "parser.lex" -{c();printf("unterminated string in line %d: %s\n", line, yytext);exit(1);yyterminate();} - YY_BREAK -case 10: -/* rule 10 can match eol */ -YY_RULE_SETUP -#line 231 "parser.lex" -{s(ASSIGNMENT);prefix="";c();BEGIN(R);} - YY_BREAK -case 11: -/* rule 11 can match eol */ -YY_RULE_SETUP -#line 232 "parser.lex" -{s(ASSIGNMENT);prefix="";c();BEGIN(R);} - YY_BREAK -case 12: -/* rule 12 can match eol */ -YY_RULE_SETUP -#line 233 "parser.lex" -{s(ASSIGNMENT);c();BEGIN(R);} - YY_BREAK -/* values which appear only on the right-hand side of assignments, like: x=50% */ -case 13: -YY_RULE_SETUP -#line 235 "parser.lex" -{s(IDENTIFIER);c();BEGIN(0);} - YY_BREAK - -case 14: -/* rule 14 can match eol */ -YY_RULE_SETUP -#line 237 "parser.lex" -{handleInclude(yytext, yyleng);} - YY_BREAK -case 15: -YY_RULE_SETUP -#line 238 "parser.lex" -{s(COMMAND);c();} - YY_BREAK -case 16: -/* rule 16 can match eol */ -YY_RULE_SETUP -#line 239 "parser.lex" -{s(RAWDATA);c();} - YY_BREAK -case 17: -YY_RULE_SETUP -#line 240 "parser.lex" -{s(IDENTIFIER);c();} - YY_BREAK -case 18: -YY_RULE_SETUP -#line 241 "parser.lex" -{c();BEGIN(BINARY);} - YY_BREAK -case 19: -/* rule 19 can match eol */ -YY_RULE_SETUP -#line 242 "parser.lex" -{c();} - YY_BREAK -case 20: -YY_RULE_SETUP -#line 243 "parser.lex" -{char c,c1=yytext[0]; - printf("Syntax error in line %d, %d: %s", line, column, yytext); - while(1) { - c=input(); - if(c=='\n' || c==EOF) - break; - printf("%c", c); - } - if(c1>='0' && c1<='9') - printf(" (identifiers must not start with a digit)"); - printf("\n"); - exit(1); - yyterminate(); - } - YY_BREAK -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(R): -case YY_STATE_EOF(BINARY): -#line 257 "parser.lex" -{c(); - if ( --include_stack_ptr < 0 ) { - s(END); - yyterminate(); - } else { - yy_delete_buffer(YY_CURRENT_BUFFER ); - yy_switch_to_buffer(include_stack[include_stack_ptr] ); - column = column_stack[include_stack_ptr]; - line = line_stack[include_stack_ptr]; - } - } - YY_BREAK -case 21: -YY_RULE_SETUP -#line 270 "parser.lex" -YY_FATAL_ERROR( "flex scanner jammed" ); - YY_BREAK -#line 1213 "parser.yy.c" - - 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; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - 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 - { - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - 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 yylex */ - -/* 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 - */ -static int yy_get_next_buffer (void) -{ - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register 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; - - 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,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - 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), (size_t) 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_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t 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,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } - - (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 */ - - static yy_state_type yy_get_previous_state (void) -{ - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - register 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 >= 111 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) 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 ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -{ - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); - - register 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 >= 111 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 110); - - return yy_is_jam ? 0 : yy_current_state; -} - - static void yyunput (int c, register char * yy_bp ) -{ - register 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. */ - register int number_to_move = (yy_n_chars) + 2; - register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - register 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) = 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; - - (yytext_ptr) = yy_bp; - (yy_hold_char) = *yy_cp; - (yy_c_buf_p) = yy_cp; -} - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) -#else - static int input (void) -#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 = (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 EOF; - - 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); - - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** 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 . - */ - void yyrestart (FILE * input_file ) -{ - - 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( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - - /* 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; -} - -static void yy_load_buffer_state (void) -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (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. - */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) -{ - 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(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; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - * - */ - void yy_delete_buffer (YY_BUFFER_STATE b ) -{ - - 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 ); -} - -#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ -#ifdef __cplusplus -extern "C" { -#endif -#ifdef __THROW /* this is a gnuism */ -extern int isatty (int ) __THROW; -#else -extern int isatty (int ); -#endif -#ifdef __cplusplus -} -#endif -#endif - -/* 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. - */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) - -{ - int oerrno = errno; - - yy_flush_buffer(b ); - - b->yy_input_file = file; - 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; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - 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. - * - */ - void yy_flush_buffer (YY_BUFFER_STATE b ) -{ - 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( ); -} - -/** 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. - * - */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - 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; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void yypop_buffer_state (void) -{ - 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; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack (void) -{ - int 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; - (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. */ - int 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; - } -} - -/** 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 0; - - 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 = 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 = 0; - 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; -} - -/** 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 (yyconst char * yystr ) -{ - - return yy_scan_bytes(yystr,strlen(yystr) ); -} - -/** 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 bytes the byte buffer to scan - * @param 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 (yyconst 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 = _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; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* 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. */ - -/** 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; -} - -/** Set the current line number. - * @param 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 ; -} - -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) = 0; - (yy_buffer_stack_top) = 0; - (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; - (yy_init) = 0; - (yy_start) = 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - yyin = stdin; - yyout = stdout; -#else - yyin = (FILE *) 0; - yyout = (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * yylex_init() - */ - return 0; -} - -/* 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( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *yyalloc (yy_size_t size ) -{ - return (void *) 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 (void *) realloc( (char *) ptr, size ); -} - -void yyfree (void * ptr ) -{ - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 270 "parser.lex" - - - -int yywrap() -{ - return 1; -} - -void freeTokens(struct token_t*file) -{ - mem_clear(&strings); - mem_clear(&tokens); -} - -struct token_t* generateTokens(char*filename) -{ - FILE*fi; - int t; - struct token_t*result; - int num; - - if(!filename) - return 0; - - if(!strcmp(filename,"-")) - fi = stdin; - else - fi = fopen(filename, "rb"); - - if(!fi) { - printf("Couldn't find file %s\n", filename); - return 0; - } - yyin = fi; - - mem_init(&strings); - mem_init(&tokens); - mem_put(&strings, &t, 1); //hack- make all valid strings start at position >0 - - line=1; - column=1; - - yylex(); -#ifdef YY_CURRENT_BUFFER - // some newer flex versions require it like this: - yy_delete_buffer(YY_CURRENT_BUFFER); -#else - yy_delete_buffer(yy_current_buffer); -#endif - - result = (struct token_t*)tokens.buffer; - num = tokens.pos/sizeof(struct token_t); - - for(t=0;t - -.SH DESCRIPTION -Runs a pdf through the pdf2swf conversion engine, and writes it -back to a pdf. - -.SH OPTIONS -.TP -\fB\-h\fR, \fB\-\-help\fR - Print short help message and exit -.TP -\fB\-v\fR, \fB\-\-verbose\fR - Be verbose. Use more than one -v for greater effect. -.TP -\fB\-p\fR, \fB\-\-pages\fR \fIpages\fR - Pages to convert -.TP -\fB\-X\fR, \fB\-\-width\fR \fIwidth\fR - Make sure the output pdf is \fIwidth\fR pixels wide -.TP -\fB\-Y\fR, \fB\-\-height\fR \fIheight\fR - Make sure the output pdf is \fIheight\fR pixels high -.TP -\fB\-s\fR, \fB\-\-set\fR \fIparameter>= -.TP -\fB\-o\fR, \fB\-\-output\fR \fIfilename\fR - Write output to file \fIfilename\fR. (If not given, the output will go - to a file with the extension .print.pdf) -.TP -\fB\-V\fR, \fB\-\-version\fR - Print version info and exit -.SH AUTHOR - -Matthias Kramm diff --git a/fluidbook/tools/swftools-special-swfdump/src/pdf2pdf.c b/fluidbook/tools/swftools-special-swfdump/src/pdf2pdf.c deleted file mode 100644 index 485c6c036..000000000 --- a/fluidbook/tools/swftools-special-swfdump/src/pdf2pdf.c +++ /dev/null @@ -1,267 +0,0 @@ -/* pdf2pdf.c - main routine for pdf2pdf(1) - - Part of the swftools package. - - Copyright (c) 2009 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#include -#include -#include "../config.h" -#include "../lib/args.h" -#include "../lib/os.h" -#include "../lib/gfxsource.h" -#include "../lib/gfxdevice.h" -#include "../lib/gfxpoly.h" -#include "../lib/devices/rescale.h" -#include "../lib/devices/polyops.h" -#include "../lib/devices/pdf.h" -#include "../lib/readers/image.h" -#include "../lib/readers/swf.h" -#include "../lib/pdf/pdf.h" -#include "../lib/log.h" - -static gfxsource_t*driver = 0; - -static int maxwidth = 0; -static int maxheight = 0; -static char * outputname = 0; -static int loglevel = 3; -static char * pagerange = 0; -static char * filename = 0; -static const char * format = "ocr"; - -int args_callback_option(char*name,char*val) { - if (!strcmp(name, "o")) - { - outputname = val; - return 1; - } - else if (!strcmp(name, "v")) - { - loglevel ++; - setConsoleLogging(loglevel); - return 0; - } - else if (!strcmp(name, "f")) - { - format = val; - return 1; - } - else if (!strcmp(name, "q")) - { - loglevel --; - setConsoleLogging(loglevel); - return 0; - } - else if (name[0]=='p') - { - do { - name++; - } while(*name == 32 || *name == 13 || *name == 10 || *name == '\t'); - - if(*name) { - pagerange = name; - return 0; - } - pagerange = val; - return 1; - } - else if (!strcmp(name, "s")) - { - if(!driver) { - fprintf(stderr, "Specify input file before -s\n"); - exit(1); - } - char*s = strdup(val); - char*c = strchr(s, '='); - if(c && *c && c[1]) { - *c = 0; - c++; - driver->setparameter(driver, s,c); - } else { - driver->setparameter(driver, s,"1"); - } - free(s); - return 1; - } - else if (!strcmp(name, "X")) - { - maxwidth = atoi(val); - return 1; - } - else if (!strcmp(name, "Y")) - { - maxheight = atoi(val); - return 1; - } - else if (!strcmp(name, "V")) - { - printf("pdf2swf - part of %s %s\n", PACKAGE, VERSION); - exit(0); - } - else - { - fprintf(stderr, "Unknown option: -%s\n", name); - exit(1); - } - return 0; -} - -static struct options_t options[] = { -{"h", "help"}, -{"v", "verbose"}, -{"p", "pages"}, -{"X", "width"}, -{"Y", "height"}, -{"s", "set"}, -{"o", "output"}, -{"V", "version"}, -{0,0} -}; - -int args_callback_longoption(char*name,char*val) { - return args_long2shortoption(options, name, val); -} - -int args_callback_command(char*name, char*val) { - if (!filename) { - - filename = name; - - if(strstr(filename, ".pdf") || strstr(filename, ".PDF")) { - msg(" Treating file as PDF"); - driver = gfxsource_pdf_create(); - } else if(strstr(filename, ".swf") || strstr(filename, ".SWF")) { - msg(" Treating file as SWF"); - driver = gfxsource_swf_create(); - } else if(strstr(filename, ".jpg") || strstr(filename, ".JPG") || - strstr(filename, ".png") || strstr(filename, ".PNG")) { - msg(" Treating file as Image"); - driver = gfxsource_image_create(); - } else { - driver = gfxsource_pdf_create(); - } - } else { - if(outputname) - { - fprintf(stderr, "Error: Do you want the output to go to %s or to %s?", - outputname, name); - exit(1); - } - outputname = name; - } - return 0; -} - -void args_callback_usage(char *name) -{ - printf("\n"); - printf("Usage: %s \n", name); - printf("\n"); - printf("-h , --help Print short help message and exit\n"); - printf("-v , --verbose Be verbose. Use more than one -v for greater effect.\n"); - printf("-p , --pages Pages to convert\n"); - printf("-X , --width Make sure the output pdf is pixels wide\n"); - printf("-Y , --height Make sure the output pdf is pixels high\n"); - printf("-s , --set = Set to \n"); - printf("-o , --output Write output to file .\n"); - printf("-V , --version Print version info and exit\n"); - printf("\n"); -} - -int main(int argn, char *argv[]) -{ - processargs(argn, argv); - initLog(0,-1,0,0,-1,loglevel); - - if(!filename) { - fprintf(stderr, "Please specify an input file\n"); - exit(1); - } - - if(!outputname) - { - if(filename) { - outputname = stripFilename(filename, ".print.pdf"); - msg(" Output filename not given. Writing to %s", outputname); - } - } - if(!outputname) - { - fprintf(stderr, "Please use -o to specify an output file\n"); - exit(1); - } - - is_in_range(0x7fffffff, pagerange); - if(pagerange) - driver->setparameter(driver, "pages", pagerange); - - if(!filename) { - args_callback_usage(argv[0]); - exit(0); - } - - gfxdocument_t* doc = driver->open(driver, filename); - //doc->setparameter(doc, "drawonlyshapes", "1"); - doc->setparameter(doc, "disable_polygon_conversion", "1"); - - if(!doc) { - msg(" Couldn't open %s", filename); - exit(1); - } - - gfxdevice_t _out,*out=&_out; - gfxdevice_pdf_init(out); - - /*gfxdevice_t wrap; - gfxdevice_removeclippings_init(&wrap, out); - out = &wrap;*/ - - gfxdevice_t rescale; - if(maxwidth || maxheight) { - gfxdevice_rescale_init(&rescale, out, maxwidth, maxheight, 0); - out = &rescale; - out->setparameter(out, "keepratio", "1"); - } - - int pagenr; - for(pagenr = 1; pagenr <= doc->num_pages; pagenr++) - { - if(is_in_range(pagenr, pagerange)) { - gfxpage_t* page = doc->getpage(doc, pagenr); - out->startpage(out, page->width, page->height); - page->render(page, out); - out->endpage(out); - page->destroy(page); - } - } - gfxresult_t*result = out->finish(out); - if(result) { - if(result->save(result, outputname) < 0) { - exit(1); - } - result->destroy(result); - } - doc->destroy(doc); - driver->destroy(driver); - return 0; -} - diff --git a/fluidbook/tools/swftools-special-swfdump/src/pdf2swf b/fluidbook/tools/swftools-special-swfdump/src/pdf2swf deleted file mode 100644 index ecfd6137a244b6f8610590f602c76f9acec3949a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3422392 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 EU8SK&ZuQTv#rMPyNL4T~`?=Xz7 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®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 z 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.pj>L>+GMr;ft{za%a?Q%9}33&$OR=)2VB8xxyI5 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